source: trunk/LMDZ.VENUS/libf/phyvenus/gfluxv.F @ 3556

Last change on this file since 3556 was 2560, checked in by slebonnois, 3 years ago

SL: Implementation of SW computation based on generic model. Switch between this new SW module or old module that reads R. Haus tables implemented with a key (solarchoice)

File size: 10.8 KB
RevLine 
[2560]1      SUBROUTINE GFLUXV(DTDEL,TDEL,TAUCUMIN,WDEL,CDEL,UBAR0in,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
44!!      INTEGER NLP
45!!      PARAMETER (NLP=101) ! MUST BE LARGER THAN NLEVEL
46
47      REAL*8 EM, EP, EXPTRM
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)
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)
57      REAL*8 FLUXUP, FLUXDN
58      REAL*8 FACTOR, TAUCUMIN(L_LEVELS), TAUCUM(L_LEVELS)
59
60      integer NAYER, L, K
61      real*8  ubar0in,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
69
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))
88
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      if (abs(ubar0in).gt.1e-2) then
107        ubar0=ubar0in
108      else
109        ubar0 = 1.e-2
110      endif
111
112      BSURF = RSF*UBAR0*F0PI*EXP(-MIN(TAU(L+1),TAUMAX)/UBAR0)
113      ! new definition of BSURF
114      ! the old one was false because it used tau, not tau'
115      ! tau' includes the contribution to the downward flux
116      ! of the radiation scattered in the forward direction
117
118C     WE GO WITH THE QUADRATURE APPROACH HERE.  THE "SQRT(3)" factors
119C     ARE THE UBARV TERM.
120
121      DO L=1,L_NLAYRAD
122
123        ALPHA(L)=SQRT( (1.0-W0(L))/(1.0-W0(L)*COSBAR(L) ) )
124
125C       SET OF CONSTANTS DETERMINED BY DOM
126
127!     Quadrature method
128        G1(L)    = (SQRT(3.0)*0.5)*(2.0- W0(L)*(1.0+COSBAR(L)))
129        G2(L)    = (SQRT(3.0)*W0(L)*0.5)*(1.0-COSBAR(L))
130        G3(L)    = 0.5*(1.0-SQRT(3.0)*COSBAR(L)*UBAR0)
131
132!     ----- some other methods... (RDW) ------
133
134!     Eddington method
135!        G1(L)    =  0.25*(7.0 - W0(L)*(4.0 - 3.0*COSBAR(L)))
136!        G2(L)    = -0.25*(1.0 - W0(L)*(4.0 - 3.0*COSBAR(L)))
137!        G3(L)    =  0.25*(2.0 - 3.0*COSBAR(L)*UBAR0)
138
139!     delta-Eddington method
140!        G1(L)    =  (7.0 - 3.0*g^2 - W0(L)*(4.0 + 3.0*g) + W0(L)*g^2*(4*beta0 + 3*g)) / &
141!                             (4* (1 - g^2*()   ))  0.25*(7.0 - W0(L)*(4.0 - 3.0*COSBAR(L)))
142
143!     Hybrid modified Eddington-delta function method
144
145!     ----------------------------------------
146
147c     So they use Quadrature
148c     but the scaling is Eddington?
149
150        LAMDA(L) = SQRT(G1(L)**2 - G2(L)**2)
151        GAMA(L)  = (G1(L)-LAMDA(L))/G2(L)
152      END DO
153
154
155      DO L=1,L_NLAYRAD
156        G4    = 1.0-G3(L)
157        DENOM = LAMDA(L)**2 - 1./UBAR0**2
158 
159C       THERE IS A POTENTIAL PROBLEM HERE IF W0=0 AND UBARV=UBAR0
160C       THEN DENOM WILL VANISH. THIS ONLY HAPPENS PHYSICALLY WHEN
161C       THE SCATTERING GOES TO ZERO
162C       PREVENT THIS WITH AN IF STATEMENT
163
164        IF ( DENOM .EQ. 0.) THEN
165          DENOM=1.E-10
166        END IF
167
168
169        AM = F0PI*W0(L)*(G4   *(G1(L)+1./UBAR0) +G2(L)*G3(L) )/DENOM
170        AP = F0PI*W0(L)*(G3(L)*(G1(L)-1./UBAR0) +G2(L)*G4    )/DENOM
171
172C       CPM1 AND CMM1 ARE THE CPLUS AND CMINUS TERMS EVALUATED
173C       AT THE TOP OF THE LAYER, THAT IS LOWER   OPTICAL DEPTH TAU(L)
174 
175        CPM1(L) = AP*EXP(-TAU(L)/UBAR0)
176        CMM1(L) = AM*EXP(-TAU(L)/UBAR0)
177
178C       CP AND CM ARE THE CPLUS AND CMINUS TERMS EVALUATED AT THE
179C       BOTTOM OF THE LAYER.  THAT IS AT HIGHER OPTICAL DEPTH TAU(L+1)
180
181        CP(L) = AP*EXP(-TAU(L+1)/UBAR0)
182        CM(L) = AM*EXP(-TAU(L+1)/UBAR0)
183
184      END DO
185
186
187 
188C     NOW CALCULATE THE EXPONENTIAL TERMS NEEDED
189C     FOR THE TRIDIAGONAL ROTATED LAYERED METHOD
190
191      DO L=1,L_NLAYRAD
192        EXPTRM = MIN(TAUMAX,LAMDA(L)*DTAU(L))  ! CLIPPED EXPONENTIAL
193        EP = EXP(EXPTRM)
194
195        EM        = 1.0/EP
196        E1(L)     = EP+GAMA(L)*EM
197        E2(L)     = EP-GAMA(L)*EM
198        E3(L)     = GAMA(L)*EP+EM
199        E4(L)     = GAMA(L)*EP-EM
200      END DO
201
202      CALL DSOLVER(NAYER,GAMA,CP,CM,CPM1,CMM1,E1,E2,E3,E4,BTOP,
203     *             BSURF,RSF,XK1,XK2)
204
205C     NOW WE CALCULATE THE FLUXES AT THE MIDPOINTS OF THE LAYERS.
206 
207      DO L=1,L_NLAYRAD-1
208        EXPTRM = MIN(TAUMAX,LAMDA(L)*(TAUCUM(2*L+1)-TAUCUM(2*L)))
209 
210        EP = EXP(EXPTRM)
211
212        EM    = 1.0/EP
213        G4    = 1.0-G3(L)
214        DENOM = LAMDA(L)**2 - 1./UBAR0**2
215
216C       THERE IS A POTENTIAL PROBLEM HERE IF W0=0 AND UBARV=UBAR0
217C       THEN DENOM WILL VANISH. THIS ONLY HAPPENS PHYSICALLY WHEN
218C       THE SCATTERING GOES TO ZERO
219C       PREVENT THIS WITH A IF STATEMENT
220
221
222        IF ( DENOM .EQ. 0.) THEN
223          DENOM=1.E-10
224        END IF
225
226        AM = F0PI*W0(L)*(G4   *(G1(L)+1./UBAR0) +G2(L)*G3(L) )/DENOM
227        AP = F0PI*W0(L)*(G3(L)*(G1(L)-1./UBAR0) +G2(L)*G4    )/DENOM
228
229C       CPMID AND CMMID  ARE THE CPLUS AND CMINUS TERMS EVALUATED
230C       AT THE MIDDLE OF THE LAYER.
231
232        TAUMID   = TAUCUM(2*L+1)
233
234        CPMID = AP*EXP(-TAUMID/UBAR0)
235        CMMID = AM*EXP(-TAUMID/UBAR0)
236
237        FMIDP(L) = XK1(L)*EP + GAMA(L)*XK2(L)*EM + CPMID
238        FMIDM(L) = XK1(L)*EP*GAMA(L) + XK2(L)*EM + CMMID
239 
240C       ADD THE DIRECT FLUX TO THE DOWNWELLING TERM
241
242        FMIDM(L)= FMIDM(L)+UBAR0*F0PI*EXP(-MIN(TAUMID,TAUMAX)/UBAR0)
243   
244      END DO
245 
246C     FLUX AT THE Ptop layer
247
248!      EP    = 1.0
249!      EM    = 1.0
250C JL18 correction to account for the fact that the radiative top is not at zero optical depth.
251      EXPTRM = MIN(TAUMAX,LAMDA(L)*(TAUCUM(2)))
252      EP = EXP(EXPTRM)
253      EM    = 1.0/EP
254      G4    = 1.0-G3(1)
255      DENOM = LAMDA(1)**2 - 1./UBAR0**2
256
257C     THERE IS A POTENTIAL PROBLEM HERE IF W0=0 AND UBARV=UBAR0
258C     THEN DENOM WILL VANISH. THIS ONLY HAPPENS PHYSICALLY WHEN
259C     THE SCATTERING GOES TO ZERO
260C     PREVENT THIS WITH A IF STATEMENT
261
262      IF ( DENOM .EQ. 0.) THEN
263        DENOM=1.E-10
264      END IF
265
266      AM = F0PI*W0(1)*(G4   *(G1(1)+1./UBAR0) +G2(1)*G3(1) )/DENOM
267      AP = F0PI*W0(1)*(G3(1)*(G1(1)-1./UBAR0) +G2(1)*G4    )/DENOM
268
269C     CPMID AND CMMID  ARE THE CPLUS AND CMINUS TERMS EVALUATED
270C     AT THE MIDDLE OF THE LAYER.
271
272C      CPMID  = AP
273C      CMMID  = AM
274C JL18 correction to account for the fact that the radiative top is not at zero optical depth.
275      TAUMID   = TAUCUM(2)
276      CPMID = AP*EXP(-TAUMID/UBAR0)
277      CMMID = AM*EXP(-TAUMID/UBAR0)
278
279      FLUXUP = XK1(1)*EP + GAMA(1)*XK2(1)*EM + CPMID
280      FLUXDN = XK1(1)*EP*GAMA(1) + XK2(1)*EM + CMMID
281
282C     ADD THE DIRECT FLUX TO THE DOWNWELLING TERM
283
284!      fluxdn = fluxdn+UBAR0*F0PI*EXP(-MIN(TAUCUM(1),TAUMAX)/UBAR0)
285!JL18 the line above assumed that the top of the radiative model was P=0
286!   it seems to be better for the IR to use the middle of the last physical layer as the radiative top.
287!   so we correct the downwelling flux below for the calculation of the heating rate
288      fluxdn = fluxdn+UBAR0*F0PI*EXP(-TAUCUM(2)/UBAR0)
289
290C     This is for the "special" bottom layer, where we take
291C     DTAU instead of DTAU/2.
292
293      L     = L_NLAYRAD
294      EXPTRM = MIN(TAUMAX,LAMDA(L)*(TAUCUM(L_LEVELS)-
295     *                                 TAUCUM(L_LEVELS-1)))
296
297      EP    = EXP(EXPTRM)
298      EM    = 1.0/EP
299      G4    = 1.0-G3(L)
300      DENOM = LAMDA(L)**2 - 1./UBAR0**2
301
302
303C     THERE IS A POTENTIAL PROBLEM HERE IF W0=0 AND UBARV=UBAR0
304C     THEN DENOM WILL VANISH. THIS ONLY HAPPENS PHYSICALLY WHEN
305C     THE SCATTERING GOES TO ZERO
306C     PREVENT THIS WITH A IF STATEMENT
307
308
309      IF ( DENOM .EQ. 0.) THEN
310        DENOM=1.E-10
311      END IF
312
313      AM = F0PI*W0(L)*(G4   *(G1(L)+1./UBAR0) +G2(L)*G3(L) )/DENOM
314      AP = F0PI*W0(L)*(G3(L)*(G1(L)-1./UBAR0) +G2(L)*G4    )/DENOM
315
316C     CPMID AND CMMID  ARE THE CPLUS AND CMINUS TERMS EVALUATED
317C     AT THE MIDDLE OF THE LAYER.
318
319      TAUMID   = MIN(TAUCUM(L_LEVELS),TAUMAX)
320      CPMID    = AP*EXP(-MIN(TAUMID,TAUMAX)/UBAR0)
321      CMMID    = AM*EXP(-MIN(TAUMID,TAUMAX)/UBAR0)
322
323
324      FMIDP(L) = XK1(L)*EP + GAMA(L)*XK2(L)*EM + CPMID
325      FMIDM(L) = XK1(L)*EP*GAMA(L) + XK2(L)*EM + CMMID
326
327C  Save the diffuse downward flux for TEMPGR calculations
328
329      DIFFV = FMIDM(L)
330
331
332C     ADD THE DIRECT FLUX TO THE DOWNWELLING TERM
333
334      FMIDM(L)= FMIDM(L)+UBAR0*F0PI*EXP(-MIN(TAUMID,TAUMAX)/UBAR0)
335
336
337      RETURN
338      END
Note: See TracBrowser for help on using the repository browser.