package org.openpixi.pixi.physics.movement.boundary;
import org.openpixi.pixi.physics.force.Force;
import org.openpixi.pixi.physics.particles.Particle;
import org.openpixi.pixi.physics.solver.Solver;
public interface ParticleBoundaries {
void changeType(ParticleBoundaryType boundaryType);
/**
* Uses bounding box around the particle based on particle's radius to determine the region
* of the particle. In another words, it enables to reflect the particle based on particle's
* radius being outside of simulation area.
*
* This method is not safe and should be use only when really required!
*
* !!! IMPORTANT !!!
* - Can not be used in distributed simulation because crossing particles
* would be detected too early!
* - Can not be used in parallel simulation because the usage of common particle bounding box
* is not thread safe. On the other hand, to create a new bounding box (call constructor)
* for each particle would be thread safe but also slow.
*/
void applyOnParticleBoundingBox(Solver solver, Force force, Particle particle, double timeStep);
/**
* We need to pass the solver force and time step so that the hardwall boundary can call
* complete and prepare methods from solver.
* This solution is very ugly and cumbersome but if we want to have the periodic boundaries
* fast we have no other solution.
*/
void applyOnParticleCenter(Solver solver, Force force, Particle particle, double timeStep);
ParticleBoundaryType getType();
}