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

Annotation of /MITgcm_contrib/heimbach/OpenAD/code_shallow_openad3/ad_template.sa_cg2d.f

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


Revision 1.1 - (hide annotations) (download)
Tue Aug 1 15:44:28 2006 UTC (20 years, 3 months ago) by utke
Branch: MAIN
gmredi enabled setup

1 utke 1.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