This version works for the explicit FEA code provided by Professor Paolino.
[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 long TopNode;
65 /** See notes for ::TopNode */
66 typedef long 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 /** Synchronize element and node data for ghost layers. Should be called every timestep */
127 void topModel_Sync(TopModel*m);
128
129 /** Insert a node */
130 TopNode topModel_InsertNode(TopModel*, double x, double y, double z);
131
132 /** Set id of a node */
133 void topNode_SetId(TopModel*, TopNode, TopID id);
134
135 /** Set attribute of a node */
136 void topNode_SetAttrib(TopModel*, TopNode, void*);
137
138 /** Insert an element */
139 TopElement topModel_InsertElem(TopModel*, TopElemType, TopNode*);
140
141 /** Set id of an element */
142 void topElement_SetId(TopModel*, TopElement, TopID id);
143
144 /** Set attribute of an element */
145 void topElement_SetAttrib(TopModel*, TopElement, void*);
146
147 /** Get node via id */
148 TopNode topModel_GetNodeAtId(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 int topModel_GetNNodes(TopModel *model);
162
163 int topElement_GetNNodes(TopModel* model, TopElement elem);
164
165 void topNode_GetPosition(TopModel*model, TopNode node,double*x,double*y,double*z);
166
167 /** Create Iterator for nodes */
168 TopNodeItr*  topModel_CreateNodeItr(TopModel*);
169
170 /** Destroy Iterator */
171 void topNodeItr_Destroy(TopNodeItr*);
172
173 /** Initialize Iterator */
174 void topNodeItr_Begin(TopNodeItr*);
175
176 /** Determine if Iterator is valid or if it has iterated past last Node */
177 bool topNodeItr_IsValid(TopNodeItr*);
178
179 /** Increment iterator */
180 void topNodeItr_Next(TopNodeItr*);
181
182 /** Get TopNode associated with the iterator */
183 TopNode topNodeItr_GetCurr(TopNodeItr*);
184
185
186 /** Create Iterator for elements */
187 TopElemItr*  topModel_CreateElemItr(TopModel*);
188
189 /** Destroy Iterator */
190 void topElemItr_Destroy(TopElemItr*);
191
192 /** Initialize Iterator */
193 void topElemItr_Begin(TopElemItr*);
194
195 /** Determine if Iterator is valid or if it has iterated past last Element */
196 bool topElemItr_IsValid(TopElemItr*);
197
198 /** Increment iterator */
199 void topElemItr_Next(TopElemItr*);
200
201 /** Get TopElement associated with the iterator */
202 TopElement topElemItr_GetCurr(TopElemItr*);
203
204 /** 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() */
205 void topModel_TestIterators(TopModel*m);
206
207
208 #endif