ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/group/trunk/OOPSE/libmdtools/AtomVisitor.cpp
Revision: 1132
Committed: Sat Apr 24 04:31:36 2004 UTC (20 years, 2 months ago) by tim
File size: 5942 byte(s)
Log Message:
add reaction field correction to charge-charge interaction

File Contents

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

Properties

Name Value
svn:executable *