** Warning **
Issuing rollback() due to DESTROY without explicit disconnect() of DBD::mysql::db handle dbname=MITgcm at /usr/local/share/lxr/lib/LXR/Common.pm line 1224.
Last-Modified: Tue, 8 Dec 2025 06:09:06 GMT
Content-Type: text/html; charset=utf-8
MITgcm/MITgcm/pkg/streamice/streamice_tridiag_solve.F
File indexing completed on 2018-03-02 18:44:21 UTC
view on github raw file Latest commit add29e06 on 2018-01-31 20:35:05 UTC
5ca83cd8f7 Dani* 0001 #include "STREAMICE_OPTIONS.h "
0002
0003
0004
0005
0006
887f427c62 Jean* 0007 SUBROUTINE STREAMICE_TRIDIAG_SOLVE (
5ca83cd8f7 Dani* 0008 U cg_Uin ,
0009 U cg_Vin ,
0010 U cg_Bu ,
0011 I A_uu ,
0012 I umask ,
0013 I myThid )
0014
887f427c62 Jean* 0015
5ca83cd8f7 Dani* 0016
0017
0018
0019
0020 IMPLICIT NONE
0021
0022 #include "SIZE.h "
0023 #include "EEPARAMS.h "
0024 #include "PARAMS.h "
0025 #include "STREAMICE.h "
0026 #include "STREAMICE_CG.h "
0027
0028 _RL cg_Uin (1-OLx :sNx +OLx ,1-OLy :sNy +OLy ,nSx ,nSy )
0029 _RL cg_Vin (1-OLx :sNx +OLx ,1-OLy :sNy +OLy ,nSx ,nSy )
0030 _RL cg_Bu (1-OLx :sNx +OLx ,1-OLy :sNy +OLy ,nSx ,nSy )
0031 _RL A_uu (1-OLx :sNx +OLx ,1-OLy :sNy +OLy ,nSx ,nSy ,-1:1,-1:1)
0032 _RS umask (1-OLx :sNx +OLx ,1-OLy :sNy +OLy ,nSx ,nSy )
0033 INTEGER myThid
0034
0035 INTEGER iMin ,iMax ,i ,j ,k
0036 _RL aMat (1:Nx )
0037 _RL bMat (1:Nx )
0038 _RL cMat (1:Nx )
0039 _RL yMat (1:Nx )
0040 _RL bet (1:Nx )
0041 _RL tmpvar
0042 INTEGER errCode
887f427c62 Jean* 0043
5ca83cd8f7 Dani* 0044
0045
0046
0047
0048
0049
0050
0051
0052
0053
0054
0055
0056
887f427c62 Jean* 0057
5ca83cd8f7 Dani* 0058 IF (nPx .gt. 1 .or. nSx .gt. 1) THEN
0059 STOP 'must be serial for tridiag solve'
0060 ENDIF
0061
0062 errCode = 0
0063
0064 imax = 0
0065 iMin = 2
0066 do i =imin ,Nx
0067 if (umask (i ,1,1,1).eq. 1.0) THEN
0068
0069 aMat (i )=0.0
0070 bmat (i )=0.0
0071 cmat (i )=0.0
0072 ymat (i )=0.0
0073 do j =-1,1
0074 do k =1,3
0075 aMat (i ) = amat (i )+A_uu (i ,k ,1,1,-1,j )
0076 bMat (i ) = bmat (i )+A_uu (i ,k ,1,1,0,j )
0077 cMat (i ) = cmat (i )+A_uu (i ,k ,1,1,1,j )
0078 enddo
0079 yMat (i ) = ymat (i )+cg_Bu (i ,j +2,1,1)
0080 enddo
0081 else
0082 iMax = i -1
0083 exit
0084 endif
0085 enddo
887f427c62 Jean* 0086
5ca83cd8f7 Dani* 0087 IF (imax .eq. 0) THEN
0088 imax =Nx
0089 ENDIF
0090
887f427c62 Jean* 0091
0092 IF ( bMat (imin ).NE. 0. _d 0 ) THEN
5ca83cd8f7 Dani* 0093 bet (imin ) = 1. _d 0 / bMat (imin )
0094 ELSE
0095 bet (imin ) = 0. _d 0
0096 errCode = 1
0097 ENDIF
887f427c62 Jean* 0098
5ca83cd8f7 Dani* 0099 DO i =imin +1,imax
0100 tmpvar = bmat (i ) - amat (i )*cmat (i -1)*bet (i -1)
0101 IF ( tmpvar .NE. 0. _d 0 ) THEN
0102 bet (i ) = 1. _d 0 / tmpvar
0103 ELSE
0104 bet (i ) = 0. _d 0
0105 errCode = 1
0106 ENDIF
0107 ENDDO
0108
0109
0110 ymat (imin ) = ymat (imin )*bet (imin )
0111
0112 DO i =imin +1,imax
887f427c62 Jean* 0113 ymat (i ) = ( ymat (i )
5ca83cd8f7 Dani* 0114 & - amat (i )*ymat (i -1)
887f427c62 Jean* 0115 & )*bet (i )
5ca83cd8f7 Dani* 0116 ENDDO
0117
0118
0119 DO i =imax -1,imin ,-1
0120 ymat (i ) = ymat (i )
0121 & - cmat (i )*bet (i )*ymat (i +1)
0122 ENDDO
0123
0124 DO j =1,sNy
0125 DO i =imin ,imax
0126 cg_Uin (i ,j ,1,1) = ymat (i )
0127 ENDDO
0128 ENDDO
0129
0130 DO j =1,sNy
0131 DO i =1,sNx
0132 cg_Vin (i ,j ,1,1) = 0. _d 0
0133 ENDDO
0134 ENDDO
0135
0136 print *, "ERRORCODE", errcode
0137
0138 RETURN
0139 END