packages = ["numpy","scipy"]

Magnetic Field and Vector Potential from Straight Bar

2025-4-28 (R.2)
Kiyoshi Yoshida
kiyoshi.yoshida@eagle.ocn.ne.jp

Length lx (m)
Length ly (m)
Length lz (m)
Current (MA)
Point x (m)
Point y (m)
Point z (m)
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)