| 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 |
|---|
| 12 | C GCM2.0 Feb 2003 |
|---|
| 13 | C |
|---|
| 14 | C 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 | |
|---|
| 26 | C********************************************************* |
|---|
| 27 | C* THIS SUBROUTINE SOLVES FOR THE COEFFICIENTS OF THE * |
|---|
| 28 | C* TWO STREAM SOLUTION FOR GENERAL BOUNDARY CONDITIONS * |
|---|
| 29 | C* NO ASSUMPTION OF THE DEPENDENCE ON OPTICAL DEPTH OF * |
|---|
| 30 | C* C-PLUS OR C-MINUS HAS BEEN MADE. * |
|---|
| 31 | C* NL = NUMBER OF LAYERS IN THE MODEL * |
|---|
| 32 | C* CP = C-PLUS EVALUATED AT TAO=0 (TOP) * |
|---|
| 33 | C* CM = C-MINUS EVALUATED AT TAO=0 (TOP) * |
|---|
| 34 | C* CPM1 = C-PLUS EVALUATED AT TAOSTAR (BOTTOM) * |
|---|
| 35 | C* CMM1 = C-MINUS EVALUATED AT TAOSTAR (BOTTOM) * |
|---|
| 36 | C* EP = EXP(LAMDA*DTAU) * |
|---|
| 37 | C* EM = 1/EP * |
|---|
| 38 | C* E1 = EP + GAMA *EM * |
|---|
| 39 | C* E2 = EP - GAMA *EM * |
|---|
| 40 | C* E3 = GAMA*EP + EM * |
|---|
| 41 | C* E4 = GAMA*EP - EM * |
|---|
| 42 | C* BTOP = THE DIFFUSE RADIATION INTO THE MODEL AT TOP * |
|---|
| 43 | C* BSURF = THE DIFFUSE RADIATION INTO THE MODEL AT * |
|---|
| 44 | C* THE BOTTOM: INCLUDES EMMISION AND REFLECTION * |
|---|
| 45 | C* OF THE UNATTENUATED PORTION OF THE DIRECT * |
|---|
| 46 | C* BEAM. BSTAR+RSF*FO*EXP(-TAOSTAR/U0) * |
|---|
| 47 | C* RSF = REFLECTIVITY OF THE SURFACE * |
|---|
| 48 | C* XK1 = COEFFICIENT OF THE POSITIVE EXP TERM * |
|---|
| 49 | C* XK2 = COEFFICIENT OF THE NEGATIVE EXP TERM * |
|---|
| 50 | C********************************************************* |
|---|
| 51 | |
|---|
| 52 | INTEGER :: L,LM1,LM2 |
|---|
| 53 | INTEGER :: N |
|---|
| 54 | INTEGER :: I |
|---|
| 55 | C======================================================================C |
|---|
| 56 | |
|---|
| 57 | L=2*NL |
|---|
| 58 | |
|---|
| 59 | C ************MIXED COEFFICENTS********** |
|---|
| 60 | C THIS VERSION AVOIDS SINGULARITIES ASSOC. |
|---|
| 61 | C 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 | |
|---|
| 70 | C 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 | |
|---|
| 98 | C ***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 | |
|---|
| 104 | C NOW TEST TO SEE IF XK2 IS REALLY ZERO TO THE LIMIT OF THE |
|---|
| 105 | C MACHINE ACCURACY = 1 .E -30 |
|---|
| 106 | C XK2 IS THE COEFFICEINT OF THE GROWING EXPONENTIAL AND MUST |
|---|
| 107 | C BE TREATED CAREFULLY |
|---|
| 108 | |
|---|
| 109 | IF(XK2(N) .EQ. 0.0) CONTINUE |
|---|
| 110 | c 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 |
|---|