23 m_protareSingle( nullptr ),
30 m_initialStateIndex( -1 ),
32 m_hasFission( false ),
33 m_projectileMass( 0.0 ),
35 m_crossSectionThreshold( 0.0 ),
36 m_twoBodyThreshold( 0.0 ),
37 m_hasFinalStatePhotons( false ),
38 m_fissionResiduaIntid( -1 ),
39 m_fissionResiduaIndex( -1 ),
40 m_fissionResiduaUserIndex( -1 ),
41 m_fissionResiduals(
GIDI::Construction::FissionResiduals::
none ),
42 m_fissionResidualMass( 0.0 ),
43 m_totalDelayedNeutronMultiplicity( nullptr ),
44#ifdef MCGIDI_USE_OUTPUT_CHANNEL
45 m_outputChannel( nullptr ),
49 m_GRIN_specialSampleProducts( false ),
50 m_GRIN_inelasticThreshold( 0.0 ),
51 m_GRIN_maximumCaptureIncidentEnergy( 0.0 ),
52 m_GRIN_inelastic( nullptr ),
53 m_GRIN_capture( nullptr ) {
66 m_protareSingle( nullptr ),
68 m_GIDI_reactionIndex( a_reaction.reactionIndex( ) ),
69 m_label( a_reaction.label( ).c_str( ) ),
70 m_ENDF_MT( a_reaction.ENDF_MT( ) ),
71 m_ENDL_C( a_reaction.ENDL_C( ) ),
72 m_ENDL_S( a_reaction.ENDL_S( ) ),
73 m_initialStateIndex( -1 ),
74 m_neutronIndex( a_setupInfo.m_neutronIndex ),
75 m_hasFission( a_reaction.hasFission( ) ),
76 m_projectileMass( a_setupInfo.m_protare.projectileMass( ) ),
77 m_targetMass( a_setupInfo.m_protare.targetMass( ) ),
78 m_crossSectionThreshold( a_reaction.crossSectionThreshold( ) ),
79 m_twoBodyThreshold( a_reaction.twoBodyThreshold( ) ),
80 m_fissionResiduaIntid( -1 ),
81 m_fissionResiduaIndex( -1 ),
82 m_fissionResiduaUserIndex( -1 ),
83 m_fissionResiduals(
GIDI::Construction::FissionResiduals::
none ),
84 m_fissionResidualMass( 0.0 ),
87 m_GRIN_specialSampleProducts( false ),
88 m_GRIN_inelasticThreshold( 0.0 ),
89 m_GRIN_maximumCaptureIncidentEnergy( 0.0 ),
90 m_GRIN_inelastic( nullptr ),
91 m_GRIN_capture( nullptr ) {
94#ifndef MCGIDI_USE_OUTPUT_CHANNEL
99 std::set<std::string> product_ids;
101 a_reaction.
productIDs( product_ids, a_particles,
false );
102 m_productIntids.
reserve( product_ids.size( ) );
103 m_productIndices.
reserve( product_ids.size( ) );
104 m_userProductIndices.
reserve( product_ids.size( ) );
105 m_productMultiplicities.
reserve( product_ids.size( ) );
106 for( std::set<std::string>::iterator iter = product_ids.begin( ); iter != product_ids.end( ); ++iter ) {
113 product_ids.clear( );
114 a_reaction.
productIDs( product_ids, a_particles,
true );
115 m_productIntidsTransportable.
reserve( product_ids.size( ) );
116 m_productIndicesTransportable.
reserve( product_ids.size( ) );
117 m_userProductIndicesTransportable.
reserve( product_ids.size( ) );
118 for( std::set<std::string>::iterator iter = product_ids.begin( ); iter != product_ids.end( ); ++iter ) {
120 m_productIndicesTransportable.
push_back(
static_cast<int>( a_setupInfo.
m_popsUser[*iter] ) );
121 m_userProductIndicesTransportable.
push_back( -1 );
135#ifndef MCGIDI_USE_OUTPUT_CHANNEL
136 std::vector<Product *> products;
137 std::vector<DelayedNeutron *> delayedNeutrons;
138 std::vector<Functions::Function1d_d1 *> Qs;
140 m_totalDelayedNeutronMultiplicity =
nullptr;
143 m_products.resize( products.size( ) );
144 for( std::size_t index = 0; index < products.size( ); ++index ) m_products[index] = products[index];
146 m_delayedNeutrons.resize( delayedNeutrons.size( ) );
147 for( std::size_t index = 0; index < delayedNeutrons.size( ); ++index ) m_delayedNeutrons[index] = delayedNeutrons[index];
149 m_Qs.resize( Qs.size( ) );
150 for( std::size_t index = 0; index < Qs.size( ); ++index ) m_Qs[index] = Qs[index];
152 delete m_outputChannel;
156 if( GRIN_continuumGammas !=
nullptr ) {
157 if( m_ENDF_MT == 102 ) {
159 m_GRIN_specialSampleProducts =
true;
161 m_GRIN_capture =
new GRIN_capture( a_setupInfo, *GRIN_continuumGammas );
163 else if( m_ENDF_MT == 91 ) {
165 if( inelasticIncidentEnergies.
size( ) > 0 ) {
166 m_GRIN_specialSampleProducts =
true;
167 GIDI::GRIN::InelasticIncidentEnergy
const *inelasticIncidentEnergy = inelasticIncidentEnergies.
get<GIDI::GRIN::InelasticIncidentEnergy
const>( 0 );
168 m_GRIN_inelasticThreshold = inelasticIncidentEnergy->
energy( );
169 m_GRIN_inelastic =
new GRIN_inelastic( a_setupInfo, *GRIN_continuumGammas );
180#ifdef MCGIDI_USE_OUTPUT_CHANNEL
181 delete m_outputChannel;
183 delete m_totalDelayedNeutronMultiplicity;
184 for(
auto iter = m_products.begin( ); iter != m_products.end( ); ++iter )
delete *iter;
185 for(
auto iter = m_delayedNeutrons.begin( ); iter != m_delayedNeutrons.end( ); ++iter )
delete *iter;
186 for(
auto iter = m_Qs.begin( ); iter != m_Qs.end( ); ++iter )
delete *iter;
200#ifdef MCGIDI_USE_OUTPUT_CHANNEL
201 return( m_outputChannel->
finalQ( a_energy ) );
204 for(
auto Q_iter = m_Qs.begin( ); Q_iter != m_Qs.end( ); ++Q_iter ) Q += (*Q_iter)->evaluate( a_energy );
221 return( m_protareSingle->reactionCrossSection( m_reactionIndex, a_URR_protareInfos, a_hashIndex, a_temperature, a_energy_in,
false ) );
234 return( m_protareSingle->reactionCrossSection( m_reactionIndex, a_URR_protareInfos, a_temperature, a_energy_in ) );
245 return( m_protareSingle->heatedCrossSections( ).reactionCrossSectionAsGIDI_XYs1d( m_reactionIndex, a_temperature ) );
261 for(
Vector<int>::iterator iter = m_productIndices.begin( ); iter != m_productIndices.end( ); ++iter, ++i1 ) {
262 if( *iter == a_index )
return( m_productMultiplicities[i1] );
280 for(
Vector<int>::iterator iter = m_productIntids.begin( ); iter != m_productIntids.end( ); ++iter, ++i1 ) {
281 if( *iter == a_intid )
return( m_productMultiplicities[i1] );
299 double multiplicity = 0.0;
301 if( m_crossSectionThreshold > a_projectileEnergy )
return( multiplicity );
304 for(
Vector<int>::iterator iter = m_productIndices.begin( ); iter != m_productIndices.end( ); ++iter, ++i1 ) {
305 if( *iter == a_index ) {
306 multiplicity = m_productMultiplicities[i1];
311 if( multiplicity < 0 ) {
312#ifdef MCGIDI_USE_OUTPUT_CHANNEL
316 for(
auto productIter = m_products.begin( ); productIter != m_products.end( ); ++productIter ) {
317 multiplicity += (*productIter)->productAverageMultiplicity( a_index, a_projectileEnergy );
320 if( ( m_totalDelayedNeutronMultiplicity !=
nullptr ) && ( a_index == m_neutronIndex ) ) {
321 multiplicity += m_totalDelayedNeutronMultiplicity->evaluate( a_projectileEnergy );
326 return( multiplicity );
341 double multiplicity = 0.0;
343 if( m_crossSectionThreshold > a_projectileEnergy )
return( multiplicity );
346 for(
Vector<int>::iterator iter = m_productIntids.begin( ); iter != m_productIntids.end( ); ++iter, ++i1 ) {
347 if( *iter == a_intid ) {
348 multiplicity = m_productMultiplicities[i1];
353 if( multiplicity < 0 ) {
354#ifdef MCGIDI_USE_OUTPUT_CHANNEL
358 for(
auto productIter = m_products.begin( ); productIter != m_products.end( ); ++productIter ) {
359 multiplicity += (*productIter)->productAverageMultiplicityViaIntid( a_intid, a_projectileEnergy );
363 multiplicity += m_totalDelayedNeutronMultiplicity->evaluate( a_projectileEnergy );
368 return( multiplicity );
380#ifdef MCGIDI_USE_OUTPUT_CHANNEL
383 for(
auto productIter = m_products.begin( ); productIter != m_products.end( ); ++productIter ) {
384 (*productIter)->setUserParticleIndex( a_particleIndex, a_userParticleIndex );
387 for(
auto iter = m_delayedNeutrons.begin( ); iter != m_delayedNeutrons.end( ); ++iter )
388 (*iter)->setUserParticleIndex( a_particleIndex, a_userParticleIndex );
391 for( std::size_t i1 = 0; i1 < m_productIndices.size( ); ++i1 ) {
392 if( m_productIndices[i1] == a_particleIndex ) m_userProductIndices[i1] = a_userParticleIndex;
395 for( std::size_t i1 = 0; i1 < m_productIndicesTransportable.size( ); ++i1 ) {
396 if( m_productIndicesTransportable[i1] == a_particleIndex ) m_userProductIndicesTransportable[i1] = a_userParticleIndex;
399 if( a_particleIndex == m_fissionResiduaIndex ) m_fissionResiduaUserIndex = a_userParticleIndex;
401 if( m_GRIN_capture !=
nullptr ) m_GRIN_capture->setUserParticleIndex( a_particleIndex, a_userParticleIndex );
402 if( m_GRIN_inelastic !=
nullptr ) m_GRIN_inelastic->setUserParticleIndex( a_particleIndex, a_userParticleIndex );
414#ifdef MCGIDI_USE_OUTPUT_CHANNEL
417 for(
auto productIter = m_products.begin( ); productIter != m_products.end( ); ++productIter ) {
418 (*productIter)->setUserParticleIndexViaIntid( a_particleIntid, a_userParticleIndex );
421 for(
auto iter = m_delayedNeutrons.begin( ); iter != m_delayedNeutrons.end( ); ++iter )
422 (*iter)->setUserParticleIndexViaIntid( a_particleIntid, a_userParticleIndex );
425 for( std::size_t i1 = 0; i1 < m_productIntids.size( ); ++i1 ) {
426 if( m_productIntids[i1] == a_particleIntid ) m_userProductIndices[i1] = a_userParticleIndex;
429 for( std::size_t i1 = 0; i1 < m_productIntidsTransportable.size( ); ++i1 ) {
430 if( m_productIntidsTransportable[i1] == a_particleIntid ) m_userProductIndicesTransportable[i1] = a_userParticleIndex;
433 if( a_particleIntid == m_fissionResiduaIntid ) m_fissionResiduaUserIndex = a_userParticleIndex;
435 if( m_GRIN_capture !=
nullptr ) m_GRIN_capture->setUserParticleIndexViaIntid( a_particleIntid, a_userParticleIndex );
436 if( m_GRIN_inelastic !=
nullptr ) m_GRIN_inelastic->setUserParticleIndexViaIntid( a_particleIntid, a_userParticleIndex );
447#ifdef MCGIDI_USE_OUTPUT_CHANNEL
450 m_products[0]->setModelDBRC_data( a_modelDBRC_data );
462#ifdef MCGIDI_USE_OUTPUT_CHANNEL
463 m_outputChannel->addOrphanProductToProductList( a_associatedOrphanProducts );
465 for(
auto productIter = m_products.begin( ); productIter != m_products.end( ); ++productIter ) {
466 a_associatedOrphanProducts.push_back( *productIter );
479#ifdef MCGIDI_USE_OUTPUT_CHANNEL
480 m_outputChannel->addOrphanProductToProductList( a_associatedOrphanProducts );
482 for(
auto productIter = m_products.begin( ); productIter != m_products.end( ); ++productIter ) {
483 a_associatedOrphanProducts.
push_back( *productIter );
496 for(
auto associatedOrphanProductIndex = m_associatedOrphanProductIndices.begin( );
497 associatedOrphanProductIndex != m_associatedOrphanProductIndices.end( ); ++associatedOrphanProductIndex ) {
498 Reaction *orphanProduct = a_orphanProducts[*associatedOrphanProductIndex];
511 std::vector<Product *>
const &a_associatedOrphanProducts ) {
513 m_associatedOrphanProductIndices.reserve( a_associatedOrphanProductIndcies.size( ) );
514 for(
auto iter = a_associatedOrphanProductIndcies.begin( ); iter != a_associatedOrphanProductIndcies.end( ); ++iter )
515 m_associatedOrphanProductIndices.push_back( *iter );
517 m_associatedOrphanProducts.reserve( a_associatedOrphanProducts.size( ) );
518 for(
auto iter = a_associatedOrphanProducts.begin( ); iter != a_associatedOrphanProducts.end( ); ++iter )
519 m_associatedOrphanProducts.push_back( *iter );
559#ifdef MCGIDI_USE_OUTPUT_CHANNEL
560 bool haveChannel = m_outputChannel !=
nullptr;
574 m_outputChannel->
serialize( a_buffer, a_mode );
579 m_totalDelayedNeutronMultiplicity =
serializeFunction1d( a_buffer, a_mode, m_totalDelayedNeutronMultiplicity );
585 std::size_t vectorSize = m_associatedOrphanProducts.size( );
586 int vectorSizeInt = (int) vectorSize;
588 vectorSize = (std::size_t) vectorSizeInt;
590 m_associatedOrphanProducts.reserve( vectorSize, &a_buffer.
m_placement ); }
592 a_buffer.
m_placement += m_associatedOrphanProducts.internalSize( );
596 m_protareSingle =
nullptr;
604 if( m_GRIN_specialSampleProducts ) {
607 if( m_ENDF_MT == 91 ) {
615 if( m_ENDF_MT == 91 ) {
624 if( m_ENDF_MT == 91 ) {
631 if( m_ENDF_MT == 91 ) {
632 m_GRIN_inelastic->serialize( a_buffer, a_mode ); }
634 m_GRIN_capture->serialize( a_buffer, a_mode );
#define DATA_MEMBER_STRING(member, buf, mode)
#define DATA_MEMBER_VECTOR_INT(member, buf, mode)
#define DATA_MEMBER_CAST(member, buf, mode, someType)
#define DATA_MEMBER_SIZE_T(member, buf, mode)
#define DATA_MEMBER_VECTOR_SIZE_T(member, buf, mode)
#define DATA_MEMBER_DOUBLE(member, buf, mode)
#define DATA_MEMBER_INT( member, buf, mode)
#define MCGIDI_nullReaction
Suite const & inelasticIncidentEnergies() const
Suite const & captureLevelProbabilities() const
PhysicalQuantity const & maximumCaptureIncidentEnergy() const
Construction::FissionResiduals fissionResiduals() const
int productMultiplicity(std::string const &a_productID) const
OutputChannel * outputChannel() const
void productIDs(std::set< std::string > &a_ids, Transporting::Particles const &a_particles, bool a_transportablesOnly) const
T * get(std::size_t a_Index)
LUPI_HOST_DEVICE void incrementPlacement(std::size_t a_delta)
LUPI_HOST_DEVICE void serialize(LUPI::DataBuffer &a_buffer, LUPI::DataBuffer::Mode a_mode)
LUPI_HOST_DEVICE double finalQ(double a_x1) const
LUPI_HOST void setUserParticleIndexViaIntid(int a_particleIntid, int a_userParticleIndex)
LUPI_HOST_DEVICE double productAverageMultiplicity(int a_index, double a_projectileEnergy) const
LUPI_HOST void setUserParticleIndex(int a_particleIndex, int a_userParticleIndex)
LUPI_HOST void moveProductsEtAlToReaction(std::vector< Product * > &a_products, Functions::Function1d **a_totalDelayedNeutronMultiplicity, std::vector< DelayedNeutron * > &a_delayedNeutrons, std::vector< Functions::Function1d_d1 * > &a_Qs)
LUPI_HOST_DEVICE double productAverageMultiplicityViaIntid(int a_intid, double a_projectileEnergy) const
LUPI_HOST void setModelDBRC_data(Sampling::Upscatter::ModelDBRC_data *a_modelDBRC_data)
LUPI_HOST void addOrphanProductToProductList(std::vector< Product * > &a_associatedOrphanProducts) const
LUPI_HOST_DEVICE double productAverageMultiplicity(int a_index, double a_projectileEnergy) const
LUPI_HOST_DEVICE int productMultiplicity(int a_index) const
LUPI_HOST_DEVICE void serialize(LUPI::DataBuffer &a_buffer, LUPI::DataBuffer::Mode a_mode)
LUPI_HOST void setOrphanProductData(std::vector< std::size_t > const &a_associatedOrphanProductIndcies, std::vector< Product * > const &a_associatedOrphanProducts)
LUPI_HOST void setUserParticleIndexViaIntid(int a_particleIntid, int a_userParticleIndex)
LUPI_HOST_DEVICE int productMultiplicityViaIntid(int a_intid) const
LUPI_HOST void setUserParticleIndex(int a_particleIndex, int a_userParticleIndex)
LUPI_HOST_DEVICE ~Reaction()
LUPI_HOST_DEVICE double finalQ(double a_energy) const
LUPI_HOST_DEVICE double crossSection(URR_protareInfos const &a_URR_protareInfos, std::size_t a_hashIndex, double a_temperature, double a_energy) const
LUPI_HOST_DEVICE double productAverageMultiplicityViaIntid(int a_intid, double a_projectileEnergy) const
LUPI_HOST_DEVICE Reaction()
LUPI_HOST void setModelDBRC_data(Sampling::Upscatter::ModelDBRC_data *a_modelDBRC_data)
LUPI_HOST GIDI::Functions::XYs1d crossSectionAsGIDI_XYs1d(double a_temperature) const
GIDI::GRIN::GRIN_continuumGammas const * m_GRIN_continuumGammas
bool m_hasFinalStatePhotons
PoPI::Database const & m_popsUser
PoPI::Database const & m_pops
LUPI_HOST_DEVICE void push_back(const T &dataElem)
LUPI_HOST_DEVICE void reserve(std::size_t s, char **address=nullptr, bool mem_flag=CPU_MEM)
std::vector< Styles::TemperatureInfo > TemperatureInfos
Simple C++ string class, useful as replacement for std::string if this cannot be used,...
LUPI_HOST int MCGIDI_popsIntid(PoPI::Database const &a_pops, std::string const &a_ID)
LUPI_HOST_DEVICE void serializeFissionResiduals(GIDI::Construction::FissionResiduals &a_fissionResiduals, LUPI::DataBuffer &a_buffer, LUPI::DataBuffer::Mode a_mode)
LUPI_HOST_DEVICE void serializeDelayedNeutrons(LUPI::DataBuffer &a_buffer, LUPI::DataBuffer::Mode a_mode, Vector< DelayedNeutron * > &a_delayedNeutrons)
LUPI_HOST_DEVICE void serializeQs(LUPI::DataBuffer &a_buffer, LUPI::DataBuffer::Mode a_mode, Vector< Functions::Function1d_d1 * > &a_Qs)
LUPI_HOST int MCGIDI_popsIndex(PoPI::Database const &a_pops, std::string const &a_ID)
LUPI_HOST_DEVICE Functions::Function1d * serializeFunction1d(LUPI::DataBuffer &a_buffer, LUPI::DataBuffer::Mode a_mode, Functions::Function1d *a_function1d)
LUPI_HOST_DEVICE void serializeProducts(LUPI::DataBuffer &a_buffer, LUPI::DataBuffer::Mode a_mode, Vector< Product * > &a_products)
static std::string const FissionProductENDL99125
static std::string const FissionProductENDL99120
static int constexpr FissionProductENDL99120
static int constexpr neutron
static int constexpr FissionProductENDL99125