import math
import numpy
from scipy.integrate import odeint
from scipy.special import ellipk, ellipe
from matplotlib.pyplot import *
class Spire:
def __init__(self,a,zs,i):
self.a = a
self.a2 = a*a
self.a4 = self.a2*self.a2
self.zs = zs
self.i = i
def champB(self,x,z):
if abs(x) < 1e-8:
x=0
if x>0:
sx = 1
x = -x
else:
sx = -1
z = z-self.zs
x2 = x*x
z2 = z*z
r2 = x2+z2
b1 = self.a2+ r2
b2 = 2*x*self.a
b3 = b1+b2
b4 = b1-b2
b5 = -2*b2/b4
b6 = math.sqrt(b3/b4)*self.i
rb3 = math.sqrt(b3)
b7 = self.a*b3*rb3
b8 = self.a4-self.a2*(x2-2*z2)+z2*(x2+z2)
b9 = (self.a2+z2)*b3
e = ellipe(b5)
k = ellipk(b5)
bz = b6*((self.a2-r2)*e+b3*k)/b7
if x==0:
bx = 0.0
Atheta = 0.0
Adx = bz/2
else:
bx = -sx*z/x*b6*(b1*e-b3*k)/b7
Atheta = -sx*b6/x*(-b4*e+(self.a2+r2)*k)/(self.a*rb3)
Adx = b6/x2*(b8*e-b9*k)/b7
return [bx,bz,Atheta,Adx]