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

Contents of /MITgcm_contrib/heimbach/OpenAD/code_shallow_openad2/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:10:14 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,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 +' TD:',double_tape_pointer,
32 +' TI:',integer_tape_pointer
33
34
35 if (our_rev_mode%plain) then
36 write(*,'(A,A,A)')
37 +'JU:',indentation(1:our_indent),
38 +' __SRNAME__: entering plain'
39 c set up for plain execution
40 our_orig_mode=our_rev_mode
41 our_rev_mode%arg_store=.FALSE.
42 our_rev_mode%arg_restore=.FALSE.
43 our_rev_mode%plain=.TRUE.
44 our_rev_mode%tape=.FALSE.
45 our_rev_mode%adjoint=.FALSE.
46 write(*,'(A,A,A)')
47 +'JU:',indentation(1:our_indent),
48 +' __SRNAME__: runninng plain / down plain'
49 !$PLACEHOLDER_PRAGMA$ id=1
50 c reset the mode
51 our_rev_mode=our_orig_mode
52 end if
53 if (our_rev_mode%tape) then
54
55 numItersHelper=numiters
56 mythidHelper=mythid
57
58 write(*,'(A,A,A)')
59 +'JU:',indentation(1:our_indent),
60 +' __SRNAME__: entering tape'
61 c set up for plain execution
62 our_orig_mode=our_rev_mode
63 our_rev_mode%arg_store=.FALSE.
64 our_rev_mode%arg_restore=.FALSE.
65 our_rev_mode%plain=.TRUE.
66 our_rev_mode%tape=.FALSE.
67 our_rev_mode%adjoint=.FALSE.
68 write(*,'(A,A,A)')
69 +'JU:',indentation(1:our_indent),
70 +' __SRNAME__: runninng plain / down plain'
71 !$PLACEHOLDER_PRAGMA$ id=1
72 c reset the mode
73 our_rev_mode=our_orig_mode
74
75 if (integer_tape_size .lt. integer_tape_pointer) then
76 allocate(integer_tmp_tape(integer_tape_size))
77 integer_tmp_tape = integer_tape
78 deallocate(integer_tape)
79 allocate(integer_tape(integer_tape_size*2))
80 print *,"IT+"
81 integer_tape(1:integer_tape_size) = integer_tmp_tape
82 deallocate(integer_tmp_tape)
83 integer_tape_size = integer_tape_size*2
84 end if
85 integer_tape(integer_tape_pointer) = numItersHelper
86 integer_tape_pointer = integer_tape_pointer+1
87
88 if (integer_tape_size .lt. integer_tape_pointer) then
89 allocate(integer_tmp_tape(integer_tape_size))
90 integer_tmp_tape = integer_tape
91 deallocate(integer_tape)
92 allocate(integer_tape(integer_tape_size*2))
93 print *,"IT+"
94 integer_tape(1:integer_tape_size) = integer_tmp_tape
95 deallocate(integer_tmp_tape)
96 integer_tape_size = integer_tape_size*2
97 end if
98 integer_tape(integer_tape_pointer) = mythidHelper
99 integer_tape_pointer = integer_tape_pointer+1
100
101 end if
102 if (our_rev_mode%adjoint) then
103 write(*,'(A,A,A)')
104 +'JU:',indentation(1:our_indent),
105 +' __SRNAME__: entering adjoint'
106
107 integer_tape_pointer = integer_tape_pointer-1
108 mythid = integer_tape(integer_tape_pointer)
109
110 integer_tape_pointer = integer_tape_pointer-1
111 numiters = integer_tape(integer_tape_pointer)
112
113 c selfadjoint:
114 c the original is called with
115 c cg2d(b,x,...)
116 c in the adjoint context if we
117 c use the same code base
118 c we call with
119 c cg2d(x_bar,bh,...
120 c where afterwards
121 c b_bar+=bh and x_bar=0
122 do cp_loop_variable_1=1-OLx,sNx+OLx
123 do cp_loop_variable_2=1-OLy,sNy+OLy
124 do cp_loop_variable_3=1,nSx
125 do cp_loop_variable_4=1,nSy
126 c the adjoint second formal argument cg2d_x should be
127 c the values of the first argument:
128 cg2d_b(cp_loop_variable_1,
129 + cp_loop_variable_2,
130 + cp_loop_variable_3,
131 + cp_loop_variable_4)%v=
132 + cg2d_x(cp_loop_variable_1,
133 + cp_loop_variable_2,
134 + cp_loop_variable_3,
135 + cp_loop_variable_4)%d
136 c the first formal argument cg2d_b should hold
137 c the increment, i.e. we nullify the second formal
138 c argument (cg2d_x) value:
139 cg2d_x(cp_loop_variable_1,
140 + cp_loop_variable_2,
141 + cp_loop_variable_3,
142 + cp_loop_variable_4)%v=0.0
143 end do
144 end do
145 end do
146 end do
147 c set up for plain execution
148 our_orig_mode=our_rev_mode
149 our_rev_mode%arg_store=.FALSE.
150 our_rev_mode%arg_restore=.FALSE.
151 our_rev_mode%plain=.TRUE.
152 our_rev_mode%tape=.FALSE.
153 our_rev_mode%adjoint=.FALSE.
154 write(*,'(A,A,A)')
155 +'JU:',indentation(1:our_indent),
156 +' __SRNAME__: runninng self adjoint / down plain'
157 !$PLACEHOLDER_PRAGMA$ id=1
158 c reset the mode
159 our_rev_mode=our_orig_mode
160 c now the adjoint result is the increment
161 c contained in the second formal argument
162 do cp_loop_variable_1=1-OLx,sNx+OLx
163 do cp_loop_variable_2=1-OLy,sNy+OLy
164 do cp_loop_variable_3=1,nSx
165 do cp_loop_variable_4=1,nSy
166 cg2d_b(cp_loop_variable_1,
167 + cp_loop_variable_2,
168 + cp_loop_variable_3,
169 + cp_loop_variable_4)%d=
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_x(cp_loop_variable_1,
175 + cp_loop_variable_2,
176 + cp_loop_variable_3,
177 + cp_loop_variable_4)%v
178 cg2d_x%d=0.0
179 end do
180 end do
181 end do
182 end do
183 end if
184
185 write(*,
186 +'(A,A,A,A,L,A,L,A,L,A,L,A,L,A,L,A,I8,A,I8)')
187 +'JU:',indentation(1:our_indent), 'leave __SRNAME__:',
188 +' As:',our_rev_mode%arg_store,
189 +' Ar:',our_rev_mode%arg_restore,
190 +' Pl:',our_rev_mode%plain,
191 +' Ta:',our_rev_mode%tape,
192 +' Ad:',our_rev_mode%adjoint,
193 +' Sw:',our_rev_mode%switchedToCheckpoint,
194 +' TD:',double_tape_pointer,
195 +' TI:',integer_tape_pointer
196
197
198 our_indent=our_indent-1
199 end subroutine template

  ViewVC Help
Powered by ViewVC 1.1.22