# | Line 1 | Line 1 | |
---|---|---|
1 | /* | |
2 | < | * Copyright (C) 2000-2004 Object Oriented Parallel Simulation Engine (OOPSE) project |
3 | < | * |
4 | < | * Contact: oopse@oopse.org |
5 | < | * |
6 | < | * This program is free software; you can redistribute it and/or |
7 | < | * modify it under the terms of the GNU Lesser General Public License |
8 | < | * as published by the Free Software Foundation; either version 2.1 |
9 | < | * of the License, or (at your option) any later version. |
10 | < | * All we ask is that proper credit is given for our work, which includes |
11 | < | * - but is not limited to - adding the above copyright notice to the beginning |
12 | < | * of your source code files, and to any copyright notice that you may distribute |
13 | < | * with programs based on this work. |
14 | < | * |
15 | < | * This program is distributed in the hope that it will be useful, |
16 | < | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
17 | < | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
18 | < | * GNU Lesser General Public License for more details. |
19 | < | * |
20 | < | * You should have received a copy of the GNU Lesser General Public License |
21 | < | * along with this program; if not, write to the Free Software |
22 | < | * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. |
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 | < | /** |
43 | < | * @file DataStorage.cpp |
44 | < | * @author tlin |
45 | < | * @date 10/26/2004 |
46 | < | * @time 11:56am |
47 | < | * @version 1.0 |
48 | < | */ |
42 | > | /** |
43 | > | * @file DataStorage.cpp |
44 | > | * @author tlin |
45 | > | * @date 10/26/2004 |
46 | > | * @time 11:56am |
47 | > | * @version 1.0 |
48 | > | */ |
49 | ||
50 | #include "brains/DataStorage.hpp" | |
51 | ||
52 | + | namespace oopse { |
53 | ||
54 | < | DataStorage::DataStorage() : size_(0), storageLayout_(0){ |
54 | > | DataStorage::DataStorage() : size_(0), storageLayout_(0){ |
55 | ||
56 | < | } |
56 | > | } |
57 | ||
58 | < | DataStorage::DataStorage(int size, int storageLayout) : size_(size){ |
58 | > | DataStorage::DataStorage(int size, int storageLayout) : size_(size){ |
59 | setStorageLayout(storageLayout); | |
60 | resize(size); | |
61 | < | } |
61 | > | } |
62 | ||
63 | < | int DataStorage::getSize() { |
63 | > | int DataStorage::getSize() { |
64 | ||
65 | if (storageLayout_ & dslPosition && position.size() != size_) { | |
66 | < | //error |
67 | < | std::cerr << "size does not match"<< std::endl; |
66 | > | //error |
67 | > | std::cerr << "size does not match"<< std::endl; |
68 | } | |
69 | ||
70 | if (storageLayout_ & dslVelocity && velocity.size() != size_) { | |
71 | < | //error |
72 | < | std::cerr << "size does not match"<< std::endl; |
71 | > | //error |
72 | > | std::cerr << "size does not match"<< std::endl; |
73 | } | |
74 | ||
75 | if (storageLayout_ & dslAmat && aMat.size() != size_) { | |
76 | < | //error |
77 | < | std::cerr << "size does not match"<< std::endl; |
76 | > | //error |
77 | > | std::cerr << "size does not match"<< std::endl; |
78 | } | |
79 | ||
80 | if (storageLayout_ & dslAngularMomentum && angularMomentum.size() != size_) { | |
81 | < | //error |
82 | < | std::cerr << "size does not match"<< std::endl; |
81 | > | //error |
82 | > | std::cerr << "size does not match"<< std::endl; |
83 | } | |
84 | ||
85 | < | if (storageLayout_ & dslUnitVector && unitVector.size() != size_) { |
86 | < | //error |
87 | < | std::cerr << "size does not match"<< std::endl; |
85 | > | if (storageLayout_ & dslElectroFrame && electroFrame.size() != size_) { |
86 | > | //error |
87 | > | std::cerr << "size does not match"<< std::endl; |
88 | } | |
89 | ||
90 | if (storageLayout_ & dslZAngle && zAngle.size() != size_) { | |
91 | < | //error |
92 | < | std::cerr << "size does not match"<< std::endl; |
91 | > | //error |
92 | > | std::cerr << "size does not match"<< std::endl; |
93 | } | |
94 | ||
95 | if (storageLayout_ & dslForce && force.size() != size_) { | |
96 | < | //error |
97 | < | std::cerr << "size does not match"<< std::endl; |
96 | > | //error |
97 | > | std::cerr << "size does not match"<< std::endl; |
98 | } | |
99 | ||
100 | if (storageLayout_ & dslTorque && torque.size() != size_) { | |
101 | < | //error |
102 | < | std::cerr << "size does not match"<< std::endl; |
101 | > | //error |
102 | > | std::cerr << "size does not match"<< std::endl; |
103 | } | |
104 | ||
105 | return size_; | |
106 | ||
107 | < | } |
107 | > | } |
108 | ||
109 | < | void DataStorage::resize(int newSize) { |
109 | > | void DataStorage::resize(int newSize) { |
110 | ||
111 | if (storageLayout_ & dslPosition) { | |
112 | < | internalResize(position, newSize); |
112 | > | internalResize(position, newSize); |
113 | } | |
114 | ||
115 | if (storageLayout_ & dslVelocity) { | |
116 | < | internalResize(velocity, newSize); |
116 | > | internalResize(velocity, newSize); |
117 | } | |
118 | ||
119 | if (storageLayout_ & dslAmat) { | |
120 | < | internalResize(aMat, newSize); |
120 | > | internalResize(aMat, newSize); |
121 | } | |
122 | ||
123 | if (storageLayout_ & dslAngularMomentum) { | |
124 | < | internalResize(angularMomentum, newSize); |
124 | > | internalResize(angularMomentum, newSize); |
125 | } | |
126 | ||
127 | < | if (storageLayout_ & dslUnitVector) { |
128 | < | internalResize(unitVector, newSize); |
127 | > | if (storageLayout_ & dslElectroFrame) { |
128 | > | internalResize(electroFrame, newSize); |
129 | } | |
130 | ||
131 | if (storageLayout_ & dslZAngle) { | |
132 | < | internalResize(zAngle, newSize); |
132 | > | internalResize(zAngle, newSize); |
133 | } | |
134 | ||
135 | if (storageLayout_ & dslForce) { | |
136 | < | internalResize(force, newSize); |
136 | > | internalResize(force, newSize); |
137 | } | |
138 | ||
139 | if (storageLayout_ & dslTorque) { | |
140 | < | internalResize(torque, newSize); |
140 | > | internalResize(torque, newSize); |
141 | } | |
142 | ||
143 | size_ = newSize; | |
144 | < | } |
144 | > | } |
145 | ||
146 | < | void DataStorage::reserve(int size) { |
146 | > | void DataStorage::reserve(int size) { |
147 | if (storageLayout_ & dslPosition) { | |
148 | < | position.reserve(size); |
148 | > | position.reserve(size); |
149 | } | |
150 | ||
151 | if (storageLayout_ & dslVelocity) { | |
152 | < | velocity.reserve(size); |
152 | > | velocity.reserve(size); |
153 | } | |
154 | ||
155 | if (storageLayout_ & dslAmat) { | |
156 | < | aMat.reserve(size); |
156 | > | aMat.reserve(size); |
157 | } | |
158 | ||
159 | if (storageLayout_ & dslAngularMomentum) { | |
160 | < | angularMomentum.reserve(size); |
160 | > | angularMomentum.reserve(size); |
161 | } | |
162 | ||
163 | < | if (storageLayout_ & dslUnitVector) { |
164 | < | unitVector.reserve(size); |
163 | > | if (storageLayout_ & dslElectroFrame) { |
164 | > | electroFrame.reserve(size); |
165 | } | |
166 | ||
167 | if (storageLayout_ & dslZAngle) { | |
168 | < | zAngle.reserve(size); |
168 | > | zAngle.reserve(size); |
169 | } | |
170 | ||
171 | if (storageLayout_ & dslForce) { | |
172 | < | force.reserve(size); |
172 | > | force.reserve(size); |
173 | } | |
174 | ||
175 | if (storageLayout_ & dslTorque) { | |
176 | < | torque.reserve(size); |
176 | > | torque.reserve(size); |
177 | } | |
178 | ||
179 | < | } |
179 | > | } |
180 | ||
181 | < | void DataStorage::copy(int source, int num, int target) { |
181 | > | void DataStorage::copy(int source, int num, int target) { |
182 | if (num + target > size_ ) { | |
183 | < | //error |
183 | > | //error |
184 | } | |
185 | ||
186 | if (storageLayout_ & dslPosition) { | |
187 | < | interalCopy(position, source, num, target); |
187 | > | internalCopy(position, source, num, target); |
188 | } | |
189 | ||
190 | if (storageLayout_ & dslVelocity) { | |
191 | < | interalCopy(velocity, source, num, target); |
192 | < | } |
191 | > | internalCopy(velocity, source, num, target); |
192 | > | } |
193 | ||
194 | if (storageLayout_ & dslAmat) { | |
195 | < | interalCopy(aMat, source, num, target); |
196 | < | } |
195 | > | internalCopy(aMat, source, num, target); |
196 | > | } |
197 | ||
198 | if (storageLayout_ & dslAngularMomentum) { | |
199 | < | interalCopy(angularMomentum, source, num, target); |
199 | > | internalCopy(angularMomentum, source, num, target); |
200 | } | |
201 | ||
202 | < | if (storageLayout_ & dslUnitVector) { |
203 | < | interalCopy(unitVector, source, num, target); |
202 | > | if (storageLayout_ & dslElectroFrame) { |
203 | > | internalCopy(electroFrame, source, num, target); |
204 | } | |
205 | ||
206 | if (storageLayout_ & dslZAngle) { | |
207 | < | interalCopy(zAngle, source, num, target); |
207 | > | internalCopy(zAngle, source, num, target); |
208 | } | |
209 | ||
210 | if (storageLayout_ & dslForce) { | |
211 | < | interalCopy(force, source, num, target); |
211 | > | internalCopy(force, source, num, target); |
212 | } | |
213 | ||
214 | if (storageLayout_ & dslTorque) { | |
215 | < | interalCopy(torque, source, num, target); |
215 | > | internalCopy(torque, source, num, target); |
216 | } | |
217 | ||
218 | ||
219 | < | } |
219 | > | } |
220 | ||
221 | < | int DataStorage::getStorageLayout() { |
221 | > | int DataStorage::getStorageLayout() { |
222 | return storageLayout_; | |
223 | < | } |
223 | > | } |
224 | ||
225 | < | void DataStorage::setStorageLayout(int layout) { |
225 | > | void DataStorage::setStorageLayout(int layout) { |
226 | storageLayout_ = layout; | |
227 | resize(size_); | |
228 | < | } |
228 | > | } |
229 | ||
230 | < | double* DataStorage::getArrayPointer(int whichArray) { |
230 | > | RealType* DataStorage::getArrayPointer(int whichArray) { |
231 | ||
232 | switch (whichArray) { | |
233 | < | case dslPosition: |
234 | < | return internalGetArrayPointer(torque); |
235 | < | break; |
233 | > | case dslPosition: |
234 | > | return internalGetArrayPointer(position); |
235 | > | break; |
236 | ||
237 | < | case dslVelocity: |
238 | < | return internalGetArrayPointer(velocity); |
239 | < | break; |
237 | > | case dslVelocity: |
238 | > | return internalGetArrayPointer(velocity); |
239 | > | break; |
240 | ||
241 | < | case dslAmat: |
242 | < | return internalGetArrayPointer(aMat); |
243 | < | break; |
241 | > | case dslAmat: |
242 | > | return internalGetArrayPointer(aMat); |
243 | > | break; |
244 | ||
245 | < | case dslAngularMomentum: |
246 | < | return internalGetArrayPointer(angularMomentum); |
247 | < | break; |
245 | > | case dslAngularMomentum: |
246 | > | return internalGetArrayPointer(angularMomentum); |
247 | > | break; |
248 | ||
249 | < | case dslUnitVector: |
250 | < | return internalGetArrayPointer(unitVector); |
251 | < | break; |
249 | > | case dslElectroFrame: |
250 | > | return internalGetArrayPointer(electroFrame); |
251 | > | break; |
252 | ||
253 | < | case dslZAngle: |
254 | < | return internalGetArrayPointer(zAngle); |
255 | < | break; |
253 | > | case dslZAngle: |
254 | > | return internalGetArrayPointer(zAngle); |
255 | > | break; |
256 | ||
257 | < | case dslForce: |
258 | < | return internalGetArrayPointer(force); |
259 | < | break; |
257 | > | case dslForce: |
258 | > | return internalGetArrayPointer(force); |
259 | > | break; |
260 | ||
261 | < | case dslTorque: |
262 | < | return internalGetArrayPointer(torque); |
263 | < | break; |
261 | > | case dslTorque: |
262 | > | return internalGetArrayPointer(torque); |
263 | > | break; |
264 | ||
265 | < | default: |
266 | < | //error message |
267 | < | return NULL; |
265 | > | default: |
266 | > | //error message |
267 | > | return NULL; |
268 | ||
269 | } | |
270 | < | } |
270 | > | } |
271 | ||
272 | < | double* DataStorage::internalGetArrayPointer(std::vector<Vector3d>& v) { |
272 | > | RealType* DataStorage::internalGetArrayPointer(std::vector<Vector3d>& v) { |
273 | if (v.size() == 0) { | |
274 | < | return NULL; |
274 | > | return NULL; |
275 | } else { | |
276 | < | return v[0].getArrayPointer(); |
276 | > | return v[0].getArrayPointer(); |
277 | } | |
278 | < | } |
278 | > | } |
279 | ||
280 | < | double* DataStorage::internalGetArrayPointer(std::vector<RotMat3x3d>& v) { |
280 | > | RealType* DataStorage::internalGetArrayPointer(std::vector<RotMat3x3d>& v) { |
281 | if (v.size() == 0) { | |
282 | < | return NULL; |
282 | > | return NULL; |
283 | } else { | |
284 | < | return v[0].getArrayPointer(); |
284 | > | return v[0].getArrayPointer(); |
285 | } | |
286 | ||
287 | < | } |
287 | > | } |
288 | ||
289 | < | double* DataStorage::internalGetArrayPointer(std::vector<double>& v) { |
289 | > | RealType* DataStorage::internalGetArrayPointer(std::vector<RealType>& v) { |
290 | if (v.size() == 0) { | |
291 | < | return NULL; |
291 | > | return NULL; |
292 | } else { | |
293 | < | return &(v[0]); |
293 | > | return &(v[0]); |
294 | } | |
295 | ||
296 | < | } |
296 | > | } |
297 | ||
298 | < | template<typename T> |
299 | < | void DataStorage::internalResize(std::vector<T>& v, int newSize){ |
298 | > | template<typename T> |
299 | > | void DataStorage::internalResize(std::vector<T>& v, int newSize){ |
300 | int oldSize = v.size(); | |
301 | ||
302 | if (oldSize == newSize) { | |
303 | < | return; |
303 | > | return; |
304 | } else if (oldSize < newSize) { | |
305 | < | v.insert(v.end(), newSize-oldSize, T()); |
305 | > | v.insert(v.end(), newSize-oldSize, T()); |
306 | } else { | |
307 | < | typename std::vector<T>::iterator i; |
308 | < | i = v.begin(); |
309 | < | std::advance(i, newSize); |
310 | < | v.erase(i, v.end()); |
307 | > | typename std::vector<T>::iterator i; |
308 | > | i = v.begin(); |
309 | > | std::advance(i, newSize); |
310 | > | v.erase(i, v.end()); |
311 | } | |
312 | < | } |
312 | > | } |
313 | ||
314 | < | template<typename T> |
315 | < | void DataStorage::interalCopy(std::vector<T>& v, int source, int num, int target) { |
314 | > | template<typename T> |
315 | > | void DataStorage::internalCopy(std::vector<T>& v, int source, int num, int target) { |
316 | typename std::vector<T>::iterator first; | |
317 | typename std::vector<T>::iterator last; | |
318 | typename std::vector<T>::iterator result; | |
# | Line 310 | Line 327 | void DataStorage::interalCopy(std::vector<T>& v, int s | |
327 | std::advance(result, target ); | |
328 | ||
329 | std::copy(first, last, result); | |
330 | + | } |
331 | + | |
332 | + | int DataStorage::getBytesPerStuntDouble(int layout) { |
333 | + | int bytes = 0; |
334 | + | if (layout & dslPosition) { |
335 | + | bytes += sizeof(Vector3d); |
336 | + | } |
337 | + | if (layout & dslVelocity) { |
338 | + | bytes += sizeof(Vector3d); |
339 | + | } |
340 | + | if (layout & dslAmat) { |
341 | + | bytes += sizeof(Mat3x3d); |
342 | + | } |
343 | + | if (layout & dslAngularMomentum) { |
344 | + | bytes += sizeof(Vector3d); |
345 | + | } |
346 | + | if (layout & dslElectroFrame) { |
347 | + | bytes += sizeof(Mat3x3d); |
348 | + | } |
349 | + | if (layout & dslZAngle) { |
350 | + | bytes += sizeof(Vector3d); |
351 | + | } |
352 | + | if (layout & dslForce) { |
353 | + | bytes += sizeof(Vector3d); |
354 | + | } |
355 | + | if (layout & dslTorque) { |
356 | + | bytes += sizeof(Vector3d); |
357 | + | } |
358 | + | return bytes; |
359 | + | } |
360 | + | |
361 | } |
– | Removed lines |
+ | Added lines |
< | Changed lines |
> | Changed lines |