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

Last change on this file since 3793 was 3793, checked in by mturbet, 3 days ago

fix a bug and update new continuum interpolation routine in optci and optcv

  • Property svn:executable set to *
File size: 19.3 KB
Line 
1MODULE optcv_mod
2
3IMPLICIT NONE
4
5CONTAINS
6
7SUBROUTINE OPTCV(DTAUV,TAUV,TAUCUMV,PLEV,  &
8     QXVAER,QSVAER,GVAER,WBARV,COSBV,       &
9     TAUAERO,TMID,PMID,TAUGSURF,QVAR,MUVAR,FRACVAR)
10
11  use radinc_h, only: L_NLAYRAD, L_NLEVRAD, L_LEVELS, L_NSPECTV, L_NGAUSS, L_REFVAR, NAERKIND
12  use radcommon_h, only: gasv, tlimit, wrefVAR, Cmk, tgasref, pfgasref,wnov,scalep,indv,glat_ig
13  use gases_h, only: gfrac, ngasmx, igas_H2, igas_H2O, igas_He, igas_N2, &
14                     igas_CH4, igas_CO2, igas_O2
15  use comcstfi_mod, only: g, r, mugaz
16  use callkeys_mod, only: kastprof,continuum,graybody,callgasvis,varspec, &
17                          generic_continuum_database,rayleigh
18  use recombin_corrk_mod, only: corrk_recombin, gasv_recomb
19  use tpindex_mod, only: tpindex
20  use interpolate_continuum_mod, only: interpolate_continuum
21  use calc_rayleigh_mod, only: calc_rayleigh
22
23  implicit none
24
25  !==================================================================
26  !     
27  !     Purpose
28  !     -------
29  !     Calculates shortwave optical constants at each level.
30  !     
31  !     Authors
32  !     -------
33  !     Adapted from the NASA Ames code by R. Wordsworth (2009)
34  !     
35  !==================================================================
36  !     
37  !     THIS SUBROUTINE SETS THE OPTICAL CONSTANTS IN THE VISUAL 
38  !     IT CALCULATES FOR EACH LAYER, FOR EACH SPECTRAL INTERVAL IN THE VISUAL
39  !     LAYER: WBAR, DTAU, COSBAR
40  !     LEVEL: TAU
41  !     
42  !     TAUV(L,NW,NG) is the cumulative optical depth at the top of radiation code
43  !     layer L. NW is spectral wavelength interval, ng the Gauss point index.
44  !     
45  !     TLEV(L) - Temperature at the layer boundary
46  !     PLEV(L) - Pressure at the layer boundary (i.e. level)
47  !     GASV(NT,NPS,NW,NG) - Visible k-coefficients
48  !     
49  !-------------------------------------------------------------------
50
51
52  real*8,intent(out) :: DTAUV(L_NLAYRAD,L_NSPECTV,L_NGAUSS)
53  real*8 DTAUKV(L_LEVELS,L_NSPECTV,L_NGAUSS)
54  real*8,intent(out) :: TAUV(L_NLEVRAD,L_NSPECTV,L_NGAUSS)
55  real*8,intent(out) :: TAUCUMV(L_LEVELS,L_NSPECTV,L_NGAUSS)
56  real*8,intent(in) :: PLEV(L_LEVELS)
57  real*8,intent(in) :: TMID(L_LEVELS), PMID(L_LEVELS)
58  real*8,intent(out) :: COSBV(L_NLAYRAD,L_NSPECTV,L_NGAUSS)
59  real*8,intent(out) :: WBARV(L_NLAYRAD,L_NSPECTV,L_NGAUSS)
60
61  ! for aerosols
62  real*8,intent(in) :: QXVAER(L_LEVELS,L_NSPECTV,NAERKIND)
63  real*8,intent(in) :: QSVAER(L_LEVELS,L_NSPECTV,NAERKIND)
64  real*8,intent(in) :: GVAER(L_LEVELS,L_NSPECTV,NAERKIND)
65  real*8,intent(in) :: TAUAERO(L_LEVELS,NAERKIND)
66 
67  ! local arrays (saved for convenience as need be allocated)
68  real*8,save,allocatable :: TAUAEROLK(:,:,:)
69  real*8,save,allocatable :: TAEROS(:,:,:)
70!$OMP THREADPRIVATE(TAUAEROLK,TAEROS)
71
72  integer L, NW, NG, K, LK, IAER
73  integer MT(L_LEVELS), MP(L_LEVELS), NP(L_LEVELS)
74  real*8  ANS, TAUGAS
75  real*8  TAURAY(L_LEVELS,L_NSPECTV)
76  real*8  TRAY(L_LEVELS,L_NSPECTV)
77  real*8  DPR(L_LEVELS), U(L_LEVELS)
78  real*8  LCOEF(4), LKCOEF(L_LEVELS,4)
79
80  real*8,intent(out) :: taugsurf(L_NSPECTV,L_NGAUSS-1)
81  real*8 DCONT,DAERO
82  real*8 DRAYAER
83  double precision wn_cont, p_cont, p_air, T_cont, dtemp, dtempc
84  double precision p_cross
85
86  ! variable species mixing ratio variables
87  real*8,intent(in) :: QVAR(L_LEVELS)
88  real*8,intent(in) :: MUVAR(L_LEVELS)
89  real*8,intent(in) :: FRACVAR(ngasmx,L_LEVELS)
90  real*8 :: WRATIO(L_LEVELS)
91  real*8  KCOEF(4)
92  integer NVAR(L_LEVELS)
93 
94  ! temporary variables to reduce memory access time to gasv
95  real*8 tmpk(2,2)
96  real*8 tmpkvar(2,2,2)
97
98  ! temporary variables for multiple aerosol calculation
99  real*8 atemp(L_NLAYRAD,L_NSPECTV)
100  real*8 btemp(L_NLAYRAD,L_NSPECTV)
101  real*8 ctemp(L_NLAYRAD,L_NSPECTV)
102
103  ! variables for k in units m^-1
104  real*8 dz(L_LEVELS)
105
106
107  integer igas, jgas
108
109  integer interm
110
111  logical :: firstcall=.true.
112!$OMP THREADPRIVATE(firstcall)
113
114  if (firstcall) then
115    ! allocate local arrays of size "naerkind" (which are also
116    ! "saved" so that this is done only once in for all even if
117    ! we don't need to store the value from a time step to the next)
118    allocate(TAUAEROLK(L_LEVELS,L_NSPECTV,NAERKIND))
119    allocate(TAEROS(L_LEVELS,L_NSPECTV,NAERKIND))
120    firstcall=.false.
121  endif ! of if (firstcall)
122
123  !! AS: to save time in computing continuum (see bilinearbig)
124  IF (.not.ALLOCATED(indv)) THEN
125      ALLOCATE(indv(L_NSPECTV,ngasmx,ngasmx))
126      indv = -9999 ! this initial value means "to be calculated"
127  ENDIF
128
129  !=======================================================================
130  !     Determine the total gas opacity throughout the column, for each
131  !     spectral interval, NW, and each Gauss point, NG.
132  !     Calculate the continuum opacities, i.e., those that do not depend on
133  !     NG, the Gauss index.
134
135  taugsurf(:,:) = 0.0
136  dpr(:)        = 0.0
137  lkcoef(:,:)   = 0.0
138
139  do K=2,L_LEVELS
140     DPR(k) = PLEV(K)-PLEV(K-1)
141
142     ! if we have continuum opacities, we need dz
143     if(kastprof)then
144        dz(k) = dpr(k)*(1000.0d0*8.314463d0/muvar(k))*TMID(K)/(g*PMID(K))
145        U(k)  = Cmk*DPR(k)*mugaz/muvar(k)
146     else
147        dz(k) = dpr(k)*R*TMID(K)/(glat_ig*PMID(K))*mugaz/muvar(k)
148        U(k)  = Cmk*DPR(k)*mugaz/muvar(k)     ! only Cmk line in optci.F 
149            !JL13 the mugaz/muvar factor takes into account water meanmolecular weight if water is present
150     endif
151
152     call tpindex(PMID(K),TMID(K),QVAR(K),pfgasref,tgasref,WREFVAR, &
153          LCOEF,MT(K),MP(K),NVAR(K),WRATIO(K))
154
155     do LK=1,4
156        LKCOEF(K,LK) = LCOEF(LK)
157     end do
158  end do                    ! levels
159
160  ! Spectral dependance of aerosol absorption
161            !JL18 It seems to be good to have aerosols in the first "radiative layer" of the gcm in the IR
162            !   but visible does not handle very well diffusion in first layer.
163            !   The tauaero and tauray are thus set to 0 (a small value for rayleigh because the code crashes otherwise)
164            !   in the 4 first semilayers in optcv, but not optci.
165            !   This solves random variations of the sw heating at the model top.
166  do iaer=1,naerkind
167     do NW=1,L_NSPECTV
168        TAEROS(1:4,NW,IAER)=0.d0
169        do K=5,L_LEVELS
170           TAEROS(K,NW,IAER) = TAUAERO(K,IAER) * QXVAER(K,NW,IAER)
171        end do                    ! levels
172     end do
173  end do
174 
175!=======================================================================
176!     Set up the wavelength independent part of the Rayleigh scattering.
177!     WAVEV is in microns.  There is no Rayleigh scattering in the IR.
178
179      if(rayleigh) then
180         call calc_rayleigh(QVAR,MUVAR,PMID,TMID,TAURAY)
181      else
182         print*,'setspv: No Rayleigh scattering, check for NaN in output!'
183         do NW=1,L_NSPECTV
184            TAURAY(:,NW) = 1E-16
185         end do
186      endif
187 
188  ! Computation of pressure dependant part of Rayleigh scattering
189  do NW=1,L_NSPECTV
190     TRAY(1:4,NW)   = 1d-30
191     do K=5,L_LEVELS
192        TRAY(K,NW)   = TAURAY(K,NW) * DPR(K)
193     end do                    ! levels
194  end do
195 
196  !     we ignore K=1...
197 
198  do K=2,L_LEVELS
199
200     do NW=1,L_NSPECTV
201     
202        DRAYAER = TRAY(K,NW)
203        !     DRAYAER is Tau RAYleigh scattering, plus AERosol opacity
204        do iaer=1,naerkind
205           DRAYAER = DRAYAER + TAEROS(K,NW,IAER)
206        end do
207
208        DCONT = 0.0 ! continuum absorption
209
210        if(continuum.and.(.not.graybody).and.callgasvis)then
211           ! include continua if necessary
212           
213          if(generic_continuum_database)then
214            T_cont  = dble(TMID(k))
215            do igas=1,ngasmx
216             
217              if(gfrac(igas).eq.-1)then ! variable
218                p_cont  = dble(PMID(k)*scalep*QVAR(k)) ! qvar = mol/mol
219              elseif(varspec) then
220                p_cont  = dble(PMID(k)*scalep*FRACVAR(igas,k)*(1.-QVAR(k)))
221              else
222                p_cont  = dble(PMID(k)*scalep*gfrac(igas)*(1.-QVAR(k)))
223              endif
224             
225              do jgas=1,ngasmx
226                if(gfrac(jgas).eq.-1)then ! variable
227                  p_cross  = dble(PMID(k)*scalep*QVAR(k)) ! qvar = mol/mol
228                elseif(varspec) then
229                  p_cross  = dble(PMID(k)*scalep*FRACVAR(jgas,k)*(1.-QVAR(k)))
230                else
231                  p_cross  = dble(PMID(k)*scalep*gfrac(jgas)*(1.-QVAR(k)))
232                endif
233               
234                dtemp=0.0
235
236                if ( ((igas .eq. igas_N2) .and. (jgas .eq. igas_N2)) .or.    &
237                     ((igas .eq. igas_N2) .and. (jgas .eq. igas_H2)) .or.    &
238                     ((igas .eq. igas_N2) .and. (jgas .eq. igas_O2)) .or.    &
239                     ((igas .eq. igas_N2) .and. (jgas .eq. igas_CH4)) .or.   &
240                     ((igas .eq. igas_O2) .and. (jgas .eq. igas_O2)) .or.    &
241                     ((igas .eq. igas_CO2) .and. (jgas .eq. igas_O2)) .or.   &
242                     ((igas .eq. igas_H2) .and. (jgas .eq. igas_H2)) .or.    &
243                     ((igas .eq. igas_H2) .and. (jgas .eq. igas_CH4)) .or.   &
244                     ((igas .eq. igas_H2) .and. (jgas .eq. igas_He)) .or.    &
245                     ((igas .eq. igas_CH4) .and. (jgas .eq. igas_CH4)) .or.  &
246                     ((igas .eq. igas_H2O) .and. (jgas .eq. igas_H2O)) .or.  &
247                     ((igas .eq. igas_H2O) .and. (jgas .eq. igas_N2)) .or.   &
248                     ((igas .eq. igas_H2O) .and. (jgas .eq. igas_O2)) .or.   &
249                     ((igas .eq. igas_H2O) .and. (jgas .eq. igas_CO2)) .or.  &
250                     ((igas .eq. igas_CO2) .and. (jgas .eq. igas_CO2)) .or.  &
251                     ((igas .eq. igas_CO2) .and. (jgas .eq. igas_H2)) .or.   &
252                     ((igas .eq. igas_CO2) .and. (jgas .eq. igas_CH4)) ) then
253
254                  call interpolate_continuum('',igas,jgas,'VI',nw,T_cont,p_cont,p_cross,dtemp,.false.)
255
256                endif
257               
258                DCONT = DCONT + dtemp
259               
260              enddo ! jgas=1,ngasmx
261               
262            enddo ! igas=1,ngasmx
263           
264          else ! generic_continuum_database
265           
266           
267           wn_cont = dble(wnov(nw))
268           T_cont  = dble(TMID(k))
269           do igas=1,ngasmx
270
271              if(gfrac(igas).eq.-1)then ! variable
272                 p_cont  = dble(PMID(k)*scalep*QVAR(k)) ! qvar = mol/mol
273              elseif(varspec) then
274                 p_cont  = dble(PMID(k)*scalep*FRACVAR(igas,k)*(1.-QVAR(k)))
275              else
276                 p_cont  = dble(PMID(k)*scalep*gfrac(igas)*(1.-QVAR(k)))
277              endif
278
279              dtemp=0.0
280              if(igas.eq.igas_N2)then
281
282                 interm = indv(nw,igas,igas)
283!                 call interpolateN2N2(wn_cont,T_cont,p_cont,dtemp,.false.,interm)
284                 indv(nw,igas,igas) = interm
285                 ! only goes to 500 cm^-1, so unless we're around a cold brown dwarf, this is irrelevant in the visible
286
287              elseif(igas.eq.igas_H2)then
288
289                 ! first do self-induced absorption
290                 interm = indv(nw,igas,igas)
291                 call interpolateH2H2(wn_cont,T_cont,p_cont,dtemp,.false.,interm)
292                 indv(nw,igas,igas) = interm
293
294                 ! then cross-interactions with other gases
295                 do jgas=1,ngasmx
296                    if(varspec) then
297                      p_cross = dble(PMID(k)*scalep*FRACVAR(jgas,k)*(1.-QVAR(k)))
298                    else
299                      p_cross = dble(PMID(k)*scalep*gfrac(jgas)*(1.-QVAR(k)))
300                    endif
301                    dtempc  = 0.0
302                    if(jgas.eq.igas_N2)then
303                       interm = indv(nw,igas,jgas)
304                       call interpolateN2H2(wn_cont,T_cont,p_cross,p_cont,dtempc,.false.,interm)
305                       indv(nw,igas,jgas) = interm
306                       ! should be irrelevant in the visible
307                    elseif(jgas.eq.igas_CO2)then
308                       interm = indv(nw,igas,jgas)
309                       call interpolateCO2H2(wn_cont,T_cont,p_cross,p_cont,dtempc,.false.,interm)
310                       indv(nw,igas,jgas) = interm
311                       ! might not be relevant in the visible
312                    elseif(jgas.eq.igas_He)then
313                       interm = indv(nw,igas,jgas)
314                       call interpolateH2He(wn_cont,T_cont,p_cross,p_cont,dtempc,.false.,interm)
315                       indv(nw,igas,jgas) = interm
316                    endif
317                    dtemp = dtemp + dtempc
318                 enddo
319                 
320              elseif(igas.eq.igas_CH4)then
321
322                 ! first do self-induced absorption
323                 interm = indv(nw,igas,igas)
324                 call interpolateCH4CH4(wn_cont,T_cont,p_cont,dtemp,.false.,interm)
325                 indv(nw,igas,igas) = interm
326
327                 ! then cross-interactions with other gases
328                 do jgas=1,ngasmx
329                    if(varspec) then
330                      p_cross = dble(PMID(k)*scalep*FRACVAR(jgas,k)*(1.-QVAR(k)))
331                    else
332                      p_cross = dble(PMID(k)*scalep*gfrac(jgas)*(1.-QVAR(k)))
333                    endif
334                    dtempc  = 0.0d0
335                    if(jgas.eq.igas_H2)then
336                       interm = indv(nw,igas,jgas)
337                       call interpolateH2CH4(wn_cont,T_cont,p_cross,p_cont,dtempc,.false.,interm)
338                       indv(nw,igas,jgas) = interm
339                    elseif(jgas.eq.igas_CO2)then
340                       interm = indv(nw,igas,jgas)
341                       call interpolateCO2CH4(wn_cont,T_cont,p_cross,p_cont,dtempc,.false.,interm)
342                       indv(nw,igas,jgas) = interm
343                       ! might not be relevant in the visible
344                    elseif(jgas.eq.igas_He)then
345                       interm = indv(nw,igas,jgas)
346                       call interpolateHeCH4(wn_cont,T_cont,p_cross,p_cont,dtempc,.false.,interm)
347                       indv(nw,igas,jgas) = interm
348                    endif
349                    dtemp = dtemp + dtempc
350                 enddo
351
352              elseif(igas.eq.igas_H2O.and.T_cont.gt.100.0)then
353                 ! Compute self and foreign (with air) continuum of H2O
354                 p_air = dble(PMID(k)*scalep) - p_cont ! note assumes background is air!
355                 interm = indv(nw,igas,igas)
356                 call interpolateH2O_self_foreign(wn_cont,T_cont,p_cont,p_air,dtemp,.false.,interm) ! MTCKD v3.3
357                 indv(nw,igas,igas) = interm
358
359              endif
360
361              DCONT = DCONT + dtemp
362
363           enddo
364
365           DCONT = DCONT*dz(k)
366
367        endif ! generic_continuum_database
368        endif ! continuum
369       
370        do ng=1,L_NGAUSS-1
371
372           ! Now compute TAUGAS
373
374           ! Interpolate between water mixing ratios
375           ! WRATIO = 0.0 if the requested water amount is equal to, or outside the
376           ! the water data range
377
378           if(L_REFVAR.eq.1)then ! added by RW for special no variable case
379           
380              ! JVO 2017 : added tmpk because the repeated calls to gasi/v increased dramatically
381              ! the execution time of optci/v -> ~ factor 2 on the whole radiative
382              ! transfer on the tested simulations !
383
384              IF (corrk_recombin) THEN ! Added by JVO
385                tmpk = GASV_RECOMB(MT(K):MT(K)+1,MP(K):MP(K)+1,1,NW,NG) ! contains the mix of recombined species
386              ELSE
387                tmpk = GASV(MT(K):MT(K)+1,MP(K):MP(K)+1,1,NW,NG)
388              ENDIF
389             
390              KCOEF(1) = tmpk(1,1) ! KCOEF(1) = GASV(MT(K),MP(K),1,NW,NG)
391              KCOEF(2) = tmpk(1,2) ! KCOEF(2) = GASV(MT(K),MP(K)+1,1,NW,NG)
392              KCOEF(3) = tmpk(2,2) ! KCOEF(3) = GASV(MT(K)+1,MP(K)+1,1,NW,NG)
393              KCOEF(4) = tmpk(2,1) ! KCOEF(4) = GASV(MT(K)+1,MP(K),1,NW,NG)
394
395           else
396
397              IF (corrk_recombin) THEN
398                tmpkvar = GASV_RECOMB(MT(K):MT(K)+1,MP(K):MP(K)+1,NVAR(K):NVAR(K)+1,NW,NG)
399              ELSE
400                tmpkvar = GASV(MT(K):MT(K)+1,MP(K):MP(K)+1,NVAR(K):NVAR(K)+1,NW,NG)
401              ENDIF
402
403              KCOEF(1) = tmpkvar(1,1,1) + WRATIO(K) *  &
404                        ( tmpkvar(1,1,2)-tmpkvar(1,1,1) )
405
406              KCOEF(2) = tmpkvar(1,2,1) + WRATIO(K) *  &
407                        ( tmpkvar(1,2,2)-tmpkvar(1,2,1) )
408
409              KCOEF(3) = tmpkvar(2,2,1) + WRATIO(K) *  &
410                        ( tmpkvar(2,2,2)-tmpkvar(2,2,1) )
411             
412              KCOEF(4) = tmpkvar(2,1,1) + WRATIO(K) *  &
413                        ( tmpkvar(2,1,2)-tmpkvar(2,1,1) )
414
415
416           endif
417
418           ! Interpolate the gaseous k-coefficients to the requested T,P values
419
420           ANS = LKCOEF(K,1)*KCOEF(1) + LKCOEF(K,2)*KCOEF(2) +            &
421                LKCOEF(K,3)*KCOEF(3) + LKCOEF(K,4)*KCOEF(4)
422
423           TAUGAS  = U(k)*ANS
424
425           TAUGSURF(NW,NG) = TAUGSURF(NW,NG) + TAUGAS + DCONT
426           DTAUKV(K,nw,ng) = TAUGAS &
427                             + DRAYAER & ! DRAYAER includes all scattering contributions
428                             + DCONT ! For parameterized continuum aborption
429
430        end do
431
432        ! Now fill in the "clear" part of the spectrum (NG = L_NGAUSS),
433        ! which holds continuum opacity only
434
435        NG              = L_NGAUSS
436        DTAUKV(K,nw,ng) = DRAYAER + DCONT ! Scattering + parameterized continuum absorption
437
438     end do
439  end do
440
441  !=======================================================================
442  !     Now the full treatment for the layers, where besides the opacity
443  !     we need to calculate the scattering albedo and asymmetry factors
444
445            !JL18 It seems to be good to have aerosols in the first "radiative layer" of the gcm in the IR
446            !   but not in the visible
447            !   The tauaero is thus set to 0 in the 4 first semilayers in optcv, but not optci.
448            !   This solves random variations of the sw heating at the model top.
449  do iaer=1,naerkind
450    DO NW=1,L_NSPECTV
451      TAUAEROLK(1:4,NW,IAER)=0.d0
452      DO K=5,L_LEVELS
453           TAUAEROLK(K,NW,IAER) = TAUAERO(K,IAER) * QSVAER(K,NW,IAER) ! effect of scattering albedo
454      ENDDO
455    ENDDO
456  end do
457
458  DO NW=1,L_NSPECTV
459     DO L=1,L_NLAYRAD-1
460        K              = 2*L+1
461        atemp(L,NW) = SUM(GVAER(K,NW,1:naerkind) * TAUAEROLK(K,NW,1:naerkind))+SUM(GVAER(K+1,NW,1:naerkind) * TAUAEROLK(K+1,NW,1:naerkind))
462        btemp(L,NW) = SUM(TAUAEROLK(K,NW,1:naerkind)) + SUM(TAUAEROLK(K+1,NW,1:naerkind))
463        ctemp(L,NW) = btemp(L,NW) + 0.9999*(TRAY(K,NW) + TRAY(K+1,NW))  ! JVO 2017 : does this 0.999 is really meaningful ?
464        btemp(L,NW) = btemp(L,NW) + TRAY(K,NW) + TRAY(K+1,NW)
465        COSBV(L,NW,1:L_NGAUSS) = atemp(L,NW)/btemp(L,NW)
466     END DO ! L vertical loop
467     
468     ! Last level
469     L           = L_NLAYRAD
470     K           = 2*L+1
471     atemp(L,NW) = SUM(GVAER(K,NW,1:naerkind) * TAUAEROLK(K,NW,1:naerkind))
472     btemp(L,NW) = SUM(TAUAEROLK(K,NW,1:naerkind))
473     ctemp(L,NW) = btemp(L,NW) + 0.9999*TRAY(K,NW) ! JVO 2017 : does this 0.999 is really meaningful ?
474     btemp(L,NW) = btemp(L,NW) + TRAY(K,NW)
475     COSBV(L,NW,1:L_NGAUSS) = atemp(L,NW)/btemp(L,NW)
476     
477     
478  END DO                    ! NW spectral loop
479
480  DO NG=1,L_NGAUSS
481    DO NW=1,L_NSPECTV
482     DO L=1,L_NLAYRAD-1
483
484        K              = 2*L+1
485        DTAUV(L,nw,ng) = DTAUKV(K,NW,NG) + DTAUKV(K+1,NW,NG)
486        WBARV(L,nw,ng) = ctemp(L,NW) / DTAUV(L,nw,ng)
487
488      END DO ! L vertical loop
489
490        ! Last level
491
492        L              = L_NLAYRAD
493        K              = 2*L+1
494        DTAUV(L,nw,ng) = DTAUKV(K,NW,NG)
495
496        WBARV(L,NW,NG) = ctemp(L,NW) / DTAUV(L,NW,NG)
497
498     END DO                 ! NW spectral loop
499  END DO                    ! NG Gauss loop
500
501  ! Total extinction optical depths
502
503  DO NG=1,L_NGAUSS       ! full gauss loop
504     DO NW=1,L_NSPECTV       
505        TAUCUMV(1,NW,NG)=0.0D0
506        DO K=2,L_LEVELS
507           TAUCUMV(K,NW,NG)=TAUCUMV(K-1,NW,NG)+DTAUKV(K,NW,NG)
508        END DO
509
510        DO L=1,L_NLAYRAD
511           TAUV(L,NW,NG)=TAUCUMV(2*L,NW,NG)
512        END DO
513        TAUV(L,NW,NG)=TAUCUMV(2*L_NLAYRAD+1,NW,NG)
514     END DO           
515  END DO                 ! end full gauss loop
516
517
518
519
520end subroutine optcv
521
522END MODULE optcv_mod
Note: See TracBrowser for help on using the repository browser.