package org.openpixi.pixi.physics.fields; import org.openpixi.pixi.parallel.cellaccess.CellAction; import org.openpixi.pixi.physics.grid.Cell; import org.openpixi.pixi.physics.grid.Grid; public class SimpleSolver extends FieldSolver { private double timeStep; private SolveForE solveForE = new SolveForE(); private SolveForB solveForB = new SolveForB(); @Override public FieldSolver clone() { SimpleSolver clone = new SimpleSolver(); clone.copyBaseClassFields(this); clone.timeStep = timeStep; clone.solveForE = solveForE; clone.solveForB = solveForB; return clone; } /**A simple LeapFrog algorithm * @param grid before the update: E(t), B(t+dt/2); * after the update: E(t+dt), B(t+3dt/2) */ @Override public void step(Grid grid, double timeStep) { this.timeStep = timeStep; solveForE.timeStep = timeStep; solveForB.timeStep = timeStep; cellIterator.execute(grid, solveForE); cellIterator.execute(grid, solveForB); } private class SolveForE implements CellAction { private double eps0 = 1.0/(4*Math.PI); //private double eps0 = 1; //Suppose c=1: private double mue0 = 4*Math.PI; //private double mue0 = 1; private double timeStep; public void execute(Cell cell) { throw new UnsupportedOperationException(); } public void execute(Grid grid, int x, int y) { /**Curl of the B field using forward difference. * Because we are using a FDTD grid E(x,y) is in between of B(x,y) and B(x+1,y) * (same for y). Therefore this is something like a center difference.*/ //double cx = (grid.getBz(x, y+1) - grid.getBz(x, y)) / grid.getCellHeight(); //double cy = -(grid.getBz(x+1, y) - grid.getBz(x, y)) / grid.getCellWidth(); double cx = (grid.getBz(x, y) - grid.getBz(x, (y+grid.getNumCellsY()- 1)%grid.getNumCellsY())) / grid.getCellHeight(); double cy = -(grid.getBz(x, y) - grid.getBz((x+grid.getNumCellsX()-1)%grid.getNumCellsX(), y)) / grid.getCellWidth(); /**Maxwell equations*/ grid.addEx(x, y, timeStep * (1/(mue0*eps0)*cx - 1/eps0*grid.getJx(x, y))); grid.addEy(x, y, timeStep * (1/(mue0*eps0)*cy - 1/eps0*grid.getJy(x, y))); } } private class SolveForB implements CellAction { private double timeStep; public void execute(Cell cell) { throw new UnsupportedOperationException(); } public void execute(Grid grid, int x, int y) { /**Curl of the E field using forward difference. * Because we are using a FDTD grid B(x,y) is in between of E(x,y) and E(x-1,y) * (same for y). Therefore this is something like a center difference.*/ //double cz = (grid.getEy(x, y) - grid.getEy(x-1, y)) / grid.getCellWidth() - // (grid.getEx(x, y) - grid.getEx(x, y-1)) / grid.getCellHeight(); double cz = (grid.getEy((x+1)%grid.getNumCellsX(), y) - grid.getEy(x, y)) / grid.getCellWidth() - (grid.getEx(x, (y+1)%grid.getNumCellsY()) - grid.getEx(x, y)) / grid.getCellHeight(); /**Maxwell equation*/ grid.addBz(x, y, -timeStep * cz); } } }