source: trunk/LMDZ.GENERIC/libf/phystd/optcv.F90 @ 293

Last change on this file since 293 was 253, checked in by emillour, 14 years ago

Generic GCM

  • Massive update to version 0.7

EM+RW

  • Property svn:executable set to *
File size: 9.5 KB
Line 
1      SUBROUTINE OPTCV(DTAUV,TAUV,TAUCUMV,PLEV,  &
2          QXVAER,QSVAER,GVAER,WBARV,COSBV,       &
3          TAURAY,TAUAERO,TMID,PMID,TAUGSURF,QVAR)
4
5      use radinc_h
6      use radcommon_h, only: gasv, tlimit, wrefVAR, Cmk, tgasref, pfgasref,wnov,scalep
7
8      implicit none
9
10!==================================================================
11!     
12!     Purpose
13!     -------
14!     Calculates shortwave optical constants at each level.
15!     
16!     Authors
17!     -------
18!     Adapted from the NASA Ames code by R. Wordsworth (2009)
19!     
20!==================================================================
21!     
22!     THIS SUBROUTINE SETS THE OPTICAL CONSTANTS IN THE VISUAL 
23!     IT CALCUALTES FOR EACH LAYER, FOR EACH SPECRAL INTERVAL IN THE VISUAL
24!     LAYER: WBAR, DTAU, COSBAR
25!     LEVEL: TAU
26!     
27!     TAUV(L,NW,NG) is the cumulative optical depth at the top of radiation code
28!     layer L. NW is spectral wavelength interval, ng the Gauss point index.
29!     
30!     TLEV(L) - Temperature at the layer boundary
31!     PLEV(L) - Pressure at the layer boundary (i.e. level)
32!     GASV(NT,NPS,NW,NG) - Visual CO2 k-coefficients
33!     
34!-------------------------------------------------------------------
35
36#include "callkeys.h"
37#include "comcstfi.h"
38#include "gases.h"
39
40      real*8 DTAUV(L_NLAYRAD,L_NSPECTV,L_NGAUSS)
41      real*8 DTAUKV(L_LEVELS+1,L_NSPECTV,L_NGAUSS)
42      real*8 TAUV(L_NLEVRAD,L_NSPECTV,L_NGAUSS)
43      real*8 TAUCUMV(L_LEVELS,L_NSPECTV,L_NGAUSS)
44      real*8 PLEV(L_LEVELS)
45      real*8 TMID(L_LEVELS), PMID(L_LEVELS)
46      real*8 COSBV(L_NLAYRAD,L_NSPECTV,L_NGAUSS)
47      real*8 WBARV(L_NLAYRAD,L_NSPECTV,L_NGAUSS)
48      real*8 TAURAY(L_NSPECTV)
49
50!     For aerosols
51      real*8 QXVAER(L_LEVELS+1,L_NSPECTV,NAERKIND)
52      real*8 QSVAER(L_LEVELS+1,L_NSPECTV,NAERKIND)
53      real*8 GVAER(L_LEVELS+1,L_NSPECTV,NAERKIND)
54      real*8 TAUAERO(L_LEVELS+1,NAERKIND)
55      real*8 TAUAEROLK(L_LEVELS+1,L_NSPECTV,NAERKIND)
56      real*8 TAEROS(L_LEVELS,L_NSPECTV,NAERKIND)
57
58      integer L, NW, NG, K, NG1(L_NSPECTV), LK, IAER
59      integer MT(L_LEVELS), MP(L_LEVELS), NP(L_LEVELS)
60      real*8  ANS, TAUGAS
61      real*8  TRAY(L_LEVELS,L_NSPECTV)
62      real*8  DPR(L_LEVELS), U(L_LEVELS)
63      real*8  LCOEF(4), LKCOEF(L_LEVELS,4)
64
65      real*8 taugsurf(L_NSPECTV,L_NGAUSS-1), TRAYAER
66
67!     Water mixing ratio variables
68      real*8 QVAR(L_LEVELS), WRATIO(L_LEVELS)
69      real*8 KCOEF(4)
70      integer NVAR(L_LEVELS)
71
72!     temporary variables for multiple aerosol calculation
73      real*8 atemp, btemp, ctemp
74
75!     variables for k in units m^-1
76      double precision wn_cont, p_cont, T_cont
77      real*8 dz(L_LEVELS), DCONT
78
79      integer igas
80
81!=======================================================================
82!     Determine the total gas opacity throughout the column, for each
83!     spectral interval, NW, and each Gauss point, NG.
84!     Calculate the continuum opacities, i.e., those that do not depend on
85!     NG, the Gauss index.
86
87      taugsurf(:,:) = 0.0
88      dpr(:)        = 0.0
89      lkcoef(:,:)   = 0.0
90
91      do K=2,L_LEVELS
92         DPR(k) = PLEV(K)-PLEV(K-1)
93
94         U(k)   = Cmk*DPR(k)
95
96         ! if we have continuum opacities, we need dz
97         dz(k)  = dpr(k)*R*TMID(K)/(g*PMID(K))
98
99         call tpindex(PMID(K),TMID(K),QVAR(K),pfgasref,tgasref,WREFVAR, &
100              LCOEF,MT(K),MP(K),NVAR(K),WRATIO(K))
101
102         do LK=1,4
103            LKCOEF(K,LK) = LCOEF(LK)
104         end do
105
106         DO NW=1,L_NSPECTV
107            TRAY(K,NW)   = TAURAY(NW) * DPR(K)
108
109            do iaer=1,naerkind
110               TAEROS(K,NW,IAER) = TAUAERO(K,IAER)  * QXVAER(K,NW,IAER)
111            end do
112!     
113
114         END DO
115      end do
116
117!     TRAYAER is Tau RAYleigh scattering, plus AERosol opacity
118
119!     we ignore K=1...
120      do K=2,L_LEVELS
121         do NW=1,L_NSPECTV
122
123            TRAYAER = TRAY(K,NW)
124            do iaer=1,naerkind
125               TRAYAER = TRAYAER + TAEROS(K,NW,IAER)
126            end do
127
128            DCONT = 0.0 ! continuum absorption
129
130            ! include H2 continuum
131            do igas=1,ngasmx
132               if(gnom(igas).eq.'H2_')then
133
134                  wn_cont = dble(wnov(nw))
135                  T_cont  = dble(TMID(k))
136                  p_cont  = dble(PMID(k)*scalep*gfrac(igas))
137                  call interpolateH2H2(wn_cont,T_cont,p_cont,DCONT,.false.)
138
139                  DCONT=DCONT*dz(k)
140
141                  if((.not.callgasvis))then
142                     DCONT=0.0
143                  endif
144
145
146               endif
147            enddo
148
149            do NG=1,L_NGAUSS-1
150
151!=======================================================================
152!     Now compute TAUGAS
153!     Interpolate between water mixing ratios
154!     WRATIO = 0.0 if the requested water amount is equal to, or outside the
155!     the water data range
156
157               if (L_REFVAR.eq.1)then ! added by RW for special no variable case
158                  KCOEF(1) = GASV(MT(K),MP(K),1,NW,NG)
159                  KCOEF(2) = GASV(MT(K),MP(K)+1,1,NW,NG)
160                  KCOEF(3) = GASV(MT(K)+1,MP(K)+1,1,NW,NG)
161                  KCOEF(4) = GASV(MT(K)+1,MP(K),1,NW,NG)
162               else
163                  KCOEF(1) = GASV(MT(K),MP(K),NVAR(K),NW,NG) + WRATIO(K)*    &
164                       (GASV(MT(K),MP(K),NVAR(K)+1,NW,NG) -                  &
165                       GASV(MT(K),MP(K),NVAR(K),NW,NG))
166
167                  KCOEF(2) = GASV(MT(K),MP(K)+1,NVAR(K),NW,NG) + WRATIO(K)*  &
168                       (GASV(MT(K),MP(K)+1,NVAR(K)+1,NW,NG) -                &
169                       GASV(MT(K),MP(K)+1,NVAR(K),NW,NG))
170
171                  KCOEF(3) = GASV(MT(K)+1,MP(K)+1,NVAR(K),NW,NG) + WRATIO(K)*&
172                       (GASV(MT(K)+1,MP(K)+1,NVAR(K)+1,NW,NG) -              &
173                       GASV(MT(K)+1,MP(K)+1,NVAR(K),NW,NG))
174
175                  KCOEF(4) = GASV(MT(K)+1,MP(K),NVAR(K),NW,NG) + WRATIO(K)*  &
176                       (GASV(MT(K)+1,MP(K),NVAR(K)+1,NW,NG) -                &
177                       GASV(MT(K)+1,MP(K),NVAR(K),NW,NG))
178               endif
179
180!     Interpolate the gaseous k-coefficients to the requested T,P values
181               
182               ANS = LKCOEF(K,1)*KCOEF(1) + LKCOEF(K,2)*KCOEF(2) +           &
183                    LKCOEF(K,3)*KCOEF(3) + LKCOEF(K,4)*KCOEF(4)
184
185               TAUGAS          = U(k)*ANS
186
187               !TAUGSURF(NW,NG) = TAUGSURF(NW,NG) + TAUGAS
188               TAUGSURF(NW,NG) = TAUGSURF(NW,NG) + TAUGAS + DCONT
189               DTAUKV(K,nw,ng) = TAUGAS + TRAYAER  & ! TRAYAER includes all scattering contributions
190                                 + DCONT             ! for continuum absorption
191
192            end do
193
194
195!     Now fill in the "clear" part of the spectrum (NG = L_NGAUSS),
196!     which holds continuum opacity only
197
198            NG = L_NGAUSS
199            DTAUKV(K,nw,ng) = TRAY(K,NW) + DCONT ! For parameterized continuum absorption
200            do iaer=1,naerkind
201               DTAUKV(K,nw,ng) = DTAUKV(K,nw,ng) + TAEROS(K,NW,IAER)
202!     &                           + DCONT          ! For parameterized continuum absorption
203            end do ! a bug was here!
204
205         end do
206      end do
207
208
209!=======================================================================
210!     Now the full treatment for the layers, where besides the opacity
211!     we need to calculate the scattering albedo and asymmetry factors
212
213      DO NW=1,L_NSPECTV
214         DO K=2,L_LEVELS
215            do iaer=1,naerkind
216              TAUAEROLK(K,NW,IAER) = TAUAERO(K,IAER) * QSVAER(K,NW,IAER)
217            end do
218         ENDDO
219      ENDDO
220     
221
222      DO NW=1,L_NSPECTV
223         DO NG=1,L_NGAUSS
224            DO L=1,L_NLAYRAD-1
225               K              = 2*L+1
226
227               DTAUV(L,nw,ng) = DTAUKV(K,NW,NG)+DTAUKV(K+1,NW,NG)
228
229               atemp=0.
230               btemp=TRAY(K,NW) + TRAY(K+1,NW)
231               ctemp=0.9999*(TRAY(K,NW) + TRAY(K+1,NW))
232               do iaer=1,naerkind
233                  atemp = atemp +                                     &
234                       GVAER(K,NW,IAER)   * TAUAEROLK(K,NW,IAER) +    &
235                       GVAER(K+1,NW,IAER) * TAUAEROLK(K+1,NW,IAER)
236                  btemp = btemp +                                     &
237                       TAUAEROLK(K,NW,IAER) + TAUAEROLK(K+1,NW,IAER)
238                  ctemp = ctemp +                                     &
239                       TAUAEROLK(K,NW,IAER) + TAUAEROLK(K+1,NW,IAER)
240               end do
241
242               COSBV(L,NW,NG) = atemp/btemp
243               WBARV(L,nw,ng) = ctemp/DTAUV(L,nw,ng)
244
245            END DO
246
247!     No vertical averaging on bottom layer
248
249            L              = L_NLAYRAD
250            K              = 2*L+1
251            DTAUV(L,nw,ng) = DTAUKV(K,NW,NG)
252
253            atemp=0.
254            btemp=TRAY(K,NW)
255            ctemp=0.9999*TRAY(K,NW)
256            do iaer=1,naerkind
257               atemp = atemp + GVAER(K,NW,IAER) * TAUAEROLK(K,NW,IAER)
258               btemp = btemp + TAUAEROLK(K,NW,IAER)
259               ctemp = ctemp + TAUAEROLK(K,NW,IAER)
260            end do
261            COSBV(L,NW,NG) = atemp/btemp
262            WBARV(L,nw,ng) = ctemp/DTAUV(L,nw,ng)
263
264         END DO                 ! NG gauss point loop
265      END DO                    ! NW spectral loop
266
267
268
269!     Total extinction optical depths
270
271      DO NW=1,L_NSPECTV       
272         DO NG=1,L_NGAUSS       ! full gauss loop
273            TAUV(1,NW,NG)=0.0D0
274            DO L=1,L_NLAYRAD
275               TAUV(L+1,NW,NG)=TAUV(L,NW,NG)+DTAUV(L,NW,NG)
276            END DO
277
278            TAUCUMV(1,NW,NG)=0.0D0
279            DO K=2,L_LEVELS
280               TAUCUMV(K,NW,NG)=TAUCUMV(K-1,NW,NG)+DTAUKV(K,NW,NG)
281            END DO
282         END DO                 ! end full gauss loop
283      END DO
284
285
286      RETURN
287    END SUBROUTINE OPTCV
Note: See TracBrowser for help on using the repository browser.