Changeset 6042
- Timestamp:
- Jan 21, 2026, 1:20:47 PM (6 hours ago)
- Location:
- LMDZ6/trunk/libf/phylmd
- Files:
-
- 2 edited
-
lmdz_call_lscp.f90 (modified) (15 diffs)
-
physiq_mod.F90 (modified) (3 diffs)
Legend:
- Unmodified
- Added
- Removed
-
LMDZ6/trunk/libf/phylmd/lmdz_call_lscp.f90
r6028 r6042 9 9 abortphy, flag_inhib_tend, itap, & 10 10 nqo, dtime, missing_val, ok_new_lscp, & 11 paprs, pplay, omega, temp, qt, ql_seri, qi_seri,&11 paprs, pplay, omega, temp, qt, & 12 12 zmasse, ptconv, ratqsc, ratqs, ratqs_inter_, sigma_qtherm, & 13 13 qtc_cv, sigt_cv, detrain_cv, fm_cv, fqd, fqcomp, & … … 29 29 fm_therm, entr_therm, detr_therm, & 30 30 cell_area, & 31 cf _seri, rvc_seri, u_seri, v_seri, &31 cf, rvc, u, v, & 32 32 qsub, qissr, qcld, subfra, issrfra, gamma_cond, & 33 33 dcf_sub, dcf_con, dcf_mix, & 34 34 dqi_adj, dqi_sub, dqi_con, dqi_mix, dqvc_adj, & 35 dqvc_sub, dqvc_con, dqvc_mix, qsatl , qsati, &35 dqvc_sub, dqvc_con, dqvc_mix, qsatliq, qsatice, & 36 36 Tcontr, qcontr, qcontr2, fcontrN, fcontrP, dcf_avi, & 37 37 dqi_avi, dqvc_avi, flight_dist, flight_h2o, & … … 39 39 qraindiag, qsnowdiag, dqreva, dqssub, dqrauto, & 40 40 dqrcol, dqrmelt, dqrfreez, dqsauto, dqsagg, dqsrim, & 41 dqsmelt, dqsfreez )41 dqsmelt, dqsfreez, rh, rhl, rhi) 42 42 43 43 USE lmdz_lscp_main, ONLY: lscp 44 44 USE lmdz_lscp_old, ONLY: fisrtilp, fisrtilp_first 45 45 USE lmdz_lscp_subgridvarq, ONLY: ratqs_main, ratqs_main_first 46 USE lmdz_lscp_ini, ONLY: qlmax, qimax 46 USE lmdz_lscp_ini, ONLY: qlmax, qimax, RTT 47 USE lmdz_lscp_tools, ONLY: calc_qsat_ecmwf 47 48 USE add_phys_tend_mod, ONLY: add_phys_tend, prt_enerbil 49 USE phys_local_var_mod, ONLY: t_seri, q_seri, ql_seri, qs_seri 48 50 49 51 IMPLICIT NONE … … 52 54 ! call_lscp in the main interface between the LMDZ physics monitor physiq_mod 53 55 ! and the large scale clouds and precipitation (lscp) parameterizations 56 ! 57 ! The aim of lscp routines is to compute the cloud fraction, cloud water 58 ! contents, precipitation and temperature and water tendencies from the 59 ! 'large scale' (i.e. not from deep convection) 54 60 ! 55 61 ! contact: Etienne Vignon etienne.vignon@lmd.ipsl.fr … … 78 84 REAL, DIMENSION(klon, klev), INTENT(IN) :: omega ! vertical velocity [Pa/s] 79 85 REAL, DIMENSION(klon, klev), INTENT(IN) :: qt ! total specific humidity (in vapor phase in input) [kg/kg] 80 REAL, DIMENSION(klon, klev), INTENT(IN) :: ql_seri ! liquid specific content [kg/kg]81 REAL, DIMENSION(klon, klev), INTENT(IN) :: qi_seri ! ice specific content [kg/kg]82 REAL, DIMENSION(klon, klev), INTENT(IN) :: qsat ! saturation specific humidity [kg/kg] from the physics83 86 REAL, DIMENSION(klon, klev), INTENT(IN) :: ratio_ql_qtot ! ratio ql/qt at the beginning of physics time step [-] 84 87 REAL, DIMENSION(klon, klev), INTENT(IN) :: ratio_qi_qtot ! ratio qi/qt at the beginning of physics time step [-] … … 118 121 ! INPUT/OUTPUT variables 119 122 !------------------------ 120 123 REAL, DIMENSION(klon, klev), INTENT(INOUT) :: qsat ! saturation specific humidity [kg/kg] from/to the physics 121 124 REAL, DIMENSION(klon, klev), INTENT(INOUT) :: thl ! liquid potential temperature [K] 122 125 REAL, DIMENSION(klon, klev), INTENT(INOUT) :: pfrac_impa ! product of impaction scavenging coeff. … … 128 131 ! INPUT/OUTPUT condensation and ice supersaturation 129 132 !-------------------------------------------------- 130 REAL, DIMENSION(klon, klev), INTENT(INOUT):: cf _seri! cloud fraction [-]131 REAL, DIMENSION(klon, klev), INTENT(INOUT):: rvc _seri! cloudy water vapor to total water vapor ratio [-]132 REAL, DIMENSION(klon, klev), INTENT(IN) :: u _seri! eastward wind [m/s]133 REAL, DIMENSION(klon, klev), INTENT(IN) :: v _seri! northward wind [m/s]133 REAL, DIMENSION(klon, klev), INTENT(INOUT):: cf ! cloud fraction [-] 134 REAL, DIMENSION(klon, klev), INTENT(INOUT):: rvc ! cloudy water vapor to total water vapor ratio [-] 135 REAL, DIMENSION(klon, klev), INTENT(IN) :: u ! eastward wind [m/s] 136 REAL, DIMENSION(klon, klev), INTENT(IN) :: v ! northward wind [m/s] 134 137 REAL, DIMENSION(klon), INTENT(IN) :: cell_area ! area of each cell [m2] 135 138 … … 166 169 REAL, DIMENSION(klon, klev), INTENT(OUT) :: temp_cltop ! temperature of cloud top [K] 167 170 REAL, DIMENSION(klon, klev), INTENT(OUT) :: beta ! conversion rate of condensed water 171 REAL, DIMENSION(klon, klev), INTENT(OUT) :: rh ! relative humidity [0-1], wrt liq if T>0C, wrt ice if T<0C 172 REAL, DIMENSION(klon, klev), INTENT(OUT) :: rhl ! relative humidity [0-1] wrt liq 173 REAL, DIMENSION(klon, klev), INTENT(OUT) :: rhi ! relative humidity [0-1] wrt ice 168 174 169 175 ! for subgrid variability of water … … 197 203 REAL, DIMENSION(klon, klev), INTENT(OUT) :: dqvc_con !--specific cloud water vapor tendency because of condensation [kg/kg/s] 198 204 REAL, DIMENSION(klon, klev), INTENT(OUT) :: dqvc_mix !--specific cloud water vapor tendency because of cloud mixing [kg/kg/s] 199 REAL, DIMENSION(klon, klev), INTENT(OUT) :: qsatl !--saturation specific humidity wrt liquid [kg/kg]200 REAL, DIMENSION(klon, klev), INTENT(OUT) :: qsati !--saturation specific humidity wrt ice [kg/kg]205 REAL, DIMENSION(klon, klev), INTENT(OUT) :: qsatliq !--saturation specific humidity wrt liquid [kg/kg] 206 REAL, DIMENSION(klon, klev), INTENT(OUT) :: qsatice !--saturation specific humidity wrt ice [kg/kg] 201 207 202 208 ! for contrails and aviation … … 228 234 229 235 ! for thermals 230 231 236 REAL, DIMENSION(klon, klev), INTENT(OUT) :: cloudth_sth !--mean saturation deficit in thermals 232 237 REAL, DIMENSION(klon, klev), INTENT(OUT) :: cloudth_senv !--mean saturation deficit in environment … … 239 244 INTEGER :: i, k 240 245 REAL, DIMENSION(klon) :: rain_num 241 REAL, DIMENSION(klon, klev) :: ql_seri_lscp, qi_seri_lscp 242 REAL, DIMENSION(klon, klev) :: du0, dv0, dqbs0 246 REAL, DIMENSION(klon, klev) :: ql_estimate_lscp, qi_estimate_lscp 247 REAL, DIMENSION(klon, klev) :: du0, dv0, dqbs0 248 249 REAL, DIMENSION(klon) :: z_q, z_t, z_p, z_qs 250 REAL, DIMENSION(klon) :: z_qsl, z_qsi, z_dqs, z_dqsl, z_dqsi 243 251 244 252 !=============================================================================== … … 265 273 DO k = 1, klev 266 274 DO i = 1, klon 267 ql_ seri_lscp(i, k) = ratio_ql_qtot(i, k)*qt(i, k)268 qi_ seri_lscp(i, k) = ratio_qi_qtot(i, k)*qt(i, k)275 ql_estimate_lscp(i, k) = ratio_ql_qtot(i, k)*qt(i, k) 276 qi_estimate_lscp(i, k) = ratio_qi_qtot(i, k)*qt(i, k) 269 277 END DO 270 278 END DO 271 279 272 280 CALL lscp(klon, klev, dtime, missing_val, paprs, pplay, omega, & 273 temp, qt, ql_ seri_lscp, qi_seri_lscp, ptconv, ratqs, sigma_qtherm, &281 temp, qt, ql_estimate_lscp, qi_estimate_lscp, ptconv, ratqs, sigma_qtherm, & 274 282 d_t, d_q, d_ql, d_qi, rneb, rneblsvol, & 275 283 pfraclr, pfracld, cldfraliq, cldfraliqth, & … … 284 292 entr_therm, detr_therm, & 285 293 cell_area, & 286 cf _seri, rvc_seri, u_seri, v_seri, &294 cf, rvc, u, v, & 287 295 qsub, qissr, qcld, subfra, issrfra, gamma_cond, & 288 296 dcf_sub, dcf_con, dcf_mix, dqi_adj, dqi_sub, dqi_con, dqi_mix, & 289 dqvc_adj, dqvc_sub, dqvc_con, dqvc_mix, qsatl , qsati, &297 dqvc_adj, dqvc_sub, dqvc_con, dqvc_mix, qsatliq, qsatice, & 290 298 Tcontr, qcontr, qcontr2, fcontrN, fcontrP, & 291 299 dcf_avi, dqi_avi, dqvc_avi, flight_dist, flight_h2o, & … … 307 315 frac_impa, frac_nucl, beta, & 308 316 prfl, psfl, rhcl, & 309 qta, fraca, tv, pspsk, tla, thl, & 317 qta, fraca, tv, pspsk, tla, thl, & 310 318 cloudth_sth, cloudth_senv, cloudth_sigmath, cloudth_sigmaenv) 311 319 312 320 END IF 313 314 !===============================================================================315 ! Final computations316 !===============================================================================317 318 ! rain and snow are set to 0 when negative319 WHERE (rain_lsc < 0) rain_lsc = 0.320 WHERE (snow_lsc < 0) snow_lsc = 0.321 322 ! so-called 'numerical rain' is computed when qlnew=ql+dql>qlmax and qinew=qi+dqi>qimax323 ! i.e. when the condensed content is unrealistically large324 ! qlnew is set to qlmax and qinew to qimax325 ! equivalently, we set d_ql=qlmax-ql, d_ql=qimax-qi326 rain_num(:) = 0.327 DO k = 1, klev328 DO i = 1, klon329 IF (ql_seri(i, k) + d_ql(i, k) > qlmax) THEN330 rain_num(i) = rain_num(i) + (ql_seri(i, k) + d_ql(i, k) - qlmax)*zmasse(i, k)/dtime331 d_ql(i, k) = qlmax - ql_seri(i, k)332 END IF333 END DO334 END DO335 336 IF (nqo >= 3) THEN337 DO k = 1, klev338 DO i = 1, klon339 IF (qi_seri(i, k) + d_qi(i, k) > qimax) THEN340 rain_num(i) = rain_num(i) + (qi_seri(i, k) - qimax)*zmasse(i, k)/dtime341 d_qi(i, k) = qimax - qi_seri(i, k)342 END IF343 END DO344 END DO345 END IF346 347 ! Total precipitation348 DO i = 1, klon349 rain_fall(i) = rain_fall(i) + rain_lsc(i)350 snow_fall(i) = snow_fall(i) + snow_lsc(i)351 END DO352 321 353 322 !=============================================================================== … … 361 330 CALL prt_enerbil('lsc', itap) 362 331 332 !=============================================================================== 333 ! Final computations 334 !=============================================================================== 335 336 ! rain and snow are set to 0 when negative 337 WHERE (rain_lsc < 0) rain_lsc = 0. 338 WHERE (snow_lsc < 0) snow_lsc = 0. 339 340 ! so-called 'numerical rain' is computed when qlnew=ql+dql>qlmax and qinew=qi+dqi>qimax 341 ! i.e. when the condensed content is unrealistically large 342 ! qlnew is set to qlmax and qinew to qimax 343 344 rain_num(:) = 0. 345 DO k = 1, klev 346 DO i = 1, klon 347 IF (ql_seri(i, k) > qlmax) THEN 348 rain_num(i) = rain_num(i) + (ql_seri(i, k) - qlmax)*zmasse(i, k)/dtime 349 ql_seri(i, k) = qlmax 350 END IF 351 END DO 352 END DO 353 IF (nqo >= 3) THEN 354 DO k = 1, klev 355 DO i = 1, klon 356 IF (qs_seri(i, k) > qimax) THEN 357 rain_num(i) = rain_num(i) + (qs_seri(i, k) - qimax)*zmasse(i, k)/dtime 358 qs_seri(i, k) = qimax 359 END IF 360 END DO 361 END DO 362 END IF 363 364 ! total precipitation 365 DO i = 1, klon 366 rain_fall(i) = rain_fall(i) + rain_lsc(i) 367 snow_fall(i) = snow_fall(i) + snow_lsc(i) 368 END DO 369 370 ! relative humidity diagnostics 371 DO k = 1, klev 372 373 DO i=1, klon 374 z_q(i) = q_seri(i, k) 375 z_t(i) = t_seri(i, k) 376 z_p(i) = pplay(i, k) 377 END DO 378 379 CALL CALC_QSAT_ECMWF(klon, z_t, z_q, z_p, RTT, 0, .false., z_qs, z_dqs) 380 CALL CALC_QSAT_ECMWF(klon, z_t, z_q, z_p, RTT, 1, .false., z_qsl, z_dqsl) 381 CALL CALC_QSAT_ECMWF(klon, z_t, z_q, z_p, RTT, 2, .false., z_qsi, z_dqsi) 382 383 DO i = 1, klon 384 rhl(i, k) = z_q(i)/z_qsl(i) 385 rhi(i, k) = z_q(i)/z_qsi(i) 386 rh(i, k) = z_q(i)/z_qs(i) 387 qsat(i, k) = z_qs(i) 388 END DO 389 390 ENDDO 391 392 393 363 394 END SUBROUTINE call_lscp 364 395 -
LMDZ6/trunk/libf/phylmd/physiq_mod.F90
r6033 r6042 3959 3959 abortphy, flag_inhib_tend, itap, & 3960 3960 nqo, pdtphys, missing_val, ok_new_lscp, & 3961 paprs, pplay, omega, t_seri, q_seri, ql_seri, qs_seri,&3961 paprs, pplay, omega, t_seri, q_seri, & 3962 3962 zmasse, ptconv, ratqsc, ratqs, ratqs_inter_, sigma_qtherm, & 3963 3963 qtc_cv, sigt_cv,detrain_cv,fm_cv,fqd,fqcomp, & … … 3989 3989 qraindiag, qsnowdiag, dqreva, dqssub, dqrauto, & 3990 3990 dqrcol, dqrmelt, dqrfreez, dqsauto, dqsagg, dqsrim,& 3991 dqsmelt, dqsfreez )3991 dqsmelt, dqsfreez, zx_rh, zx_rhl, zx_rhi) 3992 3992 3993 3993 !=============================================================================== … … 4169 4169 ENDDO 4170 4170 ENDIF 4171 4172 !4173 ! Calculer l'humidite relative pour diagnostique4174 !4175 ! A inclure dans lmdz_call_lscp via un appel à lmdz_lscp_tools4176 DO k = 1, klev4177 DO i = 1, klon4178 zx_t = t_seri(i,k)4179 IF (thermcep) THEN4180 zdelta = MAX(0.,SIGN(1.,rtt-zx_t))4181 zx_qs = r2es * FOEEW(zx_t,zdelta)/pplay(i,k)4182 zx_qs = MIN(0.5,zx_qs)4183 zcor = 1./(1.-retv*zx_qs)4184 zx_qs = zx_qs*zcor4185 ELSE4186 IF (zx_t.LT.rtt) THEN4187 zx_qs = qsats(zx_t)/pplay(i,k)4188 ELSE4189 zx_qs = qsatl(zx_t)/pplay(i,k)4190 ENDIF4191 ENDIF4192 zx_rh(i,k) = q_seri(i,k)/zx_qs4193 IF (iflag_ice_thermo .GT. 0) THEN4194 zx_rhl(i,k) = MIN(q_seri(i,k)/(qsatl(zx_t)/pplay(i,k)),1.)4195 zx_rhi(i,k) = zx_rhl(i,k)*qsatl(zx_t)/qsats(zx_t)4196 ENDIF4197 zqsat(i,k)=zx_qs4198 ENDDO4199 ENDDO4200 4171 4201 4172 !===============================================================================
Note: See TracChangeset
for help on using the changeset viewer.
