Version that works with CUDA
[charm.git] / src / libs / ck-libs / ParFUM-Tops / ParFUM_TOPS_Iterators.C
1 #include "ParFUM_TOPS.h"
2
3
4
5
6 /**************************************************************************
7  *     Iterator for nodes
8  */
9
10 TopNodeItr*  topModel_CreateNodeItr(TopModel* model){
11     TopNodeItr *itr = new TopNodeItr;
12     itr->model = model;
13     return itr;
14 }
15
16 void topNodeItr_Destroy(TopNodeItr* itr){
17     delete itr;
18 }
19
20 void topNodeItr_Begin(TopNodeItr* itr){
21   if(itr->model->mesh->node.ghost != NULL){
22         itr->parfum_index =  FEM_To_ghost_index(itr->model->mesh->node.ghost->size());
23   }
24   else{
25         itr->parfum_index =  0;
26   }
27
28   // Make sure we start with a valid one:
29   while((!itr->model->mesh->node.is_valid_any_idx(itr->parfum_index)) &&
30                 (itr->parfum_index < itr->model->mesh->node.size()))
31         itr->parfum_index++;
32
33   if(itr->parfum_index==itr->model->mesh->node.size()){
34         itr->parfum_index = itr->model->mesh->node.size()+1000; // way past the end
35   }
36
37 #ifdef PTOPS_ITERATOR_PRINT
38   CkPrintf("Initializing Node Iterator to %d\n", itr->parfum_index);
39 #endif
40 }
41
42 bool topNodeItr_IsValid(TopNodeItr*itr){
43         return itr->model->mesh->node.is_valid_any_idx(itr->parfum_index);
44 }
45
46 void topNodeItr_Next(TopNodeItr* itr){
47   CkAssert(topNodeItr_IsValid(itr));
48
49   // advance index until we hit a valid index
50   itr->parfum_index++;
51
52   while((!itr->model->mesh->node.is_valid_any_idx(itr->parfum_index)) &&
53                 (itr->parfum_index < itr->model->mesh->node.size()))
54         itr->parfum_index++;
55
56   if(itr->parfum_index==itr->model->mesh->node.size()){
57         itr->parfum_index = itr->model->mesh->node.size()+1000; // way past the end
58   }
59
60 #ifdef PTOPS_ITERATOR_PRINT
61   CkPrintf("Advancing Node Iterator to %d\n", itr->parfum_index);
62 #endif
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   if(itr->model->mesh->elem[0].ghost != NULL){
87         itr->parfum_index =  FEM_To_ghost_index(itr->model->mesh->elem[0].ghost->size());
88   }
89   else{
90         itr->parfum_index =  0;
91   }
92
93   // Make sure we start with a valid one:
94   while((!itr->model->mesh->elem[0].is_valid_any_idx(itr->parfum_index)) &&
95                 (itr->parfum_index < itr->model->mesh->elem[0].size()))
96         itr->parfum_index++;
97
98   if(itr->parfum_index==itr->model->mesh->elem[0].size()){
99         itr->parfum_index = itr->model->mesh->elem[0].size()+1000; // way past the end
100   }
101
102 #ifdef PTOPS_ITERATOR_PRINT
103   CkPrintf("Initializing Elem[0] Iterator to %d\n", itr->parfum_index);
104 #endif
105
106 }
107
108 bool topElemItr_IsValid(TopElemItr*itr){
109   return itr->model->mesh->elem[0].is_valid_any_idx(itr->parfum_index);
110 }
111
112 void topElemItr_Next(TopElemItr* itr){
113   CkAssert(topElemItr_IsValid(itr));
114
115   // advance index until we hit a valid index
116   itr->parfum_index++;
117
118   while((!itr->model->mesh->elem[0].is_valid_any_idx(itr->parfum_index)) &&
119                 (itr->parfum_index < itr->model->mesh->elem[0].size()))
120         itr->parfum_index++;
121
122
123   if(itr->parfum_index==itr->model->mesh->elem[0].size()){
124         itr->parfum_index = itr->model->mesh->elem[0].size()+1000; // way past the end
125   }
126
127 #ifdef PTOPS_ITERATOR_PRINT
128   CkPrintf("Advancing Elem Iterator to %d\n", itr->parfum_index);
129 #endif
130 }
131
132
133 TopNode topElemItr_GetCurr(TopElemItr*itr){
134         return itr->parfum_index;
135 }