Ejemplo n.º 1
0
void AddBoundary(T* mSystem, double L, double W, double H, double th, float mu1) {
	ChVector<> pos_p0(0, 0, 0);

	CHBODYSHAREDPTR BTM = CHBODYSHAREDPTR(new CHBODY);
	BTM->SetIdentifier(1);
	InitObject(BTM, 100, Vector(0, 0, 0), QUNIT, mu1, mu1, 0, true, true, -20, -20);
	AddCollisionGeometry(BTM, BOX, Vector(L / 2.0, th / 2.0, W / 2.0), VNULL, QUNIT);
	FinalizeObject(BTM, (CHSYS*) mSystem);

	CHBODYSHAREDPTR RIGHT = CHBODYSHAREDPTR(new CHBODY);
	RIGHT->SetIdentifier(2);
	InitObject(RIGHT, 100, Vector(L / 2.0, H / 2.0, 0), QUNIT, mu1, mu1, 0, true, true, -20, -20);
	AddCollisionGeometry(RIGHT, BOX, Vector(th / 2.0, H / 2.0, W / 2.0), VNULL, QUNIT);
	FinalizeObject(RIGHT, (CHSYS*) mSystem);

	CHBODYSHAREDPTR LEFT = CHBODYSHAREDPTR(new CHBODY);
	LEFT->SetIdentifier(3);
	InitObject(LEFT, 100, Vector(-L / 2.0, H / 2.0, 0), QUNIT, mu1, mu1, 0, true, true, -20, -20);
	AddCollisionGeometry(LEFT, BOX, Vector(th / 2.0, H / 2.0, W / 2.0), VNULL, QUNIT);
	FinalizeObject(LEFT, (CHSYS*) mSystem);

	CHBODYSHAREDPTR FRONT = CHBODYSHAREDPTR(new CHBODY);
	FRONT->SetIdentifier(4);
	InitObject(FRONT, 100, Vector(0.0, H / 2.0, W / 2.0), QUNIT, mu1, mu1, 0, true, true, -20, -20);
	AddCollisionGeometry(FRONT, BOX, Vector(L / 2.0, H / 2.0, th / 2.0), VNULL, QUNIT);
	FinalizeObject(FRONT, (CHSYS*) mSystem);

	CHBODYSHAREDPTR BACK = CHBODYSHAREDPTR(new CHBODY);
	BACK->SetIdentifier(5);
	InitObject(BACK, 100, Vector(0.0, H / 2.0, -W / 2.0), QUNIT, mu1, mu1, 0, true, true, -20, -20);
	AddCollisionGeometry(BACK, BOX, Vector(L / 2.0, H / 2.0, th / 2.0), VNULL, QUNIT);
	FinalizeObject(BACK, (CHSYS*) mSystem);
}
Ejemplo n.º 2
0
void AddSomeParticles(T* mSystem, double rad, double mass, double L, double W, double h, int n_x, int n_z, int n_curr_spheres, float mu2) {
	int id_offset = 300;

	double box_x = L - 5 * rad;
	double box_z = W - 5 * rad;
	double spacing_x = box_x / (n_x - 1);
	double spacing_z = box_z / (n_z - 1);
	double first_x = -box_x / 2;
	double first_z = -box_z / 2;
	int cid = 0;

	for (int ii = 0; ii < n_x; ii++) {
		for (int jj = 0; jj < n_z; jj++) {
			double perturb_x = CHrandom() * rad - rad / 2;
			double perturb_z = CHrandom() * rad - rad / 2;
			Vector particle_pos(first_x + ii * spacing_x + perturb_x, h, first_z + jj * spacing_z + perturb_z);

			CHBODYSHAREDPTR mybody = CHBODYSHAREDPTR(new CHBODY);
			mybody->GetCollisionModel()->SetDefaultSuggestedEnvelope(0.1 * rad);
			InitObject(mybody, mass, particle_pos, QUNIT, mu2, mu2, 0, true, false, 32, 64);
			AddCollisionGeometry(mybody, SPHERE, Vector(rad, rad, rad), VNULL, QUNIT);
			mybody->SetInertiaXX((2.0 / 5.0) * mass * pow(rad, 2) * ChVector<>(1, 1, 1));
			FinalizeObject(mybody, (CHSYS*) mSystem);

			cid++;
		}
	}
}
Ejemplo n.º 3
0
void AddBall(T* mSystem, double Px, double Py, double Pz, double Vy, double bRad, double bMass, float mu1) {
	CHBODYSHAREDPTR theBall = CHBODYSHAREDPTR(new CHBODY);
	theBall->SetIdentifier(-1);
	theBall->GetCollisionModel()->SetDefaultSuggestedEnvelope(0.1 * bRad);
	InitObject(theBall, bMass, Vector(Px, Py, Pz), QUNIT, mu1, mu1, 0, true, false, 8, 16);
	ChVector<> inertias((2.0 / 5.0) * bMass * bRad * bRad, (2.0 / 5.0) * bMass * bRad * bRad, (2.0 / 5.0) * bMass * bRad * bRad);
	theBall->SetInertiaXX(inertias);
	AddCollisionGeometry(theBall, SPHERE, Vector(bRad, bRad, bRad), VNULL, QUNIT);
	theBall->SetPos_dt(Vector(0.0, Vy, 0.0));
	FinalizeObject(theBall, (CHSYS*) mSystem);
}
Ejemplo n.º 4
0
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();
}
Ejemplo n.º 5
0
int add_particles_fromFile_V2(T* mSystem, int n_load, double body_radius, double particle_mass, float fric, std::string tfilename) {
	CHBODYSHAREDPTR mrigidBody;

	cout << tfilename;
	ChStreamInAsciiFile terrain_file(tfilename.c_str());
	int num_p = 0;
	printf("Loading particles...");
	int pid = 0;
	double xx = 0.0;
	double yy = 0.0;
	double zz = 0.0;
	double r1 = 0.0;
	double r2 = 0.0;
	double r3 = 0.0;
	double v1 = 0.0;
	double v2 = 0.0;
	double v3 = 0.0;
	while (num_p < n_load) {
		terrain_file >> pid;
		terrain_file >> xx;
		terrain_file >> yy;
		terrain_file >> zz;
		terrain_file >> r1;
		terrain_file >> r2;
		terrain_file >> r3;
		terrain_file >> v1;
		terrain_file >> v2;
		terrain_file >> v3;
		if (pid > 5) //
				{
			mrigidBody = CHBODYSHAREDPTR(new CHBODY);
			mrigidBody->SetIdentifier(num_p + 10);
			mrigidBody->GetCollisionModel()->SetDefaultSuggestedEnvelope(0.1 * body_radius);
			InitObject(mrigidBody, particle_mass, Vector(xx, yy, zz), QUNIT, fric, fric, 0, true, false, 32, 64);
			AddCollisionGeometry(mrigidBody, SPHERE, Vector(body_radius, body_radius, body_radius), VNULL, QUNIT);
			mrigidBody->SetInertiaXX((2.0 / 5.0) * particle_mass * pow(body_radius, 2) * ChVector<>(1, 1, 1));
			mrigidBody->SetPos_dt(Vector(v1, v2, v3));
			FinalizeObject(mrigidBody, (CHSYS*) mSystem);
			num_p++;
		}

		if (num_p % 4000 == 0)
			printf("loaded %i\n", num_p);
	}
	printf("Done loading %i particles\n", num_p);
	return num_p;
}