ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/group/trunk/OOPSE-4/src/visitors/AtomVisitor.cpp
Revision: 1931
Committed: Wed Jan 12 23:15:37 2005 UTC (19 years, 6 months ago) by tim
File size: 12484 byte(s)
Log Message:
LinearVisitor get fixed

File Contents

# User Rev Content
1 gezelter 1930 /*
2     * 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     * 1. Acknowledgement of the program authors must be made in any
10     * publication of scientific results based in part on use of the
11     * program. An acceptable form of acknowledgement is citation of
12     * the article in which the program was described (Matthew
13     * A. Meineke, Charles F. Vardeman II, Teng Lin, Christopher
14     * J. Fennell and J. Daniel Gezelter, "OOPSE: An Object-Oriented
15     * Parallel Simulation Engine for Molecular Dynamics,"
16     * J. Comput. Chem. 26, pp. 252-271 (2005))
17     *
18     * 2. Redistributions of source code must retain the above copyright
19     * notice, this list of conditions and the following disclaimer.
20     *
21     * 3. Redistributions in binary form must reproduce the above copyright
22     * notice, this list of conditions and the following disclaimer in the
23     * documentation and/or other materials provided with the
24     * distribution.
25     *
26     * This software is provided "AS IS," without a warranty of any
27     * kind. All express or implied conditions, representations and
28     * warranties, including any implied warranty of merchantability,
29     * fitness for a particular purpose or non-infringement, are hereby
30     * excluded. The University of Notre Dame and its licensors shall not
31     * be liable for any damages suffered by licensee as a result of
32     * using, modifying or distributing the software or its
33     * derivatives. In no event will the University of Notre Dame or its
34     * licensors be liable for any lost revenue, profit or data, or for
35     * direct, indirect, special, consequential, incidental or punitive
36     * damages, however caused and regardless of the theory of liability,
37     * arising out of the use of or inability to use software, even if the
38     * University of Notre Dame has been advised of the possibility of
39     * such damages.
40     */
41    
42 gezelter 1490 #include <cstring>
43 tim 1492 #include "visitors/AtomVisitor.hpp"
44     #include "primitives/DirectionalAtom.hpp"
45     #include "math/MatVec3.h"
46     #include "primitives/RigidBody.hpp"
47 gezelter 1490
48 tim 1625 namespace oopse {
49 gezelter 1930 void BaseAtomVisitor::visit(RigidBody *rb) {
50     //vector<Atom*> myAtoms;
51     //vector<Atom*>::iterator atomIter;
52 tim 1625
53 gezelter 1930 //myAtoms = rb->getAtoms();
54 gezelter 1490
55 gezelter 1930 //for(atomIter = myAtoms.begin(); atomIter != myAtoms.end(); ++atomIter)
56     // (*atomIter)->accept(this);
57     }
58 gezelter 1490
59 gezelter 1930 void BaseAtomVisitor::setVisited(Atom *atom) {
60     GenericData *data;
61     data = atom->getPropertyByName("VISITED");
62 gezelter 1490
63 gezelter 1930 //if visited property is not existed, add it as new property
64     if (data == NULL) {
65     data = new GenericData();
66     data->setID("VISITED");
67     atom->addProperty(data);
68     }
69 gezelter 1490 }
70    
71 gezelter 1930 bool BaseAtomVisitor::isVisited(Atom *atom) {
72     GenericData *data;
73     data = atom->getPropertyByName("VISITED");
74     return data == NULL ? false : true;
75 gezelter 1490 }
76    
77 gezelter 1930 bool SSDAtomVisitor::isSSDAtom(const std::string&atomType) {
78 tim 1931 std::set<std::string>::iterator strIter;
79     strIter = ssdAtomType.find(atomType);
80     return strIter != ssdAtomType.end() ? true : false;
81 gezelter 1490 }
82    
83 gezelter 1930 void SSDAtomVisitor::visit(DirectionalAtom *datom) {
84 tim 1931 std::vector<AtomInfo*>atoms;
85 gezelter 1490
86 gezelter 1930 //we need to convert SSD into 4 differnet atoms
87     //one oxygen atom, two hydrogen atoms and one pseudo atom which is the center of the mass
88     //of the water with a dipole moment
89     Vector3d h1(0.0, -0.75695, 0.5206);
90     Vector3d h2(0.0, 0.75695, 0.5206);
91     Vector3d ox(0.0, 0.0, -0.0654);
92     Vector3d u(0, 0, 1);
93     RotMat3x3d rotMatrix;
94     RotMat3x3d rotTrans;
95     AtomInfo * atomInfo;
96     Vector3d pos;
97     Vector3d newVec;
98     Quat4d q;
99     AtomData * atomData;
100     GenericData *data;
101     bool haveAtomData;
102 gezelter 1490
103 gezelter 1930 //if atom is not SSD atom, just skip it
104     if (!isSSDAtom(datom->getType()))
105     return;
106 gezelter 1490
107 gezelter 1930 data = datom->getPropertyByName("ATOMDATA");
108 gezelter 1490
109 gezelter 1930 if (data != NULL) {
110     atomData = dynamic_cast<AtomData *>(data);
111    
112     if (atomData == NULL) {
113     std::cerr << "can not get Atom Data from " << datom->getType() << std::endl;
114     atomData = new AtomData;
115     haveAtomData = false;
116     } else
117     haveAtomData = true;
118     } else {
119     atomData = new AtomData;
120     haveAtomData = false;
121 gezelter 1490 }
122    
123 gezelter 1930 pos = datom->getPos();
124     q = datom->getQ();
125     rotMatrix = datom->getA();
126 gezelter 1490
127 gezelter 1930 // We need A^T to convert from body-fixed to space-fixed:
128     //transposeMat3(rotMatrix, rotTrans);
129     rotTrans = rotMatrix.transpose();
130 gezelter 1490
131 gezelter 1930 //center of mass of the water molecule
132     //matVecMul3(rotTrans, u, newVec);
133     newVec = rotTrans * u;
134 gezelter 1490
135 gezelter 1930 atomInfo = new AtomInfo;
136     atomInfo->AtomType = "X";
137     atomInfo->pos[0] = pos[0];
138     atomInfo->pos[1] = pos[1];
139     atomInfo->pos[2] = pos[2];
140     atomInfo->dipole[0] = newVec[0];
141     atomInfo->dipole[1] = newVec[1];
142     atomInfo->dipole[2] = newVec[2];
143 gezelter 1490
144 gezelter 1930 atomData->addAtomInfo(atomInfo);
145 gezelter 1490
146 gezelter 1930 //oxygen
147     //matVecMul3(rotTrans, ox, newVec);
148     newVec = rotTrans * ox;
149 gezelter 1490
150 gezelter 1930 atomInfo = new AtomInfo;
151     atomInfo->AtomType = "O";
152     atomInfo->pos[0] = pos[0] + newVec[0];
153     atomInfo->pos[1] = pos[1] + newVec[1];
154     atomInfo->pos[2] = pos[2] + newVec[2];
155     atomInfo->dipole[0] = 0.0;
156     atomInfo->dipole[1] = 0.0;
157     atomInfo->dipole[2] = 0.0;
158     atomData->addAtomInfo(atomInfo);
159 gezelter 1490
160 gezelter 1930 //hydrogen1
161     //matVecMul3(rotTrans, h1, newVec);
162     newVec = rotTrans * h1;
163     atomInfo = new AtomInfo;
164     atomInfo->AtomType = "H";
165     atomInfo->pos[0] = pos[0] + newVec[0];
166     atomInfo->pos[1] = pos[1] + newVec[1];
167     atomInfo->pos[2] = pos[2] + newVec[2];
168     atomInfo->dipole[0] = 0.0;
169     atomInfo->dipole[1] = 0.0;
170     atomInfo->dipole[2] = 0.0;
171     atomData->addAtomInfo(atomInfo);
172 gezelter 1490
173 gezelter 1930 //hydrogen2
174     //matVecMul3(rotTrans, h2, newVec);
175     newVec = rotTrans * h2;
176     atomInfo = new AtomInfo;
177     atomInfo->AtomType = "H";
178     atomInfo->pos[0] = pos[0] + newVec[0];
179     atomInfo->pos[1] = pos[1] + newVec[1];
180     atomInfo->pos[2] = pos[2] + newVec[2];
181     atomInfo->dipole[0] = 0.0;
182     atomInfo->dipole[1] = 0.0;
183     atomInfo->dipole[2] = 0.0;
184     atomData->addAtomInfo(atomInfo);
185 gezelter 1490
186 gezelter 1930 //add atom data into atom's property
187    
188     if (!haveAtomData) {
189     atomData->setID("ATOMDATA");
190     datom->addProperty(atomData);
191     }
192    
193     setVisited(datom);
194 gezelter 1490 }
195    
196 gezelter 1930 const std::string SSDAtomVisitor::toString() {
197     char buffer[65535];
198     std::string result;
199 gezelter 1490
200 gezelter 1930 sprintf(buffer,
201     "------------------------------------------------------------------\n");
202     result += buffer;
203 gezelter 1490
204 gezelter 1930 sprintf(buffer, "Visitor name: %s\n", visitorName.c_str());
205     result += buffer;
206 gezelter 1490
207 gezelter 1930 sprintf(buffer,
208     "Visitor Description: Convert SSD into 4 different atoms\n");
209     result += buffer;
210 gezelter 1490
211 gezelter 1930 sprintf(buffer,
212     "------------------------------------------------------------------\n");
213     result += buffer;
214    
215     return result;
216 gezelter 1490 }
217    
218 tim 1931 bool LinearAtomVisitor::isLinearAtom(const std::string& atomType){
219     std::set<std::string>::iterator strIter;
220     strIter = linearAtomType.find(atomType);
221    
222     return strIter != linearAtomType.end() ? true : false;
223 chrisfen 1718 }
224    
225     void LinearAtomVisitor::visit(DirectionalAtom* datom){
226 tim 1931 std::vector<AtomInfo*> atoms;
227     //we need to convert linear into 4 different atoms
228     Vector3d c1(0.0, 0.0, -1.8);
229     Vector3d c2(0.0, 0.0, -0.6);
230     Vector3d c3(0.0, 0.0, 0.6);
231     Vector3d c4(0.0, 0.0, 1.8);
232     RotMat3x3d rotMatrix;
233     RotMat3x3d rotTrans;
234     AtomInfo* atomInfo;
235     Vector3d pos;
236     Vector3d newVec;
237     Quat4d q;
238     AtomData* atomData;
239     GenericData* data;
240     bool haveAtomData;
241 chrisfen 1718
242 tim 1931 //if atom is not SSD atom, just skip it
243     if(!isLinearAtom(datom->getType()))
244     return;
245 chrisfen 1718
246 tim 1931 data = datom->getPropertyByName("ATOMDATA");
247     if(data != NULL){
248     atomData = dynamic_cast<AtomData*>(data);
249     if(atomData == NULL){
250     std::cerr << "can not get Atom Data from " << datom->getType() << std::endl;
251     atomData = new AtomData;
252     haveAtomData = false;
253     } else {
254     haveAtomData = true;
255     }
256     } else {
257     atomData = new AtomData;
258     haveAtomData = false;
259 chrisfen 1718 }
260    
261    
262 tim 1931 pos = datom->getPos();
263     q = datom->getQ();
264     rotMatrix = datom->getA();
265 chrisfen 1718
266 tim 1931 // We need A^T to convert from body-fixed to space-fixed:
267     rotTrans = rotMatrix.transpose();
268 chrisfen 1718
269 tim 1931 newVec = rotTrans * c1;
270     atomInfo = new AtomInfo;
271     atomInfo->AtomType = "C";
272     atomInfo->pos[0] = pos[0] + newVec[0];
273     atomInfo->pos[1] = pos[1] + newVec[1];
274     atomInfo->pos[2] = pos[2] + newVec[2];
275     atomInfo->dipole[0] = 0.0;
276     atomInfo->dipole[1] = 0.0;
277     atomInfo->dipole[2] = 0.0;
278     atomData->addAtomInfo(atomInfo);
279 chrisfen 1718
280 tim 1931 newVec = rotTrans * c2;
281     atomInfo = new AtomInfo;
282     atomInfo->AtomType = "C";
283     atomInfo->pos[0] = pos[0] + newVec[0];
284     atomInfo->pos[1] = pos[1] + newVec[1];
285     atomInfo->pos[2] = pos[2] + newVec[2];
286     atomInfo->dipole[0] = 0.0;
287     atomInfo->dipole[1] = 0.0;
288     atomInfo->dipole[2] = 0.0;
289     atomData->addAtomInfo(atomInfo);
290 chrisfen 1718
291 tim 1931 newVec = rotTrans * c3;
292     atomInfo = new AtomInfo;
293     atomInfo->AtomType = "C";
294     atomInfo->pos[0] = pos[0] + newVec[0];
295     atomInfo->pos[1] = pos[1] + newVec[1];
296     atomInfo->pos[2] = pos[2] + newVec[2];
297     atomInfo->dipole[0] = 0.0;
298     atomInfo->dipole[1] = 0.0;
299     atomInfo->dipole[2] = 0.0;
300     atomData->addAtomInfo(atomInfo);
301 chrisfen 1718
302 tim 1931 newVec = rotTrans * c4;
303     atomInfo = new AtomInfo;
304     atomInfo->AtomType = "C";
305     atomInfo->pos[0] = pos[0] + newVec[0];
306     atomInfo->pos[1] = pos[1] + newVec[1];
307     atomInfo->pos[2] = pos[2] + newVec[2];
308     atomInfo->dipole[0] = 0.0;
309     atomInfo->dipole[1] = 0.0;
310     atomInfo->dipole[2] = 0.0;
311     atomData->addAtomInfo(atomInfo);
312 chrisfen 1718
313 tim 1931 //add atom data into atom's property
314 chrisfen 1718
315 tim 1931 if(!haveAtomData){
316     atomData->setID("ATOMDATA");
317     datom->addProperty(atomData);
318     }
319 chrisfen 1718
320 tim 1931 setVisited(datom);
321    
322 chrisfen 1718 }
323    
324 tim 1931 const std::string LinearAtomVisitor::toString(){
325 chrisfen 1718 char buffer[65535];
326 tim 1931 std::string result;
327 chrisfen 1718
328     sprintf(buffer ,"------------------------------------------------------------------\n");
329     result += buffer;
330    
331     sprintf(buffer ,"Visitor name: %s\n", visitorName.c_str());
332     result += buffer;
333    
334     sprintf(buffer , "Visitor Description: Convert linear into 4 different atoms\n");
335     result += buffer;
336    
337     sprintf(buffer ,"------------------------------------------------------------------\n");
338     result += buffer;
339    
340     return result;
341     }
342    
343 gezelter 1490 //----------------------------------------------------------------------------//
344    
345 gezelter 1930 void DefaultAtomVisitor::visit(Atom *atom) {
346     AtomData *atomData;
347     AtomInfo *atomInfo;
348     Vector3d pos;
349 gezelter 1490
350 gezelter 1930 if (isVisited(atom))
351     return;
352 gezelter 1490
353 gezelter 1930 atomInfo = new AtomInfo;
354 gezelter 1490
355 gezelter 1930 atomData = new AtomData;
356     atomData->setID("ATOMDATA");
357 gezelter 1490
358 gezelter 1930 pos = atom->getPos();
359     atomInfo->AtomType = atom->getType();
360     atomInfo->pos[0] = pos[0];
361     atomInfo->pos[1] = pos[1];
362     atomInfo->pos[2] = pos[2];
363     atomInfo->dipole[0] = 0.0;
364     atomInfo->dipole[1] = 0.0;
365     atomInfo->dipole[2] = 0.0;
366 gezelter 1490
367 gezelter 1930 atomData->addAtomInfo(atomInfo);
368 gezelter 1490
369 gezelter 1930 atom->addProperty(atomData);
370    
371     setVisited(atom);
372 gezelter 1490 }
373    
374 gezelter 1930 void DefaultAtomVisitor::visit(DirectionalAtom *datom) {
375     AtomData *atomData;
376     AtomInfo *atomInfo;
377     Vector3d pos;
378     Vector3d u;
379 gezelter 1490
380 gezelter 1930 if (isVisited(datom))
381     return;
382 gezelter 1490
383 gezelter 1930 pos = datom->getPos();
384     u = datom->getElectroFrame().getColumn(3);
385 gezelter 1490
386 gezelter 1930 atomData = new AtomData;
387     atomData->setID("ATOMDATA");
388     atomInfo = new AtomInfo;
389 gezelter 1490
390 gezelter 1930 atomInfo->AtomType = datom->getType();
391     atomInfo->pos[0] = pos[0];
392     atomInfo->pos[1] = pos[1];
393     atomInfo->pos[2] = pos[2];
394     atomInfo->dipole[0] = u[0];
395     atomInfo->dipole[1] = u[1];
396     atomInfo->dipole[2] = u[2];
397    
398     atomData->addAtomInfo(atomInfo);
399    
400     datom->addProperty(atomData);
401    
402     setVisited(datom);
403 gezelter 1490 }
404    
405 gezelter 1930 const std::string DefaultAtomVisitor::toString() {
406     char buffer[65535];
407     std::string result;
408 gezelter 1490
409 gezelter 1930 sprintf(buffer,
410     "------------------------------------------------------------------\n");
411     result += buffer;
412 gezelter 1490
413 gezelter 1930 sprintf(buffer, "Visitor name: %s\n", visitorName.c_str());
414     result += buffer;
415 gezelter 1490
416 gezelter 1930 sprintf(buffer,
417     "Visitor Description: copy atom infomation into atom data\n");
418     result += buffer;
419 gezelter 1490
420 gezelter 1930 sprintf(buffer,
421     "------------------------------------------------------------------\n");
422     result += buffer;
423 gezelter 1490
424 gezelter 1930 return result;
425     }
426     } //namespace oopse

Properties

Name Value
svn:executable *