12#ifndef MCGIDI_CrossSectionLinearSubSearch
13 #ifndef MCGIDI_CrossSectionBinarySubSearch
14 #define MCGIDI_CrossSectionBinarySubSearch
42 *a_energyFraction = 1.0;
44 if( a_energy <= a_energies[0] )
return( 0 );
45 if( a_energy >= a_energies.
back( ) ) {
46 *a_energyFraction = 0.0;
47 return( ( a_energies.
size( ) - 2 ) );
50 std::size_t index1 = a_hashIndices[a_hashIndex];
52#ifdef MCGIDI_CrossSectionLinearSubSearch
53 while( a_energies[index1] > a_energy ) --index1;
54 while( a_energies[index1] < a_energy ) ++index1;
58#ifdef MCGIDI_CrossSectionBinarySubSearch
59 std::size_t index2 = a_hashIndices[a_hashIndex];
60 std::size_t index3 = a_energies.
size( ) - 1;
61 if( ( a_hashIndex + 1 ) < a_hashIndices.
size( ) ) index3 = a_hashIndices[a_hashIndex+1] + 1;
62 if( index3 == a_energies.
size( ) ) --index3;
63 if( index2 != index3 ) index2 =
static_cast<std::size_t
>(
binarySearchVectorBounded( a_energy, a_energies, index2, index3,
false ) );
66#ifdef MCGIDI_CrossSectionBinarySubSearch
67 #ifdef MCGIDI_CrossSectionLinearSubSearch
68 if( index1 != index2 ) {
69 std::cerr <<
"Help " << index1 <<
" " << index2 << std::endl;
75 *a_energyFraction = ( a_energies[index1+1] - a_energy ) / ( a_energies[index1+1] - a_energies[index1] );
132 double energyFraction;
166 double crossSectionMax2 = 0.0;
167 double energyFraction;
170 double speedMin = a_speed - 4 * a_targetThermalSpeed;
171 if( speedMin < 0.0 ) speedMin = 0.0;
172 double energyMin = 0.5 *
m_neutronMass * speedMin * speedMin;
173 std::size_t hashIndex =
m_domainHash.index( energyMin );
176 double speedMax = a_speed + 4 * a_targetThermalSpeed;
177 double energyMax = 0.5 *
m_neutronMass * speedMax * speedMax;
180 if( indexMax <
m_energies.size( ) ) ++indexMax;
182 for( std::size_t index = indexMin; index < indexMax; ++index ) {
186 return( crossSectionMax2 );
219 bool haveDBRC = a_modelDBRC_data !=
nullptr;
236 a_modelDBRC_data->
serialize( a_buffer, a_mode );
239 return( a_modelDBRC_data );
248 m_generator( a_generator ),
263 m_wantVelocity( a_wantVelocity ),
278 m_dataInTargetFrame =
false;
280 m_temperature = a_temperature;
281 m_modelTemperature = a_temperature;
284 m_modelEnergy = a_energy;
#define DATA_MEMBER_CAST(member, buf, mode, someType)
#define DATA_MEMBER_VECTOR_DOUBLE(member, buf, mode)
#define DATA_MEMBER_VECTOR_SIZE_T(member, buf, mode)
#define DATA_MEMBER_DOUBLE(member, buf, mode)
#define MCGIDI_particleBeta(a_mass_unitOfEnergy, a_kineticEnergy)
LUPI_HOST_DEVICE void incrementPlacement(std::size_t a_delta)
LUPI_HOST_DEVICE ClientCodeRNGData(double(*a_generator)(void *), void *a_state)
LUPI_HOST_DEVICE ClientRandomNumberGenerator(double(*a_generator)(void *), void *a_state)
LUPI_HOST_DEVICE double crossSectionMax(double a_energy, double a_targetThermalSpeed)
Vector< std::size_t > m_hashIndices
MCGIDI::DomainHash m_domainHash
LUPI_HOST_DEVICE void serialize(LUPI::DataBuffer &a_buffer, LUPI::DataBuffer::Mode a_mode)
LUPI_HOST_DEVICE double targetThermalSpeed(double a_temperature)
LUPI_HOST_DEVICE double evaluate(double a_energy)
Vector< double > m_energies
LUPI_HOST_DEVICE ~ModelDBRC_data()
Vector< double > m_crossSections
LUPI_HOST_DEVICE ModelDBRC_data()
LUPI_HOST_DEVICE std::size_t size() const
LUPI_HOST_DEVICE T & back()
LUPI_HOST_DEVICE ModelDBRC_data * serializeModelDBRC_data(LUPI::DataBuffer &a_buffer, LUPI::DataBuffer::Mode a_mode, ModelDBRC_data *a_modelDBRC_data)
LUPI_HOST_DEVICE std::size_t evaluationForHashIndex(std::size_t a_hashIndex, Vector< std::size_t > const &a_hashIndices, double a_energy, Vector< double > const &a_energies, double *a_energyFraction)
Simple C++ string class, useful as replacement for std::string if this cannot be used,...
LUPI_HOST_DEVICE int binarySearchVectorBounded(double a_x, Vector< double > const &a_Xs, std::size_t a_lower, std::size_t a_upper, bool a_boundIndex)