Changeset 5622 for LMDZ6/trunk


Ignore:
Timestamp:
Apr 16, 2025, 9:25:21 PM (7 weeks ago)
Author:
evignon
Message:

commission pour la conservation de l'eau dans la convection profonde.
1/ integre les corrections apportees par JYG dans cv3routines.
2/ par defaut, conserve dx*masse quand on appelle la convection tous les n pas de temps
Cette commission conduit à une perte de convergence

Location:
LMDZ6/trunk/libf/phylmd
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • LMDZ6/trunk/libf/phylmd/clesphys_mod_h.f90

    r5472 r5622  
    5151          , iflag_phytrac, ok_new_lscp, ok_bs, ok_rad_bs               &
    5252          , iflag_thermals, nsplit_thermals              &
    53           , iflag_physiq, ok_3Deffect, ok_water_mass_fixer
     53          , iflag_physiq, ok_3Deffect, ok_water_mass_fixer             &
     54          , ok_mass_dtcon, ok_mass_dqcon, ok_mass_duvcon
    5455
    5556
     
    158159  !OB flag to activate water mass fixer in physiq
    159160  LOGICAL :: ok_water_mass_fixer
     161
     162  ! for conservation when calling deep convection every n time steps
     163  LOGICAL :: ok_mass_dtcon, ok_mass_dqcon, ok_mass_duvcon
     164
    160165
    161166
     
    207212  !$OMP      , iflag_phytrac, ok_new_lscp, ok_bs, ok_rad_bs               &
    208213  !$OMP      , iflag_thermals, nsplit_thermals              &
    209   !$OMP      , iflag_physiq, ok_3Deffect, ok_water_mass_fixer)
     214  !$OMP      , iflag_physiq, ok_3Deffect, ok_water_mass_fixer             &
     215  !$OMP      , ok_mass_dtcon, ok_mass_dqcon, ok_mass_duvcon )
    210216
    211217END MODULE clesphys_mod_h
  • LMDZ6/trunk/libf/phylmd/conf_phys_m.f90

    r5470 r5622  
    247247    INTEGER,SAVE  :: kz0_omp
    248248    LOGICAL, SAVE :: ok_bs_omp, ok_rad_bs_omp
    249 
     249    LOGICAL, SAVE :: ok_mass_dtcon_omp, ok_mass_dqcon_omp, ok_mass_duvcon_omp
    250250
    251251    INTEGER, INTENT(OUT):: read_climoz ! read ozone climatology, OpenMP shared
     
    10101010    ok_conserv_q_omp = .FALSE.
    10111011    CALL getin('ok_conserv_q',ok_conserv_q_omp)
     1012
     1013
     1014
     1015    !Config  Key  = ok_mass_dtcon
     1016    !Config  Desc = for conservation when calling deep convection every n time steps
     1017    !Config  Def  = y
     1018    !Config  Help = for conservation when calling deep convection every n time steps
     1019    ok_mass_dtcon_omp = .TRUE.
     1020    CALL getin('ok_mass_dtcon',ok_mass_dtcon_omp)
     1021
     1022    !Config  Key  = ok_mass_dqcon
     1023    !Config  Desc = for conservation when calling deep convection every n time steps
     1024    !Config  Def  = y
     1025    !Config  Help = for conservation when calling deep convection every n time steps
     1026    ok_mass_dqcon_omp = .TRUE.
     1027    CALL getin('ok_mass_dqcon',ok_mass_dqcon_omp)
     1028
     1029    !Config  Key  = ok_mass_duvcon
     1030    !Config  Desc = for conservation when calling deep convection every n time steps
     1031    !Config  Def  = y
     1032    !Config  Help = for conservation when calling deep convection every n time steps
     1033    ok_mass_dtcon_omp = .TRUE.
     1034    CALL getin('ok_mass_duvcon',ok_mass_duvcon_omp)
     1035
    10121036
    10131037    !
     
    23232347    nbapp_wk = nbapp_wk_omp
    23242348    iflag_ener_conserv = iflag_ener_conserv_omp
     2349    ok_mass_dtcon = ok_mass_dtcon_omp
     2350    ok_mass_dqcon = ok_mass_dqcon_omp
     2351    ok_mass_duvcon = ok_mass_duvcon_omp
    23252352    ok_conserv_q = ok_conserv_q_omp
    23262353    epmax = epmax_omp
     
    27432770    WRITE(lunout,*) ' iflag_ener_conserv=',iflag_ener_conserv
    27442771    WRITE(lunout,*) ' ok_conserv_q=',ok_conserv_q
     2772    WRITE(lunout,*) ' ok_mass_dtcon=',ok_mass_dtcon
     2773    WRITE(lunout,*) ' ok_mass_dqcon=',ok_mass_dqcon
     2774    WRITE(lunout,*) ' ok_mass_duvcon=',ok_mass_duvcon
    27452775    WRITE(lunout,*) ' epmax = ', epmax
    27462776    WRITE(lunout,*) ' coef_epmax_cape = ', coef_epmax_cape
  • LMDZ6/trunk/libf/phylmd/cv3_routines.f90

    r5560 r5622  
    1212  USE conema3_mod_h
    1313  USE lmdz_cv_ini, ONLY : alpha,alpha1,beta,betad,coef_peel,cv_flag_feed,delta,dpbase,dtcrit,dtovsh,dttrig,ejectice,ejectliq,elcrit,flag_epkeorig,flag_wb,minorig,nl,nlm,nlp,noconv_stop,noff,omtrain,pbcrit,ptcrit,sigdz,spfac,t_top_max,tau,tau_stop,tlcrit,wbmax
    14   USE lmdz_cv_ini, ONLY : keep_bug_indices_cv3_tracer, keep_bug_q_nocons_cv
     14  USE lmdz_cv_ini, ONLY : keep_bug_indices_cv3_tracer
    1515
    1616
     
    142142     keep_bug_indices_cv3_tracer = .FALSE.
    143143     CALL getin_p('keep_bug_indices_cv3_tracer', keep_bug_indices_cv3_tracer)
    144      keep_bug_q_nocons_cv = .TRUE.
    145      CALL getin_p('keep_bug_q_nocons_cv', keep_bug_q_nocons_cv)
    146144
    147145
     
    171169    WRITE (*, *) 'keepbug_ice_frac =', keepbug_ice_frac
    172170    WRITE (*, *) 'keep_bug_indices_cv3_tracer =', keep_bug_indices_cv3_tracer
    173     WRITE (*, *) 'keep_bug_q_nocons_cv =', keep_bug_q_nocons_cv
    174171
    175172    first = .FALSE.
     
    27072704                     wdtrainA, wdtrainS, wdtrainM)                                      ! RomP
    27082705  USE lmdz_cv_ini, ONLY : cpd,ginv,grav,nl,nlp,sigdz
    2709   USE lmdz_cv_ini, ONLY : keep_bug_q_nocons_cv
    27102706  USE cvflag_mod_h
    27112707  USE print_control_mod, ONLY: prt_level, lunout
     
    29122908  !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    29132909  !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    2914   IF (keep_bug_q_nocons_cv) THEN
    2915   !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    2916         DO il = 1, ncum
    2917           IF (i<=inb(il) .AND. lwork(il)) THEN
    2918             wdtrain(il) = grav*ep(il, i)*m(il, i)*clw(il, i)
    2919             wdtrainS(il, i) = wdtrain(il)/grav                                            !   Ps   jyg
    2920           END IF
    2921         END DO
    2922    
    2923         IF (i>1) THEN
    2924           DO j = 1, i - 1
    2925             DO il = 1, ncum
    2926               IF (i<=inb(il) .AND. lwork(il)) THEN
    2927                 awat = elij(il, j, i) - (1.-ep(il,i))*clw(il, i)
    2928                 awat = max(awat, 0.0)
    2929                 wdtrain(il) = wdtrain(il) + grav*awat*ment(il, j, i)
    2930                 wdtrainM(il, i) = wdtrain(il)/grav - wdtrainS(il, i)    !   Pm  jyg
    2931               END IF
    2932             END DO
    2933           END DO
    2934         END IF
    2935    
    2936         IF (cvflag_prec_eject) THEN
    2937     !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    2938           IF (adiab_ascent_mass_flux_depends_on_ejectliq) THEN
    2939     !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    2940     !!! Warning : this option leads to water conservation violation
    2941     !!!           Expert only
    2942     !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    2943               IF ( i > 1) THEN
    2944                 DO il = 1, ncum
    2945                   IF (i<=inb(il) .AND. lwork(il)) THEN
    2946                     wdtrainA(il,i) = ma(il, i+1)*(qta(il, i-1)-qta(il,i))/(1. - qta(il, i-1))    !   Pa   jygprl
    2947                     wdtrain(il) = wdtrain(il) + grav*wdtrainA(il,i)
    2948                   END IF
    2949                 END DO
    2950               ENDIF  ! ( i > 1)
    2951     !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    2952           ELSE ! (adiab_ascent_mass_flux_depends_on_ejectliq)
    2953     !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    2954               IF ( i > 1) THEN
    2955                 DO il = 1, ncum
    2956                   IF (i<=inb(il) .AND. lwork(il)) THEN
    2957                     wdtrainA(il,i) = ma(il, i+1)*(qta(il, i-1)-qta(il,i))                        !   Pa   jygprl
    2958                     wdtrain(il) = wdtrain(il) + grav*wdtrainA(il,i)
    2959                   END IF
    2960                 END DO
    2961               ENDIF  ! ( i > 1)
    2962    
    2963           ENDIF ! (adiab_ascent_mass_flux_depends_on_ejectliq) ELSE
    2964     !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    2965         ENDIF  ! (cvflag_prec_eject)
    2966    
    2967   !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    2968   ELSE ! (keep_bug_q_nocons_cv)
    2969   !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    29702910        DO il = 1, ncum
    29712911          IF (i<=inb(il) .AND. lwork(il)) THEN
     
    30232963        ENDIF  ! ( i > 1)
    30242964   
    3025   !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    3026   ENDIF ! (keep_bug_q_nocons_cv)
    30272965  !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    30282966  !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
     
    35193457    USE cvflag_mod_h
    35203458   USE lmdz_cv_ini, ONLY : grav,minorig,nl,nlp,rowl,rrd,nl,ci,cl,cpd,cpv
    3521    USE lmdz_cv_ini, ONLY : keep_bug_q_nocons_cv
    35223459  IMPLICIT NONE
    35233460
     
    40954032           IF (ok_optim_yield) THEN                       !|
    40964033!-----------------------------------------------------------
    4097     IF (keep_bug_q_nocons_cv) THEN    !!jyg20250215
    4098       DO il = 1, ncum
    4099          amp1(il) = upwd(il,i+1)
    4100          ad(il) = dnwd(il,i)
    4101       ENDDO
    4102     ELSE  ! (keep_bug_q_nocons_cv)
    41034034      DO il = 1, ncum
    41044035         amp1(il) = upwd(il,i+1)
    41054036         ad(il) = - dnwd(il,i)
    41064037      ENDDO
    4107     ENDIF  ! (keep_bug_q_nocons_cv)
    41084038!-----------------------------------------------------------
    41094039        ELSE !(ok_optim_yield)                            !|
  • LMDZ6/trunk/libf/phylmd/lmdz_cv_ini.f90

    r5560 r5622  
    1414          nl, nlp, nlm
    1515  PUBLIC cpd, cpv, cl, ci, rrv, rrd, lv0, lf0, g, rowl, t0, clmcpv, clmcpd, cpdmcp, cpvmcpd, cpvmcl,  &
    16           clmci, eps, epsi, epsim1, ginv, hrd, grav, keep_bug_indices_cv3_tracer, &
    17           keep_bug_q_nocons_cv
     16          clmci, eps, epsi, epsim1, ginv, hrd, grav, keep_bug_indices_cv3_tracer
    1817
    1918
     
    7271LOGICAL keep_bug_indices_cv3_tracer
    7372 !$OMP THREADPRIVATE( keep_bug_indices_cv3_tracer)
    74 LOGICAL keep_bug_q_nocons_cv
    75  !$OMP THREADPRIVATE( keep_bug_q_nocons_cv)
    7673
    7774END MODULE lmdz_cv_ini
  • LMDZ6/trunk/libf/phylmd/phys_local_var_mod.F90

    r5614 r5622  
    4747      REAL, SAVE, ALLOCATABLE :: d_tr_dyn(:,:,:)
    4848      !$OMP THREADPRIVATE(d_tr_dyn)
    49       REAL, SAVE, ALLOCATABLE :: d_t_con(:,:),d_q_con(:,:),d_q_con_zmasse(:,:)
    50       !$OMP THREADPRIVATE(d_t_con,d_q_con,d_q_con_zmasse)
     49      REAL, SAVE, ALLOCATABLE :: d_t_con(:,:),d_q_con(:,:)
     50      !$OMP THREADPRIVATE(d_t_con,d_q_con)
    5151      REAL, SAVE, ALLOCATABLE :: d_u_con(:,:),d_v_con(:,:)
    5252      !$OMP THREADPRIVATE(d_u_con,d_v_con)
     53      REAL, SAVE, ALLOCATABLE :: d_t_con_zmasse(:,:),d_q_con_zmasse(:,:)
     54      !$OMP THREADPRIVATE(d_t_con_zmasse,d_q_con_zmasse)
     55      REAL, SAVE, ALLOCATABLE :: d_u_con_zmasse(:,:),d_v_con_zmasse(:,:)
     56      !$OMP THREADPRIVATE(d_u_con_zmasse,d_v_con_zmasse)
    5357      REAL, SAVE, ALLOCATABLE :: d_t_wake(:,:),d_q_wake(:,:)
    5458      !$OMP THREADPRIVATE( d_t_wake,d_q_wake)
     
    860864      ALLOCATE(d_cf_dyn(klon,klev),d_rvc_dyn(klon,klev))
    861865      ALLOCATE(d_tr_dyn(klon,klev,nbtr))                   !RomP
    862       ALLOCATE(d_t_con(klon,klev),d_q_con(klon,klev),d_q_con_zmasse(klon,klev))
     866      ALLOCATE(d_t_con(klon,klev),d_q_con(klon,klev))
    863867      ALLOCATE(d_u_con(klon,klev),d_v_con(klon,klev))
     868      ALLOCATE(d_t_con_zmasse(klon,klev),d_q_con_zmasse(klon,klev))
     869      ALLOCATE(d_u_con_zmasse(klon,klev),d_v_con_zmasse(klon,klev))
    864870      ALLOCATE(d_t_wake(klon,klev),d_q_wake(klon,klev))
    865871      ALLOCATE(d_t_lsc(klon,klev),d_q_lsc(klon,klev))
     
    13301336      DEALLOCATE(d_cf_dyn,d_rvc_dyn)
    13311337      DEALLOCATE(d_tr_dyn)                      !RomP
    1332       DEALLOCATE(d_t_con,d_q_con,d_q_con_zmasse)
     1338      DEALLOCATE(d_t_con,d_q_con)
    13331339      DEALLOCATE(d_u_con,d_v_con)
     1340      DEALLOCATE(d_t_con_zmasse,d_q_con_zmasse)
     1341      DEALLOCATE(d_u_con_zmasse,d_v_con_zmasse)
    13341342      DEALLOCATE(d_t_wake,d_q_wake)
    13351343      DEALLOCATE(d_t_lsc,d_q_lsc)
  • LMDZ6/trunk/libf/phylmd/physiq_mod.F90

    r5614 r5622  
    155155       d_q_dyn2d,d_ql_dyn2d,d_qs_dyn2d,d_qbs_dyn2d, &
    156156       ! Physic tendencies
    157        d_t_con,d_q_con,d_q_con_zmasse,d_u_con,d_v_con, &
     157       d_t_con,d_q_con,d_u_con,d_v_con, &
     158       d_t_con_zmasse,d_q_con_zmasse,d_u_con_zmasse,d_v_con_zmasse, &       
    158159       d_tr, &                              !! to be removed?? (jyg)
    159160       d_t_wake,d_q_wake, &
     
    12531254    REAL qql1(klon),qql2(klon),corrqql
    12541255
    1255     !--OB flag to activate better conservation of water tendency when convection is not called every timestep
    1256     LOGICAL, PARAMETER :: ok_conserv_d_q_con=.FALSE.
    1257 
    12581256    REAL, dimension(klon,klev) :: t_env,q_env
    12591257
     
    34163414    ENDIF
    34173415
    3418     !--saving d_q_con * zmass for next timestep if convection is not called every timestep
    3419     IF (ok_conserv_d_q_con) THEN
     3416    !--saving d_X_con * zmass for next timestep if convection is not called every timestep
     3417    IF (ok_mass_dqcon) THEN
    34203418      d_q_con_zmasse(:,:) = d_q_con(:,:) * zmasse(:,:)
    34213419    ENDIF
     3420
     3421    IF (ok_mass_dtcon) THEN
     3422      d_t_con_zmasse(:,:) = d_t_con(:,:) * zmasse(:,:)
     3423    ENDIF
     3424
     3425    IF (ok_mass_duvcon) THEN
     3426      d_u_con_zmasse(:,:) = d_u_con(:,:) * zmasse(:,:)
     3427      d_v_con_zmasse(:,:) = d_v_con(:,:) * zmasse(:,:)
     3428    ENDIF
     3429
    34223430
    34233431    !     CALL homogene(paprs, q_seri, d_q_con, u_seri,v_seri,
     
    34513459!!
    34523460
    3453     !--recompute d_q_con with zmasse from new timestep
    3454     IF (ok_conserv_d_q_con) THEN
     3461    !--recompute d_X_con with zmasse from new timestep
     3462    IF (ok_mass_dqcon) THEN
    34553463      d_q_con(:,:)=d_q_con_zmasse(:,:)/zmasse(:,:)
    34563464    ENDIF
     3465
     3466    IF (ok_mass_dtcon) THEN
     3467      d_t_con(:,:)=d_t_con_zmasse(:,:)/zmasse(:,:)
     3468    ENDIF
     3469
     3470    IF (ok_mass_duvcon) THEN
     3471      d_u_con(:,:)=d_u_con_zmasse(:,:)/zmasse(:,:)
     3472      d_v_con(:,:)=d_v_con_zmasse(:,:)/zmasse(:,:)
     3473    ENDIF
     3474
     3475
    34573476
    34583477    CALL add_phys_tend(d_u_con, d_v_con, d_t_con, d_q_con, dql0, dqi0, dqbs0, paprs, &
Note: See TracChangeset for help on using the changeset viewer.