source: trunk/LMDZ.GENERIC/libf/phystd/largescale.F90 @ 1644

Last change on this file since 1644 was 1521, checked in by emillour, 9 years ago

All GCMs: Updates to make planetary codes (+Earth) setups converge.

  • Made a "phy_common" directory in libf, to contain routines common (wrt structural nature of underlying code/grid) to all LMDZ-related physics packages.
  • moved all "mod_phys_*" and "mod_grid_phy_lmdz" files from dynlonlat_phylonlat to "phy_common"
  • moved "ioipsl_getincom_p.F90 from "misc" to "phy_common" and modified it to match Earth GCM version and renamed it ioipsl_getin_p_mod.F90
  • added an "abort_physics" (as in Earth GCM) in "phy_common"
  • added a "print_control_mod.F90 (as in Earth GCM) in phy_common
  • made similar changes in LMDZ.GENERIC and LMDZ.MARS

EM

File size: 6.1 KB
RevLine 
[1308]1      subroutine largescale(ngrid,nlayer,nq,ptimestep, pplev, pplay,    &
2                    pt, pq, pdt, pdq, pdtlsc, pdqvaplsc, pdqliqlsc, rneb)
[728]3
[1016]4
[1521]5      use ioipsl_getin_p_mod, only: getin_p
[728]6      use watercommon_h, only : RLVTT, RCPD, RVTMP2,  &
[1016]7          T_h2O_ice_clouds,T_h2O_ice_liq,Psat_waterDP,Lcpdqsat_waterDP
[787]8      USE tracer_h
[728]9      IMPLICIT none
10
11!==================================================================
12!     
13!     Purpose
14!     -------
15!     Calculates large-scale (stratiform) H2O condensation.
16!     
17!     Authors
18!     -------
19!     Adapted from the LMDTERRE code by R. Wordsworth (2009)
20!     Original author Z. X. Li (1993)
21!     
22!==================================================================
23
[1308]24      INTEGER ngrid,nlayer,nq
[728]25
26!     Arguments
27      REAL ptimestep                 ! intervalle du temps (s)
[1308]28      REAL pplev(ngrid,nlayer+1) ! pression a inter-couche
29      REAL pplay(ngrid,nlayer)   ! pression au milieu de couche
30      REAL pt(ngrid,nlayer)      ! temperature (K)
31      REAL pq(ngrid,nlayer,nq) ! tracer mixing ratio (kg/kg)
32      REAL pdt(ngrid,nlayer)     ! physical temperature tenedency (K/s)
33      REAL pdq(ngrid,nlayer,nq)! physical tracer tenedency (K/s)
34      REAL pdtlsc(ngrid,nlayer)  ! incrementation de la temperature (K)
35      REAL pdqvaplsc(ngrid,nlayer) ! incrementation de la vapeur d'eau
36      REAL pdqliqlsc(ngrid,nlayer) ! incrementation de l'eau liquide
37      REAL rneb(ngrid,nlayer)    ! fraction nuageuse
[728]38
39
40!     Options du programme
[1016]41      REAL, SAVE :: ratqs   ! determine largeur de la distribution de vapeur
[1315]42!$OMP THREADPRIVATE(ratqs)
[728]43
44!     Variables locales
45      REAL CBRT
46      EXTERNAL CBRT
47      INTEGER i, k , nn
[1016]48      INTEGER,PARAMETER :: nitermax=5000
49      DOUBLE PRECISION,PARAMETER :: alpha=.1,qthreshold=1.d-8
[875]50      ! JL13: if "careful, T<Tmin in psat water" appears often, you may want to stabilise the model by
51      !                   decreasing alpha and increasing nitermax accordingly
[1016]52      DOUBLE PRECISION zt(ngrid), zq(ngrid)
53      DOUBLE PRECISION zcond(ngrid),zcond_iter
54      DOUBLE PRECISION zdelq(ngrid)
55      DOUBLE PRECISION zqs(ngrid), zdqs(ngrid)
56      DOUBLE PRECISION local_p,psat_tmp,dlnpsat_tmp,Lcp
[728]57     
58! evaporation calculations
[1308]59      REAL dqevap(ngrid,nlayer),dtevap(ngrid,nlayer)     
60      REAL qevap(ngrid,nlayer,nq)
61      REAL tevap(ngrid,nlayer)
[728]62
[1016]63      DOUBLE PRECISION zx_q(ngrid)
64      LOGICAL,SAVE :: firstcall=.true.
[1315]65!$OMP THREADPRIVATE(firstcall)
[728]66
[1016]67
68      IF (firstcall) THEN
69
70         write(*,*) "value for ratqs? "
71         ratqs=0.2 ! default value
[1315]72         call getin_p("ratqs",ratqs)
[1016]73         write(*,*) " ratqs = ",ratqs
74
75         firstcall = .false.
76      ENDIF
77
[728]78!     GCM -----> subroutine variables, initialisation of outputs
79
[1308]80      pdtlsc(1:ngrid,1:nlayer)  = 0.0
81      pdqvaplsc(1:ngrid,1:nlayer)  = 0.0
82      pdqliqlsc(1:ngrid,1:nlayer) = 0.0
83      rneb(1:ngrid,1:nlayer) = 0.0
[1016]84      Lcp=RLVTT/RCPD
[728]85
86
87      ! Evaporate cloud water/ice
[1308]88      call evap(ngrid,nlayer,nq,ptimestep,pt,pq,pdq,pdt,dqevap,dtevap,qevap,tevap)
[728]89      ! note: we use qevap but not tevap in largescale/moistadj
90            ! otherwise is a big mess
91
92
93!  Boucle verticale (du haut vers le bas)
[1308]94   DO k = nlayer, 1, -1
[728]95
[787]96      zt(1:ngrid)=pt(1:ngrid,k)+(pdt(1:ngrid,k)+dtevap(1:ngrid,k))*ptimestep
97      zq(1:ngrid)=qevap(1:ngrid,k,igcm_h2o_vap) !liquid water is included in qevap
[728]98
99!     Calculer la vapeur d'eau saturante et
100!     determiner la condensation partielle
[787]101      DO i = 1, ngrid
[728]102
[1016]103         local_p=pplay(i,k)
[773]104         if(zt(i).le.15.) then
[786]105            print*,'in lsc',i,k,zt(i)
106!           zt(i)=15.   ! check too low temperatures
[773]107         endif
[1016]108         call Psat_waterDP(zt(i),local_p,psat_tmp,zqs(i))
[728]109 
[1016]110         zdelq(i) = MAX(MIN(ratqs * zq(i),1.-zq(i)),1.d-12)
[786]111         rneb(i,k) = (zq(i)+zdelq(i)-zqs(i)) / (2.0*zdelq(i))
112         if (rneb(i,k).lt.0.) then  !no clouds
113
114            rneb(i,k)=0.
115            zcond(i)=0.
116
[1016]117         else if ((rneb(i,k).gt.0.99).or.(ratqs.lt.1.e-6)) then    !complete cloud cover, we start without evaporating
[786]118            rneb(i,k)=1.
119            zt(i)=pt(i,k)+pdt(i,k)*ptimestep
120            zx_q(i) = pq(i,k,igcm_h2o_vap)+pdq(i,k,igcm_h2o_vap)*ptimestep
121            dqevap(i,k)=0.
122!           iterative process to stabilize the scheme when large water amounts JL12
[1016]123            zcond(i) = 0.0d0
[786]124            Do nn=1,nitermax 
[1016]125               call Psat_waterDP(zt(i),local_p,psat_tmp,zqs(i))
126               call Lcpdqsat_waterDP(zt(i),local_p,psat_tmp,zqs(i),zdqs(i),dlnpsat_tmp)
127               zcond_iter = alpha*(zx_q(i)-zqs(i))/(1.d0+zdqs(i))         
[786]128                  !zcond can be negative here
129               zx_q(i) = zx_q(i) - zcond_iter
130               zcond(i) = zcond(i) + zcond_iter
[1016]131               zt(i) = zt(i) + zcond_iter*Lcp
132               if (ABS(zcond_iter/alpha/zqs(i)).lt.qthreshold) exit
133!              if (ABS(zcond_iter/alpha).lt.qthreshold) exit
134               if (nn.eq.nitermax) print*,'itermax in largescale'
[786]135            End do ! niter
136            zcond(i)=MAX(zcond(i),-(pq(i,k,igcm_h2o_ice)+pdq(i,k,igcm_h2o_ice)*ptimestep))
137
138         else   !standard case     
139
[1016]140            zx_q(i) = (zq(i)+zdelq(i)+zqs(i))/2.0d0 !water vapor in cloudy sky
[786]141!           iterative process to stabilize the scheme when large water amounts JL12
[1016]142            zcond(i) = 0.0d0
[786]143            Do nn=1,nitermax 
[1016]144               call Lcpdqsat_waterDP(zt(i),local_p,psat_tmp,zqs(i),zdqs(i),dlnpsat_tmp)
145               zcond_iter = MAX(0.0d0,alpha*(zx_q(i)-zqs(i))/(1.d0+zdqs(i)))       
[786]146                  !zcond always postive! cannot evaporate clouds!
147                  !this is why we must reevaporate before largescale
148               zx_q(i) = zx_q(i) - zcond_iter
149               zcond(i) = zcond(i) + zcond_iter
[1016]150               if (ABS(zcond_iter/alpha/zqs(i)).lt.qthreshold) exit
151!              if (ABS(zcond_iter/alpha).lt.qthreshold) exit
152               zt(i) = zt(i) + zcond_iter*Lcp*rneb(i,k)
153               call Psat_waterDP(zt(i),local_p,psat_tmp,zqs(i))
154               if (nn.eq.nitermax) print*,'itermax in largescale'
[786]155            End do ! niter
156
[728]157         Endif
158
[786]159         zcond(i) = zcond(i)*rneb(i,k)/ptimestep ! JL12
[728]160
161      ENDDO
162
163!     Tendances de t et q
[787]164         pdqvaplsc(1:ngrid,k)  = dqevap(1:ngrid,k) - zcond(1:ngrid)
165         pdqliqlsc(1:ngrid,k) = - pdqvaplsc(1:ngrid,k)
[1016]166         pdtlsc(1:ngrid,k)  = pdqliqlsc(1:ngrid,k)*real(Lcp)
[728]167
[1308]168   Enddo ! k= nlayer, 1, -1
[1016]169 
[728]170
171      end
Note: See TracBrowser for help on using the repository browser.