source: trunk/LMDZ.VENUS/libf/phyvenus/aeropacity.F90 @ 2560

Last change on this file since 2560 was 2560, checked in by slebonnois, 4 years ago

SL: Implementation of SW computation based on generic model. Switch between this new SW module or old module that reads R. Haus tables implemented with a key (solarchoice)

File size: 16.4 KB
Line 
1      Subroutine aeropacity(ngrid,nlayer,pplay,pplev,pt, &
2         aerosol,reffrad,nueffrad,QREFvis3d,tau_col)
3
4       use radinc_h, only : L_TAUMAX,naerkind
5       use aerosol_mod
6                 
7       implicit none
8#include "YOMCST.h"
9
10!==================================================================
11!     
12!     Purpose
13!     -------
14!     Compute aerosol optical depth in each gridbox.
15!     
16!     Authors
17!     -------
18!     F. Forget
19!     F. Montmessin (water ice scheme)
20!     update J.-B. Madeleine (2008)
21!     dust removal, simplification by Robin Wordsworth (2009)
22!     Generic n-layer aerosol - J. Vatant d'Ollone (2020)
23!
24!     Input
25!     -----
26!     ngrid             Number of horizontal gridpoints
27!     nlayer            Number of layers
28!     pplev             Pressure (Pa) at each layer boundary
29!     reffrad(ngrid,nlayer,naerkind)         Aerosol effective radius
30!     QREFvis3d(ngrid,nlayer,naerkind) \ 3d extinction coefficients
31!     QREFir3d(ngrid,nlayer,naerkind)  / at reference wavelengths
32!
33!     Output
34!     ------
35!     aerosol            Aerosol optical depth in layer l, grid point ig
36!     tau_col            Total column optical depth at grid point ig
37!
38!=======================================================================
39
40      INTEGER,INTENT(IN) :: ngrid  ! number of atmospheric columns
41      INTEGER,INTENT(IN) :: nlayer ! number of atmospheric layers
42      REAL,INTENT(IN) :: pplay(ngrid,nlayer) ! mid-layer pressure (Pa)
43      REAL,INTENT(IN) :: pplev(ngrid,nlayer+1) ! inter-layer pressure (Pa)
44      REAL,INTENT(IN) :: pt(ngrid,nlayer) ! mid-layer temperatre (K)
45      REAL,INTENT(OUT) :: aerosol(ngrid,nlayer,naerkind) ! aerosol optical depth
46      REAL,INTENT(IN) :: reffrad(ngrid,nlayer,naerkind) ! aerosol effective radius
47      REAL,INTENT(IN) :: nueffrad(ngrid,nlayer,naerkind) ! aerosol effective variance
48      REAL,INTENT(IN) :: QREFvis3d(ngrid,nlayer,naerkind) ! extinction coefficient in the visible
49      REAL,INTENT(OUT):: tau_col(ngrid) !column integrated visible optical depth
50
51      real aerosol0, obs_tau_col_aurora, pm
52      real pcloud_deck, cloud_slope
53
54      real dp_strato(ngrid)
55      real dp_tropo(ngrid)
56      real dp_layer(ngrid)
57
58      INTEGER l,ig,iq,iaer,ia,ll
59
60      LOGICAL,SAVE :: firstcall=.true.
61!$OMP THREADPRIVATE(firstcall)
62      REAL CBRT
63      EXTERNAL CBRT
64
65      ! for fixed dust profiles
66      real topdust, expfactor, zp
67      REAL taudusttmp(ngrid) ! Temporary dust opacity used before scaling
68      REAL tauh2so4tmp(ngrid) ! Temporary h2so4 opacity used before scaling
69
70      real CLFtot
71
72      !  for venus clouds
73      real :: p_bot2,p_bot,p_top,p_top2,h_bot2,h_bot,h_top,h_top2
74      real :: mode_dens,h_lay,nmode1,nmode2,nmode2p,nmode3,nmodeuv
75
76! First call only
77      IF (firstcall) THEN
78
79      ! identify tracers
80        write(*,*) "Active aerosols found in aeropacity:"
81
82        if (iaero_venus1.ne.0) then
83          print*,'iaero_venus1= ',iaero_venus1
84        endif
85        if (iaero_venus2.ne.0) then
86          print*,'iaero_venus2= ',iaero_venus2
87        endif
88        if (iaero_venus2p.ne.0) then
89          print*,'iaero_venus2p= ',iaero_venus2p
90        endif
91        if (iaero_venus3.ne.0) then
92          print*,'iaero_venus3= ',iaero_venus3
93        endif
94        if (iaero_venusUV.ne.0) then
95          print*,'iaero_venusUV= ',iaero_venusUV
96        endif
97
98        firstcall=.false.
99      ENDIF ! of IF (firstcall)
100
101
102!     ---------------------------------------------------------
103
104!==================================================================
105!         Venus clouds (4 modes)
106!   S. Lebonnois (jan 2016)
107!==================================================================
108! distributions from Haus et al, 2016
109! mode             1      2      2p     3
110! r (microns)     0.30   1.05   1.40   3.65
111! sigma           1.56   1.29   1.23   1.28
112! reff (microns)  0.49   1.23   1.56   4.25
113! nueff           0.21   0.067  0.044  0.063
114! (nueff=exp(ln^2 sigma)-1)
115!
116! p_bot <=> zb ; p_top <=> zb+zc ; h_bot <=> Hlo ; h_top <=> Hup
117! p<p_top: N(i+1)=N(i)*(p(i+1)/p(i))**(h_lay(i)/h_top)     
118!    h_lay=R(T(i)+T(i+1))/2/g  (in m)
119!    R=8.31/mu (mu in kg/mol)
120! p>p_bot: N(i-1)=N(i)*(p(i)/p(i-1))**(h_lay(i)/h_bot)     
121! N is in m-3
122!
123! dTau = Qext*[pi*reff**2*exp(-3*ln(1+nueff))]*N*h_lay*(-dp)/p
124
125! Mode 1
126      if (iaero_venus1 .ne.0) then
127          iaer=iaero_venus1
128
129!       1. Initialization
130          aerosol(1:ngrid,1:nlayer,iaer)=0.0
131! two scales heights for below and above max density (cf Haus et al 16)
132          p_bot2 = 2.0e5 ! Pa   2.0e5
133            h_bot2 = 5.0e3 ! m
134          p_bot  = 1.2e5   !    1.2e5
135            h_bot  = 1.0e3
136          nmode1 = 1.935e8 ! m-3
137          p_top  = 1.0e4
138            h_top  = 3.5e3
139          p_top2 = 4.5e2
140            h_top2 = 2.0e3
141
142!       2. Opacity calculation
143
144          DO ig=1,ngrid
145! determine the approximate middle of the mode layer
146           ll=1
147           DO l=1,nlayer-1    ! high p to low p
148             IF (pplay(ig,l) .gt. (p_top+p_bot)/2) ll=l
149           ENDDO
150! from there go down and up for profile N
151           mode_dens = nmode1  ! m-3
152           DO l=ll,1,-1
153             h_lay=RD*(pt(ig,l+1)+pt(ig,l))/2./RG
154             IF (pplay(ig,l) .le. p_bot) THEN
155               mode_dens = nmode1  ! m-3
156             ELSEIF (pplay(ig,l) .gt. p_bot .and. pplay(ig,l) .le. p_bot2) THEN
157               mode_dens = mode_dens*(pplay(ig,l+1)/pplay(ig,l))**(h_lay/h_bot)
158             ELSEIF (pplay(ig,l) .gt. p_bot2) THEN
159               mode_dens = mode_dens*(pplay(ig,l+1)/pplay(ig,l))**(h_lay/h_bot2)
160             ENDIF
161             mode_dens=max(1.e-30,mode_dens)
162             aerosol(ig,l,iaer) = QREFvis3d(ig,l,iaer)*                       &
163              RPI*(reffrad(ig,l,iaer))**2*exp(-3.*log(1+nueffrad(ig,l,iaer)))* &
164              mode_dens*h_lay*(pplev(ig,l)-pplev(ig,l+1))/pplay(ig,l)
165!             aerosol(ig,l,iaer) = mode_dens
166           ENDDO
167           mode_dens = nmode1  ! m-3
168           DO l=ll+1,nlayer-1
169             h_lay=RD*(pt(ig,l-1)+pt(ig,l))/2./RG
170             IF (pplay(ig,l) .gt. p_top) THEN
171               mode_dens = nmode1  ! m-3
172             ELSEIF (pplay(ig,l) .le. p_top .and. pplay(ig,l) .gt. p_top2) THEN
173               mode_dens = mode_dens*(pplay(ig,l)/pplay(ig,l-1))**(h_lay/h_top)
174             ELSEIF (pplay(ig,l) .le. p_top2) THEN
175               mode_dens = mode_dens*(pplay(ig,l)/pplay(ig,l-1))**(h_lay/h_top2)
176             ENDIF
177             mode_dens=max(1.e-30,mode_dens)
178             aerosol(ig,l,iaer) = QREFvis3d(ig,l,iaer)*                       &
179              RPI*(reffrad(ig,l,iaer))**2*exp(-3.*log(1+nueffrad(ig,l,iaer)))* &
180              mode_dens*h_lay*(pplev(ig,l)-pplev(ig,l+1))/pplay(ig,l)
181!             aerosol(ig,l,iaer) = mode_dens
182           ENDDO
183          ENDDO
184
185      end if ! mode 1
186
187! Mode 2
188      if (iaero_venus2 .ne.0) then
189          iaer=iaero_venus2
190
191!       1. Initialization
192          aerosol(1:ngrid,1:nlayer,iaer)=0.0
193          p_bot = 1.0e4
194            h_bot = 3.0e3
195          nmode2 = 1.00e8 ! m-3
196          p_top = 8.0e3
197            h_top = 3.5e3
198          p_top2 = 4.5e2
199            h_top2 = 2.0e3
200
201!       2. Opacity calculation
202
203          DO ig=1,ngrid
204! determine the approximate middle of the mode layer
205           ll=1
206           DO l=1,nlayer-1    ! high p to low p
207             IF (pplay(ig,l) .gt. (p_top+p_bot)/2) ll=l
208           ENDDO
209! from there go down and up for profile N
210           mode_dens = nmode2  ! m-3
211           DO l=ll,1,-1
212             h_lay=RD*(pt(ig,l+1)+pt(ig,l))/2./RG
213             IF (pplay(ig,l) .le. p_bot) THEN
214               mode_dens = nmode2  ! m-3
215             ELSEIF (pplay(ig,l) .gt. p_bot) THEN
216               mode_dens = mode_dens*(pplay(ig,l+1)/pplay(ig,l))**(h_lay/h_bot)
217             ENDIF
218             mode_dens=max(1.e-30,mode_dens)
219             aerosol(ig,l,iaer) = QREFvis3d(ig,l,iaer)*                       &
220              RPI*(reffrad(ig,l,iaer))**2*exp(-3.*log(1+nueffrad(ig,l,iaer)))* &
221              mode_dens*h_lay*(pplev(ig,l)-pplev(ig,l+1))/pplay(ig,l)
222!             aerosol(ig,l,iaer) = mode_dens
223           ENDDO
224           mode_dens = nmode2  ! m-3
225           DO l=ll+1,nlayer-1
226             h_lay=RD*(pt(ig,l-1)+pt(ig,l))/2./RG
227             IF (pplay(ig,l) .gt. p_top) THEN
228               mode_dens = nmode2  ! m-3
229             ELSEIF (pplay(ig,l) .le. p_top .and. pplay(ig,l) .gt. p_top2) THEN
230               mode_dens = mode_dens*(pplay(ig,l)/pplay(ig,l-1))**(h_lay/h_top)
231             ELSEIF (pplay(ig,l) .le. p_top2) THEN
232               mode_dens = mode_dens*(pplay(ig,l)/pplay(ig,l-1))**(h_lay/h_top2)
233             ENDIF
234             mode_dens=max(1.e-30,mode_dens)
235             aerosol(ig,l,iaer) = QREFvis3d(ig,l,iaer)*                       &
236              RPI*(reffrad(ig,l,iaer))**2*exp(-3.*log(1+nueffrad(ig,l,iaer)))* &
237              mode_dens*h_lay*(pplev(ig,l)-pplev(ig,l+1))/pplay(ig,l)
238!             aerosol(ig,l,iaer) = mode_dens
239           ENDDO
240          ENDDO
241
242      end if ! mode 2
243
244! Mode 2p
245      if (iaero_venus2p .ne.0) then
246          iaer=iaero_venus2p
247
248!       1. Initialization
249          aerosol(1:ngrid,1:nlayer,iaer)=0.0
250          p_bot = 1.2e5  ! 1.2e5
251            h_bot = 0.1e3
252          nmode2p = 5.0e7 ! m-3
253          p_top = 2.3e4
254            h_top = 1.0e3
255
256!       2. Opacity calculation
257
258          DO ig=1,ngrid
259! determine the approximate middle of the mode layer
260           ll=1
261           DO l=1,nlayer-1    ! high p to low p
262             IF (pplay(ig,l) .gt. (p_top+p_bot)/2) ll=l
263           ENDDO
264! from there go down and up for profile N
265           mode_dens = nmode2p  ! m-3
266           DO l=ll,1,-1
267             h_lay=RD*(pt(ig,l+1)+pt(ig,l))/2./RG
268             IF (pplay(ig,l) .le. p_bot) THEN
269               mode_dens = nmode2p  ! m-3
270             ELSEIF (pplay(ig,l) .gt. p_bot) THEN
271               mode_dens = mode_dens*(pplay(ig,l+1)/pplay(ig,l))**(h_lay/h_bot)
272             ENDIF
273             mode_dens=max(1.e-30,mode_dens)
274             aerosol(ig,l,iaer) = QREFvis3d(ig,l,iaer)*                       &
275              RPI*(reffrad(ig,l,iaer))**2*exp(-3.*log(1+nueffrad(ig,l,iaer)))* &
276              mode_dens*h_lay*(pplev(ig,l)-pplev(ig,l+1))/pplay(ig,l)
277!             aerosol(ig,l,iaer) = mode_dens
278           ENDDO
279           mode_dens = nmode2p  ! m-3
280           DO l=ll+1,nlayer-1
281             h_lay=RD*(pt(ig,l-1)+pt(ig,l))/2./RG
282             IF (pplay(ig,l) .gt. p_top) THEN
283               mode_dens = nmode2p  ! m-3
284             ELSEIF (pplay(ig,l) .le. p_top) THEN
285               mode_dens = mode_dens*(pplay(ig,l)/pplay(ig,l-1))**(h_lay/h_top)
286             ENDIF
287             mode_dens=max(1.e-30,mode_dens)
288             aerosol(ig,l,iaer) = QREFvis3d(ig,l,iaer)*                       &
289              RPI*(reffrad(ig,l,iaer))**2*exp(-3.*log(1+nueffrad(ig,l,iaer)))* &
290              mode_dens*h_lay*(pplev(ig,l)-pplev(ig,l+1))/pplay(ig,l)
291!             aerosol(ig,l,iaer) = mode_dens
292           ENDDO
293          ENDDO
294
295      end if ! mode 2p
296
297! Mode 3
298      if (iaero_venus3 .ne.0) then
299          iaer=iaero_venus3
300
301!       1. Initialization
302          aerosol(1:ngrid,1:nlayer,iaer)=0.0
303          p_bot = 1.2e5  ! 1.2e5
304            h_bot = 0.5e3
305          nmode3 = 1.4e7 ! m-3
306          p_top = 3.9e4
307            h_top = 1.0e3
308
309!       2. Opacity calculation
310
311          DO ig=1,ngrid
312! determine the approximate middle of the mode layer
313           ll=1
314           DO l=1,nlayer-1    ! high p to low p
315             IF (pplay(ig,l) .gt. (p_top+p_bot)/2) ll=l
316           ENDDO
317! from there go down and up for profile N
318           mode_dens = nmode3  ! m-3
319           DO l=ll,1,-1
320             h_lay=RD*(pt(ig,l+1)+pt(ig,l))/2./RG
321             IF (pplay(ig,l) .le. p_bot) THEN
322               mode_dens = nmode3  ! m-3
323             ELSEIF (pplay(ig,l) .gt. p_bot) THEN
324               mode_dens = mode_dens*(pplay(ig,l+1)/pplay(ig,l))**(h_lay/h_bot)
325             ENDIF
326             mode_dens=max(1.e-30,mode_dens)
327             aerosol(ig,l,iaer) = QREFvis3d(ig,l,iaer)*                       &
328              RPI*(reffrad(ig,l,iaer))**2*exp(-3.*log(1+nueffrad(ig,l,iaer)))* &
329              mode_dens*h_lay*(pplev(ig,l)-pplev(ig,l+1))/pplay(ig,l)
330!             aerosol(ig,l,iaer) = mode_dens
331           ENDDO
332           mode_dens = nmode3  ! m-3
333           DO l=ll+1,nlayer-1
334             h_lay=RD*(pt(ig,l-1)+pt(ig,l))/2./RG
335             IF (pplay(ig,l) .gt. p_top) THEN
336               mode_dens = nmode3  ! m-3
337             ELSEIF (pplay(ig,l) .le. p_top) THEN
338               mode_dens = mode_dens*(pplay(ig,l)/pplay(ig,l-1))**(h_lay/h_top)
339             ENDIF
340             mode_dens=max(1.e-30,mode_dens)
341             aerosol(ig,l,iaer) = QREFvis3d(ig,l,iaer)*                       &
342              RPI*(reffrad(ig,l,iaer))**2*exp(-3.*log(1+nueffrad(ig,l,iaer)))* &
343              mode_dens*h_lay*(pplev(ig,l)-pplev(ig,l+1))/pplay(ig,l)
344!             aerosol(ig,l,iaer) = mode_dens
345           ENDDO
346          ENDDO
347
348      end if ! mode 3
349
350! UV absorber
351      if (iaero_venusUV .ne.0) then
352          iaer=iaero_venusUV
353
354!       1. Initialization
355          aerosol(1:ngrid,1:nlayer,iaer)=0.0
356          p_bot = 3.3e4  ! 58 km
357            h_bot = 1.0e3
358          nmodeuv = 1.00e7 !m-3
359          p_top = 3.7e3 ! 70 km
360            h_top = 1.0e3
361
362!       2. Opacity calculation
363
364          DO ig=1,ngrid
365! determine the approximate middle of the mode layer
366           ll=1
367           DO l=1,nlayer-1    ! high p to low p
368             IF (pplay(ig,l) .gt. (p_top+p_bot)/2) ll=l
369           ENDDO
370! from there go down and up for profile N
371           mode_dens = nmodeuv ! m-3
372           DO l=ll,1,-1
373             h_lay=RD*(pt(ig,l+1)+pt(ig,l))/2./RG
374             IF (pplay(ig,l) .le. p_bot) THEN
375               mode_dens = nmodeuv ! m-3
376             ELSEIF (pplay(ig,l) .gt. p_bot) THEN
377               mode_dens = mode_dens*(pplay(ig,l+1)/pplay(ig,l))**(h_lay/h_bot)
378             ENDIF
379             mode_dens=max(1.e-30,mode_dens)
380! normalized to 0.35 microns (peak of absorption)
381             aerosol(ig,l,iaer) = QREFvis3d(ig,l,iaer)*mode_dens
382           ENDDO
383           mode_dens = nmodeuv ! m-3
384           DO l=ll+1,nlayer-1
385             h_lay=RD*(pt(ig,l-1)+pt(ig,l))/2./RG
386             IF (pplay(ig,l) .gt. p_top) THEN
387               mode_dens = nmodeuv ! m-3
388             ELSEIF (pplay(ig,l) .le. p_top) THEN
389               mode_dens = mode_dens*(pplay(ig,l)/pplay(ig,l-1))**(h_lay/h_top)
390             ENDIF
391             mode_dens=max(1.e-30,mode_dens)
392! normalized to 0.35 microns (peak of absorption)
393             aerosol(ig,l,iaer) = QREFvis3d(ig,l,iaer)*mode_dens
394           ENDDO
395          ENDDO
396
397!       3. Re-normalize to Haus et al 2015 total column optical depth
398         tau_col(:)=0.0
399         DO l=1,nlayer
400          DO ig=1,ngrid
401               tau_col(ig) = tau_col(ig) &
402                     + aerosol(ig,l,iaer)
403            ENDDO
404         ENDDO
405         DO ig=1,ngrid
406           DO l=1,nlayer-1
407                aerosol(ig,l,iaer)=aerosol(ig,l,iaer)*0.205/tau_col(ig)
408           ENDDO
409         ENDDO
410
411      end if ! UV absorber
412
413!==================================================================
414!     if (is_master) then
415!      ig=10
416!      do l=1,nlayer
417!         write(82,*) l,pplay(ig,l),aerosol(ig,l,1)
418!         write(83,*) l,pplay(ig,l),aerosol(ig,l,2)
419!         write(84,*) l,pplay(ig,l),aerosol(ig,l,3)
420!         write(85,*) l,pplay(ig,l),aerosol(ig,l,4)
421!         write(86,*) l,pplay(ig,l),aerosol(ig,l,5)
422!      enddo
423!     endif   
424!      stop         
425!==================================================================
426
427! --------------------------------------------------------------------------
428! Column integrated visible optical depth in each point (used for diagnostic)
429
430      tau_col(:)=0.0
431      do iaer = 1, naerkind
432         do l=1,nlayer
433            do ig=1,ngrid
434               tau_col(ig) = tau_col(ig) + aerosol(ig,l,iaer)
435            end do
436         end do
437      end do
438
439      do ig=1,ngrid
440         do l=1,nlayer
441            do iaer = 1, naerkind
442               if(aerosol(ig,l,iaer).gt.1.e3)then
443                  print*,'WARNING: aerosol=',aerosol(ig,l,iaer)
444                  print*,'at ig=',ig,',  l=',l,', iaer=',iaer
445                  print*,'QREFvis3d=',QREFvis3d(ig,l,iaer)
446                  print*,'reffrad=',reffrad(ig,l,iaer)
447               endif
448            end do
449         end do
450      end do
451
452      do ig=1,ngrid
453         if(tau_col(ig).gt.1.e3)then
454            print*,'WARNING: tau_col=',tau_col(ig)
455            print*,'at ig=',ig
456            print*,'aerosol=',aerosol(ig,:,:)
457            print*,'QREFvis3d=',QREFvis3d(ig,:,:)
458            print*,'reffrad=',reffrad(ig,:,:)
459         endif
460      end do
461      return
462    end subroutine aeropacity
463     
Note: See TracBrowser for help on using the repository browser.