source: trunk/LMDZ.MARS/libf/phymars/simpleclouds_mod.F @ 4022

Last change on this file since 4022 was 4007, checked in by aslmd, 2 weeks ago

Mars GCM: some new modules are not named liked modules and this can cause problems with some compiling scripts (e.g. mesoscale model)

File size: 8.8 KB
Line 
1      module simpleclouds_mod
2     
3      implicit none
4     
5      contains
6
7      subroutine simpleclouds(ngrid,nlay,ptimestep,
8     &             pplay,pzlay,pt,pdt,
9     &             pq,pdq,pdqcloud,pdtcloud,
10     &             nq,tau,rice)
11      USE updaterad, ONLY: updaterice_typ
12      USE watersat_mod, ONLY: watersat
13      use tracer_mod, only: igcm_h2o_vap, igcm_h2o_ice,
14     &                      igcm_hdo_vap, igcm_hdo_ice,
15     &                      qperemin
16      use comcstfi_h, only: cpp
17      use dimradmars_mod, only: naerkind
18      use callkeys_mod, only: hdo, hdofrac
19
20      implicit none
21c------------------------------------------------------------------
22c  This routine is used to form clouds when a parcel of the GCM is
23c    saturated. It is a simplified scheme, and there is almost no
24c    microphysics involved. When the air is saturated, water-ice
25c    clouds form on a fraction of the dust particles, specified by
26c    the constant called "ccn_factor". There is no supersaturation,
27c    and no nucleation rates computed. A more accurate scheme can
28c    be found in the routine called "improvedclouds.F".
29
30c  Authors: Franck Montmessin (water ice scheme)
31c           Francois Forget (changed nuclei density & outputs)
32c           Ehouarn Millour (sept.2008, tracers are now handled
33c                                   by name and not fixed index)
34c           J.-B. Madeleine (developed a single routine called
35c                            simpleclouds.F, and corrected calculations
36c                            of the typical CCN profile, Oct. 2011)
37c------------------------------------------------------------------
38c     Arguments:
39c     ---------
40c     Inputs:
41      integer,intent(in) :: ngrid ! number of atmospheric columns
42      integer,intent(in) :: nlay ! number of atmospheric layers
43      integer,intent(in) :: nq  ! number of tracers
44      real,intent(in) :: ptimestep ! physics time step (s)
45      real,intent(in) :: pplay(ngrid,nlay) ! pressure at mid-layer (Pa)
46      real,intent(in) :: pzlay(ngrid,nlay) ! altitude of the layers (m)
47      real,intent(in) :: pt(ngrid,nlay) ! input temperature at mid-layer (K)
48      real,intent(in) :: pdt(ngrid,nlay) ! tendency on temperature from previous paramatrizations (K/s)
49      real,intent(in) :: pq(ngrid,nlay,nq) ! input tracer mixing ratio (kg/kg)
50      real,intent(in) :: pdq(ngrid,nlay,nq) ! tendency on tracers from previous parametrizations (kg/kg.s-1)
51      real,intent(in) :: tau(ngrid,naerkind) ! Column dust optical depth in each column
52
53c     Output:
54      real,intent(out) :: rice(ngrid,nlay) ! Water ice mass mean radius (m)
55                                   ! (r_c in montmessin_2004)
56      real,intent(out) :: pdqcloud(ngrid,nlay,nq) ! tendencies due to H2O condensation
57                                   !  and sublimation (kg/kg.s-1)
58      real,intent(out) :: pdtcloud(ngrid,nlay) ! tendency on temperature due
59                                   !  to latent heat (K/s)
60
61c------------------------------------------------------------------
62c     Local variables:
63
64      REAL rhocloud(ngrid,nlay)  ! Cloud density (kg.m-3)
65
66      INTEGER ig,l
67
68      REAL zq(ngrid,nlay,nq)    ! local value of tracers
69      REAL zq0(ngrid,nlay,nq)   ! local initial value of tracers
70      REAL zt(ngrid,nlay)       ! local value of temperature
71      REAL zqsat(ngrid,nlay)    ! saturation
72      REAL*8 dzq                      ! masse de glace echangee (kg/kg)
73      REAL lw                         !Latent heat of sublimation (J.kg-1)
74      REAL,PARAMETER :: To=273.15     ! reference temperature, T=273.15 K
75      real rdusttyp(ngrid,nlay) ! Typical dust geom. mean radius (m)
76      REAL ccntyp(ngrid,nlay)
77                                      ! Typical dust number density (#/kg)
78      REAL alpha_c(ngrid,nlay) !!MARGAUX: alpha_c as a spatial variable
79
80c     CCN reduction factor
81c      REAL, PARAMETER :: ccn_factor = 4.5  !! comme TESTS_JB // 1. avant
82      REAL DoH_vap(ngrid,nlay)
83      REAL DoH_ice(ngrid,nlay)
84c-----------------------------------------------------------------------
85c    1. initialisation
86c    -----------------
87
88c    Update values of water vapor and ice, and temperature.
89
90      do l=1,nlay
91        do ig=1,ngrid
92          zq(ig,l,igcm_h2o_vap)=
93     &      pq(ig,l,igcm_h2o_vap)+pdq(ig,l,igcm_h2o_vap)*ptimestep
94          zq(ig,l,igcm_h2o_vap)=max(zq(ig,l,igcm_h2o_vap),1.E-30) ! FF 12/2004
95          zq0(ig,l,igcm_h2o_vap)=zq(ig,l,igcm_h2o_vap)
96          zt(ig,l)=pt(ig,l)+ pdt(ig,l)*ptimestep
97
98          zq(ig,l,igcm_h2o_ice)=
99     &      pq(ig,l,igcm_h2o_ice)+pdq(ig,l,igcm_h2o_ice)*ptimestep
100          zq(ig,l,igcm_h2o_ice)=max(zq(ig,l,igcm_h2o_ice),0.) ! FF 12/2004
101          zq0(ig,l,igcm_h2o_ice)=zq(ig,l,igcm_h2o_ice)
102
103          if (hdo) then
104          zq(ig,l,igcm_hdo_vap)=
105     &      pq(ig,l,igcm_hdo_vap)+pdq(ig,l,igcm_hdo_vap)*ptimestep
106          zq(ig,l,igcm_hdo_vap)=max(zq(ig,l,igcm_hdo_vap),1e-30) ! FF 12/2004
107          zq0(ig,l,igcm_hdo_vap)=zq(ig,l,igcm_hdo_vap)
108
109          zq(ig,l,igcm_hdo_ice)=
110     &      pq(ig,l,igcm_hdo_ice)+pdq(ig,l,igcm_hdo_ice)*ptimestep
111          zq(ig,l,igcm_hdo_ice)=max(zq(ig,l,igcm_hdo_ice),1e-30) ! FF 12/2004
112          zq0(ig,l,igcm_hdo_ice)=zq(ig,l,igcm_hdo_ice)
113
114          endif !hdo
115        enddo
116      enddo
117
118      pdqcloud(1:ngrid,1:nlay,1:nq)=0
119      pdtcloud(1:ngrid,1:nlay)=0
120
121      alpha_c(1:ngrid,1:nlay)=0.
122
123c     ----------------------------------------------
124c
125c     Compute saturation mixing ratio in each layer
126c     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
127
128      call watersat(ngrid*nlay,zt,pplay,zqsat)
129
130c     compute condensation rates (kg/kg/s-1) in each layer
131c     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
132
133      do l=1,nlay
134        do ig=1,ngrid
135
136          if (zq(ig,l,igcm_h2o_vap).ge.zqsat(ig,l))then  !  Condensation
137            dzq=zq(ig,l,igcm_h2o_vap)-zqsat(ig,l)
138
139          elseif(zq(ig,l,igcm_h2o_vap).lt.zqsat(ig,l))then  ! Sublimation
140            dzq=-min(zqsat(ig,l)-zq(ig,l,igcm_h2o_vap),
141     &               zq(ig,l,igcm_h2o_ice))
142          endif
143           
144c         Water Mass change
145c         ~~~~~~~~~~~~~~~~~
146          zq(ig,l,igcm_h2o_ice)=zq(ig,l,igcm_h2o_ice)+dzq
147          zq(ig,l,igcm_h2o_vap)=zq(ig,l,igcm_h2o_vap)-dzq
148       
149        enddo ! of do ig=1,ngrid
150      enddo ! of do l=1,nlay
151
152
153c     Final tendency
154c     ~~~~~~~~~~~~~~~
155      do l=1, nlay
156        do ig=1,ngrid
157          pdqcloud(ig,l,igcm_h2o_vap)=(zq(ig,l,igcm_h2o_vap)
158     &                            -zq0(ig,l,igcm_h2o_vap))/ptimestep
159          pdqcloud(ig,l,igcm_h2o_ice) =
160     &      (zq(ig,l,igcm_h2o_ice) - zq0(ig,l,igcm_h2o_ice))/ptimestep
161
162          lw=(2834.3-0.28*(zt(ig,l)-To)-0.004*(zt(ig,l)-To)**2)*1.e+3
163          pdtcloud(ig,l)=-pdqcloud(ig,l,igcm_h2o_vap)*lw/cpp
164
165          if (hdo) then
166            if (pdqcloud(ig,l,igcm_h2o_ice).gt.0.0) then !condens
167
168                if (hdofrac) then ! do we use fractionation?
169c               alpha_c(ig,l) = exp(16288./zt(ig,l)**2.-9.34d-2)
170                alpha_c(ig,l) = exp(13525./zt(ig,l)**2.-5.59d-2)  !Lamb
171                else
172                alpha_c(ig,l) = 1.d0
173                endif
174               
175                if (zq0(ig,l,igcm_h2o_vap).gt.qperemin) then
176                  pdqcloud(ig,l,igcm_hdo_ice)=
177     &              pdqcloud(ig,l,igcm_h2o_ice)*alpha_c(ig,l)*
178     &         ( zq0(ig,l,igcm_hdo_vap)
179     &                 /zq0(ig,l,igcm_h2o_vap) )
180                else
181                   pdqcloud(ig,l,igcm_hdo_ice)= 0.0
182                endif
183
184                pdqcloud(ig,l,igcm_hdo_ice) =
185     &            min(pdqcloud(ig,l,igcm_hdo_ice),
186     &              zq0(ig,l,igcm_hdo_vap)/ptimestep)
187
188                pdqcloud(ig,l,igcm_hdo_vap)=
189     &               -pdqcloud(ig,l,igcm_hdo_ice)       
190
191          else  ! sublimation
192
193             if (zq0(ig,l,igcm_h2o_ice).gt.qperemin) then
194                pdqcloud(ig,l,igcm_hdo_ice)=
195     &               pdqcloud(ig,l,igcm_h2o_ice)*
196     &      ( zq0(ig,l,igcm_hdo_ice)
197     &              /zq0(ig,l,igcm_h2o_ice) )
198             else
199                pdqcloud(ig,l,igcm_hdo_ice)= 0.
200             endif
201
202              pdqcloud(ig,l,igcm_hdo_ice) =
203     &          max(pdqcloud(ig,l,igcm_hdo_ice),
204     &            -zq0(ig,l,igcm_hdo_ice)/ptimestep)
205
206              pdqcloud(ig,l,igcm_hdo_vap)=
207     &             -pdqcloud(ig,l,igcm_hdo_ice)       
208
209            endif ! condensation/sublimation
210
211          endif ! hdo
212
213        enddo ! of do ig=1,ngrid
214      enddo ! of do l=1,nlay
215
216c     ice crystal radius
217      do l=1, nlay
218        do ig=1,ngrid
219          call updaterice_typ(zq(ig,l,igcm_h2o_ice),
220     &       tau(ig,1),pzlay(ig,l),rice(ig,l))
221        end do
222      end do
223
224c     if (hdo) then
225c           CALL WRITEDIAGFI(ngrid,'alpha_c',
226c    &                       'alpha_c',
227c    &                       ' ',3,alpha_c)
228c     endif !hdo
229c------------------------------------------------------------------
230      end subroutine simpleclouds
231
232      end module simpleclouds_mod
Note: See TracBrowser for help on using the repository browser.