Exemplo n.º 1
0
GlobalAddress<T> symmetric_global_alloc() {
  static_assert(sizeof(T) % block_size == 0,
                "must pad global proxy to multiple of block_size, or use GRAPPA_BLOCK_ALIGNED");
  // allocate enough space that we are guaranteed to get one on each core at same location
  auto qac = global_alloc<char>(cores()*(sizeof(T)+block_size));
  while (qac.core() != MASTER_CORE) qac++;
  auto qa = static_cast<GlobalAddress<T>>(qac);
  CHECK_EQ(qa, qa.block_min());
  CHECK_EQ(qa.core(), MASTER_CORE);
  return qa;
}
Exemplo n.º 2
0
void simulator::initialize_explosion()
{
	int num_particle=125000;
	float endtime=0.015f;
	float outtime=endtime;

	cinder::Vec3f grid_span_min(0,0,0);
	cinder::Vec3f grid_span_max(3,3,3);
	float grid_space=0.05f;

	float time_interval_factor=0.1;
	float time_interval=7e-6;
	outtime=0.001;
	float report_time=0.0001;

	vector<e_grid_edge_condition> fixS(6);
	fixS[0]=(e_grid_edge_condition)2;
	fixS[1]=(e_grid_edge_condition)0;
	fixS[2]=(e_grid_edge_condition)2;
	fixS[3]=(e_grid_edge_condition)2;
	fixS[4]=(e_grid_edge_condition)2;
	fixS[5]=(e_grid_edge_condition)2;

	int num_material=1;
	p_material_data=new materialData();
	p_material_data->num_material=num_material;
	p_material_data->material_list.resize(p_material_data->num_material);
	p_material_data->moterial_model_list.resize(p_material_data->num_material);
	for(int i=0;i<num_material;i++)
	{
		p_material_data->material_list[i]=new material();
		int materialtype=8;
		int eostype=3;
		switch(materialtype)
		{
		case 8:
			p_material_data->material_list[i]->set_high_explosive_burn(1.63*0.001,6930);
			p_material_data->moterial_model_list[i]=new HighExplosiveBurnModel();
		}

		switch(eostype)
		{
		case 3:
			p_material_data->material_list[i]->set_JWL_eos(3.712*100000, 3.21*1000, 4.15, 0.95, 0.3, 6993);
		}
	}

	float cutoff=0;
	for(int i=0;i<num_material;i++)
	{
		cutoff+=p_material_data->material_list[i]->density;
	}
	cutoff=cutoff*pow(grid_space,3)*(1.0e-5)/num_material;

	bool jaum=1;
	int num_detonation_point=1;
	vector<cinder::Vec3f> detonation_points;
	detonation_points.push_back(cinder::Vec3f(0,0,0));
	//detonation_points.push_back(cinder::Vec3f(0,0.5,0.5));
	cinder::Vec2f bulk_viscosity(1.5f,0.06f);
	for(int i=0;i<num_material;i++)
	{
		p_material_data->material_list[i]->set_data_for_all_materials(jaum,num_detonation_point, bulk_viscosity.x, bulk_viscosity.y, detonation_points);
		p_material_data->set_data(jaum,num_detonation_point, bulk_viscosity.x, bulk_viscosity.y, detonation_points);
	}

	//get time intervel
	for(int i=0;i<num_material;i++)
	{
		material* m=p_material_data->material_list[i];
		if(m->matType!=e_undeformable)
		{
			float sound_speed=sqrt( m->young*(1-m->poisson)/(1+m->poisson)/(1-2*m->poisson)/m->density );
			sound_speed=max(sound_speed,m->detonationVelocity);
			sound_speed=max(sound_speed,m->wavespeed);
			time_interval=min(time_interval,grid_space/sound_speed);
		}
	}
	time_interval*=time_interval_factor;
	cout<<"time intervel:"<<time_interval<<endl;

		
	//particle&body
	p_particle_data=new particle_data();
	int body_counter=0;
	int particle_counter=0;

	int componentid=0;
	int materialid=0;

	particle_body* pb=new particle_body();
	pb->set_material(materialid,p_material_data->material_list[materialid], p_material_data->moterial_model_list[materialid], componentid); 
	pb->begin=particle_counter;
		

	float density_block=1.63*0.001;
	float distance_between_particles=0.025;
	float particle_mass=pow(density_block*distance_between_particles,3);
	cinder::Vec3f block_min(0,0,0);
	block_min+=distance_between_particles*0.5;
	cinder::Vec3i num_particle_axis(50,50,50);

	//p_particle_data->particle_list.resize(num_particle);
	for(int x=0;x<num_particle_axis.x;x++)
	{
		for(int y=0;y<num_particle_axis.y;y++)
		{
			for(int z=0;z<num_particle_axis.z;z++)
			{
				particle* p=new particle();
				p->particle_id=particle_counter;
				p->particle_mass=particle_mass;
				p->position_t.set(x*distance_between_particles+block_min.x,
					y*distance_between_particles+block_min.y,
					z*distance_between_particles+block_min.z);
				p_particle_data->particle_list.push_back(p);
				particle_counter++;

			}
		}
	}
	pb->end=particle_counter;
	p_particle_data->body_list.push_back(pb);
	body_counter++;



	bool MUSL=true;
	bool GIMP=false;
	bool contact=false;
	bool USF=false;
	bool USL=false;
	bool gravity=false;
	p_particle_data->init_method(MUSL, USL, USF, GIMP, contact, gravity);

	int num_component=1;
	int num_body=1;
	p_particle_data->num_body=num_body;
	p_particle_data->num_component=num_component;
	p_particle_data->num_particle=num_particle;

	cout<<"body:"<<p_particle_data->num_body<<" "<<p_particle_data->body_list.size()<<endl;
	cout<<"particle:"<<p_particle_data->num_particle<<" "<<p_particle_data->particle_list.size()<<endl;
	cout<<"comp:"<<p_particle_data->num_component<<endl;

	//init particles
	for(int b=0;b<num_body;b++)
	{
		for(int i=p_particle_data->body_list[b]->begin;i<p_particle_data->body_list[b]->end;i++)
		{
			particle* p=p_particle_data->particle_list[i];
			material* m=p_particle_data->body_list[b]->mat;
			p->volume=p->particle_mass/m->density;
			p->yield_stress=m->yield0;
			p->internel_energy=m->cEOS[0]*p->volume;
			p->lighting_time=10;
			for(int j=0;j<num_detonation_point;j++)
			{
				p->lighting_time=min(p->lighting_time,(p->position_t-detonation_points[j]).length()/m->detonationVelocity);
			}

		}
	}

	p_particle_data->init_time_param(time_interval, endtime, time_interval_factor);

	//grid
	p_grid_data=new grid_data(grid_span_min,grid_span_max,grid_space,fixS,GIMP,num_component,cutoff);
	p_grid_data->init_grid_and_cell_list(num_component);

	p_particle_data->calcEnergy();
}