Changeset 2007
- Timestamp:
- Apr 6, 2014, 2:20:38 PM (10 years ago)
- Location:
- LMDZ5/trunk/libf/phylmd
- Files:
-
- 1 added
- 10 edited
Legend:
- Unmodified
- Added
- Removed
-
LMDZ5/trunk/libf/phylmd/add_phys_tend.F90
r1998 r2007 18 18 use phys_state_var_mod 19 19 IMPLICIT none 20 #include "iniprint.h" 21 #include "YOMCST.h" 20 include "iniprint.h" 21 include "YOMCST.h" 22 include "clesphys.h" 22 23 23 24 ! Arguments : … … 117 118 DO j = 1, jqbad 118 119 i=jqadrs(j) 119 IF (.NOT.done(i)) THEN !jyg120 120 if(prt_level.ge.debug_level) THEN 121 121 print*,'WARNING : EAU POUR LE POINT i rlon rlat =',i,rlon(i),rlat(i),text … … 125 125 ENDDO 126 126 endif 127 IF (ok_conserv_q) THEN 127 128 !jyg<20140228 Corrections pour conservation de l'eau 128 DO k = 1, klev 129 zqp(k) = max(q_seri(i,k),1.e-15) 130 ENDDO 131 zq_int = 0. 132 zqp_int = 0. 133 DO k = 1, klev 134 zq_int = zq_int + q_seri(i,k)*(paprs(i,k)-paprs(i,k+1))/Rg 135 zqp_int = zqp_int + zqp(k) *(paprs(i,k)-paprs(i,k+1))/Rg 136 ENDDO 137 if(prt_level.ge.debug_level) THEN 138 print*,' cas q_seri<1.e-15 i k zq_int zqp_int zq_int/zqp_int :', & 139 i, kqadrs(j), zq_int, zqp_int, zq_int/zqp_int 140 endif 141 DO k = 1, klev 142 zq_new = zqp(k)*zq_int/zqp_int 143 zdq(i,k) = zdq(i,k) + zq_new - q_seri(i,k) 144 q_seri(i,k) = zq_new 145 ENDDO 146 done(i) = .true. 147 ENDIF !(.NOT.done(i)) 148 149 ! DO k = 1, klev 150 ! zq=q_seri(i,k)+zdq(i,k) 151 ! if (zq.lt.1.e-15) then 152 ! if (q_seri(i,k).lt.1.e-15) then 153 ! if(prt_level.ge.debug_level) THEN 154 ! print*,' cas q_seri<1.e-15 i k q_seri zq zdq :',i,k,q_seri(i,k),zq,zdq(i,k) 155 ! endif 156 ! q_seri(i,k)=1.e-15 157 ! zdq(i,k)=(1.e-15-q_seri(i,k)) 129 IF (.NOT.done(i)) THEN !jyg 130 DO k = 1, klev 131 zqp(k) = max(q_seri(i,k),1.e-15) 132 ENDDO 133 zq_int = 0. 134 zqp_int = 0. 135 DO k = 1, klev 136 zq_int = zq_int + q_seri(i,k)*(paprs(i,k)-paprs(i,k+1))/Rg 137 zqp_int = zqp_int + zqp(k) *(paprs(i,k)-paprs(i,k+1))/Rg 138 ENDDO 139 if(prt_level.ge.debug_level) THEN 140 print*,' cas q_seri<1.e-15 i k zq_int zqp_int zq_int/zqp_int :', & 141 i, kqadrs(j), zq_int, zqp_int, zq_int/zqp_int 142 endif 143 DO k = 1, klev 144 zq_new = zqp(k)*zq_int/zqp_int 145 zdq(i,k) = zdq(i,k) + zq_new - q_seri(i,k) 146 q_seri(i,k) = zq_new 147 ENDDO 148 done(i) = .true. 149 ENDIF !(.NOT.done(i)) 150 ELSE 151 !jyg> 152 DO k = 1, klev 153 zq=q_seri(i,k)+zdq(i,k) 154 if (zq.lt.1.e-15) then 155 if (q_seri(i,k).lt.1.e-15) then 156 if(prt_level.ge.debug_level) THEN 157 print*,' cas q_seri<1.e-15 i k q_seri zq zdq :',i,k,q_seri(i,k),zq,zdq(i,k) 158 endif 159 q_seri(i,k)=1.e-15 160 zdq(i,k)=(1.e-15-q_seri(i,k)) 161 endif 162 endif 163 ! zq=q_seri(i,k)+zdq(i,k) 164 ! if (zq.lt.1.e-15) then 165 ! zdq(i,k)=(1.e-15-q_seri(i,k)) 158 166 ! endif 159 ! endif 160 !! zq=q_seri(i,k)+zdq(i,k) 161 !! if (zq.lt.1.e-15) then 162 !! zdq(i,k)=(1.e-15-q_seri(i,k)) 163 !! endif 164 ! ENDDO 167 ENDDO 168 !jyg<20140228 169 ENDIF ! (ok_conserv_q) 165 170 !jyg> 166 ENDDO 171 ENDDO ! j = 1, jqbad 167 172 ENDIF 168 173 ! -
LMDZ5/trunk/libf/phylmd/clesphys.h
r2003 r2007 18 18 REAL(kind=8) CH4_ppb, N2O_ppb, CFC11_ppt, CFC12_ppt 19 19 !IM ajout CFMIP2/CMIP5 20 REAL co2_ppm_per21 20 LOGICAL ok_4xCO2atm 22 21 REAL(kind=8) RCO2_per,RCH4_per,RN2O_per,RCFC11_per,RCFC12_per … … 77 76 LOGICAL :: ok_strato 78 77 LOGICAL :: ok_hines, ok_gwd_rando 78 LOGICAL :: ok_conserv_q 79 79 80 80 COMMON/clesphys/ & 81 81 ! REAL FIRST 82 & co2_ppm, co2_ppm_per, solaire&82 & co2_ppm, solaire & 83 83 & , RCO2, RCH4, RN2O, RCFC11, RCFC12 & 84 84 & , RCO2_act, RCH4_act, RN2O_act, RCFC11_act, RCFC12_act & … … 114 114 & , ok_lic_melt, aer_type & 115 115 & , iflag_rrtm, ok_strato,ok_hines & 116 & , iflag_ice_thermo, ok_gwd_rando, NSW 116 & , iflag_ice_thermo, ok_gwd_rando, NSW & 117 & , ok_conserv_q 117 118 118 119 save /clesphys/ -
LMDZ5/trunk/libf/phylmd/concvl.F90
r1992 r2007 1 SUBROUTINE concvl(iflag_clos, dtime, paprs, pplay, t, q, t_wake, q_wake, & 2 s_wake, u, v, tra, ntra, ale, alp, sig1, w01, d_t, d_q, d_u, d_v, d_tra, & 3 rain, snow, kbas, ktop, sigd, cbmf, plcl, plfc, wbeff, upwd, dnwd, & 4 dnwdbis, ma, mip, vprecip, cape, cin, tvp, tconv, iflag, pbase, bbase, & 5 dtvpdt1, dtvpdq1, dplcldt, dplcldr, qcondc, wd, pmflxr, pmflxs, & ! RomP 6 ! >>> 7 ! ! . da,phi,mp,dd_t,dd_q,lalim_conv,wght_th) 8 da, phi, mp, phi2, d1a, dam, sij, clw, elij, & ! RomP 9 dd_t, dd_q, lalim_conv, wght_th, & ! RomP 10 evap, ep, epmlmmm, eplamm, & ! RomP 11 wdtraina, wdtrainm) ! RomP 12 ! RomP <<< 13 ! ************************************************************** 14 ! * 15 ! CONCVL * 16 ! * 17 ! * 18 ! written by : Sandrine Bony-Lena, 17/05/2003, 11.16.04 * 19 ! modified by : * 20 ! ************************************************************** 1 SUBROUTINE concvl(iflag_clos, & 2 dtime, paprs, pplay, & 3 t, q, t_wake, q_wake, s_wake, u, v, tra, ntra, & 4 Ale, Alp, sig1, w01, & 5 d_t, d_q, d_u, d_v, d_tra, & 6 rain, snow, kbas, ktop, sigd, & 7 cbmf, plcl, plfc, wbeff, upwd, dnwd, dnwdbis, & 8 Ma, mip, Vprecip, & 9 cape, cin, tvp, Tconv, iflag, & 10 pbase, bbase, dtvpdt1, dtvpdq1, dplcldt, dplcldr, & 11 qcondc, wd, pmflxr, pmflxs, & 12 !RomP >>> 13 !! . da,phi,mp,dd_t,dd_q,lalim_conv,wght_th) 14 da, phi, mp, phi2, d1a, dam, sij, clw, elij, & ! RomP 15 dd_t, dd_q, lalim_conv, wght_th, & ! RomP 16 evap, ep, epmlmMm, eplaMm, & ! RomP 17 wdtrainA, wdtrainM, wght) ! RomP+RL 18 !RomP <<< 19 ! ************************************************************** 20 ! * 21 ! CONCVL * 22 ! * 23 ! * 24 ! written by : Sandrine Bony-Lena, 17/05/2003, 11.16.04 * 25 ! modified by : * 26 ! ************************************************************** 21 27 22 28 … … 24 30 USE infotrac, ONLY: nbtr 25 31 IMPLICIT NONE 26 ! ====================================================================== 27 ! Auteur(s): S. Bony-Lena (LMD/CNRS) date: ??? 28 ! Objet: schema de convection de Emanuel (1991) interface 29 ! ====================================================================== 30 ! Arguments: 31 ! dtime--input-R-pas d'integration (s) 32 ! s-------input-R-la valeur "s" pour chaque couche 33 ! sigs----input-R-la valeur "sigma" de chaque couche 34 ! sig-----input-R-la valeur de "sigma" pour chaque niveau 35 ! psolpa--input-R-la pression au sol (en Pa) 36 ! pskapa--input-R-exponentiel kappa de psolpa 37 ! h-------input-R-enthalpie potentielle (Cp*T/P**kappa) 38 ! q-------input-R-vapeur d'eau (en kg/kg) 39 40 ! work*: input et output: deux variables de travail, 41 ! on peut les mettre a 0 au debut 42 ! ALE-----input-R-energie disponible pour soulevement 43 ! ALP-----input-R-puissance disponible pour soulevement 44 45 ! d_h-----output-R-increment de l'enthalpie potentielle (h) 46 ! d_q-----output-R-increment de la vapeur d'eau 47 ! rain----output-R-la pluie (mm/s) 48 ! snow----output-R-la neige (mm/s) 49 ! upwd----output-R-saturated updraft mass flux (kg/m**2/s) 50 ! dnwd----output-R-saturated downdraft mass flux (kg/m**2/s) 51 ! dnwd0---output-R-unsaturated downdraft mass flux (kg/m**2/s) 52 ! Ma------output-R-adiabatic ascent mass flux (kg/m2/s) 53 ! mip-----output-R-mass flux shed by adiabatic ascent (kg/m2/s) 54 ! Vprecip-output-R-vertical profile of precipitations (kg/m2/s) 55 ! Tconv---output-R-environment temperature seen by convective scheme (K) 56 ! Cape----output-R-CAPE (J/kg) 57 ! Cin ----output-R-CIN (J/kg) 58 ! Tvp-----output-R-Temperature virtuelle d'une parcelle soulevee 59 ! adiabatiquement a partir du niveau 1 (K) 60 ! deltapb-output-R-distance entre LCL et base de la colonne (<0 ; Pa) 61 ! Ice_flag-input-L-TRUE->prise en compte de la thermodynamique de la glace 62 ! dd_t-----output-R-increment de la temperature du aux descentes 63 ! precipitantes 64 ! dd_q-----output-R-increment de la vapeur d'eau du aux desc precip 65 ! ====================================================================== 32 ! ====================================================================== 33 ! Auteur(s): S. Bony-Lena (LMD/CNRS) date: ??? 34 ! Objet: schema de convection de Emanuel (1991) interface 35 ! ====================================================================== 36 ! Arguments: 37 ! dtime--input-R-pas d'integration (s) 38 ! s-------input-R-la vAleur "s" pour chaque couche 39 ! sigs----input-R-la vAleur "sigma" de chaque couche 40 ! sig-----input-R-la vAleur de "sigma" pour chaque niveau 41 ! psolpa--input-R-la pression au sol (en Pa) 42 ! pskapa--input-R-exponentiel kappa de psolpa 43 ! h-------input-R-enthAlpie potentielle (Cp*T/P**kappa) 44 ! q-------input-R-vapeur d'eau (en kg/kg) 45 46 ! work*: input et output: deux variables de travail, 47 ! on peut les mettre a 0 au debut 48 ! ALE--------input-R-energie disponible pour soulevement 49 ! ALP--------input-R-puissance disponible pour soulevement 50 51 ! d_h--------output-R-increment de l'enthAlpie potentielle (h) 52 ! d_q--------output-R-increment de la vapeur d'eau 53 ! rain-------output-R-la pluie (mm/s) 54 ! snow-------output-R-la neige (mm/s) 55 ! upwd-------output-R-saturated updraft mass flux (kg/m**2/s) 56 ! dnwd-------output-R-saturated downdraft mass flux (kg/m**2/s) 57 ! dnwd0------output-R-unsaturated downdraft mass flux (kg/m**2/s) 58 ! Ma---------output-R-adiabatic ascent mass flux (kg/m2/s) 59 ! mip--------output-R-mass flux shed by adiabatic ascent (kg/m2/s) 60 ! Vprecip----output-R-vertical profile of precipitations (kg/m2/s) 61 ! Tconv------output-R-environment temperature seen by convective scheme (K) 62 ! Cape-------output-R-CAPE (J/kg) 63 ! Cin -------output-R-CIN (J/kg) 64 ! Tvp--------output-R-Temperature virtuelle d'une parcelle soulevee 65 ! adiabatiquement a partir du niveau 1 (K) 66 ! deltapb----output-R-distance entre LCL et base de la colonne (<0 ; Pa) 67 ! Ice_flag---input-L-TRUE->prise en compte de la thermodynamique de la glace 68 ! dd_t-------output-R-increment de la temperature du aux descentes precipitantes 69 ! dd_q-------output-R-increment de la vapeur d'eau du aux desc precip 70 ! lalim_conv- 71 ! wght_th---- 72 ! evap-------output-R 73 ! ep---------output-R 74 ! epmlmMm----output-R 75 ! eplaMm-----output-R 76 ! wdtrainA---output-R 77 ! wdtrainM---output-R 78 ! wght-------output-R 79 ! ====================================================================== 66 80 67 81 … … 79 93 REAL sig1(klon, klev), w01(klon, klev), ptop2(klon) 80 94 REAL pmflxr(klon, klev+1), pmflxs(klon, klev+1) 81 REAL ale(klon), alp(klon)95 REAL Ale(klon), Alp(klon) 82 96 83 97 REAL d_t(klon, klev), d_q(klon, klev), d_u(klon, klev), d_v(klon, klev) … … 90 104 REAL upwd(klon, klev), dnwd(klon, klev), dnwdbis(klon, klev) 91 105 92 ! ! REAL Ma(klon,klev), mip(klon,klev),Vprecip(klon,klev) !jyg 93 REAL ma(klon, klev), mip(klon, klev), vprecip(klon, klev+1) !jyg 106 !! REAL Ma(klon,klev), mip(klon,klev),Vprecip(klon,klev) !jyg 107 REAL Ma(klon, klev), mip(klon, klev), Vprecip(klon, klev+1) !jyg 108 REAL wght(klon, klev) !RL 94 109 95 110 REAL da(klon, klev), phi(klon, klev, klev), mp(klon, klev) 96 111 ! RomP >>> 97 112 REAL phi2(klon, klev, klev) 98 113 REAL d1a(klon, klev), dam(klon, klev) 99 114 REAL sij(klon, klev, klev), clw(klon, klev), elij(klon, klev, klev) 100 REAL wdtrain a(klon, klev), wdtrainm(klon, klev)115 REAL wdtrainA(klon, klev), wdtrainM(klon, klev) 101 116 REAL evap(klon, klev), ep(klon, klev) 102 REAL epmlm mm(klon, klev, klev), eplamm(klon, klev)103 117 REAL epmlmMm(klon, klev, klev), eplaMm(klon, klev) 118 ! RomP <<< 104 119 REAL cape(klon), cin(klon), tvp(klon, klev) 105 REAL tconv(klon, klev)106 107 !CR:test: on passe lentr et alim_star des thermiques120 REAL Tconv(klon, klev) 121 122 !CR:test: on passe lentr et alim_star des thermiques 108 123 INTEGER lalim_conv(klon) 109 124 REAL wght_th(klon, klev) … … 111 126 REAL em_sig2feed ! sigma at upper bound of feeding layer 112 127 REAL em_wght(klev) ! weight density determining the feeding mixture 113 !on enleve le save114 128 !on enleve le save 129 ! SAVE em_sig1feed,em_sig2feed,em_wght 115 130 116 131 INTEGER iflag(klon) … … 127 142 REAL zx_t, zdelta, zx_qs, zcor 128 143 129 !INTEGER iflag_mix130 !SAVE iflag_mix144 ! INTEGER iflag_mix 145 ! SAVE iflag_mix 131 146 INTEGER noff, minorig 132 147 INTEGER i, k, itra 133 148 REAL qs(klon, klev), qs_wake(klon, klev) 134 149 REAL cbmf(klon), plcl(klon), plfc(klon), wbeff(klon) 135 ! LFSAVE cbmf136 !IM/JYG REAL, SAVE, ALLOCATABLE :: cbmf(:)137 ! cc$OMP THREADPRIVATE(cbmf)!150 !LF SAVE cbmf 151 !IM/JYG REAL, SAVE, ALLOCATABLE :: cbmf(:) 152 !!!$OMP THREADPRIVATE(cbmf)! 138 153 REAL cbmflast(klon) 139 154 INTEGER ifrst 140 155 SAVE ifrst 141 156 DATA ifrst/0/ 142 143 144 145 146 147 !LF Real ql(klon,klev)148 149 !LF Save ql150 !LF Real t1(klon,klev),q1(klon,klev)151 !LF Save t1,q1152 157 !$OMP THREADPRIVATE(ifrst) 158 159 160 ! Variables supplementaires liees au bilan d'energie 161 ! Real paire(klon) 162 !LF Real ql(klon,klev) 163 ! Save paire 164 !LF Save ql 165 !LF Real t1(klon,klev),q1(klon,klev) 166 !LF Save t1,q1 167 ! Data paire /1./ 153 168 REAL, SAVE, ALLOCATABLE :: ql(:, :), q1(:, :), t1(:, :) 154 155 156 ! Variables liees au bilan d'energie et d'enthalpi169 !$OMP THREADPRIVATE(ql, q1, t1) 170 171 ! Variables liees au bilan d'energie et d'enthAlpi 157 172 REAL ztsol(klon) 158 REAL h_vcol_tot, h_dair_tot, h_qw_tot, h_ql_tot, h_qs_tot, qw_tot,ql_tot, &159 qs_tot, ec_tot160 SAVE h_vcol_tot, h_dair_tot, h_qw_tot, h_ql_tot, h_qs_tot, qw_tot,ql_tot, &161 qs_tot, ec_tot162 163 164 REAL d_h_vcol, d_h_dair, d_qt, d_qw, d_ql, d_qs, d_ec165 REAL d_h_vcol_phy166 REAL fs_bound, fq_bound167 SAVE d_h_vcol_phy168 169 REAL zero_v(klon)173 REAL h_vcol_tot, h_dair_tot, h_qw_tot, h_ql_tot, & 174 h_qs_tot, qw_tot, ql_tot, qs_tot, ec_tot 175 SAVE h_vcol_tot, h_dair_tot, h_qw_tot, h_ql_tot, & 176 h_qs_tot, qw_tot, ql_tot, qs_tot, ec_tot 177 !$OMP THREADPRIVATE(h_vcol_tot, h_dair_tot, h_qw_tot, h_ql_tot) 178 !$OMP THREADPRIVATE(h_qs_tot, qw_tot, ql_tot, qs_tot , ec_tot) 179 REAL d_h_vcol, d_h_dair, d_qt, d_qw, d_ql, d_qs, d_ec 180 REAL d_h_vcol_phy 181 REAL fs_bound, fq_bound 182 SAVE d_h_vcol_phy 183 !$OMP THREADPRIVATE(d_h_vcol_phy) 184 REAL zero_v(klon) 170 185 CHARACTER *15 ztit 171 INTEGER ip_ebil ! PRINT level for energy conserv. diag.172 SAVE ip_ebil173 DATA ip_ebil/2/174 175 INTEGER if_ebil ! level for energy conserv. dignostics176 SAVE if_ebil177 DATA if_ebil/2/178 179 !+jld ec_conser186 INTEGER ip_ebil ! PRINT level for energy conserv. diag. 187 SAVE ip_ebil 188 DATA ip_ebil/2/ 189 !$OMP THREADPRIVATE(ip_ebil) 190 INTEGER if_ebil ! level for energy conserv. dignostics 191 SAVE if_ebil 192 DATA if_ebil/2/ 193 !$OMP THREADPRIVATE(if_ebil) 194 !+jld ec_conser 180 195 REAL d_t_ec(klon, klev) ! tendance du a la conersion Ec -> E thermique 181 196 REAL zrcpd 182 !-jld ec_conser183 !LF197 !-jld ec_conser 198 !LF 184 199 INTEGER nloc 185 LOGICAL, SAVE :: first = .TRUE.186 187 INTEGER, SAVE :: itap, igout188 200 LOGICAL, SAVE :: first = .TRUE. 201 !$OMP THREADPRIVATE(first) 202 INTEGER, SAVE :: itap, igout 203 !$OMP THREADPRIVATE(itap, igout) 189 204 190 205 include "YOMCST.h" … … 195 210 196 211 IF (first) THEN 197 198 199 !IM/JYG allocate(cbmf(klon))212 ! Allocate some variables LF 04/2008 213 214 !IM/JYG allocate(cbmf(klon)) 200 215 ALLOCATE (ql(klon,klev)) 201 216 ALLOCATE (t1(klon,klev)) … … 204 219 igout = klon/2 + 1/klon 205 220 END IF 206 221 ! Incrementer le compteur de la physique 207 222 itap = itap + 1 208 223 209 224 ! Copy T into Tconv 210 225 DO k = 1, klev 211 226 DO i = 1, klon 212 tconv(i, k) = t(i, k)227 Tconv(i, k) = t(i, k) 213 228 END DO 214 229 END DO … … 224 239 END IF 225 240 226 241 ! ym 227 242 snow(:) = 0 228 243 229 230 244 ! IF (ifrst .EQ. 0) THEN 245 ! ifrst = 1 231 246 IF (first) THEN 232 247 first = .FALSE. 233 248 234 235 236 249 ! =========================================================================== 250 ! READ IN PARAMETERS FOR THE CLOSURE AND THE MIXING DISTRIBUTION 251 ! =========================================================================== 237 252 238 253 IF (iflag_con==3) THEN 239 !CALL cv3_inicp()254 ! CALL cv3_inicp() 240 255 CALL cv3_inip() 241 256 END IF 242 257 243 ! =========================================================================== 244 ! READ IN PARAMETERS FOR CONVECTIVE INHIBITION BY TROPOS. DRYNESS 245 ! =========================================================================== 246 247 ! c$$$ open (56,file='supcrit.data') 248 ! c$$$ read (56,*) Supcrit1, Supcrit2 249 ! c$$$ close (56) 250 251 IF (prt_level>=10) WRITE (lunout, *) 'supcrit1, supcrit2', supcrit1, & 252 supcrit2 253 254 ! =========================================================================== 255 ! Initialisation pour les bilans d'eau et d'energie 256 ! =========================================================================== 258 ! =========================================================================== 259 ! READ IN PARAMETERS FOR CONVECTIVE INHIBITION BY TROPOS. DRYNESS 260 ! =========================================================================== 261 262 ! c$$$ open (56,file='supcrit.data') 263 ! c$$$ read (56,*) Supcrit1, Supcrit2 264 ! c$$$ close (56) 265 266 IF (prt_level>=10) WRITE (lunout, *) 'supcrit1, supcrit2', supcrit1, supcrit2 267 268 ! =========================================================================== 269 ! Initialisation pour les bilans d'eau et d'energie 270 ! =========================================================================== 257 271 IF (if_ebil>=1) d_h_vcol_phy = 0. 258 272 259 273 DO i = 1, klon 260 274 cbmf(i) = 0. 261 !! plcl(i) = 0.275 !! plcl(i) = 0. 262 276 sigd(i) = 0. 263 277 END DO 264 278 END IF !(ifrst .EQ. 0) 265 279 266 280 ! Initialisation a chaque pas de temps 267 281 plfc(:) = 0. 268 282 wbeff(:) = 100. … … 284 298 285 299 286 300 ! Feeding layer 287 301 288 302 em_sig1feed = 1. 289 303 em_sig2feed = 0.97 290 291 304 ! em_sig2feed = 0.8 305 ! Relative Weight densities 292 306 DO k = 1, klev 293 307 em_wght(k) = 1. 294 308 END DO 295 !CRtest: couche alim des tehrmiques ponderee par a*296 297 298 299 300 301 309 !CRtest: couche alim des tehrmiques ponderee par a* 310 ! DO i = 1, klon 311 ! do k=1,lalim_conv(i) 312 ! em_wght(k)=wght_th(i,k) 313 ! print*,'em_wght=',em_wght(k),wght_th(i,k) 314 ! end do 315 ! END DO 302 316 303 317 IF (iflag_con==4) THEN … … 318 332 END DO 319 333 END DO 320 ELSE ! iflag_con=3 (modif de puristes qui fait la diffce pour la 321 ! convergence numerique) 334 ELSE ! iflag_con=3 (modif de puristes qui fait la diffce pour la convergence numerique) 322 335 DO k = 1, klev 323 336 DO i = 1, klon … … 342 355 END IF ! iflag_con 343 356 344 345 346 347 !iflag_con=3 -> nvlle version de KE (JYG)348 ! iflag_con = 30 -> equivalent to convect3349 ! iflag_con = 4 -> equivalent to convect1/2357 ! ------------------------------------------------------------------ 358 359 ! Main driver for convection: 360 ! iflag_con=3 -> nvlle version de KE (JYG) 361 ! iflag_con = 30 -> equivAlent to convect3 362 ! iflag_con = 4 -> equivAlent to convect1/2 350 363 351 364 352 365 IF (iflag_con==30) THEN 353 366 354 ! print *, '-> cv_driver' !jyg 355 CALL cv_driver(klon, klev, klevp1, ntra, iflag_con, t, q, qs, u, v, tra, & 356 em_p, em_ph, iflag, d_t, d_q, d_u, d_v, d_tra, rain, vprecip, cbmf, & 357 sig1, w01, & !jyg 358 kbas, ktop, dtime, ma, upwd, dnwd, dnwdbis, qcondc, wd, cape, da, phi, & 359 mp, phi2, d1a, dam, sij, clw, elij, & !RomP 360 evap, ep, epmlmmm, eplamm, & !RomP 361 wdtraina, wdtrainm) !RomP 362 ! print *, 'cv_driver ->' !jyg 363 364 DO i = 1, klon 365 cbmf(i) = ma(i, kbas(i)) 366 END DO 367 ! print *, '-> cv_driver' !jyg 368 CALL cv_driver(klon, klev, klevp1, ntra, iflag_con, & 369 t, q, qs, u, v, tra, & 370 em_p, em_ph, iflag, & 371 d_t, d_q, d_u, d_v, d_tra, rain, & 372 Vprecip, cbmf, sig1, w01, & !jyg 373 kbas, ktop, & 374 dtime, Ma, upwd, dnwd, dnwdbis, qcondc, wd, cape, & 375 da, phi, mp, phi2, d1a, dam, sij, clw, elij, & !RomP 376 evap, ep, epmlmMm, eplaMm, & !RomP 377 wdtrainA, wdtrainM) !RomP 378 ! print *, 'cv_driver ->' !jyg 379 380 DO i = 1, klon 381 cbmf(i) = Ma(i, kbas(i)) 382 END DO 383 384 !RL 385 wght(:, :) = 0. 386 DO i = 1, klon 387 wght(i, 1) = 1. 388 END DO 389 !RL 367 390 368 391 ELSE 369 392 370 !LF necessary for gathered fields393 !LF necessary for gathered fields 371 394 nloc = klon 372 CALL cva_driver(klon, klev, klev+1, ntra, nloc, iflag_con, iflag_mix, & 373 iflag_ice_thermo, iflag_clos, dtime, t, q, qs, t_wake, q_wake, qs_wake, & 374 s_wake, u, v, tra, em_p, em_ph, ale, alp, em_sig1feed, em_sig2feed, & 375 em_wght, iflag, d_t, d_q, d_u, d_v, d_tra, rain, kbas, ktop, cbmf, & 376 plcl, plfc, wbeff, sig1, w01, ptop2, sigd, ma, mip, vprecip, upwd, & 377 dnwd, dnwdbis, qcondc, wd, cape, cin, tvp, dd_t, dd_q, plim1, plim2, & 378 asupmax, supmax0, asupmaxmin, lalim_conv, & ! AC!+!RomP+jyg 379 da, phi, mp, phi2, d1a, dam, sij, clw, elij, & ! RomP 380 evap, ep, epmlmmm, eplamm, & ! RomP 381 wdtraina, wdtrainm) ! RomP 382 ! AC!+!RomP+jyg 395 CALL cva_driver(klon, klev, klev+1, ntra, nloc, & 396 iflag_con, iflag_mix, iflag_ice_thermo, & 397 iflag_clos, ok_conserv_q, dtime, & 398 t, q, qs, t_wake, q_wake, qs_wake, s_wake, u, v, tra, & 399 em_p, em_ph, & 400 Ale, Alp, & 401 em_sig1feed, em_sig2feed, em_wght, & 402 iflag, d_t, d_q, d_u, d_v, d_tra, rain, kbas, ktop, & 403 cbmf, plcl, plfc, wbeff, sig1, w01, ptop2, sigd, & 404 Ma, mip, Vprecip, upwd, dnwd, dnwdbis, qcondc, wd, & 405 cape, cin, tvp, & 406 dd_t, dd_q, plim1, plim2, asupmax, supmax0, & 407 asupmaxmin, lalim_conv, & 408 !AC!+!RomP+jyg 409 !! da,phi,mp,phi2,d1a,dam,sij,clw,elij, & ! RomP 410 !! evap,ep,epmlmMm,eplaMm, ! RomP 411 da, phi, mp, phi2, d1a, dam, sij, wght, & ! RomP+RL 412 clw, elij, evap, ep, epmlmMm, eplaMm, & ! RomP+RL 413 wdtrainA, wdtrainM) ! RomP 414 !AC!+!RomP+jyg 383 415 END IF 384 385 IF (prt_level>=10) WRITE (lunout, *) ' cva_driver -> cbmf,plcl,plfc,wbeff ' &386 ,cbmf(1), plcl(1), plfc(1), wbeff(1)416 ! ------------------------------------------------------------------ 417 IF (prt_level>=10) WRITE (lunout, *) ' cva_driver -> cbmf,plcl,plfc,wbeff ', & 418 cbmf(1), plcl(1), plfc(1), wbeff(1) 387 419 388 420 DO i = 1, klon … … 404 436 DO k = 1, klev 405 437 DO i = 1, klon 406 d_tra(i, k, itra) = dtime*d_tra(i, k, itra) 438 !RL! d_tra(i,k,itra) =dtime*d_tra(i,k,itra) 439 d_tra(i, k, itra) = 0. 407 440 END DO 408 441 END DO … … 410 443 END IF 411 444 412 !!AC!445 !!AC! 413 446 IF (iflag_con==3) THEN 414 447 DO itra = 1, ntra 415 448 DO k = 1, klev 416 449 DO i = 1, klon 417 d_tra(i, k, itra) = dtime*d_tra(i, k, itra) 450 !RL! d_tra(i,k,itra) =dtime*d_tra(i,k,itra) 451 d_tra(i, k, itra) = 0. 418 452 END DO 419 453 END DO 420 454 END DO 421 455 END IF 422 !!AC!456 !!AC! 423 457 424 458 DO k = 1, klev … … 428 462 END DO 429 463 END DO 430 !!jyg431 432 DO k = 1, klev !jyg433 DO i = 1, klon !jyg434 IF (t1(i,k)<rtt) THEN !jyg435 pmflxs(i, k) = vprecip(i, k)!jyg436 ELSE !jyg437 pmflxr(i, k) = vprecip(i, k)!jyg438 END IF !jyg439 END DO !jyg440 END DO !jyg441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 464 ! !jyg 465 ! --Separation neige/pluie (pour diagnostics) !jyg 466 DO k = 1, klev !jyg 467 DO i = 1, klon !jyg 468 IF (t1(i,k)<rtt) THEN !jyg 469 pmflxs(i, k) = Vprecip(i, k) !jyg 470 ELSE !jyg 471 pmflxr(i, k) = Vprecip(i, k) !jyg 472 END IF !jyg 473 END DO !jyg 474 END DO !jyg 475 476 ! c IF (if_ebil.ge.2) THEN 477 ! c ztit='after convect' 478 ! c CALL diagetpq(paire,ztit,ip_ebil,2,2,dtime 479 ! c e , t1,q1,ql,qs,u,v,paprs,pplay 480 ! c s , d_h_vcol, d_qt, d_qw, d_ql, d_qs, d_ec) 481 ! c call diagphy(paire,ztit,ip_ebil 482 ! c e , zero_v, zero_v, zero_v, zero_v, zero_v 483 ! c e , zero_v, rain, zero_v, ztsol 484 ! c e , d_h_vcol, d_qt, d_ec 485 ! c s , fs_bound, fq_bound ) 486 ! c END IF 487 488 489 ! les traceurs ne sont pas mis dans cette version de convect4: 456 490 IF (iflag_con==4) THEN 457 491 DO itra = 1, ntra … … 463 497 END DO 464 498 END IF 465 499 ! print*, 'concvl->: dd_t,dd_q ',dd_t(1,1),dd_q(1,1) 466 500 467 501 DO k = 1, klev … … 478 512 IF (prt_level>=20) THEN 479 513 DO k = 1, klev 480 ! print*,'physiq apres_add_con i k it d_u d_v d_t d_q qdl0',igout 481 ! .,k,itap,d_u_con(igout,k) ,d_v_con(igout,k), d_t_con(igout,k), 482 ! .d_q_con(igout,k),dql0(igout,k)483 ! print*,'phys apres_add_con itap Ma cin ALE ALP wak t q undi t q' 484 ! .,itap,Ma(igout,k),cin(igout),ALE(igout), ALP(igout), 485 ! .t_wake(igout,k),q_wake(igout,k),t_undi(igout,k),q_undi(igout,k)486 ! print*,'phy apres_add_con itap CON rain snow EMA wk1 wk2 Vpp mip' 487 ! .,itap,rain_con(igout),snow_con(igout),ema_work1(igout,k), 488 ! .ema_work2(igout,k),Vprecip(igout,k), mip(igout,k)489 ! print*,'phy apres_add_con itap upwd dnwd dnwd0 cape tvp Tconv ' 490 ! .,itap,upwd(igout,k),dnwd(igout,k),dnwd0(igout,k),cape(igout), 491 ! .tvp(igout,k),Tconv(igout,k)492 ! print*,'phy apres_add_con itap dtvpdt dtvdq dplcl dplcldr qcondc' 493 ! .,itap,dtvpdt1(igout,k),dtvpdq1(igout,k),dplcldt(igout), 494 ! .dplcldr(igout),qcondc(igout,k)495 ! print*,'phy apres_add_con itap wd pmflxr Kpmflxr Kp1 Kpmflxs Kp1' 496 ! .,itap,wd(igout),pmflxr(igout,k),pmflxr(igout,k+1),pmflxs(igout,k) 497 ! .,pmflxs(igout,k+1)498 ! print*,'phy apres_add_con itap da phi mp ftd fqd lalim wgth', 499 ! .itap,da(igout,k),phi(igout,k,k),mp(igout,k),ftd(igout,k), 500 ! .fqd(igout,k),lalim_conv(igout),wght_th(igout,k)514 ! print*,'physiq apres_add_con i k it d_u d_v d_t d_q qdl0',igout, & 515 ! k,itap,d_u_con(igout,k) ,d_v_con(igout,k), d_t_con(igout,k), & 516 ! d_q_con(igout,k),dql0(igout,k) 517 ! print*,'phys apres_add_con itap Ma cin ALE ALP wak t q undi t q', & 518 ! itap,Ma(igout,k),cin(igout),ALE(igout), ALP(igout), & 519 ! t_wake(igout,k),q_wake(igout,k),t_undi(igout,k),q_undi(igout,k) 520 ! print*,'phy apres_add_con itap CON rain snow EMA wk1 wk2 Vpp mip', & 521 ! itap,rain_con(igout),snow_con(igout),ema_work1(igout,k), & 522 ! ema_work2(igout,k),Vprecip(igout,k), mip(igout,k) 523 ! print*,'phy apres_add_con itap upwd dnwd dnwd0 cape tvp Tconv ', & 524 ! itap,upwd(igout,k),dnwd(igout,k),dnwd0(igout,k),cape(igout), & 525 ! tvp(igout,k),Tconv(igout,k) 526 ! print*,'phy apres_add_con itap dtvpdt dtvdq dplcl dplcldr qcondc', & 527 ! itap,dtvpdt1(igout,k),dtvpdq1(igout,k),dplcldt(igout), & 528 ! dplcldr(igout),qcondc(igout,k) 529 ! print*,'phy apres_add_con itap wd pmflxr Kpmflxr Kp1 Kpmflxs Kp1', & 530 ! itap,wd(igout),pmflxr(igout,k),pmflxr(igout,k+1),pmflxs(igout,k), & 531 ! pmflxs(igout,k+1) 532 ! print*,'phy apres_add_con itap da phi mp ftd fqd lalim wgth', & 533 ! itap,da(igout,k),phi(igout,k,k),mp(igout,k),ftd(igout,k), & 534 ! fqd(igout,k),lalim_conv(igout),wght_th(igout,k) 501 535 END DO 502 536 END IF !(prt_level.EQ.20) THEN -
LMDZ5/trunk/libf/phylmd/conf_phys_m.F90
r2006 r2007 182 182 INTEGER, SAVE :: nbapp_rad_omp, iflag_con_omp 183 183 INTEGER, SAVE :: iflag_ener_conserv_omp 184 LOGICAL, SAVE :: ok_conserv_q_omp 184 185 INTEGER, SAVE :: iflag_fisrtilp_qsat_omp 185 186 LOGICAL,SAVE :: ok_strato_omp … … 696 697 iflag_ener_conserv_omp = -1 697 698 CALL getin('iflag_ener_conserv',iflag_ener_conserv_omp) 699 700 !Config Key = ok_conserv_q 701 !Config Desc = Switch des corrections de conservation de l'eau 702 !Config Def = y 703 !Config Help = Switch des corrections de conservation de l'eau 704 !Config y -> corrections activees 705 !Config n -> conformite avec versions anterieures au 1/4/2014 706 ok_conserv_q_omp = .TRUE. 707 CALL getin('ok_conserv_q',ok_conserv_q_omp) 698 708 699 709 !Config Key = iflag_fisrtilp_qsat … … 1758 1768 iflag_con = iflag_con_omp 1759 1769 iflag_ener_conserv = iflag_ener_conserv_omp 1770 ok_conserv_q = ok_conserv_q_omp 1760 1771 iflag_fisrtilp_qsat = iflag_fisrtilp_qsat_omp 1761 1772 … … 1984 1995 write(lunout,*)'iflag_con=',iflag_con 1985 1996 write(lunout,*)'iflag_ener_conserv=',iflag_ener_conserv 1997 write(lunout,*)'ok_conserv_q=',ok_conserv_q 1986 1998 write(lunout,*)'iflag_fisrtilp_qsat=',iflag_fisrtilp_qsat 1987 1999 write(lunout,*)' epmax = ', epmax -
LMDZ5/trunk/libf/phylmd/cv3_routines.F90
r1992 r2007 7 7 IMPLICIT NONE 8 8 9 !------------------------------------------------------------10 !Set parameters for convectL for iflag_con = 311 !------------------------------------------------------------12 13 14 !*** PBCRIT IS THE CRITICAL CLOUD DEPTH (MB) BENEATH WHICH THE ***15 !*** PRECIPITATION EFFICIENCY IS ASSUMED TO BE ZERO ***16 !*** PTCRIT IS THE CLOUD DEPTH (MB) ABOVE WHICH THE PRECIP. ***17 !*** EFFICIENCY IS ASSUMED TO BE UNITY ***18 !*** SIGD IS THE FRACTIONAL AREA COVERED BY UNSATURATED DNDRAFT ***19 !*** SPFAC IS THE FRACTION OF PRECIPITATION FALLING OUTSIDE ***20 !*** OF CLOUD ***21 22 ![TAU: CHARACTERISTIC TIMESCALE USED TO COMPUTE ALPHA & BETA]23 !*** ALPHA AND BETA ARE PARAMETERS THAT CONTROL THE RATE OF ***24 !*** APPROACH TO QUASI-EQUILIBRIUM ***25 !*** (THEIR STANDARD VALUES ARE 1.0 AND 0.96, RESPECTIVELY) ***26 !*** (BETA MUST BE LESS THAN OR EQUAL TO 1) ***27 28 !*** DTCRIT IS THE CRITICAL BUOYANCY (K) USED TO ADJUST THE ***29 !*** APPROACH TO QUASI-EQUILIBRIUM ***30 !*** IT MUST BE LESS THAN 0 ***9 !------------------------------------------------------------ 10 !Set parameters for convectL for iflag_con = 3 11 !------------------------------------------------------------ 12 13 14 !*** PBCRIT IS THE CRITICAL CLOUD DEPTH (MB) BENEATH WHICH THE *** 15 !*** PRECIPITATION EFFICIENCY IS ASSUMED TO BE ZERO *** 16 !*** PTCRIT IS THE CLOUD DEPTH (MB) ABOVE WHICH THE PRECIP. *** 17 !*** EFFICIENCY IS ASSUMED TO BE UNITY *** 18 !*** SIGD IS THE FRACTIONAL AREA COVERED BY UNSATURATED DNDRAFT *** 19 !*** SPFAC IS THE FRACTION OF PRECIPITATION FALLING OUTSIDE *** 20 !*** OF CLOUD *** 21 22 ![TAU: CHARACTERISTIC TIMESCALE USED TO COMPUTE ALPHA & BETA] 23 !*** ALPHA AND BETA ARE PARAMETERS THAT CONTROL THE RATE OF *** 24 !*** APPROACH TO QUASI-EQUILIBRIUM *** 25 !*** (THEIR STANDARD VALUES ARE 1.0 AND 0.96, RESPECTIVELY) *** 26 !*** (BETA MUST BE LESS THAN OR EQUAL TO 1) *** 27 28 !*** DTCRIT IS THE CRITICAL BUOYANCY (K) USED TO ADJUST THE *** 29 !*** APPROACH TO QUASI-EQUILIBRIUM *** 30 !*** IT MUST BE LESS THAN 0 *** 31 31 32 32 include "cv3param.h" … … 41 41 42 42 LOGICAL, SAVE :: first = .TRUE. 43 44 45 !noff: integer limit for convection (nd-noff)46 47 48 43 !$OMP THREADPRIVATE(first) 44 45 !glb noff: integer limit for convection (nd-noff) 46 ! minorig: First level of convection 47 48 ! -- limit levels for convection: 49 49 50 50 noff = 1 … … 56 56 IF (first) THEN 57 57 58 ! -- "microphysical" parameters: 58 !$OMP MASTER 59 ! -- "microphysical" parameters: 59 60 sigdz = 0.01 60 61 spfac = 0.15 61 62 pbcrit = 150.0 62 63 ptcrit = 500.0 63 64 ! IM beg: ajout fis. reglage ep 64 65 flag_epkeorig = 1 65 66 elcrit = 0.0003 66 67 tlcrit = -55.0 67 68 ! IM lu dans physiq.def via conf_phys.F90 epmax = 0.993 68 69 69 70 omtrain = 45.0 ! used also for snow (no disctinction rain/snow) 70 71 71 72 ! -- misc: 72 73 73 74 dtovsh = -0.2 ! dT for overshoot 74 75 dpbase = -40. ! definition cloud base (400m above LCL) 75 76 ! cc dttrig = 5. ! (loose) condition for triggering 76 77 dttrig = 10. ! (loose) condition for triggering 77 78 flag_wb = 1 78 79 wbmax = 6. ! (m/s) adiab updraught speed at LFC (used in cv3p1_closure) 79 80 80 81 ! -- rate of approach to quasi-equilibrium: 81 82 82 83 dtcrit = -2.0 83 84 tau = 8000. 84 85 85 86 ! -- interface cloud parameterization: 86 87 87 88 delta = 0.01 ! cld 88 89 89 90 ! -- interface with boundary-layer (gust factor): (sb) 90 91 91 92 betad = 10.0 ! original value (from convect 4.3) 92 93 93 OPEN (99, FILE='conv_param.data', STATUS='old', FORM='formatted', & 94 ERR=9999) 94 OPEN (99, FILE='conv_param.data', STATUS='old', FORM='formatted', ERR=9999) 95 95 READ (99, *, END=9998) dpbase 96 96 READ (99, *, END=9998) pbcrit … … 113 113 WRITE (*, *) 'wbmax =', wbmax 114 114 115 115 ! IM Lecture du fichier ep_param.data 116 116 OPEN (79, FILE='ep_param.data', STATUS='old', FORM='formatted', ERR=7999) 117 117 READ (79, *, END=7998) flag_epkeorig … … 124 124 WRITE (*, *) 'elcrit=', elcrit 125 125 WRITE (*, *) 'tlcrit=', tlcrit 126 126 ! IM end: ajout fis. reglage ep 127 127 128 128 first = .FALSE. 129 END IF 129 !$OMP END MASTER 130 131 END IF ! (first) 130 132 131 133 beta = 1.0 - delt/tau 132 134 alpha1 = 1.5E-3 133 ! jygCorrection bug alpha135 !JYG Correction bug alpha 134 136 alpha1 = alpha1*1.5 135 137 alpha = alpha1*delt/tau 136 ! jygBug137 138 138 !JYG Bug 139 ! cc increase alpha to compensate W decrease: 140 ! c alpha = alpha*1.5 139 141 140 142 RETURN 141 143 END SUBROUTINE cv3_param 142 144 143 SUBROUTINE cv3_prelim(len, nd, ndp1, t, q, p, ph, lv, lf, cpn, tv, gz, h, hm,&144 th)145 SUBROUTINE cv3_prelim(len, nd, ndp1, t, q, p, ph, & 146 lv, lf, cpn, tv, gz, h, hm, th) 145 147 IMPLICIT NONE 146 148 147 148 149 150 151 152 153 149 ! ===================================================================== 150 ! --- CALCULATE ARRAYS OF GEOPOTENTIAL, HEAT CAPACITY & STATIC ENERGY 151 ! "ori": from convect4.3 (vectorized) 152 ! "convect3": to be exactly consistent with convect3 153 ! ===================================================================== 154 155 ! inputs: 154 156 INTEGER len, nd, ndp1 155 157 REAL t(len, nd), q(len, nd), p(len, nd), ph(len, ndp1) 156 158 157 159 ! outputs: 158 160 REAL lv(len, nd), lf(len, nd), cpn(len, nd), tv(len, nd) 159 161 REAL gz(len, nd), h(len, nd), hm(len, nd) 160 162 REAL th(len, nd) 161 163 162 164 ! local variables: 163 165 INTEGER k, i 164 166 REAL rdcp … … 170 172 171 173 172 173 174 ! ori do 110 k=1,nlp 175 ! abderr do 110 k=1,nl ! convect3 174 176 DO k = 1, nlp 175 177 176 178 DO i = 1, len 177 179 ! debug lv(i,k)= lv0-clmcpv*(t(i,k)-t0) 178 180 lv(i, k) = lv0 - clmcpv*(t(i,k)-273.15) 179 181 lf(i, k) = lf0 - clmci*(t(i,k)-273.15) 180 182 cpn(i, k) = cpd*(1.0-q(i,k)) + cpv*q(i, k) 181 183 cpx(i, k) = cpd*(1.0-q(i,k)) + cl*q(i, k) 182 184 ! ori tv(i,k)=t(i,k)*(1.0+q(i,k)*epsim1) 183 185 tv(i, k) = t(i, k)*(1.0+q(i,k)/eps-q(i,k)) 184 186 rdcp = (rrd*(1.-q(i,k))+q(i,k)*rrv)/cpn(i, k) … … 187 189 END DO 188 190 189 191 ! gz = phi at the full levels (same as p). 190 192 191 193 DO i = 1, len 192 194 gz(i, 1) = 0.0 193 195 END DO 194 196 ! ori do 140 k=2,nlp 195 197 DO k = 2, nl ! convect3 196 198 DO i = 1, len 197 tvx = t(i, k)*(1.+q(i,k)/eps-q(i,k)) !convect3198 tvy = t(i, k-1)*(1.+q(i,k-1)/eps-q(i,k-1)) !convect3199 gz(i, k) = gz(i, k-1) + 0.5*rrd*(tvx+tvy) & !convect3200 *(p(i,k-1)-p(i,k))/ph(i, k)!convect3201 202 203 204 205 206 END DO 207 END DO 208 209 210 211 212 199 tvx = t(i, k)*(1.+q(i,k)/eps-q(i,k)) !convect3 200 tvy = t(i, k-1)*(1.+q(i,k-1)/eps-q(i,k-1)) !convect3 201 gz(i, k) = gz(i, k-1) + 0.5*rrd*(tvx+tvy)* & !convect3 202 (p(i,k-1)-p(i,k))/ph(i, k) !convect3 203 204 ! c print *,' gz(',k,')',gz(i,k),' tvx',tvx,' tvy ',tvy 205 206 ! ori gz(i,k)=gz(i,k-1)+hrd*(tv(i,k-1)+tv(i,k)) 207 ! ori & *(p(i,k-1)-p(i,k))/ph(i,k) 208 END DO 209 END DO 210 211 ! h = phi + cpT (dry static energy). 212 ! hm = phi + cp(T-Tbase)+Lq 213 214 ! ori do 170 k=1,nlp 213 215 DO k = 1, nl ! convect3 214 216 DO i = 1, len … … 221 223 END SUBROUTINE cv3_prelim 222 224 223 SUBROUTINE cv3_feed(len, nd, t, q, u, v, p, ph, hm, gz, p1feed, p2feed, wght, & 224 wghti, tnk, thnk, qnk, qsnk, unk, vnk, cpnk, hnk, nk, icb, icbmax, iflag, & 225 gznk, plcl) 225 SUBROUTINE cv3_feed(len, nd, ok_conserv_q, & 226 t, q, u, v, p, ph, hm, gz, & 227 p1feed, p2feed, wght, & 228 wghti, tnk, thnk, qnk, qsnk, unk, vnk, & 229 cpnk, hnk, nk, icb, icbmax, iflag, gznk, plcl) 226 230 IMPLICIT NONE 227 231 228 229 230 231 232 233 234 235 236 237 238 239 240 232 ! ================================================================ 233 ! Purpose: CONVECTIVE FEED 234 235 ! Main differences with cv_feed: 236 ! - ph added in input 237 ! - here, nk(i)=minorig 238 ! - icb defined differently (plcl compared with ph instead of p) 239 240 ! Main differences with convect3: 241 ! - we do not compute dplcldt and dplcldr of CLIFT anymore 242 ! - values iflag different (but tests identical) 243 ! - A,B explicitely defined (!...) 244 ! ================================================================ 241 245 242 246 include "cv3param.h" 243 247 include "cvthermo.h" 244 248 245 !inputs:249 !inputs: 246 250 INTEGER len, nd 251 LOGICAL ok_conserv_q 247 252 REAL t(len, nd), q(len, nd), p(len, nd) 248 253 REAL u(len, nd), v(len, nd) … … 250 255 REAL ph(len, nd+1) 251 256 REAL p1feed(len) 252 257 ! , wght(len) 253 258 REAL wght(nd) 254 !input-output259 !input-output 255 260 REAL p2feed(len) 256 !outputs:261 !outputs: 257 262 INTEGER iflag(len), nk(len), icb(len), icbmax 258 !real wghti(len)263 ! real wghti(len) 259 264 REAL wghti(len, nd) 260 265 REAL tnk(len), thnk(len), qnk(len), qsnk(len) … … 263 268 REAL plcl(len) 264 269 265 !local variables:270 !local variables: 266 271 INTEGER i, k, iter, niter 267 272 INTEGER ihmin(len) … … 269 274 REAL pup(len), plo(len), pfeed(len) 270 275 REAL plclup(len), plcllo(len), plclfeed(len) 276 REAL pfeedmin(len) 271 277 REAL posit(len) 272 278 LOGICAL nocond(len) 273 279 274 ! ------------------------------------------------------------------- 275 ! --- Origin level of ascending parcels for convect3: 276 ! ------------------------------------------------------------------- 280 !jyg20140217< 281 INTEGER iostat 282 LOGICAL, SAVE :: first 283 LOGICAL, SAVE :: ok_new_feed 284 REAL, SAVE :: dp_lcl_feed 285 !$OMP THREADPRIVATE (first,ok_new_feed,dp_lcl_feed) 286 DATA first/.TRUE./ 287 DATA dp_lcl_feed/2./ 288 289 IF (first) THEN 290 !$OMP MASTER 291 ok_new_feed = ok_conserv_q 292 OPEN (98, FILE='cv3feed_param.data', STATUS='old', FORM='formatted', IOSTAT=iostat) 293 IF (iostat==0) THEN 294 READ (98, *, END=998) ok_new_feed 295 998 CONTINUE 296 CLOSE (98) 297 END IF 298 PRINT *, ' ok_new_feed: ', ok_new_feed 299 first = .FALSE. 300 !$OMP END MASTER 301 END IF 302 !jyg> 303 ! ------------------------------------------------------------------- 304 ! --- Origin level of ascending parcels for convect3: 305 ! ------------------------------------------------------------------- 277 306 278 307 DO i = 1, len … … 281 310 END DO 282 311 283 284 285 286 287 288 289 290 291 292 ! 1.a- LCL associated top2feed312 ! ------------------------------------------------------------------- 313 ! --- Adjust feeding layer thickness so that lifting up to the top of 314 ! --- the feeding layer does not induce condensation (i.e. so that 315 ! --- plcl < p2feed). 316 ! --- Method : iterative secant method. 317 ! ------------------------------------------------------------------- 318 319 ! 1- First bracketing of the solution : ph(nk+1), p2feed 320 321 ! 1.a- LCL associated with p2feed 293 322 DO i = 1, len 294 323 pup(i) = p2feed(i) 295 324 END DO 296 CALL cv3_vertmix(len, nd, iflag, p1feed, pup, p, ph, t, q, u, v, wght, & 297 wghti, nk, tnk, thnk, qnk, qsnk, unk, vnk, plclup) 298 ! 1.b- LCL associated to ph(nk+1) 325 CALL cv3_vertmix(len, nd, iflag, p1feed, pup, p, ph, & 326 t, q, u, v, wght, & 327 wghti, nk, tnk, thnk, qnk, qsnk, unk, vnk, plclup) 328 ! 1.b- LCL associated with ph(nk+1) 299 329 DO i = 1, len 300 330 plo(i) = ph(i, nk(i)+1) 301 331 END DO 302 CALL cv3_vertmix(len, nd, iflag, p1feed, plo, p, ph, t, q, u, v, wght, & 303 wghti, nk, tnk, thnk, qnk, qsnk, unk, vnk, plcllo) 304 ! 2- Iterations 332 CALL cv3_vertmix(len, nd, iflag, p1feed, plo, p, ph, & 333 t, q, u, v, wght, & 334 wghti, nk, tnk, thnk, qnk, qsnk, unk, vnk, plcllo) 335 ! 2- Iterations 305 336 niter = 5 306 337 DO iter = 1, niter … … 314 345 pfeed(i) = pup(i) 315 346 ELSE 316 pfeed(i) = (pup(i)*(plo(i)-plcllo(i))+plo(i)*(plclup(i)-pup(i)))/ & 317 (plo(i)-plcllo(i)+plclup(i)-pup(i)) 347 !JYG20140217< 348 IF (ok_new_feed) THEN 349 pfeed(i) = (pup(i)*(plo(i)-plcllo(i)-dp_lcl_feed)+ & 350 plo(i)*(plclup(i)-pup(i)+dp_lcl_feed))/ & 351 (plo(i)-plcllo(i)+plclup(i)-pup(i)) 352 ELSE 353 pfeed(i) = (pup(i)*(plo(i)-plcllo(i))+ & 354 plo(i)*(plclup(i)-pup(i)))/ & 355 (plo(i)-plcllo(i)+plclup(i)-pup(i)) 356 END IF 357 !JYG> 318 358 END IF 319 359 END DO 320 CALL cv3_vertmix(len, nd, iflag, p1feed, pfeed, p, ph, t, q, u, v, wght, & 321 wghti, nk, tnk, thnk, qnk, qsnk, unk, vnk, plclfeed) 360 !jyg20140217< 361 ! For the last iteration, make sure that the top of the feeding layer 362 ! and LCL are not in the same layer: 363 IF (ok_new_feed) THEN 364 IF (iter==niter) THEN 365 DO k = minorig, nd 366 DO i = 1, len 367 IF (ph(i,k)>=plclfeed(i)) pfeedmin(i) = ph(i, k) 368 END DO 369 END DO 370 DO i = 1, len 371 pfeed(i) = max(pfeedmin(i), pfeed(i)) 372 END DO 373 END IF 374 END IF 375 !jyg> 376 377 CALL cv3_vertmix(len, nd, iflag, p1feed, pfeed, p, ph, & 378 t, q, u, v, wght, & 379 wghti, nk, tnk, thnk, qnk, qsnk, unk, vnk, plclfeed) 380 !jyg20140217< 381 IF (ok_new_feed) THEN 382 DO i = 1, len 383 posit(i) = (sign(1.,plclfeed(i)-pfeed(i)+dp_lcl_feed)+1.)*0.5 384 IF (plclfeed(i)-pfeed(i)+dp_lcl_feed==0.) posit(i) = 1. 385 END DO 386 ELSE 387 DO i = 1, len 388 posit(i) = (sign(1.,plclfeed(i)-pfeed(i))+1.)*0.5 389 IF (plclfeed(i)==pfeed(i)) posit(i) = 1. 390 END DO 391 END IF 392 !jyg> 322 393 DO i = 1, len 323 posit(i) = (sign(1.,plclfeed(i)-pfeed(i))+1.)*0.5 324 IF (plclfeed(i)==pfeed(i)) posit(i) = 1. 325 ! - posit = 1 when lcl is below top of feeding layer (plclfeed>pfeed) 326 ! - => pup=pfeed 327 ! - posit = 0 when lcl is above top of feeding layer (plclfeed<pfeed) 328 ! - => plo=pfeed 394 ! - posit = 1 when lcl is below top of feeding layer (plclfeed>pfeed) 395 ! - => pup=pfeed 396 ! - posit = 0 when lcl is above top of feeding layer (plclfeed<pfeed) 397 ! - => plo=pfeed 329 398 pup(i) = posit(i)*pfeed(i) + (1.-posit(i))*pup(i) 330 399 plo(i) = (1.-posit(i))*pfeed(i) + posit(i)*plo(i) … … 343 412 END DO 344 413 345 346 347 348 414 ! ------------------------------------------------------------------- 415 ! --- Check whether parcel level temperature and specific humidity 416 ! --- are reasonable 417 ! ------------------------------------------------------------------- 349 418 DO i = 1, len 350 419 IF (((tnk(i)<250.0) .OR. (qnk(i)<=0.0)) .AND. (iflag(i)==0)) iflag(i) = 7 351 420 END DO 352 421 353 354 355 356 357 !@ do 270 i=1,len358 !@ icb(i)=nlm359 !@ 270 continue360 !@c361 !@ do 290 k=minorig,nl362 !@ do 280 i=1,len363 !@ if((k.ge.(nk(i)+1)).and.(p(i,k).lt.plcl(i)))364 !@ & icb(i)=min(icb(i),k)365 !@ 280 continue366 !@ 290 continue367 !@c368 !@ do 300 i=1,len369 !@ if((icb(i).ge.nlm).and.(iflag(i).eq.0))iflag(i)=9370 !@ 300 continue422 ! ------------------------------------------------------------------- 423 ! --- Calculate first level above lcl (=icb) 424 ! ------------------------------------------------------------------- 425 426 !@ do 270 i=1,len 427 !@ icb(i)=nlm 428 !@ 270 continue 429 !@c 430 !@ do 290 k=minorig,nl 431 !@ do 280 i=1,len 432 !@ if((k.ge.(nk(i)+1)).and.(p(i,k).lt.plcl(i))) 433 !@ & icb(i)=min(icb(i),k) 434 !@ 280 continue 435 !@ 290 continue 436 !@c 437 !@ do 300 i=1,len 438 !@ if((icb(i).ge.nlm).and.(iflag(i).eq.0))iflag(i)=9 439 !@ 300 continue 371 440 372 441 DO i = 1, len … … 374 443 END DO 375 444 376 377 378 !@ do 290 k=minorig,nl445 ! la modification consiste a comparer plcl a ph et non a p: 446 ! icb est defini par : ph(icb)<plcl<ph(icb-1) 447 !@ do 290 k=minorig,nl 379 448 DO k = 3, nl - 1 ! modif pour que icb soit sup/egal a 2 380 449 DO i = 1, len … … 384 453 385 454 386 387 388 455 ! print*,'icb dans cv3_feed ' 456 ! write(*,'(64i2)') icb(2:len-1) 457 ! call dump2d(64,43,'plcl dans cv3_feed ',plcl(2:len-1)) 389 458 390 459 DO i = 1, len 391 !@ if((icb(i).ge.nlm).and.(iflag(i).eq.0))iflag(i)=9460 !@ if((icb(i).ge.nlm).and.(iflag(i).eq.0))iflag(i)=9 392 461 IF ((icb(i)==nlm) .AND. (iflag(i)==0)) iflag(i) = 9 393 462 END DO … … 397 466 END DO 398 467 399 468 ! Compute icbmax. 400 469 401 470 icbmax = 2 402 471 DO i = 1, len 403 !! icbmax=max(icbmax,icb(i))404 IF (iflag(i)<7) icbmax = max(icbmax, icb(i)) ! sb Jun7th02472 !! icbmax=max(icbmax,icb(i)) 473 IF (iflag(i)<7) icbmax = max(icbmax, icb(i)) ! sb Jun7th02 405 474 END DO 406 475 … … 409 478 410 479 SUBROUTINE cv3_undilute1(len, nd, t, qs, gz, plcl, p, icb, tnk, qnk, gznk, & 411 tp, tvp, clw, icbs)480 tp, tvp, clw, icbs) 412 481 IMPLICIT NONE 413 482 414 415 416 417 418 !- specify plcl in input419 !- icbs is the first level above LCL (may differ from icb)420 !- in the iterations, used x(icbs) instead x(icb)421 !- many minor differences in the iterations422 !- tvp is computed in only one time423 !- icbs: first level above Plcl (IMIN de TLIFT) in output424 !- if icbs=icb, compute also tp(icb+1),tvp(icb+1) & clw(icb+1)425 483 ! ---------------------------------------------------------------- 484 ! Equivalent de TLIFT entre NK et ICB+1 inclus 485 486 ! Differences with convect4: 487 ! - specify plcl in input 488 ! - icbs is the first level above LCL (may differ from icb) 489 ! - in the iterations, used x(icbs) instead x(icb) 490 ! - many minor differences in the iterations 491 ! - tvp is computed in only one time 492 ! - icbs: first level above Plcl (IMIN de TLIFT) in output 493 ! - if icbs=icb, compute also tp(icb+1),tvp(icb+1) & clw(icb+1) 494 ! ---------------------------------------------------------------- 426 495 427 496 include "cvthermo.h" 428 497 include "cv3param.h" 429 498 430 499 ! inputs: 431 500 INTEGER len, nd 432 501 INTEGER icb(len) … … 436 505 REAL plcl(len) ! convect3 437 506 438 507 ! outputs: 439 508 REAL tp(len, nd), tvp(len, nd), clw(len, nd) 440 509 441 510 ! local variables: 442 511 INTEGER i, k 443 512 INTEGER icb1(len), icbs(len), icbsmax2 ! convect3 … … 448 517 REAL cpinv(len) ! convect3 449 518 450 451 452 453 454 !cp*tp+L*qp+phi=cp*tnk+L*qnk+gznk.455 456 457 458 519 ! ------------------------------------------------------------------- 520 ! --- Calculates the lifted parcel virtual temperature at nk, 521 ! --- the actual temperature, and the adiabatic 522 ! --- liquid water content. The procedure is to solve the equation. 523 ! cp*tp+L*qp+phi=cp*tnk+L*qnk+gznk. 524 ! ------------------------------------------------------------------- 525 526 527 ! *** Calculate certain parcel quantities, including static energy *** 459 528 460 529 DO i = 1, len 461 ah0(i) = (cpd*(1.-qnk(i))+cl*qnk(i))*tnk(i) + qnk(i)*(lv0-clmcpv*(tnk(i)- & 462 273.15)) + gznk(i) 530 ah0(i) = (cpd*(1.-qnk(i))+cl*qnk(i))*tnk(i) + qnk(i)*(lv0-clmcpv*(tnk(i)-273.15)) + gznk(i) 463 531 cpp(i) = cpd*(1.-qnk(i)) + qnk(i)*cpv 464 532 cpinv(i) = 1./cpp(i) 465 533 END DO 466 534 467 ! *** Calculate lifted parcel quantities below cloud base *** 535 ! *** Calculate lifted parcel quantities below cloud base *** 536 537 DO i = 1, len !convect3 538 icb1(i) = max(icb(i), 2) !convect3 539 icb1(i) = min(icb(i), nl) !convect3 540 ! if icb is below LCL, start loop at ICB+1: 541 ! (icbs est le premier niveau au-dessus du LCL) 542 icbs(i) = icb1(i) !convect3 543 IF (plcl(i)<p(i,icb1(i))) THEN 544 icbs(i) = min(icbs(i)+1, nl) !convect3 545 END IF 546 END DO !convect3 468 547 469 548 DO i = 1, len !convect3 470 icb1(i) = max(icb(i), 2) !convect3 471 icb1(i) = min(icb(i), nl) !convect3 472 ! if icb is below LCL, start loop at ICB+1: 473 ! (icbs est le premier niveau au-dessus du LCL) 474 icbs(i) = icb1(i) !convect3 475 IF (plcl(i)<p(i,icb1(i))) THEN 476 icbs(i) = min(icbs(i)+1, nl) !convect3 477 END IF 549 ticb(i) = t(i, icbs(i)) !convect3 550 gzicb(i) = gz(i, icbs(i)) !convect3 551 qsicb(i) = qs(i, icbs(i)) !convect3 478 552 END DO !convect3 479 553 480 DO i = 1, len !convect3 481 ticb(i) = t(i, icbs(i)) !convect3 482 gzicb(i) = gz(i, icbs(i)) !convect3 483 qsicb(i) = qs(i, icbs(i)) !convect3 484 END DO !convect3 485 486 487 ! Re-compute icbsmax (icbsmax2): !convect3 488 ! !convect3 489 icbsmax2 = 2 !convect3 490 DO i = 1, len !convect3 491 icbsmax2 = max(icbsmax2, icbs(i)) !convect3 492 END DO !convect3 493 494 ! initialization outputs: 495 496 DO k = 1, icbsmax2 ! convect3 497 DO i = 1, len ! convect3 498 tp(i, k) = 0.0 ! convect3 499 tvp(i, k) = 0.0 ! convect3 500 clw(i, k) = 0.0 ! convect3 501 END DO ! convect3 502 END DO ! convect3 503 504 ! tp and tvp below cloud base: 554 555 ! Re-compute icbsmax (icbsmax2): !convect3 556 ! !convect3 557 icbsmax2 = 2 !convect3 558 DO i = 1, len !convect3 559 icbsmax2 = max(icbsmax2, icbs(i)) !convect3 560 END DO !convect3 561 562 ! initialization outputs: 563 564 DO k = 1, icbsmax2 ! convect3 565 DO i = 1, len ! convect3 566 tp(i, k) = 0.0 ! convect3 567 tvp(i, k) = 0.0 ! convect3 568 clw(i, k) = 0.0 ! convect3 569 END DO ! convect3 570 END DO ! convect3 571 572 ! tp and tvp below cloud base: 505 573 506 574 DO k = minorig, icbsmax2 - 1 507 575 DO i = 1, len 508 576 tp(i, k) = tnk(i) - (gz(i,k)-gznk(i))*cpinv(i) 509 tvp(i, k) = tp(i, k)*(1.+qnk(i)/eps-qnk(i)) !whole thing (convect3)510 END DO 511 END DO 512 513 577 tvp(i, k) = tp(i, k)*(1.+qnk(i)/eps-qnk(i)) !whole thing (convect3) 578 END DO 579 END DO 580 581 ! *** Find lifted parcel quantities above cloud base *** 514 582 515 583 DO i = 1, len 516 584 tg = ticb(i) 517 585 ! ori qg=qs(i,icb(i)) 518 586 qg = qsicb(i) ! convect3 519 587 ! debug alv=lv0-clmcpv*(ticb(i)-t0) 520 588 alv = lv0 - clmcpv*(ticb(i)-273.15) 521 589 522 523 524 525 s = cpd*(1.-qnk(i)) + cl*qnk(i) &! convect3526 +alv*alv*qg/(rrv*ticb(i)*ticb(i))! convect3590 ! First iteration. 591 592 ! ori s=cpd+alv*alv*qg/(rrv*ticb(i)*ticb(i)) 593 s = cpd*(1.-qnk(i)) + cl*qnk(i) + & ! convect3 594 alv*alv*qg/(rrv*ticb(i)*ticb(i)) ! convect3 527 595 s = 1./s 528 596 ! ori ahg=cpd*tg+(cl-cpd)*qnk(i)*ticb(i)+alv*qg+gzicb(i) 529 597 ahg = cpd*tg + (cl-cpd)*qnk(i)*tg + alv*qg + gzicb(i) ! convect3 530 598 tg = tg + s*(ah0(i)-ahg) 531 532 599 ! ori tg=max(tg,35.0) 600 ! debug tc=tg-t0 533 601 tc = tg - 273.15 534 602 denom = 243.5 + tc 535 603 denom = max(denom, 1.0) ! convect3 536 604 ! ori if(tc.ge.0.0)then 537 605 es = 6.112*exp(17.67*tc/denom) 538 539 540 541 606 ! ori else 607 ! ori es=exp(23.33086-6111.72784/tg+0.15215*log(tg)) 608 ! ori endif 609 ! ori qg=eps*es/(p(i,icb(i))-es*(1.-eps)) 542 610 qg = eps*es/(p(i,icbs(i))-es*(1.-eps)) 543 611 544 545 546 547 548 549 612 ! Second iteration. 613 614 615 ! ori s=cpd+alv*alv*qg/(rrv*ticb(i)*ticb(i)) 616 ! ori s=1./s 617 ! ori ahg=cpd*tg+(cl-cpd)*qnk(i)*ticb(i)+alv*qg+gzicb(i) 550 618 ahg = cpd*tg + (cl-cpd)*qnk(i)*tg + alv*qg + gzicb(i) ! convect3 551 619 tg = tg + s*(ah0(i)-ahg) 552 553 620 ! ori tg=max(tg,35.0) 621 ! debug tc=tg-t0 554 622 tc = tg - 273.15 555 623 denom = 243.5 + tc 556 denom = max(denom, 1.0) ! convect3557 624 denom = max(denom, 1.0) ! convect3 625 ! ori if(tc.ge.0.0)then 558 626 es = 6.112*exp(17.67*tc/denom) 559 560 561 562 627 ! ori else 628 ! ori es=exp(23.33086-6111.72784/tg+0.15215*log(tg)) 629 ! ori end if 630 ! ori qg=eps*es/(p(i,icb(i))-es*(1.-eps)) 563 631 qg = eps*es/(p(i,icbs(i))-es*(1.-eps)) 564 632 565 633 alv = lv0 - clmcpv*(ticb(i)-273.15) 566 634 567 568 569 570 571 635 ! ori c approximation here: 636 ! ori tp(i,icb(i))=(ah0(i)-(cl-cpd)*qnk(i)*ticb(i) 637 ! ori & -gz(i,icb(i))-alv*qg)/cpd 638 639 ! convect3: no approximation: 572 640 tp(i, icbs(i)) = (ah0(i)-gz(i,icbs(i))-alv*qg)/(cpd+(cl-cpd)*qnk(i)) 573 641 574 575 642 ! ori clw(i,icb(i))=qnk(i)-qg 643 ! ori clw(i,icb(i))=max(0.0,clw(i,icb(i))) 576 644 clw(i, icbs(i)) = qnk(i) - qg 577 645 clw(i, icbs(i)) = max(0.0, clw(i,icbs(i))) 578 646 579 647 rg = qg/(1.-qnk(i)) 580 581 582 tvp(i, icbs(i)) = tp(i, icbs(i))*(1.+qg/eps-qnk(i)) !whole thing583 584 END DO 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 648 ! ori tvp(i,icb(i))=tp(i,icb(i))*(1.+rg*epsi) 649 ! convect3: (qg utilise au lieu du vrai mixing ratio rg) 650 tvp(i, icbs(i)) = tp(i, icbs(i))*(1.+qg/eps-qnk(i)) !whole thing 651 652 END DO 653 654 ! ori do 380 k=minorig,icbsmax2 655 ! ori do 370 i=1,len 656 ! ori tvp(i,k)=tvp(i,k)-tp(i,k)*qnk(i) 657 ! ori 370 continue 658 ! ori 380 continue 659 660 661 ! -- The following is only for convect3: 662 663 ! * icbs is the first level above the LCL: 664 ! if plcl<p(icb), then icbs=icb+1 665 ! if plcl>p(icb), then icbs=icb 666 667 ! * the routine above computes tvp from minorig to icbs (included). 668 669 ! * to compute buoybase (in cv3_trigger.F), both tvp(icb) and tvp(icb+1) 670 ! must be known. This is the case if icbs=icb+1, but not if icbs=icb. 671 672 ! * therefore, in the case icbs=icb, we compute tvp at level icb+1 673 ! (tvp at other levels will be computed in cv3_undilute2.F) 606 674 607 675 … … 615 683 tg = ticb(i) 616 684 qg = qsicb(i) ! convect3 617 685 ! debug alv=lv0-clmcpv*(ticb(i)-t0) 618 686 alv = lv0 - clmcpv*(ticb(i)-273.15) 619 687 620 621 622 623 s = cpd*(1.-qnk(i)) + cl*qnk(i) & ! convect3624 +alv*alv*qg/(rrv*ticb(i)*ticb(i)) ! convect3688 ! First iteration. 689 690 ! ori s=cpd+alv*alv*qg/(rrv*ticb(i)*ticb(i)) 691 s = cpd*(1.-qnk(i)) + cl*qnk(i) & ! convect3 692 +alv*alv*qg/(rrv*ticb(i)*ticb(i)) ! convect3 625 693 s = 1./s 626 627 ahg = cpd*tg + (cl-cpd)*qnk(i)*tg + alv*qg + gzicb(i) ! convect3694 ! ori ahg=cpd*tg+(cl-cpd)*qnk(i)*ticb(i)+alv*qg+gzicb(i) 695 ahg = cpd*tg + (cl-cpd)*qnk(i)*tg + alv*qg + gzicb(i) ! convect3 628 696 tg = tg + s*(ah0(i)-ahg) 629 630 697 ! ori tg=max(tg,35.0) 698 ! debug tc=tg-t0 631 699 tc = tg - 273.15 632 700 denom = 243.5 + tc 633 denom = max(denom, 1.0) ! convect3634 701 denom = max(denom, 1.0) ! convect3 702 ! ori if(tc.ge.0.0)then 635 703 es = 6.112*exp(17.67*tc/denom) 636 637 638 639 704 ! ori else 705 ! ori es=exp(23.33086-6111.72784/tg+0.15215*log(tg)) 706 ! ori endif 707 ! ori qg=eps*es/(p(i,icb(i))-es*(1.-eps)) 640 708 qg = eps*es/(p(i,icb(i)+1)-es*(1.-eps)) 641 709 642 643 644 645 646 647 648 ahg = cpd*tg + (cl-cpd)*qnk(i)*tg + alv*qg + gzicb(i) ! convect3710 ! Second iteration. 711 712 713 ! ori s=cpd+alv*alv*qg/(rrv*ticb(i)*ticb(i)) 714 ! ori s=1./s 715 ! ori ahg=cpd*tg+(cl-cpd)*qnk(i)*ticb(i)+alv*qg+gzicb(i) 716 ahg = cpd*tg + (cl-cpd)*qnk(i)*tg + alv*qg + gzicb(i) ! convect3 649 717 tg = tg + s*(ah0(i)-ahg) 650 651 718 ! ori tg=max(tg,35.0) 719 ! debug tc=tg-t0 652 720 tc = tg - 273.15 653 721 denom = 243.5 + tc 654 denom = max(denom, 1.0) ! convect3655 722 denom = max(denom, 1.0) ! convect3 723 ! ori if(tc.ge.0.0)then 656 724 es = 6.112*exp(17.67*tc/denom) 657 658 659 660 725 ! ori else 726 ! ori es=exp(23.33086-6111.72784/tg+0.15215*log(tg)) 727 ! ori end if 728 ! ori qg=eps*es/(p(i,icb(i))-es*(1.-eps)) 661 729 qg = eps*es/(p(i,icb(i)+1)-es*(1.-eps)) 662 730 663 731 alv = lv0 - clmcpv*(ticb(i)-273.15) 664 732 665 666 667 668 669 733 ! ori c approximation here: 734 ! ori tp(i,icb(i))=(ah0(i)-(cl-cpd)*qnk(i)*ticb(i) 735 ! ori & -gz(i,icb(i))-alv*qg)/cpd 736 737 ! convect3: no approximation: 670 738 tp(i, icb(i)+1) = (ah0(i)-gz(i,icb(i)+1)-alv*qg)/(cpd+(cl-cpd)*qnk(i)) 671 739 672 673 740 ! ori clw(i,icb(i))=qnk(i)-qg 741 ! ori clw(i,icb(i))=max(0.0,clw(i,icb(i))) 674 742 clw(i, icb(i)+1) = qnk(i) - qg 675 743 clw(i, icb(i)+1) = max(0.0, clw(i,icb(i)+1)) 676 744 677 745 rg = qg/(1.-qnk(i)) 678 679 680 tvp(i, icb(i)+1) = tp(i, icb(i)+1)*(1.+qg/eps-qnk(i)) !whole thing746 ! ori tvp(i,icb(i))=tp(i,icb(i))*(1.+rg*epsi) 747 ! convect3: (qg utilise au lieu du vrai mixing ratio rg) 748 tvp(i, icb(i)+1) = tp(i, icb(i)+1)*(1.+qg/eps-qnk(i)) !whole thing 681 749 682 750 END DO … … 685 753 END SUBROUTINE cv3_undilute1 686 754 687 SUBROUTINE cv3_trigger(len, nd, icb, plcl, p, th, tv, tvp, thnk, pbase,&688 buoybase, iflag, sig, w0)755 SUBROUTINE cv3_trigger(len, nd, icb, plcl, p, th, tv, tvp, thnk, & 756 pbase, buoybase, iflag, sig, w0) 689 757 IMPLICIT NONE 690 758 691 692 693 694 695 696 697 698 699 700 701 702 703 704 759 ! ------------------------------------------------------------------- 760 ! --- TRIGGERING 761 762 ! - computes the cloud base 763 ! - triggering (crude in this version) 764 ! - relaxation of sig and w0 when no convection 765 766 ! Caution1: if no convection, we set iflag=4 767 ! (it used to be 0 in convect3) 768 769 ! Caution2: at this stage, tvp (and thus buoy) are know up 770 ! through icb only! 771 ! -> the buoyancy below cloud base not (yet) set to the cloud base buoyancy 772 ! ------------------------------------------------------------------- 705 773 706 774 include "cv3param.h" 707 775 708 776 ! input: 709 777 INTEGER len, nd 710 778 INTEGER icb(len) … … 713 781 REAL thnk(len) 714 782 715 783 ! output: 716 784 REAL pbase(len), buoybase(len) 717 785 718 786 ! input AND output: 719 787 INTEGER iflag(len) 720 788 REAL sig(len, nd), w0(len, nd) 721 789 722 790 ! local variables: 723 791 INTEGER i, k 724 792 REAL tvpbase, tvbase, tdif, ath, ath1 725 793 726 794 727 795 ! *** set cloud base buoyancy at (plcl+dpbase) level buoyancy 728 796 729 797 DO i = 1, len 730 798 pbase(i) = plcl(i) + dpbase 731 tvpbase = tvp(i, icb(i))*(pbase(i)-p(i,icb(i)+1))/ & 732 (p(i,icb(i))-p(i,icb(i)+1)) + tvp(i, icb(i)+1)*(p(i,icb(i))-pbase(i))/( & 733 p(i,icb(i))-p(i,icb(i)+1)) 734 tvbase = tv(i, icb(i))*(pbase(i)-p(i,icb(i)+1))/ & 735 (p(i,icb(i))-p(i,icb(i)+1)) + tv(i, icb(i)+1)*(p(i,icb(i))-pbase(i))/(p & 736 (i,icb(i))-p(i,icb(i)+1)) 799 tvpbase = tvp(i, icb(i)) *(pbase(i)-p(i,icb(i)+1))/(p(i,icb(i))-p(i,icb(i)+1)) + & 800 tvp(i, icb(i)+1)*(p(i,icb(i))-pbase(i)) /(p(i,icb(i))-p(i,icb(i)+1)) 801 tvbase = tv(i, icb(i)) *(pbase(i)-p(i,icb(i)+1))/(p(i,icb(i))-p(i,icb(i)+1)) + & 802 tv(i, icb(i)+1)*(p(i,icb(i))-pbase(i)) /(p(i,icb(i))-p(i,icb(i)+1)) 737 803 buoybase(i) = tvpbase - tvbase 738 804 END DO 739 805 740 806 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 807 ! *** make sure that column is dry adiabatic between the surface *** 808 ! *** and cloud base, and that lifted air is positively buoyant *** 809 ! *** at cloud base *** 810 ! *** if not, return to calling program after resetting *** 811 ! *** sig(i) and w0(i) *** 812 813 814 ! oct3 do 200 i=1,len 815 ! oct3 816 ! oct3 tdif = buoybase(i) 817 ! oct3 ath1 = th(i,1) 818 ! oct3 ath = th(i,icb(i)-1) - dttrig 819 ! oct3 820 ! oct3 if (tdif.lt.dtcrit .or. ath.gt.ath1) then 821 ! oct3 do 60 k=1,nl 822 ! oct3 sig(i,k) = beta*sig(i,k) - 2.*alpha*tdif*tdif 823 ! oct3 sig(i,k) = AMAX1(sig(i,k),0.0) 824 ! oct3 w0(i,k) = beta*w0(i,k) 825 ! oct3 60 continue 826 ! oct3 iflag(i)=4 ! pour version vectorisee 827 ! oct3c convect3 iflag(i)=0 828 ! oct3cccc return 829 ! oct3 endif 830 ! oct3 831 ! oct3200 continue 832 833 ! -- oct3: on reecrit la boucle 200 (pour la vectorisation) 768 834 769 835 DO k = 1, nl … … 779 845 w0(i, k) = beta*w0(i, k) 780 846 iflag(i) = 4 ! pour version vectorisee 781 847 ! convect3 iflag(i)=0 782 848 END IF 783 849 … … 785 851 END DO 786 852 787 853 ! fin oct3 -- 788 854 789 855 RETURN 790 856 END SUBROUTINE cv3_trigger 791 857 792 SUBROUTINE cv3_compress(len, nloc, ncum, nd, ntra, iflag1, nk1, icb1, icbs1, & 793 plcl1, tnk1, qnk1, gznk1, pbase1, buoybase1, t1, q1, qs1, u1, v1, gz1, & 794 th1, tra1, h1, lv1, cpn1, p1, ph1, tv1, tp1, tvp1, clw1, sig1, w01, & 795 iflag, nk, icb, icbs, plcl, tnk, qnk, gznk, pbase, buoybase, t, q, qs, u, & 796 v, gz, th, tra, h, lv, cpn, p, ph, tv, tp, tvp, clw, sig, w0) 858 SUBROUTINE cv3_compress(len, nloc, ncum, nd, ntra, & 859 iflag1, nk1, icb1, icbs1, & 860 plcl1, tnk1, qnk1, gznk1, pbase1, buoybase1, & 861 t1, q1, qs1, u1, v1, gz1, th1, & 862 tra1, & 863 h1, lv1, cpn1, p1, ph1, tv1, tp1, tvp1, clw1, & 864 sig1, w01, & 865 iflag, nk, icb, icbs, & 866 plcl, tnk, qnk, gznk, pbase, buoybase, & 867 t, q, qs, u, v, gz, th, & 868 tra, & 869 h, lv, cpn, p, ph, tv, tp, tvp, clw, & 870 sig, w0) 797 871 IMPLICIT NONE 798 872 … … 800 874 include 'iniprint.h' 801 875 802 !inputs:876 !inputs: 803 877 INTEGER len, ncum, nd, ntra, nloc 804 878 INTEGER iflag1(len), nk1(len), icb1(len), icbs1(len) … … 813 887 REAL tra1(len, nd, ntra) 814 888 815 !outputs:816 889 !outputs: 890 ! en fait, on a nloc=len pour l'instant (cf cv_driver) 817 891 INTEGER iflag(nloc), nk(nloc), icb(nloc), icbs(nloc) 818 892 REAL plcl(nloc), tnk(nloc), qnk(nloc), gznk(nloc) … … 826 900 REAL tra(nloc, nd, ntra) 827 901 828 !local variables:902 !local variables: 829 903 INTEGER i, k, nn, j 830 904 … … 859 933 END DO 860 934 861 !AC! do 121 j=1,ntra862 !AC!ccccc do 111 k=1,nl+1863 !AC! do 111 k=1,nd864 !AC! nn=0865 !AC! do 101 i=1,len866 !AC! if(iflag1(i).eq.0)then867 !AC! nn=nn+1868 !AC! tra(nn,k,j)=tra1(i,k,j)869 !AC! endif870 !AC! 101 continue871 !AC! 111 continue872 !AC! 121 continue935 !AC! do 121 j=1,ntra 936 !AC!ccccc do 111 k=1,nl+1 937 !AC! do 111 k=1,nd 938 !AC! nn=0 939 !AC! do 101 i=1,len 940 !AC! if(iflag1(i).eq.0)then 941 !AC! nn=nn+1 942 !AC! tra(nn,k,j)=tra1(i,k,j) 943 !AC! endif 944 !AC! 101 continue 945 !AC! 111 continue 946 !AC! 121 continue 873 947 874 948 IF (nn/=ncum) THEN … … 902 976 903 977 904 !JAM--------------------------------------------------------------------905 906 978 !JAM-------------------------------------------------------------------- 979 ! Calcul de la quantité d'eau sous forme de glace 980 ! -------------------------------------------------------------------- 907 981 REAL qi(len, nl) 908 982 REAL t(len, nl), clw(len, nl) … … 922 996 END IF 923 997 END IF 924 998 ! print*,t(i,k),qi(i,k),'temp,testglace' 925 999 END DO 926 1000 END DO … … 930 1004 END SUBROUTINE icefrac 931 1005 932 SUBROUTINE cv3_undilute2(nloc, ncum, nd, icb, icbs, nk, tnk, qnk, gznk, hnk, & 933 t, q, qs, gz, p, h, tv, lv, lf, pbase, buoybase, plcl, inb, tp, tvp, clw, & 934 hp, ep, sigp, buoy, frac) 1006 SUBROUTINE cv3_undilute2(nloc, ncum, nd, icb, icbs, nk, & 1007 tnk, qnk, gznk, hnk, t, q, qs, gz, & 1008 p, h, tv, lv, lf, pbase, buoybase, plcl, & 1009 inb, tp, tvp, clw, hp, ep, sigp, buoy, frac) 935 1010 IMPLICIT NONE 936 1011 937 938 939 940 941 942 943 944 945 946 947 !- icbs (input) is the first level above LCL (may differ from icb)948 !- many minor differences in the iterations949 !- condensed water not removed from tvp in convect3950 !- vertical profile of buoyancy computed here (use of buoybase)951 !- the determination of inb is different952 !- no inb1, only inb in output953 1012 ! --------------------------------------------------------------------- 1013 ! Purpose: 1014 ! FIND THE REST OF THE LIFTED PARCEL TEMPERATURES 1015 ! & 1016 ! COMPUTE THE PRECIPITATION EFFICIENCIES AND THE 1017 ! FRACTION OF PRECIPITATION FALLING OUTSIDE OF CLOUD 1018 ! & 1019 ! FIND THE LEVEL OF NEUTRAL BUOYANCY 1020 1021 ! Main differences convect3/convect4: 1022 ! - icbs (input) is the first level above LCL (may differ from icb) 1023 ! - many minor differences in the iterations 1024 ! - condensed water not removed from tvp in convect3 1025 ! - vertical profile of buoyancy computed here (use of buoybase) 1026 ! - the determination of inb is different 1027 ! - no inb1, only inb in output 1028 ! --------------------------------------------------------------------- 954 1029 955 1030 include "cvthermo.h" … … 958 1033 include "cvflag.h" 959 1034 960 !inputs:1035 !inputs: 961 1036 INTEGER ncum, nd, nloc, j 962 1037 INTEGER icb(nloc), icbs(nloc), nk(nloc) … … 968 1043 REAL pbase(nloc), buoybase(nloc), plcl(nloc) 969 1044 970 !outputs:1045 !outputs: 971 1046 INTEGER inb(nloc) 972 1047 REAL tp(nloc, nd), tvp(nloc, nd), clw(nloc, nd) … … 974 1049 REAL buoy(nloc, nd) 975 1050 976 !local variables:1051 !local variables: 977 1052 INTEGER i, k 978 1053 REAL tg, qg, ahg, alv, alf, s, tc, es, esi, denom, rg, tca, elacrit … … 986 1061 REAL fracg 987 1062 988 989 990 1063 ! ===================================================================== 1064 ! --- SOME INITIALIZATIONS 1065 ! ===================================================================== 991 1066 992 1067 DO k = 1, nl … … 998 1073 END DO 999 1074 1000 1001 1002 1003 1004 1005 !cp*tp+L*qp+phi=cp*tnk+L*qnk+gznk.1006 1007 1075 ! ===================================================================== 1076 ! --- FIND THE REST OF THE LIFTED PARCEL TEMPERATURES 1077 ! ===================================================================== 1078 1079 ! --- The procedure is to solve the equation. 1080 ! cp*tp+L*qp+phi=cp*tnk+L*qnk+gznk. 1081 1082 ! *** Calculate certain parcel quantities, including static energy *** 1008 1083 1009 1084 1010 1085 DO i = 1, ncum 1011 ah0(i) = (cpd*(1.-qnk(i))+cl*qnk(i))*tnk(i) & ! debug &1012 ! +qnk(i)*(lv0-clmcpv*(tnk(i)-t0))+gznk(i)1013 +qnk(i)*(lv0-clmcpv*(tnk(i)-273.15)) + gznk(i)1014 END DO 1015 1016 1017 1086 ah0(i) = (cpd*(1.-qnk(i))+cl*qnk(i))*tnk(i)+ & 1087 ! debug qnk(i)*(lv0-clmcpv*(tnk(i)-t0))+gznk(i) 1088 qnk(i)*(lv0-clmcpv*(tnk(i)-273.15)) + gznk(i) 1089 END DO 1090 1091 1092 ! *** Find lifted parcel quantities above cloud base *** 1018 1093 1019 1094 1020 1095 DO k = minorig + 1, nl 1021 1096 DO i = 1, ncum 1022 1023 IF (k>=(icbs(i)+1)) THEN ! convect31097 ! ori if(k.ge.(icb(i)+1))then 1098 IF (k>=(icbs(i)+1)) THEN ! convect3 1024 1099 tg = t(i, k) 1025 1100 qg = qs(i, k) 1026 1101 ! debug alv=lv0-clmcpv*(t(i,k)-t0) 1027 1102 alv = lv0 - clmcpv*(t(i,k)-273.15) 1028 1103 1029 1030 1031 1032 s = cpd*(1.-qnk(i)) + cl*qnk(i) &! convect31033 +alv*alv*qg/(rrv*t(i,k)*t(i,k))! convect31104 ! First iteration. 1105 1106 ! ori s=cpd+alv*alv*qg/(rrv*t(i,k)*t(i,k)) 1107 s = cpd*(1.-qnk(i)) + cl*qnk(i) + & ! convect3 1108 alv*alv*qg/(rrv*t(i,k)*t(i,k)) ! convect3 1034 1109 s = 1./s 1035 1110 ! ori ahg=cpd*tg+(cl-cpd)*qnk(i)*t(i,k)+alv*qg+gz(i,k) 1036 1111 ahg = cpd*tg + (cl-cpd)*qnk(i)*tg + alv*qg + gz(i, k) ! convect3 1037 1112 tg = tg + s*(ah0(i)-ahg) 1038 1039 1113 ! ori tg=max(tg,35.0) 1114 ! debug tc=tg-t0 1040 1115 tc = tg - 273.15 1041 1116 denom = 243.5 + tc 1042 denom = max(denom, 1.0) ! convect31043 1117 denom = max(denom, 1.0) ! convect3 1118 ! ori if(tc.ge.0.0)then 1044 1119 es = 6.112*exp(17.67*tc/denom) 1045 1046 1047 1120 ! ori else 1121 ! ori es=exp(23.33086-6111.72784/tg+0.15215*log(tg)) 1122 ! ori endif 1048 1123 qg = eps*es/(p(i,k)-es*(1.-eps)) 1049 1124 1050 1051 1052 1053 1054 1125 ! Second iteration. 1126 1127 ! ori s=cpd+alv*alv*qg/(rrv*t(i,k)*t(i,k)) 1128 ! ori s=1./s 1129 ! ori ahg=cpd*tg+(cl-cpd)*qnk(i)*t(i,k)+alv*qg+gz(i,k) 1055 1130 ahg = cpd*tg + (cl-cpd)*qnk(i)*tg + alv*qg + gz(i, k) ! convect3 1056 1131 tg = tg + s*(ah0(i)-ahg) 1057 1058 1132 ! ori tg=max(tg,35.0) 1133 ! debug tc=tg-t0 1059 1134 tc = tg - 273.15 1060 1135 denom = 243.5 + tc 1061 denom = max(denom, 1.0) ! convect31062 1136 denom = max(denom, 1.0) ! convect3 1137 ! ori if(tc.ge.0.0)then 1063 1138 es = 6.112*exp(17.67*tc/denom) 1064 1065 1066 1139 ! ori else 1140 ! ori es=exp(23.33086-6111.72784/tg+0.15215*log(tg)) 1141 ! ori endif 1067 1142 qg = eps*es/(p(i,k)-es*(1.-eps)) 1068 1143 1069 1144 ! debug alv=lv0-clmcpv*(t(i,k)-t0) 1070 1145 alv = lv0 - clmcpv*(t(i,k)-273.15) 1071 ! print*,'cpd dans convect2 ',cpd 1072 ! print*,'tp(i,k),ah0(i),cl,cpd,qnk(i),t(i,k),gz(i,k),alv,qg,cpd' 1073 ! print*,tp(i,k),ah0(i),cl,cpd,qnk(i),t(i,k),gz(i,k),alv,qg,cpd 1074 1075 ! ori c approximation here: 1076 ! ori 1077 ! tp(i,k)=(ah0(i)-(cl-cpd)*qnk(i)*t(i,k)-gz(i,k)-alv*qg)/cpd 1078 1079 ! convect3: no approximation: 1146 ! print*,'cpd dans convect2 ',cpd 1147 ! print*,'tp(i,k),ah0(i),cl,cpd,qnk(i),t(i,k),gz(i,k),alv,qg,cpd' 1148 ! print*,tp(i,k),ah0(i),cl,cpd,qnk(i),t(i,k),gz(i,k),alv,qg,cpd 1149 1150 ! ori c approximation here: 1151 ! ori tp(i,k)=(ah0(i)-(cl-cpd)*qnk(i)*t(i,k)-gz(i,k)-alv*qg)/cpd 1152 1153 ! convect3: no approximation: 1080 1154 IF (cvflag_ice) THEN 1081 1155 tp(i, k) = max(0., (ah0(i)-gz(i,k)-alv*qg)/(cpd+(cl-cpd)*qnk(i))) … … 1087 1161 clw(i, k) = max(0.0, clw(i,k)) 1088 1162 rg = qg/(1.-qnk(i)) 1089 1090 1163 ! ori tvp(i,k)=tp(i,k)*(1.+rg*epsi) 1164 ! convect3: (qg utilise au lieu du vrai mixing ratio rg): 1091 1165 tvp(i, k) = tp(i, k)*(1.+qg/eps-qnk(i)) ! whole thing 1092 1166 IF (cvflag_ice) THEN … … 1099 1173 1100 1174 IF (cvflag_ice) THEN 1101 !CR:attention boucle en klon dans Icefrac1102 1175 !CR:attention boucle en klon dans Icefrac 1176 ! Call Icefrac(t,clw,qi,nl,nloc) 1103 1177 IF (t(i,k)>263.15) THEN 1104 1178 qi(i, k) = 0. … … 1111 1185 END IF 1112 1186 END IF 1113 !CR: fin test1187 !CR: fin test 1114 1188 IF (t(i,k)<263.15) THEN 1115 !CR: on commente les calculs d'Arnaud car division par zero1116 1117 !alv=lv0-clmcpv*(t(i,k)-273.15)1118 !alf=lf0-clmci*(t(i,k)-273.15)1119 !tg=tp(i,k)1120 !tc=tp(i,k)-273.151121 !denom=243.5+tc1122 !do j=1,31123 1124 1125 1126 !tbis=t(i,k)+(tp(i,k)-tg)1127 ! esi=exp(23.33086-(6111.72784/tbis) 1128 ! : +0.15215*log(tbis))1129 !qsat_new=eps*esi/(p(i,k)-esi*(1.-eps))1130 ! snew=cpd*(1.-qnk(i))+cl*qnk(i)+alv*alv*qsat_new/ 1131 ! :(rrv*tbis*tbis)1132 !snew=1./snew1133 !print*,esi,qsat_new,snew,'esi,qsat,snew'1134 !tp(i,k)=tg+(alf*qi(i,k)+alv*qg*(1.-(esi/es)))*snew1135 !print*,k,tp(i,k),qnk(i),'avec glace'1136 !print*,'tpNAN',tg,alf,qi(i,k),alv,qg,esi,es,snew1137 !enddo1189 !CR: on commente les calculs d'Arnaud car division par zero 1190 ! nouveau calcul propose par JYG 1191 ! alv=lv0-clmcpv*(t(i,k)-273.15) 1192 ! alf=lf0-clmci*(t(i,k)-273.15) 1193 ! tg=tp(i,k) 1194 ! tc=tp(i,k)-273.15 1195 ! denom=243.5+tc 1196 ! do j=1,3 1197 ! cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc 1198 ! il faudra que esi vienne en argument de la convection 1199 ! cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc 1200 ! tbis=t(i,k)+(tp(i,k)-tg) 1201 ! esi=exp(23.33086-(6111.72784/tbis) + & 1202 ! 0.15215*log(tbis)) 1203 ! qsat_new=eps*esi/(p(i,k)-esi*(1.-eps)) 1204 ! snew=cpd*(1.-qnk(i))+cl*qnk(i)+alv*alv*qsat_new/ & 1205 ! (rrv*tbis*tbis) 1206 ! snew=1./snew 1207 ! print*,esi,qsat_new,snew,'esi,qsat,snew' 1208 ! tp(i,k)=tg+(alf*qi(i,k)+alv*qg*(1.-(esi/es)))*snew 1209 ! print*,k,tp(i,k),qnk(i),'avec glace' 1210 ! print*,'tpNAN',tg,alf,qi(i,k),alv,qg,esi,es,snew 1211 ! enddo 1138 1212 1139 1213 alv = lv0 - clmcpv*(t(i,k)-273.15) … … 1145 1219 esi = exp(23.33086-(6111.72784/tp(i,k))+0.15215*log(tp(i,k))) 1146 1220 qsat_new = eps*esi/(p(i,k)-esi*(1.-eps)) 1147 snew = cpd*(1.-qnk(i)) + cl*qnk(i) + alv*als*qsat_new/ (rrv*tp(i,k&1148 )*tp(i,k))1221 snew = cpd*(1.-qnk(i)) + cl*qnk(i) + alv*als*qsat_new/ & 1222 (rrv*tp(i,k)*tp(i,k)) 1149 1223 snew = 1./snew 1150 ! c print*,esi,qsat_new,snew,'esi,qsat,snew' 1151 tp(i, k) = tp(i, k) + ((cpd*(1.-qnk(i))+cl*qnk(i))*(tg-tp(i, & 1152 k))+alv*(qg-qsat_new)+alf*qi(i,k))*snew 1153 ! print*,k,tp(i,k),qsat_new,qnk(i),qi(i,k), 1154 ! : 'k,tp,q,qt,qi avec glace' 1224 ! c print*,esi,qsat_new,snew,'esi,qsat,snew' 1225 tp(i, k) = tp(i, k) + & 1226 ((cpd*(1.-qnk(i))+cl*qnk(i))*(tg-tp(i,k)) + & 1227 alv*(qg-qsat_new)+alf*qi(i,k))*snew 1228 ! print*,k,tp(i,k),qsat_new,qnk(i),qi(i,k), & 1229 ! 'k,tp,q,qt,qi avec glace' 1155 1230 END DO 1156 1231 1157 !CR:reprise du code AJ1232 !CR:reprise du code AJ 1158 1233 clw(i, k) = qnk(i) - qsat_new 1159 1234 clw(i, k) = max(0.0, clw(i,k)) 1160 1235 tvp(i, k) = max(0., tp(i,k)*(1.+qsat_new/eps-qnk(i))) 1161 1236 ! print*,tvp(i,k),'tvp' 1162 1237 END IF 1163 1238 IF (clw(i,k)<1.E-11) THEN … … 1170 1245 END DO 1171 1246 1172 1173 1174 1175 1176 1247 ! ===================================================================== 1248 ! --- SET THE PRECIPITATION EFFICIENCIES AND THE FRACTION OF 1249 ! --- PRECIPITATION FALLING OUTSIDE OF CLOUD 1250 ! --- THESE MAY BE FUNCTIONS OF TP(I), P(I) AND CLW(I) 1251 ! ===================================================================== 1177 1252 1178 1253 IF (flag_epkeorig/=1) THEN … … 1205 1280 END DO 1206 1281 END IF 1207 1208 1209 1210 1211 1212 1213 1214 1215 1216 1217 1218 1219 1220 1221 1222 1223 1224 1225 1226 1227 1228 1229 DO i = 1, ncum ! convect31230 tp(i, nlp) = tp(i, nl) ! convect31231 END DO ! convect31232 1233 1234 1235 1236 1237 1238 1239 1282 ! ===================================================================== 1283 ! --- CALCULATE VIRTUAL TEMPERATURE AND LIFTED PARCEL 1284 ! --- VIRTUAL TEMPERATURE 1285 ! ===================================================================== 1286 1287 ! dans convect3, tvp est calcule en une seule fois, et sans retirer 1288 ! l'eau condensee (~> reversible CAPE) 1289 1290 ! ori do 340 k=minorig+1,nl 1291 ! ori do 330 i=1,ncum 1292 ! ori if(k.ge.(icb(i)+1))then 1293 ! ori tvp(i,k)=tvp(i,k)*(1.0-qnk(i)+ep(i,k)*clw(i,k)) 1294 ! oric print*,'i,k,tvp(i,k),qnk(i),ep(i,k),clw(i,k)' 1295 ! oric print*, i,k,tvp(i,k),qnk(i),ep(i,k),clw(i,k) 1296 ! ori endif 1297 ! ori 330 continue 1298 ! ori 340 continue 1299 1300 ! ori do 350 i=1,ncum 1301 ! ori tvp(i,nlp)=tvp(i,nl)-(gz(i,nlp)-gz(i,nl))/cpd 1302 ! ori 350 continue 1303 1304 DO i = 1, ncum ! convect3 1305 tp(i, nlp) = tp(i, nl) ! convect3 1306 END DO ! convect3 1307 1308 ! ===================================================================== 1309 ! --- EFFECTIVE VERTICAL PROFILE OF BUOYANCY (convect3 only): 1310 ! ===================================================================== 1311 1312 ! -- this is for convect3 only: 1313 1314 ! first estimate of buoyancy: 1240 1315 1241 1316 DO i = 1, ncum … … 1245 1320 END DO 1246 1321 1247 1248 1322 ! set buoyancy=buoybase for all levels below base 1323 ! for safety, set buoy(icb)=buoybase 1249 1324 1250 1325 DO i = 1, ncum … … 1254 1329 END IF 1255 1330 END DO 1256 !buoy(icb(i),k)=buoybase(i)1331 ! buoy(icb(i),k)=buoybase(i) 1257 1332 buoy(i, icb(i)) = buoybase(i) 1258 1333 END DO 1259 1334 1260 1261 1262 1263 1264 1265 1266 1267 1335 ! -- end convect3 1336 1337 ! ===================================================================== 1338 ! --- FIND THE FIRST MODEL LEVEL (INB) ABOVE THE PARCEL'S 1339 ! --- LEVEL OF NEUTRAL BUOYANCY 1340 ! ===================================================================== 1341 1342 ! -- this is for convect3 only: 1268 1343 1269 1344 DO i = 1, ncum … … 1273 1348 1274 1349 1275 1350 ! -- iposit(i) = first level, above icb, with positive buoyancy 1276 1351 DO k = 1, nl - 1 1277 1352 DO i = 1, ncum … … 1296 1371 END DO 1297 1372 1298 1299 1300 1301 1302 1303 1304 1305 1306 1307 1308 1309 !do 530 k=minorig+1,nl-11310 !do 520 i=1,ncum1311 !if(k.ge.(icb(i)+1))then1312 !by=(tvp(i,k)-tv(i,k))*dph(i,k)/p(i,k)1313 !byp=(tvp(i,k+1)-tv(i,k+1))*dph(i,k+1)/p(i,k+1)1314 !cape(i)=cape(i)+by1315 !if(by.ge.0.0)inb1(i)=k+11316 !if(cape(i).gt.0.0)then1317 !inb(i)=k+11318 !capem(i)=cape(i)1319 !endif1320 !endif1321 !520 continue1322 !530 continue1323 !do 540 i=1,ncum1324 !byp=(tvp(i,nl)-tv(i,nl))*dph(i,nl)/p(i,nl)1325 !cape(i)=capem(i)+byp1326 !defrac=capem(i)-cape(i)1327 !defrac=max(defrac,0.001)1328 !frac(i)=-cape(i)/defrac1329 !frac(i)=min(frac(i),1.0)1330 !frac(i)=max(frac(i),0.0)1331 !540 continue1332 1333 !K Emanuel fix1334 1335 !call zilch(byp,ncum)1336 !do 530 k=minorig+1,nl-11337 !do 520 i=1,ncum1338 !if(k.ge.(icb(i)+1))then1339 !by=(tvp(i,k)-tv(i,k))*dph(i,k)/p(i,k)1340 !cape(i)=cape(i)+by1341 !if(by.ge.0.0)inb1(i)=k+11342 !if(cape(i).gt.0.0)then1343 !inb(i)=k+11344 !capem(i)=cape(i)1345 !byp(i)=(tvp(i,k+1)-tv(i,k+1))*dph(i,k+1)/p(i,k+1)1346 !endif1347 !endif1348 !520 continue1349 !530 continue1350 !do 540 i=1,ncum1351 !inb(i)=max(inb(i),inb1(i))1352 !cape(i)=capem(i)+byp(i)1353 !defrac=capem(i)-cape(i)1354 !defrac=max(defrac,0.001)1355 !frac(i)=-cape(i)/defrac1356 !frac(i)=min(frac(i),1.0)1357 !frac(i)=max(frac(i),0.0)1358 !540 continue1359 1360 1361 1362 1363 1364 1365 1366 1367 1368 1369 1370 1371 1372 1373 1374 1375 1376 1377 1378 1379 1380 1381 1382 1383 1384 1385 1386 1387 1388 1389 1390 1391 1392 1373 ! -- end convect3 1374 1375 ! ori do 510 i=1,ncum 1376 ! ori cape(i)=0.0 1377 ! ori capem(i)=0.0 1378 ! ori inb(i)=icb(i)+1 1379 ! ori inb1(i)=inb(i) 1380 ! ori 510 continue 1381 1382 ! Originial Code 1383 1384 ! do 530 k=minorig+1,nl-1 1385 ! do 520 i=1,ncum 1386 ! if(k.ge.(icb(i)+1))then 1387 ! by=(tvp(i,k)-tv(i,k))*dph(i,k)/p(i,k) 1388 ! byp=(tvp(i,k+1)-tv(i,k+1))*dph(i,k+1)/p(i,k+1) 1389 ! cape(i)=cape(i)+by 1390 ! if(by.ge.0.0)inb1(i)=k+1 1391 ! if(cape(i).gt.0.0)then 1392 ! inb(i)=k+1 1393 ! capem(i)=cape(i) 1394 ! endif 1395 ! endif 1396 !520 continue 1397 !530 continue 1398 ! do 540 i=1,ncum 1399 ! byp=(tvp(i,nl)-tv(i,nl))*dph(i,nl)/p(i,nl) 1400 ! cape(i)=capem(i)+byp 1401 ! defrac=capem(i)-cape(i) 1402 ! defrac=max(defrac,0.001) 1403 ! frac(i)=-cape(i)/defrac 1404 ! frac(i)=min(frac(i),1.0) 1405 ! frac(i)=max(frac(i),0.0) 1406 !540 continue 1407 1408 ! K Emanuel fix 1409 1410 ! call zilch(byp,ncum) 1411 ! do 530 k=minorig+1,nl-1 1412 ! do 520 i=1,ncum 1413 ! if(k.ge.(icb(i)+1))then 1414 ! by=(tvp(i,k)-tv(i,k))*dph(i,k)/p(i,k) 1415 ! cape(i)=cape(i)+by 1416 ! if(by.ge.0.0)inb1(i)=k+1 1417 ! if(cape(i).gt.0.0)then 1418 ! inb(i)=k+1 1419 ! capem(i)=cape(i) 1420 ! byp(i)=(tvp(i,k+1)-tv(i,k+1))*dph(i,k+1)/p(i,k+1) 1421 ! endif 1422 ! endif 1423 !520 continue 1424 !530 continue 1425 ! do 540 i=1,ncum 1426 ! inb(i)=max(inb(i),inb1(i)) 1427 ! cape(i)=capem(i)+byp(i) 1428 ! defrac=capem(i)-cape(i) 1429 ! defrac=max(defrac,0.001) 1430 ! frac(i)=-cape(i)/defrac 1431 ! frac(i)=min(frac(i),1.0) 1432 ! frac(i)=max(frac(i),0.0) 1433 !540 continue 1434 1435 ! J Teixeira fix 1436 1437 ! ori call zilch(byp,ncum) 1438 ! ori do 515 i=1,ncum 1439 ! ori lcape(i)=.true. 1440 ! ori 515 continue 1441 ! ori do 530 k=minorig+1,nl-1 1442 ! ori do 520 i=1,ncum 1443 ! ori if(cape(i).lt.0.0)lcape(i)=.false. 1444 ! ori if((k.ge.(icb(i)+1)).and.lcape(i))then 1445 ! ori by=(tvp(i,k)-tv(i,k))*dph(i,k)/p(i,k) 1446 ! ori byp(i)=(tvp(i,k+1)-tv(i,k+1))*dph(i,k+1)/p(i,k+1) 1447 ! ori cape(i)=cape(i)+by 1448 ! ori if(by.ge.0.0)inb1(i)=k+1 1449 ! ori if(cape(i).gt.0.0)then 1450 ! ori inb(i)=k+1 1451 ! ori capem(i)=cape(i) 1452 ! ori endif 1453 ! ori endif 1454 ! ori 520 continue 1455 ! ori 530 continue 1456 ! ori do 540 i=1,ncum 1457 ! ori cape(i)=capem(i)+byp(i) 1458 ! ori defrac=capem(i)-cape(i) 1459 ! ori defrac=max(defrac,0.001) 1460 ! ori frac(i)=-cape(i)/defrac 1461 ! ori frac(i)=min(frac(i),1.0) 1462 ! ori frac(i)=max(frac(i),0.0) 1463 ! ori 540 continue 1464 1465 ! ===================================================================== 1466 ! --- CALCULATE LIQUID WATER STATIC ENERGY OF LIFTED PARCEL 1467 ! ===================================================================== 1393 1468 1394 1469 DO k = 1, nd … … 1405 1480 frac(i, k) = 1. - (t(i,k)-243.15)/(263.15-243.15) 1406 1481 frac(i, k) = min(max(frac(i,k),0.0), 1.0) 1407 hp(i, k) = hnk(i) + (lv(i,k)+(cpd-cpv)*t(i,k)+frac(i,k)*lf(i,k))* ep&1408 (i, k)*clw(i, k)1482 hp(i, k) = hnk(i) + (lv(i,k)+(cpd-cpv)*t(i,k)+frac(i,k)*lf(i,k))* & 1483 ep(i, k)*clw(i, k) 1409 1484 1410 1485 ELSE … … 1419 1494 END SUBROUTINE cv3_undilute2 1420 1495 1421 SUBROUTINE cv3_closure(nloc, ncum, nd, icb, inb, pbase, p, ph, tv, buoy, sig, & 1422 w0, cape, m, iflag) 1496 SUBROUTINE cv3_closure(nloc, ncum, nd, icb, inb, & 1497 pbase, p, ph, tv, buoy, & 1498 sig, w0, cape, m, iflag) 1423 1499 IMPLICIT NONE 1424 1500 1425 1426 1427 1428 1429 1501 ! =================================================================== 1502 ! --- CLOSURE OF CONVECT3 1503 ! 1504 ! vectorization: S. Bony 1505 ! =================================================================== 1430 1506 1431 1507 include "cvthermo.h" 1432 1508 include "cv3param.h" 1433 1509 1434 !input:1510 !input: 1435 1511 INTEGER ncum, nd, nloc 1436 1512 INTEGER icb(nloc), inb(nloc) … … 1439 1515 REAL tv(nloc, nd), buoy(nloc, nd) 1440 1516 1441 !input/output:1517 !input/output: 1442 1518 REAL sig(nloc, nd), w0(nloc, nd) 1443 1519 INTEGER iflag(nloc) 1444 1520 1445 !output:1521 !output: 1446 1522 REAL cape(nloc) 1447 1523 REAL m(nloc, nd) 1448 1524 1449 !local variables:1525 !local variables: 1450 1526 INTEGER i, j, k, icbmax 1451 1527 REAL deltap, fac, w, amu … … 1454 1530 1455 1531 1456 1457 1458 1532 ! ------------------------------------------------------- 1533 ! -- Initialization 1534 ! ------------------------------------------------------- 1459 1535 1460 1536 DO k = 1, nl … … 1464 1540 END DO 1465 1541 1466 1467 1468 1469 1470 1542 ! ------------------------------------------------------- 1543 ! -- Reset sig(i) and w0(i) for i>inb and i<icb 1544 ! ------------------------------------------------------- 1545 1546 ! update sig and w0 above LNB: 1471 1547 1472 1548 DO k = 1, nl - 1 1473 1549 DO i = 1, ncum 1474 1550 IF ((inb(i)<(nl-1)) .AND. (k>=(inb(i)+1))) THEN 1475 sig(i, k) = beta*sig(i, k) + 2.*alpha*buoy(i, inb(i))*abs(buoy(i,inb(&1476 i)))1551 sig(i, k) = beta*sig(i, k) + & 1552 2.*alpha*buoy(i, inb(i))*abs(buoy(i,inb(i))) 1477 1553 sig(i, k) = amax1(sig(i,k), 0.0) 1478 1554 w0(i, k) = beta*w0(i, k) … … 1481 1557 END DO 1482 1558 1483 1559 ! compute icbmax: 1484 1560 1485 1561 icbmax = 2 … … 1488 1564 END DO 1489 1565 1490 1566 ! update sig and w0 below cloud base: 1491 1567 1492 1568 DO k = 1, icbmax 1493 1569 DO i = 1, ncum 1494 1570 IF (k<=icb(i)) THEN 1495 sig(i, k) = beta*sig(i, k) - 2.*alpha*buoy(i, icb(i))*buoy(i, icb(i)) 1571 sig(i, k) = beta*sig(i, k) - & 1572 2.*alpha*buoy(i, icb(i))*buoy(i, icb(i)) 1496 1573 sig(i, k) = max(sig(i,k), 0.0) 1497 1574 w0(i, k) = beta*w0(i, k) … … 1500 1577 END DO 1501 1578 1502 !! if(inb.lt.(nl-1))then1503 !! do 85 i=inb+1,nl-11504 !! sig(i)=beta*sig(i)+2.*alpha*buoy(inb)*1505 !! 1 abs(buoy(inb))1506 !! sig(i)=max(sig(i),0.0)1507 !! w0(i)=beta*w0(i)1508 !! 85 continue1509 !! end if1510 1511 !! do 87 i=1,icb1512 !! sig(i)=beta*sig(i)-2.*alpha*buoy(icb)*buoy(icb)1513 !! sig(i)=max(sig(i),0.0)1514 !! w0(i)=beta*w0(i)1515 !! 87 continue1516 1517 1518 1519 1520 1579 !! if(inb.lt.(nl-1))then 1580 !! do 85 i=inb+1,nl-1 1581 !! sig(i)=beta*sig(i)+2.*alpha*buoy(inb)* 1582 !! 1 abs(buoy(inb)) 1583 !! sig(i)=max(sig(i),0.0) 1584 !! w0(i)=beta*w0(i) 1585 !! 85 continue 1586 !! end if 1587 1588 !! do 87 i=1,icb 1589 !! sig(i)=beta*sig(i)-2.*alpha*buoy(icb)*buoy(icb) 1590 !! sig(i)=max(sig(i),0.0) 1591 !! w0(i)=beta*w0(i) 1592 !! 87 continue 1593 1594 ! ------------------------------------------------------------- 1595 ! -- Reset fractional areas of updrafts and w0 at initial time 1596 ! -- and after 10 time steps of no convection 1597 ! ------------------------------------------------------------- 1521 1598 1522 1599 DO k = 1, nl - 1 … … 1529 1606 END DO 1530 1607 1531 1532 1533 1534 1535 1608 ! ------------------------------------------------------------- 1609 ! -- Calculate convective available potential energy (cape), 1610 ! -- vertical velocity (w), fractional area covered by 1611 ! -- undilute updraft (sig), and updraft mass flux (m) 1612 ! ------------------------------------------------------------- 1536 1613 1537 1614 DO i = 1, ncum … … 1539 1616 END DO 1540 1617 1541 1618 ! compute dtmin (minimum buoyancy between ICB and given level k): 1542 1619 1543 1620 DO i = 1, ncum … … 1550 1627 DO k = 1, nl 1551 1628 DO j = minorig, nl 1552 IF ((k>=(icb(i)+1)) .AND. (k<=inb(i)) .AND. (j>=icb(i)) .AND. (j<=(k- & 1553 1))) THEN 1629 IF ((k>=(icb(i)+1)) .AND. (k<=inb(i)) .AND. (j>=icb(i)) .AND. (j<=(k-1))) THEN 1554 1630 dtmin(i, k) = amin1(dtmin(i,k), buoy(i,j)) 1555 1631 END IF … … 1558 1634 END DO 1559 1635 1560 1636 ! the interval on which cape is computed starts at pbase : 1561 1637 1562 1638 DO k = 1, nl … … 1570 1646 sigold(i, k) = sig(i, k) 1571 1647 1572 1573 1574 1575 1648 ! dtmin(i,k)=100.0 1649 ! do 97 j=icb(i),k-1 ! mauvaise vectorisation 1650 ! dtmin(i,k)=AMIN1(dtmin(i,k),buoy(i,j)) 1651 ! 97 continue 1576 1652 1577 1653 sig(i, k) = beta*sig(i, k) + alpha*dtmin(i, k)*abs(dtmin(i,k)) … … 1590 1666 DO i = 1, ncum 1591 1667 w0(i, icb(i)) = 0.5*w0(i, icb(i)+1) 1592 m(i, icb(i)) = 0.5*m(i, icb(i)+1)*(ph(i,icb(i))-ph(i,icb(i)+1))/ & 1593 (ph(i,icb(i)+1)-ph(i,icb(i)+2)) 1668 m(i, icb(i)) = 0.5*m(i, icb(i)+1)*(ph(i,icb(i))-ph(i,icb(i)+1))/(ph(i,icb(i)+1)-ph(i,icb(i)+2)) 1594 1669 sig(i, icb(i)) = sig(i, icb(i)+1) 1595 1670 sig(i, icb(i)-1) = sig(i, icb(i)) 1596 1671 END DO 1597 1672 1598 ! ccc 3. Compute final cloud base mass flux and set iflag to 3 if 1599 ! ccc cloud base mass flux is exceedingly small and is decreasing (i.e. 1600 ! if 1601 ! ccc the final mass flux (cbmflast) is greater than the target mass 1602 ! flux 1603 ! ccc (cbmf) ??). 1604 ! cc 1605 ! c do i = 1,ncum 1606 ! c cbmflast(i) = 0. 1607 ! c enddo 1608 ! cc 1609 ! c do k= 1,nl 1610 ! c do i = 1,ncum 1611 ! c IF (k .ge. icb(i) .and. k .le. inb(i)) THEN 1612 ! c cbmflast(i) = cbmflast(i)+M(i,k) 1613 ! c ENDIF 1614 ! c enddo 1615 ! c enddo 1616 ! cc 1617 ! c do i = 1,ncum 1618 ! c IF (cbmflast(i) .lt. 1.e-6) THEN 1619 ! c iflag(i) = 3 1620 ! c ENDIF 1621 ! c enddo 1622 ! cc 1623 ! c do k= 1,nl 1624 ! c do i = 1,ncum 1625 ! c IF (iflag(i) .ge. 3) THEN 1626 ! c M(i,k) = 0. 1627 ! c sig(i,k) = 0. 1628 ! c w0(i,k) = 0. 1629 ! c ENDIF 1630 ! c enddo 1631 ! c enddo 1632 ! cc 1633 ! ! cape=0.0 1634 ! ! do 98 i=icb+1,inb 1635 ! ! deltap = min(pbase,ph(i-1))-min(pbase,ph(i)) 1636 ! ! cape=cape+rrd*buoy(i-1)*deltap/p(i-1) 1637 ! ! dcape=rrd*buoy(i-1)*deltap/p(i-1) 1638 ! ! dlnp=deltap/p(i-1) 1639 ! ! cape=max(0.0,cape) 1640 ! ! sigold=sig(i) 1641 1642 ! ! dtmin=100.0 1643 ! ! do 97 j=icb,i-1 1644 ! ! dtmin=amin1(dtmin,buoy(j)) 1645 ! ! 97 continue 1646 1647 ! ! sig(i)=beta*sig(i)+alpha*dtmin*abs(dtmin) 1648 ! ! sig(i)=max(sig(i),0.0) 1649 ! ! sig(i)=amin1(sig(i),0.01) 1650 ! ! fac=amin1(((dtcrit-dtmin)/dtcrit),1.0) 1651 ! ! w=(1.-beta)*fac*sqrt(cape)+beta*w0(i) 1652 ! ! amu=0.5*(sig(i)+sigold)*w 1653 ! ! m(i)=amu*0.007*p(i)*(ph(i)-ph(i+1))/tv(i) 1654 ! ! w0(i)=w 1655 ! ! 98 continue 1656 ! ! w0(icb)=0.5*w0(icb+1) 1657 ! ! m(icb)=0.5*m(icb+1)*(ph(icb)-ph(icb+1))/(ph(icb+1)-ph(icb+2)) 1658 ! ! sig(icb)=sig(icb+1) 1659 ! ! sig(icb-1)=sig(icb) 1673 ! ccc 3. Compute final cloud base mass flux and set iflag to 3 if 1674 ! ccc cloud base mass flux is exceedingly small and is decreasing (i.e. if 1675 ! ccc the final mass flux (cbmflast) is greater than the target mass flux 1676 ! ccc (cbmf) ??). 1677 ! cc 1678 ! c do i = 1,ncum 1679 ! c cbmflast(i) = 0. 1680 ! c enddo 1681 ! cc 1682 ! c do k= 1,nl 1683 ! c do i = 1,ncum 1684 ! c IF (k .ge. icb(i) .and. k .le. inb(i)) THEN 1685 ! c cbmflast(i) = cbmflast(i)+M(i,k) 1686 ! c ENDIF 1687 ! c enddo 1688 ! c enddo 1689 ! cc 1690 ! c do i = 1,ncum 1691 ! c IF (cbmflast(i) .lt. 1.e-6) THEN 1692 ! c iflag(i) = 3 1693 ! c ENDIF 1694 ! c enddo 1695 ! cc 1696 ! c do k= 1,nl 1697 ! c do i = 1,ncum 1698 ! c IF (iflag(i) .ge. 3) THEN 1699 ! c M(i,k) = 0. 1700 ! c sig(i,k) = 0. 1701 ! c w0(i,k) = 0. 1702 ! c ENDIF 1703 ! c enddo 1704 ! c enddo 1705 ! cc 1706 !! cape=0.0 1707 !! do 98 i=icb+1,inb 1708 !! deltap = min(pbase,ph(i-1))-min(pbase,ph(i)) 1709 !! cape=cape+rrd*buoy(i-1)*deltap/p(i-1) 1710 !! dcape=rrd*buoy(i-1)*deltap/p(i-1) 1711 !! dlnp=deltap/p(i-1) 1712 !! cape=max(0.0,cape) 1713 !! sigold=sig(i) 1714 1715 !! dtmin=100.0 1716 !! do 97 j=icb,i-1 1717 !! dtmin=amin1(dtmin,buoy(j)) 1718 !! 97 continue 1719 1720 !! sig(i)=beta*sig(i)+alpha*dtmin*abs(dtmin) 1721 !! sig(i)=max(sig(i),0.0) 1722 !! sig(i)=amin1(sig(i),0.01) 1723 !! fac=amin1(((dtcrit-dtmin)/dtcrit),1.0) 1724 !! w=(1.-beta)*fac*sqrt(cape)+beta*w0(i) 1725 !! amu=0.5*(sig(i)+sigold)*w 1726 !! m(i)=amu*0.007*p(i)*(ph(i)-ph(i+1))/tv(i) 1727 !! w0(i)=w 1728 !! 98 continue 1729 !! w0(icb)=0.5*w0(icb+1) 1730 !! m(icb)=0.5*m(icb+1)*(ph(icb)-ph(icb+1))/(ph(icb+1)-ph(icb+2)) 1731 !! sig(icb)=sig(icb+1) 1732 !! sig(icb-1)=sig(icb) 1660 1733 1661 1734 RETURN 1662 1735 END SUBROUTINE cv3_closure 1663 1736 1664 SUBROUTINE cv3_mixing(nloc, ncum, nd, na, ntra, icb, nk, inb, ph, t, rr, rs, & 1665 u, v, tra, h, lv, lf, frac, qnk, unk, vnk, hp, tv, tvp, ep, clw, m, sig, & 1666 ment, qent, uent, vent, nent, sij, elij, ments, qents, traent) 1737 SUBROUTINE cv3_mixing(nloc, ncum, nd, na, ntra, icb, nk, inb, & 1738 ph, t, rr, rs, u, v, tra, h, lv, lf, frac, qnk, & 1739 unk, vnk, hp, tv, tvp, ep, clw, m, sig, & 1740 ment, qent, uent, vent, nent, sij, elij, ments, qents, traent) 1667 1741 IMPLICIT NONE 1668 1742 1669 1670 1671 1672 1743 ! --------------------------------------------------------------------- 1744 ! a faire: 1745 ! - vectorisation de la partie normalisation des flux (do 789...) 1746 ! --------------------------------------------------------------------- 1673 1747 1674 1748 include "cvthermo.h" … … 1676 1750 include "cvflag.h" 1677 1751 1678 !inputs:1752 !inputs: 1679 1753 INTEGER ncum, nd, na, ntra, nloc 1680 1754 INTEGER icb(nloc), inb(nloc), nk(nloc) … … 1690 1764 REAL m(nloc, na) ! input of convect3 1691 1765 1692 !outputs:1766 !outputs: 1693 1767 REAL ment(nloc, na, na), qent(nloc, na, na) 1694 1768 REAL uent(nloc, na, na), vent(nloc, na, na) … … 1699 1773 INTEGER nent(nloc, nd) 1700 1774 1701 !local variables:1775 !local variables: 1702 1776 INTEGER i, j, k, il, im, jm 1703 1777 INTEGER num1, num2 … … 1710 1784 LOGICAL lwork(nloc) 1711 1785 1712 1713 1714 1715 1716 1786 ! ===================================================================== 1787 ! --- INITIALIZE VARIOUS ARRAYS USED IN THE COMPUTATIONS 1788 ! ===================================================================== 1789 1790 ! ori do 360 i=1,ncum*nlp 1717 1791 DO j = 1, nl 1718 1792 DO i = 1, ncum 1719 1793 nent(i, j) = 0 1720 1721 1722 END DO 1723 END DO 1724 1725 1726 1794 ! in convect3, m is computed in cv3_closure 1795 ! ori m(i,1)=0.0 1796 END DO 1797 END DO 1798 1799 ! ori do 400 k=1,nlp 1800 ! ori do 390 j=1,nlp 1727 1801 DO j = 1, nl 1728 1802 DO k = 1, nl … … 1732 1806 vent(i, k, j) = v(i, j) 1733 1807 elij(i, k, j) = 0.0 1734 !ym ment(i,k,j)=0.01735 !ym sij(i,k,j)=0.01808 !ym ment(i,k,j)=0.0 1809 !ym sij(i,k,j)=0.0 1736 1810 END DO 1737 1811 END DO 1738 1812 END DO 1739 1813 1740 !ym1814 !ym 1741 1815 ment(1:ncum, 1:nd, 1:nd) = 0.0 1742 1816 sij(1:ncum, 1:nd, 1:nd) = 0.0 1743 1817 1744 !AC! do k=1,ntra1745 !AC! do j=1,nd ! instead nlp1746 !AC! do i=1,nd ! instead nlp1747 !AC! do il=1,ncum1748 !AC! traent(il,i,j,k)=tra(il,j,k)1749 !AC! enddo1750 !AC! enddo1751 !AC! enddo1752 !AC! enddo1818 !AC! do k=1,ntra 1819 !AC! do j=1,nd ! instead nlp 1820 !AC! do i=1,nd ! instead nlp 1821 !AC! do il=1,ncum 1822 !AC! traent(il,i,j,k)=tra(il,j,k) 1823 !AC! enddo 1824 !AC! enddo 1825 !AC! enddo 1826 !AC! enddo 1753 1827 zm(:, :) = 0. 1754 1828 1755 1756 1757 1758 1759 1829 ! ===================================================================== 1830 ! --- CALCULATE ENTRAINED AIR MASS FLUX (ment), TOTAL WATER MIXING 1831 ! --- RATIO (QENT), TOTAL CONDENSED WATER (elij), AND MIXING 1832 ! --- FRACTION (sij) 1833 ! ===================================================================== 1760 1834 1761 1835 DO i = minorig + 1, nl … … 1763 1837 DO j = minorig, nl 1764 1838 DO il = 1, ncum 1765 IF ((i>=icb(il)) .AND. (i<=inb(il)) .AND. (j>=(icb(il)- & 1766 1)) .AND. (j<=inb(il))) THEN 1839 IF ((i>=icb(il)) .AND. (i<=inb(il)) .AND. (j>=(icb(il)-1)) .AND. (j<=inb(il))) THEN 1767 1840 1768 1841 rti = qnk(il) - ep(il, i)*clw(il, i) … … 1771 1844 1772 1845 IF (cvflag_ice) THEN 1773 1846 ! print*,cvflag_ice,'cvflag_ice dans do 700' 1774 1847 IF (t(il,j)<=263.15) THEN 1775 bf2 = 1. + (lf(il,j)+lv(il,j))*(lv(il,j)+frac(il,j)* lf(il,j))*&1776 rs(il, j)/(rrv*t(il,j)*t(il,j)*cpd)1848 bf2 = 1. + (lf(il,j)+lv(il,j))*(lv(il,j)+frac(il,j)* & 1849 lf(il,j))*rs(il, j)/(rrv*t(il,j)*t(il,j)*cpd) 1777 1850 END IF 1778 1851 END IF … … 1791 1864 1792 1865 IF (cvflag_ice) THEN 1793 anum = anum - (lv(il,j)+frac(il,j)*lf(il,j))*(rti-rs(il,j)-cwat & 1794 *bf2) 1866 anum = anum - (lv(il,j)+frac(il,j)*lf(il,j))*(rti-rs(il,j)-cwat*bf2) 1795 1867 denom = denom + (lv(il,j)+frac(il,j)*lf(il,j))*(rr(il,i)-rti) 1796 1868 ELSE … … 1801 1873 IF (abs(denom)<0.01) denom = 0.01 1802 1874 sij(il, i, j) = anum/denom 1803 altem = sij(il, i, j)*rr(il, i) + (1.-sij(il,i,j))*rti - & 1804 rs(il, j) 1875 altem = sij(il, i, j)*rr(il, i) + (1.-sij(il,i,j))*rti - rs(il, j) 1805 1876 altem = altem - (bf2-1.)*cwat 1806 1877 END IF 1807 1878 IF (sij(il,i,j)>0.0 .AND. sij(il,i,j)<0.95) THEN 1808 1879 qent(il, i, j) = sij(il, i, j)*rr(il, i) + (1.-sij(il,i,j))*rti 1809 uent(il, i, j) = sij(il, i, j)*u(il, i) + & 1810 (1.-sij(il,i,j))*unk(il) 1811 vent(il, i, j) = sij(il, i, j)*v(il, i) + & 1812 (1.-sij(il,i,j))*vnk(il) 1813 ! !!! do k=1,ntra 1814 ! !!! traent(il,i,j,k)=sij(il,i,j)*tra(il,i,k) 1815 ! !!! : +(1.-sij(il,i,j))*tra(il,nk(il),k) 1816 ! !!! end do 1880 uent(il, i, j) = sij(il, i, j)*u(il, i) + (1.-sij(il,i,j))*unk(il) 1881 vent(il, i, j) = sij(il, i, j)*v(il, i) + (1.-sij(il,i,j))*vnk(il) 1882 !!!! do k=1,ntra 1883 !!!! traent(il,i,j,k)=sij(il,i,j)*tra(il,i,k) 1884 !!!! : +(1.-sij(il,i,j))*tra(il,nk(il),k) 1885 !!!! end do 1817 1886 elij(il, i, j) = altem 1818 1887 elij(il, i, j) = max(0.0, elij(il,i,j)) … … 1826 1895 END DO 1827 1896 1828 ! AC! do k=1,ntra 1829 ! AC! do j=minorig,nl 1830 ! AC! do il=1,ncum 1831 ! AC! if( (i.ge.icb(il)).and.(i.le.inb(il)).and. 1832 ! AC! : (j.ge.(icb(il)-1)).and.(j.le.inb(il)))then 1833 ! AC! traent(il,i,j,k)=sij(il,i,j)*tra(il,i,k) 1834 ! AC! : +(1.-sij(il,i,j))*tra(il,nk(il),k) 1835 ! AC! endif 1836 ! AC! enddo 1837 ! AC! enddo 1838 ! AC! enddo 1839 1840 1841 ! *** if no air can entrain at level i assume that updraft detrains 1842 ! *** 1843 ! *** at that level and calculate detrained air flux and properties 1844 ! *** 1845 1846 1847 ! @ do 170 i=icb(il),inb(il) 1897 !AC! do k=1,ntra 1898 !AC! do j=minorig,nl 1899 !AC! do il=1,ncum 1900 !AC! if( (i.ge.icb(il)).and.(i.le.inb(il)).and. 1901 !AC! : (j.ge.(icb(il)-1)).and.(j.le.inb(il)))then 1902 !AC! traent(il,i,j,k)=sij(il,i,j)*tra(il,i,k) 1903 !AC! : +(1.-sij(il,i,j))*tra(il,nk(il),k) 1904 !AC! endif 1905 !AC! enddo 1906 !AC! enddo 1907 !AC! enddo 1908 1909 1910 ! *** if no air can entrain at level i assume that updraft detrains *** 1911 ! *** at that level and calculate detrained air flux and properties *** 1912 1913 1914 ! @ do 170 i=icb(il),inb(il) 1848 1915 1849 1916 DO il = 1, ncum 1850 1917 IF ((i>=icb(il)) .AND. (i<=inb(il)) .AND. (nent(il,i)==0)) THEN 1851 1918 ! @ if(nent(il,i).eq.0)then 1852 1919 ment(il, i, i) = m(il, i) 1853 1920 qent(il, i, i) = qnk(il) - ep(il, i)*clw(il, i) … … 1855 1922 vent(il, i, i) = vnk(il) 1856 1923 elij(il, i, i) = clw(il, i) 1857 1924 ! MAF sij(il,i,i)=1.0 1858 1925 sij(il, i, i) = 0.0 1859 1926 END IF … … 1861 1928 END DO 1862 1929 1863 ! AC! do j=1,ntra 1864 ! AC! do i=minorig+1,nl 1865 ! AC! do il=1,ncum 1866 ! AC! if (i.ge.icb(il) .and. i.le.inb(il) .and. nent(il,i).eq.0) 1867 ! then 1868 ! AC! traent(il,i,i,j)=tra(il,nk(il),j) 1869 ! AC! endif 1870 ! AC! enddo 1871 ! AC! enddo 1872 ! AC! enddo 1930 !AC! do j=1,ntra 1931 !AC! do i=minorig+1,nl 1932 !AC! do il=1,ncum 1933 !AC! if (i.ge.icb(il) .and. i.le.inb(il) .and. nent(il,i).eq.0) then 1934 !AC! traent(il,i,i,j)=tra(il,nk(il),j) 1935 !AC! endif 1936 !AC! enddo 1937 !AC! enddo 1938 !AC! enddo 1873 1939 1874 1940 DO j = minorig, nl 1875 1941 DO i = minorig, nl 1876 1942 DO il = 1, ncum 1877 IF ((j>=(icb(il)-1)) .AND. (j<=inb(il)) .AND. (i>=icb(il)) .AND. (i<= & 1878 inb(il))) THEN 1943 IF ((j>=(icb(il)-1)) .AND. (j<=inb(il)) .AND. (i>=icb(il)) .AND. (i<=inb(il))) THEN 1879 1944 sigij(il, i, j) = sij(il, i, j) 1880 1945 END IF … … 1882 1947 END DO 1883 1948 END DO 1884 1885 1886 1887 1888 1889 1890 1891 1949 ! @ enddo 1950 1951 ! @170 continue 1952 1953 ! ===================================================================== 1954 ! --- NORMALIZE ENTRAINED AIR MASS FLUXES 1955 ! --- TO REPRESENT EQUAL PROBABILITIES OF MIXING 1956 ! ===================================================================== 1892 1957 1893 1958 CALL zilch(asum, nloc*nd) … … 1915 1980 IF (cvflag_ice) THEN 1916 1981 1917 anum = h(il, i) - hp(il, i) - (lv(il,i)+frac(il,i)*lf(il,i))* (qp-rs&1918 (il,i)) + (cpv-cpd)*t(il, i)*(qp-rr(il,i))1919 denom = h(il, i) - hp(il, i) + (lv(il,i)+frac(il,i)*lf(il,i))* (rr(&1920 il,i)-qp) + (cpd-cpv)*t(il, i)*(rr(il,i)-qp)1982 anum = h(il, i) - hp(il, i) - (lv(il,i)+frac(il,i)*lf(il,i))* & 1983 (qp-rs(il,i)) + (cpv-cpd)*t(il, i)*(qp-rr(il,i)) 1984 denom = h(il, i) - hp(il, i) + (lv(il,i)+frac(il,i)*lf(il,i))* & 1985 (rr(il,i)-qp) + (cpd-cpv)*t(il, i)*(rr(il,i)-qp) 1921 1986 ELSE 1922 1987 1923 1988 anum = h(il, i) - hp(il, i) - lv(il, i)*(qp-rs(il,i)) + & 1924 (cpv-cpd)*t(il, i)*(qp-rr(il,i))1989 (cpv-cpd)*t(il, i)*(qp-rr(il,i)) 1925 1990 denom = h(il, i) - hp(il, i) + lv(il, i)*(rr(il,i)-qp) + & 1926 (cpd-cpv)*t(il, i)*(rr(il,i)-qp)1991 (cpd-cpv)*t(il, i)*(rr(il,i)-qp) 1927 1992 END IF 1928 1993 … … 1940 2005 num2 = 0 1941 2006 DO il = 1, ncum 1942 IF (i>=icb(il) .AND. i<=inb(il) .AND. j>=(icb( & 1943 il)-1) .AND. j<=inb(il) .AND. lwork(il)) num2 = num2 + 1 2007 IF (i>=icb(il) .AND. i<=inb(il) .AND. & 2008 j>=(icb(il)-1) .AND. j<=inb(il) .AND. & 2009 lwork(il)) num2 = num2 + 1 1944 2010 END DO 1945 2011 IF (num2<=0) GO TO 175 1946 2012 1947 2013 DO il = 1, ncum 1948 IF (i>=icb(il) .AND. i<=inb(il) .AND. j>=(icb( & 1949 il)-1) .AND. j<=inb(il) .AND. lwork(il)) THEN 2014 IF (i>=icb(il) .AND. i<=inb(il) .AND. & 2015 j>=(icb(il)-1) .AND. j<=inb(il) .AND. & 2016 lwork(il)) THEN 1950 2017 1951 2018 IF (sij(il,i,j)>1.0E-16 .AND. sij(il,i,j)<0.95) THEN … … 1988 2055 DO j = minorig, nl 1989 2056 DO il = 1, ncum 1990 IF (i>=icb(il) .AND. i<=inb(il) .AND. lwork(il) .AND. j>=(icb(&1991 il)-1) .AND. j<=inb(il)) THEN2057 IF (i>=icb(il) .AND. i<=inb(il) .AND. lwork(il) .AND. & 2058 j>=(icb(il)-1) .AND. j<=inb(il)) THEN 1992 2059 ment(il, i, j) = ment(il, i, j)*asij(il) 1993 2060 END IF … … 1997 2064 DO j = minorig, nl 1998 2065 DO il = 1, ncum 1999 IF (i>=icb(il) .AND. i<=inb(il) .AND. lwork(il) .AND. j>=(icb(&2000 il)-1) .AND. j<=inb(il)) THEN2066 IF (i>=icb(il) .AND. i<=inb(il) .AND. lwork(il) .AND. & 2067 j>=(icb(il)-1) .AND. j<=inb(il)) THEN 2001 2068 asum(il, i) = asum(il, i) + ment(il, i, j) 2002 2069 ment(il, i, j) = ment(il, i, j)*sig(il, j) … … 2015 2082 DO j = minorig, nl 2016 2083 DO il = 1, ncum 2017 IF (i>=icb(il) .AND. i<=inb(il) .AND. lwork(il) .AND. j>=(icb(&2018 il)-1) .AND. j<=inb(il)) THEN2084 IF (i>=icb(il) .AND. i<=inb(il) .AND. lwork(il) .AND. & 2085 j>=(icb(il)-1) .AND. j<=inb(il)) THEN 2019 2086 ment(il, i, j) = ment(il, i, j)*asum(il, i)*bsum(il, i) 2020 2087 END IF … … 2024 2091 DO j = minorig, nl 2025 2092 DO il = 1, ncum 2026 IF (i>=icb(il) .AND. i<=inb(il) .AND. lwork(il) .AND. j>=(icb(&2027 il)-1) .AND. j<=inb(il)) THEN2093 IF (i>=icb(il) .AND. i<=inb(il) .AND. lwork(il) .AND. & 2094 j>=(icb(il)-1) .AND. j<=inb(il)) THEN 2028 2095 csum(il, i) = csum(il, i) + ment(il, i, j) 2029 2096 END IF … … 2040 2107 vent(il, i, i) = vnk(il) 2041 2108 elij(il, i, i) = clw(il, i) 2042 2109 ! MAF sij(il,i,i)=1.0 2043 2110 sij(il, i, i) = 0.0 2044 2111 END IF 2045 2112 END DO ! il 2046 2113 2047 !AC! do j=1,ntra2048 !AC! do il=1,ncum2049 !AC! if ( i.ge.icb(il) .and. i.le.inb(il) .and. lwork(il)2050 !AC! : .and. csum(il,i).lt.m(il,i) ) then2051 !AC! traent(il,i,i,j)=tra(il,nk(il),j)2052 !AC! endif2053 !AC! enddo2054 !AC! enddo2114 !AC! do j=1,ntra 2115 !AC! do il=1,ncum 2116 !AC! if ( i.ge.icb(il) .and. i.le.inb(il) .and. lwork(il) 2117 !AC! : .and. csum(il,i).lt.m(il,i) ) then 2118 !AC! traent(il,i,i,j)=tra(il,nk(il),j) 2119 !AC! endif 2120 !AC! enddo 2121 !AC! enddo 2055 2122 789 END DO 2056 2123 2057 2124 ! MAF: renormalisation de MENT 2058 2125 CALL zilch(zm, nloc*na) 2059 2126 DO jm = 1, nd … … 2087 2154 END SUBROUTINE cv3_mixing 2088 2155 2089 SUBROUTINE cv3_unsat(nloc, ncum, nd, na, ntra, icb, inb, iflag, t, rr, rs, & 2090 gz, u, v, tra, p, ph, th, tv, lv, lf, cpn, ep, sigp, clw, m, ment, elij, & 2091 delt, plcl, coef_clos, mp, rp, up, vp, trap, wt, water, evap, fondue, & 2092 ice, faci, b, sigd, wdtraina, wdtrainm) ! RomP 2156 SUBROUTINE cv3_unsat(nloc, ncum, nd, na, ntra, icb, inb, iflag, & 2157 t, rr, rs, gz, u, v, tra, p, ph, & 2158 th, tv, lv, lf, cpn, ep, sigp, clw, & 2159 m, ment, elij, delt, plcl, coef_clos, & 2160 mp, rp, up, vp, trap, wt, water, evap, fondue, ice, & 2161 faci, b, sigd, & 2162 wdtrainA, wdtrainM) ! RomP 2093 2163 IMPLICIT NONE 2094 2164 … … 2098 2168 include "cvflag.h" 2099 2169 2100 !inputs:2170 !inputs: 2101 2171 INTEGER ncum, nd, na, ntra, nloc 2102 2172 INTEGER icb(nloc), inb(nloc) … … 2112 2182 REAL coef_clos(nloc) 2113 2183 2114 !input/output2184 !input/output 2115 2185 INTEGER iflag(nloc) 2116 2186 2117 !outputs:2187 !outputs: 2118 2188 REAL mp(nloc, na), rp(nloc, na), up(nloc, na), vp(nloc, na) 2119 2189 REAL water(nloc, na), evap(nloc, na), wt(nloc, na) … … 2121 2191 REAL trap(nloc, na, ntra) 2122 2192 REAL b(nloc, na), sigd(nloc) 2123 2124 ! lascendance adiabatique et des flux melanges Pa et Pm.2125 2126 2127 REAL wdtrain a(nloc, na), wdtrainm(nloc, na)2128 2129 !local variables2193 ! 25/08/10 - RomP---- ajout des masses precipitantes ejectees 2194 ! de l ascendance adiabatique et des flux melanges Pa et Pm. 2195 ! Distinction des wdtrain 2196 ! Pa = wdtrainA Pm = wdtrainM 2197 REAL wdtrainA(nloc, na), wdtrainM(nloc, na) 2198 2199 !local variables 2130 2200 INTEGER i, j, k, il, num1, ndp1 2131 2201 REAL tinv, delti, coef … … 2143 2213 2144 2214 2145 2215 ! ------------------------------------------------------ 2146 2216 2147 2217 delti = 1./delt … … 2170 2240 END DO 2171 2241 END DO 2172 !AC! do k=1,ntra2173 !AC! do i=1,nd2174 !AC! do il=1,ncum2175 !AC! trap(il,i,k)=tra(il,i,k)2176 !AC! enddo2177 !AC! enddo2178 !AC! enddo2179 !! RomP >>>2242 !AC! do k=1,ntra 2243 !AC! do i=1,nd 2244 !AC! do il=1,ncum 2245 !AC! trap(il,i,k)=tra(il,i,k) 2246 !AC! enddo 2247 !AC! enddo 2248 !AC! enddo 2249 !! RomP >>> 2180 2250 DO i = 1, nd 2181 2251 DO il = 1, ncum 2182 wdtrain a(il, i) = 0.02183 wdtrain m(il, i) = 0.02184 END DO 2185 END DO 2186 !! RomP <<<2187 2188 2189 2252 wdtrainA(il, i) = 0.0 2253 wdtrainM(il, i) = 0.0 2254 END DO 2255 END DO 2256 !! RomP <<< 2257 2258 ! *** check whether ep(inb)=0, if so, skip precipitating *** 2259 ! *** downdraft calculation *** 2190 2260 2191 2261 2192 2262 DO il = 1, ncum 2193 !! lwork(il)=.TRUE.2194 !! if(ep(il,inb(il)).lt.0.0001)lwork(il)=.FALSE.2263 !! lwork(il)=.TRUE. 2264 !! if(ep(il,inb(il)).lt.0.0001)lwork(il)=.FALSE. 2195 2265 lwork(il) = ep(il, inb(il)) >= 0.0001 2196 2266 END DO 2197 2267 2198 2268 ! *** Set the fractionnal area sigd of precipitating downdraughts 2199 2269 DO il = 1, ncum 2200 2270 sigd(il) = sigdz*coef_clos(il) … … 2202 2272 2203 2273 2204 2205 2206 2207 2208 2274 ! ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2275 ! 2276 ! *** begin downdraft loop *** 2277 ! 2278 ! ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2209 2279 2210 2280 DO i = nl + 1, 1, -1 … … 2219 2289 2220 2290 2221 2222 2223 2224 2225 2291 ! *** integrate liquid water equation to find condensed water *** 2292 ! *** and condensed water flux *** 2293 ! 2294 ! 2295 ! *** calculate detrained precipitation *** 2226 2296 2227 2297 DO il = 1, ncum … … 2229 2299 IF (cvflag_grav) THEN 2230 2300 wdtrain(il) = grav*ep(il, i)*m(il, i)*clw(il, i) 2231 wdtrain a(il, i) = wdtrain(il)/grav! Pa RomP2301 wdtrainA(il, i) = wdtrain(il)/grav ! Pa RomP 2232 2302 ELSE 2233 2303 wdtrain(il) = 10.0*ep(il, i)*m(il, i)*clw(il, i) 2234 wdtrain a(il, i) = wdtrain(il)/10.! Pa RomP2304 wdtrainA(il, i) = wdtrain(il)/10. ! Pa RomP 2235 2305 END IF 2236 2306 END IF … … 2245 2315 IF (cvflag_grav) THEN 2246 2316 wdtrain(il) = wdtrain(il) + grav*awat*ment(il, j, i) 2247 wdtrain m(il, i) = wdtrain(il)/grav - wdtraina(il, i)! Pm RomP2317 wdtrainM(il, i) = wdtrain(il)/grav - wdtrainA(il, i) ! Pm RomP 2248 2318 ELSE 2249 2319 wdtrain(il) = wdtrain(il) + 10.0*awat*ment(il, j, i) 2250 wdtrain m(il, i) = wdtrain(il)/10. - wdtraina(il, i)! Pm RomP2320 wdtrainM(il, i) = wdtrain(il)/10. - wdtrainA(il, i) ! Pm RomP 2251 2321 END IF 2252 2322 END IF … … 2256 2326 2257 2327 2258 2259 2328 ! *** find rain water and evaporation using provisional *** 2329 ! *** estimates of rp(i)and rp(i-1) *** 2260 2330 2261 2331 … … 2283 2353 END IF 2284 2354 2285 rp(il, i) = rp(il, i+1) + (cpd*(t(il,i+1)-t(il,&2286 i))+gz(il,i+1)-gz(il,i))/lv(il, i)2355 rp(il, i) = rp(il, i+1) + & 2356 (cpd*(t(il,i+1)-t(il,i))+gz(il,i+1)-gz(il,i))/lv(il, i) 2287 2357 rp(il, i) = 0.5*(rp(il,i)+rr(il,i)) 2288 2358 END IF … … 2296 2366 afac = p(il, 1)*(rs(il,1)-rp(il,1))/(1.0E4+2000.0*p(il,1)*rs(il,1)) 2297 2367 IF (cvflag_ice) THEN 2298 afac1 = p(il, i)*(rs(il,1)-rp(il,1))/(1.0E4+2000.0*p(il,1)*rs(il, & 2299 1)) 2368 afac1 = p(il, i)*(rs(il,1)-rp(il,1))/(1.0E4+2000.0*p(il,1)*rs(il,1)) 2300 2369 END IF 2301 2370 ELSE 2302 rp(il, i-1) = rp(il, i) + (cpd*(t(il,i)-t(il, & 2303 i-1))+gz(il,i)-gz(il,i-1))/lv(il, i) 2371 rp(il, i-1) = rp(il, i) + (cpd*(t(il,i)-t(il,i-1))+gz(il,i)-gz(il,i-1))/lv(il, i) 2304 2372 rp(il, i-1) = 0.5*(rp(il,i-1)+rr(il,i-1)) 2305 2373 rp(il, i-1) = amin1(rp(il,i-1), rs(il,i-1)) 2306 2374 rp(il, i-1) = max(rp(il,i-1), 0.0) 2307 afac1 = p(il, i)*(rs(il,i)-rp(il,i))/(1.0E4+2000.0*p(il,i)*rs(il,i) & 2308 ) 2309 afac2 = p(il, i-1)*(rs(il,i-1)-rp(il,i-1))/ & 2310 (1.0E4+2000.0*p(il,i-1)*rs(il,i-1)) 2375 afac1 = p(il, i)*(rs(il,i)-rp(il,i))/(1.0E4+2000.0*p(il,i)*rs(il,i)) 2376 afac2 = p(il, i-1)*(rs(il,i-1)-rp(il,i-1))/(1.0E4+2000.0*p(il,i-1)*rs(il,i-1)) 2311 2377 afac = 0.5*(afac1+afac2) 2312 2378 END IF … … 2315 2381 bfac = 1./(sigd(il)*wt(il,i)) 2316 2382 2317 ! jyg12318 2319 2320 2321 2322 2323 2324 2325 2326 2383 !JYG1 2384 ! cc sigt=1.0 2385 ! cc if(i.ge.icb)sigt=sigp(i) 2386 ! prise en compte de la variation progressive de sigt dans 2387 ! les couches icb et icb-1: 2388 ! pour plcl<ph(i+1), pr1=0 & pr2=1 2389 ! pour plcl>ph(i), pr1=1 & pr2=0 2390 ! pour ph(i+1)<plcl<ph(i), pr1 est la proportion a cheval 2391 ! sur le nuage, et pr2 est la proportion sous la base du 2392 ! nuage. 2327 2393 pr1 = (plcl(il)-ph(il,i+1))/(ph(il,i)-ph(il,i+1)) 2328 2394 pr1 = max(0., min(1.,pr1)) … … 2330 2396 pr2 = max(0., min(1.,pr2)) 2331 2397 sigt = sigp(il, i)*pr1 + pr2 2332 ! jyg2 2333 2334 ! jyg---- 2335 ! b6 = bfac*100.*sigd(il)*(ph(il,i)-ph(il,i+1))*sigt*afac 2336 ! c6 = water(il,i+1) + wdtrain(il)*bfac 2337 ! c6 = prec(il,i+1) + wdtrain(il)*bfac 2338 ! revap=0.5*(-b6+sqrt(b6*b6+4.*c6)) 2339 ! evap(il,i)=sigt*afac*revap 2340 ! water(il,i)=revap*revap 2341 ! prec(il,i)=revap*revap 2342 ! c print *,' i,b6,c6,revap,evap(il,i),water(il,i),wdtrain(il) 2343 ! ', 2344 ! c $ i,b6,c6,revap,evap(il,i),water(il,i),wdtrain(il) 2345 ! c---end jyg--- 2346 2347 ! --------retour à la formulation originale d'Emanuel. 2398 !JYG2 2399 2400 !JYG---- 2401 ! b6 = bfac*100.*sigd(il)*(ph(il,i)-ph(il,i+1))*sigt*afac 2402 ! c6 = water(il,i+1) + wdtrain(il)*bfac 2403 ! c6 = prec(il,i+1) + wdtrain(il)*bfac 2404 ! revap=0.5*(-b6+sqrt(b6*b6+4.*c6)) 2405 ! evap(il,i)=sigt*afac*revap 2406 ! water(il,i)=revap*revap 2407 ! prec(il,i)=revap*revap 2408 !! print *,' i,b6,c6,revap,evap(il,i),water(il,i),wdtrain(il) ', & 2409 !! i,b6,c6,revap,evap(il,i),water(il,i),wdtrain(il) 2410 !!---end jyg--- 2411 2412 ! --------retour à la formulation originale d'Emanuel. 2348 2413 IF (cvflag_ice) THEN 2349 2414 2350 !b6=bfac*50.*sigd(il)*(ph(il,i)-ph(il,i+1))*sigt*afac2351 ! c6=prec(il,i+1)+bfac*wdtrain(il) 2352 ! :-50.*sigd(il)*bfac*(ph(il,i)-ph(il,i+1))*evap(il,i+1)2353 !if(c6.gt.0.0)then2354 !revap=0.5*(-b6+sqrt(b6*b6+4.*c6))2355 2356 !JAM Attention: evap=sigt*E2357 !Modification: evap devient l'évaporation en milieu de couche2358 !car nécessaire dans cv3_yield2359 !Du coup, il faut modifier pas mal d'équations...2360 !et l'expression de afac qui devient afac12361 !revap=sqrt((prec(i+1)+prec(i))/2)2415 ! b6=bfac*50.*sigd(il)*(ph(il,i)-ph(il,i+1))*sigt*afac 2416 ! c6=prec(il,i+1)+bfac*wdtrain(il) & 2417 ! -50.*sigd(il)*bfac*(ph(il,i)-ph(il,i+1))*evap(il,i+1) 2418 ! if(c6.gt.0.0)then 2419 ! revap=0.5*(-b6+sqrt(b6*b6+4.*c6)) 2420 2421 !JAM Attention: evap=sigt*E 2422 ! Modification: evap devient l'évaporation en milieu de couche 2423 ! car nécessaire dans cv3_yield 2424 ! Du coup, il faut modifier pas mal d'équations... 2425 ! et l'expression de afac qui devient afac1 2426 ! revap=sqrt((prec(i+1)+prec(i))/2) 2362 2427 2363 2428 b6 = bfac*50.*sigd(il)*(ph(il,i)-ph(il,i+1))*sigt*afac1 2364 2429 c6 = prec(il, i+1) + 0.5*bfac*wdtrain(il) 2365 2366 2367 2430 ! print *,'bfac,sigd(il),sigt,afac1 ',bfac,sigd(il),sigt,afac1 2431 ! print *,'prec(il,i+1),wdtrain(il) ',prec(il,i+1),wdtrain(il) 2432 ! print *,'b6,c6,b6*b6+4.*c6 ',b6,c6,b6*b6+4.*c6 2368 2433 IF (c6>b6*b6+1.E-20) THEN 2369 2434 revap = 2.*c6/(b6+sqrt(b6*b6+4.*c6)) … … 2372 2437 END IF 2373 2438 prec(il, i) = max(0., 2.*revap*revap-prec(il,i+1)) 2374 ! print*,prec(il,i),'neige' 2375 2376 ! jyg Dans sa formulation originale, Emanuel calcule 2377 ! l'evaporation par: 2378 ! c evap(il,i)=sigt*afac*revap 2379 ! ce qui n'est pas correct. Dans cv_routines, la formulation a été 2380 ! modifiee. 2381 ! Ici,l'evaporation evap est simplement calculee par l'equation de 2382 ! conservation. 2383 ! prec(il,i)=revap*revap 2384 ! else 2385 ! jyg---- Correction : si c6 <= 0, water(il,i)=0. 2386 ! prec(il,i)=0. 2387 ! endif 2388 2389 ! jyg--- Dans tous les cas, evaporation = [tt ce qui entre dans 2390 ! la couche i] 2391 ! moins [tt ce qui sort de la couche i] 2392 ! print *, 'evap avec ice' 2393 evap(il, i) = (wdtrain(il)+sigd(il)*wt(il,i)*(prec(il,i+1)-prec(il, & 2394 i)))/(sigd(il)*(ph(il,i)-ph(il,i+1))*100.) 2395 2396 d6 = bfac*wdtrain(il) - 100.*sigd(il)*bfac*(ph(il,i)-ph(il,i+1))* & 2397 evap(il, i) 2439 ! print*,prec(il,i),'neige' 2440 2441 !JYG Dans sa formulation originale, Emanuel calcule l'evaporation par: 2442 ! c evap(il,i)=sigt*afac*revap 2443 ! ce qui n'est pas correct. Dans cv_routines, la formulation a été modifiee. 2444 ! Ici,l'evaporation evap est simplement calculee par l'equation de 2445 ! conservation. 2446 ! prec(il,i)=revap*revap 2447 ! else 2448 !JYG---- Correction : si c6 <= 0, water(il,i)=0. 2449 ! prec(il,i)=0. 2450 ! endif 2451 2452 !JYG--- Dans tous les cas, evaporation = [tt ce qui entre dans la couche i] 2453 ! moins [tt ce qui sort de la couche i] 2454 ! print *, 'evap avec ice' 2455 evap(il, i) = (wdtrain(il)+sigd(il)*wt(il,i)*(prec(il,i+1)-prec(il,i))) / & 2456 (sigd(il)*(ph(il,i)-ph(il,i+1))*100.) 2457 2458 d6 = bfac*wdtrain(il) - 100.*sigd(il)*bfac*(ph(il,i)-ph(il,i+1))*evap(il, i) 2398 2459 e6 = bfac*wdtrain(il) 2399 2460 f6 = -100.*sigd(il)*bfac*(ph(il,i)-ph(il,i+1))*evap(il, i) … … 2415 2476 END IF 2416 2477 2417 !water(il,i)=water(il,i+1)+(1.-fraci(il,i))*e6+(1.-faci(il,i))*f62418 !water(il,i)=max(water(il,i),0.)2419 !ice(il,i)=ice(il,i+1)+fraci(il,i)*e6+faci(il,i)*f62420 !ice(il,i)=max(ice(il,i),0.)2421 !fondue(il,i)=ice(il,i)*thaw2422 !water(il,i)=water(il,i)+fondue(il,i)2423 !ice(il,i)=ice(il,i)-fondue(il,i)2424 2425 !if((water(il,i)+ice(il,i)).lt.1.e-30)then2426 !faci(il,i)=0.2427 !else2428 !faci(il,i)=ice(il,i)/(water(il,i)+ice(il,i))2429 !endif2478 ! water(il,i)=water(il,i+1)+(1.-fraci(il,i))*e6+(1.-faci(il,i))*f6 2479 ! water(il,i)=max(water(il,i),0.) 2480 ! ice(il,i)=ice(il,i+1)+fraci(il,i)*e6+faci(il,i)*f6 2481 ! ice(il,i)=max(ice(il,i),0.) 2482 ! fondue(il,i)=ice(il,i)*thaw 2483 ! water(il,i)=water(il,i)+fondue(il,i) 2484 ! ice(il,i)=ice(il,i)-fondue(il,i) 2485 2486 ! if((water(il,i)+ice(il,i)).lt.1.e-30)then 2487 ! faci(il,i)=0. 2488 ! else 2489 ! faci(il,i)=ice(il,i)/(water(il,i)+ice(il,i)) 2490 ! endif 2430 2491 2431 2492 ELSE 2432 2493 b6 = bfac*50.*sigd(il)*(ph(il,i)-ph(il,i+1))*sigt*afac 2433 c6 = water(il, i+1) + bfac*wdtrain(il) - 50.*sigd(il)*bfac*(ph(il,i&2434 )-ph(il,i+1))*evap(il, i+1)2494 c6 = water(il, i+1) + bfac*wdtrain(il) - & 2495 50.*sigd(il)*bfac*(ph(il,i)-ph(il,i+1))*evap(il, i+1) 2435 2496 IF (c6>0.0) THEN 2436 2497 revap = 0.5*(-b6+sqrt(b6*b6+4.*c6)) … … 2439 2500 water(il, i) = 0. 2440 2501 END IF 2441 2442 evap(il, i) = (wdtrain(il)+sigd(il)*wt(il,i)*(water(il, &2443 i+1)-water(il,i)))/(sigd(il)*(ph(il,i)-ph(il,i+1))*100.)2502 ! print *, 'evap sans ice' 2503 evap(il, i) = (wdtrain(il)+sigd(il)*wt(il,i)*(water(il,i+1)-water(il,i)))/ & 2504 (sigd(il)*(ph(il,i)-ph(il,i+1))*100.) 2444 2505 2445 2506 END IF 2446 2507 END IF !(i.le.inb(il) .and. lwork(il)) 2447 2508 END DO 2448 2449 2450 2451 2452 2509 ! ---------------------------------------------------------------- 2510 2511 ! cc 2512 ! *** calculate precipitating downdraft mass flux under *** 2513 ! *** hydrostatic approximation *** 2453 2514 2454 2515 DO il = 1, ncum … … 2459 2520 IF (cvflag_ice) THEN 2460 2521 IF (cvflag_grav) THEN 2461 mp(il, i) = 100.*ginv*(lvcp(il,i)*sigd(il)*tevap(il)*(p(il, & 2462 i-1)-p(il,i))/delth+lfcp(il,i)*sigd(il)*faci(il,i)*tevap(il)*(p & 2463 (il,i-1)-p(il,i))/delth+lfcp(il,i)*sigd(il)*wt(il,i)/100.* & 2464 fondue(il,i)*(p(il,i-1)-p(il,i))/delth/(ph(il,i)-ph(il,i+1))) 2522 mp(il, i) = 100.*ginv*(lvcp(il,i)*sigd(il)*tevap(il)* & 2523 (p(il,i-1)-p(il,i))/delth + & 2524 lfcp(il,i)*sigd(il)*faci(il,i)*tevap(il)* & 2525 (p(il,i-1)-p(il,i))/delth + & 2526 lfcp(il,i)*sigd(il)*wt(il,i)/100.*fondue(il,i)* & 2527 (p(il,i-1)-p(il,i))/delth/(ph(il,i)-ph(il,i+1))) 2465 2528 ELSE 2466 mp(il, i) = 10.*(lvcp(il,i)*sigd(il)*tevap(il)*(p(il,i-1)-p(il, & 2467 i))/delth+lfcp(il,i)*sigd(il)*faci(il,i)*tevap(il)*(p(il, & 2468 i-1)-p(il,i))/delth+lfcp(il,i)*sigd(il)*wt(il,i)/100.*fondue(il & 2469 ,i)*(p(il,i-1)-p(il,i))/delth/(ph(il,i)-ph(il,i+1))) 2529 mp(il, i) = 10.*(lvcp(il,i)*sigd(il)*tevap(il)* & 2530 (p(il,i-1)-p(il,i))/delth + & 2531 lfcp(il,i)*sigd(il)*faci(il,i)*tevap(il)* & 2532 (p(il,i-1)-p(il,i))/delth + & 2533 lfcp(il,i)*sigd(il)*wt(il,i)/100.*fondue(il,i)* & 2534 (p(il,i-1)-p(il,i))/delth/(ph(il,i)-ph(il,i+1))) 2470 2535 2471 2536 END IF … … 2473 2538 IF (cvflag_grav) THEN 2474 2539 mp(il, i) = 100.*ginv*lvcp(il, i)*sigd(il)*tevap(il)* & 2475 (p(il,i-1)-p(il,i))/delth2540 (p(il,i-1)-p(il,i))/delth 2476 2541 ELSE 2477 2542 mp(il, i) = 10.*lvcp(il, i)*sigd(il)*tevap(il)* & 2478 (p(il,i-1)-p(il,i))/delth2543 (p(il,i-1)-p(il,i))/delth 2479 2544 END IF 2480 2545 … … 2483 2548 END IF !(i.le.inb(il) .and. lwork(il) .and. i.ne.1) 2484 2549 END DO 2485 2486 2487 2488 2489 2550 ! ---------------------------------------------------------------- 2551 2552 ! *** if hydrostatic assumption fails, *** 2553 ! *** solve cubic difference equation for downdraft theta *** 2554 ! *** and mass flux from two simultaneous differential eqns *** 2490 2555 2491 2556 DO il = 1, ncum … … 2493 2558 2494 2559 amfac = sigd(il)*sigd(il)*70.0*ph(il, i)*(p(il,i-1)-p(il,i))* & 2495 (th(il,i)-th(il,i-1))/(tv(il,i)*th(il,i))2560 (th(il,i)-th(il,i-1))/(tv(il,i)*th(il,i)) 2496 2561 amp2 = abs(mp(il,i+1)*mp(il,i+1)-mp(il,i)*mp(il,i)) 2497 2562 2498 2563 IF (amp2>(0.1*amfac)) THEN 2499 2564 xf = 100.0*sigd(il)*sigd(il)*sigd(il)*(ph(il,i)-ph(il,i+1)) 2500 tf = b(il, i) - 5.0*(th(il,i)-th(il,i-1))*t(il, i) /(lvcp(il,i)*sigd&2501 (il)*th(il,i))2565 tf = b(il, i) - 5.0*(th(il,i)-th(il,i-1))*t(il, i) / & 2566 (lvcp(il,i)*sigd(il)*th(il,i)) 2502 2567 af = xf*tf + mp(il, i+1)*mp(il, i+1)*tinv 2503 2568 2504 2569 IF (cvflag_ice) THEN 2505 2570 bf = 2.*(tinv*mp(il,i+1))**3 + tinv*mp(il, i+1)*xf*tf + & 2506 50.*(p(il,i-1)-p(il,i))*xf*(tevap(il)*(1.+(lf(il,i)/lv(il,i))* & 2507 faci(il,i))+(lf(il,i)/lv(il,i))*wt(il,i)/100.*fondue(il,i)/(ph( & 2508 il,i)-ph(il,i+1))) 2571 50.*(p(il,i-1)-p(il,i))*xf*(tevap(il)*(1.+(lf(il,i)/lv(il,i))*faci(il,i)) + & 2572 (lf(il,i)/lv(il,i))*wt(il,i)/100.*fondue(il,i)/(ph(il,i)-ph(il,i+1))) 2509 2573 ELSE 2510 2574 2511 2575 bf = 2.*(tinv*mp(il,i+1))**3 + tinv*mp(il, i+1)*xf*tf + & 2512 50.*(p(il,i-1)-p(il,i))*xf*tevap(il)2576 50.*(p(il,i-1)-p(il,i))*xf*tevap(il) 2513 2577 END IF 2514 2578 … … 2522 2586 IF ((0.5*bf-sru)<0.0) fac = -1.0 2523 2587 mp(il, i) = mp(il, i+1)*tinv + (0.5*bf+sru)**tinv + & 2524 fac*(abs(0.5*bf-sru))**tinv2588 fac*(abs(0.5*bf-sru))**tinv 2525 2589 ELSE 2526 2590 d = atan(2.*sqrt(-ur)/(bf+1.0E-28)) … … 2532 2596 IF (cvflag_ice) THEN 2533 2597 IF (cvflag_grav) THEN 2534 ! jyg : il y a vraisemblablement une erreur dans la ligne 2 2535 ! suivante: 2536 ! il faut diviser par (mp(il,i)*sigd(il)*grav) et non par 2537 ! (mp(il,i)+sigd(il)*0.1).2538 ! Et il faut bien revoir les facteurs 100.2539 b(il, i-1) = b(il, i) + 100.0*(p(il,i-1)-p(il,i))*(tevap(il)*(&2540 1.+(lf(il,i)/lv(il,i))*faci(il,i))+(lf(il,i)/lv(il,&2541 i))*wt(il,i)/100.*fondue(il,i)/(ph(il,i)-ph(il,&2542 i+1)))/(mp(il,i)+sigd(il)*0.1) - 10.0*(th(il,i)-th(il,i-1))*t&2543 (il, i)/(lvcp(il,i)*sigd(il)*th(il,i))2598 !JYG : il y a vraisemblablement une erreur dans la ligne 2 suivante: 2599 ! il faut diviser par (mp(il,i)*sigd(il)*grav) et non par (mp(il,i)+sigd(il)*0.1). 2600 ! Et il faut bien revoir les facteurs 100. 2601 b(il, i-1) = b(il, i) + 100.0*(p(il,i-1)-p(il,i))* & 2602 (tevap(il)*(1.+(lf(il,i)/lv(il,i))*faci(il,i)) + & 2603 (lf(il,i)/lv(il,i))*wt(il,i)/100.*fondue(il,i) / & 2604 (ph(il,i)-ph(il,i+1))) / & 2605 (mp(il,i)+sigd(il)*0.1) - & 2606 10.0*(th(il,i)-th(il,i-1))*t(il, i) / & 2607 (lvcp(il,i)*sigd(il)*th(il,i)) 2544 2608 ELSE 2545 b(il, i-1) = b(il, i) + 100.0*(p(il,i-1)-p(il,i))*(tevap(il)*( & 2546 1.+(lf(il,i)/lv(il,i))*faci(il,i))+(lf(il,i)/lv(il, & 2547 i))*wt(il,i)/100.*fondue(il,i)/(ph(il,i)-ph(il, & 2548 i+1)))/(mp(il,i)+sigd(il)*0.1) - 10.0*(th(il,i)-th(il,i-1))*t & 2549 (il, i)/(lvcp(il,i)*sigd(il)*th(il,i)) 2609 b(il, i-1) = b(il, i) + 100.0*(p(il,i-1)-p(il,i))*& 2610 (tevap(il)*(1.+(lf(il,i)/lv(il,i))*faci(il,i)) + & 2611 (lf(il,i)/lv(il,i))*wt(il,i)/100.*fondue(il,i) / & 2612 (ph(il,i)-ph(il,i+1))) / & 2613 (mp(il,i)+sigd(il)*0.1) - & 2614 10.0*(th(il,i)-th(il,i-1))*t(il, i) / & 2615 (lvcp(il,i)*sigd(il)*th(il,i)) 2550 2616 END IF 2551 2617 ELSE 2552 2618 IF (cvflag_grav) THEN 2553 b(il, i-1) = b(il, i) + 100.0*(p(il,i-1)-p(il,i))*tevap(il)/(mp & 2554 (il,i)+sigd(il)*0.1) - 10.0*(th(il,i)-th(il,i-1))*t(il, i)/( & 2555 lvcp(il,i)*sigd(il)*th(il,i)) 2619 b(il, i-1) = b(il, i) + 100.0*(p(il,i-1)-p(il,i))*tevap(il) / & 2620 (mp(il,i)+sigd(il)*0.1) - & 2621 10.0*(th(il,i)-th(il,i-1))*t(il, i) / & 2622 (lvcp(il,i)*sigd(il)*th(il,i)) 2556 2623 ELSE 2557 b(il, i-1) = b(il, i) + 100.0*(p(il,i-1)-p(il,i))*tevap(il)/(mp & 2558 (il,i)+sigd(il)*0.1) - 10.0*(th(il,i)-th(il,i-1))*t(il, i)/( & 2559 lvcp(il,i)*sigd(il)*th(il,i)) 2624 b(il, i-1) = b(il, i) + 100.0*(p(il,i-1)-p(il,i))*tevap(il) / & 2625 (mp(il,i)+sigd(il)*0.1) - & 2626 10.0*(th(il,i)-th(il,i-1))*t(il, i) / & 2627 (lvcp(il,i)*sigd(il)*th(il,i)) 2560 2628 END IF 2561 2629 END IF … … 2564 2632 END IF !(amp2.gt.(0.1*amfac)) 2565 2633 2566 2634 ! *** limit magnitude of mp(i) to meet cfl condition *** 2567 2635 2568 2636 ampmax = 2.0*(ph(il,i)-ph(il,i+1))*delti … … 2571 2639 mp(il, i) = min(mp(il,i), ampmax) 2572 2640 2573 ! *** force mp to decrease linearly to zero *** 2574 ! *** between cloud base and the surface *** 2575 2576 2577 ! c if(p(il,i).gt.p(il,icb(il)))then 2578 ! c 2579 ! mp(il,i)=mp(il,icb(il))*(p(il,1)-p(il,i))/(p(il,1)-p(il,icb(il))) 2580 ! c endif 2641 ! *** force mp to decrease linearly to zero *** 2642 ! *** between cloud base and the surface *** 2643 2644 2645 ! c if(p(il,i).gt.p(il,icb(il)))then 2646 ! c mp(il,i)=mp(il,icb(il))*(p(il,1)-p(il,i))/(p(il,1)-p(il,icb(il))) 2647 ! c endif 2581 2648 IF (ph(il,i)>0.9*plcl(il)) THEN 2582 2649 mp(il, i) = mp(il, i)*(ph(il,1)-ph(il,i))/(ph(il,1)-0.9*plcl(il)) … … 2585 2652 END IF ! (i.le.inb(il) .and. lwork(il) .and. i.ne.1) 2586 2653 END DO 2587 2588 2589 2654 ! ---------------------------------------------------------------- 2655 2656 ! *** find mixing ratio of precipitating downdraft *** 2590 2657 2591 2658 DO il = 1, ncum … … 2603 2670 2604 2671 IF (cvflag_grav) THEN 2605 rp(il, i) = rp(il, i+1)*mp(il, i+1) + rr(il, i)*(mp(il,i)-mp(il,i & 2606 +1)) + 100.*ginv*0.5*sigd(il)*(ph(il,i)-ph(il,i+1))*(evap(il,i+ & 2607 1)+evap(il,i)) 2672 rp(il, i) = rp(il, i+1)*mp(il, i+1) + rr(il, i)*(mp(il,i)-mp(il,i+1)) + & 2673 100.*ginv*0.5*sigd(il)*(ph(il,i)-ph(il,i+1))*(evap(il,i+1)+evap(il,i)) 2608 2674 ELSE 2609 rp(il, i) = rp(il, i+1)*mp(il, i+1) + rr(il, i)*(mp(il,i)-mp(il,i & 2610 +1)) + 5.*sigd(il)*(ph(il,i)-ph(il,i+1))*(evap(il,i+1)+evap(il, & 2611 i)) 2675 rp(il, i) = rp(il, i+1)*mp(il, i+1) + rr(il, i)*(mp(il,i)-mp(il,i+1)) + & 2676 5.*sigd(il)*(ph(il,i)-ph(il,i+1))*(evap(il,i+1)+evap(il,i)) 2612 2677 END IF 2613 2678 rp(il, i) = rp(il, i)/mp(il, i) 2614 up(il, i) = up(il, i+1)*mp(il, i+1) + u(il, i)*(mp(il,i)-mp(il,i+1) & 2615 ) 2679 up(il, i) = up(il, i+1)*mp(il, i+1) + u(il, i)*(mp(il,i)-mp(il,i+1)) 2616 2680 up(il, i) = up(il, i)/mp(il, i) 2617 vp(il, i) = vp(il, i+1)*mp(il, i+1) + v(il, i)*(mp(il,i)-mp(il,i+1) & 2618 ) 2681 vp(il, i) = vp(il, i+1)*mp(il, i+1) + v(il, i)*(mp(il,i)-mp(il,i+1)) 2619 2682 vp(il, i) = vp(il, i)/mp(il, i) 2620 2683 … … 2623 2686 IF (mp(il,i+1)>1.0E-16) THEN 2624 2687 IF (cvflag_grav) THEN 2625 rp(il, i) = rp(il, i+1) + 100.*ginv*0.5*sigd(il)*(ph(il,i)-ph(&2626 il,i+1))*(evap(il,i+1)+evap(il,i))/mp(il,i+1)2688 rp(il, i) = rp(il,i+1) + 100.*ginv*0.5*sigd(il)*(ph(il,i)-ph(il,i+1)) * & 2689 (evap(il,i+1)+evap(il,i))/mp(il,i+1) 2627 2690 ELSE 2628 rp(il, i) = rp(il, i+1) + 5.*sigd(il)*(ph(il,i)-ph(il,i+1))*(&2629 evap(il,i+1)+evap(il,i))/mp(il, i+1)2691 rp(il, i) = rp(il,i+1) + 5.*sigd(il)*(ph(il,i)-ph(il,i+1)) * & 2692 (evap(il,i+1)+evap(il,i))/mp(il, i+1) 2630 2693 END IF 2631 2694 up(il, i) = up(il, i+1) … … 2639 2702 END IF ! (i.lt.inb(il) .and. lwork(il)) 2640 2703 END DO 2641 2642 2643 2644 2645 !AC! do j=1,ntra2646 !AC! do il = 1,ncum2647 !AC! if (i.lt.inb(il) .and. lwork(il)) then2648 !AC!c2649 !AC! if(mplus(il))then2650 !AC! trap(il,i,j)=trap(il,i+1,j)*mp(il,i+1)2651 !AC! : +trap(il,i,j)*(mp(il,i)-mp(il,i+1))2652 !AC! trap(il,i,j)=trap(il,i,j)/mp(il,i)2653 !AC! else ! if (mplus(il))2654 !AC! if(mp(il,i+1).gt.1.0e-16)then2655 !AC! trap(il,i,j)=trap(il,i+1,j)2656 !AC! endif2657 !AC! endif ! (mplus(il)) else if (.not.mplus(il))2658 !AC!c2659 !AC! endif ! (i.lt.inb(il) .and. lwork(il))2660 !AC! enddo2661 !AC! end do2704 ! ---------------------------------------------------------------- 2705 2706 ! *** find tracer concentrations in precipitating downdraft *** 2707 2708 !AC! do j=1,ntra 2709 !AC! do il = 1,ncum 2710 !AC! if (i.lt.inb(il) .and. lwork(il)) then 2711 !AC!c 2712 !AC! if(mplus(il))then 2713 !AC! trap(il,i,j)=trap(il,i+1,j)*mp(il,i+1) 2714 !AC! : +trap(il,i,j)*(mp(il,i)-mp(il,i+1)) 2715 !AC! trap(il,i,j)=trap(il,i,j)/mp(il,i) 2716 !AC! else ! if (mplus(il)) 2717 !AC! if(mp(il,i+1).gt.1.0e-16)then 2718 !AC! trap(il,i,j)=trap(il,i+1,j) 2719 !AC! endif 2720 !AC! endif ! (mplus(il)) else if (.not.mplus(il)) 2721 !AC!c 2722 !AC! endif ! (i.lt.inb(il) .and. lwork(il)) 2723 !AC! enddo 2724 !AC! end do 2662 2725 2663 2726 400 END DO 2664 2665 2666 2667 2668 2727 ! ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2728 2729 ! *** end of downdraft loop *** 2730 2731 ! ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2669 2732 2670 2733 … … 2672 2735 END SUBROUTINE cv3_unsat 2673 2736 2674 SUBROUTINE cv3_yield(nloc, ncum, nd, na, ntra, icb, inb, delt, t, rr, t_wake, & 2675 rr_wake, s_wake, u, v, tra, gz, p, ph, h, hp, lv, lf, cpn, th, th_wake, & 2676 ep, clw, m, tp, mp, rp, up, vp, trap, wt, water, ice, evap, fondue, faci, & 2677 b, sigd, ment, qent, hent, iflag_mix, uent, vent, nent, elij, traent, & 2678 sig, tv, tvp, wghti, iflag, precip, vprecip, ft, fr, fu, fv, ftra, cbmf, & 2679 upwd, dnwd, dnwd0, ma, mip, tls, tps, qcondc, wd, ftd, fqd) 2737 SUBROUTINE cv3_yield(nloc, ncum, nd, na, ntra, ok_conserv_q, & 2738 icb, inb, delt, & 2739 t, rr, t_wake, rr_wake, s_wake, u, v, tra, & 2740 gz, p, ph, h, hp, lv, lf, cpn, th, th_wake, & 2741 ep, clw, m, tp, mp, rp, up, vp, trap, & 2742 wt, water, ice, evap, fondue, faci, b, sigd, & 2743 ment, qent, hent, iflag_mix, uent, vent, & 2744 nent, elij, traent, sig, & 2745 tv, tvp, wghti, & 2746 iflag, precip, Vprecip, ft, fr, fu, fv, ftra, & 2747 cbmf, upwd, dnwd, dnwd0, ma, mip, & 2748 tls, tps, qcondc, wd, & 2749 ftd, fqd) 2680 2750 2681 2751 IMPLICIT NONE … … 2686 2756 include "conema3.h" 2687 2757 2688 ! inputs: 2689 ! print*,'cv3_yield apres include' 2690 INTEGER iflag_mix 2691 INTEGER ncum, nd, na, ntra, nloc 2692 INTEGER icb(nloc), inb(nloc) 2693 REAL delt 2694 REAL t(nloc, nd), rr(nloc, nd), u(nloc, nd), v(nloc, nd) 2695 REAL t_wake(nloc, nd), rr_wake(nloc, nd) 2696 REAL s_wake(nloc) 2697 REAL tra(nloc, nd, ntra), sig(nloc, nd) 2698 REAL gz(nloc, na), ph(nloc, nd+1), h(nloc, na), hp(nloc, na) 2699 REAL th(nloc, na), p(nloc, nd), tp(nloc, na) 2700 REAL lv(nloc, na), cpn(nloc, na), ep(nloc, na), clw(nloc, na) 2701 REAL lf(nloc, na) 2702 REAL m(nloc, na), mp(nloc, na), rp(nloc, na), up(nloc, na) 2703 REAL vp(nloc, na), wt(nloc, nd), trap(nloc, nd, ntra) 2704 REAL water(nloc, na), evap(nloc, na), b(nloc, na), sigd(nloc) 2705 REAL fondue(nloc, na), faci(nloc, na), ice(nloc, na) 2706 REAL ment(nloc, na, na), qent(nloc, na, na), uent(nloc, na, na) 2707 REAL hent(nloc, na, na) 2708 ! IM bug real vent(nloc,na,na), nent(nloc,na), elij(nloc,na,na) 2709 REAL vent(nloc, na, na), elij(nloc, na, na) 2710 INTEGER nent(nloc, nd) 2711 REAL traent(nloc, na, na, ntra) 2712 REAL tv(nloc, nd), tvp(nloc, nd), wghti(nloc, nd) 2713 ! print*,'cv3_yield declarations 1' 2714 ! input/output: 2715 INTEGER iflag(nloc) 2716 2717 ! outputs: 2718 REAL precip(nloc) 2719 REAL ft(nloc, nd), fr(nloc, nd), fu(nloc, nd), fv(nloc, nd) 2720 REAL ftd(nloc, nd), fqd(nloc, nd) 2721 REAL ftra(nloc, nd, ntra) 2722 REAL upwd(nloc, nd), dnwd(nloc, nd), ma(nloc, nd) 2723 REAL dnwd0(nloc, nd), mip(nloc, nd) 2724 REAL vprecip(nloc, nd+1) 2725 REAL tls(nloc, nd), tps(nloc, nd) 2726 REAL qcondc(nloc, nd) ! cld 2727 REAL wd(nloc) ! gust 2728 REAL cbmf(nloc) 2729 ! print*,'cv3_yield declarations 2' 2730 ! local variables: 2731 INTEGER i, k, il, n, j, num1 2732 REAL rat, delti 2733 REAL ax, bx, cx, dx, ex 2734 REAL cpinv, rdcp, dpinv 2735 REAL awat(nloc) 2736 REAL lvcp(nloc, na), lfcp(nloc, na), mke(nloc, na) 2737 REAL am(nloc), work(nloc), ad(nloc), amp1(nloc) 2738 ! !! real up1(nloc), dn1(nloc) 2739 REAL up1(nloc, nd, nd), dn1(nloc, nd, nd) 2740 REAL asum(nloc), bsum(nloc), csum(nloc), dsum(nloc) 2741 REAL esum(nloc), fsum(nloc), gsum(nloc), hsum(nloc) 2742 REAL th_wake(nloc, nd) 2743 REAL alpha_qpos(nloc), alpha_qpos1(nloc) 2744 REAL qcond(nloc, nd), nqcond(nloc, nd), wa(nloc, nd) ! cld 2745 REAL siga(nloc, nd), sax(nloc, nd), mac(nloc, nd) ! cld 2746 2747 ! print*,'cv3_yield declarations 3' 2748 ! ------------------------------------------------------------- 2749 2750 ! initialization: 2758 !inputs: 2759 INTEGER iflag_mix 2760 INTEGER ncum, nd, na, ntra, nloc 2761 LOGICAL ok_conserv_q 2762 INTEGER icb(nloc), inb(nloc) 2763 REAL delt 2764 REAL t(nloc, nd), rr(nloc, nd), u(nloc, nd), v(nloc, nd) 2765 REAL t_wake(nloc, nd), rr_wake(nloc, nd) 2766 REAL s_wake(nloc) 2767 REAL tra(nloc, nd, ntra), sig(nloc, nd) 2768 REAL gz(nloc, na), ph(nloc, nd+1), h(nloc, na), hp(nloc, na) 2769 REAL th(nloc, na), p(nloc, nd), tp(nloc, na) 2770 REAL lv(nloc, na), cpn(nloc, na), ep(nloc, na), clw(nloc, na) 2771 REAL lf(nloc, na) 2772 REAL m(nloc, na), mp(nloc, na), rp(nloc, na), up(nloc, na) 2773 REAL vp(nloc, na), wt(nloc, nd), trap(nloc, nd, ntra) 2774 REAL water(nloc, na), evap(nloc, na), b(nloc, na), sigd(nloc) 2775 REAL fondue(nloc, na), faci(nloc, na), ice(nloc, na) 2776 REAL ment(nloc, na, na), qent(nloc, na, na), uent(nloc, na, na) 2777 REAL hent(nloc, na, na) 2778 !IM bug real vent(nloc,na,na), nent(nloc,na), elij(nloc,na,na) 2779 REAL vent(nloc, na, na), elij(nloc, na, na) 2780 INTEGER nent(nloc, nd) 2781 REAL traent(nloc, na, na, ntra) 2782 REAL tv(nloc, nd), tvp(nloc, nd), wghti(nloc, nd) 2783 ! 2784 !input/output: 2785 INTEGER iflag(nloc) 2786 ! 2787 !outputs: 2788 REAL precip(nloc) 2789 REAL ft(nloc, nd), fr(nloc, nd), fu(nloc, nd), fv(nloc, nd) 2790 REAL ftd(nloc, nd), fqd(nloc, nd) 2791 REAL ftra(nloc, nd, ntra) 2792 REAL upwd(nloc, nd), dnwd(nloc, nd), ma(nloc, nd) 2793 REAL dnwd0(nloc, nd), mip(nloc, nd) 2794 REAL Vprecip(nloc, nd+1) 2795 REAL tls(nloc, nd), tps(nloc, nd) 2796 REAL qcondc(nloc, nd) ! cld 2797 REAL wd(nloc) ! gust 2798 REAL cbmf(nloc) 2799 ! 2800 !local variables: 2801 INTEGER i, k, il, n, j, num1 2802 REAL rat, delti 2803 REAL ax, bx, cx, dx, ex 2804 REAL cpinv, rdcp, dpinv 2805 REAL awat(nloc) 2806 REAL lvcp(nloc, na), lfcp(nloc, na), mke(nloc, na) 2807 REAL am(nloc), work(nloc), ad(nloc), amp1(nloc) 2808 !! real up1(nloc), dn1(nloc) 2809 REAL up1(nloc, nd, nd), dn1(nloc, nd, nd) 2810 REAL asum(nloc), bsum(nloc), csum(nloc), dsum(nloc) 2811 REAL esum(nloc), fsum(nloc), gsum(nloc), hsum(nloc) 2812 REAL th_wake(nloc, nd) 2813 REAL alpha_qpos(nloc), alpha_qpos1(nloc) 2814 REAL qcond(nloc, nd), nqcond(nloc, nd), wa(nloc, nd) ! cld 2815 REAL siga(nloc, nd), sax(nloc, nd), mac(nloc, nd) ! cld 2816 2817 REAL sumdq !jyg 2818 ! 2819 ! ------------------------------------------------------------- 2820 2821 ! initialization: 2751 2822 2752 2823 delti = 1.0/delt 2753 ! print*,'cv3_yield initialisation delt', delt 2754 ! precip,Vprecip,ft,fr,fu,fv,ftra 2755 ! : ,cbmf,upwd,dnwd,dnwd0,ma,mip 2756 ! : ,tls,tps,qcondc,wd 2757 ! : ,ftd,fqd ) 2824 ! print*,'cv3_yield initialisation delt', delt 2825 ! 2758 2826 DO il = 1, ncum 2759 2827 precip(il) = 0.0 2760 vprecip(il, nd+1) = 0.02828 Vprecip(il, nd+1) = 0.0 2761 2829 wd(il) = 0.0 ! gust 2762 2830 END DO … … 2764 2832 DO i = 1, nd 2765 2833 DO il = 1, ncum 2766 vprecip(il, i) = 0.02834 Vprecip(il, i) = 0.0 2767 2835 ft(il, i) = 0.0 2768 2836 fr(il, i) = 0.0 … … 2780 2848 END DO 2781 2849 END DO 2782 2783 !AC! do j=1,ntra2784 !AC! do i=1,nd2785 !AC! do il=1,ncum2786 !AC! ftra(il,i,j)=0.02787 !AC! enddo2788 !AC! enddo2789 !AC! enddo2790 2850 ! print*,'cv3_yield initialisation 2' 2851 !AC! do j=1,ntra 2852 !AC! do i=1,nd 2853 !AC! do il=1,ncum 2854 !AC! ftra(il,i,j)=0.0 2855 !AC! enddo 2856 !AC! enddo 2857 !AC! enddo 2858 ! print*,'cv3_yield initialisation 3' 2791 2859 DO i = 1, nl 2792 2860 DO il = 1, ncum … … 2798 2866 2799 2867 2800 2868 ! *** calculate surface precipitation in mm/day *** 2801 2869 2802 2870 DO il = 1, ncum 2803 2871 IF (ep(il,inb(il))>=0.0001 .AND. iflag(il)<=1) THEN 2804 2872 IF (cvflag_ice) THEN 2805 IF (cvflag_grav) THEN 2806 precip(il) = wt(il, 1)*sigd(il)*(water(il,1)+ice(il,1))*86400.* & 2807 1000./(rowl*grav) 2808 ELSE 2809 precip(il) = wt(il, 1)*sigd(il)*(water(il,1)+ice(il,1))*8640. 2810 END IF 2873 precip(il) = wt(il, 1)*sigd(il)*(water(il,1)+ice(il,1)) & 2874 *86400.*1000./(rowl*grav) 2811 2875 ELSE 2812 IF (cvflag_grav) THEN 2813 precip(il) = wt(il, 1)*sigd(il)*water(il, 1)*86400.*1000./ & 2814 (rowl*grav) 2815 ELSE 2816 precip(il) = wt(il, 1)*sigd(il)*water(il, 1)*8640. 2817 END IF 2876 precip(il) = wt(il, 1)*sigd(il)*water(il, 1) & 2877 *86400.*1000./(rowl*grav) 2818 2878 END IF 2819 2879 END IF 2820 2880 END DO 2821 2822 2823 2824 2881 ! print*,'cv3_yield apres calcul precip' 2882 2883 2884 ! === calculate vertical profile of precipitation in kg/m2/s === 2825 2885 2826 2886 DO i = 1, nl … … 2828 2888 IF (ep(il,inb(il))>=0.0001 .AND. i<=inb(il) .AND. iflag(il)<=1) THEN 2829 2889 IF (cvflag_ice) THEN 2830 IF (cvflag_grav) THEN 2831 vprecip(il, i) = wt(il, i)*sigd(il)*(water(il,i)+ice(il,i))/grav 2832 ELSE 2833 vprecip(il, i) = wt(il, i)*sigd(il)*(water(il,i)+ice(il,i))/10. 2834 END IF 2890 Vprecip(il, i) = wt(il, i)*sigd(il)*(water(il,i)+ice(il,i))/grav 2835 2891 ELSE 2836 IF (cvflag_grav) THEN 2837 vprecip(il, i) = wt(il, i)*sigd(il)*water(il, i)/grav 2838 ELSE 2839 vprecip(il, i) = wt(il, i)*sigd(il)*water(il, i)/10. 2840 END IF 2892 Vprecip(il, i) = wt(il, i)*sigd(il)*water(il, i)/grav 2841 2893 END IF 2842 2894 END IF … … 2845 2897 2846 2898 2847 2848 2849 2850 !! do il=1,ncum2851 ! ! wd(il)=betad*abs(mp(il,icb(il)))*0.01*rrd*t(il,icb(il)) 2852 ! ! :/(sigd(il)*p(il,icb(il)))2853 !! enddo2854 2855 2856 2857 2899 ! *** Calculate downdraft velocity scale *** 2900 ! *** NE PAS UTILISER POUR L'INSTANT *** 2901 2902 !! do il=1,ncum 2903 !! wd(il)=betad*abs(mp(il,icb(il)))*0.01*rrd*t(il,icb(il)) & 2904 !! /(sigd(il)*p(il,icb(il))) 2905 !! enddo 2906 2907 2908 ! *** calculate tendencies of lowest level potential temperature *** 2909 ! *** and mixing ratio *** 2858 2910 2859 2911 DO il = 1, ncum … … 2870 2922 END DO 2871 2923 2872 !print*,'cv3_yield avant ft'2873 ! AMis the part of cbmf taken from the first level2924 ! print*,'cv3_yield avant ft' 2925 ! am is the part of cbmf taken from the first level 2874 2926 DO il = 1, ncum 2875 2927 am(il) = cbmf(il)*wghti(il, 1) … … 2878 2930 DO il = 1, ncum 2879 2931 IF (iflag(il)<=1) THEN 2880 ! convect3 if((0.1*dpinv*am).ge.delti)iflag(il)=4 2881 ! jyg Correction pour conserver l'eau 2882 ! cc ft(il,1)=-0.5*lvcp(il,1)*sigd(il)*(evap(il,1)+evap(il,2)) 2883 ! !precip 2932 ! convect3 if((0.1*dpinv*am).ge.delti)iflag(il)=4 2933 !JYG Correction pour conserver l'eau 2934 ! cc ft(il,1)=-0.5*lvcp(il,1)*sigd(il)*(evap(il,1)+evap(il,2)) !precip 2884 2935 IF (cvflag_ice) THEN 2885 2936 ft(il, 1) = -lvcp(il, 1)*sigd(il)*evap(il, 1) - & 2886 lfcp(il, 1)*sigd(il)*evap(il, 1)*faci(il, 1) - &2887 lfcp(il, 1)*sigd(il)*(fondue(il,1)*wt(il,1))/(100.*(ph(il,1)-ph(il,&2888 2)))!precip2937 lfcp(il, 1)*sigd(il)*evap(il, 1)*faci(il, 1) - & 2938 lfcp(il, 1)*sigd(il)*(fondue(il,1)*wt(il,1)) / & 2939 (100.*(ph(il,1)-ph(il,2))) !precip 2889 2940 ELSE 2890 2941 ft(il, 1) = -lvcp(il, 1)*sigd(il)*evap(il, 1) 2891 2942 END IF 2892 2943 2893 IF (cvflag_grav) THEN 2894 ft(il, 1) = ft(il, 1) - 0.009*grav*sigd(il)*mp(il, 2)*t_wake(il, 1)*b & 2895 (il, 1)*work(il) 2944 ft(il, 1) = ft(il, 1) - 0.009*grav*sigd(il)*mp(il, 2)*t_wake(il, 1)*b(il, 1)*work(il) 2945 2946 IF (cvflag_ice) THEN 2947 ft(il, 1) = ft(il, 1) + 0.01*sigd(il)*wt(il, 1)*(cl-cpd)*water(il, 2) * & 2948 (t_wake(il,2)-t_wake(il,1))*work(il)/cpn(il, 1) + & 2949 0.01*sigd(il)*wt(il, 1)*(ci-cpd)*ice(il, 2) * & 2950 (t_wake(il,2)-t_wake(il,1))*work(il)/cpn(il, 1) 2896 2951 ELSE 2897 ft(il, 1) = ft(il, 1) - 0.09*sigd(il)*mp(il, 2)*t_wake(il, 1)*b(il, 1&2898 )*work(il)2952 ft(il, 1) = ft(il, 1) + 0.01*sigd(il)*wt(il, 1)*(cl-cpd)*water(il, 2) * & 2953 (t_wake(il,2)-t_wake(il,1))*work(il)/cpn(il, 1) 2899 2954 END IF 2900 2955 2901 IF (cvflag_ice) THEN 2902 ft(il, 1) = ft(il, 1) + 0.01*sigd(il)*wt(il, 1)*(cl-cpd)*water(il, 2) & 2903 *(t_wake(il,2)-t_wake(il,1))*work(il)/cpn(il, 1) + & 2904 0.01*sigd(il)*wt(il, 1)*(ci-cpd)*ice(il, 2)* & 2905 (t_wake(il,2)-t_wake(il,1))*work(il)/cpn(il, 1) 2906 ELSE 2907 ft(il, 1) = ft(il, 1) + 0.01*sigd(il)*wt(il, 1)*(cl-cpd)*water(il, 2) & 2908 *(t_wake(il,2)-t_wake(il,1))*work(il)/cpn(il, 1) 2909 END IF 2910 2911 ftd(il, 1) = ft(il, 1) ! fin precip 2912 2913 IF (cvflag_grav) THEN !sature 2914 IF ((0.01*grav*work(il)*am(il))>=delti) iflag(il) = 1 !consist vect 2915 ft(il, 1) = ft(il, 1) + 0.01*grav*work(il)*am(il)*(t(il,2)-t(il,1)+( & 2916 gz(il,2)-gz(il,1))/cpn(il,1)) 2917 ELSE 2918 IF ((0.1*work(il)*am(il))>=delti) iflag(il) = 1 !consistency vect 2919 ft(il, 1) = ft(il, 1) + 0.1*work(il)*am(il)*(t(il,2)-t(il,1)+(gz(il, & 2920 2)-gz(il,1))/cpn(il,1)) 2921 END IF 2956 ftd(il, 1) = ft(il, 1) ! fin precip 2957 2958 IF ((0.01*grav*work(il)*am(il))>=delti) iflag(il) = 1 !consist vect 2959 ft(il, 1) = ft(il, 1) + 0.01*grav*work(il)*am(il) * & 2960 (t(il,2)-t(il,1)+(gz(il,2)-gz(il,1))/cpn(il,1)) 2922 2961 END IF ! iflag 2923 2962 END DO … … 2927 2966 IF (iflag_mix>0) THEN 2928 2967 DO il = 1, ncum 2929 2968 ! FH WARNING a modifier : 2930 2969 cpinv = 0. 2931 2970 ! cpinv=1.0/cpn(il,1) 2932 2971 IF (j<=inb(il) .AND. iflag(il)<=1) THEN 2933 IF (cvflag_grav) THEN 2934 ft(il, 1) = ft(il, 1) + 0.01*grav*work(il)*ment(il, j, 1)*(hent( & 2935 il,j,1)-h(il,1)+t(il,1)*(cpv-cpd)*(rr(il,1)-qent(il,j, & 2936 1)))*cpinv 2937 ELSE 2938 ft(il, 1) = ft(il, 1) + 0.1*work(il)*ment(il, j, 1)*(hent(il,j,1) & 2939 -h(il,1)+t(il,1)*(cpv-cpd)*(rr(il,1)-qent(il,j,1)))*cpinv 2940 END IF ! cvflag_grav 2972 ft(il, 1) = ft(il, 1) + 0.01*grav*work(il)*ment(il, j, 1) * & 2973 (hent(il,j,1)-h(il,1)+t(il,1)*(cpv-cpd)*(rr(il,1)-qent(il,j,1)))*cpinv 2941 2974 END IF ! j 2942 2975 END DO 2943 2976 END IF 2944 2977 END DO 2945 2978 ! fin sature 2946 2979 2947 2980 2948 2981 DO il = 1, ncum 2949 2982 IF (iflag(il)<=1) THEN 2950 IF (cvflag_grav) THEN 2951 ! jyg1 Correction pour mieux conserver l'eau (conformite avec 2952 ! CONVECT4.3) 2953 fr(il, 1) = 0.01*grav*mp(il, 2)*(rp(il,2)-rr_wake(il,1))*work(il) + & 2954 sigd(il)*evap(il, 1) 2955 ! cc : +sigd(il)*0.5*(evap(il,1)+evap(il,2)) 2956 2957 fqd(il, 1) = fr(il, 1) !precip 2958 2959 fr(il, 1) = fr(il, 1) + 0.01*grav*am(il)*(rr(il,2)-rr(il,1))*work(il) !sature 2960 2961 fu(il, 1) = fu(il, 1) + 0.01*grav*work(il)*(mp(il,2)*(up(il,2)-u(il, & 2962 1))+am(il)*(u(il,2)-u(il,1))) 2963 fv(il, 1) = fv(il, 1) + 0.01*grav*work(il)*(mp(il,2)*(vp(il,2)-v(il, & 2964 1))+am(il)*(v(il,2)-v(il,1))) 2965 ELSE ! cvflag_grav 2966 fr(il, 1) = 0.1*mp(il, 2)*(rp(il,2)-rr_wake(il,1))*work(il) + & 2967 sigd(il)*evap(il, 1) 2968 ! cc : +sigd(il)*0.5*(evap(il,1)+evap(il,2)) 2969 fqd(il, 1) = fr(il, 1) !precip 2970 fr(il, 1) = fr(il, 1) + 0.1*am(il)*(rr(il,2)-rr(il,1))*work(il) 2971 fu(il, 1) = fu(il, 1) + 0.1*work(il)*(mp(il,2)*(up(il,2)-u(il, & 2972 1))+am(il)*(u(il,2)-u(il,1))) 2973 fv(il, 1) = fv(il, 1) + 0.1*work(il)*(mp(il,2)*(vp(il,2)-v(il, & 2974 1))+am(il)*(v(il,2)-v(il,1))) 2975 END IF ! cvflag_grav 2983 !JYG1 Correction pour mieux conserver l'eau (conformite avec CONVECT4.3) 2984 fr(il, 1) = 0.01*grav*mp(il, 2)*(rp(il,2)-rr_wake(il,1))*work(il) + & 2985 sigd(il)*evap(il, 1) 2986 !!! sigd(il)*0.5*(evap(il,1)+evap(il,2)) 2987 2988 fqd(il, 1) = fr(il, 1) !precip 2989 2990 fr(il, 1) = fr(il, 1) + 0.01*grav*am(il)*(rr(il,2)-rr(il,1))*work(il) !sature 2991 2992 fu(il, 1) = fu(il, 1) + 0.01*grav*work(il)*(mp(il,2)*(up(il,2)-u(il,1)) + & 2993 am(il)*(u(il,2)-u(il,1))) 2994 fv(il, 1) = fv(il, 1) + 0.01*grav*work(il)*(mp(il,2)*(vp(il,2)-v(il,1)) + & 2995 am(il)*(v(il,2)-v(il,1))) 2976 2996 END IF ! iflag 2977 2997 END DO ! il 2978 2998 2979 2999 2980 !AC! do j=1,ntra2981 !AC! do il=1,ncum2982 !AC! if (iflag(il) .le. 1) then2983 !AC! if (cvflag_grav) then2984 !AC! ftra(il,1,j)=ftra(il,1,j)+0.01*grav*work(il)2985 !AC! : *(mp(il,2)*(trap(il,2,j)-tra(il,1,j))2986 !AC! : +am(il)*(tra(il,2,j)-tra(il,1,j)))2987 !AC! else2988 !AC! ftra(il,1,j)=ftra(il,1,j)+0.1*work(il)2989 !AC! : *(mp(il,2)*(trap(il,2,j)-tra(il,1,j))2990 !AC! : +am(il)*(tra(il,2,j)-tra(il,1,j)))2991 !AC! endif2992 !AC! endif ! iflag2993 !AC! enddo2994 !AC! enddo3000 !AC! do j=1,ntra 3001 !AC! do il=1,ncum 3002 !AC! if (iflag(il) .le. 1) then 3003 !AC! if (cvflag_grav) then 3004 !AC! ftra(il,1,j)=ftra(il,1,j)+0.01*grav*work(il) 3005 !AC! : *(mp(il,2)*(trap(il,2,j)-tra(il,1,j)) 3006 !AC! : +am(il)*(tra(il,2,j)-tra(il,1,j))) 3007 !AC! else 3008 !AC! ftra(il,1,j)=ftra(il,1,j)+0.1*work(il) 3009 !AC! : *(mp(il,2)*(trap(il,2,j)-tra(il,1,j)) 3010 !AC! : +am(il)*(tra(il,2,j)-tra(il,1,j))) 3011 !AC! endif 3012 !AC! endif ! iflag 3013 !AC! enddo 3014 !AC! enddo 2995 3015 2996 3016 DO j = 2, nl 2997 3017 DO il = 1, ncum 2998 3018 IF (j<=inb(il) .AND. iflag(il)<=1) THEN 2999 IF (cvflag_grav) THEN 3000 fr(il, 1) = fr(il, 1) + 0.01*grav*work(il)*ment(il, j, 1)*(qent(il, & 3001 j,1)-rr(il,1)) 3002 fu(il, 1) = fu(il, 1) + 0.01*grav*work(il)*ment(il, j, 1)*(uent(il, & 3003 j,1)-u(il,1)) 3004 fv(il, 1) = fv(il, 1) + 0.01*grav*work(il)*ment(il, j, 1)*(vent(il, & 3005 j,1)-v(il,1)) 3006 ELSE ! cvflag_grav 3007 fr(il, 1) = fr(il, 1) + 0.1*work(il)*ment(il, j, 1)*(qent(il,j,1)- & 3008 rr(il,1)) 3009 fu(il, 1) = fu(il, 1) + 0.1*work(il)*ment(il, j, 1)*(uent(il,j,1)-u & 3010 (il,1)) 3011 fv(il, 1) = fv(il, 1) + 0.1*work(il)*ment(il, j, 1)*(vent(il,j,1)-v & 3012 (il,1)) ! fin sature 3013 END IF ! cvflag_grav 3019 fr(il, 1) = fr(il, 1) + 0.01*grav*work(il)*ment(il, j, 1)*(qent(il,j,1)-rr(il,1)) 3020 fu(il, 1) = fu(il, 1) + 0.01*grav*work(il)*ment(il, j, 1)*(uent(il,j,1)-u(il,1)) 3021 fv(il, 1) = fv(il, 1) + 0.01*grav*work(il)*ment(il, j, 1)*(vent(il,j,1)-v(il,1)) 3014 3022 END IF ! j 3015 3023 END DO 3016 3024 END DO 3017 3025 3018 !AC! do k=1,ntra3019 !AC! do j=2,nl3020 !AC! do il=1,ncum3021 !AC! if (j.le.inb(il) .and. iflag(il) .le. 1) then3022 !AC!3023 !AC! if (cvflag_grav) then3024 !AC! ftra(il,1,k)=ftra(il,1,k)+0.01*grav*work(il)*ment(il,j,1)3025 !AC! : *(traent(il,j,1,k)-tra(il,1,k))3026 !AC! else3027 !AC! ftra(il,1,k)=ftra(il,1,k)+0.1*work(il)*ment(il,j,1)3028 !AC! : *(traent(il,j,1,k)-tra(il,1,k))3029 !AC! endif3030 !AC!3031 !AC! endif3032 !AC! enddo3033 !AC! enddo3034 !AC! enddo3035 3036 3037 3038 3039 3040 3041 3026 !AC! do k=1,ntra 3027 !AC! do j=2,nl 3028 !AC! do il=1,ncum 3029 !AC! if (j.le.inb(il) .and. iflag(il) .le. 1) then 3030 !AC! 3031 !AC! if (cvflag_grav) then 3032 !AC! ftra(il,1,k)=ftra(il,1,k)+0.01*grav*work(il)*ment(il,j,1) 3033 !AC! : *(traent(il,j,1,k)-tra(il,1,k)) 3034 !AC! else 3035 !AC! ftra(il,1,k)=ftra(il,1,k)+0.1*work(il)*ment(il,j,1) 3036 !AC! : *(traent(il,j,1,k)-tra(il,1,k)) 3037 !AC! endif 3038 !AC! 3039 !AC! endif 3040 !AC! enddo 3041 !AC! enddo 3042 !AC! enddo 3043 ! print*,'cv3_yield apres ft' 3044 3045 ! *** calculate tendencies of potential temperature and mixing ratio *** 3046 ! *** at levels above the lowest level *** 3047 3048 ! *** first find the net saturated updraft and downdraft mass fluxes *** 3049 ! *** through each level *** 3042 3050 3043 3051 … … 3060 3068 END IF 3061 3069 ELSE 3062 3070 ! AMP1 is the part of cbmf taken from layers I and lower 3063 3071 IF (k<=i) THEN 3064 3072 amp1(il) = amp1(il) + cbmf(il)*wghti(il, k) … … 3093 3101 cpinv = 1.0/cpn(il, i) 3094 3102 3095 ! convect3 if((0.1*dpinv*amp1).ge.delti)iflag(il)=4 3096 IF (cvflag_grav) THEN 3097 IF ((0.01*grav*dpinv*amp1(il))>=delti) iflag(il) = 1 ! vecto 3098 ELSE 3099 IF ((0.1*dpinv*amp1(il))>=delti) iflag(il) = 1 ! vecto 3100 END IF 3101 3102 ! precip 3103 ! cc ft(il,i)= 3104 ! -0.5*sigd(il)*lvcp(il,i)*(evap(il,i)+evap(il,i+1)) 3103 ! convect3 if((0.1*dpinv*amp1).ge.delti)iflag(il)=4 3104 IF ((0.01*grav*dpinv*amp1(il))>=delti) iflag(il) = 1 ! vecto 3105 3106 ! precip 3107 ! cc ft(il,i)= -0.5*sigd(il)*lvcp(il,i)*(evap(il,i)+evap(il,i+1)) 3105 3108 IF (cvflag_ice) THEN 3106 3109 ft(il, i) = -sigd(il)*lvcp(il, i)*evap(il, i) - & 3107 sigd(il)*lfcp(il, i)*evap(il, i)*faci(il, i) - & 3108 sigd(il)*lfcp(il, i)*fondue(il, i)*wt(il, i)/(100.*(p(il, & 3109 i-1)-p(il,i))) 3110 sigd(il)*lfcp(il, i)*evap(il, i)*faci(il, i) - & 3111 sigd(il)*lfcp(il, i)*fondue(il, i)*wt(il, i)/(100.*(p(il,i-1)-p(il,i))) 3110 3112 ELSE 3111 3113 ft(il, i) = -sigd(il)*lvcp(il, i)*evap(il, i) … … 3114 3116 rat = cpn(il, i-1)*cpinv 3115 3117 3116 IF (cvflag_grav) THEN 3117 ft(il, i) = ft(il, i) - 0.009*grav*sigd(il)*(mp(il,i+1)*t_wake(il,i & 3118 )*b(il,i)-mp(il,i)*t_wake(il,i-1)*rat*b(il,i-1))*dpinv 3119 IF (cvflag_ice) THEN 3120 ft(il, i) = ft(il, i) + 0.01*sigd(il)*wt(il, i)*(cl-cpd)*water(il & 3121 , i+1)*(t_wake(il,i+1)-t_wake(il,i))*dpinv*cpinv + & 3122 0.01*sigd(il)*wt(il, i)*(ci-cpd)*ice(il, i+1)* & 3123 (t_wake(il,i+1)-t_wake(il,i))*dpinv*cpinv 3124 ELSE 3125 ft(il, i) = ft(il, i) + 0.01*sigd(il)*wt(il, i)*(cl-cpd)*water(il & 3126 , i+1)*(t_wake(il,i+1)-t_wake(il,i))*dpinv*cpinv 3127 END IF 3128 3129 ftd(il, i) = ft(il, i) 3130 ! fin precip 3131 3132 ! sature 3133 ft(il, i) = ft(il, i) + 0.01*grav*dpinv*(amp1(il)*(t(il,i+1)-t(il, & 3134 i)+(gz(il,i+1)-gz(il,i))*cpinv)-ad(il)*(t(il,i)-t(il, & 3135 i-1)+(gz(il,i)-gz(il,i-1))*cpinv)) 3136 3137 3138 IF (iflag_mix==0) THEN 3139 ft(il, i) = ft(il, i) + 0.01*grav*dpinv*ment(il, i, i)*(hp(il,i)- & 3140 h(il,i)+t(il,i)*(cpv-cpd)*(rr(il,i)-qent(il,i,i)))*cpinv 3141 END IF 3142 3143 ELSE ! cvflag_grav 3144 ft(il, i) = ft(il, i) - 0.09*sigd(il)*(mp(il,i+1)*t_wake(il,i)*b(il & 3145 ,i)-mp(il,i)*t_wake(il,i-1)*rat*b(il,i-1))*dpinv 3146 3147 IF (cvflag_ice) THEN 3148 ft(il, i) = ft(il, i) + 0.01*sigd(il)*wt(il, i)*(cl-cpd)*water(il & 3149 , i+1)*(t_wake(il,i+1)-t_wake(il,i))*dpinv*cpinv + & 3150 0.01*sigd(il)*wt(il, i)*(ci-cpd)*ice(il, i+1)* & 3151 (t_wake(il,i+1)-t_wake(il,i))*dpinv*cpinv 3152 ELSE 3153 ft(il, i) = ft(il, i) + 0.01*sigd(il)*wt(il, i)*(cl-cpd)*water(il & 3154 , i+1)*(t_wake(il,i+1)-t_wake(il,i))*dpinv*cpinv 3155 END IF 3156 3157 ftd(il, i) = ft(il, i) 3158 ! fin precip 3159 3160 ! sature 3161 ft(il, i) = ft(il, i) + 0.1*dpinv*(amp1(il)*(t(il,i+1)-t(il, & 3162 i)+(gz(il,i+1)-gz(il,i))*cpinv)-ad(il)*(t(il,i)-t(il, & 3163 i-1)+(gz(il,i)-gz(il,i-1))*cpinv)) 3164 3165 3166 IF (iflag_mix==0) THEN 3167 ft(il, i) = ft(il, i) + 0.1*dpinv*ment(il, i, i)*(hp(il,i)-h(il,i & 3168 )+t(il,i)*(cpv-cpd)*(rr(il,i)-qent(il,i,i)))*cpinv 3169 END IF 3170 END IF ! cvflag_grav 3171 3172 3173 IF (cvflag_grav) THEN 3174 ! sb: on ne fait pas encore la correction permettant de mieux 3175 ! conserver l'eau: 3176 ! jyg: correction permettant de mieux conserver l'eau: 3177 ! cc fr(il,i)=0.5*sigd(il)*(evap(il,i)+evap(il,i+1)) 3178 fr(il, i) = sigd(il)*evap(il, i) + 0.01*grav*(mp(il,i+1)*(rp(il, & 3179 i+1)-rr_wake(il,i))-mp(il,i)*(rp(il,i)-rr_wake(il,i-1)))*dpinv 3180 fqd(il, i) = fr(il, i) ! precip 3181 3182 fu(il, i) = 0.01*grav*(mp(il,i+1)*(up(il,i+1)-u(il, & 3183 i))-mp(il,i)*(up(il,i)-u(il,i-1)))*dpinv 3184 fv(il, i) = 0.01*grav*(mp(il,i+1)*(vp(il,i+1)-v(il, & 3185 i))-mp(il,i)*(vp(il,i)-v(il,i-1)))*dpinv 3186 ELSE ! cvflag_grav 3187 ! cc fr(il,i)=0.5*sigd(il)*(evap(il,i)+evap(il,i+1)) 3188 fr(il, i) = sigd(il)*evap(il, i) + 0.1*(mp(il,i+1)*(rp(il, & 3189 i+1)-rr_wake(il,i))-mp(il,i)*(rp(il,i)-rr_wake(il,i-1)))*dpinv 3190 fqd(il, i) = fr(il, i) ! precip 3191 3192 fu(il, i) = 0.1*(mp(il,i+1)*(up(il,i+1)-u(il,i))-mp(il,i)*(up(il, & 3193 i)-u(il,i-1)))*dpinv 3194 fv(il, i) = 0.1*(mp(il,i+1)*(vp(il,i+1)-v(il,i))-mp(il,i)*(vp(il, & 3195 i)-v(il,i-1)))*dpinv 3196 END IF ! cvflag_grav 3197 3198 3199 IF (cvflag_grav) THEN 3200 fr(il, i) = fr(il, i) + 0.01*grav*dpinv*(amp1(il)*(rr(il, & 3201 i+1)-rr(il,i))-ad(il)*(rr(il,i)-rr(il,i-1))) 3202 fu(il, i) = fu(il, i) + 0.01*grav*dpinv*(amp1(il)*(u(il,i+1)-u(il, & 3203 i))-ad(il)*(u(il,i)-u(il,i-1))) 3204 fv(il, i) = fv(il, i) + 0.01*grav*dpinv*(amp1(il)*(v(il,i+1)-v(il, & 3205 i))-ad(il)*(v(il,i)-v(il,i-1))) 3206 ELSE ! cvflag_grav 3207 fr(il, i) = fr(il, i) + 0.1*dpinv*(amp1(il)*(rr(il,i+1)-rr(il, & 3208 i))-ad(il)*(rr(il,i)-rr(il,i-1))) 3209 fu(il, i) = fu(il, i) + 0.1*dpinv*(amp1(il)*(u(il,i+1)-u(il, & 3210 i))-ad(il)*(u(il,i)-u(il,i-1))) 3211 fv(il, i) = fv(il, i) + 0.1*dpinv*(amp1(il)*(v(il,i+1)-v(il, & 3212 i))-ad(il)*(v(il,i)-v(il,i-1))) 3213 END IF ! cvflag_grav 3118 ft(il, i) = ft(il, i) - 0.009*grav*sigd(il) * & 3119 (mp(il,i+1)*t_wake(il,i)*b(il,i)-mp(il,i)*t_wake(il,i-1)*rat*b(il,i-1))*dpinv 3120 IF (cvflag_ice) THEN 3121 ft(il, i) = ft(il, i) + 0.01*sigd(il)*wt(il, i)*(cl-cpd)*water(il, i+1) * & 3122 (t_wake(il,i+1)-t_wake(il,i))*dpinv*cpinv + & 3123 0.01*sigd(il)*wt(il, i)*(ci-cpd)*ice(il, i+1) * & 3124 (t_wake(il,i+1)-t_wake(il,i))*dpinv*cpinv 3125 ELSE 3126 ft(il, i) = ft(il, i) + 0.01*sigd(il)*wt(il, i)*(cl-cpd)*water(il, i+1) * & 3127 (t_wake(il,i+1)-t_wake(il,i))*dpinv* & 3128 cpinv 3129 END IF 3130 3131 ftd(il, i) = ft(il, i) 3132 ! fin precip 3133 3134 ! sature 3135 ft(il, i) = ft(il, i) + 0.01*grav*dpinv * & 3136 (amp1(il)*(t(il,i+1)-t(il,i) + (gz(il,i+1)-gz(il,i))*cpinv) - & 3137 ad(il)*(t(il,i)-t(il,i-1)+(gz(il,i)-gz(il,i-1))*cpinv)) 3138 3139 3140 IF (iflag_mix==0) THEN 3141 ft(il, i) = ft(il, i) + 0.01*grav*dpinv*ment(il, i, i)*(hp(il,i)-h(il,i) + & 3142 t(il,i)*(cpv-cpd)*(rr(il,i)-qent(il,i,i)))*cpinv 3143 END IF 3144 3145 3146 3147 ! sb: on ne fait pas encore la correction permettant de mieux 3148 ! conserver l'eau: 3149 !JYG: correction permettant de mieux conserver l'eau: 3150 ! cc fr(il,i)=0.5*sigd(il)*(evap(il,i)+evap(il,i+1)) 3151 fr(il, i) = sigd(il)*evap(il, i) + 0.01*grav*(mp(il,i+1)*(rp(il,i+1)-rr_wake(il,i)) - & 3152 mp(il,i)*(rp(il,i)-rr_wake(il,i-1)))*dpinv 3153 fqd(il, i) = fr(il, i) ! precip 3154 3155 fu(il, i) = 0.01*grav*(mp(il,i+1)*(up(il,i+1)-u(il,i)) - & 3156 mp(il,i)*(up(il,i)-u(il,i-1)))*dpinv 3157 fv(il, i) = 0.01*grav*(mp(il,i+1)*(vp(il,i+1)-v(il,i)) - & 3158 mp(il,i)*(vp(il,i)-v(il,i-1)))*dpinv 3159 3160 3161 fr(il, i) = fr(il, i) + 0.01*grav*dpinv*(amp1(il)*(rr(il,i+1)-rr(il,i)) - & 3162 ad(il)*(rr(il,i)-rr(il,i-1))) 3163 fu(il, i) = fu(il, i) + 0.01*grav*dpinv*(amp1(il)*(u(il,i+1)-u(il,i)) - & 3164 ad(il)*(u(il,i)-u(il,i-1))) 3165 fv(il, i) = fv(il, i) + 0.01*grav*dpinv*(amp1(il)*(v(il,i+1)-v(il,i)) - & 3166 ad(il)*(v(il,i)-v(il,i-1))) 3214 3167 3215 3168 END IF ! i 3216 3169 END DO 3217 3170 3218 !AC! do k=1,ntra3219 !AC! do il=1,ncum3220 !AC! if (i.le.inb(il) .and. iflag(il) .le. 1) then3221 !AC! dpinv=1.0/(ph(il,i)-ph(il,i+1))3222 !AC! cpinv=1.0/cpn(il,i)3223 !AC! if (cvflag_grav) then3224 !AC! ftra(il,i,k)=ftra(il,i,k)+0.01*grav*dpinv3225 !AC! : *(amp1(il)*(tra(il,i+1,k)-tra(il,i,k))3226 !AC! : -ad(il)*(tra(il,i,k)-tra(il,i-1,k)))3227 !AC! else3228 !AC! ftra(il,i,k)=ftra(il,i,k)+0.1*dpinv3229 !AC! : *(amp1(il)*(tra(il,i+1,k)-tra(il,i,k))3230 !AC! : -ad(il)*(tra(il,i,k)-tra(il,i-1,k)))3231 !AC! endif3232 !AC! endif3233 !AC! enddo3234 !AC! enddo3171 !AC! do k=1,ntra 3172 !AC! do il=1,ncum 3173 !AC! if (i.le.inb(il) .and. iflag(il) .le. 1) then 3174 !AC! dpinv=1.0/(ph(il,i)-ph(il,i+1)) 3175 !AC! cpinv=1.0/cpn(il,i) 3176 !AC! if (cvflag_grav) then 3177 !AC! ftra(il,i,k)=ftra(il,i,k)+0.01*grav*dpinv 3178 !AC! : *(amp1(il)*(tra(il,i+1,k)-tra(il,i,k)) 3179 !AC! : -ad(il)*(tra(il,i,k)-tra(il,i-1,k))) 3180 !AC! else 3181 !AC! ftra(il,i,k)=ftra(il,i,k)+0.1*dpinv 3182 !AC! : *(amp1(il)*(tra(il,i+1,k)-tra(il,i,k)) 3183 !AC! : -ad(il)*(tra(il,i,k)-tra(il,i-1,k))) 3184 !AC! endif 3185 !AC! endif 3186 !AC! enddo 3187 !AC! enddo 3235 3188 3236 3189 DO k = 1, i - 1 … … 3246 3199 dpinv = 1.0/(ph(il,i)-ph(il,i+1)) 3247 3200 cpinv = 1.0/cpn(il, i) 3248 IF (cvflag_grav) THEN 3249 ft(il, i) = ft(il, i) + 0.01*grav*dpinv*ment(il, k, i)*(hent(il & 3250 ,k,i)-h(il,i)+t(il,i)*(cpv-cpd)*(rr(il,i)+awat(il)-qent(il,k, & 3251 i)))*cpinv 3252 3253 3254 3255 ELSE 3256 ft(il, i) = ft(il, i) + 0.1*dpinv*ment(il, k, i)*(hent(il,k,i)- & 3257 h(il,i)+t(il,i)*(cpv-cpd)*(rr(il,i)+awat(il)-qent(il,k, & 3258 i)))*cpinv 3259 END IF !cvflag_grav 3201 ft(il, i) = ft(il, i) + 0.01*grav*dpinv*ment(il, k, i) * & 3202 (hent(il,k,i)-h(il,i)+t(il,i)*(cpv-cpd)*(rr(il,i)+awat(il)-qent(il,k,i)))*cpinv 3203 ! 3204 ! 3260 3205 END IF ! i 3261 3206 END DO … … 3266 3211 dpinv = 1.0/(ph(il,i)-ph(il,i+1)) 3267 3212 cpinv = 1.0/cpn(il, i) 3268 IF (cvflag_grav) THEN 3269 fr(il, i) = fr(il, i) + 0.01*grav*dpinv*ment(il, k, i)*(qent(il,k & 3270 ,i)-awat(il)-rr(il,i)) 3271 fu(il, i) = fu(il, i) + 0.01*grav*dpinv*ment(il, k, i)*(uent(il,k & 3272 ,i)-u(il,i)) 3273 fv(il, i) = fv(il, i) + 0.01*grav*dpinv*ment(il, k, i)*(vent(il,k & 3274 ,i)-v(il,i)) 3275 ELSE ! cvflag_grav 3276 fr(il, i) = fr(il, i) + 0.1*dpinv*ment(il, k, i)*(qent(il,k,i)- & 3277 awat(il)-rr(il,i)) 3278 fu(il, i) = fu(il, i) + 0.01*grav*dpinv*ment(il, k, i)*(uent(il,k & 3279 ,i)-u(il,i)) 3280 fv(il, i) = fv(il, i) + 0.1*dpinv*ment(il, k, i)*(vent(il,k,i)-v( & 3281 il,i)) 3282 END IF ! cvflag_grav 3283 3284 ! (saturated updrafts resulting from mixing) ! cld 3285 qcond(il, i) = qcond(il, i) + (elij(il,k,i)-awat(il)) ! cld 3213 fr(il, i) = fr(il, i) + 0.01*grav*dpinv*ment(il, k, i) * & 3214 (qent(il,k,i)-awat(il)-rr(il,i)) 3215 fu(il, i) = fu(il, i) + 0.01*grav*dpinv*ment(il, k, i)*(uent(il,k,i)-u(il,i)) 3216 fv(il, i) = fv(il, i) + 0.01*grav*dpinv*ment(il, k, i)*(vent(il,k,i)-v(il,i)) 3217 3218 ! (saturated updrafts resulting from mixing) ! cld 3219 qcond(il, i) = qcond(il, i) + (elij(il,k,i)-awat(il)) ! cld 3286 3220 nqcond(il, i) = nqcond(il, i) + 1. ! cld 3287 3221 END IF ! i … … 3289 3223 END DO 3290 3224 3291 !AC! do j=1,ntra3292 !AC! do k=1,i-13293 !AC! do il=1,ncum3294 !AC! if (i.le.inb(il) .and. iflag(il) .le. 1) then3295 !AC! dpinv=1.0/(ph(il,i)-ph(il,i+1))3296 !AC! cpinv=1.0/cpn(il,i)3297 !AC! if (cvflag_grav) then3298 !AC! ftra(il,i,j)=ftra(il,i,j)+0.01*grav*dpinv*ment(il,k,i)3299 !AC! : *(traent(il,k,i,j)-tra(il,i,j))3300 !AC! else3301 !AC! ftra(il,i,j)=ftra(il,i,j)+0.1*dpinv*ment(il,k,i)3302 !AC! : *(traent(il,k,i,j)-tra(il,i,j))3303 !AC! endif3304 !AC! endif3305 !AC! enddo3306 !AC! enddo3307 !AC! enddo3225 !AC! do j=1,ntra 3226 !AC! do k=1,i-1 3227 !AC! do il=1,ncum 3228 !AC! if (i.le.inb(il) .and. iflag(il) .le. 1) then 3229 !AC! dpinv=1.0/(ph(il,i)-ph(il,i+1)) 3230 !AC! cpinv=1.0/cpn(il,i) 3231 !AC! if (cvflag_grav) then 3232 !AC! ftra(il,i,j)=ftra(il,i,j)+0.01*grav*dpinv*ment(il,k,i) 3233 !AC! : *(traent(il,k,i,j)-tra(il,i,j)) 3234 !AC! else 3235 !AC! ftra(il,i,j)=ftra(il,i,j)+0.1*dpinv*ment(il,k,i) 3236 !AC! : *(traent(il,k,i,j)-tra(il,i,j)) 3237 !AC! endif 3238 !AC! endif 3239 !AC! enddo 3240 !AC! enddo 3241 !AC! enddo 3308 3242 3309 3243 DO k = i, nl + 1 … … 3314 3248 dpinv = 1.0/(ph(il,i)-ph(il,i+1)) 3315 3249 cpinv = 1.0/cpn(il, i) 3316 IF (cvflag_grav) THEN 3317 ft(il, i) = ft(il, i) + 0.01*grav*dpinv*ment(il, k, i)*(hent(il & 3318 ,k,i)-h(il,i)+t(il,i)*(cpv-cpd)*(rr(il,i)-qent(il,k, & 3319 i)))*cpinv 3320 3321 3322 ELSE 3323 ft(il, i) = ft(il, i) + 0.1*dpinv*ment(il, k, i)*(hent(il,k,i)- & 3324 h(il,i)+t(il,i)*(cpv-cpd)*(rr(il,i)-qent(il,k,i)))*cpinv 3325 END IF !cvflag_grav 3250 ft(il, i) = ft(il, i) + 0.01*grav*dpinv*ment(il, k, i) * & 3251 (hent(il,k,i)-h(il,i)+t(il,i)*(cpv-cpd)*(rr(il,i)-qent(il,k,i)))*cpinv 3252 3253 3326 3254 END IF ! i 3327 3255 END DO … … 3333 3261 cpinv = 1.0/cpn(il, i) 3334 3262 3335 IF (cvflag_grav) THEN 3336 fr(il, i) = fr(il, i) + 0.01*grav*dpinv*ment(il, k, i)*(qent(il,k & 3337 ,i)-rr(il,i)) 3338 fu(il, i) = fu(il, i) + 0.01*grav*dpinv*ment(il, k, i)*(uent(il,k & 3339 ,i)-u(il,i)) 3340 fv(il, i) = fv(il, i) + 0.01*grav*dpinv*ment(il, k, i)*(vent(il,k & 3341 ,i)-v(il,i)) 3342 ELSE ! cvflag_grav 3343 fr(il, i) = fr(il, i) + 0.1*dpinv*ment(il, k, i)*(qent(il,k,i)-rr & 3344 (il,i)) 3345 fu(il, i) = fu(il, i) + 0.1*dpinv*ment(il, k, i)*(uent(il,k,i)-u( & 3346 il,i)) 3347 fv(il, i) = fv(il, i) + 0.1*dpinv*ment(il, k, i)*(vent(il,k,i)-v( & 3348 il,i)) 3349 END IF ! cvflag_grav 3263 fr(il, i) = fr(il, i) + 0.01*grav*dpinv*ment(il, k, i)*(qent(il,k,i)-rr(il,i)) 3264 fu(il, i) = fu(il, i) + 0.01*grav*dpinv*ment(il, k, i)*(uent(il,k,i)-u(il,i)) 3265 fv(il, i) = fv(il, i) + 0.01*grav*dpinv*ment(il, k, i)*(vent(il,k,i)-v(il,i)) 3350 3266 END IF ! i and k 3351 3267 END DO 3352 3268 END DO 3353 3269 3354 !AC! do j=1,ntra3355 !AC! do k=i,nl+13356 !AC! do il=1,ncum3357 !AC! if (i.le.inb(il) .and. k.le.inb(il)3358 !AC! $ .and. iflag(il) .le. 1) then3359 !AC! dpinv=1.0/(ph(il,i)-ph(il,i+1))3360 !AC! cpinv=1.0/cpn(il,i)3361 !AC! if (cvflag_grav) then3362 !AC! ftra(il,i,j)=ftra(il,i,j)+0.01*grav*dpinv*ment(il,k,i)3363 !AC! : *(traent(il,k,i,j)-tra(il,i,j))3364 !AC! else3365 !AC! ftra(il,i,j)=ftra(il,i,j)+0.1*dpinv*ment(il,k,i)3366 !AC! : *(traent(il,k,i,j)-tra(il,i,j))3367 !AC! endif3368 !AC! endif ! i and k3369 !AC! enddo3370 !AC! enddo3371 !AC! enddo3372 3373 ! sb: interface with the cloud parameterization:! cld3270 !AC! do j=1,ntra 3271 !AC! do k=i,nl+1 3272 !AC! do il=1,ncum 3273 !AC! if (i.le.inb(il) .and. k.le.inb(il) 3274 !AC! $ .and. iflag(il) .le. 1) then 3275 !AC! dpinv=1.0/(ph(il,i)-ph(il,i+1)) 3276 !AC! cpinv=1.0/cpn(il,i) 3277 !AC! if (cvflag_grav) then 3278 !AC! ftra(il,i,j)=ftra(il,i,j)+0.01*grav*dpinv*ment(il,k,i) 3279 !AC! : *(traent(il,k,i,j)-tra(il,i,j)) 3280 !AC! else 3281 !AC! ftra(il,i,j)=ftra(il,i,j)+0.1*dpinv*ment(il,k,i) 3282 !AC! : *(traent(il,k,i,j)-tra(il,i,j)) 3283 !AC! endif 3284 !AC! endif ! i and k 3285 !AC! enddo 3286 !AC! enddo 3287 !AC! enddo 3288 3289 ! sb: interface with the cloud parameterization: ! cld 3374 3290 3375 3291 DO k = i + 1, nl 3376 3292 DO il = 1, ncum 3377 IF (k<=inb(il) .AND. i<=inb(il) .AND. iflag(il)<=1) THEN ! cld3378 ! (saturated downdrafts resulting from mixing)! cld3379 qcond(il, i) = qcond(il, i) + elij(il, k, i) ! cld3293 IF (k<=inb(il) .AND. i<=inb(il) .AND. iflag(il)<=1) THEN ! cld 3294 ! (saturated downdrafts resulting from mixing) ! cld 3295 qcond(il, i) = qcond(il, i) + elij(il, k, i) ! cld 3380 3296 nqcond(il, i) = nqcond(il, i) + 1. ! cld 3381 3297 END IF ! cld … … 3383 3299 END DO ! cld 3384 3300 3385 ! (particular case: no detraining level is found)! cld3386 DO il = 1, ncum ! cld3387 IF (i<=inb(il) .AND. nent(il,i)==0 .AND. iflag(il)<=1) THEN ! cld3388 qcond(il, i) = qcond(il, i) + (1.-ep(il,i))*clw(il, i) ! cld3389 nqcond(il, i) = nqcond(il, i) + 1. ! cld3390 END IF ! cld3391 END DO ! cld3392 3393 DO il = 1, ncum ! cld3394 IF (i<=inb(il) .AND. nqcond(il,i)/=0 .AND. iflag(il)<=1) THEN ! cld3395 qcond(il, i) = qcond(il, i)/nqcond(il, i) ! cld3396 END IF ! cld3397 END DO 3398 3399 !AC! do j=1,ntra3400 !AC! do il=1,ncum3401 !AC! if (i.le.inb(il) .and. iflag(il) .le. 1) then3402 !AC! dpinv=1.0/(ph(il,i)-ph(il,i+1))3403 !AC! cpinv=1.0/cpn(il,i)3404 !AC!3405 !AC! if (cvflag_grav) then3406 !AC! ftra(il,i,j)=ftra(il,i,j)+0.01*grav*dpinv3407 !AC! : *(mp(il,i+1)*(trap(il,i+1,j)-tra(il,i,j))3408 !AC! : -mp(il,i)*(trap(il,i,j)-trap(il,i-1,j)))3409 !AC! else3410 !AC! ftra(il,i,j)=ftra(il,i,j)+0.1*dpinv3411 !AC! : *(mp(il,i+1)*(trap(il,i+1,j)-tra(il,i,j))3412 !AC! : -mp(il,i)*(trap(il,i,j)-trap(il,i-1,j)))3413 !AC! endif3414 !AC! endif ! i3415 !AC! enddo3416 !AC! enddo3301 ! (particular case: no detraining level is found) ! cld 3302 DO il = 1, ncum ! cld 3303 IF (i<=inb(il) .AND. nent(il,i)==0 .AND. iflag(il)<=1) THEN ! cld 3304 qcond(il, i) = qcond(il, i) + (1.-ep(il,i))*clw(il, i) ! cld 3305 nqcond(il, i) = nqcond(il, i) + 1. ! cld 3306 END IF ! cld 3307 END DO ! cld 3308 3309 DO il = 1, ncum ! cld 3310 IF (i<=inb(il) .AND. nqcond(il,i)/=0 .AND. iflag(il)<=1) THEN ! cld 3311 qcond(il, i) = qcond(il, i)/nqcond(il, i) ! cld 3312 END IF ! cld 3313 END DO 3314 3315 !AC! do j=1,ntra 3316 !AC! do il=1,ncum 3317 !AC! if (i.le.inb(il) .and. iflag(il) .le. 1) then 3318 !AC! dpinv=1.0/(ph(il,i)-ph(il,i+1)) 3319 !AC! cpinv=1.0/cpn(il,i) 3320 !AC! 3321 !AC! if (cvflag_grav) then 3322 !AC! ftra(il,i,j)=ftra(il,i,j)+0.01*grav*dpinv 3323 !AC! : *(mp(il,i+1)*(trap(il,i+1,j)-tra(il,i,j)) 3324 !AC! : -mp(il,i)*(trap(il,i,j)-trap(il,i-1,j))) 3325 !AC! else 3326 !AC! ftra(il,i,j)=ftra(il,i,j)+0.1*dpinv 3327 !AC! : *(mp(il,i+1)*(trap(il,i+1,j)-tra(il,i,j)) 3328 !AC! : -mp(il,i)*(trap(il,i,j)-trap(il,i-1,j))) 3329 !AC! endif 3330 !AC! endif ! i 3331 !AC! enddo 3332 !AC! enddo 3417 3333 3418 3334 3419 3335 500 END DO 3420 3336 3421 3422 ! *** move the detrainment at level inb down to level inb-1 *** 3423 ! *** in such a way as to preserve the vertically *** 3424 ! *** integrated enthalpy and water tendencies *** 3425 3426 ! Correction bug le 18-03-09 3337 !JYG< 3338 !Conservation de l'eau 3339 ! sumdq = 0. 3340 ! DO k = 1, nl 3341 ! sumdq = sumdq + fr(1, k)*100.*(ph(1,k)-ph(1,k+1))/grav 3342 ! END DO 3343 ! PRINT *, 'cv3_yield, apres 500, sum(dq), precip, somme ', sumdq, Vprecip(1, 1), sumdq + vprecip(1, 1) 3344 !JYG> 3345 ! *** move the detrainment at level inb down to level inb-1 *** 3346 ! *** in such a way as to preserve the vertically *** 3347 ! *** integrated enthalpy and water tendencies *** 3348 3349 ! Correction bug le 18-03-09 3427 3350 DO il = 1, ncum 3428 3351 IF (iflag(il)<=1) THEN 3429 IF (cvflag_grav) THEN 3430 ax = 0.01*grav*ment(il, inb(il), inb(il))*(hp(il,inb(il))-h(il,inb(il & 3431 ))+t(il,inb(il))*(cpv-cpd)*(rr(il,inb(il))-qent(il,inb(il), & 3432 inb(il))))/(cpn(il,inb(il))*(ph(il,inb(il))-ph(il,inb(il)+1))) 3433 ft(il, inb(il)) = ft(il, inb(il)) - ax 3434 ft(il, inb(il)-1) = ft(il, inb(il)-1) + ax*cpn(il, inb(il))*(ph(il, & 3435 inb(il))-ph(il,inb(il)+1))/(cpn(il,inb(il)-1)*(ph(il, & 3436 inb(il)-1)-ph(il,inb(il)))) 3437 3438 bx = 0.01*grav*ment(il, inb(il), inb(il))*(qent(il,inb(il),inb(il))- & 3439 rr(il,inb(il)))/(ph(il,inb(il))-ph(il,inb(il)+1)) 3440 fr(il, inb(il)) = fr(il, inb(il)) - bx 3441 fr(il, inb(il)-1) = fr(il, inb(il)-1) + bx*(ph(il,inb(il))-ph(il,inb( & 3442 il)+1))/(ph(il,inb(il)-1)-ph(il,inb(il))) 3443 3444 cx = 0.01*grav*ment(il, inb(il), inb(il))*(uent(il,inb(il),inb(il))-u & 3445 (il,inb(il)))/(ph(il,inb(il))-ph(il,inb(il)+1)) 3446 fu(il, inb(il)) = fu(il, inb(il)) - cx 3447 fu(il, inb(il)-1) = fu(il, inb(il)-1) + cx*(ph(il,inb(il))-ph(il,inb( & 3448 il)+1))/(ph(il,inb(il)-1)-ph(il,inb(il))) 3449 3450 dx = 0.01*grav*ment(il, inb(il), inb(il))*(vent(il,inb(il),inb(il))-v & 3451 (il,inb(il)))/(ph(il,inb(il))-ph(il,inb(il)+1)) 3452 fv(il, inb(il)) = fv(il, inb(il)) - dx 3453 fv(il, inb(il)-1) = fv(il, inb(il)-1) + dx*(ph(il,inb(il))-ph(il,inb( & 3454 il)+1))/(ph(il,inb(il)-1)-ph(il,inb(il))) 3455 ELSE 3456 ax = 0.1*ment(il, inb(il), inb(il))*(hp(il,inb(il))-h(il,inb(il))+t( & 3457 il,inb(il))*(cpv-cpd)*(rr(il,inb(il))-qent(il,inb(il), & 3458 inb(il))))/(cpn(il,inb(il))*(ph(il,inb(il))-ph(il,inb(il)+1))) 3459 ft(il, inb(il)) = ft(il, inb(il)) - ax 3460 ft(il, inb(il)-1) = ft(il, inb(il)-1) + ax*cpn(il, inb(il))*(ph(il, & 3461 inb(il))-ph(il,inb(il)+1))/(cpn(il,inb(il)-1)*(ph(il, & 3462 inb(il)-1)-ph(il,inb(il)))) 3463 3464 bx = 0.1*ment(il, inb(il), inb(il))*(qent(il,inb(il),inb(il))-rr(il, & 3465 inb(il)))/(ph(il,inb(il))-ph(il,inb(il)+1)) 3466 fr(il, inb(il)) = fr(il, inb(il)) - bx 3467 fr(il, inb(il)-1) = fr(il, inb(il)-1) + bx*(ph(il,inb(il))-ph(il,inb( & 3468 il)+1))/(ph(il,inb(il)-1)-ph(il,inb(il))) 3469 3470 cx = 0.1*ment(il, inb(il), inb(il))*(uent(il,inb(il),inb(il))-u(il, & 3471 inb(il)))/(ph(il,inb(il))-ph(il,inb(il)+1)) 3472 fu(il, inb(il)) = fu(il, inb(il)) - cx 3473 fu(il, inb(il)-1) = fu(il, inb(il)-1) + cx*(ph(il,inb(il))-ph(il,inb( & 3474 il)+1))/(ph(il,inb(il)-1)-ph(il,inb(il))) 3475 3476 dx = 0.1*ment(il, inb(il), inb(il))*(vent(il,inb(il),inb(il))-v(il, & 3477 inb(il)))/(ph(il,inb(il))-ph(il,inb(il)+1)) 3478 fv(il, inb(il)) = fv(il, inb(il)) - dx 3479 fv(il, inb(il)-1) = fv(il, inb(il)-1) + dx*(ph(il,inb(il))-ph(il,inb( & 3480 il)+1))/(ph(il,inb(il)-1)-ph(il,inb(il))) 3481 END IF 3352 ax = 0.01*grav*ment(il, inb(il), inb(il))* & 3353 (hp(il,inb(il))-h(il,inb(il))+t(il,inb(il))*(cpv-cpd)*(rr(il,inb(il))-qent(il,inb(il),inb(il))))/ & 3354 (cpn(il,inb(il))*(ph(il,inb(il))-ph(il,inb(il)+1))) 3355 ft(il, inb(il)) = ft(il, inb(il)) - ax 3356 ft(il, inb(il)-1) = ft(il, inb(il)-1) + ax*cpn(il, inb(il))*(ph(il,inb(il))-ph(il,inb(il)+1))/ & 3357 (cpn(il,inb(il)-1)*(ph(il,inb(il)-1)-ph(il,inb(il)))) 3358 3359 bx = 0.01*grav*ment(il, inb(il), inb(il))*(qent(il,inb(il),inb(il))-rr(il,inb(il)))/ & 3360 (ph(il,inb(il))-ph(il,inb(il)+1)) 3361 fr(il, inb(il)) = fr(il, inb(il)) - bx 3362 fr(il, inb(il)-1) = fr(il, inb(il)-1) + bx*(ph(il,inb(il))-ph(il,inb(il)+1))/ & 3363 (ph(il,inb(il)-1)-ph(il,inb(il))) 3364 3365 cx = 0.01*grav*ment(il, inb(il), inb(il))*(uent(il,inb(il),inb(il))-u(il,inb(il)))/ & 3366 (ph(il,inb(il))-ph(il,inb(il)+1)) 3367 fu(il, inb(il)) = fu(il, inb(il)) - cx 3368 fu(il, inb(il)-1) = fu(il, inb(il)-1) + cx*(ph(il,inb(il))-ph(il,inb(il)+1))/ & 3369 (ph(il,inb(il)-1)-ph(il,inb(il))) 3370 3371 dx = 0.01*grav*ment(il, inb(il), inb(il))*(vent(il,inb(il),inb(il))-v(il,inb(il)))/ & 3372 (ph(il,inb(il))-ph(il,inb(il)+1)) 3373 fv(il, inb(il)) = fv(il, inb(il)) - dx 3374 fv(il, inb(il)-1) = fv(il, inb(il)-1) + dx*(ph(il,inb(il))-ph(il,inb(il)+1))/ & 3375 (ph(il,inb(il)-1)-ph(il,inb(il))) 3482 3376 END IF !iflag 3483 3377 END DO 3484 3378 3485 ! AC! do j=1,ntra 3486 ! AC! do il=1,ncum 3487 ! AC! IF (iflag(il) .le. 1) THEN 3488 ! AC! IF (cvflag_grav) then 3489 ! AC! ex=0.01*grav*ment(il,inb(il),inb(il)) 3490 ! AC! : *(traent(il,inb(il),inb(il),j)-tra(il,inb(il),j)) 3491 ! AC! : /(ph(i l,inb(il))-ph(il,inb(il)+1)) 3492 ! AC! ftra(il,inb(il),j)=ftra(il,inb(il),j)-ex 3493 ! AC! ftra(il,inb(il)-1,j)=ftra(il,inb(il)-1,j) 3494 ! AC! : +ex*(ph(il,inb(il))-ph(il,inb(il)+1)) 3495 ! AC! : /(ph(il,inb(il)-1)-ph(il,inb(il))) 3496 ! AC! else 3497 ! AC! ex=0.1*ment(il,inb(il),inb(il)) 3498 ! AC! : *(traent(il,inb(il),inb(il),j)-tra(il,inb(il),j)) 3499 ! AC! : /(ph(i l,inb(il))-ph(il,inb(il)+1)) 3500 ! AC! ftra(il,inb(il),j)=ftra(il,inb(il),j)-ex 3501 ! AC! ftra(il,inb(il)-1,j)=ftra(il,inb(il)-1,j) 3502 ! AC! : +ex*(ph(il,inb(il))-ph(il,inb(il)+1)) 3503 ! AC! : /(ph(il,inb(il)-1)-ph(il,inb(il))) 3504 ! AC! ENDIF !cvflag grav 3505 ! AC! ENDIF !iflag 3506 ! AC! enddo 3507 ! AC! enddo 3508 3509 3510 ! *** homogenize tendencies below cloud base *** 3379 !JYG< 3380 !Conservation de l'eau 3381 ! sumdq = 0. 3382 ! DO k = 1, nl 3383 ! sumdq = sumdq + fr(1, k)*100.*(ph(1,k)-ph(1,k+1))/grav 3384 ! END DO 3385 ! PRINT *, 'cv3_yield, apres 503, sum(dq), precip, somme ', sumdq, Vprecip(1, 1), sumdq + vprecip(1, 1) 3386 !JYG> 3387 3388 !AC! do j=1,ntra 3389 !AC! do il=1,ncum 3390 !AC! IF (iflag(il) .le. 1) THEN 3391 !AC! IF (cvflag_grav) then 3392 !AC! ex=0.01*grav*ment(il,inb(il),inb(il)) 3393 !AC! : *(traent(il,inb(il),inb(il),j)-tra(il,inb(il),j)) 3394 !AC! : /(ph(i l,inb(il))-ph(il,inb(il)+1)) 3395 !AC! ftra(il,inb(il),j)=ftra(il,inb(il),j)-ex 3396 !AC! ftra(il,inb(il)-1,j)=ftra(il,inb(il)-1,j) 3397 !AC! : +ex*(ph(il,inb(il))-ph(il,inb(il)+1)) 3398 !AC! : /(ph(il,inb(il)-1)-ph(il,inb(il))) 3399 !AC! else 3400 !AC! ex=0.1*ment(il,inb(il),inb(il)) 3401 !AC! : *(traent(il,inb(il),inb(il),j)-tra(il,inb(il),j)) 3402 !AC! : /(ph(i l,inb(il))-ph(il,inb(il)+1)) 3403 !AC! ftra(il,inb(il),j)=ftra(il,inb(il),j)-ex 3404 !AC! ftra(il,inb(il)-1,j)=ftra(il,inb(il)-1,j) 3405 !AC! : +ex*(ph(il,inb(il))-ph(il,inb(il)+1)) 3406 !AC! : /(ph(il,inb(il)-1)-ph(il,inb(il))) 3407 !AC! ENDIF !cvflag grav 3408 !AC! ENDIF !iflag 3409 !AC! enddo 3410 !AC! enddo 3411 3412 3413 ! *** homogenize tendencies below cloud base *** 3511 3414 3512 3415 … … 3522 3425 END DO 3523 3426 3524 !do i=1,nl3525 !do il=1,ncum3526 !th_wake(il,i)=t_wake(il,i)*(1000.0/p(il,i))**rdcp3527 !enddo3528 !enddo3427 !do i=1,nl 3428 !do il=1,ncum 3429 !th_wake(il,i)=t_wake(il,i)*(1000.0/p(il,i))**rdcp 3430 !enddo 3431 !enddo 3529 3432 3530 3433 DO i = 1, nl 3531 3434 DO il = 1, ncum 3532 3435 IF (i<=(icb(il)-1) .AND. iflag(il)<=1) THEN 3533 !jyg Saturated part : use T profile3436 !jyg Saturated part : use T profile 3534 3437 asum(il) = asum(il) + (ft(il,i)-ftd(il,i))*(ph(il,i)-ph(il,i+1)) 3535 bsum(il) = bsum(il) + (fr(il,i)-fqd(il,i))*(lv(il,i)+(cl-cpd)*(t(il, & 3536 i)-t(il,1)))*(ph(il,i)-ph(il,i+1)) 3537 csum(il) = csum(il) + (lv(il,i)+(cl-cpd)*(t(il,i)-t(il, & 3538 1)))*(ph(il,i)-ph(il,i+1)) 3438 !jyg<20140311 3439 !Correction pour conserver l eau 3440 IF (ok_conserv_q) THEN 3441 bsum(il) = bsum(il) + (fr(il,i)-fqd(il,i))*(ph(il,i)-ph(il,i+1)) 3442 csum(il) = csum(il) + (ph(il,i)-ph(il,i+1)) 3443 3444 ELSE 3445 bsum(il)=bsum(il)+(fr(il,i)-fqd(il,i))*(lv(il,i)+(cl-cpd)*(t(il,i)-t(il,1)))* & 3446 (ph(il,i)-ph(il,i+1)) 3447 csum(il)=csum(il)+(lv(il,i)+(cl-cpd)*(t(il,i)-t(il,1)))* & 3448 (ph(il,i)-ph(il,i+1)) 3449 ENDIF ! (ok_conserv_q) 3450 !jyg> 3539 3451 dsum(il) = dsum(il) + t(il, i)*(ph(il,i)-ph(il,i+1))/th(il, i) 3540 !jyg Unsaturated part : use T_wake profile3452 !jyg Unsaturated part : use T_wake profile 3541 3453 esum(il) = esum(il) + ftd(il, i)*(ph(il,i)-ph(il,i+1)) 3542 fsum(il) = fsum(il) + fqd(il, i)*(lv(il,i)+(cl-cpd)*(t_wake(il, & 3543 i)-t_wake(il,1)))*(ph(il,i)-ph(il,i+1)) 3544 gsum(il) = gsum(il) + (lv(il,i)+(cl-cpd)*(t_wake(il,i)-t_wake(il, & 3545 1)))*(ph(il,i)-ph(il,i+1)) 3546 hsum(il) = hsum(il) + t_wake(il, i)*(ph(il,i)-ph(il,i+1))/th_wake(il, & 3547 i) 3454 !jyg<20140311 3455 !Correction pour conserver l eau 3456 IF (ok_conserv_q) THEN 3457 fsum(il) = fsum(il) + fqd(il, i)*(ph(il,i)-ph(il,i+1)) 3458 gsum(il) = gsum(il) + (ph(il,i)-ph(il,i+1)) 3459 ELSE 3460 fsum(il)=fsum(il)+fqd(il,i)*(lv(il,i)+(cl-cpd)*(t_wake(il,i)-t_wake(il,1)))* & 3461 (ph(il,i)-ph(il,i+1)) 3462 gsum(il)=gsum(il)+(lv(il,i)+(cl-cpd)*(t_wake(il,i)-t_wake(il,1)))* & 3463 (ph(il,i)-ph(il,i+1)) 3464 ENDIF ! (ok_conserv_q) 3465 !jyg> 3466 hsum(il) = hsum(il) + t_wake(il, i)*(ph(il,i)-ph(il,i+1))/th_wake(il, i) 3548 3467 END IF 3549 3468 END DO 3550 3469 END DO 3551 3470 3552 !!!! do 700 i=1,icb(il)-13471 !!!! do 700 i=1,icb(il)-1 3553 3472 DO i = 1, nl 3554 3473 DO il = 1, ncum … … 3562 3481 END DO 3563 3482 3564 3565 ! *** Check that moisture stays positive. If not, scale tendencies 3566 ! in order to ensure moisture positivity 3483 !jyg< 3484 !Conservation de l'eau 3485 !! sumdq = 0. 3486 !! DO k = 1, nl 3487 !! sumdq = sumdq + fr(1, k)*100.*(ph(1,k)-ph(1,k+1))/grav 3488 !! END DO 3489 !! PRINT *, 'cv3_yield, apres hom, sum(dq), precip, somme ', sumdq, Vprecip(1, 1), sumdq + vprecip(1, 1) 3490 !jyg> 3491 3492 3493 ! *** Check that moisture stays positive. If not, scale tendencies 3494 ! in order to ensure moisture positivity 3567 3495 DO il = 1, ncum 3568 3496 alpha_qpos(il) = 1. 3569 3497 IF (iflag(il)<=1) THEN 3570 3498 IF (fr(il,1)<=0.) THEN 3571 alpha_qpos(il) = max(alpha_qpos(il), (-delt*fr(il, & 3572 1))/(s_wake(il)*rr_wake(il,1)+(1.-s_wake(il))*rr(il,1))) 3499 alpha_qpos(il) = max(alpha_qpos(il), (-delt*fr(il,1))/(s_wake(il)*rr_wake(il,1)+(1.-s_wake(il))*rr(il,1))) 3573 3500 END IF 3574 3501 END IF … … 3578 3505 IF (iflag(il)<=1) THEN 3579 3506 IF (fr(il,i)<=0.) THEN 3580 alpha_qpos1(il) = max(1., (-delt*fr(il,i))/(s_wake(il)*rr_wake(il, & 3581 i)+(1.-s_wake(il))*rr(il,i))) 3582 IF (alpha_qpos1(il)>=alpha_qpos(il)) alpha_qpos(il) & 3583 = alpha_qpos1(il) 3507 alpha_qpos1(il) = max(1., (-delt*fr(il,i))/(s_wake(il)*rr_wake(il,i)+(1.-s_wake(il))*rr(il,i))) 3508 IF (alpha_qpos1(il)>=alpha_qpos(il)) alpha_qpos(il) = alpha_qpos1(il) 3584 3509 END IF 3585 3510 END IF … … 3608 3533 m(il, i) = m(il, i)/alpha_qpos(il) 3609 3534 mp(il, i) = mp(il, i)/alpha_qpos(il) 3610 vprecip(il, i) = vprecip(il, i)/alpha_qpos(il)3535 Vprecip(il, i) = vprecip(il, i)/alpha_qpos(il) 3611 3536 END IF 3612 3537 END DO … … 3622 3547 END DO 3623 3548 3624 !AC! DO j = 1,ntra3625 !AC! DO i = 1,nl3626 !AC! DO il = 1,ncum3627 !AC! IF (iflag(il) .le. 1) THEN3628 !AC! ftra(il,i,j) = ftra(il,i,j)/alpha_qpos(il)3629 !AC! ENDIF3630 !AC! ENDDO3631 !AC! ENDDO3632 !AC! ENDDO3633 3634 3635 3549 !AC! DO j = 1,ntra 3550 !AC! DO i = 1,nl 3551 !AC! DO il = 1,ncum 3552 !AC! IF (iflag(il) .le. 1) THEN 3553 !AC! ftra(il,i,j) = ftra(il,i,j)/alpha_qpos(il) 3554 !AC! ENDIF 3555 !AC! ENDDO 3556 !AC! ENDDO 3557 !AC! ENDDO 3558 3559 3560 ! *** reset counter and return *** 3636 3561 3637 3562 DO il = 1, ncum … … 3702 3627 END IF 3703 3628 END IF 3704 3629 ! c print *,'cbmf',il,i,k,cbmf(il),wghti(il,k) 3705 3630 END DO 3706 3631 END DO … … 3710 3635 DO k = i, nl 3711 3636 DO il = 1, ncum 3712 ! test if (i.ge.icb(il).and.i.le.inb(il).and.k.le.inb(il)) 3713 ! then 3637 ! test if (i.ge.icb(il).and.i.le.inb(il).and.k.le.inb(il)) then 3714 3638 IF (i<=inb(il) .AND. k<=inb(il)) THEN 3715 3639 upwd(il, i) = upwd(il, i) + up1(il, k, i) 3716 3640 dnwd(il, i) = dnwd(il, i) + dn1(il, k, i) 3717 3641 END IF 3718 ! c print 3719 ! *,'upwd',il,i,k,inb(il),upwd(il,i),m(il,k),up1(il,k,i) 3642 ! c print *,'upwd',il,i,k,inb(il),upwd(il,i),m(il,k),up1(il,k,i) 3720 3643 END DO 3721 3644 END DO … … 3723 3646 3724 3647 3725 !!!! DO il=1,ncum3726 !!!! do i=icb(il),inb(il)3727 !!!!3728 !!!! upwd(il,i)=0.03729 !!!! dnwd(il,i)=0.03730 !!!! do k=i,inb(il)3731 !!!! up1=0.03732 !!!! dn1=0.03733 !!!! do n=1,i-13734 !!!! up1=up1+ment(il,n,k)3735 !!!! dn1=dn1-ment(il,k,n)3736 !!!! enddo3737 !!!! upwd(il,i)=upwd(il,i)+m(il,k)+up13738 !!!! dnwd(il,i)=dnwd(il,i)+dn13739 !!!! enddo3740 !!!! enddo3741 !!!!3742 !!!! ENDDO3743 3744 3745 3746 3747 3648 !!!! DO il=1,ncum 3649 !!!! do i=icb(il),inb(il) 3650 !!!! 3651 !!!! upwd(il,i)=0.0 3652 !!!! dnwd(il,i)=0.0 3653 !!!! do k=i,inb(il) 3654 !!!! up1=0.0 3655 !!!! dn1=0.0 3656 !!!! do n=1,i-1 3657 !!!! up1=up1+ment(il,n,k) 3658 !!!! dn1=dn1-ment(il,k,n) 3659 !!!! enddo 3660 !!!! upwd(il,i)=upwd(il,i)+m(il,k)+up1 3661 !!!! dnwd(il,i)=dnwd(il,i)+dn1 3662 !!!! enddo 3663 !!!! enddo 3664 !!!! 3665 !!!! ENDDO 3666 3667 ! ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc 3668 ! determination de la variation de flux ascendant entre 3669 ! deux niveau non dilue mip 3670 ! ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc 3748 3671 3749 3672 DO i = 1, nl … … 3787 3710 END DO 3788 3711 3789 3790 3791 3792 3712 ! cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc 3713 ! icb represente de niveau ou se trouve la 3714 ! base du nuage , et inb le top du nuage 3715 ! ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc 3793 3716 3794 3717 DO i = 1, nd … … 3800 3723 DO i = 1, nd 3801 3724 DO il = 1, ncum 3802 rdcp = (rrd*(1.-rr(il,i))-rr(il,i)*rrv)/(cpd*(1.-rr(il, & 3803 i))+rr(il,i)*cpv) 3725 rdcp = (rrd*(1.-rr(il,i))-rr(il,i)*rrv)/(cpd*(1.-rr(il,i))+rr(il,i)*cpv) 3804 3726 tls(il, i) = t(il, i)*(1000.0/p(il,i))**rdcp 3805 3727 tps(il, i) = tp(il, i) … … 3808 3730 3809 3731 3810 ! *** diagnose the in-cloud mixing ratio ***! cld3811 ! *** of condensed water ***! cld3812 ! ! cld 3813 3814 DO i = 1, nd ! cld3815 DO il = 1, ncum ! cld3816 mac(il, i) = 0.0 ! cld3817 wa(il, i) = 0.0 ! cld3818 siga(il, i) = 0.0 ! cld3819 sax(il, i) = 0.0 ! cld3820 END DO ! cld3821 END DO ! cld3822 3823 DO i = minorig, nl ! cld3824 DO k = i + 1, nl + 1 ! cld3825 DO il = 1, ncum ! cld3732 ! *** diagnose the in-cloud mixing ratio *** ! cld 3733 ! *** of condensed water *** ! cld 3734 !! cld 3735 3736 DO i = 1, nd ! cld 3737 DO il = 1, ncum ! cld 3738 mac(il, i) = 0.0 ! cld 3739 wa(il, i) = 0.0 ! cld 3740 siga(il, i) = 0.0 ! cld 3741 sax(il, i) = 0.0 ! cld 3742 END DO ! cld 3743 END DO ! cld 3744 3745 DO i = minorig, nl ! cld 3746 DO k = i + 1, nl + 1 ! cld 3747 DO il = 1, ncum ! cld 3826 3748 IF (i<=inb(il) .AND. k<=(inb(il)+1) .AND. iflag(il)<=1) THEN ! cld 3827 mac(il, i) = mac(il, i) + m(il, k) ! cld3828 END IF ! cld3829 END DO ! cld3830 END DO ! cld3831 END DO ! cld3832 3833 DO i = 1, nl ! cld3834 DO j = 1, i ! cld3835 DO il = 1, ncum ! cld3836 IF (i>=icb(il) .AND. i<=(inb(il)-1) & ! cld3837 .AND. j>=icb(il) .AND. iflag(il)<=1) THEN ! cld3838 sax(il, i) = sax(il, i) + rrd*(tvp(il,j)-tv(il,j)) & ! cld3839 *(ph(il,j)-ph(il,j+1))/p(il, j) ! cld3840 END IF ! cld3841 END DO ! cld3842 END DO ! cld3843 END DO ! cld3844 3845 DO i = 1, nl ! cld3846 DO il = 1, ncum ! cld3847 IF (i>=icb(il) .AND. i<=(inb(il)-1) & ! cld3848 .AND. sax(il,i)>0.0 .AND. iflag(il)<=1) THEN ! cld3849 wa(il, i) = sqrt(2.*sax(il,i)) ! cld3850 END IF ! cld3851 END DO ! cld3852 END DO ! cld3853 3854 DO i = 1, nl ! cld3855 DO il = 1, ncum ! cld3856 IF (wa(il,i)>0.0 .AND. iflag(il)<=1) & ! cld3857 siga(il, i) = mac(il, i)/wa(il, i) & ! cld3858 *rrd*tvp(il, i)/p(il, i)/100./delta ! cld3859 siga(il, i) = min(siga(il,i), 1.0) ! cld3860 ! IM cf. FH 3861 IF (iflag_clw==0) THEN 3862 qcondc(il, i) = siga(il, i)*clw(il, i)*(1.-ep(il,i)) & ! cld3863 +(1.-siga(il,i))*qcond(il, i) ! cld3864 ELSE IF (iflag_clw==1) THEN 3865 qcondc(il, i) = qcond(il, i) ! cld3866 END IF 3867 3868 END DO ! cld3869 END DO 3870 3871 ! cld 3749 mac(il, i) = mac(il, i) + m(il, k) ! cld 3750 END IF ! cld 3751 END DO ! cld 3752 END DO ! cld 3753 END DO ! cld 3754 3755 DO i = 1, nl ! cld 3756 DO j = 1, i ! cld 3757 DO il = 1, ncum ! cld 3758 IF (i>=icb(il) .AND. i<=(inb(il)-1) & ! cld 3759 .AND. j>=icb(il) .AND. iflag(il)<=1) THEN ! cld 3760 sax(il, i) = sax(il, i) + rrd*(tvp(il,j)-tv(il,j)) & ! cld 3761 *(ph(il,j)-ph(il,j+1))/p(il, j) ! cld 3762 END IF ! cld 3763 END DO ! cld 3764 END DO ! cld 3765 END DO ! cld 3766 3767 DO i = 1, nl ! cld 3768 DO il = 1, ncum ! cld 3769 IF (i>=icb(il) .AND. i<=(inb(il)-1) & ! cld 3770 .AND. sax(il,i)>0.0 .AND. iflag(il)<=1) THEN ! cld 3771 wa(il, i) = sqrt(2.*sax(il,i)) ! cld 3772 END IF ! cld 3773 END DO ! cld 3774 END DO ! cld 3775 3776 DO i = 1, nl ! cld 3777 DO il = 1, ncum ! cld 3778 IF (wa(il,i)>0.0 .AND. iflag(il)<=1) & ! cld 3779 siga(il, i) = mac(il, i)/wa(il, i) & ! cld 3780 *rrd*tvp(il, i)/p(il, i)/100./delta ! cld 3781 siga(il, i) = min(siga(il,i), 1.0) ! cld 3782 ! IM cf. FH 3783 IF (iflag_clw==0) THEN ! cld 3784 qcondc(il, i) = siga(il, i)*clw(il, i)*(1.-ep(il,i)) & ! cld 3785 +(1.-siga(il,i))*qcond(il, i) ! cld 3786 ELSE IF (iflag_clw==1) THEN ! cld 3787 qcondc(il, i) = qcond(il, i) ! cld 3788 END IF ! cld 3789 3790 END DO ! cld 3791 END DO 3792 ! print*,'cv3_yield fin' 3793 3872 3794 RETURN 3873 3795 END SUBROUTINE cv3_yield 3874 3796 3875 ! AC! et !RomP >>> 3876 SUBROUTINE cv3_tracer(nloc, len, ncum, nd, na, ment, sigij, da, phi, phi2, & 3877 d1a, dam, ep, vprecip, elij, clw, epmlmmm, eplamm, icb, inb) 3797 !AC! et !RomP >>> 3798 SUBROUTINE cv3_tracer(nloc, len, ncum, nd, na, & 3799 ment, sigij, da, phi, phi2, d1a, dam, & 3800 ep, Vprecip, elij, clw, epmlmMm, eplaMm, & 3801 icb, inb) 3878 3802 IMPLICIT NONE 3879 3803 3880 3804 include "cv3param.h" 3881 3805 3882 !inputs:3806 !inputs: 3883 3807 INTEGER ncum, nd, na, nloc, len 3884 3808 REAL ment(nloc, na, na), sigij(nloc, na, na) … … 3886 3810 REAL ep(nloc, na) 3887 3811 INTEGER icb(nloc), inb(nloc) 3888 REAL vprecip(nloc, nd+1)3889 !ouputs:3812 REAL Vprecip(nloc, nd+1) 3813 !ouputs: 3890 3814 REAL da(nloc, na), phi(nloc, na, na) 3891 3815 REAL phi2(nloc, na, na) 3892 3816 REAL d1a(nloc, na), dam(nloc, na) 3893 REAL epmlm mm(nloc, na, na), eplamm(nloc, na)3894 3895 !local variables:3817 REAL epmlmMm(nloc, na, na), eplaMm(nloc, na) 3818 ! variables pour tracer dans precip de l'AA et des mel 3819 !local variables: 3896 3820 INTEGER i, j, k 3897 3821 REAL epm(nloc, na, na) 3898 3822 3899 3900 3901 3902 3903 3904 3905 3906 3823 ! variables d'Emanuel : du second indice au troisieme 3824 ! ---> tab(i,k,j) -> de l origine k a l arrivee j 3825 ! ment, sigij, elij 3826 ! variables personnelles : du troisieme au second indice 3827 ! ---> tab(i,j,k) -> de k a j 3828 ! phi, phi2 3829 3830 ! initialisations 3907 3831 3908 3832 da(:, :) = 0. … … 3910 3834 dam(:, :) = 0. 3911 3835 epm(:, :, :) = 0. 3912 epla mm(:, :) = 0.3913 epmlm mm(:, :, :) = 0.3836 eplaMm(:, :) = 0. 3837 epmlmMm(:, :, :) = 0. 3914 3838 phi(:, :, :) = 0. 3915 3839 phi2(:, :, :) = 0. 3916 3840 3917 3918 3841 ! fraction deau condensee dans les melanges convertie en precip : epm 3842 ! et eau condensée précipitée dans masse d'air saturé : l_m*dM_m/dzdz.dzdz 3919 3843 DO j = 1, na 3920 3844 DO k = 1, na 3921 3845 DO i = 1, ncum 3922 IF (k>=icb(i) .AND. k<=inb(i) .AND. & ! !jyg &3923 !j.ge.k.and.j.le.inb(i)) then3924 !!jyg epm(i,j,k)=1.-(1.-ep(i,j))*clw(i,j)/elij(i,k,j)3846 IF (k>=icb(i) .AND. k<=inb(i) .AND. & 3847 !!jyg j.ge.k.and.j.le.inb(i)) then 3848 !!jyg epm(i,j,k)=1.-(1.-ep(i,j))*clw(i,j)/elij(i,k,j) 3925 3849 j>k .AND. j<=inb(i)) THEN 3926 3850 epm(i, j, k) = 1. - (1.-ep(i,j))*clw(i, j)/max(elij(i,k,j), 1.E-16) 3927 !!3851 !! 3928 3852 epm(i, j, k) = max(epm(i,j,k), 0.0) 3929 3853 END IF … … 3937 3861 DO i = 1, ncum 3938 3862 IF (k>=icb(i) .AND. k<=inb(i)) THEN 3939 epla mm(i, j) = eplamm(i, j) + ep(i, j)*clw(i, j)*ment(i, j, k)*(1.-&3940 sigij(i,j,k))3863 eplaMm(i, j) = eplamm(i, j) + & 3864 ep(i, j)*clw(i, j)*ment(i, j, k)*(1.-sigij(i,j,k)) 3941 3865 END IF 3942 3866 END DO … … 3948 3872 DO i = 1, ncum 3949 3873 IF (k>=icb(i) .AND. k<=inb(i) .AND. j<=inb(i)) THEN 3950 epmlm mm(i, j, k) = epm(i, j, k)*elij(i, k, j)*ment(i, k, j)3874 epmlmMm(i, j, k) = epm(i, j, k)*elij(i, k, j)*ment(i, k, j) 3951 3875 END IF 3952 3876 END DO … … 3954 3878 END DO 3955 3879 3956 3880 ! matrices pour calculer la tendance des concentrations dans cvltr.F90 3957 3881 DO j = 1, na 3958 3882 DO k = 1, na … … 3962 3886 d1a(i, j) = d1a(i, j) + ment(i, k, j)*ep(i, k)*(1.-sigij(i,k,j)) 3963 3887 IF (k<=j) THEN 3964 dam(i, j) = dam(i, j) + ment(i, k, j)*epm(i, k, j)*(1.-ep(i,k))*(1. & 3965 -sigij(i,k,j)) 3966 3888 dam(i, j) = dam(i, j) + ment(i, k, j)*epm(i, k, j)*(1.-ep(i,k))*(1.-sigij(i,k,j)) 3967 3889 phi2(i, j, k) = phi(i, j, k)*epm(i, j, k) 3968 3890 END IF … … 3973 3895 RETURN 3974 3896 END SUBROUTINE cv3_tracer 3975 ! AC! et !RomP <<< 3976 3977 SUBROUTINE cv3_uncompress(nloc, len, ncum, nd, ntra, idcum, iflag, precip, & 3978 sig, w0, ft, fq, fu, fv, ftra, ma, upwd, dnwd, dnwd0, qcondc, wd, cape, & 3979 iflag1, precip1, sig1, w01, ft1, fq1, fu1, fv1, ftra1, ma1, upwd1, dnwd1, & 3980 dnwd01, qcondc1, wd1, cape1) 3897 !AC! et !RomP <<< 3898 3899 SUBROUTINE cv3_uncompress(nloc, len, ncum, nd, ntra, idcum, & 3900 iflag, & 3901 precip, sig, w0, & 3902 ft, fq, fu, fv, ftra, & 3903 Ma, upwd, dnwd, dnwd0, qcondc, wd, cape, & 3904 iflag1, & 3905 precip1, sig1, w01, & 3906 ft1, fq1, fu1, fv1, ftra1, & 3907 Ma1, upwd1, dnwd1, dnwd01, qcondc1, wd1, cape1) 3981 3908 IMPLICIT NONE 3982 3909 3983 3910 include "cv3param.h" 3984 3911 3985 !inputs:3912 !inputs: 3986 3913 INTEGER len, ncum, nd, ntra, nloc 3987 3914 INTEGER idcum(nloc) … … 3996 3923 REAL wd(nloc), cape(nloc) 3997 3924 3998 !outputs:3925 !outputs: 3999 3926 INTEGER iflag1(len) 4000 3927 REAL precip1(len) … … 4007 3934 REAL wd1(nloc), cape1(nloc) 4008 3935 4009 !local variables:3936 !local variables: 4010 3937 INTEGER i, k, j 4011 3938 … … 4038 3965 4039 3966 4040 ! AC! do 2100 j=1,ntra 4041 ! AC!c oct3 do 2110 k=1,nl 4042 ! AC! do 2110 k=1,nd ! oct3 4043 ! AC! do 2120 i=1,ncum 4044 ! AC! ftra1(idcum(i),k,j)=ftra(i,k,j) 4045 ! AC! 2120 continue 4046 ! AC! 2110 continue 4047 ! AC! 2100 continue 3967 !AC! do 2100 j=1,ntra 3968 !AC!c oct3 do 2110 k=1,nl 3969 !AC! do 2110 k=1,nd ! oct3 3970 !AC! do 2120 i=1,ncum 3971 !AC! ftra1(idcum(i),k,j)=ftra(i,k,j) 3972 !AC! 2120 continue 3973 !AC! 2110 continue 3974 !AC! 2100 continue 3975 ! 4048 3976 RETURN 4049 3977 END SUBROUTINE cv3_uncompress -
LMDZ5/trunk/libf/phylmd/cv3p_mixing.F90
r1992 r2007 1 SUBROUTINE cv3p_mixing(nloc, ncum, nd, na, ntra, icb, nk, inb, ph, t, rr, rs, & 2 u, v, tra, h, lv, qnk, unk, vnk, hp, tv, tvp, ep, clw, sig, ment, qent, & 3 hent, uent, vent, nent, sigij, elij, supmax, ments, qents, traent) 4 ! ************************************************************** 5 ! * 6 ! CV3P_MIXING : compute mixed draught properties and, * 7 ! within a scaling factor, mixed draught * 8 ! mass fluxes. * 9 ! written by : VTJ Philips,JY Grandpeix, 21/05/2003, 09.14.15* 10 ! modified by : * 11 ! ************************************************************** 1 SUBROUTINE cv3p_mixing(nloc, ncum, nd, na, ntra, icb, nk, inb, & 2 ph, t, rr, rs, u, v, tra, h, lv, qnk, & 3 unk, vnk, hp, tv, tvp, ep, clw, sig, & 4 Ment, Qent, hent, uent, vent, nent, & 5 Sigij, elij, supmax, Ments, Qents, traent) 6 ! ************************************************************** 7 ! * 8 ! CV3P_MIXING : compute mixed draught properties and, * 9 ! within a scaling factor, mixed draught * 10 ! mass fluxes. * 11 ! written by : VTJ Philips,JY Grandpeix, 21/05/2003, 09.14.15* 12 ! modified by : * 13 ! ************************************************************** 12 14 13 15 IMPLICIT NONE … … 17 19 include "YOMCST2.h" 18 20 19 ! inputs: 20 INTEGER ncum, nd, na, ntra, nloc 21 INTEGER icb(nloc), inb(nloc), nk(nloc) 22 REAL sig(nloc, nd) 23 REAL qnk(nloc), unk(nloc), vnk(nloc) 24 REAL ph(nloc, nd+1) 25 REAL t(nloc, nd), rr(nloc, nd), rs(nloc, nd) 26 REAL u(nloc, nd), v(nloc, nd) 27 REAL tra(nloc, nd, ntra) ! input of convect3 28 REAL lv(nloc, na) 29 REAL h(nloc, na) !liquid water static energy of environment 30 REAL hp(nloc, na) !liquid water static energy of air shed from adiab. asc. 31 REAL tv(nloc, na), tvp(nloc, na), ep(nloc, na), clw(nloc, na) 32 33 ! outputs: 34 REAL ment(nloc, na, na), qent(nloc, na, na) 35 REAL uent(nloc, na, na), vent(nloc, na, na) 36 REAL sigij(nloc, na, na), elij(nloc, na, na) 37 REAL supmax(nloc, na) ! Highest mixing fraction of mixed updraughts 38 ! with the sign of (h-hp) 39 REAL traent(nloc, nd, nd, ntra) 40 REAL ments(nloc, nd, nd), qents(nloc, nd, nd) 41 REAL hent(nloc, nd, nd) 42 INTEGER nent(nloc, nd) 43 44 ! local variables: 21 !inputs: 22 INTEGER, INTENT (IN) :: ncum, nd, na 23 INTEGER, INTENT (IN) :: ntra, nloc 24 INTEGER, DIMENSION (nloc), INTENT (IN) :: icb, inb, nk 25 REAL, DIMENSION (nloc, nd), INTENT (IN) :: sig 26 REAL, DIMENSION (nloc), INTENT (IN) :: qnk, unk, vnk 27 REAL, DIMENSION (nloc, nd+1), INTENT (IN) :: ph 28 REAL, DIMENSION (nloc, nd), INTENT (IN) :: t, rr, rs 29 REAL, DIMENSION (nloc, nd), INTENT (IN) :: u, v 30 REAL, DIMENSION (nloc, nd, ntra), INTENT (IN) :: tra ! input of convect3 31 REAL, DIMENSION (nloc, na), INTENT (IN) :: lv 32 REAL, DIMENSION (nloc, na), INTENT (IN) :: h !liquid water static energy of environMent 33 REAL, DIMENSION (nloc, na), INTENT (IN) :: hp !liquid water static energy of air shed from adiab. asc. 34 REAL, DIMENSION (nloc, na), INTENT (IN) :: tv, tvp 35 REAL, DIMENSION (nloc, na), INTENT (IN) :: ep, clw 36 37 !outputs: 38 REAL, DIMENSION (nloc, na, na), INTENT (OUT) :: Ment, Qent 39 REAL, DIMENSION (nloc, na, na), INTENT (OUT) :: uent, vent 40 REAL, DIMENSION (nloc, na, na), INTENT (OUT) :: Sigij, elij 41 REAL, DIMENSION (nloc, na), INTENT (OUT) :: supmax(nloc, na) ! Highest mixing fraction of mixed 42 ! updraughts with the sign of (h-hp) 43 REAL, DIMENSION (nloc, nd, nd, ntra), INTENT (OUT) :: traent 44 REAL, DIMENSION (nloc, nd, nd), INTENT (OUT) :: Ments, Qents 45 REAL, DIMENSION (nloc, nd, nd), INTENT (OUT) :: hent 46 INTEGER, DIMENSION (nloc, nd), INTENT (OUT) :: nent 47 48 !local variables: 45 49 INTEGER i, j, k, il, im, jm 46 50 INTEGER num1, num2 47 REAL rti, bf2, anum, denom, dei, altem, cwat, stemp, qp 48 REAL alt, delp, delm 49 REAL qmixmax(nloc), rmixmax(nloc), sqmrmax(nloc) 50 REAL qmixmin(nloc), rmixmin(nloc), sqmrmin(nloc) 51 REAL signhpmh(nloc) 52 REAL sx(nloc), scrit2 53 REAL smid(nloc), sjmin(nloc), sjmax(nloc) 54 REAL sbef(nloc), sup(nloc), smin(nloc) 55 REAL asij(nloc), smax(nloc), scrit(nloc) 56 REAL sij(nloc, nd, nd) 57 REAL csum(nloc, nd) 58 REAL awat 59 LOGICAL lwork(nloc) 51 REAL :: rti, bf2, anum, denom, dei, altem, cwat, stemp, qp 52 REAL :: alt, delp, delm 53 REAL, DIMENSION (nloc) :: Qmixmax, Rmixmax, sqmrmax 54 REAL, DIMENSION (nloc) :: Qmixmin, Rmixmin, sqmrmin 55 REAL, DIMENSION (nloc) :: signhpmh 56 REAL, DIMENSION (nloc) :: Sx 57 REAL :: Scrit2 58 REAL, DIMENSION (nloc) :: Smid, Sjmin, Sjmax 59 REAL, DIMENSION (nloc) :: Sbef, sup, smin 60 REAL, DIMENSION (nloc) :: ASij, smax, Scrit 61 REAL, DIMENSION (nloc, nd, nd) :: Sij 62 REAL, DIMENSION (nloc, nd) :: csum 63 REAL :: awat 64 LOGICAL, DIMENSION (nloc) :: lwork 60 65 61 66 REAL amxupcrit, df, ff 62 67 INTEGER nstep 63 68 64 ! -- Mixing probability distribution functions 65 66 REAL qcoef1, qcoef2, qff, qfff, qmix, rmix, qmix1, rmix1, qmix2, rmix2, f 67 68 qcoef1(f) = tanh(f/gammas) 69 qcoef2(f) = (tanh(f/gammas)+gammas*log(cosh((1.-f)/gammas)/cosh(f/gammas))) 70 qff(f) = max(min(f,1.), 0.) 71 qfff(f) = min(qff(f), scut) 72 qmix1(f) = (tanh((qff(f)-fmax)/gammas)+qcoef1max)/qcoef2max 73 rmix1(f) = (gammas*log(cosh((qff(f)-fmax)/gammas))+qff(f)*qcoef1max)/ & 74 qcoef2max 75 qmix2(f) = -log(1.-qfff(f))/scut 76 rmix2(f) = (qfff(f)+(1.-qff(f))*log(1.-qfff(f)))/scut 77 qmix(f) = qqa1*qmix1(f) + qqa2*qmix2(f) 78 rmix(f) = qqa1*rmix1(f) + qqa2*rmix2(f) 69 ! -- Mixing probability distribution functions 70 71 REAL Qcoef1, Qcoef2, QFF, QFFF, Qmix, Rmix, Qmix1, Rmix1, Qmix2, Rmix2, F 72 73 Qcoef1(F) = tanh(F/gammas) 74 Qcoef2(F) = (tanh(F/gammas)+gammas*log(cosh((1.-F)/gammas)/cosh(F/gammas))) 75 QFF(F) = max(min(F,1.), 0.) 76 QFFf(F) = min(QFF(F), scut) 77 Qmix1(F) = (tanh((QFF(F)-Fmax)/gammas)+Qcoef1max)/Qcoef2max 78 Rmix1(F) = (gammas*log(cosh((QFF(F)-Fmax)/gammas))+QFF(F)*Qcoef1max)/Qcoef2max 79 Qmix2(F) = -log(1.-QFFf(F))/scut 80 Rmix2(F) = (QFFf(F)+(1.-QFF(F))*log(1.-QFFf(F)))/scut 81 Qmix(F) = qqa1*Qmix1(F) + qqa2*Qmix2(F) 82 Rmix(F) = qqa1*Rmix1(F) + qqa2*Rmix2(F) 79 83 80 84 INTEGER, SAVE :: ifrst 81 85 DATA ifrst/0/ 82 83 84 85 86 87 88 89 86 !$OMP THREADPRIVATE(ifrst) 87 88 89 ! ===================================================================== 90 ! --- INITIALIZE VARIOUS ARRAYS USED IN THE COMPUTATIONS 91 ! ===================================================================== 92 93 ! -- Initialize mixing PDF coefficients 90 94 IF (ifrst==0) THEN 91 95 ifrst = 1 92 qcoef1max = qcoef1(fmax)93 qcoef2max = qcoef2(fmax)96 Qcoef1max = Qcoef1(Fmax) 97 Qcoef2max = Qcoef2(Fmax) 94 98 95 99 END IF 96 100 97 101 98 102 ! ori do 360 i=1,ncum*nlp 99 103 DO j = 1, nl 100 104 DO i = 1, ncum 101 105 nent(i, j) = 0 102 103 104 END DO 105 END DO 106 107 108 106 ! in convect3, m is computed in cv3_closure 107 ! ori m(i,1)=0.0 108 END DO 109 END DO 110 111 ! ori do 400 k=1,nlp 112 ! ori do 390 j=1,nlp 109 113 DO j = 1, nl 110 114 DO k = 1, nl 111 115 DO i = 1, ncum 112 qent(i, k, j) = rr(i, j)116 Qent(i, k, j) = rr(i, j) 113 117 uent(i, k, j) = u(i, j) 114 118 vent(i, k, j) = v(i, j) 115 119 elij(i, k, j) = 0.0 116 120 hent(i, k, j) = 0.0 117 ! AC! ment(i,k,j)=0.0118 ! AC! sij(i,k,j)=0.0119 END DO 120 END DO 121 END DO 122 123 !AC!124 ment(1:ncum, 1:nd, 1:nd) = 0.0125 sij(1:ncum, 1:nd, 1:nd) = 0.0126 !AC!121 !AC! Ment(i,k,j)=0.0 122 !AC! Sij(i,k,j)=0.0 123 END DO 124 END DO 125 END DO 126 127 !AC! 128 Ment(1:ncum, 1:nd, 1:nd) = 0.0 129 Sij(1:ncum, 1:nd, 1:nd) = 0.0 130 !AC! 127 131 128 132 DO k = 1, ntra … … 136 140 END DO 137 141 138 139 ! --- CALCULATE ENTRAINED AIR MASS FLUX (ment), TOTAL WATER MIXING140 141 ! --- FRACTION (sij)142 142 ! ===================================================================== 143 ! --- CALCULATE ENTRAINED AIR MASS FLUX (Ment), TOTAL WATER MIXING 144 ! --- RATIO (QENT), TOTAL CONDENSED WATER (elij), AND MIXING 145 ! --- FRACTION (Sij) 146 ! ===================================================================== 143 147 144 148 DO i = minorig + 1, nl … … 146 150 DO j = minorig, nl 147 151 DO il = 1, ncum 148 IF ((i>=icb(il)) .AND. (i<=inb(il)) .AND. (j>=(icb(il)- &149 1)).AND. (j<=inb(il))) THEN152 IF ((i>=icb(il)) .AND. (i<=inb(il)) .AND. (j>=(icb(il)-1)) & 153 .AND. (j<=inb(il))) THEN 150 154 151 155 rti = qnk(il) - ep(il, i)*clw(il, i) … … 155 159 dei = denom 156 160 IF (abs(dei)<0.01) dei = 0.01 157 sij(il, i, j) = anum/dei158 sij(il, i, i) = 1.0159 altem = sij(il, i, j)*rr(il, i) + (1.-sij(il,i,j))*rti - rs(il, j)161 Sij(il, i, j) = anum/dei 162 Sij(il, i, i) = 1.0 163 altem = Sij(il, i, j)*rr(il, i) + (1.-Sij(il,i,j))*rti - rs(il, j) 160 164 altem = altem/bf2 161 165 cwat = clw(il, j)*(1.-ep(il,j)) 162 stemp = sij(il, i, j)166 stemp = Sij(il, i, j) 163 167 IF ((stemp<0.0 .OR. stemp>1.0 .OR. altem>cwat) .AND. j>i) THEN 164 168 anum = anum - lv(il, j)*(rti-rs(il,j)-cwat*bf2) 165 169 denom = denom + lv(il, j)*(rr(il,i)-rti) 166 170 IF (abs(denom)<0.01) denom = 0.01 167 sij(il, i, j) = anum/denom 168 altem = sij(il, i, j)*rr(il, i) + (1.-sij(il,i,j))*rti - & 169 rs(il, j) 171 Sij(il, i, j) = anum/denom 172 altem = Sij(il, i, j)*rr(il, i) + (1.-Sij(il,i,j))*rti - rs(il, j) 170 173 altem = altem - (bf2-1.)*cwat 171 174 END IF 172 IF ( sij(il,i,j)>0.0) THEN173 ! cc ment(il,i,j)=m(il,i)174 ment(il, i, j) = 1.175 IF (Sij(il,i,j)>0.0) THEN 176 !!! Ment(il,i,j)=m(il,i) 177 Ment(il, i, j) = 1. 175 178 elij(il, i, j) = altem 176 179 elij(il, i, j) = amax1(0.0, elij(il,i,j)) … … 178 181 END IF 179 182 180 sij(il, i, j) = amax1(0.0, sij(il,i,j))181 sij(il, i, j) = amin1(1.0, sij(il,i,j))183 Sij(il, i, j) = amax1(0.0, Sij(il,i,j)) 184 Sij(il, i, j) = amin1(1.0, Sij(il,i,j)) 182 185 END IF ! new 183 186 END DO … … 185 188 186 189 187 ! *** if no air can entrain at level i assume that updraft detrains 188 ! *** 189 ! *** at that level and calculate detrained air flux and properties 190 ! *** 191 192 193 ! @ do 170 i=icb(il),inb(il) 190 ! *** if no air can entrain at level i assume that updraft detrains *** 191 ! *** at that level and calculate detrained air flux and properties *** 192 193 194 ! @ do 170 i=icb(il),inb(il) 194 195 195 196 DO il = 1, ncum 196 197 IF ((i>=icb(il)) .AND. (i<=inb(il)) .AND. (nent(il,i)==0)) THEN 197 198 ! cc ment(il,i,i)=m(il,i)199 ment(il, i, i) = 1.200 qent(il, i, i) = qnk(il) - ep(il, i)*clw(il, i)198 ! @ if(nent(il,i).eq.0)then 199 !!! Ment(il,i,i)=m(il,i) 200 Ment(il, i, i) = 1. 201 Qent(il, i, i) = qnk(il) - ep(il, i)*clw(il, i) 201 202 uent(il, i, i) = unk(il) 202 203 vent(il, i, i) = vnk(il) 203 204 elij(il, i, i) = clw(il, i)*(1.-ep(il,i)) 204 sij(il, i, i) = 0.0205 Sij(il, i, i) = 0.0 205 206 END IF 206 207 END DO … … 220 221 DO i = minorig, nl 221 222 DO il = 1, ncum 222 IF ((j>=(icb(il)-1)) .AND. (j<=inb(il)) .AND. (i>=icb(il)) .AND. (i<=&223 inb(il))) THEN224 sigij(il, i, j) = sij(il, i, j)225 END IF 226 END DO 227 END DO 228 END DO 229 230 231 232 233 234 235 236 223 IF ((j>=(icb(il)-1)) .AND. (j<=inb(il)) .AND. & 224 (i>=icb(il)) .AND. (i<=inb(il))) THEN 225 Sigij(il, i, j) = Sij(il, i, j) 226 END IF 227 END DO 228 END DO 229 END DO 230 ! @ enddo 231 232 ! @170 continue 233 234 ! ===================================================================== 235 ! --- NORMALIZE ENTRAINED AIR MASS FLUXES 236 ! --- TO REPRESENT EQUAL PROBABILITIES OF MIXING 237 ! ===================================================================== 237 238 238 239 CALL zilch(csum, nloc*nd) … … 242 243 END DO 243 244 244 245 DO i = minorig + 1, nl !Loop on origin level "i"246 245 ! --------------------------------------------------------------- 246 DO i = minorig + 1, nl !Loop on origin level "i" 247 ! --------------------------------------------------------------- 247 248 248 249 num1 = 0 … … 253 254 254 255 255 ! jyg1 Find maximum of SIJ for J>I, if any.256 257 sx(:) = 0.256 !JYG1 Find maximum of SIJ for J>I, if any. 257 258 Sx(:) = 0. 258 259 259 260 DO il = 1, ncum 260 261 IF (i>=icb(il) .AND. i<=inb(il)) THEN 261 262 signhpmh(il) = sign(1., hp(il,i)-h(il,i)) 262 sbef(il) = max(0., signhpmh(il))263 Sbef(il) = max(0., signhpmh(il)) 263 264 END IF 264 265 END DO … … 267 268 DO il = 1, ncum 268 269 IF (i>=icb(il) .AND. i<=inb(il) .AND. j<=inb(il)) THEN 269 IF ( sbef(il)<sij(il,i,j)) THEN270 sx(il) = max(sij(il,i,j), sx(il))271 END IF 272 sbef(il) = sij(il, i, j)270 IF (Sbef(il)<Sij(il,i,j)) THEN 271 Sx(il) = max(Sij(il,i,j), Sx(il)) 272 END IF 273 Sbef(il) = Sij(il, i, j) 273 274 END IF 274 275 END DO … … 279 280 IF (i>=icb(il) .AND. i<=inb(il)) THEN 280 281 lwork(il) = (nent(il,i)/=0) 281 qp= qnk(il) - ep(il, i)*clw(il, i)282 anum = h(il, i) - hp(il, i) - lv(il, i)*( qp-rs(il,i)) + &283 (cpv-cpd)*t(il, i)*(qp-rr(il,i))284 denom = h(il, i) - hp(il, i) + lv(il, i)*(rr(il,i)- qp) + &285 (cpd-cpv)*t(il, i)*(rr(il,i)-qp)282 rti = qnk(il) - ep(il, i)*clw(il, i) 283 anum = h(il, i) - hp(il, i) - lv(il, i)*(rti-rs(il,i)) + & 284 (cpv-cpd)*t(il, i)*(rti-rr(il,i)) 285 denom = h(il, i) - hp(il, i) + lv(il, i)*(rr(il,i)-rti) + & 286 (cpd-cpv)*t(il, i)*(rr(il,i)-rti) 286 287 IF (abs(denom)<0.01) denom = 0.01 287 scrit(il) = min(anum/denom, 1.)288 alt = qp - rs(il, i) + scrit(il)*(rr(il,i)-qp)289 290 ! jyg1 Find new critical value Scrit2291 !such that : Sij > Scrit2 => mixed draught will detrain at J<I292 !Sij < Scrit2 => mixed draught will detrain at J>I293 294 scrit2 = min(scrit(il), sx(il))*max(0., -signhpmh(il)) + &295 scrit(il)*max(0., signhpmh(il))296 297 scrit(il) = scrit2298 299 ! jygCorrection pour la nouvelle logique; la correction pour ALT300 301 IF ( scrit(il)<=0.0) scrit(il) = 0.0302 IF (alt<=0.0) scrit(il) = 1.0288 Scrit(il) = min(anum/denom, 1.) 289 alt = rti - rs(il, i) + Scrit(il)*(rr(il,i)-rti) 290 291 !JYG1 Find new critical value Scrit2 292 ! such that : Sij > Scrit2 => mixed draught will detrain at J<I 293 ! Sij < Scrit2 => mixed draught will detrain at J>I 294 295 Scrit2 = min(Scrit(il), Sx(il))*max(0., -signhpmh(il)) + & 296 Scrit(il)*max(0., signhpmh(il)) 297 298 Scrit(il) = Scrit2 299 300 !JYG Correction pour la nouvelle logique; la correction pour ALT 301 ! est un peu au hazard 302 IF (Scrit(il)<=0.0) Scrit(il) = 0.0 303 IF (alt<=0.0) Scrit(il) = 1.0 303 304 304 305 smax(il) = 0.0 305 asij(il) = 0.0306 sup(il) = 0. ! upper S-value reached by descending draughts307 END IF 308 END DO 309 310 311 DO j = minorig, nl !Loop on destination level "j"312 306 ASij(il) = 0.0 307 sup(il) = 0. ! upper S-value reached by descending draughts 308 END IF 309 END DO 310 311 ! --------------------------------------------------------------- 312 DO j = minorig, nl !Loop on destination level "j" 313 ! --------------------------------------------------------------- 313 314 314 315 num2 = 0 315 316 DO il = 1, ncum 316 IF (i>=icb(il) .AND. i<=inb(il) .AND. j>=(icb( & 317 il)-1) .AND. j<=inb(il) .AND. lwork(il)) num2 = num2 + 1 317 IF (i>=icb(il) .AND. i<=inb(il) .AND. & 318 j>=(icb(il)-1) .AND. j<=inb(il) .AND. & 319 lwork(il)) num2 = num2 + 1 318 320 END DO 319 321 IF (num2<=0) GO TO 175 320 322 321 323 ! ----------------------------------------------- 322 324 IF (j>i) THEN 323 325 ! ----------------------------------------------- 324 326 DO il = 1, ncum 325 IF (i>=icb(il) .AND. i<=inb(il) .AND. j>=(icb(&326 il)-1) .AND. j<=inb(il) .AND. lwork(il)) THEN327 IF (sij(il,i,j)>0.0) THEN328 smid(il) = min(sij(il,i,j), scrit(il))329 sjmax(il) = smid(il)330 sjmin(il) = smid(il)331 IF (smid(il)<smin(il) .AND. sij(il,i,j+1)<smid(il)) THEN332 smin(il) = smid(il)333 s jmax(il) = min((sij(il,i,j+1)+sij(il,i, &334 j))/2., sij(il,i,j), scrit(il))335 sjmin(il) = max((sbef(il)+sij(il,i,j))/2., sij(il,i,j))336 sjmin(il) = min(sjmin(il), scrit(il))337 sbef(il) = sij(il, i, j)327 IF (i>=icb(il) .AND. i<=inb(il) .AND. & 328 j>=(icb(il)-1) .AND. j<=inb(il) .AND. & 329 lwork(il)) THEN 330 IF (Sij(il,i,j)>0.0) THEN 331 Smid(il) = min(Sij(il,i,j), Scrit(il)) 332 Sjmax(il) = Smid(il) 333 Sjmin(il) = Smid(il) 334 IF (Smid(il)<smin(il) .AND. Sij(il,i,j+1)<Smid(il)) THEN 335 smin(il) = Smid(il) 336 Sjmax(il) = min((Sij(il,i,j+1)+Sij(il,i,j))/2., Sij(il,i,j), Scrit(il)) 337 Sjmin(il) = max((Sbef(il)+Sij(il,i,j))/2., Sij(il,i,j)) 338 Sjmin(il) = min(Sjmin(il), Scrit(il)) 339 Sbef(il) = Sij(il, i, j) 338 340 END IF 339 341 END IF 340 342 END IF 341 343 END DO 342 344 ! ----------------------------------------------- 343 345 ELSE IF (j==i) THEN 344 346 ! ----------------------------------------------- 345 347 DO il = 1, ncum 346 IF (i>=icb(il) .AND. i<=inb(il) .AND. j>=(icb( & 347 il)-1) .AND. j<=inb(il) .AND. lwork(il)) THEN 348 IF (sij(il,i,j)>0.0) THEN 349 smid(il) = 1. 350 sjmin(il) = max((sij(il,i,j-1)+smid(il))/2., scrit(il))*max(0., & 351 -signhpmh(il)) + min((sij(il,i,j+1)+smid(il))/2., scrit(il))* & 352 max(0., signhpmh(il)) 353 sjmin(il) = max(sjmin(il), sup(il)) 354 sjmax(il) = 1. 355 356 ! - preparation des variables Scrit, Smin et Sbef 357 ! pour la partie j>i 358 scrit(il) = min(sjmin(il), sjmax(il), scrit(il)) 348 IF (i>=icb(il) .AND. i<=inb(il) .AND. & 349 j>=(icb(il)-1) .AND. j<=inb(il) .AND. & 350 lwork(il)) THEN 351 IF (Sij(il,i,j)>0.0) THEN 352 Smid(il) = 1. 353 Sjmin(il) = max((Sij(il,i,j-1)+Smid(il))/2., Scrit(il))*max(0., -signhpmh(il)) + & 354 min((Sij(il,i,j+1)+Smid(il))/2., Scrit(il))*max(0., signhpmh(il)) 355 Sjmin(il) = max(Sjmin(il), sup(il)) 356 Sjmax(il) = 1. 357 358 ! - preparation des variables Scrit, Smin et Sbef pour la partie j>i 359 Scrit(il) = min(Sjmin(il), Sjmax(il), Scrit(il)) 359 360 360 361 smin(il) = 1. 361 sbef(il) = max(0., signhpmh(il))362 supmax(il, i) = sign( scrit(il), -signhpmh(il))363 END IF 364 END IF 365 END DO 366 362 Sbef(il) = max(0., signhpmh(il)) 363 supmax(il, i) = sign(Scrit(il), -signhpmh(il)) 364 END IF 365 END IF 366 END DO 367 ! ----------------------------------------------- 367 368 ELSE IF (j<i) THEN 368 369 ! ----------------------------------------------- 369 370 DO il = 1, ncum 370 IF (i>=icb(il) .AND. i<=inb(il) .AND. j>=(icb( & 371 il)-1) .AND. j<=inb(il) .AND. lwork(il)) THEN 372 IF (sij(il,i,j)>0.0) THEN 373 smid(il) = max(sij(il,i,j), scrit(il)) 374 sjmax(il) = smid(il) 375 sjmin(il) = smid(il) 376 IF (smid(il)>smax(il) .AND. sij(il,i,j+1)>smid(il)) THEN 377 smax(il) = smid(il) 378 sjmax(il) = max((sij(il,i,j+1)+sij(il,i,j))/2., sij(il,i,j)) 379 sjmax(il) = max(sjmax(il), scrit(il)) 380 sjmin(il) = min((sbef(il)+sij(il,i,j))/2., sij(il,i,j)) 381 sjmin(il) = max(sjmin(il), scrit(il)) 382 sbef(il) = sij(il, i, j) 371 IF (i>=icb(il) .AND. i<=inb(il) .AND. & 372 j>=(icb(il)-1) .AND. j<=inb(il) .AND. & 373 lwork(il)) THEN 374 IF (Sij(il,i,j)>0.0) THEN 375 Smid(il) = max(Sij(il,i,j), Scrit(il)) 376 Sjmax(il) = Smid(il) 377 Sjmin(il) = Smid(il) 378 IF (Smid(il)>smax(il) .AND. Sij(il,i,j+1)>Smid(il)) THEN 379 smax(il) = Smid(il) 380 Sjmax(il) = max((Sij(il,i,j+1)+Sij(il,i,j))/2., Sij(il,i,j)) 381 Sjmax(il) = max(Sjmax(il), Scrit(il)) 382 Sjmin(il) = min((Sbef(il)+Sij(il,i,j))/2., Sij(il,i,j)) 383 Sjmin(il) = max(Sjmin(il), Scrit(il)) 384 Sbef(il) = Sij(il, i, j) 383 385 END IF 384 IF (abs(sjmin(il)-sjmax(il))>1.E-10) sup(il) = max(sjmin(il), & 385 sjmax(il), sup(il)) 386 END IF 387 END IF 388 END DO 389 ! ----------------------------------------------- 390 END IF 391 ! ----------------------------------------------- 392 393 394 DO il = 1, ncum 395 IF (i>=icb(il) .AND. i<=inb(il) .AND. j>=(icb( & 396 il)-1) .AND. j<=inb(il) .AND. lwork(il)) THEN 397 IF (sij(il,i,j)>0.0) THEN 386 IF (abs(Sjmin(il)-Sjmax(il))>1.E-10) & 387 sup(il) = max(Sjmin(il), Sjmax(il), sup(il)) 388 END IF 389 END IF 390 END DO 391 ! ----------------------------------------------- 392 END IF 393 ! ----------------------------------------------- 394 395 396 DO il = 1, ncum 397 IF (i>=icb(il) .AND. i<=inb(il) .AND. & 398 j>=(icb(il)-1) .AND. j<=inb(il) .AND. & 399 lwork(il)) THEN 400 IF (Sij(il,i,j)>0.0) THEN 398 401 rti = qnk(il) - ep(il, i)*clw(il, i) 399 qmixmax(il) = qmix(sjmax(il)) 400 qmixmin(il) = qmix(sjmin(il)) 401 rmixmax(il) = rmix(sjmax(il)) 402 rmixmin(il) = rmix(sjmin(il)) 403 sqmrmax(il) = sjmax(il)*qmix(sjmax(il)) - rmix(sjmax(il)) 404 sqmrmin(il) = sjmin(il)*qmix(sjmin(il)) - rmix(sjmin(il)) 405 406 ment(il, i, j) = abs(qmixmax(il)-qmixmin(il))*ment(il, i, j) 407 408 ! Sigij(i,j) is the 'true' mixing fraction of mixture Ment(i,j) 409 IF (abs(qmixmax(il)-qmixmin(il))>1.E-10) THEN 410 sigij(il, i, j) = (sqmrmax(il)-sqmrmin(il))/ & 411 (qmixmax(il)-qmixmin(il)) 402 Qmixmax(il) = Qmix(Sjmax(il)) 403 Qmixmin(il) = Qmix(Sjmin(il)) 404 Rmixmax(il) = Rmix(Sjmax(il)) 405 Rmixmin(il) = Rmix(Sjmin(il)) 406 sqmrmax(il) = Sjmax(il)*Qmix(Sjmax(il)) - Rmix(Sjmax(il)) 407 sqmrmin(il) = Sjmin(il)*Qmix(Sjmin(il)) - Rmix(Sjmin(il)) 408 409 Ment(il, i, j) = abs(Qmixmax(il)-Qmixmin(il))*Ment(il, i, j) 410 411 ! Sigij(i,j) is the 'true' mixing fraction of mixture Ment(i,j) 412 IF (abs(Qmixmax(il)-Qmixmin(il))>1.E-10) THEN 413 Sigij(il, i, j) = (sqmrmax(il)-sqmrmin(il))/(Qmixmax(il)-Qmixmin(il)) 412 414 ELSE 413 sigij(il, i, j) = 0. 414 END IF 415 416 ! -- Compute Qent, uent, vent according to the true mixing 417 ! fraction 418 qent(il, i, j) = (1.-sigij(il,i,j))*rti + & 419 sigij(il, i, j)*rr(il, i) 420 uent(il, i, j) = (1.-sigij(il,i,j))*unk(il) + & 421 sigij(il, i, j)*u(il, i) 422 vent(il, i, j) = (1.-sigij(il,i,j))*vnk(il) + & 423 sigij(il, i, j)*v(il, i) 424 425 ! -- Compute liquid water static energy of mixed draughts 426 ! IF (j .GT. i) THEN 427 ! awat=elij(il,i,j)-(1.-ep(il,j))*clw(il,j) 428 ! awat=amax1(awat,0.0) 429 ! ELSE 430 ! awat = 0. 431 ! ENDIF 432 ! Hent(il,i,j) = (1.-Sigij(il,i,j))*HP(il,i) 433 ! : + Sigij(il,i,j)*H(il,i) 434 ! : + (LV(il,j)+(cpd-cpv)*t(il,j))*awat 435 ! IM 301008 beg 436 hent(il, i, j) = (1.-sigij(il,i,j))*hp(il, i) + & 437 sigij(il, i, j)*h(il, i) 438 439 elij(il, i, j) = qent(il, i, j) - rs(il, j) 440 elij(il, i, j) = elij(il, i, j) + ((h(il,j)-hent(il,i, & 441 j))*rs(il,j)*lv(il,j)/((cpd*(1.-qent(il,i,j))+ & 442 qent(il,i,j)*cpv)*rrv*t(il,j)*t(il,j))) 443 elij(il, i, j) = elij(il, i, j)/(1.+lv(il,j)*lv(il,j)*rs(il,j)/(( & 444 cpd*(1.-qent(il,i,j))+qent(il,i,j)*cpv)*rrv*t(il,j)*t(il,j))) 415 Sigij(il, i, j) = 0. 416 END IF 417 418 ! -- Compute Qent, uent, vent according to the true mixing fraction 419 Qent(il, i, j) = (1.-Sigij(il,i,j))*rti + Sigij(il, i, j)*rr(il, i) 420 uent(il, i, j) = (1.-Sigij(il,i,j))*unk(il) + Sigij(il, i, j)*u(il, i) 421 vent(il, i, j) = (1.-Sigij(il,i,j))*vnk(il) + Sigij(il, i, j)*v(il, i) 422 423 ! -- Compute liquid water static energy of mixed draughts 424 ! IF (j .GT. i) THEN 425 ! awat=elij(il,i,j)-(1.-ep(il,j))*clw(il,j) 426 ! awat=amax1(awat,0.0) 427 ! ELSE 428 ! awat = 0. 429 ! ENDIF 430 ! Hent(il,i,j) = (1.-Sigij(il,i,j))*HP(il,i) 431 ! : + Sigij(il,i,j)*H(il,i) 432 ! : + (LV(il,j)+(cpd-cpv)*t(il,j))*awat 433 !IM 301008 beg 434 hent(il, i, j) = (1.-Sigij(il,i,j))*hp(il, i) + Sigij(il, i, j)*h(il, i) 435 436 elij(il, i, j) = Qent(il, i, j) - rs(il, j) 437 elij(il, i, j) = elij(il, i, j) + & 438 ((h(il,j)-hent(il,i,j))*rs(il,j)*lv(il,j) / & 439 ((cpd*(1.-Qent(il,i,j))+Qent(il,i,j)*cpv)*rrv*t(il,j)*t(il,j))) 440 elij(il, i, j) = elij(il, i, j) / & 441 (1.+lv(il,j)*lv(il,j)*rs(il,j) / & 442 ((cpd*(1.-Qent(il,i,j))+Qent(il,i,j)*cpv)*rrv*t(il,j)*t(il,j))) 445 443 446 444 elij(il, i, j) = max(elij(il,i,j), 0.) 447 445 448 elij(il, i, j) = min(elij(il,i,j), qent(il,i,j))446 elij(il, i, j) = min(elij(il,i,j), Qent(il,i,j)) 449 447 450 448 IF (j>i) THEN … … 455 453 END IF 456 454 457 ! print 458 ! *,h(il,j)-hent(il,i,j),LV(il,j)*rs(il,j)/(cpd*rrv*t(il,j)* 459 ! : t(il,j)) 460 461 hent(il, i, j) = hent(il, i, j) + (lv(il,j)+(cpd-cpv)*t(il,j))* & 462 awat 463 ! IM 301008 end 464 465 ! print *,'mix : i,j,hent(il,i,j),sigij(il,i,j) ', 466 ! : i,j,hent(il,i,j),sigij(il,i,j) 467 468 ! -- ASij is the integral of P(F) over the relevant F 469 ! interval 470 asij(il) = asij(il) + abs(qmixmax(il)*(1.-sjmax(il))+rmixmax(il)- & 471 qmixmin(il)*(1.-sjmin(il))-rmixmin(il)) 455 ! print *,h(il,j)-hent(il,i,j),LV(il,j)*rs(il,j)/(cpd*rrv*t(il,j)* 456 ! : t(il,j)) 457 458 hent(il, i, j) = hent(il, i, j) + (lv(il,j)+(cpd-cpv)*t(il,j))*awat 459 !IM 301008 end 460 461 ! print *,'mix : i,j,hent(il,i,j),Sigij(il,i,j) ', 462 ! : i,j,hent(il,i,j),Sigij(il,i,j) 463 464 ! -- ASij is the integral of P(F) over the relevant F interval 465 ASij(il) = ASij(il) + abs(Qmixmax(il)*(1.-Sjmax(il))+Rmixmax(il) - & 466 Qmixmin(il)*(1.-Sjmin(il))-Rmixmin(il)) 472 467 473 468 END IF … … 476 471 DO k = 1, ntra 477 472 DO il = 1, ncum 478 IF ((i>=icb(il)) .AND. (i<=inb(il)) .AND. (j>=(icb(il)-&479 1)) .AND. (j<=inb(il)) .AND. lwork(il)) THEN480 IF (sij(il,i,j)>0.0) THEN481 traent(il, i, j, k) = sigij(il, i, j)*tra(il, i, k) + &482 (1.-sigij(il,i,j))*tra(il, nk(il), k)483 END IF484 END IF485 END DO486 END DO487 488 ! -- If I=J (detrainement and entrainement at the same level), then 489 !only the490 473 IF ((i>=icb(il)) .AND. (i<=inb(il)) .AND. & 474 (j>=(icb(il)-1)) .AND. (j<=inb(il)) .AND. & 475 lwork(il)) THEN 476 IF (Sij(il,i,j)>0.0) THEN 477 traent(il, i, j, k) = Sigij(il, i, j)*tra(il, i, k) + & 478 (1.-Sigij(il,i,j))*tra(il, nk(il), k) 479 END IF 480 END IF 481 END DO 482 END DO 483 484 ! -- If I=J (detrainement and entrainement at the same level), then only the 485 ! -- adiabatic ascent part of the mixture is considered 491 486 IF (i==j) THEN 492 487 DO il = 1, ncum 493 IF (i>=icb(il) .AND. i<=inb(il) .AND. j>=(icb( & 494 il)-1) .AND. j<=inb(il) .AND. lwork(il)) THEN 495 IF (sij(il,i,j)>0.0) THEN 488 IF (i>=icb(il) .AND. i<=inb(il) .AND. & 489 j>=(icb(il)-1) .AND. j<=inb(il) .AND. & 490 lwork(il)) THEN 491 IF (Sij(il,i,j)>0.0) THEN 496 492 rti = qnk(il) - ep(il, i)*clw(il, i) 497 ! cc Ment(il,i,i) = 498 ! m(il,i)*abs(Qmixmax(il)*(1.-Sjmax(il)) 499 ment(il, i, i) = abs(qmixmax(il)*(1.-sjmax( & 500 il))+rmixmax(il)-qmixmin(il)*(1.-sjmin(il))-rmixmin(il)) 501 qent(il, i, i) = rti 493 !!! Ment(il,i,i) = m(il,i)*abs(Qmixmax(il)*(1.-Sjmax(il)) 494 Ment(il, i, i) = abs(Qmixmax(il)*(1.-Sjmax(il))+Rmixmax(il) - & 495 Qmixmin(il)*(1.-Sjmin(il))-Rmixmin(il)) 496 Qent(il, i, i) = rti 502 497 uent(il, i, i) = unk(il) 503 498 vent(il, i, i) = vnk(il) 504 499 hent(il, i, i) = hp(il, i) 505 500 elij(il, i, i) = clw(il, i)*(1.-ep(il,i)) 506 sigij(il, i, i) = 0.501 Sigij(il, i, i) = 0. 507 502 END IF 508 503 END IF … … 510 505 DO k = 1, ntra 511 506 DO il = 1, ncum 512 IF ((i>=icb(il)) .AND. (i<=inb(il)) .AND. (j>=(icb(il)- & 513 1)) .AND. (j<=inb(il)) .AND. lwork(il)) THEN 514 IF (sij(il,i,j)>0.0) THEN 507 IF ((i>=icb(il)) .AND. (i<=inb(il)) .AND. & 508 (j>=(icb(il)-1)) .AND. (j<=inb(il)) .AND. & 509 lwork(il)) THEN 510 IF (Sij(il,i,j)>0.0) THEN 515 511 traent(il, i, i, k) = tra(il, nk(il), k) 516 512 END IF … … 521 517 END IF 522 518 523 175 END DO 519 ! --------------------------------------------------------------- 520 175 END DO ! End loop on destination level "j" 521 ! --------------------------------------------------------------- 524 522 525 523 DO il = 1, ncum 526 524 IF (i>=icb(il) .AND. i<=inb(il) .AND. lwork(il)) THEN 527 asij(il) = amax1(1.0E-16, asij(il))528 asij(il) = 1.0/asij(il)525 ASij(il) = amax1(1.0E-16, ASij(il)) 526 ASij(il) = 1.0/ASij(il) 529 527 csum(il, i) = 0.0 530 528 END IF … … 533 531 DO j = minorig, nl 534 532 DO il = 1, ncum 535 IF (i>=icb(il) .AND. i<=inb(il) .AND. lwork(il) .AND. j>=(icb(&536 il)-1) .AND. j<=inb(il)) THEN537 ment(il, i, j) = ment(il, i, j)*asij(il)533 IF (i>=icb(il) .AND. i<=inb(il) .AND. lwork(il) .AND. & 534 j>=(icb(il)-1) .AND. j<=inb(il)) THEN 535 Ment(il, i, j) = Ment(il, i, j)*ASij(il) 538 536 END IF 539 537 END DO … … 542 540 DO j = minorig, nl 543 541 DO il = 1, ncum 544 IF (i>=icb(il) .AND. i<=inb(il) .AND. lwork(il) .AND. j>=(icb(&545 il)-1) .AND. j<=inb(il)) THEN546 csum(il, i) = csum(il, i) + ment(il, i, j)542 IF (i>=icb(il) .AND. i<=inb(il) .AND. lwork(il) .AND. & 543 j>=(icb(il)-1) .AND. j<=inb(il)) THEN 544 csum(il, i) = csum(il, i) + Ment(il, i, j) 547 545 END IF 548 546 END DO … … 550 548 551 549 DO il = 1, ncum 552 IF (i>=icb(il) .AND. i<=inb(il) .AND. lwork(il) .AND. csum(il,i)<1.) & 553 THEN 554 ! cc : .and. csum(il,i).lt.m(il,i) ) then 550 IF (i>=icb(il) .AND. i<=inb(il) .AND. lwork(il) .AND. csum(il,i)<1.) THEN 551 ! cc : .and. csum(il,i).lt.m(il,i) ) then 555 552 nent(il, i) = 0 556 ! cc ment(il,i,i)=m(il,i)557 ment(il, i, i) = 1.558 qent(il, i, i) = qnk(il) - ep(il, i)*clw(il, i)553 ! cc Ment(il,i,i)=m(il,i) 554 Ment(il, i, i) = 1. 555 Qent(il, i, i) = qnk(il) - ep(il, i)*clw(il, i) 559 556 uent(il, i, i) = unk(il) 560 557 vent(il, i, i) = vnk(il) 561 558 elij(il, i, i) = clw(il, i)*(1.-ep(il,i)) 562 sij(il, i, i) = 0.0559 Sij(il, i, i) = 0.0 563 560 END IF 564 561 END DO ! il … … 566 563 DO j = 1, ntra 567 564 DO il = 1, ncum 568 IF (i>=icb(il) .AND. i<=inb(il) .AND. lwork(il) .AND. csum(il,i)<1.) & 569 THEN 570 ! cc : .and. csum(il,i).lt.m(il,i) ) then 565 IF (i>=icb(il) .AND. i<=inb(il) .AND. lwork(il) .AND. csum(il,i)<1.) THEN 566 ! cc : .and. csum(il,i).lt.m(il,i) ) then 571 567 traent(il, i, i, j) = tra(il, nk(il), j) 572 568 END IF … … 574 570 END DO 575 571 576 789 END DO 572 ! --------------------------------------------------------------- 573 789 END DO ! End loop on origin level "i" 574 ! --------------------------------------------------------------- 575 577 576 578 577 RETURN -
LMDZ5/trunk/libf/phylmd/cva_driver.F90
r1992 r2007 2 2 ! $Id$ 3 3 4 SUBROUTINE cva_driver(len, nd, ndp1, ntra, nloc, iflag_con, iflag_mix, & 5 iflag_ice_thermo, iflag_clos, delt, t1, q1, qs1, t1_wake, q1_wake, & 6 qs1_wake, s1_wake, u1, v1, tra1, p1, ph1, ale1, alp1, sig1feed1, & 7 sig2feed1, wght1, iflag1, ft1, fq1, fu1, fv1, ftra1, precip1, kbas1, & 8 ktop1, cbmf1, plcl1, plfc1, wbeff1, sig1, w01, & !input/output 9 ptop21, sigd1, ma1, mip1, vprecip1, upwd1, dnwd1, dnwd01, qcondc1, wd1, & 10 cape1, cin1, tvp1, ftd1, fqd1, plim11, plim21, asupmax1, supmax01, & 11 asupmaxmin1, lalim_conv, da1, phi1, mp1, phi21, d1a1, dam1, sigij1, clw1, & ! RomP 12 elij1, evap1, ep1, epmlmmm1, eplamm1, & ! RomP 13 wdtraina1, wdtrainm1) ! RomP 14 ! ************************************************************** 15 ! * 16 ! CV_DRIVER * 17 ! * 18 ! * 19 ! written by : Sandrine Bony-Lena , 17/05/2003, 11.19.41 * 20 ! modified by : * 21 ! ************************************************************** 22 ! ************************************************************** 4 SUBROUTINE cva_driver(len, nd, ndp1, ntra, nloc, & 5 iflag_con, iflag_mix, iflag_ice_thermo, iflag_clos, ok_conserv_q, & 6 delt, t1, q1, qs1, t1_wake, q1_wake, qs1_wake, s1_wake, & 7 u1, v1, tra1, & 8 p1, ph1, & 9 Ale1, Alp1, & 10 sig1feed1, sig2feed1, wght1, & 11 iflag1, ft1, fq1, fu1, fv1, ftra1, & 12 precip1, kbas1, ktop1, & 13 cbmf1, plcl1, plfc1, wbeff1, & 14 sig1, w01, & !input/output 15 ptop21, sigd1, & 16 ma1, mip1, Vprecip1, upwd1, dnwd1, dnwd01, & 17 qcondc1, wd1, & 18 cape1, cin1, tvp1, & 19 ftd1, fqd1, & 20 Plim11, Plim21, asupmax1, supmax01, asupmaxmin1, & 21 lalim_conv, & 22 !! da1,phi1,mp1,phi21,d1a1,dam1,sigij1,clw1, & ! RomP 23 !! elij1,evap1,ep1,epmlmMm1,eplaMm1, & ! RomP 24 da1, phi1, mp1, phi21, d1a1, dam1, sigij1, wghti1, & ! RomP, RL 25 clw1, elij1, evap1, ep1, epmlmMm1, eplaMm1, & ! RomP, RL 26 wdtrainA1, wdtrainM1) ! RomP 27 ! ************************************************************** 28 ! * 29 ! CV_DRIVER * 30 ! * 31 ! * 32 ! written by : Sandrine Bony-Lena , 17/05/2003, 11.19.41 * 33 ! modified by : * 34 ! ************************************************************** 35 ! ************************************************************** 23 36 24 37 USE dimphy 25 38 IMPLICIT NONE 26 39 27 ! .............................START PROLOGUE............................ 28 29 30 ! All argument names (except len,nd,ntra,nloc,delt and the flags) have a 31 ! "1" appended. 32 ! The "1" is removed for the corresponding compressed variables. 33 ! PARAMETERS: 34 ! Name Type Usage Description 35 ! ---------- ---------- ------- ---------------------------- 36 37 ! len Integer Input first (i) dimension 38 ! nd Integer Input vertical (k) dimension 39 ! ndp1 Integer Input nd + 1 40 ! ntra Integer Input number of tracors 41 ! iflag_con Integer Input version of convect (3/4) 42 ! iflag_mix Integer Input version of mixing (0/1/2) 43 ! iflag_ice_thermo Integer Input accounting for ice 44 ! thermodynamics (0/1) 45 ! iflag_clos Integer Input version of closure (0/1) 46 ! delt Real Input time step 47 ! t1 Real Input temperature (sat draught envt) 48 ! q1 Real Input specific hum (sat draught envt) 49 ! qs1 Real Input sat specific hum (sat draught 50 ! envt) 51 ! t1_wake Real Input temperature (unsat draught 52 ! envt) 53 ! q1_wake Real Input specific hum(unsat draught 54 ! envt) 55 ! qs1_wake Real Input sat specific hum(unsat draughts 56 ! envt) 57 ! s1_wake Real Input fractionnal area covered by 58 ! wakes 59 ! u1 Real Input u-wind 60 ! v1 Real Input v-wind 61 ! tra1 Real Input tracors 62 ! p1 Real Input full level pressure 63 ! ph1 Real Input half level pressure 64 ! ALE1 Real Input Available lifting Energy 65 ! ALP1 Real Input Available lifting Power 66 ! sig1feed1 Real Input sigma coord at lower bound of 67 ! feeding layer 68 ! sig2feed1 Real Input sigma coord at upper bound of 69 ! feeding layer 70 ! wght1 Real Input weight density determining the 71 ! feeding mixture 72 ! iflag1 Integer Output flag for Emanuel conditions 73 ! ft1 Real Output temp tend 74 ! fq1 Real Output spec hum tend 75 ! fu1 Real Output u-wind tend 76 ! fv1 Real Output v-wind tend 77 ! ftra1 Real Output tracor tend 78 ! precip1 Real Output precipitation 79 ! kbas1 Integer Output cloud base level 80 ! ktop1 Integer Output cloud top level 81 ! cbmf1 Real Output cloud base mass flux 82 ! sig1 Real In/Out section adiabatic updraft 83 ! w01 Real In/Out vertical velocity within adiab 84 ! updraft 85 ! ptop21 Real In/Out top of entraining zone 86 ! Ma1 Real Output mass flux adiabatic updraft 87 ! mip1 Real Output mass flux shed by the adiabatic 88 ! updraft 89 ! Vprecip1 Real Output vertical profile of 90 ! precipitations 91 ! upwd1 Real Output total upward mass flux 92 ! (adiab+mixed) 93 ! dnwd1 Real Output saturated downward mass flux 94 ! (mixed) 95 ! dnwd01 Real Output unsaturated downward mass flux 96 ! qcondc1 Real Output in-cld mixing ratio of 97 ! condensed water 98 ! wd1 Real Output downdraft velocity scale for 99 ! sfc fluxes 100 ! cape1 Real Output CAPE 101 ! cin1 Real Output CIN 102 ! tvp1 Real Output adiab lifted parcell virt temp 103 ! ftd1 Real Output precip temp tend 104 ! fqt1 Real Output precip spec hum tend 105 ! Plim11 Real Output 106 ! Plim21 Real Output 107 ! asupmax1 Real Output 108 ! supmax01 Real Output 109 ! asupmaxmin1 Real Output 110 111 ! ftd1 Real Output Array of temperature tendency due to 112 ! precipitations (K/s) of dimension ND, 113 ! defined at same grid levels as T, Q, QS and P. 114 115 ! fqd1 Real Output Array of specific humidity 116 ! tendencies due to precipitations ((gm/gm)/s) 117 ! of dimension ND, defined at same grid levels as T, Q, QS and P. 118 119 ! wdtrainA1 Real Output precipitation detrained from 120 ! adiabatic draught; 121 ! used in tracer transport (cvltr) 122 ! wdtrainM1 Real Output precipitation detrained from mixed 123 ! draughts; 124 ! used in tracer transport (cvltr) 125 ! da1 Real Output used in tracer transport (cvltr) 126 ! phi1 Real Output used in tracer transport (cvltr) 127 ! mp1 Real Output used in tracer transport (cvltr) 128 129 ! phi21 Real Output used in tracer transport (cvltr) 130 131 ! d1a1 Real Output used in tracer transport (cvltr) 132 ! dam1 Real Output used in tracer transport (cvltr) 133 134 ! epmlmMm1 Real Output used in tracer transport (cvltr) 135 ! eplaMm1 Real Output used in tracer transport (cvltr) 136 137 ! evap1 Real Output 138 ! ep1 Real Output 139 ! sigij1 Real Output 140 ! elij1 Real Output 141 142 143 ! S. Bony, Mar 2002: 144 ! * Several modules corresponding to different physical processes 145 ! * Several versions of convect may be used: 146 ! - iflag_con=3: version lmd (previously named convect3) 147 ! - iflag_con=4: version 4.3b (vect. version, previously convect1/2) 148 ! + tard: - iflag_con=5: version lmd with ice (previously named convectg) 149 ! S. Bony, Oct 2002: 150 ! * Vectorization of convect3 (ie version lmd) 151 152 ! ..............................END PROLOGUE............................. 40 ! .............................START PROLOGUE............................ 41 42 43 ! All argument names (except len,nd,ntra,nloc,delt and the flags) have a "1" appended. 44 ! The "1" is removed for the corresponding compressed variables. 45 ! PARAMETERS: 46 ! Name Type Usage Description 47 ! ---------- ---------- ------- ---------------------------- 48 49 ! len Integer Input first (i) dimension 50 ! nd Integer Input vertical (k) dimension 51 ! ndp1 Integer Input nd + 1 52 ! ntra Integer Input number of tracors 53 ! iflag_con Integer Input version of convect (3/4) 54 ! iflag_mix Integer Input version of mixing (0/1/2) 55 ! iflag_ice_thermo Integer Input accounting for ice thermodynamics (0/1) 56 ! iflag_clos Integer Input version of closure (0/1) 57 ! ok_conserv_q Logical Input when true corrections for water conservation are swtiched on 58 ! delt Real Input time step 59 ! t1 Real Input temperature (sat draught envt) 60 ! q1 Real Input specific hum (sat draught envt) 61 ! qs1 Real Input sat specific hum (sat draught envt) 62 ! t1_wake Real Input temperature (unsat draught envt) 63 ! q1_wake Real Input specific hum(unsat draught envt) 64 ! qs1_wake Real Input sat specific hum(unsat draughts envt) 65 ! s1_wake Real Input fractionnal area covered by wakes 66 ! u1 Real Input u-wind 67 ! v1 Real Input v-wind 68 ! tra1 Real Input tracors 69 ! p1 Real Input full level pressure 70 ! ph1 Real Input half level pressure 71 ! ALE1 Real Input Available lifting Energy 72 ! ALP1 Real Input Available lifting Power 73 ! sig1feed1 Real Input sigma coord at lower bound of feeding layer 74 ! sig2feed1 Real Input sigma coord at upper bound of feeding layer 75 ! wght1 Real Input weight density determining the feeding mixture 76 ! iflag1 Integer Output flag for Emanuel conditions 77 ! ft1 Real Output temp tend 78 ! fq1 Real Output spec hum tend 79 ! fu1 Real Output u-wind tend 80 ! fv1 Real Output v-wind tend 81 ! ftra1 Real Output tracor tend 82 ! precip1 Real Output precipitation 83 ! kbas1 Integer Output cloud base level 84 ! ktop1 Integer Output cloud top level 85 ! cbmf1 Real Output cloud base mass flux 86 ! sig1 Real In/Out section adiabatic updraft 87 ! w01 Real In/Out vertical velocity within adiab updraft 88 ! ptop21 Real In/Out top of entraining zone 89 ! Ma1 Real Output mass flux adiabatic updraft 90 ! mip1 Real Output mass flux shed by the adiabatic updraft 91 ! Vprecip1 Real Output vertical profile of precipitations 92 ! upwd1 Real Output total upward mass flux (adiab+mixed) 93 ! dnwd1 Real Output saturated downward mass flux (mixed) 94 ! dnwd01 Real Output unsaturated downward mass flux 95 ! qcondc1 Real Output in-cld mixing ratio of condensed water 96 ! wd1 Real Output downdraft velocity scale for sfc fluxes 97 ! cape1 Real Output CAPE 98 ! cin1 Real Output CIN 99 ! tvp1 Real Output adiab lifted parcell virt temp 100 ! ftd1 Real Output precip temp tend 101 ! fqt1 Real Output precip spec hum tend 102 ! Plim11 Real Output 103 ! Plim21 Real Output 104 ! asupmax1 Real Output 105 ! supmax01 Real Output 106 ! asupmaxmin1 Real Output 107 108 ! ftd1 Real Output Array of temperature tendency due to precipitations (K/s) of dimension ND, 109 ! defined at same grid levels as T, Q, QS and P. 110 111 ! fqd1 Real Output Array of specific humidity tendencies due to precipitations ((gm/gm)/s) 112 ! of dimension ND, defined at same grid levels as T, Q, QS and P. 113 114 ! wdtrainA1 Real Output precipitation detrained from adiabatic draught; 115 ! used in tracer transport (cvltr) 116 ! wdtrainM1 Real Output precipitation detrained from mixed draughts; 117 ! used in tracer transport (cvltr) 118 ! da1 Real Output used in tracer transport (cvltr) 119 ! phi1 Real Output used in tracer transport (cvltr) 120 ! mp1 Real Output used in tracer transport (cvltr) 121 122 ! phi21 Real Output used in tracer transport (cvltr) 123 124 ! d1a1 Real Output used in tracer transport (cvltr) 125 ! dam1 Real Output used in tracer transport (cvltr) 126 127 ! epmlmMm1 Real Output used in tracer transport (cvltr) 128 ! eplaMm1 Real Output used in tracer transport (cvltr) 129 130 ! evap1 Real Output 131 ! ep1 Real Output 132 ! sigij1 Real Output used in tracer transport (cvltr) 133 ! elij1 Real Output 134 ! wghti1 Real Output final weight of the feeding layers, 135 ! used in tracer transport (cvltr) 136 137 138 ! S. Bony, Mar 2002: 139 ! * Several modules corresponding to different physical processes 140 ! * Several versions of convect may be used: 141 ! - iflag_con=3: version lmd (previously named convect3) 142 ! - iflag_con=4: version 4.3b (vect. version, previously convect1/2) 143 ! + tard: - iflag_con=5: version lmd with ice (previously named convectg) 144 ! S. Bony, Oct 2002: 145 ! * Vectorization of convect3 (ie version lmd) 146 147 ! ..............................END PROLOGUE............................. 153 148 154 149 155 150 include "dimensions.h" 156 ! cccc#include "dimphy.h"151 !!!!!#include "dimphy.h" 157 152 include 'iniprint.h' 158 153 159 154 160 155 ! Input 161 156 INTEGER len 162 157 INTEGER nd … … 167 162 INTEGER iflag_ice_thermo 168 163 INTEGER iflag_clos 164 LOGICAL ok_conserv_q 169 165 REAL delt 170 166 REAL t1(len, nd) … … 180 176 REAL p1(len, nd) 181 177 REAL ph1(len, ndp1) 182 REAL ale1(len)183 REAL alp1(len)178 REAL Ale1(len) 179 REAL Alp1(len) 184 180 REAL sig1feed1 ! pressure at lower bound of feeding layer 185 181 REAL sig2feed1 ! pressure at upper bound of feeding layer 186 182 REAL wght1(nd) ! weight density determining the feeding mixture 187 183 188 184 ! Output 189 185 INTEGER iflag1(len) 190 186 REAL ft1(len, nd) … … 206 202 REAL ma1(len, nd) 207 203 REAL mip1(len, nd) 208 204 ! real Vprecip1(len,nd) 209 205 REAL vprecip1(len, nd+1) 210 206 REAL upwd1(len, nd) … … 217 213 REAL tvp1(len, nd) 218 214 219 !AC!220 !! real da1(len,nd),phi1(len,nd,nd)221 !! real da(len,nd),phi(len,nd,nd)222 !AC!215 !AC! 216 !! real da1(len,nd),phi1(len,nd,nd) 217 !! real da(len,nd),phi(len,nd,nd) 218 !AC! 223 219 REAL ftd1(len, nd) 224 220 REAL fqd1(len, nd) 225 REAL plim11(len)226 REAL plim21(len)221 REAL Plim11(len) 222 REAL Plim21(len) 227 223 REAL asupmax1(len, nd) 228 224 REAL supmax01(len) 229 225 REAL asupmaxmin1(len) 230 226 INTEGER lalim_conv(len) 231 232 REAL wdtrain a1(len, nd), wdtrainm1(len, nd)227 ! RomP >>> 228 REAL wdtrainA1(len, nd), wdtrainM1(len, nd) 233 229 REAL da1(len, nd), phi1(len, nd, nd), mp1(len, nd) 234 REAL epmlm mm1(len, nd, nd), eplamm1(len, nd)230 REAL epmlmMm1(len, nd, nd), eplaMm1(len, nd) 235 231 REAL evap1(len, nd), ep1(len, nd) 236 232 REAL sigij1(len, nd, nd), elij1(len, nd, nd) 233 !JYG,RL 234 REAL wghti1(len, nd) ! final weight of the feeding layers 235 !JYG,RL 237 236 REAL phi21(len, nd, nd) 238 237 REAL d1a1(len, nd), dam1(len, nd) 239 ! RomP <<< 240 241 ! ------------------------------------------------------------------- 242 ! Prolog by Kerry Emanuel. 243 ! ------------------------------------------------------------------- 244 ! --- ARGUMENTS 245 ! ------------------------------------------------------------------- 246 ! --- On input: 247 248 ! t: Array of absolute temperature (K) of dimension ND, with first 249 ! index corresponding to lowest model level. Note that this array 250 ! will be altered by the subroutine if dry convective adjustment 251 ! occurs and if IPBL is not equal to 0. 252 253 ! q: Array of specific humidity (gm/gm) of dimension ND, with first 254 ! index corresponding to lowest model level. Must be defined 255 ! at same grid levels as T. Note that this array will be altered 256 ! if dry convective adjustment occurs and if IPBL is not equal to 0. 257 258 ! qs: Array of saturation specific humidity of dimension ND, with first 259 ! index corresponding to lowest model level. Must be defined 260 ! at same grid levels as T. Note that this array will be altered 261 ! if dry convective adjustment occurs and if IPBL is not equal to 0. 262 263 ! t_wake: Array of absolute temperature (K), seen by unsaturated draughts, 264 ! of dimension ND, with first index corresponding to lowest model level. 265 266 ! q_wake: Array of specific humidity (gm/gm), seen by unsaturated draughts, 267 ! of dimension ND, with first index corresponding to lowest model level. 268 ! Must be defined at same grid levels as T. 269 270 ! qs_wake: Array of saturation specific humidity, seen by unsaturated 271 ! draughts, 272 ! of dimension ND, with first index corresponding to lowest model level. 273 ! Must be defined at same grid levels as T. 274 275 ! s_wake: Array of fractionnal area occupied by the wakes. 276 277 ! u: Array of zonal wind velocity (m/s) of dimension ND, witth first 278 ! index corresponding with the lowest model level. Defined at 279 ! same levels as T. Note that this array will be altered if 280 ! dry convective adjustment occurs and if IPBL is not equal to 0. 281 282 ! v: Same as u but for meridional velocity. 283 284 ! tra: Array of passive tracer mixing ratio, of dimensions (ND,NTRA), 285 ! where NTRA is the number of different tracers. If no 286 ! convective tracer transport is needed, define a dummy 287 ! input array of dimension (ND,1). Tracers are defined at 288 ! same vertical levels as T. Note that this array will be altered 289 ! if dry convective adjustment occurs and if IPBL is not equal to 0. 290 291 ! p: Array of pressure (mb) of dimension ND, with first 292 ! index corresponding to lowest model level. Must be defined 293 ! at same grid levels as T. 294 295 ! ph: Array of pressure (mb) of dimension ND+1, with first index 296 ! corresponding to lowest level. These pressures are defined at 297 ! levels intermediate between those of P, T, Q and QS. The first 298 ! value of PH should be greater than (i.e. at a lower level than) 299 ! the first value of the array P. 300 301 ! ALE: Available lifting Energy 302 303 ! ALP: Available lifting Power 304 305 ! nl: The maximum number of levels to which convection can penetrate, plus 306 ! 1. 307 ! NL MUST be less than or equal to ND-1. 308 309 ! delt: The model time step (sec) between calls to CONVECT 310 311 ! ---------------------------------------------------------------------------- 312 ! --- On Output: 313 314 ! iflag: An output integer whose value denotes the following: 315 ! VALUE INTERPRETATION 316 ! ----- -------------- 317 ! 0 Moist convection occurs. 318 ! 1 Moist convection occurs, but a CFL condition 319 ! on the subsidence warming is violated. This 320 ! does not cause the scheme to terminate. 321 ! 2 Moist convection, but no precip because ep(inb) lt 0.0001 322 ! 3 No moist convection because new cbmf is 0 and old cbmf is 0. 323 ! 4 No moist convection; atmosphere is not 324 ! unstable 325 ! 6 No moist convection because ihmin le minorig. 326 ! 7 No moist convection because unreasonable 327 ! parcel level temperature or specific humidity. 328 ! 8 No moist convection: lifted condensation 329 ! level is above the 200 mb level. 330 ! 9 No moist convection: cloud base is higher 331 ! then the level NL-1. 332 333 ! ft: Array of temperature tendency (K/s) of dimension ND, defined at 334 ! same 335 ! grid levels as T, Q, QS and P. 336 337 ! fq: Array of specific humidity tendencies ((gm/gm)/s) of dimension ND, 338 ! defined at same grid levels as T, Q, QS and P. 339 340 ! fu: Array of forcing of zonal velocity (m/s^2) of dimension ND, 341 ! defined at same grid levels as T. 342 343 ! fv: Same as FU, but for forcing of meridional velocity. 344 345 ! ftra: Array of forcing of tracer content, in tracer mixing ratio per 346 ! second, defined at same levels as T. Dimensioned (ND,NTRA). 347 348 ! precip: Scalar convective precipitation rate (mm/day). 349 350 ! wd: A convective downdraft velocity scale. For use in surface 351 ! flux parameterizations. See convect.ps file for details. 352 353 ! tprime: A convective downdraft temperature perturbation scale (K). 354 ! For use in surface flux parameterizations. See convect.ps 355 ! file for details. 356 357 ! qprime: A convective downdraft specific humidity 358 ! perturbation scale (gm/gm). 359 ! For use in surface flux parameterizations. See convect.ps 360 ! file for details. 361 362 ! cbmf: The cloud base mass flux ((kg/m**2)/s). THIS SCALAR VALUE MUST 363 ! BE STORED BY THE CALLING PROGRAM AND RETURNED TO CONVECT AT 364 ! ITS NEXT CALL. That is, the value of CBMF must be "remembered" 365 ! by the calling program between calls to CONVECT. 366 367 ! det: Array of detrainment mass flux of dimension ND. 368 ! ------------------------------------------------------------------- 369 370 ! Local arrays 238 ! RomP <<< 239 240 ! ------------------------------------------------------------------- 241 ! Prolog by Kerry Emanuel. 242 ! ------------------------------------------------------------------- 243 ! --- ARGUMENTS 244 ! ------------------------------------------------------------------- 245 ! --- On input: 246 247 ! t: Array of absolute temperature (K) of dimension ND, with first 248 ! index corresponding to lowest model level. Note that this array 249 ! will be altered by the subroutine if dry convective adjustment 250 ! occurs and if IPBL is not equal to 0. 251 252 ! q: Array of specific humidity (gm/gm) of dimension ND, with first 253 ! index corresponding to lowest model level. Must be defined 254 ! at same grid levels as T. Note that this array will be altered 255 ! if dry convective adjustment occurs and if IPBL is not equal to 0. 256 257 ! qs: Array of saturation specific humidity of dimension ND, with first 258 ! index corresponding to lowest model level. Must be defined 259 ! at same grid levels as T. Note that this array will be altered 260 ! if dry convective adjustment occurs and if IPBL is not equal to 0. 261 262 ! t_wake: Array of absolute temperature (K), seen by unsaturated draughts, 263 ! of dimension ND, with first index corresponding to lowest model level. 264 265 ! q_wake: Array of specific humidity (gm/gm), seen by unsaturated draughts, 266 ! of dimension ND, with first index corresponding to lowest model level. 267 ! Must be defined at same grid levels as T. 268 269 ! qs_wake: Array of saturation specific humidity, seen by unsaturated draughts, 270 ! of dimension ND, with first index corresponding to lowest model level. 271 ! Must be defined at same grid levels as T. 272 273 ! s_wake: Array of fractionnal area occupied by the wakes. 274 275 ! u: Array of zonal wind velocity (m/s) of dimension ND, witth first 276 ! index corresponding with the lowest model level. Defined at 277 ! same levels as T. Note that this array will be altered if 278 ! dry convective adjustment occurs and if IPBL is not equal to 0. 279 280 ! v: Same as u but for meridional velocity. 281 282 ! tra: Array of passive tracer mixing ratio, of dimensions (ND,NTRA), 283 ! where NTRA is the number of different tracers. If no 284 ! convective tracer transport is needed, define a dummy 285 ! input array of dimension (ND,1). Tracers are defined at 286 ! same vertical levels as T. Note that this array will be altered 287 ! if dry convective adjustment occurs and if IPBL is not equal to 0. 288 289 ! p: Array of pressure (mb) of dimension ND, with first 290 ! index corresponding to lowest model level. Must be defined 291 ! at same grid levels as T. 292 293 ! ph: Array of pressure (mb) of dimension ND+1, with first index 294 ! corresponding to lowest level. These pressures are defined at 295 ! levels intermediate between those of P, T, Q and QS. The first 296 ! value of PH should be greater than (i.e. at a lower level than) 297 ! the first value of the array P. 298 299 ! ALE: Available lifting Energy 300 301 ! ALP: Available lifting Power 302 303 ! nl: The maximum number of levels to which convection can penetrate, plus 1. 304 ! NL MUST be less than or equal to ND-1. 305 306 ! delt: The model time step (sec) between calls to CONVECT 307 308 ! ---------------------------------------------------------------------------- 309 ! --- On Output: 310 311 ! iflag: An output integer whose value denotes the following: 312 ! VALUE INTERPRETATION 313 ! ----- -------------- 314 ! 0 Moist convection occurs. 315 ! 1 Moist convection occurs, but a CFL condition 316 ! on the subsidence warming is violated. This 317 ! does not cause the scheme to terminate. 318 ! 2 Moist convection, but no precip because ep(inb) lt 0.0001 319 ! 3 No moist convection because new cbmf is 0 and old cbmf is 0. 320 ! 4 No moist convection; atmosphere is not 321 ! unstable 322 ! 6 No moist convection because ihmin le minorig. 323 ! 7 No moist convection because unreasonable 324 ! parcel level temperature or specific humidity. 325 ! 8 No moist convection: lifted condensation 326 ! level is above the 200 mb level. 327 ! 9 No moist convection: cloud base is higher 328 ! then the level NL-1. 329 330 ! ft: Array of temperature tendency (K/s) of dimension ND, defined at same 331 ! grid levels as T, Q, QS and P. 332 333 ! fq: Array of specific humidity tendencies ((gm/gm)/s) of dimension ND, 334 ! defined at same grid levels as T, Q, QS and P. 335 336 ! fu: Array of forcing of zonal velocity (m/s^2) of dimension ND, 337 ! defined at same grid levels as T. 338 339 ! fv: Same as FU, but for forcing of meridional velocity. 340 341 ! ftra: Array of forcing of tracer content, in tracer mixing ratio per 342 ! second, defined at same levels as T. Dimensioned (ND,NTRA). 343 344 ! precip: Scalar convective precipitation rate (mm/day). 345 346 ! wd: A convective downdraft velocity scale. For use in surface 347 ! flux parameterizations. See convect.ps file for details. 348 349 ! tprime: A convective downdraft temperature perturbation scale (K). 350 ! For use in surface flux parameterizations. See convect.ps 351 ! file for details. 352 353 ! qprime: A convective downdraft specific humidity 354 ! perturbation scale (gm/gm). 355 ! For use in surface flux parameterizations. See convect.ps 356 ! file for details. 357 358 ! cbmf: The cloud base mass flux ((kg/m**2)/s). THIS SCALAR VALUE MUST 359 ! BE STORED BY THE CALLING PROGRAM AND RETURNED TO CONVECT AT 360 ! ITS NEXT CALL. That is, the value of CBMF must be "remembered" 361 ! by the calling program between calls to CONVECT. 362 363 ! det: Array of detrainment mass flux of dimension ND. 364 ! ------------------------------------------------------------------- 365 366 ! Local (non compressed) arrays 371 367 372 368 … … 380 376 LOGICAL ok_inhib ! True => possible inhibition of convection by dryness 381 377 LOGICAL, SAVE :: debut = .TRUE. 382 378 !$OMP THREADPRIVATE(debut) 383 379 384 380 REAL tnk1(klon) … … 414 410 REAL p1feed1(len) ! pressure at lower bound of feeding layer 415 411 REAL p2feed1(len) ! pressure at upper bound of feeding layer 416 REAL wghti1(len, nd) ! weights of the feeding layers 417 418 ! (local) compressed fields: 412 !JYG,RL 413 !! real wghti1(len,nd) ! weights of the feeding layers 414 !JYG,RL 415 416 ! (local) compressed fields: 419 417 420 418 INTEGER nloc 421 419 ! parameter (nloc=klon) ! pour l'instant 422 420 423 421 INTEGER idcum(nloc) … … 456 454 REAL elij(nloc, klev, klev) 457 455 REAL supmax(nloc, klev) 458 REAL ale(nloc), alp(nloc), coef_clos(nloc)456 REAL Ale(nloc), Alp(nloc), coef_clos(nloc) 459 457 REAL sigd(nloc) 460 461 462 463 458 ! real mp(nloc,klev), qp(nloc,klev), up(nloc,klev), vp(nloc,klev) 459 ! real wt(nloc,klev), water(nloc,klev), evap(nloc,klev), ice(nloc,klev) 460 ! real b(nloc,klev), sigd(nloc) 461 ! save mp,qp,up,vp,wt,water,evap,b 464 462 REAL, SAVE, ALLOCATABLE :: mp(:, :), qp(:, :), up(:, :), vp(:, :) 465 463 REAL, SAVE, ALLOCATABLE :: wt(:, :), water(:, :), evap(:, :) 466 464 REAL, SAVE, ALLOCATABLE :: ice(:, :), fondue(:, :), b(:, :) 467 465 REAL, SAVE, ALLOCATABLE :: frac(:, :), faci(:, :) 468 466 !$OMP THREADPRIVATE(mp,qp,up,vp,wt,water,evap,ice,fondue,b,frac,faci) 469 467 REAL ft(nloc, klev), fq(nloc, klev) 470 468 REAL ftd(nloc, klev), fqd(nloc, klev) … … 474 472 REAL tps(nloc, klev), qprime(nloc), tprime(nloc) 475 473 REAL precip(nloc) 476 474 ! real Vprecip(nloc,klev) 477 475 REAL vprecip(nloc, klev+1) 478 476 REAL tra(nloc, klev, ntra), trap(nloc, klev, ntra) 479 477 REAL ftra(nloc, klev, ntra), traent(nloc, klev, klev, ntra) 480 REAL qcondc(nloc, klev) ! cld481 REAL wd(nloc) ! gust482 REAL plim1(nloc), plim2(nloc)478 REAL qcondc(nloc, klev) ! cld 479 REAL wd(nloc) ! gust 480 REAL Plim1(nloc), plim2(nloc) 483 481 REAL asupmax(nloc, klev) 484 482 REAL supmax0(nloc) … … 489 487 REAL hnk(nloc), unk(nloc), vnk(nloc) 490 488 491 492 REAL wdtrain a(nloc, klev), wdtrainm(nloc, klev)489 ! RomP >>> 490 REAL wdtrainA(nloc, klev), wdtrainM(nloc, klev) 493 491 REAL da(len, nd), phi(len, nd, nd) 494 REAL epmlm mm(nloc, klev, klev), eplamm(nloc, klev)492 REAL epmlmMm(nloc, klev, klev), eplaMm(nloc, klev) 495 493 REAL phi2(len, nd, nd) 496 494 REAL d1a(len, nd), dam(len, nd) 497 495 ! RomP <<< 498 496 499 497 LOGICAL, SAVE :: first = .TRUE. 500 498 !$OMP THREADPRIVATE(first) 501 499 CHARACTER (LEN=20) :: modname = 'cva_driver' 502 500 CHARACTER (LEN=80) :: abort_message 503 501 504 502 505 506 507 508 509 510 503 ! print *, 't1, t1_wake ',(k,t1(1,k),t1_wake(1,k),k=1,klev) 504 ! print *, 'q1, q1_wake ',(k,q1(1,k),q1_wake(1,k),k=1,klev) 505 506 ! ------------------------------------------------------------------- 507 ! --- SET CONSTANTS AND PARAMETERS 508 ! ------------------------------------------------------------------- 511 509 512 510 IF (first) THEN … … 518 516 first = .FALSE. 519 517 END IF 520 521 518 ! -- set simulation flags: 519 ! (common cvflag) 522 520 523 521 CALL cv_flag(iflag_ice_thermo) 524 522 525 526 523 ! -- set thermodynamical constants: 524 ! (common cvthermo) 527 525 528 526 CALL cv_thermo(iflag_con) 529 527 530 531 532 533 534 528 ! -- set convect parameters 529 530 ! includes microphysical parameters and parameters that 531 ! control the rate of approach to quasi-equilibrium) 532 ! (common cvparam) 535 533 536 534 IF (iflag_con==3) THEN … … 543 541 END IF 544 542 545 546 547 543 ! --------------------------------------------------------------------- 544 ! --- INITIALIZE OUTPUT ARRAYS AND PARAMETERS 545 ! --------------------------------------------------------------------- 548 546 nword1 = len 549 547 nword2 = len*nd … … 576 574 ftd1(:, :) = 0. 577 575 fqd1(:, :) = 0. 578 plim11(:) = 0.579 plim21(:) = 0.576 Plim11(:) = 0. 577 Plim21(:) = 0. 580 578 asupmax1(:, :) = 0. 581 579 supmax01(:) = 0. … … 594 592 END IF 595 593 596 597 wdtrain a1(:, :) = 0.598 wdtrain m1(:, :) = 0.594 ! RomP >>> 595 wdtrainA1(:, :) = 0. 596 wdtrainM1(:, :) = 0. 599 597 da1(:, :) = 0. 600 598 phi1(:, :, :) = 0. 601 epmlm mm1(:, :, :) = 0.602 epla mm1(:, :) = 0.599 epmlmMm1(:, :, :) = 0. 600 eplaMm1(:, :) = 0. 603 601 mp1(:, :) = 0. 604 602 evap1(:, :) = 0. … … 609 607 d1a1(:, :) = 0. 610 608 dam1(:, :) = 0. 611 612 613 614 609 ! RomP <<< 610 ! --------------------------------------------------------------------- 611 ! --- INITIALIZE LOCAL ARRAYS AND PARAMETERS 612 ! --------------------------------------------------------------------- 615 613 616 614 DO il = 1, nloc … … 618 616 END DO 619 617 620 621 622 618 ! -------------------------------------------------------------------- 619 ! --- CALCULATE ARRAYS OF GEOPOTENTIAL, HEAT CAPACITY & STATIC ENERGY 620 ! -------------------------------------------------------------------- 623 621 624 622 IF (iflag_con==3) THEN … … 627 625 PRINT *, 'Emanuel version 3 nouvelle' 628 626 END IF 629 ! print*,'t1, q1 ',t1,q1 630 CALL cv3_prelim(len, nd, ndp1, t1, q1, p1, ph1 & ! nd->na 631 , lv1, lf1, cpn1, tv1, gz1, h1, hm1, th1) 632 633 634 CALL cv3_prelim(len, nd, ndp1, t1_wake, q1_wake, p1, ph1 & ! 635 ! nd->na 636 , lv1_wake, lf1_wake, cpn1_wake, tv1_wake, gz1_wake, h1_wake, bid, & 637 th1_wake) 627 ! print*,'t1, q1 ',t1,q1 628 CALL cv3_prelim(len, nd, ndp1, t1, q1, p1, ph1, & ! nd->na 629 lv1, lf1, cpn1, tv1, gz1, h1, hm1, th1) 630 631 632 CALL cv3_prelim(len, nd, ndp1, t1_wake, q1_wake, p1, ph1, & ! nd->na 633 lv1_wake, lf1_wake, cpn1_wake, tv1_wake, gz1_wake, & 634 h1_wake, bid, th1_wake) 638 635 639 636 END IF … … 641 638 IF (iflag_con==4) THEN 642 639 PRINT *, 'Emanuel version 4 ' 643 CALL cv_prelim(len, nd, ndp1, t1, q1, p1, ph1, lv1, cpn1, tv1, gz1, h1,&644 hm1)645 END IF 646 647 648 649 650 651 652 653 654 655 640 CALL cv_prelim(len, nd, ndp1, t1, q1, p1, ph1, & 641 lv1, cpn1, tv1, gz1, h1, hm1) 642 END IF 643 644 ! -------------------------------------------------------------------- 645 ! --- CONVECTIVE FEED 646 ! -------------------------------------------------------------------- 647 648 ! compute feeding layer potential temperature and mixing ratio : 649 650 ! get bounds of feeding layer 651 652 ! test niveaux couche alimentation KE 656 653 IF (sig1feed1==sig2feed1) THEN 657 654 WRITE (lunout, *) 'impossible de choisir sig1feed=sig2feed' … … 664 661 p1feed1(i) = sig1feed1*ph1(i, 1) 665 662 p2feed1(i) = sig2feed1*ph1(i, 1) 666 !test maf667 !p1feed1(i)=ph1(i,1)668 !p2feed1(i)=ph1(i,2)669 !p2feed1(i)=ph1(i,3)670 !testCR: on prend la couche alim des thermiques671 !p2feed1(i)=ph1(i,lalim_conv(i)+1)672 !print*,'lentr=',lentr(i),ph1(i,lentr(i)+1),ph1(i,2)663 !test maf 664 ! p1feed1(i)=ph1(i,1) 665 ! p2feed1(i)=ph1(i,2) 666 ! p2feed1(i)=ph1(i,3) 667 !testCR: on prend la couche alim des thermiques 668 ! p2feed1(i)=ph1(i,lalim_conv(i)+1) 669 ! print*,'lentr=',lentr(i),ph1(i,lentr(i)+1),ph1(i,2) 673 670 END DO 674 671 … … 676 673 END IF 677 674 DO i = 1, len 678 ! print*,'avant cv3_feed plim',p1feed1(i),p2feed1(i)675 ! print*,'avant cv3_feed Plim',p1feed1(i),p2feed1(i) 679 676 END DO 680 677 IF (iflag_con==3) THEN 681 678 682 ! print*, 'IFLAG1 avant cv3_feed' 683 ! print*,'len,nd',len,nd 684 ! write(*,'(64i1)') iflag1(2:klon-1) 685 686 CALL cv3_feed(len, nd, t1, q1, u1, v1, p1, ph1, hm1, gz1 & ! 687 ! nd->na 688 , p1feed1, p2feed1, wght1, wghti1, tnk1, thnk1, qnk1, qsnk1, unk1, & 689 vnk1, cpnk1, hnk1, nk1, icb1, icbmax, iflag1, gznk1, plcl1) 690 END IF 691 692 ! print*, 'IFLAG1 apres cv3_feed' 693 ! print*,'len,nd',len,nd 694 ! write(*,'(64i1)') iflag1(2:klon-1) 679 ! print*, 'IFLAG1 avant cv3_feed' 680 ! print*,'len,nd',len,nd 681 ! write(*,'(64i1)') iflag1(2:klon-1) 682 683 CALL cv3_feed(len, nd, ok_conserv_q, & ! nd->na 684 t1, q1, u1, v1, p1, ph1, hm1, gz1, & 685 p1feed1, p2feed1, wght1, & 686 wghti1, tnk1, thnk1, qnk1, qsnk1, unk1, vnk1, & 687 cpnk1, hnk1, nk1, icb1, icbmax, iflag1, gznk1, plcl1) 688 END IF 689 690 ! print*, 'IFLAG1 apres cv3_feed' 691 ! print*,'len,nd',len,nd 692 ! write(*,'(64i1)') iflag1(2:klon-1) 695 693 696 694 IF (iflag_con==4) THEN 697 CALL cv_feed(len, nd, t1, q1, qs1, p1, hm1, gz1, nk1, icb1, icbmax,&698 iflag1, tnk1, qnk1, gznk1, plcl1)699 END IF 700 701 702 703 704 705 706 707 708 695 CALL cv_feed(len, nd, t1, q1, qs1, p1, hm1, gz1, & 696 nk1, icb1, icbmax, iflag1, tnk1, qnk1, gznk1, plcl1) 697 END IF 698 699 ! print *, 'cv3_feed-> iflag1, plcl1 ',iflag1(1),plcl1(1) 700 701 ! -------------------------------------------------------------------- 702 ! --- UNDILUTE (ADIABATIC) UPDRAFT / 1st part 703 ! (up through ICB for convect4, up through ICB+1 for convect3) 704 ! Calculates the lifted parcel virtual temperature at nk, the 705 ! actual temperature, and the adiabatic liquid water content. 706 ! -------------------------------------------------------------------- 709 707 710 708 IF (iflag_con==3) THEN 711 709 712 CALL cv3_undilute1(len, nd, t1, qs1, gz1, plcl1, p1, icb1, tnk1, qnk1 & ! nd->na713 ,gznk1, tp1, tvp1, clw1, icbs1)710 CALL cv3_undilute1(len, nd, t1, qs1, gz1, plcl1, p1, icb1, tnk1, qnk1, & ! nd->na 711 gznk1, tp1, tvp1, clw1, icbs1) 714 712 END IF 715 713 716 714 717 715 IF (iflag_con==4) THEN 718 CALL cv_undilute1(len, nd, t1, q1, qs1, gz1, p1, nk1, icb1, icbmax, tp1,&719 tvp1, clw1)720 END IF 721 722 723 724 725 726 716 CALL cv_undilute1(len, nd, t1, q1, qs1, gz1, p1, nk1, icb1, icbmax, & 717 tp1, tvp1, clw1) 718 END IF 719 720 ! ------------------------------------------------------------------- 721 ! --- TRIGGERING 722 ! ------------------------------------------------------------------- 723 724 ! print *,' avant triggering, iflag_con ',iflag_con 727 725 728 726 IF (iflag_con==3) THEN 729 727 730 CALL cv3_trigger(len, nd, icb1, plcl1, p1, th1, tv1, tvp1, thnk1 & ! 731 ! nd->na 732 , pbase1, buoybase1, iflag1, sig1, w01) 733 734 735 ! print*, 'IFLAG1 apres cv3_triger' 736 ! print*,'len,nd',len,nd 737 ! write(*,'(64i1)') iflag1(2:klon-1) 738 739 ! call dump2d(iim,jjm-1,sig1(2) 728 CALL cv3_trigger(len, nd, icb1, plcl1, p1, th1, tv1, tvp1, thnk1, & ! nd->na 729 pbase1, buoybase1, iflag1, sig1, w01) 730 731 732 ! print*, 'IFLAG1 apres cv3_triger' 733 ! print*,'len,nd',len,nd 734 ! write(*,'(64i1)') iflag1(2:klon-1) 735 736 ! call dump2d(iim,jjm-1,sig1(2) 740 737 END IF 741 738 … … 745 742 746 743 747 748 749 744 ! ===================================================================== 745 ! --- IF THIS POINT IS REACHED, MOIST CONVECTIVE ADJUSTMENT IS NECESSARY 746 ! ===================================================================== 750 747 751 748 ncum = 0 … … 757 754 END DO 758 755 759 756 ! print*,'klon, ncum = ',len,ncum 760 757 761 758 IF (ncum>0) THEN 762 759 763 764 765 !(-> vectorization over convective gridpoints)766 760 ! ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 761 ! --- COMPRESS THE FIELDS 762 ! (-> vectorization over convective gridpoints) 763 ! ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 767 764 768 765 IF (iflag_con==3) THEN 769 ! print*,'ncum tv1 ',ncum,tv1 770 ! print*,'tvp1 ',tvp1 771 CALL cv3a_compress(len, nloc, ncum, nd, ntra, iflag1, nk1, icb1, icbs1, & 772 plcl1, tnk1, qnk1, gznk1, hnk1, unk1, vnk1, wghti1, pbase1, & 773 buoybase1, t1, q1, qs1, t1_wake, q1_wake, qs1_wake, s1_wake, u1, v1, & 774 gz1, th1, th1_wake, tra1, h1, lv1, lf1, cpn1, p1, ph1, tv1, tp1, & 775 tvp1, clw1, h1_wake, lv1_wake, lf1_wake, cpn1_wake, tv1_wake, sig1, & 776 w01, ptop21, ale1, alp1, iflag, nk, icb, icbs, plcl, tnk, qnk, gznk, & 777 hnk, unk, vnk, wghti, pbase, buoybase, t, q, qs, t_wake, q_wake, & 778 qs_wake, s_wake, u, v, gz, th, th_wake, tra, h, lv, lf, cpn, p, ph, & 779 tv, tp, tvp, clw, h_wake, lv_wake, lf_wake, cpn_wake, tv_wake, sig, & 780 w0, ptop2, ale, alp) 781 782 ! print*,'tv ',tv 783 ! print*,'tvp ',tvp 766 ! print*,'ncum tv1 ',ncum,tv1 767 ! print*,'tvp1 ',tvp1 768 CALL cv3a_compress(len, nloc, ncum, nd, ntra, & 769 iflag1, nk1, icb1, icbs1, & 770 plcl1, tnk1, qnk1, gznk1, hnk1, unk1, vnk1, & 771 wghti1, pbase1, buoybase1, & 772 t1, q1, qs1, t1_wake, q1_wake, qs1_wake, s1_wake, & 773 u1, v1, gz1, th1, th1_wake, & 774 tra1, & 775 h1, lv1, lf1, cpn1, p1, ph1, tv1, tp1, tvp1, clw1, & 776 h1_wake, lv1_wake, lf1_wake, cpn1_wake, tv1_wake, & 777 sig1, w01, ptop21, & 778 Ale1, Alp1, & 779 iflag, nk, icb, icbs, & 780 plcl, tnk, qnk, gznk, hnk, unk, vnk, & 781 wghti, pbase, buoybase, & 782 t, q, qs, t_wake, q_wake, qs_wake, s_wake, & 783 u, v, gz, th, th_wake, & 784 tra, & 785 h, lv, lf, cpn, p, ph, tv, tp, tvp, clw, & 786 h_wake, lv_wake, lf_wake, cpn_wake, tv_wake, & 787 sig, w0, ptop2, & 788 Ale, Alp) 789 790 ! print*,'tv ',tv 791 ! print*,'tvp ',tvp 784 792 785 793 END IF 786 794 787 795 IF (iflag_con==4) THEN 788 CALL cv_compress(len, nloc, ncum, nd, iflag1, nk1, icb1, cbmf1, plcl1, & 789 tnk1, qnk1, gznk1, t1, q1, qs1, u1, v1, gz1, h1, lv1, cpn1, p1, ph1, & 790 tv1, tp1, tvp1, clw1, iflag, nk, icb, cbmf, plcl, tnk, qnk, gznk, t, & 791 q, qs, u, v, gz, h, lv, cpn, p, ph, tv, tp, tvp, clw, dph) 792 END IF 793 794 ! ------------------------------------------------------------------- 795 ! --- UNDILUTE (ADIABATIC) UPDRAFT / second part : 796 ! --- FIND THE REST OF THE LIFTED PARCEL TEMPERATURES 797 ! --- & 798 ! --- COMPUTE THE PRECIPITATION EFFICIENCIES AND THE 799 ! --- FRACTION OF PRECIPITATION FALLING OUTSIDE OF CLOUD 800 ! --- & 801 ! --- FIND THE LEVEL OF NEUTRAL BUOYANCY 802 ! ------------------------------------------------------------------- 796 CALL cv_compress(len, nloc, ncum, nd, & 797 iflag1, nk1, icb1, & 798 cbmf1, plcl1, tnk1, qnk1, gznk1, & 799 t1, q1, qs1, u1, v1, gz1, & 800 h1, lv1, cpn1, p1, ph1, tv1, tp1, tvp1, clw1, & 801 iflag, nk, icb, & 802 cbmf, plcl, tnk, qnk, gznk, & 803 t, q, qs, u, v, gz, h, lv, cpn, p, ph, tv, tp, tvp, clw, & 804 dph) 805 END IF 806 807 ! ------------------------------------------------------------------- 808 ! --- UNDILUTE (ADIABATIC) UPDRAFT / second part : 809 ! --- FIND THE REST OF THE LIFTED PARCEL TEMPERATURES 810 ! --- & 811 ! --- COMPUTE THE PRECIPITATION EFFICIENCIES AND THE 812 ! --- FRACTION OF PRECIPITATION FALLING OUTSIDE OF CLOUD 813 ! --- & 814 ! --- FIND THE LEVEL OF NEUTRAL BUOYANCY 815 ! ------------------------------------------------------------------- 803 816 804 817 IF (iflag_con==3) THEN 805 CALL cv3_undilute2(nloc, ncum, nd, icb, icbs, nk & !na->nd 806 , tnk, qnk, gznk, hnk, t, q, qs, gz, p, h, tv, lv, lf, pbase, & 807 buoybase, plcl, inb, tp, tvp, clw, hp, ep, sigp, buoy, frac) 818 CALL cv3_undilute2(nloc, ncum, nd, icb, icbs, nk, & !na->nd 819 tnk, qnk, gznk, hnk, t, q, qs, gz, & 820 p, h, tv, lv, lf, pbase, buoybase, plcl, & 821 inb, tp, tvp, clw, hp, ep, sigp, buoy, & 822 frac) 808 823 809 824 END IF 810 825 811 826 IF (iflag_con==4) THEN 812 CALL cv_undilute2(nloc, ncum, nd, icb, nk, tnk, qnk, gznk, t, q, qs, & 813 gz, p, dph, h, tv, lv, inb, inbis, tp, tvp, clw, hp, ep, sigp, frac) 814 END IF 815 816 ! ------------------------------------------------------------------- 817 ! --- MIXING(1) (if iflag_mix .ge. 1) 818 ! ------------------------------------------------------------------- 827 CALL cv_undilute2(nloc, ncum, nd, icb, nk, & 828 tnk, qnk, gznk, t, q, qs, gz, & 829 p, dph, h, tv, lv, & 830 inb, inbis, tp, tvp, clw, hp, ep, sigp, frac) 831 END IF 832 833 ! ------------------------------------------------------------------- 834 ! --- MIXING(1) (if iflag_mix .ge. 1) 835 ! ------------------------------------------------------------------- 819 836 IF (iflag_con==3) THEN 820 837 IF ((iflag_ice_thermo==1) .AND. (iflag_mix/=0)) THEN 821 WRITE (*, *) ' iflag_ice_thermo==1 requires iflag_mix==0', &822 ' but iflag_mix=', iflag_mix, '. Might as well stop here.'838 WRITE (*, *) ' iflag_ice_thermo==1 requires iflag_mix==0', ' but iflag_mix=', iflag_mix, & 839 '. Might as well stop here.' 823 840 STOP 824 841 END IF 825 842 IF (iflag_mix>=1) THEN 826 843 CALL zilch(supmax, nloc*klev) 827 CALL cv3p_mixing(nloc, ncum, nd, nd, ntra, icb, nk, inb & !828 ! na->nd829 , ph, t, q, qs, u, v, tra, h, lv, qnk, unk, vnk, hp, tv, tvp, ep, &830 clw, sig, ment, qent, hent, uent, vent, nent, sigij, elij, supmax, &831 ments, qents, traent)832 844 CALL cv3p_mixing(nloc, ncum, nd, nd, ntra, icb, nk, inb, & ! na->nd 845 ph, t, q, qs, u, v, tra, h, lv, qnk, & 846 unk, vnk, hp, tv, tvp, ep, clw, sig, & 847 ment, qent, hent, uent, vent, nent, & 848 sigij, elij, supmax, ments, qents, traent) 849 ! print*, 'cv3p_mixing-> supmax ', (supmax(1,k), k=1,nd) 833 850 834 851 ELSE … … 836 853 END IF 837 854 END IF 838 839 840 855 ! ------------------------------------------------------------------- 856 ! --- CLOSURE 857 ! ------------------------------------------------------------------- 841 858 842 859 843 860 IF (iflag_con==3) THEN 844 861 IF (iflag_clos==0) THEN 845 CALL cv3_closure(nloc, ncum, nd, icb, inb & ! na->nd 846 , pbase, p, ph, tv, buoy, sig, w0, cape, m, iflag) 862 CALL cv3_closure(nloc, ncum, nd, icb, inb, & ! na->nd 863 pbase, p, ph, tv, buoy, & 864 sig, w0, cape, m, iflag) 847 865 END IF 848 866 … … 851 869 IF (iflag_clos==1) THEN 852 870 PRINT *, ' pas d appel cv3p_closure' 853 ! c CALL cv3p_closure(nloc,ncum,nd,icb,inb ! 854 ! na->nd 855 ! c : ,pbase,plcl,p,ph,tv,tvp,buoy 856 ! c : ,supmax 857 ! c o ,sig,w0,ptop2,cape,cin,m) 871 ! c CALL cv3p_closure(nloc,ncum,nd,icb,inb ! na->nd 872 ! c : ,pbase,plcl,p,ph,tv,tvp,buoy 873 ! c : ,supmax 874 ! c o ,sig,w0,ptop2,cape,cin,m) 858 875 END IF 859 876 IF (iflag_clos==2) THEN 860 CALL cv3p1_closure(nloc, ncum, nd, icb, inb & ! na->nd 861 , pbase, plcl, p, ph, tv, tvp, buoy, supmax, ok_inhib, ale, alp, & 862 sig, w0, ptop2, cape, cin, m, iflag, coef_clos, plim1, plim2, & 863 asupmax, supmax0, asupmaxmin, cbmf, plfc, wbeff) 877 CALL cv3p1_closure(nloc, ncum, nd, icb, inb, & ! na->nd 878 pbase, plcl, p, ph, tv, tvp, buoy, & 879 supmax, ok_inhib, Ale, Alp, & 880 sig, w0, ptop2, cape, cin, m, iflag, coef_clos, & 881 Plim1, plim2, asupmax, supmax0, & 882 asupmaxmin, cbmf, plfc, wbeff) 864 883 865 884 PRINT *, 'cv3p1_closure-> plfc,wbeff ', plfc(1), wbeff(1) … … 868 887 869 888 IF (iflag_con==4) THEN 870 CALL cv_closure(nloc, ncum, nd, nk, icb, tv, tvp, p, ph, dph, plcl, & 871 cpn, iflag, cbmf) 872 END IF 873 874 ! print *,'cv_closure-> cape ',cape(1) 875 876 ! ------------------------------------------------------------------- 877 ! --- MIXING(2) 878 ! ------------------------------------------------------------------- 889 CALL cv_closure(nloc, ncum, nd, nk, icb, & 890 tv, tvp, p, ph, dph, plcl, cpn, & 891 iflag, cbmf) 892 END IF 893 894 ! print *,'cv_closure-> cape ',cape(1) 895 896 ! ------------------------------------------------------------------- 897 ! --- MIXING(2) 898 ! ------------------------------------------------------------------- 879 899 880 900 IF (iflag_con==3) THEN 881 901 IF (iflag_mix==0) THEN 882 CALL cv3_mixing(nloc, ncum, nd, nd, ntra, icb, nk, inb & ! 883 ! na->nd 884 , ph, t, q, qs, u, v, tra, h, lv, lf, frac, qnk, unk, vnk, hp, tv, & 885 tvp, ep, clw, m, sig, ment, qent, uent, vent, nent, sigij, elij, & 886 ments, qents, traent) 902 CALL cv3_mixing(nloc, ncum, nd, nd, ntra, icb, nk, inb, & ! na->nd 903 ph, t, q, qs, u, v, tra, h, lv, lf, frac, qnk, & 904 unk, vnk, hp, tv, tvp, ep, clw, m, sig, & 905 ment, qent, uent, vent, nent, sigij, elij, ments, qents, traent) 887 906 CALL zilch(hent, nloc*klev*klev) 888 907 ELSE … … 895 914 896 915 IF (iflag_con==4) THEN 897 CALL cv_mixing(nloc, ncum, nd, icb, nk, inb, inbis, ph, t, q, qs, u, v, & 898 h, lv, qnk, hp, tv, tvp, ep, clw, cbmf, m, ment, qent, uent, vent, & 899 nent, sigij, elij) 900 END IF 916 CALL cv_mixing(nloc, ncum, nd, icb, nk, inb, inbis, & 917 ph, t, q, qs, u, v, h, lv, qnk, & 918 hp, tv, tvp, ep, clw, cbmf, & 919 m, ment, qent, uent, vent, nent, sigij, elij) 920 END IF 901 921 902 922 IF (debut) THEN 903 923 PRINT *, ' cv_mixing ->' 904 924 END IF !(debut) THEN 905 906 907 908 909 910 911 925 ! do i = 1,klev 926 ! print*,'cv_mixing-> i,ment ',i,(ment(1,i,j),j=1,klev) 927 ! enddo 928 929 ! ------------------------------------------------------------------- 930 ! --- UNSATURATED (PRECIPITATING) DOWNDRAFTS 931 ! ------------------------------------------------------------------- 912 932 IF (iflag_con==3) THEN 913 933 IF (debut) THEN … … 915 935 END IF !(debut) THEN 916 936 917 CALL cv3_unsat(nloc, ncum, nd, nd, ntra, icb, inb, iflag & ! 918 ! na->nd 919 , t_wake, q_wake, qs_wake, gz, u, v, tra, p, ph, th_wake, tv_wake, & 920 lv_wake, lf_wake, cpn_wake, ep, sigp, clw, m, ment, elij, delt, plcl, & 921 coef_clos, mp, qp, up, vp, trap, wt, water, evap, fondue, ice, faci, & 922 b, sigd, wdtraina, wdtrainm) ! RomP 937 CALL cv3_unsat(nloc, ncum, nd, nd, ntra, icb, inb, iflag, & ! na->nd 938 t_wake, q_wake, qs_wake, gz, u, v, tra, p, ph, & 939 th_wake, tv_wake, lv_wake, lf_wake, cpn_wake, & 940 ep, sigp, clw, & 941 m, ment, elij, delt, plcl, coef_clos, & 942 mp, qp, up, vp, trap, wt, water, evap, fondue, ice, & 943 faci, b, sigd, & 944 wdtrainA, wdtrainM) ! RomP 923 945 END IF 924 946 925 947 IF (iflag_con==4) THEN 926 CALL cv_unsat(nloc, ncum, nd, inb, t, q, qs, gz, u, v, p, ph, h, lv, & 927 ep, sigp, clw, m, ment, elij, iflag, mp, qp, up, vp, wt, water, evap) 948 CALL cv_unsat(nloc, ncum, nd, inb, t, q, qs, gz, u, v, p, ph, & 949 h, lv, ep, sigp, clw, m, ment, elij, & 950 iflag, mp, qp, up, vp, wt, water, evap) 928 951 END IF 929 952 … … 932 955 END IF !(debut) THEN 933 956 934 935 936 937 938 939 940 957 ! print *,'cv_unsat-> mp ',mp 958 ! print *,'cv_unsat-> water ',water 959 ! ------------------------------------------------------------------- 960 ! --- YIELD 961 ! (tendencies, precipitation, variables of interface with other 962 ! processes, etc) 963 ! ------------------------------------------------------------------- 941 964 942 965 IF (iflag_con==3) THEN 943 966 944 CALL cv3_yield(nloc, ncum, nd, nd, ntra & ! na->nd 945 , icb, inb, delt, t, q, t_wake, q_wake, s_wake, u, v, tra, gz, p, ph, & 946 h, hp, lv, lf, cpn, th, th_wake, ep, clw, m, tp, mp, qp, up, vp, & 947 trap, wt, water, ice, evap, fondue, faci, b, sigd, ment, qent, hent, & 948 iflag_mix, uent, vent, nent, elij, traent, sig, tv, tvp, wghti, & 949 iflag, precip, vprecip, ft, fq, fu, fv, ftra, cbmf, upwd, dnwd, & 950 dnwd0, ma, mip, tls, tps, qcondc, wd, ftd, fqd) 967 CALL cv3_yield(nloc, ncum, nd, nd, ntra, ok_conserv_q, & ! na->nd 968 icb, inb, delt, & 969 t, q, t_wake, q_wake, s_wake, u, v, tra, & 970 gz, p, ph, h, hp, lv, lf, cpn, th, th_wake, & 971 ep, clw, m, tp, mp, qp, up, vp, trap, & 972 wt, water, ice, evap, fondue, faci, b, sigd, & 973 ment, qent, hent, iflag_mix, uent, vent, & 974 nent, elij, traent, sig, & 975 tv, tvp, wghti, & 976 iflag, precip, vprecip, ft, fq, fu, fv, ftra, & 977 cbmf, upwd, dnwd, dnwd0, ma, mip, & 978 tls, tps, qcondc, wd, & 979 ftd, fqd) 951 980 END IF 952 981 … … 956 985 957 986 IF (iflag_con==4) THEN 958 CALL cv_yield(nloc, ncum, nd, nk, icb, inb, delt, t, q, u, v, gz, p, & 959 ph, h, hp, lv, cpn, ep, clw, frac, m, mp, qp, up, vp, wt, water, & 960 evap, ment, qent, uent, vent, nent, elij, tv, tvp, iflag, wd, qprime, & 961 tprime, precip, cbmf, ft, fq, fu, fv, ma, qcondc) 962 END IF 963 964 ! AC! 965 ! ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 966 ! --- passive tracers 967 ! ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 987 CALL cv_yield(nloc, ncum, nd, nk, icb, inb, delt, & 988 t, q, u, v, & 989 gz, p, ph, h, hp, lv, cpn, & 990 ep, clw, frac, m, mp, qp, up, vp, & 991 wt, water, evap, & 992 ment, qent, uent, vent, nent, elij, & 993 tv, tvp, & 994 iflag, wd, qprime, tprime, & 995 precip, cbmf, ft, fq, fu, fv, ma, qcondc) 996 END IF 997 998 !AC! 999 !^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 1000 !--- passive tracers 1001 !^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 968 1002 969 1003 IF (iflag_con==3) THEN 970 ! RomP >>> 971 CALL cv3_tracer(nloc, len, ncum, nd, nd, ment, sigij, da, phi, phi2, & 972 d1a, dam, ep, vprecip, elij, clw, epmlmmm, eplamm, icb, inb) 973 ! RomP <<< 974 END IF 975 976 ! AC! 977 978 ! ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 979 ! --- UNCOMPRESS THE FIELDS 980 ! ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 1004 !RomP >>> 1005 CALL cv3_tracer(nloc, len, ncum, nd, nd, & 1006 ment, sigij, da, phi, phi2, d1a, dam, & 1007 ep, vprecip, elij, clw, epmlmMm, eplaMm, & 1008 icb, inb) 1009 !RomP <<< 1010 END IF 1011 1012 !AC! 1013 1014 ! ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 1015 ! --- UNCOMPRESS THE FIELDS 1016 ! ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 981 1017 982 1018 983 1019 IF (iflag_con==3) THEN 984 CALL cv3a_uncompress(nloc, len, ncum, nd, ntra, idcum, iflag, icb, inb, & 985 precip, cbmf, plcl, plfc, wbeff, sig, w0, ptop2, ft, fq, fu, fv, & 986 ftra, sigd, ma, mip, vprecip, upwd, dnwd, dnwd0, qcondc, wd, cape, & 987 cin, tvp, ftd, fqd, plim1, plim2, asupmax, supmax0, asupmaxmin, da, & 988 phi, mp, phi2, d1a, dam, sigij & ! RomP 989 , clw, elij, evap, ep, epmlmmm, eplamm & ! RomP 990 , wdtraina, wdtrainm & ! RomP 991 , iflag1, kbas1, ktop1, precip1, cbmf1, plcl1, plfc1, wbeff1, sig1, & 992 w01, ptop21, ft1, fq1, fu1, fv1, ftra1, sigd1, ma1, mip1, vprecip1, & 993 upwd1, dnwd1, dnwd01, qcondc1, wd1, cape1, cin1, tvp1, ftd1, fqd1, & 994 plim11, plim21, asupmax1, supmax01, asupmaxmin1, da1, phi1, mp1, & 995 phi21, d1a1, dam1, sigij1 & ! RomP 996 , clw1, elij1, evap1, ep1, epmlmmm1, eplamm1 & ! RomP 997 , wdtraina1, wdtrainm1) ! RomP 1020 CALL cv3a_uncompress(nloc, len, ncum, nd, ntra, idcum, & 1021 iflag, icb, inb, & 1022 precip, cbmf, plcl, plfc, wbeff, sig, w0, ptop2, & 1023 ft, fq, fu, fv, ftra, & 1024 sigd, ma, mip, vprecip, upwd, dnwd, dnwd0, & 1025 qcondc, wd, cape, cin, & 1026 tvp, & 1027 ftd, fqd, & 1028 Plim1, plim2, asupmax, supmax0, & 1029 asupmaxmin, & 1030 da, phi, mp, phi2, d1a, dam, sigij, & ! RomP 1031 clw, elij, evap, ep, epmlmMm, eplaMm, & ! RomP 1032 wdtrainA, wdtrainM, & ! RomP 1033 iflag1, kbas1, ktop1, & 1034 precip1, cbmf1, plcl1, plfc1, wbeff1, sig1, w01, ptop21, & 1035 ft1, fq1, fu1, fv1, ftra1, & 1036 sigd1, ma1, mip1, vprecip1, upwd1, dnwd1, dnwd01, & 1037 qcondc1, wd1, cape1, cin1, & 1038 tvp1, & 1039 ftd1, fqd1, & 1040 Plim11, plim21, asupmax1, supmax01, & 1041 asupmaxmin1, & 1042 da1, phi1, mp1, phi21, d1a1, dam1, sigij1, & ! RomP 1043 clw1, elij1, evap1, ep1, epmlmMm1, eplaMm1, & ! RomP 1044 wdtrainA1, wdtrainM1) ! RomP 998 1045 END IF 999 1046 1000 1047 IF (iflag_con==4) THEN 1001 CALL cv_uncompress(nloc, len, ncum, nd, idcum, iflag, precip, cbmf, ft, & 1002 fq, fu, fv, ma, qcondc, iflag1, precip1, cbmf1, ft1, fq1, fu1, fv1, & 1003 ma1, qcondc1) 1048 CALL cv_uncompress(nloc, len, ncum, nd, idcum, & 1049 iflag, & 1050 precip, cbmf, & 1051 ft, fq, fu, fv, & 1052 ma, qcondc, & 1053 iflag1, & 1054 precip1,cbmf1, & 1055 ft1, fq1, fu1, fv1, & 1056 ma1, qcondc1) 1004 1057 END IF 1005 1058 … … 1009 1062 PRINT *, ' cv_compress -> ' 1010 1063 debut = .FALSE. 1011 END IF !(debut) THEN 1064 END IF !(debut) THEN 1065 1012 1066 1013 1067 RETURN -
LMDZ5/trunk/libf/phylmd/cvltr.F90
r1907 r2007 3 3 ! 4 4 SUBROUTINE cvltr(pdtime, da, phi,phi2,d1a,dam, mpIN,epIN, & 5 sigd,sij,clw,elij,epmlmMm,eplaMm, & 5 !! sigd,sij,clw,elij,epmlmMm,eplaMm, & !RL 6 sigd,sij,wght_cvfd,clw,elij,epmlmMm,eplaMm, & !RL 6 7 pmflxrIN,pmflxsIN,ev,te,wdtrainA,wdtrainM, & 7 8 paprs,it,tr,upd,dnd,inb,icb, & … … 47 48 REAL,DIMENSION(klon,klev),INTENT(IN) :: te 48 49 REAL,DIMENSION(klon,klev,klev),INTENT(IN) :: sij ! fraction dair de lenv 50 REAL,DIMENSION(klon,klev),INTENT(IN) :: wght_cvfd ! weights of the layers feeding convection 49 51 REAL,DIMENSION(klon,klev,klev),INTENT(IN) :: elij ! contenu en eau condensée spécifique/conc deau condensée massique 50 52 REAL,DIMENSION(klon,klev,klev),INTENT(IN) :: epmlmMm ! eau condensee precipitee dans mel masse dair sat … … 71 73 REAL,DIMENSION(klon,klev,nbtr) :: zmfd,zmfa 72 74 REAL,DIMENSION(klon,klev,nbtr) :: zmfp,zmfu 75 REAL,DIMENSION(klon,nbtr) :: qfeed ! tracer concentration feeding convection 73 76 74 77 REAL,DIMENSION(klon,klev,nbtr),INTENT(OUT) :: zmfd1a … … 168 171 scavtrac = 0. 169 172 uscavtrac = 0. 170 173 qfeed(:,it) = 0. !RL 171 174 DO j=1,klev 172 175 DO i=1,klon … … 330 333 ! calcul des tendances liees aux courants satures j <-> z ; k <-> z' 331 334 ! ========================================= 335 ! 336 !RL 337 ! Feeding concentrations 332 338 DO j=1,klev 333 339 DO i=1,klon 334 zmfa(i,j,it)=da(i,j)*(tr(i,1,it)-tr(i,j,it)) ! da 335 END DO 336 END DO 340 qfeed(i,it)=qfeed(i,it)+wght_cvfd(i,j)*tr(i,j,it) 341 END DO 342 END DO 343 !RL 344 ! 345 DO j=1,klev 346 DO i=1,klon 347 !RL 348 !! zmfa(i,j,it)=da(i,j)*(tr(i,1,it)-tr(i,j,it)) ! da 349 zmfa(i,j,it)=da(i,j)*(qfeed(i,it)-tr(i,j,it)) ! da 350 !RL 351 END DO 352 END DO 353 ! 337 354 DO k=1,klev 338 355 DO j=1,klev -
LMDZ5/trunk/libf/phylmd/physiq.F90
r2006 r2007 237 237 ! Variables pour le transport convectif 238 238 real da(klon,klev),phi(klon,klev,klev),mp(klon,klev) 239 real wght_cvfd(klon,klev) 239 240 ! Variables pour le lessivage convectif 240 241 ! RomP >>> … … 2061 2062 ftd,fqd,lalim_conv,wght_th, & 2062 2063 ev, ep,epmlmMm,eplaMm, & 2063 wdtrainA,wdtrainM )2064 wdtrainA,wdtrainM,wght_cvfd) 2064 2065 ! RomP <<< 2065 2066 … … 3479 3480 pmflxr, pmflxs, prfl, psfl, & 3480 3481 da, phi, mp, upwd, & 3481 phi2, d1a, dam, sij, & !<<RomP3482 phi2, d1a, dam, sij, wght_cvfd, & !<<RomP+RL 3482 3483 wdtrainA, wdtrainM, sigd, clw,elij, & !<<RomP 3483 3484 ev, ep, epmlmMm, eplaMm, & !<<RomP -
LMDZ5/trunk/libf/phylmd/phytrac_mod.F90
r1909 r2007 54 54 CONTAINS 55 55 56 SUBROUTINE phytrac( &57 nstep, julien, gmtime, debutphy, &58 lafin, pdtphys, u, v, t_seri, &59 paprs, pplay, pmfu, pmfd, &60 pen_u, pde_u, pen_d, pde_d, &61 cdragh, coefh, fm_therm, entr_therm, &62 yu1, yv1, ftsol, pctsrf, &63 ustar, u10m, v10m, &64 wstar, ale_bl, ale_wake, &65 xlat, xlon, &66 frac_impa,frac_nucl,beta_fisrt,beta_v1, &67 presnivs, pphis, pphi, albsol, &68 sh, rh, cldfra, rneb, &69 diafra, cldliq, itop_con, ibas_con, &70 pmflxr, pmflxs, prfl, psfl, &71 da, phi, mp, upwd, &72 phi2, d1a, dam, sij, & ! RomP73 wdtrainA, wdtrainM, sigd, clw, elij,& ! RomP74 evap, ep, epmlmMm, eplaMm, & ! RomP75 dnwd, aerosol_couple, flxmass_w, &76 tau_aero, piz_aero, cg_aero, ccm, &77 rfname, &78 d_tr_dyn, & ! RomP56 SUBROUTINE phytrac( & 57 nstep, julien, gmtime, debutphy, & 58 lafin, pdtphys, u, v, t_seri, & 59 paprs, pplay, pmfu, pmfd, & 60 pen_u, pde_u, pen_d, pde_d, & 61 cdragh, coefh, fm_therm, entr_therm, & 62 yu1, yv1, ftsol, pctsrf, & 63 ustar, u10m, v10m, & 64 wstar, ale_bl, ale_wake, & 65 xlat, xlon, & 66 frac_impa,frac_nucl,beta_fisrt,beta_v1, & 67 presnivs, pphis, pphi, albsol, & 68 sh, rh, cldfra, rneb, & 69 diafra, cldliq, itop_con, ibas_con, & 70 pmflxr, pmflxs, prfl, psfl, & 71 da, phi, mp, upwd, & 72 phi2, d1a, dam, sij, wght_cvfd, & ! RomP +RL 73 wdtrainA, wdtrainM, sigd, clw, elij, & ! RomP 74 evap, ep, epmlmMm, eplaMm, & ! RomP 75 dnwd, aerosol_couple, flxmass_w, & 76 tau_aero, piz_aero, cg_aero, ccm, & 77 rfname, & 78 d_tr_dyn, & ! RomP 79 79 tr_seri) 80 80 ! … … 190 190 REAL,DIMENSION(klon,klev),INTENT(IN) :: ep 191 191 REAL,DIMENSION(klon,klev,klev),INTENT(IN) :: sij 192 REAL,DIMENSION(klon,klev),INTENT(IN) :: wght_cvfd !RL 192 193 REAL,DIMENSION(klon,klev,klev),INTENT(IN) :: elij 193 194 REAL,DIMENSION(klon,klev,klev),INTENT(IN) :: epmlmMm … … 507 508 ! 508 509 CALL cvltr(pdtphys, da, phi,phi2,d1a,dam, mp,ep, & 509 sigd,sij,clw,elij,epmlmMm,eplaMm, & 510 !! sigd,sij,clw,elij,epmlmMm,eplaMm, & !RL 511 sigd,sij,wght_cvfd,clw,elij,epmlmMm,eplaMm, & !RL 510 512 pmflxr,pmflxs,evap,t_seri,wdtrainA,wdtrainM, & 511 513 paprs,it,tr_seri,upwd,dnwd,itop_con,ibas_con, & … … 514 516 zmfd1a,zmfphi2,zmfdam) 515 517 else !pas de lessivage convectif ou n'est pas un aerosol 516 CALL cvltrorig(it,pdtphys, da, phi,mp,paprs,pplay,tr_seri,& 517 upwd,dnwd,d_tr_cv) 518 !! CALL cvltrorig(it,pdtphys, da, phi,mp,paprs,pplay,tr_seri,& !jyg 519 !! upwd,dnwd,d_tr_cv) !jyg 520 CALL cvltr_noscav(it,pdtphys, da, phi,mp,wght_cvfd,paprs,pplay, & !jyg 521 tr_seri,upwd,dnwd,d_tr_cv) !jyg 518 522 endif 519 523 END IF
Note: See TracChangeset
for help on using the changeset viewer.