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