Changeset 4009


Ignore:
Timestamp:
Nov 17, 2021, 11:23:39 PM (3 years ago)
Author:
evignon
Message:

! Prise en compte de l'orographie sous maille, des heterogeneites de surface
! sur le ratqs + nouvelle version des ratqs interactifs de Louis
! Le tout est dan un module: calcratqs_multi_mod.
! Pour l'instant, les nouvelles contributions peuvent s'activer
! uniquement de facon separee

Location:
LMDZ6/trunk/libf
Files:
2 added
1 deleted
6 edited

Legend:

Unmodified
Added
Removed
  • LMDZ6/trunk/libf/phylmd/calcratqs.F90

    r3856 r4009  
    33           ratqsbas,ratqshaut,ratqsp0,ratqsdp, &
    44           tau_ratqs,fact_cldcon,wake_s, wake_deltaq,   &
    5            ptconv,ptconvth,clwcon0th, rnebcon0th,      &
    6            paprs,pplay,q_seri,zqsat,fm_therm,          &
     5           ptconv,ptconvth,clwcon0th, rnebcon0th,       &
     6           paprs,pplay,t_seri,q_seri,                   &
     7           qtc_cv, sigt_cv, zqsat,             &
     8           tke,tke_dissip,lmix,wprime, &
     9           t2m,q2m,fm_therm, &
    710           ratqs,ratqsc,ratqs_inter)
     11
     12
     13USE indice_sol_mod
     14USE phys_state_var_mod, ONLY: pctsrf
     15USE calcratqs_multi_mod, ONLY: calcratqs_inter, calcratqs_oro, calcratqs_hetero, calcratqs_tke
    816
    917implicit none
     
    2331real,intent(in) :: pdtphys,ratqsbas,ratqshaut,fact_cldcon,tau_ratqs
    2432real,intent(in) :: ratqsp0, ratqsdp
    25 real, dimension(klon,klev+1),intent(in) :: paprs
    26 real, dimension(klon,klev),intent(in) :: pplay,q_seri,zqsat,fm_therm
     33real, dimension(klon,klev+1),intent(in) :: paprs,tke,tke_dissip,lmix,wprime
     34real, dimension(klon,klev),intent(in) :: pplay,t_seri,q_seri,zqsat,fm_therm, qtc_cv, sigt_cv
    2735logical, dimension(klon,klev),intent(in) :: ptconv
    2836real, dimension(klon,klev),intent(in) :: rnebcon0th,clwcon0th
    2937real, dimension(klon,klev),intent(in) :: wake_deltaq,wake_s
     38real, dimension(klon,nbsrf),intent(in) :: t2m,q2m
    3039! Output
    3140real, dimension(klon,klev),intent(inout) :: ratqs,ratqsc,ratqs_inter
     41
    3242logical, dimension(klon,klev),intent(inout) :: ptconvth
    3343
     
    3646real, dimension(klon,klev) :: ratqss
    3747real facteur,zfratqs1,zfratqs2
     48real, dimension(klon,klev) :: ratqs_hetero,ratqs_oro,ratqs_tke
     49
    3850
    3951!-------------------------------------------------------------------------
     
    131143         enddo
    132144
    133       else if (iflag_ratqs==10) then ! ratqs interactif dépendant de la présence de poches froides
    134          call calcratqs_inter(klon,klev,pdtphys,ratqsbas,wake_deltaq,wake_s,q_seri,ratqs_inter)
    135          do k=1,klev
    136             do i=1, klon
    137                 ratqss(i,k)=ratqs_inter(i,k)+0.5*(ratqshaut-ratqs_inter(i,k)) &
    138                 *( tanh( (ratqsp0-pplay(i,k))/ratqsdp) + 1.)
    139             enddo
    140          enddo
    141 
     145       else if (iflag_ratqs .GT. 9) then
     146 
     147       ! interactive ratqs calculations that depend on cold pools, orography, surface heterogeneity and small-scale turbulence
     148       ! This should help getting a more realistic ratqs in the low and mid troposphere
     149       ! We however need a "background" ratqs to account for subgrid distribution of qt (or qt/qs)
     150       ! in the high troposphere
     151       
     152       ! background ratqs and initialisations
     153          do k=1,klev
     154             do i=1,klon
     155              ratqss(i,k)=ratqsbas+0.5*(ratqshaut-ratqsbas) &
     156              *( tanh( (ratqsp0-pplay(i,k))/ratqsdp) + 1.)
     157              ratqss(i,k)=max(ratqss(i,k),0.0)
     158
     159              ratqs_hetero(i,k)=0.
     160              ratqs_oro(i,k)=0.
     161              ratqs_tke(i,k)=0.
     162              ratqs_inter(i,k)=0
     163             enddo
     164          enddo
     165     
     166          if (iflag_ratqs .EQ. 10) then
     167             ! interactive ratqs in presence of cold pools     
     168             call calcratqs_inter(klon,klev,iflag_ratqs,pdtphys,ratqsbas,wake_deltaq,wake_s,q_seri,qtc_cv, sigt_cv,ratqs_inter)
     169             do k=1,klev
     170                do i=1,klon
     171                    ratqs_inter(i,k)=ratqs_inter(i,k)-0.5*ratqs_inter(i,k)*(tanh((ratqsp0-pplay(i,k))/ratqsdp)+1.)
     172                enddo
     173             enddo
     174             ratqss=ratqss+ratqs_inter
     175          else if (iflag_ratqs .EQ. 11) then
     176            ! interactive ratqs with several sources
     177            call calcratqs_inter(klon,klev,iflag_ratqs,pdtphys,ratqsbas,wake_deltaq,wake_s,q_seri,qtc_cv, sigt_cv,ratqs_inter)
     178             ratqss=ratqss+ratqs_inter
     179          else if (iflag_ratqs .EQ. 12) then
     180             ! contribution of surface heterogeneities to ratqs
     181             call calcratqs_hetero(klon,klev,t2m,q2m,t_seri,q_seri,pplay,paprs,ratqs_hetero)
     182             ratqss=ratqss+ratqs_hetero
     183          else if (iflag_ratqs .EQ. 13) then
     184             ! contribution of ubgrid orography to ratqs
     185             call calcratqs_oro(klon,klev,zqsat,t_seri,pplay,paprs,ratqs_oro)
     186             ratqss=ratqss+ratqs_oro
     187          else if (iflag_ratqs .EQ. 14) then
     188             ! effect of subgrid-scale TKE on ratqs (in development)
     189             call calcratqs_tke(klon,klev,pdtphys,t_seri,q_seri,zqsat,pplay,paprs,tke,tke_dissip,lmix,wprime,ratqs_tke)     
     190             ratqss=ratqss+ratqs_tke
     191          endif
     192         
     193     
    142194      endif
    143195
  • LMDZ6/trunk/libf/phylmd/phys_local_var_mod.F90

    r3999 r4009  
    1616      REAL, SAVE, ALLOCATABLE :: u_seri(:,:), v_seri(:,:)
    1717      !$OMP THREADPRIVATE(u_seri, v_seri)
    18       REAL, SAVE, ALLOCATABLE :: l_mixmin(:,:,:), l_mix(:,:,:), tke_dissip(:,:,:)
    19       !$OMP THREADPRIVATE(l_mixmin, l_mix, tke_dissip)
     18      REAL, SAVE, ALLOCATABLE :: l_mixmin(:,:,:),l_mix(:,:,:),tke_dissip(:,:,:),wprime(:,:,:)
     19      !$OMP THREADPRIVATE(l_mixmin, l_mix, tke_dissip,wprime)
    2020      REAL, SAVE, ALLOCATABLE :: tr_seri(:,:,:)
    2121      !$OMP THREADPRIVATE(tr_seri)
     
    559559      ALLOCATE(t_seri(klon,klev),q_seri(klon,klev),ql_seri(klon,klev),qs_seri(klon,klev))
    560560      ALLOCATE(u_seri(klon,klev),v_seri(klon,klev))
    561       ALLOCATE(l_mixmin(klon,klev+1,nbsrf), l_mix(klon,klev+1,nbsrf), tke_dissip(klon,klev+1,nbsrf))
    562       l_mix(:,:,:)=0. ; l_mixmin(:,:,:)=0. ; tke_dissip(:,:,:)=0. ! doit etre initialse car pas toujours remplis
     561      ALLOCATE(l_mixmin(klon,klev+1,nbsrf),l_mix(klon,klev+1,nbsrf),tke_dissip(klon,klev+1,nbsrf),wprime(klon,klev+1,nbsrf))
     562      l_mix(:,:,:)=0.;l_mixmin(:,:,:)=0.;tke_dissip(:,:,:)=0.;wprime(:,:,:)=0. ! doit etre initialse car pas toujours remplis
    563563
    564564      ALLOCATE(tr_seri(klon,klev,nbtr))
     
    878878      DEALLOCATE(t_seri,q_seri,ql_seri,qs_seri)
    879879      DEALLOCATE(u_seri,v_seri)
    880       DEALLOCATE(l_mixmin,l_mix, tke_dissip)
     880      DEALLOCATE(l_mixmin,l_mix, tke_dissip,wprime)
    881881
    882882      DEALLOCATE(tr_seri)
  • LMDZ6/trunk/libf/phylmd/physiq_mod.F90

    r3999 r4009  
    220220       d_t_vdf_x, d_t_vdf_w, &
    221221       d_q_vdf_x, d_q_vdf_w, &
    222        pbl_tke_input, &
     222       pbl_tke_input, tke_dissip, l_mix, wprime,&
    223223       t_therm, q_therm, u_therm, v_therm, &
    224224       cdragh_x, cdragh_w, &
     
    11861186    integer iostat
    11871187
     1188    REAL, dimension(klon,klev+1) :: tke_dissip_ave, l_mix_ave, wprime_ave
    11881189    REAL zzz
    11891190    !albedo SB >>>
     
    34983499    ! Computation of ratqs, the width (normalized) of the subrid scale
    34993500    ! water distribution
     3501
     3502    tke_dissip_ave(:,:)=0.
     3503    l_mix_ave(:,:)=0.
     3504    wprime_ave(:,:)=0.
     3505
     3506
     3507    DO nsrf = 1, nbsrf
     3508       DO i = 1, klon
     3509          tke_dissip_ave(i,:) = tke_dissip_ave(i,:) + tke_dissip(i,:,nsrf)*pctsrf(i,nsrf)
     3510          l_mix_ave(i,:) = l_mix_ave(i,:) + l_mix(i,:,nsrf)*pctsrf(i,nsrf)
     3511          wprime_ave(i,:) = wprime_ave(i,:) + wprime(i,:,nsrf)*pctsrf(i,nsrf)
     3512       ENDDO
     3513    ENDDO
     3514
     3515
    35003516    CALL  calcratqs(klon,klev,prt_level,lunout,        &
    35013517         iflag_ratqs,iflag_con,iflag_cld_th,pdtphys,  &
     
    35033519         tau_ratqs,fact_cldcon,wake_s, wake_deltaq,   &
    35043520         ptconv,ptconvth,clwcon0th, rnebcon0th,     &
    3505          paprs,pplay,q_seri,zqsat,fm_therm, &
     3521         paprs,pplay,t_seri,q_seri, qtc_cv, sigt_cv, zqsat, &
     3522         pbl_tke(:,:,is_ave),tke_dissip_ave,l_mix_ave,wprime_ave,t2m,q2m,fm_therm, &
    35063523         ratqs,ratqsc,ratqs_inter)
    35073524
  • LMDZ6/trunk/libf/phylmd/yamada4.F90

    r3784 r4009  
    66  USE dimphy
    77  USE ioipsl_getin_p_mod, ONLY : getin_p
    8   USE phys_local_var_mod, only: tke_dissip
     8  USE phys_local_var_mod, only: tke_dissip,wprime
    99 
    1010  IMPLICIT NONE
     
    726726      lyam(1:ngrid, 2:klev)*5.17*kn(1:ngrid, 2:klev)*n2(1:ngrid, 2:klev)/ &
    727727      sqrt(q2(1:ngrid,2:klev))
    728 
     728 
    729729    t2yam(1:ngrid, 2:klev) = 9.1*kn(1:ngrid, 2:klev)* &
    730730      dtetadz(1:ngrid, 2:klev)**2/sqrt(q2(1:ngrid,2:klev))* &
     
    750750
    751751!============================================================================
    752 ! Diagnostique de la dissipation
     752! Diagnostique de la dissipation et vitesse verticale
    753753!============================================================================
    754754
    755755! Diagnostics
    756756 tke_dissip(1:ngrid,:,nsrf)=0.
    757 ! DO k=2,klev
    758 !    DO ig=1,ngrid
    759 !       jg=ni(ig)
    760 !       tke_dissip(jg,k,nsrf)=dissip(ig,k)
    761 !    ENDDO
    762 ! ENDDO
     757 wprime(1:ngrid,:,nsrf)=0.
     758 DO k=2,klev
     759    DO ig=1,ngrid
     760       jg=ni(ig)
     761       wprime(jg,k,nsrf)=sqrt(MAX(1./3*q2(ig,k),0.))
     762       tke_dissip(jg,k,nsrf)=dissip(ig,k)
     763    ENDDO
     764 ENDDO
    763765 
    764766!=============================================================================
  • LMDZ6/trunk/libf/phylmdiso/phys_local_var_mod.F90

    r4003 r4009  
    1616      REAL, SAVE, ALLOCATABLE :: u_seri(:,:), v_seri(:,:)
    1717      !$OMP THREADPRIVATE(u_seri, v_seri)
    18       REAL, SAVE, ALLOCATABLE :: l_mixmin(:,:,:), l_mix(:,:,:), tke_dissip(:,:,:)
    19       !$OMP THREADPRIVATE(l_mixmin, l_mix, tke_dissip)
     18      REAL, SAVE, ALLOCATABLE :: l_mixmin(:,:,:), l_mix(:,:,:), tke_dissip(:,:,:), wprime(:,:,:)
     19      !$OMP THREADPRIVATE(l_mixmin, l_mix, tke_dissip, wprime)
    2020      REAL, SAVE, ALLOCATABLE :: tr_seri(:,:,:)
    2121      !$OMP THREADPRIVATE(tr_seri)
     
    693693      ALLOCATE(t_seri(klon,klev),q_seri(klon,klev),ql_seri(klon,klev),qs_seri(klon,klev))
    694694      ALLOCATE(u_seri(klon,klev),v_seri(klon,klev))
    695       ALLOCATE(l_mixmin(klon,klev+1,nbsrf), l_mix(klon,klev+1,nbsrf), tke_dissip(klon,klev+1,nbsrf))
    696       l_mix(:,:,:)=0. ; l_mixmin(:,:,:)=0. ; tke_dissip(:,:,:)=0. ! doit etre initialse car pas toujours remplis
     695      ALLOCATE(l_mixmin(klon,klev+1,nbsrf), l_mix(klon,klev+1,nbsrf), tke_dissip(klon,klev+1,nbsrf), wprime(klon,klev+1,nbsrf))
     696      l_mix(:,:,:)=0. ; l_mixmin(:,:,:)=0. ; tke_dissip(:,:,:)=0. ; wprime(:,:,:)=0. ! doit etre initialse car pas toujours remplis
    697697
    698698      ALLOCATE(tr_seri(klon,klev,nbtr))
     
    10901090      DEALLOCATE(t_seri,q_seri,ql_seri,qs_seri)
    10911091      DEALLOCATE(u_seri,v_seri)
    1092       DEALLOCATE(l_mixmin,l_mix, tke_dissip)
     1092      DEALLOCATE(l_mixmin,l_mix, tke_dissip, wprime)
    10931093
    10941094      DEALLOCATE(tr_seri)
  • LMDZ6/trunk/libf/phylmdiso/physiq_mod.F90

    r4003 r4009  
    264264       d_t_vdf_x, d_t_vdf_w, &
    265265       d_q_vdf_x, d_q_vdf_w, &
    266        pbl_tke_input, &
     266       pbl_tke_input, tke_dissip, l_mix, wprime, &
    267267       t_therm, q_therm, u_therm, v_therm, &
    268268       cdragh_x, cdragh_w, &
     
    12881288    integer iostat
    12891289
     1290    REAL, dimension(klon,klev+1) :: tke_dissip_ave, l_mix_ave, wprime_ave
    12901291    REAL zzz
    12911292    !albedo SB >>>
     
    44684469    ! Computation of ratqs, the width (normalized) of the subrid scale
    44694470    ! water distribution
    4470     CALL  calcratqs(klon,klev,prt_level,lunout,        &
     4471
     4472    tke_dissip_ave(:,:)=0.
     4473    l_mix_ave(:,:)=0.
     4474    wprime_ave(:,:)=0.
     4475
     4476    DO nsrf = 1, nbsrf
     4477       DO i = 1, klon
     4478          tke_dissip_ave(i,:) = tke_dissip_ave(i,:) + tke_dissip(i,:,nsrf)*pctsrf(i,nsrf)
     4479          l_mix_ave(i,:) = l_mix_ave(i,:) + l_mix(i,:,nsrf)*pctsrf(i,nsrf)
     4480          wprime_ave(i,:) = wprime_ave(i,:) + wprime(i,:,nsrf)*pctsrf(i,nsrf)
     4481       ENDDO
     4482    ENDDO
     4483
     4484   CALL  calcratqs(klon,klev,prt_level,lunout,        &
    44714485         iflag_ratqs,iflag_con,iflag_cld_th,pdtphys,  &
    44724486         ratqsbas,ratqshaut,ratqsp0, ratqsdp, &
    44734487         tau_ratqs,fact_cldcon,wake_s, wake_deltaq,   &
    44744488         ptconv,ptconvth,clwcon0th, rnebcon0th,     &
    4475          paprs,pplay,q_seri,zqsat,fm_therm, &
     4489         paprs,pplay,t_seri,q_seri, qtc_cv, sigt_cv, zqsat, &
     4490         pbl_tke(:,:,is_ave),tke_dissip_ave,l_mix_ave,wprime_ave,t2m,q2m,fm_therm, &
    44764491         ratqs,ratqsc,ratqs_inter)
     4492
    44774493
    44784494    !
Note: See TracChangeset for help on using the changeset viewer.