/[MITgcm]/MITgcm/pkg/streamice/streamice_vel_solve.F
ViewVC logotype

Contents of /MITgcm/pkg/streamice/streamice_vel_solve.F

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


Revision 1.8 - (show annotations) (download)
Fri Sep 5 14:25:11 2014 UTC (9 years, 9 months ago) by dgoldberg
Branch: MAIN
Changes since 1.7: +69 -195 lines
extensive changes to s/r's to (a) allow for coupling with shelfice and (b) modularize the convergence check in streamice_vel_solve

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

  ViewVC Help
Powered by ViewVC 1.1.22