ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/OpenMD/branches/development/src/brains/DataStorage.cpp
Revision: 1808
Committed: Mon Oct 22 20:42:10 2012 UTC (12 years, 6 months ago) by gezelter
File size: 14658 byte(s)
Log Message:
A bug fix in the electric field for the new electrostatic code.  Also comment fixes for Doxygen 

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

Properties

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