Ignore:
Timestamp:
Mar 19, 2026, 2:35:46 PM (10 days ago)
Author:
gmilcareck
Message:

Thermodynamics update on LMDZ.GENERIC

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/LMDZ.GENERIC/libf/phygeneric/turbdiff_mod.F90

    r3995 r4146  
    88          ptimestep,pcapcal,                    &   
    99          pplay,pplev,pzlay,pzlev,pz0,                 &
    10           pu,pv,pt,ppopsk,pq,ptsrf,pemis,pqsurf,       &
     10          pu,pv,pt,ph,ppopsk,pq,ptsrf,pemis,pqsurf,       &
    1111          pdtfi,pdqfi,pfluxsrf,            &
    1212          Pdudif,pdvdif,pdtdif,pdtsrf,sensibFlux,pq2,  &
     
    1717      use surfdat_h, only: dryness
    1818      use tracer_h, only: igcm_h2o_vap, igcm_h2o_ice
    19       use comcstfi_mod, only: rcp, g, r, cpp
     19      use comcstfi_mod, only: g, rd_ref, cppd_ref
    2020      use callkeys_mod, only: water,tracer,nosurf,kmixmin
    2121      use turb_mod, only : ustar
     
    6161      REAL,INTENT(IN) :: pzlay(ngrid,nlay),pzlev(ngrid,nlay+1)
    6262      REAL,INTENT(IN) :: pu(ngrid,nlay),pv(ngrid,nlay)
    63       REAL,INTENT(IN) :: pt(ngrid,nlay),ppopsk(ngrid,nlay)
     63      REAL,INTENT(IN) :: pt(ngrid,nlay),ph(ngrid,nlay),ppopsk(ngrid,nlay)
    6464      REAL,INTENT(IN) :: ptsrf(ngrid) ! surface temperature (K)
    6565      REAL,INTENT(IN) :: pemis(ngrid)
     
    173173         DO ig=1,ngrid
    174174            zmass(ig,ilay)=(pplev(ig,ilay)-pplev(ig,ilay+1))/glat(ig)
    175             zExner(ig,ilay)=(pplev(ig,ilay)/pplev(ig,1))**rcp
     175            zExner(ig,ilay)=ppopsk(ig,ilay)
    176176            zovExner(ig,ilay)=1./ppopsk(ig,ilay)
    177177         ENDDO
    178178      ENDDO
    179179
    180       zcst1=4.*g*ptimestep/(R*R)
     180      zcst1=4.*g*ptimestep/(rd_ref*rd_ref)
    181181      DO ilev=2,nlev-1
    182182         DO ig=1,ngrid
     
    186186      ENDDO
    187187      DO ig=1,ngrid
    188          zb0(ig,1)=ptimestep*pplev(ig,1)/(R*ptsrf(ig))
     188         zb0(ig,1)=ptimestep*pplev(ig,1)/(rd_ref*ptsrf(ig))
    189189      ENDDO
    190190      dqsdif_total(:)=0.0
     
    199199            zv(ig,ilev)=pv(ig,ilev)
    200200            zt(ig,ilev)=pt(ig,ilev)+pdtfi(ig,ilev)*ptimestep
    201             zh(ig,ilev)=pt(ig,ilev)*zovExner(ig,ilev) !for call vdif_kc, but could be moved and computed there
     201            zh(ig,ilev)=ph(ig,ilev)!+pdtfi(ig,ilev)*ptimestep*zovExner(ig,ilev) !for call vdif_kc, but could be moved and computed there
    202202        ENDDO
    203203      ENDDO
     
    248248!     ------------------------------------------------------
    249249
    250       call vdif_kc(ngrid,nlay,nq,ptimestep,g,pzlev,pzlay,pu,pv,pq,zh,zcdv_true,pq2,zkv,zkh) !JL12 why not call vdif_kc with updated winds and temperature
    251      
     250      call vdif_kc(ngrid,nlay,nq,ptimestep,g,pzlev,pzlay,pplev,pplay, &
     251                   pu,pv,zt,pq,zh,zcdv_true,pq2,zkv,zkh) !JL12 why not call vdif_kc with updated
     252                       
    252253!     Adding eddy mixing to mimic 3D general circulation in 1D
    253254!     R. Wordsworth & F. Forget (2010)
     
    273274!               zkv(ig,ilev) = max(kzz_eddy(ilev),zkv(ig,ilev))
    274275!            end do
    275 
    276276            do ig=1,ngrid
    277277               zkh(ig,ilev) = max(kmixmin,zkh(ig,ilev))
     
    436436
    437437         DO ig=1,ngrid
    438             z1(ig)=pcapcal(ig)*ptsrf(ig)+cpp*zfluxt(ig,1)*zct(ig,1)*zovExner(ig,1) &
     438            z1(ig)=pcapcal(ig)*ptsrf(ig)+cppd_ref*zfluxt(ig,1)*zct(ig,1)*zovExner(ig,1) &
    439439                + pfluxsrf(ig)*ptimestep + zdplanck(ig)*ptsrf(ig)
    440             z2(ig) = pcapcal(ig)+zdplanck(ig)+cpp*zfluxt(ig,1)*(1.-zovExner(ig,1)*zdt(ig,1))
     440            z2(ig) = pcapcal(ig)+zdplanck(ig)+cppd_ref*zfluxt(ig,1)*(1.-zovExner(ig,1)*zdt(ig,1))
    441441            ztsrf(ig) = z1(ig) / z2(ig)
    442442            pdtsrf(ig) = (ztsrf(ig) - ptsrf(ig))/ptimestep
     
    573573                  zcq0(ig) = qsat(ig)-dqsat(ig)*ptsrf(ig)
    574574
    575                   z1(ig) = pcapcal(ig)*ptsrf(ig) +cpp*zfluxt(ig,1)*zct(ig,1)*zovExner(ig,1)   &
     575                  z1(ig) = pcapcal(ig)*ptsrf(ig) +cppd_ref*zfluxt(ig,1)*zct(ig,1)*zovExner(ig,1)   &
    576576                      + zdplanck(ig)*ptsrf(ig) + pfluxsrf(ig)*ptimestep                       &
    577577                      + zfluxq(ig,1)*dryness(ig)*RLVTT*((zdq(ig,1)-1.0)*zcq0(ig)+zcq(ig,1))
    578578
    579                   z2(ig) = pcapcal(ig) + cpp*zfluxt(ig,1)*(1.-zovExner(ig,1)*zdt(ig,1))       &
     579                  z2(ig) = pcapcal(ig) + cppd_ref*zfluxt(ig,1)*(1.-zovExner(ig,1)*zdt(ig,1))       &
    580580                      + zdplanck(ig)+zfluxq(ig,1)*dryness(ig)*RLVTT*zdq0(ig)*(1.0-zdq(ig,1))
    581581
     
    598598
    599599                      !recompute surface temperature 
    600                       z1(ig) = pcapcal(ig)*ptsrf(ig) +cpp*zfluxq(ig,1)*zct(ig,1)*zovExner(ig,1)   &
     600                      z1(ig) = pcapcal(ig)*ptsrf(ig) +cppd_ref*zfluxq(ig,1)*zct(ig,1)*zovExner(ig,1)   &
    601601                        + zdplanck(ig)*ptsrf(ig) + pfluxsrf(ig)*ptimestep                       &
    602602                        + RLVTT*dqsdif_total(ig)
    603                       z2(ig) = pcapcal(ig) + cpp*zfluxq(ig,1)*(1.-zovExner(ig,1)*zdt(ig,1))       &
     603                      z2(ig) = pcapcal(ig) + cppd_ref*zfluxq(ig,1)*(1.-zovExner(ig,1)*zdt(ig,1))       &
    604604                        + zdplanck(ig)
    605605                      ztsrf(ig) = z1(ig) / z2(ig)
     
    720720     
    721721      DO ig=1,ngrid ! computing sensible heat flux (atm => surface)
    722          sensibFlux(ig)=cpp*zfluxt(ig,1)/ptimestep*(zt(ig,1)*zovExner(ig,1)-ztsrf(ig))
     722         sensibFlux(ig)=cppd_ref*zfluxt(ig,1)/ptimestep*(zt(ig,1)*zovExner(ig,1)-ztsrf(ig))
    723723      ENDDO
    724724
Note: See TracChangeset for help on using the changeset viewer.