// Set any collision geometry on the hull, then Initialize() all subsystems void TrackVehicleM113::Initialize(const ChCoordsys<>& chassis_Csys) { // move the chassis REF frame to the specified initial position/orientation m_chassis->SetFrame_REF_to_abs(ChFrame<>(chassis_Csys)); // add collision geometry to the chassis AddCollisionGeometry(); // initialize the subsystems with the initial c-sys and specified offsets for (int i = 0; i < m_num_tracks; i++) { m_TrackSystems[i]->Initialize(m_chassis, m_TrackSystem_locs[i], dynamic_cast<ChTrackVehicle*>(this), m_damping); } // initialize the powertrain, drivelines for (int j = 0; j < m_num_engines; j++) { size_t driveGear_R_idx = 2*j; size_t driveGear_L_idx = 2*j + 1; m_ptrains[j]->Initialize(m_chassis, m_axle ); } }
void CreateSegment(T* mSys, ChVector<> position, ChVector<> velocity) { real mass = 1; Quaternion q(1, 0, 0, 0); //q.Q_from_AngZ(PI / 2.0); string_vector[fibers] = ChSharedBodyPtr(new ChBody(new ChCollisionModelParallel)); InitObject(string_vector[fibers], mass, Vector(0, 0, 0) + position, q, material_fiber, true, false, -1, -2); AddCollisionGeometry(string_vector[fibers], SPHERE, Vector(segment_thickness, segment_length, segment_length), Vector(0, 0, 0), Quaternion(1, 0, 0, 0)); //AddCollisionGeometry(string_vector[fibers], SPHERE, Vector(segment_thickness, segment_length, segment_length), Vector(0, segment_length, 0), Quaternion(1, 0, 0, 0)); //AddCollisionGeometry(string_vector[fibers], SPHERE, Vector(segment_thickness, segment_length, segment_length), Vector(0, -segment_length, 0), Quaternion(1, 0, 0, 0)); //string_vector[fibers]->SetInertiaXX(ChVector<>(1, 1, 1)); FinalizeObject(string_vector[fibers], (ChSystemParallel *) mSys); string_vector[fibers]->SetPos_dt(velocity); fibers++; }
void System::DoTimeStep() { if (mNumCurrentObjects < mNumObjects && mFrameNumber % 100 == 0) { float x = 1, y = numY, z = 1; float posX = 0, posY = -8, posZ = 0; srand(1); float mass = .01, mu = .5, rest = 0; ShapeType type = SPHERE; CHBODYSHAREDPTR mrigidBody; mNumCurrentObjects += x * y * z; int mobjNum = 0; for (int xx = 0; xx < x; xx++) { for (int yy = 0; yy < y; yy++) { for (int zz = 0; zz < z; zz++) { type = CYLINDER;//rand()%2;e float radius = .5;//(rand()%1000)/3000.0+.05; ChVector<> mParticlePos((xx - (x - 1) / 2.0) + posX, (yy) + posY, (zz - (z - 1) / 2.0) + posZ); //mParticlePos += ChVector<> (rand() % 1000 / 10000.0 - .05, rand() % 1000 / 10000.0 - .05, rand() % 1000 / 10000.0 - .05); ChQuaternion<> quat = ChQuaternion<> (1, 0, 0, 0);// (rand() % 1000 / 1000., rand() % 1000 / 1000., rand() % 1000 / 1000., rand() % 1000 / 1000.); ChVector<> dim; ChVector<> lpos(0, 0, 0); quat.Normalize(); mrigidBody = CHBODYSHAREDPTR(new CHBODY); InitObject(mrigidBody, mass, mParticlePos * 1.1, quat, mu, mu, rest, true, false, 0, 1); mrigidBody->SetPos_dt(ChVector<> (0, 0, 0)); switch (type) { case SPHERE: dim = ChVector<> (radius, 0, 0); case ELLIPSOID: dim = ChVector<> (radius * 1.3, radius, radius * 1.3); case BOX: dim = ChVector<> (radius, radius, radius); case CYLINDER: dim = ChVector<> (radius, radius*2, radius); } AddCollisionGeometry(mrigidBody, type, dim, lpos, quat); FinalizeObject(mrigidBody); mobjNum++; } } } } mFrameNumber++; mSystem->DoStepDynamics(mTimeStep); mCurrentTime += mTimeStep; GPUSystem->PrintStats(); }
void CreateFiber(T* mSys, ChVector<> position) { real length = .05; real thickness = .01; ChSharedBodyPtr Fiber1 = ChSharedBodyPtr(new ChBody(new ChCollisionModelParallel)); ChSharedBodyPtr Fiber2; ChSharedBodyPtr fibers[10]; fibers[0] = ChSharedBodyPtr(new ChBody(new ChCollisionModelParallel)); Quaternion q; q.Q_from_AngZ(PI / 2.0); InitObject(fibers[0], .1, Vector(0, -2, 0) + position, q, material_fiber, true, false, -1, -2); AddCollisionGeometry(fibers[0], CYLINDER, Vector(thickness, length, length), Vector(0, 0, 0), Quaternion(1, 0, 0, 0)); AddCollisionGeometry(fibers[0], SPHERE, Vector(thickness, length, length), Vector(0, length, 0), Quaternion(1, 0, 0, 0)); AddCollisionGeometry(fibers[0], SPHERE, Vector(thickness, length, length), Vector(0, -length, 0), Quaternion(1, 0, 0, 0)); FinalizeObject(fibers[0], (ChSystemParallel *) mSys); fibers[0]->SetPos_dt(Vector(0, -1, 0)); for (int i = 1; i < 10; i++) { fibers[i] = ChSharedBodyPtr(new ChBody(new ChCollisionModelParallel)); InitObject(fibers[i], .1, Vector(i * (length + thickness) * 2, -2, 0) + position, q, material_fiber, true, false, -1, -2); AddCollisionGeometry(fibers[i], CYLINDER, Vector(thickness, length, length), Vector(0, 0, 0), Quaternion(1, 0, 0, 0)); AddCollisionGeometry(fibers[i], SPHERE, Vector(thickness, length, length), Vector(0, length, 0), Quaternion(1, 0, 0, 0)); AddCollisionGeometry(fibers[i], SPHERE, Vector(thickness, length, length), Vector(0, -length, 0), Quaternion(1, 0, 0, 0)); FinalizeObject(fibers[i], (ChSystemParallel *) mSys); fibers[i]->SetPos_dt(Vector(0, -1, 0)); ChCoordsys<> pos; pos.pos = Vector((i - 1) * (length + thickness) * 2 + length, -2, 0) + position; ChSharedPtr<ChLinkLockRevolute> joint(new ChLinkLockRevolute); joint->Initialize(fibers[i - 1], fibers[i], pos); // joint->Initialize(fibers[i - 1], fibers[i], true, Vector(length,0,0),Vector(-length,0,0),true); // joint->Set_SpringF(100); // joint->Set_SpringK(100); // joint->Set_SpringR(100); mSys->AddLink(joint); } }
int main(int argc, char* argv[]) { //int threads = 8; string solver = "APGD"; if (argc > 1) { solver = argv[1]; max_particles = atoi(argv[2]); data_folder = argv[3]; //threads = (atoi(argv[1])); } if (argc == 5) { particle_radius = atof(argv[4]); } omp_set_num_threads(1); //========================================================================================================= ch_system * system_gpu = new ch_system; system_gpu->SetIntegrationType(ChSystem::INT_ANITESCU); #ifndef USEGPU if (solver == "APGD") { system_gpu->SetLcpSolverType(ChSystem::LCP_ITERATIVE_APGD); } else if (solver == "JACOBI") { system_gpu->SetLcpSolverType(ChSystem::LCP_ITERATIVE_JACOBI); //((ChLcpIterativeSolver*) system_gpu->GetLcpSolverSpeed())->SetOmega(.5); //((ChLcpIterativeSolver*) system_gpu->GetLcpSolverSpeed())->SetSharpnessLambda(.5); } else if (solver == "SOR") { system_gpu->SetLcpSolverType(ChSystem::LCP_ITERATIVE_SOR); } #endif ((ChLcpIterativeSolver*) system_gpu->GetLcpSolverSpeed())->SetRecordViolation(true); //========================================================================================================= system_gpu->SetParallelThreadNumber(1); system_gpu->SetMaxiter(max_iter); system_gpu->SetIterLCPmaxItersSpeed(max_iter); system_gpu->SetTol(tolerance); system_gpu->SetTolSpeeds(tolerance); system_gpu->SetMaxPenetrationRecoverySpeed(30); #ifdef USEGPU //((ChLcpSolverParallelDVI*) (system_gpu->GetLcpSolverSpeed()))->SetMaxIteration(max_iteration); ((ChLcpSolverParallelDVI*) (system_gpu->GetLcpSolverSpeed()))->SetMaxIterationNormal(max_iter/2); ((ChLcpSolverParallelDVI*) (system_gpu->GetLcpSolverSpeed()))->SetMaxIterationSliding(max_iter/2); ((ChLcpSolverParallelDVI*) (system_gpu->GetLcpSolverSpeed()))->SetMaxIterationSpinning(0); ((ChLcpSolverParallelDVI*) (system_gpu->GetLcpSolverSpeed()))->SetMaxIterationBilateral(0); ((ChLcpSolverParallelDVI *) (system_gpu->GetLcpSolverSpeed()))->SetTolerance(tolerance); ((ChLcpSolverParallelDVI *) (system_gpu->GetLcpSolverSpeed()))->SetCompliance( 0); ((ChLcpSolverParallelDVI *) (system_gpu->GetLcpSolverSpeed()))->SetContactRecoverySpeed(5); ((ChLcpSolverParallelDVI *) (system_gpu->GetLcpSolverSpeed()))->SetSolverType(APGDRS); ((ChCollisionSystemParallel *) (system_gpu->GetCollisionSystem()))->SetCollisionEnvelope(particle_radius * .01); ((ChCollisionSystemParallel *) (system_gpu->GetCollisionSystem()))->setBinsPerAxis(I3(30, 30, 30)); ((ChCollisionSystemParallel *) (system_gpu->GetCollisionSystem()))->setBodyPerBin(100, 50); ((ch_system*) system_gpu)->SetAABB(R3(-6, -6, -6), R3(6, 6, 6)); #endif system_gpu->Set_G_acc(ChVector<>(0, gravity, 0)); system_gpu->SetStep(timestep); //========================================================================================================= ChSharedBodyPtr L = ChSharedBodyPtr(new ch_body); ChSharedBodyPtr R = ChSharedBodyPtr(new ch_body); ChSharedBodyPtr F = ChSharedBodyPtr(new ch_body); ChSharedBodyPtr B = ChSharedBodyPtr(new ch_body); ChSharedBodyPtr Bottom = ChSharedBodyPtr(new ch_body); ChSharedBodyPtr Top = ChSharedBodyPtr(new ch_body); ChSharedBodyPtr Tube = ChSharedBodyPtr(new ch_body); ChSharedPtr<ChMaterialSurface> material; material = ChSharedPtr<ChMaterialSurface>(new ChMaterialSurface); material->SetFriction(.4); material->SetRollingFriction(0); material->SetSpinningFriction(0); material->SetCompliance(0); material->SetCohesion(0); InitObject(Bottom, 100000, Vector(0, container_height - container_size.y, 0), Quaternion(1, 0, 0, 0), material, true, true, 1, 1); AddCollisionGeometry(Bottom, BOX, Vector(container_size.x, container_thickness, container_size.z), Vector(0, 0, 0), Quaternion(1, 0, 0, 0)); FinalizeObject(Bottom, (ch_system *) system_gpu); ChSharedBodyPtr Ring; for (int i = 0; i < 360; i += 5) { real angle = i * PI / 180.0; real x = cos(angle) * 5; real z = sin(angle) * 5; Quaternion q; q.Q_from_AngAxis(-angle, Vector(0, 1, 0)); Ring = ChSharedBodyPtr(new ch_body); InitObject(Ring, 100000, Vector(x, container_height - 3, z), q, material, true, true, 1, 1); AddCollisionGeometry(Ring, BOX, Vector(.25, 3, .25), Vector(0, 0, 0), Quaternion(1, 0, 0, 0)); FinalizeObject(Ring, (ch_system *) system_gpu); } spinner = ChSharedBodyPtr(new ch_body); InitObject(spinner, 100000, Vector(0, container_height - container_size.y + 2, 0), Quaternion(1, 0, 0, 0), material, true, false, 1, 1); real spinner_h = .5; AddCollisionGeometry(spinner, CYLINDER, Vector(.5, .4, .5), Vector(0, 0, 0), chrono::Q_from_AngAxis(0, ChVector<>(0, 0, 1))); AddCollisionGeometry(spinner, BOX, Vector(container_thickness / 15.0, spinner_h, 1.5), Vector(0, 0, 1.75), chrono::Q_from_AngAxis(CH_C_PI / 4.0, ChVector<>(0, 0, 1))); AddCollisionGeometry(spinner, BOX, Vector(container_thickness / 15.0, spinner_h, 1.5), Vector(0, 0, -1.75), chrono::Q_from_AngAxis(-CH_C_PI / 4.0, ChVector<>(0, 0, 1))); AddCollisionGeometry(spinner, BOX, Vector(1.5, spinner_h, container_thickness / 15.0), Vector(1.75, 0, 0), chrono::Q_from_AngAxis(CH_C_PI / 4.0, ChVector<>(1, 0, 0))); AddCollisionGeometry(spinner, BOX, Vector(1.5, spinner_h, container_thickness / 15.0), Vector(-1.75, 0, 0), chrono::Q_from_AngAxis(-CH_C_PI / 4.0, ChVector<>(1, 0, 0))); FinalizeObject(spinner, (ch_system *) system_gpu); #ifdef USEGPU layer_gen = new ParticleGenerator<ch_system>((ch_system *) system_gpu, true); #else layer_gen = new ParticleGenerator<ch_system>((ch_system *) system_gpu, false); #endif layer_gen->SetDensity(1000); layer_gen->SetRadius(R3(particle_radius)); layer_gen->material->SetFriction(.5); layer_gen->material->SetCohesion(particle_cohesion); #ifdef USEGPU layer_gen->material->SetCompliance(0); #else layer_gen->material->SetCompliance(0); #endif layer_gen->material->SetSpinningFriction(0); layer_gen->material->SetRollingFriction(0); layer_gen->SetRadius(R3(particle_radius, particle_radius * 1.1, particle_radius)); layer_gen->SetCylinderRadius(4.5); layer_gen->SetNormalDistribution(particle_radius, .01); layer_gen->AddMixtureType(MIX_SPHERE); layer_gen->AddMixtureType(MIX_ELLIPSOID); //layer_gen->AddMixtureType(MIX_CYLINDER); layer_gen->AddMixtureType(MIX_CUBE); //layer_gen->AddMixtureType(MIX_CONE); //========================================================================================================= ////Rendering specific stuff: // ChOpenGLManager * window_manager = new ChOpenGLManager(); // ChOpenGL openGLView(window_manager, system_gpu, 800, 600, 0, 0, "Test_Solvers"); // // //openGLView.render_camera->camera_position = glm::vec3(0, -5, -10); // // openGLView.render_camera->camera_look_at = glm::vec3(0, -5, 0); // // openGLView.render_camera->camera_scale = .1; // openGLView.SetCustomCallback(RunTimeStep); // openGLView.StartSpinning(window_manager); // window_manager->CallGlutMainLoop(); //========================================================================================================= stringstream s1; s1 << data_folder << "/residual.txt"; CSVGen csv_output; csv_output.OpenFile(s1.str().c_str()); int file = 0; for (int i = 0; i < num_steps; i++) { system_gpu->DoStepDynamics(timestep); double TIME = system_gpu->GetChTime(); double STEP = system_gpu->GetTimerStep(); double BROD = system_gpu->GetTimerCollisionBroad(); double NARR = system_gpu->GetTimerCollisionNarrow(); double LCP = system_gpu->GetTimerLcp(); double UPDT = system_gpu->GetTimerUpdate(); std::vector<double> violation = ((ChLcpIterativeSolver*) system_gpu->GetLcpSolverSpeed())->GetViolationHistory(); int REQ_ITS = violation.size(); double RESID = 0; if (REQ_ITS != 0) { RESID = violation.at(violation.size() - 1); } int BODS = system_gpu->GetNbodies(); int CNTC = system_gpu->GetNcontacts(); printf("%7.4f|%7.4f|%7.4f|%7.4f|%7.4f|%7.4f|%7d|%7d|%7d|%7.4f\n", TIME, STEP, BROD, NARR, LCP, UPDT, BODS, CNTC, REQ_ITS, RESID); int save_every = 1.0 / timestep / 60.0; //save data every n steps // if (i % save_every == 0) { // stringstream ss; // cout << "Frame: " << file << endl; // ss << data_folder << "/" << file << ".txt"; // //DumpAllObjects(system_gpu, ss.str(), ",", true); // DumpAllObjectsWithGeometryPovray(system_gpu, ss.str()); // file++; // // } csv_output << TIME; csv_output << STEP; csv_output << BROD; csv_output << NARR; csv_output << LCP; csv_output << UPDT; csv_output << BODS; csv_output << CNTC; csv_output << REQ_ITS; csv_output << RESID; csv_output.Endline(); RunTimeStep(system_gpu, i); } csv_output.CloseFile(); }
int main(int argc, char* argv[]) { //omp_set_num_threads(8); if (argc == 4) { cohesion_water = atof(argv[1]); cohesion_goop = atof(argv[2]); data_folder = argv[3]; cout << cohesion_water << " " << cohesion_goop << " " << data_folder << endl; } //========================================================================================================= ChSystemParallelDVI * system_gpu = new ChSystemParallelDVI; system_gpu->SetIntegrationType(ChSystem::INT_ANITESCU); //========================================================================================================= //system_gpu->SetMaxiter(max_iter); //system_gpu->SetIterLCPmaxItersSpeed(max_iter); ((ChLcpSolverParallelDVI *) (system_gpu->GetLcpSolverSpeed()))->SetMaxIterationNormal(max_iter); ((ChLcpSolverParallelDVI *) (system_gpu->GetLcpSolverSpeed()))->SetMaxIterationSliding(max_iter); ((ChLcpSolverParallelDVI *) (system_gpu->GetLcpSolverSpeed()))->SetMaxIterationSpinning(0); ((ChLcpSolverParallelDVI *) (system_gpu->GetLcpSolverSpeed()))->SetMaxIterationBilateral(max_iter * 2); system_gpu->SetTol(.5); system_gpu->SetTolSpeeds(.5); ((ChLcpSolverParallelDVI *) (system_gpu->GetLcpSolverSpeed()))->SetTolerance(.5); ((ChLcpSolverParallelDVI *) (system_gpu->GetLcpSolverSpeed()))->SetCompliance(.0); ((ChLcpSolverParallelDVI *) (system_gpu->GetLcpSolverSpeed()))->SetContactRecoverySpeed(1); ((ChLcpSolverParallelDVI *) (system_gpu->GetLcpSolverSpeed()))->SetSolverType(APGDRS); ((ChLcpSolverParallelDVI *) (system_gpu->GetLcpSolverSpeed()))->SetWarmStart(false); ((ChCollisionSystemParallel *) (system_gpu->GetCollisionSystem()))->SetCollisionEnvelope(particle_radius * .05); ((ChCollisionSystemParallel *) (system_gpu->GetCollisionSystem()))->setBinsPerAxis(I3(100, 100, 100)); ((ChCollisionSystemParallel *) (system_gpu->GetCollisionSystem()))->setBodyPerBin(200, 100); system_gpu->Set_G_acc(ChVector<>(0, gravity, 0)); system_gpu->SetStep(timestep); //((ChSystemParallel*) system_gpu)->SetAABB(R3(-6, -6, -6), R3(6, 6, 6)); ChSharedBodyPtr L = ChSharedBodyPtr(new ChBody(new ChCollisionModelParallel)); ChSharedBodyPtr R = ChSharedBodyPtr(new ChBody(new ChCollisionModelParallel)); ChSharedBodyPtr F = ChSharedBodyPtr(new ChBody(new ChCollisionModelParallel)); ChSharedBodyPtr B = ChSharedBodyPtr(new ChBody(new ChCollisionModelParallel)); ChSharedBodyPtr Bottom = ChSharedBodyPtr(new ChBody(new ChCollisionModelParallel)); ChSharedBodyPtr Top = ChSharedBodyPtr(new ChBody(new ChCollisionModelParallel)); ChSharedBodyPtr Float = ChSharedBodyPtr(new ChBody(new ChCollisionModelParallel)); ChSharedPtr<ChMaterialSurface> material; material = ChSharedPtr<ChMaterialSurface>(new ChMaterialSurface); material->SetFriction(container_friction); //material->SetRollingFriction(.5); //material->SetSpinningFriction(.5); material->SetCompliance(0); material->SetCohesion(-1000); InitObject(L, 100000, Vector(-container_size.x + container_thickness, container_height - container_thickness, 0), Quaternion(1, 0, 0, 0), material, true, true, -20, -20); InitObject(R, 100000, Vector(container_size.x - container_thickness, container_height - container_thickness, 0), Quaternion(1, 0, 0, 0), material, true, true, -20, -20); InitObject(F, 100000, Vector(0, container_height - container_thickness, -container_size.z + container_thickness), Quaternion(1, 0, 0, 0), material, true, true, -20, -20); InitObject(B, 100000, Vector(0, container_height - container_thickness, container_size.z - container_thickness), Quaternion(1, 0, 0, 0), material, true, true, -20, -20); InitObject(Bottom, 100000, Vector(0, container_height - container_size.y, 0), Quaternion(1, 0, 0, 0), material, true, true, -20, -20); InitObject(Top, 100000, Vector(0, container_height + container_size.y, 0), Quaternion(1, 0, 0, 0), material, true, true, -20, -20); Quaternion qqq; qqq.Q_from_AngZ(15); InitObject(Float, 100000, Vector(0, -3, 0), qqq, material, true, true, -20, -20); AddCollisionGeometry(L, BOX, Vector(container_thickness, container_size.y, container_size.z), Vector(0, 0, 0), Quaternion(1, 0, 0, 0)); AddCollisionGeometry(R, BOX, Vector(container_thickness, container_size.y, container_size.z), Vector(0, 0, 0), Quaternion(1, 0, 0, 0)); AddCollisionGeometry(F, BOX, Vector(container_size.x, container_size.y, container_thickness), Vector(0, 0, 0), Quaternion(1, 0, 0, 0)); AddCollisionGeometry(B, BOX, Vector(container_size.x, container_size.y, container_thickness), Vector(0, 0, 0), Quaternion(1, 0, 0, 0)); AddCollisionGeometry(Bottom, BOX, Vector(container_size.x, container_thickness, container_size.z), Vector(0, 0, 0), Quaternion(1, 0, 0, 0)); //AddCollisionGeometry(Top, BOX, Vector(container_size.x, container_thickness, container_size.z), Vector(0, 0, 0), Quaternion(1, 0, 0, 0)); //AddCollisionGeometry(Float, BOX, Vector(1, 1, 1), Vector(0, 0, 0), Quaternion(1, 0, 0, 0)); FinalizeObject(L, (ChSystemParallel *) system_gpu); FinalizeObject(R, (ChSystemParallel *) system_gpu); FinalizeObject(F, (ChSystemParallel *) system_gpu); FinalizeObject(B, (ChSystemParallel *) system_gpu); FinalizeObject(Bottom, (ChSystemParallel *) system_gpu); //FinalizeObject(Float, (ChSystemParallel *) system_gpu); Quaternion quat; quat.Q_from_AngAxis(90, Vector(0, 1, 0)); ChSharedPtr<ChMaterialSurface> material_spout; material_spout = ChSharedPtr<ChMaterialSurface>(new ChMaterialSurface); material_spout->SetFriction(0); //material->SetRollingFriction(.5); //material->SetSpinningFriction(.5); material_spout->SetCompliance(0); material_spout->SetCohesion(-1000); ChSharedBodyPtr Spout = ChSharedBodyPtr(new ChBody(new ChCollisionModelParallel)); InitObject(Spout, 100000, Vector(0, 0, 8), Quaternion(1, 0, 0, 0), material_spout, true, true, -20, -20); real width = 1; real thick = .1; real depth = 2; real height = .5; AddCollisionGeometry(Spout, BOX, Vector(width, thick, depth), Vector(0, height, 0), Quaternion(1, 0, 0, 0)); AddCollisionGeometry(Spout, BOX, Vector(width, thick, depth), Vector(0, -height, 0), Quaternion(1, 0, 0, 0)); AddCollisionGeometry(Spout, BOX, Vector(thick, height, depth), Vector(width, 0, 0), Quaternion(1, 0, 0, 0)); AddCollisionGeometry(Spout, BOX, Vector(thick, height, depth), Vector(-width, 0, 0), Quaternion(1, 0, 0, 0)); AddCollisionGeometry(Spout, BOX, Vector(width, height, thick), Vector(0, 0, depth), Quaternion(1, 0, 0, 0)); FinalizeObject(Spout, (ChSystemParallel *) system_gpu); real wheel_rad = 3; real paddle_len = .5; real thickness = .05; real wheel_width = 1; Wheel = ChSharedBodyPtr(new ChBody(new ChCollisionModelParallel)); InitObject(Wheel, 100, Vector(0, -6, 4), Quaternion(1, 0, 0, 0), material, true, false, -20, -20); AddCollisionGeometry(Wheel, CYLINDER, Vector(wheel_rad, wheel_width, wheel_rad), Vector(0, 0, 0), chrono::Q_from_AngAxis(CH_C_PI / 2, VECT_Z)); AddCollisionGeometry(Wheel, CYLINDER, Vector(wheel_rad + paddle_len * 2, thickness, wheel_rad + paddle_len * 2), Vector(-wheel_width, 0, 0), chrono::Q_from_AngAxis(CH_C_PI / 2, VECT_Z)); AddCollisionGeometry(Wheel, CYLINDER, Vector(wheel_rad + paddle_len * 2, thickness, wheel_rad + paddle_len * 2), Vector(wheel_width, 0, 0), chrono::Q_from_AngAxis(CH_C_PI / 2, VECT_Z)); for (int i = 0; i < 360; i += 30) { real angle = i * PI / 180.0; real x = cos(angle) * (wheel_rad + paddle_len); real z = sin(angle) * (wheel_rad + paddle_len); Quaternion q; q.Q_from_AngAxis(-angle, Vector(1, 0, 0)); AddCollisionGeometry(Wheel, BOX, Vector(wheel_width, thickness, paddle_len), Vector(0, z, x), q); } FinalizeObject(Wheel, (ChSystemParallel *) system_gpu); ChSharedPtr<ChLinkLockRevolute> my_link1(new ChLinkLockRevolute); my_link1->Initialize(Bottom, Wheel, ChCoordsys<>(Vector(0, -6, 4), chrono::Q_from_AngAxis(CH_C_PI / 2, VECT_Y))); system_gpu->AddLink(my_link1); water_generator = new ParticleGenerator<ChSystemParallel>((ChSystemParallel *) system_gpu); water_generator->SetDensity(1000); water_generator->SetRadius(R3(particle_radius, particle_radius, particle_radius)); water_generator->material->SetFriction(particle_friction); water_generator->material->SetCohesion(cohesion_water); water_generator->material->SetRollingFriction(0); water_generator->material->SetSpinningFriction(0); water_generator->material->SetCompliance(0); water_generator->AddMixtureType(MIX_SPHERE); //========================================================================================================= ////Rendering specific stuff: // ChOpenGLManager * window_manager = new ChOpenGLManager(); // ChOpenGL openGLView(window_manager, system_gpu, 800, 600, 0, 0, "Test_Solvers"); // //openGLView.render_camera->camera_position = glm::vec3(0, -5, -10); // //openGLView.render_camera->camera_look_at = glm::vec3(0, -5, 0); // //openGLView.render_camera->camera_scale = .4; // openGLView.SetCustomCallback(RunTimeStep); // openGLView.StartSpinning(window_manager); // window_manager->CallGlutMainLoop(); //========================================================================================================= int file = 0; for (int i = 0; i < num_steps; i++) { system_gpu->DoStepDynamics(timestep); double TIME = system_gpu->GetChTime(); double STEP = system_gpu->GetTimerStep(); double BROD = system_gpu->GetTimerCollisionBroad(); double NARR = system_gpu->GetTimerCollisionNarrow(); double LCP = system_gpu->GetTimerLcp(); double UPDT = system_gpu->GetTimerUpdate(); double RESID = ((ChLcpSolverParallelDVI *) (system_gpu->GetLcpSolverSpeed()))->GetResidual(); int BODS = system_gpu->GetNbodies(); int CNTC = system_gpu->GetNcontacts(); int REQ_ITS = ((ChLcpSolverParallelDVI*) (system_gpu->GetLcpSolverSpeed()))->GetTotalIterations(); printf("%7.4f|%7.4f|%7.4f|%7.4f|%7.4f|%7.4f|%7d|%7d|%7d|%7.4f\n", TIME, STEP, BROD, NARR, LCP, UPDT, BODS, CNTC, REQ_ITS, RESID); int save_every = 1.0 / timestep / 60.0; //save data every n steps if (i % save_every == 0) { stringstream ss; cout << "Frame: " << file << endl; ss << data_folder << "/" << file << ".txt"; DumpAllObjectsWithGeometryPovray(system_gpu, ss.str()); file++; } RunTimeStep(system_gpu, i); } //DumpObjects(system_gpu, "diagonal_impact_settled.txt", "\t"); }
int main(int argc, char* argv[]) { int threads = 8; if (argc > 1) { threads = (atoi(argv[1])); } omp_set_num_threads(threads); //========================================================================================================= ChSystemParallelDVI * system_gpu = new ChSystemParallelDVI; system_gpu->SetIntegrationType(ChSystem::INT_ANITESCU); //========================================================================================================= system_gpu->SetParallelThreadNumber(threads); system_gpu->SetMaxiter(max_iter); system_gpu->SetIterLCPmaxItersSpeed(max_iter); ((ChLcpSolverParallelDVI*) (system_gpu->GetLcpSolverSpeed()))->SetMaxIterationNormal(10); ((ChLcpSolverParallelDVI*) (system_gpu->GetLcpSolverSpeed()))->SetMaxIterationSliding(10); ((ChLcpSolverParallelDVI*) (system_gpu->GetLcpSolverSpeed()))->SetMaxIterationSpinning(0); ((ChLcpSolverParallelDVI*) (system_gpu->GetLcpSolverSpeed()))->SetMaxIterationBilateral(10); system_gpu->SetTol(.0001); system_gpu->SetTolSpeeds(.0001); system_gpu->SetMaxPenetrationRecoverySpeed(100); ((ChLcpSolverParallelDVI *) (system_gpu->GetLcpSolverSpeed()))->SetTolerance(.0001); ((ChLcpSolverParallelDVI *) (system_gpu->GetLcpSolverSpeed()))->SetCompliance( 0); ((ChLcpSolverParallelDVI *) (system_gpu->GetLcpSolverSpeed()))->SetContactRecoverySpeed(1); ((ChLcpSolverParallelDVI *) (system_gpu->GetLcpSolverSpeed()))->SetSolverType(APGDRS); ((ChCollisionSystemParallel *) (system_gpu->GetCollisionSystem()))->SetCollisionEnvelope(particle_radius * .01); ((ChCollisionSystemParallel *) (system_gpu->GetCollisionSystem()))->setBinsPerAxis(I3(50, 50, 50)); ((ChCollisionSystemParallel *) (system_gpu->GetCollisionSystem()))->setBodyPerBin(100, 50); system_gpu->Set_G_acc(ChVector<>(0, gravity, 0)); system_gpu->SetStep(timestep); ((ChSystemParallel*) system_gpu)->SetAABB(R3(-6, -3, -12), R3(6, 6, 12)); //========================================================================================================= //cout << num_per_dir.x << " " << num_per_dir.y << " " << num_per_dir.z << " " << num_per_dir.x * num_per_dir.y * num_per_dir.z << endl; //addPerturbedLayer(R3(0, -5 +container_thickness-particle_radius.y, 0), ELLIPSOID, particle_radius, num_per_dir, R3(.01, .01, .01), 10, 1, system_gpu); //addHCPCube(num_per_dir.x, num_per_dir.y, num_per_dir.z, 1, particle_radius.x, 1, true, 0, -6 +container_thickness+particle_radius.y, 0, 0, system_gpu); //========================================================================================================= ChSharedBodyPtr L = ChSharedBodyPtr(new ChBody(new ChCollisionModelParallel)); ChSharedBodyPtr R = ChSharedBodyPtr(new ChBody(new ChCollisionModelParallel)); ChSharedBodyPtr F = ChSharedBodyPtr(new ChBody(new ChCollisionModelParallel)); ChSharedBodyPtr B = ChSharedBodyPtr(new ChBody(new ChCollisionModelParallel)); ChSharedBodyPtr Bottom = ChSharedBodyPtr(new ChBody(new ChCollisionModelParallel)); ChSharedBodyPtr Top = ChSharedBodyPtr(new ChBody(new ChCollisionModelParallel)); ChSharedBodyPtr Tube = ChSharedBodyPtr(new ChBody(new ChCollisionModelParallel)); ChSharedPtr<ChMaterialSurface> material; material = ChSharedPtr<ChMaterialSurface>(new ChMaterialSurface); material->SetFriction(.1); material->SetRollingFriction(0); material->SetSpinningFriction(0); material->SetCompliance(0); material->SetCohesion(-100); Quaternion q; q.Q_from_AngX(-.1); InitObject(L, 100000, Vector(-container_size.x + container_thickness, container_height - container_thickness, 0), Quaternion(1, 0, 0, 0), material, true, true, -20, -20); InitObject(R, 100000, Vector(container_size.x - container_thickness, container_height - container_thickness, 0), Quaternion(1, 0, 0, 0), material, true, true, -20, -20); InitObject(F, 100000, Vector(0, container_height - container_thickness, -container_size.z + container_thickness), Quaternion(1, 0, 0, 0), material, true, true, -20, -20); InitObject(B, 100000, Vector(0, container_height - container_thickness, container_size.z - container_thickness), Quaternion(1, 0, 0, 0), material, true, true, -20, -20); InitObject(Bottom, 100000, Vector(0, container_height - container_size.y, 0), Quaternion(1, 0, 0, 0), material, true, true, -20, -20); InitObject(Top, 100000, Vector(0, container_height + container_size.y, 0), Quaternion(1, 0, 0, 0), material, true, true, -20, -20); ChSharedPtr<ChMaterialSurface> material_tube; material_tube = ChSharedPtr<ChMaterialSurface>(new ChMaterialSurface); material_tube->SetFriction(0); material_tube->SetRollingFriction(0); material_tube->SetSpinningFriction(0); material_tube->SetCompliance(0); material_tube->SetCohesion(-100); InitObject(Tube, 100000, Vector(0, 0, 0), Quaternion(1, 0, 0, 0), material_tube, true, true, -20, -20); AddCollisionGeometry(L, BOX, Vector(container_thickness, container_size.y, container_size.z), Vector(0, 0, 0), Quaternion(1, 0, 0, 0)); AddCollisionGeometry(R, BOX, Vector(container_thickness, container_size.y, container_size.z), Vector(0, 0, 0), Quaternion(1, 0, 0, 0)); AddCollisionGeometry(F, BOX, Vector(container_size.x, container_size.y, container_thickness), Vector(0, 0, 0), Quaternion(1, 0, 0, 0)); AddCollisionGeometry(B, BOX, Vector(container_size.x, container_size.y, container_thickness), Vector(0, 0, 0), Quaternion(1, 0, 0, 0)); AddCollisionGeometry(Bottom, BOX, Vector(container_size.x, container_thickness, container_size.z), Vector(0, 0, 0), Quaternion(1, 0, 0, 0)); AddCollisionGeometry(Top, BOX, Vector(container_size.x, container_thickness, container_size.z), Vector(0, 0, 0), Quaternion(1, 0, 0, 0)); real tube_size = .03; AddCollisionGeometry(Tube, BOX, Vector(tube_size * 5, container_thickness / 6.0, tube_size), Vector(0, tube_size, 0), Quaternion(1, 0, 0, 0)); AddCollisionGeometry(Tube, BOX, Vector(tube_size * 5, container_thickness / 6.0, tube_size), Vector(0, -tube_size, 0), Quaternion(1, 0, 0, 0)); AddCollisionGeometry(Tube, BOX, Vector(tube_size * 5, tube_size, container_thickness / 6.0), Vector(0, 0, -tube_size), Quaternion(1, 0, 0, 0)); AddCollisionGeometry(Tube, BOX, Vector(tube_size * 5, tube_size, container_thickness / 6.0), Vector(0, 0, tube_size), Quaternion(1, 0, 0, 0)); FinalizeObject(L, (ChSystemParallel *) system_gpu); FinalizeObject(R, (ChSystemParallel *) system_gpu); FinalizeObject(F, (ChSystemParallel *) system_gpu); FinalizeObject(B, (ChSystemParallel *) system_gpu); FinalizeObject(Bottom, (ChSystemParallel *) system_gpu); //FinalizeObject(Top, (ChSystemParallel *) system_gpu); //FinalizeObject(Tube, (ChSystemParallel *) system_gpu); material_fiber = ChSharedPtr<ChMaterialSurface>(new ChMaterialSurface); material_fiber->SetFriction(.4); material_fiber->SetRollingFriction(.8); material_fiber->SetSpinningFriction(.8); material_fiber->SetCompliance(0); material_fiber->SetCohesion(0); layer_gen = new ParticleGenerator<ChSystemParallel>((ChSystemParallel *) system_gpu); layer_gen->SetDensity(1000); layer_gen->SetRadius(R3(particle_radius)); layer_gen->material->SetFriction(.1); layer_gen->material->SetCohesion(.1); layer_gen->material->SetSpinningFriction(0); layer_gen->material->SetRollingFriction(0); //layer_gen->SetCylinderRadius(4.5); //layer_gen->SetNormalDistribution(particle_radius, .002); layer_gen->AddMixtureType(MIX_SPHERE); //layer_gen->addPerturbedVolumeMixture(R3(0,-1,0), I3(80,40,80),R3(.1,.1,.1),R3(0,0,0),0); //========================================================================================================= //Rendering specific stuff: ChOpenGLManager * window_manager = new ChOpenGLManager(); ChOpenGL openGLView(window_manager, system_gpu, 800, 600, 0, 0, "Test_Solvers"); //openGLView.render_camera->camera_position = glm::vec3(0, -5, -10); //openGLView.render_camera->camera_look_at = glm::vec3(0, -5, 0); openGLView.render_camera->camera_scale = .1; openGLView.SetCustomCallback(RunTimeStep); openGLView.StartSpinning(window_manager); window_manager->CallGlutMainLoop(); //========================================================================================================= int file = 0; for (int i = 0; i < num_steps; i++) { system_gpu->DoStepDynamics(timestep); double TIME = system_gpu->GetChTime(); double STEP = system_gpu->GetTimerStep(); double BROD = system_gpu->GetTimerCollisionBroad(); double NARR = system_gpu->GetTimerCollisionNarrow(); double LCP = system_gpu->GetTimerLcp(); double UPDT = system_gpu->GetTimerUpdate(); double RESID = ((ChLcpSolverParallelDVI *) (system_gpu->GetLcpSolverSpeed()))->GetResidual(); int BODS = system_gpu->GetNbodies(); int CNTC = system_gpu->GetNcontacts(); int REQ_ITS = ((ChLcpSolverParallelDVI*) (system_gpu->GetLcpSolverSpeed()))->GetTotalIterations(); printf("%7.4f|%7.4f|%7.4f|%7.4f|%7.4f|%7.4f|%7d|%7d|%7d|%7.4f\n", TIME, STEP, BROD, NARR, LCP, UPDT, BODS, CNTC, REQ_ITS, RESID); int save_every = 1.0 / timestep / 60.0; //save data every n steps if (i % save_every == 0) { stringstream ss; cout << "Frame: " << file << endl; ss << "data/string/" << "/" << file << ".txt"; //DumpAllObjects(system_gpu, ss.str(), ",", true); DumpAllObjectsWithGeometryPovray(system_gpu, ss.str()); //output.ExportData(ss.str()); file++; } RunTimeStep(system_gpu, i); } //DumpObjects(system_gpu, "diagonal_impact_settled.txt", "\t"); }
int main(int argc, char* argv[]) { save = atoi(argv[1]); cout << save << endl; if (save) { seconds_to_simulate = 5; num_steps = seconds_to_simulate / timestep; } else { seconds_to_simulate = 300; num_steps = seconds_to_simulate / timestep; } if (argc > 2) { particle_slide_friction = atof(argv[2]); particle_roll_friction = atof(argv[3]); particle_cohesion = atof(argv[4]); data_folder = argv[5]; cout << particle_slide_friction << " " << particle_roll_friction << " " << particle_roll_friction << endl; } //========================================================================================================= ChSystemParallelDVI * system_gpu = new ChSystemParallelDVI; //========================================================================================================= //system_gpu->SetMinThreads(32); //system_gpu->SetMaxiter(max_iter); //system_gpu->SetIterLCPmaxItersSpeed(max_iter); ((ChSystemParallelDVI*) system_gpu)->DoThreadTuning(true); ((ChLcpSolverParallelDVI *) (system_gpu->GetLcpSolverSpeed()))->SetMaxIterationNormal(max_iter); ((ChLcpSolverParallelDVI *) (system_gpu->GetLcpSolverSpeed()))->SetMaxIterationSliding(max_iter); ((ChLcpSolverParallelDVI *) (system_gpu->GetLcpSolverSpeed()))->SetMaxIterationSpinning(max_iter); ((ChLcpSolverParallelDVI *) (system_gpu->GetLcpSolverSpeed()))->SetMaxIterationBilateral(0); system_gpu->SetTol(tolerance); system_gpu->SetTolSpeeds(tolerance); system_gpu->SetMaxPenetrationRecoverySpeed(1e9); ((ChLcpSolverParallelDVI *) (system_gpu->GetLcpSolverSpeed()))->SetTolerance(tolerance); ((ChLcpSolverParallelDVI *) (system_gpu->GetLcpSolverSpeed()))->SetCompliance(0); ((ChLcpSolverParallelDVI *) (system_gpu->GetLcpSolverSpeed()))->SetContactRecoverySpeed(100); ((ChLcpSolverParallelDVI *) (system_gpu->GetLcpSolverSpeed()))->SetSolverType(APGDRS); //((ChLcpSolverParallelDVI *) (system_gpu->GetLcpSolverSpeed()))->DoStabilization(true); ((ChCollisionSystemParallel *) (system_gpu->GetCollisionSystem()))->SetCollisionEnvelope(particle_radius * .05); ((ChCollisionSystemParallel *) (system_gpu->GetCollisionSystem()))->setBinsPerAxis(I3(30, 60, 30)); ((ChCollisionSystemParallel *) (system_gpu->GetCollisionSystem()))->setBodyPerBin(100, 50); system_gpu->Set_G_acc(ChVector<>(0, gravity, 0)); system_gpu->SetStep(timestep); ((ChSystemParallel*) system_gpu)->SetAABB(R3(-250, -600, -250), R3(250, 600, 250)); //========================================================================================================= ChSharedPtr<ChMaterialSurface> material; material = ChSharedPtr<ChMaterialSurface>(new ChMaterialSurface); material->SetFriction(container_friction); material->SetRollingFriction(container_friction); material->SetSpinningFriction(container_friction); material->SetCompliance(0); material->SetCohesion(-100); CONTAINER = ChSharedBodyPtr(new ChBody(new ChCollisionModelParallel)); InitObject(CONTAINER, 100000, Vector(0, 0, 0), Quaternion(1, 0, 0, 0), material, true, true, -20, -20); if (save) { AddCollisionGeometry( CONTAINER, BOX, Vector(container_thickness, container_size.y, container_size.z), Vector(-container_size.x + container_thickness, container_height - container_thickness, 0), Quaternion(1, 0, 0, 0)); AddCollisionGeometry( CONTAINER, BOX, Vector(container_thickness, container_size.y, container_size.z), Vector(container_size.x - container_thickness, container_height - container_thickness, 0), Quaternion(1, 0, 0, 0)); AddCollisionGeometry( CONTAINER, BOX, Vector(container_size.x, container_size.y, container_thickness), Vector(0, container_height - container_thickness, -container_size.z + container_thickness), Quaternion(1, 0, 0, 0)); AddCollisionGeometry( CONTAINER, BOX, Vector(container_size.x, container_size.y, container_thickness), Vector(0, container_height - container_thickness, container_size.z - container_thickness), Quaternion(1, 0, 0, 0)); AddCollisionGeometry( CONTAINER, BOX, Vector(container_size.x, container_thickness, container_size.z), Vector(0, container_height - container_size.y, 0), Quaternion(1, 0, 0, 0)); //AddCollisionGeometry(CONTAINER, BOX, Vector(container_size.x, container_thickness, container_size.z), Vector(0, container_height + container_size.y, 0), Quaternion(1, 0, 0, 0)); } CONTAINER->GetMaterialSurface()->SetCohesion(container_cohesion); FinalizeObject(CONTAINER, (ChSystemParallel *) system_gpu); if (save == false) { real anchor_length = 100; real anchor_r = 35 / 2.0; real anchor_R = 150 / 4.0; real anchor_h = 50; real anchor_thickness = 6 / 2.0; real anchor_blade_width = 8; ChVector<> p1(0, 0, 0); ChVector<> p2(0, anchor_length, 0); real anchor_mass = 6208; real number_sections = 30; REFERENCE = ChSharedBodyPtr(new ChBody(new ChCollisionModelParallel)); InitObject(REFERENCE, anchor_mass, Vector(0, 200, 0), Quaternion(1, 0, 0, 0), material, false, false, -15, -15); // AddCollisionGeometry(REFERENCE, SPHERE, ChVector<>(anchor_r, 0, 0), p1, Quaternion(1, 0, 0, 0)); // AddCollisionGeometry(REFERENCE, CYLINDER, Vector(anchor_r, anchor_length, anchor_r), p2, Quaternion(1, 0, 0, 0)); // for (int i = 0; i < number_sections; i++) { // ChQuaternion<> quat, quat2; // quat.Q_from_AngAxis(i / number_sections * 2 * PI, ChVector<>(0, 1, 0)); // quat2.Q_from_AngAxis(6.5 * 2 * PI / 360.0, ChVector<>(0, 0, 1)); // quat = quat % quat2; // ChVector<> pos(sin(i / number_sections * 2 * PI) * anchor_R, i / number_sections * anchor_h, cos(i / number_sections * 2 * PI) * anchor_R); // //ChMatrix33<> mat(quat); // AddCollisionGeometry(REFERENCE, BOX, ChVector<>(anchor_blade_width, anchor_thickness, anchor_R), pos, quat); // } ANCHOR = ChSharedBodyPtr(new ChBody(new ChCollisionModelParallel)); InitObject(ANCHOR, anchor_mass, Vector(0, 200, 0), Quaternion(1, 0, 0, 0), material, true, false, -15, -15); AddCollisionGeometry(ANCHOR, SPHERE, ChVector<>(anchor_r, 0, 0), p1, Quaternion(1, 0, 0, 0)); AddCollisionGeometry(ANCHOR, CYLINDER, Vector(anchor_r, anchor_length, anchor_r), p2, Quaternion(1, 0, 0, 0)); // for (int i = 0; i < number_sections; i++) { ChQuaternion<> quat, quat2; quat.Q_from_AngAxis(i / number_sections * 2 * PI, ChVector<>(0, 1, 0)); quat2.Q_from_AngAxis(6.5 * 2 * PI / 360.0, ChVector<>(0, 0, 1)); quat = quat % quat2; ChVector<> pos(sin(i / number_sections * 2 * PI) * anchor_R, i / number_sections * anchor_h, cos(i / number_sections * 2 * PI) * anchor_R); //ChMatrix33<> mat(quat); AddCollisionGeometry(ANCHOR, BOX, ChVector<>(anchor_blade_width, anchor_thickness, anchor_R), pos, quat); } FinalizeObject(ANCHOR, (ChSystemParallel *) system_gpu); FinalizeObject(REFERENCE, (ChSystemParallel *) system_gpu); // real vol = ((ChCollisionModelParallel *) ANCHOR->GetCollisionModel())->getVolume(); // real den = .00785; // anchor_mass = den*vol; // cout<<vol<<" "<<anchor_mass<<endl; // ANCHOR->SetMass(anchor_mass); ANCHOR->SetInertiaXX(ChVector<>(12668786.72, 5637598.31, 12682519.69)); REFERENCE->SetInertiaXX(ChVector<>(12668786.72, 5637598.31, 12682519.69)); // ANCHOR->SetInertiaXX( // ChVector<>( // 1 / 12.0 * anchor_mass * (1 * 1 + anchor_R * anchor_R), // 1 / 12.0 * anchor_mass * (anchor_R * anchor_R + anchor_R * anchor_R), // 1 / 12.0 * anchor_mass * (anchor_R * anchor_R + 1 * 1))); //BLOCK = ChSharedBodyPtr(new ChBody(new ChCollisionModelParallel)); //InitObject(BLOCK, anchor_mass/2, Vector(0, 300, 0), Quaternion(1, 0, 0, 0), material, false, false, -20, -20); //AddCollisionGeometry(BLOCK, BOX, ChVector<>(1, 1, 1), Vector(0, 0, 0), Quaternion(1, 0, 0, 0)); //FinalizeObject(BLOCK, (ChSystemParallel *) system_gpu); //actuator_anchor = ChSharedPtr<ChLinkLockLock>(new ChLinkLockLock()); //actuator_anchor->Initialize(CONTAINER, BLOCK, ChCoordsys<>(ChVector<>(0, 0, 0), QUNIT)); //system_gpu->AddLink(actuator_anchor); // apply motion //motionFunc1 = new ChFunction_Ramp(0, -anchor_vel); //actuator_anchor->SetMotion_Y(motionFunc1); //actuator_anchor->SetMotion_axis(ChVector<>(0, 1, 0)); engine_anchor = ChSharedPtr<ChLinkEngine>(new ChLinkEngine); engine_anchor->Initialize(CONTAINER, ANCHOR, ChCoordsys<>(ANCHOR->GetPos(), chrono::Q_from_AngAxis(CH_C_PI / 2, VECT_X))); engine_anchor->Set_shaft_mode(ChLinkEngine::ENG_SHAFT_PRISM); // also works as revolute support engine_anchor->Set_eng_mode(ChLinkEngine::ENG_MODE_SPEED); system_gpu->AddLink(engine_anchor); reference_engine = ChSharedPtr<ChLinkEngine>(new ChLinkEngine); reference_engine->Initialize(CONTAINER, REFERENCE, ChCoordsys<>(REFERENCE->GetPos(), chrono::Q_from_AngAxis(CH_C_PI / 2, VECT_X))); reference_engine->Set_shaft_mode(ChLinkEngine::ENG_SHAFT_PRISM); // also works as revolute support reference_engine->Set_eng_mode(ChLinkEngine::ENG_MODE_SPEED); system_gpu->AddLink(reference_engine); if (ChFunction_Const* mfun = dynamic_cast<ChFunction_Const*>(engine_anchor->Get_spe_funct())) { mfun->Set_yconst(anchor_rot * 1 / 60.0 * 2 * CH_C_PI); // rad/s angular speed } if (ChFunction_Const* mfun = dynamic_cast<ChFunction_Const*>(reference_engine->Get_spe_funct())) { mfun->Set_yconst(anchor_rot * 1 / 60.0 * 2 * CH_C_PI); // rad/s angular speed } ReadAllObjectsWithGeometryChrono(system_gpu, "data/anchor/anchor.dat"); ChSharedPtr<ChMaterialSurface> material_read; material_read = ChSharedPtr<ChMaterialSurface>(new ChMaterialSurface); material_read->SetFriction(particle_slide_friction); material_read->SetRollingFriction(particle_roll_friction); material_read->SetSpinningFriction(particle_roll_friction); material_read->SetCompliance(0); material_read->SetCohesion(particle_cohesion * timestep); for (int i = 0; i < system_gpu->Get_bodylist()->size(); i++) { system_gpu->Get_bodylist()->at(i)->SetMaterialSurface(material_read); } } else { layer_gen = new ParticleGenerator<ChSystemParallelDVI>((ChSystemParallelDVI *) system_gpu); layer_gen->SetDensity(particle_density); layer_gen->SetRadius(R3(particle_radius, particle_radius * .5, particle_radius)); layer_gen->SetNormalDistribution(particle_radius, particle_std_dev, 1); layer_gen->material->SetFriction(particle_slide_friction); layer_gen->material->SetCohesion(particle_cohesion); layer_gen->material->SetRollingFriction(0); layer_gen->material->SetSpinningFriction(0); layer_gen->AddMixtureType(MIX_SPHERE); } //layer_gen->AddMixtureType(MIX_ELLIPSOID); //layer_gen->AddMixtureType(MIX_DOUBLESPHERE); //layer_gen->addPerturbedVolumeMixture(R3(0, 0, 0), I3(64, 1, 64), R3(0, 0, 0), R3(0, 0, 0)); //========================================================================================================= //Rendering specific stuff: // ChOpenGLManager * window_manager = new ChOpenGLManager(); // ChOpenGL openGLView(window_manager, system_gpu, 800, 600, 0, 0, "Test_Solvers"); // openGLView.render_camera->camera_position = glm::vec3(0, -5, -10); // openGLView.render_camera->camera_look_at = glm::vec3(0, 0, 0); // openGLView.render_camera->camera_scale = 2; // openGLView.SetCustomCallback(RunTimeStep); // openGLView.StartSpinning(window_manager); // window_manager->CallGlutMainLoop(); //========================================================================================================= int file = 0; ofstream reactionfile; if (save == false) { stringstream ss; ss << data_folder << "reactions.txt"; reactionfile.open(ss.str()); } for (int i = 0; i < num_steps; i++) { system_gpu->DoStepDynamics(timestep); double TIME = system_gpu->GetChTime(); double STEP = system_gpu->GetTimerStep(); double BROD = system_gpu->GetTimerCollisionBroad(); double NARR = system_gpu->GetTimerCollisionNarrow(); double LCP = system_gpu->GetTimerLcp(); double SHUR = ((ChLcpSolverParallelDVI*) (system_gpu->GetLcpSolverSpeed()))->solver.time_shurcompliment; double UPDT = system_gpu->GetTimerUpdate(); double RESID = ((ChLcpSolverParallelDVI *) (system_gpu->GetLcpSolverSpeed()))->GetResidual(); int BODS = system_gpu->GetNbodies(); int CNTC = system_gpu->GetNcontacts(); int REQ_ITS = ((ChLcpSolverParallelDVI*) (system_gpu->GetLcpSolverSpeed()))->GetTotalIterations(); printf("%7.4f|%7.4f|%7.4f|%7.4f|%7.4f|%7.4f|%7.4f|%7d|%7d|%7d|%7.4f\n", TIME, STEP, BROD, NARR, LCP, SHUR, UPDT, BODS, CNTC, REQ_ITS, RESID); system_gpu->gpu_data_manager->system_timer.PrintReport(); int save_every = 1.0 / timestep / 60.0; //save data every n steps if (i % save_every == 0) { stringstream ss; cout << "Frame: " << file << endl; ss << data_folder << "/" << file << ".txt"; if (save) { DumpAllObjectsWithGeometryChrono(system_gpu, "data/anchor/anchor.dat"); } else { DumpAllObjectsWithGeometryPovray(system_gpu, ss.str()); } file++; } if (save == false) { Vector force = engine_anchor->Get_react_force(); Vector torque = engine_anchor->Get_react_torque(); double motor_torque = engine_anchor->Get_mot_torque(); reactionfile << force.x << " " << force.y << " " << force.z << " " << torque.x << " " << torque.y << " " << torque.z << " " << motor_torque << " " << ANCHOR->GetPos().y << " " << ANCHOR->GetPos_dt().y << endl; } RunTimeStep(system_gpu, i); } if (save == false) { reactionfile.close(); } }
int main(int argc, char* argv[]) { if (argc == 2) { omp_set_num_threads(atoi(argv[1])); } else { omp_set_num_threads(1); } //========================================================================================================= ChSystemGPU * system_gpu = new ChSystemGPU; ChCollisionSystemGPU *mcollisionengine = new ChCollisionSystemGPU(); system_gpu->SetIntegrationType(ChSystem::INT_ANITESCU); //========================================================================================================= system_gpu->SetMaxiter(max_iter); system_gpu->SetIterLCPmaxItersSpeed(max_iter); ((ChLcpSolverGPU *) (system_gpu->GetLcpSolverSpeed()))->SetMaxIteration(max_iter); system_gpu->SetTol(1e-3); system_gpu->SetTolSpeeds(1e-3); ((ChLcpSolverGPU *) (system_gpu->GetLcpSolverSpeed()))->SetTolerance(1e-3); ((ChLcpSolverGPU *) (system_gpu->GetLcpSolverSpeed()))->SetCompliance(0, 0, 0); ((ChLcpSolverGPU *) (system_gpu->GetLcpSolverSpeed()))->SetContactRecoverySpeed(.6); ((ChLcpSolverGPU *) (system_gpu->GetLcpSolverSpeed()))->SetSolverType(ACCELERATED_PROJECTED_GRADIENT_DESCENT); ((ChCollisionSystemGPU *) (system_gpu->GetCollisionSystem()))->SetCollisionEnvelope(particle_radius.x * .05); mcollisionengine->setBinsPerAxis(R3(num_per_dir.x * 2, num_per_dir.y * 2, num_per_dir.z * 2)); mcollisionengine->setBodyPerBin(100, 50); system_gpu->Set_G_acc(ChVector<>(0, gravity, 0)); system_gpu->SetStep(timestep); //========================================================================================================= cout << num_per_dir.x << " " << num_per_dir.y << " " << num_per_dir.z << " " << num_per_dir.x * num_per_dir.y * num_per_dir.z << endl; if (particle_radius.x == particle_radius.y == particle_radius.z) { addPerturbedLayer(R3(0, -5 + particle_radius.y + container_thickness, 0), SPHERE, particle_radius, num_per_dir, R3(.01, .01, .01), 4, .1, system_gpu); } else { addPerturbedLayer(R3(0, -5 + particle_radius.y + container_thickness, 0), ELLIPSOID, particle_radius, num_per_dir, R3(.01, .01, .01), 4, .1, system_gpu); } //========================================================================================================= ChSharedBodyPtr L = ChSharedBodyPtr(new ChBody(new ChCollisionModelParallel)); ChSharedBodyPtr R = ChSharedBodyPtr(new ChBody(new ChCollisionModelParallel)); ChSharedBodyPtr F = ChSharedBodyPtr(new ChBody(new ChCollisionModelParallel)); ChSharedBodyPtr B = ChSharedBodyPtr(new ChBody(new ChCollisionModelParallel)); ChSharedBodyPtr Bottom = ChSharedBodyPtr(new ChBody(new ChCollisionModelParallel)); InitObject(L, 100000, Vector(-container_size.x + container_thickness, container_height - container_thickness, 0), Quaternion(1, 0, 0, 0), container_friction, container_friction, 0, true, true, -20, -20); InitObject(R, 100000, Vector(container_size.x - container_thickness, container_height - container_thickness, 0), Quaternion(1, 0, 0, 0), container_friction, container_friction, 0, true, true, -20, -20); InitObject(F, 100000, Vector(0, container_height - container_thickness, -container_size.z + container_thickness), Quaternion(1, 0, 0, 0), container_friction, container_friction, 0, true, true, -20, -20); InitObject(B, 100000, Vector(0, container_height - container_thickness, container_size.z - container_thickness), Quaternion(1, 0, 0, 0), container_friction, container_friction, 0, true, true, -20, -20); InitObject(Bottom, 100000, Vector(0, container_height - container_size.y, 0), Quaternion(1, 0, 0, 0), container_friction, container_friction, 0, true, true, -20, -20); AddCollisionGeometry(L, BOX, Vector(container_thickness, container_size.y, container_size.z), Vector(0, 0, 0), Quaternion(1, 0, 0, 0)); AddCollisionGeometry(R, BOX, Vector(container_thickness, container_size.y, container_size.z), Vector(0, 0, 0), Quaternion(1, 0, 0, 0)); AddCollisionGeometry(F, BOX, Vector(container_size.x, container_size.y, container_thickness), Vector(0, 0, 0), Quaternion(1, 0, 0, 0)); AddCollisionGeometry(B, BOX, Vector(container_size.x, container_size.y, container_thickness), Vector(0, 0, 0), Quaternion(1, 0, 0, 0)); AddCollisionGeometry(Bottom, BOX, Vector(container_size.x, container_thickness, container_size.z), Vector(0, 0, 0), Quaternion(1, 0, 0, 0)); FinalizeObject(L, (ChSystemGPU *) system_gpu); FinalizeObject(R, (ChSystemGPU *) system_gpu); FinalizeObject(F, (ChSystemGPU *) system_gpu); FinalizeObject(B, (ChSystemGPU *) system_gpu); FinalizeObject(Bottom, (ChSystemGPU *) system_gpu); //========================================================================================================= //////Rendering specific stuff: ChOpenGLManager * window_manager = new ChOpenGLManager(); ChOpenGL openGLView(window_manager, system_gpu, 800, 600, 0, 0, "Test_Solvers"); openGLView.render_camera->camera_position = glm::vec3(0, -5, -10); openGLView.render_camera->camera_look_at = glm::vec3(0, -5, 0); openGLView.render_camera->camera_scale = .1; openGLView.SetCustomCallback(RunTimeStep); openGLView.StartSpinning(window_manager); window_manager->CallGlutMainLoop(); //========================================================================================================= for (int i = 0; i < num_steps; i++) { system_gpu->DoStepDynamics(timestep); double TIME = system_gpu->GetChTime(); double STEP = system_gpu->GetTimerStep(); double BROD = system_gpu->GetTimerCollisionBroad(); double NARR = system_gpu->GetTimerCollisionNarrow(); double LCP = system_gpu->GetTimerLcp(); double UPDT = system_gpu->GetTimerUpdate(); int BODS = system_gpu->GetNbodies(); int CNTC = system_gpu->GetNcontacts(); int REQ_ITS = ((ChLcpSolverGPU*) (system_gpu->GetLcpSolverSpeed()))->GetTotalIterations(); printf("%7.4f|%7.4f|%7.4f|%7.4f|%7.4f|%7.4f|%7d|%7d|%7d\n", TIME, STEP, BROD, NARR, LCP, UPDT, BODS, CNTC, REQ_ITS); if (i % 1000 == 0) { cout << "SAVED STATE" << endl; DumpObjects(system_gpu, "diagonal_impact_settled.txt", "\t"); } RunTimeStep(system_gpu, i); } DumpObjects(system_gpu, "diagonal_impact_settled.txt", "\t"); }
int main(int argc, char* argv[]) { bool visualize = true; int threads = 8; int config = 0; real gravity = -9.81; //acceleration due to gravity real timestep = .01; //step size real time_to_run = 1; //length of simulation real current_time = 0; int num_steps = time_to_run / timestep; int max_iteration = 15; int tolerance = 0; //========================================================================================================= // Create system //========================================================================================================= ChSystemParallel * system_gpu = new ChSystemParallel; //========================================================================================================= // Populate the system with bodies/constraints/forces/etc. //========================================================================================================= ChVector<> lpos(0, 0, 0); ChQuaternion<> quat(1, 0, 0, 0); real container_width = 5; //width of area with particles real container_length = 25; //length of area that roller will go over real container_thickness = .25; //thickness of container walls real container_height = 2; //height of the outer walls real particle_radius = .58; // Create a material (will be used by both objects) ChSharedPtr<ChMaterialSurface> material; material = ChSharedPtr<ChMaterialSurface>(new ChMaterialSurface); material->SetFriction(0.4); // Create a ball ChSharedBodyPtr ball = ChSharedBodyPtr(new ChBody(new ChCollisionModelParallel)); InitObject(ball, 1, // mass ChVector<>(0, 10, 0), // position ChQuaternion<>(1, 0, 0, 0), // rotation material, // material true, // collide? false, // static? -15, -15); // collision family ball->SetPos_dt(ChVector<>(0,0,10)); AddCollisionGeometry(ball, SPHERE, particle_radius, lpos, quat); FinalizeObject(ball, (ChSystemParallel *) system_gpu); // Create a bin for the ball to fall into ChSharedBodyPtr bin = ChSharedBodyPtr(new ChBody(new ChCollisionModelParallel)); InitObject(bin, 1, // mass ChVector<>(0, 0, 0), // position ChQuaternion<>(1, 0, 0, 0), // rotation material, // material true, // collide? true, // static? -20, -20); // collision family AddCollisionGeometry(bin, BOX, ChVector<>(container_width, container_thickness, container_length), lpos, quat); AddCollisionGeometry(bin, BOX, Vector(container_thickness, container_height, container_length), Vector(-container_width + container_thickness, container_height, 0), quat); AddCollisionGeometry(bin, BOX, Vector(container_thickness, container_height, container_length), Vector(container_width - container_thickness, container_height, 0), quat); AddCollisionGeometry(bin, BOX, Vector(container_width, container_height, container_thickness), Vector(0, container_height, -container_length + container_thickness), quat); AddCollisionGeometry(bin, BOX, Vector(container_width, container_height, container_thickness), Vector(0, container_height, container_length - container_thickness), quat); FinalizeObject(bin, (ChSystemParallel *) system_gpu); //========================================================================================================= // Edit system settings //========================================================================================================= system_gpu->SetIntegrationType(ChSystem::INT_ANITESCU); system_gpu->SetParallelThreadNumber(threads); system_gpu->SetMaxiter(max_iteration); system_gpu->SetIterLCPmaxItersSpeed(max_iteration); system_gpu->SetTol(1e-3); system_gpu->SetTolSpeeds(1e-3); system_gpu->Set_G_acc(ChVector<>(0, gravity, 0)); system_gpu->SetStep(timestep); ((ChLcpSolverParallel *) (system_gpu->GetLcpSolverSpeed()))->SetMaxIteration(max_iteration); ((ChLcpSolverParallel *) (system_gpu->GetLcpSolverSpeed()))->SetTolerance(0); ((ChLcpSolverParallel *) (system_gpu->GetLcpSolverSpeed()))->SetCompliance(0, 0, 0); ((ChLcpSolverParallel *) (system_gpu->GetLcpSolverSpeed()))->SetContactRecoverySpeed(300); ((ChLcpSolverParallel *) (system_gpu->GetLcpSolverSpeed()))->SetSolverType(ACCELERATED_PROJECTED_GRADIENT_DESCENT); ((ChCollisionSystemParallel *) (system_gpu->GetCollisionSystem()))->SetCollisionEnvelope(particle_radius * .05); ((ChCollisionSystemParallel *) (system_gpu->GetCollisionSystem()))->setBinsPerAxis(R3(10, 10, 10)); ((ChCollisionSystemParallel *) (system_gpu->GetCollisionSystem()))->setBodyPerBin(100, 50); omp_set_num_threads(threads); //========================================================================================================= // Enter the time loop and render the simulation //========================================================================================================= if (visualize) { ChOpenGLManager * window_manager = new ChOpenGLManager(); ChOpenGL openGLView(window_manager, system_gpu, 800, 600, 0, 0, "Test_Solvers"); openGLView.render_camera->camera_pos = Vector(0, 5, -20); openGLView.render_camera->look_at = Vector(0, 0, 0); openGLView.SetCustomCallback(RunTimeStep); openGLView.StartSpinning(window_manager); window_manager->CallGlutMainLoop(); } return 0; }