ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/OpenMD/branches/development/src/brains/DataStorage.cpp
Revision: 1584
Committed: Fri Jun 17 20:16:35 2011 UTC (13 years, 10 months ago) by gezelter
File size: 13016 byte(s)
Log Message:
bug fixes.

File Contents

# User Rev Content
1 gezelter 507 /*
2 gezelter 246 * Copyright (c) 2005 The University of Notre Dame. All Rights Reserved.
3 tim 155 *
4 gezelter 246 * 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 gezelter 1390 * 1. Redistributions of source code must retain the above copyright
10 gezelter 246 * notice, this list of conditions and the following disclaimer.
11     *
12 gezelter 1390 * 2. Redistributions in binary form must reproduce the above copyright
13 gezelter 246 * notice, this list of conditions and the following disclaimer in the
14     * documentation and/or other materials provided with the
15     * distribution.
16     *
17     * This software is provided "AS IS," without a warranty of any
18     * kind. All express or implied conditions, representations and
19     * warranties, including any implied warranty of merchantability,
20     * fitness for a particular purpose or non-infringement, are hereby
21     * excluded. The University of Notre Dame and its licensors shall not
22     * be liable for any damages suffered by licensee as a result of
23     * using, modifying or distributing the software or its
24     * derivatives. In no event will the University of Notre Dame or its
25     * licensors be liable for any lost revenue, profit or data, or for
26     * direct, indirect, special, consequential, incidental or punitive
27     * damages, however caused and regardless of the theory of liability,
28     * arising out of the use of or inability to use software, even if the
29     * University of Notre Dame has been advised of the possibility of
30     * such damages.
31 gezelter 1390 *
32     * SUPPORT OPEN SCIENCE! If you use OpenMD or its source code in your
33     * research, please cite the appropriate papers when you publish your
34     * work. Good starting points are:
35     *
36     * [1] Meineke, et al., J. Comp. Chem. 26, 252-271 (2005).
37     * [2] Fennell & Gezelter, J. Chem. Phys. 124, 234104 (2006).
38     * [3] Sun, Lin & Gezelter, J. Chem. Phys. 128, 24107 (2008).
39     * [4] Vardeman & Gezelter, in progress (2009).
40 tim 155 */
41    
42 gezelter 507 /**
43     * @file DataStorage.cpp
44     * @author tlin
45     * @date 10/26/2004
46     * @time 11:56am
47     * @version 1.0
48     */
49 tim 155
50     #include "brains/DataStorage.hpp"
51    
52 gezelter 1390 namespace OpenMD {
53 tim 155
54 gezelter 507 DataStorage::DataStorage() : size_(0), storageLayout_(0){
55 tim 155
56 gezelter 507 }
57 tim 155
58 gezelter 507 DataStorage::DataStorage(int size, int storageLayout) : size_(size){
59 tim 155 setStorageLayout(storageLayout);
60     resize(size);
61 gezelter 507 }
62 tim 155
63 gezelter 507 int DataStorage::getSize() {
64 tim 155
65     if (storageLayout_ & dslPosition && position.size() != size_) {
66 gezelter 507 //error
67     std::cerr << "size does not match"<< std::endl;
68 tim 155 }
69    
70     if (storageLayout_ & dslVelocity && velocity.size() != size_) {
71 gezelter 507 //error
72     std::cerr << "size does not match"<< std::endl;
73 tim 155 }
74    
75     if (storageLayout_ & dslAmat && aMat.size() != size_) {
76 gezelter 507 //error
77     std::cerr << "size does not match"<< std::endl;
78 tim 155 }
79    
80     if (storageLayout_ & dslAngularMomentum && angularMomentum.size() != size_) {
81 gezelter 507 //error
82     std::cerr << "size does not match"<< std::endl;
83 tim 155 }
84    
85 gezelter 246 if (storageLayout_ & dslElectroFrame && electroFrame.size() != size_) {
86 gezelter 507 //error
87     std::cerr << "size does not match"<< std::endl;
88 tim 155 }
89    
90     if (storageLayout_ & dslZAngle && zAngle.size() != size_) {
91 gezelter 507 //error
92     std::cerr << "size does not match"<< std::endl;
93 tim 155 }
94    
95     if (storageLayout_ & dslForce && force.size() != size_) {
96 gezelter 507 //error
97     std::cerr << "size does not match"<< std::endl;
98 tim 155 }
99    
100     if (storageLayout_ & dslTorque && torque.size() != size_) {
101 gezelter 507 //error
102     std::cerr << "size does not match"<< std::endl;
103 tim 155 }
104 gezelter 1583
105 chuckv 1245 if (storageLayout_ & dslParticlePot && particlePot.size() != size_) {
106     //error
107     std::cerr << "size does not match"<< std::endl;
108     }
109 gezelter 1583
110     if (storageLayout_ & dslDensity && density.size() != size_) {
111     //error
112     std::cerr << "size does not match"<< std::endl;
113     }
114    
115     if (storageLayout_ & dslFunctional && functional.size() != size_) {
116     //error
117     std::cerr << "size does not match"<< std::endl;
118     }
119    
120     if (storageLayout_ & dslFunctionalDerivative && functionalDerivative.size() != size_) {
121     //error
122     std::cerr << "size does not match"<< std::endl;
123     }
124    
125     if (storageLayout_ & dslElectricField && electricField.size() != size_) {
126     //error
127     std::cerr << "size does not match"<< std::endl;
128     }
129 gezelter 1584
130     if (storageLayout_ & dslSkippedCharge && skippedCharge.size() != size_) {
131     //error
132     std::cerr << "size does not match"<< std::endl;
133     }
134 chuckv 1245
135 tim 155 return size_;
136    
137 gezelter 507 }
138 tim 155
139 gezelter 507 void DataStorage::resize(int newSize) {
140 tim 155
141     if (storageLayout_ & dslPosition) {
142 gezelter 507 internalResize(position, newSize);
143 tim 155 }
144    
145     if (storageLayout_ & dslVelocity) {
146 gezelter 507 internalResize(velocity, newSize);
147 tim 155 }
148    
149     if (storageLayout_ & dslAmat) {
150 gezelter 507 internalResize(aMat, newSize);
151 tim 155 }
152    
153     if (storageLayout_ & dslAngularMomentum) {
154 gezelter 507 internalResize(angularMomentum, newSize);
155 tim 155 }
156    
157 gezelter 246 if (storageLayout_ & dslElectroFrame) {
158 gezelter 507 internalResize(electroFrame, newSize);
159 tim 155 }
160    
161     if (storageLayout_ & dslZAngle) {
162 gezelter 507 internalResize(zAngle, newSize);
163 tim 155 }
164    
165     if (storageLayout_ & dslForce) {
166 gezelter 507 internalResize(force, newSize);
167 tim 155 }
168    
169     if (storageLayout_ & dslTorque) {
170 gezelter 507 internalResize(torque, newSize);
171 tim 155 }
172    
173 chuckv 1245 if (storageLayout_ & dslParticlePot) {
174     internalResize(particlePot, newSize);
175     }
176    
177 gezelter 1583 if (storageLayout_ & dslDensity) {
178     internalResize(density, newSize);
179     }
180    
181     if (storageLayout_ & dslFunctional) {
182     internalResize(functional, newSize);
183     }
184    
185     if (storageLayout_ & dslFunctionalDerivative) {
186     internalResize(functionalDerivative, newSize);
187     }
188    
189     if (storageLayout_ & dslElectricField) {
190     internalResize(electricField, newSize);
191     }
192    
193 gezelter 1584 if (storageLayout_ & dslSkippedCharge) {
194     internalResize(skippedCharge, newSize);
195     }
196    
197 tim 155 size_ = newSize;
198 gezelter 507 }
199 tim 155
200 gezelter 507 void DataStorage::reserve(int size) {
201 tim 155 if (storageLayout_ & dslPosition) {
202 gezelter 507 position.reserve(size);
203 tim 155 }
204    
205     if (storageLayout_ & dslVelocity) {
206 gezelter 507 velocity.reserve(size);
207 tim 155 }
208    
209     if (storageLayout_ & dslAmat) {
210 gezelter 507 aMat.reserve(size);
211 tim 155 }
212    
213     if (storageLayout_ & dslAngularMomentum) {
214 gezelter 507 angularMomentum.reserve(size);
215 tim 155 }
216    
217 gezelter 246 if (storageLayout_ & dslElectroFrame) {
218 gezelter 507 electroFrame.reserve(size);
219 tim 155 }
220    
221     if (storageLayout_ & dslZAngle) {
222 gezelter 507 zAngle.reserve(size);
223 tim 155 }
224    
225     if (storageLayout_ & dslForce) {
226 gezelter 507 force.reserve(size);
227 tim 155 }
228    
229     if (storageLayout_ & dslTorque) {
230 gezelter 507 torque.reserve(size);
231 tim 155 }
232 chuckv 1245
233     if (storageLayout_ & dslParticlePot) {
234     particlePot.reserve(size);
235     }
236 tim 155
237 gezelter 1583 if (storageLayout_ & dslDensity) {
238     density.reserve(size);
239     }
240    
241     if (storageLayout_ & dslFunctional) {
242     functional.reserve(size);
243     }
244    
245     if (storageLayout_ & dslFunctionalDerivative) {
246     functionalDerivative.reserve(size);
247     }
248    
249     if (storageLayout_ & dslElectricField) {
250     electricField.reserve(size);
251     }
252    
253 gezelter 1584 if (storageLayout_ & dslSkippedCharge) {
254     skippedCharge.reserve(size);
255     }
256    
257 gezelter 507 }
258 tim 155
259 gezelter 507 void DataStorage::copy(int source, int num, int target) {
260 tim 155 if (num + target > size_ ) {
261 gezelter 507 //error
262 tim 155 }
263    
264     if (storageLayout_ & dslPosition) {
265 gezelter 507 internalCopy(position, source, num, target);
266 tim 155 }
267    
268     if (storageLayout_ & dslVelocity) {
269 gezelter 507 internalCopy(velocity, source, num, target);
270     }
271 tim 155
272     if (storageLayout_ & dslAmat) {
273 gezelter 507 internalCopy(aMat, source, num, target);
274     }
275 tim 155
276     if (storageLayout_ & dslAngularMomentum) {
277 gezelter 507 internalCopy(angularMomentum, source, num, target);
278 tim 155 }
279    
280 gezelter 246 if (storageLayout_ & dslElectroFrame) {
281 gezelter 507 internalCopy(electroFrame, source, num, target);
282 tim 155 }
283    
284     if (storageLayout_ & dslZAngle) {
285 gezelter 507 internalCopy(zAngle, source, num, target);
286 tim 155 }
287    
288     if (storageLayout_ & dslForce) {
289 gezelter 507 internalCopy(force, source, num, target);
290 tim 155 }
291    
292     if (storageLayout_ & dslTorque) {
293 gezelter 507 internalCopy(torque, source, num, target);
294 tim 155 }
295 chuckv 1245
296     if (storageLayout_ & dslParticlePot) {
297     internalCopy(particlePot, source, num, target);
298     }
299 tim 155
300 gezelter 1583 if (storageLayout_ & dslDensity) {
301     internalCopy(density, source, num, target);
302     }
303    
304     if (storageLayout_ & dslFunctional) {
305     internalCopy(functional, source, num, target);
306     }
307    
308     if (storageLayout_ & dslFunctionalDerivative) {
309     internalCopy(functionalDerivative, source, num, target);
310     }
311    
312     if (storageLayout_ & dslElectricField) {
313     internalCopy(electricField, source, num, target);
314     }
315 gezelter 1584
316     if (storageLayout_ & dslSkippedCharge) {
317     internalCopy(skippedCharge, source, num, target);
318     }
319 gezelter 507 }
320 tim 155
321 gezelter 507 int DataStorage::getStorageLayout() {
322 tim 155 return storageLayout_;
323 gezelter 507 }
324 tim 155
325 gezelter 507 void DataStorage::setStorageLayout(int layout) {
326 tim 155 storageLayout_ = layout;
327     resize(size_);
328 gezelter 507 }
329 tim 155
330 tim 963 RealType* DataStorage::getArrayPointer(int whichArray) {
331 tim 155
332     switch (whichArray) {
333 gezelter 507 case dslPosition:
334     return internalGetArrayPointer(position);
335     break;
336 tim 155
337 gezelter 507 case dslVelocity:
338     return internalGetArrayPointer(velocity);
339     break;
340 tim 155
341 gezelter 507 case dslAmat:
342     return internalGetArrayPointer(aMat);
343     break;
344 tim 155
345 gezelter 507 case dslAngularMomentum:
346     return internalGetArrayPointer(angularMomentum);
347     break;
348 tim 155
349 gezelter 507 case dslElectroFrame:
350     return internalGetArrayPointer(electroFrame);
351     break;
352 tim 155
353 gezelter 507 case dslZAngle:
354     return internalGetArrayPointer(zAngle);
355     break;
356 tim 155
357 gezelter 507 case dslForce:
358     return internalGetArrayPointer(force);
359     break;
360 tim 155
361 gezelter 507 case dslTorque:
362     return internalGetArrayPointer(torque);
363 gezelter 1104 break;
364 chuckv 1245
365     case dslParticlePot:
366     return internalGetArrayPointer(particlePot);
367     break;
368 gezelter 1583
369     case dslDensity:
370     return internalGetArrayPointer(density);
371     break;
372    
373     case dslFunctional:
374     return internalGetArrayPointer(functional);
375     break;
376    
377     case dslFunctionalDerivative:
378     return internalGetArrayPointer(functionalDerivative);
379     break;
380    
381     case dslElectricField:
382     return internalGetArrayPointer(electricField);
383     break;
384 gezelter 1584
385     case dslSkippedCharge:
386     return internalGetArrayPointer(skippedCharge);
387     break;
388 gezelter 1583
389 gezelter 507 default:
390     //error message
391     return NULL;
392 tim 155
393     }
394 gezelter 507 }
395 tim 155
396 tim 963 RealType* DataStorage::internalGetArrayPointer(std::vector<Vector3d>& v) {
397 tim 155 if (v.size() == 0) {
398 gezelter 507 return NULL;
399 tim 155 } else {
400 gezelter 507 return v[0].getArrayPointer();
401 tim 155 }
402 gezelter 507 }
403 tim 155
404 tim 963 RealType* DataStorage::internalGetArrayPointer(std::vector<RotMat3x3d>& v) {
405 tim 155 if (v.size() == 0) {
406 gezelter 507 return NULL;
407 tim 155 } else {
408 gezelter 507 return v[0].getArrayPointer();
409 tim 155 }
410    
411 gezelter 507 }
412 tim 155
413 tim 963 RealType* DataStorage::internalGetArrayPointer(std::vector<RealType>& v) {
414 tim 155 if (v.size() == 0) {
415 gezelter 507 return NULL;
416 tim 155 } else {
417 gezelter 507 return &(v[0]);
418 tim 155 }
419    
420 gezelter 507 }
421 tim 155
422 gezelter 507 template<typename T>
423     void DataStorage::internalResize(std::vector<T>& v, int newSize){
424 tim 155 int oldSize = v.size();
425    
426     if (oldSize == newSize) {
427 gezelter 507 return;
428 tim 155 } else if (oldSize < newSize) {
429 gezelter 507 v.insert(v.end(), newSize-oldSize, T());
430 tim 155 } else {
431 gezelter 507 typename std::vector<T>::iterator i;
432     i = v.begin();
433     std::advance(i, newSize);
434     v.erase(i, v.end());
435 tim 155 }
436 gezelter 507 }
437 tim 155
438 gezelter 507 template<typename T>
439     void DataStorage::internalCopy(std::vector<T>& v, int source, int num, int target) {
440 tim 155 typename std::vector<T>::iterator first;
441     typename std::vector<T>::iterator last;
442     typename std::vector<T>::iterator result;
443    
444     first = v.begin();
445     last = v.begin();
446     result = v.begin();
447    
448     std::advance(first, source);
449     //STL algorithm use half opened range
450     std::advance(last, num + 1);
451     std::advance(result, target );
452    
453     std::copy(first, last, result);
454 gezelter 507 }
455 tim 323
456 gezelter 507 int DataStorage::getBytesPerStuntDouble(int layout) {
457 tim 323 int bytes = 0;
458     if (layout & dslPosition) {
459 gezelter 507 bytes += sizeof(Vector3d);
460 tim 331 }
461     if (layout & dslVelocity) {
462 gezelter 507 bytes += sizeof(Vector3d);
463 tim 331 }
464     if (layout & dslAmat) {
465 chuckv 1245 bytes += sizeof(RotMat3x3d);
466 tim 331 }
467     if (layout & dslAngularMomentum) {
468 gezelter 507 bytes += sizeof(Vector3d);
469 tim 331 }
470     if (layout & dslElectroFrame) {
471 gezelter 507 bytes += sizeof(Mat3x3d);
472 tim 331 }
473     if (layout & dslZAngle) {
474 chuckv 1245 bytes += sizeof(RealType);
475 tim 331 }
476     if (layout & dslForce) {
477 gezelter 507 bytes += sizeof(Vector3d);
478 tim 331 }
479     if (layout & dslTorque) {
480 gezelter 507 bytes += sizeof(Vector3d);
481 tim 323 }
482 chuckv 1245 if (layout & dslParticlePot) {
483     bytes += sizeof(RealType);
484     }
485 gezelter 1583 if (layout & dslDensity) {
486     bytes += sizeof(RealType);
487     }
488     if (layout & dslFunctional) {
489     bytes += sizeof(RealType);
490     }
491     if (layout & dslFunctionalDerivative) {
492     bytes += sizeof(RealType);
493     }
494     if (layout & dslElectricField) {
495     bytes += sizeof(Vector3d);
496     }
497 gezelter 1584 if (layout & dslSkippedCharge) {
498     bytes += sizeof(RealType);
499     }
500 gezelter 1583
501 tim 323 return bytes;
502 gezelter 507 }
503 tim 323
504     }

Properties

Name Value
svn:executable *
svn:keywords Author Id Revision Date