ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/OpenMD/branches/development/src/brains/DataStorage.cpp
Revision: 1710
Committed: Fri May 18 21:44:02 2012 UTC (12 years, 11 months ago) by gezelter
File size: 14720 byte(s)
Log Message:
Added an adapter layer between the AtomType and the rest of the code to 
handle the bolt-on capabilities of new types. 

Fixed a long-standing bug in how storageLayout was being set to the maximum
possible value.

Started to add infrastructure for Polarizable and fluc-Q calculations.

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

Properties

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