ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/OpenMD/branches/development/src/visitors/OtherVisitor.cpp
Revision: 1875
Committed: Fri May 17 14:41:42 2013 UTC (11 years, 11 months ago) by gezelter
File size: 16391 byte(s)
Log Message:
Fixed a bunch of stylistic and performance issues discovered via cppcheck.

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 1875 BaseVisitor(), replicateOpt(opt) {
125 gezelter 507 this->info = info;
126     visitorName = "ReplicateVisitor";
127 gezelter 246
128 gezelter 507 //generate the replicate directions
129     for( int i = 0; i <= replicateOpt[0]; i++ ) {
130 gezelter 246 for( int j = 0; j <= replicateOpt[1]; j++ ) {
131 gezelter 507 for( int k = 0; k <= replicateOpt[2]; k++ ) {
132     //skip original frame
133     if (i == 0 && j == 0 && k == 0) {
134     continue;
135     } else {
136     dir.push_back(Vector3i(i, j, k));
137     }
138     }
139 gezelter 246 }
140 gezelter 507 }
141    
142 gezelter 246 }
143    
144 gezelter 507 void ReplicateVisitor::visit(Atom *atom) {
145     internalVisit(atom);
146     }
147 gezelter 246
148 gezelter 507 void ReplicateVisitor::visit(DirectionalAtom *datom) {
149     internalVisit(datom);
150     }
151 gezelter 2
152 gezelter 507 void ReplicateVisitor::visit(RigidBody *rb) {
153     internalVisit(rb);
154     }
155 gezelter 2
156 gezelter 507 void ReplicateVisitor::internalVisit(StuntDouble *sd) {
157 gezelter 246 GenericData * data;
158     AtomData * atomData;
159 gezelter 2
160 gezelter 246 //if there is not atom data, just skip it
161     data = sd->getPropertyByName("ATOMDATA");
162 gezelter 2
163 gezelter 246 if (data != NULL) {
164 gezelter 507 atomData = dynamic_cast<AtomData *>(data);
165 gezelter 2
166 gezelter 507 if (atomData == NULL) {
167     return;
168     }
169 gezelter 246 } else {
170 gezelter 507 return;
171 gezelter 246 }
172    
173     Snapshot* currSnapshot = info->getSnapshotManager()->getCurrentSnapshot();
174     Mat3x3d box = currSnapshot->getHmat();
175    
176     std::vector<AtomInfo *> atomInfoList = atomData->getData();
177    
178     replicate(atomInfoList, atomData, box);
179 gezelter 507 }
180 gezelter 2
181 gezelter 507 void ReplicateVisitor::replicate(std::vector<AtomInfo *>&infoList, AtomData *data, const Mat3x3d& box) {
182 gezelter 246 AtomInfo* newAtomInfo;
183     std::vector<Vector3i>::iterator dirIter;
184     std::vector<AtomInfo *>::iterator i;
185 gezelter 2
186 gezelter 246 for( dirIter = dir.begin(); dirIter != dir.end(); ++dirIter ) {
187 gezelter 1874 for( i = infoList.begin(); i != infoList.end(); ++i ) {
188 gezelter 507 newAtomInfo = new AtomInfo();
189     *newAtomInfo = *(*i);
190 gezelter 2
191 gezelter 507 for( int j = 0; j < 3; j++ )
192     newAtomInfo->pos[j] += (*dirIter)[0]*box(j, 0) + (*dirIter)[1]*box(j, 1) + (*dirIter)[2]*box(j, 2);
193 gezelter 246
194 gezelter 507 data->addAtomInfo(newAtomInfo);
195     }
196 gezelter 246 } // end for(dirIter)
197 gezelter 507 }
198 gezelter 2
199 gezelter 507 const std::string ReplicateVisitor::toString() {
200 gezelter 246 char buffer[65535];
201     std::string result;
202 gezelter 2
203 gezelter 1874
204 gezelter 246 sprintf(buffer,
205 gezelter 1874 "--------------------------------------------------------------\n");
206 gezelter 246 result += buffer;
207 gezelter 2
208 gezelter 246 sprintf(buffer, "Visitor name: %s\n", visitorName.c_str());
209     result += buffer;
210 gezelter 2
211 gezelter 246 sprintf(buffer,
212     "Visitor Description: replicate the atoms in different direction\n");
213     result += buffer;
214 gezelter 2
215 gezelter 246 //print the replicate direction
216     sprintf(buffer, "repeatX = %d:\n", replicateOpt[0]);
217     result += buffer;
218 gezelter 2
219 gezelter 246 sprintf(buffer, "repeatY = %d:\n", replicateOpt[1]);
220     result += buffer;
221 gezelter 2
222 gezelter 246 sprintf(buffer, "repeatZ = %d:\n", replicateOpt[2]);
223     result += buffer;
224 gezelter 2
225 gezelter 246 sprintf(buffer,
226 gezelter 1874 "--------------------------------------------------------------\n");
227 gezelter 246 result += buffer;
228    
229     return result;
230 gezelter 507 }
231 gezelter 2
232 gezelter 1456 //------------------------------------------------------------------------//
233 gezelter 2
234 gezelter 1456 XYZVisitor::XYZVisitor(SimInfo *info) : BaseVisitor(), seleMan(info),
235     evaluator(info), doPositions_(true),
236     doVelocities_(false),
237     doForces_(false), doVectors_(false),
238 gezelter 1874 doCharges_(false),
239     doElectricFields_(false) {
240 gezelter 1456 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 gezelter 1874 doCharges_(false), doElectricFields_(false) {
254 gezelter 1456
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 gezelter 1871 if (doElectricFields_ && atomInfo->hasElectricField) {
337     sprintf(buffer, "%15.8f%15.8f%15.8f", atomInfo->eField[0],
338     atomInfo->eField[1], atomInfo->eField[2]);
339     line += buffer;
340     }
341 gezelter 1456 frame.push_back(line);
342     }
343 gezelter 507 }
344 gezelter 2
345 gezelter 507 bool XYZVisitor::isSelected(StuntDouble *sd) {
346 tim 413 return seleMan.isSelected(sd);
347 gezelter 507 }
348 gezelter 2
349 gezelter 507 void XYZVisitor::writeFrame(std::ostream &outStream) {
350 gezelter 246 std::vector<std::string>::iterator i;
351     char buffer[1024];
352 gezelter 1456
353 gezelter 1874 if (frame.empty())
354 gezelter 507 std::cerr << "Current Frame does not contain any atoms" << std::endl;
355 gezelter 1456
356 gezelter 246 //total number of atoms
357     outStream << frame.size() << std::endl;
358 gezelter 1456
359 gezelter 246 //write comment line
360     Snapshot* currSnapshot = info->getSnapshotManager()->getCurrentSnapshot();
361     Mat3x3d box = currSnapshot->getHmat();
362    
363     sprintf(buffer,
364     "%15.8f;%15.8f%15.8f%15.8f;%15.8f%15.8f%15.8f;%15.8f%15.8f%15.8f",
365     currSnapshot->getTime(),
366     box(0, 0), box(0, 1), box(0, 2),
367     box(1, 0), box(1, 1), box(1, 2),
368     box(2, 0), box(2, 1), box(2, 2));
369 gezelter 1456
370 gezelter 246 outStream << buffer << std::endl;
371 gezelter 1456
372 gezelter 246 for( i = frame.begin(); i != frame.end(); ++i )
373 gezelter 507 outStream << *i << std::endl;
374     }
375 gezelter 1456
376 cli2 1290 std::string XYZVisitor::trimmedName(const std::string&atomTypeName) {
377     return atomTypeName.substr(0, atomTypeName.find('-'));
378     }
379 gezelter 1456
380 gezelter 507 const std::string XYZVisitor::toString() {
381 gezelter 246 char buffer[65535];
382     std::string result;
383 gezelter 1456
384 gezelter 246 sprintf(buffer,
385     "------------------------------------------------------------------\n");
386     result += buffer;
387 gezelter 1456
388 gezelter 246 sprintf(buffer, "Visitor name: %s\n", visitorName.c_str());
389     result += buffer;
390 gezelter 1456
391 gezelter 246 sprintf(buffer,
392     "Visitor Description: assemble the atom data and output xyz file\n");
393     result += buffer;
394    
395     sprintf(buffer,
396     "------------------------------------------------------------------\n");
397     result += buffer;
398 gezelter 1456
399 gezelter 246 return result;
400 gezelter 507 }
401 gezelter 1456
402 gezelter 507 //----------------------------------------------------------------------------//
403 gezelter 1456
404 gezelter 507 void PrepareVisitor::internalVisit(Atom *atom) {
405 gezelter 246 GenericData *data;
406 gezelter 1456
407 gezelter 246 //if visited property is existed, remove it
408     data = atom->getPropertyByName("VISITED");
409 gezelter 1456
410 gezelter 246 if (data != NULL) {
411 gezelter 507 atom->removeProperty("VISITED");
412 gezelter 246 }
413 gezelter 1456
414 gezelter 246 //remove atomdata
415     data = atom->getPropertyByName("ATOMDATA");
416    
417     if (data != NULL) {
418 gezelter 1874 AtomData* atomData = dynamic_cast<AtomData *>(data);
419 gezelter 246
420 gezelter 507 if (atomData != NULL)
421     atom->removeProperty("ATOMDATA");
422 gezelter 246 }
423 gezelter 507 }
424 gezelter 2
425 gezelter 507 void PrepareVisitor::internalVisit(RigidBody *rb) {
426 gezelter 246 GenericData* data;
427     AtomData* atomData;
428     std::vector<Atom *> myAtoms;
429     std::vector<Atom *>::iterator atomIter;
430 gezelter 2
431 gezelter 246 //if visited property is existed, remove it
432     data = rb->getPropertyByName("VISITED");
433 gezelter 2
434 gezelter 246 if (data != NULL) {
435 gezelter 507 rb->removeProperty("VISITED");
436 gezelter 246 }
437    
438     //remove atomdata
439     data = rb->getPropertyByName("ATOMDATA");
440    
441     if (data != NULL) {
442 gezelter 507 atomData = dynamic_cast<AtomData *>(data);
443 gezelter 246
444 gezelter 507 if (atomData != NULL)
445     rb->removeProperty("ATOMDATA");
446 gezelter 246 }
447    
448     myAtoms = rb->getAtoms();
449    
450     for( atomIter = myAtoms.begin(); atomIter != myAtoms.end(); ++atomIter )
451 gezelter 507 internalVisit(*atomIter);
452     }
453 gezelter 2
454 gezelter 507 const std::string PrepareVisitor::toString() {
455     char buffer[65535];
456     std::string result;
457 tim 293
458 gezelter 507 sprintf(buffer,
459     "------------------------------------------------------------------\n");
460     result += buffer;
461 tim 293
462 gezelter 507 sprintf(buffer, "Visitor name: %s", visitorName.c_str());
463     result += buffer;
464 tim 293
465 gezelter 507 sprintf(buffer,
466     "Visitor Description: prepare for operation of other vistors\n");
467     result += buffer;
468 tim 293
469 gezelter 507 sprintf(buffer,
470     "------------------------------------------------------------------\n");
471     result += buffer;
472 tim 293
473 gezelter 507 return result;
474     }
475 gezelter 2
476 gezelter 507 //----------------------------------------------------------------------------//
477 gezelter 2
478 gezelter 507 WaterTypeVisitor::WaterTypeVisitor() {
479 gezelter 246 visitorName = "WaterTypeVisitor";
480     waterTypeList.insert("TIP3P_RB_0");
481     waterTypeList.insert("TIP4P_RB_0");
482 gezelter 1456 waterTypeList.insert("TIP4P-Ew_RB_0");
483 gezelter 246 waterTypeList.insert("TIP5P_RB_0");
484 gezelter 1456 waterTypeList.insert("TIP5P-E_RB_0");
485 gezelter 246 waterTypeList.insert("SPCE_RB_0");
486 gezelter 1456 waterTypeList.insert("SPC_RB_0");
487 gezelter 507 }
488 gezelter 2
489 gezelter 507 void WaterTypeVisitor::visit(RigidBody *rb) {
490 gezelter 246 std::string rbName;
491     std::vector<Atom *> myAtoms;
492     std::vector<Atom *>::iterator atomIter;
493 gezelter 1874 std::vector<AtomInfo *>::iterator i;
494 gezelter 246 AtomData* atomData;
495 gezelter 2
496 gezelter 246 rbName = rb->getType();
497 gezelter 1456
498 gezelter 246 if (waterTypeList.find(rbName) != waterTypeList.end()) {
499 gezelter 507 myAtoms = rb->getAtoms();
500 gezelter 1874
501 gezelter 507 for( atomIter = myAtoms.begin(); atomIter != myAtoms.end();
502     ++atomIter ) {
503 gezelter 1874 GenericData* data = (*atomIter)->getPropertyByName("ATOMDATA");
504 gezelter 1456
505 gezelter 507 if (data != NULL) {
506     atomData = dynamic_cast<AtomData *>(data);
507 gezelter 1456
508 gezelter 507 if (atomData == NULL)
509     continue;
510     } else
511     continue;
512 gezelter 1456
513 gezelter 1874 for( AtomInfo* atomInfo = atomData->beginAtomInfo(i); atomInfo;
514 gezelter 507 atomInfo = atomData->nextAtomInfo(i) ) {
515     atomInfo->atomTypeName = trimmedName(atomInfo->atomTypeName);
516 gezelter 1874 }
517 gezelter 1875 }
518 gezelter 1874 }
519 gezelter 507 }
520 gezelter 2
521 gezelter 407 std::string WaterTypeVisitor::trimmedName(const std::string&atomTypeName) {
522     return atomTypeName.substr(0, atomTypeName.find('_'));
523     }
524 gezelter 2
525 gezelter 507 const std::string WaterTypeVisitor::toString() {
526 gezelter 246 char buffer[65535];
527     std::string result;
528 gezelter 2
529 gezelter 246 sprintf(buffer,
530     "------------------------------------------------------------------\n");
531     result += buffer;
532 gezelter 2
533 gezelter 246 sprintf(buffer, "Visitor name: %s\n", visitorName.c_str());
534     result += buffer;
535 gezelter 2
536 gezelter 246 sprintf(buffer,
537     "Visitor Description: Replace the atom type in water model\n");
538     result += buffer;
539 gezelter 2
540 gezelter 246 sprintf(buffer,
541     "------------------------------------------------------------------\n");
542     result += buffer;
543    
544     return result;
545 gezelter 507 }
546 gezelter 2
547 gezelter 1390 } //namespace OpenMD

Properties

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