ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/OpenMD/branches/development/src/utils/LocalIndexManager.hpp
Revision: 1665
Committed: Tue Nov 22 20:38:56 2011 UTC (13 years, 5 months ago) by gezelter
File size: 9269 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     *
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 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 gezelter 246 */
42    
43     /**
44     * @file LocalIndexManager.hpp
45     * @author tlin
46     * @date 11/02/2004
47     * @version 1.0
48     */
49    
50     #ifndef UTILS_LOCALINDEXMANAGER_HPP
51     #define UTILS_LOCALINDEXMANAGER_HPP
52     #include <algorithm>
53     #include <iostream>
54     #include <cassert>
55     #include <list>
56     #include <utility>
57    
58 gezelter 1390 namespace OpenMD {
59 gezelter 246
60 gezelter 507 /**
61     * @class IndexListContainer
62     * @brief
63     * @todo documentation
64     */
65     class IndexListContainer{
66     public:
67     static const int MAX_INTEGER = 2147483647;
68     typedef std::list<std::pair<int, int> >::iterator IndexListContainerIterator;
69 gezelter 246
70    
71 gezelter 507 IndexListContainer(int minIndex = 0, int maxIndex = MAX_INTEGER)
72     :minIndex_(minIndex), maxIndex_(maxIndex) {
73 gezelter 246
74 gezelter 507 indexContainer_.push_back(std::make_pair(minIndex, maxIndex));
75     }
76 gezelter 246
77 gezelter 507 int pop() {
78 gezelter 246
79 gezelter 507 if (indexContainer_.empty()) {
80     std::cerr << "" << std::endl;
81     }
82 gezelter 246
83 gezelter 507 IndexListContainerIterator i = indexContainer_.begin();
84     int result;
85 gezelter 246
86 gezelter 507 result = indexContainer_.front().first;
87 gezelter 246
88 gezelter 507 if (indexContainer_.front().first == indexContainer_.front().second) {
89     indexContainer_.pop_front();
90     } else if (indexContainer_.front().first < indexContainer_.front().second) {
91     ++indexContainer_.front().first;
92     } else {
93     std::cerr << "" << std::endl;
94     }
95 gezelter 246
96 gezelter 507 return result;
97     }
98 gezelter 246
99    
100 gezelter 507 /**
101     *
102     */
103     void insert(int index) {
104     IndexListContainerIterator insertPos = internalInsert(index, index);
105     merge(insertPos);
106     }
107 gezelter 246
108 gezelter 507 /**
109     * Reclaims an index range
110     * @param beginIndex
111     * @param endIndex
112     */
113     void insert(int beginIndex, int endIndex) {
114     IndexListContainerIterator insertPos = internalInsert(beginIndex, endIndex);
115     merge(insertPos);
116     }
117 gezelter 246
118 gezelter 507 /**
119     * Reclaims an index array.
120     * @param indices
121     */
122     void insert(std::vector<int>& indices){
123 gezelter 246
124 gezelter 507 if (indices.empty()) {
125     return;
126     }
127 gezelter 246
128 gezelter 507 std::sort(indices.begin(), indices.end());
129     std::unique(indices.begin(), indices.end());
130 gezelter 246
131 gezelter 507 std::vector<int>::iterator i;
132     IndexListContainerIterator insertPos;
133     int beginIndex;
134 gezelter 246
135 gezelter 507 beginIndex = indices[0];
136 gezelter 246
137 gezelter 507 for ( i = indices.begin() + 1 ; i != indices.end(); ++i) {
138     if (*i != *(i -1) + 1) {
139     insert(beginIndex, *(i-1));
140     beginIndex = *i;
141     }
142     }
143 gezelter 246
144    
145 gezelter 507 }
146 gezelter 246
147 gezelter 507 std::vector<int> getIndicesBefore(int index) {
148     std::vector<int> result;
149     IndexListContainerIterator i;
150 gezelter 246
151 gezelter 507 for(i = indexContainer_.begin(); i != indexContainer_.end(); ++i) {
152     if ((*i).first > index) {
153     //we locate the node whose minimum index is greater that index
154     indexContainer_.erase(indexContainer_.begin(), i);
155     break;
156     } else if ((*i).second < index) {
157     //The biggest index current node hold is less than the index we want
158     for (int j = (*i).first; j <= (*i).second; ++j) {
159     result.push_back(j);
160     }
161     continue;
162     } else if ((*i).first == (*i).second) {
163     //the index happen to equal to a node which only contains one index
164     result.push_back((*i).first);
165     indexContainer_.erase(indexContainer_.begin(), i);
166     break;
167     } else {
168 gezelter 246
169 gezelter 507 for (int j = (*i).first; j < index; ++j) {
170     result.push_back(j);
171     }
172 gezelter 246
173 gezelter 507 (*i).first = index;
174     indexContainer_.erase(indexContainer_.begin(), i);
175     break;
176     }
177 gezelter 246
178 gezelter 507 }
179 gezelter 246
180 gezelter 507 return result;
181 gezelter 246
182 gezelter 507 }
183 gezelter 246
184 gezelter 507 int getMaxIndex() {
185     return maxIndex_;
186     }
187 gezelter 246
188 gezelter 507 private:
189 gezelter 246
190 gezelter 507 IndexListContainerIterator internalInsert(int beginIndex, int endIndex) {
191 gezelter 246
192 gezelter 507 if (beginIndex > endIndex) {
193     std::swap(beginIndex, endIndex);
194     std::cerr << "" << std::endl;
195     }
196 gezelter 246
197 gezelter 507 if (endIndex > maxIndex_) {
198     std::cerr << "" << std::endl;
199     }
200 gezelter 246
201    
202 gezelter 507 IndexListContainerIterator j;
203 gezelter 246
204 gezelter 507 IndexListContainerIterator i = indexContainer_.begin();
205     for (; i != indexContainer_.end(); ++i) {
206     if ((*i).first > endIndex) {
207     indexContainer_.insert(i, std::make_pair(beginIndex, endIndex));
208     return --i;
209     } else if ((*i).second < beginIndex) {
210     continue;
211     } else {
212     std::cerr << "" << std::endl;
213     }
214     }
215 gezelter 246
216 gezelter 507 indexContainer_.push_back(std::make_pair(beginIndex, endIndex));
217     return --indexContainer_.end();
218 gezelter 246
219 gezelter 507 }
220 gezelter 246
221 gezelter 507 void merge(IndexListContainerIterator i) {
222     IndexListContainerIterator j;
223 gezelter 246
224 gezelter 507 //check whether current node can be merged with its previous node
225     if ( i != indexContainer_.begin()) {
226     j = i;
227     --j;
228     if (j != indexContainer_.begin() && (*j).second + 1 == (*i).first) {
229     (*i).first = (*j).first;
230     indexContainer_.erase(j);
231     }
232     }
233 gezelter 246
234 gezelter 507 //check whether current node can be merged with its next node
235     if ( i != indexContainer_.end()) {
236     j = i;
237     ++j;
238 gezelter 246
239 gezelter 507 if (j != indexContainer_.end() && (*i).second + 1 == (*j).first) {
240     (*i).second = (*j).second;
241     indexContainer_.erase(j);
242     }
243     }
244 gezelter 246
245 gezelter 507 }
246     int minIndex_;
247     int maxIndex_;
248     std::list<std::pair<int, int> > indexContainer_;
249     };
250 gezelter 246
251    
252 gezelter 507 /**
253     * @class LocalIndexManager LocalIndexManager.hpp "utils/LocalIndexManager.hpp"
254     * @brief
255     */
256     class LocalIndexManager {
257     public:
258 gezelter 246
259 gezelter 507 int getNextAtomIndex() {
260     return atomIndexContainer_.pop();
261     }
262 gezelter 246
263 gezelter 507 std::vector<int> getAtomIndicesBefore(int index) {
264     return atomIndexContainer_.getIndicesBefore(index);
265     }
266 gezelter 246
267 gezelter 507 void releaseAtomIndex(int index) {
268     atomIndexContainer_.insert(index);
269     }
270 gezelter 246
271 gezelter 507 void releaseAtomIndex(int beginIndex, int endIndex) {
272     atomIndexContainer_.insert(beginIndex, endIndex);
273     }
274 gezelter 246
275 gezelter 507 void releaseAtomIndex(std::vector<int> indices) {
276     atomIndexContainer_.insert(indices);
277     }
278 gezelter 246
279 gezelter 507 int getNextRigidBodyIndex() {
280     return rigidBodyIndexContainer_.pop();
281     }
282 gezelter 246
283 gezelter 507 std::vector<int> getRigidBodyIndicesBefore(int index) {
284     return rigidBodyIndexContainer_.getIndicesBefore(index);
285     }
286 gezelter 246
287 gezelter 507 void releaseRigidBodyIndex(int index) {
288     rigidBodyIndexContainer_.insert(index);
289     }
290 gezelter 246
291 gezelter 507 void releaseRigidBodyIndex(int beginIndex, int endIndex) {
292     rigidBodyIndexContainer_.insert(beginIndex, endIndex);
293     }
294 gezelter 246
295 gezelter 507 void releaseRigidBodyIndex(std::vector<int> indices) {
296     rigidBodyIndexContainer_.insert(indices);
297     }
298 gezelter 1540
299     int getNextCutoffGroupIndex() {
300     return cutoffGroupIndexContainer_.pop();
301     }
302    
303     std::vector<int> getCutoffGroupIndicesBefore(int index) {
304     return cutoffGroupIndexContainer_.getIndicesBefore(index);
305     }
306    
307     void releaseCutoffGroupIndex(int index) {
308     cutoffGroupIndexContainer_.insert(index);
309     }
310    
311     void releaseCutoffGroupIndex(int beginIndex, int endIndex) {
312     cutoffGroupIndexContainer_.insert(beginIndex, endIndex);
313     }
314    
315     void releaseCutoffGroupIndex(std::vector<int> indices) {
316     cutoffGroupIndexContainer_.insert(indices);
317     }
318 gezelter 246
319 gezelter 507 private:
320 gezelter 246
321 gezelter 507 IndexListContainer atomIndexContainer_;
322     IndexListContainer rigidBodyIndexContainer_;
323 gezelter 1540 IndexListContainer cutoffGroupIndexContainer_;
324 gezelter 507 };
325 gezelter 246
326 gezelter 1390 } //end namespace OpenMD
327 gezelter 246 #endif //UTILS_LOCALINDEXMANAGER_HPP

Properties

Name Value
svn:keywords Author Id Revision Date