/[MITgcm]/MITgcm_contrib/dgoldberg/streamice/streamice_vel_solve.F
ViewVC logotype

Contents of /MITgcm_contrib/dgoldberg/streamice/streamice_vel_solve.F

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


Revision 1.5 - (show annotations) (download)
Thu Jul 26 16:13:18 2012 UTC (13 years ago) by dgoldberg
Branch: MAIN
Changes since 1.4: +9 -5 lines
replace print statements with print_message calls

1 C $Header: /u/gcmpack/MITgcm_contrib/dgoldberg/streamice/streamice_vel_solve.F,v 1.4 2012/07/26 02:14:25 dgoldberg Exp $
2 C $Name: $
3
4 #include "STREAMICE_OPTIONS.h"
5
6 C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
7
8 CBOP
9 SUBROUTINE STREAMICE_VEL_SOLVE( myThid )
10 C /============================================================\
11 C | SUBROUTINE |
12 C | o |
13 C |============================================================|
14 C | |
15 C \============================================================/
16 IMPLICIT NONE
17
18 C === Global variables ===
19 #include "SIZE.h"
20 #include "EEPARAMS.h"
21 #include "PARAMS.h"
22 #include "STREAMICE.h"
23 #include "STREAMICE_CG.h"
24 #ifdef ALLOW_AUTODIFF_TAMC
25 # include "tamc.h"
26 #endif
27
28 C !INPUT/OUTPUT ARGUMENTS
29 INTEGER myThid
30
31 #ifdef ALLOW_STREAMICE
32
33 C LOCAL VARIABLES
34
35 ! real, dimension(:,:), pointer :: TAUDX, TAUDY, u_prev_iterate, v_prev_iterate, &
36 ! u_bdry_cont, v_bdry_cont, Au, Av, err_u, err_v, &
37 ! geolonq, geolatq, u_last, v_last, float_cond, H_node
38 ! type(ocean_grid_type), pointer :: G
39 ! integer :: conv_flag, i, j, k,l, iter, isym, &
40 ! isdq, iedq, jsdq, jedq, isd, ied, jsd, jed, isumstart, jsumstart, nodefloat, nsub
41 ! real :: err_max, err_tempu, err_tempv, err_init, area, max_vel, tempu, tempv, rhoi, rhow
42
43 INTEGER conv_flag, i, j, k, l, iter, cg_iters, bi, bj
44 INTEGER iter_numconv
45 INTEGER ikey_nl
46 _RL err_max, err_tempu, err_tempv, err_init, area
47 _RL max_vel, tempu, tempv, err_lastchange, cgtol
48 CHARACTER*(MAX_LEN_MBUF) msgBuf
49 ! _RL taudx (1-OLx:sNx+OLx,1-OLy:sNy+Oly,nSx,nSy)
50 ! _RL taudy (1-OLx:sNx+OLx,1-OLy:sNy+Oly,nSx,nSy)
51
52 CALL STREAMICE_DRIVING_STRESS (myThid)
53
54 cgtol = streamice_cg_tol
55
56 ! CALL WRITE_FULLARRAY_RL ("taudy_SI",taudy_SI,1,0,0,1,0,myThid)
57
58 _EXCH_XY_RL ( taudx_SI , myThid )
59 _EXCH_XY_RL ( taudy_SI , myThid )
60
61 ! CALL WRITE_FULLARRAY_RL ("taudy_SI_2",taudy_SI,1,0,0,1,0,myThid)
62
63 DO bj = myByLo(myThid), myByHi(myThid)
64 DO bi = myBxLo(myThid), myBxHi(myThid)
65 DO j=1-OLy,sNy+OLy
66 DO i=1-OLx,sNx+OLx
67 u_old_SI (i,j,bi,bj) = U_streamice (i,j,bi,bj)
68 v_old_SI (i,j,bi,bj) = V_streamice (i,j,bi,bj)
69 ENDDO
70 ENDDO
71 ENDDO
72 ENDDO
73
74 #ifdef ALLOW_AUTODIFF_TAMC
75 !$TAF STORE U_streamice = comlev1, key=ikey_dynamics
76 !$TAF STORE V_streamice = comlev1, key=ikey_dynamics
77 #endif
78
79 CALL STREAMICE_VISC_BETA ( myThid )
80
81 _EXCH_XY_RL ( tau_beta_eff_streamice , myThid )
82 _EXCH_XY_RL ( visc_streamice , myThid )
83
84 DO bj = myByLo(myThid), myByHi(myThid)
85 DO bi = myBxLo(myThid), myBxHi(myThid)
86 DO j=1,sNy
87 DO i=1,sNx
88 Au_SI (i,j,bi,bj) = 0. _d 0
89 Av_SI (i,j,bi,bj) = 0. _d 0
90 ubd_SI (i,j,bi,bj) = 0. _d 0
91 vbd_SI (i,j,bi,bj) = 0. _d 0
92 ENDDO
93 ENDDO
94 ENDDO
95 ENDDO
96
97
98 CALL STREAMICE_CG_BOUND_VALS( myThid,
99 O ubd_SI,
100 O vbd_SI)
101
102 #ifdef ALLOW_AUTODIFF_TAMC
103 !$TAF STORE U_streamice = comlev1, key=ikey_dynamics
104 !$TAF STORE V_streamice = comlev1, key=ikey_dynamics
105 #endif
106
107 CALL STREAMICE_CG_ACTION( myThid,
108 O Au_SI,
109 O Av_SI,
110 I U_streamice,
111 I V_streamice,
112 I 0, sNx+1, 0, sNy+1 )
113
114 err_init = 0. _d 0
115
116 DO bj = myByLo(myThid), myByHi(myThid)
117 DO bi = myBxLo(myThid), myBxHi(myThid)
118 #ifdef ALLOW_AUTODIFF_TAMC
119 !$TAF STORE err_init = comlev1, key=ikey_dynamics
120 #endif
121 DO j=1,sNy
122 DO i=1,sNx
123 err_tempu = 0. _d 0
124 err_tempv = 0. _d 0
125 IF (STREAMICE_umask(i,j,bi,bj).eq.1) THEN
126 err_tempu =
127 & ABS (Au_SI(i,j,bi,bj)+ubd_SI(i,j,bi,bj) -
128 & taudx_SI(i,j,bi,bj))
129 ENDIF
130 IF (STREAMICE_vmask(i,j,bi,bj).eq.1) THEN
131 err_tempv = MAX( err_tempu,
132 & ABS (Av_SI(i,j,bi,bj)+vbd_SI(i,j,bi,bj) -
133 & taudy_SI(i,j,bi,bj)))
134 ENDIF
135 IF (err_tempv .ge. err_init) err_init = err_tempv
136 ENDDO
137 ENDDO
138 ENDDO
139 ENDDO
140 #ifdef ALLOW_AUTODIFF_TAMC
141 !$TAF STORE err_init = comlev1, key=ikey_dynamics
142 #endif
143
144 CALL GLOBAL_MAX_R8 (err_init, myThid)
145
146 WRITE(msgBuf,'(A,E15.7)') 'initial nonlinear resid (error): ',
147 & err_init
148 CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
149 & SQUEEZE_RIGHT , 1)
150
151
152 iter_numconv = 0
153 err_max = err_init
154 err_lastchange = err_init
155
156 C START NL ITER. LOOP
157 C-------------------------------------------------------------------
158
159 DO iter=1,streamice_max_nl_iter
160
161 C To avoid using "exit", loop goes through all iterations
162 C but after convergence loop does nothing
163
164 #ifdef ALLOW_AUTODIFF_TAMC
165 ikey_nl = (ikey_dynamics-1)*streamice_max_nl + iter
166 #endif
167 #ifdef ALLOW_AUTODIFF_TAMC
168 !$TAF STORE cgtol = comlev1_stream_nl, key=ikey_nl
169 !$TAF STORE err_max = comlev1_stream_nl, key=ikey_nl
170 !$TAF STORE err_tempu = comlev1_stream_nl, key=ikey_nl
171 !$TAF STORE err_tempv = comlev1_stream_nl, key=ikey_nl
172 !$TAF STORE err_lastchange = comlev1_stream_nl, key=ikey_nl
173 !$TAF STORE ru_old_si = comlev1_stream_nl, key=ikey_nl
174 !$TAF STORE rv_old_si = comlev1_stream_nl, key=ikey_nl
175 !$TAF STORE streamice_cg_a1 = comlev1_stream_nl, key=ikey_nl
176 !$TAF STORE streamice_cg_a2 = comlev1_stream_nl, key=ikey_nl
177 !$TAF STORE streamice_cg_a3 = comlev1_stream_nl, key=ikey_nl
178 !$TAF STORE streamice_cg_a4 = comlev1_stream_nl, key=ikey_nl
179 !$TAF STORE U_streamice = comlev1_stream_nl, key=ikey_nl
180 !$TAF STORE V_streamice = comlev1_stream_nl, key=ikey_nl
181 !$TAF STORE tau_beta_eff_streamice = comlev1_stream_nl, key=ikey_nl
182 !$TAF STORE visc_streamice = comlev1_stream_nl, key=ikey_nl
183 !$TAF STORE zu_old_si = comlev1_stream_nl, key=ikey_nl
184 !$TAF STORE zv_old_si = comlev1_stream_nl, key=ikey_nl
185 #endif
186
187 IF (err_max .GT. streamice_nonlin_tol * err_init) THEN
188
189 iter_numconv = iter_numconv + 1
190
191 #ifdef ALLOW_AUTODIFF_TAMC
192 !$TAF STORE cgtol = comlev1_stream_nl, key=ikey_nl
193 !$TAF STORE err_max = comlev1_stream_nl, key=ikey_nl
194 !$TAF STORE err_tempu = comlev1_stream_nl, key=ikey_nl
195 !$TAF STORE err_tempv = comlev1_stream_nl, key=ikey_nl
196 !$TAF STORE err_lastchange = comlev1_stream_nl, key=ikey_nl
197 !$TAF STORE ru_old_si = comlev1_stream_nl, key=ikey_nl
198 !$TAF STORE rv_old_si = comlev1_stream_nl, key=ikey_nl
199 !$TAF STORE streamice_cg_a1 = comlev1_stream_nl, key=ikey_nl
200 !$TAF STORE streamice_cg_a2 = comlev1_stream_nl, key=ikey_nl
201 !$TAF STORE streamice_cg_a3 = comlev1_stream_nl, key=ikey_nl
202 !$TAF STORE streamice_cg_a4 = comlev1_stream_nl, key=ikey_nl
203 !$TAF STORE U_streamice = comlev1_stream_nl, key=ikey_nl
204 !$TAF STORE V_streamice = comlev1_stream_nl, key=ikey_nl
205 !$TAF STORE tau_beta_eff_streamice = comlev1_stream_nl, key=ikey_nl
206 !$TAF STORE visc_streamice = comlev1_stream_nl, key=ikey_nl
207 !$TAF STORE zu_old_si = comlev1_stream_nl, key=ikey_nl
208 !$TAF STORE zv_old_si = comlev1_stream_nl, key=ikey_nl
209 #endif
210
211 #ifdef ALLOW_AUTODIFF_TAMC
212 ! DO bj = myByLo(myThid), myByHi(myThid)
213 ! DO bi = myBxLo(myThid), myBxHi(myThid)
214 ! DO j=1-OLy,sNy+OLy
215 ! DO i=1-OLx,sNx+OLx
216 ! U_streamice (i,j,bi,bj) = 0. _d 0
217 ! V_streamice (i,j,bi,bj) = 0. _d 0
218 ! ENDDO
219 ! ENDDO
220 ! ENDDO
221 ! ENDDO
222 #endif
223
224 CALL STREAMICE_CG_WRAPPER(
225 & U_streamice,
226 & V_streamice,
227 & taudx_SI,
228 & taudy_SI,
229 & cgtol,
230 & cg_iters,
231 & myThid )
232
233
234
235 WRITE(msgBuf,'(A,I5,A,I4,A)') 'streamice linear solve number',
236 & iter, " ",
237 & cg_iters,
238 & ' iterations '
239 CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
240 & SQUEEZE_RIGHT , 1)
241
242 #ifdef ALLOW_AUTODIFF_TAMC
243 !$TAF STORE U_streamice = comlev1_stream_nl, key=ikey_nl
244 !$TAF STORE V_streamice = comlev1_stream_nl, key=ikey_nl
245 #endif
246
247 CALL STREAMICE_VISC_BETA ( myThid )
248
249
250 #ifdef ALLOW_AUTODIFF_TAMC
251 !$TAF STORE U_streamice = comlev1_stream_nl, key=ikey_nl
252 !$TAF STORE V_streamice = comlev1_stream_nl, key=ikey_nl
253 #endif
254
255 _EXCH_XY_RL ( tau_beta_eff_streamice , myThid )
256 _EXCH_XY_RL ( visc_streamice , myThid )
257
258 DO bj = myByLo(myThid), myByHi(myThid)
259 DO bi = myBxLo(myThid), myBxHi(myThid)
260 DO j=1,sNy
261 DO i=1,sNx
262 Au_SI (i,j,bi,bj) = 0. _d 0
263 Av_SI (i,j,bi,bj) = 0. _d 0
264 ubd_SI (i,j,bi,bj) = 0. _d 0
265 vbd_SI (i,j,bi,bj) = 0. _d 0
266 ENDDO
267 ENDDO
268 ENDDO
269 ENDDO
270
271 CALL STREAMICE_CG_BOUND_VALS( myThid,
272 O ubd_SI,
273 O vbd_SI)
274
275 #ifdef ALLOW_AUTODIFF_TAMC
276 !$TAF STORE U_streamice = comlev1_stream_nl, key=ikey_nl
277 !$TAF STORE V_streamice = comlev1_stream_nl, key=ikey_nl
278 #endif
279
280 CALL STREAMICE_CG_ACTION( myThid,
281 O Au_SI,
282 O Av_SI,
283 I U_streamice,
284 I V_streamice,
285 I 0, sNx+1, 0, sNy+1 )
286
287 #ifdef ALLOW_AUTODIFF_TAMC
288 !$TAF STORE U_streamice = comlev1_stream_nl, key=ikey_nl
289 !$TAF STORE V_streamice = comlev1_stream_nl, key=ikey_nl
290 #endif
291
292 err_max = 0. _d 0
293
294 #ifdef ALLOW_AUTODIFF_TAMC
295 !$TAF STORE err_max = comlev1_stream_nl, key=ikey_nl
296 #endif
297 DO bj = myByLo(myThid), myByHi(myThid)
298 DO bi = myBxLo(myThid), myBxHi(myThid)
299 #ifdef ALLOW_AUTODIFF_TAMC
300 !$TAF STORE err_max = comlev1_stream_nl, key=ikey_nl
301 #endif
302 DO j=1,sNy
303 DO i=1,sNx
304 err_tempu = 0. _d 0
305 err_tempv = 0. _d 0
306 IF (STREAMICE_umask(i,j,bi,bj).eq.1) THEN
307 err_tempu =
308 & ABS (Au_SI(i,j,bi,bj)+ubd_SI(i,j,bi,bj) -
309 & taudx_SI(i,j,bi,bj))
310 ENDIF
311 IF (STREAMICE_vmask(i,j,bi,bj).eq.1) THEN
312 err_tempv = MAX( err_tempu,
313 & ABS (Av_SI(i,j,bi,bj)+vbd_SI(i,j,bi,bj) -
314 & taudy_SI(i,j,bi,bj)))
315 ENDIF
316 IF (err_tempv .ge. err_max) err_max = err_tempv
317 ENDDO
318 ENDDO
319 ENDDO
320 ENDDO
321
322 CALL GLOBAL_MAX_R8 (err_max, myThid)
323
324 WRITE(msgBuf,'(A,F11.7)') 'err/err_init',
325 & err_max/err_init
326 CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
327 & SQUEEZE_RIGHT , 1)
328
329 IF (err_max<err_lastchange*1.e-2 .and.
330 & STREAMICE_lower_cg_tol) THEN
331 cgtol = cgtol * 5.e-2
332 err_lastchange = err_max
333 WRITE(msgBuf,'(A,E15.7)') 'new cg tol: ',
334 & cgtol
335 CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
336 & SQUEEZE_RIGHT , 1)
337 ENDIF
338
339
340 ENDIF ! (err_max .GT. streamice_nonlin_tol * err_init)
341 ENDDO
342
343 C END NL ITER. LOOP
344 C-------------------------------------------------------------------
345
346 if (iter_numconv .lt. streamice_max_nl_iter) then
347 WRITE(msgBuf,'(A,I5,A)') 'VELOCITY SOLVE CONVERGED, ',
348 & iter_numconv, ' iterations'
349 CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
350 & SQUEEZE_RIGHT , 1)
351 else
352 WRITE(msgBuf,'(A,I5,A)') 'VELOCITY SOLVE NOT CONVERGED IN ',
353 & iter_numconv, ' iterations'
354 CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
355 & SQUEEZE_RIGHT , 1)
356 endif
357
358 ! DO bj = myByLo(myThid), myByHi(myThid)
359 ! DO bi = myBxLo(myThid), myBxHi(myThid)
360 ! DO j=1,sNy
361 ! DO i=1,sNx
362 ! U_streamice (i,j,bi,bj) = 0. _d 0
363 ! V_streamice (i,j,bi,bj) = 0. _d 0
364 ! ENDDO
365 ! ENDDO
366 ! ENDDO
367 ! ENDDO
368 !
369 ! CALL STREAMICE_CG_WRAPPER(
370 ! & U_streamice,
371 ! & V_streamice,
372 ! & taudx_SI,
373 ! & taudy_SI,
374 ! & cgtol,
375 ! & cg_iters,
376 ! & myThid )
377
378
379 _EXCH_XY_RL (U_streamice, myThid)
380 _EXCH_XY_RL (V_streamice, myThid)
381
382 #endif
383 RETURN
384 END
385

  ViewVC Help
Powered by ViewVC 1.1.22