Source code for coilpy.magnet

import numpy as np
from .misc import div0


[docs]class Magnet(object): """Cube magnet class used for subdividing magnets""" def __init__(self, vertices=[[]], mvec=[0, 0, 1], Br=1.4): """Constructor Args: vertices (list, optional): Vertices for the prism, shape in (8,3). Defaults to [[]]. mvec (list, optional): The magnetic moment direction (will be self-normalized). Defaults to [0, 0, 1]. Br (float, optional): Magnetic remanence in Tesla. Defaults to 1.4. """ self.vertices = np.array(vertices) # (8,3) self.mvec = div0(np.array(mvec), np.linalg.norm(mvec)) self.Br = Br self.center = np.mean(self.vertices, axis=0) self.sides = np.array( [ np.linalg.norm(self.vertices[0, :] - self.vertices[1, :]), np.linalg.norm(self.vertices[1, :] - self.vertices[2, :]), np.linalg.norm(self.vertices[0, :] - self.vertices[4, :]), ] ) self.vol = self.sides[0] * self.sides[1] * self.sides[2] self.mm = self.Br / (4 * np.pi * 1e-7) * self.vol return
[docs] def divide(self): """Divide the prism into eight dipoles. Returns: coilpy.Dipole: Dipole objects """ from .dipole import Dipole mid_points = (self.vertices + self.center) / 2 mxyz = self.mm / 8 * self.mvec dp = Dipole( ox=np.ascontiguousarray(mid_points[:, 0]), oy=np.ascontiguousarray(mid_points[:, 1]), oz=np.ascontiguousarray(mid_points[:, 2]), mx=mxyz[0] * np.ones(8), my=mxyz[1] * np.ones(8), mz=mxyz[2] * np.ones(8), ) return dp
[docs] def sub_cubes(self): """Subdivide a prism into 8 cubes. Returns: list: A list of 8 Magnets """ new_vertices = [] first = [ 0, 2, 2, 0, 4, 6, 6, 4, 0, 1, 2, 3, 0, 1, 0, 2, 1, 4, ] second = [ 1, 1, 3, 3, 5, 5, 7, 7, 4, 5, 6, 7, 7, 6, 5, 7, 3, 6, ] for i, j in zip(first, second): new_vertices.append((self.vertices[i, :] + self.vertices[j, :]) / 2) points = np.concatenate( [self.vertices, new_vertices, self.center[np.newaxis, :]] ) index = [ [0, 8, 24, 11, 16, 22, 26, 20], [11, 24, 10, 3, 20, 26, 23, 19], [8, 1, 9, 24, 22, 17, 21, 26], [24, 9, 2, 10, 26, 21, 18, 23], [16, 22, 26, 20, 4, 12, 25, 15], [20, 26, 23, 19, 15, 25, 14, 7], [22, 17, 21, 26, 12, 5, 13, 25], [26, 21, 18, 23, 25, 13, 6, 14], ] cubes = [] for ind in index: cubes.append(Magnet(vertices=points[ind, :], mvec=self.mvec, Br=self.Br)) return cubes
[docs]def corner2magnet(corner_file, moment_file, Br=1.4, reset=False): """Corner file to Magnet objects Args: corner_file (str): *_corner.csv file. moment_file (str): *_moments.csv file Br (float, optional): Magnetic remanence. Defaults to 1.4. reset (bool, optional): If reset the magnetic remanence based on Br. Defaults to False. Returns: list: A list of 8 Magnet objects """ import pandas as pd corner = pd.read_csv(corner_file, header=None) moment = pd.read_csv(moment_file, header=None) num = len(corner.index) assert num == len(moment.index), "The two files should be consistent." mags = [] for i in range(num): vert = np.reshape(corner.iloc[i].to_numpy(), [8, 3]) m = moment.iloc[i][3:6] one = Magnet( [ vert[0, :], vert[1, :], vert[5, :], vert[4, :], vert[3, :], vert[2, :], vert[6, :], vert[7, :], ], Br=Br, mvec=m, ) if reset: one.mm = np.linalg.norm(m) one.Br = one.mm / one.vol * (4 * np.pi * 1e-7) mags.append(one) return mags