ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/group/branches/new_design/OOPSE-3.0/src/visitors/AtomVisitor.cpp
Revision: 1725
Committed: Wed Nov 10 22:01:06 2004 UTC (19 years, 8 months ago) by tim
File size: 6865 byte(s)
Log Message:
another painful day
(1) SimCreator, SimInfo, mpiSimulation
(2) DumpReader, DumpWriter (InitializeFrom File will be removed)
(3) ForceField (at least LJ) and BondType, BendType, TorsionType
(4)Integrator
(5)oopse.cpp
(6)visitors & Dump2XYZ
(7)SimpleBuilder
(8)Constraint & ZConstraint

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 void BaseAtomVisitor::visit(RigidBody *rb) {
9 //vector<Atom*> myAtoms;
10 //vector<Atom*>::iterator atomIter;
11
12 //myAtoms = rb->getAtoms();
13
14 //for(atomIter = myAtoms.begin(); atomIter != myAtoms.end(); ++atomIter)
15 // (*atomIter)->accept(this);
16 }
17
18 void BaseAtomVisitor::setVisited(Atom *atom) {
19 GenericData *data;
20 data = atom->getPropertyByName("VISITED");
21
22 //if visited property is not existed, add it as new property
23 if (data == NULL) {
24 data = new GenericData();
25 data->setID("VISITED");
26 atom->addProperty(data);
27 }
28 }
29
30 bool BaseAtomVisitor::isVisited(Atom *atom) {
31 GenericData *data;
32 data = atom->getPropertyByName("VISITED");
33 return data == NULL ? false : true;
34 }
35
36 bool SSDAtomVisitor::isSSDAtom(const string&atomType) {
37 vector<string>::iterator strIter;
38
39 for( strIter = ssdAtomType.begin(); strIter != ssdAtomType.end();
40 ++strIter )
41 if (*strIter == atomType)
42 return true;
43
44 return false;
45 }
46
47 void SSDAtomVisitor::visit(DirectionalAtom *datom) {
48 vector<AtomInfo *>atoms;
49
50 //we need to convert SSD into 4 differnet atoms
51 //one oxygen atom, two hydrogen atoms and one pseudo atom which is the center of the mass
52 //of the water with a dipole moment
53 Vector3d h1(0.0, -0.75695, 0.5206);
54 Vector3d h2(0.0, 0.75695, 0.5206);
55 Vector3d ox(0.0, 0.0, -0.0654);
56 Vector3d u(0, 0, 1);
57 RotMat3x3d rotMatrix;
58 RotMat3x3d rotTrans;
59 AtomInfo * atomInfo;
60 Vector3d pos;
61 Vector3d newVec;
62 Quat4d q;
63 AtomData * atomData;
64 GenericData *data;
65 bool haveAtomData;
66
67 //if atom is not SSD atom, just skip it
68 if (!isSSDAtom(datom->getType()))
69 return;
70
71 data = datom->getPropertyByName("ATOMDATA");
72
73 if (data != NULL) {
74 atomData = dynamic_cast<AtomData *>(data);
75
76 if (atomData == NULL) {
77 cerr << "can not get Atom Data from " << datom->getType() << endl;
78 atomData = new AtomData;
79 haveAtomData = false;
80 } else
81 haveAtomData = true;
82 } else {
83 atomData = new AtomData;
84 haveAtomData = false;
85 }
86
87 pos = datom->getPos();
88 q = datom->getQ();
89 rotMatrix = datom->getA();
90
91 // We need A^T to convert from body-fixed to space-fixed:
92 //transposeMat3(rotMatrix, rotTrans);
93 rotTrans = rotMatrix.transpose();
94
95 //center of mass of the water molecule
96 //matVecMul3(rotTrans, u, newVec);
97 newVec = rotTrans * u;
98
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 newVec = rotTrans * ox;
113
114 atomInfo = new AtomInfo;
115 atomInfo->AtomType = "O";
116 atomInfo->pos[0] = pos[0] + newVec[0];
117 atomInfo->pos[1] = pos[1] + newVec[1];
118 atomInfo->pos[2] = pos[2] + newVec[2];
119 atomInfo->dipole[0] = 0.0;
120 atomInfo->dipole[1] = 0.0;
121 atomInfo->dipole[2] = 0.0;
122 atomData->addAtomInfo(atomInfo);
123
124 //hydrogen1
125 //matVecMul3(rotTrans, h1, newVec);
126 newVec = rotTrans * h1;
127 atomInfo = new AtomInfo;
128 atomInfo->AtomType = "H";
129 atomInfo->pos[0] = pos[0] + newVec[0];
130 atomInfo->pos[1] = pos[1] + newVec[1];
131 atomInfo->pos[2] = pos[2] + newVec[2];
132 atomInfo->dipole[0] = 0.0;
133 atomInfo->dipole[1] = 0.0;
134 atomInfo->dipole[2] = 0.0;
135 atomData->addAtomInfo(atomInfo);
136
137 //hydrogen2
138 //matVecMul3(rotTrans, h2, newVec);
139 newVec = rotTrans * h2;
140 atomInfo = new AtomInfo;
141 atomInfo->AtomType = "H";
142 atomInfo->pos[0] = pos[0] + newVec[0];
143 atomInfo->pos[1] = pos[1] + newVec[1];
144 atomInfo->pos[2] = pos[2] + newVec[2];
145 atomInfo->dipole[0] = 0.0;
146 atomInfo->dipole[1] = 0.0;
147 atomInfo->dipole[2] = 0.0;
148 atomData->addAtomInfo(atomInfo);
149
150 //add atom data into atom's property
151
152 if (!haveAtomData) {
153 atomData->setID("ATOMDATA");
154 datom->addProperty(atomData);
155 }
156
157 setVisited(datom);
158 }
159
160 const string SSDAtomVisitor::toString() {
161 char buffer[65535];
162 string result;
163
164 sprintf(buffer,
165 "------------------------------------------------------------------\n");
166 result += buffer;
167
168 sprintf(buffer, "Visitor name: %s\n", visitorName.c_str());
169 result += buffer;
170
171 sprintf(buffer,
172 "Visitor Description: Convert SSD into 4 different atoms\n");
173 result += buffer;
174
175 sprintf(buffer,
176 "------------------------------------------------------------------\n");
177 result += buffer;
178
179 return result;
180 }
181
182 //----------------------------------------------------------------------------//
183
184 void DefaultAtomVisitor::visit(Atom *atom) {
185 AtomData *atomData;
186 AtomInfo *atomInfo;
187 Vector3d pos;
188
189 if (isVisited(atom))
190 return;
191
192 atomInfo = new AtomInfo;
193
194 atomData = new AtomData;
195 atomData->setID("ATOMDATA");
196
197 pos = atom->getPos();
198 atomInfo->AtomType = atom->getType();
199 atomInfo->pos[0] = pos[0];
200 atomInfo->pos[1] = pos[1];
201 atomInfo->pos[2] = pos[2];
202 atomInfo->dipole[0] = 0.0;
203 atomInfo->dipole[1] = 0.0;
204 atomInfo->dipole[2] = 0.0;
205
206 atomData->addAtomInfo(atomInfo);
207
208 atom->addProperty(atomData);
209
210 setVisited(atom);
211 }
212
213 void DefaultAtomVisitor::visit(DirectionalAtom *datom) {
214 AtomData *atomData;
215 AtomInfo *atomInfo;
216 Vector3d pos;
217 Vector3d u;
218
219 if (isVisited(datom))
220 return;
221
222 pos = datom->getPos();
223 u = datom->getUnitVector();
224
225 atomData = new AtomData;
226 atomData->setID("ATOMDATA");
227 atomInfo = new AtomInfo;
228
229 atomInfo->AtomType = datom->getType();
230 atomInfo->pos[0] = pos[0];
231 atomInfo->pos[1] = pos[1];
232 atomInfo->pos[2] = pos[2];
233 atomInfo->dipole[0] = u[0];
234 atomInfo->dipole[1] = u[1];
235 atomInfo->dipole[2] = u[2];
236
237 atomData->addAtomInfo(atomInfo);
238
239 datom->addProperty(atomData);
240
241 setVisited(datom);
242 }
243
244 const string DefaultAtomVisitor::toString() {
245 char buffer[65535];
246 string result;
247
248 sprintf(buffer,
249 "------------------------------------------------------------------\n");
250 result += buffer;
251
252 sprintf(buffer, "Visitor name: %s\n", visitorName.c_str());
253 result += buffer;
254
255 sprintf(buffer,
256 "Visitor Description: copy atom infomation into atom data\n");
257 result += buffer;
258
259 sprintf(buffer,
260 "------------------------------------------------------------------\n");
261 result += buffer;
262
263 return result;
264 }
265 } //namespace oopse

Properties

Name Value
svn:executable *