Ignore:
Timestamp:
Apr 13, 2025, 7:10:19 PM (8 weeks ago)
Author:
aborella
Message:
  • changed treatment of prognostic variables for prognostic clouds
  • adapted sedimentation and autoconversion for prognostic cirrus clouds
  • cloud mixing, ice sedimentation and ISSR diagnosis are now consistent with the water vapor PDF
  • simplified assumptions for ice crystals deposition / sublimation
  • first version of the coupling between prognostic cirrus clouds and deep convection
  • added persistent contrail cirrus clouds in radiative diagnostics
File:
1 edited

Legend:

Unmodified
Added
Removed
  • LMDZ6/branches/contrails/libf/phylmd/physiq_mod.F90

    r5602 r5609  
    328328       dqvc_adj, dqvc_sub, dqvc_con, dqvc_mix, qsatliq, qsatice, &
    329329       !-- LSCP - aviation and contrails variables
    330        cfa_seri, qta_seri, d_cfa_dyn, d_qta_dyn, &
    331        d_q_avi, flight_dist, flight_h2o, &
    332        qice_cont, Tcritcont, qcritcont, potcontfraP, potcontfraNP, &
     330       cfa_seri, pcf_seri, qva_seri, qia_seri, d_cfa_dyn, d_pcf_dyn, d_qva_dyn, d_qia_dyn, &
     331       d_q_avi, flight_dist, flight_h2o, qice_perscont, &
     332       Tcritcont, qcritcont, potcontfraP, potcontfraNP, &
    333333       cldfra_nocont, cldtau_nocont, cldemi_nocont, cldh_nocont, &
    334334       conttau, contemi, contcov, fiwp_nocont, fiwc_nocont, ref_ice_nocont, &
     
    518518    !
    519519    ! indices de traceurs eau vapeur, liquide, glace, fraction nuageuse LS (optional), blowing snow (optional)
    520     INTEGER,SAVE :: ivap, iliq, isol, ibs, icf, iqvc, icfa, iqta
    521 !$OMP THREADPRIVATE(ivap, iliq, isol, ibs, icf, iqvc, icfa, iqta)
     520    INTEGER,SAVE :: ivap, iliq, isol, ibs, icf, iqvc, icfa, ipcf, iqia, iqva
     521!$OMP THREADPRIVATE(ivap, iliq, isol, ibs, icf, iqvc, icfa, ipcf, iqia, iqva)
    522522    !
    523523    !
     
    13631363       isol = strIdx(tracers(:)%name, addPhase('H2O', 's'))
    13641364       ibs  = strIdx(tracers(:)%name, addPhase('H2O', 'b'))
    1365        icf  = strIdx(tracers(:)%name, addPhase('H2O', 'f'))
    1366        iqvc = strIdx(tracers(:)%name, addPhase('H2O', 'c'))
    1367        icfa = strIdx(tracers(:)%name, addPhase('H2O', 'a'))
    1368        iqta = strIdx(tracers(:)%name, addPhase('H2O', 'q'))
     1365       icf  = strIdx(tracers(:)%name, 'CLDFRA')
     1366       iqvc = strIdx(tracers(:)%name, 'CLDVAP_g')
     1367       icfa = strIdx(tracers(:)%name, 'CONTFRA')
     1368       ipcf = strIdx(tracers(:)%name, 'PERSCONTFRA')
     1369       iqva = strIdx(tracers(:)%name, 'CONTWATER_g')
     1370       iqia = strIdx(tracers(:)%name, 'CONTWATER_s')
    13691371!       CALL init_etat0_limit_unstruct
    13701372!       IF (.NOT. create_etat0_limit) CALL init_limit_read(days_elapsed)
     
    14141416       ENDIF
    14151417
    1416        IF (ok_ice_supersat.AND.(nqo.LT.5)) THEN
    1417           WRITE (lunout, *) ' ok_ice_supersat=y requires 5 H2O tracers ', &
    1418                '(H2O_g, H2O_l, H2O_s, H2O_f, H2O_c) but nqo=', nqo, '. Might as well stop here.'
     1418       IF (ok_ice_supersat.AND.((icf.EQ.0).OR.(iqvc.EQ.0))) THEN
     1419          WRITE (lunout, *) ' ok_ice_supersat=y requires 5 tracers ', &
     1420               '(H2O_g, H2O_l, H2O_s, CLDFRA, CLDVAP_g) but not all are ', &
     1421               'provided. Might as well stop here.'
    14191422          abort_message='see above'
    14201423          CALL abort_physic(modname,abort_message,1)
     
    14331436       ENDIF
    14341437
    1435        IF (ok_plane_contrail.AND.(nqo.LT.6)) THEN
    1436           WRITE (lunout, *) ' ok_plane_contrail=y requires 6 H2O tracers ', &
    1437               '(H2O_g, H2O_l, H2O_s, H2O_f, H2O_c, H2O_a) but nqo=', nqo, '. Might as well stop here.'
     1438       IF (ok_plane_contrail.AND.((icfa.EQ.0).OR.(iqva.EQ.0).OR.(iqia.EQ.0).OR.(ipcf.EQ.0))) THEN
     1439          WRITE (lunout, *) ' ok_plane_contrail=y requires 8 tracers ', &
     1440              '(H2O_g, H2O_l, H2O_s, CLDFRA, CLDVAP_g, CONTFRA, PERSCONTFRA, CONTWATER_s) ', &
     1441              'but not all are provided. Might as well stop here.'
    14381442          abort_message='see above'
    14391443          CALL abort_physic(modname,abort_message,1)
     
    14461450       ENDIF
    14471451
    1448         IF (ok_bs) THEN
    1449          IF ((ok_ice_supersat.AND.nqo .LT.6).OR.(.NOT.ok_ice_supersat.AND.nqo.LT.4)) THEN
    1450              WRITE (lunout, *) 'activation of blowing snow needs a specific H2O tracer', &
    1451                                'but nqo=', nqo
    1452              abort_message='see above'
    1453              CALL abort_physic(modname,abort_message, 1)
    1454          ENDIF
    1455         ENDIF
     1452       IF (ok_bs.AND.(nqo.LT.4)) THEN
     1453          WRITE (lunout, *) 'activation of blowing snow needs a specific H2O tracer', &
     1454                            'but nqo=', nqo
     1455          abort_message='see above'
     1456          CALL abort_physic(modname,abort_message, 1)
     1457       ENDIF
    14561458
    14571459       Ncvpaseq1 = 0
     
    16311633       rnebcon(:,:) = 0.0
    16321634       clwcon(:,:) = 0.0
     1635       !--AB for prognostic clouds
     1636       cwcon0(:,:) = 0.0
     1637       cwcon(:,:) = 0.0
    16331638
    16341639       !
     
    24542459          q_seri(i,k)  = qx(i,k,ivap)
    24552460          ql_seri(i,k) = qx(i,k,iliq)
     2461          qs_seri(i,k) = 0.
    24562462          qbs_seri(i,k)= 0.
    24572463          cf_seri(i,k) = 0.
    24582464          qvc_seri(i,k)= 0.
    24592465          cfa_seri(i,k)= 0.
    2460           qta_seri(i,k)= 0.
     2466          pcf_seri(i,k)= 0.
     2467          qva_seri(i,k)= 0.
     2468          qia_seri(i,k)= 0.
    24612469          !CR: ATTENTION, on rajoute la variable glace
    2462           IF (nqo.EQ.2) THEN             !--vapour and liquid only
    2463              qs_seri(i,k) = 0.
    2464           ELSE IF (nqo.EQ.3) THEN        !--vapour, liquid and ice
     2470          IF (nqo .GE. 3) THEN        !--vapour, liquid and ice
    24652471             qs_seri(i,k) = qx(i,k,isol)
    2466           ELSE IF (nqo.GE.4) THEN        !--vapour, liquid, ice, blowing snow, cloud fraction and cloudy water vapor to total water vapor ratio
    2467              qs_seri(i,k) = qx(i,k,isol)
    2468              IF (ok_ice_supersat) THEN
    2469                cf_seri(i,k) = qx(i,k,icf)
    2470                qvc_seri(i,k) = qx(i,k,iqvc)
    2471              ENDIF
    2472              IF (ok_plane_contrail) THEN
    2473                cfa_seri(i,k) = qx(i,k,icfa)
    2474                qta_seri(i,k) = qx(i,k,iqta)
    2475              ENDIF
    2476              IF (ok_bs) THEN
    2477                qbs_seri(i,k)= qx(i,k,ibs)
    2478              ENDIF
     2472          ENDIF
     2473          IF (ok_bs) THEN
     2474             qbs_seri(i,k) = qx(i,k,ibs)
     2475          ENDIF
     2476          IF (ok_ice_supersat) THEN
     2477             cf_seri(i,k)  = qx(i,k,icf)
     2478             qvc_seri(i,k) = qx(i,k,iqvc)
     2479          ENDIF
     2480          IF (ok_plane_contrail) THEN
     2481             cfa_seri(i,k) = qx(i,k,icfa)
     2482             pcf_seri(i,k) = qx(i,k,ipcf)
     2483             qva_seri(i,k) = qx(i,k,iqva)
     2484             qia_seri(i,k) = qx(i,k,iqia)
    24792485          ENDIF
    24802486       ENDDO
     
    25522558       d_qvc_dyn(:,:)= (qvc_seri(:,:)-qvc_ancien(:,:))/phys_tstep
    25532559       d_cfa_dyn(:,:)= (cfa_seri(:,:)-cfa_ancien(:,:))/phys_tstep
    2554        d_qta_dyn(:,:)= (qta_seri(:,:)-qta_ancien(:,:))/phys_tstep
     2560       d_pcf_dyn(:,:)= (pcf_seri(:,:)-pcf_ancien(:,:))/phys_tstep
     2561       d_qva_dyn(:,:)= (qva_seri(:,:)-qva_ancien(:,:))/phys_tstep
     2562       d_qia_dyn(:,:)= (qia_seri(:,:)-qia_ancien(:,:))/phys_tstep
    25552563       CALL water_int(klon,klev,q_seri,zmasse,zx_tmp_fi2d)
    25562564       d_q_dyn2d(:)=(zx_tmp_fi2d(:)-prw_ancien(:))/phys_tstep
     
    25752583       d_qvc_dyn(:,:)= 0.0
    25762584       d_cfa_dyn(:,:)= 0.0
    2577        d_qta_dyn(:,:)= 0.0
     2585       d_pcf_dyn(:,:)= 0.0
     2586       d_qva_dyn(:,:)= 0.0
     2587       d_qia_dyn(:,:)= 0.0
    25782588       d_q_dyn2d(:)  = 0.0
    25792589       d_ql_dyn2d(:) = 0.0
     
    27002710            qi_seri_lscp(i,k) = qs_seri(i,k) / ( q_seri(i,k) + ql_seri(i,k) + qs_seri(i,k) )
    27012711            qvc_seri(i,k) = qvc_seri(i,k) / ( q_seri(i,k) + ql_seri(i,k) + qs_seri(i,k) )
    2702             qta_seri(i,k) = qta_seri(i,k) / ( q_seri(i,k) + ql_seri(i,k) + qs_seri(i,k) )
     2712            qva_seri(i,k) = qva_seri(i,k) / ( q_seri(i,k) + ql_seri(i,k) + qs_seri(i,k) )
     2713            qia_seri(i,k) = qia_seri(i,k) / ( q_seri(i,k) + ql_seri(i,k) + qs_seri(i,k) )
    27032714          ELSE
    27042715            ql_seri_lscp(i,k) = 0.
    27052716            qi_seri_lscp(i,k) = 0.
    27062717            qvc_seri(i,k) = 0.
    2707             qta_seri(i,k) = 0.
     2718            qva_seri(i,k) = 0.
     2719            qia_seri(i,k) = 0.
    27082720          ENDIF
    27092721        ENDDO
     
    39273939        DO i = 1, klon
    39283940          qvc_seri(i,k) = qvc_seri(i,k) * q_seri(i,k)
     3941          cwcon0(i,k) = zqsat(i,k)
    39293942        ENDDO
    39303943      ENDDO
     
    39333946      DO k = 1, klev
    39343947        DO i = 1, klon
    3935           qta_seri(i,k) = qta_seri(i,k) * q_seri(i,k)
     3948          qva_seri(i,k) = qva_seri(i,k) * q_seri(i,k)
     3949          qia_seri(i,k) = qia_seri(i,k) * q_seri(i,k)
    39363950        ENDDO
    39373951      ENDDO
     
    39453959
    39463960    CALL lscp(klon,klev,phys_tstep,missing_val,paprs,pplay,omega, &
    3947          t_seri, q_seri, ql_seri_lscp, qi_seri_lscp, &
    3948          ptconv, rnebcon0, clwcon0, ratqs, sigma_qtherm, &
     3961         t_seri, q_seri, ql_seri_lscp, qi_seri_lscp, ratqs, sigma_qtherm, &
     3962         ptconv, rnebcon, cwcon, clwcon, rnebcon0, cwcon0, clwcon0, &
    39493963         d_t_lsc, d_q_lsc, d_ql_lsc, d_qi_lsc, rneb, rneblsvol, &
    39503964         pfraclr, pfracld, cldfraliq, sigma2_icefracturb, mean_icefracturb,  &
     
    39603974         dcf_sub, dcf_con, dcf_mix, dqi_adj, dqi_sub, dqi_con, dqi_mix, &
    39613975         dqvc_adj, dqvc_sub, dqvc_con, dqvc_mix, qsatliq, qsatice, &
    3962          cfa_seri, qta_seri, flight_dist, flight_h2o, &
    3963          qice_cont, Tcritcont, qcritcont, potcontfraP, potcontfraNP, &
     3976         cfa_seri, pcf_seri, qva_seri, qia_seri, flight_dist, flight_h2o, &
     3977         qice_perscont, Tcritcont, qcritcont, potcontfraP, potcontfraNP, &
    39643978         cloudth_sth,cloudth_senv,cloudth_sigmath,cloudth_sigmaenv, &
    39653979         qraindiag, qsnowdiag, dqreva, dqssub, dqrauto, dqrcol, dqrmelt, &
     
    39673981         dqised, dcfsed, dqvcsed)
    39683982
     3983    IF (ok_ice_supersat) cwcon(:,:) = cwcon0(:,:)
    39693984
    39703985    ELSE
     
    45134528               zfice, dNovrN, ptconv, rnebcon, clwcon, &
    45144529               !--AB contrails
    4515                cfa_seri, qice_cont, cldfra_nocont, cldtau_nocont, cldemi_nocont, &
    4516                conttau, contemi, cldh_nocont, contcov, &
     4530               cfa_seri, pcf_seri, qia_seri, qice_perscont, cldfra_nocont, &
     4531               cldtau_nocont, cldemi_nocont, conttau, contemi, cldh_nocont, contcov, &
    45174532               fiwp_nocont, fiwc_nocont, ref_ice_nocont)
    45184533
     
    57095724             d_qx(i,k,isol) = ( qs_seri(i,k) - qx(i,k,isol) ) / phys_tstep
    57105725          ENDIF
    5711           !--ice_supersat: nqo=5, we add cloud fraction and cloudy water vapor to total water vapor ratio
    5712           IF (nqo.ge.5 .and. ok_ice_supersat) THEN
     5726          IF (ok_bs) THEN
     5727             d_qx(i,k,ibs) = ( qbs_seri(i,k) - qx(i,k,ibs) ) / phys_tstep
     5728          ENDIF
     5729          IF (ok_ice_supersat) THEN
    57135730             d_qx(i,k,icf) = ( cf_seri(i,k) - qx(i,k,icf) ) / phys_tstep
    57145731             d_qx(i,k,iqvc) = ( qvc_seri(i,k) - qx(i,k,iqvc) ) / phys_tstep
    5715              IF (nqo.ge.6 .and. ok_plane_contrail) THEN
    5716                d_qx(i,k,icfa) = ( cfa_seri(i,k) - qx(i,k,icfa) ) / phys_tstep
    5717                d_qx(i,k,iqta) = ( qta_seri(i,k) - qx(i,k,iqta) ) / phys_tstep
    5718              ENDIF
    57195732          ENDIF
    5720 
    5721            IF (nqo.ge.4 .and. ok_bs) THEN
    5722              d_qx(i,k,ibs) = ( qbs_seri(i,k) - qx(i,k,ibs) ) / phys_tstep
     5733          IF (ok_plane_contrail) THEN
     5734             d_qx(i,k,icfa) = ( cfa_seri(i,k) - qx(i,k,icfa) ) / phys_tstep
     5735             d_qx(i,k,ipcf) = ( pcf_seri(i,k) - qx(i,k,ipcf) ) / phys_tstep
     5736             d_qx(i,k,iqva) = ( qva_seri(i,k) - qx(i,k,iqva) ) / phys_tstep
     5737             d_qx(i,k,iqia) = ( qia_seri(i,k) - qx(i,k,iqia) ) / phys_tstep
    57235738          ENDIF
    5724 
    57255739       ENDDO
    57265740    ENDDO
     
    57545768    qvc_ancien(:,:)= qvc_seri(:,:)
    57555769    cfa_ancien(:,:)= cfa_seri(:,:)
    5756     qta_ancien(:,:)= qta_seri(:,:)
     5770    pcf_ancien(:,:)= pcf_seri(:,:)
     5771    qva_ancien(:,:)= qva_seri(:,:)
     5772    qia_ancien(:,:)= qia_seri(:,:)
    57575773    CALL water_int(klon,klev,q_ancien,zmasse,prw_ancien)
    57585774    CALL water_int(klon,klev,ql_ancien,zmasse,prlw_ancien)
Note: See TracChangeset for help on using the changeset viewer.