<p><b>dwj07@fsu.edu</b> 2012-08-16 14:57:13 -0600 (Thu, 16 Aug 2012)</p><p><br>
        -- TRUNNK COMMIT --<br>
<br>
        Moving documents from branches to finished projects directory.<br>
</p><hr noshade><pre><font color="gray">Deleted: branches/omp_blocks/docs/ddt_reorg.pdf
===================================================================
(Binary files differ)

Deleted: branches/omp_blocks/docs/mpas_block_decomp_redesign.pdf
===================================================================
(Binary files differ)

Deleted: branches/omp_blocks/docs/mpas_block_decomp_redesign.tex
===================================================================
--- branches/omp_blocks/docs/mpas_block_decomp_redesign.tex        2012-08-16 20:54:16 UTC (rev 2104)
+++ branches/omp_blocks/docs/mpas_block_decomp_redesign.tex        2012-08-16 20:57:13 UTC (rev 2105)
@@ -1,337 +0,0 @@
-\documentclass[11pt]{report}
-
-\usepackage{graphicx}
-\usepackage{listings}
-\usepackage{color}
-
-\setlength{\topmargin}{0in}
-\setlength{\headheight}{0in}
-\setlength{\headsep}{0in}
-\setlength{\textheight}{9.0in}
-\setlength{\textwidth}{6.5in}
-\setlength{\evensidemargin}{0in}
-\setlength{\oddsidemargin}{0in}
-
-
-\begin{document}
-
-\title{Revisions to MPAS block decomposition routines}
-\author{}
-
-\maketitle
-\tableofcontents
-
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%
-% Introduction
-%
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\chapter{Introduction}
-
-In order to support multiple blocks of cells per MPI task, there are a number of
-development issues that need to be addressed:
-
-\begin{enumerate}
-
-\item Update/extend the fundamental derived types in mpas\_grid\_types.F.                                
-   In order for other parts of the infrastructure to handle multiple                                
-   blocks per task in a clean way, we'll need to be able to pass a head                             
-   pointer to a field into a routine, and have that routine loop through                            
-   all blocks for that field, with information about which cells/edges/vertices                     
-   in that field need to be communicated.                                                           
-                                                                                                    
-\item Decide on a new MPAS I/O abstraction layer, which will provide a                                
-   high-level interface to the PIO layer for the rest of MPAS. This layer                           
-   should work with blocks of fields, and make it possible to define an                             
-   arbitrary set of I/O streams at run-time.                                                        
-                                                                                                    
-\item Add a new module to parse a run-time I/O configuration file that                                
-   will describe which fields are read or written to each of the I/O                                
-   streams that a user requests via the file. This module will make calls                           
-   to the new MPAS I/O layer to register the requested fields for I/O in                            
-   the requested streams.                                          
-   
-\item Update the mpas\_dmpar module to support communication operations on                              
-   multiple blocks per task. This will likely involve revising the                                  
-   internal data structures used to define communication of cells                                   
-   between tasks, and also require revisions to the public interface                                
-   routines themselves.                                                                             
-                                                                                                    
-\item Modify the block\_decomp module to enable a task to get a list of                                 
-   cells in more than one block that it is to be the owner of.                                      
-   Implemented in the simplest way, there could simply be a namelist                                
-   option to specify how many blocks each task should own, and the                                  
-   block\_decomp module could look for a graph.info.part.n file, with                                
-   n=num\_blocks\_per\_task*num\_tasks, and assign blocks k, 2k, 3k, ...,                               
-   num\_blocks\_per\_task*k to task k.    
-
-\end{enumerate}                                                             
-                                                                                                    
-This document concerns the last item, namely, the extensions to the block decomposition
-module that will be necessary for supporting multiple blocks per task in other infrastructure
-modules. \\
-
-For a broader scope of this project, the intent with these five previously
-detailed tasks is to provide the capabilities within MPAS to support PIO and
-simulations where the number of blocks in a decomposition are not equal to the
-number of MPI tasks. For example, a simulation could run on 16 processors with
-a total of 64 blocks, as opposed to the current framework where only 16 blocks
-can run at 16 processors. \\
-
-After these tasks are implemented shared memory parallism can be implemented at
-the core level to (hopefully) improve performance, but also allow greater
-flexibility in terms of the parallel infrastructre of MPAS. \\
-
-As a rough timeline, these 5 tasks are planned to be completed by the end of February, 2012.
-
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%
-% Requirements
-%
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\chapter{Requirements}
-
-The changes to the block decomposition module should enable an MPI task to get
-a list of it's owned cells, as well as the block number each of those cells
-lives on within it's task.
-
-\begin{itemize}
-
-        \item The user must be able to specify the number of blocks in a
-                simulation.
-
-        \item Block decomposition modules must provide information describing the
-                cell and block relationship for a given MPI task.
-
-        \item Block decomposition modules need to be flexible enough to support
-                multiple methods of acquiring a decomposition.
-
-        \item Block decomposition modules need to support a different number of
-                blocks than MPI tasks, even when they are not evenly divisible.
-
-        \item Block decomposition modules should provide an interface to map a
-                global block number to local block number, and owning processor number.
-\end{itemize}
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%
-% Design
-%
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\chapter{Design}
-
-We propose several changes to the block decomposition module in order to
-support multiple blocks per MPI task. Currently, in order to support the case
-where there are multiple blocks per MPI task a namelist parameter needs to be
-added that will allow these two values to differ. \\
-
-First, changes to the namelist.input file include a new section called
-decomposition. This section will include four parameters. The first being
-config\_number\_of\_blocks which is an integer representation of the number of
-blocks a run should use. Second is config\_block\_decomp\_file\_prefix, which
-represents the path and prefix (before the .N) of the file for the block
-decomposition. Third is config\_proc\_decomp\_file\_prefix representing the
-path and prefix (before the .Np) to the file for the processor decomposition.
-Finally is config\_explicit\_proc\_decomp which is logical and tells MPAS to
-use the config\_proc\_decomp\_file for the distribution of blocks, or to use
-the built in method of distributing the blocks to processors.\\
-
-config\_number\_of\_blocks option will have a default value of
-0. A value of 0 in this field means there should be nProcs blocks, or one block
-for every MPI task, which is the default behavior currently.
-config\_block\_decomp\_file\_prefix is read by default and
-config\_proc\_decomp\_file\_prefix is only read for external block assignment,
-as will be described later.\\
-
-Inside mpas\_block\_decomp.F, the mpas\_block\_decomp\_cells\_for\_proc needs
-to be changed.  To not only read in all cells in all blocks, but also their
-block numbers. \\
-
-The meaning of the contents of graph.info.part.N needs to change from the
-processor ID that owns a cell, to the global block number for a cell. This
-means the file that is read in with have N = config\_number\_of\_blocks. \\
-
-Given a graph.info.part.N file, the global block number needs to be mapped into
-both an owning processor number, and a local block id. The local block id does
-not need to be computed within mpas\_block\_decomp\_cells\_for\_proc as long as
-the mapping is available or known. \\
-
-The api for mpas\_block\_decomp\_cells\_for\_proc will change from
-
-\begin{lstlisting}[language=fortran,escapechar=@,frame=single]
-subroutine mpas_block_decomp_cells_for_proc(dminfo,  &amp;
-           partial_global_graph_info, local_cell_list)
-\end{lstlisting}
-
-to
-
-\begin{lstlisting}[language=fortran,escapechar=@,frame=single]
-subroutine mpas_block_decomp_cells_for_proc(dminfo, &amp;
-           partial_global_graph_info, local_cell_list, @\colorbox{yellow}{block\_id}@, &amp;
-                   @\colorbox{yellow}{block\_start}@, @\colorbox{yellow}{block\_count}@)
-\end{lstlisting}
-
-where local\_cell\_list is a list of cells owned by a processor that is sorted
-by local block id, block\_id is a list of global block id's that an MPI task
-owns, block\_start is a list of offsets in local\_cell\_list for the contiguous
-cells a block owns, and block\_count is a the number of cells each block owns. \\
-
-mpas\_block\_decomp\_cells\_for\_proc will perform the same regardless of
-number of processors to enable the use of multiple blocks on a single
-processor. \\
-
-The block\_type data structure will be extended to include the local block id.
-This can help make dynamic load balancing easier for implementation at a later
-time. This will change
-
-\begin{lstlisting}[language=fortran,escapechar=@,frame=single]
-   type block_type
-
-#include &quot;block_group_members.inc&quot;
-
-      integer :: blockID   ! Unique global ID number for this block
-
-      type (domain_type), pointer :: domain
-
-      type (parallel_info), pointer :: parinfo
-
-      type (block_type), pointer :: prev, next
-   end type block_type
-
-\end{lstlisting}
-
-to
-
-\begin{lstlisting}[language=fortran,escapechar=@,frame=single]
-   type block_type
-
-#include &quot;block_group_members.inc&quot;
-
-      integer :: blockID   ! Unique global ID number for this block
-      @\colorbox{yellow}{integer :: localBlockID}@
-
-      type (domain_type), pointer :: domain
-
-      type (parallel_info), pointer :: parinfo
-
-      type (block_type), pointer :: prev, next
-   end type block_type
-
-\end{lstlisting}
-
-There will be three additions to the public interface of mpas\_block\_decomp.F
-The first adds the routine mpas\_get\_local\_block\_id which takes has three
-arguments. As input it takes the domain information and the global block
-number, and as output it provides the local block number on a processor. This
-allows other parts of MPAS to determine what local block number a global block
-is, even if it's on another processor. \\
-
-The second addition to the public interface is the subroutine
-mpas\_get\_owning\_proc. This subroutine takes as input the domain information
-and the global block number, and as output provides the MPI task number that
-owns the block. This allows other parts of MPAS to determine from a block
-number which MPI task it needs to communicate with to read/write this block. \\
-
-The third public routine is called mpas\_get\_blocks\_per\_proc. This routine
-takes as input the domain information and a processor number. On output
-blocks\_per\_proc contains the number of blocks a processor owns. \\
-
-In addition to the ad-hoc method of determining which blocks belong to which
-processors, a file based method will be added. This method will be toggelable
-by a namelist option named config\_explicit\_proc\_decomp, which will be logical.
-If this option is true, a file (config\_proc\_decomp\_file\_prefix.N) will be
-provided, where N is the number of processors. This file will have number of
-blocks lines, and each line will say what processor should own the block. This
-file can be created using metis externally. \\
-
-%\begin{lstlisting}[language=fortran,escapechar=@,frame=single]
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%
-% Implementation
-%
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-
-\chapter{Implementation}
-
-Implementation of the mpas\_get\_blocks\_per\_proc subroutine is as follows:
-
-\begin{lstlisting}[language=fortran,escapechar=@,frame=single]
-subroutine mpas_get_blocks_per_proc(dminfo, proc_number, blocks_per_proc)
-  type(domain_info), intent(in) :: dminfo
-  integer, intent(in) :: proc_number
-  integer, intent(out) :: blocks_per_proc
-  integer :: blocks_per_proc_min, even_blocks, remaining_blocks
-
-  blocks_per_proc_min = config_number_of_blocks / dminfo % nprocs
-  remaining_blocks = config_number_of_blocks - &amp;
-         (blocks_per_proc_min * dminfo % nprocs)
-  even_blocks = config_number_of_blocks - remaining_blocks
-
-  blocks_per_proc = blocks_per_proc_min
-  if(proc_number .le. remaining_blocks) then
-    blocks_per_proc = blocks_per_proc + 1
-  end if
-end subroutine mpas_get_blocks_per_proc
-\end{lstlisting}
-
-\pagebreak
-
-Implementation of the mpas\_get\_local\_block\_id is as follows:
-
-\begin{lstlisting}[language=fortran,escapechar=@,frame=single]
-subroutine mpas_get_local_block_id(dminfo, &amp;
-           global_block_number, local_block_number)
-  type(domain_info), intent(in) :: dminfo
-  integer, intent(in)  :: global_block_number
-  integer, intent(out) :: local_block_number
-  integer :: blocks_per_proc_min, even_blocks, remaining_blocks
-
-  blocks_per_proc_min = config_number_of_blocks / dminfo % nprocs
-  remaining_blocks = config_number_of_blocks - &amp;
-         (blocks_per_proc_min * dminfo % nprocs)
-  even_blocks = config_number_of_blocks - remaining_blocks
-
-  if(global_block_number &gt; even_blocks) then
-        local_block_number = blocks_per_proc_min - 1
-  else
-    local_block_number = mod(global_block_id, blocks_per_proc_min)
-  end if
-end subroutine mpas_get_local_block_id
-\end{lstlisting}
-
-\pagebreak
-
-Implementation of the mpas\_get\_owning\_proc routine is as follows:
-
-\begin{lstlisting}[language=fortran,escapechar=@,frame=single]
-subroutine mpas_get_owning_proc(dminfo, &amp;
-           global_block_number, owning_proc)
-  type(domain_info), intent(in) :: dminfo
-  integer, intent(in) :: global_block_number
-  integer, intent(out) :: owning_proc
-  integer :: blocks_per_proc_min, even_blocks, remaining_blocks
-
-  blocks_per_proc_min = config_number_of_blocks / dminfo % nprocs
-  remaining_blocks = config_number_of_blocks - &amp;
-         (blocks_per_proc_min * dminfo % nprocs)
-  even_blocks = config_number_of_blocks - remaining_blocks
-
-  if(global_block_number &gt; even_blocks) then
-    owning_proc = global_block_number - even_blocks
-  else
-    owning_proc = global_block_number / blocks_per_proc_min
-  end if
-end subroutine mpas_get_owning_proc
-\end{lstlisting}
-
-\chapter{Testing}
-Only limited testing can be performed on this task. Since this task alone
-doesn't allow the use of multiple blocks the only testing that can really be
-performed is to provide a mis-matched number of blocks and MPI tasks and verify
-the block decomposition routines provide the correct block numbers for a
-processor and put the cells in their correct block numbers.
-
-\end{document}

Deleted: branches/omp_blocks/docs/mpas_ddt_redesign.pdf
===================================================================
(Binary files differ)

Deleted: branches/omp_blocks/docs/mpas_ddt_redesign.tex
===================================================================
--- branches/omp_blocks/docs/mpas_ddt_redesign.tex        2012-08-16 20:54:16 UTC (rev 2104)
+++ branches/omp_blocks/docs/mpas_ddt_redesign.tex        2012-08-16 20:57:13 UTC (rev 2105)
@@ -1,275 +0,0 @@
-\documentclass[11pt]{report}
-
-\usepackage{graphicx}
-\usepackage{listings}
-\usepackage{color}
-
-\setlength{\topmargin}{0in}
-\setlength{\headheight}{0in}
-\setlength{\headsep}{0in}
-\setlength{\textheight}{9.0in}
-\setlength{\textwidth}{6.5in}
-\setlength{\evensidemargin}{0in}
-\setlength{\oddsidemargin}{0in}
-
-
-\begin{document}
-
-\title{Revisions to MPAS data structures}
-\author{}
-
-\maketitle
-\tableofcontents
-
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%
-% Introduction
-%
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\chapter{Introduction}
-
-In order to support multiple blocks of cells per MPI task, there are a number of
-development issues that need to be addressed:
-
-\begin{enumerate}
-
-\item Update/extend the fundamental derived types in mpas\_grid\_types.F.                                
-   In order for other parts of the infrastructure to handle multiple                                
-   blocks per task in a clean way, we'll need to be able to pass a head                             
-   pointer to a field into a routine, and have that routine loop through                            
-   all blocks for that field, with information about which cells/edges/vertices                     
-   in that field need to be communicated.                                                           
-                                                                                                    
-\item Decide on a new MPAS I/O abstraction layer, which will provide a                                
-   high-level interface to the PIO layer for the rest of MPAS. This layer                           
-   should work with blocks of fields, and make it possible to define an                             
-   arbitrary set of I/O streams at run-time.                                                        
-                                                                                                    
-\item Add a new module to parse a run-time I/O configuration file that                                
-   will describe which fields are read or written to each of the I/O                                
-   streams that a user requests via the file. This module will make calls                           
-   to the new MPAS I/O layer to register the requested fields for I/O in                            
-   the requested streams.                                          
-   
-\item Update the mpas\_dmpar module to support communication operations on                              
-   multiple blocks per task. This will likely involve revising the                                  
-   internal data structures used to define communication of cells                                   
-   between tasks, and also require revisions to the public interface                                
-   routines themselves.                                                                             
-                                                                                                    
-\item Modify the block\_decomp module to enable a task to get a list of                                 
-   cells in more than one block that it is to be the owner of.                                      
-   Implemented in the simplest way, there could simply be a namelist                                
-   option to specify how many blocks each task should own, and the                                  
-   block\_decomp module could look for a graph.info.part.n file, with                                
-   n=num\_blocks\_per\_task*num\_tasks, and assign blocks k, 2k, 3k, ...,                               
-   num\_blocks\_per\_task*k to task k.    
-
-\end{enumerate}                                                             
-                                                                                                    
-This document concerns the first item, namely, the extensions to the derived data
-types that will be necessary for supporting multiple blocks per task in other infrastructure
-modules.       
-
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%
-% Requirements
-%
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\chapter{Requirements}
-
-The changes to the derived data types used throughout the MPAS infrastructure and cores
-should enable I/O, communication, and other infrastructure routines to elegantly handle multiple blocks per MPI task.
-
-\begin{itemize}
-
-\item Routines (e.g., operators) must be able to traverse the list of blocks for any field that is owned by a task without having
-to explicitly dereference that field by name; this ensures that infrastructure routines can remain generic.
-
-\item A block for a field must be able to access the parallel information (halo communication lists, as well as
-MPI communicator) associated with it so that such information is never explicitly passed with the field
-to infrastructure subroutines. This requirement will simplify the argument lists for infrastructure routines, and 
-eliminate the possibility that a user might pass mismatched or invalid communication information for a field
-to an infrastructure routine.
-
-\item A field must be aware of its dimensions and other metadata so that such information is never explicitly 
-passed with the field to infrastructure subroutines, thereby eliminating the possibility that a user might pass incorrect dimensions
-for a field, for example.
-
-\item Since halo updates may require exchanges between blocks owned by the same process, the data
-structures used by the halo update routines (and other routines in mpas\_dmpar.F) must distinguish between
-halo cells in other blocks owned by the MPI task from those in blocks owned by a different MPI task.
-
-\item Though not strictly related to supporting multiple blocks per MPI task, halo update data structures should
-enable halo exchange routines to easily exchange any subset of the ghost cell layers. This may enable efficiency
-gains to be made in future.
-
-\end{itemize}
-
-
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%
-% Design
-%
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\chapter{Design}
-
-We propose to extend the existing data structures in MPAS with additional pointers
-between fields of the same type, and also with pointers within fields to the appropriate communication
-lists for that field. The set of communications lists will be extended to include separate lists for inter-process
-(distributed memory) and intra-process (shared-memory) exchanges, and each list will identify cells/edges/vertices
-to be exchanged for a single layer of ghost cells/edges/vertices, necessitating one list per halo layer. Also, additional metadata 
-will be carried around within each field type. The proposed changes 
-are highlighted in the field type definition below; other type definitions are given for reference, and the figure below 
-illustrates graphically the hierarchy of DDTs.
-
-\begin{figure}[htb]
-\begin{center}
-\includegraphics[width=6.5in]{ddt_reorg.pdf}
-\caption{An illustration of the current DDT structure: existing back-pointers and previous/next pointers are drawn in light arrows; new pointers to be added between field blocks are drawn heavy arrows.}
-\end{center}
-\end{figure}
-
-Besides the simple additions to the derived types described here, we will also need to extend
-the infrastructure routines that deal with allocating, deallocating, and reading in fields to be aware that there may be multiple
-blocks for a field; however, this work will be addressed by work on items 2, 4, and 5 identified in the Introduction to this document.
-\pagebreak
-
-\begin{lstlisting}[language=fortran,escapechar=@,frame=single]
-! Derived type for storing list of blocks from a domain 
-! to be handled by a process
-type domain_type
-   type (block_type), pointer :: blocklist
-
-   ! Also store parallelization info here
-   type (dm_info), pointer :: dminfo
-end type domain_type
-\end{lstlisting}
-
-\begin{lstlisting}[language=fortran,escapechar=@,frame=single]
-type dm_info
-   integer :: nprocs, my_proc_id, comm, info
-end type dm_info
-\end{lstlisting}
-\vspace{12pt}
-
-In the block\_type, we will need to add a global block ID number, which uniquely identifies
-the block within the global block space. This will be used for both intra-process halo copies, as well
-as inter-process halo messages (in conjunction with the process ID that owns the block). 
-\linebreak
-
-\begin{lstlisting}[language=fortran,escapechar=@,frame=single]
-! Derived type for storing part of a domain; used as a basic 
-! unit of work for a process
-type block_type
-
-#include &quot;block_group_members.inc&quot;
-
-   type (domain_type), pointer :: domain
-
-   type (parallel_info), pointer :: parinfo
-   
-    @\colorbox{yellow}{integer :: blockID}@
-
-   type (block_type), pointer :: prev, next
-end type block_type
-\end{lstlisting}
-
-\begin{lstlisting}[language=fortran,escapechar=@,frame=single]
-type exchange_list
-   integer :: procID
-   @\colorbox{yellow}{integer :: blockID}@
-   integer :: nlist
-   integer, dimension(:), pointer :: list
-   type (exchange_list), pointer :: next
-   real (kind=RKIND), dimension(:), pointer :: rbuffer
-   integer, dimension(:), pointer           :: ibuffer
-   integer :: reqID
-end type exchange_list
-\end{lstlisting}   
-\vspace{12pt}
-
-In the parallel\_info type, the existing (inter-process) exchange lists will become arrays, 
-with the first index of the array providing an exchange list for the first halo layer, the second
-index for the second halo layer, etc. For example, cellsToSend(2) and cellsToRecv(2) give 
-information about which cells should be sent and received for a block to update the second
-(outer) halo layer. For cells, the interpretation of ``first halo layer'', ``second halo layer'', etc.
-are obvious, but we need to carefully define the interpretation of ``layers'' for edges and 
-vertices. We propose that the first halo layer for edges refers to the set of ghost edges bordering owned cells, 
-the second halo layer refers to the set of ghost edges bordering first halo cells, etc., and similarly
-for vertices.
-\linebreak
-
-\begin{lstlisting}[language=fortran,escapechar=@,frame=single]
-! Type for storing (possibly architecture specific) information 
-! concerning parallelism
-type parallel_info
-   type (exchange_list), @\colorbox{yellow}{dimension(:),}@ pointer :: cellsToSend    
-   type (exchange_list), @\colorbox{yellow}{dimension(:),}@ pointer :: cellsToRecv 
-   @\colorbox{yellow}{type (exchange\_list), dimension(:), pointer :: cellsToCopy}@ 
-    
-   type (exchange_list), @\colorbox{yellow}{dimension(:),}@ pointer :: edgesToSend    
-   type (exchange_list), @\colorbox{yellow}{dimension(:),}@ pointer :: edgesToRecv 
-   @\colorbox{yellow}{type (exchange\_list), dimension(:), pointer :: edgesToCopy}@    
-   
-   type (exchange_list), @\colorbox{yellow}{dimension(:),}@ pointer :: verticesToSend      
-   type (exchange_list), @\colorbox{yellow}{dimension(:),}@ pointer :: verticesToRecv
-   @\colorbox{yellow}{type (exchange\_list), dimension(:), pointer :: verticesToCopy}@
-    
-end type parallel_info
-\end{lstlisting}
-\vspace{12pt}
-
-Each field will carry around its dimensions, as well as whether it has a time dimension in input
-and output files, pointers to the previous and next block for the field, and pointers to the exchange
-lists for the field; if the field is a non-decomposed field, the exchange pointers will be nullified.
-\linebreak
-
-\begin{lstlisting}[language=fortran,escapechar=@,frame=single]
-! Derived type for storing fields
-type field3DReal
-   type (block_type), pointer :: block
-   real (kind=RKIND), dimension(:,:,:), pointer :: array
-   type (io_info), pointer :: ioinfo
-   @\colorbox{yellow}{integer, dimension(3) :: dims}@
-   @\colorbox{yellow}{logical :: timeDimension}@
-   @\colorbox{yellow}{type (field3DReal), pointer :: prev, next}@
-   @\colorbox{yellow}{type (exchange\_list), dimension(:), pointer :: sendList}@
-   @\colorbox{yellow}{type (exchange\_list), dimension(:), pointer :: recvList}@
-   @\colorbox{yellow}{type (exchange\_list), dimension(:), pointer :: copyList}@
-end type field3DReal
-\end{lstlisting}
-\vspace{12pt}
-
-The io\_info type will be extended to contain units and description information for the field.
-\linebreak
-
-\begin{lstlisting}[language=fortran,escapechar=@,frame=single]
-! Derived type describing info for doing I/O specific to a field
-type io_info
-   character (len=1024) :: fieldName
-   @\colorbox{yellow}{character (len=1024) :: units}@
-   @\colorbox{yellow}{character (len=1024) :: description}@
-   integer, dimension(4) :: start
-   integer, dimension(4) :: count
-   logical :: input
-   logical :: sfc
-   logical :: restart
-   logical :: output
-end type io_info
-\end{lstlisting}
-
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%
-% Implementation
-%
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\chapter{Implementation}
-
-Should we outline a plan for implementing these changes?
-
-\end{document}

Deleted: branches/omp_blocks/docs/mpas_multiple_blocks.pdf
===================================================================
(Binary files differ)

Deleted: branches/omp_blocks/docs/mpas_multiple_blocks.tex
===================================================================
--- branches/omp_blocks/docs/mpas_multiple_blocks.tex        2012-08-16 20:54:16 UTC (rev 2104)
+++ branches/omp_blocks/docs/mpas_multiple_blocks.tex        2012-08-16 20:57:13 UTC (rev 2105)
@@ -1,474 +0,0 @@
-\documentclass[11pt]{report}
-
-\usepackage{graphicx}
-\usepackage{listings}
-\usepackage{color}
-\usepackage{placeins}
-
-\setlength{\topmargin}{0in}
-\setlength{\headheight}{0in}
-\setlength{\headsep}{0in}
-\setlength{\textheight}{9.0in}
-\setlength{\textwidth}{6.5in}
-\setlength{\evensidemargin}{0in}
-\setlength{\oddsidemargin}{0in}
-
-
-\begin{document}
-
-\title{Implementing Multiple Blocks within MPAS Framework}
-\author{}
-
-\maketitle
-\tableofcontents
-
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%
-% Introduction
-%
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\chapter{Introduction}
-
-Previously several projects have been worked on with the end goal of supporting
-multiple blocks. These tasks are described below.
-
-\begin{enumerate}
-
-\item Update/extend the fundamental derived types in mpas\_grid\_types.F.                                
-   In order for other parts of the infrastructure to handle multiple                                
-   blocks per task in a clean way, we'll need to be able to pass a head                             
-   pointer to a field into a routine, and have that routine loop through                            
-   all blocks for that field, with information about which cells/edges/vertices                     
-   in that field need to be communicated.                                                           
-                                                                                                    
-\item Decide on a new MPAS I/O abstraction layer, which will provide a                                
-   high-level interface to the PIO layer for the rest of MPAS. This layer                           
-   should work with blocks of fields, and make it possible to define an                             
-   arbitrary set of I/O streams at run-time.                                                        
-                                                                                                    
-\item Add a new module to parse a run-time I/O configuration file that                                
-   will describe which fields are read or written to each of the I/O                                
-   streams that a user requests via the file. This module will make calls                           
-   to the new MPAS I/O layer to register the requested fields for I/O in                            
-   the requested streams.                                          
-   
-\item Update the mpas\_dmpar module to support communication operations on                              
-   multiple blocks per task. This will likely involve revising the                                  
-   internal data structures used to define communication of cells                                   
-   between tasks, and also require revisions to the public interface                                
-   routines themselves.                                                                             
-                                                                                                    
-\item Modify the block\_decomp module to enable a task to get a list of                                 
-   cells in more than one block that it is to be the owner of.                                      
-   Implemented in the simplest way, there could simply be a namelist                                
-   option to specify how many blocks each task should own, and the                                  
-   block\_decomp module could look for a graph.info.part.n file, with                                
-   n=num\_blocks\_per\_task*num\_tasks, and assign blocks k, 2k, 3k, ...,                               
-   num\_blocks\_per\_task*k to task k.    
-
-\end{enumerate}                                                             
-
-This document related to tying all of these projects together, and allowing
-MPAS to run with multiple blocks per MPI process.
-
-As an example of what running with multiple blocks means, currently MPAS is
-allowed to run with 1 block per process. This means prior to running MPAS a
-decomposition of cells needs to be determined. This decomposition tells each
-MPI process which cells it owns. So, under the current framework the number of
-decompositions have to be equal to the number of MPI tasks used to run the job. 
-
-After this project is completed, a user should be able to specify the use of a
-decomposition that does not have an equal number of blocks as the number of
-processors the job is run with. Typically this would be used to allow more than
-one block per processor, but could theoretically be used to run having some
-processors not have any blocks.
-
-The goal with this project is to allow exploration of OpenMP directives, and
-test performance using different block sizes. Allowing multiple blocks per
-processor could increase cache reuse and allow a performance increase.
-
-This work is currently being performed under
-branches/omp\_blocks/multiple\_blocks and all source code changes can be
-examined there.
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%
-% Requirements
-%
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\chapter{Requirements}
-
-There are significant changes to MPAS' framework that have to be made in order
-to support multiple blocks. A list of requirements that determine these changes
-are listed below, with the reasons for these requirements written below them.
-
-\begin{itemize}
-        \item Block creation must be robust, and handle an arbitrary number
-                of blocks per processor.
-
-        \item Blocks should be created using the derived data types created in an
-                earlier project, promoting the use of field data types rather than
-                simple arrays.
-
-        \item Block creation routines should be created with an arbitrary number of
-                halos assumed, although the default is currently two.
-
-        \item All block communication routines should be able to handle shared
-                memory copies.
-
-        \item Exchange list creation should be performed at the block/field level.
-
-        \item Block creation code should be isolated from the rest of MPAS code.
-\end{itemize}
-
-Blocks per processor should be allowed to be any non-negative number, including
-zero. This could be useful if a user wanted the ability to specify certain
-processors to do certain tasks, without doing any actual computation work on
-blocks. Although the user would have to give an explicit block to proc
-decomposition in order to have this ability used.
-
-In the creation of blocks, field data types should be used in place of simple
-arrays to promote the use of internal derived data types that are used
-elsewhere within MPAS. This will allow similar techniques to be identified by
-developers of cores, and allow a similar work flow with variables and fields
-within all of MPAS.
-
-Although fields currently are restricted to having two halo layers, at some
-point in the future we might like to be able to extend halo layers or even have
-different halo layers on each field. In order to make this task easier to
-accomplish in the future block creation routines need to be able to create an
-arbitrary number of halo layers. 
-
-When two blocks are neighboring on a single processor shared memory copies
-could be used for halo exchanges and other sorts of block-to-block
-communications rather than using MPI send/recv routines.
-
-Exchange lists are limited in their functionality by the fact that the only
-information they have refer to the other processor/block involved in the
-communication. For example, if processor 0 owns block 0 and this has to send
-information from 15 cells to processor 2 block 5 then the send list for block 0
-only gives the information on where it has to send the information, while the
-receive list on block 5 gives information on where to receive the information
-from. Because of this, exchange lists have to be created on a per block basis,
-and linked to a specific block. This way each block knows which cells it's
-supposed to send/recv/copy to/from another block. Each field and block have
-their own exchange lists, so the creation of exchange lists should place them
-within these already existing structures.
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%
-% Design
-%
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\chapter{Design}
-
-Only a small amount of design has been completed thus far. So, all information
-in this section should be regarded as a work in progress for now. As a visual
-for the design process, the proposed module layout can be seen in figure
-\ref{fig:module_layout}.
-
-\begin{figure}[H!]
-        \centering
-        \includegraphics[scale=0.4]{DesignLayout.eps}
-        \caption{Layout of modules for input/output with multiple blocks}
-        \label{fig:module_layout}
-\end{figure}
-
-The changes made to mpas framework can be seen in the following sections.
-
-\section{Changes in mpas\_dmpar}
-This section covers the changes, and the new functionality of the changes that
-were made within the mpas\_dmpar.F file. The first major change, is that dmpar
-is renamed to comm meaning communications. 
-
-\subsection{Data types}
-Previously the derived data type mpas\_exchange\_list was used to create a linked list which represented an exchange list (send or receive). Exchange lists have been modified from their original state to have the following structure.
-\begin{lstlisting}[language=fortran,escapechar=@,frame=single]
-type mpas_exchange_list
- integer :: endPointID
- integer :: nlist
- integer, dimension(:), pointer :: srcList
- integer, dimension(:), pointer :: destList
- type (mpas_exchange_list), pointer :: next
-end type mpas_exchange_list
-\end{lstlisting}
-
-Within this structure endPointID can be either a blockID (for local copy) or a procID for mpi send/recv, nList represents the number of elements to be communication within this exchange list, srcList and destList represent the information for packing and unpacking data into buffers or for local copies from/to arrays.
-
-Seeing as the exchange lists no longer contain an array for the communication buffers a new data type was created which can be seen below.
-
-\begin{lstlisting}[language=fortran,escapechar=@,frame=single]
-type mpas_communication_list
- integer :: procID
- integer :: nlist
- real (kind=RKIND), dimension(:), pointer :: rbuffer
- integer, dimension(:), pointer :: ibuffer
- integer :: reqID
- type (mpas_communication_list), pointer :: next
-end type mpas_communication_list
-\end{lstlisting}
-
-An mpas\_communcation\_list is only intended to be used for mpi communications. These have to be created and destroyed each time a communcation is performed. Within the structure, procID represents the other endPoint's processor ID in the communication, nList is the number of elements to be communicated within the buffer, rbuffer and ibuffer are the pointers for the buffer of either integers or reals, reqID represents the mpi communcation id, and next creates a linked list.
-
-Two other data structures are created to allow multi halo exchange lists, and to allow pointers to be swapped easily using them.
-
-\begin{lstlisting}[language=fortran,escapechar=@,frame=single]
-type mpas_exchange_list_pointer
- type (mpas_exchange_list), pointer :: exchList
-end type mpas_exchange_list_pointer
-
-type mpas_multihalo_exchange_list
- type (mpas_exchange_list_pointer), dimension(:), pointer :: halos
-end type mpas_multihalo_exchange_list
-\end{lstlisting}
-
-Combining these four structures allows local and mpi communications to occur smoothly.
-
-\subsection{mpas\_comm\_get\_exch\_list}
-The old routine named mpas\_dmpar\_get\_owner\_list is now renamed to mpas\_comm\_get\_exch\_list. This routine is meant to create send, receive, and copy lists to send data from one processor to another. During initialization it's used for the allToAll communication routines (which will be described below) but within cores it's almost exclusively used for halo exchanges.
-
-It works by creating two lists of element id's (typically cells, edges, or vertices). One of these lists is owned elements while the other is needed elements. The needed list is communication round robin style to each processor until it comes back to the original processor. Each processor marks a needed element in the list as owned if it owns it. This way the processor that needs the element knows who it's supposed to receive the element from.
-
-During the round robin communications send lists are created as needed elements are marked as owned. After the round robin communications are finished receive lists are created. And after receive lists are created copy lists are created in a similar fashion to send lists.
-
-\subsection{allToAll routines}
-mpas\_comm provides a set of allToAll routines intended to distribute a field from one processor to one or more other processors. In this case, the sending information is supposed to include the 0 halo elements. In contrast to the exch\_halo routines which are intended to only communication 1+ halo elements.
-
-A pseudocode version of the allToAll routines can be seen below.
-\begin{lstlisting}[language=fortran,escapechar=@,frame=single]
-loop over fieldOut list
-  loop over recvList for specific field
-    create new communication list if needed
-  end loop
-end loop
-
-allocate recvList buffers and initiate mpi_irecvs
-
-loop over fieldIn list
-  loop over sendList for specific field
-    create new communication list if needed
-  end loop
-end loop
-
-allocate sendList buffers, copy data into buffer
-  initiate mpi_isends
-
-loop over fieldIn list
-  loop over copyList for specific field
-    loop over fieldOut list
-      if fieldOut % blockID == copyList % endPointID
-        use copy list to copy from fieldIn to fieldOut
-          end if
-        end loop
-  end loop
-end loop
-
-wait for mpi_irecvs
-  unpack buffer into fields
-
-wait for mpi_isends
-
-destroy buffers
-\end{lstlisting}
-
-\subsection{exch\_halo routines}
-mpas\_comm provides a set of halo exchange routines intended to distribute a set of 0 halo elements to other blocks that have them in their 1+ halo regions.
-
-A pseudocode version of the halo exchange routines can be seen below.
-\begin{lstlisting}[language=fortran,escapechar=@,frame=single]
-loop over field list
-  loop over recvList for specific field
-    create new communication list if needed
-  end loop
-end loop
-
-allocate recvList buffers and initiate mpi_irecvs
-
-loop over field list
-  loop over sendList for specific field
-    create new communication list if needed
-  end loop
-end loop
-
-allocate sendList buffers, copy data into buffer
-  initiate mpi_isends
-
-loop over field list
-  loop over copyList for specific field
-    loop over field list
-      if field % blockID == copyList % endPointID
-        use copy list to copy from fieldIn to fieldOut
-          end if
-        end loop
-  end loop
-end loop
-
-wait for mpi_irecvs
-  unpack buffer into fields
-
-wait for mpi_isends
-
-destroy buffers
-\end{lstlisting}
-
-\subsection{copy routines}
-mpas\_comm provides a set of routines intended to copy a field from the header block in a list of owned blocks to all other blocks in the list. These are needed during initialization to copy non-decomposed fields (fields that don't include the nCells, nEdges, or nVertices as a dimension) to all owned blocks.
-
-\subsection{Utility routines}
-In addition to communcation routines, mpas\_comm provides utility routines for the initialization and destruction of all derived data types discussed above.
-
-\section{mpas\_block\_creator.F}
-mpas\_block\_creator provides a new module for mpas that is used to create computational blocks. Given the information of a 0 halo, these routines create the 1+ halo regions for cells, edges, and vertices. They also initialize the list of local blocks.
-
-\subsection{Cell Routines}
-Routines to setup cell fields within a block are:
-\begin{lstlisting}[language=fortran,escapechar=@,frame=single]
-mpas_block_creator_setup_blocks_and_0halo_cells
-mpas_block_creator_build_0halo_cell_fields
-mpas_block_creator_build_cell_halos
-\end{lstlisting}
-
-These routines should be called in this order to properly setup the 0-1+ halo of cells. However, the build\_cell\_halos routine should not be called until all 0 halo fields are setup (including edges and vertices).
-
-\subsection{Edge/Vertex Routines}
-Routines used to setup edge/vertex fields within a block are:
-\begin{lstlisting}[language=fortran,escapechar=@,frame=single]
-mpas_block_creator_build_0_and_1halo_edge_fields
-mpas_block_creator_build_edge_halos
-\end{lstlisting}
-
-As mentioned in the cell routine section, the 0-1 halos of edges and vertices should be setup prior to setting up the 1+ halos of cells.
-
-\subsection{Utility Routines}
-Finally, two routines are provided to finalize the block initialization, and to re-index all fields in a block.
-
-\begin{lstlisting}[language=fortran,escapechar=@,frame=single]
-mpas_block_creator_finalize_block_init
-mpas_block_creator_reindex_block_fields
-\end{lstlisting}
-
-These routines complete the block creation processor, and provide the rest of a model with a list of fully setup blocks to compute on.
-
-\section{mpas\_io\_input changes}
-Within mpas\_io\_input the main mpas\_input\_state\_for\_domain routine has been trimmed significantly to make use of the new mpas\_block\_creator module the portions of the routine that were not able to be moved into the block\_creator module were moved to new routines within the io\_input module.
-
-This module also makes use of the new communication routines from mpas\_comm, as well as some routines in mpas\_block\_decomp.
-
-The new routines provided to clean up mpas\_input\_state\_for\_domain are:
-\begin{lstlisting}[language=fortran,escapechar=@,frame=single]
-mpas_io_setup_cell_block_fields
-mpas_io_setup_edge_block_fields
-mpas_io_setup_vertex_block_fields
-\end{lstlisting}
-These routines are intended to read in contiguous chunks of data that can then be communication between processors.
-
-\section{mpas\_grid\_types changes}
-Within mpas\_grid\_types, utility routines are created to deallocate fields. This is used within mpas\_io\_input for fields that need to be linked similarly to block, but are not part of the block data structure.
-
-In addition to utility routine additions, a pointer provis was created within the block\_type. provis is intended to be a scratch state. This can be used within time integration routines that require an additional time level, without having to modify the number of time levels within state. 
-
-\section{Namelist changes}
-With the addition of multiple blocks in the framework of mpas, the decomposition namelist section will be made use of. This section provides the following namelist options.
-\begin{lstlisting}[language=fortran,escapechar=@,frame=single]
-config_block_decomp_file_prefix
-config_number_of_blocks
-config_explicit_proc_decomp
-config_proc_decomp_file_prefix
-\end{lstlisting}
-
-The prefix options are used to specify the prefixes on decomposition graph files used to create blocks, and determine which blocks are owned by which processors, config\_number\_of\_blocks determines how many blocks the simulation is supposed to be run with, and config\_explicit\_proc\_decomp is a logical flag which determines if mpas should look for a graph file describing how blocks should be distributed between processor, or if it should round robin assign blocks to processors.
-
-In addition to the decomposition section changes, the model sections (like sw\_model) now has a new namelist option:
-
-\begin{lstlisting}[language=fortran,escapechar=@,frame=single]
-config_num_halos
-\end{lstlisting}
-
-This namelist flag determines how many halo layers each block should have on cells. The halo layers for edges and vertices are nHaloLayerCells+1, or config\_num\_halos + 1.
-
-\chapter{Testing}
-**NOTE**
-All of the testing described in this section relates only to the ocean core.
-Other core developers may test this with similar procedures but different
-simulations. \\
-
-The end goal from this project is to provide a framework that allows
-bit-for-bit reproduction of data using an arbitrary combination of blocks and
-processor numbers.
-
-Using this goal to define a testing strategy implies a good test would be
-exploring bit-for-bit reproduction of output data using the three following
-simulations:
-\begin{itemize}
-        \item Current trunk simulation run with 8 processors and 8 blocks (1 block per proc).
-        \item Finished branch simulation run with 8 processors and 8 blocks (1 block per proc).
-        \item Finished branch simulation run with 1 processor and 8 blocks (8 blocks per proc).
-        \item Finished branch simulation run with 2 processors and 8 blocks (4 blocks per proc).
-\end{itemize}
-
-If all of these simulations produce bit-for-bit output then testing can move on
-to a set of larger scale simulations.
-
-\begin{itemize}
-        \item Current trunk 15km simulation with 1200 processors and 1200 blocks (1 block per proc).
-        \item Finished branch simulation with 1200 processors and 1200 blocks (1 block per proc).
-        \item Finished branch simulation with 600 processors and 1200 blocks (2 blocks per proc).
-        \item Finished branch simulation with 24 processors and 1200 blocks (50 blocks per proc).
-\end{itemize}
-
-After these final four simulations show bit-for-bit output then the project can
-be deemed as completed.
-
-\chapter{Appendix - Use of exchange/communication lists}
-This chapter will describe the use of exchange and communication lists.
-
-To begin, exchange lists have two uses. First copyLists will be described,
-followed by send/recvLists.
-
-copyLists are attached to the block sending the data, and there is no matching
-list on the receiving end. Within the copyList, the endPointID variable
-represents a blockID giving the local id to the block on the other end of the
-communication, nList is the total number of elements that need to be copied,
-srcList is the list of indices to take this data from out of the owning field's
-array, and destList is the list of indices to put this data into the needing
-field's array. 
-
-In using copyLists, first a search over blocks needs to be preformed
-to find the matching block for the communication. After that the elements
-listed in srcList are copied into the elements listed in destList. After which,
-the shared memory copy is complete.
-
-The second use case relates to send/recvLists. sendLists are attached to
-sending blocks, while recvLists are attached to receiving blocks. Within both
-of these, endPointID refers to a processor id, and nList refers to the number
-of elements a specific block should expect to communicate. In a sendList,
-srcList describes the indices to pull data out from the owning field's array
-while destList descibes the indices to put that data into a communication
-list's buffer. In a recvList, srcList describes the indices to pull the data
-out of the buffer, while destList describes the indices to put that data into
-the needing field's array.
-
-In order to use these, each side of the communication does something different.
-Before describing the use of send and recv lists, communication lists need to
-be explained.
-
-A communication list describes aggregated communications between processors.
-These provide an easy to use framework to allow communications to occur
-processor by processor as opposed to block by block. Since communication lists
-only relate to MPI communications, the only ID within the type is procID. nList
-refers to the number of elements in the buffer, while rbuffer and ibuffer
-provide deallocated arrays to put reals or integers in the buffer, and reqID
-provides a variable to store MPI communication ID's to use when calling
-MPI\_Wait.
-
-In order to perform a send an receive, first a processor needs to build the
-buffers, or communication lists. To begin the fields relating to the specific
-communication are looped over, and the total number of elements to each
-processor are stored in order to build a communication list for that processor.
-After this step, the communication list buffers are allocated relating to their
-nList varibles. Buffers need to be created both on the sending and receiving
-side. After the buffers are created, the sending field copies all of it's data
-into the array. The buffer is then sent, and on the receiving end the receiving
-field unpacks all of the data into it's arrays.
-\end{document}

Copied: trunk/documents/shared/finished_design_doc/block_decomp_redesign/mpas_block_decomp_redesign.pdf (from rev 2048, branches/omp_blocks/docs/mpas_block_decomp_redesign.pdf)
===================================================================
(Binary files differ)

Copied: trunk/documents/shared/finished_design_doc/block_decomp_redesign/mpas_block_decomp_redesign.tex (from rev 2048, branches/omp_blocks/docs/mpas_block_decomp_redesign.tex)
===================================================================
--- trunk/documents/shared/finished_design_doc/block_decomp_redesign/mpas_block_decomp_redesign.tex                                (rev 0)
+++ trunk/documents/shared/finished_design_doc/block_decomp_redesign/mpas_block_decomp_redesign.tex        2012-08-16 20:57:13 UTC (rev 2105)
@@ -0,0 +1,337 @@
+\documentclass[11pt]{report}
+
+\usepackage{graphicx}
+\usepackage{listings}
+\usepackage{color}
+
+\setlength{\topmargin}{0in}
+\setlength{\headheight}{0in}
+\setlength{\headsep}{0in}
+\setlength{\textheight}{9.0in}
+\setlength{\textwidth}{6.5in}
+\setlength{\evensidemargin}{0in}
+\setlength{\oddsidemargin}{0in}
+
+
+\begin{document}
+
+\title{Revisions to MPAS block decomposition routines}
+\author{}
+
+\maketitle
+\tableofcontents
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% Introduction
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\chapter{Introduction}
+
+In order to support multiple blocks of cells per MPI task, there are a number of
+development issues that need to be addressed:
+
+\begin{enumerate}
+
+\item Update/extend the fundamental derived types in mpas\_grid\_types.F.                                
+   In order for other parts of the infrastructure to handle multiple                                
+   blocks per task in a clean way, we'll need to be able to pass a head                             
+   pointer to a field into a routine, and have that routine loop through                            
+   all blocks for that field, with information about which cells/edges/vertices                     
+   in that field need to be communicated.                                                           
+                                                                                                    
+\item Decide on a new MPAS I/O abstraction layer, which will provide a                                
+   high-level interface to the PIO layer for the rest of MPAS. This layer                           
+   should work with blocks of fields, and make it possible to define an                             
+   arbitrary set of I/O streams at run-time.                                                        
+                                                                                                    
+\item Add a new module to parse a run-time I/O configuration file that                                
+   will describe which fields are read or written to each of the I/O                                
+   streams that a user requests via the file. This module will make calls                           
+   to the new MPAS I/O layer to register the requested fields for I/O in                            
+   the requested streams.                                          
+   
+\item Update the mpas\_dmpar module to support communication operations on                              
+   multiple blocks per task. This will likely involve revising the                                  
+   internal data structures used to define communication of cells                                   
+   between tasks, and also require revisions to the public interface                                
+   routines themselves.                                                                             
+                                                                                                    
+\item Modify the block\_decomp module to enable a task to get a list of                                 
+   cells in more than one block that it is to be the owner of.                                      
+   Implemented in the simplest way, there could simply be a namelist                                
+   option to specify how many blocks each task should own, and the                                  
+   block\_decomp module could look for a graph.info.part.n file, with                                
+   n=num\_blocks\_per\_task*num\_tasks, and assign blocks k, 2k, 3k, ...,                               
+   num\_blocks\_per\_task*k to task k.    
+
+\end{enumerate}                                                             
+                                                                                                    
+This document concerns the last item, namely, the extensions to the block decomposition
+module that will be necessary for supporting multiple blocks per task in other infrastructure
+modules. \\
+
+For a broader scope of this project, the intent with these five previously
+detailed tasks is to provide the capabilities within MPAS to support PIO and
+simulations where the number of blocks in a decomposition are not equal to the
+number of MPI tasks. For example, a simulation could run on 16 processors with
+a total of 64 blocks, as opposed to the current framework where only 16 blocks
+can run at 16 processors. \\
+
+After these tasks are implemented shared memory parallism can be implemented at
+the core level to (hopefully) improve performance, but also allow greater
+flexibility in terms of the parallel infrastructre of MPAS. \\
+
+As a rough timeline, these 5 tasks are planned to be completed by the end of February, 2012.
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% Requirements
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\chapter{Requirements}
+
+The changes to the block decomposition module should enable an MPI task to get
+a list of it's owned cells, as well as the block number each of those cells
+lives on within it's task.
+
+\begin{itemize}
+
+        \item The user must be able to specify the number of blocks in a
+                simulation.
+
+        \item Block decomposition modules must provide information describing the
+                cell and block relationship for a given MPI task.
+
+        \item Block decomposition modules need to be flexible enough to support
+                multiple methods of acquiring a decomposition.
+
+        \item Block decomposition modules need to support a different number of
+                blocks than MPI tasks, even when they are not evenly divisible.
+
+        \item Block decomposition modules should provide an interface to map a
+                global block number to local block number, and owning processor number.
+\end{itemize}
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% Design
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\chapter{Design}
+
+We propose several changes to the block decomposition module in order to
+support multiple blocks per MPI task. Currently, in order to support the case
+where there are multiple blocks per MPI task a namelist parameter needs to be
+added that will allow these two values to differ. \\
+
+First, changes to the namelist.input file include a new section called
+decomposition. This section will include four parameters. The first being
+config\_number\_of\_blocks which is an integer representation of the number of
+blocks a run should use. Second is config\_block\_decomp\_file\_prefix, which
+represents the path and prefix (before the .N) of the file for the block
+decomposition. Third is config\_proc\_decomp\_file\_prefix representing the
+path and prefix (before the .Np) to the file for the processor decomposition.
+Finally is config\_explicit\_proc\_decomp which is logical and tells MPAS to
+use the config\_proc\_decomp\_file for the distribution of blocks, or to use
+the built in method of distributing the blocks to processors.\\
+
+config\_number\_of\_blocks option will have a default value of
+0. A value of 0 in this field means there should be nProcs blocks, or one block
+for every MPI task, which is the default behavior currently.
+config\_block\_decomp\_file\_prefix is read by default and
+config\_proc\_decomp\_file\_prefix is only read for external block assignment,
+as will be described later.\\
+
+Inside mpas\_block\_decomp.F, the mpas\_block\_decomp\_cells\_for\_proc needs
+to be changed.  To not only read in all cells in all blocks, but also their
+block numbers. \\
+
+The meaning of the contents of graph.info.part.N needs to change from the
+processor ID that owns a cell, to the global block number for a cell. This
+means the file that is read in with have N = config\_number\_of\_blocks. \\
+
+Given a graph.info.part.N file, the global block number needs to be mapped into
+both an owning processor number, and a local block id. The local block id does
+not need to be computed within mpas\_block\_decomp\_cells\_for\_proc as long as
+the mapping is available or known. \\
+
+The api for mpas\_block\_decomp\_cells\_for\_proc will change from
+
+\begin{lstlisting}[language=fortran,escapechar=@,frame=single]
+subroutine mpas_block_decomp_cells_for_proc(dminfo,  &amp;
+           partial_global_graph_info, local_cell_list)
+\end{lstlisting}
+
+to
+
+\begin{lstlisting}[language=fortran,escapechar=@,frame=single]
+subroutine mpas_block_decomp_cells_for_proc(dminfo, &amp;
+           partial_global_graph_info, local_cell_list, @\colorbox{yellow}{block\_id}@, &amp;
+                   @\colorbox{yellow}{block\_start}@, @\colorbox{yellow}{block\_count}@)
+\end{lstlisting}
+
+where local\_cell\_list is a list of cells owned by a processor that is sorted
+by local block id, block\_id is a list of global block id's that an MPI task
+owns, block\_start is a list of offsets in local\_cell\_list for the contiguous
+cells a block owns, and block\_count is a the number of cells each block owns. \\
+
+mpas\_block\_decomp\_cells\_for\_proc will perform the same regardless of
+number of processors to enable the use of multiple blocks on a single
+processor. \\
+
+The block\_type data structure will be extended to include the local block id.
+This can help make dynamic load balancing easier for implementation at a later
+time. This will change
+
+\begin{lstlisting}[language=fortran,escapechar=@,frame=single]
+   type block_type
+
+#include &quot;block_group_members.inc&quot;
+
+      integer :: blockID   ! Unique global ID number for this block
+
+      type (domain_type), pointer :: domain
+
+      type (parallel_info), pointer :: parinfo
+
+      type (block_type), pointer :: prev, next
+   end type block_type
+
+\end{lstlisting}
+
+to
+
+\begin{lstlisting}[language=fortran,escapechar=@,frame=single]
+   type block_type
+
+#include &quot;block_group_members.inc&quot;
+
+      integer :: blockID   ! Unique global ID number for this block
+      @\colorbox{yellow}{integer :: localBlockID}@
+
+      type (domain_type), pointer :: domain
+
+      type (parallel_info), pointer :: parinfo
+
+      type (block_type), pointer :: prev, next
+   end type block_type
+
+\end{lstlisting}
+
+There will be three additions to the public interface of mpas\_block\_decomp.F
+The first adds the routine mpas\_get\_local\_block\_id which takes has three
+arguments. As input it takes the domain information and the global block
+number, and as output it provides the local block number on a processor. This
+allows other parts of MPAS to determine what local block number a global block
+is, even if it's on another processor. \\
+
+The second addition to the public interface is the subroutine
+mpas\_get\_owning\_proc. This subroutine takes as input the domain information
+and the global block number, and as output provides the MPI task number that
+owns the block. This allows other parts of MPAS to determine from a block
+number which MPI task it needs to communicate with to read/write this block. \\
+
+The third public routine is called mpas\_get\_blocks\_per\_proc. This routine
+takes as input the domain information and a processor number. On output
+blocks\_per\_proc contains the number of blocks a processor owns. \\
+
+In addition to the ad-hoc method of determining which blocks belong to which
+processors, a file based method will be added. This method will be toggelable
+by a namelist option named config\_explicit\_proc\_decomp, which will be logical.
+If this option is true, a file (config\_proc\_decomp\_file\_prefix.N) will be
+provided, where N is the number of processors. This file will have number of
+blocks lines, and each line will say what processor should own the block. This
+file can be created using metis externally. \\
+
+%\begin{lstlisting}[language=fortran,escapechar=@,frame=single]
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% Implementation
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\chapter{Implementation}
+
+Implementation of the mpas\_get\_blocks\_per\_proc subroutine is as follows:
+
+\begin{lstlisting}[language=fortran,escapechar=@,frame=single]
+subroutine mpas_get_blocks_per_proc(dminfo, proc_number, blocks_per_proc)
+  type(domain_info), intent(in) :: dminfo
+  integer, intent(in) :: proc_number
+  integer, intent(out) :: blocks_per_proc
+  integer :: blocks_per_proc_min, even_blocks, remaining_blocks
+
+  blocks_per_proc_min = config_number_of_blocks / dminfo % nprocs
+  remaining_blocks = config_number_of_blocks - &amp;
+         (blocks_per_proc_min * dminfo % nprocs)
+  even_blocks = config_number_of_blocks - remaining_blocks
+
+  blocks_per_proc = blocks_per_proc_min
+  if(proc_number .le. remaining_blocks) then
+    blocks_per_proc = blocks_per_proc + 1
+  end if
+end subroutine mpas_get_blocks_per_proc
+\end{lstlisting}
+
+\pagebreak
+
+Implementation of the mpas\_get\_local\_block\_id is as follows:
+
+\begin{lstlisting}[language=fortran,escapechar=@,frame=single]
+subroutine mpas_get_local_block_id(dminfo, &amp;
+           global_block_number, local_block_number)
+  type(domain_info), intent(in) :: dminfo
+  integer, intent(in)  :: global_block_number
+  integer, intent(out) :: local_block_number
+  integer :: blocks_per_proc_min, even_blocks, remaining_blocks
+
+  blocks_per_proc_min = config_number_of_blocks / dminfo % nprocs
+  remaining_blocks = config_number_of_blocks - &amp;
+         (blocks_per_proc_min * dminfo % nprocs)
+  even_blocks = config_number_of_blocks - remaining_blocks
+
+  if(global_block_number &gt; even_blocks) then
+        local_block_number = blocks_per_proc_min - 1
+  else
+    local_block_number = mod(global_block_id, blocks_per_proc_min)
+  end if
+end subroutine mpas_get_local_block_id
+\end{lstlisting}
+
+\pagebreak
+
+Implementation of the mpas\_get\_owning\_proc routine is as follows:
+
+\begin{lstlisting}[language=fortran,escapechar=@,frame=single]
+subroutine mpas_get_owning_proc(dminfo, &amp;
+           global_block_number, owning_proc)
+  type(domain_info), intent(in) :: dminfo
+  integer, intent(in) :: global_block_number
+  integer, intent(out) :: owning_proc
+  integer :: blocks_per_proc_min, even_blocks, remaining_blocks
+
+  blocks_per_proc_min = config_number_of_blocks / dminfo % nprocs
+  remaining_blocks = config_number_of_blocks - &amp;
+         (blocks_per_proc_min * dminfo % nprocs)
+  even_blocks = config_number_of_blocks - remaining_blocks
+
+  if(global_block_number &gt; even_blocks) then
+    owning_proc = global_block_number - even_blocks
+  else
+    owning_proc = global_block_number / blocks_per_proc_min
+  end if
+end subroutine mpas_get_owning_proc
+\end{lstlisting}
+
+\chapter{Testing}
+Only limited testing can be performed on this task. Since this task alone
+doesn't allow the use of multiple blocks the only testing that can really be
+performed is to provide a mis-matched number of blocks and MPI tasks and verify
+the block decomposition routines provide the correct block numbers for a
+processor and put the cells in their correct block numbers.
+
+\end{document}

Copied: trunk/documents/shared/finished_design_doc/ddt_redesign/ddt_reorg.pdf (from rev 2048, branches/omp_blocks/docs/ddt_reorg.pdf)
===================================================================
(Binary files differ)

Copied: trunk/documents/shared/finished_design_doc/ddt_redesign/mpas_ddt_redesign.pdf (from rev 2048, branches/omp_blocks/docs/mpas_ddt_redesign.pdf)
===================================================================
(Binary files differ)

Copied: trunk/documents/shared/finished_design_doc/ddt_redesign/mpas_ddt_redesign.tex (from rev 2048, branches/omp_blocks/docs/mpas_ddt_redesign.tex)
===================================================================
--- trunk/documents/shared/finished_design_doc/ddt_redesign/mpas_ddt_redesign.tex                                (rev 0)
+++ trunk/documents/shared/finished_design_doc/ddt_redesign/mpas_ddt_redesign.tex        2012-08-16 20:57:13 UTC (rev 2105)
@@ -0,0 +1,275 @@
+\documentclass[11pt]{report}
+
+\usepackage{graphicx}
+\usepackage{listings}
+\usepackage{color}
+
+\setlength{\topmargin}{0in}
+\setlength{\headheight}{0in}
+\setlength{\headsep}{0in}
+\setlength{\textheight}{9.0in}
+\setlength{\textwidth}{6.5in}
+\setlength{\evensidemargin}{0in}
+\setlength{\oddsidemargin}{0in}
+
+
+\begin{document}
+
+\title{Revisions to MPAS data structures}
+\author{}
+
+\maketitle
+\tableofcontents
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% Introduction
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\chapter{Introduction}
+
+In order to support multiple blocks of cells per MPI task, there are a number of
+development issues that need to be addressed:
+
+\begin{enumerate}
+
+\item Update/extend the fundamental derived types in mpas\_grid\_types.F.                                
+   In order for other parts of the infrastructure to handle multiple                                
+   blocks per task in a clean way, we'll need to be able to pass a head                             
+   pointer to a field into a routine, and have that routine loop through                            
+   all blocks for that field, with information about which cells/edges/vertices                     
+   in that field need to be communicated.                                                           
+                                                                                                    
+\item Decide on a new MPAS I/O abstraction layer, which will provide a                                
+   high-level interface to the PIO layer for the rest of MPAS. This layer                           
+   should work with blocks of fields, and make it possible to define an                             
+   arbitrary set of I/O streams at run-time.                                                        
+                                                                                                    
+\item Add a new module to parse a run-time I/O configuration file that                                
+   will describe which fields are read or written to each of the I/O                                
+   streams that a user requests via the file. This module will make calls                           
+   to the new MPAS I/O layer to register the requested fields for I/O in                            
+   the requested streams.                                          
+   
+\item Update the mpas\_dmpar module to support communication operations on                              
+   multiple blocks per task. This will likely involve revising the                                  
+   internal data structures used to define communication of cells                                   
+   between tasks, and also require revisions to the public interface                                
+   routines themselves.                                                                             
+                                                                                                    
+\item Modify the block\_decomp module to enable a task to get a list of                                 
+   cells in more than one block that it is to be the owner of.                                      
+   Implemented in the simplest way, there could simply be a namelist                                
+   option to specify how many blocks each task should own, and the                                  
+   block\_decomp module could look for a graph.info.part.n file, with                                
+   n=num\_blocks\_per\_task*num\_tasks, and assign blocks k, 2k, 3k, ...,                               
+   num\_blocks\_per\_task*k to task k.    
+
+\end{enumerate}                                                             
+                                                                                                    
+This document concerns the first item, namely, the extensions to the derived data
+types that will be necessary for supporting multiple blocks per task in other infrastructure
+modules.       
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% Requirements
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\chapter{Requirements}
+
+The changes to the derived data types used throughout the MPAS infrastructure and cores
+should enable I/O, communication, and other infrastructure routines to elegantly handle multiple blocks per MPI task.
+
+\begin{itemize}
+
+\item Routines (e.g., operators) must be able to traverse the list of blocks for any field that is owned by a task without having
+to explicitly dereference that field by name; this ensures that infrastructure routines can remain generic.
+
+\item A block for a field must be able to access the parallel information (halo communication lists, as well as
+MPI communicator) associated with it so that such information is never explicitly passed with the field
+to infrastructure subroutines. This requirement will simplify the argument lists for infrastructure routines, and 
+eliminate the possibility that a user might pass mismatched or invalid communication information for a field
+to an infrastructure routine.
+
+\item A field must be aware of its dimensions and other metadata so that such information is never explicitly 
+passed with the field to infrastructure subroutines, thereby eliminating the possibility that a user might pass incorrect dimensions
+for a field, for example.
+
+\item Since halo updates may require exchanges between blocks owned by the same process, the data
+structures used by the halo update routines (and other routines in mpas\_dmpar.F) must distinguish between
+halo cells in other blocks owned by the MPI task from those in blocks owned by a different MPI task.
+
+\item Though not strictly related to supporting multiple blocks per MPI task, halo update data structures should
+enable halo exchange routines to easily exchange any subset of the ghost cell layers. This may enable efficiency
+gains to be made in future.
+
+\end{itemize}
+
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% Design
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\chapter{Design}
+
+We propose to extend the existing data structures in MPAS with additional pointers
+between fields of the same type, and also with pointers within fields to the appropriate communication
+lists for that field. The set of communications lists will be extended to include separate lists for inter-process
+(distributed memory) and intra-process (shared-memory) exchanges, and each list will identify cells/edges/vertices
+to be exchanged for a single layer of ghost cells/edges/vertices, necessitating one list per halo layer. Also, additional metadata 
+will be carried around within each field type. The proposed changes 
+are highlighted in the field type definition below; other type definitions are given for reference, and the figure below 
+illustrates graphically the hierarchy of DDTs.
+
+\begin{figure}[htb]
+\begin{center}
+\includegraphics[width=6.5in]{ddt_reorg.pdf}
+\caption{An illustration of the current DDT structure: existing back-pointers and previous/next pointers are drawn in light arrows; new pointers to be added between field blocks are drawn heavy arrows.}
+\end{center}
+\end{figure}
+
+Besides the simple additions to the derived types described here, we will also need to extend
+the infrastructure routines that deal with allocating, deallocating, and reading in fields to be aware that there may be multiple
+blocks for a field; however, this work will be addressed by work on items 2, 4, and 5 identified in the Introduction to this document.
+\pagebreak
+
+\begin{lstlisting}[language=fortran,escapechar=@,frame=single]
+! Derived type for storing list of blocks from a domain 
+! to be handled by a process
+type domain_type
+   type (block_type), pointer :: blocklist
+
+   ! Also store parallelization info here
+   type (dm_info), pointer :: dminfo
+end type domain_type
+\end{lstlisting}
+
+\begin{lstlisting}[language=fortran,escapechar=@,frame=single]
+type dm_info
+   integer :: nprocs, my_proc_id, comm, info
+end type dm_info
+\end{lstlisting}
+\vspace{12pt}
+
+In the block\_type, we will need to add a global block ID number, which uniquely identifies
+the block within the global block space. This will be used for both intra-process halo copies, as well
+as inter-process halo messages (in conjunction with the process ID that owns the block). 
+\linebreak
+
+\begin{lstlisting}[language=fortran,escapechar=@,frame=single]
+! Derived type for storing part of a domain; used as a basic 
+! unit of work for a process
+type block_type
+
+#include &quot;block_group_members.inc&quot;
+
+   type (domain_type), pointer :: domain
+
+   type (parallel_info), pointer :: parinfo
+   
+    @\colorbox{yellow}{integer :: blockID}@
+
+   type (block_type), pointer :: prev, next
+end type block_type
+\end{lstlisting}
+
+\begin{lstlisting}[language=fortran,escapechar=@,frame=single]
+type exchange_list
+   integer :: procID
+   @\colorbox{yellow}{integer :: blockID}@
+   integer :: nlist
+   integer, dimension(:), pointer :: list
+   type (exchange_list), pointer :: next
+   real (kind=RKIND), dimension(:), pointer :: rbuffer
+   integer, dimension(:), pointer           :: ibuffer
+   integer :: reqID
+end type exchange_list
+\end{lstlisting}   
+\vspace{12pt}
+
+In the parallel\_info type, the existing (inter-process) exchange lists will become arrays, 
+with the first index of the array providing an exchange list for the first halo layer, the second
+index for the second halo layer, etc. For example, cellsToSend(2) and cellsToRecv(2) give 
+information about which cells should be sent and received for a block to update the second
+(outer) halo layer. For cells, the interpretation of ``first halo layer'', ``second halo layer'', etc.
+are obvious, but we need to carefully define the interpretation of ``layers'' for edges and 
+vertices. We propose that the first halo layer for edges refers to the set of ghost edges bordering owned cells, 
+the second halo layer refers to the set of ghost edges bordering first halo cells, etc., and similarly
+for vertices.
+\linebreak
+
+\begin{lstlisting}[language=fortran,escapechar=@,frame=single]
+! Type for storing (possibly architecture specific) information 
+! concerning parallelism
+type parallel_info
+   type (exchange_list), @\colorbox{yellow}{dimension(:),}@ pointer :: cellsToSend    
+   type (exchange_list), @\colorbox{yellow}{dimension(:),}@ pointer :: cellsToRecv 
+   @\colorbox{yellow}{type (exchange\_list), dimension(:), pointer :: cellsToCopy}@ 
+    
+   type (exchange_list), @\colorbox{yellow}{dimension(:),}@ pointer :: edgesToSend    
+   type (exchange_list), @\colorbox{yellow}{dimension(:),}@ pointer :: edgesToRecv 
+   @\colorbox{yellow}{type (exchange\_list), dimension(:), pointer :: edgesToCopy}@    
+   
+   type (exchange_list), @\colorbox{yellow}{dimension(:),}@ pointer :: verticesToSend      
+   type (exchange_list), @\colorbox{yellow}{dimension(:),}@ pointer :: verticesToRecv
+   @\colorbox{yellow}{type (exchange\_list), dimension(:), pointer :: verticesToCopy}@
+    
+end type parallel_info
+\end{lstlisting}
+\vspace{12pt}
+
+Each field will carry around its dimensions, as well as whether it has a time dimension in input
+and output files, pointers to the previous and next block for the field, and pointers to the exchange
+lists for the field; if the field is a non-decomposed field, the exchange pointers will be nullified.
+\linebreak
+
+\begin{lstlisting}[language=fortran,escapechar=@,frame=single]
+! Derived type for storing fields
+type field3DReal
+   type (block_type), pointer :: block
+   real (kind=RKIND), dimension(:,:,:), pointer :: array
+   type (io_info), pointer :: ioinfo
+   @\colorbox{yellow}{integer, dimension(3) :: dims}@
+   @\colorbox{yellow}{logical :: timeDimension}@
+   @\colorbox{yellow}{type (field3DReal), pointer :: prev, next}@
+   @\colorbox{yellow}{type (exchange\_list), dimension(:), pointer :: sendList}@
+   @\colorbox{yellow}{type (exchange\_list), dimension(:), pointer :: recvList}@
+   @\colorbox{yellow}{type (exchange\_list), dimension(:), pointer :: copyList}@
+end type field3DReal
+\end{lstlisting}
+\vspace{12pt}
+
+The io\_info type will be extended to contain units and description information for the field.
+\linebreak
+
+\begin{lstlisting}[language=fortran,escapechar=@,frame=single]
+! Derived type describing info for doing I/O specific to a field
+type io_info
+   character (len=1024) :: fieldName
+   @\colorbox{yellow}{character (len=1024) :: units}@
+   @\colorbox{yellow}{character (len=1024) :: description}@
+   integer, dimension(4) :: start
+   integer, dimension(4) :: count
+   logical :: input
+   logical :: sfc
+   logical :: restart
+   logical :: output
+end type io_info
+\end{lstlisting}
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% Implementation
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\chapter{Implementation}
+
+Should we outline a plan for implementing these changes?
+
+\end{document}

Added: trunk/documents/shared/finished_design_doc/multiple_blocks/DesignLayout.eps
===================================================================
--- trunk/documents/shared/finished_design_doc/multiple_blocks/DesignLayout.eps                                (rev 0)
+++ trunk/documents/shared/finished_design_doc/multiple_blocks/DesignLayout.eps        2012-08-16 20:57:13 UTC (rev 2105)
@@ -0,0 +1,911 @@
+%!PS-Adobe-3.0 EPSF-3.0 
+%%BoundingBox: 0 0 794 595
+%%Pages: 0
+%%Creator: LibreOffice 3.5
+%%Title: none
+%%CreationDate: none
+%%LanguageLevel: 2
+%%EndComments
+%%BeginProlog
+%%BeginResource: procset SDRes-Prolog 1.0 0
+/b4_inc_state save def
+/dict_count countdictstack def
+/op_count count 1 sub def
+userdict begin
+0 setgray 0 setlinecap 1 setlinewidth 0 setlinejoin 10 setmiterlimit[] 0 setdash newpath
+/languagelevel where {pop languagelevel 1 ne {false setstrokeadjust false setoverprint} if} if
+/bdef {bind def} bind def
+/c {setgray} bdef
+/l {neg lineto} bdef
+/rl {neg rlineto} bdef
+/lc {setlinecap} bdef
+/lj {setlinejoin} bdef
+/lw {setlinewidth} bdef
+/ml {setmiterlimit} bdef
+/ld {setdash} bdef
+/m {neg moveto} bdef
+/ct {6 2 roll neg 6 2 roll neg 6 2 roll neg curveto} bdef
+/r {rotate} bdef
+/t {neg translate} bdef
+/s {scale} bdef
+/sw {show} bdef
+/gs {gsave} bdef
+/gr {grestore} bdef
+/f {findfont dup length dict begin
+{1 index /FID ne {def} {pop pop} ifelse} forall /Encoding ISOLatin1Encoding def
+currentdict end /NFont exch definefont pop /NFont findfont} bdef
+/p {closepath} bdef
+/sf {scalefont setfont} bdef
+/ef {eofill}bdef
+/pc {closepath stroke}bdef
+/ps {stroke}bdef
+/pum {matrix currentmatrix}bdef
+/pom {setmatrix}bdef
+/bs {/aString exch def /nXOfs exch def /nWidth exch def currentpoint nXOfs 0 rmoveto pum nWidth aString stringwidth pop div 1 scale aString show pom moveto} bdef
+%%EndResource
+%%EndProlog
+%%BeginSetup
+%%EndSetup
+%%Page: 1 1
+%%BeginPageSetup
+%%EndPageSetup
+pum
+0.02835 0.02833 s 
+0 -21000 t
+/tm matrix currentmatrix def
+gs
+0 0 m 27999 0 l 27999 20999 l 0 20999 l 0 0 l eoclip newpath
+gs
+0 0 m 27999 0 l 27999 20999 l 0 20999 l 0 0 l eoclip newpath
+
+pum
+1400 19567 t
+pom
+
+pum
+13952 19567 t
+pom
+0.559 c 3937 17018 m  1016 17018 l  1016 762 l  6858 762 l  6858 17018 l 
+3937 17018 l  p ef
+0 lw 1 lj 3937 17018 m  1016 17018 l  1016 762 l  6858 762 l  6858 17018 l 
+3937 17018 l  pc
+pum
+3040 16576 t
+0.234 c 255 0 m  255 -42 l  235 -9 204 7 163 7 ct 137 7 113 0 91 -15 ct 69 -29 52 -49 40 -75 ct 
+28 -101 22 -131 22 -165 ct 22 -198 27 -228 38 -254 ct 49 -281 66 -302 87 -316 ct 
+109 -330 134 -337 161 -337 ct 181 -337 198 -333 214 -325 ct 229 -316 242 -305 252 -292 ct 
+252 -455 l  307 -455 l  307 0 l  255 0 l  p
+79 -165 m  79 -123 88 -91 106 -70 ct 124 -49 144 -39 169 -39 ct 193 -39 214 -49 231 -69 ct 
+248 -89 256 -119 256 -160 ct 256 -205 248 -238 230 -259 ct 213 -280 192 -291 166 -291 ct 
+141 -291 121 -281 104 -261 ct 87 -240 79 -208 79 -165 ct p ef
+393 0 m  393 -330 l  443 -330 l  443 -283 l  453 -299 467 -312 484 -322 ct 
+501 -332 521 -337 543 -337 ct 567 -337 587 -332 603 -322 ct 618 -312 629 -297 636 -279 ct 
+662 -318 696 -337 737 -337 ct 770 -337 795 -328 813 -310 ct 830 -292 839 -264 839 -226 ct 
+839 0 l  784 0 l  784 -208 l  784 -230 782 -246 778 -256 ct 775 -266 768 -274 758 -280 ct 
+749 -286 738 -289 725 -289 ct 702 -289 683 -281 667 -265 ct 652 -250 644 -225 644 -191 ct 
+644 0 l  589 0 l  589 -214 l  589 -239 584 -258 575 -270 ct 566 -282 551 -289 530 -289 ct 
+515 -289 500 -284 487 -276 ct 473 -268 464 -256 458 -240 ct 452 -224 449 -201 449 -171 ct 
+449 0 l  393 0 l  p ef
+923 126 m  923 -330 l  974 -330 l  974 -287 l  986 -304 999 -316 1014 -324 ct 
+1029 -333 1048 -337 1069 -337 ct 1097 -337 1122 -330 1144 -315 ct 1165 -301 1181 -280 1192 -254 ct 
+1203 -228 1209 -199 1209 -167 ct 1209 -134 1203 -103 1191 -77 ct 1179 -50 1161 -29 1138 -15 ct 
+1115 0 1091 7 1065 7 ct 1047 7 1030 3 1015 -5 ct 1000 -13 988 -23 979 -35 ct 979 126 l 
+923 126 l  p
+973 -163 m  973 -121 982 -90 999 -69 ct 1016 -49 1037 -39 1061 -39 ct 1086 -39 1108 -49 1125 -70 ct 
+1143 -91 1152 -124 1152 -168 ct 1152 -210 1143 -241 1126 -262 ct 1109 -283 1088 -293 1064 -293 ct 
+1040 -293 1019 -282 1001 -260 ct 983 -238 973 -205 973 -163 ct p ef
+1489 -41 m  1468 -24 1448 -11 1429 -4 ct 1410 3 1389 7 1368 7 ct 1331 7 1304 -2 1284 -20 ct 
+1265 -37 1255 -60 1255 -87 ct 1255 -103 1259 -118 1266 -131 ct 1273 -145 1283 -156 1295 -164 ct 
+1307 -172 1320 -178 1335 -182 ct 1346 -185 1362 -188 1385 -190 ct 1430 -196 1463 -202 1484 -209 ct 
+1484 -217 1484 -222 1484 -224 ct 1484 -247 1479 -263 1469 -272 ct 1454 -285 1433 -291 1405 -291 ct 
+1379 -291 1359 -286 1347 -277 ct 1334 -268 1325 -252 1319 -228 ct 1265 -236 l 
+1270 -259 1278 -278 1289 -292 ct 1300 -307 1317 -318 1338 -326 ct 1360 -333 1385 -337 1413 -337 ct 
+1441 -337 1464 -334 1482 -327 ct 1499 -321 1512 -312 1520 -302 ct 1529 -292 1534 -280 1538 -264 ct 
+1540 -255 1541 -238 1541 -213 ct 1541 -138 l  1541 -87 1542 -54 1544 -40 ct 
+1546 -26 1551 -13 1558 0 ct 1500 0 l  1494 -12 1490 -26 1489 -41 ct p
+1484 -166 m  1464 -157 1433 -150 1393 -145 ct 1370 -141 1354 -138 1344 -133 ct 
+1335 -129 1327 -123 1322 -115 ct 1317 -107 1314 -99 1314 -89 ct 1314 -74 1320 -62 1331 -52 ct 
+1343 -42 1359 -37 1381 -37 ct 1402 -37 1421 -41 1438 -51 ct 1455 -60 1467 -73 1475 -89 ct 
+1481 -102 1484 -121 1484 -145 ct 1484 -166 l  p ef
+1624 0 m  1624 -330 l  1674 -330 l  1674 -280 l  1687 -303 1699 -318 1710 -326 ct 
+1721 -333 1733 -337 1746 -337 ct 1765 -337 1784 -331 1803 -319 ct 1784 -267 l 
+1770 -275 1757 -279 1743 -279 ct 1731 -279 1720 -276 1710 -268 ct 1700 -261 1693 -251 1689 -238 ct 
+1683 -218 1680 -196 1680 -173 ct 1680 0 l  1624 0 l  p ef
+pom
+
+0.880 c 4042 4064 m  2010 4064 l  2010 1524 l  6074 1524 l  6074 4064 l 
+4042 4064 l  p ef
+0.500 c 4042 4064 m  2010 4064 l  2010 1524 l  6074 1524 l  6074 4064 l 
+4042 4064 l  pc
+pum
+2372 3015 t
+0.234 c 255 0 m  255 -42 l  235 -9 204 7 163 7 ct 137 7 113 0 91 -15 ct 69 -29 52 -49 40 -75 ct 
+28 -101 22 -131 22 -165 ct 22 -198 27 -228 38 -254 ct 49 -281 66 -302 87 -316 ct 
+109 -330 134 -337 161 -337 ct 181 -337 198 -333 214 -325 ct 229 -316 242 -305 252 -292 ct 
+252 -455 l  307 -455 l  307 0 l  255 0 l  p
+79 -165 m  79 -123 88 -91 106 -70 ct 124 -49 144 -39 169 -39 ct 193 -39 214 -49 231 -69 ct 
+248 -89 256 -119 256 -160 ct 256 -205 248 -238 230 -259 ct 213 -280 192 -291 166 -291 ct 
+141 -291 121 -281 104 -261 ct 87 -240 79 -208 79 -165 ct p ef
+393 0 m  393 -330 l  443 -330 l  443 -283 l  453 -299 467 -312 484 -322 ct 
+501 -332 521 -337 543 -337 ct 567 -337 587 -332 603 -322 ct 618 -312 629 -297 636 -279 ct 
+662 -318 696 -337 737 -337 ct 770 -337 795 -328 813 -310 ct 830 -292 839 -264 839 -226 ct 
+839 0 l  784 0 l  784 -208 l  784 -230 782 -246 778 -256 ct 775 -266 768 -274 758 -280 ct 
+749 -286 738 -289 725 -289 ct 702 -289 683 -281 667 -265 ct 652 -250 644 -225 644 -191 ct 
+644 0 l  589 0 l  589 -214 l  589 -239 584 -258 575 -270 ct 566 -282 551 -289 530 -289 ct 
+515 -289 500 -284 487 -276 ct 473 -268 464 -256 458 -240 ct 452 -224 449 -201 449 -171 ct 
+449 0 l  393 0 l  p ef
+923 126 m  923 -330 l  974 -330 l  974 -287 l  986 -304 999 -316 1014 -324 ct 
+1029 -333 1048 -337 1069 -337 ct 1097 -337 1122 -330 1144 -315 ct 1165 -301 1181 -280 1192 -254 ct 
+1203 -228 1209 -199 1209 -167 ct 1209 -134 1203 -103 1191 -77 ct 1179 -50 1161 -29 1138 -15 ct 
+1115 0 1091 7 1065 7 ct 1047 7 1030 3 1015 -5 ct 1000 -13 988 -23 979 -35 ct 979 126 l 
+923 126 l  p
+973 -163 m  973 -121 982 -90 999 -69 ct 1016 -49 1037 -39 1061 -39 ct 1086 -39 1108 -49 1125 -70 ct 
+1143 -91 1152 -124 1152 -168 ct 1152 -210 1143 -241 1126 -262 ct 1109 -283 1088 -293 1064 -293 ct 
+1040 -293 1019 -282 1001 -260 ct 983 -238 973 -205 973 -163 ct p ef
+1489 -41 m  1468 -24 1448 -11 1429 -4 ct 1410 3 1389 7 1368 7 ct 1331 7 1304 -2 1284 -20 ct 
+1265 -37 1255 -60 1255 -87 ct 1255 -103 1259 -118 1266 -131 ct 1273 -145 1283 -156 1295 -164 ct 
+1307 -172 1320 -178 1335 -182 ct 1346 -185 1362 -188 1385 -190 ct 1430 -196 1463 -202 1484 -209 ct 
+1484 -217 1484 -222 1484 -224 ct 1484 -247 1479 -263 1469 -272 ct 1454 -285 1433 -291 1405 -291 ct 
+1379 -291 1359 -286 1347 -277 ct 1334 -268 1325 -252 1319 -228 ct 1265 -236 l 
+1270 -259 1278 -278 1289 -292 ct 1300 -307 1317 -318 1338 -326 ct 1360 -333 1385 -337 1413 -337 ct 
+1441 -337 1464 -334 1482 -327 ct 1499 -321 1512 -312 1520 -302 ct 1529 -292 1534 -280 1538 -264 ct 
+1540 -255 1541 -238 1541 -213 ct 1541 -138 l  1541 -87 1542 -54 1544 -40 ct 
+1546 -26 1551 -13 1558 0 ct 1500 0 l  1494 -12 1490 -26 1489 -41 ct p
+1484 -166 m  1464 -157 1433 -150 1393 -145 ct 1370 -141 1354 -138 1344 -133 ct 
+1335 -129 1327 -123 1322 -115 ct 1317 -107 1314 -99 1314 -89 ct 1314 -74 1320 -62 1331 -52 ct 
+1343 -42 1359 -37 1381 -37 ct 1402 -37 1421 -41 1438 -51 ct 1455 -60 1467 -73 1475 -89 ct 
+1481 -102 1484 -121 1484 -145 ct 1484 -166 l  p ef
+1624 0 m  1624 -330 l  1674 -330 l  1674 -280 l  1687 -303 1699 -318 1710 -326 ct 
+1721 -333 1733 -337 1746 -337 ct 1765 -337 1784 -331 1803 -319 ct 1784 -267 l 
+1770 -275 1757 -279 1743 -279 ct 1731 -279 1720 -276 1710 -268 ct 1700 -261 1693 -251 1689 -238 ct 
+1683 -218 1680 -196 1680 -173 ct 1680 0 l  1624 0 l  p ef
+1785 126 m  1785 86 l  2155 86 l  2155 126 l  1785 126 l  p ef
+2188 0 m  2188 -455 l  2244 -455 l  2244 -292 l  2270 -322 2303 -337 2342 -337 ct 
+2367 -337 2388 -332 2406 -323 ct 2424 -313 2437 -300 2444 -283 ct 2452 -266 2456 -241 2456 -209 ct 
+2456 0 l  2400 0 l  2400 -209 l  2400 -237 2394 -257 2382 -270 ct 2370 -283 2353 -289 2331 -289 ct 
+2314 -289 2299 -285 2284 -276 ct 2270 -267 2259 -256 2253 -241 ct 2247 -226 2244 -206 2244 -180 ct 
+2244 0 l  2188 0 l  p ef
+2755 -41 m  2734 -24 2714 -11 2695 -4 ct 2676 3 2655 7 2634 7 ct 2597 7 2570 -2 2550 -20 ct 
+2531 -37 2521 -60 2521 -87 ct 2521 -103 2525 -118 2532 -131 ct 2539 -145 2549 -156 2561 -164 ct 
+2573 -172 2586 -178 2601 -182 ct 2612 -185 2628 -188 2651 -190 ct 2696 -196 2729 -202 2750 -209 ct 
+2750 -217 2750 -222 2750 -224 ct 2750 -247 2745 -263 2735 -272 ct 2720 -285 2699 -291 2671 -291 ct 
+2645 -291 2625 -286 2613 -277 ct 2600 -268 2591 -252 2585 -228 ct 2531 -236 l 
+2536 -259 2544 -278 2555 -292 ct 2566 -307 2583 -318 2604 -326 ct 2626 -333 2651 -337 2679 -337 ct 
+2707 -337 2730 -334 2748 -327 ct 2765 -321 2778 -312 2786 -302 ct 2795 -292 2800 -280 2804 -264 ct 
+2806 -255 2807 -238 2807 -213 ct 2807 -138 l  2807 -87 2808 -54 2810 -40 ct 
+2812 -26 2817 -13 2824 0 ct 2766 0 l  2760 -12 2756 -26 2755 -41 ct p
+2750 -166 m  2730 -157 2699 -150 2659 -145 ct 2636 -141 2620 -138 2610 -133 ct 
+2601 -129 2593 -123 2588 -115 ct 2583 -107 2580 -99 2580 -89 ct 2580 -74 2586 -62 2597 -52 ct 
+2609 -42 2625 -37 2647 -37 ct 2668 -37 2687 -41 2704 -51 ct 2721 -60 2733 -73 2741 -89 ct 
+2747 -102 2750 -121 2750 -145 ct 2750 -166 l  p ef
+2890 0 m  2890 -455 l  2945 -455 l  2945 0 l  2890 0 l  p ef
+3010 -165 m  3010 -226 3027 -271 3061 -301 ct 3089 -325 3124 -337 3165 -337 ct 
+3210 -337 3247 -322 3275 -293 ct 3304 -263 3319 -222 3319 -170 ct 3319 -127 3312 -94 3300 -70 ct 
+3287 -45 3268 -27 3244 -13 ct 3220 0 3193 7 3165 7 ct 3118 7 3081 -8 3053 -37 ct 
+3024 -67 3010 -110 3010 -165 ct p
+3067 -165 m  3067 -123 3077 -91 3095 -70 ct 3113 -49 3137 -39 3165 -39 ct 3192 -39 3215 -49 3234 -71 ct 
+3252 -92 3261 -124 3261 -167 ct 3261 -208 3252 -239 3233 -260 ct 3215 -281 3192 -291 3165 -291 ct 
+3137 -291 3113 -281 3095 -260 ct 3077 -239 3067 -207 3067 -165 ct p ef
+pom
+
+0.880 c 4042 6858 m  2010 6858 l  2010 4318 l  6074 4318 l  6074 6858 l 
+4042 6858 l  p ef
+0.500 c 4042 6858 m  2010 6858 l  2010 4318 l  6074 4318 l  6074 6858 l 
+4042 6858 l  pc
+pum
+2211 5809 t
+0.234 c 255 0 m  255 -42 l  235 -9 204 7 163 7 ct 137 7 113 0 91 -15 ct 69 -29 52 -49 40 -75 ct 
+28 -101 22 -131 22 -165 ct 22 -198 27 -228 38 -254 ct 49 -281 66 -302 87 -316 ct 
+109 -330 134 -337 161 -337 ct 181 -337 198 -333 214 -325 ct 229 -316 242 -305 252 -292 ct 
+252 -455 l  307 -455 l  307 0 l  255 0 l  p
+79 -165 m  79 -123 88 -91 106 -70 ct 124 -49 144 -39 169 -39 ct 193 -39 214 -49 231 -69 ct 
+248 -89 256 -119 256 -160 ct 256 -205 248 -238 230 -259 ct 213 -280 192 -291 166 -291 ct 
+141 -291 121 -281 104 -261 ct 87 -240 79 -208 79 -165 ct p ef
+393 0 m  393 -330 l  443 -330 l  443 -283 l  453 -299 467 -312 484 -322 ct 
+501 -332 521 -337 543 -337 ct 567 -337 587 -332 603 -322 ct 618 -312 629 -297 636 -279 ct 
+662 -318 696 -337 737 -337 ct 770 -337 795 -328 813 -310 ct 830 -292 839 -264 839 -226 ct 
+839 0 l  784 0 l  784 -208 l  784 -230 782 -246 778 -256 ct 775 -266 768 -274 758 -280 ct 
+749 -286 738 -289 725 -289 ct 702 -289 683 -281 667 -265 ct 652 -250 644 -225 644 -191 ct 
+644 0 l  589 0 l  589 -214 l  589 -239 584 -258 575 -270 ct 566 -282 551 -289 530 -289 ct 
+515 -289 500 -284 487 -276 ct 473 -268 464 -256 458 -240 ct 452 -224 449 -201 449 -171 ct 
+449 0 l  393 0 l  p ef
+923 126 m  923 -330 l  974 -330 l  974 -287 l  986 -304 999 -316 1014 -324 ct 
+1029 -333 1048 -337 1069 -337 ct 1097 -337 1122 -330 1144 -315 ct 1165 -301 1181 -280 1192 -254 ct 
+1203 -228 1209 -199 1209 -167 ct 1209 -134 1203 -103 1191 -77 ct 1179 -50 1161 -29 1138 -15 ct 
+1115 0 1091 7 1065 7 ct 1047 7 1030 3 1015 -5 ct 1000 -13 988 -23 979 -35 ct 979 126 l 
+923 126 l  p
+973 -163 m  973 -121 982 -90 999 -69 ct 1016 -49 1037 -39 1061 -39 ct 1086 -39 1108 -49 1125 -70 ct 
+1143 -91 1152 -124 1152 -168 ct 1152 -210 1143 -241 1126 -262 ct 1109 -283 1088 -293 1064 -293 ct 
+1040 -293 1019 -282 1001 -260 ct 983 -238 973 -205 973 -163 ct p ef
+1489 -41 m  1468 -24 1448 -11 1429 -4 ct 1410 3 1389 7 1368 7 ct 1331 7 1304 -2 1284 -20 ct 
+1265 -37 1255 -60 1255 -87 ct 1255 -103 1259 -118 1266 -131 ct 1273 -145 1283 -156 1295 -164 ct 
+1307 -172 1320 -178 1335 -182 ct 1346 -185 1362 -188 1385 -190 ct 1430 -196 1463 -202 1484 -209 ct 
+1484 -217 1484 -222 1484 -224 ct 1484 -247 1479 -263 1469 -272 ct 1454 -285 1433 -291 1405 -291 ct 
+1379 -291 1359 -286 1347 -277 ct 1334 -268 1325 -252 1319 -228 ct 1265 -236 l 
+1270 -259 1278 -278 1289 -292 ct 1300 -307 1317 -318 1338 -326 ct 1360 -333 1385 -337 1413 -337 ct 
+1441 -337 1464 -334 1482 -327 ct 1499 -321 1512 -312 1520 -302 ct 1529 -292 1534 -280 1538 -264 ct 
+1540 -255 1541 -238 1541 -213 ct 1541 -138 l  1541 -87 1542 -54 1544 -40 ct 
+1546 -26 1551 -13 1558 0 ct 1500 0 l  1494 -12 1490 -26 1489 -41 ct p
+1484 -166 m  1464 -157 1433 -150 1393 -145 ct 1370 -141 1354 -138 1344 -133 ct 
+1335 -129 1327 -123 1322 -115 ct 1317 -107 1314 -99 1314 -89 ct 1314 -74 1320 -62 1331 -52 ct 
+1343 -42 1359 -37 1381 -37 ct 1402 -37 1421 -41 1438 -51 ct 1455 -60 1467 -73 1475 -89 ct 
+1481 -102 1484 -121 1484 -145 ct 1484 -166 l  p ef
+1624 0 m  1624 -330 l  1674 -330 l  1674 -280 l  1687 -303 1699 -318 1710 -326 ct 
+1721 -333 1733 -337 1746 -337 ct 1765 -337 1784 -331 1803 -319 ct 1784 -267 l 
+1770 -275 1757 -279 1743 -279 ct 1731 -279 1720 -276 1710 -268 ct 1700 -261 1693 -251 1689 -238 ct 
+1683 -218 1680 -196 1680 -173 ct 1680 0 l  1624 0 l  p ef
+1785 126 m  1785 86 l  2155 86 l  2155 126 l  1785 126 l  p ef
+2239 0 m  2188 0 l  2188 -455 l  2243 -455 l  2243 -293 l  2267 -322 2297 -337 2334 -337 ct 
+2354 -337 2373 -333 2391 -325 ct 2409 -317 2424 -305 2436 -290 ct 2447 -276 2457 -258 2463 -237 ct 
+2470 -216 2473 -194 2473 -170 ct 2473 -114 2459 -70 2431 -39 ct 2403 -8 2370 7 2331 7 ct 
+2292 7 2261 -9 2239 -42 ct 2239 0 l  p
+2239 -167 m  2239 -128 2244 -100 2255 -82 ct 2272 -53 2296 -39 2326 -39 ct 2351 -39 2372 -50 2389 -71 ct 
+2407 -92 2416 -123 2416 -165 ct 2416 -208 2408 -240 2390 -260 ct 2373 -281 2353 -291 2329 -291 ct 
+2304 -291 2283 -281 2265 -259 ct 2248 -238 2239 -208 2239 -167 ct p ef
+2755 -121 m  2810 -114 l  2804 -76 2788 -46 2764 -25 ct 2739 -4 2709 7 2673 7 ct 
+2628 7 2591 -8 2564 -37 ct 2537 -67 2523 -109 2523 -164 ct 2523 -199 2529 -230 2540 -257 ct 
+2552 -284 2570 -304 2594 -317 ct 2618 -330 2645 -337 2673 -337 ct 2709 -337 2738 -328 2761 -310 ct 
+2783 -292 2798 -266 2804 -233 ct 2750 -224 l  2745 -247 2736 -263 2723 -274 ct 
+2710 -286 2694 -291 2675 -291 ct 2647 -291 2624 -281 2607 -261 ct 2589 -241 2580 -209 2580 -165 ct 
+2580 -121 2589 -89 2606 -69 ct 2623 -49 2645 -39 2672 -39 ct 2694 -39 2712 -46 2727 -59 ct 
+2742 -72 2751 -93 2755 -121 ct p ef
+3072 -41 m  3051 -24 3031 -11 3012 -4 ct 2993 3 2972 7 2951 7 ct 2914 7 2887 -2 2867 -20 ct 
+2848 -37 2838 -60 2838 -87 ct 2838 -103 2842 -118 2849 -131 ct 2856 -145 2866 -156 2878 -164 ct 
+2890 -172 2903 -178 2918 -182 ct 2929 -185 2945 -188 2968 -190 ct 3013 -196 3046 -202 3067 -209 ct 
+3067 -217 3067 -222 3067 -224 ct 3067 -247 3062 -263 3052 -272 ct 3037 -285 3016 -291 2988 -291 ct 
+2962 -291 2942 -286 2930 -277 ct 2917 -268 2908 -252 2902 -228 ct 2848 -236 l 
+2853 -259 2861 -278 2872 -292 ct 2883 -307 2900 -318 2921 -326 ct 2943 -333 2968 -337 2996 -337 ct 
+3024 -337 3047 -334 3065 -327 ct 3082 -321 3095 -312 3103 -302 ct 3112 -292 3117 -280 3121 -264 ct 
+3123 -255 3124 -238 3124 -213 ct 3124 -138 l  3124 -87 3125 -54 3127 -40 ct 
+3129 -26 3134 -13 3141 0 ct 3083 0 l  3077 -12 3073 -26 3072 -41 ct p
+3067 -166 m  3047 -157 3016 -150 2976 -145 ct 2953 -141 2937 -138 2927 -133 ct 
+2918 -129 2910 -123 2905 -115 ct 2900 -107 2897 -99 2897 -89 ct 2897 -74 2903 -62 2914 -52 ct 
+2926 -42 2942 -37 2964 -37 ct 2985 -37 3004 -41 3021 -51 ct 3038 -60 3050 -73 3058 -89 ct 
+3064 -102 3067 -121 3067 -145 ct 3067 -166 l  p ef
+3187 -99 m  3242 -107 l  3245 -85 3253 -68 3268 -57 ct 3282 -45 3302 -39 3327 -39 ct 
+3353 -39 3372 -44 3384 -55 ct 3396 -65 3403 -77 3403 -91 ct 3403 -104 3397 -114 3386 -121 ct 
+3379 -126 3360 -132 3329 -140 ct 3288 -150 3260 -159 3244 -167 ct 3228 -174 3216 -185 3208 -198 ct 
+3200 -211 3196 -226 3196 -242 ct 3196 -257 3199 -270 3206 -283 ct 3213 -295 3222 -306 3233 -314 ct 
+3242 -320 3254 -326 3269 -330 ct 3284 -335 3300 -337 3317 -337 ct 3343 -337 3366 -333 3385 -326 ct 
+3405 -318 3419 -308 3428 -296 ct 3438 -283 3444 -266 3448 -245 ct 3393 -237 l 
+3391 -254 3383 -267 3371 -277 ct 3360 -286 3343 -291 3321 -291 ct 3295 -291 3277 -287 3266 -278 ct 
+3255 -270 3250 -260 3250 -249 ct 3250 -241 3252 -235 3257 -229 ct 3261 -223 3268 -218 3278 -214 ct 
+3284 -212 3300 -207 3327 -200 ct 3367 -189 3394 -181 3410 -174 ct 3426 -167 3438 -158 3447 -145 ct 
+3456 -132 3460 -116 3460 -97 ct 3460 -79 3455 -61 3444 -45 ct 3433 -28 3417 -15 3397 -6 ct 
+3376 3 3353 7 3327 7 ct 3285 7 3252 -2 3229 -20 ct 3207 -37 3193 -64 3187 -99 ct 
+p ef
+3648 -50 m  3656 -1 l  3640 2 3626 4 3614 4 ct 3593 4 3578 1 3566 -6 ct 3555 -12 3547 -20 3543 -31 ct 
+3538 -41 3536 -63 3536 -97 ct 3536 -287 l  3495 -287 l  3495 -330 l  3536 -330 l 
+3536 -412 l  3592 -445 l  3592 -330 l  3648 -330 l  3648 -287 l  3592 -287 l 
+3592 -94 l  3592 -78 3593 -68 3595 -63 ct 3597 -58 3600 -55 3604 -52 ct 3609 -49 3615 -48 3623 -48 ct 
+3629 -48 3638 -49 3648 -50 ct p ef
+pom
+
+0.880 c 4042 9652 m  2010 9652 l  2010 7112 l  6074 7112 l  6074 9652 l 
+4042 9652 l  p ef
+0.500 c 4042 9652 m  2010 9652 l  2010 7112 l  6074 7112 l  6074 9652 l 
+4042 9652 l  pc
+pum
+2001 8603 t
+0.234 c 255 0 m  255 -42 l  235 -9 204 7 163 7 ct 137 7 113 0 91 -15 ct 69 -29 52 -49 40 -75 ct 
+28 -101 22 -131 22 -165 ct 22 -198 27 -228 38 -254 ct 49 -281 66 -302 87 -316 ct 
+109 -330 134 -337 161 -337 ct 181 -337 198 -333 214 -325 ct 229 -316 242 -305 252 -292 ct 
+252 -455 l  307 -455 l  307 0 l  255 0 l  p
+79 -165 m  79 -123 88 -91 106 -70 ct 124 -49 144 -39 169 -39 ct 193 -39 214 -49 231 -69 ct 
+248 -89 256 -119 256 -160 ct 256 -205 248 -238 230 -259 ct 213 -280 192 -291 166 -291 ct 
+141 -291 121 -281 104 -261 ct 87 -240 79 -208 79 -165 ct p ef
+393 0 m  393 -330 l  443 -330 l  443 -283 l  453 -299 467 -312 484 -322 ct 
+501 -332 521 -337 543 -337 ct 567 -337 587 -332 603 -322 ct 618 -312 629 -297 636 -279 ct 
+662 -318 696 -337 737 -337 ct 770 -337 795 -328 813 -310 ct 830 -292 839 -264 839 -226 ct 
+839 0 l  784 0 l  784 -208 l  784 -230 782 -246 778 -256 ct 775 -266 768 -274 758 -280 ct 
+749 -286 738 -289 725 -289 ct 702 -289 683 -281 667 -265 ct 652 -250 644 -225 644 -191 ct 
+644 0 l  589 0 l  589 -214 l  589 -239 584 -258 575 -270 ct 566 -282 551 -289 530 -289 ct 
+515 -289 500 -284 487 -276 ct 473 -268 464 -256 458 -240 ct 452 -224 449 -201 449 -171 ct 
+449 0 l  393 0 l  p ef
+923 126 m  923 -330 l  974 -330 l  974 -287 l  986 -304 999 -316 1014 -324 ct 
+1029 -333 1048 -337 1069 -337 ct 1097 -337 1122 -330 1144 -315 ct 1165 -301 1181 -280 1192 -254 ct 
+1203 -228 1209 -199 1209 -167 ct 1209 -134 1203 -103 1191 -77 ct 1179 -50 1161 -29 1138 -15 ct 
+1115 0 1091 7 1065 7 ct 1047 7 1030 3 1015 -5 ct 1000 -13 988 -23 979 -35 ct 979 126 l 
+923 126 l  p
+973 -163 m  973 -121 982 -90 999 -69 ct 1016 -49 1037 -39 1061 -39 ct 1086 -39 1108 -49 1125 -70 ct 
+1143 -91 1152 -124 1152 -168 ct 1152 -210 1143 -241 1126 -262 ct 1109 -283 1088 -293 1064 -293 ct 
+1040 -293 1019 -282 1001 -260 ct 983 -238 973 -205 973 -163 ct p ef
+1489 -41 m  1468 -24 1448 -11 1429 -4 ct 1410 3 1389 7 1368 7 ct 1331 7 1304 -2 1284 -20 ct 
+1265 -37 1255 -60 1255 -87 ct 1255 -103 1259 -118 1266 -131 ct 1273 -145 1283 -156 1295 -164 ct 
+1307 -172 1320 -178 1335 -182 ct 1346 -185 1362 -188 1385 -190 ct 1430 -196 1463 -202 1484 -209 ct 
+1484 -217 1484 -222 1484 -224 ct 1484 -247 1479 -263 1469 -272 ct 1454 -285 1433 -291 1405 -291 ct 
+1379 -291 1359 -286 1347 -277 ct 1334 -268 1325 -252 1319 -228 ct 1265 -236 l 
+1270 -259 1278 -278 1289 -292 ct 1300 -307 1317 -318 1338 -326 ct 1360 -333 1385 -337 1413 -337 ct 
+1441 -337 1464 -334 1482 -327 ct 1499 -321 1512 -312 1520 -302 ct 1529 -292 1534 -280 1538 -264 ct 
+1540 -255 1541 -238 1541 -213 ct 1541 -138 l  1541 -87 1542 -54 1544 -40 ct 
+1546 -26 1551 -13 1558 0 ct 1500 0 l  1494 -12 1490 -26 1489 -41 ct p
+1484 -166 m  1464 -157 1433 -150 1393 -145 ct 1370 -141 1354 -138 1344 -133 ct 
+1335 -129 1327 -123 1322 -115 ct 1317 -107 1314 -99 1314 -89 ct 1314 -74 1320 -62 1331 -52 ct 
+1343 -42 1359 -37 1381 -37 ct 1402 -37 1421 -41 1438 -51 ct 1455 -60 1467 -73 1475 -89 ct 
+1481 -102 1484 -121 1484 -145 ct 1484 -166 l  p ef
+1624 0 m  1624 -330 l  1674 -330 l  1674 -280 l  1687 -303 1699 -318 1710 -326 ct 
+1721 -333 1733 -337 1746 -337 ct 1765 -337 1784 -331 1803 -319 ct 1784 -267 l 
+1770 -275 1757 -279 1743 -279 ct 1731 -279 1720 -276 1710 -268 ct 1700 -261 1693 -251 1689 -238 ct 
+1683 -218 1680 -196 1680 -173 ct 1680 0 l  1624 0 l  p ef
+1785 126 m  1785 86 l  2155 86 l  2155 126 l  1785 126 l  p ef
+2187 0 m  2187 -330 l  2237 -330 l  2237 -280 l  2250 -303 2262 -318 2273 -326 ct 
+2284 -333 2296 -337 2309 -337 ct 2328 -337 2347 -331 2366 -319 ct 2347 -267 l 
+2333 -275 2320 -279 2306 -279 ct 2294 -279 2283 -276 2273 -268 ct 2263 -261 2256 -251 2252 -238 ct 
+2246 -218 2243 -196 2243 -173 ct 2243 0 l  2187 0 l  p ef
+2625 -107 m  2683 -99 l  2674 -66 2657 -40 2632 -21 ct 2608 -2 2576 7 2538 7 ct 
+2490 7 2452 -8 2424 -37 ct 2395 -67 2381 -109 2381 -162 ct 2381 -218 2396 -261 2424 -291 ct 
+2453 -322 2490 -337 2535 -337 ct 2579 -337 2615 -322 2643 -292 ct 2671 -262 2685 -220 2685 -166 ct 
+2685 -163 2685 -158 2684 -151 ct 2439 -151 l  2441 -115 2451 -87 2470 -68 ct 
+2488 -49 2511 -39 2538 -39 ct 2559 -39 2576 -44 2591 -55 ct 2605 -66 2617 -83 2625 -107 ct 
+p
+2442 -197 m  2626 -197 l  2623 -225 2616 -245 2605 -259 ct 2587 -280 2564 -291 2536 -291 ct 
+2510 -291 2488 -283 2471 -265 ct 2454 -248 2444 -226 2442 -197 ct p ef
+2964 0 m  2964 -42 l  2944 -9 2913 7 2872 7 ct 2846 7 2822 0 2800 -15 ct 2778 -29 2761 -49 2749 -75 ct 
+2737 -101 2731 -131 2731 -165 ct 2731 -198 2736 -228 2747 -254 ct 2758 -281 2775 -302 2796 -316 ct 
+2818 -330 2843 -337 2870 -337 ct 2890 -337 2907 -333 2923 -325 ct 2938 -316 2951 -305 2961 -292 ct 
+2961 -455 l  3016 -455 l  3016 0 l  2964 0 l  p
+2788 -165 m  2788 -123 2797 -91 2815 -70 ct 2833 -49 2853 -39 2878 -39 ct 2902 -39 2923 -49 2940 -69 ct 
+2957 -89 2965 -119 2965 -160 ct 2965 -205 2957 -238 2939 -259 ct 2922 -280 2901 -291 2875 -291 ct 
+2850 -291 2830 -281 2813 -261 ct 2796 -240 2788 -208 2788 -165 ct p ef
+3319 0 m  3319 -49 l  3293 -12 3258 7 3214 7 ct 3195 7 3177 3 3160 -4 ct 3143 -12 3130 -21 3122 -32 ct 
+3114 -44 3108 -57 3105 -74 ct 3103 -85 3102 -102 3102 -126 ct 3102 -330 l  3157 -330 l 
+3157 -147 l  3157 -118 3159 -98 3161 -88 ct 3164 -74 3172 -62 3183 -54 ct 3195 -45 3209 -41 3225 -41 ct 
+3242 -41 3258 -45 3272 -54 ct 3287 -63 3298 -74 3304 -89 ct 3310 -104 3313 -125 3313 -153 ct 
+3313 -330 l  3369 -330 l  3369 0 l  3319 0 l  p ef
+3669 -121 m  3724 -114 l  3718 -76 3702 -46 3678 -25 ct 3653 -4 3623 7 3587 7 ct 
+3542 7 3505 -8 3478 -37 ct 3451 -67 3437 -109 3437 -164 ct 3437 -199 3443 -230 3454 -257 ct 
+3466 -284 3484 -304 3508 -317 ct 3532 -330 3559 -337 3587 -337 ct 3623 -337 3652 -328 3675 -310 ct 
+3697 -292 3712 -266 3718 -233 ct 3664 -224 l  3659 -247 3650 -263 3637 -274 ct 
+3624 -286 3608 -291 3589 -291 ct 3561 -291 3538 -281 3521 -261 ct 3503 -241 3494 -209 3494 -165 ct 
+3494 -121 3503 -89 3520 -69 ct 3537 -49 3559 -39 3586 -39 ct 3608 -39 3626 -46 3641 -59 ct 
+3656 -72 3665 -93 3669 -121 ct p ef
+3997 -107 m  4055 -99 l  4046 -66 4029 -40 4004 -21 ct 3980 -2 3948 7 3910 7 ct 
+3862 7 3824 -8 3796 -37 ct 3767 -67 3753 -109 3753 -162 ct 3753 -218 3768 -261 3796 -291 ct 
+3825 -322 3862 -337 3907 -337 ct 3951 -337 3987 -322 4015 -292 ct 4043 -262 4057 -220 4057 -166 ct 
+4057 -163 4057 -158 4056 -151 ct 3811 -151 l  3813 -115 3823 -87 3842 -68 ct 
+3860 -49 3883 -39 3910 -39 ct 3931 -39 3948 -44 3963 -55 ct 3977 -66 3989 -83 3997 -107 ct 
+p
+3814 -197 m  3998 -197 l  3995 -225 3988 -245 3977 -259 ct 3959 -280 3936 -291 3908 -291 ct 
+3882 -291 3860 -283 3843 -265 ct 3826 -248 3816 -226 3814 -197 ct p ef
+pom
+
+0.880 c 3888 10322 m  4032 10322 4142 10432 4142 10576 ct 4142 10720 4032 10830 3888 10830 ct 
+3744 10830 3634 10720 3634 10576 ct 3634 10432 3744 10322 3888 10322 ct p ef
+0.500 c 3888 10322 m  4032 10322 4142 10432 4142 10576 ct 4142 10720 4032 10830 3888 10830 ct 
+3744 10830 3634 10720 3634 10576 ct 3634 10432 3744 10322 3888 10322 ct pc
+3634 10322 m  3634 10322 l  pc
+4143 10831 m  4143 10831 l  pc
+
+0.880 c 3887 11121 m  4031 11121 4141 11231 4141 11375 ct 4141 11519 4031 11629 3887 11629 ct 
+3743 11629 3633 11519 3633 11375 ct 3633 11231 3743 11121 3887 11121 ct p ef
+0.500 c 3887 11121 m  4031 11121 4141 11231 4141 11375 ct 4141 11519 4031 11629 3887 11629 ct 
+3743 11629 3633 11519 3633 11375 ct 3633 11231 3743 11121 3887 11121 ct pc
+3633 11121 m  3633 11121 l  pc
+4142 11630 m  4142 11630 l  pc
+
+0.880 c 3887 11921 m  4031 11921 4141 12031 4141 12175 ct 4141 12319 4031 12429 3887 12429 ct 
+3743 12429 3633 12319 3633 12175 ct 3633 12031 3743 11921 3887 11921 ct p ef
+0.500 c 3887 11921 m  4031 11921 4141 12031 4141 12175 ct 4141 12319 4031 12429 3887 12429 ct 
+3743 12429 3633 12319 3633 12175 ct 3633 12031 3743 11921 3887 11921 ct pc
+3633 11921 m  3633 11921 l  pc
+4142 12430 m  4142 12430 l  pc
+
+0.880 c 12827 7366 m  10668 7366 l  10668 5080 l  14986 5080 l  14986 7366 l 
+12827 7366 l  p ef
+0.500 c 12827 7366 m  10668 7366 l  10668 5080 l  14986 5080 l  14986 7366 l 
+12827 7366 l  pc
+pum
+11631 6444 t
+0.234 c 42 0 m  42 -330 l  92 -330 l  92 -283 l  102 -299 116 -312 133 -322 ct 
+150 -332 170 -337 192 -337 ct 216 -337 236 -332 252 -322 ct 267 -312 278 -297 285 -279 ct 
+311 -318 345 -337 386 -337 ct 419 -337 444 -328 462 -310 ct 479 -292 488 -264 488 -226 ct 
+488 0 l  433 0 l  433 -208 l  433 -230 431 -246 427 -256 ct 424 -266 417 -274 407 -280 ct 
+398 -286 387 -289 374 -289 ct 351 -289 332 -281 316 -265 ct 301 -250 293 -225 293 -191 ct 
+293 0 l  238 0 l  238 -214 l  238 -239 233 -258 224 -270 ct 215 -282 200 -289 179 -289 ct 
+164 -289 149 -284 136 -276 ct 122 -268 113 -256 107 -240 ct 101 -224 98 -201 98 -171 ct 
+98 0 l  42 0 l  p ef
+571 126 m  571 -330 l  622 -330 l  622 -287 l  634 -304 647 -316 662 -324 ct 
+677 -333 696 -337 717 -337 ct 745 -337 770 -330 792 -315 ct 813 -301 829 -280 840 -254 ct 
+851 -228 857 -199 857 -167 ct 857 -134 851 -103 839 -77 ct 827 -50 809 -29 786 -15 ct 
+763 0 739 7 713 7 ct 695 7 678 3 663 -5 ct 648 -13 636 -23 627 -35 ct 627 126 l 
+571 126 l  p
+621 -163 m  621 -121 630 -90 647 -69 ct 664 -49 685 -39 709 -39 ct 734 -39 756 -49 773 -70 ct 
+791 -91 800 -124 800 -168 ct 800 -210 791 -241 774 -262 ct 757 -283 736 -293 712 -293 ct 
+688 -293 667 -282 649 -260 ct 631 -238 621 -205 621 -163 ct p ef
+1138 -41 m  1117 -24 1097 -11 1078 -4 ct 1059 3 1038 7 1017 7 ct 980 7 953 -2 933 -20 ct 
+914 -37 904 -60 904 -87 ct 904 -103 908 -118 915 -131 ct 922 -145 932 -156 944 -164 ct 
+956 -172 969 -178 984 -182 ct 995 -185 1011 -188 1034 -190 ct 1079 -196 1112 -202 1133 -209 ct 
+1133 -217 1133 -222 1133 -224 ct 1133 -247 1128 -263 1118 -272 ct 1103 -285 1082 -291 1054 -291 ct 
+1028 -291 1008 -286 996 -277 ct 983 -268 974 -252 968 -228 ct 914 -236 l  919 -259 927 -278 938 -292 ct 
+949 -307 966 -318 987 -326 ct 1009 -333 1034 -337 1062 -337 ct 1090 -337 1113 -334 1131 -327 ct 
+1148 -321 1161 -312 1169 -302 ct 1178 -292 1183 -280 1187 -264 ct 1189 -255 1190 -238 1190 -213 ct 
+1190 -138 l  1190 -87 1191 -54 1193 -40 ct 1195 -26 1200 -13 1207 0 ct 1149 0 l 
+1143 -12 1139 -26 1138 -41 ct p
+1133 -166 m  1113 -157 1082 -150 1042 -145 ct 1019 -141 1003 -138 993 -133 ct 
+984 -129 976 -123 971 -115 ct 966 -107 963 -99 963 -89 ct 963 -74 969 -62 980 -52 ct 
+992 -42 1008 -37 1030 -37 ct 1051 -37 1070 -41 1087 -51 ct 1104 -60 1116 -73 1124 -89 ct 
+1130 -102 1133 -121 1133 -145 ct 1133 -166 l  p ef
+1252 -99 m  1307 -107 l  1310 -85 1318 -68 1333 -57 ct 1347 -45 1367 -39 1392 -39 ct 
+1418 -39 1437 -44 1449 -55 ct 1461 -65 1468 -77 1468 -91 ct 1468 -104 1462 -114 1451 -121 ct 
+1444 -126 1425 -132 1394 -140 ct 1353 -150 1325 -159 1309 -167 ct 1293 -174 1281 -185 1273 -198 ct 
+1265 -211 1261 -226 1261 -242 ct 1261 -257 1264 -270 1271 -283 ct 1278 -295 1287 -306 1298 -314 ct 
+1307 -320 1319 -326 1334 -330 ct 1349 -335 1365 -337 1382 -337 ct 1408 -337 1431 -333 1450 -326 ct 
+1470 -318 1484 -308 1493 -296 ct 1503 -283 1509 -266 1513 -245 ct 1458 -237 l 
+1456 -254 1448 -267 1436 -277 ct 1425 -286 1408 -291 1386 -291 ct 1360 -291 1342 -287 1331 -278 ct 
+1320 -270 1315 -260 1315 -249 ct 1315 -241 1317 -235 1322 -229 ct 1326 -223 1333 -218 1343 -214 ct 
+1349 -212 1365 -207 1392 -200 ct 1432 -189 1459 -181 1475 -174 ct 1491 -167 1503 -158 1512 -145 ct 
+1521 -132 1525 -116 1525 -97 ct 1525 -79 1520 -61 1509 -45 ct 1498 -28 1482 -15 1462 -6 ct 
+1441 3 1418 7 1392 7 ct 1350 7 1317 -2 1294 -20 ct 1272 -37 1258 -64 1252 -99 ct 
+p ef
+1539 126 m  1539 86 l  1909 86 l  1909 126 l  1539 126 l  p ef
+1943 -391 m  1943 -455 l  1999 -455 l  1999 -391 l  1943 -391 l  p
+1943 0 m  1943 -330 l  1999 -330 l  1999 0 l  1943 0 l  p ef
+2061 -165 m  2061 -226 2078 -271 2112 -301 ct 2140 -325 2175 -337 2216 -337 ct 
+2261 -337 2298 -322 2326 -293 ct 2355 -263 2370 -222 2370 -170 ct 2370 -127 2363 -94 2351 -70 ct 
+2338 -45 2319 -27 2295 -13 ct 2271 0 2244 7 2216 7 ct 2169 7 2132 -8 2104 -37 ct 
+2075 -67 2061 -110 2061 -165 ct p
+2118 -165 m  2118 -123 2128 -91 2146 -70 ct 2164 -49 2188 -39 2216 -39 ct 2243 -39 2266 -49 2285 -71 ct 
+2303 -92 2312 -124 2312 -167 ct 2312 -208 2303 -239 2284 -260 ct 2266 -281 2243 -291 2216 -291 ct 
+2188 -291 2164 -281 2146 -260 ct 2128 -239 2118 -207 2118 -165 ct p ef
+pom
+
+0.880 c 25146 2794 m  22606 2794 l  22606 254 l  27686 254 l  27686 2794 l 
+25146 2794 l  p ef
+0.500 c 25146 2794 m  22606 2794 l  22606 254 l  27686 254 l  27686 2794 l 
+25146 2794 l  pc
+pum
+24230 1745 t
+0.234 c 373 -159 m  433 -144 l  421 -95 398 -57 365 -31 ct 333 -5 293 8 245 8 ct 
+196 8 156 -2 126 -22 ct 95 -42 72 -71 56 -109 ct 40 -147 32 -187 32 -231 ct 32 -278 41 -319 59 -355 ct 
+77 -390 103 -417 136 -435 ct 169 -453 206 -463 246 -463 ct 292 -463 330 -451 361 -428 ct 
+392 -405 414 -372 426 -330 ct 366 -316 l  356 -349 341 -373 321 -388 ct 301 -403 275 -411 245 -411 ct 
+210 -411 181 -403 157 -386 ct 134 -369 117 -347 108 -318 ct 98 -290 94 -261 94 -231 ct 
+94 -192 99 -159 111 -130 ct 122 -101 139 -79 163 -65 ct 187 -51 213 -44 240 -44 ct 
+274 -44 303 -53 326 -73 ct 349 -92 365 -121 373 -159 ct p ef
+488 -221 m  488 -297 508 -356 548 -399 ct 589 -441 641 -463 705 -463 ct 747 -463 785 -453 819 -433 ct 
+853 -413 878 -385 896 -349 ct 914 -313 922 -272 922 -227 ct 922 -181 913 -139 894 -103 ct 
+876 -66 850 -39 815 -20 ct 781 -1 745 8 705 8 ct 662 8 624 -2 590 -23 ct 557 -44 531 -72 514 -108 ct 
+496 -144 488 -181 488 -221 ct p
+550 -220 m  550 -166 564 -122 594 -91 ct 623 -59 660 -44 705 -44 ct 750 -44 787 -59 817 -91 ct 
+846 -123 860 -168 860 -227 ct 860 -264 854 -296 842 -324 ct 829 -352 811 -373 787 -388 ct 
+763 -403 736 -411 706 -411 ct 663 -411 626 -396 596 -367 ct 565 -338 550 -289 550 -220 ct 
+p ef
+1003 0 m  1003 -455 l  1204 -455 l  1245 -455 1276 -451 1297 -443 ct 1318 -435 1335 -420 1347 -399 ct 
+1360 -379 1366 -356 1366 -331 ct 1366 -299 1356 -271 1335 -249 ct 1314 -227 1282 -213 1238 -207 ct 
+1254 -199 1266 -192 1275 -184 ct 1292 -168 1309 -148 1324 -124 ct 1404 0 l  1328 0 l 
+1268 -95 l  1250 -122 1236 -143 1224 -157 ct 1213 -172 1203 -182 1194 -188 ct 
+1185 -194 1176 -198 1166 -200 ct 1160 -201 1148 -202 1133 -202 ct 1063 -202 l 
+1063 0 l  1003 0 l  p
+1063 -254 m  1192 -254 l  1220 -254 1241 -257 1257 -263 ct 1272 -268 1284 -277 1292 -290 ct 
+1300 -303 1304 -316 1304 -331 ct 1304 -352 1297 -370 1281 -384 ct 1265 -398 1241 -405 1207 -405 ct 
+1063 -405 l  1063 -254 l  p ef
+1460 0 m  1460 -455 l  1789 -455 l  1789 -401 l  1520 -401 l  1520 -262 l 
+1772 -262 l  1772 -209 l  1520 -209 l  1520 -54 l  1799 -54 l  1799 0 l 
+1460 0 l  p ef
+pom
+
+0.880 c 19177 9398 m  17018 9398 l  17018 7366 l  21336 7366 l  21336 9398 l 
+19177 9398 l  p ef
+0.500 c 19177 9398 m  17018 9398 l  17018 7366 l  21336 7366 l  21336 9398 l 
+19177 9398 l  pc
+pum
+17541 8603 t
+0.234 c 42 0 m  42 -330 l  92 -330 l  92 -283 l  102 -299 116 -312 133 -322 ct 
+150 -332 170 -337 192 -337 ct 216 -337 236 -332 252 -322 ct 267 -312 278 -297 285 -279 ct 
+311 -318 345 -337 386 -337 ct 419 -337 444 -328 462 -310 ct 479 -292 488 -264 488 -226 ct 
+488 0 l  433 0 l  433 -208 l  433 -230 431 -246 427 -256 ct 424 -266 417 -274 407 -280 ct 
+398 -286 387 -289 374 -289 ct 351 -289 332 -281 316 -265 ct 301 -250 293 -225 293 -191 ct 
+293 0 l  238 0 l  238 -214 l  238 -239 233 -258 224 -270 ct 215 -282 200 -289 179 -289 ct 
+164 -289 149 -284 136 -276 ct 122 -268 113 -256 107 -240 ct 101 -224 98 -201 98 -171 ct 
+98 0 l  42 0 l  p ef
+571 126 m  571 -330 l  622 -330 l  622 -287 l  634 -304 647 -316 662 -324 ct 
+677 -333 696 -337 717 -337 ct 745 -337 770 -330 792 -315 ct 813 -301 829 -280 840 -254 ct 
+851 -228 857 -199 857 -167 ct 857 -134 851 -103 839 -77 ct 827 -50 809 -29 786 -15 ct 
+763 0 739 7 713 7 ct 695 7 678 3 663 -5 ct 648 -13 636 -23 627 -35 ct 627 126 l 
+571 126 l  p
+621 -163 m  621 -121 630 -90 647 -69 ct 664 -49 685 -39 709 -39 ct 734 -39 756 -49 773 -70 ct 
+791 -91 800 -124 800 -168 ct 800 -210 791 -241 774 -262 ct 757 -283 736 -293 712 -293 ct 
+688 -293 667 -282 649 -260 ct 631 -238 621 -205 621 -163 ct p ef
+1138 -41 m  1117 -24 1097 -11 1078 -4 ct 1059 3 1038 7 1017 7 ct 980 7 953 -2 933 -20 ct 
+914 -37 904 -60 904 -87 ct 904 -103 908 -118 915 -131 ct 922 -145 932 -156 944 -164 ct 
+956 -172 969 -178 984 -182 ct 995 -185 1011 -188 1034 -190 ct 1079 -196 1112 -202 1133 -209 ct 
+1133 -217 1133 -222 1133 -224 ct 1133 -247 1128 -263 1118 -272 ct 1103 -285 1082 -291 1054 -291 ct 
+1028 -291 1008 -286 996 -277 ct 983 -268 974 -252 968 -228 ct 914 -236 l  919 -259 927 -278 938 -292 ct 
+949 -307 966 -318 987 -326 ct 1009 -333 1034 -337 1062 -337 ct 1090 -337 1113 -334 1131 -327 ct 
+1148 -321 1161 -312 1169 -302 ct 1178 -292 1183 -280 1187 -264 ct 1189 -255 1190 -238 1190 -213 ct 
+1190 -138 l  1190 -87 1191 -54 1193 -40 ct 1195 -26 1200 -13 1207 0 ct 1149 0 l 
+1143 -12 1139 -26 1138 -41 ct p
+1133 -166 m  1113 -157 1082 -150 1042 -145 ct 1019 -141 1003 -138 993 -133 ct 
+984 -129 976 -123 971 -115 ct 966 -107 963 -99 963 -89 ct 963 -74 969 -62 980 -52 ct 
+992 -42 1008 -37 1030 -37 ct 1051 -37 1070 -41 1087 -51 ct 1104 -60 1116 -73 1124 -89 ct 
+1130 -102 1133 -121 1133 -145 ct 1133 -166 l  p ef
+1252 -99 m  1307 -107 l  1310 -85 1318 -68 1333 -57 ct 1347 -45 1367 -39 1392 -39 ct 
+1418 -39 1437 -44 1449 -55 ct 1461 -65 1468 -77 1468 -91 ct 1468 -104 1462 -114 1451 -121 ct 
+1444 -126 1425 -132 1394 -140 ct 1353 -150 1325 -159 1309 -167 ct 1293 -174 1281 -185 1273 -198 ct 
+1265 -211 1261 -226 1261 -242 ct 1261 -257 1264 -270 1271 -283 ct 1278 -295 1287 -306 1298 -314 ct 
+1307 -320 1319 -326 1334 -330 ct 1349 -335 1365 -337 1382 -337 ct 1408 -337 1431 -333 1450 -326 ct 
+1470 -318 1484 -308 1493 -296 ct 1503 -283 1509 -266 1513 -245 ct 1458 -237 l 
+1456 -254 1448 -267 1436 -277 ct 1425 -286 1408 -291 1386 -291 ct 1360 -291 1342 -287 1331 -278 ct 
+1320 -270 1315 -260 1315 -249 ct 1315 -241 1317 -235 1322 -229 ct 1326 -223 1333 -218 1343 -214 ct 
+1349 -212 1365 -207 1392 -200 ct 1432 -189 1459 -181 1475 -174 ct 1491 -167 1503 -158 1512 -145 ct 
+1521 -132 1525 -116 1525 -97 ct 1525 -79 1520 -61 1509 -45 ct 1498 -28 1482 -15 1462 -6 ct 
+1441 3 1418 7 1392 7 ct 1350 7 1317 -2 1294 -20 ct 1272 -37 1258 -64 1252 -99 ct 
+p ef
+1539 126 m  1539 86 l  1909 86 l  1909 126 l  1539 126 l  p ef
+1943 -391 m  1943 -455 l  1999 -455 l  1999 -391 l  1943 -391 l  p
+1943 0 m  1943 -330 l  1999 -330 l  1999 0 l  1943 0 l  p ef
+2082 0 m  2082 -330 l  2132 -330 l  2132 -283 l  2156 -319 2191 -337 2237 -337 ct 
+2257 -337 2275 -333 2292 -326 ct 2308 -319 2321 -310 2329 -298 ct 2337 -287 2343 -273 2346 -257 ct 
+2348 -247 2349 -229 2349 -203 ct 2349 0 l  2294 0 l  2294 -200 l  2294 -223 2291 -240 2287 -252 ct 
+2283 -263 2275 -272 2264 -279 ct 2253 -285 2240 -289 2225 -289 ct 2201 -289 2181 -281 2164 -266 ct 
+2146 -251 2138 -222 2138 -180 ct 2138 0 l  2082 0 l  p ef
+2434 126 m  2434 -330 l  2485 -330 l  2485 -287 l  2497 -304 2510 -316 2525 -324 ct 
+2540 -333 2559 -337 2580 -337 ct 2608 -337 2633 -330 2655 -315 ct 2676 -301 2692 -280 2703 -254 ct 
+2714 -228 2720 -199 2720 -167 ct 2720 -134 2714 -103 2702 -77 ct 2690 -50 2672 -29 2649 -15 ct 
+2626 0 2602 7 2576 7 ct 2558 7 2541 3 2526 -5 ct 2511 -13 2499 -23 2490 -35 ct 
+2490 126 l  2434 126 l  p
+2484 -163 m  2484 -121 2493 -90 2510 -69 ct 2527 -49 2548 -39 2572 -39 ct 2597 -39 2619 -49 2636 -70 ct 
+2654 -91 2663 -124 2663 -168 ct 2663 -210 2654 -241 2637 -262 ct 2620 -283 2599 -293 2575 -293 ct 
+2551 -293 2530 -282 2512 -260 ct 2494 -238 2484 -205 2484 -163 ct p ef
+3001 0 m  3001 -49 l  2975 -12 2940 7 2896 7 ct 2877 7 2859 3 2842 -4 ct 2825 -12 2812 -21 2804 -32 ct 
+2796 -44 2790 -57 2787 -74 ct 2785 -85 2784 -102 2784 -126 ct 2784 -330 l  2839 -330 l 
+2839 -147 l  2839 -118 2841 -98 2843 -88 ct 2846 -74 2854 -62 2865 -54 ct 2877 -45 2891 -41 2907 -41 ct 
+2924 -41 2940 -45 2954 -54 ct 2969 -63 2980 -74 2986 -89 ct 2992 -104 2995 -125 2995 -153 ct 
+2995 -330 l  3051 -330 l  3051 0 l  3001 0 l  p ef
+3259 -50 m  3267 -1 l  3251 2 3237 4 3225 4 ct 3204 4 3189 1 3177 -6 ct 3166 -12 3158 -20 3154 -31 ct 
+3149 -41 3147 -63 3147 -97 ct 3147 -287 l  3106 -287 l  3106 -330 l  3147 -330 l 
+3147 -412 l  3203 -445 l  3203 -330 l  3259 -330 l  3259 -287 l  3203 -287 l 
+3203 -94 l  3203 -78 3204 -68 3206 -63 ct 3208 -58 3211 -55 3215 -52 ct 3220 -49 3226 -48 3234 -48 ct 
+3240 -48 3249 -49 3259 -50 ct p ef
+pom
+
+0.880 c 19177 5842 m  17018 5842 l  17018 3810 l  21336 3810 l  21336 5842 l 
+19177 5842 l  p ef
+0.500 c 19177 5842 m  17018 5842 l  17018 3810 l  21336 3810 l  21336 5842 l 
+19177 5842 l  pc
+pum
+17346 5047 t
+0.234 c 42 0 m  42 -330 l  92 -330 l  92 -283 l  102 -299 116 -312 133 -322 ct 
+150 -332 170 -337 192 -337 ct 216 -337 236 -332 252 -322 ct 267 -312 278 -297 285 -279 ct 
+311 -318 345 -337 386 -337 ct 419 -337 444 -328 462 -310 ct 479 -292 488 -264 488 -226 ct 
+488 0 l  433 0 l  433 -208 l  433 -230 431 -246 427 -256 ct 424 -266 417 -274 407 -280 ct 
+398 -286 387 -289 374 -289 ct 351 -289 332 -281 316 -265 ct 301 -250 293 -225 293 -191 ct 
+293 0 l  238 0 l  238 -214 l  238 -239 233 -258 224 -270 ct 215 -282 200 -289 179 -289 ct 
+164 -289 149 -284 136 -276 ct 122 -268 113 -256 107 -240 ct 101 -224 98 -201 98 -171 ct 
+98 0 l  42 0 l  p ef
+571 126 m  571 -330 l  622 -330 l  622 -287 l  634 -304 647 -316 662 -324 ct 
+677 -333 696 -337 717 -337 ct 745 -337 770 -330 792 -315 ct 813 -301 829 -280 840 -254 ct 
+851 -228 857 -199 857 -167 ct 857 -134 851 -103 839 -77 ct 827 -50 809 -29 786 -15 ct 
+763 0 739 7 713 7 ct 695 7 678 3 663 -5 ct 648 -13 636 -23 627 -35 ct 627 126 l 
+571 126 l  p
+621 -163 m  621 -121 630 -90 647 -69 ct 664 -49 685 -39 709 -39 ct 734 -39 756 -49 773 -70 ct 
+791 -91 800 -124 800 -168 ct 800 -210 791 -241 774 -262 ct 757 -283 736 -293 712 -293 ct 
+688 -293 667 -282 649 -260 ct 631 -238 621 -205 621 -163 ct p ef
+1138 -41 m  1117 -24 1097 -11 1078 -4 ct 1059 3 1038 7 1017 7 ct 980 7 953 -2 933 -20 ct 
+914 -37 904 -60 904 -87 ct 904 -103 908 -118 915 -131 ct 922 -145 932 -156 944 -164 ct 
+956 -172 969 -178 984 -182 ct 995 -185 1011 -188 1034 -190 ct 1079 -196 1112 -202 1133 -209 ct 
+1133 -217 1133 -222 1133 -224 ct 1133 -247 1128 -263 1118 -272 ct 1103 -285 1082 -291 1054 -291 ct 
+1028 -291 1008 -286 996 -277 ct 983 -268 974 -252 968 -228 ct 914 -236 l  919 -259 927 -278 938 -292 ct 
+949 -307 966 -318 987 -326 ct 1009 -333 1034 -337 1062 -337 ct 1090 -337 1113 -334 1131 -327 ct 
+1148 -321 1161 -312 1169 -302 ct 1178 -292 1183 -280 1187 -264 ct 1189 -255 1190 -238 1190 -213 ct 
+1190 -138 l  1190 -87 1191 -54 1193 -40 ct 1195 -26 1200 -13 1207 0 ct 1149 0 l 
+1143 -12 1139 -26 1138 -41 ct p
+1133 -166 m  1113 -157 1082 -150 1042 -145 ct 1019 -141 1003 -138 993 -133 ct 
+984 -129 976 -123 971 -115 ct 966 -107 963 -99 963 -89 ct 963 -74 969 -62 980 -52 ct 
+992 -42 1008 -37 1030 -37 ct 1051 -37 1070 -41 1087 -51 ct 1104 -60 1116 -73 1124 -89 ct 
+1130 -102 1133 -121 1133 -145 ct 1133 -166 l  p ef
+1252 -99 m  1307 -107 l  1310 -85 1318 -68 1333 -57 ct 1347 -45 1367 -39 1392 -39 ct 
+1418 -39 1437 -44 1449 -55 ct 1461 -65 1468 -77 1468 -91 ct 1468 -104 1462 -114 1451 -121 ct 
+1444 -126 1425 -132 1394 -140 ct 1353 -150 1325 -159 1309 -167 ct 1293 -174 1281 -185 1273 -198 ct 
+1265 -211 1261 -226 1261 -242 ct 1261 -257 1264 -270 1271 -283 ct 1278 -295 1287 -306 1298 -314 ct 
+1307 -320 1319 -326 1334 -330 ct 1349 -335 1365 -337 1382 -337 ct 1408 -337 1431 -333 1450 -326 ct 
+1470 -318 1484 -308 1493 -296 ct 1503 -283 1509 -266 1513 -245 ct 1458 -237 l 
+1456 -254 1448 -267 1436 -277 ct 1425 -286 1408 -291 1386 -291 ct 1360 -291 1342 -287 1331 -278 ct 
+1320 -270 1315 -260 1315 -249 ct 1315 -241 1317 -235 1322 -229 ct 1326 -223 1333 -218 1343 -214 ct 
+1349 -212 1365 -207 1392 -200 ct 1432 -189 1459 -181 1475 -174 ct 1491 -167 1503 -158 1512 -145 ct 
+1521 -132 1525 -116 1525 -97 ct 1525 -79 1520 -61 1509 -45 ct 1498 -28 1482 -15 1462 -6 ct 
+1441 3 1418 7 1392 7 ct 1350 7 1317 -2 1294 -20 ct 1272 -37 1258 -64 1252 -99 ct 
+p ef
+1539 126 m  1539 86 l  1909 86 l  1909 126 l  1539 126 l  p ef
+1922 -165 m  1922 -226 1939 -271 1973 -301 ct 2001 -325 2036 -337 2077 -337 ct 
+2122 -337 2159 -322 2187 -293 ct 2216 -263 2231 -222 2231 -170 ct 2231 -127 2224 -94 2212 -70 ct 
+2199 -45 2180 -27 2156 -13 ct 2132 0 2105 7 2077 7 ct 2030 7 1993 -8 1965 -37 ct 
+1936 -67 1922 -110 1922 -165 ct p
+1979 -165 m  1979 -123 1989 -91 2007 -70 ct 2025 -49 2049 -39 2077 -39 ct 2104 -39 2127 -49 2146 -71 ct 
+2164 -92 2173 -124 2173 -167 ct 2173 -208 2164 -239 2145 -260 ct 2127 -281 2104 -291 2077 -291 ct 
+2049 -291 2025 -281 2007 -260 ct 1989 -239 1979 -207 1979 -165 ct p ef
+2510 0 m  2510 -49 l  2484 -12 2449 7 2405 7 ct 2386 7 2368 3 2351 -4 ct 2334 -12 2321 -21 2313 -32 ct 
+2305 -44 2299 -57 2296 -74 ct 2294 -85 2293 -102 2293 -126 ct 2293 -330 l  2348 -330 l 
+2348 -147 l  2348 -118 2350 -98 2352 -88 ct 2355 -74 2363 -62 2374 -54 ct 2386 -45 2400 -41 2416 -41 ct 
+2433 -41 2449 -45 2463 -54 ct 2478 -63 2489 -74 2495 -89 ct 2501 -104 2504 -125 2504 -153 ct 
+2504 -330 l  2560 -330 l  2560 0 l  2510 0 l  p ef
+2768 -50 m  2776 -1 l  2760 2 2746 4 2734 4 ct 2713 4 2698 1 2686 -6 ct 2675 -12 2667 -20 2663 -31 ct 
+2658 -41 2656 -63 2656 -97 ct 2656 -287 l  2615 -287 l  2615 -330 l  2656 -330 l 
+2656 -412 l  2712 -445 l  2712 -330 l  2768 -330 l  2768 -287 l  2712 -287 l 
+2712 -94 l  2712 -78 2713 -68 2715 -63 ct 2717 -58 2720 -55 2724 -52 ct 2729 -49 2735 -48 2743 -48 ct 
+2749 -48 2758 -49 2768 -50 ct p ef
+2823 126 m  2823 -330 l  2874 -330 l  2874 -287 l  2886 -304 2899 -316 2914 -324 ct 
+2929 -333 2948 -337 2969 -337 ct 2997 -337 3022 -330 3044 -315 ct 3065 -301 3081 -280 3092 -254 ct 
+3103 -228 3109 -199 3109 -167 ct 3109 -134 3103 -103 3091 -77 ct 3079 -50 3061 -29 3038 -15 ct 
+3015 0 2991 7 2965 7 ct 2947 7 2930 3 2915 -5 ct 2900 -13 2888 -23 2879 -35 ct 
+2879 126 l  2823 126 l  p
+2873 -163 m  2873 -121 2882 -90 2899 -69 ct 2916 -49 2937 -39 2961 -39 ct 2986 -39 3008 -49 3025 -70 ct 
+3043 -91 3052 -124 3052 -168 ct 3052 -210 3043 -241 3026 -262 ct 3009 -283 2988 -293 2964 -293 ct 
+2940 -293 2919 -282 2901 -260 ct 2883 -238 2873 -205 2873 -163 ct p ef
+3391 0 m  3391 -49 l  3365 -12 3330 7 3286 7 ct 3267 7 3249 3 3232 -4 ct 3215 -12 3202 -21 3194 -32 ct 
+3186 -44 3180 -57 3177 -74 ct 3175 -85 3174 -102 3174 -126 ct 3174 -330 l  3229 -330 l 
+3229 -147 l  3229 -118 3231 -98 3233 -88 ct 3236 -74 3244 -62 3255 -54 ct 3267 -45 3281 -41 3297 -41 ct 
+3314 -41 3330 -45 3344 -54 ct 3359 -63 3370 -74 3376 -89 ct 3382 -104 3385 -125 3385 -153 ct 
+3385 -330 l  3441 -330 l  3441 0 l  3391 0 l  p ef
+3648 -50 m  3656 -1 l  3640 2 3626 4 3614 4 ct 3593 4 3578 1 3566 -6 ct 3555 -12 3547 -20 3543 -31 ct 
+3538 -41 3536 -63 3536 -97 ct 3536 -287 l  3495 -287 l  3495 -330 l  3536 -330 l 
+3536 -412 l  3592 -445 l  3592 -330 l  3648 -330 l  3648 -287 l  3592 -287 l 
+3592 -94 l  3592 -78 3593 -68 3595 -63 ct 3597 -58 3600 -55 3604 -52 ct 3609 -49 3615 -48 3623 -48 ct 
+3629 -48 3638 -49 3648 -50 ct p ef
+pom
+
+0.880 c 12319 11430 m  8890 11430 l  8890 9144 l  15748 9144 l  15748 11430 l 
+12319 11430 l  p ef
+0.500 c 12319 11430 m  8890 11430 l  8890 9144 l  15748 9144 l  15748 11430 l 
+12319 11430 l  pc
+pum
+9328 10508 t
+0.234 c 42 0 m  42 -330 l  92 -330 l  92 -283 l  102 -299 116 -312 133 -322 ct 
+150 -332 170 -337 192 -337 ct 216 -337 236 -332 252 -322 ct 267 -312 278 -297 285 -279 ct 
+311 -318 345 -337 386 -337 ct 419 -337 444 -328 462 -310 ct 479 -292 488 -264 488 -226 ct 
+488 0 l  433 0 l  433 -208 l  433 -230 431 -246 427 -256 ct 424 -266 417 -274 407 -280 ct 
+398 -286 387 -289 374 -289 ct 351 -289 332 -281 316 -265 ct 301 -250 293 -225 293 -191 ct 
+293 0 l  238 0 l  238 -214 l  238 -239 233 -258 224 -270 ct 215 -282 200 -289 179 -289 ct 
+164 -289 149 -284 136 -276 ct 122 -268 113 -256 107 -240 ct 101 -224 98 -201 98 -171 ct 
+98 0 l  42 0 l  p ef
+571 126 m  571 -330 l  622 -330 l  622 -287 l  634 -304 647 -316 662 -324 ct 
+677 -333 696 -337 717 -337 ct 745 -337 770 -330 792 -315 ct 813 -301 829 -280 840 -254 ct 
+851 -228 857 -199 857 -167 ct 857 -134 851 -103 839 -77 ct 827 -50 809 -29 786 -15 ct 
+763 0 739 7 713 7 ct 695 7 678 3 663 -5 ct 648 -13 636 -23 627 -35 ct 627 126 l 
+571 126 l  p
+621 -163 m  621 -121 630 -90 647 -69 ct 664 -49 685 -39 709 -39 ct 734 -39 756 -49 773 -70 ct 
+791 -91 800 -124 800 -168 ct 800 -210 791 -241 774 -262 ct 757 -283 736 -293 712 -293 ct 
+688 -293 667 -282 649 -260 ct 631 -238 621 -205 621 -163 ct p ef
+1138 -41 m  1117 -24 1097 -11 1078 -4 ct 1059 3 1038 7 1017 7 ct 980 7 953 -2 933 -20 ct 
+914 -37 904 -60 904 -87 ct 904 -103 908 -118 915 -131 ct 922 -145 932 -156 944 -164 ct 
+956 -172 969 -178 984 -182 ct 995 -185 1011 -188 1034 -190 ct 1079 -196 1112 -202 1133 -209 ct 
+1133 -217 1133 -222 1133 -224 ct 1133 -247 1128 -263 1118 -272 ct 1103 -285 1082 -291 1054 -291 ct 
+1028 -291 1008 -286 996 -277 ct 983 -268 974 -252 968 -228 ct 914 -236 l  919 -259 927 -278 938 -292 ct 
+949 -307 966 -318 987 -326 ct 1009 -333 1034 -337 1062 -337 ct 1090 -337 1113 -334 1131 -327 ct 
+1148 -321 1161 -312 1169 -302 ct 1178 -292 1183 -280 1187 -264 ct 1189 -255 1190 -238 1190 -213 ct 
+1190 -138 l  1190 -87 1191 -54 1193 -40 ct 1195 -26 1200 -13 1207 0 ct 1149 0 l 
+1143 -12 1139 -26 1138 -41 ct p
+1133 -166 m  1113 -157 1082 -150 1042 -145 ct 1019 -141 1003 -138 993 -133 ct 
+984 -129 976 -123 971 -115 ct 966 -107 963 -99 963 -89 ct 963 -74 969 -62 980 -52 ct 
+992 -42 1008 -37 1030 -37 ct 1051 -37 1070 -41 1087 -51 ct 1104 -60 1116 -73 1124 -89 ct 
+1130 -102 1133 -121 1133 -145 ct 1133 -166 l  p ef
+1252 -99 m  1307 -107 l  1310 -85 1318 -68 1333 -57 ct 1347 -45 1367 -39 1392 -39 ct 
+1418 -39 1437 -44 1449 -55 ct 1461 -65 1468 -77 1468 -91 ct 1468 -104 1462 -114 1451 -121 ct 
+1444 -126 1425 -132 1394 -140 ct 1353 -150 1325 -159 1309 -167 ct 1293 -174 1281 -185 1273 -198 ct 
+1265 -211 1261 -226 1261 -242 ct 1261 -257 1264 -270 1271 -283 ct 1278 -295 1287 -306 1298 -314 ct 
+1307 -320 1319 -326 1334 -330 ct 1349 -335 1365 -337 1382 -337 ct 1408 -337 1431 -333 1450 -326 ct 
+1470 -318 1484 -308 1493 -296 ct 1503 -283 1509 -266 1513 -245 ct 1458 -237 l 
+1456 -254 1448 -267 1436 -277 ct 1425 -286 1408 -291 1386 -291 ct 1360 -291 1342 -287 1331 -278 ct 
+1320 -270 1315 -260 1315 -249 ct 1315 -241 1317 -235 1322 -229 ct 1326 -223 1333 -218 1343 -214 ct 
+1349 -212 1365 -207 1392 -200 ct 1432 -189 1459 -181 1475 -174 ct 1491 -167 1503 -158 1512 -145 ct 
+1521 -132 1525 -116 1525 -97 ct 1525 -79 1520 -61 1509 -45 ct 1498 -28 1482 -15 1462 -6 ct 
+1441 3 1418 7 1392 7 ct 1350 7 1317 -2 1294 -20 ct 1272 -37 1258 -64 1252 -99 ct 
+p ef
+1539 126 m  1539 86 l  1909 86 l  1909 126 l  1539 126 l  p ef
+1994 0 m  1943 0 l  1943 -455 l  1998 -455 l  1998 -293 l  2022 -322 2052 -337 2089 -337 ct 
+2109 -337 2128 -333 2146 -325 ct 2164 -317 2179 -305 2191 -290 ct 2202 -276 2212 -258 2218 -237 ct 
+2225 -216 2228 -194 2228 -170 ct 2228 -114 2214 -70 2186 -39 ct 2158 -8 2125 7 2086 7 ct 
+2047 7 2016 -9 1994 -42 ct 1994 0 l  p
+1994 -167 m  1994 -128 1999 -100 2010 -82 ct 2027 -53 2051 -39 2081 -39 ct 2106 -39 2127 -50 2144 -71 ct 
+2162 -92 2171 -123 2171 -165 ct 2171 -208 2163 -240 2145 -260 ct 2128 -281 2108 -291 2084 -291 ct 
+2059 -291 2038 -281 2020 -259 ct 2003 -238 1994 -208 1994 -167 ct p ef
+2293 0 m  2293 -455 l  2348 -455 l  2348 0 l  2293 0 l  p ef
+2413 -165 m  2413 -226 2430 -271 2464 -301 ct 2492 -325 2527 -337 2568 -337 ct 
+2613 -337 2650 -322 2678 -293 ct 2707 -263 2722 -222 2722 -170 ct 2722 -127 2715 -94 2703 -70 ct 
+2690 -45 2671 -27 2647 -13 ct 2623 0 2596 7 2568 7 ct 2521 7 2484 -8 2456 -37 ct 
+2427 -67 2413 -110 2413 -165 ct p
+2470 -165 m  2470 -123 2480 -91 2498 -70 ct 2516 -49 2540 -39 2568 -39 ct 2595 -39 2618 -49 2637 -71 ct 
+2655 -92 2664 -124 2664 -167 ct 2664 -208 2655 -239 2636 -260 ct 2618 -281 2595 -291 2568 -291 ct 
+2540 -291 2516 -281 2498 -260 ct 2480 -239 2470 -207 2470 -165 ct p ef
+3000 -121 m  3055 -114 l  3049 -76 3033 -46 3009 -25 ct 2984 -4 2954 7 2918 7 ct 
+2873 7 2836 -8 2809 -37 ct 2782 -67 2768 -109 2768 -164 ct 2768 -199 2774 -230 2785 -257 ct 
+2797 -284 2815 -304 2839 -317 ct 2863 -330 2890 -337 2918 -337 ct 2954 -337 2983 -328 3006 -310 ct 
+3028 -292 3043 -266 3049 -233 ct 2995 -224 l  2990 -247 2981 -263 2968 -274 ct 
+2955 -286 2939 -291 2920 -291 ct 2892 -291 2869 -281 2852 -261 ct 2834 -241 2825 -209 2825 -165 ct 
+2825 -121 2834 -89 2851 -69 ct 2868 -49 2890 -39 2917 -39 ct 2939 -39 2957 -46 2972 -59 ct 
+2987 -72 2996 -93 3000 -121 ct p ef
+3103 0 m  3103 -455 l  3159 -455 l  3159 -196 l  3291 -330 l  3363 -330 l 
+3237 -207 l  3376 0 l  3307 0 l  3198 -169 l  3159 -131 l  3159 0 l  3103 0 l 
+p ef
+3368 126 m  3368 86 l  3738 86 l  3738 126 l  3368 126 l  p ef
+3985 0 m  3985 -42 l  3965 -9 3934 7 3893 7 ct 3867 7 3843 0 3821 -15 ct 3799 -29 3782 -49 3770 -75 ct 
+3758 -101 3752 -131 3752 -165 ct 3752 -198 3757 -228 3768 -254 ct 3779 -281 3796 -302 3817 -316 ct 
+3839 -330 3864 -337 3891 -337 ct 3911 -337 3928 -333 3944 -325 ct 3959 -316 3972 -305 3982 -292 ct 
+3982 -455 l  4037 -455 l  4037 0 l  3985 0 l  p
+3809 -165 m  3809 -123 3818 -91 3836 -70 ct 3854 -49 3874 -39 3899 -39 ct 3923 -39 3944 -49 3961 -69 ct 
+3978 -89 3986 -119 3986 -160 ct 3986 -205 3978 -238 3960 -259 ct 3943 -280 3922 -291 3896 -291 ct 
+3871 -291 3851 -281 3834 -261 ct 3817 -240 3809 -208 3809 -165 ct p ef
+4348 -107 m  4406 -99 l  4397 -66 4380 -40 4355 -21 ct 4331 -2 4299 7 4261 7 ct 
+4213 7 4175 -8 4147 -37 ct 4118 -67 4104 -109 4104 -162 ct 4104 -218 4119 -261 4147 -291 ct 
+4176 -322 4213 -337 4258 -337 ct 4302 -337 4338 -322 4366 -292 ct 4394 -262 4408 -220 4408 -166 ct 
+4408 -163 4408 -158 4407 -151 ct 4162 -151 l  4164 -115 4174 -87 4193 -68 ct 
+4211 -49 4234 -39 4261 -39 ct 4282 -39 4299 -44 4314 -55 ct 4328 -66 4340 -83 4348 -107 ct 
+p
+4165 -197 m  4349 -197 l  4346 -225 4339 -245 4328 -259 ct 4310 -280 4287 -291 4259 -291 ct 
+4233 -291 4211 -283 4194 -265 ct 4177 -248 4167 -226 4165 -197 ct p ef
+4689 -121 m  4744 -114 l  4738 -76 4722 -46 4698 -25 ct 4673 -4 4643 7 4607 7 ct 
+4562 7 4525 -8 4498 -37 ct 4471 -67 4457 -109 4457 -164 ct 4457 -199 4463 -230 4474 -257 ct 
+4486 -284 4504 -304 4528 -317 ct 4552 -330 4579 -337 4607 -337 ct 4643 -337 4672 -328 4695 -310 ct 
+4717 -292 4732 -266 4738 -233 ct 4684 -224 l  4679 -247 4670 -263 4657 -274 ct 
+4644 -286 4628 -291 4609 -291 ct 4581 -291 4558 -281 4541 -261 ct 4523 -241 4514 -209 4514 -165 ct 
+4514 -121 4523 -89 4540 -69 ct 4557 -49 4579 -39 4606 -39 ct 4628 -39 4646 -46 4661 -59 ct 
+4676 -72 4685 -93 4689 -121 ct p ef
+4771 -165 m  4771 -226 4788 -271 4822 -301 ct 4850 -325 4885 -337 4926 -337 ct 
+4971 -337 5008 -322 5036 -293 ct 5065 -263 5080 -222 5080 -170 ct 5080 -127 5073 -94 5061 -70 ct 
+5048 -45 5029 -27 5005 -13 ct 4981 0 4954 7 4926 7 ct 4879 7 4842 -8 4814 -37 ct 
+4785 -67 4771 -110 4771 -165 ct p
+4828 -165 m  4828 -123 4838 -91 4856 -70 ct 4874 -49 4898 -39 4926 -39 ct 4953 -39 4976 -49 4995 -71 ct 
+5013 -92 5022 -124 5022 -167 ct 5022 -208 5013 -239 4994 -260 ct 4976 -281 4953 -291 4926 -291 ct 
+4898 -291 4874 -281 4856 -260 ct 4838 -239 4828 -207 4828 -165 ct p ef
+5143 0 m  5143 -330 l  5193 -330 l  5193 -283 l  5203 -299 5217 -312 5234 -322 ct 
+5251 -332 5271 -337 5293 -337 ct 5317 -337 5337 -332 5353 -322 ct 5368 -312 5379 -297 5386 -279 ct 
+5412 -318 5446 -337 5487 -337 ct 5520 -337 5545 -328 5563 -310 ct 5580 -292 5589 -264 5589 -226 ct 
+5589 0 l  5534 0 l  5534 -208 l  5534 -230 5532 -246 5528 -256 ct 5525 -266 5518 -274 5508 -280 ct 
+5499 -286 5488 -289 5475 -289 ct 5452 -289 5433 -281 5417 -265 ct 5402 -250 5394 -225 5394 -191 ct 
+5394 0 l  5339 0 l  5339 -214 l  5339 -239 5334 -258 5325 -270 ct 5316 -282 5301 -289 5280 -289 ct 
+5265 -289 5250 -284 5237 -276 ct 5223 -268 5214 -256 5208 -240 ct 5202 -224 5199 -201 5199 -171 ct 
+5199 0 l  5143 0 l  p ef
+5672 126 m  5672 -330 l  5723 -330 l  5723 -287 l  5735 -304 5748 -316 5763 -324 ct 
+5778 -333 5797 -337 5818 -337 ct 5846 -337 5871 -330 5893 -315 ct 5914 -301 5930 -280 5941 -254 ct 
+5952 -228 5958 -199 5958 -167 ct 5958 -134 5952 -103 5940 -77 ct 5928 -50 5910 -29 5887 -15 ct 
+5864 0 5840 7 5814 7 ct 5796 7 5779 3 5764 -5 ct 5749 -13 5737 -23 5728 -35 ct 
+5728 126 l  5672 126 l  p
+5722 -163 m  5722 -121 5731 -90 5748 -69 ct 5765 -49 5786 -39 5810 -39 ct 5835 -39 5857 -49 5874 -70 ct 
+5892 -91 5901 -124 5901 -168 ct 5901 -210 5892 -241 5875 -262 ct 5858 -283 5837 -293 5813 -293 ct 
+5789 -293 5768 -282 5750 -260 ct 5732 -238 5722 -205 5722 -163 ct p ef
+pom
+
+0.880 c 12319 14478 m  8890 14478 l  8890 12192 l  15748 12192 l  15748 14478 l 
+12319 14478 l  p ef
+0.500 c 12319 14478 m  8890 14478 l  8890 12192 l  15748 12192 l  15748 14478 l 
+12319 14478 l  pc
+pum
+9468 13556 t
+0.234 c 42 0 m  42 -330 l  92 -330 l  92 -283 l  102 -299 116 -312 133 -322 ct 
+150 -332 170 -337 192 -337 ct 216 -337 236 -332 252 -322 ct 267 -312 278 -297 285 -279 ct 
+311 -318 345 -337 386 -337 ct 419 -337 444 -328 462 -310 ct 479 -292 488 -264 488 -226 ct 
+488 0 l  433 0 l  433 -208 l  433 -230 431 -246 427 -256 ct 424 -266 417 -274 407 -280 ct 
+398 -286 387 -289 374 -289 ct 351 -289 332 -281 316 -265 ct 301 -250 293 -225 293 -191 ct 
+293 0 l  238 0 l  238 -214 l  238 -239 233 -258 224 -270 ct 215 -282 200 -289 179 -289 ct 
+164 -289 149 -284 136 -276 ct 122 -268 113 -256 107 -240 ct 101 -224 98 -201 98 -171 ct 
+98 0 l  42 0 l  p ef
+571 126 m  571 -330 l  622 -330 l  622 -287 l  634 -304 647 -316 662 -324 ct 
+677 -333 696 -337 717 -337 ct 745 -337 770 -330 792 -315 ct 813 -301 829 -280 840 -254 ct 
+851 -228 857 -199 857 -167 ct 857 -134 851 -103 839 -77 ct 827 -50 809 -29 786 -15 ct 
+763 0 739 7 713 7 ct 695 7 678 3 663 -5 ct 648 -13 636 -23 627 -35 ct 627 126 l 
+571 126 l  p
+621 -163 m  621 -121 630 -90 647 -69 ct 664 -49 685 -39 709 -39 ct 734 -39 756 -49 773 -70 ct 
+791 -91 800 -124 800 -168 ct 800 -210 791 -241 774 -262 ct 757 -283 736 -293 712 -293 ct 
+688 -293 667 -282 649 -260 ct 631 -238 621 -205 621 -163 ct p ef
+1138 -41 m  1117 -24 1097 -11 1078 -4 ct 1059 3 1038 7 1017 7 ct 980 7 953 -2 933 -20 ct 
+914 -37 904 -60 904 -87 ct 904 -103 908 -118 915 -131 ct 922 -145 932 -156 944 -164 ct 
+956 -172 969 -178 984 -182 ct 995 -185 1011 -188 1034 -190 ct 1079 -196 1112 -202 1133 -209 ct 
+1133 -217 1133 -222 1133 -224 ct 1133 -247 1128 -263 1118 -272 ct 1103 -285 1082 -291 1054 -291 ct 
+1028 -291 1008 -286 996 -277 ct 983 -268 974 -252 968 -228 ct 914 -236 l  919 -259 927 -278 938 -292 ct 
+949 -307 966 -318 987 -326 ct 1009 -333 1034 -337 1062 -337 ct 1090 -337 1113 -334 1131 -327 ct 
+1148 -321 1161 -312 1169 -302 ct 1178 -292 1183 -280 1187 -264 ct 1189 -255 1190 -238 1190 -213 ct 
+1190 -138 l  1190 -87 1191 -54 1193 -40 ct 1195 -26 1200 -13 1207 0 ct 1149 0 l 
+1143 -12 1139 -26 1138 -41 ct p
+1133 -166 m  1113 -157 1082 -150 1042 -145 ct 1019 -141 1003 -138 993 -133 ct 
+984 -129 976 -123 971 -115 ct 966 -107 963 -99 963 -89 ct 963 -74 969 -62 980 -52 ct 
+992 -42 1008 -37 1030 -37 ct 1051 -37 1070 -41 1087 -51 ct 1104 -60 1116 -73 1124 -89 ct 
+1130 -102 1133 -121 1133 -145 ct 1133 -166 l  p ef
+1252 -99 m  1307 -107 l  1310 -85 1318 -68 1333 -57 ct 1347 -45 1367 -39 1392 -39 ct 
+1418 -39 1437 -44 1449 -55 ct 1461 -65 1468 -77 1468 -91 ct 1468 -104 1462 -114 1451 -121 ct 
+1444 -126 1425 -132 1394 -140 ct 1353 -150 1325 -159 1309 -167 ct 1293 -174 1281 -185 1273 -198 ct 
+1265 -211 1261 -226 1261 -242 ct 1261 -257 1264 -270 1271 -283 ct 1278 -295 1287 -306 1298 -314 ct 
+1307 -320 1319 -326 1334 -330 ct 1349 -335 1365 -337 1382 -337 ct 1408 -337 1431 -333 1450 -326 ct 
+1470 -318 1484 -308 1493 -296 ct 1503 -283 1509 -266 1513 -245 ct 1458 -237 l 
+1456 -254 1448 -267 1436 -277 ct 1425 -286 1408 -291 1386 -291 ct 1360 -291 1342 -287 1331 -278 ct 
+1320 -270 1315 -260 1315 -249 ct 1315 -241 1317 -235 1322 -229 ct 1326 -223 1333 -218 1343 -214 ct 
+1349 -212 1365 -207 1392 -200 ct 1432 -189 1459 -181 1475 -174 ct 1491 -167 1503 -158 1512 -145 ct 
+1521 -132 1525 -116 1525 -97 ct 1525 -79 1520 -61 1509 -45 ct 1498 -28 1482 -15 1462 -6 ct 
+1441 3 1418 7 1392 7 ct 1350 7 1317 -2 1294 -20 ct 1272 -37 1258 -64 1252 -99 ct 
+p ef
+1539 126 m  1539 86 l  1909 86 l  1909 126 l  1539 126 l  p ef
+1994 0 m  1943 0 l  1943 -455 l  1998 -455 l  1998 -293 l  2022 -322 2052 -337 2089 -337 ct 
+2109 -337 2128 -333 2146 -325 ct 2164 -317 2179 -305 2191 -290 ct 2202 -276 2212 -258 2218 -237 ct 
+2225 -216 2228 -194 2228 -170 ct 2228 -114 2214 -70 2186 -39 ct 2158 -8 2125 7 2086 7 ct 
+2047 7 2016 -9 1994 -42 ct 1994 0 l  p
+1994 -167 m  1994 -128 1999 -100 2010 -82 ct 2027 -53 2051 -39 2081 -39 ct 2106 -39 2127 -50 2144 -71 ct 
+2162 -92 2171 -123 2171 -165 ct 2171 -208 2163 -240 2145 -260 ct 2128 -281 2108 -291 2084 -291 ct 
+2059 -291 2038 -281 2020 -259 ct 2003 -238 1994 -208 1994 -167 ct p ef
+2293 0 m  2293 -455 l  2348 -455 l  2348 0 l  2293 0 l  p ef
+2413 -165 m  2413 -226 2430 -271 2464 -301 ct 2492 -325 2527 -337 2568 -337 ct 
+2613 -337 2650 -322 2678 -293 ct 2707 -263 2722 -222 2722 -170 ct 2722 -127 2715 -94 2703 -70 ct 
+2690 -45 2671 -27 2647 -13 ct 2623 0 2596 7 2568 7 ct 2521 7 2484 -8 2456 -37 ct 
+2427 -67 2413 -110 2413 -165 ct p
+2470 -165 m  2470 -123 2480 -91 2498 -70 ct 2516 -49 2540 -39 2568 -39 ct 2595 -39 2618 -49 2637 -71 ct 
+2655 -92 2664 -124 2664 -167 ct 2664 -208 2655 -239 2636 -260 ct 2618 -281 2595 -291 2568 -291 ct 
+2540 -291 2516 -281 2498 -260 ct 2480 -239 2470 -207 2470 -165 ct p ef
+3000 -121 m  3055 -114 l  3049 -76 3033 -46 3009 -25 ct 2984 -4 2954 7 2918 7 ct 
+2873 7 2836 -8 2809 -37 ct 2782 -67 2768 -109 2768 -164 ct 2768 -199 2774 -230 2785 -257 ct 
+2797 -284 2815 -304 2839 -317 ct 2863 -330 2890 -337 2918 -337 ct 2954 -337 2983 -328 3006 -310 ct 
+3028 -292 3043 -266 3049 -233 ct 2995 -224 l  2990 -247 2981 -263 2968 -274 ct 
+2955 -286 2939 -291 2920 -291 ct 2892 -291 2869 -281 2852 -261 ct 2834 -241 2825 -209 2825 -165 ct 
+2825 -121 2834 -89 2851 -69 ct 2868 -49 2890 -39 2917 -39 ct 2939 -39 2957 -46 2972 -59 ct 
+2987 -72 2996 -93 3000 -121 ct p ef
+3103 0 m  3103 -455 l  3159 -455 l  3159 -196 l  3291 -330 l  3363 -330 l 
+3237 -207 l  3376 0 l  3307 0 l  3198 -169 l  3159 -131 l  3159 0 l  3103 0 l 
+p ef
+3368 126 m  3368 86 l  3738 86 l  3738 126 l  3368 126 l  p ef
+3987 -121 m  4042 -114 l  4036 -76 4020 -46 3996 -25 ct 3971 -4 3941 7 3905 7 ct 
+3860 7 3823 -8 3796 -37 ct 3769 -67 3755 -109 3755 -164 ct 3755 -199 3761 -230 3772 -257 ct 
+3784 -284 3802 -304 3826 -317 ct 3850 -330 3877 -337 3905 -337 ct 3941 -337 3970 -328 3993 -310 ct 
+4015 -292 4030 -266 4036 -233 ct 3982 -224 l  3977 -247 3968 -263 3955 -274 ct 
+3942 -286 3926 -291 3907 -291 ct 3879 -291 3856 -281 3839 -261 ct 3821 -241 3812 -209 3812 -165 ct 
+3812 -121 3821 -89 3838 -69 ct 3855 -49 3877 -39 3904 -39 ct 3926 -39 3944 -46 3959 -59 ct 
+3974 -72 3983 -93 3987 -121 ct p ef
+4088 0 m  4088 -330 l  4138 -330 l  4138 -280 l  4151 -303 4163 -318 4174 -326 ct 
+4185 -333 4197 -337 4210 -337 ct 4229 -337 4248 -331 4267 -319 ct 4248 -267 l 
+4234 -275 4221 -279 4207 -279 ct 4195 -279 4184 -276 4174 -268 ct 4164 -261 4157 -251 4153 -238 ct 
+4147 -218 4144 -196 4144 -173 ct 4144 0 l  4088 0 l  p ef
+4526 -107 m  4584 -99 l  4575 -66 4558 -40 4533 -21 ct 4509 -2 4477 7 4439 7 ct 
+4391 7 4353 -8 4325 -37 ct 4296 -67 4282 -109 4282 -162 ct 4282 -218 4297 -261 4325 -291 ct 
+4354 -322 4391 -337 4436 -337 ct 4480 -337 4516 -322 4544 -292 ct 4572 -262 4586 -220 4586 -166 ct 
+4586 -163 4586 -158 4585 -151 ct 4340 -151 l  4342 -115 4352 -87 4371 -68 ct 
+4389 -49 4412 -39 4439 -39 ct 4460 -39 4477 -44 4492 -55 ct 4506 -66 4518 -83 4526 -107 ct 
+p
+4343 -197 m  4527 -197 l  4524 -225 4517 -245 4506 -259 ct 4488 -280 4465 -291 4437 -291 ct 
+4411 -291 4389 -283 4372 -265 ct 4355 -248 4345 -226 4343 -197 ct p ef
+4867 -41 m  4846 -24 4826 -11 4807 -4 ct 4788 3 4767 7 4746 7 ct 4709 7 4682 -2 4662 -20 ct 
+4643 -37 4633 -60 4633 -87 ct 4633 -103 4637 -118 4644 -131 ct 4651 -145 4661 -156 4673 -164 ct 
+4685 -172 4698 -178 4713 -182 ct 4724 -185 4740 -188 4763 -190 ct 4808 -196 4841 -202 4862 -209 ct 
+4862 -217 4862 -222 4862 -224 ct 4862 -247 4857 -263 4847 -272 ct 4832 -285 4811 -291 4783 -291 ct 
+4757 -291 4737 -286 4725 -277 ct 4712 -268 4703 -252 4697 -228 ct 4643 -236 l 
+4648 -259 4656 -278 4667 -292 ct 4678 -307 4695 -318 4716 -326 ct 4738 -333 4763 -337 4791 -337 ct 
+4819 -337 4842 -334 4860 -327 ct 4877 -321 4890 -312 4898 -302 ct 4907 -292 4912 -280 4916 -264 ct 
+4918 -255 4919 -238 4919 -213 ct 4919 -138 l  4919 -87 4920 -54 4922 -40 ct 
+4924 -26 4929 -13 4936 0 ct 4878 0 l  4872 -12 4868 -26 4867 -41 ct p
+4862 -166 m  4842 -157 4811 -150 4771 -145 ct 4748 -141 4732 -138 4722 -133 ct 
+4713 -129 4705 -123 4700 -115 ct 4695 -107 4692 -99 4692 -89 ct 4692 -74 4698 -62 4709 -52 ct 
+4721 -42 4737 -37 4759 -37 ct 4780 -37 4799 -41 4816 -51 ct 4833 -60 4845 -73 4853 -89 ct 
+4859 -102 4862 -121 4862 -145 ct 4862 -166 l  p ef
+5125 -50 m  5133 -1 l  5117 2 5103 4 5091 4 ct 5070 4 5055 1 5043 -6 ct 5032 -12 5024 -20 5020 -31 ct 
+5015 -41 5013 -63 5013 -97 ct 5013 -287 l  4972 -287 l  4972 -330 l  5013 -330 l 
+5013 -412 l  5069 -445 l  5069 -330 l  5125 -330 l  5125 -287 l  5069 -287 l 
+5069 -94 l  5069 -78 5070 -68 5072 -63 ct 5074 -58 5077 -55 5081 -52 ct 5086 -49 5092 -48 5100 -48 ct 
+5106 -48 5115 -49 5125 -50 ct p ef
+5160 -165 m  5160 -226 5177 -271 5211 -301 ct 5239 -325 5274 -337 5315 -337 ct 
+5360 -337 5397 -322 5425 -293 ct 5454 -263 5469 -222 5469 -170 ct 5469 -127 5462 -94 5450 -70 ct 
+5437 -45 5418 -27 5394 -13 ct 5370 0 5343 7 5315 7 ct 5268 7 5231 -8 5203 -37 ct 
+5174 -67 5160 -110 5160 -165 ct p
+5217 -165 m  5217 -123 5227 -91 5245 -70 ct 5263 -49 5287 -39 5315 -39 ct 5342 -39 5365 -49 5384 -71 ct 
+5402 -92 5411 -124 5411 -167 ct 5411 -208 5402 -239 5383 -260 ct 5365 -281 5342 -291 5315 -291 ct 
+5287 -291 5263 -281 5245 -260 ct 5227 -239 5217 -207 5217 -165 ct p ef
+5532 0 m  5532 -330 l  5582 -330 l  5582 -280 l  5595 -303 5607 -318 5618 -326 ct 
+5629 -333 5641 -337 5654 -337 ct 5673 -337 5692 -331 5711 -319 ct 5692 -267 l 
+5678 -275 5665 -279 5651 -279 ct 5639 -279 5628 -276 5618 -268 ct 5608 -261 5601 -251 5597 -238 ct 
+5591 -218 5588 -196 5588 -173 ct 5588 0 l  5532 0 l  p ef
+pom
+
+0.000 c 22606 1524 m  21654 1524 22288 4826 21336 4826 ct ps
+22606 1524 m  21654 1524 22288 8382 21336 8382 ct ps
+17018 4826 m  15494 4826 16510 6223 14986 6223 ct ps
+17018 8382 m  15494 8382 16510 6223 14986 6223 ct ps
+17018 8382 m  16066 8382 16700 10287 15748 10287 ct ps
+17018 8382 m  16066 8382 16700 13335 15748 13335 ct ps
+22606 1524 m  3747 1524 11620 8890 6858 8890 ct ps
+8890 10287 m  7366 10287 8382 8890 6858 8890 ct ps
+8890 13335 m  7366 13335 8382 8890 6858 8890 ct ps
+gr
+gs
+0 0 m 27999 0 l 27999 20999 l 0 20999 l 0 0 l eoclip newpath
+gr
+gr
+0 21000 t 
+pom
+count op_count sub {pop} repeat countdictstack dict_count sub {end} repeat b4_inc_state restore
+%%PageTrailer
+%%Trailer
+%%EOF

Copied: trunk/documents/shared/finished_design_doc/multiple_blocks/mpas_multiple_blocks.pdf (from rev 2048, branches/omp_blocks/docs/mpas_multiple_blocks.pdf)
===================================================================
(Binary files differ)

Copied: trunk/documents/shared/finished_design_doc/multiple_blocks/mpas_multiple_blocks.tex (from rev 2048, branches/omp_blocks/docs/mpas_multiple_blocks.tex)
===================================================================
--- trunk/documents/shared/finished_design_doc/multiple_blocks/mpas_multiple_blocks.tex                                (rev 0)
+++ trunk/documents/shared/finished_design_doc/multiple_blocks/mpas_multiple_blocks.tex        2012-08-16 20:57:13 UTC (rev 2105)
@@ -0,0 +1,474 @@
+\documentclass[11pt]{report}
+
+\usepackage{graphicx}
+\usepackage{listings}
+\usepackage{color}
+\usepackage{placeins}
+
+\setlength{\topmargin}{0in}
+\setlength{\headheight}{0in}
+\setlength{\headsep}{0in}
+\setlength{\textheight}{9.0in}
+\setlength{\textwidth}{6.5in}
+\setlength{\evensidemargin}{0in}
+\setlength{\oddsidemargin}{0in}
+
+
+\begin{document}
+
+\title{Implementing Multiple Blocks within MPAS Framework}
+\author{}
+
+\maketitle
+\tableofcontents
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% Introduction
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\chapter{Introduction}
+
+Previously several projects have been worked on with the end goal of supporting
+multiple blocks. These tasks are described below.
+
+\begin{enumerate}
+
+\item Update/extend the fundamental derived types in mpas\_grid\_types.F.                                
+   In order for other parts of the infrastructure to handle multiple                                
+   blocks per task in a clean way, we'll need to be able to pass a head                             
+   pointer to a field into a routine, and have that routine loop through                            
+   all blocks for that field, with information about which cells/edges/vertices                     
+   in that field need to be communicated.                                                           
+                                                                                                    
+\item Decide on a new MPAS I/O abstraction layer, which will provide a                                
+   high-level interface to the PIO layer for the rest of MPAS. This layer                           
+   should work with blocks of fields, and make it possible to define an                             
+   arbitrary set of I/O streams at run-time.                                                        
+                                                                                                    
+\item Add a new module to parse a run-time I/O configuration file that                                
+   will describe which fields are read or written to each of the I/O                                
+   streams that a user requests via the file. This module will make calls                           
+   to the new MPAS I/O layer to register the requested fields for I/O in                            
+   the requested streams.                                          
+   
+\item Update the mpas\_dmpar module to support communication operations on                              
+   multiple blocks per task. This will likely involve revising the                                  
+   internal data structures used to define communication of cells                                   
+   between tasks, and also require revisions to the public interface                                
+   routines themselves.                                                                             
+                                                                                                    
+\item Modify the block\_decomp module to enable a task to get a list of                                 
+   cells in more than one block that it is to be the owner of.                                      
+   Implemented in the simplest way, there could simply be a namelist                                
+   option to specify how many blocks each task should own, and the                                  
+   block\_decomp module could look for a graph.info.part.n file, with                                
+   n=num\_blocks\_per\_task*num\_tasks, and assign blocks k, 2k, 3k, ...,                               
+   num\_blocks\_per\_task*k to task k.    
+
+\end{enumerate}                                                             
+
+This document related to tying all of these projects together, and allowing
+MPAS to run with multiple blocks per MPI process.
+
+As an example of what running with multiple blocks means, currently MPAS is
+allowed to run with 1 block per process. This means prior to running MPAS a
+decomposition of cells needs to be determined. This decomposition tells each
+MPI process which cells it owns. So, under the current framework the number of
+decompositions have to be equal to the number of MPI tasks used to run the job. 
+
+After this project is completed, a user should be able to specify the use of a
+decomposition that does not have an equal number of blocks as the number of
+processors the job is run with. Typically this would be used to allow more than
+one block per processor, but could theoretically be used to run having some
+processors not have any blocks.
+
+The goal with this project is to allow exploration of OpenMP directives, and
+test performance using different block sizes. Allowing multiple blocks per
+processor could increase cache reuse and allow a performance increase.
+
+This work is currently being performed under
+branches/omp\_blocks/multiple\_blocks and all source code changes can be
+examined there.
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% Requirements
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\chapter{Requirements}
+
+There are significant changes to MPAS' framework that have to be made in order
+to support multiple blocks. A list of requirements that determine these changes
+are listed below, with the reasons for these requirements written below them.
+
+\begin{itemize}
+        \item Block creation must be robust, and handle an arbitrary number
+                of blocks per processor.
+
+        \item Blocks should be created using the derived data types created in an
+                earlier project, promoting the use of field data types rather than
+                simple arrays.
+
+        \item Block creation routines should be created with an arbitrary number of
+                halos assumed, although the default is currently two.
+
+        \item All block communication routines should be able to handle shared
+                memory copies.
+
+        \item Exchange list creation should be performed at the block/field level.
+
+        \item Block creation code should be isolated from the rest of MPAS code.
+\end{itemize}
+
+Blocks per processor should be allowed to be any non-negative number, including
+zero. This could be useful if a user wanted the ability to specify certain
+processors to do certain tasks, without doing any actual computation work on
+blocks. Although the user would have to give an explicit block to proc
+decomposition in order to have this ability used.
+
+In the creation of blocks, field data types should be used in place of simple
+arrays to promote the use of internal derived data types that are used
+elsewhere within MPAS. This will allow similar techniques to be identified by
+developers of cores, and allow a similar work flow with variables and fields
+within all of MPAS.
+
+Although fields currently are restricted to having two halo layers, at some
+point in the future we might like to be able to extend halo layers or even have
+different halo layers on each field. In order to make this task easier to
+accomplish in the future block creation routines need to be able to create an
+arbitrary number of halo layers. 
+
+When two blocks are neighboring on a single processor shared memory copies
+could be used for halo exchanges and other sorts of block-to-block
+communications rather than using MPI send/recv routines.
+
+Exchange lists are limited in their functionality by the fact that the only
+information they have refer to the other processor/block involved in the
+communication. For example, if processor 0 owns block 0 and this has to send
+information from 15 cells to processor 2 block 5 then the send list for block 0
+only gives the information on where it has to send the information, while the
+receive list on block 5 gives information on where to receive the information
+from. Because of this, exchange lists have to be created on a per block basis,
+and linked to a specific block. This way each block knows which cells it's
+supposed to send/recv/copy to/from another block. Each field and block have
+their own exchange lists, so the creation of exchange lists should place them
+within these already existing structures.
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% Design
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\chapter{Design}
+
+Only a small amount of design has been completed thus far. So, all information
+in this section should be regarded as a work in progress for now. As a visual
+for the design process, the proposed module layout can be seen in figure
+\ref{fig:module_layout}.
+
+\begin{figure}[H!]
+        \centering
+        \includegraphics[scale=0.4]{DesignLayout.eps}
+        \caption{Layout of modules for input/output with multiple blocks}
+        \label{fig:module_layout}
+\end{figure}
+
+The changes made to mpas framework can be seen in the following sections.
+
+\section{Changes in mpas\_dmpar}
+This section covers the changes, and the new functionality of the changes that
+were made within the mpas\_dmpar.F file. The first major change, is that dmpar
+is renamed to comm meaning communications. 
+
+\subsection{Data types}
+Previously the derived data type mpas\_exchange\_list was used to create a linked list which represented an exchange list (send or receive). Exchange lists have been modified from their original state to have the following structure.
+\begin{lstlisting}[language=fortran,escapechar=@,frame=single]
+type mpas_exchange_list
+ integer :: endPointID
+ integer :: nlist
+ integer, dimension(:), pointer :: srcList
+ integer, dimension(:), pointer :: destList
+ type (mpas_exchange_list), pointer :: next
+end type mpas_exchange_list
+\end{lstlisting}
+
+Within this structure endPointID can be either a blockID (for local copy) or a procID for mpi send/recv, nList represents the number of elements to be communication within this exchange list, srcList and destList represent the information for packing and unpacking data into buffers or for local copies from/to arrays.
+
+Seeing as the exchange lists no longer contain an array for the communication buffers a new data type was created which can be seen below.
+
+\begin{lstlisting}[language=fortran,escapechar=@,frame=single]
+type mpas_communication_list
+ integer :: procID
+ integer :: nlist
+ real (kind=RKIND), dimension(:), pointer :: rbuffer
+ integer, dimension(:), pointer :: ibuffer
+ integer :: reqID
+ type (mpas_communication_list), pointer :: next
+end type mpas_communication_list
+\end{lstlisting}
+
+An mpas\_communcation\_list is only intended to be used for mpi communications. These have to be created and destroyed each time a communcation is performed. Within the structure, procID represents the other endPoint's processor ID in the communication, nList is the number of elements to be communicated within the buffer, rbuffer and ibuffer are the pointers for the buffer of either integers or reals, reqID represents the mpi communcation id, and next creates a linked list.
+
+Two other data structures are created to allow multi halo exchange lists, and to allow pointers to be swapped easily using them.
+
+\begin{lstlisting}[language=fortran,escapechar=@,frame=single]
+type mpas_exchange_list_pointer
+ type (mpas_exchange_list), pointer :: exchList
+end type mpas_exchange_list_pointer
+
+type mpas_multihalo_exchange_list
+ type (mpas_exchange_list_pointer), dimension(:), pointer :: halos
+end type mpas_multihalo_exchange_list
+\end{lstlisting}
+
+Combining these four structures allows local and mpi communications to occur smoothly.
+
+\subsection{mpas\_comm\_get\_exch\_list}
+The old routine named mpas\_dmpar\_get\_owner\_list is now renamed to mpas\_comm\_get\_exch\_list. This routine is meant to create send, receive, and copy lists to send data from one processor to another. During initialization it's used for the allToAll communication routines (which will be described below) but within cores it's almost exclusively used for halo exchanges.
+
+It works by creating two lists of element id's (typically cells, edges, or vertices). One of these lists is owned elements while the other is needed elements. The needed list is communication round robin style to each processor until it comes back to the original processor. Each processor marks a needed element in the list as owned if it owns it. This way the processor that needs the element knows who it's supposed to receive the element from.
+
+During the round robin communications send lists are created as needed elements are marked as owned. After the round robin communications are finished receive lists are created. And after receive lists are created copy lists are created in a similar fashion to send lists.
+
+\subsection{allToAll routines}
+mpas\_comm provides a set of allToAll routines intended to distribute a field from one processor to one or more other processors. In this case, the sending information is supposed to include the 0 halo elements. In contrast to the exch\_halo routines which are intended to only communication 1+ halo elements.
+
+A pseudocode version of the allToAll routines can be seen below.
+\begin{lstlisting}[language=fortran,escapechar=@,frame=single]
+loop over fieldOut list
+  loop over recvList for specific field
+    create new communication list if needed
+  end loop
+end loop
+
+allocate recvList buffers and initiate mpi_irecvs
+
+loop over fieldIn list
+  loop over sendList for specific field
+    create new communication list if needed
+  end loop
+end loop
+
+allocate sendList buffers, copy data into buffer
+  initiate mpi_isends
+
+loop over fieldIn list
+  loop over copyList for specific field
+    loop over fieldOut list
+      if fieldOut % blockID == copyList % endPointID
+        use copy list to copy from fieldIn to fieldOut
+          end if
+        end loop
+  end loop
+end loop
+
+wait for mpi_irecvs
+  unpack buffer into fields
+
+wait for mpi_isends
+
+destroy buffers
+\end{lstlisting}
+
+\subsection{exch\_halo routines}
+mpas\_comm provides a set of halo exchange routines intended to distribute a set of 0 halo elements to other blocks that have them in their 1+ halo regions.
+
+A pseudocode version of the halo exchange routines can be seen below.
+\begin{lstlisting}[language=fortran,escapechar=@,frame=single]
+loop over field list
+  loop over recvList for specific field
+    create new communication list if needed
+  end loop
+end loop
+
+allocate recvList buffers and initiate mpi_irecvs
+
+loop over field list
+  loop over sendList for specific field
+    create new communication list if needed
+  end loop
+end loop
+
+allocate sendList buffers, copy data into buffer
+  initiate mpi_isends
+
+loop over field list
+  loop over copyList for specific field
+    loop over field list
+      if field % blockID == copyList % endPointID
+        use copy list to copy from fieldIn to fieldOut
+          end if
+        end loop
+  end loop
+end loop
+
+wait for mpi_irecvs
+  unpack buffer into fields
+
+wait for mpi_isends
+
+destroy buffers
+\end{lstlisting}
+
+\subsection{copy routines}
+mpas\_comm provides a set of routines intended to copy a field from the header block in a list of owned blocks to all other blocks in the list. These are needed during initialization to copy non-decomposed fields (fields that don't include the nCells, nEdges, or nVertices as a dimension) to all owned blocks.
+
+\subsection{Utility routines}
+In addition to communcation routines, mpas\_comm provides utility routines for the initialization and destruction of all derived data types discussed above.
+
+\section{mpas\_block\_creator.F}
+mpas\_block\_creator provides a new module for mpas that is used to create computational blocks. Given the information of a 0 halo, these routines create the 1+ halo regions for cells, edges, and vertices. They also initialize the list of local blocks.
+
+\subsection{Cell Routines}
+Routines to setup cell fields within a block are:
+\begin{lstlisting}[language=fortran,escapechar=@,frame=single]
+mpas_block_creator_setup_blocks_and_0halo_cells
+mpas_block_creator_build_0halo_cell_fields
+mpas_block_creator_build_cell_halos
+\end{lstlisting}
+
+These routines should be called in this order to properly setup the 0-1+ halo of cells. However, the build\_cell\_halos routine should not be called until all 0 halo fields are setup (including edges and vertices).
+
+\subsection{Edge/Vertex Routines}
+Routines used to setup edge/vertex fields within a block are:
+\begin{lstlisting}[language=fortran,escapechar=@,frame=single]
+mpas_block_creator_build_0_and_1halo_edge_fields
+mpas_block_creator_build_edge_halos
+\end{lstlisting}
+
+As mentioned in the cell routine section, the 0-1 halos of edges and vertices should be setup prior to setting up the 1+ halos of cells.
+
+\subsection{Utility Routines}
+Finally, two routines are provided to finalize the block initialization, and to re-index all fields in a block.
+
+\begin{lstlisting}[language=fortran,escapechar=@,frame=single]
+mpas_block_creator_finalize_block_init
+mpas_block_creator_reindex_block_fields
+\end{lstlisting}
+
+These routines complete the block creation processor, and provide the rest of a model with a list of fully setup blocks to compute on.
+
+\section{mpas\_io\_input changes}
+Within mpas\_io\_input the main mpas\_input\_state\_for\_domain routine has been trimmed significantly to make use of the new mpas\_block\_creator module the portions of the routine that were not able to be moved into the block\_creator module were moved to new routines within the io\_input module.
+
+This module also makes use of the new communication routines from mpas\_comm, as well as some routines in mpas\_block\_decomp.
+
+The new routines provided to clean up mpas\_input\_state\_for\_domain are:
+\begin{lstlisting}[language=fortran,escapechar=@,frame=single]
+mpas_io_setup_cell_block_fields
+mpas_io_setup_edge_block_fields
+mpas_io_setup_vertex_block_fields
+\end{lstlisting}
+These routines are intended to read in contiguous chunks of data that can then be communication between processors.
+
+\section{mpas\_grid\_types changes}
+Within mpas\_grid\_types, utility routines are created to deallocate fields. This is used within mpas\_io\_input for fields that need to be linked similarly to block, but are not part of the block data structure.
+
+In addition to utility routine additions, a pointer provis was created within the block\_type. provis is intended to be a scratch state. This can be used within time integration routines that require an additional time level, without having to modify the number of time levels within state. 
+
+\section{Namelist changes}
+With the addition of multiple blocks in the framework of mpas, the decomposition namelist section will be made use of. This section provides the following namelist options.
+\begin{lstlisting}[language=fortran,escapechar=@,frame=single]
+config_block_decomp_file_prefix
+config_number_of_blocks
+config_explicit_proc_decomp
+config_proc_decomp_file_prefix
+\end{lstlisting}
+
+The prefix options are used to specify the prefixes on decomposition graph files used to create blocks, and determine which blocks are owned by which processors, config\_number\_of\_blocks determines how many blocks the simulation is supposed to be run with, and config\_explicit\_proc\_decomp is a logical flag which determines if mpas should look for a graph file describing how blocks should be distributed between processor, or if it should round robin assign blocks to processors.
+
+In addition to the decomposition section changes, the model sections (like sw\_model) now has a new namelist option:
+
+\begin{lstlisting}[language=fortran,escapechar=@,frame=single]
+config_num_halos
+\end{lstlisting}
+
+This namelist flag determines how many halo layers each block should have on cells. The halo layers for edges and vertices are nHaloLayerCells+1, or config\_num\_halos + 1.
+
+\chapter{Testing}
+**NOTE**
+All of the testing described in this section relates only to the ocean core.
+Other core developers may test this with similar procedures but different
+simulations. \\
+
+The end goal from this project is to provide a framework that allows
+bit-for-bit reproduction of data using an arbitrary combination of blocks and
+processor numbers.
+
+Using this goal to define a testing strategy implies a good test would be
+exploring bit-for-bit reproduction of output data using the three following
+simulations:
+\begin{itemize}
+        \item Current trunk simulation run with 8 processors and 8 blocks (1 block per proc).
+        \item Finished branch simulation run with 8 processors and 8 blocks (1 block per proc).
+        \item Finished branch simulation run with 1 processor and 8 blocks (8 blocks per proc).
+        \item Finished branch simulation run with 2 processors and 8 blocks (4 blocks per proc).
+\end{itemize}
+
+If all of these simulations produce bit-for-bit output then testing can move on
+to a set of larger scale simulations.
+
+\begin{itemize}
+        \item Current trunk 15km simulation with 1200 processors and 1200 blocks (1 block per proc).
+        \item Finished branch simulation with 1200 processors and 1200 blocks (1 block per proc).
+        \item Finished branch simulation with 600 processors and 1200 blocks (2 blocks per proc).
+        \item Finished branch simulation with 24 processors and 1200 blocks (50 blocks per proc).
+\end{itemize}
+
+After these final four simulations show bit-for-bit output then the project can
+be deemed as completed.
+
+\chapter{Appendix - Use of exchange/communication lists}
+This chapter will describe the use of exchange and communication lists.
+
+To begin, exchange lists have two uses. First copyLists will be described,
+followed by send/recvLists.
+
+copyLists are attached to the block sending the data, and there is no matching
+list on the receiving end. Within the copyList, the endPointID variable
+represents a blockID giving the local id to the block on the other end of the
+communication, nList is the total number of elements that need to be copied,
+srcList is the list of indices to take this data from out of the owning field's
+array, and destList is the list of indices to put this data into the needing
+field's array. 
+
+In using copyLists, first a search over blocks needs to be preformed
+to find the matching block for the communication. After that the elements
+listed in srcList are copied into the elements listed in destList. After which,
+the shared memory copy is complete.
+
+The second use case relates to send/recvLists. sendLists are attached to
+sending blocks, while recvLists are attached to receiving blocks. Within both
+of these, endPointID refers to a processor id, and nList refers to the number
+of elements a specific block should expect to communicate. In a sendList,
+srcList describes the indices to pull data out from the owning field's array
+while destList descibes the indices to put that data into a communication
+list's buffer. In a recvList, srcList describes the indices to pull the data
+out of the buffer, while destList describes the indices to put that data into
+the needing field's array.
+
+In order to use these, each side of the communication does something different.
+Before describing the use of send and recv lists, communication lists need to
+be explained.
+
+A communication list describes aggregated communications between processors.
+These provide an easy to use framework to allow communications to occur
+processor by processor as opposed to block by block. Since communication lists
+only relate to MPI communications, the only ID within the type is procID. nList
+refers to the number of elements in the buffer, while rbuffer and ibuffer
+provide deallocated arrays to put reals or integers in the buffer, and reqID
+provides a variable to store MPI communication ID's to use when calling
+MPI\_Wait.
+
+In order to perform a send an receive, first a processor needs to build the
+buffers, or communication lists. To begin the fields relating to the specific
+communication are looped over, and the total number of elements to each
+processor are stored in order to build a communication list for that processor.
+After this step, the communication list buffers are allocated relating to their
+nList varibles. Buffers need to be created both on the sending and receiving
+side. After the buffers are created, the sending field copies all of it's data
+into the array. The buffer is then sent, and on the receiving end the receiving
+field unpacks all of the data into it's arrays.
+\end{document}

</font>
</pre>