Added dereferencing of iterators.
authorIsaac Dooley <idooley2@illinois.edu>
Mon, 19 Feb 2007 18:02:24 +0000 (18:02 +0000)
committerIsaac Dooley <idooley2@illinois.edu>
Mon, 19 Feb 2007 18:02:24 +0000 (18:02 +0000)
src/libs/ck-libs/ParFUM-Tops/ParFUM_TOPS.C
src/libs/ck-libs/ParFUM-Tops/ParFUM_TOPS.h

index 158a3dcef6a48517d736819496e6263f75e2dbdd..968579f06d6576da0275400d4d950c27616eb97d 100644 (file)
@@ -11,36 +11,51 @@ TopNode is just the index into the nodes
 TopElem is just the signed index into the elements negatives are ghosts
 
 
-
-
-
-Notes:
-
-
-mesh_modify.C:  FEM_Mesh *m=FEM_Mesh_lookup(mesh,"FEM_Print_Mesh_Summary");
-mesh_modify.C:  return FEM_add_node(FEM_Mesh_lookup(mesh,"FEM_add_node"), adjacent_nodes, num_adjacent_nodes, chunks, numChunks, forceShared);
-mesh_modify.C:  return FEM_remove_node(FEM_Mesh_lookup(mesh,"FEM_remove_node"), node);
-mesh_modify.C:  return FEM_add_element(FEM_Mesh_lookup(mesh,"FEM_add_element"), conn, conn_size, elem_type, chunkNo);
-mesh_modify.C:  return FEM_remove_element(FEM_Mesh_lookup(mesh,"FEM_remove_element"), element, elem_type, permanent);
-mesh_modify.C:  return FEM_purge_element(FEM_Mesh_lookup(mesh,"FEM_remove_element"), element, elem_type);
-
 */
 
 
 #include "ParFUM_TOPS.h"
 #include "ParFUM.decl.h"
 
-TopModel* topModel_Create(){
+int elem_attr_size, node_attr_size;
+
+TopModel* topModel_Create_Init(int elem_attr_sz, int node_attr_sz){
+
+  elem_attr_size = elem_attr_sz;
+  node_attr_size = node_attr_sz;
+
   // This only uses a single mesh, so better not create multiple ones of these
-  int which_mesh=FEM_Mesh_default_read();
-  FEM_Mesh_allocate_valid_attr(which_mesh, FEM_NODE);
-  FEM_Mesh_allocate_valid_attr(which_mesh, FEM_ELEM+0);
-  FEM_Mesh_allocate_valid_attr(which_mesh, FEM_ELEM+1);
+  int which_mesh=FEM_Mesh_default_write();
   FEM_Mesh *mesh = FEM_Mesh_lookup(which_mesh,"TopModel::TopModel()");
 
+  char* temp_array = new char[16]; // just some junk array to use below
+  
+  // Allocate element connectivity
+  FEM_Mesh_data(which_mesh,FEM_ELEM+0,FEM_CONN,temp_array, 0, 0, FEM_INDEX_0, 3);
+  // Allocate node coords
+  FEM_Mesh_data(which_mesh,FEM_NODE,FEM_COORD,temp_array, 0, 0, FEM_DOUBLE, 3);
+  // Allocate element attributes
+  FEM_Mesh_data(which_mesh,FEM_ELEM+0,FEM_DATA+0,temp_array, 0, 0, FEM_BYTE, elem_attr_size);
+  // Allocate node attributes
+  FEM_Mesh_data(which_mesh,FEM_NODE+0,FEM_DATA+0,temp_array, 0, 0, FEM_BYTE, node_attr_size);
+
+  delete[] temp_array;
+
   // Don't Allocate the Global Number attribute for the elements and nodes  
   // It will be automatically created upon calls to void FEM_Entity::setGlobalno(int r,int g) {
+  
+  FEM_Mesh_allocate_valid_attr(which_mesh, FEM_NODE);
+  FEM_Mesh_allocate_valid_attr(which_mesh, FEM_ELEM+0);
+  
+  return mesh;
+}
 
+TopModel* topModel_Create_Driver(int elem_attr_sz, int node_attr_sz){
+  // This only uses a single mesh, so better not create multiple ones of these
+  elem_attr_size = elem_attr_sz;
+  node_attr_size = node_attr_sz;
+  int which_mesh=FEM_Mesh_default_read();
+  FEM_Mesh *mesh = FEM_Mesh_lookup(which_mesh,"TopModel::TopModel()");
   return mesh;
 }
 
@@ -58,11 +73,15 @@ void topNode_SetId(TopModel* m, TopNode n, TopID id){
 }
 
 /** Set attribute of a node */
-void topNode_SetAttrib(TopModel*, TopNode, NodeAtt*){
-
+void topNode_SetAttrib(TopModel* m, TopNode n, NodeAtt* d){
+  FEM_DataAttribute * at = (FEM_DataAttribute*) m->node.lookup(FEM_DATA+0,"topNode_SetAttrib");
+  AllocTable2d<unsigned char> &dataTable  = at->getChar();
+  unsigned char *data = dataTable.getData();
+  memcpy(data + n*node_attr_size, d, node_attr_size);
 }
 
-/** Insert an element */
+
+ /** Insert an element */
 TopElement topModel_InsertElem(TopModel*m, TopElemType type, TopNode* nodes){
   assert(type == FEM_TRIANGULAR);
   int conn[3];
@@ -79,15 +98,43 @@ void topElement_SetId(TopModel* m, TopElement e, TopID id){
 }
 
 /** Set attribute of an element */
-void topElement_SetAttrib(TopModel*, TopElement, ElemAtt*){
+void topElement_SetAttrib(TopModel* m, TopElement e, ElemAtt* d){
+  FEM_DataAttribute * at = (FEM_DataAttribute*) m->elem[0].lookup(FEM_DATA+0,"topElem_SetAttrib");
+  AllocTable2d<unsigned char> &dataTable  = at->getChar();
+  unsigned char *data = dataTable.getData();
+  memcpy(data + e*elem_attr_size, d, elem_attr_size);
+}
 
+
+/** Get elem attribute */
+ElemAtt* topElem_GetAttrib(TopModel* m, TopElement e){
+  FEM_DataAttribute * at = (FEM_DataAttribute*) m->elem[0].lookup(FEM_DATA+0,"topElem_GetAttrib");
+  AllocTable2d<unsigned char> &dataTable  = at->getChar();
+  unsigned char *data = dataTable.getData();
+  return (ElemAtt*)(data + e*elem_attr_size);
+}
+
+// /** Get nodal attribute */
+NodeAtt* topNode_GetAttrib(TopModel* m, TopNode n){
+  FEM_DataAttribute * at = (FEM_DataAttribute*) m->node.lookup(FEM_DATA+0,"topNode_GetAttrib");
+  AllocTable2d<unsigned char> &dataTable  = at->getChar();
+  unsigned char *data = dataTable.getData();
+  return (NodeAtt*)(data + n*node_attr_size);
 }
 
+
+
 /** Get node via id */
-TopNode topModel_GetNodeAtId(TopModel*,TopID);
+TopNode topModel_GetNodeAtId(TopModel*,TopID){
+  // lookup node via global ID
+  assert(0);
+}
 
 /** Get elem via id */
-TopElement topModel_GetElemAtId(TopModel*,TopID);
+TopElement topModel_GetElemAtId(TopModel*,TopID){
+  assert(0);
+}
+
 
 
 
index e7b7c086debe9f4319774f8440b835ce7897b1c0..fa704ee6706f3836f9f01eccc06b16577218e320 100644 (file)
@@ -44,8 +44,9 @@ typedef FEM_Mesh TopModel;
 
 typedef unsigned TopNode;
 typedef unsigned TopElement;
-class NodeAtt{};
-class ElemAtt{};
+
+class NodeAtt;
+class ElemAtt;
 
 /** Iterators */
 class TopNodeItr{
@@ -67,10 +68,14 @@ typedef int TopID;
 typedef int TopElemType;
 
 
-/** TOPS functions we need to support */
+/** 
+Create and access a Tops model. Only call from Init 
+Currently only one model can be created. To extend, each model must just reference a different FEM_Mesh object
+*/
+TopModel* topModel_Create_Init(int elem_attr_sz, int node_attr_sz);
 
-/** Create a new model(essentially a mesh) */
-TopModel* topModel_Create();
+/** Create and access a Tops model. Only call from Driver */
+TopModel* topModel_Create_Driver(int elem_attr_sz, int node_attr_sz);
 
 /** Insert a node */
 TopNode topModel_InsertNode(TopModel*, double x, double y, double z);