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

Last change on this file since 1989 was 1988, checked in by jleconte, 6 years ago

28/08/2018 == JL

We now shift the radiative model top from p=0 to the middle of the last physical layer. This is done by changing pmid and plevrad in callcorrk and some corrections need to be done in gfluxv.
This seems to get rid of the aratic temperature behavior in the last two layers of the model (especially on the night side on synchronous planets).
Additional speedup corrections have been made in gfluxi that change nothing to the result.
Finally, if aerosols are present in the last layer we must account for them. Provides better upper boundary condition in the IR. They must however be put to zero in the sw (see optcv and changes in last commit.)
This has been done for water ice in aeropacity, but same correction should probably be done for other aerosol types.

File size: 7.6 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      use comcstfi_mod, only: pi
35
36      implicit none
37
38
39      INTEGER NLL, NLAYER, L, NW, NT, NT2
40      REAL*8  TERM, CPMID, CMMID
41      REAL*8  PLANCK
42      REAL*8  EM,EP
43      REAL*8  COSBAR(L_NLAYRAD), W0(L_NLAYRAD), DTAU(L_NLAYRAD)
44      REAL*8  TAUCUM(L_LEVELS), DTAUK
45      REAL*8  TLEV(L_LEVELS)
46      REAL*8  WAVEN, DW, UBARI, RSF
47      REAL*8  BTOP, BSURF, FMIDP(L_NLAYRAD), FMIDM(L_NLAYRAD)
48      REAL*8  B0(L_NLAYRAD),B1(L_NLAYRAD),ALPHA(L_NLAYRAD)
49      REAL*8  LAMDA(L_NLAYRAD),XK1(L_NLAYRAD),XK2(L_NLAYRAD)
50      REAL*8  GAMA(L_NLAYRAD),CP(L_NLAYRAD),CM(L_NLAYRAD)
51      REAL*8  CPM1(L_NLAYRAD),CMM1(L_NLAYRAD),E1(L_NLAYRAD)
52      REAL*8  E2(L_NLAYRAD),E3(L_NLAYRAD),E4(L_NLAYRAD)
53
54      REAL*8  FTOPUP, FLUXUP, FLUXDN
55
56      real*8 :: TAUMAX = L_TAUMAX
57
58C======================================================================C
59 
60C     WE GO WITH THE HEMISPHERIC CONSTANT APPROACH IN THE INFRARED
61 
62
63      NLAYER = L_NLAYRAD
64
65      DO L=1,L_NLAYRAD-1
66
67!----------------------------------------------------
68! There is a problem when W0 = 1
69!         open(888,file='W0')
70!           if ((W0(L).eq.0.).or.(W0(L).eq.1.)) then
71!             write(888,*) W0(L), L, 'gfluxi'
72!           endif
73! Prevent this with an if statement:
74        if (W0(L).eq.1.D0) then
75           W0(L) = 0.99999D0
76        endif
77!----------------------------------------------------
78
79        ALPHA(L) = SQRT( (1.0D0-W0(L))/(1.0D0-W0(L)*COSBAR(L)) )
80        LAMDA(L) = ALPHA(L)*(1.0D0-W0(L)*COSBAR(L))/UBARI
81
82        NT    = int(TLEV(2*L)*NTfac)   - NTstar+1
83        NT2   = int(TLEV(2*L+2)*NTfac) - NTstar+1
84
85        B1(L) = (PLANCKIR(NW,NT2)-PLANCKIR(NW,NT))/DTAU(L)
86        B0(L) = PLANCKIR(NW,NT)
87      END DO
88
89C     Take care of special lower layer
90
91      L        = L_NLAYRAD
92
93      if (W0(L).eq.1.) then
94          W0(L) = 0.99999D0
95      end if
96
97      ALPHA(L) = SQRT( (1.0D0-W0(L))/(1.0D0-W0(L)*COSBAR(L)) )
98      LAMDA(L) = ALPHA(L)*(1.0D0-W0(L)*COSBAR(L))/UBARI
99
100      ! Tsurf is used for 1st layer source function
101      ! -- same results for most thin atmospheres
102      ! -- and stabilizes integrations
103      NT    = int(TLEV(2*L+1)*NTfac) - NTstar+1
104      !! For deep, opaque, thick first layers (e.g. Saturn)
105      !! what is below works much better, not unstable, ...
106      !! ... and actually fully accurate because 1st layer temp (JL)
107      !NT    = int(TLEV(2*L)*NTfac) - NTstar+1
108      !! (or this one yields same results
109      !NT    = int( (TLEV(2*L)+TLEV(2*L+1))*0.5*NTfac ) - NTstar+1
110
111      NT2   = int(TLEV(2*L)*NTfac)   - NTstar+1
112      B1(L) = (PLANCKIR(NW,NT)-PLANCKIR(NW,NT2))/DTAU(L)
113      B0(L) = PLANCKIR(NW,NT2)
114
115      DO L=1,L_NLAYRAD
116        GAMA(L) = (1.0D0-ALPHA(L))/(1.0D0+ALPHA(L))
117        TERM    = UBARI/(1.0D0-W0(L)*COSBAR(L))
118
119
120C       CPM1 AND CMM1 ARE THE CPLUS AND CMINUS TERMS EVALUATED
121C       AT THE TOP OF THE LAYER, THAT IS ZERO OPTICAL DEPTH
122
123        CPM1(L) = B0(L)+B1(L)*TERM
124        CMM1(L) = B0(L)-B1(L)*TERM
125
126C       CP AND CM ARE THE CPLUS AND CMINUS TERMS EVALUATED AT THE
127C       BOTTOM OF THE LAYER.  THAT IS AT DTAU OPTICAL DEPTH.
128C       JL18 put CP and CM after the calculation of CPM1 and CMM1 to avoid unecessary calculations.
129
130        CP(L) = CPM1(L) +B1(L)*DTAU(L)
131        CM(L) = CMM1(L) +B1(L)*DTAU(L)
132      END DO
133 
134C     NOW CALCULATE THE EXPONENTIAL TERMS NEEDED
135C     FOR THE TRIDIAGONAL ROTATED LAYERED METHOD
136C     WARNING IF DTAU(J) IS GREATER THAN ABOUT 35 (VAX)
137C     WE CLIP IT TO AVOID OVERFLOW.
138
139      DO L=1,L_NLAYRAD
140
141C       CLIP THE EXPONENTIAL HERE.
142
143        EP    = EXP( MIN((LAMDA(L)*DTAU(L)),TAUMAX))
144        EM    = 1.0D0/EP
145        E1(L) = EP+GAMA(L)*EM
146        E2(L) = EP-GAMA(L)*EM
147        E3(L) = GAMA(L)*EP+EM
148        E4(L) = GAMA(L)*EP-EM
149      END DO
150 
151c     B81=BTOP  ! RENAME BEFORE CALLING DSOLVER - used to be to set
152c     B82=BSURF ! them to real*8 - but now everything is real*8
153c     R81=RSF   ! so this may not be necessary
154
155C     Double precision tridiagonal solver
156
157      CALL DSOLVER(NLAYER,GAMA,CP,CM,CPM1,CMM1,E1,E2,E3,E4,BTOP,
158     *             BSURF,RSF,XK1,XK2)
159 
160
161C     NOW WE CALCULATE THE FLUXES AT THE MIDPOINTS OF THE LAYERS.
162 
163      DO L=1,L_NLAYRAD-1
164        DTAUK = TAUCUM(2*L+1)-TAUCUM(2*L)
165        EP    = EXP(MIN(LAMDA(L)*DTAUK,TAUMAX)) ! CLIPPED EXPONENTIAL
166        EM    = 1.0D0/EP
167        TERM  = UBARI/(1.D0-W0(L)*COSBAR(L))
168
169C       CP AND CM ARE THE CPLUS AND CMINUS TERMS EVALUATED AT THE
170C       BOTTOM OF THE LAYER.  THAT IS AT DTAU  OPTICAL DEPTH
171
172        CPMID    = B0(L)+B1(L)*DTAUK +B1(L)*TERM
173        CMMID    = B0(L)+B1(L)*DTAUK -B1(L)*TERM
174        FMIDP(L) = XK1(L)*EP + GAMA(L)*XK2(L)*EM + CPMID
175        FMIDM(L) = XK1(L)*EP*GAMA(L) + XK2(L)*EM + CMMID
176
177C       FOR FLUX WE INTEGRATE OVER THE HEMISPHERE TREATING INTENSITY CONSTANT
178
179        FMIDP(L) = FMIDP(L)*PI
180        FMIDM(L) = FMIDM(L)*PI
181      END DO
182 
183C     And now, for the special bottom layer
184
185      L    = L_NLAYRAD
186
187      EP   = EXP(MIN((LAMDA(L)*DTAU(L)),TAUMAX)) ! CLIPPED EXPONENTIAL
188      EM   = 1.0D0/EP
189      TERM = UBARI/(1.D0-W0(L)*COSBAR(L))
190
191C     CP AND CM ARE THE CPLUS AND CMINUS TERMS EVALUATED AT THE
192C     BOTTOM OF THE LAYER.  THAT IS AT DTAU  OPTICAL DEPTH
193
194      CPMID    = B0(L)+B1(L)*DTAU(L) +B1(L)*TERM
195      CMMID    = B0(L)+B1(L)*DTAU(L) -B1(L)*TERM
196      FMIDP(L) = XK1(L)*EP + GAMA(L)*XK2(L)*EM + CPMID
197      FMIDM(L) = XK1(L)*EP*GAMA(L) + XK2(L)*EM + CMMID
198 
199C     FOR FLUX WE INTEGRATE OVER THE HEMISPHERE TREATING INTENSITY CONSTANT
200
201      FMIDP(L) = FMIDP(L)*PI
202      FMIDM(L) = FMIDM(L)*PI
203
204C     FLUX AT THE PTOP LEVEL
205
206      EP   = 1.0D0
207      EM   = 1.0D0
208      TERM = UBARI/(1.0D0-W0(1)*COSBAR(1))
209
210C     CP AND CM ARE THE CPLUS AND CMINUS TERMS EVALUATED AT THE
211C     BOTTOM OF THE LAYER.  THAT IS AT DTAU  OPTICAL DEPTH
212
213      CPMID  = B0(1)+B1(1)*TERM
214      CMMID  = B0(1)-B1(1)*TERM
215
216      FLUXUP = XK1(1)*EP + GAMA(1)*XK2(1)*EM + CPMID
217      FLUXDN = XK1(1)*EP*GAMA(1) + XK2(1)*EM + CMMID
218 
219C     FOR FLUX WE INTEGRATE OVER THE HEMISPHERE TREATING INTENSITY CONSTANT
220
221      FTOPUP = (FLUXUP-FLUXDN)*PI
222
223
224      RETURN
225      END
Note: See TracBrowser for help on using the repository browser.