\newpage
%

\chapter{Compiling, running and debugging}
\label{sec_compilationrunning}

\section{Compiling OASIS3-MCT}
\label{subsec_compile}

Compiling OASIS3-MCT libraries can be done in directory {\tt
  oasis3-MCT/util/make\_dir} with Makefile \\ {\tt TopMakefileOasis3}
which must be completed with a header file {\tt make.{\it
    your\_platform}} specific to the compiling platform used and
specified in {\tt oasis3-MCT/util/make\_dir/make.inc}.  One of the
header files distributed with the release can by used as a template.
The root of the OASIS3-MCT tree can be anywhere and must be set in the
variable {\tt COUPLE} in the {\tt make.{\it your\_platform}} file.

The following commands are available:

\begin{itemize}
\item {\tt make -f TopMakefileOasis3} or {\tt make oasis3\_psmile -f
    TopMakefileOasis3} (for backward compatibility):

  compiles all OASIS3-MCT libraries {\it mct}, {\it scrip} and {\it
    psmile};

\item {\tt make realclean -f TopMakefileOasis3}:

  removes all OASIS3-MCT compiled sources and librairies.

\end{itemize}

Log and error messages from compilation are saved in {\tt /util/make\_dir} in the files
{\tt COMP.log} and {\tt COMP.err} .

During compilation, a new compiling directory, defined by variable
{\tt ARCHDIR} is created.  After successful compilation, resulting
libraries are found in the compiling directory in {\tt /lib} and
object and module files in {\tt /build}. 

If module {\tt mod\_oasis} is used in the
models, it is enough to include the path of the psmile objects and
modules ({\tt \$ARCHDIR/build/lib/psmile.MPI1}) for the compilation and to use the psmile library {\tt \$ARCHDIR/lib/libpsmile.MPI1.a} when
linking. If module {\tt mod\_prism} is used in the models, it is necessary to
include the path of the psmile and of the mct objects and modules for
the compilation (i.e. {\tt \$ARCHDIR/build/lib/psmile.MPI1} and {\tt /mct} and to use both the psmile and mct libraries {\tt \$ARCHDIR/lib/libpsmile.MPI1.a} and {\tt libmct.a} and {\tt libmpeu.a} when linking.

Exchange of coupling fields in single and double precision is now supported directly through the interface 
(see section \ref{subsubsec_Declaration}), even if all real variables are now treated in double precision internally.
For double precision coupling field, there is no need anymore to promote REAL variables to double precision at compilation.

\section{CPP keys}
\label{subsec_cpp}

The following CPP keys are coded in OASIS3-MCT and can be specified in
{\tt CPPDEF} in {\tt make.{\it your\_platform}} file.

\begin{itemize}

\item {\tt TREAT\_OVERLAY}: To ensure, in {\tt SCRIPR/CONSERV}
  remapping (see section \ref{subsec_interp}), that if two cells of
  the source grid overlay, at least the one with the greater numerical
  index is masked (they also can be both masked); this is mandatory
  for this remapping. For example, if the grid line with {\it i=1} overlaps
  the grid line with {\it i=imax}, it is the latter that must be masked;
  when this is not the case with the mask defined in {\it masks.nc},
  this CPP key forces these rules to be respected.

\item {\tt balance}: Add a MPI\_Wtime() function before and after
  mct\_isend (MPI put) and mct\_recv (MPI get) to calculate the time
  of the send and receive of a coupling field. This option can be used
  to produce timestamps in OASIS3-MCT debug files. During a post-processing
  phase, this information can be used to perform an analysis of the
  coupled components load (un)balance; specific tools have been
  developed to do this and will be released with a further version of
  OASIS3-MCT. {\bf This option is temporarily not recommended as it was observed that
  it was increasing the simulation time of coupled models on
  the PRACE computer MareNostrum.}

\end{itemize}

\section{Running OASIS3-MCT}
\label{subsec_running}

Examples of running environement are provided with the sources. For
more details, see the instructions on OASIS web site at
{\tt https://verc.enes.org/oasis/oasis-dedicated-user-support-1/} {\tt user-toys/tutorial-and-test\_interpolation-of-oasis3-mct-1}.
.

\subsection{The tutorial toy model}
\label{subsec_tutorial}

A practical example on how to run OASIS3-MCT and running it in a
coupled system is provided in {\tt oasis3-mct/examples/tutorial}. See also the document {\tt tutorial\_oasis3-mct.pdf} there in for
more details,

\subsection{The test\_interpolation environment}
\label{subsec_testinterpolation}

This environment available with the sources in {\tt
  oasis3-mct/examples/test\_interpolation} allows the user to test the
quality of the interpolations and transformations between his source
and target grids by calculating the error of interpolation on the
target grid. For more details, see also the document {\tt test\_interpolation\_oasis3-mct.pdf} there in.

\section{Debugging}
\label{subsec_debug}

\subsection{Debug files}
If you experience problems while running your coupled model with
OASIS3-MCT, you can obtain more information on what is happening by
increasing the {\tt \$NLOGPRT} value in your {\it namcouple} (see also section
\ref{subsec_namcouplefirst}).

Different outputs are written depending on {\tt \$NLOGPRT} value:
\begin{itemize}
\item {0} : one file debug.root.xx is open by the master process of
  each model and one file debug\_notroot.xx is open for all the other
  processes of each model to write only error information if an error
  occurs.
\item {1} : one file debug.root.xx is open by the master process of
  each model to write information equivalent to level 10 (see below);
  one file debug\_notroot.xx is open for all the other processes of
  each model to write only error information if an error occurs.
\item {2} : one file debug.xx.xxxxxx is open by each process of each
  model to write normal production diagnostics.
\item {5} : as for 2 with in addition some initial debug info.
\item {10} : as for 5 with in addition the routine calling tree.
\item {12} : as for 10 with in addition some routine calling notes.
\item {15} : as for 12 with even more debug diagnostics.
\item {20} : as for 15 with in addition some extra runtime analysis.
\item {30} : full debug information.
\end{itemize}

\subsection{Time statistics files}
\label{timestat}

The variable TIMER\_Debug, defined in the {\it namcouple} (second
number on the line below \$NLOGPRT keyword), is used to obtain time
statistics over all the processors for each routine.

Different output are written (in files named {\tt *.timers\_xxxx})
depending on TIMER\_Debug value :

\begin{itemize}
\item {TIMER\_Debug=0} : nothing is calculated, nothing is written.
\item {TIMER\_Debug=1} : the times are calculated and written in a
  single file by the process 0 as well as the min and the max times
  over all the processes.
\item {TIMER\_Debug=2} : the times are calculated and each process
  writes its own file ; process 0 also writes the min and the max
  times over all the processes in its file.
\item {TIMER\_Debug=3} : the times are calculated and each process
  writes its own file ; process 0 also writes in its file the min
  and the max times over all processes and also writes in its file
  all the results for each process.
\end{itemize}

The time given for each timer is calculated by the difference between
calls to {\tt oasis\_timer\_start()} and {\tt oasis\_timer\_stop()}
and is the accumulated time over the entire run. Here is an overview
of the meaning of the different timers as implemented by default.

\begin{itemize}
\item {'total after init'} : total time of the simulation, implemented
  in {\tt mod\_oasis\_method}, i.e. between the end of {\tt
    oasis\_init\_comp} and the call to {\tt mpi\_barrier} and {\tt
    mpi\_finalize} in routine {\tt oasis\_terminate}.
\item {'map definition'} : time spent in {\tt mct\_gsmap\_init} in
  routine {\tt oasis\_def\_partition}; this routine defines the
  patterns of communication between the source and target processes.
\item {'cpl\_setup'} :time spent in {\tt oasis\_coupler\_setup}, which
  sets up additional coupling aspects related to {\tt
    oasis\_method\_enddef}.
\item {'cpl\_smatrd'} : time spent in {\tt
    oasis\_coupler\_smatreaddnc} in {\tt mod\_oasis\_coupler} (routine
  {\tt oasis\_coupler\_setup}); this routine performs a distributed
  read of a NetCDF SCRIP file and returns weights in a distributed
  SparseMatrix, and calls {\tt mct\_sMatP\_Init} which initialises the
  sparse matrix vector multiplication.
\item {'oasis\_advance\_init()'} : time spent in {\tt
    oasis\_advance\_init}, which handles reading of initial coupling
  restart and communication of data for fields with positive lags.
\item {'grcv\_00x'} : time spent in the reception of field x in {\tt
    mct\_recv} (including communication and possible waiting time
  linked to unbalance of components).
\item {'wout\_00x'} : time spent in the I/O for field x in routine
  {\tt oasis\_advance\_run}.
\item {'gcpy\_00x'} : time spent in routine {\tt oasis\_advance\_run}
  in copying the field x just received in a local array.
\item {'pcpy\_00x'} : time spent in routine {\tt oasis\_advance\_run}
  in copying the local field x in the array to send (i.e. with local
  transformation besides division for averaging).
\item {'pavg\_00x'} : time spent in routine {\tt oasis\_advance\_run}
  to calculate the average of field x (if done).
\item {'pmap\_00x'/'gmap\_00x'} : time spent in routine {\tt
    oasis\_advance\_run} for the matrix vector multiplication for
  field x on the source/target processes.
\item {'psnd\_00x'} : time spent in routine {\tt oasis\_advance\_run}
  for sending field x (i.e. including call to {\tt mct\_waitsend} and
  {\tt mct\_isend}).
\end{itemize}

