Installation on macOS requires a suitable compiler and dependencies, which can be provided by MacPorts. With a working MacPorts, install these:
sudo port install gcc12
sudo port select gcc mp-gcc12
sudo port install hdf5 +openmpi
sudo port install fftw-3
Then build Genesis:
cmake -S . -B build -DCMAKE_BUILD_TYPE=Release
cmake --build build
Genesis supports now the automatic configuration with CMAKE. Following commands will build Genesis from source on Linux platforms. The minimal command to compile the code from the source code root directory is:
mkdir build
chdir build
cmake -DCMAKE_BUILD_TYPE=Release ..
make
Depending on your compiler and system configuration, additional information may be given to CMAKE. Most important is the used compiler. This can be done with the additional definition -DCMAKE_CXX_COMPILER=####
in the cmake command overwriting the default compiler, where ###
is the compiler, e.g. mpicxx
or CC
. If debugging is needed the CMAKE_BUILD_TARGET should be changed to Debug
. The executable is found in the build directory. For a successful build the libraries openmpi/mpich and parallel HDF5 are needed. The FFTW3 is recommended but might become mandatory in upcoming releases.
To complete the installation it is recommended to install the scripts in the directory sdds2hdf
in a directory (e.g. /bin), which is included in your search path. The files will convert Elegant output distribution into HDF5 format. More info can be found later in the manual. Also, the directory xgenesis
includes some functions, which allows Matlab to parse the output file of Genesis and to plot the results. They are not required for running Genesis itself. To use them add the given folder to your Matlab Path or place the file in a directory, which is already in the search path.
Genesis 1.3 is a command line executable and requires at least a single input argument, which is the filename of the input deck:
genesis4 [-o output-rootname] [-l lattice-filename] [-s seed] input-filename
The arguments for the lattice filename, the rootname for all output filenames and the seed for the random number generator are optional. If defined, they act as the default values in the setup
namelist and thus can be omitted in the main input file. Any further information must be provided within the input deck. Starting Genesis in this way will effectively invoke a parallel job with only one single core. To start the code with just more than one core the launching command mpirun
needs to be called, including the number of cores. In its simplest call it would be:
mpirun -np xxx genesis4 [-o output-rootname] [-l lattice-filename] [-s seed] input-filename
where xxx is the number of cores to be requested.
Once Genesis started, the master core, which is the core with the MPI rank 0, will provide the output to stdout
. The output can vary for different input decks. Normally it is reported, once the code generates or alters particle distributions or the radiation field, tracks the beam through the lattice or when a time window is specified.
The execution produces output files whenever a tracking command is issued or a field or particle dumped is requested. All in common is the root filename which is defined in the input deck. Normal output files have the extension .out.h5
for the first tracking or .Runxxx.out.h
for the xxxth run (except for the first, where the addition of ’Run’ is omitted). The file format is HDF5. The explicit format is described in a later chapter of this manual. Field or particle dumps are using the root filename as well as the default but under certain circumstances this behavior can be overruled. For more information see the corresponding namelist elements in the dedicated chapter.
For time-dependent simulations the code requires a large amount of memories to keep the entire radiation field and particle distribution in memory. This is the significant difference to previous versions where the code was able to progress through the bunch sequentially. However this excluded features such long range space charge fields, exchanging particles between slices, and large delaying chicanes in the older versions. For an estimate of the memory demand the radiation field requires
Nb=ns*ng*ng*16 Bytes,
where ns is the number of slices and ng the number of grid points.
For the electron distribution it is
Nb=ns*ne*48 Bytes,
with ne the number of macro particles per slice. Both numbers should be added up and for safety multiplied by a factor of 2 for some overhead (aligning arrays in memory, temporary working arrays, arrays to buffer the output information etc.). The memory request will be distributed over the nodes. Non time-dependent simulation should be small enough to run on any computer.
In time-dependent runs the number of slices are equally distributed over all cores. The number of slices are even increased to guarantee symmetry, extending the time-window of the simulations. More information about that can be found in the next section. Often it is useful to calculate the number of generated slices in advance, in particular if advanced option such as subharmonic conversion are used. In the case of subharmonic conversion the slices per core should be an integer of the subharmonic number. Otherwise artefacts of numerically enhanced bunching causes wrong results.
Unlike older version, which supported only a single namelist as input, the latest version splits up the namelist and processes them sequentially as they appear in the file. Therefore the order is important, e.g. you cannot define a time window after the electron beam or the field has been already generated. On the other hand the code supports multiple tracking in one run. For that the particle and field distribution is kept in memory and then reused in the next tracking. If a fresh bunch is required the old has to be discarded and then a new one has to be generated. In that sense it is possible to combine steady-state and time-dependent run in one input deck by the sequence: generate field, generate beam, track, define time window, generate beam, generate field, and track.
The namelists themselves always start with the ampersand &
and the name of the name list and are terminated with &end
. Each line consists out of an assignment of a supported variable, e.g npart = 2048
in the namelist &setup
. Empty lines and lines, starting with the pound symbol #
are ignored. If the same variable occurs more than once the latest occurrence is used for the calculation. If Genesis encounters a variable name, which it does not recognize it stops execution and prints out a list of the supported variables.
The following describes all supported namelist with their variables, including its required format and default value.
The namelist setup
is a mandatory namelist and should be the first in the input deck. It contains the basic parameters to control the simulations. It can only be called once. If the user want to change some parameter the namelist alter_setup
should be used.
rootname
(string, <empty>): The basic string, with which all output files will start, unless the output filename is directly overwritten (see write
namelist)outputdir
(string, <empty>): Output directory name.lattice
(string, <empty>): The name of the file which contains the undulator lattice description. This can also include some relative paths if the lattice file is not in the same directory as the input file.beamline
(string, <empty>): The name of the beamline, which has to be defined within the lattice file. For more information on the lattice file, see the next chapter.gamma0
(double, 11350.3): The reference energy in unites of the electron rest mass. This is the reference energy which is used in the code at various place, mostly in the calculation of the matching condition, the reference focusing strength of quadrupoles and undulator as well as the default value if an electron distribution is generated.lambda0
(double, 1e-10): The reference wavelength in meter, which is used as the wavelength in steady-state simulation or for defining the sample distance in time-dependent runs. It also acts as the default value when field distributions are generated.delz
(double, 0.015): Preferred integration stepsize in meter. Note that this is not a strict value because Genesis tries to optimized the stepsize according to the elements it can resolve. E.g. if an undulator is 1.99 m long but the preferred stepsize is 2 cm than it uses a stepsize which is the closest to preserve the number of integration step. In this case the preferred stepsize gives 99.5 steps which is than rounded to 100 and thus resulting in an actual stepsize of 1.99 cm. Note that outside of the undulator, which are free drifts for the radiation field, Genesis progresses the electron beam and radiation field in larger steps, namely one step per resolved element (drift, quadrupole, phase shifter).seed
(int, 123456789): Seed to initialize the random number generator, which is used for shot noise calculation and undulator lattice errors, though it is recommended that the random number generator seed is redefined explicitly for undulator errors in its corresponding namelist.npart
(int, 8192): Number of macro particles per slice. Note that the number must be a multiple of the used bins nbins
otherwise Genesis will exit with an error. If one-for-one simulations are used, this parameter has no meaning.nbins
(int, 4): Number of macro particles, which are grouped into beamlets for gener ating the correct shot noise. For one-for-one simulations this parameter has no meaningone4one
(bool, false): Flag to enable or disable resolving each electron in the simulation. This is mandatory for certain features, such as sorting or slicing of particle distributions. If set to true
other parameters such as npart
and nbins
are obsolete and do not need to be defined. It is recommended to estimate the number of electrons, which are generated in the simulations, because this can easily required memory beyond what is available on the computer.shotnoise
(bool, true): Flag to enable the calculation of shotnoise per each slice during generation of the electron distribution. It is recommended to set the value to false
for steady-state or scan simulations.beam_global_stat
(bool, false): Flag to enable extra output of beam parameters of the entire bunch, such as energy, energy spread etc. The data are placed in the HDF group ”Global” within the group ”Beam” of the output filefield_global_stat
(bool, false): Flag for the field output, similar to beam_global_stat
.exclude_spatial_output
(bool, false): Flag to suppress the datasets in the output file for the x- and y-position and size (both Beam and Field) and px- and py-position (Beam only). This might be useful to reduce the file size of the output file, if these datasets are not needed for the post-processingexclude_fft_output
(bool, false): Flag to suppress the datasets in the output file for the field divergence and pointing. Since it also disable the FFT calculation of the 2D wavefronts it speeds up the execution time slightly. If the code has been compiled without the support of the FFTW library this parametr has no effect.exclude_intensity_output
(bool, false): Flag to suppress the datasets for the near and farfield intensity and phase for the radiation field. If excluded the output file size becomes smaller but no post-processing calculation of the spectra is possible.exclude_energy_output
(bool, false): Flag to suppress the datasets in the output file for the mean energy and energy spread of the electron beam.exclude_aux_output
(bool, false): Flag to suppress the auxiliary datasets in the output file. In the moment it is the long-range longitudinal electric field as seen by the electrons.exclude_current_output
(bool, true): Flag to reduce the size of the current dataset for the electron beam. Under most circumstances the current profile is constant and only the initial current profile is written out. However, simulation with one-4-one set to true
and sorting events the current profile might change. Example are ESASE/HGHG schemes. By setting the flag to false the current profile is written out at each output step similar to radiation power and bunching profile.exclude_field_dump
(bool, false): Exclude the field dump to .fld.h5
.write_meta_file
(bool, false): Write a metadata file.semaphore_file_name
(string, write_semaphore_file
(bool, false): Write a semaphore file when the simulation has completed.write_semaphore_file_done
(bool, false): Alias for write_semaphore_file
. This takes precedence over write_semaphore_file
if both are specified.write_semaphore_file_started
(bool, false): Write a semaphore file at startup, after the setup block is parsed.A namelist to change some parameters within the simulation, which have been defined alread by the setup
-namelist. The change values are stored in the setup module so that for another invocation of alter_setup some defaults values are use which have been defined in the preceding call of alter_setup
rootname
(string, write
-namelist)beamline
(string, <empty>): The name of the beamline, which has to be defined within the lattice file. This way another beamline can be selected in the case the simulation has multiple stagesdelz
(double, harmonic
(int, 1): If the value is not 1 than a harmonic conversion is done. This has several consequences. The reference wavelength in setup
is divided by the harmonic number, the sample rate in time
is multiplied by the harmonic number, the ponderomotive phases of all macro particles are scaled with the harmonic number, all radiation fields, which are not identical to the harmonic numbers are deleted, while an existing harmonic field is changed to be at the fundamental wavelengthsubharmonic
(int, 1): If the value is not 1 than a down conversion is done. It is similar to the action of harmonics
but in the opposite directions. For the radiation field all field definitions are deleted except for the fundamental, which is converted to a harmonic. In this case the fundamental field needs to be defined before another tracking is called.resample
(bool, false): If this is set to true and only if one-for-one simulations are used the harmonic and subharmonic conversion can re-sample to the new wavelength. In the case of up-conversion the slices are split and the total number of slices increases. Same with the radiation field. An previously existing harmonic field, which is now becoming the fundamental, is interpolated between the existing sample points (still needs to be implemented). If a new field is generated it has automatically the new number of slices. If also prevents that the sample rate is changed by remaining unchanged.disable
(bool, false): Disable non-matching radiation harmonic.This namelist is used to change the raw lattice from the lattice file, such as generating errors in the position of the elements. The namelist can be defined several times to add more than one error source to the lattice.
zmatch
(double, 0): If the position within the undulator in meter is non-zero than Genesis tries to calculate the matched optics function for a periodic solution. In the case that it cannot find a solution than it will report it. Found solution will also be the default values for a succeeding beam generation, so that no explicit optical functions need to be defined any longer. If the lattice is highly non-periodic it is recommended to find the matching condition with an external program such as MAdX.element
(string, <empty>): Name of the element type, which will be changed, e.g. Undulator if undulator modules are altered. Only the first 4 letters need to be defined. If there is no match, e.g. due to a type, nothing will be changed. It acts rather as a filter than a mandatory element. Elements of the type MARKER
are not supported.field
(string, <empty>): attribute name for a given element. The names are the same as in the definition of the lattice file. The field acts as a filter again. With non-matching events nothing will be changed.value
(double, 0, or sequence label): The new value. If a reference to a sequence is used, values can be different depending on how many elements are changed. For a double the value would be the same for all elements affected.instance
(integer, 0): The instances of affected elements. If a positive value is given, than only that element is changed, where its occurence matches the number. E.g. for a value of 3 only the third element is selected. For a value of 0 all elements are changed. The ability to change more than one but less than all is currently not supported.add
(bool, true): If the value is true
, the changes are added to the existing value. For a value of false
, the old values are overwritten.resolvePeriod
(bool, false): currently unused.This namelist defines the time window/range for simulation with more than just one slice. For reference the complementary axis of the undulator axis, which is normally the position in the time frame, is expressed in a position s
. Normally everything is aligned to the origins = 0, in particular when external distributions are imported. Note that for parallel execution the number of slices per core must be the same for an efficient writing of the output files. Therefore Genesis extends the time-window to symmetrize the number of slices per core by extending it towards larger values of s
. As an example, with XLAMDS=1e-6
and a length SLEN=20e-6
a call of Genesis with 24 cores would generate a time-window of 24 microns because each core would have one slice, while 15 cores would expand it to 30 microns with 2 slices per core each.
This module defines also scans in either field or beam parameters if the corresponding flag is set. Technically it generates the beam and field as for time-dependence but disables slippage during simulations. That way the radiation field is kept in the same slice, acting as steady-state simulations.
s0
(double, 0): Starting point of the time-window in meters.slen
(double, 0): Length of the time window in meters. Note that for parallel jobs this might be adjusted towards larger values.sample
(int, 1): Sample rate in units of the reference wavelength from thesetup namelist, so that the number of slices is given by SLEN / LAMBDA0 /SAMPLE
after SLEN
has been adjusted to fit the MPI size.time
(bool, true): Flag to indicate time-dependent run. Note that time-dependent simulations are enabled already by using this namelist. This flag has the functionality to differentiate between time-dependent run and scans, which disable the slippage in the tracking. To restrict the simulation to steady-state the time
namelist has to be omitted from the input deck.Profiles are defining a dependence on the position in the time frame, which then can be used to defined the behavior of various parameters such as slice emittance, energy spread etc. All profiles are in common that they have to have a label with which they are referred to in other namelists. To indicate the reference to a profile and thus allows to distinguish Genesis between normal numbers the label name must have the additional character ’@’ in front. E.g. if the name of the label is energy
then in the beam name list it is referred to by gamma = @energy
.
label
(string, <empty>): Name of the profile, which is used to refer to it in later calls of namelistsc0
(double, 0): constant value to be used.label
(string, <empty>): Name of the profile, which is used to refer to it in later calls of namelistsc0
(double, 0): Maximum function value of the Gaussian distributions0
(double, 0): Center point of the Gaussian distributionsig
(double, 0): Standard deviation of the Gaussian distributionlabel
(string, <empty>): Name of the profile, which is used to refer to it in later calls of namelistsc0
(double, 0): Constant terms_start
(double, 0): Starting point of the step functions_end
(double, 0): Ending point of the step functionlabel
(string, <empty>): Name of the profile, which is used to refer to it in later calls of namelistsc0
(double, 0): Constant termc1
(double, 0): Term proportional to sc2
(double, 0): Term proportional to s^2c3
(double, 0): Term proportional to s^3c4
(double, 0): Term proportional to s^4label
(string, <empty>): Name of the profile, which is used to refer to it in later calls of namelistsxdata
(string, <empty>): Points to a dataset in an HDF5 file to define the s
-position for the look-up table. The format is filename/group1/.../groupn/datasetname
, where the naming of groups is not required if the dataset is at root level of the HDF fileydata
(string, <empty>): Same as y data but for the function values of the look-up table.isTime
(bool, false): If true the s
-position is a time variable and therefore multiplied with the speed of light c
to get the position in meters.reverse
(bool, false): if true the order in the look-up table is reverse. This is sometimes needed because time and spatial coordinates differ sometimes by a minus sign.autoassign
(bool, false): use the HDF5 file from xdata
(TODO more details).Sequences act similar to profiles that they define a series of values which can be used to control dependence of certain parameters. While for profiles these are mostly properties of the electorn beam and radiation field, sequences are used for occurences of beamline elements for specific parameters. Examples are applying a taper gradiant to the undulator offset or add random offsets to the quadrupole positions. All sequences have in common that they have to have a label with which they are referred to in the lattice. To indicate the reference to a sequence and thus allows to distinguish Genesis between normal numbers the label name must have the additional character ’@’ in front. E.g. if the name of the label is taper
then in the parameter list of the modulator element it is referred to by aw = @taper
. A sequence is evoked for each occurence of the reference. As an example in a line which is 6 times a Fodo Cell which each space between the quadrupoles hosting an undulator, a reference by the undulator field will evoke the first 12 elements of the sequence.
label
(string, <empty>): Name of the sequence, which is used to refer to it in the latticec0
(double, 0): constant value to be used.label
(string, <empty>): Name of the sequence, which is used to refer to it in the latticec0
(double, 0): Constant termc1
(double, 0): Term proportional to sc2
(double, 0): Term proportional to s^2c3
(double, 0): Term proportional to s^3c4
(double, 0): Term proportional to s^4label
(string, <empty>): Name of the sequence, which is used to refer to it in the latticec0
(double, 0): Constant termdc
(double, 0): Term scaling the growing power series before added to the constant termalpha
(double, 0): power of the seriesn0
(integer, 1): starting index of power growth. Otherwise the sequence uses only the constant termlabel
(string, <empty>): Name of the sequence, which is used to refer to it in the latticec0
(double, 0): Mean valuedc
(double, 0): Amplitude of the error, either the standard division for normal distribution or the min and max value for uniform distribution.seed
(integer, 100): seed for the random number generatornormal
(bool, true): Flag for Gaussian distribution. If set to false a uniform distribution is used.This namelist initiates the generation of the particle distribution to be kept in memory. Any time-dependence has to be defined before calling this namelist.
gamma
(double, gamma0 or profile label): Mean energy in units of the electron rest mass. If default value is given by the reference energy from the setup
-namelist.delgam
(double, 0 or profile label): RMS energy spread in units of the electron rest mass.current
(double, 1000 or profile label): Current in Amperes.ex
(double, 0.3e-6 or profile label): Normalized emittance in x in units of metersey
(double, 0.3e-6 or profile label): Normalized emittance in y in units of metersbetax
(double, 15 or matched value or profile label): Initial beta-function in x in meters. If the matched command has been invoked before the default values are set to the results.betay
(double, 15 or matched value or profile label): Initial beta-function in y in meters. If the matched command has been invoked before the default values are set to the results.alphax
(double, 0 or matched value or profile label): Initial alpha-function in x. If the matched command has been invoked before the default values are set to the results.alphay
(double, 0 or matched value or profile label): Initial alpha-function in y. If the matched command has been invoked before the default values are set to the results.xcenter
(double, 0 or profile label): Initial centroid position in x in meter.ycenter
(double, 0 or profile label): Initial centroid position in y in meter.pxcenter
(double, 0 or profile label): Initial centroid momentum in x in units of γβx.pycenter
(double, 0 or profile label): Initial centroid momentum in y in units γβy.bunch
(double, 0 or profile label): Initial bunching valuebunchphase
(double, 0 or profile label): Initial phase of the bunchingemod
(double, 0 or profile label): Initial energy modulation in units of the electron rest mass. This modulation is on the scale of the reference wavelengthemodphase
(double, 0 or profile label): Initial phase of the energy modulationThis namelist initiate the generation of the field distribution. It differs in one point from the generation of the beam. It can be called multiple times. If the variable accumulate
is set to true, it does not delete the previous distribution but adds up the wavefronts. That way higher mode content in either spatial and time direction can be created.
lambda
(double, lambda0): Central frequency of the radiation mode. The default value is the reference wavelength from the setup
-namelist.power
(double, 0 or profile label): Radiation power in Wattsphase
(double, 0 or profile label): radiation phase in rads. Note that a linear profile results in a shift in the radiation wavelength, which is also the method if for the variable lambda
a different value than the reference wavelength is used. In case of conflicts the profile for the phase definition has priority.waist_pos
(double, 0 or profile label): Position where the focal point is located relative to the undulator entrance. Negative values place it before, resulting in a diverging radiation field.waist_size
(double, 100e-9 or profile label): Waist size according to the definition of w0 according to Siegman’s ’Laser’ handbookxcenter
(double, 0): Center position in x in meter of the Gauss-Hermite modeycenter
(double, 0): Center position in y in meter of the Gauss-Hermite modexangle
(double, 0): Injection angle in x in rad of the Gauss-Hermite modeyangle
(double, 0): Injection angle in y in rad of the Gauss-Hermite modedgrid
(double, 1e-3 or by existing field): Grid extension from the center to one edge. The whole grid is twice as large with 0 as the center positionngrid
(int, 151 or by existing field): Number of grid points in one dimension. This value should be odd to enforce a grid point directly on axis. Otherwise the convergence in the simulations could be worse.harm
(int, 1): Harmonic number of the radiation field with respect to the reference wavelength.nx
(int, 0): Mode number in x of the Gauss-Hermite modeny
(int, 0): Mode number in y of the Gauss-Hermite modeaccumulate
(bool, false): If set the generated field is added to an existing field instead of overwriting it.This namelist controls the import of an external distribution which are generated from Elegant. The file has to be in HDF5 format. In the distribution is a shell script to convert an Elegant sdds-output file into the HDF5 format. The distribution has to provide all 6 dimensions while the charge is supplied in this namelist. When imported the longitudinal position is changed so that the last particles is at s = 0 micron.
Note that this namelist will be expanded in the future, to enable tilts and match/center to a core part of the beam
file
(string, <empty>): The file name of the distribution, including possible relative directories.charge
(double, 0): Total charge of the distribution to calculate the current and individual charge per macro particle.slicewidth
(double, 0.01): the fraction in length of the distribution which is used for reconstruction. E.g if the length is 10 micron and slic ewidth 0.02 then the reconstruction at the positions s = 4 μm is using those particles in the distribution, which are located in the slice from 3.9 μm to 4.1 μm.center
(bool, false): If set to true the particle distribution is recentered in transverse position, momenta and energy.gamma0
(double, gamma0 from setup): If centering is enabled, new center in energy in units of electron rest mass.x0
(double, 0): If centering is enabled, new center in x in meter.y0
(double, 0): If centering is enabled, new center in y in meter.px0
(double, 0): If centering is enabled, new mean momentum in x in γβx.py0
(double, 0): If centering is enabled, new mean momentum in y in γβy.match
(bool, false): If set to true
, the particle distribution is matched to new optical function values.betax
(double, 15 or matched value): If matching is enabled, new beta function in x in meters.betay
(double, 15 or matched value): If matching is enabled, new beta function in y in meters.alphax
(double, 0 or matched value): If matching is enabled, new alpha function in x.alphay
(double, 0 or matched value): If matching is enabled, new alpha function in y.eval_start
(double, 0): evaluation start.eval_end
(double, 1): evaluation end.settimewindow
(bool, true): set time window.align
(int, 0): currently unused.align_start
(double, 0): currently unused.align_end
(double, 1): currently unused.This HDF5 file file
should have the following datasets: - x
is the horizontal coordinate in meters - y
is the vertical coordinate in meters - xp
= px/pz is the dimensionless trace space horizontal momentum - yp
= py/pz is the dimensionless trace space vertical momentum - t
is the time in seconds - p
= relativistic γ * β, which is the total momentum divided by mec
The modules controls the import of a Genesis 1.3 particle file to replace the internal generation of the particle distribution (note that the module beam
should not be called). The routine defines also the parameter for a time-dependent run if the time
-namelist hasn’t been defined yet.
file
(string, <empty>): File name of a hdf5 complient datafile to contain the slice-wise particle distribution. It has to follow the internal Genesis 1.3 syntax.time
(bool, true
): If the time window hasn’t be defined it allows to run Genesis with the imported distribution in scan mode, when set to false
. This would disable all slippage and long-range collective effects in the simulationThe modules controls the import of a Genesis 1.3 field file to replace the internal generation of the field distribution (note that the module field
should only be called afterwards with the accumulate
-option enabled). The routine defines also the parameter for a time-dependent run if the time
-namelist hasn’t been defined yet.
file
(string, <empty>): File name of a hdf5 compliant datafile to contain the slice-wise particle distribution. It has to follow the internal Genesis 1.3 syntax.harmonic
(int, 1) defines the harmonic for the given Genesis run.time
(bool, true): If the time window hasn’t be defined it allows to run Genesis with the imported distribution in scan mode, when set to false
. This would disable all slippage and long-range collective effects in the simulationOnce an electron distribution is generated the namelist can be used to manipulate the distribution by shifting the particle by the vector dr or applying the transport matrix R. The applied transformation is r1 = R*r0+dr
, where r0
is the initial particle vector and r1
the final one. The transformation assumes the standard 6D vector of (x,x',y,y',s,delta)
. the supplied vector and matrix must have the corresponding shape (6 or 6x6). The user can supply more than one vector or matrix, e.g. sampling at various positions s
. Then the transformation used interpolated values. Note that in the case of transport matrices and interpolated matrix does not preserve the emittance. In this case a high sample rate should be supplied to reduce this effect to a minimum. Genesis will check the shape of the transport vector and matrices. If the rank is higher than needed (e.g. 2x6x6 for a transport matrix) then it assumes the first index refers to the sample along the s
-axis. In this case the sample distance slen
should be also specified. In the case that n=1
or slen=0
only a global transformation is applied.
file
(string, <empty>): File name of a hdf5 compliant datafile to contain the vector and matrix informationsvector
(string, <empty>) Name of the dataset which contains the vector information. The shape must be either (6) or (n,6)matrix
(string, <empty>) Name of the dataset which contains the matrix information. The shape must be either (6,6) or (n,6,6)slen
(double, 0): The length in meters between adjacent sample points (n>1), needed for the interpolation. If the value is zero only a global transformation is applied using the first entry. BackThis namelist controls the long and short range space charge fields. The long range corresponds to any length scale longer than the slice length of the simulation, while the short range is on the resonant wavelength scale. Numerically they are treated differently. The calculation for the short range is done on a radial-azimuthal grid, centered to the centroid position of the electron slice, while the long range is the sum of the space charge field in the rest frame where each slice is treated as a uniform disk.
longrange
(bool, false): Flag to enable the calculation of the long range space charge field.rmax
(double, 0): Size of radial grid in meters. If the beam size gets larger than the grid the size is automatically adjusted to the maximum radius of the electrons with an additional 50% extension. When the mesh size is adjusted a message will be printed on screen.nz
(int, 0): Number of longitudinal Fourier component of the short range space charge field. Note that this should be not in conflict with the beamlet size.nphi
(int, 0): Number of azimuthal modes in the calculation of the short range space charge field.ngrid
(int, 100): Number of grid points of the radial grid for the short range space charge field.This enables the effect of spontaneous radiation outside of the frequency band of the FEL simulation.
seed
(int, 1234): Seed for random number generator to model the quantum fluctuation of hard photons.doLoss
(bool, false): If set to true
, electrons will loose energy due to the emission of spontaneous radiation within the undulatordoSpread
(bool, false): If set to true
, the energy spread will increase due to the fluctuation in the emission of hard photons of the spontaneous radiation.Genesis supports the calculation of three types of wakefields by specifying the typical input parameters (e.g. gap length for the geometric wakefield). It first solves the single particle wake and then convolutes with the current distribution. Therefore it follows the change in the wakepotential if a chirped beams undergoes a compression in a chicane. In addition an external loss factor can be supplied, which can also refer to a profile. In this case it is treated as the full wake and subtracted from the particle energy directly.
Note that this functionality hasn’t been fully tested yet or optimized for rapid calculation
loss
(double, 0 or profile label): Loss in eV/m. This is a global loss function (in particular if a profile is defined). Its function values V(s) remains unchanged even if the current profile changesradius
(double, 2.5e-3): Radius of the aperture if it is a round chanber or half the distance in the case of two parallel plates.roundpipe
(bool, true): Flag to indicate the shape of the transverse cross-section of the aperture. If set to true
, a round aperture is assumed, otherwise the model has two parallel plates.conductivity
(double, 0): Conductivity of the vacuum material for the resistive wall wakefield functionrelaxation
(double, 0): Relaxation distance (aka the mean free path of the electron in the vacuum material) for the resistive wall wakefieldsmaterial
(string, <empty>): String literal to define conductivity and relaxation distance for either copper or aluminum by using the two character label ’CU’ or ’AL’ repectively. This overwrites also any explicit definition of the conductivity and relaxation value.gap
(double, 0): Length in mm of a longitudinal gap in the aperture, exciting geometric wakes.lgap
(double, 1.0): Effective length over which a single gap is applied. E.g. if there is a periodicity of 4.5 m at which there is always the same gap in the aperture for the geometrice wakes, then this value should be put to 4.5 m.hrough
(double, 0): Amplitude in meters of a sinusoidal corrugation, modeling the effect of surface roughness wakes.lrough
(double, 1): period lengthin meters of the sinusoidal corrugation of the surface roughness model.transient
(bool, false): If set to true
, Genesis includes the catch-up length of the origin of the wakefield to the particle effects. E.g. particles do not see immediatly the wake from those closer ahead of them than those further away. The catch-up distance is the distance in the undulator added to the starting position ztrans
. If set to false the steady-state model is used, effectively setting ztrans
to infinity. Enabling transient calculation will update the wakefield at each integration step, which can slow down the calculations.ztrans
(double, 0): Reference location of the first source of the wake fields. A positive value means that the condition for wakes (e.g. a small aperture in the vacuum chamber) has already started and there has been already some length to establish the wakes. For a value of zero the source is right at the undulator start, while a negative value prevents any wake, till the interation position has passed that point.An empty namelist with no variables. It initiates the sorting and redistribution of particles only if one-for-one simulation is enabled. Note that harmonic conversion will automatically invokes sorting and therefore does not need to be called explicitly.
With this name list the field or particle distributions are dumped. The placeholder character @
can be used to refer to the rootname of the simulation run, e.g. field = @.final
field
(string,<empty>): if a filename is defined, Genesis writes out the field distribution of all harmonics. The harmonics are indicated by the suffix ’.hxxx.’ where xxx is the harmonic number. The filename gets the extension.fld.h5 automaticallybeam
(string, <empty>): if a filename is defined, Genesis writes out the particle distribution. The filename gets the extension.par.h5
automaticallystride
(integer,1): For values larger than 1 the amount of particles written to the file is reduced by only writing each strideth particle to the dump file.This namelist initiate the actually tracking through the undulator and then writing out the results. Normally all parameter should be defined before or defined in the lattice but the namelist allows some ’last minute’ change of the behavior of the code
zstop
(double, 1e9): If zstop
is shorter than the lattice length the tracking stops at the specified position.output_step
(int, 1): Defines the number of integration steps before the particle and field distribution is analyzed for output.field_dump_step
(int, 0): Defines the number of integration steps before a field dump is written. Be careful because for time-dependent simulation it can generate many large output files.beam_dump_step
(int, 0): Defines the number of integration steps before a particle dump is written. Be careful because for time-dependent simulation it can generate many large output files.sort_step
(int,0): Defines the number of steps of integration before the particle distribution is sorted. Works only for one-4-one simulations.s0
(double, slen
(double, field_dump_at_undexit
(bool, false): Field dumps at the exit of the undulator (one dump for each undulator in the expanded lattice).bunchharm
(int, 1): Bunching harmonic output setting. Must be >= 1.The following namelists were not previously documented and have been extracted from the source code. These may not have the same level of support when compared to the above section.
Field manipulator (TODO).
Note that the namelist field_manipulator
is deprecated and will be removed in the future. Use alter_field
instead.
harm
(int, 1): harmonicscale_power
(double, 1.0): power scaling factorspp_l
(double, 0.0): TODOspp_nsect
(int, 0): TODOspp_phi0
(double, 0.0): TODOGenerates profile objects <label_prefix>.gamma
, <label_prefix>.delgam
, <label_prefix>.current
, etc., each one corresponding to one &profile_file
.
file
(string, label_prefix
(string, <empty>): prefix for each object.xdata
(string, <empty>): Points to a dataset in an HDF5 file to define the s
-position for the look-up table. The format is filename/group1/.../groupn/datasetname
, where the naming of groups is not required if the dataset is at root level of the HDF fileydata
(string, <empty>): Same as y data but for the function values of the look-up table.isTime
(bool, false): If true the s
-position is a time variable and therefore multiplied with the speed of light c
to get the position in meters.reverse
(bool, false): if true the order in the look-up table is reverse. This is sometimes needed because time and spatial coordinates differ sometimes by a minus sign.A sequence of values given as a string.
label
(string, <empty>): label for the sequence.val
(double, [default
(double, 0): default value to use for out-of-bound indices.A sequence list with data in a file.
label
(string, <empty>): label for the sequence.file
(string, <empty>): filename to load the sequence from with one line per value.Optionally-compiled plugin for field diagnostics.
Optionally-compiled plugin for beam diagnostics.
In comparison to previous versions of Genesis the definition of the undulator lattice is now completely defined in a lattice file. The main input file just refers to it and might change some parameters, such as adding undulator errors etc. Another major change is that the rigid scheme of fixed integration steps is now broken up. The lattice does not need to be aligned to a single integration step. Instead the lattice can be closer now to the real lattice.
The format of the lattice file is similar to other codes such as ELEGANT or MADX, which makes it somehow easier to convert between the formats. In general the syntax is the following:
label: element type={parameter=value[,···]};
Following beamline elements are currently supported: undulator, quadrupole, drift, corrector, chicane, phaseshifterandmarker. For the parsing of the elements Genesis only consider the first 4 letters. Therefore, undulator
and unduas
element name are both valid. This applies only for the elements. Other tags, such as labels and parameter have to be exact. Upper or lower cases are ignored because all letters are converted to lower case prior to parsing.
Labels are used to identify elements and are referred to in the line element. More information is given at the end of this section.
aw
(double, 0): The dimensionless rms undulator parameter. For planar undulator this value is smaller by a factor $1 / \sqrt{2}$ than its K-value, while for helical undulator rms and peak values are identical.lambdau
(double, 0, [m]): Undulator period length in meter. Default is 0 m.nwig
(int, 0): Number of periods.helical
(bool, false): Boolean flag whether the undulator is planar or helical. A planar undulator has helical=false
. Note that setting it to true
, does not change the roll-off parameters for focusing. To be consistent they have to be set directly.kx
(double, 0): Roll-off parameter of the quadratic term of the undulator field in x. It is normalized with respect to ku2.ky
(double, 1): Roll-off parameter of the quadratic term of the undulator field in y.ax
(double, 0, [m]): Offset of the undulator module in x in meter.ay
(double, 0, [m]): Offset of the undulator module in y in meter.gradx
(double, 0): Relative transverse gradient of undulator field in x ≡ (1/aw)∂aw/∂x.grady
(double, 0): Relative transverse gradient of undulator field in y ≡ (1/aw)∂aw/∂y.l
(double, 0, [m]): Length of the drift in meter.l
(double, 0, [m]): Length of the quadrupole in meter.k1
(double, 0, [1/m2]): Normalized focusing strength in 1/m^2.dx
(double, 0, [m]): Offset in x in meter.dy
(double, 0, [m]): Offset in y in meter.l
(double, 0, [m]): Length of the corrector in meter.cx
(double, 0, [m]): Kick angle in x in units of γβx.cy
(double, 0, [m]): Kick angle in y in units of γβy.l
(double, 0, [m]): Length of the chicane, which consists out of 4 dipoles without focusing. The first and last are placed at the beginning and end of the reserved space. The inner ones are defined by the drift length in between. Any remaining distance, namely the length subtracted by 4 times the dipole length and twice the drift length are placed between the second and third dipole.lb
(double, 0, [m]): Length of an individual dipole in meter.ld
(double, 0, [m]): Drift between the outer and inner dipoles, projected onto the undulator axis. The actual path length is longer by the factor 1/cos θ, where θ is the bending angle of an individual dipole.delay
(double, 0, [m]): Path length difference between the straight path and the actual trajectory in meters. Genesis 1.3 calculates the bending angle internally starting from this value. R56 = 2delay
.l
(double, 0, [m]): Length of the phase shifter in meter.phi
(double, 0, [rad]): Change in the ponderomotive phase of the electrons in units of rad. Note that Genesis 1.3 is doing an autophasing, so that the electrons at reference energy are not changing in ponderomotive phase in drifts.Back]]
dumpfield
(int, 0/1): A non-zero value enforces the dump of the field distribution of this zero length element.dumpbeam
(int, 0/1): A non-zero value enforces the dump of the particle distribution.sort
(int, 0/1): A non-zero value enforces the sorting of particles, if one-for-one simulations are enabled.stop
(int, 0/1): A non-zero value stops the execution of the tracking module. Note that the output file still contains the full length with zeros as output for those integration steps which are no further calculated.The line uses the labels to define the order of the elements in the beam line. Elements can be referred to multiple times. Each time the line element creates an individual copy so that they are not treated as a single entity. That allows that in a later stage the elements can be changed differently, e.g. when errors in the alignment are generated. The line element can also contain other line elements. Genesis 1.3 is unrolling the nested references, however stops after an iteration depth of 10. This catches the error that one line element uses another and vice versa.
Elements can be duplicated by a preceding multiplication. The following is an example
FODO: Line = {F,DRI,D,DRI};
LAT: Line = {6*FODO};
There is one difference between Genesis and Elegant/Madx. It allows a superposition of secondary elements (everything except of undulator modules) so that correction and focusing can be superimposed onto the undulator field. An example is
UND: Undulator = {aw=1, lambdau=0.02, nwig=100};
FODO: Line = {UND,F@0.2,D@1.2};
The postfix @ with the position in meter places the element directly there. Note that it also resets the counter. For a 10 cm long quadrupole the next position after F@0.2
would be 0.3 m. To avoid overlapping with succeeding elements it is better to define the pointer with a marker element, e.g. the upper example can be improved with:
UND: Undulator = {aw=1, lambdau=0.02, nwig=100};
FODO: Line = {UND,F@0.2,D@1.2,M@2.0};
LAT: Line = {6*FODO};
If the absolute position places the element outside of an existing element than the missing space is padded with a drift section.
Beside the input and lattice file, Genesis uses exclusively the HDF5 format for the output files, which are the main output file, and the particle and field dump. HDF5 is a well supported format by many programs or programming languages which makes it easy to read in the data. As an example, Matlab requires only a single line to read an entire dataset such as the 2d array for the power, with sample points along the undulator and beam frame, already converted to the right data type. This should make it easy to write your own postprocesser. Nevertheless the Genesis distribution comes with some Matlab routines to ease the parsing and display of the output files.
The main output file is written when ever the&tracknamelist is called. The name is given by the specified rootname and the extension’.out.h5’for the first call. If there are more than one tracking commands the root is extended by the run number, such as’.Run3.out.h5’ for the third time of tracking.
In the root level of the HDF5 files there are multiple groups, to organize the output data. The group ’Global’ list the basic configuration of the simulation such as reference energy and wavelength or whether it is a time-dependent or scan run. The group Lattice
contains all lattice information. The undulator strength, quadrupole field and other are resolved with the resolution of the requested integration step size, which is given in the dataset dz
. Most data here have a direct correspondance with the input data. Exceptions are ‘gradx’ and ‘grady’ since they are scaled by ‘ku’. For the z-position there exist two dataset. The regular onezhas the same length and describes the lattice quantities from the positionz[i]toz[i]+dz[i]
of the i-th integration step. The dataset zplot
is used for plotting the beam or field parameters along the undulator. Note that those are evalutated before the integration started, so that there can be one more entry than the lattice datasets. Also if the output is reduced by the output step option in the tracking command, the length of zplot
is shorter because it has to match the length of the beam and field parameters. Another group is Meta
which contains some additional information, which are not stricktly related to the input case. These are the version number, creation date and user, which has evoked the simulations.
The main data is contained in the Beam
and Field
record. In the case that additional harmonics have been selected, there are additional Field
groups, where the harmonic number has been added. As an example Field3
would refer to the third harmonic. The Beam
group contains parameters which are evaluated at each integration steps. They are: energy, energy spread, bunching, bunching phase, centroid position in x, y, px and py and the size in x and y. Other parameters are only evaluated at the beginning, which are the optical function, emittance and current profile, but in the future they might be becoming also larger, e.g. when sorting is enabled and the current profile can change. In theFieldgroup one can find the power, position and size in x and y as well as the on-axis intensity and phase in the near field (central grid point) or far field (summation over all grid points)
In general the units of the datasets should be given as attributes to the given dataset. This is not yet implemented.
Particle dumps are following the data structure that each slice has its own 6D distribution with the datasets gamma
, theta
, x
, y
, px
, and py
. In additions the local current value is written as well. The slice number is encoded in the group name, which is the composition of slice
and the 6 digit representation of the slice numbers. Preceding spaces are changed to zeros. E.g. the group name of the 7th slice is slice000007
. The total number of slices is given by the dataset slicecount
. In addition some extra information is given on the root level of the reference frame are defined by the starting position refposition
and the sample length per slice slicespacing
. The reference length slicelength
can be used to convert the ponderomotive phase into a longitudinal position in units of meter. Whether the distribution has been generated with beamlets or resolving all electrons are indicated by the parameters beamletsize
and one4one
.
The field dump has very similar structure than the beam dump, except that instead of slicelength
the field is wavelength
to distinguish between the fundamental or harmonic radiation, while the beam is always measured against the fundamental wavelength for the ponderomotive phase. The field gridsize
defines the extension of the 2D grid from the origin to the edge along of the major axis. The slice
groups contains the real and imaginary part of the wavefront, however for programming reason the data record is one dimensional with ngrid2 elements. Any processing or display should convert it to a symmetric 2D array.
Genesis can import particle distribution which are generated by Elegant. However it does not support the parsing of SDDS files directly. Instead, it provides a simple shell script to convert the typical SDDS distribution into a HDF5 file. This script expects that the SDDS toolkit is installed because it extracts the columns t
, p
, x
, y
, xp
, and yp
from the SDDS files and converts them into datasets with the same name in the HDF5 file. The short program will add the extension’.h5’ to the newly created file. This format is the one Genesis expects to be imported. The corresponding charge is supplied in the namelist and therefore does not need to be part of the HDF5 file.
Although the output format of Genesis is HDF5, where entire datasets can be read with a single line in Matlab, the source code distribution also contains some Matlab functions, which help with the postprocessing. They can be found in the directory xgenesis
from the root directory of the source code. It is recommended that the search path of Matlab extends to that directory or that the files are copied to a locations where the search path already points to.
The following is a brief description of the existing functions. More will come in the future.
The routine requires only the name of the output file, which then is parsed for the most essential data, which is the size inzandsand the dataset tree structure. This function needs to be called once. All other functions will make use of the data, which has been parsed here. If another file needs to be read then xgeninit
needs to be called again.
The main routine to display data from the output file and returns the data. It can generate multiple plots at the same time and the return data type is a cell array, with each element referring to a dataset in the plot. The dataset itself is a cell array as well, where the first element is the x-coordinate and the second the y.
The function requires up to three input arguments. In special cases, e.g. results from steady-state simulations some options are restricted such as plotting along the time-window coordinate is not meaningful and thus not supported.
The first element mostly refers to the corresponding dataset in the input deck. The function uses regular expression to match the dataset names with the requested plot data. As an example plotting size
will plot the sizes in x and y of the electron beam and each supported radiation field, so at least 4 plots and even more if harmonics were included. To restrict the plots the requested plot can be more explicit, according to the tree structure in the output file. As an example the input argument /Beam/.size
would plot the x and y sizes of only the electron beam while Field.*/.size
does it for the radiation of the fundamental and all harmonics. Besides the datasets in the output file there is one derived dataset, which is the spectrum. The postprocessor can calculate it either from the near field intensity and phase on axis or the equivalent pair in the far field. If only spectrum
is requested than both are plotted. To select one of them, just specify as it would be done for the intensity, e.g. spectrum-nearfield
.
If no further arguments are supplied then the first slice of the specified data is plotted along the undulator axis. This is in particular enforced for any lattice function, such as the undulator field. Also if the output data is from a steady-state file then the output is always along undulator axis, despite that a profile might be requested.
The second argument specify the plotting direction: either along undulator direction or along bunch frame or frequency. If the data is a 2D array, e.g. such as the power after a time-dependent run, than plotting a line need as the third argument the specification of the orthogonal position. Here the post processor chooses the line, which lies the closest to the specified point. The default direction and plotting mode is normal
plotting along the undulator. To plot the power as an example at 3 μm of the bunch frame the plot command is
xgeninit('power','normal',3e-6)
```.
The direction along the bunch frame is indicated with `profile` such as
xgeninit(‘power’,‘profile’,11.5) ```
to plot around the position 11.5 m within the undulator lattice.
For 2D datasets from time-dependent simulations or scansxgenplotallows some condensed plotting along the undulator: max
for the maximum value of the given profile, mean
the mean value, and rms
the rms value. The evolution of the radiation bandwidth is calculated best, using the rms
option. In fact, RMS values are only meaningful for primary datasets, which are power profile, spectrum and current profile. For all other parameters, such as beam size it is recommended to use the mode weighted
which is defined as
$$\bar{P}(z)=\frac{\int P(s,z)\cdot W(s,z) ds}{\int W(s,z)ds}$$
where P is the parameter to be display and W the weighting function. For electron beam parameters it is the current while for radiation parameter it is the power profile.
For a two-dimensional output the modes 2d
and 2dnorm
can be used. The latter differs from the former that for each step along the undulator the resulting profile is normalized by its mean value. This allows to exclude the dominant exponential change in some parameters such as power, bunching or energy.
This function calculates the 2D Wigner distribution at a position within the undulator, which is supplied as the input argument. The Wigner distribution is a very compact display of time and spectral properties, namely the projection onto the time axis is the power profile and the projection on the frequency axis is the power spectrum.
https://gitlab.ethz.ch/Genesis/Genesis4
S. Reiche, ”Numerical Studies for a Single Pass High Gain Free-Electron Laser”, DESY print, DESY-THESIS-2000-012 (2000)
W.H. Press, S.A. Teukolsky, W.T. Vetterling and B.P. Flannery, ”Numerical Recipes in FORTRAN”, Cambridge University Press, (1988)
W.F. Ames, ”Numerical Methods for Partial Differential Equations”, Academic Press (1996)