/[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.3 - (hide annotations) (download)
Tue Mar 16 00:08:27 2010 UTC (14 years, 2 months ago) by jmc
Branch: MAIN
CVS Tags: checkpoint62g, checkpoint62f, checkpoint62e, checkpoint62d, checkpoint62i, checkpoint62h
Changes since 1.2: +3 -3 lines
avoid unbalanced quote (single or double) in commented line

1 jmc 1.3 C $Header: /u/gcmpack/MITgcm/model/src/solve_pentadiagonal.F,v 1.2 2004/01/08 16:18:11 jmc Exp $
2 jmc 1.1 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 jmc 1.2 C iMin,iMax,jMin,jMax :: computational domain
34     C a5d :: 2nd lower diagonal of the pentadiagonal matrix
35     C b5d :: 1rst lower diagonal of the pentadiagonal matrix
36     C c5d :: main diagonal of the pentadiagonal matrix
37     C d5d :: 1rst upper diagonal of the pentadiagonal matrix
38     C e5d :: 2nd upper diagonal of the pentadiagonal matrix
39     C y5d :: Y vector (R.H.S.);
40     C bi,bj :: tile indices
41     C myThid :: thread number
42 jmc 1.1 C OUTPUT:
43 jmc 1.2 C y5d :: X = solution of A*X=Y
44 jmc 1.3 C a5d,b5d,c5d,d5d,e5d :: modified to enable to find Xp solution of
45     C A*Xp=Yp without solving the full system again
46 jmc 1.1 C errCode :: > 0 if singular matrix
47     INTEGER iMin,iMax,jMin,jMax
48     _RL a5d(1-Olx:sNx+Olx,1-Oly:sNy+Oly,Nr)
49     _RL b5d(1-Olx:sNx+Olx,1-Oly:sNy+Oly,Nr)
50     _RL c5d(1-Olx:sNx+Olx,1-Oly:sNy+Oly,Nr)
51     _RL d5d(1-Olx:sNx+Olx,1-Oly:sNy+Oly,Nr)
52     _RL e5d(1-Olx:sNx+Olx,1-Oly:sNy+Oly,Nr)
53     _RL y5d(1-Olx:sNx+Olx,1-Oly:sNy+Oly,Nr,nSx,nSy)
54     INTEGER errCode
55     INTEGER bi, bj, myThid
56    
57     C !LOCAL VARIABLES:
58     C == Local variables ==
59     INTEGER i,j,k
60     CEOP
61    
62     errCode = 0
63    
64 jmc 1.2 DO k=1,Nr
65 jmc 1.1 C-- forward sweep (starting from top)
66 jmc 1.2 IF (k.EQ.1) THEN
67     DO j=jMin,jMax
68     DO i=iMin,iMax
69     IF ( c5d(i,j,k).NE.0. _d 0 ) THEN
70 jmc 1.1 c5d(i,j,k) = 1. _d 0 / c5d(i,j,k)
71 jmc 1.2 ELSE
72 jmc 1.1 c5d(i,j,k) = 0. _d 0
73     errCode = 1
74 jmc 1.2 ENDIF
75     ENDDO
76     ENDDO
77 jmc 1.1
78 jmc 1.2 ELSEIF (k.EQ.2) THEN
79     DO j=jMin,jMax
80     DO i=iMin,iMax
81     C-- [k] <- [k] - b_k/c_k-1 * [k-1]
82     b5d(i,j,k) = b5d(i,j,k)*c5d(i,j,k-1)
83     c5d(i,j,k) = c5d(i,j,k) - b5d(i,j,k)*d5d(i,j,k-1)
84     d5d(i,j,k) = d5d(i,j,k) - b5d(i,j,k)*e5d(i,j,k-1)
85     y5d(i,j,k,bi,bj) = y5d(i,j,k,bi,bj)
86     & - b5d(i,j,k)*y5d(i,j,k-1,bi,bj)
87     IF ( c5d(i,j,k).NE.0. _d 0 ) THEN
88 jmc 1.1 c5d(i,j,k) = 1. _d 0 / c5d(i,j,k)
89 jmc 1.2 ELSE
90 jmc 1.1 c5d(i,j,k) = 0. _d 0
91     errCode = 1
92 jmc 1.2 ENDIF
93     ENDDO
94     ENDDO
95 jmc 1.1
96 jmc 1.2 ELSE
97 jmc 1.1 C-- Middle of forward sweep
98 jmc 1.2 DO j=jMin,jMax
99     DO i=iMin,iMax
100     C-- [k] <- [k] - a_k/c_k-2 * [k-2]
101     a5d(i,j,k) = a5d(i,j,k)*c5d(i,j,k-2)
102     b5d(i,j,k) = b5d(i,j,k) - a5d(i,j,k)*d5d(i,j,k-2)
103     c5d(i,j,k) = c5d(i,j,k) - a5d(i,j,k)*e5d(i,j,k-2)
104     C-- [k] <- [k] - b_k/c_k-1 * [k-1]
105     b5d(i,j,k) = b5d(i,j,k)*c5d(i,j,k-1)
106     c5d(i,j,k) = c5d(i,j,k) - b5d(i,j,k)*d5d(i,j,k-1)
107     d5d(i,j,k) = d5d(i,j,k) - b5d(i,j,k)*e5d(i,j,k-1)
108     y5d(i,j,k,bi,bj) = y5d(i,j,k,bi,bj)
109     & - b5d(i,j,k)*y5d(i,j,k-1,bi,bj)
110     & - a5d(i,j,k)*y5d(i,j,k-2,bi,bj)
111     IF ( c5d(i,j,k).NE.0. _d 0 ) THEN
112 jmc 1.1 c5d(i,j,k) = 1. _d 0 / c5d(i,j,k)
113 jmc 1.2 ELSE
114 jmc 1.1 c5d(i,j,k) = 0. _d 0
115     errCode = 1
116 jmc 1.2 ENDIF
117     ENDDO
118 jmc 1.1 ENDDO
119 jmc 1.2 C- end if k= .. ; end of k loop
120     ENDIF
121 jmc 1.1 ENDDO
122    
123     C-- Backward sweep (starting from bottom)
124 jmc 1.2 DO k=Nr,1,-1
125     IF (k.EQ.Nr) THEN
126     DO j=jMin,jMax
127     DO i=iMin,iMax
128     y5d(i,j,k,bi,bj) = y5d(i,j,k,bi,bj)*c5d(i,j,k)
129     ENDDO
130     ENDDO
131     ELSEIF (k.EQ.Nr-1) THEN
132     DO j=jMin,jMax
133     DO i=iMin,iMax
134     y5d(i,j,k,bi,bj) = ( y5d(i,j,k,bi,bj)
135     & - d5d(i,j,k)*y5d(i,j,k+1,bi,bj)
136     & )*c5d(i,j,k)
137     ENDDO
138     ENDDO
139     ELSE
140     DO j=jMin,jMax
141     DO i=iMin,iMax
142     y5d(i,j,k,bi,bj) = ( y5d(i,j,k,bi,bj)
143     & - d5d(i,j,k)*y5d(i,j,k+1,bi,bj)
144     & - e5d(i,j,k)*y5d(i,j,k+2,bi,bj)
145     & )*c5d(i,j,k)
146     ENDDO
147 jmc 1.1 ENDDO
148 jmc 1.2 C- end if k= .. ; end of k loop
149     ENDIF
150 jmc 1.1 ENDDO
151    
152     RETURN
153     END

  ViewVC Help
Powered by ViewVC 1.1.22