from pyscript import document, display
import js
from numpy import abs, sqrt, log, arctan
from scipy import integrate
small_angl = 1.00e-6
small_dist = 1.00e-6
small_value = 1.00e-12
def sgn(x):
if x>=0.0:
return 1.0
else:
return -1.0
def b_bar(xp, yp, zp, lx, ly, lz, ja): # Sackett
x1 = -lx * 0.5; x2 = lx * 0.5
y1 = -ly * 0.5; y2 = ly * 0.5
z1 = -lz * 0.5; z2 = lz * 0.5
jn = 1.0e-7 * ja
bxt = 0.0; byt = 0.0
for i in range(8):
if i == 0:
xi = x1; yj = y1; zk = z1
elif i == 1:
xi = x2; yj = y1; zk = z1
elif i == 2:
xi = x2; yj = y2; zk = z1
elif i == 3:
xi = x1; yj = y2; zk = z1
elif i == 4:
xi = x1; yj = y1; zk = z2
elif i == 5:
xi = x2; yj = y1; zk = z2
elif i == 6:
xi = x2; yj = y2; zk = z2
else:
xi = x1; yj = y2; zk = z2
x = xp - xi
y = yp - yj
z = zp - zk
if abs(x) < small_value:
x = small_dist
if abs(y) < small_value:
y = small_dist
if abs(z) < small_value:
z = small_dist
r = sqrt(x**2 + y**2 + z**2)
bx0 = z*log(r + x) + x*log(r + z) - y*arctan((x*r + x**2 + y**2)/(y*z))
by0 = z*log(r + y) + y*log(r + z) - x*arctan((y*r + x**2 + y**2)/(x*z))
sg = sgn(xi * yj * zk)
bxt = bxt - sg*bx0
byt = byt + sg*by0
bx = jn*bxt
by = jn*byt
return bx, by
def abarfn(z, x, y, zp):
s = zp - z
ys = y*s
if abs(ys) < small_value:
ys = small_value
af = s*arctan((x*sqrt(x**2 + y**2 + s**2) + x**2 + s**2)/ys)
return af
def a_bar(xp, yp, zp, lx, ly, lz, ja): # Sackett
x1 = -lx * 0.5; x2 = lx * 0.5
y1 = -ly * 0.5; y2 = ly * 0.5
z1 = -lz * 0.5; z2 = lz * 0.5
jn = 1.0e-7 * ja
azt1 = 0.0
for j in range(8):
if j == 0:
xi = x1; yj = y1; zk = z1
elif j == 1:
xi = x2; yj = y1; zk = z1
elif j == 2:
xi = x2; yj = y2; zk = z1
elif j == 3:
xi = x1; yj = y2; zk = z1
elif j == 4:
xi = x1; yj = y1; zk = z2
elif j == 5:
xi = x2; yj = y1; zk = z2
elif j == 6:
xi = x2; yj = y2; zk = z2
else:
xi = x1; yj = y2; zk = z2
x = xp - xi
y = yp - yj
z = zp - zk
if abs(x) < small_dist:
x = small_dist
r = sqrt(x**2 + y**2 + z**2)
a01 = y*z*log(r + x) + x*z*log(r + y) + 2.0*x*y*log(r + z)
a02 = y**2*arctan((x*r + x**2 + y**2)/(y*z))
a03 = x**2*arctan((y*r + x**2 + y**2)/(x*z))
a0 = a01 - a02 - a03
sg = sgn(xi*yj*zk)
azt1 = azt1 - sg * a0
azt2 = 0.0
for j in range(4):
if j == 0:
xi = x1; yj = y1
elif j == 1:
xi = x2; yj = y1
elif j == 2:
xi = x2; yj = y2
else:
xi = x1; yj = y2
x = xp - xi
y = yp - yj
a, e = integrate.quad(abarfn, z1, z2, args=(x, y, zp))
sg = sgn(xi*yj)
azt2 = azt2 + sg*a
az = jn*(azt1 - azt2)
return az
def bacalc(event):
lx = float(js.document.getElementById("lx").value)
ly = float(js.document.getElementById("ly").value)
lz = float(js.document.getElementById("lz").value)
ia = float(js.document.getElementById("current").value)*1.0e6
xp = float(js.document.getElementById("xp").value)
yp = float(js.document.getElementById("yp").value)
zp = float(js.document.getElementById("zp").value)
ja = ia/(lx*ly)
bx, by = b_bar(xp, yp, zp, lx, ly, lz, ja)
az = a_bar(xp, yp, zp, lx, ly, lz, ja)
js.document.getElementById("msg1").innerHTML = "Bx (T): "+ str(bx)
js.document.getElementById("msg2").innerHTML = "By (T): "+ str(by)
js.document.getElementById("msg3").innerHTML = "Az (Tm): "+ str(az)