package org.openpixi.pixi.distributed.utils; import org.openpixi.pixi.physics.Settings; import org.openpixi.pixi.physics.fields.SimpleSolver; import org.openpixi.pixi.physics.force.ConstantForce; import org.openpixi.pixi.physics.grid.ChargeConservingCIC; import org.openpixi.pixi.physics.grid.CloudInCell; import org.openpixi.pixi.physics.solver.Boris; import org.openpixi.pixi.physics.solver.Euler; import org.openpixi.pixi.physics.solver.LeapFrogDamped; import org.openpixi.pixi.physics.solver.relativistic.BorisRelativistic; import org.openpixi.pixi.physics.solver.relativistic.SemiImplicitEulerRelativistic; import org.openpixi.pixi.physics.util.ClassCopier; import java.util.HashMap; import java.util.Map; /** * Defines various settings for distributed simulation testing. * Modify this class if you want to extend the coverage of tested settings. */ public class VariousSettings { public static Map<String, Settings> getSettingsMap() { Map<String, Settings> variousTestSettings = new HashMap<String, Settings>(); Settings defaultSettings = getDefaultSettings(); Settings settings = ClassCopier.copy(defaultSettings); settings.setNumOfNodes(2); variousTestSettings.put("2 nodes - self communication", settings); settings = ClassCopier.copy(defaultSettings); settings.setParticleSolver(new Euler()); variousTestSettings.put("Euler", settings); settings = ClassCopier.copy(defaultSettings); settings.setNumOfThreads(5); settings.setParticleSolver(new Euler()); variousTestSettings.put("Threaded version", settings); // Fails probably because Boris remembers a lot of information about the force // in the particle. This information remembering probably causes problem when particles // are transferred from one node to the other. // TODO find solution settings = ClassCopier.copy(defaultSettings); settings.setParticleSolver(new Boris()); variousTestSettings.put("Boris", settings); settings = ClassCopier.copy(defaultSettings); settings.setParticleSolver(new SemiImplicitEulerRelativistic( settings.getCellWidth() / settings.getTimeStep())); variousTestSettings.put("SemiImplicitEulerRelativistic", settings); settings = ClassCopier.copy(defaultSettings); settings.setParticleSolver(new LeapFrogDamped()); variousTestSettings.put("LeapFrogDamped", settings); // Fails because in the distributed version we do additions upon particle's position // when it is transferred from one node to another. These additions are cause of the small // deviation from the non distributed simulation solution. // TODO find solution? settings = ClassCopier.copy(defaultSettings); settings.setIterations(5000); settings.setNumOfParticles(10); settings.setParticleSolver(new SemiImplicitEulerRelativistic( settings.getCellWidth() / settings.getTimeStep())); variousTestSettings.put("5000 iterations", settings); // TODO find solution settings = ClassCopier.copy(defaultSettings); settings.setInterpolator(new ChargeConservingCIC()); variousTestSettings.put("ChargeConservingCIC", settings); settings = ClassCopier.copy(defaultSettings); settings.setInterpolator(new CloudInCell()); variousTestSettings.put("CloudInCell", settings); settings = ClassCopier.copy(defaultSettings); settings.setGridSolver(new SimpleSolver()); variousTestSettings.put("SimpleSolver", settings); // Fails because SpringForce uses particle's absolute y position to calculate the force. // Since the y position in local and distributed simulation differs, // it also has a different effect. // TODO find solution // settings = ClassCopier.copy(defaultSettings); // settings.addForce(new SpringForce()); // variousTestSettings.put("SpringForce", settings); settings = ClassCopier.copy(defaultSettings); ConstantForce constantForce = new ConstantForce(); constantForce.bz = -1; settings.addForce(constantForce); variousTestSettings.put("MagneticForce", settings); return variousTestSettings; } public static Settings getDefaultSettings() { Settings settings = new Settings(); settings.setNumOfNodes(16); settings.setGridCellsX(64); settings.setGridCellsY(128); settings.setSimulationWidth(10 * settings.getGridCellsX()); settings.setSimulationHeight(10 * settings.getGridCellsY()); settings.setNumOfParticles(100); settings.setIterations(100); // Ensures that the particles do not get too fast. settings.setParticleSolver(new BorisRelativistic( settings.getSimulationWidth() / settings.getTimeStep())); return settings; } }