9c22d986264f6418e0084ddc4ddc7939157b148f
[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
48
49 \endcode
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 typedef void NodeAtt;
67 /** See notes for ::NodeAtt */
68 typedef void ElemAtt;
69
70 /** Node Iterator */
71 class TopNodeItr{
72 public:
73   /** The signed index used to refer to a ParFUM Element. Non-negatives are ghosts*/ 
74   int parfum_index;
75   /** The associated model */
76   TopModel *model;
77 };
78
79 /** Element Iterator. See notes for class TopNodeItr */
80 class TopElemItr{
81 public:
82   int parfum_index;
83     TopModel *model;
84 };
85
86 /** an opaque id for top entities */
87 typedef int TopID;
88
89 /** an enumeration of supported element types */
90 typedef int TopElemType;
91
92
93 /** 
94 Create and access a Tops model. Only call from Init 
95 Currently only one model can be created. To extend, each model must just reference a different FEM_Mesh object
96 */
97 TopModel* topModel_Create_Init(int elem_attr_sz, int node_attr_sz);
98
99 /** Create and access a Tops model. Only call from Driver */
100 TopModel* topModel_Create_Driver(int elem_attr_sz, int node_attr_sz);
101
102 /** Insert a node */
103 TopNode topModel_InsertNode(TopModel*, double x, double y, double z);
104
105 /** Set id of a node */
106 void topNode_SetId(TopModel*, TopNode, TopID id);
107
108 /** Set attribute of a node */
109 void topNode_SetAttrib(TopModel*, TopNode, NodeAtt*);
110
111 /** Insert an element */
112 TopElement topModel_InsertElem(TopModel*, TopElemType, TopNode*);
113
114 /** Set id of an element */
115 void topElement_SetId(TopModel*, TopElement, TopID id);
116
117 /** Set attribute of an element */
118 void topElement_SetAttrib(TopModel*, TopElement, ElemAtt*);
119
120 /** Get node via id */
121 TopNode topModel_GetNodeAtId(TopModel*,TopID);
122
123 /** Get elem via id */
124 TopElement topModel_GetElemAtId(TopModel*,TopID);
125
126 /** Get nodal attribute */
127 NodeAtt* topNode_GetAttrib(TopModel*, TopNode);
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