# | Line 1 | Line 1 | |
---|---|---|
1 | /* | |
2 | < | * Copyright (C) 2000-2004 Object Oriented Parallel Simulation Engine (OOPSE) project |
3 | < | * |
4 | < | * Contact: oopse@oopse.org |
5 | < | * |
6 | < | * This program is free software; you can redistribute it and/or |
7 | < | * modify it under the terms of the GNU Lesser General Public License |
8 | < | * as published by the Free Software Foundation; either version 2.1 |
9 | < | * of the License, or (at your option) any later version. |
10 | < | * All we ask is that proper credit is given for our work, which includes |
11 | < | * - but is not limited to - adding the above copyright notice to the beginning |
12 | < | * of your source code files, and to any copyright notice that you may distribute |
13 | < | * with programs based on this work. |
14 | < | * |
15 | < | * This program is distributed in the hope that it will be useful, |
16 | < | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
17 | < | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
18 | < | * GNU Lesser General Public License for more details. |
19 | < | * |
20 | < | * You should have received a copy of the GNU Lesser General Public License |
21 | < | * along with this program; if not, write to the Free Software |
22 | < | * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. |
2 | > | * Copyright (c) 2005 The University of Notre Dame. All Rights Reserved. |
3 | * | |
4 | + | * 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 | + | * 1. Acknowledgement of the program authors must be made in any |
10 | + | * publication of scientific results based in part on use of the |
11 | + | * program. An acceptable form of acknowledgement is citation of |
12 | + | * the article in which the program was described (Matthew |
13 | + | * A. Meineke, Charles F. Vardeman II, Teng Lin, Christopher |
14 | + | * J. Fennell and J. Daniel Gezelter, "OOPSE: An Object-Oriented |
15 | + | * Parallel Simulation Engine for Molecular Dynamics," |
16 | + | * J. Comput. Chem. 26, pp. 252-271 (2005)) |
17 | + | * |
18 | + | * 2. Redistributions of source code must retain the above copyright |
19 | + | * notice, this list of conditions and the following disclaimer. |
20 | + | * |
21 | + | * 3. Redistributions in binary form must reproduce the above copyright |
22 | + | * notice, this list of conditions and the following disclaimer in the |
23 | + | * documentation and/or other materials provided with the |
24 | + | * distribution. |
25 | + | * |
26 | + | * This software is provided "AS IS," without a warranty of any |
27 | + | * kind. All express or implied conditions, representations and |
28 | + | * warranties, including any implied warranty of merchantability, |
29 | + | * fitness for a particular purpose or non-infringement, are hereby |
30 | + | * excluded. The University of Notre Dame and its licensors shall not |
31 | + | * be liable for any damages suffered by licensee as a result of |
32 | + | * using, modifying or distributing the software or its |
33 | + | * derivatives. In no event will the University of Notre Dame or its |
34 | + | * licensors be liable for any lost revenue, profit or data, or for |
35 | + | * direct, indirect, special, consequential, incidental or punitive |
36 | + | * damages, however caused and regardless of the theory of liability, |
37 | + | * arising out of the use of or inability to use software, even if the |
38 | + | * University of Notre Dame has been advised of the possibility of |
39 | + | * such damages. |
40 | */ | |
41 | < | |
41 | > | |
42 | /** | |
43 | * @file Vector.hpp | |
44 | * @author Teng Lin | |
# | Line 37 | Line 53 | |
53 | #include <math/Vector3.hpp> | |
54 | #include <math/SquareMatrix3.hpp> | |
55 | ||
56 | < | using namespace oopse; |
56 | > | namespace oopse { |
57 | > | /** |
58 | > | * @class DataStorage |
59 | > | * @warning do not try to insert element into (or ease element from) private member data |
60 | > | * of DataStorage directly. |
61 | > | * @todo DataStorage may need refactorying. Every std::vector can inherit from the same base class |
62 | > | * which will make it easy to maintain |
63 | > | */ |
64 | > | class DataStorage { |
65 | > | public: |
66 | ||
67 | + | enum{ |
68 | + | dslPosition = 1, |
69 | + | dslVelocity = 2, |
70 | + | dslAmat = 4, |
71 | + | dslAngularMomentum = 8, |
72 | + | dslElectroFrame = 16, |
73 | + | dslZAngle = 32, |
74 | + | dslForce = 64, |
75 | + | dslTorque = 128 |
76 | + | }; |
77 | ||
78 | ||
79 | < | //forward declaration |
80 | < | class Snapshot; |
81 | < | class StuntDouble; |
82 | < | class DataStorageTestCase; |
79 | > | DataStorage(); |
80 | > | DataStorage(int size, int storageLayout = 255); |
81 | > | /** return the size of this DataStorage. */ |
82 | > | int getSize(); |
83 | /** | |
84 | < | * @class DataStorage |
85 | < | * @warning do not try to insert element into (or ease element from) private member data |
51 | < | * of DataStorage directly. |
52 | < | * @todo DataStorage may need refactorying. Every std::vector can inherit from the same base class |
53 | < | * which will make it easy to maintain |
84 | > | * Changes the size of this DataStorage. |
85 | > | * @param size new size of this DataStorage |
86 | */ | |
87 | < | class DataStorage { |
88 | < | public: |
87 | > | void resize(int newSize); |
88 | > | /** |
89 | > | * Reallocates memory manually. The main reason for using reserve() is efficiency |
90 | > | * if you know the capacity to which your std::vector must eventually grow, then it is usually more |
91 | > | * efficient to allocate that memory all at once. |
92 | > | */ |
93 | > | void reserve(int size); |
94 | > | /** |
95 | > | * Copies data inside DataStorage class. |
96 | > | * Copy function actually call std::copy for every std::vector in DataStorage class. |
97 | > | * One Precondition of std::copy is that target is not within the range [soruce, soruce + num] |
98 | > | * @param souce |
99 | > | * @param num number of element to be moved |
100 | > | * @param target |
101 | > | */ |
102 | > | void copy(int source, int num, int target); |
103 | > | /** Returns the storage layout */ |
104 | > | int getStorageLayout(); |
105 | > | /** Sets the storage layout */ |
106 | > | void setStorageLayout(int layout); |
107 | > | /** Returns the pointer of internal array */ |
108 | > | RealType *getArrayPointer(int whichArray); |
109 | ||
110 | < | enum{ |
111 | < | dslPosition = 1, |
112 | < | dslVelocity = 2, |
113 | < | dslAmat = 4, |
114 | < | dslAngularMomentum = 8, |
115 | < | dslUnitVector = 16, |
116 | < | dslZAngle = 32, |
117 | < | dslForce = 64, |
66 | < | dslTorque = 128 |
67 | < | }; |
110 | > | std::vector<Vector3d> position; /** position array */ |
111 | > | std::vector<Vector3d> velocity; /** velocity array */ |
112 | > | std::vector<RotMat3x3d> aMat; /** rotation matrix array */ |
113 | > | std::vector<Vector3d> angularMomentum;/** angular momentum array (body-fixed) */ |
114 | > | std::vector<Mat3x3d> electroFrame; /** the lab frame unit std::vector array*/ |
115 | > | std::vector<RealType> zAngle; /** z -angle array */ |
116 | > | std::vector<Vector3d> force; /** force array */ |
117 | > | std::vector<Vector3d> torque; /** torque array */ |
118 | ||
119 | + | static int getBytesPerStuntDouble(int layout); |
120 | ||
121 | < | DataStorage(); |
71 | < | DataStorage(int size, int storageLayout = 0x11111111); |
72 | < | /** return the size of this DataStorage. */ |
73 | < | int getSize(); |
74 | < | /** |
75 | < | * Changes the size of this DataStorage. |
76 | < | * @param size new size of this DataStorage |
77 | < | */ |
78 | < | void resize(int newSize); |
79 | < | /** |
80 | < | * Reallocates memory manually. The main reason for using reserve() is efficiency |
81 | < | * if you know the capacity to which your std::vector must eventually grow, then it is usually more |
82 | < | * efficient to allocate that memory all at once. |
83 | < | */ |
84 | < | void reserve(int size); |
85 | < | /** |
86 | < | * Copies data inside DataStorage class. |
87 | < | * Copy function actually call std::copy for every std::vector in DataStorage class. |
88 | < | * One Precondition of std::copy is that target is not within the range [soruce, soruce + num] |
89 | < | * @param souce |
90 | < | * @param num number of element to be moved |
91 | < | * @param target |
92 | < | */ |
93 | < | void copy(int source, int num, int target); |
94 | < | /** Returns the storage layout */ |
95 | < | int getStorageLayout(); |
96 | < | /** Sets the storage layout */ |
97 | < | void setStorageLayout(int layout); |
98 | < | /** Returns the pointer of internal array */ |
99 | < | double *getArrayPointer(int whichArray); |
100 | < | friend class StuntDouble; |
101 | < | friend class DataStorageTestCase; |
102 | < | private: |
121 | > | private: |
122 | ||
123 | < | |
105 | < | double* internalGetArrayPointer(std::vector<Vector3d>& v); |
123 | > | RealType* internalGetArrayPointer(std::vector<Vector3d>& v); |
124 | ||
125 | < | double* internalGetArrayPointer(std::vector<RotMat3x3d>& v); |
126 | < | double* internalGetArrayPointer(std::vector<double>& v); |
125 | > | RealType* internalGetArrayPointer(std::vector<RotMat3x3d>& v); |
126 | > | RealType* internalGetArrayPointer(std::vector<RealType>& v); |
127 | ||
128 | < | template<typename T> |
129 | < | void internalResize(std::vector<T>& v, int newSize); |
128 | > | template<typename T> |
129 | > | void internalResize(std::vector<T>& v, int newSize); |
130 | ||
131 | < | template<typename T> |
132 | < | void interalCopy(std::vector<T>& v, int source, int num, int target); |
131 | > | template<typename T> |
132 | > | void internalCopy(std::vector<T>& v, int source, int num, int target); |
133 | ||
134 | < | int size_; |
135 | < | int storageLayout_; |
118 | < | std::vector<Vector3d> position; /** position array */ |
119 | < | std::vector<Vector3d> velocity; /** velocity array */ |
120 | < | std::vector<RotMat3x3d> aMat; /** rotation matrix array */ |
121 | < | std::vector<Vector3d> angularMomentum;/** angular momentum array (body-fixed) */ |
122 | < | std::vector<Vector3d> unitVector; /** the lab frame unit std::vector array*/ |
123 | < | std::vector<double> zAngle; /** z -angle array */ |
124 | < | std::vector<Vector3d> force; /** force array */ |
125 | < | std::vector<Vector3d> torque; /** torque array */ |
126 | < | }; |
134 | > | int size_; |
135 | > | int storageLayout_; |
136 | ||
137 | + | }; |
138 | ||
139 | + | } |
140 | #endif //BRAINS_DATASTORAGE_HPP |
– | Removed lines |
+ | Added lines |
< | Changed lines |
> | Changed lines |