Program Listing for File Simulation.h¶
↰ Return to documentation for file (include/classes/Simulation.h)
// _______. ______ __ ___ .__ __. .___________. __ ___ ___ //
// / | / || | / \ | \ | | | || | \ \ / / //
// | (----`| ,----'| | / ^ \ | \| | `---| |----`| | \ V / //
// \ \ | | | | / /_\ \ | . ` | | | | | > < //
// .----) | | `----.| | / _____ \ | |\ | | | | | / . \ //
// |_______/ \______||__| /__/ \__\ |__| \__| |__| |__| /__/ \__\ //
// //
// Originally developed by D. Pizzocri & T. Barani //
// //
// Version: 2.2.1 //
// Year: 2026 //
// Authors: D. Pizzocri, G. Zullo. //
// //
#ifndef SIMULATION_H
#define SIMULATION_H
#include "ErrorMessages.h"
#include "Matrix.h"
#include "Model.h"
#include "SciantixArray.h"
#include "SciantixVariable.h"
#include "Solver.h"
#include "Source.h"
#include "System.h"
#include <cmath>
#include <vector>
class Simulation
{
private:
SciantixArray<SciantixVariable> sciantix_variable;
SciantixArray<SciantixVariable> history_variable;
SciantixArray<SciantixVariable> physics_variable;
SciantixArray<Model> model;
SciantixArray<System> sciantix_system;
SciantixArray<Matrix> matrices;
SciantixArray<Gas> gas;
SciantixArray<InputVariable> input_variable;
SciantixArray<InputVariable> scaling_factors;
std::vector<Source> sourcesinput;
int n_modes;
std::vector<double> modes_initial_conditions;
std::vector<double> modes_initial_conditions_NUS;
Solver solver;
Simulation()
{
n_modes = N_DIFFUSION_MODES;
modes_initial_conditions.resize(SCIANTIX_DIFFUSION_MODES_SIZE);
modes_initial_conditions_NUS.resize(SCIANTIX_DIFFUSION_MODES_SIZE);
}
public:
~Simulation()
{
}
static Simulation* getInstance();
void setVariables(int Sciantix_options[],
double Sciantix_history[],
double Sciantix_variables[],
double Sciantix_scaling_factors[],
double Sciantix_diffusion_modes[],
double Sciantix_diffusion_modes_NUS[]);
void setGas();
void setMatrix();
void setSystem();
void setGPVariables(int Sciantix_options[], double Sciantix_history[], double Sciantix_variables[]);
void initialize(int Sciantix_options[],
double Sciantix_history[],
double Sciantix_variables[],
double Sciantix_scaling_factors[],
double Sciantix_diffusion_modes[],
double Sciantix_diffusion_modes_NUS[]);
void execute();
void update(double Sciantix_variables[], double Sciantix_diffusion_modes[], double Sciantix_diffusion_modes_NUS[]);
void output();
void Burnup();
void EffectiveBurnup();
void GasProduction();
void GasDecay();
void GasRelease();
void GrainBoundarySource();
void GasDiffusion();
void GrainGrowth();
void IntraGranularBubbleBehavior();
void InterGranularBubbleBehavior();
void GrainBoundarySweeping();
void GrainBoundaryMicroCracking();
void Densification();
void GrainBoundaryVenting();
double openPorosity(double fabrication_porosity);
double athermalVentingFactor(double open_porosity,
double theta,
double porosity,
double grain_edge_lenght,
double burnup,
double temperature,
double fission_rate);
void HighBurnupStructureFormation();
void HighBurnupStructurePorosity();
void StoichiometryDeviation();
void GapPartialPressure();
void UO2Thermochemistry();
void ChromiumSolubility();
void Microstructure();
double* getDiffusionModes(std::string gas_name)
{
if (gas_name == "Xe")
return &modes_initial_conditions[0];
else if (gas_name == "Kr")
return &modes_initial_conditions[3 * n_modes];
else if (gas_name == "He")
return &modes_initial_conditions[6 * n_modes];
else if (gas_name == "Xe133")
return &modes_initial_conditions[9 * n_modes];
else if (gas_name == "Kr85m")
return &modes_initial_conditions[12 * n_modes];
else if (gas_name == "Xe in HBS")
return &modes_initial_conditions[15 * n_modes];
else
ErrorMessages::Fatal("Simulation.h", "invalid gas name \"" + gas_name + "\" in getDiffusionModes");
}
double* getDiffusionModesSolution(std::string gas_name)
{
if (gas_name == "Xe")
return &modes_initial_conditions[1 * n_modes];
else if (gas_name == "Kr")
return &modes_initial_conditions[4 * n_modes];
else if (gas_name == "He")
return &modes_initial_conditions[7 * n_modes];
else if (gas_name == "Xe133")
return &modes_initial_conditions[10 * n_modes];
else if (gas_name == "Kr85m")
return &modes_initial_conditions[13 * n_modes];
else if (gas_name == "Xe in HBS")
return &modes_initial_conditions[16 * n_modes];
else
ErrorMessages::Fatal("Simulation.h", "invalid gas name \"" + gas_name + "\" in getDiffusionModesSolution");
}
double* getDiffusionModesBubbles(std::string gas_name)
{
if (gas_name == "Xe")
return &modes_initial_conditions[2 * n_modes];
else if (gas_name == "Kr")
return &modes_initial_conditions[5 * n_modes];
else if (gas_name == "He")
return &modes_initial_conditions[8 * n_modes];
else if (gas_name == "Xe133")
return &modes_initial_conditions[11 * n_modes];
else if (gas_name == "Kr85m")
return &modes_initial_conditions[14 * n_modes];
else
ErrorMessages::Fatal("Simulation.h", "invalid gas name \"" + gas_name + "\" in getDiffusionModesBubbles");
}
double* getDiffusionModes_NUS(std::string gas_name)
{
if (gas_name == "Xe")
return &modes_initial_conditions_NUS[0];
else if (gas_name == "Kr")
return &modes_initial_conditions_NUS[3 * 40];
else if (gas_name == "He")
return &modes_initial_conditions_NUS[6 * 40];
else if (gas_name == "Xe133")
return &modes_initial_conditions_NUS[9 * 40];
else if (gas_name == "Kr85m")
return &modes_initial_conditions_NUS[12 * 40];
else if (gas_name == "Xe in HBS")
return &modes_initial_conditions_NUS[15 * 40];
else
{
std::cerr << "Error: Invalid gas name \"" << gas_name << "\" in Simulation::getDiffusionModes."
<< std::endl;
return nullptr;
}
}
double* getDiffusionModesSolution_NUS(std::string gas_name)
{
if (gas_name == "Xe")
return &modes_initial_conditions_NUS[1 * 40];
else if (gas_name == "Kr")
return &modes_initial_conditions_NUS[4 * 40];
else if (gas_name == "He")
return &modes_initial_conditions_NUS[7 * 40];
else if (gas_name == "Xe133")
return &modes_initial_conditions_NUS[10 * 40];
else if (gas_name == "Kr85m")
return &modes_initial_conditions_NUS[13 * 40];
else if (gas_name == "Xe in HBS")
return &modes_initial_conditions_NUS[16 * 40];
else
{
std::cerr << "Error: Invalid gas name \"" << gas_name << "\" in Simulation::getDiffusionModesSolution."
<< std::endl;
return nullptr;
}
}
double* getDiffusionModesBubbles_NUS(std::string gas_name)
{
if (gas_name == "Xe")
return &modes_initial_conditions_NUS[2 * 40];
else if (gas_name == "Kr")
return &modes_initial_conditions_NUS[5 * 40];
else if (gas_name == "He")
return &modes_initial_conditions_NUS[8 * 40];
else if (gas_name == "Xe133")
return &modes_initial_conditions_NUS[11 * 40];
else if (gas_name == "Kr85m")
return &modes_initial_conditions_NUS[14 * 40];
else
{
std::cerr << "Error: Invalid gas name \"" << gas_name << "\" in Simulation::getDiffusionModesBubbles."
<< std::endl;
return nullptr;
}
}
};
#endif // SIMULATION_H