ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/OpenMD/branches/development/src/brains/DataStorage.cpp
Revision: 1665
Committed: Tue Nov 22 20:38:56 2011 UTC (13 years, 5 months ago) by gezelter
File size: 13082 byte(s)
Log Message:
updated copyright notices

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

Properties

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