source: trunk/LMDZ.GENERIC/libf/phystd/gfluxv.F @ 1980

Last change on this file since 1980 was 1420, checked in by sglmd, 10 years ago

some clean-up: hard coded parameters removed

File size: 10.1 KB
RevLine 
[135]1      SUBROUTINE GFLUXV(DTDEL,TDEL,TAUCUMIN,WDEL,CDEL,UBAR0,F0PI,RSF,
2     *                  BTOP,BSURF,FMIDP,FMIDM,DIFFV,FLUXUP,FLUXDN)
3
4
5C  THIS SUBROUTINE TAKES THE OPTICAL CONSTANTS AND BOUNDARY CONDITIONS
6C  FOR THE VISIBLE  FLUX AT ONE WAVELENGTH AND SOLVES FOR THE FLUXES AT
7C  THE LEVELS. THIS VERSION IS SET UP TO WORK WITH LAYER OPTICAL DEPTHS
8C  MEASURED FROM THE TOP OF EACH LAYER.  (DTAU) TOP OF EACH LAYER HAS 
9C  OPTICAL DEPTH TAU(N).IN THIS SUB LEVEL N IS ABOVE LAYER N. THAT IS LAYER N
10C  HAS LEVEL N ON TOP AND LEVEL N+1 ON BOTTOM. OPTICAL DEPTH INCREASES
11C  FROM TOP TO BOTTOM. SEE C.P. MCKAY, TGM NOTES.
12C THIS SUBROUTINE DIFFERS FROM ITS IR COUNTERPART IN THAT HERE WE SOLVE FOR
13C THE FLUXES DIRECTLY USING THE GENERALIZED NOTATION OF MEADOR AND WEAVOR
14C J.A.S., 37, 630-642, 1980.
15C THE TRI-DIAGONAL MATRIX SOLVER IS DSOLVER AND IS DOUBLE PRECISION SO MANY
16C VARIABLES ARE PASSED AS SINGLE THEN BECOME DOUBLE IN DSOLVER
17C
18C NLL           = NUMBER OF LEVELS (NAYER + 1) THAT WILL BE SOLVED
19C NAYER         = NUMBER OF LAYERS (NOTE DIFFERENT SPELLING HERE)
20C WAVEN         = WAVELENGTH FOR THE COMPUTATION
21C DTDEL(NLAYER) = ARRAY OPTICAL DEPTH OF THE LAYERS
22C TDEL(NLL)     = ARRAY COLUMN OPTICAL DEPTH AT THE LEVELS
23C WDEL(NLEVEL)  = SINGLE SCATTERING ALBEDO
24C CDEL(NLL)     = ASYMMETRY FACTORS, 0=ISOTROPIC
25C UBARV         = AVERAGE ANGLE,
26C UBAR0         = SOLAR ZENITH ANGLE
27C F0PI          = INCIDENT SOLAR DIRECT BEAM FLUX
28C RSF           = SURFACE REFLECTANCE
29C BTOP          = UPPER BOUNDARY CONDITION ON DIFFUSE FLUX
30C BSURF         = REFLECTED DIRECT BEAM = (1-RSFI)*F0PI*EDP-TAU/U
31C FP(NLEVEL)    = UPWARD FLUX AT LEVELS
32C FM(NLEVEL)    = DOWNWARD FLUX AT LEVELS
33C FMIDP(NLAYER) = UPWARD FLUX AT LAYER MIDPOINTS
34C FMIDM(NLAYER) = DOWNWARD FLUX AT LAYER MIDPOINTS
35C added Dec 2002
36C DIFFV         = downward diffuse solar flux at the surface
37C
38!======================================================================!
39
40      use radinc_h
41
42      implicit none
43
[1420]44!!      INTEGER NLP
45!!      PARAMETER (NLP=101) ! MUST BE LARGER THAN NLEVEL
[135]46
47      REAL*8 EM, EP
48      REAL*8 W0(L_NLAYRAD), COSBAR(L_NLAYRAD), DTAU(L_NLAYRAD)
49      REAL*8 TAU(L_NLEVRAD), WDEL(L_NLAYRAD), CDEL(L_NLAYRAD)
50      REAL*8 DTDEL(L_NLAYRAD), TDEL(L_NLEVRAD)
51      REAL*8 FMIDP(L_NLAYRAD), FMIDM(L_NLAYRAD)
[1420]52      REAL*8 LAMDA(L_NLAYRAD), ALPHA(L_NLAYRAD), XK1(L_NLAYRAD)
53      REAL*8 XK2(L_NLAYRAD),G1(L_NLAYRAD), G2(L_NLAYRAD)
54      REAL*8 G3(L_NLAYRAD), GAMA(L_NLAYRAD),CP(L_NLAYRAD),CM(L_NLAYRAD)
55      REAL*8 CPM1(L_NLAYRAD),CMM1(L_NLAYRAD), E1(L_NLAYRAD)
56      REAL*8 E2(L_NLAYRAD),E3(L_NLAYRAD),E4(L_NLAYRAD),EXPTRM(L_NLAYRAD)
[135]57      REAL*8 FLUXUP, FLUXDN
58      REAL*8 FACTOR, TAUCUMIN(L_LEVELS), TAUCUM(L_LEVELS)
59
60      integer NAYER, L, K
61      real*8  ubar0, f0pi, rsf, btop, bsurf, g4, denom, am, ap
62      real*8  taumax, taumid, cpmid, cmmid
63      real*8  diffv
64
65C======================================================================C
66
67
68
[253]69
[135]70      NAYER  = L_NLAYRAD
71      TAUMAX = L_TAUMAX    !Default is 35.0
72     
73!  Delta-Eddington Scaling
74
75
76      FACTOR    = 1.0D0 - WDEL(1)*CDEL(1)**2
77
78      TAU(1)    = TDEL(1)*FACTOR
79      TAUCUM(1) = 0.0D0
80      TAUCUM(2) = TAUCUMIN(2)*FACTOR
81      TAUCUM(3) = TAUCUM(2) +(TAUCUMIN(3)-TAUCUMIN(2))*FACTOR
82
83
84      DO L=1,L_NLAYRAD-1
85        FACTOR      = 1.0D0 - WDEL(L)*CDEL(L)**2
86        W0(L)       = WDEL(L)*(1.0D0-CDEL(L)**2)/FACTOR
87        COSBAR(L)   = CDEL(L)/(1.0D0+CDEL(L))
[253]88
[135]89        DTAU(L)     = DTDEL(L)*FACTOR
90        TAU(L+1)    = TAU(L)+DTAU(L)
91        K           = 2*(L+1)
92        TAUCUM(K)   = TAU(L+1)
93        TAUCUM(K+1) = TAUCUM(K) + (TAUCUMIN(K+1)-TAUCUMIN(K))*FACTOR
94      END DO
95
96!  Bottom layer
97
98      L             = L_NLAYRAD
99      FACTOR        = 1.0D0 - WDEL(L)*CDEL(L)**2
100      W0(L)         = WDEL(L)*(1.0D0-CDEL(L)**2)/FACTOR
101      COSBAR(L)     = CDEL(L)/(1.0D0+CDEL(L))
102      DTAU(L)       = DTDEL(L)*FACTOR
103      TAU(L+1)      = TAU(L)+DTAU(L)
104      TAUCUM(2*L+1) = TAU(L+1)
105
106      BSURF = RSF*UBAR0*F0PI*EXP(-MIN(TAU(L+1),TAUMAX)/UBAR0)
107      ! new definition of BSURF
108      ! the old one was false because it used tau, not tau'
109      ! tau' includes the contribution to the downward flux
110      ! of the radiation scattered in the forward direction
111
112C     WE GO WITH THE QUADRATURE APPROACH HERE.  THE "SQRT(3)" factors
113C     ARE THE UBARV TERM.
114
115      DO L=1,L_NLAYRAD
116
[253]117        ALPHA(L)=SQRT( (1.0-W0(L))/(1.0-W0(L)*COSBAR(L) ) )
[135]118
119C       SET OF CONSTANTS DETERMINED BY DOM
120
[253]121!     Quadrature method
[135]122        G1(L)    = (SQRT(3.0)*0.5)*(2.0- W0(L)*(1.0+COSBAR(L)))
123        G2(L)    = (SQRT(3.0)*W0(L)*0.5)*(1.0-COSBAR(L))
124        G3(L)    = 0.5*(1.0-SQRT(3.0)*COSBAR(L)*UBAR0)
125
[253]126!     ----- some other methods... (RDW) ------
[135]127
[253]128!     Eddington method
129!        G1(L)    =  0.25*(7.0 - W0(L)*(4.0 - 3.0*COSBAR(L)))
130!        G2(L)    = -0.25*(1.0 - W0(L)*(4.0 - 3.0*COSBAR(L)))
131!        G3(L)    =  0.25*(2.0 - 3.0*COSBAR(L)*UBAR0)
132
133!     delta-Eddington method
134!        G1(L)    =  (7.0 - 3.0*g^2 - W0(L)*(4.0 + 3.0*g) + W0(L)*g^2*(4*beta0 + 3*g)) / &
135!                             (4* (1 - g^2*()   ))  0.25*(7.0 - W0(L)*(4.0 - 3.0*COSBAR(L)))
136
137!     Hybrid modified Eddington-delta function method
138
139!     ----------------------------------------
140
141c     So they use Quadrature
[135]142c     but the scaling is Eddington?
143
144        LAMDA(L) = SQRT(G1(L)**2 - G2(L)**2)
145        GAMA(L)  = (G1(L)-LAMDA(L))/G2(L)
146      END DO
147
148
149      DO L=1,L_NLAYRAD
150        G4    = 1.0-G3(L)
151        DENOM = LAMDA(L)**2 - 1./UBAR0**2
152 
153C       THERE IS A POTENTIAL PROBLEM HERE IF W0=0 AND UBARV=UBAR0
154C       THEN DENOM WILL VANISH. THIS ONLY HAPPENS PHYSICALLY WHEN
155C       THE SCATTERING GOES TO ZERO
156C       PREVENT THIS WITH AN IF STATEMENT
157
158        IF ( DENOM .EQ. 0.) THEN
159          DENOM=1.E-10
160        END IF
161
162
163        AM = F0PI*W0(L)*(G4   *(G1(L)+1./UBAR0) +G2(L)*G3(L) )/DENOM
164        AP = F0PI*W0(L)*(G3(L)*(G1(L)-1./UBAR0) +G2(L)*G4    )/DENOM
165
166C       CPM1 AND CMM1 ARE THE CPLUS AND CMINUS TERMS EVALUATED
167C       AT THE TOP OF THE LAYER, THAT IS LOWER   OPTICAL DEPTH TAU(L)
168 
169        CPM1(L) = AP*EXP(-TAU(L)/UBAR0)
170        CMM1(L) = AM*EXP(-TAU(L)/UBAR0)
171
172C       CP AND CM ARE THE CPLUS AND CMINUS TERMS EVALUATED AT THE
173C       BOTTOM OF THE LAYER.  THAT IS AT HIGHER OPTICAL DEPTH TAU(L+1)
174
175        CP(L) = AP*EXP(-TAU(L+1)/UBAR0)
176        CM(L) = AM*EXP(-TAU(L+1)/UBAR0)
177
178      END DO
179
180
181 
182C     NOW CALCULATE THE EXPONENTIAL TERMS NEEDED
183C     FOR THE TRIDIAGONAL ROTATED LAYERED METHOD
184
185      DO L=1,L_NLAYRAD
186        EXPTRM(L) = MIN(TAUMAX,LAMDA(L)*DTAU(L))  ! CLIPPED EXPONENTIAL
187        EP = EXP(EXPTRM(L))
188
189        EM        = 1.0/EP
190        E1(L)     = EP+GAMA(L)*EM
191        E2(L)     = EP-GAMA(L)*EM
192        E3(L)     = GAMA(L)*EP+EM
193        E4(L)     = GAMA(L)*EP-EM
194      END DO
195
196      CALL DSOLVER(NAYER,GAMA,CP,CM,CPM1,CMM1,E1,E2,E3,E4,BTOP,
197     *             BSURF,RSF,XK1,XK2)
198
199C     NOW WE CALCULATE THE FLUXES AT THE MIDPOINTS OF THE LAYERS.
200 
201      DO L=1,L_NLAYRAD-1
202        EXPTRM(L) = MIN(TAUMAX,LAMDA(L)*(TAUCUM(2*L+1)-TAUCUM(2*L)))
203 
204        EP = EXP(EXPTRM(L))
205
206        EM    = 1.0/EP
207        G4    = 1.0-G3(L)
208        DENOM = LAMDA(L)**2 - 1./UBAR0**2
209
210C       THERE IS A POTENTIAL PROBLEM HERE IF W0=0 AND UBARV=UBAR0
211C       THEN DENOM WILL VANISH. THIS ONLY HAPPENS PHYSICALLY WHEN
212C       THE SCATTERING GOES TO ZERO
213C       PREVENT THIS WITH A IF STATEMENT
214
215
216        IF ( DENOM .EQ. 0.) THEN
217          DENOM=1.E-10
218        END IF
219
220        AM = F0PI*W0(L)*(G4   *(G1(L)+1./UBAR0) +G2(L)*G3(L) )/DENOM
221        AP = F0PI*W0(L)*(G3(L)*(G1(L)-1./UBAR0) +G2(L)*G4    )/DENOM
222
223C       CPMID AND CMMID  ARE THE CPLUS AND CMINUS TERMS EVALUATED
224C       AT THE MIDDLE OF THE LAYER.
225
226        TAUMID   = TAUCUM(2*L+1)
227
228        CPMID = AP*EXP(-TAUMID/UBAR0)
229        CMMID = AM*EXP(-TAUMID/UBAR0)
230
231        FMIDP(L) = XK1(L)*EP + GAMA(L)*XK2(L)*EM + CPMID
232        FMIDM(L) = XK1(L)*EP*GAMA(L) + XK2(L)*EM + CMMID
233 
234C       ADD THE DIRECT FLUX TO THE DOWNWELLING TERM
235
236        FMIDM(L)= FMIDM(L)+UBAR0*F0PI*EXP(-MIN(TAUMID,TAUMAX)/UBAR0)
237   
238      END DO
239 
240C     FLUX AT THE Ptop layer
241
242      EP    = 1.0
243      EM    = 1.0
244      G4    = 1.0-G3(1)
245      DENOM = LAMDA(1)**2 - 1./UBAR0**2
246
247C     THERE IS A POTENTIAL PROBLEM HERE IF W0=0 AND UBARV=UBAR0
248C     THEN DENOM WILL VANISH. THIS ONLY HAPPENS PHYSICALLY WHEN
249C     THE SCATTERING GOES TO ZERO
250C     PREVENT THIS WITH A IF STATEMENT
251
252      IF ( DENOM .EQ. 0.) THEN
253        DENOM=1.E-10
254      END IF
255
256      AM = F0PI*W0(1)*(G4   *(G1(1)+1./UBAR0) +G2(1)*G3(1) )/DENOM
257      AP = F0PI*W0(1)*(G3(1)*(G1(1)-1./UBAR0) +G2(1)*G4    )/DENOM
258
259C     CPMID AND CMMID  ARE THE CPLUS AND CMINUS TERMS EVALUATED
260C     AT THE MIDDLE OF THE LAYER.
261
262      CPMID  = AP
263      CMMID  = AM
264
265      FLUXUP = XK1(1)*EP + GAMA(1)*XK2(1)*EM + CPMID
266      FLUXDN = XK1(1)*EP*GAMA(1) + XK2(1)*EM + CMMID
267
268C     ADD THE DIRECT FLUX TO THE DOWNWELLING TERM
269
270      fluxdn = fluxdn+UBAR0*F0PI*EXP(-MIN(TAUCUM(1),TAUMAX)/UBAR0)
[253]271
[135]272C     This is for the "special" bottom layer, where we take
273C     DTAU instead of DTAU/2.
274
275      L     = L_NLAYRAD
276      EXPTRM(L) = MIN(TAUMAX,LAMDA(L)*(TAUCUM(L_LEVELS)-
277     *                                 TAUCUM(L_LEVELS-1)))
278
279      EP    = EXP(EXPTRM(L))
280      EM    = 1.0/EP
281      G4    = 1.0-G3(L)
282      DENOM = LAMDA(L)**2 - 1./UBAR0**2
283
284
285C     THERE IS A POTENTIAL PROBLEM HERE IF W0=0 AND UBARV=UBAR0
286C     THEN DENOM WILL VANISH. THIS ONLY HAPPENS PHYSICALLY WHEN
287C     THE SCATTERING GOES TO ZERO
288C     PREVENT THIS WITH A IF STATEMENT
289
290
291      IF ( DENOM .EQ. 0.) THEN
292        DENOM=1.E-10
293      END IF
294
295      AM = F0PI*W0(L)*(G4   *(G1(L)+1./UBAR0) +G2(L)*G3(L) )/DENOM
296      AP = F0PI*W0(L)*(G3(L)*(G1(L)-1./UBAR0) +G2(L)*G4    )/DENOM
297
298C     CPMID AND CMMID  ARE THE CPLUS AND CMINUS TERMS EVALUATED
299C     AT THE MIDDLE OF THE LAYER.
300
301      TAUMID   = MIN(TAUCUM(L_LEVELS),TAUMAX)
302      CPMID    = AP*EXP(-MIN(TAUMID,TAUMAX)/UBAR0)
303      CMMID    = AM*EXP(-MIN(TAUMID,TAUMAX)/UBAR0)
304
305
306      FMIDP(L) = XK1(L)*EP + GAMA(L)*XK2(L)*EM + CPMID
307      FMIDM(L) = XK1(L)*EP*GAMA(L) + XK2(L)*EM + CMMID
308
309C  Save the diffuse downward flux for TEMPGR calculations
310
311      DIFFV = FMIDM(L)
312
313
314C     ADD THE DIRECT FLUX TO THE DOWNWELLING TERM
315
316      FMIDM(L)= FMIDM(L)+UBAR0*F0PI*EXP(-MIN(TAUMID,TAUMAX)/UBAR0)
317
318
319      RETURN
320      END
Note: See TracBrowser for help on using the repository browser.