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

# Content
1 #include <cstring>
2 #include "visitors/AtomVisitor.hpp"
3 #include "primitives/DirectionalAtom.hpp"
4 #include "math/MatVec3.h"
5 #include "primitives/RigidBody.hpp"
6
7 namespace oopse {
8
9 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 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 //----------------------------------------------------------------------------//
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
392 }//namespace oopse

Properties

Name Value
svn:executable *