Beispiel #1
0
double Line::GetDistance(const Line& line, const Vector2D& point) {
    return std::sqrt(GetDistanceSquared(line, point));
}
Beispiel #2
0
double Line::GetDistanceSquared(const Vector2D& point) const {
    return GetDistanceSquared(*this, point);
}
Beispiel #3
0
int
main( int argc, char *argv[ ] )
{
#ifndef _OPENMP
	fprintf( stderr, "OpenMP is not available\n" );
	return 1;
#endif

	omp_set_num_threads( NUMT );
	int numProcessors = omp_get_num_procs( );
	fprintf( stderr, "Have %d processors.\n", numProcessors );


	for ( int i = 0; i < NUMBODIES; i++ )
	{
		Bodies[i].mass = EARTH_MASS  * Ranf( 0.5f, 10.f );
		Bodies[i].x = EARTH_DIAMETER * Ranf( -100.f, 100.f );
		Bodies[i].y = EARTH_DIAMETER * Ranf( -100.f, 100.f );
		Bodies[i].z = EARTH_DIAMETER * Ranf( -100.f, 100.f );
		Bodies[i].vx = Ranf( -100.f, 100.f );;
		Bodies[i].vy = Ranf( -100.f, 100.f );;
		Bodies[i].vz = Ranf( -100.f, 100.f );;
	};

	double time0 = omp_get_wtime( );

	for ( int t = 0; t < NUMSTEPS; t++ )
	{
		// #pragma omp parallel for schedule(dynamic)
		for ( int i = 0; i < NUMBODIES; i++ )
		{
			float fx = 0.;
			float fy = 0.;
			float fz = 0.;
			Body *bi = &Bodies[i];
			#pragma omp parallel for reduction(+:fx,fy,fz) schedule(dynamic)
			for ( int j = 0; j < NUMBODIES; j++ )
			{
				if ( j == i )	continue;

				Body *bj = &Bodies[j];

				float rsqd = GetDistanceSquared( bi, bj );
				if ( rsqd > 0. )
				{
					float f = G * bi->mass * bj->mass / rsqd;
					float ux, uy, uz;
					GetUnitVector( bi, bj,   &ux, &uy, &uz );
					fx += f * ux;
					fy += f * uy;
					fz += f * uz;
				}
			}

			float ax = fx / Bodies[i].mass;
			float ay = fy / Bodies[i].mass;
			float az = fz / Bodies[i].mass;

			Bodies[i].xnew = Bodies[i].x + Bodies[i].vx * TIMESTEP + 0.5 * ax * TIMESTEP * TIMESTEP;
			Bodies[i].ynew = Bodies[i].y + Bodies[i].vy * TIMESTEP + 0.5 * ay * TIMESTEP * TIMESTEP;
			Bodies[i].znew = Bodies[i].z + Bodies[i].vz * TIMESTEP + 0.5 * az * TIMESTEP * TIMESTEP;

			Bodies[i].vxnew = Bodies[i].vx + ax * TIMESTEP;
			Bodies[i].vynew = Bodies[i].vy + ay * TIMESTEP;
			Bodies[i].vznew = Bodies[i].vz + az * TIMESTEP;
		}

		// setup the state for the next animation step:

		for ( int i = 0; i < NUMBODIES; i++ )
		{
			Bodies[i].x = Bodies[i].xnew;
			Bodies[i].y = Bodies[i].ynew;
			Bodies[i].z = Bodies[i].znew;
			Bodies[i].vx = Bodies[i].vxnew;
			Bodies[i].vy = Bodies[i].vynew;
			Bodies[i].vz = Bodies[i].vznew;
		}


	}  // t

	double time1 = omp_get_wtime( );

	// print performance here:::
	double mbodies = (float)(NUMBODIES * NUMBODIES * NUMSTEPS) / (time1 - time0) / 1000000.;
	printf("Performance = %8.2lf MegaBodies/Sec\n", mbodies);
	printf("Time = %8.2lf MegaSecs\n", (time1 - time0) * 1000000.);
	return 0;
}
Beispiel #4
0
double Line::GetDistance(const Vector2D& point) const {
    return std::sqrt(GetDistanceSquared(*this, point));
}
Beispiel #5
0
double GetDistance(const Vector2D& p, const Vector2D& one, const Vector2D& two) {
    return std::sqrt(GetDistanceSquared(p, one, two));
}