package org.openpixi.pixi.ui.util.yaml;
import java.util.List;
import org.openpixi.pixi.physics.GeneralBoundaryType;
import org.openpixi.pixi.physics.Settings;
import org.openpixi.pixi.physics.fields.EmptyPoissonSolver;
import org.openpixi.pixi.physics.fields.PoissonSolverFFTPeriodic;
import org.openpixi.pixi.physics.fields.SimpleSolver;
import org.openpixi.pixi.physics.grid.ChargeConservingCIC;
/**
* Generic settings class into which the YAML parser parses
*/
public class YamlSettings {
public Double timeStep;
public Double speedOfLight;
public Double gridStep;
public Double duration;
public Integer gridCellsX;
public Integer gridCellsY;
public String poissonsolver;
public List<YamlParticle> particles;
public List<YamlParticleStream> streams;
public YamlOutput output;
public void applyTo(Settings settings) {
// Default settings:
settings.setRelativistic(true);
settings.setBoundary(GeneralBoundaryType.Periodic);
settings.setGridSolver(new SimpleSolver());
settings.useGrid(true);
settings.setInterpolator(new ChargeConservingCIC());
// Custom settings:
if (timeStep != null) {
settings.setTimeStep(timeStep);
}
if (duration != null) {
settings.setTMax(duration);
}
if (speedOfLight != null) {
settings.setSpeedOfLight(speedOfLight);
}
if (gridStep != null) {
settings.setGridStep(gridStep);
}
if (gridCellsX != null) {
settings.setGridCellsX(gridCellsX);
}
if (gridCellsY != null) {
settings.setGridCellsY(gridCellsY);
}
if (poissonsolver != null) {
if (poissonsolver.equals("fft")) {
settings.setPoissonSolver(new PoissonSolverFFTPeriodic());
} else if (poissonsolver.equals("empty")) {
settings.setPoissonSolver(new EmptyPoissonSolver());
} else {
throw new RuntimeException("Unkown Poisson solver specified in YAML file.");
}
}
if (particles != null) {
for (YamlParticle p : particles) {
p.applyTo(settings);
}
}
if (streams != null) {
for (YamlParticleStream s : streams) {
s.applyTo(settings);
}
}
if (output != null) {
output.applyTo(settings);
}
}
}