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 2685 by tim, Mon Apr 3 18:07:54 2006 UTC vs.
Revision 2825 by tim, Thu Jun 8 19:38:39 2006 UTC

# Line 1 | Line 1
1 < \chapter{\label{chapt:appendix}APPENDIX}
1 > \appendix
2 > \chapter{\label{chapt:oopse}Object-Oriented Parallel Simulation Engine}
3  
4 + Designing object-oriented software is hard, and designing reusable
5 + object-oriented scientific software is even harder. Absence of
6 + applying modern software development practices is the bottleneck of
7 + Scientific Computing community\cite{Wilson2006}. For instance, in
8 + the last 20 years , there are quite a few MD packages that were
9 + developed to solve common MD problems and perform robust simulations
10 + . However, many of the codes are legacy programs that are either
11 + poorly organized or extremely complex. Usually, these packages were
12 + contributed by scientists without official computer science
13 + training. The development of most MD applications are lack of strong
14 + coordination to enforce design and programming guidelines. Moreover,
15 + most MD programs also suffer from missing design and implement
16 + documents which is crucial to the maintenance and extensibility.
17 + Along the way of studying structural and dynamic processes in
18 + condensed phase systems like biological membranes and nanoparticles,
19 + we developed and maintained an Object-Oriented Parallel Simulation
20 + Engine ({\sc OOPSE}). This new molecular dynamics package has some
21 + unique features
22 + \begin{enumerate}
23 +  \item {\sc OOPSE} performs Molecular Dynamics (MD) simulations on non-standard
24 + atom types (transition metals, point dipoles, sticky potentials,
25 + Gay-Berne ellipsoids, or other "lumpy"atoms with orientational
26 + degrees of freedom), as well as rigid bodies.
27 +  \item {\sc OOPSE} uses a force-based decomposition algorithm using MPI on cheap
28 + Beowulf clusters to obtain very efficient parallelism.
29 +  \item {\sc OOPSE} integrates the equations of motion using advanced methods for
30 + orientational dynamics in NVE, NVT, NPT, NPAT, and NP$\gamma$T
31 + ensembles.
32 +  \item {\sc OOPSE} can carry out simulations on metallic systems using the
33 + Embedded Atom Method (EAM) as well as the Sutton-Chen potential.
34 +  \item {\sc OOPSE} can perform simulations on Gay-Berne liquid crystals.
35 +  \item  {\sc OOPSE} can simulate systems containing the extremely efficient
36 + extended-Soft Sticky Dipole (SSD/E) model for water.
37 + \end{enumerate}
38 +
39 + \section{\label{appendixSection:architecture }Architecture}
40 +
41 + Mainly written by \texttt{C/C++} and \texttt{Fortran90}, {\sc OOPSE}
42 + uses C++ Standard Template Library (STL) and fortran modules as the
43 + foundation. As an extensive set of the STL and Fortran90 modules,
44 + {\sc Base Classes} provide generic implementations of mathematical
45 + objects (e.g., matrices, vectors, polynomials, random number
46 + generators) and advanced data structures and algorithms(e.g., tuple,
47 + bitset, generic data, string manipulation). The molecular data
48 + structures for the representation of atoms, bonds, bends, torsions,
49 + rigid bodies and molecules \textit{etc} are contained in the {\sc
50 + Kernel} which is implemented with {\sc Base Classes} and are
51 + carefully designed to provide maximum extensibility and flexibility.
52 + The functionality required for applications is provide by the third
53 + layer which contains Input/Output, Molecular Mechanics and Structure
54 + modules. Input/Output module not only implements general methods for
55 + file handling, but also defines a generic force field interface.
56 + Another important component of Input/Output module is the meta-data
57 + file parser, which is rewritten using ANother Tool for Language
58 + Recognition(ANTLR)\cite{Parr1995, Schaps1999} syntax. The Molecular
59 + Mechanics module consists of energy minimization and a wide
60 + varieties of integration methods(see Chap.~\ref{chapt:methodology}).
61 + The structure module contains a flexible and powerful selection
62 + library which syntax is elaborated in
63 + Sec.~\ref{appendixSection:syntax}. The top layer is made of the main
64 + program of the package, \texttt{oopse} and it corresponding parallel
65 + version \texttt{oopse\_MPI}, as well as other useful utilities, such
66 + as \texttt{StatProps} (see Sec.~\ref{appendixSection:StaticProps}),
67 + \texttt{DynamicProps} (see
68 + Sec.~\ref{appendixSection:appendixSection:DynamicProps}),
69 + \texttt{Dump2XYZ} (see
70 + Sec.~\ref{appendixSection:appendixSection:Dump2XYZ}), \texttt{Hydro}
71 + (see Sec.~\ref{appendixSection:appendixSection:hydrodynamics})
72 + \textit{etc}.
73 +
74 + \begin{figure}
75 + \centering
76 + \includegraphics[width=\linewidth]{architecture.eps}
77 + \caption[The architecture of {\sc OOPSE}] {Overview of the structure
78 + of {\sc OOPSE}} \label{appendixFig:architecture}
79 + \end{figure}
80 +
81   \section{\label{appendixSection:desginPattern}Design Pattern}
82  
83 + Design patterns are optimal solutions to commonly-occurring problems
84 + in software design. Although originated as an architectural concept
85 + for buildings and towns by Christopher Alexander
86 + \cite{Alexander1987}, software patterns first became popular with
87 + the wide acceptance of the book, Design Patterns: Elements of
88 + Reusable Object-Oriented Software \cite{Gamma1994}. Patterns reflect
89 + the experience, knowledge and insights of developers who have
90 + successfully used these patterns in their own work. Patterns are
91 + reusable. They provide a ready-made solution that can be adapted to
92 + different problems as necessary. Pattern are expressive. they
93 + provide a common vocabulary of solutions that can express large
94 + solutions succinctly.
95  
96 < \subsection{\label{appendixSection:visitorPattern}Visitor Pattern}
96 > Patterns are usually described using a format that includes the
97 > following information:
98 > \begin{enumerate}
99 >  \item The \emph{name} that is commonly used for the pattern. Good pattern names form a vocabulary for
100 >  discussing conceptual abstractions. a pattern may have more than one commonly used or recognizable name
101 >  in the literature. In this case it is common practice to document these nicknames or synonyms under
102 >  the heading of \emph{Aliases} or \emph{Also Known As}.
103 >  \item The \emph{motivation} or \emph{context} that this pattern applies
104 >  to. Sometimes, it will include some prerequisites that should be satisfied before deciding to use a pattern
105 >  \item The \emph{solution} to the problem that the pattern
106 >  addresses. It describes how to construct the necessary work products. The description may include
107 >  pictures, diagrams and prose which identify the pattern's structure, its participants, and their
108 >  collaborations, to show how the problem is solved.
109 >  \item The \emph{consequences} of using the given solution to solve a
110 >  problem, both positive and negative.
111 > \end{enumerate}
112  
113 < \subsection{\label{appendixSection:templatePattern}Template Pattern}
113 > As one of the latest advanced techniques emerged from
114 > object-oriented community, design patterns were applied in some of
115 > the modern scientific software applications, such as JMol, {\sc
116 > OOPSE}\cite{Meineke05} and PROTOMOL\cite{Matthey05} \textit{etc}.
117 > The following sections enumerates some of the patterns used in {\sc
118 > OOPSE}.
119  
120 < \subsection{\label{appendixSection:factoryPattern}Factory Pattern}
120 > \subsection{\label{appendixSection:singleton}Singleton}
121 > The Singleton pattern not only provides a mechanism to restrict
122 > instantiation of a class to one object, but also provides a global
123 > point of access to the object. Currently implemented as a global
124 > variable, the logging utility which reports error and warning
125 > messages to the console in {\sc OOPSE} is a good candidate for
126 > applying the Singleton pattern to avoid the global namespace
127 > pollution.Although the singleton pattern can be implemented in
128 > various ways  to account for different aspects of the software
129 > designs, such as lifespan control \textit{etc}, we only use the
130 > static data approach in {\sc OOPSE}. {\tt IntegratorFactory} class
131 > is declared as
132 > \begin{lstlisting}[float,caption={[A classic Singleton design pattern implementation(I)] Declaration of {\tt IntegratorFactory} class.},label={appendixScheme:singletonDeclaration}]
133  
134 < \section{\label{appendixSection:hierarchy}Hierarchy}
134 > class IntegratorFactory {
135 >  public:
136 >    static IntegratorFactory* getInstance();
137 >    protected:
138 >      IntegratorFactory();
139 >    private:
140 >      static IntegratorFactory* instance_;
141 > };
142  
143 < \section{\label{appendixSection:selectionSyntax}Selection Syntax}
143 > \end{lstlisting}
144 > The corresponding implementation is
145 > \begin{lstlisting}[float,caption={[A classic implementation of Singleton design pattern (II)] Implementation of {\tt IntegratorFactory} class.},label={appendixScheme:singletonImplementation}]
146  
147 < \section{\label{appendixSection:hydrodynamics}Hydrodynamics}
147 > IntegratorFactory::instance_ = NULL;
148  
149 < \section{\label{appendixSection:analysisFramework}Analysis Framework}
149 > IntegratorFactory* getInstance() {
150 >  if (instance_ == NULL){
151 >    instance_ = new IntegratorFactory;
152 >  }
153 >  return instance_;
154 > }
155  
156 < \subsection{\label{appendixSection:staticProps}Factory Properties}
156 > \end{lstlisting}
157 > Since constructor is declared as {\tt protected}, a client can not
158 > instantiate {\tt IntegratorFactory} directly. Moreover, since the
159 > member function {\tt getInstance} serves as the only entry of access
160 > to {\tt IntegratorFactory}, this approach fulfills the basic
161 > requirement, a single instance. Another consequence of this approach
162 > is the automatic destruction since static data are destroyed upon
163 > program termination.
164  
165 < \subsection{\label{appendixSection:dynamicProps}Dynamics Properties}
165 > \subsection{\label{appendixSection:factoryMethod}Factory Method}
166 >
167 > Categoried as a creational pattern, the Factory Method pattern deals
168 > with the problem of creating objects without specifying the exact
169 > class of object that will be created. Factory Method is typically
170 > implemented by delegating the creation operation to the subclasses.
171 >
172 > Registers a creator with a type identifier. Looks up the type
173 > identifier in the internal map. If it is found, it invokes the
174 > corresponding creator for the type identifier and returns its
175 > result.
176 > \begin{lstlisting}[float,caption={[The implementation of Factory pattern (I)].},label={appendixScheme:factoryDeclaration}]
177 >
178 > class IntegratorFactory {
179 >  public:
180 >    typedef std::map<string, IntegratorCreator*> CreatorMapType;
181 >
182 >    bool registerIntegrator(IntegratorCreator* creator);
183 >
184 >    Integrator* createIntegrator(const string& id, SimInfo* info);
185 >
186 >  private:
187 >    CreatorMapType creatorMap_;
188 > };
189 >
190 > \end{lstlisting}
191 >
192 > \begin{lstlisting}[float,caption={[The implementation of Factory pattern (II)].},label={appendixScheme:factoryDeclarationImplementation}]
193 >
194 > bool IntegratorFactory::unregisterIntegrator(const string& id) {
195 >  return creatorMap_.erase(id) == 1;
196 > }
197 >
198 > Integrator* IntegratorFactory::createIntegrator(const string& id,
199 >                                                SimInfo* info) {
200 >  CreatorMapType::iterator i = creatorMap_.find(id);
201 >  if (i != creatorMap_.end()) {
202 >    return (i->second)->create(info);
203 >  } else {
204 >    return NULL;
205 >  }
206 > }
207 >
208 > \end{lstlisting}
209 >
210 > \begin{lstlisting}[float,caption={[The implementation of Factory pattern (III)].},label={appendixScheme:integratorCreator}]
211 >
212 > class IntegratorCreator {
213 >  public:
214 >    IntegratorCreator(const string& ident) : ident_(ident) {}
215 >
216 >    const string& getIdent() const { return ident_; }
217 >
218 >    virtual Integrator* create(SimInfo* info) const = 0;
219 >
220 >  private:
221 >    string ident_;
222 > };
223 >
224 > template<class ConcreteIntegrator>
225 > class IntegratorBuilder : public IntegratorCreator {
226 >  public:
227 >    IntegratorBuilder(const string& ident) : IntegratorCreator(ident) {}
228 >    virtual  Integrator* create(SimInfo* info) const {
229 >      return new ConcreteIntegrator(info);
230 >    }
231 > };
232 > \end{lstlisting}
233 >
234 > \subsection{\label{appendixSection:visitorPattern}Visitor}
235 >
236 > The purpose of the Visitor Pattern is to encapsulate an operation
237 > that you want to perform on the elements. The operation being
238 > performed on a structure can be switched without changing the
239 > interfaces  of the elements. In other words, one can add virtual
240 > functions into a set of classes without modifying their interfaces.
241 > The UML class diagram of Visitor patten is shown in
242 > Fig.~\ref{appendixFig:visitorUML}. {\tt Dump2XYZ} program in
243 > Sec.~\ref{appendixSection:Dump2XYZ} uses Visitor pattern
244 > extensively.
245 >
246 > \begin{figure}
247 > \centering
248 > \includegraphics[width=\linewidth]{architecture.eps}
249 > \caption[The architecture of {\sc OOPSE}] {Overview of the structure
250 > of {\sc OOPSE}} \label{appendixFig:visitorUML}
251 > \end{figure}
252 >
253 > \begin{lstlisting}[float,caption={[The implementation of Visitor pattern (I)]Source code of the visitor classes.},label={appendixScheme:visitor}]
254 >
255 > class BaseVisitor{
256 >  public:
257 >    virtual void visit(Atom* atom);
258 >    virtual void visit(DirectionalAtom* datom);
259 >    virtual void visit(RigidBody* rb);
260 > };
261 >
262 > \end{lstlisting}
263 >
264 > \begin{lstlisting}[float,caption={[The implementation of Visitor pattern (II)]Source code of the element classes.},label={appendixScheme:element}]
265 >
266 > class StuntDouble {
267 >  public:
268 >    virtual void accept(BaseVisitor* v) = 0;
269 > };
270 >
271 > class Atom: public StuntDouble {
272 >  public:
273 >    virtual void accept{BaseVisitor* v*} {
274 >      v->visit(this);
275 >    }
276 > };
277 >
278 > class DirectionalAtom: public Atom {
279 >  public:
280 >    virtual void accept{BaseVisitor* v*} {
281 >      v->visit(this);
282 >    }
283 > };
284 >
285 > class RigidBody: public StuntDouble {
286 >  public:
287 >    virtual void accept{BaseVisitor* v*} {
288 >      v->visit(this);
289 >    }
290 > };
291 >
292 > \end{lstlisting}
293 > \section{\label{appendixSection:concepts}Concepts}
294 >
295 > OOPSE manipulates both traditional atoms as well as some objects
296 > that {\it behave like atoms}.  These objects can be rigid
297 > collections of atoms or atoms which have orientational degrees of
298 > freedom.  Here is a diagram of the class heirarchy:
299 >
300 > \begin{figure}
301 > \centering
302 > \includegraphics[width=3in]{heirarchy.eps}
303 > \caption[Class heirarchy for StuntDoubles in {\sc oopse}-3.0]{ \\
304 > The class heirarchy of StuntDoubles in {\sc oopse}-3.0. The
305 > selection syntax allows the user to select any of the objects that
306 > are descended from a StuntDouble.} \label{oopseFig:heirarchy}
307 > \end{figure}
308 >
309 > \begin{itemize}
310 > \item A {\bf StuntDouble} is {\it any} object that can be manipulated by the
311 > integrators and minimizers.
312 > \item An {\bf Atom} is a fundamental point-particle that can be moved around during a simulation.
313 > \item A {\bf DirectionalAtom} is an atom which has {\it orientational} as well as translational degrees of freedom.
314 > \item A {\bf RigidBody} is a collection of {\bf Atom}s or {\bf
315 > DirectionalAtom}s which behaves as a single unit.
316 > \end{itemize}
317 >
318 > Every Molecule, Atom and DirectionalAtom in {\sc OOPSE} have their
319 > own names which are specified in the {\tt .md} file. In contrast,
320 > RigidBodies are denoted by their membership and index inside a
321 > particular molecule: [MoleculeName]\_RB\_[index] (the contents
322 > inside the brackets depend on the specifics of the simulation). The
323 > names of rigid bodies are generated automatically. For example, the
324 > name of the first rigid body in a DMPC molecule is DMPC\_RB\_0.
325 >
326 > \section{\label{appendixSection:syntax}Syntax of the Select Command}
327 >
328 > The most general form of the select command is: {\tt select {\it
329 > expression}}. This expression represents an arbitrary set of
330 > StuntDoubles (Atoms or RigidBodies) in {\sc OOPSE}. Expressions are
331 > composed of either name expressions, index expressions, predefined
332 > sets, user-defined expressions, comparison operators, within
333 > expressions, or logical combinations of the above expression types.
334 > Expressions can be combined using parentheses and the Boolean
335 > operators.
336 >
337 > \subsection{\label{appendixSection:logical}Logical expressions}
338 >
339 > The logical operators allow complex queries to be constructed out of
340 > simpler ones using the standard boolean connectives {\bf and}, {\bf
341 > or}, {\bf not}. Parentheses can be used to alter the precedence of
342 > the operators.
343 >
344 > \begin{center}
345 > \begin{tabular}{|ll|}
346 > \hline
347 > {\bf logical operator} & {\bf equivalent operator}  \\
348 > \hline
349 > and & ``\&'', ``\&\&'' \\
350 > or & ``$|$'', ``$||$'', ``,'' \\
351 > not & ``!''  \\
352 > \hline
353 > \end{tabular}
354 > \end{center}
355 >
356 > \subsection{\label{appendixSection:name}Name expressions}
357 >
358 > \begin{center}
359 > \begin{tabular}{|llp{2in}|}
360 > \hline {\bf type of expression} & {\bf examples} & {\bf translation
361 > of
362 > examples} \\
363 > \hline expression without ``.'' & select DMPC & select all
364 > StuntDoubles
365 > belonging to all DMPC molecules \\
366 > & select C* & select all atoms which have atom types beginning with C
367 > \\
368 > & select DMPC\_RB\_* & select all RigidBodies in DMPC molecules (but
369 > only select the rigid bodies, and not the atoms belonging to them). \\
370 > \hline expression has one ``.'' & select TIP3P.O\_TIP3P & select the
371 > O\_TIP3P
372 > atoms belonging to TIP3P molecules \\
373 > & select DMPC\_RB\_O.PO4 & select the PO4 atoms belonging to
374 > the first
375 > RigidBody in each DMPC molecule \\
376 > & select DMPC.20 & select the twentieth StuntDouble in each DMPC
377 > molecule \\
378 > \hline expression has two ``.''s & select DMPC.DMPC\_RB\_?.* &
379 > select all atoms
380 > belonging to all rigid bodies within all DMPC molecules \\
381 > \hline
382 > \end{tabular}
383 > \end{center}
384 >
385 > \subsection{\label{appendixSection:index}Index expressions}
386 >
387 > \begin{center}
388 > \begin{tabular}{|lp{4in}|}
389 > \hline
390 > {\bf examples} & {\bf translation of examples} \\
391 > \hline
392 > select 20 & select all of the StuntDoubles belonging to Molecule 20 \\
393 > select 20 to 30 & select all of the StuntDoubles belonging to
394 > molecules which have global indices between 20 (inclusive) and 30
395 > (exclusive) \\
396 > \hline
397 > \end{tabular}
398 > \end{center}
399 >
400 > \subsection{\label{appendixSection:predefined}Predefined sets}
401 >
402 > \begin{center}
403 > \begin{tabular}{|ll|}
404 > \hline
405 > {\bf keyword} & {\bf description} \\
406 > \hline
407 > all & select all StuntDoubles \\
408 > none & select none of the StuntDoubles \\
409 > \hline
410 > \end{tabular}
411 > \end{center}
412 >
413 > \subsection{\label{appendixSection:userdefined}User-defined expressions}
414 >
415 > Users can define arbitrary terms to represent groups of
416 > StuntDoubles, and then use the define terms in select commands. The
417 > general form for the define command is: {\bf define {\it term
418 > expression}}. Once defined, the user can specify such terms in
419 > boolean expressions
420 >
421 > {\tt define SSDWATER SSD or SSD1 or SSDRF}
422 >
423 > {\tt select SSDWATER}
424 >
425 > \subsection{\label{appendixSection:comparison}Comparison expressions}
426 >
427 > StuntDoubles can be selected by using comparision operators on their
428 > properties. The general form for the comparison command is: a
429 > property name, followed by a comparision operator and then a number.
430 >
431 > \begin{center}
432 > \begin{tabular}{|l|l|}
433 > \hline
434 > {\bf property} & mass, charge \\
435 > {\bf comparison operator} & ``$>$'', ``$<$'', ``$=$'', ``$>=$'',
436 > ``$<=$'', ``$!=$'' \\
437 > \hline
438 > \end{tabular}
439 > \end{center}
440 >
441 > For example, the phrase {\tt select mass > 16.0 and charge < -2}
442 > would select StuntDoubles which have mass greater than 16.0 and
443 > charges less than -2.
444 >
445 > \subsection{\label{appendixSection:within}Within expressions}
446 >
447 > The ``within'' keyword allows the user to select all StuntDoubles
448 > within the specified distance (in Angstroms) from a selection,
449 > including the selected atom itself. The general form for within
450 > selection is: {\tt select within(distance, expression)}
451 >
452 > For example, the phrase {\tt select within(2.5, PO4 or NC4)} would
453 > select all StuntDoubles which are within 2.5 angstroms of PO4 or NC4
454 > atoms.
455 >
456 >
457 > \section{\label{appendixSection:analysisFramework}Analysis Framework}
458 >
459 > \subsection{\label{appendixSection:StaticProps}StaticProps}
460 >
461 > {\tt StaticProps} can compute properties which are averaged over
462 > some or all of the configurations that are contained within a dump
463 > file. The most common example of a static property that can be
464 > computed is the pair distribution function between atoms of type $A$
465 > and other atoms of type $B$, $g_{AB}(r)$.  {\tt StaticProps} can
466 > also be used to compute the density distributions of other molecules
467 > in a reference frame {\it fixed to the body-fixed reference frame}
468 > of a selected atom or rigid body.
469 >
470 > There are five seperate radial distribution functions availiable in
471 > OOPSE. Since every radial distrbution function invlove the
472 > calculation between pairs of bodies, {\tt -{}-sele1} and {\tt
473 > -{}-sele2} must be specified to tell StaticProps which bodies to
474 > include in the calculation.
475 >
476 > \begin{description}
477 > \item[{\tt -{}-gofr}] Computes the pair distribution function,
478 > \begin{equation*}
479 > g_{AB}(r) = \frac{1}{\rho_B}\frac{1}{N_A} \langle \sum_{i \in A}
480 > \sum_{j \in B} \delta(r - r_{ij}) \rangle
481 > \end{equation*}
482 > \item[{\tt -{}-r\_theta}] Computes the angle-dependent pair distribution
483 > function. The angle is defined by the intermolecular vector
484 > $\vec{r}$ and $z$-axis of DirectionalAtom A,
485 > \begin{equation*}
486 > g_{AB}(r, \cos \theta) = \frac{1}{\rho_B}\frac{1}{N_A} \langle
487 > \sum_{i \in A} \sum_{j \in B} \delta(r - r_{ij}) \delta(\cos
488 > \theta_{ij} - \cos \theta)\rangle
489 > \end{equation*}
490 > \item[{\tt -{}-r\_omega}] Computes the angle-dependent pair distribution
491 > function. The angle is defined by the $z$-axes of the two
492 > DirectionalAtoms A and B.
493 > \begin{equation*}
494 > g_{AB}(r, \cos \omega) = \frac{1}{\rho_B}\frac{1}{N_A} \langle
495 > \sum_{i \in A} \sum_{j \in B} \delta(r - r_{ij}) \delta(\cos
496 > \omega_{ij} - \cos \omega)\rangle
497 > \end{equation*}
498 > \item[{\tt -{}-theta\_omega}] Computes the pair distribution in the angular
499 > space $\theta, \omega$ defined by the two angles mentioned above.
500 > \begin{equation*}
501 > g_{AB}(\cos\theta, \cos \omega) = \frac{1}{\rho_B}\frac{1}{N_A}
502 > \langle \sum_{i \in A} \sum_{j \in B} \langle \delta(\cos
503 > \theta_{ij} - \cos \theta) \delta(\cos \omega_{ij} - \cos
504 > \omega)\rangle
505 > \end{equation*}
506 > \item[{\tt -{}-gxyz}] Calculates the density distribution of particles of type
507 > B in the body frame of particle A. Therefore, {\tt -{}-originsele}
508 > and {\tt -{}-refsele} must be given to define A's internal
509 > coordinate set as the reference frame for the calculation.
510 > \end{description}
511 >
512 > The vectors (and angles) associated with these angular pair
513 > distribution functions are most easily seen in the figure below:
514 >
515 > \begin{figure}
516 > \centering
517 > \includegraphics[width=3in]{definition.eps}
518 > \caption[Definitions of the angles between directional objects]{ \\
519 > Any two directional objects (DirectionalAtoms and RigidBodies) have
520 > a set of two angles ($\theta$, and $\omega$) between the z-axes of
521 > their body-fixed frames.} \label{oopseFig:gofr}
522 > \end{figure}
523 >
524 > Due to the fact that the selected StuntDoubles from two selections
525 > may be overlapped, {\tt StaticProps} performs the calculation in
526 > three stages which are illustrated in
527 > Fig.~\ref{oopseFig:staticPropsProcess}.
528 >
529 > \begin{figure}
530 > \centering
531 > \includegraphics[width=\linewidth]{staticPropsProcess.eps}
532 > \caption[A representation of the three-stage correlations in
533 > \texttt{StaticProps}]{This diagram illustrates three-stage
534 > processing used by \texttt{StaticProps}. $S_1$ and $S_2$ are the
535 > numbers of selected stuntdobules from {\tt -{}-sele1} and {\tt
536 > -{}-sele2} respectively, while $C$ is the number of stuntdobules
537 > appearing at both sets. The first stage($S_1-C$ and $S_2$) and
538 > second stages ($S_1$ and $S_2-C$) are completely non-overlapping. On
539 > the contrary, the third stage($C$ and $C$) are completely
540 > overlapping} \label{oopseFig:staticPropsProcess}
541 > \end{figure}
542 >
543 > The options available for {\tt StaticProps} are as follows:
544 > \begin{longtable}[c]{|EFG|}
545 > \caption{StaticProps Command-line Options}
546 > \\ \hline
547 > {\bf option} & {\bf verbose option} & {\bf behavior} \\ \hline
548 > \endhead
549 > \hline
550 > \endfoot
551 >  -h& {\tt -{}-help}                    &  Print help and exit \\
552 >  -V& {\tt -{}-version}                 &  Print version and exit \\
553 >  -i& {\tt -{}-input}          &  input dump file \\
554 >  -o& {\tt -{}-output}         &  output file name \\
555 >  -n& {\tt -{}-step}                &  process every n frame  (default=`1') \\
556 >  -r& {\tt -{}-nrbins}              &  number of bins for distance  (default=`100') \\
557 >  -a& {\tt -{}-nanglebins}          &  number of bins for cos(angle)  (default= `50') \\
558 >  -l& {\tt -{}-length}           &  maximum length (Defaults to 1/2 smallest length of first frame) \\
559 >    & {\tt -{}-sele1}   & select the first StuntDouble set \\
560 >    & {\tt -{}-sele2}   & select the second StuntDouble set \\
561 >    & {\tt -{}-sele3}   & select the third StuntDouble set \\
562 >    & {\tt -{}-refsele} & select reference (can only be used with {\tt -{}-gxyz}) \\
563 >    & {\tt -{}-molname}           & molecule name \\
564 >    & {\tt -{}-begin}                & begin internal index \\
565 >    & {\tt -{}-end}                  & end internal index \\
566 > \hline
567 > \multicolumn{3}{|l|}{One option from the following group of options is required:} \\
568 > \hline
569 >    &  {\tt -{}-gofr}                    &  $g(r)$ \\
570 >    &  {\tt -{}-r\_theta}                 &  $g(r, \cos(\theta))$ \\
571 >    &  {\tt -{}-r\_omega}                 &  $g(r, \cos(\omega))$ \\
572 >    &  {\tt -{}-theta\_omega}             &  $g(\cos(\theta), \cos(\omega))$ \\
573 >    &  {\tt -{}-gxyz}                    &  $g(x, y, z)$ \\
574 >    &  {\tt -{}-p2}                      &  $P_2$ order parameter ({\tt -{}-sele1} and {\tt -{}-sele2} must be specified) \\
575 >    &  {\tt -{}-scd}                     &  $S_{CD}$ order parameter(either {\tt -{}-sele1}, {\tt -{}-sele2}, {\tt -{}-sele3} are specified or {\tt -{}-molname}, {\tt -{}-begin}, {\tt -{}-end} are specified) \\
576 >    &  {\tt -{}-density}                 &  density plot ({\tt -{}-sele1} must be specified) \\
577 >    &  {\tt -{}-slab\_density}           &  slab density ({\tt -{}-sele1} must be specified)
578 > \end{longtable}
579 >
580 > \subsection{\label{appendixSection:DynamicProps}DynamicProps}
581 >
582 > {\tt DynamicProps} computes time correlation functions from the
583 > configurations stored in a dump file.  Typical examples of time
584 > correlation functions are the mean square displacement and the
585 > velocity autocorrelation functions.   Once again, the selection
586 > syntax can be used to specify the StuntDoubles that will be used for
587 > the calculation.  A general time correlation function can be thought
588 > of as:
589 > \begin{equation}
590 > C_{AB}(t) = \langle \vec{u}_A(t) \cdot \vec{v}_B(0) \rangle
591 > \end{equation}
592 > where $\vec{u}_A(t)$ is a vector property associated with an atom of
593 > type $A$ at time $t$, and $\vec{v}_B(t^{\prime})$ is a different
594 > vector property associated with an atom of type $B$ at a different
595 > time $t^{\prime}$.  In most autocorrelation functions, the vector
596 > properties ($\vec{v}$ and $\vec{u}$) and the types of atoms ($A$ and
597 > $B$) are identical, and the three calculations built in to {\tt
598 > DynamicProps} make these assumptions.  It is possible, however, to
599 > make simple modifications to the {\tt DynamicProps} code to allow
600 > the use of {\it cross} time correlation functions (i.e. with
601 > different vectors).  The ability to use two selection scripts to
602 > select different types of atoms is already present in the code.
603 >
604 > For large simulations, the trajectory files can sometimes reach
605 > sizes in excess of several gigabytes. In order to effectively
606 > analyze that amount of data. In order to prevent a situation where
607 > the program runs out of memory due to large trajectories,
608 > \texttt{dynamicProps} will estimate the size of free memory at
609 > first, and determine the number of frames in each block, which
610 > allows the operating system to load two blocks of data
611 > simultaneously without swapping. Upon reading two blocks of the
612 > trajectory, \texttt{dynamicProps} will calculate the time
613 > correlation within the first block and the cross correlations
614 > between the two blocks. This second block is then freed and then
615 > incremented and the process repeated until the end of the
616 > trajectory. Once the end is reached, the first block is freed then
617 > incremented, until all frame pairs have been correlated in time.
618 > This process is illustrated in
619 > Fig.~\ref{oopseFig:dynamicPropsProcess}.
620 >
621 > \begin{figure}
622 > \centering
623 > \includegraphics[width=\linewidth]{dynamicPropsProcess.eps}
624 > \caption[A representation of the block correlations in
625 > \texttt{dynamicProps}]{This diagram illustrates block correlations
626 > processing in \texttt{dynamicProps}. The shaded region represents
627 > the self correlation of the block, and the open blocks are read one
628 > at a time and the cross correlations between blocks are calculated.}
629 > \label{oopseFig:dynamicPropsProcess}
630 > \end{figure}
631 >
632 > The options available for DynamicProps are as follows:
633 > \begin{longtable}[c]{|EFG|}
634 > \caption{DynamicProps Command-line Options}
635 > \\ \hline
636 > {\bf option} & {\bf verbose option} & {\bf behavior} \\ \hline
637 > \endhead
638 > \hline
639 > \endfoot
640 >  -h& {\tt -{}-help}                   & Print help and exit \\
641 >  -V& {\tt -{}-version}                & Print version and exit \\
642 >  -i& {\tt -{}-input}         & input dump file \\
643 >  -o& {\tt -{}-output}        & output file name \\
644 >    & {\tt -{}-sele1} & select first StuntDouble set \\
645 >    & {\tt -{}-sele2} & select second StuntDouble set (if sele2 is not set, use script from sele1) \\
646 > \hline
647 > \multicolumn{3}{|l|}{One option from the following group of options is required:} \\
648 > \hline
649 >  -r& {\tt -{}-rcorr}                  & compute mean square displacement \\
650 >  -v& {\tt -{}-vcorr}                  & compute velocity correlation function \\
651 >  -d& {\tt -{}-dcorr}                  & compute dipole correlation function
652 > \end{longtable}
653 >
654 > \section{\label{appendixSection:tools}Other Useful Utilities}
655 >
656 > \subsection{\label{appendixSection:Dump2XYZ}Dump2XYZ}
657 >
658 > {\tt Dump2XYZ} can transform an OOPSE dump file into a xyz file
659 > which can be opened by other molecular dynamics viewers such as Jmol
660 > and VMD\cite{Humphrey1996}. The options available for Dump2XYZ are
661 > as follows:
662 >
663 >
664 > \begin{longtable}[c]{|EFG|}
665 > \caption{Dump2XYZ Command-line Options}
666 > \\ \hline
667 > {\bf option} & {\bf verbose option} & {\bf behavior} \\ \hline
668 > \endhead
669 > \hline
670 > \endfoot
671 >  -h & {\tt -{}-help} &                        Print help and exit \\
672 >  -V & {\tt -{}-version} &                     Print version and exit \\
673 >  -i & {\tt -{}-input}  &             input dump file \\
674 >  -o & {\tt -{}-output} &             output file name \\
675 >  -n & {\tt -{}-frame}   &                 print every n frame  (default=`1') \\
676 >  -w & {\tt -{}-water}       &                 skip the the waters  (default=off) \\
677 >  -m & {\tt -{}-periodicBox} &                 map to the periodic box  (default=off)\\
678 >  -z & {\tt -{}-zconstraint}  &                replace the atom types of zconstraint molecules  (default=off) \\
679 >  -r & {\tt -{}-rigidbody}  &                  add a pseudo COM atom to rigidbody  (default=off) \\
680 >  -t & {\tt -{}-watertype} &                   replace the atom type of water model (default=on) \\
681 >  -b & {\tt -{}-basetype}  &                   using base atom type  (default=off) \\
682 >     & {\tt -{}-repeatX}  &                 The number of images to repeat in the x direction  (default=`0') \\
683 >     & {\tt -{}-repeatY} &                 The number of images to repeat in the y direction  (default=`0') \\
684 >     &  {\tt -{}-repeatZ}  &                The number of images to repeat in the z direction  (default=`0') \\
685 >  -s & {\tt -{}-selection} & By specifying {\tt -{}-selection}=``selection command'' with Dump2XYZ, the user can select an arbitrary set of StuntDoubles to be
686 > converted. \\
687 >     & {\tt -{}-originsele} & By specifying {\tt -{}-originsele}=``selection command'' with Dump2XYZ, the user can re-center the origin of the system around a specific StuntDouble \\
688 >     & {\tt -{}-refsele} &  In order to rotate the system, {\tt -{}-originsele} and {\tt -{}-refsele} must be given to define the new coordinate set. A StuntDouble which contains a dipole (the direction of the dipole is always (0, 0, 1) in body frame) is specified by {\tt -{}-originsele}. The new x-z plane is defined by the direction of the dipole and the StuntDouble is specified by {\tt -{}-refsele}.
689 > \end{longtable}
690 >
691 > \subsection{\label{appendixSection:hydrodynamics}Hydro}
692 >
693 > {\tt Hydro} can calculate resistance and diffusion tensors at the
694 > center of resistance. Both tensors at the center of diffusion can
695 > also be reported from the program, as well as the coordinates for
696 > the beads which are used to approximate the arbitrary shapes. The
697 > options available for Hydro are as follows:
698 > \begin{longtable}[c]{|EFG|}
699 > \caption{Hydrodynamics Command-line Options}
700 > \\ \hline
701 > {\bf option} & {\bf verbose option} & {\bf behavior} \\ \hline
702 > \endhead
703 > \hline
704 > \endfoot
705 >  -h & {\tt -{}-help} &                        Print help and exit \\
706 >  -V & {\tt -{}-version} &                     Print version and exit \\
707 >  -i & {\tt -{}-input}  &             input dump file \\
708 >  -o & {\tt -{}-output} &             output file prefix  (default=`hydro') \\
709 >  -b & {\tt -{}-beads}  &                   generate the beads only, hydrodynamics calculation will not be performed (default=off)\\
710 >     & {\tt -{}-model}  &                 hydrodynamics model (supports ``AnalyticalModel'', ``RoughShell'' and ``BeadModel'') \\
711 > \end{longtable}

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines