ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/group/trunk/OOPSE-2.0/src/visitors/AtomVisitor.cpp
Revision: 1718
Committed: Fri Nov 5 21:45:14 2004 UTC (19 years, 8 months ago) by chrisfen
File size: 9654 byte(s)
Log Message:
Added the linear visitor

File Contents

# User Rev Content
1 gezelter 1490 #include <cstring>
2 tim 1492 #include "visitors/AtomVisitor.hpp"
3     #include "primitives/DirectionalAtom.hpp"
4     #include "math/MatVec3.h"
5     #include "primitives/RigidBody.hpp"
6 gezelter 1490
7 tim 1625 namespace oopse {
8    
9 gezelter 1490 void BaseAtomVisitor::visit(RigidBody* rb){
10     //vector<Atom*> myAtoms;
11     //vector<Atom*>::iterator atomIter;
12    
13     //myAtoms = rb->getAtoms();
14    
15     //for(atomIter = myAtoms.begin(); atomIter != myAtoms.end(); ++atomIter)
16     // (*atomIter)->accept(this);
17     }
18    
19     void BaseAtomVisitor::setVisited(Atom* atom){
20     GenericData* data;
21     data = atom->getProperty("VISITED");
22    
23     //if visited property is not existed, add it as new property
24     if(data == NULL){
25     data = new GenericData();
26     data->setID("VISITED");
27     atom->addProperty(data);
28     }
29     }
30    
31     bool BaseAtomVisitor::isVisited(Atom* atom){
32     GenericData* data;
33     data = atom->getProperty("VISITED");
34     return data == NULL ? false : true;
35     }
36    
37     bool SSDAtomVisitor::isSSDAtom(const string& atomType){
38     vector<string>::iterator strIter;
39    
40     for(strIter = ssdAtomType.begin(); strIter != ssdAtomType.end(); ++strIter)
41     if(*strIter == atomType)
42     return true;
43    
44     return false;
45     }
46    
47     void SSDAtomVisitor::visit(DirectionalAtom* datom){
48    
49     vector<AtomInfo*> atoms;
50    
51     //we need to convert SSD into 4 differnet atoms
52     //one oxygen atom, two hydrogen atoms and one pseudo atom which is the center of the mass
53     //of the water with a dipole moment
54     double h1[3] = {0.0, -0.75695, 0.5206};
55     double h2[3] = {0.0, 0.75695, 0.5206};
56     double ox[3] = {0.0, 0.0, -0.0654};
57     double u[3] = {0, 0, 1};
58     double rotMatrix[3][3];
59     double rotTrans[3][3];
60     AtomInfo* atomInfo;
61     double pos[3];
62     double newVec[3];
63     double q[4];
64     AtomData* atomData;
65     GenericData* data;
66     bool haveAtomData;
67    
68     //if atom is not SSD atom, just skip it
69     if(!isSSDAtom(datom->getType()))
70     return;
71    
72     data = datom->getProperty("ATOMDATA");
73     if(data != NULL){
74    
75     atomData = dynamic_cast<AtomData*>(data);
76     if(atomData == NULL){
77     cerr << "can not get Atom Data from " << datom->getType() << endl;
78     atomData = new AtomData;
79     haveAtomData = false;
80     }
81     else
82     haveAtomData = true;
83     }
84     else{
85     atomData = new AtomData;
86     haveAtomData = false;
87     }
88    
89    
90     datom->getPos(pos);
91     datom->getQ(q);
92     datom->getA(rotMatrix);
93    
94     // We need A^T to convert from body-fixed to space-fixed:
95     transposeMat3(rotMatrix, rotTrans);
96    
97     //center of mass of the water molecule
98     matVecMul3(rotTrans, u, newVec);
99     atomInfo = new AtomInfo;
100     atomInfo->AtomType = "X";
101     atomInfo->pos[0] = pos[0];
102     atomInfo->pos[1] = pos[1];
103     atomInfo->pos[2] = pos[2];
104     atomInfo->dipole[0] = newVec[0];
105     atomInfo->dipole[1] = newVec[1];
106     atomInfo->dipole[2] = newVec[2];
107    
108     atomData->addAtomInfo(atomInfo);
109    
110     //oxygen
111     matVecMul3(rotTrans, ox, newVec);
112     atomInfo = new AtomInfo;
113     atomInfo->AtomType = "O";
114     atomInfo->pos[0] = pos[0] + newVec[0];
115     atomInfo->pos[1] = pos[1] + newVec[1];
116     atomInfo->pos[2] = pos[2] + newVec[2];
117     atomInfo->dipole[0] = 0.0;
118     atomInfo->dipole[1] = 0.0;
119     atomInfo->dipole[2] = 0.0;
120     atomData->addAtomInfo(atomInfo);
121    
122    
123     //hydrogen1
124     matVecMul3(rotTrans, h1, newVec);
125     atomInfo = new AtomInfo;
126     atomInfo->AtomType = "H";
127     atomInfo->pos[0] = pos[0] + newVec[0];
128     atomInfo->pos[1] = pos[1] + newVec[1];
129     atomInfo->pos[2] = pos[2] + newVec[2];
130     atomInfo->dipole[0] = 0.0;
131     atomInfo->dipole[1] = 0.0;
132     atomInfo->dipole[2] = 0.0;
133     atomData->addAtomInfo(atomInfo);
134    
135     //hydrogen2
136     matVecMul3(rotTrans, h2, newVec);
137     atomInfo = new AtomInfo;
138     atomInfo->AtomType = "H";
139     atomInfo->pos[0] = pos[0] + newVec[0];
140     atomInfo->pos[1] = pos[1] + newVec[1];
141     atomInfo->pos[2] = pos[2] + newVec[2];
142     atomInfo->dipole[0] = 0.0;
143     atomInfo->dipole[1] = 0.0;
144     atomInfo->dipole[2] = 0.0;
145     atomData->addAtomInfo(atomInfo);
146    
147     //add atom data into atom's property
148    
149     if(!haveAtomData){
150     atomData->setID("ATOMDATA");
151     datom->addProperty(atomData);
152     }
153    
154     setVisited(datom);
155    
156     }
157    
158     const string SSDAtomVisitor::toString(){
159     char buffer[65535];
160     string result;
161    
162     sprintf(buffer ,"------------------------------------------------------------------\n");
163     result += buffer;
164    
165     sprintf(buffer ,"Visitor name: %s\n", visitorName.c_str());
166     result += buffer;
167    
168     sprintf(buffer , "Visitor Description: Convert SSD into 4 different atoms\n");
169     result += buffer;
170    
171     sprintf(buffer ,"------------------------------------------------------------------\n");
172     result += buffer;
173    
174     return result;
175     }
176    
177 chrisfen 1718 bool LinearAtomVisitor::isLinearAtom(const string& atomType){
178     vector<string>::iterator strIter;
179    
180     for(strIter = linearAtomType.begin(); strIter != linearAtomType.end();
181     ++strIter)
182     if(*strIter == atomType)
183     return true;
184    
185     return false;
186     }
187    
188     void LinearAtomVisitor::visit(DirectionalAtom* datom){
189    
190     vector<AtomInfo*> atoms;
191    
192     //we need to convert linear into 4 different atoms
193     double c1[3] = {0.0, 0.0, -1.8};
194     double c2[3] = {0.0, 0.0, -0.6};
195     double c3[3] = {0.0, 0.0, 0.6};
196     double c4[3] = {0.0, 0.0, 1.8};
197     double rotMatrix[3][3];
198     double rotTrans[3][3];
199     AtomInfo* atomInfo;
200     double pos[3];
201     double newVec[3];
202     double q[4];
203     AtomData* atomData;
204     GenericData* data;
205     bool haveAtomData;
206    
207     //if atom is not SSD atom, just skip it
208     if(!isLinearAtom(datom->getType()))
209     return;
210    
211     data = datom->getProperty("ATOMDATA");
212     if(data != NULL){
213    
214     atomData = dynamic_cast<AtomData*>(data);
215     if(atomData == NULL){
216     cerr << "can not get Atom Data from " << datom->getType() << endl;
217     atomData = new AtomData;
218     haveAtomData = false;
219     }
220     else
221     haveAtomData = true;
222     }
223     else{
224     atomData = new AtomData;
225     haveAtomData = false;
226     }
227    
228    
229     datom->getPos(pos);
230     datom->getQ(q);
231     datom->getA(rotMatrix);
232    
233     // We need A^T to convert from body-fixed to space-fixed:
234     transposeMat3(rotMatrix, rotTrans);
235    
236     matVecMul3(rotTrans, c1, newVec);
237     atomInfo = new AtomInfo;
238     atomInfo->AtomType = "C";
239     atomInfo->pos[0] = pos[0] + newVec[0];
240     atomInfo->pos[1] = pos[1] + newVec[1];
241     atomInfo->pos[2] = pos[2] + newVec[2];
242     atomInfo->dipole[0] = 0.0;
243     atomInfo->dipole[1] = 0.0;
244     atomInfo->dipole[2] = 0.0;
245     atomData->addAtomInfo(atomInfo);
246    
247     matVecMul3(rotTrans, c2, newVec);
248     atomInfo = new AtomInfo;
249     atomInfo->AtomType = "C";
250     atomInfo->pos[0] = pos[0] + newVec[0];
251     atomInfo->pos[1] = pos[1] + newVec[1];
252     atomInfo->pos[2] = pos[2] + newVec[2];
253     atomInfo->dipole[0] = 0.0;
254     atomInfo->dipole[1] = 0.0;
255     atomInfo->dipole[2] = 0.0;
256     atomData->addAtomInfo(atomInfo);
257    
258     matVecMul3(rotTrans, c3, newVec);
259     atomInfo = new AtomInfo;
260     atomInfo->AtomType = "C";
261     atomInfo->pos[0] = pos[0] + newVec[0];
262     atomInfo->pos[1] = pos[1] + newVec[1];
263     atomInfo->pos[2] = pos[2] + newVec[2];
264     atomInfo->dipole[0] = 0.0;
265     atomInfo->dipole[1] = 0.0;
266     atomInfo->dipole[2] = 0.0;
267     atomData->addAtomInfo(atomInfo);
268    
269     matVecMul3(rotTrans, c4, newVec);
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    
280     //add atom data into atom's property
281    
282     if(!haveAtomData){
283     atomData->setID("ATOMDATA");
284     datom->addProperty(atomData);
285     }
286    
287     setVisited(datom);
288    
289     }
290    
291     const string LinearAtomVisitor::toString(){
292     char buffer[65535];
293     string result;
294    
295     sprintf(buffer ,"------------------------------------------------------------------\n");
296     result += buffer;
297    
298     sprintf(buffer ,"Visitor name: %s\n", visitorName.c_str());
299     result += buffer;
300    
301     sprintf(buffer , "Visitor Description: Convert linear into 4 different atoms\n");
302     result += buffer;
303    
304     sprintf(buffer ,"------------------------------------------------------------------\n");
305     result += buffer;
306    
307     return result;
308     }
309    
310 gezelter 1490 //----------------------------------------------------------------------------//
311    
312     void DefaultAtomVisitor::visit(Atom* atom){
313     AtomData* atomData;
314     AtomInfo* atomInfo;
315     double pos[3];
316    
317     if(isVisited(atom))
318     return;
319    
320     atomInfo =new AtomInfo;
321    
322     atomData = new AtomData;
323     atomData->setID("ATOMDATA");
324    
325     atom->getPos(pos);
326     atomInfo->AtomType = atom->getType();
327     atomInfo->pos[0] = pos[0];
328     atomInfo->pos[1] = pos[1];
329     atomInfo->pos[2] = pos[2];
330     atomInfo->dipole[0] = 0.0;
331     atomInfo->dipole[1] = 0.0;
332     atomInfo->dipole[2] = 0.0;
333    
334    
335     atomData->addAtomInfo(atomInfo);
336    
337     atom->addProperty(atomData);
338    
339     setVisited(atom);
340     }
341     void DefaultAtomVisitor::visit(DirectionalAtom* datom){
342     AtomData* atomData;
343     AtomInfo* atomInfo;
344     double pos[3];
345     double u[3];
346    
347     if(isVisited(datom))
348     return;
349    
350     datom->getPos(pos);
351     datom->getU(u);
352    
353     atomData = new AtomData;
354     atomData->setID("ATOMDATA");
355     atomInfo =new AtomInfo;
356    
357     atomInfo->AtomType = datom->getType();
358     atomInfo->pos[0] = pos[0];
359     atomInfo->pos[1] = pos[1];
360     atomInfo->pos[2] = pos[2];
361     atomInfo->dipole[0] = u[0];
362     atomInfo->dipole[1] = u[1];
363     atomInfo->dipole[2] = u[2];
364    
365     atomData->addAtomInfo(atomInfo);
366    
367     datom->addProperty(atomData);
368    
369     setVisited(datom);
370     }
371    
372    
373     const string DefaultAtomVisitor::toString(){
374     char buffer[65535];
375     string result;
376    
377     sprintf(buffer ,"------------------------------------------------------------------\n");
378     result += buffer;
379    
380     sprintf(buffer ,"Visitor name: %s\n", visitorName.c_str());
381     result += buffer;
382    
383     sprintf(buffer , "Visitor Description: copy atom infomation into atom data\n");
384     result += buffer;
385    
386     sprintf(buffer ,"------------------------------------------------------------------\n");
387     result += buffer;
388    
389     return result;
390     }
391 tim 1625
392     }//namespace oopse

Properties

Name Value
svn:executable *