ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/OpenMD/branches/development/src/visitors/OtherVisitor.cpp
Revision: 1702
Committed: Thu Apr 5 19:49:59 2012 UTC (13 years, 1 month ago) by kstocke1
File size: 16208 byte(s)
Log Message:
Un-did some changes that weren't ready to be committed.

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 1390 namespace OpenMD {
49 tim 132
50 gezelter 507 void WrappingVisitor::visit(Atom *atom) {
51     internalVisit(atom);
52     }
53 gezelter 246
54 gezelter 507 void WrappingVisitor::visit(DirectionalAtom *datom) {
55     internalVisit(datom);
56     }
57 gezelter 2
58 gezelter 507 void WrappingVisitor::visit(RigidBody *rb) {
59     internalVisit(rb);
60     }
61 gezelter 2
62 gezelter 507 void WrappingVisitor::internalVisit(StuntDouble *sd) {
63 gezelter 246 GenericData * data;
64     AtomData * atomData;
65     AtomInfo * atomInfo;
66     std::vector<AtomInfo *>::iterator i;
67 gezelter 2
68 gezelter 246 data = sd->getPropertyByName("ATOMDATA");
69 gezelter 2
70 gezelter 246 if (data != NULL) {
71 gezelter 507 atomData = dynamic_cast<AtomData *>(data);
72 gezelter 2
73 gezelter 507 if (atomData == NULL)
74     return;
75 gezelter 246 } else
76 gezelter 507 return;
77 gezelter 246
78     Snapshot* currSnapshot = info->getSnapshotManager()->getCurrentSnapshot();
79    
80     for( atomInfo = atomData->beginAtomInfo(i); atomInfo; atomInfo = atomData->nextAtomInfo(i) ) {
81 tim 543 Vector3d newPos = atomInfo->pos - origin_;
82     currSnapshot->wrapVector(newPos);
83     atomInfo->pos = newPos;
84 gezelter 246 }
85 gezelter 507 }
86 gezelter 2
87 tim 543 void WrappingVisitor::update() {
88     if (useCom_){
89     origin_ = info->getCom();
90     }
91     }
92    
93 gezelter 507 const std::string WrappingVisitor::toString() {
94 gezelter 246 char buffer[65535];
95     std::string result;
96 gezelter 2
97 gezelter 246 sprintf(buffer,
98     "------------------------------------------------------------------\n");
99     result += buffer;
100 gezelter 2
101 gezelter 246 sprintf(buffer, "Visitor name: %s\n", visitorName.c_str());
102     result += buffer;
103 gezelter 2
104 gezelter 246 sprintf(buffer,
105     "Visitor Description: wrapping atoms back to periodic box\n");
106     result += buffer;
107    
108     sprintf(buffer,
109     "------------------------------------------------------------------\n");
110     result += buffer;
111    
112     return result;
113 gezelter 507 }
114 gezelter 2
115 gezelter 507 //----------------------------------------------------------------------------//
116 gezelter 2
117 gezelter 507 ReplicateVisitor::ReplicateVisitor(SimInfo *info, Vector3i opt) :
118 gezelter 246 BaseVisitor() {
119 gezelter 507 this->info = info;
120     visitorName = "ReplicateVisitor";
121     this->replicateOpt = opt;
122 gezelter 246
123 gezelter 507 //generate the replicate directions
124     for( int i = 0; i <= replicateOpt[0]; i++ ) {
125 gezelter 246 for( int j = 0; j <= replicateOpt[1]; j++ ) {
126 gezelter 507 for( int k = 0; k <= replicateOpt[2]; k++ ) {
127     //skip original frame
128     if (i == 0 && j == 0 && k == 0) {
129     continue;
130     } else {
131     dir.push_back(Vector3i(i, j, k));
132     }
133     }
134 gezelter 246 }
135 gezelter 507 }
136    
137 gezelter 246 }
138    
139 gezelter 507 void ReplicateVisitor::visit(Atom *atom) {
140     internalVisit(atom);
141     }
142 gezelter 246
143 gezelter 507 void ReplicateVisitor::visit(DirectionalAtom *datom) {
144     internalVisit(datom);
145     }
146 gezelter 2
147 gezelter 507 void ReplicateVisitor::visit(RigidBody *rb) {
148     internalVisit(rb);
149     }
150 gezelter 2
151 gezelter 507 void ReplicateVisitor::internalVisit(StuntDouble *sd) {
152 gezelter 246 GenericData * data;
153     AtomData * atomData;
154 gezelter 2
155 gezelter 246 //if there is not atom data, just skip it
156     data = sd->getPropertyByName("ATOMDATA");
157 gezelter 2
158 gezelter 246 if (data != NULL) {
159 gezelter 507 atomData = dynamic_cast<AtomData *>(data);
160 gezelter 2
161 gezelter 507 if (atomData == NULL) {
162     return;
163     }
164 gezelter 246 } else {
165 gezelter 507 return;
166 gezelter 246 }
167    
168     Snapshot* currSnapshot = info->getSnapshotManager()->getCurrentSnapshot();
169     Mat3x3d box = currSnapshot->getHmat();
170    
171     std::vector<AtomInfo *> atomInfoList = atomData->getData();
172    
173     replicate(atomInfoList, atomData, box);
174 gezelter 507 }
175 gezelter 2
176 gezelter 507 void ReplicateVisitor::replicate(std::vector<AtomInfo *>&infoList, AtomData *data, const Mat3x3d& box) {
177 gezelter 246 AtomInfo* newAtomInfo;
178     std::vector<Vector3i>::iterator dirIter;
179     std::vector<AtomInfo *>::iterator i;
180 gezelter 2
181 gezelter 246 for( dirIter = dir.begin(); dirIter != dir.end(); ++dirIter ) {
182 gezelter 507 for( i = infoList.begin(); i != infoList.end(); i++ ) {
183     newAtomInfo = new AtomInfo();
184     *newAtomInfo = *(*i);
185 gezelter 2
186 gezelter 507 for( int j = 0; j < 3; j++ )
187     newAtomInfo->pos[j] += (*dirIter)[0]*box(j, 0) + (*dirIter)[1]*box(j, 1) + (*dirIter)[2]*box(j, 2);
188 gezelter 246
189 gezelter 507 data->addAtomInfo(newAtomInfo);
190     }
191 gezelter 246 } // end for(dirIter)
192 gezelter 507 }
193 gezelter 2
194 gezelter 507 const std::string ReplicateVisitor::toString() {
195 gezelter 246 char buffer[65535];
196     std::string result;
197     std::set<std::string>::iterator i;
198 gezelter 2
199 gezelter 246 sprintf(buffer,
200     "------------------------------------------------------------------\n");
201     result += buffer;
202 gezelter 2
203 gezelter 246 sprintf(buffer, "Visitor name: %s\n", visitorName.c_str());
204     result += buffer;
205 gezelter 2
206 gezelter 246 sprintf(buffer,
207     "Visitor Description: replicate the atoms in different direction\n");
208     result += buffer;
209 gezelter 2
210 gezelter 246 //print the replicate direction
211     sprintf(buffer, "repeatX = %d:\n", replicateOpt[0]);
212     result += buffer;
213 gezelter 2
214 gezelter 246 sprintf(buffer, "repeatY = %d:\n", replicateOpt[1]);
215     result += buffer;
216 gezelter 2
217 gezelter 246 sprintf(buffer, "repeatZ = %d:\n", replicateOpt[2]);
218     result += buffer;
219 gezelter 2
220 gezelter 246 sprintf(buffer,
221     "------------------------------------------------------------------\n");
222     result += buffer;
223    
224     return result;
225 gezelter 507 }
226 gezelter 2
227 gezelter 1456 //------------------------------------------------------------------------//
228 gezelter 2
229 gezelter 1456 XYZVisitor::XYZVisitor(SimInfo *info) : BaseVisitor(), seleMan(info),
230     evaluator(info), doPositions_(true),
231     doVelocities_(false),
232     doForces_(false), doVectors_(false),
233     doCharges_(false) {
234     this->info = info;
235     visitorName = "XYZVisitor";
236    
237     evaluator.loadScriptString("select all");
238    
239     if (!evaluator.isDynamic()) {
240     seleMan.setSelectionSet(evaluator.evaluate());
241 tim 413 }
242 gezelter 1456 }
243    
244 gezelter 507 XYZVisitor::XYZVisitor(SimInfo *info, const std::string& script) :
245 gezelter 1456 BaseVisitor(), seleMan(info), evaluator(info), doPositions_(true),
246     doVelocities_(false), doForces_(false), doVectors_(false),
247     doCharges_(false) {
248    
249     this->info = info;
250     visitorName = "XYZVisitor";
251    
252     evaluator.loadScriptString(script);
253    
254     if (!evaluator.isDynamic()) {
255     seleMan.setSelectionSet(evaluator.evaluate());
256 tim 413 }
257 gezelter 1456 }
258 tim 413
259 gezelter 507 void XYZVisitor::visit(Atom *atom) {
260 tim 293 if (isSelected(atom))
261 gezelter 507 internalVisit(atom);
262     }
263 gezelter 2
264 gezelter 507 void XYZVisitor::visit(DirectionalAtom *datom) {
265 tim 293 if (isSelected(datom))
266 gezelter 507 internalVisit(datom);
267     }
268 gezelter 1456
269 gezelter 507 void XYZVisitor::visit(RigidBody *rb) {
270 tim 293 if (isSelected(rb))
271 gezelter 507 internalVisit(rb);
272     }
273 gezelter 1456
274 gezelter 507 void XYZVisitor::update() {
275 tim 413 //if dynamic, we need to re-evaluate the selection
276     if (evaluator.isDynamic()) {
277 gezelter 507 seleMan.setSelectionSet(evaluator.evaluate());
278 tim 413 }
279 gezelter 507 }
280 gezelter 1456
281 gezelter 507 void XYZVisitor::internalVisit(StuntDouble *sd) {
282 gezelter 246 GenericData * data;
283     AtomData * atomData;
284     AtomInfo * atomInfo;
285     std::vector<AtomInfo *>::iterator i;
286     char buffer[1024];
287 gezelter 1456
288 gezelter 246 //if there is not atom data, just skip it
289     data = sd->getPropertyByName("ATOMDATA");
290 gezelter 1456
291 gezelter 246 if (data != NULL) {
292 gezelter 507 atomData = dynamic_cast<AtomData *>(data);
293 gezelter 1456
294 gezelter 507 if (atomData == NULL)
295     return;
296 gezelter 246 } else
297 gezelter 507 return;
298 gezelter 2
299 gezelter 1456 for( atomInfo = atomData->beginAtomInfo(i); atomInfo;
300     atomInfo = atomData->nextAtomInfo(i) ) {
301    
302     std::string line;
303     sprintf(buffer, "%s", atomInfo->atomTypeName.c_str());
304     line += buffer;
305    
306     if (doPositions_){
307     sprintf(buffer, "%15.8f%15.8f%15.8f", atomInfo->pos[0],
308     atomInfo->pos[1], atomInfo->pos[2]);
309     line += buffer;
310     }
311     if (doCharges_ && atomInfo->hasCharge) {
312     sprintf(buffer, "%15.8f", atomInfo->charge);
313     line += buffer;
314 chuckv 1118 }
315 gezelter 1456 if (doVectors_ && atomInfo->hasVector) {
316     sprintf(buffer, "%15.8f%15.8f%15.8f", atomInfo->vec[0],
317     atomInfo->vec[1], atomInfo->vec[2]);
318     line += buffer;
319 chuckv 1118 }
320 gezelter 1456 if (doVelocities_ && atomInfo->hasVelocity) {
321     sprintf(buffer, "%15.8f%15.8f%15.8f", atomInfo->vel[0],
322     atomInfo->vel[1], atomInfo->vel[2]);
323     line += buffer;
324     }
325     if (doForces_ && atomInfo->hasForce) {
326     sprintf(buffer, "%15.8f%15.8f%15.8f", atomInfo->frc[0],
327     atomInfo->frc[1], atomInfo->frc[2]);
328     line += buffer;
329     }
330     frame.push_back(line);
331     }
332 gezelter 507 }
333 gezelter 2
334 gezelter 507 bool XYZVisitor::isSelected(StuntDouble *sd) {
335 tim 413 return seleMan.isSelected(sd);
336 gezelter 507 }
337 gezelter 2
338 gezelter 507 void XYZVisitor::writeFrame(std::ostream &outStream) {
339 gezelter 246 std::vector<std::string>::iterator i;
340     char buffer[1024];
341 gezelter 1456
342 gezelter 246 if (frame.size() == 0)
343 gezelter 507 std::cerr << "Current Frame does not contain any atoms" << std::endl;
344 gezelter 1456
345 gezelter 246 //total number of atoms
346     outStream << frame.size() << std::endl;
347 gezelter 1456
348 gezelter 246 //write comment line
349     Snapshot* currSnapshot = info->getSnapshotManager()->getCurrentSnapshot();
350     Mat3x3d box = currSnapshot->getHmat();
351    
352     sprintf(buffer,
353     "%15.8f;%15.8f%15.8f%15.8f;%15.8f%15.8f%15.8f;%15.8f%15.8f%15.8f",
354     currSnapshot->getTime(),
355     box(0, 0), box(0, 1), box(0, 2),
356     box(1, 0), box(1, 1), box(1, 2),
357     box(2, 0), box(2, 1), box(2, 2));
358 gezelter 1456
359 gezelter 246 outStream << buffer << std::endl;
360 gezelter 1456
361 gezelter 246 for( i = frame.begin(); i != frame.end(); ++i )
362 gezelter 507 outStream << *i << std::endl;
363     }
364 gezelter 1456
365 cli2 1290 std::string XYZVisitor::trimmedName(const std::string&atomTypeName) {
366     return atomTypeName.substr(0, atomTypeName.find('-'));
367     }
368 gezelter 1456
369 gezelter 507 const std::string XYZVisitor::toString() {
370 gezelter 246 char buffer[65535];
371     std::string result;
372 gezelter 1456
373 gezelter 246 sprintf(buffer,
374     "------------------------------------------------------------------\n");
375     result += buffer;
376 gezelter 1456
377 gezelter 246 sprintf(buffer, "Visitor name: %s\n", visitorName.c_str());
378     result += buffer;
379 gezelter 1456
380 gezelter 246 sprintf(buffer,
381     "Visitor Description: assemble the atom data and output xyz file\n");
382     result += buffer;
383    
384     sprintf(buffer,
385     "------------------------------------------------------------------\n");
386     result += buffer;
387 gezelter 1456
388 gezelter 246 return result;
389 gezelter 507 }
390 gezelter 1456
391 gezelter 507 //----------------------------------------------------------------------------//
392 gezelter 1456
393 gezelter 507 void PrepareVisitor::internalVisit(Atom *atom) {
394 gezelter 246 GenericData *data;
395     AtomData * atomData;
396 gezelter 1456
397 gezelter 246 //if visited property is existed, remove it
398     data = atom->getPropertyByName("VISITED");
399 gezelter 1456
400 gezelter 246 if (data != NULL) {
401 gezelter 507 atom->removeProperty("VISITED");
402 gezelter 246 }
403 gezelter 1456
404 gezelter 246 //remove atomdata
405     data = atom->getPropertyByName("ATOMDATA");
406    
407     if (data != NULL) {
408 gezelter 507 atomData = dynamic_cast<AtomData *>(data);
409 gezelter 246
410 gezelter 507 if (atomData != NULL)
411     atom->removeProperty("ATOMDATA");
412 gezelter 246 }
413 gezelter 507 }
414 gezelter 2
415 gezelter 507 void PrepareVisitor::internalVisit(RigidBody *rb) {
416 gezelter 246 GenericData* data;
417     AtomData* atomData;
418     std::vector<Atom *> myAtoms;
419     std::vector<Atom *>::iterator atomIter;
420 gezelter 2
421 gezelter 246 //if visited property is existed, remove it
422     data = rb->getPropertyByName("VISITED");
423 gezelter 2
424 gezelter 246 if (data != NULL) {
425 gezelter 507 rb->removeProperty("VISITED");
426 gezelter 246 }
427    
428     //remove atomdata
429     data = rb->getPropertyByName("ATOMDATA");
430    
431     if (data != NULL) {
432 gezelter 507 atomData = dynamic_cast<AtomData *>(data);
433 gezelter 246
434 gezelter 507 if (atomData != NULL)
435     rb->removeProperty("ATOMDATA");
436 gezelter 246 }
437    
438     myAtoms = rb->getAtoms();
439    
440     for( atomIter = myAtoms.begin(); atomIter != myAtoms.end(); ++atomIter )
441 gezelter 507 internalVisit(*atomIter);
442     }
443 gezelter 2
444 gezelter 507 const std::string PrepareVisitor::toString() {
445     char buffer[65535];
446     std::string result;
447 tim 293
448 gezelter 507 sprintf(buffer,
449     "------------------------------------------------------------------\n");
450     result += buffer;
451 tim 293
452 gezelter 507 sprintf(buffer, "Visitor name: %s", visitorName.c_str());
453     result += buffer;
454 tim 293
455 gezelter 507 sprintf(buffer,
456     "Visitor Description: prepare for operation of other vistors\n");
457     result += buffer;
458 tim 293
459 gezelter 507 sprintf(buffer,
460     "------------------------------------------------------------------\n");
461     result += buffer;
462 tim 293
463 gezelter 507 return result;
464     }
465 gezelter 2
466 gezelter 507 //----------------------------------------------------------------------------//
467 gezelter 2
468 gezelter 507 WaterTypeVisitor::WaterTypeVisitor() {
469 gezelter 246 visitorName = "WaterTypeVisitor";
470     waterTypeList.insert("TIP3P_RB_0");
471     waterTypeList.insert("TIP4P_RB_0");
472 gezelter 1456 waterTypeList.insert("TIP4P-Ew_RB_0");
473 gezelter 246 waterTypeList.insert("TIP5P_RB_0");
474 gezelter 1456 waterTypeList.insert("TIP5P-E_RB_0");
475 gezelter 246 waterTypeList.insert("SPCE_RB_0");
476 gezelter 1456 waterTypeList.insert("SPC_RB_0");
477 gezelter 507 }
478 gezelter 2
479 gezelter 507 void WaterTypeVisitor::visit(RigidBody *rb) {
480 gezelter 246 std::string rbName;
481     std::vector<Atom *> myAtoms;
482     std::vector<Atom *>::iterator atomIter;
483     GenericData* data;
484     AtomData* atomData;
485     AtomInfo* atomInfo;
486     std::vector<AtomInfo *>::iterator i;
487 gezelter 2
488 gezelter 246 rbName = rb->getType();
489 gezelter 1456
490 gezelter 246 if (waterTypeList.find(rbName) != waterTypeList.end()) {
491 gezelter 507 myAtoms = rb->getAtoms();
492 gezelter 2
493 gezelter 507 for( atomIter = myAtoms.begin(); atomIter != myAtoms.end();
494     ++atomIter ) {
495     data = (*atomIter)->getPropertyByName("ATOMDATA");
496 gezelter 1456
497 gezelter 507 if (data != NULL) {
498     atomData = dynamic_cast<AtomData *>(data);
499 gezelter 1456
500 gezelter 507 if (atomData == NULL)
501     continue;
502     } else
503     continue;
504 gezelter 1456
505 gezelter 507 for( atomInfo = atomData->beginAtomInfo(i); atomInfo;
506     atomInfo = atomData->nextAtomInfo(i) ) {
507     atomInfo->atomTypeName = trimmedName(atomInfo->atomTypeName);
508     } //end for(atomInfo)
509     } //end for(atomIter)
510 gezelter 246 } //end if (waterTypeList.find(rbName) != waterTypeList.end())
511 gezelter 507 }
512 gezelter 2
513 gezelter 407 std::string WaterTypeVisitor::trimmedName(const std::string&atomTypeName) {
514     return atomTypeName.substr(0, atomTypeName.find('_'));
515     }
516 gezelter 2
517 gezelter 507 const std::string WaterTypeVisitor::toString() {
518 gezelter 246 char buffer[65535];
519     std::string result;
520 gezelter 2
521 gezelter 246 sprintf(buffer,
522     "------------------------------------------------------------------\n");
523     result += buffer;
524 gezelter 2
525 gezelter 246 sprintf(buffer, "Visitor name: %s\n", visitorName.c_str());
526     result += buffer;
527 gezelter 2
528 gezelter 246 sprintf(buffer,
529     "Visitor Description: Replace the atom type in water model\n");
530     result += buffer;
531 gezelter 2
532 gezelter 246 sprintf(buffer,
533     "------------------------------------------------------------------\n");
534     result += buffer;
535    
536     return result;
537 gezelter 507 }
538 gezelter 2
539 gezelter 1390 } //namespace OpenMD

Properties

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