40 for( std::size_t index = 0; index < cells.size( ); ++index ) {
45 sum += std::stod( cells[index] );
68 m_levels.reserve( a_levels.size( ) );
73 for( std::size_t index = 0; index < a_levels.size( ); ++index ) {
74 m_levels.push_back( a_levels[index] );
75 sum += a_probabilities[index];
118 m_levelsAndProbabilities( a_setupInfo, a_pops, inelasticIncidentEnergy->table( ), true ) {
120 std::vector<std::size_t> indices;
121 std::vector<double> thresholds;
122 std::size_t index = 0;
123 double priorThreshold = -1;
124 for(
auto iter = m_levelsAndProbabilities.m_levels.begin( ); iter != m_levelsAndProbabilities.m_levels.end( ); ++iter, ++index ) {
125 NuclideGammaBranchStateInfo const *nuclideGammaBranchStateInfo = a_setupInfo.m_protare.nuclideGammaBranchStateInfos( )[static_cast<std::size_t>(*iter)];
126 double levelEnergy = nuclideGammaBranchStateInfo->nuclearLevelEnergy( );
128 double threshold = ( a_projectileMass + a_targetMass + levelEnergy / 2 ) * levelEnergy / a_targetMass;
129 if( threshold > priorThreshold ) {
130 if( thresholds.size( ) > 0 )
131 indices.push_back( index - 1 );
132 thresholds.push_back( threshold );
133 priorThreshold = threshold;
136 indices.push_back( m_levelsAndProbabilities.m_levels.size( ) - 1 );
139 m_thresholds = thresholds;
154 std::size_t index = 0;
156 for(
auto iter = m_thresholds.begin( ); iter != m_thresholds.end( ); ++iter, ++index ) {
157 if( *iter >= a_projectileEnergy )
break;
160 if( index == 0 )
return( -1 );
164 double randomMax = a_random * m_levelsAndProbabilities.m_summedProbabilities[m_indices[index]];
165 for( index = 0; index < m_levelsAndProbabilities.m_levels.size( ) - 1; ++index ) {
166 if( m_levelsAndProbabilities.m_summedProbabilities[index] >= randomMax ) {
170 return( m_levelsAndProbabilities.m_levels[index] );
185 m_levelsAndProbabilities.serialize( a_buffer, a_mode );
205 m_neutronIndex( a_setupInfo.m_neutronIndex ),
206 m_neutronUserParticleIndex( -1 ),
207 m_neutronMass( a_setupInfo.m_protare.projectileMass( ) ),
209 m_targetIntid( a_setupInfo.m_protare.targetIntid( ) ),
210 m_targetIndex( a_setupInfo.m_protare.targetIndex( ) ),
211 m_targetUserParticleIndex( -1 ),
212 m_targetMass( a_setupInfo.m_protare.targetMass( ) ) {
216 m_energies.reserve( inelasticIncidentEnergies.
size( ) );
217 m_inelasticForEnergy.reserve( inelasticIncidentEnergies.
size( ) );
218 for( std::size_t index = 0; index < inelasticIncidentEnergies.
size( ); ++index ) {
220 GIDI::GRIN::InelasticIncidentEnergy const *inelasticIncidentEnergy = inelasticIncidentEnergies.get<GIDI::GRIN::InelasticIncidentEnergy>( index );
222 m_energies.push_back( inelasticIncidentEnergy->energy( ) );
223 m_inelasticForEnergy.push_back( new GRIN_inelasticForEnergy( a_setupInfo, m_neutronMass, m_targetMass, pops, inelasticIncidentEnergy ) );
232 for(
auto iter = m_inelasticForEnergy.begin( ); iter != m_inelasticForEnergy.end( ); ++iter )
delete *iter;
244 if( m_neutronIndex == a_particleIndex ) m_neutronUserParticleIndex = a_userParticleIndex;
245 if( m_targetIndex == a_particleIndex ) m_targetUserParticleIndex = a_userParticleIndex;
258 if( m_targetIntid == a_particleIntid ) m_targetUserParticleIndex = a_userParticleIndex;
282 std::size_t vectorSize = m_inelasticForEnergy.size( );
283 int vectorSizeInt = (int) vectorSize;
285 vectorSize = (std::size_t) vectorSizeInt;
288 m_inelasticForEnergy.resize( vectorSize, &a_buffer.
m_placement );
289 for( std::size_t vectorIndex = 0; vectorIndex < vectorSize; ++vectorIndex ) {
298 a_buffer.
m_placement += m_inelasticForEnergy.internalSize( );
302 for( std::size_t vectorIndex = 0; vectorIndex < vectorSize; ++vectorIndex ) {
303 m_inelasticForEnergy[vectorIndex]->serialize( a_buffer, a_mode );
324 m_index( static_cast<
std::size_t>( a_setupInfo.m_stateNamesToIndices[a_compoundId] ) ),
325 m_continuumIndices( ) {
330 auto ids = gammaDecayData.
ids( );
333 std::vector<int> levels;
334 levels.reserve( ids.size( ) );
335 std::vector<double> probabilities2;
336 probabilities2.reserve( ids.size( ) );
338 PoPI::Nuclide const &daughter = a_pops.get<PoPI::Nuclide const>( ids[index] );
339 if( daughter.kind( ) != PoPI_continuumChars ) continue;
340 levels.push_back( a_setupInfo.m_stateNamesToIndices[ids[index]] );
341 probabilities2.push_back( probabilities1[index] );
343 m_continuumIndices.set( levels, probabilities2 );
364 m_continuumIndices.serialize( a_buffer, a_mode );
385 m_knownLevelsAndProbabilities( a_setupInfo, a_pops, a_captureLevelProbability->table( ), false ) {
388 m_captureToCompounds.reserve( capturePrimaryToContinua.size( ) );
389 for( std::size_t i1 = 0; i1 < capturePrimaryToContinua.size( ); ++i1 ) {
390 m_captureToCompounds.push_back(
new GRIN_captureToCompound( a_setupInfo, a_pops, capturePrimaryToContinua[i1] ) );
411 m_knownLevelsAndProbabilities.serialize( a_buffer, a_mode );
413 std::size_t vectorSize = m_captureToCompounds.size( );
414 int vectorSizeInt = (int) vectorSize;
416 vectorSize = (std::size_t) vectorSizeInt;
419 m_captureToCompounds.resize( vectorSize, &a_buffer.
m_placement );
420 for( std::size_t vectorIndex = 0; vectorIndex < vectorSize; ++vectorIndex ) {
429 a_buffer.
m_placement += m_captureToCompounds.internalSize( );
433 for( std::size_t vectorIndex = 0; vectorIndex < vectorSize; ++vectorIndex ) {
434 m_captureToCompounds[vectorIndex]->serialize( a_buffer, a_mode );
446 m_captureNeutronSeparationEnergy( 0.0 ),
447 m_residualIntid( -1 ),
448 m_residualIndex( -1 ),
449 m_residualUserIndex( -1 ),
450 m_residualMass( 0.0 ) {
460 m_captureNeutronSeparationEnergy( GRIN_continuumGammas.captureNeutronSeparationEnergy( ).value( ) ),
461 m_residualIntid( GRIN_continuumGammas.captureResidualIntid( ) ),
462 m_residualIndex( GRIN_continuumGammas.captureResidualIndex( ) ),
463 m_residualUserIndex( -1 ),
464 m_residualMass( GRIN_continuumGammas.captureResidualMass( ) ) {
469 m_summedProbabilities.reserve( captureLevelProbabilities.
size( ) );
470 m_captureLevelProbabilities.reserve( captureLevelProbabilities.
size( ) );
472 for( std::size_t index = 0; index < captureLevelProbabilities.
size( ); ++index ) {
473 GIDI::GRIN::CaptureLevelProbability const *captureLevelProbability = captureLevelProbabilities.get<GIDI::GRIN::CaptureLevelProbability const>( 0 );
475 sum += captureLevelProbability->probabilty( );
476 m_summedProbabilities.push_back( sum );
477 m_captureLevelProbabilities.push_back( new GRIN_captureLevelProbability( a_setupInfo, pops, captureLevelProbability ) );
486 for(
auto iter = m_captureLevelProbabilities.begin( ); iter != m_captureLevelProbabilities.end( ); ++iter )
delete *iter;
498 if( m_residualIndex == a_particleIndex ) m_residualUserIndex = a_userParticleIndex;
510 if( m_residualIntid == a_particleIntid ) m_residualUserIndex = a_userParticleIndex;
531 std::size_t vectorSize = m_captureLevelProbabilities.size( );
532 int vectorSizeInt = (int) vectorSize;
534 vectorSize = (std::size_t) vectorSizeInt;
537 m_captureLevelProbabilities.resize( vectorSize, &a_buffer.
m_placement );
538 for( std::size_t vectorIndex = 0; vectorIndex < vectorSize; ++vectorIndex ) {
547 a_buffer.
m_placement += m_captureLevelProbabilities.internalSize( );
551 for( std::size_t vectorIndex = 0; vectorIndex < vectorSize; ++vectorIndex ) {
552 m_captureLevelProbabilities[vectorIndex]->serialize( a_buffer, a_mode );
#define DATA_MEMBER_VECTOR_INT(member, buf, mode)
#define DATA_MEMBER_VECTOR_BOOL(member, buf, mode)
#define DATA_MEMBER_VECTOR_DOUBLE(member, buf, mode)
#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 PoPI_continuumChars
std::string const & capturePrimaryToContinua() const
Suite const & inelasticIncidentEnergies() const
Suite const & captureLevelProbabilities() const
PoPI::Database const & pops() const
std::string const & body() const
Data const & data() const
LUPI_HOST_DEVICE void incrementPlacement(std::size_t a_delta)
LUPI_HOST_DEVICE ~GRIN_captureLevelProbability()
LUPI_HOST_DEVICE GRIN_captureLevelProbability()
LUPI_HOST_DEVICE void serialize(LUPI::DataBuffer &a_buffer, LUPI::DataBuffer::Mode a_mode)
LUPI_HOST_DEVICE GRIN_captureToCompound()
LUPI_HOST_DEVICE std::size_t index() const
LUPI_HOST_DEVICE void serialize(LUPI::DataBuffer &a_buffer, LUPI::DataBuffer::Mode a_mode)
LUPI_HOST_DEVICE ~GRIN_captureToCompound()
LUPI_HOST void setUserParticleIndexViaIntid(int a_particleIntid, int a_userParticleIndex)
LUPI_HOST_DEVICE void serialize(LUPI::DataBuffer &a_buffer, LUPI::DataBuffer::Mode a_mode)
LUPI_HOST_DEVICE GRIN_capture()
LUPI_HOST void setUserParticleIndex(int a_particleIndex, int a_userParticleIndex)
LUPI_HOST_DEVICE ~GRIN_capture()
LUPI_HOST_DEVICE int sampleLevelIndex(double a_projectileEnergy, double a_random) const
LUPI_HOST_DEVICE void serialize(LUPI::DataBuffer &a_buffer, LUPI::DataBuffer::Mode a_mode)
LUPI_HOST_DEVICE GRIN_inelasticForEnergy()
LUPI_HOST_DEVICE ~GRIN_inelasticForEnergy()
LUPI_HOST void setUserParticleIndex(int a_particleIndex, int a_userParticleIndex)
LUPI_HOST_DEVICE ~GRIN_inelastic()
LUPI_HOST void setUserParticleIndexViaIntid(int a_particleIntid, int a_userParticleIndex)
LUPI_HOST_DEVICE GRIN_inelastic()
LUPI_HOST_DEVICE void serialize(LUPI::DataBuffer &a_buffer, LUPI::DataBuffer::Mode a_mode)
LUPI_HOST_DEVICE ~GRIN_levelsAndProbabilities()
LUPI_HOST_DEVICE GRIN_levelsAndProbabilities()
Vector< bool > m_isModelledLevel
LUPI_HOST_DEVICE void serialize(LUPI::DataBuffer &a_buffer, LUPI::DataBuffer::Mode a_mode)
LUPI_HOST void set(std::vector< int > const &a_levels, std::vector< double > const &a_probabilities)
Vector< double > m_summedProbabilities
std::map< std::string, int > m_stateNamesToIndices
T const & get(std::string const &a_id) const
std::vector< double > const & probabilities() const
std::vector< std::string > const & ids() const
std::vector< std::string > splitString(std::string const &a_string, char a_delimiter, bool a_strip=false)
std::string stripString(std::string const &a_string, bool a_left=true, bool a_right=true)
Simple C++ string class, useful as replacement for std::string if this cannot be used,...
static int constexpr neutron