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