More changes!
[charm.git] / src / libs / ck-libs / ParFUM-Tops / ParFUM_TOPS.h
1 /**
2    @file
3    @brief A ParFUM "Tops" compatibility layer API Definition
4
5    @author Isaac Dooley
6
7    ParFUM-TOPS provides a Tops-like API for ParFUM.
8
9 \note \code
10 Sample usage:
11
12   // Reads nodes (id, x, y, z)
13   for (i = 0; i < nn; i++)
14   {
15       double x, y, z;
16       TopNode node;
17       NodeAtt*  node_data;
18       if (fscanf(fp,"%d, %lf, %lf, %lf",&id, &x, &y, &z) != 4) {
19           fprintf(stderr,"Invalid format for nodes.\n");
20           exit(1);
21           }
22       // Adds node to the model
23       node = topModel_InsertNode (model, x, y, z);
24       topNode_SetId (model, node, id);
25       node_data = (NodeAtt*) malloc(sizeof(NodeAtt));
26       assert(node_data);
27       initNodeAtt(node_data);
28       node_data->material.E = material.E;
29       node_data->material.v = material.v;
30       node_data->material.p = material.p;
31       node_data->bc = 0;
32       topNode_SetAttrib (model, node, node_data);
33   }
34
35
36
37
38          TopNodeItr* itr = topModel_CreateNodeItr(m);
39           int node_count=0;
40           for(topNodeItr_Begin(itr);topNodeItr_IsValid(itr);topNodeItr_Next(itr)){
41                 node_count++;
42                 TopNode node = topNodeItr_GetCurr(itr);
43                 NodeAtt* na = topNode_GetAttrib(m,node);
44                 print_node_attribute(myId, na);
45           }
46           printf("vp %d: node_count = %d\n", myId, node_count);
47 \endcode
48
49 @note ::NodeAtt and ::ElemAtt are just replaced with void* for this implementation.
50
51 */
52
53 #ifndef __PARFUM_TOPS___H
54 #define __PARFUM_TOPS___H
55
56 #include <ParFUM.h>
57 #include <ParFUM_internals.h>
58
59
60 /** A tops model is roughly equivalent to a ParFUM FEM_Mesh object */
61 typedef struct{
62     FEM_Mesh *mesh;
63     void *mAtt;
64
65     unsigned node_attr_size;
66     unsigned elem_attr_size;
67     unsigned model_attr_size;
68
69     /** number of local elements */
70     unsigned num_local_elem;
71     /** number of local nodes */
72     unsigned num_local_node;
73
74 #ifdef CUDA
75     unsigned char *mAttDevice; /** Device pointers to the goods */
76     unsigned char *ElemDataDevice;
77     unsigned char *NodeDataDevice;
78     int * ElemConnDevice;
79     TopModel* modelD;
80 #endif
81
82
83
84 } TopModel;
85
86
87 /** Tops uses some bit patterns for these, but we just use TopNode as a signed value to represent the corresponding ParFUM node. A non-negative value is a local node, while a negative value is a ghost. */
88 typedef long TopNode;
89 /** See notes for ::TopNode */
90 typedef long TopElement;
91
92
93 enum {
94   TOP_ELEMENT_T3 =0,
95   TOP_ELEMENT_T6,
96   TOP_ELEMENT_Q4,
97   TOP_ELEMENT_Q8,
98   TOP_ELEMENT_TET4,
99   TOP_ELEMENT_TET10,
100   TOP_ELEMENT_HEX8,
101   TOP_ELEMENT_HEX8_RESERVOIR,
102   TOP_ELEMENT_HEX20,
103   TOP_ELEMENT_WEDGE15,
104   TOP_ELEMENT_COH2E2,
105   TOP_ELEMENT_COH2E3,
106   TOP_ELEMENT_COH3T3,
107   TOP_ELEMENT_COH3T6,
108   TOP_ELEMENT_COH3Q4,
109   TOP_ELEMENT_COH3Q8,
110   TOP_ELEMENT_WEDGE6,
111   TOP_ELEMENT_MAX
112 };
113
114 /** used as iterators on CUDA system. See usage!*/
115 typedef bool TopNodeItr_D;
116 typedef bool TopElemItr_D;
117
118 /** Node Iterator */
119 class TopNodeItr{
120 public:
121   /** The signed index used to refer to a ParFUM Element. Non-negatives are ghosts*/
122   int parfum_index;
123   /** The associated model */
124   TopModel *model;
125 };
126
127 /** @brief Element Iterator. See notes for class TopNodeItr */
128 class TopElemItr{
129 public:
130   int parfum_index;
131     TopModel *model;
132 };
133
134
135 /** an opaque id for top entities */
136 typedef int TopID;
137
138 /** an enumeration of supported element types */
139 typedef int TopElemType;
140
141
142 /**
143 Create and access a Tops model. Only call from Init
144 Currently only one model can be created. To extend, each model must just reference a different FEM_Mesh object
145 */
146 TopModel* topModel_Create_Init(int elem_attr_sz, int node_attr_sz);
147
148 /** Create and access a Tops model. Only call from Driver */
149 TopModel* topModel_Create_Driver(int elem_attr_sz, int node_attr_sz, int model_attr_sz, void* mAtt);
150
151 /** Cleanup a model. Currently does nothing */
152 void topModel_Destroy(TopModel* m);
153
154 /** Synchronize element and node data for ghost layers. Should be called every timestep */
155 void topModel_Sync(TopModel*m);
156
157 /** Insert a node */
158 TopNode topModel_InsertNode(TopModel*, double x, double y, double z);
159
160 /** Set id of a node */
161 void topNode_SetId(TopModel*, TopNode, TopID id);
162
163 /** Set attribute of a node */
164 void topNode_SetAttrib(TopModel*, TopNode, void*);
165
166 /** Insert an element */
167 TopElement topModel_InsertElem(TopModel*, TopElemType, TopNode*);
168
169 /** Set id of an element */
170 void topElement_SetId(TopModel*, TopElement, TopID id);
171
172 /** Set attribute of an element */
173 void topElement_SetAttrib(TopModel*, TopElement, void*);
174
175 /** Get node via id */
176 TopNode topModel_GetNodeAtId(TopModel*,TopID);
177
178 /** Get nodal attribute */
179 void* topNode_GetAttrib(TopModel*, TopNode);
180
181 /** Get element attribute */
182 void* topElement_GetAttrib(TopModel*, TopElement);
183
184
185 TopNode topElement_GetNode(TopModel*,TopElement,int idx);
186
187 int topNode_GetId(TopModel* m, TopNode n);
188
189 int topModel_GetNNodes(TopModel *model);
190
191 int topElement_GetNNodes(TopModel* model, TopElement elem);
192
193 void topNode_GetPosition(TopModel*model, TopNode node,double*x,double*y,double*z);
194
195 /** Create Iterator for nodes */
196 TopNodeItr*  topModel_CreateNodeItr(TopModel*);
197
198 /** Destroy Iterator */
199 void topNodeItr_Destroy(TopNodeItr*);
200
201 /** Initialize Iterator */
202 void topNodeItr_Begin(TopNodeItr*);
203
204 /** Determine if Iterator is valid or if it has iterated past last Node */
205 bool topNodeItr_IsValid(TopNodeItr*);
206
207 /** Increment iterator */
208 void topNodeItr_Next(TopNodeItr*);
209
210 /** Get TopNode associated with the iterator */
211 TopNode topNodeItr_GetCurr(TopNodeItr*);
212
213
214 /** Create Iterator for elements */
215 TopElemItr*  topModel_CreateElemItr(TopModel*);
216
217 /** Destroy Iterator */
218 void topElemItr_Destroy(TopElemItr*);
219
220 /** Initialize Iterator */
221 void topElemItr_Begin(TopElemItr*);
222
223 /** Determine if Iterator is valid or if it has iterated past last Element */
224 bool topElemItr_IsValid(TopElemItr*);
225
226 /** Increment iterator */
227 void topElemItr_Next(TopElemItr*);
228
229 /** Get TopElement associated with the iterator */
230 TopElement topElemItr_GetCurr(TopElemItr*);
231
232 /** Perform sanity check on iterators. This checks to make sure that the count of the itereated elements and nodes matches that returned by ParFUM's countValid() */
233 void topModel_TestIterators(TopModel*m);
234
235
236 #if CUDA
237 void* topElement_D_GetAttrib(TopModel* m, TopElement e);
238 void* topNode_D_GetAttrib(TopModel* m, TopNode n);
239 TopNode topElement_D_GetNode(TopModel* m,TopElement e,int idx);
240 #endif
241
242
243 #endif