9d68fd137b4238cb2b9b878652e8671bee721ffa
[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 Sample usage:
11
12   // Reads nodes (id, x, y, z)
13   for (i = 0; i < nn; i++)
14   {
15       double x, y, z;
16       TopNode node;
17       NodeAtt*  node_data;
18       if (fscanf(fp,"%d, %lf, %lf, %lf",&id, &x, &y, &z) != 4) {
19           fprintf(stderr,"Invalid format for nodes.\n");
20           exit(1);
21           }
22       // Adds node to the model
23       node = topModel_InsertNode (model, x, y, z);
24       topNode_SetId (model, node, id);
25       node_data = (NodeAtt*) malloc(sizeof(NodeAtt));
26       assert(node_data);
27       initNodeAtt(node_data);
28       node_data->material.E = material.E;
29       node_data->material.v = material.v;
30       node_data->material.p = material.p;
31       node_data->bc = 0;
32       topNode_SetAttrib (model, node, node_data);
33   }
34
35
36
37
38          TopNodeItr* itr = topModel_CreateNodeItr(m);
39           int node_count=0;
40           for(topNodeItr_Begin(itr);topNodeItr_IsValid(itr);topNodeItr_Next(itr)){
41                 node_count++;
42                 TopNode node = topNodeItr_GetCurr(itr);
43                 NodeAtt* na = topNode_GetAttrib(m,node);
44                 print_node_attribute(myId, na);
45           }
46           printf("vp %d: node_count = %d\n", myId, node_count);
47 \endcode
48
49 @note ::NodeAtt and ::ElemAtt are just replaced with void* for this implementation.
50
51 */
52
53 #ifndef __PARFUM_TOPS___H
54 #define __PARFUM_TOPS___H
55
56 #include <ParFUM.h>
57 #include <ParFUM_internals.h>
58
59
60 /** A tops model is roughly equivalent to a ParFUM FEM_Mesh object */
61 typedef FEM_Mesh TopModel;
62
63 /** 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. */
64 typedef unsigned TopNode;
65 /** See notes for ::TopNode */
66 typedef unsigned TopElement;
67
68
69 enum {
70   TOP_ELEMENT_T3 =0,
71   TOP_ELEMENT_T6,
72   TOP_ELEMENT_Q4,
73   TOP_ELEMENT_Q8,
74   TOP_ELEMENT_TET4,
75   TOP_ELEMENT_TET10,
76   TOP_ELEMENT_HEX8,
77   TOP_ELEMENT_HEX8_RESERVOIR,
78   TOP_ELEMENT_HEX20,
79   TOP_ELEMENT_WEDGE15,
80   TOP_ELEMENT_COH2E2,
81   TOP_ELEMENT_COH2E3,
82   TOP_ELEMENT_COH3T3,
83   TOP_ELEMENT_COH3T6,
84   TOP_ELEMENT_COH3Q4,
85   TOP_ELEMENT_COH3Q8,
86   TOP_ELEMENT_WEDGE6,
87   TOP_ELEMENT_MAX
88 };
89
90
91 /** Node Iterator */
92 class TopNodeItr{
93 public:
94   /** The signed index used to refer to a ParFUM Element. Non-negatives are ghosts*/ 
95   int parfum_index;
96   /** The associated model */
97   TopModel *model;
98 };
99
100 /** @brief Element Iterator. See notes for class TopNodeItr */
101 class TopElemItr{
102 public:
103   int parfum_index;
104     TopModel *model;
105 };
106
107 /** an opaque id for top entities */
108 typedef int TopID;
109
110 /** an enumeration of supported element types */
111 typedef int TopElemType;
112
113
114 /** 
115 Create and access a Tops model. Only call from Init 
116 Currently only one model can be created. To extend, each model must just reference a different FEM_Mesh object
117 */
118 TopModel* topModel_Create_Init(int elem_attr_sz, int node_attr_sz);
119
120 /** Create and access a Tops model. Only call from Driver */
121 TopModel* topModel_Create_Driver(int elem_attr_sz, int node_attr_sz);
122
123 /** Cleanup a model. Currently does nothing */
124 void topModel_Destroy(TopModel* m);
125
126 /** Insert a node */
127 TopNode topModel_InsertNode(TopModel*, double x, double y, double z);
128
129 /** Set id of a node */
130 void topNode_SetId(TopModel*, TopNode, TopID id);
131
132 /** Set attribute of a node */
133 void topNode_SetAttrib(TopModel*, TopNode, void*);
134
135 /** Insert an element */
136 TopElement topModel_InsertElem(TopModel*, TopElemType, TopNode*);
137
138 /** Set id of an element */
139 void topElement_SetId(TopModel*, TopElement, TopID id);
140
141 /** Set attribute of an element */
142 void topElement_SetAttrib(TopModel*, TopElement, void*);
143
144 /** Get node via id */
145 TopNode topModel_GetNodeAtId(TopModel*,TopID);
146
147 /** Get elem via id */
148 TopElement topModel_GetElemAtId(TopModel*,TopID);
149
150 /** Get nodal attribute */
151 void* topNode_GetAttrib(TopModel*, TopNode);
152
153 /** Get element attribute */
154 void* topElement_GetAttrib(TopModel*, TopElement);
155
156
157 TopNode topElement_GetNode(TopModel*,TopElement,int idx);
158
159 int topNode_GetId(TopModel* m, TopNode n);
160
161
162 int topModel_GetNNodes(TopModel *model);
163
164 int topElement_GetNNodes(TopModel* model, TopElement elem);
165
166 void topNode_GetPosition(TopModel*model, TopNode node,double*x,double*y,double*z);
167
168 /** Create Iterator for nodes */
169 TopNodeItr*  topModel_CreateNodeItr(TopModel*);
170
171 /** Destroy Iterator */
172 void topNodeItr_Destroy(TopNodeItr*);
173
174 /** Initialize Iterator */
175 void topNodeItr_Begin(TopNodeItr*);
176
177 /** Determine if Iterator is valid or if it has iterated past last Node */
178 bool topNodeItr_IsValid(TopNodeItr*);
179
180 /** Increment iterator */
181 void topNodeItr_Next(TopNodeItr*);
182
183 /** Get TopNode associated with the iterator */
184 TopNode topNodeItr_GetCurr(TopNodeItr*);
185
186
187 /** Create Iterator for elements */
188 TopElemItr*  topModel_CreateElemItr(TopModel*);
189
190 /** Destroy Iterator */
191 void topElemItr_Destroy(TopElemItr*);
192
193 /** Initialize Iterator */
194 void topElemItr_Begin(TopElemItr*);
195
196 /** Determine if Iterator is valid or if it has iterated past last Element */
197 bool topElemItr_IsValid(TopElemItr*);
198
199 /** Increment iterator */
200 void topElemItr_Next(TopElemItr*);
201
202 /** Get TopElement associated with the iterator */
203 TopElement topElemItr_GetCurr(TopElemItr*);
204
205
206 #endif