I am writing a program in python that is supposed to calculate the magnetic field along a conducting coil that is made up of a bunch of points, and the magnetic field is generated by other conducting coils which were made by rotating the points that make up the original conducting coil. I have tried doing this using Biot-Savart law (code below), but each coil is made up of ~300 points, and there are 10 coils in total, so my method is called ~810,000 times, but I think creating and subtracting 2 vectors and then crossing them with each iteration makes it take a very long time to run, so I was wondering if someone knows of a more efficient way to do Biot-Savart, or if I should try a different method. Any insight would be very much appreciated, thank you!

My Biot-Savart method:

def biotsav(l,lprev,pointpos,cur,mu0=1e-7):
    #l is the point along the wire generating the magnetic field
    #lprev is the previous point along the wire that generated a magnetic field
    #pointpos is the position where the magnetic field will be measured at
    #cur is the current running through the wire
    #if the point causing the magnetic field is the point where the magnetic field is being measured at, return 0 otherwise it would return infinity
    if l[0] == pointpos[0] and l[1] == pointpos[1] and l[2] == pointpos[2]:
        return np.array([0,0,0])
    dl = np.subtract(l,lprev) #vector going from previous point along wire to current point
    r = np.subtract(pointpos,l) #vector going from point causing magnetic field to point where magnetic field is being measured
    rmag = np.sqrt(r[0]**2 + r[1]**2 + r[2]**2) #magnitude of r
    return mu0*cur*np.cross(dl,r)/(rmag**3) #biot savart equation

The loop where the method is called:

#array that will hold magnetic field values along each point on the coil
Bfield = []

#Caclculates the magnetic field at a point on the TF caused by all points on all coils
for i in range(numpts): #this for loop runs through all points along original coil

    Btemp = [0,0,0] #placeholder array for updating magnetic field measured at a point along original coil

    for j in range(len(allxs)): #this for loop goes through all coils created through symmetry

        for k in range(len(allxs[j])): #this for loop goes through all points along coils created by symmetry
            currentpt = [allxs[j][k],allys[j][k],allzs[j][k]]
            prevpt = [allxs[j][k-1],allys[j][k-1],allzs[j][k-1]]
            coilpt = [xlist[i],ylist[i],zlist[i]]
            Btemp = np.add(Btemp,biotsav(currentpt,prevpt,coilpt,cur)) #adds magnetic field contributions from all points in coils made by symmetry

    Bfield.append(np.array([Btemp[0],Btemp[1],Btemp[2]])) #updates array with net magnetic field measured at point along original coil

**Note: allxs, allys, and allzs are arrays that contain the x, y, and z coordinates of the 9 coils created by symmetry. Also, all coils have equal current running through them

For reference, the red coil is the original coil and the one I want to measure the magnetic field caused by the other 9 white coils along the original coil.enter image description here

  • 1
    $\begingroup$ If all coils have the same shape you need to calculate the magnetic field from one of them only, for the rest use geometric rotation, that's a factor of 10 saving. BTW, if you need the field far away from the coils, the dipole approximation would simplify things a great deal. $\endgroup$ Aug 28 '20 at 4:04
  • $\begingroup$ @MaximUmansky Hi Maxim, thanks for your reply! I did what you suggested and it did reduce the runtime by about 10x, so thank you very much! However, I think I messed something up because elsewhere in my code I plotted the x,y, and z components of the magnetic force on the coil, and they have now changed. I used the same rotation matrix as before, but applied it to the magnetic field instead, but since that didn't change the z components, I was thinking that is the issue. If you could see what I did wrong, it would be much appreciated! [link]gyazo.com/5fa4b001cdb65da76fb2395e582f65be $\endgroup$
    – Mikeb
    Aug 28 '20 at 6:57
  • $\begingroup$ Not sure where the problem is in your code; but the topic of rotating a vector field is discussed in math.stackexchange.com/questions/912070/… and it looks correct there. I suggest implementing the rotation transformation as a separate function and verify and debug first on some simple vector fields. $\endgroup$ Aug 29 '20 at 5:43
  • $\begingroup$ Also, in the picture you have an additional mirror plane. So you can cut the computation time in half again. $\endgroup$
    – Ron
    Aug 31 '20 at 14:06
  • $\begingroup$ @Ron - How would you take advantage of the symmetry plane? I am not sure it would save you anything. $\endgroup$ Sep 5 '20 at 6:39

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Browse other questions tagged or ask your own question.