More changes.
authorIsaac Dooley <idooley2@illinois.edu>
Wed, 7 Mar 2007 21:48:58 +0000 (21:48 +0000)
committerIsaac Dooley <idooley2@illinois.edu>
Wed, 7 Mar 2007 21:48:58 +0000 (21:48 +0000)
src/libs/ck-libs/ParFUM-Tops/Makefile
src/libs/ck-libs/ParFUM-Tops/ParFUM_TOPS.C
src/libs/ck-libs/ParFUM-Tops/ParFUM_TOPS.h
src/libs/ck-libs/ParFUM-Tops/ParFUM_TOPS_CUDA.C

index 90f51666eca9f1f441521ad27069f6eb4e660585..24f64eaaae9d82f00dfe800277f8c0dc0588a939 100644 (file)
@@ -1,15 +1,16 @@
 CDIR=../../../..
 CHARMC=$(CDIR)/bin/charmc $(OPTS)
+CUDAC=$(CHARMC)
 
 #Headers to be copied to include directory so application users can see them
-HEADERS= ParFUM_TOPS.h  $(INTERNALHEADERS)
+HEADERS= ParFUM_TOPS.h ParFUM_TOPS_CUDA.h $(INTERNALHEADERS)
 
 #Headers generated from .ci files
 GENHEADERS= ParFUM_TOPS.def.h ParFUM_TOPS.decl.h 
 
 HEADDEP= $(GENHEADERS) $(HEADERS) $(INTERNALHEADERS)
 
-OBJS=ParFUM_TOPS.o ParFUM_TOPS_Iterators.o
+OBJS=ParFUM_TOPS.o ParFUM_TOPS_Iterators.o ParFUM_TOPS_CUDA.o
 
 LIB=libmoduleParFUM_TOPS
 
@@ -39,9 +40,12 @@ headers: $(HEADDEP)
 ParFUM_TOPS.o: ParFUM_TOPS.C $(HEADDEP) ParFUM_TOPS.h
        $(CHARMC) -c ParFUM_TOPS.C $(INCS)
 
-ParFUM_TOPS_Iterators.o: ParFUM_TOPS_Iterators.C $(HEADDEP) ParFUM_TOPS.h
+ParFUM_TOPS_Iterators.o: ParFUM_TOPS_Iterators.C $(HEADDEP)
        $(CHARMC) -c ParFUM_TOPS_Iterators.C $(INCS)
 
+ParFUM_TOPS_CUDA.o: ParFUM_TOPS_CUDA.C $(HEADDEP)
+       $(CUDAC) -c ParFUM_TOPS_CUDA.C $(INCS)
+
 
 # clean up
 clean:
index ad9324d6615ffc14657b0df83e1626c66c8e73f5..196dfb0cf81cfad0c91361a6e711d7fc0d5bd367 100644 (file)
@@ -32,6 +32,13 @@ TopModel* topModel_Create_Init(int elem_attr_sz, int node_attr_sz){
 
   char* temp_array = new char[16]; // just some junk array to use below
 
+  // Allocate node coords
+#ifdef FP_TYPE_FLOAT
+  FEM_Mesh_data(which_mesh,FEM_NODE,FEM_COORD,temp_array, 0, 0, FEM_FLOAT, 3);
+#else
+  FEM_Mesh_data(which_mesh,FEM_NODE,FEM_COORD,temp_array, 0, 0, FEM_DOUBLE, 3);
+#endif
+
   // Allocate element connectivity
   FEM_Mesh_data(which_mesh,FEM_ELEM+0,FEM_CONN,temp_array, 0, 0, FEM_INDEX_0, 4);
   // Allocate element attributes
@@ -39,8 +46,8 @@ TopModel* topModel_Create_Init(int elem_attr_sz, int node_attr_sz){
   // Allocate element Id array
   FEM_Mesh_data(which_mesh,FEM_ELEM+0,FEM_DATA+1,temp_array, 0, 0, FEM_INT, 1);
 
-  // Allocate node coords
-  FEM_Mesh_data(which_mesh,FEM_NODE,FEM_COORD,temp_array, 0, 0, FEM_DOUBLE, 3);
+
+
   // Allocate node attributes
   FEM_Mesh_data(which_mesh,FEM_NODE+0,FEM_DATA+0,temp_array, 0, 0, FEM_BYTE, model->node_attr_size);
   // Allocate node Id array
@@ -126,6 +133,32 @@ TopModel* topModel_Create_Driver(int elem_attr_sz, int node_attr_sz, int model_a
     return model;
 }
 
+/** Copy node attribute array from CUDA device back to the ParFUM attribute */
+void top_retreive_node_data(TopModel* m){
+#if CUDA
+    FEM_DataAttribute * at = (FEM_DataAttribute*) m->mesh->node.lookup(FEM_DATA+0,"top_retreive_node_data");
+    AllocTable2d<unsigned char> &dataTable  = at->getChar();
+    unsigned char *NodeData = dataTable.getData();
+    int size = at->size();
+
+    cudaMemcpy(NodeData,m->NodeDataDevice,size,cudaMemcpyDeviceToHost);
+#endif
+}
+
+
+/** Copy element attribute array from CUDA device back to the ParFUM attribute */
+void top_retreive_elem_data(TopModel* m){
+#if CUDA
+    FEM_DataAttribute * at = (FEM_DataAttribute*) m->mesh->elem[0].lookup(FEM_DATA+0,"top_retreive_elem_data");
+    AllocTable2d<unsigned char> &dataTable  = at->getChar();
+    unsigned char *ElemData = dataTable.getData();
+    int size = at->size();
+
+    cudaMemcpy(ElemData,m->ElemDataDevice,size,cudaMemcpyDeviceToHost);
+#endif
+}
+
+
 
 /** Cleanup a model */
 void topModel_Destroy(TopModel* m){
@@ -138,7 +171,7 @@ void topModel_Destroy(TopModel* m){
 }
 
 
-TopNode topModel_InsertNode(TopModel* m, double x, double y, double z){
+TopNode topModel_InsertNode(TopModel* m, FP_TYPE x, FP_TYPE y, FP_TYPE z){
   int newNode = FEM_add_node_local(m->mesh,false,false,false);
   m->mesh->node.set_coord(newNode,x,y,z);
   return newNode;
@@ -293,18 +326,26 @@ int topElement_GetNNodes(TopModel* model, TopElement elem){
 }
 
 /** @todo make sure we are in a getting mesh */
-void topNode_GetPosition(TopModel*model, TopNode node,double*x,double*y,double*z){
+void topNode_GetPosition(TopModel*model, TopNode node,FP_TYPE*x,FP_TYPE*y,FP_TYPE*z){
   CkAssert(node>=0);
-  double coord[3]={7.01,7.01,7.01};
 
   // lookup node via global ID
   FEM_DataAttribute * at = (FEM_DataAttribute*) model->mesh->node.lookup(FEM_COORD,"topModel_GetNodeAtId");
+
+#ifdef FP_TYPE_FLOAT
+  CkAssert(at->getFloat().width()==3);
+  CkAssert(node<at->getFloat().size());
+  *x = at->getFloat()(node,0);
+  *y = at->getFloat()(node,1);
+  *z = at->getFloat()(node,2);
+#else
   CkAssert(at->getDouble().width()==3);
-  //  CkPrintf("node=%d, size=%d\n",node,at->getDouble().size() );
   CkAssert(node<at->getDouble().size());
   *x = at->getDouble()(node,0);
   *y = at->getDouble()(node,1);
   *z = at->getDouble()(node,2);
+#endif
+
 }
 
 void topModel_Sync(TopModel*m){
index b7cd5831f285b0517a08c13a39501a1a2cb2ccc2..8f9c94eef51e66c43171cf45981cf6d9b9be5425 100644 (file)
@@ -7,43 +7,7 @@
    ParFUM-TOPS provides a Tops-like API for ParFUM.
 
 \note \code
-Sample usage:
-
-  // Reads nodes (id, x, y, z)
-  for (i = 0; i < nn; i++)
-  {
-      double x, y, z;
-      TopNode node;
-      NodeAtt*  node_data;
-      if (fscanf(fp,"%d, %lf, %lf, %lf",&id, &x, &y, &z) != 4) {
-          fprintf(stderr,"Invalid format for nodes.\n");
-          exit(1);
-          }
-      // Adds node to the model
-      node = topModel_InsertNode (model, x, y, z);
-      topNode_SetId (model, node, id);
-      node_data = (NodeAtt*) malloc(sizeof(NodeAtt));
-      assert(node_data);
-      initNodeAtt(node_data);
-      node_data->material.E = material.E;
-      node_data->material.v = material.v;
-      node_data->material.p = material.p;
-      node_data->bc = 0;
-      topNode_SetAttrib (model, node, node_data);
-  }
-
-
-
-
-        TopNodeItr* itr = topModel_CreateNodeItr(m);
-         int node_count=0;
-         for(topNodeItr_Begin(itr);topNodeItr_IsValid(itr);topNodeItr_Next(itr)){
-               node_count++;
-               TopNode node = topNodeItr_GetCurr(itr);
-               NodeAtt* na = topNode_GetAttrib(m,node);
-               print_node_attribute(myId, na);
-         }
-         printf("vp %d: node_count = %d\n", myId, node_count);
+put example here!
 \endcode
 
 @note ::NodeAtt and ::ElemAtt are just replaced with void* for this implementation.
@@ -57,6 +21,16 @@ Sample usage:
 #include <ParFUM_internals.h>
 
 
+#ifdef FP_TYPE_FLOAT
+#warning "Using floats for various things"
+typedef float FP_TYPE;
+#else
+#warning "Using doubles for various things"
+typedef double FP_TYPE;
+#endif
+
+
+
 /** A tops model is roughly equivalent to a ParFUM FEM_Mesh object */
 typedef struct{
     FEM_Mesh *mesh;
@@ -155,7 +129,7 @@ void topModel_Destroy(TopModel* m);
 void topModel_Sync(TopModel*m);
 
 /** Insert a node */
-TopNode topModel_InsertNode(TopModel*, double x, double y, double z);
+TopNode topModel_InsertNode(TopModel*, FP_TYPE x, FP_TYPE y, FP_TYPE z);
 
 /** Set id of a node */
 void topNode_SetId(TopModel*, TopNode, TopID id);
@@ -190,7 +164,8 @@ int topModel_GetNNodes(TopModel *model);
 
 int topElement_GetNNodes(TopModel* model, TopElement elem);
 
-void topNode_GetPosition(TopModel*model, TopNode node,double*x,double*y,double*z);
+void topNode_GetPosition(TopModel*model, TopNode node,FP_TYPE*x,FP_TYPE*y,FP_TYPE*z);
+
 
 /** Create Iterator for nodes */
 TopNodeItr*  topModel_CreateNodeItr(TopModel*);
@@ -239,5 +214,7 @@ void* topNode_D_GetAttrib(TopModel* m, TopNode n);
 TopNode topElement_D_GetNode(TopModel* m,TopElement e,int idx);
 #endif
 
+void top_retreive_elem_data(TopModel* m);
+void top_retreive_node_data(TopModel* m);
 
 #endif
index 8451773348af6513d64a3f5e3049306186aac313..09ae846ae1bd39a0657fdb2728f53db3aa242170 100644 (file)
@@ -8,10 +8,10 @@
 */
 
 #include "ParFUM_TOPS.h"
-#include "ParFUM.decl.h"
 #include "ParFUM_internals.h"
 
 
+#ifdef CUDA
 __device__ void* topElement_D_GetAttrib(TopModel* m, TopElement e){
   return (m->ElemDataDevice + e*m->elem_attr_size);
 }
@@ -20,6 +20,4 @@ __device__ void* topElement_D_GetAttrib(TopModel* m, TopElement e){
 __device__ void* topNode_D_GetAttrib(TopModel* m, TopNode n){
   return (m->NodeDataDevice + n*m->node_attr_size);
 }
-
-
-#include "ParFUM_TOPS.def.h"
+#endif