source: LMDZ5/trunk/libf/phylmd/StratAer/miecalc_aer.F90 @ 2690

Last change on this file since 2690 was 2690, checked in by oboucher, 8 years ago

Adding a module for stratospheric aerosols with a bin scheme.
The module gets activated with -strataer true compiling option.
May not quite work yet, more testing needed, but should not affect
the rest of LMDz as everything is under a CPP_StratAer key.

File size: 19.7 KB
Line 
1SUBROUTINE MIECALC_AER(tau_strat, piz_strat, cg_strat, tau_strat_wave, tau_lw_abs_rrtm, paprs, debut)
2
3!-------Mie computations for a size distribution
4!       of homogeneous spheres.
5!
6!==========================================================
7!--Ref : Toon and Ackerman, Applied Optics, 1981
8!        Stephens, CSIRO, 1979
9! Attention : surdimensionement des tableaux
10! to be compiled with double precision option (-r8 on Sun)
11! AUTHOR: Olivier Boucher, Christoph Kleinschmitt
12!-------SIZE distribution properties----------------
13!--sigma_g : geometric standard deviation
14!--r_0     : geometric number mean radius (um)/modal radius
15!--Ntot    : total concentration in m-3
16
17  USE phys_local_var_mod, ONLY: tr_seri, mdw, alpha_bin, piz_bin, cg_bin
18  USE aerophys
19  USE aero_mod
20  USE infotrac, ONLY : nbtr, nbtr_bin, nbtr_sulgas, id_SO2_strat
21  USE dimphy
22  USE YOMCST  , ONLY : RG, RPI
23  USE mod_phys_lmdz_para, only: gather, scatter, bcast
24  USE mod_grid_phy_lmdz, ONLY : klon_glo
25  USE mod_phys_lmdz_mpi_data, ONLY :  is_mpi_root
26
27  IMPLICIT NONE
28
29! Variable input
30  LOGICAL,INTENT(IN) :: debut   ! le flag de l'initialisation de la physique
31  REAL,DIMENSION(klon,klev+1),INTENT(IN) :: paprs   ! pression pour chaque inter-couche (en Pa)
32
33! Stratospheric aerosols optical properties
34  REAL, DIMENSION(klon,klev,nbands_sw_rrtm) :: tau_strat, piz_strat, cg_strat
35  REAL, DIMENSION(klon,klev,nwave_sw+nwave_lw) :: tau_strat_wave
36  REAL, DIMENSION(klon,klev,nbands_lw_rrtm) :: tau_lw_abs_rrtm
37
38!!  REAL,DIMENSION(klon_glo,klev,nbtr)     :: tr_seri_glo         ! Concentration Traceur [U/KgA] 
39
40! local variables
41  REAL Ntot
42  PARAMETER (Ntot=1.0)
43  LOGICAL, PARAMETER :: refr_ind_interpol = .TRUE. ! set interpolation of refractive index
44  REAL r_0    ! aerosol particle radius [m]
45  INTEGER bin_number, ilon, ilev
46  REAL masse,volume,surface
47  REAL rmin, rmax    !----integral bounds in  m
48
49!-------------------------------------
50
51  COMPLEX m          !----refractive index m=n_r-i*n_i
52  INTEGER Nmax,Nstart !--number of iterations
53  COMPLEX k2, k3, z1, z2
54  COMPLEX u1,u5,u6,u8
55  COMPLEX a(1:21000), b(1:21000)
56  COMPLEX I
57  INTEGER n  !--loop index
58  REAL nnn
59  COMPLEX nn
60  REAL Q_ext, Q_abs, Q_sca, g, omega   !--parameters for radius r
61  REAL x  !--size parameter
62  REAL r, r_lower, r_upper  !--radius
63  REAL sigma_sca, sigma_ext, sigma_abs
64  REAL omegatot,  gtot !--averaged parameters
65  COMPLEX ksiz2(-1:21000), psiz2(1:21000)
66  COMPLEX nu1z1(1:21010), nu1z2(1:21010)
67  COMPLEX nu3z2(0:21000)
68  REAL number, deltar
69  INTEGER bin, Nbin, it
70  PARAMETER (Nbin=10)
71
72!--has to be consistent with dataset
73  INTEGER nb_lambda_h2so4
74  PARAMETER (nb_lambda_h2so4=62) !61, 235
75
76!---wavelengths STREAMER
77  INTEGER Nwv, NwvmaxSW
78  PARAMETER (NwvmaxSW=24)
79  REAL lambda(1:NwvmaxSW+1)
80  DATA lambda/0.28E-6, 0.30E-6, 0.33E-6, 0.36E-6, 0.40E-6, &
81              0.44E-6, 0.48E-6, 0.52E-6, 0.57E-6, 0.64E-6, &
82              0.69E-6, 0.75E-6, 0.78E-6, 0.87E-6, 1.00E-6, &
83              1.10E-6, 1.19E-6, 1.28E-6, 1.53E-6, 1.64E-6, &
84              2.13E-6, 2.38E-6, 2.91E-6, 3.42E-6, 4.00E-6/
85
86!---wavelengths de references
87!---be careful here the 5th wavelength is 1020 nm
88  INTEGER nb
89  REAL lambda_ref(nwave_sw+nwave_lw)
90  DATA lambda_ref /0.443E-6,0.550E-6,0.670E-6,  &
91                   0.765E-6,1.020E-6,10.E-6/
92
93!--LW
94  INTEGER NwvmaxLW
95  PARAMETER (NwvmaxLW=500)
96  REAL Tb, hh, cc, kb
97  PARAMETER (Tb=220.0, hh=6.62607e-34)
98  PARAMETER (cc=2.99792e8, kb=1.38065e-23)
99
100!---TOA fluxes - Streamer Cs
101  REAL weight(1:NwvmaxSW), weightLW
102!c        DATA weight/0.839920E1, 0.231208E2, 0.322393E2, 0.465058E2,
103!c     .              0.678199E2, 0.798964E2, 0.771359E2, 0.888472E2,
104!c     .              0.115281E3, 0.727565E2, 0.816992E2, 0.336172E2,
105!c     .              0.914603E2, 0.112706E3, 0.658840E2, 0.524470E2,
106!c     .              0.391067E2, 0.883864E2, 0.276672E2, 0.681812E2,
107!c     .              0.190966E2, 0.250766E2, 0.128704E2, 0.698720E1/
108!---TOA fluxes - Tad
109  DATA weight/ 4.20, 11.56, 16.12, 23.25, 33.91, 39.95, 38.57, &
110              44.42, 57.64, 29.36, 47.87, 16.81, 45.74, 56.35, &
111              32.94, 26.22, 19.55, 44.19, 13.83, 34.09,  9.55, &
112              12.54,  6.44,  3.49/
113!C---BOA fluxes - Tad
114!c        DATA weight/ 0.01,  4.05, 9.51,  15.99, 26.07, 33.10, 33.07,
115!c     .              39.91, 52.67, 27.89, 43.60, 13.67, 42.22, 40.12,
116!c     .              32.70, 14.44, 19.48, 14.23, 13.43, 16.42,  8.33,
117!c     .               0.95,  0.65, 2.76/
118
119  REAL lambda_int(1:NwvmaxSW+nwave_sw+nwave_lw+NwvmaxLW), ll
120  REAL dlambda_int(1:NwvmaxSW+nwave_sw+nwave_lw+NwvmaxLW), dl
121
122  REAL n_r(1:NwvmaxSW+nwave_sw+nwave_lw+NwvmaxLW)
123  REAL n_i(1:NwvmaxSW+nwave_sw+nwave_lw+NwvmaxLW)
124
125  REAL ilambda, ilambda_prev, ilambda_max, ilambda_min
126  REAL n_r_h2so4, n_i_h2so4
127  REAL n_r_h2so4_prev, n_i_h2so4_prev
128
129  REAL final_a(1:NwvmaxSW+nwave_sw+nwave_lw+NwvmaxLW)
130  REAL final_g(1:NwvmaxSW+nwave_sw+nwave_lw+NwvmaxLW)
131  REAL final_w(1:NwvmaxSW+nwave_sw+nwave_lw+NwvmaxLW)
132
133  INTEGER band, bandSW, bandLW
134
135!---wavelengths SW RRTM
136  REAL wv_rrtm_SW(nbands_sw_rrtm+1)
137  DATA wv_rrtm_SW/  0.185E-6, 0.25E-6, 0.44E-6, 0.69E-6,  &
138                     1.19E-6, 2.38E-6, 4.00E-6/
139
140!---wavenumbers and wavelengths LW RRTM
141  REAL wn_rrtm(nbands_lw_rrtm+1), wv_rrtm(nbands_lw_rrtm+1)
142  DATA wn_rrtm/  10.,  250.,  500.,  630.,  700.,  820.,  &
143                980., 1080., 1180., 1390., 1480., 1800.,  &
144               2080., 2250., 2380., 2600., 3000./
145
146!--GCM results
147  REAL gcm_a(nbands_sw_rrtm+nbands_lw_rrtm)
148  REAL gcm_g(nbands_sw_rrtm+nbands_lw_rrtm)
149  REAL gcm_w(nbands_sw_rrtm+nbands_lw_rrtm)
150  REAL gcm_weight_a(nbands_sw_rrtm+nbands_lw_rrtm)
151  REAL gcm_weight_g(nbands_sw_rrtm+nbands_lw_rrtm)
152  REAL gcm_weight_w(nbands_sw_rrtm+nbands_lw_rrtm)
153
154  REAL ss_a(nbands_sw_rrtm+nbands_lw_rrtm+nwave_sw+nwave_lw)
155  REAL ss_w(nbands_sw_rrtm+nbands_lw_rrtm+nwave_sw+nwave_lw)
156  REAL ss_g(nbands_sw_rrtm+nbands_lw_rrtm+nwave_sw+nwave_lw)
157
158  REAL wavenumber
159  REAL, DIMENSION(nb_lambda_h2so4,4) :: ref_ind
160
161!---------------------------------------------------------
162
163  IF (debut) THEN   
164  !--initialising dry diameters to geometrically spaced mass/volume (see Jacobson 1994)
165      mdw(1)=mdwmin
166      IF (V_rat.LT.1.62) THEN ! compensate for dip in second bin for lower volume ratio
167        mdw(2)=mdw(1)*2.**(1./3.)
168        DO it=3, nbtr_bin
169          mdw(it)=mdw(it-1)*V_rat**(1./3.)
170        ENDDO
171      ELSE
172        DO it=2, nbtr_bin
173          mdw(it)=mdw(it-1)*V_rat**(1./3.)
174        ENDDO
175      ENDIF
176      PRINT *,'init mdw=', mdw
177
178!$OMP MASTER
179
180!    CALL gather(tr_seri, tr_seri_glo)
181!    IF (is_mpi_root) THEN
182!    IF (MAXVAL(tr_seri_glo).LT.1e-30) THEN
183
184    !--compute particle radius for a composition of 75% H2SO4 / 25% H2O at T=293K
185    DO bin_number=1, nbtr_bin
186      r_0=(dens_aer_dry/dens_aer_ref/0.75)**(1./3.)*mdw(bin_number)/2.
187    !--integral boundaries set to bin boundaries
188      rmin=r_0/sqrt(V_rat**(1./3.))
189      rmax=r_0*sqrt(V_rat**(1./3.))
190
191    !--set up SW
192      DO Nwv=1, NwvmaxSW
193        lambda_int(Nwv)=( lambda(Nwv)+lambda(Nwv+1) ) /2.
194      ENDDO
195
196      DO nb=1, nwave_sw+nwave_lw
197        lambda_int(NwvmaxSW+nb)=lambda_ref(nb)
198      ENDDO
199
200    !--set up LW
201    !--conversion wavenumber in cm-1 to wavelength in m
202      DO Nwv=1, nbands_lw_rrtm+1
203        wv_rrtm(Nwv)=10000./wn_rrtm(Nwv)*1.e-6
204      ENDDO
205
206      DO Nwv=1, NwvmaxLW
207        lambda_int(NwvmaxSW+nwave_sw+nwave_lw+Nwv)= &
208          exp( log(wv_rrtm(1))+float(Nwv-1)/float(NwvmaxLW-1)* &
209          (log(wv_rrtm(nbands_lw_rrtm+1))-log(wv_rrtm(1))) )
210      ENDDO
211
212!--computing the dlambdas
213      Nwv=1
214      dlambda_int(NwvmaxSW+nwave_sw+nwave_lw+Nwv)= &
215      &  lambda_int(NwvmaxSW+nwave_sw+nwave_lw+Nwv)- &
216      &  lambda_int(NwvmaxSW+nwave_sw+nwave_lw+Nwv+1)
217      DO Nwv=2, NwvmaxLW-1
218      dlambda_int(NwvmaxSW+nwave_sw+nwave_lw+Nwv)= &
219      &  (lambda_int(NwvmaxSW+nwave_sw+nwave_lw+Nwv-1)- &
220      &  lambda_int(NwvmaxSW+nwave_sw+nwave_lw+Nwv+1))/2.
221      ENDDO
222      Nwv=NwvmaxLW
223      dlambda_int(NwvmaxSW+nwave_sw+nwave_lw+Nwv)= &
224      &  lambda_int(NwvmaxSW+nwave_sw+nwave_lw+Nwv-1)- &
225      &  lambda_int(NwvmaxSW+nwave_sw+nwave_lw+Nwv)
226
227      OPEN (unit=11,file='h2so4_0.75_300.00_hummel_1988_p_q.dat')
228
229      IF (refr_ind_interpol) THEN
230        DO nb=1,nb_lambda_h2so4
231          READ(11,*) ref_ind(nb,:)
232        ENDDO
233        ilambda_max=ref_ind(1,2)/1.e6 !--in m
234        ilambda_min=ref_ind(nb_lambda_h2so4,2)/1.e6 !--in m
235        DO Nwv=1, NwvmaxSW+nwave_sw+nwave_lw+NwvmaxLW
236          IF (lambda_int(Nwv).GT.ilambda_max) THEN
237            !for lambda out of data range, take boundary values
238            n_r(Nwv)=ref_ind(1,3)
239            n_i(Nwv)=ref_ind(1,4)
240          ELSEIF (lambda_int(Nwv).LE.ilambda_min) THEN
241            n_r(Nwv)=ref_ind(nb_lambda_h2so4,3)
242            n_i(Nwv)=ref_ind(nb_lambda_h2so4,4)
243          ELSE
244            DO nb=2,nb_lambda_h2so4
245              ilambda=ref_ind(nb,2)/1.e6
246              ilambda_prev=ref_ind(nb-1,2)/1.e6
247              n_r_h2so4=ref_ind(nb,3)
248              n_r_h2so4_prev=ref_ind(nb-1,3)
249              n_i_h2so4=ref_ind(nb,4)
250              n_i_h2so4_prev=ref_ind(nb-1,4)
251              IF (lambda_int(Nwv).GT.ilambda.AND. &
252                lambda_int(Nwv).LE.ilambda_prev) THEN !--- linear interpolation
253                n_r(Nwv)=n_r_h2so4+(lambda_int(Nwv)-ilambda)/ &
254                     (ilambda_prev-ilambda)*(n_r_h2so4_prev-n_r_h2so4)
255                n_i(Nwv)=n_i_h2so4+(lambda_int(Nwv)-ilambda)/ &
256                     (ilambda_prev-ilambda)*(n_i_h2so4_prev-n_i_h2so4)
257              ENDIF
258            ENDDO
259          ENDIF
260        ENDDO
261      ELSE
262        DO nb=1,nb_lambda_h2so4
263          READ(11,*) wavenumber, ilambda, n_r_h2so4, n_i_h2so4
264          ilambda=1000.*ilambda !wavelength in nm
265          DO Nwv=1, NwvmaxSW+nwave_sw+nwave_lw+NwvmaxLW
266            IF (ilambda/1.e9.GT.lambda_int(Nwv)) THEN !--- step function
267              n_r(Nwv)=n_r_h2so4
268              n_i(Nwv)=n_i_h2so4
269            ENDIF 
270          ENDDO
271        ENDDO
272      ENDIF
273      CLOSE(11)
274
275    !---Loop on wavelengths
276      DO Nwv=1, NwvmaxSW+nwave_sw+nwave_lw+NwvmaxLW
277
278      m=CMPLX(n_r(Nwv),-n_i(Nwv))
279
280      I=CMPLX(0.,1.)
281
282      sigma_sca=0.0
283      sigma_ext=0.0
284      sigma_abs=0.0
285      gtot=0.0
286      omegatot=0.0
287      masse = 0.0
288      volume=0.0
289      surface=0.0
290
291      DO bin=1, Nbin !---loop on size bins
292
293      r_lower=exp(log(rmin)+FLOAT(bin-1)/FLOAT(Nbin)*(log(rmax)-log(rmin)))
294      r_upper=exp(log(rmin)+FLOAT(bin)/FLOAT(Nbin)*(log(rmax)-log(rmin)))
295      r=sqrt(r_lower*r_upper)
296      x=2.*RPI*r/lambda_int(Nwv)
297      deltar=r_upper-r_lower
298
299      number=Ntot*deltar/(rmax-rmin) !dN/dr constant over tracer bin
300!      masse=masse  +4./3.*RPI*(r**3)*number*deltar*ropx*1.E3  !--g/m3
301      volume=volume+4./3.*RPI*(r**3)*number*deltar
302      surface=surface+4.*RPI*r**2*number*deltar
303
304      k2=m
305      k3=CMPLX(1.0,0.0)
306
307      z2=CMPLX(x,0.0)
308      z1=m*z2
309
310      IF (0.0.LE.x.AND.x.LE.8.) THEN
311        Nmax=INT(x+4*x**(1./3.)+1.)+2
312      ELSEIF (8..LT.x.AND.x.LT.4200.) THEN
313        Nmax=INT(x+4.05*x**(1./3.)+2.)+1
314      ELSEIF (4200..LE.x.AND.x.LE.20000.) THEN
315        Nmax=INT(x+4*x**(1./3.)+2.)+1
316      ELSE
317        PRINT *, 'x out of bound, x=', x
318        STOP
319      ENDIF
320
321      Nstart=Nmax+10
322
323    !-----------loop for nu1z1, nu1z2
324
325      nu1z1(Nstart)=CMPLX(0.0,0.0)
326      nu1z2(Nstart)=CMPLX(0.0,0.0)
327      DO n=Nstart-1, 1 , -1
328        nn=CMPLX(FLOAT(n),0.0)
329        nu1z1(n)=(nn+1.)/z1 - 1./( (nn+1.)/z1 + nu1z1(n+1) )
330        nu1z2(n)=(nn+1.)/z2 - 1./( (nn+1.)/z2 + nu1z2(n+1) )
331      ENDDO
332
333    !------------loop for nu3z2
334
335      nu3z2(0)=-I
336      DO n=1, Nmax
337        nn=CMPLX(FLOAT(n),0.0)
338        nu3z2(n)=-nn/z2 + 1./ (nn/z2 - nu3z2(n-1) )
339      ENDDO
340
341    !-----------loop for psiz2 and ksiz2 (z2)
342      ksiz2(-1)=COS(REAL(z2))-I*SIN(REAL(z2))
343      ksiz2(0)=SIN(REAL(z2))+I*COS(REAL(z2))
344      DO n=1,Nmax
345       nn=CMPLX(FLOAT(n),0.0)
346       ksiz2(n)=(2.*nn-1.)/z2 * ksiz2(n-1) - ksiz2(n-2)
347       psiz2(n)=CMPLX(REAL(ksiz2(n)),0.0)
348      ENDDO
349
350    !-----------loop for a(n) and b(n)
351
352      DO n=1, Nmax
353        u1=k3*nu1z1(n) - k2*nu1z2(n)
354        u5=k3*nu1z1(n) - k2*nu3z2(n)
355        u6=k2*nu1z1(n) - k3*nu1z2(n)
356        u8=k2*nu1z1(n) - k3*nu3z2(n)
357        a(n)=psiz2(n)/ksiz2(n) * u1/u5
358        b(n)=psiz2(n)/ksiz2(n) * u6/u8
359      ENDDO
360
361    !-----------------final loop--------------
362      Q_ext=0.0
363      Q_sca=0.0
364      g=0.0
365      DO n=Nmax-1,1,-1
366        nnn=FLOAT(n)
367        Q_ext=Q_ext+ (2.*nnn+1.) * REAL( a(n)+b(n) )
368        Q_sca=Q_sca+ (2.*nnn+1.) *  &
369                   REAL( a(n)*CONJG(a(n)) + b(n)*CONJG(b(n)) )
370        g=g + nnn*(nnn+2.)/(nnn+1.) *   &
371           REAL( a(n)*CONJG(a(n+1))+b(n)*CONJG(b(n+1)) )  +   &
372              (2.*nnn+1.)/nnn/(nnn+1.) * REAL(a(n)*CONJG(b(n)))
373      ENDDO
374      Q_ext=2./x**2 * Q_ext
375      Q_sca=2./x**2 * Q_sca
376      Q_abs=Q_ext-Q_sca
377      IF (AIMAG(m).EQ.0.0) Q_abs=0.0
378      omega=Q_sca/Q_ext
379      g=g*4./x**2/Q_sca
380
381      sigma_sca=sigma_sca+r**2*Q_sca*number
382      sigma_abs=sigma_abs+r**2*Q_abs*number
383      sigma_ext=sigma_ext+r**2*Q_ext*number
384      omegatot=omegatot+r**2*Q_ext*omega*number
385      gtot    =gtot+r**2*Q_sca*g*number
386
387      ENDDO   !---bin
388    !------------------------------------------------------------------
389
390      sigma_sca=RPI*sigma_sca
391      sigma_abs=RPI*sigma_abs
392      sigma_ext=RPI*sigma_ext
393      gtot=RPI*gtot/sigma_sca
394      omegatot=RPI*omegatot/sigma_ext
395
396      final_g(Nwv)=gtot
397      final_w(Nwv)=omegatot
398!      final_a(Nwv)=sigma_ext/masse
399      final_a(Nwv)=sigma_ext !extinction/absorption cross section per particle
400
401      ENDDO  !--loop on wavelength
402
403
404    !---averaging over LMDZ wavebands
405
406      DO band=1, nbands_sw_rrtm+nbands_lw_rrtm
407        gcm_a(band)=0.0
408        gcm_g(band)=0.0
409        gcm_w(band)=0.0
410        gcm_weight_a(band)=0.0
411        gcm_weight_g(band)=0.0
412        gcm_weight_w(band)=0.0
413      ENDDO
414
415    !---band 1 is now in the UV, so we take the first wavelength as being representative
416      DO Nwv=1,1
417        bandSW=1
418        gcm_a(bandSW)=gcm_a(bandSW)+final_a(Nwv)*weight(Nwv)
419        gcm_weight_a(bandSW)=gcm_weight_a(bandSW)+weight(Nwv)
420        gcm_w(bandSW)=gcm_w(bandSW)+final_w(Nwv)*final_a(Nwv)*weight(Nwv)
421        gcm_weight_w(bandSW)=gcm_weight_w(bandSW)+final_a(Nwv)*weight(Nwv)
422        gcm_g(bandSW)=gcm_g(bandSW)+final_g(Nwv)*final_a(Nwv)*final_w(Nwv)*weight(Nwv)
423        gcm_weight_g(bandSW)=gcm_weight_g(bandSW)+final_a(Nwv)*final_w(Nwv)*weight(Nwv)
424      ENDDO
425
426      DO Nwv=1,NwvmaxSW
427
428        IF (lambda_int(Nwv).LE.wv_rrtm_SW(3)) THEN      !--RRTM spectral interval 2
429          bandSW=2
430        ELSEIF (lambda_int(Nwv).LE.wv_rrtm_SW(4)) THEN  !--RRTM spectral interval 3
431          bandSW=3
432        ELSEIF (lambda_int(Nwv).LE.wv_rrtm_SW(5)) THEN  !--RRTM spectral interval 4
433          bandSW=4
434        ELSEIF (lambda_int(Nwv).LE.wv_rrtm_SW(6)) THEN  !--RRTM spectral interval 5
435          bandSW=5
436        ELSE                                            !--RRTM spectral interval 6
437          bandSW=6
438        ENDIF
439
440        gcm_a(bandSW)=gcm_a(bandSW)+final_a(Nwv)*weight(Nwv)
441        gcm_weight_a(bandSW)=gcm_weight_a(bandSW)+weight(Nwv)
442        gcm_w(bandSW)=gcm_w(bandSW)+final_w(Nwv)*final_a(Nwv)*weight(Nwv)
443        gcm_weight_w(bandSW)=gcm_weight_w(bandSW)+final_a(Nwv)*weight(Nwv)
444        gcm_g(bandSW)=gcm_g(bandSW)+final_g(Nwv)*final_a(Nwv)*final_w(Nwv)*weight(Nwv)
445        gcm_weight_g(bandSW)=gcm_weight_g(bandSW)+final_a(Nwv)*final_w(Nwv)*weight(Nwv)
446
447      ENDDO
448
449      DO Nwv=NwvmaxSW+nwave_sw+nwave_lw+1,NwvmaxSW+nwave_sw+nwave_lw+NwvmaxLW
450        ll=lambda_int(Nwv)
451        dl=dlambda_int(Nwv)
452        weightLW=1./ll**5./(exp(hh*cc/kb/Tb/ll)-1.)*dl
453        bandLW=1  !--default value starting from the highest lambda
454        DO band=2, nbands_lw_rrtm
455          IF (ll.LT.wv_rrtm(band)) THEN   !--as long as
456            bandLW=band
457          ENDIF
458        ENDDO
459        gcm_a(nbands_sw_rrtm+bandLW)=gcm_a(nbands_sw_rrtm+bandLW)+final_a(Nwv)*   &
460             (1.-final_w(Nwv))*weightLW
461        gcm_weight_a(nbands_sw_rrtm+bandLW)=gcm_weight_a(nbands_sw_rrtm+bandLW)+weightLW
462
463        gcm_w(nbands_sw_rrtm+bandLW)=gcm_w(nbands_sw_rrtm+bandLW)+final_w(Nwv)*   &
464             final_a(Nwv)*weightLW
465        gcm_weight_w(nbands_sw_rrtm+bandLW)=gcm_weight_w(nbands_sw_rrtm+bandLW)+  &
466             final_a(Nwv)*weightLW
467
468        gcm_g(nbands_sw_rrtm+bandLW)=gcm_g(nbands_sw_rrtm+bandLW)+final_g(Nwv)*   &
469             final_a(Nwv)*final_w(Nwv)*weightLW
470        gcm_weight_g(nbands_sw_rrtm+bandLW)=gcm_weight_g(nbands_sw_rrtm+bandLW)+  &
471             final_a(Nwv)*final_w(Nwv)*weightLW
472      ENDDO
473
474      DO band=1, nbands_sw_rrtm+nbands_lw_rrtm
475        gcm_a(band)=gcm_a(band)/gcm_weight_a(band)
476        gcm_w(band)=gcm_w(band)/gcm_weight_w(band)
477        gcm_g(band)=gcm_g(band)/gcm_weight_g(band)
478        ss_a(band)=gcm_a(band)
479        ss_w(band)=gcm_w(band)
480        ss_g(band)=gcm_g(band)
481      ENDDO
482
483      DO nb=1, nwave_sw+nwave_lw
484        ss_a(nbands_sw_rrtm+nbands_lw_rrtm+nb)=final_a(NwvmaxSW+nb)
485        ss_w(nbands_sw_rrtm+nbands_lw_rrtm+nb)=final_w(NwvmaxSW+nb)
486        ss_g(nbands_sw_rrtm+nbands_lw_rrtm+nb)=final_g(NwvmaxSW+nb)
487      ENDDO
488
489      DO nb=1,nbands_sw_rrtm+nbands_lw_rrtm+nwave_sw+nwave_lw
490        alpha_bin(nb,bin_number)=ss_a(nb) !extinction/absorption cross section per particle
491        piz_bin(nb,bin_number)=ss_w(nb)
492        cg_bin(nb,bin_number)=ss_g(nb)
493
494      ENDDO
495
496    ENDDO !loop over tracer bins
497
498!    ENDIF !mpi_root
499
500!$OMP END MASTER
501  CALL bcast(alpha_bin)
502  CALL bcast(piz_bin)
503  CALL bcast(cg_bin)
504!$OMP BARRIER
505
506!    CALL scatter(alpha_bin, alpha_bin)
507!    CALL scatter(piz_bin, piz_bin)
508!    CALL scatter(cg_bin, cg_bin)
509
510    !set to default values at first time step (tr_seri still zero)
511    tau_strat(:,:,:)=1.e-15
512    piz_strat(:,:,:)=1.0
513    cg_strat(:,:,:)=0.0
514    tau_lw_abs_rrtm(:,:,:)=1.e-15
515    tau_strat_wave(:,:,:)=1.e-15
516
517  ELSE
518
519!    CALL gather(tr_seri, tr_seri_glo)
520
521  !--compute optical properties of actual size distribution (from tr_seri)
522    DO ilon=1,klon
523      DO ilev=1, klev
524        DO nb=1,nbands_sw_rrtm
525          tau_strat(ilon,ilev,nb)=0.0
526          DO bin_number=1, nbtr_bin
527            tau_strat(ilon,ilev,nb)=tau_strat(ilon,ilev,nb)+alpha_bin(nb,bin_number) &
528                                *tr_seri(ilon,ilev,bin_number+nbtr_sulgas)*(paprs(ilon,ilev)-paprs(ilon,ilev+1))/RG
529          ENDDO
530
531          piz_strat(ilon,ilev,nb)=0.0
532          DO bin_number=1, nbtr_bin
533            piz_strat(ilon,ilev,nb)=piz_strat(ilon,ilev,nb)+piz_bin(nb,bin_number)*alpha_bin(nb,bin_number) &
534                                *tr_seri(ilon,ilev,bin_number+nbtr_sulgas)*(paprs(ilon,ilev)-paprs(ilon,ilev+1))/RG
535          ENDDO
536          piz_strat(ilon,ilev,nb)=piz_strat(ilon,ilev,nb)/MAX(tau_strat(ilon,ilev,nb),1.e-15)
537
538          cg_strat(ilon,ilev,nb)=0.0
539          DO bin_number=1, nbtr_bin
540            cg_strat(ilon,ilev,nb)=cg_strat(ilon,ilev,nb)+cg_bin(nb,bin_number)*piz_bin(nb,bin_number)*alpha_bin(nb,bin_number) &
541                                *tr_seri(ilon,ilev,bin_number+nbtr_sulgas)*(paprs(ilon,ilev)-paprs(ilon,ilev+1))/RG
542          ENDDO
543          cg_strat(ilon,ilev,nb)=cg_strat(ilon,ilev,nb)/MAX(tau_strat(ilon,ilev,nb)*piz_strat(ilon,ilev,nb),1.e-15)
544        ENDDO
545        DO nb=1,nbands_lw_rrtm
546          tau_lw_abs_rrtm(ilon,ilev,nb)=0.0
547          DO bin_number=1, nbtr_bin
548            tau_lw_abs_rrtm(ilon,ilev,nb)=tau_lw_abs_rrtm(ilon,ilev,nb)+alpha_bin(nbands_sw_rrtm+nb,bin_number) &
549                                *tr_seri(ilon,ilev,bin_number+nbtr_sulgas)*(paprs(ilon,ilev)-paprs(ilon,ilev+1))/RG
550          ENDDO
551        ENDDO
552        DO nb=1,nwave_sw+nwave_lw
553          tau_strat_wave(ilon,ilev,nb)=0.0
554          DO bin_number=1, nbtr_bin
555            tau_strat_wave(ilon,ilev,nb)=tau_strat_wave(ilon,ilev,nb)+alpha_bin(nbands_sw_rrtm+nbands_lw_rrtm+nb,bin_number) &
556                                *tr_seri(ilon,ilev,bin_number+nbtr_sulgas)*(paprs(ilon,ilev)-paprs(ilon,ilev+1))/RG
557          ENDDO
558        ENDDO
559      ENDDO
560    ENDDO
561
562  ENDIF !debut
563
564END SUBROUTINE MIECALC_AER
Note: See TracBrowser for help on using the repository browser.