25 |
#include "EEPARAMS.h" |
#include "EEPARAMS.h" |
26 |
#include "PARAMS.h" |
#include "PARAMS.h" |
27 |
#include "GRID.h" |
#include "GRID.h" |
28 |
|
#include "SURFACE.h" |
29 |
#include "CG3D.h" |
#include "CG3D.h" |
30 |
#include "SOLVE_FOR_PRESSURE3D.h" |
#include "SOLVE_FOR_PRESSURE3D.h" |
31 |
#ifdef ALLOW_OBCS |
#ifdef ALLOW_OBCS |
47 |
C myNorm - Work variable used in clculating normalisation factor |
C myNorm - Work variable used in clculating normalisation factor |
48 |
CHARACTER*(MAX_LEN_MBUF) msgBuf |
CHARACTER*(MAX_LEN_MBUF) msgBuf |
49 |
INTEGER bi, bj |
INTEGER bi, bj |
50 |
INTEGER I, J, K |
INTEGER I, J, K, ks |
51 |
_RL faceArea |
_RL faceArea |
52 |
_RS myNorm |
_RS myNorm |
53 |
_RL theRecip_Dr |
_RL theRecip_Dr |
68 |
aW3d(I,J,K,bi,bj) = 0. |
aW3d(I,J,K,bi,bj) = 0. |
69 |
aS3d(I,J,K,bi,bj) = 0. |
aS3d(I,J,K,bi,bj) = 0. |
70 |
aV3d(I,J,K,bi,bj) = 0. |
aV3d(I,J,K,bi,bj) = 0. |
71 |
|
aC3d(I,J,K,bi,bj) = 0. |
72 |
zMC (I,J,K,bi,bj) = 0. |
zMC (I,J,K,bi,bj) = 0. |
73 |
zML (I,J,K,bi,bj) = 0. |
zML (I,J,K,bi,bj) = 0. |
74 |
zMU (I,J,K,bi,bj) = 0. |
zMU (I,J,K,bi,bj) = 0. |
85 |
C- From common bloc SFP3D_COMMON_R: |
C- From common bloc SFP3D_COMMON_R: |
86 |
DO J=1-OLy,sNy+OLy |
DO J=1-OLy,sNy+OLy |
87 |
DO I=1-OLx,sNx+OLx |
DO I=1-OLx,sNx+OLx |
|
c cg3d_x(I,J,K,bi,bj) = 0. |
|
88 |
cg3d_b(I,J,K,bi,bj) = 0. |
cg3d_b(I,J,K,bi,bj) = 0. |
89 |
ENDDO |
ENDDO |
90 |
ENDDO |
ENDDO |
101 |
DO bi=myBxLo(myThid),myBxHi(myThid) |
DO bi=myBxLo(myThid),myBxHi(myThid) |
102 |
DO K=1,Nr |
DO K=1,Nr |
103 |
DO J=1,sNy |
DO J=1,sNy |
104 |
DO I=1,sNx |
DO I=1,sNx+1 |
105 |
faceArea = _dyG(I,J,bi,bj)*drF(K) |
faceArea = _dyG(I,J,bi,bj)*drF(K) |
106 |
& *_hFacW(I,J,K,bi,bj) |
& *_hFacW(I,J,K,bi,bj) |
107 |
aW3d(I,J,K,bi,bj) = faceArea*recip_dxC(I,J,bi,bj) |
aW3d(I,J,K,bi,bj) = faceArea*recip_dxC(I,J,bi,bj) |
108 |
|
myNorm = MAX(ABS(aW3d(I,J,K,bi,bj)),myNorm) |
109 |
|
ENDDO |
110 |
|
ENDDO |
111 |
|
DO J=1,sNy+1 |
112 |
|
DO I=1,sNx |
113 |
faceArea = _dxG(I,J,bi,bj)*drF(K) |
faceArea = _dxG(I,J,bi,bj)*drF(K) |
114 |
& *_hFacS(I,J,K,bi,bj) |
& *_hFacS(I,J,K,bi,bj) |
115 |
aS3d(I,J,K,bi,bj) = faceArea*recip_dyC(I,J,bi,bj) |
aS3d(I,J,K,bi,bj) = faceArea*recip_dyC(I,J,bi,bj) |
|
myNorm = MAX(ABS(aW3d(I,J,K,bi,bj)),myNorm) |
|
116 |
myNorm = MAX(ABS(aS3d(I,J,K,bi,bj)),myNorm) |
myNorm = MAX(ABS(aS3d(I,J,K,bi,bj)),myNorm) |
117 |
ENDDO |
ENDDO |
118 |
ENDDO |
ENDDO |
200 |
_END_MASTER( myThid ) |
_END_MASTER( myThid ) |
201 |
DO bj=myByLo(myThid),myByHi(myThid) |
DO bj=myByLo(myThid),myByHi(myThid) |
202 |
DO bi=myBxLo(myThid),myBxHi(myThid) |
DO bi=myBxLo(myThid),myBxHi(myThid) |
203 |
|
C- Set solver main diagonal term |
204 |
|
DO K=1,Nr |
205 |
|
DO J=1,sNy |
206 |
|
DO I=1,sNx |
207 |
|
aW = aW3d(I ,J,K,bi,bj) |
208 |
|
aE = aW3d(I+1,J,K,bi,bj) |
209 |
|
aN = aS3d(I,J+1,K,bi,bj) |
210 |
|
aS = aS3d(I,J ,K,bi,bj) |
211 |
|
aU = aV3d(I,J,K,bi,bj) |
212 |
|
IF ( K .NE. Nr ) THEN |
213 |
|
aL = aV3d(I,J,K+1,bi,bj) |
214 |
|
ELSE |
215 |
|
aL = 0. |
216 |
|
ENDIF |
217 |
|
aC3d(I,J,K,bi,bj) = -aW-aE-aN-aS-aU-aL |
218 |
|
ENDDO |
219 |
|
ENDDO |
220 |
|
ENDDO |
221 |
|
C- Add free-surface source term |
222 |
|
DO J=1,sNy |
223 |
|
DO I=1,sNx |
224 |
|
ks = ksurfC(I,J,bi,bj) |
225 |
|
IF ( ks.LE.Nr ) THEN |
226 |
|
aC3d(I,J,ks,bi,bj) = aC3d(I,J,ks,bi,bj) |
227 |
|
& -freeSurfFac*recip_Bo(I,J,bi,bj) |
228 |
|
& *rA(I,J,bi,bj)/deltaTMom/deltaTfreesurf |
229 |
|
ENDIF |
230 |
|
ENDDO |
231 |
|
ENDDO |
232 |
|
C- Matrix solver normalisation |
233 |
DO K=1,Nr |
DO K=1,Nr |
234 |
DO J=1,sNy |
DO J=1,sNy |
235 |
DO I=1,sNx |
DO I=1,sNx |
236 |
aW3d(I,J,K,bi,bj) = aW3d(I,J,K,bi,bj)*myNorm |
aW3d(I,J,K,bi,bj) = aW3d(I,J,K,bi,bj)*myNorm |
237 |
aS3d(I,J,K,bi,bj) = aS3d(I,J,K,bi,bj)*myNorm |
aS3d(I,J,K,bi,bj) = aS3d(I,J,K,bi,bj)*myNorm |
238 |
aV3d(I,J,K,bi,bj) = aV3d(I,J,K,bi,bj)*myNorm |
aV3d(I,J,K,bi,bj) = aV3d(I,J,K,bi,bj)*myNorm |
239 |
|
aC3d(I,J,K,bi,bj) = aC3d(I,J,K,bi,bj)*myNorm |
240 |
ENDDO |
ENDDO |
241 |
ENDDO |
ENDDO |
242 |
ENDDO |
ENDDO |
243 |
ENDDO |
ENDDO |
244 |
ENDDO |
ENDDO |
245 |
|
|
246 |
C-- Update overlap regions |
C-- Update overlap regions |
247 |
c _EXCH_XYZ_R4(aW3d, myThid) |
c _EXCH_XYZ_R4(aW3d, myThid) |
248 |
c _EXCH_XYZ_R4(aS3d, myThid) |
c _EXCH_XYZ_R4(aS3d, myThid) |
249 |
CALL EXCH_UV_XYZ_RS(aW3d,aS3d,.FALSE.,myThid) |
CALL EXCH_UV_XYZ_RS(aW3d,aS3d,.FALSE.,myThid) |
250 |
_EXCH_XYZ_R4(aV3d, myThid) |
_EXCH_XYZ_R4(aV3d, myThid) |
251 |
|
_EXCH_XYZ_R4(aC3d, myThid) |
252 |
CcnhDebugStarts |
CcnhDebugStarts |
253 |
C CALL PLOT_FIELD_XYZRS( aW3d, 'AW3D INI_CG3D.1' , Nr, 1, myThid ) |
C CALL PLOT_FIELD_XYZRS( aW3d, 'AW3D INI_CG3D.1' , Nr, 1, myThid ) |
254 |
C CALL PLOT_FIELD_XYZRS( aS3d, 'AS3D INI_CG3D.1' , Nr, 1, myThid ) |
C CALL PLOT_FIELD_XYZRS( aS3d, 'AS3D INI_CG3D.1' , Nr, 1, myThid ) |
261 |
C assuming zML is lower and zMU is upper! |
C assuming zML is lower and zMU is upper! |
262 |
DO bj=myByLo(myThid),myByHi(myThid) |
DO bj=myByLo(myThid),myByHi(myThid) |
263 |
DO bi=myBxLo(myThid),myBxHi(myThid) |
DO bi=myBxLo(myThid),myBxHi(myThid) |
264 |
DO K=1,Nr |
DO K=1,Nr |
265 |
DO J=1,sNy |
DO J=1,sNy |
266 |
DO I=1,sNx |
DO I=1,sNx |
267 |
aW = aW3d(I ,J,K,bi,bj) |
IF ( aC3d(I,J,K,bi,bj) .NE. 0. ) THEN |
268 |
aE = aW3d(I+1,J,K,bi,bj) |
zMC(i,j,k,bi,bj) = aC3d(I,J,K,bi,bj) |
269 |
aN = aS3d(I,J+1,K,bi,bj) |
zML(i,j,k,bi,bj) = aV3d(I,J,K,bi,bj) |
270 |
aS = aS3d(I,J ,K,bi,bj) |
zMU(i,j,k,bi,bj) = 0. |
271 |
IF ( K .NE. 1 ) THEN |
IF ( K.NE.Nr ) |
272 |
aU = aV3d(I,J,K,bi,bj) |
& zMU(i,j,k,bi,bj) = aV3d(I,J,K+1,bi,bj) |
|
ELSE |
|
|
aU = 0 |
|
|
ENDIF |
|
|
IF ( K .NE. Nr ) THEN |
|
|
aL = aV3d(I,J,K+1,bi,bj) |
|
|
ELSE |
|
|
aL = 0 |
|
|
ENDIF |
|
|
aC = -aW-aE-aN-aS-aU-aL |
|
|
IF ( K .EQ. 1 .AND. aC .NE. 0. ) THEN |
|
|
aC = aC |
|
|
& -freeSurfFac*myNorm*(horiVertRatio/gravity)* |
|
|
& rA(I,J,bi,bj)/deltaTMom/deltaTMom |
|
|
ENDIF |
|
|
IF ( aC .NE. 0. ) THEN |
|
|
zMC(i,j,k,bi,bj) = aC |
|
|
zMU(i,j,k,bi,bj) = aL |
|
|
zML(i,j,k,bi,bj) = aU |
|
273 |
CcnhDebugStarts |
CcnhDebugStarts |
274 |
C zMC(i,j,k,bi,bj) = 1. |
C zMC(i,j,k,bi,bj) = 1. |
275 |
C zMU(i,j,k,bi,bj) = 0. |
C zMU(i,j,k,bi,bj) = 0. |
291 |
& zMU(i,j,1,bi,bj)*zMC(i,j,1,bi,bj) |
& zMU(i,j,1,bi,bj)*zMC(i,j,1,bi,bj) |
292 |
ENDDO |
ENDDO |
293 |
ENDDO |
ENDDO |
294 |
DO K=2,Nr |
DO K=2,Nr |
295 |
DO J=1,sNy |
DO J=1,sNy |
296 |
DO I=1,sNx |
DO I=1,sNx |
297 |
zMC(i,j,k,bi,bj) = 1. _d 0 / |
zMC(i,j,k,bi,bj) = 1. _d 0 / |
300 |
ENDDO |
ENDDO |
301 |
ENDDO |
ENDDO |
302 |
ENDDO |
ENDDO |
303 |
DO K=1,Nr |
DO K=1,Nr |
304 |
DO J=1,sNy |
DO J=1,sNy |
305 |
DO I=1,sNx |
DO I=1,sNx |
306 |
aW = aW3d(I ,J,K,bi,bj) |
aW = aW3d(I ,J,K,bi,bj) |
310 |
IF ( K .NE. 1 ) THEN |
IF ( K .NE. 1 ) THEN |
311 |
aU = aV3d(I,J,K-1,bi,bj) |
aU = aV3d(I,J,K-1,bi,bj) |
312 |
ELSE |
ELSE |
313 |
aU = 0 |
aU = 0. |
314 |
ENDIF |
ENDIF |
315 |
IF ( K .NE. Nr ) THEN |
IF ( K .NE. Nr ) THEN |
316 |
aL = aV3d(I,J,K+1,bi,bj) |
aL = aV3d(I,J,K+1,bi,bj) |
317 |
ELSE |
ELSE |
318 |
aL = 0 |
aL = 0. |
319 |
ENDIF |
ENDIF |
320 |
aC = -aW-aE-aN-aS-aU-aL |
aC = -aW-aE-aN-aS-aU-aL |
321 |
IF ( aC .EQ. 0. ) THEN |
IF ( aC .EQ. 0. ) THEN |