/[MITgcm]/MITgcm/tools/OAD_support/ad_template.streamice_vel_phistage.F
ViewVC logotype

Contents of /MITgcm/tools/OAD_support/ad_template.streamice_vel_phistage.F

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


Revision 1.5 - (show annotations) (download)
Mon Jun 15 14:36:31 2015 UTC (8 years, 11 months ago) by dgoldberg
Branch: MAIN
CVS Tags: checkpoint66a, checkpoint65z, checkpoint65x, checkpoint65y, checkpoint65r, checkpoint65s, checkpoint65p, checkpoint65q, checkpoint65v, checkpoint65w, checkpoint65t, checkpoint65u, checkpoint65n, checkpoint65o
Changes since 1.4: +50 -7 lines
persist petsc matrix if proper user variable is set ( STREAMICE_OAD_petsc_reuse)

1 #include "STREAMICE_OPTIONS.h"
2
3 subroutine template()
4 use OAD_cp
5 use OAD_tape
6 use OAD_rev
7
8 !$TEMPLATE_PRAGMA_DECLARATIONS
9
10 integer myi
11 ! Temporaries to hold the stack pointers
12 integer temp_double_tape_pointer, temp_integer_tape_pointer, temp_logical_tape_pointer, temp_character_tape_pointer, temp_string_tape_pointer
13 type(modeType) :: our_orig_mode
14
15 integer iaddr
16 external iaddr
17 !<------------------Begin user declarations ---------------------->!
18 ! Insert declarations of dummy variables for calling adjoint computation
19 ! without side effects, and storing adjoint variable iterates
20
21 #if (defined (ALLOW_OPENAD) && defined (ALLOW_STREAMICE_OAD_FP))
22
23 #ifdef STREAMICE_ALLOW_FRIC_CONTROL
24 Real*8 C_basal_dummy_d (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
25 #endif
26 #ifdef STREAMICE_ALLOW_BGLEN_CONTROL
27 Real*8 B_glen_dummy_d (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
28 #endif
29 Real*8 H_streamice_dummy_d (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
30 Real*8 taudx_dummy_d (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
31 Real*8 taudy_dummy_d (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
32 Real*8 u_dummy_d (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
33 Real*8 v_dummy_d (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
34 Real*8 u_new_dummy_d (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
35 Real*8 v_new_dummy_d (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
36 #ifdef STREAMICE_HYBRID_STRESS
37 Real*8 taubx_dummy_d (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
38 Real*8 tauby_dummy_d (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
39 Real*8 visc_full_dummy_d (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
40 Real*8 taubx_new_dummy (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
41 Real*8 tauby_new_dummy (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
42 Real*8 visc_new_dummy (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
43 #endif
44
45 !<------------------End user declarations ------------------------>!
46 if (our_rev_mode%plain) then
47 our_orig_mode=our_rev_mode
48 IF(ISINLOOP .eq. 0) THEN
49 CONVERGED = .FALSE.
50 ADJ_CONVERGED = .FALSE.
51 !ERR_LAST_CHANGE = 10.
52 end if
53 IF(ISINLOOP .ne. 0) THEN
54 IF(.NOT. CONVERGED) THEN
55 NL_ITER = (NL_ITER + 1)
56 CALL OpenAD_streamice_vel_phi(MYTHID,MAXNLITER,MAXCGITER,CGTOL
57 +,CG_ITERS,err_max)
58
59 WRITE(MSGBUF,'(A,I5,A,I4,A)') 'streamice linear solve number',
60 +NL_ITER,' ',CG_ITERS,' iterations '
61
62 CALL print_message(MSGBUF,STANDARDMESSAGEUNIT,'R',1)
63
64 !!!!!!!!!!!! conv check
65
66 if (STREAMICE_chkresidconvergence) then
67
68
69 WRITE(msgBuf,'(A,E15.7)') 'err/err_init',
70 & err_max/err_init
71 CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
72 & SQUEEZE_RIGHT , 1)
73
74 IF (err_max .LE. streamice_nonlin_tol * err_init) THEN
75 CONVERGED = .true.
76 ENDIF
77
78 IF (err_max<err_last_change*1.e-2 .and.
79 & STREAMICE_lower_cg_tol) THEN
80 cgtol = cgtol * 5.e-2
81 err_last_change = err_max
82 WRITE(msgBuf,'(A,E15.7)') 'new cg tol: ',
83 & cgtol
84 CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
85 & SQUEEZE_RIGHT , 1)
86 ENDIF
87
88 endif
89
90 if (STREAMICE_chkfixedptconvergence) then
91
92 CALL openad_STREAMICE_GET_FP_ERR_OAD ( err_max_fp, myThid )
93
94 WRITE(msgBuf,'(A,1PE22.14)') 'STREAMICE_FP_ERROR =',
95 & err_max_fp
96 CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
97 & SQUEEZE_RIGHT , 1)
98
99 IF (err_max_fp .LE. streamice_nonlin_tol_fp) THEN
100 CONVERGED = .true.
101 ENDIF
102
103
104 endif
105
106
107 DO bj = myByLo(myThid), myByHi(myThid)
108 DO bi = myBxLo(myThid), myBxHi(myThid)
109 DO j=1-OLy,sNy+OLy
110 DO i=1-OLx,sNx+OLx
111 U_streamice (i,j,bi,bj)=u_new_SI (i,j,bi,bj)
112 V_streamice (i,j,bi,bj)=v_new_SI (i,j,bi,bj)
113 #ifdef STREAMICE_HYBRID_STRESS
114 streamice_taubx(i,j,bi,bj)=taubx_new_si(i,j,bi,bj)
115 streamice_tauby(i,j,bi,bj)=tauby_new_si(i,j,bi,bj)
116 DO m=Nr,1,-1
117 visc_streamice_full(i,j,m,bi,bj)=
118 & visc_full_new_si(i,j,m,bi,bj)
119 ENDDO
120 #endif
121 ENDDO
122 ENDDO
123 ENDDO
124 ENDDO
125
126 !!!!!!!!!!!! end conv check
127
128
129 end if
130 end if
131
132 our_rev_mode=our_orig_mode
133 end if
134
135
136 !!!!!!!!!!!! TAPE MODE !!!!!!!!!!!!!!
137
138
139
140
141
142 if (our_rev_mode%tape) then
143 our_orig_mode=our_rev_mode
144 if(isinloop.eq.0) then
145 CONVERGED = .false.
146 nl_iter = 0
147 end if
148
149 if(isinloop.eq.1) then
150
151 CALL TIMER_START('STREAMICE TAPE FIXED POINT LOOP',myThid)
152
153 IF (.not. (CONVERGED).AND. nl_iter.lt.MAXNLITER) THEN
154 NL_ITER = (NL_ITER+1)
155 !Run in plain mode while not converged
156 our_rev_mode%plain=.true.
157 our_rev_mode%tape=.false.
158 our_rev_mode%adjoint=.false.
159 CALL OpenAD_streamice_vel_phi(MYTHID,MAXNLITER,MAXCGITER,CGTOL
160 +,CG_ITERS,err_max)
161
162 !---- write out number of cg iters
163
164 WRITE(MSGBUF,'(A,I5,A,I4,A)') 'streamice linear solve number',
165 +NL_ITER,' ',CG_ITERS,' iterations '
166 ! OAD_CTMP0 = 1
167 CALL print_message(MSGBUF,STANDARDMESSAGEUNIT,'R',1)
168
169 !---- conv check
170
171 if (STREAMICE_chkresidconvergence) then
172
173
174 WRITE(msgBuf,'(A,E15.7)') 'err/err_init',
175 & err_max/err_init
176 CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
177 & SQUEEZE_RIGHT , 1)
178
179 IF (err_max .LE. streamice_nonlin_tol * err_init) THEN
180 CONVERGED = .true.
181 ENDIF
182
183 IF (err_max<err_last_change*1.e-2 .and.
184 & STREAMICE_lower_cg_tol) THEN
185 cgtol = cgtol * 5.e-2
186 err_last_change = err_max
187 WRITE(msgBuf,'(A,E15.7)') 'new cg tol: ',
188 & cgtol
189 CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
190 & SQUEEZE_RIGHT , 1)
191 ENDIF
192
193 endif
194
195 if (STREAMICE_chkfixedptconvergence) then
196
197 CALL openad_STREAMICE_GET_FP_ERR_OAD ( err_max_fp, myThid )
198
199 WRITE(msgBuf,'(A,1PE22.14)') 'STREAMICE_FP_ERROR =',
200 & err_max_fp
201 CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
202 & SQUEEZE_RIGHT , 1)
203
204 IF (err_max_fp .LE. streamice_nonlin_tol_fp) THEN
205 CONVERGED = .true.
206 ENDIF
207
208 endif
209
210 DO bj = myByLo(myThid), myByHi(myThid)
211 DO bi = myBxLo(myThid), myBxHi(myThid)
212 DO j=1-OLy,sNy+OLy
213 DO i=1-OLx,sNx+OLx
214 U_streamice (i,j,bi,bj)%v=u_new_SI (i,j,bi,bj)%v
215 V_streamice (i,j,bi,bj)%v=v_new_SI (i,j,bi,bj)%v
216 #ifdef STREAMICE_HYBRID_STRESS
217 streamice_taubx(i,j,bi,bj)%v=
218 & taubx_new_si(i,j,bi,bj)%v
219 streamice_tauby(i,j,bi,bj)%v=
220 & tauby_new_si(i,j,bi,bj)%v
221 DO m=Nr,1,-1
222 visc_streamice_full(i,j,m,bi,bj)%v=
223 & visc_full_new_si(i,j,m,bi,bj)%v
224 ENDDO
225 #endif
226 ENDDO
227 ENDDO
228 ENDDO
229 ENDDO
230
231
232
233
234
235 !--------conv check done
236
237 if (converged .OR. nl_iter.eq.MAXNLITER) then
238 !Run once in tape mode if this is the last time
239 our_rev_mode%plain=.false.
240 our_rev_mode%tape=.true.
241 our_rev_mode%adjoint=.false.
242 CALL OpenAD_streamice_vel_phi(MYTHID,MAXNLITER,MAXCGITER,CG
243 +TOL,CG_ITERS,err_max)
244 end if
245 end if
246 CALL TIMER_STOP('STREAMICE TAPE FIXED POINT LOOP',myThid)
247 end if
248 if(isinloop.eq.2 ) then
249
250 CALL OpenAD_streamice_vel_phi(MYTHID,MAXNLITER,MAXCGITER,CGTOL
251 +,CG_ITERS,err_max)
252
253 DO bj = myByLo(myThid), myByHi(myThid)
254 DO bi = myBxLo(myThid), myBxHi(myThid)
255 DO j=1-OLy,sNy+OLy
256 DO i=1-OLx,sNx+OLx
257 U_streamice (i,j,bi,bj)%v=u_new_SI (i,j,bi,bj)%v
258 V_streamice (i,j,bi,bj)%v=v_new_SI (i,j,bi,bj)%v
259 #ifdef STREAMICE_HYBRID_STRESS
260 streamice_taubx(i,j,bi,bj)%v=
261 & taubx_new_si(i,j,bi,bj)%v
262 streamice_tauby(i,j,bi,bj)%v=
263 & tauby_new_si(i,j,bi,bj)%v
264 DO m=Nr,1,-1
265 visc_streamice_full(i,j,m,bi,bj)%v=
266 & visc_full_new_si(i,j,m,bi,bj)%v
267 ENDDO
268 #endif
269 ENDDO
270 ENDDO
271 ENDDO
272 ENDDO
273 end if
274 our_rev_mode=our_orig_mode
275 end if
276
277
278 !!!!!!!!!!!! ADJOINT MODE !!!!!!!!!!!!!!
279
280
281
282 if (our_rev_mode%adjoint) then
283 our_orig_mode=our_rev_mode
284
285 if(isinloop.eq.2) then
286
287 ADJ_CONVERGED = .false.
288 adj_iter = 0
289
290 DO bj = myByLo(myThid), myByHi(myThid)
291 DO bi = myBxLo(myThid), myBxHi(myThid)
292 DO j=1-OLy,sNy+OLy
293 DO i=1-OLx,sNx+OLx
294 v_new_SI (i,j,bi,bj)%d= V_streamice(i,j,bi,bj)%d
295 V_streamice (i,j,bi,bj)%d = 0.0
296 u_new_SI (i,j,bi,bj)%d= U_streamice(i,j,bi,bj)%d
297 U_streamice (i,j,bi,bj)%d = 0.0
298 #ifdef STREAMICE_HYBRID_STRESS
299 taubx_new_si(i,j,bi,bj)%d=
300 & streamice_taubx(i,j,bi,bj)%d
301 streamice_taubx(i,j,bi,bj)%d = 0.0
302 tauby_new_si(i,j,bi,bj)%d=
303 & streamice_tauby(i,j,bi,bj)%d
304 streamice_tauby(i,j,bi,bj)%d = 0.0
305 DO m=Nr,1,-1
306 visc_full_new_si(i,j,m,bi,bj)%d=
307 & visc_streamice_full(i,j,m,bi,bj)%d
308 visc_streamice_full(i,j,m,bi,bj)%d = 0.0
309 ENDDO
310 #endif
311 ENDDO
312 ENDDO
313 ENDDO
314 ENDDO
315
316 CALL OpenAD_streamice_vel_phi(MYTHID,MAXNLITER,MAXCGITER,CGTOL
317 +,CG_ITERS,err_max)
318
319 DO BJ = MYBYLO(MYTHID), MYBYHI(MYTHID), 1
320 DO BI = MYBXLO(MYTHID), MYBXHI(MYTHID), 1
321 DO J = 1-OLy,sNy+OLy
322 DO I = 1-OLx,sNx+OLx
323
324 U_streamice_dvals(I,J,BI,BJ) =
325 +U_STREAMICE(INT(I),INT(J),INT(BI),INT(BJ))%d
326 V_streamice_dvals(I,J,BI,BJ) =
327 +V_STREAMICE(INT(I),INT(J),INT(BI),INT(BJ))%d
328 #ifdef STREAMICE_HYBRID_STRESS
329 taubx_dvals(I,J,BI,BJ) =
330 +streamice_taubx(INT(I),INT(J),INT(BI),INT(BJ))%d
331 tauby_dvals(I,J,BI,BJ) =
332 +streamice_tauby(INT(I),INT(J),INT(BI),INT(BJ))%d
333 DO m=Nr,1,-1
334 visc_full_dvals(I,J,m,BI,BJ) =
335 +VISC_STREAMICE_FULL(INT(I),INT(J),m,INT(BI),INT(BJ))%d
336 ENDDO
337 #endif
338
339 U_new_si(I,J,BI,BJ)%d =
340 +U_STREAMICE(INT(I),INT(J),INT(BI),INT(BJ))%d
341 V_new_si(I,J,BI,BJ)%d =
342 +V_STREAMICE(INT(I),INT(J),INT(BI),INT(BJ))%d
343 #ifdef STREAMICE_HYBRID_STRESS
344 taubx_new_si(I,J,BI,BJ)%d =
345 +streamice_taubx(INT(I),INT(J),INT(BI),INT(BJ))%d
346 tauby_new_si(I,J,BI,BJ)%d =
347 +streamice_tauby(INT(I),INT(J),INT(BI),INT(BJ))%d
348 DO m=Nr,1,-1
349 visc_full_new_si(I,J,m,BI,BJ)%d =
350 +VISC_STREAMICE_FULL(INT(I),INT(J),m,INT(BI),INT(BJ))%d
351 ENDDO
352 #endif
353
354 END DO
355 END DO
356 END DO
357 END DO
358
359 end if
360
361
362
363 if(isinloop.eq.1) then
364 if((.NOT.ADJ_CONVERGED).AND.(adj_iter.lt.MAXNLITER)) then
365
366 adj_iter = adj_iter + 1
367 if (adj_iter.eq.1) then
368 CALL TIMER_START('STREAMICE ADJ FIXED POINT LOOP0',myThid)
369 else
370 CALL TIMER_START('STREAMICE ADJ FIXED POINT LOOP',myThid)
371 endif
372
373 DO BJ = MYBYLO(MYTHID), MYBYHI(MYTHID), 1
374 DO BI = MYBXLO(MYTHID), MYBXHI(MYTHID), 1
375 DO J = 1-OLy,sNy+OLy
376 DO I = 1-OLx,sNx+OLx
377
378
379
380 U_DUMMY_D(INT(I),INT(J),INT(BI),INT(BJ)) =
381 +U_streamice(INT(I),INT(J),INT(BI),INT(BJ))%d
382 V_DUMMY_D(INT(I),INT(J),INT(BI),INT(BJ)) =
383 +V_streamice(INT(I),INT(J),INT(BI),INT(BJ))%d
384 #ifdef STREAMICE_HYBRID_STRESS
385 TAUBX_DUMMY_D(INT(I),INT(J),INT(BI),INT(BJ)) =
386 +streamice_taubx(INT(I),INT(J),INT(BI),INT(BJ))%d
387 TAUBY_DUMMY_D(INT(I),INT(J),INT(BI),INT(BJ)) =
388 +streamice_tauby(INT(I),INT(J),INT(BI),INT(BJ))%d
389 DO m=Nr,1,-1
390 VISC_FULL_DUMMY_D(INT(I),INT(J),m,INT(BI),INT(BJ))=
391 +VISC_STREAMICE_FULL(INT(I),INT(J),m,INT(BI),INT(BJ))%d
392 ENDDO
393 #endif
394
395
396 U_NEW_DUMMY_D(INT(I),INT(J),INT(BI),INT(BJ)) =
397 +U_NEW_SI(INT(I),INT(J),INT(BI),INT(BJ))%d
398 V_NEW_DUMMY_D(INT(I),INT(J),INT(BI),INT(BJ)) =
399 +V_NEW_SI(INT(I),INT(J),INT(BI),INT(BJ))%d
400 #ifdef STREAMICE_HYBRID_STRESS
401 TAUBX_new_DUMMY(INT(I),INT(J),INT(BI),INT(BJ)) =
402 +TAUBX_new_si(INT(I),INT(J),INT(BI),INT(BJ))%d
403 TAUBY_new_DUMMY(INT(I),INT(J),INT(BI),INT(BJ)) =
404 +TAUBY_new_si(INT(I),INT(J),INT(BI),INT(BJ))%d
405 DO m=Nr,1,-1
406 VISC_new_DUMMY(INT(I),INT(J),m,INT(BI),INT(BJ))=
407 +visc_full_new_si(INT(I),INT(J),m,INT(BI),INT(BJ))%d
408 ENDDO
409 #endif
410
411
412
413 U_STREAMICE(INT(I),INT(J),INT(BI),INT(BJ))%d =
414 +U_streamice_dvals(I,J,BI,BJ)
415 V_STREAMICE(INT(I),INT(J),INT(BI),INT(BJ))%d =
416 +V_STREAMICE_dvals(I,J,BI,BJ)
417 #ifdef STREAMICE_HYBRID_STRESS
418 streamice_taubx(INT(I),INT(J),INT(BI),INT(BJ))%d =
419 +taubx_dvals(I,J,BI,BJ)
420 streamice_tauby(INT(I),INT(J),INT(BI),INT(BJ))%d =
421 +tauby_dvals(I,J,BI,BJ)
422 DO m=Nr,1,-1
423 VISC_STREAMICE_FULL(INT(I),INT(J),m,INT(BI),INT(BJ))%d
424 +=visc_full_dvals(I,J,m,BI,BJ)
425 ENDDO
426 #endif
427
428
429
430 #ifdef STREAMICE_ALLOW_FRIC_CONTROL
431 C_basal_dummy_d(INT(I),INT(J),INT(BI),INT(BJ)) =
432 +C_basal_friction(INT(I),INT(J),INT(BI),INT(BJ))%d
433 #endif
434 #ifdef STREAMICE_ALLOW_BGLEN_CONTROL
435 b_glen_dummy_d(INT(I),INT(J),INT(BI),INT(BJ)) =
436 +B_glen(INT(I),INT(J),INT(BI),INT(BJ))%d
437 #endif
438 H_streamice_dummy_d(INT(I),INT(J),INT(BI),INT(BJ)) =
439 +H_streamice(INT(I),INT(J),INT(BI),INT(BJ))%d
440 taudx_dummy_d(INT(I),INT(J),INT(BI),INT(BJ)) =
441 +taudx_si(INT(I),INT(J),INT(BI),INT(BJ))%d
442 taudy_dummy_d(INT(I),INT(J),INT(BI),INT(BJ)) =
443 +taudy_si(INT(I),INT(J),INT(BI),INT(BJ))%d
444
445 END DO
446 END DO
447 END DO
448 END DO
449
450 !Store the stack pointers
451 temp_double_tape_pointer = oad_dt_ptr
452 temp_integer_tape_pointer = oad_it_ptr
453 temp_logical_tape_pointer = oad_lt_ptr
454 temp_string_tape_pointer = oad_st_ptr
455
456
457 #ifdef ALLOW_PETSC
458 IF (STREAMICE_OAD_petsc_reuse) then
459 if (adj_iter.eq.1) then
460 STREAMICE_need2createmat=.true.
461 STREAMICE_need2destroymat=.false.
462 PETSC_PRECOND_TMP = PETSC_PRECOND_TYPE
463 PETSC_PRECOND_TYPE = PETSC_PRECOND_OAD
464 else
465 STREAMICE_need2createmat=.false.
466 STREAMICE_need2destroymat=.false.
467 endif
468 ENDIF
469 #endif
470
471 CALL OpenAD_streamice_vel_phi(MYTHID,MAXNLITER,MAXCGITER,CGTOL
472 +,CG_ITERS,err_max)
473
474 #ifdef ALLOW_PETSC
475 IF (STREAMICE_OAD_petsc_reuse) then
476 if (adj_iter.eq.MAXNLITER) then
477 STREAMICE_need2createmat=.true.
478 STREAMICE_need2destroymat=.true.
479 CALL streamice_petscmatdestroy(mythid)
480 PETSC_PRECOND_TYPE = PETSC_PRECOND_TMP
481 endif
482 ENDIF
483 #endif
484
485 DO BJ = MYBYLO(MYTHID), MYBYHI(MYTHID), 1
486 DO BI = MYBXLO(MYTHID), MYBXHI(MYTHID), 1
487 DO J = 1-OLy,sNy+OLy
488 DO I = 1-OLx,sNx+OLx
489
490 U_NEW_SI(INT(I),INT(J),INT(BI),INT(BJ))%d =
491 +U_NEW_DUMMY_D(INT(I),INT(J),INT(BI),INT(BJ))
492 V_NEW_SI(INT(I),INT(J),INT(BI),INT(BJ))%d =
493 +V_NEW_DUMMY_D(INT(I),INT(J),INT(BI),INT(BJ))
494 #ifdef STREAMICE_HYBRID_STRESS
495 TAUBX_new_si(INT(I),INT(J),INT(BI),INT(BJ))%d =
496 +TAUBX_new_DUMMY(INT(I),INT(J),INT(BI),INT(BJ))
497 TAUBY_new_si(INT(I),INT(J),INT(BI),INT(BJ))%d =
498 +TAUBY_new_DUMMY(INT(I),INT(J),INT(BI),INT(BJ))
499 DO m=Nr,1,-1
500 visc_full_new_si(INT(I),INT(J),m,INT(BI),INT(BJ))%d=
501 +VISC_new_DUMMY(INT(I),INT(J),m,INT(BI),INT(BJ))
502 ENDDO
503 #endif
504
505 END DO
506 END DO
507 END DO
508 END DO
509
510 !---- write out number of cg iters
511
512 WRITE(MSGBUF,'(A,I5)') 'streamice adjoint solve number'
513 +,ADJ_ITER
514 ! OAD_CTMP0 = 1
515 CALL print_message(MSGBUF,STANDARDMESSAGEUNIT,'R',1)
516
517 !---- end write out number of cg iters
518
519 !---- conv check
520
521 if (STREAMICE_chkfixedptconvergence) then
522
523 CALL openad_STREAMICE_GET_FP_ERR_OAD ( err_max_fp, myThid )
524
525 WRITE(msgBuf,'(A,1PE22.14)') 'STREAMICE_FP_ADJ_ERROR =',
526 & err_max_fp
527 CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
528 & SQUEEZE_RIGHT , 1)
529
530 IF(adj_iter.eq.1) then
531 err_init = err_max_fp
532 ELSEIF (err_max_fp .LE.
533 & streamice_nonlin_tol_adjoint*err_init) THEN
534 ADJ_CONVERGED = .true.
535 #ifdef ALLOW_PETSC
536 IF (STREAMICE_OAD_petsc_reuse) THEN
537 STREAMICE_need2createmat=.true.
538 STREAMICE_need2destroymat=.true.
539 CALL streamice_petscmatdestroy(mythid)
540 PETSC_PRECOND_TYPE = PETSC_PRECOND_TMP
541 ENDIF
542 #endif
543 ENDIF
544
545 endif
546
547 !--------conv check done
548
549 DO BJ = MYBYLO(MYTHID), MYBYHI(MYTHID), 1
550 DO BI = MYBXLO(MYTHID), MYBXHI(MYTHID), 1
551 DO J = 1-OLy,sNy+OLy
552 DO I = 1-OLx,sNx+OLx
553
554 U_NEW_SI(INT(I),INT(J),INT(BI),INT(BJ))%d = U_STREAMICE(
555 +I,J,BI,BJ)%d
556 V_NEW_SI(INT(I),INT(J),INT(BI),INT(BJ))%d = V_STREAMICE(
557 +I,J,BI,BJ)%d
558 #ifdef STREAMICE_HYBRID_STRESS
559 TAUBX_NEW_SI(INT(I),INT(J),INT(BI),INT(BJ))%d = STREAMIC
560 +E_TAUBX(I,J,BI,BJ)%d
561 TAUBY_NEW_SI(INT(I),INT(J),INT(BI),INT(BJ))%d = STREAMIC
562 +E_TAUBY(I,J,BI,BJ)%d
563 DO m=Nr,1,-1
564 VISC_FULL_NEW_SI(INT(I),INT(J),m,INT(BI),INT(BJ))%d =
565 +VISC_STREAMICE_FULL(I,J,m,BI,BJ)%d
566 ENDDO
567 #endif
568
569 U_streamice(INT(I),INT(J),INT(BI),INT(BJ))%d =
570 +U_dummy_d(INT(I),INT(J),INT(BI),INT(BJ))
571 V_streamice(INT(I),INT(J),INT(BI),INT(BJ))%d =
572 +V_dummy_d(INT(I),INT(J),INT(BI),INT(BJ))
573 #ifdef STREAMICE_HYBRID_STRESS
574 streamice_taubx(INT(I),INT(J),INT(BI),INT(BJ))%d =
575 +taubx_dummy_d(INT(I),INT(J),INT(BI),INT(BJ))
576 streamice_tauby(INT(I),INT(J),INT(BI),INT(BJ))%d =
577 +tauby_dummy_d(INT(I),INT(J),INT(BI),INT(BJ))
578 DO m=Nr,1,-1
579 visc_streamice_full(I,J,m,BI,BJ)%d =
580 +visc_full_dummy_d(I,J,m,BI,BJ)
581 ENDDO
582 #endif
583
584 #ifdef STREAMICE_ALLOW_FRIC_CONTROL
585 C_basal_friction(INT(I),INT(J),INT(BI),INT(BJ))%d =
586 +C_basal_dummy_d(INT(I),INT(J),INT(BI),INT(BJ))
587 #endif
588 #ifdef STREAMICE_ALLOW_BGLEN_CONTROL
589 b_glen(INT(I),INT(J),INT(BI),INT(BJ))%d =
590 +B_glen_dummy_d(INT(I),INT(J),INT(BI),INT(BJ))
591 #endif
592 H_streamice(INT(I),INT(J),INT(BI),INT(BJ))%d =
593 +H_streamice_dummy_d(INT(I),INT(J),INT(BI),INT(BJ))
594 taudx_si(INT(I),INT(J),INT(BI),INT(BJ))%d =
595 +taudx_dummy_d(INT(I),INT(J),INT(BI),INT(BJ))
596 taudy_si(INT(I),INT(J),INT(BI),INT(BJ))%d =
597 +taudy_dummy_d(INT(I),INT(J),INT(BI),INT(BJ))
598
599 END DO
600 END DO
601 END DO
602 END DO
603
604 oad_dt_ptr = temp_double_tape_pointer
605 oad_it_ptr = temp_integer_tape_pointer
606 oad_lt_ptr = temp_logical_tape_pointer
607 oad_st_ptr = temp_string_tape_pointer
608
609 if (adj_iter.eq.1) then
610 CALL TIMER_STOP('STREAMICE ADJ FIXED POINT LOOP0',myThid)
611 else
612 CALL TIMER_STOP('STREAMICE ADJ FIXED POINT LOOP',myThid)
613 endif
614 end if
615 end if
616
617 if(isinloop.eq.0) then
618
619 CALL OpenAD_streamice_vel_phi(MYTHID,MAXNLITER,MAXCGITER,CGTOL
620 +,CG_ITERS,err_max)
621
622 DO BJ = MYBYLO(MYTHID), MYBYHI(MYTHID), 1
623 DO BI = MYBXLO(MYTHID), MYBXHI(MYTHID), 1
624 DO J = 1-OLy,sNy+OLy
625 DO I = 1-OLx,sNx+OLx
626
627 U_streamice(INT(I),INT(J),INT(BI),INT(BJ))%d = 0. _d 0
628 V_streamice(INT(I),INT(J),INT(BI),INT(BJ))%d = 0. _d 0
629 #ifdef STREAMICE_HYBRID_STRESS
630 streamice_taubx(INT(I),INT(J),INT(BI),INT(BJ))%d = 0. _d 0
631 streamice_tauby(INT(I),INT(J),INT(BI),INT(BJ))%d = 0. _d 0
632 DO m=Nr,1,-1
633 visc_streamice_full(INT(I),INT(J),m,INT(BI),INT(BJ))%d = 0. _d 0
634 ENDDO
635 #endif
636
637 END DO
638 END DO
639 END DO
640 END DO
641
642 end if
643
644
645 our_rev_mode=our_orig_mode
646 end if
647
648 #endif
649
650 end subroutine template
651

  ViewVC Help
Powered by ViewVC 1.1.22