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

Last change on this file since 4063 was 4058, checked in by emillour, 7 days ago

Mars PCM:
Add a "output_diagfi" (default .true.) flag so that the user can decide if
a diagfi.nc file should be outputted.
Also do some cleaning around the few remaining calls to writediagfi
or reference to it througout the code; write_output() should be used.
EM

File size: 8.7 KB
RevLine 
[3902]1      module simpleclouds_mod
2     
3      implicit none
4     
5      contains
6
[358]7      subroutine simpleclouds(ngrid,nlay,ptimestep,
[645]8     &             pplay,pzlay,pt,pdt,
[520]9     &             pq,pdq,pdqcloud,pdtcloud,
[633]10     &             nq,tau,rice)
[3726]11      USE updaterad, ONLY: updaterice_typ
[1996]12      USE watersat_mod, ONLY: watersat
[2312]13      use tracer_mod, only: igcm_h2o_vap, igcm_h2o_ice,
[2324]14     &                      igcm_hdo_vap, igcm_hdo_ice,
15     &                      qperemin
[3726]16      use comcstfi_h, only: cpp
[1246]17      use dimradmars_mod, only: naerkind
[3726]18      use callkeys_mod, only: hdo, hdofrac
[2312]19
[358]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:
[3902]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
[358]52
53c     Output:
[3902]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)
[358]60
61c------------------------------------------------------------------
62c     Local variables:
63
[1047]64      REAL rhocloud(ngrid,nlay)  ! Cloud density (kg.m-3)
[358]65
66      INTEGER ig,l
67
[1047]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
[358]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
[1047]75      real rdusttyp(ngrid,nlay) ! Typical dust geom. mean radius (m)
76      REAL ccntyp(ngrid,nlay)
[358]77                                      ! Typical dust number density (#/kg)
[2312]78      REAL alpha_c(ngrid,nlay) !!MARGAUX: alpha_c as a spatial variable
79
[358]80c     CCN reduction factor
[420]81c      REAL, PARAMETER :: ccn_factor = 4.5  !! comme TESTS_JB // 1. avant
[2312]82      REAL DoH_vap(ngrid,nlay)
83      REAL DoH_ice(ngrid,nlay)
[358]84c-----------------------------------------------------------------------
85c    1. initialisation
86c    -----------------
87
[3902]88c    Update values of water vapor and ice, and temperature.
[358]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)
[2312]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
[358]115        enddo
116      enddo
117
118      pdqcloud(1:ngrid,1:nlay,1:nq)=0
119      pdtcloud(1:ngrid,1:nlay)=0
120
[2312]121      alpha_c(1:ngrid,1:nlay)=0.
122
[358]123c     ----------------------------------------------
124c
[3902]125c     Compute saturation mixing ratio in each layer
[358]126c     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
127
[1047]128      call watersat(ngrid*nlay,zt,pplay,zqsat)
[358]129
[3902]130c     compute condensation rates (kg/kg/s-1) in each layer
[358]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
[2312]137            dzq=zq(ig,l,igcm_h2o_vap)-zqsat(ig,l)
138
[358]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
[2312]143           
[358]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
[2312]148       
[358]149        enddo ! of do ig=1,ngrid
150      enddo ! of do l=1,nlay
151
[2312]152
[3902]153c     Final tendency
[358]154c     ~~~~~~~~~~~~~~~
155      do l=1, nlay
[1047]156        do ig=1,ngrid
[358]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
[2312]161
[358]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
[2312]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?
[2378]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
[2312]171                else
172                alpha_c(ig,l) = 1.d0
173                endif
174               
[2324]175                if (zq0(ig,l,igcm_h2o_vap).gt.qperemin) then
[2312]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
[2324]193             if (zq0(ig,l,igcm_h2o_ice).gt.qperemin) then
[2312]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
[740]216c     ice crystal radius
217      do l=1, nlay
[1047]218        do ig=1,ngrid
[740]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
[358]224c------------------------------------------------------------------
[3902]225      end subroutine simpleclouds
226
227      end module simpleclouds_mod
Note: See TracBrowser for help on using the repository browser.