34Flux_order::Flux_order( std::size_t a_order, std::size_t a_length,
double const *a_energies,
double const *a_fluxes ) :
37 for( std::size_t i1 = 0; i1 < a_length; ++i1 ) m_energies.push_back( a_energies[i1] );
38 for( std::size_t i1 = 0; i1 < a_length; ++i1 ) m_fluxes.push_back( a_fluxes[i1] );
47Flux_order::Flux_order( std::size_t a_order, std::vector<double>
const &a_energies, std::vector<double>
const &a_fluxes ) :
49 m_energies( a_energies ),
50 m_fluxes( a_fluxes ) {
52 if( a_energies.size( ) != a_fluxes.size( ) )
throw Exception(
"Flux_order::Flux_order: a_energies.size( ) != a_fluxes.size( )." );
60 m_order( a_fluxOrder.
order( ) ),
62 m_fluxes( a_fluxOrder.
v_fluxes( ) ) {
81 auto nE = m_energies.size( );
82 bool printIndent =
true;
84 std::cout <<
" ORDER: " << m_order <<
" (number of points = " << m_energies.size( ) <<
")" << std::endl;
85 for( std::size_t iE = 0; iE < nE; ++iE ) {
86 if( printIndent ) std::cout <<
" ";
90 if( ( ( iE + 1 ) % a_valuesPerLine ) == 0 ) {
91 std::cout << std::endl;
95 if( nE % a_valuesPerLine ) std::cout << std::endl;
107Flux::Flux( std::string
const &a_label,
double a_temperature ) :
109 m_temperature( a_temperature ) {
120 m_temperature( a_temperature ) {
129 m_label( a_flux.
label( ) ),
152 auto order = a_fluxOrder.
order( );
154 if( order > m_fluxOrders.size( ) )
throw Exception(
"Flux::addFluxOrder: order > m_fluxOrders.size( )." );
155 m_fluxOrders.push_back( a_fluxOrder );
170 std::vector<double> groupedFlux;
172 int64_t
size =
static_cast<int64_t
>( a_multiGroup.size( ) );
174 if( boundaries ==
nullptr )
throw Exception(
"ptwX_create failted for boundaries." );
176 for( ; i1 < 1; ++i1 ) {
177 Flux_order const *__fluxOrder = &(m_fluxOrders[i1]);
179 10, 1e-3, 10, 10,
static_cast<int64_t
>( __fluxOrder->
size( ) ), __fluxOrder->
energies( ),
180 __fluxOrder->
fluxes( ), 0 );
181 if( __flux ==
nullptr )
throw Exception(
"ptwXY_createFrom_Xs_Ys failed for __flux." );
184 if( groupedFluxX ==
nullptr )
throw Exception(
"ptwXY_groupOneFunction failed for groupedFluxX." );
204void Flux::print( std::string
const &a_indent,
bool a_outline,
unsigned int a_valuesPerLine )
const {
206 std::cout << a_indent <<
"FLUX: label = '" << m_label <<
"': maximum order = " << (
size( ) - 1 ) << std::endl;
207 if( a_outline )
return;
208 for( std::vector<Flux_order>::const_iterator iter = m_fluxOrders.begin( ); iter < m_fluxOrders.end( ); ++iter )
209 iter->print( a_valuesPerLine );
226 initialize( a_fileName.c_str( ), a_temperature_MeV );
238 initialize( a_fileName, a_temperature_MeV );
248void Fluxes_from_bdfls::initialize(
char const *a_fileName,
double a_temperature_MeV ) {
250 char buffer[132], *pEnd, cValue[16];
251 std::size_t numberOfValuesInOrders[16];
252 FILE *fIn = fopen( a_fileName,
"r" );
253 if( fIn ==
nullptr )
throw Exception(
"Fluxes_from_bdfls::initialize: Could not open bdfls file." );
256 if( fgets( buffer, 132, fIn ) ==
nullptr )
throw Exception(
"Fluxes_from_bdfls::initialize: fgets failed for fid." );
257 if( strlen( buffer ) > 73 ) {
258 if( buffer[72] ==
'1' )
break;
264 if( fgets( buffer, 132, fIn ) ==
nullptr )
throw Exception(
"Fluxes_from_bdfls::initialize: fgets failed for fid." );
265 if( strlen( buffer ) > 73 ) {
266 if( buffer[72] ==
'1' )
break;
268 fid = (int) strtol( buffer, &pEnd, 10 );
269 if( fid == -1 )
throw Exception(
"Fluxes_from_bdfls::initialize: converting fid to long failed." );
271 Flux
flux( label, a_temperature_MeV );
273 long maximumFluxOrder2( -1 );
274 if( fgets( buffer, 132, fIn ) ==
nullptr )
throw Exception(
"Fluxes_from_bdfls::initialize: fgets failed for maximumFluxOrder." );
275 maximumFluxOrder2 = strtol( buffer, &pEnd, 10 );
276 std::size_t maximumFluxOrder =
static_cast<std::size_t
>( maximumFluxOrder2 );
277 if(
static_cast<long>( maximumFluxOrder ) != maximumFluxOrder2 )
throw Exception(
"Fluxes_from_bdfls::initialize: converting maximumFluxOrder to long failed." );
278 if( maximumFluxOrder >= (
long) (
sizeof( numberOfValuesInOrders ) /
sizeof( numberOfValuesInOrders[0] ) ) )
279 throw Exception(
"Fluxes_from_bdfls::initialize: need to increase size of numberOfValuesInOrders" );
281 for( std::size_t order = 0; order <= maximumFluxOrder; ++order ) {
282 long numberOfValuesInOrders2 = -1;
283 if( fgets( buffer, 132, fIn ) ==
nullptr )
throw Exception(
"Fluxes_from_bdfls::initialize: fgets failed for maximumFluxOrders." );
284 numberOfValuesInOrders2 = strtol( buffer, &pEnd, 10 );
285 if( numberOfValuesInOrders2 == -1 )
throw Exception(
"Fluxes_from_bdfls::initialize: converting numberOfValuesInOrders[order] to long failed." );
286 numberOfValuesInOrders[order] =
static_cast<std::size_t
>( numberOfValuesInOrders2 ) / 2;
289 for( std::size_t order = 0; order <= maximumFluxOrder; ++order ) {
290 std::size_t index = 0;
291 long numberOfValuesInOrder = 2 *
static_cast<long>( numberOfValuesInOrders[order] );
292 std::vector<double> energiesAndFluxes(
static_cast<std::size_t
>( numberOfValuesInOrder ) );
293 while( numberOfValuesInOrder > 0 ) {
295 if( numberOfValuesInOrder < 6 ) n1 =
static_cast<std::size_t
>( numberOfValuesInOrder );
296 if( fgets( buffer, 132, fIn ) ==
nullptr )
throw Exception(
"Fluxes_from_bdfls::initialize: fgets failed for energies/fluxes." );
297 for( std::size_t i1 = 0; i1 < n1; ++i1, ++index ) {
298 strncpy( cValue, &buffer[12*i1], 12 );
300 energiesAndFluxes[index] = strtod( cValue, &pEnd );
302 numberOfValuesInOrder -=
static_cast<long>( n1 );
305 std::vector<double> energies( numberOfValuesInOrders[order] );
306 std::vector<double>
fluxes( numberOfValuesInOrders[order] );
307 for( index = 0; index < numberOfValuesInOrders[order]; ++index ) {
308 energies[index] = energiesAndFluxes[2*index];
309 fluxes[index] = energiesAndFluxes[2*index+1];
312 Flux_order flux_order( order, energies,
fluxes );
313 flux.addFluxOrder( flux_order );
315 m_fluxes.push_back(
flux );
339 for( std::size_t if1 = 0; if1 < m_fluxes.size( ); ++if1 ) {
340 if( m_fluxes[if1].label( ) == label )
return( m_fluxes[if1] );
342 throw Exception(
"Fluxes_from_bdfls::getViaFID: fid not found." );
359 axes.append(
new Axis( 2,
"energy_in",
"MeV" ) );
360 axes.append(
new Axis( 1,
"mu",
"" ) );
361 axes.append(
new Axis( 0,
"flux",
"1/s" ) );
368 std::vector<double>
const &energies =
flux[0].v_energies( );
369 for( std::size_t i1 = 0; i1 < energies.size( ); ++i1 ) {
371 std::vector<double> &coefficients = legendre1d->
coefficients( );
373 for( std::size_t i2 = 0; i2 <
flux.size( ); ++i2 ) coefficients.push_back(
flux[i2].fluxes( )[i1] );
374 xys2d->
append( legendre1d );
389 auto size = m_fluxes.size( );
390 std::vector<std::string> _labels( size );
392 for( std::size_t if1 = 0; if1 < size; ++if1 ) _labels[if1] = m_fluxes[if1].label( );
404 auto size = m_fluxes.size( );
405 std::vector<int> fids( size );
408 for( std::size_t if1 = 0; if1 < size; ++if1 ) {
409 fids[if1] = (int) strtol( &(m_fluxes[if1].label( ).c_str( )[9]), &e, 10 );
423 auto nfs = m_fluxes.size( );
425 std::cout <<
"BDFLS FLUXes: number of fluxes = " << nfs << std::endl;
426 for( std::size_t if1 = 0; if1 < nfs ; ++if1 ) m_fluxes[if1].
print(
" ", a_outline, a_valuesPerLine );
444 std::vector<Functions::Function2dForm *>
const function2ds = xys3d.
function2ds( );
445 std::vector<Transporting::Flux>
fluxes;
447 for( std::size_t i1 = 0; i1 < function2ds.size( ); ++i1 ) {
450 if( function2d.
type( ) !=
FormType::XYs2d )
throw Exception(
"Currently, only a 2d function of type XYs2d is supported for flux f(E,mu)." );
453 std::vector<Functions::Function1dForm *>
const &function1ds = xys2d.
function1ds( );
456 std::size_t maxOrder = 0;
457 std::vector<double> energies;
458 std::vector< std::vector<double> > fluxMatrix;
460 for( std::size_t i2 = 0; i2 < function1ds.size( ); ++i2 ) {
468 std::vector<double> &coefficients =
const_cast< std::vector<double> &
>( legendre1d.
coefficients( ) );
469 if( maxOrder < coefficients.size( ) ) maxOrder = coefficients.size( );
470 fluxMatrix.push_back( coefficients );
473 for( std::size_t order = 0; order < maxOrder; ++order ) {
474 std::vector<double> energyFluxAtOrder;
476 for( std::size_t i2 = 0; i2 < function1ds.size( ); ++i2 ) {
477 energyFluxAtOrder.push_back( 0.0 );
478 if( order < fluxMatrix[i2].size( ) ) energyFluxAtOrder[i2] = fluxMatrix[i2][order];
482 flux.addFluxOrder( fluxOrder );
void append(Axis *a_axis)
std::vector< double > const & coefficients() const
void append(Function1dForm *a_function1d)
std::vector< Function1dForm * > const & function1ds() const
void append(Function2dForm *a_function2d)
std::vector< Function2dForm * > const & function2ds() const
double const * fluxes() const
std::vector< double > const & v_fluxes() const
std::size_t order() const
void print(unsigned int a_valuesPerLine=10) const
double const * energies() const
std::vector< double > const & v_energies() const
Flux_order(std::size_t a_order, std::size_t a_length, double const *a_energies, double const *a_fluxes)
Flux(std::string const &a_label, double a_temperature_MeV)
ProcessedFlux process(std::vector< double > const &a_multiGroup) const
std::string const & label() const
void print(std::string const &a_indent, bool a_outline=true, unsigned int a_valuesPerLine=10) const
std::size_t maxOrder() const
double temperature() const
void addFluxOrder(Flux_order const &a_fluxOrder)
void print(bool a_outline=true, unsigned int a_valuesPerLine=10) const
std::vector< std::string > labels() const
Flux getViaFID(int a_fid) const
std::vector< int > FIDs() const
Fluxes_from_bdfls(std::string const &a_fileName, double a_temperature_MeV)
Functions::XYs3d * get3dViaFID(int a_fid) const
std::string LLNL_fidToLabel(int a_fid)
std::vector< Transporting::Flux > settingsFluxesFromFunction3d(Functions::Function3dForm const &a_function3d)
std::string argumentsToString(char const *a_format,...)
char const * ptwXY_interpolationToString(ptwXY_interpolation interpolation)
@ ptwXY_group_normType_none
@ ptwXY_interpolationLinLin
struct ptwXYPoints_s ptwXYPoints
ptwXYPoints * ptwXY_createFrom_Xs_Ys(statusMessageReporting *smr, ptwXY_interpolation interpolation, char const *interpolationString, double biSectionMax, double accuracy, int64_t primarySize, int64_t secondarySize, int64_t length, double const *Xs, double const *Ys, int userFlag)
ptwXYPoints * ptwXY_free(ptwXYPoints *ptwXY)
ptwXPoints * ptwXY_groupOneFunction(statusMessageReporting *smr, ptwXYPoints *ptwXY, ptwXPoints *groupBoundaries, ptwXY_group_normType normType, ptwXPoints *ptwX_norm)
int64_t ptwX_length(statusMessageReporting *smr, ptwXPoints *ptwX)
double ptwX_getPointAtIndex_Unsafely(ptwXPoints *ptwX, int64_t index)
struct ptwXPoints_s ptwXPoints
ptwXPoints * ptwX_create(statusMessageReporting *smr, int64_t size, int64_t length, double const *xs)
ptwXPoints * ptwX_free(ptwXPoints *ptwX)