source: CONFIG/publications/ICOLMDZORINCA_CO2_Transport_GMD_2023/INCA/src/INCA_MOD/aerosol_mod.F90 @ 6610

Last change on this file since 6610 was 6610, checked in by acosce, 10 months ago

INCA used for ICOLMDZORINCA_CO2_Transport_GMD_2023

File size: 11.5 KB
Line 
1!$Id: aerosol_mod.F90 104 2008-12-23 10:28:51Z acosce $
2!!  =========================================================================
3!!  INCA - INteraction with Chemistry and Aerosols
4!! 
5!!  Copyright Laboratoire des Sciences du Climat et de l'Environnement (LSCE)
6!!                Unite mixte CEA-CNRS-UVSQ
7!! 
8!!  Contributors to this INCA subroutine:
9!!  Michael Schulz, LSCE, Michael.Schulz@cea.fr
10!!  Y. Balkanski, LSCE, Yves.Balkanski@cea.fr
11!!  D. Hauglustaine, LSCE, didier.hauglustaine@lsce.ipsl.fr, 11/2013
12!! 
13!!  Anne Cozic, LSCE, anne.cozic@cea.fr
14!!  Yann Meurdesoif, LSCE, yann.meurdesoif@cea.fr
15!! 
16!! 
17!!  This software is a computer program whose purpose is to simulate the
18!!  atmospheric gas phase and aerosol composition. The model is designed to be
19!!  used within a transport model or a general circulation model. This version
20!!  of INCA was designed to be coupled to the LMDz GCM. LMDz-INCA accounts
21!!  for emissions, transport (resolved and sub-grid scale), photochemical
22!!  transformations, and scavenging (dry deposition and washout) of chemical
23!!  species and aerosols interactively in the GCM. Several versions of the INCA
24!!  model are currently used depending on the envisaged applications with the
25!!  chemistry-climate model.
26!! 
27!!  This software is governed by the CeCILL  license under French law and
28!!  abiding by the rules of distribution of free software.  You can  use,
29!!  modify and/ or redistribute the software under the terms of the CeCILL
30!!  license as circulated by CEA, CNRS and INRIA at the following URL
31!!  "http://www.cecill.info".
32!! 
33!!  As a counterpart to the access to the source code and  rights to copy,
34!!  modify and redistribute granted by the license, users are provided only
35!!  with a limited warranty  and the software's author,  the holder of the
36!!  economic rights,  and the successive licensors  have only  limited
37!!  liability.
38!! 
39!!  In this respect, the user's attention is drawn to the risks associated
40!!  with loading,  using,  modifying and/or developing or reproducing the
41!!  software by the user in light of its specific status of free software,
42!!  that may mean  that it is complicated to manipulate,  and  that  also
43!!  therefore means  that it is reserved for developers  and  experienced
44!!  professionals having in-depth computer knowledge. Users are therefore
45!!  encouraged to load and test the software's suitability as regards their
46!!  requirements in conditions enabling the security of their systems and/or
47!!  data to be ensured and,  more generally, to use and operate it in the
48!!  same conditions as regards security.
49!! 
50!!  The fact that you are presently reading this means that you have had
51!!  knowledge of the CeCILL license and that you accept its terms.
52!!  =========================================================================
53
54#include <inca_define.h>
55
56MODULE AEROSOL_MOD
57#ifdef AER
58
59!---------------------------------------------------------------------------
60! Aerosol Module contains those aerosol related parameters which are
61! used to define the logic and the basic parameters of the aerosol model
62! which the prognostic and diagnostic aerosol subroutines use
63!
64!     Aerosol tracer definitions
65!     PER AEROSOL MODE CHARACTERISED BY N MASS FRACTIONS AND 1 NUMBER MIXING RATIO
66!     Meaning of variables:
67!
68!     -------------------------------------------------------------------
69!                cimode.........aimode.........csmode..........asmode........
70!     -------------------------------------------------------------------
71!     | | | | | |MASS1|MASS2|..|MASSN|NUMBER|MASS1|MASS2|..|MASSN|NUMBER|
72!     -------------------------------------------------------------------
73!                -m1x------------mnx---nx---
74!     -------------------------------------------------------------------
75!                -trmx---------------------------------------------trnx--
76!     -------------------------------------------------------------------
77!---------------------------------------------------------------------------
78  USE SPECIES_NAMES
79  IMPLICIT NONE
80
81  ! Number of Modes
82  INTEGER, PARAMETER :: nmodes = 5
83
84  INTEGER, PARAMETER :: nbmax_aero = 26    ! nombre max d'aero entre trmx:trnx toutes versions confondues
85  CHARACTER*8, SAVE :: nameAero(nbmax_aero) 
86!$OMP THREADPRIVATE(nameAero)
87  DATA nameAero /"CIDUSTM","CINO3M","CIN","AIBCM","AIPOMM","AIN","CSSSM","CSSO4M","CSNH4M", "CSMSAM", &
88       "CSNO3M", "CSN","ASSSM", "ASBCM", "ASPOMM", "ASAPp1a", "ASAPp2a", "ASARp1a", "ASARp2a", "ASSO4M","ASNH4M", "ASMSAM", "ASNO3M", "ASN","SSSSM", "SSN"/
89
90  CHARACTER(len=100), SAVE :: mode_name(nmodes) = (/"coarse insoluble", "accumulation insoluble", "coarse soluble", "accumulation soluble", "supercoarse soluble"/) 
91!$OMP THREADPRIVATE(mode_name)
92
93! Incldfac for LMDZ old physics
94  REAL, SAVE :: incldfac_max_AP(nbmax_aero) = &
95       (/ 0.7, 0.7,  0.7, &
96       0.2,    0.2,  0.2, &
97       1. ,    0.9,  0.9, &
98       0.9,    0.9,  0.9, &
99       1. ,    0.8,  0.8, &
100       0.6,    0.6,  0.6,  0.6, &
101       0.8,    0.8,  0.8, &
102       0.8,    0.8,  1. , &
103       1.  /)
104!$OMP THREADPRIVATE(incldfac_max_AP)
105
106!Incldfac for LMDZ new physics
107  REAL, SAVE :: incldfac_max_NP(nbmax_aero) = &
108       (/   0.7,   0.7,     0.7, &
109       0.2,    0.2,    0.2, &
110       0.9 ,   0.9,    0.9, &
111       0.9,    0.9,    0.9, &
112       0.6 ,   0.6,    0.6, &
113       0.6, 0.6, 0.6, 0.6, &
114       0.6,    0.6,    0.6, &
115       0.6,    0.6,    1. , &
116       1.  /)
117!$OMP THREADPRIVATE(incldfac_max_NP)
118 
119  REAL, SAVE :: rop_max(nbmax_aero) =  &
120     (/ 2650., 2504., 2577., &
121     1500., 1500., 1500.,  &
122     1600., 1769., 1769.,  &
123     1481., 2261., 1776.,  &
124     1600., 1500., 1500.,  & 
125     1500., 1500., 1500., 1500.,  &
126     1769., 1750., 1481.,  &
127     1725., 1620., 1600., 1600. /)
128!$OMP THREADPRIVATE(rop_max)
129
130  LOGICAL, SAVE :: ntr_max(nbmax_aero)= &
131     (/.FALSE.,.FALSE.,.TRUE., &
132     .FALSE.,.FALSE.,.TRUE., &
133     .FALSE.,.FALSE.,.FALSE., &
134     .FALSE.,.FALSE.,.TRUE.,  &
135     .FALSE.,.FALSE.,.FALSE., &
136     .FALSE.,.FALSE.,.FALSE.,.FALSE., &
137     .FALSE.,.FALSE.,.FALSE., &
138     .FALSE.,.TRUE.,.FALSE.,.TRUE./)       
139!$OMP THREADPRIVATE(ntr_max)
140
141
142#ifdef DUSS
143  ! density of aerosol species [kg/m-3] 
144  !
145  ! keep sequence in inca.XX.inp file
146  ! number tracers get a .true.
147  !
148  !     Mode  CI :  CIDUSTM  CIN     
149  !     Mode  CS :  CSSSM    CSN
150  !     Mode  AS :  ASSSM    ASN
151  !     Mode  SS :  SSSSM   SSN
152
153  ! coarse insoluble mode                  --> 
154  !     Mode  CI :  CIDUSTM CIN             
155  INTEGER, PARAMETER :: cimode =1       
156  ! accumulation insoluble mode            --> 
157  !     Mode  AI :   
158  INTEGER, PARAMETER :: aimode =0           
159  ! coarse soluble mode            -->
160  !     Mode  CS :  CSSSM   CSN
161  INTEGER, PARAMETER :: csmode =3
162  ! accumulation soluble mode      -->
163  !     Mode  AS :  ASSSM    ASN
164  INTEGER, PARAMETER :: asmode =4
165  ! super coarse soluble mode      -->
166  !     Mode  SS :  SSSSM   SSN
167  INTEGER, PARAMETER :: ssmode =5 
168
169  ! index of first mass in mode                    cimode     aimode     csmode    asmode   ssmode
170  INTEGER, PARAMETER :: mass1index(nmodes)  = (/ id_CIDUSTM , 0     , id_CSSSM, id_ASSSM, id_SSSSM /)
171  ! index of last mass
172  INTEGER, PARAMETER :: massNindex(nmodes)  = (/ id_CIDUSTM , 0     , id_CSSSM, id_ASSSM, id_SSSSM /)
173  ! index of number
174  INTEGER, PARAMETER :: numberindex(nmodes) = (/ id_CIN     , 0     , id_CSN   ,   id_ASN, id_SSN  /)
175
176#else
177
178  ! density of aerosol species [kg/m-3] 
179  !
180  ! keep sequence in inca.XX.inp file
181  ! number tracers get a .true.
182  !
183  !     Mode  CI :  CIDUSTM CINO3   CIN     
184  !     Mode  AI :  AIBCM   AIPOMM  AIN       
185  !     Mode  CS :  CSSSM   CSSO4M  CSNH4M  CSMSAM  CSNO3M CSN
186  !     Mode  AS :  ASSSM   ASBCM   ASPOMM   (+ in NMHC_AER : ASAPp1a  ASAPp2a  ASARp1a  ASARp2a) ASSO4M  ASNH4M ASMSAM ASNO3M ASN
187  !     Mode  SS :  SSSSM   SSN
188  !
189  ! new var called incldfac for interstitial vs. in liquid water.
190
191  ! coarse insoluble mode                  --> 
192  !     Mode  CI :  CIDUSTM CINO3   CIN             
193  INTEGER, PARAMETER :: cimode =1       
194  ! accumulation insoluble mode            --> 
195  !     Mode  AI :   AIBCM  AIPOMM  AIN             
196  INTEGER, PARAMETER :: aimode =2       
197  ! coarse soluble mode            -->
198  !     Mode  CS :  CSSSM   CSSO4M  CSNH4M  CSMSAM  CSNO3M CSN
199  INTEGER, PARAMETER :: csmode =3
200  ! accumulation soluble mode      -->
201  !     Mode  AS :  ASSSM   ASBCM   ASPOMM  (+ in NMHC_AER : ASAPp1a  ASAPp2a  ASARp1a  ASARp2a)  ASSO4M  ASNH4M ASMSAM ASNO3M ASN
202  INTEGER, PARAMETER :: asmode =4
203  ! super coarse soluble mode      -->
204  !     Mode  SS :  SSSSM   SSN
205  INTEGER, PARAMETER :: ssmode =5
206
207  ! index of first mass in mode                        cimode     aimode     csmode    asmode   ssmode
208  INTEGER, PARAMETER :: mass1index(nmodes)  = (/ id_CIDUSTM, id_AIBCM, id_CSSSM, id_ASSSM, id_SSSSM /)
209  ! index of last mass
210  INTEGER, PARAMETER :: massNindex(nmodes)  = (/ id_CINO3M,  id_AIPOMM, id_CSNO3M, id_ASNO3M, id_SSSSM /)
211  ! index of number
212  INTEGER, PARAMETER :: numberindex(nmodes) = (/ id_CIN,     id_AIN,    id_CSN,   id_ASN, id_SSN  /)
213#endif
214
215 
216  ! tracer index range of all aerosol tracers
217  INTEGER, PARAMETER :: trmx = mass1index(cimode)
218  INTEGER, PARAMETER :: trnx = numberindex(ssmode)
219
220  ! characteristic mode parameters
221  ! spread of lognormal distribution
222  !     Modes                           CI      AI       CS      AS     SS
223  REAL, SAVE ::  srcsigma(nmodes)  = (/ 2.   ,  1.59   , 2.    , 1.59 , 2.  /)
224  REAL, SAVE ::  srcsigmaln(nmodes)= (/0.69314718,0.463734016,0.69314718,0.463734016,0.69314718 /)  !=log(srcsigma)
225!$OMP THREADPRIVATE(srcsigma)
226!$OMP THREADPRIVATE(srcsigmaln)
227
228
229  REAL, SAVE :: rop(trmx:trnx)
230  REAL, SAVE :: incldfac(trmx:trnx)           !incldfac for interstitial vs. in liquid water.
231  LOGICAL, SAVE :: ntr(trmx:trnx)
232!$OMP THREADPRIVATE(rop, incldfac, ntr)
233
234  ! dust source specific variables
235  ! clay content and accumulator for check of drying time for wetted soil
236  REAL, SAVE, ALLOCATABLE     :: wth(:)
237  REAL, SAVE, ALLOCATABLE     :: rhv(:)         
238  REAL, SAVE, ALLOCATABLE     :: cly(:)
239!$OMP THREADPRIVATE(wth, rhv, cly)
240     
241CONTAINS
242       
243  SUBROUTINE INIT_AEROSOL_MOD
244    USE INCA_DIM
245    USE PRINT_INCA
246    USE CONST_LMDZ, ONLY : config_inca
247    IMPLICIT NONE
248
249
250    INTEGER::  i,j
251    LOGICAL :: findAero
252
253    REAL :: incldfac_max(nbmax_aero)
254
255    ALLOCATE(wth(PLON))
256    ALLOCATE(rhv(PLON))
257    ALLOCATE(cly(PLON))
258         
259    wth(:) = 0.
260    rhv(:) = 0.
261    cly(:) = 0.
262
263
264    IF (config_inca == 'aeNP') THEN
265       incldfac_max(:) = incldfac_max_NP(:) 
266    ELSE
267       incldfac_max(:) = incldfac_max_AP(:) 
268    ENDIF
269
270    incldfac(:) = 0. 
271    do i=trmx,trnx
272       findAero=.false. 
273       do j=1,nbmax_aero
274          if (tracnam(i) .eq. trim(nameAero(j))) then
275             findAero=.true.
276             rop(i) = rop_max(j) 
277             ntr(i) = ntr_max(j)
278#ifdef NMHC
279             ! in NMHC_AER and NMHC_AER_S cases, wet deposition will be done for these tracers
280             ! in sethet instead of wetdep. So we put their values to zero in incldfac
281             if ((tracnam(i) .eq. "CINO3M") .or. (tracnam(i) .eq. "CSNO3M") .or. &
282                  (tracnam(i) .eq. "ASNO3M") .or. (tracnam(i) .eq. "ASSO4M") .or. &
283                  (tracnam(i) .eq. "ASNH4M"))  then
284                incldfac(i) = 0.
285             else
286                incldfac(i) = incldfac_max(j) 
287             endif
288#else
289             incldfac(i) = incldfac_max(j) 
290#endif
291          endif
292          if (findAero) exit
293       enddo
294    enddo
295
296!    write(lunout,*) "incldfac = ", incldfac
297!    write(lunout,*) "rop = ", rop
298!    write(lunout,*) "ntr = ", ntr
299!   
300  END SUBROUTINE INIT_AEROSOL_MOD
301
302#endif   
303END MODULE AEROSOL_MOD
304
Note: See TracBrowser for help on using the repository browser.