54021e9708ba0764a3163eb9dcb7535e1ac922ea
[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 TopNode topModel_InsertNode(TopModel* m, double x, double y, double z){
59   int newNode = FEM_add_node_local(m,false,false,false);
60   m->node.set_coord(newNode,x,y,z);
61   return newNode;
62 }
63
64
65 /** Set id of a node */
66 void topNode_SetId(TopModel* m, TopNode n, TopID id){
67         // just set the nodal id attribute to id
68   m->node.setGlobalno(n,id);
69 }
70
71  /** Insert an element */
72 TopElement topModel_InsertElem(TopModel*m, TopElemType type, TopNode* nodes){
73   assert(type == FEM_TRIANGULAR);
74   int conn[3];
75   conn[0] = nodes[0];
76   conn[1] = nodes[1];
77   conn[2] = nodes[2];
78   int newEl = FEM_add_element_local(m, conn, 3, 0, 0, 0);
79   return newEl;
80 }
81
82 /** Set id of an element */
83 void topElement_SetId(TopModel* m, TopElement e, TopID id){
84   m->elem[0].setGlobalno(e,id);
85 }
86
87
88
89 /** 
90         @brief Set attribute of a node 
91         
92         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() 
93
94         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. 
95
96         The user is responsible for deallocating parameter d passed into this function.
97
98 */
99 void topNode_SetAttrib(TopModel* m, TopNode n, NodeAtt* d){
100   FEM_DataAttribute * at = (FEM_DataAttribute*) m->node.lookup(FEM_DATA+0,"topNode_SetAttrib");
101   AllocTable2d<unsigned char> &dataTable  = at->getChar();
102   unsigned char *data = dataTable.getData();
103   memcpy(data + n*node_attr_size, d, node_attr_size);
104 }
105
106 /** @brief Set attribute of an element 
107 See topNode_SetAttrib() for description
108 */
109 void topElement_SetAttrib(TopModel* m, TopElement e, ElemAtt* d){
110   FEM_DataAttribute * at = (FEM_DataAttribute*) m->elem[0].lookup(FEM_DATA+0,"topElem_SetAttrib");
111   AllocTable2d<unsigned char> &dataTable  = at->getChar();
112   unsigned char *data = dataTable.getData();
113   memcpy(data + e*elem_attr_size, d, elem_attr_size);
114 }
115
116
117 /** @brief Get elem attribute 
118 See topNode_SetAttrib() for description
119 */
120 ElemAtt* topElem_GetAttrib(TopModel* m, TopElement e){
121   FEM_DataAttribute * at = (FEM_DataAttribute*) m->elem[0].lookup(FEM_DATA+0,"topElem_GetAttrib");
122   AllocTable2d<unsigned char> &dataTable  = at->getChar();
123   unsigned char *data = dataTable.getData();
124   return (ElemAtt*)(data + e*elem_attr_size);
125 }
126
127 /** @brief Get nodal attribute 
128 See topNode_SetAttrib() for description
129 */
130 NodeAtt* topNode_GetAttrib(TopModel* m, TopNode n){
131   FEM_DataAttribute * at = (FEM_DataAttribute*) m->node.lookup(FEM_DATA+0,"topNode_GetAttrib");
132   AllocTable2d<unsigned char> &dataTable  = at->getChar();
133   unsigned char *data = dataTable.getData();
134   return (NodeAtt*)(data + n*node_attr_size);
135 }
136
137
138
139 /** 
140         Get node via id 
141         @todo Implement this function
142 */
143 TopNode topModel_GetNodeAtId(TopModel*,TopID){
144   // lookup node via global ID
145   assert(0);
146 }
147
148 /** 
149         Get elem via id
150         @todo Implement this function
151  */
152 TopElement topModel_GetElemAtId(TopModel*,TopID){
153   assert(0);
154 }
155
156
157
158
159
160 #include "ParFUM_TOPS.def.h"