ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/OpenMD/trunk/src/applications/staticProps/NanoVolume.cpp
Revision: 1402
Committed: Fri Jan 8 17:15:27 2010 UTC (15 years, 3 months ago) by chuckv
File size: 5332 byte(s)
Log Message:
Added preliminary code for Alpha Hull calculation using qhull.
Added preliminary support to SMIPD to support Alpha Hull.
Alpha Hull does not yet add the correct things to triangle to be returned to SMPID. 
Preliminary changes for shadow hamiltonian integrator.
Chages to md files so they will work in openMD. 

File Contents

# User Rev Content
1 chuckv 1402 /* Copyright (c) 2006, 2009, 2010 The University of Notre Dame. All Rights Reserved.
2 chuckv 1181 *
3     * The University of Notre Dame grants you ("Licensee") a
4     * non-exclusive, royalty free, license to use, modify and
5     * redistribute this software in source and binary code form, provided
6     * that the following conditions are met:
7     *
8 gezelter 1390 * 1. Redistributions of source code must retain the above copyright
9 chuckv 1181 * notice, this list of conditions and the following disclaimer.
10     *
11 gezelter 1390 * 2. Redistributions in binary form must reproduce the above copyright
12 chuckv 1181 * notice, this list of conditions and the following disclaimer in the
13     * documentation and/or other materials provided with the
14     * distribution.
15     *
16     * This software is provided "AS IS," without a warranty of any
17     * kind. All express or implied conditions, representations and
18     * warranties, including any implied warranty of merchantability,
19     * fitness for a particular purpose or non-infringement, are hereby
20     * excluded. The University of Notre Dame and its licensors shall not
21     * be liable for any damages suffered by licensee as a result of
22     * using, modifying or distributing the software or its
23     * derivatives. In no event will the University of Notre Dame or its
24     * licensors be liable for any lost revenue, profit or data, or for
25     * direct, indirect, special, consequential, incidental or punitive
26     * damages, however caused and regardless of the theory of liability,
27     * arising out of the use of or inability to use software, even if the
28     * University of Notre Dame has been advised of the possibility of
29     * such damages.
30     *
31 gezelter 1390 * SUPPORT OPEN SCIENCE! If you use OpenMD or its source code in your
32     * research, please cite the appropriate papers when you publish your
33     * work. Good starting points are:
34     *
35     * [1] Meineke, et al., J. Comp. Chem. 26, 252-271 (2005).
36     * [2] Fennell & Gezelter, J. Chem. Phys. 124, 234104 (2006).
37     * [3] Sun, Lin & Gezelter, J. Chem. Phys. 128, 24107 (2008).
38     * [4] Vardeman & Gezelter, in progress (2009).
39 chuckv 1181 *
40 gezelter 1390 *
41 chuckv 1181 * NanoVolume.cpp
42     *
43     * Created by Charles F. Vardeman II on 14 Dec 2006.
44     * @author Charles F. Vardeman II
45 gezelter 1390 * @version $Id: NanoVolume.cpp,v 1.10 2009-11-25 20:01:59 gezelter Exp $
46 chuckv 1181 *
47     */
48    
49     #include "applications/staticProps/NanoVolume.hpp"
50     #include "math/ConvexHull.hpp"
51 chuckv 1402 #include "math/AlphaHull.hpp"
52 chuckv 1181 #include "utils/simError.h"
53     #include "io/DumpReader.hpp"
54     #include "primitives/Molecule.hpp"
55     #include "utils/NumericConstant.hpp"
56    
57 gezelter 1390 using namespace OpenMD;
58 chuckv 1181
59     NanoVolume::NanoVolume(SimInfo* info,
60     const std::string& filename,
61     const std::string& sele)
62     : StaticAnalyser(info, filename), selectionScript_(sele), evaluator_(info), seleMan_(info) {
63 chuckv 1194 setOutputName(getPrefix(filename) + ".avol");
64 chuckv 1181
65     evaluator_.loadScriptString(sele);
66     if (!evaluator_.isDynamic()) {
67     seleMan_.setSelectionSet(evaluator_.evaluate());
68     }
69 chuckv 1188 frameCounter_ = 0;
70     totalVolume_ = 0.0;
71 chuckv 1181 }
72    
73     void NanoVolume::process() {
74 gezelter 1382 #if defined(HAVE_QHULL)
75 chuckv 1181 Molecule* mol;
76     Atom* atom;
77     RigidBody* rb;
78     int myIndex;
79     SimInfo::MoleculeIterator mi;
80     Molecule::RigidBodyIterator rbIter;
81     Molecule::AtomIterator ai;
82     StuntDouble* sd;
83     Vector3d vec;
84     int i,j;
85    
86 chuckv 1199 #ifdef HAVE_QHULL
87 chuckv 1402 // ConvexHull* thishull = new ConvexHull();
88     AlphaHull* thishull = new AlphaHull(2.0);
89 chuckv 1199 #endif
90 chuckv 1181
91     DumpReader reader(info_, dumpFilename_);
92     int nFrames = reader.getNFrames();
93     frameCounter_ = 0;
94    
95 chuckv 1293 theAtoms_.reserve(info_->getNGlobalAtoms());
96 chuckv 1181
97     for (int istep = 0; istep < nFrames; istep += step_) {
98     reader.readFrame(istep);
99     frameCounter_++;
100     currentSnapshot_ = info_->getSnapshotManager()->getCurrentSnapshot();
101    
102     // Clear pos vector between each frame.
103 chuckv 1293 theAtoms_.clear();
104 chuckv 1181
105     if (evaluator_.isDynamic()) {
106     seleMan_.setSelectionSet(evaluator_.evaluate());
107     }
108    
109     // update the positions of atoms which belong to the rigidbodies
110    
111     for (mol = info_->beginMolecule(mi); mol != NULL;
112     mol = info_->nextMolecule(mi)) {
113     for (rb = mol->beginRigidBody(rbIter); rb != NULL;
114     rb = mol->nextRigidBody(rbIter)) {
115     rb->updateAtoms();
116     }
117     }
118    
119     // outer loop is over the selected StuntDoubles:
120 chuckv 1304
121 chuckv 1181 for (sd = seleMan_.beginSelected(i); sd != NULL;
122 chuckv 1293 sd = seleMan_.nextSelected(i)) {
123 chuckv 1181
124 chuckv 1304 theAtoms_.push_back(sd);
125 chuckv 1181 myIndex = sd->getGlobalIndex();
126    
127     }
128 chuckv 1304
129     /*
130 chuckv 1293 for (mol = info_->beginMolecule(mi); mol != NULL;
131     mol = info_->nextMolecule(mi)) {
132     for (atom = mol->beginAtom(ai); atom != NULL;
133     atom = mol->nextAtom(ai)) {
134     theAtoms_.push_back(atom);
135     }
136     }
137 chuckv 1304 */
138 chuckv 1181 // Generate convex hull for this frame.
139 chuckv 1293 thishull->computeHull(theAtoms_);
140 chuckv 1207 // totalVolume_ += hull->getVolume();
141 chuckv 1181 }
142 chuckv 1207 //RealType avgVolume = totalVolume_/(RealType) frameCounter_;
143 chuckv 1194 //std::cout.precision(7);
144     //std::cout << avgVolume << std::endl;
145 chuckv 1207 /*
146 chuckv 1194 std::ofstream osq(getOutputFileName().c_str());
147     osq.precision(7);
148     if (osq.is_open()){
149     osq << avgVolume << std::endl;
150    
151     }
152     osq.close();
153 chuckv 1207 */
154 cpuglis 1195 #else
155 gezelter 1382 sprintf(painCave.errMsg, "NanoVolume: qhull support was not compiled in!\n");
156 cpuglis 1195 painCave.isFatal = 1;
157     simError();
158 chuckv 1207
159 cpuglis 1195 #endif
160 chuckv 1207
161 chuckv 1181 }