ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/OpenMD/branches/development/src/visitors/OtherVisitor.cpp
Revision: 1764
Committed: Tue Jul 3 18:32:27 2012 UTC (12 years, 10 months ago) by gezelter
File size: 16278 byte(s)
Log Message:
Refactored Snapshot and Stats to use the Accumulator classes.  Collected
a number of methods into Thermo that belonged there.

File Contents

# User Rev Content
1 gezelter 407 /*
2 gezelter 246 * Copyright (c) 2005 The University of Notre Dame. All Rights Reserved.
3     *
4     * The University of Notre Dame grants you ("Licensee") a
5     * non-exclusive, royalty free, license to use, modify and
6     * redistribute this software in source and binary code form, provided
7     * that the following conditions are met:
8     *
9 gezelter 1390 * 1. Redistributions of source code must retain the above copyright
10 gezelter 246 * notice, this list of conditions and the following disclaimer.
11     *
12 gezelter 1390 * 2. Redistributions in binary form must reproduce the above copyright
13 gezelter 246 * notice, this list of conditions and the following disclaimer in the
14     * documentation and/or other materials provided with the
15     * distribution.
16     *
17     * This software is provided "AS IS," without a warranty of any
18     * kind. All express or implied conditions, representations and
19     * warranties, including any implied warranty of merchantability,
20     * fitness for a particular purpose or non-infringement, are hereby
21     * excluded. The University of Notre Dame and its licensors shall not
22     * be liable for any damages suffered by licensee as a result of
23     * using, modifying or distributing the software or its
24     * derivatives. In no event will the University of Notre Dame or its
25     * licensors be liable for any lost revenue, profit or data, or for
26     * direct, indirect, special, consequential, incidental or punitive
27     * damages, however caused and regardless of the theory of liability,
28     * arising out of the use of or inability to use software, even if the
29     * University of Notre Dame has been advised of the possibility of
30     * such damages.
31 gezelter 1390 *
32     * SUPPORT OPEN SCIENCE! If you use OpenMD or its source code in your
33     * research, please cite the appropriate papers when you publish your
34     * work. Good starting points are:
35     *
36     * [1] Meineke, et al., J. Comp. Chem. 26, 252-271 (2005).
37     * [2] Fennell & Gezelter, J. Chem. Phys. 124, 234104 (2006).
38     * [3] Sun, Lin & Gezelter, J. Chem. Phys. 128, 24107 (2008).
39 gezelter 1665 * [4] Kuang & Gezelter, J. Chem. Phys. 133, 164101 (2010).
40     * [5] Vardeman, Stocker & Gezelter, J. Chem. Theory Comput. 7, 834 (2011).
41 gezelter 246 */
42 tim 324 #include "selection/SelectionManager.hpp"
43 tim 3 #include "visitors/OtherVisitor.hpp"
44     #include "primitives/DirectionalAtom.hpp"
45     #include "primitives/RigidBody.hpp"
46     #include "primitives/Molecule.hpp"
47     #include "brains/SimInfo.hpp"
48 gezelter 1764 #include "brains/Thermo.hpp"
49    
50 gezelter 1390 namespace OpenMD {
51 tim 132
52 gezelter 507 void WrappingVisitor::visit(Atom *atom) {
53     internalVisit(atom);
54     }
55 gezelter 246
56 gezelter 507 void WrappingVisitor::visit(DirectionalAtom *datom) {
57     internalVisit(datom);
58     }
59 gezelter 2
60 gezelter 507 void WrappingVisitor::visit(RigidBody *rb) {
61     internalVisit(rb);
62     }
63 gezelter 2
64 gezelter 507 void WrappingVisitor::internalVisit(StuntDouble *sd) {
65 gezelter 246 GenericData * data;
66     AtomData * atomData;
67     AtomInfo * atomInfo;
68     std::vector<AtomInfo *>::iterator i;
69 gezelter 2
70 gezelter 246 data = sd->getPropertyByName("ATOMDATA");
71 gezelter 2
72 gezelter 246 if (data != NULL) {
73 gezelter 507 atomData = dynamic_cast<AtomData *>(data);
74 gezelter 2
75 gezelter 507 if (atomData == NULL)
76     return;
77 gezelter 246 } else
78 gezelter 507 return;
79 gezelter 246
80     Snapshot* currSnapshot = info->getSnapshotManager()->getCurrentSnapshot();
81    
82 gezelter 1764 for( atomInfo = atomData->beginAtomInfo(i); atomInfo;
83     atomInfo = atomData->nextAtomInfo(i) ) {
84    
85 tim 543 Vector3d newPos = atomInfo->pos - origin_;
86     currSnapshot->wrapVector(newPos);
87     atomInfo->pos = newPos;
88 gezelter 1764
89 gezelter 246 }
90 gezelter 507 }
91 gezelter 2
92 tim 543 void WrappingVisitor::update() {
93     if (useCom_){
94 gezelter 1764 Thermo thermo(info);
95     origin_ = thermo.getCom();
96 tim 543 }
97     }
98    
99 gezelter 507 const std::string WrappingVisitor::toString() {
100 gezelter 246 char buffer[65535];
101     std::string result;
102 gezelter 2
103 gezelter 246 sprintf(buffer,
104     "------------------------------------------------------------------\n");
105     result += buffer;
106 gezelter 2
107 gezelter 246 sprintf(buffer, "Visitor name: %s\n", visitorName.c_str());
108     result += buffer;
109 gezelter 2
110 gezelter 246 sprintf(buffer,
111     "Visitor Description: wrapping atoms back to periodic box\n");
112     result += buffer;
113    
114     sprintf(buffer,
115     "------------------------------------------------------------------\n");
116     result += buffer;
117    
118     return result;
119 gezelter 507 }
120 gezelter 2
121 gezelter 507 //----------------------------------------------------------------------------//
122 gezelter 2
123 gezelter 507 ReplicateVisitor::ReplicateVisitor(SimInfo *info, Vector3i opt) :
124 gezelter 246 BaseVisitor() {
125 gezelter 507 this->info = info;
126     visitorName = "ReplicateVisitor";
127     this->replicateOpt = opt;
128 gezelter 246
129 gezelter 507 //generate the replicate directions
130     for( int i = 0; i <= replicateOpt[0]; i++ ) {
131 gezelter 246 for( int j = 0; j <= replicateOpt[1]; j++ ) {
132 gezelter 507 for( int k = 0; k <= replicateOpt[2]; k++ ) {
133     //skip original frame
134     if (i == 0 && j == 0 && k == 0) {
135     continue;
136     } else {
137     dir.push_back(Vector3i(i, j, k));
138     }
139     }
140 gezelter 246 }
141 gezelter 507 }
142    
143 gezelter 246 }
144    
145 gezelter 507 void ReplicateVisitor::visit(Atom *atom) {
146     internalVisit(atom);
147     }
148 gezelter 246
149 gezelter 507 void ReplicateVisitor::visit(DirectionalAtom *datom) {
150     internalVisit(datom);
151     }
152 gezelter 2
153 gezelter 507 void ReplicateVisitor::visit(RigidBody *rb) {
154     internalVisit(rb);
155     }
156 gezelter 2
157 gezelter 507 void ReplicateVisitor::internalVisit(StuntDouble *sd) {
158 gezelter 246 GenericData * data;
159     AtomData * atomData;
160 gezelter 2
161 gezelter 246 //if there is not atom data, just skip it
162     data = sd->getPropertyByName("ATOMDATA");
163 gezelter 2
164 gezelter 246 if (data != NULL) {
165 gezelter 507 atomData = dynamic_cast<AtomData *>(data);
166 gezelter 2
167 gezelter 507 if (atomData == NULL) {
168     return;
169     }
170 gezelter 246 } else {
171 gezelter 507 return;
172 gezelter 246 }
173    
174     Snapshot* currSnapshot = info->getSnapshotManager()->getCurrentSnapshot();
175     Mat3x3d box = currSnapshot->getHmat();
176    
177     std::vector<AtomInfo *> atomInfoList = atomData->getData();
178    
179     replicate(atomInfoList, atomData, box);
180 gezelter 507 }
181 gezelter 2
182 gezelter 507 void ReplicateVisitor::replicate(std::vector<AtomInfo *>&infoList, AtomData *data, const Mat3x3d& box) {
183 gezelter 246 AtomInfo* newAtomInfo;
184     std::vector<Vector3i>::iterator dirIter;
185     std::vector<AtomInfo *>::iterator i;
186 gezelter 2
187 gezelter 246 for( dirIter = dir.begin(); dirIter != dir.end(); ++dirIter ) {
188 gezelter 507 for( i = infoList.begin(); i != infoList.end(); i++ ) {
189     newAtomInfo = new AtomInfo();
190     *newAtomInfo = *(*i);
191 gezelter 2
192 gezelter 507 for( int j = 0; j < 3; j++ )
193     newAtomInfo->pos[j] += (*dirIter)[0]*box(j, 0) + (*dirIter)[1]*box(j, 1) + (*dirIter)[2]*box(j, 2);
194 gezelter 246
195 gezelter 507 data->addAtomInfo(newAtomInfo);
196     }
197 gezelter 246 } // end for(dirIter)
198 gezelter 507 }
199 gezelter 2
200 gezelter 507 const std::string ReplicateVisitor::toString() {
201 gezelter 246 char buffer[65535];
202     std::string result;
203     std::set<std::string>::iterator i;
204 gezelter 2
205 gezelter 246 sprintf(buffer,
206     "------------------------------------------------------------------\n");
207     result += buffer;
208 gezelter 2
209 gezelter 246 sprintf(buffer, "Visitor name: %s\n", visitorName.c_str());
210     result += buffer;
211 gezelter 2
212 gezelter 246 sprintf(buffer,
213     "Visitor Description: replicate the atoms in different direction\n");
214     result += buffer;
215 gezelter 2
216 gezelter 246 //print the replicate direction
217     sprintf(buffer, "repeatX = %d:\n", replicateOpt[0]);
218     result += buffer;
219 gezelter 2
220 gezelter 246 sprintf(buffer, "repeatY = %d:\n", replicateOpt[1]);
221     result += buffer;
222 gezelter 2
223 gezelter 246 sprintf(buffer, "repeatZ = %d:\n", replicateOpt[2]);
224     result += buffer;
225 gezelter 2
226 gezelter 246 sprintf(buffer,
227     "------------------------------------------------------------------\n");
228     result += buffer;
229    
230     return result;
231 gezelter 507 }
232 gezelter 2
233 gezelter 1456 //------------------------------------------------------------------------//
234 gezelter 2
235 gezelter 1456 XYZVisitor::XYZVisitor(SimInfo *info) : BaseVisitor(), seleMan(info),
236     evaluator(info), doPositions_(true),
237     doVelocities_(false),
238     doForces_(false), doVectors_(false),
239     doCharges_(false) {
240     this->info = info;
241     visitorName = "XYZVisitor";
242    
243     evaluator.loadScriptString("select all");
244    
245     if (!evaluator.isDynamic()) {
246     seleMan.setSelectionSet(evaluator.evaluate());
247 tim 413 }
248 gezelter 1456 }
249    
250 gezelter 507 XYZVisitor::XYZVisitor(SimInfo *info, const std::string& script) :
251 gezelter 1456 BaseVisitor(), seleMan(info), evaluator(info), doPositions_(true),
252     doVelocities_(false), doForces_(false), doVectors_(false),
253     doCharges_(false) {
254    
255     this->info = info;
256     visitorName = "XYZVisitor";
257    
258     evaluator.loadScriptString(script);
259    
260     if (!evaluator.isDynamic()) {
261     seleMan.setSelectionSet(evaluator.evaluate());
262 tim 413 }
263 gezelter 1456 }
264 tim 413
265 gezelter 507 void XYZVisitor::visit(Atom *atom) {
266 tim 293 if (isSelected(atom))
267 gezelter 507 internalVisit(atom);
268     }
269 gezelter 2
270 gezelter 507 void XYZVisitor::visit(DirectionalAtom *datom) {
271 tim 293 if (isSelected(datom))
272 gezelter 507 internalVisit(datom);
273     }
274 gezelter 1456
275 gezelter 507 void XYZVisitor::visit(RigidBody *rb) {
276 tim 293 if (isSelected(rb))
277 gezelter 507 internalVisit(rb);
278     }
279 gezelter 1456
280 gezelter 507 void XYZVisitor::update() {
281 tim 413 //if dynamic, we need to re-evaluate the selection
282     if (evaluator.isDynamic()) {
283 gezelter 507 seleMan.setSelectionSet(evaluator.evaluate());
284 tim 413 }
285 gezelter 507 }
286 gezelter 1456
287 gezelter 507 void XYZVisitor::internalVisit(StuntDouble *sd) {
288 gezelter 246 GenericData * data;
289     AtomData * atomData;
290     AtomInfo * atomInfo;
291     std::vector<AtomInfo *>::iterator i;
292     char buffer[1024];
293 gezelter 1456
294 gezelter 246 //if there is not atom data, just skip it
295     data = sd->getPropertyByName("ATOMDATA");
296 gezelter 1456
297 gezelter 246 if (data != NULL) {
298 gezelter 507 atomData = dynamic_cast<AtomData *>(data);
299 gezelter 1456
300 gezelter 507 if (atomData == NULL)
301     return;
302 gezelter 246 } else
303 gezelter 507 return;
304 gezelter 2
305 gezelter 1456 for( atomInfo = atomData->beginAtomInfo(i); atomInfo;
306     atomInfo = atomData->nextAtomInfo(i) ) {
307    
308     std::string line;
309     sprintf(buffer, "%s", atomInfo->atomTypeName.c_str());
310     line += buffer;
311    
312     if (doPositions_){
313     sprintf(buffer, "%15.8f%15.8f%15.8f", atomInfo->pos[0],
314     atomInfo->pos[1], atomInfo->pos[2]);
315     line += buffer;
316     }
317     if (doCharges_ && atomInfo->hasCharge) {
318     sprintf(buffer, "%15.8f", atomInfo->charge);
319     line += buffer;
320 chuckv 1118 }
321 gezelter 1456 if (doVectors_ && atomInfo->hasVector) {
322     sprintf(buffer, "%15.8f%15.8f%15.8f", atomInfo->vec[0],
323     atomInfo->vec[1], atomInfo->vec[2]);
324     line += buffer;
325 chuckv 1118 }
326 gezelter 1456 if (doVelocities_ && atomInfo->hasVelocity) {
327     sprintf(buffer, "%15.8f%15.8f%15.8f", atomInfo->vel[0],
328     atomInfo->vel[1], atomInfo->vel[2]);
329     line += buffer;
330     }
331     if (doForces_ && atomInfo->hasForce) {
332     sprintf(buffer, "%15.8f%15.8f%15.8f", atomInfo->frc[0],
333     atomInfo->frc[1], atomInfo->frc[2]);
334     line += buffer;
335     }
336     frame.push_back(line);
337     }
338 gezelter 507 }
339 gezelter 2
340 gezelter 507 bool XYZVisitor::isSelected(StuntDouble *sd) {
341 tim 413 return seleMan.isSelected(sd);
342 gezelter 507 }
343 gezelter 2
344 gezelter 507 void XYZVisitor::writeFrame(std::ostream &outStream) {
345 gezelter 246 std::vector<std::string>::iterator i;
346     char buffer[1024];
347 gezelter 1456
348 gezelter 246 if (frame.size() == 0)
349 gezelter 507 std::cerr << "Current Frame does not contain any atoms" << std::endl;
350 gezelter 1456
351 gezelter 246 //total number of atoms
352     outStream << frame.size() << std::endl;
353 gezelter 1456
354 gezelter 246 //write comment line
355     Snapshot* currSnapshot = info->getSnapshotManager()->getCurrentSnapshot();
356     Mat3x3d box = currSnapshot->getHmat();
357    
358     sprintf(buffer,
359     "%15.8f;%15.8f%15.8f%15.8f;%15.8f%15.8f%15.8f;%15.8f%15.8f%15.8f",
360     currSnapshot->getTime(),
361     box(0, 0), box(0, 1), box(0, 2),
362     box(1, 0), box(1, 1), box(1, 2),
363     box(2, 0), box(2, 1), box(2, 2));
364 gezelter 1456
365 gezelter 246 outStream << buffer << std::endl;
366 gezelter 1456
367 gezelter 246 for( i = frame.begin(); i != frame.end(); ++i )
368 gezelter 507 outStream << *i << std::endl;
369     }
370 gezelter 1456
371 cli2 1290 std::string XYZVisitor::trimmedName(const std::string&atomTypeName) {
372     return atomTypeName.substr(0, atomTypeName.find('-'));
373     }
374 gezelter 1456
375 gezelter 507 const std::string XYZVisitor::toString() {
376 gezelter 246 char buffer[65535];
377     std::string result;
378 gezelter 1456
379 gezelter 246 sprintf(buffer,
380     "------------------------------------------------------------------\n");
381     result += buffer;
382 gezelter 1456
383 gezelter 246 sprintf(buffer, "Visitor name: %s\n", visitorName.c_str());
384     result += buffer;
385 gezelter 1456
386 gezelter 246 sprintf(buffer,
387     "Visitor Description: assemble the atom data and output xyz file\n");
388     result += buffer;
389    
390     sprintf(buffer,
391     "------------------------------------------------------------------\n");
392     result += buffer;
393 gezelter 1456
394 gezelter 246 return result;
395 gezelter 507 }
396 gezelter 1456
397 gezelter 507 //----------------------------------------------------------------------------//
398 gezelter 1456
399 gezelter 507 void PrepareVisitor::internalVisit(Atom *atom) {
400 gezelter 246 GenericData *data;
401     AtomData * atomData;
402 gezelter 1456
403 gezelter 246 //if visited property is existed, remove it
404     data = atom->getPropertyByName("VISITED");
405 gezelter 1456
406 gezelter 246 if (data != NULL) {
407 gezelter 507 atom->removeProperty("VISITED");
408 gezelter 246 }
409 gezelter 1456
410 gezelter 246 //remove atomdata
411     data = atom->getPropertyByName("ATOMDATA");
412    
413     if (data != NULL) {
414 gezelter 507 atomData = dynamic_cast<AtomData *>(data);
415 gezelter 246
416 gezelter 507 if (atomData != NULL)
417     atom->removeProperty("ATOMDATA");
418 gezelter 246 }
419 gezelter 507 }
420 gezelter 2
421 gezelter 507 void PrepareVisitor::internalVisit(RigidBody *rb) {
422 gezelter 246 GenericData* data;
423     AtomData* atomData;
424     std::vector<Atom *> myAtoms;
425     std::vector<Atom *>::iterator atomIter;
426 gezelter 2
427 gezelter 246 //if visited property is existed, remove it
428     data = rb->getPropertyByName("VISITED");
429 gezelter 2
430 gezelter 246 if (data != NULL) {
431 gezelter 507 rb->removeProperty("VISITED");
432 gezelter 246 }
433    
434     //remove atomdata
435     data = rb->getPropertyByName("ATOMDATA");
436    
437     if (data != NULL) {
438 gezelter 507 atomData = dynamic_cast<AtomData *>(data);
439 gezelter 246
440 gezelter 507 if (atomData != NULL)
441     rb->removeProperty("ATOMDATA");
442 gezelter 246 }
443    
444     myAtoms = rb->getAtoms();
445    
446     for( atomIter = myAtoms.begin(); atomIter != myAtoms.end(); ++atomIter )
447 gezelter 507 internalVisit(*atomIter);
448     }
449 gezelter 2
450 gezelter 507 const std::string PrepareVisitor::toString() {
451     char buffer[65535];
452     std::string result;
453 tim 293
454 gezelter 507 sprintf(buffer,
455     "------------------------------------------------------------------\n");
456     result += buffer;
457 tim 293
458 gezelter 507 sprintf(buffer, "Visitor name: %s", visitorName.c_str());
459     result += buffer;
460 tim 293
461 gezelter 507 sprintf(buffer,
462     "Visitor Description: prepare for operation of other vistors\n");
463     result += buffer;
464 tim 293
465 gezelter 507 sprintf(buffer,
466     "------------------------------------------------------------------\n");
467     result += buffer;
468 tim 293
469 gezelter 507 return result;
470     }
471 gezelter 2
472 gezelter 507 //----------------------------------------------------------------------------//
473 gezelter 2
474 gezelter 507 WaterTypeVisitor::WaterTypeVisitor() {
475 gezelter 246 visitorName = "WaterTypeVisitor";
476     waterTypeList.insert("TIP3P_RB_0");
477     waterTypeList.insert("TIP4P_RB_0");
478 gezelter 1456 waterTypeList.insert("TIP4P-Ew_RB_0");
479 gezelter 246 waterTypeList.insert("TIP5P_RB_0");
480 gezelter 1456 waterTypeList.insert("TIP5P-E_RB_0");
481 gezelter 246 waterTypeList.insert("SPCE_RB_0");
482 gezelter 1456 waterTypeList.insert("SPC_RB_0");
483 gezelter 507 }
484 gezelter 2
485 gezelter 507 void WaterTypeVisitor::visit(RigidBody *rb) {
486 gezelter 246 std::string rbName;
487     std::vector<Atom *> myAtoms;
488     std::vector<Atom *>::iterator atomIter;
489     GenericData* data;
490     AtomData* atomData;
491     AtomInfo* atomInfo;
492     std::vector<AtomInfo *>::iterator i;
493 gezelter 2
494 gezelter 246 rbName = rb->getType();
495 gezelter 1456
496 gezelter 246 if (waterTypeList.find(rbName) != waterTypeList.end()) {
497 gezelter 507 myAtoms = rb->getAtoms();
498 gezelter 2
499 gezelter 507 for( atomIter = myAtoms.begin(); atomIter != myAtoms.end();
500     ++atomIter ) {
501     data = (*atomIter)->getPropertyByName("ATOMDATA");
502 gezelter 1456
503 gezelter 507 if (data != NULL) {
504     atomData = dynamic_cast<AtomData *>(data);
505 gezelter 1456
506 gezelter 507 if (atomData == NULL)
507     continue;
508     } else
509     continue;
510 gezelter 1456
511 gezelter 507 for( atomInfo = atomData->beginAtomInfo(i); atomInfo;
512     atomInfo = atomData->nextAtomInfo(i) ) {
513     atomInfo->atomTypeName = trimmedName(atomInfo->atomTypeName);
514     } //end for(atomInfo)
515     } //end for(atomIter)
516 gezelter 246 } //end if (waterTypeList.find(rbName) != waterTypeList.end())
517 gezelter 507 }
518 gezelter 2
519 gezelter 407 std::string WaterTypeVisitor::trimmedName(const std::string&atomTypeName) {
520     return atomTypeName.substr(0, atomTypeName.find('_'));
521     }
522 gezelter 2
523 gezelter 507 const std::string WaterTypeVisitor::toString() {
524 gezelter 246 char buffer[65535];
525     std::string result;
526 gezelter 2
527 gezelter 246 sprintf(buffer,
528     "------------------------------------------------------------------\n");
529     result += buffer;
530 gezelter 2
531 gezelter 246 sprintf(buffer, "Visitor name: %s\n", visitorName.c_str());
532     result += buffer;
533 gezelter 2
534 gezelter 246 sprintf(buffer,
535     "Visitor Description: Replace the atom type in water model\n");
536     result += buffer;
537 gezelter 2
538 gezelter 246 sprintf(buffer,
539     "------------------------------------------------------------------\n");
540     result += buffer;
541    
542     return result;
543 gezelter 507 }
544 gezelter 2
545 gezelter 1390 } //namespace OpenMD

Properties

Name Value
svn:executable *
svn:keywords Author Id Revision Date