https://mooseframework.inl.gov
Loading...
Searching...
No Matches
SubChannel1PhaseProblem.h
Go to the documentation of this file.
1//* This file is part of the MOOSE framework
2//* https://mooseframework.inl.gov
3//*
4//* All rights reserved, see COPYRIGHT for full restrictions
5//* https://github.com/idaholab/moose/blob/master/COPYRIGHT
6//*
7//* Licensed under LGPL 2.1, please see LICENSE for details
8//* https://www.gnu.org/licenses/lgpl-2.1.html
9
10#pragma once
11
12#include "ExternalProblem.h"
14#include "SubChannelApp.h"
15#include "QuadSubChannelMesh.h"
16#include "SolutionHandle.h"
17#include <petscdm.h>
18#include <petscdmda.h>
19#include <petscksp.h>
20#include <petscsys.h>
21#include <petscvec.h>
22#include <petscsnes.h>
23#include <limits>
24
29
34{
35public:
38
39 virtual void externalSolve() override;
40 virtual void syncSolutions(Direction direction) override;
41 virtual bool solverSystemConverged(const unsigned int) override;
42 virtual void initialSetup() override;
43
45 const SCMHTCClosureBase * getPinHTCClosure() const { return _pin_HTC_closure; } // optional
47 Real getBulkReynoldsNumber() const { return _bulk_Re; }
48 Real getBulkVelocity() const { return _bulk_V; }
49
52 {
53 unsigned int i_ch = 0;
54 Real Re = 1.0;
55 Real S = 0.0;
56 Real w_perim = 0.0;
57
58 FrictionStruct() = delete;
59 FrictionStruct(unsigned int i_ch_, Real Re_, Real S_, Real w_perim_)
60 : i_ch(i_ch_), Re(Re_), S(S_), w_perim(w_perim_)
61 {
62 }
64
67 {
68 Real Re = 1.0;
69 Real Pr = 1.0;
70 unsigned int i_pin = std::numeric_limits<unsigned int>::max(); // sentinel (duct) default
71 unsigned int iz = 0;
72 unsigned int i_ch = 0;
73
74 NusseltStruct() = delete;
75 NusseltStruct(Real Re_, Real Pr_, unsigned int i_pin_, unsigned int iz_, unsigned int i_ch_)
76 : Re(Re_), Pr(Pr_), i_pin(i_pin_), iz(iz_), i_ch(i_ch_)
77 {
78 }
80
82 Real getAddedHeatPin(unsigned int i_ch, unsigned int iz) const
83 {
84 return computeAddedHeatPin(i_ch, iz);
85 }
86
88 Real getAddedHeatDuct(unsigned int i_ch, unsigned int iz) const
89 {
90 return computeAddedHeatDuct(i_ch, iz);
91 }
92
95
97 const PostprocessorValue & getOutletPressure() const { return _P_out; }
98
101
104
105protected:
107 virtual Real computeAddedHeatPin(unsigned int i_ch, unsigned int iz) const = 0;
108
110 virtual Real computeAddedHeatDuct(unsigned int i_ch, unsigned int iz) const;
111
113 void computeWijFromSolve(int iblock);
115 void computeSumWij(int iblock);
117 void computeMdot(int iblock);
119 void computeWijPrime(int iblock);
121 Real computeMixingParameter(unsigned int i_gap, unsigned int iz) const;
123 Real computeSweepFlowMixingParameter(unsigned int i_gap, unsigned int iz) const;
125 void computeDP(int iblock);
127 void computeP(int iblock);
129 virtual void computeh(int iblock) = 0;
132 Real computeT(int iblock);
134 void computeRho(int iblock);
136 void computeMu(int iblock);
138 void computeWijResidual(int iblock);
140 virtual Real getSubChannelPeripheralDuctWidth(unsigned int i_ch) const = 0;
144 PetscErrorCode petscSnesSolver(int iblock,
145 const libMesh::DenseVector<Real> & solution,
148 friend PetscErrorCode formFunction(SNES snes, Vec x, Vec f, void * ctx);
149
151 PetscErrorCode implicitPetscSolve(int iblock);
152
154 virtual void initializeSolution() = 0;
156 void detectDeformation();
159
161 PetscScalar computeInterpolationCoefficients(PetscScalar Peclet = 0.0);
162 PetscScalar
163 computeInterpolatedValue(PetscScalar topValue, PetscScalar botValue, PetscScalar Peclet = 0.0);
164
166 Real computeGravityDir(const MooseEnum & dir) const
167 {
168 switch (dir)
169 {
170 case 0: // counter_flow
171 return 1.0;
172 case 1: // co_flow
173 return -1.0;
174 case 2: // none
175 return 0.0;
176 default:
177 mooseError(name(), ": Invalid gravity direction: expected counter_flow, co_flow, or none");
178 }
179 }
180
194 PetscErrorCode solveAndPopulateEnthalpy(
195 Mat A, Vec rhs, unsigned int first_node, unsigned int last_node, const char * ksp_prefix);
196
197 PetscErrorCode cleanUp();
200 unsigned int _n_blocks;
206 const Real _g_grav;
207 const Real & _kij;
208 unsigned int _n_cells;
209 unsigned int _n_gaps;
210 unsigned int _n_pins;
211 unsigned int _n_channels;
212 unsigned int _block_size;
214 std::vector<Real> _z_grid;
215 Real _one;
217 Real _TR;
223 const bool _compute_power;
225 const bool _pin_mesh_exist;
237 Real _dt;
239 Real _CT;
241 const Real & _P_tol;
243 const int & _P_maxit;
245 const Real & _T_tol;
247 const int & _T_maxit;
249 const Real & _T_relaxation;
251 const unsigned int & _enthalpy_subcycles;
265 const PetscReal & _rtol;
267 const PetscReal & _atol;
269 const PetscReal & _dtol;
271 const PetscInt & _maxit;
276 const Real _dir_grav;
278 const bool _implicit_bool;
286 bool _deformation = false;
294
296 std::unique_ptr<SolutionHandle> _mdot_soln;
297 std::unique_ptr<SolutionHandle> _SumWij_soln;
298 std::unique_ptr<SolutionHandle> _P_soln;
299 std::unique_ptr<SolutionHandle> _DP_soln;
300 std::unique_ptr<SolutionHandle> _h_soln;
301 std::unique_ptr<SolutionHandle> _T_soln;
302 std::unique_ptr<SolutionHandle> _Tpin_soln;
303 std::unique_ptr<SolutionHandle> _Dpin_soln;
304 std::unique_ptr<SolutionHandle> _rho_soln;
305 std::unique_ptr<SolutionHandle> _mu_soln;
306 std::unique_ptr<SolutionHandle> _S_flow_soln;
307 std::unique_ptr<SolutionHandle> _w_perim_soln;
308 std::unique_ptr<SolutionHandle> _q_prime_soln;
309 std::unique_ptr<SolutionHandle> _duct_heat_flux_soln; // Only used for ducted assemblies
310 std::unique_ptr<SolutionHandle> _Tduct_soln; // Only used for ducted assemblies
311 std::unique_ptr<SolutionHandle> _displacement_soln;
312 std::unique_ptr<SolutionHandle> _ff_soln;
313 std::unique_ptr<SolutionHandle> _HTC_soln;
314
316 inline PetscErrorCode createPetscVector(Vec & v, PetscInt n)
317 {
319 LibmeshPetscCall(VecCreate(PETSC_COMM_SELF, &v));
320 LibmeshPetscCall(PetscObjectSetName((PetscObject)v, "Solution"));
321 LibmeshPetscCall(VecSetSizes(v, PETSC_DECIDE, n));
322 LibmeshPetscCall(VecSetFromOptions(v));
323 LibmeshPetscCall(VecZeroEntries(v));
324 PetscFunctionReturn(LIBMESH_PETSC_SUCCESS);
325 }
326
327 inline PetscErrorCode createPetscMatrix(Mat & M, PetscInt n, PetscInt m)
328 {
330 LibmeshPetscCall(MatCreate(PETSC_COMM_SELF, &M));
331 LibmeshPetscCall(MatSetSizes(M, PETSC_DECIDE, PETSC_DECIDE, n, m));
332 LibmeshPetscCall(MatSetFromOptions(M));
333 LibmeshPetscCall(MatSetUp(M));
334 PetscFunctionReturn(LIBMESH_PETSC_SUCCESS);
335 }
336
337 template <class T>
338 PetscErrorCode populateVectorFromDense(Vec & x,
339 const T & solution,
340 const unsigned int first_axial_level,
341 const unsigned int last_axial_level,
342 const unsigned int cross_dimension);
343 template <class T>
344 PetscErrorCode populateDenseFromVector(const Vec & x,
345 T & solution,
346 const unsigned int first_axial_level,
347 const unsigned int last_axial_level,
348 const unsigned int cross_dimension);
349 template <class T>
350 PetscErrorCode populateVectorFromHandle(Vec & x,
351 const T & solution,
352 const unsigned int first_axial_level,
353 const unsigned int last_axial_level,
354 const unsigned int cross_dimension);
355 template <class T>
356 PetscErrorCode populateSolutionChan(const Vec & x,
357 T & solution,
358 const unsigned int first_axial_level,
359 const unsigned int last_axial_level,
360 const unsigned int cross_dimension);
361
367 Vec _prod;
374
400
417
433
435 PetscScalar _added_K = 0.0;
436 PetscScalar _added_K_old = 1000.0;
437 PetscScalar _max_sumWij;
438 PetscScalar _max_sumWij_new;
439 PetscScalar _correction_factor = 1.0;
442
443public:
445};
446
447template <class T>
448PetscErrorCode
450 T & loc_solution,
451 const unsigned int first_axial_level,
452 const unsigned int last_axial_level,
453 const unsigned int cross_dimension)
454{
455 PetscScalar * xx;
456
458 LibmeshPetscCall(VecGetArray(x, &xx));
459 for (unsigned int iz = first_axial_level; iz < last_axial_level + 1; iz++)
460 {
461 unsigned int iz_ind = iz - first_axial_level;
462 for (unsigned int i_l = 0; i_l < cross_dimension; i_l++)
463 {
464 loc_solution(i_l, iz) = xx[iz_ind * cross_dimension + i_l];
465 }
466 }
467 LibmeshPetscCall(VecRestoreArray(x, &xx));
468
469 PetscFunctionReturn(LIBMESH_PETSC_SUCCESS);
470}
471
472template <class T>
473PetscErrorCode
475 const T & loc_solution,
476 const unsigned int first_axial_level,
477 const unsigned int last_axial_level,
478 const unsigned int cross_dimension)
479{
480 PetscScalar * xx;
481
483 LibmeshPetscCall(VecGetArray(x, &xx));
484 for (unsigned int iz = first_axial_level; iz < last_axial_level + 1; iz++)
485 {
486 unsigned int iz_ind = iz - first_axial_level;
487 for (unsigned int i_l = 0; i_l < cross_dimension; i_l++)
488 {
489 auto * loc_node = _subchannel_mesh.getChannelNode(i_l, iz);
490 xx[iz_ind * cross_dimension + i_l] = loc_solution(loc_node);
491 }
492 }
493 LibmeshPetscCall(VecRestoreArray(x, &xx));
494
495 PetscFunctionReturn(LIBMESH_PETSC_SUCCESS);
496}
497
498template <class T>
499PetscErrorCode
501 const T & loc_solution,
502 const unsigned int first_axial_level,
503 const unsigned int last_axial_level,
504 const unsigned int cross_dimension)
505{
506 PetscScalar * xx;
508 LibmeshPetscCall(VecGetArray(x, &xx));
509 for (unsigned int iz = first_axial_level; iz < last_axial_level + 1; iz++)
510 {
511 unsigned int iz_ind = iz - first_axial_level;
512 for (unsigned int i_l = 0; i_l < cross_dimension; i_l++)
513 {
514 xx[iz_ind * cross_dimension + i_l] = loc_solution(i_l, iz);
515 }
516 }
517 LibmeshPetscCall(VecRestoreArray(x, &xx));
518 PetscFunctionReturn(LIBMESH_PETSC_SUCCESS);
519}
520
521template <class T>
522PetscErrorCode
524 T & loc_solution,
525 const unsigned int first_axial_level,
526 const unsigned int last_axial_level,
527 const unsigned int cross_dimension)
528{
529 PetscScalar * xx;
531 LibmeshPetscCall(VecGetArray(x, &xx));
532 Node * loc_node;
533 for (unsigned int iz = first_axial_level; iz < last_axial_level + 1; iz++)
534 {
535 unsigned int iz_ind = iz - first_axial_level;
536 for (unsigned int i_l = 0; i_l < cross_dimension; i_l++)
537 {
538 loc_node = _subchannel_mesh.getChannelNode(i_l, iz);
539 loc_solution.set(loc_node, xx[iz_ind * cross_dimension + i_l]);
540 }
541 }
542 PetscFunctionReturn(LIBMESH_PETSC_SUCCESS);
543}
Real f(Real x)
Test function for Brents method.
const std::vector< double > x
const double M
const double T
const double v
Real PostprocessorValue
PetscFunctionBegin
const std::string & name() const
void mooseError(Args &&... args) const
Base class for friction closures used in SCM.
Base class for the convective heat transfer coefficients (HTC) closures used in SCM.
Base class for turbulent mixing closures used in SCM.
Common class for single phase fluid properties.
Base class for the 1-phase steady-state/transient subchannel solver.
libMesh::DenseMatrix< Real > _DP
const PostprocessorValue & getOutletPressure() const
Get outlet pressure.
void computeP(int iblock)
Computes Pressure per channel for block iblock.
PetscErrorCode populateSolutionChan(const Vec &x, T &solution, const unsigned int first_axial_level, const unsigned int last_axial_level, const unsigned int cross_dimension)
const Real & _mass_flow_equation_relaxation
Equation relaxation factor for mass flow rate in the coupled implicit solve.
const Real & _pressure_equation_relaxation
Equation relaxation factor for pressure in the coupled implicit solve.
PetscErrorCode createPetscVector(Vec &v, PetscInt n)
Petsc Functions.
virtual void syncSolutions(Direction direction) override
const bool _segregated_bool
Segregated solve.
PetscScalar computeInterpolatedValue(PetscScalar topValue, PetscScalar botValue, PetscScalar Peclet=0.0)
const SCMMixingClosureBase * _mixing_closure
Turbulent Mixing closure object.
Real computeSweepFlowMixingParameter(unsigned int i_gap, unsigned int iz) const
Computes and validates the sweep-flow mixing parameter.
const SCMHTCClosureBase * _pin_HTC_closure
HTC closure objects.
const SCMHTCClosureBase * _duct_HTC_closure
Mat _cmc_friction_force_mat
Cross momentum conservation - friction force.
std::unique_ptr< SolutionHandle > _w_perim_soln
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.
const PetscReal & _dtol
The divergence tolerance for the ksp linear solver.
PetscErrorCode createPetscMatrix(Mat &M, PetscInt n, PetscInt m)
Real getAddedHeatDuct(unsigned int i_ch, unsigned int iz) const
Return the added heat coming from the duct.
virtual void initializeSolution()=0
Function to initialize the solution & geometry fields.
std::unique_ptr< SolutionHandle > _displacement_soln
Mat _hc_time_derivative_mat
Enthalpy Enthalpy conservation - time derivative.
Mat _cmc_time_derivative_mat
Cross momentum Cross momentum conservation - time derivative.
const SCMFrictionClosureBase * _friction_closure
Friction closure object.
Mat _amc_turbulent_cross_flows_mat
Axial momentum Axial momentum conservation - compute turbulent cross fluxes.
static InputParameters validParams()
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...
const SCMHTCClosureBase * getDuctHTCClosure() const
const SinglePhaseFluidProperties * _fp
Non-owning pointer to fluid properties user object.
Mat _amc_sys_mdot_mat
Axial momentum system matrix.
Mat _cmc_sys_Wij_mat
Lateral momentum system matrix.
libMesh::DenseMatrix< Real > _WijPrime
void computeRho(int iblock)
Computes Density per channel for block iblock.
const SCMFrictionClosureBase * getFrictionClosure() const
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.
Real computeGravityDir(const MooseEnum &dir) const
inline function that is used to define the gravity direction
std::unique_ptr< SolutionHandle > _DP_soln
const MooseEnum _interpolation_scheme
The interpolation method used in constructing the systems.
const bool _staggered_pressure_bool
Flag to define the usage of staggered or collocated pressure.
std::unique_ptr< SolutionHandle > _rho_soln
Mat _mc_sumWij_mat
Matrices and vectors to be used in implicit assembly Mass conservation Mass conservation - sum of cro...
std::unique_ptr< SolutionHandle > _duct_heat_flux_soln
struct SubChannel1PhaseProblem::FrictionStruct _friction_args
void computeDP(int iblock)
Computes Pressure Drop per channel for block iblock.
const Real & _T_tol
Convergence tolerance for the temperature loop in internal solve.
const bool _duct_mesh_exist
Flag that informs if there is a duct mesh or not.
std::unique_ptr< SolutionHandle > _S_flow_soln
void computeWijResidual(int iblock)
Computes Residual Matrix based on the lateral momentum conservation equation for block iblock.
const bool _compute_power
Flag that informs if we need to solve the Enthalpy/Temperature equations or not.
const PostprocessorValue & _P_out
Outlet pressure postprocessor value.
virtual void initialSetup() override
std::unique_ptr< SolutionHandle > _Dpin_soln
Mat _cmc_pressure_force_mat
Cross momentum conservation - pressure force.
const SinglePhaseFluidProperties * getSinglePhaseFluidProperties() const
Get fluid properties object.
std::unique_ptr< SolutionHandle > _P_soln
Real _bulk_Re
Assembly bulk Reynolds number.
unsigned int _n_blocks
number of axial blocks
void detectDeformation()
Detects whether pin diameter or duct displacement fields require geometry recalculation.
Mat _amc_time_derivative_mat
Axial momentum conservation - time derivative.
libMesh::DenseMatrix< Real > & _Wij
std::unique_ptr< SolutionHandle > _Tduct_soln
bool _deformation
Flag that activates the effect of deformation (pin/duct) based on the auxvalues for displacement,...
libMesh::DenseMatrix< Real > _Wij_residual_matrix
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.
std::unique_ptr< SolutionHandle > _h_soln
std::unique_ptr< SolutionHandle > _T_soln
virtual void computeh(int iblock)=0
Computes Enthalpy per channel for block iblock.
std::unique_ptr< SolutionHandle > _mu_soln
Real _TR
Flag that activates or deactivates the transient parts of the equations we solve by multiplication.
virtual void externalSolve() override
PetscScalar computeInterpolationCoefficients(PetscScalar Peclet=0.0)
Functions that computes the interpolation scheme given the Peclet number.
Mat _cmc_advective_derivative_mat
Cross momentum conservation - advective (Eulerian) derivative.
bool _time_integrator_checked
Whether the time integrator has been checked for consistency with the implementation.
Vec _hc_added_heat_rhs
Enthalpy conservation - source and sink.
const Real & _P_tol
Convergence tolerance for the pressure loop in external solve.
Mat _amc_friction_force_mat
Axial momentum conservation - friction force.
Real _CT
Turbulent modeling parameter used in axial momentum equation.
virtual Real computeAddedHeatPin(unsigned int i_ch, unsigned int iz) const =0
Pure virtual: daughters provide different implementations.
PetscErrorCode populateDenseFromVector(const Vec &x, T &solution, const unsigned int first_axial_level, const unsigned int last_axial_level, const unsigned int cross_dimension)
Real _pressure_fixed_point_error
Maximum pressure fixed-point update before solution relaxation over the blocks.
Mat _mc_density_pressure_mat
Mass conservation - pressure derivative of transient density.
const bool _compute_viscosity
Flag that activates or deactivates the calculation of viscosity.
Mat _hc_advective_derivative_mat
Enthalpy conservation - advective (Eulerian) derivative;.
const PetscInt & _maxit
The maximum number of iterations to use for the ksp linear solver.
PetscErrorCode populateVectorFromHandle(Vec &x, const T &solution, const unsigned int first_axial_level, const unsigned int last_axial_level, const unsigned int cross_dimension)
PetscErrorCode implicitPetscSolve(int iblock)
Computes implicit solve using PetSc.
const bool _compute_density
Flag that activates or deactivates the calculation of density.
libMesh::DenseVector< Real > residualFunction(int iblock, libMesh::DenseVector< Real > solution)
Computes Residual Vector based on the lateral momentum conservation equation for block iblock & updat...
bool _converged
Variable that informs whether we exited external solve with a converged solution or not.
void computeSumWij(int iblock)
Computes net diversion crossflow per channel for block iblock.
const int & _T_maxit
Maximum iterations for the inner temperature loop.
const Real & _T_relaxation
Relaxation factor for temperature updates in the inner thermal-hydraulic iteration.
const Real & _crossflow_relaxation
Relaxation factor for crossflow updates in the coupled implicit solve.
std::unique_ptr< SolutionHandle > _Tpin_soln
const bool _pin_mesh_exist
Flag that informs if there is a pin mesh or not.
Mat _amc_pressure_force_mat
Axial momentum conservation - pressure force.
void computeMdot(int iblock)
Computes mass flow per channel for block iblock.
Real _bulk_V
Assembly bulk velocity.
const SCMHTCClosureBase * getPinHTCClosure() const
std::unique_ptr< SolutionHandle > _SumWij_soln
const bool _implicit_bool
Flag to define the usage of a implicit or explicit solution.
const int & _P_maxit
Maximum number of pressure iterations; zero selects the solver's existing automatic limit.
std::vector< Real > _z_grid
axial location of nodes
virtual bool solverSystemConverged(const unsigned int) override
const Real & _mass_flow_relaxation
Relaxation factor for mass flow rate updates in the coupled implicit solve.
Mat _amc_cross_derivative_mat
Axial momentum conservation - cross flux derivative.
void computeWijFromSolve(int iblock)
Computes diversion crossflow per gap for block iblock.
const unsigned int & _enthalpy_subcycles
Number of enthalpy, temperature, and property updates performed per flow solve.
void computeMu(int iblock)
Computes Viscosity per channel for block iblock.
PetscErrorCode populateVectorFromDense(Vec &x, const T &solution, const unsigned int first_axial_level, const unsigned int last_axial_level, const unsigned int cross_dimension)
libMesh::DenseMatrix< Real > & _Wij_old
struct SubChannel1PhaseProblem::NusseltStruct _nusselt_args
std::unique_ptr< SolutionHandle > _mdot_soln
Solutions handles and link to TH tables properties.
const MooseEnum _gravity_direction
The direction of gravity.
std::unique_ptr< SolutionHandle > _q_prime_soln
virtual Real computeAddedHeatDuct(unsigned int i_ch, unsigned int iz) const
Non-pure: implemented in the base (or override in a child if needed)
const PetscReal & _rtol
The relative convergence tolerance, (relative decrease) for the ksp linear solver.
const Real & _crossflow_equation_relaxation
Equation relaxation factor for crossflow in the coupled implicit solve.
Vec _amc_gravity_rhs
Axial momentum conservation - buoyancy force No implicit matrix.
Mat _mc_axial_convection_mat
Mass conservation - axial convection.
PetscScalar _added_K
Added resistances for monolithic convergence.
Mat _amc_advective_derivative_mat
Axial momentum conservation - advective (Eulerian) derivative.
Real getAddedHeatPin(unsigned int i_ch, unsigned int iz) const
Return the added heat coming from the fuel pins.
void computeBulkReynoldsNumber()
Computes the assembly bulk Reynolds number from inlet flow conditions.
Real computeT(int iblock)
Computes and relaxes Temperature per channel for block iblock.
void computeWijPrime(int iblock)
Computes turbulent crossflow per gap for block iblock.
Real computeMixingParameter(unsigned int i_gap, unsigned int iz) const
Computes and validates the turbulent mixing parameter.
std::unique_ptr< SolutionHandle > _ff_soln
const bool _verbose_subchannel
Boolean to printout information related to subchannel solve.
Mat _hc_cross_derivative_mat
Enthalpy conservation - cross flux derivative.
const PetscReal & _atol
The absolute convergence tolerance for the ksp linear solver.
const Real & _pressure_relaxation
Relaxation factor for pressure updates in the coupled implicit solve.
std::unique_ptr< SolutionHandle > _HTC_soln
Base class for subchannel meshes.
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.
structure with the needed information to compute the friction factor at a specific subchannel cell
FrictionStruct(unsigned int i_ch_, Real Re_, Real S_, Real w_perim_)
structure with the needed information to compute the Nusselt number at a specific subchannel cell and...
NusseltStruct(Real Re_, Real Pr_, unsigned int i_pin_, unsigned int iz_, unsigned int i_ch_)