Package org.openpixi.pixi.ui

Source Code of org.openpixi.pixi.ui.PoissonSolverCalculations

package org.openpixi.pixi.ui;

import org.openpixi.pixi.physics.Settings;
import org.openpixi.pixi.physics.Simulation;
import org.openpixi.pixi.physics.fields.PoissonSolver;
import org.openpixi.pixi.physics.fields.PoissonSolverFFTPeriodic;
import org.openpixi.pixi.physics.fields.SimpleSolver;
import org.openpixi.pixi.physics.grid.ChargeConservingCIC;
import org.openpixi.pixi.physics.grid.Grid;
import org.openpixi.pixi.ui.util.WriteFile;

import java.io.File;

public class PoissonSolverCalculations {
 
  private Simulation s;
  private Grid g;
  private PoissonSolver poisolver;
 
  public PoissonSolverCalculations() {

    Settings stt = new Settings();
    stt.setSimulationWidth(100);
    stt.setSimulationHeight(100);

    stt.setGridCellsX(100);
    stt.setGridCellsY(100);
    stt.setGridSolver(new SimpleSolver());
    stt.setInterpolator(new ChargeConservingCIC());

    this.s = new Simulation(stt);
    this.g = s.grid;
    g.resetCurrent();
   
    this.poisolver = new PoissonSolverFFTPeriodic();
  }
 
  private double[][] pointChargeShifted(int numCellsX, int numCellsY) {
    double[][] rho = new double[numCellsX][numCellsY];
    int indexX = (int)(numCellsX/2);
    int indexY = (int) (numCellsY/2);
    rho[indexX][indexY] = 1;
    rho[indexX+1][indexY] = 1;
    rho[indexX][indexY+1] = 1;
    rho[indexX+1][indexY+1] = 1;
    return rho;
  }
 
  private double[][] dipole(int numCellsX, int numCellsY) {
    double[][] rho = new double[numCellsX][numCellsY];
    int indexX = (int)(numCellsX/2);
    int indexY = (int) (numCellsY/2);
    rho[indexX-2][indexY] = 10;
    rho[indexX+2][indexY] = -10;
    return rho;
  }
 
  private double[][] lineChargeOnEdge(int numCellsX, int numCellsY) {
    double[][] rho = new double[numCellsX][numCellsY];
    double charge = 1;
    for(int i = 0; i < numCellsX; i++) {
        rho[i][0] = charge;
        rho[i][numCellsY-1] = charge;       
    }
   
    for(int i = 0; i < numCellsY; i++) {
      rho[0][i] = charge;
      rho[numCellsX-1][i] = charge;       
    }
    return rho;
  }
 
  private double[][] lineChargeOnSide(int numCellsX, int numCellsY) {
    double[][] rho = new double[numCellsX][numCellsY];
    double charge = 1;   
    for(int i = 0; i < numCellsY; i++) {
        rho[0][i] = charge;     
    }
    return rho;
  }
 
  private double[][] randomChargeDistribution(int numCellsX, int numCellsY) {
    double[][] rho = new double[numCellsX][numCellsY];
    double charge = 10;
    if (Math.random() < 0.5) {
      charge = -charge;
    }
    for(int i = 0; i < numCellsX; i++) {
      for(int j = 0; j < numCellsY; j++) {
        g.setRho(i, j, charge * Math.random());
      }
    }
   
    return rho;
  }
 
  public static void output(Grid g) {
   
    double aspectratio = g.getCellHeight() * g.getNumCellsY() / g.getCellWidth() * g.getNumCellsX();
    //deletes the old files
    File file1 = new File("\\efeld.dat");
    file1.delete();
    File file2 = new File("\\potential.dat");
    file2.delete();
   
    //creates new file "efield.dat" in working directory and writes
    //field data to it
    WriteFile fieldFile = new WriteFile("efeld", "");
    for (int i = 0; i < g.getNumCellsX(); i++) {
      for(int j = 0; j < g.getNumCellsY(); j++) {
        fieldFile.writeLine(i*g.getCellWidth() + "\t" + j*g.getCellHeight() +
            "\t" + g.getEx(i, j) + "\t" + g.getEy(i, j));
      }
    }
    fieldFile.closeFstream();
   
    WriteFile potentialFile = new WriteFile("potential", "");
    for (int i = 0; i < g.getNumCellsX(); i++) {
      for(int j = 0; j < g.getNumCellsY(); j++) {
        potentialFile.writeLine(i*g.getCellWidth() + "\t" + j*g.getCellHeight()  + "\t" + g.getPhi(i, j));
      }
    }
    potentialFile.closeFstream();
   
    //YOU NEED GNUPLOT FOR THIS http://www.gnuplot.info/
    //NEEDS TO BE IN YOUR EXECUTION PATH (i.e. PATH variable on windows)
    //plots the above output as vector field
    try {
    Runtime gnuplotrt = Runtime.getRuntime();
    Process gnuplotpr = gnuplotrt.exec("gnuplot -e \"set term png; set size ratio " + aspectratio + "; set output 'D:\\efield.png'; plot 'D:\\efeld.dat' using 1:2:3:4 with vectors head filled lt 2\"");
    } catch (Exception e) {
      e.printStackTrace();
    }
    //plots potential
    try {
    Runtime gnuplotPotentialRt = Runtime.getRuntime();
    Process gnuplotPotentialPr = gnuplotPotentialRt.exec("gnuplot -e \"set term png; set size ratio " + aspectratio + "; set output 'D:\\potential.png'; plot 'D:\\potential.dat' using 1:2:3 with circles linetype palette \"");
    } catch (Exception e) {
      e.printStackTrace();
    }
  }

  public static void main(String[] args) {
   
    PoissonSolverCalculations pc = new PoissonSolverCalculations();
    //writes to g.rho
    pc.randomChargeDistribution(pc.g.getNumCellsX(), pc.g.getNumCellsY());
       
    long start = System.currentTimeMillis();
    pc.poisolver.solve(pc.g);       
    long elapsed = System.currentTimeMillis()-start;
    System.out.println("\nCalculation time: "+elapsed);
   
    PoissonSolverCalculations.output(pc.g);
   
    interpolatorAndPoissonsolver();
  }
 
  public static void interpolatorAndPoissonsolver() {

    Settings stt = new Settings();
    stt.setSimulationWidth(100);
    stt.setSimulationHeight(100);
    stt.setSpeedOfLight(Math.sqrt(stt.getSimulationWidth() * stt.getSimulationWidth() +
        stt.getSimulationHeight() * stt.getSimulationHeight())/5);

    stt.setNumOfParticles(1);
    stt.setParticleRadius(1);
    stt.setParticleMaxSpeed(stt.getSpeedOfLight());

    stt.setGridCellsX(100);
    stt.setGridCellsY(100);
    stt.setGridSolver(new SimpleSolver());
    stt.setInterpolator(new ChargeConservingCIC());

    Simulation s = new Simulation(stt);
    PoissonSolverCalculations.output(s.grid);
  }

}
TOP

Related Classes of org.openpixi.pixi.ui.PoissonSolverCalculations

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.