source: codes/icosagcm/branches/SATURN_DYNAMICO/LMDZ.COMMON/libf/phystd/gfluxi.F

Last change on this file was 313, checked in by ymipsl, 10 years ago
  • implement splitting of XIOS file for lmdz physics
  • Termination is done properly in parallel by calling MPI_ABORT instead of abort or stop

YM

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