/[MITgcm]/MITgcm_contrib/heimbach/OpenAD/code_shallow_openad/ad_template.sa_cg2d.f
ViewVC logotype

Contents of /MITgcm_contrib/heimbach/OpenAD/code_shallow_openad/ad_template.sa_cg2d.f

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


Revision 1.3 - (show annotations) (download)
Thu Dec 19 16:09:57 2013 UTC (12 years, 10 months ago) by utke
Branch: MAIN
CVS Tags: HEAD
Changes since 1.2: +0 -0 lines
FILE REMOVED
stale

1 subroutine template()
2 use OpenAD_checkpoints
3 use OpenAD_tape
4 use OpenAD_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 character*(80):: indentation='
20 + '
21 our_indent=our_indent+1
22 write(*,
23 +'(A,A,A,A,L,A,L,A,L,A,L,A,L,A,L,A,I6,A,I6,A,I6,A,I6,A,I8,A,I8)')
24 +'JU:',indentation(1:our_indent), 'enter __SRNAME__:',
25 +' As:',our_rev_mode%arg_store,
26 +' Ar:',our_rev_mode%arg_restore,
27 +' Pl:',our_rev_mode%plain,
28 +' Ta:',our_rev_mode%tape,
29 +' Ad:',our_rev_mode%adjoint,
30 +' Sw:',our_rev_mode%switchedToCheckpoint,
31 +' CD:',cp_double_pointer,
32 +' CI:',cp_integer_pointer,
33 +' CB:',cp_boolean_pointer,
34 +' CS:',cp_string_pointer,
35 +' TD:',double_tape_pointer,
36 +' TI:',integer_tape_pointer
37
38
39 if (our_rev_mode%plain) then
40 write(*,'(A,A,A)')
41 +'JU:',indentation(1:our_indent),
42 +' __SRNAME__: entering plain'
43 c set up for plain execution
44 our_orig_mode=our_rev_mode
45 our_rev_mode%arg_store=.FALSE.
46 our_rev_mode%arg_restore=.FALSE.
47 our_rev_mode%plain=.TRUE.
48 our_rev_mode%tape=.FALSE.
49 our_rev_mode%adjoint=.FALSE.
50 write(*,'(A,A,A)')
51 +'JU:',indentation(1:our_indent),
52 +' __SRNAME__: runninng plain / down plain'
53 !$PLACEHOLDER_PRAGMA$ id=1
54 c reset the mode
55 our_rev_mode=our_orig_mode
56 end if
57 if (our_rev_mode%tape) then
58
59 numItersHelper=numiters
60 mythidHelper=mythid
61
62 write(*,'(A,A,A)')
63 +'JU:',indentation(1:our_indent),
64 +' __SRNAME__: entering tape'
65 c set up for plain execution
66 our_orig_mode=our_rev_mode
67 our_rev_mode%arg_store=.FALSE.
68 our_rev_mode%arg_restore=.FALSE.
69 our_rev_mode%plain=.TRUE.
70 our_rev_mode%tape=.FALSE.
71 our_rev_mode%adjoint=.FALSE.
72 write(*,'(A,A,A)')
73 +'JU:',indentation(1:our_indent),
74 +' __SRNAME__: runninng plain / down plain'
75 !$PLACEHOLDER_PRAGMA$ id=1
76 c reset the mode
77 our_rev_mode=our_orig_mode
78
79 if (integer_tape_size .lt. integer_tape_pointer) then
80 allocate(integer_tmp_tape(integer_tape_size))
81 integer_tmp_tape = integer_tape
82 deallocate(integer_tape)
83 allocate(integer_tape(integer_tape_size*2))
84 print *,"IT+"
85 integer_tape(1:integer_tape_size) = integer_tmp_tape
86 deallocate(integer_tmp_tape)
87 integer_tape_size = integer_tape_size*2
88 end if
89 integer_tape(integer_tape_pointer) = numItersHelper
90 integer_tape_pointer = integer_tape_pointer+1
91
92 if (integer_tape_size .lt. integer_tape_pointer) then
93 allocate(integer_tmp_tape(integer_tape_size))
94 integer_tmp_tape = integer_tape
95 deallocate(integer_tape)
96 allocate(integer_tape(integer_tape_size*2))
97 print *,"IT+"
98 integer_tape(1:integer_tape_size) = integer_tmp_tape
99 deallocate(integer_tmp_tape)
100 integer_tape_size = integer_tape_size*2
101 end if
102 integer_tape(integer_tape_pointer) = mythidHelper
103 integer_tape_pointer = integer_tape_pointer+1
104
105 end if
106 if (our_rev_mode%adjoint) then
107 write(*,'(A,A,A)')
108 +'JU:',indentation(1:our_indent),
109 +' __SRNAME__: entering adjoint'
110
111 integer_tape_pointer = integer_tape_pointer-1
112 mythid = integer_tape(integer_tape_pointer)
113
114 integer_tape_pointer = integer_tape_pointer-1
115 numiters = integer_tape(integer_tape_pointer)
116
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 do cp_loop_variable_1=1-OLx,sNx+OLx
127 do cp_loop_variable_2=1-OLy,sNy+OLy
128 do cp_loop_variable_3=1,nSx
129 do cp_loop_variable_4=1,nSy
130 c the adjoint second formal argument cg2d_x should be
131 c the values of the first argument:
132 cg2d_b(cp_loop_variable_1,
133 + cp_loop_variable_2,
134 + cp_loop_variable_3,
135 + cp_loop_variable_4)%v=
136 + cg2d_x(cp_loop_variable_1,
137 + cp_loop_variable_2,
138 + cp_loop_variable_3,
139 + cp_loop_variable_4)%d
140 c the first formal argument cg2d_b should hold
141 c the increment, i.e. we nullify the second formal
142 c argument (cg2d_x) value:
143 cg2d_x(cp_loop_variable_1,
144 + cp_loop_variable_2,
145 + cp_loop_variable_3,
146 + cp_loop_variable_4)%v=0.0
147 end do
148 end do
149 end do
150 end do
151 c set up for plain execution
152 our_orig_mode=our_rev_mode
153 our_rev_mode%arg_store=.FALSE.
154 our_rev_mode%arg_restore=.FALSE.
155 our_rev_mode%plain=.TRUE.
156 our_rev_mode%tape=.FALSE.
157 our_rev_mode%adjoint=.FALSE.
158 write(*,'(A,A,A)')
159 +'JU:',indentation(1:our_indent),
160 +' __SRNAME__: runninng self adjoint / down plain'
161 !$PLACEHOLDER_PRAGMA$ id=1
162 c reset the mode
163 our_rev_mode=our_orig_mode
164 c now the adjoint result is the increment
165 c contained in the second formal argument
166 do cp_loop_variable_1=1-OLx,sNx+OLx
167 do cp_loop_variable_2=1-OLy,sNy+OLy
168 do cp_loop_variable_3=1,nSx
169 do cp_loop_variable_4=1,nSy
170 cg2d_b(cp_loop_variable_1,
171 + cp_loop_variable_2,
172 + cp_loop_variable_3,
173 + cp_loop_variable_4)%d=
174 + cg2d_b(cp_loop_variable_1,
175 + cp_loop_variable_2,
176 + cp_loop_variable_3,
177 + cp_loop_variable_4)%d+
178 + cg2d_x(cp_loop_variable_1,
179 + cp_loop_variable_2,
180 + cp_loop_variable_3,
181 + cp_loop_variable_4)%v
182 cg2d_x%d=0.0
183 end do
184 end do
185 end do
186 end do
187 end if
188
189 write(*,
190 +'(A,A,A,A,L,A,L,A,L,A,L,A,L,A,L,A,I6,A,I6,A,I6,A,I6,A,I8,A,I8)')
191 +'JU:',indentation(1:our_indent), 'leave __SRNAME__:',
192 +' As:',our_rev_mode%arg_store,
193 +' Ar:',our_rev_mode%arg_restore,
194 +' Pl:',our_rev_mode%plain,
195 +' Ta:',our_rev_mode%tape,
196 +' Ad:',our_rev_mode%adjoint,
197 +' Sw:',our_rev_mode%switchedToCheckpoint,
198 +' CD:',cp_double_pointer,
199 +' CI:',cp_integer_pointer,
200 +' CB:',cp_boolean_pointer,
201 +' CS:',cp_string_pointer,
202 +' TD:',double_tape_pointer,
203 +' TI:',integer_tape_pointer
204
205
206 our_indent=our_indent-1
207 end subroutine template

  ViewVC Help
Powered by ViewVC 1.1.22