Patch: More UML Class Diagrams

Jeffrey Oldham oldham at codesourcery.com
Tue Mar 5 00:00:49 UTC 2002


2002-Mar-04  Jeffrey D. Oldham  <oldham at codesourcery.com>

This patch mainly finishes adding UML class diagrams to the manual.
	
	* Makefile (XMLSOURCES): Add uml.xml.
	* code.xml: Minor wordsmithing.
	* pooma.xml: Revised revision history.  Move UML class diagram
	code to separate file.
	* preface.xml: Minor wordsmithing.
	* starting.xml: Likewise.
	* template.xml: Remove extra space.
	* uml.xml: New file containing UML class diagrams.
	* figures/Makefile (UML_DIAGRAMS): Add nams of UML class diagrams.
	  Add rules for creating UML class diagrams.
	* figures/array-uml-1.png: New file containing a UML class diagram.
	* figures/array-uml-2.png: Likewise.
	* figures/array-uml-3.png: Likewise.
	* figures/array-uml.mp: Expand list of member functions.
	* figures/distributed-uml-10.png: New file containing a UML class
	diagram.
	* figures/distributed-uml-11.png: Likewise.
	* figures/distributed-uml-20.png: Likewise.
	* figures/distributed-uml-21.png: Likewise.
	* figures/distributed-uml-22.png: Likewise.
	* figures/distributed-uml-23.png: Likewise.
	* figures/distributed-uml-24.png: Likewise.
	* figures/distributed-uml-3.png: Likewise.
	* figures/distributed-uml-30.png: Likewise.
	* figures/distributed-uml-4.png: Likewise.
	* figures/distributed-uml-5.png: Likewise.
	* figures/distributed-uml.mp: New file describing class diagrams
	related to distributed computing.
	* figures/domain-uml-1.png: New file containing a UML class diagram.
	* figures/domain-uml.mp: Minor tweaking.
	* figures/engine-uml-1.png: New file containing a UML class diagram.
	* figures/engine-uml.mp: Rearrange layout of fig(1).
	* figures/explanation-uml-1.png: New file containing a UML class
	diagram.
	* figures/explanation-uml.mp: Slight revisions.
	* figures/field-uml-1.png: New file containing a UML class diagram.
	* figures/field-uml-10.png: Likewise.
	* figures/field-uml-11.png: Likewise.
	* figures/field-uml-2.png: Likewise.
	* figures/field-uml-3.png: Likewise.
	* figures/field-uml.mp: New file describing class diagrams for
	fields.
	* figures/introduction.mp: Remove extraneous comments.
	* figures/macros.ltx (\tilder): New command.
	* figures/math-objs-uml-1.png: New file containing a UML class diagram.
	* figures/math-objs-uml-10.png: Likewise.
	* figures/math-objs-uml-11.png: Likewise.
	* figures/math-objs-uml-2.png: Likewise.
	* figures/math-objs-uml-3.png: Likewise.
	* figures/math-objs-uml-4.png: Likewise.
	* figures/math-objs-uml.mp: New file describing class diagrams for
	vectors, tensors, and matrices.
	* figures/uml.mp (discriminatorLength): New value.

Applied to	mainline.

Thanks,
Jeffrey D. Oldham
oldham at codesourcery.com
-------------- next part --------------
Index: Makefile
===================================================================
RCS file: /home/pooma/Repository/r2/docs/manual/Makefile,v
retrieving revision 1.8
diff -c -p -r1.8 Makefile
*** Makefile	2002/02/27 03:51:53	1.8
--- Makefile	2002/03/04 22:50:50
*************** MANUALNAME= pooma
*** 17,23 ****
  XMLSOURCES= $(MANUALNAME).xml preface.xml starting.xml \
  	    introduction.xml tutorial.xml \
              concepts.xml arrays.xml data-parallel.xml glossary.xml \
!             bibliography.xml template.xml code.xml
  
  # Create all versions of the manual.
  all: $(MANUALNAME).ps $(MANUALNAME).pdf $(MANUALNAME).html
--- 17,23 ----
  XMLSOURCES= $(MANUALNAME).xml preface.xml starting.xml \
  	    introduction.xml tutorial.xml \
              concepts.xml arrays.xml data-parallel.xml glossary.xml \
!             bibliography.xml template.xml code.xml uml.xml
  
  # Create all versions of the manual.
  all: $(MANUALNAME).ps $(MANUALNAME).pdf $(MANUALNAME).html
Index: code.xml
===================================================================
RCS file: /home/pooma/Repository/r2/docs/manual/code.xml,v
retrieving revision 1.1
diff -c -p -r1.1 code.xml
*** code.xml	2002/02/27 03:51:53	1.1
--- code.xml	2002/03/04 22:50:52
***************
*** 534,540 ****
  
      <para>Indentation follows the <application class="software">GNU
      Emacs</application>'s &cc; mode guidelines.  Most increases in
!     indentation levels starts two characters to the right.</para>
  
      <para>Most brackets, e.g., in function definitions, occur on
      separate lines.  Exceptions are for very short functions.</para>
--- 534,540 ----
  
      <para>Indentation follows the <application class="software">GNU
      Emacs</application>'s &cc; mode guidelines.  Most increases in
!     indentation levels start two characters to the right.</para>
  
      <para>Most brackets, e.g., in function definitions, occur on
      separate lines.  Exceptions are for very short functions.</para>
***************
*** 604,610 ****
     <section id="sources-conventions-globals">
      <title>Global Variables</title>
  
!     <para>Global variables are avoided whenever possible.</para>
     </section>
  
  
--- 604,614 ----
     <section id="sources-conventions-globals">
      <title>Global Variables</title>
  
!     <para>Global variables are avoided whenever possible.  Where
!     necessary, their names are the concatenation of capitalized words
!     such that the first word is not capitalized and a suffix of
!     <filename class="libraryfile">_g</filename> is appended, e.g.,
!     <literal>veryFewGlobalVariables_g</literal>.</para>
     </section>
  
  
***************
*** 804,810 ****
     <section id="sources-conventions-errors">
      <title>Errors and Exceptions</title>
  
!     <para>&pooma; code uses very few exception since not all &cc;
      compilers adequately support exceptions.  Thus, all uses must also
      have corresponding code not using exceptions.  See, e.g.,
      <literal>POOMA_EXCEPTIONS</literal> in the code.</para>
--- 808,814 ----
     <section id="sources-conventions-errors">
      <title>Errors and Exceptions</title>
  
!     <para>&pooma; code uses very few exceptions since not all &cc;
      compilers adequately support exceptions.  Thus, all uses must also
      have corresponding code not using exceptions.  See, e.g.,
      <literal>POOMA_EXCEPTIONS</literal> in the code.</para>
Index: pooma.xml
===================================================================
RCS file: /home/pooma/Repository/r2/docs/manual/pooma.xml,v
retrieving revision 1.4
diff -c -p -r1.4 pooma.xml
*** pooma.xml	2002/02/27 03:51:53	1.4
--- pooma.xml	2002/03/04 22:50:55
***************
*** 95,100 ****
--- 95,102 ----
    <!-- The C++ boolean type. -->
  <!ENTITY brick "<type>Brick</type>">
    <!-- The "Brick" engine type. -->
+ <!ENTITY centering "<type>Centering</type>">
+   <!-- The centering type. -->
  <!ENTITY char "<type>char</type>">
    <!-- The C char type. -->
  <!ENTITY complex "<type>complex</type>">
***************
*** 148,153 ****
--- 150,157 ----
    <!-- The "Loc<1>" one-dimensional domain type. -->
  <!ENTITY matrix "<type>TinyMatrix</type>">
    <!-- The Pooma matrix type. -->
+ <!ENTITY mesh "<type>Mesh</type>">
+   <!-- The "Mesh" type. -->
  <!ENTITY multipatch "<type>MultiPatch</type>">
    <!-- The "MultiPatch" engine without template parameters. -->
  <!ENTITY options "<type>Options</type>">
***************
*** 251,256 ****
--- 255,262 ----
    <!-- template programming appendix -->
  <!ENTITY tutorial-chapter SYSTEM "tutorial.xml">
    <!-- Doof2d tutorial programs chapter -->
+ <!ENTITY uml-appendix SYSTEM "uml.xml">
+   <!-- appendix of UML class diagrams -->
  
  <!-- External File Entities -->
  <!-- Doof2d Programs -->
***************
*** 304,311 ****
    </legalnotice>
    <revhistory>
     <revision>
      <revnumber>1.00</revnumber>
!     <date>2002 Jan 31</date>
      <authorinitials>jdo</authorinitials>
      <revremark>First publication.</revremark>
     </revision>
--- 310,325 ----
    </legalnotice>
    <revhistory>
     <revision>
+     <revnumber>1.01</revnumber>
+     <date>2002 Mar 01</date>
+     <authorinitials>jdo</authorinitials>
+     <revremark>Added UML class diagrams, revised compilation
+     directions, and added a description of the source code
+     structure.</revremark>
+    </revision>
+    <revision>
      <revnumber>1.00</revnumber>
!     <date>2002 Jan 31</date>
      <authorinitials>jdo</authorinitials>
      <revremark>First publication.</revremark>
     </revision>
*************** a(I,J) = (1.0/9.0) *
*** 1002,1009 ****
       architecture-specific initialization.  The function always
       returns &true;.</para>
  
- HERE
- 
       <para><function>initialize</function>'s alternative form
       assumes the &pooma;-specific and architecture-specific
       command-line arguments have already been removed from
--- 1016,1021 ----
*************** UNFINISHED</para>
*** 3680,3915 ****
   &template-appendix;
  
   &code-appendix;
- 
- 
-  <appendix id="uml">
-   <title>¨ Class Diagrams</title>
- 
-   <para>In this chapter, we present Unified Modeling Language (¨)
-   class diagrams.  These are created at the
-   <firstterm>specification</firstterm> level, which indicates the
-   software interface, not its implementation.  Readers interested in
-   the implementation are encouraged to read the corresponding source
-   code.  More extensive explanations of these classes appear in the
-   main chapters of this &book;.</para>
- 
-   <figure float="1" id="uml-explanation">
-    <title>Explanation of ¨ Class Diagrams</title>
-    <mediaobject>
-     <imageobject>
-      <imagedata fileref="figures/explanation-uml.1" format="EPS" align="center"></imagedata>
-     </imageobject>
-     <imageobject>
-      <imagedata fileref="figures/explanation-uml-1.png" format="PNG" align="center"></imagedata>
-     </imageobject>
-     <textobject>
-      <phrase>An Explanation of UML Class Diagrams</phrase>
-     </textobject>
-    </mediaobject>
-   </figure>
- 
-   <para><xref linkend="uml-explanation"></xref> illustrates a typical
-   ¨ class diagram.  The diagram has three classes:
-   <type>Classname1</type>, <type>Classname2</type>, and
-   <type>Classname2<1></type>.  Most classes are represented by
-   three-part boxes.  The top part lists the class's name.  The middle
-   part lists public data members, if any.  Few &pooma; classes have
-   public data members so this section is frequently empty.  The bottom
-   part lists public member functions, if any.
-   <type>Classname2<1></type> has only one part, not three.  Its
-   three-part box appears in another diagram, presumably because there
-   is not enough room in this one.  Both <type>Classname1</type> and
-   <type>Classname2</type> have template parameters, each named
-   <type>T</type>.  These occur in dashed boxes at the upper-right
-   corner of the class boxes.  Files implementing a class are listed at
-   the lower, right corner of the class's box; this is not standard UML
-   notation.</para>
- 
-   <para>Lines connect classes.  The solid arrow with large triangular
-   arrowhead indicates that <type>Classname2</type> is a subtype of
-   <type>Classname1</type>.  Since this diagram represents the
-   specification level, subtyping does not necessarily correspond to
-   &cc; type inheritance.  Also, subtype class boxes need only list
-   members not available in the supertype.  For this case,
-   <type>Classname2</type> has no new members not provided by
-   <type>Classname1</type>.  A dashed arrow indicates a class formed by
-   a template instantiation.  The class name indicates which template
-   parameters are bound.  For example, <type>Classname2<1></type>
-   instantiates <type>Classname2</type> with <type>T</type> equal
-   to 1.</para>
- 
-   <para>These diagrams omit a lot of details.  Private and protected
-   data members are not listed.  Compile-time types and values are not
-   listed.  No indication is given of the actual implementation.</para>
- 
- 
-   <section id="uml-arrays">
-    <title>&array;s</title>
- 
-    <figure float="1" id="uml-array_dynamicarray">
-     <title>Relationship Between &array; and &dynamicarray;s</title>
-     <mediaobject>
-      <imageobject>
-       <imagedata fileref="figures/array-uml.1" format="EPS" align="center"></imagedata>
-      </imageobject>
-      <imageobject>
-       <imagedata fileref="figures/array-uml-1.png" format="PNG" align="center"></imagedata>
-      </imageobject>
-      <textobject>
-       <phrase>&dynamicarray;s are subtypes of &array;s</phrase>
-      </textobject>
-     </mediaobject>
-    </figure>
-    
-    <para>Both &array;s and &dynamicarray;s have so many member
-    functions that their class boxes appear in separate diagrams.
-    <xref linkend="uml-array_dynamicarray"></xref> indicates that
-    &dynamicarray;s are subtypes of &array;s.  Both have value type and
-    engine tag template parameters but &dynamicarray;'s dimension must
-    be one.</para>
- 
-    <figure float="1" id="uml-array">
-     <title>&array; Diagram</title>
-     <mediaobject>
-      <imageobject>
-       <imagedata fileref="figures/array-uml.2" format="EPS" align="center"></imagedata>
-      </imageobject>
-      <imageobject>
-       <imagedata fileref="figures/array-uml-2.png" format="PNG" align="center"></imagedata>
-      </imageobject>
-      <textobject>
-       <phrase>&array; Class Diagram</phrase>
-      </textobject>
-     </mediaobject>
-    </figure>
- 
-    <figure float="1" id="uml-dynamicarray">
-     <title>&dynamicarray; Diagram</title>
-     <mediaobject>
-      <imageobject>
-       <imagedata fileref="figures/array-uml.3" format="EPS" align="center"></imagedata>
-      </imageobject>
-      <imageobject>
-       <imagedata fileref="figures/array-uml-3.png" format="PNG" align="center"></imagedata>
-      </imageobject>
-      <textobject>
-       <phrase>&dynamicarray; Class Diagram</phrase>
-      </textobject>
-     </mediaobject>
-    </figure>
-   </section>
  
! 
!   <section id="uml-domains">
!    <title>&domain;s</title>
! 
!    <para>&domain;s and its subtypes are shown in <xref
!    linkend="uml-domains_figure"></xref>.  All classes are instantiated
!    from or subtypes of &domain;.  As mentioned in <xref
!    linkend="arrays-domains"></xref>, the <type>Domain<1></type>
!    template instantiation has additional member functions.  It uses
!    the <type>Domain<1>::iterator</type>.  The four &domain;
!    subtypes appear in the bottom half of the figure.  Each requires
!    the same template parameter as &domain;.  Each of these has a
!    template instantiation for the one-dimensional case.  We omit
!    listing their additional member functions since these are the same
!    as for <type>Domain<1></type>.</para>
! 
!    <figure float="1" id="uml-domains_figure">
!     <title>&domain;s</title>
!     <mediaobject>
!      <imageobject>
!       <imagedata fileref="figures/domain-uml.1" format="EPS" align="center"></imagedata>
!      </imageobject>
!      <imageobject>
!       <imagedata fileref="figures/domain-uml-1.png" format="PNG" align="center"></imagedata>
!      </imageobject>
!      <textobject>
!       <phrase>&domain;s</phrase>
!      </textobject>
!     </mediaobject>
!    </figure>
!    
!   </section>
! 
! 
!   <section id="uml-engines">
!    <title>&engine;s</title>
! 
!    <para>&engine;s and its subtypes are shown in <xref
!    linkend="uml-engines-figure"></xref>.  Five subtypes of &engine;s
!    are shown.  Details appear in subsequent diagrams.  The
!    <type>Engine</type> class box shows no members because it has no
!    members.  Only subtypes have members.  More explanation of these
!    classes can be found in <xref linkend="engines"></xref>.  The
!    implementation files in <xref
!    linkend="uml-engines-brick_figure"></xref> use the
!    <literal>[1-7]</literal> regular expression to indicate 1, 2,
!    …, or 7.</para>
! 
!    <figure float="1" id="uml-engines-figure">
!     <title>&engine;s</title>
!     <mediaobject>
!      <imageobject>
!       <imagedata fileref="figures/engine-uml.1" format="EPS" align="center"></imagedata>
!      </imageobject>
!      <imageobject>
!       <imagedata fileref="figures/engine-uml-1.png" format="PNG" align="center"></imagedata>
!      </imageobject>
!      <textobject>
!       <phrase>Relationships among &engine;s</phrase>
!      </textobject>
!     </mediaobject>
!    </figure>
! 
!    <figure float="1" id="uml-engines-brick_figure">
!     <title>&brick; and &compressiblebrick; &engine;s</title>
!     <mediaobject>
!      <imageobject>
!       <imagedata fileref="figures/engine-uml.2" format="EPS" align="center"></imagedata>
!      </imageobject>
!      <imageobject>
!       <imagedata fileref="figures/engine-uml-2.png" format="PNG" align="center"></imagedata>
!      </imageobject>
!      <textobject>
!       <phrase>&brick; and &compressiblebrick; &engine;s</phrase>
!      </textobject>
!     </mediaobject>
!    </figure>
! 
!    <figure float="1" id="uml-engines-dynamic_figure">
!     <title>&dynamic; and &multipatch; &engine;s</title>
!     <mediaobject>
!      <imageobject>
!       <imagedata fileref="figures/engine-uml.3" format="EPS" align="center"></imagedata>
!      </imageobject>
!      <imageobject>
!       <imagedata fileref="figures/engine-uml-3.png" format="PNG" align="center"></imagedata>
!      </imageobject>
!      <textobject>
!       <phrase>&dynamic; and &multipatch; &engine;s</phrase>
!      </textobject>
!     </mediaobject>
!    </figure>
! 
!    <figure float="1" id="uml-engines-remote_figure">
!     <title>&remote; &engine;s</title>
!     <mediaobject>
!      <imageobject>
!       <imagedata fileref="figures/engine-uml.4" format="EPS" align="center"></imagedata>
!      </imageobject>
!      <imageobject>
!       <imagedata fileref="figures/engine-uml-4.png" format="PNG" align="center"></imagedata>
!      </imageobject>
!      <textobject>
!       <phrase>&remote; &engine;s</phrase>
!      </textobject>
!     </mediaobject>
!    </figure>
!    
!   </section>
!    
!  </appendix>
  
  
  <![%unfinished;[
--- 3692,3699 ----
   &template-appendix;
  
   &code-appendix;
  
!  &uml-appendix;
  
  
  <![%unfinished;[
Index: preface.xml
===================================================================
RCS file: /home/pooma/Repository/r2/docs/manual/preface.xml,v
retrieving revision 1.1
diff -c -p -r1.1 preface.xml
*** preface.xml	2002/02/27 03:51:53	1.1
--- preface.xml	2002/03/04 22:50:55
***************
*** 30,36 ****
    Readers will need to be familiar with &cc;, the language in which
    &pooma; programs are written.  Classes, objects, function objects,
    template classes, and template functions will all be used.  Appendix
!   <!-- FIXME: Add appendix reference --> FIXME contains a short
    introduction to template programming.  Readers needing more
    background material might want to read Koenig and Moo's
    <emphasis>Accelerated &cc;</emphasis>, Stanley Lippman's
--- 30,36 ----
    Readers will need to be familiar with &cc;, the language in which
    &pooma; programs are written.  Classes, objects, function objects,
    template classes, and template functions will all be used.  Appendix
!   <xref linkend="template_programming"></xref> contains a short
    introduction to template programming.  Readers needing more
    background material might want to read Koenig and Moo's
    <emphasis>Accelerated &cc;</emphasis>, Stanley Lippman's
***************
*** 375,381 ****
  
    <!-- We cheat and abuse an epigraph here. -->
    <epigraph>
!    <attribution>Jeffrey D. Oldham, 2002 February</attribution>
     <para></para>
    </epigraph>
  
--- 375,381 ----
  
    <!-- We cheat and abuse an epigraph here. -->
    <epigraph>
!    <attribution>Jeffrey D. Oldham, 2002 March</attribution>
     <para></para>
    </epigraph>
  
Index: starting.xml
===================================================================
RCS file: /home/pooma/Repository/r2/docs/manual/starting.xml,v
retrieving revision 1.1
diff -c -p -r1.1 starting.xml
*** starting.xml	2002/02/27 03:51:53	1.1
--- starting.xml	2002/03/04 22:50:55
***************
*** 5,11 ****
    for use, and then compile a <quote>Hello, &pooma;</quote>
    program.  Impatient readers will find the first section helpful.
    Those desiring more details will find this section provides a useful
!   overview of the chapter.</para>
  
  
    <section id="initial-quick_start">
--- 5,11 ----
    for use, and then compile a <quote>Hello, &pooma;</quote>
    program.  Impatient readers will find the first section helpful.
    Those desiring more details will find this section provides a useful
!   overview of the chapter although it can be skipped.</para>
  
  
    <section id="initial-quick_start">
***************
*** 39,45 ****
        indicates the operating system and compiler.  Permitted choices
        are the names of files in the <filename
        class="directory">config/arch/</filename> subdirectory omitting
!       the <filename class="libraryfile">.conf</filename> suffix.</para>
       </listitem>
      </varlistentry>
      <varlistentry>
--- 39,45 ----
        indicates the operating system and compiler.  Permitted choices
        are the names of files in the <filename
        class="directory">config/arch/</filename> subdirectory omitting
!       the <filename class="libraryfile">.conf</filename> suffixes.</para>
       </listitem>
      </varlistentry>
      <varlistentry>
***************
*** 60,69 ****
        program available at <filename
        class="libraryfile">examples/Manual/Sequential/initialize-finalize.cpp</filename>:<programlisting>
  &initialspace;export POOMAHOME=/home/oldham/pooma/pooma1
! &initialspace;g++ -I${POOMAHOME}/src -I${POOMAHOME}/lib/${POOMASUITE} initialize-finalize.cpp -o initialize-finalize -L${POOMAHOME}/lib/${POOMASUITE} -lpooma-gcc
  </programlisting>
!       The environment variable indicates the location of the &toolkit;
!       header files and the library.</para>
       </listitem>
      </varlistentry>
     </variablelist>
--- 60,73 ----
        program available at <filename
        class="libraryfile">examples/Manual/Sequential/initialize-finalize.cpp</filename>:<programlisting>
  &initialspace;export POOMAHOME=/home/oldham/pooma/pooma1
! &initialspace;g++ -I${POOMAHOME}/src \
! &initialspace;-I${POOMAHOME}/lib/${POOMASUITE} \
! &initialspace;initialize-finalize.cpp \
! &initialspace;-o initialize-finalize \
! &initialspace;-L${POOMAHOME}/lib/${POOMASUITE} -lpooma-gcc
  </programlisting>
!       The <envar>POOMAHOME</envar> environment variable indicates the
!       location of the &toolkit; header files and the library.</para>
       </listitem>
      </varlistentry>
     </variablelist>
***************
*** 113,121 ****
     operating system with &kcc;.</para>
  
     <para>To configure the source code, use a command
!    like<programlisting> &initialspace;./configure &dashdash;arch
!    LINUXgcc &dashdash;opt &dashdash;suite LINUXgcc-opt
!    </programlisting> The architecture argument to the
     <command>&dashdash;arch</command> option is the name of the
     corresponding configuration file, omitting its <filename
     class="libraryfile">.conf</filename> suffix.  The
--- 117,125 ----
     operating system with &kcc;.</para>
  
     <para>To configure the source code, use a command
!    like<programlisting>
! &initialspace;./configure &dashdash;arch LINUXgcc &dashdash;opt &dashdash;suite LINUXgcc-opt
! </programlisting> The architecture argument to the
     <command>&dashdash;arch</command> option is the name of the
     corresponding configuration file, omitting its <filename
     class="libraryfile">.conf</filename> suffix.  The
***************
*** 137,152 ****
     need to be compiled.  Specify the desired suite by setting the
     <envar>POOMASUITE</envar> environment variable to the appropriate
     value.  For example, if using the <application>bash</application>
!    shell, use<programlisting> &initialspace;export
!    POOMASUITE=<replaceable>suiteName</replaceable> </programlisting>
!    substituting the suite name's <replaceable>suiteName</replaceable>.
     If using the <application>csh</application> shell,
!    use<programlisting> &initialspace;setenv POOMASUITE
!    <replaceable>suiteName</replaceable> </programlisting> In the
     previous paragraph, the suite name is
     <literal>LINUXgcc-opt</literal> so we would issue the
!    statement<programlisting> &initialspace;setenv POOMASUITE
!    LINUXgcc-opt </programlisting></para>
  
     <para>Issuing the <command>make</command> command compiles the
     &pooma; source code files to create the &pooma; library.  The
--- 141,158 ----
     need to be compiled.  Specify the desired suite by setting the
     <envar>POOMASUITE</envar> environment variable to the appropriate
     value.  For example, if using the <application>bash</application>
!    shell, use<programlisting>
! &initialspace;export POOMASUITE=<replaceable>suiteName</replaceable>
! </programlisting> substituting the suite name's <replaceable>suiteName</replaceable>.
     If using the <application>csh</application> shell,
!    use<programlisting>
! &initialspace;setenv POOMASUITE <replaceable>suiteName</replaceable>
! </programlisting> In the
     previous paragraph, the suite name is
     <literal>LINUXgcc-opt</literal> so we would issue the
!    statement<programlisting>
! &initialspace;setenv POOMASUITE LINUXgcc-opt
! </programlisting></para>
  
     <para>Issuing the <command>make</command> command compiles the
     &pooma; source code files to create the &pooma; library.  The
***************
*** 158,164 ****
     class="libraryfile">lib/LINUXgcc-opt/libpooma-gcc.a</filename>.  If
     it fails, the makefiles will print a line indicating which file
     failed to compile.  Reading the corresponding <filename
!    class="libraryfile">.info</filename> may indicate what
     failed.</para>
  
     <para>The same &pooma; source code can support multiple suites as
--- 164,170 ----
     class="libraryfile">lib/LINUXgcc-opt/libpooma-gcc.a</filename>.  If
     it fails, the makefiles will print a line indicating which file
     failed to compile.  Reading the corresponding <filename
!    class="libraryfile">.info</filename> file may indicate what
     failed.</para>
  
     <para>The same &pooma; source code can support multiple suites as
***************
*** 188,195 ****
      <para>The configuration script supports many more command-line
      options than the two used above, but few &pooma; users need use
      them except those using distributed &pooma;, which are described
!     below.  <command>/configure -h</command> yields a complete list.
!     We describe also describe them here.</para>
  
      <table frame="none" colsep="0" rowsep="0" tocentry="1"
             orient="port" pgwide="0" id="initial-compile-configuration_options-table">
--- 194,201 ----
      <para>The configuration script supports many more command-line
      options than the two used above, but few &pooma; users need use
      them except those using distributed &pooma;, which are described
!     below.  <command>./configure -h</command> yields a complete list.
!     We also describe them here.</para>
  
      <table frame="none" colsep="0" rowsep="0" tocentry="1"
             orient="port" pgwide="0" id="initial-compile-configuration_options-table">
***************
*** 220,226 ****
  	 The environment variable <envar>POOMASUITE</envar>'s value
  	 should equal <replaceable>suite</replaceable> when compiling
  	 the library.  <replaceable>suite</replaceable> can be any
! 	 string that an serve as a filename.  If this option is
  	 omitted, the <literal>&dashdash;arch</literal> architecture
  	 is used.</entry>
  	</row>
--- 226,232 ----
  	 The environment variable <envar>POOMASUITE</envar>'s value
  	 should equal <replaceable>suite</replaceable> when compiling
  	 the library.  <replaceable>suite</replaceable> can be any
! 	 string that can serve as a filename.  If this option is
  	 omitted, the <literal>&dashdash;arch</literal> architecture
  	 is used.</entry>
  	</row>
***************
*** 427,434 ****
         <row>
  	<entry><literal>&dashdash;messaging</literal></entry>
  	<entry>enables creation of distributed &pooma; executables by
! 	enabling use of the &cheetah; communications package.  See
! 	<!-- FIXME: add reference to the distributed configuration
  	section. --></entry>
         </row>
         <row rowsep="1">
--- 433,439 ----
         <row>
  	<entry><literal>&dashdash;messaging</literal></entry>
  	<entry>enables creation of distributed &pooma; executables by
! 	enabling use of the &cheetah; communications package.  <!-- FIXME: "See" add reference to the distributed configuration
  	section. --></entry>
         </row>
         <row rowsep="1">
***************
*** 474,479 ****
--- 479,498 ----
     program that initializes and de-initializes the &pooma;
     library.</para>
  
+    <para>The simplest &pooma; program is available at <filename
+    class="libraryfile">examples/Manual/Sequential/initialize-finalize.cpp</filename>.
+    It is annotated in <xref
+    linkend="initial-compile_programs-hello_pooma"></xref>.  Before its
+    use, the &poomatoolkit; must be initialized by a call to
+    <function>initialize</function>.  This usually occurs in the
+    <function>main</function> function.  After its use, the
+    &poomatoolkit; should be shut down using a call to
+    <function>finalize</function>.  This also usually occurs in the
+    <function>main</function> function.  Both of these functions are
+    declared in <filename class="headerfile">Pooma/Pooma.h</filename>.
+    This header file (or another &pooma; header file including it)
+    occurs in every &pooma; program.</para>
+ 
     <example id="initial-compile_programs-hello_pooma">
      <title>A <quote>Hello, &pooma;</quote> Program</title>
  
***************
*** 495,514 ****
      </calloutlist>
     </example>
  
-    <para>The simplest &pooma; program is available at <filename
-    class="libraryfile">examples/Manual/Sequential/initialize-finalize.cpp</filename>.
-    It is annotated in <xref
-    linkend="initial-compile_programs-hello_pooma"></xref>.  Before its
-    use, the &poomatoolkit; must be initialized by a call to
-    <function>initialize</function>.  This usually occurs in the
-    <function>main</function> function.  After its use, the
-    &poomatoolkit; should be shut down using a call to
-    <function>finalize</function>.  This also usually occurs in the
-    <function>main</function> function.  Both of these functions are
-    declared in <filename class="headerfile">Pooma/Pooma.h</filename>.
-    This header file or another &pooma; header file including it occurs
-    in every &pooma; program.</para>
- 
     <para>Compiling this program requires including &pooma; header
     files and library.  Let us assume that the environment variable
     <envar>POOMAHOME</envar> describes the location of the &pooma;
--- 514,519 ----
***************
*** 516,522 ****
  &initialspace;export POOMAHOME=/home/user/pooma
  </programlisting>  We illustrate how to compile the program using the
     &gpp; compiler:<programlisting>
! &initialspace;g++ -I${POOMAHOME}/src -I${POOMAHOME}/lib/LINUXgcc initialize-finalize.cpp -o initialize-finalize -L${POOMAHOME}/lib/${POOMASUITE} -lpooma-gcc
  </programlisting>  We explain the five command-line options:
      <variablelist>
       <varlistentry>
--- 521,529 ----
  &initialspace;export POOMAHOME=/home/user/pooma
  </programlisting>  We illustrate how to compile the program using the
     &gpp; compiler:<programlisting>
! &initialspace;g++ -I${POOMAHOME}/src -I${POOMAHOME}/lib/LINUXgcc \
! &initialspace;initialize-finalize.cpp -o initialize-finalize \
! &initialspace;-L${POOMAHOME}/lib/${POOMASUITE} -lpooma-gcc
  </programlisting>  We explain the five command-line options:
      <variablelist>
       <varlistentry>
***************
*** 587,593 ****
      <bridgehead id="initial-compile_programs-initialize-specifications" renderas="sect4">Prototypes</bridgehead>
  
  <programlisting>
! &initialspace;#include "Pooma/Pooma.h"  // or "Pooma/Arrays.h" or "Pooma/Fields.h" or …
  </programlisting>
  
      <funcsynopsis>
--- 594,601 ----
      <bridgehead id="initial-compile_programs-initialize-specifications" renderas="sect4">Prototypes</bridgehead>
  
  <programlisting>
! &initialspace;#include "Pooma/Pooma.h"
! &initialspace;// or "Pooma/Arrays.h" or "Pooma/Fields.h" or …
  </programlisting>
  
      <funcsynopsis>
***************
*** 870,877 ****
        </variablelist>
          For example, the &author; uses
  <programlisting>
! ./configure &dashdash;arch LINUXGCC &dashdash;shmem &dashdash;nompi
! &dashdash;noex &dashdash;static &dashdash;prefix ${HOME}/pooma/cheetah-1.0
  &dashdash;opt
  </programlisting>  The
          <command>&dashdash;arch LINUXGCC</command> indicates use of
--- 878,885 ----
        </variablelist>
          For example, the &author; uses
  <programlisting>
! ./configure &dashdash;arch LINUXGCC &dashdash;shmem &dashdash;nompi \
! &dashdash;noex &dashdash;static &dashdash;prefix ${HOME}/pooma/cheetah-1.0 \
  &dashdash;opt
  </programlisting>  The
          <command>&dashdash;arch LINUXGCC</command> indicates use of
***************
*** 921,927 ****
          installed &cheetah; library.  For
          example,
  <programlisting>
! declare -x CHEETAHDIR=${HOME}/pooma/cheetah-1.0
  </programlisting> specifies the
          installation directory used in the previous section.  If using
          the <application>csh</application> shell, use <command>setenv 
--- 929,935 ----
          installed &cheetah; library.  For
          example,
  <programlisting>
! export CHEETAHDIR=${HOME}/pooma/cheetah-1.0
  </programlisting> specifies the
          installation directory used in the previous section.  If using
          the <application>csh</application> shell, use <command>setenv 
Index: template.xml
===================================================================
RCS file: /home/pooma/Repository/r2/docs/manual/template.xml,v
retrieving revision 1.7
diff -c -p -r1.7 template.xml
*** template.xml	2002/02/27 03:51:53	1.7
--- template.xml	2002/03/04 22:50:56
*************** struct usuallySimpleClass<false> {
*** 829,835 ****
  template<class Op, class Left, class Right>
  struct ExpressionTraits<BinaryNode<Op, Left, Right&closeclose;
  {
!   typedef typename ExpressionTraits<Left>::Type_t  Left_t;
    typedef typename ExpressionTraits<Right>::Type_t Right_t;
    typedef typename
      CombineExpressionTraits<Left_t, Right_t>::Type_t Type_t;
--- 829,835 ----
  template<class Op, class Left, class Right>
  struct ExpressionTraits<BinaryNode<Op, Left, Right&closeclose;
  {
!   typedef typename ExpressionTraits<Left>::Type_t Left_t;
    typedef typename ExpressionTraits<Right>::Type_t Right_t;
    typedef typename
      CombineExpressionTraits<Left_t, Right_t>::Type_t Type_t;
Index: uml.xml
===================================================================
RCS file: uml.xml
diff -N uml.xml
*** /dev/null	Fri Mar 23 21:37:44 2001
--- uml.xml	Mon Mar  4 15:50:57 2002
***************
*** 0 ****
--- 1,736 ----
+  <appendix id="uml">
+   <title>¨ Class Diagrams</title>
+ 
+   <para>In this chapter, we present Unified Modeling Language (¨)
+   class diagrams for several &pooma; classes.  These diagrams are
+   created at the <firstterm>specification</firstterm> level, which
+   indicates the software interface, not its implementation.  <xref
+   linkend="concepts-sequential_containers-declarations-dependences"></xref>
+   provides a top-level overview of the relationships between classes.
+   Readers interested in the implementation are encouraged to read the
+   corresponding source code.  More extensive explanations of these
+   classes appear in the main chapters of this &book;.</para>
+ 
+   <figure float="1" id="uml-explanation">
+    <title>Explanation of ¨ Class Diagrams</title>
+    <mediaobject>
+     <imageobject>
+      <imagedata fileref="figures/explanation-uml.1" format="EPS" align="center"></imagedata>
+     </imageobject>
+     <imageobject>
+      <imagedata fileref="figures/explanation-uml-1.png" format="PNG" align="center"></imagedata>
+     </imageobject>
+     <textobject>
+      <phrase>An Explanation of UML Class Diagrams</phrase>
+     </textobject>
+    </mediaobject>
+   </figure>
+ 
+   <para><xref linkend="uml-explanation"></xref> illustrates a typical
+   ¨ class diagram.  The diagram has three classes:
+   <type>Classname1</type>, <type>Classname2</type>, and
+   <type>Classname2<1></type>.  Most classes are represented by
+   three-part boxes.  The top part lists the class's name.  The middle
+   part lists public data members, if any.  Few &pooma; classes have
+   public data members so this section is frequently empty.  The bottom
+   part lists public member functions, if any.  <quote>Free parameter
+   types</quote> indicate templated parameters.
+   <type>Classname2<1></type> has only one part, not three.  Its
+   three-part box appears in another diagram, presumably because there
+   is not enough room in this one.  Both <type>Classname1</type> and
+   <type>Classname2</type> have template parameters, each named
+   <type>T</type>.  These occur in dashed boxes at the upper-right
+   corner of the class boxes.  Files implementing a class are listed at
+   the lower, right corner of the class's box.  These implementation
+   files may be different from the header files to include in one's
+   program to use these classes.</para>
+ 
+   <para>Lines connect classes.  The solid arrow with large triangular
+   arrowhead indicates that <type>Classname2</type> is a subtype of
+   <type>Classname1</type>.  Since this diagram represents the
+   specification level, subtyping does not necessarily correspond to
+   &cc; type inheritance.  Also, subtype class boxes need only list
+   members not available in the supertype.  For this case,
+   <type>Classname2</type> has one new member not provided by
+   <type>Classname1</type>.  A dashed arrow indicates a class formed by
+   a template instantiation.  The class name indicates which template
+   parameters are bound.  For example, <type>Classname2<1></type>
+   instantiates <type>Classname2</type> with <type>T</type> equal
+   to 1.</para>
+ 
+   <para>Some of the functions require many, similar function
+   arguments.  We introduce regular expression notation to reduce the
+   length of the function prototype.  For example,<programlisting>
+ void foo(const X[1-3]&)
+ </programlisting> abbreviates <programlisting>
+ void foo(const X1&, const X2&, const X3&)
+ </programlisting>  <literal>X[1-3]</literal> abbreviates
+   <literal>X1</literal>, X2<literal></literal>, <literal>X3</literal>.
+   We assume this distributes over <literal>const &,</literal> to
+   yield &cc; code.</para>
+ 
+   <para>These diagrams omit a lot of details.  Private and protected
+   data members are not listed.  Compile-time types and values are not
+   listed.  No indication is given of the actual implementation.  Some
+   template arguments of parameters have been suppressed.</para>
+ 
+ 
+   <section id="uml-arrays">
+    <title>&array;s</title>
+ 
+    <figure float="1" id="uml-array_dynamicarray">
+     <title>Relationship Between &array; and &dynamicarray;s</title>
+     <mediaobject>
+      <imageobject>
+       <imagedata fileref="figures/array-uml.1" format="EPS" align="center"></imagedata>
+      </imageobject>
+      <imageobject>
+       <imagedata fileref="figures/array-uml-1.png" format="PNG" align="center"></imagedata>
+      </imageobject>
+      <textobject>
+       <phrase>&dynamicarray;s are subtypes of &array;s</phrase>
+      </textobject>
+     </mediaobject>
+    </figure>
+    
+    <para>Both &array;s and &dynamicarray;s have so many member
+    functions that their class boxes appear in separate diagrams.
+    <xref linkend="uml-array_dynamicarray"></xref> indicates that
+    &dynamicarray;s are subtypes of &array;s.  Both have value type and
+    engine tag template parameters but &dynamicarray;'s dimension must
+    be one.</para>
+ 
+    <para>Implementation files are located within the <filename
+    class="directory">src/Array</filename> directory.</para>
+ 
+    <figure float="1" id="uml-array">
+     <title>&array; Diagram</title>
+     <mediaobject>
+      <imageobject>
+       <imagedata fileref="figures/array-uml.2" format="EPS" align="center"></imagedata>
+      </imageobject>
+      <imageobject>
+       <imagedata fileref="figures/array-uml-2.png" format="PNG" align="center"></imagedata>
+      </imageobject>
+      <textobject>
+       <phrase>&array; Class Diagram</phrase>
+      </textobject>
+     </mediaobject>
+    </figure>
+ 
+    <figure float="1" id="uml-dynamicarray">
+     <title>&dynamicarray; Diagram</title>
+     <mediaobject>
+      <imageobject>
+       <imagedata fileref="figures/array-uml.3" format="EPS" align="center"></imagedata>
+      </imageobject>
+      <imageobject>
+       <imagedata fileref="figures/array-uml-3.png" format="PNG" align="center"></imagedata>
+      </imageobject>
+      <textobject>
+       <phrase>&dynamicarray; Class Diagram</phrase>
+      </textobject>
+     </mediaobject>
+    </figure>
+   </section>
+ 
+ 
+   <section id="uml-fields">
+    <title>&field;s, &mesh;es, and ¢ering;s</title>
+ 
+    <para>A &field; has a mesh and a centering.  It is implemented in
+    <filename class="headerfile">src/Field/Field.h</filename>.</para>
+ 
+    <figure float="1" id="uml-fields-field">
+     <title>&field;</title>
+     <mediaobject>
+      <imageobject>
+       <imagedata fileref="figures/field-uml.10" format="EPS" align="center"></imagedata>
+      </imageobject>
+      <imageobject>
+       <imagedata fileref="figures/field-uml-10.png" format="PNG" align="center"></imagedata>
+      </imageobject>
+      <textobject>
+       <phrase>A &field; is like an &array; but having spatial
+       extent.</phrase>
+      </textobject>
+     </mediaobject>
+    </figure>
+ 
+ 
+    <section id="uml-fields-meshes">
+     <title>&mesh;es</title>
+ 
+     <para>A mesh specifies a &field;'s spatial extent.  A &mesh; class
+     only exists conceptually, but <type>NoMesh</type> and
+     <type>UniformRectilinearMesh</type> are defined within the
+     <filename class="directory">src/Field/Mesh</filename>
+     directory.</para>
+ 
+     <figure float="1" id="uml-fields-meshes-overview">
+      <title>&mesh;es</title>
+      <mediaobject>
+       <imageobject>
+        <imagedata fileref="figures/field-uml.3" format="EPS" align="center"></imagedata>
+       </imageobject>
+       <imageobject>
+        <imagedata fileref="figures/field-uml-3.png" format="PNG" align="center"></imagedata>
+       </imageobject>
+       <textobject>
+        <phrase>The abstract <type>Mesh</type> class is realized by
+       <type>NoMesh</type> and <type>UniformRectilinearMesh</type>.</phrase>
+       </textobject>
+      </mediaobject>
+     </figure>
+ 
+     <figure float="1" id="uml-fields-meshes-nomesh">
+      <title><type>NoMesh</type></title>
+      <mediaobject>
+       <imageobject>
+        <imagedata fileref="figures/field-uml.1" format="EPS" align="center"></imagedata>
+       </imageobject>
+       <imageobject>
+        <imagedata fileref="figures/field-uml-1.png" format="PNG" align="center"></imagedata>
+       </imageobject>
+       <textobject>
+        <phrase>If a &field; has a <type>NoMesh</type> mesh, it has no
+       spatial extent.</phrase>
+       </textobject>
+      </mediaobject>
+     </figure>
+ 
+     <para>In the following figure, we abbreviate
+     <type>UniformRectilinearMesh</type> with
+     <quote>URM</quote>.</para>
+ 
+     <figure float="1" id="uml-fields-meshes-urm">
+      <title><type>UniformRectilinearMesh</type></title>
+      <mediaobject>
+       <imageobject>
+        <imagedata fileref="figures/field-uml.2" format="EPS" align="center"></imagedata>
+       </imageobject>
+       <imageobject>
+        <imagedata fileref="figures/field-uml-2.png" format="PNG" align="center"></imagedata>
+       </imageobject>
+       <textobject>
+        <phrase>The <type>UniformRectilinearMesh</type> is the most
+       common &field; mesh.</phrase>
+       </textobject>
+      </mediaobject>
+     </figure>
+    </section><!-- meshes -->
+ 
+ 
+    <section id="uml-fields-centerings">
+     <title>¢ering;s</title>
+ 
+     <para>A ¢ering; specifies the location of values within a
+     cell.  <type>CanonicalCentering</type> is a helper class returning
+     common centerings.  Both are implemented within the <filename
+     class="directory">src/Field</filename> subdirectory.</para>
+ 
+     <figure float="1" id="uml-fields-centerings-figure">
+      <title>Centering Classes</title>
+      <mediaobject>
+       <imageobject>
+        <imagedata fileref="figures/field-uml.11" format="EPS" align="center"></imagedata>
+       </imageobject>
+       <imageobject>
+        <imagedata fileref="figures/field-uml-11.png" format="PNG" align="center"></imagedata>
+       </imageobject>
+       <textobject>
+        <phrase><type>CanonicalCentering</type> returns commonly-used ¢ering;s.</phrase>
+       </textobject>
+      </mediaobject>
+     </figure>
+    </section><!-- centering -->
+ 
+   </section>
+ 
+ 
+   <section id="uml-math_objects">
+    <title>&vector;s, &matrix;s, &tensor;s</title>
+ 
+    <para>In this section, we present ¨ class diagrams for the
+    mathematical objects of &vector;s, &matrix;s, and &tensor;s.  All
+    these classes have similar interfaces and relationships.  For
+    example, &vector; requires a <type>VectorEngine</type>, which has
+    no public interface.  The only template specialization is
+    <type>VectorEngine<D,T,Full></type>.  &matrix;s are similar.
+    Tensors have four different engines, supporting the tensor
+    specializations of <literal>Antisymmetric</literal>,
+    <literal>Symmetric</literal>, and
+    <literal>Diagonal</literal>.</para>
+ 
+    <para>All of the source files are located in the <filename
+    class="directory">src/Tiny</filename> subdirectory.</para>
+ 
+    <figure float="1" id="uml-math_objects-vector">
+     <title>&vector;s</title>
+     <mediaobject>
+      <imageobject>
+       <imagedata fileref="figures/math-objs-uml.1" format="EPS" align="center"></imagedata>
+      </imageobject>
+      <imageobject>
+       <imagedata fileref="figures/math-objs-uml-1.png" format="PNG" align="center"></imagedata>
+      </imageobject>
+      <textobject>
+       <phrase>&vector;s require <type>VectorEngine</type>s.</phrase>
+      </textobject>
+     </mediaobject>
+    </figure>
+ 
+    <figure float="1" id="uml-math_objects-matrix">
+     <title>&matrix;s</title>
+     <mediaobject>
+      <imageobject>
+       <imagedata fileref="figures/math-objs-uml.10" format="EPS" align="center"></imagedata>
+      </imageobject>
+      <imageobject>
+       <imagedata fileref="figures/math-objs-uml-10.png" format="PNG" align="center"></imagedata>
+      </imageobject>
+      <textobject>
+       <phrase>&matrix;s require <type>TinyMatrixEngine</type>s,
+       appearing in the next diagram.</phrase>
+      </textobject>
+     </mediaobject>
+    </figure>
+ 
+    <figure float="1" id="uml-math_objects-matrixengine">
+     <title><type>TinyMatrixEngine</type>s</title>
+     <mediaobject>
+      <imageobject>
+       <imagedata fileref="figures/math-objs-uml.11" format="EPS" align="center"></imagedata>
+      </imageobject>
+      <imageobject>
+       <imagedata fileref="figures/math-objs-uml-11.png" format="PNG" align="center"></imagedata>
+      </imageobject>
+      <textobject>
+       <phrase><type>TinyMatrixEngine</type>s power &matrix;s.</phrase>
+      </textobject>
+     </mediaobject>
+    </figure>
+ 
+    <figure float="1" id="uml-math_objects-tensor">
+     <title>&tensor;s and <type>TensorEngine</type>s</title>
+     <mediaobject>
+      <imageobject>
+       <imagedata fileref="figures/math-objs-uml.2" format="EPS" align="center"></imagedata>
+      </imageobject>
+      <imageobject>
+       <imagedata fileref="figures/math-objs-uml-2.png" format="PNG" align="center"></imagedata>
+      </imageobject>
+      <textobject>
+       <phrase>&tensor;s require <type>TensorEngine</type>s.</phrase>
+      </textobject>
+     </mediaobject>
+    </figure>
+ 
+    <figure float="1" id="uml-math_objects-tensor-full">
+     <title><literal>Full</literal> and <literal>Diagonal</literal> <type>TensorEngine</type>s</title>
+     <mediaobject>
+      <imageobject>
+       <imagedata fileref="figures/math-objs-uml.3" format="EPS" align="center"></imagedata>
+      </imageobject>
+      <imageobject>
+       <imagedata fileref="figures/math-objs-uml-3.png" format="PNG" align="center"></imagedata>
+      </imageobject>
+      <textobject>
+       <phrase><literal>Full</literal> &engine;s are the default
+       &tensor; &engine;s.  Diagonal &tensor;s use its special &engine;.</phrase>
+      </textobject>
+     </mediaobject>
+    </figure>
+ 
+    <figure float="1" id="uml-math_objects-tensor-symmetric">
+     <title><literal>Antisymmetric</literal> and <literal>Symmetric</literal> <type>TensorEngine</type>s</title>
+     <mediaobject>
+      <imageobject>
+       <imagedata fileref="figures/math-objs-uml.4" format="EPS" align="center"></imagedata>
+      </imageobject>
+      <imageobject>
+       <imagedata fileref="figures/math-objs-uml-4.png" format="PNG" align="center"></imagedata>
+      </imageobject>
+      <textobject>
+       <phrase>More <type>TensorEngine</type> specializations.</phrase>
+      </textobject>
+     </mediaobject>
+    </figure>
+   </section>
+ 
+ 
+   <section id="uml-domains">
+    <title>&domain;s</title>
+ 
+    <para>&domain;s and its subtypes are shown in <xref
+    linkend="uml-domains_figure"></xref>.  All classes are instantiated
+    from or subtypes of &domain;.  As mentioned in <xref
+    linkend="arrays-domains"></xref>, the <type>Domain<1></type>
+    template instantiation has additional member functions.  It uses
+    the <type>Domain<1>::iterator</type>.  The four &domain;
+    subtypes appear in the bottom half of the figure.  Each requires
+    the same template parameter as &domain;.  Each of these has a
+    template instantiation for the one-dimensional case.  We omit
+    listing their additional member functions since these are the same
+    as for <type>Domain<1></type>.</para>
+ 
+    <para>Implementation files are located within the <filename
+    class="directory">src/Domain</filename> directory.</para>
+ 
+    <figure float="1" id="uml-domains_figure">
+     <title>&domain;s</title>
+     <mediaobject>
+      <imageobject>
+       <imagedata fileref="figures/domain-uml.1" format="EPS" align="center"></imagedata>
+      </imageobject>
+      <imageobject>
+       <imagedata fileref="figures/domain-uml-1.png" format="PNG" align="center"></imagedata>
+      </imageobject>
+      <textobject>
+       <phrase>&domain;s</phrase>
+      </textobject>
+     </mediaobject>
+    </figure>
+    
+   </section>
+ 
+ 
+   <section id="uml-engines">
+    <title>&engine;s</title>
+ 
+    <para>&engine;s and its subtypes are shown in <xref
+    linkend="uml-engines-figure"></xref>.  Five subtypes of &engine;s
+    are shown.  Details appear in subsequent diagrams.  The
+    <type>Engine</type> class box shows no members because it has no
+    members.  Only subtypes have members.  More explanation of these
+    classes can be found in <xref linkend="engines"></xref>.  The
+    implementation files in <xref
+    linkend="uml-engines-brick_figure"></xref> use the
+    <literal>[1-7]</literal> regular expression to indicate 1, 2,
+    …, or 7.</para>
+ 
+    <para>Implementation files are located within the <filename
+    class="directory">src/Engine</filename> directory.</para>
+ 
+    <figure float="1" id="uml-engines-figure">
+     <title>&engine;s</title>
+     <mediaobject>
+      <imageobject>
+       <imagedata fileref="figures/engine-uml.1" format="EPS" align="center"></imagedata>
+      </imageobject>
+      <imageobject>
+       <imagedata fileref="figures/engine-uml-1.png" format="PNG" align="center"></imagedata>
+      </imageobject>
+      <textobject>
+       <phrase>Relationships among &engine;s</phrase>
+      </textobject>
+     </mediaobject>
+    </figure>
+ 
+    <figure float="1" id="uml-engines-brick_figure">
+     <title>&brick; and &compressiblebrick; &engine;s</title>
+     <mediaobject>
+      <imageobject>
+       <imagedata fileref="figures/engine-uml.2" format="EPS" align="center"></imagedata>
+      </imageobject>
+      <imageobject>
+       <imagedata fileref="figures/engine-uml-2.png" format="PNG" align="center"></imagedata>
+      </imageobject>
+      <textobject>
+       <phrase>&brick; and &compressiblebrick; &engine;s</phrase>
+      </textobject>
+     </mediaobject>
+    </figure>
+ 
+    <figure float="1" id="uml-engines-dynamic_figure">
+     <title>&dynamic; and &multipatch; &engine;s</title>
+     <mediaobject>
+      <imageobject>
+       <imagedata fileref="figures/engine-uml.3" format="EPS" align="center"></imagedata>
+      </imageobject>
+      <imageobject>
+       <imagedata fileref="figures/engine-uml-3.png" format="PNG" align="center"></imagedata>
+      </imageobject>
+      <textobject>
+       <phrase>&dynamic; and &multipatch; &engine;s</phrase>
+      </textobject>
+     </mediaobject>
+    </figure>
+ 
+    <figure float="1" id="uml-engines-remote_figure">
+     <title>&remote; &engine;s</title>
+     <mediaobject>
+      <imageobject>
+       <imagedata fileref="figures/engine-uml.4" format="EPS" align="center"></imagedata>
+      </imageobject>
+      <imageobject>
+       <imagedata fileref="figures/engine-uml-4.png" format="PNG" align="center"></imagedata>
+      </imageobject>
+      <textobject>
+       <phrase>&remote; &engine;s</phrase>
+      </textobject>
+     </mediaobject>
+    </figure>
+    
+   </section>
+ 
+ 
+   <section id="uml-distributed">
+    <title>Distributed Computation</title>
+ 
+    <para>In this section, we present ¨ class diagrams for the
+    classes used when declaring distributed computation.  We use
+    abbreviations in parameter lists:</para>
+ 
+    <table frame="none" colsep="0" rowsep="0" tocentry="1"
+ 	  orient="port" pgwide="0" id="uml-distributed-abbreviation_table">
+     <title>Abbreviations</title>
+     
+     <tgroup cols="2" align="left">
+      <thead>
+       <row>
+        <entry>abbreviation</entry>
+        <entry>meaning</entry>
+       </row>
+      </thead>
+      <tbody valign="top">
+       <row>
+        <entry>CM</entry>
+        <entry><type>ContextMapper</type></entry>
+       </row>
+       <row>
+        <entry>DT</entry>
+        <entry><type>DistributedTag</type></entry>
+       </row>
+       <row>
+        <entry>GL</entry>
+        <entry><type>GuardLayers</type></entry>
+       </row>
+       <row>
+        <entry>Iv</entry>
+        <entry><type>Interval</type></entry>
+       </row>
+       <row>
+        <entry>List_t</entry>
+        <entry><type>std::vector</type> of pointers to <type>Node</type>s of
+    &domain;s</entry>
+       </row>
+       <row>
+        <entry>PatchList_t</entry>
+        <entry><type>std::vector</type> of <type>Interval<Dim></type>s</entry>
+       </row>
+       <row>
+        <entry>RT</entry>
+        <entry><type>ReplicatedTag</type></entry>
+       </row>
+       <row>
+        <entry>SpTlLa</entry>
+        <entry><type>SparseTileLayout</type></entry>
+       </row>
+      </tbody>
+     </tgroup>
+    </table>
+ 
+    <para>Partitions specify how a domain will be split into patches,
+    or pieces.  <xref linkend="uml-distributed-partition"></xref>
+    introduces the abstract <quote>Partition</quote> class.  The class
+    exists only conceptually, not appearing in any source code.
+    Instead four classes, appearing in subsequent diagrams, realize it.
+    Even though users rarely use any of their member functions, the
+    diagrams list them.  All files are relative to the <filename
+    class="directory">src/Partition</filename> subdirectory.</para>
+ 
+    <figure float="1" id="uml-distributed-partition">
+     <title>Partitions</title>
+     <mediaobject>
+      <imageobject>
+       <imagedata fileref="figures/distributed-uml.5" format="EPS" align="center"></imagedata>
+      </imageobject>
+      <imageobject>
+       <imagedata fileref="figures/distributed-uml-5.png" format="PNG" align="center"></imagedata>
+      </imageobject>
+      <textobject>
+       <phrase>Four classes realize the abstract Partition class.</phrase>
+      </textobject>
+     </mediaobject>
+    </figure>
+ 
+    <figure float="1" id="uml-distributed-partition-grid">
+     <title>Grid Partitions</title>
+     <mediaobject>
+      <imageobject>
+       <imagedata fileref="figures/distributed-uml.4" format="EPS" align="center"></imagedata>
+      </imageobject>
+      <imageobject>
+       <imagedata fileref="figures/distributed-uml-4.png" format="PNG" align="center"></imagedata>
+      </imageobject>
+      <textobject>
+       <phrase>Two partition classes use grids.</phrase>
+      </textobject>
+     </mediaobject>
+    </figure>
+ 
+    <figure float="1" id="uml-distributed-partition-other">
+     <title>Other Partitions</title>
+     <mediaobject>
+      <imageobject>
+       <imagedata fileref="figures/distributed-uml.3" format="EPS" align="center"></imagedata>
+      </imageobject>
+      <imageobject>
+       <imagedata fileref="figures/distributed-uml-3.png" format="PNG" align="center"></imagedata>
+      </imageobject>
+      <textobject>
+       <phrase><type>SpatialPartition</type> and
+       <type>TilePartition</type> realize the abstract Partition
+       class.</phrase>
+      </textobject>
+     </mediaobject>
+    </figure>
+ 
+    <para>Guard layers surround domains and patches to ease programming
+    and decrease communication.  We list more member functions than
+    most users require.  All files are relative to the <filename
+    class="directory">src/Layout</filename> subdirectory.</para>
+ 
+    <figure float="1" id="uml-distributed-guard_layers">
+     <title>Guard Layers</title>
+     <mediaobject>
+      <imageobject>
+       <imagedata fileref="figures/distributed-uml.30" format="EPS" align="center"></imagedata>
+      </imageobject>
+      <imageobject>
+       <imagedata fileref="figures/distributed-uml-30.png" format="PNG" align="center"></imagedata>
+      </imageobject>
+      <textobject>
+       <phrase><type>GuardLayers</type> surround patches.</phrase>
+      </textobject>
+     </mediaobject>
+    </figure>
+ 
+    <para>A layout maps a domain index to processors and memory used to
+    compute the associated value.  There is no base class so we just
+    present the class diagrams.  We list only member functions related
+    to construction, destruction, and printing since those are the
+    functions that almost all users use.  All files are relative to the
+    <filename class="directory">src/Layout</filename>
+    subdirectory.</para>
+ 
+    <figure float="1" id="uml-distributed-layout-domainlayout">
+     <title><type>DomainLayout</type></title>
+     <mediaobject>
+      <imageobject>
+       <imagedata fileref="figures/distributed-uml.22" format="EPS" align="center"></imagedata>
+      </imageobject>
+      <imageobject>
+       <imagedata fileref="figures/distributed-uml-22.png" format="PNG" align="center"></imagedata>
+      </imageobject>
+      <textobject>
+       <phrase><type>DomainLayout</type></phrase>
+      </textobject>
+     </mediaobject>
+    </figure>
+ 
+    <figure float="1" id="uml-distributed-layout-dynamiclayout">
+     <title><type>DynamicLayout</type></title>
+     <mediaobject>
+      <imageobject>
+       <imagedata fileref="figures/distributed-uml.23" format="EPS" align="center"></imagedata>
+      </imageobject>
+      <imageobject>
+       <imagedata fileref="figures/distributed-uml-23.png" format="PNG" align="center"></imagedata>
+      </imageobject>
+      <textobject>
+       <phrase><type>DynamicLayout</type></phrase>
+      </textobject>
+     </mediaobject>
+    </figure>
+ 
+    <figure float="1" id="uml-distributed-layout-gridlayout">
+     <title><type>GridLayout</type></title>
+     <mediaobject>
+      <imageobject>
+       <imagedata fileref="figures/distributed-uml.24" format="EPS" align="center"></imagedata>
+      </imageobject>
+      <imageobject>
+       <imagedata fileref="figures/distributed-uml-24.png" format="PNG" align="center"></imagedata>
+      </imageobject>
+      <textobject>
+       <phrase><type>GridLayout</type></phrase>
+      </textobject>
+     </mediaobject>
+    </figure>
+ 
+    <figure float="1" id="uml-distributed-layout-uniformgridlayout">
+     <title><type>UniformGridLayout</type></title>
+     <mediaobject>
+      <imageobject>
+       <imagedata fileref="figures/distributed-uml.20" format="EPS" align="center"></imagedata>
+      </imageobject>
+      <imageobject>
+       <imagedata fileref="figures/distributed-uml-20.png" format="PNG" align="center"></imagedata>
+      </imageobject>
+      <textobject>
+       <phrase><type>UniformGridLayout</type></phrase>
+      </textobject>
+     </mediaobject>
+    </figure>
+ 
+    <figure float="1" id="uml-distributed-layout-sparsetilelayout">
+     <title><type>SparseTileLayout</type></title>
+     <mediaobject>
+      <imageobject>
+       <imagedata fileref="figures/distributed-uml.21" format="EPS" align="center"></imagedata>
+      </imageobject>
+      <imageobject>
+       <imagedata fileref="figures/distributed-uml-21.png" format="PNG" align="center"></imagedata>
+      </imageobject>
+      <textobject>
+       <phrase><type>SparseTileLayout</type></phrase>
+      </textobject>
+     </mediaobject>
+    </figure>
+ 
+ 
+    <para>Context mappers map domain patches to contexts.  Effectively,
+    they map pieces of a domain to processors.  Even though users
+    rarely use any of their member functions, the diagrams list them.
+    The type <type>List_t</type> abbreviates an
+    <type>std::vector</type> of pointers to <type>Node</type>s of
+    &domain;s.  <type>GL</type> abbreviates <type>GuardLayers</type>.
+    All files are relative to the <filename
+    class="directory">src/Partition</filename> subdirectory.</para>
+ 
+    <figure float="1" id="uml-distributed-mapper-overview">
+     <title>Relationships Among Context Mappers</title>
+     <mediaobject>
+      <imageobject>
+       <imagedata fileref="figures/distributed-uml.10" format="EPS" align="center"></imagedata>
+      </imageobject>
+      <imageobject>
+       <imagedata fileref="figures/distributed-uml-10.png" format="PNG" align="center"></imagedata>
+      </imageobject>
+      <textobject>
+       <phrase>Five different mappers inherit from the base
+       <type>ContextMapper</type>.</phrase>
+      </textobject>
+     </mediaobject>
+    </figure>
+ 
+    <figure float="1" id="uml-distributed-mapper-details">
+     <title>Context Mappers</title>
+     <mediaobject>
+      <imageobject>
+       <imagedata fileref="figures/distributed-uml.11" format="EPS" align="center"></imagedata>
+      </imageobject>
+      <imageobject>
+       <imagedata fileref="figures/distributed-uml-11.png" format="PNG" align="center"></imagedata>
+      </imageobject>
+      <textobject>
+       <phrase>Details of the five different mappers inheriting from
+       the base <type>ContextMapper</type>.</phrase>
+      </textobject>
+     </mediaobject>
+    </figure>
+ 
+   </section>
+  </appendix>
Index: figures/Makefile
===================================================================
RCS file: /home/pooma/Repository/r2/docs/manual/figures/Makefile,v
retrieving revision 1.3
diff -c -p -r1.3 Makefile
*** figures/Makefile	2002/02/27 03:51:53	1.3
--- figures/Makefile	2002/03/04 22:50:57
*************** RESULTS= $(SOURCES:%.mp=mproof-%.ps)
*** 37,45 ****
  TREE_SOURCES= $(SOURCES) Makefile macros.ltx
  
  # UML class diagrams that occur in the appendix containing these.
! UML_DIAGRAMS= explanation-uml-1.png array-uml.1 array-uml.2 array-uml.3 \
! 	      domain-uml.1 engine-uml.1 engine-uml.2 engine-uml.3 \
! 	      engine-uml.4
  
  # Create all the EPS and PNG files.  The 'mproof-all' target creates
  # the EPS files.  This should happen before trying to create the PNG
--- 37,58 ----
  TREE_SOURCES= $(SOURCES) Makefile macros.ltx
  
  # UML class diagrams that occur in the appendix containing these.
! UML_DIAGRAMS= explanation-uml-1.png \
! 	      array-uml-1.png array-uml-2.png array-uml-3.png \
! 	      distributed-uml-5.png distributed-uml-4.png \
! 	      distributed-uml-3.png distributed-uml-30.png \
! 	      distributed-uml-22.png distributed-uml-23.png \
! 	      distributed-uml-24.png distributed-uml-20.png \
! 	      distributed-uml-21.png distributed-uml-10.png \
! 	      distributed-uml-11.png \
! 	      domain-uml-1.png \
! 	      engine-uml-1.png engine-uml-2.png engine-uml-3.png \
! 	      engine-uml-4.png \
! 	      field-uml-10.png field-uml-3.png field-uml-1.png \
! 	      field-uml-2.png field-uml-11.png \
! 	      math-objs-uml-1.png math-objs-uml-10.png \
! 	      math-objs-uml-11.png math-objs-uml-2.png math-objs-uml-3.png \
! 	      math-objs-uml-4.png
  
  # Create all the EPS and PNG files.  The 'mproof-all' target creates
  # the EPS files.  This should happen before trying to create the PNG
*************** introduction-%.png: introduction.%
*** 72,82 ****
--- 85,101 ----
  	$(EPSTOPNG) -p -o $@ $^
  array-uml-%.png: array-uml.%
  	$(EPSTOPNG) -p -o $@ $^
+ distributed-uml-%.png: distributed-uml.%
+ 	$(EPSTOPNG) -p -o $@ $^
  domain-uml-%.png: domain-uml.%
  	$(EPSTOPNG) -p -o $@ $^
  engine-uml-%.png: engine-uml.%
  	$(EPSTOPNG) -p -o $@ $^
  explanation-uml-%.png: explanation-uml.%
+ 	$(EPSTOPNG) -p -o $@ $^
+ field-uml-%.png: field-uml.%
+ 	$(EPSTOPNG) -p -o $@ $^
+ math-objs-uml-%.png: math-objs-uml.%
  	$(EPSTOPNG) -p -o $@ $^
  
  clean:
Index: figures/array-uml-1.png
===================================================================
RCS file: /home/pooma/Repository/r2/docs/manual/figures/array-uml-1.png,v
retrieving revision 1.1
diff -c -p -r1.1 array-uml-1.png
Binary files /tmp/cvsgrf0Om and array-uml-1.png differ
Index: figures/array-uml-2.png
===================================================================
RCS file: /home/pooma/Repository/r2/docs/manual/figures/array-uml-2.png,v
retrieving revision 1.1
diff -c -p -r1.1 array-uml-2.png
Binary files /tmp/cvszpurUR and array-uml-2.png differ
Index: figures/array-uml-3.png
===================================================================
RCS file: /home/pooma/Repository/r2/docs/manual/figures/array-uml-3.png,v
retrieving revision 1.1
diff -c -p -r1.1 array-uml-3.png
Binary files /tmp/cvsGHuyWm and array-uml-3.png differ
Index: figures/array-uml.mp
===================================================================
RCS file: /home/pooma/Repository/r2/docs/manual/figures/array-uml.mp,v
retrieving revision 1.1
diff -c -p -r1.1 array-uml.mp
*** figures/array-uml.mp	2002/02/27 03:51:54	1.1
--- figures/array-uml.mp	2002/03/04 22:50:58
*************** beginfig(1)
*** 34,47 ****
      btex
      \begin{lists}
      Array() \\
-     Array(Domain \ldots) \\
-     Array(Domain \ldots, ModelElement<T>) \\
      Array(Array) \\
      Array(Array, Domain) \\
!     initialize(Domain \ldots) \\
!     initialize(Domain \ldots, ModelElement<T>) \\
!     read(\ldots) \\
!     operator()(\ldots) \\
      domain() \\
      physicalDomain() \\
      totalDomain() \\
--- 34,85 ----
      btex
      \begin{lists}
      Array() \\
      Array(Array) \\
      Array(Array, Domain) \\
!     Array(const Domain\&) \\
!     Array(const Domain[1-2]\&) \\
!     Array(const Domain[1-3]\&) \\
!     Array(const Domain[1-4]\&) \\
!     Array(const Domain[1-5]\&) \\
!     Array(const Domain[1-6]\&) \\
!     Array(const Domain[1-7]\&) \\
!     Array(const Domain\&, ModelElement<T>) \\
!     Array(const Domain[1-2]\&, ModelElement<T>) \\
!     Array(const Domain[1-3]\&, ModelElement<T>) \\
!     Array(const Domain[1-4]\&, ModelElement<T>) \\
!     Array(const Domain[1-5]\&, ModelElement<T>) \\
!     Array(const Domain[1-6]\&, ModelElement<T>) \\
!     Array(const Domain[1-7]\&, ModelElement<T>) \\
!     void initialize(const Domain\&) \\
!     void initialize(const Domain[1-2]\&) \\
!     void initialize(const Domain[1-3]\&) \\
!     void initialize(const Domain[1-4]\&) \\
!     void initialize(const Domain[1-5]\&) \\
!     void initialize(const Domain[1-6]\&) \\
!     void initialize(const Domain[1-7]\&) \\
!     void initialize(const Domain\&, ModelElement<T>) \\
!     void initialize(const Domain[1-2]\&, ModelElement<T>) \\
!     void initialize(const Domain[1-3]\&, ModelElement<T>) \\
!     void initialize(const Domain[1-4]\&, ModelElement<T>) \\
!     void initialize(const Domain[1-5]\&, ModelElement<T>) \\
!     void initialize(const Domain[1-6]\&, ModelElement<T>) \\
!     void initialize(const Domain[1-7]\&, ModelElement<T>) \\
!     read() \\
!     read(const X1\&) \\
!     read(const X[1-2]\&) \\
!     read(const X[1-3]\&) \\
!     read(const X[1-4]\&) \\
!     read(const X[1-5]\&) \\
!     read(const X[1-6]\&) \\
!     read(const X[1-7]\&) \\
!     operator()() \\
!     operator()(const X1\&) \\
!     operator()(const X[1-2]\&) \\
!     operator()(const X[1-3]\&) \\
!     operator()(const X[1-4]\&) \\
!     operator()(const X[1-5]\&) \\
!     operator()(const X[1-6]\&) \\
!     operator()(const X[1-7]\&) \\
      domain() \\
      physicalDomain() \\
      totalDomain() \\
*************** beginfig(1)
*** 54,65 ****
      size() \\
      layout() \\
      engine() \\
!     operator<<
      \end{lists} etex);
    boxit.array[3](
      btex
      \begin{lists}
!     dim D \\
      value type T \\
      engine tag Tag
      \end{lists} etex);
--- 92,103 ----
      size() \\
      layout() \\
      engine() \\
!     operator<<()
      \end{lists} etex);
    boxit.array[3](
      btex
      \begin{lists}
!     dimension D \\
      value type T \\
      engine tag Tag
      \end{lists} etex);
*************** beginfig(1)
*** 80,89 ****
      DynamicArray(Domain, ModelElement<T>) \\
      DynamicArray(DynamicArray) \\
      DynamicArray(DynamicArray, Domain) \\
!     initialize(Domain \ldots) \\
!     initialize(Domain \ldots, ModelElement<T>) \\
!     read(\ldots) \\
!     operator()(\ldots) \\
      domain() \\
      physicalDomain() \\
      totalDomain() \\
--- 118,153 ----
      DynamicArray(Domain, ModelElement<T>) \\
      DynamicArray(DynamicArray) \\
      DynamicArray(DynamicArray, Domain) \\
!     void initialize(const Domain\&) \\
!     void initialize(const Domain[1-2]\&) \\
!     void initialize(const Domain[1-3]\&) \\
!     void initialize(const Domain[1-4]\&) \\
!     void initialize(const Domain[1-5]\&) \\
!     void initialize(const Domain[1-6]\&) \\
!     void initialize(const Domain[1-7]\&) \\
!     void initialize(const Domain\&, ModelElement<T>) \\
!     void initialize(const Domain[1-2]\&, ModelElement<T>) \\
!     void initialize(const Domain[1-3]\&, ModelElement<T>) \\
!     void initialize(const Domain[1-4]\&, ModelElement<T>) \\
!     void initialize(const Domain[1-5]\&, ModelElement<T>) \\
!     void initialize(const Domain[1-6]\&, ModelElement<T>) \\
!     void initialize(const Domain[1-7]\&, ModelElement<T>) \\
!     read() \\
!     read(const X1\&) \\
!     read(const X[1-2]\&) \\
!     read(const X[1-3]\&) \\
!     read(const X[1-4]\&) \\
!     read(const X[1-5]\&) \\
!     read(const X[1-6]\&) \\
!     read(const X[1-7]\&) \\
!     operator()() \\
!     operator()(const X1\&) \\
!     operator()(const X[1-2]\&) \\
!     operator()(const X[1-3]\&) \\
!     operator()(const X[1-4]\&) \\
!     operator()(const X[1-5]\&) \\
!     operator()(const X[1-6]\&) \\
!     operator()(const X[1-7]\&) \\
      domain() \\
      physicalDomain() \\
      totalDomain() \\
*************** beginfig(1)
*** 96,102 ****
      size() \\
      layout() \\
      engine() \\
!     operator<< \\
      array() \\
      arrayAll() \\
      create(CreateSize\t) \\
--- 160,166 ----
      size() \\
      layout() \\
      engine() \\
!     operator<<() \\
      array() \\
      arrayAll() \\
      create(CreateSize\t) \\
*************** beginfig(1)
*** 147,153 ****
  
    % Draw arrows between classes.
    drawDiscriminator(array[0].s, 0);
!   z0 = array[0].s - (0,discriminatorScale);
    draw z0 -- dynamicarray[0].n;
  endfig;
  
--- 211,217 ----
  
    % Draw arrows between classes.
    drawDiscriminator(array[0].s, 0);
!   z0 = array[0].s - (0,discriminatorLength);
    draw z0 -- dynamicarray[0].n;
  endfig;
  
*************** beginfig(2)
*** 162,193 ****
      btex
      \begin{lists}
      Array() \\
-     Array(Domain \ldots) \\
-     Array(Domain \ldots, ModelElement<T>) \\
      Array(Array) \\
      Array(Array, Domain) \\
!     initialize(Domain \ldots) \\
!     initialize(Domain \ldots, ModelElement<T>) \\
!     read(\ldots) \\
!     operator()(\ldots) \\
      domain() \\
      physicalDomain() \\
      totalDomain() \\
!     first(int) \\
!     last(int) \\
      length(int) \\
!     firsts() \\
!     lasts() \\
      lengths() \\
      size() \\
      layout() \\
      engine() \\
!     operator<<
      \end{lists} etex);
    boxit.array[3](
      btex
      \begin{lists}
!     dim D \\
      value type T \\
      engine tag Tag
      \end{lists} etex);
--- 226,285 ----
      btex
      \begin{lists}
      Array() \\
      Array(Array) \\
      Array(Array, Domain) \\
!     Array(const Domain\&) \\
!     Array(const Domain[1-2]\&) \\
!     Array(const Domain[1-3]\&) \\
!     Array(const Domain[1-4]\&) \\
!     Array(const Domain[1-5]\&) \\
!     Array(const Domain[1-6]\&) \\
!     Array(const Domain[1-7]\&) \\
!     Array(const Domain\&, ModelElement<T>) \\
!     Array(const Domain[1-2]\&, ModelElement<T>) \\
!     Array(const Domain[1-3]\&, ModelElement<T>) \\
!     Array(const Domain[1-4]\&, ModelElement<T>) \\
!     Array(const Domain[1-5]\&, ModelElement<T>) \\
!     Array(const Domain[1-6]\&, ModelElement<T>) \\
!     Array(const Domain[1-7]\&, ModelElement<T>) \\
!     void initialize(const Domain\&) \\
!     void initialize(const Domain[1-2]\&) \\
!     void initialize(const Domain[1-3]\&) \\
!     void initialize(const Domain[1-4]\&) \\
!     void initialize(const Domain[1-5]\&) \\
!     void initialize(const Domain[1-6]\&) \\
!     void initialize(const Domain[1-7]\&) \\
!     void initialize(const Domain\&, ModelElement<T>) \\
!     void initialize(const Domain[1-2]\&, ModelElement<T>) \\
!     void initialize(const Domain[1-3]\&, ModelElement<T>) \\
!     void initialize(const Domain[1-4]\&, ModelElement<T>) \\
!     void initialize(const Domain[1-5]\&, ModelElement<T>) \\
!     void initialize(const Domain[1-6]\&, ModelElement<T>) \\
!     void initialize(const Domain[1-7]\&, ModelElement<T>) \\
!     read();			operator()() \\
!     read(const X1\&);		operator()(const X1\&) \\
!     read(const X[1-2]\&);	operator()(const X[1-2]\&) \\
!     read(const X[1-3]\&);	operator()(const X[1-3]\&) \\
!     read(const X[1-4]\&);	operator()(const X[1-4]\&) \\
!     read(const X[1-5]\&);	operator()(const X[1-5]\&) \\
!     read(const X[1-6]\&);	operator()(const X[1-6]\&) \\
!     read(const X[1-7]\&);	operator()(const X[1-7]\&) \\
      domain() \\
      physicalDomain() \\
      totalDomain() \\
!     first(int); last(int) \\
      length(int) \\
!     firsts(); lasts() \\
      lengths() \\
      size() \\
      layout() \\
      engine() \\
!     operator<<()
      \end{lists} etex);
    boxit.array[3](
      btex
      \begin{lists}
!     dimension D \\
      value type T \\
      engine tag Tag
      \end{lists} etex);
*************** beginfig(3)
*** 256,278 ****
      DynamicArray(Domain, ModelElement<T>) \\
      DynamicArray(DynamicArray) \\
      DynamicArray(DynamicArray, Domain) \\
!     initialize(Domain \ldots) \\
!     initialize(Domain \ldots, ModelElement<T>) \\
!     read(\ldots) \\
!     operator()(\ldots) \\
      domain() \\
      physicalDomain() \\
      totalDomain() \\
!     first(int) \\
!     last(int) \\
      length(int) \\
!     firsts() \\
!     lasts() \\
      lengths() \\
      size() \\
      layout() \\
      engine() \\
!     operator<< \\
      array() \\
      arrayAll() \\
      create(CreateSize\t) \\
--- 348,386 ----
      DynamicArray(Domain, ModelElement<T>) \\
      DynamicArray(DynamicArray) \\
      DynamicArray(DynamicArray, Domain) \\
!     void initialize(const Domain\&) \\
!     void initialize(const Domain[1-2]\&) \\
!     void initialize(const Domain[1-3]\&) \\
!     void initialize(const Domain[1-4]\&) \\
!     void initialize(const Domain[1-5]\&) \\
!     void initialize(const Domain[1-6]\&) \\
!     void initialize(const Domain[1-7]\&) \\
!     void initialize(const Domain\&, ModelElement<T>) \\
!     void initialize(const Domain[1-2]\&, ModelElement<T>) \\
!     void initialize(const Domain[1-3]\&, ModelElement<T>) \\
!     void initialize(const Domain[1-4]\&, ModelElement<T>) \\
!     void initialize(const Domain[1-5]\&, ModelElement<T>) \\
!     void initialize(const Domain[1-6]\&, ModelElement<T>) \\
!     void initialize(const Domain[1-7]\&, ModelElement<T>) \\
!     read();			operator()() \\
!     read(const X1\&);		operator()(const X1\&) \\
!     read(const X[1-2]\&);	operator()(const X[1-2]\&) \\
!     read(const X[1-3]\&);	operator()(const X[1-3]\&) \\
!     read(const X[1-4]\&);	operator()(const X[1-4]\&) \\
!     read(const X[1-5]\&);	operator()(const X[1-5]\&) \\
!     read(const X[1-6]\&);	operator()(const X[1-6]\&) \\
!     read(const X[1-7]\&);	operator()(const X[1-7]\&) \\
      domain() \\
      physicalDomain() \\
      totalDomain() \\
!     first(int); last(int) \\
      length(int) \\
!     firsts(); lasts() \\
      lengths() \\
      size() \\
      layout() \\
      engine() \\
!     operator<<() \\
      array() \\
      arrayAll() \\
      create(CreateSize\t) \\
Index: figures/data-parallel.mp
===================================================================
RCS file: /home/pooma/Repository/r2/docs/manual/figures/data-parallel.mp,v
retrieving revision 1.3
diff -c -p -r1.3 data-parallel.mp
*** figures/data-parallel.mp	2002/01/31 21:29:58	1.3
--- figures/data-parallel.mp	2002/03/04 22:51:00
*************** beginfig(101)
*** 59,68 ****
    endfor
  
    %% Label the node's types.
- % TMP  label.rt(btex \type{OpAddAssign} etex, b0.e);
- % TMP  label.rt(btex \type{Expression} etex, 0.5[b0.c,b2.c]);
    label.top(btex \type{Expression} etex, b2.n);
- % TMP  label.lft(btex \type{Ar} etex, b1.w);
    label.rt(btex \type{BinaryNode<OpAdd,} etex, b2.e);
    label.lft(btex \type{UnaryNode<OpMinus,} etex, b3.w);
    label.lft(btex \type{Ar} etex, b4.w);
--- 59,65 ----
Index: figures/distributed-uml-10.png
===================================================================
RCS file: distributed-uml-10.png
diff -N distributed-uml-10.png
Binary files /dev/null and distributed-uml-10.png differ
Index: figures/distributed-uml-11.png
===================================================================
RCS file: distributed-uml-11.png
diff -N distributed-uml-11.png
Binary files /dev/null and distributed-uml-11.png differ
Index: figures/distributed-uml-20.png
===================================================================
RCS file: distributed-uml-20.png
diff -N distributed-uml-20.png
Binary files /dev/null and distributed-uml-20.png differ
Index: figures/distributed-uml-21.png
===================================================================
RCS file: distributed-uml-21.png
diff -N distributed-uml-21.png
Binary files /dev/null and distributed-uml-21.png differ
Index: figures/distributed-uml-22.png
===================================================================
RCS file: distributed-uml-22.png
diff -N distributed-uml-22.png
Binary files /dev/null and distributed-uml-22.png differ
Index: figures/distributed-uml-23.png
===================================================================
RCS file: distributed-uml-23.png
diff -N distributed-uml-23.png
Binary files /dev/null and distributed-uml-23.png differ
Index: figures/distributed-uml-24.png
===================================================================
RCS file: distributed-uml-24.png
diff -N distributed-uml-24.png
Binary files /dev/null and distributed-uml-24.png differ
Index: figures/distributed-uml-3.png
===================================================================
RCS file: distributed-uml-3.png
diff -N distributed-uml-3.png
Binary files /dev/null and distributed-uml-3.png differ
Index: figures/distributed-uml-30.png
===================================================================
RCS file: distributed-uml-30.png
diff -N distributed-uml-30.png
Binary files /dev/null and distributed-uml-30.png differ
Index: figures/distributed-uml-4.png
===================================================================
RCS file: distributed-uml-4.png
diff -N distributed-uml-4.png
Binary files /dev/null and distributed-uml-4.png differ
Index: figures/distributed-uml-5.png
===================================================================
RCS file: distributed-uml-5.png
diff -N distributed-uml-5.png
Binary files /dev/null and distributed-uml-5.png differ
Index: figures/distributed-uml.mp
===================================================================
RCS file: distributed-uml.mp
diff -N distributed-uml.mp
*** /dev/null	Fri Mar 23 21:37:44 2001
--- distributed-uml.mp	Mon Mar  4 15:51:05 2002
***************
*** 0 ****
--- 1,1138 ----
+ %% Oldham, Jeffrey D.
+ %% 2002Feb28
+ %% POOMA
+ 
+ %% UML Diagrams of Classes for Distributed Computation
+ 
+ 
+ %% Assumes TEX=latex.
+ 
+ %% Ensure fonts are included in the output.
+ prologues := 2;			% >= 2 for PostScript
+ 
+ input boxes;
+ input box-macros;
+ input uml;
+ 
+ verbatimtex
+ \documentclass[10pt]{article}
+ \usepackage{amsmath}
+ \input{macros.ltx}
+ \usepackage{times}
+ \usepackage{mathptm}
+ \newlength{\cnw}	% Required to use \classnameWidth and \emptyBox
+ \begin{document}
+ etex
+ 
+ 
+ %% Draw the SpatialPartition box.
+ beginfig(3)
+   %% Create the boxes.
+   % SpatialPartition
+   boxit.sPartition[0](btex \classname{SpatialPartition} etex);
+   boxit.sPartition[1](btex etex);
+   boxit.sPartition[2](
+     btex
+     \begin{lists}
+     SpatialPartition(const RefLayout\&) \\
+     SpatialPartition(const SpatialPartition\&) \\
+     \tilder SpatialPartition() \\
+     SpatialPartition\& operator=(const SpatialPartition\&) \\
+     Loc<1> blocks() \\
+     int context() \\
+     bool hasCustomEdgeGuards()\\
+     const RefLayout\& reference() \\
+     void print(Out\&)
+     \end{lists} etex);
+   boxit.sPartition[3](
+     btex
+     \begin{lists}
+     RefLayout
+     \end{lists} etex);
+   boxit.sPartition[4](
+     btex \begin{files}
+     SpatialPartition.h
+     \end{files} etex);
+ 
+   % TilePartition
+   boxit.tPartition[0](btex \classname{TilePartition} etex);
+   boxit.tPartition[1](btex etex);
+   boxit.tPartition[2](
+     btex
+     \begin{lists}
+     TilePartition() \\
+     TilePartition(const PatchList\_t\&) \\
+     TilePartition(const PatchList\_t\&, const GL<Dim>\&) \\
+     TilePartition(const PatchList\_t\&, const GL<Dim>\&, const GL<Dim>\&) \\
+     TilePartition(const TilePartition\&) \\
+     \tilder TilePartition() \\
+     TilePartition\& operator=(const TilePartition\&) \\
+     PatchList\_t tileList() \\
+     bool hasCustomEdgeGuards()\\
+     void print(Out\&)
+     \end{lists} etex);
+   boxit.tPartition[3](
+     btex
+     \begin{lists}
+     dim D
+     \end{lists} etex);
+   boxit.tPartition[4](
+     btex \begin{files}
+     TilePartition.h
+     \end{files} etex);
+   
+   %% Position the boxes.
+   % Position the template parameters.
+   forsuffixes $=sPartition, tPartition:
+     samewidth($[0],$[1],$[2]);
+     for t = 0 upto 1:
+       $.[t].se = $[t+1].ne;
+       $.[t].sw = $[t+1].nw;
+     endfor
+     fixsize($[0],$[1],$[2]);
+   endfor
+   forsuffixes $=sPartition, tPartition:
+     fixsize($[3]);
+     $[0].ne - $[3].sw  =
+     (min(0.5 xpart($[3].ne - $[3].sw), $[0].dx),
+       min(0.5 ypart($[3].ne - $[3].sw), $[0].dy));
+   endfor
+   % Position the implementation files boxes.
+   forsuffixes $=sPartition, tPartition:
+     fixsize($[4]);
+     $[2].s = $[4].nw;
+   endfor
+ 
+   % Position the UML classes.
+   sPartition[0].c = origin;
+   sPartition[2].sw - tPartition[0].nw = (0,2yUnit);
+   
+   %% Draw the boxes.
+   % Draw the UML class boxes.
+   forsuffixes $=sPartition, tPartition:
+     for t = 0 upto 2:
+       drawboxed($[t]);
+     endfor
+   endfor
+   % Draw the template parameters.
+   forsuffixes $=sPartition, tPartition:
+     unfill bpath($[3]);
+     drawunboxed($[3]);
+     draw bpath($[3]) dashed evenly;
+   endfor
+   % Draw the implementation files.
+   forsuffixes $=sPartition, tPartition:
+     drawunboxed($[4]);
+   endfor
+ endfig;
+ 
+ 
+ %% Draw the GridPartition box.
+ beginfig(4)
+   %% Create the boxes.
+   % GridPartition
+   boxit.gPartition[0](btex \classname{GridPartition} etex);
+   boxit.gPartition[1](btex etex);
+   boxit.gPartition[2](
+     btex
+     \begin{lists}
+     GridPartition() \\
+     GridPartition(const Grid\&) \\
+     GridPartition(const Grid\&, const GuardLayers\&) \\
+     GridPartition(const Grid\&, const GuardLayers\&, const GuardLayers\&) \\
+     GridPartition(const Loc\&) \\
+     GridPartition(const Loc\&, const GuardLayers\&) \\
+     GridPartition(const Loc\&, const GuardLayers\&, const GuardLayers\&) \\
+     GridPartition(const GridPartition\&) \\
+     GridPartition(const UniformGridPartition\&) \\
+     \tilder GridPartition() \\
+     GridPartition\& operator=(const GridPartition\&) \\
+     const Loc\& blocks() \\
+     bool hasCustomEdgeGuards()\\
+     const Grid\& grid() \\
+     void print(Out\&);
+     \end{lists} etex);
+   boxit.gPartition[3](
+     btex
+     \begin{lists}
+     dim D
+     \end{lists} etex);
+   boxit.gPartition[4](
+     btex \begin{files}
+     GridPartition.h
+     \end{files} etex);
+ 
+   % UniformGridPartition
+   boxit.ugPartition[0](btex \classname{UniformGridPartition} etex);
+   boxit.ugPartition[1](btex etex);
+   boxit.ugPartition[2](
+     btex
+     \begin{lists}
+     UniformGridPartition() \\
+     UniformGridPartition(const GL\&) \\
+     UniformGridPartition(const Loc\&) \\
+     UniformGridPartition(const Loc\&, const GL\&) \\
+     UniformGridPartition(const Loc\&, const GL\&, const GL\&) \\
+     UniformGridPartition(const UniformGridPartition\&) \\
+     \tilder UniformGridPartition() \\
+     UniformGridPartition\& operator=(const UniformGridPartition\&) \\
+     const Loc\& blocks() \\
+     \end{lists} etex);
+   boxit.ugPartition[3](
+     btex
+     \begin{lists}
+     dim D
+     \end{lists} etex);
+   boxit.ugPartition[4](
+     btex \begin{files}
+     UniformGridPartition.h
+     \end{files} etex);
+   
+   %% Position the boxes.
+   % Position the template parameters.
+   forsuffixes $=gPartition, ugPartition:
+     samewidth($[0],$[1],$[2]);
+     for t = 0 upto 1:
+       $.[t].se = $[t+1].ne;
+       $.[t].sw = $[t+1].nw;
+     endfor
+     fixsize($[0],$[1],$[2]);
+   endfor
+   forsuffixes $=gPartition, ugPartition:
+     fixsize($[3]);
+     $[0].ne - $[3].sw  =
+     (min(0.5 xpart($[3].ne - $[3].sw), $[0].dx),
+       min(0.5 ypart($[3].ne - $[3].sw), $[0].dy));
+   endfor
+   % Position the implementation files boxes.
+   forsuffixes $=gPartition, ugPartition:
+     fixsize($[4]);
+     $[2].s = $[4].nw;
+   endfor
+ 
+   % Position the UML classes.
+   gPartition[0].c = origin;
+   gPartition[2].sw - ugPartition[0].nw = (0,2yUnit);
+   
+   %% Draw the boxes.
+   % Draw the UML class boxes.
+   forsuffixes $=gPartition, ugPartition:
+     for t = 0 upto 2:
+       drawboxed($[t]);
+     endfor
+   endfor
+   % Draw the template parameters.
+   forsuffixes $=gPartition, ugPartition:
+     unfill bpath($[3]);
+     drawunboxed($[3]);
+     draw bpath($[3]) dashed evenly;
+   endfor
+   % Draw the implementation files.
+   forsuffixes $=gPartition, ugPartition:
+     drawunboxed($[4]);
+   endfor
+ endfig;
+ 
+ 
+ %% Draw an abstract Partition box and related classes.
+ beginfig(5)
+   %% Create the boxes.
+   % Partition
+   boxit.partition[0](btex \classname{\emph{Partition}} etex);
+   boxit.partition[1](btex etex);
+   boxit.partition[2](
+     btex
+     \begin{lists}
+     Partition() \\
+     Partition(const Partition\&) \\
+     \tilder Partition() \\
+     Partition\& operator=(const Partition\&) \\
+     int maxSize() \\
+     bool hasGuards()\\
+     bool hasInternalGuards() \\
+     bool hasExternalGuards() \\
+     const GuardLayers\& internalGuards() \\
+     const GuardLayers\& externalGuards() \\
+     int partition(const Dom\&, List\_t\&, const ContextMapper\&) \\
+     int partition(const Dom\&, List\_t\&)
+     \end{lists} etex);
+   boxit.partition[3](
+     btex
+     \begin{lists}
+     dim D
+     \end{lists} etex);
+   boxit.ugPartition[0](btex \classname{UniformGridPartition} etex);
+   boxit.ugPartition[3](
+     btex
+     \begin{lists}
+     dim D
+     \end{lists} etex);
+   boxit.tPartition[0](btex \classname{TilePartition} etex);
+   boxit.tPartition[3](
+     btex
+     \begin{lists}
+     dim D
+     \end{lists} etex);
+   boxit.sPartition[0](btex \classname{SpatialPartition} etex);
+   boxit.sPartition[3](
+     btex
+     \begin{lists}
+     RefLayout
+     \end{lists} etex);
+   boxit.gPartition[0](btex \classname{GridPartition} etex);
+   boxit.gPartition[3](
+     btex
+     \begin{lists}
+     dim D
+     \end{lists} etex);
+   
+   %% Position the boxes.
+   % Position the template parameters.
+   forsuffixes $=partition:
+     samewidth($[0],$[1],$[2]);
+     for t = 0 upto 1:
+       $.[t].se = $[t+1].ne;
+       $.[t].sw = $[t+1].nw;
+     endfor
+     fixsize($[0],$[1],$[2]);
+   endfor
+   forsuffixes $=gPartition, sPartition, tPartition, ugPartition:
+     fixsize($[0]);
+   endfor
+   forsuffixes $=partition, gPartition, sPartition, tPartition, ugPartition:
+     fixsize($[3]);
+     $[0].ne - $[3].sw  =
+     (min(0.5 xpart($[3].ne - $[3].sw), $[0].dx),
+       min(0.5 ypart($[3].ne - $[3].sw), $[0].dy));
+   endfor
+ 
+   % Position the UML classes.
+   partition[0].c = origin;
+   gPartition[0].sw - sPartition[0].nw =
+   sPartition[0].sw - tPartition[0].nw =
+   tPartition[0].sw - ugPartition[0].nw = (0, yUnit);
+   partition[2].sw - gPartition[0].nw = (0,yUnit);
+ 
+   %% Draw the boxes.
+   % Draw the UML class boxes.
+   forsuffixes $=partition:
+     for t = 0 upto 2:
+       drawboxed($[t]);
+     endfor
+   endfor
+   forsuffixes $=gPartition, sPartition, tPartition, ugPartition:
+     for t = 0 upto 0:
+       drawboxed($[t]);
+     endfor
+   endfor
+   % Draw the template parameters.
+   forsuffixes $=partition, gPartition, sPartition, tPartition, ugPartition:
+     unfill bpath($[3]);
+     drawunboxed($[3]);
+     draw bpath($[3]) dashed evenly;
+   endfor
+ 
+   %% Draw the realization lines.
+   z0 = 0.7[partition[2].sw,partition[2].se];
+   drawDiscriminator(z0, 0);
+   forsuffixes $=gPartition, sPartition, tPartition, ugPartition:
+     draw $[0].e -- (x0,ypart($[0].e)) dashed evenly;
+   endfor
+   draw (x0,ypart(ugPartition[0].e)) -- (z0 - (0,discriminatorLength)) dashed evenly;
+ 
+ endfig;
+ 
+ 
+ %% Draw the ContextMapper box.
+ beginfig(10)
+   %% Create the boxes.
+   % Partition
+   boxit.cMapper[0](btex \classname{ContextMapper} etex);
+   boxit.cMapper[1](btex etex);
+   boxit.cMapper[2](
+     btex
+     \begin{lists}
+     ContextMapper() \\
+     void setAffinity(const List\_t\&)
+     \end{lists} etex);
+   boxit.cMapper[3](
+     btex
+     \begin{lists}
+     dim D
+     \end{lists} etex);
+   boxit.cMapper[4](
+     btex \begin{files}
+     ContextMapper.h
+     \end{files} etex);
+   boxit.lMapper[0](btex \classname{LocalMapper} etex);
+   boxit.lMapper[3](
+     btex
+     \begin{lists}
+     dim D
+     \end{lists} etex);
+   boxit.dMapper[0](btex \classname{DistributedMapper} etex);
+   boxit.dMapper[3](
+     btex
+     \begin{lists}
+     dim D
+     \end{lists} etex);
+   boxit.contMapper[0](btex \classname{ContiguousMapper} etex);
+   boxit.contMapper[3](
+     btex
+     \begin{lists}
+     dim D
+     \end{lists} etex);
+   boxit.biMapper[0](btex \classname{BisectionMapper} etex);
+   boxit.biMapper[3](
+     btex
+     \begin{lists}
+     dim D
+     \end{lists} etex);
+   boxit.unifMapper[0](btex \classname{UniformMapper} etex);
+ 
+   %% Position the boxes.
+   % Position the template parameters.
+   forsuffixes $=cMapper:
+     samewidth($[0],$[1],$[2]);
+     for t = 0 upto 1:
+       $.[t].se = $[t+1].ne;
+       $.[t].sw = $[t+1].nw;
+     endfor
+     fixsize($[0],$[1],$[2]);
+   endfor
+   samewidth(lMapper[0], dMapper[0], contMapper[0], biMapper[0], unifMapper[0]);
+   forsuffixes $=lMapper, dMapper, contMapper, biMapper, unifMapper:
+     fixsize($[0]);
+   endfor
+   forsuffixes $=cMapper, lMapper, dMapper, contMapper, biMapper:
+     fixsize($[3]);
+     $[0].ne - $[3].sw  =
+     (min(0.5 xpart($[3].ne - $[3].sw), $[0].dx),
+       min(0.5 ypart($[3].ne - $[3].sw), $[0].dy));
+   endfor
+   % Position the implementation files boxes.
+   forsuffixes $=cMapper:
+     fixsize($[4]);
+     $[2].s = $[4].nw;
+   endfor
+ 
+   % Position the UML classes.
+   cMapper[0].c = origin;
+   cMapper[2].ne - 0.5[lMapper[0].w,unifMapper[0].w] = (-2xUnit,0);
+   lMapper[0].sw - dMapper[0].nw =
+   dMapper[0].sw - contMapper[0].nw =
+   contMapper[0].sw - biMapper[0].nw =
+   biMapper[0].sw - unifMapper[0].nw = (0,yUnit);
+   
+   %% Draw the boxes.
+   % Draw the UML class boxes.
+   forsuffixes $=cMapper:
+     for t = 0 upto 2:
+       drawboxed($[t]);
+     endfor
+   endfor
+   forsuffixes $=lMapper, dMapper, contMapper, biMapper, unifMapper:
+     for t = 0 upto 0:
+       drawboxed($[t]);
+     endfor
+   endfor
+   % Draw the template parameters.
+   forsuffixes $=cMapper, lMapper, dMapper, contMapper, biMapper:
+     unfill bpath($[3]);
+     drawunboxed($[3]);
+     draw bpath($[3]) dashed evenly;
+   endfor
+   % Draw the implementation files.
+   forsuffixes $=cMapper:
+     drawunboxed($[4]);
+   endfor
+ 
+   % Draw lines between classes.
+   drawDiscriminator(cMapper[1].e, 90);
+   x0 = xpart(0.5[cMapper[1].e,contMapper[0].w]);
+   y0 = ypart(cMapper[1].e);
+   draw (cMapper[1].e + (discriminatorLength,0)) -- z0;
+   forsuffixes $=lMapper, dMapper, contMapper, biMapper, unifMapper:
+     draw (x0,ypart($[0].w)) -- $[0].w;
+   endfor
+   label.top(btex \texttt{<1>} etex, 0.5[(x0,ypart(unifMapper[0].w)),unifMapper[0].w]);
+   draw (x0,ypart(lMapper[0].w)) -- (x0,ypart(unifMapper[0].w));
+   
+ endfig;
+ 
+ 
+ %% Draw the LocalMapper box.
+ beginfig(11)
+   %% Create the boxes.
+   % LocalMapper
+   boxit.lMapper[0](btex \classname{LocalMapper} etex);
+   boxit.lMapper[1](btex etex);
+   boxit.lMapper[2](
+     btex
+     \begin{lists}
+     LocalMapper() \\
+     LocalMapper(const Partitioner\&) \\
+     void map(const List\_t\&)
+     \end{lists} etex);
+   boxit.lMapper[3](
+     btex
+     \begin{lists}
+     dim D
+     \end{lists} etex);
+   boxit.lMapper[4](
+     btex \begin{files}
+     ContextMapper.h
+     \end{files} etex);
+   % DistributedMapper
+   boxit.dMapper[0](btex \classname{DistributedMapper} etex);
+   boxit.dMapper[1](btex etex);
+   boxit.dMapper[2](
+     btex
+     \begin{lists}
+     DistributedMapper(const Partitioner\&) \\
+     void map(const List\_t\&)
+     \end{lists} etex);
+   boxit.dMapper[3](
+     btex
+     \begin{lists}
+     dim D
+     \end{lists} etex);
+   boxit.dMapper[4](
+     btex \begin{files}
+     DistributedMapper.h
+     \end{files} etex);
+   % ContiguousMapper
+   boxit.contMapper[0](btex \classname{ContiguousMapper} etex);
+   boxit.contMapper[1](btex etex);
+   boxit.contMapper[2](
+     btex
+     \begin{lists}
+     ContiguousMapper(const Partitioner\&) \\
+     ContiguousMapper(const Partitioner\&, const Loc\&) \\
+     void map(const List\_t\&)
+     \end{lists} etex);
+   boxit.contMapper[3](
+     btex
+     \begin{lists}
+     dim D
+     \end{lists} etex);
+   boxit.contMapper[4](
+     btex \begin{files}
+     ContiguousMapper.h
+     \end{files} etex);
+   % BisectionMapper
+   boxit.biMapper[0](btex \classname{BisectionMapper} etex);
+   boxit.biMapper[1](btex etex);
+   boxit.biMapper[2](
+     btex
+     \begin{lists}
+     BisectionMapper(const Loc\&) \\
+     BisectionMapper(const Partitioner\&) \\
+     BisectionMapper(const Partitioner\&, const Loc\&) \\
+     void map(const List\_t\&)
+     \end{lists} etex);
+   boxit.biMapper[3](
+     btex
+     \begin{lists}
+     dim D
+     \end{lists} etex);
+   boxit.biMapper[4](
+     btex \begin{files}
+     BisectionMapper.h
+     \end{files} etex);
+   % UniformMapper
+   boxit.unifMapper[0](btex \classname{UniformMapper} etex);
+   boxit.unifMapper[1](btex etex);
+   boxit.unifMapper[2](
+     btex
+     \begin{lists}
+     UniformMapper(const Loc<1>\&) \\
+     UniformMapper(const Partitioner\&) \\
+     UniformMapper(int) \\
+     \tilder UniformMapper() \\
+     void map(const List\_t\&)
+     \end{lists} etex);
+   boxit.unifMapper[3](btex etex);
+   boxit.unifMapper[4](
+     btex \begin{files}
+     UniformMapper.h
+     \end{files} etex);
+   
+   %% Position the boxes.
+   % Position the template parameters.
+   forsuffixes $=lMapper, dMapper, contMapper, biMapper, unifMapper:
+     samewidth($[0],$[1],$[2]);
+     for t = 0 upto 1:
+       $.[t].se = $[t+1].ne;
+       $.[t].sw = $[t+1].nw;
+     endfor
+     fixsize($[0],$[1],$[2]);
+   endfor
+   forsuffixes $=lMapper, dMapper, contMapper, biMapper, unifMapper:
+     fixsize($[3]);
+     $[0].ne - $[3].sw  =
+     (min(0.5 xpart($[3].ne - $[3].sw), $[0].dx),
+       min(0.5 ypart($[3].ne - $[3].sw), $[0].dy));
+   endfor
+   % Position the implementation files boxes.
+   forsuffixes $=lMapper, dMapper, contMapper, biMapper, unifMapper:
+     fixsize($[4]);
+     $[2].s = $[4].nw;
+   endfor
+ 
+   % Position the UML classes.
+   lMapper[0].c = origin;
+   lMapper[2].sw - dMapper[0].nw =
+   dMapper[2].sw - contMapper[0].nw =
+   contMapper[2].sw - biMapper[0].nw =
+   biMapper[2].sw - unifMapper[0].nw =
+   (0,1.5yUnit);
+   
+   %% Draw the boxes.
+   % Draw the UML class boxes.
+   forsuffixes $=lMapper, dMapper, contMapper, biMapper, unifMapper:
+     for t = 0 upto 2:
+       drawboxed($[t]);
+     endfor
+   endfor
+   % Draw the template parameters.
+   forsuffixes $=lMapper, dMapper, contMapper, biMapper:
+     unfill bpath($[3]);
+     drawunboxed($[3]);
+     draw bpath($[3]) dashed evenly;
+   endfor
+   % Draw the implementation files.
+   forsuffixes $=lMapper, dMapper, contMapper, biMapper, unifMapper:
+     drawunboxed($[4]);
+   endfor
+ endfig;
+ 
+ 
+ %% Draw the UniformGridLayout class.
+ %% Abbreviate: GL = GuardLayers, RT = ReplicatedTag, DT = DistributedTag
+ beginfig(20)
+   %% Create the boxes.
+   % UniformGridLayout
+   boxit.UGL[0](btex \classname{UniformGridLayout} etex);
+   boxit.UGL[1](btex etex);
+   boxit.UGL[2](
+     btex
+     \begin{lists}
+     UniformGridLayout() \\
+     UniformGridLayout(const Interval\&, const DT\&) \\
+     UniformGridLayout(const Interval\&, const GL\&, const DT\&) \\
+     UniformGridLayout(const Interval\&, const Loc\&, const DT\&) \\
+     UniformGridLayout(const Interval\&, const Loc\&, const GL\&, const DT\&) \\
+     UniformGridLayout(const Iv\&,const Loc\&,const GL\&,const GL\&,const DT\&) \\
+     UniformGridLayout(const Interval\&, const RT\&) \\
+     UniformGridLayout(const Interval\&, const GL\&, const RT\&) \\
+     UniformGridLayout(const Interval\&, const Loc\&, const RT\&) \\
+     UniformGridLayout(const Interval\&, const Loc\&, const GL\&, const RT\&) \\
+     UniformGridLayout(const Iv\&,const Loc\&,const GL\&,const GL\&,const RT\&) \\
+     UniformGridLayout(const Interval\&, const Partitioner\&, const CM\&) \\
+     UniformGridLayout(const Interval\&, const Partitioner\&, const DT\&) \\
+     UniformGridLayout(const Interval\&, const Partitioner\&, const RT\&) \\
+     UniformGridLayout(const UniformGridLayout\&) \\
+     UniformGridLayout\& operator=(const UniformGridLayout\&) \\
+     \tilder UniformGridLayout() \\
+     void initialize(const Interval\&, const DT\&) \\
+     void initialize(const Interval\&, const GL\&, const DT\&) \\
+     void initialize(const Interval\&, const Loc\&, const DT\&) \\
+     void initialize(const Interval\&, const Loc\&, const GL\&, const DT\&) \\
+     void initialize(const Iv\&,const Loc\&,const GL\&,const GL\&,const DT\&) \\
+     void initialize(const Interval\&, const RT\&) \\
+     void initialize(const Interval\&, const GL\&, const RT\&) \\
+     void initialize(const Interval\&, const Loc\&, const RT\&) \\
+     void initialize(const Interval\&, const Loc\&, const GL\&, const RT\&) \\
+     void initialize(const Iv\&,const Loc\&,const GL\&,const GL\&,const RT\&) \\
+     void initialize(const Interval\&, const Partitioner\&, const CM\&) \\
+     void initialize(const Interval\&, const Partitioner\&, const DT\&) \\
+     void initialize(const Interval\&, const Partitioner\&, const RT\&) \\
+     void initialize(const UniformGridLayout\&) \\
+     void initialize(const Iv\&,const List\_t\&,const Loc\&,bool,bool,\\
+       const GL\&,const GL\&) \\
+     void notify(Interval\&, const ObserverEvent\&) \\
+     void print(Ostream\&)
+     \end{lists} etex);
+   boxit.UGL[3](
+     btex
+     \begin{lists}
+     dim D
+     \end{lists} etex);
+   boxit.UGL[4](
+     btex \begin{files}
+     UniformGridLayout.h
+     \end{files} etex);
+   
+   %% Position the boxes.
+   % Position the template parameters.
+   forsuffixes $=UGL:
+     samewidth($[0],$[1],$[2]);
+     for t = 0 upto 1:
+       $.[t].se = $[t+1].ne;
+       $.[t].sw = $[t+1].nw;
+     endfor
+     fixsize($[0],$[1],$[2]);
+   endfor
+   forsuffixes $=UGL:
+     fixsize($[3]);
+     $[0].ne - $[3].sw  =
+     (min(0.5 xpart($[3].ne - $[3].sw), $[0].dx),
+       min(0.5 ypart($[3].ne - $[3].sw), $[0].dy));
+   endfor
+   % Position the implementation files boxes.
+   forsuffixes $=UGL:
+     fixsize($[4]);
+     $[2].s = $[4].nw;
+   endfor
+ 
+   % Position the UML classes.
+   UGL[0].c = origin;
+   
+   %% Draw the boxes.
+   % Draw the UML class boxes.
+   forsuffixes $=UGL:
+     for t = 0 upto 2:
+       drawboxed($[t]);
+     endfor
+   endfor
+   % Draw the template parameters.
+   forsuffixes $=UGL:
+     unfill bpath($[3]);
+     drawunboxed($[3]);
+     draw bpath($[3]) dashed evenly;
+   endfor
+   % Draw the implementation files.
+   forsuffixes $=UGL:
+     drawunboxed($[4]);
+   endfor
+ endfig;
+ 
+ 
+ %% Draw the SparseTileLayout class.
+ %% Abbreviate: GL = GuardLayers, RT = ReplicatedTag, DT = DistributedTag
+ beginfig(21)
+   %% Create the boxes.
+   % SparseTileLayout
+   boxit.STL[0](btex \classname{SparseTileLayout} etex);
+   boxit.STL[1](btex etex);
+   boxit.STL[2](
+     btex
+     \begin{lists}
+     SparseTileLayout() \\
+     SparseTileLayout(const Interval\&) \\
+     SparseTileLayout(const Interval\&, const GL\&) \\
+     SparseTileLayout(const Interval\&, const GL\&, const GL\&) \\
+     SparseTileLayout(Interval\&, const PatchList\_t\&, const RT\&) \\
+     SparseTileLayout(const Iv\&, const GL\&, const PatchList\_t\&, const RT\&) \\
+     SpTlLa(const Iv\&, const GL\&, const GL\&, const PatchList\_t\&, const RT\&) \\
+     SparseTileLayout(const Interval\&, const Partitioner\&, const RT\&) \\
+     SparseTileLayout(Interval\&, const PatchList\_t\&, const DT\&) \\
+     SparseTileLayout(const Iv\&, const GL\&, const PatchList\_t\&, const DT\&) \\
+     SpTlLa(const Iv\&, const GL\&, const GL\&, const PatchList\_t\&, const DT\&) \\
+     SparseTileLayout(const Interval\&, const Partitioner\&, const DT\&) \\
+     SparseTileLayout(const Interval\&, const Partitioner\&, const CM\&) \\
+     SparseTileLayout(const SparseTileLayout\&) \\
+     SparseTileLayout\& operator=(const SparseTileLayout\&) \\
+     \tilder SparseTileLayout() \\
+     void initialize(const Interval\&) \\
+     void initialize(const Interval\&, const GL\&) \\
+     void initialize(const Interval\&, const GL\&, const PatchList\_t\&) \\
+     void initialize(const Interval\&, const Partitioner\&) \\
+     BorderFillIterator\_t beginBorderFillList() \\
+     BorderFillIterator\_t endBorderFillList() \\
+     void notify(Interval\&, const ObserverEvent\&) \\
+     void print(Ostream\&)
+     \end{lists} etex);
+   boxit.STL[3](
+     btex
+     \begin{lists}
+     dim D
+     \end{lists} etex);
+   boxit.STL[4](
+     btex \begin{files}
+     SparseTileLayout.h
+     \end{files} etex);
+   
+   %% Position the boxes.
+   % Position the template parameters.
+   forsuffixes $=STL:
+     samewidth($[0],$[1],$[2]);
+     for t = 0 upto 1:
+       $.[t].se = $[t+1].ne;
+       $.[t].sw = $[t+1].nw;
+     endfor
+     fixsize($[0],$[1],$[2]);
+   endfor
+   forsuffixes $=STL:
+     fixsize($[3]);
+     $[0].ne - $[3].sw  =
+     (min(0.5 xpart($[3].ne - $[3].sw), $[0].dx),
+       min(0.5 ypart($[3].ne - $[3].sw), $[0].dy));
+   endfor
+   % Position the implementation files boxes.
+   forsuffixes $=STL:
+     fixsize($[4]);
+     $[2].s = $[4].nw;
+   endfor
+ 
+   % Position the UML classes.
+   STL[0].c = origin;
+   
+   %% Draw the boxes.
+   % Draw the UML class boxes.
+   forsuffixes $=STL:
+     for t = 0 upto 2:
+       drawboxed($[t]);
+     endfor
+   endfor
+   % Draw the template parameters.
+   forsuffixes $=STL:
+     unfill bpath($[3]);
+     drawunboxed($[3]);
+     draw bpath($[3]) dashed evenly;
+   endfor
+   % Draw the implementation files.
+   forsuffixes $=STL:
+     drawunboxed($[4]);
+   endfor
+ endfig;
+ 
+ 
+ %% Draw the DomainLayout class.
+ %% Abbreviate: GL = GuardLayers
+ beginfig(22)
+   %% Create the boxes.
+   % DomainLayout
+   boxit.DL[0](btex \classname{DomainLayout} etex);
+   boxit.DL[1](btex etex);
+   boxit.DL[2](
+     btex
+     \begin{lists}
+     DomainLayout() \\
+     DomainLayout(const Interval\&) \\
+     DomainLayout(const Interval\&, const GL\&) \\
+     DomainLayout(const Interval\&, const Node<Interval>\&) \\
+     DomainLayout(const DomainLayout\&) \\
+     \tilder DomainLayout() \\
+     void initialize(const Interval\&) \\
+     void initialize(const Interval\&, const GL\&) \\
+     void initialize(const DomainLayout\&) \\
+     \end{lists} etex);
+   boxit.DL[3](
+     btex
+     \begin{lists}
+     dim D
+     \end{lists} etex);
+   boxit.DL[4](
+     btex \begin{files}
+     DomainLayout.h
+     \end{files} etex);
+   
+   %% Position the boxes.
+   % Position the template parameters.
+   forsuffixes $=DL:
+     samewidth($[0],$[1],$[2]);
+     for t = 0 upto 1:
+       $.[t].se = $[t+1].ne;
+       $.[t].sw = $[t+1].nw;
+     endfor
+     fixsize($[0],$[1],$[2]);
+   endfor
+   forsuffixes $=DL:
+     fixsize($[3]);
+     $[0].ne - $[3].sw  =
+     (min(0.5 xpart($[3].ne - $[3].sw), $[0].dx),
+       min(0.5 ypart($[3].ne - $[3].sw), $[0].dy));
+   endfor
+   % Position the implementation files boxes.
+   forsuffixes $=DL:
+     fixsize($[4]);
+     $[2].s = $[4].nw;
+   endfor
+ 
+   % Position the UML classes.
+   DL[0].c = origin;
+   
+   %% Draw the boxes.
+   % Draw the UML class boxes.
+   forsuffixes $=DL:
+     for t = 0 upto 2:
+       drawboxed($[t]);
+     endfor
+   endfor
+   % Draw the template parameters.
+   forsuffixes $=DL:
+     unfill bpath($[3]);
+     drawunboxed($[3]);
+     draw bpath($[3]) dashed evenly;
+   endfor
+   % Draw the implementation files.
+   forsuffixes $=DL:
+     drawunboxed($[4]);
+   endfor
+ endfig;
+ 
+ 
+ %% Draw the DynamicLayout class.
+ %% Abbreviate: GL = GuardLayers
+ beginfig(23)
+   %% Create the boxes.
+   % DynamicLayout
+   boxit.DyL[0](btex \classname{DynamicLayout} etex);
+   boxit.DyL[1](btex etex);
+   boxit.DyL[2](
+     btex
+     \begin{lists}
+     DynamicLayout() \\
+     DynamicLayout(const Interval<1>\&) \\
+     DynamicLayout(const Interval<1>\&, int) \\
+     DynamicLayout(const Grid<1>\&) \\
+     DynamicLayout(const Interval<1>\&, const Partitioner\&) \\
+     DynamicLayout(const Interval<1>\&, const Partitioner\&, const CM<1>\&) \\
+     DynamicLayout(const DynamicLayout\&) \\
+     DynamicLayout\& operator=(const DynamicLayout\&) \\
+     \tilder DynamicLayout() \\
+     void initialize(const Interval<1>\&) \\
+     void initialize(const Interval<1>\&, const Grid<1>\&) \\
+     void initialize(const Grid<1>\&) \\
+     void initialize(const Interval<1>\&, const Partitioner\&) \\
+     void initialize(const Interval<1>\&, const Partitioner\&, const CM<1>\&) \\
+     void initialize(const Interval<1>\&, const List\_t\&) \\
+     void print(Ostream\&)
+     \end{lists} etex);
+   boxit.DyL[4](
+     btex \begin{files}
+     DynamicLayout.h
+     \end{files} etex);
+   
+   %% Position the boxes.
+   % Position the template parameters.
+   forsuffixes $=DyL:
+     samewidth($[0],$[1],$[2]);
+     for t = 0 upto 1:
+       $.[t].se = $[t+1].ne;
+       $.[t].sw = $[t+1].nw;
+     endfor
+     fixsize($[0],$[1],$[2]);
+   endfor
+   % Position the implementation files boxes.
+   forsuffixes $=DyL:
+     fixsize($[4]);
+     $[2].s = $[4].nw;
+   endfor
+ 
+   % Position the UML classes.
+   DyL[0].c = origin;
+   
+   %% Draw the boxes.
+   % Draw the UML class boxes.
+   forsuffixes $=DyL:
+     for t = 0 upto 2:
+       drawboxed($[t]);
+     endfor
+   endfor
+   % Draw the implementation files.
+   forsuffixes $=DyL:
+     drawunboxed($[4]);
+   endfor
+ endfig;
+ 
+ 
+ %% Draw the GridLayout class.
+ %% Abbreviate: GL = GuardLayers
+ beginfig(24)
+   %% Create the boxes.
+   % GridLayout
+   boxit.GrL[0](btex \classname{GridLayout} etex);
+   boxit.GrL[1](btex etex);
+   boxit.GrL[2](
+     btex
+     \begin{lists}
+     GridLayout() \\
+     GridLayout(const Interval\&, const DT\&) \\
+     GridLayout(const Interval\&, const GL\&, const DT\&) \\
+     GridLayout(const Interval\&, const Loc\&, const DT\&) \\
+     GridLayout(const Interval\&, const Loc\&, const GL\&, const DT\&) \\
+     GridLayout(const Iv\&, const Loc\&, const GL\&, const GL\&, const DT\&) \\
+     GridLayout(const Interval\&, const Partitioner\&, const DT\&) \\
+     GridLayout(const Grid\&, const DT\&) \\
+     GridLayout(const Grid\&, const GL\&, const DT\&) \\
+     GridLayout(const Grid\&, const GL\&, const GL\&, const DT\&) \\
+     GridLayout(const Interval\&, const RT\&) \\
+     GridLayout(const Interval\&, const GL\&, const RT\&) \\
+     GridLayout(const Interval\&, const Loc\&, const RT\&) \\
+     GridLayout(const Interval\&, const Loc\&, const GL\&, const RT\&) \\
+     GridLayout(const Iv\&, const Loc\&, const GL\&, const GL\&, const RT\&) \\
+     GridLayout(const Interval\&, const Partitioner\&, const RT\&) \\
+     GridLayout(const Grid\&, const RT\&) \\
+     GridLayout(const Grid\&, const GL\&, const RT\&) \\
+     GridLayout(const Grid\&, const GL\&, const GL\&, const RT\&) \\
+     GridLayout(const Interval\&, const Partitioner\&, const ContextMapper\&) \\
+     GridLayout(const GridLayout\&) \\
+     GridLayout\& operator=(const GridLayout\&) \\
+     \tilder GridLayout() \\
+     void initialize(const Interval\&, const DT\&) \\
+     void initialize(const Interval\&, const GL\&, const DT\&) \\
+     void initialize(const Interval\&, const Loc\&, const DT\&) \\
+     void initialize(const Interval\&, const Loc\&, const GL\&, const DT\&) \\
+     void initialize(const Iv\&,const Loc\&,const GL\&,const GL\&,const DT\&) \\
+     void initialize(const Interval\&, const Partitioner\&, const DT\&) \\
+     void initialize(const Grid\&, const DT\&) \\
+     void initialize(const Grid\&, const GL\&, const DT\&) \\
+     void initialize(const Grid\&, const GL\&, const GL\&, const DT\&) \\
+     void initialize(const Interval\&, const RT\&) \\
+     void initialize(const Interval\&, const GL\&, const RT\&) \\
+     void initialize(const Interval\&, const Loc\&, const RT\&) \\
+     void initialize(const Interval\&, const Loc\&, const GL\&, const RT\&) \\
+     void initialize(const Iv\&,const Loc\&,const GL\&,const GL\&,const RT\&) \\
+     void initialize(const Interval\&, const Partitioner\&, const RT\&) \\
+     void initialize(const Grid\&, const RT\&) \\
+     void initialize(const Grid\&, const GL\&, const RT\&) \\
+     void initialize(const Grid\&, const GL\&, const GL\&, const RT\&) \\
+     void initialize(const Interval\&, const Partitioner\&, const CM\&) \\
+     void initialize(const Iv\&,const List\_t\&,const Loc\&,bool,bool,\\
+       const GL\&,const GL\&) \\
+     void print(Ostream\&)
+     \end{lists} etex);
+   boxit.GrL[3](
+     btex
+     \begin{lists}
+     dim D
+     \end{lists} etex);
+   boxit.GrL[4](
+     btex \begin{files}
+     GridLayout.h
+     \end{files} etex);
+   
+   %% Position the boxes.
+   % Position the template parameters.
+   forsuffixes $=GrL:
+     samewidth($[0],$[1],$[2]);
+     for t = 0 upto 1:
+       $.[t].se = $[t+1].ne;
+       $.[t].sw = $[t+1].nw;
+     endfor
+     fixsize($[0],$[1],$[2]);
+   endfor
+   forsuffixes $=GrL:
+     fixsize($[3]);
+     $[0].ne - $[3].sw  =
+     (min(0.5 xpart($[3].ne - $[3].sw), $[0].dx),
+       min(0.5 ypart($[3].ne - $[3].sw), $[0].dy));
+   endfor
+   % Position the implementation files boxes.
+   forsuffixes $=GrL:
+     fixsize($[4]);
+     $[2].s = $[4].nw;
+   endfor
+ 
+   % Position the UML classes.
+   GrL[0].c = origin;
+   
+   %% Draw the boxes.
+   % Draw the UML class boxes.
+   forsuffixes $=GrL:
+     for t = 0 upto 2:
+       drawboxed($[t]);
+     endfor
+   endfor
+   % Draw the template parameters.
+   forsuffixes $=GrL:
+     unfill bpath($[3]);
+     drawunboxed($[3]);
+     draw bpath($[3]) dashed evenly;
+   endfor
+   % Draw the implementation files.
+   forsuffixes $=GrL:
+     drawunboxed($[4]);
+   endfor
+ endfig;
+ 
+ 
+ %% Draw the GuardLayers class.
+ %% Abbreviate: GL = GuardLayers
+ beginfig(30)
+   %% Create the boxes.
+   % GuardLayers
+   boxit.GL[0](btex \classname{GuardLayers} etex);
+   boxit.GL[1](btex etex);
+   boxit.GL[2](
+     btex
+     \begin{lists}
+     GuardLayers() \\
+     GuardLayers(int) \\
+     GuardLayers(int, int) \\
+     GuardLayers(const Loc\&, const Loc\&) \\
+     void initialize(const Loc\&, const Loc\&) \\
+     void initialize(const GuardLayers\&) \\
+     int lower(int) \\
+     int upper(int) \\
+     int\& lower(int) \\
+     int\& upper(int) \\
+     bool operator==(const GuardLayers\&) \\
+     bool operator==(int) \\
+     bool operator!=(const GuardLayers\&) \\
+     bool operator!=(int) \\
+     GuardLayers operator-(const GuardLayers\&) \\
+     GuardLayers operator-(int) \\
+     static void addGuardLayers(Interval\&, const GuardLayers\&) \\
+     Interval addGuardLayersToDomain(const Interval\&) \\
+     void print(Ostream\&)
+     \end{lists} etex);
+   boxit.GL[3](
+     btex
+     \begin{lists}
+     dim D
+     \end{lists} etex);
+   boxit.GL[4](
+     btex \begin{files}
+     GuardLayers.h
+     \end{files} etex);
+   
+   %% Position the boxes.
+   % Position the template parameters.
+   forsuffixes $=GL:
+     samewidth($[0],$[1],$[2]);
+     for t = 0 upto 1:
+       $.[t].se = $[t+1].ne;
+       $.[t].sw = $[t+1].nw;
+     endfor
+     fixsize($[0],$[1],$[2]);
+   endfor
+   forsuffixes $=GL:
+     fixsize($[3]);
+     $[0].ne - $[3].sw  =
+     (min(0.5 xpart($[3].ne - $[3].sw), $[0].dx),
+       min(0.5 ypart($[3].ne - $[3].sw), $[0].dy));
+   endfor
+   % Position the implementation files boxes.
+   forsuffixes $=GL:
+     fixsize($[4]);
+     $[2].s = $[4].nw;
+   endfor
+ 
+   % Position the UML classes.
+   GL[0].c = origin;
+   
+   %% Draw the boxes.
+   % Draw the UML class boxes.
+   forsuffixes $=GL:
+     for t = 0 upto 2:
+       drawboxed($[t]);
+     endfor
+   endfor
+   % Draw the template parameters.
+   forsuffixes $=GL:
+     unfill bpath($[3]);
+     drawunboxed($[3]);
+     draw bpath($[3]) dashed evenly;
+   endfor
+   % Draw the implementation files.
+   forsuffixes $=GL:
+     drawunboxed($[4]);
+   endfor
+ endfig;
+ 
+ 
+ bye
Index: figures/domain-uml-1.png
===================================================================
RCS file: /home/pooma/Repository/r2/docs/manual/figures/domain-uml-1.png,v
retrieving revision 1.1
diff -c -p -r1.1 domain-uml-1.png
Binary files /tmp/cvshUnqvW and domain-uml-1.png differ
Index: figures/domain-uml.mp
===================================================================
RCS file: /home/pooma/Repository/r2/docs/manual/figures/domain-uml.mp,v
retrieving revision 1.1
diff -c -p -r1.1 domain-uml.mp
*** figures/domain-uml.mp	2002/02/27 03:51:54	1.1
--- figures/domain-uml.mp	2002/03/04 22:51:06
*************** beginfig(1)
*** 145,151 ****
    boxit.grid[4](
      btex \begin{files}
      Grid.h \\
!     DomainTraits.Grid.h
      \end{files} etex);
    
    % Grid<1>
--- 145,152 ----
    boxit.grid[4](
      btex \begin{files}
      Grid.h \\
!     Domain-\\
!     Traits.Grid.h
      \end{files} etex);
    
    % Grid<1>
*************** beginfig(1)
*** 222,228 ****
      draw $[0].n -- ($[0].n+(0,foo));
    endfor
    draw loc[0].n+(0,foo) -- grid[0].n+(0,foo);
!   z0 = domain[2].s - (0,discriminatorScale);
    draw z0 -- (x0, ypart(loc[0].n+(0,foo)));
      
  endfig;
--- 223,229 ----
      draw $[0].n -- ($[0].n+(0,foo));
    endfor
    draw loc[0].n+(0,foo) -- grid[0].n+(0,foo);
!   z0 = domain[2].s - (0,discriminatorLength);
    draw z0 -- (x0, ypart(loc[0].n+(0,foo)));
      
  endfig;
Index: figures/engine-uml-1.png
===================================================================
RCS file: /home/pooma/Repository/r2/docs/manual/figures/engine-uml-1.png,v
retrieving revision 1.1
diff -c -p -r1.1 engine-uml-1.png
Binary files /tmp/cvs5QiAX4 and engine-uml-1.png differ
Index: figures/engine-uml.mp
===================================================================
RCS file: /home/pooma/Repository/r2/docs/manual/figures/engine-uml.mp,v
retrieving revision 1.1
diff -c -p -r1.1 engine-uml.mp
*** figures/engine-uml.mp	2002/02/27 03:51:54	1.1
--- figures/engine-uml.mp	2002/03/04 22:51:09
*************** beginfig(1)
*** 72,78 ****
    taggedEngineTemplates =
    btex \begin{lists}
      dim D \\
!     val type T
      \end{lists} etex;
      
    boxit.brick[3](taggedEngineTemplates);
--- 72,78 ----
    taggedEngineTemplates =
    btex \begin{lists}
      dim D \\
!     value type T
      \end{lists} etex;
      
    boxit.brick[3](taggedEngineTemplates);
*************** beginfig(1)
*** 120,126 ****
      \end{lists} etex);
    boxit.dynamic[3](
      btex \begin{lists}
!     val type T
      \end{lists} etex);
    boxit.dynamic[4](
      btex \begin{files}
--- 120,126 ----
      \end{lists} etex);
    boxit.dynamic[3](
      btex \begin{lists}
!     value type T
      \end{lists} etex);
    boxit.dynamic[4](
      btex \begin{files}
*************** beginfig(1)
*** 147,155 ****
    boxit.multipatch[3](
      btex \begin{lists}
      dim D \\
!     val type T \\
!     layout LT \\
!     patch PT
      \end{lists} etex);
    boxit.multipatch[4](
      btex \begin{files}
--- 147,155 ----
    boxit.multipatch[3](
      btex \begin{lists}
      dim D \\
!     value type T \\
!     layout tag LT \\
!     patch tag PT
      \end{lists} etex);
    boxit.multipatch[4](
      btex \begin{files}
*************** beginfig(1)
*** 238,260 ****
    endfor
  
    % Position the UML classes.
!   engine[0].c = origin;
!   xpart(brick[0].w) = xpart(dynamic[0].w);
!   xpart(compressiblebrick[3].e) = xpart(multipatch[3].e);
!   ypart(brick[0].n - compressiblebrick[0].n) = 0;
!   ypart(dynamic[0].n - multipatch[0].n) = 0;
!   ypart(compressiblebrick[0].s - multipatch[3].n) = 
!   ypart(remote[0].s - remotedynamic[3].n) =
!   ypart(dynamic[0].s - remote[3].n) = yUnit;
!   numeric leftColumn;
!   leftColumn = max(xpart(brick[3].e),xpart(dynamic[3].e));
!   numeric rightColumn;
!   rightColumn = min(xpart(compressiblebrick[0].w),xpart(multipatch[0].w));
!   rightColumn - leftColumn = xUnit;
!   xpart(remote[0].n) = xpart(remotedynamic[0].n) = 0.5[leftColumn,rightColumn];
!   xpart(engine[2].s) = 0.5[leftColumn,rightColumn];
!   ypart(engine[2].s) = yUnit + max(ypart(brick[3].n),ypart(compressiblebrick[3].n));
!   
    %% Draw the boxes.
    % Draw the UML class boxes.
    forsuffixes $=engine:
--- 238,260 ----
    endfor
  
    % Position the UML classes.
!   numeric vertSep; vertSep = 0.4yUnit;
!   xpart(brick[0].sw - compressiblebrick[0].nw) = 0;
!   ypart(brick[0].sw - compressiblebrick[3].nw) = vertSep;
!   xpart(compressiblebrick[0].sw - dynamic[0].nw) = 0;
!   ypart(compressiblebrick[0].sw - dynamic[3].nw) = vertSep;
!   xpart(dynamic[0].sw - multipatch[0].nw) = 0;
!   ypart(dynamic[0].sw - multipatch[3].nw) = vertSep;
!   xpart(multipatch[0].sw - remote[0].nw) = 0;
!   ypart(multipatch[0].sw - remote[3].nw) = vertSep;
!   xpart(remote[0].sw - remotedynamic[0].nw) = 0;
!   ypart(remote[0].sw - remotedynamic[3].nw) = vertSep;
!   y0 = ypart(brick[3].n);
!   x0 = xUnit + max(xpart(brick[3].e), xpart(compressiblebrick[3].e),
!     xpart(dynamic[3].e), xpart(multipatch[3].e),
!     xpart(remote[3].e), xpart(remotedynamic[3].e));
!   engine[2].se = z0;
! 
    %% Draw the boxes.
    % Draw the UML class boxes.
    forsuffixes $=engine:
*************** beginfig(1)
*** 279,295 ****
    endfor
  
    % Draw arrows between classes.
    drawarrow (xpart(remote[0].s), ypart(remotedynamic[0].n)) -- remote[0].s dashed evenly;
-   numeric middleColumn; middleColumn = 0.5[leftColumn,rightColumn];
-   drawarrow multipatch[0].w -- (middleColumn,ypart(multipatch[0].w)) dashed evenly;
-   drawarrow dynamic[0].e -- (middleColumn, ypart(dynamic[0].e)) dashed evenly;
-   drawarrow compressiblebrick[0].w -- (middleColumn,ypart(compressiblebrick[0].w)) dashed evenly;
-   drawarrow brick[0].e -- (middleColumn, ypart(brick[0].e)) dashed evenly;
-   draw compressiblebrick[0].w -- brick[0].e dashed evenly;
-   drawarrow (middleColumn,ypart(multipatch[0].w)) -- engine[2].s
-   dashed evenly;
-   draw remote[0].n .. (middleColumn,ypart(multipatch[0].w)) dashed evenly;
- 
  endfig;
  
  
--- 279,289 ----
    endfor
  
    % Draw arrows between classes.
+   forsuffixes $=brick, compressiblebrick, dynamic, multipatch, remote:
+     draw $[0].e -- (x0, ypart($[0].e)) dashed evenly;
+   endfor
+   drawarrow (x0, ypart(remote[0].e)) -- z0 dashed evenly;
    drawarrow (xpart(remote[0].s), ypart(remotedynamic[0].n)) -- remote[0].s dashed evenly;
  endfig;
  
  
Index: figures/explanation-uml-1.png
===================================================================
RCS file: /home/pooma/Repository/r2/docs/manual/figures/explanation-uml-1.png,v
retrieving revision 1.1
diff -c -p -r1.1 explanation-uml-1.png
Binary files /tmp/cvsxE8ome and explanation-uml-1.png differ
Index: figures/explanation-uml.mp
===================================================================
RCS file: /home/pooma/Repository/r2/docs/manual/figures/explanation-uml.mp,v
retrieving revision 1.1
diff -c -p -r1.1 explanation-uml.mp
*** figures/explanation-uml.mp	2002/02/27 03:51:54	1.1
--- figures/explanation-uml.mp	2002/03/04 22:51:09
*************** beginfig(1)
*** 79,85 ****
    % Loc
    boxit.loc[0](btex \classname{Classname2} etex);
    boxit.loc[1](btex \emptyBox{Interval<1>} etex);
!   boxit.loc[2](btex etex);
    boxit.loc[3](
      btex \begin{lists}
      template parameter T
--- 79,88 ----
    % Loc
    boxit.loc[0](btex \classname{Classname2} etex);
    boxit.loc[1](btex \emptyBox{Interval<1>} etex);
!   boxit.loc[2](
!     btex \begin{lists}
!     void foo(const X[1-3]\&)
!     \end{lists} etex);
    boxit.loc[3](
      btex \begin{lists}
      template parameter T
*************** beginfig(1)
*** 220,226 ****
    forsuffixes $=loc:
      draw $[0].n -- ($[0].n+(0,foo));
    endfor
!   z0 = domain[2].s - (0,discriminatorScale);
    draw z0 -- (x0, ypart(loc[0].n+(0,foo)));
  
    % Add explanatory labels.
--- 223,229 ----
    forsuffixes $=loc:
      draw $[0].n -- ($[0].n+(0,foo));
    endfor
!   z0 = domain[2].s - (0,discriminatorLength);
    draw z0 -- (x0, ypart(loc[0].n+(0,foo)));
  
    % Add explanatory labels.
*************** beginfig(1)
*** 228,237 ****
      domain[1].e);
    label.rt(btex Public member functions, if any, are listed here. etex,
      domain[2].e);
!   label.rt(btex This class adds no new public member functions. etex,
      loc[2].e);
!   label.lrt(btex Template parameters are listed in dashed boxes. etex,
!     0.4[loc[3].sw,loc[3].s]);
    label.rt(btex Files implementing the class etex, loc[4].e);
    label.rt(btex A dashed arrow indicates an instantiated class. etex,
      0.7[loc[2].s,locOne[0].n]);
--- 231,240 ----
      domain[1].e);
    label.rt(btex Public member functions, if any, are listed here. etex,
      domain[2].e);
!   label.rt(btex This class adds one new public member function. etex,
      loc[2].e);
!   label.lrt(btex Template parameters occur in dashed boxes. etex,
!     0.8[loc[3].sw,loc[3].s]);
    label.rt(btex Files implementing the class etex, loc[4].e);
    label.rt(btex A dashed arrow indicates an instantiated class. etex,
      0.7[loc[2].s,locOne[0].n]);
Index: figures/field-uml-1.png
===================================================================
RCS file: field-uml-1.png
diff -N field-uml-1.png
Binary files /dev/null and field-uml-1.png differ
Index: figures/field-uml-10.png
===================================================================
RCS file: field-uml-10.png
diff -N field-uml-10.png
Binary files /dev/null and field-uml-10.png differ
Index: figures/field-uml-11.png
===================================================================
RCS file: field-uml-11.png
diff -N field-uml-11.png
Binary files /dev/null and field-uml-11.png differ
Index: figures/field-uml-2.png
===================================================================
RCS file: field-uml-2.png
diff -N field-uml-2.png
Binary files /dev/null and field-uml-2.png differ
Index: figures/field-uml-3.png
===================================================================
RCS file: field-uml-3.png
diff -N field-uml-3.png
Binary files /dev/null and field-uml-3.png differ
Index: figures/field-uml.mp
===================================================================
RCS file: field-uml.mp
diff -N field-uml.mp
*** /dev/null	Fri Mar 23 21:37:44 2001
--- field-uml.mp	Mon Mar  4 15:51:12 2002
***************
*** 0 ****
--- 1,570 ----
+ %% Oldham, Jeffrey D.
+ %% 2002Feb28
+ %% POOMA
+ 
+ %% UML Diagrams of Field Classes
+ 
+ 
+ %% Assumes TEX=latex.
+ 
+ %% Ensure fonts are included in the output.
+ prologues := 2;			% >= 2 for PostScript
+ 
+ input boxes;
+ input box-macros;
+ input uml;
+ 
+ verbatimtex
+ \documentclass[10pt]{article}
+ \usepackage{amsmath}
+ \input{macros.ltx}
+ \usepackage{times}
+ \usepackage{mathptm}
+ \newlength{\cnw}	% Required to use \classnameWidth and \emptyBox
+ \begin{document}
+ etex
+ 
+ 
+ %% Draw the NoMesh box.
+ beginfig(1)
+   %% Create the boxes.
+   % NoMesh
+   boxit.nomesh[0](btex \classname{NoMesh} etex);
+   boxit.nomesh[1](btex etex);
+   boxit.nomesh[2](
+     btex
+     \begin{lists}
+     NoMesh() \\
+     NoMesh(const Layout\&) \\
+     NoMesh(const NoMesh\&) \\
+     NoMesh(const NoMesh\&, const Interval\&) \\
+     NoMesh(const NoMesh\&, const INode\&) \\
+     NoMesh(const NoMesh\&, const FieldEnginePatch\&) \\
+     NoMesh(const Mesh\&, const Dom\&) \\
+     NoMesh\& operator=(const NoMesh\&) \\
+     \tilder NoMesh() \\
+     Interval\& physicalVertexDomain() \\
+     Interval\& physicalCellDomain() \\
+     Interval\& totalVertexDomain() \\
+     Interval\& totalCellDomain()
+     \end{lists} etex);
+   boxit.nomesh[3](
+     btex
+     \begin{lists}
+     dimension D
+     \end{lists} etex);
+   boxit.nomesh[4](
+     btex \begin{files}
+     NoMesh.h
+     \end{files} etex);
+ 
+   %% Position the boxes.
+   % Position the template parameters.
+   forsuffixes $=nomesh:
+     samewidth($[0],$[1],$[2]);
+     for t = 0 upto 1:
+       $.[t].se = $[t+1].ne;
+       $.[t].sw = $[t+1].nw;
+     endfor
+     fixsize($[0],$[1],$[2]);
+   endfor
+   forsuffixes $=nomesh:
+     fixsize($[3]);
+     $[0].ne - $[3].sw  =
+     (min(0.5 xpart($[3].ne - $[3].sw), $[0].dx),
+       min(0.5 ypart($[3].ne - $[3].sw), $[0].dy));
+   endfor
+   % Position the implementation files boxes.
+   forsuffixes $=nomesh:
+     fixsize($[4]);
+     $[2].s = $[4].nw;
+   endfor
+ 
+   % Position the UML classes.
+   nomesh[0].c = origin;
+   
+   %% Draw the boxes.
+   % Draw the UML class boxes.
+   forsuffixes $=nomesh:
+     for t = 0 upto 2:
+       drawboxed($[t]);
+     endfor
+   endfor
+   % Draw the template parameters.
+   forsuffixes $=nomesh:
+     unfill bpath($[3]);
+     drawunboxed($[3]);
+     draw bpath($[3]) dashed evenly;
+   endfor
+   % Draw the implementation files.
+   forsuffixes $=nomesh:
+     drawunboxed($[4]);
+   endfor
+ endfig;
+ 
+ 
+ %% Draw the UniformRectilinearMesh box.
+ beginfig(2)
+   %% Create the boxes.
+   % UniformRectilinearMesh
+   boxit.urm[0](btex \classname{UniformRectilinearMesh} etex);
+   boxit.urm[1](btex etex);
+   boxit.urm[2](
+     btex
+     \begin{lists}
+     UniformRectilinearMesh() \\
+     UniformRectilinearMesh(const Layout\&) \\
+     UniformRectilinearMesh(const Layout\&, const Vector\&, const Vector\&) \\
+     UniformRectilinearMesh(const UniformRectilinearMesh\&) \\
+     UniformRectilinearMesh(const URM\&, const Interval\&) \\
+     UniformRectilinearMesh(const UniformRectilinearMesh\&, const INode\&) \\
+     UniformRectilinearMesh(const URM\&, const FieldEnginePatch\&) \\
+     UniformRectilinearMesh(const Mesh\&, const Dom\&) \\
+     UniformRectilinearMesh\& operator=(const UniformRectilinearMesh\&) \\
+     \tilder UniformRectilinearMesh() \\
+     const Interval\& physicalVertexDomain() \\
+     const Interval\& physicalCellDomain() \\
+     const Interval\& totalVertexDomain() \\
+     const Interval\& totalCellDomain() \\
+     const Vector\& spacings() \\
+     const Vector\& origin() \\
+     const Vector\& cellContaining(const Vector\&) \\
+     const Vector\& vertexPosition(const Loc\&) \\
+     void initializePositions(Engine\&, const Centering\&) \\
+     void initializeNormals(Engine\&, const Centering\&) \\
+     void initializeNormals(Engine\&, const Centering\&, bool) \\
+     void initializeCellVolumes(Engine\&, const Centering\&) \\
+     void initializeFaceAreas(Engine\&, const Centering\&) \\
+     void initializeEdgeLengths(Engine\&, const Centering\&)
+     \end{lists} etex);
+   boxit.urm[3](
+     btex
+     \begin{lists}
+     dim D \\
+     value T
+     \end{lists} etex);
+   boxit.urm[4](
+     btex \begin{files}
+     UniformRectilinearMesh.h
+     \end{files} etex);
+ 
+   %% Position the boxes.
+   % Position the template parameters.
+   forsuffixes $=urm:
+     samewidth($[0],$[1],$[2]);
+     for t = 0 upto 1:
+       $.[t].se = $[t+1].ne;
+       $.[t].sw = $[t+1].nw;
+     endfor
+     fixsize($[0],$[1],$[2]);
+   endfor
+   forsuffixes $=urm:
+     fixsize($[3]);
+     $[0].ne - $[3].sw  =
+     (min(0.5 xpart($[3].ne - $[3].sw), $[0].dx),
+       min(0.5 ypart($[3].ne - $[3].sw), $[0].dy));
+   endfor
+   % Position the implementation files boxes.
+   forsuffixes $=urm:
+     fixsize($[4]);
+     $[2].s = $[4].nw;
+   endfor
+ 
+   % Position the UML classes.
+   urm[0].c = origin;
+   
+   %% Draw the boxes.
+   % Draw the UML class boxes.
+   forsuffixes $=urm:
+     for t = 0 upto 2:
+       drawboxed($[t]);
+     endfor
+   endfor
+   % Draw the template parameters.
+   forsuffixes $=urm:
+     unfill bpath($[3]);
+     drawunboxed($[3]);
+     draw bpath($[3]) dashed evenly;
+   endfor
+   % Draw the implementation files.
+   forsuffixes $=urm:
+     drawunboxed($[4]);
+   endfor
+ endfig;
+ 
+ 
+ %% Draw the conceptual Mesh box.
+ beginfig(3)
+   %% Create the boxes.
+   % Mesh
+   boxit.mesh[0](btex \classname{\emph{Mesh}} etex);
+   boxit.mesh[1](btex etex);
+   boxit.mesh[2](
+     btex
+     \begin{lists}
+     Mesh() \\
+     Mesh(const Layout\&) \\
+     Mesh(const Mesh\&) \\
+     Mesh(const Mesh\&, const Dom\&) \\
+     Mesh\& operator=(const Mesh\&) \\
+     \tilder Mesh() \\
+     Interval\& physicalVertexDomain() \\
+     Interval\& physicalCellDomain() \\
+     Interval\& totalVertexDomain() \\
+     Interval\& totalCellDomain()
+     \end{lists} etex);
+   boxit.mesh[3](
+     btex
+     \begin{lists}
+     dimension D
+     \end{lists} etex);
+   boxit.mesh[4](btex etex);
+ 
+   % NoMesh
+   boxit.nomesh[0](btex \classname{NoMesh} etex);
+   boxit.nomesh[1](btex etex);
+   boxit.nomesh[2](
+     btex
+     \begin{lists}
+     NoMesh() \\
+     NoMesh(const Layout\&) \\
+     NoMesh(const NoMesh\&) \\
+     NoMesh(const NoMesh\&, const Interval\&) \\
+     NoMesh(const NoMesh\&, const INode\&) \\
+     NoMesh(const NoMesh\&, const FieldEnginePatch\&) \\
+     NoMesh(const Mesh\&, const Dom\&) \\
+     NoMesh\& operator=(const NoMesh\&) \\
+     \tilder NoMesh() \\
+     Interval\& physicalVertexDomain() \\
+     Interval\& physicalCellDomain() \\
+     Interval\& totalVertexDomain() \\
+     Interval\& totalCellDomain()
+     \end{lists} etex);
+   boxit.nomesh[3](
+     btex
+     \begin{lists}
+     dimension D
+     \end{lists} etex);
+   boxit.nomesh[4](
+     btex \begin{files}
+     NoMesh.h
+     \end{files} etex);
+ 
+   % UniformRectilinearMesh
+   boxit.urm[0](btex \classname{UniformRectilinearMesh} etex);
+   boxit.urm[1](btex etex);
+   boxit.urm[2](
+     btex
+     \begin{lists}
+     UniformRectilinearMesh() \\
+     UniformRectilinearMesh(const Layout\&) \\
+     UniformRectilinearMesh(const Layout\&, const Vector\&, const Vector\&) \\
+     UniformRectilinearMesh(const UniformRectilinearMesh\&) \\
+     UniformRectilinearMesh(const UniformRectilinearMesh\&, const Interval\&) \\
+     UniformRectilinearMesh(const UniformRectilinearMesh\&, const INode\&) \\
+     UniformRectilinearMesh(const UniformRectilinearMesh\&, const FieldEnginePatch\&) \\
+     UniformRectilinearMesh(const Mesh\&, const Dom\&) \\
+     UniformRectilinearMesh\& operator=(const UniformRectilinearMesh\&) \\
+     \tilder UniformRectilinearMesh() \\
+     const Interval\& physicalVertexDomain() \\
+     const Interval\& physicalCellDomain() \\
+     const Interval\& totalVertexDomain() \\
+     const Interval\& totalCellDomain() \\
+     const Vector\& spacings() \\
+     const Vector\& origin() \\
+     const Vector\& cellContaining(const Vector\&) \\
+     const Vector\& vertexPosition(const Loc\&) \\
+     void initializePositions(Engine\&, const Centering\&) \\
+     void initializeNormals(Engine\&, const Centering\&) \\
+     void initializeNormals(Engine\&, const Centering\&, bool) \\
+     void initializeCellVolumes(Engine\&, const Centering\&) \\
+     void initializeFaceAreas(Engine\&, const Centering\&) \\
+     void initializeEdgeLengths(Engine\&, const Centering\&)
+     \end{lists} etex);
+   boxit.urm[3](
+     btex
+     \begin{lists}
+     dimension D \\
+     value type T
+     \end{lists} etex);
+   boxit.urm[4](
+     btex \begin{files}
+     UniformRectilinearMesh.h
+     \end{files} etex);
+ 
+   %% Position the boxes.
+   % Position the template parameters.
+   forsuffixes $=mesh:
+     samewidth($[0],$[1],$[2]);
+     for t = 0 upto 1:
+       $.[t].se = $[t+1].ne;
+       $.[t].sw = $[t+1].nw;
+     endfor
+     fixsize($[0],$[1],$[2]);
+   endfor
+   forsuffixes $=nomesh, urm:
+     fixsize($[0]);
+   endfor
+   forsuffixes $=mesh, nomesh, urm:
+     fixsize($[3]);
+     $[0].ne - $[3].sw  =
+     (min(0.5 xpart($[3].ne - $[3].sw), $[0].dx),
+       min(0.5 ypart($[3].ne - $[3].sw), $[0].dy));
+   endfor
+ 
+   % Position the UML classes.
+   nomesh[0].sw - urm[0].nw = (0, yUnit);
+   mesh[2].s - nomesh[0].nw = (0,yUnit);
+ 
+ %% Draw the boxes.
+   % Draw the UML class boxes.
+   forsuffixes $=mesh:
+     for t = 0 upto 2:
+       drawboxed($[t]);
+     endfor
+   endfor
+   forsuffixes $=nomesh, urm:
+     for t = 0 upto 0:
+       drawboxed($[t]);
+     endfor
+   endfor
+   % Draw the template parameters.
+   forsuffixes $=mesh, nomesh, urm:
+     unfill bpath($[3]);
+     drawunboxed($[3]);
+     draw bpath($[3]) dashed evenly;
+   endfor
+   %% Draw the realization lines.
+   z0 = 0.2[mesh[2].sw,mesh[2].se];
+   drawDiscriminator(z0, 0);
+   forsuffixes $=nomesh, urm:
+     draw $[0].w -- (x0,ypart($[0].w)) dashed evenly;
+   endfor
+   draw (x0,ypart(urm[0].w)) -- (z0 - (0,discriminatorLength)) dashed evenly;
+   
+ %% HERE  
+ 
+ endfig;
+ 
+ 
+ %% Draw the Field box.
+ beginfig(10)
+   %% Create the boxes.
+   % Field
+   boxit.field[0](btex \classname{Field} etex);
+   boxit.field[1](btex etex);
+   boxit.field[2](
+     btex
+     \begin{lists}
+     Field() \\
+     Field(const X\&) \\
+     Field(const Centering\&, const Layout\&, const M\&) \\
+     Field(int, const Centering\&, const Layout\&, const M\&)\\
+     Field(const Centering\&, const Layout\&, const X1\&, const X2\&)\\
+     Field(const Centering\&, const Layout\&) \\
+     Field(int, const Centering\&, const Layout\&, const X1\&, const X2\&) \\
+     Field(const Field\&) \\
+     void initialize(const Centering\&, const Layout\&, const M\&) \\
+     void initialize(int, const Centering\&, const Layout\&, const M\&)\\
+     void initialize(const Centering\&, const Layout\&) \\
+     void initialize(const Field\&) \\
+     \tilder Field() \\
+     const Engine\& engine() \\
+     Engine\& engine() \\
+     const FieldEngine\& fieldEngine() \\
+     FieldEngine\& fieldEngine() \\
+     int numSubFields() \\
+     const Centering\& centering() \\
+     const Centering centering(int) \\
+     int centeringSize() \\
+     int numMaterials() \\
+     const Domain physicalCellDomain() \\
+     Domain totalCellDomain() \\
+     Domain physicalDomain(int) \\
+     Domain totalDomain(int) \\
+     Domain physicalDomain() \\
+     Domain totalDomain() \\
+     Domain domain() \\
+     const Mesh\& mesh() \\
+     Layout layout() \\
+     Field\& operator=(const Field\&) \\
+     const Field\& operator=(const Field\&) \\
+     const Field\& operator=(const X\&) \\
+     const Field\& operator+=(const X\&) \\
+     const Field\& operator-=(const X\&) \\
+     const Field\& operator*=(const X\&) \\
+     const Field\& operator/=(const X\&) \\
+     const Field\& operator\%=(const X\&) \\
+     const Field\& operator|=(const X\&) \\
+     const Field\& operator\&=(const X\&) \\
+     const Field\& operator\^=(const X\&) \\
+     const Field\& operator<<=(const X\&) \\
+     const Field\& operator>>=(const X\&) \\
+     void addRelation(RelationListItem*) \\
+     void removeRelations() \\
+     void applyRelations() \\
+     void applyRelations(bool) \\
+     void setDirty() \\
+     void clearDirty()
+     \end{lists} etex);
+   boxit.field[3](
+     btex
+     \begin{lists}
+     mesh M \\
+     value type T \\
+     engine type E
+     \end{lists} etex);
+   boxit.field[4](
+     btex \begin{files}
+     Field.h \\
+     PrintField.h
+     \end{files} etex);
+ 
+   %% Position the boxes.
+   % Position the template parameters.
+   forsuffixes $=field:
+     samewidth($[0],$[1],$[2]);
+     for t = 0 upto 1:
+       $.[t].se = $[t+1].ne;
+       $.[t].sw = $[t+1].nw;
+     endfor
+     fixsize($[0],$[1],$[2]);
+   endfor
+   forsuffixes $=field:
+     fixsize($[3]);
+     $[0].ne - $[3].sw  =
+     (min(0.5 xpart($[3].ne - $[3].sw), $[0].dx),
+       min(0.5 ypart($[3].ne - $[3].sw), $[0].dy));
+   endfor
+   % Position the implementation files boxes.
+   forsuffixes $=field:
+     fixsize($[4]);
+     $[2].s = $[4].nw;
+   endfor
+ 
+   % Position the UML classes.
+   field[0].c = origin;
+   
+   %% Draw the boxes.
+   % Draw the UML class boxes.
+   forsuffixes $=field:
+     for t = 0 upto 2:
+       drawboxed($[t]);
+     endfor
+   endfor
+   % Draw the template parameters.
+   forsuffixes $=field:
+     unfill bpath($[3]);
+     drawunboxed($[3]);
+     draw bpath($[3]) dashed evenly;
+   endfor
+   % Draw the implementation files.
+   forsuffixes $=field:
+     drawunboxed($[4]);
+   endfor
+ endfig;
+ 
+ 
+ %% Draw the Centering box.
+ beginfig(11)
+   %% Create the boxes.
+   % Centering
+   boxit.centering[0](btex \classname{Centering} etex);
+   boxit.centering[1](btex etex);
+   boxit.centering[2](
+     btex
+     \begin{lists}
+     Centering() \\
+     Centering(CenteringType) \\
+     Centering(CenteringType, ContinuityType) \\
+     Centering(CenteringType, ContinuityType,\\
+       const Orientations\&, const Positions\&) \\
+     \tilder Centering() \\
+     const CenteringType\&centeringType() \\
+     bool discontinuous() \\
+     bool continuous() \\
+     const Orientations\& orientations() \\
+     const Positions\& positions() \\
+     const Orientation\& orientation(int) \\
+     const Position\& position(int) \\
+     int size() \\
+     void addValue(const Orientation\&, const Position\&) \\
+     \end{lists} etex);
+   boxit.centering[3](
+     btex
+     \begin{lists}
+     dimension D
+     \end{lists} etex);
+   boxit.centering[4](
+     btex \begin{files}
+     FieldCentering.h
+     \end{files} etex);
+ 
+   % CanonicalCentering
+   boxit.ccentering[0](btex \classname{CanonicalCentering} etex);
+   boxit.ccentering[1](btex etex);
+   boxit.ccentering[2](
+     btex
+     \begin{lists}
+     CanonicalCentering() \\
+     \tilder CanonicalCentering() \\
+     Centering operator()(const CenteringType, ContinuityType) \\
+     Centering operator()(const CenteringType, ContinuityType, int) \\
+     \end{lists} etex);
+   boxit.ccentering[3](
+     btex
+     \begin{lists}
+     dimension D
+     \end{lists} etex);
+   boxit.ccentering[4](
+     btex \begin{files}
+     FieldCentering.h
+     \end{files} etex);
+ 
+   %% Position the boxes.
+   % Position the template parameters.
+   forsuffixes $=centering, ccentering:
+     samewidth($[0],$[1],$[2]);
+     for t = 0 upto 1:
+       $.[t].se = $[t+1].ne;
+       $.[t].sw = $[t+1].nw;
+     endfor
+     fixsize($[0],$[1],$[2]);
+   endfor
+   forsuffixes $=centering, ccentering:
+     fixsize($[3]);
+     $[0].ne - $[3].sw  =
+     (min(0.5 xpart($[3].ne - $[3].sw), $[0].dx),
+       min(0.5 ypart($[3].ne - $[3].sw), $[0].dy));
+   endfor
+   % Position the implementation files boxes.
+   forsuffixes $=centering, ccentering:
+     fixsize($[4]);
+     $[2].s = $[4].nw;
+   endfor
+ 
+   % Position the UML classes.
+   centering[0].c = origin;
+   centering[2].sw - ccentering[0].nw = (0,2yUnit);
+   
+   %% Draw the boxes.
+   % Draw the UML class boxes.
+   forsuffixes $=centering, ccentering:
+     for t = 0 upto 2:
+       drawboxed($[t]);
+     endfor
+   endfor
+   % Draw the template parameters.
+   forsuffixes $=centering, ccentering:
+     unfill bpath($[3]);
+     drawunboxed($[3]);
+     draw bpath($[3]) dashed evenly;
+   endfor
+   % Draw the implementation files.
+   forsuffixes $=centering, ccentering:
+     drawunboxed($[4]);
+   endfor
+ endfig;
+ 
+ 
+ bye
Index: figures/introduction.mp
===================================================================
RCS file: /home/pooma/Repository/r2/docs/manual/figures/introduction.mp,v
retrieving revision 1.5
diff -c -p -r1.5 introduction.mp
*** figures/introduction.mp	2002/01/31 21:29:58	1.5
--- figures/introduction.mp	2002/03/04 22:51:12
*************** beginfig(101)
*** 48,54 ****
    boxit.b8(btex etex);
    nuBoxes = 8;
    boxit.b9(btex \textsl{implementation} etex);
- %%TMP  sameWidthSameHeight(b3,b4,b5,b6,b7,b8);
    sameWidthSameHeight(b3,b6);
    sameWidthSameHeight(b4,b7);
    sameWidthSameHeight(b5,b8);
--- 48,53 ----
Index: figures/macros.ltx
===================================================================
RCS file: /home/pooma/Repository/r2/docs/manual/figures/macros.ltx,v
retrieving revision 1.5
diff -c -p -r1.5 macros.ltx
*** figures/macros.ltx	2002/02/27 03:51:54	1.5
--- figures/macros.ltx	2002/03/04 22:51:12
***************
*** 43,48 ****
--- 43,53 ----
  \newcommand{\avoidFi}{F\mbox{}i}%
  	% Avoid a problem with dvitomp and ligatures.
  
+ \newcommand{\tilder}{\ensuremath{\tilde{}}\,}%
+ 	% Produce a tilde.
+ 	% We use math mode to avoid the fact that ordinary times does
+ 	% not have a tilde.
+ 
  %% UML Macros.
  
  % Produce a class's name, presumbly at the top of a UML class box.
Index: figures/math-objs-uml-1.png
===================================================================
RCS file: math-objs-uml-1.png
diff -N math-objs-uml-1.png
Binary files /dev/null and math-objs-uml-1.png differ
Index: figures/math-objs-uml-10.png
===================================================================
RCS file: math-objs-uml-10.png
diff -N math-objs-uml-10.png
Binary files /dev/null and math-objs-uml-10.png differ
Index: figures/math-objs-uml-11.png
===================================================================
RCS file: math-objs-uml-11.png
diff -N math-objs-uml-11.png
Binary files /dev/null and math-objs-uml-11.png differ
Index: figures/math-objs-uml-2.png
===================================================================
RCS file: math-objs-uml-2.png
diff -N math-objs-uml-2.png
Binary files /dev/null and math-objs-uml-2.png differ
Index: figures/math-objs-uml-3.png
===================================================================
RCS file: math-objs-uml-3.png
diff -N math-objs-uml-3.png
Binary files /dev/null and math-objs-uml-3.png differ
Index: figures/math-objs-uml-4.png
===================================================================
RCS file: math-objs-uml-4.png
diff -N math-objs-uml-4.png
Binary files /dev/null and math-objs-uml-4.png differ
Index: figures/math-objs-uml.mp
===================================================================
RCS file: math-objs-uml.mp
diff -N math-objs-uml.mp
*** /dev/null	Fri Mar 23 21:37:44 2001
--- math-objs-uml.mp	Mon Mar  4 15:51:16 2002
***************
*** 0 ****
--- 1,1174 ----
+ %% Oldham, Jeffrey D.
+ %% 2002Feb27
+ %% POOMA
+ 
+ %% UML Diagrams for Vectors, Matrices, Tensors
+ 
+ 
+ %% Assumes TEX=latex.
+ 
+ %% Ensure fonts are included in the output.
+ prologues := 2;			% >= 2 for PostScript
+ 
+ input boxes;
+ input box-macros;
+ input uml;
+ 
+ verbatimtex
+ \documentclass[10pt]{article}
+ \usepackage{amsmath}
+ \input{macros.ltx}
+ \usepackage{times}
+ \usepackage{mathptm}
+ \newlength{\cnw}	% Required to use \classnameWidth and \emptyBox
+ \begin{document}
+ etex
+ 
+ 
+ %% Vectors and their engines
+ beginfig(1)
+   %% Create the boxes.
+   % Vector
+   boxit.vector[0](btex \classname{Vector} etex);
+   boxit.vector[1](btex etex);
+   boxit.vector[2](
+     btex \begin{lists}
+     Vector() \\
+     Vector(const Vector\&) \\
+     Vector(const X\&) \\
+     Vector(const X1\&,const X2\&) \\
+     Vector(const X1\&,const X2\&,const X3\&) \\
+     Vector(const X1\&,const X2\&,const X3\&,const X4\&) \\
+     \tilder Vector() \\
+     Vector\& operator=(const Vector\&) \\
+     Vector\& operator=(const X\&) \\
+     const T\& operator()(int) \\
+     T\& operator()(int) \\
+     const Engine\& engine() \\
+     Engine\& engine() \\
+     void print(Out\&)
+     \end{lists} etex);
+   boxit.vector[3](
+     btex
+     \begin{lists}
+     dimension D \\
+     value type T \\
+     engine type E
+     \end{lists} etex);
+   boxit.vector[4](
+     btex \begin{files}
+     Vector.h
+     \end{files} etex);
+   
+   % VectorEngine
+   boxit.vectorEngine[0](btex \classname{VectorEngine} etex);
+   boxit.vectorEngine[1](btex etex);
+   boxit.vectorEngine[2](btex etex);
+   boxit.vectorEngine[3](
+     btex
+     \begin{lists}
+     dimension D \\
+     value type T \\
+     engine type E
+     \end{lists} etex);
+   boxit.vectorEngine[4](
+     btex \begin{files}
+     VectorEngine.h
+     \end{files} etex);
+   
+   % VectorEngine<D,T,Full>
+   boxit.vectorEngineFull[0](btex \classname{VectorEngine<D,T,Full>} etex);
+   boxit.vectorEngineFull[1](btex etex);
+   boxit.vectorEngineFull[2](
+     btex \begin{lists}
+     VectorEngine() \\
+     VectorEngine(const VectorEngine\&) \\
+     VectorEngine(const X\&) \\
+     VectorEngine(const X1\&,const X2\&) \\
+     VectorEngine(const X1\&,const X2\&,const X3\&) \\
+     VectorEngine(const X1\&,const X2\&,const X3\&,const X4\&) \\
+     \tilder VectorEngine() \\
+     VectorEngine\& operator=(const VectorEngine\&) \\
+     VectorEngine\& operator=(const X\&) \\
+     const T\& operator()(int) \\
+     T\& operator()(int)
+     \end{lists} etex);
+   boxit.vectorEngineFull[3](
+     btex
+     \begin{lists}
+     dimension D \\
+     value type T
+     \end{lists} etex);
+   boxit.vectorEngineFull[4](
+     btex \begin{files}
+     Vector.h
+     \end{files} etex);
+   
+   %% Position the boxes.
+   % Position the boxes within the UML class diagrams.
+   forsuffixes $=vector, vectorEngine, vectorEngineFull:
+     samewidth($[0],$[1],$[2]);
+     for t = 0 upto 1:
+       $.[t].se = $[t+1].ne;
+       $.[t].sw = $[t+1].nw;
+     endfor
+     fixsize($[0],$[1],$[2]);
+   endfor
+   % Position the template parameters.
+   forsuffixes $=vector, vectorEngine, vectorEngineFull:
+     fixsize($[3]);
+     $[0].ne - $[3].sw  =
+     (min(0.5 xpart($[3].ne - $[3].sw), $[0].dx),
+       min(0.5 ypart($[3].ne - $[3].sw), $[0].dy));
+   endfor
+   % Position the implementation files boxes.
+   forsuffixes $=vector, vectorEngine, vectorEngineFull:
+     fixsize($[4]);
+     $[2].s = $[4].nw;
+   endfor
+   
+   % Position the UML classes.
+   vector[0].c = origin;
+   vector[2].s - vectorEngine[0].n = (0, 3yUnit);
+   vectorEngine[2].s - vectorEngineFull[0].n = (0, yUnit);
+   
+   %% Draw the boxes.
+   % Draw the UML class boxes.
+   forsuffixes $=vector, vectorEngine, vectorEngineFull:
+     for t = 0 upto 2:
+       drawboxed($[t]);
+     endfor
+   endfor
+   % Draw the template parameters.
+   forsuffixes $=vector, vectorEngine, vectorEngineFull:
+     unfill bpath($[3]);
+     drawunboxed($[3]);
+     draw bpath($[3]) dashed evenly;
+   endfor
+   % Draw the file names.
+   forsuffixes $=vector, vectorEngine, vectorEngineFull:
+     drawunboxed($[4]);
+   endfor
+   
+   % Draw arrows between classes.
+ 
+   % Draw lines between classes.
+   drawDiscriminator(vectorEngine[2].s, 0);
+   draw vectorEngineFull[0].n -- (vectorEngine[2].s-(0,discriminatorLength));
+ 
+ endfig;
+ 
+ 
+ %% Tensors and their engines
+ beginfig(2)
+   %% Create the boxes.
+   % Tensor
+   boxit.tensor[0](btex \classname{Tensor} etex);
+   boxit.tensor[1](btex etex);
+   boxit.tensor[2](
+     btex \begin{lists}
+     Tensor() \\
+     Tensor(const Tensor\&) \\
+     Tensor(const X1\&) \\
+     Tensor(const X[1-2]\&) \\
+     Tensor(const X[1-3]\&) \\
+     Tensor(const X[1-4]\&) \\
+     Tensor(const X[1-5]\&) \\
+     Tensor(const X[1-6]\&) \\
+     Tensor(const X[1-7]\&) \\
+     Tensor(const X[1-8]\&) \\
+     Tensor(const X[1-9]\&) \\
+     \tilder Tensor() \\
+     Tensor\& operator=(const Tensor\&) \\
+     Tensor\& operator=(const Tensor<D,T1,Tag1>\&) \\
+     Tensor\& operator=(const X\&) \\
+     const T\& operator()(int) \\
+     T\& operator()(int) \\
+     const Engine\& engine() \\
+     Engine\& engine() \\
+     void print(Out\&)
+     \end{lists} etex);
+   boxit.tensor[3](
+     btex
+     \begin{lists}
+     dimension D \\
+     value type T \\
+     engine type E
+     \end{lists} etex);
+   boxit.tensor[4](
+     btex \begin{files}
+     Tensor.h
+     \end{files} etex);
+   
+   % TensorEngine
+   boxit.tensorEngine[0](btex \classname{TensorEngine} etex);
+   boxit.tensorEngine[1](btex etex);
+   boxit.tensorEngine[2](btex etex);
+   boxit.tensorEngine[3](
+     btex
+     \begin{lists}
+     dim D \\
+     value T \\
+     engine E
+     \end{lists} etex);
+   boxit.tensorEngine[4](
+     btex \begin{files}
+     TensorEngine.h
+     \end{files} etex);
+   
+   % TensorEngine<D,T,Full>
+   boxit.teFull[0](btex \classname{TensorEngine<D,T,Full>} etex);
+   boxit.teFull[1](btex etex);
+   boxit.teFull[2](
+     btex \begin{lists}
+     TensorEngine() \\
+     TensorEngine(const TensorEngine<D,T,Full>\&) \\
+     TensorEngine(const T\&) \\
+     TensorEngine(const X\&) \\
+     TensorEngine(const X[1-4]\&) \\
+     TensorEngine(const X[1-9]\&) \\
+     \tilder TensorEngine() \\
+     TensorEngine\& operator=(const TensorEngine\&) \\
+     TensorEngine\& operator=(const X\&) \\
+     const T\& operator()(int,int) \\
+     T\& operator()(int,int)
+     const T\& operator()(int) \\
+     T\& operator()(int)
+     \end{lists} etex);
+   boxit.teFull[3](
+     btex
+     \begin{lists}
+     dim D \\
+     value T
+     \end{lists} etex);
+   boxit.teFull[4](
+     btex \begin{files}
+     Tensor.h
+     \end{files} etex);
+   
+   % TensorEngine<D,T,Antisymmetric>
+   boxit.teAntisymmetric[0](btex \classname{TensorEngine<D,T,Antisymmetric>} etex);
+   boxit.teAntisymmetric[1](btex etex);
+   boxit.teAntisymmetric[2](
+     btex \begin{lists}
+     TensorEngine() \\
+     TensorEngine(const TensorEngine<D,T,Antisymmetric>\&) \\
+     TensorEngine(const T\&) \\
+     TensorEngine(const X\&) \\
+     TensorEngine(const X[1-3]\&) \\
+     TensorEngine(const X[1-6]\&) \\
+     \tilder TensorEngine() \\
+     TensorEngine\& operator=(const TensorEngine\&) \\
+     TensorEngine\& operator=(const X\&) \\
+     const T\& operator()(int,int) \\
+     T\& operator()(int,int)
+     const T\& operator()(int) \\
+     T\& operator()(int)
+     \end{lists} etex);
+   boxit.teAntisymmetric[3](
+     btex
+     \begin{lists}
+     dim D \\
+     value T
+     \end{lists} etex);
+   boxit.teAntisymmetric[4](
+     btex \begin{files}
+     Tensor.h
+     \end{files} etex);
+ 
+   % TensorEngine<D,T,Symmetric>
+   boxit.teSymmetric[0](btex \classname{TensorEngine<D,T,Symmetric>} etex);
+   boxit.teSymmetric[1](btex etex);
+   boxit.teSymmetric[2](
+     btex \begin{lists}
+     TensorEngine() \\
+     TensorEngine(const TensorEngine<D,T,Symmetric>\&) \\
+     TensorEngine(const T\&) \\
+     TensorEngine(const X\&) \\
+     TensorEngine(const X[1-3]\&) \\
+     TensorEngine(const X[1-6]\&) \\
+     \tilder TensorEngine() \\
+     TensorEngine\& operator=(const TensorEngine\&) \\
+     TensorEngine\& operator=(const X\&) \\
+     const T\& operator()(int,int) \\
+     T\& operator()(int,int)
+     const T\& operator()(int) \\
+     T\& operator()(int)
+     \end{lists} etex);
+   boxit.teSymmetric[3](
+     btex
+     \begin{lists}
+     dim D \\
+     value T
+     \end{lists} etex);
+   boxit.teSymmetric[4](
+     btex \begin{files}
+     Tensor.h
+     \end{files} etex);
+ 
+   % TensorEngine<D,T,Diagonal>
+   boxit.teDiagonal[0](btex \classname{TensorEngine<D,T,Diagonal>} etex);
+   boxit.teDiagonal[1](btex etex);
+   boxit.teDiagonal[2](
+     btex \begin{lists}
+     TensorEngine() \\
+     TensorEngine(const TensorEngine<D,T,Symmetric>\&) \\
+     TensorEngine(const T\&) \\
+     TensorEngine(const X\&) \\
+     TensorEngine(const X[1-2]\&) \\
+     TensorEngine(const X[1-3]\&) \\
+     TensorEngine(const X[1-4]\&) \\
+     TensorEngine(const X[1-5]\&) \\
+     TensorEngine(const X[1-6]\&) \\
+     TensorEngine(const X[1-7]\&) \\
+     \tilder TensorEngine() \\
+     TensorEngine\& operator=(const TensorEngine\&) \\
+     TensorEngine\& operator=(const X\&) \\
+     const T\& operator()(int,int) \\
+     T\& operator()(int,int)
+     const T\& operator()(int) \\
+     T\& operator()(int)
+     \end{lists} etex);
+   boxit.teDiagonal[3](
+     btex
+     \begin{lists}
+     dim D \\
+     value T
+     \end{lists} etex);
+   boxit.teDiagonal[4](
+     btex \begin{files}
+     Tensor.h
+     \end{files} etex);
+ 
+   %% Position the boxes.
+   % Position the boxes within the UML class diagrams.
+   forsuffixes $=tensor, tensorEngine:
+     samewidth($[0],$[1],$[2]);
+     for t = 0 upto 1:
+       $.[t].se = $[t+1].ne;
+       $.[t].sw = $[t+1].nw;
+     endfor
+     fixsize($[0],$[1],$[2]);
+   endfor
+   samewidth(teFull[0],teAntisymmetric[0],teSymmetric[0],teDiagonal[0]);
+   forsuffixes $=teFull,teAntisymmetric,teSymmetric,teDiagonal:
+     fixsize($[0]);
+   endfor
+   % Position the template parameters.
+   forsuffixes $=tensor, tensorEngine, teFull,teAntisymmetric,teSymmetric,teDiagonal:
+     fixsize($[3]);
+     $[0].ne - $[3].sw  =
+     (min(0.5 xpart($[3].ne - $[3].sw), $[0].dx),
+       min(0.5 ypart($[3].ne - $[3].sw), $[0].dy));
+   endfor
+   % Position the implementation files boxes.
+   forsuffixes $=tensor, tensorEngine:
+     fixsize($[4]);
+     $[2].s = $[4].nw;
+   endfor
+   
+   % Position the UML classes.
+   tensor[0].c = origin;
+   tensor[2].sw - tensorEngine[0].nw = (0, 4yUnit);
+   teFull[0].s - teAntisymmetric[0].n =
+   teAntisymmetric[0].s - teSymmetric[0].n =
+   teSymmetric[0].s - teDiagonal[0].n = (0, 1.5yUnit);
+   tensorEngine[1].e - 0.5[teAntisymmetric[0].sw,teSymmetric[0].nw] = (-3xUnit,0);
+   
+   %% Draw the boxes.
+   % Draw the UML class boxes.
+   forsuffixes $=tensor, tensorEngine:
+     for t = 0 upto 2:
+       drawboxed($[t]);
+     endfor
+   endfor
+   forsuffixes $=teFull,teAntisymmetric,teSymmetric,teDiagonal:
+     for t = 0 upto 0:
+       drawboxed($[t]);
+     endfor
+   endfor
+   % Draw the template parameters.
+   forsuffixes $=tensor, tensorEngine, teFull,teAntisymmetric,teSymmetric,teDiagonal:
+     unfill bpath($[3]);
+     drawunboxed($[3]);
+     draw bpath($[3]) dashed evenly;
+   endfor
+   % Draw the file names.
+   forsuffixes $=tensor, tensorEngine:
+     drawunboxed($[4]);
+   endfor
+   
+   % Draw arrows between classes.
+ 
+   % Draw lines between classes.
+   drawDiscriminator(tensorEngine[1].e, 90);
+   x0 = xpart(0.5[tensorEngine[3].e,teAntisymmetric[0].w]);
+   y0 = ypart(tensorEngine[1].e);
+   draw (tensorEngine[1].e + (discriminatorLength,0)) -- z0;
+   forsuffixes $=teFull,teAntisymmetric,teSymmetric,teDiagonal:
+     draw (x0,ypart($[0].w)) -- $[0].w;
+   endfor
+   draw (x0,ypart(teFull[0].w)) -- (x0,ypart(teDiagonal[0].w));
+ endfig;
+ 
+ 
+ %% TensorEngine<...,Full> and TensorEngine<...,Diagonal>
+ beginfig(3)
+   %% Create the boxes.
+   % Tensor
+   boxit.tensor[0](btex \classname{Tensor} etex);
+   boxit.tensor[1](btex etex);
+   boxit.tensor[2](
+     btex \begin{lists}
+     Tensor() \\
+     Tensor(const Tensor\&) \\
+     Tensor(const X1\&) \\
+     Tensor(const X[1-2]\&) \\
+     Tensor(const X[1-3]\&) \\
+     Tensor(const X[1-4]\&) \\
+     Tensor(const X[1-5]\&) \\
+     Tensor(const X[1-6]\&) \\
+     Tensor(const X[1-7]\&) \\
+     Tensor(const X[1-8]\&) \\
+     Tensor(const X[1-9]\&) \\
+     \tilder Tensor() \\
+     Tensor\& operator=(const Tensor\&) \\
+     Tensor\& operator=(const Tensor<D,T1,Tag1>\&) \\
+     Tensor\& operator=(const X\&) \\
+     const T\& operator()(int) \\
+     T\& operator()(int) \\
+     const Engine\& engine() \\
+     Engine\& engine() \\
+     void print(Out\&)
+     \end{lists} etex);
+   boxit.tensor[3](
+     btex
+     \begin{lists}
+     dimension D \\
+     value type T \\
+     engine type E
+     \end{lists} etex);
+   boxit.tensor[4](
+     btex \begin{files}
+     Tensor.h
+     \end{files} etex);
+   
+   % TensorEngine
+   boxit.tensorEngine[0](btex \classname{TensorEngine} etex);
+   boxit.tensorEngine[1](btex etex);
+   boxit.tensorEngine[2](btex etex);
+   boxit.tensorEngine[3](
+     btex
+     \begin{lists}
+     dimension D \\
+     value type T \\
+     engine type E
+     \end{lists} etex);
+   boxit.tensorEngine[4](
+     btex \begin{files}
+     TensorEngine.h
+     \end{files} etex);
+   
+   % TensorEngine<D,T,Full>
+   boxit.teFull[0](btex \classname{TensorEngine<D,T,Full>} etex);
+   boxit.teFull[1](btex etex);
+   boxit.teFull[2](
+     btex \begin{lists}
+     TensorEngine() \\
+     TensorEngine(const TensorEngine<D,T,Full>\&) \\
+     TensorEngine(const T\&) \\
+     TensorEngine(const X\&) \\
+     TensorEngine(const X[1-4]\&) \\
+     TensorEngine(const X[1-9]\&) \\
+     \tilder TensorEngine() \\
+     TensorEngine\& operator=(const TensorEngine\&) \\
+     TensorEngine\& operator=(const X\&) \\
+     const T\& operator()(int,int) \\
+     T\& operator()(int,int)
+     const T\& operator()(int) \\
+     T\& operator()(int)
+     \end{lists} etex);
+   boxit.teFull[3](
+     btex
+     \begin{lists}
+     dimension D \\
+     value type T
+     \end{lists} etex);
+   boxit.teFull[4](
+     btex \begin{files}
+     Tensor.h
+     \end{files} etex);
+   
+   % TensorEngine<D,T,Antisymmetric>
+   boxit.teAntisymmetric[0](btex \classname{TensorEngine<D,T,Antisymmetric>} etex);
+   boxit.teAntisymmetric[1](btex etex);
+   boxit.teAntisymmetric[2](
+     btex \begin{lists}
+     TensorEngine() \\
+     TensorEngine(const TensorEngine<D,T,Antisymmetric>\&) \\
+     TensorEngine(const T\&) \\
+     TensorEngine(const X\&) \\
+     TensorEngine(const X[1-3]\&) \\
+     TensorEngine(const X[1-6]\&) \\
+     \tilder TensorEngine() \\
+     TensorEngine\& operator=(const TensorEngine\&) \\
+     TensorEngine\& operator=(const X\&) \\
+     const T\& operator()(int,int) \\
+     T\& operator()(int,int)
+     const T\& operator()(int) \\
+     T\& operator()(int)
+     \end{lists} etex);
+   boxit.teAntisymmetric[3](
+     btex
+     \begin{lists}
+     dimension D \\
+     value type T
+     \end{lists} etex);
+   boxit.teAntisymmetric[4](
+     btex \begin{files}
+     Tensor.h
+     \end{files} etex);
+ 
+   % TensorEngine<D,T,Symmetric>
+   boxit.teSymmetric[0](btex \classname{TensorEngine<D,T,Symmetric>} etex);
+   boxit.teSymmetric[1](btex etex);
+   boxit.teSymmetric[2](
+     btex \begin{lists}
+     TensorEngine() \\
+     TensorEngine(const TensorEngine<D,T,Symmetric>\&) \\
+     TensorEngine(const T\&) \\
+     TensorEngine(const X\&) \\
+     TensorEngine(const X[1-3]\&) \\
+     TensorEngine(const X[1-6]\&) \\
+     \tilder TensorEngine() \\
+     TensorEngine\& operator=(const TensorEngine\&) \\
+     TensorEngine\& operator=(const X\&) \\
+     const T\& operator()(int,int) \\
+     T\& operator()(int,int)
+     const T\& operator()(int) \\
+     T\& operator()(int)
+     \end{lists} etex);
+   boxit.teSymmetric[3](
+     btex
+     \begin{lists}
+     dimension D \\
+     value type T
+     \end{lists} etex);
+   boxit.teSymmetric[4](
+     btex \begin{files}
+     Tensor.h
+     \end{files} etex);
+ 
+   % TensorEngine<D,T,Diagonal>
+   boxit.teDiagonal[0](btex \classname{TensorEngine<D,T,Diagonal>} etex);
+   boxit.teDiagonal[1](btex etex);
+   boxit.teDiagonal[2](
+     btex \begin{lists}
+     TensorEngine() \\
+     TensorEngine(const TensorEngine<D,T,Symmetric>\&) \\
+     TensorEngine(const T\&) \\
+     TensorEngine(const X\&) \\
+     TensorEngine(const X[1-2]\&) \\
+     TensorEngine(const X[1-3]\&) \\
+     TensorEngine(const X[1-4]\&) \\
+     TensorEngine(const X[1-5]\&) \\
+     TensorEngine(const X[1-6]\&) \\
+     TensorEngine(const X[1-7]\&) \\
+     \tilder TensorEngine() \\
+     TensorEngine\& operator=(const TensorEngine\&) \\
+     TensorEngine\& operator=(const X\&) \\
+     const T\& operator()(int,int) \\
+     T\& operator()(int,int)
+     const T\& operator()(int) \\
+     T\& operator()(int)
+     \end{lists} etex);
+   boxit.teDiagonal[3](
+     btex
+     \begin{lists}
+     dimension D \\
+     value type T
+     \end{lists} etex);
+   boxit.teDiagonal[4](
+     btex \begin{files}
+     Tensor.h
+     \end{files} etex);
+ 
+   %% Position the boxes.
+   % Position the boxes within the UML class diagrams.
+   forsuffixes $=teFull, teDiagonal:
+     samewidth($[0],$[1],$[2]);
+     for t = 0 upto 1:
+       $.[t].se = $[t+1].ne;
+       $.[t].sw = $[t+1].nw;
+     endfor
+     fixsize($[0],$[1],$[2]);
+   endfor
+   % Position the template parameters.
+   forsuffixes $=teFull, teDiagonal:
+     fixsize($[3]);
+     $[0].ne - $[3].sw  =
+     (min(0.5 xpart($[3].ne - $[3].sw), $[0].dx),
+       min(0.5 ypart($[3].ne - $[3].sw), $[0].dy));
+   endfor
+   % Position the implementation files boxes.
+   forsuffixes $=teFull, teDiagonal:
+     fixsize($[4]);
+     $[2].s = $[4].nw;
+   endfor
+   
+   % Position the UML classes.
+   teFull[0].c = origin;
+   teFull[2].sw - teDiagonal[0].nw = (0, 2yUnit);
+   
+   %% Draw the boxes.
+   % Draw the UML class boxes.
+   forsuffixes $=teFull, teDiagonal:
+     for t = 0 upto 2:
+       drawboxed($[t]);
+     endfor
+   endfor
+   % Draw the template parameters.
+   forsuffixes $=teFull, teDiagonal:
+     unfill bpath($[3]);
+     drawunboxed($[3]);
+     draw bpath($[3]) dashed evenly;
+   endfor
+   % Draw the file names.
+   forsuffixes $=teFull, teDiagonal:
+     drawunboxed($[4]);
+   endfor
+   
+   % Draw arrows between classes.
+ 
+   % Draw lines between classes.
+ endfig;
+ 
+ 
+ %% TensorEngine<...,Antisymmetric> and TensorEngine<...,Symmetric>
+ beginfig(4)
+   %% Create the boxes.
+   % Tensor
+   boxit.tensor[0](btex \classname{Tensor} etex);
+   boxit.tensor[1](btex etex);
+   boxit.tensor[2](
+     btex \begin{lists}
+     Tensor() \\
+     Tensor(const Tensor\&) \\
+     Tensor(const X1\&) \\
+     Tensor(const X[1-2]\&) \\
+     Tensor(const X[1-3]\&) \\
+     Tensor(const X[1-4]\&) \\
+     Tensor(const X[1-5]\&) \\
+     Tensor(const X[1-6]\&) \\
+     Tensor(const X[1-7]\&) \\
+     Tensor(const X[1-8]\&) \\
+     Tensor(const X[1-9]\&) \\
+     \tilder Tensor() \\
+     Tensor\& operator=(const Tensor\&) \\
+     Tensor\& operator=(const Tensor<D,T1,Tag1>\&) \\
+     Tensor\& operator=(const X\&) \\
+     const T\& operator()(int) \\
+     T\& operator()(int) \\
+     const Engine\& engine() \\
+     Engine\& engine() \\
+     void print(Out\&)
+     \end{lists} etex);
+   boxit.tensor[3](
+     btex
+     \begin{lists}
+     dimension D \\
+     value type T \\
+     engine type E
+     \end{lists} etex);
+   boxit.tensor[4](
+     btex \begin{files}
+     Tensor.h
+     \end{files} etex);
+   
+   % TensorEngine
+   boxit.tensorEngine[0](btex \classname{TensorEngine} etex);
+   boxit.tensorEngine[1](btex etex);
+   boxit.tensorEngine[2](btex etex);
+   boxit.tensorEngine[3](
+     btex
+     \begin{lists}
+     dimension D \\
+     value type T \\
+     engine type E
+     \end{lists} etex);
+   boxit.tensorEngine[4](
+     btex \begin{files}
+     TensorEngine.h
+     \end{files} etex);
+   
+   % TensorEngine<D,T,Full>
+   boxit.teFull[0](btex \classname{TensorEngine<D,T,Full>} etex);
+   boxit.teFull[1](btex etex);
+   boxit.teFull[2](
+     btex \begin{lists}
+     TensorEngine() \\
+     TensorEngine(const TensorEngine<D,T,Full>\&) \\
+     TensorEngine(const T\&) \\
+     TensorEngine(const X\&) \\
+     TensorEngine(const X[1-4]\&) \\
+     TensorEngine(const X[1-9]\&) \\
+     \tilder TensorEngine() \\
+     TensorEngine\& operator=(const TensorEngine\&) \\
+     TensorEngine\& operator=(const X\&) \\
+     const T\& operator()(int,int) \\
+     T\& operator()(int,int)
+     const T\& operator()(int) \\
+     T\& operator()(int)
+     \end{lists} etex);
+   boxit.teFull[3](
+     btex
+     \begin{lists}
+     dimension D \\
+     value type T
+     \end{lists} etex);
+   boxit.teFull[4](
+     btex \begin{files}
+     Tensor.h
+     \end{files} etex);
+   
+   % TensorEngine<D,T,Antisymmetric>
+   boxit.teAntisymmetric[0](btex \classname{TensorEngine<D,T,Antisymmetric>} etex);
+   boxit.teAntisymmetric[1](btex etex);
+   boxit.teAntisymmetric[2](
+     btex \begin{lists}
+     TensorEngine() \\
+     TensorEngine(const TensorEngine<D,T,Antisymmetric>\&) \\
+     TensorEngine(const T\&) \\
+     TensorEngine(const X\&) \\
+     TensorEngine(const X[1-3]\&) \\
+     TensorEngine(const X[1-6]\&) \\
+     \tilder TensorEngine() \\
+     TensorEngine\& operator=(const TensorEngine\&) \\
+     TensorEngine\& operator=(const X\&) \\
+     const T\& operator()(int,int) \\
+     T\& operator()(int,int)
+     const T\& operator()(int) \\
+     T\& operator()(int)
+     \end{lists} etex);
+   boxit.teAntisymmetric[3](
+     btex
+     \begin{lists}
+     dimension D \\
+     value type T
+     \end{lists} etex);
+   boxit.teAntisymmetric[4](
+     btex \begin{files}
+     Tensor.h
+     \end{files} etex);
+ 
+   % TensorEngine<D,T,Symmetric>
+   boxit.teSymmetric[0](btex \classname{TensorEngine<D,T,Symmetric>} etex);
+   boxit.teSymmetric[1](btex etex);
+   boxit.teSymmetric[2](
+     btex \begin{lists}
+     TensorEngine() \\
+     TensorEngine(const TensorEngine<D,T,Symmetric>\&) \\
+     TensorEngine(const T\&) \\
+     TensorEngine(const X\&) \\
+     TensorEngine(const X[1-3]\&) \\
+     TensorEngine(const X[1-6]\&) \\
+     \tilder TensorEngine() \\
+     TensorEngine\& operator=(const TensorEngine\&) \\
+     TensorEngine\& operator=(const X\&) \\
+     const T\& operator()(int,int) \\
+     T\& operator()(int,int)
+     const T\& operator()(int) \\
+     T\& operator()(int)
+     \end{lists} etex);
+   boxit.teSymmetric[3](
+     btex
+     \begin{lists}
+     dimension D \\
+     value type T
+     \end{lists} etex);
+   boxit.teSymmetric[4](
+     btex \begin{files}
+     Tensor.h
+     \end{files} etex);
+ 
+   % TensorEngine<D,T,Diagonal>
+   boxit.teDiagonal[0](btex \classname{TensorEngine<D,T,Diagonal>} etex);
+   boxit.teDiagonal[1](btex etex);
+   boxit.teDiagonal[2](
+     btex \begin{lists}
+     TensorEngine() \\
+     TensorEngine(const TensorEngine<D,T,Symmetric>\&) \\
+     TensorEngine(const T\&) \\
+     TensorEngine(const X\&) \\
+     TensorEngine(const X[1-2]\&) \\
+     TensorEngine(const X[1-3]\&) \\
+     TensorEngine(const X[1-4]\&) \\
+     TensorEngine(const X[1-5]\&) \\
+     TensorEngine(const X[1-6]\&) \\
+     TensorEngine(const X[1-7]\&) \\
+     \tilder TensorEngine() \\
+     TensorEngine\& operator=(const TensorEngine\&) \\
+     TensorEngine\& operator=(const X\&) \\
+     const T\& operator()(int,int) \\
+     T\& operator()(int,int)
+     const T\& operator()(int) \\
+     T\& operator()(int)
+     \end{lists} etex);
+   boxit.teDiagonal[3](
+     btex
+     \begin{lists}
+     dimension D \\
+     value type T
+     \end{lists} etex);
+   boxit.teDiagonal[4](
+     btex \begin{files}
+     Tensor.h
+     \end{files} etex);
+ 
+   %% Position the boxes.
+   % Position the boxes within the UML class diagrams.
+   forsuffixes $=teAntisymmetric, teSymmetric:
+     samewidth($[0],$[1],$[2]);
+     for t = 0 upto 1:
+       $.[t].se = $[t+1].ne;
+       $.[t].sw = $[t+1].nw;
+     endfor
+     fixsize($[0],$[1],$[2]);
+   endfor
+   % Position the template parameters.
+   forsuffixes $=teAntisymmetric, teSymmetric:
+     fixsize($[3]);
+     $[0].ne - $[3].sw  =
+     (min(0.5 xpart($[3].ne - $[3].sw), $[0].dx),
+       min(0.5 ypart($[3].ne - $[3].sw), $[0].dy));
+   endfor
+   % Position the implementation files boxes.
+   forsuffixes $=teAntisymmetric, teSymmetric:
+     fixsize($[4]);
+     $[2].s = $[4].nw;
+   endfor
+   
+   % Position the UML classes.
+   teAntisymmetric[0].c = origin;
+   teAntisymmetric[2].sw - teSymmetric[0].nw = (0, 2yUnit);
+   
+   %% Draw the boxes.
+   % Draw the UML class boxes.
+   forsuffixes $=teAntisymmetric, teSymmetric:
+     for t = 0 upto 2:
+       drawboxed($[t]);
+     endfor
+   endfor
+   % Draw the template parameters.
+   forsuffixes $=teAntisymmetric, teSymmetric:
+     unfill bpath($[3]);
+     drawunboxed($[3]);
+     draw bpath($[3]) dashed evenly;
+   endfor
+   % Draw the file names.
+   forsuffixes $=teAntisymmetric, teSymmetric:
+     drawunboxed($[4]);
+   endfor
+   
+   % Draw arrows between classes.
+ 
+   % Draw lines between classes.
+ endfig;
+ 
+ 
+ %% TinyMatrix
+ beginfig(10)
+   %% Create the boxes.
+   % Tensor
+   boxit.matrix[0](btex \classname{TinyMatrix} etex);
+   boxit.matrix[1](btex etex);
+   boxit.matrix[2](
+     btex \begin{lists}
+     TinyMatrix() \\
+     TinyMatrix(const TinyMatrix\&) \\
+     TinyMatrix(const X1\&) \\
+     TinyMatrix(const X[1-2]\&) \\
+     TinyMatrix(const X[1-3]\&) \\
+     TinyMatrix(const X[1-4]\&) \\
+     TinyMatrix(const X[1-5]\&) \\
+     TinyMatrix(const X[1-6]\&) \\
+     TinyMatrix(const X[1-7]\&) \\
+     TinyMatrix(const X[1-8]\&) \\
+     TinyMatrix(const X[1-9]\&) \\
+     \tilder TinyMatrix() \\
+     TinyMatrix\& operator=(const TinyMatrix\&) \\
+     TinyMatrix\& operator=(const X\&) \\
+     const T\& operator()(int,int) \\
+     T\& operator()(int,int) \\
+     const T\& operator()(int) \\
+     T\& operator()(int) \\
+     const Engine\& engine() \\
+     Engine\& engine() \\
+     void print(Out\&)
+     \end{lists} etex);
+   boxit.matrix[3](
+     btex
+     \begin{lists}
+     dimension D1 \\
+     dimension D2 \\
+     value type T \\
+     engine type E
+     \end{lists} etex);
+   boxit.matrix[4](
+     btex \begin{files}
+     TinyMatrix.h
+     \end{files} etex);
+   
+   % MatrixEngine
+   boxit.matrixEngine[0](btex \classname{TinyMatrixEngine} etex);
+   boxit.matrixEngine[1](btex etex);
+   boxit.matrixEngine[2](btex etex);
+   boxit.matrixEngine[3](
+     btex
+     \begin{lists}
+     dimension D1 \\
+     dimension D2 \\
+     value type T \\
+     engine type E
+     \end{lists} etex);
+   boxit.matrixEngine[4](
+     btex \begin{files}
+     TinyMatrixEngine.h
+     \end{files} etex);
+   
+   % TinyMatrixEngine<D1,D2,T,Full>
+   boxit.matrixEngineFull[0](btex \classname{TinyMatrixEngine<D1,D2,T,Full>} etex);
+   boxit.matrixEngineFull[1](btex etex);
+   boxit.matrixEngineFull[2](
+     btex \begin{lists}
+     TinyMatrixEngine() \\
+     TinyMatrixEngine(const TinyMatrixEngine<D,T,Full>\&) \\
+     TinyMatrixEngine(const X\&) \\
+     TinyMatrixEngine(const X[1-2]\&) \\
+     TinyMatrixEngine(const X[1-3]\&) \\
+     TinyMatrixEngine(const X[1-4]\&) \\
+     TinyMatrixEngine(const X[1-5]\&) \\
+     TinyMatrixEngine(const X[1-6]\&) \\
+     TinyMatrixEngine(const X[1-7]\&) \\
+     TinyMatrixEngine(const X[1-8]\&) \\
+     TinyMatrixEngine(const X[1-9]\&) \\
+     \tilder TinyMatrixEngine() \\
+     TinyMatrixEngine\& operator=(const TinyMatrixEngine\&) \\
+     TinyMatrixEngine\& operator=(const X\&) \\
+     const T\& operator()(int,int) \\
+     T\& operator()(int,int)
+     const T\& operator()(int) \\
+     T\& operator()(int)
+     \end{lists} etex);
+   boxit.matrixEngineFull[3](
+     btex
+     \begin{lists}
+     dimension D \\
+     value type T
+     \end{lists} etex);
+   boxit.matrixEngineFull[4](
+     btex \begin{files}
+     TinyMatrix.h
+     \end{files} etex);
+ 
+   %% Position the boxes.
+   % Position the boxes within the UML class diagrams.
+   forsuffixes $=matrix, matrixEngine, matrixEngineFull:
+     samewidth($[0],$[1],$[2]);
+     for t = 0 upto 1:
+       $.[t].se = $[t+1].ne;
+       $.[t].sw = $[t+1].nw;
+     endfor
+     fixsize($[0],$[1],$[2]);
+   endfor
+   % Position the template parameters.
+   forsuffixes $=matrix, matrixEngine, matrixEngineFull:
+     fixsize($[3]);
+     $[0].ne - $[3].sw  =
+     (min(0.5 xpart($[3].ne - $[3].sw), $[0].dx),
+       min(0.5 ypart($[3].ne - $[3].sw), $[0].dy));
+   endfor
+   % Position the implementation files boxes.
+   forsuffixes $=matrix, matrixEngine, matrixEngineFull:
+     fixsize($[4]);
+     $[2].s = $[4].nw;
+   endfor
+   
+   % Position the UML classes.
+   matrix[0].c = origin;
+   matrix[2].s - matrixEngine[0].n = (0, 3yUnit);
+   matrixEngine[2].s - matrixEngineFull[0].n = (0, yUnit);
+   
+   %% Draw the boxes.
+   % Draw the UML class boxes.
+   forsuffixes $=matrix:
+     for t = 0 upto 2:
+       drawboxed($[t]);
+     endfor
+   endfor
+   % Draw the template parameters.
+   forsuffixes $=matrix:
+     unfill bpath($[3]);
+     drawunboxed($[3]);
+     draw bpath($[3]) dashed evenly;
+   endfor
+   % Draw the file names.
+   forsuffixes $=matrix:
+     drawunboxed($[4]);
+   endfor
+   
+   % Draw arrows between classes.
+ 
+   % Draw lines between classes.
+ endfig;
+ 
+ %% TinyMatrix
+ beginfig(11)
+   %% Create the boxes.
+   % Tensor
+   boxit.matrix[0](btex \classname{TinyMatrix} etex);
+   boxit.matrix[1](btex etex);
+   boxit.matrix[2](
+     btex \begin{lists}
+     TinyMatrix() \\
+     TinyMatrix(const TinyMatrix\&) \\
+     TinyMatrix(const X1\&) \\
+     TinyMatrix(const X[1-2]\&) \\
+     TinyMatrix(const X[1-3]\&) \\
+     TinyMatrix(const X[1-4]\&) \\
+     TinyMatrix(const X[1-5]\&) \\
+     TinyMatrix(const X[1-6]\&) \\
+     TinyMatrix(const X[1-7]\&) \\
+     TinyMatrix(const X[1-8]\&) \\
+     TinyMatrix(const X[1-9]\&) \\
+     \tilder TinyMatrix() \\
+     TinyMatrix\& operator=(const TinyMatrix\&) \\
+     TinyMatrix\& operator=(const X\&) \\
+     const T\& operator()(int,int) \\
+     T\& operator()(int,int) \\
+     const T\& operator()(int) \\
+     T\& operator()(int) \\
+     const Engine\& engine() \\
+     Engine\& engine() \\
+     void print(Out\&)
+     \end{lists} etex);
+   boxit.matrix[3](
+     btex
+     \begin{lists}
+     dimension D1 \\
+     dimension D2 \\
+     value type T \\
+     engine type E
+     \end{lists} etex);
+   boxit.matrix[4](
+     btex \begin{files}
+     TinyMatrix.h
+     \end{files} etex);
+   
+   % MatrixEngine
+   boxit.matrixEngine[0](btex \classname{TinyMatrixEngine} etex);
+   boxit.matrixEngine[1](btex etex);
+   boxit.matrixEngine[2](btex etex);
+   boxit.matrixEngine[3](
+     btex
+     \begin{lists}
+     dimension D1 \\
+     dimension D2 \\
+     value type T \\
+     engine type E
+     \end{lists} etex);
+   boxit.matrixEngine[4](
+     btex \begin{files}
+     TinyMatrixEngine.h
+     \end{files} etex);
+   
+   % TinyMatrixEngine<D1,D2,T,Full>
+   boxit.matrixEngineFull[0](btex \classname{TinyMatrixEngine<D1,D2,T,Full>} etex);
+   boxit.matrixEngineFull[1](btex etex);
+   boxit.matrixEngineFull[2](
+     btex \begin{lists}
+     TinyMatrixEngine() \\
+     TinyMatrixEngine(const TinyMatrixEngine<D,T,Full>\&) \\
+     TinyMatrixEngine(const X\&) \\
+     TinyMatrixEngine(const X[1-2]\&) \\
+     TinyMatrixEngine(const X[1-3]\&) \\
+     TinyMatrixEngine(const X[1-4]\&) \\
+     TinyMatrixEngine(const X[1-5]\&) \\
+     TinyMatrixEngine(const X[1-6]\&) \\
+     TinyMatrixEngine(const X[1-7]\&) \\
+     TinyMatrixEngine(const X[1-8]\&) \\
+     TinyMatrixEngine(const X[1-9]\&) \\
+     \tilder TinyMatrixEngine() \\
+     TinyMatrixEngine\& operator=(const TinyMatrixEngine\&) \\
+     TinyMatrixEngine\& operator=(const X\&) \\
+     const T\& operator()(int,int) \\
+     T\& operator()(int,int)
+     const T\& operator()(int) \\
+     T\& operator()(int)
+     \end{lists} etex);
+   boxit.matrixEngineFull[3](
+     btex
+     \begin{lists}
+     dimension D \\
+     value type T
+     \end{lists} etex);
+   boxit.matrixEngineFull[4](
+     btex \begin{files}
+     TinyMatrix.h
+     \end{files} etex);
+ 
+   %% Position the boxes.
+   % Position the boxes within the UML class diagrams.
+   forsuffixes $=matrix, matrixEngine, matrixEngineFull:
+     samewidth($[0],$[1],$[2]);
+     for t = 0 upto 1:
+       $.[t].se = $[t+1].ne;
+       $.[t].sw = $[t+1].nw;
+     endfor
+     fixsize($[0],$[1],$[2]);
+   endfor
+   % Position the template parameters.
+   forsuffixes $=matrix, matrixEngine, matrixEngineFull:
+     fixsize($[3]);
+     $[0].ne - $[3].sw  =
+     (min(0.5 xpart($[3].ne - $[3].sw), $[0].dx),
+       min(0.5 ypart($[3].ne - $[3].sw), $[0].dy));
+   endfor
+   % Position the implementation files boxes.
+   forsuffixes $=matrix, matrixEngine, matrixEngineFull:
+     fixsize($[4]);
+     $[2].s = $[4].nw;
+   endfor
+   
+   % Position the UML classes.
+   matrix[0].c = origin;
+   matrix[2].s - matrixEngine[0].n = (0, 3yUnit);
+   matrixEngine[2].s - matrixEngineFull[0].n = (0, yUnit);
+   
+   %% Draw the boxes.
+   % Draw the UML class boxes.
+   forsuffixes $=matrixEngine, matrixEngineFull:
+     for t = 0 upto 2:
+       drawboxed($[t]);
+     endfor
+   endfor
+   % Draw the template parameters.
+   forsuffixes $=matrixEngine, matrixEngineFull:
+     unfill bpath($[3]);
+     drawunboxed($[3]);
+     draw bpath($[3]) dashed evenly;
+   endfor
+   % Draw the file names.
+   forsuffixes $=matrixEngine, matrixEngineFull:
+     drawunboxed($[4]);
+   endfor
+   
+   % Draw arrows between classes.
+ 
+   % Draw lines between classes.
+   draw matrixEngineFull[0].n -- (matrixEngine[2].s-(0,discriminatorLength));
+   drawDiscriminator(matrixEngine[2].s, 0);
+ 
+ endfig;
+ 
+ bye
Index: figures/uml.mp
===================================================================
RCS file: /home/pooma/Repository/r2/docs/manual/figures/uml.mp,v
retrieving revision 1.1
diff -c -p -r1.1 uml.mp
*** figures/uml.mp	2002/02/27 03:51:54	1.1
--- figures/uml.mp	2002/03/04 22:51:16
*************** path discriminator;
*** 12,17 ****
--- 12,18 ----
  discriminator = origin -- ((1,0) rotated -120) -- ((1,0) rotated -60) -- cycle;
  
  numeric discriminatorScale; discriminatorScale = 0.5cm;
+ numeric discriminatorLength; discriminatorLength = discriminatorScale*sqrt(3)/2;
  
  % The location is the top of the triangle
  vardef drawDiscriminator(expr location, rotation) =


More information about the pooma-dev mailing list