void node::add_output( node_id o ) { uint32_t newIdx = _output_count; resize_edges( _input_count, _output_count + 1 ); _edges[_input_count + newIdx] = o; }
node &node::operator=( const node &n ) { if ( this != &n ) { _hash = n._hash; _dims = n._dims; _value = n._value; _op_id = n._op_id; resize_edges( n._input_count, n._output_count ); std::copy( n._edges, n._edges + _input_count + _output_count, _edges ); } return *this; }
node::node( op_id o, const dimensions &d, const std::vector<node_id> &inputs, any val, hash::value hv ) : _hash( std::move( hv ) ), _dims( d ), _value( std::move( val ) ), _op_id( o ) { resize_edges( static_cast<uint32_t>( inputs.size() ), 0 ); std::copy( inputs.begin(), inputs.end(), _edges ); }
extern "C" void driver(void) { int ignored; int i; int myChunk=FEM_My_partition(); /*Add a refinement object to FEM array*/ CkPrintf("[%d] begin init\n",myChunk); FEM_REFINE2D_Init(); CkPrintf("[%d] end init\n",myChunk); myGlobals g; FEM_Register(&g,(FEM_PupFn)pup_myGlobals); init_myGlobal(&g); g.nnodes = FEM_Mesh_get_length(FEM_Mesh_default_read(),FEM_NODE); int maxNodes = g.nnodes; g.maxnodes=2*maxNodes; g.m_i_fid=FEM_Create_field(FEM_DOUBLE,1,0,sizeof(double)); resize_nodes((void *)&g,&g.nnodes,&maxNodes); int nghost=0; g.nelems=FEM_Mesh_get_length(FEM_Mesh_default_read(),FEM_ELEM); g.maxelems=g.nelems; resize_elems((void *)&g,&g.nelems,&g.maxelems); g.nedges = FEM_Mesh_get_length(FEM_Mesh_default_read(),FEM_SPARSE); g.maxedges = g.nedges; resize_edges((void *)&g,&g.nedges,&g.maxedges); FEM_REFINE2D_Newmesh(FEM_Mesh_default_read(),FEM_NODE,FEM_ELEM); //Initialize associated data for (i=0;i<g.maxnodes;i++){ g.R_net[i]=g.d[i]=g.v[i]=g.a[i]=vector2d(0.0); } //Apply a small initial perturbation to positions for (i=0;i<g.nnodes;i++) { const double max=1.0e-15/15.0; //Tiny perturbation g.d[i].x+=max*(i&15); g.d[i].y+=max*((i+5)&15); } int fid=FEM_Create_field(FEM_DOUBLE,2,0,sizeof(vector2d)); for (i=0;i<g.nelems;i++){ checkTriangle(g,i); } //Timeloop if (CkMyPe()==0){ CkPrintf("Entering timeloop\n"); } int tSteps=0x70FF00FF; calcMasses(g); double startTime=CkWallTimer(); double curArea=2.0e-5; for (int t=0;t<tSteps;t++) { if (1) { //Structural mechanics //Compute forces on nodes exerted by elements CST_NL(g.coord,g.conn,g.R_net,g.d,matConst,g.nnodes,g.nelems,g.S11,g.S22,g.S12); //Communicate net force on shared nodes FEM_Update_field(fid,g.R_net); //Advance node positions advanceNodes(dt,g.nnodes,g.coord,g.R_net,g.a,g.v,g.d,g.m_i,(t%4)==0); } //Debugging/perf. output double curTime=CkWallTimer(); double total=curTime-startTime; startTime=curTime; if (CkMyPe()==0 && (t%64==0)) CkPrintf("%d %.6f sec for loop %d \n",CkNumPes(),total,t); /* if (0 && t%16==0) { CkPrintf(" Triangle 0:\n"); for (int j=0;j<3;j++) { int n=g.conn[0][j]; CkPrintf(" Node %d: coord=(%.4f,%.4f) d=(%.4g,%.4g)\n", n,g.coord[n].x,g.coord[n].y,g.d[n].x,g.d[n].y); } }*/ // if (t%512==0) // FEM_Migrate(); if (t%128==0) { //Refinement: vector2d *loc=new vector2d[2*g.nnodes]; for (i=0;i<g.nnodes;i++) { loc[i]=g.coord[i];//+g.d[i]; } double *areas=new double[g.nelems]; curArea=curArea*0.98; for (i=0;i<g.nelems;i++) { #if 0 double origArea=8e-8; //Typical triangle size if (fabs(g.S12[i])>1.0e8) areas[i]=origArea*0.9; //Refine stuff that's stressed else areas[i]=origArea; //Leave everything else big #endif areas[i]=curArea; } CkPrintf("[%d] Starting refinement step: %d nodes, %d elements to %.3g\n", myChunk,g.nnodes,g.nelems,curArea); FEM_REFINE2D_Split(FEM_Mesh_default_read(),FEM_NODE,(double *)loc,FEM_ELEM,areas,FEM_SPARSE); repeat_after_split((void *)&g); g.nelems = FEM_Mesh_get_length(FEM_Mesh_default_read(),FEM_ELEM); g.nnodes = FEM_Mesh_get_length(FEM_Mesh_default_read(),FEM_NODE); CkPrintf("[%d] Done with refinement step: %d nodes, %d elements\n", myChunk,g.nnodes,g.nelems); } if (1) { //Publish data to the net NetFEM n=NetFEM_Begin(myChunk,t,2,NetFEM_POINTAT); NetFEM_Nodes(n,g.nnodes,(double *)g.coord,"Position (m)"); NetFEM_Vector(n,(double *)g.d,"Displacement (m)"); NetFEM_Vector(n,(double *)g.v,"Velocity (m/s)"); NetFEM_Elements(n,g.nelems,3,(int *)g.conn,"Triangles"); NetFEM_Scalar(n,g.S11,1,"X Stress (pure)"); NetFEM_Scalar(n,g.S22,1,"Y Stress (pure)"); NetFEM_Scalar(n,g.S12,1,"Shear Stress (pure)"); NetFEM_End(n); } } if (CkMyPe()==0) CkPrintf("Driver finished\n"); }