Files
2025-12-05 08:54:02 +01:00

5624 lines
327 KiB
C++

/*
# <<BEGIN-copyright>>
# Copyright 2019, Lawrence Livermore National Security, LLC.
# This file is part of the gidiplus package (https://github.com/LLNL/gidiplus).
# gidiplus is licensed under the MIT license (see https://opensource.org/licenses/MIT).
# SPDX-License-Identifier: MIT
# <<END-copyright>>
*/
#ifndef GIDI_hpp_included
#define GIDI_hpp_included 1
#include <string>
#include <vector>
#include <set>
#include <map>
#include <list>
#include <iostream>
#include <stdexcept>
#include <regex>
#include <GUPI.hpp>
#include <RISI.hpp>
#include <PoPI.hpp>
#include <nf_utilities.h>
#include <nf_buffer.h>
#include <ptwXY.h>
#include "GIDI_data.hpp"
namespace GIDI {
class SetupInfo;
class Form;
class Suite;
class FissionFragmentData;
class OutputChannel;
class Protare;
class ProtareSingle;
class ParticleInfo;
class MultiGroupCalulationInformation;
namespace GRIN {
class GRIN_continuumGammas;
}
typedef std::set<std::size_t> ExcludeReactionsSet;
namespace Functions {
class XYs1d;
class Xs_pdf_cdf1d;
class Branching1d;
class Function2dForm;
} // End namespace Functions.
namespace Map {
class ProtareBase;
class TNSL;
class Map;
} // End of namespace Map.
typedef bool (*MapWalkCallBack)( Map::ProtareBase const *a_protareEntry, std::string const &a_library, void *a_userData, int a_level );
namespace Construction {
class Settings;
} // End of namespace Construction.
namespace Documentation_1_10 {
class Suite;
} // End of namespace Documentation_1_10.
namespace ExternalFiles {
class Suite;
} // End of namespace ExternalFiles
namespace Table {
class Column;
} // End of namespace Table
namespace Styles {
class Suite;
class MultiGroup;
class HeatedMultiGroup;
} // End of namespace Styles.
typedef Form *(*parseSuite)( Construction::Settings const &a_construction, Suite *a_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 );
enum class GNDS_FileType { uninitialized, unknown, pops, protare, covarianceSuite, map };
class GNDS_FileTypeInfo {
private:
GNDS_FileType m_GNDS_fileType;
std::string m_projectileID;
std::string m_targetID;
std::string m_evaluation;
std::string m_interaction;
public:
GNDS_FileTypeInfo( );
GNDS_FileTypeInfo( GNDS_FileType a_GNDS_fileType, std::string const &a_projectileID = "",
std::string const &a_targetID = "", std::string const &a_evaluation = "",
std::string const &a_interaction = "" );
GNDS_FileTypeInfo( GNDS_FileTypeInfo const &a_GNDS_fileTypeInfo );
GNDS_FileTypeInfo &operator=( GNDS_FileTypeInfo const &a_rhs );
GNDS_FileType GNDS_fileType( ) const { return( m_GNDS_fileType ); }
void setGNDS_fileType( GNDS_FileType a_GNDS_fileType ) { m_GNDS_fileType = a_GNDS_fileType; }
std::string const &projectileID( ) const { return( m_projectileID ); }
std::string const &targetID( ) const { return( m_targetID ); }
std::string const &evaluation( ) const { return( m_evaluation ); }
std::string const &interaction( ) const { return( m_interaction ); }
};
enum class ProtareType { single, composite, TNSL };
enum class FormType { generic, lazyParsingHelperForm, group, groups, transportable, flux, fluxes, externalFile, style,
reaction, product, delayedNeutron, fissionFragmentData, rate,
physicalQuantity, axisDomain, axis, grid, axes,
flattenedArrayData, array3d, array,
// 1d functions.
constant1d, XYs1d, Ys1d, polynomial1d, Legendre1d, gridded1d, reference1d, xs_pdf_cdf1d, regions1d,
resonancesWithBackground1d, resonanceBackground1d, resonanceBackgroundRegion1d, URR_probabilityTables1d,
fissionEnergyRelease1d, branching1d, branching1dPids, thermalNeutronScatteringLaw1d, unspecified1d,
// 2d functions.
XYs2d, recoil2d, isotropic2d, discreteGamma2d, primaryGamma2d, regions2d, gridded2d,
generalEvaporation2d, simpleMaxwellianFission2d, evaporation2d, Watt2d, MadlandNix2d,
weighted_function2d, weightedFunctionals2d, NBodyPhaseSpace2d,
// 3d functions.
XYs3d, regions3d, gridded3d,
// distributions.
angularTwoBody, KalbachMann, uncorrelated, unspecified, reference3d, multiGroup3d,
energyAngular, energyAngularMC, angularEnergy, angularEnergyMC, LLNL_angularEnergy,
coherentPhotonScattering, incoherentPhotonScattering, incoherentBoundToFreePhotonScattering, thermalNeutronScatteringLaw, branching3d,
coherentElastic, incoherentElastic, incoherentInelastic, CoulombPlusNuclearElastic3d, LLNLLegendre,
// Sums stuff.
crossSectionSum, multiplicitySum, summands,
// ACE style URR stuff currently in the applicationData node.
ACE_URR_probabilityTable, ACE_URR_incidentEnergy,
// Table stuff.
table, columnHeaders, column,
// Non-GNDS compliant GRIN forms.
GRIN_inelasticIncidentEnergy, GRIN_captureLevelProbability };
enum class Frame { lab, centerOfMass };
enum class TransportCorrectionType { None, Pendlebury, LLNL, Ferguson };
enum class FileType { XML, HDF };
#define GIDI_emptyFileNameChars ""
#define GIDI_mapFormatVersion_0_1Chars "0.1"
#define GIDI_mapFormatVersion_0_2Chars "0.2"
#define GIDI_LLNL_Chars "LLNL"
#define GIDI_LLNL_multiGroupReactions_Chars "LLNL::multiGroupReactions"
#define GIDI_LLNL_multiGroupDelayedNeutrons_Chars "LLNL::multiGroupDelayedNeutrons"
#define GIDI_LLNL_URR_probability_tables_Chars "LLNL::URR_probability_tables"
#define GIDI_LLNL_pointwiseAverageProductEnergies "LLNL::pointwiseAverageProductEnergies"
#define GIDI_LLNL_GRIN_continuumGammas "LLNL::GRIN_continuumGammas"
#define GIDI_mapChars "map"
#define GIDI_importChars "import"
#define GIDI_protareChars "protare"
#define GIDI_TNSLChars "TNSL"
#define GIDI_formatChars "format"
#define GIDI_topLevelChars "reactionSuite"
#define GIDI_covarianceSuiteChars "covarianceSuite"
#define GIDI_externalFilesChars "externalFiles"
#define GIDI_externalFileChars "externalFile"
#define GIDI_documentationChars "documentation"
#define GIDI_documentations_1_10_Chars "documentations"
#define GIDI_stylesChars "styles"
#define GIDI_PoPsChars "PoPs"
#define GIDI_reactionsChars "reactions"
#define GIDI_reactionChars "reaction"
#define GIDI_orphanProductsChars "orphanProducts"
#define GIDI_orphanProductChars "orphanProduct"
#define GIDI_incompleteReactionsChars "incompleteReactions"
#define GIDI_fissionComponentsChars "fissionComponents"
#define GIDI_fissionComponentChars "fissionComponent"
#define GIDI_ACE_URR_probabilityTablesChars "probabilityTables"
#define GIDI_ACE_URR_probabilityTableChars "probabilityTable"
#define GIDI_LLNL_photoAtomicIncoherentDoppler_Chars "LLNL::photoAtomicIncoherentDoppler"
#define GIDI_tableChars "table"
#define GIDI_rowsChars "rows"
#define GIDI_columnsChars "columns"
#define GIDI_columnHeadersChars "columnHeaders"
#define GIDI_columnChars "column"
#define GIDI_nameChars "name"
#define GIDI_typesChars "types"
#define GIDI_dataChars "data"
#define GIDI_sepChars "sep"
#define GIDI_applicationDataChars "applicationData"
#define GIDI_institutionChars "institution"
#define GIDI_nuclearPlusCoulombInterferenceChars "nuclearPlusCoulombInterference"
#define GIDI_sumsChars "sums"
#define GIDI_sumsCrossSectionsChars "crossSections"
#define GIDI_sumsMultiplicitiesChars "multiplicities"
#define GIDI_sumsAddChars "add"
#define GIDI_sumsSummandsChars "summands"
#define GIDI_crossSectionSumsChars "crossSectionSums"
#define GIDI_crossSectionSumChars "crossSectionSum"
#define GIDI_multiplicitySumsChars "multiplicitySums"
#define GIDI_multiplicitySumChars "multiplicitySum"
#define GIDI_doubleDifferentialCrossSectionChars "doubleDifferentialCrossSection"
#define GIDI_crossSectionChars "crossSection"
#define GIDI_availableEnergyChars "availableEnergy"
#define GIDI_availableMomentumChars "availableMomentum"
#define GIDI_QChars "Q"
#define GIDI_productsChars "products"
#define GIDI_productChars "product"
#define GIDI_multiplicityChars "multiplicity"
#define GIDI_distributionChars "distribution"
#define GIDI_averageEnergyChars "averageProductEnergy"
#define GIDI_averageMomentumChars "averageProductMomentum"
#define GIDI_outputChannelChars "outputChannel"
#define GIDI_fissionFragmentDataChars "fissionFragmentData"
#define GIDI_delayedNeutronsChars "delayedNeutrons"
#define GIDI_delayedNeutronChars "delayedNeutron"
#define GIDI_fissionEnergyReleasesChars "fissionEnergyReleases"
#define GIDI_fissionEnergyReleaseChars "fissionEnergyRelease"
#define GIDI_rateChars "rate"
#define GIDI_groupsChars "groups"
#define GIDI_groupChars "group"
#define GIDI_fluxesChars "fluxes"
#define GIDI_evaluatedStyleChars "evaluated"
#define GIDI_crossSectionReconstructedStyleChars "crossSectionReconstructed"
#define GIDI_angularDistributionReconstructedStyleChars "angularDistributionReconstructed"
#define GIDI_CoulombPlusNuclearElasticMuCutoffStyleChars "CoulombPlusNuclearElasticMuCutoff"
#define GIDI_averageProductDataStyleChars "averageProductData"
#define GIDI_MonteCarlo_cdfStyleChars "MonteCarlo_cdf"
#define GIDI_multiGroupStyleChars "multiGroup"
#define GIDI_transportablesChars "transportables"
#define GIDI_transportableChars "transportable"
#define GIDI_realizationChars "realization"
#define GIDI_heatedStyleChars "heated"
#define GIDI_griddedCrossSectionStyleChars "griddedCrossSection"
#define GIDI_URR_probabilityTablesStyleChars "URR_probabilityTables"
#define GIDI_heatedMultiGroupStyleChars "heatedMultiGroup"
#define GIDI_SnElasticUpScatterStyleChars "SnElasticUpScatter"
#define GIDI_projectileEnergyDomainChars "projectileEnergyDomain"
// array monikers and allowed values.
#define GIDI_arrayChars "array"
#define GIDI_noneChars "none"
#define GIDI_valuesChars "values"
#define GIDI_shapeChars "shape"
#define GIDI_compressionChars "compression"
#define GIDI_diagonalChars "diagonal"
#define GIDI_startingIndices "startingIndices"
#define GIDI_flattenedChars "flattened"
#define GIDI_startsChars "starts"
#define GIDI_lengthsChars "lengths"
#define GIDI_embeddedChars "embedded"
#define GIDI_symmetryChars "symmetry"
#define GIDI_lowerChars "lower"
#define GIDI_upperChars "upper"
#define GIDI_permutationChars "permutation"
#define GIDI_plusOneChars "+1"
#define GIDI_minusOneChars "-1"
#define GIDI_storageOrderChars "storageOrder"
#define GIDI_rowMajorChars "rowMajor"
#define GIDI_columnMajorChars "columnMajor"
#define GIDI_offsetChars "offset"
#define GIDI_startIndexChars "startIndex"
// 1d Function monikers.
#define GIDI_constant1dChars "constant1d"
#define GIDI_XYs1dChars "XYs1d"
#define GIDI_Ys1dChars "Ys1d"
#define GIDI_polynomial1dChars "polynomial1d"
#define GIDI_LegendreChars "Legendre"
#define GIDI_regions1dChars "regions1d"
#define GIDI_gridded1dChars "gridded1d"
#define GIDI_referenceChars "reference"
#define GIDI_xs_pdf_cdf1dChars "xs_pdf_cdf1d"
#define GIDI_branching1dChars "branching1d"
#define GIDI_TNSL1dChars "thermalNeutronScatteringLaw1d"
// 2d Function monikers.
#define GIDI_XYs2dChars "XYs2d"
#define GIDI_recoilChars "recoil"
#define GIDI_isotropic2dChars "isotropic2d"
#define GIDI_discreteGammaChars "discreteGamma"
#define GIDI_primaryGammaChars "primaryGamma"
#define GIDI_generalEvaporationChars "generalEvaporation"
#define GIDI_simpleMaxwellianFissionChars "simpleMaxwellianFission"
#define GIDI_evaporationChars "evaporation"
#define GIDI_WattChars "Watt"
#define GIDI_MadlandNixChars "MadlandNix"
#define GIDI_weightedFunctionalsChars "weightedFunctionals"
#define GIDI_NBodyPhaseSpaceChars "NBodyPhaseSpace"
#define GIDI_regions2dChars "regions2d"
#define GIDI_gridded2dChars "gridded2d"
// 3d Function monikers.
#define GIDI_XYs3dChars "XYs3d"
#define GIDI_gridded3dChars "gridded3d"
// Double differentials
#define GIDI_optionsChars "options"
#define GIDI_S_alpha_betaChars "S_alpha_beta"
#define GIDI_S_tableChars "S_table"
#define GIDI_formFactorChars "formFactor"
#define GIDI_realAnomalousFactorChars "realAnomalousFactor"
#define GIDI_imaginaryAnomalousFactorChars "imaginaryAnomalousFactor"
#define GIDI_scatteringFactorChars "scatteringFactor"
#define GIDI_ComptonProfileChars "ComptonProfile"
#define GIDI_boundAtomCrossSectionChars "boundAtomCrossSection"
#define GIDI_characteristicCrossSectionChars "characteristicCrossSection"
#define GIDI_DebyeWallerIntegralChars "DebyeWallerIntegral"
#define GIDI_DebyeWallerChars "DebyeWaller"
#define GIDI_massChars "mass"
#define GIDI_freeAtomCrossSectionChars "freeAtomCrossSection"
#define GIDI_e_criticalChars "e_critical"
#define GIDI_e_maxChars "e_max"
#define GIDI_T_effectiveChars "T_effective"
#define GIDI_UChars "U"
#define GIDI_thetaChars "theta"
#define GIDI_gChars "g"
// Distribution forms.
#define GIDI_multiGroup3dChars "multiGroup3d"
#define GIDI_angularTwoBodyChars "angularTwoBody"
#define GIDI_uncorrelatedChars "uncorrelated"
#define GIDI_angularChars "angular"
#define GIDI_energyChars "energy"
#define GIDI_KalbachMannChars "KalbachMann"
#define GIDI_energyAngularChars "energyAngular"
#define GIDI_energyAngularMCChars "energyAngularMC"
#define GIDI_angularEnergyChars "angularEnergy"
#define GIDI_angularEnergyMCChars "angularEnergyMC"
#define GIDI_LLNLAngularEnergyChars "LLNLAngularEnergy"
#define GIDI_LLNLAngularOfAngularEnergyChars "LLNLAngularOfAngularEnergy"
#define GIDI_LLNLAngularEnergyOfAngularEnergyChars "LLNLAngularEnergyOfAngularEnergy"
#define GIDI_coherentPhotonScatteringChars "coherentPhotonScattering"
#define GIDI_incoherentPhotonScatteringChars "incoherentPhotonScattering"
#define GIDI_incoherentBoundToFreePhotonScatteringChars "incoherentBoundToFreePhotonScattering"
#define GIDI_TNSL_coherentElasticChars "thermalNeutronScatteringLaw_coherentElastic"
#define GIDI_TNSL_incoherentElasticChars "thermalNeutronScatteringLaw_incoherentElastic"
#define GIDI_TNSL_incoherentInelasticChars "thermalNeutronScatteringLaw_incoherentInelastic"
#define GIDI_thermalNeutronScatteringLawChars "thermalNeutronScatteringLaw"
#define GIDI_branching3dChars "branching3d"
#define GIDI_unspecifiedChars "unspecified"
#define GIDI_scatteringAtomsChars "scatteringAtoms"
#define GIDI_scatteringAtomChars "scatteringAtom"
#define GIDI_resonancesWithBackgroundChars "resonancesWithBackground"
#define GIDI_resonancesChars "resonances"
#define GIDI_resonanceBackground1dChars "background"
#define GIDI_resolvedRegionChars "resolvedRegion"
#define GIDI_unresolvedRegionChars "unresolvedRegion"
#define GIDI_fastRegionChars "fastRegion"
#define GIDI_CoulombPlusNuclearElasticChars "CoulombPlusNuclearElastic"
#define GIDI_RutherfordScatteringChars "RutherfordScattering"
#define GIDI_nuclearPlusInterferenceChars "nuclearPlusInterference"
#define GIDI_URR_probabilityTables1dChars "URR_probabilityTables1d"
#define GIDI_LLNLLegendreChars "LLNLLegendre"
#define GIDI_axesChars "axes"
#define GIDI_axisChars "axis"
#define GIDI_gridChars "grid"
#define GIDI_fluxNodeChars "flux"
#define GIDI_function1dsChars "function1ds"
#define GIDI_function2dsChars "function2ds"
#define GIDI_uncertaintyChars "uncertainty"
#define GIDI_fChars "f"
#define GIDI_rChars "r"
#define GIDI_aChars "a"
#define GIDI_bChars "b"
#define GIDI_EFL_Chars "EFL"
#define GIDI_EFH_Chars "EFH"
#define GIDI_T_M_Chars "T_M"
#define GIDI_weightedChars "weighted"
#define GIDI_promptProductKEChars "promptProductKE"
#define GIDI_promptNeutronKEChars "promptNeutronKE"
#define GIDI_delayedNeutronKEChars "delayedNeutronKE"
#define GIDI_promptGammaEnergyChars "promptGammaEnergy"
#define GIDI_delayedGammaEnergyChars "delayedGammaEnergy"
#define GIDI_delayedBetaEnergyChars "delayedBetaEnergy"
#define GIDI_neutrinoEnergyChars "neutrinoEnergy"
#define GIDI_nonNeutrinoEnergyChars "nonNeutrinoEnergy"
#define GIDI_totalEnergyChars "totalEnergy"
#define GIDI_trueChars "true"
#define GIDI_fissionGenreChars "fissionGenre"
#define GIDI_libraryChars "library"
#define GIDI_startChars "start"
#define GIDI_projectileChars "projectile"
#define GIDI_targetChars "target"
#define GIDI_evaluationChars "evaluation"
#define GIDI_interactionChars "interaction"
#define GIDI_standardTargetChars "standardTarget"
#define GIDI_standardEvaluationChars "standardEvaluation"
#define GIDI_projectileFrameChars "projectileFrame"
#define GIDI_ENDF_MT_Chars "ENDF_MT"
#define GIDI_dateChars "date"
#define GIDI_derivedFromChars "derivedFrom"
#define GIDI_versionChars "version"
#define GIDI_temperatureChars "temperature"
#define GIDI_muCutoffChars "muCutoff"
#define GIDI_lMaxChars "lMax"
#define GIDI_parametersChars "parameters"
#define GIDI_upperCalculatedGroupChars "upperCalculatedGroup"
#define GIDI_calculatedAtThermalChars "calculatedAtThermal"
#define GIDI_asymmetricChars "asymmetric"
#define GIDI_valueTypeChars "valueType"
#define GIDI_productFrameChars "productFrame"
#define GIDI_interpolationChars "interpolation"
#define GIDI_interpolationQualifierChars "interpolationQualifier"
#define GIDI_outerDomainValueChars "outerDomainValue"
#define GIDI_indexChars "index"
#define GIDI_labelChars "label"
#define GIDI_unitChars "unit"
#define GIDI_hrefChars "href"
#define GIDI_initialChars "initial"
#define GIDI_finalChars "final"
#define GIDI_minChars "min"
#define GIDI_maxChars "max"
#define GIDI_valueChars "value"
#define GIDI_domainMinChars "domainMin"
#define GIDI_domainMaxChars "domainMax"
#define GIDI_finalStateChars "finalState"
#define GIDI_numberOfProductsChars "numberOfProducts"
#define GIDI_pathChars "path"
#define GIDI_styleChars "style"
#define GIDI_genreChars "genre"
#define GIDI_processChars "process"
#define GIDI_pidChars "pid"
#define GIDI_countChars "count"
#define GIDI_inverseSpeedChars "inverseSpeed"
#define GIDI_centerOfMassChars "centerOfMass"
#define GIDI_labChars "lab"
#define GIDI_twoBodyChars "twoBody"
#define GIDI_NBodyChars "NBody"
// Allowed values for the 'conserve' attribute
#define GIDI_conserveNumberChars "number"
#define GIDI_conserveEnergyOutChars "energyOut"
// TargetInfo.
#define GIDI_targetInfoChars "targetInfo"
#define GIDI_atomFractionChars "atomFraction"
#define GIDI_isotopicAbundancesChars "isotopicAbundances"
// GRIN.
#define GIDI_GRIN_continuumGammasChars "GRIN_continuumGammas"
#define GIDI_captureNeutronSeparationEnergyChars "captureNeutronSeparationEnergy"
#define GIDI_maximumIncidentEnergyChars "maximumIncidentEnergy"
#define GIDI_inelasticIncidentEnergiesChars "inelasticIncidentEnergies"
#define GIDI_inelasticIncidentEnergyChars "inelasticIncidentEnergy"
#define GIDI_captureLevelProbabilitiesChars "captureLevelProbabilities"
#define GIDI_captureLevelProbabilityChars "captureLevelProbability"
#define GIDI_probabilityChars "probability"
#define GIDI_spinUnitChars "spinUnit"
#define GIDI_capturePrimaryToContinuaChars "capturePrimaryToContinua"
typedef std::pair<std::string, double> stringAndDoublePair;
typedef std::vector<stringAndDoublePair> stringAndDoublePairs;
typedef std::map<std::string, ParticleInfo> ParticleSubstitution;
#ifdef _WIN32
#define GIDI_FILE_SEPARATOR "\\"
#else
#define GIDI_FILE_SEPARATOR "/"
#endif
std::vector<std::string> vectorOfStrings( std::string const &a_string );
/*
============================================================
========================= Exception ========================
============================================================
*/
class Exception : public std::runtime_error {
public :
explicit Exception( std::string const &a_message );
};
namespace Construction {
/* *********************************************************************************************************
* This enum allows a user to limit the data read in by various constructors. Limiting the data speeds up the reading
* and parsing, and uses less memory.
***********************************************************************************************************/
enum class ParseMode : int { all, /**< Read and parse all data. */
multiGroupOnly, /**< Only read and parse data needed for multi-group transport. */
MonteCarloContinuousEnergy, /**< Only read and parse data needed for continuous energy Monte Carlo. */
excludeProductMatrices, /**< Read and parse all data but multi-group product matrices. */
readOnly, /**< Only read and parse all the data but do no calculations. Useful for reading an incomplete GNDS file. */
outline, /**< Does parse any component data (e.g., cross section, multiplicity, distribution). */
noParsing /**< Only timing development, must be used with caution. The mode allows one to test the io time without any parsing of the **HAPI::File**. */ };
enum class PhotoMode : int { nuclearAndAtomic, /**< Instructs method Map::protare to create a Protare with both photo-nuclear and photo-atomic data when the projectile is photon. */
nuclearOnly, /**< Instructs method Map::protare to create a Protare with only photo-nuclear data when the projectile is photon. */
atomicOnly /**< Instructs method Map::protare to create a Protare with only photo-atomic data when the projectile is photon. */ };
/* *********************************************************************************************************
* This enum specifies what fission redisual products will be added to the list of products produced in a fission reaction.
***********************************************************************************************************/
enum class FissionResiduals : int {
none, /**< No additional product is produced to the fission reaction. */
ENDL99120, /**< A LLNL ENDL 99120 fission product will be produced with multiplicity 2. */
ENDL99125 /**< A LLNL ENDL 99125 fission product will be produced with multiplicity 2. */ };
/*
============================================================
========================= Settings =========================
============================================================
*/
class Settings {
private:
ParseMode m_parseMode; /**< Parameter used by various constructors to limit data read into. */
PhotoMode m_photoMode; /**< Determines whether photo-nuclear and/or photo-atomic are included a Protare when the projectile is photon. */
int m_useSystem_strtod; /**< Flag passed to the function nfu_stringToListOfDoubles of the numericalFunctions library. */
bool m_lazyParsing; /**< It **true**, **Component** suites are lazy parsed. */
bool m_decayPositronium; /**< If **true**, whenever a positron is created, it is assumed to immediately form positronium and decay into 2 511 KeV photons. Ergo, the photons are produced in the reaction and not a positron. */
bool m_usePhotoAtomicIncoherentDoppler;
FissionResiduals m_fissionResiduals; /**< This member specifies what fission redisual products will be added to the list of products produced in a fission reaction. */
bool m_GRIN_continuumGammas; /**< If true and institution/LLNL::GRIN_continuumGammas are loaded and used in MCGIDI. */
public:
Settings( ParseMode a_parseMode, PhotoMode a_photoMode );
Settings( Settings const &a_settings );
ParseMode parseMode( ) const { return( m_parseMode ); } /**< Returns the value of the *m_parseMode* member. */
PhotoMode photoMode( ) const { return( m_photoMode ); } /**< Returns the value of the *m_photoMode* member. */
void setPhotoMode( PhotoMode a_photoMode ) { m_photoMode = a_photoMode; }
/**< Set the *m_photoMode* member to *a_photoMode*. */
bool lazyParsing( ) const { return( m_lazyParsing ); } /**< Returns the value of the *m_lazyParsing* member. */
void setLazyParsing( bool a_lazyParsing ) { m_lazyParsing = a_lazyParsing; }
/**< Set the *m_lazyParsing* member to *a_lazyParsing*. */
bool decayPositronium( ) const { return( m_decayPositronium ); } /**< Returns the value of the *m_decayPositronium* member. */
void setDecayPositronium( bool a_decayPositronium ) { m_decayPositronium = a_decayPositronium; }
/**< Set the *m_decayPositronium* member to *a_decayPositronium*. */
FissionResiduals fissionResiduals( ) const { return( m_fissionResiduals ); } /**< Returns the value of the *m_fissionResiduals* member. */
void setFissionResiduals( FissionResiduals a_fissionResiduals ) { m_fissionResiduals = a_fissionResiduals ; }
/**< Set the *m_fissionResiduals* member to *a_fissionResiduals*. */
bool GRIN_continuumGammas( void ) const { return( m_GRIN_continuumGammas ); } /**< Returns the value of the *m_GRIN_continuumGammas* member. */
void setGRIN_continuumGammas( bool a_GRIN_continuumGammas ) { m_GRIN_continuumGammas = a_GRIN_continuumGammas; }
/**< Set the *m_GRIN_continuumGammas* member to *a_GRIN_continuumGammas*. */
int useSystem_strtod( ) const { return( m_useSystem_strtod ); } /**< Returns the value of the *m_useSystem_strtod* member. */
void setUseSystem_strtod( bool a_useSystem_strtod ) { m_useSystem_strtod = a_useSystem_strtod ? 1 : 0; }
/**< Set the *m_useSystem_strtod* member to *a_useSystem_strtod*. */
bool usePhotoAtomicIncoherentDoppler( ) const { return( m_usePhotoAtomicIncoherentDoppler ); }
void setUsePhotoAtomicIncoherentDoppler( bool a_usePhotoAtomicIncoherentDoppler ) { m_usePhotoAtomicIncoherentDoppler = a_usePhotoAtomicIncoherentDoppler; }
};
} // End namespace Construction.
/*
============================================================
========================= SetupInfo ========================
============================================================
*/
class SetupInfo {
public:
ProtareSingle *m_protare;
ParticleSubstitution *m_particleSubstitution;
LUPI::FormatVersion m_formatVersion;
Styles::MultiGroup *m_multiGroup;
Styles::HeatedMultiGroup *m_heatedMultiGroup;
bool m_isENDL_C_9;
int m_outputChannelLevel;
std::string m_initialState;
SetupInfo( ProtareSingle *a_protare ) :
m_protare( a_protare ),
m_particleSubstitution( nullptr ),
m_formatVersion( ),
m_multiGroup( nullptr ),
m_heatedMultiGroup( nullptr ),
m_isENDL_C_9( false ),
m_outputChannelLevel( 0 ),
m_initialState( "" ) {
}
SetupInfo( SetupInfo const &a_setupInfo ) :
m_protare( a_setupInfo.m_protare ),
m_particleSubstitution( a_setupInfo.m_particleSubstitution ),
m_formatVersion( a_setupInfo.m_formatVersion ),
m_multiGroup( a_setupInfo.m_multiGroup ),
m_heatedMultiGroup( a_setupInfo.m_heatedMultiGroup ),
m_isENDL_C_9( a_setupInfo.m_isENDL_C_9 ),
m_outputChannelLevel( a_setupInfo.m_outputChannelLevel ),
m_initialState( a_setupInfo.m_initialState ) {
}
~SetupInfo( ) { }
};
/*
============================================================
=========================== Form ===========================
============================================================
*/
class Form : public GUPI::Ancestry {
friend class Table::Column;
private:
Suite *m_parent; /**< The parent for the form. */
FormType m_type; /**< The type of the form. */
std::string m_keyName; /**< The key name used when the **Form** resides in a **Suite**. */
mutable std::string m_keyValue; /**< The value associated with the key. */
std::string m_label; /**< The label for the form. */
public:
Form( FormType a_type );
Form( std::string const &a_moniker, FormType a_type, std::string const &a_label );
Form( HAPI::Node const &a_node, SetupInfo &a_setupInfo, FormType a_type, Suite *a_suite = nullptr );
Form( Form const &a_form );
virtual ~Form( );
Form &operator=( Form const &a_rhs );
Suite *parent( ) const { return( m_parent ); } /**< Returns the value of the *m_parent* member. */
std::string const &label( ) const { return( m_label ); } /**< Returns the value of the *m_label* member. */
void setLabel( std::string const &a_label );
virtual std::string actualMoniker( ) const { return( moniker( ) ); } /**< Returns the value of the moniker. */
std::string const &keyName( ) const ;
void setKeyName( std::string const &a_keyName );
std::string const &keyValue( ) const ;
virtual void setKeyValue( std::string const &a_keyName ) const ;
FormType type( ) const { return( m_type ); } /**< Returns the value of the *m_type* member. */
Form const *sibling( std::string a_label ) const ;
GUPI::Ancestry *findInAncestry3( LUPI_maybeUnused std::string const &a_item ) { return( nullptr ); }
GUPI::Ancestry const *findInAncestry3( LUPI_maybeUnused std::string const &a_item ) const { return( nullptr ); }
std::string xlinkItemKey( ) const {
if( m_label == "" ) return( "" );
return( buildXLinkItemKey( GIDI_labelChars, m_label ) );
} /**< Returns the value of *this*'s key. */
};
/*
============================================================
================== LazyParsingHelperForm ===================
============================================================
*/
class LazyParsingHelperForm : public Form {
private:
Construction::Settings m_construction;
HAPI::Node const m_node;
SetupInfo m_setupInfo;
PoPI::Database const *m_pops;
PoPI::Database const *m_internalPoPs;
std::string m_name;
Styles::Suite const *m_styles;
parseSuite m_parser;
public:
LazyParsingHelperForm( Construction::Settings const &a_construction, Suite *a_parent, HAPI::Node const &a_node,
SetupInfo &a_setupInfo, PoPI::Database const &a_pops, PoPI::Database const &a_internalPoPs, std::string const &a_name,
Styles::Suite const *a_styles, parseSuite a_parser );
~LazyParsingHelperForm( );
std::string actualMoniker( ) const { return( m_name ); } /**< Returns the value of the *m_name* member which is the moniker of the actual form. */
Form *parse( );
};
/*
============================================================
===================== PhysicalQuantity =====================
============================================================
*/
class PhysicalQuantity : public Form {
private:
double m_value; /**< The value for the physical quantity. */
std::string m_unit; /**< The unit for the physical quantity. */
public:
PhysicalQuantity( HAPI::Node const &a_node, SetupInfo &a_setupInfo );
PhysicalQuantity( double a_value, std::string const &a_unit );
PhysicalQuantity( PhysicalQuantity const &a_physicalQuantity ) :
Form( FormType::physicalQuantity ),
m_value( a_physicalQuantity.value( ) ),
m_unit( a_physicalQuantity.unit( ) ) { }
~PhysicalQuantity( );
PhysicalQuantity &operator=( PhysicalQuantity const &a_rhs );
double value( ) const { return( m_value ); } /**< Returns the value of the *m_value* member. */
std::string const &unit( ) const { return( m_unit ); } /**< Returns the value of the *m_unit* member. */
void toXMLList( GUPI::WriteInfo &a_writeInfo, std::string const &a_indent = "" ) const ;
friend std::ostream &operator<<( std::ostream& a_os, PhysicalQuantity const &a_physicalQuantity );
};
/*
============================================================
======================= ParticleInfo =======================
============================================================
*/
class ParticleInfo {
public:
static std::string const IDPortion( std::string const &a_id );
static std::string const qualifierPortion( std::string const &a_id );
private:
std::string m_id; /**< The particle's PoPs id. */
std::string m_qualifier; /**< The particle's qualifier. For example the "1s1/2" in "Th{1s1/2}". */
std::string m_pid; /**< The same as *m_id* unless particle is an alias, then the final particle's id. */
PhysicalQuantity m_mass; /**< The mass of the particle including nuclear excitation energy. */
PhysicalQuantity m_excitationEnergy; /**< If the particle is a PoPI::Nuclide or PoPI::Nucleus, this is it nuclear excitation energy. Otherwise, it is 0. */
public:
ParticleInfo( std::string const &a_id, std::string const &a_pid, double a_mass, double a_excitationEnergy = 0.0 );
ParticleInfo( std::string const &a_id, PoPI::Database const &a_globalPoPs, PoPI::Database const &a_internalPoPs, bool a_requiredInGlobalPoPs );
ParticleInfo( ParticleInfo const &a_particleInfo );
ParticleInfo &operator=( ParticleInfo const &a_rhs );
std::string const &ID( ) const { return( m_id ); } /**< Returns a const reference to *m_id* member. */
std::string const &qualifier( ) const { return( m_qualifier ); } /**< Returns a const reference to *m_qualifier**. */
std::string const &pid( ) const { return( m_pid ); } /**< Returns a const reference to *m_pid* member. */
bool isAlias( ) const { return( m_pid != "" ); } /**< Returns true if particle id is an alias and false otherwise. */
PhysicalQuantity const &mass( ) const { return( m_mass ); } /**< Returns a const reference to *m_mass* member. */
PhysicalQuantity const &excitationEnergy( ) const { return( m_excitationEnergy ); } /**< Returns a const reference to *m_excitationEnergy* member. */
double mass( std::string const &a_unit ) const ;
};
/*
============================================================
======================== AxisDomain ========================
============================================================
*/
class AxisDomain : public Form {
private:
double m_minimum; /**< The minimum value for the domain. */
double m_maximum; /**< The maximum value for the domain. */
std::string m_unit; /**< The unit for the domain. */
public:
AxisDomain( HAPI::Node const &a_node, SetupInfo &a_setupInfo );
AxisDomain( double m_minimum, double m_maximum, std::string const &a_unit );
~AxisDomain( );
double minimum( ) const { return( m_minimum ); } /**< Returns the value of the *m_minimum* member. */
double maximum( ) const { return( m_maximum ); } /**< Returns the value of the *m_maximum* member. */
std::string const &unit( ) const { return( m_unit ); } /**< Returns the value of the *m_unit* member. */
void toXMLList( GUPI::WriteInfo &a_writeInfo, std::string const &a_indent ) const ;
};
/*
============================================================
=========================== Axis ===========================
============================================================
*/
class Axis : public Form {
private:
int m_index; /**< The index for the axis. */
std::string m_unit; /**< The unit for the axis. */
std::string m_href; /**< The **GNDS**'s href if instance points to another Axis or Grid instance. */
public:
Axis( HAPI::Node const &a_node, SetupInfo &a_setupInfo, FormType a_type = FormType::axis );
Axis( int a_index, std::string const &a_label, std::string const &a_unit, FormType a_type = FormType::axis );
Axis( Axis const &a_axis );
virtual ~Axis( );
int index( ) const { return( m_index ); } /**< Returns the value of the *m_index* member. */
std::string const &unit( ) const { return( m_unit ); } /**< Returns the value of the *m_unit* member. */
std::string const &href( ) const { return( m_href ); } /**< Returns the value of the *m_href* member. */
void toXMLList( GUPI::WriteInfo &a_writeInfo, std::string const &a_indent = "" ) const ;
};
/*
============================================================
=========================== Grid ===========================
============================================================
*/
class Grid : public Axis {
private:
std::string m_style; /**< The **GNDS grid**'s style. */
std::string m_keyName; /**< **FIXME**. */
std::string m_keyValue; /**< **FIXME**. */
std::string m_valueType; /**< The type of data in m_values. Can be "Integer32". */
std::string m_interpolation;
nf_Buffer<double> m_values; /**< The **GNDS grid**'s values. */
public:
Grid( HAPI::Node const &a_node, SetupInfo &a_setupInfo, int a_useSystem_strtod );
Grid( Grid const &a_grid );
std::size_t size( ) const { return( m_values.size( ) ); } /**< Returns the number of values in the *m_values* member. */
inline double &operator[]( std::size_t a_index ) noexcept { return( m_values[a_index] ); } /**< Returns the value at m_values[a_index]. */
std::string const &style( ) const { return( m_style ); } /**< Returns the value of the *m_style* member. */
std::string keyName( ) const { return( m_keyName ); } /**< Returns the value of the *m_keyName* member. */
std::string keyValue( ) const { return( m_keyValue ); } /**< Returns the value of the *m_keyValue* member. */
std::string valueType( ) const { return( m_valueType ); } /**< Returns the value of the *m_valueType* member. */
std::string const &interpolation( ) const { return( m_interpolation ); }
nf_Buffer<double> const &values( ) const { return( m_values ); } /**< Returns the value of the *m_values* member. */
nf_Buffer<double> const &data( ) const { return( m_values ); } /**< Returns the value of the *m_values* member. */
void toXMLList( GUPI::WriteInfo &a_writeInfo, std::string const &a_indent = "" ) const ;
};
/*
============================================================
=========================== Axes ===========================
============================================================
*/
class Axes : public Form {
private:
std::vector<Axis *> m_axes; /**< Stores the list of Axis nodes. */
public:
Axes( );
Axes( HAPI::Node const &a_node, SetupInfo &a_setupInfo, int a_useSystem_strtod );
Axes( Axes const &a_axes );
~Axes( );
Axes &operator=( Axes const &a_rhs );
std::size_t size( ) const { return( m_axes.size( ) ); } /**< Returns the number of *Axis* instances in *this*. */
Axis const *operator[]( std::size_t a_index ) const { return( (m_axes[a_index]) ); } /**< Returns m_axes[a_index]. */
std::size_t dimension( ) const { return( m_axes.size( ) - 1 ); } /**< Returns the dimension of the instance. */
void append( Axis *a_axis ) { m_axes.push_back( a_axis ); } /**< Appends *a_axis* to the* list of *Axis* nodes. */
void toXMLList( GUPI::WriteInfo &a_writeInfo, std::string const &a_indent = "" ) const ;
static Axes makeAxes( std::vector<std::pair<std::string, std::string>> const &a_labelsAndUnits );
};
namespace Array {
/*
============================================================
========================= FullArray ========================
============================================================
*/
class FullArray {
public:
FullArray( std::vector<std::size_t> const &a_shape );
FullArray( std::vector<std::size_t> const &a_shape, std::vector<double> const &a_flattenedValues );
~FullArray( ) {}
std::vector<std::size_t> m_shape; /**< The shape of the array. */
std::vector<double> m_flattenedValues; /**< A *std::vector<double>* representing the flattened arrary. */
std::size_t size( ) const { return( m_flattenedValues.size( ) ); }
};
/*
============================================================
=========================== Array ==========================
============================================================
*/
class Array : public Form {
private:
std::vector<std::size_t> m_shape; /**< The shape of the array. */
std::string m_compression; /**< The compression of the array. Allowed values are *none*, *diagonal*, *flattened* or *embedded*. */
std::string m_symmetry; /**< The symmetry of the array. Allowed values are *none*, *lower* or *upper*. */
std::string m_permutation; /**< The permutation of the array. Allowed values are *none*, *-1*, and *1*. */
std::string m_storageOrder; /**< The storage order of the array. Allowed values are *row-major* or *colunn-major*. */
nf_Buffer<double> m_values; /**< The list of *values* of the array. */
nf_Buffer<int> m_starts; /**< If *compression* is *flattened*, this is the *starts* node. If *compression* is *diagonal* this is the *startingIndices* node. Otherwise, this member is not used. */
nf_Buffer<int> m_length; /**< If *compression* is *flattened*, this is the *lengths* node, otherwise, not used. */
nf_Buffer<int> m_offset; /**< The offset of the array. Only used if *this* array is embedded into another array. */
std::vector<Array *> m_array; /**< The list of embedded arrays. This is only used if *compression* is *embedded*. */
public:
Array( HAPI::Node const &a_node, SetupInfo &a_setupInfo, int a_useSystem_strtod );
~Array( );
std::size_t dimension( ) const { return( m_shape.size( ) ); } /**< Returns the dimension of the array. */
std::size_t size( ) const ;
std::vector<std::size_t> const &shape( ) const { return( m_shape ); } /**< Returns a const reference to member *m_shape*. */
FullArray constructArray( ) const ;
void toXMLList( GUPI::WriteInfo &a_writeInfo, std::string const &a_indent ) const ;
};
} // End namespace Array.
/*
============================================================
====================== FlattenedArrayData ==================
============================================================
*/
class FlattenedArrayData : public Form {
public:
std::vector<std::size_t> m_shape; /**< The shape of the flattened array. */
std::size_t m_numberOfStarts; /**< The number of start values. */
std::size_t m_numberOfLengths; /**< The number of length values. */
nf_Buffer<int> m_starts; /**< The start values. */
nf_Buffer<int> m_lengths; /**< The length values. */
nf_Buffer<double> m_dValues; /**< The given array data. */
FlattenedArrayData( HAPI::Node const &a_node, SetupInfo &a_setupInfo, int a_dimensions, int a_useSystem_strtod );
~FlattenedArrayData( );
std::vector<std::size_t> const &shape( ) const { return( m_shape ); }
void setToValueInFlatRange( std::size_t a_start, std::size_t a_end, double a_value );
void toXMLList( GUPI::WriteInfo &a_writeInfo, std::string const &a_indent ) const ;
};
/*
============================================================
========================= Array3d ==========================
============================================================
*/
class Array3d : public Form {
private:
FlattenedArrayData m_array; /**< The 3d array as a FlattenedArrayData instance. */
public:
Array3d( HAPI::Node const &a_node, SetupInfo &a_setupInfo, int a_useSystem_strtod );
~Array3d( );
std::size_t size( ) const { return( m_array.m_shape.back( ) ); } /**< The length of the 3d diminsion. */
Matrix matrix( std::size_t a_index ) const ;
void modifiedMultiGroupElasticForTNSL( std::size_t maxTNSL_index );
void toXMLList( GUPI::WriteInfo &a_writeInfo, std::string const &a_indent ) const { m_array.toXMLList( a_writeInfo, a_indent ); }
};
namespace Functions {
/*
============================================================
====================== FunctionForm ======================
============================================================
*/
class FunctionForm : public Form {
private:
int m_dimension; /**< The dimension of the function (i.e., the number of independent axes. */
Axes m_axes; /**< The axes node for the function. */
ptwXY_interpolation m_interpolation; /**< The interpolation for functions highest independent axis and its dependent axis. */
std::string m_interpolationString; /**< The interpolation for functions highest independent axis and its dependent axis. */
int m_index; /**< Currently not used. */
double m_outerDomainValue; /**< If function is part of a higher dimensional function, this is the next higher dimensions domain value. */
public:
FunctionForm( std::string const &a_moniker, FormType a_type, int a_dimension, ptwXY_interpolation a_interpolation, int a_index, double a_outerDomainValue );
FunctionForm( std::string const &a_moniker, FormType a_type, int a_dimension, Axes const &a_axes, ptwXY_interpolation a_interpolation, int a_index, double a_outerDomainValue );
FunctionForm( Construction::Settings const &a_construction, HAPI::Node const &a_node, SetupInfo &a_setupInfo, FormType a_type, int a_dimension, Suite *a_suite = nullptr );
FunctionForm( FunctionForm const &a_form );
~FunctionForm( );
FunctionForm &operator=( FunctionForm const &a_rhs );
int dimension( ) const { return( m_dimension ); } /**< Returns the value of the *m_dimension* member. */
int index( ) const { return( m_index ); } /**< Returns the value of the *m_index* member. */
double outerDomainValue( ) const { return( m_outerDomainValue ); } /**< Returns the value of the *m_outerDomainValue* member. */
void setOuterDomainValue( double a_outerDomainValue ) { m_outerDomainValue = a_outerDomainValue; }
Axes const &axes( ) const { return( m_axes ); } /**< Returns a const reference to the *m_axes* member. */
Axes &axes( ) { return( m_axes ); } /**< Returns a reference to the *m_axes* member. */
ptwXY_interpolation interpolation( ) const { return( m_interpolation ); } /**< Returns the value of the *m_interpolation* member. */
void setInterpolation( ptwXY_interpolation a_interpolation );
std::string interpolationString( ) const { return( m_interpolationString ); } /**< Returns the value of the *m_interpolationString* member. */
virtual double domainMin( ) const = 0;
virtual double domainMax( ) const = 0;
virtual void toXMLList_func( GUPI::WriteInfo &a_writeInfo, std::string const &a_indent, bool a_embedded, bool a_inRegions ) const ;
void toXMLList( GUPI::WriteInfo &a_writeInfo, std::string const &a_indent ) const { toXMLList_func( a_writeInfo, a_indent, false, false ); }
};
/*
============================================================
======================= Function1dForm =====================
============================================================
*/
class Function1dForm : public FunctionForm {
public:
Function1dForm( std::string const &a_moniker, FormType a_type, ptwXY_interpolation a_interpolation, int a_index, double a_outerDomainValue );
Function1dForm( std::string const &a_moniker, FormType a_type, Axes const &a_axes, ptwXY_interpolation a_interpolation, int a_index, double a_outerDomainValue );
Function1dForm( Construction::Settings const &a_construction, HAPI::Node const &a_node, SetupInfo &a_setupInfo, FormType a_type, Suite *a_suite = nullptr );
Function1dForm( Function1dForm const &a_form );
~Function1dForm( );
Function1dForm &operator=( Function1dForm const &a_rhs );
virtual double evaluate( double a_x1 ) const = 0;
virtual void mapToXsAndAdd( std::size_t a_offset, std::vector<double> const &a_Xs, std::vector<double> &a_results, double a_scaleFactor ) const ;
virtual XYs1d *asXYs1d( bool a_asLinlin, double a_accuray, double a_lowerEps, double a_upperEps ) const ;
virtual void write( FILE *a_file, std::string const &a_format ) const ;
void print( std::string const &a_format ) const ;
};
/*
============================================================
========================= Constant1d =======================
============================================================
*/
class Constant1d : public Function1dForm {
private:
double m_value; /**< The constant value of the function. */
double m_domainMin; /**< The minimum domain value the function is valid. */
double m_domainMax; /**< The maximum domain value the function is valid. */
public:
Constant1d( Axes const &a_axes, double value, double a_domainMin, double a_domainMax, int a_index = 0, double a_outerDomainValue = 0.0 );
Constant1d( Construction::Settings const &a_construction, HAPI::Node const &a_node, SetupInfo &a_setupInfo, Suite *a_parent );
~Constant1d( );
double value( ) const { return( m_value ); } /**< Returns the value of the *m_value* member. */
double domainMin( ) const { return( m_domainMin ); } /**< Returns the value of the *m_domainMin* member. */
double domainMax( ) const { return( m_domainMax ); } /**< Returns the value of the *m_domainMax* member. */
double evaluate( double a_x1 ) const ;
void mapToXsAndAdd( std::size_t a_offset, std::vector<double> const &a_Xs, std::vector<double> &a_results, double a_scaleFactor ) const ;
XYs1d *asXYs1d( bool a_asLinlin, double a_accuray, double a_lowerEps, double a_upperEps ) const ;
void toXMLList_func( GUPI::WriteInfo &a_writeInfo, std::string const &a_indent, bool a_embedded, bool a_inRegions ) const ;
};
/*
============================================================
========================== XYs1d ===========================
============================================================
*/
class XYs1d : public Function1dForm {
private:
mutable ptwXYPoints *m_ptwXY; /**< The ptwXYPoints instance that stores points and is used to do calculations. */
public:
XYs1d( );
XYs1d( Axes const &a_axes, ptwXY_interpolation m_interpolation, int a_index = 0, double a_outerDomainValue = 0.0 );
XYs1d( Axes const &a_axes, ptwXY_interpolation m_interpolation, std::vector<double> const &a_values, int a_index = 0,
double a_outerDomainValue = 0.0 );
XYs1d( Axes const &a_axes, ptwXY_interpolation m_interpolation, std::vector<double> const &a_xs,
std::vector<double> const &a_ys, int a_index = 0, double a_outerDomainValue = 0.0 );
XYs1d( Axes const &a_axes, ptwXYPoints *a_ptwXY, int a_index = 0, double a_outerDomainValue = 0.0 );
XYs1d( Construction::Settings const &a_construction, HAPI::Node const &a_node, SetupInfo &a_setupInfo, Suite *a_parent );
XYs1d( XYs1d const &a_XYs1d );
~XYs1d( );
XYs1d &operator=( XYs1d const &a_rhs );
std::size_t size( ) const { return( static_cast<std::size_t>( ptwXY_length( nullptr, m_ptwXY ) ) ); } /**< Returns the number of points (i.e., x,y pairs) in this. */
ptwXYPoints const *ptwXY( ) const { return( m_ptwXY ); } /**< Returns the value of the *m_ptwXY* member. */
ptwXYPoints *ptwXY( ) { return( m_ptwXY ); } /**< Returns the value of the *m_ptwXY* member. */
std::pair<double, double> operator[]( std::size_t a_index ) const ;
XYs1d operator+( XYs1d const &a_XYs1d ) const ;
XYs1d &operator+=( XYs1d const &a_XYs1d );
XYs1d operator-( XYs1d const &a_XYs1d ) const ;
XYs1d &operator-=( XYs1d const &a_XYs1d );
XYs1d operator*( double a_value ) const ;
XYs1d operator*( XYs1d const &a_XYs1d ) const ;
XYs1d &operator*=( double a_value );
XYs1d &operator*=( XYs1d const &a_XYs1d );
double domainMin( ) const { return( (*this)[0].first ); } /**< Returns first x1 value of this. */
double domainMax( ) const { return( (*this)[size( )-1].first ); } /**< Returns last x1 value of this. */
std::vector<double> xs( ) const ;
std::vector<double> ys( ) const ;
std::vector<double> ysMappedToXs( std::vector<double> const &a_xs, std::size_t *a_offset ) const ;
XYs1d domainSlice( double a_domainMin, double a_domainMax, bool a_fill ) const ;
XYs1d domainSliceMax( double a_domainMax ) const ;
double evaluate( double a_x1 ) const ;
void mapToXsAndAdd( std::size_t a_offset, std::vector<double> const &a_Xs, std::vector<double> &a_results, double a_scaleFactor ) const ;
XYs1d *asXYs1d( bool a_asLinlin, double a_accuray, double a_lowerEps, double a_upperEps ) const ;
double integrate( double a_dommainMin, double a_dommainMax );
double normalize( );
Xs_pdf_cdf1d toXs_pdf_cdf1d( );
void toXMLList_func( GUPI::WriteInfo &a_writeInfo, std::string const &a_indent, bool a_embedded, bool a_inRegions ) const ;
void write( FILE *a_file, std::string const &a_format ) const ;
static XYs1d *makeConstantXYs1d( Axes const &a_axes, double a_domainMin, double a_domainMax, double a_value );
};
/*
============================================================
=========================== Ys1d ===========================
============================================================
*/
class Ys1d : public Function1dForm {
private:
std::size_t m_start; /**< The index in the grid for the x1 value for the first y value in *m_Ys*. */
std::vector<double> m_Ys; /**< This list of y values. */
public:
Ys1d( Axes const &a_axes, ptwXY_interpolation a_interpolation, int a_index = 0, double a_outerDomainValue = 0.0 );
Ys1d( Axes const &a_axes, ptwXY_interpolation a_interpolation, std::size_t a_start, std::vector<double> const &a_Ys, int a_index = 0, double a_outerDomainValue = 0.0 );
Ys1d( Construction::Settings const &a_construction, HAPI::Node const &a_node, SetupInfo &a_setupInfo, Suite *a_parent );
Ys1d( Ys1d const &a_Ys1d );
~Ys1d( );
std::size_t size( ) const { return( m_Ys.size( ) ); } /**< Returns the number of values in *m_Ys*. */
double operator[]( std::size_t a_index ) const { return( m_Ys[a_index] ); } /**< Returns the y value at *m_Ys*[a_index]. */
void push_back( double a_y ) { m_Ys.push_back( a_y ); }
Ys1d operator+( Ys1d const &a_Ys1d ) const ;
Ys1d &operator+=( Ys1d const &a_Ys1d );
double domainMin( ) const ;
double domainMax( ) const ;
std::size_t start( ) const { return( m_start ); } /**< Returns the value of the *m_start* member. */
void setStart( std::size_t a_start ) { m_start = a_start; } /**< Sets the *m_start* member to *a_start. */
std::size_t length( ) const { return( m_start + m_Ys.size( ) ); } /**< Returns the sum of m_start and size( ). */
std::vector<double> const &Ys( ) const { return( m_Ys ); } /**< Returns a reference to the list of y-values. */
std::vector<double> &Ys( ) { return( m_Ys ); } /**< Returns a reference to the list of y-values. */
double evaluate( double a_x1 ) const ;
void set( std::size_t a_index, double a_value ) { m_Ys[a_index] = a_value; } /**< Set the value at *m_Ys*[a_index] to a_value. */
void toXMLList_func( GUPI::WriteInfo &a_writeInfo, std::string const &a_indent, bool a_embedded, bool a_inRegions ) const ;
void write( FILE *a_file, std::string const &a_format ) const ;
};
/*
============================================================
======================= Polynomial1d =======================
============================================================
*/
class Polynomial1d : public Function1dForm {
private:
double m_domainMin; /**< The minimum domain value the function is valid. */
double m_domainMax; /**< The maximum domain value the function is valid. */
std::vector<double> m_coefficients; /**< The coefficients of the polynomial. */
public:
Polynomial1d( Axes const &a_axes, double a_domainMin, double a_domainMax, std::vector<double> const &a_coefficients, int a_index = 0, double a_outerDomainValue = 0.0 );
Polynomial1d( Construction::Settings const &a_construction, HAPI::Node const &a_node, SetupInfo &a_setupInfo, Suite *a_parent );
Polynomial1d( Polynomial1d const &a_polynomial1d );
~Polynomial1d( );
double domainMin( ) const { return( m_domainMin ); } /**< Returns the value of the *m_domainMin* member. */
double domainMax( ) const { return( m_domainMax ); } /**< Returns the value of the *m_domainMax* member. */
std::vector<double> const &coefficients( ) const { return( m_coefficients ); } /**< Returns the value of the *m_coefficients* member. */
double evaluate( double a_x1 ) const ;
void mapToXsAndAdd( std::size_t a_offset, std::vector<double> const &a_Xs, std::vector<double> &a_results, double a_scaleFactor ) const ;
XYs1d *asXYs1d( bool a_asLinlin, double a_accuray, double a_lowerEps, double a_upperEps ) const ;
void toXMLList_func( GUPI::WriteInfo &a_writeInfo, std::string const &a_indent, bool a_embedded, bool a_inRegions ) const ;
};
/*
============================================================
========================= Legendre1d =======================
============================================================
*/
class Legendre1d : public Function1dForm {
private:
std::vector<double> m_coefficients; /**< The Legendre coefficients. */
public:
Legendre1d( Axes const &a_axes, int a_index = 0, double a_outerDomainValue = 0.0 );
Legendre1d( Construction::Settings const &a_construction, HAPI::Node const &a_node, SetupInfo &a_setupInfo, Suite *a_parent );
Legendre1d( Legendre1d const &a_Legendre1d );
~Legendre1d( );
double domainMin( ) const { return( -1.0 ); } /**< Returns the value of the *domainMin* which is always -1.0. */
double domainMax( ) const { return( 1.0 ); } /**< Returns the value of the *domainMax* which is always 1.0. */
std::vector<double> const &coefficients( ) const { return( m_coefficients ); } /**< Returns the value of the *m_coefficients* member. */
std::vector<double> &coefficients( ) { return( m_coefficients ); } /**< Returns the value of the *m_coefficients* member. */
double evaluate( double a_x1 ) const ;
XYs1d *asXYs1d( bool a_asLinlin, double a_accuray, double a_lowerEps, double a_upperEps ) const ;
void toXMLList_func( GUPI::WriteInfo &a_writeInfo, std::string const &a_indent, bool a_embedded, bool a_inRegions ) const ;
};
/*
============================================================
========================== Gridded1d =======================
============================================================
*/
class Gridded1d : public Function1dForm {
private:
Vector m_grid; /**< The grid for the gridded 1d function. Can be a link. */
Vector m_data; /**< The value of the function on the grid. */
// BRB should have <array compression="flattened"> ... instead of m_data.
public:
Gridded1d( Construction::Settings const &a_construction, HAPI::Node const &a_node, SetupInfo &a_setupInfo, Suite *a_parent );
~Gridded1d( );
double domainMin( ) const { return( m_grid[0] ); } /**< Returns the value of the *domainMin*. */
double domainMax( ) const { return( m_grid[m_grid.size( )-1] ); } /**< Returns the value of the *domainMax*. */
Vector const &grid( ) const { return( m_grid ); } /**< Returns the value of the *m_grid* member. */
Vector const &data( ) const { return( m_data ); } /**< Returns the value of the *m_data* member. */
void setData( Vector const &a_data ) { m_data = a_data; } /**< Sets the *m_data* member to *a_data*. */
void modifiedMultiGroupElasticForTNSL( std::size_t a_maxTNSL_index );
double evaluate( double a_x1 ) const ;
void toXMLList_func( GUPI::WriteInfo &a_writeInfo, std::string const &a_indent, bool a_embedded, bool a_inRegions ) const ;
void write( FILE *a_file, std::string const &a_format ) const ;
};
/*
============================================================
======================== Reference1d =======================
============================================================
*/
class Reference1d : public Function1dForm {
private:
std::string m_xlink; /**< Link to the other function. */
public:
Reference1d( Construction::Settings const &a_construction, HAPI::Node const &a_node, SetupInfo &a_setupInfo, Suite *a_parent );
~Reference1d( );
double domainMin( ) const ;
double domainMax( ) const ;
std::string const &xlink( ) const { return( m_xlink ); } /**< Returns the value of the *m_xlink* member. */
double evaluate( double a_x1 ) const ;
void toXMLList( GUPI::WriteInfo &a_writeInfo, std::string const &a_indent ) const ;
};
/*
============================================================
======================= Xs_pdf_cdf1d =======================
============================================================
*/
class Xs_pdf_cdf1d : public Function1dForm {
private:
std::vector<double> m_xs; /**< List of x1 values. */
std::vector<double> m_pdf; /**< The pdf evaluated at the x1 values. */
std::vector<double> m_cdf; /**< The cdf evaluated at the x1 values. */
// BRB m_xs, m_pdf and m_cdf need to be a class like ListOfDoubles.
public:
Xs_pdf_cdf1d( );
Xs_pdf_cdf1d( Axes const &a_axes, ptwXY_interpolation a_interpolation, std::vector<double> const &a_Xs,
std::vector<double> const &a_pdf, std::vector<double> const &a_cdf, int a_index = 0, double a_outerDomainValue = 0.0 );
Xs_pdf_cdf1d( Construction::Settings const &a_construction, HAPI::Node const &a_node, SetupInfo &a_setupInfo, Suite *a_parent );
~Xs_pdf_cdf1d( );
Xs_pdf_cdf1d &operator=( Xs_pdf_cdf1d const &a_rhs );
double domainMin( ) const { return( m_xs[0] ); } /**< Returns the value of the *domainMin*. */
double domainMax( ) const { return( m_xs[m_xs.size( )-1] ); } /**< Returns the value of the *domainMax*. */
std::vector<double> const &Xs( ) const { return( m_xs ); } /**< Returns the value of the *m_xs* member. */
std::vector<double> const &pdf( ) const { return( m_pdf ); } /**< Returns the value of the *m_pdf* member. */
std::vector<double> const &cdf( ) const { return( m_cdf ); } /**< Returns the value of the *m_cdf* member. */
double evaluate( double a_x1 ) const ;
XYs1d *asXYs1d( bool a_asLinlin, double a_accuray, double a_lowerEps, double a_upperEps ) const ;
void toXMLList_func( GUPI::WriteInfo &a_writeInfo, std::string const &a_indent, bool a_embedded, bool a_inRegions ) const ;
};
/*
============================================================
========================== Regions1d =======================
============================================================
*/
class Regions1d : public Function1dForm {
private:
std::vector<double> m_Xs; /**< List of *x1* domain values that bounds each region. */
std::vector<Function1dForm *> m_function1ds; /**< List of regions. */
public:
Regions1d( Construction::Settings const &a_construction, HAPI::Node const &a_node, SetupInfo &a_setupInfo, Suite *a_parent );
~Regions1d( );
std::size_t size( ) const { return( m_function1ds.size( ) ); } /**< Returns number of regions. */
Function1dForm const *operator[]( std::size_t a_index ) const { return( m_function1ds[a_index] ); } /**< Returns the region at index *a_index* - 1. */
double domainMin( ) const ;
double domainMax( ) const ;
void append( Function1dForm *a_function );
double evaluate( double a_x1 ) const ;
void mapToXsAndAdd( std::size_t a_offset, std::vector<double> const &a_Xs, std::vector<double> &a_results, double a_scaleFactor ) const ;
XYs1d *asXYs1d( bool a_asLinlin, double a_accuray, double a_lowerEps, double a_upperEps ) const ;
std::vector<double> const &Xs( ) const { return( m_Xs ); } /**< Returns the value of the *m_Xs* member. */
std::vector<Function1dForm *> const &function1ds( ) const { return( m_function1ds ); } /**< Returns the value of the *m_function1ds* member. */
std::vector<Function1dForm *> &function1ds( ) { return( m_function1ds ); } /**< Returns the value of the *m_function1ds* member. */
void toXMLList_func( GUPI::WriteInfo &a_writeInfo, std::string const &a_indent, bool a_embedded, bool a_inRegions ) const ;
void write( FILE *a_file, std::string const &a_format ) const ;
};
/*
============================================================
========================= Branching1d ======================
============================================================
*/
class Branching1d : public Function1dForm {
private:
std::string m_initialState; /**< The nuclide level that decays, emitting a photon. */
double m_multiplicity; /**< The average number of photons emitted when transitioning from the initial to the final state. */
public:
Branching1d( Construction::Settings const &a_construction, HAPI::Node const &a_node, SetupInfo &a_setupInfo, Suite *a_parent );
~Branching1d( );
std::string const &initialState( ) const { return( m_initialState ); } /**< Returns the value of the *m_initialState* member. */
double multiplicity( ) const { return( m_multiplicity ); } /**< Returns the value of the *m_multiplicity* member. */
double domainMin( ) const ;
double domainMax( ) const ;
double evaluate( double a_x1 ) const ;
};
/*
============================================================
================ ResonanceBackgroundRegion1d ===============
============================================================
*/
class ResonanceBackgroundRegion1d : public Function1dForm {
private:
Function1dForm *m_function1d; /**< The 1-d function representing *this*. */
public:
ResonanceBackgroundRegion1d( Construction::Settings const &a_construction, HAPI::Node const &a_node, SetupInfo &a_setupInfo, Suite *a_parent );
~ResonanceBackgroundRegion1d( );
double domainMin( ) const ;
double domainMax( ) const ;
double evaluate( double a_x1 ) const ;
void toXMLList_func( GUPI::WriteInfo &a_writeInfo, std::string const &a_indent, bool a_embedded, bool a_inRegions ) const ;
};
/*
============================================================
=================== ResonanceBackground1d ==================
============================================================
*/
class ResonanceBackground1d : public Function1dForm {
private:
ResonanceBackgroundRegion1d *m_resolvedRegion; /**< The 1-d function for the resolved region. */
ResonanceBackgroundRegion1d *m_unresolvedRegion; /**< The 1-d function for the unresolved region. */
ResonanceBackgroundRegion1d *m_fastRegion; /**< The 1-d function for the fast region. */
public:
ResonanceBackground1d( Construction::Settings const &a_construction, HAPI::Node const &a_node, SetupInfo &a_setupInfo, Suite *a_parent );
~ResonanceBackground1d( );
Function1dForm const *resolvedRegion( ) const { return( m_resolvedRegion ); } /**< Returns the value of the *m_resolvedRegion* member. */
Function1dForm const *unresolvedRegion( ) const { return( m_unresolvedRegion ); } /**< Returns the value of the *m_unresolvedRegion* member. */
Function1dForm const *fastRegion( ) const { return( m_fastRegion ); } /**< Returns the value of the *m_fastRegion* member. */
double domainMin( ) const ;
double domainMax( ) const ;
double evaluate( double a_x1 ) const ;
void toXMLList_func( GUPI::WriteInfo &a_writeInfo, std::string const &a_indent, bool a_embedded, bool a_inRegions ) const ;
};
/*
============================================================
================= ResonancesWithBackground1d ===============
============================================================
*/
class ResonancesWithBackground1d : public Function1dForm {
private:
std::string m_resonances; /**< The reference to the resonance data for *this*.*/
ResonanceBackground1d m_background; /**< The background .*/
public:
ResonancesWithBackground1d( Construction::Settings const &a_construction, HAPI::Node const &a_node, SetupInfo &a_setupInfo, Suite *a_parent );
~ResonancesWithBackground1d( );
double domainMin( ) const { return( m_background.domainMin( ) ); } /**< Returns *this* function's domain mimimun value. */
double domainMax( ) const { return( m_background.domainMax( ) ); } /**< Returns *this* function's domain mimimun value. */
double evaluate( double a_x1 ) const { return( m_background.evaluate( a_x1 ) ); } /**< Returns the value *this* evaluated at *a_x1*. */
void toXMLList_func( GUPI::WriteInfo &a_writeInfo, std::string const &a_indent, bool a_embedded, bool a_inRegions ) const ;
};
/*
============================================================
================= URR_probabilityTables1d ==================
============================================================
*/
class URR_probabilityTables1d : public Function1dForm {
private:
Function2dForm *m_function2d; /**< The URR probability tables. */
public:
URR_probabilityTables1d( Construction::Settings const &a_construction, HAPI::Node const &a_node, SetupInfo &a_setupInfo, Suite *a_parent );
~URR_probabilityTables1d( );
Function2dForm const *function2d( ) const { return( m_function2d ); } /**< Returns the pointer to the *m_function2d* member. */
double domainMin( ) const ;
double domainMax( ) const ;
double evaluate( double a_x1 ) const ;
void toXMLList_func( GUPI::WriteInfo &a_writeInfo, std::string const &a_indent, bool a_embedded, bool a_inRegions ) const ;
};
/*
============================================================
=============== ThermalNeutronScatteringLaw1d ================
============================================================
*/
class ThermalNeutronScatteringLaw1d : public Function1dForm {
private:
std::string m_href; /**< xlink to the IncoherentPhotoAtomicScattering instance under the *m_doubleDifferentialCrossSection* node. */
public:
ThermalNeutronScatteringLaw1d( Construction::Settings const &a_construction, HAPI::Node const &a_node, SetupInfo &a_setupInfo, Suite *a_parent );
~ThermalNeutronScatteringLaw1d( );
std::string const &href( ) const { return( m_href ); } /**< Returns the value of the *m_href* member. */
double domainMin( ) const ;
double domainMax( ) const ;
double evaluate( double a_x1 ) const ;
};
/*
============================================================
====================== Unspecified1d =======================
============================================================
*/
class Unspecified1d : public Function1dForm {
public:
Unspecified1d( Construction::Settings const &a_construction, HAPI::Node const &a_node, SetupInfo &a_setupInfo, Suite *a_parent );
~Unspecified1d( );
double domainMin( ) const ;
double domainMax( ) const ;
double evaluate( double a_x1 ) const ;
void toXMLList_func( GUPI::WriteInfo &a_writeInfo, std::string const &a_indent, bool a_embedded, bool a_inRegions ) const ;
};
/*
============================================================
======================= Function2dForm =====================
============================================================
*/
class Function2dForm : public FunctionForm {
public:
Function2dForm( std::string const &a_moniker, FormType a_type, ptwXY_interpolation a_interpolation, int a_index, double a_outerDomainValue );
Function2dForm( std::string const &a_moniker, FormType a_type, Axes const &a_axes, ptwXY_interpolation a_interpolation, int a_index, double a_outerDomainValue );
Function2dForm( Construction::Settings const &a_construction, HAPI::Node const &a_node, SetupInfo &a_setupInfo, FormType a_type, Suite *a_suite = nullptr );
Function2dForm( Function2dForm const &a_form );
~Function2dForm( );
virtual double evaluate( double a_x2, double a_x1 ) const = 0;
};
/*
============================================================
=========================== XYs2d ==========================
============================================================
*/
class XYs2d : public Function2dForm {
private:
std::string m_interpolationQualifier; /**< The interpolation qualifier for *this*. */
std::vector<double> m_Xs; /**< The list of *x2* values for each function. */
std::vector<Function1dForm *> m_function1ds; /**< The list of 1d functions. */
public:
XYs2d( Axes const &a_axes, ptwXY_interpolation a_interpolation, int a_index = 0, double a_outerDomainValue = 0.0 );
XYs2d( Construction::Settings const &a_construction, HAPI::Node const &a_node, SetupInfo &a_setupInfo, Suite *a_parent );
~XYs2d( );
std::string interpolationQualifier( ) const { return( m_interpolationQualifier ); } /**< Returns the value of the *m_interpolationQualifier* member. */
void setInterpolationQualifier( std::string a_interpolationQualifier ) { m_interpolationQualifier = a_interpolationQualifier; }
/**< Sets the *m_interpolationQualifier* member to *a_interpolationQualifier*. */
double domainMin( ) const ;
double domainMax( ) const ;
double evaluate( double a_x2, double a_x1 ) const ;
std::vector<double> const &Xs( ) const { return( m_Xs ); } /**< Returns the value of the *m_Xs* member. */
std::vector<Function1dForm *> const &function1ds( ) const { return( m_function1ds ); } /**< Returns the value of the *m_function1ds* member. */
std::vector<Function1dForm *> &function1ds( ) { return( m_function1ds ); } /**< Returns the value of the *m_function1ds* member. */
void append( Function1dForm *a_function1d );
void toXMLList_func( GUPI::WriteInfo &a_writeInfo, std::string const &a_indent, bool a_embedded, bool a_inRegions ) const ;
};
/*
============================================================
========================= Recoil2d =========================
============================================================
*/
class Recoil2d : public Function2dForm {
private:
std::string m_xlink; /**< Link to the recoil product. */
public:
Recoil2d( std::string const &a_label, std::string const &a_href );
Recoil2d( Construction::Settings const &a_construction, HAPI::Node const &a_node, SetupInfo &a_setupInfo, Suite *a_parent );
~Recoil2d( );
double domainMin( ) const ;
double domainMax( ) const ;
std::string const &xlink( ) const { return( m_xlink ); } /**< Returns the value of the *m_xlink* member. */
double evaluate( double a_x2, double a_x1 ) const ;
void toXMLList_func( GUPI::WriteInfo &a_writeInfo, std::string const &a_indent, bool a_embedded, bool a_inRegions ) const ;
};
/*
============================================================
========================= Isotropic2d ======================
============================================================
*/
class Isotropic2d : public Function2dForm {
public:
Isotropic2d( Construction::Settings const &a_construction, HAPI::Node const &a_node, SetupInfo &a_setupInfo, Suite *a_parent );
~Isotropic2d( );
double domainMin( ) const ;
double domainMax( ) const ;
double evaluate( double a_x2, double a_x1 ) const ;
void toXMLList_func( GUPI::WriteInfo &a_writeInfo, std::string const &a_indent, LUPI_maybeUnused bool a_embedded, LUPI_maybeUnused bool a_inRegions ) const {
a_writeInfo.addNodeStarterEnder( a_indent, moniker( ) ); }
};
/*
============================================================
======================= DiscreteGamma2d ====================
============================================================
*/
class DiscreteGamma2d : public Function2dForm {
private:
double m_domainMin; /**< The minimum domain value the function is valid. */
double m_domainMax; /**< The maximum domain value the function is valid. */
double m_value; /**< The energy of the discrete gamma. */
public:
DiscreteGamma2d( Construction::Settings const &a_construction, HAPI::Node const &a_node, SetupInfo &a_setupInfo, Suite *a_parent );
~DiscreteGamma2d( );
double domainMin( ) const { return( m_domainMin ); } /**< Returns the value of the *m_domainMin* member. */
double domainMax( ) const { return( m_domainMax ); } /**< Returns the value of the *m_domainMax* member. */
double value( ) const { return( m_value ); } /**< Returns the value of the *m_value* member. */
double evaluate( double a_x2, double a_x1 ) const ;
void toXMLList_func( GUPI::WriteInfo &a_writeInfo, std::string const &a_indent, bool a_embedded, bool a_inRegions ) const ;
};
/*
============================================================
======================= PrimaryGamma2d ====================
============================================================
*/
class PrimaryGamma2d : public Function2dForm {
private:
double m_domainMin; /**< The minimum domain value the function is valid. */
double m_domainMax; /**< The maximum domain value the function is valid. */
double m_value; /**< The binding energy needed to calculate the energy of the primary gamma. */
std::string m_finalState; /**< The nuclear state the compound is in after the primary photon (gamma) is emitted. */
public:
PrimaryGamma2d( Construction::Settings const &a_construction, HAPI::Node const &a_node, SetupInfo &a_setupInfo, Suite *a_parent );
~PrimaryGamma2d( );
double domainMin( ) const { return( m_domainMin ); } /**< Returns the value of the *m_domainMin* member. */
double domainMax( ) const { return( m_domainMax ); } /**< Returns the value of the *m_domainMax* member. */
double value( ) const { return( m_value ); } /**< Returns the value of the *m_value* member. */
std::string const &finalState( ) const { return( m_finalState ); } /**< Returns a reference to the *m_finalState* member. */
double evaluate( double a_x2, double a_x1 ) const ;
void toXMLList_func( GUPI::WriteInfo &a_writeInfo, std::string const &a_indent, bool a_embedded, bool a_inRegions ) const ;
};
/*
============================================================
=================== GeneralEvaporation2d ===================
============================================================
*/
class GeneralEvaporation2d : public Function2dForm {
private:
PhysicalQuantity m_U; /**< The *U* value for the general evaporation function. */
Function1dForm *m_theta; /**< The *theta* function for the general evaporation function. */
Function1dForm *m_g; /**< The *g* function for the general evaporation function. */
public:
GeneralEvaporation2d( Construction::Settings const &a_construction, HAPI::Node const &a_node, SetupInfo &a_setupInfo, Suite *a_parent );
~GeneralEvaporation2d( );
double U( ) const { return( m_U.value( ) ); } /**< Returns the GNDS *U* value for *this*. */
Function1dForm const *theta( ) const { return( m_theta ); } /**< Returns the value of the *m_theta* member. */
Function1dForm const *g( ) const { return( m_g ); } /**< Returns the value of the *m_g* member. */
double domainMin( ) const ;
double domainMax( ) const ;
double evaluate( double a_x2, double a_x1 ) const ;
void toXMLList_func( GUPI::WriteInfo &a_writeInfo, std::string const &a_indent, bool a_embedded, bool a_inRegions ) const ;
};
/*
============================================================
================= SimpleMaxwellianFission2d ================
============================================================
*/
class SimpleMaxwellianFission2d : public Function2dForm {
private:
PhysicalQuantity m_U; /**< The *U* value for the simple Maxwellian function. */
Function1dForm *m_theta; /**< The *theta* function for the simple Maxwellian function. */
public:
SimpleMaxwellianFission2d( Construction::Settings const &a_construction, HAPI::Node const &a_node, SetupInfo &a_setupInfo, Suite *a_parent );
~SimpleMaxwellianFission2d( );
double U( ) const { return( m_U.value( ) ); } /**< Returns the GNDS *U* value for *this*. */
Function1dForm const *theta( ) const { return( m_theta ); } /**< Returns the value of the *m_theta* member. */
double domainMin( ) const ;
double domainMax( ) const ;
double evaluate( double a_x2, double a_x1 ) const ;
void toXMLList_func( GUPI::WriteInfo &a_writeInfo, std::string const &a_indent, bool a_embedded, bool a_inRegions ) const ;
};
/*
============================================================
====================== Evaporation2d =======================
============================================================
*/
class Evaporation2d : public Function2dForm {
private:
PhysicalQuantity m_U; /**< The *U* value for the evaporation function. */
Function1dForm *m_theta; /**< The *theta* function for the evaporation function. */
public:
Evaporation2d( Construction::Settings const &a_construction, HAPI::Node const &a_node, SetupInfo &a_setupInfo, Suite *a_parent );
~Evaporation2d( );
double U( ) const { return( m_U.value( ) ); } /**< Returns the *m_U* value for *this*. */
Function1dForm const *theta( ) const { return( m_theta ); } /**< Returns the value of the *m_theta* member. */
double domainMin( ) const ;
double domainMax( ) const ;
double evaluate( double a_x2, double a_x1 ) const ;
void toXMLList_func( GUPI::WriteInfo &a_writeInfo, std::string const &a_indent, bool a_embedded, bool a_inRegions ) const ;
};
/*
============================================================
========================== Watt2d ==========================
============================================================
*/
class Watt2d : public Function2dForm {
private:
PhysicalQuantity m_U; /**< The *U* value for the Watt function. */
Function1dForm *m_a; /**< The *a* function for the Watt function. */
Function1dForm *m_b; /**< The *b* function for the Watt function. */
public:
Watt2d( Construction::Settings const &a_construction, HAPI::Node const &a_node, SetupInfo &a_setupInfo, Suite *a_parent );
~Watt2d( );
double U( ) const { return( m_U.value( ) ); } /**< Returns the GNDS *U* value for *this*. */
Function1dForm const *a( ) const { return( m_a ); } /**< Returns the value of the *m_a* member. */
Function1dForm const *b( ) const { return( m_b ); } /**< Returns the value of the *m_b* member. */
double domainMin( ) const ;
double domainMax( ) const ;
double evaluate( double a_x2, double a_x1 ) const ;
void toXMLList_func( GUPI::WriteInfo &a_writeInfo, std::string const &a_indent, bool a_embedded, bool a_inRegions ) const ;
};
/*
============================================================
======================= MadlandNix2d =======================
============================================================
*/
class MadlandNix2d : public Function2dForm {
private:
PhysicalQuantity m_EFL; /**< The *EFL* value for the Madland/Nix function. */
PhysicalQuantity m_EFH; /**< The *EFH* value for the Madland/Nix function. */
Function1dForm *m_T_M; /**< The *T_M* function for the Madland/Nix function. */
public:
MadlandNix2d( Construction::Settings const &a_construction, HAPI::Node const &a_node, SetupInfo &a_setupInfo, Suite *a_parent );
~MadlandNix2d( );
double EFL( ) const { return( m_EFL.value( ) ); } /**< Returns the GNDS *EFL* value for *this*. */
double EFH( ) const { return( m_EFH.value( ) ); } /**< Returns the GNDS *EFH* value for *this*. */
Function1dForm const *T_M( ) const { return( m_T_M ); } /**< Returns the value of the *m_T_M* member. */
double domainMin( ) const ;
double domainMax( ) const ;
double evaluate( double a_x2, double a_x1 ) const ;
void toXMLList_func( GUPI::WriteInfo &a_writeInfo, std::string const &a_indent, bool a_embedded, bool a_inRegions ) const ;
};
/*
============================================================
=================== Weighted_function2d ====================
============================================================
*/
class Weighted_function2d : public Function2dForm {
private:
Function1dForm *m_weight; /**< The weight for this function. */
Function2dForm *m_energy; /**< The energy functional. */
public:
Weighted_function2d( Construction::Settings const &a_construction, HAPI::Node const &a_node, SetupInfo &a_setupInfo, Suite *a_parent );
~Weighted_function2d( );
double domainMin( ) const ;
double domainMax( ) const ;
Function1dForm const *weight( ) const { return( m_weight ); } /**< Returns the value of the *m_weight* member. */
Function2dForm const *energy( ) const { return( m_energy ); } /**< Returns the value of the *m_energy* member. */
double evaluate( double a_x2, double a_x1 ) const ;
};
/*
============================================================
================== WeightedFunctionals2d ===================
============================================================
*/
class WeightedFunctionals2d : public Function2dForm {
private:
std::vector<Weighted_function2d *> m_weighted_function2d; /**< The list of Weighted_function2d. */
public:
WeightedFunctionals2d( Construction::Settings const &a_construction, HAPI::Node const &a_node, SetupInfo &a_setupInfo, Suite *a_parent );
~WeightedFunctionals2d( );
double domainMin( ) const ;
double domainMax( ) const ;
std::vector<Weighted_function2d *> const &weighted_function2d( ) const { return( m_weighted_function2d ); } /**< Returns the value of the *m_weighted_function2d* member. */
double evaluate( double a_x2, double a_x1 ) const ;
};
/*
============================================================
==================== NBodyPhaseSpace2d =====================
============================================================
*/
class NBodyPhaseSpace2d : public Function2dForm {
private:
int m_numberOfProducts; /**< The number of products for the NBodyPhaseSpace function. */
PhysicalQuantity m_mass; /**< The mass for the NBodyPhaseSpace function. */
public:
NBodyPhaseSpace2d( Construction::Settings const &a_construction, HAPI::Node const &a_node, SetupInfo &a_setupInfo, Suite *a_parent );
~NBodyPhaseSpace2d( );
double domainMin( ) const ;
double domainMax( ) const ;
int numberOfProducts( ) const { return( m_numberOfProducts ); } /**< Returns the value of the *m_numberOfProducts* member. */
PhysicalQuantity const &mass( ) const { return( m_mass ); } /**< Returns the value of the *m_mass* member. */
double evaluate( double a_x2, double a_x1 ) const ;
};
/*
============================================================
========================== Regions2d =======================
============================================================
*/
class Regions2d : public Function2dForm {
private:
std::vector<double> m_Xs; /**< List of *x2* domain values that bounds each region. */
std::vector<Function2dForm *> m_function2ds; /**< List of 2d regions. */
public:
Regions2d( Construction::Settings const &a_construction, HAPI::Node const &a_node, SetupInfo &a_setupInfo, Suite *a_parent );
~Regions2d( );
double domainMin( ) const ;
double domainMax( ) const ;
void append( Function2dForm *a_function );
double evaluate( double a_x2, double a_x1 ) const ;
std::vector<double> const &Xs( ) const { return( m_Xs ); } /**< Returns the value of the *m_Xs* member. */
std::vector<Function2dForm *> const &function2ds( ) const { return( m_function2ds ); } /**< Returns the value of the *m_function2ds* member. */
void toXMLList_func( GUPI::WriteInfo &a_writeInfo, std::string const &a_indent, bool a_embedded, bool a_inRegions ) const ;
};
/*
============================================================
========================== Gridded2d =======================
============================================================
*/
class Gridded2d : public Function2dForm {
private:
Array::Array m_array; /**< The multi-group transfer matrix. */
public:
Gridded2d( Construction::Settings const &a_construction, HAPI::Node const &a_node, SetupInfo &a_setupInfo, Suite *a_parent );
~Gridded2d( );
double domainMin( ) const { return( 0.0 ); } /**< Not properly implemented. */
double domainMax( ) const { return( 0.0 ); } /**< Not properly implemented. */
double evaluate( LUPI_maybeUnused double a_x2, LUPI_maybeUnused double a_x1 ) const { return( 0.0 ); } /**< Not properly implemented. */
Array::Array const &array( ) const { return( m_array ); } /**< Returns the value of the *m_array* member. */
void toXMLList( GUPI::WriteInfo &a_writeInfo, std::string const &a_indent ) const ;
};
/*
============================================================
======================= Function3dForm =====================
============================================================
*/
class Function3dForm : public FunctionForm {
public:
Function3dForm( std::string const &a_moniker, FormType a_type, ptwXY_interpolation a_interpolation, int a_index, double a_outerDomainValue );
Function3dForm( std::string const &a_moniker, FormType a_type, Axes const &a_axes, ptwXY_interpolation a_interpolation, int a_index, double a_outerDomainValue );
Function3dForm( Construction::Settings const &a_construction, HAPI::Node const &a_node, SetupInfo &a_setupInfo, FormType a_type, Suite *a_suite = nullptr );
Function3dForm( Function3dForm const &a_form );
~Function3dForm( );
virtual double evaluate( double a_x3, double a_x2, double a_x1 ) const = 0;
};
/*
============================================================
=========================== XYs3d ==========================
============================================================
*/
class XYs3d : public Function3dForm {
private:
std::string m_interpolationQualifier; /**< The interpolation qualifier for *this*. */
std::vector<double> m_Xs; /**< The list of *x3* values for each function. */
std::vector<Function2dForm *> m_function2ds; /**< The list of 2d functions. */
public:
XYs3d( Axes const &a_axes, ptwXY_interpolation a_interpolation = ptwXY_interpolationLinLin, int a_index = 0, double a_outerDomainValue = 0.0 );
XYs3d( Construction::Settings const &a_construction, HAPI::Node const &a_node, SetupInfo &a_setupInfo, Suite *a_parent );
~XYs3d( );
std::string interpolationQualifier( ) const { return( m_interpolationQualifier ); } /**< Returns the value of the *m_interpolationQualifier* member. */
void setInterpolationQualifier( std::string a_interpolationQualifier ) { m_interpolationQualifier = a_interpolationQualifier; }
/**< Sets the *m_interpolationQualifier* member to *a_interpolationQualifier*. */
double domainMin( ) const ;
double domainMax( ) const ;
double evaluate( double a_x3, double a_x2, double a_x1 ) const ;
std::vector<double> const &Xs( ) const { return( m_Xs ); } /**< Returns the value of the *m_Xs* member. */
std::vector<Function2dForm *> const &function2ds( ) const { return( m_function2ds ); } /**< Returns a const reference to the *m_function2ds* member. */
void append( Function2dForm *a_function2d ); /**< Appends the 2d function *a_function2d* to the end the *this*. */
void toXMLList_func( GUPI::WriteInfo &a_writeInfo, std::string const &a_indent, bool a_embedded, bool a_inRegions ) const ;
};
/*
============================================================
========================== Gridded3d =======================
============================================================
*/
class Gridded3d : public Function3dForm {
private:
Array3d m_data; /**< The multi-group transfer matrix. */
public:
Gridded3d( Construction::Settings const &a_construction, HAPI::Node const &a_node, SetupInfo &a_setupInfo );
~Gridded3d( );
double domainMin( ) const { return( 0.0 ); } /**< Not properly implemented. */
double domainMax( ) const { return( 0.0 ); } /**< Not properly implemented. */
double evaluate( LUPI_maybeUnused double a_x3, LUPI_maybeUnused double a_x2, LUPI_maybeUnused double a_x1 ) const { return( 0.0 ); } /**< Not properly implemented. */
Array3d const &data( ) const { return( m_data ); } /**< Returns the value of the *m_data* member. */
void modifiedMultiGroupElasticForTNSL( std::size_t maxTNSL_index );
void toXMLList( GUPI::WriteInfo &a_writeInfo, std::string const &a_indent ) const ;
};
} // End namespace Functions.
/*
============================================================
=========== DoubleDifferentialCrossSection stuff ===========
============================================================
*/
namespace DoubleDifferentialCrossSection {
/*
============================================================
============================= Base =========================
============================================================
*/
class Base : public Form {
public:
Base( HAPI::Node const &a_node, SetupInfo &a_setupInfo, FormType a_type, Suite *a_parent );
};
/*
============================================================
================ CoherentPhotoAtomicScattering =============
============================================================
*/
class CoherentPhotoAtomicScattering : public Base {
private:
Functions::Function1dForm *m_formFactor; /**< The form factor for coherent photo-atomic scattering. */
Functions::Function1dForm *m_realAnomalousFactor; /**< The real anomalous factor of coherent photo-atomic scattering. */
Functions::Function1dForm *m_imaginaryAnomalousFactor; /**< The imaginary anomalous factor of coherent photo-atomic scattering. */
public:
CoherentPhotoAtomicScattering( Construction::Settings const &a_construction, HAPI::Node const &a_node, SetupInfo &a_setupInfo, PoPI::Database const &a_pops, PoPI::Database const &a_internalPoPs, Suite *a_parent );
~CoherentPhotoAtomicScattering( );
Functions::Function1dForm *formFactor( ) { return( m_formFactor ); } /**< Returns the value of the *m_formFactor* member. */
Functions::Function1dForm const *formFactor( ) const { return( m_formFactor ); } /**< Returns the value of the *m_formFactor* member. */
Functions::Function1dForm *realAnomalousFactor( ) { return( m_realAnomalousFactor ); } /**< Returns the value of the *m_realAnomalousFactor* member. */
Functions::Function1dForm const *realAnomalousFactor( ) const { return( m_realAnomalousFactor ); } /**< Returns the value of the *m_realAnomalousFactor* member. */
Functions::Function1dForm *imaginaryAnomalousFactor( ) { return( m_imaginaryAnomalousFactor ); } /**< Returns the value of the *m_imaginaryAnomalousFactor* member. */
Functions::Function1dForm const *imaginaryAnomalousFactor( ) const { return( m_imaginaryAnomalousFactor ); } /**< Returns the value of the *m_imaginaryAnomalousFactor* member. */
};
/*
============================================================
============== IncoherentPhotoAtomicScattering =============
============================================================
*/
class IncoherentPhotoAtomicScattering : public Base {
private:
Functions::Function1dForm *m_scatteringFactor; /**< The scattering factor for incoherent photo-atomic scattering. */
public:
IncoherentPhotoAtomicScattering( Construction::Settings const &a_construction, HAPI::Node const &a_node, SetupInfo &a_setupInfo,
PoPI::Database const &a_pops, PoPI::Database const &a_internalPoPs, Suite *a_parent );
~IncoherentPhotoAtomicScattering( );
Functions::Function1dForm const *scatteringFactor( ) const { return( m_scatteringFactor); } /**< Returns the value of the *m_scatteringFactor* member. */
};
/*
=======================================================================
============== IncoherentBoundToFreePhotoAtomicScattering =============
=======================================================================
*/
class IncoherentBoundToFreePhotoAtomicScattering : public Base {
private:
Functions::Function1dForm *m_ComptonProfile;
public:
IncoherentBoundToFreePhotoAtomicScattering( Construction::Settings const &a_construction, HAPI::Node const &a_node, SetupInfo &a_setupInfo,
PoPI::Database const &a_pops, PoPI::Database const &a_internalPoPs, Suite *a_parent );
~IncoherentBoundToFreePhotoAtomicScattering( );
Functions::Function1dForm *ComptonProfile( ) { return( m_ComptonProfile); }
Functions::Function1dForm const *ComptonProfile( ) const { return( m_ComptonProfile); }
};
namespace n_ThermalNeutronScatteringLaw {
/*
============================================================
========================== S_table =========================
============================================================
*/
class S_table : public Form {
private:
Functions::Function2dForm *m_function2d; /**< The cumulative scattering factor \f$S(T,E)\f$. */
public:
S_table( Construction::Settings const &a_construction, HAPI::Node const &a_node, SetupInfo &a_setupInfo );
~S_table( );
Functions::Function2dForm *function2d( ) { return( m_function2d ); } /**< Returns the value of the *m_function2d* member. */
Functions::Function2dForm const *function2d( ) const { return( m_function2d ); } /**< Returns the value of the *m_function2d* member. */
};
/*
============================================================
====================== CoherentElastic =====================
============================================================
*/
class CoherentElastic : public Base {
private:
S_table m_S_table; /**< The cumulative scattering factor \f$S(T,E)\f$. */
public:
CoherentElastic( Construction::Settings const &a_construction, HAPI::Node const &a_node, SetupInfo &a_setupInfo, PoPI::Database const &a_pops, PoPI::Database const &a_internalPoPs, Suite *a_parent );
~CoherentElastic( );
S_table const &s_table( ) const { return( m_S_table ); } /**< Returns the value of the *m_S_table* member. */
};
/*
============================================================
=================== DebyeWallerIntegral ====================
============================================================
*/
class DebyeWallerIntegral : public Form {
private:
Functions::Function1dForm *m_function1d; /**< The 1-d function representing the Debye-Waller integral function \f$W(T)\f$. */
public:
DebyeWallerIntegral( Construction::Settings const &a_construction, HAPI::Node const &a_node, SetupInfo &a_setupInfo );
~DebyeWallerIntegral( );
Functions::Function1dForm *function1d( ) { return( m_function1d ); } /**< Returns the value of the *m_function1d* member. */
Functions::Function1dForm const *function1d( ) const { return( m_function1d ); } /**< Returns the value of the *m_function1d* member. */
};
/*
============================================================
====================== IncoherentElastic =====================
============================================================
*/
class IncoherentElastic : public Base {
private:
PhysicalQuantity m_boundAtomCrossSection; /**< The characteristic bound cross section. */
DebyeWallerIntegral m_DebyeWallerIntegral; /**< The Debye-Waller integral function \f$W(T)\f$. */
public:
IncoherentElastic( Construction::Settings const &a_construction, HAPI::Node const &a_node, SetupInfo &a_setupInfo, PoPI::Database const &a_pops, PoPI::Database const &a_internalPoPs, Suite *a_parent );
~IncoherentElastic( );
PhysicalQuantity const &boundAtomCrossSection( ) { return( m_boundAtomCrossSection ); } /**< Returns the value of the *m_boundAtomCrossSection* member. */
DebyeWallerIntegral const &debyeWallerIntegral( ) const { return( m_DebyeWallerIntegral ); } /**< Returns the value of the *m_DebyeWallerIntegral* member. */
};
/*
============================================================
========================== Options =========================
============================================================
*/
class Options : public Form {
private:
bool m_calculatedAtThermal; /**< If *true* calculate at 0.0253 eV/k. */
bool m_asymmetric; /**< If *true* S(alpha,beta) is asymmetric, otherwise it is symmetric. */
public:
Options( Construction::Settings const &a_construction, HAPI::Node const &a_node, SetupInfo &a_setupInfo );
~Options( );
bool calculatedAtThermal( ) { return( m_calculatedAtThermal ); } /**< Returns the value of the *m_calculatedAtThermal* member. */
bool asymmetric( ) { return( m_asymmetric ); } /**< Returns the value of the *m_asymmetric* member. */
};
/*
============================================================
======================== T_effective =======================
============================================================
*/
class T_effective : public Form {
private:
Functions::Function1dForm *m_function1d; /**< The 1-d function representing effective temperature \f$T_{\rm eff}(T)\f$. */
public:
T_effective( Construction::Settings const &a_construction, HAPI::Node const &a_node, SetupInfo &a_setupInfo );
~T_effective( );
Functions::Function1dForm const *function1d( ) const { return( m_function1d ); } /**< Returns the value of the *m_function1d* member. */
};
/*
============================================================
====================== ScatteringAtom ======================
============================================================
*/
class ScatteringAtom : public Form {
private:
PhysicalQuantity m_mass; /**< The mass of the atom. */
PhysicalQuantity m_freeAtomCrossSection; /**< The free atom scattering cross section. */
PhysicalQuantity m_e_critical; /**< The energy value above which the static model of elastic scattering is adequate. */
PhysicalQuantity m_e_max; /**< The upper energy limit for the constant. */
T_effective m_T_effective; /**< The effective temperatures for the shortcollision-time approximation given as a function of moderator temperature for the atom. */
public:
ScatteringAtom( Construction::Settings const &a_construction, HAPI::Node const &a_node, SetupInfo &a_setupInfo );
~ScatteringAtom( );
PhysicalQuantity const &mass( ) const { return( m_mass ); } /**< Returns the value of the *m_mass* member. */
PhysicalQuantity const &freeAtomCrossSection( ) const { return( m_freeAtomCrossSection ); } /**< Returns the value of the *m_freeAtomCrossSection* member. */
PhysicalQuantity const &e_critical( ) const { return( m_e_critical ); } /**< Returns the value of the *m_e_critical* member. */
PhysicalQuantity const &e_max( ) const { return( m_e_max ); } /**< Returns the value of the *m_e_max* member. */
T_effective const &t_effective( ) const { return( m_T_effective ); } /**< Returns the value of the *m_T_effective* member. */
};
/*
============================================================
======================= S_alpha_beta =======================
============================================================
*/
class S_alpha_beta : public Form {
private:
Functions::Function3dForm *m_function3d; /**< The \f$S(T,\alpha,\beta)\f$ function. */
public:
S_alpha_beta( Construction::Settings const &a_construction, HAPI::Node const &a_node, SetupInfo &a_setupInfo );
~S_alpha_beta( );
Functions::Function3dForm *function3d( ) { return( m_function3d ); } /**< Returns the value of the *m_function3d* member. */
};
} // End namespace n_ThermalNeutronScatteringLaw.
} // End namespace DoubleDifferentialCrossSection.
namespace Distributions {
/*
============================================================
========================= Distribution =====================
============================================================
*/
class Distribution : public Form {
private:
Frame m_productFrame; /**< The product frame for the distribution form. */
public:
Distribution( std::string const &a_moniker, FormType a_type, std::string const &a_label, Frame a_productFrame );
Distribution( HAPI::Node const &a_node, SetupInfo &a_setupInfo, FormType a_type, Suite *a_parent );
Frame productFrame( ) const { return( m_productFrame ); } /**< Returns the value of the *m_productFrame* member. */
void toXMLNodeStarter( GUPI::WriteInfo &a_writeInfo, std::string const &a_indent = "" ) const ;
};
/*
============================================================
======================= AngularTwoBody =====================
============================================================
*/
class AngularTwoBody : public Distribution {
private:
Functions::Function2dForm *m_angular; /**< The P(mu|E) distribution as a Function2dForm. */
public:
AngularTwoBody( std::string const &a_label, Frame a_productFrame, Functions::Function2dForm *a_angular = nullptr );
AngularTwoBody( Construction::Settings const &a_construction, HAPI::Node const &a_node, SetupInfo &a_setupInfo, Suite *a_parent );
~AngularTwoBody( );
Functions::Function2dForm const *angular( ) const { return( m_angular ); } /**< Returns the value of the *m_angular* member as a const pointer. */
void toXMLList( GUPI::WriteInfo &a_writeInfo, std::string const &a_indent = "" ) const ;
};
/*
============================================================
========================= KalbachMann ======================
============================================================
*/
class KalbachMann : public Distribution {
private:
Functions::Function2dForm *m_f; /**< The P(E'|E) distribution as a Function2dForm. */
Functions::Function2dForm *m_r; /**< The Kalbach/Mann r(E,E') function as a Function2dForm. */
Functions::Function2dForm *m_a; /**< The Kalbach/Mann a(E,E') function as a Function2dForm. */
public:
KalbachMann( Construction::Settings const &a_construction, HAPI::Node const &a_node, SetupInfo &a_setupInfo, Suite *a_parent );
~KalbachMann( );
Functions::Function2dForm const *f( ) const { return( m_f ); } /**< Returns the value of the *m_f* member. */
Functions::Function2dForm const *r( ) const { return( m_r ); } /**< Returns the value of the *m_r* member. */
Functions::Function2dForm const *a( ) const { return( m_a ); } /**< Returns the value of the *m_a* member. */
void toXMLList( GUPI::WriteInfo &a_writeInfo, std::string const &a_indent ) const ;
};
/*
============================================================
======================== EnergyAngular =====================
============================================================
*/
class EnergyAngular : public Distribution {
private:
Functions::Function3dForm *m_energyAngular; /**< The P(E',mu|E) distribution as a Function3dForm. */
public:
EnergyAngular( Construction::Settings const &a_construction, HAPI::Node const &a_node, SetupInfo &a_setupInfo, Suite *a_parent );
~EnergyAngular( );
Functions::Function3dForm const *energyAngular( ) const { return( m_energyAngular ); } /**< Returns the value of the *m_energyAngular* member. */
void toXMLList( GUPI::WriteInfo &a_writeInfo, std::string const &a_indent ) const ;
};
/*
============================================================
======================= EnergyAngularMC ====================
============================================================
*/
class EnergyAngularMC : public Distribution {
private:
Functions::Function2dForm *m_energy; /**< The P(E'|E) distribution as a Function2dForm. */
Functions::Function3dForm *m_energyAngular; /**< The P(mu|E,E') distribution as a Function3dForm. */
public:
EnergyAngularMC( Construction::Settings const &a_construction, HAPI::Node const &a_node, SetupInfo &a_setupInfo, Suite *a_parent );
~EnergyAngularMC( );
Functions::Function2dForm const *energy( ) const { return( m_energy ); } /**< Returns the value of the *m_energy* member. */
Functions::Function3dForm const *energyAngular( ) const { return( m_energyAngular ); } /**< Returns the value of the *m_energyAngular* member. */
void toXMLList( GUPI::WriteInfo &a_writeInfo, std::string const &a_indent ) const ;
};
/*
============================================================
======================== AngularEnergy =====================
============================================================
*/
class AngularEnergy : public Distribution {
private:
Functions::Function3dForm *m_angularEnergy; /**< The P(mu,E'|E) distribution as a Function3dForm. */
public:
AngularEnergy( Construction::Settings const &a_construction, HAPI::Node const &a_node, SetupInfo &a_setupInfo, Suite *a_parent );
~AngularEnergy( );
Functions::Function3dForm const *angularEnergy( ) const { return( m_angularEnergy ); } /**< Returns the value of the *m_angularEnergy* member. */
void toXMLList( GUPI::WriteInfo &a_writeInfo, std::string const &a_indent ) const ;
};
/*
============================================================
======================= AngularEnergyMC ====================
============================================================
*/
class AngularEnergyMC : public Distribution {
private:
Functions::Function2dForm *m_angular; /**< The P(mu|E) distribution as a Function2dForm. */
Functions::Function3dForm *m_angularEnergy; /**< The P(E'|E,mu) distribution as a Function3dForm. */
public:
AngularEnergyMC( Construction::Settings const &a_construction, HAPI::Node const &a_node, SetupInfo &a_setupInfo, Suite *a_parent );
~AngularEnergyMC( );
Functions::Function2dForm const *angular( ) const { return( m_angular ); } /**< Returns the value of the *m_angular* member. */
Functions::Function3dForm const *angularEnergy( ) const { return( m_angularEnergy ); } /**< Returns the value of the *m_angularEnergy* member. */
void toXMLList( GUPI::WriteInfo &a_writeInfo, std::string const &a_indent ) const ;
};
/*
============================================================
========================= Uncorrelated =====================
============================================================
*/
class Uncorrelated : public Distribution {
private:
Functions::Function2dForm *m_angular; /**< The P(mu|E) distribution as a Function2dForm. */
Functions::Function2dForm *m_energy; /**< The P(E'|E) distribution as a Function2dForm. */
public:
Uncorrelated( Construction::Settings const &a_construction, HAPI::Node const &a_node, SetupInfo &a_setupInfo, Suite *a_parent );
~Uncorrelated( );
Functions::Function2dForm const *angular( ) const { return( m_angular ); } /**< Returns the value of the *m_angular* member. */
Functions::Function2dForm const *energy( ) const { return( m_energy ); } /**< Returns the value of the *m_energy* member. */
void toXMLList( GUPI::WriteInfo &a_writeInfo, std::string const &a_indent ) const ;
};
/*
============================================================
========================= MultiGroup3d =====================
============================================================
*/
class MultiGroup3d : public Distribution {
private:
Functions::Gridded3d m_gridded3d; /**< The multi-group Legendre distribution as a Gridded3d instance. */
public:
MultiGroup3d( Construction::Settings const &a_construction, HAPI::Node const &a_node, SetupInfo &a_setupInfo, Suite *a_parent );
Functions::Gridded3d const &data( ) const { return( m_gridded3d ); } /**< Returns the value of the *m_gridded3d* member. */
void toXMLList( GUPI::WriteInfo &a_writeInfo, std::string const &a_indent = "" ) const ;
};
/*
============================================================
====================== LLNLAngularEnergy ===================
============================================================
*/
class LLNLAngularEnergy : public Distribution {
private:
Functions::Function2dForm *m_angular; /**< The P(mu|E) distribution as a Function2dForm. */
Functions::Function3dForm *m_angularEnergy; /**< The P(E'|E,mu) distribution as a Function3dForm. */
public:
LLNLAngularEnergy( Construction::Settings const &a_construction, HAPI::Node const &a_node, SetupInfo &a_setupInfo, Suite *a_parent );
~LLNLAngularEnergy( );
Functions::Function2dForm const *angular( ) const { return( m_angular ); } /**< Returns the value of the *m_angular* member. */
Functions::Function3dForm const *angularEnergy( ) const { return( m_angularEnergy ); } /**< Returns the value of the *m_angularEnergy* member. */
void toXMLList( GUPI::WriteInfo &a_writeInfo, std::string const &a_indent ) const ;
};
/*
============================================================
============== CoherentPhotoAtomicScattering ===============
============================================================
*/
class CoherentPhotoAtomicScattering : public Distribution {
private:
std::string m_href; /**< xlink to the IncoherentPhotoAtomicScattering instance under the *m_doubleDifferentialCrossSection* node. */
public:
CoherentPhotoAtomicScattering( Construction::Settings const &a_construction, HAPI::Node const &a_node, SetupInfo &a_setupInfo, Suite *a_parent );
std::string const &href( ) const { return( m_href ); } /**< Returns the value of the *m_href* member. */
};
/*
============================================================
============== IncoherentPhotoAtomicScattering =============
============================================================
*/
class IncoherentPhotoAtomicScattering : public Distribution {
private:
std::string m_href; /**< xlink to the IncoherentPhotoAtomicScattering instance under the *m_doubleDifferentialCrossSection* node. */
public:
IncoherentPhotoAtomicScattering( Construction::Settings const &a_construction, HAPI::Node const &a_node, SetupInfo &a_setupInfo, Suite *a_parent );
std::string const &href( ) const { return( m_href ); } /**< Returns the value of the *m_href* member. */
};
/*
============================================================
======== IncoherentBoundToFreePhotoAtomicScattering ========
============================================================
*/
class IncoherentBoundToFreePhotoAtomicScattering : public Distribution {
private:
std::string m_href; /**< xlink to the IncoherentPhotoAtomicScattering instance under the *m_doubleDifferentialCrossSection* node. */
public:
IncoherentBoundToFreePhotoAtomicScattering( Construction::Settings const &a_construction, HAPI::Node const &a_node, SetupInfo &a_setupInfo, Suite *a_parent );
std::string const &href( ) const { return( m_href ); } /**< Returns the value of the *m_href* member. */
};
/*
============================================================
=============== ThermalNeutronScatteringLaw ================
============================================================
*/
class ThermalNeutronScatteringLaw : public Distribution {
private:
std::string m_href; /**< xlink to the IncoherentPhotoAtomicScattering instance under the *m_doubleDifferentialCrossSection* node. */
public:
ThermalNeutronScatteringLaw( Construction::Settings const &a_construction, HAPI::Node const &a_node, SetupInfo &a_setupInfo, Suite *a_parent );
std::string const &href( ) const { return( m_href ); } /**< Returns the value of the *m_href* member. */
};
/*
============================================================
======================== Branching3d =======================
============================================================
*/
class Branching3d : public Distribution {
private:
std::string m_initialState; /**< The nuclide level that decays, emitting a photon. */
public:
Branching3d( Construction::Settings const &a_construction, HAPI::Node const &a_node, SetupInfo &a_setupInfo, Suite *a_parent );
std::string const &initialState( ) const { return( m_initialState ); } /**< Returns the value of the *m_initialState* member. */
};
/*
============================================================
======================= Reference3d ========================
============================================================
*/
class Reference3d : public Distribution {
private:
std::string m_href; /**< Link to the other function. */
public:
Reference3d( Construction::Settings const &a_construction, HAPI::Node const &a_node, SetupInfo &a_setupInfo, Suite *a_parent );
std::string const &href( ) const { return( m_href ); } /**< Returns the value of the *m_xlink* member. */
void toXMLList( GUPI::WriteInfo &a_writeInfo, std::string const &a_indent ) const ;
};
/*
============================================================
================ CoulombPlusNuclearElastic =================
============================================================
*/
class CoulombPlusNuclearElastic : public Distribution {
private:
std::string m_href; /**< Link to the other function. */
public:
CoulombPlusNuclearElastic( Construction::Settings const &a_construction, HAPI::Node const &a_node, SetupInfo &a_setupInfo, Suite *a_parent );
std::string const &href( ) const { return( m_href ); } /**< Returns the value of the *m_xlink* member. */
void toXMLList( GUPI::WriteInfo &a_writeInfo, std::string const &a_indent ) const ;
};
/*
============================================================
======================= LLNLLegendre =======================
============================================================
*/
class LLNLLegendre : public Distribution {
//
// This class is woefully inadequate but some form is needed by the method Product::isCompleteParticle.
//
public:
LLNLLegendre( Construction::Settings const &a_construction, HAPI::Node const &a_node, SetupInfo &a_setupInfo, Suite *a_parent );
void toXMLList( GUPI::WriteInfo &a_writeInfo, std::string const &a_indent ) const ;
};
/*
============================================================
========================= Unspecified ======================
============================================================
*/
class Unspecified : public Distribution {
public:
Unspecified( Construction::Settings const &a_construction, HAPI::Node const &a_node, SetupInfo &a_setupInfo, Suite *a_parent );
void toXMLList( GUPI::WriteInfo &a_writeInfo, std::string const &a_indent ) const ;
};
} // End of namespace Distributions.
/*
============================================================
=========================== Suite ==========================
============================================================
*/
class Suite : public GUPI::Ancestry {
public:
typedef std::vector<Form *> Forms; /**< The typedef the the *m_forms* member. */
private:
std::string m_keyName; /**< The name of the key used to look up items in the suite. */
mutable Forms m_forms; /**< The list of nodes stored within *this*. */
std::map<std::string,std::size_t> m_map; /**< A map of *this* node labels to their index in *m_forms*. */
Styles::Suite const *m_styles; /**< The Styles::Suite for the Protare that *this* resides in. */
bool m_allowsLazyParsing; /**< If **true**, the suite allows its elements to be lazy parsed. */
std::string m_href; /**< xlink to the to a Suite that has the elements for this Suite. */
// FIXME should we make public or private copy constructor?
public:
Suite( std::string const &a_keyName = GIDI_labelChars );
Suite( std::string const &a_moniker, std::string const &a_keyName );
Suite( Construction::Settings const &a_construction, std::string const &a_moniker, std::string const &a_keyName, HAPI::Node const &a_node,
SetupInfo &a_setupInfo, PoPI::Database const &a_pops, PoPI::Database const &a_internalPoPs, parseSuite a_parseSuite,
Styles::Suite const *a_styles, bool a_allowsLazyParsing = false );
~Suite( );
std::string const &keyName( ) const { return( m_keyName ); } /**< Returns a *const* reference to the *m_keyName* member. */
std::size_t size( ) const { return( m_forms.size( ) ); } /**< Returns the number of node contained by *this*. */
typedef Forms::iterator iterator;
typedef Forms::const_iterator const_iterator;
iterator begin( ) { return m_forms.begin( ); } /**< The C++ *begin iterator* for *this*. */
const_iterator begin( ) const { return m_forms.begin( ); } /**< The C++ const *begin iterator* for *this*. */
iterator end( ) { return m_forms.end( ); } /**< The C++ *end iterator* for *this*. */
const_iterator end( ) const { return m_forms.end( ); } /**< The C++ const *end iterator* for *this*. */
std::size_t operator[]( std::string const &a_label ) const ;
template<typename T> T *get( std::size_t a_Index );
template<typename T> T const *get( std::size_t a_Index ) const ;
template<typename T> T *get( std::string const &a_label );
template<typename T> T const *get( std::string const &a_label ) const ;
template<typename T> T *getViaLineage( std::string const &a_label );
template<typename T> T *getViaLineage( std::string const &a_label ) const;
template<typename T> T *pop( std::size_t a_Index );
template<typename T> T *pop( std::string const &a_label );
Styles::Suite const *styles( ) { return( m_styles ); } /**< Returns the value of the *m_styles* member. */
std::string const &href( ) const { return( m_href ); } /**< Returns a reference to the *m_ref* member. */
void parse( Construction::Settings const &a_construction, HAPI::Node const &a_node, SetupInfo &a_setupInfo, PoPI::Database const &a_pops, PoPI::Database const &a_internalPoPs,
parseSuite a_parseSuite, Styles::Suite const *a_styles );
void add( Form *a_form );
iterator find( std::string const &a_label, bool a_convertLazyParsingHelperForm = false );
const_iterator find( std::string const &a_label, bool a_convertLazyParsingHelperForm = false ) const ;
bool has( std::string const &a_label ) const { return( find( a_label ) != m_forms.end( ) ); }
Form *checkLazyParsingHelperForm( std::size_t a_index );
Form *checkLazyParsingHelperForm( std::size_t a_index ) const ;
iterator checkLazyParsingHelperFormIterator( iterator a_iter ) ;
const_iterator checkLazyParsingHelperFormIterator( const_iterator a_iter ) const ;
void modifiedMultiGroupElasticForTNSL( std::map<std::string,std::size_t> const &a_maximumTNSL_MultiGroupIndex );
GUPI::Ancestry *findInAncestry3( std::string const &a_item );
GUPI::Ancestry const *findInAncestry3( std::string const &a_item ) const ;
std::vector<iterator> findAllOfMoniker( std::string const &a_moniker ) ;
std::vector<const_iterator> findAllOfMoniker( std::string const &a_moniker ) const ;
Form const *findInstanceOfTypeInLineage( std::string const &_label, std::string const &a_moniker ) const ;
Form *findInstanceOfTypeInLineage( Styles::Suite const &a_styles, std::string const &_label, std::string const &a_moniker ) ;
void toXMLList( GUPI::WriteInfo &a_writeInfo, std::string const &a_indent = "" ) const ;
void printFormLabels( std::string const &a_header ) const ;
};
/* *********************************************************************************************************//**
* Returns the node at index *a_index*.
*
* @param a_index [in] The index of the node to return.
*
* @return The node at index *a_index*.
***********************************************************************************************************/
template<typename T> T *Suite::get( std::size_t a_index ) {
Form *__form = checkLazyParsingHelperForm( a_index );
T *object = dynamic_cast<T *>( __form );
if( object == nullptr ) throw Exception( "GIDI::Suite::get( std::size_t ): invalid cast" );
return( object );
}
/* *********************************************************************************************************//**
* Returns the node at index *a_index*.
*
* @param a_index [in] The index of the node to return.
*
* @return The node at index *a_index*.
***********************************************************************************************************/
template<typename T> T const *Suite::get( std::size_t a_index ) const {
Form *__form = checkLazyParsingHelperForm( a_index );
T *object = dynamic_cast<T *>( __form );
if( object == nullptr ) throw Exception( "GIDI::Suite::get( std::size_t ): invalid cast" );
return( object );
}
/* *********************************************************************************************************//**
* Returns the node with label *a_label*.
*
* @param a_label [in] The label of the node to return.
*
* @return The node with label *a_label*.
***********************************************************************************************************/
template<typename T> T *Suite::get( std::string const &a_label ) {
auto index = (*this)[a_label];
Form *__form = checkLazyParsingHelperForm( index );
T *object = dynamic_cast<T *>( __form );
if( object == nullptr ) throw Exception( "GIDI::Suite::get( std::string const & ): invalid cast" );
return( object );
}
/* *********************************************************************************************************//**
* Returns the node with label *a_label*.
*
* @param a_label [in] The label of the node to return.
*
* @return The node with label *a_label*.
***********************************************************************************************************/
template<typename T> T const *Suite::get( std::string const &a_label ) const {
auto index = (*this)[a_label];
Form *__form = checkLazyParsingHelperForm( index );
T *object = dynamic_cast<T *>( __form );
if( object == nullptr ) throw Exception( "GIDI::Suite::get( std::string const & ): invalid cast" );
return( object );
}
/* *********************************************************************************************************//**
* Removes the form at index *a_index* and returns it. It is up to the calling function to delete the form,
* otherwise there will be memory leak.
*
* @param a_index [in] The index of the node to return.
*
* @return The node at index *a_index*.
***********************************************************************************************************/
template<typename T> T *Suite::pop( std::size_t a_index ) {
Form *__form = checkLazyParsingHelperForm( a_index );
T *object = dynamic_cast<T *>( __form );
if( object == nullptr ) throw Exception( "GIDI::Suite::pop( std::size_t ): invalid cast" );
for( std::size_t index = a_index + 1; index < m_forms.size( ); ++index ) {
m_forms[index-1] = m_forms[index];
m_map[m_forms[index-1]->label( )] = index - 1;
}
m_forms.resize( m_forms.size( ) - 1 );
return( object );
}
/* *********************************************************************************************************//**
* Removes the form with label *a_label* and returns it. It is up to the calling function to delete the form,
* otherwise there will be memory leak.
*
* @param a_label [in] The label of the node to return.
*
* @return The node at index *a_label*.
***********************************************************************************************************/
template<typename T> T *Suite::pop( std::string const &a_label ) {
auto index = (*this)[a_label]; // This will throw an exception if *a_label* is not in *this*.
Form *__form = checkLazyParsingHelperForm( index );
T *object = dynamic_cast<T *>( __form );
if( object == nullptr ) throw Exception( "GIDI::Suite::pop( std::size_t ): invalid cast" );
for( std::size_t index2 = index + 1; index2 < m_forms.size( ); ++index2 ) {
m_forms[index2-1] = m_forms[index2];
m_map[m_forms[index2-1]->label( )] = index2 - 1;
}
m_forms.resize( m_forms.size( ) - 1 );
return( object );
}
/*
============================================================
======================== Component =========================
============================================================
*/
class Component : public Suite {
public:
Component( Construction::Settings const &a_construction, std::string const &a_moniker, std::string const &a_keyName,
HAPI::Node const &a_node, SetupInfo &a_setupInfo, PoPI::Database const &a_pops, PoPI::Database const &a_internalPoPs,
parseSuite a_parseSuite, Styles::Suite const *a_styles );
Component( std::string const &a_moniker, std::string const &a_keyName = GIDI_labelChars );
};
namespace Table {
/*
============================================================
========================== Column ==========================
============================================================
*/
class Column : public Form {
private:
std::string m_index; /**< The index of the column. */
std::string m_name; /**< The name of the column. */
std::string m_unit; /**< The unit of the data in the column. */
std::string m_types; /**< The types of the data in the column. */
public:
Column( Construction::Settings const &a_construction, HAPI::Node const &a_node, SetupInfo &a_setupInfo, Suite *a_parent );
~Column( );
std::string const &index( ) const { return( m_index ); } /**< Returns a *const* reference of the *m_index* member. */
std::string const &name( ) const { return( m_name ); } /**< Returns a *const* reference of the *m_name* member. */
std::string const &unit( ) const { return( m_unit ); } /**< Returns a *const* reference of the *m_unit* member. */
std::string const &types( ) const { return( m_types ); } /**< Returns a *const* reference of the *m_types* member. */
void setKeyValue( std::string const &a_keyName ) const ;
void toXMLList( GUPI::WriteInfo &a_writeInfo, std::string const &a_indent = "" ) const ;
};
/*
============================================================
=========================== Data ===========================
============================================================
*/
class Data : public GUPI::Ancestry {
private:
std::string m_sep;
std::string m_body;
public:
Data( Construction::Settings const &a_construction, HAPI::Node const &a_node, SetupInfo &a_setupInfo );
~Data( );
std::string const &sep( ) const { return( m_sep ); } /**< Returns a *const* reference of the *m_sep* member. */
std::string const &body( ) const { return( m_body ); } /**< Returns a *const* reference of the *m_body* member. */
GUPI::Ancestry *findInAncestry3( LUPI_maybeUnused std::string const &a_item ) { return( nullptr ); }
GUPI::Ancestry const *findInAncestry3( LUPI_maybeUnused std::string const &a_item ) const { return( nullptr ); }
void toXMLList( GUPI::WriteInfo &a_writeInfo, std::string const &a_indent = "" ) const ;
};
/*
============================================================
=========================== Table ==========================
============================================================
*/
class Table : public Form {
private:
std::size_t m_rows; /**< The number of rows in the table. */
std::size_t m_columns; /**< The number of columns in the table. */
std::string m_storageOrder; /**< The storageOrder for the data in the table. */
Suite m_columnHeaders; /**< The column header for the table. */
Data m_data; /**< The data for the table. */
public:
Table( Construction::Settings const &a_construction, HAPI::Node const &a_node, SetupInfo &a_setupInfo );
~Table( );
std::size_t rows( ) const { return( m_rows ); } /**< Returns the value of the *m_rows* member. */
std::size_t columns( ) const { return( m_columns ); } /**< Returns the value of the *m_columns* member. */
std::string const &storageOrder( ) const { return( m_storageOrder ); } /**< Returns the value of the *m_storageOrder* member. */
Suite const &columnHeaders( ) const { return( m_columnHeaders ); } /**< Returns the value of the *m_columnHeaders* member. */
Data const &data( ) const { return( m_data ); } /**< Returns the value of the *m_data* member. */
void toXMLList( GUPI::WriteInfo &a_writeInfo, std::string const &a_indent = "" ) const ;
};
} // End Table namespace.
/*
============================================================
=========================== Flux ===========================
============================================================
*/
class Flux : public Form {
private:
Functions::Function2dForm *m_flux; /**< The flux f(E,mu). */
public:
Flux( Construction::Settings const &a_construction, HAPI::Node const &a_node, SetupInfo &a_setupInfo );
~Flux( );
void toXMLList( GUPI::WriteInfo &a_writeInfo, std::string const &a_indent ) const ;
};
/*
============================================================
========================== Group ===========================
============================================================
*/
class Group : public Form {
private:
Grid m_grid; /**< Multi-group boundaries for this Group. */
public:
Group( Construction::Settings const &a_construction, HAPI::Node const &a_node, SetupInfo &a_setupInfo, PoPI::Database const &a_pops );
Group( Group const &a_group );
std::size_t size( ) const { return( m_grid.size( ) ); } /**< Returns the number of multi-group boundaries. */
inline double &operator[]( std::size_t a_index ) { return( m_grid[a_index] ); } /**< Returns the multi-group boundary at index *a_index*. */
std::vector<double> data( ) const { return( m_grid.data().vector() ); } /**< Returns the multi-group boundaries. */
Grid const &grid( ) const { return( m_grid ); } /**< Returns the value of the *m_grid* member. */
void toXMLList( GUPI::WriteInfo &a_writeInfo, std::string const &a_indent ) const ;
};
/*
============================================================
====================== Transportable =======================
============================================================
*/
class Transportable : public Form {
private:
std::string m_conserve; /**< Conservation flag for the transfer matrices for this particle. Currently, only "*number*" is allowed. */
Group m_group; /**< Multi-group boundaries for this Transportable. */
public:
Transportable( Construction::Settings const &a_construction, HAPI::Node const &a_node, SetupInfo &a_setupInfo, PoPI::Database const &a_pops, Suite *a_parent );
Transportable( Transportable const &a_transportable );
std::string pid( ) const { return( label( ) ); } /**< Returns the value of the particle id for the *Transportable*. */
std::string const &conserve( ) const { return( m_conserve ); } /**< Returns a const reference to member *m_conserve*. */
Group const &group( ) const { return( m_group ); } /**< Returns the value of the *m_group* member. */
std::vector<double> groupBoundaries( ) const { return( m_group.data( ) ); } /**< Returns the multi-group boundaries for this transportable particle. */
void toXMLList( GUPI::WriteInfo &a_writeInfo, std::string const &a_indent ) const ;
};
namespace TargetInfo {
/*
============================================================
========================= nuclide =========================
============================================================
*/
class Nuclide : public GUPI::Entry {
private:
double m_atomFraction; /**< The atom fraction for *this* isotope. */
public:
Nuclide( HAPI::Node const &a_node );
~Nuclide( );
std::string const &pid( ) const { return( keyValue( ) ); } /**< Returns a const reference to the results of the call to the *keyValue()* method. */
double atomFraction( ) const { return( m_atomFraction ); } /**< Returns the value of the *m_atomFraction* member. */
GUPI::Ancestry *findInAncestry3( LUPI_maybeUnused std::string const &a_item ) { return( nullptr ); }
GUPI::Ancestry const *findInAncestry3( LUPI_maybeUnused std::string const &a_item ) const { return( nullptr ); }
void toXMLList( GUPI::WriteInfo &a_writeInfo, std::string const &a_indent = "" ) const ;
};
/*
============================================================
===================== ChemicalElement =====================
============================================================
*/
class ChemicalElement : public GUPI::Entry {
private:
GUPI::Suite m_nuclides; /**< The list of nuclies for the chemical element. */
public:
ChemicalElement( HAPI::Node const &a_node );
~ChemicalElement( );
GUPI::Suite &nuclides( ) { return( m_nuclides ); }
GUPI::Suite const &nuclides( ) const { return( m_nuclides ); }
std::string const &symbol( ) const { return( keyValue( ) ); } /**< Returns a const reference to the results of the call to the *keyValue()* method. */
Nuclide const *operator[]( std::string const &a_pid ) const ;
GUPI::Ancestry *findInAncestry3( LUPI_maybeUnused std::string const &a_item ) { return( nullptr ); }
GUPI::Ancestry const *findInAncestry3( LUPI_maybeUnused std::string const &a_item ) const { return( nullptr ); }
void toXMLList( GUPI::WriteInfo &a_writeInfo, std::string const &a_indent = "" ) const ;
};
/*
============================================================
==================== IsotopicAbundances ====================
============================================================
*/
class IsotopicAbundances : public GUPI::Ancestry {
private:
GUPI::Suite m_chemicalElements;
public:
IsotopicAbundances( );
~IsotopicAbundances( );
void initialize( HAPI::Node const &a_node );
GUPI::Suite &chemicalElements( ) { return( m_chemicalElements ); } /**< Returns a reference to the *m_chemicalElements* member. */
GUPI::Suite const &chemicalElements( ) const { return( m_chemicalElements ); } /**< Returns a const reference to the *m_chemicalElements* member. */
ChemicalElement const *operator[]( std::string const &a_symbol ) const ;
GUPI::Ancestry *findInAncestry3( LUPI_maybeUnused std::string const &a_item ) { return( nullptr ); }
GUPI::Ancestry const *findInAncestry3( LUPI_maybeUnused std::string const &a_item ) const { return( nullptr ); }
void toXMLList( GUPI::WriteInfo &a_writeInfo, std::string const &a_indent = "" ) const ;
};
/*
============================================================
======================== TargetInfo =======================
============================================================
*/
class TargetInfo : public GUPI::Ancestry {
private:
IsotopicAbundances m_isotopicAbundances; /**< The list of isotopic abundances for a TNSL protare. */
public:
TargetInfo( );
~TargetInfo( );
void parseEvaluatedTargetInfo( HAPI::Node const &a_node );
IsotopicAbundances const &isotopicAbundances( ) const { return( m_isotopicAbundances ); } /**< Returns a const reference to the *m_isotopicAbundances* member. */
GUPI::Ancestry *findInAncestry3( LUPI_maybeUnused std::string const &a_item ) { return( nullptr ); }
GUPI::Ancestry const *findInAncestry3( LUPI_maybeUnused std::string const &a_item ) const { return( nullptr ); }
void toXMLList( GUPI::WriteInfo &a_writeInfo, std::string const &a_indent = "" ) const ;
};
} // End of namespace targetInfo.
/*
============================================================
======================= ExternalFile =======================
============================================================
*/
class ExternalFile : public Form {
private:
std::string m_path; /**< The path to the external file. */
public:
ExternalFile( std::string const &a_label, std::string const &a_path );
ExternalFile( HAPI::Node const &a_node, SetupInfo &a_setupInfo, GIDI::Suite *a_parent );
~ExternalFile( );
std::string const &path( ) const { return( m_path ); }
void toXMLList( GUPI::WriteInfo &a_writeInfo, std::string const &a_indent = "" ) const ;
};
/*
============================================================
==================== Documentation_1_10 ====================
============================================================
*/
namespace Documentation_1_10 {
class Documentation : public Form {
private:
std::string m_label; /**< The label for the documentation. */
std::string m_text; /**< The documentation text. */
public:
Documentation( HAPI::Node const &a_node, SetupInfo &a_setupInfo, GIDI::Suite *a_parent );
~Documentation( ) { }
std::string const &label( ) const { return m_label; } /**< Returns a const reference to the *m_label* member. */
std::string const &text( ) const { return m_text; } /**< Returns a const reference to the *m_text* member. */
};
/*
============================================================
=========================== Suite ==========================
============================================================
*/
class Suite : public GIDI::Suite {
public:
Suite( );
void parse( HAPI::Node const &a_node, SetupInfo &a_setupInfo );
};
} // End of namespace Documentation_1_10.
/*
============================================================
===================== ExternalFiles stuff ==================
============================================================
*/
namespace ExternalFiles {
/*
============================================================
========================== Suite ===========================
============================================================
*/
class Suite : public GIDI::Suite {
public:
void registerBinaryFiles( std::string const &a_parentDir, SetupInfo &a_setupInfo );
};
} // End of namespace ExternalFiles.
/*
============================================================
========================= Styles stuff =====================
============================================================
*/
namespace Styles {
/*
============================================================
========================== Base ============================
============================================================
*/
class Base : public Form {
private:
std::string m_date; /**< The GNDS <**date**> attribute. */
std::string m_label; /**< The GNDS <**label**> attribute. */
std::string m_derivedStyle; /**< The GNDS <**derivedFrom**> attribute. */
GUPI::Documentation *m_documentation;
public:
Base( HAPI::Node const &a_node, SetupInfo &a_setupInfo, GIDI::Suite *a_parent );
~Base( );
std::string const &date( ) const { return( m_date ); } /**< Returns the value of the *m_date* member. */
std::string const &label( ) const { return( m_label ); } /**< Returns the value of the *m_label* member. */
std::string const &derivedStyle( ) const { return( m_derivedStyle ); } /**< Returns the value of the *m_derivedStyle* member. */
bool hasDocumentation( ) { return ( m_documentation != nullptr ); }
GUPI::Documentation *documentation( ) { return ( m_documentation ); }
virtual PhysicalQuantity const &temperature( ) const = 0;
Base const *getDerivedStyle( ) const ;
Base const *getDerivedStyle( std::string const &a_moniker ) const ;
std::vector<Base const *> chain( ) const ;
bool isStyleInDerivedForm( Base const *a_style ) const ;
std::string baseXMLAttributes( GUPI::WriteInfo &a_writeInfo ) const ;
};
/*
============================================================
======================== Evaluated =========================
============================================================
*/
class Evaluated : public Base {
private:
std::string m_library; /**< The GNDS <**library**> attribute. */
std::string m_version; /**< The GNDS <**version**> attribute. */
PhysicalQuantity m_temperature; /**< The GNDS <**temperature**> node data. */
AxisDomain m_projectileEnergyDomain; /**< The GNDS <**projectileEnergyDomain**> node data. */
public:
Evaluated( HAPI::Node const &a_node, SetupInfo &a_setupInfo, GIDI::Suite *a_parent );
PhysicalQuantity const &temperature( ) const { return( m_temperature ); } /**< Returns the value of the *m_temperature* member. */
AxisDomain const &projectileEnergyDomain( ) const { return( m_projectileEnergyDomain ); }
void toXMLList( GUPI::WriteInfo &a_writeInfo, std::string const &a_indent ) const ;
};
/*
============================================================
================ CrossSectionReconstructed =================
============================================================
*/
class CrossSectionReconstructed : public Base {
private:
PhysicalQuantity *m_temperature; /**< The GNDS <**temperature**> node data. */
public:
CrossSectionReconstructed( HAPI::Node const &a_node, SetupInfo &a_setupInfo, GIDI::Suite *a_parent );
~CrossSectionReconstructed( );
PhysicalQuantity const &temperature( ) const ;
void toXMLList( GUPI::WriteInfo &a_writeInfo, std::string const &a_indent ) const ;
};
/*
============================================================
============= AngularDistributionReconstructed =============
============================================================
*/
class AngularDistributionReconstructed : public Base {
private:
PhysicalQuantity *m_temperature; /**< The GNDS <**temperature**> node data. */
public:
AngularDistributionReconstructed( HAPI::Node const &a_node, SetupInfo &a_setupInfo, GIDI::Suite *a_parent );
~AngularDistributionReconstructed( );
PhysicalQuantity const &temperature( ) const ;
void toXMLList( GUPI::WriteInfo &a_writeInfo, std::string const &a_indent ) const ;
};
/*
============================================================
============= CoulombPlusNuclearElasticMuCutoff ============
============================================================
*/
class CoulombPlusNuclearElasticMuCutoff : public Base {
private:
double m_muCutoff; /**< The GNDS <**muCutoff**> attribute. */
public:
CoulombPlusNuclearElasticMuCutoff( HAPI::Node const &a_node, SetupInfo &a_setupInfo, GIDI::Suite *a_parent );
PhysicalQuantity const &temperature( ) const ;
double muCutoff( ) const { return( m_muCutoff ); } /**< Returns the value of the *m_muCutoff* member. */
void toXMLList( GUPI::WriteInfo &a_writeInfo, std::string const &a_indent ) const ;
};
/*
============================================================
======================= Realization ========================
============================================================
*/
class Realization : public Base {
public:
Realization( HAPI::Node const &a_node, SetupInfo &a_setupInfo, GIDI::Suite *a_parent );
PhysicalQuantity const & temperature( ) const ;
void toXMLList( GUPI::WriteInfo &a_writeInfo, std::string const &a_indent ) const ;
};
/*
============================================================
=================== AverageProductData =====================
============================================================
*/
class AverageProductData : public Base {
private:
PhysicalQuantity *m_temperature; /**< The GNDS <**temperature**> node data. */
public:
AverageProductData( HAPI::Node const &a_node, SetupInfo &a_setupInfo, GIDI::Suite *a_parent );
~AverageProductData( );
PhysicalQuantity const &temperature( ) const ;
void toXMLList( GUPI::WriteInfo &a_writeInfo, std::string const &a_indent ) const ;
};
/*
============================================================
===================== MonteCarlo_cdf =======================
============================================================
*/
class MonteCarlo_cdf : public Base {
public:
MonteCarlo_cdf( HAPI::Node const &a_node, SetupInfo &a_setupInfo, GIDI::Suite *a_parent );
PhysicalQuantity const &temperature( ) const ;
void toXMLList( GUPI::WriteInfo &a_writeInfo, std::string const &a_indent ) const ;
};
/*
============================================================
======================== MultiGroup ========================
============================================================
*/
class MultiGroup : public Base {
private:
int m_maximumLegendreOrder; /**< The GNDS <**lMax**> attribute. */
GIDI::Suite m_transportables; /**< The GNDS <**transportables**> node. */
public:
MultiGroup( Construction::Settings const &a_construction, HAPI::Node const &a_node, SetupInfo &a_setupInfo, PoPI::Database const &a_pops, PoPI::Database const &a_internalPoPs, GIDI::Suite *a_parent );
~MultiGroup( );
int maximumLegendreOrder( ) const { return( m_maximumLegendreOrder ); } /**< Returns the value of the *m_maximumLegendreOrder* member. */
PhysicalQuantity const &temperature( ) const ;
std::vector<double> groupBoundaries( std::string const &a_productID ) const ;
GIDI::Suite const &transportables( ) const { return( m_transportables ); } /**< Returns the value of the *m_transportables* member. */
void toXMLList( GUPI::WriteInfo &a_writeInfo, std::string const &a_indent ) const ;
};
/*
============================================================
========================= Heated ===========================
============================================================
*/
class Heated : public Base {
private:
PhysicalQuantity m_temperature; /**< The GNDS <**temperature**> node data. */
public:
Heated( HAPI::Node const &a_node, SetupInfo &a_setupInfo, GIDI::Suite *a_parent );
PhysicalQuantity const & temperature( ) const { return( m_temperature ); } /**< Returns the value of the *m_temperature* member. */
void toXMLList( GUPI::WriteInfo &a_writeInfo, std::string const &a_indent ) const ;
};
/*
============================================================
===================== HeatedMultiGroup =====================
============================================================
*/
class HeatedMultiGroup : public Base {
private:
GIDI::Suite m_transportables; /**< The GNDS <**transportables**> node. For GNDS 2.0 and above. */
Flux m_flux; /**< The GNDS <**flux**> node. */
Functions::Gridded1d m_inverseSpeed; /**< The GNDS <**inverseSpeed**> node data. */
std::string m_parameters; /**< The GNDS <**parameters**> attribute. Only used for GNDS 1.10. */
public:
HeatedMultiGroup( Construction::Settings const &a_construction, HAPI::Node const &a_node, SetupInfo &a_setupInfo, PoPI::Database const &a_pops, GIDI::Suite *a_parent );
~HeatedMultiGroup( );
PhysicalQuantity const &temperature( ) const ;
GIDI::Suite const &transportables( ) const { return( m_transportables ); } /**< Returns a const reference to *m_transportables*. */
Transportable const &transportable( std::string const &a_ID ) const ;
std::vector<double> groupBoundaries( std::string const &a_ID ) const ;
Flux const &flux( ) const { return( m_flux ); } /**< Returns a const reference to member *m_flux*. */
std::string const &parameters( ) const { return( m_parameters ); } /**< Returns a const reference to member *m_parameters*. Only used for GNDS 1.10. */
Vector inverseSpeedData( ) const { return( m_inverseSpeed.data( ) ); } /**< Returns the value of the *m_inverseSpeed* data. */
void toXMLList( GUPI::WriteInfo &a_writeInfo, std::string const &a_indent ) const ;
};
/*
============================================================
==================== SnElasticUpScatter ====================
============================================================
*/
class SnElasticUpScatter : public Base {
private:
int m_upperCalculatedGroup; /**< The GNDS <**upperCalculatedGroup**> attribute. */
public:
SnElasticUpScatter( HAPI::Node const &a_node, SetupInfo &a_setupInfo, PoPI::Database const &a_pops, GIDI::Suite *a_parent );
~SnElasticUpScatter( );
PhysicalQuantity const &temperature( ) const ;
int upperCalculatedGroup( ) const { return( m_upperCalculatedGroup ); } /**< Returns the value of the *m_upperCalculatedGroup* data. */
void toXMLList( GUPI::WriteInfo &a_writeInfo, std::string const &a_indent ) const ;
};
/*
============================================================
==================== GriddedCrossSection ===================
============================================================
*/
class GriddedCrossSection : public Base {
private:
Grid m_grid; /**< The GNDS <**grid**> node. */
public:
GriddedCrossSection( Construction::Settings const &a_construction, HAPI::Node const &a_node, SetupInfo &a_setupInfo, PoPI::Database const &a_pops, GIDI::Suite *a_parent );
~GriddedCrossSection( );
PhysicalQuantity const &temperature( ) const ;
Grid const &grid( ) const { return( m_grid ); } /**< Returns the value of the *m_grid*. */
void toXMLList( GUPI::WriteInfo &a_writeInfo, std::string const &a_indent ) const ;
};
/*
============================================================
=================== URR_probabilityTables ==================
============================================================
*/
class URR_probabilityTables : public Base {
public:
URR_probabilityTables( Construction::Settings const &a_construction, HAPI::Node const &a_node, SetupInfo &a_setupInfo, PoPI::Database const &a_pops, GIDI::Suite *a_parent );
~URR_probabilityTables( );
PhysicalQuantity const &temperature( ) const ;
void toXMLList( GUPI::WriteInfo &a_writeInfo, std::string const &a_indent ) const ;
};
/*
============================================================
========================== Suite ===========================
============================================================
*/
class Suite : public GIDI::Suite {
private:
std::vector<Base const *> m_chainEnds; /**< The list of all the ends of the style chains. */
std::vector<Base const *> m_preProcessingChainEnds; /**< The list of all the ends of the pre-processed style chains. */
public:
Suite( );
std::string const *findLabelInLineage( GIDI::Suite const &a_suite, std::string const &a_label ) const ;
std::vector< std::vector<Base const *> > chains( bool a_ends ) const ;
void updateChainEnds( );
std::vector<Base const *> const &chainEnds( ) const { return( m_chainEnds ); } /**< Returns a const reference to the **m_chainEnds** member. */
std::vector<Base const *> const &preProcessingChainEnds( ) const { return( m_preProcessingChainEnds ); }
/**< Returns a const reference to the **m_preProcessingChainEnds** member. */
};
/*
============================================================
===================== TemperatureInfo ======================
============================================================
*/
class TemperatureInfo {
private:
PhysicalQuantity m_temperature; /**< The temperature for this TemperatureInfo. */
std::string m_heatedCrossSection; /**< The label for the *heatedCrossSection* data for this temperature. */
std::string m_griddedCrossSection; /**< The label for the *griddedCrossSection* data for this temperature. */
std::string m_URR_probabilityTables; /**< The label for the *URR_probabilityTables* data for this temperature. */
std::string m_heatedMultiGroup; /**< The label for the *heatedMultiGroup* data for this temperature. */
std::string m_SnElasticUpScatter; /**< The label for the *SnElasticUpScatter* data for this temperature. */
public:
TemperatureInfo( );
TemperatureInfo( PhysicalQuantity const &a_temperature, std::string const &a_heatedCrossSection, std::string const &a_griddedCrossSection,
std::string const &a_URR_probabilityTables, std::string const &a_heatedMultiGroup, std::string const &a_SnElasticUpScatter );
PhysicalQuantity const &temperature( ) const { return( m_temperature ); } /**< Returns the value of the *m_temperature*. */
std::string const &heatedCrossSection( ) const { return( m_heatedCrossSection ); } /**< Returns the value of the *m_heatedCrossSection*. */
std::string const &griddedCrossSection( ) const { return( m_griddedCrossSection ); } /**< Returns the value of the *m_griddedCrossSection*. */
std::string const &URR_probabilityTables( ) const { return( m_URR_probabilityTables ); } /**< Returns the value of the *m_URR_probabilityTables*. */
std::string const &heatedMultiGroup( ) const { return( m_heatedMultiGroup ); } /**< Returns the value of the *m_heatedMultiGroup*. */
std::string const &SnElasticUpScatter( ) const { return( m_SnElasticUpScatter ); } /**< Returns the value of the *m_SnElasticUpScatter*. */
void print( ) const ;
};
typedef std::vector<Styles::TemperatureInfo> TemperatureInfos;
} // End of namespace Styles.
/*
=========================================================
*/
template<typename T> T *Suite::getViaLineage( std::string const &a_label ) {
std::string const *label = m_styles->findLabelInLineage( (Styles::Suite &) *this, a_label );
return( get<T>( *label ) );
}
/*
=========================================================
*/
template<typename T> T *Suite::getViaLineage( std::string const &a_label ) const {
std::string const *label = m_styles->findLabelInLineage( (Styles::Suite &) *this, a_label );
return( get<T>( *label ) );
}
/*
============================================================
==================== Transporting stuff ====================
============================================================
*/
namespace Transporting {
class ProcessedFlux;
enum class Mode { multiGroup, multiGroupWithSnElasticUpScatter, MonteCarloContinuousEnergy };
enum class DelayedNeutrons { off, on };
enum class Conserve { number, energyOut };
/*
============================================================
========================== MultiGroup ======================
============================================================
*/
class MultiGroup {
private:
std::string m_label; /**< The label for the multi-group. */
std::vector<double> m_boundaries; /**< The list of boundaries for the multi-group. */
public:
MultiGroup( );
MultiGroup( std::string const &a_label, int a_length, double const *a_values );
MultiGroup( std::string const &a_label, std::vector<double> const &a_boundaries );
MultiGroup( Group const &a_group );
MultiGroup( MultiGroup const &a_multiGroup );
~MultiGroup( );
MultiGroup &operator=( MultiGroup const &a_rhs );
double operator[]( std::size_t const a_index ) const { return( m_boundaries[a_index] ); } /**< Returns the multi-group boundary at index *a_index*. */
std::size_t size( ) const { return( m_boundaries.size( ) ); } /**< Returns the number of multi-group boundaries. */
std::size_t numberOfGroups( ) const { return( ( m_boundaries.size( ) - 1 ) ); } /**< Returns the number of multi-group groups. */
std::vector<double> const &boundaries( ) const { return( m_boundaries ); } /**< Returns the value of the *m_boundaries* member. */
double const *pointer( ) const { return( &(m_boundaries[0]) ); } /**< Returns a pointer to the beginning of the multi-group boundaries. */
void set( std::string const &a_label, std::vector<double> const &a_boundaries );
std::string const &label( ) const { return( m_label ); } /**< Returns the value of the *m_label* member. */
int multiGroupIndexFromEnergy( double a_energy, bool a_encloseOutOfRange ) const ;
void print( std::string const &a_indent, bool a_outline = false, unsigned int a_valuesPerLine = 10 ) const ;
};
/*
============================================================
==================== Groups_from_bdfls =====================
============================================================
*/
class Groups_from_bdfls {
private:
std::vector<MultiGroup> m_multiGroups; /**< List of MultiGroup's read in from the bdfls file. */
public:
Groups_from_bdfls( std::string const &a_fileName );
Groups_from_bdfls( char const *a_fileName );
~Groups_from_bdfls( );
MultiGroup viaLabel( std::string const &a_label ) const ;
MultiGroup getViaGID( int a_gid ) const;
std::vector<std::string> labels( ) const;
std::vector<int> GIDs( ) const;
void print( bool a_outline = true, unsigned int a_valuesPerLine = 10 ) const;
private:
void initialize( char const *a_fileName );
};
/*
============================================================
========================= Flux_order =======================
============================================================
*/
class Flux_order {
private:
std::size_t m_order; /**< The Legendre order of the flux. */
std::vector<double> m_energies; /**< List of flux energies. */
std::vector<double> m_fluxes; /**< List of flux values - one for each element of m_energies. */
public:
Flux_order( std::size_t a_order, std::size_t a_length, double const *a_energies, double const *a_fluxes );
Flux_order( std::size_t a_order, std::vector<double> const &a_energies, std::vector<double> const &a_fluxes );
Flux_order( Flux_order const &a_fluxOrder );
~Flux_order( );
std::size_t order( ) const { return( m_order ); } /**< Returns the value of the *m_order* member. */
std::size_t size( ) const { return( m_energies.size( ) ); } /**< Returns the number of energy, flux pairs. */
double const *energies( ) const { return( &(m_energies[0]) ); } /**< Returns a pointer to the beginning of the energy data. */
std::vector<double> const &v_energies( ) const { return( m_energies ); } /**< Returns the value of the *m_energies* member. */
double const *fluxes( ) const { return( &(m_fluxes[0]) ); } /**< Returns a pointer to the beginning of the flux data. */
std::vector<double> const &v_fluxes( ) const { return( m_fluxes ); } /**< Returns the value of the *m_fluxes* member. */
void print( unsigned int a_valuesPerLine = 10 ) const;
};
/*
============================================================
============================ Flux ==========================
============================================================
*/
class Flux {
private:
std::string m_label; /**< Label for the flux. */
double m_temperature; /**< Temperature of the material that produced this flux. */
std::vector<Flux_order> m_fluxOrders; /**< List of fluxes for each Legendre order, *l*, sorted by Legendre order starting with *l* = 0. */
public:
Flux( std::string const &a_label, double a_temperature_MeV );
Flux( char const *a_label, double a_temperature_MeV );
Flux( Flux const &a_flux );
~Flux( );
Flux_order const &operator[]( std::size_t a_order ) const { return( m_fluxOrders[a_order] ); }
/**< Returns the Flux_order for Legendre order *a_order*. */
std::size_t maxOrder( ) const { return( m_fluxOrders.size( ) - 1 ); } /**< Returns the maximum number of Legendre orders for *this*. */
std::size_t size( ) const { return( m_fluxOrders.size( ) ); } /**< Returns the number of stored Legendre orders. */
std::string const &label( ) const { return( m_label ); } /**< Returns the value of the *m_label* member. */
double temperature( ) const { return( m_temperature ); } /**< Returns the value of the *m_temperature* member. */
void addFluxOrder( Flux_order const &a_fluxOrder );
ProcessedFlux process( std::vector<double> const &a_multiGroup ) const ;
void print( std::string const &a_indent, bool a_outline = true, unsigned int a_valuesPerLine = 10 ) const ;
};
/*
============================================================
===================== Fluxes_from_bdfls ====================
============================================================
*/
class Fluxes_from_bdfls {
private:
std::vector<Flux> m_fluxes; /**< The list of Flux read in from the *bdfls* file. */
public:
Fluxes_from_bdfls( std::string const &a_fileName, double a_temperature_MeV );
Fluxes_from_bdfls( char const *a_fileName, double a_temperature_MeV );
~Fluxes_from_bdfls( );
Flux getViaFID( int a_fid ) const ;
Functions::XYs3d *get3dViaFID( int a_fid ) const ;
std::vector<std::string> labels( ) const ;
std::vector<int> FIDs( ) const ;
void print( bool a_outline = true, unsigned int a_valuesPerLine = 10 ) const ;
private:
void initialize( char const *a_fileName, double a_temperature_MeV );
};
/*
============================================================
======================= ProcessedFlux ======================
============================================================
*/
class ProcessedFlux {
private:
double m_temperature; /**< The temperature of the material that produced the flux. */
std::vector<double> m_multiGroupFlux; /**< The Legendre order = 0 multi-grouped flux. */
public:
ProcessedFlux( double a_temperature, std::vector<double> const &a_multiGroupFlux );
ProcessedFlux( ProcessedFlux const &a_processedFlux );
~ProcessedFlux( );
double temperature( ) const { return( m_temperature ); } /**< Returns the value of the *m_temperature* member. */
std::vector<double> const &multiGroupFlux( ) const { return( m_multiGroupFlux ); } /**< Returns the value of the *m_multiGroupFlux* member. */
};
/*
============================================================
========================= Particle =========================
============================================================
*/
class Particle {
private:
std::string m_pid; /**< The PoPs id for the particle. */
Transporting::Mode m_mode; /**< Indicates the type of transport the user is likely, but not guaranteed, to do. */
Transporting::Conserve m_conserve; /**< Indicates the conservation option for this transportable. */
MultiGroup m_multiGroup; /**< Coarse multi-group to collapse to. */
MultiGroup m_fineMultiGroup; /**< Fine multi-group to collapse from. For internal use only. */
std::vector<std::size_t> m_collapseIndices; /**< Indices for collapsing to m_multiGroup. */
std::vector<Flux> m_fluxes; /**< One flux for each temperature. */
std::vector<ProcessedFlux> m_processedFluxes; /**< One processed flux for each temperature. */
public:
Particle( std::string const &a_pid, MultiGroup const &a_multiGroup, Functions::Function3dForm const &a_fluxes,
Transporting::Mode a_mode = Transporting::Mode::multiGroup );
Particle( std::string const &a_pid, Transporting::Mode a_mode = Transporting::Mode::multiGroup );
Particle( std::string const &a_pid, MultiGroup const &a_multiGroup, Transporting::Mode a_mode = Transporting::Mode::multiGroup );
Particle( Particle const &a_particle );
~Particle( );
std::string const &pid( ) const { return( m_pid ); } /**< Returns the value of the *m_pid* member. */
Transporting::Mode mode( ) const { return( m_mode ); } /**< Returns the value of the *m_mode* member. */
Transporting::Conserve conserve( ) const { return( m_conserve ); } /**< Returns the value of the *m_conserve* member. */
int multiGroupIndexFromEnergy( double a_e_in, bool a_encloseOutOfRange ) const { return( m_multiGroup.multiGroupIndexFromEnergy( a_e_in, a_encloseOutOfRange ) ); }
/**< Returns the coarse multi-group index corresponding to energy *a_e_in*. See MultiGroup::multiGroupIndexFromEnergy. */
std::size_t numberOfGroups( ) const { return( m_multiGroup.numberOfGroups( ) ); } /**< Returns the number of coarse multi-group groups. */
MultiGroup multiGroup( ) const { return( m_multiGroup ); } /**< Returns the value of the *m_multiGroup* member. */
MultiGroup fineMultiGroup( ) const { return( m_fineMultiGroup ); } /**< Returns the value of the *m_fineMultiGroup* member. */
int appendFlux( Flux const &a_flux );
ProcessedFlux const *nearestProcessedFluxToTemperature( double a_temperature ) const;
std::vector<std::size_t> const &collapseIndices( ) const { return( m_collapseIndices ); } /**< Returns the value of the *m_collapseIndices* member. */
void process( Transportable const &a_transportable, double a_epsilon = 1e-6 );
void print( std::string const &a_indent ) const ;
};
/*
============================================================
======================== Particles =========================
============================================================
*/
class Particles {
private:
std::map<std::string, Particle> m_particles;
public:
Particles( );
~Particles( );
std::map<std::string, Particle> &particles( ) { return( m_particles ); } /**< Returns the value of the *m_particles* member. */
std::map<std::string, Particle> const &particles( ) const { return( m_particles ); } /**< Returns the value of the *m_particles* member. */
Particle const *particle( std::string const &a_particleID ) const;
bool add( Particle const &a_particle );
bool remove( std::string const &a_particleID );
void clear( ) { m_particles.clear( ); }
bool hasParticle( std::string const &a_id ) const ;
void process( Protare const &a_protare, std::string const &a_label );
std::vector<std::string> sortedIDs( bool a_orderIsAscending = true ) const ;
void print( ) const ;
};
/*
============================================================
========================= Settings =========================
============================================================
*/
class Settings {
private:
std::string m_projectileID; /**< The PoPs id of the projectile. */
DelayedNeutrons m_delayedNeutrons; /**< If **true**, include delayed neutrons when returning or setting up data. */
bool m_nuclearPlusCoulombInterferenceOnly; /**< If **true**, for charge particle as projectile and elastic scattering, the Rutherford term is excluded from the elastic reaction. */
bool m_throwOnError; /**< For methods that have an argument of type *LUPI:StatusMessageReporting**, if this member is true, an error will cause a thorw; otherwise, the error will be ignored and reported to the *LUPI:StatusMessageReporting** instance. */
bool m_zeroDepositionIfAllProductsTracked; /**< For a reaction, if **true* and all products are tracked, then the deposition energy will be set to zero, independent of that the data may yield. Otherwise, the data results are returned. */
public:
Settings( std::string const &a_projectileID, DelayedNeutrons a_delayedNeutrons );
~Settings( );
std::string const &projectileID( ) const { return( m_projectileID ); } /**< Returns the value of the *m_projectileID* member. */
DelayedNeutrons delayedNeutrons( ) const { return( m_delayedNeutrons ); } /**< Returns the value of the *m_delayedNeutrons* member. */
void setDelayedNeutrons( DelayedNeutrons a_delayedNeutrons ) { m_delayedNeutrons = a_delayedNeutrons; } /**< Sets the *m_delayedNeutrons* member to *a_delayedNeutrons*. */
bool nuclearPlusCoulombInterferenceOnly( ) const { return( m_nuclearPlusCoulombInterferenceOnly ); } /**< Returns the value of the *m_nuclearPlusCoulombInterferenceOnly* member. */
void setNuclearPlusCoulombInterferenceOnly( bool a_nuclearPlusCoulombInterferenceOnly )
{ m_nuclearPlusCoulombInterferenceOnly = a_nuclearPlusCoulombInterferenceOnly; } /**< Sets the *m_nuclearPlusCoulombInterferenceOnly* to *a_nuclearPlusCoulombInterferenceOnly*. */
bool zeroDepositionIfAllProductsTracked( ) const { return( m_zeroDepositionIfAllProductsTracked ); } /**< Returns the value of the *m_zeroDepositionIfAllProductsTracked* member. */
void setZeroDepositionIfAllProductsTracked( bool a_zeroDepositionIfAllProductsTracked )
{ m_zeroDepositionIfAllProductsTracked = a_zeroDepositionIfAllProductsTracked; } /**< Sets the *m_zeroDepositionIfAllProductsTracked* to *a_zeroDepositionIfAllProductsTracked*. */
bool throwOnError( ) const { return( m_throwOnError ); }
void setThrowOnError( bool a_throwOnError ) { m_throwOnError = a_throwOnError; }
Vector multiGroupZeroVector( Particles const &a_particles, bool a_collapse = true ) const ;
Matrix multiGroupZeroMatrix( Particles const &a_particles, std::string const &a_particleID, bool a_collapse = true ) const ;
// void print( ) const ;
};
/*
============================================================
============================ MG ============================
============================================================
*/
class MG : public Settings {
private:
Mode m_mode; /**< Specifies the type of data to use or retrieve for transport codes. */
bool m_useMultiGroupSummedData; /**< If **true** and multi-grouped summed data available in protare, use it instead of summing data over reactions. */
public:
MG( std::string const &a_projectileID, Mode a_mode, DelayedNeutrons a_delayedNeutrons );
Mode mode( ) const { return( m_mode ); } /**< Returns the value of the *m_mode* member. */
void setMode( Mode a_mode ) { m_mode = a_mode; } /**< Sets the *m_mode* member to *a_mode*. */
bool useMultiGroupSummedData( ) const { return( m_useMultiGroupSummedData ); } /**< Returns the value of the *m_useMultiGroupSummedData* member. */
void setUseMultiGroupSummedData( bool a_useMultiGroupSummedData ) { m_useMultiGroupSummedData = a_useMultiGroupSummedData; }
/**< Sets the *m_useMultiGroupSummedData* member to *a_useMultiGroupSummedData*. */
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 ;
};
} // End of namespace Transporting.
namespace GRIN {
/*
============================================================
================= InelasticIncidentEnergy ==================
============================================================
*/
class InelasticIncidentEnergy : public Form {
private:
double m_energy;
std::string m_unit;
Table::Table m_table;
public:
InelasticIncidentEnergy( Construction::Settings const &a_construction, HAPI::Node const &a_node, SetupInfo &a_setupInfo );
~InelasticIncidentEnergy( );
double energy( ) const { return( m_energy ); }
std::string const &unit( ) const { return( m_unit ); }
Table::Table const &table( ) const { return( m_table ); }
};
/*
============================================================
================= CaptureLevelProbability ==================
============================================================
*/
class CaptureLevelProbability : public Form {
private:
double m_probabilty;
double m_spin;
std::string m_spinUnit;
int m_parity;
std::string m_capturePrimaryToContinua;
Table::Table m_table;
public:
CaptureLevelProbability( Construction::Settings const &a_construction, HAPI::Node const &a_node, SetupInfo &a_setupInfo );
~CaptureLevelProbability( );
double probabilty( ) const { return( m_probabilty ); }
double spin( ) const { return( m_spin ); }
std::string const &spinUnit( ) const { return( m_spinUnit ); }
int parity( ) const { return( m_parity ); }
std::string const &capturePrimaryToContinua( ) const { return( m_capturePrimaryToContinua ); }
Table::Table const &table( ) const { return( m_table ); }
};
/*
============================================================
=================== GRIN_continuumGammas ===================
============================================================
*/
class GRIN_continuumGammas : public GUPI::Ancestry {
private:
PhysicalQuantity m_captureNeutronSeparationEnergy;
PhysicalQuantity m_maximumCaptureIncidentEnergy;
PoPI::Database m_pops;
Suite m_inelasticIncidentEnergies;
Suite m_captureLevelProbabilities;
std::string m_captureResidualId; /**< The GNDS PoPs' id of the heavy capture residual particle. */
int m_captureResidualIntid; /**< The intid of the heavy capture residual particle. */
int m_captureResidualIndex; /**< The PoPI index of the heavy capture residual particle. */
double m_captureResidualMass; /**< The mass if the heavy capture residual particle. */
public:
GRIN_continuumGammas( Construction::Settings const &a_construction, HAPI::Node const &a_node, SetupInfo &a_setupInfo,
PoPI::Database const &a_pops, PoPI::Database const &a_internalPoPs, ProtareSingle const &a_protare, Styles::Suite const *a_styles );
~GRIN_continuumGammas( );
PhysicalQuantity const &captureNeutronSeparationEnergy( ) const { return( m_captureNeutronSeparationEnergy ); }
PhysicalQuantity const &maximumCaptureIncidentEnergy( ) const { return( m_maximumCaptureIncidentEnergy ); }
PoPI::Database const &pops( ) const { return( m_pops ); }
Suite const &inelasticIncidentEnergies( ) const { return( m_inelasticIncidentEnergies ); }
Suite const &captureLevelProbabilities( ) const { return( m_captureLevelProbabilities ); }
std::string captureResidualId( ) const { return( m_captureResidualId ); } /**< Returns the value of the *m_captureResidualId* member. */
int captureResidualIntid( ) const { return( m_captureResidualIntid ); } /**< Returns the value of the *m_captureResidualIntid* member. */
int captureResidualIndex( ) const { return( m_captureResidualIndex ); } /**< Returns the value of the *m_captureResidualIndex* member. */
double captureResidualMass( ) const { return( m_captureResidualMass ); } /**< Returns the value of the *m_captureResidualMass* member. */
GUPI::Ancestry *findInAncestry3( std::string const &a_item );
GUPI::Ancestry const *findInAncestry3( std::string const &a_item ) const ;
};
} // End of namespace GRIN.
/*
============================================================
========================= Product ==========================
============================================================
*/
class Product : public Form {
private:
ParticleInfo m_particle; /**< The products *ParticleInfo* data. */
ParticleInfo m_GNDS_particle; /**< The products *ParticleInfo* data. This is the product's equivalent of the Protare::m_GNDS_target member. */
int m_productMultiplicity; /**< Product integer multiplicity (e.g., 0, 1, 2, ...) or -1 if energy dependent or not an integer. */
bool m_treatProductAsIfInfinityMass; /**< If **true**, the product is photo-atomic or TNSL target and should be handled as if it has infinite mass. Ths is, energy and momentum data are returned with 0 value. */
Component m_multiplicity; /**< The GNDS <**multiplicity**> node. */
Component m_distribution; /**< The GNDS <**distribution**> node. */
Component m_averageEnergy; /**< The GNDS <**averageEnergy**> node. */
Component m_averageMomentum; /**< The GNDS <**averageMomentum**> node. */
OutputChannel *m_outputChannel; /**< The GNDS <**outputChannel**> node if present. */
public:
Product( PoPI::Database const &a_pops, std::string const &a_productID, std::string const &a_label );
Product( Construction::Settings const &a_construction, HAPI::Node const &a_node, SetupInfo &a_setupInfo, PoPI::Database const &a_pops,
PoPI::Database const &a_internalPoPs, Suite *a_parent, Styles::Suite const *a_styles );
~Product( );
ParticleInfo const &particle( ) const { return( m_particle ); } /**< Returns the value of the *m_particle* member. */
void setParticle( ParticleInfo const &a_particle ) { m_particle = a_particle; } /**< Sets *m_particle* to *a_particle*. */
std::string pid( ) const { return( m_particle.ID( ) ); }
ParticleInfo const &GNDS_particle( ) const { return( m_GNDS_particle ); } /**< Returns a const reference to the *m_GNDS_particle* member. */
ParticleInfo &GNDS_particle( ) { return( m_GNDS_particle ); } /**< Returns the value of the *m_GNDS_particle* member. */
int depth( ) const ;
Component &multiplicity( ) { return( m_multiplicity ); } /**< Returns a reference to the *m_multiplicity* member. */
Component const &multiplicity( ) const { return( m_multiplicity ); } /**< Returns a const reference to the *m_multiplicity* member. */
Component &distribution( ) { return( m_distribution ); } /**< Returns a reference to the *m_distribution* member. */
Component const &distribution( ) const { return( m_distribution ); } /**< Returns a reference to the *m_distribution* member. */
Component &averageEnergy( ) { return( m_averageEnergy ); } /**< Returns a reference to the *m_averageEnergy* member. */
Component const &averageEnergy( ) const { return( m_averageEnergy ); } /**< Returns a const reference to the *m_averageEnergy* member. */
Component &averageMomentum( ) { return( m_averageMomentum ); } /**< Returns a reference to the *m_averageMomentum* member. */
Component const &averageMomentum( ) const { return( m_averageMomentum ); } /**< Returns a const reference to the *m_averageMomentum* member. */
OutputChannel *outputChannel( ) const { return( m_outputChannel ); } /**< Returns a reference to the *m_outputChannel* member. */
void modifiedMultiGroupElasticForTNSL( std::map<std::string,std::size_t> const &a_maximumTNSL_MultiGroupIndex );
bool hasFission( ) const ;
bool isDelayedFissionNeutronComplete( bool a_isDelayedNeutron ) const ;
bool areAllProductsTracked( Transporting::Particles const &a_particles ) const ;
GUPI::Ancestry *findInAncestry3( std::string const &a_item );
GUPI::Ancestry const *findInAncestry3( std::string const &a_item ) const ;
void productIDs( std::set<std::string> &a_ids, Transporting::Particles const &a_particles, bool a_transportablesOnly ) 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 ;
Vector multiGroupQ( LUPI::StatusMessageReporting &a_smr, Transporting::MG const &a_settings, Styles::TemperatureInfo const &a_temperatureInfo,
bool a_final ) const ;
Vector multiGroupMultiplicity( LUPI::StatusMessageReporting &a_smr, Transporting::MG const &a_settings,
Styles::TemperatureInfo const &a_temperatureInfo, std::string const &a_productID ) const ;
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 ;
Vector multiGroupAverageEnergy( LUPI::StatusMessageReporting &a_smr, Transporting::MG const &a_settings,
Styles::TemperatureInfo const &a_temperatureInfo, std::string const &a_productID ) const ;
Vector multiGroupAverageMomentum( LUPI::StatusMessageReporting &a_smr, Transporting::MG const &a_settings,
Styles::TemperatureInfo const &a_temperatureInfo, std::string const &a_productID ) 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 ;
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 ;
bool isCompleteParticle( ) const ;
void incompleteParticles( Transporting::Settings const &a_settings, std::set<std::string> &a_incompleteParticles ) 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 toXMLList( GUPI::WriteInfo &a_writeInfo, std::string const &a_indent = "" ) const ;
};
/*
============================================================
====================== DelayedNeutron ======================
============================================================
*/
class DelayedNeutron : public Form {
private:
int m_delayedNeutronIndex; /**< If this is a delayed fission neutron, this is its index. */
Suite m_rate; /**< The GNDS <**rate**> node. */
Product m_product; /**< The GNDS <**product**> node. */
public:
DelayedNeutron( Construction::Settings const &a_construction, HAPI::Node const &a_node, SetupInfo &a_setupInfo, PoPI::Database const &a_pops, PoPI::Database const &a_internalPoPs, Suite *a_parent, Styles::Suite const *a_styles );
~DelayedNeutron( );
int delayedNeutronIndex( ) const { return( m_delayedNeutronIndex ); }
void setDelayedNeutronIndex( int a_delayedNeutronIndex ) { m_delayedNeutronIndex = a_delayedNeutronIndex; }
Suite &rate( ) { return( m_rate ); }
Suite const &rate( ) const { return( m_rate ); }
Product &product( ) { return( m_product ); }
Product const &product( ) const { return( m_product ); }
GUPI::Ancestry *findInAncestry3( std::string const &a_item );
GUPI::Ancestry const *findInAncestry3( std::string const &a_item ) const ;
void productIDs( std::set<std::string> &a_indices, Transporting::Particles const &a_particles, bool a_transportablesOnly ) 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 ;
Vector multiGroupMultiplicity( LUPI::StatusMessageReporting &a_smr, Transporting::MG const &a_settings, Styles::TemperatureInfo const &a_temperatureInfo,
std::string const &a_productID ) const ;
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 ;
Vector multiGroupAverageEnergy( LUPI::StatusMessageReporting &a_smr, Transporting::MG const &a_settings, Styles::TemperatureInfo const &a_temperatureInfo,
std::string const &a_productID ) const ;
Vector multiGroupAverageMomentum( LUPI::StatusMessageReporting &a_smr, Transporting::MG const &a_settings, Styles::TemperatureInfo const &a_temperatureInfo,
std::string const &a_productID ) const ;
void incompleteParticles( Transporting::Settings const &a_settings, std::set<std::string> &a_incompleteParticles ) 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 ;
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 ;
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 toXMLList( GUPI::WriteInfo &a_writeInfo, std::string const &a_indent = "" ) const ;
};
/*
============================================================
=================== DelayedNeutronProduct ==================
============================================================
*/
class DelayedNeutronProduct {
private:
int m_delayedNeutronIndex; /**< If this is a delayed fission neutron, this is its index. */
PhysicalQuantity m_rate;
Product const *m_product;
public:
DelayedNeutronProduct( int a_delayedNeutronIndex, PhysicalQuantity const &a_rate, Product const *a_product ) :
m_delayedNeutronIndex( a_delayedNeutronIndex ),
m_rate( a_rate ),
m_product( a_product ) {
}
DelayedNeutronProduct( DelayedNeutronProduct const &a_delayedNeutronProduct ) :
m_delayedNeutronIndex( a_delayedNeutronProduct.delayedNeutronIndex( ) ),
m_rate( a_delayedNeutronProduct.rate( ) ),
m_product( a_delayedNeutronProduct.product( ) ) {
}
~DelayedNeutronProduct( ) {}
int delayedNeutronIndex( ) const { return( m_delayedNeutronIndex ); }
PhysicalQuantity rate( ) const { return( m_rate ); }
Product const *product( ) const { return( m_product ); }
};
typedef std::vector<DelayedNeutronProduct> DelayedNeutronProducts;
/*
============================================================
==================== FissionFragmentData ===================
============================================================
*/
class FissionFragmentData : public GUPI::Ancestry {
private:
Suite m_delayedNeutrons; /**< The GNDS <**delayedNeutrons**> node. This members stores a list of DelayedNeutron instances. */
Component m_fissionEnergyReleases; /**< The GNDS <**fissionEnergyReleases**> node. */
public:
FissionFragmentData( );
FissionFragmentData( Construction::Settings const &a_construction, HAPI::Node const &a_node, SetupInfo &a_setupInfo, PoPI::Database const &a_pops, PoPI::Database const &a_internalPoPs, Styles::Suite const *a_styles );
~FissionFragmentData( );
Suite &delayedNeutrons( ) { return( m_delayedNeutrons ); }
Suite const &delayedNeutrons( ) const { return( m_delayedNeutrons ); }
Component &fissionEnergyReleases( ) { return( m_fissionEnergyReleases ); }
Component const &fissionEnergyReleases( ) const { return( m_fissionEnergyReleases ); }
bool isDelayedFissionNeutronComplete( ) const ;
GUPI::Ancestry *findInAncestry3( std::string const &a_item );
GUPI::Ancestry const *findInAncestry3( std::string const &a_item ) const ;
void productIDs( std::set<std::string> &a_indices, Transporting::Particles const &a_particles, bool a_transportablesOnly ) 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 ;
Vector multiGroupQ( LUPI::StatusMessageReporting &a_smr, Transporting::MG const &a_settings, Styles::TemperatureInfo const &a_temperatureInfo,
bool a_final ) const ;
Vector multiGroupMultiplicity( LUPI::StatusMessageReporting &a_smr, Transporting::MG const &a_settings, Styles::TemperatureInfo const &a_temperatureInfo,
std::string const &a_productID ) const ;
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 ;
Vector multiGroupAverageEnergy( LUPI::StatusMessageReporting &a_smr, Transporting::MG const &a_settings, Styles::TemperatureInfo const &a_temperatureInfo,
std::string const &a_productID ) const ;
Vector multiGroupAverageMomentum( LUPI::StatusMessageReporting &a_smr, Transporting::MG const &a_settings, Styles::TemperatureInfo const &a_temperatureInfo,
std::string const &a_productID ) const ;
void delayedNeutronProducts( DelayedNeutronProducts &a_delayedNeutronProducts ) const ;
void incompleteParticles( Transporting::Settings const &a_settings, std::set<std::string> &a_incompleteParticles ) 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 ;
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 ;
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 toXMLList( GUPI::WriteInfo &a_writeInfo, std::string const &a_indent = "" ) const ;
};
/*
============================================================
======================= OutputChannel ======================
============================================================
*/
class OutputChannel : public GUPI::Ancestry {
private:
bool m_twoBody; /**< true if the output channel is two-body and false otherwise. */
bool m_fissions; /**< true if the output channel is a fission channel and false otherwise. */
std::string m_process; /**< The GNDS *process* attribute for the channel. */
Component m_Q; /**< The GNDS <**Q**> node. */
Suite m_products; /**< The GNDS <**products**> node. */
FissionFragmentData m_fissionFragmentData; /**< The GNDS <**fissionFragmentData**> node. */
Construction::FissionResiduals m_fissionResiduals; /**< This member specifies what fission redisual products will be added to the list of products produced in a fission reaction. */
public:
OutputChannel( bool a_twoBody, bool a_fissions, std::string const &a_process );
OutputChannel( Construction::Settings const &a_construction, HAPI::Node const &a_node, SetupInfo &a_setupInfo, PoPI::Database const &a_pops,
PoPI::Database const &a_internalPoPs, Styles::Suite const *a_styles, bool a_isFission, bool a_addFissionResiduals );
~OutputChannel( );
bool twoBody( ) const { return( m_twoBody ); } /**< Returns the value of the *m_twoBody* member. */
std::string process( ) const { return( m_process ); } /**< Returns the value of the *m_process* member. */
int depth( ) const ;
Component &Q( ) { return( m_Q ); } /**< Returns a reference to the *m_Q* member. */
Component const &Q( ) const { return( m_Q ); } /**< Returns a reference to the *m_Q* member. */
Suite &products( ) { return( m_products ); } /**< Returns a reference to the *m_products* member. */
Suite const &products( ) const { return( m_products ); } /**< Returns a reference to the *m_products* member. */
FissionFragmentData &fissionFragmentData( ) { return( m_fissionFragmentData ); }
FissionFragmentData const &fissionFragmentData( ) const { return( m_fissionFragmentData ); }
Construction::FissionResiduals fissionResiduals( ) const { return( m_fissionResiduals ); } /**< Returns the value of the *m_fissionResiduals* member. */
void modifiedMultiGroupElasticForTNSL( std::map<std::string,std::size_t> const &a_maximumTNSL_MultiGroupIndex );
bool areAllProductsTracked( Transporting::Particles const &a_particles ) const ;
GUPI::Ancestry *findInAncestry3( std::string const &a_item );
GUPI::Ancestry const *findInAncestry3( std::string const &a_item ) const ;
bool isFission( ) const { return( m_fissions ); } /**< Returns true if the output channel is a fission output channel. */
bool hasFission( ) const ;
bool isDelayedFissionNeutronComplete( ) const ;
void productIDs( std::set<std::string> &a_ids, Transporting::Particles const &a_particles, bool a_transportablesOnly ) 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 ;
Vector multiGroupQ( LUPI::StatusMessageReporting &a_smr, Transporting::MG const &a_settings, Styles::TemperatureInfo const &a_temperatureInfo,
bool a_final ) const ;
Vector multiGroupMultiplicity( LUPI::StatusMessageReporting &a_smr, Transporting::MG const &a_settings, Styles::TemperatureInfo const &a_temperatureInfo,
std::string const &a_productID ) const ;
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 ;
Vector multiGroupAverageEnergy( LUPI::StatusMessageReporting &a_smr, Transporting::MG const &a_settings, Styles::TemperatureInfo const &a_temperatureInfo,
std::string const &a_productID ) const ;
Vector multiGroupAverageMomentum( LUPI::StatusMessageReporting &a_smr, Transporting::MG const &a_settings, Styles::TemperatureInfo const &a_temperatureInfo,
std::string const &a_productID ) const ;
void delayedNeutronProducts( DelayedNeutronProducts &a_delayedNeutronProducts ) const { m_fissionFragmentData.delayedNeutronProducts( a_delayedNeutronProducts ); }
void incompleteParticles( Transporting::Settings const &a_settings, std::set<std::string> &a_incompleteParticles ) 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 ;
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 ;
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 toXMLList( GUPI::WriteInfo &a_writeInfo, std::string const &a_indent = "" ) const ;
};
namespace DoubleDifferentialCrossSection {
namespace n_ThermalNeutronScatteringLaw {
/*
============================================================
==================== IncoherentInelastic ===================
============================================================
*/
class IncoherentInelastic : public Base {
private:
Options m_options; /**< Options for *this*. */
Suite m_scatteringAtoms; /**< The list of atoms and there information. */
S_alpha_beta m_S_alpha_beta; /**< The S(alpha,beta,T) function. */
public:
IncoherentInelastic( Construction::Settings const &a_construction, HAPI::Node const &a_node, SetupInfo &a_setupInfo, PoPI::Database const &a_pops, PoPI::Database const &a_internalPoPs, Suite *a_parent );
~IncoherentInelastic( );
Options &options( ) { return( m_options ); } /**< Returns the value of the *m_options* */
Suite &scatteringAtoms( ) { return( m_scatteringAtoms ); } /**< Returns the value of the *m_scatteringAtoms* */
S_alpha_beta const &s_alpha_beta( ) const { return( m_S_alpha_beta ); } /**< Returns the value of the *m_S_alpha_beta* */
};
} // End namespace n_ThermalNeutronScatteringLaw.
} // End namespace DoubleDifferentialCrossSection.
namespace ACE_URR {
/*
============================================================
====================== IncidentEnergy ======================
============================================================
*/
class IncidentEnergy: public Form {
private:
double m_value;
std::string m_unit;
Table::Table m_table;
public:
IncidentEnergy( Construction::Settings const &a_construction, HAPI::Node const &a_node, SetupInfo &a_setupInfo );
~IncidentEnergy( );
double value( ) const { return( m_value ); } /**< Returns the value of the *m_value* member. */
std::string const &unit( ) const { return( m_unit ); } /**< Returns a *const* reference to the *m_unit* member. */
Table::Table const &table( ) const { return( m_table ); } /**< Returns a *const* reference to the *m_table* member. */
void toXMLList( GUPI::WriteInfo &a_writeInfo, std::string const &a_indent ) const ;
};
/*
============================================================
===================== ProbabilityTable =====================
============================================================
*/
class ProbabilityTable : public Form {
public:
typedef std::vector<IncidentEnergy *> Forms; /**< The typedef the the *m_forms* member. */
private:
mutable Forms m_forms; /**< The list of nodes stored within *this*. */
public:
ProbabilityTable( Construction::Settings const &a_construction, HAPI::Node const &a_node, SetupInfo &a_setupInfo, Suite *a_parent );
~ProbabilityTable( );
Forms &forms( ) { return( m_forms ); } /**< Returns a *const* reference to the *m_forms* member. */
void toXMLList( GUPI::WriteInfo &a_writeInfo, std::string const &a_indent ) const ;
};
} // End namespace ACE_URR.
/*
============================================================
========================= Reaction =========================
============================================================
*/
class Reaction : public Form {
friend class ProtareSingle;
private:
mutable std::size_t m_reactionIndex; /**< The index of the reaction in the ProtareSingle. */
bool m_active; /**< If true, this reaction is used for calcualtion (e.g., its cross section is added to the total for its protare), otherwise, this reaction is ignored. */
int m_ENDF_MT; /**< The ENDF MT value for the reaction. */
int m_ENDL_C; /**< The ENDL C value for the reaction. */
int m_ENDL_S; /**< The ENDL S value for the reaction. */
std::string m_fissionGenre; /**< If the reaction is fission, this is its genre. */
double m_QThreshold; /**< Threshold value calculated from the Q and the protare's m_thresholdFactor. */
double m_crossSectionThreshold; /**< Threshold value derived from cross section data via *evaluated* or *griddedCrossSection*. */
double m_twoBodyThreshold; /**< This is the T_1 value needed by MCGIDI to do two-body kinematics (i.e., in the equation (K_{com,3_4} = m_2 * (K_1 - T_1) / (m_1 + m_2)). */
bool m_isPairProduction; /**< Kludge! Currently needed because GNDS specification unclear about how to specify photo-atomic pair production reaction. */
bool m_isPhotoAtomicIncoherentScattering; /**< **true** if the reaction is photo-atomic incoherent scattering and **false** otherwise. Helpful for MCGIDI. */
bool m_RutherfordScatteringPresent; /**> For charged particle elastic scattering, this member is *true* if Rutherford scattering is present and *false* otherwise. */
bool m_onlyRutherfordScatteringPresent; /**> For charged particle elastic scattering, this member is *true* if only Rutherford scattering is present and *false* otherwise. */
bool m_nuclearPlusInterferencePresent; /**> For charged particle elastic scattering, this member is *true* if nuclear plus interference is present and *false* otherwise. */
bool m_decayPositronium; /**< If **true**, whenever a positron is created, it is assumed to immediately form positronium and decay into 2 511 KeV photons. Ergo, the photons are produced in the reaction and not a positron. */
Component m_doubleDifferentialCrossSection; /**< The GNDS <**doubleDifferentialCrossSection**> node. */
Component m_crossSection; /**< The GNDS <**crossSection**> node. */
Component m_availableEnergy; /**< The GNDS <**availableEnergy**> node. */
Component m_availableMomentum; /**< The GNDS <**availableMomentum**> node. */
OutputChannel *m_outputChannel; /**< The reaction's output channel. */
void setReactionIndex( std::size_t a_reactionIndex ) const
{ m_reactionIndex = a_reactionIndex ; } /**< Sets *m_reactionIndex* to *a_reactionIndex*. */
public:
Reaction( int a_ENDF_MT, std::string const &a_fissionGenre );
Reaction( Construction::Settings const &a_construction, HAPI::Node const &a_node, SetupInfo &a_setupInfo, PoPI::Database const &a_pops, PoPI::Database const &a_internalPoPs, Protare const &a_protare,
Styles::Suite const *a_styles );
~Reaction( );
bool active( ) const { return( m_active ); } /**< Returns the value of the *m_active* member. */
void setActive( bool a_active ) { m_active = a_active; } /**< Sets *m_active* to *a_active*. */
std::size_t reactionIndex( ) const { return( m_reactionIndex ); } /**< Returns the value of the *m_reactionIndex* member. */
int depth( ) const { return( m_outputChannel->depth( ) ); } /**< Returns the maximum product depth for this reaction. */
int ENDF_MT( ) const { return( m_ENDF_MT ); } /**< Returns the value of the *m_ENDF_MT* member. */
int ENDL_C( ) const { return( m_ENDL_C ); } /**< Returns the value of the *m_ENDL_C* member. */
int ENDL_S( ) const { return( m_ENDL_S ); } /**< Returns the value of the *m_ENDL_S* member. */
std::string const &fissionGenre( ) const { return( m_fissionGenre ); }
bool isPairProduction( ) const { return( m_isPairProduction ); } /**< Returns the value of the *m_isPairProduction* member. */
bool isPhotoAtomicIncoherentScattering( ) const { return( m_isPhotoAtomicIncoherentScattering ); } /**< Returns the value of the *m_isPhotoAtomicIncoherentScattering* member. */
bool RutherfordScatteringPresent( ) const { return( m_RutherfordScatteringPresent ); }
/**< Returns the value of *m_RutherfordScatteringPresent* member. */
bool onlyRutherfordScatteringPresent( ) const { return( m_onlyRutherfordScatteringPresent ); }
/**< Returns the value of *m_onlyRutherfordScatteringPresent* member. */
bool nuclearPlusInterferencePresent( ) const { return( m_nuclearPlusInterferencePresent ); }
/**< Returns the value of *m_nuclearPlusInterferencePresent* member. */
Component &doubleDifferentialCrossSection( ) { return( m_doubleDifferentialCrossSection ); } /**< Returns a reference to the *m_doubleDifferentialCrossSection* member. */
Component const &doubleDifferentialCrossSection( ) const { return( m_doubleDifferentialCrossSection ); } /**< Returns a reference to the *m_doubleDifferentialCrossSection* member. */
Component &crossSection( ) { return( m_crossSection ); } /**< Returns a reference to the *m_crossSection* member. */
Component const &crossSection( ) const { return( m_crossSection ); } /**< Returns a reference to the *m_crossSection* member. */
Component &availableEnergy( ) { return( m_availableEnergy ); } /**< Returns a reference to the *m_availableEnergy* member. */
Component const &availableEnergy( ) const { return( m_availableEnergy ); } /**< Returns a reference to the *m_availableEnergy* member. */
Component &availableMomentum( ) { return( m_availableMomentum ); } /**< Returns a reference to the *m_availableMomentum* member. */
Component const &availableMomentum( ) const { return( m_availableMomentum ); } /**< Returns a reference to the *m_availableMomentum* member. */
OutputChannel *outputChannel( ) const { return( m_outputChannel ); } /**< Returns a reference to the *m_outputChannel* member. */
void setOutputChannel( OutputChannel *a_outputChannel );
void modifiedMultiGroupElasticForTNSL( std::map<std::string,std::size_t> const &a_maximumTNSL_MultiGroupIndex );
GUPI::Ancestry *findInAncestry3( std::string const &a_item );
GUPI::Ancestry const *findInAncestry3( std::string const &a_item ) const ;
std::string xlinkItemKey( ) const { return( GUPI::Ancestry::buildXLinkItemKey( GIDI_labelChars, label( ) ) ); } /**< Returns the result of calling "GUPI::Ancestry::buildXLinkItemKey( GIDI_labelChars, label() )". */
bool hasFission( ) const ;
void productIDs( std::set<std::string> &a_ids, Transporting::Particles const &a_particles, bool a_transportablesOnly ) const ;
int productMultiplicity( std::string const &a_productID ) const {
return( m_outputChannel->productMultiplicity( a_productID ) ); } /**< Returns the product multiplicity (e.g., 0, 1, 2, ...) or -1 if energy dependent or not an integer. */
int maximumLegendreOrder( LUPI::StatusMessageReporting &a_smr, Transporting::MG const &a_settings,
Styles::TemperatureInfo const &a_temperatureInfo, std::string const &a_productID ) const ;
double threshold( ) const { return( m_QThreshold ); } /**< Returns the value of the *m_QThreshold* member. */
double crossSectionThreshold( ) const { return( m_crossSectionThreshold ); } /**< Returns the value of the *m_crossSectionThreshold* member. */
double twoBodyThreshold( ) const { return( m_twoBodyThreshold ); } /**< Returns the value of the *m_twoBodyThreshold* member. */
bool areAllProductsTracked( Transporting::Particles const &a_particles ) const ;
Vector multiGroupCrossSection( LUPI::StatusMessageReporting &a_smr, Transporting::MG const &a_settings,
Styles::TemperatureInfo const &a_temperatureInfo, std::string const &a_label = "" ) const ;
Vector multiGroupQ( LUPI::StatusMessageReporting &a_smr, Transporting::MG const &a_settings, Styles::TemperatureInfo const &a_temperatureInfo,
bool a_final ) const ;
Vector multiGroupMultiplicity( LUPI::StatusMessageReporting &a_smr, Transporting::MG const &a_settings, Styles::TemperatureInfo const &a_temperatureInfo,
std::string const &a_productID ) const ;
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 ;
Matrix multiGroupFissionMatrix( LUPI::StatusMessageReporting &a_smr, Transporting::MG const &a_settings, Styles::TemperatureInfo const &a_temperatureInfo,
Transporting::Particles const &a_particles, std::size_t a_order ) const ;
Vector multiGroupAvailableEnergy( LUPI::StatusMessageReporting &a_smr, Transporting::MG const &a_settings, Styles::TemperatureInfo const &a_temperatureInfo )
const ;
Vector multiGroupAverageEnergy( LUPI::StatusMessageReporting &a_smr, Transporting::MG const &a_settings, Styles::TemperatureInfo const &a_temperatureInfo,
std::string const &a_productID ) const ;
Vector multiGroupDepositionEnergy( LUPI::StatusMessageReporting &a_smr, Transporting::MG const &a_settings, Styles::TemperatureInfo const &a_temperatureInfo,
Transporting::Particles const &a_particles ) const ;
Vector multiGroupAvailableMomentum( LUPI::StatusMessageReporting &a_smr, Transporting::MG const &a_settings, Styles::TemperatureInfo const &a_temperatureInfo )
const ;
Vector multiGroupAverageMomentum( LUPI::StatusMessageReporting &a_smr, Transporting::MG const &a_settings, Styles::TemperatureInfo const &a_temperatureInfo,
std::string const &a_productID ) const ;
Vector multiGroupDepositionMomentum( LUPI::StatusMessageReporting &a_smr, Transporting::MG const &a_settings, Styles::TemperatureInfo const &a_temperatureInfo,
Transporting::Particles const &a_particles ) const ;
Vector multiGroupGain( LUPI::StatusMessageReporting &a_smr, Transporting::MG const &a_settings, Styles::TemperatureInfo const &a_temperatureInfo,
std::string const &a_productID, std::string const &a_projectileID ) const ;
void delayedNeutronProducts( DelayedNeutronProducts &a_delayedNeutronProducts ) const ;
void incompleteParticles( Transporting::Settings const &a_settings, std::set<std::string> &a_incompleteParticles ) 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 ;
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 ;
bool modifyCrossSection( Functions::XYs1d const *a_offset, Functions::XYs1d const *a_slope, bool a_updateMultiGroup = false );
bool modifiedCrossSection( Functions::XYs1d const *a_offset, Functions::XYs1d const *a_slope );
void recalculateMultiGroupData( ProtareSingle const *a_protare, Styles::TemperatureInfo const &a_temperatureInfo );
void calculateMultiGroupData( ProtareSingle const *a_protare, Styles::TemperatureInfo const &a_temperatureInfo,
std::string const &a_heatedMultiGroupLabel, MultiGroupCalulationInformation const &a_multiGroupCalulationInformation );
void toXMLList( GUPI::WriteInfo &a_writeInfo, std::string const &a_indent = "" ) const ;
};
namespace Sums {
namespace Summand {
/*
============================================================
=========================== Base ===========================
============================================================
*/
class Base : public GUPI::Ancestry {
private:
std::string m_href; /**< xlink for the summand. */
public:
Base( Construction::Settings const &a_construction, HAPI::Node const &a_node, SetupInfo &a_setupInfo );
~Base( );
std::string const &href( ) const { return( m_href ); } /**< Returns the value of the *m_href* member. */
GUPI::Ancestry *findInAncestry3( LUPI_maybeUnused std::string const &a_item ) { return( nullptr ); }
GUPI::Ancestry const *findInAncestry3( LUPI_maybeUnused std::string const &a_item ) const { return( nullptr ); }
void toXMLList( GUPI::WriteInfo &a_writeInfo, std::string const &a_indent = "" ) const ;
};
/*
============================================================
=========================== Add ============================
============================================================
*/
class Add : public Base {
public:
Add( Construction::Settings const &a_construction, HAPI::Node const &a_node, SetupInfo &a_setupInfo );
};
} // End of namespace Summand.
/*
============================================================
========================= Summands =========================
============================================================
*/
class Summands : public Form {
private:
std::vector<Summand::Base *> m_summands; /**< List of summand for *this*. */
public:
Summands( Construction::Settings const &a_construction, HAPI::Node const &a_node, SetupInfo &a_setupInfo );
~Summands( );
std::size_t size( ) const { return( m_summands.size( ) ); } /**< Returns the number of summands in *this*. */
Summand::Base const *operator[]( std::size_t a_index ) const { return( m_summands[a_index] ); } /**< Returns the summand at index *a_index*. */
void toXMLList( GUPI::WriteInfo &a_writeInfo, std::string const &a_indent = "" ) const ;
};
/*
============================================================
=========================== Base ===========================
============================================================
*/
class Base : public Form {
private:
int m_ENDF_MT; /**< ENDF MT value for the sum. */
Summands m_summands; /**< List of Summands for *this*. */
public:
Base( Construction::Settings const &a_construction, HAPI::Node const &a_node, SetupInfo &a_setupInfo, PoPI::Database const &a_pops, PoPI::Database const &a_internalPoPs,
FormType a_type );
int ENDF_MT( ) const { return( m_ENDF_MT ); } /**< Returns the value of the *m_ENDF_MT* member. */
Summands const &summands( ) const { return( m_summands ); } /**< Returns the value of the *m_summands* member. */
};
/*
============================================================
====================== CrossSectionSum =====================
============================================================
*/
class CrossSectionSum : public Base {
private:
Component m_Q; /**< The GNDS <**Q**> node. */
Component m_crossSection; /**< The GNDS <**crossSection**> node. */
public:
CrossSectionSum( Construction::Settings const &a_construction, HAPI::Node const &a_node, SetupInfo &a_setupInfo, PoPI::Database const &a_pops, PoPI::Database const &a_internalPoPs );
GUPI::Ancestry *findInAncestry3( std::string const &a_item );
GUPI::Ancestry const *findInAncestry3( std::string const &a_item ) const ;
Component &Q( ) { return( m_Q ); } /**< Returns a reference to the *m_Q* member. */
Component &crossSection( ) { return( m_crossSection ); } /**< Returns a reference to the *m_crossSection* member. */
void toXMLList( GUPI::WriteInfo &a_writeInfo, std::string const &a_indent = "" ) const ;
};
/*
============================================================
====================== MultiplicitySum =====================
============================================================
*/
class MultiplicitySum : public Base {
private:
Suite m_multiplicity; /**< The GNDS <**multiplicity**> node. */
public:
MultiplicitySum( Construction::Settings const &a_construction, HAPI::Node const &a_node, SetupInfo &a_setupInfo, PoPI::Database const &a_pops, PoPI::Database const &a_internalPoPs );
Suite &multiplicity( ) { return( m_multiplicity ); } /**< Returns a reference to the *m_multiplicity* member. */
void toXMLList( GUPI::WriteInfo &a_writeInfo, std::string const &a_indent = "" ) const ;
};
/*
============================================================
=========================== Sums ===========================
============================================================
*/
class Sums : public GUPI::Ancestry {
private:
Suite m_crossSectionSums; /**< The GNDS <**crossSectionSums**> node. */
Suite m_multiplicitySums; /**< The GNDS <**multiplicitySums**> node. */
public:
Sums( );
~Sums( );
Suite &crossSectionSums( ) { return( m_crossSectionSums ); } /**< Returns the value of the *m_crossSectionSums* member. */
Suite const &crossSectionSums( ) const { return( m_crossSectionSums ); } /**< Returns the value of the *m_crossSectionSums* member. */
Suite &multiplicitySums( ) { return( m_multiplicitySums ); } /**< Returns the value of the *m_multiplicitySums* member. */
Suite const &multiplicitySums( ) const { return( m_multiplicitySums ); } /**< Returns the value of the *m_multiplicitySums* member. */
void parse( Construction::Settings const &a_construction, HAPI::Node const &a_node, SetupInfo &a_setupInfo, PoPI::Database const &a_pops, PoPI::Database const &a_internalPoPs );
GUPI::Ancestry *findInAncestry3( std::string const &a_item );
GUPI::Ancestry const *findInAncestry3( std::string const &a_item ) const ;
void toXMLList( GUPI::WriteInfo &a_writeInfo, std::string const &a_indent = "" ) const ;
};
} // End of namespace Sums.
/*
============================================================
========================== Protare =========================
============================================================
*/
class Protare : public GUPI::Ancestry {
private:
ParticleInfo m_projectile; /**< Information about the projectile. */
ParticleInfo m_target; /**< Information about the target. */
ParticleInfo m_GNDS_target; /**< Information about the target as specified in the GNDS file. For example, for requested target 'H1' for a photo-atomic GNDS file, the GNDS target will be 'H'. */
protected:
void initialize( HAPI::Node const &a_node, SetupInfo &a_setupInfo, PoPI::Database const &a_pops, PoPI::Database const &a_internalPoPs, bool a_targetRequiredInGlobalPoPs,
bool a_requiredInPoPs = true );
public:
Protare( );
~Protare( );
ParticleInfo const &projectile( ) const { return( m_projectile ); } /**< Returns the value of the *m_projectile* member. */
void setProjectile( ParticleInfo const &a_projectile ) { m_projectile = a_projectile; } /**< Sets *m_projectile* to *a_projectile*. */
ParticleInfo const &target( ) const { return( m_target ); } /**< Returns the value of the *m_target* member. */
void setTarget( ParticleInfo const &a_target ) {
m_target = a_target;
if( m_GNDS_target.ID( ) == "" ) m_GNDS_target = a_target; } /**< Sets *m_target* to *a_target* and m_GNDS_target if it is an empty string. */
ParticleInfo const &GNDS_target( ) const { return( m_GNDS_target ); } /**< Returns the value of the *m_GNDS_target* member. */
virtual ProtareType protareType( ) const = 0; /**< Returns the type of the protare. */
virtual bool isTNSL_ProtareSingle( ) const { return( false ); } /**< Returns *true* if the instance is a ProtareSingle instance with only TNSL data and *false* otherwise. */
virtual std::size_t numberOfProtares( ) const = 0; /**< Returns the number of protares contained in *this*. */
virtual ProtareSingle *protare( std::size_t a_index ) = 0; /**< Returns the *a_index* - 1 Protare contained in *this*. */
virtual ProtareSingle const *protare( std::size_t a_index ) const = 0; /**< Returns the *a_index* - 1 Protare contained in *this*. */
virtual LUPI::FormatVersion const &formatVersion( std::size_t a_index = 0 ) const = 0;
virtual std::string const &fileName( std::size_t a_index = 0 ) const = 0;
virtual std::string const &realFileName( std::size_t a_index = 0 ) const = 0;
virtual std::vector<std::string> libraries( std::size_t a_index = 0 ) const = 0;
virtual std::string const &evaluation( std::size_t a_index = 0 ) const = 0;
virtual Frame projectileFrame( std::size_t a_index = 0 ) const = 0;
virtual int numberOfLazyParsingHelperForms( ) const = 0;
virtual int numberOfLazyParsingHelperFormsReplaced( ) const = 0;
virtual double thresholdFactor( ) const = 0;
virtual Documentation_1_10::Suite &documentations( ) = 0;
virtual Styles::Base &style( std::string const &a_label ) = 0;
virtual Styles::Suite &styles( ) = 0;
virtual Styles::Suite const &styles( ) const = 0;
virtual int intid( std::string const &a_id ) const = 0;
virtual void productIDs( std::set<std::string> &a_ids, Transporting::Particles const &a_particles, bool a_transportablesOnly ) const = 0;
virtual int maximumLegendreOrder( LUPI::StatusMessageReporting &a_smr, Transporting::MG const &a_settings,
Styles::TemperatureInfo const &a_temperatureInfo, std::string const &a_productID ) const = 0;
virtual Styles::TemperatureInfos temperatures( ) const = 0;
virtual std::size_t numberOfReactions( ) const = 0;
virtual Reaction *reaction( std::size_t a_index ) = 0;
virtual Reaction const *reaction( std::size_t a_index ) const = 0;
virtual Reaction const *reaction( std::size_t a_index, Transporting::MG const &a_settings,
ExcludeReactionsSet const &a_reactionsToExclude = ExcludeReactionsSet {} ) const = 0;
virtual std::size_t numberOfOrphanProducts( ) const = 0;
virtual Reaction *orphanProduct( std::size_t a_index ) = 0;
virtual Reaction const *orphanProduct( std::size_t a_index ) const = 0;
virtual void updateReactionIndices( std::size_t a_offset ) const = 0;
virtual bool hasFission( ) const = 0;
virtual bool isDelayedFissionNeutronComplete( ) const = 0;
virtual GUPI::Ancestry *findInAncestry3( std::string const &a_item ) = 0;
virtual GUPI::Ancestry const *findInAncestry3( std::string const &a_item ) const = 0;
virtual std::vector<double> groupBoundaries( Transporting::MG const &a_settings, Styles::TemperatureInfo const &a_temperatureInfo,
std::string const &a_productID ) const = 0;
virtual Vector multiGroupInverseSpeed( LUPI::StatusMessageReporting &a_smr, Transporting::MG const &a_settings,
Styles::TemperatureInfo const &a_temperatureInfo ) const = 0;
virtual Vector multiGroupCrossSection( LUPI::StatusMessageReporting &a_smr, Transporting::MG const &a_settings,
Styles::TemperatureInfo const &a_temperatureInfo, ExcludeReactionsSet const &a_reactionsToExclude = ExcludeReactionsSet {},
std::string const &a_label = "" ) const = 0;
virtual Vector multiGroupQ( LUPI::StatusMessageReporting &a_smr, Transporting::MG const &a_settings,
Styles::TemperatureInfo const &a_temperatureInfo, bool a_final, bool a_effectivePhotoAtomic = true,
ExcludeReactionsSet const &a_reactionsToExclude = ExcludeReactionsSet {} ) const = 0;
virtual Vector multiGroupMultiplicity( LUPI::StatusMessageReporting &a_smr, Transporting::MG const &a_settings,
Styles::TemperatureInfo const &a_temperatureInfo, std::string const &a_productID,
ExcludeReactionsSet const &a_reactionsToExclude = ExcludeReactionsSet {} ) const = 0;
virtual Vector multiGroupFissionNeutronMultiplicity( LUPI::StatusMessageReporting &a_smr, Transporting::MG const &a_settings,
Styles::TemperatureInfo const &a_temperatureInfo,
ExcludeReactionsSet const &a_reactionsToExclude = ExcludeReactionsSet {} ) const = 0;
virtual Vector multiGroupFissionGammaMultiplicity( LUPI::StatusMessageReporting &a_smr, Transporting::MG const &a_settings,
Styles::TemperatureInfo const &a_temperatureInfo, ExcludeReactionsSet const &a_reactionsToExclude = ExcludeReactionsSet {} ) const = 0;
virtual 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, ExcludeReactionsSet const &a_reactionsToExclude = ExcludeReactionsSet {} ) const = 0;
virtual Matrix multiGroupFissionMatrix( LUPI::StatusMessageReporting &a_smr, Transporting::MG const &a_settings,
Styles::TemperatureInfo const &a_temperatureInfo, Transporting::Particles const &a_particles, std::size_t a_order,
ExcludeReactionsSet const &a_reactionsToExclude = ExcludeReactionsSet {} ) const = 0;
virtual Vector multiGroupTransportCorrection( LUPI::StatusMessageReporting &a_smr, Transporting::MG const &a_settings,
Styles::TemperatureInfo const &a_temperatureInfo, Transporting::Particles const &a_particles, std::size_t a_order,
TransportCorrectionType a_transportCorrectionType, double a_temperature,
ExcludeReactionsSet const &a_reactionsToExclude = ExcludeReactionsSet {} ) const = 0;
virtual Vector multiGroupAvailableEnergy( LUPI::StatusMessageReporting &a_smr, Transporting::MG const &a_settings,
Styles::TemperatureInfo const &a_temperatureInfo, ExcludeReactionsSet const &a_reactionsToExclude = ExcludeReactionsSet {} ) const = 0;
virtual Vector multiGroupAverageEnergy( LUPI::StatusMessageReporting &a_smr, Transporting::MG const &a_settings,
Styles::TemperatureInfo const &a_temperatureInfo, std::string const &a_productID,
ExcludeReactionsSet const &a_reactionsToExclude = ExcludeReactionsSet {} ) const = 0;
virtual Vector multiGroupDepositionEnergy( LUPI::StatusMessageReporting &a_smr, Transporting::MG const &a_settings,
Styles::TemperatureInfo const &a_temperatureInfo, Transporting::Particles const &a_particles,
ExcludeReactionsSet const &a_reactionsToExclude = ExcludeReactionsSet {} ) const = 0;
virtual Vector multiGroupAvailableMomentum( LUPI::StatusMessageReporting &a_smr, Transporting::MG const &a_settings,
Styles::TemperatureInfo const &a_temperatureInfo, ExcludeReactionsSet const &a_reactionsToExclude = ExcludeReactionsSet {} ) const = 0;
virtual Vector multiGroupAverageMomentum( LUPI::StatusMessageReporting &a_smr, Transporting::MG const &a_settings,
Styles::TemperatureInfo const &a_temperatureInfo, std::string const &a_productID,
ExcludeReactionsSet const &a_reactionsToExclude = ExcludeReactionsSet {} ) const = 0;
virtual Vector multiGroupDepositionMomentum( LUPI::StatusMessageReporting &a_smr, Transporting::MG const &a_settings,
Styles::TemperatureInfo const &a_temperatureInfo, Transporting::Particles const &a_particles,
ExcludeReactionsSet const &a_reactionsToExclude = ExcludeReactionsSet {} ) const = 0;
virtual Vector multiGroupGain( LUPI::StatusMessageReporting &a_smr, Transporting::MG const &a_settings,
Styles::TemperatureInfo const &a_temperatureInfo, std::string const &a_productID,
ExcludeReactionsSet const &a_reactionsToExclude = ExcludeReactionsSet {} ) const = 0;
virtual void TNSL_crossSectionSumCorrection( std::string const &a_label, Functions::XYs1d &a_crossSectionSum );
virtual void TNSL_crossSectionSumCorrection( std::string const &a_label, Functions::Ys1d &a_crossSectionSum );
virtual void TNSL_crossSectionSumCorrection( std::string const &a_label, Vector &a_crossSectionSum );
virtual stringAndDoublePairs muCutoffForCoulombPlusNuclearElastic( ) const = 0;
virtual DelayedNeutronProducts delayedNeutronProducts( ) const = 0;
virtual void incompleteParticles( Transporting::Settings const &a_settings, std::set<std::string> &a_incompleteParticles ) const = 0;
ExcludeReactionsSet reactionIndicesMatchingENDLCValues( std::set<int> const &a_CValues, bool a_checkActiveState = true );
};
/*
============================================================
====================== ProtareSingle =======================
============================================================
*/
class ProtareSingle : public Protare {
private:
HAPI::File *m_doc; /**< If data read from file, this member is a pointer to the opened **HAPI::File** instance. */
HAPI::DataManager *m_dataManager; /**< If data read from hybrid file, this member is a pointer to the **HAPI::DataManager** instance. */
int m_numberOfLazyParsingHelperForms; /**< This counts the number of LazyParsingHelperForms instantiated. */
int m_numberOfLazyParsingHelperFormsReplaced; /**< This counts the number of LazyParsingHelperForms replaced with the appropriate form. */
LUPI::FormatVersion m_formatVersion; /**< Store the GNDS format version. */
TargetInfo::TargetInfo m_targetInfo; /**< Information about the target. Currently, the isotopic data for TNSL GNDS 2.1 files as stored in the evaluaed style. */
PoPI::Database m_internalPoPs; /**< The *PoPs* specified under the protare (e.g., reactionSuite) node. */
std::vector<std::string> m_libraries; /**< The list of libraries *this* was found in. */
std::string m_evaluation; /**< The protare's evaluation string. */
std::string m_interaction; /**< The protare's interaction string. */
std::string m_fileName; /**< The path to the protare's file. May be relative. */
std::string m_realFileName; /**< The real path to the protare's file. Equivalent to the value returned by the C-function *realpath( m_fileName )* on Unix systems. */
Frame m_projectileFrame; /**< The frame the projectile data are given in. */
double m_projectileEnergyMin; /**< The projectile's minimum energy for which data are complete as specified in the evaluated style. */
double m_projectileEnergyMax; /**< The projectile's maximum energy for which data are complete as specified in the evaluated style. */
bool m_isTNSL_ProtareSingle; /**< If *this* is a ProtareSingle instance with TNSL data *true* and otherwise *false*. */
bool m_isPhotoAtomic; /**< true if photo-atomic protare and false otherwise. */
bool m_decayPositronium; /**< If **true**, whenever a positron is created, it is assumed to immediately form positronium and decay into 2 511 KeV photons. Ergo, the photons are produced in the reaction and not a positron. */
double m_thresholdFactor; /**< The non-relativistic factor that converts a Q-value into a threshold. */
PoPI::NuclideGammaBranchStateInfos m_nuclideGammaBranchStateInfos; /**< Simplified list of gamma branching data from nuclide level decays derived from the internal PoPI::Database. */
ExternalFiles::Suite m_externalFiles; /**< The GNDS <**externalFiles**> node. */
Styles::Suite m_styles; /**< The GNDS <**styles**> node. */
Documentation_1_10::Suite m_documentations; /**< The GNDS <**documentations**> node. */
Suite m_reactions; /**< The GNDS <**reactions**> node. */
Suite m_orphanProducts; /**< The GNDS <**orphanProducts**> node. */
Suite m_incompleteReactions; /**< The GNDS <**incompleteReactions**> node. */
Sums::Sums m_sums; /**< The GNDS <**sums**> node. */
Suite m_fissionComponents; /**< The GNDS <**fissionComponents**> node. */
bool m_RutherfordScatteringPresent; /**> For charged particle elastic scattering, this member is *true* if Rutherford scattering is present and *false* otherwise. */
bool m_onlyRutherfordScatteringPresent; /**> For charged particle elastic scattering, this member is *true* if only Rutherford scattering is present and *false* otherwise. */
// The following are non-GNDS 2.0 data types that are stored in the applicationData node.
Reaction *m_nuclearPlusCoulombInterferenceOnlyReaction; /**< The nuclear + interference (ENDL C=9) reaction in the applicationData node. */
Reaction *m_multiGroupSummedReaction; /**< This reaction contains the sum multi-group data from all other reactions. */
OutputChannel *m_multiGroupSummedDelayedNeutrons; /**< This reaction contains the sum multi-group data from delayed neutrons. */
Suite m_ACE_URR_probabilityTables; /**< This suite stores ACE style URR probability tables. */
Suite m_photoAtomicIncoherentDoppler; /**< This suite stores the data for the impulse approximation photon doppler broadening reaction (MT 1534-1572) */
Component m_pointwiseAverageProductEnergy; /**< This suite stores upscatter model B pointwise energy deposition data for the outgoing neutron. */
GRIN::GRIN_continuumGammas *m_GRIN_continuumGammas; /**< This stores continuum gamma information from the GRIN project. */
void initialize( );
void initialize( Construction::Settings const &a_construction, HAPI::Node const &a_node, SetupInfo &a_setupInfo, PoPI::Database const &a_pops,
bool a_targetRequiredInGlobalPoPs, bool a_requiredInPoPs = true );
bool useMultiGroupSummedData( Transporting::MG const &a_settings, ExcludeReactionsSet const &a_reactionsToExclude ) const ;
bool useMultiGroupSummedDelayedNeutronsData( Transporting::MG const &a_settings ) const ;
public:
ProtareSingle( PoPI::Database const &a_pops, std::string const &a_projectileID, std::string const &a_targetID, std::string const &a_evaluation,
std::string const &a_interaction, std::string const &a_formatVersion = GNDS_formatVersion_1_10Chars );
ProtareSingle( Construction::Settings const &a_construction, std::string const &a_fileName, FileType a_fileType, PoPI::Database const &a_pops,
ParticleSubstitution const &a_particleSubstitution, std::vector<std::string> const &a_libraries, std::string const &a_interaction,
bool a_targetRequiredInGlobalPoPs = true, bool a_requiredInPoPs = true );
ProtareSingle( Construction::Settings const &a_construction, HAPI::Node const &a_protare, PoPI::Database const &a_pops,
ParticleSubstitution const &a_particleSubstitution, std::vector<std::string> const &a_libraries, std::string const &a_interaction,
bool a_targetRequiredInGlobalPoPs = true, bool a_requiredInPoPs = true );
~ProtareSingle( );
PoPI::NuclideGammaBranchStateInfos const &nuclideGammaBranchStateInfos( ) const { return( m_nuclideGammaBranchStateInfos ); }
/**< Returns the value of the *m_nuclideGammaBranchStateInfos* member. */
HAPI::DataManager *dataManager( ) { return( m_dataManager ); } /**< Returns the value of the *m_dataManager* member. */
void setDataManager( HAPI::DataManager *a_dataManager ) { m_dataManager = a_dataManager; }
/**< Sets the member *m_dataManager* to *a_dataManager*. */
void incrementNumberOfLazyParsingHelperForms( ) { ++m_numberOfLazyParsingHelperForms; }
/**> Increments the *m_numberOfLazyParsingHelperForms* member of this by 1. */
void incrementNumberOfLazyParsingHelperFormsReplaced( ) { ++m_numberOfLazyParsingHelperFormsReplaced; }
/**> Increments the *m_numberOfLazyParsingHelperFormsReplaced* member of this by 1. */
TargetInfo::TargetInfo const &targetInfo( ) const { return( m_targetInfo ); } /**< Returns a const reference to the *m_targetInfo* member. */
double projectileEnergyMin( ) const { return( m_projectileEnergyMin ); }
double projectileEnergyMax( ) const { return( m_projectileEnergyMax ); }
bool isTNSL_ProtareSingle( ) const { return( m_isTNSL_ProtareSingle ); } /**< Returns *true* if the instance is a ProtareSingle instance with only TNSL data and *false* otherwise. */
bool isPhotoAtomic( ) const { return( m_isPhotoAtomic ); } /**< Returns the value of the *m_isPhotoAtomic* member. */
Suite &reactions( ) { return( m_reactions ); } /**< Returns a reference to the *m_reactions* member. */
Suite const &reactions( ) const { return( m_reactions ); } /**< Returns a *const* reference to the *m_reactions* member. */
Suite &orphanProducts( ) { return( m_orphanProducts ); } /**< Returns a reference to the *m_orphanProducts* member. */
Suite const &orphanProducts( ) const { return( m_orphanProducts ); } /**< Returns a *const* reference to the *m_orphanProducts* member. */
Suite &incompleteReactions( ) { return( m_incompleteReactions ); } /**< Returns a reference to the *m_incompleteReactions* member. */
Suite const &incompleteReactions( ) const { return( m_incompleteReactions ); } /**< Returns a *const* reference to the *m_incompleteReactions* member. */
Sums::Sums &sums( ) { return( m_sums ); } /**< Returns a reference to the *m_sums* member. */
Sums::Sums const &sums( ) const { return( m_sums ); } /**< Returns a reference to the *m_sums* member. */
Suite &fissionComponents( ) { return( m_fissionComponents ); } /**< Returns a reference to the *m_fissionComponents* member. */
bool RutherfordScatteringPresent( ) const { return( m_RutherfordScatteringPresent ); }
/**< Returns the value of *m_RutherfordScatteringPresent*. */
bool onlyRutherfordScatteringPresent( ) const { return( m_onlyRutherfordScatteringPresent ); }
/**< Returns the value of *m_onlyRutherfordScatteringPresent*. */
Reaction const *nuclearPlusCoulombInterferenceOnlyReaction( ) const { return( m_nuclearPlusCoulombInterferenceOnlyReaction ); }
/**< Returns the *m_nuclearPlusCoulombInterferenceOnlyReaction* member which is a pointer. */
Reaction const *checkIf_nuclearPlusCoulombInterferenceWanted( Transporting::MG const &a_settings, Reaction const *a_reaction ) const ;
Reaction const *reactionToMultiGroup( Transporting::MG const &a_settings, std::size_t a_index,
ExcludeReactionsSet const &a_reactionsToExclude ) const ;
Reaction const *multiGroupSummedReaction( ) const { return( m_multiGroupSummedReaction ); } /**< Returns the *m_multiGroupSummedReaction* member which is a pointer. */
OutputChannel const *multiGroupSummedDelayedNeutrons( ) const { return( m_multiGroupSummedDelayedNeutrons ); } /**< Returns the *m_multiGroupSummedReaction* member which is a pointer. */
Suite const &ACE_URR_probabilityTables( ) const { return( m_ACE_URR_probabilityTables ); } /**< Returns a *const* reference to the *m_ACE_URR_probabilityTables* member. */
Suite const &photoAtomicIncoherentDoppler( ) const { return( m_photoAtomicIncoherentDoppler ); }
GRIN::GRIN_continuumGammas const *GRIN_continuumGammas2( ) const { return( m_GRIN_continuumGammas ); } /**< Returns a *const* pointer to the *m_GRIN_continuumGammas* member. */
// The rest are virtual methods defined in the Protare class.
ProtareType protareType( ) const { return( ProtareType::single ); } /**< Returns the type of the protare. */
std::size_t numberOfProtares( ) const { return( 1 ); } /**< Returns 1. */
ProtareSingle *protare( std::size_t a_index );
ProtareSingle const *protare( std::size_t a_index ) const ;
LUPI::FormatVersion const &formatVersion( LUPI_maybeUnused std::size_t a_index = 0 ) const { return( m_formatVersion ); } /**< Returns the value of the *m_formatVersion* member. */
std::string const &fileName( LUPI_maybeUnused std::size_t a_index = 0 ) const { return( m_fileName ); } /**< Returns the value of the *m_fileName* member. */
std::string const &realFileName( LUPI_maybeUnused std::size_t a_index = 0 ) const { return( m_realFileName ); } /**< Returns the value of the *m_realFileName* member. */
std::vector<std::string> libraries( LUPI_maybeUnused std::size_t a_index = 0 ) const { return( m_libraries ); } /**< Returns the libraries that *this* resided in. */
std::string const &evaluation( LUPI_maybeUnused std::size_t a_index = 0 ) const { return( m_evaluation ); } /**< Returns the value of the *m_evaluation* member. */
std::string const &interaction( LUPI_maybeUnused std::size_t a_index = 0 ) const { return( m_interaction ); } /**< Returns the value of the *m_interaction* member. */
Frame projectileFrame( LUPI_maybeUnused std::size_t a_index = 0 ) const { return( m_projectileFrame ); } /**< Returns the value of the *m_projectileFrame* member. */
int numberOfLazyParsingHelperForms( ) const { return( m_numberOfLazyParsingHelperForms ); }
/**< Returns the value of the *m_numberOfLazyParsingHelperForms* member. */
int numberOfLazyParsingHelperFormsReplaced( ) const { return( m_numberOfLazyParsingHelperFormsReplaced ); }
/**< Returns the value of the *m_numberOfLazyParsingHelperFormsReplaced* member. */
double thresholdFactor( ) const { return( m_thresholdFactor ); } /**< Returns the value of the *m_thresholdFactor* member. */
Documentation_1_10::Suite &documentations( ) { return( m_documentations ); } /**< Returns the value of the *m_documentations* member. */
ExternalFile const &externalFile( std::string const a_label ) const { return( *m_externalFiles.get<ExternalFile>( a_label ) ); } /**< Returns the external file with label *a_label*. */
ExternalFiles::Suite const &externalFiles( ) const { return( m_externalFiles ); } /**< Returns the value of the *m_externalFiles* member. */
Styles::Base &style( std::string const &a_label ) { return( *m_styles.get<Styles::Base>( a_label ) ); } /**< Returns the style with label *a_label*. */
Styles::Base const &style( std::string const &a_label ) const { return( *m_styles.get<Styles::Base const>( a_label ) ); } /**< Returns the const style with label *a_label*. */
Styles::Suite &styles( ) { return( m_styles ); } /**< Returns the value of the *m_styles* member. */
Styles::Suite const &styles( ) const { return( m_styles ); } /**< Returns a *const* reference to the *m_styles* member. */
PoPI::Database const &internalPoPs( ) const { return( m_internalPoPs ); } /**< Returns a *const* reference to the *m_internalPoPs* member. */
PoPI::Database &internalPoPs( ) { return( m_internalPoPs ); } /**< Returns a reference to the *m_internalPoPs* member. */
int intid( std::string const &a_id ) const;
void productIDs( std::set<std::string> &a_ids, Transporting::Particles const &a_particles, bool a_transportablesOnly ) const ;
int maximumLegendreOrder( LUPI::StatusMessageReporting &a_smr, Transporting::MG const &a_settings,
Styles::TemperatureInfo const &a_temperatureInfo, std::string const &a_productID ) const ;
Styles::TemperatureInfos temperatures( ) const ;
std::size_t numberOfReactions( ) const { return( m_reactions.size( ) ); } /**< Returns the number of reactions in the **Protare**. */
Reaction *reaction( std::size_t a_index ) { return( m_reactions.get<Reaction>( a_index ) ); } /**< Returns the *a_index* - 1 reaction. */
Reaction const *reaction( std::size_t a_index ) const { return( m_reactions.get<Reaction>( a_index ) ); } /**< Returns the *a_index* - 1 reaction. */
Reaction const *reaction( std::size_t a_index, Transporting::MG const &a_settings,
ExcludeReactionsSet const &a_reactionsToExclude = ExcludeReactionsSet {} ) const;
std::size_t numberOfInactiveReactions( ) const ;
std::size_t numberOfOrphanProducts( ) const { return( m_orphanProducts.size( ) ); } /**< Returns the number of orphan product reactions in the **Protare**. */
Reaction *orphanProduct( std::size_t a_index ) { return( m_orphanProducts.get<Reaction>( a_index ) ); } /**< Returns the *a_index* - 1 orphan product reaction. */
Reaction const *orphanProduct( std::size_t a_index ) const { return( m_orphanProducts.get<Reaction>( a_index ) ); } /**< Returns the *a_index* - 1 orphan product reaction. */
std::size_t numberOfIncompleteReactions( ) const { return( m_incompleteReactions.size( ) ); } /**< Returns the number of incomplete reactions in the **Protare**. */
Reaction *incompleteReaction( std::size_t a_index ) { return( m_incompleteReactions.get<Reaction>( a_index ) ); } /**< Returns the *a_index* - 1 reaction. */
Reaction const *incompleteReaction( std::size_t a_index ) const { return( m_incompleteReactions.get<Reaction>( a_index ) ); } /**< Returns the *a_index* - 1 reaction. */
void updateReactionIndices( std::size_t a_offset ) const;
bool hasFission( ) const ;
bool isDelayedFissionNeutronComplete( ) const ;
GUPI::Ancestry *findInAncestry3( std::string const &a_item );
GUPI::Ancestry const *findInAncestry3( std::string const &a_item ) const ;
std::vector<double> groupBoundaries( Transporting::MG const &a_settings, Styles::TemperatureInfo const &a_temperatureInfo,
std::string const &a_productID ) const ;
Vector multiGroupInverseSpeed( LUPI::StatusMessageReporting &a_smr, Transporting::MG const &a_settings,
Styles::TemperatureInfo const &a_temperatureInfo ) const ;
Vector multiGroupCrossSection( LUPI::StatusMessageReporting &a_smr, Transporting::MG const &a_settings,
Styles::TemperatureInfo const &a_temperatureInfo, ExcludeReactionsSet const &a_reactionsToExclude = ExcludeReactionsSet {},
std::string const &a_label = "" ) const ;
Vector multiGroupQ( LUPI::StatusMessageReporting &a_smr, Transporting::MG const &a_settings,
Styles::TemperatureInfo const &a_temperatureInfo, bool a_final, bool a_effectivePhotoAtomic = true,
ExcludeReactionsSet const &a_reactionsToExclude = ExcludeReactionsSet {} ) const ;
Vector multiGroupMultiplicity( LUPI::StatusMessageReporting &a_smr, Transporting::MG const &a_settings,
Styles::TemperatureInfo const &a_temperatureInfo, std::string const &a_productID,
ExcludeReactionsSet const &a_reactionsToExclude = ExcludeReactionsSet {} ) const ;
Vector multiGroupFissionNeutronMultiplicity( LUPI::StatusMessageReporting &a_smr, Transporting::MG const &a_settings,
Styles::TemperatureInfo const &a_temperatureInfo, ExcludeReactionsSet const &a_reactionsToExclude = ExcludeReactionsSet {} ) const ;
Vector multiGroupFissionGammaMultiplicity( LUPI::StatusMessageReporting &a_smr, Transporting::MG const &a_settings,
Styles::TemperatureInfo const &a_temperatureInfo, ExcludeReactionsSet const &a_reactionsToExclude = ExcludeReactionsSet {} ) const ;
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, ExcludeReactionsSet const &a_reactionsToExclude = ExcludeReactionsSet {} ) const ;
Matrix multiGroupFissionMatrix( LUPI::StatusMessageReporting &a_smr, Transporting::MG const &a_settings,
Styles::TemperatureInfo const &a_temperatureInfo, Transporting::Particles const &a_particles, std::size_t a_order,
ExcludeReactionsSet const &a_reactionsToExclude = ExcludeReactionsSet {} ) const ;
Vector multiGroupTransportCorrection( LUPI::StatusMessageReporting &a_smr, Transporting::MG const &a_settings,
Styles::TemperatureInfo const &a_temperatureInfo, Transporting::Particles const &a_particles, std::size_t a_order,
TransportCorrectionType a_transportCorrectionType, double a_temperature,
ExcludeReactionsSet const &a_reactionsToExclude = ExcludeReactionsSet {} ) const ;
Vector multiGroupAvailableEnergy( LUPI::StatusMessageReporting &a_smr, Transporting::MG const &a_settings,
Styles::TemperatureInfo const &a_temperatureInfo, ExcludeReactionsSet const &a_reactionsToExclude = ExcludeReactionsSet {} ) const ;
Vector multiGroupAverageEnergy( LUPI::StatusMessageReporting &a_smr, Transporting::MG const &a_settings,
Styles::TemperatureInfo const &a_temperatureInfo, std::string const &a_productID,
ExcludeReactionsSet const &a_reactionsToExclude = ExcludeReactionsSet {} ) const ;
Vector multiGroupDepositionEnergy( LUPI::StatusMessageReporting &a_smr, Transporting::MG const &a_settings,
Styles::TemperatureInfo const &a_temperatureInfo, Transporting::Particles const &a_particles,
ExcludeReactionsSet const &a_reactionsToExclude = ExcludeReactionsSet {} ) const ;
Vector multiGroupAvailableMomentum( LUPI::StatusMessageReporting &a_smr, Transporting::MG const &a_settings,
Styles::TemperatureInfo const &a_temperatureInfo, ExcludeReactionsSet const &a_reactionsToExclude = ExcludeReactionsSet {} ) const ;
Vector multiGroupAverageMomentum( LUPI::StatusMessageReporting &a_smr, Transporting::MG const &a_settings,
Styles::TemperatureInfo const &a_temperatureInfo, std::string const &a_productID,
ExcludeReactionsSet const &a_reactionsToExclude = ExcludeReactionsSet {} ) const ;
Vector multiGroupDepositionMomentum( LUPI::StatusMessageReporting &a_smr, Transporting::MG const &a_settings,
Styles::TemperatureInfo const &a_temperatureInfo, Transporting::Particles const &a_particles,
ExcludeReactionsSet const &a_reactionsToExclude = ExcludeReactionsSet {} ) const ;
Vector multiGroupGain( LUPI::StatusMessageReporting &a_smr, Transporting::MG const &a_settings,
Styles::TemperatureInfo const &a_temperatureInfo, std::string const &a_productID,
ExcludeReactionsSet const &a_reactionsToExclude = ExcludeReactionsSet {} ) const ;
stringAndDoublePairs muCutoffForCoulombPlusNuclearElastic( ) const ;
DelayedNeutronProducts delayedNeutronProducts( ) const ;
void incompleteParticles( Transporting::Settings const &a_settings, std::set<std::string> &a_incompleteParticles ) const ;
void saveAs( std::string const &a_fileName ) const ;
void toXMLList( GUPI::WriteInfo &a_writeInfo, std::string const &a_indent = "" ) const ;
void parseEvaluatedTargetInfo( HAPI::Node const &a_node );
};
/*
============================================================
===================== ProtareComposite =====================
============================================================
*/
class ProtareComposite : public Protare {
private:
std::vector<Protare *> m_protares; /**< List of protares added to *this* instance. */
public:
ProtareComposite( Construction::Settings const &a_construction );
~ProtareComposite( );
std::vector<Protare *> &protares( ) { return( m_protares ); } /**< Returns the value of the *m_protares* member. */
void append( Protare *a_protare );
// The rest are virtual methods defined in the Protare class.
ProtareType protareType( ) const { return( ProtareType::composite ); } /**< Returns the type of the protare. */
std::size_t numberOfProtares( ) const ;
ProtareSingle *protare( std::size_t a_index );
ProtareSingle const *protare( std::size_t a_index ) const ;
LUPI::FormatVersion const &formatVersion( std::size_t a_index = 0 ) const ;
std::string const &fileName( std::size_t a_index = 0 ) const ;
std::string const &realFileName( std::size_t a_index = 0 ) const ;
std::vector<std::string> libraries( std::size_t a_index = 0 ) const ;
std::string const &evaluation( std::size_t a_index = 0 ) const ;
Frame projectileFrame( std::size_t a_index = 0 ) const ;
int numberOfLazyParsingHelperForms( ) const ;
int numberOfLazyParsingHelperFormsReplaced( ) const ;
double thresholdFactor( ) const ;
Documentation_1_10::Suite &documentations( );
Styles::Base &style( std::string const &a_label );
Styles::Suite &styles( );
Styles::Suite const &styles( ) const ;
int intid( std::string const &a_id ) const;
void productIDs( std::set<std::string> &a_ids, Transporting::Particles const &a_particles, bool a_transportablesOnly ) const ;
int maximumLegendreOrder( LUPI::StatusMessageReporting &a_smr, Transporting::MG const &a_settings,
Styles::TemperatureInfo const &a_temperatureInfo, std::string const &a_productID ) const ;
Styles::TemperatureInfos temperatures( ) const ;
std::size_t numberOfReactions( ) const ;
Reaction *reaction( std::size_t a_index );
Reaction const *reaction( std::size_t a_index ) const ;
Reaction const *reaction( std::size_t a_index, Transporting::MG const &a_settings,
ExcludeReactionsSet const &a_reactionsToExclude = ExcludeReactionsSet {} ) const;
std::size_t numberOfOrphanProducts( ) const ;
Reaction *orphanProduct( std::size_t a_index );
Reaction const *orphanProduct( std::size_t a_index ) const ;
void updateReactionIndices( std::size_t a_offset ) const;
bool hasFission( ) const ;
bool isDelayedFissionNeutronComplete( ) const ;
GUPI::Ancestry *findInAncestry3( LUPI_maybeUnused std::string const &a_item ) { return( nullptr ); } /**< Always returns *nullptr*. */
GUPI::Ancestry const *findInAncestry3( LUPI_maybeUnused std::string const &a_item ) const { return( nullptr ); } /**< Always returns *nullptr*. */
std::vector<double> groupBoundaries( Transporting::MG const &a_settings, Styles::TemperatureInfo const &a_temperatureInfo,
std::string const &a_productID ) const ;
Vector multiGroupInverseSpeed( LUPI::StatusMessageReporting &a_smr, Transporting::MG const &a_settings,
Styles::TemperatureInfo const &a_temperatureInfo ) const ;
Vector multiGroupCrossSection( LUPI::StatusMessageReporting &a_smr, Transporting::MG const &a_settings,
Styles::TemperatureInfo const &a_temperatureInfo,
ExcludeReactionsSet const &a_reactionsToExclude = ExcludeReactionsSet {},
std::string const &a_label = "" ) const ;
Vector multiGroupQ( LUPI::StatusMessageReporting &a_smr, Transporting::MG const &a_settings,
Styles::TemperatureInfo const &a_temperatureInfo, bool a_final, bool a_effectivePhotoAtomic = true,
ExcludeReactionsSet const &a_reactionsToExclude = ExcludeReactionsSet {} ) const ;
Vector multiGroupMultiplicity( LUPI::StatusMessageReporting &a_smr, Transporting::MG const &a_settings,
Styles::TemperatureInfo const &a_temperatureInfo, std::string const &a_productID,
ExcludeReactionsSet const &a_reactionsToExclude = ExcludeReactionsSet {} ) const ;
Vector multiGroupFissionNeutronMultiplicity( LUPI::StatusMessageReporting &a_smr, Transporting::MG const &a_settings,
Styles::TemperatureInfo const &a_temperatureInfo, ExcludeReactionsSet const &a_reactionsToExclude = ExcludeReactionsSet {} ) const ;
Vector multiGroupFissionGammaMultiplicity( LUPI::StatusMessageReporting &a_smr, Transporting::MG const &a_settings,
Styles::TemperatureInfo const &a_temperatureInfo, ExcludeReactionsSet const &a_reactionsToExclude = ExcludeReactionsSet {} ) const ;
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, ExcludeReactionsSet const &a_reactionsToExclude = ExcludeReactionsSet {} ) const ;
Matrix multiGroupFissionMatrix( LUPI::StatusMessageReporting &a_smr, Transporting::MG const &a_settings,
Styles::TemperatureInfo const &a_temperatureInfo, Transporting::Particles const &a_particles, std::size_t a_order,
ExcludeReactionsSet const &a_reactionsToExclude = ExcludeReactionsSet {} ) const ;
Vector multiGroupTransportCorrection( LUPI::StatusMessageReporting &a_smr, Transporting::MG const &a_settings,
Styles::TemperatureInfo const &a_temperatureInfo, Transporting::Particles const &a_particles, std::size_t a_order,
TransportCorrectionType a_transportCorrectionType, double a_temperature,
ExcludeReactionsSet const &a_reactionsToExclude = ExcludeReactionsSet {} ) const ;
Vector multiGroupAvailableEnergy( LUPI::StatusMessageReporting &a_smr, Transporting::MG const &a_settings,
Styles::TemperatureInfo const &a_temperatureInfo, ExcludeReactionsSet const &a_reactionsToExclude = ExcludeReactionsSet {} ) const ;
Vector multiGroupAverageEnergy( LUPI::StatusMessageReporting &a_smr, Transporting::MG const &a_settings,
Styles::TemperatureInfo const &a_temperatureInfo, std::string const &a_productID,
ExcludeReactionsSet const &a_reactionsToExclude = ExcludeReactionsSet {} ) const ;
Vector multiGroupDepositionEnergy( LUPI::StatusMessageReporting &a_smr, Transporting::MG const &a_settings,
Styles::TemperatureInfo const &a_temperatureInfo, Transporting::Particles const &a_particles,
ExcludeReactionsSet const &a_reactionsToExclude = ExcludeReactionsSet {} ) const ;
Vector multiGroupAvailableMomentum( LUPI::StatusMessageReporting &a_smr, Transporting::MG const &a_settings,
Styles::TemperatureInfo const &a_temperatureInfo, ExcludeReactionsSet const &a_reactionsToExclude = ExcludeReactionsSet {} ) const ;
Vector multiGroupAverageMomentum( LUPI::StatusMessageReporting &a_smr, Transporting::MG const &a_settings,
Styles::TemperatureInfo const &a_temperatureInfo, std::string const &a_productID,
ExcludeReactionsSet const &a_reactionsToExclude = ExcludeReactionsSet {} ) const ;
Vector multiGroupDepositionMomentum( LUPI::StatusMessageReporting &a_smr, Transporting::MG const &a_settings,
Styles::TemperatureInfo const &a_temperatureInfo, Transporting::Particles const &a_particles,
ExcludeReactionsSet const &a_reactionsToExclude = ExcludeReactionsSet {} ) const ;
Vector multiGroupGain( LUPI::StatusMessageReporting &a_smr, Transporting::MG const &a_settings,
Styles::TemperatureInfo const &a_temperatureInfo, std::string const &a_productID,
ExcludeReactionsSet const &a_reactionsToExclude = ExcludeReactionsSet {} ) const ;
stringAndDoublePairs muCutoffForCoulombPlusNuclearElastic( ) const ;
DelayedNeutronProducts delayedNeutronProducts( ) const ;
void incompleteParticles( Transporting::Settings const &a_settings, std::set<std::string> &a_incompleteParticles ) const ;
};
/*
============================================================
======================= ProtareTNSL ========================
============================================================
*/
class ProtareTNSL : public Protare {
private:
ProtareSingle *m_protare; /**< Protare with non thermal neutron scattering law data. */
ProtareSingle *m_TNSL; /**< Protare with thermal neutron scattering law data. */
Reaction *m_elasticReaction; /**< The elastic reaction from the non TNSL protare. */
std::map<std::string,std::size_t> m_maximumTNSL_MultiGroupIndex; /**< For each neutron multi-group data, this the number of valid groups for the TNSL data. */
public:
ProtareTNSL( Construction::Settings const &a_construction, ProtareSingle *a_protare, ProtareSingle *a_TNSL );
~ProtareTNSL( );
ProtareSingle *TNSL( ) { return( m_TNSL ); } /**< Returns the *m_TNSL* member. */
ProtareSingle const *TNSL( ) const { return( m_TNSL ); } /**< Returns the *m_TNSL* member. */
Reaction *elasticReaction( ) { return( m_elasticReaction ); } /**< Returns the *m_elasticReaction* member. */
std::size_t maximumTNSL_MultiGroupIndex( Styles::TemperatureInfo const &a_temperatureInfo ) const ;
void combineVectors( Transporting::MG const &a_settings, Styles::TemperatureInfo const &a_temperatureInfo, Vector &a_vector,
Vector const &a_vectorElastic, Vector const &a_vectorTNSL ) const ;
void combineMatrices( Transporting::MG const &a_settings, Styles::TemperatureInfo const &a_temperatureInfo, Matrix &a_matrix,
Matrix const &a_matrixElastic, Matrix const &a_matrixTNSL ) const ;
// The rest are virtual methods defined in the Protare class.
ProtareType protareType( ) const { return( ProtareType::TNSL ); } /**< Returns the type of the protare. */
std::size_t numberOfProtares( ) const { return( 2 ); } /**< Always returns 2. */
ProtareSingle *protare( std::size_t a_index = 0 );
ProtareSingle const *protare( std::size_t a_index = 0 ) const ;
LUPI::FormatVersion const &formatVersion( std::size_t a_index = 0 ) const ;
std::string const &fileName( std::size_t a_index = 0 ) const ;
std::string const &realFileName( std::size_t a_index = 0 ) const ;
std::vector<std::string> libraries( std::size_t a_index = 0 ) const ;
std::string const &evaluation( std::size_t a_index = 0 ) const ;
Frame projectileFrame( std::size_t a_index = 0 ) const ;
int numberOfLazyParsingHelperForms( ) const ;
int numberOfLazyParsingHelperFormsReplaced( ) const ;
double thresholdFactor( ) const ;
Documentation_1_10::Suite &documentations( );
Styles::Base &style( std::string const &a_label );
Styles::Suite &styles( );
Styles::Suite const &styles( ) const ;
int intid( std::string const &a_id ) const;
void productIDs( std::set<std::string> &a_ids, Transporting::Particles const &a_particles, bool a_transportablesOnly ) const ;
int maximumLegendreOrder( LUPI::StatusMessageReporting &a_smr, Transporting::MG const &a_settings,
Styles::TemperatureInfo const &a_temperatureInfo, std::string const &a_productID ) const ;
Styles::TemperatureInfos temperatures( ) const ;
std::size_t numberOfReactions( ) const ;
Reaction *reaction( std::size_t a_index );
Reaction const *reaction( std::size_t a_index ) const ;
Reaction const *reaction( std::size_t a_index, Transporting::MG const &a_settings,
ExcludeReactionsSet const &a_reactionsToExclude = ExcludeReactionsSet {} ) const;
std::size_t numberOfOrphanProducts( ) const ;
Reaction *orphanProduct( std::size_t a_index );
Reaction const *orphanProduct( std::size_t a_index ) const ;
void updateReactionIndices( std::size_t a_offset ) const;
bool hasFission( ) const ;
bool isDelayedFissionNeutronComplete( ) const ;
GUPI::Ancestry *findInAncestry3( LUPI_maybeUnused std::string const &a_item ) { return( nullptr ); } /**< Always returns *nullptr*. */
GUPI::Ancestry const *findInAncestry3( LUPI_maybeUnused std::string const &a_item ) const { return( nullptr ); } /**< Always returns *nullptr*. */
std::vector<double> groupBoundaries( Transporting::MG const &a_settings, Styles::TemperatureInfo const &a_temperatureInfo,
std::string const &a_productID ) const ;
Vector multiGroupInverseSpeed( LUPI::StatusMessageReporting &a_smr, Transporting::MG const &a_settings,
Styles::TemperatureInfo const &a_temperatureInfo ) const ;
Vector multiGroupCrossSection( LUPI::StatusMessageReporting &a_smr, Transporting::MG const &a_settings,
Styles::TemperatureInfo const &a_temperatureInfo, ExcludeReactionsSet const &a_reactionsToExclude = ExcludeReactionsSet {},
std::string const &a_label = "" ) const ;
Vector multiGroupQ( LUPI::StatusMessageReporting &a_smr, Transporting::MG const &a_settings,
Styles::TemperatureInfo const &a_temperatureInfo, bool a_final, bool a_effectivePhotoAtomic = true,
ExcludeReactionsSet const &a_reactionsToExclude = ExcludeReactionsSet {} ) const ;
Vector multiGroupMultiplicity( LUPI::StatusMessageReporting &a_smr, Transporting::MG const &a_settings,
Styles::TemperatureInfo const &a_temperatureInfo, std::string const &a_productID,
ExcludeReactionsSet const &a_reactionsToExclude = ExcludeReactionsSet {} ) const ;
Vector multiGroupFissionNeutronMultiplicity( LUPI::StatusMessageReporting &a_smr, Transporting::MG const &a_settings,
Styles::TemperatureInfo const &a_temperatureInfo, ExcludeReactionsSet const &a_reactionsToExclude = ExcludeReactionsSet {} ) const ;
Vector multiGroupFissionGammaMultiplicity( LUPI::StatusMessageReporting &a_smr, Transporting::MG const &a_settings,
Styles::TemperatureInfo const &a_temperatureInfo, ExcludeReactionsSet const &a_reactionsToExclude = ExcludeReactionsSet {} ) const ;
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, ExcludeReactionsSet const &a_reactionsToExclude = ExcludeReactionsSet {} ) const ;
Matrix multiGroupFissionMatrix( LUPI::StatusMessageReporting &a_smr, Transporting::MG const &a_settings,
Styles::TemperatureInfo const &a_temperatureInfo, Transporting::Particles const &a_particles, std::size_t a_order,
ExcludeReactionsSet const &a_reactionsToExclude = ExcludeReactionsSet {} ) const ;
Vector multiGroupTransportCorrection( LUPI::StatusMessageReporting &a_smr, Transporting::MG const &a_settings,
Styles::TemperatureInfo const &a_temperatureInfo, Transporting::Particles const &a_particles, std::size_t a_order,
TransportCorrectionType a_transportCorrectionType, double a_temperature,
ExcludeReactionsSet const &a_reactionsToExclude = ExcludeReactionsSet {} ) const ;
Vector multiGroupAvailableEnergy( LUPI::StatusMessageReporting &a_smr, Transporting::MG const &a_settings,
Styles::TemperatureInfo const &a_temperatureInfo, ExcludeReactionsSet const &a_reactionsToExclude = ExcludeReactionsSet {} ) const ;
Vector multiGroupAverageEnergy( LUPI::StatusMessageReporting &a_smr, Transporting::MG const &a_settings,
Styles::TemperatureInfo const &a_temperatureInfo, std::string const &a_productID,
ExcludeReactionsSet const &a_reactionsToExclude = ExcludeReactionsSet {} ) const ;
Vector multiGroupDepositionEnergy( LUPI::StatusMessageReporting &a_smr, Transporting::MG const &a_settings,
Styles::TemperatureInfo const &a_temperatureInfo, Transporting::Particles const &a_particles,
ExcludeReactionsSet const &a_reactionsToExclude = ExcludeReactionsSet {} ) const ;
Vector multiGroupAvailableMomentum( LUPI::StatusMessageReporting &a_smr, Transporting::MG const &a_settings,
Styles::TemperatureInfo const &a_temperatureInfo, ExcludeReactionsSet const &a_reactionsToExclude = ExcludeReactionsSet {} ) const ;
Vector multiGroupAverageMomentum( LUPI::StatusMessageReporting &a_smr, Transporting::MG const &a_settings,
Styles::TemperatureInfo const &a_temperatureInfo, std::string const &a_productID,
ExcludeReactionsSet const &a_reactionsToExclude = ExcludeReactionsSet {} ) const ;
Vector multiGroupDepositionMomentum( LUPI::StatusMessageReporting &a_smr, Transporting::MG const &a_settings,
Styles::TemperatureInfo const &a_temperatureInfo, Transporting::Particles const &a_particles,
ExcludeReactionsSet const &a_reactionsToExclude = ExcludeReactionsSet {} ) const ;
Vector multiGroupGain( LUPI::StatusMessageReporting &a_smr, Transporting::MG const &a_settings,
Styles::TemperatureInfo const &a_temperatureInfo, std::string const &a_productID,
ExcludeReactionsSet const &a_reactionsToExclude = ExcludeReactionsSet {} ) const ;
void TNSL_crossSectionSumCorrection( std::string const &a_label, Functions::XYs1d &a_crossSectionSum );
void TNSL_crossSectionSumCorrection( std::string const &a_label, Functions::Ys1d &a_crossSectionSum );
void TNSL_crossSectionSumCorrection( std::string const &a_label, Vector &a_crossSectionSum ) {
return( Protare::TNSL_crossSectionSumCorrection( a_label, a_crossSectionSum ) );
}
stringAndDoublePairs muCutoffForCoulombPlusNuclearElastic( ) const ;
DelayedNeutronProducts delayedNeutronProducts( ) const { return( m_protare->delayedNeutronProducts( ) ); }
void incompleteParticles( Transporting::Settings const &a_settings, std::set<std::string> &a_incompleteParticles ) const ;
};
namespace Map {
enum class EntryType { import, protare, TNSL };
#define GIDI_MapInteractionNuclearChars "nuclear"
#define GIDI_MapInteractionAtomicChars "atomic"
#define GIDI_MapInteractionTNSLChars "thermalNeutronScatteringLaw"
typedef std::vector<ProtareBase const *> FindProtareEntries;
/*
============================================================
========================= BaseEntry ========================
============================================================
*/
class BaseEntry : public GUPI::Ancestry {
public:
enum class PathForm { entered, cumulative, real };
private:
std::string m_name; /**< Designates the entry as either a protare or a map. */
Map const *m_parent; /**< Pointer to map containing *this*. */
std::string m_path; /**< Absolute or relative (to map file) path of the protare or map file. */
std::string m_cumulativePath; /**< Currently not used. */
public:
BaseEntry( HAPI::Node const &a_node, std::string const &a_basePath, Map const *a_parent );
virtual ~BaseEntry( ) = 0;
std::string const &name( ) const { return( m_name ); } /**< Returns the value of the *m_name* member. */
Map const *parent( ) const { return( m_parent ); } /**< Returns the value of the *m_parent* member. */
std::string path( PathForm a_form = PathForm::real ) const ;
virtual EntryType entryType( ) const = 0;
void libraries( std::vector<std::string> &a_libraries ) const ;
virtual ProtareBase const *findProtareEntry( std::string const &a_projectileID, std::string const &a_targetID,
std::string const &a_library = "", std::string const &a_evaluation = "" ) const = 0 ;
virtual void findProtareEntries( FindProtareEntries &a_protareEntries, std::regex const &a_projectileID,
std::regex const &a_targetID, std::regex const &a_library = std::regex( ".*" ),
std::regex const &a_evaluation = std::regex( ".*" ) ) const = 0 ;
virtual void toXMLList( GUPI::WriteInfo &a_writeInfo, std::string const &a_indent = "" ) const = 0;
};
/*
============================================================
========================== Import ==========================
============================================================
*/
class Import : public BaseEntry {
private:
Map *m_map; /**< Map instance for this Import. */
public:
Import( HAPI::Node const &a_node, PoPI::Database const &a_pops, std::string const &a_basePath, Map const *a_parent );
~Import( );
EntryType entryType( ) const { return( EntryType::import ); } /**< Returns EntryType::import. */
Map const *map( ) const { return( m_map ); } /**< Returns the value of the *m_map* member. */
ProtareBase const *findProtareEntry( std::string const &a_projectileID, std::string const &a_targetID,
std::string const &a_library = "", std::string const &a_evaluation = "" ) const ;
void findProtareEntries( FindProtareEntries &a_protareEntries, std::regex const &a_projectileID,
std::regex const &a_targetID, std::regex const &a_library = std::regex( ".*" ), std::regex const &a_evaluation = std::regex( ".*" ) ) const ;
std::string protareFilename( std::string const &a_projectileID, std::string const &a_targetID, std::string const &a_library = "",
std::string const &a_evaluation = "", PathForm a_form = PathForm::real ) const ;
bool isProtareAvailable( std::string const &a_projectileID, std::string const &a_targetID, std::string const &a_library = "",
std::string const &a_evaluation = "" ) const {
return( protareFilename( a_projectileID, a_targetID, a_library, a_evaluation ) != GIDI_emptyFileNameChars ); }
/**< Returns the value of the *m_map* member. */
std::vector<std::string> availableEvaluations( std::string const &a_projectileID, std::string const &a_targetID ) const ;
GUPI::Ancestry *findInAncestry3( LUPI_maybeUnused std::string const &a_item ) { return( nullptr ); } /**< Always returns *nullptr*. */
GUPI::Ancestry const *findInAncestry3( LUPI_maybeUnused std::string const &a_item ) const { return( nullptr ); } /**< Always returns *nullptr*. */
void toXMLList( GUPI::WriteInfo &a_writeInfo, std::string const &a_indent = "" ) const ;
};
/*
============================================================
======================= ProtareBase ========================
============================================================
*/
class ProtareBase : public BaseEntry {
private:
std::string m_projectileID; /**< Projectile id for protare. */
std::string m_targetID; /**< Target id for protare. */
std::string m_evaluation; /**< Evaluation string for protare. */
std::string m_interaction; /**< The interaction type for the protare. */
public:
ProtareBase( HAPI::Node const &a_node, std::string const &a_basePath, Map const *const a_map );
~ProtareBase( );
std::string const &projectileID( ) const { return( m_projectileID ); } /**< Returns the value of the *m_projectileID* member. */
std::string const &targetID( ) const { return( m_targetID ); } /**< Returns the value of the *m_targetID* member. */
std::string const &evaluation( ) const { return( m_evaluation ); } /**< Returns the value of the *m_evaluation* member. */
std::string const &interaction( ) const { return( m_interaction ); } /**< Returns the value of the *m_interaction* member. */
void setInteraction( std::string const &a_interaction ) { m_interaction = a_interaction; } /**< Set the *m_interaction* member to *a_interaction*. */
bool isMatch( std::string const &a_projectileID, std::string const &a_targetID, std::string const &a_evaluation = "" ) const ;
std::string const &library( ) const ;
std::string const &resolvedLibrary( ) const ;
ProtareBase const *findProtareEntry( std::string const &a_projectileID, std::string const &a_targetID,
std::string const &a_library = "", std::string const &a_evaluation = "" ) const ;
void findProtareEntries( FindProtareEntries &a_protareEntries, std::regex const &a_projectileID,
std::regex const &a_targetID, std::regex const &a_library = std::regex( ".*" ), std::regex const &a_evaluation = std::regex( ".*" ) ) const ;
virtual GIDI::Protare *protare( Construction::Settings const &a_construction, PoPI::Database const &a_pops,
ParticleSubstitution const &a_particleSubstitution ) const = 0 ;
virtual GIDI::ProtareSingle *protareSingle( Construction::Settings const &a_construction, PoPI::Database const &a_pops,
ParticleSubstitution const &a_particleSubstitution ) const = 0 ;
GUPI::Ancestry *findInAncestry3( LUPI_maybeUnused std::string const &a_item ) { return( nullptr ); } /**< Always returns *nullptr*. */
GUPI::Ancestry const *findInAncestry3( LUPI_maybeUnused std::string const &a_item ) const { return( nullptr ); } /**< Always returns *nullptr*. */
};
/*
============================================================
========================= Protare ==========================
============================================================
*/
class Protare : public ProtareBase {
private:
bool m_isPhotoAtomic; /**< true if photo-atomic protare and false otherwise. */
public:
Protare( HAPI::Node const &a_node, PoPI::Database const &a_pops, std::string const &a_basePath, Map const *const a_parent );
~Protare( );
EntryType entryType( ) const { return( EntryType::protare ); } /**< Returns EntryType::protare. */
bool isPhotoAtomic( ) const { return( m_isPhotoAtomic ); } /**< Returns the value of the *m_isPhotoAtomic* member. */
GIDI::Protare *protare( Construction::Settings const &a_construction, PoPI::Database const &a_pops, ParticleSubstitution const &a_particleSubstitution ) const ;
GIDI::ProtareSingle *protareSingle( Construction::Settings const &a_construction, PoPI::Database const &a_pops,
ParticleSubstitution const &a_particleSubstitution ) const ;
void toXMLList( GUPI::WriteInfo &a_writeInfo, std::string const &a_indent = "" ) const ;
};
/*
============================================================
=========================== TNSL ===========================
============================================================
*/
class TNSL : public ProtareBase {
private:
std::string m_standardTarget; /**< The non-TNSL target. */
std::string m_standardEvaluation; /**< The non-TNSL evaluation. */
public:
TNSL( HAPI::Node const &a_node, PoPI::Database const &a_pops, std::string const &a_basePath, Map const *const a_parent );
~TNSL( );
EntryType entryType( ) const { return( EntryType::TNSL ); } /**< Returns EntryType::TNSL. */
std::string const &standardTarget( ) const { return( m_standardTarget ); }
std::string const &standardEvaluation( ) const { return( m_standardEvaluation ); }
GIDI::Protare *protare( Construction::Settings const &a_construction, PoPI::Database const &a_pops, ParticleSubstitution const &a_particleSubstitution ) const ;
GIDI::ProtareSingle *protareSingle( Construction::Settings const &a_construction, PoPI::Database const &a_pops,
ParticleSubstitution const &a_particleSubstitution ) const ;
void toXMLList( GUPI::WriteInfo &a_writeInfo, std::string const &a_indent = "" ) const ;
};
/*
============================================================
=========================== Map ============================
============================================================
*/
class Map : public GUPI::Ancestry {
private:
Map const *m_parent; /**< Pointer to map containing *this* if this is an imported map. */
std::string m_fileName; /**< Specified path to Map file. */
std::string m_realFileName; /**< Absolute, real path to Map file. */
std::string m_library; /**< The name of the library. */
std::vector<BaseEntry *> m_entries; /**< List of Map entries. */
RISI::Projectiles m_projectiles; /**< **RISI::Projectiles** loaded when method RIS_load is called. */
bool m_projectilesLoaded; /**< If **true** data for **m_projectiles** have been read in, otherwise they have not been read in. */
void initialize( std::string const &a_fileName, PoPI::Database const &a_pops, Map const *a_parent );
void initialize( HAPI::Node const &a_node, std::string const &a_fileName, PoPI::Database const &a_pops, Map const *a_parent );
public:
Map( std::string const &a_fileName, PoPI::Database const &a_pops, Map const *a_parent = nullptr );
Map( HAPI::Node const &a_node, std::string const &a_fileName, PoPI::Database const &a_pops, Map const *a_parent = nullptr );
~Map( );
Map const *parent( ) const { return( m_parent ); } /**< Returns the value of the *m_parent* member. */
std::string const &fileName( ) const { return( m_fileName ); } /**< Returns the value of the *m_fileName* member. */
std::string const &realFileName( ) const { return( m_realFileName ); } /**< Returns the value of the *m_realFileName* member. */
std::string const &library( ) const { return( m_library ); } /**< Returns the value of the *m_library* member. */
std::string const &resolvedLibrary( ) const ;
void libraries( std::vector<std::string> &a_libraries ) const ;
std::size_t size( ) const { return( m_entries.size( ) ); } /**< Returns the number of entries in *this*. Does not descend map entries. */
BaseEntry const *operator[]( std::size_t a_index ) const { return( m_entries[a_index] ); }
/**< Returns the map entry at index *a_index*. */
ProtareBase const *findProtareEntry( std::string const &a_projectileID, std::string const &a_targetID, std::string const &a_library = "",
std::string const &a_evaluation = "" ) const ;
void findProtareEntries( FindProtareEntries &a_protareEntries, std::regex const &a_projectileID,
std::regex const &a_targetID, std::regex const &a_library = std::regex( ".*" ), std::regex const &a_evaluation = std::regex( ".*" ) ) const ;
std::string protareFilename( std::string const &a_projectileID, std::string const &a_targetID, std::string const &a_library = "",
std::string const &a_evaluation = "", BaseEntry::PathForm a_form = BaseEntry::PathForm::real ) const ;
bool isProtareAvailable( std::string const &a_projectileID, std::string const &a_targetID, std::string const &a_library = "",
std::string const &a_evaluation = "" ) const {
return( protareFilename( a_projectileID, a_targetID, a_library, a_evaluation, BaseEntry::PathForm::entered ) != GIDI_emptyFileNameChars ); }
/**< Returns true if the map contains a Protare matching *a_projectileID*, *a_targetID*, *a_library* and *a_evaluation*, and false otherwise. */
bool isTNSL_target( std::string const &a_targetID ) const ;
std::vector<std::string> availableEvaluations( std::string const &a_projectileID, std::string const &a_targetID ) const ;
GIDI::Protare *protare( Construction::Settings const &a_construction, PoPI::Database const &a_pops, std::string const &a_projectileID,
std::string const &a_targetID, std::string const &a_library = "", std::string const &a_evaluation = "",
bool a_targetRequiredInGlobalPoPs = true, bool a_requiredInPoPs = true ) const ;
std::vector<ProtareBase const *> directory( std::string const &a_projectileID = "", std::string const &a_targetID = "",
std::string const &a_library = "", std::string const &a_evaluation = "" ) const ;
bool walk( MapWalkCallBack a_mapWalkCallBack, void *a_userData, int a_level = 0 ) const ;
GUPI::Ancestry *findInAncestry3( LUPI_maybeUnused std::string const &a_item ) { return( nullptr ); } /**< Always returns *nullptr*. */
GUPI::Ancestry const *findInAncestry3( LUPI_maybeUnused std::string const &a_item ) const { return( nullptr ); } /**< Always returns *nullptr*. */
void saveAs( std::string const &a_fileName ) const ;
void toXMLList( GUPI::WriteInfo &a_writeInfo, std::string const &a_indent = "" ) const ;
std::string RIS_fileName( );
bool RIS_fileExist( );
RISI::Projectiles const &RIS_load( std::string const &a_energyUnit );
std::string replacementTarget( PoPI::Database const &a_pops, std::string const &a_projectile, std::string const &a_target );
};
} // End of namespace Map.
namespace Functions {
/*
============================================================
================= FissionEnergyRelease ==================
============================================================
*/
class FissionEnergyRelease : public Function1dForm {
private:
Function1dForm *m_promptProductKE; /**< The **ENDF** prompt total product kinetic energy released. */
Function1dForm *m_promptNeutronKE; /**< The **ENDF** prompt neutron kinetic energy released. */
Function1dForm *m_delayedNeutronKE; /**< The **ENDF** delayed neutron kinetic energy released. */
Function1dForm *m_promptGammaEnergy; /**< The **ENDF** prompt gamma energy released. */
Function1dForm *m_delayedGammaEnergy; /**< The **ENDF** delayed gamma energy released. */
Function1dForm *m_delayedBetaEnergy; /**< The **ENDF** delayed beta kinetic energy released. */
Function1dForm *m_neutrinoEnergy; /**< The **ENDF** neutrino energy released. */
Function1dForm *m_nonNeutrinoEnergy; /**< The **ENDF** non neutrino energy released. */
Function1dForm *m_totalEnergy; /**< The **ENDF** total energy released. */
void energyReleaseToXMLList( GUPI::WriteInfo &a_writeInfo, std::string const &a_moniker, std::string const &a_indent, Function1dForm *a_function1d ) const ;
public:
FissionEnergyRelease( Construction::Settings const &a_construction, HAPI::Node const &a_node, SetupInfo &a_setupInfo, Suite *a_parent );
~FissionEnergyRelease( );
double domainMin( ) const { return( m_nonNeutrinoEnergy->domainMin( ) ); } /**< Returns the minimum domain value for the energy released. */
double domainMax( ) const { return( m_nonNeutrinoEnergy->domainMax( ) ); } /**< Returns the maximum domain value for the energy released. */
double evaluate( double a_x1 ) const { return( m_nonNeutrinoEnergy->evaluate( a_x1 ) ); } /**< Returns the value of *m_nonNeutrinoEnergy* evaluated at *a_x1*. */
Vector multiGroupQ( LUPI::StatusMessageReporting &a_smr, Transporting::MG const &a_settings,
Styles::TemperatureInfo const &a_temperatureInfo ) const ;
Function1dForm const *promptProductKE( ) const { return( m_promptProductKE ); } /**< Returns the value of the *m_promptProductKE* member. */
Function1dForm *promptProductKE( ) { return( m_promptProductKE ); } /**< Returns the value of the *m_promptProductKE* member. */
Function1dForm const *promptNeutronKE( ) const { return( m_promptNeutronKE ); } /**< Returns the value of the *m_promptNeutronKE* member. */
Function1dForm *promptNeutronKE( ) { return( m_promptNeutronKE ); } /**< Returns the value of the *m_promptNeutronKE* member. */
Function1dForm const *delayedNeutronKE( ) const { return( m_delayedNeutronKE ); } /**< Returns the value of the *m_delayedNeutronKE* member. */
Function1dForm *delayedNeutronKE( ) { return( m_delayedNeutronKE ); } /**< Returns the value of the *m_delayedNeutronKE* member. */
Function1dForm const *promptGammaEnergy( ) const { return( m_promptGammaEnergy ); } /**< Returns the value of the *m_promptGammaEnergy* member. */
Function1dForm *promptGammaEnergy( ) { return( m_promptGammaEnergy ); } /**< Returns the value of the *m_promptGammaEnergy* member. */
Function1dForm const *delayedGammaEnergy( ) const { return( m_delayedGammaEnergy ); } /**< Returns the value of the *m_delayedGammaEnergy* member. */
Function1dForm *delayedGammaEnergy( ) { return( m_delayedGammaEnergy ); } /**< Returns the value of the *m_delayedGammaEnergy* member. */
Function1dForm const *delayedBetaEnergy( ) const { return( m_delayedBetaEnergy ); } /**< Returns the value of the *m_delayedBetaEnergy* member. */
Function1dForm *delayedBetaEnergy( ) { return( m_delayedBetaEnergy ); } /**< Returns the value of the *m_delayedBetaEnergy* member. */
Function1dForm const *neutrinoEnergy( ) const { return( m_neutrinoEnergy ); } /**< Returns the value of the *m_neutrinoEnergy* member. */
Function1dForm *neutrinoEnergy( ) { return( m_neutrinoEnergy ); } /**< Returns the value of the *m_neutrinoEnergy* member. */
Function1dForm const *nonNeutrinoEnergy( ) const { return( m_nonNeutrinoEnergy ); } /**< Returns the value of the *m_neutrinoEnergy* member. */
Function1dForm *nonNeutrinoEnergy( ) { return( m_nonNeutrinoEnergy ); } /**< Returns the value of the *m_neutrinoEnergy* member. */
Function1dForm const *totalEnergy( ) const { return( m_totalEnergy ); } /**< Returns the value of the *m_totalEnergy* member. */
Function1dForm *totalEnergy( ) { return( m_totalEnergy ); } /**< Returns the value of the *m_totalEnergy* member. */
void toXMLList( GUPI::WriteInfo &a_writeInfo, std::string const &a_indent = "" ) const ;
};
} // End of namespace Functions.
/*
============================================================
========================== Groups ==========================
============================================================
*/
class Groups : public Suite {
public:
Groups( );
Groups( std::string const &a_fileName );
void addFile( std::string const &a_fileName );
};
/*
============================================================
========================== Fluxes ==========================
============================================================
*/
class Fluxes : public Suite {
public:
Fluxes( );
Fluxes( std::string const &a_fileName );
void addFile( std::string const &a_fileName );
};
/*
============================================================
============= MultiGroupCalulationInformation ==============
============================================================
*/
class MultiGroupCalulationInformation {
public:
Transporting::MultiGroup const &m_multiGroup; /**< The multi-group boundaries. */
Transporting::Flux const &m_flux; /**< The flux weighting. */
ptwXPoints *m_boundaries_xs; /**< This is an **ptwXPoints** representation of *m_heatedMultiGroupLabel* as needed by numerical functions. */
ptwXYPoints *m_fluxes_xys; /**< This is an **ptwXYPoints** representation of *m_flux* as needed by numerical functions. */
ptwXPoints *m_multiGroupFlux; /**< This is the grouped representation of *m_flux* as needed by numerical functions. */
MultiGroupCalulationInformation( Transporting::MultiGroup const &a_multiGroup, Transporting::Flux const &a_flux );
~MultiGroupCalulationInformation( );
};
/*
============================================================
========================== others ==========================
============================================================
*/
Form *parseExternalFilesSuite( 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 *parseStylesSuite( 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 *parseTransportablesSuite( Construction::Settings const &a_construction, Suite *a_parent, HAPI::Node const &a_node, SetupInfo &a_setupInfo, PoPI::Database const &a_pops, PoPI::Database const &a_internalPoPs,
std::string const &a_name, Styles::Suite const *a_styles );
Form *parseReaction( Construction::Settings const &a_construction, Suite *a_parent, HAPI::Node const &a_node, SetupInfo &a_setupInfo, PoPI::Database const &a_pops, PoPI::Database const &a_internalPoPs,
std::string const &a_name, Styles::Suite const *a_styles );
Form *parseOrphanProduct( Construction::Settings const &a_construction, Suite *a_parent, HAPI::Node const &a_node, SetupInfo &a_setupInfo, PoPI::Database const &a_pops, PoPI::Database const &a_internalPoPs,
std::string const &a_name, Styles::Suite const *a_styles );
Form *parseFissionComponent( Construction::Settings const &a_construction, Suite *a_parent, HAPI::Node const &a_node, SetupInfo &a_setupInfo, PoPI::Database const &a_pops,
PoPI::Database const &a_internalPoPs, std::string const &a_name, Styles::Suite const *a_styles );
Form *parseReactionType( std::string const &a_moniker, Construction::Settings const &a_construction, Suite *a_parent, HAPI::Node const &a_node, SetupInfo &a_setupInfo, PoPI::Database const &a_pops, PoPI::Database const &a_internalPoPs,
std::string const &a_name, Styles::Suite const *a_styles );
Form *parseSumsCrossSectionsSuite( Construction::Settings const &a_construction, Suite *a_parent, HAPI::Node const &a_node, SetupInfo &a_setupInfo, PoPI::Database const &a_pops,
PoPI::Database const &a_internalPoPs, std::string const &a_name, Styles::Suite const *a_styles );
Form *parseSumsMultiplicitiesSuite( Construction::Settings const &a_construction, Suite *a_parent, HAPI::Node const &a_node, SetupInfo &a_setupInfo, PoPI::Database const &a_pops,
PoPI::Database const &a_internalPoPs, std::string const &a_name, Styles::Suite const *a_styles );
Form *parseDoubleDifferentialCrossSectionSuite( Construction::Settings const &a_construction, Suite *a_parent, HAPI::Node const &a_node, SetupInfo &a_setupInfo, PoPI::Database const &a_pops, PoPI::Database const &a_internalPoPs,
std::string const &a_name, Styles::Suite const *a_styles );
Form *parseScatteringAtom( Construction::Settings const &a_construction, Suite *a_parent, HAPI::Node const &a_node, SetupInfo &a_setupInfo, PoPI::Database const &a_pops, PoPI::Database const &a_internalPoPs,
std::string const &a_name, Styles::Suite const *a_styles );
Form *parseCrossSectionSuite( 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 *parseDelayedNeutronsSuite( 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 *parseFissionEnergyReleasesSuite( 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 *parsePhysicalQuantitySuite( 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 *parseAvailableSuite( Construction::Settings const &a_construction, Suite *a_parent, HAPI::Node const &a_node, SetupInfo &a_setupInfo, PoPI::Database const &a_pops, PoPI::Database const &a_internalPoPs,
std::string const &a_name, Styles::Suite const *a_styles );
Form *parseQSuite( 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 *parseProductSuite( 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 *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 );
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 *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 *parseACE_URR_probabilityTables( Construction::Settings const &a_construction, Suite *a_parent, HAPI::Node const &a_node, SetupInfo &a_setupInfo,
PoPI::Database const &a_pops, PoPI::Database const &a_internalPoPs, std::string const &a_name, Styles::Suite const *a_styles );
Form *parseColumnHeaders( Construction::Settings const &a_construction, Suite *a_parent, HAPI::Node const &a_node, SetupInfo &a_setupInfo,
PoPI::Database const &a_pops, PoPI::Database const &a_internalPoPs, std::string const &a_name, Styles::Suite const *a_styles );
Functions::Function1dForm *data1dParse( Construction::Settings const &a_construction, HAPI::Node const &a_node, SetupInfo &a_setupInfo, Suite *parent );
Functions::Function1dForm *data1dParseAllowEmpty( Construction::Settings const &a_construction, HAPI::Node const &a_node, SetupInfo &a_setupInfo, Suite *a_parent );
void data1dListParse( Construction::Settings const &a_construction, HAPI::Node const &a_node, SetupInfo &a_setupInfo, std::vector<Functions::Function1dForm *> &a_function1ds );
Functions::Function2dForm *data2dParse( Construction::Settings const &a_construction, HAPI::Node const &a_node, SetupInfo &a_setupInfo, Suite *parent );
void data2dListParse( Construction::Settings const &a_construction, HAPI::Node const &a_node, SetupInfo &a_setupInfo, std::vector<Functions::Function2dForm *> &a_function2ds );
Functions::Function3dForm *data3dParse( Construction::Settings const &a_construction, HAPI::Node const &a_node, SetupInfo &a_setupInfo, Suite *parent );
void checkOuterDomainValues1d( std::vector<Functions::Function1dForm *> &a_functions, std::vector<double> &a_Xs );
void checkOuterDomainValues2d( std::vector<Functions::Function2dForm *> &a_functions, std::vector<double> &a_Xs );
void checkSequentialDomainLimits1d( std::vector<Functions::Function1dForm *> &a_functions, std::vector<double> &a_Xs );
void checkSequentialDomainLimits2d( std::vector<Functions::Function2dForm *> &a_functions, std::vector<double> &a_Xs );
int parseFlattened1d( Construction::Settings const &a_construction, HAPI::Node const &a_node, SetupInfo &a_setupInfo, Vector &data );
Vector collapse( Vector const &a_vector, Transporting::Settings const &a_settings, Transporting::Particles const &a_particles, double a_temperature );
Matrix collapse( Matrix const &a_matrix, Transporting::Settings const &a_settings, Transporting::Particles const &a_particles, double a_temperature,
std::string const &a_productID );
Vector transportCorrect( Vector const &a_vector, Vector const &a_transportCorrection );
Matrix transportCorrect( Matrix const &a_matrix, Vector const &a_transportCorrection );
Vector multiGroupXYs1d( Transporting::MultiGroup const &a_boundaries, Functions::XYs1d const &a_function, Transporting::Flux const &a_flux );
Vector *multiGroupTwoXYs1ds( MultiGroupCalulationInformation const &a_multiGroupCalulationInformation, Functions::XYs1d const &a_function1,
Functions::XYs1d const &a_function2 );
void calculate1dMultiGroupDataInComponent( ProtareSingle const *a_protare, std::string const &a_heatedMultiGroupLabel,
MultiGroupCalulationInformation const &a_multiGroupCalulationInformation, Component &a_component, Functions::XYs1d const &a_crossSection );
void calculate1dMultiGroupFissionEnergyRelease( MultiGroupCalulationInformation const &a_multiGroupCalulationInformation, Functions::XYs1d const &a_weight,
Functions::Function1dForm const *a_evaluated, Functions::Function1dForm *a_gridded1d );
int ENDL_CFromENDF_MT( int ENDF_MT, int *ENDL_C, int *ENDL_S );
GNDS_FileType GNDS_fileType( std::string const &a_fileName, GNDS_FileTypeInfo &a_GNDS_fileTypeInfo );
/*
* The following are in the file GIDI_misc.cpp.
*/
long binarySearchVector( double a_x, std::vector<double> const &a_Xs );
void intsToXMLList( GUPI::WriteInfo &a_writeInfo, std::string const &a_indent, std::vector<int> const &a_values, std::string const &a_attributes );
void parseValuesOfDoubles( Construction::Settings const &a_construction, HAPI::Node const &a_node, SetupInfo &a_setupInfo, nf_Buffer<double> &a_vector );
void parseValuesOfDoubles( HAPI::Node const &a_node, SetupInfo &a_setupInfo, nf_Buffer<double> &a_vector, int a_useSystem_strtod );
void parseValuesOfInts( Construction::Settings const &a_construction, HAPI::Node const &a_node, SetupInfo &a_setupInfo, std::vector<int> &a_vector );
void parseValuesOfInts( HAPI::Node const &a_node, SetupInfo &a_setupInfo, nf_Buffer<int> &a_vector );
void doublesToXMLList( GUPI::WriteInfo &a_writeInfo, std::string const &a_indent, std::vector<double> const &a_values, std::size_t a_start = 0, bool a_newLine = true,
std::string const &a_valueType = "" );
Frame parseFrame( HAPI::Node const &a_node, SetupInfo &a_setupInfo, std::string const &a_name );
std::string frameToString( Frame a_frame );
std::string intToString( int a_value );
std::string size_t_ToString( std::size_t a_value );
std::string nodeWithValuesToDoubles( GUPI::WriteInfo &a_writeInfo, std::string const &a_nodeName, std::vector<double> const &a_values );
void excludeReactionsSetAdjust( ExcludeReactionsSet &a_excludeReactionsSet, Protare const &a_protare );
Functions::Ys1d gridded1d2GIDI_Ys1d( Functions::Function1dForm const &a_function1d );
Functions::Ys1d vector2GIDI_Ys1d( Axes const &a_axes, Vector const &a_vector );
std::string LLNL_gidToLabel( int a_gid );
std::string LLNL_fidToLabel( int a_fid );
std::vector<std::string> sortedListOfStrings( std::vector<std::string> const &a_strings, bool a_orderIsAscending = true );
void energy2dToXMLList( GUPI::WriteInfo &a_writeInfo, std::string const &a_moniker, std::string const &a_indent, Functions::Function1dForm *a_function );
std::vector<Transporting::Flux> settingsFluxesFromFunction3d( Functions::Function3dForm const &a_function3d );
} // End of namespace GIDI.
#endif // End of GIDI_hpp_included