def test3D(): def E(x, y, z): return math.exp(x + y + z) E_grid = np.zeros((NX_3D + 1, NY_3D + 1, NZ_3D, 3)) for i in range(NX_3D + 1): for j in range(NY_3D + 1): for k in range(NY_3D + 1): E_grid[i][j][k] = E(X0_3D + DX_3D * i, Y0_3D + DY_3D * j, Z0_3D + DZ_3D * k) numPointsToTestBetweenGridPoints_x = 10 numPointsToTestBetweenGridPoints_y = 10 numPointsToTestBetweenGridPoints_z = 10 for i in range(numPointsToTestBetweenGridPoints_x * NX_3D + 1): for j in range(numPointsToTestBetweenGridPoints_y * NY_3D + 1): for k in range(numPointsToTestBetweenGridPoints_z * NY_3D + 1): Xi = X0_3D + DX_3D * i / numPointsToTestBetweenGridPoints_x Yi = Y0_3D + DY_3D * j / numPointsToTestBetweenGridPoints_y Zi = Z0_3D + DZ_3D * k / numPointsToTestBetweenGridPoints_z test( esSolve.electricFieldAtPoint(E_grid, [DX_3D, DY_3D, DZ_3D], [X0_3D, Y0_3D, Z0_3D], [Xi, Yi, Zi]), E(Xi, Yi, Zi))
def test1D(): def E(x): return math.exp(x) E_grid = np.zeros((NX_1D+1,1)) for i in range(NX_1D+1): E_grid[i] = E(X0_1D+DX_1D*i) numPointsToTestBetweenGridPoints = 10 for i in range(numPointsToTestBetweenGridPoints*NX_1D + 1): Xi = X0_1D + DX_1D*i/numPointsToTestBetweenGridPoints test(esSolve.electricFieldAtPoint(E_grid,[DX_1D],[X0_1D],[Xi]),E(Xi))
def test1D(): def E(x): return math.exp(x) E_grid = np.zeros((NX_1D + 1, 1)) for i in range(NX_1D + 1): E_grid[i] = E(X0_1D + DX_1D * i) numPointsToTestBetweenGridPoints = 10 for i in range(numPointsToTestBetweenGridPoints * NX_1D + 1): Xi = X0_1D + DX_1D * i / numPointsToTestBetweenGridPoints test(esSolve.electricFieldAtPoint(E_grid, [DX_1D], [X0_1D], [Xi]), E(Xi))
def test2D(): def E(x,y): return math.exp(x+y) E_grid = np.zeros((NX_2D+1,NY_2D+1,2)) for i in range(NX_2D+1): for j in range(NY_2D+1): E_grid[i][j] = E(X0_2D+DX_2D*i,Y0_2D+DY_2D*j) numPointsToTestBetweenGridPoints_x = 10 numPointsToTestBetweenGridPoints_y = 10 for i in range(numPointsToTestBetweenGridPoints_x*NX_2D + 1): for j in range(numPointsToTestBetweenGridPoints_y*NY_2D + 1): Xi = X0_2D + DX_2D*i/numPointsToTestBetweenGridPoints_x Yi = Y0_2D + DY_2D*j/numPointsToTestBetweenGridPoints_y test(esSolve.electricFieldAtPoint(E_grid,[DX_2D,DY_2D],[X0_2D,Y0_2D],[Xi,Yi]),E(Xi,Yi))
def test2D(): def E(x, y): return math.exp(x + y) E_grid = np.zeros((NX_2D + 1, NY_2D + 1, 2)) for i in range(NX_2D + 1): for j in range(NY_2D + 1): E_grid[i][j] = E(X0_2D + DX_2D * i, Y0_2D + DY_2D * j) numPointsToTestBetweenGridPoints_x = 10 numPointsToTestBetweenGridPoints_y = 10 for i in range(numPointsToTestBetweenGridPoints_x * NX_2D + 1): for j in range(numPointsToTestBetweenGridPoints_y * NY_2D + 1): Xi = X0_2D + DX_2D * i / numPointsToTestBetweenGridPoints_x Yi = Y0_2D + DY_2D * j / numPointsToTestBetweenGridPoints_y test( esSolve.electricFieldAtPoint(E_grid, [DX_2D, DY_2D], [X0_2D, Y0_2D], [Xi, Yi]), E(Xi, Yi))
def test3D(): def E(x,y,z): return math.exp(x+y+z) E_grid = np.zeros((NX_3D+1,NY_3D+1,NZ_3D,3)) for i in range(NX_3D+1): for j in range(NY_3D+1): for k in range(NY_3D+1): E_grid[i][j][k] = E(X0_3D+DX_3D*i,Y0_3D+DY_3D*j,Z0_3D+DZ_3D*k) numPointsToTestBetweenGridPoints_x = 10 numPointsToTestBetweenGridPoints_y = 10 numPointsToTestBetweenGridPoints_z = 10 for i in range(numPointsToTestBetweenGridPoints_x*NX_3D + 1): for j in range(numPointsToTestBetweenGridPoints_y*NY_3D + 1): for k in range(numPointsToTestBetweenGridPoints_z*NY_3D + 1): Xi = X0_3D + DX_3D*i/numPointsToTestBetweenGridPoints_x Yi = Y0_3D + DY_3D*j/numPointsToTestBetweenGridPoints_y Zi = Z0_3D + DZ_3D*k/numPointsToTestBetweenGridPoints_z test(esSolve.electricFieldAtPoint(E_grid,[DX_3D,DY_3D,DZ_3D],[X0_3D,Y0_3D,Z0_3D],[Xi,Yi,Zi]),E(Xi,Yi,Zi))
useCython=False) # Compute E = - grad V on grid electricFieldOnGrid_NR = esSolve.potentialToElectricField(pot1D_NR, [DX]) electricFieldOnGrid_R = esSolve.potentialToElectricField(pot1D_R, [DX]) positions_NR = [electron_NR.position[0]] velocities_NR = [electron_NR.velocity[0]] positions_R_Rpush = [electron_R_Rpush.position[0]] velocities_R_Rpush = [electron_R_Rpush.velocity[0]] positions_R_NRpush = [electron_R_NRpush.position[0]] velocities_R_NRpush = [electron_R_NRpush.velocity[0]] for step in xrange(steps + 1): # Compute E at particle position electricFieldAtPoint_NR = esSolve.electricFieldAtPoint( electricFieldOnGrid_NR, [DX], [X0], electron_NR.position) electricFieldAtPoint_R_Rpush = esSolve.electricFieldAtPoint( electricFieldOnGrid_R, [DX], [X0], electron_R_Rpush.position) electricFieldAtPoint_R_NRpush = esSolve.electricFieldAtPoint( electricFieldOnGrid_R, [DX], [X0], electron_R_NRpush.position) if step == 0: # Back velocity up 1/2 step electron_NR.velocity = electron_NR.velocity - 0.5 * DT_NR * ( charge / mass) * electricFieldAtPoint_NR electron_R_NRpush.velocity = electron_R_NRpush.velocity - 0.5 * DT_R * ( charge / mass) * electricFieldAtPoint_R_NRpush momentum_0 = particleUtils.velocityToMomentum( electron_R_Rpush.mass, electron_R_Rpush.velocity) momentum_minusHalf = momentum_0 - 0.5 * DT_R * electron_R_Rpush.charge * electricFieldAtPoint_R_Rpush
pot1D_R = esSolve.laplace1D(NX,DX,V0,VN_R,"gaussSeidel",relTol=0.0,absTol=1.0e-3*(deltaV_R),useCython=False) # Compute E = - grad V on grid electricFieldOnGrid_NR = esSolve.potentialToElectricField(pot1D_NR,[DX]) electricFieldOnGrid_R = esSolve.potentialToElectricField(pot1D_R,[DX]) positions_NR = [electron_NR.position[0]] velocities_NR = [electron_NR.velocity[0]] positions_R_Rpush = [electron_R_Rpush.position[0]] velocities_R_Rpush = [electron_R_Rpush.velocity[0]] positions_R_NRpush = [electron_R_NRpush.position[0]] velocities_R_NRpush = [electron_R_NRpush.velocity[0]] for step in xrange(steps+1): # Compute E at particle position electricFieldAtPoint_NR = esSolve.electricFieldAtPoint(electricFieldOnGrid_NR,[DX],[X0],electron_NR.position) electricFieldAtPoint_R_Rpush = esSolve.electricFieldAtPoint(electricFieldOnGrid_R,[DX],[X0],electron_R_Rpush.position) electricFieldAtPoint_R_NRpush = esSolve.electricFieldAtPoint(electricFieldOnGrid_R,[DX],[X0],electron_R_NRpush.position) if step == 0: # Back velocity up 1/2 step electron_NR.velocity = electron_NR.velocity - 0.5*DT_NR*(charge/mass)*electricFieldAtPoint_NR electron_R_NRpush.velocity = electron_R_NRpush.velocity - 0.5*DT_R*(charge/mass)*electricFieldAtPoint_R_NRpush momentum_0 = particleUtils.velocityToMomentum(electron_R_Rpush.mass,electron_R_Rpush.velocity) momentum_minusHalf = momentum_0 - 0.5*DT_R*electron_R_Rpush.charge*electricFieldAtPoint_R_Rpush electron_R_Rpush.velocity = particleUtils.momentumToVelocity(electron_R_Rpush.mass,momentum_minusHalf) elif step == steps: # Advance velocity by 1/2 step electron_NR.velocity = electron_NR.velocity + 0.5*DT_NR*(charge/mass)*electricFieldAtPoint_NR