9600f14ae7207d377122b10c163cc7d2a234903a
[charm.git] / src / libs / ck-libs / ParFUM-Tops / ParFUM_TOPS.C
1 /**
2
3    @file
4    @brief Implementation of ParFUM-TOPS layer, except for Iterators
5    
6    @author Isaac Dooley
7
8    @todo add code to generate ghost layers
9    @todo Support multiple models
10
11 */
12
13 #include "ParFUM_TOPS.h"
14 #include "ParFUM.decl.h"
15
16 int elem_attr_size, node_attr_size;
17
18 TopModel* topModel_Create_Init(int elem_attr_sz, int node_attr_sz){
19
20   elem_attr_size = elem_attr_sz;
21   node_attr_size = node_attr_sz;
22
23   // This only uses a single mesh, so better not create multiple ones of these
24   int which_mesh=FEM_Mesh_default_write();
25   FEM_Mesh *mesh = FEM_Mesh_lookup(which_mesh,"TopModel::TopModel()");
26
27   char* temp_array = new char[16]; // just some junk array to use below
28   
29   // Allocate element connectivity
30   FEM_Mesh_data(which_mesh,FEM_ELEM+0,FEM_CONN,temp_array, 0, 0, FEM_INDEX_0, 3);
31   // Allocate node coords
32   FEM_Mesh_data(which_mesh,FEM_NODE,FEM_COORD,temp_array, 0, 0, FEM_DOUBLE, 3);
33   // Allocate element attributes
34   FEM_Mesh_data(which_mesh,FEM_ELEM+0,FEM_DATA+0,temp_array, 0, 0, FEM_BYTE, elem_attr_size);
35   // Allocate node attributes
36   FEM_Mesh_data(which_mesh,FEM_NODE+0,FEM_DATA+0,temp_array, 0, 0, FEM_BYTE, node_attr_size);
37
38   delete[] temp_array;
39
40   // Don't Allocate the Global Number attribute for the elements and nodes  
41   // It will be automatically created upon calls to void FEM_Entity::setGlobalno(int r,int g) {
42   
43   FEM_Mesh_allocate_valid_attr(which_mesh, FEM_NODE);
44   FEM_Mesh_allocate_valid_attr(which_mesh, FEM_ELEM+0);
45   
46   return mesh;
47 }
48
49 TopModel* topModel_Create_Driver(int elem_attr_sz, int node_attr_sz){
50   // This only uses a single mesh, so don't create multiple TopModels of these
51   elem_attr_size = elem_attr_sz;
52   node_attr_size = node_attr_sz;
53   int which_mesh=FEM_Mesh_default_read();
54   FEM_Mesh *mesh = FEM_Mesh_lookup(which_mesh,"TopModel::TopModel()");
55   return mesh;
56 }
57
58 void topModel_Destroy(TopModel* m){
59 }
60
61
62 TopNode topModel_InsertNode(TopModel* m, double x, double y, double z){
63   int newNode = FEM_add_node_local(m,false,false,false);
64   m->node.set_coord(newNode,x,y,z);
65   return newNode;
66 }
67
68
69 /** Set id of a node */
70 void topNode_SetId(TopModel* m, TopNode n, TopID id){
71         // just set the nodal id attribute to id
72   m->node.setGlobalno(n,id);
73 }
74
75 /** Insert an element */
76 TopElement topModel_InsertElem(TopModel*m, TopElemType type, TopNode* nodes){
77   assert(type ==  TOP_ELEMENT_TET4);
78   int conn[4];
79   conn[0] = nodes[0];
80   conn[1] = nodes[1];
81   conn[2] = nodes[2];
82   conn[3] = nodes[3];
83   int newEl = FEM_add_element_local(m, conn, 4, 0, 0, 0);
84   return newEl;
85 }
86
87 /** Set id of an element */
88 void topElement_SetId(TopModel* m, TopElement e, TopID id){
89   m->elem[0].setGlobalno(e,id);
90 }
91
92
93
94 /** 
95         @brief Set attribute of a node 
96         
97         The attribute passed in must be a contiguous data structure with size equal to the value node_attr_sz passed into topModel_Create_Driver() and topModel_Create_Init() 
98
99         The supplied attribute will be copied into the ParFUM attribute array "FEM_DATA+0". Then ParFUM will own this data. The function topNode_GetAttrib() will return a pointer to the copy owned by ParFUM. If a single material parameter attribute is used for multiple nodes, each node will get a separate copy of the array. Any subsequent modifications to the data will only be reflected at a single node. 
100
101         The user is responsible for deallocating parameter d passed into this function.
102
103 */
104 void topNode_SetAttrib(TopModel* m, TopNode n, void* d){
105   FEM_DataAttribute * at = (FEM_DataAttribute*) m->node.lookup(FEM_DATA+0,"topNode_SetAttrib");
106   AllocTable2d<unsigned char> &dataTable  = at->getChar();
107   unsigned char *data = dataTable.getData();
108   memcpy(data + n*node_attr_size, d, node_attr_size);
109 }
110
111 /** @brief Set attribute of an element 
112 See topNode_SetAttrib() for description
113 */
114 void topElement_SetAttrib(TopModel* m, TopElement e, void* d){
115   FEM_DataAttribute * at = (FEM_DataAttribute*) m->elem[0].lookup(FEM_DATA+0,"topElem_SetAttrib");
116   AllocTable2d<unsigned char> &dataTable  = at->getChar();
117   unsigned char *data = dataTable.getData();
118   memcpy(data + e*elem_attr_size, d, elem_attr_size);
119 }
120
121
122 /** @brief Get elem attribute 
123 See topNode_SetAttrib() for description
124 */
125 void* topElement_GetAttrib(TopModel* m, TopElement e){
126   FEM_DataAttribute * at = (FEM_DataAttribute*) m->elem[0].lookup(FEM_DATA+0,"topElem_GetAttrib");
127   AllocTable2d<unsigned char> &dataTable  = at->getChar();
128   unsigned char *data = dataTable.getData();
129   return (data + e*elem_attr_size);
130 }
131
132 /** @brief Get nodal attribute 
133 See topNode_SetAttrib() for description
134 */
135 void* topNode_GetAttrib(TopModel* m, TopNode n){
136   FEM_DataAttribute * at = (FEM_DataAttribute*) m->node.lookup(FEM_DATA+0,"topNode_GetAttrib");
137   AllocTable2d<unsigned char> &dataTable  = at->getChar();
138   unsigned char *data = dataTable.getData();
139   return (data + n*node_attr_size);
140 }
141
142
143
144 /** 
145         Get node via id 
146         @todo Implement this function
147 */
148 TopNode topModel_GetNodeAtId(TopModel*,TopID){
149   // lookup node via global ID
150   assert(0);
151 }
152
153 /** 
154         Get elem via id
155         @todo Implement this function
156  */
157 TopElement topModel_GetElemAtId(TopModel*,TopID){
158   assert(0);
159 }
160
161
162
163 TopNode topElement_GetNode(TopModel* m,TopElement e,int idx){
164   assert(0);
165 }
166
167
168 int topNode_GetId(TopModel* m, TopNode n){
169   assert(0);
170 }
171
172 int topModel_GetNNodes(TopModel *model){
173   assert(0);
174 }
175
176 int topElement_GetNNodes(TopModel* model, TopElement elem){
177   assert(0);
178 }
179
180 void topNode_GetPosition(TopModel*model, TopNode node,double*x,double*y,double*z){
181   assert(0);
182 }
183
184
185 #include "ParFUM_TOPS.def.h"