package org.openpixi.pixi.physics.movement;
import org.openpixi.pixi.parallel.particleaccess.ParticleAction;
import org.openpixi.pixi.parallel.particleaccess.ParticleIterator;
import org.openpixi.pixi.physics.force.Force;
import org.openpixi.pixi.physics.movement.boundary.ParticleBoundaries;
import org.openpixi.pixi.physics.movement.boundary.ParticleBoundaryType;
import org.openpixi.pixi.physics.particles.Particle;
import org.openpixi.pixi.physics.solver.Solver;
import java.util.List;
/**
* Moves and checks the boundary of the particle.
*/
public class ParticleMover {
/** Solver for the particle equations of motion. */
private Solver solver;
private ParticleBoundaries boundaries;
private ParticleIterator particleIterator;
/* These are set in each iteration to enable the inner classes to read them. */
private Force force;
private double timeStep;
private Push push = new Push();
private Prepare prepare = new Prepare();
private Complete complete = new Complete();
public ParticleBoundaryType getBoundaryType() {
return boundaries.getType();
}
public Solver getSolver() {
return solver;
}
public void setSolver(Solver psolver) {
this.solver = psolver;
}
public ParticleMover(
Solver solver,
ParticleBoundaries boundaries,
ParticleIterator particleIterator) {
this.solver = solver;
this.boundaries = boundaries;
this.particleIterator = particleIterator;
}
public void changeBoundaryType(ParticleBoundaryType type) {
boundaries.changeType(type);
}
public void push(List<Particle> particles, Force force, double timeStep) {
this.force = force;
this.timeStep = timeStep;
particleIterator.execute(particles, push);
}
public void prepare(List<Particle> particles, Force force, double timeStep) {
this.force = force;
this.timeStep = timeStep;
particleIterator.execute(particles, prepare);
}
public void complete(List<Particle> particles, Force force, double timeStep) {
this.force = force;
this.timeStep = timeStep;
particleIterator.execute(particles, complete);
}
private class Push implements ParticleAction {
public void execute(Particle particle) {
particle.storePosition();
solver.step(particle, force, timeStep);
boundaries.applyOnParticleCenter(solver, force, particle, timeStep);
}
}
private class Prepare implements ParticleAction {
public void execute(Particle particle) {
solver.prepare(particle, force, timeStep);
}
}
private class Complete implements ParticleAction {
public void execute(Particle particle) {
solver.complete(particle, force, timeStep);
}
}
}