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: 2025                                                                      //
//  Authors: D. Pizzocri, G. Zullo.                                                 //
//                                                                                  //

#ifndef SIMULATION_H
#define SIMULATION_H

#include "Matrix.h"
#include "Model.h"
#include "SciantixArray.h"
#include "SciantixVariable.h"
#include "Solver.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;

    int                 n_modes;
    std::vector<double> modes_initial_conditions;

    Solver solver;

    static Simulation* instance;

    Simulation()
    {
        n_modes = 40;
        modes_initial_conditions.resize(720);
    }

  public:
    ~Simulation() {}

    static Simulation* getInstance();

    void setVariables(int Sciantix_options[], double Sciantix_history[],
                      double Sciantix_variables[], double Sciantix_scaling_factors[],
                      double Sciantix_diffusion_modes[]);

    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[]);

    void execute();

    void update(double Sciantix_variables[], double Sciantix_diffusion_modes[]);

    void output();

    void Burnup();

    void EffectiveBurnup();

    void GasProduction();

    void GasDecay();

    void GasRelease();

    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 * 40];
        else if (gas_name == "He")
            return &modes_initial_conditions[6 * 40];
        else if (gas_name == "Xe133")
            return &modes_initial_conditions[9 * 40];

        else if (gas_name == "Kr85m")
            return &modes_initial_conditions[12 * 40];

        else if (gas_name == "Xe in HBS")
            return &modes_initial_conditions[15 * 40];

        else
        {
            std::cerr << "Error: Invalid gas name \"" << gas_name
                      << "\" in Simulation::getDiffusionModes." << std::endl;
            return nullptr;
        }
    }

    double* getDiffusionModesSolution(std::string gas_name)
    {
        if (gas_name == "Xe")
            return &modes_initial_conditions[1 * 40];

        else if (gas_name == "Kr")
            return &modes_initial_conditions[4 * 40];

        else if (gas_name == "He")
            return &modes_initial_conditions[7 * 40];

        else if (gas_name == "Xe133")
            return &modes_initial_conditions[10 * 40];

        else if (gas_name == "Kr85m")
            return &modes_initial_conditions[13 * 40];

        else if (gas_name == "Xe in HBS")
            return &modes_initial_conditions[16 * 40];
        else
        {
            std::cerr << "Error: Invalid gas name \"" << gas_name
                      << "\" in Simulation::getDiffusionModesSolution." << std::endl;
            return nullptr;
        }
    }

    double* getDiffusionModesBubbles(std::string gas_name)
    {
        if (gas_name == "Xe")
            return &modes_initial_conditions[2 * 40];

        else if (gas_name == "Kr")
            return &modes_initial_conditions[5 * 40];

        else if (gas_name == "He")
            return &modes_initial_conditions[8 * 40];

        else if (gas_name == "Xe133")
            return &modes_initial_conditions[11 * 40];

        else if (gas_name == "Kr85m")
            return &modes_initial_conditions[14 * 40];

        else
        {
            std::cerr << "Error: Invalid gas name \"" << gas_name
                      << "\" in Simulation::getDiffusionModesBubbles." << std::endl;
            return nullptr;
        }
    }
};

#endif