packages = ["numpy","scipy"]

Magnetic Field and Vector Potential from Circular Wire Ring

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

Radius (m)
Current (MA)
Radial Position (m)
Axial Position (m)
from pyscript import document, display import js from scipy.special import ellipk, ellipe from numpy import abs, pi, sqrt, sin, cos, arctan2 small_dist = 1.00e-6 def ba_wirecir(r, z, i, ra): # Smythe cn = i*1.0e-7 if r < small_dist: # on axis at = 0.0 br = 0.0 bz = 2.0*cn*pi*ra**2 / (z**2 + ra**2)**1.5 else: if r==ra: r= ra - small_dist a2 = (ra + r)**2 + z**2 a1 = sqrt(a2) b2 = (ra - r)**2 + z**2 k2 = 4.0*r*ra/a2 k1 = sqrt(k2) km = float(ellipk(k2)) # K(m): Complete elliptic integral 1st em = float(ellipe(k2)) # E(m): Complete elliptic integral 2nd at = 4.0*cn/k1*sqrt(ra/r)*((1 - k2*0.50)*km - em) br = 2.0*cn*z/(r*a1)*(-km + (ra**2 + r**2 + z**2)/b2*em) bz = 2.0*cn/a1*(km + (ra**2 - r**2 - z**2)/b2*em) return br, bz, at def bacalc(event): ia = float(js.document.getElementById("current").value)*1.0e6 ra= float(js.document.getElementById("radius").value) r = float(js.document.getElementById("radial").value) z = float(js.document.getElementById("axial").value) br, bz, at = ba_wirecir(r, z, ia, ra) js.document.getElementById("msg1").innerHTML = "Br (T): "+ str(br) js.document.getElementById("msg2").innerHTML = "Bz (T): "+ str(bz) js.document.getElementById("msg3").innerHTML = "At (Tm): "+ str(at) 以下にPython Codeを示す。
# BA Wire Circle
# 2025-4-25 Kiyoshi Yoshida
from scipy.special import ellipk, ellipe
from numpy import abs, pi, sqrt, sin, cos, arctan2
small_dist = 1.00e-6

def main():
  print("Magnetic Field and Vector Potential from Circular Wire Ring")
  ra=0.5; ia0=1.0; rp=0.01; zp=0.01
  while True:
    ia0 = inpfuncf("Current (MA), stop<0", ia0)
    if ia0 <0: break
    ra = inpfuncf("Radius (m)", ra)
    rp = inpfuncf("rp (m)", rp)
    zp = inpfuncf("zp (m)", zp)
    ia= ia0*1.0e6
    br, bz, at = ba_wirecir(rp, zp, ia, ra)
    print("Br (T): {:.6f}".format(br))    
    print("Bz (T): {:.6f}".format(bz))    
    print("At (Tm): {:6f}".format(at))    

def ba_wirecir(r, z, i, ra):  # Smythe
  cn = i*1.0e-7
  if r < small_dist:    # on axis
    at = 0.0
    br = 0.0
    bz = 2.0*cn*pi*ra**2 / (z**2 + ra**2)**1.5
  else:
    if r==ra:
      r= ra - small_dist
    a2 = (ra + r)**2 + z**2
    a1 = sqrt(a2)
    b2 = (ra - r)**2 + z**2
    k2 = 4.0*r*ra/a2
    k1 = sqrt(k2)
    km = float(ellipk(k2))   # K(m): Complete elliptic integral 1st
    em = float(ellipe(k2))   # E(m): Complete elliptic integral 2nd
    at = 4.0*cn/k1*sqrt(ra/r)*((1 - k2*0.50)*km - em)
    br = 2.0*cn*z/(r*a1)*(-km + (ra**2 + r**2 + z**2)/b2*em)
    bz = 2.0*cn/a1*(km + (ra**2 - r**2 - z**2)/b2*em)
  return br, bz, at

# keyboard input float
def inpfuncf(msg,x):
  s=input(msg+" : "+str(x)+" : ")
  if s=='':
    y=x
  else:  
    y=float(s)
  return y

if __name__ == "__main__":
  main()