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