ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/OpenMD/trunk/src/brains/DataStorage.cpp
Revision: 1993
Committed: Tue Apr 29 17:32:31 2014 UTC (11 years ago) by gezelter
File size: 15013 byte(s)
Log Message:
Added sitePotentials for the Choi et al. potential-frequency maps for nitriles

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

Properties

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