source: trunk/LMDZ.MARS/libf/phymars/dimradmars_mod.F90 @ 1972

Last change on this file since 1972 was 1771, checked in by aslmd, 7 years ago

LMDZ.MARS dimradmars 1. add the possibility to deallocate common modules with subroutine (as in previous commit) 2. moved totcloudfrac allocation to dimradmars as suggested by AP it has nothing to do in physiq_mod

File size: 8.9 KB
Line 
1module dimradmars_mod
2!   Declaration and settings for radiative transfer calculations
3!   Initializations and allocations are done in phys_state_var_init
4implicit none
5  ! nflev: number of vertical layer
6  ! ndlon,ndlo2: number of horizontal points
7  ! Splitting of horizontal grid
8  ! NDLO2 and ndomainsz for the splitting in the physics call
9  ! WARNING:  One must have  1 < ndomainsz =< ngrid
10  integer,save :: NFLEV !=nlayer   ! with splitting
11  integer,save :: ndomainsz !=(ngrid-1)/20 + 1
12  integer,save :: NDLON !=ndomainsz  ! with splitting
13  integer,save :: NDLO2 !=NDLON
14
15
16! Number of kind of tracer radiative properties
17! ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
18! naerkind is set by reading callphys.def
19! -- see conf_phys
20! -- value of nsizemax below is comfortably high
21!    but beware in case you add a lot of scatterers
22  INTEGER, SAVE :: naerkind
23
24  ! AS: previously in aerkind.h
25  character*20, SAVE, ALLOCATABLE :: name_iaer(:)  ! name of the scatterers
26  integer iaer_dust_conrath ! Typical dust profiles using a
27                            ! Conrath type analytical equation
28  integer iaer_dust_doubleq ! Dust profile is given by the
29                            ! mass mixing ratio of the two-
30                            ! moment scheme method (doubleq)
31  integer iaer_dust_submicron ! Dust profile is given by a
32                              ! submicron population of dust
33                              ! particles
34  integer iaer_h2o_ice ! Water ice particles
35
36  ! AS: was in aeropacity
37  INTEGER,SAVE,ALLOCATABLE :: iaerdust(:)
38
39  ! AS: was in suaer
40  CHARACTER(LEN=30), SAVE, ALLOCATABLE :: file_id(:,:)
41
42! Reference wavelengths used to compute reference optical depth (m)
43! ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
44  REAL,SAVE,ALLOCATABLE :: longrefir(:),longrefvis(:)
45 
46! Definition of spectral intervals at thermal infrared wavelengths (LW)
47! ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
48  integer,parameter :: nir=4 ! Total number of thermal IR bands
49  integer,parameter :: nuco2=2 ! number of bands in CO2 bands
50  real,parameter :: long1ir=5.E-6 , long2ir=200.E-6
51  real,parameter :: long1co2=1.E+0 / 865.E+2 , long2co2=1.E+0 / 500.E+2
52
53!  Warning : the "nir" thermal IR bands are not ordered by wavelength:
54!      iir=1 : central 15um CO2 bands     
55!      iir=2 : CO2 band wings    [long1co2-long2co2] MINUS central band
56!      iir=3 : 9 um band [long1ir - long1co2]
57!      iir=4 : Far IR    [long2co2 - long2ir]
58   
59!  Definition of spectral interval at solar wavelengths (SW)
60!  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
61  integer,parameter :: NSUN=2   ! do not change that !
62!  Boundaries of spectral intervals (m) :
63  real,parameter :: long1vis=0.1E-6 , long2vis=0.5E-6 , long3vis=5.E-6
64!  Fraction of solar energy in solar band #1 [long1vis-long2vis] : 0.274490
65!  Fraction of solar energy in solar band #2 [long2vis-long3vis] : 0.725509
66  real,save :: sunfr(2) = (/ 0.274490 , 0.725509 /)
67
68! Maximum number of grain size classes
69! ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
70! This parameter has to be set to the maximum number of particle
71!   sizes contained in the optical parameter database; For example,
72!   if only one grain size is used to describe dust, and 30 are used
73!   to describe water-ice crystals in the visible and 15 in the IR,
74!   nsizemax has to be set to 30.
75! If only one grain size is considered for all the aerosols, set
76!   this parameter to 1 and convolution will be turned off during
77!   the radiative calculations.
78
79  integer, parameter :: nsizemax = 60
80! integer, parameter :: nsizemax = 1
81
82! Various initialisation for LW radiative code
83! ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
84! npademx : number of Pade coefficients
85! nabsmx : ?
86! nt_pademx : number of temperature intervals for Pade
87
88  integer,parameter :: npademx=4
89  integer,parameter :: nabsmx=2
90  integer,parameter :: nt_pademx=19
91
92!!
93!! variables
94!!
95  REAL,SAVE,ALLOCATABLE :: dtrad(:,:) ! Net atm. radiative heating rate (K.s-1)
96  REAL,SAVE,ALLOCATABLE :: fluxrad_sky(:) ! rad. flux from sky absorbed by surface (W.m-2)
97  REAL,SAVE,ALLOCATABLE :: fluxrad(:) ! Net radiative surface flux (W.m-2)
98  REAL,SAVE,ALLOCATABLE :: albedo(:,:) ! Surface albedo in each solar band
99  REAL,SAVE,ALLOCATABLE :: tauscaling(:)   ! Convertion factor for qdust and Ndust
100  REAL,SAVE,ALLOCATABLE :: totcloudfrac(:) ! total cloud fraction over the column
101! aerosol (dust or ice) extinction optical depth  at reference wavelength
102! "longrefvis" set in dimradmars_mod , for one of the "naerkind"  kind of
103! aerosol optical properties  :
104  REAL,SAVE,ALLOCATABLE :: aerosol(:,:,:)
105  REAL,SAVE,ALLOCATABLE :: nueffdust(:,:) ! Dust effective variance
106
107!! ------------------------------------------------------
108!! AS: what was previously in yomaer
109!   Shortwave
110!   ~~~~~~~~~
111!
112! tauvis: dust optical depth at reference wavelength  ("longrefvis" set
113! in dimradmars_mod : typically longrefvis = 0.67E-6 m, as measured by Viking )
114
115! For the "naerkind" kind of aerosol radiative properties :
116! QVISsQREF  :  Qext / Qext("longrefvis")   <--- For both solar bands
117! omegavis   :  sinle scattering albedo     <--- For both solar bands
118! gvis       :  assymetry factor            <--- For both solar bands
119!
120!   Longwave
121!   ~~~~~~~~
122!
123! For the "naerkind" kind of aerosol radiative properties :
124! QIRsQREF :  Qext / Qext("longrefvis")     <--- For the nir bandes IR
125! omegaIR  :  mean single scattering albedo <--- For the nir bandes IR
126! gIR      :  mean assymetry factor         <--- For the nir bandes IR
127!
128  real,save :: tauvis
129  real,save,allocatable :: QVISsQREF(:,:,:)
130  real,save,allocatable :: omegavis(:,:,:)
131  real,save,allocatable :: gvis(:,:,:)
132  real,save,allocatable :: QIRsQREF(:,:,:)
133  real,save,allocatable :: omegaIR(:,:,:)
134  real,save,allocatable :: gIR(:,:,:)
135! Actual number of grain size classes in each domain for a
136!   given aerosol:
137  integer,save,allocatable :: nsize(:,:)
138! Particle size axis (depend on the kind of aerosol and the
139!   radiation domain)
140  real,save,allocatable :: radiustab(:,:,:)
141! Extinction coefficient at reference wavelengths;
142!   These wavelengths are defined in dimradmars_mod, and called
143!   longrefvis and longrefir.
144  real,save,allocatable :: QREFvis(:,:)
145  real,save,allocatable :: QREFir(:,:)
146  real,save,allocatable :: omegaREFvis(:,:)
147  real,save,allocatable :: omegaREFir(:,:)
148!! ------------------------------------------------------
149
150contains
151
152  subroutine ini_dimradmars_mod(ngrid,nlayer)
153 
154  implicit none
155 
156  integer,intent(in) :: ngrid ! number of atmospheric columns
157  integer,intent(in) :: nlayer ! number of atmospheric layers
158
159   nflev=nlayer
160!  ndomainsz=ngrid
161   ndomainsz=(ngrid-1)/20 + 1
162!  ndomainsz=(ngrid-1)/5 + 1
163   ndlon=ndomainsz
164   ndlo2=ndlon
165
166   allocate(albedo(ngrid,2))
167   allocate(dtrad(ngrid,nlayer))
168   allocate(fluxrad_sky(ngrid))
169   allocate(fluxrad(ngrid))
170   allocate(tauscaling(ngrid))
171   allocate(nueffdust(ngrid,nlayer))
172   allocate(totcloudfrac(ngrid))
173
174  end subroutine ini_dimradmars_mod
175
176  subroutine end_dimradmars_mod
177
178  implicit none
179
180   if (allocated(albedo))      deallocate(albedo)
181   if (allocated(dtrad))       deallocate(dtrad)
182   if (allocated(fluxrad_sky)) deallocate(fluxrad_sky)
183   if (allocated(fluxrad))     deallocate(fluxrad)
184   if (allocated(tauscaling))  deallocate(tauscaling)
185   if (allocated(nueffdust))   deallocate(nueffdust)
186   if (allocated(totcloudfrac))   deallocate(totcloudfrac)
187
188  end subroutine end_dimradmars_mod
189
190 
191  subroutine ini_scatterers(ngrid,nlayer)
192
193  implicit none
194
195  integer,intent(in) :: ngrid ! number of atmospheric columns
196  integer,intent(in) :: nlayer ! number of atmospheric layers
197
198   !! domain-dependent
199   !! -- only used in physiq_mod & intent(out) in callradite
200   if (allocated(aerosol)) deallocate(aerosol)
201   allocate(aerosol(ngrid,nlayer,naerkind))
202
203   !! not domain-dependent
204   if (.not.allocated(name_iaer)) allocate(name_iaer(naerkind))
205   if (.not.allocated(longrefir)) allocate(longrefir(naerkind))
206   if (.not.allocated(longrefvis)) allocate(longrefvis(naerkind))
207   if (.not.allocated(iaerdust)) allocate(iaerdust(naerkind))
208   if (.not.allocated(file_id)) allocate(file_id(naerkind,2))
209   if (.not.allocated(QVISsQREF)) allocate(QVISsQREF(nsun,naerkind,nsizemax))
210   if (.not.allocated(omegavis)) allocate(omegavis(nsun,naerkind,nsizemax))
211   if (.not.allocated(gvis)) allocate(gvis(nsun,naerkind,nsizemax))
212   if (.not.allocated(QIRsQREF)) allocate(QIRsQREF(nir,naerkind,nsizemax))
213   if (.not.allocated(omegaIR)) allocate(omegaIR(nir,naerkind,nsizemax))
214   if (.not.allocated(gIR)) allocate(gIR(nir,naerkind,nsizemax))
215   if (.not.allocated(nsize)) allocate(nsize(naerkind,2))
216   if (.not.allocated(radiustab)) allocate(radiustab(naerkind,2,nsizemax))
217   if (.not.allocated(QREFvis)) allocate(QREFvis(naerkind,nsizemax))
218   if (.not.allocated(QREFir)) allocate(QREFir(naerkind,nsizemax))
219   if (.not.allocated(omegaREFvis)) allocate(omegaREFvis(naerkind,nsizemax))
220   if (.not.allocated(omegaREFir)) allocate(omegaREFir(naerkind,nsizemax))
221
222  end subroutine ini_scatterers
223
224end module dimradmars_mod
Note: See TracBrowser for help on using the repository browser.