Example #1
0
void
node::add_output( node_id o )
{
	uint32_t newIdx = _output_count;
	resize_edges( _input_count, _output_count + 1 );
	_edges[_input_count + newIdx] = o;
}
Example #2
0
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;
}
Example #3
0
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 );
}
Example #4
0
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");
}