/[MITgcm]/manual/s_phys_pkgs/text/exch2.tex
ViewVC logotype

Diff of /manual/s_phys_pkgs/text/exch2.tex

Parent Directory Parent Directory | Revision Log Revision Log | View Revision Graph Revision Graph | View Patch Patch

revision 1.9 by afe, Fri Mar 12 20:58:19 2004 UTC revision 1.25 by edhill, Tue Aug 9 21:52:09 2005 UTC
# Line 10  Line 10 
10  %%    o automatically inserted at \section{Reference}  %%    o automatically inserted at \section{Reference}
11    
12    
13  \section{Extended Cubed Sphere Exchange}  \subsection{exch2: Extended Cubed Sphere \mbox{Topology}}
14  \label{sec:exch2}  \label{sec:exch2}
15    
16    
17  \subsection{Introduction}  \subsubsection{Introduction}
18    
19  The \texttt{exch2} package is an extension to the original cubed  The \texttt{exch2} package extends the original cubed sphere topology
20  sphere topological configuration that allows more flexible domain  configuration to allow more flexible domain decomposition and
21  decomposition and parallelization.  Cube faces (also called  parallelization.  Cube faces (also called subdomains) may be divided
22  subdomains) may be divided into any number of tiles that divide evenly  into any number of tiles that divide evenly into the grid point
23  into the grid point dimensions of the subdomain.  Furthermore, the  dimensions of the subdomain.  Furthermore, the tiles can run on
24  individual tiles may be run on separate processors in different  separate processors individually or in groups, which provides for
25  combinations, and whether exchanges between particular tiles occur  manual compile-time load balancing across a relatively arbitrary
26  between different processors is determined at runtime.  This  number of processors.
 flexibility provides for manual load balancing across a relatively  
 arbitrary number of processors.  
27    
28  The exchange parameters are declared in  The exchange parameters are declared in
29  \filelink{pkg/exch2/W2\_EXCH2\_TOPOLOGY.h}{pkg-exch2-W2_EXCH2_TOPOLOGY.h}  \filelink{pkg/exch2/W2\_EXCH2\_TOPOLOGY.h}{pkg-exch2-W2_EXCH2_TOPOLOGY.h}
30  and assigned in  and assigned in
31  \filelink{pkg/exch2/w2\_e2setup.F}{pkg-exch2-w2_e2setup.F}. The  \filelink{pkg/exch2/w2\_e2setup.F}{pkg-exch2-w2_e2setup.F}. The
32  validity of the cube topology depends on the \texttt{SIZE.h} file as  validity of the cube topology depends on the \file{SIZE.h} file as
33  detailed below.  Both files are generated by Matlab scripts in ??  detailed below.  The default files provided in the release configure a
34  check these in already! and should not be edited.  The default files  cubed sphere topology of six tiles, one per subdomain, each with
35  provided in the release configure a cubed sphere arrangement of six  32$\times$32 grid points, with all tiles running on a single processor.  Both
36  tiles, one per subdomain, each with 32$\times$32 grid points, all  files are generated by Matlab scripts in
37  running on a single processor.  Pregenerated examples of these files  \file{utils/exch2/matlab-topology-generator}; see Section
38  with alternate topologies are provided in ??.  \ref{sec:topogen} \sectiontitle{Generating Topology Files for exch2}
39    for details on creating alternate topologies.  Pregenerated examples
40  \subsection{Invoking exch2}  of these files with alternate topologies are provided under
41    \file{utils/exch2/code-mods} along with the appropriate \file{SIZE.h}
42  To use exch2 with the cubed sphere, the following conditions must be met:  file for single-processor execution.
43    
44  - the exch2 package is included when \texttt{genmake2} is run.  The  \subsubsection{Invoking exch2}
45    easiest way to do this is to add the line \texttt{exch2} to the  
46    \texttt{profile.conf} file -- see Section \ref{sect:buildingCode}  To use exch2 with the cubed sphere, the following conditions must be
47    for general details. \\  met:
48    
49  - an example of \texttt{W2\_EXCH2\_TOPOLOGY.h} and  \begin{itemize}
50    \texttt{w2\_e2setup.F} must reside in a directory containing code  \item The exch2 package is included when \file{genmake2} is run.  The
51    linked when \texttt{genmake2} runs.  The safest place to put these    easiest way to do this is to add the line \code{exch2} to the
52    is the directory indicated in the \texttt{-mods=DIR} command line    \file{packages.conf} file -- see Section \ref{sect:buildingCode}
53    modifier (typically \texttt{../code}), or the build directory.  The    \sectiontitle{Building the code} for general
54    default versions of these files reside in \texttt{pkg/exch2}, but    details.
55    they should be left untouched to avoid breaking configurations other  
56    than the one you intend to modify.\\  \item An example of \file{W2\_EXCH2\_TOPOLOGY.h} and
57      \file{w2\_e2setup.F} must reside in a directory containing files
58  - files containing grid parameters, named    symbolically linked by the \file{genmake2} script.  The safest place
59    \texttt{tile}xxx\texttt{.mitgrid} where xxx is \texttt{001} through    to put these is the directory indicated in the \code{-mods=DIR}
60    \texttt{006}, must be in the working directory when the MITgcm    command line modifier (typically \file{../code}), or the build
61    executable is run.  These files are provided in the example    directory.  The default versions of these files reside in
62    experiments for cubed sphere configurations with 32$\times$32 cube    \file{pkg/exch2} and are linked automatically if no other versions
63    sides and are non-trivial to generate -- please contact MITgcm    exist elsewhere in the build path, but they should be left untouched
64    support if you want to generate files for other configurations.    to avoid breaking configurations other than the one you intend to
65    This is lame. ?? \\    modify.
66    
67    \item Files containing grid parameters, named \file{tile00$n$.mitgrid}
68      where $n$=\code{(1:6)} (one per subdomain), must be in the working
69      directory when the MITgcm executable is run.  These files are
70      provided in the example experiments for cubed sphere configurations
71      with 32$\times$32 cube sides -- please contact MITgcm support if you
72      want to generate files for other configurations.
73    
74    \item As always when compiling MITgcm, the file \file{SIZE.h} must be
75      placed where \file{genmake2} will find it.  In particular for exch2,
76      the domain decomposition specified in \file{SIZE.h} must correspond
77      with the particular configuration's topology specified in
78      \file{W2\_EXCH2\_TOPOLOGY.h} and \file{w2\_e2setup.F}.  Domain
79      decomposition issues particular to exch2 are addressed in Section
80      \ref{sec:topogen} \sectiontitle{Generating Topology Files for exch2}
81      and \ref{sec:exch2mpi} \sectiontitle{exch2, SIZE.h, and
82        Multiprocessing}; a more general background on the subject
83      relevant to MITgcm is presented in Section
84      \ref{sect:specifying_a_decomposition}
85      \sectiontitle{Specifying a decomposition}.
86    \end{itemize}
87    
88  As of the time of writing the following examples use exch2 and may be  At the time of this writing the following examples use exch2 and may
89  used for guidance:  be used for guidance:
90    
91  \begin{verbatim}  \begin{verbatim}
92  verification/adjust_nlfs.cs-32x32x1  verification/adjust_nlfs.cs-32x32x1
# Line 80  verification/hs94.cs-32x32x5 Line 99  verification/hs94.cs-32x32x5
99    
100    
101    
102  \subsection{Generating Topology Files}  \subsubsection{Generating Topology Files for exch2}
103    \label{sec:topogen}
104    
105  \subsection{Key Variables}  Alternate cubed sphere topologies may be created using the Matlab
106    scripts in \file{utils/exch2/matlab-topology-generator}. Running the
107    m-file
108    \filelink{driver.m}{utils-exch2-matlab-topology-generator_driver.m}
109    from the Matlab prompt (there are no parameters to pass) generates
110    exch2 topology files \file{W2\_EXCH2\_TOPOLOGY.h} and
111    \file{w2\_e2setup.F} in the working directory and displays a figure of
112    the topology via Matlab -- figures \ref{fig:6tile}, \ref{fig:12tile},
113    and \ref{fig:24tile} are examples of the generated diagrams.  The other
114    m-files in the directory are
115    subroutines called from \file{driver.m} and should not be run ``bare'' except
116    for development purposes. \\
117    
118    The parameters that determine the dimensions and topology of the
119    generated configuration are \code{nr}, \code{nb}, \code{ng},
120    \code{tnx} and \code{tny}, and all are assigned early in the script. \\
121    
122    The first three determine the height and width of the subdomains and
123    hence the size of the overall domain.  Each one determines the number
124    of grid points, and therefore the resolution, along the subdomain
125    sides in a ``great circle'' around each the three spatial axes of the cube.  At the time
126    of this writing MITgcm requires these three parameters to be equal,
127    but they provide for future releases  to accomodate different
128    resolutions around the axes to allow subdomains with differing resolutions.\\
129    
130    The parameters \code{tnx} and \code{tny} determine the width and height of
131    the tiles into which the subdomains are decomposed, and must evenly
132    divide the integer assigned to \code{nr}, \code{nb} and \code{ng}.
133    The result is a rectangular tiling of the subdomain.  Figure
134    \ref{fig:24tile} shows one possible topology for a twenty-four-tile
135    cube, and figure \ref{fig:12tile} shows one for twelve tiles. \\
136    
137    \begin{figure}
138    \begin{center}
139     \resizebox{4in}{!}{
140      \includegraphics{part6/s24t_16x16.ps}
141     }
142    \end{center}
143    
144    \caption{Plot of a cubed sphere topology with a 32$\times$192 domain
145    divided into six 32$\times$32 subdomains, each of which is divided
146    into four tiles of width \code{tnx=16} and height \code{tny=16} for a
147    total of twenty-four tiles.  The colored borders of the subdomains
148    represent the parameters \code{nr} (red), \code{nb} (blue), and
149    \code{ng} (green).  } \label{fig:24tile}
150    \end{figure}
151    
152    \begin{figure}
153    \begin{center}
154     \resizebox{4in}{!}{
155      \includegraphics{part6/s12t_16x32.ps}
156     }
157    \end{center}
158    \caption{Plot of a cubed sphere topology with a 32$\times$192 domain
159    divided into six 32$\times$32 subdomains of two tiles each
160     (\code{tnx=16, tny=32}).
161    } \label{fig:12tile}
162    \end{figure}
163    
164    \begin{figure}
165    \begin{center}
166     \resizebox{4in}{!}{
167      \includegraphics{part6/s6t_32x32.ps}
168     }
169    \end{center}
170    \caption{Plot of a cubed sphere topology with a 32$\times$192 domain
171    divided into six 32$\times$32 subdomains with one tile each
172    (\code{tnx=32, tny=32}).  This is the default configuration.
173      }
174    \label{fig:6tile}
175    \end{figure}
176    
177    
178    Tiles can be selected from the topology to be omitted from being
179    allocated memory and processors.  This tuning is useful in ocean
180    modeling for omitting tiles that fall entirely on land.  The tiles
181    omitted are specified in the file
182    \filelink{blanklist.txt}{utils-exch2-matlab-topology-generator_blanklist.txt}
183    by their tile number in the topology, separated by a newline. \\
184    
185    
186    
187    
188    \subsubsection{exch2, SIZE.h, and Multiprocessing}
189    \label{sec:exch2mpi}
190    
191    Once the topology configuration files are created, the Fortran
192    \code{PARAMETER}s in \file{SIZE.h} must be configured to match.
193    Section \ref{sect:specifying_a_decomposition} \sectiontitle{Specifying
194      a decomposition} provides a general description of domain
195    decomposition within MITgcm and its relation to \file{SIZE.h}. The
196    current section specifies constraints that the exch2 package imposes
197    and describes how to enable parallel execution with MPI.
198    
199    As in the general case, the parameters \varlink{sNx}{sNx} and
200    \varlink{sNy}{sNy} define the size of the individual tiles, and so
201    must be assigned the same respective values as \code{tnx} and
202    \code{tny} in \file{driver.m}.
203    
204    The halo width parameters \varlink{OLx}{OLx} and \varlink{OLy}{OLy}
205    have no special bearing on exch2 and may be assigned as in the general
206    case. The same holds for \varlink{Nr}{Nr}, the number of vertical
207    levels in the model.
208    
209    The parameters \varlink{nSx}{nSx}, \varlink{nSy}{nSy},
210    \varlink{nPx}{nPx}, and \varlink{nPy}{nPy} relate to the number of
211    tiles and how they are distributed on processors.  When using exch2,
212    the tiles are stored in the $x$ dimension, and so
213    \code{\varlink{nSy}{nSy}=1} in all cases.  Since the tiles as
214    configured by exch2 cannot be split up accross processors without
215    regenerating the topology, \code{\varlink{nPy}{nPy}=1} as well.
216    
217    The number of tiles MITgcm allocates and how they are distributed
218    between processors depends on \varlink{nPx}{nPx} and
219    \varlink{nSx}{nSx}.  \varlink{nSx}{nSx} is the number of tiles per
220    processor and \varlink{nPx}{nPx} is the number of processors.  The
221    total number of tiles in the topology minus those listed in
222    \file{blanklist.txt} must equal \code{nSx*nPx}.  Note that in order to
223    obtain maximum usage from a given number of processors in some cases,
224    this restriction might entail sharing a processor with a tile that
225    would otherwise be excluded because it is topographically outside of
226    the domain and therefore in \file{blanklist.txt}.  For example,
227    suppose you have five processors and a domain decomposition of
228    thirty-six tiles that allows you to exclude seven tiles.  To evenly
229    distribute the remaining twenty-nine tiles among five processors, you
230    would have to run one ``dummy'' tile to make an even six tiles per
231    processor.  Such dummy tiles are \emph{not} listed in
232    \file{blanklist.txt}.
233    
234    The following is an example of \file{SIZE.h} for the twelve-tile
235    configuration illustrated in figure \ref{fig:12tile} running on one
236    processor:
237    
238    \begin{verbatim}
239          PARAMETER (
240         &           sNx =  16,
241         &           sNy =  32,
242         &           OLx =   2,
243         &           OLy =   2,
244         &           nSx =  12,
245         &           nSy =   1,
246         &           nPx =   1,
247         &           nPy =   1,
248         &           Nx  = sNx*nSx*nPx,
249         &           Ny  = sNy*nSy*nPy,
250         &           Nr  =   5)
251    \end{verbatim}
252    
253    The following is an example for the twenty-four-tile topology in
254    figure \ref{fig:24tile} running on six processors:
255    
256    \begin{verbatim}
257          PARAMETER (
258         &           sNx =  16,
259         &           sNy =  16,
260         &           OLx =   2,
261         &           OLy =   2,
262         &           nSx =   4,
263         &           nSy =   1,
264         &           nPx =   6,
265         &           nPy =   1,
266         &           Nx  = sNx*nSx*nPx,
267         &           Ny  = sNy*nSy*nPy,
268         &           Nr  =   5)
269    \end{verbatim}
270    
271    
272    \subsubsection{Key Variables}
273    
274  The descriptions of the variables are divided up into scalars,  The descriptions of the variables are divided up into scalars,
275  one-dimensional arrays indexed to the tile number, and two and three  one-dimensional arrays indexed to the tile number, and two and
276  dimensional arrays indexed to tile number and neighboring tile.  This  three-dimensional arrays indexed to tile number and neighboring tile.
277  division actually reflects the functionality of these variables: the  This division reflects the functionality of these variables: The
278  scalars are common to every part of the topology, the tile-indexed  scalars are common to every part of the topology, the tile-indexed
279  arrays to individual tiles, and the arrays indexed to tile and  arrays to individual tiles, and the arrays indexed by tile and
280  neighbor to relationships between tiles and their neighbors.  neighbor to relationships between tiles and their neighbors. \\
281    
282  \subsubsection{Scalars}  Scalars:
283    
284  The number of tiles in a particular topology is set with the parameter  The number of tiles in a particular topology is set with the parameter
285  \texttt{NTILES}, and the maximum number of neighbors of any tiles by  \code{NTILES}, and the maximum number of neighbors of any tiles by
286  \texttt{MAX\_NEIGHBOURS}.  These parameters are used for defining the  \code{MAX\_NEIGHBOURS}.  These parameters are used for defining the
287  size of the various one and two dimensional arrays that store tile  size of the various one and two dimensional arrays that store tile
288  parameters indexed to the tile number.\\  parameters indexed to the tile number and are assigned in the files
289    generated by \file{driver.m}.\\
290    
291  The scalar parameters \varlink{exch2\_domain\_nxt}{exch2_domain_nxt}  The scalar parameters \varlink{exch2\_domain\_nxt}{exch2_domain_nxt}
292  and \varlink{exch2\_domain\_nyt}{exch2_domain_nyt} express the number  and \varlink{exch2\_domain\_nyt}{exch2_domain_nyt} express the number
293  of tiles in the x and y global indices.  For example, the default  of tiles in the $x$ and $y$ global indices.  For example, the default
294  setup of six tiles has \texttt{exch2\_domain\_nxt=6} and  setup of six tiles (Fig. \ref{fig:6tile}) has
295  \texttt{exch2\_domain\_nyt=1}.  A topology of twenty-four square (in  \code{exch2\_domain\_nxt=6} and \code{exch2\_domain\_nyt=1}.  A
296  gridpoints) tiles, four (2x2) per subdomain, will have  topology of twenty-four square tiles, four per subdomain (as in figure
297  \texttt{exch2\_domain\_nxt=12} and \texttt{exch2\_domain\_nyt=2}.  \ref{fig:24tile}), will have \code{exch2\_domain\_nxt=12} and
298  Note that these parameters express the tile layout to allow global  \code{exch2\_domain\_nyt=2}.  Note that these parameters express the
299  data files that are tile-layout-neutral and have no bearing on the  tile layout in order to allow global data files that are tile-layout-neutral.
300  internal storage of the arrays.  The tiles are internally stored in a  They have no bearing on the internal storage of the arrays.  The tiles
301  range from \texttt{1,bi} (in the x axis) and y-axis variable  are stored internally in a range from \code{\varlink{bi}{bi}=(1:NTILES)} in the
302  \texttt{bj} is generally ignored within the package.  $x$ axis, and the $y$ axis variable \varlink{bj}{bj} is assumed to
303    equal \code{1} throughout the package. \\
304  \subsubsection{Arrays Indexed to Tile Number}  
305    Arrays indexed to tile number:
306  The following arrays are of size \texttt{NTILES}, are indexed to the  
307  tile number, and the indices are omitted in their descriptions.  The following arrays are of length \code{NTILES} and are indexed to
308    the tile number, which is indicated in the diagrams with the notation
309    \textsf{t}$n$.  The indices are omitted in the descriptions. \\
310    
311  The arrays \varlink{exch2\_tnx}{exch2_tnx} and  The arrays \varlink{exch2\_tnx}{exch2_tnx} and
312  \varlink{exch2\_tny}{exch2_tny} express the x and y dimensions of each  \varlink{exch2\_tny}{exch2_tny} express the $x$ and $y$ dimensions of
313  tile.  At present for each tile \texttt{exch2\_tnx=sNx} and  each tile.  At present for each tile \texttt{exch2\_tnx=sNx} and
314  \texttt{exch2\_tny=sNy}, as assigned in \texttt{SIZE.h}.  Future  \texttt{exch2\_tny=sNy}, as assigned in \file{SIZE.h} and described in
315  releases of MITgcm are to allow varying tile sizes.  Section \ref{sec:exch2mpi} \sectiontitle{exch2, SIZE.h, and
316    Multiprocessing}.  Future releases of MITgcm may allow varying tile
317  The location of the tiles' Cartesian origin within a subdomain are  sizes. \\
318  determined by the arrays \varlink{exch2\_tbasex}{exch2_tbasex} and  
319  \varlink{exch2\_tbasey}{exch2_tbasey}.  These variables are used to  The arrays \varlink{exch2\_tbasex}{exch2_tbasex} and
320  relate the location of the edges of the tiles to each other.  As an  \varlink{exch2\_tbasey}{exch2_tbasey} determine the tiles'
321  example, in the default six-tile topology (the degenerate case) each  Cartesian origin within a subdomain  
322  index in these arrays are set to 0.  The twenty-four, 32x32 cube face  and locate the edges of different tiles relative to each other.  As
323  case discussed above will have values of 0 or 16, depending on the  an example, in the default six-tile topology (Fig. \ref{fig:6tile})
324  quadrant the tile falls within the subdomain.  The array  each index in these arrays is set to \code{0} since a tile occupies
325  \varlink{exch2\_myFace}{exch2_myFace} contains the number of the  its entire subdomain.  The twenty-four-tile case discussed above will
326  cubeface/subdomain of each tile, numbered 1-6 in the case of the  have values of \code{0} or \code{16}, depending on the quadrant of the
327  standard cube topology.  tile within the subdomain.  The elements of the arrays
328    \varlink{exch2\_txglobalo}{exch2_txglobalo} and
 The arrays \varlink{exch2\_txglobalo}{exch2_txglobalo} and  
329  \varlink{exch2\_txglobalo}{exch2_txglobalo} are similar to  \varlink{exch2\_txglobalo}{exch2_txglobalo} are similar to
330  \varlink{exch2\_tbasex}{exch2_tbasex} and  \varlink{exch2\_tbasex}{exch2_tbasex} and
331  \varlink{exch2\_tbasey}{exch2_tbasey}, but locate the tiles within the  \varlink{exch2\_tbasey}{exch2_tbasey}, but locate the tile edges within the
332  global address space, similar to that used by global files.  global address space, similar to that used by global output and input
333    files. \\
334    
335    The array \varlink{exch2\_myFace}{exch2_myFace} contains the number of
336    the subdomain of each tile, in a range \code{(1:6)} in the case of the
337    standard cube topology and indicated by \textbf{\textsf{f}}$n$ in
338    figures \ref{fig:12tile} and
339    \ref{fig:24tile}. \varlink{exch2\_nNeighbours}{exch2_nNeighbours}
340    contains a count of the neighboring tiles each tile has, and sets
341    the bounds for looping over neighboring tiles.
342    \varlink{exch2\_tProc}{exch2_tProc} holds the process rank of each
343    tile, and is used in interprocess communication.  \\
344    
345    
346  The arrays \varlink{exch2\_isWedge}{exch2_isWedge},  The arrays \varlink{exch2\_isWedge}{exch2_isWedge},
347  \varlink{exch2\_isEedge}{exch2_isEedge},  \varlink{exch2\_isEedge}{exch2_isEedge},
348  \varlink{exch2\_isSedge}{exch2_isSedge}, and  \varlink{exch2\_isSedge}{exch2_isSedge}, and
349  \varlink{exch2\_isNedge}{exch2_isNedge} are set to 1 if the indexed  \varlink{exch2\_isNedge}{exch2_isNedge} are set to \code{1} if the
350  tile lies on the edge of a subdomain, 0 if not.  The values are used  indexed tile lies on the edge of its subdomain, \code{0} if
351  within the topology generator to determine the orientation of  not.  The values are used within the topology generator to determine
352  neighboring tiles and to indicate whether a tile lies on the corner of  the orientation of neighboring tiles, and to indicate whether a tile
353  a subdomain.  The latter case indicates special exchange and numerical  lies on the corner of a subdomain.  The latter case requires special
354  handling for the singularities at the eight corners of the cube.  exchange and numerical handling for the singularities at the eight
355  \varlink{exch2\_nNeighbours}{exch2_nNeighbours} contains a count of  corners of the cube. \\
356  how many neighboring tiles each tile has, and is used for setting  
357  bounds for looping over neighboring tiles.  
358  \varlink{exch2\_tProc}{exch2_tProc} holds the process rank of each  Arrays Indexed to Tile Number and Neighbor:
359  tile, and is used in interprocess communication.  
360    The following arrays have vectors of length \code{MAX\_NEIGHBOURS} and
361  \subsubsection{Arrays Indexed to Tile Number and Neighbor}  \code{NTILES} and describe the orientations between the the tiles. \\
362    
363  The following arrays are all of size \texttt{MAX\_NEIGHBOURS} $\times$  The array \code{exch2\_neighbourId(a,T)} holds the tile number
364  \texttt{NTILES} and describe the orientations between the the tiles.  \code{Tn} for each of the tile number \code{T}'s neighboring tiles
365    \code{a}.  The neighbor tiles are indexed
366  The array \texttt{exch2\_neighbourId(a,T)} holds the tile number for  \code{(1:exch2\_nNeighbours(T))} in the order right to left on the
367  each of the $n$ neighboring tiles.  The neighbor tiles are indexed  north then south edges, and then top to bottom on the east then west
368  \texttt{(1,MAX\_NEIGHBOURS} in the order right to left on the north  edges.  \\
369  then south edges, and then top to bottom on the east and west edges.  
370  Maybe throw in a fig here, eh?   The \code{exch2\_opposingSend\_record(a,T)} array holds the
371    index \code{b} of the element in \texttt{exch2\_neighbourId(b,Tn)}
372  The \texttt{exch2\_opposingSend\_record(a,T)} array holds the index c  that holds the tile number \code{T}, given
373  in \texttt{exch2\_neighbourId(b,$T_{n}$)} that holds the tile number T.  \code{Tn=exch2\_neighborId(a,T)}.  In other words,
 In other words,  
374  \begin{verbatim}  \begin{verbatim}
375     exch2_neighbourId( exch2_opposingSend_record(a,T),     exch2_neighbourId( exch2_opposingSend_record(a,T),
376                        exch2_neighbourId(a,T) ) = T                        exch2_neighbourId(a,T) ) = T
377  \end{verbatim}  \end{verbatim}
378  and this provides a back-reference from the neighbor tiles.  This provides a back-reference from the neighbor tiles. \\
379    
380  The arrays \varlink{exch2\_pi}{exch2_pi},  The arrays \varlink{exch2\_pi}{exch2_pi} and
381  \varlink{exch2\_pj}{exch2_pj}, \varlink{exch2\_oi}{exch2_oi},  \varlink{exch2\_pj}{exch2_pj} specify the transformations of indices
382    in exchanges between the neighboring tiles.  These transformations are
383    necessary in exchanges between subdomains because a horizontal dimension
384    in one subdomain
385    may map to other horizonal dimension in an adjacent subdomain, and
386    may also have its indexing reversed. This swapping arises from the
387    ``folding'' of two-dimensional arrays into a three-dimensional
388    cube. \\
389    
390    The dimensions of \code{exch2\_pi(t,N,T)} and \code{exch2\_pj(t,N,T)}
391    are the neighbor ID \code{N} and the tile number \code{T} as explained
392    above, plus a vector of length \code{2} containing transformation
393    factors \code{t}.  The first element of the transformation vector
394    holds the factor to multiply the index in the same dimension, and the
395    second element holds the the same for the orthogonal dimension.  To
396    clarify, \code{exch2\_pi(1,N,T)} holds the mapping of the $x$ axis
397    index of tile \code{T} to the $x$ axis of tile \code{T}'s neighbor
398    \code{N}, and \code{exch2\_pi(2,N,T)} holds the mapping of \code{T}'s
399    $x$ index to the neighbor \code{N}'s $y$ index. \\
400    
401    One of the two elements of \code{exch2\_pi} or \code{exch2\_pj} for a
402    given tile \code{T} and neighbor \code{N} will be \code{0}, reflecting
403    the fact that the two axes are orthogonal.  The other element will be
404    \code{1} or \code{-1}, depending on whether the axes are indexed in
405    the same or opposite directions.  For example, the transform vector of
406    the arrays for all tile neighbors on the same subdomain will be
407    \code{(1,0)}, since all tiles on the same subdomain are oriented
408    identically.  An axis that corresponds to the orthogonal dimension
409    with the same index direction in a particular tile-neighbor
410    orientation will have \code{(0,1)}.  Those with the opposite index
411    direction will have \code{(0,-1)} in order to reverse the ordering. \\
412    
413    The arrays \varlink{exch2\_oi}{exch2_oi},
414  \varlink{exch2\_oj}{exch2_oj}, \varlink{exch2\_oi\_f}{exch2_oi_f}, and  \varlink{exch2\_oj}{exch2_oj}, \varlink{exch2\_oi\_f}{exch2_oi_f}, and
415  \varlink{exch2\_oj\_f}{exch2_oj_f} specify the transformations in  \varlink{exch2\_oj\_f}{exch2_oj_f} are indexed to tile number and
416  exchanges between the neighboring tiles.  The dimensions of  neighbor and specify the relative offset within the subdomain of the
417  \texttt{exch2\_pi(t,N,T)} and \texttt{exch2\_pj(t,N,T)} are the  array index of a variable going from a neighboring tile \code{N} to a
418  neighbor ID \textit{N} and the tile number \textit{T} as explained  local tile \code{T}.  Consider \code{T=1} in the six-tile topology
419  above, plus the transformation vector {\em t }, of length two.  The  (Fig. \ref{fig:6tile}), where
420  first element of the transformation vector indicates the factor by  
421  which variables representing the same vector component of a tile will  \begin{verbatim}
422  be multiplied, and the second element indicates the transform to the         exch2_oi(1,1)=33
423  variable in the other direction.  As an example,         exch2_oi(2,1)=0
424  \texttt{exch2\_pi(1,N,T)} holds the transform of the i-component of a         exch2_oi(3,1)=32
425  vector variable in tile \texttt{T} to the i-component of tile         exch2_oi(4,1)=-32
426  \texttt{T}'s neighbor \texttt{N}, and \texttt{exch2\_pi(2,N,T)} hold  \end{verbatim}
427  the component of neighbor \texttt{N}'s j-component.  
428    The simplest case is \code{exch2\_oi(2,1)}, the southern neighbor,
429  Under the current cube topology, one of the two elements of  which is \code{Tn=6}.  The axes of \code{T} and \code{Tn} have the
430  \texttt{exch2\_pi} or \texttt{exch2\_pj} for a given tile \texttt{T}  same orientation and their $x$ axes have the same origin, and so an
431  and neighbor \texttt{N} will be 0, reflecting the fact that the vector  exchange between the two requires no changes to the $x$ index.  For
432  components are orthogonal.  The other element will be 1 or -1,  the western neighbor (\code{Tn=5}), \code{code\_oi(3,1)=32} since the
433  depending on whether the components are indexed in the same or  \code{x=0} vector on \code{T} corresponds to the \code{y=32} vector on
434  opposite directions.  For example, the transform dimension of the  \code{Tn}.  The eastern edge of \code{T} shows the reverse case
435  arrays for all tile neighbors on the same subdomain will be [1,0],  (\code{exch2\_oi(4,1)=-32)}), where \code{x=32} on \code{T} exchanges
436  since all tiles on the same subdomain are oriented identically.  with \code{x=0} on \code{Tn=2}. \\
437  Vectors that correspond to the orthogonal dimension with the same  
438  index direction will have [0,1], whereas those in the opposite index   The most interesting case, where \code{exch2\_oi(1,1)=33} and
439  direction will have [0,-1].  \code{Tn=3}, involves a reversal of indices.  As in every case, the
440    offset \code{exch2\_oi} is added to the original $x$ index of \code{T}
441    multiplied by the transformation factor \code{exch2\_pi(t,N,T)}.  Here
442  {\footnotesize  \code{exch2\_pi(1,1,1)=0} since the $x$ axis of \code{T} is orthogonal
443  \begin{verbatim}  to the $x$ axis of \code{Tn}.  \code{exch2\_pi(2,1,1)=-1} since the
444  C      exch2_pi          :: X index row of target to source permutation  $x$ axis of \code{T} corresponds to the $y$ axis of \code{Tn}, but the
445  C                        :: matrix for each neighbour entry.              index is reversed.  The result is that the index of the northern edge
446  C      exch2_pj          :: Y index row of target to source permutation  of \code{T}, which runs \code{(1:32)}, is transformed to
447  C                        :: matrix for each neighbour entry.              \code{(-1:-32)}. \code{exch2\_oi(1,1)} is then added to this range to
448  C      exch2_oi          :: X index element of target to source  get back \code{(32:1)} -- the index of the $y$ axis of \code{Tn}
449  C                        :: offset vector for cell-centered quantities    relative to \code{T}.  This transformation may seem overly convoluted
450  C                        :: of each neighbor entry.                      for the six-tile case, but it is necessary to provide a general
451  C      exch2_oj          :: Y index element of target to source  solution for various topologies. \\
 C                        :: offset vector for cell-centered quantities    
 C                        :: of each neighbor entry.                      
 C      exch2_oi_f        :: X index element of target to source  
 C                        :: offset vector for face quantities            
 C                        :: of each neighbor entry.                      
 C      exch2_oj_f        :: Y index element of target to source  
 C                        :: offset vector for face quantities            
 C                        :: of each neighbor entry.                      
 \end{verbatim}  
 }  
452    
453    
454    
455  \subsection{Key Routines}  Finally, \varlink{exch2\_itlo\_c}{exch2_itlo_c},
456    \varlink{exch2\_ithi\_c}{exch2_ithi_c},
457    \varlink{exch2\_jtlo\_c}{exch2_jtlo_c} and
458    \varlink{exch2\_jthi\_c}{exch2_jthi_c} hold the location and index
459    bounds of the edge segment of the neighbor tile \code{N}'s subdomain
460    that gets exchanged with the local tile \code{T}.  To take the example
461    of tile \code{T=2} in the twelve-tile topology
462    (Fig. \ref{fig:12tile}): \\
463    
464    \begin{verbatim}
465           exch2_itlo_c(4,2)=17
466           exch2_ithi_c(4,2)=17
467           exch2_jtlo_c(4,2)=0
468           exch2_jthi_c(4,2)=33
469    \end{verbatim}
470    
471    Here \code{N=4}, indicating the western neighbor, which is
472    \code{Tn=1}.  \code{Tn} resides on the same subdomain as \code{T}, so
473    the tiles have the same orientation and the same $x$ and $y$ axes.
474    The $x$ axis is orthogonal to the western edge and the tile is 16
475    points wide, so \code{exch2\_itlo\_c} and \code{exch2\_ithi\_c}
476    indicate the column beyond \code{Tn}'s eastern edge, in that tile's
477    halo region. Since the border of the tiles extends through the entire
478    height of the subdomain, the $y$ axis bounds \code{exch2\_jtlo\_c} to
479    \code{exch2\_jthi\_c} cover the height of \code{(1:32)}, plus 1 in
480    either direction to cover part of the halo. \\
481    
482    For the north edge of the same tile \code{T=2} where \code{N=1} and
483    the neighbor tile is \code{Tn=5}:
484    
485    \begin{verbatim}
486           exch2_itlo_c(1,2)=0
487           exch2_ithi_c(1,2)=0
488           exch2_jtlo_c(1,2)=0
489           exch2_jthi_c(1,2)=17
490    \end{verbatim}
491    
492    \code{T}'s northern edge is parallel to the $x$ axis, but since
493    \code{Tn}'s $y$ axis corresponds to \code{T}'s $x$ axis, \code{T}'s
494    northern edge exchanges with \code{Tn}'s western edge.  The western
495    edge of the tiles corresponds to the lower bound of the $x$ axis, so
496    \code{exch2\_itlo\_c} and \code{exch2\_ithi\_c} are \code{0}, in the
497    western halo region of \code{Tn}. The range of
498    \code{exch2\_jtlo\_c} and \code{exch2\_jthi\_c} correspond to the
499    width of \code{T}'s northern edge, expanded by one into the halo. \\
500    
501    
502    \subsubsection{Key Routines}
503    
504    Most of the subroutines particular to exch2 handle the exchanges
505    themselves and are of the same format as those described in
506    \ref{sect:cube_sphere_communication} \sectiontitle{Cube sphere
507    communication}.  Like the original routines, they are written as
508    templates which the local Makefile converts from \code{RX} into
509    \code{RL} and \code{RS} forms. \\
510    
511    The interfaces with the core model subroutines are
512    \code{EXCH\_UV\_XY\_RX}, \code{EXCH\_UV\_XYZ\_RX} and
513    \code{EXCH\_XY\_RX}.  They override the standard exchange routines
514    when \code{genmake2} is run with \code{exch2} option.  They in turn
515    call the local exch2 subroutines \code{EXCH2\_UV\_XY\_RX} and
516    \code{EXCH2\_UV\_XYZ\_RX} for two and three-dimensional vector
517    quantities, and \code{EXCH2\_XY\_RX} and \code{EXCH2\_XYZ\_RX} for two
518    and three-dimensional scalar quantities.  These subroutines set the
519    dimensions of the area to be exchanged, call \code{EXCH2\_RX1\_CUBE}
520    for scalars and \code{EXCH2\_RX2\_CUBE} for vectors, and then handle
521    the singularities at the cube corners. \\
522    
523    The separate scalar and vector forms of \code{EXCH2\_RX1\_CUBE} and
524    \code{EXCH2\_RX2\_CUBE} reflect that the vector-handling subroutine
525    needs to pass both the $u$ and $v$ components of the physical vectors.
526    This swapping arises from the topological folding discussed above, where the
527    $x$ and $y$ axes get swapped in some cases, and is not an
528    issue with the scalar case. These subroutines call
529    \code{EXCH2\_SEND\_RX1} and \code{EXCH2\_SEND\_RX2}, which do most of
530    the work using the variables discussed above. \\
531    
 \subsection{References}  

Legend:
Removed from v.1.9  
changed lines
  Added in v.1.25

  ViewVC Help
Powered by ViewVC 1.1.22