152 lines
6.4 KiB
Python
152 lines
6.4 KiB
Python
# -*- coding: utf-8 -*-
|
|
"""
|
|
Created on Mon Aug 16 11:51:36 2021
|
|
|
|
@author: Joschka
|
|
"""
|
|
|
|
import numpy as np
|
|
from scipy import special as sp
|
|
from src import physical_constants as cs
|
|
|
|
|
|
#HH = +1 --> Helmholtz configuration, HH = -1 --> Anti Helmholtz configuration
|
|
def B_field_ideal(N_windings,I_current,R_radius,d_distance,HH,z_arg):
|
|
""" Calculate B-field for ideal point like wires with R_radius and d_distance
|
|
HH = +1 --> Helmholtz configuration, HH = -1 --> Anti Helmholtz configuration
|
|
"""
|
|
B = cs.mu_0*N_windings*I_current/2 * R_radius**2 * (1/(R_radius**2+(z_arg-d_distance/2)**2)**(3/2) +HH* 1/(R_radius**2+(z_arg+d_distance/2)**2)**(3/2))
|
|
B *= 1e4 #conversion Gauss
|
|
return B
|
|
|
|
#Argument for elliptic integrals
|
|
def k_sq(R_loop, z_loc, r, z):
|
|
""" Argument for elliptic integrals"""
|
|
return (4*R_loop*r)/((R_loop+r)**2 + (z-z_loc)**2)
|
|
|
|
|
|
|
|
def B_z_loop(I_current, R_loop, z_loc, r, z):
|
|
"""calculate z-component of B-field at position r and z for each individual loop"""
|
|
B_z = 2e-7*I_current * 1/( (R_loop+r)**2 + (z-z_loc)**2 )**(1/2) *(sp.ellipk(k_sq(R_loop,z_loc,r,z))+ sp.ellipe(k_sq(R_loop,z_loc,r,z))*(R_loop**2 - r**2 - (z-z_loc)**2)/((R_loop-r)**2 + (z-z_loc)**2))
|
|
B_z *= 1e4 #conversion to gauss
|
|
return B_z
|
|
|
|
|
|
def B_r_loop(I_current, R_loop, z_loc, r, z):
|
|
"""calculate r-component of B-field at position r and z for each individual loop"""
|
|
B_r = 2e-7*I_current/r * (z-z_loc)/( (R_loop+r)**2 + (z-z_loc)**2 )**(1/2) *(-sp.ellipk(k_sq(R_loop,z_loc,r,z))+ sp.ellipe(k_sq(R_loop,z_loc,r,z))*(R_loop**2 + r**2 + (z-z_loc)**2)/((R_loop-r)**2 + (z-z_loc)**2))
|
|
|
|
B_r *= 1e4 #conversion to gauss
|
|
return B_r
|
|
|
|
def B_multiple(I_current, HH, R_inner, distance_coils, layers, windings, wire_width, wire_height, x, z):
|
|
"""Returns Bz along z-axis and B_r along r-axis
|
|
HH = +1 --> Helmholtz configuration, HH = -1 --> Anti Helmholtz configuration"""
|
|
z_start = (distance_coils/2 - windings * wire_height/2 + wire_height/2)*1e-3
|
|
R_start = (R_inner + wire_width/2 )*1e-3
|
|
|
|
|
|
if x[0] <=0:
|
|
x_neg = np.abs([el for el in x if el<0])
|
|
x_pos = np.array([el for el in x if el>0])
|
|
x_zero = np.array([el for el in x if el == 0])
|
|
|
|
|
|
B_z = np.zeros(len(z))
|
|
B_x_pos = np.zeros(len(x_pos))
|
|
B_x_neg = np.zeros(len(x_neg))
|
|
B_x_zero = x_zero #If there is a zero in the x-array it is assured that the x component of the field at this point is zero
|
|
|
|
|
|
|
|
for xx in range(0,layers):
|
|
for zz in range(0,windings):
|
|
z_pos = z_start + zz * wire_height*1e-3
|
|
R_pos = R_start + xx * wire_width*1e-3
|
|
|
|
B_z += B_z_loop(I_current,R_pos,z_pos,0,z) + B_z_loop(HH*I_current,R_pos,-z_pos,0,z)
|
|
B_x_pos += B_r_loop(I_current,R_pos,z_pos,x_pos,0) + B_r_loop(HH*I_current,R_pos,-z_pos,x_pos,0)
|
|
B_x_neg += B_r_loop(I_current,R_pos,z_pos,x_pos,0) + B_r_loop(HH*I_current,R_pos,-z_pos,x_pos,0)
|
|
|
|
B_x_neg *=-1 #B_x_neg is pointing in opposite x_direction
|
|
B_x = np.concatenate((B_x_neg,B_x_zero,B_x_pos))
|
|
return B_z,B_x
|
|
|
|
|
|
def B_multiple_raster(I_current, HH, R_inner, distance_coils, layers, windings, wire_width, wire_height, x, z):
|
|
"""Returns Bz along z-axis and B_r along r-axis
|
|
HH = +1 --> Helmholtz configuration, HH = -1 --> Anti Helmholtz configuration"""
|
|
z_start = (distance_coils/2 - windings * wire_height/2 + wire_height/2)*1e-3
|
|
R_start = (R_inner + wire_width/2 )*1e-3
|
|
|
|
if x[0] <=0:
|
|
x_neg = np.abs([el for el in x if el<0])
|
|
x_pos = np.array([el for el in x if el>0])
|
|
x_zero = np.array([el for el in x if el == 0])
|
|
|
|
|
|
B_z = np.zeros(len(z))
|
|
B_x_pos = np.zeros(len(x_pos))
|
|
B_x_neg = np.zeros(len(x_neg))
|
|
B_x_zero = x_zero #If there is a zero in the x-array it is assured that the x component of the field at this point is zero
|
|
|
|
|
|
|
|
#dividing each wire into 10 x 10 raster
|
|
raster = 10
|
|
I_current /=raster**2
|
|
for xx in range(0,layers):
|
|
for zz in range(0,windings):
|
|
for xx_in in range(0,raster):
|
|
for zz_in in range(0,raster):
|
|
z_pos = z_start + (zz * wire_height - wire_height/2 + zz_in * wire_height/(raster-1) )*1e-3
|
|
R_pos = R_start + (xx * wire_width - wire_width/2 + xx_in * wire_width/(raster-1) )*1e-3
|
|
|
|
B_z += B_z_loop(I_current,R_pos,z_pos,0,z) + B_z_loop(HH*I_current,R_pos,-z_pos,0,z)
|
|
B_x_pos += B_r_loop(I_current,R_pos,z_pos,x_pos,0) + B_r_loop(HH*I_current,R_pos,-z_pos,x_pos,0)
|
|
B_x_neg += B_r_loop(I_current,R_pos,z_pos,x_pos,0) + B_r_loop(HH*I_current,R_pos,-z_pos,x_pos,0)
|
|
|
|
B_x_neg *=-1 #B_x_neg is pointing in opposite x_direction
|
|
B_x = np.concatenate((B_x_neg,B_x_zero,B_x_pos))
|
|
return B_z,B_x
|
|
|
|
def B_multiple_raster_test(I_current, HH, R_inner, distance_coils, layers, windings, wire_width, wire_height, x, z):
|
|
"""Returns Bz along z-axis and B_r along r-axis
|
|
HH = +1 --> Helmholtz configuration, HH = -1 --> Anti Helmholtz configuration"""
|
|
z_start = (distance_coils/2 - windings * wire_height/2 + wire_height/2)*1e-3
|
|
R_start = (R_inner + wire_width/2 )*1e-3
|
|
|
|
if x[0] <=0:
|
|
x_neg = np.abs([el for el in x if el<0])
|
|
x_pos = np.array([el for el in x if el>0])
|
|
x_zero = np.array([el for el in x if el == 0])
|
|
|
|
|
|
B_z = np.zeros(len(z))
|
|
B_x_pos = np.zeros(len(x_pos))
|
|
B_x_neg = np.zeros(len(x_neg))
|
|
B_x_zero = x_zero #If there is a zero in the x-array it is assured that the x component of the field at this point is zero
|
|
|
|
|
|
|
|
#dividing each wire into 10 x 10 raster
|
|
raster = 10
|
|
I_current /=raster
|
|
for xx in range(0,layers):
|
|
for zz in range(0,windings):
|
|
for xx_in in range(0,1):
|
|
for zz_in in range(0,raster):
|
|
z_pos = z_start + (zz * wire_height - wire_height/2 + zz_in * wire_height/(raster-1) )*1e-3
|
|
R_pos = R_start + (xx * wire_width)*1e-3
|
|
|
|
B_z += B_z_loop(I_current,R_pos,z_pos,0,z) + B_z_loop(HH*I_current,R_pos,-z_pos,0,z)
|
|
B_x_pos += B_r_loop(I_current,R_pos,z_pos,x_pos,0) + B_r_loop(HH*I_current,R_pos,-z_pos,x_pos,0)
|
|
B_x_neg += B_r_loop(I_current,R_pos,z_pos,x_pos,0) + B_r_loop(HH*I_current,R_pos,-z_pos,x_pos,0)
|
|
|
|
B_x_neg *=-1 #B_x_neg is pointing in opposite x_direction
|
|
B_x = np.concatenate((B_x_neg,B_x_zero,B_x_pos))
|
|
return B_z,B_x
|
|
|
|
|