/[MITgcm]/manual/s_autodiff/text/doc_ad_2.tex
ViewVC logotype

Contents of /manual/s_autodiff/text/doc_ad_2.tex

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


Revision 1.3 - (show annotations) (download) (as text)
Thu Sep 27 02:00:24 2001 UTC (23 years, 9 months ago) by cnh
Branch: MAIN
Changes since 1.2: +3 -1 lines
File MIME type: application/x-tex

part5 has a problem with latex2html toward the end.
Not sure what the prob. is. For now I have addded a
commented out \end{document} just before where
problem starts. If all else fails we can have the
first version of web doc up to here - just uncomment
\end{document}! Anybody
see what the problem is? Using l2h 99.1 - looks
good for everything up to \end{docu...} Problem
is with image generation.

1 % $Header: /u/gcmpack/mitgcmdoc/part5/doc_ad_2.tex,v 1.2 2001/08/08 22:08:41 heimbach Exp $
2 % $Name: $
3
4 {\sf Automatic differentiation} (AD), also referred to as algorithmic
5 (or, more loosely, computational) differentiation, involves
6 automatically deriving code to calculate
7 partial derivatives from an existing fully non-linear prognostic code.
8 (see \cite{gri:00}).
9 A software tool is used that parses and transforms source files
10 according to a set of linguistic and mathematical rules.
11 AD tools are like source-to-source translators in that
12 they parse a program code as input and produce a new program code
13 as output.
14 However, unlike a pure source-to-source translation, the output program
15 represents a new algorithm, such as the evaluation of the
16 Jacobian, the Hessian, or higher derivative operators.
17 In principle, a variety of derived algorithms
18 can be generated automatically in this way.
19
20 The MITGCM has been adapted for use with the
21 Tangent linear and Adjoint Model Compiler (TAMC) and its succssor TAF
22 (Transformation of Algorithms in Fortran), developed
23 by Ralf Giering (\cite{gie-kam:98}, \cite{gie:99,gie:00}).
24 The first application of the adjoint of the MITGCM for senistivity
25 studies has been published by \cite{maro-eta:99}.
26 \cite{sta-eta:97,sta-eta:01} use the MITGCM and its adjoint
27 for ocean state estimation studies.
28
29 TAMC exploits the chain rule for computing the first
30 derivative of a function with
31 respect to a set of input variables.
32 Treating a given forward code as a composition of operations --
33 each line representing a compositional element -- the chain rule is
34 rigorously applied to the code, line by line. The resulting
35 tangent linear or adjoint code,
36 then, may be thought of as the composition in
37 forward or reverse order, respectively, of the
38 Jacobian matrices of the forward code compositional elements.
39
40 %**********************************************************************
41 \section{Some basic algebra}
42 \label{sec_ad_algebra}
43 %**********************************************************************
44
45 Let $ \cal{M} $ be a general nonlinear, model, i.e. a
46 mapping from the $m$-dimensional space
47 $U \subset I\!\!R^m$ of input variables
48 $\vec{u}=(u_1,\ldots,u_m)$
49 (model parameters, initial conditions, boundary conditions
50 such as forcing functions) to the $n$-dimensional space
51 $V \subset I\!\!R^n$ of
52 model output variable $\vec{v}=(v_1,\ldots,v_n)$
53 (model state, model diagnostcs, objective function, ...)
54 under consideration,
55 %
56 \begin{equation}
57 \begin{split}
58 {\cal M} \, : & \, U \,\, \longrightarrow \, V \\
59 ~ & \, \vec{u} \,\, \longmapsto \, \vec{v} \, = \,
60 {\cal M}(\vec{u})
61 \label{fulloperator}
62 \end{split}
63 \end{equation}
64 %
65 The vectors $ \vec{u} \in U $ and $ v \in V $ may be represented w.r.t.
66 some given basis vectors
67 $ {\rm span} (U) = \{ {\vec{e}_i} \}_{i = 1, \ldots , m} $ and
68 $ {\rm span} (V) = \{ {\vec{f}_j} \}_{j = 1, \ldots , n} $ as
69 \[
70 \vec{u} \, = \, \sum_{i=1}^{m} u_i \, {\vec{e}_i},
71 \qquad
72 \vec{v} \, = \, \sum_{j=1}^{n} v_j \, {\vec{f}_j}
73 \]
74
75 Two routes may be followed to determine the sensitivity of the
76 output variable $\vec{v}$ to its input $\vec{u}$.
77
78 \subsection{Forward or direct sensitivity}
79 %
80 Consider a perturbation to the input variables $\delta \vec{u}$
81 (typically a single component
82 $\delta \vec{u} = \delta u_{i} \, {\vec{e}_{i}}$).
83 Their effect on the output may be obtained via the linear
84 approximation of the model $ {\cal M}$ in terms of its Jacobian matrix
85 $ M $, evaluated in the point $u^{(0)}$ according to
86 %
87 \begin{equation}
88 \delta \vec{v} \, = \, M |_{\vec{u}^{(0)}} \, \delta \vec{u}
89 \label{tangent_linear}
90 \end{equation}
91 with resulting output perturbation $\delta \vec{v}$.
92 In components
93 $M_{j i} \, = \, \partial {\cal M}_{j} / \partial u_{i} $,
94 it reads
95 %
96 \begin{equation}
97 \delta v_{j} \, = \, \sum_{i}
98 \left. \frac{\partial {\cal M}_{j}}{\partial u_{i}} \right|_{u^{(0)}} \,
99 \delta u_{i}
100 \label{jacobi_matrix}
101 \end{equation}
102 %
103 Eq. (\ref{tangent_linear}) is the {\sf tangent linear model (TLM)}.
104 In contrast to the full nonlinear model $ {\cal M} $, the operator
105 $ M $ is just a matrix
106 which can readily be used to find the forward sensitivity of $\vec{v}$ to
107 perturbations in $u$,
108 but if there are very many input variables $(>>O(10^{6})$ for
109 large-scale oceanographic application), it quickly becomes
110 prohibitive to proceed directly as in (\ref{tangent_linear}),
111 if the impact of each component $ {\bf e_{i}} $ is to be assessed.
112
113 \subsection{Reverse or adjoint sensitivity}
114 %
115 Let us consider the special case of a
116 scalar objective function ${\cal J}(\vec{v})$ of the model output (e.g.
117 the total meridional heat transport,
118 the total uptake of $CO_{2}$ in the Southern
119 Ocean over a time interval,
120 or a measure of some model-to-data misfit)
121 %
122 \begin{eqnarray}
123 \begin{array}{cccccc}
124 {\cal J} \, : & U &
125 \longrightarrow & V &
126 \longrightarrow & I \!\! R \\
127 ~ & \vec{u} & \longmapsto & \vec{v}={\cal M}(\vec{u}) &
128 \longmapsto & {\cal J}(\vec{u}) = {\cal J}({\cal M}(\vec{u}))
129 \end{array}
130 \label{compo}
131 \end{eqnarray}
132 %
133 The linear approximation of $ {\cal J} $,
134 \[
135 {\cal J} \, \approx \, {\cal J}_0 \, + \, \delta {\cal J}
136 \]
137 can be expressed in both bases of $ \vec{u} $ and $ \vec{v} $
138 w.r.t. their corresponding inner product
139 $\left\langle \,\, , \,\, \right\rangle $
140 %
141 \begin{equation}
142 \begin{split}
143 {\cal J} & = \,
144 {\cal J} |_{\vec{u}^{(0)}} \, + \,
145 \left\langle \, \nabla _{u}{\cal J}^T |_{\vec{u}^{(0)}} \, , \, \delta \vec{u} \, \right\rangle
146 \, + \, O(\delta \vec{u}^2) \\
147 ~ & = \,
148 {\cal J} |_{\vec{v}^{(0)}} \, + \,
149 \left\langle \, \nabla _{v}{\cal J}^T |_{\vec{v}^{(0)}} \, , \, \delta \vec{v} \, \right\rangle
150 \, + \, O(\delta \vec{v}^2)
151 \end{split}
152 \label{deljidentity}
153 \end{equation}
154 %
155 (note, that the gradient $ \nabla f $ is a co-vector, therefore
156 its transpose is required in the above inner product).
157 Then, using the representation of
158 $ \delta {\cal J} =
159 \left\langle \, \nabla _{v}{\cal J}^T \, , \, \delta \vec{v} \, \right\rangle $,
160 the definition
161 of an adjoint operator $ A^{\ast} $ of a given operator $ A $,
162 \[
163 \left\langle \, A^{\ast} \vec{x} \, , \, \vec{y} \, \right\rangle =
164 \left\langle \, \vec{x} \, , \, A \vec{y} \, \right\rangle
165 \]
166 which for finite-dimensional vector spaces is just the
167 transpose of $ A $,
168 \[
169 A^{\ast} \, = \, A^T
170 \]
171 and from eq. (\ref{tangent_linear}), we note that
172 (omitting $|$'s):
173 %
174 \begin{equation}
175 \delta {\cal J}
176 \, = \,
177 \left\langle \, \nabla _{v}{\cal J}^T \, , \, \delta \vec{v} \, \right\rangle
178 \, = \,
179 \left\langle \, \nabla _{v}{\cal J}^T \, , \, M \, \delta \vec{u} \, \right\rangle
180 \, = \,
181 \left\langle \, M^T \, \nabla _{v}{\cal J}^T \, , \,
182 \delta \vec{u} \, \right\rangle
183 \label{inner}
184 \end{equation}
185 %
186 With the identity (\ref{deljidentity}), we then find that
187 the gradient $ \nabla _{u}{\cal J} $ can be readily inferred by
188 invoking the adjoint $ M^{\ast } $ of the tangent linear model $ M $
189 %
190 \begin{equation}
191 \begin{split}
192 \nabla _{u}{\cal J}^T |_{\vec{u}} &
193 = \, M^T |_{\vec{u}} \cdot \nabla _{v}{\cal J}^T |_{\vec{v}} \\
194 ~ & = \, M^T |_{\vec{u}} \cdot \delta \vec{v}^{\ast} \\
195 ~ & = \, \delta \vec{u}^{\ast}
196 \end{split}
197 \label{adjoint}
198 \end{equation}
199 %
200 Eq. (\ref{adjoint}) is the {\sf adjoint model (ADM)},
201 in which $M^T$ is the adjoint (here, the transpose) of the
202 tangent linear operator $M$, $ \delta \vec{v}^{\ast} $
203 the adjoint variable of the model state $ \vec{v} $, and
204 $ \delta \vec{u}^{\ast} $ the adjoint variable of the control variable $ \vec{u} $.
205
206 The {\sf reverse} nature of the adjoint calculation can be readily
207 seen as follows. Let us decompose ${\cal J}(u)$, thus:
208 %
209 \begin{equation}
210 {\cal J}({\cal M}(\vec{u})) \, = \,
211 {\cal J} ( {\cal M}_{\Lambda} ( {\cal M}_{\Lambda-1} (
212 ...... ( {\cal M}_{\lambda} (
213 ......
214 ( {\cal M}_{1} ( {\cal M}_{0}(\vec{u}) )))))
215 \label{compos}
216 \end{equation}
217 %
218 where the ${\cal M}$'s could be the elementary steps, i.e. single lines
219 in the code of the model,
220 starting at step 0 and moving up to step $\Lambda$, with intermediate
221 ${\cal M}_{\lambda} (\vec{u}) = \vec{v}^{(\lambda+1)}$ and final
222 ${\cal M}_{\Lambda} (\vec{u}) = \vec{v}^{(\Lambda+1)} = \vec{v}$
223 Then, according to the chain rule the forward calculation reads in
224 terms of the Jacobi matrices
225 (we've omitted the $ | $'s which, nevertheless are important
226 to the aspect of {\it tangent} linearity;
227 note also that per definition
228 $ \langle \, \nabla _{v}{\cal J}^T \, , \, \delta \vec{v} \, \rangle
229 = \nabla_v {\cal J} \cdot \delta \vec{v} $ )
230 %
231 \begin{equation}
232 \begin{split}
233 \nabla_v {\cal J} (M(\delta \vec{u})) & = \,
234 \nabla_v {\cal J} \cdot M_{\Lambda}
235 \cdot ...... \cdot M_{\lambda} \cdot ...... \cdot
236 M_{1} \cdot M_{0} \cdot \delta \vec{u} \\
237 ~ & = \, \nabla_v {\cal J} \cdot \delta \vec{v} \\
238 \end{split}
239 \label{forward}
240 \end{equation}
241 %
242 whereas in reverse mode we have
243 %
244 \begin{equation}
245 \boxed{
246 \begin{split}
247 M^T ( \nabla_v {\cal J}^T) & = \,
248 M_{0}^T \cdot M_{1}^T
249 \cdot ...... \cdot M_{\lambda}^T \cdot ...... \cdot
250 M_{\Lambda}^T \cdot \nabla_v {\cal J}^T \\
251 ~ & = \, M_{0}^T \cdot M_{1}^T
252 \cdot ...... \cdot
253 \nabla_{v^{(\lambda)}} {\cal J}^T \\
254 ~ & = \, \nabla_u {\cal J}^T
255 \end{split}
256 }
257 \label{reverse}
258 \end{equation}
259 %
260 clearly expressing the reverse nature of the calculation.
261 Eq. (\ref{reverse}) is at the heart of automatic adjoint compilers.
262 The intermediate steps $\lambda$ in
263 eqn. (\ref{compos}) -- (\ref{reverse})
264 could represent the model state (forward or adjoint) at each
265 intermediate time step in which case
266 $ {\cal M}(\vec{v}^{(\lambda)}) = \vec{v}^{(\lambda+1)} $, and correspondingly,
267 $ M^T (\delta \vec{v}^{(\lambda) \, \ast}) = \delta \vec{v}^{(\lambda-1) \, \ast} $,
268 but they can also be viewed more generally as
269 single lines of code in the numerical algorithm.
270 In both cases it becomes evident that the adjoint calculation
271 yields at the same time the adjoint of each model state component
272 $ \vec{v}^{(\lambda)} $ at each intermediate step $ l $, namely
273 %
274 \begin{equation}
275 \boxed{
276 \begin{split}
277 \nabla_{v^{(\lambda)}} {\cal J}^T |_{\vec{v}^{(\lambda)}}
278 & = \,
279 M_{\lambda}^T |_{\vec{v}^{(\lambda)}} \cdot ...... \cdot
280 M_{\Lambda}^T |_{\vec{v}^{(\lambda)}} \cdot \delta \vec{v}^{\ast} \\
281 ~ & = \, \delta \vec{v}^{(\lambda) \, \ast}
282 \end{split}
283 }
284 \end{equation}
285 %
286 in close analogy to eq. (\ref{adjoint})
287 We note in passing that that the $\delta \vec{v}^{(\lambda) \, \ast}$
288 are the Lagrange multipliers of the model state $ \vec{v}^{(\lambda)}$.
289
290 In coponents, eq. (\ref{adjoint}) reads as follows.
291 Let
292 \[
293 \begin{array}{rclcrcl}
294 \delta \vec{u} & = &
295 \left( \delta u_1,\ldots, \delta u_m \right)^T , & \qquad &
296 \delta \vec{u}^{\ast} \,\, = \,\, \nabla_u {\cal J}^T & = &
297 \left(
298 \frac{\partial {\cal J}}{\partial u_1},\ldots,
299 \frac{\partial {\cal J}}{\partial u_m}
300 \right)^T \\
301 \delta \vec{v} & = &
302 \left( \delta v_1,\ldots, \delta u_n \right)^T , & \qquad &
303 \delta \vec{v}^{\ast} \,\, = \,\, \nabla_v {\cal J}^T & = &
304 \left(
305 \frac{\partial {\cal J}}{\partial v_1},\ldots,
306 \frac{\partial {\cal J}}{\partial v_n}
307 \right)^T \\
308 \end{array}
309 \]
310 denote the perturbations in $\vec{u}$ and $\vec{v}$, respectively,
311 and their adjoint varaiables;
312 further
313 \[
314 M \, = \, \left(
315 \begin{array}{ccc}
316 \frac{\partial {\cal M}_1}{\partial u_1} & \ldots &
317 \frac{\partial {\cal M}_1}{\partial u_m} \\
318 \vdots & ~ & \vdots \\
319 \frac{\partial {\cal M}_n}{\partial u_1} & \ldots &
320 \frac{\partial {\cal M}_n}{\partial u_m} \\
321 \end{array}
322 \right)
323 \]
324 is the Jacobi matrix of $ {\cal M} $
325 (an $ n \times m $ matrix)
326 such that $ \delta \vec{v} = M \cdot \delta \vec{u} $, or
327 \[
328 \delta v_{j}
329 \, = \, \sum_{i=1}^m M_{ji} \, \delta u_{i}
330 \, = \, \sum_{i=1}^m \, \frac{\partial {\cal M}_{j}}{\partial u_{i}}
331 \delta u_{i}
332 \]
333 %
334 Then eq. (\ref{adjoint}) takes the form
335 \[
336 \delta u_{i}^{\ast}
337 \, = \, \sum_{j=1}^n M_{ji} \, \delta v_{j}^{\ast}
338 \, = \, \sum_{j=1}^n \, \frac{\partial {\cal M}_{j}}{\partial u_{i}}
339 \delta v_{j}^{\ast}
340 \]
341 %
342 or
343 %
344 \[
345 \left(
346 \begin{array}{c}
347 \left. \frac{\partial}{\partial u_1} {\cal J} \right|_{\vec{u}^{(0)}} \\
348 \vdots \\
349 \left. \frac{\partial}{\partial u_m} {\cal J} \right|_{\vec{u}^{(0)}} \\
350 \end{array}
351 \right)
352 \, = \,
353 \left(
354 \begin{array}{ccc}
355 \left. \frac{\partial {\cal M}_1}{\partial u_1} \right|_{\vec{u}^{(0)}}
356 & \ldots &
357 \left. \frac{\partial {\cal M}_n}{\partial u_1} \right|_{\vec{u}^{(0)}} \\
358 \vdots & ~ & \vdots \\
359 \left. \frac{\partial {\cal M}_1}{\partial u_m} \right|_{\vec{u}^{(0)}}
360 & \ldots &
361 \left. \frac{\partial {\cal M}_n}{\partial u_m} \right|_{\vec{u}^{(0)}} \\
362 \end{array}
363 \right)
364 \cdot
365 \left(
366 \begin{array}{c}
367 \left. \frac{\partial}{\partial v_1} {\cal J} \right|_{\vec{v}} \\
368 \vdots \\
369 \left. \frac{\partial}{\partial v_n} {\cal J} \right|_{\vec{v}} \\
370 \end{array}
371 \right)
372 \]
373 %
374 Furthermore, the adjoint $ \delta v^{(\lambda) \, \ast} $
375 of any intermediate state $ v^{(\lambda)} $
376 may be obtained, using the intermediate Jacobian
377 (an $ n_{\lambda+1} \times n_{\lambda} $ matrix)
378 %
379 \[
380 M_{\lambda} \, = \,
381 \left(
382 \begin{array}{ccc}
383 \frac{\partial ({\cal M}_{\lambda})_1}{\partial v^{(\lambda)}_1}
384 & \ldots &
385 \frac{\partial ({\cal M}_{\lambda})_1}{\partial v^{(\lambda)}_{n_{\lambda}}} \\
386 \vdots & ~ & \vdots \\
387 \frac{\partial ({\cal M}_{\lambda})_{n_{\lambda+1}}}{\partial v^{(\lambda)}_1}
388 & \ldots &
389 \frac{\partial ({\cal M}_{\lambda})_{n_{\lambda+1}}}{\partial v^{(\lambda)}_{n_{\lambda}}} \\
390 \end{array}
391 \right)
392 \]
393 %
394 and the shorthand notation for the adjoint variables
395 $ \delta v^{(\lambda) \, \ast}_{j} = \frac{\partial}{\partial v^{(\lambda)}_{j}}
396 {\cal J}^T $, $ j = 1, \ldots , n_{\lambda} $,
397 for intermediate components, yielding
398 \[
399 \footnotesize
400 \left(
401 \begin{array}{c}
402 \delta v^{(\lambda) \, \ast}_1 \\
403 \vdots \\
404 \delta v^{(\lambda) \, \ast}_{n_{\lambda}} \\
405 \end{array}
406 \right)
407 \, = \,
408 \left(
409 \begin{array}{ccc}
410 \frac{\partial ({\cal M}_{\lambda})_1}{\partial v^{(\lambda)}_1}
411 & \ldots &
412 \frac{\partial ({\cal M}_{\lambda})_{n_{\lambda+1}}}{\partial v^{(\lambda)}_1} \\
413 \vdots & ~ & \vdots \\
414 \frac{\partial ({\cal M}_{\lambda})_1}{\partial v^{(\lambda)}_{n_{\lambda}}}
415 & \ldots &
416 \frac{\partial ({\cal M}_{\lambda})_{n_{\lambda+1}}}{\partial v^{(\lambda)}_{n_{\lambda}}} \\
417 \end{array}
418 \right)
419 %
420 \cdot
421 %
422 \left(
423 \begin{array}{ccc}
424 \frac{\partial ({\cal M}_{\lambda+1})_1}{\partial v^{(\lambda+1)}_1}
425 & \ldots &
426 \frac{\partial ({\cal M}_{\lambda+1})_{n_{\lambda+2}}}{\partial v^{(\lambda+1)}_1} \\
427 \vdots & ~ & \vdots \\
428 \vdots & ~ & \vdots \\
429 \frac{\partial ({\cal M}_{\lambda+1})_1}{\partial v^{(\lambda+1)}_{n_{\lambda+1}}}
430 & \ldots &
431 \frac{\partial ({\cal M}_{\lambda+1})_{n_{\lambda+2}}}{\partial v^{(\lambda+1)}_{n_{\lambda+1}}} \\
432 \end{array}
433 \right)
434 \cdot \ldots \ldots \cdot
435 \left(
436 \begin{array}{c}
437 \delta v^{\ast}_1 \\
438 \vdots \\
439 \delta v^{\ast}_{n} \\
440 \end{array}
441 \right)
442 \]
443
444 Eq. (\ref{forward}) and (\ref{reverse}) are perhaps clearest in
445 showing the advantage of the reverse over the forward mode
446 if the gradient $\nabla _{u}{\cal J}$, i.e. the sensitivity of the
447 cost function $ {\cal J} $ with respect to {\it all} input
448 variables $u$
449 (or the sensitivity of the cost function with respect to
450 {\it all} intermediate states $ \vec{v}^{(\lambda)} $) are sought.
451 In order to be able to solve for each component of the gradient
452 $ \partial {\cal J} / \partial u_{i} $ in (\ref{forward})
453 a forward calulation has to be performed for each component seperately,
454 i.e. $ \delta \vec{u} = \delta u_{i} {\vec{e}_{i}} $
455 for the $i$-th forward calculation.
456 Then, (\ref{forward}) represents the
457 projection of $ \nabla_u {\cal J} $ onto the $i$-th component.
458 The full gradient is retrieved from the $ m $ forward calculations.
459 In contrast, eq. (\ref{reverse}) yields the full
460 gradient $\nabla _{u}{\cal J}$ (and all intermediate gradients
461 $\nabla _{v^{(\lambda)}}{\cal J}$) within a single reverse calculation.
462
463 Note, that in case $ {\cal J} $ is a vector-valued function
464 of dimension $ l > 1 $,
465 eq. (\ref{reverse}) has to be modified according to
466 \[
467 M^T \left( \nabla_v {\cal J}^T \left(\delta \vec{J}\right) \right)
468 \, = \,
469 \nabla_u {\cal J}^T \cdot \delta \vec{J}
470 \]
471 where now $ \delta \vec{J} \in I\!\!R $ is a vector of dimenison $ l $.
472 In this case $ l $ reverse simulations have to be performed
473 for each $ \delta J_{k}, \,\, k = 1, \ldots, l $.
474 Then, the reverse mode is more efficient as long as
475 $ l < n $, otherwise the forward mode is preferable.
476 Stricly, the reverse mode is called adjoint mode only for
477 $ l = 1 $.
478
479 A detailed analysis of the underlying numerical operations
480 shows that the computation of $\nabla _{u}{\cal J}$ in this way
481 requires about 2 to 5 times the computation of the cost function.
482 Alternatively, the gradient vector could be approximated
483 by finite differences, requiring $m$ computations
484 of the perturbed cost function.
485
486 To conclude we give two examples of commonly used types
487 of cost functions:
488
489 \paragraph{Example 1:
490 $ {\cal J} = v_{j} (T) $} ~ \\
491 The cost function consists of the $j$-th component of the model state
492 $ \vec{v} $ at time $T$.
493 Then $ \nabla_v {\cal J}^T = {\vec{f}_{j}} $ is just the $j$-th
494 unit vector. The $ \nabla_u {\cal J}^T $
495 is the projection of the adjoint
496 operator onto the $j$-th component ${\bf f_{j}}$,
497 \[
498 \nabla_u {\cal J}^T
499 \, = \, M^T \cdot \nabla_v {\cal J}^T
500 \, = \, \sum_{i} M^T_{ji} \, {\vec{e}_{i}}
501 \]
502
503 \paragraph{Example 2:
504 $ {\cal J} = \langle \, {\cal H}(\vec{v}) - \vec{d} \, ,
505 \, {\cal H}(\vec{v}) - \vec{d} \, \rangle $} ~ \\
506 The cost function represents the quadratic model vs.data misfit.
507 Here, $ \vec{d} $ is the data vector and $ {\cal H} $ represents the
508 operator which maps the model state space onto the data space.
509 Then, $ \nabla_v {\cal J} $ takes the form
510 %
511 \begin{equation*}
512 \begin{split}
513 \nabla_v {\cal J}^T & = \, 2 \, \, H \cdot
514 \left( \, {\cal H}(\vec{v}) - \vec{d} \, \right) \\
515 ~ & = \, 2 \sum_{j} \left\{ \sum_k
516 \frac{\partial {\cal H}_k}{\partial v_{j}}
517 \left( {\cal H}_k (\vec{v}) - d_k \right)
518 \right\} \, {\vec{f}_{j}} \\
519 \end{split}
520 \end{equation*}
521 %
522 where $H_{kj} = \partial {\cal H}_k / \partial v_{j} $ is the
523 Jacobi matrix of the data projection operator.
524 Thus, the gradient $ \nabla_u {\cal J} $ is given by the
525 adjoint operator,
526 driven by the model vs. data misfit:
527 \[
528 \nabla_u {\cal J}^T \, = \, 2 \, M^T \cdot
529 H \cdot \left( {\cal H}(\vec{v}) - \vec{d} \, \right)
530 \]
531
532 \subsection{Storing vs. recomputation in reverse mode}
533 \label{checkpointing}
534
535 We note an important aspect of the forward vs. reverse
536 mode calculation.
537 Because of the locality of the derivative,
538 the intermediate results of the model trajectory
539 $\vec{v}^{(\lambda+1)}={\cal M}_{\lambda}(v^{(\lambda)})$
540 are needed to evaluate the intermediate Jacobian
541 $M_{\lambda}|_{\vec{v}^{(\lambda)}} \, \delta \vec{v}^{(\lambda)} $.
542 In the forward mode, the intermediate results are required
543 in the same order as computed by the full forward model ${\cal M}$,
544 in the reverse mode they are required in the reverse order.
545 Thus, in the reverse mode the trajectory of the forward model
546 integration ${\cal M}$ has to be stored to be available in the reverse
547 calculation. Alternatively, the model state would have to be
548 recomputed whenever its value is required.
549
550 A method to balance the amount of recomputations vs.
551 storage requirements is called {\sf checkpointing}
552 (e.g. \cite{res-eta:98}).
553 It is depicted in Fig. ... for a 3-level checkpointing
554 [as concrete example, we give explicit numbers for a 3-day
555 integration with a 1-hourly timestep in square brackets].
556 \begin{itemize}
557 %
558 \item [$lev3$]
559 In a first step, the model trajectory is subdivided into
560 $ {n}^{lev3} $ subsections [$ {n}^{lev3} $=3 1-day intervals],
561 with the label $lev3$ for this outermost loop.
562 The model is then integrated over the full trajectory,
563 and the model state stored only at every $ k_{i}^{lev3} $-th timestep
564 [i.e. 3 times, at
565 $ i = 0,1,2 $ corresponding to $ k_{i}^{lev3} = 0, 24, 48 $].
566 %
567 \item [$lev2$]
568 In a second step each subsection is itself divided into
569 $ {n}^{lev2} $ subsubsections
570 [$ {n}^{lev2} $=4 6-hour intervals per subsection].
571 The model picks up at the last outermost dumped state
572 $ v_{k_{n}^{lev3}} $ and is integrated forward in time over
573 the last subsection, with the label $lev2$ for this
574 intermediate loop.
575 The model state is now stored only at every $ k_{i}^{lev2} $-th
576 timestep
577 [i.e. 4 times, at
578 $ i = 0,1,2,3 $ corresponding to $ k_{i}^{lev2} = 48, 54, 60, 66 $].
579 %
580 \item [$lev1$]
581 Finally, the mode picks up at the last intermediate dump state
582 $ v_{k_{n}^{lev2}} $ and is integrated forward in time over
583 the last subsubsection, with the label $lev1$ for this
584 intermediate loop.
585 Within this subsubsection only, the model state is stored
586 at every timestep
587 [i.e. every hour $ i=0,...,5$ corresponding to
588 $ k_{i}^{lev1} = 66, 67, \ldots, 71 $].
589 Thus, the final state $ v_n = v_{k_{n}^{lev1}} $ is reached
590 and the model state of all peceeding timesteps over the last
591 subsubsections are available, enabling integration backwards
592 in time over the last subsubsection.
593 Thus, the adjoint can be computed over this last
594 subsubsection $k_{n}^{lev2}$.
595 %
596 \end{itemize}
597 %
598 This procedure is repeated consecutively for each previous
599 subsubsection $k_{n-1}^{lev2}, \ldots, k_{1}^{lev2} $
600 carrying the adjoint computation to the initial time
601 of the subsection $k_{n}^{lev3}$.
602 Then, the procedure is repeated for the previous subsection
603 $k_{n-1}^{lev3}$
604 carrying the adjoint computation to the initial time
605 $k_{1}^{lev3}$.
606
607 For the full model trajectory of
608 $ n^{lev3} \cdot n^{lev2} \cdot n^{lev1} $ timesteps
609 the required storing of the model state was significantly reduced to
610 $ n^{lev1} + n^{lev2} + n^{lev3} $
611 [i.e. for the 3-day integration with a total oof 72 timesteps
612 the model state was stored 13 times].
613 This saving in memory comes at a cost of a required
614 3 full forward integrations of the model (one for each
615 checkpointing level).
616 The balance of storage vs. recomputation certainly depends
617 on the computing resources available.
618
619 \begin{figure}[t!]
620 \centering
621 %\psdraft
622 \psfrag{v_k1^lev3}{\mathinfigure{v_{k_{1}^{lev3}}}}
623 \psfrag{v_kn-1^lev3}{\mathinfigure{v_{k_{n-1}^{lev3}}}}
624 \psfrag{v_kn^lev3}{\mathinfigure{v_{k_{n}^{lev3}}}}
625 \psfrag{v_k1^lev2}{\mathinfigure{v_{k_{1}^{lev2}}}}
626 \psfrag{v_kn-1^lev2}{\mathinfigure{v_{k_{n-1}^{lev2}}}}
627 \psfrag{v_kn^lev2}{\mathinfigure{v_{k_{n}^{lev2}}}}
628 \psfrag{v_k1^lev1}{\mathinfigure{v_{k_{1}^{lev1}}}}
629 \psfrag{v_kn^lev1}{\mathinfigure{v_{k_{n}^{lev1}}}}
630 \mbox{\epsfig{file=part5/checkpointing.eps, width=0.8\textwidth}}
631 %\psfull
632 \caption
633 {Schematic view of intermediate dump and restart for
634 3-level checkpointing.}
635 \label{fig:erswns}
636 \end{figure}
637
638 \subsection{Optimal perturbations}
639 \label{optpert}
640
641
642 \subsection{Error covariance estimate and Hessian matrix}
643 \label{sec_hessian}
644
645 \newpage
646
647 %**********************************************************************
648 \section{AD-specific setup by example: sensitivity of carbon sequestration}
649 \label{sec_ad_setup_ex}
650 %**********************************************************************
651
652 The MITGCM has been adapted to enable AD using TAMC or TAF
653 (we'll refer to TAMC and TAF interchangeably, except where
654 distinctions are explicitly mentioned).
655 The present description, therefore, is specific to the
656 use of TAMC as AD tool.
657 The following sections describe the steps which are necessary to
658 generate a tangent linear or adjoint model of the MITGCM.
659 We take as an example the sensitivity of carbon sequestration
660 in the ocean.
661 The AD-relevant hooks in the code are sketched in
662 \reffig{adthemodel}, \reffig{adthemain}.
663
664 \subsection{Overview of the experiment}
665
666 We describe an adjoint sensitivity analysis of outgassing from
667 the ocean into the atmosphere of a carbon like tracer injected
668 into the ocean interior (see \cite{hil-eta:01}).
669
670 \subsubsection{Passive tracer equation}
671
672 For this work the MITGCM was augmented with a thermodynamically
673 inactive tracer, $C$. Tracer residing in the ocean
674 model surface layer is outgassed according to a relaxation time scale,
675 $\mu$. Within the ocean interior, the tracer is passively advected
676 by the ocean model currents. The full equation for the time evolution
677 %
678 \begin{equation}
679 \label{carbon_ddt}
680 \frac{\partial C}{\partial t} \, = \,
681 -U\cdot \nabla C \, - \, \mu C \, + \, \Gamma(C) \,+ \, S
682 \end{equation}
683 %
684 also includes a source term $S$. This term
685 represents interior sources of $C$ such as would arise due to
686 direct injection.
687 The velocity term, $U$, is the sum of the
688 model Eulerian circulation and an eddy-induced velocity, the latter
689 parameterized according to Gent/McWilliams (\cite{gen:90, dan:95}).
690 The convection function, $\Gamma$, mixes $C$ vertically wherever the
691 fluid is locally statically unstable.
692
693 The outgassing time scale, $\mu$, in eqn. (\ref{carbon_ddt})
694 is set so that \( 1/\mu \sim 1 \ \mathrm{year} \) for the surface
695 ocean and $\mu=0$ elsewhere. With this value, eqn. (\ref{carbon_ddt})
696 is valid as a prognostic equation for small perturbations in oceanic
697 carbon concentrations. This configuration provides a
698 powerful tool for examining the impact of large-scale ocean circulation
699 on $ CO_2 $ outgassing due to interior injections.
700 As source we choose a constant in time injection of
701 $ S = 1 \,\, {\rm mol / s}$.
702
703 \subsubsection{Model configuration}
704
705 The model configuration employed has a constant
706 $4^\circ \times 4^\circ$ resolution horizontal grid and realistic
707 geography and bathymetry. Twenty vertical layers are used with
708 vertical spacing ranging
709 from 50 m near the surface to 815 m at depth.
710 Driven to steady-state by climatalogical wind-stress, heat and
711 fresh-water forcing the model reproduces well known large-scale
712 features of the ocean general circulation.
713
714 \subsubsection{Outgassing cost function}
715
716 To quantify and understand outgassing due to injections of $C$
717 in eqn. (\ref{carbon_ddt}),
718 we define a cost function $ {\cal J} $ that measures the total amount of
719 tracer outgassed at each timestep:
720 %
721 \begin{equation}
722 \label{cost_tracer}
723 {\cal J}(t=T)=\int_{t=0}^{t=T}\int_{A} \mu C \, dA \, dt
724 \end{equation}
725 %
726 Equation(\ref{cost_tracer}) integrates the outgassing term, $\mu C$,
727 from (\ref{carbon_ddt})
728 over the entire ocean surface area, $A$, and accumulates it
729 up to time $T$.
730 Physically, ${\cal J}$ can be thought of as representing the amount of
731 $CO_2$ that our model predicts would be outgassed following an
732 injection at rate $S$.
733 The sensitivity of ${\cal J}$ to the spatial location of $S$,
734 $\frac{\partial {\cal J}}{\partial S}$,
735 can be used to identify regions from which circulation
736 would cause $CO_2$ to rapidly outgas following injection
737 and regions in which $CO_2$ injections would remain effectively
738 sequesterd within the ocean.
739
740 \subsection{Code configuration}
741
742 The model configuration for this experiment resides under the
743 directory {\it verification/carbon/}.
744 The code customisation routines are in {\it verification/carbon/code/}:
745 %
746 \begin{itemize}
747 %
748 \item {\it .genmakerc}
749 %
750 \item {\it COST\_CPPOPTIONS.h}
751 %
752 \item {\it CPP\_EEOPTIONS.h}
753 %
754 \item {\it CPP\_OPTIONS.h}
755 %
756 \item {\it CTRL\_OPTIONS.h}
757 %
758 \item {\it ECCO\_OPTIONS.h}
759 %
760 \item {\it SIZE.h}
761 %
762 \item {\it adcommon.h}
763 %
764 \item {\it tamc.h}
765 %
766 \end{itemize}
767 %
768 The runtime flag and parameters settings are contained in
769 {\it verification/carbon/input/},
770 together with the forcing fields and and restart files:
771 %
772 \begin{itemize}
773 %
774 \item {\it data}
775 %
776 \item {\it data.cost}
777 %
778 \item {\it data.ctrl}
779 %
780 \item {\it data.pkg}
781 %
782 \item {\it eedata}
783 %
784 \item {\it topog.bin}
785 %
786 \item {\it windx.bin, windy.bin}
787 %
788 \item {\it salt.bin, theta.bin}
789 %
790 \item {\it SSS.bin, SST.bin}
791 %
792 \item {\it pickup*}
793 %
794 \end{itemize}
795 %
796 Finally, the file to generate the adjoint code resides in
797 $ adjoint/ $:
798 %
799 \begin{itemize}
800 %
801 \item {\it makefile}
802 %
803 \end{itemize}
804 %
805
806 Below we describe the customisations of this files which are
807 specific to this experiment.
808
809 \subsubsection{File {\it .genmakerc}}
810 This file overwites default settings of {\it genmake}.
811 In the present example it is used to switch on the following
812 packages which are related to automatic differentiation
813 and are disabled by default: \\
814 \hspace*{4ex} {\tt set ENABLE=( autodiff cost ctrl ecco )} \\
815 Other packages which are not needed are switched off: \\
816 \hspace*{4ex} {\tt set DISABLE=( aim obcs zonal\_filt shap\_filt cal exf )}
817
818 \subsubsection{File {\it COST\_CPPOPTIONS.h, CTRL\_OPTIONS.h}}
819
820 These files used to contain package-specific CPP-options
821 (see Section \ref{???}).
822 For technical reasons those options have been grouped together
823 in the file {\it ECCO\_OPTIONS.h}.
824 To retain the modularity, the files have been kept and contain
825 the standard include of the {\it CPP\_OPTIONS.h} file.
826
827 \subsubsection{File {\it CPP\_EEOPTIONS.h}}
828
829 This file contains 'wrapper'-specific CPP options.
830 It only needs to be changed if the code is to be run
831 in parallel environment (see Section \ref{???}).
832
833 \subsubsection{File {\it CPP\_OPTIONS.h}}
834
835 This file contains model-specific CPP options
836 (see Section \ref{???}).
837 Most options are related to the forward model setup.
838 They are identical to the global steady circulation setup of
839 {\it verification/exp2/}.
840 The option specific to this experiment is \\
841 \hspace*{4ex} {\tt \#define ALLOW\_MIT\_ADJOINT\_RUN} \\
842 This flag enables the inclusion of some AD-related fields
843 concerning initialisation, link between control variables
844 and forward model variables, and the call to the top-level
845 forward/adjoint subroutine {\it adthe\_main\_loop}
846 instead of {\it the\_main\_loop}.
847
848 \subsubsection{File {\it ECCO\_OPTIONS.h}}
849
850 The CPP options of several AD-related packages are grouped
851 in this file:
852 %
853 \begin{itemize}
854 %
855 \item
856 Adjoint support package: {\it pkg/autodiff/} \\
857 This package contains hand-written adjoint code such as
858 active file handling, flow directives for files which must not
859 be differentiated, and TAMC-specific header files. \\
860 \hspace*{4ex} {\tt \#define ALLOW\_AUTODIFF\_TAMC} \\
861 defines TAMC-related features in the code. \\
862 \hspace*{4ex} {\tt \#define ALLOW\_TAMC\_CHECKPOINTING} \\
863 enables the checkpointing feature of TAMC
864 (see Section \ref{???}).
865 In the present example a 3-level checkpointing is implemented.
866 The code contains the relevant store directives, common block
867 and tape initialisations, storing key computation,
868 and loop index handling.
869 The checkpointing length at each level is defined in
870 file {\it tamc.h}, cf. below.
871 %
872 \item Cost function package: {\it pkg/cost/} \\
873 This package contains all relevant routines for
874 initialising, accumulating and finalizing the cost function
875 (see Section \ref{???}). \\
876 \hspace*{4ex} {\tt \#define ALLOW\_COST} \\
877 enables all general aspects of the cost function handling,
878 in particular the hooks in the foorward code for
879 initialising, accumulating and finalizing the cost function. \\
880 \hspace*{4ex} {\tt \#define ALLOW\_COST\_TRACER} \\
881 includes the subroutine with the cost function for this
882 particular experiment, eqn. (\ref{cost_tracer}).
883 %
884 \item Control variable package: {\it pkg/ctrl/} \\
885 This package contains all relevant routines for
886 the handling of the control vector.
887 Each control variable can be enabled/disabled with its own flag: \\
888 \begin{tabular}{ll}
889 \hspace*{2ex} {\tt \#define ALLOW\_THETA0\_CONTROL} &
890 initial temperature \\
891 \hspace*{2ex} {\tt \#define ALLOW\_SALT0\_CONTROL} &
892 initial salinity \\
893 \hspace*{2ex} {\tt \#define ALLOW\_TR0\_CONTROL} &
894 initial passive tracer concentration \\
895 \hspace*{2ex} {\tt \#define ALLOW\_TAUU0\_CONTROL} &
896 zonal wind stress \\
897 \hspace*{2ex} {\tt \#define ALLOW\_TAUV0\_CONTROL} &
898 meridional wind stress \\
899 \hspace*{2ex} {\tt \#define ALLOW\_SFLUX0\_CONTROL} &
900 freshwater flux \\
901 \hspace*{2ex} {\tt \#define ALLOW\_HFLUX0\_CONTROL} &
902 heat flux \\
903 \hspace*{2ex} {\tt \#undef ALLOW\_DIFFKR\_CONTROL} &
904 diapycnal diffusivity \\
905 \hspace*{2ex} {\tt \#undef ALLOW\_KAPPAGM\_CONTROL} &
906 isopycnal diffusivity \\
907 \end{tabular}
908 %
909 \end{itemize}
910
911 \subsubsection{File {\it SIZE.h}}
912
913 The file contains the grid point dimensions of the forward
914 model. It is identical to the {\it verification/exp2/}: \\
915 \hspace*{4ex} {\tt sNx = 90} \\
916 \hspace*{4ex} {\tt sNy = 40} \\
917 \hspace*{4ex} {\tt Nr = 20} \\
918 It correpsponds to a single-tile/single-processor setup:
919 {\tt nSx = nSy = 1, nPx = nPy = 1},
920 with standard overlap dimensioning
921 {\tt OLx = OLy = 3}.
922
923 \subsubsection{File {\it adcommon.h}}
924
925 This file contains common blocks of some adjoint variables
926 that are generated by TAMC.
927 The common blocks are used by the adjoint support routine
928 {\it addummy\_in\_stepping} which needs to access those variables:
929
930 \begin{tabular}{ll}
931 \hspace*{4ex} {\tt common /addynvars\_r/} &
932 \hspace*{4ex} is related to {\it DYNVARS.h} \\
933 \hspace*{4ex} {\tt common /addynvars\_cd/} &
934 \hspace*{4ex} is related to {\it DYNVARS.h} \\
935 \hspace*{4ex} {\tt common /adtr1\_r/} &
936 \hspace*{4ex} is related to {\it TR1.h} \\
937 \hspace*{4ex} {\tt common /adffields/} &
938 \hspace*{4ex} is related to {\it FFIELDS.h}\\
939 \end{tabular}
940
941 Note that if the structure of the common block changes in the
942 above header files of the forward code, the structure
943 of the adjoint common blocks will change accordingly.
944 Thus, it has to be made sure that the structure of the
945 adjoint common block in the hand-written file {\it adcommon.h}
946 complies with the automatically generated adjoint common blocks
947 in {\it adjoint\_model.F}.
948
949 \subsubsection{File {\it tamc.h}}
950
951 This routine contains the dimensions for TAMC checkpointing.
952 %
953 \begin{itemize}
954 %
955 \item {\tt \#ifdef ALLOW\_TAMC\_CHECKPOINTING} \\
956 3-level checkpointing is enabled, i.e. the timestepping
957 is divided into three different levels (see Section \ref{???}).
958 The model state of the outermost ({\tt nchklev\_3}) and the
959 itermediate ({\tt nchklev\_2}) timestepping loop are stored to file
960 (handled in {\it the\_main\_loop}).
961 The innermost loop ({\tt nchklev\_1})
962 avoids I/O by storing all required variables
963 to common blocks. This storing may also be necessary if
964 no checkpointing is chosen
965 (nonlinear functions, if-statements, iterative loops, ...).
966 In the present example the dimensions are chosen as follows: \\
967 \hspace*{4ex} {\tt nchklev\_1 = 36 } \\
968 \hspace*{4ex} {\tt nchklev\_2 = 30 } \\
969 \hspace*{4ex} {\tt nchklev\_3 = 60 } \\
970 To guarantee that the checkpointing intervals span the entire
971 integration period the relation \\
972 \hspace*{4ex} {\tt nchklev\_1*nchklev\_2*nchklev\_3 $ \ge $ nTimeSteps} \\
973 where {\tt nTimeSteps} is either specified in {\it data}
974 or computed via \\
975 \hspace*{4ex} {\tt nTimeSteps = (endTime-startTime)/deltaTClock }.
976 %
977 \item {\tt \#undef ALLOW\_TAMC\_CHECKPOINTING} \\
978 No checkpointing is enabled.
979 In this case the relevant counter is {\tt nchklev\_0}.
980 Similar to above, the following relation has to be satisfied \\
981 \hspace*{4ex} {\tt nchklev\_0 $ \ge $ nTimeSteps}.
982 %
983 \end{itemize}
984
985 \subsubsection{File {\it makefile}}
986
987 This file contains all relevant paramter flags and
988 lists to run TAMC.
989 It is assumed that TAMC is available to you, either locally,
990 being installed on your network, or remotely through the 'TAMC Utility'.
991 TAMC is called with the command {\tt tamc} followed by a
992 number of options. They are described in detail in the
993 TAMC manual \cite{gie:99}.
994 Here we briefly discuss the main flags used in the {\it makefile}
995 %
996 \begin{itemize}
997 \item [{\tt tamc}] {\tt
998 -input <variable names>
999 -output <variable name> ... \\
1000 -toplevel <S/R name> -reverse <file names>
1001 }
1002 \end{itemize}
1003 %
1004 \begin{itemize}
1005 %
1006 \item {\tt -toplevel <S/R name>} \\
1007 Name of the toplevel routine, with respect to which the
1008 control flow analysis is performed.
1009 %
1010 \item {\tt -input <variable names>} \\
1011 List of independent variables $ u $ with respect to which the
1012 dependent variable $ J $ is differentiated.
1013 %
1014 \item {\tt -output <variable name>} \\
1015 Dependent variable $ J $ which is to be differentiated.
1016 %
1017 \item {\tt -reverse <file names>} \\
1018 Adjoint code is generated to compute the sensitivity of an
1019 independent variable w.r.t. many dependent variables.
1020 The generated adjoint top-level routine computes the product
1021 of the transposed Jacobian matrix $ M^T $ times
1022 the gradient vector $ \nabla_v J $.
1023 \\
1024 {\tt <file names>} refers to the list of files {\it .f} which are to be
1025 analyzed by TAMC. This list is generally smaller than the full list
1026 of code to be compiled. The files not contained are either
1027 above the top-level routine (some initialisations), or are
1028 deliberately hidden from TAMC, either because hand-written
1029 adjoint routines exist, or the routines must not (or don't have to)
1030 be differentiated. For each routine which is part of the flow tree
1031 of the top-level routine, but deliberately hidden from TAMC,
1032 a corresponding file {\it .flow} exists containing flow directives
1033 for TAMC.
1034 %
1035 \end{itemize}
1036
1037
1038 \subsubsection{File {\it data}}
1039
1040 \subsubsection{File {\it data.cost}}
1041
1042 \subsubsection{File {\it data.ctrl}}
1043
1044 \subsubsection{File {\it data.pkg}}
1045
1046 \subsubsection{File {\it eedata}}
1047
1048 \subsubsection{File {\it topog.bin}}
1049
1050 \subsubsection{File {\it windx.bin, windy.bin}}
1051
1052 \subsubsection{File {\it salt.bin, theta.bin}}
1053
1054 \subsubsection{File {\it SSS.bin, SST.bin}}
1055
1056 \subsubsection{File {\it pickup*}}
1057
1058 \subsection{Compiling the model and its adjoint}
1059
1060 \newpage
1061
1062 %**********************************************************************
1063 \section{TLM and ADM code generation in general}
1064 \label{sec_ad_setup_gen}
1065 %**********************************************************************
1066
1067 In this section we describe in a general fashion
1068 the parts of the code that are relevant for automatic
1069 differentiation using the software tool TAMC.
1070
1071 \subsection{The cost function (dependent variable)}
1072
1073 The cost function $ {\cal J} $ is referred to as the {\sf dependent variable}.
1074 It is a function of the input variables $ \vec{u} $ via the composition
1075 $ {\cal J}(\vec{u}) \, = \, {\cal J}(M(\vec{u})) $.
1076 The input is referred to as the
1077 {\sf independent variables} or {\sf control variables}.
1078 All aspects relevant to the treatment of the cost function $ {\cal J} $
1079 (parameter setting, initialisation, incrementation,
1080 final evaluation), are controled by the package {\it pkg/cost}.
1081
1082 \subsubsection{genmake and CPP options}
1083 %
1084 \begin{itemize}
1085 %
1086 \item
1087 \fbox{
1088 \begin{minipage}{12cm}
1089 {\it genmake}, {\it CPP\_OPTIONS.h}, {\it ECCO\_CPPOPTIONS.h}
1090 \end{minipage}
1091 }
1092 \end{itemize}
1093 %
1094 The directory {\it pkg/cost} can be included to the
1095 compile list in 3 different ways (cf. Section \ref{???}):
1096 %
1097 \begin{enumerate}
1098 %
1099 \item {\it genmake}: \\
1100 Change the default settngs in the file {\it genmake} by adding
1101 {\bf cost} to the {\bf enable} list (not recommended).
1102 %
1103 \item {\it .genmakerc}: \\
1104 Customize the settings of {\bf enable}, {\bf disable} which are
1105 appropriate for your experiment in the file {\it .genmakerc}
1106 and add the file to your compile directory.
1107 %
1108 \item genmake-options: \\
1109 Call {\it genmake} with the option
1110 {\tt genmake -enable=cost}.
1111 %
1112 \end{enumerate}
1113 Since the cost function is usually used in conjunction with
1114 automatic differentiation, the CPP option
1115 {\bf ALLOW\_ADJOINT\_RUN} should be defined
1116 (file {\it CPP\_OPTIONS.h}).
1117 The basic CPP option to enable the cost function is {\bf ALLOW\_COST}.
1118 Each specific cost function contribution has its own option.
1119 For the present example the option is {\bf ALLOW\_COST\_TRACER}.
1120 All cost-specific options are set in {\it ECCO\_CPPOPTIONS.h}
1121
1122 \subsubsection{Initialisation}
1123 %
1124 The initialisation of the {\it cost} package is readily enabled
1125 as soon as the CPP option {\bf ALLOW\_ADJOINT\_RUN} is defined.
1126 %
1127 \begin{itemize}
1128 %
1129 \item
1130 \fbox{
1131 \begin{minipage}{12cm}
1132 Parameters: {\it cost\_readparms}
1133 \end{minipage}
1134 }
1135 \\
1136 This S/R
1137 reads runtime flags and parameters from file {\it data.cost}.
1138 For the present example the only relevant parameter read
1139 is {\bf mult\_tracer}. This multiplier enables different
1140 cost function contributions to be switched on
1141 ( = 1.) or off ( = 0.) at runtime.
1142 For more complex cost functions which involve model vs. data
1143 misfits, the corresponding data filenames and data
1144 specifications (start date and time, period, ...) are read
1145 in this S/R.
1146 %
1147 \item
1148 \fbox{
1149 \begin{minipage}{12cm}
1150 Variables: {\it cost\_init}
1151 \end{minipage}
1152 }
1153 \\
1154 This S/R
1155 initialises the different cost function contributions.
1156 The contribtion for the present example is {\bf objf\_tracer}
1157 which is defined on each tile (bi,bj).
1158 %
1159 \end{itemize}
1160 %
1161 \subsubsection{Incrementation}
1162 %
1163 \begin{itemize}
1164 %
1165 \item
1166 \fbox{
1167 \begin{minipage}{12cm}
1168 {\it cost\_tile}, {\it cost\_tracer}
1169 \end{minipage}
1170 }
1171 \end{itemize}
1172 %
1173 The 'driver' routine
1174 {\it cost\_tile} is called at the end of each time step.
1175 Within this 'driver' routine, S/R are called for each of
1176 the chosen cost function contributions.
1177 In the present example ({\bf ALLOW\_COST\_TRACER}),
1178 S/R {\it cost\_tracer} is called.
1179 It accumulates {\bf objf\_tracer} according to eqn. (\ref{???}).
1180 %
1181 \subsubsection{Finalize all contributions}
1182 %
1183 \begin{itemize}
1184 %
1185 \item
1186 \fbox{
1187 \begin{minipage}{12cm}
1188 {\it cost\_final}
1189 \end{minipage}
1190 }
1191 \end{itemize}
1192 %
1193 At the end of the forward integration S/R {\it cost\_final}
1194 is called. It accumulates the total cost function {\bf fc}
1195 from each contribution and sums over all tiles:
1196 \begin{equation}
1197 {\cal J} \, = \,
1198 {\rm fc} \, = \,
1199 {\rm mult\_tracer} \sum_{bi,\,bj}^{nSx,\,nSy}
1200 {\rm objf\_tracer}(bi,bj) \, + \, ...
1201 \end{equation}
1202 %
1203 The total cost function {\bf fc} will be the
1204 'dependent' variable in the argument list for TAMC, i.e.
1205 \begin{verbatim}
1206 tamc -output 'fc' ...
1207 \end{verbatim}
1208
1209 \begin{figure}[t!]
1210 \input{part5/doc_ad_the_model}
1211 \label{fig:adthemodel}
1212 \caption{~}
1213 \end{figure}
1214
1215 %%%% \end{document}
1216
1217 \begin{figure}
1218 \input{part5/doc_ad_the_main}
1219 \label{fig:adthemain}
1220 \caption{~}
1221 \end{figure}
1222
1223 \subsection{The control variables (independent variables)}
1224
1225 The control variables are a subset of the model input
1226 (initial conditions, boundary conditions, model parameters).
1227 Here we identify them with the variable $ \vec{u} $.
1228 All intermediate variables whose derivative w.r.t. control
1229 variables don't vanish are called {\sf active variables}.
1230 All subroutines whose derivative w.r.t. the control variables
1231 don't vanish are called {\sf active routines}.
1232 Read and write operations from and to file can be viewed
1233 as variable assignments. Therefore, files to which
1234 active variables are written and from which active variables
1235 are read are called {\sf active files}.
1236 All aspects relevant to the treatment of the control variables
1237 (parameter setting, initialisation, perturbation)
1238 are controled by the package {\it pkg/ctrl}.
1239
1240 \subsubsection{genmake and CPP options}
1241 %
1242 \begin{itemize}
1243 %
1244 \item
1245 \fbox{
1246 \begin{minipage}{12cm}
1247 {\it genmake}, {\it CPP\_OPTIONS.h}, {\it ECCO\_CPPOPTIONS.h}
1248 \end{minipage}
1249 }
1250 \end{itemize}
1251 %
1252 To enable the directory to be included to the compile list,
1253 {\bf ctrl} has to be added to the {\bf enable} list in
1254 {\it .genmakerc} (or {\it genmake} itself).
1255 Each control variable is enabled via its own CPP option
1256 in {\it ECCO\_CPPOPTIONS.h}.
1257
1258 \subsubsection{Initialisation}
1259 %
1260 \begin{itemize}
1261 %
1262 \item
1263 \fbox{
1264 \begin{minipage}{12cm}
1265 Parameters: {\it ctrl\_readparms}
1266 \end{minipage}
1267 }
1268 \\
1269 %
1270 This S/R
1271 reads runtime flags and parameters from file {\it data.ctrl}.
1272 For the present example the file contains the file names
1273 of each control variable that is used.
1274 In addition, the number of wet points for each control
1275 variable and the net dimension of the space of control
1276 variables (counting wet points only) {\bf nvarlength}
1277 is determined.
1278 Masks for wet points for each tile {\bf (bi,\,bj)}
1279 and vertical layer {\bf k} are generated for the three
1280 relevant categories on the C-grid:
1281 {\bf nWetCtile} for tracer fields,
1282 {\bf nWetWtile} for zonal velocity fields,
1283 {\bf nWetStile} for meridional velocity fields.
1284 %
1285 \item
1286 \fbox{
1287 \begin{minipage}{12cm}
1288 Control variables, control vector,
1289 and their gradients: {\it ctrl\_unpack}
1290 \end{minipage}
1291 }
1292 \\
1293 %
1294 Two important issues related to the handling of the control
1295 variables in the MITGCM need to be addressed.
1296 First, in order to save memory, the control variable arrays
1297 are not kept in memory, but rather read from file and added
1298 to the initial (or first guess) fields.
1299 Similarly, the corresponding adjoint fields which represent
1300 the gradient of the cost function w.r.t. the control variables
1301 are written to to file.
1302 Second, in addition to the files holding the 2-dim. and 3-dim.
1303 control variables and the gradient, a 1-dim. {\sf control vector}
1304 and {\sf gradient vector} are written to file. They contain
1305 only the wet points of the control variables and the corresponding
1306 gradient.
1307 This leads to a significant data compression.
1308 Furthermore, the control and the gradient vector can be passed to a
1309 minimization routine if an update of the control variables
1310 is sought as part of a minimization exercise.
1311
1312 The files holding fields and vectors of the control variables
1313 and gradient are generated and initialised in S/R {\it ctrl\_unpack}.
1314 %
1315 \end{itemize}
1316
1317 \subsubsection{Perturbation of the independent variables}
1318 %
1319 The dependency chain for differentiation starts
1320 with adding a perturbation onto the the input variable,
1321 thus defining the independent or control variables for TAMC.
1322 Three classes of controls may be considered:
1323 %
1324 \begin{itemize}
1325 %
1326 \item
1327 \fbox{
1328 \begin{minipage}{12cm}
1329 {\it ctrl\_map\_ini} (initial value sensitivity):
1330 \end{minipage}
1331 }
1332 \\
1333 %
1334 Consider as an example the initial tracer distribution
1335 {\bf tr1} as control variable.
1336 After {\bf tr1} has been initialised in
1337 {\it ini\_tr1} (dynamical variables including
1338 temperature and salinity are initialised in {\it ini\_fields}),
1339 a perturbation anomaly is added to the field in S/R
1340 {\it ctrl\_map\_ini}
1341 %
1342 \begin{equation}
1343 \begin{split}
1344 u & = \, u_{[0]} \, + \, \Delta u \\
1345 {\bf tr1}(...) & = \, {\bf tr1_{ini}}(...) \, + \, {\bf xx\_tr1}(...)
1346 \label{perturb}
1347 \end{split}
1348 \end{equation}
1349 %
1350 In principle {\bf xx\_tr1} is a 3-dim. global array
1351 holding the perturbation. In the case of a simple
1352 sensitivity study this array is identical to zero.
1353 However, it's specification is essential since TAMC
1354 treats the corresponding line in the code symbolically
1355 when determining the differentiation chain and its origin.
1356 Thus, the variable names are part of the argument list
1357 when calling TAMC:
1358 %
1359 \begin{verbatim}
1360 tamc -input 'xx_tr1 ...' ...
1361 \end{verbatim}
1362 %
1363 Now, as mentioned above, the MITGCM avoids maintaining
1364 an array for each control variable by reading the
1365 perturbation to a temporary array from file.
1366 To ensure the symbolic link to be recognized by TAMC, a scalar
1367 dummy variable {\bf xx\_tr1\_dummy} is introduced
1368 and an 'active read' routine of the adjoint support
1369 package {\it pkg/autodiff} is invoked.
1370 The read-procedure is tagged with the variable
1371 {\bf xx\_tr1\_dummy} enabbling TAMC to recognize the
1372 initialisation of the perturbation.
1373 The modified call of TAMC thus reads
1374 %
1375 \begin{verbatim}
1376 tamc -input 'xx_tr1_dummy ...' ...
1377 \end{verbatim}
1378 %
1379 and the modified operation to (\ref{perturb})
1380 in the code takes on the form
1381 %
1382 \begin{verbatim}
1383 call active_read_xyz(
1384 & ..., tmpfld3d, ..., xx_tr1_dummy, ... )
1385
1386 tr1(...) = tr1(...) + tmpfld3d(...)
1387 \end{verbatim}
1388 %
1389 Note, that reading an active variable corresponds
1390 to a variable assignment. Its derivative corresponds
1391 to a write statement of the adjoint variable.
1392 The 'active file' routines have been designed
1393 to support active read and corresponding active write
1394 operations.
1395 %
1396 \item
1397 \fbox{
1398 \begin{minipage}{12cm}
1399 {\it ctrl\_map\_forcing} (boundary value sensitivity):
1400 \end{minipage}
1401 }
1402 \\
1403 %
1404 The handling of boundary values as control variables
1405 proceeds exactly analogous to the initial values
1406 with the symbolic perturbation taking place in S/R
1407 {\it ctrl\_map\_forcing}.
1408 Note however an important difference:
1409 Since the boundary values are time dependent with a new
1410 forcing field applied at each time steps,
1411 the general problem may be be thought of as
1412 a new control variable at each time step, i.e.
1413 \[
1414 u_{\rm forcing} \, = \,
1415 \{ \, u_{\rm forcing} ( t_n ) \, \}_{
1416 n \, = \, 1, \ldots , {\rm nTimeSteps} }
1417 \]
1418 %
1419 In the current example an equilibrium state is considered,
1420 and only an initial perturbation to
1421 surface forcing is applied with respect to the
1422 equilibrium state.
1423 A time dependent treatment of the surface forcing is
1424 implemented in the ECCO environment, involving the
1425 calendar ({\it cal}~) and external forcing ({\it exf}~) packages.
1426 %
1427 \item
1428 \fbox{
1429 \begin{minipage}{12cm}
1430 {\it ctrl\_map\_params} (parameter sensitivity):
1431 \end{minipage}
1432 }
1433 \\
1434 %
1435 This routine is not yet implemented, but would proceed
1436 proceed along the same lines as the initial value sensitivity.
1437 %
1438 \end{itemize}
1439 %
1440
1441 \subsubsection{Output of adjoint variables and gradient}
1442 %
1443 Two ways exist to generate output of adjoint fields.
1444 %
1445 \begin{itemize}
1446 %
1447 \item
1448 \fbox{
1449 \begin{minipage}{12cm}
1450 {\it ctrl\_pack}:
1451 \end{minipage}
1452 }
1453 \\
1454 At the end of the forward/adjoint integration, the S/R
1455 {\it ctrl\_pack} is called which mirrors S/R {\it ctrl\_unpack}.
1456 It writes the following files:
1457 %
1458 \begin{itemize}
1459 %
1460 \item {\bf xx\_...}: the control variable fields
1461 %
1462 \item {\bf adxx\_...}: the adjoint variable fields, i.e. the gradient
1463 $ \nabla _{u}{\cal J} $ for each control variable,
1464 %
1465 \item {\bf vector\_ctrl}: the control vector
1466 %
1467 \item {\bf vector\_grad}: the gradient vector
1468 %
1469 \end{itemize}
1470 %
1471 \item
1472 \fbox{
1473 \begin{minipage}{12cm}
1474 {\it addummy\_in\_stepping}:
1475 \end{minipage}
1476 }
1477 \\
1478 In addition to writing the gradient at the end of the
1479 forward/adjoint integration, many more adjoint variables,
1480 representing the Lagrange multipliers of the model state
1481 w.r.t. the model state
1482 at different times can be written using S/R
1483 {\it addummy\_in\_stepping}.
1484 This routine is part of the adjoint support package
1485 {\it pkg/autodiff} (cf.f. below).
1486 To be part of the adjoint code, the corresponding S/R
1487 {\it dummy\_in\_stepping} has to be called in the forward
1488 model (S/R {\it the\_main\_loop}) at the appropriate place.
1489
1490 {\it dummy\_in\_stepping} is essentially empty,
1491 the corresponding adjoint routine is hand-written rather
1492 than generated automatically.
1493 Appropriate flow directives ({\it dummy\_in\_stepping.flow})
1494 ensure that TAMC does not automatically
1495 generate {\it addummy\_in\_stepping} by trying to differentiate
1496 {\it dummy\_in\_stepping}, but rather takes the hand-written routine.
1497
1498 {\it dummy\_in\_stepping} is called in the forward code
1499 at the beginning of each
1500 timestep, before the call to {\it dynamics}, thus ensuring
1501 that {\it addummy\_in\_stepping} is called at the end of
1502 each timestep in the adjoint calculation, after the call to
1503 {\it addynamics}.
1504
1505 {\it addummy\_in\_stepping} includes the header files
1506 {\it adffields.h, addynamics.h, adtr1.h}.
1507 These header files are also hand-written. They contain
1508 the common blocks {\bf /addynvars\_r/}, {\bf /addynvars\_cd/},
1509 {\bf /adtr1\_r/}, {\bf /adffields/},
1510 which have been extracted from the adjoint code to enable
1511 access to the adjoint variables.
1512 %
1513 \end{itemize}
1514
1515
1516 \subsubsection{Control variable handling for
1517 optimization applications}
1518
1519 In optimization mode the cost function $ {\cal J}(u) $ is sought
1520 to be minimized with respect to a set of control variables
1521 $ \delta {\cal J} \, = \, 0 $, in an iterative manner.
1522 The gradient $ \nabla _{u}{\cal J} |_{u_{[k]}} $ together
1523 with the value of the cost function itself $ {\cal J}(u_{[k]}) $
1524 at iteration step $ k $ serve
1525 as input to a minimization routine (e.g. quasi-Newton method,
1526 conjugate gradient, ...) to compute an update in the
1527 control variable for iteration step $k+1$
1528 \[
1529 u_{[k+1]} \, = \, u_{[0]} \, + \, \Delta u_{[k+1]}
1530 \quad \mbox{satisfying} \quad
1531 {\cal J} \left( u_{[k+1]} \right) \, < \, {\cal J} \left( u_{[k]} \right)
1532 \]
1533 $ u_{[k+1]} $ then serves as input for a forward/adjoint run
1534 to determine $ {\cal J} $ and $ \nabla _{u}{\cal J} $ at iteration step
1535 $ k+1 $.
1536 Tab. \ref{???} sketches the flow between forward/adjoint model
1537 and the minimization routine.
1538
1539 \begin{eqnarray*}
1540 \footnotesize
1541 \begin{array}{ccccc}
1542 u_{[0]} \,\, , \,\, \Delta u_{[k]} & ~ & ~ & ~ & ~ \\
1543 {\Big\downarrow}
1544 & ~ & ~ & ~ & ~ \\
1545 ~ & ~ & ~ & ~ & ~ \\
1546 \hline
1547 \multicolumn{1}{|c}{~} & ~ & ~ & ~ & \multicolumn{1}{c|}{~} \\
1548 \multicolumn{1}{|c}{
1549 u_{[k]} = u_{[0]} + \Delta u_{[k]}} &
1550 \stackrel{\bf forward}{\bf \longrightarrow} &
1551 v_{[k]} = M \left( u_{[k]} \right) &
1552 \stackrel{\bf forward}{\bf \longrightarrow} &
1553 \multicolumn{1}{c|}{
1554 {\cal J}_{[k]} = {\cal J} \left( M \left( u_{[k]} \right) \right)} \\
1555 \multicolumn{1}{|c}{~} & ~ & ~ & ~ & \multicolumn{1}{c|}{~} \\
1556 \hline
1557 \hline
1558 \multicolumn{1}{|c}{~} & ~ & ~ & ~ & \multicolumn{1}{c|}{~} \\
1559 \multicolumn{1}{|c}{
1560 \nabla_u {\cal J}_{[k]} (\delta {\cal J}) =
1561 T\!\!^{\ast} \cdot \nabla_v {\cal J} |_{v_{[k]}} (\delta {\cal J})} &
1562 \stackrel{\bf adjoint}{\mathbf \longleftarrow} &
1563 ad \, v_{[k]} (\delta {\cal J}) =
1564 \nabla_v {\cal J} |_{v_{[k]}} (\delta {\cal J}) &
1565 \stackrel{\bf adjoint}{\mathbf \longleftarrow} &
1566 \multicolumn{1}{c|}{ ad \, {\cal J} = \delta {\cal J}} \\
1567 \multicolumn{1}{|c}{~} & ~ & ~ & ~ & \multicolumn{1}{c|}{~} \\
1568 \hline
1569 ~ & ~ & ~ & ~ & ~ \\
1570 ~ & ~ &
1571 {\cal J}_{[k]} \qquad {\Bigg\downarrow} \qquad \nabla_u {\cal J}_{[k]}
1572 & ~ & ~ \\
1573 ~ & ~ & ~ & ~ & ~ \\
1574 \hline
1575 \multicolumn{1}{|c}{~} & ~ & ~ & ~ & \multicolumn{1}{c|}{~} \\
1576 \multicolumn{1}{|c}{
1577 {\cal J}_{[k]} \,\, , \,\, \nabla_u {\cal J}_{[k]}} &
1578 {\mathbf \longrightarrow} & \text{\bf minimisation} &
1579 {\mathbf \longrightarrow} &
1580 \multicolumn{1}{c|}{ \Delta u_{[k+1]}} \\
1581 \multicolumn{1}{|c}{~} & ~ & ~ & ~ & \multicolumn{1}{c|}{~} \\
1582 \hline
1583 ~ & ~ & ~ & ~ & ~ \\
1584 ~ & ~ & ~ & ~ & \Big\downarrow \\
1585 ~ & ~ & ~ & ~ & \Delta u_{[k+1]} \\
1586 \end{array}
1587 \end{eqnarray*}
1588
1589 The routines {\it ctrl\_unpack} and {\it ctrl\_pack} provide
1590 the link between the model and the minimization routine.
1591 As described in Section \ref{???}
1592 the {\it unpack} and {\it pack} routines read and write
1593 control and gradient {\it vectors} which are compressed
1594 to contain only wet points, in addition to the full
1595 2-dim. and 3-dim. fields.
1596 The corresponding I/O flow looks as follows:
1597
1598 \vspace*{0.5cm}
1599
1600 \begin{tabular}{ccccc}
1601 {\bf vector\_ctrl\_$<$k$>$ } & ~ & ~ & ~ & ~ \\
1602 {\big\downarrow} & ~ & ~ & ~ & ~ \\
1603 \cline{1-1}
1604 \multicolumn{1}{|c|}{\it ctrl\_unpack} & ~ & ~ & ~ & ~ \\
1605 \cline{1-1}
1606 {\big\downarrow} & ~ & ~ & ~ & ~ \\
1607 \cline{3-3}
1608 \multicolumn{1}{l}{\bf xx\_theta0...$<$k$>$} & ~ &
1609 \multicolumn{1}{|c|}{~} & ~ & ~ \\
1610 \multicolumn{1}{l}{\bf xx\_salt0...$<$k$>$} & $\longrightarrow$ &
1611 \multicolumn{1}{|c|}{forward integration} & ~ & ~ \\
1612 \multicolumn{1}{l}{\bf \vdots} & ~ & \multicolumn{1}{|c|}{~}
1613 & ~ & ~ \\
1614 \cline{3-3}
1615 ~ & ~ & ~ & ~ & ~ \\
1616 \cline{3-3}
1617 ~ & ~ &
1618 \multicolumn{1}{|c|}{~} & ~ &
1619 \multicolumn{1}{l}{\bf adxx\_theta0...$<$k$>$} \\
1620 ~ & ~ & \multicolumn{1}{|c|}{adjoint integration} &
1621 $\longrightarrow$ &
1622 \multicolumn{1}{l}{\bf adxx\_salt0...$<$k$>$} \\
1623 ~ & ~ & \multicolumn{1}{|c|}{~}
1624 & ~ & \multicolumn{1}{l}{\bf \vdots} \\
1625 \cline{3-3}
1626 ~ & ~ & ~ & ~ & {\big\downarrow} \\
1627 \cline{5-5}
1628 ~ & ~ & ~ & ~ & \multicolumn{1}{|c|}{\it ctrl\_pack} \\
1629 \cline{5-5}
1630 ~ & ~ & ~ & ~ & {\big\downarrow} \\
1631 ~ & ~ & ~ & ~ & {\bf vector\_grad\_$<$k$>$ } \\
1632 \end{tabular}
1633
1634 \vspace*{0.5cm}
1635
1636
1637 {\it ctrl\_unpack} reads in the updated control vector
1638 {\bf vector\_ctrl\_$<$k$>$}.
1639 It distributes the different control variables to
1640 2-dim. and 3-dim. files {\it xx\_...$<$k$>$}.
1641 During the forward integration the control variables
1642 are read from {\it xx\_...$<$k$>$}.
1643 Correspondingly, the adjoint fields are written
1644 to {\it adxx\_...$<$k$>$}, again via the active file routines.
1645 Finally, {\it ctrl\_pack} collects all adjoint field files
1646 and writes them to the compressed vector file
1647 {\bf vector\_grad\_$<$k$>$}.
1648
1649 \subsection{TLM and ADM generation via TAMC}
1650
1651
1652
1653 \subsection{Flow directives and adjoint support routines}
1654
1655 \subsection{Store directives and checkpointing}
1656
1657 \subsection{Gradient checks}
1658
1659 \subsection{Second derivative generation via TAMC}
1660
1661 \section{Example of adjoint code}

  ViewVC Help
Powered by ViewVC 1.1.22