14static Vector collapseVector(
Vector const &a_vector, std::vector<std::size_t>
const &a_collapseIndices,
15 std::vector<double>
const &a_weight,
bool a_normalize );
34 std::vector<double>
const &multiGroupFlux(
flux->multiGroupFlux( ) );
35 std::vector<std::size_t>
const &collapseIndices( projectile->
collapseIndices( ) );
37 return( collapseVector( a_vector, collapseIndices, multiGroupFlux,
true ) );
50static Vector collapseVector( Vector
const &a_vector, std::vector<std::size_t>
const &a_collapseIndices,
51 std::vector<double>
const &a_weight,
bool a_normalize ) {
53 std::size_t n1( a_collapseIndices.size( ) - 1 );
54 std::size_t index1( a_collapseIndices[0] );
55 Vector vectorCollapsed( n1 );
57 if( a_vector.size( ) > 0 ) {
58 for( std::size_t i1 = 0; i1 < n1; ++i1 ) {
59 std::size_t index2( a_collapseIndices[i1+1] );
63 for( std::size_t i2 = index1; i2 < index2; ++i2 ) {
64 fluxSum += a_weight[i2];
65 valueSum += a_weight[i2] * a_vector[i2];
67 if( a_normalize && ( fluxSum != 0 ) ) valueSum /= fluxSum;
68 vectorCollapsed[i1] = valueSum;
73 return( vectorCollapsed );
93 std::vector<double>
const &multiGroupFlux(
flux->multiGroupFlux( ) );
94 std::vector<std::size_t>
const &projectileCollapseIndices( projectile->
collapseIndices( ) );
97 std::size_t n2 =
product->numberOfGroups( );
99 std::vector<std::size_t> productCollapseIndices(
product->collapseIndices( ) );
100 productCollapseIndices[0] = 0;
101 productCollapseIndices[n2] = a_matrix[0].
size( );
103 std::vector<double> conservationWeight( a_matrix[0].size( ), 1. );
105 std::vector<double> boundaries =
product->fineMultiGroup().boundaries();
106 for( std::size_t i1 = 0; i1 < boundaries.size() - 1; ++i1 ) {
107 conservationWeight[i1] = 0.5 * (boundaries[i1] + boundaries[i1+1]);
111 Matrix productCollapsed( 0, 0 );
112 for( std::size_t i1 = 0; i1 < a_matrix.
size( ); ++i1 ) {
113 productCollapsed.
push_back( collapseVector( a_matrix[i1], productCollapseIndices, conservationWeight,
false ) );
117 Matrix collapsedTranspose( 0, 0 );
118 for( std::size_t i2 = 0; i2 < n2; ++i2 ) {
119 collapsedTranspose.
push_back( collapseVector( productCollapsedTranspose[i2], projectileCollapseIndices, multiGroupFlux,
true ) );
123 double denominator = 1;
124 std::vector<double> boundaries =
product->multiGroup().boundaries();
125 for( std::size_t i1 = 0; i1 < boundaries.size() - 1; ++i1 ) {
126 denominator = 0.5 * (boundaries[i1] + boundaries[i1+1]);
127 collapsedTranspose[i1] /= denominator;
131 return( collapsedTranspose.
transpose( ) );
144 return( a_vector - a_transportCorrection );
157 std::size_t size = a_transportCorrection.
size( );
158 Matrix corrected( a_matrix );
160 if( size == 0 )
return( corrected );
161 if( a_matrix.
size( ) == 0 ) {
162 corrected =
Matrix( size, size ); }
164 if( size != a_matrix.
size( ) )
throw Exception(
"transportCorrect: matrix rows different than vector size." );
167 for( std::size_t index = 0; index < size; ++index ) corrected[index][index] -= a_transportCorrection[index];
216 std::vector<double>
const &boundaries = a_boundaries.
boundaries( );
217 int64_t boundariesSize =
static_cast<int64_t
>( boundaries.size( ) );
218 ptwXPoints *boundaries_xs =
ptwX_create(
nullptr, boundariesSize, boundariesSize, &(boundaries[0]) );
219 if( boundaries_xs ==
nullptr )
throw Exception(
"GIDI::multiGroup: ptwX_create failed." );
222 double const *energies = flux_order_0.
energies( );
225 12, 1e-3,
static_cast<int64_t
>( flux_order_0.
size( ) ), 10,
static_cast<int64_t
>( flux_order_0.
size( ) ), energies,
fluxes, 0 );
226 if( fluxes_xys ==
nullptr ) {
228 throw Exception(
"GIDI::multiGroup: ptwXY_createFrom_Xs_Ys failed." );
232 if( multiGroupFlux ==
nullptr ) {
235 throw Exception(
"GIDI::multiGroup: ptwXY_groupOneFunction failed." );
240 if( ptwXY !=
nullptr ) {
248 if(
groups ==
nullptr )
throw Exception(
"GIDI::multiGroup: ptwXY_groupTwoFunctions failed." );
272 ptwXYPoints *ptwXY1 =
nullptr, *ptwXY2 =
nullptr, *fluxes_xys =
nullptr;
274 std::string errorMessage(
"GIDI::multiGroupTwoXYs1ds: ptwXY_clone2 for a_function1 failed." );
278 if( ptwXY1 !=
nullptr ) {
280 if( ptwXY2 ==
nullptr ) {
281 errorMessage =
"GIDI::multiGroupTwoXYs1ds: ptwXY_clone2 for a_function2 failed."; }
283 double min1, min2, max1, max2;
290 std::max( min1, min2 ), std::min( max1, max2), 10, 1 );
292 if( fluxes_xys ==
nullptr ) {
293 errorMessage =
"GIDI::multiGroupTwoXYs1ds: ptwXY_domainSlice for flux failed."; }
327static void multiGroupSetup( Transporting::MultiGroup
const &a_boundaries,
ptwXPoints **a_boundaries_xs,
330 std::vector<double>
const &boundaries = a_boundaries.boundaries( );
331 int64_t boundariesSize =
static_cast<int64_t
>( boundaries.size( ) );
332 *a_boundaries_xs =
ptwX_create(
nullptr, boundariesSize, boundariesSize, &(boundaries[0]) );
333 if( *a_boundaries_xs ==
nullptr )
throw Exception(
"GIDI::multiGroup: ptwX_create failed." );
335 Transporting::Flux_order
const &flux_order_0 = a_flux[0];
336 double const *energies = flux_order_0.energies( );
337 double const *
fluxes = flux_order_0.fluxes( );
339 12, 1e-3,
static_cast<int64_t
>( flux_order_0.size( ) ), 10,
static_cast<int64_t
>( flux_order_0.size( ) ), energies,
fluxes, 0 );
340 if( *a_fluxes_xys ==
nullptr ) {
341 *a_boundaries_xs =
ptwX_free( *a_boundaries_xs );
342 throw Exception(
"GIDI::multiGroup: ptwXY_createFrom_Xs_Ys failed." );
346 if( *a_multiGroupFlux ==
nullptr ) {
347 *a_boundaries_xs =
ptwX_free( *a_boundaries_xs );
349 throw Exception(
"GIDI::multiGroup: ptwXY_groupOneFunction failed." );
370 if( xys1d ==
nullptr ) {
373 if( constand1d !=
nullptr ) {
391 throw Exception(
"calculate1dMultiGroupDataInComponent: from findInstanceOfTypeInLineage, no XYs1d, Constant1d, Regions1d, Branching1d or Polynomial1d form found in "
392 + a_component.
toXLink( ) +
"." );
419 if( a_gridded1d ==
nullptr )
return;
430 throw Exception(
"calculate1dMultiGroupFissionEnergyRelease: form not XYs1d or Polynomial1d: " + a_evaluated->
toXLink( ) +
"." );
437 if( a_evaluated != xys1d )
delete xys1d;
#define GIDI_regions1dChars
#define GIDI_branching1dChars
#define GIDI_constant1dChars
#define GIDI_polynomial1dChars
void setData(Vector const &a_data)
ptwXYPoints const * ptwXY() const
XYs1d * asXYs1d(bool a_asLinlin, double a_accuray, double a_lowerEps, double a_upperEps) const
static XYs1d * makeConstantXYs1d(Axes const &a_axes, double a_domainMin, double a_domainMax, double a_value)
void push_back(Vector const &a_vector)
Form const * findInstanceOfTypeInLineage(std::string const &_label, std::string const &a_moniker) const
T * get(std::size_t a_Index)
double const * fluxes() const
double const * energies() const
std::vector< double > const & boundaries() const
std::vector< std::size_t > const & collapseIndices() const
ProcessedFlux const * nearestProcessedFluxToTemperature(double a_temperature) const
Particle const * particle(std::string const &a_particleID) const
Matrix multiGroupZeroMatrix(Particles const &a_particles, std::string const &a_particleID, bool a_collapse=true) const
std::string const & projectileID() const
std::string const & moniker() const
std::string toXLink() const
Vector multiGroupXYs1d(Transporting::MultiGroup const &a_boundaries, Functions::XYs1d const &a_function, Transporting::Flux const &a_flux)
void calculate1dMultiGroupFissionEnergyRelease(MultiGroupCalulationInformation const &a_multiGroupCalulationInformation, Functions::XYs1d const &a_weight, Functions::Function1dForm const *a_evaluated, Functions::Function1dForm *a_gridded1d)
void calculate1dMultiGroupDataInComponent(ProtareSingle const *a_protare, std::string const &a_heatedMultiGroupLabel, MultiGroupCalulationInformation const &a_multiGroupCalulationInformation, Component &a_component, Functions::XYs1d const &a_crossSection)
Vector transportCorrect(Vector const &a_vector, Vector const &a_transportCorrection)
Vector collapse(Vector const &a_vector, Transporting::Settings const &a_settings, Transporting::Particles const &a_particles, double a_temperature)
Vector * multiGroupTwoXYs1ds(MultiGroupCalulationInformation const &a_multiGroupCalulationInformation, Functions::XYs1d const &a_function1, Functions::XYs1d const &a_function2)
ptwXYPoints * ptwXY_domainSlice(statusMessageReporting *smr, ptwXYPoints *ptwXY, double domainMin, double domainMax, int64_t secondarySize, int fill)
ptwXYPoints * ptwXY_clone2(statusMessageReporting *smr, ptwXYPoints const *ptwXY)
char const * ptwXY_interpolationToString(ptwXY_interpolation interpolation)
@ ptwXY_group_normType_none
@ ptwXY_group_normType_norm
ptwXPoints * ptwXY_groupTwoFunctions(statusMessageReporting *smr, ptwXYPoints *ptwXY1, ptwXYPoints *ptwXY2, ptwXPoints *groupBoundaries, ptwXY_group_normType normType, ptwXPoints *ptwX_norm)
@ ptwXY_interpolationLinLin
struct ptwXYPoints_s ptwXYPoints
nfu_status ptwXY_mutualifyDomains(statusMessageReporting *smr, ptwXYPoints *ptwXY1, double lowerEps1, double upperEps1, int positiveXOnly1, ptwXYPoints *ptwXY2, double lowerEps2, double upperEps2, int positiveXOnly2)
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_groupThreeFunctions(statusMessageReporting *smr, ptwXYPoints *ptwXY1, ptwXYPoints *ptwXY2, ptwXYPoints *ptwXY3, ptwXPoints *groupBoundaries, ptwXY_group_normType normType, ptwXPoints *ptwX_norm)
ptwXPoints * ptwXY_groupOneFunction(statusMessageReporting *smr, ptwXYPoints *ptwXY, ptwXPoints *groupBoundaries, ptwXY_group_normType normType, ptwXPoints *ptwX_norm)
nfu_status ptwXY_domainMax(statusMessageReporting *smr, ptwXYPoints *ptwXY, double *value)
nfu_status ptwXY_domainMin(statusMessageReporting *smr, ptwXYPoints *ptwXY, double *value)
int64_t ptwX_length(statusMessageReporting *smr, ptwXPoints *ptwX)
double * ptwX_getPointAtIndex(statusMessageReporting *smr, 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)