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

Last change on this file since 989 was 961, checked in by jleconte, 12 years ago

15/05/2013 == JL

  • correction in radiative scheme to enforce double precision
  • corrects calculation of ISR
File size: 7.0 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      NT    = int(TLEV(2*L+1)*NTfac) - NTstar+1
104      NT2   = int(TLEV(2*L)*NTfac)   - NTstar+1
105      B1(L) = (PLANCKIR(NW,NT)-PLANCKIR(NW,NT2))/DTAU(L)
106      B0(L) = PLANCKIR(NW,NT2)
107
108      DO L=1,L_NLAYRAD
109        GAMA(L) = (1.0D0-ALPHA(L))/(1.0D0+ALPHA(L))
110        TERM    = UBARI/(1.0D0-W0(L)*COSBAR(L))
111
112C       CP AND CM ARE THE CPLUS AND CMINUS TERMS EVALUATED AT THE
113C       BOTTOM OF THE LAYER.  THAT IS AT DTAU OPTICAL DEPTH
114
115        CP(L) = B0(L)+B1(L)*DTAU(L) +B1(L)*TERM
116        CM(L) = B0(L)+B1(L)*DTAU(L) -B1(L)*TERM
117
118C       CPM1 AND CMM1 ARE THE CPLUS AND CMINUS TERMS EVALUATED
119C       AT THE TOP OF THE LAYER, THAT IS ZERO OPTICAL DEPTH
120
121        CPM1(L) = B0(L)+B1(L)*TERM
122        CMM1(L) = B0(L)-B1(L)*TERM
123      END DO
124 
125C     NOW CALCULATE THE EXPONENTIAL TERMS NEEDED
126C     FOR THE TRIDIAGONAL ROTATED LAYERED METHOD
127C     WARNING IF DTAU(J) IS GREATER THAN ABOUT 35 (VAX)
128C     WE CLIP IT TO AVOID OVERFLOW.
129
130      DO L=1,L_NLAYRAD
131
132C       CLIP THE EXPONENTIAL HERE.
133
134        EP    = EXP( MIN((LAMDA(L)*DTAU(L)),TAUMAX))
135        EM    = 1.0D0/EP
136        E1(L) = EP+GAMA(L)*EM
137        E2(L) = EP-GAMA(L)*EM
138        E3(L) = GAMA(L)*EP+EM
139        E4(L) = GAMA(L)*EP-EM
140      END DO
141 
142c     B81=BTOP  ! RENAME BEFORE CALLING DSOLVER - used to be to set
143c     B82=BSURF ! them to real*8 - but now everything is real*8
144c     R81=RSF   ! so this may not be necessary
145
146C     Double precision tridiagonal solver
147
148      CALL DSOLVER(NLAYER,GAMA,CP,CM,CPM1,CMM1,E1,E2,E3,E4,BTOP,
149     *             BSURF,RSF,XK1,XK2)
150 
151
152C     NOW WE CALCULATE THE FLUXES AT THE MIDPOINTS OF THE LAYERS.
153 
154      DO L=1,L_NLAYRAD-1
155        DTAUK = TAUCUM(2*L+1)-TAUCUM(2*L)
156        EP    = EXP(MIN(LAMDA(L)*DTAUK,TAUMAX)) ! CLIPPED EXPONENTIAL
157        EM    = 1.0D0/EP
158        TERM  = UBARI/(1.D0-W0(L)*COSBAR(L))
159
160C       CP AND CM ARE THE CPLUS AND CMINUS TERMS EVALUATED AT THE
161C       BOTTOM OF THE LAYER.  THAT IS AT DTAU  OPTICAL DEPTH
162
163        CPMID    = B0(L)+B1(L)*DTAUK +B1(L)*TERM
164        CMMID    = B0(L)+B1(L)*DTAUK -B1(L)*TERM
165        FMIDP(L) = XK1(L)*EP + GAMA(L)*XK2(L)*EM + CPMID
166        FMIDM(L) = XK1(L)*EP*GAMA(L) + XK2(L)*EM + CMMID
167
168C       FOR FLUX WE INTEGRATE OVER THE HEMISPHERE TREATING INTENSITY CONSTANT
169
170        FMIDP(L) = FMIDP(L)*PI
171        FMIDM(L) = FMIDM(L)*PI
172      END DO
173 
174C     And now, for the special bottom layer
175
176      L    = L_NLAYRAD
177
178      EP   = EXP(MIN((LAMDA(L)*DTAU(L)),TAUMAX)) ! CLIPPED EXPONENTIAL
179      EM   = 1.0D0/EP
180      TERM = UBARI/(1.D0-W0(L)*COSBAR(L))
181
182C     CP AND CM ARE THE CPLUS AND CMINUS TERMS EVALUATED AT THE
183C     BOTTOM OF THE LAYER.  THAT IS AT DTAU  OPTICAL DEPTH
184
185      CPMID    = B0(L)+B1(L)*DTAU(L) +B1(L)*TERM
186      CMMID    = B0(L)+B1(L)*DTAU(L) -B1(L)*TERM
187      FMIDP(L) = XK1(L)*EP + GAMA(L)*XK2(L)*EM + CPMID
188      FMIDM(L) = XK1(L)*EP*GAMA(L) + XK2(L)*EM + CMMID
189 
190C     FOR FLUX WE INTEGRATE OVER THE HEMISPHERE TREATING INTENSITY CONSTANT
191
192      FMIDP(L) = FMIDP(L)*PI
193      FMIDM(L) = FMIDM(L)*PI
194
195C     FLUX AT THE PTOP LEVEL
196
197      EP   = 1.0D0
198      EM   = 1.0D0
199      TERM = UBARI/(1.0D0-W0(1)*COSBAR(1))
200
201C     CP AND CM ARE THE CPLUS AND CMINUS TERMS EVALUATED AT THE
202C     BOTTOM OF THE LAYER.  THAT IS AT DTAU  OPTICAL DEPTH
203
204      CPMID  = B0(1)+B1(1)*TERM
205      CMMID  = B0(1)-B1(1)*TERM
206
207      FLUXUP = XK1(1)*EP + GAMA(1)*XK2(1)*EM + CPMID
208      FLUXDN = XK1(1)*EP*GAMA(1) + XK2(1)*EM + CMMID
209 
210C     FOR FLUX WE INTEGRATE OVER THE HEMISPHERE TREATING INTENSITY CONSTANT
211
212      FTOPUP = (FLUXUP-FLUXDN)*PI
213
214
215      RETURN
216      END
Note: See TracBrowser for help on using the repository browser.