source: trunk/LMDZ.GENERIC/libf/phystd/gfluxi.F @ 1309

Last change on this file since 1309 was 1146, checked in by aslmd, 11 years ago

LMDZ.GENERIC. error prev commit: committed gfluxi with Saturn trick. reversed back.

File size: 7.5 KB
Line 
1      SUBROUTINE GFLUXI(NLL,TLEV,NW,DW,DTAU,TAUCUM,W0,COSBAR,UBARI,
2     *                  RSF,BTOP,BSURF,FTOPUP,FMIDP,FMIDM)
3
4C  THIS SUBROUTINE TAKES THE OPTICAL CONSTANTS AND BOUNDARY CONDITIONS
5C  FOR THE INFRARED FLUX AT ONE WAVELENGTH AND SOLVES FOR THE FLUXES AT
6C  THE LEVELS. THIS VERSION IS SET UP TO WORK WITH LAYER OPTICAL DEPTHS
7C  MEASURED FROM THE TOP OF EACH LAYER.  THE TOP OF EACH LAYER HAS 
8C  OPTICAL DEPTH ZERO.  IN THIS SUB LEVEL N IS ABOVE LAYER N. THAT IS LAYER N
9C  HAS LEVEL N ON TOP AND LEVEL N+1 ON BOTTOM. OPTICAL DEPTH INCREASES
10C  FROM TOP TO BOTTOM. SEE C.P. MCKAY, TGM NOTES.
11C THE TRI-DIAGONAL MATRIX SOLVER IS DSOLVER AND IS DOUBLE PRECISION SO MANY
12C VARIABLES ARE PASSED AS SINGLE THEN BECOME DOUBLE IN DSOLVER
13C
14C NLL            = NUMBER OF LEVELS (NLAYERS + 1) MUST BE LESS THAT NL (101)
15C TLEV(L_LEVELS) = ARRAY OF TEMPERATURES AT GCM LEVELS
16C WAVEN          = WAVELENGTH FOR THE COMPUTATION
17C DW             = WAVENUMBER INTERVAL
18C DTAU(NLAYER)   = ARRAY OPTICAL DEPTH OF THE LAYERS
19C W0(NLEVEL)     = SINGLE SCATTERING ALBEDO
20C COSBAR(NLEVEL) = ASYMMETRY FACTORS, 0=ISOTROPIC
21C UBARI          = AVERAGE ANGLE, MUST BE EQUAL TO 0.5 IN IR
22C RSF            = SURFACE REFLECTANCE
23C BTOP           = UPPER BOUNDARY CONDITION ON IR INTENSITY (NOT FLUX)
24C BSURF          = SURFACE EMISSION = (1-RSFI)*PLANCK, INTENSITY (NOT FLUX)
25C FP(NLEVEL)     = UPWARD FLUX AT LEVELS
26C FM(NLEVEL)     = DOWNWARD FLUX AT LEVELS
27C FMIDP(NLAYER)  = UPWARD FLUX AT LAYER MIDPOINTS
28C FMIDM(NLAYER)  = DOWNWARD FLUX AT LAYER MIDPOINTS
29C
30C----------------------------------------------------------------------C
31
32      use radinc_h
33      use radcommon_h, only: planckir
34
35      implicit none
36
37#include "comcstfi.h"
38
39      INTEGER NLP
40      PARAMETER (NLP=101) ! MUST BE LARGER THAN NLEVEL
41
42      INTEGER NLL, NLAYER, L, NW, NT, NT2
43      REAL*8  TERM, CPMID, CMMID
44      REAL*8  PLANCK
45      REAL*8  EM,EP
46      REAL*8  COSBAR(L_NLAYRAD), W0(L_NLAYRAD), DTAU(L_NLAYRAD)
47      REAL*8  TAUCUM(L_LEVELS), DTAUK
48      REAL*8  TLEV(L_LEVELS)
49      REAL*8  WAVEN, DW, UBARI, RSF
50      REAL*8  BTOP, BSURF, FMIDP(L_NLAYRAD), FMIDM(L_NLAYRAD)
51      REAL*8  B0(NLP),B1(NLP),ALPHA(NLP),LAMDA(NLP),XK1(NLP),XK2(NLP)
52      REAL*8  GAMA(NLP),CP(NLP),CM(NLP),CPM1(NLP),CMM1(NLP),E1(NLP)
53      REAL*8  E2(NLP),E3(NLP),E4(NLP)
54
55      REAL*8  FTOPUP, FLUXUP, FLUXDN
56
57      real*8 :: TAUMAX = L_TAUMAX
58
59C======================================================================C
60 
61C     WE GO WITH THE HEMISPHERIC CONSTANT APPROACH IN THE INFRARED
62 
63
64      IF (NLL .GT. NLP) STOP 'PARAMETER NL TOO SMALL IN GFLUXI'
65
66      NLAYER = L_NLAYRAD
67
68      DO L=1,L_NLAYRAD-1
69
70!----------------------------------------------------
71! There is a problem when W0 = 1
72!         open(888,file='W0')
73!           if ((W0(L).eq.0.).or.(W0(L).eq.1.)) then
74!             write(888,*) W0(L), L, 'gfluxi'
75!           endif
76! Prevent this with an if statement:
77        if (W0(L).eq.1.D0) then
78           W0(L) = 0.99999D0
79        endif
80!----------------------------------------------------
81
82        ALPHA(L) = SQRT( (1.0D0-W0(L))/(1.0D0-W0(L)*COSBAR(L)) )
83        LAMDA(L) = ALPHA(L)*(1.0D0-W0(L)*COSBAR(L))/UBARI
84
85        NT    = int(TLEV(2*L)*NTfac)   - NTstar+1
86        NT2   = int(TLEV(2*L+2)*NTfac) - NTstar+1
87
88        B1(L) = (PLANCKIR(NW,NT2)-PLANCKIR(NW,NT))/DTAU(L)
89        B0(L) = PLANCKIR(NW,NT)
90      END DO
91
92C     Take care of special lower layer
93
94      L        = L_NLAYRAD
95
96      if (W0(L).eq.1.) then
97          W0(L) = 0.99999D0
98      end if
99
100      ALPHA(L) = SQRT( (1.0D0-W0(L))/(1.0D0-W0(L)*COSBAR(L)) )
101      LAMDA(L) = ALPHA(L)*(1.0D0-W0(L)*COSBAR(L))/UBARI
102
103      ! Tsurf is used for 1st layer source function
104      ! -- same results for most thin atmospheres
105      ! -- and stabilizes integrations
106      NT    = int(TLEV(2*L+1)*NTfac) - NTstar+1
107      !! For deep, opaque, thick first layers (e.g. Saturn)
108      !! what is below works much better, not unstable, ...
109      !! ... and actually fully accurate because 1st layer temp (JL)
110      !NT    = int(TLEV(2*L)*NTfac) - NTstar+1
111      !! (or this one yields same results
112      !NT    = int( (TLEV(2*L)+TLEV(2*L+1))*0.5*NTfac ) - NTstar+1
113
114      NT2   = int(TLEV(2*L)*NTfac)   - NTstar+1
115      B1(L) = (PLANCKIR(NW,NT)-PLANCKIR(NW,NT2))/DTAU(L)
116      B0(L) = PLANCKIR(NW,NT2)
117
118      DO L=1,L_NLAYRAD
119        GAMA(L) = (1.0D0-ALPHA(L))/(1.0D0+ALPHA(L))
120        TERM    = UBARI/(1.0D0-W0(L)*COSBAR(L))
121
122C       CP AND CM ARE THE CPLUS AND CMINUS TERMS EVALUATED AT THE
123C       BOTTOM OF THE LAYER.  THAT IS AT DTAU OPTICAL DEPTH
124
125        CP(L) = B0(L)+B1(L)*DTAU(L) +B1(L)*TERM
126        CM(L) = B0(L)+B1(L)*DTAU(L) -B1(L)*TERM
127
128C       CPM1 AND CMM1 ARE THE CPLUS AND CMINUS TERMS EVALUATED
129C       AT THE TOP OF THE LAYER, THAT IS ZERO OPTICAL DEPTH
130
131        CPM1(L) = B0(L)+B1(L)*TERM
132        CMM1(L) = B0(L)-B1(L)*TERM
133      END DO
134 
135C     NOW CALCULATE THE EXPONENTIAL TERMS NEEDED
136C     FOR THE TRIDIAGONAL ROTATED LAYERED METHOD
137C     WARNING IF DTAU(J) IS GREATER THAN ABOUT 35 (VAX)
138C     WE CLIP IT TO AVOID OVERFLOW.
139
140      DO L=1,L_NLAYRAD
141
142C       CLIP THE EXPONENTIAL HERE.
143
144        EP    = EXP( MIN((LAMDA(L)*DTAU(L)),TAUMAX))
145        EM    = 1.0D0/EP
146        E1(L) = EP+GAMA(L)*EM
147        E2(L) = EP-GAMA(L)*EM
148        E3(L) = GAMA(L)*EP+EM
149        E4(L) = GAMA(L)*EP-EM
150      END DO
151 
152c     B81=BTOP  ! RENAME BEFORE CALLING DSOLVER - used to be to set
153c     B82=BSURF ! them to real*8 - but now everything is real*8
154c     R81=RSF   ! so this may not be necessary
155
156C     Double precision tridiagonal solver
157
158      CALL DSOLVER(NLAYER,GAMA,CP,CM,CPM1,CMM1,E1,E2,E3,E4,BTOP,
159     *             BSURF,RSF,XK1,XK2)
160 
161
162C     NOW WE CALCULATE THE FLUXES AT THE MIDPOINTS OF THE LAYERS.
163 
164      DO L=1,L_NLAYRAD-1
165        DTAUK = TAUCUM(2*L+1)-TAUCUM(2*L)
166        EP    = EXP(MIN(LAMDA(L)*DTAUK,TAUMAX)) ! CLIPPED EXPONENTIAL
167        EM    = 1.0D0/EP
168        TERM  = UBARI/(1.D0-W0(L)*COSBAR(L))
169
170C       CP AND CM ARE THE CPLUS AND CMINUS TERMS EVALUATED AT THE
171C       BOTTOM OF THE LAYER.  THAT IS AT DTAU  OPTICAL DEPTH
172
173        CPMID    = B0(L)+B1(L)*DTAUK +B1(L)*TERM
174        CMMID    = B0(L)+B1(L)*DTAUK -B1(L)*TERM
175        FMIDP(L) = XK1(L)*EP + GAMA(L)*XK2(L)*EM + CPMID
176        FMIDM(L) = XK1(L)*EP*GAMA(L) + XK2(L)*EM + CMMID
177
178C       FOR FLUX WE INTEGRATE OVER THE HEMISPHERE TREATING INTENSITY CONSTANT
179
180        FMIDP(L) = FMIDP(L)*PI
181        FMIDM(L) = FMIDM(L)*PI
182      END DO
183 
184C     And now, for the special bottom layer
185
186      L    = L_NLAYRAD
187
188      EP   = EXP(MIN((LAMDA(L)*DTAU(L)),TAUMAX)) ! CLIPPED EXPONENTIAL
189      EM   = 1.0D0/EP
190      TERM = UBARI/(1.D0-W0(L)*COSBAR(L))
191
192C     CP AND CM ARE THE CPLUS AND CMINUS TERMS EVALUATED AT THE
193C     BOTTOM OF THE LAYER.  THAT IS AT DTAU  OPTICAL DEPTH
194
195      CPMID    = B0(L)+B1(L)*DTAU(L) +B1(L)*TERM
196      CMMID    = B0(L)+B1(L)*DTAU(L) -B1(L)*TERM
197      FMIDP(L) = XK1(L)*EP + GAMA(L)*XK2(L)*EM + CPMID
198      FMIDM(L) = XK1(L)*EP*GAMA(L) + XK2(L)*EM + CMMID
199 
200C     FOR FLUX WE INTEGRATE OVER THE HEMISPHERE TREATING INTENSITY CONSTANT
201
202      FMIDP(L) = FMIDP(L)*PI
203      FMIDM(L) = FMIDM(L)*PI
204
205C     FLUX AT THE PTOP LEVEL
206
207      EP   = 1.0D0
208      EM   = 1.0D0
209      TERM = UBARI/(1.0D0-W0(1)*COSBAR(1))
210
211C     CP AND CM ARE THE CPLUS AND CMINUS TERMS EVALUATED AT THE
212C     BOTTOM OF THE LAYER.  THAT IS AT DTAU  OPTICAL DEPTH
213
214      CPMID  = B0(1)+B1(1)*TERM
215      CMMID  = B0(1)-B1(1)*TERM
216
217      FLUXUP = XK1(1)*EP + GAMA(1)*XK2(1)*EM + CPMID
218      FLUXDN = XK1(1)*EP*GAMA(1) + XK2(1)*EM + CMMID
219 
220C     FOR FLUX WE INTEGRATE OVER THE HEMISPHERE TREATING INTENSITY CONSTANT
221
222      FTOPUP = (FLUXUP-FLUXDN)*PI
223
224
225      RETURN
226      END
Note: See TracBrowser for help on using the repository browser.