source: trunk/LMDZ.GENERIC/libf/phystd/optci.F90 @ 537

Last change on this file since 537 was 526, checked in by jleconte, 13 years ago

13/02/2012 == JL + AS

  • All outputs are now in netCDF format. Even in 1D (No more G1D)
  • Clean up of the call to callcorrk when CLFvarying=true
  • Corrects a bug in writediagspecIR/VI. Output are now in W/m2/cm-1 as a function of the wavenumber in cm-1
  • Enable writediagspecIR/V to work in the CLFvarying=true case (output now done in Physiq after writediagfi)
  • Add a simple treatment for the supersaturation of CO2 (see forget et al 2012)
  • corrects a small bug when no clouds are present in aeropacity
File size: 11.5 KB
Line 
1      subroutine optci(PLEV,TLEV,DTAUI,TAUCUMI,      &
2           QXIAER,QSIAER,GIAER,COSBI,WBARI,TAUAERO,  &
3           TMID,PMID,TAUGSURF,QVAR,MUVAR)
4
5      use radinc_h
6      use radcommon_h, only: gasi, tlimit, wrefVAR, Cmk,tgasref,pfgasref,wnoi,scalep
7      use gases_h
8      implicit none
9
10!==================================================================
11!     
12!     Purpose
13!     -------
14!     Calculates longwave optical constants at each level. For each
15!     layer and spectral interval in the IR it calculates WBAR, DTAU
16!     and COSBAR. For each level it calculates TAU.
17!     
18!     TAUI(L,LW) is the cumulative optical depth at level L (or alternatively
19!     at the *bottom* of layer L), LW is the spectral wavelength interval.
20!     
21!     TLEV(L) - Temperature at the layer boundary (i.e., level)
22!     PLEV(L) - Pressure at the layer boundary (i.e., level)
23!
24!     Authors
25!     -------
26!     Adapted from the NASA Ames code by R. Wordsworth (2009)
27!     
28!==================================================================
29
30
31#include "comcstfi.h"
32#include "callkeys.h"
33
34
35      real*8 DTAUI(L_NLAYRAD,L_NSPECTI,L_NGAUSS)
36      real*8 DTAUKI(L_LEVELS+1,L_NSPECTI,L_NGAUSS)
37      real*8 TAUI(L_NLEVRAD,L_NSPECTI,L_NGAUSS)
38      real*8 TAUCUMI(L_LEVELS,L_NSPECTI,L_NGAUSS)
39      real*8 PLEV(L_LEVELS)
40      real*8 TLEV(L_LEVELS)
41      real*8 TMID(L_LEVELS), PMID(L_LEVELS)
42      real*8 COSBI(L_NLAYRAD,L_NSPECTI,L_NGAUSS)
43      real*8 WBARI(L_NLAYRAD,L_NSPECTI,L_NGAUSS)
44
45!     For aerosols
46      real*8  QXIAER(L_LEVELS+1,L_NSPECTI,NAERKIND)
47      real*8  QSIAER(L_LEVELS+1,L_NSPECTI,NAERKIND)
48      real*8  GIAER(L_LEVELS+1,L_NSPECTI,NAERKIND)
49      real*8  TAUAERO(L_LEVELS+1,NAERKIND)
50      real*8  TAUAEROLK(L_LEVELS+1,L_NSPECTI,NAERKIND)
51      real*8  TAEROS(L_LEVELS,L_NSPECTI,NAERKIND)
52
53      integer L, NW, NG, K, LK, IAER
54      integer MT(L_LEVELS), MP(L_LEVELS), NP(L_LEVELS)
55      real*8  ANS, TAUGAS
56      real*8  DPR(L_LEVELS), U(L_LEVELS)
57      real*8  LCOEF(4), LKCOEF(L_LEVELS,4)
58
59      real*8 taugsurf(L_NSPECTI,L_NGAUSS-1)
60      real*8 DCONT
61      double precision wn_cont, p_cont, p_air, T_cont, dtemp
62
63!     Variable species mixing ratio variables
64      real*8  QVAR(L_LEVELS), WRATIO(L_LEVELS), MUVAR(L_LEVELS)
65      real*8  KCOEF(4)
66      integer NVAR(L_LEVELS)
67
68!     temporary variables for multiple aerosol calculation
69      real*8 atemp, btemp
70
71!     variables for k in units m^-1
72      real*8 rho, dz(L_LEVELS)
73
74      integer igas
75
76      !--- Kasting's CIA ----------------------------------------
77      !real*8, parameter :: Ci(L_NSPECTI)=[                         &
78      !     3.8E-5, 1.2E-5, 2.8E-6, 7.6E-7, 4.5E-7, 2.3E-7,    &
79      !     5.4E-7, 1.6E-6, 0.0,                               &
80      !     0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,            &
81      !     0.0, 4.0E-7, 4.0E-6, 1.4E-5,    &
82      !     1.0E-5, 1.2E-6, 2.0E-7, 5.0E-8, 3.0E-8, 0.0 ]
83      !real*8, parameter :: Ti(L_NSPECTI)=[ -2.2, -1.9,             &
84      !     -1.7, -1.7, -1.7, -1.7, -1.7, -1.7,                &
85      !     0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, &
86      !     -1.7,-1.7,-1.7,-1.7,-1.7,-1.7,-1.7, -1.7,0.0 ]
87      !----------------------------------------------------------
88
89!=======================================================================
90!     Determine the total gas opacity throughout the column, for each
91!     spectral interval, NW, and each Gauss point, NG.
92
93      taugsurf(:,:) = 0.0
94      dpr(:)        = 0.0
95      lkcoef(:,:)   = 0.0
96
97      do K=2,L_LEVELS
98         DPR(k) = PLEV(K)-PLEV(K-1)
99
100         !--- Kasting's CIA ----------------------------------------
101         !dz(k)=dpr(k)*189.02*TMID(K)/(0.03720*PMID(K))
102         ! this is CO2 path length (in cm) as written by Francois
103         ! delta_z = delta_p * R_specific * T / (g * P)
104         ! But Kasting states that W is in units of _atmosphere_ cm
105         ! So we do
106         !dz(k)=dz(k)*(PMID(K)/1013.25)
107         !dz(k)=dz(k)/100.0 ! in m for SI calc
108         !----------------------------------------------------------
109
110         ! if we have continuum opacities, we need dz
111         if(kastprof)then
112            dz(k) = dpr(k)*(8314.5/muvar(k))*TMID(K)/(g*PMID(K))
113            U(k)  = (Cmk*mugaz/(muvar(k)))*DPR(k)
114         else
115            dz(k) = dpr(k)*R*TMID(K)/(g*PMID(K))
116            U(k)  = Cmk*DPR(k)    ! only Cmk line in optci.F
117         endif
118
119         call tpindex(PMID(K),TMID(K),QVAR(K),pfgasref,tgasref,WREFVAR, &
120              LCOEF,MT(K),MP(K),NVAR(K),WRATIO(K))
121         
122         do LK=1,4
123            LKCOEF(K,LK) = LCOEF(LK)
124         end do
125
126
127         DO NW=1,L_NSPECTI
128            do iaer=1,naerkind
129               TAEROS(K,NW,IAER) = TAUAERO(K,IAER) * QXIAER(K,NW,IAER)
130            end do
131         END DO
132      end do                    ! levels
133
134      do K=2,L_LEVELS
135         do nw=1,L_NSPECTI
136 
137            DCONT = 0.0 ! continuum absorption
138
139            ! include continua if necessary
140            wn_cont = dble(wnoi(nw))
141            T_cont  = dble(TMID(k))
142            do igas=1,ngasmx
143
144               if(gfrac(igas).eq.-1)then ! variable
145                  p_cont  = dble(PMID(k)*scalep*QVAR(k)) ! qvar = mol/mol
146               else
147                  p_cont  = dble(PMID(k)*scalep*gfrac(igas)*(1.-QVAR(k)))
148               endif
149
150               dtemp=0.0
151               if(gnom(igas).eq.'H2_')then
152                  call interpolateH2H2(wn_cont,T_cont,p_cont,dtemp,.false.)
153               elseif(gnom(igas).eq.'H2O'.and.T_cont.gt.200.0)then
154                  p_air = dble(PMID(k)*scalep) - p_cont ! note assumes air!!
155                  call interpolateH2Ocont(wn_cont,T_cont,p_cont,p_air,dtemp,.false.)
156
157               endif
158
159               DCONT = DCONT + dtemp
160
161            enddo
162
163
164            DCONT = DCONT*dz(k)
165           
166            if(.not.Continuum)then
167               DCONT=0.0
168            endif
169
170            !--- Kasting's CIA ----------------------------------------
171            !DCO2   = dz(k)*Ci(nw)*(1.2859*PMID(k)/1000.0)*(TMID(k)/300.)**Ti(nw)
172            !DCO2 = 130*Ci(nw)*(pmid(k)/1013.25)**2*(tmid(k)/300.)**Ti(nw) * dz(k)
173            ! these two have been verified to give the same results
174            !----------------------------------------------------------
175
176
177            do ng=1,L_NGAUSS-1
178
179!     Now compute TAUGAS
180
181!     Interpolate between water mixing ratios
182!     WRATIO = 0.0 if the requested water amount is equal to, or outside the
183!     the water data range
184
185               if(L_REFVAR.eq.1)then ! added by RW for special no variable case
186                  KCOEF(1) = GASI(MT(K),MP(K),1,NW,NG)
187                  KCOEF(2) = GASI(MT(K),MP(K)+1,1,NW,NG)
188                  KCOEF(3) = GASI(MT(K)+1,MP(K)+1,1,NW,NG)
189                  KCOEF(4) = GASI(MT(K)+1,MP(K),1,NW,NG)
190               else
191
192                  KCOEF(1) = GASI(MT(K),MP(K),NVAR(K),NW,NG) + WRATIO(K)*     &
193                       (GASI(MT(K),MP(K),NVAR(K)+1,NW,NG) -                   &
194                       GASI(MT(K),MP(K),NVAR(K),NW,NG))
195
196                  KCOEF(2) = GASI(MT(K),MP(K)+1,NVAR(K),NW,NG) + WRATIO(K)*   &
197                       (GASI(MT(K),MP(K)+1,NVAR(K)+1,NW,NG) -                 &
198                       GASI(MT(K),MP(K)+1,NVAR(K),NW,NG))
199
200                  KCOEF(3) = GASI(MT(K)+1,MP(K)+1,NVAR(K),NW,NG) + WRATIO(K)* &
201                       (GASI(MT(K)+1,MP(K)+1,NVAR(K)+1,NW,NG) -               &
202                       GASI(MT(K)+1,MP(K)+1,NVAR(K),NW,NG))
203
204                  KCOEF(4) = GASI(MT(K)+1,MP(K),NVAR(K),NW,NG) + WRATIO(K)*   &
205                       (GASI(MT(K)+1,MP(K),NVAR(K)+1,NW,NG) -                 &
206                       GASI(MT(K)+1,MP(K),NVAR(K),NW,NG))
207               endif
208
209!     Interpolate the gaseous k-coefficients to the requested T,P values
210
211               ANS = LKCOEF(K,1)*KCOEF(1) + LKCOEF(K,2)*KCOEF(2) +            &
212                    LKCOEF(K,3)*KCOEF(3) + LKCOEF(K,4)*KCOEF(4)
213               
214               TAUGAS  = U(k)*ANS
215
216               if(graybody)then
217                  TAUGAS = 0.0
218                  DCONT  = U(k)*3.3e-26
219               endif
220
221               TAUGSURF(NW,NG) = TAUGSURF(NW,NG) + TAUGAS + DCONT
222               !TAUGSURF(NW,NG) = TAUGSURF(NW,NG) + TAUGAS
223               DTAUKI(K,nw,ng) = TAUGAS + DCONT ! For parameterized continuum absorption
224
225               do iaer=1,naerkind
226                  DTAUKI(K,nw,ng) = DTAUKI(K,nw,ng) + TAEROS(K,NW,IAER)
227               end do ! a bug was here!
228
229            end do
230
231!     Now fill in the "clear" part of the spectrum (NG = L_NGAUSS),
232!     which holds continuum opacity only
233
234            NG              = L_NGAUSS
235            DTAUKI(K,nw,ng) = 0.0 + DCONT ! For parameterized continuum absorption
236
237            do iaer=1,naerkind
238               DTAUKI(K,nw,ng) = DTAUKI(K,nw,ng) +  TAEROS(K,NW,IAER)
239            end do ! a bug was here!
240
241         end do
242      end do
243
244
245!=======================================================================
246!     Now the full treatment for the layers, where besides the opacity
247!     we need to calculate the scattering albedo and asymmetry factors
248
249      DO NW=1,L_NSPECTI
250         DO K=2,L_LEVELS+1
251            do iaer=1,naerkind
252               TAUAEROLK(K,NW,IAER) = TAUAERO(K,IAER)*QSIAER(K,NW,IAER)
253            end do
254         ENDDO
255      ENDDO
256
257      DO NW=1,L_NSPECTI
258         NG = L_NGAUSS
259         DO L=1,L_NLAYRAD
260
261            K              = 2*L+1
262            DTAUI(L,nw,ng) = DTAUKI(K,NW,NG) + DTAUKI(K+1,NW,NG)! + 1.e-50
263
264            atemp = 0.
265            btemp = 0.
266            if(DTAUI(L,NW,NG) .GT. 1.0E-9) then
267               do iaer=1,naerkind
268                  atemp = atemp +                                     &
269                      GIAER(K,NW,IAER)   * TAUAEROLK(K,NW,IAER) +    &
270                      GIAER(K+1,NW,IAER) * TAUAEROLK(K+1,NW,IAER)
271                  btemp = btemp + TAUAEROLK(K,NW,IAER) + TAUAEROLK(K+1,NW,IAER)
272!     *                    + 1.e-10
273               end do
274               WBARI(L,nw,ng) = btemp  / DTAUI(L,NW,NG)
275            else
276               WBARI(L,nw,ng) = 0.0D0
277               DTAUI(L,NW,NG) = 1.0E-9
278            endif
279
280            if(btemp .GT. 0.0) then
281               cosbi(L,NW,NG) = atemp/btemp
282            else
283               cosbi(L,NW,NG) = 0.0D0
284            end if
285
286         END DO ! L vertical loop
287
288!     Now the other Gauss points, if needed.
289
290         DO NG=1,L_NGAUSS-1
291            IF(TAUGSURF(NW,NG) .gt. TLIMIT) THEN
292
293               DO L=1,L_NLAYRAD
294                  K              = 2*L+1
295                  DTAUI(L,nw,ng) = DTAUKI(K,NW,NG)+DTAUKI(K+1,NW,NG)! + 1.e-50
296
297                  btemp = 0.
298                  if(DTAUI(L,NW,NG) .GT. 1.0E-9) then
299
300                     do iaer=1,naerkind
301                        btemp = btemp + TAUAEROLK(K,NW,IAER) + TAUAEROLK(K+1,NW,IAER)
302                     end do
303                     WBARI(L,nw,ng) = btemp  / DTAUI(L,NW,NG)
304
305                  else
306                     WBARI(L,nw,ng) = 0.0D0
307                     DTAUI(L,NW,NG) = 1.0E-9
308                  endif
309
310                  cosbi(L,NW,NG) = cosbi(L,NW,L_NGAUSS)
311               END DO ! L vertical loop
312            END IF
313           
314         END DO                 ! NG Gauss loop
315      END DO                    ! NW spectral loop
316
317!     Total extinction optical depths
318
319      DO NW=1,L_NSPECTI       
320         DO NG=1,L_NGAUSS       ! full gauss loop
321            TAUI(1,NW,NG)=0.0D0
322            DO L=1,L_NLAYRAD
323               TAUI(L+1,NW,NG)=TAUI(L,NW,NG)+DTAUI(L,NW,NG)
324            END DO
325
326            TAUCUMI(1,NW,NG)=0.0D0
327            DO K=2,L_LEVELS
328               TAUCUMI(K,NW,NG)=TAUCUMI(K-1,NW,NG)+DTAUKI(K,NW,NG)
329            END DO
330         END DO                 ! end full gauss loop
331      END DO
332
333      return
334
335
336    end subroutine optci
337
338
339
Note: See TracBrowser for help on using the repository browser.