b13f5a2624796f09b87df0a9617ceb3d835e9a50
[charm.git] / src / libs / ck-libs / ParFUM-Tops / ParFUM_TOPS_Iterators.C
1 #include "ParFUM_TOPS.h"
2
3 /**************************************************************************
4  *     Iterator for nodes 
5  */
6
7 TopNodeItr*  topModel_CreateNodeItr(TopModel* model){
8     TopNodeItr *itr = new TopNodeItr;
9     itr->model = model;
10     return itr;
11 }
12
13 void topNodeItr_Destroy(TopNodeItr* itr){
14     delete itr;
15 }
16
17 void topNodeItr_Begin(TopNodeItr* itr){
18     itr->parfum_index = 0;
19 }
20
21 bool topNodeItr_IsValid(TopNodeItr*itr){
22      return itr->model->node.is_valid_any_idx(itr->parfum_index);
23 }
24
25 void topNodeItr_Next(TopNodeItr* itr){
26
27     if(!topNodeItr_IsValid(itr))
28         return;
29
30     // advance index until we hit a valid index
31     itr->parfum_index++;
32
33     if(itr->parfum_index > 0) {// local nodes
34
35         while ((! itr->model->node.is_valid_any_idx(itr->parfum_index)) &&
36                   (itr->parfum_index<itr->model->node.size()))
37         {
38             itr->parfum_index++;
39         }
40
41         if(itr->model->node.is_valid_any_idx(itr->parfum_index)) {
42             return;
43         } else {
44             // cycle to most negative index possible for ghosts
45                   printf("Node iterator switched to ghosts\n");
46             itr->parfum_index = FEM_To_ghost_index(itr->model->node.ghost->size());
47         }
48     }
49
50     // just go through ghost nodes
51     
52     while ( (! itr->model->node.ghost->
53                 is_valid_any_idx(FEM_To_ghost_index(itr->parfum_index)))
54                 &&
55                 itr->parfum_index<0)
56     {
57         itr->parfum_index++;
58     }
59
60     if(itr->parfum_index==0){
61         itr->parfum_index = itr->model->node.size()+1000; // way past the end
62     }
63
64 }
65
66 TopNode topNodeItr_GetCurr(TopNodeItr*itr){
67         return itr->parfum_index;
68 }
69
70
71 /**************************************************************************
72  *     Iterator for elements
73  */
74
75 TopElemItr*  topModel_CreateElemItr(TopModel* model){
76     TopElemItr *itr = new TopElemItr;
77     itr->model = model;
78     return itr;
79 }
80
81 void topElemItr_Destroy(TopElemItr* itr){
82     delete itr;
83 }
84
85 void topElemItr_Begin(TopElemItr* itr){
86     itr->parfum_index = 0;
87 }
88
89 bool topElemItr_IsValid(TopElemItr*itr){
90      return itr->model->elem[0].is_valid_any_idx(itr->parfum_index);
91 }
92
93 void topElemItr_Next(TopElemItr* itr){
94
95     if(!topElemItr_IsValid(itr))
96         return;
97
98     // advance index until we hit a valid index
99     itr->parfum_index++;
100
101     if(itr->parfum_index > 0) {// non-ghosts
102
103         while ((! itr->model->elem[0].is_valid_any_idx(itr->parfum_index)) &&
104                   (itr->parfum_index<itr->model->elem[0].size()))
105         {
106             itr->parfum_index++;
107         }
108
109         if(itr->model->elem[0].is_valid_any_idx(itr->parfum_index)) {
110             return;
111         } else {
112             // cycle to most negative index possible for ghosts
113                   printf("Elem iterator switched to ghosts\n");
114             itr->parfum_index = FEM_To_ghost_index(itr->model->elem[0].ghost->size());
115         }
116     }
117
118     // just go through ghosts    
119     while ( (! itr->model->elem[0].ghost->
120                 is_valid_any_idx(FEM_To_ghost_index(itr->parfum_index)))
121                 &&
122                 itr->parfum_index<0)
123     {
124         itr->parfum_index++;
125     }
126
127     if(itr->parfum_index==0){
128         itr->parfum_index = itr->model->elem[0].size()+1000; // way past the end
129     }
130
131 }
132
133 TopNode topElemItr_GetCurr(TopElemItr*itr){
134         return itr->parfum_index;
135 }