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

Annotation of /MITgcm_contrib/heimbach/OpenAD/OAD_support/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 Nov 20 15:19:44 2007 UTC (18 years, 9 months ago) by utke
Branch: MAIN
common runtime support

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