ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/OpenMD/trunk/src/brains/DataStorage.cpp
Revision: 1782
Committed: Wed Aug 22 02:28:28 2012 UTC (12 years, 8 months ago) by gezelter
File size: 14183 byte(s)
Log Message:
MERGE OpenMD development branch 1465:1781 into trunk

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 gezelter 1782 * [4] Kuang & Gezelter, J. Chem. Phys. 133, 164101 (2010).
40     * [5] Vardeman, Stocker & Gezelter, J. Chem. Theory Comput. 7, 834 (2011).
41 tim 155 */
42    
43 gezelter 507 /**
44     * @file DataStorage.cpp
45     * @author tlin
46     * @date 10/26/2004
47     * @time 11:56am
48     * @version 1.0
49     */
50 tim 155
51     #include "brains/DataStorage.hpp"
52 gezelter 1782 using namespace std;
53 gezelter 1390 namespace OpenMD {
54 tim 155
55 gezelter 507 DataStorage::DataStorage() : size_(0), storageLayout_(0){
56 tim 155
57 gezelter 507 }
58 tim 155
59 gezelter 507 DataStorage::DataStorage(int size, int storageLayout) : size_(size){
60 tim 155 setStorageLayout(storageLayout);
61     resize(size);
62 gezelter 507 }
63 tim 155
64 gezelter 507 int DataStorage::getSize() {
65 tim 155
66     if (storageLayout_ & dslPosition && position.size() != size_) {
67 gezelter 507 //error
68 gezelter 1782 cerr << "size does not match"<< endl;
69 tim 155 }
70    
71     if (storageLayout_ & dslVelocity && velocity.size() != size_) {
72 gezelter 507 //error
73 gezelter 1782 cerr << "size does not match"<< endl;
74 tim 155 }
75    
76     if (storageLayout_ & dslAmat && aMat.size() != size_) {
77 gezelter 507 //error
78 gezelter 1782 cerr << "size does not match"<< endl;
79 tim 155 }
80    
81     if (storageLayout_ & dslAngularMomentum && angularMomentum.size() != size_) {
82 gezelter 507 //error
83 gezelter 1782 cerr << "size does not match"<< endl;
84 tim 155 }
85    
86 gezelter 246 if (storageLayout_ & dslElectroFrame && electroFrame.size() != size_) {
87 gezelter 507 //error
88 gezelter 1782 cerr << "size does not match"<< endl;
89 tim 155 }
90    
91     if (storageLayout_ & dslForce && force.size() != size_) {
92 gezelter 507 //error
93 gezelter 1782 cerr << "size does not match"<< endl;
94 tim 155 }
95    
96     if (storageLayout_ & dslTorque && torque.size() != size_) {
97 gezelter 507 //error
98 gezelter 1782 cerr << "size does not match"<< endl;
99 tim 155 }
100 gezelter 1782
101 chuckv 1245 if (storageLayout_ & dslParticlePot && particlePot.size() != size_) {
102     //error
103 gezelter 1782 cerr << "size does not match"<< endl;
104 chuckv 1245 }
105 gezelter 1782
106     if (storageLayout_ & dslDensity && density.size() != size_) {
107     //error
108     cerr << "size does not match"<< endl;
109     }
110    
111     if (storageLayout_ & dslFunctional && functional.size() != size_) {
112     //error
113     cerr << "size does not match"<< endl;
114     }
115    
116     if (storageLayout_ & dslFunctionalDerivative && functionalDerivative.size() != size_) {
117     //error
118     cerr << "size does not match"<< endl;
119     }
120    
121     if (storageLayout_ & dslElectricField && electricField.size() != size_) {
122     //error
123     cerr << "size does not match"<< endl;
124     }
125    
126     if (storageLayout_ & dslSkippedCharge && skippedCharge.size() != size_) {
127     //error
128     cerr << "size does not match"<< endl;
129     }
130    
131     if (storageLayout_ & dslFlucQPosition && flucQPos.size() != size_) {
132     //error
133     cerr << "size does not match"<< endl;
134     }
135    
136     if (storageLayout_ & dslFlucQVelocity && flucQVel.size() != size_) {
137     //error
138     cerr << "size does not match"<< endl;
139     }
140    
141     if (storageLayout_ & dslFlucQForce && flucQFrc.size() != size_) {
142     //error
143     cerr << "size does not match"<< endl;
144     }
145 chuckv 1245
146 tim 155 return size_;
147    
148 gezelter 507 }
149 tim 155
150 gezelter 507 void DataStorage::resize(int newSize) {
151 tim 155
152     if (storageLayout_ & dslPosition) {
153 gezelter 507 internalResize(position, newSize);
154 tim 155 }
155    
156     if (storageLayout_ & dslVelocity) {
157 gezelter 507 internalResize(velocity, newSize);
158 tim 155 }
159    
160     if (storageLayout_ & dslAmat) {
161 gezelter 507 internalResize(aMat, newSize);
162 tim 155 }
163    
164     if (storageLayout_ & dslAngularMomentum) {
165 gezelter 507 internalResize(angularMomentum, newSize);
166 tim 155 }
167    
168 gezelter 246 if (storageLayout_ & dslElectroFrame) {
169 gezelter 507 internalResize(electroFrame, newSize);
170 tim 155 }
171    
172     if (storageLayout_ & dslForce) {
173 gezelter 507 internalResize(force, newSize);
174 tim 155 }
175    
176     if (storageLayout_ & dslTorque) {
177 gezelter 507 internalResize(torque, newSize);
178 tim 155 }
179    
180 chuckv 1245 if (storageLayout_ & dslParticlePot) {
181     internalResize(particlePot, newSize);
182     }
183    
184 gezelter 1782 if (storageLayout_ & dslDensity) {
185     internalResize(density, newSize);
186     }
187    
188     if (storageLayout_ & dslFunctional) {
189     internalResize(functional, newSize);
190     }
191    
192     if (storageLayout_ & dslFunctionalDerivative) {
193     internalResize(functionalDerivative, newSize);
194     }
195    
196     if (storageLayout_ & dslElectricField) {
197     internalResize(electricField, newSize);
198     }
199    
200     if (storageLayout_ & dslSkippedCharge) {
201     internalResize(skippedCharge, newSize);
202     }
203    
204     if (storageLayout_ & dslFlucQPosition) {
205     internalResize(flucQPos, newSize);
206     }
207    
208     if (storageLayout_ & dslFlucQVelocity) {
209     internalResize(flucQVel, newSize);
210     }
211    
212     if (storageLayout_ & dslFlucQForce) {
213     internalResize(flucQFrc, newSize);
214     }
215    
216 tim 155 size_ = newSize;
217 gezelter 507 }
218 tim 155
219 gezelter 507 void DataStorage::reserve(int size) {
220 tim 155 if (storageLayout_ & dslPosition) {
221 gezelter 507 position.reserve(size);
222 tim 155 }
223    
224     if (storageLayout_ & dslVelocity) {
225 gezelter 507 velocity.reserve(size);
226 tim 155 }
227    
228     if (storageLayout_ & dslAmat) {
229 gezelter 507 aMat.reserve(size);
230 tim 155 }
231    
232     if (storageLayout_ & dslAngularMomentum) {
233 gezelter 507 angularMomentum.reserve(size);
234 tim 155 }
235    
236 gezelter 246 if (storageLayout_ & dslElectroFrame) {
237 gezelter 507 electroFrame.reserve(size);
238 tim 155 }
239    
240     if (storageLayout_ & dslForce) {
241 gezelter 507 force.reserve(size);
242 tim 155 }
243    
244     if (storageLayout_ & dslTorque) {
245 gezelter 507 torque.reserve(size);
246 tim 155 }
247 chuckv 1245
248     if (storageLayout_ & dslParticlePot) {
249     particlePot.reserve(size);
250     }
251 tim 155
252 gezelter 1782 if (storageLayout_ & dslDensity) {
253     density.reserve(size);
254     }
255    
256     if (storageLayout_ & dslFunctional) {
257     functional.reserve(size);
258     }
259    
260     if (storageLayout_ & dslFunctionalDerivative) {
261     functionalDerivative.reserve(size);
262     }
263    
264     if (storageLayout_ & dslElectricField) {
265     electricField.reserve(size);
266     }
267    
268     if (storageLayout_ & dslSkippedCharge) {
269     skippedCharge.reserve(size);
270     }
271    
272     if (storageLayout_ & dslFlucQPosition) {
273     flucQPos.reserve(size);
274     }
275    
276     if (storageLayout_ & dslFlucQVelocity) {
277     flucQVel.reserve(size);
278     }
279    
280     if (storageLayout_ & dslFlucQForce) {
281     flucQFrc.reserve(size);
282     }
283 gezelter 507 }
284 tim 155
285 gezelter 507 void DataStorage::copy(int source, int num, int target) {
286 tim 155 if (num + target > size_ ) {
287 gezelter 507 //error
288 tim 155 }
289    
290     if (storageLayout_ & dslPosition) {
291 gezelter 507 internalCopy(position, source, num, target);
292 tim 155 }
293    
294     if (storageLayout_ & dslVelocity) {
295 gezelter 507 internalCopy(velocity, source, num, target);
296     }
297 tim 155
298     if (storageLayout_ & dslAmat) {
299 gezelter 507 internalCopy(aMat, source, num, target);
300     }
301 tim 155
302     if (storageLayout_ & dslAngularMomentum) {
303 gezelter 507 internalCopy(angularMomentum, source, num, target);
304 tim 155 }
305    
306 gezelter 246 if (storageLayout_ & dslElectroFrame) {
307 gezelter 507 internalCopy(electroFrame, source, num, target);
308 tim 155 }
309    
310     if (storageLayout_ & dslForce) {
311 gezelter 507 internalCopy(force, source, num, target);
312 tim 155 }
313    
314     if (storageLayout_ & dslTorque) {
315 gezelter 507 internalCopy(torque, source, num, target);
316 tim 155 }
317 chuckv 1245
318     if (storageLayout_ & dslParticlePot) {
319     internalCopy(particlePot, source, num, target);
320     }
321 tim 155
322 gezelter 1782 if (storageLayout_ & dslDensity) {
323     internalCopy(density, source, num, target);
324     }
325    
326     if (storageLayout_ & dslFunctional) {
327     internalCopy(functional, source, num, target);
328     }
329    
330     if (storageLayout_ & dslFunctionalDerivative) {
331     internalCopy(functionalDerivative, source, num, target);
332     }
333    
334     if (storageLayout_ & dslElectricField) {
335     internalCopy(electricField, source, num, target);
336     }
337    
338     if (storageLayout_ & dslSkippedCharge) {
339     internalCopy(skippedCharge, source, num, target);
340     }
341    
342     if (storageLayout_ & dslFlucQPosition) {
343     internalCopy(flucQPos, source, num, target);
344     }
345    
346     if (storageLayout_ & dslFlucQVelocity) {
347     internalCopy(flucQVel, source, num, target);
348     }
349     if (storageLayout_ & dslFlucQForce) {
350     internalCopy(flucQFrc, source, num, target);
351     }
352 gezelter 507 }
353 tim 155
354 gezelter 507 int DataStorage::getStorageLayout() {
355 tim 155 return storageLayout_;
356 gezelter 507 }
357 tim 155
358 gezelter 507 void DataStorage::setStorageLayout(int layout) {
359 tim 155 storageLayout_ = layout;
360     resize(size_);
361 gezelter 507 }
362 tim 155
363 tim 963 RealType* DataStorage::getArrayPointer(int whichArray) {
364 tim 155
365     switch (whichArray) {
366 gezelter 507 case dslPosition:
367     return internalGetArrayPointer(position);
368     break;
369 tim 155
370 gezelter 507 case dslVelocity:
371     return internalGetArrayPointer(velocity);
372     break;
373 tim 155
374 gezelter 507 case dslAmat:
375     return internalGetArrayPointer(aMat);
376     break;
377 tim 155
378 gezelter 507 case dslAngularMomentum:
379     return internalGetArrayPointer(angularMomentum);
380     break;
381 tim 155
382 gezelter 507 case dslElectroFrame:
383     return internalGetArrayPointer(electroFrame);
384     break;
385 tim 155
386 gezelter 507 case dslForce:
387     return internalGetArrayPointer(force);
388     break;
389 tim 155
390 gezelter 507 case dslTorque:
391     return internalGetArrayPointer(torque);
392 gezelter 1104 break;
393 chuckv 1245
394     case dslParticlePot:
395     return internalGetArrayPointer(particlePot);
396     break;
397 gezelter 1782
398     case dslDensity:
399     return internalGetArrayPointer(density);
400     break;
401    
402     case dslFunctional:
403     return internalGetArrayPointer(functional);
404     break;
405    
406     case dslFunctionalDerivative:
407     return internalGetArrayPointer(functionalDerivative);
408     break;
409    
410     case dslElectricField:
411     return internalGetArrayPointer(electricField);
412     break;
413    
414     case dslSkippedCharge:
415     return internalGetArrayPointer(skippedCharge);
416     break;
417    
418     case dslFlucQPosition:
419     return internalGetArrayPointer(flucQPos);
420     break;
421    
422     case dslFlucQVelocity:
423     return internalGetArrayPointer(flucQVel);
424     break;
425    
426     case dslFlucQForce:
427     return internalGetArrayPointer(flucQFrc);
428     break;
429    
430 gezelter 507 default:
431     //error message
432     return NULL;
433 tim 155
434     }
435 gezelter 507 }
436 tim 155
437 tim 963 RealType* DataStorage::internalGetArrayPointer(std::vector<Vector3d>& v) {
438 tim 155 if (v.size() == 0) {
439 gezelter 507 return NULL;
440 tim 155 } else {
441 gezelter 507 return v[0].getArrayPointer();
442 tim 155 }
443 gezelter 507 }
444 tim 155
445 tim 963 RealType* DataStorage::internalGetArrayPointer(std::vector<RotMat3x3d>& v) {
446 tim 155 if (v.size() == 0) {
447 gezelter 507 return NULL;
448 tim 155 } else {
449 gezelter 507 return v[0].getArrayPointer();
450 tim 155 }
451    
452 gezelter 507 }
453 tim 155
454 tim 963 RealType* DataStorage::internalGetArrayPointer(std::vector<RealType>& v) {
455 tim 155 if (v.size() == 0) {
456 gezelter 507 return NULL;
457 tim 155 } else {
458 gezelter 507 return &(v[0]);
459 tim 155 }
460    
461 gezelter 507 }
462 tim 155
463 gezelter 507 template<typename T>
464     void DataStorage::internalResize(std::vector<T>& v, int newSize){
465 tim 155 int oldSize = v.size();
466    
467     if (oldSize == newSize) {
468 gezelter 507 return;
469 tim 155 } else if (oldSize < newSize) {
470 gezelter 507 v.insert(v.end(), newSize-oldSize, T());
471 tim 155 } else {
472 gezelter 507 typename std::vector<T>::iterator i;
473     i = v.begin();
474     std::advance(i, newSize);
475     v.erase(i, v.end());
476 tim 155 }
477 gezelter 507 }
478 tim 155
479 gezelter 507 template<typename T>
480     void DataStorage::internalCopy(std::vector<T>& v, int source, int num, int target) {
481 tim 155 typename std::vector<T>::iterator first;
482     typename std::vector<T>::iterator last;
483     typename std::vector<T>::iterator result;
484    
485     first = v.begin();
486     last = v.begin();
487     result = v.begin();
488    
489     std::advance(first, source);
490     //STL algorithm use half opened range
491     std::advance(last, num + 1);
492     std::advance(result, target );
493    
494     std::copy(first, last, result);
495 gezelter 507 }
496 tim 323
497 gezelter 507 int DataStorage::getBytesPerStuntDouble(int layout) {
498 tim 323 int bytes = 0;
499     if (layout & dslPosition) {
500 gezelter 507 bytes += sizeof(Vector3d);
501 tim 331 }
502     if (layout & dslVelocity) {
503 gezelter 507 bytes += sizeof(Vector3d);
504 tim 331 }
505     if (layout & dslAmat) {
506 chuckv 1245 bytes += sizeof(RotMat3x3d);
507 tim 331 }
508     if (layout & dslAngularMomentum) {
509 gezelter 507 bytes += sizeof(Vector3d);
510 tim 331 }
511     if (layout & dslElectroFrame) {
512 gezelter 507 bytes += sizeof(Mat3x3d);
513 tim 331 }
514     if (layout & dslForce) {
515 gezelter 507 bytes += sizeof(Vector3d);
516 tim 331 }
517     if (layout & dslTorque) {
518 gezelter 507 bytes += sizeof(Vector3d);
519 tim 323 }
520 chuckv 1245 if (layout & dslParticlePot) {
521     bytes += sizeof(RealType);
522     }
523 gezelter 1782 if (layout & dslDensity) {
524     bytes += sizeof(RealType);
525     }
526     if (layout & dslFunctional) {
527     bytes += sizeof(RealType);
528     }
529     if (layout & dslFunctionalDerivative) {
530     bytes += sizeof(RealType);
531     }
532     if (layout & dslElectricField) {
533     bytes += sizeof(Vector3d);
534     }
535     if (layout & dslSkippedCharge) {
536     bytes += sizeof(RealType);
537     }
538     if (layout & dslFlucQPosition) {
539     bytes += sizeof(RealType);
540     }
541     if (layout & dslFlucQVelocity) {
542     bytes += sizeof(RealType);
543     }
544     if (layout & dslFlucQForce) {
545     bytes += sizeof(RealType);
546     }
547    
548 tim 323 return bytes;
549 gezelter 507 }
550 tim 323
551     }

Properties

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