source: trunk/LMDZ.TITAN/libf/muphytitan/mm_microphysic.f90 @ 4173

Last change on this file since 4173 was 4173, checked in by cpetetin, 5 weeks ago

TITAN PCM : evaporation and small conservation correction CP

File size: 13.6 KB
Line 
1! Copyright (2013-2015,2017,2022-2023) Université de Reims Champagne-Ardenne
2! Contributors : J. Burgalat (GSMA, URCA), B. de Batz de Trenquelléon (GSMA, URCA)
3! email of the author : jeremie.burgalat@univ-reims.fr
4!
5! This software is a computer program whose purpose is to compute
6! microphysics processes using a two-moments scheme.
7!
8! This library is governed by the CeCILL-B license under French law and
9! abiding by the rules of distribution of free software.  You can  use,
10! modify and/ or redistribute the software under the terms of the CeCILL-B
11! license as circulated by CEA, CNRS and INRIA at the following URL
12! "http://www.cecill.info".
13!
14! As a counterpart to the access to the source code and  rights to copy,
15! modify and redistribute granted by the license, users are provided only
16! with a limited warranty  and the software's author,  the holder of the
17! economic rights,  and the successive licensors  have only  limited
18! liability.
19!
20! In this respect, the user's attention is drawn to the risks associated
21! with loading,  using,  modifying and/or developing or reproducing the
22! software by the user in light of its specific status of free software,
23! that may mean  that it is complicated to manipulate,  and  that  also
24! therefore means  that it is reserved for developers  and  experienced
25! professionals having in-depth computer knowledge. Users are therefore
26! encouraged to load and test the software's suitability as regards their
27! requirements in conditions enabling the security of their systems and/or
28! data to be ensured and,  more generally, to use and operate it in the
29! same conditions as regards security.
30!
31! The fact that you are presently reading this means that you have had
32! knowledge of the CeCILL-B license and that you accept its terms.
33
34!! file: mm_microphysic.f90
35!! brief: Microphysic processes interface module.
36!! author: J. Burgalat
37!! date: 2013-2015,2017,2022-2023
38!! modifications: B. de Batz de Trenquelléon
39
40MODULE MM_MICROPHYSIC
41  !! Microphysic processes interface module.
42  USE MM_MPREC
43  USE MM_GLOBALS
44  USE MM_HAZE
45  USE MM_CLOUDS
46  USE MM_METHODS
47  IMPLICIT NONE
48
49  PRIVATE
50
51  PUBLIC :: mm_muphys, mm_diagnostics, mm_get_radii
52
53  !! Interface to main microphysics subroutine.
54  !!
55  !! The interface computes calls either all the microphysics processes ([[mm_microphysic(module):muphys_all(function)]]
56  !! or only aerosols microphysics ([[mm_microphysic(module):muphys_nocld(function)]]) in a single call.
57  INTERFACE mm_muphys
58    MODULE PROCEDURE muphys_all, muphys_nocld
59  END INTERFACE mm_muphys
60
61CONTAINS
62
63
64
65  FUNCTION muphys_all(dm0a_s,dm3a_s,dm0a_f,dm3a_f,dm0n,dm3n,dm3i,dgazs,dtlc) RESULT(ret)
66    !! Compute the evolution of moments tracers through haze and clouds microphysics processes.
67    !!
68    !! This method computes the evolution of all the microphysics tracers, given under the form of moments
69    !! (and molar fraction for cloud condensible species) during a time step.
70    !!
71    !! The method requires that global variables of the model (i.e. variables declared in [[mm_globals(module)]]
72    !! module) are initialized/updated correctly (see [[mm_globals(module):mm_global_init(interface)]],
73    !! [[mm_globals(module):mm_column_init(function)]],[[mm_globals(module):mm_aerosols_init(function)]] and
74    !! [[mm_globals(module):mm_clouds_init(function)]]).
75    !!
76    !! The tendencies returned by the method are defined on the vertical __layers__ of the model from the __GROUND__ to
77    !! the __TOP__ of the atmosphere. They should be added to the input variables used in the initialization methods
78    !! before the latter are called to initialize a new step.
79    !! @note
80    !! __dm3i__ and __dgazs__ are 2D-arrays with vertical __layers__ in the 1st dimension and the number of
81    !! ice components in the 2nd. They share the same _species_ indexing.
82    !!
83    !! It should be a 2D-array with the vertical layers in first dimension and the number of ice components in the second.
84    REAL(kind=mm_wp), INTENT(out), DIMENSION(:)   :: dm0a_s
85    !! Tendency of the 0th order moment of the spherical mode distribution (\(m^{-2}\)).
86    REAL(kind=mm_wp), INTENT(out), DIMENSION(:)   :: dm3a_s
87    !! Tendency of the 3rd order moment of the spherical mode distribution (\(m^{3}.m^{-2}\)).
88    REAL(kind=mm_wp), INTENT(out), DIMENSION(:)   :: dm0a_f
89    !! Tendency of the 0th order moment of the fractal mode distribution (\(m^{-2}\)).
90    REAL(kind=mm_wp), INTENT(out), DIMENSION(:)   :: dm3a_f
91    !! Tendency of the 3rd order moment of the fractal mode distribution (\(m^{3}.m^{-2}\)).
92    REAL(kind=mm_wp), INTENT(out), DIMENSION(:)   :: dm0n
93    !! Tendency of the 0th order moment of the _CCN_ distribution (\(m^{-2}\)).
94    REAL(kind=mm_wp), INTENT(out), DIMENSION(:)   :: dm3n
95    !! Tendency of the 3rd order moment of the _CCN_ distribution (\(m^{3}.m^{-2}\)).
96    REAL(kind=mm_wp), INTENT(out), DIMENSION(:,:) :: dm3i
97    !! Tendencies of the 3rd order moments of each ice components (\(m^{3}.m^{-2}\)).
98    REAL(kind=mm_wp), INTENT(out), DIMENSION(:,:) :: dgazs
99    !! Tendencies of each condensible gaz species (\(mol.mol^{-1}\)).
100    REAL(kind=mm_wp), INTENT(out), DIMENSION(:) :: dtlc
101    !! Temperature tendencies due to condensation/evaporation (\(K.s^{-1}\)).
102    LOGICAL :: ret
103    !! .true. on success (i.e. model has been initialized at least once previously), .false. otherwise.
104    REAL(kind=mm_wp), DIMENSION(SIZE(dm0a_s)) :: zdm0a_f,zdm3a_f
105    INTEGER                                   :: i
106    ! Checks initialization
107    ret = (mm_ini_col.AND.mm_ini_aer.AND.(.NOT.mm_w_clouds.OR.mm_ini_cld))
108    IF (.NOT.ret) RETURN
109    ! Calls haze microphysics (-> m-3)
110    call mm_haze_microphysics(dm0a_s,dm3a_s,dm0a_f,dm3a_f)
111    IF (mm_w_clouds) THEN
112      ! Calls cloud microphysics (-> m-3)
113      call mm_cloud_microphysics(zdm0a_f,zdm3a_f,dm0n,dm3n,dm3i,dgazs,dtlc)
114      ! add temporary aerosols tendencies (-> m-3)
115      dm0a_f = dm0a_f + zdm0a_f  ; dm3a_f = dm3a_f + zdm3a_f
116      ! reverse directly clouds tendencies (-> m-2)
117      dm0n   = dm0n(mm_nla:1:-1) * mm_dzlev(mm_nla:1:-1)
118      dm3n   = dm3n(mm_nla:1:-1) * mm_dzlev(mm_nla:1:-1)
119      DO i=1,mm_nesp
120        dm3i(:,i)  = dm3i(mm_nla:1:-1,i) * mm_dzlev(mm_nla:1:-1)
121        dgazs(:,i) = dgazs(mm_nla:1:-1,i)
122      ENDDO
123      dtlc   = dtlc(mm_nla:1:-1)
124    ELSE
125      dm0n = 0._mm_wp ; dm3n = 0._mm_wp ; dm3i = 0._mm_wp ; dgazs = 0._mm_wp ; dtlc = 0._mm_wp
126    ENDIF
127    ! multiply by altitude thickness and reverse vectors so they go from ground to top :)
128    dm0a_s = dm0a_s(mm_nla:1:-1) * mm_dzlev(mm_nla:1:-1)
129    dm3a_s = dm3a_s(mm_nla:1:-1) * mm_dzlev(mm_nla:1:-1)
130    dm0a_f = dm0a_f(mm_nla:1:-1) * mm_dzlev(mm_nla:1:-1)
131    dm3a_f = dm3a_f(mm_nla:1:-1) * mm_dzlev(mm_nla:1:-1)
132    RETURN
133  END FUNCTION muphys_all
134
135  FUNCTION muphys_nocld(dm0a_s,dm3a_s,dm0a_f,dm3a_f) RESULT(ret)
136    !! Compute the evolution of moments tracers through haze microphysics only.
137    !!
138    !! This method is a __light__ version of [[mm_microphysic(module):muphys_all(function)]] where
139    !! only haze microphysics is computed and its tendencies returned.
140    !!
141    !! The method has the same requirements and remarks than [[mm_microphysic(module):muphys_all(function)]].
142    REAL(kind=mm_wp), INTENT(out), DIMENSION(:) :: dm0a_s
143    !! Tendency of the 0th order moment of the spherical mode distribution (\(m^{-2}\)).
144    REAL(kind=mm_wp), INTENT(out), DIMENSION(:) :: dm3a_s
145    !! Tendency of the 3rd order moment of the spherical mode distribution (\(m^{3}.m^{-2}\)).
146    REAL(kind=mm_wp), INTENT(out), DIMENSION(:) :: dm0a_f
147    !! Tendency of the 0th order moment of the fractal mode distribution (\(m^{-2}\)).
148    REAL(kind=mm_wp), INTENT(out), DIMENSION(:) :: dm3a_f
149    !! Tendency of the 3rd order moment of the fractal mode distribution (\(m^{3}.m^{-2}\)).
150    LOGICAL :: ret
151    !! .true. on succes (i.e. model has been initialized at least once previously), .false. otherwise.
152    ret = (mm_ini_col.AND.mm_ini_aer)
153    IF (.NOT.ret) RETURN
154    IF (mm_w_clouds.AND.mm_debug) THEN
155      WRITE(*,'(a)') "WARNING: clouds microphysics enabled but will not be &
156      &computed... (wrong interface)"
157    ENDIF
158    ! Calls haze microphysics
159    call mm_haze_microphysics(dm0a_s,dm3a_s,dm0a_f,dm3a_f)
160    ! reverse vectors so they go from ground to top :
161    dm0a_s = dm0a_s(mm_nla:1:-1) * mm_dzlev(mm_nla:1:-1)
162    dm3a_s = dm3a_s(mm_nla:1:-1) * mm_dzlev(mm_nla:1:-1)
163    dm0a_f = dm0a_f(mm_nla:1:-1) * mm_dzlev(mm_nla:1:-1)
164    dm3a_f = dm3a_f(mm_nla:1:-1) * mm_dzlev(mm_nla:1:-1)
165    RETURN
166  END FUNCTION muphys_nocld
167
168  SUBROUTINE mm_diagnostics(dt,aer_prec,aer_s_w,aer_f_w,aer_s_flux,aer_f_flux,ccn_prec,ccn_w,ccn_flux,ice_prec,ice_fluxes,gazs_sat,nrate,grate)
169    !! Get various diagnostic fields of the microphysics.
170    !!
171    !! The current diagnostics saved during microphysic computation are :
172    !!
173    !! - Mass fluxes (aerosols -both mode-, CCN and ices)
174    !! - Settling velocity (aerosols -total-, CCN and ices)
175    !! - Precipitations (aerosols -total-, CCN and ices)
176    !! - Condensible gazes saturation ratio
177    !! - Nucleation and growth rates
178    !!
179    !! @note
180    !! Fluxes values are always negative as they account for sedimentation fluxes. They are set as
181    !! vector (for aerosols and CCN) or 2D-array (with the vertical structure in the first dimension
182    !! and number of species in the second, for ice) and are ordered from __GROUND__ to __TOP__.
183    !!
184    !! @note
185    !! Precipitations are always positive and defined in meters. For ice, it is set as a vector with
186    !! the precipitations of each cloud ice components.
187    !!
188    !! @note
189    !! __ccnprec__, __iceprec__, __icefluxes__ and __gazsat__ are always set to 0 if clouds
190    !! microphysics is disabled (see [[mm_globals(module):mm_w_clouds(variable)]] documentation).
191    REAL(kind=8), INTENT(IN)                                :: dt         !! Physics timestep (s).
192    REAL(kind=mm_wp), INTENT(out), OPTIONAL                 :: aer_prec   !! Aerosols precipitations (both modes) (\(kg.m^{-2}.s^{-1}\)).
193    REAL(kind=mm_wp), INTENT(out), OPTIONAL                 :: ccn_prec   !! CCN precipitations (\(kg.m^{-2}.s^{-1}\)).
194    REAL(kind=mm_wp), INTENT(out), OPTIONAL, DIMENSION(:)   :: aer_s_w    !! Spherical aerosol settling velocity (\(m.s^{-1}\)).
195    REAL(kind=mm_wp), INTENT(out), OPTIONAL, DIMENSION(:)   :: aer_f_w    !! Fractal aerosol settling velocity (\(m.s^{-1}\)).
196    REAL(kind=mm_wp), INTENT(out), OPTIONAL, DIMENSION(:)   :: ccn_w      !! CCN settling velocity (\(m.s^{-1}\)).
197    REAL(kind=mm_wp), INTENT(out), OPTIONAL, DIMENSION(:)   :: aer_s_flux !! Spherical aerosol mass flux (\(kg.m^{-2}.s^{-1}\)).
198    REAL(kind=mm_wp), INTENT(out), OPTIONAL, DIMENSION(:)   :: aer_f_flux !! Fractal aerosol mass flux (\(kg.m^{-2}.s^{-1}\)).
199    REAL(kind=mm_wp), INTENT(out), OPTIONAL, DIMENSION(:)   :: ccn_flux   !! CCN mass flux (\(kg.m^{-2}.s^{-1}\)).
200    REAL(kind=mm_wp), INTENT(out), OPTIONAL, DIMENSION(:,:) :: ice_fluxes !! Ice sedimentation fluxes (\(kg.m^{-2}.s^{-1}\)).
201    REAL(kind=mm_wp), INTENT(out), OPTIONAL, DIMENSION(:,:) :: gazs_sat   !! Condensible gaz saturation ratios (--).
202    REAL(kind=mm_wp), INTENT(out), OPTIONAL, DIMENSION(:)   :: ice_prec   !! Ice precipitations (\(kg.m^{-2}.s^{-1}\)).
203    ! Nucleation and growth rates
204    REAL(kind=mm_wp), INTENT(out), OPTIONAL, DIMENSION(:,:)   :: nrate     !! Nucleation rate (\(m^{-2}.s^{-1}\)).
205    REAL(kind=mm_wp), INTENT(out), OPTIONAL, DIMENSION(:,:)   :: grate     !! Growth rate (\(m^{2}.s^{-1}\)).
206
207    IF (PRESENT(aer_prec))   aer_prec   = -mm_aer_prec / dt
208    IF (PRESENT(aer_s_w))    aer_s_w    = -mm_m3as_vsed(mm_nla:1:-1)
209    IF (PRESENT(aer_f_w))    aer_f_w    = -mm_m3af_vsed(mm_nla:1:-1)
210    IF (PRESENT(aer_s_flux)) aer_s_flux = -mm_aer_s_flux(mm_nla:1:-1)
211    IF (PRESENT(aer_f_flux)) aer_f_flux = -mm_aer_f_flux(mm_nla:1:-1)
212
213    IF (mm_w_clouds) THEN
214      IF (PRESENT(ccn_prec))   ccn_prec   = -mm_ccn_prec / dt
215      IF (PRESENT(ice_prec))   ice_prec   = -mm_ice_prec / dt
216      IF (PRESENT(ccn_w))      ccn_w      = mm_ccn_vsed(mm_nla:1:-1)
217      IF (PRESENT(ccn_flux))   ccn_flux   = mm_ccn_flux(mm_nla:1:-1)
218      IF (PRESENT(ice_fluxes)) ice_fluxes = mm_ice_fluxes(mm_nla:1:-1,:)
219      IF (PRESENT(gazs_sat))   gazs_sat   = mm_gazs_sat(mm_nla:1:-1,:)
220      ! Nucleation and growth rates
221      IF (PRESENT(nrate))      nrate      = mm_nrate(mm_nla:1:-1,:)
222      IF (PRESENT(grate))      grate      = mm_grate(mm_nla:1:-1,:)
223    ELSE
224      IF (PRESENT(ccn_prec))   ccn_prec   = 0._mm_wp
225      IF (PRESENT(ice_prec))   ice_prec   = 0._mm_wp
226      IF (PRESENT(ccn_w))      ccn_w      = 0._mm_wp
227      IF (PRESENT(ccn_flux))   ccn_flux   = 0._mm_wp
228      IF (PRESENT(ice_fluxes)) ice_fluxes = 0._mm_wp
229      IF (PRESENT(gazs_sat))   gazs_sat   = 0._mm_wp
230      ! Nucleation and growth rates
231      IF (PRESENT(nrate))      nrate      = 0._mm_wp
232      IF (PRESENT(grate))      grate      = 0._mm_wp
233    ENDIF
234  END SUBROUTINE mm_diagnostics
235
236  SUBROUTINE mm_get_radii(rcsph,rcfra,rccld)
237    !! Get characteristic radii of microphysical tracers on the vertical grid.
238    REAL(kind=mm_wp), INTENT(out), DIMENSION(:), OPTIONAL :: rcsph !! Spherical mode characteristic radius
239    REAL(kind=mm_wp), INTENT(out), DIMENSION(:), OPTIONAL :: rcfra !! Fractal mode characteristic radius
240    REAL(kind=mm_wp), INTENT(out), DIMENSION(:), OPTIONAL :: rccld !! Cloud drops mean radius
241    IF (mm_ini_aer) THEN
242      IF (PRESENT(rcsph)) rcsph = mm_rcs(mm_nla:1:-1)
243      IF (PRESENT(rcfra)) rcfra = mm_rcf(mm_nla:1:-1)
244    ELSE
245      IF (PRESENT(rcsph)) rcsph = 0._mm_wp
246      IF (PRESENT(rcfra)) rcfra = 0._mm_wp
247    ENDIF
248    IF (PRESENT(rccld)) THEN
249      IF (mm_w_clouds.AND.mm_ini_cld) THEN
250        rccld = mm_drad(mm_nla:1:-1)
251      ELSE
252        rccld = 0._mm_wp
253      ENDIF
254    ENDIF
255  END SUBROUTINE mm_get_radii
256
257END MODULE MM_MICROPHYSIC
258
Note: See TracBrowser for help on using the repository browser.