1 |
|
C $Header$ |
2 |
|
C $Name$ |
3 |
|
|
4 |
#include "STREAMICE_OPTIONS.h" |
#include "STREAMICE_OPTIONS.h" |
5 |
|
|
6 |
C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----| |
C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----| |
7 |
|
|
8 |
CBOP |
CBOP |
9 |
|
|
10 |
SUBROUTINE STREAMICE_TRIDIAG_SOLVE( |
SUBROUTINE STREAMICE_TRIDIAG_SOLVE( |
11 |
U cg_Uin, ! x-velocities |
U cg_Uin, ! x-velocities |
12 |
U cg_Vin, ! x-velocities |
U cg_Vin, ! x-velocities |
13 |
U cg_Bu, ! force in x dir |
U cg_Bu, ! force in x dir |
15 |
I umask, |
I umask, |
16 |
I myThid ) |
I myThid ) |
17 |
C /============================================================\ |
C /============================================================\ |
18 |
C | SUBROUTINE | |
C | SUBROUTINE | |
19 |
C | o | |
C | o | |
20 |
C |============================================================| |
C |============================================================| |
21 |
C | | |
C | | |
43 |
_RL bet(1:Nx) |
_RL bet(1:Nx) |
44 |
_RL tmpvar |
_RL tmpvar |
45 |
INTEGER errCode |
INTEGER errCode |
46 |
|
|
47 |
|
|
48 |
! CALL WRITE_FLD_XY_RL ("taud_tri","",cg_Bu,0,mythid) |
! CALL WRITE_FLD_XY_RL ("taud_tri","",cg_Bu,0,mythid) |
49 |
! CALL WRITE_FLD_XY_RL ("A_m1m1","",A_uu(:,:,:,:,-1,-1),0,mythid) |
! CALL WRITE_FLD_XY_RL ("A_m1m1","",A_uu(:,:,:,:,-1,-1),0,mythid) |
57 |
! CALL WRITE_FLD_XY_RL ("A_p1p1","",A_uu(:,:,:,:,1,1),0,mythid) |
! CALL WRITE_FLD_XY_RL ("A_p1p1","",A_uu(:,:,:,:,1,1),0,mythid) |
58 |
|
|
59 |
|
|
60 |
|
|
61 |
IF (nPx.gt.1 .or. nSx.gt.1) THEN |
IF (nPx.gt.1 .or. nSx.gt.1) THEN |
62 |
STOP 'must be serial for tridiag solve' |
STOP 'must be serial for tridiag solve' |
63 |
ENDIF |
ENDIF |
86 |
exit |
exit |
87 |
endif |
endif |
88 |
enddo |
enddo |
89 |
|
|
90 |
IF(imax.eq.0) THEN |
IF(imax.eq.0) THEN |
91 |
imax=Nx |
imax=Nx |
92 |
ENDIF |
ENDIF |
|
|
|
93 |
|
|
94 |
IF ( bMat(imin).NE.0. _d 0 ) THEN |
|
95 |
|
IF ( bMat(imin).NE.0. _d 0 ) THEN |
96 |
bet(imin) = 1. _d 0 / bMat(imin) |
bet(imin) = 1. _d 0 / bMat(imin) |
97 |
ELSE |
ELSE |
98 |
bet(imin) = 0. _d 0 |
bet(imin) = 0. _d 0 |
99 |
errCode = 1 |
errCode = 1 |
100 |
ENDIF |
ENDIF |
101 |
|
|
102 |
DO i=imin+1,imax |
DO i=imin+1,imax |
103 |
tmpvar = bmat(i) - amat(i)*cmat(i-1)*bet(i-1) |
tmpvar = bmat(i) - amat(i)*cmat(i-1)*bet(i-1) |
104 |
IF ( tmpvar .NE. 0. _d 0 ) THEN |
IF ( tmpvar .NE. 0. _d 0 ) THEN |
113 |
ymat(imin) = ymat(imin)*bet(imin) |
ymat(imin) = ymat(imin)*bet(imin) |
114 |
|
|
115 |
DO i=imin+1,imax |
DO i=imin+1,imax |
116 |
ymat(i) = ( ymat(i) |
ymat(i) = ( ymat(i) |
117 |
& - amat(i)*ymat(i-1) |
& - amat(i)*ymat(i-1) |
118 |
& )*bet(i) |
& )*bet(i) |
119 |
ENDDO |
ENDDO |
120 |
|
|
121 |
|
|