예제 #1
0
int main(int argc, char* argv[]) {
	//omp_set_num_threads(8);

	//=========================================================================================================
	ChSystemParallelDVI * system_gpu = new ChSystemParallelDVI;
	system_gpu->SetIntegrationType(ChSystem::INT_ANITESCU);

	//=========================================================================================================
	//ReadInputFile("convergence_config.txt",system_gpu);
	//system_gpu->SetMaxiter(max_iter);
	//system_gpu->SetIterLCPmaxItersSpeed(max_iter);
	((ChLcpSolverParallelDVI *) (system_gpu->GetLcpSolverSpeed()))->SetMaxIterationNormal(15);
	((ChLcpSolverParallelDVI *) (system_gpu->GetLcpSolverSpeed()))->SetMaxIterationSliding(0);
	((ChLcpSolverParallelDVI *) (system_gpu->GetLcpSolverSpeed()))->SetMaxIterationSpinning(0);
	system_gpu->SetTol(tolerance);
	system_gpu->SetTolSpeeds(tolerance);
	((ChLcpSolverParallelDVI *) (system_gpu->GetLcpSolverSpeed()))->SetTolerance(tolerance);
	((ChLcpSolverParallelDVI *) (system_gpu->GetLcpSolverSpeed()))->SetCompliance( 0);
	((ChLcpSolverParallelDVI *) (system_gpu->GetLcpSolverSpeed()))->SetContactRecoverySpeed(1000);
	((ChLcpSolverParallelDVI *) (system_gpu->GetLcpSolverSpeed()))->SetSolverType(APGDRS);
	//((ChLcpSolverParallelDVI *) (system_gpu->GetLcpSolverSpeed()))->solver.SetAPGDParams(10, .9, 2.0);
	((ChLcpSolverParallelDVI *) (system_gpu->GetLcpSolverSpeed()))->DoStabilization(false);
	((ChLcpSolverParallelDVI *) (system_gpu->GetLcpSolverSpeed()))->DoCollision(false);
	((ChLcpSolverParallelDVI *) (system_gpu->GetLcpSolverSpeed()))->SetWarmStart(false);
	((ChCollisionSystemParallel *) (system_gpu->GetCollisionSystem()))->SetCollisionEnvelope(particle_radius * .01);
	((ChCollisionSystemParallel *) (system_gpu->GetCollisionSystem()))->setBinsPerAxis(I3(20, 20, 20));
	((ChCollisionSystemParallel *) (system_gpu->GetCollisionSystem()))->setBodyPerBin(100, 50);
	//=========================================================================================================
	system_gpu->Set_G_acc(ChVector<>(0, gravity, 0));
	system_gpu->SetStep(timestep);
	ReadAllObjectsWithGeometryChrono(system_gpu, "dump_sor_heavy_.4.txt");
	system_gpu->Get_bodylist()->at(5)->SetMass(100000);


/*
	//=========================================================================================================

	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 BTM = ChSharedBodyPtr(new ChBody(new ChCollisionModelParallel));
	BLOCK = ChSharedBodyPtr(new ChBody(new ChCollisionModelParallel));

	ChSharedPtr<ChMaterialSurface> material;
	material = ChSharedPtr<ChMaterialSurface>(new ChMaterialSurface);
	material->SetFriction(plate_friction);
	material->SetCompliance(0);

	InitObject(L, 100000, Vector(-container_width + container_thickness, plate_height, 0), quat, material, true, true, -20, -20);
	InitObject(R, 100000, Vector(container_width - container_thickness, plate_height, 0), quat, material, true, true, -20, -20);
	InitObject(F, 100000, Vector(0, plate_height, -container_width + container_thickness), quat, material, true, true, -20, -20);
	InitObject(B, 100000, Vector(0, plate_height, container_width - container_thickness), quat, material, true, true, -20, -20);
	InitObject(BTM, 100000, Vector(0, plate_height - container_height, 0), quat, material, true, true, -20, -20);
	InitObject(BLOCK, 10000, Vector(0, 5-.5, 0), quat, material, true, false, -1, -20);

	AddCollisionGeometry(L, BOX, Vector(container_thickness, container_height, container_width), lpos, quat);
	AddCollisionGeometry(R, BOX, Vector(container_thickness, container_height, container_width), lpos, quat);
	AddCollisionGeometry(F, BOX, Vector(container_width * wscale, container_height, container_thickness), lpos, quat);
	AddCollisionGeometry(B, BOX, Vector(container_width * wscale, container_height, container_thickness), lpos, quat);
	AddCollisionGeometry(BTM, BOX, Vector(container_width * wscale, container_thickness, container_width), lpos, quat);
	AddCollisionGeometry(BLOCK, BOX, Vector(container_width, container_thickness, container_width), lpos, quat);

	FinalizeObject(L, (ChSystemParallel *) system_gpu);
	FinalizeObject(R, (ChSystemParallel *) system_gpu);
	FinalizeObject(F, (ChSystemParallel *) system_gpu);
	FinalizeObject(B, (ChSystemParallel *) system_gpu);
	FinalizeObject(BTM, (ChSystemParallel *) system_gpu);
	FinalizeObject(BLOCK, (ChSystemParallel *) system_gpu);
	BLOCK->SetPos_dt(ChVector<>(0,-4,0));
	ParticleGenerator<ChSystemParallel> layer_gen(system_gpu);
	layer_gen.SetDensity(1000);
	layer_gen.SetRadius(R3(particle_radius));

	layer_gen.material->SetFriction(1);
	layer_gen.material->SetRollingFriction(0);
	layer_gen.material->SetSpinningFriction(0);
	layer_gen.material->SetCohesion(0);
	layer_gen.material->SetCompliance(1e-5);
	int3 num_per_dir = I3(2.0 / particle_radius, 4.0 / particle_radius, 2.0 / particle_radius);

	layer_gen.AddMixtureType(MIX_SPHERE);
	//layer_gen.AddMixtureType(MIX_ELLIPSOID);
	//layer_gen.AddMixtureType(MIX_CONE);
	//layer_gen.AddMixtureType(MIX_CUBE);
	//layer_gen.AddMixtureType(MIX_CYLINDER);

	//layer_gen.SetNormalDistribution(rad.x, rad.x/4.0);
	//layer_gen->UseNormalCohesion(particle_cohesion, 1);

	layer_gen.addPerturbedVolumeMixture(R3(0, -.8, 0), num_per_dir, R3(0.1, .1, 0.1), R3(0, -4, 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, -40);
	//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();
	//=========================================================================================================
	//timestep
	//iterations
	//warm start
	//mass
	ofstream ofile("convergence.txt");
	ChTimer<double> timer;
	timer.start();
	int file = 0;
	for (int i = 0; i < num_steps; i++) {

		cout << "step " << i << endl;
		system_gpu->DoStepDynamics(timestep);
		RunTimeStep(system_gpu, i);

		//if (i % save_every == 0) {
			ofile << ((ChLcpSolverParallelDVI *) (system_gpu->GetLcpSolverSpeed()))->GetResidual() << endl;
//			stringstream ss;
//			cout << "Frame: " << file << endl;
//			DumpObjects(system_gpu, ss.str());
//			//output.ExportData(ss.str());
//			file++;
		//}
		timer.stop();

	}
	//DumpAllObjectsWithGeometryChrono(system_gpu, "dump.txt");

	cout << "TIME: " << timer() << endl;
	ofile.close();

	return 0;
}
int main(int argc,
         char* argv[]) {
   omp_set_num_threads(8);
   ChSystemParallelDVI * system_gpu = new ChSystemParallelDVI;
   system_gpu->SetIntegrationType(ChSystem::INT_ANITESCU);

   std::stringstream ss;
   ss << "container_checkpoint_50_settled.txt";

   ChCollisionSystemBulletParallel * bullet_coll = new ChCollisionSystemBulletParallel();
   system_gpu->ChangeCollisionSystem(bullet_coll);
   system_gpu->SetStep(timestep);
   system_gpu->SetMaxPenetrationRecoverySpeed(10000);
   utils::ReadCheckpoint(system_gpu, ss.str());
   system_gpu->AssembleSystem();
   ChContactContainer* container = (ChContactContainer *) system_gpu->GetContactContainer();

   std::vector<ChLcpConstraint*>& mconstraints = system_gpu->GetLcpSystemDescriptor()->GetConstraintsList();
   std::vector<ChLcpVariables*>& mvariables = system_gpu->GetLcpSystemDescriptor()->GetVariablesList();
   size_t nOfVars = mvariables.size();
   size_t nOfConstraints = mconstraints.size();

   ChMatrixDynamic<> mb(nOfConstraints, 1);
   DynamicVector<double> rhs_vector;

//#########
   for (unsigned int ic = 0; ic < nOfConstraints; ic++) {
      mconstraints[ic]->Update_auxiliary();
   }

   // Average all g_i for the triplet of contact constraints n,u,v.
   //  Can be used for the fixed point phase and/or by preconditioner.
   int j_friction_comp = 0;
   double gi_values[3];
   for (unsigned int ic = 0; ic < nOfConstraints; ic++) {
      if (mconstraints[ic]->GetMode() == CONSTRAINT_FRIC) {
         gi_values[j_friction_comp] = mconstraints[ic]->Get_g_i();
         j_friction_comp++;
         if (j_friction_comp == 3) {
            double average_g_i = (gi_values[0] + gi_values[1] + gi_values[2]) / 3.0;
            mconstraints[ic - 2]->Set_g_i(average_g_i);
            mconstraints[ic - 1]->Set_g_i(average_g_i);
            mconstraints[ic - 0]->Set_g_i(average_g_i);
            j_friction_comp = 0;
         }
      }
   }

   for (unsigned int iv = 0; iv < nOfVars; iv++) {
      if (mvariables[iv]->IsActive()) {
         mvariables[iv]->Compute_invMb_v(mvariables[iv]->Get_qb(), mvariables[iv]->Get_fb());  // q = [M]'*fb
      }
   }
   ChMatrixDynamic<> mb_tmp(nOfConstraints, 1);
   int s_i = 0;
   for (unsigned int ic = 0; ic < nOfConstraints; ic++)
      if (mconstraints[ic]->IsActive()) {
         mb(s_i, 0) = -mconstraints[ic]->Compute_Cq_q();
         ++s_i;
      }
   system_gpu->GetLcpSystemDescriptor()->BuildBiVector(mb_tmp);   // b_i   =   -c   = phi/h
   mb.MatrDec(mb_tmp);
   ChLcpSystemDescriptor* sysd = system_gpu->GetLcpSystemDescriptor();

   ChTimer<double> timer;
   timer.start();

//#########
   double max_iterations = 212;
   double SIZE = nOfConstraints;
   double lastgoodres = 10e30;
   double theta_k = 1.0;
   double theta_k1 = theta_k;
   double beta_k1 = 0.0;
   double L_k = 0.0;
   double t_k = 0.0;

   ChMatrixDynamic<> ml(nOfConstraints, 1);
   ChMatrixDynamic<> ml_candidate(nOfConstraints, 1);
   ChMatrixDynamic<> mg(nOfConstraints, 1);
   ChMatrixDynamic<> mg_tmp(nOfConstraints, 1);
   ChMatrixDynamic<> my(nOfConstraints, 1);
   ChMatrixDynamic<> mx(nOfConstraints, 1);
   ChMatrixDynamic<> mg_tmp1(nOfConstraints, 1);
   ChMatrixDynamic<> mg_tmp2(nOfConstraints, 1);
   ChMatrixDynamic<> ms(nOfConstraints, 1);
   ml.FillElem(0);
   sysd->ConstraintsProject(ml);
   ml_candidate = ml;
   sysd->ShurComplementProduct(mg, &ml, 0);
   mg = mg - mb;

   mb_tmp.FillElem(-1.0);
   mb_tmp += ml;
   sysd->ShurComplementProduct(mg_tmp, &mb_tmp, 0);  // 1)  g = N*l ...        #### MATR.MULTIPLICATION!!!###
   if (mb_tmp.NormTwo() == 0) {
      L_k = 1;
   } else {
      L_k = mg_tmp.NormTwo() / mb_tmp.NormTwo();
   }
   t_k = 1.0 / L_k;

   double obj1 = 0;
   double obj2 = 0;

   my = ml;
   mx = ml;

   for (int iter = 0; iter < max_iterations; iter++) {
      sysd->ShurComplementProduct(mg_tmp1, &my, 0);
      mg = mg_tmp1 - mb;
      mx = mg * -t_k + my;
      sysd->ConstraintsProject(mx);
      sysd->ShurComplementProduct(mg_tmp, &mx, 0);
      mg_tmp2 = mg_tmp - mb;
      ms = mg_tmp * 0.5 - mb;
      obj1 = mx.MatrDot(&mx, &ms);
      ms = mg_tmp1 * 0.5 - mb;
      obj2 = my.MatrDot(&my, &ms);

      ms = mx - my;
      while (obj1 > obj2 + mg.MatrDot(&mg, &ms) + 0.5 * L_k * pow(ms.NormTwo(), 2.0)) {
         L_k = 2.0 * L_k;
         t_k = 1.0 / L_k;

         mx = mg * -t_k + my;
         sysd->ConstraintsProject(mx);
         sysd->ShurComplementProduct(mg_tmp, &mx, 0);
         mg_tmp2 = mg_tmp - mb;
         ms = mg_tmp * 0.5 - mb;
         obj1 = mx.MatrDot(&mx, &ms);
         ms = mx - my;
      }

      theta_k1 = (-pow(theta_k, 2) + theta_k * sqrt(pow(theta_k, 2) + 4)) / 2.0;
      beta_k1 = theta_k * (1.0 - theta_k) / (pow(theta_k, 2) + theta_k1);

      ms = (mx - ml);
      my = ms * beta_k1 + mx;

      if (mg.MatrDot(&mg, &ms) > 0) {
         my = mx;
         theta_k1 = 1.0;
      }

      L_k = 0.9 * L_k;
      t_k = 1.0 / L_k;

      ml = mx;
      theta_k = theta_k1;

      //========
      ChMatrixDynamic<> testres(nOfConstraints, 1);
      sysd->ShurComplementProduct(testres, &ml, 0);
      testres = testres - mb;

      double gdiff = .1;

      ChMatrixDynamic<> inside = ml - testres * gdiff;
      sysd->ConstraintsProject(inside);

      ChMatrixDynamic<> resid = (ml - inside) * (1.0 / nOfConstraints * gdiff);
      double g_proj_norm = resid.NormTwo();

      //========
      if (g_proj_norm < lastgoodres) {
         lastgoodres = g_proj_norm;
         ml_candidate = ml;
      }
      //========
      // f_p = 0.5*l_candidate'*N*l_candidate - l_candidate'*b  = l_candidate'*(0.5*Nl_candidate - b);
      sysd->ShurComplementProduct(mg_tmp, &ml_candidate, 0);    // 1)  g_tmp = N*l_candidate ...        #### MATR.MULTIPLICATION!!!###
      mg_tmp = mg_tmp * 0.5 - mb;                                   // 2)  g_tmp = 0.5*N*l_candidate                                    // 3)  g_tmp = 0.5*N*l_candidate-b_shur
      double m_objective = ml_candidate.MatrDot(&ml_candidate, &mg_tmp);     // 4)  mf_p  = l_candidate'*(0.5*N*l_candidate-b_shur)
      //========
      double maxdeltalambda = ms.NormInf();
      double maxd = lastgoodres;
      //cout << "  iter=" << iter << "   f=" << m_objective << "  |d|=" << maxd << "  |s|=" << maxdeltalambda << "\n";
   }
   ml = ml_candidate;
   timer.stop();
   std::cout << timer() <<  std::endl;

//#########
   std::cout << system_gpu->GetNbodies() << " " << container->GetNcontacts() <<  std::endl;

   return 0;

}