--- manual/s_phys_pkgs/text/packages.tex 2004/02/12 03:35:05 1.2 +++ manual/s_phys_pkgs/text/packages.tex 2004/02/12 16:40:28 1.3 @@ -1,4 +1,4 @@ -% $Header: /home/ubuntu/mnt/e9_copy/manual/s_phys_pkgs/text/packages.tex,v 1.2 2004/02/12 03:35:05 edhill Exp $ +% $Header: /home/ubuntu/mnt/e9_copy/manual/s_phys_pkgs/text/packages.tex,v 1.3 2004/02/12 16:40:28 edhill Exp $ % $Name: $ \section{Using MITgcm Packages} @@ -88,7 +88,7 @@ the current packages (FORTRAN77) are \textbf{not} based upon any concept of libraries. -\subsubsection{File ``Hiding'' Rules} +\subsubsection{File Inclusion Rules} Instead, packages should be viewed only as directories containing ``sets of source files'' that are built using some simple mechanisms @@ -111,12 +111,14 @@ previously encountered) then the file within the newer (more recently visited) package will superseed (or ``hide'') any previous file(s) with the same name. - + \item Packages are visited (and thus files discovered) {\it in the order that the packages are enabled} within \texttt{genmake2}. Thus, the files in \texttt{PackB} may superseed the files in - \texttt{PackA} if \texttt{PackA} is enabled before - \texttt{PackB}. Thus, package ordering can be significant! + \texttt{PackA} if \texttt{PackA} is enabled before \texttt{PackB}. + Thus, package ordering can be significant! For this reason, + \texttt{genmake2} honors the order in which packages are + specified. \end{enumerate} \end{enumerate} @@ -157,20 +159,82 @@ \end{verbatim} which is included from the file \filelink{calc\_diffusivity.F}{model-src-calc_diffusivity.F} +and shows how both the compile--time \texttt{ALLOW\_GMREDI} flag and the +run--time \texttt{useGMRedi} are nested. -There are some benefits to using this technique. The first is that -code snippets or subroutines associated with packages can be placed or -called from almost anywhere else within the code. The second benefit -is related to the memory footprint and performance. Since unused code -can be removed, there is no performance penalty due to unnecessary -memory allocation or unused function calls. The major problems with -this approach are difficult-to-read and difficult-to-test code caused -by the numerous CPP statements. Developers should exerecise some -discipline and avoid ``smearing'' implementation details across -numerous files in a haphazard fashion. - +There are some benefits to using the technique described here. The +first is that code snippets or subroutines associated with packages +can be placed or called from almost anywhere else within the code. +The second benefit is related to memory footprint and performance. +Since unused code can be removed, there is no performance penalty due +to unnecessary memory allocation, unused function calls, or extra +run-time \texttt{IF (...)} conditions. The major problems with this +approach are the potentially difficult-to-read and difficult-to-debug +code caused by an overuse of CPP statements. So while it can be done, +developers should exerecise some discipline and avoid unnecesarily +``smearing'' their package implementation details across numerous +files. + + +\subsubsection{Package Startup or Boot Sequence} + +Calls to package routines within the core code timestepping loop can +vary. However, all packages should follow a required "boot" sequence +outlined here: +{\footnotesize +\begin{verbatim} + 1. S/R PACKAGES_BOOT() + : + CALL OPEN_COPY_DATA_FILE( 'data.pkg', 'PACKAGES_BOOT', ... ) + + + 2. S/R PACKAGES_READPARMS() + : + #ifdef ALLOW_${PKG} + if ( use${Pkg} ) + & CALL ${PKG}_READPARMS( retCode ) + #endif + + 3. S/R PACKAGES_INIT_FIXED() + : + #ifdef ALLOW_${PKG} + if ( use${Pkg} ) + & CALL ${PKG}_INIT_FIXED( retCode ) + #endif + + 4. S/R PACKAGES_CHECK() + : + #ifdef ALLOW_${PKG} + if ( use${Pkg} ) + & CALL ${PKG}_CHECK( retCode ) + #else + if ( use${Pkg} ) + & CALL PACKAGES_CHECK_ERROR('${PKG}') + #endif + + 5. S/R PACKAGES_INIT_VARIABLES() + : + #ifdef ALLOW_${PKG} + if ( use${Pkg} ) + & CALL ${PKG}_INIT_VARIA( ) + #endif + + 6. S/R DO_THE_MODEL_IO + + #ifdef ALLOW_${PKG} + if ( use${Pkg} ) + & CALL ${PKG}_DIAGS( ) + #endif + + 7. S/R PACKAGES_WRITE_PICKUP() + + #ifdef ALLOW_${PKG} + if ( use${Pkg} ) + & CALL ${PKG}_WRITE_PICKUP( ) + #endif\end{verbatim} +} -\subsection{Interfaces} +\subsubsection{Package Startup or Boot Sequence}