ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/OpenMD/branches/development/src/visitors/OtherVisitor.cpp
Revision: 1874
Committed: Wed May 15 15:09:35 2013 UTC (11 years, 11 months ago) by gezelter
File size: 16407 byte(s)
Log Message:
Fixed a bunch of cppcheck warnings.

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 gezelter 1850 * [3] Sun, Lin & Gezelter, J. Chem. Phys. 128, 234107 (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 1874 for( i = infoList.begin(); i != infoList.end(); ++i ) {
189 gezelter 507 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 gezelter 2
204 gezelter 1874
205 gezelter 246 sprintf(buffer,
206 gezelter 1874 "--------------------------------------------------------------\n");
207 gezelter 246 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 gezelter 1874 "--------------------------------------------------------------\n");
228 gezelter 246 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 gezelter 1874 doCharges_(false),
240     doElectricFields_(false) {
241 gezelter 1456 this->info = info;
242     visitorName = "XYZVisitor";
243    
244     evaluator.loadScriptString("select all");
245    
246     if (!evaluator.isDynamic()) {
247     seleMan.setSelectionSet(evaluator.evaluate());
248 tim 413 }
249 gezelter 1456 }
250    
251 gezelter 507 XYZVisitor::XYZVisitor(SimInfo *info, const std::string& script) :
252 gezelter 1456 BaseVisitor(), seleMan(info), evaluator(info), doPositions_(true),
253     doVelocities_(false), doForces_(false), doVectors_(false),
254 gezelter 1874 doCharges_(false), doElectricFields_(false) {
255 gezelter 1456
256     this->info = info;
257     visitorName = "XYZVisitor";
258    
259     evaluator.loadScriptString(script);
260    
261     if (!evaluator.isDynamic()) {
262     seleMan.setSelectionSet(evaluator.evaluate());
263 tim 413 }
264 gezelter 1456 }
265 tim 413
266 gezelter 507 void XYZVisitor::visit(Atom *atom) {
267 tim 293 if (isSelected(atom))
268 gezelter 507 internalVisit(atom);
269     }
270 gezelter 2
271 gezelter 507 void XYZVisitor::visit(DirectionalAtom *datom) {
272 tim 293 if (isSelected(datom))
273 gezelter 507 internalVisit(datom);
274     }
275 gezelter 1456
276 gezelter 507 void XYZVisitor::visit(RigidBody *rb) {
277 tim 293 if (isSelected(rb))
278 gezelter 507 internalVisit(rb);
279     }
280 gezelter 1456
281 gezelter 507 void XYZVisitor::update() {
282 tim 413 //if dynamic, we need to re-evaluate the selection
283     if (evaluator.isDynamic()) {
284 gezelter 507 seleMan.setSelectionSet(evaluator.evaluate());
285 tim 413 }
286 gezelter 507 }
287 gezelter 1456
288 gezelter 507 void XYZVisitor::internalVisit(StuntDouble *sd) {
289 gezelter 246 GenericData * data;
290     AtomData * atomData;
291     AtomInfo * atomInfo;
292     std::vector<AtomInfo *>::iterator i;
293     char buffer[1024];
294 gezelter 1456
295 gezelter 246 //if there is not atom data, just skip it
296     data = sd->getPropertyByName("ATOMDATA");
297 gezelter 1456
298 gezelter 246 if (data != NULL) {
299 gezelter 507 atomData = dynamic_cast<AtomData *>(data);
300 gezelter 1456
301 gezelter 507 if (atomData == NULL)
302     return;
303 gezelter 246 } else
304 gezelter 507 return;
305 gezelter 2
306 gezelter 1456 for( atomInfo = atomData->beginAtomInfo(i); atomInfo;
307     atomInfo = atomData->nextAtomInfo(i) ) {
308    
309     std::string line;
310     sprintf(buffer, "%s", atomInfo->atomTypeName.c_str());
311     line += buffer;
312    
313     if (doPositions_){
314     sprintf(buffer, "%15.8f%15.8f%15.8f", atomInfo->pos[0],
315     atomInfo->pos[1], atomInfo->pos[2]);
316     line += buffer;
317     }
318     if (doCharges_ && atomInfo->hasCharge) {
319     sprintf(buffer, "%15.8f", atomInfo->charge);
320     line += buffer;
321 chuckv 1118 }
322 gezelter 1456 if (doVectors_ && atomInfo->hasVector) {
323     sprintf(buffer, "%15.8f%15.8f%15.8f", atomInfo->vec[0],
324     atomInfo->vec[1], atomInfo->vec[2]);
325     line += buffer;
326 chuckv 1118 }
327 gezelter 1456 if (doVelocities_ && atomInfo->hasVelocity) {
328     sprintf(buffer, "%15.8f%15.8f%15.8f", atomInfo->vel[0],
329     atomInfo->vel[1], atomInfo->vel[2]);
330     line += buffer;
331     }
332     if (doForces_ && atomInfo->hasForce) {
333     sprintf(buffer, "%15.8f%15.8f%15.8f", atomInfo->frc[0],
334     atomInfo->frc[1], atomInfo->frc[2]);
335     line += buffer;
336     }
337 gezelter 1871 if (doElectricFields_ && atomInfo->hasElectricField) {
338     sprintf(buffer, "%15.8f%15.8f%15.8f", atomInfo->eField[0],
339     atomInfo->eField[1], atomInfo->eField[2]);
340     line += buffer;
341     }
342 gezelter 1456 frame.push_back(line);
343     }
344 gezelter 507 }
345 gezelter 2
346 gezelter 507 bool XYZVisitor::isSelected(StuntDouble *sd) {
347 tim 413 return seleMan.isSelected(sd);
348 gezelter 507 }
349 gezelter 2
350 gezelter 507 void XYZVisitor::writeFrame(std::ostream &outStream) {
351 gezelter 246 std::vector<std::string>::iterator i;
352     char buffer[1024];
353 gezelter 1456
354 gezelter 1874 if (frame.empty())
355 gezelter 507 std::cerr << "Current Frame does not contain any atoms" << std::endl;
356 gezelter 1456
357 gezelter 246 //total number of atoms
358     outStream << frame.size() << std::endl;
359 gezelter 1456
360 gezelter 246 //write comment line
361     Snapshot* currSnapshot = info->getSnapshotManager()->getCurrentSnapshot();
362     Mat3x3d box = currSnapshot->getHmat();
363    
364     sprintf(buffer,
365     "%15.8f;%15.8f%15.8f%15.8f;%15.8f%15.8f%15.8f;%15.8f%15.8f%15.8f",
366     currSnapshot->getTime(),
367     box(0, 0), box(0, 1), box(0, 2),
368     box(1, 0), box(1, 1), box(1, 2),
369     box(2, 0), box(2, 1), box(2, 2));
370 gezelter 1456
371 gezelter 246 outStream << buffer << std::endl;
372 gezelter 1456
373 gezelter 246 for( i = frame.begin(); i != frame.end(); ++i )
374 gezelter 507 outStream << *i << std::endl;
375     }
376 gezelter 1456
377 cli2 1290 std::string XYZVisitor::trimmedName(const std::string&atomTypeName) {
378     return atomTypeName.substr(0, atomTypeName.find('-'));
379     }
380 gezelter 1456
381 gezelter 507 const std::string XYZVisitor::toString() {
382 gezelter 246 char buffer[65535];
383     std::string result;
384 gezelter 1456
385 gezelter 246 sprintf(buffer,
386     "------------------------------------------------------------------\n");
387     result += buffer;
388 gezelter 1456
389 gezelter 246 sprintf(buffer, "Visitor name: %s\n", visitorName.c_str());
390     result += buffer;
391 gezelter 1456
392 gezelter 246 sprintf(buffer,
393     "Visitor Description: assemble the atom data and output xyz file\n");
394     result += buffer;
395    
396     sprintf(buffer,
397     "------------------------------------------------------------------\n");
398     result += buffer;
399 gezelter 1456
400 gezelter 246 return result;
401 gezelter 507 }
402 gezelter 1456
403 gezelter 507 //----------------------------------------------------------------------------//
404 gezelter 1456
405 gezelter 507 void PrepareVisitor::internalVisit(Atom *atom) {
406 gezelter 246 GenericData *data;
407 gezelter 1456
408 gezelter 246 //if visited property is existed, remove it
409     data = atom->getPropertyByName("VISITED");
410 gezelter 1456
411 gezelter 246 if (data != NULL) {
412 gezelter 507 atom->removeProperty("VISITED");
413 gezelter 246 }
414 gezelter 1456
415 gezelter 246 //remove atomdata
416     data = atom->getPropertyByName("ATOMDATA");
417    
418     if (data != NULL) {
419 gezelter 1874 AtomData* atomData = dynamic_cast<AtomData *>(data);
420 gezelter 246
421 gezelter 507 if (atomData != NULL)
422     atom->removeProperty("ATOMDATA");
423 gezelter 246 }
424 gezelter 507 }
425 gezelter 2
426 gezelter 507 void PrepareVisitor::internalVisit(RigidBody *rb) {
427 gezelter 246 GenericData* data;
428     AtomData* atomData;
429     std::vector<Atom *> myAtoms;
430     std::vector<Atom *>::iterator atomIter;
431 gezelter 2
432 gezelter 246 //if visited property is existed, remove it
433     data = rb->getPropertyByName("VISITED");
434 gezelter 2
435 gezelter 246 if (data != NULL) {
436 gezelter 507 rb->removeProperty("VISITED");
437 gezelter 246 }
438    
439     //remove atomdata
440     data = rb->getPropertyByName("ATOMDATA");
441    
442     if (data != NULL) {
443 gezelter 507 atomData = dynamic_cast<AtomData *>(data);
444 gezelter 246
445 gezelter 507 if (atomData != NULL)
446     rb->removeProperty("ATOMDATA");
447 gezelter 246 }
448    
449     myAtoms = rb->getAtoms();
450    
451     for( atomIter = myAtoms.begin(); atomIter != myAtoms.end(); ++atomIter )
452 gezelter 507 internalVisit(*atomIter);
453     }
454 gezelter 2
455 gezelter 507 const std::string PrepareVisitor::toString() {
456     char buffer[65535];
457     std::string result;
458 tim 293
459 gezelter 507 sprintf(buffer,
460     "------------------------------------------------------------------\n");
461     result += buffer;
462 tim 293
463 gezelter 507 sprintf(buffer, "Visitor name: %s", visitorName.c_str());
464     result += buffer;
465 tim 293
466 gezelter 507 sprintf(buffer,
467     "Visitor Description: prepare for operation of other vistors\n");
468     result += buffer;
469 tim 293
470 gezelter 507 sprintf(buffer,
471     "------------------------------------------------------------------\n");
472     result += buffer;
473 tim 293
474 gezelter 507 return result;
475     }
476 gezelter 2
477 gezelter 507 //----------------------------------------------------------------------------//
478 gezelter 2
479 gezelter 507 WaterTypeVisitor::WaterTypeVisitor() {
480 gezelter 246 visitorName = "WaterTypeVisitor";
481     waterTypeList.insert("TIP3P_RB_0");
482     waterTypeList.insert("TIP4P_RB_0");
483 gezelter 1456 waterTypeList.insert("TIP4P-Ew_RB_0");
484 gezelter 246 waterTypeList.insert("TIP5P_RB_0");
485 gezelter 1456 waterTypeList.insert("TIP5P-E_RB_0");
486 gezelter 246 waterTypeList.insert("SPCE_RB_0");
487 gezelter 1456 waterTypeList.insert("SPC_RB_0");
488 gezelter 507 }
489 gezelter 2
490 gezelter 507 void WaterTypeVisitor::visit(RigidBody *rb) {
491 gezelter 246 std::string rbName;
492     std::vector<Atom *> myAtoms;
493     std::vector<Atom *>::iterator atomIter;
494 gezelter 1874 std::vector<AtomInfo *>::iterator i;
495 gezelter 246 AtomData* atomData;
496 gezelter 2
497 gezelter 246 rbName = rb->getType();
498 gezelter 1456
499 gezelter 246 if (waterTypeList.find(rbName) != waterTypeList.end()) {
500 gezelter 507 myAtoms = rb->getAtoms();
501 gezelter 1874
502 gezelter 507 for( atomIter = myAtoms.begin(); atomIter != myAtoms.end();
503     ++atomIter ) {
504 gezelter 1874 GenericData* data = (*atomIter)->getPropertyByName("ATOMDATA");
505 gezelter 1456
506 gezelter 507 if (data != NULL) {
507     atomData = dynamic_cast<AtomData *>(data);
508 gezelter 1456
509 gezelter 507 if (atomData == NULL)
510     continue;
511     } else
512     continue;
513 gezelter 1456
514 gezelter 1874 for( AtomInfo* atomInfo = atomData->beginAtomInfo(i); atomInfo;
515 gezelter 507 atomInfo = atomData->nextAtomInfo(i) ) {
516     atomInfo->atomTypeName = trimmedName(atomInfo->atomTypeName);
517 gezelter 1874 }
518     }
519     }
520 gezelter 507 }
521 gezelter 2
522 gezelter 407 std::string WaterTypeVisitor::trimmedName(const std::string&atomTypeName) {
523     return atomTypeName.substr(0, atomTypeName.find('_'));
524     }
525 gezelter 2
526 gezelter 507 const std::string WaterTypeVisitor::toString() {
527 gezelter 246 char buffer[65535];
528     std::string result;
529 gezelter 2
530 gezelter 246 sprintf(buffer,
531     "------------------------------------------------------------------\n");
532     result += buffer;
533 gezelter 2
534 gezelter 246 sprintf(buffer, "Visitor name: %s\n", visitorName.c_str());
535     result += buffer;
536 gezelter 2
537 gezelter 246 sprintf(buffer,
538     "Visitor Description: Replace the atom type in water model\n");
539     result += buffer;
540 gezelter 2
541 gezelter 246 sprintf(buffer,
542     "------------------------------------------------------------------\n");
543     result += buffer;
544    
545     return result;
546 gezelter 507 }
547 gezelter 2
548 gezelter 1390 } //namespace OpenMD

Properties

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