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

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

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


Revision 1.1 - (show annotations) (download)
Thu Sep 20 23:12:47 2012 UTC (11 years, 7 months ago) by heimbach
Branch: MAIN
CVS Tags: checkpoint64o, checkpoint64a, checkpoint64q, checkpoint64p, checkpoint64r, checkpoint64n, checkpoint64b, checkpoint64e, checkpoint64d, checkpoint64c, checkpoint64g, checkpoint64f, checkpoint64i, checkpoint64h, checkpoint64k, checkpoint64, checkpoint64j, checkpoint64m, checkpoint64l
* Merge OAD_support from MITgcm_contrib/heimbach/OpenAD/OAD_support/
  to tools/OAD_support/
* Adjust genmake2 to reflect path change (attempt with ${OADTOOLS})
* Adjust insertTemplateDir.bash to reflect path change
Seems to work.

1 subroutine template()
2 use OAD_cp
3 use OAD_tape
4 use OAD_rev
5
6 !$TEMPLATE_PRAGMA_DECLARATIONS
7
8 integer :: cp_loop_variable_1,cp_loop_variable_2,
9 + cp_loop_variable_3,cp_loop_variable_4
10
11 type(modeType) :: our_orig_mode
12
13 integer iaddr
14 external iaddr
15
16 INTEGER numItersHelper
17 INTEGER myThidHelper
18
19 Real*8 cg2d_b_p(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
20 Real*8 cg2d_x_p(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
21
22 #ifdef OAD_DEBUG_JOINT
23 character*(80):: indentation='
24 + '
25 our_indent=our_indent+1
26
27 write(standardmessageunit, '(A,A,A)', ADVANCE='NO')
28 +'OAD:',indentation(1:our_indent), 'enter __SRNAME__:'
29 call oad_dump_revmod(); call oad_dump_tapestats()
30 write(standardmessageunit,*)
31 #endif
32 if (our_rev_mode%plain) then
33 #ifdef OAD_DEBUG_JOINT
34 write(standardmessageunit,'(A,A,A)')
35 +'OAD:',indentation(1:our_indent),
36 +' __SRNAME__: entering plain'
37 #endif
38 c set up for plain execution
39 our_orig_mode=our_rev_mode
40 our_rev_mode%arg_store=.FALSE.
41 our_rev_mode%arg_restore=.FALSE.
42 our_rev_mode%plain=.TRUE.
43 our_rev_mode%tape=.FALSE.
44 our_rev_mode%adjoint=.FALSE.
45 #ifdef OAD_DEBUG_JOINT
46 write(standardmessageunit,'(A,A,A)')
47 +'OAD:',indentation(1:our_indent),
48 +' __SRNAME__: runninng plain / down plain'
49 #endif
50 cg2d_b_p=cg2d_b%v
51 cg2d_x_p=cg2d_x%v
52 call cg2d (
53 I cg2d_b_p,
54 U cg2d_x_p,
55 O firstResidual,
56 O minResidualSq,
57 O lastResidual,
58 U numIters,
59 O nIterMin,
60 I myThid)
61 cg2d_x%v=cg2d_x_p
62 c reset the mode
63 our_rev_mode=our_orig_mode
64 end if
65 if (our_rev_mode%tape) then
66
67 numItersHelper=numiters
68 mythidHelper=mythid
69 #ifdef OAD_DEBUG_JOINT
70 write(standardmessageunit,'(A,A,A)')
71 +'OAD:',indentation(1:our_indent),
72 +' __SRNAME__: entering tape'
73 #endif
74 c set up for plain execution
75 our_orig_mode=our_rev_mode
76 our_rev_mode%arg_store=.FALSE.
77 our_rev_mode%arg_restore=.FALSE.
78 our_rev_mode%plain=.TRUE.
79 our_rev_mode%tape=.FALSE.
80 our_rev_mode%adjoint=.FALSE.
81 #ifdef OAD_DEBUG_JOINT
82 write(standardmessageunit,'(A,A,A)')
83 +'OAD:',indentation(1:our_indent),
84 +' __SRNAME__: runninng plain / down plain'
85 #endif
86 cg2d_b_p=cg2d_b%v
87 cg2d_x_p=cg2d_x%v
88 call cg2d (
89 I cg2d_b_p,
90 U cg2d_x_p,
91 O firstResidual,
92 O minResidualSq,
93 O lastResidual,
94 U numIters,
95 O nIterMin,
96 I myThid)
97 cg2d_x%v=cg2d_x_p
98 c reset the mode
99 our_rev_mode=our_orig_mode
100 c manually push two integers to the tape:
101 if(oad_it_sz.lt. oad_it_ptr) call oad_it_grow()
102 oad_it(oad_it_ptr)=numItersHelper; oad_it_ptr=oad_it_ptr+1
103 if(oad_it_sz.lt. oad_it_ptr) call oad_it_grow()
104 oad_it(oad_it_ptr)=mythidHelper; oad_it_ptr=oad_it_ptr+1
105 end if
106 if (our_rev_mode%adjoint) then
107 #ifdef OAD_DEBUG_JOINT
108 write(standardmessageunit,'(A,A,A)')
109 +'OAD:',indentation(1:our_indent),
110 +' __SRNAME__: entering adjoint'
111 #endif
112 c manually pop two integers from the tape:
113 oad_it_ptr=oad_it_ptr-1
114 mythid=oad_it(oad_it_ptr)
115 oad_it_ptr=oad_it_ptr-1
116 numiters=oad_it(oad_it_ptr)
117 c selfadjoint:
118 c the original is called with
119 c cg2d(b,x,...)
120 c in the adjoint context if we
121 c use the same code base
122 c we call with
123 c cg2d(x_bar,bh,...
124 c where afterwards
125 c b_bar+=bh and x_bar=0
126 c the adjoint second formal argument cg2d_x should be
127 c the values of the first argument:
128 cg2d_b_p=cg2d_x%d
129 c the first formal argument cg2d_b should hold
130 c the increment, i.e. we nullify the second formal
131 c argument (cg2d_x) value:
132 cg2d_x_p=0.0
133 c set up for plain execution
134 our_orig_mode=our_rev_mode
135 our_rev_mode%arg_store=.FALSE.
136 our_rev_mode%arg_restore=.FALSE.
137 our_rev_mode%plain=.TRUE.
138 our_rev_mode%tape=.FALSE.
139 our_rev_mode%adjoint=.FALSE.
140 #ifdef OAD_DEBUG_JOINT
141 write(standardmessageunit,'(A,A,A)')
142 +'OAD:',indentation(1:our_indent),
143 +' __SRNAME__: runninng self adjoint / down plain'
144 #endif
145 call cg2d (
146 I cg2d_b_p,
147 U cg2d_x_p,
148 O firstResidual,
149 O minResidualSq,
150 O lastResidual,
151 U numIters,
152 O nIterMin,
153 I myThid)
154 c reset the mode
155 our_rev_mode=our_orig_mode
156 c now the adjoint result is the increment
157 c contained in the second formal argument
158 cg2d_b%d= cg2d_b%d+cg2d_x_p
159 cg2d_x%d=0.0
160 end if
161 #ifdef OAD_DEBUG_JOINT
162 write(standardmessageunit,'(A,A,A)', ADVANCE='NO')
163 +'OAD:',indentation(1:our_indent), 'leave __SRNAME__:'
164 call oad_dump_revmod(); call oad_dump_tapestats()
165 write(standardmessageunit,*)
166
167 our_indent=our_indent-1
168 #endif
169
170 end subroutine template

  ViewVC Help
Powered by ViewVC 1.1.22