Changeset 252


Ignore:
Timestamp:
07/23/14 14:06:47 (10 years ago)
Author:
dubos
Message:

Fix recently introduced bug : slope limiter

Location:
codes/icosagcm/trunk/src
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • codes/icosagcm/trunk/src/advect.f90

    r186 r252  
    1111  !========================================================================== 
    1212 
    13   SUBROUTINE init_advect(normal,tangent,one_over_sqrt_leng) 
     13  SUBROUTINE init_advect(normal,tangent,sqrt_leng) 
    1414    IMPLICIT NONE 
    1515    REAL(rstd),INTENT(OUT) :: normal(3*iim*jjm,3) 
    1616    REAL(rstd),INTENT(OUT) :: tangent(3*iim*jjm,3) 
    17     REAL(rstd),INTENT(OUT) :: one_over_sqrt_leng(iim*jjm) 
     17    REAL(rstd),INTENT(OUT) :: sqrt_leng(iim*jjm) 
    1818 
    1919    INTEGER :: ij 
     
    4040          tangent(ij+u_ldown,:)=tangent(ij+u_ldown,:)/sqrt(sum(tangent(ij+u_ldown,:)**2)+1e-50) 
    4141 
    42           one_over_sqrt_leng(ij) = 1./sqrt(max(sum((xyz_v(ij+z_up,:) - xyz_i(ij,:))**2),sum((xyz_v(ij+z_down,:) - xyz_i(ij,:))**2), & 
    43                                           sum((xyz_v(ij+z_rup,:) - xyz_i(ij,:))**2),sum((xyz_v(ij+z_rdown,:) - xyz_i(ij,:))**2),  & 
    44                                           sum((xyz_v(ij+z_lup,:) - xyz_i(ij,:))**2),sum((xyz_v(ij+z_ldown,:) - xyz_i(ij,:))**2)) ) 
     42          sqrt_leng(ij) = sqrt(max(sum((xyz_v(ij+z_up,:) - xyz_i(ij,:))**2),sum((xyz_v(ij+z_down,:) - xyz_i(ij,:))**2), & 
     43                                   sum((xyz_v(ij+z_rup,:) - xyz_i(ij,:))**2),sum((xyz_v(ij+z_rdown,:) - xyz_i(ij,:))**2),  & 
     44                                   sum((xyz_v(ij+z_lup,:) - xyz_i(ij,:))**2),sum((xyz_v(ij+z_ldown,:) - xyz_i(ij,:))**2)) ) 
    4545    ENDDO 
    4646 
     
    4949  !======================================================================================= 
    5050 
    51   SUBROUTINE compute_gradq3d(qi_in,one_over_sqrt_leng_in,gradq3d_out,xyz_i,xyz_v) 
     51  SUBROUTINE compute_gradq3d(qi_in,sqrt_leng_in,gradq3d_out,xyz_i,xyz_v) 
    5252    USE trace 
    5353    USE omp_para 
    5454    IMPLICIT NONE 
    5555    REAL(rstd),INTENT(IN)  :: qi_in(iim*jjm,llm) 
    56     REAL(rstd),INTENT(IN)  :: one_over_sqrt_leng_in(iim*jjm) 
     56    REAL(rstd),INTENT(IN)  :: sqrt_leng_in(iim*jjm) 
    5757    REAL(rstd),INTENT(IN)  :: xyz_i(iim*jjm,3) 
    5858    REAL(rstd),INTENT(IN)  :: xyz_v(2*iim*jjm,3) 
     
    6666    INTEGER :: ij,k,ind,l 
    6767    REAL(rstd)  :: qi(iim*jjm,llm) 
    68     REAL(rstd)  :: one_over_sqrt_leng(iim*jjm) 
     68    REAL(rstd)  :: sqrt_leng(iim*jjm) 
    6969    REAL(rstd) :: gradq3d(iim*jjm,llm,3)  
    7070    REAL(rstd) :: detx,dety,detz,det 
     
    7474 
    7575    qi=qi_in 
    76     one_over_sqrt_leng=one_over_sqrt_leng_in 
     76    sqrt_leng=sqrt_leng_in 
    7777     
    7878    CALL trace_start("compute_gradq3d1") 
     
    252252             maggrd = gradq3d(ij,l,1)*gradq3d(ij,l,1) + gradq3d(ij,l,2)*gradq3d(ij,l,2) + gradq3d(ij,l,3)*gradq3d(ij,l,3)  
    253253             maggrd = sqrt(maggrd)  
    254              maxq_c = qi(ij,l) + maggrd*one_over_sqrt_leng(ij) 
    255              minq_c = qi(ij,l) - maggrd*one_over_sqrt_leng(ij) 
     254             maxq_c = qi(ij,l) + maggrd*sqrt_leng(ij) 
     255             minq_c = qi(ij,l) - maggrd*sqrt_leng(ij) 
    256256             maxq = max(qi(ij,l),qi(ij+t_right,l),qi(ij+t_lup,l),qi(ij+t_rup,l),qi(ij+t_left,l), & 
    257257                  qi(ij+t_rdown,l),qi(ij+t_ldown,l)) 
  • codes/icosagcm/trunk/src/advect_tracer.f90

    r186 r252  
    88  TYPE(t_field),SAVE,POINTER :: f_gradq3d(:) 
    99  TYPE(t_field),SAVE,POINTER :: f_cc(:)  ! starting point of backward-trajectory (Miura approach) 
    10   TYPE(t_field),SAVE,POINTER :: f_one_over_sqrt_leng(:) 
     10  TYPE(t_field),SAVE,POINTER :: f_sqrt_leng(:) 
    1111 
    1212  TYPE(t_message),SAVE :: req_u, req_cc, req_wfluxt, req_q, req_rhodz, req_gradq3d 
     
    2828    REAL(rstd),POINTER :: tangent(:,:) 
    2929    REAL(rstd),POINTER :: normal(:,:) 
    30     REAL(rstd),POINTER :: one_over_sqrt_leng(:) 
     30    REAL(rstd),POINTER :: sqrt_leng(:) 
    3131    INTEGER :: ind 
    3232 
     
    3535    CALL allocate_field(f_gradq3d,field_t,type_real,llm,3, name='gradq3d') 
    3636    CALL allocate_field(f_cc,field_u,type_real,llm,3, name='cc') 
    37     CALL allocate_field(f_one_over_sqrt_leng,field_t,type_real, name='one_over_sqrt_leng') 
     37    CALL allocate_field(f_sqrt_leng,field_t,type_real, name='sqrt_leng') 
    3838    CALL allocate_field(f_dzqw, field_t, type_real, llm, name='dzqw') 
    3939    CALL allocate_field(f_adzqw, field_t, type_real, llm, name='adzqw') 
     
    4747       normal=f_normal(ind) 
    4848       tangent=f_tangent(ind) 
    49        one_over_sqrt_leng=f_one_over_sqrt_leng(ind) 
    50        CALL init_advect(normal,tangent,one_over_sqrt_leng) 
     49       sqrt_leng=f_sqrt_leng(ind) 
     50       CALL init_advect(normal,tangent,sqrt_leng) 
    5151    END DO 
    5252 
     
    6666    TYPE(t_field),POINTER :: f_rhodz(:)    ! mass field at beginning of macro time step 
    6767 
    68     REAL(rstd),POINTER :: q(:,:,:), normal(:,:), tangent(:,:), one_over_sqrt_leng(:), gradq3d(:,:,:), cc(:,:,:) 
     68    REAL(rstd),POINTER :: q(:,:,:), normal(:,:), tangent(:,:), sqrt_leng(:), gradq3d(:,:,:), cc(:,:,:) 
    6969    REAL(rstd),POINTER :: hfluxt(:,:), wfluxt(:,:) 
    7070    REAL(rstd),POINTER :: rhodz(:,:), u(:,:)  
     
    145145          q       = f_q(ind) 
    146146          gradq3d = f_gradq3d(ind) 
    147           one_over_sqrt_leng=f_one_over_sqrt_leng(ind) 
    148           CALL compute_gradq3d(q(:,:,k),one_over_sqrt_leng,gradq3d,xyz_i,xyz_v) 
     147          sqrt_leng=f_sqrt_leng(ind) 
     148          CALL compute_gradq3d(q(:,:,k),sqrt_leng,gradq3d,xyz_i,xyz_v) 
    149149       END DO 
    150150 
Note: See TracChangeset for help on using the changeset viewer.