1 |
% $Header: /u/gcmpack/manual/part5/doc_ad_examples.tex,v 1.7 2006/04/05 02:27:33 edhill Exp $ |
2 |
% $Name: $ |
3 |
|
4 |
%********************************************************************** |
5 |
\section{Sensitivity of Air-Sea Exchange to Tracer Injection Site } |
6 |
\label{www:tutorials} |
7 |
\label{sect:eg-simple-tracer-adjoint} |
8 |
\label{sec_ad_setup_ex} |
9 |
\label{sect:tutorialIII} |
10 |
\begin{rawhtml} |
11 |
<!-- CMIREDIR:sec_ad_setup_ex: --> |
12 |
\end{rawhtml} |
13 |
%********************************************************************** |
14 |
|
15 |
MITgcm has been adapted to enable AD using TAMC or TAF. |
16 |
The present description, therefore, is specific to the |
17 |
use of TAMC or TAF as AD tool. |
18 |
The following sections describe the steps which are necessary to |
19 |
generate a tangent linear or adjoint model of MITgcm. |
20 |
We take as an example the sensitivity of carbon sequestration |
21 |
in the ocean. |
22 |
The AD-relevant hooks in the code are sketched in |
23 |
\ref{fig:adthemodel}, \ref{fig:adthemain}. |
24 |
|
25 |
\subsection{Overview of the experiment} |
26 |
\label{www:tutorials} |
27 |
|
28 |
We describe an adjoint sensitivity analysis of out-gassing from |
29 |
the ocean into the atmosphere of a carbon-like tracer injected |
30 |
into the ocean interior (see \cite{hil-eta:01}). |
31 |
|
32 |
\subsubsection{Passive tracer equation} |
33 |
\label{www:tutorials} |
34 |
|
35 |
For this work MITgcm was augmented with a thermodynamically |
36 |
inactive tracer, $C$. Tracer residing in the ocean |
37 |
model surface layer is out-gassed according to a relaxation time scale, |
38 |
$\mu$. Within the ocean interior, the tracer is passively advected |
39 |
by the ocean model currents. The full equation for the time evolution |
40 |
% |
41 |
\begin{equation} |
42 |
\label{carbon_ddt} |
43 |
\frac{\partial C}{\partial t} \, = \, |
44 |
-U\cdot \nabla C \, - \, \mu C \, + \, \Gamma(C) \,+ \, S |
45 |
\end{equation} |
46 |
% |
47 |
also includes a source term $S$. This term |
48 |
represents interior sources of $C$ such as would arise due to |
49 |
direct injection. |
50 |
The velocity term, $U$, is the sum of the |
51 |
model Eulerian circulation and an eddy-induced velocity, the latter |
52 |
parameterized according to Gent/McWilliams |
53 |
(\cite{gen-mcw:90, gen-eta:95}). |
54 |
The convection function, $\Gamma$, mixes $C$ vertically wherever the |
55 |
fluid is locally statically unstable. |
56 |
|
57 |
The out-gassing time scale, $\mu$, in eqn. (\ref{carbon_ddt}) |
58 |
is set so that \( 1/\mu \sim 1 \ \mathrm{year} \) for the surface |
59 |
ocean and $\mu=0$ elsewhere. With this value, eqn. (\ref{carbon_ddt}) |
60 |
is valid as a prognostic equation for small perturbations in oceanic |
61 |
carbon concentrations. This configuration provides a |
62 |
powerful tool for examining the impact of large-scale ocean circulation |
63 |
on $ CO_2 $ out-gassing due to interior injections. |
64 |
As source we choose a constant in time injection of |
65 |
$ S = 1 \,\, {\rm mol / s}$. |
66 |
|
67 |
\subsubsection{Model configuration} |
68 |
\label{www:tutorials} |
69 |
|
70 |
The model configuration employed has a constant |
71 |
$4^\circ \times 4^\circ$ resolution horizontal grid and realistic |
72 |
geography and bathymetry. Twenty vertical layers are used with |
73 |
vertical spacing ranging |
74 |
from 50 m near the surface to 815 m at depth. |
75 |
Driven to steady-state by climatological wind-stress, heat and |
76 |
fresh-water forcing the model reproduces well known large-scale |
77 |
features of the ocean general circulation. |
78 |
|
79 |
\subsubsection{Out-gassing cost function} |
80 |
\label{www:tutorials} |
81 |
|
82 |
To quantify and understand out-gassing due to injections of $C$ |
83 |
in eqn. (\ref{carbon_ddt}), |
84 |
we define a cost function $ {\cal J} $ that measures the total amount of |
85 |
tracer out-gassed at each timestep: |
86 |
% |
87 |
\begin{equation} |
88 |
\label{cost_tracer} |
89 |
{\cal J}(t=T)=\int_{t=0}^{t=T}\int_{A} \mu C \, dA \, dt |
90 |
\end{equation} |
91 |
% |
92 |
Equation(\ref{cost_tracer}) integrates the out-gassing term, $\mu C$, |
93 |
from (\ref{carbon_ddt}) |
94 |
over the entire ocean surface area, $A$, and accumulates it |
95 |
up to time $T$. |
96 |
Physically, ${\cal J}$ can be thought of as representing the amount of |
97 |
$CO_2$ that our model predicts would be out-gassed following an |
98 |
injection at rate $S$. |
99 |
The sensitivity of ${\cal J}$ to the spatial location of $S$, |
100 |
$\frac{\partial {\cal J}}{\partial S}$, |
101 |
can be used to identify regions from which circulation |
102 |
would cause $CO_2$ to rapidly out-gas following injection |
103 |
and regions in which $CO_2$ injections would remain effectively |
104 |
sequestered within the ocean. |
105 |
|
106 |
\subsection{Code configuration} |
107 |
\label{www:tutorials} |
108 |
|
109 |
The model configuration for this experiment resides under the |
110 |
directory {\it verification/carbon/}. |
111 |
The code customization routines are in {\it verification/carbon/code/}: |
112 |
% |
113 |
\begin{itemize} |
114 |
% |
115 |
\item {\it .genmakerc} |
116 |
% |
117 |
\item {\it COST\_CPPOPTIONS.h} |
118 |
% |
119 |
\item {\it CPP\_EEOPTIONS.h} |
120 |
% |
121 |
\item {\it CPP\_OPTIONS.h} |
122 |
% |
123 |
\item {\it CTRL\_OPTIONS.h} |
124 |
% |
125 |
\item {\it ECCO\_OPTIONS.h} |
126 |
% |
127 |
\item {\it SIZE.h} |
128 |
% |
129 |
\item {\it adcommon.h} |
130 |
% |
131 |
\item {\it tamc.h} |
132 |
% |
133 |
\end{itemize} |
134 |
% |
135 |
The runtime flag and parameters settings are contained in |
136 |
{\it verification/carbon/input/}, |
137 |
together with the forcing fields and and restart files: |
138 |
% |
139 |
\begin{itemize} |
140 |
% |
141 |
\item {\it data} |
142 |
% |
143 |
\item {\it data.cost} |
144 |
% |
145 |
\item {\it data.ctrl} |
146 |
% |
147 |
\item {\it data.gmredi} |
148 |
% |
149 |
\item {\it data.grdchk} |
150 |
% |
151 |
\item {\it data.optim} |
152 |
% |
153 |
\item {\it data.pkg} |
154 |
% |
155 |
\item {\it eedata} |
156 |
% |
157 |
\item {\it topog.bin} |
158 |
% |
159 |
\item {\it windx.bin, windy.bin} |
160 |
% |
161 |
\item {\it salt.bin, theta.bin} |
162 |
% |
163 |
\item {\it SSS.bin, SST.bin} |
164 |
% |
165 |
\item {\it pickup*} |
166 |
% |
167 |
\end{itemize} |
168 |
% |
169 |
Finally, the file to generate the adjoint code resides in |
170 |
$ adjoint/ $: |
171 |
% |
172 |
\begin{itemize} |
173 |
% |
174 |
\item {\it makefile} |
175 |
% |
176 |
\end{itemize} |
177 |
% |
178 |
|
179 |
Below we describe the customizations of this files which are |
180 |
specific to this experiment. |
181 |
|
182 |
\subsubsection{File {\it .genmakerc}} |
183 |
\label{www:tutorials} |
184 |
This file overwrites default settings of {\it genmake}. |
185 |
In the present example it is used to switch on the following |
186 |
packages which are related to automatic differentiation |
187 |
and are disabled by default: \\ |
188 |
\hspace*{4ex} {\tt set ENABLE=( autodiff cost ctrl ecco gmredi grdchk kpp )} \\ |
189 |
Other packages which are not needed are switched off: \\ |
190 |
\hspace*{4ex} {\tt set DISABLE=( aim obcs zonal\_filt shap\_filt cal exf )} |
191 |
|
192 |
\subsubsection{File {\it COST\_CPPOPTIONS.h, CTRL\_OPTIONS.h}} |
193 |
\label{www:tutorials} |
194 |
|
195 |
These files used to contain package-specific CPP-options |
196 |
(see Section \ref{???}). |
197 |
For technical reasons those options have been grouped together |
198 |
in the file {\it ECCO\_OPTIONS.h}. |
199 |
To retain the modularity, the files have been kept and contain |
200 |
the standard include of the {\it CPP\_OPTIONS.h} file. |
201 |
|
202 |
\subsubsection{File {\it CPP\_EEOPTIONS.h}} |
203 |
\label{www:tutorials} |
204 |
|
205 |
This file contains 'wrapper'-specific CPP options. |
206 |
It only needs to be changed if the code is to be run |
207 |
in a parallel environment (see Section \ref{???}). |
208 |
|
209 |
\subsubsection{File {\it CPP\_OPTIONS.h}} |
210 |
\label{www:tutorials} |
211 |
|
212 |
This file contains model-specific CPP options |
213 |
(see Section \ref{???}). |
214 |
Most options are related to the forward model setup. |
215 |
They are identical to the global steady circulation setup of |
216 |
{\it verification/global\_ocean.90x40x15/}. |
217 |
The three options specific to this experiment are \\ |
218 |
\hspace*{4ex} {\tt \#define ALLOW\_PASSIVE\_TRACER} \\ |
219 |
This flag enables the code to carry through the |
220 |
advection/diffusion of a passive tracer along the |
221 |
model integration. \\ |
222 |
\hspace*{4ex} {\tt \#define ALLOW\_MIT\_ADJOINT\_RUN} \\ |
223 |
This flag enables the inclusion of some AD-related fields |
224 |
concerning initialization, link between control variables |
225 |
and forward model variables, and the call to the top-level |
226 |
forward/adjoint subroutine {\it adthe\_main\_loop} |
227 |
instead of {\it the\_main\_loop}. \\ |
228 |
\hspace*{4ex} {\tt \#define ALLOW\_GRADIENT\_CHECK} \\ |
229 |
This flag enables the gradient check package. |
230 |
After computing the unperturbed cost function and its gradient, |
231 |
a series of computations are performed for which \\ |
232 |
$\bullet$ an element of the control vector is perturbed \\ |
233 |
$\bullet$ the cost function w.r.t. the perturbed element is |
234 |
computed \\ |
235 |
$\bullet$ the difference between the perturbed and unperturbed |
236 |
cost function is computed to compute the finite difference gradient \\ |
237 |
$\bullet$ the finite difference gradient is compared with the |
238 |
adjoint-generated gradient. |
239 |
The gradient check package is further described in Section ???. |
240 |
|
241 |
\subsubsection{File {\it ECCO\_OPTIONS.h}} |
242 |
\label{www:tutorials} |
243 |
|
244 |
The CPP options of several AD-related packages are grouped |
245 |
in this file: |
246 |
% |
247 |
\begin{itemize} |
248 |
% |
249 |
\item |
250 |
Overall ECCO-related execution modus: \\ |
251 |
These determine whether a pure forward run, |
252 |
a sensitivity run or an iteration of optimization is |
253 |
performed. These options are not needed in the present context. |
254 |
% |
255 |
\item |
256 |
Adjoint support package: {\it pkg/autodiff/} \\ |
257 |
This package contains hand-written adjoint code such as |
258 |
active file handling, flow directives for files which must not |
259 |
be differentiated, and TAMC-specific header files. \\ |
260 |
% |
261 |
\hspace*{4ex} {\tt \#define ALLOW\_AUTODIFF\_TAMC} \\ |
262 |
defines TAMC-related features in the code. \\ |
263 |
% |
264 |
\hspace*{4ex} {\tt \#define ALLOW\_TAMC\_CHECKPOINTING} \\ |
265 |
enables the checkpointing feature of TAMC |
266 |
(see Section \ref{???}). |
267 |
In the present example a 3-level checkpointing is implemented. |
268 |
The code contains the relevant store directives, common block |
269 |
and tape initializations, storing key computation, |
270 |
and loop index handling. |
271 |
The checkpointing length at each level is defined in |
272 |
file {\it tamc.h}, cf. below. |
273 |
The out and intermediate loop directivs are contained |
274 |
in the files {\it checkpoint\_lev3\_directives.h}, |
275 |
{\it checkpoint\_lev2\_directives.h} (package {\it pkg/autodiff}). \\ |
276 |
% |
277 |
\hspace*{4ex} {\tt \#define ALLOW\_AUTODIFF\_MONITOOR} \\ |
278 |
enables the monitoring of intermediate adjoint variables |
279 |
(see Section \ref{???}). \\ |
280 |
% |
281 |
\hspace*{4ex} {\tt \#define ALLOW\_DIVIDED\_ADJOINT} \\ |
282 |
enables adjoint dump and restart |
283 |
(see Section \ref{???}). |
284 |
% |
285 |
\item Cost function package: {\it pkg/cost/} \\ |
286 |
This package contains all relevant routines for |
287 |
initializing, accumulating and finalizing the cost function |
288 |
(see Section \ref{???}). \\ |
289 |
\hspace*{4ex} {\tt \#define ALLOW\_COST} \\ |
290 |
enables all general aspects of the cost function handling, |
291 |
in particular the hooks in the forward code for |
292 |
initializing, accumulating and finalizing the cost function. \\ |
293 |
\hspace*{4ex} {\tt \#define ALLOW\_COST\_TRACER} \\ |
294 |
includes the call to the cost function for this |
295 |
particular experiment, eqn. (\ref{cost_tracer}). |
296 |
% |
297 |
\item Control variable package: {\it pkg/ctrl/} \\ |
298 |
This package contains all relevant routines for |
299 |
the handling of the control vector. |
300 |
Each control variable can be enabled/disabled with its own flag: \\ |
301 |
\begin{tabular}{ll} |
302 |
\hspace*{2ex} {\tt \#define ALLOW\_THETA0\_CONTROL} & |
303 |
initial temperature \\ |
304 |
\hspace*{2ex} {\tt \#define ALLOW\_SALT0\_CONTROL} & |
305 |
initial salinity \\ |
306 |
\hspace*{2ex} {\tt \#define ALLOW\_TR0\_CONTROL} & |
307 |
initial passive tracer concentration \\ |
308 |
\hspace*{2ex} {\tt \#define ALLOW\_TAUU0\_CONTROL} & |
309 |
zonal wind stress \\ |
310 |
\hspace*{2ex} {\tt \#define ALLOW\_TAUV0\_CONTROL} & |
311 |
meridional wind stress \\ |
312 |
\hspace*{2ex} {\tt \#define ALLOW\_SFLUX0\_CONTROL} & |
313 |
freshwater flux \\ |
314 |
\hspace*{2ex} {\tt \#define ALLOW\_HFLUX0\_CONTROL} & |
315 |
heat flux \\ |
316 |
\hspace*{2ex} {\tt \#define ALLOW\_DIFFKR\_CONTROL} & |
317 |
diapycnal diffusivity \\ |
318 |
\hspace*{2ex} {\tt \#undef ALLOW\_KAPPAGM\_CONTROL} & |
319 |
isopycnal diffusivity \\ |
320 |
\end{tabular} |
321 |
% |
322 |
\end{itemize} |
323 |
|
324 |
\subsubsection{File {\it SIZE.h}} |
325 |
\label{www:tutorials} |
326 |
|
327 |
The file contains the grid point dimensions of the forward |
328 |
model. It is identical to the {\it verification/exp2/}: \\ |
329 |
\hspace*{4ex} {\tt sNx = 90} \\ |
330 |
\hspace*{4ex} {\tt sNy = 40} \\ |
331 |
\hspace*{4ex} {\tt Nr = 20} \\ |
332 |
It corresponds to a single-tile/single-processor setup: |
333 |
{\tt nSx = nSy = 1, nPx = nPy = 1}, |
334 |
with standard overlap dimensioning |
335 |
{\tt OLx = OLy = 3}. |
336 |
|
337 |
\subsubsection{File {\it adcommon.h}} |
338 |
\label{www:tutorials} |
339 |
|
340 |
This file contains common blocks of some adjoint variables |
341 |
that are generated by TAMC. |
342 |
The common blocks are used by the adjoint support routine |
343 |
{\it addummy\_in\_stepping} which needs to access those variables: |
344 |
|
345 |
\begin{tabular}{ll} |
346 |
\hspace*{4ex} {\tt common /addynvars\_r/} & |
347 |
\hspace*{4ex} is related to {\it DYNVARS.h} \\ |
348 |
\hspace*{4ex} {\tt common /addynvars\_cd/} & |
349 |
\hspace*{4ex} is related to {\it DYNVARS.h} \\ |
350 |
\hspace*{4ex} {\tt common /addynvars\_diffkr/} & |
351 |
\hspace*{4ex} is related to {\it DYNVARS.h} \\ |
352 |
\hspace*{4ex} {\tt common /addynvars\_kapgm/} & |
353 |
\hspace*{4ex} is related to {\it DYNVARS.h} \\ |
354 |
\hspace*{4ex} {\tt common /adtr1\_r/} & |
355 |
\hspace*{4ex} is related to {\it TR1.h} \\ |
356 |
\hspace*{4ex} {\tt common /adffields/} & |
357 |
\hspace*{4ex} is related to {\it FFIELDS.h}\\ |
358 |
\end{tabular} |
359 |
|
360 |
Note that if the structure of the common block changes in the |
361 |
above header files of the forward code, the structure |
362 |
of the adjoint common blocks will change accordingly. |
363 |
Thus, it has to be made sure that the structure of the |
364 |
adjoint common block in the hand-written file {\it adcommon.h} |
365 |
complies with the automatically generated adjoint common blocks |
366 |
in {\it adjoint\_model.F}. |
367 |
The header file is enabled via the CPP-option |
368 |
{\bf ALLOW\_AUTODIFF\_MONITOR}. |
369 |
|
370 |
\subsubsection{File {\it tamc.h}} |
371 |
\label{www:tutorials} |
372 |
|
373 |
This routine contains the dimensions for TAMC checkpointing |
374 |
and some indices relevant for storing ky computations. |
375 |
% |
376 |
\begin{itemize} |
377 |
% |
378 |
\item {\tt \#ifdef ALLOW\_TAMC\_CHECKPOINTING} \\ |
379 |
3-level checkpointing is enabled, i.e. the timestepping |
380 |
is divided into three different levels (see Section \ref{???}). |
381 |
The model state of the outermost ({\tt nchklev\_3}) and the |
382 |
intermediate ({\tt nchklev\_2}) timestepping loop are stored to file |
383 |
(handled in {\it the\_main\_loop}). |
384 |
The innermost loop ({\tt nchklev\_1}) |
385 |
avoids I/O by storing all required variables |
386 |
to common blocks. This storing may also be necessary if |
387 |
no checkpointing is chosen |
388 |
(nonlinear functions, if-statements, iterative loops, ...). |
389 |
In the present example the dimensions are chosen as follows: \\ |
390 |
\hspace*{4ex} {\tt nchklev\_1 = 36 } \\ |
391 |
\hspace*{4ex} {\tt nchklev\_2 = 30 } \\ |
392 |
\hspace*{4ex} {\tt nchklev\_3 = 60 } \\ |
393 |
To guarantee that the checkpointing intervals span the entire |
394 |
integration period the following relation must be satisfied: \\ |
395 |
\hspace*{4ex} {\tt nchklev\_1*nchklev\_2*nchklev\_3 $ \ge $ nTimeSteps} \\ |
396 |
where {\tt nTimeSteps} is either specified in {\it data} |
397 |
or computed via \\ |
398 |
\hspace*{4ex} {\tt nTimeSteps = (endTime-startTime)/deltaTClock }. |
399 |
% |
400 |
\item {\tt \#undef ALLOW\_TAMC\_CHECKPOINTING} \\ |
401 |
No checkpointing is enabled. |
402 |
In this case the relevant counter is {\tt nchklev\_0}. |
403 |
Similar to above, the following relation has to be satisfied \\ |
404 |
\hspace*{4ex} {\tt nchklev\_0 $ \ge $ nTimeSteps}. |
405 |
% |
406 |
\end{itemize} |
407 |
|
408 |
The following parameters may be worth describing: \\ |
409 |
% |
410 |
\hspace*{4ex} {\tt isbyte} \\ |
411 |
\hspace*{4ex} {\tt maxpass} \\ |
412 |
~ |
413 |
|
414 |
\subsubsection{File {\it makefile}} |
415 |
\label{www:tutorials} |
416 |
|
417 |
This file contains all relevant parameter flags and |
418 |
lists to run TAMC or TAF. |
419 |
It is assumed that TAMC is available to you, either locally, |
420 |
being installed on your network, or remotely through the 'TAMC Utility'. |
421 |
TAMC is called with the command {\tt tamc} followed by a |
422 |
number of options. They are described in detail in the |
423 |
TAMC manual \cite{gie:99}. |
424 |
Here we briefly discuss the main flags used in the {\it makefile}. |
425 |
The standard output for TAF is written to file |
426 |
{\it taf.log}. |
427 |
% |
428 |
\begin{itemize} |
429 |
\item [{\tt tamc}] {\tt |
430 |
-input <variable names> |
431 |
-output <variable name> -i4 -r4 ... \\ |
432 |
-toplevel <S/R name> -reverse <file names> |
433 |
} |
434 |
\item [{\tt taf}] {\tt |
435 |
-input <variable names> |
436 |
-output <variable name> -i4 -r4 ... \\ |
437 |
-toplevel <S/R name> -reverse <file names> \\ |
438 |
-flow taf\_flow.log -nonew\_arg |
439 |
} |
440 |
\end{itemize} |
441 |
% |
442 |
\begin{itemize} |
443 |
% |
444 |
\item {\tt -toplevel <S/R name>} \\ |
445 |
Name of the toplevel routine, with respect to which the |
446 |
control flow analysis is performed. |
447 |
% |
448 |
\item {\tt -input <variable names>} \\ |
449 |
List of independent variables $ u $ with respect to which the |
450 |
dependent variable $ J $ is differentiated. |
451 |
% |
452 |
\item {\tt -output <variable name>} \\ |
453 |
Dependent variable $ J $ which is to be differentiated. |
454 |
% |
455 |
\item {\tt -reverse <file names>} \\ |
456 |
Adjoint code is generated to compute the sensitivity of an |
457 |
independent variable w.r.t. many dependent variables. |
458 |
In the discussion of Section ??? |
459 |
the generated adjoint top-level routine computes the product |
460 |
of the transposed Jacobian matrix $ M^T $ times |
461 |
the gradient vector $ \nabla_v J $. |
462 |
\\ |
463 |
{\tt <file names>} refers to the list of files {\it .f} which are to be |
464 |
analyzed by TAMC. This list is generally smaller than the full list |
465 |
of code to be compiled. The files not contained are either |
466 |
above the top-level routine (some initializations), or are |
467 |
deliberately hidden from TAMC, either because hand-written |
468 |
adjoint routines exist, or the routines must not (or don't have to) |
469 |
be differentiated. For each routine which is part of the flow tree |
470 |
of the top-level routine, but deliberately hidden from TAMC |
471 |
(or for each package which contains such routines), |
472 |
a corresponding file {\it .flow} exists containing flow directives |
473 |
for TAMC. |
474 |
% |
475 |
\item {\tt -i4 -r4} \\ |
476 |
~ |
477 |
% |
478 |
\item {\tt -flow taf\_flow.log} \\ |
479 |
Will cause TAF to produce a flow listing file |
480 |
named {\it taf\_flow.log} in which |
481 |
the set of active and passive variables are identified |
482 |
for each subroutine. |
483 |
% |
484 |
\item {\tt -nonew\_arg} \\ |
485 |
The default in the order of the parameter list of |
486 |
adjoint routines has changed. |
487 |
Before TAF 1.3 the default was compatible with the |
488 |
TAMC-generated list. As of TAF 1.3 the order of adjoint |
489 |
routine parameter lists is no longer copatible with TAMC. |
490 |
To restore compatibility when using TAF 1.3 and higher, |
491 |
this argument is needed. |
492 |
It is currently crucial to use since all hand-written |
493 |
adjoint routines refer to the TAMC default. |
494 |
% |
495 |
\end{itemize} |
496 |
|
497 |
|
498 |
\subsubsection{The input parameter files} |
499 |
\label{www:tutorials} |
500 |
|
501 |
\paragraph{File {\it data}} |
502 |
|
503 |
\paragraph{File {\it data.cost}} |
504 |
|
505 |
\paragraph{File {\it data.ctrl}} |
506 |
|
507 |
\paragraph{File {\it data.gmredi}} |
508 |
|
509 |
\paragraph{File {\it data.grdchk}} |
510 |
|
511 |
\paragraph{File {\it data.optim}} |
512 |
|
513 |
\paragraph{File {\it data.pkg}} |
514 |
|
515 |
\paragraph{File {\it eedata}} |
516 |
|
517 |
\paragraph{File {\it topog.bin}} ~ \\ |
518 |
% |
519 |
Contains two-dimendional bathymetry information |
520 |
|
521 |
\paragraph{File {\it windx.bin, windy.bin, salt.bin, theta.bin, |
522 |
SSS.bin, SST.bin}} ~ \\ |
523 |
% |
524 |
These contain the initial values |
525 |
(salinity, temperature, {\it salt.bin, theta.bin}), |
526 |
surface boundary values (surface wind stresses, |
527 |
({\it windx.bin, windy.bin}), and surface restoring fields |
528 |
({\it SSS.bin, SST.bin}). |
529 |
|
530 |
\paragraph{File {\it pickup*}} ~ \\ |
531 |
% |
532 |
Contains model state after model spinup. |
533 |
|
534 |
\subsection{Compiling the model and its adjoint} |
535 |
\label{www:tutorials} |
536 |
|
537 |
The built process of the adjoint model is slightly more |
538 |
complex than that of compiling the forward code. |
539 |
The main reason is that the adjoint code generation requires |
540 |
a specific list of routines that are to be differentiated |
541 |
(as opposed to the automatic generation of a list of |
542 |
files to be compiled by genmake). |
543 |
This list excludes routines that don't have to be or must not be |
544 |
differentiated. For some of the latter routines flow directives |
545 |
may be necessary, a list of which has to be given as well. |
546 |
For this reason, a separate {\it makefile} is currently |
547 |
maintained in the directory {\tt adjoint/}. This |
548 |
makefile is responsible for the adjoint code generation. |
549 |
|
550 |
In the following we describe the build process step by step, |
551 |
assuming you are in the directory {\tt bin/}. |
552 |
A summary of steps to follow is given at the end. |
553 |
|
554 |
\paragraph{Adjoint code generation and compilation -- step by step} |
555 |
|
556 |
\begin{enumerate} |
557 |
% |
558 |
\item |
559 |
{\tt ln -s ../verification/???/code/.genmakerc .} \\ |
560 |
{\tt ln -s ../verification/???/code/*.[Fh] .} \\ |
561 |
Link your customized genmake options, header files, |
562 |
and modified code to the compile directory. |
563 |
% |
564 |
\item |
565 |
{\tt ../tools/genmake -makefile} \\ |
566 |
Generate your Makefile (cf. Section ???). |
567 |
% |
568 |
\item |
569 |
{\tt make depend} \\ |
570 |
Dependency analysis for the CPP pre-compiler (cf. Section ???). |
571 |
% |
572 |
\item |
573 |
{\tt cd ../adjoint} \\ |
574 |
{\tt make adtaf} or {\tt make adtamc} \\ |
575 |
Depending on whether you have TAF or TAMC at your disposal, |
576 |
you'll choose {\tt adtaf} or {\tt adtamc} as your |
577 |
make target for the {\it makefile} in the directory {\tt adjoint/}. |
578 |
Several things happen at this stage. |
579 |
% |
580 |
\begin{enumerate} |
581 |
% |
582 |
\item |
583 |
{\tt make adrestore, make ftlrestore} \\ |
584 |
The initial template files {\it adjoint\_model.F} |
585 |
and {\it tangentlinear\_model.F} in {\it pkg/autodiff} |
586 |
which are part |
587 |
of the compiling list created by {\it genmake} are restored. |
588 |
% |
589 |
\item {\tt make depend, make small\_f} \\ |
590 |
The {\tt bin/} directory is brought up to date, |
591 |
i.e. for recent changes in header or source code |
592 |
{\it .[Fh]}, corresponding {\it .f} routines are generated |
593 |
or re-generated. |
594 |
Note that here, only CPP precompiling is performed; |
595 |
no object code {\it .o} is generated as yet. |
596 |
Precompiling is necessary for TAMC to see the full code. |
597 |
% |
598 |
\item |
599 |
{\tt make allcode} \\ |
600 |
All Fortran routines {\tt *.f} in {\tt bin/} are |
601 |
concatenated into a single file called |
602 |
{\it tamc\_code.f}. |
603 |
% |
604 |
\item |
605 |
{\tt make admodeltaf/admodeltamc} \\ |
606 |
Adjoint code is generated by TAMC or TAF. |
607 |
The adjoint code is written to the file {\it tamc\_code\_ad.f}. |
608 |
It contains all adjoint routines of the forward routines |
609 |
concatenated in {\it tamc\_code.f}. |
610 |
For a given forward routines {\tt subroutine routinename} |
611 |
the adjoint routine is named {\tt adsubroutine routinename} |
612 |
by default (that default can be changed via the flag |
613 |
{\tt -admark <markname>}). |
614 |
Furthermore, it may contain modified code which |
615 |
incorporates the translation of adjoint store directives |
616 |
into specific Fortran code. |
617 |
For a given forward routines {\tt subroutine routinename} |
618 |
the modified routine is named {\tt mdsubroutine routinename}. |
619 |
TAMC or TAF info is written to file |
620 |
{\it tamc\_code.prot} or {\it taf.log}, respectively. |
621 |
% |
622 |
\item |
623 |
{\tt make adchange} \\ |
624 |
The multi-threading capability of MITgcm requires a slight |
625 |
change in the parameter list of some routines that are related to |
626 |
to active file handling. |
627 |
This post-processing invokes the sed script {\it adjoint\_ecco\_sed.com} |
628 |
to insert the threading counter {\bf myThId} into the parameter list |
629 |
of those subroutines. |
630 |
The resulting code is written to file {\it tamc\_code\_sed\_ad.f} |
631 |
and appended to the file {\it adjoint\_model.F}. |
632 |
This concludes the adjoint code generation. |
633 |
% |
634 |
\end{enumerate} |
635 |
% |
636 |
\item |
637 |
{\tt cd ../bin} \\ |
638 |
{\tt make} \\ |
639 |
The file {\it adjoint\_model.F} now contains the full adjoint code. |
640 |
All routines are now compiled. |
641 |
% |
642 |
\end{enumerate} |
643 |
|
644 |
N.B.: The targets {\tt make adtaf/adtamc} now comprise a |
645 |
series of targets that in previous versions had to be |
646 |
invoked separarely. This was probably preferable at a more |
647 |
experimental stage, but has now been dropped in favour of |
648 |
a more straightforward build process. |
649 |
|
650 |
|
651 |
\paragraph{Adjoint code generation and compilation -- summary} |
652 |
~ \\ |
653 |
|
654 |
{\small |
655 |
\[ |
656 |
\boxed{ |
657 |
\begin{split} |
658 |
~ & \mbox{\tt cd bin} \\ |
659 |
~ & \mbox{\tt ln -s ../verification/my\_experiment/code/.genmakerc .} \\ |
660 |
~ & \mbox{\tt ln -s ../verification/my\_experiment/code/*.[Fh] .} \\ |
661 |
~ & \mbox{\tt ../tools/genmake -makefile} \\ |
662 |
~ & \mbox{\tt make depend} \\ |
663 |
~ & \mbox{\tt cd ../adjoint} \\ |
664 |
~ & \mbox{\tt make adtaf <OR: make adtamc>} \\ |
665 |
~ & \hspace*{6ex} \mbox{\tt contains the targets:} \\ |
666 |
~ & \hspace*{6ex} \mbox{\tt adrestore small\_f allcode admodeltaf/admodeltamc adchange} \\ |
667 |
~ & \mbox{\tt cd ../bin} \\ |
668 |
~ & \mbox{\tt make} \\ |
669 |
\end{split} |
670 |
} |
671 |
\] |
672 |
} |