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 **** Indentation follows the GNU Emacs's &cc; mode guidelines. Most increases in ! indentation levels starts two characters to the right. Most brackets, e.g., in function definitions, occur on separate lines. Exceptions are for very short functions. --- 534,540 ---- Indentation follows the GNU Emacs's &cc; mode guidelines. Most increases in ! indentation levels start two characters to the right. Most brackets, e.g., in function definitions, occur on separate lines. Exceptions are for very short functions. *************** *** 604,610 ****
Global Variables ! Global variables are avoided whenever possible.
--- 604,614 ----
Global Variables ! 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 ! _g is appended, e.g., ! veryFewGlobalVariables_g.
*************** *** 804,810 ****
Errors and Exceptions ! &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., POOMA_EXCEPTIONS in the code. --- 808,814 ----
Errors and Exceptions ! &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., POOMA_EXCEPTIONS in the code. 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 ---- Brick"> + Centering"> + char"> complex"> *************** *** 148,153 **** --- 150,157 ---- TinyMatrix"> + Mesh"> + MultiPatch"> Options"> *************** *** 251,256 **** --- 255,262 ---- + + *************** *** 304,311 **** 1.00 ! 2002 Jan 31 jdo First publication. --- 310,325 ---- + 1.01 + 2002 Mar 01 + jdo + Added UML class diagrams, revised compilation + directions, and added a description of the source code + structure. + + 1.00 ! 2002 Jan 31 jdo First publication. *************** a(I,J) = (1.0/9.0) * *** 1002,1009 **** architecture-specific initialization. The function always returns &true;. - HERE - initialize's alternative form assumes the &pooma;-specific and architecture-specific command-line arguments have already been removed from --- 1016,1021 ---- *************** UNFINISHED *** 3680,3915 **** &template-appendix; &code-appendix; - - - - ¨ Class Diagrams - - In this chapter, we present Unified Modeling Language (¨) - class diagrams. These are created at the - specification 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;. - -
- Explanation of ¨ Class Diagrams - - - - - - - - - An Explanation of UML Class Diagrams - - -
- - illustrates a typical - ¨ class diagram. The diagram has three classes: - Classname1, Classname2, and - Classname2<1>. 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. - Classname2<1> 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 Classname1 and - Classname2 have template parameters, each named - T. 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. - - Lines connect classes. The solid arrow with large triangular - arrowhead indicates that Classname2 is a subtype of - Classname1. 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, - Classname2 has no new members not provided by - Classname1. A dashed arrow indicates a class formed by - a template instantiation. The class name indicates which template - parameters are bound. For example, Classname2<1> - instantiates Classname2 with T equal - to 1. - - 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. - - -
- &array;s - -
- Relationship Between &array; and &dynamicarray;s - - - - - - - - - &dynamicarray;s are subtypes of &array;s - - -
- - Both &array;s and &dynamicarray;s have so many member - functions that their class boxes appear in separate diagrams. - 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. - -
- &array; Diagram - - - - - - - - - &array; Class Diagram - - -
- -
- &dynamicarray; Diagram - - - - - - - - - &dynamicarray; Class Diagram - - -
-
! !
! &domain;s ! ! &domain;s and its subtypes are shown in . All classes are instantiated ! from or subtypes of &domain;. As mentioned in , the Domain<1> ! template instantiation has additional member functions. It uses ! the Domain<1>::iterator. 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 Domain<1>. ! !
! &domain;s ! ! ! ! ! ! ! ! ! &domain;s ! ! !
! !
! ! !
! &engine;s ! ! &engine;s and its subtypes are shown in . Five subtypes of &engine;s ! are shown. Details appear in subsequent diagrams. The ! Engine class box shows no members because it has no ! members. Only subtypes have members. More explanation of these ! classes can be found in . The ! implementation files in use the ! [1-7] regular expression to indicate 1, 2, ! …, or 7. ! !
! &engine;s ! ! ! ! ! ! ! ! ! Relationships among &engine;s ! ! !
! !
! &brick; and &compressiblebrick; &engine;s ! ! ! ! ! ! ! ! ! &brick; and &compressiblebrick; &engine;s ! ! !
! !
! &dynamic; and &multipatch; &engine;s ! ! ! ! ! ! ! ! ! &dynamic; and &multipatch; &engine;s ! ! !
! !
! &remote; &engine;s ! ! ! ! ! ! ! ! ! &remote; &engine;s ! ! !
! !
! !
FIXME contains a short introduction to template programming. Readers needing more background material might want to read Koenig and Moo's Accelerated &cc;, 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 ! contains a short introduction to template programming. Readers needing more background material might want to read Koenig and Moo's Accelerated &cc;, Stanley Lippman's *************** *** 375,381 **** ! Jeffrey D. Oldham, 2002 February --- 375,381 ---- ! Jeffrey D. Oldham, 2002 March 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 Hello, &pooma; program. Impatient readers will find the first section helpful. Those desiring more details will find this section provides a useful ! overview of the chapter.
--- 5,11 ---- for use, and then compile a Hello, &pooma; 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.
*************** *** 39,45 **** indicates the operating system and compiler. Permitted choices are the names of files in the config/arch/ subdirectory omitting ! the .conf suffix. --- 39,45 ---- indicates the operating system and compiler. Permitted choices are the names of files in the config/arch/ subdirectory omitting ! the .conf suffixes. *************** *** 60,69 **** program available at examples/Manual/Sequential/initialize-finalize.cpp: &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 ! The environment variable indicates the location of the &toolkit; ! header files and the library. --- 60,73 ---- program available at examples/Manual/Sequential/initialize-finalize.cpp: &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 ! The POOMAHOME environment variable indicates the ! location of the &toolkit; header files and the library. *************** *** 113,121 **** operating system with &kcc;. To configure the source code, use a command ! like &initialspace;./configure &dashdash;arch ! LINUXgcc &dashdash;opt &dashdash;suite LINUXgcc-opt ! The architecture argument to the &dashdash;arch option is the name of the corresponding configuration file, omitting its .conf suffix. The --- 117,125 ---- operating system with &kcc;. To configure the source code, use a command ! like ! &initialspace;./configure &dashdash;arch LINUXgcc &dashdash;opt &dashdash;suite LINUXgcc-opt ! The architecture argument to the &dashdash;arch option is the name of the corresponding configuration file, omitting its .conf suffix. The *************** *** 137,152 **** need to be compiled. Specify the desired suite by setting the POOMASUITE environment variable to the appropriate value. For example, if using the bash ! shell, use &initialspace;export ! POOMASUITE=suiteName ! substituting the suite name's suiteName. If using the csh shell, ! use &initialspace;setenv POOMASUITE ! suiteName In the previous paragraph, the suite name is LINUXgcc-opt so we would issue the ! statement &initialspace;setenv POOMASUITE ! LINUXgcc-opt Issuing the make 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 POOMASUITE environment variable to the appropriate value. For example, if using the bash ! shell, use ! &initialspace;export POOMASUITE=suiteName ! substituting the suite name's suiteName. If using the csh shell, ! use ! &initialspace;setenv POOMASUITE suiteName ! In the previous paragraph, the suite name is LINUXgcc-opt so we would issue the ! statement ! &initialspace;setenv POOMASUITE LINUXgcc-opt ! Issuing the make command compiles the &pooma; source code files to create the &pooma; library. The *************** *** 158,164 **** class="libraryfile">lib/LINUXgcc-opt/libpooma-gcc.a. If it fails, the makefiles will print a line indicating which file failed to compile. Reading the corresponding .info may indicate what failed. The same &pooma; source code can support multiple suites as --- 164,170 ---- class="libraryfile">lib/LINUXgcc-opt/libpooma-gcc.a. If it fails, the makefiles will print a line indicating which file failed to compile. Reading the corresponding .info file may indicate what failed. The same &pooma; source code can support multiple suites as *************** *** 188,195 **** 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. /configure -h yields a complete list. ! We describe also describe them here. --- 194,201 ---- 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. ./configure -h yields a complete list. ! We also describe them here.
*************** *** 220,226 **** The environment variable POOMASUITE's value should equal suite when compiling the library. suite can be any ! string that an serve as a filename. If this option is omitted, the &dashdash;arch architecture is used. --- 226,232 ---- The environment variable POOMASUITE's value should equal suite when compiling the library. suite can be any ! string that can serve as a filename. If this option is omitted, the &dashdash;arch architecture is used. *************** *** 427,434 **** &dashdash;messaging enables creation of distributed &pooma; executables by ! enabling use of the &cheetah; communications package. See ! --- 433,439 ---- &dashdash;messaging enables creation of distributed &pooma; executables by ! enabling use of the &cheetah; communications package. *************** *** 474,479 **** --- 479,498 ---- program that initializes and de-initializes the &pooma; library. + The simplest &pooma; program is available at examples/Manual/Sequential/initialize-finalize.cpp. + It is annotated in . Before its + use, the &poomatoolkit; must be initialized by a call to + initialize. This usually occurs in the + main function. After its use, the + &poomatoolkit; should be shut down using a call to + finalize. This also usually occurs in the + main function. Both of these functions are + declared in Pooma/Pooma.h. + This header file (or another &pooma; header file including it) + occurs in every &pooma; program. + A <quote>Hello, &pooma;</quote> Program *************** *** 495,514 **** - The simplest &pooma; program is available at examples/Manual/Sequential/initialize-finalize.cpp. - It is annotated in . Before its - use, the &poomatoolkit; must be initialized by a call to - initialize. This usually occurs in the - main function. After its use, the - &poomatoolkit; should be shut down using a call to - finalize. This also usually occurs in the - main function. Both of these functions are - declared in Pooma/Pooma.h. - This header file or another &pooma; header file including it occurs - in every &pooma; program. - Compiling this program requires including &pooma; header files and library. Let us assume that the environment variable POOMAHOME describes the location of the &pooma; --- 514,519 ---- *************** *** 516,522 **** &initialspace;export POOMAHOME=/home/user/pooma We illustrate how to compile the program using the &gpp; compiler: ! &initialspace;g++ -I${POOMAHOME}/src -I${POOMAHOME}/lib/LINUXgcc initialize-finalize.cpp -o initialize-finalize -L${POOMAHOME}/lib/${POOMASUITE} -lpooma-gcc We explain the five command-line options: --- 521,529 ---- &initialspace;export POOMAHOME=/home/user/pooma We illustrate how to compile the program using the &gpp; compiler: ! &initialspace;g++ -I${POOMAHOME}/src -I${POOMAHOME}/lib/LINUXgcc \ ! &initialspace;initialize-finalize.cpp -o initialize-finalize \ ! &initialspace;-L${POOMAHOME}/lib/${POOMASUITE} -lpooma-gcc We explain the five command-line options: *************** *** 587,593 **** Prototypes ! &initialspace;#include "Pooma/Pooma.h" // or "Pooma/Arrays.h" or "Pooma/Fields.h" or … --- 594,601 ---- Prototypes ! &initialspace;#include "Pooma/Pooma.h" ! &initialspace;// or "Pooma/Arrays.h" or "Pooma/Fields.h" or … *************** *** 870,877 **** For example, the &author; uses ! ./configure &dashdash;arch LINUXGCC &dashdash;shmem &dashdash;nompi ! &dashdash;noex &dashdash;static &dashdash;prefix ${HOME}/pooma/cheetah-1.0 &dashdash;opt The &dashdash;arch LINUXGCC indicates use of --- 878,885 ---- For example, the &author; uses ! ./configure &dashdash;arch LINUXGCC &dashdash;shmem &dashdash;nompi \ ! &dashdash;noex &dashdash;static &dashdash;prefix ${HOME}/pooma/cheetah-1.0 \ &dashdash;opt The &dashdash;arch LINUXGCC indicates use of *************** *** 921,927 **** installed &cheetah; library. For example, ! declare -x CHEETAHDIR=${HOME}/pooma/cheetah-1.0 specifies the installation directory used in the previous section. If using the csh shell, use setenv --- 929,935 ---- installed &cheetah; library. For example, ! export CHEETAHDIR=${HOME}/pooma/cheetah-1.0 specifies the installation directory used in the previous section. If using the csh shell, use 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 ---- + + ¨ Class Diagrams + + In this chapter, we present Unified Modeling Language (¨) + class diagrams for several &pooma; classes. These diagrams are + created at the specification level, which + indicates the software interface, not its implementation. + 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;. + +
+ Explanation of ¨ Class Diagrams + + + + + + + + + An Explanation of UML Class Diagrams + + +
+ + illustrates a typical + ¨ class diagram. The diagram has three classes: + Classname1, Classname2, and + Classname2<1>. 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. Free parameter + types indicate templated parameters. + Classname2<1> 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 Classname1 and + Classname2 have template parameters, each named + T. 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. + + Lines connect classes. The solid arrow with large triangular + arrowhead indicates that Classname2 is a subtype of + Classname1. 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, + Classname2 has one new member not provided by + Classname1. A dashed arrow indicates a class formed by + a template instantiation. The class name indicates which template + parameters are bound. For example, Classname2<1> + instantiates Classname2 with T equal + to 1. + + Some of the functions require many, similar function + arguments. We introduce regular expression notation to reduce the + length of the function prototype. For example, + void foo(const X[1-3]&) + abbreviates + void foo(const X1&, const X2&, const X3&) + X[1-3] abbreviates + X1, X2, X3. + We assume this distributes over const &, to + yield &cc; code. + + 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. + + +
+ &array;s + +
+ Relationship Between &array; and &dynamicarray;s + + + + + + + + + &dynamicarray;s are subtypes of &array;s + + +
+ + Both &array;s and &dynamicarray;s have so many member + functions that their class boxes appear in separate diagrams. + 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. + + Implementation files are located within the src/Array directory. + +
+ &array; Diagram + + + + + + + + + &array; Class Diagram + + +
+ +
+ &dynamicarray; Diagram + + + + + + + + + &dynamicarray; Class Diagram + + +
+
+ + +
+ &field;s, &mesh;es, and ¢ering;s + + A &field; has a mesh and a centering. It is implemented in + src/Field/Field.h. + +
+ &field; + + + + + + + + + A &field; is like an &array; but having spatial + extent. + + +
+ + +
+ &mesh;es + + A mesh specifies a &field;'s spatial extent. A &mesh; class + only exists conceptually, but NoMesh and + UniformRectilinearMesh are defined within the + src/Field/Mesh + directory. + +
+ &mesh;es + + + + + + + + + The abstract Mesh class is realized by + NoMesh and UniformRectilinearMesh. + + +
+ +
+ <type>NoMesh</type> + + + + + + + + + If a &field; has a NoMesh mesh, it has no + spatial extent. + + +
+ + In the following figure, we abbreviate + UniformRectilinearMesh with + URM. + +
+ <type>UniformRectilinearMesh</type> + + + + + + + + + The UniformRectilinearMesh is the most + common &field; mesh. + + +
+
+ + +
+ ¢ering;s + + A ¢ering; specifies the location of values within a + cell. CanonicalCentering is a helper class returning + common centerings. Both are implemented within the src/Field subdirectory. + +
+ Centering Classes + + + + + + + + + CanonicalCentering returns commonly-used ¢ering;s. + + +
+
+ +
+ + +
+ &vector;s, &matrix;s, &tensor;s + + 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 VectorEngine, which has + no public interface. The only template specialization is + VectorEngine<D,T,Full>. &matrix;s are similar. + Tensors have four different engines, supporting the tensor + specializations of Antisymmetric, + Symmetric, and + Diagonal. + + All of the source files are located in the src/Tiny subdirectory. + +
+ &vector;s + + + + + + + + + &vector;s require VectorEngines. + + +
+ +
+ &matrix;s + + + + + + + + + &matrix;s require TinyMatrixEngines, + appearing in the next diagram. + + +
+ +
+ <type>TinyMatrixEngine</type>s + + + + + + + + + TinyMatrixEngines power &matrix;s. + + +
+ +
+ &tensor;s and <type>TensorEngine</type>s + + + + + + + + + &tensor;s require TensorEngines. + + +
+ +
+ <literal>Full</literal> and <literal>Diagonal</literal> <type>TensorEngine</type>s + + + + + + + + + Full &engine;s are the default + &tensor; &engine;s. Diagonal &tensor;s use its special &engine;. + + +
+ +
+ <literal>Antisymmetric</literal> and <literal>Symmetric</literal> <type>TensorEngine</type>s + + + + + + + + + More TensorEngine specializations. + + +
+
+ + +
+ &domain;s + + &domain;s and its subtypes are shown in . All classes are instantiated + from or subtypes of &domain;. As mentioned in , the Domain<1> + template instantiation has additional member functions. It uses + the Domain<1>::iterator. 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 Domain<1>. + + Implementation files are located within the src/Domain directory. + +
+ &domain;s + + + + + + + + + &domain;s + + +
+ +
+ + +
+ &engine;s + + &engine;s and its subtypes are shown in . Five subtypes of &engine;s + are shown. Details appear in subsequent diagrams. The + Engine class box shows no members because it has no + members. Only subtypes have members. More explanation of these + classes can be found in . The + implementation files in use the + [1-7] regular expression to indicate 1, 2, + …, or 7. + + Implementation files are located within the src/Engine directory. + +
+ &engine;s + + + + + + + + + Relationships among &engine;s + + +
+ +
+ &brick; and &compressiblebrick; &engine;s + + + + + + + + + &brick; and &compressiblebrick; &engine;s + + +
+ +
+ &dynamic; and &multipatch; &engine;s + + + + + + + + + &dynamic; and &multipatch; &engine;s + + +
+ +
+ &remote; &engine;s + + + + + + + + + &remote; &engine;s + + +
+ +
+ + +
+ Distributed Computation + + In this section, we present ¨ class diagrams for the + classes used when declaring distributed computation. We use + abbreviations in parameter lists: + +
+ Abbreviations + + + + + abbreviation + meaning + + + + + CM + ContextMapper + + + DT + DistributedTag + + + GL + GuardLayers + + + Iv + Interval + + + List_t + std::vector of pointers to Nodes of + &domain;s + + + PatchList_t + std::vector of Interval<Dim>s + + + RT + ReplicatedTag + + + SpTlLa + SparseTileLayout + + + +
+ + Partitions specify how a domain will be split into patches, + or pieces. + introduces the abstract Partition 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 src/Partition subdirectory. + +
+ Partitions + + + + + + + + + Four classes realize the abstract Partition class. + + +
+ +
+ Grid Partitions + + + + + + + + + Two partition classes use grids. + + +
+ +
+ Other Partitions + + + + + + + + + SpatialPartition and + TilePartition realize the abstract Partition + class. + + +
+ + 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 src/Layout subdirectory. + +
+ Guard Layers + + + + + + + + + GuardLayers surround patches. + + +
+ + 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 + src/Layout + subdirectory. + +
+ <type>DomainLayout</type> + + + + + + + + + DomainLayout + + +
+ +
+ <type>DynamicLayout</type> + + + + + + + + + DynamicLayout + + +
+ +
+ <type>GridLayout</type> + + + + + + + + + GridLayout + + +
+ +
+ <type>UniformGridLayout</type> + + + + + + + + + UniformGridLayout + + +
+ +
+ <type>SparseTileLayout</type> + + + + + + + + + SparseTileLayout + + +
+ + + 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 List_t abbreviates an + std::vector of pointers to Nodes of + &domain;s. GL abbreviates GuardLayers. + All files are relative to the src/Partition subdirectory. + +
+ Relationships Among Context Mappers + + + + + + + + + Five different mappers inherit from the base + ContextMapper. + + +
+ +
+ Context Mappers + + + + + + + + + Details of the five different mappers inheriting from + the base ContextMapper. + + +
+ +
+ 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) \\ Array(Array) \\ Array(Array, Domain) \\ ! initialize(Domain \ldots) \\ ! initialize(Domain \ldots, ModelElement) \\ ! 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) \\ ! Array(const Domain[1-2]\&, ModelElement) \\ ! Array(const Domain[1-3]\&, ModelElement) \\ ! Array(const Domain[1-4]\&, ModelElement) \\ ! Array(const Domain[1-5]\&, ModelElement) \\ ! Array(const Domain[1-6]\&, ModelElement) \\ ! Array(const Domain[1-7]\&, ModelElement) \\ ! 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) \\ ! void initialize(const Domain[1-2]\&, ModelElement) \\ ! void initialize(const Domain[1-3]\&, ModelElement) \\ ! void initialize(const Domain[1-4]\&, ModelElement) \\ ! void initialize(const Domain[1-5]\&, ModelElement) \\ ! void initialize(const Domain[1-6]\&, ModelElement) \\ ! void initialize(const Domain[1-7]\&, ModelElement) \\ ! 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) \\ DynamicArray(DynamicArray) \\ DynamicArray(DynamicArray, Domain) \\ ! initialize(Domain \ldots) \\ ! initialize(Domain \ldots, ModelElement) \\ ! read(\ldots) \\ ! operator()(\ldots) \\ domain() \\ physicalDomain() \\ totalDomain() \\ --- 118,153 ---- DynamicArray(Domain, ModelElement) \\ 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) \\ ! void initialize(const Domain[1-2]\&, ModelElement) \\ ! void initialize(const Domain[1-3]\&, ModelElement) \\ ! void initialize(const Domain[1-4]\&, ModelElement) \\ ! void initialize(const Domain[1-5]\&, ModelElement) \\ ! void initialize(const Domain[1-6]\&, ModelElement) \\ ! void initialize(const Domain[1-7]\&, ModelElement) \\ ! 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) \\ Array(Array) \\ Array(Array, Domain) \\ ! initialize(Domain \ldots) \\ ! initialize(Domain \ldots, ModelElement) \\ ! 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) \\ ! Array(const Domain[1-2]\&, ModelElement) \\ ! Array(const Domain[1-3]\&, ModelElement) \\ ! Array(const Domain[1-4]\&, ModelElement) \\ ! Array(const Domain[1-5]\&, ModelElement) \\ ! Array(const Domain[1-6]\&, ModelElement) \\ ! Array(const Domain[1-7]\&, ModelElement) \\ ! 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) \\ ! void initialize(const Domain[1-2]\&, ModelElement) \\ ! void initialize(const Domain[1-3]\&, ModelElement) \\ ! void initialize(const Domain[1-4]\&, ModelElement) \\ ! void initialize(const Domain[1-5]\&, ModelElement) \\ ! void initialize(const Domain[1-6]\&, ModelElement) \\ ! void initialize(const Domain[1-7]\&, ModelElement) \\ ! 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) \\ DynamicArray(DynamicArray) \\ DynamicArray(DynamicArray, Domain) \\ ! initialize(Domain \ldots) \\ ! initialize(Domain \ldots, ModelElement) \\ ! 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) \\ 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) \\ ! void initialize(const Domain[1-2]\&, ModelElement) \\ ! void initialize(const Domain[1-3]\&, ModelElement) \\ ! void initialize(const Domain[1-4]\&, ModelElement) \\ ! void initialize(const Domain[1-5]\&, ModelElement) \\ ! void initialize(const Domain[1-6]\&, ModelElement) \\ ! void initialize(const Domain[1-7]\&, ModelElement) \\ ! 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= 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\&) \\ + TilePartition(const PatchList\_t\&, const GL\&, const GL\&) \\ + 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\&) \\ + 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\¢eringType() \\ + 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 + boxit.vectorEngineFull[0](btex \classname{VectorEngine} 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\&) \\ + 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 + boxit.teFull[0](btex \classname{TensorEngine} etex); + boxit.teFull[1](btex etex); + boxit.teFull[2]( + btex \begin{lists} + TensorEngine() \\ + TensorEngine(const TensorEngine\&) \\ + 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 + boxit.teAntisymmetric[0](btex \classname{TensorEngine} etex); + boxit.teAntisymmetric[1](btex etex); + boxit.teAntisymmetric[2]( + btex \begin{lists} + TensorEngine() \\ + TensorEngine(const TensorEngine\&) \\ + 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 + boxit.teSymmetric[0](btex \classname{TensorEngine} etex); + boxit.teSymmetric[1](btex etex); + boxit.teSymmetric[2]( + btex \begin{lists} + TensorEngine() \\ + TensorEngine(const TensorEngine\&) \\ + 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 + boxit.teDiagonal[0](btex \classname{TensorEngine} etex); + boxit.teDiagonal[1](btex etex); + boxit.teDiagonal[2]( + btex \begin{lists} + TensorEngine() \\ + TensorEngine(const TensorEngine\&) \\ + 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\&) \\ + 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 + boxit.teFull[0](btex \classname{TensorEngine} etex); + boxit.teFull[1](btex etex); + boxit.teFull[2]( + btex \begin{lists} + TensorEngine() \\ + TensorEngine(const TensorEngine\&) \\ + 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 + boxit.teAntisymmetric[0](btex \classname{TensorEngine} etex); + boxit.teAntisymmetric[1](btex etex); + boxit.teAntisymmetric[2]( + btex \begin{lists} + TensorEngine() \\ + TensorEngine(const TensorEngine\&) \\ + 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 + boxit.teSymmetric[0](btex \classname{TensorEngine} etex); + boxit.teSymmetric[1](btex etex); + boxit.teSymmetric[2]( + btex \begin{lists} + TensorEngine() \\ + TensorEngine(const TensorEngine\&) \\ + 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 + boxit.teDiagonal[0](btex \classname{TensorEngine} etex); + boxit.teDiagonal[1](btex etex); + boxit.teDiagonal[2]( + btex \begin{lists} + TensorEngine() \\ + TensorEngine(const TensorEngine\&) \\ + 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\&) \\ + 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 + boxit.teFull[0](btex \classname{TensorEngine} etex); + boxit.teFull[1](btex etex); + boxit.teFull[2]( + btex \begin{lists} + TensorEngine() \\ + TensorEngine(const TensorEngine\&) \\ + 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 + boxit.teAntisymmetric[0](btex \classname{TensorEngine} etex); + boxit.teAntisymmetric[1](btex etex); + boxit.teAntisymmetric[2]( + btex \begin{lists} + TensorEngine() \\ + TensorEngine(const TensorEngine\&) \\ + 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 + boxit.teSymmetric[0](btex \classname{TensorEngine} etex); + boxit.teSymmetric[1](btex etex); + boxit.teSymmetric[2]( + btex \begin{lists} + TensorEngine() \\ + TensorEngine(const TensorEngine\&) \\ + 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 + boxit.teDiagonal[0](btex \classname{TensorEngine} etex); + boxit.teDiagonal[1](btex etex); + boxit.teDiagonal[2]( + btex \begin{lists} + TensorEngine() \\ + TensorEngine(const TensorEngine\&) \\ + 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 + boxit.matrixEngineFull[0](btex \classname{TinyMatrixEngine} etex); + boxit.matrixEngineFull[1](btex etex); + boxit.matrixEngineFull[2]( + btex \begin{lists} + TinyMatrixEngine() \\ + TinyMatrixEngine(const TinyMatrixEngine\&) \\ + 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 + boxit.matrixEngineFull[0](btex \classname{TinyMatrixEngine} etex); + boxit.matrixEngineFull[1](btex etex); + boxit.matrixEngineFull[2]( + btex \begin{lists} + TinyMatrixEngine() \\ + TinyMatrixEngine(const TinyMatrixEngine\&) \\ + 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) =