Changeset 5684 for LMDZ6/branches/contrails
- Timestamp:
- May 26, 2025, 5:20:01 PM (6 weeks ago)
- Location:
- LMDZ6/branches/contrails/libf/phylmd
- Files:
-
- 6 edited
Legend:
- Unmodified
- Added
- Removed
-
LMDZ6/branches/contrails/libf/phylmd/infotrac_phy.F90
r5641 r5684 353 353 (delPhase(tracers(:)%gen0Name) == 'CLDFRA'))) 354 354 ! IF(COUNT(tracers%iso_iName == 0) - COUNT(delPhase(tracers%name) == 'H2O' .AND. tracers%component == 'lmdz') /= nqtottr) & 355 IF(COUNT(tracers%iso_iName == 0) - COUNT(tracers(:)%component == 'lmdz' .AND. &356 ((delPhase(tracers(:)%name) == 'H2O') .OR. &357 (delPhase(tracers(:)%name) == 'CLDFRA'))) /= nqtottr) &358 CALL abort_physic(modname, 'problem with the computation of nqtottr', 1)355 !IF(COUNT(tracers%iso_iName == 0) - COUNT(tracers(:)%component == 'lmdz' .AND. & 356 ! ((delPhase(tracers(:)%name) == 'H2O') .OR. & 357 ! (delPhase(tracers(:)%name) == 'CLDFRA'))) /= nqtottr) & 358 ! CALL abort_physic(modname, 'problem with the computation of nqtottr', 1) 359 359 360 360 !--- Compute indices for water … … 370 370 iqtc = strIdx(tracers(:)%name, 'CIRCONTWATER') 371 371 !--Two ways of declaring tracers - the way below should be deleted in the future 372 IF (icf.EQ.0) icf = strIdx(tracers(:)%name, addPhase('H2O', 'f'))372 IF (icf.EQ.0) icf = strIdx(tracers(:)%name, addPhase('H2O', 'f')) 373 373 IF (iqvc.EQ.0) iqvc = strIdx(tracers(:)%name, addPhase('H2O', 'c')) 374 374 IF (icfl.EQ.0) icfl = strIdx(tracers(:)%name, addPhase('H2O', 'z')) -
LMDZ6/branches/contrails/libf/phylmd/lmdz_aviation.f90
r5641 r5684 599 599 REAL, INTENT(IN) :: pplay(klon, klev) ! mid-layer pressure [Pa] 600 600 REAL, INTENT(IN) :: temp(klon, klev) ! temperature [K] 601 REAL, INTENT(OUT) :: flight_dist(klon,klev) ! Aviation distance flown within the mesh [m/s/mesh]602 REAL, INTENT(OUT) :: flight_h2o(klon,klev) ! Aviation H2O emitted within the mesh [kgH2O/s/mesh]601 REAL, INTENT(OUT) :: flight_dist(klon,klev) ! Aviation distance flown concentration [m/s/m3] 602 REAL, INTENT(OUT) :: flight_h2o(klon,klev) ! Aviation H2O emitted concentration [kgH2O/s/m3] 603 603 604 604 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -
LMDZ6/branches/contrails/libf/phylmd/lmdz_lscp.f90
r5644 r5684 25 25 dqi_adj, dqi_sub, dqi_con, dqi_mix, dqvc_adj, & 26 26 dqvc_sub, dqvc_con, dqvc_mix, qsatl, qsati, & 27 cfl_seri, cfc_seri, qtl_seri, qtc_seri,flight_dist,& 28 flight_h2o, qice_lincont, qice_circont, Tcritcont, & 29 qcritcont, potcontfraP, potcontfraNP, & 27 cfl_seri, cfc_seri, qtl_seri, qtc_seri, & 28 qice_lincont, qice_circont, flight_dist, & 29 flight_h2o, qradice_lincont, qradice_circont, & 30 Tcritcont, qcritcont, potcontfraP, potcontfraNP, & 30 31 cloudth_sth, & 31 32 cloudth_senv, cloudth_sigmath, cloudth_sigmaenv, & … … 132 133 USE phys_local_var_mod, ONLY : dcfl_cir, dqtl_cir, dcfl_mix, dqil_mix, dqtl_mix 133 134 USE phys_local_var_mod, ONLY : dcfc_sub, dqic_sub, dqtc_sub, dcfc_mix, dqic_mix, dqtc_mix 135 USE geometry_mod, ONLY: longitude_deg, latitude_deg 134 136 135 137 IMPLICIT NONE … … 253 255 ! for contrails and aviation 254 256 255 REAL, DIMENSION(klon,klev), INTENT(OUT) :: qice_lincont !--condensed water in linear contrails used in the radiation scheme [kg/kg] 256 REAL, DIMENSION(klon,klev), INTENT(OUT) :: qice_circont !--condensed water in contrail cirrus used in the radiation scheme [kg/kg] 257 REAL, DIMENSION(klon,klev), INTENT(OUT) :: qice_lincont !--condensed water in linear contrails [kg/kg] 258 REAL, DIMENSION(klon,klev), INTENT(OUT) :: qice_circont !--condensed water in contrail cirrus [kg/kg] 259 REAL, DIMENSION(klon,klev), INTENT(OUT) :: qradice_lincont!--condensed water in linear contrails used in the radiation scheme [kg/kg] 260 REAL, DIMENSION(klon,klev), INTENT(OUT) :: qradice_circont!--condensed water in contrail cirrus used in the radiation scheme [kg/kg] 257 261 REAL, DIMENSION(klon,klev), INTENT(OUT) :: Tcritcont !--critical temperature for contrail formation [K] 258 262 REAL, DIMENSION(klon,klev), INTENT(OUT) :: qcritcont !--critical specific humidity for contrail formation [kg/kg] … … 333 337 ! for condensation and ice supersaturation 334 338 REAL, DIMENSION(klon) :: qvc, qvcl, shear 335 REAL :: delta_z 339 REAL :: delta_z, deepconv_coef 336 340 ! for contrails 337 341 REAL, DIMENSION(klon) :: lincontfra, circontfra, qlincont, qcircont … … 673 677 674 678 DO i = 1, klon 675 pt_pron_clds(i) = ( ( ( ( zt(i) .LE. temp_nowater ) .OR. ok_weibull_warm_clouds ) & 676 .AND. ( .NOT. ok_no_issr_strato .OR. ( stratomask(i,k) .EQ. 0. ) ) ) & 677 .AND. ( cfcon(i,k) .LT. ( 1. - eps ) ) ) 679 pt_pron_clds(i) = ( cfcon(i,k) .LT. ( 1. - eps ) ) 678 680 ENDDO 681 IF ( .NOT. ok_weibull_warm_clouds ) THEN 682 DO i = 1, klon 683 pt_pron_clds(i) = pt_pron_clds(i) .AND. ( zt(i) .LE. temp_nowater ) 684 ENDDO 685 ENDIF 686 IF ( ok_no_issr_strato ) THEN 687 DO i = 1, klon 688 pt_pron_clds(i) = pt_pron_clds(i) .AND. ( stratomask(i,k) .EQ. 0. ) 689 ENDDO 690 ENDIF 679 691 680 692 totfra_in(:) = 1. … … 704 716 !--Else if deep convection is strengthening, it consumes the existing cloud 705 717 !--fraction (which does not at this moment represent deep convection) 706 cldfra_in(i) = cldfra_in(i) * ( 1. & 707 - ( cfcon(i,k) - cfcon_old(i,k) ) / ( 1. - cfcon_old(i,k) ) ) 708 qvc_in(i) = qvc_in(i) * ( 1. & 709 - ( cfcon(i,k) - cfcon_old(i,k) ) / ( 1. - cfcon_old(i,k) ) ) 710 qice_in(i) = qice_in(i) * ( 1. & 711 - ( cfcon(i,k) - cfcon_old(i,k) ) / ( 1. - cfcon_old(i,k) ) ) 718 deepconv_coef = 1. - ( cfcon(i,k) - cfcon_old(i,k) ) / ( 1. - cfcon_old(i,k) ) 719 cldfra_in(i) = cldfra_in(i) * deepconv_coef 720 qvc_in(i) = qvc_in(i) * deepconv_coef 721 qice_in(i) = qice_in(i) * deepconv_coef 722 IF ( ok_plane_contrail ) THEN 723 !--If contrails are activated, their fraction is also reduced when deep 724 !--convection is active 725 cfl_seri(i,k) = cfl_seri(i,k) * deepconv_coef 726 qtl_seri(i,k) = qtl_seri(i,k) * deepconv_coef 727 cfc_seri(i,k) = cfc_seri(i,k) * deepconv_coef 728 qtc_seri(i,k) = qtc_seri(i,k) * deepconv_coef 729 ENDIF 712 730 ENDIF 713 714 !--Barriers715 cldfra_in(i) = MAX(0., MIN(totfra_in(i), cldfra_in(i)))716 qvc_in(i) = MAX(0., MIN(qtot_in(i), qvc_in(i)))717 qice_in(i) = MAX(0., MIN(qtot_in(i) - qvc_in(i), qice_in(i)))718 731 719 732 !--Calculate the shear value (input for condensation and ice supersat) … … 1132 1145 IF ( ok_plane_contrail ) THEN 1133 1146 !--Contrails fraction is left unchanged, but contrails water has changed 1134 !--We alse compute the ice content that will be seen by radiation (q ice_lincont/circont)1147 !--We alse compute the ice content that will be seen by radiation (qradice_lincont/circont) 1135 1148 IF ( ok_precip_lincontrails ) THEN 1136 1149 DO i = 1, klon 1137 1150 IF ( zoliqi(i) .GT. 0. ) THEN 1138 q ice_lincont(i,k) = zradocond(i) * qlincont(i)1151 qradice_lincont(i,k) = zradocond(i) * qlincont(i) 1139 1152 qlincont(i) = zqs(i) * lincontfra(i) + zoliqi(i) * qlincont(i) 1140 1153 ELSE 1141 q ice_lincont(i,k) = 0.1154 qradice_lincont(i,k) = 0. 1142 1155 lincontfra(i) = 0. 1143 1156 qlincont(i) = 0. … … 1154 1167 zradocond(i) = zradocond(i) + qice_cont 1155 1168 zradoice(i) = zradoice(i) + qice_cont 1156 q ice_lincont(i,k) = qice_cont1169 qradice_lincont(i,k) = qice_cont 1157 1170 ENDDO 1158 1171 ENDIF … … 1160 1173 DO i = 1, klon 1161 1174 IF ( zoliqi(i) .GT. 0. ) THEN 1162 q ice_circont(i,k) = zradocond(i) * qcircont(i)1175 qradice_circont(i,k) = zradocond(i) * qcircont(i) 1163 1176 qcircont(i) = zqs(i) * circontfra(i) + zoliqi(i) * qcircont(i) 1164 1177 ELSE 1165 q ice_circont(i,k) = 0.1178 qradice_circont(i,k) = 0. 1166 1179 circontfra(i) = 0. 1167 1180 qcircont(i) = 0. … … 1261 1274 CALL calc_qsat_ecmwf(klon,zt,qzero,pplay(:,k),RTT,1,.false.,qsatl(:,k),zdqs) 1262 1275 CALL calc_qsat_ecmwf(klon,zt,qzero,pplay(:,k),RTT,2,.false.,qsati(:,k),zdqs) 1263 1276 1264 1277 !--AB Write diagnostics and tracers for ice supersaturation 1265 1278 IF ( ok_plane_contrail ) THEN 1279 DO i = 1, klon 1280 IF ( zoliq(i) .LE. 0. ) THEN 1281 lincontfra(i) = 0. 1282 circontfra(i) = 0. 1283 qlincont(i) = 0. 1284 qcircont(i) = 0. 1285 ENDIF 1286 ENDDO 1266 1287 cfl_seri(:,k) = lincontfra(:) 1267 1288 cfc_seri(:,k) = circontfra(:) 1268 1289 qtl_seri(:,k) = qlincont(:) 1269 1290 qtc_seri(:,k) = qcircont(:) 1291 qice_lincont(:,k) = qlincont(:) - zqs(:) * lincontfra(:) 1292 qice_circont(:,k) = qcircont(:) - zqs(:) * circontfra(:) 1270 1293 ENDIF 1271 1294 … … 1293 1316 ENDIF 1294 1317 1318 !--Deep convection clouds properties are not advected 1319 IF ( ptconv(i,k) .AND. pt_pron_clds(i) .AND. ok_nodeep_lscp ) THEN 1320 cf_seri(i,k) = MAX(0., cf_seri(i,k) - cfcon(i,k)) 1321 qvc_seri(i,k) = MAX(0., qvc_seri(i,k) - qvcon_old(i,k) * cfcon(i,k)) 1322 zoliq(i) = MAX(0., zoliq(i) - qccon_old(i,k) * cfcon(i,k)) 1323 zoliqi(i) = MAX(0., zoliqi(i) - qccon_old(i,k) * cfcon(i,k)) 1324 ENDIF 1295 1325 !--Deep convection clouds properties are removed from radiative properties 1296 1326 !--outputed from lscp (NB. rneb and radocond are only used for the radiative -
LMDZ6/branches/contrails/libf/phylmd/lmdz_lscp_condensation.f90
r5643 r5684 255 255 ! 256 256 ! for dissipation 257 REAL, DIMENSION(klon) :: temp_diss, qsati_diss 258 REAL :: pdf_shape , qiceincld_min257 REAL, DIMENSION(klon) :: temp_diss, qsati_diss, qiceincld_min 258 REAL :: pdf_shape 259 259 ! 260 260 ! for condensation … … 292 292 temp_diss(:) = temp(:) + cooling_rate_ice_thresh * dtime 293 293 CALL calc_qsat_ecmwf(klon, temp_diss, qzero, pplay, RTT, 2, .FALSE., qsati_diss, dqsat_tmp) 294 !--Additionally to a minimum in cloud water vapor, we impose a minimum 295 !--on the in-cloud ice water content. It is calculated following 296 !--Marti and Mauersberger (1993), see also Schiller et al. (2008) 297 qiceincld_min(:) = qsati_diss(:) - qsat(:) 294 298 295 299 ! … … 475 479 lincontfra(i) = lincontfra(i) * mixed_fraction 476 480 circontfra(i) = circontfra(i) * mixed_fraction 477 qlincont(i) = qlincont(i) * mixed_fraction478 qcircont(i) = qcircont(i) * mixed_fraction479 481 ENDIF 480 482 mixed_fraction = qlincont(i) + qcircont(i) 481 483 IF ( mixed_fraction .GT. qcld(i) ) THEN 482 484 mixed_fraction = qcld(i) / mixed_fraction 483 lincontfra(i) = lincontfra(i) * mixed_fraction 484 circontfra(i) = circontfra(i) * mixed_fraction 485 qlincont(i) = qlincont(i) * mixed_fraction 486 qcircont(i) = qcircont(i) * mixed_fraction 485 qlincont(i) = qlincont(i) * mixed_fraction 486 qcircont(i) = qcircont(i) * mixed_fraction 487 487 ENDIF 488 489 488 490 489 dcfl_ini(i) = 0. … … 519 518 !--If there is a linear contrail 520 519 IF ( lincontfra(i) .GT. eps ) THEN 521 522 520 !--The contrail is always adjusted to saturation 523 521 qiceincld = ( qlincont(i) / lincontfra(i) - qsat(i) ) 524 522 !--If the ice water content is too low, the cloud is purely sublimated 525 IF ( qiceincld .LT. qiceincld_min ) THEN523 IF ( qiceincld .LT. qiceincld_min(i) ) THEN 526 524 dcfl_sub(i) = - lincontfra(i) 527 525 dqil_sub(i) = - qiceincld * lincontfra(i) … … 532 530 qclr(i) = qclr(i) - dqtl_sub(i) 533 531 ENDIF ! qiceincld .LT. eps 534 535 532 !--We remove contrails from the main class 536 533 cldfra(i) = MAX(0., cldfra(i) - lincontfra(i)) … … 541 538 !--If there is a contrail cirrus 542 539 IF ( circontfra(i) .GT. eps ) THEN 543 544 540 !--The contrail is always adjusted to saturation 545 541 qiceincld = ( qcircont(i) / circontfra(i) - qsat(i) ) 546 542 !--If the ice water content is too low, the cloud is purely sublimated 547 IF ( qiceincld .LT. qiceincld_min ) THEN543 IF ( qiceincld .LT. qiceincld_min(i) ) THEN 548 544 dcfc_sub(i) = - circontfra(i) 549 545 dqic_sub(i) = - qiceincld * circontfra(i) … … 554 550 qclr(i) = qclr(i) - dqtc_sub(i) 555 551 ENDIF ! qiceincld .LT. eps 556 557 552 !--We remove contrails from the main class 558 553 cldfra(i) = MAX(0., cldfra(i) - circontfra(i)) … … 601 596 ELSE 602 597 !--If the cloud is initially subsaturated 603 !!--Exact explicit integration (qvc exact, qice explicit)604 !!--Same but depo_coef_cirrus = 1605 !tauinv_depsub = qiceincld**(1./3.) * kappa_depsub606 !qvapincld_new = qsat(i) + ( qvapincld - qsat(i) ) * EXP( - dtime * tauinv_depsub )607 598 !--Exact explicit integration (qice exact, qvc explicit) 608 599 !--The barrier is set so that the resulting vapor in cloud … … 634 625 !-- DISSIPATION OF THE CLOUD -- 635 626 !------------------------------------ 636 !--Additionally to a minimum in cloud water vapor, we impose a minimum637 !--on the in-cloud ice water content. It is calculated following638 !--Marti and Mauersberger (1993), see also Schiller et al. (2008)639 qiceincld_min = qsati_diss(i) - qsat(i)640 627 641 628 !--If the dissipation process must be activated 642 IF ( ( qvapincld_new + qiceincld_min) .GT. qvapincld ) THEN629 IF ( ( MIN(qsat(i), qvapincld_new) + qiceincld_min(i) ) .GT. qvapincld ) THEN 643 630 !--Gamma distribution starting at qvapincld 644 631 pdf_shape = nu_iwc_pdf_lscp / qiceincld 645 pdf_y = pdf_shape * ( qvapincld_new + qiceincld_min- qvapincld )632 pdf_y = pdf_shape * ( MIN(qsat(i), qvapincld_new) + qiceincld_min(i) - qvapincld ) 646 633 pdf_e1 = GAMMAINC ( nu_iwc_pdf_lscp , pdf_y ) 647 634 pdf_e2 = GAMMAINC ( nu_iwc_pdf_lscp + 1. , pdf_y ) … … 673 660 clrfra(i) = MIN(totfra_in(i), clrfra(i) - dcf_sub(i)) 674 661 qclr(i) = qclr(i) - dqvc_sub(i) - dqi_sub(i) 675 ENDIF ! qvapincld_new.GT. qvapincld662 ENDIF ! ( MIN(qsat(i), qvapincld_new) + qiceincld_min(i) ) .GT. qvapincld 676 663 677 664 … … 716 703 !-- tuning coef * (clear sky area**0.25) * (function of temperature) 717 704 pdf_e1 = beta_pdf_lscp * ( clrfra(i) * cell_area(i) )**0.25 & 718 * MAX( temp(i) - temp_thresh_pdf_lscp, 0. )705 * MAX( MAX(205., MIN(250., temp(i))) - temp_thresh_pdf_lscp, 0. ) 719 706 IF ( rhl_clr .GT. 50. ) THEN 720 707 pdf_std = ( pdf_e1 - std100_pdf_lscp ) * ( 100. - rhl_clr ) / 50. + std100_pdf_lscp … … 722 709 pdf_std = pdf_e1 * rhl_clr / 50. 723 710 ENDIF 724 pdf_e3 = k0_pdf_lscp + kappa_pdf_lscp * MAX( temp_nowater - temp(i), 0. ) 711 pdf_e3 = k0_pdf_lscp + kappa_pdf_lscp * & 712 MAX( temp_nowater - MAX(205., MIN(250., temp(i))), 0. ) 725 713 pdf_alpha(i) = EXP( rhl_clr / 100. ) * pdf_e3 726 714 pdf_alpha(i) = MIN(10., pdf_alpha(i)) !--Avoid overflows … … 830 818 !-- clouds_perim = P * N_cld_mix 831 819 !-- 832 !--We assume that the ratio between b and a is a function of833 !--cldfra such that it is 1 for cldfra = 1 and it is low for little cldfra, because834 !--if cldfra is low the clouds are linear, and if cldfra is high, the clouds835 !--are spherical.836 !-- b / a = bovera = MAX(0.1, cldfra)837 !bovera = MAX(0.1, cldfra(i))838 820 bovera = aspect_ratio_cirrus 839 821 !--P / a is a function of b / a only, that we can calculate … … 994 976 !-- clouds_perim = P * N_cld_mix 995 977 !-- 996 !--We assume that the ratio between b and a is a function of997 !--cldfra such that it is 1 for cldfra = 1 and it is low for little cldfra, because998 !--if cldfra is low the clouds are linear, and if cldfra is high, the clouds999 !--are spherical.1000 !-- b / a = bovera = MAX(0.1, cldfra)1001 978 bovera = aspect_ratio_lincontrails 1002 979 !--P / a is a function of b / a only, that we can calculate … … 1078 1055 dcfc_mix(i) = dcfc_mix(i) + clrfra_mix 1079 1056 dqtc_mix(i) = dqtc_mix(i) + clrfra_mix * qclr(i) / clrfra(i) 1080 dqic_mix(i) = dqic_mix(i) + clrfra_mix * sigma_mix & 1081 * ( qclr(i) / clrfra(i) - qsat(i) ) 1057 dqic_mix(i) = dqic_mix(i) + clrfra_mix * ( qclr(i) / clrfra(i) - qsat(i) ) 1082 1058 ELSE 1083 1059 !--We then calculate the clear sky part where the humidity is lower than … … 1145 1121 1146 1122 ENDIF 1147 ENDIF ! ( lincontfra(i) .GT. eps ) .AND. ( clrfra(i) .GT. 1123 ENDIF ! ( lincontfra(i) .GT. eps ) .AND. ( clrfra(i) .GT. eps ) 1148 1124 1149 1125 IF ( ( circontfra(i) .GT. eps ) .AND. ( clrfra(i) .GT. eps ) ) THEN … … 1167 1143 !-- clouds_perim = P * N_cld_mix 1168 1144 !-- 1169 !--We assume that the ratio between b and a is a function of1170 !--cldfra such that it is 1 for cldfra = 1 and it is low for little cldfra, because1171 !--if cldfra is low the clouds are linear, and if cldfra is high, the clouds1172 !--are spherical.1173 !-- b / a = bovera = MAX(0.1, cldfra)1174 1145 bovera = aspect_ratio_cirrus 1175 1146 !--P / a is a function of b / a only, that we can calculate … … 1246 1217 dcfc_mix(i) = dcfc_mix(i) + clrfra_mix 1247 1218 dqtc_mix(i) = dqtc_mix(i) + clrfra_mix * qclr(i) / clrfra(i) 1248 dqic_mix(i) = dqic_mix(i) + clrfra_mix * sigma_mix & 1249 * ( qclr(i) / clrfra(i) - qsat(i) ) 1219 dqic_mix(i) = dqic_mix(i) + clrfra_mix * ( qclr(i) / clrfra(i) - qsat(i) ) 1250 1220 ELSE 1251 1221 !--We then calculate the clear sky part where the humidity is lower than … … 1301 1271 1302 1272 ENDIF 1303 ENDIF ! ( circontfra(i) .GT. eps ) .AND. ( clrfra(i) .GT. eps ) 1304 1305 !--We balance the mixing tendencies between the different cloud classes 1306 mixed_fraction = dcf_mix(i) + dcfl_mix(i) + dcfc_mix(i) 1307 IF ( mixed_fraction .GT. clrfra(i) ) THEN 1308 mixed_fraction = clrfra(i) / mixed_fraction 1309 dcf_mix(i) = dcf_mix(i) * mixed_fraction 1310 dqvc_mix(i) = dqvc_mix(i) * mixed_fraction 1311 dqi_mix(i) = dqi_mix(i) * mixed_fraction 1312 dcfl_mix(i) = dcfl_mix(i) * mixed_fraction 1313 dqtl_mix(i) = dqtl_mix(i) * mixed_fraction 1314 dqil_mix(i) = dqil_mix(i) * mixed_fraction 1315 dcfc_mix(i) = dcfc_mix(i) * mixed_fraction 1316 dqtc_mix(i) = dqtc_mix(i) * mixed_fraction 1317 dqic_mix(i) = dqic_mix(i) * mixed_fraction 1318 ENDIF 1319 1320 IF ( lincontfra(i) .GT. eps ) THEN 1321 !--Add tendencies 1322 lincontfra(i) = lincontfra(i) + dcfl_mix(i) 1323 qlincont(i) = qlincont(i) + dqtl_mix(i) 1324 clrfra(i) = clrfra(i) - dcfl_mix(i) 1325 qclr(i) = qclr(i) - dqtl_mix(i) 1326 ENDIF 1327 1328 IF ( circontfra(i) .GT. eps ) THEN 1329 !--Add tendencies 1330 circontfra(i) = circontfra(i) + dcfc_mix(i) 1331 qcircont(i) = qcircont(i) + dqtc_mix(i) 1332 clrfra(i) = clrfra(i) - dcfc_mix(i) 1333 qclr(i) = qclr(i) - dqtc_mix(i) 1273 ENDIF ! ( circontfra(i) .GT. eps ) .AND. ( clrfra(i) .GT. eps ) 1274 1275 IF ( ( lincontfra(i) + circontfra(i) ) .GT. eps ) THEN 1276 !--We balance the mixing tendencies between the different cloud classes 1277 mixed_fraction = dcf_mix(i) + dcfl_mix(i) + dcfc_mix(i) 1278 IF ( mixed_fraction .GT. clrfra(i) ) THEN 1279 mixed_fraction = clrfra(i) / mixed_fraction 1280 dcf_mix(i) = dcf_mix(i) * mixed_fraction 1281 dqvc_mix(i) = dqvc_mix(i) * mixed_fraction 1282 dqi_mix(i) = dqi_mix(i) * mixed_fraction 1283 dcfl_mix(i) = dcfl_mix(i) * mixed_fraction 1284 dqtl_mix(i) = dqtl_mix(i) * mixed_fraction 1285 dqil_mix(i) = dqil_mix(i) * mixed_fraction 1286 dcfc_mix(i) = dcfc_mix(i) * mixed_fraction 1287 dqtc_mix(i) = dqtc_mix(i) * mixed_fraction 1288 dqic_mix(i) = dqic_mix(i) * mixed_fraction 1289 ENDIF 1290 1291 IF ( lincontfra(i) .GT. eps ) THEN 1292 !--Add tendencies 1293 lincontfra(i) = lincontfra(i) + dcfl_mix(i) 1294 qlincont(i) = qlincont(i) + dqtl_mix(i) 1295 clrfra(i) = clrfra(i) - dcfl_mix(i) 1296 qclr(i) = qclr(i) - dqtl_mix(i) 1297 ENDIF 1298 1299 IF ( circontfra(i) .GT. eps ) THEN 1300 !--Add tendencies 1301 circontfra(i) = circontfra(i) + dcfc_mix(i) 1302 qcircont(i) = qcircont(i) + dqtc_mix(i) 1303 clrfra(i) = clrfra(i) - dcfc_mix(i) 1304 qclr(i) = qclr(i) - dqtc_mix(i) 1305 ENDIF 1334 1306 ENDIF 1335 1307 … … 1452 1424 ENDIF 1453 1425 1426 1454 1427 !------------------------------------------- 1455 1428 !-- FINAL BARRIERS AND OUTPUTS -- … … 1509 1482 1510 1483 !--Convert existing contrail fraction into "natural" cirrus cloud fraction 1511 IF ( ( cl dfra(i) .GE. ( totfra_in(i) - eps )) .OR. ( lincontfra(i) .LE. eps ) ) THEN1484 IF ( ( clrfra(i) .LE. eps ) .OR. ( lincontfra(i) .LE. eps ) ) THEN 1512 1485 contrails_conversion_factor = 1. 1513 1486 ELSE … … 1518 1491 !--cannot exist. The exponent is set so that this only happens for 1519 1492 !--very cloudy gridboxes 1520 * ( 1. - cldfra(i) / totfra_in(i) )**0.1 )1493 * ( clrfra(i) / totfra_in(i) )**0.1 ) 1521 1494 ENDIF 1522 1495 dcfl_cir(i) = - contrails_conversion_factor * lincontfra(i) 1523 1496 dqtl_cir(i) = - contrails_conversion_factor * qlincont(i) 1524 1497 1525 dcfl_ini(i) = MIN( MIN(dcfl_ini(i), issrfra(i)), totfra_in(i) - cldfra(i))1526 dqtl_ini(i) = MIN( MIN(dqtl_ini(i), qissr(i)), qtot_in(i) - qcld(i))1498 dcfl_ini(i) = MIN(dcfl_ini(i), issrfra(i)) 1499 dqtl_ini(i) = MIN(dqtl_ini(i), qissr(i)) 1527 1500 1528 1501 !--Add tendencies 1502 cldfra(i) = cldfra(i) + dcfl_ini(i) 1503 qcld(i) = qcld(i) + dqtl_ini(i) 1504 qvc(i) = qvc(i) + dcfl_ini(i) * qsat(i) 1529 1505 issrfra(i) = issrfra(i) - dcfl_ini(i) 1530 1506 qissr(i) = qissr(i) - dqtl_ini(i) … … 1532 1508 qclr(i) = qclr(i) - dqtl_ini(i) 1533 1509 1534 cldfra(i) = cldfra(i) + dcfl_ini(i)1535 qcld(i) = qcld(i) + dqtl_ini(i)1536 qvc(i) = qvc(i) + dcfl_ini(i) * qsat(i)1537 1510 lincontfra(i) = lincontfra(i) + dcfl_cir(i) + dcfl_ini(i) 1538 1511 qlincont(i) = qlincont(i) + dqtl_cir(i) + dqtl_ini(i) 1539 1512 circontfra(i) = circontfra(i) - dcfl_cir(i) 1540 1513 qcircont(i) = qcircont(i) - dqtl_cir(i) 1514 1515 1516 !------------------------------------------- 1517 !-- FINAL BARRIERS AND OUTPUTS -- 1518 !------------------------------------------- 1519 1520 IF ( (lincontfra(i) .LT. eps) .OR. (qlincont(i) .LT. (qsat(i) * lincontfra(i))) ) THEN 1521 cldfra(i) = cldfra(i) - lincontfra(i) 1522 qcld(i) = qcld(i) - qlincont(i) 1523 qvc(i) = qvc(i) - qsat(i) * lincontfra(i) 1524 lincontfra(i) = 0. 1525 qlincont(i) = 0. 1526 ENDIF 1527 1528 IF ( (circontfra(i) .LT. eps) .OR. (qcircont(i) .LT. (qsat(i) * circontfra(i))) ) THEN 1529 cldfra(i) = cldfra(i) - circontfra(i) 1530 qcld(i) = qcld(i) - qcircont(i) 1531 qvc(i) = qvc(i) - qsat(i) * circontfra(i) 1532 circontfra(i) = 0. 1533 qcircont(i) = 0. 1534 ENDIF 1535 1536 IF ( cldfra(i) .LT. eps ) THEN 1537 !--If the cloud is too small, it is sublimated. 1538 cldfra(i) = 0. 1539 qcld(i) = 0. 1540 qvc(i) = 0. 1541 lincontfra(i) = 0. 1542 qlincont(i) = 0. 1543 circontfra(i) = 0. 1544 qcircont(i) = 0. 1545 qincld(i) = qsat(i) 1546 ELSE 1547 qincld(i) = qcld(i) / cldfra(i) 1548 ENDIF 1549 1550 cldfra(i) = MAX(cldfra(i), lincontfra(i) + circontfra(i)) 1551 qcld(i) = MAX(qcld(i), qlincont(i) + qcircont(i)) 1552 qvc(i) = MAX(qvc(i), qsat(i) * ( lincontfra(i) + circontfra(i) )) 1541 1553 1542 1554 !--Diagnostics … … 1559 1571 dqtc_mix(i) = dqtc_mix(i) / dtime 1560 1572 1561 !-------------------------------------------1562 !-- FINAL BARRIERS AND OUTPUTS --1563 !-------------------------------------------1564 1565 cldfra(i) = MIN(cldfra(i), totfra_in(i))1566 qcld(i) = MIN(qcld(i), qtot_in(i))1567 qvc(i) = MIN(qvc(i), qcld(i))1568 1569 IF ( cldfra(i) .LT. eps ) THEN1570 !--If the cloud is too small, it is sublimated.1571 cldfra(i) = 0.1572 qcld(i) = 0.1573 qvc(i) = 0.1574 lincontfra(i) = 0.1575 qlincont(i) = 0.1576 circontfra(i) = 0.1577 qcircont(i) = 0.1578 qincld(i) = qsat(i)1579 ELSE1580 qincld(i) = qcld(i) / cldfra(i)1581 ENDIF ! cldfra .LT. eps1582 1583 IF ( (lincontfra(i) .LT. eps) .OR. (qlincont(i) .LT. (qsat(i) * lincontfra(i))) ) THEN1584 lincontfra(i) = 0.1585 qlincont(i) = 0.1586 ENDIF1587 1588 IF ( (circontfra(i) .LT. eps) .OR. (qcircont(i) .LT. (qsat(i) * circontfra(i))) ) THEN1589 circontfra(i) = 0.1590 qcircont(i) = 0.1591 ENDIF1592 1593 1573 ENDIF ! keepgoing 1594 1574 ENDDO ! loop on klon -
LMDZ6/branches/contrails/libf/phylmd/phys_local_var_mod.F90
r5643 r5684 687 687 REAL, SAVE, ALLOCATABLE :: qice_lincont(:,:), qice_circont(:,:) 688 688 !$OMP THREADPRIVATE(qice_lincont, qice_circont) 689 REAL, SAVE, ALLOCATABLE :: qradice_lincont(:,:), qradice_circont(:,:) 690 !$OMP THREADPRIVATE(qradice_lincont, qradice_circont) 689 691 REAL, SAVE, ALLOCATABLE :: dcfl_cir(:,:), dqtl_cir(:,:) 690 692 !$OMP THREADPRIVATE(dcfl_cir, dqtl_cir) … … 1272 1274 ALLOCATE(potcontfraP(klon,klev), potcontfraNP(klon,klev)) 1273 1275 ALLOCATE(qice_lincont(klon,klev), qice_circont(klon,klev)) 1276 ALLOCATE(qradice_lincont(klon,klev), qradice_circont(klon,klev)) 1274 1277 ALLOCATE(dcfl_cir(klon,klev), dqtl_cir(klon,klev)) 1275 1278 ALLOCATE(dcfl_ini(klon,klev), dqil_ini(klon,klev), dqtl_ini(klon,klev)) … … 1694 1697 DEALLOCATE(d_q_avi, flight_dist, flight_h2o) 1695 1698 DEALLOCATE(Tcritcont, qcritcont, potcontfraP, potcontfraNP) 1696 DEALLOCATE(qice_lincont, qice_circont, dcfl_cir, dqtl_cir, dcfl_ini, dqil_ini) 1699 DEALLOCATE(qice_lincont, qice_circont, qradice_lincont, qradice_circont) 1700 DEALLOCATE(dcfl_cir, dqtl_cir, dcfl_ini, dqil_ini) 1697 1701 DEALLOCATE(dqtl_ini, dcfl_sub, dqil_sub, dqtl_sub, dcfl_mix, dqil_mix, dqtl_mix) 1698 1702 DEALLOCATE(dcfc_sub, dqic_sub, dqtc_sub, dcfc_mix, dqic_mix, dqtc_mix) -
LMDZ6/branches/contrails/libf/phylmd/physiq_mod.F90
r5643 r5684 334 334 !-- LSCP - aviation and contrails variables 335 335 cfl_seri, cfc_seri, qtl_seri, qtc_seri, d_cfl_dyn, d_cfc_dyn, d_qtl_dyn, d_qtc_dyn, & 336 d_q_avi, flight_dist, flight_h2o, qice_lincont, qice_circont, & 336 d_q_avi, flight_dist, flight_h2o, & 337 qice_lincont, qice_circont, qradice_lincont, qradice_circont, & 337 338 Tcritcont, qcritcont, potcontfraP, potcontfraNP, & 338 339 cldfra_nocont, cldtau_nocont, cldemi_nocont, cldh_nocont, & … … 1395 1396 IF (read_climoz>=1 .AND. create_etat0_limit .AND. grid_type==unstructured) & 1396 1397 CALL regr_horiz_time_climoz(read_climoz,ok_daily_climoz) 1397 CALL init_read_aviation_emissions1398 IF ( ok_plane_h2o .OR. ok_plane_contrail ) CALL init_read_aviation_emissions 1398 1399 1399 1400 print*, '=================================================' … … 3988 3989 dcf_sub, dcf_con, dcf_mix, dqi_adj, dqi_sub, dqi_con, dqi_mix, & 3989 3990 dqvc_adj, dqvc_sub, dqvc_con, dqvc_mix, qsatliq, qsatice, & 3990 cfl_seri, cfc_seri, qtl_seri, qtc_seri, flight_dist, flight_h2o, & 3991 qice_lincont, qice_circont, Tcritcont, qcritcont, potcontfraP, potcontfraNP, & 3991 cfl_seri, cfc_seri, qtl_seri, qtc_seri, qice_lincont, qice_circont, & 3992 flight_dist, flight_h2o, qradice_lincont, qradice_circont, & 3993 Tcritcont, qcritcont, potcontfraP, potcontfraNP, & 3992 3994 cloudth_sth,cloudth_senv,cloudth_sigmath,cloudth_sigmaenv, & 3993 3995 qraindiag, qsnowdiag, dqreva, dqssub, dqrauto, dqrcol, dqrmelt, & … … 4541 4543 zfice, dNovrN, ptconv, rnebcon, clwcon, & 4542 4544 !--AB contrails 4543 cfl_seri, cfc_seri, q ice_lincont, qice_circont, cldfra_nocont, &4545 cfl_seri, cfc_seri, qradice_lincont, qradice_circont, cldfra_nocont, & 4544 4546 cldtau_nocont, cldemi_nocont, conttau, contemi, cldh_nocont, contcov, & 4545 4547 fiwp_nocont, fiwc_nocont, ref_ice_nocont)
Note: See TracChangeset
for help on using the changeset viewer.