def newRandomArray(size): pArray = pfc.particleArray() #type = Electron for i in range(size): pos = pfc.vector3d(1.2 * i, 3.4 * i, 5.6 * i) mo = pfc.vector3d(9.8 * i, 7.6 * i, 54.3 * i) newP = pfc.particle(pos, mo, 0.5, pfc.Electron) pArray.add(newP) #or pArray.pushBack return pArray
def getFields(): global grid, x, y, Nx, Ny Ey = np.zeros(shape=(Ny,Nx)) Bz = np.zeros(shape=(Ny,Nx)) for ix in range(Nx): for iy in range(Ny): coordXY = pfc.vector3d(x[ix], y[iy], 0.0) E = grid.getE(coordXY) Ey[iy, ix] = E.y B = grid.getB(coordXY) Bz[iy, ix] = B.z return Ey, Bz
def getFields(): global grid, x, z, N Ex = np.zeros(shape=(N,N)) Ey = np.zeros(shape=(N,N)) Ez = np.zeros(shape=(N,N)) Bx = np.zeros(shape=(N,N)) By = np.zeros(shape=(N,N)) Bz = np.zeros(shape=(N,N)) for ix in range(N): for iy in range(N): coordXZ = pfc.vector3d(x[ix], 0.0, z[iy]) E = grid.getE(coordXZ) Ex[ix, iy] = E.x Ey[ix, iy] = E.y Ez[ix, iy] = E.z B = grid.getB(coordXZ) Bx[ix, iy] = B.x By[ix, iy] = B.y Bz[ix, iy] = B.z return Ex, Ey, Ez, Bx, By, Bz
# import sys # sys.path.append("../build/pythonModule/Release") import pyHiChi as pfc import numpy as np import math as ma gridSize = pfc.vector3d(144, 30, 1) pmlSize = pfc.vector3d(8, 0, 0) minCoords = pfc.vector3d(0.0, 0.0, 0.0) maxCoords = pfc.vector3d(gridSize.x * pfc.c, gridSize.y * pfc.c, gridSize.z * pfc.c) def step(minCoords, maxCoords, gridSize): steps = pfc.vector3d(1, 1, 1) steps.x = (maxCoords.x - minCoords.x)/(gridSize.x) steps.y = (maxCoords.y - minCoords.y)/(gridSize.y) steps.z = (maxCoords.z - minCoords.z)/(gridSize.z) return steps stepsGrid = step(minCoords, maxCoords, gridSize) timeStep = 0.1 pmlLeftEnd = minCoords.x+pmlSize.x*stepsGrid.x pmlRightStart = maxCoords.x-pmlSize.x*stepsGrid.x internalWidth = pmlRightStart-pmlLeftEnd#maxCoords.x-minCoords.x def valueEx(x, y, z): Ex = 0 return Ex def valueEy(x, y, z): if (x<pmlLeftEnd or x>=pmlRightStart): Ey=0
import pyHiChi as pfc # Ensemble Ensemble = pfc.ensemble() for i in range(11): pos = pfc.vector3d(1.2 * i, 1.3 * i, 1.6 * i) mo = pfc.vector3d(1.1 * i, 1.4 * i, 1.5 * i) newP = pfc.particle(pos, mo, 0.5, pfc.Electron) Ensemble.add(newP) for i in range(10): pos = pfc.vector3d(13 * i, 14 * i, 17 * i) mo = pfc.vector3d(12 * i, 15 * i, 16 * i) newP = pfc.particle(pos, mo, 0.5, pfc.Positron) Ensemble.add(newP) for i in range(13): pos = pfc.vector3d(140 * i, 150 * i, 180 * i) mo = pfc.vector3d(130 * i, 160 * i, 170 * i) newP = pfc.particle(pos, mo, 0.5, pfc.Proton) Ensemble.add(newP) print('Count Particles: ', Ensemble.size()) print('Count Electron: ', Ensemble['Electron'].size()) #use index 'Electron' or pfc.Electron print('Count Positron: ', Ensemble['Positron'].size()) #same Electron print('Count Proton: ', Ensemble['Proton'].size()) #same Electron print('Positions Electron: ') for elem in Ensemble[pfc.Electron]: print(elem.getPosition()) positronArray = Ensemble[pfc.Positron] print('Position second Positron')
def valueE(x, y, z): E = pfc.vector3d(0, np.cos(z), 0) #sin(x) return E
def valueB(x, y, z): B = pfc.vector3d(-np.cos(z), 0, 0) return B
def valueBz(x, y, z): Bz = 0 return Bz def step(minCoords, maxCoords, gridSize): steps = pfc.vector3d(1, 1, 1) steps.x = (maxCoords.x - minCoords.x) / (gridSize.x) steps.y = (maxCoords.y - minCoords.y) / (gridSize.y) steps.z = (maxCoords.z - minCoords.z) / (gridSize.z) return steps gridSize = pfc.vector3d(5, 10, 11) minCoords = pfc.vector3d(0.0, 1.0, 0.0) maxCoords = pfc.vector3d(3.5, 7.0, 2 * ma.pi) stepsGrid = step(minCoords, maxCoords, gridSize) timeStep = 1e-16 grid1 = pfc.YeeGrid(gridSize, timeStep, minCoords, stepsGrid) grid2 = pfc.YeeGrid(gridSize, timeStep, minCoords, stepsGrid) grid1.setE(valueE) grid1.setB(valueB) grid2.setE(valueEx, valueEy, valueEz) grid2.setB(valueBx, valueBy, valueBz) #show
def valueBz(x, y, z): Bz = 0 return Bz def step(minCoords, maxCoords, gridSize): steps = pfc.vector3d(1, 1, 1) steps.x = (maxCoords.x - minCoords.x) / (gridSize.x) steps.y = (maxCoords.y - minCoords.y) / (gridSize.y) steps.z = (maxCoords.z - minCoords.z) / (gridSize.z) return steps gridSize = pfc.vector3d(40, 40, 40) minCoords = pfc.vector3d(0.0, 1.0, 0.0) maxCoords = pfc.vector3d(3.5, 7.0, 2 * ma.pi) stepsGrid = step(minCoords, maxCoords, gridSize) timeStep = 1e-13 grid = pfc.YeeGrid(gridSize, timeStep, minCoords, stepsGrid) grid.setE(valueEx, valueEy, valueEz) grid.setB(valueBx, valueBy, valueBz) fieldSolver = pfc.FDTD(grid) fieldSolver.setPML(0, 0, 0) #show import matplotlib.pyplot as plt import matplotlib.animation as animation
import pyHiChi as pfc E = pfc.vector3d(1.2, 2.2, 3.4) B = pfc.vector3d(34, 5.6, 7.8) #FieldValue f = pfc.field(E, B) print(f.getE()) print(f.getB()) f.setE(B) f.setB(E) print(f.getE()) print(f.getB()) f2 = pfc.field(E.z, E.y, E.x, B.x, B.x, B.x) #Ex, Ey, Ez, Bx, By, Bz print(f2.getE()) print(f2.getB())
import pyHiChi as pfc #vector3d v = pfc.vector3d(1.2, 2.2, 3.4) print("volume: ", v.volume()) print("norm: ", v.norm()) print("norm2: ", v.norm2()) print("vector: ", v.toString()) print(v) print(v.x) print(v.y) print(v.z) v2 = pfc.vector3d() print("v2: ", v2.toString()) v2.x = 2.4 v2.y = 4.5 v2.z = 312 print("v2: ", v2.toString())
def valueBAnalytical(pos, t): B = pfc.vector3d(0, 0, 0) return B
def valueEAnalytical(pos, t): E = pfc.vector3d(1, 0, 0) #sin(pos.x) return E
def valueEAnalytical(pos, t): E = pfc.vector3d(1, 0, 0) #sin(pos.x) return E def valueBAnalytical(pos, t): B = pfc.vector3d(0, 0, 0) return B t = 0 pArray = pfc.particleArray() fieldsArray = [] for i in range(11): pos = pfc.vector3d(1.2 * i, 3.4 * i, 5.6 * i) mo = pfc.vector3d(i * 10**16, 0, 0) newP = pfc.particle(pos, mo, 0.5, pfc.Electron) pArray.add(newP) fieldsArray.append( pfc.field(valueEAnalytical(pos, t), valueBAnalytical(pos, t))) #Boris Pusher dt = 0.1 pusher = pfc.BorisPusher() for k in range(11): print(pArray[1].getMomentum()) pusher(pArray, fieldsArray, dt) t = dt * k for j in range(11): fieldsArray[i].setE(valueEAnalytical(pos, t))
def valueBz(x, y, z): #Bz = 0 #for y or z #Bz = np.sin(x) #for x Bz = np.sin(x - z) / np.sqrt(2) #for xz return Bz def step(minCoords, maxCoords, gridSize): steps = pfc.vector3d(1, 1, 1) steps.x = (maxCoords.x - minCoords.x) / (gridSize.x) steps.y = (maxCoords.y - minCoords.y) / (gridSize.y) steps.z = (maxCoords.z - minCoords.z) / (gridSize.z) return steps gridSize = pfc.vector3d(20, 20, 20) minCoords = pfc.vector3d(0.0, 0.0, 0.0) maxCoords = pfc.vector3d(2 * ma.pi, 2 * ma.pi, 2 * ma.pi) stepsGrid = step(minCoords, maxCoords, gridSize) timeStep = 1e-14 grid = pfc.YeeGrid(gridSize, timeStep, minCoords, stepsGrid) grid.setE(valueEx, valueEy, valueEz) grid.setB(valueBx, valueBy, valueBz) fieldSolver = pfc.FDTD(grid) fieldSolver.setPML(0, 0, 0) periodicalBC = pfc.PeriodicalBC(fieldSolver) #show import matplotlib.pyplot as plt
import pyHiChi as pfc v = pfc.vector3d(1.2, 2.2, 3.4) v2 = pfc.vector3d(34, 5.6, 7.8) #Particle p = pfc.particle() print(p.getPosition()) p.setPosition(v) print(p.getPosition()) p.setPosition(pfc.vector3d(1.2, 2.1, 1.2)) print(p.getPosition()) p.setMomentum(v2) print(p.getMomentum()) p.setMomentum(pfc.vector3d(3.4, 5.6, 7.8)) print(p.getMomentum()) mom = p.getMomentum() print(mom.x) print(p.getMomentum().y) p.setVelocity(v) print(p.getVelocity()) print(p.getMomentum()) print(p.getType()) print(p.getMass()) print(p.getCharge()) print(p.getWeight()) pos = pfc.vector3d(1.2, 3.4, 5.6)
def step(minCoords, maxCoords, gridSize): steps = pfc.vector3d(1, 1, 1) steps.x = (maxCoords.x - minCoords.x) / (gridSize.x) steps.y = (maxCoords.y - minCoords.y) / (gridSize.y) steps.z = (maxCoords.z - minCoords.z) / (gridSize.z) return steps
import pyHiChi as pfc #ParticleArray - legacy, use Ensemble pArray = pfc.particleArray() #type = Electron for i in range(11) : pos = pfc.vector3d(1.2*i, 3.4*i, 5.6*i) mo = pfc.vector3d(9.8*i, 7.6*i, 54.3*i) newP = pfc.particle(pos, mo, 0.5, pfc.Electron) pArray.add(newP) print(pArray.size()) print(pArray.getType()) print(pArray[5].getPosition()) pArray.delete(5) print(pArray[5].getPosition()) for el in pArray : print(el.getPosition()) print(pArray.size())