Changeset 4559


Ignore:
Timestamp:
Jun 6, 2023, 12:09:27 PM (12 months ago)
Author:
evignon
Message:

Nettoyage de lscp et réécriture de la partie autoconversion

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

Legend:

Unmodified
Added
Removed
  • LMDZ6/trunk/libf/phylmd/lscp_ini_mod.F90

    r4535 r4559  
    1212  !$OMP THREADPRIVATE(seuil_neb)
    1313
    14   INTEGER, SAVE :: ninter=5                     ! number of iterations to calculate autoconversion to precipitation
    15   !$OMP THREADPRIVATE(ninter)
     14  INTEGER, SAVE :: niter_lscp=5                 ! number of iterations to calculate autoconversion to precipitation
     15  !$OMP THREADPRIVATE(niter_lscp)
    1616
    1717  INTEGER,SAVE :: iflag_evap_prec=1             ! precipitation evaporation flag. 0: nothing, 1: "old way",
     
    4141  !$OMP THREADPRIVATE(ok_radocond_snow)
    4242
    43   LOGICAL, SAVE :: ok_debug_autoconversion=.true.   ! removes a bug in the autoconversion process
    44   !$OMP THREADPRIVATE(ok_debug_autoconversion)
    45 
    4643  REAL, SAVE :: t_glace_min=258.0                ! lower-bound temperature parameter for cloud phase determination
    4744  !$OMP THREADPRIVATE(t_glace_min)
     
    7774  !$OMP THREADPRIVATE(iflag_pdf)
    7875
     76  INTEGER, SAVE :: iflag_autoconversion=0        ! autoconversion option
     77  !$OMP THREADPRIVATE(iflag_autoconversion)
     78
    7979  LOGICAL, SAVE :: reevap_ice=.false.            ! no liquid precip for T< threshold
    8080  !$OMP THREADPRIVATE(reevap_ice)
     
    9292  !$OMP THREADPRIVATE(cld_tau_con)
    9393
     94  REAL, SAVE :: cld_expo_lsc=2.                  ! liquid autoconversion threshold exponent, stratiform rain
     95  !$OMP THREADPRIVATE(cld_expo_lsc)
     96
     97  REAL, SAVE :: cld_expo_con=2.                  ! liquid autoconversion threshold exponent, convective rain
     98  !$OMP THREADPRIVATE(cld_expo_con)
     99
    94100  REAL, SAVE :: ffallv_lsc=1.                    ! tuning coefficient crystal fall velocity, stratiform
    95101  !$OMP THREADPRIVATE(ffallv_lsc)
     
    104110  !$OMP THREADPRIVATE(coef_eva_i)
    105111
    106 
     112  REAL cice_velo                                 ! factor in the ice fall velocity formulation
     113  PARAMETER (cice_velo=1.645)
     114
     115  REAL dice_velo                                 ! exponent in the ice fall velocity formulation
     116  PARAMETER (dice_velo=0.16)
    107117
    108118
     
    122132   REAL, INTENT(IN)      :: RCPD_in, RLSTT_in, RLVTT_in, RLMLT_in
    123133   REAL, INTENT(IN)      ::  RVTMP2_in, RTT_in, RD_in, RG_in
     134   character (len=20) :: modname='lscp_ini_mod'
     135   character (len=80) :: abort_message
    124136
    125137
     
    136148
    137149
    138     CALL getin_p('ninter',ninter)
     150    CALL getin_p('niter_lscp',niter_lscp)
    139151    CALL getin_p('iflag_evap_prec',iflag_evap_prec)
    140152    CALL getin_p('seuil_neb',seuil_neb)
     
    142154    CALL getin_p('iflag_mpc_bl',iflag_mpc_bl)
    143155    CALL getin_p('ok_radocond_snow',ok_radocond_snow)
    144     CALL getin_p('ok_debug_autoconversion',ok_debug_autoconversion)   
    145156    CALL getin_p('t_glace_max',t_glace_max)
    146157    CALL getin_p('t_glace_min',t_glace_min)
     
    159170    CALL getin_p('cld_tau_lsc',cld_tau_lsc)
    160171    CALL getin_p('cld_tau_con',cld_tau_con)
     172    CALL getin_p('cld_expo_lsc',cld_expo_lsc)
     173    CALL getin_p('cld_expo_con',cld_expo_con)
    161174    CALL getin_p('ffallv_lsc',ffallv_lsc)
    162175    CALL getin_p('ffallv_lsc',ffallv_con)
     
    164177    coef_eva_i=coef_eva
    165178    CALL getin_p('coef_eva_i',coef_eva_i)
    166 
    167 
    168 
    169 
    170     WRITE(lunout,*) 'lscp, ninter:', ninter
     179    CALL getin_p('iflag_autoconversion',iflag_autoconversion)
     180
     181
     182
     183
     184    WRITE(lunout,*) 'lscp, niter_lscp:', niter_lscp
    171185    WRITE(lunout,*) 'lscp, iflag_evap_prec:', iflag_evap_prec
    172186    WRITE(lunout,*) 'lscp, seuil_neb:', seuil_neb
     
    174188    WRITE(lunout,*) 'lscp, iflag_mpc_bl:', iflag_mpc_bl
    175189    WRITE(lunout,*) 'lscp, ok_radocond_snow:', ok_radocond_snow
    176     WRITE(lunout,*) 'lscp, ok_debug_autoconversion:', ok_debug_autoconversion
    177190    WRITE(lunout,*) 'lscp, t_glace_max:', t_glace_max
    178191    WRITE(lunout,*) 'lscp, t_glace_min:', t_glace_min
     
    191204    WRITE(lunout,*) 'lscp, cld_tau_lsc', cld_tau_lsc
    192205    WRITE(lunout,*) 'lscp, cld_tau_con', cld_tau_con
     206    WRITE(lunout,*) 'lscp, cld_expo_lsc', cld_expo_lsc
     207    WRITE(lunout,*) 'lscp, cld_expo_con', cld_expo_con
    193208    WRITE(lunout,*) 'lscp, ffallv_lsc', ffallv_lsc
    194209    WRITE(lunout,*) 'lscp, ffallv_con', ffallv_con
    195210    WRITE(lunout,*) 'lscp, coef_eva', coef_eva
    196211    WRITE(lunout,*) 'lscp, coef_eva_i', coef_eva_i
     212    WRITE(lunout,*) 'lscp, iflag_autoconversion', iflag_autoconversion
    197213
    198214
     
    201217
    202218    ! check for precipitation sub-time steps
    203     IF (ABS(dtime/REAL(ninter)-360.0).GT.0.001) THEN
     219    IF (ABS(dtime/REAL(niter_lscp)-360.0).GT.0.001) THEN
    204220        WRITE(lunout,*) 'lscp: it is not expected, see Z.X.Li', dtime
    205221        WRITE(lunout,*) 'I would prefer a 6 min sub-timestep'
     222    ENDIF
     223
     224    ! check consistency between numerical resolution of autoconversion
     225    ! and other options
     226   
     227    IF (iflag_autoconversion .EQ. 2) THEN
     228        IF ((iflag_vice .NE. 0) .OR. (niter_lscp .GT. 1)) THEN
     229           abort_message = 'in lscp, iflag_autoconversion=2 requires iflag_vice=0 and niter_lscp=1'
     230           CALL abort_physic (modname,abort_message,1)
     231        ENDIF
    206232    ENDIF
    207233
  • LMDZ6/trunk/libf/phylmd/lscp_mod.F90

    r4535 r4559  
    9393USE ice_sursat_mod, ONLY : ice_sursat
    9494
    95 USE lscp_ini_mod, ONLY : seuil_neb, ninter, iflag_evap_prec, t_coup, DDT0, ztfondue, rain_int_min
    96 USE lscp_ini_mod, ONLY : iflag_mpc_bl, ok_radocond_snow, a_tr_sca, ok_debug_autoconversion
     95USE lscp_ini_mod, ONLY : seuil_neb, niter_lscp, iflag_evap_prec, t_coup, DDT0, ztfondue, rain_int_min
     96USE lscp_ini_mod, ONLY : iflag_mpc_bl, ok_radocond_snow, a_tr_sca, cld_expo_con, cld_expo_lsc
    9797USE lscp_ini_mod, ONLY : iflag_cloudth_vert, iflag_rain_incloud_vol, iflag_t_glace, t_glace_min
    9898USE lscp_ini_mod, ONLY : coef_eva, coef_eva_i,cld_tau_lsc, cld_tau_con, cld_lc_lsc, cld_lc_con
    99 USE lscp_ini_mod, ONLY : iflag_bergeron, iflag_fisrtilp_qsat
     99USE lscp_ini_mod, ONLY : iflag_bergeron, iflag_fisrtilp_qsat, iflag_vice, cice_velo, dice_velo
     100USE lscp_ini_mod, ONLY : iflag_autoconversion, ffallv_con, ffallv_lsc
    100101USE lscp_ini_mod, ONLY : RCPD, RLSTT, RLVTT, RLMLT, RVTMP2, RTT, RD, RG
    101102
     
    190191
    191192  REAL qsl(klon), qsi(klon)
    192   REAL zct, zcl
     193  REAL zct, zcl,zexpo
    193194  REAL ctot(klon,klev)
    194195  REAL ctot_vol(klon,klev)
     
    232233  REAL tot_zneb(klon), tot_znebn(klon), d_tot_zneb(klon)
    233234  REAL d_znebprecip_clr_cld(klon), d_znebprecip_cld_clr(klon)
    234   REAL velo(klon,klev), vr
     235  REAL velo(klon,klev), vr, ffallv
    235236  REAL qlmpc, qimpc, rnebmpc
    236237  REAL radocondi(klon,klev), radocondl(klon,klev)
     238  REAL effective_zneb
    237239
    238240  INTEGER i, k, n, kk
     
    922924    ENDIF
    923925
     926
     927    ! Autoconversion
     928    ! -------------------------------------------------------------------------------
     929
     930
    924931    ! Initialisation of zoliq and radocond variables
    925932
     
    933940            iwc(i)   = 0.
    934941            zneb(i)  = MAX(rneb(i,k),seuil_neb)
    935             radocond(i,k) = zoliq(i)/REAL(ninter+1)
     942            radocond(i,k) = zoliq(i)/REAL(niter_lscp+1)
    936943            radicefrac(i,k) = zfice(i)
    937             radocondi(i,k)=zoliq(i)*zfice(i)/REAL(ninter+1)
    938             radocondl(i,k)=zoliq(i)*(1.-zfice(i))/REAL(ninter+1)
     944            radocondi(i,k)=zoliq(i)*zfice(i)/REAL(niter_lscp+1)
     945            radocondl(i,k)=zoliq(i)*(1.-zfice(i))/REAL(niter_lscp+1)
    939946    ENDDO
    940947
    941     ! Autoconversion
    942     ! -------------------------------------------------------------------------------
    943      
    944     DO n = 1, ninter
     948       
     949    DO n = 1, niter_lscp
    945950
    946951        DO i=1,klon
     
    968973                ELSE
    969974
    970                     IF (ok_debug_autoconversion) THEN ! if condition to be removed after test phase
    971 
    972                     ! water quantity to remove: zchau (Sundqvist, 1978)
    973                     ! same thing for the ice: zfroi (Zender & Kiehl, 1997)
    974975                    IF (ptconv(i,k)) THEN ! if convective point
    975976                        zcl=cld_lc_con
    976977                        zct=1./cld_tau_con
    977                         zfroi = dtime/REAL(ninter)/zdz(i)*zoliqi(i)*velo(i,k)
     978                        zexpo=cld_expo_con
     979                        ffallv=ffallv_con
    978980                    ELSE
    979981                        zcl=cld_lc_lsc
    980982                        zct=1./cld_tau_lsc
    981                         zfroi = dtime/REAL(ninter)/zdz(i)*zoliqi(i) &   ! dqice/dt=1/rho*d(rho*wice*qice)/dz
    982                             *velo(i,k)
     983                        zexpo=cld_expo_lsc
     984                        ffallv=ffallv_lsc
    983985                    ENDIF
     986
    984987
    985988                    ! if vertical heterogeneity is taken into account, we use
     
    988991                    ! reduces the in-cloud water).
    989992
     993                    ! Liquid water quantity to remove: zchau (Sundqvist, 1978)
     994                    ! dqliq/dt=-qliq/tau*(1-exp(-qcin/clw)**2)
     995                    !.........................................................
    990996                    IF ((iflag_cloudth_vert.GE.3).AND.(iflag_rain_incloud_vol.EQ.1)) THEN
    991                         zchau = zct   *dtime/REAL(ninter) * zoliql(i) &
    992                         *(1.0-EXP(-(zoliql(i)/ctot_vol(i,k)/zcl)**2))
    993                     ELSE
    994                         zchau = zct   *dtime/REAL(ninter) * zoliql(i) &
    995                         *(1.0-EXP(-(zoliql(i)/zneb(i)/zcl)**2))        ! dqliq/dt=-qliq/tau*(1-exp(-qcin/clw)**2)
    996                     ENDIF
    997 
    998                     ELSE ! with old bug in autoconversion
    999 
    1000                     ! water quantity to remove: zchau (Sundqvist, 1978)
    1001                     ! same thing for the ice: zfroi (Zender & Kiehl, 1997)
    1002                     IF (ptconv(i,k)) THEN ! if convective point
    1003                         zcl=cld_lc_con
    1004                         zct=1./cld_tau_con
    1005                         zfroi = dtime/REAL(ninter)/zdz(i)*zoliq(i)*velo(i,k)*zfice(i)
    1006                     ELSE
    1007                         zcl=cld_lc_lsc
    1008                         zct=1./cld_tau_lsc
    1009                         zfroi = dtime/REAL(ninter)/zdz(i)*zoliq(i) &   ! dqice/dt=1/rho*d(rho*wice*qice)/dz
    1010                             *velo(i,k) * zfice(i)
    1011                     ENDIF
    1012997
    1013998                    ! if vertical heterogeneity is taken into account, we use
     
    10151000                    ! surface fraction (which is larger and artificially
    10161001                    ! reduces the in-cloud water).
    1017 
    1018 
    1019                     IF ((iflag_cloudth_vert.GE.3).AND.(iflag_rain_incloud_vol.EQ.1)) THEN
    1020                         zchau = zct   *dtime/REAL(ninter) * zoliq(i) &
    1021                         *(1.0-EXP(-(zoliq(i)/ctot_vol(i,k)/zcl)**2)) *(1.-zfice(i))
     1002                        effective_zneb=ctot_vol(i,k)
    10221003                    ELSE
    1023                         zchau = zct   *dtime/REAL(ninter) * zoliq(i) &
    1024                         *(1.0-EXP(-(zoliq(i)/zneb(i)/zcl)**2)) *(1.-zfice(i)) ! dqliq/dt=-qliq/tau*(1-exp(-qcin/clw)**2)
     1004                        effective_zneb=zneb(i)
     1005                    ENDIF
     1006
     1007
     1008                    IF (iflag_autoconversion .EQ. 2) THEN
     1009                    ! two-steps resolution with niter_lscp=1 sufficient
     1010                    ! we first treat the second term (with exponential) in an explicit way
     1011                    ! and then treat the first term (-q/tau) in an exact way
     1012                        zchau=zoliql(i)*(1.-exp(-dtime/REAL(niter_lscp)*zct &
     1013                        *(1.-exp(-(zoliql(i)/effective_zneb/zcl)**zexpo))))
     1014                    ELSE
     1015                    ! old explicit resolution with subtimesteps
     1016                        zchau = zct*dtime/REAL(niter_lscp)*zoliql(i) &
     1017                        *(1.0-EXP(-(zoliql(i)/effective_zneb/zcl)**zexpo))
    10251018                    ENDIF
    10261019
    1027                     ENDIF ! ok_debug_autoconversion
     1020
     1021                    ! Ice water quantity to remove (Zender & Kiehl, 1997)
     1022                    ! dqice/dt=1/rho*d(rho*wice*qice)/dz
     1023                    !....................................
     1024                    IF (iflag_autoconversion .EQ. 2) THEN
     1025                    ! exact resolution, niter_lscp=1 is sufficient but works only
     1026                    ! with iflag_vice=0
     1027                       IF (zoliqi(i) .GT. 0.) THEN
     1028                          zfroi=(zoliqi(i)-((zoliqi(i)**(-dice_velo)) &
     1029                          +dice_velo*dtime/REAL(niter_lscp)*cice_velo/zdz(i)*ffallv)**(-1./dice_velo))
     1030                       ELSE
     1031                          zfroi=0.
     1032                       ENDIF
     1033                    ELSE
     1034                    ! old explicit resolution with subtimesteps
     1035                       zfroi = dtime/REAL(niter_lscp)/zdz(i)*zoliqi(i)*velo(i,k)
     1036                    ENDIF
    10281037
    10291038                    zrain   = MIN(MAX(zchau,0.0),zoliql(i))
     
    10331042                ENDIF
    10341043
    1035                 zoliql(i) = MAX(zoliq(i)*(1.-zfice(i))-1.*zrain  , 0.0)
    1036                 zoliqi(i) = MAX(zoliq(i)*zfice(i)-1.*zsnow  , 0.0)
    1037                 zoliq(i)  = MAX(zoliq(i)-zprecip , 0.0)
     1044                IF (iflag_autoconversion .GE. 1) THEN
     1045                   ! debugged version with phase conservation through the autoconversion process
     1046                   zoliql(i) = MAX(zoliql(i)-1.*zrain  , 0.0)
     1047                   zoliqi(i) = MAX(zoliqi(i)-1.*zsnow  , 0.0)
     1048                   zoliq(i)  = MAX(zoliq(i)-zprecip , 0.0)
     1049                ELSE
     1050                   ! bugged version with phase resetting
     1051                   zoliql(i) = MAX(zoliq(i)*(1.-zfice(i))-1.*zrain  , 0.0)
     1052                   zoliqi(i) = MAX(zoliq(i)*zfice(i)-1.*zsnow  , 0.0)
     1053                   zoliq(i)  = MAX(zoliq(i)-zprecip , 0.0)
     1054                ENDIF
    10381055
    10391056                ! c_iso: call isotope_conversion (for readibility) or duplicate
    10401057
    1041                 radocond(i,k) = radocond(i,k) + zoliq(i)/REAL(ninter+1)
    1042                 radocondl(i,k) = radocondl(i,k) + zoliql(i)/REAL(ninter+1)
    1043                 radocondi(i,k) = radocondi(i,k) + zoliqi(i)/REAL(ninter+1)
     1058                radocond(i,k) = radocond(i,k) + zoliq(i)/REAL(niter_lscp+1)
     1059                radocondl(i,k) = radocondl(i,k) + zoliql(i)/REAL(niter_lscp+1)
     1060                radocondi(i,k) = radocondi(i,k) + zoliqi(i)/REAL(niter_lscp+1)
    10441061
    10451062            ENDIF ! rneb >0
     
    11371154        ENDDO
    11381155
     1156
    11391157    ENDIF
    11401158
  • LMDZ6/trunk/libf/phylmd/lscp_tools_mod.F90

    r4535 r4559  
    1717   
    1818    use lscp_ini_mod, only: iflag_vice, ffallv_con, ffallv_lsc
     19    use lscp_ini_mod, only: cice_velo, dice_velo
    1920
    2021    IMPLICIT NONE
     
    3132
    3233    INTEGER i
    33     REAL logvm,iwcg,tempc,phpa,cvel,dvel,fallv_tun
     34    REAL logvm,iwcg,tempc,phpa,fallv_tun
    3435    REAL m2ice, m2snow, vmice, vmsnow
    3536    REAL aice, bice, asnow, bsnow
     
    6061       
    6162        velo(i)=fallv_tun*velo(i)/100.0 ! from cm/s to m/s
    62         dvel=0.2
    63         cvel=fallv_tun*65.0*(rho(i)**0.2)*(150./phpa)**0.15
    6463
    6564    ELSE IF (iflag_vice .EQ. 2) THEN
     
    9291        vmsnow=vmsnow*((1000./phpa)**0.35)
    9392        velo(i)=fallv_tun*min(vmsnow,vmice)/100. ! to m/s
    94         dvel=0.2
    95         cvel=velo(i)/((iwcg/1000.*rho(i))**dvel)
    9693
    9794    ELSE
    9895        ! By default, fallspeed velocity of ice crystals according to Heymsfield & Donner 1990
    99         velo(i) = fallv_tun*3.29/2.0*((iwcg/1000.)**0.16)
    100         dvel=0.16
    101         cvel=fallv_tun*3.29/2.0*(rho(i)**0.16)
     96        velo(i) = fallv_tun*cice_velo*((iwcg/1000.)**dice_velo)
    10297    ENDIF
    10398    ENDDO
Note: See TracChangeset for help on using the changeset viewer.