18 #include <petscdmda.h> 22 #include <petscsnes.h> 68 unsigned int i_pin = std::numeric_limits<unsigned int>::max();
73 NusseltStruct(Real Re_, Real Pr_,
unsigned int i_pin_,
unsigned int iz_,
unsigned int i_ch_)
127 virtual void computeh(
int iblock) = 0;
145 friend PetscErrorCode
formFunction(SNES snes, Vec
x, Vec
f,
void * ctx);
172 mooseError(
name(),
": Invalid gravity direction: expected counter_flow, co_flow, or none");
190 Mat
A, Vec rhs,
unsigned int first_node,
unsigned int last_node,
const char * ksp_prefix);
292 LibmeshPetscCall(VecCreate(PETSC_COMM_SELF, &
v));
293 LibmeshPetscCall(PetscObjectSetName((PetscObject)
v,
"Solution"));
294 LibmeshPetscCall(VecSetSizes(
v, PETSC_DECIDE, n));
295 LibmeshPetscCall(VecSetFromOptions(
v));
296 LibmeshPetscCall(VecZeroEntries(
v));
303 LibmeshPetscCall(MatCreate(PETSC_COMM_SELF, &
M));
304 LibmeshPetscCall(MatSetSizes(
M, PETSC_DECIDE, PETSC_DECIDE, n, m));
305 LibmeshPetscCall(MatSetFromOptions(
M));
306 LibmeshPetscCall(MatSetUp(
M));
313 const unsigned int first_axial_level,
314 const unsigned int last_axial_level,
315 const unsigned int cross_dimension);
319 const unsigned int first_axial_level,
320 const unsigned int last_axial_level,
321 const unsigned int cross_dimension);
325 const unsigned int first_axial_level,
326 const unsigned int last_axial_level,
327 const unsigned int cross_dimension);
331 const unsigned int first_axial_level,
332 const unsigned int last_axial_level,
333 const unsigned int cross_dimension);
422 const unsigned int first_axial_level,
423 const unsigned int last_axial_level,
424 const unsigned int cross_dimension)
429 LibmeshPetscCall(VecGetArray(
x, &xx));
430 for (
unsigned int iz = first_axial_level; iz < last_axial_level + 1; iz++)
432 unsigned int iz_ind = iz - first_axial_level;
433 for (
unsigned int i_l = 0; i_l < cross_dimension; i_l++)
435 loc_solution(i_l, iz) = xx[iz_ind * cross_dimension + i_l];
438 LibmeshPetscCall(VecRestoreArray(
x, &xx));
446 const T & loc_solution,
447 const unsigned int first_axial_level,
448 const unsigned int last_axial_level,
449 const unsigned int cross_dimension)
454 LibmeshPetscCall(VecGetArray(
x, &xx));
455 for (
unsigned int iz = first_axial_level; iz < last_axial_level + 1; iz++)
457 unsigned int iz_ind = iz - first_axial_level;
458 for (
unsigned int i_l = 0; i_l < cross_dimension; i_l++)
461 xx[iz_ind * cross_dimension + i_l] = loc_solution(loc_node);
464 LibmeshPetscCall(VecRestoreArray(
x, &xx));
472 const T & loc_solution,
473 const unsigned int first_axial_level,
474 const unsigned int last_axial_level,
475 const unsigned int cross_dimension)
479 LibmeshPetscCall(VecGetArray(
x, &xx));
480 for (
unsigned int iz = first_axial_level; iz < last_axial_level + 1; iz++)
482 unsigned int iz_ind = iz - first_axial_level;
483 for (
unsigned int i_l = 0; i_l < cross_dimension; i_l++)
485 xx[iz_ind * cross_dimension + i_l] = loc_solution(i_l, iz);
488 LibmeshPetscCall(VecRestoreArray(
x, &xx));
496 const unsigned int first_axial_level,
497 const unsigned int last_axial_level,
498 const unsigned int cross_dimension)
502 LibmeshPetscCall(VecGetArray(
x, &xx));
504 for (
unsigned int iz = first_axial_level; iz < last_axial_level + 1; iz++)
506 unsigned int iz_ind = iz - first_axial_level;
507 for (
unsigned int i_l = 0; i_l < cross_dimension; i_l++)
510 loc_solution.set(loc_node, xx[iz_ind * cross_dimension + i_l]);
Vec _amc_friction_force_rhs
PetscErrorCode solveAndPopulateEnthalpy(Mat A, Vec rhs, unsigned int first_node, unsigned int last_node, const char *ksp_prefix)
Solve a linear system (A * x = rhs) with a simple PCJACOBI KSP and populate the enthalpy solution int...
Mat _amc_sys_mdot_mat
Axial momentum system matrix.
Base class for friction closures used in SCM.
const bool _pin_mesh_exist
Flag that informs if there is a pin mesh or not.
void computeRho(int iblock)
Computes Density per channel for block iblock.
Vec _amc_gravity_rhs
Axial momentum conservation - buoyancy force No implicit matrix.
std::unique_ptr< SolutionHandle > _Tduct_soln
std::unique_ptr< SolutionHandle > _duct_heat_flux_soln
void computeSumWij(int iblock)
Computes net diversion crossflow per channel for block iblock.
unsigned int _n_blocks
number of axial blocks
const bool _compute_power
Flag that informs if we need to solve the Enthalpy/Temperature equations or not.
std::unique_ptr< SolutionHandle > _T_soln
std::unique_ptr< SolutionHandle > _h_soln
const PetscReal & _dtol
The divergence tolerance for the ksp linear solver.
PetscScalar _max_sumWij_new
const MooseEnum _gravity_direction
The direction of gravity.
Mat _cmc_friction_force_mat
Cross momentum conservation - friction force.
void computeP(int iblock)
Computes Pressure per channel for block iblock.
Real _TR
Flag that activates or deactivates the transient parts of the equations we solve by multiplication...
libMesh::DenseMatrix< Real > _Wij_old
libMesh::DenseMatrix< Real > _DP
Real getAddedHeatPin(unsigned int i_ch, unsigned int iz) const
Return the added heat coming from the fuel pins.
const PostprocessorValue & _P_out
Outlet pressure postprocessor value.
FrictionStruct(unsigned int i_ch_, Real Re_, Real S_, Real w_perim_)
SubChannelMesh & _subchannel_mesh
void computeT(int iblock)
Computes Temperature per channel for block iblock.
Vec _amc_pressure_force_rhs
void computeMdot(int iblock)
Computes mass flow per channel for block iblock.
std::unique_ptr< SolutionHandle > _S_flow_soln
Base class for turbulent mixing closures used in SCM.
const SCMHTCClosureBase * _pin_HTC_closure
HTC closure objects.
Vec _hc_time_derivative_rhs
const bool _compute_density
Flag that activates or deactivates the calculation of density.
Vec _mc_axial_convection_rhs
PetscErrorCode populateSolutionChan(const Vec &x, T &solution, const unsigned int first_axial_level, const unsigned int last_axial_level, const unsigned int cross_dimension)
Mat _amc_friction_force_mat
Axial momentum conservation - friction force.
const SinglePhaseFluidProperties * getSinglePhaseFluidProperties() const
Get fluid properties object.
PetscScalar _added_K
Added resistances for monolithic convergence.
PetscErrorCode createPetscVector(Vec &v, PetscInt n)
Petsc Functions.
const SCMMixingClosureBase * _mixing_closure
Turbulent Mixing closure object.
Vec _cmc_advective_derivative_rhs
const bool _duct_mesh_exist
Flag that informs if there is a duct mesh or not.
static InputParameters validParams()
const Real & _T_tol
Convergence tolerance for the temperature loop in internal solve.
Vec _amc_time_derivative_rhs
void computeMu(int iblock)
Computes Viscosity per channel for block iblock.
structure with the needed information to compute the friction factor at a specific subchannel cell ...
PetscScalar computeInterpolatedValue(PetscScalar topValue, PetscScalar botValue, PetscScalar Peclet=0.0)
const bool _segregated_bool
Segregated solve.
Mat _cmc_sys_Wij_mat
Lateral momentum system matrix.
Vec _amc_advective_derivative_rhs
bool _converged
Variable that informs whether we exited external solve with a converged solution or not...
Vec _hc_cross_derivative_rhs
const bool _staggered_pressure_bool
Flag to define the usage of staggered or collocated pressure.
virtual void initializeSolution()=0
Function to initialize the solution & geometry fields.
Mat _mc_sumWij_mat
Matrices and vectors to be used in implicit assembly Mass conservation Mass conservation - sum of cro...
PetscErrorCode populateVectorFromDense(Vec &x, const T &solution, const unsigned int first_axial_level, const unsigned int last_axial_level, const unsigned int cross_dimension)
const SCMHTCClosureBase * _duct_HTC_closure
Real computeMixingParameter(unsigned int i_gap, unsigned int iz) const
Computes and validates the turbulent mixing parameter.
Real getAddedHeatDuct(unsigned int i_ch, unsigned int iz) const
Return the added heat coming from the duct.
virtual void computeh(int iblock)=0
Computes Enthalpy per channel for block iblock.
std::unique_ptr< SolutionHandle > _rho_soln
Mat _amc_turbulent_cross_flows_mat
Mass conservation - density time derivative No implicit matrix.
PetscErrorCode populateVectorFromHandle(Vec &x, const T &solution, const unsigned int first_axial_level, const unsigned int last_axial_level, const unsigned int cross_dimension)
Mat _amc_advective_derivative_mat
Axial momentum conservation - advective (Eulerian) derivative.
Vec _hc_added_heat_rhs
Enthalpy conservation - source and sink.
std::unique_ptr< SolutionHandle > _HTC_soln
std::vector< Real > _z_grid
axial location of nodes
const std::string & name() const
Vec _cmc_time_derivative_rhs
const int & _T_maxit
Maximum iterations for the inner temperature loop.
Mat _amc_pressure_force_mat
Axial momentum conservation - pressure force.
bool _time_integrator_checked
Whether the time integrator has been checked for consistency with the implementation.
void computeWijResidual(int iblock)
Computes Residual Matrix based on the lateral momentum conservation equation for block iblock...
const std::vector< double > x
Real f(Real x)
Test function for Brents method.
std::unique_ptr< SolutionHandle > _q_prime_soln
virtual void syncSolutions(Direction direction) override
const PetscReal & _atol
The absolute convergence tolerance for the ksp linear solver.
Real computeGravityDir(const MooseEnum &dir) const
inline function that is used to define the gravity direction
PetscScalar computeInterpolationCoefficients(PetscScalar Peclet=0.0)
Functions that computes the interpolation scheme given the Peclet number.
Real root(std::function< Real(Real)> const &f, Real x1, Real x2, Real tol=1.0e-12)
Finds the root of a function using Brent's method.
const SCMHTCClosureBase * getPinHTCClosure() const
Mat _hc_cross_derivative_mat
Enthalpy conservation - cross flux derivative.
Mat _mc_axial_convection_mat
Mass conservation - axial convection.
Common class for single phase fluid properties.
auto Peclet(const T1 &volume_fraction, const T2 &cp, const T3 &rho, const T4 &vel, const T5 &D_h, const T6 &k)
Compute Peclet number.
virtual ~SubChannel1PhaseProblem()
const PetscInt & _maxit
The maximum number of iterations to use for the ksp linear solver.
PetscErrorCode createPetscMatrix(Mat &M, PetscInt n, PetscInt m)
friend PetscErrorCode formFunction(SNES snes, Vec x, Vec f, void *ctx)
This is the residual Vector function in a form compatible with the SNES PETC solvers.
Real computeSweepFlowMixingParameter(unsigned int i_gap, unsigned int iz) const
Computes and validates the sweep-flow mixing parameter.
virtual Node * getChannelNode(unsigned int i_chan, unsigned int iz) const =0
Get the subchannel mesh node for a given channel index and elevation index.
const SCMFrictionClosureBase * getFrictionClosure() const
const MooseEnum _interpolation_scheme
The interpolation method used in constructing the systems.
const SCMFrictionClosureBase * _friction_closure
Friction closure object.
std::unique_ptr< SolutionHandle > _Dpin_soln
bool _deformation
Flag that activates the effect of deformation (pin/duct) based on the auxvalues for displacement...
const SCMHTCClosureBase * getDuctHTCClosure() const
Base class for the 1-phase steady-state/transient subchannel solver.
libMesh::DenseMatrix< Real > _Wij_residual_matrix
std::unique_ptr< SolutionHandle > _mdot_soln
Solutions handles and link to TH tables properties.
PetscErrorCode populateDenseFromVector(const Vec &x, T &solution, const unsigned int first_axial_level, const unsigned int last_axial_level, const unsigned int cross_dimension)
virtual Real computeAddedHeatPin(unsigned int i_ch, unsigned int iz) const =0
Pure virtual: daughters provide different implementations.
const PetscReal & _rtol
The relative convergence tolerance, (relative decrease) for the ksp linear solver.
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
std::unique_ptr< SolutionHandle > _displacement_soln
std::unique_ptr< SolutionHandle > _DP_soln
const bool _compute_viscosity
Flag that activates or deactivates the calculation of viscosity.
libMesh::DenseMatrix< Real > & _Wij
virtual void externalSolve() override
void computeWijPrime(int iblock)
Computes turbulent crossflow per gap for block iblock.
std::unique_ptr< SolutionHandle > _SumWij_soln
void detectDeformation()
Detects whether pin diameter or duct displacement fields require geometry recalculation.
PetscErrorCode petscSnesSolver(int iblock, const libMesh::DenseVector< Real > &solution, libMesh::DenseVector< Real > &root)
Computes solution of nonlinear equation using snes and provided a residual in a formFunction.
Vec _hc_advective_derivative_rhs
libMesh::DenseVector< Real > residualFunction(int iblock, libMesh::DenseVector< Real > solution)
Computes Residual Vector based on the lateral momentum conservation equation for block iblock & updat...
Scalar< const PostprocessorValue > PostprocessorValue
Real _CT
Turbulent modeling parameter used in axial momentum equation.
const bool _verbose_subchannel
Boolean to printout information related to subchannel solve.
PetscScalar _correction_factor
Mat _amc_cross_derivative_mat
Axial momentum conservation - cross flux derivative.
void mooseError(Args &&... args) const
const PostprocessorValue & getOutletPressure() const
Get outlet pressure.
const Real & _P_tol
Convergence tolerance for the pressure loop in external solve.
std::unique_ptr< SolutionHandle > _ff_soln
virtual bool solverSystemConverged(const unsigned int) override
struct SubChannel1PhaseProblem::FrictionStruct _friction_args
Mat _hc_advective_derivative_mat
Enthalpy conservation - advective (Eulerian) derivative;.
Base class for subchannel meshes.
void computeWijFromSolve(int iblock)
Computes diversion crossflow per gap for block iblock.
const bool _implicit_bool
Flag to define the usage of a implicit or explicit solution.
Mat _amc_time_derivative_mat
Axial momentum conservation - time derivative.
virtual Real getSubChannelPeripheralDuctWidth(unsigned int i_ch) const =0
Function that computes the width of the duct cell that the peripheral subchannel i_ch sees...
Mat _hc_time_derivative_mat
Enthalpy Enthalpy conservation - time derivative.
PetscErrorCode implicitPetscSolve(int iblock)
Computes implicit solve using PetSc.
void computeDP(int iblock)
Computes Pressure Drop per channel for block iblock.
SubChannel1PhaseProblem(const InputParameters ¶ms)
Mat _cmc_time_derivative_mat
Cross momentum Cross momentum conservation - time derivative.
libMesh::DenseMatrix< Real > _WijPrime
Base class for the convective heat transfer coefficients (HTC) closures used in SCM.
virtual void initialSetup() override
PetscFunctionReturn(LIBMESH_PETSC_SUCCESS)
Vec _cmc_friction_force_rhs
Mat _cmc_pressure_force_mat
Cross momentum conservation - pressure force.
virtual Real computeAddedHeatDuct(unsigned int i_ch, unsigned int iz) const
Non-pure: implemented in the base (or override in a child if needed)
Vec _amc_turbulent_cross_flows_rhs
NusseltStruct(Real Re_, Real Pr_, unsigned int i_pin_, unsigned int iz_, unsigned int i_ch_)
std::unique_ptr< SolutionHandle > _P_soln
std::unique_ptr< SolutionHandle > _w_perim_soln
Vec _cmc_pressure_force_rhs
Vec _amc_cross_derivative_rhs
Mat _cmc_advective_derivative_mat
Cross momentum conservation - advective (Eulerian) derivative.
struct SubChannel1PhaseProblem::NusseltStruct _nusselt_args
const SinglePhaseFluidProperties * _fp
Non-owning pointer to fluid properties user object.
structure with the needed information to compute the Nusselt number at a specific subchannel cell and...
Mat _hc_sys_h_mat
System matrices.
std::unique_ptr< SolutionHandle > _mu_soln
std::unique_ptr< SolutionHandle > _Tpin_soln