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