source: trunk/LMDZ.GENERIC/libf/phystd/optcv.F @ 220

Last change on this file since 220 was 135, checked in by aslmd, 14 years ago

CHANGEMENT ARBORESCENCE ETAPE 2 -- NON COMPLET

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