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

Last change on this file since 3817 was 3797, checked in by mturbet, 3 weeks ago

additional corrrection for the new continuum routine

  • 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          endif ! generic_continuum_database
366         
367          DCONT = DCONT*dz(k)
368         
369        endif ! continuum
370       
371        do ng=1,L_NGAUSS-1
372
373           ! Now compute TAUGAS
374
375           ! Interpolate between water mixing ratios
376           ! WRATIO = 0.0 if the requested water amount is equal to, or outside the
377           ! the water data range
378
379           if(L_REFVAR.eq.1)then ! added by RW for special no variable case
380           
381              ! JVO 2017 : added tmpk because the repeated calls to gasi/v increased dramatically
382              ! the execution time of optci/v -> ~ factor 2 on the whole radiative
383              ! transfer on the tested simulations !
384
385              IF (corrk_recombin) THEN ! Added by JVO
386                tmpk = GASV_RECOMB(MT(K):MT(K)+1,MP(K):MP(K)+1,1,NW,NG) ! contains the mix of recombined species
387              ELSE
388                tmpk = GASV(MT(K):MT(K)+1,MP(K):MP(K)+1,1,NW,NG)
389              ENDIF
390             
391              KCOEF(1) = tmpk(1,1) ! KCOEF(1) = GASV(MT(K),MP(K),1,NW,NG)
392              KCOEF(2) = tmpk(1,2) ! KCOEF(2) = GASV(MT(K),MP(K)+1,1,NW,NG)
393              KCOEF(3) = tmpk(2,2) ! KCOEF(3) = GASV(MT(K)+1,MP(K)+1,1,NW,NG)
394              KCOEF(4) = tmpk(2,1) ! KCOEF(4) = GASV(MT(K)+1,MP(K),1,NW,NG)
395
396           else
397
398              IF (corrk_recombin) THEN
399                tmpkvar = GASV_RECOMB(MT(K):MT(K)+1,MP(K):MP(K)+1,NVAR(K):NVAR(K)+1,NW,NG)
400              ELSE
401                tmpkvar = GASV(MT(K):MT(K)+1,MP(K):MP(K)+1,NVAR(K):NVAR(K)+1,NW,NG)
402              ENDIF
403
404              KCOEF(1) = tmpkvar(1,1,1) + WRATIO(K) *  &
405                        ( tmpkvar(1,1,2)-tmpkvar(1,1,1) )
406
407              KCOEF(2) = tmpkvar(1,2,1) + WRATIO(K) *  &
408                        ( tmpkvar(1,2,2)-tmpkvar(1,2,1) )
409
410              KCOEF(3) = tmpkvar(2,2,1) + WRATIO(K) *  &
411                        ( tmpkvar(2,2,2)-tmpkvar(2,2,1) )
412             
413              KCOEF(4) = tmpkvar(2,1,1) + WRATIO(K) *  &
414                        ( tmpkvar(2,1,2)-tmpkvar(2,1,1) )
415
416
417           endif
418
419           ! Interpolate the gaseous k-coefficients to the requested T,P values
420
421           ANS = LKCOEF(K,1)*KCOEF(1) + LKCOEF(K,2)*KCOEF(2) +            &
422                LKCOEF(K,3)*KCOEF(3) + LKCOEF(K,4)*KCOEF(4)
423
424           TAUGAS  = U(k)*ANS
425
426           TAUGSURF(NW,NG) = TAUGSURF(NW,NG) + TAUGAS + DCONT
427           DTAUKV(K,nw,ng) = TAUGAS &
428                             + DRAYAER & ! DRAYAER includes all scattering contributions
429                             + DCONT ! For parameterized continuum aborption
430
431        end do
432
433        ! Now fill in the "clear" part of the spectrum (NG = L_NGAUSS),
434        ! which holds continuum opacity only
435
436        NG              = L_NGAUSS
437        DTAUKV(K,nw,ng) = DRAYAER + DCONT ! Scattering + parameterized continuum absorption
438
439     end do
440  end do
441
442  !=======================================================================
443  !     Now the full treatment for the layers, where besides the opacity
444  !     we need to calculate the scattering albedo and asymmetry factors
445
446            !JL18 It seems to be good to have aerosols in the first "radiative layer" of the gcm in the IR
447            !   but not in the visible
448            !   The tauaero is thus set to 0 in the 4 first semilayers in optcv, but not optci.
449            !   This solves random variations of the sw heating at the model top.
450  do iaer=1,naerkind
451    DO NW=1,L_NSPECTV
452      TAUAEROLK(1:4,NW,IAER)=0.d0
453      DO K=5,L_LEVELS
454           TAUAEROLK(K,NW,IAER) = TAUAERO(K,IAER) * QSVAER(K,NW,IAER) ! effect of scattering albedo
455      ENDDO
456    ENDDO
457  end do
458
459  DO NW=1,L_NSPECTV
460     DO L=1,L_NLAYRAD-1
461        K              = 2*L+1
462        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))
463        btemp(L,NW) = SUM(TAUAEROLK(K,NW,1:naerkind)) + SUM(TAUAEROLK(K+1,NW,1:naerkind))
464        ctemp(L,NW) = btemp(L,NW) + 0.9999*(TRAY(K,NW) + TRAY(K+1,NW))  ! JVO 2017 : does this 0.999 is really meaningful ?
465        btemp(L,NW) = btemp(L,NW) + TRAY(K,NW) + TRAY(K+1,NW)
466        COSBV(L,NW,1:L_NGAUSS) = atemp(L,NW)/btemp(L,NW)
467     END DO ! L vertical loop
468     
469     ! Last level
470     L           = L_NLAYRAD
471     K           = 2*L+1
472     atemp(L,NW) = SUM(GVAER(K,NW,1:naerkind) * TAUAEROLK(K,NW,1:naerkind))
473     btemp(L,NW) = SUM(TAUAEROLK(K,NW,1:naerkind))
474     ctemp(L,NW) = btemp(L,NW) + 0.9999*TRAY(K,NW) ! JVO 2017 : does this 0.999 is really meaningful ?
475     btemp(L,NW) = btemp(L,NW) + TRAY(K,NW)
476     COSBV(L,NW,1:L_NGAUSS) = atemp(L,NW)/btemp(L,NW)
477     
478     
479  END DO                    ! NW spectral loop
480
481  DO NG=1,L_NGAUSS
482    DO NW=1,L_NSPECTV
483     DO L=1,L_NLAYRAD-1
484
485        K              = 2*L+1
486        DTAUV(L,nw,ng) = DTAUKV(K,NW,NG) + DTAUKV(K+1,NW,NG)
487        WBARV(L,nw,ng) = ctemp(L,NW) / DTAUV(L,nw,ng)
488
489      END DO ! L vertical loop
490
491        ! Last level
492
493        L              = L_NLAYRAD
494        K              = 2*L+1
495        DTAUV(L,nw,ng) = DTAUKV(K,NW,NG)
496
497        WBARV(L,NW,NG) = ctemp(L,NW) / DTAUV(L,NW,NG)
498
499     END DO                 ! NW spectral loop
500  END DO                    ! NG Gauss loop
501
502  ! Total extinction optical depths
503
504  DO NG=1,L_NGAUSS       ! full gauss loop
505     DO NW=1,L_NSPECTV       
506        TAUCUMV(1,NW,NG)=0.0D0
507        DO K=2,L_LEVELS
508           TAUCUMV(K,NW,NG)=TAUCUMV(K-1,NW,NG)+DTAUKV(K,NW,NG)
509        END DO
510
511        DO L=1,L_NLAYRAD
512           TAUV(L,NW,NG)=TAUCUMV(2*L,NW,NG)
513        END DO
514        TAUV(L,NW,NG)=TAUCUMV(2*L_NLAYRAD+1,NW,NG)
515     END DO           
516  END DO                 ! end full gauss loop
517
518
519
520
521end subroutine optcv
522
523END MODULE optcv_mod
Note: See TracBrowser for help on using the repository browser.