/[MITgcm]/MITgcm/pkg/seaice/seaice_lsr.F
ViewVC logotype

Contents of /MITgcm/pkg/seaice/seaice_lsr.F

Parent Directory Parent Directory | Revision Log Revision Log | View Revision Graph Revision Graph


Revision 1.13 - (show annotations) (download)
Mon Feb 5 03:19:14 2007 UTC (17 years, 2 months ago) by jmc
Branch: MAIN
CVS Tags: checkpoint58w_post, checkpoint58x_post, checkpoint58y_post, checkpoint58v_post
Changes since 1.12: +6 -2 lines
fix Pb with range of indices (avoid Pb with uninitialized array).

1 C $Header: /u/gcmpack/MITgcm/pkg/seaice/seaice_lsr.F,v 1.12 2006/06/06 05:05:18 mlosch Exp $
2 C $Name: $
3
4 #include "SEAICE_OPTIONS.h"
5
6 CStartOfInterface
7 SUBROUTINE SEAICE_LSR( ilcall, myThid )
8 C /==========================================================\
9 C | SUBROUTINE SEAICE_LSR |
10 C | o Solve ice momentum equation with an LSR dynamics solver|
11 C | (see Zhang and Hibler, JGR, 102, 8691-8702, 1997 |
12 C | and Zhang and Rothrock, MWR, 131, 845- 861, 2003) |
13 C | Written by Jinlun Zhang, PSC/UW, Feb-2001 |
14 C | zhang@apl.washington.edu |
15 C |==========================================================|
16 C | C-grid version by Martin Losch |
17 C \==========================================================/
18 IMPLICIT NONE
19
20 C === Global variables ===
21 #include "SIZE.h"
22 #include "EEPARAMS.h"
23 #include "PARAMS.h"
24 #include "GRID.h"
25 #include "SEAICE.h"
26 #include "SEAICE_PARAMS.h"
27
28 #ifdef ALLOW_AUTODIFF_TAMC
29 # include "tamc.h"
30 #endif
31
32 C === Routine arguments ===
33 C myThid - Thread no. that called this routine.
34 INTEGER ilcall
35 INTEGER myThid
36 CEndOfInterface
37
38 #ifdef SEAICE_CGRID
39 #ifdef SEAICE_ALLOW_DYNAMICS
40
41 C === Local variables ===
42 C i,j,bi,bj - Loop counters
43
44 INTEGER i, j, m, bi, bj, j1, j2, im, jm
45 INTEGER ICOUNT1, ICOUNT2, SOLV_MAX_ITERS, SOLV_NCHECK
46 INTEGER phexit
47
48 _RL WFAU, WFAV, WFAU1, WFAV1, WFAU2, WFAV2
49 _RL AA1, AA2, AA3, AA4, AA5, AA6, AA7, S1, S2, S1A, S2A
50
51 _RL AU (1-Olx:sNx+Olx,1-Oly:sNy+Oly,nSx,nSy)
52 _RL BU (1-Olx:sNx+Olx,1-Oly:sNy+Oly,nSx,nSy)
53 _RL CU (1-Olx:sNx+Olx,1-Oly:sNy+Oly,nSx,nSy)
54 _RL AV (1-Olx:sNx+Olx,1-Oly:sNy+Oly,nSx,nSy)
55 _RL BV (1-Olx:sNx+Olx,1-Oly:sNy+Oly,nSx,nSy)
56 _RL CV (1-Olx:sNx+Olx,1-Oly:sNy+Oly,nSx,nSy)
57 _RL UERR (1-Olx:sNx+Olx,1-Oly:sNy+Oly,nSx,nSy)
58 _RL FXY (1-Olx:sNx+Olx,1-Oly:sNy+Oly,nSx,nSy)
59
60 _RL URT(1-Olx:sNx+Olx), CUU(1-Olx:sNx+Olx)
61 _RL VRT(1-Oly:sNy+Oly), CVV(1-Oly:sNy+Oly)
62
63 _RL etaPlusZeta (1-Olx:sNx+Olx,1-Oly:sNy+Oly,nSx,nSy)
64 _RL zetaMinusEta(1-Olx:sNx+Olx,1-Oly:sNy+Oly,nSx,nSy)
65 _RL etaMeanZ (1-Olx:sNx+Olx,1-Oly:sNy+Oly,nSx,nSy)
66 _RL etaMeanU (1-Olx:sNx+Olx,1-Oly:sNy+Oly,nSx,nSy)
67 _RL etaMeanV (1-Olx:sNx+Olx,1-Oly:sNy+Oly,nSx,nSy)
68
69 _RL UVRT1 (1-Olx:sNx+Olx,1-Oly:sNy+Oly,nSx,nSy)
70 _RL UVRT2 (1-Olx:sNx+Olx,1-Oly:sNy+Oly,nSx,nSy)
71
72 _RL dVdy (1-Olx:sNx+Olx,1-Oly:sNy+Oly)
73 _RL dUdx (1-Olx:sNx+Olx,1-Oly:sNy+Oly)
74 _RL dUdy (1-Olx:sNx+Olx,1-Oly:sNy+Oly)
75
76 _RL SINWAT, COSWAT
77 _RL TEMPVAR
78
79 _RL PRESS (1-OLx:sNx+OLx,1-OLy:sNy+OLy, nSx,nSy)
80
81 C-- introduce turning angles
82 SINWAT=SIN(SEAICE_waterTurnAngle*deg2rad)
83 COSWAT=COS(SEAICE_waterTurnAngle*deg2rad)
84
85 C SET SOME VALUES
86 WFAU1=0.95 _d 0
87 WFAV1=0.95 _d 0
88 WFAU2=ZERO
89 WFAV2=ZERO
90
91 S1A=0.80 _d 0
92 S2A=0.80 _d 0
93 WFAU=WFAU1
94 WFAV=WFAV1
95
96 SOLV_MAX_ITERS=1500
97 SOLV_NCHECK=2
98
99 ICOUNT1=SOLV_MAX_ITERS
100 ICOUNT2=SOLV_MAX_ITERS
101
102 #ifdef ALLOW_AUTODIFF_TAMC
103 cph That's an important one! Note, that
104 cph * lsr is called twice, thus the icall index
105 cph * this storing is still outside the iteration loop
106 CADJ STORE uice = comlev1_lsr,
107 CADJ & key = ikey_dynamics + (ilcall-1)*nchklev_1
108 CADJ STORE vice = comlev1_lsr,
109 CADJ & key = ikey_dynamics + (ilcall-1)*nchklev_1
110 #endif /* ALLOW_AUTODIFF_TAMC */
111
112 CALL SEAICE_CALC_VISCOSITIES(
113 I uIceC, vIceC, zMin, zMax, hEffM, press0,
114 O eta, zeta, press,
115 #ifdef SEAICE_ALLOW_EVP
116 O seaice_div, seaice_tension, seaice_shear,
117 #endif /* SEAICE_ALLOW_EVP */
118 I myThid )
119
120 DO bj=myByLo(myThid),myByHi(myThid)
121 DO bi=myBxLo(myThid),myBxHi(myThid)
122 DO j=1-Oly+1,sNy+Oly-1
123 DO i=1-Olx+1,sNx+Olx-1
124 C NOW SET UP NON-LINEAR WATER DRAG, FORCEX, FORCEY
125 TEMPVAR = QUART*(
126 & (uIceC(I ,J,bi,bj)-GWATX(I ,J,bi,bj)
127 & +uIceC(I+1,J,bi,bj)-GWATX(I+1,J,bi,bj))**2
128 & +(vIceC(I,J ,bi,bj)-GWATY(I,J ,bi,bj)
129 & +vIceC(I,J+1,bi,bj)-GWATY(I,J+1,bi,bj))**2)
130 IF ( TEMPVAR .LE. (QUART/SEAICE_waterDrag)**2 ) THEN
131 DWATN(I,J,bi,bj)=QUART
132 ELSE
133 DWATN(I,J,bi,bj)=SEAICE_waterDrag*SQRT(TEMPVAR)
134 ENDIF
135 DWATN(I,J,bi,bj) = DWATN(I,J,bi,bj) * HEFFM(I,J,bi,bj)
136 C NOW SET UP SYMMETTRIC DRAG
137 DRAGS(I,J,bi,bj) = DWATN(I,J,bi,bj)*COSWAT
138 C NOW SET UP ANTI SYMMETTRIC DRAG FORCE AND ADD IN CURRENT FORCE
139 C ( remember to average to correct velocity points )
140 FORCEX(I,J,bi,bj)=FORCEX0(I,J,bi,bj)+
141 & 0.5*( DWATN(I,J,bi,bj)+DWATN(I-1,J,bi,bj) ) *
142 & COSWAT * GWATX(I,J,bi,bj)
143 & - SIGN(SINWAT, _fCori(I,J,bi,bj))* 0.5 _d 0 *
144 & ( DWATN(I ,J,bi,bj) *
145 & 0.5 _d 0 * (GWATY(I ,J ,bi,bj)-vIceC(I ,J ,bi,bj)
146 & +GWATY(I ,J+1,bi,bj)-vIceC(I ,J+1,bi,bj))
147 & + DWATN(I-1,J,bi,bj) *
148 & 0.5 _d 0 * (GWATY(I-1,J ,bi,bj)-vIceC(I-1,J ,bi,bj)
149 & +GWATY(I-1,J+1,bi,bj)-vIceC(I-1,J+1,bi,bj))
150 & )
151 FORCEY(I,J,bi,bj)=FORCEY0(I,J,bi,bj)+
152 & 0.5*( DWATN(I,J,bi,bj)+DWATN(I,J-1,bi,bj) ) *
153 & COSWAT * GWATY(I,J,bi,bj)
154 & + SIGN(SINWAT, _fCori(I,J,bi,bj)) * 0.5 _d 0 *
155 & ( DWATN(I,J ,bi,bj) *
156 & 0.5 _d 0 * (GWATX(I ,J ,bi,bj)-uIceC(I ,J ,bi,bj)
157 & +GWATX(I+1,J ,bi,bj)-uIceC(I+1,J ,bi,bj))
158 & + DWATN(I,J-1,bi,bj) *
159 & 0.5 _d 0 * (GWATX(I ,J-1,bi,bj)-uIceC(I ,J-1,bi,bj)
160 & +GWATX(I+1,J-1,bi,bj)-uIceC(I+1,J-1,bi,bj))
161 & )
162 C NOW CALCULATE PRESSURE FORCE AND ADD TO EXTERNAL FORCE
163 FORCEX(I,J,bi,bj)=FORCEX(I,J,bi,bj)
164 & - 0.5 _d 0 * _recip_dxC(I,J,bi,bj)
165 & *(PRESS(I,J,bi,bj) - PRESS(I-1,J ,bi,bj))
166 FORCEY(I,J,bi,bj)=FORCEY(I,J,bi,bj)
167 & - 0.5 _d 0 * _recip_dyC(I,J,bi,bj)
168 & *(PRESS(I,J,bi,bj) - PRESS(I ,J-1,bi,bj))
169 ENDDO
170 ENDDO
171 ENDDO
172 ENDDO
173
174 DO bj=myByLo(myThid),myByHi(myThid)
175 DO bi=myBxLo(myThid),myBxHi(myThid)
176 DO j=1-Oly,sNy+Oly
177 DO i=1-Olx,sNx+Olx
178 FORCEX(I,J,bi,bj)=FORCEX(I,J,bi,bj)
179 & +seaiceMassU(I,J,bi,bj)/SEAICE_deltaTdyn
180 & *uIce(I,J,2,bi,bj)
181 FORCEY(I,J,bi,bj)=FORCEY(I,J,bi,bj)
182 & +seaiceMassV(I,J,bi,bj)/SEAICE_deltaTdyn
183 & *vIce(I,J,2,bi,bj)
184 FORCEX(I,J,bi,bj)=FORCEX(I,J,bi,bj)* _maskW(I,J,1,bi,bj)
185 FORCEY(I,J,bi,bj)=FORCEY(I,J,bi,bj)* _maskS(I,J,1,bi,bj)
186 etaPlusZeta (I,J,bi,bj) = ETA (I,J,bi,bj)+ZETA(I,J,bi,bj)
187 zetaMinusEta(I,J,bi,bj) = ZETA(I,J,bi,bj)-ETA (I,J,bi,bj)
188 ENDDO
189 ENDDO
190 DO j=1-Oly,sNy+Oly
191 DO i=1-Olx+1,sNx+Olx
192 etaMeanU (I,J,bi,bj) =
193 & HALF*(ETA (I,J,bi,bj) + ETA (I-1,J ,bi,bj))
194 ENDDO
195 ENDDO
196 DO j=1-Oly+1,sNy+Oly
197 DO i=1-Olx,sNx+Olx
198 etaMeanV (I,J,bi,bj) =
199 & HALF*(ETA (I,J,bi,bj) + ETA (I ,J-1,bi,bj))
200 ENDDO
201 ENDDO
202 DO j=1-Oly+1,sNy+Oly
203 DO i=1-Olx+1,sNx+Olx
204 etaMeanZ (I,J,bi,bj) =
205 & HALF * ( etaMeanU(I,J,bi,bj) + etaMeanU(I,J-1,bi,bj) )
206 ENDDO
207 ENDDO
208 ENDDO
209 ENDDO
210
211 C SOLVE FOR uIce
212 DO bj=myByLo(myThid),myByHi(myThid)
213 DO bi=myBxLo(myThid),myBxHi(myThid)
214
215 DO J=1,sNy
216 DO I=1,sNx
217 C coefficients of uIce(I,J)
218 C (d/dx)[(eta+zeta)*d/dx)] U
219 AA1 = etaPlusZeta(I ,J,bi,bj)
220 & * _recip_dxF(I ,J,bi,bj)
221 & * _recip_dxC(I ,J,bi,bj) * _maskW(I,J,1,bi,bj)
222 AA2 = etaPlusZeta(I-1,J,bi,bj)
223 & * _recip_dxF(I-1,J,bi,bj)
224 & * _recip_dxC(I ,J,bi,bj) * _maskW(I,J,1,bi,bj)
225 C (d/dy)[eta*(d/dy + tanphi/a)] U (also on UVRT1/2)
226 AA3= ( etaMeanZ(I,J+1,bi,bj) * _recip_dyU(I,J+1,bi,bj)
227 & + etaMeanZ(I,J ,bi,bj) * _recip_dyU(I,J ,bi,bj)
228 & ) * _recip_dyG(I,J,bi,bj)
229 & - (etaMeanZ(I,J+1,bi,bj) - etaMeanZ(I,J,bi,bj))
230 & * 0.5 _d 0 * _tanPhiAtU(I,J,bi,bj)
231 & * recip_rSphere * _recip_dyG(I,J,bi,bj)
232 C 2*eta*(tanphi/a) * ( tanphi/a ) U
233 AA6=TWO*etaMeanU(I,J,bi,bj)*recip_rSphere*recip_rSphere
234 & * _tanPhiAtU(I,J,bi,bj) * _tanPhiAtU(I,J,bi,bj)
235 AU(I,J,bi,bj)=-AA2
236 CU(I,J,bi,bj)=-AA1
237 BU(I,J,bi,bj)=(ONE - _maskW(I,J,1,bi,bj))
238 & - AU(I,J,bi,bj) - CU(I,J,bi,bj)
239 & + ( AA3 + AA6
240 & + seaiceMassU(I,J,bi,bj)/SEAICE_deltaTdyn
241 & + 0.5 _d 0*( DRAGS(I,J,bi,bj) + DRAGS(I-1,J,bi,bj) )
242 & )* _maskW(I,J,1,bi,bj)
243 C coefficients of uIce(I,J-1)
244 UVRT1(I,J,bi,bj)=
245 & etaMeanZ(I,J ,bi,bj) * _recip_dyG(I,J ,bi,bj) * (
246 & _recip_dyU(I,J ,bi,bj)
247 & - _tanPhiAtU(I,J ,bi,bj) * 0.5 _d 0 * recip_rSphere )
248 & + TWO*etaMeanU(I,J,bi,bj) * _tanPhiAtU(I,J,bi,bj)
249 & * 1.0 _d 0 / ( _dyU(I,J,bi,bj) + _dyU(I,J+1,bi,bj) )
250 & *recip_rSphere
251 C coefficients of uIce(I,J+1)
252 UVRT2(I,J,bi,bj)=
253 & etaMeanZ(I,J+1,bi,bj) * _recip_dyG(I,J ,bi,bj) * (
254 & _recip_dyU(I,J+1,bi,bj)
255 & + _tanPhiAtU(I,J+1,bi,bj) * 0.5 _d 0 * recip_rSphere )
256 & - TWO*etaMeanU(I,J,bi,bj) * _tanPhiAtU(I,J,bi,bj)
257 & * 1.0 _d 0 / ( _dyU(I,J,bi,bj) + _dyU(I,J+1,bi,bj) )
258 & *recip_rSphere
259 END DO
260 END DO
261
262 DO J=1,sNy
263 AU(1,J,bi,bj)=ZERO
264 CU(sNx,J,bi,bj)=ZERO
265 CU(1,J,bi,bj)=CU(1,J,bi,bj)/BU(1,J,bi,bj)
266 END DO
267
268 C now set up right-hand side
269 DO J=1-Oly,sNy+Oly-1
270 DO I=1-Olx,sNx+Olx
271 dVdy(I,J) = ( vIceC(I,J+1,bi,bj) - vIceC(I,J,bi,bj) )
272 & * _recip_dyF(I,J,bi,bj)
273 ENDDO
274 ENDDO
275 DO J=1,sNy
276 DO I=1,sNx
277 C coriolis and other forcing
278 FXY(I,J,bi,bj)=
279 & 0.5*( seaiceMassC(I ,J,bi,bj) * _fCori(I ,J,bi,bj)
280 & *0.5*( vIceC( i ,j,bi,bj)+vIceC( i ,j+1,bi,bj) )
281 & + seaiceMassC(I-1,J,bi,bj) * _fCori(I-1,J,bi,bj)
282 & *0.5*( vIceC(i-1,j,bi,bj)+vIceC(i-1,j+1,bi,bj) ) )
283 & +FORCEX(I,J,bi,bj)
284 C + d/dx[ (zeta-eta) dV/dy]
285 FXY(I,J,bi,bj)=FXY(I,J,bi,bj) +
286 & ( zetaMinusEta(I ,J ,bi,bj) * dVdy(I ,J )
287 & - zetaMinusEta(I-1,J ,bi,bj) * dVdy(I-1,J )
288 & ) * _recip_dxC(I,J,bi,bj)
289 C + d/dy[ eta dV/x ]
290 FXY(I,J,bi,bj)=FXY(I,J,bi,bj) + (
291 & etaMeanZ(I,J+1,bi,bj)
292 & * ( vIceC(I ,J+1,bi,bj) - vIceC(I-1,J+1,bi,bj) )
293 & * _recip_dxV(I,J+1,bi,bj)
294 & - etaMeanZ(I,J,bi,bj)
295 & * ( vIceC(I ,J,bi,bj) - vIceC(I-1,J,bi,bj) )
296 & * _recip_dxV(I,J,bi,bj)
297 & ) * _recip_dyG(I,J,bi,bj)
298 C - d/dx[ (eta+zeta) * v * (tanphi/a) ]
299 FXY(I,J,bi,bj)=FXY(I,J,bi,bj) - (
300 & etaPlusZeta(I ,J ,bi,bj)
301 & * 0.5 _d 0 * (vIceC(I ,J,bi,bj)+vIceC(I ,J+1,bi,bj))
302 & * 0.5 _d 0 * ( _tanPhiAtU(I ,J,bi,bj)
303 & + _tanPhiAtU(I+1,J,bi,bj) )
304 & - etaPlusZeta(I-1,J,bi,bj)
305 & * 0.5 _d 0 * (vIceC(I-1,J,bi,bj)+vIceC(I-1,J+1,bi,bj))
306 & * 0.5 _d 0 * ( _tanPhiAtU(I-1,J,bi,bj)
307 & + _tanPhiAtU(I ,J,bi,bj) )
308 & )* _recip_dxC(I,J,bi,bj)*recip_rSphere
309 C - 2*eta*(tanphi/a) * dV/dx
310 FXY(I,J,bi,bj)=FXY(I,J,bi,bj) -
311 & TWO * etaMeanU(I,J,bi,bj) * _tanPhiAtV(I,J,bi,bj)
312 & *recip_rSphere
313 & *(vIceC(I ,J,bi,bj) + vIceC(I ,J+1,bi,bj)
314 & -vIceC(I-1,J,bi,bj) - vIceC(I-1,J+1,bi,bj))
315 & * _recip_dxC(I,J,bi,bj)
316 END DO
317 END DO
318
319 ENDDO
320 ENDDO
321
322 C NOW DO ITERATION
323 100 CONTINUE
324
325 cph--- iteration starts here
326 cph--- need to kick out goto
327 phexit = -1
328
329 C ITERATION START -----------------------------------------------------
330 #ifdef ALLOW_AUTODIFF_TAMC
331 CADJ LOOP = iteration uice
332 #endif /* ALLOW_AUTODIFF_TAMC */
333
334 DO 8000 M=1, solv_max_iters
335 cph(
336 IF ( phexit .EQ. -1 ) THEN
337 cph)
338 DO bj=myByLo(myThid),myByHi(myThid)
339 DO bi=myBxLo(myThid),myBxHi(myThid)
340 C NOW SET U(3)=U(1)
341 DO J=1,sNy
342 DO I=1,sNx
343 uIce(I,J,3,bi,bj)=uIce(I,J,1,bi,bj)
344 END DO
345 END DO
346
347 DO 1200 J=1,sNy
348 DO I=1,sNx
349 IF(I.EQ.1) THEN
350 AA2 = etaPlusZeta(I-1,J,bi,bj)
351 & * _recip_dxF(I-1,J,bi,bj)
352 & * _recip_dxC(I ,J,bi,bj)
353 AA3=AA2*uIce(I-1,J,1,bi,bj)* _maskW(I,J,1,bi,bj)
354 ELSE IF(I.EQ.sNx) THEN
355 AA1 = etaPlusZeta(I ,J,bi,bj)
356 & * _recip_dxF(I ,J,bi,bj)
357 & * _recip_dxC(I ,J,bi,bj)
358 AA3=AA1*uIce(I+1,J,1,bi,bj) * _maskW(I,J,1,bi,bj)
359 ELSE
360 AA3=ZERO
361 END IF
362 URT(I)=FXY(I,J,bi,bj)+AA3
363 & +UVRT1(I,J,bi,bj)*uIce(I,J-1,1,bi,bj)
364 & +UVRT2(I,J,bi,bj)*uIce(I,J+1,1,bi,bj)
365 URT(I)=URT(I)* _maskW(I,J,1,bi,bj) * seaiceMaskU(I,J,bi,bj)
366 END DO
367
368 DO I=1,sNx
369 CUU(I)=CU(I,J,bi,bj)
370 END DO
371 URT(1)=URT(1)/BU(1,J,bi,bj)
372 DO I=2,sNx
373 IM=I-1
374 CUU(I)=CUU(I)/(BU(I,J,bi,bj)-AU(I,J,bi,bj)*CUU(IM))
375 URT(I)=(URT(I)-AU(I,J,bi,bj)*URT(IM))
376 & /(BU(I,J,bi,bj)-AU(I,J,bi,bj)*CUU(IM))
377 END DO
378 DO I=1,sNx-1
379 J1=sNx-I
380 J2=J1+1
381 URT(J1)=URT(J1)-CUU(J1)*URT(J2)
382 END DO
383 DO I=1,sNx
384 uIce(I,J,1,bi,bj)=uIce(I,J,3,bi,bj)
385 & +WFAU*(URT(I)-uIce(I,J,3,bi,bj))
386 END DO
387
388 1200 CONTINUE
389
390 ENDDO
391 ENDDO
392
393 IF(MOD(M,SOLV_NCHECK).EQ.0) THEN
394 DO bj=myByLo(myThid),myByHi(myThid)
395 DO bi=myBxLo(myThid),myBxHi(myThid)
396 S1=ZERO
397 DO J=1,sNy
398 DO I=1,sNx
399 UERR(I,J,bi,bj)=(uIce(I,J,1,bi,bj)-uIce(I,J,3,bi,bj))
400 & * _maskW(I,J,1,bi,bj)
401 S1=MAX(ABS(UERR(I,J,bi,bj)),S1)
402 END DO
403 END DO
404 _GLOBAL_MAX_R8( S1, myThid )
405 ENDDO
406 ENDDO
407 C SAFEGUARD AGAINST BAD FORCING ETC
408 IF(M.GT.1.AND.S1.GT.S1A) WFAU=WFAU2
409 S1A=S1
410 IF(S1.LT.LSR_ERROR) THEN
411 ICOUNT1=M
412 cph(
413 cph GO TO 8001
414 phexit = 1
415 cph)
416 END IF
417 END IF
418 CALL SEAICE_EXCH_UV ( uIce, vIce, myThid )
419
420 cph(
421 END IF
422 cph)
423
424 8000 CONTINUE
425 cph 8001 CONTINUE
426 C ITERATION END -----------------------------------------------------
427
428 IF ( debugLevel .GE. debLevB ) THEN
429 _BEGIN_MASTER( myThid )
430 write(*,'(A,I6,1P2E22.14)')' U lsr iters, error = ',ICOUNT1,S1
431 _END_MASTER( myThid )
432 ENDIF
433
434 C NOW FOR vIce
435 DO bj=myByLo(myThid),myByHi(myThid)
436 DO bi=myBxLo(myThid),myBxHi(myThid)
437
438 DO J=1,sNy
439 DO I=1,sNx
440 C coefficients for VICE(I,J)
441 C d/dy [(eta+zeta) d/dy] V
442 AA1= etaPlusZeta(I,J ,bi,bj)
443 & *_recip_dyF(I,J ,bi,bj) * _recip_dyC(I,J,bi,bj)
444 AA2= etaPlusZeta(I,J-1,bi,bj)
445 & * _recip_dyF(I,J-1,bi,bj) * _recip_dyC(I,J,bi,bj)
446 C d/dx [eta d/dx] V
447 AA3= etaMeanZ(I+1,J,bi,bj)
448 & * _recip_dxG(I,J,bi,bj) * _recip_dxV(I+1,J,bi,bj)
449 AA4= etaMeanZ(I ,J,bi,bj)
450 & *_recip_dxG(I,J,bi,bj) * _recip_dxV(I ,J,bi,bj)
451 C d/dy [(zeta-eta) tanphi/a] V
452 AA5= zetaMinusEta(I,J ,bi,bj) * tanPhiAtU(I,J ,bi,bj)
453 & * _recip_dyC(I,J,bi,bj)*recip_rSphere * 0.5 _d 0
454 AA6= zetaMinusEta(I,J-1,bi,bj) * tanPhiAtU(I,J-1,bi,bj)
455 & * _recip_dyC(I,J,bi,bj)*recip_rSphere * 0.5 _d 0
456 C 2*eta tanphi/a ( - tanphi/a - d/dy) V
457 AA7=TWO*etaMeanV(I,J,bi,bj) * recip_rSphere
458 & * _tanPhiAtV(I,J,bi,bj)
459 C
460 AV(I,J,bi,bj)=(
461 & - AA2
462 & - AA6
463 & - AA7*1.0 _d 0 / ( _dyF(I,J,bi,bj) + _dyF(I,J-1,bi,bj) )
464 & )* _maskS(I,J,1,bi,bj)
465 CV(I,J,bi,bj)=(
466 & -AA1
467 & + AA5
468 & + AA7*1.0 _d 0 / ( _dyF(I,J,bi,bj) + _dyF(I,J-1,bi,bj) )
469 & )* _maskS(I,J,1,bi,bj)
470 BV(I,J,bi,bj)= (ONE- _maskS(I,J,1,bi,bj))
471 & +( (AA1+AA2) + (AA3+AA4) + (AA5-AA6)
472 & + AA7 * _tanPhiAtV(I,J,bi,bj)*recip_rSphere
473 & + seaiceMassV(I,J,bi,bj)/SEAICE_deltaTdyn
474 & + 0.5 _d 0 * ( DRAGS(I,J,bi,bj) + DRAGS(I,J-1,bi,bj) )
475 & )* _maskS(I,J,1,bi,bj)
476 C coefficients for V(I-1,J)
477 UVRT1(I,J,bi,bj)= AA4
478 C coefficients for V(I+1,J)
479 UVRT2(I,J,bi,bj)= AA3
480 END DO
481 END DO
482
483 DO I=1,sNx
484 AV(I,1,bi,bj)=ZERO
485 CV(I,sNy,bi,bj)=ZERO
486 CV(I,1,bi,bj)=CV(I,1,bi,bj)/BV(I,1,bi,bj)
487 END DO
488
489 C now set up right-hand-side
490 DO J=1-Oly,sNy+Oly-1
491 DO I=1-Olx,sNx+Olx-1
492 dUdx(I,J) = ( uIceC(I+1,J,bi,bj) - uIceC(I,J,bi,bj) )
493 & * _recip_dxF(I,J,bi,bj)
494 dUdy(I,J) = ( uIceC(I,J+1,bi,bj) - uIceC(I,J,bi,bj) )
495 & * _recip_dyU(I,J+1,bi,bj)
496 ENDDO
497 ENDDO
498 DO J=1,sNy
499 DO I=1,sNx
500 C coriols and other foring
501 FXY(I,J,bi,bj)=
502 & -0.5*( seaiceMassC(I,J ,bi,bj) * _fCori(I,J ,bi,bj)
503 & *0.5*( uIceC(i ,j ,bi,bj)+uIceC(i+1, j,bi,bj) )
504 & + seaiceMassC(I,J-1,bi,bj) * _fCori(I,J-1,bi,bj)
505 & *0.5*( uIceC(i ,j-1,bi,bj)+uIceC(i+1,j-1,bi,bj) ) )
506 & + FORCEY(I,J,bi,bj)
507 C + d/dy[ (zeta-eta) dU/dx ]
508 FXY(I,J,bi,bj)=FXY(I,J,bi,bj) +
509 & ( zetaMinusEta(I,J ,bi,bj)*dUdx(I,J )
510 & - zetaMinusEta(I,J-1,bi,bj)*dUdx(I,J-1) )
511 & * _recip_dyC(I,J,bi,bj)
512 C + d/dx[ eta dU/dy ]
513 FXY(I,J,bi,bj)=FXY(I,J,bi,bj) +
514 & ( etaMeanZ(I+1,J ,bi,bj) * dUdy(I+1,J)
515 & - etaMeanZ(I ,J ,bi,bj) * dUdy(I ,J))
516 & * _recip_dxG(I,J,bi,bj)
517 C + d/dx[ eta * (tanphi/a) * U ]
518 FXY(I,J,bi,bj)=FXY(I,J,bi,bj) + (
519 & etaMeanZ(I+1,J,bi,bj) * 0.5 *
520 & ( uIceC(I+1,J ,bi,bj) * _tanPhiAtU(I+1,J ,bi,bj)
521 & + uIceC(I+1,J-1,bi,bj) * _tanPhiAtU(I+1,J-1,bi,bj) )
522 & - etaMeanZ(I ,J,bi,bj) * 0.5 *
523 & ( uIceC(I ,J ,bi,bj) * _tanPhiAtU(I ,J ,bi,bj)
524 & + uIceC(I ,J-1,bi,bj) * _tanPhiAtU(I ,J ,bi,bj) )
525 & ) * _recip_dxG(I,J,bi,bj)*recip_rSphere
526 C + 2*eta*(tanphi/a) dU/dx
527 FXY(I,J,bi,bj)=FXY(I,J,bi,bj) +
528 & TWO * etaMeanV(I,J,bi,bj)*TWO * _tanPhiAtV(I,J,bi,bj)
529 & * ( uIceC(I+1,J,bi,bj)+uIceC(I+1,J-1,bi,bj)
530 & - uIceC(I ,J,bi,bj)-uIceC(I ,J-1,bi,bj) )
531 & * _recip_dxG(I,J,bi,bj)
532 & *recip_rSphere
533 END DO
534 END DO
535
536 ENDDO
537 ENDDO
538
539 C NOW DO ITERATION
540 300 CONTINUE
541
542 cph--- iteration starts here
543 cph--- need to kick out goto
544 phexit = -1
545
546 C ITERATION START -----------------------------------------------------
547 #ifdef ALLOW_AUTODIFF_TAMC
548 CADJ LOOP = iteration vice
549 #endif /* ALLOW_AUTODIFF_TAMC */
550
551 DO 9000 M=1, solv_max_iters
552 cph(
553 IF ( phexit .EQ. -1 ) THEN
554 cph)
555 C NOW SET U(3)=U(1)
556 DO bj=myByLo(myThid),myByHi(myThid)
557 DO bi=myBxLo(myThid),myBxHi(myThid)
558
559 DO J=1,sNy
560 DO I=1,sNx
561 vIce(I,J,3,bi,bj)=vIce(I,J,1,bi,bj)
562 END DO
563 END DO
564
565 DO I=1,sNx
566 DO J=1,sNy
567 IF(J.EQ.1) THEN
568 AA2= etaPlusZeta(I,J-1,bi,bj)
569 & * _recip_dyF(I,J-1,bi,bj) * _recip_dyC(I,J,bi,bj)
570 AA3=( AA2
571 & + zetaMinusEta(I,J-1,bi,bj) * tanPhiAtU(I,J-1,bi,bj)
572 & * _recip_dyC(I,J,bi,bj)*recip_rSphere
573 & + TWO*etaMeanV(I,J,bi,bj) * recip_rSphere
574 & * _tanPhiAtV(I,J,bi,bj)
575 & *1.0 _d 0 / ( _dyF(I,J,bi,bj) + _dyF(I,J-1,bi,bj) )
576 & ) * vIce(I,J-1,1,bi,bj) * _maskS(I,J,1,bi,bj)
577 ELSE IF(J.EQ.sNy) THEN
578 AA1= etaPlusZeta(I,J ,bi,bj)
579 & *_recip_dyF(I,J ,bi,bj) * _recip_dyC(I,J,bi,bj)
580 AA3=( AA1
581 & - zetaMinusEta(I,J ,bi,bj) * tanPhiAtU(I,J ,bi,bj)
582 & * _recip_dyC(I,J,bi,bj)*recip_rSphere
583 & - TWO*etaMeanV(I,J,bi,bj) * recip_rSphere
584 & * _tanPhiAtV(I,J,bi,bj)
585 & *1.0 _d 0 / ( _dyF(I,J,bi,bj) + _dyF(I,J-1,bi,bj) )
586 & ) * vIce(I,J+1,1,bi,bj) * _maskS(I,J,1,bi,bj)
587 ELSE
588 AA3=ZERO
589 END IF
590
591 VRT(J)=FXY(I,J,bi,bj)+AA3+UVRT1(I,J,bi,bj)*vIce(I-1,J,1,bi,bj)
592 & +UVRT2(I,J,bi,bj)*vIce(I+1,J,1,bi,bj)
593 VRT(J)=VRT(J)* _maskS(I,J,1,bi,bj) * seaiceMaskV(I,J,bi,bj)
594 END DO
595
596 DO J=1,sNy
597 CVV(J)=CV(I,J,bi,bj)
598 END DO
599 VRT(1)=VRT(1)/BV(I,1,bi,bj)
600 DO J=2,sNy
601 JM=J-1
602 CVV(J)=CVV(J)/(BV(I,J,bi,bj)-AV(I,J,bi,bj)*CVV(JM))
603 VRT(J)=(VRT(J)-AV(I,J,bi,bj)*VRT(JM))
604 & /(BV(I,J,bi,bj)-AV(I,J,bi,bj)*CVV(JM))
605 END DO
606 DO J=1,sNy-1
607 J1=sNy-J
608 J2=J1+1
609 VRT(J1)=VRT(J1)-CVV(J1)*VRT(J2)
610 END DO
611 DO J=1,sNy
612 vIce(I,J,1,bi,bj)=vIce(I,J,3,bi,bj)
613 & +WFAV*(VRT(J)-vIce(I,J,3,bi,bj))
614 END DO
615 ENDDO
616
617 ENDDO
618 ENDDO
619
620 IF(MOD(M,SOLV_NCHECK).EQ.0) THEN
621 DO bj=myByLo(myThid),myByHi(myThid)
622 DO bi=myBxLo(myThid),myBxHi(myThid)
623 S2=ZERO
624 DO J=1,sNy
625 DO I=1,sNx
626 UERR(I,J,bi,bj)=(vIce(I,J,1,bi,bj)-vIce(I,J,3,bi,bj))
627 & * _maskS(I,J,1,bi,bj)
628 S2=MAX(ABS(UERR(I,J,bi,bj)),S2)
629 END DO
630 END DO
631 _GLOBAL_MAX_R8( S2, myThid )
632 ENDDO
633 ENDDO
634 C SAFEGUARD AGAINST BAD FORCING ETC
635 IF(M.GT.1.AND.S2.GT.S2A) WFAV=WFAV2
636 S2A=S2
637 IF(S2.LT.LSR_ERROR) THEN
638 ICOUNT2=M
639 cph(
640 cph GO TO 9001
641 phexit = 1
642 cph)
643 END IF
644 END IF
645
646 CALL SEAICE_EXCH_UV ( uIce, vIce, myThid )
647
648 cph(
649 END IF
650 cph)
651
652 9000 CONTINUE
653 cph 9001 CONTINUE
654 C ITERATION END -----------------------------------------------------
655
656 IF ( debugLevel .GE. debLevB ) THEN
657 _BEGIN_MASTER( myThid )
658 write(*,'(A,I6,1P2E22.14)')' V lsr iters, error = ',ICOUNT2,S2
659 _END_MASTER( myThid )
660 ENDIF
661
662 C APPLY MASKS
663 DO bj=myByLo(myThid),myByHi(myThid)
664 DO bi=myBxLo(myThid),myBxHi(myThid)
665 DO J=1-Oly,sNy+Oly
666 DO I=1-Olx,sNx+Olx
667 uIce(I,J,1,bi,bj)=uIce(I,J,1,bi,bj)* _maskW(I,J,1,bi,bj)
668 vIce(I,J,1,bi,bj)=vIce(I,J,1,bi,bj)* _maskS(I,J,1,bi,bj)
669 END DO
670 END DO
671 ENDDO
672 ENDDO
673 CML CALL SEAICE_EXCH_UV ( uIce, vIce, myThid )
674
675 #endif /* SEAICE_ALLOW_DYNAMICS */
676 #endif /* SEAICE_CGRID */
677
678 RETURN
679 END

  ViewVC Help
Powered by ViewVC 1.1.22