Added dereferencing of iterators.
[charm.git] / src / libs / ck-libs / ParFUM-Tops / ParFUM_TOPS.C
1 /**
2 *       A ParFUM TOPS compatibility layer
3 *
4 *      Author: Isaac Dooley
5
6
7
8 Assumptions: 
9
10 TopNode is just the index into the nodes
11 TopElem is just the signed index into the elements negatives are ghosts
12
13
14 */
15
16
17 #include "ParFUM_TOPS.h"
18 #include "ParFUM.decl.h"
19
20 int elem_attr_size, node_attr_size;
21
22 TopModel* topModel_Create_Init(int elem_attr_sz, int node_attr_sz){
23
24   elem_attr_size = elem_attr_sz;
25   node_attr_size = node_attr_sz;
26
27   // This only uses a single mesh, so better not create multiple ones of these
28   int which_mesh=FEM_Mesh_default_write();
29   FEM_Mesh *mesh = FEM_Mesh_lookup(which_mesh,"TopModel::TopModel()");
30
31   char* temp_array = new char[16]; // just some junk array to use below
32   
33   // Allocate element connectivity
34   FEM_Mesh_data(which_mesh,FEM_ELEM+0,FEM_CONN,temp_array, 0, 0, FEM_INDEX_0, 3);
35   // Allocate node coords
36   FEM_Mesh_data(which_mesh,FEM_NODE,FEM_COORD,temp_array, 0, 0, FEM_DOUBLE, 3);
37   // Allocate element attributes
38   FEM_Mesh_data(which_mesh,FEM_ELEM+0,FEM_DATA+0,temp_array, 0, 0, FEM_BYTE, elem_attr_size);
39   // Allocate node attributes
40   FEM_Mesh_data(which_mesh,FEM_NODE+0,FEM_DATA+0,temp_array, 0, 0, FEM_BYTE, node_attr_size);
41
42   delete[] temp_array;
43
44   // Don't Allocate the Global Number attribute for the elements and nodes  
45   // It will be automatically created upon calls to void FEM_Entity::setGlobalno(int r,int g) {
46   
47   FEM_Mesh_allocate_valid_attr(which_mesh, FEM_NODE);
48   FEM_Mesh_allocate_valid_attr(which_mesh, FEM_ELEM+0);
49   
50   return mesh;
51 }
52
53 TopModel* topModel_Create_Driver(int elem_attr_sz, int node_attr_sz){
54   // This only uses a single mesh, so better not create multiple ones of these
55   elem_attr_size = elem_attr_sz;
56   node_attr_size = node_attr_sz;
57   int which_mesh=FEM_Mesh_default_read();
58   FEM_Mesh *mesh = FEM_Mesh_lookup(which_mesh,"TopModel::TopModel()");
59   return mesh;
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 /** Set attribute of a node */
76 void topNode_SetAttrib(TopModel* m, TopNode n, NodeAtt* d){
77   FEM_DataAttribute * at = (FEM_DataAttribute*) m->node.lookup(FEM_DATA+0,"topNode_SetAttrib");
78   AllocTable2d<unsigned char> &dataTable  = at->getChar();
79   unsigned char *data = dataTable.getData();
80   memcpy(data + n*node_attr_size, d, node_attr_size);
81 }
82
83
84  /** Insert an element */
85 TopElement topModel_InsertElem(TopModel*m, TopElemType type, TopNode* nodes){
86   assert(type == FEM_TRIANGULAR);
87   int conn[3];
88   conn[0] = nodes[0];
89   conn[1] = nodes[1];
90   conn[2] = nodes[2];
91   int newEl = FEM_add_element_local(m, conn, 3, 0, 0, 0);
92   return newEl;
93 }
94
95 /** Set id of an element */
96 void topElement_SetId(TopModel* m, TopElement e, TopID id){
97   m->elem[0].setGlobalno(e,id);
98 }
99
100 /** Set attribute of an element */
101 void topElement_SetAttrib(TopModel* m, TopElement e, ElemAtt* d){
102   FEM_DataAttribute * at = (FEM_DataAttribute*) m->elem[0].lookup(FEM_DATA+0,"topElem_SetAttrib");
103   AllocTable2d<unsigned char> &dataTable  = at->getChar();
104   unsigned char *data = dataTable.getData();
105   memcpy(data + e*elem_attr_size, d, elem_attr_size);
106 }
107
108
109 /** Get elem attribute */
110 ElemAtt* topElem_GetAttrib(TopModel* m, TopElement e){
111   FEM_DataAttribute * at = (FEM_DataAttribute*) m->elem[0].lookup(FEM_DATA+0,"topElem_GetAttrib");
112   AllocTable2d<unsigned char> &dataTable  = at->getChar();
113   unsigned char *data = dataTable.getData();
114   return (ElemAtt*)(data + e*elem_attr_size);
115 }
116
117 // /** Get nodal attribute */
118 NodeAtt* topNode_GetAttrib(TopModel* m, TopNode n){
119   FEM_DataAttribute * at = (FEM_DataAttribute*) m->node.lookup(FEM_DATA+0,"topNode_GetAttrib");
120   AllocTable2d<unsigned char> &dataTable  = at->getChar();
121   unsigned char *data = dataTable.getData();
122   return (NodeAtt*)(data + n*node_attr_size);
123 }
124
125
126
127 /** Get node via id */
128 TopNode topModel_GetNodeAtId(TopModel*,TopID){
129   // lookup node via global ID
130   assert(0);
131 }
132
133 /** Get elem via id */
134 TopElement topModel_GetElemAtId(TopModel*,TopID){
135   assert(0);
136 }
137
138
139
140
141
142 #include "ParFUM_TOPS.def.h"