Added a couple functions.
[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
54 #include <ParFUM.h>
55 #include <ParFUM_internals.h>
56
57
58 /** A tops model is roughly equivalent to a ParFUM FEM_Mesh object */
59 typedef FEM_Mesh TopModel;
60
61 /** 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. */
62 typedef unsigned TopNode;
63 /** See notes for ::TopNode */
64 typedef unsigned TopElement;
65
66
67 /** Node Iterator */
68 class TopNodeItr{
69 public:
70   /** The signed index used to refer to a ParFUM Element. Non-negatives are ghosts*/ 
71   int parfum_index;
72   /** The associated model */
73   TopModel *model;
74 };
75
76 /** @brief Element Iterator. See notes for class TopNodeItr */
77 class TopElemItr{
78 public:
79   int parfum_index;
80     TopModel *model;
81 };
82
83 /** an opaque id for top entities */
84 typedef int TopID;
85
86 /** an enumeration of supported element types */
87 typedef int TopElemType;
88
89
90 /** 
91 Create and access a Tops model. Only call from Init 
92 Currently only one model can be created. To extend, each model must just reference a different FEM_Mesh object
93 */
94 TopModel* topModel_Create_Init(int elem_attr_sz, int node_attr_sz);
95
96 /** Create and access a Tops model. Only call from Driver */
97 TopModel* topModel_Create_Driver(int elem_attr_sz, int node_attr_sz);
98
99 /** Insert a node */
100 TopNode topModel_InsertNode(TopModel*, double x, double y, double z);
101
102 /** Set id of a node */
103 void topNode_SetId(TopModel*, TopNode, TopID id);
104
105 /** Set attribute of a node */
106 void topNode_SetAttrib(TopModel*, TopNode, void*);
107
108 /** Insert an element */
109 TopElement topModel_InsertElem(TopModel*, TopElemType, TopNode*);
110
111 /** Set id of an element */
112 void topElement_SetId(TopModel*, TopElement, TopID id);
113
114 /** Set attribute of an element */
115 void topElement_SetAttrib(TopModel*, TopElement, void*);
116
117 /** Get node via id */
118 TopNode topModel_GetNodeAtId(TopModel*,TopID);
119
120 /** Get elem via id */
121 TopElement topModel_GetElemAtId(TopModel*,TopID);
122
123 /** Get nodal attribute */
124 void* topNode_GetAttrib(TopModel*, TopNode);
125
126 /** Get element attribute */
127 void* topElem_GetAttrib(TopModel*, TopElement);
128
129 /** Create Iterator for nodes */
130 TopNodeItr*  topModel_CreateNodeItr(TopModel*);
131
132 /** Destroy Iterator */
133 void topNodeItr_Destroy(TopNodeItr*);
134
135 /** Initialize Iterator */
136 void topNodeItr_Begin(TopNodeItr*);
137
138 /** Determine if Iterator is valid or if it has iterated past last Node */
139 bool topNodeItr_IsValid(TopNodeItr*);
140
141 /** Increment iterator */
142 void topNodeItr_Next(TopNodeItr*);
143
144 /** Get TopNode associated with the iterator */
145 TopNode topNodeItr_GetCurr(TopNodeItr*);
146
147
148 /** Create Iterator for elements */
149 TopElemItr*  topModel_CreateElemItr(TopModel*);
150
151 /** Destroy Iterator */
152 void topElemItr_Destroy(TopElemItr*);
153
154 /** Initialize Iterator */
155 void topElemItr_Begin(TopElemItr*);
156
157 /** Determine if Iterator is valid or if it has iterated past last Element */
158 bool topElemItr_IsValid(TopElemItr*);
159
160 /** Increment iterator */
161 void topElemItr_Next(TopElemItr*);
162
163 /** Get TopElement associated with the iterator */
164 TopElement topElemItr_GetCurr(TopElemItr*);
165
166
167