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; }
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(); }