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

Last change on this file since 3469 was 2871, checked in by jleconte, 2 years ago

Improved rain evaporation for les + correction in callkeys

File size: 7.1 KB
Line 
1      subroutine largescale(ngrid,nlayer,nq,ptimestep, pplev, pplay,    &
2                    pt, pq, pdt, pdq, pdtlsc, pdqvaplsc, pdqliqlsc, rneb)
3
4
5      use ioipsl_getin_p_mod, only: getin_p
6      use watercommon_h, only : RLVTT, RCPD, RVTMP2,  &
7          T_h2O_ice_clouds,T_h2O_ice_liq,Psat_water,Lcpdqsat_water
8      USE tracer_h
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
24      INTEGER ngrid,nlayer,nq
25
26!     Arguments
27      REAL ptimestep                 ! intervalle du temps (s)
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
38
39
40!     Options du programme
41      REAL, SAVE :: ratqs   ! determine largeur de la distribution de vapeur
42      REAL, SAVE :: qvap_deep   ! deep mixing ratio of water vapor when simulating bottom less planets
43!$OMP THREADPRIVATE(ratqs, qvap_deep)
44
45!     Variables locales
46      REAL CBRT
47      EXTERNAL CBRT
48      INTEGER i, k , nn
49      INTEGER,PARAMETER :: nitermax=5000
50      DOUBLE PRECISION,PARAMETER :: alpha=.1,qthreshold=1.d-8
51      ! JL13: if "careful, T<Tmin in psat water" appears often, you may want to stabilise the model by
52      !                   decreasing alpha and increasing nitermax accordingly
53      DOUBLE PRECISION zq(ngrid)
54      DOUBLE PRECISION zcond(ngrid),zcond_iter
55      DOUBLE PRECISION zdelq(ngrid)
56      DOUBLE PRECISION zqs(ngrid)
57      real zt(ngrid),local_p,psat_tmp,dlnpsat_tmp,Lcp,zqs_temp,zdqs
58     
59! evaporation calculations
60      REAL dqevap(ngrid,nlayer),dtevap(ngrid,nlayer)     
61      REAL qevap(ngrid,nlayer,nq)
62      REAL tevap(ngrid,nlayer)
63
64      DOUBLE PRECISION zx_q(ngrid)
65      LOGICAL,SAVE :: firstcall=.true.
66!$OMP THREADPRIVATE(firstcall)
67
68
69      IF (firstcall) THEN
70
71         write(*,*) "value for ratqs? "
72         ratqs=0.2 ! default value
73         call getin_p("ratqs",ratqs)
74         write(*,*) " ratqs = ",ratqs
75
76         write(*,*) "Deep water vapor mixing ratio ? (no effect if negative) "
77         qvap_deep=-1. ! default value
78         call getin_p("qvap_deep",qvap_deep)
79         write(*,*) " qvap_deep = ",qvap_deep
80
81         firstcall = .false.
82      ENDIF
83
84!     GCM -----> subroutine variables, initialisation of outputs
85
86      pdtlsc(1:ngrid,1:nlayer)  = 0.0
87      pdqvaplsc(1:ngrid,1:nlayer)  = 0.0
88      pdqliqlsc(1:ngrid,1:nlayer) = 0.0
89      rneb(1:ngrid,1:nlayer) = 0.0
90      Lcp=RLVTT/RCPD
91
92
93      ! Evaporate cloud water/ice
94      call evap(ngrid,nlayer,nq,ptimestep,pt,pq,pdq,pdt,dqevap,dtevap,qevap,tevap)
95      ! note: we use qevap but not tevap in largescale/moistadj
96            ! otherwise is a big mess
97
98
99!  Boucle verticale (du haut vers le bas)
100   DO k = nlayer, 1, -1
101
102      zt(1:ngrid)=pt(1:ngrid,k)+(pdt(1:ngrid,k)+dtevap(1:ngrid,k))*ptimestep
103      zq(1:ngrid)=qevap(1:ngrid,k,igcm_h2o_vap) !liquid water is included in qevap
104
105!     Calculer la vapeur d'eau saturante et
106!     determiner la condensation partielle
107      DO i = 1, ngrid
108
109         local_p=pplay(i,k)
110         if(zt(i).le.15.) then
111            print*,'in lsc',i,k,zt(i)
112!           zt(i)=15.   ! check too low temperatures
113         endif
114         call Psat_water(zt(i),local_p,psat_tmp,zqs_temp)
115         zqs(i)=zqs_temp
116 
117         zdelq(i) = MAX(MIN(ratqs * zq(i),1.-zq(i)),1.d-12)
118         rneb(i,k) = (zq(i)+zdelq(i)-zqs(i)) / (2.0*zdelq(i))
119#ifdef MESOSCALE
120         if (rneb(i,k).lt.0.01) then  !no clouds MESO
121#else
122         if (rneb(i,k).lt.0.) then  !no clouds
123#endif
124
125            rneb(i,k)=0.
126            zcond(i)=0.
127
128         else if ((rneb(i,k).gt.0.99).or.(ratqs.lt.1.e-6)) then    !complete cloud cover, we start without evaporating
129            rneb(i,k)=1.
130            zt(i)=pt(i,k)+pdt(i,k)*ptimestep
131            zx_q(i) = pq(i,k,igcm_h2o_vap)+pdq(i,k,igcm_h2o_vap)*ptimestep
132            dqevap(i,k)=0.
133!           iterative process to stabilize the scheme when large water amounts JL12
134            zcond(i) = 0.0d0
135            Do nn=1,nitermax 
136               call Psat_water(zt(i),local_p,psat_tmp,zqs_temp)
137               zqs(i)=zqs_temp
138               call Lcpdqsat_water(zt(i),local_p,psat_tmp,zqs_temp,zdqs,dlnpsat_tmp)
139               zcond_iter = alpha*(zx_q(i)-zqs(i))/(1.d0+zdqs)     
140                  !zcond can be negative here
141               zx_q(i) = zx_q(i) - zcond_iter
142               zcond(i) = zcond(i) + zcond_iter
143               zt(i) = zt(i) + zcond_iter*Lcp
144               if (ABS(zcond_iter/alpha/zqs(i)).lt.qthreshold) exit
145!              if (ABS(zcond_iter/alpha).lt.qthreshold) exit
146               if (nn.eq.nitermax) print*,'itermax in largescale'
147            End do ! niter
148            zcond(i)=MAX(zcond(i),-(pq(i,k,igcm_h2o_ice)+pdq(i,k,igcm_h2o_ice)*ptimestep))
149
150         else   !standard case     
151#ifdef MESOSCALE
152            rneb(i,k)=1. !LES/MESO case
153            zx_q(i) = (zq(i)+zqs(i))/2.0d0 ! LES
154#else
155            zx_q(i) = (zq(i)+zdelq(i)+zqs(i))/2.0d0 !water vapor in cloudy sky
156#endif
157!           iterative process to stabilize the scheme when large water amounts JL12
158            zcond(i) = 0.0d0
159            Do nn=1,nitermax
160               ! use zqs_temp and not zqs(i) to force type conversion
161               ! -- might not be a good solution, actually
162               ! but this is compliant with "complete cloud cover" case above
163               call Lcpdqsat_water(zt(i),local_p,psat_tmp,zqs_temp,zdqs,dlnpsat_tmp)
164               zcond_iter = MAX(0.0d0,alpha*(zx_q(i)-zqs(i))/(1.d0+zdqs))         
165                  !zcond always postive! cannot evaporate clouds!
166                  !this is why we must reevaporate before largescale
167               zx_q(i) = zx_q(i) - zcond_iter
168               zcond(i) = zcond(i) + zcond_iter
169               if (ABS(zcond_iter/alpha/zqs(i)).lt.qthreshold) exit
170!              if (ABS(zcond_iter/alpha).lt.qthreshold) exit
171               zt(i) = zt(i) + zcond_iter*Lcp*rneb(i,k)
172               call Psat_water(zt(i),local_p,psat_tmp,zqs_temp)
173               zqs(i)=zqs_temp
174               if (nn.eq.nitermax) print*,'itermax in largescale'
175            End do ! niter
176
177         Endif
178
179         zcond(i) = zcond(i)*rneb(i,k)/ptimestep ! JL12
180
181      ENDDO
182
183!     Tendances de t et q
184         pdqvaplsc(1:ngrid,k)  = dqevap(1:ngrid,k) - zcond(1:ngrid)
185         pdqliqlsc(1:ngrid,k) = - pdqvaplsc(1:ngrid,k)
186         pdtlsc(1:ngrid,k)  = pdqliqlsc(1:ngrid,k)*Lcp
187
188   Enddo ! k= nlayer, 1, -1
189
190   if (qvap_deep >= 0.) then
191      !brings lower vapor ratio to a fixed value.
192      ! tau=3600. seems too fast
193      pdqvaplsc(1:ngrid,1) = (qvap_deep - pq(1:ngrid,1,igcm_h2o_vap))/14400. - pdq(1:ngrid,1,igcm_h2o_vap)
194   endif
195
196
197      end
Note: See TracBrowser for help on using the repository browser.