Esempio n. 1
0
def to_undulator_multi_particle(params):
    """Convert multi-particle params to `SRWLMagFldU` and `SRWLMagFldC`

    Adds to params.

    Args:
        params (dict): RT values in canonical form

    Returns:
        pkcollections.OrderedMapping: returns its argument (params)
    """
    res = pkcollections.OrderedMapping()
    harmB = srwlib.SRWLMagFldH()
    harmB.n = params['harmonic_num']
    harmB.B = params['magnetic_field']
    if params['orientation'] == 'VERTICAL':
        harmB.h_or_v = 'v'
    else:
        harmB.h_or_v = 'h'
    res.und = srwlib.SRWLMagFldU([harmB])
    res.und.per = params['period_len']
    res.und.nPer = params['num_periods']
    res.magFldCnt = srwlib.SRWLMagFldC(
        [res.und],
        pkarray.new_double([0]),
        pkarray.new_double([0]),
        pkarray.new_double([0]),
    )
    return res
def simulate():
    t0_setting = time.time()
    B = 0.4
    LeffBM = 4.0
    BM = srw.SRWLMagFldM(B, 1, "n", LeffBM)
    magFldCnt = srw.SRWLMagFldC([BM], pkarray.new_double([0]), pkarray.new_double([0]), pkarray.new_double([0]))
    eBeam = srw.SRWLPartBeam()
    eBeam.Iavg = 0.5
    eBeam.partStatMom1.x = 0.0
    eBeam.partStatMom1.y = 0.0
    eBeam.partStatMom1.z = 0.0
    eBeam.partStatMom1.xp = 0.0
    eBeam.partStatMom1.yp = 0.0
    eBeam.partStatMom1.gamma = 3.0 / 0.51099890221e-03
    eBeam.arStatMom2[0] = 127.346e-06 ** 2
    eBeam.arStatMom2[1] = -10.85e-09
    eBeam.arStatMom2[2] = 92.3093e-06 ** 2
    eBeam.arStatMom2[3] = 13.4164e-06 ** 2
    eBeam.arStatMom2[4] = 0.0072e-09
    eBeam.arStatMom2[5] = 0.8022e-06 ** 2
    eBeam.arStatMom2[10] = 0.89e-03 ** 2
    wfr = srw.SRWLWfr()
    wfr.allocate(1, 10, 10)
    distSrcLens = 5.0
    wfr.mesh.zStart = distSrcLens
    wfr.mesh.eStart = 0.5 * 0.123984
    wfr.mesh.eFin = wfr.mesh.eStart
    horAng = 0.1
    wfr.mesh.xStart = -0.5 * horAng * distSrcLens
    wfr.mesh.xFin = 0.5 * horAng * distSrcLens
    verAng = 0.02
    wfr.mesh.yStart = -0.5 * verAng * distSrcLens
    wfr.mesh.yFin = 0.5 * verAng * distSrcLens
    wfr.partBeam = eBeam
    distLensImg = distSrcLens
    focLen = wfr.mesh.zStart * distLensImg / (distSrcLens + distLensImg)
    optLens = srw.SRWLOptL(_Fx=focLen, _Fy=focLen)
    optDrift = srw.SRWLOptD(distLensImg)
    propagParLens = [1, 1, 1.0, 0, 0, 1.0, 2.0, 1.0, 2.0, 0, 0, 0]
    propagParDrift = [1, 1, 1.0, 0, 0, 1.0, 1.0, 1.0, 1.0, 0, 0, 0]
    optBL = srw.SRWLOptC([optLens, optDrift], [propagParLens, propagParDrift])
    pkdc("parameters done in {}s", round(time.time() - t0_setting))
    meth = 2
    relPrec = 0.01
    zStartInteg = 0
    zEndInteg = 0
    npTraj = 20000
    useTermin = 1
    sampFactNxNyForProp = 0.7
    arPrecSR = [meth, relPrec, zStartInteg, zEndInteg, npTraj, useTermin, sampFactNxNyForProp]
    pkdc("Performing initial electric field calculation...")
    srw.srwl.CalcElecFieldSR(wfr, 0, magFldCnt, arPrecSR)
    pkdc("Extracting intensity from calculated electric field and saving it to file(s)")
    mesh0 = copy.deepcopy(wfr.mesh)
    arI0 = pkarray.new_float([0] * mesh0.nx * mesh0.ny)
    srw.srwl.CalcIntFromElecField(arI0, wfr, 6, 0, 3, mesh0.eStart, 0, 0)
    pkdc("Simulating single-electron electric field wavefront propagation...")
    srw.srwl.PropagElecField(wfr, optBL)
    return wfr
Esempio n. 3
0
def test_new_double():
    d = pkarray.new_double()
    assert 0 == len(d), \
        'new_double without initializer should be empty'
    d = pkarray.new_double([3, 5])
    assert 2 == len(d), \
        'new_double with initializer, should be non-zero'
    assert float(5) == d[1], \
        'new_double should intitialize to a float'
Esempio n. 4
0
def to_undulator_single_particle(params):
    """Convert single particle params to `SRWLMagFldU` and `SRWLMagFldC`

    Adds to params.

    Args:
        params (dict): RT values in canonical form

    Returns:
        pkcollections.OrderedMapping: returns its argument (params)
    """
    res = pkcollections.OrderedMapping()
    res.und = srwlib.SRWLMagFldU(
        [
            srwlib.SRWLMagFldH(
                1,
                'v',
                params['vertical_magnetic_field'],
                params['vertical_phase'],
                params['vertical_symmetry'],
                1,
            ),
            srwlib.SRWLMagFldH(
                1,
                'h',
                params['horizontal_magnetic_field'],
                params['horizontal_phase'],
                params['horizontal_symmetry'],
                1,
            ),
        ],
        params['period_len'],
        params['num_periods'],
    )
    res.magFldCnt = srwlib.SRWLMagFldC(
        [res.und],
        pkarray.new_double([params['horizontal_coord']]),
        pkarray.new_double([params['vertical_coord']]),
        pkarray.new_double([params['longitudinal_coord']]),
    )
    return res
def simulate():
    t0_setting = time.time()
    B = 0.4
    LeffBM = 4.
    BM = srw.SRWLMagFldM(B, 1, 'n', LeffBM)
    magnetic_field_container = srw.SRWLMagFldC(
        [BM],
        pkarray.new_double([0]),
        pkarray.new_double([0]),
        pkarray.new_double([0]),
    )

    eBeam = srw.SRWLPartBeam()
    eBeam.Iavg = 0.5
    eBeam.partStatMom1.x = 0.
    eBeam.partStatMom1.y = 0.
    eBeam.partStatMom1.z = 0.
    eBeam.partStatMom1.xp = 0.
    eBeam.partStatMom1.yp = 0.
    eBeam.partStatMom1.gamma = 3./0.51099890221e-03
    eBeam.arStatMom2[0] = 127.346e-06 ** 2
    eBeam.arStatMom2[1] = -10.85e-09
    eBeam.arStatMom2[2] = 92.3093e-06 ** 2
    eBeam.arStatMom2[3] = 13.4164e-06 ** 2
    eBeam.arStatMom2[4] = 0.0072e-09
    eBeam.arStatMom2[5] = 0.8022e-06 ** 2
    eBeam.arStatMom2[10] = 0.89e-03 ** 2
    wavefront = srw.SRWLWfr()
    wavefront.allocate(1, 10, 10)
    distSrcLens = 5.
    wavefront.mesh.zStart = distSrcLens
    wavefront.mesh.eStart = 0.5 * 0.123984
    wavefront.mesh.eFin = wavefront.mesh.eStart
    horAng = 0.1
    wavefront.mesh.xStart = -0.5 * horAng * distSrcLens
    wavefront.mesh.xFin = 0.5 * horAng * distSrcLens
    verAng = 0.02
    wavefront.mesh.yStart = -0.5 * verAng * distSrcLens
    wavefront.mesh.yFin = 0.5 * verAng * distSrcLens
    wavefront.partBeam = eBeam
    distLensImg = distSrcLens
    focLen = wavefront.mesh.zStart * distLensImg / (distSrcLens + distLensImg)
    optBL = _container(
        srw.SRWLOptL(_Fx=focLen, _Fy=focLen),
        dict(
            horizontal_resolution_factor_when_resizing=2.,
            vertical_resolution_factor_when_resizing=2.,
        ),
        srw.SRWLOptD(distLensImg),
        {},
    )
    pkdc('parameters done in {}s', round(time.time() - t0_setting))
    meth = 2
    relPrec = 0.01
    zStartInteg = 0
    zEndInteg = 0
    npTraj = 20000
    useTermin = 1
    sampFactNxNyForProp = 0.7
    arPrecSR = [meth, relPrec, zStartInteg, zEndInteg, npTraj, useTermin, sampFactNxNyForProp]
    pkdc('Performing initial electric field calculation...')
    srw.srwl.CalcElecFieldSR(wavefront, 0, magnetic_field_container, arPrecSR)
    pkdc('Extracting intensity from calculated electric field and saving it to file(s)')
    mesh0 = copy.deepcopy(wavefront.mesh)
    arI0 = pkarray.new_float([0] * mesh0.nx * mesh0.ny)
    srw.srwl.CalcIntFromElecField(arI0, wavefront, 6, 0, 3, mesh0.eStart, 0, 0)
    pkdc('Simulating single-electron electric field wavefront propagation...')
    srw.srwl.PropagElecField(wavefront, optBL)
    return wavefront