source: trunk/LMDZ.GENERIC/libf/phystd/aeroptproperties.F90 @ 220

Last change on this file since 220 was 135, checked in by aslmd, 14 years ago

CHANGEMENT ARBORESCENCE ETAPE 2 -- NON COMPLET

File size: 14.1 KB
Line 
1      subroutine aeroptproperties(ngrid,nlayer,reffrad,nueffrad, &
2                                 QVISsQREF3d,omegaVIS3d,gVIS3d, &
3                                 QIRsQREF3d,omegaIR3d,gIR3d,    &
4                                 QREFvis3d,QREFir3d)
5
6      use radinc_h,    only: L_NSPECTI,L_NSPECTV,naerkind,nsizemax
7      use radcommon_h, only: QVISsQREF,omegavis,gvis,QIRsQREF,omegair,gir
8      use radcommon_h, only: radiustab,nsize,qrefvis,qrefir
9
10      implicit none
11
12!==================================================================
13!     
14!     Purpose
15!     -------
16!     Compute the scattering parameters in each grid
17!     box, depending on aerosol grain sizes.
18!
19!     Notes
20!     -----
21!     Don't forget to set the value of varyingnueff below; If
22!     the effective variance of the distribution for the given
23!     aerosol is considered homogeneous in the atmosphere, please
24!     set varyingnueff(iaer) to .false. Resulting computational
25!     time will be much better.
26!
27!     Authors
28!     -------
29!     J.-B. Madeleine, F. Montmessin
30!     Slightly modified and converted to F90 by R. Wordsworth (2009)
31!     Varying nueff section removed by R. Wordsworth for simplicity
32!     
33!==================================================================
34
35#include "dimensions.h"
36#include "dimphys.h"
37#include "callkeys.h"
38
39!     Local variables
40!     ---------------
41
42!     =============================================================
43      LOGICAL, PARAMETER :: varyingnueff(naerkind) = .false.
44!     =============================================================
45
46!     Radius axis used for integration
47      DOUBLE PRECISION :: radiusint(nsizemax+1)
48!     Min. and max radii of the interpolation grid (in METERS)
49      REAL, PARAMETER :: refftabmin = 2e-8
50!      REAL, PARAMETER :: refftabmax = 35e-6
51      REAL, PARAMETER :: refftabmax = 1e-3 ! CHANGED BY RDW
52!     Log of the min and max variance of the interpolation grid
53      REAL, PARAMETER :: nuefftabmin = -4.6
54      REAL, PARAMETER :: nuefftabmax = 0.
55!     Number of effective radii of the interpolation grid
56      INTEGER, PARAMETER :: refftabsize = 200
57!     Number of effective variances of the interpolation grid
58!      INTEGER, PARAMETER :: nuefftabsize = 100
59      INTEGER, PARAMETER :: nuefftabsize = 1  ! CHANGED BY RDW
60!     Interpolation grid indices (reff,nueff)
61      INTEGER :: grid_i,grid_j
62!     Volume ratio of the look-up table (different in VIS and IR)
63      DOUBLE PRECISION :: vrat
64!     r_g and sigma_g for the log-normal distribution
65!       as defined by [hansen_1974]
66      REAL :: r_g,sigma_g
67!     Error function used for integration
68      DOUBLE PRECISION :: derf
69!     Density function f(x)dx of the log-normal distribution
70      REAL :: dfi
71      DOUBLE PRECISION :: dfi_tmp(nsizemax+1)
72!     Intermediate variable
73      REAL :: var_tmp,var3d_tmp(ngridmx,nlayermx)
74!     Bilinear interpolation factors
75      REAL :: kx,ky,k1,k2,k3,k4
76!     Indices
77      INTEGER :: i,j,k,l,m,iaer,idomain
78      INTEGER :: ig,lg,chg
79
80!     Local saved variables
81!     ---------------------
82
83!     Radius axis of the interpolation grid
84      DOUBLE PRECISION,SAVE :: refftab(refftabsize)
85!     Variance axis of the interpolation grid
86      DOUBLE PRECISION,SAVE :: nuefftab(nuefftabsize)
87!     Volume ratio of the grid
88      DOUBLE PRECISION,SAVE :: logvratgrid,vratgrid
89!     Grid used to remember which calculation is done
90      LOGICAL,SAVE :: checkgrid(refftabsize,nuefftabsize,naerkind,2) &
91                     = .false.
92!     Optical properties of the grid (VISIBLE)
93      REAL,SAVE :: epVISgrid(refftabsize,nuefftabsize,L_NSPECTV,naerkind)
94      REAL,SAVE :: omegVISgrid(refftabsize,nuefftabsize,L_NSPECTV,naerkind)
95      REAL,SAVE :: gVISgrid(refftabsize,nuefftabsize,L_NSPECTV,naerkind)
96!     Optical properties of the grid (INFRARED)
97      REAL,SAVE :: epIRgrid(refftabsize,nuefftabsize,L_NSPECTI,naerkind)
98      REAL,SAVE :: omegIRgrid(refftabsize,nuefftabsize,L_NSPECTI,naerkind)
99      REAL,SAVE :: gIRgrid(refftabsize,nuefftabsize,L_NSPECTI,naerkind)
100!     Optical properties of the grid (REFERENCE WAVELENGTHS)
101      REAL,SAVE :: eprefVISgrid(refftabsize,nuefftabsize,naerkind)
102      REAL,SAVE :: eprefIRgrid(refftabsize,nuefftabsize,naerkind)
103!     Firstcall
104      LOGICAL,SAVE :: firstcall = .true.
105
106!     Inputs
107!     ------
108
109      INTEGER :: ngrid,nlayer
110!     Aerosol effective radius used for radiative transfer (meter)
111      REAL :: reffrad(ngridmx,nlayermx,naerkind)
112!     Aerosol effective variance used for radiative transfer (n.u.)
113      REAL :: nueffrad(ngridmx,nlayermx,naerkind)
114
115!     Outputs
116!     -------
117
118      REAL :: QVISsQREF3d(ngridmx,nlayermx,L_NSPECTV,naerkind)
119      REAL :: omegaVIS3d(ngridmx,nlayermx,L_NSPECTV,naerkind)
120      REAL :: gVIS3d(ngridmx,nlayermx,L_NSPECTV,naerkind)
121
122      REAL :: QIRsQREF3d(ngridmx,nlayermx,L_NSPECTI,naerkind)
123      REAL :: omegaIR3d(ngridmx,nlayermx,L_NSPECTI,naerkind)
124      REAL :: gIR3d(ngridmx,nlayermx,L_NSPECTI,naerkind)
125
126      REAL :: QREFvis3d(ngridmx,nlayermx,naerkind)
127      REAL :: QREFir3d(ngridmx,nlayermx,naerkind)
128
129      DO iaer = 1, naerkind ! Loop on aerosol kind
130
131        IF ( (nsize(iaer,1).EQ.1).AND.(nsize(iaer,2).EQ.1) ) THEN
132
133!==================================================================
134!       If there is one single particle size, optical
135!         properties of the considered aerosol are homogeneous
136          DO lg = 1, nlayer
137            DO ig = 1, ngrid
138              DO chg = 1, L_NSPECTV
139                QVISsQREF3d(ig,lg,chg,iaer)=QVISsQREF(chg,iaer,1)
140                omegaVIS3d(ig,lg,chg,iaer)=omegaVIS(chg,iaer,1)
141                gVIS3d(ig,lg,chg,iaer)=gVIS(chg,iaer,1)
142              ENDDO
143              DO chg = 1, L_NSPECTI
144                QIRsQREF3d(ig,lg,chg,iaer)=QIRsQREF(chg,iaer,1)
145                omegaIR3d(ig,lg,chg,iaer)=omegaIR(chg,iaer,1)
146                gIR3d(ig,lg,chg,iaer)=gIR(chg,iaer,1)
147              ENDDO
148              QREFvis3d(ig,lg,iaer)=QREFvis(iaer,1)
149              QREFir3d(ig,lg,iaer)=QREFir(iaer,1)
150            ENDDO
151          ENDDO
152
153          if (firstcall) then
154             print*,'Optical properties of the aerosol are homogenous for:'
155             print*,'iaer = ',iaer
156          endif
157
158        ELSE ! Varying effective radius and variance
159      DO idomain = 1, 2 ! Loop on visible or infrared channel
160!==================================================================
161!     1. Creating the effective radius and variance grid
162!     --------------------------------------------------
163      IF (firstcall) THEN
164!       1.1 Effective radius
165        refftab(1)    = refftabmin
166        refftab(refftabsize) = refftabmax
167
168        logvratgrid = log(refftabmax/refftabmin) / &
169                     float(refftabsize-1)*3.
170        vratgrid = exp(logvratgrid)
171
172        do i = 2, refftabsize-1
173          refftab(i) = refftab(i-1)*vratgrid**(1./3.)
174        enddo
175
176!       1.2 Effective variance
177        do i = 0, nuefftabsize-1
178          nuefftab(i+1) = exp( nuefftabmin + &
179                  i*(nuefftabmax-nuefftabmin)/(nuefftabsize-1) )
180        enddo
181        firstcall = .false.
182      ENDIF
183
184
185
186!     2. Compute the scattering parameters using linear
187!       interpolation over grain sizes and constant nueff
188!     ---------------------------------------------------
189
190!     2.1 Initialization
191
192      vrat = log(radiustab(iaer,idomain,nsize(iaer,idomain)) / &
193              radiustab(iaer,idomain,1)) / &
194              float(nsize(iaer,idomain)-1)*3.
195      vrat = exp(vrat)
196
197      radiusint(1) = 1.e-9
198      DO i = 2,nsize(iaer,idomain)
199        radiusint(i) = ( (2.*vrat) / (vrat+1.) )**(1./3.) * &
200                      radiustab(iaer,idomain,i-1)
201      ENDDO
202      radiusint(nsize(iaer,idomain)+1) = 1.e-2
203
204      DO lg = 1,nlayer
205        DO ig = 1,ngrid
206!         2.1 Effective radius index and kx calculation
207          var_tmp=reffrad(ig,lg,iaer)/refftabmin
208          var_tmp=log(var_tmp)*3.
209          var_tmp=var_tmp/logvratgrid+1.
210          grid_i=floor(var_tmp)
211          IF (grid_i.GE.refftabsize) THEN
212           WRITE(*,*) 'Warning: Aerosol particle size in grid box #'
213           WRITE(*,*) ig,' is too large to be used by the '
214           WRITE(*,*) 'radiative transfer; please extend the '
215           WRITE(*,*) 'interpolation grid to larger sizes.'
216
217            grid_i=refftabsize-1
218            kx = 1.
219          ELSEIF (grid_i.LT.1) THEN
220           WRITE(*,*) 'Warning: Aerosol particle size in grid box #'
221           WRITE(*,*) ig,' is too small to be used by the '
222           WRITE(*,*) 'radiative transfer; please extend the '
223           WRITE(*,*) 'interpolation grid to smaller sizes.'
224            grid_i=1
225            kx = 0.
226          ELSE
227            kx = ( reffrad(ig,lg,iaer)-refftab(grid_i) ) / &
228                ( refftab(grid_i+1)-refftab(grid_i) )
229          ENDIF
230!         2.3 Integration
231          DO j=grid_i,grid_i+1
232!             2.3.1 Check if the calculation has been completed
233              IF (.NOT.checkgrid(j,1,iaer,idomain)) THEN
234!               2.3.2 Compute r_g and sigma_g for the log-normal
235!                 distribution as defined by [hansen_1974], "Light
236!                 scattering in planetary atmospheres", Space
237!                 Science Reviews 16 527-610, p558
238                sigma_g = log(1.+nueffrad(1,1,iaer))
239                r_g = exp(2.5*sigma_g)
240                sigma_g = sqrt(sigma_g)
241                r_g = refftab(j) / r_g
242                IF (idomain.EQ.1) THEN ! VISIBLE DOMAIN -----------
243!                 2.3.3.vis Initialization
244                  epVISgrid(j,1,:,iaer)=0.
245                  omegVISgrid(j,1,:,iaer)=0.
246                  gVISgrid(j,1,:,iaer)=0.
247                  eprefVISgrid(j,1,iaer)=0.
248!                 2.3.4.vis Log-normal distribution
249                  DO l=1,nsize(iaer,idomain)+1
250                    dfi_tmp(l) = log(radiusint(l)/r_g) /  &
251                                sqrt(2.)/sigma_g
252                  ENDDO
253                  DO l=1,nsize(iaer,idomain)
254                    dfi = 0.5*( derf(dfi_tmp(l+1)) -  &
255                               derf(dfi_tmp(l)) )
256                    DO m=1,L_NSPECTV
257                      epVISgrid(j,1,m,iaer) = &
258                               epVISgrid(j,1,m,iaer) &
259                               + QVISsQREF(m,iaer,l)*dfi
260                      omegVISgrid(j,1,m,iaer) = &
261                               omegVISgrid(j,1,m,iaer) &
262                               + omegaVIS(m,iaer,l)*dfi
263                      gVISgrid(j,1,m,iaer) = &
264                               gVISgrid(j,1,m,iaer)  &
265                               + gVIS(m,iaer,l)*dfi
266                    ENDDO !L_NSPECTV
267                    eprefVISgrid(j,1,iaer) =  &
268                               eprefVISgrid(j,1,iaer)  &
269                               + QREFvis(iaer,l)*dfi
270                  ENDDO !nsize
271                ELSE                   ! INFRARED DOMAIN ----------
272!                 2.3.3.ir Initialization
273                  epIRgrid(j,1,:,iaer)=0.
274                  omegIRgrid(j,1,:,iaer)=0.
275                  gIRgrid(j,1,:,iaer)=0.
276                  eprefIRgrid(j,1,iaer)=0.
277!                 2.3.4.ir Log-normal distribution
278                  DO l=1,nsize(iaer,idomain)+1
279                    dfi_tmp(l) = log(radiusint(l)/r_g) / &
280                                sqrt(2.)/sigma_g
281                  ENDDO
282                  DO l=1,nsize(iaer,idomain)
283                    dfi = 0.5*( derf(dfi_tmp(l+1)) - &
284                               derf(dfi_tmp(l)) )
285                    DO m=1,L_NSPECTI
286                      epIRgrid(j,1,m,iaer) = &
287                               epIRgrid(j,1,m,iaer) &
288                               + QIRsQREF(m,iaer,l)*dfi
289                      omegIRgrid(j,1,m,iaer) = &
290                               omegIRgrid(j,1,m,iaer) &
291                               + omegaIR(m,iaer,l)*dfi
292                      gIRgrid(j,1,m,iaer) = &
293                               gIRgrid(j,1,m,iaer) &
294                               + gIR(m,iaer,l)*dfi
295                    ENDDO !L_NSPECTI
296                    eprefIRgrid(j,1,iaer) = &
297                               eprefIRgrid(j,1,iaer) &
298                               + QREFir(iaer,l)*dfi
299                  ENDDO !nsize
300                ENDIF                  ! --------------------------
301                checkgrid(j,1,iaer,idomain) = .true.
302              ENDIF !checkgrid
303          ENDDO !grid_i
304!         2.4 Linear interpolation
305          k1 = (1-kx)
306          k2 = kx
307          IF (idomain.EQ.1) THEN ! VISIBLE ------------------------
308          DO m=1,L_NSPECTV
309            QVISsQREF3d(ig,lg,m,iaer) = &
310                       k1*epVISgrid(grid_i,1,m,iaer) + &
311                       k2*epVISgrid(grid_i+1,1,m,iaer)
312            omegaVIS3d(ig,lg,m,iaer) = &
313                       k1*omegVISgrid(grid_i,1,m,iaer) + &
314                       k2*omegVISgrid(grid_i+1,1,m,iaer)
315            gVIS3d(ig,lg,m,iaer) = &
316                       k1*gVISgrid(grid_i,1,m,iaer) + &
317                       k2*gVISgrid(grid_i+1,1,m,iaer)
318          ENDDO !L_NSPECTV
319          QREFvis3d(ig,lg,iaer) = &
320                       k1*eprefVISgrid(grid_i,1,iaer) + &
321                       k2*eprefVISgrid(grid_i+1,1,iaer)
322          ELSE                   ! INFRARED -----------------------
323          DO m=1,L_NSPECTI
324            QIRsQREF3d(ig,lg,m,iaer) = &
325                       k1*epIRgrid(grid_i,1,m,iaer) + &
326                       k2*epIRgrid(grid_i+1,1,m,iaer)
327            omegaIR3d(ig,lg,m,iaer) = &
328                       k1*omegIRgrid(grid_i,1,m,iaer) + &
329                       k2*omegIRgrid(grid_i+1,1,m,iaer)
330            gIR3d(ig,lg,m,iaer) = &
331                       k1*gIRgrid(grid_i,1,m,iaer) + &
332                       k2*gIRgrid(grid_i+1,1,m,iaer)
333          ENDDO !L_NSPECTI
334          QREFir3d(ig,lg,iaer) = &
335                       k1*eprefIRgrid(grid_i,1,iaer) + &
336                       k2*eprefIRgrid(grid_i+1,1,iaer)
337          ENDIF                  ! --------------------------------
338        ENDDO !nlayermx
339      ENDDO !ngridmx
340
341      ENDDO ! idomain
342
343
344        ENDIF ! nsize = 1
345      ENDDO ! iaer (loop on aerosol kind)
346
347!      open(116,file='QIRsQREF3dO.dat')
348!      write(116,*) QIRsQREF3d
349!      close(116)
350!      open(117,file='omegaIR3dO.dat')
351!      write(117,*) omegaIR3d
352!      close(117)
353!      open(118,file='gIR3dO.dat')
354!      write(118,*) gIR3d
355!      close(118)
356!      stop
357
358      RETURN
359    END subroutine aeroptproperties
Note: See TracBrowser for help on using the repository browser.