3131#pragma once
3232
3333#include "picongpu/defines.hpp"
34+ #include "picongpu/particles/atomicPhysics/DeltaEnergyTransition.hpp"
3435#include "picongpu/particles/atomicPhysics/SetAtomicState.hpp"
3536#include "picongpu/particles/atomicPhysics/enums/ProcessClass.hpp"
37+ #include "picongpu/particles/atomicPhysics/enums/ProcessClassGroup.hpp"
3638#include "picongpu/particles/atomicPhysics/ionizationPotentialDepression/BarrierSupressionIonization.hpp"
3739#include "picongpu/particles/atomicPhysics/spawnFromSourceSpeciesModules/CacheEFieldForSuperCell.hpp"
3840#include "picongpu/particles/atomicPhysics/spawnFromSourceSpeciesModules/InitAsCoMoving.hpp"
@@ -173,10 +175,6 @@ namespace picongpu::particles::atomicPhysics::ionizationPotentialDepression::ker
173175 uint8_t const currentChargeState
174176 = T_AtomicStateDataBox::ConfigNumber::getChargeState(currentAtomicStateConfigNumber);
175177
176- // eV
177- float_X const ionizationEnergy = chargeStateBox.ionizationEnergy(currentChargeState)
178- - atomicStateBox.energy(currentAtomicStateClctIdx);
179-
180178 // eV
181179 float_X ipd = T_IPDModel::ipd(kernelState.superCellConstantIPDInput, currentChargeState);
182180
@@ -198,8 +196,20 @@ namespace picongpu::particles::atomicPhysics::ionizationPotentialDepression::ker
198196 ipd += BarrierSupressionIonization::getIPD(screenedCharge, eFieldNormAU);
199197 }
200198
199+ auto const ipdIonizationStateConfigNumber = atomicStateBox.configNumber(ipdIonizationStateClctIdx);
200+ uint8_t const ipdIonizationStateChargeState
201+ = T_AtomicStateDataBox::ConfigNumber::getChargeState(ipdIonizationStateConfigNumber);
201202
202- bool const stateIsUnbound = ((ionizationEnergy - ipd) <= 0._X);
203+ ///@details need to do by hand since IPD-Ionization does not always follow a defined transition
204+ // eV
205+ float_X const ionizationEnergyToIPDIonizationState
206+ = DeltaEnergyTransition::template ionizationEnergy<
207+ s_enums::ProcessClassGroup::boundFreeBased,
208+ float_X>(currentChargeState, ipdIonizationStateChargeState, ipd, chargeStateBox)
209+ + atomicStateBox.energy(ipdIonizationStateClctIdx)
210+ - atomicStateBox.energy(currentAtomicStateClctIdx);
211+
212+ bool const stateIsUnbound = (ionizationEnergyToIPDIonizationState <= 0._X);
203213
204214 /** @details states that are unbound without an IPD contribution should have option to relax via
205215 * auto-ionization, electronic collisional ionization or deexcitation channels in the regular rate solver
0 commit comments