Ionization
(See .param Files for how to configure a picongpu simulation in general)
Note
The default ionizer.param and default ionizationEnergies.param includes all atomic parameters for some species.
To include charge-state-only simulations in your simulations you must:
Define the atomic parameters of all ionization ion species of your simulation in the
ionizer.param
.1.) number of protons and neutrons
/* Example: nitrogen */ namespace picongpu::ionization::atomicNumbers { struct Nitrogen { static constexpr float_X numberOfProtons = 7.0; static constexpr float_X numberOfNeutrons = 7.0; }; } // namespace picongpu::ionization::atomicNumbers
2.) effective nuclear charge for each charge state
/* Example: nitrogen */ namespace picongpu::ionization::effectiveNuclearCharge { /// @attention insert the values in REVERSE order since the lowest shell corresponds to the last ionization process. PMACC_CONST_VECTOR( float_X, 7, // number of charge states Nitrogen, // name you may reference this by later, remember to prepend the namespace! /* 2p^3 */ 3.834, 3.834, 3.834, /* 2s^2 */ 3.874, 3.874, /* 1s^2 */ 6.665, 6.665); } // namespace picongpu::ionization::effectiveNuclearCharge
Attention
In addition this file must also contain the Thomas-Fermi ionization parameters and cutoff settings. We suggest to copy them from the default
ionizer.param
and not adjust them.Define the ionization energies of all charge states of all ionization ion species of your simulation in
ionizationEnergies.param
.namespace picongpu::ionization::energies::AU { /* example Nitrogen */ /* ionization energy in eV */ PMACC_CONST_VECTOR( float_X, 7, // number charge states Nitrogen, // name you may reference this by later, remember to prepend the namespace and append _t! sim.si.conv().eV2auEnergy(14.53413), sim.si.conv().eV2auEnergy(29.60125), sim.si.conv().eV2auEnergy(47.4453), sim.si.conv().eV2auEnergy(77.4735), sim.si.conv().eV2auEnergy(97.89013), sim.si.conv().eV2auEnergy(552.06731), sim.si.conv().eV2auEnergy(667.04609)); }; // namespace picongpu::ionization::energies::AU
Define mass and charge ratios of ions in the
speciesDefinition.param
./* Example Nitrogen*/ namespace picongpu { /* mass and charge ratios with respect to electrons */ value_identifier(float_X, MassRatioNitrogen, 25514.325); value_identifier(float_X, ChargeRatioNitrogen, -7.0); } // namespace picongpu
Define at least one electron species in
speciesDefinition.param
./* Example electron Species */ namespace picongpu { using ParticleFlagsElectrons = MakeSeq_t< particlePusher<UsedParticlePusher>, shape<UsedParticleShape>, interpolation<UsedField2Particle>, current<UsedParticleCurrentSolver>, massRatio<MassRatioElectrons>, chargeRatio<ChargeRatioElectrons>>; using ParticleAttributesElectrons = MakeSeq_t<position<position_pic>, momentum, weighting>; using Electrons = Particles<PMACC_CSTRING("e"), ParticleFlagsElectrons, ParticleAttributesElectrons>; } // namespace picongpu
Define all (ion) macro particle species.
The definition of an ionization species must include the particle attribute
boundElectrons
, and the particle flagsatomicNumbers
,ionizationEnergies
,effectiveNuclearCharge
,ionizers
,massRatio
andchargeRatio
.namespace picongpu { #ifndef PARAM_IONIZATIONCURRENT # define PARAM_IONIZATIONCURRENT None #endif /* Example Nitrogen */ using ParticleFlagsNitrogen = MakeSeq_t< particlePusher<UsedParticlePusher>, shape<UsedParticleShape>, interpolation<UsedField2Particle>, current<UsedParticleCurrentSolver>, atomicNumbers<ionization::atomicNumbers::Nitrogen> // <-- from step 1 effectiveNuclearCharge<ionization::effectiveNuclearCharge::Nitrogen_t>, // <-- from step 1 ionizationEnergies<ionization::energies::AU::Nitrogen_t > // <-- from step 2 massRatio<MassRatioNitrogen>, // <-- from step 3 chargeRatio<ChargeRatioNitrogen>, // <-- from step 3 ionizers<MakeSeq_t< // <-- comma separated list of all ionizers of this species with // species of electrons macro particles to be created upon ionization particles::ionization::BSIEffectiveZ<Electrons, particles::ionization::current::PARAM_IONIZATIONCURRENT>, particles::ionization::ADKLinPol<Electrons, particles::ionization::current::PARAM_IONIZATIONCURRENT>, particles::ionization::ThomasFermi<Electrons>>>>; using ParticleAttributesNitrogen = MakeSeq_t<position<position_pic>, momentum, weighting, boundElectrons>; using Nitrogen = Particles<PMACC_CSTRING("N"), ParticleFlagsNitrogen, ParticleAttributesNitrogen>; } // namespace picongpu
Note
Remember that you can define multiple electron species and associate them with your different ion species to track the ionization processes separately!
Create ion macro particles in the simulation and initialize them in
speciesInitialization.param
.namespace picongpu::particles { /* create nitrogen charge state 1 and electrons to neutralize the simulation */ using InitPipeline = pmacc::mp_list< CreateDensity< ... some densityProfile... , startPosition::Random, Nitrogen>, ManipulateDerive<manipulators::binary::DensityWeighting, Nitrogen, Electrons>, Manipulate<manipulators::unary::ChargeState<1u>;, Nitrogen>>; } // namespace picongpu::particles
Attention
Ensure the simulation is initialized as charge neutral whenever the respective species should move, to avoid creating unintended ghost background charge densities.
For an example of a picongpu setup with ionization see the FoilLTC example.