A working version of the layer.
[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 put example here!
11 \endcode
12
13 @note ::NodeAtt and ::ElemAtt are just replaced with void* for this implementation.
14
15 */
16
17 #ifndef __PARFUM_TOPS___H
18 #define __PARFUM_TOPS___H
19
20 #include <ParFUM.h>
21 #include <ParFUM_internals.h>
22
23
24 #ifdef FP_TYPE_FLOAT
25 #warning "Using floats for various things"
26 typedef float FP_TYPE;
27 #else
28 #warning "Using doubles for various things"
29 typedef double FP_TYPE;
30 #endif
31
32
33
34 /** A tops model is roughly equivalent to a ParFUM FEM_Mesh object */
35 typedef struct{
36     FEM_Mesh *mesh;
37     void *mAtt;
38     AllocTable2d<unsigned char> *ElemData_T;
39     AllocTable2d<unsigned char> *NodeData_T;
40     AllocTable2d<int> *ElemConn_T;
41     AllocTable2d<FP_TYPE> *coord_T;
42     AllocTable2d<int> *node_id_T;
43     AllocTable2d<int> *elem_id_T;
44
45
46     unsigned node_attr_size;
47     unsigned elem_attr_size;
48     unsigned model_attr_size;
49
50     /** number of local elements */
51     unsigned num_local_elem;
52     /** number of local nodes */
53     unsigned num_local_node;
54
55 #ifdef CUDA
56     void *mAttDevice; /** Device pointers to the goods */
57     void *ElemDataDevice;
58     void *NodeDataDevice;
59     int *ElemConnDevice;
60     TopModel* modelD;
61 #endif
62
63 } TopModel;
64
65
66 /** 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. */
67 typedef long TopNode;
68 /** See notes for ::TopNode */
69 typedef long TopElement;
70
71
72 enum {
73   TOP_ELEMENT_T3 =0,
74   TOP_ELEMENT_T6,
75   TOP_ELEMENT_Q4,
76   TOP_ELEMENT_Q8,
77   TOP_ELEMENT_TET4,
78   TOP_ELEMENT_TET10,
79   TOP_ELEMENT_HEX8,
80   TOP_ELEMENT_HEX8_RESERVOIR,
81   TOP_ELEMENT_HEX20,
82   TOP_ELEMENT_WEDGE15,
83   TOP_ELEMENT_COH2E2,
84   TOP_ELEMENT_COH2E3,
85   TOP_ELEMENT_COH3T3,
86   TOP_ELEMENT_COH3T6,
87   TOP_ELEMENT_COH3Q4,
88   TOP_ELEMENT_COH3Q8,
89   TOP_ELEMENT_WEDGE6,
90   TOP_ELEMENT_MAX
91 };
92
93 /** used as iterators on CUDA system. See usage!*/
94 typedef bool TopNodeItr_D;
95 typedef bool TopElemItr_D;
96
97 /** Node Iterator */
98 class TopNodeItr{
99 public:
100   /** The signed index used to refer to a ParFUM Element. Non-negatives are ghosts*/
101   int parfum_index;
102   /** The associated model */
103   TopModel *model;
104 };
105
106 /** @brief Element Iterator. See notes for class TopNodeItr */
107 class TopElemItr{
108 public:
109   int parfum_index;
110     TopModel *model;
111 };
112
113
114 /** an opaque id for top entities */
115 typedef int TopID;
116
117 /** an enumeration of supported element types */
118 typedef int TopElemType;
119
120
121 /**
122 Create and access a Tops model. Only call from Init
123 Currently only one model can be created. To extend, each model must just reference a different FEM_Mesh object
124 */
125 TopModel* topModel_Create_Init(int elem_attr_sz, int node_attr_sz);
126
127 /** Create and access a Tops model. Only call from Driver */
128 TopModel* topModel_Create_Driver(int elem_attr_sz, int node_attr_sz, int model_attr_sz, void* mAtt);
129
130 /** Cleanup a model. Currently does nothing */
131 void topModel_Destroy(TopModel* m);
132
133 /** Insert a node */
134 TopNode topModel_InsertNode(TopModel*, FP_TYPE x, FP_TYPE y, FP_TYPE z);
135
136 /** Set id of a node */
137 void topNode_SetId(TopModel*, TopNode, TopID id);
138
139 /** Set attribute of a node */
140 void topNode_SetAttrib(TopModel*, TopNode, void*);
141
142 /** Insert an element */
143 TopElement topModel_InsertElem(TopModel*, TopElemType, TopNode*);
144
145 /** Set id of an element */
146 void topElement_SetId(TopModel*, TopElement, TopID id);
147
148 /** Set attribute of an element */
149 void topElement_SetAttrib(TopModel*, TopElement, void*);
150
151 /** Get node via id */
152 TopNode topModel_GetNodeAtId(TopModel*,TopID);
153
154 /** Get nodal attribute */
155 void* topNode_GetAttrib(TopModel*, TopNode);
156
157 /** Get element attribute */
158 void* topElement_GetAttrib(TopModel*, TopElement);
159
160 TopNode topElement_GetNode(TopModel*,TopElement,int idx);
161
162 int topNode_GetId(TopModel* m, TopNode n);
163
164 int topModel_GetNNodes(TopModel *model);
165
166 int topElement_GetNNodes(TopModel* model, TopElement elem);
167
168 void topNode_GetPosition(TopModel*model, TopNode node,FP_TYPE*x,FP_TYPE*y,FP_TYPE*z);
169
170
171 /** Create Iterator for nodes */
172 TopNodeItr*  topModel_CreateNodeItr(TopModel*);
173
174 /** Destroy Iterator */
175 void topNodeItr_Destroy(TopNodeItr*);
176
177 /** Initialize Iterator */
178 void topNodeItr_Begin(TopNodeItr*);
179
180 /** Determine if Iterator is valid or if it has iterated past last Node */
181 bool topNodeItr_IsValid(TopNodeItr*);
182
183 /** Increment iterator */
184 void topNodeItr_Next(TopNodeItr*);
185
186 /** Get TopNode associated with the iterator */
187 TopNode topNodeItr_GetCurr(TopNodeItr*);
188
189
190 /** Create Iterator for elements */
191 TopElemItr*  topModel_CreateElemItr(TopModel*);
192
193 /** Destroy Iterator */
194 void topElemItr_Destroy(TopElemItr*);
195
196 /** Initialize Iterator */
197 void topElemItr_Begin(TopElemItr*);
198
199 /** Determine if Iterator is valid or if it has iterated past last Element */
200 bool topElemItr_IsValid(TopElemItr*);
201
202 /** Increment iterator */
203 void topElemItr_Next(TopElemItr*);
204
205 /** Get TopElement associated with the iterator */
206 TopElement topElemItr_GetCurr(TopElemItr*);
207
208 /** 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() */
209 void topModel_TestIterators(TopModel*m);
210
211
212 #if CUDA
213 void* topElement_D_GetAttrib(TopModel* m, TopElement e);
214 void* topNode_D_GetAttrib(TopModel* m, TopNode n);
215 TopNode topElement_D_GetNode(TopModel* m,TopElement e,int idx);
216 #endif
217
218 void top_retreive_elem_data(TopModel* m);
219 void top_retreive_node_data(TopModel* m);
220
221 #endif