7 |
# include "SHELFICE_OPTIONS.h" |
# include "SHELFICE_OPTIONS.h" |
8 |
#endif |
#endif |
9 |
|
|
|
|
|
10 |
CBOP |
CBOP |
11 |
C !ROUTINE: UPDATE_CG2D |
C !ROUTINE: UPDATE_CG2D |
12 |
C !INTERFACE: |
C !INTERFACE: |
32 |
#include "GRID.h" |
#include "GRID.h" |
33 |
#include "SURFACE.h" |
#include "SURFACE.h" |
34 |
#include "CG2D.h" |
#include "CG2D.h" |
35 |
|
#ifdef ALLOW_SOLVE4_PS_AND_DRAG |
36 |
|
# include "DYNVARS.h" |
37 |
|
#endif /* ALLOW_SOLVE4_PS_AND_DRAG */ |
38 |
#ifdef ALLOW_PRESSURE_RELEASE_CODE |
#ifdef ALLOW_PRESSURE_RELEASE_CODE |
39 |
# include "SHELFICE.h" |
# include "SHELFICE.h" |
40 |
#endif |
#endif |
|
#ifdef IMPLICIT_BOTTOMSIDEDRAG |
|
|
# include "MOM_VISC.h" |
|
|
#endif |
|
|
|
|
41 |
|
|
42 |
C !INPUT/OUTPUT PARAMETERS: |
C !INPUT/OUTPUT PARAMETERS: |
43 |
C === Routine arguments === |
C === Routine arguments === |
59 |
INTEGER i, j, k, ks |
INTEGER i, j, k, ks |
60 |
_RL faceArea |
_RL faceArea |
61 |
_RL pW_tmp, pS_tmp |
_RL pW_tmp, pS_tmp |
62 |
_RL depth, eff_depth, depth_fac, pinit |
LOGICAL updatePreCond |
63 |
#ifdef ALLOW_PRESSURE_RELEASE_CODE |
#ifdef ALLOW_PRESSURE_RELEASE_CODE |
64 |
_RL curPrelVisc, avgGrd |
_RL curPrelVisc, avgGrd |
65 |
|
_RL depth, eff_depth, depth_fac, pinit |
66 |
|
_RL drag_fac |
67 |
#endif |
#endif |
|
LOGICAL updatePreCond |
|
68 |
CEOP |
CEOP |
69 |
|
|
70 |
C-- Decide when to update cg2d Preconditioner : |
C-- Decide when to update cg2d Preconditioner : |
89 |
#endif /* ALLOW_AUTODIFF */ |
#endif /* ALLOW_AUTODIFF */ |
90 |
ENDDO |
ENDDO |
91 |
ENDDO |
ENDDO |
92 |
DO k=1,Nr |
#ifdef ALLOW_SOLVE4_PS_AND_DRAG |
93 |
DO j=1,sNy+1 |
IF ( selectImplicitDrag.EQ.2 ) THEN |
94 |
DO i=1,sNx+1 |
DO k=1,Nr |
95 |
|
DO j=1,sNy+1 |
96 |
|
DO i=1,sNx+1 |
97 |
|
faceArea = _dyG(i,j,bi,bj)*drF(k)*deepFacC(k)*rhoFacC(k) |
98 |
|
& *_hFacW(i,j,k,bi,bj) |
99 |
|
#ifdef ALLOW_PRESSURE_RELEASE_CODE |
100 |
|
IF (depthColW(i,j,bi,bj).lt.cg2dminColumnEps) THEN |
101 |
|
|
102 |
|
|
103 |
|
drag_fac = _recip_hFacW(i,j,k,bi,bj)**2*recip_drF(k)**2* |
104 |
|
& 30000. * viscArNr(k) * |
105 |
|
& 1./(1+exp(-10./cg2dminColumnEps* |
106 |
|
& (-1.)*(depthColW(i,j,bi,bj)-cg2dminColumnEps/2))) |
107 |
|
|
108 |
|
aW2d(i,j,bi,bj) = aW2d(i,j,bi,bj) |
109 |
|
& + faceArea*dU_psFacX(i,j,k,bi,bj) |
110 |
|
& / (1 + drag_fac*deltaTmom) |
111 |
|
ELSE |
112 |
|
#endif |
113 |
|
aW2d(i,j,bi,bj) = aW2d(i,j,bi,bj) |
114 |
|
& + faceArea*dU_psFacX(i,j,k,bi,bj) |
115 |
|
& *recip_dxC(i,j,bi,bj) |
116 |
|
#ifdef ALLOW_PRESSURE_RELEASE_CODE |
117 |
|
ENDIF |
118 |
|
#endif |
119 |
|
|
120 |
|
faceArea = _dxG(i,j,bi,bj)*drF(k)*deepFacC(k)*rhoFacC(k) |
121 |
|
& *_hFacS(i,j,k,bi,bj) |
122 |
|
#ifdef ALLOW_PRESSURE_RELEASE_CODE |
123 |
|
IF (depthColS(i,j,bi,bj).lt.cg2dminColumnEps) THEN |
124 |
|
|
125 |
|
drag_fac = _recip_hFacS(i,j,k,bi,bj)**2*recip_drF(k)**2* |
126 |
|
& 30000. * viscArNr(k)* |
127 |
|
& 1./(1+exp(-10./cg2dminColumnEps* |
128 |
|
& (-1.)*(depthColS(i,j,bi,bj)-cg2dminColumnEps/2))) |
129 |
|
|
130 |
|
|
131 |
|
aS2d(i,j,bi,bj) = aS2d(i,j,bi,bj) |
132 |
|
& + faceArea*dV_psFacY(i,j,k,bi,bj) |
133 |
|
& / (1 + drag_fac*deltaTmom) |
134 |
|
ELSE |
135 |
|
#endif |
136 |
|
aS2d(i,j,bi,bj) = aS2d(i,j,bi,bj) |
137 |
|
& + faceArea*dV_psFacY(i,j,k,bi,bj) |
138 |
|
& *recip_dyC(i,j,bi,bj) |
139 |
|
#ifdef ALLOW_PRESSURE_RELEASE_CODE |
140 |
|
ENDIF |
141 |
|
#endif |
142 |
|
ENDDO |
143 |
|
ENDDO |
144 |
|
ENDDO |
145 |
|
ELSE |
146 |
|
#endif /* ALLOW_SOLVE4_PS_AND_DRAG */ |
147 |
|
DO k=1,Nr |
148 |
|
DO j=1,sNy+1 |
149 |
|
DO i=1,sNx+1 |
150 |
C deep-model: *deepFacC (faceArea), /deepFacC (recip_dx,y): => no net effect |
C deep-model: *deepFacC (faceArea), /deepFacC (recip_dx,y): => no net effect |
151 |
faceArea = _dyG(i,j,bi,bj)*drF(k) |
|
152 |
& *_hFacW(i,j,k,bi,bj) |
#ifdef ALLOW_PRESSURE_RELEASE_CODE |
153 |
aW2d(i,j,bi,bj) = aW2d(i,j,bi,bj) |
IF (depthColW(i,j,bi,bj).lt.cg2dminColumnEps) THEN |
154 |
#ifndef IMPLICIT_BOTTOMSIDEDRAG |
drag_fac = _recip_hFacW(i,j,k,bi,bj)**2*recip_drF(k)**2* |
155 |
& + faceArea*recip_dxC(i,j,bi,bj) |
& 30000. * viscArNr(k)* |
156 |
#else |
& 1./(1+exp(-10./cg2dminColumnEps* |
157 |
& + faceArea/ |
& (-1.)*(depthColW(i,j,bi,bj)-cg2dminColumnEps/2))) |
158 |
& (1 - uDragTermsCommon(i,j,k,bi,bj)*deltaTmom) * |
ELSE |
159 |
& recip_dxC(i,j,bi,bj) |
drag_fac = 0. _d 0 |
160 |
#endif |
ENDIF |
|
|
|
|
faceArea = _dxG(i,j,bi,bj)*drF(k) |
|
|
& *_hFacS(i,j,k,bi,bj) |
|
|
aS2d(i,j,bi,bj) = aS2d(i,j,bi,bj) |
|
|
#ifndef IMPLICIT_BOTTOMSIDEDRAG |
|
|
& + faceArea*recip_dyC(i,j,bi,bj) |
|
|
#else |
|
|
& + faceArea/ |
|
|
& (1 - vDragTermsCommon(i,j,k,bi,bj)*deltaTmom) * |
|
|
& recip_dyC(i,j,bi,bj) |
|
161 |
#endif |
#endif |
162 |
|
faceArea = _dyG(i,j,bi,bj)*drF(k) |
163 |
|
& *_hFacW(i,j,k,bi,bj) |
164 |
|
|
165 |
|
|
166 |
|
aW2d(i,j,bi,bj) = aW2d(i,j,bi,bj) |
167 |
|
& + faceArea*recip_dxC(i,j,bi,bj) |
168 |
|
#ifdef ALLOW_PRESSURE_RELEASE_CODE |
169 |
|
& / (1 + drag_fac*deltaTmom) |
170 |
|
#endif |
171 |
|
#ifdef ALLOW_PRESSURE_RELEASE_CODE |
172 |
|
IF (depthColS(i,j,bi,bj).lt.cg2dminColumnEps) THEN |
173 |
|
drag_fac = _recip_hFacS(i,j,k,bi,bj)**2*recip_drF(k)**2* |
174 |
|
& 30000. * viscArNr(k) * |
175 |
|
& 1./(1+exp(-10./cg2dminColumnEps* |
176 |
|
& (-1.)*(depthColS(i,j,bi,bj)-cg2dminColumnEps/2))) |
177 |
|
ELSE |
178 |
|
drag_fac = 0. _d 0 |
179 |
|
ENDIF |
180 |
|
#endif |
181 |
|
faceArea = _dxG(i,j,bi,bj)*drF(k) |
182 |
|
& *_hFacS(i,j,k,bi,bj) |
183 |
|
|
184 |
|
aS2d(i,j,bi,bj) = aS2d(i,j,bi,bj) |
185 |
|
& + faceArea*recip_dyC(i,j,bi,bj) |
186 |
|
#ifdef ALLOW_PRESSURE_RELEASE_CODE |
187 |
|
& / (1 + drag_fac*deltaTmom) |
188 |
|
#endif |
189 |
|
ENDDO |
190 |
ENDDO |
ENDDO |
191 |
ENDDO |
ENDDO |
192 |
ENDDO |
#ifdef ALLOW_SOLVE4_PS_AND_DRAG |
193 |
|
ENDIF |
194 |
|
#endif /* ALLOW_SOLVE4_PS_AND_DRAG */ |
195 |
DO j=1,sNy+1 |
DO j=1,sNy+1 |
196 |
DO i=1,sNx+1 |
DO i=1,sNx+1 |
197 |
aW2d(i,j,bi,bj) = aW2d(i,j,bi,bj)*cg2dNorm |
aW2d(i,j,bi,bj) = aW2d(i,j,bi,bj)*cg2dNorm |
199 |
#ifdef ALLOW_OBCS |
#ifdef ALLOW_OBCS |
200 |
& *maskInC(i,j,bi,bj)*maskInC(i-1,j,bi,bj) |
& *maskInC(i,j,bi,bj)*maskInC(i-1,j,bi,bj) |
201 |
#endif |
#endif |
|
#ifdef ALLOW_PRESSURE_RELEASE_CODE |
|
|
& |
|
|
#endif |
|
202 |
aS2d(i,j,bi,bj) = aS2d(i,j,bi,bj)*cg2dNorm |
aS2d(i,j,bi,bj) = aS2d(i,j,bi,bj)*cg2dNorm |
203 |
& *implicSurfPress*implicDiv2DFlow |
& *implicSurfPress*implicDiv2DFlow |
204 |
#ifdef ALLOW_OBCS |
#ifdef ALLOW_OBCS |
206 |
#endif |
#endif |
207 |
ENDDO |
ENDDO |
208 |
ENDDO |
ENDDO |
|
! call write_fld_xy_rl('as2d0','',as2d,0,mythid) |
|
209 |
#ifdef ALLOW_PRESSURE_RELEASE_CODE |
#ifdef ALLOW_PRESSURE_RELEASE_CODE |
210 |
DO j=1,sNy+1 |
DO j=1,sNy+1 |
211 |
DO i=1,sNx+1 |
DO i=1,sNx+1 |
247 |
ENDDO |
ENDDO |
248 |
ENDDO |
ENDDO |
249 |
#endif |
#endif |
|
! call write_fld_xy_rl('as2d0','',as2d,0,mythid) |
|
250 |
C-- compute matrix main diagonal : |
C-- compute matrix main diagonal : |
251 |
IF ( deepAtmosphere ) THEN |
IF ( deepAtmosphere ) THEN |
252 |
DO j=1,sNy |
DO j=1,sNy |
256 |
& aW2d(i,j,bi,bj) + aW2d(i+1, j ,bi,bj) |
& aW2d(i,j,bi,bj) + aW2d(i+1, j ,bi,bj) |
257 |
& +aS2d(i,j,bi,bj) + aS2d( i ,j+1,bi,bj) |
& +aS2d(i,j,bi,bj) + aS2d( i ,j+1,bi,bj) |
258 |
& +freeSurfFac*cg2dNorm*recip_Bo(i,j,bi,bj)*deepFac2F(ks) |
& +freeSurfFac*cg2dNorm*recip_Bo(i,j,bi,bj)*deepFac2F(ks) |
259 |
& *rA(i,j,bi,bj)/deltaTMom/deltaTfreesurf |
& *rA(i,j,bi,bj)/deltaTMom/deltaTFreeSurf |
260 |
& ) |
& ) |
261 |
ENDDO |
ENDDO |
262 |
ENDDO |
ENDDO |
267 |
& aW2d(i,j,bi,bj) + aW2d(i+1, j ,bi,bj) |
& aW2d(i,j,bi,bj) + aW2d(i+1, j ,bi,bj) |
268 |
& +aS2d(i,j,bi,bj) + aS2d( i ,j+1,bi,bj) |
& +aS2d(i,j,bi,bj) + aS2d( i ,j+1,bi,bj) |
269 |
& +freeSurfFac*cg2dNorm*recip_Bo(i,j,bi,bj) |
& +freeSurfFac*cg2dNorm*recip_Bo(i,j,bi,bj) |
270 |
& *rA(i,j,bi,bj)/deltaTMom/deltaTfreesurf |
& *rA(i,j,bi,bj)/deltaTMom/deltaTFreeSurf |
271 |
& ) |
& ) |
272 |
ENDDO |
ENDDO |
273 |
ENDDO |
ENDDO |
311 |
C- if update Preconditioner : end |
C- if update Preconditioner : end |
312 |
ENDIF |
ENDIF |
313 |
|
|
|
|
|
314 |
RETURN |
RETURN |
315 |
END |
END |