ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/group/trunk/tengDissertation/Appendix.tex
(Generate patch)

Comparing trunk/tengDissertation/Appendix.tex (file contents):
Revision 2883 by tim, Sun Jun 25 17:39:42 2006 UTC vs.
Revision 2909 by tim, Thu Jun 29 23:00:35 2006 UTC

# Line 3 | Line 3 | community\cite{Wilson2006}. In the last 20 years , a l
3  
4   The absence of modern software development practices has been a
5   bottleneck limiting progress in the Scientific Computing
6 < community\cite{Wilson2006}. In the last 20 years , a large number of
6 > community\cite{Wilson2006}. In the last 20 years, a large number of
7   few MD packages\cite{Brooks1983, Vincent1995, Kale1999} were
8   developed to solve common MD problems and perform robust simulations
9   . Most of these are commercial programs that are either poorly
# Line 35 | Line 35 | extensive set of the STL and Fortran90 modules, {\sc B
35  
36   Mainly written by C++ and Fortran90, {\sc OOPSE} uses C++ Standard
37   Template Library (STL) and fortran modules as a foundation. As an
38 < extensive set of the STL and Fortran90 modules, {\sc Base Classes}
39 < provide generic implementations of mathematical objects (e.g.,
40 < matrices, vectors, polynomials, random number generators) and
38 > extensive set of the STL and Fortran90 modules, the {\sc Base
39 > Classes} provide generic implementations of mathematical objects
40 > (e.g., matrices, vectors, polynomials, random number generators) and
41   advanced data structures and algorithms(e.g., tuple, bitset, generic
42   data and string manipulation). The molecular data structures for the
43   representation of atoms, bonds, bends, torsions, rigid bodies and
# Line 52 | Line 52 | wide varieties of integration methods(see
52   meta-data files, which has been implemented using the ANother Tool
53   for Language Recognition(ANTLR)\cite{Parr1995, Schaps1999} syntax.
54   The Molecular Mechanics module consists of energy minimization and a
55 < wide varieties of integration methods(see
55 > wide variety of integration methods(see
56   Chap.~\ref{chapt:methodology}). The structure module contains a
57   flexible and powerful selection library which syntax is elaborated
58   in Sec.~\ref{appendixSection:syntax}. The top layer is made of the
59   main program of the package, \texttt{oopse} and it corresponding
60   parallel version \texttt{oopse\_MPI}, as well as other useful
61 < utilities, such as \texttt{StatProps} (see
61 > utilities, such as \texttt{StaticProps} (see
62   Sec.~\ref{appendixSection:StaticProps}), \texttt{DynamicProps} (see
63   Sec.~\ref{appendixSection:DynamicProps}), \texttt{Dump2XYZ} (see
64   Sec.~\ref{appendixSection:Dump2XYZ}), \texttt{Hydro} (see
# Line 74 | Line 74 | in software design. Although originated as an architec
74   \section{\label{appendixSection:desginPattern}Design Patterns}
75  
76   Design patterns are optimal solutions to commonly-occurring problems
77 < in software design. Although originated as an architectural concept
78 < for buildings and towns by Christopher Alexander
79 < \cite{Alexander1987}, software patterns first became popular with
80 < the wide acceptance of the book, Design Patterns: Elements of
81 < Reusable Object-Oriented Software \cite{Gamma1994}. Patterns reflect
82 < the experience, knowledge and insights of developers who have
83 < successfully used these patterns in their own work. Patterns are
84 < reusable. They provide a ready-made solution that can be adapted to
85 < different problems as necessary. As one of the latest advanced
86 < techniques to emerge from object-oriented community, design patterns
87 < were applied in some of the modern scientific software applications,
88 < such as JMol, {\sc OOPSE}\cite{Meineke2005} and
89 < PROTOMOL\cite{Matthey2004} \textit{etc}. The following sections
90 < enumerates some of the patterns used in {\sc OOPSE}.
77 > in software design. Although they originated as an architectural
78 > concept for buildings and towns by Christopher Alexander
79 > \cite{Alexander1987}, design patterns first became popular in
80 > software engineering with the wide acceptance of the book, Design
81 > Patterns: Elements of Reusable Object-Oriented Software
82 > \cite{Gamma1994}. Patterns reflect the experience, knowledge and
83 > insights of developers who have successfully used these patterns in
84 > their own work. Patterns are reusable. They provide a ready-made
85 > solution that can be adapted to different problems as necessary. As
86 > one of the latest advanced techniques to emerge from object-oriented
87 > community, design patterns were applied in some of the modern
88 > scientific software applications, such as JMol, {\sc
89 > OOPSE}\cite{Meineke2005} and PROTOMOL\cite{Matthey2004}
90 > \textit{etc}. The following sections enumerates some of the patterns
91 > used in {\sc OOPSE}.
92  
93   \subsection{\label{appendixSection:singleton}Singletons}
94  
# Line 95 | Line 96 | software designs, such as lifespan control \textit{etc
96   instantiation of a class to one object, but also provides a global
97   point of access to the object. Although the singleton pattern can be
98   implemented in various ways  to account for different aspects of the
99 < software designs, such as lifespan control \textit{etc}, we only use
99 > software design, such as lifespan control \textit{etc}, we only use
100   the static data approach in {\sc OOPSE}. The declaration and
101   implementation of IntegratorFactory class are given by declared in
102   List.~\ref{appendixScheme:singletonDeclaration} and
# Line 125 | Line 126 | algorithms used upon them by collecting related operat
126   \subsection{\label{appendixSection:visitorPattern}Visitor}
127  
128   The visitor pattern is designed to decouple the data structure and
129 < algorithms used upon them by collecting related operation from
129 > algorithms used upon them by collecting related operations from
130   element classes into other visitor classes, which is equivalent to
131   adding virtual functions into a set of classes without modifying
132   their interfaces. Fig.~\ref{appendixFig:visitorUML} demonstrates the
133   structure of a Visitor pattern which is used extensively in {\tt
134   Dump2XYZ}. In order to convert an OOPSE dump file, a series of
135   distinct operations are performed on different StuntDoubles (See the
136 < class hierarchy in Fig.~\ref{oopseFig:hierarchy} and the declaration
137 < in Scheme.~\ref{appendixScheme:element}). Since the hierarchies
138 < remain stable, it is easy to define a visit operation (see
139 < Scheme.~\ref{appendixScheme:visitor}) for each class of StuntDouble.
140 < Note that using Composite pattern\cite{Gamma1994}, CompositeVisitor
141 < manages a priority visitor list and handles the execution of every
142 < visitor in the priority list on different StuntDoubles.
136 > class hierarchy in Scheme.~\ref{oopseFig:hierarchy} and the
137 > declaration in Scheme.~\ref{appendixScheme:element}). Since the
138 > hierarchies remain stable, it is easy to define a visit operation
139 > (see Scheme.~\ref{appendixScheme:visitor}) for each class of
140 > StuntDouble. Note that by using the Composite
141 > pattern\cite{Gamma1994}, CompositeVisitor manages a priority visitor
142 > list and handles the execution of every visitor in the priority list
143 > on different StuntDoubles.
144  
145 < \begin{lstlisting}[float,caption={[A classic Singleton design pattern implementation(I)] The declaration of of simple Singleton pattern.},label={appendixScheme:singletonDeclaration}]
145 > \begin{figure}
146 > \centering
147 > \includegraphics[width=\linewidth]{visitor.eps}
148 > \caption[The UML class diagram of Visitor patten] {The UML class
149 > diagram of Visitor patten.} \label{appendixFig:visitorUML}
150 > \end{figure}
151  
152 < class IntegratorFactory { public:
153 <  static IntegratorFactory* getInstance(); protected:
152 > \begin{figure}
153 > \centering
154 > \includegraphics[width=\linewidth]{hierarchy.eps}
155 > \caption[Class hierarchy for ojects in {\sc OOPSE}]{ A diagram of
156 > the class hierarchy. Objects below others on the diagram inherit
157 > data structures and functions from their parent classes above them.}
158 > \label{oopseFig:hierarchy}
159 > \end{figure}
160 >
161 > \begin{lstlisting}[float,basicstyle=\ttfamily,caption={[A classic Singleton design pattern implementation(I)] The declaration of of simple Singleton pattern.},label={appendixScheme:singletonDeclaration}]
162 >
163 > class IntegratorFactory {
164 >  public:
165 >  static IntegratorFactory* getInstance();
166 >  protected:
167    IntegratorFactory();
168 < private:
169 <  static IntegratorFactory* instance_;
150 < };
168 >  private:
169 >  static IntegratorFactory* instance_; };
170  
171   \end{lstlisting}
172  
# Line 166 | Line 185 | class IntegratorFactory { public:
185  
186   \begin{lstlisting}[float,caption={[The implementation of Parameterized Factory pattern (I)]Source code of IntegratorFactory class.},label={appendixScheme:factoryDeclaration}]
187  
188 < class IntegratorFactory { public:
188 > class IntegratorFactory {
189 >  public:
190    typedef std::map<string, IntegratorCreator*> CreatorMapType;
191  
192 <  bool registerIntegrator(IntegratorCreator* creator) {
193 <    return creatorMap_.insert(creator->getIdent(), creator).second;
192 >  bool registerIntegrator(IntegratorCreator* creator){
193 >    return creatorMap_.insert(creator->getIdent(),creator).second;
194    }
195  
196    Integrator* createIntegrator(const string& id, SimInfo* info) {
# Line 191 | Line 211 | class IntegratorCreator {
211  
212   class IntegratorCreator {
213    public:
214 <    IntegratorCreator(const string& ident) : ident_(ident) {}
214 >  IntegratorCreator(const string& ident) : ident_(ident) {}
215  
216 <    const string& getIdent() const { return ident_; }
216 >  const string& getIdent() const { return ident_; }
217  
218 <    virtual Integrator* create(SimInfo* info) const = 0;
218 >  virtual Integrator* create(SimInfo* info) const = 0;
219  
220 < private:
221 <    string ident_;
220 >  private:
221 >  string ident_;
222   };
223  
224 < template<class ConcreteIntegrator> class IntegratorBuilder : public
225 < IntegratorCreator {
224 > template<class ConcreteIntegrator> class IntegratorBuilder :
225 > public IntegratorCreator {
226    public:
227 <    IntegratorBuilder(const string& ident)
227 >  IntegratorBuilder(const string& ident)
228                       : IntegratorCreator(ident) {}
229 <    virtual  Integrator* create(SimInfo* info) const {
230 <      return new ConcreteIntegrator(info);
231 <    }
229 >  virtual  Integrator* create(SimInfo* info) const {
230 >    return new ConcreteIntegrator(info);
231 >  }
232   };
233   \end{lstlisting}
234  
# Line 216 | Line 236 | class StuntDouble {
236  
237   class StuntDouble {
238    public:
239 <    virtual void accept(BaseVisitor* v) = 0;
239 >  virtual void accept(BaseVisitor* v) = 0;
240   };
241  
242   class Atom: public StuntDouble {
243    public:
244 <    virtual void accept{BaseVisitor* v*} {
245 <      v->visit(this);
246 <    }
244 >  virtual void accept{BaseVisitor* v*} {
245 >    v->visit(this);
246 >  }
247   };
248  
249   class DirectionalAtom: public Atom {
250    public:
251 <    virtual void accept{BaseVisitor* v*} {
252 <      v->visit(this);
253 <    }
251 >  virtual void accept{BaseVisitor* v*} {
252 >    v->visit(this);
253 >  }
254   };
255  
256   class RigidBody: public StuntDouble {
257    public:
258 <    virtual void accept{BaseVisitor* v*} {
259 <      v->visit(this);
260 <    }
258 >  virtual void accept{BaseVisitor* v*} {
259 >    v->visit(this);
260 >  }
261   };
262  
263   \end{lstlisting}
264  
265   \begin{lstlisting}[float,caption={[The implementation of Visitor pattern (I)]Source code of the visitor classes.},label={appendixScheme:visitor}]
246
266   class BaseVisitor{
267    public:
268 <    virtual void visit(Atom* atom);
269 <    virtual void visit(DirectionalAtom* datom);
270 <    virtual void visit(RigidBody* rb);
268 >  virtual void visit(Atom* atom);
269 >  virtual void visit(DirectionalAtom* datom);
270 >  virtual void visit(RigidBody* rb);
271   };
253
272   class BaseAtomVisitor:public BaseVisitor{
273    public:
274 <    virtual void visit(Atom* atom);
275 <    virtual void visit(DirectionalAtom* datom);
276 <    virtual void visit(RigidBody* rb);
274 >  virtual void visit(Atom* atom);
275 >  virtual void visit(DirectionalAtom* datom);
276 >  virtual void visit(RigidBody* rb);
277   };
260
278   class CompositeVisitor: public BaseVisitor {
279    public:
280    typedef list<pair<BaseVisitor*, int> > VistorListType;
# Line 265 | Line 282 | class CompositeVisitor: public BaseVisitor {
282    virtual void visit(Atom* atom) {
283      VisitorListIterator i;
284      BaseVisitor* curVisitor;
285 <    for(i = visitorScheme.begin();i != visitorScheme.end();++i) {
285 >    for(i = visitorScheme.begin();i != visitorScheme.end();++i)
286        atom->accept(*i);
270    }
287    }
272
288    virtual void visit(DirectionalAtom* datom) {
289      VisitorListIterator i;
290      BaseVisitor* curVisitor;
291 <    for(i = visitorScheme.begin();i != visitorScheme.end();++i) {
291 >    for(i = visitorList.begin();i != visitorList.end();++i)
292        atom->accept(*i);
278    }
293    }
280
294    virtual void visit(RigidBody* rb) {
295      VisitorListIterator i;
296      std::vector<Atom*> myAtoms;
297      std::vector<Atom*>::iterator ai;
298      myAtoms = rb->getAtoms();
299 <    for(i = visitorScheme.begin();i != visitorScheme.end();++i) {
299 >    for(i = visitorList.begin();i != visitorList.end();++i) {
300        rb->accept(*i);
301 <      for(ai = myAtoms.begin(); ai != myAtoms.end(); ++ai){
301 >      for(ai = myAtoms.begin(); ai != myAtoms.end(); ++ai)
302          (*ai)->accept(*i);
290      }
303      }
292
304    void addVisitor(BaseVisitor* v, int priority);
305    protected:
306 <    VistorListType visitorList;
306 >  VistorListType visitorList;
307   };
308   \end{lstlisting}
298
299 \begin{figure}
300 \centering
301 \includegraphics[width=\linewidth]{visitor.eps}
302 \caption[The UML class diagram of Visitor patten] {The UML class
303 diagram of Visitor patten.} \label{appendixFig:visitorUML}
304 \end{figure}
309  
306 \begin{figure}
307 \centering
308 \includegraphics[width=\linewidth]{hierarchy.eps}
309 \caption[Class hierarchy for ojects in {\sc OOPSE}]{ A diagram of
310 the class hierarchy. Objects below others on the diagram inherit
311 data structures and functions from their parent classes above them.}
312 \label{oopseFig:hierarchy}
313 \end{figure}
314
310   \section{\label{appendixSection:concepts}Concepts}
311  
312   OOPSE manipulates both traditional atoms as well as some objects
# Line 552 | Line 547 | Fig.~\ref{oopseFig:gofr}.
547  
548   The vectors (and angles) associated with these angular pair
549   distribution functions are most easily seen in
550 < Fig.~\ref{oopseFig:gofr}.
551 <
557 < The options available for {\tt StaticProps} are as follows:
558 < \begin{longtable}[c]{|EFG|}
559 < \caption{StaticProps Command-line Options}
560 < \\ \hline
561 < {\bf option} & {\bf verbose option} & {\bf behavior} \\ \hline
562 < \endhead
563 < \hline
564 < \endfoot
565 <  -h& {\tt -{}-help}                    &  Print help and exit \\
566 <  -V& {\tt -{}-version}                 &  Print version and exit \\
567 <  -i& {\tt -{}-input}          &  input dump file \\
568 <  -o& {\tt -{}-output}         &  output file name \\
569 <  -n& {\tt -{}-step}                &  process every n frame  (default=`1') \\
570 <  -r& {\tt -{}-nrbins}              &  number of bins for distance  (default=`100') \\
571 <  -a& {\tt -{}-nanglebins}          &  number of bins for cos(angle)  (default= `50') \\
572 <  -l& {\tt -{}-length}           &  maximum length (Defaults to 1/2 smallest length of first frame) \\
573 <    & {\tt -{}-sele1}   & select the first StuntDouble set \\
574 <    & {\tt -{}-sele2}   & select the second StuntDouble set \\
575 <    & {\tt -{}-sele3}   & select the third StuntDouble set \\
576 <    & {\tt -{}-refsele} & select reference (can only be used with {\tt -{}-gxyz}) \\
577 <    & {\tt -{}-molname}           & molecule name \\
578 <    & {\tt -{}-begin}                & begin internal index \\
579 <    & {\tt -{}-end}                  & end internal index \\
580 < \hline
581 < \multicolumn{3}{|l|}{One option from the following group of options is required:} \\
582 < \hline
583 <    &  {\tt -{}-gofr}                    &  $g(r)$ \\
584 <    &  {\tt -{}-r\_theta}                 &  $g(r, \cos(\theta))$ \\
585 <    &  {\tt -{}-r\_omega}                 &  $g(r, \cos(\omega))$ \\
586 <    &  {\tt -{}-theta\_omega}             &  $g(\cos(\theta), \cos(\omega))$ \\
587 <    &  {\tt -{}-gxyz}                    &  $g(x, y, z)$ \\
588 <    &  {\tt -{}-p2}                      &  $P_2$ order parameter ({\tt -{}-sele1} and {\tt -{}-sele2} must be specified) \\
589 <    &  {\tt -{}-scd}                     &  $S_{CD}$ order parameter(either {\tt -{}-sele1}, {\tt -{}-sele2}, {\tt -{}-sele3} are specified or {\tt -{}-molname}, {\tt -{}-begin}, {\tt -{}-end} are specified) \\
590 <    &  {\tt -{}-density}                 &  density plot ({\tt -{}-sele1} must be specified) \\
591 <    &  {\tt -{}-slab\_density}           &  slab density ({\tt -{}-sele1} must be specified)
592 < \end{longtable}
550 > Fig.~\ref{oopseFig:gofr}. The options available for {\tt
551 > StaticProps} are showed in Table.~\ref{appendix:staticPropsOptions}.
552  
553   \subsection{\label{appendixSection:DynamicProps}DynamicProps}
554  
# Line 629 | Line 588 | Fig.~\ref{oopseFig:dynamicPropsProcess}.
588   trajectory. Once the end is reached, the first block is freed then
589   incremented, until all frame pairs have been correlated in time.
590   This process is illustrated in
591 < Fig.~\ref{oopseFig:dynamicPropsProcess}.
591 > Fig.~\ref{oopseFig:dynamicPropsProcess} and the options available
592 > for DynamicProps are showed in
593 > Table.~\ref{appendix:dynamicPropsOptions}
594  
595   \begin{figure}
596   \centering
# Line 642 | Line 603 | The options available for DynamicProps are as follows:
603   \label{oopseFig:dynamicPropsProcess}
604   \end{figure}
605  
645 The options available for DynamicProps are as follows:
606   \begin{longtable}[c]{|EFG|}
607 < \caption{DynamicProps Command-line Options}
607 > \caption{STATICPROPS COMMAND-LINE OPTIONS}
608 > \label{appendix:staticPropsOptions}
609   \\ \hline
610   {\bf option} & {\bf verbose option} & {\bf behavior} \\ \hline
611   \endhead
612   \hline
613   \endfoot
614 +  -h& {\tt -{}-help}                    &  Print help and exit \\
615 +  -V& {\tt -{}-version}                 &  Print version and exit \\
616 +  -i& {\tt -{}-input}          &  input dump file \\
617 +  -o& {\tt -{}-output}         &  output file name \\
618 +  -n& {\tt -{}-step}                &  process every n frame  (default=`1') \\
619 +  -r& {\tt -{}-nrbins}              &  number of bins for distance  (default=`100') \\
620 +  -a& {\tt -{}-nanglebins}          &  number of bins for cos(angle)  (default= `50') \\
621 +  -l& {\tt -{}-length}           &  maximum length (Defaults to 1/2 smallest length of first frame) \\
622 +    & {\tt -{}-sele1}   & select the first StuntDouble set \\
623 +    & {\tt -{}-sele2}   & select the second StuntDouble set \\
624 +    & {\tt -{}-sele3}   & select the third StuntDouble set \\
625 +    & {\tt -{}-refsele} & select reference (can only be used with {\tt -{}-gxyz}) \\
626 +    & {\tt -{}-molname}           & molecule name \\
627 +    & {\tt -{}-begin}                & begin internal index \\
628 +    & {\tt -{}-end}                  & end internal index \\
629 + \hline
630 + \multicolumn{3}{|l|}{One option from the following group of options is required:} \\
631 + \hline
632 +    &  {\tt -{}-gofr}                    &  $g(r)$ \\
633 +    &  {\tt -{}-r\_theta}                 &  $g(r, \cos(\theta))$ \\
634 +    &  {\tt -{}-r\_omega}                 &  $g(r, \cos(\omega))$ \\
635 +    &  {\tt -{}-theta\_omega}             &  $g(\cos(\theta), \cos(\omega))$ \\
636 +    &  {\tt -{}-gxyz}                    &  $g(x, y, z)$ \\
637 +    &  {\tt -{}-p2}                      &  $P_2$ order parameter ({\tt -{}-sele1} and {\tt -{}-sele2} must be specified) \\
638 +    &  {\tt -{}-scd}                     &  $S_{CD}$ order parameter(either {\tt -{}-sele1}, {\tt -{}-sele2}, {\tt -{}-sele3} are specified or {\tt -{}-molname}, {\tt -{}-begin}, {\tt -{}-end} are specified) \\
639 +    &  {\tt -{}-density}                 &  density plot ({\tt -{}-sele1} must be specified) \\
640 +    &  {\tt -{}-slab\_density}           &  slab density ({\tt -{}-sele1} must be specified)
641 + \end{longtable}
642 +
643 + \begin{longtable}[c]{|EFG|}
644 + \caption{DYNAMICPROPS COMMAND-LINE OPTIONS}
645 + \label{appendix:dynamicPropsOptions}
646 + \\ \hline
647 + {\bf option} & {\bf verbose option} & {\bf behavior} \\ \hline
648 + \endhead
649 + \hline
650 + \endfoot
651    -h& {\tt -{}-help}                   & Print help and exit \\
652    -V& {\tt -{}-version}                & Print version and exit \\
653    -i& {\tt -{}-input}         & input dump file \\
# Line 673 | Line 671 | as follows:
671   and VMD\cite{Humphrey1996}. The options available for Dump2XYZ are
672   as follows:
673  
676
674   \begin{longtable}[c]{|EFG|}
675 < \caption{Dump2XYZ Command-line Options}
675 > \caption{DUMP2XYZ COMMAND-LINE OPTIONS}
676   \\ \hline
677   {\bf option} & {\bf verbose option} & {\bf behavior} \\ \hline
678   \endhead
# Line 709 | Line 706 | options available for Hydro are as follows:
706   the beads which are used to approximate the arbitrary shapes. The
707   options available for Hydro are as follows:
708   \begin{longtable}[c]{|EFG|}
709 < \caption{Hydrodynamics Command-line Options}
709 > \caption{HYDRODYNAMICS COMMAND-LINE OPTIONS}
710   \\ \hline
711   {\bf option} & {\bf verbose option} & {\bf behavior} \\ \hline
712   \endhead

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines