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
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'
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