/[MITgcm]/MITgcm/model/src/solve_pentadiagonal.F
ViewVC logotype

Annotation of /MITgcm/model/src/solve_pentadiagonal.F

Parent Directory Parent Directory | Revision Log Revision Log | View Revision Graph Revision Graph


Revision 1.1 - (hide annotations) (download)
Wed Jan 7 21:19:37 2004 UTC (20 years, 4 months ago) by jmc
Branch: MAIN
CVS Tags: checkpoint52e_post
new S/R to solve vertical direction implicitly.

1 jmc 1.1 C $Header: $
2     C $Name: $
3    
4     #include "CPP_OPTIONS.h"
5    
6     CBOP
7     C !ROUTINE: SOLVE_PENTADIAGONAL
8     C !INTERFACE:
9     SUBROUTINE SOLVE_PENTADIAGONAL(
10     I iMin,iMax, jMin,jMax,
11     U a5d, b5d, c5d, d5d, e5d,
12     U y5d,
13     O errCode,
14     I bi, bj, myThid )
15     C !DESCRIPTION: \bv
16     C *==========================================================*
17     C | S/R SOLVE_PENTADIAGONAL
18     C | o Solve a penta-diagonal system A*X=Y (dimension Nr)
19     C *==========================================================*
20     C | o Used to solve implicitly vertical advection & diffusion
21     C *==========================================================*
22     C \ev
23    
24     C !USES:
25     IMPLICIT NONE
26     C == Global data ==
27     #include "SIZE.h"
28     #include "EEPARAMS.h"
29    
30     C !INPUT/OUTPUT PARAMETERS:
31     C == Routine Arguments ==
32     C INPUT:
33     C a5d :: 2nd lower diagonal of the pentadiagonal matrix
34     C b5d :: 1rst lower diagonal of the pentadiagonal matrix
35     C c5d :: main diagonal of the pentadiagonal matrix
36     C d5d :: 1rst upper diagonal of the pentadiagonal matrix
37     C e5d :: 2nd upper diagonal of the pentadiagonal matrix
38     C y5d :: Y vector (R.H.S.);
39     C OUTPUT:
40     C y5d :: X = solution of A*X=Y
41     C a5d,b5d,c5d,d5d,e5d :: modified to enable to find X' solution of
42     C A*X'=Y' without solving the full system again
43     C errCode :: > 0 if singular matrix
44     INTEGER iMin,iMax,jMin,jMax
45     _RL a5d(1-Olx:sNx+Olx,1-Oly:sNy+Oly,Nr)
46     _RL b5d(1-Olx:sNx+Olx,1-Oly:sNy+Oly,Nr)
47     _RL c5d(1-Olx:sNx+Olx,1-Oly:sNy+Oly,Nr)
48     _RL d5d(1-Olx:sNx+Olx,1-Oly:sNy+Oly,Nr)
49     _RL e5d(1-Olx:sNx+Olx,1-Oly:sNy+Oly,Nr)
50     _RL y5d(1-Olx:sNx+Olx,1-Oly:sNy+Oly,Nr,nSx,nSy)
51     INTEGER errCode
52     INTEGER bi, bj, myThid
53    
54     C !LOCAL VARIABLES:
55     C == Local variables ==
56     INTEGER i,j,k
57     CEOP
58    
59     errCode = 0
60    
61     C-- forward sweep (starting from top)
62     k = 1
63     DO j=jMin,jMax
64     DO i=iMin,iMax
65     IF ( c5d(i,j,k).NE.0. _d 0 ) THEN
66     c5d(i,j,k) = 1. _d 0 / c5d(i,j,k)
67     ELSE
68     c5d(i,j,k) = 0. _d 0
69     errCode = 1
70     ENDIF
71     ENDDO
72     ENDDO
73    
74     k = 2
75     DO j=jMin,jMax
76     DO i=iMin,iMax
77     C-- [k] <- [k] - b_k/c_k-1 * [k-1]
78     b5d(i,j,k) = b5d(i,j,k)*c5d(i,j,k-1)
79     c5d(i,j,k) = c5d(i,j,k) - b5d(i,j,k)*d5d(i,j,k-1)
80     d5d(i,j,k) = d5d(i,j,k) - b5d(i,j,k)*e5d(i,j,k-1)
81     y5d(i,j,k,bi,bj) = y5d(i,j,k,bi,bj)
82     & - b5d(i,j,k)*y5d(i,j,k-1,bi,bj)
83     IF ( c5d(i,j,k).NE.0. _d 0 ) THEN
84     c5d(i,j,k) = 1. _d 0 / c5d(i,j,k)
85     ELSE
86     c5d(i,j,k) = 0. _d 0
87     errCode = 1
88     ENDIF
89     ENDDO
90     ENDDO
91    
92     C-- Middle of forward sweep
93     DO k=3,Nr
94     DO j=jMin,jMax
95     DO i=iMin,iMax
96     C-- [k] <- [k] - a_k/c_k-2 * [k-2]
97     a5d(i,j,k) = a5d(i,j,k)*c5d(i,j,k-2)
98     b5d(i,j,k) = b5d(i,j,k) - a5d(i,j,k)*d5d(i,j,k-2)
99     c5d(i,j,k) = c5d(i,j,k) - a5d(i,j,k)*e5d(i,j,k-2)
100     C-- [k] <- [k] - b_k/c_k-1 * [k-1]
101     b5d(i,j,k) = b5d(i,j,k)*c5d(i,j,k-1)
102     c5d(i,j,k) = c5d(i,j,k) - b5d(i,j,k)*d5d(i,j,k-1)
103     d5d(i,j,k) = d5d(i,j,k) - b5d(i,j,k)*e5d(i,j,k-1)
104     y5d(i,j,k,bi,bj) = y5d(i,j,k,bi,bj)
105     & - b5d(i,j,k)*y5d(i,j,k-1,bi,bj)
106     & - a5d(i,j,k)*y5d(i,j,k-2,bi,bj)
107     IF ( c5d(i,j,k).NE.0. _d 0 ) THEN
108     c5d(i,j,k) = 1. _d 0 / c5d(i,j,k)
109     ELSE
110     c5d(i,j,k) = 0. _d 0
111     errCode = 1
112     ENDIF
113     ENDDO
114     ENDDO
115     ENDDO
116    
117     C-- Backward sweep (starting from bottom)
118     k = Nr
119     DO j=jMin,jMax
120     DO i=iMin,iMax
121     y5d(i,j,k,bi,bj) = y5d(i,j,k,bi,bj)*c5d(i,j,k)
122     ENDDO
123     ENDDO
124     k = Nr-1
125     DO j=jMin,jMax
126     DO i=iMin,iMax
127     y5d(i,j,k,bi,bj) = ( y5d(i,j,k,bi,bj)
128     & - d5d(i,j,k)*y5d(i,j,k+1,bi,bj)
129     & )*c5d(i,j,k)
130     ENDDO
131     ENDDO
132     DO k=Nr-2,1,-1
133     DO j=jMin,jMax
134     DO i=iMin,iMax
135     y5d(i,j,k,bi,bj) = ( y5d(i,j,k,bi,bj)
136     & - d5d(i,j,k)*y5d(i,j,k+1,bi,bj)
137     & - e5d(i,j,k)*y5d(i,j,k+2,bi,bj)
138     & )*c5d(i,j,k)
139     ENDDO
140     ENDDO
141     ENDDO
142    
143     RETURN
144     END

  ViewVC Help
Powered by ViewVC 1.1.22