1 |
Version: 29-Aug-2000 |
2 |
Updated: 15-Nov-2000 |
3 |
|
4 |
MITgcmUV Packages |
5 |
================= |
6 |
|
7 |
Optional parts of code are separated from |
8 |
the MITgcmUV core driver code and organised into |
9 |
packages. The packaging structure provides a mechanism for |
10 |
maintaining suites of code, specific to particular |
11 |
classes of problem, in a way that is cleanly |
12 |
separated from the generic fluid dynamical engine. |
13 |
|
14 |
The MITgcmUV packaging structure is describe |
15 |
below using generic package names ${pkg}. |
16 |
A concrete examples of a package is the code |
17 |
for implementing GM/Redi mixing. This code uses |
18 |
the package name |
19 |
* ${PKG} = GMREDI |
20 |
* ${pkg} = gmredi |
21 |
* ${Pkg} = gmRedi |
22 |
|
23 |
Package states |
24 |
============== |
25 |
|
26 |
Packages can be any one of four states, included, |
27 |
excluded, enabled, disabled as follows: |
28 |
|
29 |
included(excluded) compile time state which |
30 |
includes(excludes) package |
31 |
code and routine calls from |
32 |
compilation/linking etc... |
33 |
|
34 |
enabled(disabled) run-time state which |
35 |
enables(disables) package code |
36 |
execution. |
37 |
|
38 |
Every call to a ${pkg}_... routine from outside the package |
39 |
should be placed within both a |
40 |
#ifdef ALLOW_${PKG} ... block and a |
41 |
if ( use${Pkg} ) ... then block. |
42 |
Package states are generally not expected to change during |
43 |
a model run. |
44 |
|
45 |
Package structure |
46 |
================= |
47 |
|
48 |
o Each package gets its runtime configuration |
49 |
parameters from a file named "data.${pkg}" |
50 |
Package runtime config. options are imported |
51 |
into a common block held in a header file |
52 |
called "${PKG}.h". |
53 |
|
54 |
o The core driver part of the model can check |
55 |
for runtime enabling or disabling of individual packages |
56 |
through logical flags use${Pkg}. |
57 |
The information is loaded from a |
58 |
global package setup file called "data.pkg". |
59 |
The use${Pkg} flags are not used within |
60 |
individual packages. |
61 |
|
62 |
o Included in "${PKG}.h" is a logical flag |
63 |
called ${Pkg}IsOn. The "${PKG}.h" header file can be imported |
64 |
by other packages to check dependencies and requirements |
65 |
from other packages ( see "Package Boot Sequence" section). |
66 |
NOTE: This procedure is not presently implemented, |
67 |
----- neither for kpp nor for gmRedi. |
68 |
|
69 |
CPP Flags |
70 |
========= |
71 |
|
72 |
1. Within the core driver code flags of the form |
73 |
ALLOW_${PKG} are used to include or exclude |
74 |
whole packages. The ALLOW_${PKG} flags are included |
75 |
from a PKG_CPP_OPTIONS block which is currently |
76 |
held in-line in the CPP_OPTIONS.h header file. |
77 |
e.g. |
78 |
|
79 |
Core model code ..... |
80 |
|
81 |
#include "CPP_OPTIONS.h" |
82 |
: |
83 |
: |
84 |
: |
85 |
|
86 |
#ifdef ALLOW_${PKG} |
87 |
if ( use${Pkg} ) CALL ${PKG}_DO_SOMETHING(...) |
88 |
#endif |
89 |
|
90 |
2. Within an individual package a header file, |
91 |
"${PKG}_OPTIONS.h", is used to set CPP flags |
92 |
specific to that package. It is not recommended |
93 |
to include this file in "CPP_OPTIONS.h". |
94 |
|
95 |
|
96 |
Package Boot Sequence |
97 |
===================== |
98 |
|
99 |
Calls to package routines within the core code timestepping |
100 |
loop can vary. However, all packages follow a required |
101 |
"boot" sequence outlined here: |
102 |
|
103 |
1. S/R PACKAGES_BOOT() |
104 |
: |
105 |
CALL OPEN_COPY_DATA_FILE( 'data.pkg', 'PACKAGES_BOOT', ... ) |
106 |
|
107 |
|
108 |
2. S/R PACKAGES_READPARMS() |
109 |
: |
110 |
#ifdef ALLOW_${PKG} |
111 |
if ( use${Pkg} ) |
112 |
& CALL ${PKG}_READPARMS( retCode ) |
113 |
#endif |
114 |
|
115 |
2. S/R PACKAGES_CHECK() |
116 |
: |
117 |
#ifdef ALLOW_${PKG} |
118 |
if ( use${Pkg} ) |
119 |
& CALL ${PKG}_CHECK( retCode ) |
120 |
#else |
121 |
if ( use${Pkg} ) |
122 |
& CALL PACKAGES_CHECK_ERROR('${PKG}') |
123 |
#endif |
124 |
|
125 |
3. S/R PACKAGES_INIT() |
126 |
: |
127 |
#ifdef ALLOW_${PKG} |
128 |
if ( use${Pkg} ) |
129 |
& CALL ${PKG}_INIT( retCode ) |
130 |
#endif |
131 |
|
132 |
|
133 |
Description |
134 |
=========== |
135 |
|
136 |
- ${PKG}_READPARMS() |
137 |
is responsible for reading |
138 |
in the package parameters file data.${pkg}, and storing |
139 |
the package parameters in "${PKG}.h". |
140 |
-> called in INITIALISE_FIXED |
141 |
|
142 |
- ${PKG}_CHECK() |
143 |
is responsible for validating |
144 |
basic package setup and inter-package dependencies. |
145 |
${PKG}_CHECK can import other package parameters it may |
146 |
need to check. This is done through header files "${PKG}.h". |
147 |
It is assumed that parameters owned by other packages |
148 |
will not be reset during ${PKG}_CHECK(). |
149 |
-> called in INITIALISE_FIXED |
150 |
|
151 |
- ${PKG}_INIT() |
152 |
is responsible for completing the |
153 |
internal setup of a package. This routine is called after |
154 |
the core model state has been completely initialised |
155 |
but before the core model timestepping starts. |
156 |
-> called in INITIALISE_VARIA |
157 |
|
158 |
Summary |
159 |
======= |
160 |
|
161 |
- CPP options: |
162 |
----------------------- |
163 |
* ALLOW_${PKG} include/exclude package for compilation |
164 |
|
165 |
- FORTRAN logical: |
166 |
----------------------- |
167 |
* use${Pkg} enable package for execution at runtime |
168 |
-> declared in PARAMS.h |
169 |
* ${Pkg}IsOn for package cross-dependency check |
170 |
-> declared in ${PKG}.h |
171 |
N.B.: Not presently used! |
172 |
|
173 |
- header files |
174 |
----------------------- |
175 |
* ${PKG}_OPTIONS.h has further package-specific CPP options |
176 |
* ${PKG}.h package-specific common block variables, fields |
177 |
|
178 |
- FORTRAN source files |
179 |
----------------------- |
180 |
* ${pkg}_readparms.F reads parameters from file data.${pkg} |
181 |
* ${pkg}_check.F checks package dependencies and consistencies |
182 |
* ${pkg}_init.F initialises package-related fields |
183 |
* ${pkg}_... .F package source code |
184 |
|
185 |
- parameter file |
186 |
----------------------- |
187 |
* data.${pkg} parameter file |
188 |
|