4 |
Author: Patrick Heimbach |
Author: Patrick Heimbach |
5 |
|
|
6 |
{\sf Automatic differentiation} (AD), also referred to as algorithmic |
{\sf Automatic differentiation} (AD), also referred to as algorithmic |
7 |
(or, more loosely, computational) differentiation, involves |
(or, more loosely, computational) differentiation, involves |
8 |
automatically deriving code to calculate |
automatically deriving code to calculate partial derivatives from an |
9 |
partial derivatives from an existing fully non-linear prognostic code. |
existing fully non-linear prognostic code. (see \cite{gri:00}). A |
10 |
(see \cite{gri:00}). |
software tool is used that parses and transforms source files |
11 |
A software tool is used that parses and transforms source files |
according to a set of linguistic and mathematical rules. AD tools are |
12 |
according to a set of linguistic and mathematical rules. |
like source-to-source translators in that they parse a program code as |
13 |
AD tools are like source-to-source translators in that |
input and produce a new program code as output |
14 |
they parse a program code as input and produce a new program code |
(we restrict our discussion to source-to-source tools, ignoring |
15 |
as output. |
operator-overloading tools). However, unlike a |
16 |
However, unlike a pure source-to-source translation, the output program |
pure source-to-source translation, the output program represents a new |
17 |
represents a new algorithm, such as the evaluation of the |
algorithm, such as the evaluation of the Jacobian, the Hessian, or |
18 |
Jacobian, the Hessian, or higher derivative operators. |
higher derivative operators. In principle, a variety of derived |
19 |
In principle, a variety of derived algorithms |
algorithms can be generated automatically in this way. |
20 |
can be generated automatically in this way. |
|
21 |
|
MITgcm has been adapted for use with the Tangent linear and Adjoint |
22 |
The MITGCM has been adapted for use with the |
Model Compiler (TAMC) and its successor TAF (Transformation of |
23 |
Tangent linear and Adjoint Model Compiler (TAMC) and its successor TAF |
Algorithms in Fortran), developed by Ralf Giering (\cite{gie-kam:98}, |
24 |
(Transformation of Algorithms in Fortran), developed |
\cite{gie:99,gie:00}). The first application of the adjoint of MITgcm |
25 |
by Ralf Giering (\cite{gie-kam:98}, \cite{gie:99,gie:00}). |
for sensitivity studies has been published by \cite{maro-eta:99}. |
26 |
The first application of the adjoint of the MITGCM for sensitivity |
\cite{stam-etal:97,stam-etal:02} use MITgcm and its adjoint for ocean |
27 |
studies has been published by \cite{maro-eta:99}. |
state estimation studies. In the following we shall refer to TAMC and |
28 |
\cite{sta-eta:97,sta-eta:01} use the MITGCM and its adjoint |
TAF synonymously, except were explicitly stated otherwise. |
29 |
for ocean state estimation studies. |
|
30 |
In the following we shall refer to TAMC and TAF synonymously, |
As of mid-2007 we are also able to generate fairly efficient |
31 |
except were explicitly stated otherwise. |
adjoint code of the MITgcm using a new, open-source AD tool, |
32 |
|
called OpenAD (see \cite{naum-etal:06,utke-etal:08}. |
33 |
TAMC exploits the chain rule for computing the first |
This enables us for the first time to compare adjoint models |
34 |
derivative of a function with |
generated from different AD tools, providing an additional |
35 |
respect to a set of input variables. |
accuracy check, complementary to finite-difference gradient checks. |
36 |
Treating a given forward code as a composition of operations -- |
OpenAD and its application to MITgcm is described in detail |
37 |
each line representing a compositional element, the chain rule is |
in section \ref{sec_ad_openad}. |
38 |
rigorously applied to the code, line by line. The resulting |
|
39 |
tangent linear or adjoint code, |
The AD tool exploits the chain rule for computing the first derivative of a |
40 |
then, may be thought of as the composition in |
function with respect to a set of input variables. Treating a given |
41 |
forward or reverse order, respectively, of the |
forward code as a composition of operations -- each line representing |
42 |
Jacobian matrices of the forward code's compositional elements. |
a compositional element, the chain rule is rigorously applied to the |
43 |
|
code, line by line. The resulting tangent linear or adjoint code, |
44 |
|
then, may be thought of as the composition in forward or reverse |
45 |
|
order, respectively, of the Jacobian matrices of the forward code's |
46 |
|
compositional elements. |
47 |
|
|
48 |
%********************************************************************** |
%********************************************************************** |
49 |
\section{Some basic algebra} |
\section{Some basic algebra} |
65 |
under consideration, |
under consideration, |
66 |
% |
% |
67 |
\begin{equation} |
\begin{equation} |
68 |
\begin{split} |
\begin{aligned} |
69 |
{\cal M} \, : & \, U \,\, \longrightarrow \, V \\ |
{\cal M} \, : & \, U \,\, \longrightarrow \, V \\ |
70 |
~ & \, \vec{u} \,\, \longmapsto \, \vec{v} \, = \, |
~ & \, \vec{u} \,\, \longmapsto \, \vec{v} \, = \, |
71 |
{\cal M}(\vec{u}) |
{\cal M}(\vec{u}) |
72 |
\label{fulloperator} |
\label{fulloperator} |
73 |
\end{split} |
\end{aligned} |
74 |
\end{equation} |
\end{equation} |
75 |
% |
% |
76 |
The vectors $ \vec{u} \in U $ and $ v \in V $ may be represented w.r.t. |
The vectors $ \vec{u} \in U $ and $ v \in V $ may be represented w.r.t. |
150 |
$\left\langle \,\, , \,\, \right\rangle $ |
$\left\langle \,\, , \,\, \right\rangle $ |
151 |
% |
% |
152 |
\begin{equation} |
\begin{equation} |
153 |
\begin{split} |
\begin{aligned} |
154 |
{\cal J} & = \, |
{\cal J} & = \, |
155 |
{\cal J} |_{\vec{u}^{(0)}} \, + \, |
{\cal J} |_{\vec{u}^{(0)}} \, + \, |
156 |
\left\langle \, \nabla _{u}{\cal J}^T |_{\vec{u}^{(0)}} \, , \, \delta \vec{u} \, \right\rangle |
\left\langle \, \nabla _{u}{\cal J}^T |_{\vec{u}^{(0)}} \, , \, \delta \vec{u} \, \right\rangle |
159 |
{\cal J} |_{\vec{v}^{(0)}} \, + \, |
{\cal J} |_{\vec{v}^{(0)}} \, + \, |
160 |
\left\langle \, \nabla _{v}{\cal J}^T |_{\vec{v}^{(0)}} \, , \, \delta \vec{v} \, \right\rangle |
\left\langle \, \nabla _{v}{\cal J}^T |_{\vec{v}^{(0)}} \, , \, \delta \vec{v} \, \right\rangle |
161 |
\, + \, O(\delta \vec{v}^2) |
\, + \, O(\delta \vec{v}^2) |
162 |
\end{split} |
\end{aligned} |
163 |
\label{deljidentity} |
\label{deljidentity} |
164 |
\end{equation} |
\end{equation} |
165 |
% |
% |
200 |
invoking the adjoint $ M^{\ast } $ of the tangent linear model $ M $ |
invoking the adjoint $ M^{\ast } $ of the tangent linear model $ M $ |
201 |
% |
% |
202 |
\begin{equation} |
\begin{equation} |
203 |
\begin{split} |
\begin{aligned} |
204 |
\nabla _{u}{\cal J}^T |_{\vec{u}} & |
\nabla _{u}{\cal J}^T |_{\vec{u}} & |
205 |
= \, M^T |_{\vec{u}} \cdot \nabla _{v}{\cal J}^T |_{\vec{v}} \\ |
= \, M^T |_{\vec{u}} \cdot \nabla _{v}{\cal J}^T |_{\vec{v}} \\ |
206 |
~ & = \, M^T |_{\vec{u}} \cdot \delta \vec{v}^{\ast} \\ |
~ & = \, M^T |_{\vec{u}} \cdot \delta \vec{v}^{\ast} \\ |
207 |
~ & = \, \delta \vec{u}^{\ast} |
~ & = \, \delta \vec{u}^{\ast} |
208 |
\end{split} |
\end{aligned} |
209 |
\label{adjoint} |
\label{adjoint} |
210 |
\end{equation} |
\end{equation} |
211 |
% |
% |
253 |
= \nabla_v {\cal J} \cdot \delta \vec{v} $ ) |
= \nabla_v {\cal J} \cdot \delta \vec{v} $ ) |
254 |
% |
% |
255 |
\begin{equation} |
\begin{equation} |
256 |
\begin{split} |
\begin{aligned} |
257 |
\nabla_v {\cal J} (M(\delta \vec{u})) & = \, |
\nabla_v {\cal J} (M(\delta \vec{u})) & = \, |
258 |
\nabla_v {\cal J} \cdot M_{\Lambda} |
\nabla_v {\cal J} \cdot M_{\Lambda} |
259 |
\cdot ...... \cdot M_{\lambda} \cdot ...... \cdot |
\cdot ...... \cdot M_{\lambda} \cdot ...... \cdot |
260 |
M_{1} \cdot M_{0} \cdot \delta \vec{u} \\ |
M_{1} \cdot M_{0} \cdot \delta \vec{u} \\ |
261 |
~ & = \, \nabla_v {\cal J} \cdot \delta \vec{v} \\ |
~ & = \, \nabla_v {\cal J} \cdot \delta \vec{v} \\ |
262 |
\end{split} |
\end{aligned} |
263 |
\label{forward} |
\label{forward} |
264 |
\end{equation} |
\end{equation} |
265 |
% |
% |
267 |
% |
% |
268 |
\begin{equation} |
\begin{equation} |
269 |
\boxed{ |
\boxed{ |
270 |
\begin{split} |
\begin{aligned} |
271 |
M^T ( \nabla_v {\cal J}^T) & = \, |
M^T ( \nabla_v {\cal J}^T) & = \, |
272 |
M_{0}^T \cdot M_{1}^T |
M_{0}^T \cdot M_{1}^T |
273 |
\cdot ...... \cdot M_{\lambda}^T \cdot ...... \cdot |
\cdot ...... \cdot M_{\lambda}^T \cdot ...... \cdot |
276 |
\cdot ...... \cdot |
\cdot ...... \cdot |
277 |
\nabla_{v^{(\lambda)}} {\cal J}^T \\ |
\nabla_{v^{(\lambda)}} {\cal J}^T \\ |
278 |
~ & = \, \nabla_u {\cal J}^T |
~ & = \, \nabla_u {\cal J}^T |
279 |
\end{split} |
\end{aligned} |
280 |
} |
} |
281 |
\label{reverse} |
\label{reverse} |
282 |
\end{equation} |
\end{equation} |
295 |
% |
% |
296 |
\begin{equation} |
\begin{equation} |
297 |
\boxed{ |
\boxed{ |
298 |
\begin{split} |
\begin{aligned} |
299 |
\nabla_{v^{(\lambda)}} {\cal J}^T |_{\vec{v}^{(\lambda)}} |
\nabla_{v^{(\lambda)}} {\cal J}^T |_{\vec{v}^{(\lambda)}} |
300 |
& = \, |
& = \, |
301 |
M_{\lambda}^T |_{\vec{v}^{(\lambda)}} \cdot ...... \cdot |
M_{\lambda}^T |_{\vec{v}^{(\lambda)}} \cdot ...... \cdot |
302 |
M_{\Lambda}^T |_{\vec{v}^{(\lambda)}} \cdot \delta \vec{v}^{\ast} \\ |
M_{\Lambda}^T |_{\vec{v}^{(\lambda)}} \cdot \delta \vec{v}^{\ast} \\ |
303 |
~ & = \, \delta \vec{v}^{(\lambda) \, \ast} |
~ & = \, \delta \vec{v}^{(\lambda) \, \ast} |
304 |
\end{split} |
\end{aligned} |
305 |
} |
} |
306 |
\end{equation} |
\end{equation} |
307 |
% |
% |
418 |
$ \delta v^{(\lambda) \, \ast}_{j} = \frac{\partial}{\partial v^{(\lambda)}_{j}} |
$ \delta v^{(\lambda) \, \ast}_{j} = \frac{\partial}{\partial v^{(\lambda)}_{j}} |
419 |
{\cal J}^T $, $ j = 1, \ldots , n_{\lambda} $, |
{\cal J}^T $, $ j = 1, \ldots , n_{\lambda} $, |
420 |
for intermediate components, yielding |
for intermediate components, yielding |
421 |
|
{\small |
422 |
\begin{equation} |
\begin{equation} |
423 |
\small |
\begin{aligned} |
|
\begin{split} |
|
424 |
\left( |
\left( |
425 |
\begin{array}{c} |
\begin{array}{c} |
426 |
\delta v^{(\lambda) \, \ast}_1 \\ |
\delta v^{(\lambda) \, \ast}_1 \\ |
465 |
\delta v^{\ast}_{n} \\ |
\delta v^{\ast}_{n} \\ |
466 |
\end{array} |
\end{array} |
467 |
\right) |
\right) |
468 |
\end{split} |
\end{aligned} |
469 |
\end{equation} |
\end{equation} |
470 |
|
} |
471 |
|
|
472 |
Eq. (\ref{forward}) and (\ref{reverse}) are perhaps clearest in |
Eq. (\ref{forward}) and (\ref{reverse}) are perhaps clearest in |
473 |
showing the advantage of the reverse over the forward mode |
showing the advantage of the reverse over the forward mode |
538 |
Then, $ \nabla_v {\cal J} $ takes the form |
Then, $ \nabla_v {\cal J} $ takes the form |
539 |
% |
% |
540 |
\begin{equation*} |
\begin{equation*} |
541 |
\begin{split} |
\begin{aligned} |
542 |
\nabla_v {\cal J}^T & = \, 2 \, \, H \cdot |
\nabla_v {\cal J}^T & = \, 2 \, \, H \cdot |
543 |
\left( \, {\cal H}(\vec{v}) - \vec{d} \, \right) \\ |
\left( \, {\cal H}(\vec{v}) - \vec{d} \, \right) \\ |
544 |
~ & = \, 2 \sum_{j} \left\{ \sum_k |
~ & = \, 2 \sum_{j} \left\{ \sum_k |
545 |
\frac{\partial {\cal H}_k}{\partial v_{j}} |
\frac{\partial {\cal H}_k}{\partial v_{j}} |
546 |
\left( {\cal H}_k (\vec{v}) - d_k \right) |
\left( {\cal H}_k (\vec{v}) - d_k \right) |
547 |
\right\} \, {\vec{f}_{j}} \\ |
\right\} \, {\vec{f}_{j}} \\ |
548 |
\end{split} |
\end{aligned} |
549 |
\end{equation*} |
\end{equation*} |
550 |
% |
% |
551 |
where $H_{kj} = \partial {\cal H}_k / \partial v_{j} $ is the |
where $H_{kj} = \partial {\cal H}_k / \partial v_{j} $ is the |
664 |
%\psfrag{v_kn^lev2}{\mathinfigure{v_{k_{n}^{lev2}}}} |
%\psfrag{v_kn^lev2}{\mathinfigure{v_{k_{n}^{lev2}}}} |
665 |
%\psfrag{v_k1^lev1}{\mathinfigure{v_{k_{1}^{lev1}}}} |
%\psfrag{v_k1^lev1}{\mathinfigure{v_{k_{1}^{lev1}}}} |
666 |
%\psfrag{v_kn^lev1}{\mathinfigure{v_{k_{n}^{lev1}}}} |
%\psfrag{v_kn^lev1}{\mathinfigure{v_{k_{n}^{lev1}}}} |
667 |
%\mbox{\epsfig{file=part5/checkpointing.eps, width=0.8\textwidth}} |
%\mbox{\epsfig{file=s_autodiff/figs/checkpointing.eps, width=0.8\textwidth}} |
668 |
\resizebox{5.5in}{!}{\includegraphics{part5/checkpointing.eps}} |
\resizebox{5.5in}{!}{\includegraphics{s_autodiff/figs/checkpointing.eps}} |
669 |
%\psfull |
%\psfull |
670 |
\end{center} |
\end{center} |
671 |
\caption{ |
\caption{ |
693 |
|
|
694 |
In this section we describe in a general fashion |
In this section we describe in a general fashion |
695 |
the parts of the code that are relevant for automatic |
the parts of the code that are relevant for automatic |
696 |
differentiation using the software tool TAF. |
differentiation using the software tool TAF. |
697 |
|
Modifications to use OpenAD are described in \ref{sec_ad_openad}. |
698 |
|
|
699 |
\input{part5/doc_ad_the_model} |
\input{s_autodiff/text/doc_ad_the_model} |
700 |
|
|
701 |
The basic flow is depicted in \ref{fig:adthemodel}. |
The basic flow is depicted in \ref{fig:adthemodel}. |
702 |
If CPP option {\tt ALLOW\_AUTODIFF\_TAMC} is defined, the driver routine |
If CPP option \texttt{ALLOW\_AUTODIFF\_TAMC} is defined, |
703 |
|
the driver routine |
704 |
{\it the\_model\_main}, instead of calling {\it the\_main\_loop}, |
{\it the\_model\_main}, instead of calling {\it the\_main\_loop}, |
705 |
invokes the adjoint of this routine, {\it adthe\_main\_loop}, |
invokes the adjoint of this routine, {\it adthe\_main\_loop} |
706 |
which is the toplevel routine in terms of automatic differentiation. |
(case \texttt{\#define ALLOW\_ADJOINT\_RUN}), or |
707 |
The routine {\it adthe\_main\_loop} has been generated by TAF. |
the tangent linear of this routine {\it g\_the\_main\_loop} |
708 |
|
(case \texttt{\#define ALLOW\_TANGENTLINEAR\_RUN}), |
709 |
|
which are the toplevel routines in terms of automatic differentiation. |
710 |
|
The routines {\it adthe\_main\_loop} or {\it g\_the\_main\_loop} |
711 |
|
are generated by TAF. |
712 |
It contains both the forward integration of the full model, the |
It contains both the forward integration of the full model, the |
713 |
cost function calculation, |
cost function calculation, |
714 |
any additional storing that is required for efficient checkpointing, |
any additional storing that is required for efficient checkpointing, |
731 |
{\tt ALLOW\_GRADIENT\_CHECK} is defined. In this case |
{\tt ALLOW\_GRADIENT\_CHECK} is defined. In this case |
732 |
the driver routine {\it grdchk\_main} is called after |
the driver routine {\it grdchk\_main} is called after |
733 |
the gradient has been computed via the adjoint |
the gradient has been computed via the adjoint |
734 |
(cf. Section \ref{section_grdchk}). |
(cf. Section \ref{sec:ad_gradient_check}). |
735 |
|
|
736 |
%------------------------------------------------------------------ |
%------------------------------------------------------------------ |
737 |
|
|
741 |
In order to configure AD-related setups the following packages need |
In order to configure AD-related setups the following packages need |
742 |
to be enabled: |
to be enabled: |
743 |
{\it |
{\it |
744 |
\begin{table}[h!] |
\begin{table}[!ht] |
745 |
\begin{tabular}{l} |
\begin{tabular}{l} |
746 |
autodiff \\ |
autodiff \\ |
747 |
ctrl \\ |
ctrl \\ |
777 |
|
|
778 |
%------------------------------------------------------------------ |
%------------------------------------------------------------------ |
779 |
|
|
780 |
\subsection{Building the AD code |
\subsection{Building the AD code using TAF |
781 |
\label{section_ad_build}} |
\label{section_ad_build}} |
782 |
|
|
783 |
The build process of an AD code is very similar to building |
The build process of an AD code is very similar to building |
785 |
to generate, and on which AD tool is available (TAF or TAMC), |
to generate, and on which AD tool is available (TAF or TAMC), |
786 |
the following {\tt make} targets are available: |
the following {\tt make} targets are available: |
787 |
|
|
788 |
\begin{table}[h!] |
\begin{table}[!ht] |
789 |
{\footnotesize |
{\footnotesize |
790 |
\begin{tabular}{ccll} |
\begin{tabular}{|ccll|} |
791 |
|
\hline |
792 |
~ & {\it AD-target} & {\it output} & {\it description} \\ |
~ & {\it AD-target} & {\it output} & {\it description} \\ |
793 |
\hline |
\hline |
794 |
\hline |
\hline |
807 |
~ & ~ & ~ & and compiles all code \\ |
~ & ~ & ~ & and compiles all code \\ |
808 |
~ & ~ & ~ & (use of TAF is set as default) \\ |
~ & ~ & ~ & (use of TAF is set as default) \\ |
809 |
\hline |
\hline |
|
\hline |
|
810 |
\end{tabular} |
\end{tabular} |
811 |
} |
} |
812 |
\end{table} |
\end{table} |
815 |
% |
% |
816 |
\begin{itemize} |
\begin{itemize} |
817 |
% |
% |
818 |
\item [$<$TOOL$>$] |
\item $<$TOOL$>$ |
819 |
% |
% |
820 |
\begin{itemize} |
\begin{itemize} |
821 |
% |
% |
824 |
% |
% |
825 |
\end{itemize} |
\end{itemize} |
826 |
% |
% |
827 |
\item [$<$MODE$>$] |
\item $<$MODE$>$ |
828 |
% |
% |
829 |
\begin{itemize} |
\begin{itemize} |
830 |
% |
% |
866 |
\item |
\item |
867 |
A header file {\tt AD\_CONFIG.h} is generated which contains a CPP option |
A header file {\tt AD\_CONFIG.h} is generated which contains a CPP option |
868 |
on which code ought to be generated. Depending on the {\tt make} target, |
on which code ought to be generated. Depending on the {\tt make} target, |
869 |
the contents is |
the contents is one of the following: |
870 |
\begin{itemize} |
\begin{itemize} |
871 |
\item |
\item |
872 |
{\tt \#define ALLOW\_ADJOINT\_RUN} |
{\tt \#define ALLOW\_ADJOINT\_RUN} |
882 |
and all {\tt .flow} files that are part of the list {\bf AD\_FLOW\_FILES}. |
and all {\tt .flow} files that are part of the list {\bf AD\_FLOW\_FILES}. |
883 |
% |
% |
884 |
\item |
\item |
885 |
The AD tool is invoked with the {\bf <MODE>\_<TOOL>\_FLAGS}. |
The AD tool is invoked with the {\tt <MODE>\_<TOOL>\_FLAGS}. |
886 |
The default AD tool flags in {\tt genmake2} can be overrwritten by |
The default AD tool flags in {\tt genmake2} can be overrwritten by |
887 |
an {\tt adjoint\_options} file (similar to the platform-specific |
an {\tt adjoint\_options} file (similar to the platform-specific |
888 |
{\tt build\_options}, see Section ???. |
{\tt build\_options}, see Section ???. |
961 |
{\tt eesupp/src/} and {\tt model/src/} |
{\tt eesupp/src/} and {\tt model/src/} |
962 |
reside in {\tt pkg/autodiff/}. |
reside in {\tt pkg/autodiff/}. |
963 |
This directory also contains hand-written adjoint code |
This directory also contains hand-written adjoint code |
964 |
for the MITgcm WRAPPER (see Section ???). |
for the MITgcm WRAPPER (section \ref{chap:sarch}). |
965 |
|
|
966 |
Flow directives for package-specific routines are contained in |
Flow directives for package-specific routines are contained in |
967 |
the corresponding package directories in the file |
the corresponding package directories in the file |
1015 |
are controlled by the package {\it pkg/ctrl} and will be treated |
are controlled by the package {\it pkg/ctrl} and will be treated |
1016 |
in the next section. |
in the next section. |
1017 |
|
|
1018 |
\input{part5/doc_cost_flow} |
\input{s_autodiff/text/doc_cost_flow} |
1019 |
|
|
1020 |
\subsubsection{Enabling the package} |
\subsubsection{Enabling the package} |
1021 |
|
|
1105 |
the chosen cost function contributions. |
the chosen cost function contributions. |
1106 |
In the present example ({\bf ALLOW\_COST\_TRACER}), |
In the present example ({\bf ALLOW\_COST\_TRACER}), |
1107 |
S/R {\it cost\_tracer} is called. |
S/R {\it cost\_tracer} is called. |
1108 |
It accumulates {\bf objf\_tracer} according to eqn. (\ref{???}). |
It accumulates {\bf objf\_tracer} according to eqn. (ref:ask-the-author). |
1109 |
% |
% |
1110 |
\subsubsection{Finalize all contributions} |
\subsubsection{Finalize all contributions} |
1111 |
% |
% |
1130 |
\end{equation} |
\end{equation} |
1131 |
% |
% |
1132 |
The total cost function {\bf fc} will be the |
The total cost function {\bf fc} will be the |
1133 |
'dependent' variable in the argument list for TAMC, i.e. |
'dependent' variable in the argument list for TAF, i.e. |
1134 |
\begin{verbatim} |
\begin{verbatim} |
1135 |
tamc -output 'fc' ... |
taf -output 'fc' ... |
1136 |
\end{verbatim} |
\end{verbatim} |
1137 |
|
|
1138 |
%%%% \end{document} |
%%%% \end{document} |
1139 |
|
|
1140 |
\input{part5/doc_ad_the_main} |
\input{s_autodiff/text/doc_ad_the_main} |
1141 |
|
|
1142 |
\subsection{The control variables (independent variables) |
\subsection{The control variables (independent variables) |
1143 |
\label{section_ctrl}} |
\label{section_ctrl}} |
1157 |
(parameter setting, initialization, perturbation) |
(parameter setting, initialization, perturbation) |
1158 |
are controlled by the package {\it pkg/ctrl}. |
are controlled by the package {\it pkg/ctrl}. |
1159 |
|
|
1160 |
\input{part5/doc_ctrl_flow} |
\input{s_autodiff/text/doc_ctrl_flow} |
1161 |
|
|
1162 |
\subsubsection{genmake and CPP options} |
\subsubsection{genmake and CPP options} |
1163 |
% |
% |
1215 |
\\ |
\\ |
1216 |
% |
% |
1217 |
Two important issues related to the handling of the control |
Two important issues related to the handling of the control |
1218 |
variables in the MITGCM need to be addressed. |
variables in MITgcm need to be addressed. |
1219 |
First, in order to save memory, the control variable arrays |
First, in order to save memory, the control variable arrays |
1220 |
are not kept in memory, but rather read from file and added |
are not kept in memory, but rather read from file and added |
1221 |
to the initial fields during the model initialization phase. |
to the initial fields during the model initialization phase. |
1247 |
% |
% |
1248 |
The dependency flow for differentiation w.r.t. the controls |
The dependency flow for differentiation w.r.t. the controls |
1249 |
starts with adding a perturbation onto the input variable, |
starts with adding a perturbation onto the input variable, |
1250 |
thus defining the independent or control variables for TAMC. |
thus defining the independent or control variables for TAF. |
1251 |
Three types of controls may be considered: |
Three types of controls may be considered: |
1252 |
% |
% |
1253 |
\begin{itemize} |
\begin{itemize} |
1268 |
a perturbation anomaly is added to the field in S/R |
a perturbation anomaly is added to the field in S/R |
1269 |
{\it ctrl\_map\_ini} |
{\it ctrl\_map\_ini} |
1270 |
% |
% |
1271 |
|
%\begin{eqnarray} |
1272 |
\begin{equation} |
\begin{equation} |
1273 |
\begin{split} |
\begin{aligned} |
1274 |
u & = \, u_{[0]} \, + \, \Delta u \\ |
u & = \, u_{[0]} \, + \, \Delta u \\ |
1275 |
{\bf tr1}(...) & = \, {\bf tr1_{ini}}(...) \, + \, {\bf xx\_tr1}(...) |
{\bf tr1}(...) & = \, {\bf tr1_{ini}}(...) \, + \, {\bf xx\_tr1}(...) |
1276 |
\label{perturb} |
\label{perturb} |
1277 |
\end{split} |
\end{aligned} |
1278 |
\end{equation} |
\end{equation} |
1279 |
|
%\end{eqnarray} |
1280 |
% |
% |
1281 |
{\bf xx\_tr1} is a 3-dim. global array |
{\bf xx\_tr1} is a 3-dim. global array |
1282 |
holding the perturbation. In the case of a simple |
holding the perturbation. In the case of a simple |
1283 |
sensitivity study this array is identical to zero. |
sensitivity study this array is identical to zero. |
1284 |
However, it's specification is essential in the context |
However, it's specification is essential in the context |
1285 |
of automatic differentiation since TAMC |
of automatic differentiation since TAF |
1286 |
treats the corresponding line in the code symbolically |
treats the corresponding line in the code symbolically |
1287 |
when determining the differentiation chain and its origin. |
when determining the differentiation chain and its origin. |
1288 |
Thus, the variable names are part of the argument list |
Thus, the variable names are part of the argument list |
1289 |
when calling TAMC: |
when calling TAF: |
1290 |
% |
% |
1291 |
\begin{verbatim} |
\begin{verbatim} |
1292 |
tamc -input 'xx_tr1 ...' ... |
taf -input 'xx_tr1 ...' ... |
1293 |
\end{verbatim} |
\end{verbatim} |
1294 |
% |
% |
1295 |
Now, as mentioned above, the MITGCM avoids maintaining |
Now, as mentioned above, MITgcm avoids maintaining |
1296 |
an array for each control variable by reading the |
an array for each control variable by reading the |
1297 |
perturbation to a temporary array from file. |
perturbation to a temporary array from file. |
1298 |
To ensure the symbolic link to be recognized by TAMC, a scalar |
To ensure the symbolic link to be recognized by TAF, a scalar |
1299 |
dummy variable {\bf xx\_tr1\_dummy} is introduced |
dummy variable {\bf xx\_tr1\_dummy} is introduced |
1300 |
and an 'active read' routine of the adjoint support |
and an 'active read' routine of the adjoint support |
1301 |
package {\it pkg/autodiff} is invoked. |
package {\it pkg/autodiff} is invoked. |
1302 |
The read-procedure is tagged with the variable |
The read-procedure is tagged with the variable |
1303 |
{\bf xx\_tr1\_dummy} enabling TAMC to recognize the |
{\bf xx\_tr1\_dummy} enabling TAF to recognize the |
1304 |
initialization of the perturbation. |
initialization of the perturbation. |
1305 |
The modified call of TAMC thus reads |
The modified call of TAF thus reads |
1306 |
% |
% |
1307 |
\begin{verbatim} |
\begin{verbatim} |
1308 |
tamc -input 'xx_tr1_dummy ...' ... |
taf -input 'xx_tr1_dummy ...' ... |
1309 |
\end{verbatim} |
\end{verbatim} |
1310 |
% |
% |
1311 |
and the modified operation to (\ref{perturb}) |
and the modified operation to (\ref{perturb}) |
1502 |
$ u_{[k+1]} $ then serves as input for a forward/adjoint run |
$ u_{[k+1]} $ then serves as input for a forward/adjoint run |
1503 |
to determine $ {\cal J} $ and $ \nabla _{u}{\cal J} $ at iteration step |
to determine $ {\cal J} $ and $ \nabla _{u}{\cal J} $ at iteration step |
1504 |
$ k+1 $. |
$ k+1 $. |
1505 |
Tab. \ref{???} sketches the flow between forward/adjoint model |
Tab. ref:ask-the-author sketches the flow between forward/adjoint model |
1506 |
and the minimization routine. |
and the minimization routine. |
1507 |
|
|
1508 |
|
{\scriptsize |
1509 |
\begin{eqnarray*} |
\begin{eqnarray*} |
|
\scriptsize |
|
1510 |
\begin{array}{ccccc} |
\begin{array}{ccccc} |
1511 |
u_{[0]} \,\, , \,\, \Delta u_{[k]} & ~ & ~ & ~ & ~ \\ |
u_{[0]} \,\, , \,\, \Delta u_{[k]} & ~ & ~ & ~ & ~ \\ |
1512 |
{\Big\downarrow} |
{\Big\downarrow} |
1557 |
~ & ~ & ~ & ~ & \Delta u_{[k+1]} \\ |
~ & ~ & ~ & ~ & \Delta u_{[k+1]} \\ |
1558 |
\end{array} |
\end{array} |
1559 |
\end{eqnarray*} |
\end{eqnarray*} |
1560 |
|
} |
1561 |
|
|
1562 |
The routines {\it ctrl\_unpack} and {\it ctrl\_pack} provide |
The routines {\it ctrl\_unpack} and {\it ctrl\_pack} provide |
1563 |
the link between the model and the minimization routine. |
the link between the model and the minimization routine. |
1564 |
As described in Section \ref{???} |
As described in Section ref:ask-the-author |
1565 |
the {\it unpack} and {\it pack} routines read and write |
the {\it unpack} and {\it pack} routines read and write |
1566 |
control and gradient {\it vectors} which are compressed |
control and gradient {\it vectors} which are compressed |
1567 |
to contain only wet points, in addition to the full |
to contain only wet points, in addition to the full |