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

Annotation 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 - (hide 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 dgoldberg 1.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 dgoldberg 1.3 !ERR_LAST_CHANGE = 10.
52 dgoldberg 1.1 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 dgoldberg 1.3 +,CG_ITERS,err_max)
58 dgoldberg 1.1
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 dgoldberg 1.2 if (STREAMICE_chkresidconvergence) then
67    
68 dgoldberg 1.1
69 dgoldberg 1.2 WRITE(msgBuf,'(A,E15.7)') 'err/err_init',
70     & err_max/err_init
71 dgoldberg 1.1 CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
72     & SQUEEZE_RIGHT , 1)
73    
74 dgoldberg 1.2 IF (err_max .LE. streamice_nonlin_tol * err_init) THEN
75 dgoldberg 1.1 CONVERGED = .true.
76     ENDIF
77    
78 dgoldberg 1.2 IF (err_max<err_last_change*1.e-2 .and.
79 dgoldberg 1.1 & STREAMICE_lower_cg_tol) THEN
80     cgtol = cgtol * 5.e-2
81 dgoldberg 1.2 err_last_change = err_max
82 dgoldberg 1.1 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 dgoldberg 1.3
90 dgoldberg 1.2 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 dgoldberg 1.1
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 dgoldberg 1.3 !!!!!!!!!!!! end conv check
127    
128    
129 dgoldberg 1.1 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 dgoldberg 1.5
151     CALL TIMER_START('STREAMICE TAPE FIXED POINT LOOP',myThid)
152    
153 dgoldberg 1.1 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 dgoldberg 1.3 +,CG_ITERS,err_max)
161 dgoldberg 1.1
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 dgoldberg 1.4 ! OAD_CTMP0 = 1
167     CALL print_message(MSGBUF,STANDARDMESSAGEUNIT,'R',1)
168 dgoldberg 1.1
169     !---- conv check
170    
171 dgoldberg 1.2 if (STREAMICE_chkresidconvergence) then
172 dgoldberg 1.1
173    
174 dgoldberg 1.2 WRITE(msgBuf,'(A,E15.7)') 'err/err_init',
175     & err_max/err_init
176 dgoldberg 1.1 CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
177     & SQUEEZE_RIGHT , 1)
178    
179 dgoldberg 1.2 IF (err_max .LE. streamice_nonlin_tol * err_init) THEN
180 dgoldberg 1.1 CONVERGED = .true.
181     ENDIF
182    
183 dgoldberg 1.2 IF (err_max<err_last_change*1.e-2 .and.
184 dgoldberg 1.1 & STREAMICE_lower_cg_tol) THEN
185     cgtol = cgtol * 5.e-2
186 dgoldberg 1.2 err_last_change = err_max
187 dgoldberg 1.1 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 dgoldberg 1.2 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 dgoldberg 1.1 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 dgoldberg 1.3
231    
232    
233    
234    
235     !--------conv check done
236    
237 dgoldberg 1.1 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 dgoldberg 1.2 CALL OpenAD_streamice_vel_phi(MYTHID,MAXNLITER,MAXCGITER,CG
243 dgoldberg 1.3 +TOL,CG_ITERS,err_max)
244 dgoldberg 1.1 end if
245     end if
246 dgoldberg 1.5 CALL TIMER_STOP('STREAMICE TAPE FIXED POINT LOOP',myThid)
247 dgoldberg 1.1 end if
248     if(isinloop.eq.2 ) then
249    
250     CALL OpenAD_streamice_vel_phi(MYTHID,MAXNLITER,MAXCGITER,CGTOL
251 dgoldberg 1.3 +,CG_ITERS,err_max)
252 dgoldberg 1.1
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 dgoldberg 1.3 +,CG_ITERS,err_max)
318 dgoldberg 1.1
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 dgoldberg 1.5 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 dgoldberg 1.1
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 dgoldberg 1.5 #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 dgoldberg 1.1
471     CALL OpenAD_streamice_vel_phi(MYTHID,MAXNLITER,MAXCGITER,CGTOL
472 dgoldberg 1.3 +,CG_ITERS,err_max)
473 dgoldberg 1.1
474 dgoldberg 1.5 #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 dgoldberg 1.1 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 dgoldberg 1.4 ! OAD_CTMP0 = 1
515     CALL print_message(MSGBUF,STANDARDMESSAGEUNIT,'R',1)
516 dgoldberg 1.1
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 dgoldberg 1.5 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 dgoldberg 1.1 ADJ_CONVERGED = .true.
535 dgoldberg 1.5 #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 dgoldberg 1.1 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 dgoldberg 1.5 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 dgoldberg 1.1 end if
615     end if
616    
617     if(isinloop.eq.0) then
618    
619 dgoldberg 1.3 CALL OpenAD_streamice_vel_phi(MYTHID,MAXNLITER,MAXCGITER,CGTOL
620     +,CG_ITERS,err_max)
621 dgoldberg 1.1
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