source: trunk/LMDZ.GENERIC/libf/phygeneric/rad_tridiagonal_matrix_solver.F @ 4097

Last change on this file since 4097 was 4097, checked in by emillour, 3 weeks ago

Generic PCM:
Code tidying: turn dtridgl.F into util_tridiagonal_matrix_solver.F90, and also
turn rad_tridiagonal_matrix_solver.F into a module.
EM

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