source: trunk/LMDZ.MARS/libf/phymars/watercloud_mod.F @ 2984

Last change on this file since 2984 was 2984, checked in by jnaar, 17 months ago

Adaptative timestep working and computed directly in improvedclouds. Simpleclouds working again. JN

File size: 27.4 KB
Line 
1       MODULE watercloud_mod
2
3       IMPLICIT NONE
4
5       REAL,SAVE,ALLOCATABLE :: zdqcloud(:,:,:) ! tendencies on pq due to condensation of H2O(kg/kg.s-1)
6       REAL,SAVE,ALLOCATABLE :: zdqscloud(:,:) ! tendencies on qsurf (calculated only by calchim but declared here)
7
8!$OMP THREADPRIVATE(zdqcloud,zdqscloud)
9
10       CONTAINS
11
12       SUBROUTINE watercloud(ngrid,nlay,ptimestep,
13     &                pplev,pplay,pdpsrf,pzlay,pt,pdt,
14     &                pq,pdq,pdqcloud,pdtcloud,
15     &                nq,tau,tauscaling,rdust,rice,nuice,
16     &                rsedcloud,rhocloud,totcloudfrac)
17      USE ioipsl_getin_p_mod, ONLY : getin_p
18      USE updaterad, ONLY: updaterdust, updaterice_micro,
19     &                     updaterice_typ
20      USE improvedclouds_mod, ONLY: improvedclouds
21      USE watersat_mod, ONLY: watersat
22      use tracer_mod, only: nqmx, igcm_h2o_vap, igcm_h2o_ice,
23     &                      igcm_hdo_vap, igcm_hdo_ice,
24     &                      igcm_dust_mass, igcm_dust_number,
25     &                      igcm_ccn_mass, igcm_ccn_number,
26     &                      rho_dust, nuice_sed, nuice_ref,
27     &                      qperemin
28      use dimradmars_mod, only: naerkind
29      use conc_mod, only: mmean
30      use write_output_mod, only: write_output
31      IMPLICIT NONE
32
33
34c=======================================================================
35c  Water-ice cloud formation
36
37c  Includes two different schemes:
38c    - A simplified scheme (see simpleclouds.F)
39c    - An improved microphysical scheme (see improvedclouds.F)
40c
41c  There is a time loop specific to cloud formation
42c  due to timescales smaller than the GCM integration timestep.
43c
44c  Authors: Franck Montmessin, Francois Forget, Ehouarn Millour,
45c           J.-B. Madeleine, Thomas Navarro
46c
47c  2004 - 2012
48c
49c     2023: J. Naar, now with adaptative timestep for improvedclouds
50c          (done in improvedclouds_mod).
51c=======================================================================
52
53c-----------------------------------------------------------------------
54c   declarations:
55c   -------------
56
57      include "callkeys.h"
58
59c   Inputs/outputs:
60c   ------
61
62      INTEGER, INTENT(IN) :: ngrid,nlay
63      INTEGER, INTENT(IN) ::  nq                 ! nombre de traceurs
64      REAL, INTENT(IN) ::  ptimestep             ! pas de temps physique (s)
65      REAL, INTENT(IN) ::  pplev(ngrid,nlay+1)   ! pression aux inter-couches (Pa)
66      REAL, INTENT(IN) ::  pplay(ngrid,nlay)     ! pression au milieu des couches (Pa)
67      REAL, INTENT(IN) ::  pdpsrf(ngrid)         ! tendence surf pressure
68      REAL, INTENT(IN) ::  pzlay(ngrid,nlay)     ! altitude at the middle of the layers
69      REAL, INTENT(IN) ::  pt(ngrid,nlay)        ! temperature at the middle of the layers (K)
70      REAL, INTENT(IN) ::  pdt(ngrid,nlay)       ! tendence temperature des autres param.
71
72      REAL, INTENT(IN) ::  pq(ngrid,nlay,nq)     ! traceur (kg/kg)
73      rEAL, INTENT(IN) ::  pdq(ngrid,nlay,nq)    ! tendence avant condensation  (kg/kg.s-1)
74
75      REAL, INTENT(IN) ::  tau(ngrid,naerkind) ! Column dust optical depth at each point
76      REAL, INTENT(IN) ::  tauscaling(ngrid)   ! Convertion factor for dust amount
77      REAL, INTENT(INOUT) ::  rdust(ngrid,nlay)   ! Dust geometric mean radius (m)
78
79      REAL, INTENT(OUT) ::  pdqcloud(ngrid,nlay,nq) ! tendence de la condensation H2O(kg/kg.s-1)
80      REAL, INTENT(OUT) ::  pdtcloud(ngrid,nlay)    ! tendence temperature due
81                                   ! a la chaleur latente
82      REAL, INTENT(INOUT) ::  rice(ngrid,nlay)    ! Ice mass mean radius (m)
83                               ! (r_c in montmessin_2004)
84      REAL, INTENT(OUT) ::  nuice(ngrid,nlay)   ! Estimated effective variance
85                               !   of the size distribution
86      REAL, INTENT(OUT) ::  rsedcloud(ngrid,nlay) ! Cloud sedimentation radius
87      REAL, INTENT(OUT) ::  rhocloud(ngrid,nlay)  ! Cloud density (kg.m-3)
88
89      REAL, INTENT(INOUT):: totcloudfrac(ngrid) ! Cloud fraction (A. Pottier 2013)
90     
91c   Locals:
92c   ------
93 
94      ! for ice radius computation
95      REAL Mo,No
96      REAl ccntyp
97     
98      ! for time loop
99      INTEGER microstep  ! time subsampling step variable
100      INTEGER,SAVE :: imicro ! time subsampling for coupled water microphysics & sedimentation
101      REAL,SAVE :: microtimestep ! integration timestep for coupled water microphysics & sedimentation
102      REAL,SAVE :: microtimestep_prev=-999
103     
104      !$OMP THREADPRIVATE(imicro,microtimestep)
105      !$OMP THREADPRIVATE(microtimestep_prev)
106      ! tendency given by clouds (inside the micro loop)
107      REAL subpdqcloud(ngrid,nlay,nq) ! cf. pdqcloud
108      REAL subpdtcloud(ngrid,nlay)    ! cf. pdtcloud
109
110      ! global tendency (clouds+physics)
111      ! JN : keeping this for simpleclouds scheme
112      REAL sum_subpdq(ngrid,nlay,nq)      ! cf. pdqcloud
113      REAL sum_subpdt(ngrid,nlay)         ! cf. pdtcloud
114
115      ! no supersaturation when option supersat is false
116      REAL zt(ngrid,nlay)       ! local value of temperature
117      REAL zqsat(ngrid,nlay)    ! saturation
118
119      INTEGER iq,ig,l
120      LOGICAL,SAVE :: firstcall=.true.
121     
122      !$OMP THREADPRIVATE(firstcall)
123! HDO cycle
124      REAL :: alpha(ngrid,nlay) ! fractionation coefficient for HDO
125      REAL :: zq0(ngrid,nlay,nq) ! Initial mixing ratio: intermediate variable for HDO
126! Representation of sub-grid water ice clouds A. Pottier 2013
127      REAL :: ztclf(ngrid, nlay)
128      REAL :: zqclf(ngrid, nlay,nq)
129      REAL :: zdelt 
130      REAL :: norm
131      REAL :: ponder
132      REAL :: tcond(ngrid,nlay)
133      REAL :: zqvap(ngrid,nlay)
134      REAL :: zqice(ngrid,nlay)
135      REAL ::  spant ! delta T for the temperature distribution
136!      REAL :: zqsat(ngrid,nlay) ! saturation
137      REAL :: pteff(ngrid, nlay)! effective temperature in the cloud,neb
138      REAL :: pqeff(ngrid, nlay, nq)! effective tracers quantities in the cloud
139      REAL :: cloudfrac(ngrid,nlay) ! cloud fraction
140      REAL :: mincloud ! min cloud frac
141      LOGICAL, save :: flagcloud=.true.
142     
143      !$OMP THREADPRIVATE(flagcloud)
144 
145! Scheme for adaptative timestep J. Naar 2023
146c      LOGICAL :: computed_micro(ngrid,nlay) ! Check if microphy was done in this cell
147      REAL :: count_micro(ngrid,nlay) ! Initially computed microtimestep
148      REAL :: zt_micro(ngrid,nlay) ! Temperature during microphysics (K)
149      REAL :: zq_micro(ngrid,nlay,nq) ! Tracers during microphysics (kg/kg)
150      REAL :: zqsat_micro(ngrid,nlay) ! Theoritical q(h2o_vap) at saturation (kg/kg)
151      INTEGER :: zimicro(ngrid,nlay)    ! Number of ptimestep divisions
152      REAL :: zpotcond_inst(ngrid,nlay) ! condensable water at the beginning of physics (kg/kg)
153      REAL :: zpotcond_full(ngrid,nlay) ! condensable water with integrated tendancies (kg/kg)
154      REAL :: zpotcond(ngrid,nlay) ! maximal condensable water, used to
155compute adaptative subdivision of ptimestep
156      REAL :: spenttime ! timespent
157      REAL :: zdq ! used to compute adaptative timestep
158
159
160c    ** un petit test de coherence
161c       --------------------------
162
163      IF (firstcall) THEN
164         
165        if (nq.gt.nqmx) then
166           write(*,*) 'stop in watercloud (nq.gt.nqmx)!'
167           write(*,*) 'nq=',nq,' nqmx=',nqmx
168           call abort_physic("watercloud","nq.gt.nqmx",1)
169        endif
170         
171        write(*,*) "watercloud: igcm_h2o_vap=",igcm_h2o_vap
172        write(*,*) "            igcm_h2o_ice=",igcm_h2o_ice
173               
174        write(*,*) "time subsampling for microphysic ?"
175#ifdef MESOSCALE
176        imicro = 2
177#else
178        imicro = 30
179#endif
180        call getin_p("imicro",imicro)
181        write(*,*)"watercloud: imicro = ",imicro
182       
183        firstcall=.false.
184      ENDIF ! of IF (firstcall)
185
186      !! AS: moved out of firstcall to allow nesting+evoluting timestep
187      !!     TBD: consider possible diff imicro with domains?
188      microtimestep = ptimestep/real(imicro)
189      if (microtimestep/=microtimestep_prev) then
190        ! only tell the world if microtimestep has changed
191        write(*,*)"watercloud: Physical timestep is ",ptimestep
192        write(*,*)"watercloud: Microphysics timestep is ",microtimestep
193        microtimestep_prev=microtimestep
194      endif
195     
196c-----Initialization
197      sum_subpdq(1:ngrid,1:nlay,1:nq) = 0
198      sum_subpdt(1:ngrid,1:nlay)      = 0
199     
200      ! default value if no ice
201      rhocloud(1:ngrid,1:nlay) = rho_dust
202
203c-------------------------------------------------------------------
204c   0.  Representation of sub-grid water ice clouds
205c------------------
206c-----Initialization
207      pteff(1:ngrid,1:nlay) = 0
208      pqeff(1:ngrid,1:nlay,1:nq) = 0
209      DO l=1,nlay
210        DO ig=1,ngrid
211             pteff(ig,l)=pt(ig,l)
212        END DO
213      END DO
214      DO l=1,nlay
215        DO ig=1,ngrid
216          DO iq=1,nq
217             pqeff(ig,l,iq)=pq(ig,l,iq)
218          ENDDO
219        ENDDO
220      ENDDO
221c-----Tendencies
222      DO l=1,nlay
223        DO ig=1,ngrid
224          ztclf(ig,l)=pt(ig,l)+ pdt(ig,l)*ptimestep
225        ENDDO
226      ENDDO
227      DO l=1,nlay
228        DO ig=1,ngrid
229          DO iq=1,nq
230             zqclf(ig,l,iq)=pq(ig,l,iq)+pdq(ig,l,iq)*ptimestep
231          ENDDO
232        ENDDO
233      ENDDO
234c-----Effective temperature calculation
235      IF (CLFvarying) THEN
236         spant=3.0 ! delta T for the temprature distribution
237         mincloud=0.1 ! min cloudfrac when there is ice
238         IF (flagcloud) THEN
239             write(*,*) "Delta T", spant
240             write(*,*) "mincloud", mincloud
241             flagcloud=.false.
242         END IF
243         !CALL watersat(ngrid*nlay,ztclf,pplay,zqsat) !MV17: we dont need zqsat in the CLFvarying scheme
244         zqvap=zqclf(:,:,igcm_h2o_vap)
245         zqice=zqclf(:,:,igcm_h2o_ice)
246         CALL tcondwater(ngrid*nlay,pplay,zqvap+zqice,tcond)
247         DO l=1,nlay
248           DO ig=1,ngrid
249              zdelt=spant !MAX(spant*ztclf(ig,l),1.e-12), now totally in K. Fixed width
250              IF (tcond(ig,l) .ge. (ztclf(ig,l)+zdelt)) THEN
251                 pteff(ig,l)=ztclf(ig,l)
252                 cloudfrac(ig,l)=1.
253              ELSE IF (tcond(ig,l) .le. (ztclf(ig,l)-zdelt)) THEN
254                 pteff(ig,l)=ztclf(ig,l)-zdelt
255                 cloudfrac(ig,l)=mincloud
256              ELSE
257                 cloudfrac(ig,l)=(tcond(ig,l)-ztclf(ig,l)+zdelt)/
258     &                           (2.0*zdelt)
259                 pteff(ig,l)=(tcond(ig,l)+ztclf(ig,l)-zdelt)/2.
260              END IF
261              pteff(ig,l)=pteff(ig,l)-pdt(ig,l)*ptimestep
262              IF (cloudfrac(ig,l).le.mincloud) THEN !MV17: replaced .le.0 by .le.mincloud
263                 cloudfrac(ig,l)=mincloud
264              ELSE IF (cloudfrac(ig,l).gt.1) THEN
265                 cloudfrac(ig,l)=1.
266              END IF
267           ENDDO
268         ENDDO
269c-----Calculation of the total cloud coverage of the column
270         DO ig=1,ngrid
271            totcloudfrac(ig) = 0.
272            norm=0.
273            DO l=1,nlay
274               ponder=zqice(ig,l)*(pplev(ig,l) - pplev(ig,l+1))
275               totcloudfrac(ig) = totcloudfrac(ig)
276     &                   + cloudfrac(ig,l)*ponder
277               norm=norm+ponder
278            ENDDO
279            totcloudfrac(ig)=MAX(totcloudfrac(ig)/norm,1.e-12) ! min value if NaNs
280         ENDDO
281c-----Effective tracers quantities in the cloud fraction
282         IF (microphys) THEN
283            pqeff(:,:,igcm_ccn_mass)=pq(:,:,igcm_ccn_mass)/
284     &                              cloudfrac(:,:)
285            pqeff(:,:,igcm_ccn_number)=pq(:,:,igcm_ccn_number)/
286     &                              cloudfrac(:,:)
287         END IF ! end if (microphys)
288         pqeff(:,:,igcm_h2o_ice)=pq(:,:,igcm_h2o_ice)/
289     &                           cloudfrac(:,:)
290      !! CLFvarying outputs
291!      CALL write_output('pqeffice','pqeffice',
292!     &             'kg/kg',pqeff(:,:,igcm_h2o_ice))
293!      CALL write_output('pteff','pteff',
294!     &             'K',pteff(:,:))
295!      CALL write_output('tcond','tcond',
296!     &             'K',tcond(:,:))
297!      CALL write_output('cloudfrac','cloudfrac',
298!     &             'K',cloudfrac(:,:))
299      END IF ! end if (CLFvarying)
300c------------------------------------------------------------------
301c Cloud physics (nucleation, condensation / sublimation)
302c------------------------------------------------------------------
303      rhocloud(1:ngrid,1:nlay) = rho_dust
304
305c     Initialisation of all the stuff (JN,2023)
306      zt_micro(:,:)=pt(:,:)
307      zq_micro(:,:,:)=pq(:,:,:)
308
309c-------------------------------------------------------------------
310c   1.  Main call to the different cloud schemes:
311c------------------------------------------------
312c ds.
313      IF (microphys) THEN
314           CALL improvedclouds(ngrid,nlay,ptimestep,
315     &          pplay,pt,pdt,pq,pdq,nq,tauscaling,imicro,
316     &          zt_micro,zq_micro)
317
318      ELSE
319
320c Specific loop for simpleclouds.
321       DO l=1,nlay
322         DO ig=1,ngrid
323           CALL simpleclouds(ngrid,nlay,ptimestep,
324     &             pplay,pzlay,pteff,sum_subpdt,
325     &             pqeff,sum_subpdq,subpdqcloud,subpdtcloud,
326     &             nq,tau,rice)
327c-------------------------------------------------------------------
328c   2.  Updating tracers and temperature after cloud scheme:
329c   For improved clouds (with microphysics) this is done directly
330c   in the microphysics, during the subtimestep
331c   I put it like that to be retrocompatible (JN)
332c-----------------------------------------------
333
334            zq_micro(ig,l,igcm_h2o_ice) =
335     &       zq_micro(ig,l,igcm_h2o_ice)+
336     &         (pdq(ig,l,igcm_h2o_ice)
337     &        + subpdqcloud(ig,l,igcm_h2o_ice))*ptimestep
338            zq_micro(ig,l,igcm_h2o_vap) =
339     &       zq_micro(ig,l,igcm_h2o_vap)+
340     &         (pdq(ig,l,igcm_h2o_vap)
341     &        + subpdqcloud(ig,l,igcm_h2o_vap))*ptimestep
342
343            IF (hdo) THEN
344            zq_micro(ig,l,igcm_hdo_ice) =
345     &       zq_micro(ig,l,igcm_hdo_ice)+
346     &         (pdq(ig,l,igcm_hdo_ice)
347     &        + subpdqcloud(ig,l,igcm_hdo_ice))*ptimestep
348            zq_micro(ig,l,igcm_hdo_vap) =
349     &       zq_micro(ig,l,igcm_hdo_vap)+
350     &         (pdq(ig,l,igcm_hdo_vap)
351     &        + subpdqcloud(ig,l,igcm_hdo_vap))*ptimestep
352            ENDIF ! hdo
353
354c  Could also set subpdtcloud to 0 if not activice to make it simpler
355c  or change name of the flag
356            IF (activice) THEN
357                zt_micro(ig,l) = zt_micro(ig,l)+
358     &             subpdtcloud(ig,l)*ptimestep
359            ENDIF
360
361         ENDDO !ig=1,ngrid
362       ENDDO !l=1,nlay
363      ENDIF
364
365
366     
367c-------------------------------------------------------------------
368c   3.  Compute final tendencies after time loop:
369c------------------------------------------------
370
371c------ Temperature tendency pdtcloud
372       DO l=1,nlay
373         DO ig=1,ngrid
374         pdtcloud(ig,l) = -pdt(ig,l)+
375     &        (zt_micro(ig,l)-pt(ig,l)) / ptimestep
376         ENDDO
377       ENDDO
378
379c------ Tracers tendencies pdqcloud
380       DO l=1,nlay
381         DO ig=1,ngrid
382            pdqcloud(ig,l,igcm_h2o_ice) =
383     &        -pdq(ig,l,igcm_h2o_ice)+
384     &       (zq_micro(ig,l,igcm_h2o_ice) -
385     &        pq(ig,l,igcm_h2o_ice)) / ptimestep
386            pdqcloud(ig,l,igcm_h2o_vap) =
387     &        -pdq(ig,l,igcm_h2o_vap)+
388     &       (zq_micro(ig,l,igcm_h2o_vap) -
389     &        pq(ig,l,igcm_h2o_vap)) / ptimestep
390            IF (hdo) THEN
391            pdqcloud(ig,l,igcm_hdo_ice) =
392     &        -pdq(ig,l,igcm_hdo_ice)+
393     &       (zq_micro(ig,l,igcm_hdo_ice) -
394     &        pq(ig,l,igcm_hdo_ice)) / ptimestep
395            pdqcloud(ig,l,igcm_hdo_vap) =
396     &        -pdq(ig,l,igcm_hdo_vap)+
397     &       (zq_micro(ig,l,igcm_hdo_vap) -
398     &        pq(ig,l,igcm_hdo_vap)) / ptimestep
399            ENDIF !hdo
400         ENDDO
401       ENDDO       
402
403       IF(microphys) THEN
404        DO l=1,nlay
405         DO ig=1,ngrid
406            pdqcloud(ig,l,igcm_ccn_mass) =
407     &        -pdq(ig,l,igcm_ccn_mass)+
408     &       (zq_micro(ig,l,igcm_ccn_mass) -
409     &        pq(ig,l,igcm_ccn_mass)) / ptimestep
410            pdqcloud(ig,l,igcm_ccn_number) =
411     &        -pdq(ig,l,igcm_ccn_number)+
412     &       (zq_micro(ig,l,igcm_ccn_number) -
413     &        pq(ig,l,igcm_ccn_number)) / ptimestep
414         ENDDO
415        ENDDO
416       ENDIF
417
418       IF(scavenging) THEN
419        DO l=1,nlay
420         DO ig=1,ngrid
421            pdqcloud(ig,l,igcm_dust_mass) =
422     &        -pdq(ig,l,igcm_dust_mass)+
423     &       (zq_micro(ig,l,igcm_dust_mass) -
424     &        pq(ig,l,igcm_dust_mass)) / ptimestep
425            pdqcloud(ig,l,igcm_dust_number) =
426     &        -pdq(ig,l,igcm_dust_number)+
427     &       (zq_micro(ig,l,igcm_dust_number) -
428     &        pq(ig,l,igcm_dust_number)) / ptimestep
429         ENDDO
430        ENDDO
431       ENDIF
432
433c------- Due to stepped entry, other processes tendencies can add up to negative values
434c------- Therefore, enforce positive values and conserve mass
435       IF(microphys) THEN
436        DO l=1,nlay
437         DO ig=1,ngrid
438          IF ((pq(ig,l,igcm_ccn_number) +
439     &      ptimestep* (pdq(ig,l,igcm_ccn_number) +
440     &        pdqcloud(ig,l,igcm_ccn_number)) .le. 1.)
441     &   .or. (pq(ig,l,igcm_ccn_mass) +
442     &      ptimestep* (pdq(ig,l,igcm_ccn_mass) +
443     &        pdqcloud(ig,l,igcm_ccn_mass)) .le. 1.e-20)) THEN
444         pdqcloud(ig,l,igcm_ccn_number) =
445     &     - pq(ig,l,igcm_ccn_number)/ptimestep
446     &     - pdq(ig,l,igcm_ccn_number) + 1.
447         pdqcloud(ig,l,igcm_dust_number) = 
448     &     -pdqcloud(ig,l,igcm_ccn_number)
449         pdqcloud(ig,l,igcm_ccn_mass) =
450     &     - pq(ig,l,igcm_ccn_mass)/ptimestep
451     &     - pdq(ig,l,igcm_ccn_mass) + 1.e-20
452         pdqcloud(ig,l,igcm_dust_mass) =
453     &     -pdqcloud(ig,l,igcm_ccn_mass)
454          ENDIF
455         ENDDO
456        ENDDO
457       ENDIF
458
459       IF(scavenging) THEN
460        DO l=1,nlay
461         DO ig=1,ngrid
462          IF ((pq(ig,l,igcm_dust_number) +
463     &      ptimestep* (pdq(ig,l,igcm_dust_number) +
464     &        pdqcloud(ig,l,igcm_dust_number)) .le. 1.)
465     &   .or. (pq(ig,l,igcm_dust_mass) +
466     &      ptimestep* (pdq(ig,l,igcm_dust_mass) +
467     &        pdqcloud(ig,l,igcm_dust_mass)) .le. 1.e-20)) THEN
468         pdqcloud(ig,l,igcm_dust_number) =
469     &     - pq(ig,l,igcm_dust_number)/ptimestep
470     &     - pdq(ig,l,igcm_dust_number) + 1.
471         pdqcloud(ig,l,igcm_ccn_number) = 
472     &     -pdqcloud(ig,l,igcm_dust_number)
473         pdqcloud(ig,l,igcm_dust_mass) =
474     &     - pq(ig,l,igcm_dust_mass)/ptimestep
475     &     - pdq(ig,l,igcm_dust_mass) + 1.e-20
476         pdqcloud(ig,l,igcm_ccn_mass) =
477     &     -pdqcloud(ig,l,igcm_dust_mass)
478          ENDIF
479         ENDDO
480        ENDDO
481       ENDIF
482
483        DO l=1,nlay
484         DO ig=1,ngrid
485
486          IF (pq(ig,l,igcm_h2o_ice) + ptimestep*
487     &       (pdq(ig,l,igcm_h2o_ice) + pdqcloud(ig,l,igcm_h2o_ice))
488     &       .le. qperemin) THEN
489           pdqcloud(ig,l,igcm_h2o_ice) =
490     &     - pq(ig,l,igcm_h2o_ice)/ptimestep - pdq(ig,l,igcm_h2o_ice)
491           pdqcloud(ig,l,igcm_h2o_vap) = -pdqcloud(ig,l,igcm_h2o_ice)
492             if (hdo) then
493           pdqcloud(ig,l,igcm_hdo_ice) =
494     &     - pq(ig,l,igcm_hdo_ice)/ptimestep - pdq(ig,l,igcm_hdo_ice)
495           pdqcloud(ig,l,igcm_hdo_vap) = -pdqcloud(ig,l,igcm_hdo_ice)
496             endif
497          ENDIF
498          IF (pq(ig,l,igcm_h2o_vap) + ptimestep*
499     &       (pdq(ig,l,igcm_h2o_vap) + pdqcloud(ig,l,igcm_h2o_vap))
500     &       .le. qperemin) THEN
501           pdqcloud(ig,l,igcm_h2o_vap) =
502     &     - pq(ig,l,igcm_h2o_vap)/ptimestep - pdq(ig,l,igcm_h2o_vap)
503           pdqcloud(ig,l,igcm_h2o_ice) = -pdqcloud(ig,l,igcm_h2o_vap)
504             if (hdo) then
505           pdqcloud(ig,l,igcm_hdo_vap) =
506     &     - pq(ig,l,igcm_hdo_vap)/ptimestep - pdq(ig,l,igcm_hdo_vap)
507           pdqcloud(ig,l,igcm_hdo_ice) = -pdqcloud(ig,l,igcm_hdo_vap)
508             endif
509          ENDIF
510
511         ENDDO
512        ENDDO
513
514c------Update the ice and dust particle size "rice" for output or photochemistry
515c------Only rsedcloud is used for the water cycle
516
517      IF(scavenging) THEN
518        DO l=1, nlay
519         DO ig=1,ngrid
520
521        call updaterdust(
522     &    pq(ig,l,igcm_dust_mass) +                   ! dust mass
523     &   (pdq(ig,l,igcm_dust_mass) +                  ! dust mass
524     &    pdqcloud(ig,l,igcm_dust_mass))*ptimestep,   ! dust mass
525     &    pq(ig,l,igcm_dust_number) +                 ! dust number
526     &   (pdq(ig,l,igcm_dust_number) +                ! dust number
527     &    pdqcloud(ig,l,igcm_dust_number))*ptimestep, ! dust number
528     &    rdust(ig,l))
529
530         ENDDO
531        ENDDO
532      ENDIF
533
534      IF(microphys) THEN
535
536       ! In case one does not want to allow supersatured water when using microphysics.
537       ! Not done by default.
538       IF(.not.supersat) THEN
539!       !! initial mixing ratios for initial D/H ratio calculation
540        zq0(:,:,:) = pq(:,:,:) + pdq(:,:,:)*ptimestep
541        zt  = pt + (pdt+pdtcloud)*ptimestep
542        call watersat(ngrid*nlay,zt,pplay,zqsat)
543        DO l=1, nlay
544         DO ig=1,ngrid
545          IF (pq(ig,l,igcm_h2o_vap)
546     &      + (pdq(ig,l,igcm_h2o_vap) + pdqcloud(ig,l,igcm_h2o_vap))
547     &      * ptimestep .ge. zqsat(ig,l)) THEN
548             pdqcloud(ig,l,igcm_h2o_vap) =
549     &         (zqsat(ig,l) - pq(ig,l,igcm_h2o_vap))/ptimestep
550     &        - pdq(ig,l,igcm_h2o_vap)
551             pdqcloud(ig,l,igcm_h2o_ice) =
552     &         -pdqcloud(ig,l,igcm_h2o_vap)
553!            !! HDO ice flux has to be modified in consequence
554             IF (hdo) THEN
555!               !! Logically only condensation can happen in this case
556               IF (pdqcloud(ig,l,igcm_h2o_ice) .gt. 0.0) THEN
557                 IF ( zq0(ig,l,igcm_h2o_vap) .gt. qperemin ) THEN
558!            !! Lamb et al. 2017
559             alpha(ig,l) = exp(13525./zt(ig,l)**2.-5.59d-2)
560             pdqcloud(ig,l,igcm_hdo_ice) =
561     &         pdqcloud(ig,l,igcm_h2o_ice)*alpha(ig,l)*
562     &         ( zq0(ig,l,igcm_hdo_vap)
563     &           /zq0(ig,l,igcm_h2o_vap) )
564             pdqcloud(ig,l,igcm_hdo_ice) =
565     &            min(pdqcloud(ig,l,igcm_hdo_ice),
566     &              zq0(ig,l,igcm_hdo_vap)/ptimestep)
567                 ELSE
568             pdqcloud(ig,l,igcm_hdo_ice) = 0.
569                 ENDIF
570               !! sublimation
571               ELSE
572                 IF ( zq0(ig,l,igcm_h2o_ice) .gt. qperemin ) THEN
573             pdqcloud(ig,l,igcm_hdo_ice) =
574     &         pdqcloud(ig,l,igcm_h2o_ice)*
575     &         ( zq0(ig,l,igcm_hdo_ice)
576     &           /zq0(ig,l,igcm_h2o_ice) )
577             pdqcloud(ig,l,igcm_hdo_ice) =
578     &          max(pdqcloud(ig,l,igcm_hdo_ice),
579     &            -zq0(ig,l,igcm_hdo_ice)/ptimestep)
580                 ELSE
581             pdqcloud(ig,l,igcm_hdo_ice) = 0.
582                 ENDIF
583               ENDIF !IF (pdqcloud(ig,l,igcm_h2o_ice).gt.0.)
584             pdqcloud(ig,l,igcm_hdo_vap) =
585     &            -pdqcloud(ig,l,igcm_hdo_ice)
586             ENDIF !IF (hdo)
587             ! no need to correct ccn_number, updaterad can handle this properly.
588          ENDIF
589         ENDDO
590        ENDDO       
591       ENDIF
592       
593       DO l=1, nlay
594         DO ig=1,ngrid
595
596        call updaterice_micro(
597     &    pq(ig,l,igcm_h2o_ice) +                    ! ice mass
598     &   (pdq(ig,l,igcm_h2o_ice) +                   ! ice mass
599     &    pdqcloud(ig,l,igcm_h2o_ice))*ptimestep,    ! ice mass
600     &    pq(ig,l,igcm_ccn_mass) +                   ! ccn mass
601     &   (pdq(ig,l,igcm_ccn_mass) +                  ! ccn mass
602     &    pdqcloud(ig,l,igcm_ccn_mass))*ptimestep,   ! ccn mass
603     &    pq(ig,l,igcm_ccn_number) +                 ! ccn number
604     &   (pdq(ig,l,igcm_ccn_number) +                ! ccn number
605     &    pdqcloud(ig,l,igcm_ccn_number))*ptimestep, ! ccn number
606     &    tauscaling(ig),rice(ig,l),rhocloud(ig,l))
607         
608         ENDDO
609       ENDDO
610       
611      ELSE ! no microphys
612       
613        DO l=1,nlay
614          DO ig=1,ngrid
615         
616        call updaterice_typ(
617     &    pq(ig,l,igcm_h2o_ice) +                    ! ice mass
618     &   (pdq(ig,l,igcm_h2o_ice) +                   ! ice mass
619     &    pdqcloud(ig,l,igcm_h2o_ice))*ptimestep,    ! ice mass
620     &    tau(ig,1),pzlay(ig,l),rice(ig,l))
621
622          ENDDO
623         ENDDO
624       
625       ENDIF ! of IF(microphys)
626     
627     
628     
629c     A correction if a lot of subliming CO2 fills the 1st layer FF04/2005
630c     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
631c     Then that should not affect the ice particle radius
632      do ig=1,ngrid
633        if(pdpsrf(ig)*ptimestep.gt.0.9*(pplev(ig,1)-pplev(ig,2)))then
634          if(pdpsrf(ig)*ptimestep.gt.0.9*(pplev(ig,1)-pplev(ig,3)))
635     &    rice(ig,2)=rice(ig,3)
636          rice(ig,1)=rice(ig,2)
637        end if
638      end do
639       
640       
641       DO l=1,nlay
642         DO ig=1,ngrid
643           rsedcloud(ig,l)=max(rice(ig,l)*
644     &                 (1.+nuice_sed)*(1.+nuice_sed)*(1.+nuice_sed),
645     &                    rdust(ig,l))
646!          rsedcloud(ig,l)=min(rsedcloud(ig,l),1.e-4)
647         ENDDO
648       ENDDO
649       
650! used for rad. transfer calculations
651! nuice is constant because a lognormal distribution is prescribed
652      nuice(1:ngrid,1:nlay)=nuice_ref
653
654c------Update tendencies for sub-grid water ice clouds
655      IF (CLFvarying) THEN
656        DO ig=1,ngrid
657          DO l=1,nlay
658            pdqcloud(ig,l,igcm_dust_mass)=pdqcloud(ig,l,igcm_dust_mass)
659     &          *cloudfrac(ig,l)
660            pdqcloud(ig,l,igcm_ccn_mass)=pdqcloud(ig,l,igcm_ccn_mass)
661     &          *cloudfrac(ig,l)
662            pdqcloud(ig,l,igcm_dust_number)=pdqcloud(ig,l,
663     &           igcm_dust_number) *cloudfrac(ig,l)
664            pdqcloud(ig,l,igcm_ccn_number)=pdqcloud(ig,l,
665     &           igcm_ccn_number) *cloudfrac(ig,l)
666            pdqcloud(ig,l,igcm_h2o_vap)=pdqcloud(ig,l,
667     &           igcm_h2o_vap) *cloudfrac(ig,l)
668            pdqcloud(ig,l,igcm_h2o_ice)=pdqcloud(ig,l,
669     &           igcm_h2o_ice) *cloudfrac(ig,l)
670          ENDDO
671        ENDDO   
672        pdtcloud(:,:)=pdtcloud(:,:)*cloudfrac(:,:)
673      ENDIF
674#ifndef MESOSCALE
675c=======================================================================
676      call write_output("watercloud_pdqh2oice","pdqcloud_h2o_ice "//
677     &   "after microphysics","kg/kg.s-1",pdqcloud(:,:,igcm_h2o_ice))
678      call write_output("watercloud_pdqh2ovap","pdqcloud_h2o_vap "//
679     &   "after microphysics","kg/kg.s-1",pdqcloud(:,:,igcm_h2o_vap))
680      if (hdo) then
681        call write_output("watercloud_pdqhdoice","pdqcloud_hdo_ice "//
682     &     "after microphysics","kg/kg.s-1",pdqcloud(:,:,igcm_hdo_ice))
683        call write_output("watercloud_pdqhdovap","pdqcloud_hdo_vap "//
684     &     "after microphysics","kg/kg.s-1",pdqcloud(:,:,igcm_hdo_vap))
685      endif
686!      call write_output("pdqccn2","pdqcloudccn apres microphysique"
687!     &      ,"kg/kg.s-1",pdqcloud(:,:,
688!     &      igcm_ccn_mass))
689!      call write_output("pdqccnN2","pdqcloudccnN apres "//
690!     &      "microphysique","nb/kg.s-1",pdqcloud(:,:,
691!     &      igcm_ccn_number))
692!      call write_output("pdqdust2", "pdqclouddust apres "//
693!     &      "microphysique","kg/kg.s-1",pdqcloud(:,:,
694!     &      igcm_dust_mass))
695!      call write_output("pdqdustN2", "pdqclouddustN apres "//
696!     &      "microphysique","nb/kg.s-1",pdqcloud(:,:,
697!     &      igcm_dust_number))
698c=======================================================================
699#endif
700
701      END SUBROUTINE watercloud
702     
703      subroutine ini_watercloud_mod(ngrid,nlayer,nq)
704        implicit none
705 
706        integer,intent(in) :: ngrid ! number of atmospheric columns
707        integer,intent(in) :: nlayer ! number of atmospheric layers
708        integer,intent(in) :: nq ! number of tracers
709
710        allocate(zdqcloud(ngrid,nlayer,nq))
711        zdqcloud(:,:,:)=0
712        allocate(zdqscloud(ngrid,nq))
713        zdqscloud(:,:)=0
714
715       end subroutine ini_watercloud_mod
716
717
718       subroutine end_watercloud_mod
719         implicit none
720
721         if (allocated(zdqcloud))      deallocate(zdqcloud)
722         if (allocated(zdqscloud))      deallocate(zdqscloud)
723
724       end subroutine end_watercloud_mod
725
726
727
728      END MODULE watercloud_mod
Note: See TracBrowser for help on using the repository browser.