1aba27e5ce984fc9587d660c4e52562edb839628
[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 #include "ParFUM_TOPS_Types.h"
24 #include "ParFUM_TOPS_CUDA.h"
25
26
27 /** A tops model is roughly equivalent to a ParFUM FEM_Mesh object */
28 typedef struct{
29     FEM_Mesh *mesh;
30     void *mAtt;
31     AllocTable2d<unsigned char> *ElemData_T;
32     AllocTable2d<unsigned char> *NodeData_T;
33     AllocTable2d<int> *ElemConn_T;
34     AllocTable2d<FP_TYPE_LOW> *coord_T;
35     AllocTable2d<int> *node_id_T;
36     AllocTable2d<int> *elem_id_T;
37
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     TopModelDevice device_model;
50 #endif
51
52 } TopModel;
53
54
55
56 /** Node Iterator */
57 class TopNodeItr{
58 public:
59   /** The signed index used to refer to a ParFUM Element. Non-negatives are ghosts*/
60   int parfum_index;
61   /** The associated model */
62   TopModel *model;
63 };
64
65 /** @brief Element Iterator. See notes for class TopNodeItr */
66 class TopElemItr{
67 public:
68   int parfum_index;
69     TopModel *model;
70 };
71
72
73 /**
74 Create and access a Tops model. Only call from Init
75 Currently only one model can be created. To extend, each model must just reference a different FEM_Mesh object
76 */
77 TopModel* topModel_Create_Init(int elem_attr_sz, int node_attr_sz);
78
79 /** Create and access a Tops model. Only call from Driver */
80 TopModel* topModel_Create_Driver(int elem_attr_sz, int node_attr_sz, int model_attr_sz, void* mAtt);
81
82 /** Cleanup a model. Currently does nothing */
83 void topModel_Destroy(TopModel* m);
84
85 /** Insert a node */
86 TopNode topModel_InsertNode(TopModel*, float x, float y, float z);
87 TopNode topModel_InsertNode(TopModel*, double x, double y, double z);
88
89
90 /** Set id of a node */
91 void topNode_SetId(TopModel*, TopNode, TopID id);
92
93 /** Set attribute of a node */
94 void topNode_SetAttrib(TopModel*, TopNode, void*);
95
96 /** Insert an element */
97 TopElement topModel_InsertElem(TopModel*, TopElemType, TopNode*);
98
99 /** Set id of an element */
100 void topElement_SetId(TopModel*, TopElement, TopID id);
101
102 /** Set attribute of an element */
103 void topElement_SetAttrib(TopModel*, TopElement, void*);
104
105 /** Get node via id */
106 TopNode topModel_GetNodeAtId(TopModel*,TopID);
107
108 /** Get nodal attribute */
109 void* topNode_GetAttrib(TopModel*, TopNode);
110
111 /** Get element attribute */
112 void* topElement_GetAttrib(TopModel*, TopElement);
113
114 TopNode topElement_GetNode(TopModel*,TopElement,int idx);
115
116 int topNode_GetId(TopModel* m, TopNode n);
117
118 int topModel_GetNNodes(TopModel *model);
119
120 int topElement_GetNNodes(TopModel* model, TopElement elem);
121
122 void topNode_GetPosition(TopModel*model, TopNode node,float*x,float*y,float*z);
123 void topNode_GetPosition(TopModel*model, TopNode node,double*x,double*y,double*z);
124
125 /** Create Iterator for nodes */
126 TopNodeItr*  topModel_CreateNodeItr(TopModel*);
127
128 /** Destroy Iterator */
129 void topNodeItr_Destroy(TopNodeItr*);
130
131 /** Initialize Iterator */
132 void topNodeItr_Begin(TopNodeItr*);
133
134 /** Determine if Iterator is valid or if it has iterated past last Node */
135 bool topNodeItr_IsValid(TopNodeItr*);
136
137 /** Increment iterator */
138 void topNodeItr_Next(TopNodeItr*);
139
140 /** Get TopNode associated with the iterator */
141 TopNode topNodeItr_GetCurr(TopNodeItr*);
142
143
144 /** Create Iterator for elements */
145 TopElemItr*  topModel_CreateElemItr(TopModel*);
146
147 /** Destroy Iterator */
148 void topElemItr_Destroy(TopElemItr*);
149
150 /** Initialize Iterator */
151 void topElemItr_Begin(TopElemItr*);
152
153 /** Determine if Iterator is valid or if it has iterated past last Element */
154 bool topElemItr_IsValid(TopElemItr*);
155
156 /** Increment iterator */
157 void topElemItr_Next(TopElemItr*);
158
159 /** Get TopElement associated with the iterator */
160 TopElement topElemItr_GetCurr(TopElemItr*);
161
162 /** 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() */
163 void topModel_TestIterators(TopModel*m);
164
165
166 void top_retreive_elem_data(TopModel* m);
167 void top_retreive_node_data(TopModel* m);
168
169 #endif