Ejemplo n.º 1
0
def generate_Ring_Lattice(rpBend,
                          rpLens,
                          rpLensFirst,
                          Lm,
                          LLens,
                          parallel=False) -> ParticleTracerLattice:
    tunableDriftGap = 2.54e-2
    assert type(parallel) == bool
    fringeFrac = 1.5
    if LLens - 2 * rpLens * fringeFrac < 0 or LLens - 2 * rpLensFirst * fringeFrac < 0:  # minimum fringe length must be respected
        return None
    PTL_Ring = ParticleTracerLattice(200.0,
                                     latticeType='storageRing',
                                     parallel=parallel)
    rOffsetFact = PTL_Ring.find_Optimal_Offset_Factor(
        rpBend, 1.0, Lm,
        parallel=parallel)  # 25% of time here, 1.0138513851385138
    if rOffsetFact is None:
        return None
    PTL_Ring.add_Drift(tunableDriftGap / 2, ap=rpLens)
    PTL_Ring.add_Halbach_Lens_Sim(rpLens, LLens)
    PTL_Ring.add_Drift(tunableDriftGap / 2, ap=rpLens)
    PTL_Ring.add_Halbach_Lens_Sim(rpLens, LLens)
    PTL_Ring.add_Combiner_Sim_Lens(.2, .02)
    PTL_Ring.add_Halbach_Lens_Sim(rpLensFirst, LLens)
    PTL_Ring.add_Drift(tunableDriftGap / 2)
    PTL_Ring.add_Halbach_Lens_Sim(rpLens, LLens)
    PTL_Ring.add_Drift(tunableDriftGap / 2)
    PTL_Ring.add_Halbach_Bender_Sim_Segmented_With_End_Cap(
        Lm, rpBend, None, 1.0, rOffsetFact=rOffsetFact)
    # PTL_Ring.add_Halbach_Lens_Sim(rpLens,None,constrain=True)
    # PTL_Ring.add_Drift(probeSpace)
    PTL_Ring.add_Halbach_Lens_Sim(rpLens, None, constrain=True)
    PTL_Ring.add_Halbach_Bender_Sim_Segmented_With_End_Cap(
        Lm, rpBend, None, 1.0, rOffsetFact=rOffsetFact)
    PTL_Ring.end_Lattice(enforceClosedLattice=True,
                         constrain=True)  # 17.8 % of time here
    return PTL_Ring
def generate_Ring_Lattice(rpLens,rpLensFirst,rpLensLast,rpBend,L_Lens,
                          LmCombiner, rpCombiner,loadBeamDiam,tuning)->ParticleTracerLattice:
    tunableDriftGap=2.54e-2
    jeremyGap=.05
    Lm=.0254/2.0
    lastGap=5e-2
    fringeFrac=1.5
    if L_Lens-2*rpLens*fringeFrac<0 or L_Lens-2*rpLensFirst*fringeFrac<0 or L_Lens-2*rpLensLast*fringeFrac<0:
        # minimum fringe length must be respected
        return None
    PTL_Ring=ParticleTracerLattice(V0,latticeType='storageRing')
    if abs(rpBend-1e-2)<SMALL_NUMBER and abs(Lm-.0254/2.0)<SMALL_NUMBER:
        rOffsetFact = 1.0106
    else:
        # rOffsetFact=PTL_Ring.find_Optimal_Offset_Factor(rpBend,1.0,Lm)
        raise ValueError
    if rOffsetFact is None:
        return None
    if tuning=='spacing':
        PTL_Ring.add_Drift(tunableDriftGap/2)
        PTL_Ring.add_Halbach_Lens_Sim(rpLens,L_Lens)
        PTL_Ring.add_Drift(tunableDriftGap/2)
    PTL_Ring.add_Halbach_Lens_Sim(rpLensLast,L_Lens)
    PTL_Ring.add_Drift(lastGap)
    PTL_Ring.add_Combiner_Sim_Lens(LmCombiner,rpCombiner,loadBeamDiam=loadBeamDiam)
    PTL_Ring.add_Drift(jeremyGap)
    PTL_Ring.add_Halbach_Lens_Sim(rpLensFirst,L_Lens)
    if tuning=='spacing':
        PTL_Ring.add_Drift(tunableDriftGap/2)
        PTL_Ring.add_Halbach_Lens_Sim(rpLens,L_Lens)
        PTL_Ring.add_Drift(tunableDriftGap/2)
    PTL_Ring.add_Halbach_Bender_Sim_Segmented_With_End_Cap(Lm,rpBend,None,1.0,rOffsetFact=rOffsetFact)
    PTL_Ring.add_Halbach_Lens_Sim(rpLens,None,constrain=True)
    PTL_Ring.add_Halbach_Bender_Sim_Segmented_With_End_Cap(Lm,rpBend,None,1.0,rOffsetFact=rOffsetFact)
    PTL_Ring.end_Lattice(enforceClosedLattice=True,constrain=True)  # 17.8 % of time here
    return PTL_Ring
def generate_Lattice(configuration):
    #a variety of lattice configurations are tested
    if configuration == '1':
        PTL = ParticleTracerLattice(200.0, latticeType='storageRing')
        PTL.add_Drift(.25)
        PTL.add_Halbach_Bender_Sim_Segmented_With_End_Cap(.0254,
                                                          .01,
                                                          150,
                                                          1.0,
                                                          0.0,
                                                          rOffsetFact=1.015)
        PTL.add_Lens_Ideal(1.0, 1.0, .01)
        PTL.add_Halbach_Lens_Sim(.01, 1.0)
        PTL.add_Drift(.1)
        PTL.end_Lattice(constrain=False,
                        surpressWarning=True,
                        enforceClosedLattice=False)
    elif configuration in ('2', '5'):
        PTL = ParticleTracerLattice(200.0, latticeType='injector')
        PTL.add_Drift(.25)
        PTL.add_Halbach_Lens_Sim(.01, .5)
        PTL.add_Drift(.1)
        if configuration == '2':
            PTL.add_Combiner_Sim('combinerV3.txt')
        else:
            PTL.add_Combiner_Sim_Lens(.1, .02)
        PTL.add_Halbach_Lens_Sim(.01, .5)
        PTL.end_Lattice()
    elif configuration == '3':
        PTL = ParticleTracerLattice(200.0, latticeType='storageRing')
        PTL.add_Lens_Ideal(1.0, 1.0, .01)
        PTL.add_Bender_Ideal(np.pi, 1.0, 1.0, .01)
        PTL.add_Lens_Ideal(1.0, 1.0, .01)
        PTL.add_Bender_Ideal(np.pi, 1.0, 1.0, .01)
        PTL.end_Lattice()
    elif configuration in ('4', '6'):
        PTL = ParticleTracerLattice(200.0, latticeType='storageRing')
        PTL.add_Halbach_Lens_Sim(.01, .5)
        if configuration == '4':
            PTL.add_Combiner_Sim('combinerV3.txt')
        else:
            PTL.add_Combiner_Sim_Lens(.1, .02)
        PTL.add_Halbach_Lens_Sim(.01, .5)
        PTL.add_Halbach_Bender_Sim_Segmented_With_End_Cap(.0254 / 2,
                                                          .01,
                                                          None,
                                                          1.0,
                                                          0.0,
                                                          rOffsetFact=1.015)
        PTL.add_Halbach_Lens_Sim(.01, None, constrain=True)
        PTL.add_Halbach_Bender_Sim_Segmented_With_End_Cap(.0254 / 2,
                                                          .01,
                                                          None,
                                                          1.0,
                                                          0.0,
                                                          rOffsetFact=1.015)
        PTL.end_Lattice(enforceClosedLattice=True, constrain=True)
        PTL.elList[0].fieldFact = .3
        PTL.elList[2].fieldFact = .3
    else:
        raise Exception('no proper configuration name provided')
    return PTL