51 |
INTEGER bi, bj |
INTEGER bi, bj |
52 |
INTEGER I, J, K |
INTEGER I, J, K |
53 |
_RL faceArea |
_RL faceArea |
54 |
_RL aC, aCw, aCs |
_RL pW_tmp, pS_tmp |
55 |
CEOP |
CEOP |
56 |
|
|
57 |
C-- Initialise laplace operator |
C-- Initialise laplace operator |
59 |
C aS2d: integral in Z Ay/dY |
C aS2d: integral in Z Ay/dY |
60 |
DO bj=myByLo(myThid),myByHi(myThid) |
DO bj=myByLo(myThid),myByHi(myThid) |
61 |
DO bi=myBxLo(myThid),myBxHi(myThid) |
DO bi=myBxLo(myThid),myBxHi(myThid) |
62 |
DO J=1,sNy |
DO J=1,sNy+1 |
63 |
DO I=1,sNx |
DO I=1,sNx+1 |
64 |
aW2d(I,J,bi,bj) = 0. _d 0 |
aW2d(I,J,bi,bj) = 0. _d 0 |
65 |
aS2d(I,J,bi,bj) = 0. _d 0 |
aS2d(I,J,bi,bj) = 0. _d 0 |
66 |
ENDDO |
ENDDO |
67 |
ENDDO |
ENDDO |
68 |
DO K=1,Nr |
DO K=1,Nr |
69 |
DO J=1,sNy |
DO J=1,sNy+1 |
70 |
DO I=1,sNx |
DO I=1,sNx+1 |
71 |
faceArea = _dyG(I,J,bi,bj)*drF(K) |
faceArea = _dyG(I,J,bi,bj)*drF(K) |
72 |
& *_hFacW(I,J,K,bi,bj) |
& *_hFacW(I,J,K,bi,bj) |
73 |
aW2d(I,J,bi,bj) = aW2d(I,J,bi,bj) + |
aW2d(I,J,bi,bj) = aW2d(I,J,bi,bj) + |
95 |
ENDDO |
ENDDO |
96 |
ENDIF |
ENDIF |
97 |
#endif |
#endif |
98 |
DO J=1,sNy |
DO J=1,sNy+1 |
99 |
DO I=1,sNx |
DO I=1,sNx+1 |
100 |
aW2d(I,J,bi,bj) = aW2d(I,J,bi,bj)*cg2dNorm |
aW2d(I,J,bi,bj) = aW2d(I,J,bi,bj)*cg2dNorm |
101 |
& *implicSurfPress*implicDiv2DFlow |
& *implicSurfPress*implicDiv2DFlow |
102 |
aS2d(I,J,bi,bj) = aS2d(I,J,bi,bj)*cg2dNorm |
aS2d(I,J,bi,bj) = aS2d(I,J,bi,bj)*cg2dNorm |
103 |
& *implicSurfPress*implicDiv2DFlow |
& *implicSurfPress*implicDiv2DFlow |
104 |
ENDDO |
ENDDO |
105 |
ENDDO |
ENDDO |
106 |
|
C-- Start to compute preconditioner matrix (use cg2d_q as temporary array) |
107 |
|
DO J=1,sNy |
108 |
|
DO I=1,sNx |
109 |
|
cg2d_q(I,J,bi,bj) = -( |
110 |
|
& aW2d(I,J,bi,bj) + aW2d(I+1,J ,bi,bj) |
111 |
|
& +aS2d(I,J,bi,bj) + aS2d(I ,J+1,bi,bj) |
112 |
|
& +freeSurfFac*cg2dNorm*recip_Bo(I,J,bi,bj)* |
113 |
|
& rA(I,J,bi,bj)/deltaTMom/deltaTMom |
114 |
|
& ) |
115 |
|
ENDDO |
116 |
|
ENDDO |
117 |
ENDDO |
ENDDO |
118 |
ENDDO |
ENDDO |
119 |
|
|
120 |
C-- Update overlap regions |
C-- Update overlap regions |
121 |
c _EXCH_XY_R4(aW2d, myThid) |
_EXCH_XY_R8(cg2d_q, myThid) |
|
c _EXCH_XY_R4(aS2d, myThid) |
|
|
CALL EXCH_UV_XY_RS(aW2d,aS2d,.FALSE.,myThid) |
|
122 |
|
|
123 |
C-- Initialise preconditioner |
C-- Initialise preconditioner |
124 |
DO bj=myByLo(myThid),myByHi(myThid) |
DO bj=myByLo(myThid),myByHi(myThid) |
125 |
DO bi=myBxLo(myThid),myBxHi(myThid) |
DO bi=myBxLo(myThid),myBxHi(myThid) |
126 |
DO J=1,sNy |
DO J=1,sNy+1 |
127 |
DO I=1,sNx |
DO I=1,sNx+1 |
128 |
pC(I,J,bi,bj) = 1. _d 0 |
IF ( cg2d_q(I,J,bi,bj) .EQ. 0. ) THEN |
|
aC = -( |
|
|
& aW2d(I,J,bi,bj) + aW2d(I+1,J ,bi,bj) |
|
|
& +aS2d(I,J,bi,bj) + aS2d(I ,J+1,bi,bj) |
|
|
& +freeSurfFac*cg2dNorm*recip_Bo(I,J,bi,bj)* |
|
|
& rA(I,J,bi,bj)/deltaTMom/deltaTMom |
|
|
& ) |
|
|
aCs = -( |
|
|
& aW2d(I,J-1,bi,bj) + aW2d(I+1,J-1,bi,bj) |
|
|
& +aS2d(I,J-1,bi,bj) + aS2d(I ,J ,bi,bj) |
|
|
& +freeSurfFac*cg2dNorm*recip_Bo(I,J-1,bi,bj)* |
|
|
& rA(I,J-1,bi,bj)/deltaTMom/deltaTMom |
|
|
& ) |
|
|
aCw = -( |
|
|
& aW2d(I-1,J,bi,bj) + aW2d(I ,J ,bi,bj) |
|
|
& +aS2d(I-1,J,bi,bj) + aS2d(I-1,J+1,bi,bj) |
|
|
& +freeSurfFac*cg2dNorm*recip_Bo(I-1,J,bi,bj)* |
|
|
& rA(I-1,J,bi,bj)/deltaTMom/deltaTMom |
|
|
& ) |
|
|
IF ( aC .EQ. 0. ) THEN |
|
129 |
pC(I,J,bi,bj) = 1. _d 0 |
pC(I,J,bi,bj) = 1. _d 0 |
130 |
ELSE |
ELSE |
131 |
pC(I,J,bi,bj) = 1. _d 0 / aC |
pC(I,J,bi,bj) = 1. _d 0 / cg2d_q(I,J,bi,bj) |
132 |
ENDIF |
ENDIF |
133 |
IF ( aC + aCw .EQ. 0. ) THEN |
pW_tmp = cg2d_q(I,J,bi,bj)+cg2d_q(I-1,J,bi,bj) |
134 |
|
IF ( pW_tmp .EQ. 0. ) THEN |
135 |
pW(I,J,bi,bj) = 0. |
pW(I,J,bi,bj) = 0. |
136 |
ELSE |
ELSE |
137 |
pW(I,J,bi,bj) = |
pW(I,J,bi,bj) = |
138 |
& -aW2d(I ,J ,bi,bj)/((cg2dpcOffDFac *(aCw+aC))**2 ) |
& -aW2d(I,J,bi,bj)/((cg2dpcOffDFac *pW_tmp)**2 ) |
139 |
ENDIF |
ENDIF |
140 |
IF ( aC + aCs .EQ. 0. ) THEN |
pS_tmp = cg2d_q(I,J,bi,bj)+cg2d_q(I,J-1,bi,bj) |
141 |
|
IF ( pS_tmp .EQ. 0. ) THEN |
142 |
pS(I,J,bi,bj) = 0. |
pS(I,J,bi,bj) = 0. |
143 |
ELSE |
ELSE |
144 |
pS(I,J,bi,bj) = |
pS(I,J,bi,bj) = |
145 |
& -aS2d(I ,J ,bi,bj)/((cg2dpcOffDFac *(aCs+aC))**2 ) |
& -aS2d(I,J,bi,bj)/((cg2dpcOffDFac *pS_tmp)**2 ) |
146 |
ENDIF |
ENDIF |
147 |
ENDDO |
ENDDO |
148 |
ENDDO |
ENDDO |
149 |
ENDDO |
ENDDO |
150 |
ENDDO |
ENDDO |
|
C-- Update overlap regions |
|
|
_EXCH_XY_R4(pC, myThid) |
|
|
c _EXCH_XY_R4(pW, myThid) |
|
|
c _EXCH_XY_R4(pS, myThid) |
|
|
CALL EXCH_UV_XY_RS(pW,pS,.FALSE.,myThid) |
|
151 |
|
|
152 |
#endif /* NONLIN_FRSURF */ |
#endif /* NONLIN_FRSURF */ |
153 |
|
|