source: trunk/LMDZ.MARS/libf/phymars/swr_toon.F @ 3727

Last change on this file since 3727 was 3727, checked in by emillour, 2 months ago

Mars PCM:
Code tidying: put routines in modules, remove useless "return" statements and
remove obsolete and unused scopyi.F
EM

File size: 17.9 KB
Line 
1      module swr_toon_mod
2     
3      implicit none
4     
5      contains
6     
7      SUBROUTINE SWR_TOON ( KDLON, KFLEV, KNU
8     S     ,  aerosol,QVISsQREF3d,omegaVIS3d,gVIS3d
9     &     ,  albedo,PDSIG,PPSOL,PRMU,PSEC
10     S     ,  PFD,PFU )
11
12      use dimradmars_mod, only: sunfr, ndlo2, nsun, nflev,
13     &                          ndlon, naerkind
14      use yomlw_h, only: nlaylte
15      use callkeys_mod, only: rayleigh
16     
17      IMPLICIT NONE
18C     
19C     
20C   SWR - Continuum scattering computations
21C     
22C     PURPOSE.
23C     --------
24C     Computes the reflectivity and transmissivity in case oF
25C     Continuum scattering
26c     F. Forget (1999)
27c   
28c     Modified by Tran The Trung, using radiative transfer code
29c     of Toon 1981. 
30C     
31C     IMPLICIT ARGUMENTS :
32C     --------------------
33C     
34C     ==== INPUTS ===
35c
36c    KDLON :  number of horizontal grid points
37c    KFLEV :  number of vertical layers
38c    KNU   :   Solar band # (1 or 2)
39c   aerosol               aerosol extinction optical depth
40c                         at reference wavelength "longrefvis" set
41c                         in dimradmars_mod , in each layer, for one of
42c                         the "naerkind" kind of aerosol optical properties.
43c    albedo   hemispheric surface albedo
44c                         albedo (i,1) : mean albedo for solar band#1
45c                                        (see below)
46c                         albedo (i,2) : mean albedo for solar band#2
47c                                        (see below)
48c    PDSIG      layer thickness in sigma coordinates
49c    PPSOL       Surface pressure (Pa)
50c    PRMU:  cos of solar zenith angle (=1 when sun at zenith)
51c           (CORRECTED for high zenith angle (atmosphere), unlike mu0)
52c    PSEC   =1./PRMU
53
54C     ==== OUTPUTS ===
55c
56c    PFD : downward flux in spectral band #INU in a given mesh
57c         (normalized to the total incident flux at the top of the atmosphere)
58c    PFU : upward flux in specatral band #INU in a given mesh
59c         (normalized to the total incident flux at the top of the atmosphere)
60C
61C     
62C     METHOD.
63C     -------
64C     
65C     Computes continuum fluxes corresponding to aerosoL
66C     Or/and rayleigh scattering (no molecular gas absorption)
67C     
68C-----------------------------------------------------------------------
69C     
70C     
71C-----------------------------------------------------------------------
72C     
73     
74C     ARGUMENTS
75C     ---------
76      INTEGER KDLON, KFLEV, KNU
77      REAL aerosol(NDLO2,KFLEV,naerkind), albedo(NDLO2,2),
78     S     PDSIG(NDLO2,KFLEV),PSEC(NDLO2)
79
80      REAL QVISsQREF3d(NDLO2,KFLEV,nsun,naerkind) 
81      REAL omegaVIS3d(NDLO2,KFLEV,nsun,naerkind)   
82      REAL gVIS3d(NDLO2,KFLEV,nsun,naerkind)
83
84      REAL PPSOL(NDLO2)
85      REAL PFD(NDLO2,KFLEV+1),PFU(NDLO2,KFLEV+1)
86      REAL PRMU(NDLO2)
87
88C     LOCAL ARRAYS
89C     ------------
90 
91      INTEGER jk,jl,jae
92      REAL ZTRAY, ZRATIO,ZGAR, ZFF
93      REAL ZCGAZ(NDLO2,NFLEV),ZPIZAZ(NDLO2,NFLEV),ZTAUAZ(NDLO2,NFLEV)
94      REAL  ZRAYL(NDLON)
95
96c     Part added by Tran The Trung
97c     inputs to gfluxv
98      REAL*8 DTDEL(nlaylte), WDEL(nlaylte), CDEL(nlaylte)
99c     outputs of gfluxv
100      REAL*8 FP(nlaylte+1), FM(nlaylte+1)     
101c     normalization of top downward flux
102      REAL*8 norm
103c     End part added by Tran The Trung
104
105c     Function
106c     --------
107      real CVMGT
108
109c Computing TOTAL single scattering parameters by adding
110c  properties of all the NAERKIND kind of aerosols
111
112      DO JK = 1 , nlaylte
113         DO  JL = 1 , KDLON
114            ZCGAZ(JL,JK) = 0.
115            ZPIZAZ(JL,JK) =  0.
116            ZTAUAZ(JL,JK) = 0.
117         END DO
118         DO 106 JAE=1,naerkind
119            DO 105 JL = 1 , KDLON
120c              Mean Extinction optical depth in the spectral band
121c              ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
122               ZTAUAZ(JL,JK)=ZTAUAZ(JL,JK)
123     S              +aerosol(JL,JK,JAE)*QVISsQREF3d(JL,JK,KNU,JAE)
124c              Single scattering albedo
125c              ~~~~~~~~~~~~~~~~~~~~~~~~
126               ZPIZAZ(JL,JK)=ZPIZAZ(JL,JK)+aerosol(JL,JK,JAE)*
127     S           QVISsQREF3d(JL,JK,KNU,JAE)*
128     &           omegaVIS3d(JL,JK,KNU,JAE)
129c              Assymetry factor
130c              ~~~~~~~~~~~~~~~~
131               ZCGAZ(JL,JK) =  ZCGAZ(JL,JK) +aerosol(JL,JK,JAE)*
132     S           QVISsQREF3d(JL,JK,KNU,JAE)*
133     &           omegaVIS3d(JL,JK,KNU,JAE)*gVIS3d(JL,JK,KNU,JAE)
134 105        CONTINUE
135 106     CONTINUE
136      END DO
137C     
138      DO JK = 1 , nlaylte
139         DO JL = 1 , KDLON
140            ZCGAZ(JL,JK) = CVMGT( 0., ZCGAZ(JL,JK) / ZPIZAZ(JL,JK),
141     S            (ZPIZAZ(JL,JK).EQ.0) )
142            ZPIZAZ(JL,JK) = CVMGT( 1., ZPIZAZ(JL,JK) / ZTAUAZ(JL,JK),
143     S           (ZTAUAZ(JL,JK).EQ.0) )
144         END DO
145      END DO
146
147C     --------------------------------
148C     INCLUDING RAYLEIGH SCATERRING
149C     -------------------------------
150      if (rayleigh) then
151
152        call swrayleigh(kdlon,knu,ppsol,prmu,ZRAYL)
153
154c       Modifying mean aerosol parameters to account rayleigh scat by gas:
155
156        DO JK = 1 , nlaylte
157           DO JL = 1 , KDLON
158c             Rayleigh opacity in each layer :
159              ZTRAY = ZRAYL(JL) * PDSIG(JL,JK)
160c             ratio Tau(rayleigh) / Tau (total)
161              ZRATIO = ZTRAY / (ZTRAY + ZTAUAZ(JL,JK))
162              ZGAR = ZCGAZ(JL,JK)
163              ZFF = ZGAR * ZGAR
164                ZTAUAZ(JL,JK)=ZTRAY+ZTAUAZ(JL,JK)*(1.-ZPIZAZ(JL,JK)*ZFF)
165              ZCGAZ(JL,JK) = ZGAR * (1. - ZRATIO) / (1. + ZGAR)
166              ZPIZAZ(JL,JK) =ZRATIO+(1.-ZRATIO)*ZPIZAZ(JL,JK)*(1.-ZFF)
167     S           / (1. -ZPIZAZ(JL,JK) * ZFF)
168           END DO
169        END DO
170      end if
171
172c     Part added by Tran The Trung
173c     new radiative transfer
174
175      do JL = 1, KDLON
176
177c     assign temporary inputs
178        do JK = 1, nlaylte
179           jae = nlaylte+1-JK
180           DTDEL(JK) = real(ZTAUAZ(JL,jae),8)
181           WDEL(JK) = real(ZPIZAZ(JL,jae),8)
182           CDEL(JK) = real(ZCGAZ(JL,jae),8)
183        end do
184
185c     call gfluxv
186        call gfluxv(nlaylte, DTDEL,WDEL,CDEL,
187     S              real(PRMU(JL),8),
188     S              real(albedo(JL,KNU),8),
189     S              FP,FM)
190
191c     assign output
192        norm = FM(1)
193c     here we can have a check of norm not being 0.0
194c     however it would never happen in practice,
195c     so we can comment out
196c        if (norm .gt. 0.0) then
197          do JK = 1, nlaylte+1
198             jae = nlaylte+2-JK
199             PFU(JL,JK) = sunfr(KNU)*real(FP(jae)/norm,4)
200             PFD(JL,JK) = sunfr(KNU)*real(FM(jae)/norm,4)
201          end do
202c        elseif (norm .eq. 0.0) then
203c          do JK = 1, nlaylte+1
204c             PFU(JL,JK) = 0.0
205c             PFD(JL,JK) = 0.0
206c          end do
207c        else
208c          stop "Error: top downward visible flux is negative!"
209c        end if
210 
211      end do
212c     End part added by Tran The Trung
213
214      END SUBROUTINE SWR_TOON
215
216CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
217
218      SUBROUTINE GFLUXV(NAYER,DTDEL,WDEL,CDEL,UBAR0,RSF
219     &                 ,FP,FM)
220      IMPLICIT NONE
221C  THIS SUBROUTINE TAKES THE OPTICAL CONSTANTS AND BOUNDARY CONDITONS
222C  FOR THE VISIBLE  FLUX AT ONE WAVELENGTH AND SOLVES FOR THE FLUXES AT
223C  THE LEVELS. THIS VERSION IS SET UP TO WORK WITH LAYER OPTICAL DEPTHS
224C  MEASURED FROM THE TOP OF EACH LAYER.  (DTAU) TOP OF EACH LAYER HAS
225C  OPTICAL DEPTH TAU(N). IN THIS SUB LEVEL N IS ABOVE LAYER N. THAT IS LAYER N
226C  HAS LEVEL N ON TOP AND LEVEL N+1 ON BOTTOM. OPTICAL DEPTH INCREASES
227C  FROM TOP TO BOTTOM. SEE C.P. MCKAY, TGM NOTES.
228C  THIS SUBROUTINE DIFFERS FROM ITS IR CONTERPART IN THAT HERE WE SOLVE FOR
229C  THE FLUXES DIRECTLY USING THE GENERALIZED NOTATION OF MEADOR AND WEAVOR
230C  J.A.S., 37, 630-642, 1980.
231C  THE TRI-DIAGONAL MATRIX SOLVER IS DSOLVER AND IS DOUBLE PRECISION SO MANY
232C  VARIABLES ARE PASSED AS SINGLE THEN BECOME DOUBLE IN DSOLVER
233
234C  THIS VERSION HAS BEEN MODIFIED BY TRAN THE TRUNG WITH:
235C   1. Simplified input & output for swr.F subroutine in LMDZ.MARS gcm model
236C   2. Use delta function to modify optical properties
237C   3. Use delta-eddington G1, G2, G3 parameters
238C   4. Optimized for speed
239
240C  INPUTS:
241      INTEGER NAYER     
242c   NAYER = number of layer
243c            first layer is at top
244c            last layer is at bottom
245      REAL*8 DTDEL(NAYER), WDEL(NAYER), CDEL(NAYER)
246c   DTDEL = optical thickness of layer
247c   WDEL = single scattering of layer
248c   CDEL = assymetry parameter
249      REAL*8 UBAR0, RSF
250c   UBAR0 = absolute value of cosine of solar zenith angle
251c   RSF = surface albedo
252C  OUTPUTS:
253      REAL*8 FP(NAYER+1), FM(NAYER+1)
254c   FP = flux up
255c   FM = flux down
256C  PRIVATES:
257      INTEGER J,NL,NLEV
258!!!! AS+JBM 03/2010 BUG BUG si trop niveaux verticaux (LES)
259!!!!                ET PAS BESOIN DE HARDWIRE SALE ICI  !   
260!!!! CORRIGER CE BUG AMELIORE EFFICACITE ET FLEXIBILITE     
261      !! PARAMETER (NL=201)
262      !! C THIS VALUE (201) MUST BE .GE. 2*NAYER
263      REAL*8 BSURF,AP,AM,DENOM,EM,EP,G4
264      !! REAL*8 W0(NL), COSBAR(NL), DTAU(NL), TAU(NL)
265      !! REAL*8 LAMDA(NL),XK1(NL),XK2(NL)
266      !! REAL*8 G1(NL),G2(NL),G3(NL)
267      !! REAL*8 GAMA(NL),CP(NL),CM(NL),CPM1(NL),CMM1(NL)
268      !! REAL*8 E1(NL),E2(NL),E3(NL),E4(NL)
269      REAL*8 W0(2*NAYER), COSBAR(2*NAYER), DTAU(2*NAYER), TAU(2*NAYER) 
270      REAL*8 LAMDA(2*NAYER),XK1(2*NAYER),XK2(2*NAYER)
271      REAL*8 G1(2*NAYER),G2(2*NAYER),G3(2*NAYER)
272      REAL*8 GAMA(2*NAYER),CP(2*NAYER),CM(2*NAYER),CPM1(2*NAYER)
273      REAL*8 CMM1(2*NAYER)
274      REAL*8 E1(2*NAYER),E2(2*NAYER),E3(2*NAYER),E4(2*NAYER)
275
276      NL = 2*NAYER  !!! AS+JBM 03/2010
277      NLEV = NAYER+1
278     
279C  TURN ON THE DELTA-FUNCTION IF REQUIRED HERE
280c      TAU(1) = 0.0
281c      DO J=1,NAYER
282c        W0(J)=WDEL(J)
283c        COSBAR(J)=CDEL(J)
284c        DTAU(J)=DTDEL(J)
285c        TAU(J+1)=TAU(J)+DTAU(J)
286c      END DO
287C  FOR THE DELTA FUNCTION  HERE...
288      TAU(1) = 0.0
289      DO J=1,NAYER
290        COSBAR(J)=CDEL(J)/(1.+CDEL(J))
291        W0(J)=1.-WDEL(J)*CDEL(J)**2
292        DTAU(J)=DTDEL(J)*W0(J)
293        W0(J)=WDEL(J)*(1.-CDEL(J)**2)/W0(J)
294        TAU(J+1)=TAU(J)+DTAU(J)
295      END DO
296     
297c     Optimization, this is the major speed gain
298      TAU(1) = 1.0
299      do J = 2, NAYER+1
300        TAU(J) = EXP(-TAU(J)/UBAR0)
301      end do
302      BSURF = RSF*UBAR0*TAU(NLEV)
303C  WE GO WITH THE HEMISPHERIC CONSTANT APPROACH
304C  AS DEFINED BY M&W - THIS IS THE WAY THE IR IS DONE
305      DO J=1,NAYER
306c        Optimization: ALPHA not used
307c        ALPHA(J)=SQRT( (1.-W0(J))/(1.-W0(J)*COSBAR(J)) )
308C  SET OF CONSTANTS DETERMINED BY DOM
309c      G1(J)= (SQRT(3.)*0.5)*(2. - W0(J)*(1.+COSBAR(J)))
310c      G2(J)= (SQRT(3.)*W0(J)*0.5)*(1.-COSBAR(J))
311c      G3(J)=0.5*(1.-SQRT(3.)*COSBAR(J)*UBAR0)
312c  We use delta-Eddington instead
313        G1(J)=0.25*(7.-W0(j)*(4.+3*cosbar(j)))
314        G2(J)=-0.25*(1.-W0(j)*(4.-3*cosbar(j)))
315        G3(J)=0.5*(1.-SQRT(3.)*COSBAR(J)*UBAR0)
316        LAMDA(J)=SQRT(G1(J)**2 - G2(J)**2)
317        GAMA(J)=(G1(J)-LAMDA(J))/G2(J)
318      END DO
319
320      DO J=1,NAYER
321        G4=1.-G3(J)
322        DENOM=LAMDA(J)**2 - 1./UBAR0**2
323C  NOTE THAT THE ALGORITHM DONOT ACCEPT UBAR0 .eq. 0
324C  THERE IS A POTENTIAL PROBLEM HERE IF W0=0 AND UBARV=UBAR0
325C  THEN DENOM WILL VANISH. THIS ONLY HAPPENS PHYSICALLY WHEN
326C  THE SCATTERING GOES TO ZERO
327C  PREVENT THIS WITH AN IF STATEMENT
328        IF ( DENOM .EQ. 0.) THEN
329          DENOM=1.E-6
330        END IF
331        DENOM = W0(J)/DENOM
332        AM=DENOM*(G4   *(G1(J)+1./UBAR0) +G2(J)*G3(J) )
333        AP=DENOM*(G3(J)*(G1(J)-1./UBAR0) +G2(J)*G4    )
334C  CPM1 AND CMM1 ARE THE CPLUS AND CMINUS TERMS EVALUATED
335C  AT THE TOP OF THE LAYER, THAT IS LOWER OPTICAL DEPTH TAU(J)
336        CPM1(J)=AP*TAU(J)
337        CMM1(J)=AM*TAU(J)
338C  CP AND CM ARE THE CPLUS AND CMINUS TERMS EVALUATED AT THE
339C  BOTTOM OF THE LAYER. THAT IS AT HIGHER OPTICAL DEPTH TAU(J+1)
340        CP(J)=AP*TAU(J+1)
341        CM(J)=AM*TAU(J+1)
342      END DO
343
344C  NOW CALCULATE THE EXPONENTIAL TERMS NEEDED
345C  FOR THE TRIDIAGONAL ROTATED LAYERED METHOD
346C  WARNING IF DTAU(J) IS GREATER THAN ABOUT 35
347C  WE CLIPP IT TO AVOID OVERFLOW.
348C  EXP (TAU) - EXP(-TAU) WILL BE NONSENSE THIS IS
349C  CORRECTED IN THE DSOLVER ROUTINE. ??FLAG?
350      DO J=1,NAYER
351c        EXPTRM(J) = MIN(35.,LAMDA(J)*DTAU(J))
352        EP=EXP(MIN(35.0_8,LAMDA(J)*DTAU(J)))
353        EM=1.0/EP
354        AM = GAMA(J)*EM
355        E1(J)=EP+AM
356        E2(J)=EP-AM
357        AP = GAMA(J)*EP
358        E3(J)=AP+EM
359        E4(J)=AP-EM
360      END DO
361
362      CALL DSOLVER(NAYER,GAMA,CP,CM,CPM1,CMM1
363     &            ,E1,E2,E3,E4,0.0_8,BSURF,RSF,XK1,XK2)
364
365C  EVALUATE THE NAYER FLUXES THROUGH THE NAYER LAYERS
366C  USE THE TOP (TAU=0) OPTICAL DEPTH EXPRESSIONS TO EVALUATE FP AND FM
367C  AT THE THE TOP OF EACH LAYER,J = LEVEL J
368      DO J=1,NAYER
369        FP(J)= XK1(J) + GAMA(J)*XK2(J) + CPM1(J)
370        FM(J)= GAMA(J)*XK1(J) + XK2(J) + CMM1(J)
371      END DO
372
373C  USE EXPRESSION FOR BOTTOM FLUX TO GET THE FP AND FM AT NLEV
374c     Optimization: no need this step since result of last
375c     loop at about EP above give this
376c      EP=EXP(EXPTRM(NAYER))
377c      EM=1.0/EP
378      FP(NLEV)=XK1(NAYER)*EP + XK2(NAYER)*AM + CP(NAYER)
379      FM(NLEV)=XK1(NAYER)*AP + XK2(NAYER)*EM + CM(NAYER)
380
381C  ADD THE DIRECT FLUX TERM TO THE DOWNWELLING RADIATION, LIOU 182
382      DO J=1,NLEV
383        FM(J)=FM(J)+UBAR0*TAU(J)
384      END DO
385
386      END SUBROUTINE GFLUXV
387
388CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
389
390      SUBROUTINE DSOLVER(NL,GAMA,CP,CM,CPM1,CMM1,E1,E2,E3,E4,BTOP,
391     *                   BSURF,RSF,XK1,XK2)
392
393C DOUBLE PRECISION VERSION OF SOLVER
394      IMPLICIT NONE
395cc      PARAMETER (NMAX=201)
396cc AS+JBM 03/2010
397      INTEGER NL
398!      IMPLICIT REAL*8  (A-H,O-Z)
399      REAL*8 GAMA(NL),CP(NL),CM(NL),CPM1(NL),CMM1(NL),XK1(NL),
400     *          XK2(NL),E1(NL),E2(NL),E3(NL),E4(NL)
401      REAL*8 BTOP,BSURF,RSF
402cc AS+JBM 03/2010     
403cc      DIMENSION AF(NMAX),BF(NMAX),CF(NMAX),DF(NMAX),XK(NMAX)
404      REAL*8 AF(2*NL),BF(2*NL),CF(2*NL),DF(2*NL),XK(2*NL)
405
406C*********************************************************
407C* THIS SUBROUTINE SOLVES FOR THE COEFFICIENTS OF THE    *
408C* TWO STREAM SOLUTION FOR GENERAL BOUNDARY CONDITIONS   *
409C* NO ASSUMPTION OF THE DEPENDENCE ON OPTICAL DEPTH OF   *
410C* C-PLUS OR C-MINUS HAS BEEN MADE.                      *
411C* NL     = NUMBER OF LAYERS IN THE MODEL                *
412C* CP     = C-PLUS EVALUATED AT TAO=0 (TOP)              *
413C* CM     = C-MINUS EVALUATED AT TAO=0 (TOP)             *
414C* CPM1   = C-PLUS  EVALUATED AT TAOSTAR (BOTTOM)        *
415C* CMM1   = C-MINUS EVALUATED AT TAOSTAR (BOTTOM)        *
416C* EP     = EXP(LAMDA*DTAU)                              *
417C* EM     = 1/EP                                         *
418C* E1     = EP + GAMA *EM                                *
419C* E2     = EP - GAMA *EM                                *
420C* E3     = GAMA*EP + EM                                 *
421C* E4     = GAMA*EP - EM                                 *
422C* BTOP   = THE DIFFUSE RADIATION INTO THE MODEL AT TOP  *
423C* BSURF  = THE DIFFUSE RADIATION INTO THE MODEL AT      *
424C*          THE BOTTOM: INCLUDES EMMISION AND REFLECTION *
425C*          OF THE UNATTENUATED PORTION OF THE DIRECT    *
426C*          BEAM. BSTAR+RSF*FO*EXP(-TAOSTAR/U0)          *
427C* RSF    = REFLECTIVITY OF THE SURFACE                  *
428C* XK1    = COEFFICIENT OF THE POSITIVE EXP TERM         *
429C* XK2    = COEFFICIENT OF THE NEGATIVE EXP TERM         *
430C*********************************************************
431C THIS ROUTINE CALLS ROUTINE DTRIDGL TO SOLVE TRIDIAGONAL
432C SYSTEMS
433C======================================================================C
434
435      INTEGER :: I, L, LM1, LM2, N
436
437      L=2*NL
438 
439C     ************MIXED COEFFICENTS**********
440C     THIS VERSION AVOIDS SINGULARITIES ASSOC.
441C     WITH W0=0 BY SOLVING FOR XK1+XK2, AND XK1-XK2.
442
443      AF(1) = 0.0
444      BF(1) = GAMA(1)+1.
445      CF(1) = GAMA(1)-1.
446      DF(1) = BTOP-CMM1(1)
447      N     = 0
448      LM2   = L-2
449
450C     EVEN TERMS
451 
452      DO I=2,LM2,2
453        N     = N+1
454        AF(I) = (E1(N)+E3(N))*(GAMA(N+1)-1.)       
455        BF(I) = (E2(N)+E4(N))*(GAMA(N+1)-1.)
456        CF(I) = 2.0*(1.-GAMA(N+1)**2)
457        DF(I) = (GAMA(N+1)-1.) * (CPM1(N+1) - CP(N)) +
458     *            (1.-GAMA(N+1))* (CM(N)-CMM1(N+1))
459      END DO
460 
461      N   = 0
462      LM1 = L-1
463      DO I=3,LM1,2
464        N     = N+1
465        AF(I) = 2.0*(1.-GAMA(N)**2)
466        BF(I) = (E1(N)-E3(N))*(1.+GAMA(N+1))
467        CF(I) = (E1(N)+E3(N))*(GAMA(N+1)-1.)
468        DF(I) = E3(N)*(CPM1(N+1) - CP(N)) + E1(N)*(CM(N) - CMM1(N+1))
469      END DO
470 
471      AF(L) = E1(NL)-RSF*E3(NL)
472      BF(L) = E2(NL)-RSF*E4(NL)
473      CF(L) = 0.0
474      DF(L) = BSURF-CP(NL)+RSF*CM(NL)
475 
476      CALL DTRIDGL(L,AF,BF,CF,DF,XK)
477 
478C     ***UNMIX THE COEFFICIENTS****
479
480      DO 28 N=1,NL
481        XK1(N) = XK(2*N-1)+XK(2*N)
482        XK2(N) = XK(2*N-1)-XK(2*N)
483
484C       NOW TEST TO SEE IF XK2 IS REALLY ZERO TO THE LIMIT OF THE
485C       MACHINE ACCURACY  = 1 .E -30
486C       XK2 IS THE COEFFICIENT OF THE GROWING EXPONENTIAL AND MUST
487C       BE TREATED CAREFULLY
488
489        IF(XK2(N) .EQ. 0.0) GO TO 28
490        IF (ABS (XK2(N)/XK(2*N-1)) .LT. 1.E-30) XK2(N)=0.0
491
492   28 CONTINUE
493 
494      END SUBROUTINE DSOLVER
495
496CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
497
498      SUBROUTINE DTRIDGL(L,AF,BF,CF,DF,XK)
499
500C     DOUBLE PRECISION VERSION OF TRIDGL
501      IMPLICIT NONE
502cc AS+JBM 03/2010 : OBSOLETE MAINTENANT     
503cc      PARAMETER (NMAX=201)
504!      IMPLICIT REAL*8  (A-H,O-Z)
505      INTEGER L
506      REAL*8 AF(L),BF(L),CF(L),DF(L),XK(L)
507cc AS+JBM 03/2010 : OBSOLETE MAINTENANT
508cc      DIMENSION AS(NMAX),DS(NMAX)
509      REAL*8 AS(L),DS(L)
510      REAL*8 X
511      INTEGER I
512
513C*    THIS SUBROUTINE SOLVES A SYSTEM OF TRIDIAGIONAL MATRIX
514C*    EQUATIONS. THE FORM OF THE EQUATIONS ARE:
515C*    A(I)*X(I-1) + B(I)*X(I) + C(I)*X(I+1) = D(I)
516C*    WHERE I=1,L  LESS THAN 103.
517C* ..............REVIEWED -CP........
518
519C======================================================================C
520
521      AS(L) = AF(L)/BF(L)
522      DS(L) = DF(L)/BF(L)
523
524      DO I=2,L
525        X         = 1./(BF(L+1-I) - CF(L+1-I)*AS(L+2-I))
526        AS(L+1-I) = AF(L+1-I)*X
527        DS(L+1-I) = (DF(L+1-I)-CF(L+1-I)*DS(L+2-I))*X
528      END DO
529 
530      XK(1)=DS(1)
531      DO I=2,L
532        XK(I) = DS(I)-AS(I)*XK(I-1)
533      END DO
534
535      END SUBROUTINE DTRIDGL
536     
537      end module swr_toon_mod
Note: See TracBrowser for help on using the repository browser.