26 m_particle(
ParticleInfo( a_productID, a_pops, a_pops, true ) ),
27 m_GNDS_particle(
ParticleInfo( a_productID, a_pops, a_pops, true ) ),
28 m_productMultiplicity( 0 ),
29 m_treatProductAsIfInfinityMass( false ),
34 m_outputChannel( nullptr ) {
39 m_multiplicity.setAncestor(
this );
40 m_distribution.setAncestor(
this );
41 m_averageEnergy.setAncestor(
this );
42 m_averageMomentum.setAncestor(
this );
61 m_particle( a_node.attribute_as_string(
GIDI_pidChars ), a_pops, a_internalPoPs, false ),
62 m_GNDS_particle( a_node.attribute_as_string(
GIDI_pidChars ), a_pops, a_internalPoPs, false ),
63 m_productMultiplicity( 0 ),
64 m_treatProductAsIfInfinityMass( false ),
69 m_outputChannel( nullptr ) {
72 m_multiplicity.setAncestor(
this );
73 m_distribution.setAncestor(
this );
74 m_averageEnergy.setAncestor(
this );
75 m_averageMomentum.setAncestor(
this );
81 if( m_particle.ID( ) == a_setupInfo.m_protare->GNDS_target( ).ID( ) ) m_particle = a_setupInfo.m_protare->target( );
85 m_treatProductAsIfInfinityMass = m_GNDS_particle.ID( ) == a_setupInfo.m_protare->GNDS_target( ).ID( );
90 if( ! _outputChannel.empty( ) )
91 m_outputChannel =
new OutputChannel( a_construction, _outputChannel, a_setupInfo, a_pops, a_internalPoPs, a_styles,
false,
false );
94 if( m_outputChannel ==
nullptr ) {
95 if( m_multiplicity.size( ) > 0 ) {
99 m_productMultiplicity =
static_cast<int>( function1d->
evaluate( 0.0 ) ); }
101 m_productMultiplicity = -1;
105 m_outputChannel->setAncestor(
this );
114 if( m_outputChannel !=
nullptr )
delete m_outputChannel;
125 if( m_outputChannel ==
nullptr )
return( 0 );
126 return( m_outputChannel->depth( ) );
139 m_multiplicity.modifiedMultiGroupElasticForTNSL( a_maximumTNSL_MultiGroupIndex );
140 m_distribution.modifiedMultiGroupElasticForTNSL( a_maximumTNSL_MultiGroupIndex );
141 m_averageEnergy.modifiedMultiGroupElasticForTNSL( a_maximumTNSL_MultiGroupIndex );
142 m_averageMomentum.modifiedMultiGroupElasticForTNSL( a_maximumTNSL_MultiGroupIndex );
153 if( m_outputChannel !=
nullptr )
return( m_outputChannel->hasFission( ) );
167 if( a_isDelayedNeutron ) {
170 if( m_outputChannel !=
nullptr )
return( m_outputChannel->isDelayedFissionNeutronComplete( ) );
187 if( m_outputChannel !=
nullptr )
return( m_outputChannel->areAllProductsTracked( a_particles ) );
189 return( a_particles.
hasParticle( m_particle.ID( ) ) );
239 if( m_outputChannel ==
nullptr ) {
240 if( a_transportablesOnly && !a_particles.
hasParticle( m_particle.ID( ) ) )
return;
241 if( m_particle.ID( ) !=
"" ) a_indices.insert( m_particle.ID( ) ); }
243 m_outputChannel->productIDs( a_indices, a_particles, a_transportablesOnly );
257 if( m_outputChannel !=
nullptr )
return( m_outputChannel->productMultiplicity( a_productID ) );
277 int _maximumLegendreOrder = -1;
279 if( m_outputChannel ==
nullptr ) {
282 a_smr, m_distribution, a_temperatureInfo,
"distribution for maximumLegendreOrder" ) );
283 if( form !=
nullptr ) {
286 _maximumLegendreOrder =
static_cast<int>( data.
size( ) ) - 1;
290 int __maximumLegendreOrder = m_outputChannel->maximumLegendreOrder( a_smr, a_settings, a_temperatureInfo, a_productID );
291 if( __maximumLegendreOrder > _maximumLegendreOrder ) _maximumLegendreOrder = __maximumLegendreOrder;
294 return( _maximumLegendreOrder );
314 if( m_outputChannel ==
nullptr ) {
317 a_smr, m_multiplicity, a_temperatureInfo,
"multiplicity" ) );
318 if( form !=
nullptr ) vector += form->
data( );
321 vector += m_outputChannel->multiGroupMultiplicity( a_smr, a_settings, a_temperatureInfo, a_productID );
345 if( m_outputChannel !=
nullptr ) _vector += m_outputChannel->multiGroupQ( a_smr, a_settings, a_temperatureInfo, a_final );
366 std::size_t a_order )
const {
370 if( m_outputChannel ==
nullptr ) {
373 a_smr, m_distribution, a_temperatureInfo,
"distribution for product matrix" ) );
374 if( form !=
nullptr ) {
377 matrix = data.
matrix( a_order );
381 matrix += m_outputChannel->multiGroupProductMatrix( a_smr, a_settings, a_temperatureInfo, a_particles, a_productID, a_order );
404 if( m_outputChannel ==
nullptr ) {
407 a_smr, m_averageEnergy, a_temperatureInfo,
"average product energy" ) );
408 if( form !=
nullptr ) vector += form->
data( );
411 vector += m_outputChannel->multiGroupAverageEnergy( a_smr, a_settings, a_temperatureInfo, a_productID );
434 if( m_outputChannel ==
nullptr ) {
437 a_smr, m_averageMomentum, a_temperatureInfo,
"average product momentum" ) );
438 if( form !=
nullptr ) vector += form->
data( );
441 vector += m_outputChannel->multiGroupAverageMomentum( a_smr, a_settings, a_temperatureInfo, a_productID );
459 double &a_productEnergy,
double &a_productMomentum,
double &a_productGain,
bool a_ignoreIncompleteParticles )
const {
461 if( m_outputChannel ==
nullptr ) {
462 if( a_particleID == m_particle.ID( ) ) {
464 if( a_ignoreIncompleteParticles )
return;
465 throw Exception(
"GIDI::Product::continuousEnergyProductData: particle is incomplete: " +
toXLink( ) +
"." );
471 m_outputChannel->continuousEnergyProductData( a_settings, a_particleID, a_energy, a_productEnergy, a_productMomentum, a_productGain, a_ignoreIncompleteParticles );
489 std::vector<double>
const &a_energies, std::size_t a_offset, std::vector<double> &a_productEnergies, std::vector<double> &a_productMomenta,
490 std::vector<double> &a_productGains,
bool a_ignoreIncompleteParticles )
const {
492 if( m_outputChannel ==
nullptr ) {
493 if( a_particleID == m_particle.ID( ) ) {
495 if( a_ignoreIncompleteParticles )
return;
496 throw Exception(
"GIDI::Product::mapContinuousEnergyProductData: particle is incomplete: " +
toXLink( ) +
"." );
503 multiplicity1->
mapToXsAndAdd( a_offset, a_energies, a_productGains, 1.0 );
506 m_outputChannel->mapContinuousEnergyProductData( a_settings, a_particleID, a_energies, a_offset, a_productEnergies, a_productMomenta,
507 a_productGains, a_ignoreIncompleteParticles );
520 if( m_multiplicity.size( ) == 0 )
return(
false );
522 if( m_distribution.size( ) == 0 )
return(
false );
536 if( m_outputChannel ==
nullptr ) {
539 m_outputChannel->incompleteParticles( a_settings, a_incompleteParticles );
559 if( m_multiplicity.find( a_heatedMultiGroupLabel ) != m_multiplicity.end( ) ) {
566 if( m_outputChannel !=
nullptr )
567 m_outputChannel->calculateMultiGroupData( a_protare, a_temperatureInfo, a_heatedMultiGroupLabel, a_multiGroupCalulationInformation, a_crossSectionXYs1d );
580 std::string attributes;
586 m_multiplicity.toXMLList( a_writeInfo, indent2 );
587 m_distribution.toXMLList( a_writeInfo, indent2 );
588 m_averageEnergy.toXMLList( a_writeInfo, indent2 );
589 m_averageMomentum.toXMLList( a_writeInfo, indent2 );
590 if( m_outputChannel !=
nullptr ) m_outputChannel->toXMLList( a_writeInfo, indent2 );
#define GIDI_productChars
#define GIDI_outputChannelChars
#define GIDI_multiplicityChars
#define GIDI_averageEnergyChars
#define GIDI_averageMomentumChars
#define GIDI_distributionChars
Matrix matrix(std::size_t a_index) const
Functions::Gridded3d const & data() const
Vector const & data() const
Array3d const & data() const
std::string const & ID() const
Component & averageMomentum()
Vector multiGroupMultiplicity(LUPI::StatusMessageReporting &a_smr, Transporting::MG const &a_settings, Styles::TemperatureInfo const &a_temperatureInfo, std::string const &a_productID) const
Vector multiGroupQ(LUPI::StatusMessageReporting &a_smr, Transporting::MG const &a_settings, Styles::TemperatureInfo const &a_temperatureInfo, bool a_final) const
Component & averageEnergy()
Component & multiplicity()
void toXMLList(GUPI::WriteInfo &a_writeInfo, std::string const &a_indent="") const
Vector multiGroupAverageEnergy(LUPI::StatusMessageReporting &a_smr, Transporting::MG const &a_settings, Styles::TemperatureInfo const &a_temperatureInfo, std::string const &a_productID) const
void mapContinuousEnergyProductData(Transporting::Settings const &a_settings, std::string const &a_particleID, std::vector< double > const &a_energies, std::size_t a_offset, std::vector< double > &a_productEnergies, std::vector< double > &a_productMomenta, std::vector< double > &a_productGains, bool a_ignoreIncompleteParticles) const
GUPI::Ancestry * findInAncestry3(std::string const &a_item)
Product(PoPI::Database const &a_pops, std::string const &a_productID, std::string const &a_label)
bool areAllProductsTracked(Transporting::Particles const &a_particles) const
int productMultiplicity(std::string const &a_productID) const
int maximumLegendreOrder(LUPI::StatusMessageReporting &a_smr, Transporting::MG const &a_settings, Styles::TemperatureInfo const &a_temperatureInfo, std::string const &a_productID) const
bool isDelayedFissionNeutronComplete(bool a_isDelayedNeutron) const
void productIDs(std::set< std::string > &a_ids, Transporting::Particles const &a_particles, bool a_transportablesOnly) const
bool isCompleteParticle() const
void calculateMultiGroupData(ProtareSingle const *a_protare, Styles::TemperatureInfo const &a_temperatureInfo, std::string const &a_heatedMultiGroupLabel, MultiGroupCalulationInformation const &a_multiGroupCalulationInformation, Functions::XYs1d const &a_crossSectionXYs1d)
void modifiedMultiGroupElasticForTNSL(std::map< std::string, std::size_t > const &a_maximumTNSL_MultiGroupIndex)
Matrix multiGroupProductMatrix(LUPI::StatusMessageReporting &a_smr, Transporting::MG const &a_settings, Styles::TemperatureInfo const &a_temperatureInfo, Transporting::Particles const &a_particles, std::string const &a_productID, std::size_t a_order) const
void incompleteParticles(Transporting::Settings const &a_settings, std::set< std::string > &a_incompleteParticles) const
ParticleInfo const & particle() const
void continuousEnergyProductData(Transporting::Settings const &a_settings, std::string const &a_particleID, double a_energy, double &a_productEnergy, double &a_productMomentum, double &a_productGain, bool a_ignoreIncompleteParticles) const
Vector multiGroupAverageMomentum(LUPI::StatusMessageReporting &a_smr, Transporting::MG const &a_settings, Styles::TemperatureInfo const &a_temperatureInfo, std::string const &a_productID) const
bool isPhotoAtomic() const
bool isTNSL_ProtareSingle() const
ParticleInfo const & projectile() const
std::string m_initialState
ParticleSubstitution * m_particleSubstitution
ProtareSingle * m_protare
T * get(std::size_t a_Index)
Form const * form(LUPI::StatusMessageReporting &a_smr, GIDI::Suite const &a_suite, Styles::TemperatureInfo const &a_temperatureInfo, std::string a_dataType, std::string const &a_label="") const
bool hasParticle(std::string const &a_id) const
void setMoniker(std::string const &a_moniker)
std::string const & moniker() const
std::string toXLink() const
void addNodeEnder(std::string const &a_moniker)
std::string incrementalIndent(std::string const &indent)
void addNodeStarter(std::string const &indent, std::string const &a_moniker, std::string const &a_attributes="")
std::string addAttribute(std::string const &a_name, std::string const &a_value) const
Node child(const char *name) const
void calculate1dMultiGroupDataInComponent(ProtareSingle const *a_protare, std::string const &a_heatedMultiGroupLabel, MultiGroupCalulationInformation const &a_multiGroupCalulationInformation, Component &a_component, Functions::XYs1d const &a_crossSection)
Form * parseAverageEnergySuite(Construction::Settings const &a_construction, Suite *parent, HAPI::Node const &a_node, SetupInfo &a_setupInfo, PoPI::Database const &a_pop, PoPI::Database const &a_internalPoPs, std::string const &a_name, Styles::Suite const *a_styles)
Form * parseMultiplicitySuite(Construction::Settings const &a_construction, Suite *parent, HAPI::Node const &a_node, SetupInfo &a_setupInfo, PoPI::Database const &a_pop, PoPI::Database const &a_internalPoPs, std::string const &a_name, Styles::Suite const *a_styles)
Form * parseAverageMomentumSuite(Construction::Settings const &a_construction, Suite *parent, HAPI::Node const &a_node, SetupInfo &a_setupInfo, PoPI::Database const &a_pop, PoPI::Database const &a_internalPoPs, std::string const &a_name, Styles::Suite const *a_styles)
Form * parseDistributionSuite(Construction::Settings const &a_construction, Suite *parent, HAPI::Node const &a_node, SetupInfo &a_setupInfo, PoPI::Database const &a_pop, PoPI::Database const &a_internalPoPs, std::string const &a_name, Styles::Suite const *a_styles)
bool compareSpecialParticleIDs(std::string const &a_id1, std::string const &a_id2)
static std::string const photon