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

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

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


Revision 1.1 - (show 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 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