Beispiel #1
0
void step_rk2_mp(struct grid *g, double dt, struct parList *pars)
{
    // The Midpoint RK2 Method.

    copy_to_rk(g);
    substep(g, 0.5, 0.5, 0.5*dt, pars);
    g->t += 0.5*dt;

    update_cons(g, 0.0, 1.0);
    substep(g, 0.0, 1.0, dt, pars);
    g->t += 0.5*dt;
}
Beispiel #2
0
void step_rk2_tvd(struct grid *g, double dt, struct parList *pars)
{
    // The TVD RK2 Method by Gottlied & Shu

    double RK;

    RK = 1.0;
    copy_to_rk(g);
    substep(g, RK, 1.0-RK, RK*dt, pars);

    RK = 0.5;
    update_cons(g, RK, 1.0-RK);
    substep(g, RK, 1.0-RK, RK*dt, pars);
    g->t += dt;
}
Beispiel #3
0
void MultiThreadStepper::substepDone(StepperTask* ownerTask)
{
	mScene->fetchResults(true);

	PxReal delta = (PxReal)mTimer.getElapsedSeconds();
	mSimulationTime += delta;

	mSample->onSubstep(mSubStepSize);

	if(mCurrentSubStep>=mNbSubSteps)
	{
		mSync->set();
	}
	else
	{
		StepperTask &s = ownerTask == &mCompletion0 ? mCompletion1 : mCompletion0;
		s.setContinuation(*mScene->getTaskManager(), NULL);
		mCurrentSubStep++;

		mTimer.getElapsedSeconds();
		substep(s);

		// after the first substep, completions run freely
		s.removeReference();
	}
}
Beispiel #4
0
bool MultiThreadStepper::advance(PxScene* scene, PxReal dt, void* scratchBlock, PxU32 scratchBlockSize)
{
	mScratchBlock = scratchBlock;
	mScratchBlockSize = scratchBlockSize;

	if(!mSync)
		mSync = SAMPLE_NEW(PsSyncAlloc);

	substepStrategy(dt, mNbSubSteps, mSubStepSize);
	
	if(mNbSubSteps == 0) return false;

	mScene = scene;

	mSync->reset();

	mCurrentSubStep = 1;

	mCompletion0.setContinuation(*mScene->getTaskManager(), NULL);

	mSimulationTime = 0.0f;
	mTimer.getElapsedSeconds();

	// take first substep
	substep(mCompletion0);	
	mFirstCompletionPending = true;

	return true;
}
Beispiel #5
0
void step_rk3_tvd(struct grid *g, double dt, struct parList *pars)
{
    // The TVD RK3 Method by Shu & Osher

    double RK;

    RK = 1.0;
    copy_to_rk(g);
    substep(g, RK, 1.0-RK, RK*dt, pars);

    RK = 0.25;
    update_cons(g, RK, 1.0-RK);
    substep(g, RK, 1.0-RK, RK*dt, pars);

    RK = 2.0/3.0;
    update_cons(g, RK, 1.0-RK);
    substep(g, RK, 1.0-RK, RK*dt, pars);

    g->t += dt;
}
Beispiel #6
0
void step_fe(struct grid *g, double dt, struct parList *pars)
{
    substep(g, 1.0, 0.0, dt, pars);
    g->t += dt;
}