source: trunk/LMDZ.GENERIC/libf/phystd/dsolver.F @ 3300

Last change on this file since 3300 was 1420, checked in by sglmd, 10 years ago

some clean-up: hard coded parameters removed

File size: 3.5 KB
Line 
1      SUBROUTINE DSOLVER(NL,GAMA,CP,CM,CPM1,CMM1,E1,E2,E3,E4,BTOP,
2     *                   BSURF,RSF,XK1,XK2)
3
4C  GCM2.0  Feb 2003
5C
6C DOUBLE PRECISION VERSION OF SOLVER
7
8!!      PARAMETER (NMAX=201)
9      IMPLICIT REAL*8  (A-H,O-Z)
10      DIMENSION GAMA(NL),CP(NL),CM(NL),CPM1(NL),CMM1(NL),XK1(NL),
11     *          XK2(NL),E1(NL),E2(NL),E3(NL),E4(NL)
12      DIMENSION AF(2*NL),BF(2*NL),CF(2*NL),DF(2*NL),XK(2*NL)
13C*********************************************************
14C* THIS SUBROUTINE SOLVES FOR THE COEFFICIENTS OF THE    *
15C* TWO STREAM SOLUTION FOR GENERAL BOUNDARY CONDITIONS   *
16C* NO ASSUMPTION OF THE DEPENDENCE ON OPTICAL DEPTH OF   *
17C* C-PLUS OR C-MINUS HAS BEEN MADE.                      *
18C* NL     = NUMBER OF LAYERS IN THE MODEL                *
19C* CP     = C-PLUS EVALUATED AT TAO=0 (TOP)              *
20C* CM     = C-MINUS EVALUATED AT TAO=0 (TOP)             *
21C* CPM1   = C-PLUS  EVALUATED AT TAOSTAR (BOTTOM)        *
22C* CMM1   = C-MINUS EVALUATED AT TAOSTAR (BOTTOM)        *
23C* EP     = EXP(LAMDA*DTAU)                              *
24C* EM     = 1/EP                                         *
25C* E1     = EP + GAMA *EM                                *
26C* E2     = EP - GAMA *EM                                *
27C* E3     = GAMA*EP + EM                                 *
28C* E4     = GAMA*EP - EM                                 *
29C* BTOP   = THE DIFFUSE RADIATION INTO THE MODEL AT TOP  *
30C* BSURF  = THE DIFFUSE RADIATION INTO THE MODEL AT      *
31C*          THE BOTTOM: INCLUDES EMMISION AND REFLECTION *
32C*          OF THE UNATTENUATED PORTION OF THE DIRECT    *
33C*          BEAM. BSTAR+RSF*FO*EXP(-TAOSTAR/U0)          *
34C* RSF    = REFLECTIVITY OF THE SURFACE                  *
35C* XK1    = COEFFICIENT OF THE POSITIVE EXP TERM         *
36C* XK2    = COEFFICIENT OF THE NEGATIVE EXP TERM         *
37C*********************************************************
38
39C======================================================================C
40
41      L=2*NL
42 
43C     ************MIXED COEFFICENTS**********
44C     THIS VERSION AVOIDS SINGULARITIES ASSOC.
45C     WITH W0=0 BY SOLVING FOR XK1+XK2, AND XK1-XK2.
46
47      AF(1) = 0.0
48      BF(1) = GAMA(1)+1.
49      CF(1) = GAMA(1)-1.
50      DF(1) = BTOP-CMM1(1)
51      N     = 0
52      LM2   = L-2
53
54C     EVEN TERMS
55 
56      DO I=2,LM2,2
57        N     = N+1
58        AF(I) = (E1(N)+E3(N))*(GAMA(N+1)-1.)       
59        BF(I) = (E2(N)+E4(N))*(GAMA(N+1)-1.)
60        CF(I) = 2.0*(1.-GAMA(N+1)**2)
61        DF(I) = (GAMA(N+1)-1.) * (CPM1(N+1) - CP(N)) +
62     *            (1.-GAMA(N+1))* (CM(N)-CMM1(N+1))
63      END DO
64 
65      N   = 0
66      LM1 = L-1
67      DO I=3,LM1,2
68        N     = N+1
69        AF(I) = 2.0*(1.-GAMA(N)**2)
70        BF(I) = (E1(N)-E3(N))*(1.+GAMA(N+1))
71        CF(I) = (E1(N)+E3(N))*(GAMA(N+1)-1.)
72        DF(I) = E3(N)*(CPM1(N+1) - CP(N)) + E1(N)*(CM(N) - CMM1(N+1))
73      END DO
74 
75      AF(L) = E1(NL)-RSF*E3(NL)
76      BF(L) = E2(NL)-RSF*E4(NL)
77      CF(L) = 0.0
78      DF(L) = BSURF-CP(NL)+RSF*CM(NL)
79 
80      CALL DTRIDGL(L,AF,BF,CF,DF,XK)
81 
82C     ***UNMIX THE COEFFICIENTS****
83
84      DO 28 N=1,NL
85        XK1(N) = XK(2*N-1)+XK(2*N)
86        XK2(N) = XK(2*N-1)-XK(2*N)
87
88C       NOW TEST TO SEE IF XK2 IS REALLY ZERO TO THE LIMIT OF THE
89C       MACHINE ACCURACY  = 1 .E -30
90C       XK2 IS THE COEFFICEINT OF THE GROWING EXPONENTIAL AND MUST
91C       BE TREATED CAREFULLY
92
93        IF(XK2(N) .EQ. 0.0) GO TO 28
94c        IF (ABS (XK2(N)/XK(2*N-1)) .LT. 1.E-30) XK2(N)=0.0
95
96        IF (ABS (XK2(N)/(XK(2*N-1)+1.e-20)) .LT. 1.E-30) XK2(N)=0.0   ! For debug only (with -Ktrap=fp option)
97
98
99   28 CONTINUE
100 
101      RETURN
102      END
Note: See TracBrowser for help on using the repository browser.