/[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.13 by afe, Wed Mar 17 19:49:22 2004 UTC revision 1.16 by afe, Thu Mar 18 22:20:38 2004 UTC
# Line 281  generated by \file{driver.m}.\\ Line 281  generated by \file{driver.m}.\\
281  The scalar parameters \varlink{exch2\_domain\_nxt}{exch2_domain_nxt}  The scalar parameters \varlink{exch2\_domain\_nxt}{exch2_domain_nxt}
282  and \varlink{exch2\_domain\_nyt}{exch2_domain_nyt} express the number  and \varlink{exch2\_domain\_nyt}{exch2_domain_nyt} express the number
283  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
284  setup of six tiles (Fig. \ref{fig:6tile}) has \code{exch2\_domain\_nxt=6} and  setup of six tiles (Fig. \ref{fig:6tile}) has
285  \code{exch2\_domain\_nyt=1}.  A topology of twenty-four square tiles,  \code{exch2\_domain\_nxt=6} and \code{exch2\_domain\_nyt=1}.  A
286  four per subdomain (as in figure \ref{fig:24tile}), will have  topology of twenty-four square tiles, four per subdomain (as in figure
287  \code{exch2\_domain\_nxt=12} and \code{exch2\_domain\_nyt=2}.  Note  \ref{fig:24tile}), will have \code{exch2\_domain\_nxt=12} and
288  that these parameters express the tile layout to allow global data  \code{exch2\_domain\_nyt=2}.  Note that these parameters express the
289  files that are tile-layout-neutral and have no bearing on the internal  tile layout to allow global data files that are tile-layout-neutral
290  storage of the arrays.  The tiles are internally stored in a range  and have no bearing on the internal storage of the arrays.  The tiles
291  from \code{(1:\varlink{bi}{bi})} the $x$ axis, and $y$ axis variable  are internally stored in a range from \code{(1:\varlink{bi}{bi})} the
292  \varlink{bj}{bj} is generally ignored within the package. \\  $x$ axis, and the $y$ axis variable \varlink{bj}{bj} is generally
293    ignored within the package. \\
294    
295  \subsubsection{Arrays Indexed to Tile Number}  \subsubsection{Arrays Indexed to Tile Number}
296    
297  The following arrays are of length \code{NTILES}, are indexed to the  The following arrays are of length \code{NTILES}and are indexed to the
298  tile number, and the indices are omitted in their descriptions. \\  tile number, which is indicated in the diagrams with the notation
299    \textsf{t}$n$.  The indices are omitted in the descriptions. \\
300    
301  The arrays \varlink{exch2\_tnx}{exch2_tnx} and  The arrays \varlink{exch2\_tnx}{exch2_tnx} and
302  \varlink{exch2\_tny}{exch2_tny} express the $x$ and $y$ dimensions of  \varlink{exch2\_tny}{exch2_tny} express the $x$ and $y$ dimensions of
# Line 324  the subdomain of each tile, in a range \ Line 326  the subdomain of each tile, in a range \
326  standard cube topology and indicated by \textbf{\textsf{f}}$n$ in  standard cube topology and indicated by \textbf{\textsf{f}}$n$ in
327  figures \ref{fig:12tile} and  figures \ref{fig:12tile} and
328  \ref{fig:24tile}. \varlink{exch2\_nNeighbours}{exch2_nNeighbours}  \ref{fig:24tile}. \varlink{exch2\_nNeighbours}{exch2_nNeighbours}
329  contains a count of how many neighboring tiles each tile has, and is  contains a count the  neighboring tiles each tile has, and is
330  used for setting bounds for looping over neighboring tiles.  used for setting bounds for looping over neighboring tiles.
331  \varlink{exch2\_tProc}{exch2_tProc} holds the process rank of each  \varlink{exch2\_tProc}{exch2_tProc} holds the process rank of each
332  tile, and is used in interprocess communication.  \\  tile, and is used in interprocess communication.  \\
# Line 334  The arrays \varlink{exch2\_isWedge}{exch Line 336  The arrays \varlink{exch2\_isWedge}{exch
336  \varlink{exch2\_isEedge}{exch2_isEedge},  \varlink{exch2\_isEedge}{exch2_isEedge},
337  \varlink{exch2\_isSedge}{exch2_isSedge}, and  \varlink{exch2\_isSedge}{exch2_isSedge}, and
338  \varlink{exch2\_isNedge}{exch2_isNedge} are set to \code{1} if the  \varlink{exch2\_isNedge}{exch2_isNedge} are set to \code{1} if the
339  indexed tile lies on the edge of a subdomain, \code{0} if not.  The  indexed tile lies on the respective edge of a subdomain, \code{0} if
340  values are used within the topology generator to determine the  not.  The values are used within the topology generator to determine
341  orientation of neighboring tiles, and to indicate whether a tile lies  the orientation of neighboring tiles, and to indicate whether a tile
342  on the corner of a subdomain.  The latter case requires special  lies on the corner of a subdomain.  The latter case requires special
343  exchange and numerical handling for the singularities at the eight  exchange and numerical handling for the singularities at the eight
344  corners of the cube. \\  corners of the cube. \\
345    
# Line 350  orientations between the the tiles. \\ Line 352  orientations between the the tiles. \\
352    
353  The array \code{exch2\_neighbourId(a,T)} holds the tile number  The array \code{exch2\_neighbourId(a,T)} holds the tile number
354  \code{Tn} for each of the tile number \code{T}'s neighboring tiles  \code{Tn} for each of the tile number \code{T}'s neighboring tiles
355  \code{a}.  The neighbor tiles are indexed \code{(1:MAX\_NEIGHBOURS)}  \code{a}.  The neighbor tiles are indexed
356  in the order right to left on the north then south edges, and then top  \code{(1:exch2\_NNeighbours(T))} in the order right to left on the
357  to bottom on the east and west edges.  Maybe throw in a fig here, eh?  north then south edges, and then top to bottom on the east and west
358  \\  edges.  Maybe throw in a fig here, eh?  \\
359    
360  \sloppy  \sloppy The \code{exch2\_opposingSend\_record(a,T)} array holds the
361  The \code{exch2\_opposingSend\_record(a,T)} array holds the index  index \code{b} of the element in \texttt{exch2\_neighbourId(b,Tn)}
362  \code{b} in \texttt{exch2\_neighbourId(b,Tn)} that holds the tile  that holds the tile number \code{T}, given
363  number \code{T}.  In other words,  \code{Tn=exch2\_neighborId(a,T)}.  In other words,
364  \begin{verbatim}  \begin{verbatim}
365     exch2_neighbourId( exch2_opposingSend_record(a,T),     exch2_neighbourId( exch2_opposingSend_record(a,T),
366                        exch2_neighbourId(a,T) ) = T                        exch2_neighbourId(a,T) ) = T
# Line 366  number \code{T}.  In other words, Line 368  number \code{T}.  In other words,
368  This provides a back-reference from the neighbor tiles. \\  This provides a back-reference from the neighbor tiles. \\
369    
370  The arrays \varlink{exch2\_pi}{exch2_pi} and  The arrays \varlink{exch2\_pi}{exch2_pi} and
371  \varlink{exch2\_pj}{exch2_pj} specify the transformations of variables  \varlink{exch2\_pj}{exch2_pj} specify the transformations of indices
372  in exchanges between the neighboring tiles.  These transformations are  in exchanges between the neighboring tiles.  These transformations are
373  necessary in exchanges between subdomains because a physical vector  necessary in exchanges between subdomains because the array index in
374  component in one direction may map to one in a different direction in  one dimension may map to the other index in an adjacent subdomain, and
375  an adjacent subdomain, and may be have its indexing reversed. This  may be have its indexing reversed. This swapping arises from the
376  swapping arises from the ``folding'' of two-dimensional arrays into a  ``folding'' of two-dimensional arrays into a three-dimensional cube.
 three-dimensional cube.  
377    
378  The dimensions of \code{exch2\_pi(t,N,T)} and \code{exch2\_pj(t,N,T)}  The dimensions of \code{exch2\_pi(t,N,T)} and \code{exch2\_pj(t,N,T)}
379  are the neighbor ID \code{N} and the tile number \code{T} as explained  are the neighbor ID \code{N} and the tile number \code{T} as explained
380  above, plus a vector of length 2 containing transformation factors  above, plus a vector of length \code{2} containing transformation
381  \code{t}.  The first element of the transformation vector indicates  factors \code{t}.  The first element of the transformation vector
382  the factor \code{t} by which variables representing the same  holds the factor to multiply the index in the same axis, and the
383  \emph{physical} vector component of a tile \code{T} will be multiplied  second element holds the the same for the orthogonal index.  To
384  in exchanges with neighbor \code{N}, and the second element indicates  clarify, \code{exch2\_pi(1,N,T)} holds the mapping of the $x$ axis
385  the transform to the physical vector in the other direction.  To  index of tile \code{T} to the $x$ axis of tile \code{T}'s neighbor
386  clarify (hopefully), \code{exch2\_pi(1,N,T)} holds the transform of  \code{N}, and \code{exch2\_pi(2,N,T)} holds the mapping of \code{T}'s
387  the $i$ component of a vector variable in tile \code{T} to the $i$  $x$ index to the neighbor \code{N}'s $y$ index. \\
 component of tile \code{T}'s neighbor \code{N}, and  
 \code{exch2\_pi(2,N,T)} holds the transform of \code{T}'s $i$  
 components to the neighbor \code{N}'s $j$ component. \\  
388    
389  Under the current cube topology, one of the two elements of  One of the two elements of \code{exch2\_pi} or \code{exch2\_pj} for a
390  \code{exch2\_pi} or \code{exch2\_pj} for a given tile \code{T} and  given tile \code{T} and neighbor \code{N} will be \code{0}, reflecting
391  neighbor \code{N} will be \code{0}, reflecting the fact that the two  the fact that the two axes are orthogonal.  The other element will be
392  vector components are orthogonal.  The other element will be \code{1}  \code{1} or \code{-1}, depending on whether the axes are indexed in
393  or \code{-1}, depending on whether the components are indexed in the  the same or opposite directions.  For example, the transform vector of
394  same or opposite directions.  For example, the transform vector of the  the arrays for all tile neighbors on the same subdomain will be
 arrays for all tile neighbors on the same subdomain will be  
395  \code{(1,0)}, since all tiles on the same subdomain are oriented  \code{(1,0)}, since all tiles on the same subdomain are oriented
396  identically.  A vector direction that corresponds to the orthogonal  identically.  An axis that corresponds to the orthogonal dimension
397  dimension with the same index direction in a particular tile-neighbor  with the same index direction in a particular tile-neighbor
398  orientation will have \code{(0,1)}, whereas those in the opposite  orientation will have \code{(0,1)}.  Those in the opposite index
399  index direction will have \code{(0,-1)}. \\  direction will have \code{(0,-1)} in order to reverse the ordering. \\
400    
401    The arrays \varlink{exch2\_oi}{exch2_oi},
 \varlink{exch2\_oi}{exch2_oi},  
402  \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
403  \varlink{exch2\_oj\_f}{exch2_oj_f}  \varlink{exch2\_oj\_f}{exch2_oj_f} are indexed to tile number and
404    neighbor and specify the relative offset within the subdomain of the
405    array index of a variable going from a neighboring tile $N$ to a local
406    tile $T$.  Consider \code{T=1} in the six-tile topology
407    (Fig. \ref{fig:6tile}), where
408    
409    \begin{verbatim}
410           exch2_oi(1,1)=33
411           exch2_oi(2,1)=0
412           exch2_oi(3,1)=32
413           exch2_oi(4,1)=-32
414    \end{verbatim}
415    
416    The simplest case is \code{exch2\_oi(2,1)}, the southern neighbor,
417    which is \code{Tn=6}.  The axes of \code{T} and \code{Tn} have the
418    same orientation and their $x$ axes have the same origin, and so an
419    exchange between the two requires no changes to the $x$ index.  For
420    the western neighbor (\code{Tn=5}), \code{code\_oi(3,1)=32} since the
421    \code{x=0} vector on \code{T} corresponds to the \code{y=32} vector on
422    \code{Tn}.  The eastern edge of \code{T} shows the reverse case
423    (\code{exch2\_oi(4,1)=-32)}, where \code{x=32} on \code{T} exchanges
424    with \code{x=0} on \code{Tn=2}.  The most interesting case, where
425    \code{exch2\_oi(1,1)=33} and \code{Tn=3}, involves a reversal of
426    indices.  As in every case, the offset \code{exch2\_oi} is added to
427    the original $x$ index of \code{T} multiplied by the transformation
428    factor \code{exch2\_pi(t,N,T)}.  Here \code{exch2\_pi(1,1,1)=0} since
429    the $x$ axis of \code{T} is orthogonal to the $x$ axis of \code{Tn}.
430    \code{exch2\_pi(2,1,1)=-1} since the $x$ axis of \code{T} corresponds
431    to the $y$ axis of \code{Tn}, but the axes are reversed.  The result
432    is that the index of the northern edge of \code{T}, which runs
433    \code{(1:32)}, is transformed to
434    \code{(-1:-32)}. \code{exch2\_oi(1,1)} is then added to this range to
435    get back \code{(1:32)} -- the index of the $y$ axis of \code{Tn}.
436    This transformation may seem overly convoluted for the six-tile case,
437    but it is necessary to provide a general solution for various
438    topologies. \\
439    
440    
441    
442  This needs some diagrams. \\  Finally, \varlink{exch2\_itlo\_c}{exch2_itlo_c},
443    \varlink{exch2\_ithi\_c}{exch2_ithi_c},
444    \varlink{exch2\_jtlo\_c}{exch2_jtlo_c} and
445    \varlink{exch2\_jthi\_c}{exch2_jthi_c} hold the location and index
446    bounds of the edge segment of the neighbor tile \code{N}'s subdomain
447    that gets exchanged with the local tile \code{T}.  To take the example
448    of tile \code{T=2} in the twelve-tile topology
449    (Fig. \ref{fig:12tile}): \\
450    
451    \begin{verbatim}
452           exch2_itlo_c(4,2)=17
453           exch2_ithi_c(4,2)=17
454           exch2_jtlo_c(4,2)=0
455           exch2_jthi_c(4,2)=33
456    \end{verbatim}
457    
458    Here \code{N=4}, indicating the western neighbor, which is \code{Tn=1}.
459    \code{Tn=1} resides on the same subdomain as \code{T=2}, so the tiles
460    have the same orientation and the same $x$ and $y$ axes.  The $i$
461    component is orthogonal to the western edge and the tile is 16 points
462    wide, so \code{exch2\_itlo\_c} and \code{exch2\_ithi\_c} indicate the
463    column beyond \code{Tn=1}'s eastern edge, in that tile's halo
464    region. Since the border of the tiles extends through the entire
465    height of the subdomain, the $y$ axis bounds \code{exch2\_jtlo\_c} to
466    \code{exch2\_jthi\_c} cover the height, plus 1 in either direction to
467    cover part of the halo. \\
468    
469    For the north edge of the same tile \code{T=2} where \code{N=1} and
470    the neighbor tile is \code{Tn=5}:
471    
 {\footnotesize  
472  \begin{verbatim}  \begin{verbatim}
473  C      exch2_pi          :: X index row of target to source permutation         exch2_itlo_c(1,2)=0
474  C                        :: matrix for each neighbour entry.                     exch2_ithi_c(1,2)=0
475  C      exch2_pj          :: Y index row of target to source permutation         exch2_jtlo_c(1,2)=0
476  C                        :: matrix for each neighbour entry.                     exch2_jthi_c(1,2)=17
 C      exch2_oi          :: X index element of target to source  
 C                        :: offset vector for cell-centered quantities    
 C                        :: of each neighbor entry.                      
 C      exch2_oj          :: Y index element of target to source  
 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.                      
477  \end{verbatim}  \end{verbatim}
478  }  
479    \code{T}'s northern edge is parallel to the $x$ axis, but since
480    \code{Tn}'s $y$ axis corresponds to \code{T}'s $x$ axis,
481    \code{T}'s northern edge exchanges with \code{Tn}'s western edge.
482    The western edge of the tiles corresponds to the lower bound of the
483    $x$ axis, so \code{exch2\_itlo\_c} \code{exch2\_ithi\_c} are \code{0}. The
484    range of \code{exch2\_jtlo\_c} and \code{exch2\_jthi\_c} correspond to the
485    width of \code{T}'s northern edge, plus the halo. \\
486    
487    
488    
489    
 \subsection{Key Routines}  
490    
491    
492    
493  \subsection{References}  
494    
495    
496    
497    This needs some diagrams. \\
498    
499    
500    
501    \subsection{Key Routines}
502    
503    Most of the subroutines particular to exch2 handle the exchanges
504    themselves and are of the same format as those described in
505    \ref{sect:cube_sphere_communication} \sectiontitle{Cube sphere
506    communication}.  Like the original routines, they are written as
507    templates which the local Makefile converts from RX into RL and RS
508    forms. \\
509    
510    The interfaces with the core model subroutines are
511    \code{EXCH\_UV\_XY\_RX}, \code{EXCH\_UV\_XYZ\_RX} and \code{EXCH\_XY\_RX}.
512    They override the standard exchange routines when \code{genmake2} is
513    run with \code{exch2} option.  They in turn call the local exch2
514    subroutines \code{EXCH2\_UV\_XY\_RX} and \code{EXCH2\_UV\_XYZ\_RX} for two
515    and three dimensional vector quantities, and \code{EXCH2\_XY\_RX} and
516    \code{EXCH2\_XYZ\_RX} for two and three dimensional scalar quantities.
517    These subroutines set the dimensions of the area to be exchanged, call
518    \code{EXCH2\_RX1\_CUBE} for scalars and \code{EXCH2\_RX2\_CUBE} for
519    vectors, and then handle the singularities at the cube corners. \\
520    
521    The separate scalar and vector forms of \code{EXCH2\_RX1\_CUBE} and
522    \code{EXCH2\_RX2\_CUBE} reflect that the vector-handling subrouine needs
523    to pass both the $x$ and $y$ components of the vectors.  This arises
524    from the topological folding discussed above, where the $x$ and $y$
525    axes get swapped in some cases.  This swapping is not an issue with
526    the scalar version. These subroutines call \code{EXCH2\_SEND\_RX1} and
527    \code{EXCH2\_SEND\_RX2}, which do most of the work using the variables
528    discussed above. \\
529    

Legend:
Removed from v.1.13  
changed lines
  Added in v.1.16

  ViewVC Help
Powered by ViewVC 1.1.22