ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/OpenMD/trunk/src/brains/DataStorage.cpp
Revision: 1793
Committed: Fri Aug 31 21:16:10 2012 UTC (12 years, 8 months ago) by gezelter
File size: 13951 byte(s)
Log Message:
Cleaning up some warning messages on linux

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 tim 155
369 gezelter 507 case dslVelocity:
370     return internalGetArrayPointer(velocity);
371 tim 155
372 gezelter 507 case dslAmat:
373     return internalGetArrayPointer(aMat);
374 tim 155
375 gezelter 507 case dslAngularMomentum:
376     return internalGetArrayPointer(angularMomentum);
377 tim 155
378 gezelter 507 case dslElectroFrame:
379     return internalGetArrayPointer(electroFrame);
380 tim 155
381 gezelter 507 case dslForce:
382     return internalGetArrayPointer(force);
383 tim 155
384 gezelter 507 case dslTorque:
385     return internalGetArrayPointer(torque);
386 chuckv 1245
387     case dslParticlePot:
388     return internalGetArrayPointer(particlePot);
389 gezelter 1782
390     case dslDensity:
391     return internalGetArrayPointer(density);
392    
393     case dslFunctional:
394     return internalGetArrayPointer(functional);
395    
396     case dslFunctionalDerivative:
397     return internalGetArrayPointer(functionalDerivative);
398    
399     case dslElectricField:
400     return internalGetArrayPointer(electricField);
401    
402     case dslSkippedCharge:
403     return internalGetArrayPointer(skippedCharge);
404    
405     case dslFlucQPosition:
406     return internalGetArrayPointer(flucQPos);
407    
408     case dslFlucQVelocity:
409     return internalGetArrayPointer(flucQVel);
410    
411     case dslFlucQForce:
412     return internalGetArrayPointer(flucQFrc);
413    
414 gezelter 507 default:
415     //error message
416     return NULL;
417 tim 155
418     }
419 gezelter 507 }
420 tim 155
421 tim 963 RealType* DataStorage::internalGetArrayPointer(std::vector<Vector3d>& v) {
422 tim 155 if (v.size() == 0) {
423 gezelter 507 return NULL;
424 tim 155 } else {
425 gezelter 507 return v[0].getArrayPointer();
426 tim 155 }
427 gezelter 507 }
428 tim 155
429 tim 963 RealType* DataStorage::internalGetArrayPointer(std::vector<RotMat3x3d>& v) {
430 tim 155 if (v.size() == 0) {
431 gezelter 507 return NULL;
432 tim 155 } else {
433 gezelter 507 return v[0].getArrayPointer();
434 tim 155 }
435    
436 gezelter 507 }
437 tim 155
438 tim 963 RealType* DataStorage::internalGetArrayPointer(std::vector<RealType>& v) {
439 tim 155 if (v.size() == 0) {
440 gezelter 507 return NULL;
441 tim 155 } else {
442 gezelter 507 return &(v[0]);
443 tim 155 }
444    
445 gezelter 507 }
446 tim 155
447 gezelter 507 template<typename T>
448     void DataStorage::internalResize(std::vector<T>& v, int newSize){
449 tim 155 int oldSize = v.size();
450    
451     if (oldSize == newSize) {
452 gezelter 507 return;
453 tim 155 } else if (oldSize < newSize) {
454 gezelter 507 v.insert(v.end(), newSize-oldSize, T());
455 tim 155 } else {
456 gezelter 507 typename std::vector<T>::iterator i;
457     i = v.begin();
458     std::advance(i, newSize);
459     v.erase(i, v.end());
460 tim 155 }
461 gezelter 507 }
462 tim 155
463 gezelter 507 template<typename T>
464     void DataStorage::internalCopy(std::vector<T>& v, int source, int num, int target) {
465 tim 155 typename std::vector<T>::iterator first;
466     typename std::vector<T>::iterator last;
467     typename std::vector<T>::iterator result;
468    
469     first = v.begin();
470     last = v.begin();
471     result = v.begin();
472    
473     std::advance(first, source);
474     //STL algorithm use half opened range
475     std::advance(last, num + 1);
476     std::advance(result, target );
477    
478     std::copy(first, last, result);
479 gezelter 507 }
480 tim 323
481 gezelter 507 int DataStorage::getBytesPerStuntDouble(int layout) {
482 tim 323 int bytes = 0;
483     if (layout & dslPosition) {
484 gezelter 507 bytes += sizeof(Vector3d);
485 tim 331 }
486     if (layout & dslVelocity) {
487 gezelter 507 bytes += sizeof(Vector3d);
488 tim 331 }
489     if (layout & dslAmat) {
490 chuckv 1245 bytes += sizeof(RotMat3x3d);
491 tim 331 }
492     if (layout & dslAngularMomentum) {
493 gezelter 507 bytes += sizeof(Vector3d);
494 tim 331 }
495     if (layout & dslElectroFrame) {
496 gezelter 507 bytes += sizeof(Mat3x3d);
497 tim 331 }
498     if (layout & dslForce) {
499 gezelter 507 bytes += sizeof(Vector3d);
500 tim 331 }
501     if (layout & dslTorque) {
502 gezelter 507 bytes += sizeof(Vector3d);
503 tim 323 }
504 chuckv 1245 if (layout & dslParticlePot) {
505     bytes += sizeof(RealType);
506     }
507 gezelter 1782 if (layout & dslDensity) {
508     bytes += sizeof(RealType);
509     }
510     if (layout & dslFunctional) {
511     bytes += sizeof(RealType);
512     }
513     if (layout & dslFunctionalDerivative) {
514     bytes += sizeof(RealType);
515     }
516     if (layout & dslElectricField) {
517     bytes += sizeof(Vector3d);
518     }
519     if (layout & dslSkippedCharge) {
520     bytes += sizeof(RealType);
521     }
522     if (layout & dslFlucQPosition) {
523     bytes += sizeof(RealType);
524     }
525     if (layout & dslFlucQVelocity) {
526     bytes += sizeof(RealType);
527     }
528     if (layout & dslFlucQForce) {
529     bytes += sizeof(RealType);
530     }
531    
532 tim 323 return bytes;
533 gezelter 507 }
534 tim 323
535     }

Properties

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