extern "C" void init(void) { CkPrintf("init started\n"); double startTime=CmiWallTimer(); const char *eleName="mesh1.tri"; const char *nodeName="mesh1.node"; int nPts=0; //Number of nodes vector2d *pts=0; //Node coordinates int *bounds; CkPrintf("Reading node coordinates from %s\n",nodeName); //Open and read the node coordinate file { char line[1024]; FILE *f=fopen(nodeName,"r"); if (f==NULL) die("Can't open node file!"); fgets(line,1024,f); if (1!=sscanf(line,"%d",&nPts)) die("Can't read number of points!"); pts=new vector2d[nPts]; bounds = new int[nPts]; for (int i=0;i<nPts;i++) { int ptNo; if (NULL==fgets(line,1024,f)) die("Can't read node input line!"); if (4!=sscanf(line,"%d%lf%lf%d",&ptNo,&pts[i].x,&pts[i].y, &bounds[i])) die("Can't parse node input line!"); } fclose(f); } int nEle=0; connRec *ele=NULL; CkPrintf("Reading elements from %s\n",eleName); //Open and read the element connectivity file { char line[1024]; FILE *f=fopen(eleName,"r"); if (f==NULL) die("Can't open element file!"); fgets(line,1024,f); if (1!=sscanf(line,"%d",&nEle)) die("Can't read number of elements!"); ele=new connRec[nEle]; for (int i=0;i<nEle;i++) { int elNo; if (NULL==fgets(line,1024,f)) die("Can't read element input line!"); if (4!=sscanf(line,"%d%d%d%d",&elNo,&ele[i][0],&ele[i][1],&ele[i][2])) die("Can't parse element input line!"); ele[i][0]--; //Fortran to C indexing ele[i][1]--; //Fortran to C indexing ele[i][2]--; //Fortran to C indexing } fclose(f); } int fem_mesh=FEM_Mesh_default_write(); // Tell framework we are writing to the mesh CkPrintf("Passing node coords to framework\n"); FEM_Mesh_data(fem_mesh, // Add nodes to the current mesh FEM_NODE, // We are registering nodes FEM_DATA+0, // Register the point locations which are normally // the first data elements for an FEM_NODE (double *)pts, // The array of point locations 0, // 0 based indexing nPts, // The number of points FEM_DOUBLE, // Coordinates are doubles 2); // Points have dimension 2 (x,y) CkPrintf("Passing node bounds to framework\n"); FEM_Mesh_data(fem_mesh, // Add nodes to the current mesh FEM_NODE, // We are registering nodes FEM_BOUNDARY, // Register the point bound info // the first data elements for an FEM_NODE (int *)bounds, // The array of point bound info 0, // 0 based indexing nPts, // The number of points FEM_INT, // bounds are ints 1); // Points have dimension 1 CkPrintf("Passing elements to framework\n"); FEM_Mesh_data(fem_mesh, // Add nodes to the current mesh FEM_ELEM+0, // We are registering elements with type 0 // The next type of element could be registered with FEM_ELEM+1 FEM_CONN, // Register the connectivity table for this // data elements for this type of FEM entity (int *)ele, // The array of point locations 0, // 0 based indexing nEle, // The number of elements FEM_INDEX_0, // We use zero based node numbering 3); // Elements have degree 3, since triangles are defined // by three nodes delete[] ele; delete[] pts; // Register values to the elements so we can keep track of them after partitioning int *values; values=new int[nEle]; for(int i=0;i<nEle;i++)values[i]=i; // triangles FEM_Mesh_data(fem_mesh, // Add nodes to the current mesh FEM_ELEM, // We are registering elements with type 1 FEM_DATA, (int *)values, // The array of point locations 0, // 0 based indexing nEle, // The number of elements FEM_INT, // We use zero based node numbering 1); delete [] values; values=new int[nPts]; for (int i=0; i<nPts; i++) values[i]=i; // triangles FEM_Mesh_data(fem_mesh, // Add nodes to the current mesh FEM_NODE, // We are registering elements with type 1 FEM_DATA+1, (int *)values, // The array of point locations 0, // 0 based indexing nPts, // The number of elements FEM_INT, // We use zero based node numbering 1); delete [] values; //boundary conditions FEM_Mesh_data(fem_mesh, // Add nodes to the current mesh FEM_NODE, // We are registering elements with type 1 FEM_BOUNDARY, (int *)bounds, // The array of point locations 0, // 0 based indexing nPts, // The number of elements FEM_INT, // We use zero based node numbering 1); delete [] bounds; // add ghost layers const int triangleFaces[6] = {0,1,2}; CkPrintf("Adding Ghost layers\n"); FEM_Add_ghost_layer(1,1); FEM_Add_ghost_elem(0,3,triangleFaces); CkPrintf("Finished with init (Reading took %.f s)\n",CmiWallTimer()-startTime); }
extern "C" void init(void) { CkPrintf("init started\n"); const char *eleName="out.1024.ele"; const char *nodeName="out.1024.node"; const char *edgeName="out.1024.edge"; int nPts=0; //Number of nodes vector2d *pts=0; //Node coordinates CkPrintf("Reading node coordinates from %s\n",nodeName); //Open and read the node coordinate file { char line[1024]; FILE *f=fopen(nodeName,"r"); if (f==NULL) die("Can't open node file!"); fgets(line,1024,f); if (1!=sscanf(line,"%d",&nPts)) die("Can't read number of points!"); pts=new vector2d[nPts]; for (int i=0;i<nPts;i++) { int ptNo; if (NULL==fgets(line,1024,f)) die("Can't read node input line!"); if (3!=sscanf(line,"%d%lf%lf",&ptNo,&pts[i].x,&pts[i].y)) die("Can't parse node input line!"); pts[i].y = 4.0*pts[i].y; } fclose(f); } CkPrintf("Passing node coords to framework\n"); // Register the node entity and its data arrays that will be used later. This // needs to be done so that the width of the data segments are set correctly // and can be used later FEM_Register_entity(FEM_Mesh_default_write(),FEM_NODE,NULL,nPts,nPts,resize_nodes); for(int k=0;k<=4;k++){ if(k != 0){ vector2d *t = new vector2d[nPts]; FEM_Register_array(FEM_Mesh_default_write(),FEM_NODE,FEM_DATA+k,t,FEM_DOUBLE,2); }else{ FEM_Register_array(FEM_Mesh_default_write(),FEM_NODE,FEM_DATA+k,pts,FEM_DOUBLE,2); } } double *td = new double[nPts]; FEM_Register_array(FEM_Mesh_default_write(),FEM_NODE,FEM_DATA+5,td,FEM_DOUBLE,1); int *validNodes = new int[nPts]; for(int ii=0;ii<nPts;ii++){ validNodes[ii]=1; } FEM_Register_array(FEM_Mesh_default_write(),FEM_NODE,FEM_VALID,validNodes,FEM_INT,1); int nEle=0; int *ele=NULL; CkPrintf("Reading elements from %s\n",eleName); //Open and read the element connectivity file { char line[1024]; FILE *f=fopen(eleName,"r"); if (f==NULL) die("Can't open element file!"); fgets(line,1024,f); if (1!=sscanf(line,"%d",&nEle)) die("Can't read number of elements!"); ele=new int[3*nEle]; for (int i=0;i<nEle;i++) { int elNo; if (NULL==fgets(line,1024,f)) die("Can't read element input line!"); if (4!=sscanf(line,"%d%d%d%d",&elNo,&ele[3*i+0],&ele[3*i+1],&ele[3*i+2])) die("Can't parse element input line!"); ele[3*i+0]--; //Fortran to C indexing ele[3*i+1]--; //Fortran to C indexing ele[3*i+2]--; //Fortran to C indexing } fclose(f); } CkPrintf("Passing elements to framework\n"); // Register the Element entity and its connectivity array. Register the // data arrays to set up the widths correctly at the beginning FEM_Register_entity(FEM_Mesh_default_write(),FEM_ELEM,NULL,nEle,nEle,resize_elems); FEM_Register_array(FEM_Mesh_default_write(),FEM_ELEM,FEM_CONN,ele,FEM_INDEX_0,3); for(int k=0;k<3;k++){ void *t = new double[nEle]; FEM_Register_array(FEM_Mesh_default_write(),FEM_ELEM,FEM_DATA+k,t,FEM_DOUBLE,1); } int *validElem = new int[nEle]; for(int ii=0;ii<nEle;ii++){ validElem[ii]=1; } FEM_Register_array(FEM_Mesh_default_write(),FEM_ELEM,FEM_VALID,validElem,FEM_INT,1); /*Build the ghost layer for refinement border*/ FEM_Add_ghost_layer(2,0); /*2 nodes/tuple, do not add ghost nodes*/ //FEM_Add_ghost_layer(2,1); /*2 nodes/tuple, do not add ghost nodes*/ const static int tri2edge[6]={0,1, 1,2, 2,0}; FEM_Add_ghost_elem(0,3,tri2edge); //open and read the .edge (edge connectivity file) needed for boundary values int nEdge; int *edgeConn; int *edgeBoundary; int *validEdge; { char line[1024]; FILE *f=fopen(edgeName,"r"); if (f==NULL) die("Can't open edge file!"); fgets(line,1024,f); if (1!=sscanf(line,"%d",&nEdge)) die("Can't read number of elements!"); edgeConn = new int[2*nEdge]; edgeBoundary = new int[nEdge]; validEdge = new int[nEdge]; for(int i=0;i<nEdge;i++){ int edgeNo; if (NULL==fgets(line,1024,f)) die("Can't read edge input line!"); if (4 != sscanf(line,"%d%d%d%d",&edgeNo,&edgeConn[i*2+0],&edgeConn[i*2+1],&edgeBoundary[i])){ die("Can't parse edge input line!"); } edgeConn[i*2+0]--; edgeConn[i*2+1]--; validEdge[i] = 1; } fclose(f); } printf("Number of edges %d \n",nEdge); FEM_Register_entity(FEM_Mesh_default_write(),FEM_SPARSE,NULL,nEdge,nEdge,resize_edges); FEM_Register_array(FEM_Mesh_default_write(),FEM_SPARSE,FEM_CONN,edgeConn,FEM_INDEX_0,2); FEM_Register_array(FEM_Mesh_default_write(),FEM_SPARSE,FEM_BOUNDARY,edgeBoundary,FEM_INT,1); FEM_Register_array(FEM_Mesh_default_write(),FEM_SPARSE,FEM_VALID,validEdge,FEM_INT,1); CkPrintf("Finished with init\n"); }
FDECL void FTN_NAME(FEM_ADD_GHOST_LAYER,fem_add_ghost_layer) (int *nodesPerTuple,int *doAddNodes) { FEM_Add_ghost_layer(*nodesPerTuple,*doAddNodes); }