import os
import warnings
import math
import numpy as np
import matplotlib as mpl
import matplotlib.patches as patches
from matplotlib.path import Path
from matplotlib.collections import PatchCollection
from pleiades import ArbitraryPoints, RectangularCoil, MagnetRing, Device
class TREXCoil(ArbitraryPoints):
"""TREX STUFF"""
_RMIN = 2.00467
_DR = 0.0134166
_DZ = 0.0140625
_COND_AREA = _DR*_DR
_NPTS = 88
_Z_REL_POS = np.linspace(-.105469,.105469, 16)
_R_REL_POS = np.linspace(0, .067083, 6)
_codes = [Path.MOVETO,
Path.LINETO,
Path.LINETO,
Path.LINETO,
Path.CLOSEPOLY]
def __init__(self, z0=1.1, **kwargs):
r = self._RMIN + self._R_REL_POS
z = z0 + self._Z_REL_POS
rz_pts = [(ri, zi) for ri in r[:5] for zi in z]
rz_pts.extend([(r[5], zi) for zi in (z[::2] + z[1::2])/2])
super().__init__(np.array(rz_pts), **kwargs)
@property
def z0(self):
return self._z0
@property
def dr(self):
return self._DR
@property
def dz(self):
return self._DZ
@property
def npts(self):
return self._NPTS
@property
def _verts(self):
rpts, zpts = self._rz_pts[:, 0], self._rz_pts[:, 1]
rmin, rmax = np.amin(rpts) - self._DR/2, np.amax(rpts) + self._DR/2
zmin, zmax = np.amin(zpts) - self._DZ/2, np.amax(zpts) + self._DZ/2
verts = np.array([[rmin, zmin],
[rmin, zmax],
[rmax, zmax],
[rmax, zmin],
[rmin, zmin]])
return verts
@property
def patch(self):
return patches.PathPatch(Path(self._verts, self._codes))
@property
def area(self):
return self._COND_AREA*self._NPTS
@property
def total_current(self):
return self.current*np.sum(self.weights)
@property
def current_density(self):
return self.total_current / self.area
@z0.setter
def z0(self, z0):
delta_z = np.array([0, z0 - self.z0]).reshape((1, 2))
self._rz_pts = self._rz_pts + delta_z
self._z0 = z0
@ArbitraryPoints.rz_pts.setter
def rz_pts(self, rz_pts):
msg = ('rz_pts for TREXCoil must be changed using the z0 attribute')
raise NotImplementedError(msg)
#class Dipole(Component):
# """Internal dipole Magnet comprised of 2 cylindrical SmCo magnets.
#
# Attributes:
# magnets (list): list of Magnet objects comprising this instance
# patches (list of matplotlib.patches.Polygon instances): patches representing the vessel magnets
# """
#
# def __init__(self, **kwargs):
# super(Dipole,self).__init__()
# r0,z0 = kwargs.pop("loc",(0,0))
# muhat = kwargs.pop("muhat",0)
# labels = kwargs.pop("labels",["dipole"])
# nprocs = kwargs.pop("nprocs",[1])
# currents = kwargs.pop("currents",[2901.0])
# patch_mask = kwargs.pop("patch_mask",[0])
# # Build internal dipole magnets
# width = (2.75 / 2 - .125) * .0254
# height = 2.5 / 2 * .0254
# delta = (1.25 / 2 + .125) * .0254
# r1 = r0 + .125 * .0254 + width / 2.0 # + delta*np.sin(np.pi*mu_hat/180.0)
# r2 = r1 # rho0 - delta*np.sin(np.pi*mu_hat/180.0)
# z1 = z0 + delta # *np.cos(np.pi*mu_hat/180.0)
# z2 = z0 - delta # *np.cos(np.pi*mu_hat/180.0)
# m1 = MagnetGroup(rz_pts=[(r1,z1),(r2,z2)],mu_hats=[muhat,muhat],height=height,width=width,current=currents[0],**kwargs)
[docs]class BRB(Device):
"""The Device object representing the Big Red Ball at UW-Madison.
Attributes
----------
hh_n : TREXCoil object
A coil object for the north helmholtz coil
hh_s : TREXCoil object
A coil object for the south helmholtz coil
ltrx_n : RectangularCoil object
A coil for the north LTRX mirror coil
ltrx_s : RectangularCoil object
A coil for the south LTRX mirror coil
mr1 : MagnetRing object
The magnet ring at 87.5 degrees N
mr2 : MagnetRing object
The magnet ring at 82.5 degrees N
mr3 : MagnetRing object
The magnet ring at 77.5 degrees N
mr4 : MagnetRing object
The magnet ring at 72.5 degrees N
mr5 : MagnetRing object
The magnet ring at 67.5 degrees N
mr6 : MagnetRing object
The magnet ring at 62.5 degrees N
mr7 : MagnetRing object
The magnet ring at 57.5 degrees N
mr8 : MagnetRing object
The magnet ring at 52.5 degrees N
mr9 : MagnetRing object
The magnet ring at 47.5 degrees N
mr10 : MagnetRing object
The magnet ring at 42.5 degrees N
mr11 : MagnetRing object
The magnet ring at 37.5 degrees N
mr12 : MagnetRing object
The magnet ring at 32.5 degrees N
mr13 : MagnetRing object
The magnet ring at 27.5 degrees N
mr14 : MagnetRing object
The magnet ring at 22.5 degrees N
mr15 : MagnetRing object
The magnet ring at 17.5 degrees N
mr16 : MagnetRing object
The magnet ring at 12.5 degrees N
mr17 : MagnetRing object
The magnet ring at 7.5 degrees N
mr18 : MagnetRing object
The magnet ring at 2.5 degrees N
mr19 : MagnetRing object
The magnet ring at 2.5 degrees S
mr20 : MagnetRing object
The magnet ring at 7.5 degrees S
mr21 : MagnetRing object
The magnet ring at 12.5 degrees S
mr22 : MagnetRing object
The magnet ring at 17.5 degrees S
mr23 : MagnetRing object
The magnet ring at 22.5 degrees S
mr24 : MagnetRing object
The magnet ring at 27.5 degrees S
mr25 : MagnetRing object
The magnet ring at 32.5 degrees S
mr26 : MagnetRing object
The magnet ring at 37.5 degrees S
mr27 : MagnetRing object
The magnet ring at 42.5 degrees S
mr28 : MagnetRing object
The magnet ring at 47.5 degrees S
mr29 : MagnetRing object
The magnet ring at 52.5 degrees S
mr30 : MagnetRing object
The magnet ring at 57.5 degrees S
mr31 : MagnetRing object
The magnet ring at 62.5 degrees S
mr32 : MagnetRing object
The magnet ring at 67.5 degrees S
mr33 : MagnetRing object
The magnet ring at 72.5 degrees S
mr34 : MagnetRing object
The magnet ring at 77.5 degrees S
mr35 : MagnetRing object
The magnet ring at 82.5 degrees S
mr36 : MagnetRing object
The magnet ring at 87.5 degrees S
"""
def __init__(self):
# Global default patch settings
super().__init__()
# Set TREX HH coil default parameters
z0 = 1.1
patch_kw = {'fc': '.35', 'ec': 'k'}
self.hh_n = TREXCoil(z0, patch_kw=patch_kw)
self.hh_s = TREXCoil(-z0, patch_kw=patch_kw)
# Set LTRX mirror coil default parameters
r0, z0 = 0.185725, 1.6367
dr, dz = 0.010583333, 0.01031667
ltrx_n = RectangularCoil(r0, z0, nr=10, nz=13, dr=dr, dz=dz,
patch_kw=patch_kw)
ltrx_s = RectangularCoil(r0, -z0, nr=10, nz=13, dr=dr, dz=dz,
patch_kw=patch_kw)
self.ltrx_n = ltrx_n
self.ltrx_s = ltrx_s
# Build array of r0, z0, mu_hat values for all 36 magnet rings
centroid_radius = 1.514475
theta = np.linspace(7.5, 172.5, 34)
rzmu = np.empty((36, 3))
rzmu[0, :] = [0.0768, 1.5117, 0.]
rzmu[1:-1, 0] = centroid_radius*np.sin(math.pi*theta/180)
rzmu[1:-1, 1] = centroid_radius*np.cos(math.pi*theta/180)
rzmu[1:-1, 2] = theta + np.mod(np.arange(1, 35), 2)*180
rzmu[-1, :] = [0.0768, -1.5117, 0.]
# Set default magnet cage parameters
mag_kw = {'current': 2710.68, 'height': 0.0254, 'width': 0.0381}
for i, (r0, z0, mu_hat) in enumerate(rzmu):
kwargs = {'r0': r0, 'z0': z0, 'mu_hat': mu_hat}
kwargs.update(mag_kw)
if np.mod(i, 2):
patch_kw = {'fc': 'r'}
else:
patch_kw = {'fc': 'b'}
kwargs['patch_kw'] = patch_kw
setattr(self, f'mr{i+1}', MagnetRing(**kwargs))
def add_cathode(self):
raise NotImplementedError("Can't add cathodes to BRB yet")
def add_anode(self):
raise NotImplementedError("Can't add anode to BRB yet")
def add_sweep(self, center,r,theta1,theta2,width=None,**kwargs):
self.patches.append(patches.Wedge(center,r,theta1,theta2,width=width,**kwargs))