示例#1
0
def apply_bevel(g_id, beam_dir, gap_dir, trans_dir, obj_ctr, obj_size, bevel):

    b = numpy.array(beam_dir)
    g = numpy.array(gap_dir)
    x = numpy.array(trans_dir)
    sz = numpy.array(obj_size)
    ctr = numpy.array(obj_ctr)
    e = int(bevel.edge)
    half_size = sz / 2
    corner = ctr + half_size * [-x + g + b, x + g + b, x - g + b, -x - g + b][e]
    trans_offset = bevel.amountTrans * x * [1, -1, -1, 1][e]
    gap_offset = bevel.amountGap * g * [-1, -1, 1, 1][e]

    v = trans_offset - gap_offset
    vx2 = numpy.dot(trans_offset, trans_offset)
    vg2 = numpy.dot(gap_offset, gap_offset)
    v2 = numpy.dot(v, v)

    plane = x * [-1, 1, 1, -1][e] * numpy.sqrt(vg2 / v2) + g * [1, 1, -1, -1][e] * numpy.sqrt(vx2 / v2)
    pt = corner + trans_offset

    # object id, plane normal, point in plane - returns a new id in an array for some reason
    return radia.ObjCutMag(g_id, pt.tolist(), plane.tolist())[0]
示例#2
0
def HybridUndCenPart(_gap,
                     _gap_ofst,
                     _nper,
                     _air,
                     _lp,
                     _ch_p,
                     _np,
                     _np_tip,
                     _mp,
                     _cp,
                     _lm,
                     _ch_m_xz,
                     _ch_m_yz,
                     _ch_m_yz_r,
                     _nm,
                     _mm,
                     _cm,
                     _use_ex_sym=False):
    zer = [0, 0, 0]
    grp = rad.ObjCnt([])

    y = _lp[1] / 4
    initM = [0, -1, 0]

    pole = rad.ObjFullMag([_lp[0] / 4, y, -_lp[2] / 2 - _gap / 2 - _ch_p],
                          [_lp[0] / 2, _lp[1] / 2, _lp[2]], zer,
                          [_np[0], int(_np[1] / 2 + 0.5), _np[2]], grp, _mp,
                          _cp)

    if (_ch_p > 0.):  # Pole Tip
        poleTip = rad.ObjThckPgn(
            _lp[0] / 4, _lp[0] / 2,
            [[y - _lp[1] / 4, -_gap / 2 - _ch_p], [y - _lp[1] / 4, -_gap / 2],
             [y + _lp[1] / 4 - _ch_p, -_gap / 2],
             [y + _lp[1] / 4, -_gap / 2 - _ch_p]], zer)
        rad.ObjDivMag(
            poleTip,
            [_np_tip[0], int(_np_tip[1] / 2 + 0.5), _np_tip[2]])
        rad.MatApl(poleTip, _mp)
        rad.ObjDrwAtr(poleTip, _cp)
        rad.ObjAddToCnt(grp, [poleTip])

    y += _lp[1] / 4 + _air + _lm[1] / 2

    for i in range(_nper):
        magnet = rad.ObjThckPgn(
            _lm[0] / 4, _lm[0] / 2,
            [[y + _lm[1] / 2 - _ch_m_yz_r * _ch_m_yz, -_gap / 2 - _gap_ofst],
             [y + _lm[1] / 2, -_gap / 2 - _gap_ofst - _ch_m_yz],
             [y + _lm[1] / 2, -_gap / 2 - _gap_ofst - _lm[2] + _ch_m_yz],
             [
                 y + _lm[1] / 2 - _ch_m_yz_r * _ch_m_yz,
                 -_gap / 2 - _gap_ofst - _lm[2]
             ],
             [
                 y - _lm[1] / 2 + _ch_m_yz_r * _ch_m_yz,
                 -_gap / 2 - _gap_ofst - _lm[2]
             ], [y - _lm[1] / 2, -_gap / 2 - _gap_ofst - _lm[2] + _ch_m_yz],
             [y - _lm[1] / 2, -_gap / 2 - _gap_ofst - _ch_m_yz],
             [y - _lm[1] / 2 + _ch_m_yz_r * _ch_m_yz, -_gap / 2 - _gap_ofst]],
            initM)
        # Cuting Magnet Corners
        magnet = rad.ObjCutMag(
            magnet, [_lm[0] / 2 - _ch_m_xz, 0, -_gap / 2 - _gap_ofst],
            [1, 0, 1])[0]
        magnet = rad.ObjCutMag(
            magnet, [_lm[0] / 2 - _ch_m_xz, 0, -_gap / 2 - _gap_ofst - _lm[2]],
            [1, 0, -1])[0]

        rad.ObjDivMag(magnet, _nm)
        rad.MatApl(magnet, _mm)
        rad.ObjDrwAtr(magnet, _cm)
        rad.ObjAddToCnt(grp, [magnet])

        initM[1] *= -1
        y += _lm[1] / 2 + _lp[1] / 2 + _air

        if (i < _nper - 1):
            pole = rad.ObjFullMag(
                [_lp[0] / 4, y, -_lp[2] / 2 - _gap / 2 - _ch_p],
                [_lp[0] / 2, _lp[1], _lp[2]], zer, _np, grp, _mp, _cp)

            if (_ch_p > 0.):  # Pole Tip
                poleTip = rad.ObjThckPgn(_lp[0] / 4, _lp[0] / 2,
                                         [[y - _lp[1] / 2, -_gap / 2 - _ch_p],
                                          [y - _lp[1] / 2 + _ch_p, -_gap / 2],
                                          [y + _lp[1] / 2 - _ch_p, -_gap / 2],
                                          [y + _lp[1] / 2, -_gap / 2 - _ch_p]],
                                         zer)
                rad.ObjDivMag(poleTip, _np_tip)
                rad.MatApl(poleTip, _mp)
                rad.ObjDrwAtr(poleTip, _cp)
                rad.ObjAddToCnt(grp, [poleTip])

            y += _lm[1] / 2 + _lp[1] / 2 + _air

    y -= _lp[1] / 4
    pole = rad.ObjFullMag([_lp[0] / 4, y, -_lp[2] / 2 - _gap / 2 - _ch_p],
                          [_lp[0] / 2, _lp[1] / 2, _lp[2]], zer,
                          [_np[0], int(_np[1] / 2 + 0.5), _np[2]], grp, _mp,
                          _cp)
    if (_ch_p > 0.):  # Pole Tip
        poleTip = rad.ObjThckPgn(
            _lp[0] / 4, _lp[0] / 2,
            [[y - _lp[1] / 4, -_gap / 2 - _ch_p],
             [y - _lp[1] / 4 + _ch_p, -_gap / 2], [y + _lp[1] / 4, -_gap / 2],
             [y + _lp[1] / 4, -_gap / 2 - _ch_p]], zer)
        rad.ObjDivMag(
            poleTip,
            [_np_tip[0], int(_np_tip[1] / 2 + 0.5), _np_tip[2]])
        rad.MatApl(poleTip, _mp)
        rad.ObjDrwAtr(poleTip, _cp)
        rad.ObjAddToCnt(grp, [poleTip])

    # Symmetries
    if (
            _use_ex_sym
    ):  # Some "non-physical" mirroring (applicable for calculation of central field only)
        y += _lp[1] / 4
        rad.TrfZerPerp(grp, [0, y, 0], [0, 1, 0])  # Mirror left-right
        rad.TrfZerPerp(grp, [0, 2 * y, 0], [0, 1, 0])

    #     #"Physical" symmetries (applicable also for calculation of total structure with terminations)
    #     rad.TrfZerPerp(grp, zer, [0,1,0]) #Mirror left-right
    #     #Mirror front-back
    #     rad.TrfZerPerp(grp, zer, [1,0,0])
    #     #Mirror top-bottom
    #     rad.TrfZerPara(grp, zer, [0,0,1])

    return grp
示例#3
0
cnt02 = rad.ObjCnt([mag00, mag])

mat = rad.MatLin([1.01, 1.2], [0, 0, 1.3])
#mat = rad.MatStd('NdFeB', 1.2)
rad.MatApl(mag01, mat)
print('Magn. Material index:', mat, ' appled to object:', mag01)

mag00a = rad.ObjFullMag([10,0,40],[12,18,5],[0,0,1],[2,2,2],cnt02,mat,[0.5,0,0])

rad.ObjDrwOpenGL(cnt02)

data_cnt = rad.ObjDrwVTK(cnt02)
print(data_cnt)


objAfterCut = rad.ObjCutMag(mag00a,[10,0,40],[1,1,1]) #,'Frame->Lab')
print('Indexes of objects after cutting:', objAfterCut)
#rad.ObjDrwOpenGL(objAfterCut[0])

print(rad.UtiDmp(mag01, 'asc'))
print(rad.UtiDmp(mat, 'asc'))
#print(rad.UtiDmp(107, 'asc'))

magDpl = rad.ObjDpl(mag, 'FreeSym->False')

print('Number of objects in the container:', rad.ObjCntSize(mag))
print('Number of objects in 2nd container:', rad.ObjCntSize(cnt02))
print('Number of objects in fake container:', rad.ObjCntSize(mag04))

print('Indices of elements in the container:', rad.ObjCntStuf(mag))
print('Indices of elements in the duplicated container:', rad.ObjCntStuf(magDpl))
示例#4
0
def Yoke():
    p0 = [58.527, 294.236]
    p1 = [0, 294.236]
    p2 = [0, 229]
    p3 = [35.75, 229]
    p4 = [35.75, 98]
    p5 = [17.5, 79.75]
    p6 = [17.5, 78.268]
    p9 = [78.268, 17.5]
    p10 = [79.75, 17.5]
    p11 = [98, 32.75]
    p12 = [229, 35.75]
    p13 = [229, 0]
    p14 = [294.236, 0]
    p15 = [294.236, 58.827]

    poly1 = [p0, p1, p2, p3, p4, p5, p6]
    poly4 = [p9, p10, p11, p12, p13, p14, p15]

    #Hyperbolic
    h = 54

    #OC: checking reduced segmentation of the pole tip
    #nStep=21
    nStep = 11

    xmin = 23.2126
    xmax = h / math.sqrt(2)
    xstep = (xmax - xmin) / (nStep - 1)
    ymin = xmin
    ymax = xmax
    ystep = xstep
    xlist = []
    ylist = []
    poly2 = []
    poly3 = []

    for i in range(nStep):
        x = xmin + i * xstep
        y = h * h / x / 2
        poly2.append([x, y])
        i += 1

    for i in range(nStep):
        y = ymax - i * ystep
        x = h * h / y / 2
        poly3.append([x, y])
        i += 1

    #OC
    del poly3[0]

    #OCTEST
    #print(poly1)
    #print(' ')
    #print(poly2)
    #print(' ')
    #print(poly3)
    #print(' ')
    #print(poly4)

    poly = poly1 + poly2 + poly3 + poly4  #2D geometry

    #Triangularization
    newlist = []
    for i in range(len(poly)):
        newlist.append([1, 1])
        i += 1

    poly3D = rad.ObjMltExtTri(100, 200, poly, newlist, 'z', [0, 0, 0],
                              'ki->Numb,TriAngMin->30,TriAreaMax->1000')

    #chamfer
    cham_y = 6.7 + h
    cham_ang = 30 / 180 * math.pi

    pch = [cham_y / math.sqrt(2), cham_y / math.sqrt(2), 200]
    vch = [-1, -1, math.sqrt(2) * math.tan(cham_ang)]

    poly3D = rad.ObjCutMag(poly3D, pch, vch, "Frame->Lab")[0]

    rad.ObjDivMag(poly3D, [[1, 1], [1, 1], [5, 0.2]], 'pln',
                  [[1, 0, 0], [0, 1, 0], [0, 0, 1]], "Frame->LabTot")

    rad.ObjDrwAtr(poly3D, [1, 1, 0], 0.001)

    return poly3D
示例#5
0
    def build(self):
        """Create a quadrupole with the given geometry."""
        if self.solve_state < SolveState.SHAPES:
            self.define_shapes()

        rad.UtiDelAll()
        origin = [0, 0, 0]
        nx = [1, 0, 0]
        ny = [0, 1, 0]
        nz = [0, 0, 1]

        tip_mesh = round(self.min_mesh)
        pole_mesh = round(self.min_mesh * self.pole_mult)
        yoke_mesh = round(self.min_mesh * self.yoke_mult)

        length = self.length

        # Subdivide the pole tip cylindrically. The axis is where the edge of the tapered pole meets the Y-axis.
        points = rotate45(self.tip_points)
        x2, y2 = points[-2]  # top right of pole
        x3, y3 = points[-3]  # bottom right of pole
        m = (y2 - y3) / (x2 - x3)
        c = y2 - m * x2
        pole_tip = rad.ObjThckPgn(length / 2, length, points, "z")
        # Slice off the chamfer (note the indexing at the end here - selects the pole not the cut-off piece)
        pole_tip = rad.ObjCutMag(pole_tip, [length - self.chamfer, 0, self.r], [1, 0, -1])[0]
        n_div = max(1, round(math.sqrt((x2 - x3) ** 2 + (y2 - y3) ** 2) / pole_mesh))
        # We have to specify the q values here (second element of each sublist in the subdivision argument)
        # otherwise weird things happen
        mesh = [[n_div, 4], [tip_mesh / 3, 1], [tip_mesh, 1]]
        div_opts = 'Frame->Lab;kxkykz->Size'
        # rad.ObjDivMag(pole_tip, [[tip_mesh, 1], [tip_mesh, 1], [tip_mesh, 3]], div_opts)
        rad.ObjDivMag(pole_tip, mesh, "cyl", [[[0, c, 0], nz], nx, 1], div_opts)
        rad.TrfOrnt(pole_tip, rad.TrfRot(origin, nz, -math.pi / 4))

        pole = rad.ObjThckPgn(length / 2, length, rotate45(self.pole_points), "z")
        rad.ObjDivMag(pole, [pole_mesh, ] * 3, div_opts)
        rad.TrfOrnt(pole, rad.TrfRot(origin, nz, -math.pi / 4))

        # Need to split yoke since Radia can't build concave blocks
        points = rotate45(self.yoke_points[:2] + self.yoke_points[-2:])
        # yoke1 is the part that joins the pole to the yoke
        # Subdivide this cylindrically since the flux goes around a corner here
        # The axis is the second point (x1, y1)
        x1, y1 = points[1]
        yoke1 = rad.ObjThckPgn(length / 2, length, points, "z")
        cyl_div = [[[x1, y1, 0], nz], [self.width, self.width, 0], 1]
        # The first (kr) argument, corresponding to radial subdivision,
        # in rad.ObjDivMag cuts by number not size even though kxkykz->Size is specified.
        # So we have to fudge this. It seems to require a larger number to give the right number of subdivisions.
        n_div = max(1, round(2 * self.width / yoke_mesh))
        rad.ObjDivMag(yoke1, [n_div, yoke_mesh, yoke_mesh], "cyl", cyl_div, div_opts)
        rad.TrfOrnt(yoke1, rad.TrfRot(origin, nz, -math.pi / 4))

        # For the second part of the yoke, we use cylindrical subdivision again. But the axis is not on the corner;
        # instead we calculate the point where the two lines converge (xc, yc).
        points = self.yoke_points[1:3] + self.yoke_points[-3:-1]
        x0, y0 = points[0]
        x1, y1 = points[1]
        x2, y2 = points[2]
        x3, y3 = points[3]
        m1 = (y3 - y0) / (x3 - x0)
        m2 = (y2 - y1) / (x2 - x1)
        c1 = y0 - m1 * x0
        c2 = y1 - m2 * x1
        xc = (c2 - c1) / (m1 - m2)
        yc = m1 * xc + c1
        yoke2 = rad.ObjThckPgn(length / 2, length, points, 'z')
        cyl_div = [[[xc, yc, 0], nz], [x3 - xc, y3 - yc, 0], 1]
        n_div = max(1, round(0.7 * n_div))  # this is a bit of a fudge
        rad.ObjDivMag(yoke2, [n_div, yoke_mesh, yoke_mesh], "cyl", cyl_div, div_opts)

        yoke3 = rad.ObjThckPgn(length / 2, length, self.yoke_points[2:6], "z")
        rad.ObjDivMag(yoke3, [yoke_mesh, ] * 3, div_opts)

        steel = rad.ObjCnt([pole_tip, pole, yoke1, yoke2, yoke3])
        rad.ObjDrwAtr(steel, [0, 0, 1], 0.001)  # blue steel
        rad.TrfOrnt(steel, rad.TrfRot(origin, ny, -math.pi / 2))
        rad.ObjDrwOpenGL(steel)
        rad.TrfOrnt(steel, rad.TrfRot(origin, ny, math.pi / 2))
        # rad.TrfMlt(steel, rad.TrfPlSym([0, 0, 0], [1, -1, 0]), 2)  # reflect along X=Y line to create a quadrant
        rad.TrfZerPerp(steel, origin, [1, -1, 0])
        rad.TrfZerPerp(steel, origin, nz)
        steel_material = rad.MatSatIsoFrm([2000, 2], [0.1, 2], [0.1, 2])
        steel_material = rad.MatStd('Steel42')
        steel_material = rad.MatSatIsoFrm([959.703184, 1.41019852], [33.9916543, 0.5389669], [1.39161186, 0.64144324])
        rad.MatApl(steel, steel_material)

        coil = rad.ObjRaceTrk(origin, [5, 5 + self.coil_width],
                              [self.coil_x * 2 - self.r, length * 2], self.coil_height, 4, self.current_density)
        rad.TrfOrnt(coil, rad.TrfRot(origin, nx, -math.pi / 2))
        rad.TrfOrnt(coil, rad.TrfTrsl([0, self.r + self.taper_height + self.coil_height / 2, 0]))
        rad.TrfOrnt(coil, rad.TrfRot(origin, nz, -math.pi / 4))
        rad.ObjDrwAtr(coil, [1, 0, 0], 0.001)  # red coil
        quad = rad.ObjCnt([steel, coil])

        rad.TrfZerPara(quad, origin, nx)
        rad.TrfZerPara(quad, origin, ny)

        # rad.ObjDrwOpenGL(quad)
        self.radia_object = quad
        self.solve_state = SolveState.BUILT
示例#6
0
def Geom():

    #Pole faces
    rap = 0.5
    ct = [0, 0, 0]
    z0 = gap / 2
    y0 = width / 2
    amax = hyp * asinh(y0 / z0)
    dz = z0 * (cosh(amax) - 1)
    aStep = amax / np
    na = int(amax * (1 + 2 / np) / aStep) + 1
    qq = [[(z0 * sinh(ia * aStep / hyp)), (z0 * cosh(ia * aStep))]
          for ia in range(na)]
    hh = qq[np][1] + height * rap - dz
    qq[np + 1] = [qq[np][0], hh]
    qq[np + 2] = [0, hh]
    g1 = rad.ObjThckPgn(thick / 4, thick / 2, qq)
    rad.ObjDivMag(g1, n1)

    #Vertical segment on top of pole faces
    g2 = rad.ObjRecMag(
        [thick / 4, width / 4, gap / 2 + height * (1 / 2 + rap / 2)],
        [thick / 2, width / 2, height * (1 - rap)])
    rad.ObjDivMag(g2, n2)

    #Corner
    gg = rad.ObjCnt([g1, g2])
    gp = rad.ObjCutMag(gg, [thick / 2 - chamfer - gap / 2, 0, 0],
                       [1, 0, -1])[0]
    g3 = rad.ObjRecMag([thick / 4, width / 4, gap / 2 + height + depth / 2],
                       [thick / 2, width / 2, depth])
    cy = [[[0, width / 2, gap / 2 + height], [1, 0, 0]],
          [0, 0, gap / 2 + height], 2 * depth / width]
    rad.ObjDivMag(g3, [nr3, np3, nx], 'cyl', cy)

    #Horizontal segment between the corners
    tan_n = tan(2 * pi / 2 / Nn)
    length = tan_n * (height + gap / 2) - width / 2
    g4 = rad.ObjRecMag(
        [thick / 4, width / 2 + length / 2, gap / 2 + height + depth / 2],
        [thick / 2, length, depth])
    rad.ObjDivMag(g4, n4)

    #The other corner
    posy = width / 2 + length
    posz = posy / tan_n
    g5 = rad.ObjThckPgn(thick / 4, thick / 2,
                        [[posy, posz], [posy, posz + depth],
                         [posy + depth * tan_n, posz + depth]])
    cy = [[[0, posy, posz], [1, 0, 0]], [0, posy, posz + depth], 1]
    rad.ObjDivMag(g5, [nr5, np5, nx], 'cyl', cy)

    #Generation of the coil
    Rmax = Rmin - width / 2 + gap / 2 + offset - 2
    coil1 = rad.ObjRaceTrk([0, 0, gap / 2 + height / 2 + offset / 2],
                           [Rmin, Rmax], [thick, width - 2 * Rmin],
                           height - offset, 3, CurDens)
    rad.ObjDrwAtr(coil1, coilcolor)
    hh = (height - offset) / 2
    coil2 = rad.ObjRaceTrk([0, 0, gap / 2 + height - hh / 2],
                           [Rmax, Rmax + hh * 0.8], [thick, width - 2 * Rmin],
                           hh, 3, CurDens)
    rad.ObjDrwAtr(coil2, coilcolor)

    #Make container, set the colors and define symmetries
    g = rad.ObjCnt([gp, g3, g4, g5])
    rad.ObjDrwAtr(g, ironcolor)
    gd = rad.ObjCnt([g])

    rad.TrfZerPerp(gd, ct, [1, 0, 0])
    rad.TrfZerPerp(gd, ct, [0, 1, 0])

    t = rad.ObjCnt([gd, coil1, coil2])
    rad.TrfZerPara(t, ct, [0, cos(pi / Nn), sin(pi / Nn)])

    rad.TrfMlt(t, rad.TrfRot(ct, [1, 0, 0], 4 * pi / Nn), int(round(Nn / 2)))
    rad.MatApl(g, ironmat)
    rad.TrfOrnt(t, rad.TrfRot([0, 0, 0], [1, 0, 0], pi / Nn))

    return t