package org.openpixi.pixi.physics.grid;
import org.openpixi.pixi.parallel.particleaccess.ParticleAction;
import org.openpixi.pixi.parallel.particleaccess.ParticleIterator;
import org.openpixi.pixi.physics.particles.Particle;
import java.util.List;
/**
* Calls the specific interpolation algorithm.
* Implements the iteration over the particles using the ParticleIterator.
*/
public class LocalInterpolation extends Interpolation {
private ParticleIterator particleIterator;
private Grid grid;
private double timeStep;
private InterpolateToGrid interpolateToGrid = new InterpolateToGrid();
private InterpolateToParticle interpolateToParticle = new InterpolateToParticle();
private InterpolateChargedensity interpolateChargedensity = new InterpolateChargedensity();
public LocalInterpolation(
InterpolatorAlgorithm interpolator,
ParticleIterator particleIterator) {
super(interpolator);
this.particleIterator = particleIterator;
}
@Override
public void interpolateToGrid(List<Particle> particles, Grid grid, double timeStep) {
grid.resetCurrent();
this.grid = grid;
this.timeStep = timeStep;
particleIterator.execute(particles, interpolateToGrid);
}
@Override
public void interpolateToParticle(List<Particle> particles, Grid grid) {
this.grid = grid;
particleIterator.execute(particles, interpolateToParticle);
}
@Override
public void interpolateChargedensity(List<Particle> particles, Grid grid) {
grid.resetCharge();
this.grid = grid;
particleIterator.execute(particles, interpolateChargedensity);
}
private class InterpolateToGrid implements ParticleAction {
public void execute(Particle particle) {
interpolator.interpolateToGrid(particle, grid, timeStep);
}
}
private class InterpolateToParticle implements ParticleAction {
public void execute(Particle particle) {
interpolator.interpolateToParticle(particle, grid);
}
}
private class InterpolateChargedensity implements ParticleAction {
public void execute(Particle particle) {
interpolator.interpolateChargedensity(particle, grid);
}
}
}