https://mooseframework.inl.gov
Loading...
Searching...
No Matches
Public Types | Public Member Functions | Static Public Member Functions | Public Attributes | Static Public Attributes | Protected Member Functions | Protected Attributes | Private Types | Private Member Functions | Static Private Member Functions | Private Attributes | List of all members
QuadSubChannel1PhaseProblem Class Referenceabstract

Quadrilateral subchannel solver. More...

#include <QuadSubChannel1PhaseProblem.h>

Inheritance diagram for QuadSubChannel1PhaseProblem:
[legend]

Public Types

enum  Direction
 
enum  CoverageCheckMode
 
typedef DataFileName DataFileParameterType
 

Public Member Functions

 QuadSubChannel1PhaseProblem (const InputParameters &params)
 
virtual void externalSolve () override
 
virtual void syncSolutions (Direction direction) override
 
virtual bool solverSystemConverged (const unsigned int) override
 
virtual void initialSetup () override
 
const SCMHTCClosureBase * getDuctHTCClosure () const
 
const SCMHTCClosureBase * getPinHTCClosure () const
 
const SCMFrictionClosureBase * getFrictionClosure () const
 
Real getBulkReynoldsNumber () const
 
Real getBulkVelocity () const
 
Real getAddedHeatPin (unsigned int i_ch, unsigned int iz) const
 Return the added heat coming from the fuel pins.
 
Real getAddedHeatDuct (unsigned int i_ch, unsigned int iz) const
 Return the added heat coming from the duct.
 
const PostprocessorValue & getOutletPressure () const
 Get outlet pressure.
 
const SinglePhaseFluidProperties * getSinglePhaseFluidProperties () const
 Get fluid properties object.
 
virtual void solve (unsigned int nl_sys_num=0) override final
 
virtual void addExternalVariables ()
 
bool initialized () const
 
virtual libMesh::EquationSystems & es () override
 
virtual MooseMesh & mesh () override
 
virtual const MooseMesh & mesh () const override
 
const MooseMesh & mesh (bool use_displaced) const override
 
MooseMesh & mesh (bool use_displaced)
 
void setCoordSystem (const std::vector< SubdomainName > &blocks, const MultiMooseEnum &coord_sys)
 
void setAxisymmetricCoordAxis (const MooseEnum &rz_coord_axis)
 
void setCoupling (Moose::CouplingType type)
 
Moose::CouplingType coupling () const
 
void setCouplingMatrix (std::unique_ptr< libMesh::CouplingMatrix > cm, const unsigned int nl_sys_num)
 
void setCouplingMatrix (libMesh::CouplingMatrix *cm, const unsigned int nl_sys_num)
 
const libMesh::CouplingMatrix * couplingMatrix (const unsigned int nl_sys_num) const override
 
void setNonlocalCouplingMatrix ()
 
bool areCoupled (const unsigned int ivar, const unsigned int jvar, const unsigned int nl_sys_num) const
 
bool hasUOAuxStateCheck () const
 
bool checkingUOAuxState () const
 
virtual bool checkResidualForNans () const override
 
void setCheckResidualForNans (bool check_residual_for_nans)
 
void trustUserCouplingMatrix ()
 
std::vector< std::pair< MooseVariableFieldBase *, MooseVariableFieldBase * > > & couplingEntries (const THREAD_ID tid, const unsigned int nl_sys_num)
 
std::vector< std::pair< MooseVariableFieldBase *, MooseVariableFieldBase * > > & nonlocalCouplingEntries (const THREAD_ID tid, const unsigned int nl_sys_num)
 
const std::vector< std::pair< MooseVariableFieldBase *, MooseVariableScalar * > > & fieldScalarCouplingEntries (const THREAD_ID tid, const unsigned int nl_sys_num) const
 
virtual bool hasVariable (const std::string &var_name) const override
 
bool hasSolverVariable (const std::string &var_name) const
 
virtual const MooseVariableFieldBase & getVariable (const THREAD_ID tid, const std::string &var_name, Moose::VarKindType expected_var_type=Moose::VarKindType::VAR_ANY, Moose::VarFieldType expected_var_field_type=Moose::VarFieldType::VAR_FIELD_ANY) const override
 
virtual const MooseVariableFieldBase & getVariable (const THREAD_ID tid, const std::string &var_name, Moose::VarKindType expected_var_type=Moose::VarKindType::VAR_ANY, Moose::VarFieldType expected_var_field_type=Moose::VarFieldType::VAR_FIELD_ANY) const =0
 
virtual MooseVariableFieldBase & getVariable (const THREAD_ID tid, const std::string &var_name, Moose::VarKindType expected_var_type=Moose::VarKindType::VAR_ANY, Moose::VarFieldType expected_var_field_type=Moose::VarFieldType::VAR_FIELD_ANY)
 
MooseVariableFieldBase & getActualFieldVariable (const THREAD_ID tid, const std::string &var_name) override
 
virtual MooseVariable & getStandardVariable (const THREAD_ID tid, const std::string &var_name) override
 
virtual VectorMooseVariable & getVectorVariable (const THREAD_ID tid, const std::string &var_name) override
 
virtual ArrayMooseVariable & getArrayVariable (const THREAD_ID tid, const std::string &var_name) override
 
virtual bool hasScalarVariable (const std::string &var_name) const override
 
virtual MooseVariableScalar & getScalarVariable (const THREAD_ID tid, const std::string &var_name) override
 
virtual libMesh::System & getSystem (const std::string &var_name) override
 
const RestartableEquationSystems & getRestartableEquationSystems () const
 
virtual void setActiveElementalMooseVariables (const std::set< MooseVariableFEBase * > &moose_vars, const THREAD_ID tid) override
 
virtual void clearActiveElementalMooseVariables (const THREAD_ID tid) override
 
virtual void clearActiveFEVariableCoupleableMatrixTags (const THREAD_ID tid) override
 
virtual void clearActiveFEVariableCoupleableVectorTags (const THREAD_ID tid) override
 
virtual void setActiveFEVariableCoupleableVectorTags (std::set< TagID > &vtags, const THREAD_ID tid) override
 
virtual void setActiveFEVariableCoupleableMatrixTags (std::set< TagID > &mtags, const THREAD_ID tid) override
 
virtual void clearActiveScalarVariableCoupleableMatrixTags (const THREAD_ID tid) override
 
virtual void clearActiveScalarVariableCoupleableVectorTags (const THREAD_ID tid) override
 
virtual void setActiveScalarVariableCoupleableVectorTags (std::set< TagID > &vtags, const THREAD_ID tid) override
 
virtual void setActiveScalarVariableCoupleableMatrixTags (std::set< TagID > &mtags, const THREAD_ID tid) override
 
virtual void createQRules (libMesh::QuadratureType type, libMesh::Order order, libMesh::Order volume_order=libMesh::INVALID_ORDER, libMesh::Order face_order=libMesh::INVALID_ORDER, SubdomainID block=Moose::ANY_BLOCK_ID, bool allow_negative_qweights=true)
 
void bumpVolumeQRuleOrder (libMesh::Order order, SubdomainID block)
 
void bumpAllQRuleOrder (libMesh::Order order, SubdomainID block)
 
unsigned int getMaxQps () const
 
libMesh::Order getMaxScalarOrder () const
 
void checkNonlocalCoupling ()
 
void checkUserObjectJacobianRequirement (THREAD_ID tid)
 
void setVariableAllDoFMap (const std::vector< const MooseVariableFEBase * > &moose_vars)
 
const std::vector< const MooseVariableFEBase * > & getUserObjectJacobianVariables (const THREAD_ID tid) const
 
virtual Assembly & assembly (const THREAD_ID tid, const unsigned int sys_num) override
 
virtual const Assembly & assembly (const THREAD_ID tid, const unsigned int sys_num) const override
 
Moose::Kokkos::Assembly & kokkosAssembly ()
 
const Moose::Kokkos::Assembly & kokkosAssembly () const
 
virtual std::vector< VariableName > getVariableNames ()
 
void checkDuplicatePostprocessorVariableNames ()
 
void timestepSetup () override
 
void customSetup (const ExecFlagType &exec_type) override
 
void residualSetup () override
 
void jacobianSetup () override
 
virtual void prepare (const Elem *elem, const THREAD_ID tid) override
 
virtual void prepare (const Elem *elem, unsigned int ivar, unsigned int jvar, const std::vector< dof_id_type > &dof_indices, const THREAD_ID tid) override
 
virtual void prepareFace (const Elem *elem, const THREAD_ID tid) override
 
virtual void setCurrentSubdomainID (const Elem *elem, const THREAD_ID tid) override
 
virtual void setNeighborSubdomainID (const Elem *elem, unsigned int side, const THREAD_ID tid) override
 
virtual void setNeighborSubdomainID (const Elem *elem, const THREAD_ID tid)
 
virtual void prepareAssembly (const THREAD_ID tid) override
 
virtual void prepareAssemblyNeighbor (const THREAD_ID tid)
 
virtual void addGhostedElem (dof_id_type elem_id) override
 
virtual void addGhostedBoundary (BoundaryID boundary_id) override
 
virtual void ghostGhostedBoundaries () override
 
virtual void sizeZeroes (unsigned int size, const THREAD_ID tid)
 
virtual bool reinitDirac (const Elem *elem, const THREAD_ID tid) override
 
virtual void reinitElem (const Elem *elem, const THREAD_ID tid) override
 
virtual void reinitElemPhys (const Elem *elem, const std::vector< Point > &phys_points_in_elem, const THREAD_ID tid) override
 
void reinitElemFace (const Elem *elem, unsigned int side, BoundaryID, const THREAD_ID tid)
 
virtual void reinitElemFace (const Elem *elem, unsigned int side, const THREAD_ID tid) override
 
virtual void reinitLowerDElem (const Elem *lower_d_elem, const THREAD_ID tid, const std::vector< Point > *const pts=nullptr, const std::vector< Real > *const weights=nullptr) override
 
virtual void reinitNode (const Node *node, const THREAD_ID tid) override
 
virtual void reinitNodeFace (const Node *node, BoundaryID bnd_id, const THREAD_ID tid) override
 
virtual void reinitNeighbor (const Elem *elem, unsigned int side, const THREAD_ID tid) override
 
virtual void reinitNeighborPhys (const Elem *neighbor, unsigned int neighbor_side, const std::vector< Point > &physical_points, const THREAD_ID tid) override
 
virtual void reinitNeighborPhys (const Elem *neighbor, const std::vector< Point > &physical_points, const THREAD_ID tid) override
 
virtual void reinitElemNeighborAndLowerD (const Elem *elem, unsigned int side, const THREAD_ID tid) override
 
virtual void reinitScalars (const THREAD_ID tid, bool reinit_for_derivative_reordering=false) override
 
virtual void reinitOffDiagScalars (const THREAD_ID tid) override
 
virtual void getDiracElements (std::set< const Elem * > &elems) override
 
virtual void clearDiracInfo () override
 
virtual void subdomainSetup (SubdomainID subdomain, const THREAD_ID tid)
 
virtual void neighborSubdomainSetup (SubdomainID subdomain, const THREAD_ID tid)
 
virtual void newAssemblyArray (std::vector< std::shared_ptr< SolverSystem > > &solver_systems)
 
virtual void initNullSpaceVectors (const InputParameters &parameters, std::vector< std::shared_ptr< NonlinearSystemBase > > &nl)
 
virtual void init () override
 
void initKokkos ()
 
virtual void solveLinearSystem (const unsigned int linear_sys_num, const Moose::PetscSupport::PetscOptions *po=nullptr)
 
virtual void setException (const std::string &message)
 
virtual bool hasException ()
 
virtual void checkExceptionAndStopSolve (bool print_message=true)
 
virtual unsigned int nNonlinearIterations (const unsigned int nl_sys_num) const override
 
virtual unsigned int nLinearIterations (const unsigned int nl_sys_num) const override
 
virtual Real finalNonlinearResidual (const unsigned int nl_sys_num) const override
 
virtual bool computingPreSMOResidual (const unsigned int nl_sys_num) const override
 
virtual std::string solverTypeString (unsigned int solver_sys_num=0)
 
virtual bool startedInitialSetup ()
 
virtual void onTimestepBegin () override
 
virtual void onTimestepEnd () override
 
virtual Real & time () const
 
virtual Real & timeOld () const
 
virtual Real & timeOlder () const
 
virtual int & timeStep () const
 
virtual Real & dt () const
 
virtual Real & dtOld () const
 
Real getTimeFromStateArg (const Moose::StateArg &state) const
 
virtual void transient (bool trans)
 
virtual bool isTransient () const override
 
virtual void addTimeIntegrator (const std::string &type, const std::string &name, InputParameters &parameters)
 
virtual void addPredictor (const std::string &type, const std::string &name, InputParameters &parameters)
 
virtual void copySolutionsBackwards ()
 
void skipNextForwardSolutionCopyToOld ()
 
virtual void advanceState ()
 
virtual void restoreSolutions ()
 
void backupGeometricSearchState ()
 
void restoreGeometricSearchState ()
 
virtual void saveOldSolutions ()
 
virtual void restoreOldSolutions ()
 
void needSolutionState (unsigned int oldest_needed, Moose::SolutionIterationType iteration_type)
 
bool hasSolutionState (unsigned int state, Moose::SolutionIterationType iteration_type) const
 
virtual void outputStep (ExecFlagType type)
 
virtual void postExecute ()
 
void forceOutput ()
 
virtual void initPetscOutputAndSomeSolverSettings ()
 
Moose::PetscSupport::PetscOptions & getPetscOptions ()
 
void logAdd (const std::string &system, const std::string &name, const std::string &type, const InputParameters &params) const
 
virtual void addFunction (const std::string &type, const std::string &name, InputParameters &parameters)
 
virtual bool hasFunction (const std::string &name, const THREAD_ID tid=0)
 
virtual Function & getFunction (const std::string &name, const THREAD_ID tid=0)
 
virtual void addKokkosFunction (const std::string &type, const std::string &name, InputParameters &parameters)
 
virtual bool hasKokkosFunction (const std::string &name) const
 
virtual Moose::Kokkos::Function getKokkosFunction (const std::string &name)
 
T & getKokkosFunction (const std::string &name)
 
virtual void addMeshDivision (const std::string &type, const std::string &name, InputParameters &params)
 
MeshDivision & getMeshDivision (const std::string &name, const THREAD_ID tid=0) const
 
virtual void addConvergence (const std::string &type, const std::string &name, InputParameters &parameters)
 
virtual Convergence & getConvergence (const std::string &name, const THREAD_ID tid=0) const
 
virtual const std::vector< std::shared_ptr< Convergence > > & getConvergenceObjects (const THREAD_ID tid=0) const
 
virtual bool hasConvergence (const std::string &name, const THREAD_ID tid=0) const
 
bool needToAddDefaultNonlinearConvergence () const
 
bool needToAddDefaultMultiAppFixedPointConvergence () const
 
bool needToAddDefaultSteadyStateConvergence () const
 
void setNeedToAddDefaultNonlinearConvergence ()
 
void setNeedToAddDefaultMultiAppFixedPointConvergence ()
 
void setNeedToAddDefaultSteadyStateConvergence ()
 
bool hasSetMultiAppFixedPointConvergenceName () const
 
bool hasSetSteadyStateConvergenceName () const
 
virtual void addDefaultNonlinearConvergence (const InputParameters &params)
 
virtual bool onlyAllowDefaultNonlinearConvergence () const
 
void addDefaultMultiAppFixedPointConvergence (const InputParameters &params)
 
void addDefaultSteadyStateConvergence (const InputParameters &params)
 
virtual void addLineSearch (const InputParameters &)
 
virtual void lineSearch ()
 
LineSearch * getLineSearch () override
 
virtual void addDistribution (const std::string &type, const std::string &name, InputParameters &parameters)
 
virtual bool hasDistribution (const std::string &name) const
 
virtual Distribution & getDistribution (const std::string &name)
 
virtual void addSampler (const std::string &type, const std::string &name, InputParameters &parameters)
 
virtual Sampler & getSampler (const std::string &name, const THREAD_ID tid=0)
 
NonlinearSystemBase & getNonlinearSystemBase (const unsigned int sys_num)
 
const NonlinearSystemBase & getNonlinearSystemBase (const unsigned int sys_num) const
 
void setCurrentNonlinearSystem (const unsigned int nl_sys_num)
 
NonlinearSystemBase & currentNonlinearSystem ()
 
const NonlinearSystemBase & currentNonlinearSystem () const
 
virtual const SystemBase & systemBaseNonlinear (const unsigned int sys_num) const override
 
virtual SystemBase & systemBaseNonlinear (const unsigned int sys_num) override
 
virtual const SystemBase & systemBaseSolver (const unsigned int sys_num) const override
 
virtual SystemBase & systemBaseSolver (const unsigned int sys_num) override
 
virtual const SystemBase & systemBaseAuxiliary () const override
 
virtual SystemBase & systemBaseAuxiliary () override
 
virtual NonlinearSystem & getNonlinearSystem (const unsigned int sys_num)
 
virtual const SystemBase & getSystemBase (const unsigned int sys_num) const
 
virtual SystemBase & getSystemBase (const unsigned int sys_num)
 
SystemBase & getSystemBase (const std::string &sys_name)
 
LinearSystem & getLinearSystem (unsigned int sys_num)
 
const LinearSystem & getLinearSystem (unsigned int sys_num) const
 
SolverSystem & getSolverSystem (unsigned int sys_num)
 
const SolverSystem & getSolverSystem (unsigned int sys_num) const
 
void setCurrentLinearSystem (unsigned int sys_num)
 
LinearSystem & currentLinearSystem ()
 
const LinearSystem & currentLinearSystem () const
 
virtual const SystemBase & systemBaseLinear (unsigned int sys_num) const override
 
virtual SystemBase & systemBaseLinear (unsigned int sys_num) override
 
virtual void addVariable (const std::string &var_type, const std::string &var_name, InputParameters &params)
 
virtual void addKernel (const std::string &kernel_name, const std::string &name, InputParameters &parameters)
 
virtual void addHDGKernel (const std::string &kernel_name, const std::string &name, InputParameters &parameters)
 
virtual void addNodalKernel (const std::string &kernel_name, const std::string &name, InputParameters &parameters)
 
virtual void addScalarKernel (const std::string &kernel_name, const std::string &name, InputParameters &parameters)
 
virtual void addBoundaryCondition (const std::string &bc_name, const std::string &name, InputParameters &parameters)
 
virtual void addKokkosKernel (const std::string &kernel_name, const std::string &name, InputParameters &parameters)
 
virtual void addKokkosNodalKernel (const std::string &kernel_name, const std::string &name, InputParameters &parameters)
 
virtual void addKokkosBoundaryCondition (const std::string &bc_name, const std::string &name, InputParameters &parameters)
 
virtual void addKokkosLinearFVKernel (const std::string &kernel_name, const std::string &name, InputParameters &parameters)
 
virtual void addKokkosLinearFVBC (const std::string &bc_name, const std::string &name, InputParameters &parameters)
 
virtual void addConstraint (const std::string &c_name, const std::string &name, InputParameters &parameters)
 
virtual void setInputParametersFEProblem (InputParameters &parameters)
 
virtual void addAuxVariable (const std::string &var_type, const std::string &var_name, InputParameters &params)
 
virtual void addAuxVariable (const std::string &var_name, const libMesh::FEType &type, const std::set< SubdomainID > *const active_subdomains=NULL)
 
virtual void addElementalFieldVariable (const std::string &var_type, const std::string &var_name, InputParameters &params)
 
virtual void addAuxArrayVariable (const std::string &var_name, const libMesh::FEType &type, unsigned int components, const std::set< SubdomainID > *const active_subdomains=NULL)
 
virtual void addAuxScalarVariable (const std::string &var_name, libMesh::Order order, Real scale_factor=1., const std::set< SubdomainID > *const active_subdomains=NULL)
 
virtual void addAuxKernel (const std::string &kernel_name, const std::string &name, InputParameters &parameters)
 
virtual void addAuxScalarKernel (const std::string &kernel_name, const std::string &name, InputParameters &parameters)
 
virtual void addKokkosAuxKernel (const std::string &kernel_name, const std::string &name, InputParameters &parameters)
 
AuxiliarySystem & getAuxiliarySystem ()
 
virtual void addDiracKernel (const std::string &kernel_name, const std::string &name, InputParameters &parameters)
 
virtual void addDGKernel (const std::string &kernel_name, const std::string &name, InputParameters &parameters)
 
virtual void addFVKernel (const std::string &kernel_name, const std::string &name, InputParameters &parameters)
 
virtual void addLinearFVKernel (const std::string &kernel_name, const std::string &name, InputParameters &parameters)
 
virtual void addFVBC (const std::string &fv_bc_name, const std::string &name, InputParameters &parameters)
 
virtual void addLinearFVBC (const std::string &fv_bc_name, const std::string &name, InputParameters &parameters)
 
virtual void addFVInterfaceKernel (const std::string &fv_ik_name, const std::string &name, InputParameters &parameters)
 
virtual void addInterfaceKernel (const std::string &kernel_name, const std::string &name, InputParameters &parameters)
 
virtual void addInitialCondition (const std::string &ic_name, const std::string &name, InputParameters &parameters)
 
virtual void addFVInitialCondition (const std::string &ic_name, const std::string &name, InputParameters &parameters)
 
void projectSolution ()
 
unsigned short getCurrentICState ()
 
void projectInitialConditionOnCustomRange (libMesh::ConstElemRange &elem_range, ConstBndNodeRange &bnd_node_range, const std::optional< std::set< VariableName > > &target_vars=std::nullopt)
 
void projectFunctionOnCustomRange (ConstElemRange &elem_range, Number(*func)(const Point &, const libMesh::Parameters &, const std::string &, const std::string &), Gradient(*func_grad)(const Point &, const libMesh::Parameters &, const std::string &, const std::string &), const libMesh::Parameters &params, const std::vector< VariableName > &target_vars)
 
virtual void addMaterial (const std::string &material_name, const std::string &name, InputParameters &parameters)
 
virtual void addMaterialHelper (std::vector< MaterialWarehouse * > warehouse, const std::string &material_name, const std::string &name, InputParameters &parameters)
 
virtual void addInterfaceMaterial (const std::string &material_name, const std::string &name, InputParameters &parameters)
 
virtual void addFunctorMaterial (const std::string &functor_material_name, const std::string &name, InputParameters &parameters)
 
virtual void addKokkosMaterial (const std::string &material_name, const std::string &name, InputParameters &parameters)
 
void prepareMaterials (const std::unordered_set< unsigned int > &consumer_needed_mat_props, const SubdomainID blk_id, const THREAD_ID tid)
 
void reinitMaterials (SubdomainID blk_id, const THREAD_ID tid, bool swap_stateful=true)
 
void reinitMaterialsFace (SubdomainID blk_id, const THREAD_ID tid, bool swap_stateful=true, const std::deque< MaterialBase * > *reinit_mats=nullptr)
 
void reinitMaterialsFaceOnBoundary (const BoundaryID boundary_id, const SubdomainID blk_id, const THREAD_ID tid, const bool swap_stateful=true, const std::deque< MaterialBase * > *const reinit_mats=nullptr)
 
void reinitMaterialsNeighborOnBoundary (const BoundaryID boundary_id, const SubdomainID blk_id, const THREAD_ID tid, const bool swap_stateful=true, const std::deque< MaterialBase * > *const reinit_mats=nullptr)
 
void reinitMaterialsNeighbor (SubdomainID blk_id, const THREAD_ID tid, bool swap_stateful=true, const std::deque< MaterialBase * > *reinit_mats=nullptr)
 
void reinitMaterialsBoundary (BoundaryID boundary_id, const THREAD_ID tid, bool swap_stateful=true, const std::deque< MaterialBase * > *reinit_mats=nullptr)
 
void reinitMaterialsInterface (BoundaryID boundary_id, const THREAD_ID tid, bool swap_stateful=true)
 
void prepareKokkosMaterials (const std::unordered_set< unsigned int > &consumer_needed_mat_props)
 
void reinitKokkosMaterials ()
 
virtual void swapBackMaterials (const THREAD_ID tid)
 
virtual void swapBackMaterialsFace (const THREAD_ID tid)
 
virtual void swapBackMaterialsNeighbor (const THREAD_ID tid)
 
void setActiveMaterialProperties (const std::unordered_set< unsigned int > &mat_prop_ids, const THREAD_ID tid)
 
bool hasActiveMaterialProperties (const THREAD_ID tid) const
 
void clearActiveMaterialProperties (const THREAD_ID tid)
 
std::vector< std::shared_ptr< T > > addObject (const std::string &type, const std::string &name, InputParameters &parameters, const bool threaded=true, const std::string &var_param_name="variable")
 
virtual void addPostprocessor (const std::string &pp_name, const std::string &name, InputParameters &parameters)
 
virtual void addVectorPostprocessor (const std::string &pp_name, const std::string &name, InputParameters &parameters)
 
virtual void addReporter (const std::string &type, const std::string &name, InputParameters &parameters)
 
virtual void addKokkosPostprocessor (const std::string &pp_name, const std::string &name, InputParameters &parameters)
 
virtual void addKokkosVectorPostprocessor (const std::string &pp_name, const std::string &name, InputParameters &parameters)
 
virtual void addKokkosReporter (const std::string &type, const std::string &name, InputParameters &parameters)
 
const ReporterData & getReporterData () const
 
ReporterData & getReporterData (ReporterData::WriteKey)
 
virtual std::vector< std::shared_ptr< UserObject > > addUserObject (const std::string &user_object_name, const std::string &name, InputParameters &parameters)
 
T & getUserObject (const std::string &name, unsigned int tid=0) const
 
const UserObject & getUserObjectBase (const std::string &name, const THREAD_ID tid=0) const
 
bool hasUserObject (const std::string &name) const
 
virtual void addKokkosUserObject (const std::string &user_object_name, const std::string &name, InputParameters &parameters)
 
const T & getKokkosUserObject (const std::string &name) const
 
bool hasKokkosUserObject (const std::string &name) const
 
void checkUserObjectNameCollision (const std::string &name, const std::string &type) const
 
const Positions & getPositionsObject (const std::string &name) const
 
virtual void addFVInterpolationMethod (const std::string &method_type, const std::string &name, InputParameters &parameters)
 
virtual void addFVGradientMethod (const std::string &method_type, const std::string &name, InputParameters &parameters)
 
FVGradientMethod & getFVGradientMethod (const GradientMethodName &name, const THREAD_ID tid=0)
 
const FVGradientMethod & getFVGradientMethod (const GradientMethodName &name, const THREAD_ID tid=0) const
 
bool hasFVGradientMethod (const GradientMethodName &name) const
 
const FVInterpolationMethod & getFVInterpolationMethod (const InterpolationMethodName &name, const THREAD_ID tid=0) const
 
const FVFaceInterpolationMethod & getFVFaceInterpolationMethod (const InterpolationMethodName &name, const THREAD_ID tid=0) const
 
const FVAdvectedInterpolationMethod & getFVAdvectedInterpolationMethod (const InterpolationMethodName &name, const THREAD_ID tid=0) const
 
bool hasFVInterpolationMethod (const InterpolationMethodName &name) const
 
bool hasPostprocessorValueByName (const PostprocessorName &name) const
 
const Postprocessor & getPostprocessorObjectByName (const PostprocessorName &object_name, const THREAD_ID tid=0) const
 
const PostprocessorValue & getPostprocessorValueByName (const PostprocessorName &name, std::size_t t_index=0) const
 
virtual const PostprocessorValue & getPostprocessorValueByName (const PostprocessorName &name) const
 
void setPostprocessorValueByName (const PostprocessorName &name, const PostprocessorValue &value, std::size_t t_index=0)
 
bool hasPostprocessor (const std::string &name) const
 
bool hasPostprocessor (const std::string &param_name, const unsigned int index=0) const
 
const VectorPostprocessorValue & getVectorPostprocessorValueByName (const std::string &object_name, const std::string &vector_name, std::size_t t_index=0) const
 
void setVectorPostprocessorValueByName (const std::string &object_name, const std::string &vector_name, const VectorPostprocessorValue &value, std::size_t t_index=0)
 
const VectorPostprocessor & getVectorPostprocessorObjectByName (const std::string &object_name, const THREAD_ID tid=0) const
 
virtual void addDamper (const std::string &damper_name, const std::string &name, InputParameters &parameters)
 
void setupDampers ()
 
bool hasDampers ()
 
virtual void addIndicator (const std::string &indicator_name, const std::string &name, InputParameters &parameters)
 
virtual void addMarker (const std::string &marker_name, const std::string &name, InputParameters &parameters)
 
virtual void addMultiApp (const std::string &multi_app_name, const std::string &name, InputParameters &parameters)
 
std::shared_ptr< MultiApp > getMultiApp (const std::string &multi_app_name) const
 
std::vector< std::shared_ptr< Transfer > > getTransfers (ExecFlagType type, Transfer::DIRECTION direction) const
 
std::vector< std::shared_ptr< Transfer > > getTransfers (Transfer::DIRECTION direction) const
 
const ExecuteMooseObjectWarehouse< Transfer > & getMultiAppTransferWarehouse (Transfer::DIRECTION direction) const
 
void execMultiAppTransfers (ExecFlagType type, Transfer::DIRECTION direction, const MultiAppName &source_app="")
 
bool execMultiApps (ExecFlagType type, bool auto_advance=true)
 
unsigned int numConcurrentMultiApps () const
 
void partitionConcurrentMultiApps ()
 
void finalizeMultiApps ()
 
void incrementMultiAppTStep (ExecFlagType type)
 
void advanceMultiApps (ExecFlagType type)
 
void finishMultiAppStep (ExecFlagType type, bool recurse_through_multiapp_levels=false)
 
void backupMultiApps (ExecFlagType type)
 
void restoreMultiApps (ExecFlagType type, bool force=false)
 
Real computeMultiAppsDT (ExecFlagType type)
 
virtual void addTransfer (const std::string &transfer_name, const std::string &name, InputParameters &parameters)
 
Real computeResidualL2Norm (NonlinearSystemBase &sys)
 
Real computeResidualL2Norm (LinearSystem &sys)
 
virtual Real computeResidualL2Norm ()
 
virtual void computeResidualSys (libMesh::NonlinearImplicitSystem &sys, const NumericVector< libMesh::Number > &soln, NumericVector< libMesh::Number > &residual)
 
void computeResidual (libMesh::NonlinearImplicitSystem &sys, const NumericVector< libMesh::Number > &soln, NumericVector< libMesh::Number > &residual)
 
virtual void computeResidual (const NumericVector< libMesh::Number > &soln, NumericVector< libMesh::Number > &residual, const unsigned int nl_sys_num)
 
void computeResidualAndJacobian (const NumericVector< libMesh::Number > &soln, NumericVector< libMesh::Number > &residual, libMesh::SparseMatrix< libMesh::Number > &jacobian)
 
virtual void computeResidualTag (const NumericVector< libMesh::Number > &soln, NumericVector< libMesh::Number > &residual, TagID tag)
 
virtual void computeResidualType (const NumericVector< libMesh::Number > &soln, NumericVector< libMesh::Number > &residual, TagID tag)
 
virtual void computeResidualInternal (const NumericVector< libMesh::Number > &soln, NumericVector< libMesh::Number > &residual, const std::set< TagID > &tags)
 
virtual void computeResidualTags (const std::set< TagID > &tags)
 
virtual void computeJacobianSys (libMesh::NonlinearImplicitSystem &sys, const NumericVector< libMesh::Number > &soln, libMesh::SparseMatrix< libMesh::Number > &jacobian)
 
virtual void computeJacobian (const NumericVector< libMesh::Number > &soln, libMesh::SparseMatrix< libMesh::Number > &jacobian, const unsigned int nl_sys_num)
 
virtual void computeJacobianTag (const NumericVector< libMesh::Number > &soln, libMesh::SparseMatrix< libMesh::Number > &jacobian, TagID tag)
 
virtual void computeJacobianInternal (const NumericVector< libMesh::Number > &soln, libMesh::SparseMatrix< libMesh::Number > &jacobian, const std::set< TagID > &tags)
 
virtual void computeJacobianTags (const std::set< TagID > &tags)
 
virtual void computeJacobianBlocks (std::vector< JacobianBlock * > &blocks, const unsigned int nl_sys_num)
 
virtual void computeJacobianBlock (libMesh::SparseMatrix< libMesh::Number > &jacobian, libMesh::System &precond_system, unsigned int ivar, unsigned int jvar)
 
virtual void computeLinearSystemSys (libMesh::LinearImplicitSystem &sys, libMesh::SparseMatrix< libMesh::Number > &system_matrix, NumericVector< libMesh::Number > &rhs, const bool compute_gradients=true)
 
void computeLinearSystemTags (const NumericVector< libMesh::Number > &soln, const std::set< TagID > &vector_tags, const std::set< TagID > &matrix_tags, const bool compute_gradients=true)
 
virtual Real computeDamping (const NumericVector< libMesh::Number > &soln, const NumericVector< libMesh::Number > &update)
 
virtual bool shouldUpdateSolution ()
 
virtual bool updateSolution (NumericVector< libMesh::Number > &vec_solution, NumericVector< libMesh::Number > &ghosted_solution)
 
virtual void predictorCleanup (NumericVector< libMesh::Number > &ghosted_solution)
 
virtual void computeBounds (libMesh::NonlinearImplicitSystem &sys, NumericVector< libMesh::Number > &lower, NumericVector< libMesh::Number > &upper)
 
virtual void computeNearNullSpace (libMesh::NonlinearImplicitSystem &sys, std::vector< NumericVector< libMesh::Number > * > &sp)
 
virtual void computeNullSpace (libMesh::NonlinearImplicitSystem &sys, std::vector< NumericVector< libMesh::Number > * > &sp)
 
virtual void computeTransposeNullSpace (libMesh::NonlinearImplicitSystem &sys, std::vector< NumericVector< libMesh::Number > * > &sp)
 
virtual void computePostCheck (libMesh::NonlinearImplicitSystem &sys, const NumericVector< libMesh::Number > &old_soln, NumericVector< libMesh::Number > &search_direction, NumericVector< libMesh::Number > &new_soln, bool &changed_search_direction, bool &changed_new_soln)
 
virtual void computeIndicatorsAndMarkers ()
 
virtual void computeIndicators ()
 
virtual void computeMarkers ()
 
virtual void addResidual (const THREAD_ID tid) override
 
virtual void addResidualNeighbor (const THREAD_ID tid) override
 
virtual void addResidualLower (const THREAD_ID tid) override
 
virtual void addResidualScalar (const THREAD_ID tid=0)
 
virtual void cacheResidual (const THREAD_ID tid) override
 
virtual void cacheResidualNeighbor (const THREAD_ID tid) override
 
virtual void addCachedResidual (const THREAD_ID tid) override
 
virtual void addCachedResidualDirectly (NumericVector< libMesh::Number > &residual, const THREAD_ID tid)
 
virtual void setResidual (NumericVector< libMesh::Number > &residual, const THREAD_ID tid) override
 
virtual void setResidual (libMesh::NumericVector< libMesh::Number > &residual, const THREAD_ID tid)=0
 
virtual void setResidualNeighbor (NumericVector< libMesh::Number > &residual, const THREAD_ID tid) override
 
virtual void setResidualNeighbor (libMesh::NumericVector< libMesh::Number > &residual, const THREAD_ID tid)=0
 
virtual void addJacobian (const THREAD_ID tid) override
 
virtual void addJacobianNeighbor (const THREAD_ID tid) override
 
virtual void addJacobianNeighbor (libMesh::SparseMatrix< libMesh::Number > &jacobian, unsigned int ivar, unsigned int jvar, const DofMap &dof_map, std::vector< dof_id_type > &dof_indices, std::vector< dof_id_type > &neighbor_dof_indices, const std::set< TagID > &tags, const THREAD_ID tid) override
 
virtual void addJacobianNeighbor (libMesh::SparseMatrix< libMesh::Number > &jacobian, unsigned int ivar, unsigned int jvar, const libMesh::DofMap &dof_map, std::vector< dof_id_type > &dof_indices, std::vector< dof_id_type > &neighbor_dof_indices, const std::set< TagID > &tags, const THREAD_ID tid)=0
 
virtual void addJacobianNeighborLowerD (const THREAD_ID tid) override
 
virtual void addJacobianLowerD (const THREAD_ID tid) override
 
virtual void addJacobianBlockTags (libMesh::SparseMatrix< libMesh::Number > &jacobian, unsigned int ivar, unsigned int jvar, const DofMap &dof_map, std::vector< dof_id_type > &dof_indices, const std::set< TagID > &tags, const THREAD_ID tid)
 
virtual void addJacobianScalar (const THREAD_ID tid=0)
 
virtual void addJacobianOffDiagScalar (unsigned int ivar, const THREAD_ID tid=0)
 
virtual void cacheJacobian (const THREAD_ID tid) override
 
virtual void cacheJacobianNeighbor (const THREAD_ID tid) override
 
virtual void addCachedJacobian (const THREAD_ID tid) override
 
virtual void prepareShapes (unsigned int var, const THREAD_ID tid) override
 
virtual void prepareFaceShapes (unsigned int var, const THREAD_ID tid) override
 
virtual void prepareNeighborShapes (unsigned int var, const THREAD_ID tid) override
 
virtual void addDisplacedProblem (std::shared_ptr< DisplacedProblem > displaced_problem)
 
virtual std::shared_ptr< const DisplacedProblem > getDisplacedProblem () const
 
virtual std::shared_ptr< DisplacedProblem > getDisplacedProblem ()
 
virtual void updateGeomSearch (GeometricSearchData::GeometricSearchType type=GeometricSearchData::ALL) override
 
virtual void updateMortarMesh ()
 
void createMortarInterface (const std::pair< BoundaryID, BoundaryID > &primary_secondary_boundary_pair, const std::pair< SubdomainID, SubdomainID > &primary_secondary_subdomain_pair, bool on_displaced, bool periodic, const bool debug, const bool correct_edge_dropping, const Real minimum_projection_angle, const Mortar3DSubpatchPlane mortar_3d_subpatch_plane, const MooseEnum &triangulation, const bool triangulate_triangles, const Mortar3DQuadraturePointMapping mortar_3d_qp_mapping=Mortar3DQuadraturePointMapping::NORMAL_PROJECTION)
 
const std::unordered_map< std::pair< BoundaryID, BoundaryID >, MortarInterfaceConfig > & getMortarInterfaces (bool on_displaced) const
 
virtual void possiblyRebuildGeomSearchPatches ()
 
virtual GeometricSearchData & geomSearchData () override
 
void setRestartFile (const std::string &file_name)
 
const MaterialPropertyRegistry & getMaterialPropertyRegistry () const
 
const InitialConditionWarehouse & getInitialConditionWarehouse () const
 
const FVInitialConditionWarehouse & getFVInitialConditionWarehouse () const
 
SolverParams & solverParams (unsigned int solver_sys_num=0)
 
const SolverParams & solverParams (unsigned int solver_sys_num=0) const
 
Adaptivity & adaptivity ()
 
virtual void initialAdaptMesh ()
 
virtual bool adaptMesh ()
 
unsigned int getNumCyclesCompleted ()
 
bool hasInitialAdaptivity () const
 
bool hasInitialAdaptivity () const
 
void initXFEM (std::shared_ptr< XFEMInterface > xfem)
 
std::shared_ptr< XFEMInterface > getXFEM ()
 
bool haveXFEM ()
 
virtual bool updateMeshXFEM ()
 
virtual bool allowMeshContractionAfterMeshChanged () const
 
virtual void meshChanged (bool intermediate_change, bool contract_mesh, bool clean_refinement_flags)
 
void notifyWhenMeshChanges (MeshChangedInterface *mci)
 
void notifyWhenMeshDisplaces (MeshDisplacedInterface *mdi)
 
void initElementStatefulProps (const libMesh::ConstElemRange &elem_range, const bool threaded)
 
void initKokkosStatefulProps ()
 
virtual void checkProblemIntegrity ()
 
void registerRandomInterface (RandomInterface &random_interface, const std::string &name)
 
void setConstJacobian (bool state)
 
void setKernelCoverageCheck (CoverageCheckMode mode)
 
void setKernelCoverageCheck (bool flag)
 
void setKernelCoverageCheck (CoverageCheckMode mode)
 
void setMaterialCoverageCheck (CoverageCheckMode mode)
 
void setMaterialCoverageCheck (bool flag)
 
void setMaterialCoverageCheck (CoverageCheckMode mode)
 
void setParallelBarrierMessaging (bool flag)
 
void setVerboseProblem (bool verbose)
 
bool verboseMultiApps () const
 
void parentOutputPositionChanged ()
 
unsigned int subspaceDim (const std::string &prefix) const
 
const MooseObjectWarehouse< Function > & getFunctionWarehouse ()
 
const MaterialWarehouse & getMaterialWarehouse () const
 
const MaterialWarehouse & getRegularMaterialsWarehouse () const
 
const MaterialWarehouse & getDiscreteMaterialWarehouse () const
 
const MaterialWarehouse & getInterfaceMaterialsWarehouse () const
 
const MaterialWarehouse & getKokkosMaterialsWarehouse () const
 
std::shared_ptr< MaterialBase > getMaterial (std::string name, Moose::MaterialDataType type, const THREAD_ID tid=0, bool no_warn=false)
 
MaterialData & getMaterialData (Moose::MaterialDataType type, const THREAD_ID tid=0, const MooseObject *object=nullptr) const
 
MaterialData & getKokkosMaterialData (Moose::MaterialDataType type, const MooseObject *object=nullptr) const
 
const std::set< const MooseObject * > & getMaterialPropertyStorageConsumers (Moose::MaterialDataType type) const
 
const std::set< const MooseObject * > & getKokkosMaterialPropertyStorageConsumers (Moose::MaterialDataType type) const
 
bool restoreOriginalNonzeroPattern () const
 
bool errorOnJacobianNonzeroReallocation () const
 
void setErrorOnJacobianNonzeroReallocation (bool state)
 
bool preserveMatrixSparsityPattern () const
 
void setPreserveMatrixSparsityPattern (bool preserve)
 
bool ignoreZerosInJacobian () const
 
void setIgnoreZerosInJacobian (bool state)
 
bool acceptInvalidSolution () const
 
bool allowInvalidSolution () const
 
bool showInvalidSolutionConsole () const
 
bool immediatelyPrintInvalidSolution () const
 
bool hasTimeIntegrator () const
 
virtual void execute (const ExecFlagType &exec_type)
 
virtual void executeAllObjects (const ExecFlagType &exec_type)
 
virtual Executor & getExecutor (const std::string &name)
 
virtual void computeUserObjects (const ExecFlagType &type, const Moose::AuxGroup &group)
 
virtual void computeUserObjectByName (const ExecFlagType &type, const Moose::AuxGroup &group, const std::string &name)
 
void needsPreviousNewtonIteration (bool state)
 
bool needsPreviousNewtonIteration () const
 
void needsPreviousMultiAppFixedPointIterationSolution (bool needed, const unsigned int solver_sys_num)
 
bool needsPreviousMultiAppFixedPointIterationSolution (const unsigned int solver_sys_num) const
 
void needsPreviousMultiAppFixedPointIterationAuxiliary (bool state)
 
bool needsPreviousMultiAppFixedPointIterationAuxiliary () const
 
void needsPreviousMultiSystemFixedPointIterationSolution (bool needed, const unsigned int solver_sys_num)
 
bool needsPreviousMultiSystemFixedPointIterationSolution (const unsigned int solver_sys_num) const
 
void needsPreviousMultiSystemFixedPointIterationAuxiliary (bool state)
 
bool needsPreviousMultiSystemFixedPointIterationAuxiliary () const
 
ExecuteMooseObjectWarehouse< Control > & getControlWarehouse ()
 
void executeControls (const ExecFlagType &exec_type)
 
void executeSamplers (const ExecFlagType &exec_type)
 
virtual void updateActiveObjects ()
 
void reportMooseObjectDependency (MooseObject *a, MooseObject *b)
 
ExecuteMooseObjectWarehouse< MultiApp > & getMultiAppWarehouse ()
 
bool hasJacobian () const
 
bool constJacobian () const
 
void addOutput (const std::string &, const std::string &, InputParameters &)
 
TheWarehouse & theWarehouse () const
 
void setSNESMFReuseBase (bool reuse, bool set_by_user)
 
bool useSNESMFReuseBase ()
 
void skipExceptionCheck (bool skip_exception_check)
 
bool isSNESMFReuseBaseSetbyUser ()
 
bool & petscOptionsInserted ()
 
PetscOptions & petscOptionsDatabase ()
 
virtual void setUDotRequested (const bool u_dot_requested)
 
virtual void setUDotDotRequested (const bool u_dotdot_requested)
 
virtual void setUDotOldRequested (const bool u_dot_old_requested)
 
virtual void setUDotDotOldRequested (const bool u_dotdot_old_requested)
 
virtual bool uDotRequested ()
 
virtual bool uDotDotRequested ()
 
virtual bool uDotOldRequested ()
 
virtual bool uDotDotOldRequested ()
 
void haveADObjects (bool have_ad_objects) override
 
virtual void haveADObjects (bool have_ad_objects)
 
bool haveADObjects () const
 
bool shouldSolve () const
 
const MortarInterfaceWarehouse & mortarData () const
 
MortarInterfaceWarehouse & mortarData ()
 
virtual bool hasNeighborCoupling () const
 
virtual bool hasMortarCoupling () const
 
void computingNonlinearResid (bool computing_nonlinear_residual) final
 
bool computingNonlinearResid () const
 
virtual void computingNonlinearResid (const bool computing_nonlinear_residual)
 
void setCurrentlyComputingResidual (bool currently_computing_residual) final
 
void numGridSteps (unsigned int num_grid_steps)
 
void uniformRefine ()
 
void automaticScaling (bool automatic_scaling) override
 
virtual void automaticScaling (bool automatic_scaling)
 
bool automaticScaling () const
 
virtual void reinitElemFaceRef (const Elem *elem, unsigned int side, Real tolerance, const std::vector< Point > *const pts, const std::vector< Real > *const weights=nullptr, const THREAD_ID tid=0) override
 
virtual void reinitNeighborFaceRef (const Elem *neighbor_elem, unsigned int neighbor_side, Real tolerance, const std::vector< Point > *const pts, const std::vector< Real > *const weights=nullptr, const THREAD_ID tid=0) override
 
bool fvBCsIntegrityCheck () const
 
void fvBCsIntegrityCheck (bool fv_bcs_integrity_check)
 
bool sideUOInterfaceMatPropIntegrityCheck () const
 
void getFVMatsAndDependencies (SubdomainID block_id, std::vector< std::shared_ptr< MaterialBase > > &face_materials, std::vector< std::shared_ptr< MaterialBase > > &neighbor_materials, std::set< MooseVariableFieldBase * > &variables, const THREAD_ID tid)
 
void resizeMaterialData (Moose::MaterialDataType data_type, unsigned int nqp, const THREAD_ID tid)
 
bool haveDisplaced () const override final
 
bool hasLinearConvergenceObjects () const
 
void setNonlinearConvergenceNames (const std::vector< ConvergenceName > &convergence_names)
 
void setLinearConvergenceNames (const std::vector< ConvergenceName > &convergence_names)
 
void setMultiAppFixedPointConvergenceName (const ConvergenceName &convergence_name)
 
void setSteadyStateConvergenceName (const ConvergenceName &convergence_name)
 
const std::vector< ConvergenceName > & getNonlinearConvergenceNames () const
 
const std::vector< ConvergenceName > & getLinearConvergenceNames () const
 
const ConvergenceName & getMultiAppFixedPointConvergenceName () const
 
const ConvergenceName & getSteadyStateConvergenceName () const
 
void computingScalingJacobian (bool computing_scaling_jacobian)
 
bool computingScalingJacobian () const override final
 
void computingScalingResidual (bool computing_scaling_residual)
 
bool computingScalingResidual () const override final
 
MooseAppCoordTransform & coordTransform ()
 
virtual std::size_t numNonlinearSystems () const override
 
virtual std::size_t numLinearSystems () const override
 
virtual std::size_t numSolverSystems () const override
 
bool isSolverSystemNonlinear (const unsigned int sys_num)
 
virtual unsigned int currentNlSysNum () const override
 
virtual unsigned int currentLinearSysNum () const override
 
virtual unsigned int nlSysNum (const NonlinearSystemName &nl_sys_name) const override
 
unsigned int linearSysNum (const LinearSystemName &linear_sys_name) const override
 
unsigned int solverSysNum (const SolverSystemName &solver_sys_name) const override
 
unsigned int systemNumForVariable (const VariableName &variable_name) const
 
bool getFailNextNonlinearConvergenceCheck () const
 
bool getFailNextSystemConvergenceCheck () const
 
void setFailNextNonlinearConvergenceCheck ()
 
void setFailNextSystemConvergenceCheck ()
 
void resetFailNextNonlinearConvergenceCheck ()
 
void resetFailNextSystemConvergenceCheck ()
 
void setExecutionPrinting (const ExecFlagEnum &print_exec)
 
bool shouldPrintExecution (const THREAD_ID tid) const
 
void reinitMortarUserObjects (BoundaryID primary_boundary_id, BoundaryID secondary_boundary_id, bool displaced)
 
virtual const std::vector< VectorTag > & currentResidualVectorTags () const override
 
void setCurrentResidualVectorTags (const std::set< TagID > &vector_tags)
 
void clearCurrentResidualVectorTags ()
 
void clearCurrentJacobianMatrixTags ()
 
virtual void needFV () override
 
virtual bool haveFV () const override
 
virtual bool hasNonlocalCoupling () const override
 
bool identifyVariableGroupsInNL () const
 
virtual void setCurrentLowerDElem (const Elem *const lower_d_elem, const THREAD_ID tid) override
 
virtual void setCurrentBoundaryID (BoundaryID bid, const THREAD_ID tid) override
 
const std::vector< NonlinearSystemName > & getNonlinearSystemNames () const
 
const std::vector< LinearSystemName > & getLinearSystemNames () const
 
const std::vector< SolverSystemName > & getSolverSystemNames () const
 
virtual const libMesh::CouplingMatrix & nonlocalCouplingMatrix (const unsigned i) const override
 
virtual bool checkNonlocalCouplingRequirement () const override
 
virtual Moose::FEBackend feBackend () const
 
void createTagMatrices (CreateTaggedMatrixKey)
 
bool useHashTableMatrixAssembly () const
 
bool hasKokkosObjects () const
 
bool hasKokkosResidualObjects () const
 
void addKokkosMeshInitializationHook (std::function< void()> function)
 
const bool & currentlyComputingResidual () const
 
THREAD_ID numThreads () const
 
virtual bool nlConverged (const unsigned int nl_sys_num)
 
virtual bool converged (const unsigned int sys_num)
 
bool defaultGhosting ()
 
virtual TagID addVectorTag (const TagName &tag_name, const Moose::VectorTagType type=Moose::VECTOR_TAG_RESIDUAL)
 
void addNotZeroedVectorTag (const TagID tag)
 
bool vectorTagNotZeroed (const TagID tag) const
 
virtual const VectorTag & getVectorTag (const TagID tag_id) const
 
std::vector< VectorTag > getVectorTags (const std::set< TagID > &tag_ids) const
 
virtual const std::vector< VectorTag > & getVectorTags (const Moose::VectorTagType type=Moose::VECTOR_TAG_ANY) const
 
virtual TagID getVectorTagID (const TagName &tag_name) const
 
virtual TagName vectorTagName (const TagID tag) const
 
virtual bool vectorTagExists (const TagID tag_id) const
 
virtual bool vectorTagExists (const TagName &tag_name) const
 
virtual unsigned int numVectorTags (const Moose::VectorTagType type=Moose::VECTOR_TAG_ANY) const
 
virtual Moose::VectorTagType vectorTagType (const TagID tag_id) const
 
virtual TagID addMatrixTag (TagName tag_name)
 
virtual TagID getMatrixTagID (const TagName &tag_name) const
 
virtual TagName matrixTagName (TagID tag)
 
virtual bool matrixTagExists (const TagName &tag_name) const
 
virtual bool matrixTagExists (TagID tag_id) const
 
virtual unsigned int numMatrixTags () const
 
virtual std::map< TagName, TagID > & getMatrixTags ()
 
virtual bool hasLinearVariable (const std::string &var_name) const
 
virtual bool hasAuxiliaryVariable (const std::string &var_name) const
 
virtual const std::set< MooseVariableFieldBase * > & getActiveElementalMooseVariables (const THREAD_ID tid) const
 
virtual bool hasActiveElementalMooseVariables (const THREAD_ID tid) const
 
Moose::CoordinateSystemType getCoordSystem (SubdomainID sid) const
 
unsigned int getAxisymmetricRadialCoord () const
 
virtual DiracKernelInfo & diracKernelInfo ()
 
void reinitNodes (const std::vector< dof_id_type > &nodes, const THREAD_ID tid)
 
void reinitNodesNeighbor (const std::vector< dof_id_type > &nodes, const THREAD_ID tid)
 
void reinitNeighborLowerDElem (const Elem *elem, const THREAD_ID tid=0)
 
void reinitMortarElem (const Elem *elem, const THREAD_ID tid=0)
 
void reinitGeomSearch ()
 
virtual void storeSubdomainMatPropName (SubdomainID block_id, const std::string &name)
 
virtual void storeBoundaryMatPropName (BoundaryID boundary_id, const std::string &name)
 
virtual void storeSubdomainZeroMatProp (SubdomainID block_id, const MaterialPropertyName &name)
 
virtual void storeBoundaryZeroMatProp (BoundaryID boundary_id, const MaterialPropertyName &name)
 
virtual void storeSubdomainDelayedCheckMatProp (const std::string &requestor, SubdomainID block_id, const std::string &name)
 
virtual void storeBoundaryDelayedCheckMatProp (const std::string &requestor, BoundaryID boundary_id, const std::string &name)
 
virtual void checkBlockMatProps ()
 
virtual void checkBoundaryMatProps ()
 
virtual void markMatPropRequested (const std::string &)
 
virtual bool isMatPropRequested (const std::string &prop_name) const
 
void addConsumedPropertyName (const MooseObjectName &obj_name, const std::string &prop_name)
 
const std::map< MooseObjectName, std::set< std::string > > & getConsumedPropertyMap () const
 
virtual std::set< SubdomainID > getMaterialPropertyBlocks (const std::string &prop_name)
 
virtual std::vector< SubdomainName > getMaterialPropertyBlockNames (const std::string &prop_name)
 
virtual bool hasBlockMaterialProperty (SubdomainID block_id, const std::string &prop_name)
 
virtual std::set< BoundaryID > getMaterialPropertyBoundaryIDs (const std::string &prop_name)
 
virtual std::vector< BoundaryName > getMaterialPropertyBoundaryNames (const std::string &prop_name)
 
virtual bool hasBoundaryMaterialProperty (BoundaryID boundary_id, const std::string &prop_name)
 
virtual std::set< dof_id_type > & ghostedElems ()
 
const bool & currentlyComputingJacobian () const
 
void setCurrentlyComputingJacobian (const bool currently_computing_jacobian)
 
const bool & currentlyComputingResidualAndJacobian () const
 
void setCurrentlyComputingResidualAndJacobian (bool currently_computing_residual_and_jacobian)
 
virtual bool safeAccessTaggedMatrices () const
 
virtual bool safeAccessTaggedVectors () const
 
const std::set< TagID > & getActiveScalarVariableCoupleableVectorTags (const THREAD_ID tid) const
 
const std::set< TagID > & getActiveScalarVariableCoupleableMatrixTags (const THREAD_ID tid) const
 
const std::set< TagID > & getActiveFEVariableCoupleableVectorTags (const THREAD_ID tid) const
 
const std::set< TagID > & getActiveFEVariableCoupleableMatrixTags (const THREAD_ID tid) const
 
void addAlgebraicGhostingFunctor (libMesh::GhostingFunctor &algebraic_gf, bool to_mesh=true)
 
void addCouplingGhostingFunctor (libMesh::GhostingFunctor &coupling_gf, bool to_mesh=true)
 
void removeAlgebraicGhostingFunctor (libMesh::GhostingFunctor &algebraic_gf)
 
void removeCouplingGhostingFunctor (libMesh::GhostingFunctor &coupling_gf)
 
void clearAllDofIndices ()
 
const Moose::Functor< T > & getFunctor (const std::string &name, const THREAD_ID tid, const std::string &requestor_name, bool requestor_is_ad)
 
bool hasFunctor (const std::string &name, const THREAD_ID tid) const
 
bool hasFunctorWithType (const std::string &name, const THREAD_ID tid) const
 
void addFunctor (const std::string &name, const Moose::FunctorBase< T > &functor, const THREAD_ID tid)
 
const Moose::FunctorBase< T > & addPiecewiseByBlockLambdaFunctor (const std::string &name, PolymorphicLambda my_lammy, const std::set< ExecFlagType > &clearance_schedule, const MooseMesh &mesh, const std::set< SubdomainID > &block_ids, const THREAD_ID tid)
 
void setFunctorOutput (bool set_output)
 
void setChainControlDataOutput (bool set_output)
 
void registerUnfilledFunctorRequest (T *functor_interface, const std::string &functor_name, const THREAD_ID tid)
 
void reinitFVFace (const THREAD_ID tid, const FaceInfo &fi)
 
void preparePRefinement ()
 
bool doingPRefinement () const
 
MooseVariableFEBase & getVariableHelper (const THREAD_ID tid, const std::string &var_name, Moose::VarKindType expected_var_type, Moose::VarFieldType expected_var_field_type, const std::vector< T > &systems, const SystemBase &aux) const
 
void _setCLIOption ()
 
virtual void terminateSolve ()
 
virtual bool isSolveTerminationRequested () const
 
const ConsoleStream & console () const
 
virtual bool enabled () const
 
std::shared_ptr< MooseObject > getSharedPtr ()
 
std::shared_ptr< const MooseObject > getSharedPtr () const
 
bool isKokkosObject () const
 
MooseApp & getMooseApp () const
 
const std::string & type () const
 
const std::string & name () const
 
std::string typeAndName () const
 
MooseObjectParameterName uniqueParameterName (const std::string &parameter_name) const
 
MooseObjectName uniqueName () const
 
const InputParameters & parameters () const
 
const hit::Node * getHitNode () const
 
bool hasBase () const
 
const std::string & getBase () const
 
const T & getParam (const std::string &name) const
 
std::vector< std::pair< T1, T2 > > getParam (const std::string &param1, const std::string &param2) const
 
const T * queryParam (const std::string &name) const
 
const T & getRenamedParam (const std::string &old_name, const std::string &new_name) const
 
T getCheckedPointerParam (const std::string &name, const std::string &error_string="") const
 
bool isParamValid (const std::string &name) const
 
bool isParamSetByUser (const std::string &name) const
 
void connectControllableParams (const std::string &parameter, const std::string &object_type, const std::string &object_name, const std::string &object_parameter) const
 
void paramError (const std::string &param, Args... args) const
 
void paramWarning (const std::string &param, Args... args) const
 
void paramWarning (const std::string &param, Args... args) const
 
void paramInfo (const std::string &param, Args... args) const
 
std::string messagePrefix (const bool hit_prefix=true) const
 
std::string errorPrefix (const std::string &) const
 
void mooseError (Args &&... args) const
 
void mooseDocumentedError (const std::string &repo_name, const unsigned int issue_num, Args &&... args) const
 
void mooseErrorNonPrefixed (Args &&... args) const
 
void mooseWarning (Args &&... args) const
 
void mooseWarning (Args &&... args) const
 
void mooseWarningNonPrefixed (Args &&... args) const
 
void mooseWarningNonPrefixed (Args &&... args) const
 
void mooseDeprecated (Args &&... args) const
 
void mooseDeprecated (Args &&... args) const
 
void mooseDeprecatedNoTrace (Args &&... args) const
 
void mooseInfo (Args &&... args) const
 
void callMooseError (std::string msg, const bool with_prefix, const hit::Node *node=nullptr, const bool show_trace=true) const
 
std::string getDataFileName (const std::string &param) const
 
std::string getDataFileNameByName (const std::string &relative_path) const
 
std::string getDataFilePath (const std::string &relative_path) const
 
PerfGraph & perfGraph ()
 
const libMesh::ConstElemRange & getEvaluableElementRange ()
 
const libMesh::ConstElemRange & getEvaluableElementRange ()
 
const libMesh::ConstElemRange & getNonlinearEvaluableElementRange ()
 
const libMesh::ConstElemRange & getNonlinearEvaluableElementRange ()
 
const libMesh::ConstElemRange & getCurrentAlgebraicElementRange ()
 
const libMesh::ConstElemRange & getCurrentAlgebraicElementRange ()
 
const libMesh::ConstNodeRange & getCurrentAlgebraicNodeRange ()
 
const libMesh::ConstNodeRange & getCurrentAlgebraicNodeRange ()
 
const ConstBndNodeRange & getCurrentAlgebraicBndNodeRange ()
 
const ConstBndNodeRange & getCurrentAlgebraicBndNodeRange ()
 
void setCurrentAlgebraicElementRange (libMesh::ConstElemRange *range)
 
void setCurrentAlgebraicElementRange (libMesh::ConstElemRange *range)
 
void setCurrentAlgebraicNodeRange (libMesh::ConstNodeRange *range)
 
void setCurrentAlgebraicNodeRange (libMesh::ConstNodeRange *range)
 
void setCurrentAlgebraicBndNodeRange (ConstBndNodeRange *range)
 
void setCurrentAlgebraicBndNodeRange (ConstBndNodeRange *range)
 
void allowOutput (bool state)
 
void allowOutput (bool state)
 
void allowOutput (bool state)
 
void allowOutput (bool state)
 
Moose::Kokkos::Array< Moose::Kokkos::System > & getKokkosSystems ()
 
const Moose::Kokkos::Array< Moose::Kokkos::System > & getKokkosSystems () const
 
Moose::Kokkos::Array< Moose::Kokkos::System > & getKokkosSystems ()
 
const Moose::Kokkos::Array< Moose::Kokkos::System > & getKokkosSystems () const
 
Moose::Kokkos::Array< Moose::Kokkos::FESystem > & getKokkosFESystems ()
 
const Moose::Kokkos::Array< Moose::Kokkos::FESystem > & getKokkosFESystems () const
 
Moose::Kokkos::Array< Moose::Kokkos::FESystem > & getKokkosFESystems ()
 
const Moose::Kokkos::Array< Moose::Kokkos::FESystem > & getKokkosFESystems () const
 
Moose::Kokkos::System & getKokkosSystem (const unsigned int sys_num)
 
const Moose::Kokkos::System & getKokkosSystem (const unsigned int sys_num) const
 
Moose::Kokkos::System & getKokkosSystem (const unsigned int sys_num)
 
const Moose::Kokkos::System & getKokkosSystem (const unsigned int sys_num) const
 
Moose::Kokkos::FESystem & getKokkosFESystem (const unsigned int sys_num)
 
const Moose::Kokkos::FESystem & getKokkosFESystem (const unsigned int sys_num) const
 
Moose::Kokkos::FESystem & getKokkosFESystem (const unsigned int sys_num)
 
const Moose::Kokkos::FESystem & getKokkosFESystem (const unsigned int sys_num) const
 
bool hasMultiApps () const
 
bool hasMultiApps (ExecFlagType type) const
 
bool hasMultiApps () const
 
bool hasMultiApps (ExecFlagType type) const
 
bool hasMultiApp (const std::string &name) const
 
bool hasMultiApp (const std::string &name) const
 
const AutomaticMortarGeneration & getMortarInterface (const std::pair< BoundaryID, BoundaryID > &primary_secondary_boundary_pair, const std::pair< SubdomainID, SubdomainID > &primary_secondary_subdomain_pair, bool on_displaced) const
 
AutomaticMortarGeneration & getMortarInterface (const std::pair< BoundaryID, BoundaryID > &primary_secondary_boundary_pair, const std::pair< SubdomainID, SubdomainID > &primary_secondary_subdomain_pair, bool on_displaced)
 
const AutomaticMortarGeneration & getMortarInterface (const std::pair< BoundaryID, BoundaryID > &primary_secondary_boundary_pair, const std::pair< SubdomainID, SubdomainID > &primary_secondary_subdomain_pair, bool on_displaced) const
 
AutomaticMortarGeneration & getMortarInterface (const std::pair< BoundaryID, BoundaryID > &primary_secondary_boundary_pair, const std::pair< SubdomainID, SubdomainID > &primary_secondary_subdomain_pair, bool on_displaced)
 
const MaterialPropertyStorage & getMaterialPropertyStorage ()
 
const MaterialPropertyStorage & getMaterialPropertyStorage ()
 
const MaterialPropertyStorage & getBndMaterialPropertyStorage ()
 
const MaterialPropertyStorage & getBndMaterialPropertyStorage ()
 
const MaterialPropertyStorage & getNeighborMaterialPropertyStorage ()
 
const MaterialPropertyStorage & getNeighborMaterialPropertyStorage ()
 
Moose::Kokkos::MaterialPropertyStorage & getKokkosMaterialPropertyStorage ()
 
Moose::Kokkos::MaterialPropertyStorage & getKokkosMaterialPropertyStorage ()
 
Moose::Kokkos::MaterialPropertyStorage & getKokkosBndMaterialPropertyStorage ()
 
Moose::Kokkos::MaterialPropertyStorage & getKokkosBndMaterialPropertyStorage ()
 
Moose::Kokkos::MaterialPropertyStorage & getKokkosNeighborMaterialPropertyStorage ()
 
Moose::Kokkos::MaterialPropertyStorage & getKokkosNeighborMaterialPropertyStorage ()
 
const MooseObjectWarehouse< Indicator > & getIndicatorWarehouse ()
 
const MooseObjectWarehouse< Indicator > & getIndicatorWarehouse ()
 
const MooseObjectWarehouse< InternalSideIndicatorBase > & getInternalSideIndicatorWarehouse ()
 
const MooseObjectWarehouse< InternalSideIndicatorBase > & getInternalSideIndicatorWarehouse ()
 
const MooseObjectWarehouse< Marker > & getMarkerWarehouse ()
 
const MooseObjectWarehouse< Marker > & getMarkerWarehouse ()
 
bool needBoundaryMaterialOnSide (BoundaryID bnd_id, const THREAD_ID tid)
 
bool needBoundaryMaterialOnSide (BoundaryID bnd_id, const THREAD_ID tid)
 
bool needInterfaceMaterialOnSide (BoundaryID bnd_id, const THREAD_ID tid)
 
bool needInterfaceMaterialOnSide (BoundaryID bnd_id, const THREAD_ID tid)
 
bool needInternalNeighborSideMaterial (SubdomainID subdomain_id, const THREAD_ID tid)
 
bool needInternalNeighborSideMaterial (SubdomainID subdomain_id, const THREAD_ID tid)
 
const ExecFlagType & getCurrentExecuteOnFlag () const
 
const ExecFlagType & getCurrentExecuteOnFlag () const
 
void setCurrentExecuteOnFlag (const ExecFlagType &)
 
void setCurrentExecuteOnFlag (const ExecFlagType &)
 
const Parallel::Communicator & comm () const
 
processor_id_type n_processors () const
 
processor_id_type processor_id () const
 
bool isDefaultPostprocessorValue (const std::string &param_name, const unsigned int index=0) const
 
bool hasPostprocessorByName (const PostprocessorName &name) const
 
std::size_t coupledPostprocessors (const std::string &param_name) const
 
const PostprocessorName & getPostprocessorName (const std::string &param_name, const unsigned int index=0) const
 
const PostprocessorValue & getPostprocessorValue (const std::string &param_name, const unsigned int index=0) const
 
const PostprocessorValue & getPostprocessorValue (const std::string &param_name, const unsigned int index=0) const
 
const PostprocessorValue & getPostprocessorValueOld (const std::string &param_name, const unsigned int index=0) const
 
const PostprocessorValue & getPostprocessorValueOld (const std::string &param_name, const unsigned int index=0) const
 
const PostprocessorValue & getPostprocessorValueOlder (const std::string &param_name, const unsigned int index=0) const
 
const PostprocessorValue & getPostprocessorValueOlder (const std::string &param_name, const unsigned int index=0) const
 
const PostprocessorValue & getPostprocessorValueOldByName (const PostprocessorName &name) const
 
const PostprocessorValue & getPostprocessorValueOldByName (const PostprocessorName &name) const
 
const PostprocessorValue & getPostprocessorValueOlderByName (const PostprocessorName &name) const
 
const PostprocessorValue & getPostprocessorValueOlderByName (const PostprocessorName &name) const
 

Static Public Member Functions

static InputParameters validParams ()
 
static void callMooseError (MooseApp *const app, const InputParameters &params, std::string msg, const bool with_prefix, const hit::Node *node, const bool show_trace=true)
 
static void selectVectorTagsFromSystem (const SystemBase &system, const std::vector< VectorTag > &input_vector_tags, std::set< TagID > &selected_tags)
 
static void selectMatrixTagsFromSystem (const SystemBase &system, const std::map< TagName, TagID > &input_matrix_tags, std::set< TagID > &selected_tags)
 
static void objectSetupHelper (const std::vector< T * > &objects, const ExecFlagType &exec_flag)
 
static void objectSetupHelper (const std::vector< T * > &objects, const ExecFlagType &exec_flag)
 
static void objectExecuteHelper (const std::vector< T * > &objects)
 
static void objectExecuteHelper (const std::vector< T * > &objects)
 

Public Attributes

struct SubChannel1PhaseProblem::FrictionStruct _friction_args
 
struct SubChannel1PhaseProblem::NusseltStruct _nusselt_args
 
const PostprocessorValue & _P_out
 Outlet pressure postprocessor value.
 
const SinglePhaseFluidProperties * _fp
 Non-owning pointer to fluid properties user object.
 
std::map< std::string, std::vector< dof_id_type > > _var_dof_map
 
 usingCombinedWarningSolutionWarnings
 
const ConsoleStream _console
 
std::vector< Real > _real_zero
 
std::vector< VariableValue > _scalar_zero
 
std::vector< VariableValue > _zero
 
std::vector< VariablePhiValue > _phi_zero
 
std::vector< MooseArray< ADReal > > _ad_zero
 
std::vector< VariableGradient > _grad_zero
 
std::vector< MooseArray< ADRealVectorValue > > _ad_grad_zero
 
std::vector< VariablePhiGradient > _grad_phi_zero
 
std::vector< VariableSecond > _second_zero
 
std::vector< MooseArray< ADRealTensorValue > > _ad_second_zero
 
std::vector< VariablePhiSecond > _second_phi_zero
 
std::vector< Point > _point_zero
 
std::vector< VectorVariableValue > _vector_zero
 
std::vector< VectorVariableCurl > _vector_curl_zero
 

Static Public Attributes

static const std::string type_param
 
static const std::string name_param
 
static const std::string unique_name_param
 
static const std::string app_param
 
static const std::string moose_base_param
 
static const std::string kokkos_object_param
 

Protected Member Functions

virtual void initializeSolution () override
 Function to initialize the solution & geometry fields.
 
virtual Real computeAddedHeatPin (unsigned int i_ch, unsigned int iz) const override
 Pure virtual: daughters provide different implementations.
 
virtual Real getSubChannelPeripheralDuctWidth (unsigned int i_ch) const override
 Function that computes the width of the duct cell that the peripheral subchannel i_ch sees.
 
virtual void computeh (int iblock) override
 Computes Enthalpy per channel for block iblock.
 
virtual Real computeAddedHeatDuct (unsigned int i_ch, unsigned int iz) const
 Non-pure: implemented in the base (or override in a child if needed)
 
void computeWijFromSolve (int iblock)
 Computes diversion crossflow per gap for block iblock.
 
void computeSumWij (int iblock)
 Computes net diversion crossflow per channel for block iblock.
 
void computeMdot (int iblock)
 Computes mass flow 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.
 
Real computeSweepFlowMixingParameter (unsigned int i_gap, unsigned int iz) const
 Computes and validates the sweep-flow mixing parameter.
 
void computeDP (int iblock)
 Computes Pressure Drop per channel for block iblock.
 
void computeP (int iblock)
 Computes Pressure per channel for block iblock.
 
Real computeT (int iblock)
 Computes and relaxes Temperature per channel for block iblock.
 
void computeRho (int iblock)
 Computes Density per channel for block iblock.
 
void computeMu (int iblock)
 Computes Viscosity per channel for block iblock.
 
void computeWijResidual (int iblock)
 Computes Residual Matrix based on the lateral momentum conservation equation for block iblock.
 
libMesh::DenseVector< Real > residualFunction (int iblock, libMesh::DenseVector< Real > solution)
 Computes Residual Vector based on the lateral momentum conservation equation for block iblock & updates flow variables based on current crossflow solution.
 
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.
 
PetscErrorCode implicitPetscSolve (int iblock)
 Computes implicit solve using PetSc.
 
void detectDeformation ()
 Detects whether pin diameter or duct displacement fields require geometry recalculation.
 
void computeBulkReynoldsNumber ()
 Computes the assembly bulk Reynolds number from inlet flow conditions.
 
PetscScalar computeInterpolationCoefficients (PetscScalar Peclet=0.0)
 Functions that computes the interpolation scheme given the Peclet number.
 
PetscScalar computeInterpolatedValue (PetscScalar topValue, PetscScalar botValue, PetscScalar Peclet=0.0)
 
Real computeGravityDir (const MooseEnum &dir) const
 inline function that is used to define the gravity direction
 
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 into _h_soln for nodes [first_node, last_node].
 
PetscErrorCode cleanUp ()
 
PetscErrorCode createPetscVector (Vec &v, PetscInt n)
 Petsc Functions.
 
PetscErrorCode createPetscMatrix (Mat &M, PetscInt n, PetscInt m)
 
template<class T >
PetscErrorCode populateVectorFromDense (Vec &x, const T &solution, const unsigned int first_axial_level, const unsigned int last_axial_level, const unsigned int cross_dimension)
 
template<class T >
PetscErrorCode populateDenseFromVector (const Vec &x, T &solution, const unsigned int first_axial_level, const unsigned int last_axial_level, const unsigned int cross_dimension)
 
template<class T >
PetscErrorCode populateVectorFromHandle (Vec &x, const T &solution, const unsigned int first_axial_level, const unsigned int last_axial_level, const unsigned int cross_dimension)
 
template<class T >
PetscErrorCode populateSolutionChan (const Vec &x, T &solution, const unsigned int first_axial_level, const unsigned int last_axial_level, const unsigned int cross_dimension)
 
virtual void meshChanged ()
 
MooseVariableFieldBase & getVariableHelper (const THREAD_ID tid, const std::string &var_name, Moose::VarKindType expected_var_type, Moose::VarFieldType expected_var_field_type, const std::vector< T > &nls, const SystemBase &aux) const
 
void createTagVectors ()
 
void createTagSolutions ()
 
virtual void meshDisplaced ()
 
void computeSystems (const ExecFlagType &type)
 
bool duplicateVariableCheck (const std::string &var_name, const libMesh::FEType &type, bool is_aux, const std::set< SubdomainID > *const active_subdomains)
 
void computeUserObjectsInternal (const ExecFlagType &type, TheWarehouse::Query &query)
 
void computeKokkosUserObjectsInternal (const ExecFlagType &type, TheWarehouse::Query &query)
 
void checkDisplacementOrders ()
 
void checkUserObjects ()
 
void checkGradientMethods ()
 
void checkDependMaterialsHelper (const std::map< SubdomainID, std::vector< std::shared_ptr< MaterialBase > > > &materials_map)
 
void checkCoordinateSystems ()
 
void reinitBecauseOfGhostingOrNewGeomObjects (bool mortar_changed=false)
 
void addObjectParamsHelper (InputParameters &params, const std::string &object_name, const std::string &var_param_name="variable")
 
bool verifyVectorTags () const
 
void flagInvalidSolutionInternal (const InvalidSolutionID invalid_solution_id) const
 
InvalidSolutionID registerInvalidSolutionInternal (const std::string &message, const bool warning) const
 
PerfID registerTimedSection (const std::string &section_name, const unsigned int level) const
 
PerfID registerTimedSection (const std::string &section_name, const unsigned int level, const std::string &live_message, const bool print_dots=true) const
 
std::string timedSectionName (const std::string &section_name) const
 
T & declareRestartableData (const std::string &data_name, Args &&... args)
 
ManagedValue< T > declareManagedRestartableDataWithContext (const std::string &data_name, void *context, Args &&... args)
 
const T & getRestartableData (const std::string &data_name) const
 
T & declareRestartableDataWithContext (const std::string &data_name, void *context, Args &&... args)
 
T & declareRecoverableData (const std::string &data_name, Args &&... args)
 
T & declareRestartableDataWithObjectName (const std::string &data_name, const std::string &object_name, Args &&... args)
 
T & declareRestartableDataWithObjectNameWithContext (const std::string &data_name, const std::string &object_name, void *context, Args &&... args)
 
std::string restartableName (const std::string &data_name) const
 
virtual void addPostprocessorDependencyHelper (const PostprocessorName &) const
 

Protected Attributes

QuadSubChannelMesh & _subchannel_mesh
 
unsigned int _n_blocks
 number of axial blocks
 
libMesh::DenseMatrix< Real > _DP
 
libMesh::DenseMatrix< Real > & _Wij
 
libMesh::DenseMatrix< Real > & _Wij_old
 
libMesh::DenseMatrix< Real > _WijPrime
 
libMesh::DenseMatrix< Real > _Wij_residual_matrix
 
const Real _g_grav
 
const Real & _kij
 
unsigned int _n_cells
 
unsigned int _n_gaps
 
unsigned int _n_pins
 
unsigned int _n_channels
 
unsigned int _block_size
 
std::vector< Real > _z_grid
 axial location of nodes
 
Real _one
 
Real _TR
 Flag that activates or deactivates the transient parts of the equations we solve by multiplication.
 
const bool _compute_density
 Flag that activates or deactivates the calculation of density.
 
const bool _compute_viscosity
 Flag that activates or deactivates the calculation of viscosity.
 
const bool _compute_power
 Flag that informs if we need to solve the Enthalpy/Temperature equations or not.
 
const bool _pin_mesh_exist
 Flag that informs if there is a pin mesh or not.
 
const bool _duct_mesh_exist
 Flag that informs if there is a duct mesh or not.
 
bool _converged
 Variable that informs whether we exited external solve with a converged solution or not.
 
Real _bulk_Re
 Assembly bulk Reynolds number.
 
Real _bulk_V
 Assembly bulk velocity.
 
bool _time_integrator_checked = false
 Whether the time integrator has been checked for consistency with the implementation.
 
Real _dt
 Time step.
 
Real _CT
 Turbulent modeling parameter used in axial momentum equation.
 
const Real & _P_tol
 Convergence tolerance for the pressure loop in external solve.
 
const int & _P_maxit
 Maximum number of pressure iterations; zero selects the solver's existing automatic limit.
 
const Real & _T_tol
 Convergence tolerance for the temperature loop in internal solve.
 
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 unsigned int & _enthalpy_subcycles
 Number of enthalpy, temperature, and property updates performed per flow solve.
 
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.
 
const Real & _crossflow_equation_relaxation
 Equation relaxation factor for crossflow in the coupled implicit solve.
 
const Real & _mass_flow_relaxation
 Relaxation factor for mass flow rate updates in the coupled implicit solve.
 
const Real & _pressure_relaxation
 Relaxation factor for pressure updates in the coupled implicit solve.
 
const Real & _crossflow_relaxation
 Relaxation factor for crossflow updates in the coupled implicit solve.
 
const PetscReal & _rtol
 The relative convergence tolerance, (relative decrease) for the ksp linear solver.
 
const PetscReal & _atol
 The absolute convergence tolerance for the ksp linear solver.
 
const PetscReal & _dtol
 The divergence tolerance for the ksp linear solver.
 
const PetscInt & _maxit
 The maximum number of iterations to use for the ksp linear solver.
 
const MooseEnum _interpolation_scheme
 The interpolation method used in constructing the systems.
 
const MooseEnum _gravity_direction
 The direction of gravity.
 
const Real _dir_grav
 
const bool _implicit_bool
 Flag to define the usage of a implicit or explicit solution.
 
const bool _staggered_pressure_bool
 Flag to define the usage of staggered or collocated pressure.
 
const bool _segregated_bool
 Segregated solve.
 
const bool _verbose_subchannel
 Boolean to printout information related to subchannel solve.
 
bool _deformation = false
 Flag that activates the effect of deformation (pin/duct) based on the auxvalues for displacement, Dpin.
 
const SCMFrictionClosureBase * _friction_closure
 Friction closure object.
 
const SCMMixingClosureBase * _mixing_closure
 Turbulent Mixing closure object.
 
const SCMHTCClosureBase * _pin_HTC_closure
 HTC closure objects.
 
const SCMHTCClosureBase * _duct_HTC_closure
 
std::unique_ptr< SolutionHandle > _mdot_soln
 Solutions handles and link to TH tables properties.
 
std::unique_ptr< SolutionHandle > _SumWij_soln
 
std::unique_ptr< SolutionHandle > _P_soln
 
std::unique_ptr< SolutionHandle > _DP_soln
 
std::unique_ptr< SolutionHandle > _h_soln
 
std::unique_ptr< SolutionHandle > _T_soln
 
std::unique_ptr< SolutionHandle > _Tpin_soln
 
std::unique_ptr< SolutionHandle > _Dpin_soln
 
std::unique_ptr< SolutionHandle > _rho_soln
 
std::unique_ptr< SolutionHandle > _mu_soln
 
std::unique_ptr< SolutionHandle > _S_flow_soln
 
std::unique_ptr< SolutionHandle > _w_perim_soln
 
std::unique_ptr< SolutionHandle > _q_prime_soln
 
std::unique_ptr< SolutionHandle > _duct_heat_flux_soln
 
std::unique_ptr< SolutionHandle > _Tduct_soln
 
std::unique_ptr< SolutionHandle > _displacement_soln
 
std::unique_ptr< SolutionHandle > _ff_soln
 
std::unique_ptr< SolutionHandle > _HTC_soln
 
Mat _mc_sumWij_mat
 Matrices and vectors to be used in implicit assembly Mass conservation Mass conservation - sum of cross fluxes.
 
Vec _Wij_vec
 
Vec _prod
 
Vec _prodp
 
Mat _mc_axial_convection_mat
 Mass conservation - axial convection.
 
Vec _mc_axial_convection_rhs
 
Mat _mc_density_pressure_mat
 Mass conservation - pressure derivative of transient density.
 
Mat _amc_turbulent_cross_flows_mat
 Axial momentum Axial momentum conservation - compute turbulent cross fluxes.
 
Vec _amc_turbulent_cross_flows_rhs
 
Mat _amc_time_derivative_mat
 Axial momentum conservation - time derivative.
 
Vec _amc_time_derivative_rhs
 
Mat _amc_advective_derivative_mat
 Axial momentum conservation - advective (Eulerian) derivative.
 
Vec _amc_advective_derivative_rhs
 
Mat _amc_cross_derivative_mat
 Axial momentum conservation - cross flux derivative.
 
Vec _amc_cross_derivative_rhs
 
Mat _amc_friction_force_mat
 Axial momentum conservation - friction force.
 
Vec _amc_friction_force_rhs
 
Vec _amc_gravity_rhs
 Axial momentum conservation - buoyancy force No implicit matrix.
 
Mat _amc_pressure_force_mat
 Axial momentum conservation - pressure force.
 
Vec _amc_pressure_force_rhs
 
Mat _amc_sys_mdot_mat
 Axial momentum system matrix.
 
Vec _amc_sys_mdot_rhs
 
Mat _cmc_time_derivative_mat
 Cross momentum Cross momentum conservation - time derivative.
 
Vec _cmc_time_derivative_rhs
 
Mat _cmc_advective_derivative_mat
 Cross momentum conservation - advective (Eulerian) derivative.
 
Vec _cmc_advective_derivative_rhs
 
Mat _cmc_friction_force_mat
 Cross momentum conservation - friction force.
 
Vec _cmc_friction_force_rhs
 
Mat _cmc_pressure_force_mat
 Cross momentum conservation - pressure force.
 
Vec _cmc_pressure_force_rhs
 
Mat _cmc_sys_Wij_mat
 Lateral momentum system matrix.
 
Vec _cmc_sys_Wij_rhs
 
Mat _hc_time_derivative_mat
 Enthalpy Enthalpy conservation - time derivative.
 
Vec _hc_time_derivative_rhs
 
Mat _hc_advective_derivative_mat
 Enthalpy conservation - advective (Eulerian) derivative;.
 
Vec _hc_advective_derivative_rhs
 
Mat _hc_cross_derivative_mat
 Enthalpy conservation - cross flux derivative.
 
Vec _hc_cross_derivative_rhs
 
Vec _hc_added_heat_rhs
 Enthalpy conservation - source and sink.
 
Mat _hc_sys_h_mat
 System matrices.
 
Vec _hc_sys_h_rhs
 
PetscScalar _added_K = 0.0
 Added resistances for monolithic convergence.
 
PetscScalar _added_K_old = 1000.0
 
PetscScalar _max_sumWij
 
PetscScalar _max_sumWij_new
 
PetscScalar _correction_factor = 1.0
 
Real _pressure_fixed_point_error = 1.0
 Maximum pressure fixed-point update before solution relaxation over the blocks.
 
MooseMesh & _mesh
 
bool _initialized
 
std::optional< std::vector< ConvergenceName > > _nonlinear_convergence_names
 
std::optional< std::vector< ConvergenceName > > _linear_convergence_names
 
std::optional< ConvergenceName > _multiapp_fixed_point_convergence_name
 
std::optional< ConvergenceName > _steady_state_convergence_name
 
std::set< TagID > _fe_vector_tags
 
std::set< TagID > _fe_matrix_tags
 
std::set< TagID > _linear_vector_tags
 
std::set< TagID > _linear_matrix_tags
 
const bool & _solve
 
bool _transient
 
Real & _time
 
Real & _time_old
 
Real & _time_older
 
int & _t_step
 
Real & _dt_old
 
bool _need_to_add_default_nonlinear_convergence
 
bool _need_to_add_default_multiapp_fixed_point_convergence
 
bool _need_to_add_default_steady_state_convergence
 
const std::vector< LinearSystemName > _linear_sys_names
 
const std::size_t _num_linear_sys
 
std::vector< std::shared_ptr< LinearSystem > > _linear_systems
 
std::map< LinearSystemName, unsigned int > _linear_sys_name_to_num
 
LinearSystem * _current_linear_sys
 
const bool _using_default_nl
 
const std::vector< NonlinearSystemName > _nl_sys_names
 
const std::size_t _num_nl_sys
 
std::vector< std::shared_ptr< NonlinearSystemBase > > _nl
 
std::map< NonlinearSystemName, unsigned int > _nl_sys_name_to_num
 
NonlinearSystemBase * _current_nl_sys
 
SolverSystem * _current_solver_sys
 
std::vector< std::shared_ptr< SolverSystem > > _solver_systems
 
std::map< SolverVariableName, unsigned int > _solver_var_to_sys_num
 
std::map< SolverSystemName, unsigned int > _solver_sys_name_to_num
 
std::vector< SolverSystemName > _solver_sys_names
 
std::shared_ptr< AuxiliarySystem > _aux
 
Moose::CouplingType _coupling
 
std::vector< std::unique_ptr< libMesh::CouplingMatrix > > _cm
 
Moose::Kokkos::Array< Moose::Kokkos::System > _kokkos_systems
 
Moose::Kokkos::Array< Moose::Kokkos::FESystem > _kokkos_fe_systems
 
std::map< std::string, unsigned int > _subspace_dim
 
std::vector< std::vector< std::unique_ptr< Assembly > > > _assembly
 
Moose::Kokkos::Assembly _kokkos_assembly
 
MooseObjectWarehouse< MeshDivision > _mesh_divisions
 
MooseObjectWarehouse< Function > _functions
 
MooseObjectWarehouse< Moose::FunctionBase > _kokkos_functions
 
MooseObjectWarehouse< Convergence > _convergences
 
MooseObjectWarehouse< KernelBase > _nonlocal_kernels
 
MooseObjectWarehouse< IntegratedBCBase > _nonlocal_integrated_bcs
 
MaterialPropertyRegistry _material_prop_registry
 
MaterialPropertyStorage & _material_props
 
MaterialPropertyStorage & _bnd_material_props
 
MaterialPropertyStorage & _neighbor_material_props
 
Moose::Kokkos::MaterialPropertyStorage & _kokkos_material_props
 
Moose::Kokkos::MaterialPropertyStorage & _kokkos_bnd_material_props
 
Moose::Kokkos::MaterialPropertyStorage & _kokkos_neighbor_material_props
 
MooseObjectWarehouse< Marker > _markers
 
ReporterData _reporter_data
 
ExecuteMooseObjectWarehouse< MultiApp > _multi_apps
 
ExecuteMooseObjectWarehouse< TransientMultiApp > _transient_multi_apps
 
ExecuteMooseObjectWarehouse< Transfer > _transfers
 
ExecuteMooseObjectWarehouse< Transfer > _to_multi_app_transfers
 
ExecuteMooseObjectWarehouse< Transfer > _from_multi_app_transfers
 
ExecuteMooseObjectWarehouse< Transfer > _between_multi_app_transfers
 
const unsigned int _num_concurrent_multiapps
 
std::map< std::string, std::unique_ptr< RandomData > > _random_data_objects
 
std::vector< std::unordered_map< SubdomainID, bool > > _block_mat_side_cache
 
std::vector< std::unordered_map< BoundaryID, bool > > _bnd_mat_side_cache
 
std::vector< std::unordered_map< BoundaryID, bool > > _interface_mat_side_cache
 
std::vector< MeshChangedInterface * > _notify_when_mesh_changes
 
std::vector< MeshDisplacedInterface * > _notify_when_mesh_displaces
 
Adaptivity _adaptivity
 
unsigned int _cycles_completed
 
std::shared_ptr< XFEMInterface > _xfem
 
MooseMesh * _displaced_mesh
 
std::shared_ptr< DisplacedProblem > _displaced_problem
 
GeometricSearchData _geometric_search_data
 
std::unique_ptr< MortarInterfaceWarehouse > _mortar_data
 
bool _reinit_displaced_elem
 
bool _reinit_displaced_face
 
bool _reinit_displaced_neighbor
 
bool _input_file_saved
 
bool _has_dampers
 
bool _has_constraints
 
bool _snesmf_reuse_base
 
bool _skip_exception_check
 
bool _snesmf_reuse_base_set_by_user
 
bool _has_initialized_stateful
 
bool _const_jacobian
 
bool _has_jacobian
 
bool _needs_old_newton_iter
 
bool _previous_nl_solution_required
 
std::vector< bool > _previous_multiapp_fp_nl_solution_required
 
bool _previous_multiapp_fp_aux_solution_required
 
std::vector< bool > _previous_multisystem_fp_nl_solution_required
 
bool _previous_multisystem_fp_aux_solution_required
 
bool _has_nonlocal_coupling
 
bool _calculate_jacobian_in_uo
 
std::vector< std::vector< const MooseVariableFEBase * > > _uo_jacobian_moose_vars
 
std::vector< unsigned char > _has_active_material_properties
 
std::vector< SolverParams > _solver_params
 
CoverageCheckMode _kernel_coverage_check
 
std::vector< SubdomainName > _kernel_coverage_blocks
 
const bool _boundary_restricted_node_integrity_check
 
const bool _boundary_restricted_elem_integrity_check
 
const bool _side_uo_interface_mat_prop_integrity_check
 
CoverageCheckMode _material_coverage_check
 
std::vector< SubdomainName > _material_coverage_blocks
 
bool _fv_bcs_integrity_check
 
const bool _fv_face_integrity_check
 
const bool _material_dependency_check
 
const bool _uo_aux_state_check
 
bool _check_residual_for_nans
 
unsigned int _max_qps
 
libMesh::Order _max_scalar_order
 
bool _has_time_integrator
 
bool _has_exception
 
bool _parallel_barrier_messaging
 
MooseEnum _verbose_setup
 
bool _verbose_multiapps
 
bool _verbose_restore
 
std::string _exception_message
 
ExecFlagType _current_execute_on_flag
 
ExecuteMooseObjectWarehouse< Control > _control_warehouse
 
Moose::PetscSupport::PetscOptions _petsc_options
 
PetscOptions _petsc_option_data_base
 
bool _is_petsc_options_inserted
 
std::shared_ptr< LineSearch > _line_search
 
std::unique_ptr< libMesh::ConstElemRange > _evaluable_local_elem_range
 
std::unique_ptr< libMesh::ConstElemRange > _nl_evaluable_local_elem_range
 
std::unique_ptr< libMesh::ConstElemRange > _aux_evaluable_local_elem_range
 
std::unique_ptr< libMesh::ConstElemRange > _current_algebraic_elem_range
 
std::unique_ptr< libMesh::ConstNodeRange > _current_algebraic_node_range
 
std::unique_ptr< ConstBndNodeRange > _current_algebraic_bnd_node_range
 
bool _using_ad_mat_props
 
unsigned short _current_ic_state
 
const bool _use_hash_table_matrix_assembly
 
std::map< TagName, TagID > _matrix_tag_name_to_tag_id
 
std::map< TagID, TagName > _matrix_tag_id_to_tag_name
 
Factory & _factory
 
DiracKernelInfo _dirac_kernel_info
 
std::map< SubdomainID, std::set< std::string > > _map_block_material_props
 
std::map< BoundaryID, std::set< std::string > > _map_boundary_material_props
 
std::map< SubdomainID, std::set< MaterialPropertyName > > _zero_block_material_props
 
std::map< BoundaryID, std::set< MaterialPropertyName > > _zero_boundary_material_props
 
std::set< std::string > _material_property_requested
 
std::vector< std::set< MooseVariableFieldBase * > > _active_elemental_moose_variables
 
std::vector< unsigned int > _has_active_elemental_moose_variables
 
std::vector< std::set< TagID > > _active_fe_var_coupleable_matrix_tags
 
std::vector< std::set< TagID > > _active_fe_var_coupleable_vector_tags
 
std::vector< std::set< TagID > > _active_sc_var_coupleable_matrix_tags
 
std::vector< std::set< TagID > > _active_sc_var_coupleable_vector_tags
 
bool _default_ghosting
 
std::set< dof_id_type > _ghosted_elems
 
bool _currently_computing_jacobian
 
bool _currently_computing_residual_and_jacobian
 
bool _computing_nonlinear_residual
 
bool _currently_computing_residual
 
bool _safe_access_tagged_matrices
 
bool _safe_access_tagged_vectors
 
bool _have_ad_objects
 
std::unordered_set< TagID > _not_zeroed_tagged_vectors
 
bool _cli_option_found
 
bool _color_output
 
bool _termination_requested
 
const bool & _enabled
 
MooseApp & _app
 
ActionFactory & _action_factory
 
const std::string & _type
 
const std::string & _name
 
const InputParameters & _pars
 
MooseApp & _pg_moose_app
 
const std::string _prefix
 
MooseApp & _restartable_app
 
const std::string _restartable_system_name
 
const THREAD_ID _restartable_tid
 
const bool _restartable_read_only
 
InitialConditionWarehouse _ics
 
FVInitialConditionWarehouse _fv_ics
 
ScalarInitialConditionWarehouse _scalar_ics
 
MaterialWarehouse _materials
 
MaterialWarehouse _interface_materials
 
MaterialWarehouse _discrete_materials
 
MaterialWarehouse _all_materials
 
MaterialWarehouse _kokkos_materials
 
MooseObjectWarehouse< Indicator > _indicators
 
MooseObjectWarehouse< InternalSideIndicatorBase > _internal_side_indicators
 
std::map< SubdomainID, std::multimap< std::string, std::string > > _map_block_material_props_check
 
std::map< BoundaryID, std::multimap< std::string, std::string > > _map_boundary_material_props_check
 
const Parallel::Communicator & _communicator
 

Private Types

enum  TrueFunctorIs
 

Private Member Functions

void setResidualObjectParamsAndLog (const std::string &ro_name, const std::string &name, InputParameters &parameters, const unsigned int nl_sys_num, const std::string &base_name, bool &reinit_displaced)
 
void setAuxKernelParamsAndLog (const std::string &ak_name, const std::string &name, InputParameters &parameters, const std::string &base_name)
 
TheWarehouse::Query getUOQuery (const std::string &system, const ExecFlagType &type, const Moose::AuxGroup &group) const
 
void getUOExecutionGroups (TheWarehouse::Query &query, std::set< int > &execution_groups) const
 
void translateCaughtException (const std::string &calling_method)
 
void handleException (const std::string &calling_method)
 
void translateUserObjectExceptions (const std::function< void()> &work)
 
std::vector< MortarUserObject * > getMortarUserObjects (BoundaryID primary_boundary_id, BoundaryID secondary_boundary_id, bool displaced, const std::vector< MortarUserObject * > &mortar_uo_superset)
 
std::vector< MortarUserObject * > getMortarUserObjects (BoundaryID primary_boundary_id, BoundaryID secondary_boundary_id, bool displaced)
 
virtual std::pair< bool, unsigned int > determineSolverSystem (const std::string &var_name, bool error_if_not_found=false) const override
 
void checkICRestartError (const std::string &ic_name, const std::string &name, const VariableName &var_name)
 
void addAnyRedistributers ()
 
void updateMaxQps ()
 
void joinAndFinalize (TheWarehouse::Query query, bool isgen=false)
 
void kokkosJoinAndFinalize (const std::vector< Moose::Kokkos::UserObject * > &userobjs)
 
virtual void resetState ()
 
void cloneAlgebraicGhostingFunctor (libMesh::GhostingFunctor &algebraic_gf, bool to_mesh=true)
 
void cloneCouplingGhostingFunctor (libMesh::GhostingFunctor &coupling_gf, bool to_mesh=true)
 
void showFunctors () const
 
void showFunctorRequestors () const
 
RestartableDataValue & registerRestartableDataOnApp (std::unique_ptr< RestartableDataValue > data, THREAD_ID tid) const
 
void registerRestartableNameWithFilterOnApp (const std::string &name, Moose::RESTARTABLE_FILTER filter)
 
RestartableData< T > & declareRestartableDataHelper (const std::string &data_name, void *context, Args &&... args) const
 
std::string restrictionSubdomainCheckName (SubdomainID check_id)
 
std::string restrictionSubdomainCheckName (SubdomainID check_id)
 
std::string restrictionBoundaryCheckName (BoundaryID check_id)
 
std::string restrictionBoundaryCheckName (BoundaryID check_id)
 
const PostprocessorName & getPostprocessorNameInternal (const std::string &param_name, const unsigned int index, const bool allow_default_value=true) const
 
bool isDefaultPostprocessorValueByName (const PostprocessorName &name) const
 
PostprocessorValue getDefaultPostprocessorValueByName (const PostprocessorName &name) const
 
void checkParam (const std::string &param_name, const unsigned int index=std::numeric_limits< unsigned int >::max()) const
 
bool postprocessorsAdded () const
 
const PostprocessorValue & getPostprocessorValueInternal (const std::string &param_name, unsigned int index, std::size_t t_index) const
 
const PostprocessorValue & getPostprocessorValueInternal (const std::string &param_name, unsigned int index, std::size_t t_index) const
 
const PostprocessorValue & getPostprocessorValueByNameInternal (const PostprocessorName &name, std::size_t t_index) const
 
const PostprocessorValue & getPostprocessorValueByNameInternal (const PostprocessorName &name, std::size_t t_index) const
 

Static Private Member Functions

static const hit::Node * getHitNode (const InputParameters &params)
 
static std::string messagePrefix (const InputParameters &params, const bool hit_prefix)
 
static SolverParams makeLinearSolverParams ()
 

Private Attributes

Restartable::ManagedValue< RestartableEquationSystems > _req
 
bool _error_on_jacobian_nonzero_reallocation
 
const bool _restore_original_nonzero_pattern
 
bool _ignore_zeros_in_jacobian
 
bool _preserve_matrix_sparsity_pattern
 
const bool _force_restart
 
const bool _allow_ics_during_restart
 
const bool _skip_nl_system_check
 
bool _fail_next_system_convergence_check
 
const bool _allow_invalid_solution
 
const bool _show_invalid_solution_console
 
const bool & _immediately_print_invalid_solution
 
bool _started_initial_setup
 
bool _has_internal_edge_residual_objects
 
bool _u_dot_requested
 
bool _u_dotdot_requested
 
bool _u_dot_old_requested
 
bool _u_dotdot_old_requested
 
bool _has_mortar
 
unsigned int _num_grid_steps
 
bool _trust_user_coupling_matrix
 
bool _computing_scaling_jacobian
 
bool _computing_scaling_residual
 
bool _checking_uo_aux_state
 
ExecFlagEnum _print_execution_on
 
const bool _identify_variable_groups_in_nl
 
std::vector< VectorTag > _current_residual_vector_tags
 
bool _have_fv
 
const bool _regard_general_exceptions_as_errors
 
std::vector< libMesh::CouplingMatrix > _nonlocal_cm
 
bool _requires_nonlocal_coupling
 
bool _has_kokkos_objects
 
bool _has_kokkos_residual_objects
 
std::vector< std::function< void()> > _kokkos_mesh_initialization_hooks
 
std::vector< std::multimap< std::string, std::tuple< TrueFunctorIs, std::unique_ptr< Moose::FunctorEnvelopeBase >, std::unique_ptr< Moose::FunctorEnvelopeBase > > > > _functors
 
std::vector< std::map< std::string, std::unique_ptr< Moose::FunctorAbstract > > > _pbblf_functors
 
std::map< std::string, std::set< std::string > > _functor_to_requestors
 
std::vector< std::multimap< std::string, std::pair< bool, bool > > > _functor_to_request_info
 
bool _show_functors
 
bool _show_chain_control_data
 
std::vector< VectorTag > _vector_tags
 
std::vector< std::vector< VectorTag > > _typed_vector_tags
 
std::map< TagName, TagID > _vector_tags_name_map
 
std::map< MooseObjectName, std::set< std::string > > _consumed_material_properties
 
std::unordered_map< libMesh::GhostingFunctor *, std::vector< std::shared_ptr< libMesh::GhostingFunctor > > > _root_alg_gf_to_sys_clones
 
std::unordered_map< libMesh::GhostingFunctor *, std::vector< std::shared_ptr< libMesh::GhostingFunctor > > > _root_coupling_gf_to_sys_clones
 
const ParallelParamObject & _parent
 
const MooseBase & _si_moose_base
 
const FEProblemBase * _si_problem
 
const RestartableDataMapName _metaname
 
std::string _restartable_name
 
const MooseObject & _ppi_moose_object
 
const InputParameters & _ppi_params
 
const FEProblemBase & _ppi_feproblem
 
std::map< PostprocessorName, std::unique_ptr< PostprocessorValue > > _default_values
 

Detailed Description

Quadrilateral subchannel solver.

Definition at line 18 of file QuadSubChannel1PhaseProblem.h.

Constructor & Destructor Documentation

◆ QuadSubChannel1PhaseProblem()

QuadSubChannel1PhaseProblem::QuadSubChannel1PhaseProblem ( const InputParameters &  params)

Definition at line 26 of file QuadSubChannel1PhaseProblem.C.

27 : SubChannel1PhaseProblem(params), _subchannel_mesh(SCM::getMesh<QuadSubChannelMesh>(_mesh))
28{
29}
MooseMesh & _mesh
Base class for the 1-phase steady-state/transient subchannel solver.

Member Function Documentation

◆ cleanUp()

PetscErrorCode SubChannel1PhaseProblem::cleanUp ( )
protectedinherited

Definition at line 500 of file SubChannel1PhaseProblem.C.

501{
503 // We need to clean up the petsc matrices/vectors
504 // Mass conservation components
505 LibmeshPetscCall(MatDestroy(&_mc_sumWij_mat));
506 LibmeshPetscCall(VecDestroy(&_Wij_vec));
507 LibmeshPetscCall(VecDestroy(&_prod));
508 LibmeshPetscCall(VecDestroy(&_prodp));
509 LibmeshPetscCall(MatDestroy(&_mc_axial_convection_mat));
510 LibmeshPetscCall(VecDestroy(&_mc_axial_convection_rhs));
511 LibmeshPetscCall(MatDestroy(&_mc_density_pressure_mat));
512
513 // Axial momentum conservation components
514 LibmeshPetscCall(MatDestroy(&_amc_turbulent_cross_flows_mat));
515 LibmeshPetscCall(VecDestroy(&_amc_turbulent_cross_flows_rhs));
516 LibmeshPetscCall(MatDestroy(&_amc_time_derivative_mat));
517 LibmeshPetscCall(VecDestroy(&_amc_time_derivative_rhs));
518 LibmeshPetscCall(MatDestroy(&_amc_advective_derivative_mat));
519 LibmeshPetscCall(VecDestroy(&_amc_advective_derivative_rhs));
520 LibmeshPetscCall(MatDestroy(&_amc_cross_derivative_mat));
521 LibmeshPetscCall(VecDestroy(&_amc_cross_derivative_rhs));
522 LibmeshPetscCall(MatDestroy(&_amc_friction_force_mat));
523 LibmeshPetscCall(VecDestroy(&_amc_friction_force_rhs));
524 LibmeshPetscCall(VecDestroy(&_amc_gravity_rhs));
525 LibmeshPetscCall(MatDestroy(&_amc_pressure_force_mat));
526 LibmeshPetscCall(VecDestroy(&_amc_pressure_force_rhs));
527 LibmeshPetscCall(MatDestroy(&_amc_sys_mdot_mat));
528 LibmeshPetscCall(VecDestroy(&_amc_sys_mdot_rhs));
529
530 // Lateral momentum conservation components
531 LibmeshPetscCall(MatDestroy(&_cmc_time_derivative_mat));
532 LibmeshPetscCall(VecDestroy(&_cmc_time_derivative_rhs));
533 LibmeshPetscCall(MatDestroy(&_cmc_advective_derivative_mat));
534 LibmeshPetscCall(VecDestroy(&_cmc_advective_derivative_rhs));
535 LibmeshPetscCall(MatDestroy(&_cmc_friction_force_mat));
536 LibmeshPetscCall(VecDestroy(&_cmc_friction_force_rhs));
537 LibmeshPetscCall(MatDestroy(&_cmc_pressure_force_mat));
538 LibmeshPetscCall(VecDestroy(&_cmc_pressure_force_rhs));
539 LibmeshPetscCall(MatDestroy(&_cmc_sys_Wij_mat));
540 LibmeshPetscCall(VecDestroy(&_cmc_sys_Wij_rhs));
541
542 // Energy conservation components
543 LibmeshPetscCall(MatDestroy(&_hc_time_derivative_mat));
544 LibmeshPetscCall(VecDestroy(&_hc_time_derivative_rhs));
545 LibmeshPetscCall(MatDestroy(&_hc_advective_derivative_mat));
546 LibmeshPetscCall(VecDestroy(&_hc_advective_derivative_rhs));
547 LibmeshPetscCall(MatDestroy(&_hc_cross_derivative_mat));
548 LibmeshPetscCall(VecDestroy(&_hc_cross_derivative_rhs));
549 LibmeshPetscCall(VecDestroy(&_hc_added_heat_rhs));
550 LibmeshPetscCall(MatDestroy(&_hc_sys_h_mat));
551 LibmeshPetscCall(VecDestroy(&_hc_sys_h_rhs));
552
553 PetscFunctionReturn(LIBMESH_PETSC_SUCCESS);
554}
PetscFunctionBegin
Mat _cmc_friction_force_mat
Cross momentum conservation - friction force.
Mat _hc_time_derivative_mat
Enthalpy Enthalpy conservation - time derivative.
Mat _cmc_time_derivative_mat
Cross momentum Cross momentum conservation - time derivative.
Mat _amc_turbulent_cross_flows_mat
Axial momentum Axial momentum conservation - compute turbulent cross fluxes.
Mat _amc_sys_mdot_mat
Axial momentum system matrix.
Mat _cmc_sys_Wij_mat
Lateral momentum system matrix.
Mat _mc_sumWij_mat
Matrices and vectors to be used in implicit assembly Mass conservation Mass conservation - sum of cro...
Mat _cmc_pressure_force_mat
Cross momentum conservation - pressure force.
Mat _amc_time_derivative_mat
Axial momentum conservation - time derivative.
Mat _cmc_advective_derivative_mat
Cross momentum conservation - advective (Eulerian) derivative.
Vec _hc_added_heat_rhs
Enthalpy conservation - source and sink.
Mat _amc_friction_force_mat
Axial momentum conservation - friction force.
Mat _mc_density_pressure_mat
Mass conservation - pressure derivative of transient density.
Mat _hc_advective_derivative_mat
Enthalpy conservation - advective (Eulerian) derivative;.
Mat _amc_pressure_force_mat
Axial momentum conservation - pressure force.
Mat _amc_cross_derivative_mat
Axial momentum conservation - cross flux derivative.
Vec _amc_gravity_rhs
Axial momentum conservation - buoyancy force No implicit matrix.
Mat _mc_axial_convection_mat
Mass conservation - axial convection.
Mat _amc_advective_derivative_mat
Axial momentum conservation - advective (Eulerian) derivative.
Mat _hc_cross_derivative_mat
Enthalpy conservation - cross flux derivative.
PetscFunctionReturn(LIBMESH_PETSC_SUCCESS)

Referenced by SubChannel1PhaseProblem::~SubChannel1PhaseProblem().

◆ computeAddedHeatDuct()

Real SubChannel1PhaseProblem::computeAddedHeatDuct ( unsigned int  i_ch,
unsigned int  iz 
) const
protectedvirtualinherited

Non-pure: implemented in the base (or override in a child if needed)

Definition at line 2250 of file SubChannel1PhaseProblem.C.

2251{
2252 mooseAssert(iz > 0, "Trapezoidal rule requires starting at index 1 at least");
2253 if (_duct_mesh_exist)
2254 {
2255 auto subch_type = _subchannel_mesh.getSubchannelType(i_ch);
2256 if (subch_type == EChannelType::EDGE || subch_type == EChannelType::CORNER)
2257 {
2258 auto dz = _z_grid[iz] - _z_grid[iz - 1];
2259 auto * node_in_chan = _subchannel_mesh.getChannelNode(i_ch, iz - 1);
2260 auto * node_out_chan = _subchannel_mesh.getChannelNode(i_ch, iz);
2261 auto * node_in_duct = _subchannel_mesh.getDuctNodeFromChannel(node_in_chan);
2262 auto * node_out_duct = _subchannel_mesh.getDuctNodeFromChannel(node_out_chan);
2263 auto heat_rate_in = (*_duct_heat_flux_soln)(node_in_duct);
2264 auto heat_rate_out = (*_duct_heat_flux_soln)(node_out_duct);
2265 auto width = getSubChannelPeripheralDuctWidth(i_ch);
2266 return 0.5 * (heat_rate_in + heat_rate_out) * dz * width;
2267 }
2268 else
2269 {
2270 return 0.0;
2271 }
2272 }
2273 else
2274 {
2275 return 0.0;
2276 }
2277}
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.
const bool _duct_mesh_exist
Flag that informs if there is a duct mesh or not.
std::vector< Real > _z_grid
axial location of nodes
Node * getDuctNodeFromChannel(Node *channel_node) const
Function that gets the duct node from the channel node.
virtual EChannelType getSubchannelType(unsigned int index) const =0
Return the type of the subchannel for given subchannel index.
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.

Referenced by TriSubChannel1PhaseProblem::computeh(), and SubChannel1PhaseProblem::getAddedHeatDuct().

◆ computeAddedHeatPin()

Real QuadSubChannel1PhaseProblem::computeAddedHeatPin ( unsigned int  i_ch,
unsigned int  iz 
) const
overrideprotectedvirtual

Pure virtual: daughters provide different implementations.

Implements SubChannel1PhaseProblem.

Definition at line 197 of file QuadSubChannel1PhaseProblem.C.

198{
199 if (!_pin_mesh_exist)
200 return 0.0;
201
202 // Compute axial location of nodes.
203 auto z2 = _z_grid[iz];
204 auto z1 = _z_grid[iz - 1];
205 auto heated_length = _subchannel_mesh.getHeatedLength();
206 auto unheated_length_entry = _subchannel_mesh.getHeatedLengthEntry();
207 if (MooseUtils::absoluteFuzzyGreaterThan(z2, unheated_length_entry) &&
208 MooseUtils::absoluteFuzzyLessThan(z1, unheated_length_entry + heated_length))
209 {
210 // Compute the height of this element.
211 auto dz = z2 - z1;
212 auto heat_rate_in = 0.0;
213 auto heat_rate_out = 0.0;
214 for (auto i_pin : _subchannel_mesh.getChannelPins(i_ch))
215 {
216 auto * node_in = _subchannel_mesh.getPinNode(i_pin, iz - 1);
217 auto * node_out = _subchannel_mesh.getPinNode(i_pin, iz);
218 heat_rate_out += 0.25 * (*_q_prime_soln)(node_out);
219 heat_rate_in += 0.25 * (*_q_prime_soln)(node_in);
220 }
221 return (heat_rate_in + heat_rate_out) * dz / 2.0;
222 }
223 else
224 return 0.0;
225}
Node * getPinNode(unsigned int i_pin, unsigned int iz) const override
Get the pin mesh node for a given pin index and elevation index.
const bool _pin_mesh_exist
Flag that informs if there is a pin mesh or not.
virtual const Real & getHeatedLength() const
Return heated length.
virtual const Real & getHeatedLengthEntry() const
Return unheated length at entry.

Referenced by computeh().

◆ computeBulkReynoldsNumber()

void SubChannel1PhaseProblem::computeBulkReynoldsNumber ( )
protectedinherited

Computes the assembly bulk Reynolds number from inlet flow conditions.

Definition at line 423 of file SubChannel1PhaseProblem.C.

424{
425 if (processor_id() == 0)
426 {
427 Real viscosity_in = 0.0;
428 Real volumetric_flow_in = 0.0;
429 Real mass_flow_in = 0.0;
430 for (const auto i_ch : make_range(_n_channels))
431 {
432 auto * node_in = _subchannel_mesh.getChannelNode(i_ch, 0);
433 const Real mdot_in = (*_mdot_soln)(node_in);
434 const Real rho_in = (*_rho_soln)(node_in);
435 viscosity_in += mdot_in * (*_mu_soln)(node_in);
436 volumetric_flow_in += mdot_in / rho_in;
437 mass_flow_in += mdot_in;
438 }
440 const Real flow_area = _subchannel_mesh.getAssemblyFlowArea();
441 const Real inlet_mu = viscosity_in / mass_flow_in;
442 _bulk_Re = mass_flow_in * bulk_Dh / (inlet_mu * flow_area);
443 _bulk_V = volumetric_flow_in / flow_area;
444 }
445 // Only rank 0 owns the subchannel DOFs (SingleRankPartitioner), so share the result
448
449 if (MooseUtils::absoluteFuzzyEqual(_bulk_Re, 0.0))
450 mooseError("The computed bulk Reynolds number is zero.");
451
452 if (MooseUtils::absoluteFuzzyEqual(_bulk_V, 0.0))
453 mooseError("The computed bulk velocity is zero.");
454
456}
void mooseError(Args &&... args) const
virtual void computeBulkMixingParameters() const
Precomputes the mixing coefficients that depend only on the bulk flow.
const SCMMixingClosureBase * _mixing_closure
Turbulent Mixing closure object.
Real _bulk_Re
Assembly bulk Reynolds number.
Real _bulk_V
Assembly bulk velocity.
Real getAssemblyFlowArea() const
Return undeformed bundle inlet flow area.
Real getAssemblyHydraulicDiameter() const
Return undeformed bundle-average hydraulic diameter.
void broadcast(T &data, const unsigned int root_id=0, const bool identical_sizes=false) const
const Parallel::Communicator & _communicator
processor_id_type processor_id() const
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
IntRange< T > make_range(T beg, T end)

Referenced by SubChannel1PhaseProblem::externalSolve().

◆ computeDP()

void SubChannel1PhaseProblem::computeDP ( int  iblock)
protectedinherited

Computes Pressure Drop per channel for block iblock.

Upwind local form loss

Upwind local form loss

Advective derivative term

Cross derivative term

Friction term

Upwind local form loss

Gravity force

Assembling system

Definition at line 834 of file SubChannel1PhaseProblem.C.

835{
836 const unsigned int last_node = (iblock + 1) * _block_size;
837 const unsigned int first_node = iblock * _block_size + 1;
838 if (!_implicit_bool)
839 {
840 for (unsigned int iz = first_node; iz < last_node + 1; iz++)
841 {
842 auto k_grid = _subchannel_mesh.getKGrid();
843 auto dz = _z_grid[iz] - _z_grid[iz - 1];
844 for (unsigned int i_ch = 0; i_ch < _n_channels; i_ch++)
845 {
846 auto * node_in = _subchannel_mesh.getChannelNode(i_ch, iz - 1);
847 auto * node_out = _subchannel_mesh.getChannelNode(i_ch, iz);
848 auto rho_in = (*_rho_soln)(node_in);
849 auto rho_out = (*_rho_soln)(node_out);
850 auto mu_in = (*_mu_soln)(node_in);
851 auto S = (*_S_flow_soln)(node_in);
852 auto w_perim = (*_w_perim_soln)(node_in);
853 // hydraulic diameter in the i direction
854 auto Dh_i = 4.0 * S / w_perim;
855 auto time_term = _TR * ((*_mdot_soln)(node_out)-_mdot_soln->old(node_out)) * dz / _dt -
856 dz * 2.0 * (*_mdot_soln)(node_out) * (rho_out - _rho_soln->old(node_out)) /
857 rho_in / _dt;
858 auto mass_term1 =
859 Utility::pow<2>((*_mdot_soln)(node_out)) * (1.0 / S / rho_out - 1.0 / S / rho_in);
860 auto mass_term2 = -2.0 * (*_mdot_soln)(node_out) * (*_SumWij_soln)(node_out) / S / rho_in;
861 auto crossflow_term = 0.0;
862 auto turbulent_term = 0.0;
863 unsigned int counter = 0;
864 for (auto i_gap : _subchannel_mesh.getChannelGaps(i_ch))
865 {
866 auto chans = _subchannel_mesh.getGapChannels(i_gap);
867 unsigned int ii_ch = chans.first;
868 unsigned int jj_ch = chans.second;
869 auto * node_in_i = _subchannel_mesh.getChannelNode(ii_ch, iz - 1);
870 auto * node_in_j = _subchannel_mesh.getChannelNode(jj_ch, iz - 1);
871 auto * node_out_i = _subchannel_mesh.getChannelNode(ii_ch, iz);
872 auto * node_out_j = _subchannel_mesh.getChannelNode(jj_ch, iz);
873 auto rho_i = (*_rho_soln)(node_in_i);
874 auto rho_j = (*_rho_soln)(node_in_j);
875 auto Si = (*_S_flow_soln)(node_in_i);
876 auto Sj = (*_S_flow_soln)(node_in_j);
877 Real u_star = 0.0;
878 // figure out donor axial velocity
879 if (_Wij(i_gap, iz) > 0.0)
880 u_star = (*_mdot_soln)(node_out_i) / Si / rho_i;
881 else
882 u_star = (*_mdot_soln)(node_out_j) / Sj / rho_j;
883
884 crossflow_term +=
885 _subchannel_mesh.getCrossflowSign(i_ch, counter) * _Wij(i_gap, iz) * u_star;
886
887 turbulent_term += _WijPrime(i_gap, iz) * (2 * (*_mdot_soln)(node_out) / rho_in / S -
888 (*_mdot_soln)(node_out_j) / Sj / rho_j -
889 (*_mdot_soln)(node_out_i) / Si / rho_i);
890 counter++;
891 }
892 turbulent_term *= _CT;
893 auto Re = (((*_mdot_soln)(node_in) / S) * Dh_i / mu_in);
894 _friction_args = FrictionStruct(i_ch, Re, S, w_perim);
896 if (_ff_soln)
897 _ff_soln->set(node_out, ff);
899 auto ki = 0.0;
900 if ((*_mdot_soln)(node_out) >= 0)
901 ki = k_grid[i_ch][iz - 1];
902 else
903 ki = k_grid[i_ch][iz];
904 auto friction_term = (ff * dz / Dh_i + ki) * 0.5 *
905 (*_mdot_soln)(node_out)*std::abs((*_mdot_soln)(node_out)) /
906 (S * (*_rho_soln)(node_out));
907 auto gravity_term = _dir_grav * _g_grav * (*_rho_soln)(node_out)*dz * S;
908 auto DP = (1 / S) * (time_term + mass_term1 + mass_term2 + crossflow_term + turbulent_term +
909 friction_term + gravity_term); // Pa
910 _DP(i_ch, iz) = DP;
911 if (_DP_soln)
912 _DP_soln->set(node_out, DP);
913 }
914 }
915 }
916 else
917 {
918 LibmeshPetscCall(MatZeroEntries(_amc_time_derivative_mat));
919 LibmeshPetscCall(MatZeroEntries(_amc_advective_derivative_mat));
920 LibmeshPetscCall(MatZeroEntries(_amc_cross_derivative_mat));
921 LibmeshPetscCall(MatZeroEntries(_amc_friction_force_mat));
922 LibmeshPetscCall(VecZeroEntries(_amc_time_derivative_rhs));
923 LibmeshPetscCall(VecZeroEntries(_amc_advective_derivative_rhs));
924 LibmeshPetscCall(VecZeroEntries(_amc_cross_derivative_rhs));
925 LibmeshPetscCall(VecZeroEntries(_amc_friction_force_rhs));
926 LibmeshPetscCall(VecZeroEntries(_amc_gravity_rhs));
927 LibmeshPetscCall(MatZeroEntries(_amc_sys_mdot_mat));
928 LibmeshPetscCall(VecZeroEntries(_amc_sys_mdot_rhs));
929 for (unsigned int iz = first_node; iz < last_node + 1; iz++)
930 {
931 auto k_grid = _subchannel_mesh.getKGrid();
932 auto dz = _z_grid[iz] - _z_grid[iz - 1];
933 auto iz_ind = iz - first_node;
934 for (unsigned int i_ch = 0; i_ch < _n_channels; i_ch++)
935 {
936 // inlet and outlet nodes
937 auto * node_in = _subchannel_mesh.getChannelNode(i_ch, iz - 1);
938 auto * node_out = _subchannel_mesh.getChannelNode(i_ch, iz);
939
940 // interpolation weight coefficient
941 PetscScalar Pe = 0.5;
942 if (_interpolation_scheme == 3)
943 {
944 // Compute the Peclet number
945 auto S_in = (*_S_flow_soln)(node_in);
946 auto S_out = (*_S_flow_soln)(node_out);
947 auto S_interp = computeInterpolatedValue(S_out, S_in, 0.5);
948 auto w_perim_in = (*_w_perim_soln)(node_in);
949 auto w_perim_out = (*_w_perim_soln)(node_out);
950 auto w_perim_interp = this->computeInterpolatedValue(w_perim_out, w_perim_in, 0.5);
951 auto mdot_loc =
952 this->computeInterpolatedValue((*_mdot_soln)(node_out), (*_mdot_soln)(node_in), 0.5);
953 auto mu_in = (*_mu_soln)(node_in);
954 auto mu_out = (*_mu_soln)(node_out);
955 auto mu_interp = this->computeInterpolatedValue(mu_out, mu_in, 0.5);
956 auto Dh_i = 4.0 * S_interp / w_perim_interp;
957 // Compute friction factor
958 auto Re = ((mdot_loc / S_interp) * Dh_i / mu_interp);
959 _friction_args = FrictionStruct(i_ch, Re, S_interp, w_perim_interp);
961 if (_ff_soln)
962 _ff_soln->set(node_out, ff);
964 auto ki = 0.0;
965 if ((*_mdot_soln)(node_out) >= 0)
966 ki = k_grid[i_ch][iz - 1];
967 else
968 ki = k_grid[i_ch][iz];
969 Pe = 1.0 / ((ff * dz / Dh_i + ki) * 0.5) * mdot_loc / std::abs(mdot_loc);
970 }
971 auto alpha = computeInterpolationCoefficients(Pe);
972
973 // inlet, outlet, and interpolated density
974 auto rho_in = (*_rho_soln)(node_in);
975 auto rho_out = (*_rho_soln)(node_out);
976 auto rho_interp = computeInterpolatedValue(rho_out, rho_in, Pe);
977
978 // inlet, outlet, and interpolated viscosity
979 auto mu_in = (*_mu_soln)(node_in);
980 auto mu_out = (*_mu_soln)(node_out);
981 auto mu_interp = computeInterpolatedValue(mu_out, mu_in, Pe);
982
983 // inlet, outlet, and interpolated axial surface area
984 auto S_in = (*_S_flow_soln)(node_in);
985 auto S_out = (*_S_flow_soln)(node_out);
986 auto S_interp = computeInterpolatedValue(S_out, S_in, Pe);
987
988 // inlet, outlet, and interpolated wetted perimeter
989 auto w_perim_in = (*_w_perim_soln)(node_in);
990 auto w_perim_out = (*_w_perim_soln)(node_out);
991 auto w_perim_interp = computeInterpolatedValue(w_perim_out, w_perim_in, Pe);
992
993 // hydraulic diameter in the i direction
994 auto Dh_i = 4.0 * S_interp / w_perim_interp;
995
996 // Keep temporal storage independent of the spatial interpolation scheme. Applying the
997 // upwind coefficient to this term puts the storage on the upstream node and leaves the
998 // first axial row without transient inertia in the upwind limit.
999 PetscInt row_tt = i_ch + _n_channels * iz_ind;
1000 PetscInt col_tt = i_ch + _n_channels * iz_ind;
1001 PetscScalar value_tt = _TR * dz / _dt;
1002 LibmeshPetscCall(MatSetValues(
1003 _amc_time_derivative_mat, 1, &row_tt, 1, &col_tt, &value_tt, INSERT_VALUES));
1004
1005 PetscScalar value_vec_tt = _TR * _mdot_soln->old(node_out) * dz / _dt;
1006 PetscInt row_vec_tt = i_ch + _n_channels * iz_ind;
1007 LibmeshPetscCall(
1008 VecSetValues(_amc_time_derivative_rhs, 1, &row_vec_tt, &value_vec_tt, ADD_VALUES));
1009
1011 if (iz == first_node)
1012 {
1013 PetscScalar value_vec_at = Utility::pow<2>((*_mdot_soln)(node_in)) / (S_in * rho_in);
1014 PetscInt row_vec_at = i_ch + _n_channels * iz_ind;
1015 LibmeshPetscCall(VecSetValues(
1016 _amc_advective_derivative_rhs, 1, &row_vec_at, &value_vec_at, ADD_VALUES));
1017 }
1018 else
1019 {
1020 PetscInt row_at = i_ch + _n_channels * iz_ind;
1021 PetscInt col_at = i_ch + _n_channels * (iz_ind - 1);
1022 PetscScalar value_at = -1.0 * std::abs((*_mdot_soln)(node_in)) / (S_in * rho_in);
1023 LibmeshPetscCall(MatSetValues(
1024 _amc_advective_derivative_mat, 1, &row_at, 1, &col_at, &value_at, INSERT_VALUES));
1025 }
1026
1027 // Adding diagonal elements
1028 PetscInt row_at = i_ch + _n_channels * iz_ind;
1029 PetscInt col_at = i_ch + _n_channels * iz_ind;
1030 PetscScalar value_at = std::abs((*_mdot_soln)(node_out)) / (S_out * rho_out);
1031 LibmeshPetscCall(MatSetValues(
1032 _amc_advective_derivative_mat, 1, &row_at, 1, &col_at, &value_at, INSERT_VALUES));
1033
1035 unsigned int counter = 0;
1036 unsigned int cross_index = iz; // iz-1;
1037 for (auto i_gap : _subchannel_mesh.getChannelGaps(i_ch))
1038 {
1039 auto chans = _subchannel_mesh.getGapChannels(i_gap);
1040 unsigned int ii_ch = chans.first;
1041 unsigned int jj_ch = chans.second;
1042 auto * node_in_i = _subchannel_mesh.getChannelNode(ii_ch, iz - 1);
1043 auto * node_in_j = _subchannel_mesh.getChannelNode(jj_ch, iz - 1);
1044 auto * node_out_i = _subchannel_mesh.getChannelNode(ii_ch, iz);
1045 auto * node_out_j = _subchannel_mesh.getChannelNode(jj_ch, iz);
1046 auto rho_i =
1047 computeInterpolatedValue((*_rho_soln)(node_out_i), (*_rho_soln)(node_in_i), Pe);
1048 auto rho_j =
1049 computeInterpolatedValue((*_rho_soln)(node_out_j), (*_rho_soln)(node_in_j), Pe);
1050 auto S_i =
1051 computeInterpolatedValue((*_S_flow_soln)(node_out_i), (*_S_flow_soln)(node_in_i), Pe);
1052 auto S_j =
1053 computeInterpolatedValue((*_S_flow_soln)(node_out_j), (*_S_flow_soln)(node_in_j), Pe);
1054 auto u_star = 0.0;
1055 // figure out donor axial velocity
1056 if (_Wij(i_gap, cross_index) > 0.0)
1057 {
1058 if (iz == first_node)
1059 {
1060 u_star = (*_mdot_soln)(node_in_i) / S_i / rho_i;
1061 PetscScalar value_vec_ct = -1.0 * alpha *
1062 _subchannel_mesh.getCrossflowSign(i_ch, counter) *
1063 _Wij(i_gap, cross_index) * u_star;
1064 PetscInt row_vec_ct = i_ch + _n_channels * iz_ind;
1065 LibmeshPetscCall(VecSetValues(
1066 _amc_cross_derivative_rhs, 1, &row_vec_ct, &value_vec_ct, ADD_VALUES));
1067 }
1068 else
1069 {
1070 PetscScalar value_ct = alpha * _subchannel_mesh.getCrossflowSign(i_ch, counter) *
1071 _Wij(i_gap, cross_index) / S_i / rho_i;
1072 PetscInt row_ct = i_ch + _n_channels * iz_ind;
1073 PetscInt col_ct = ii_ch + _n_channels * (iz_ind - 1);
1074 LibmeshPetscCall(MatSetValues(
1075 _amc_cross_derivative_mat, 1, &row_ct, 1, &col_ct, &value_ct, ADD_VALUES));
1076 }
1077 PetscScalar value_ct = (1.0 - alpha) *
1078 _subchannel_mesh.getCrossflowSign(i_ch, counter) *
1079 _Wij(i_gap, cross_index) / S_i / rho_i;
1080 PetscInt row_ct = i_ch + _n_channels * iz_ind;
1081 PetscInt col_ct = ii_ch + _n_channels * iz_ind;
1082 LibmeshPetscCall(MatSetValues(
1083 _amc_cross_derivative_mat, 1, &row_ct, 1, &col_ct, &value_ct, ADD_VALUES));
1084 }
1085 else if (_Wij(i_gap, cross_index) < 0.0) // _Wij=0 operations not necessary
1086 {
1087 if (iz == first_node)
1088 {
1089 u_star = (*_mdot_soln)(node_in_j) / S_j / rho_j;
1090 PetscScalar value_vec_ct = -1.0 * alpha *
1091 _subchannel_mesh.getCrossflowSign(i_ch, counter) *
1092 _Wij(i_gap, cross_index) * u_star;
1093 PetscInt row_vec_ct = i_ch + _n_channels * iz_ind;
1094 LibmeshPetscCall(VecSetValues(
1095 _amc_cross_derivative_rhs, 1, &row_vec_ct, &value_vec_ct, ADD_VALUES));
1096 }
1097 else
1098 {
1099 PetscScalar value_ct = alpha * _subchannel_mesh.getCrossflowSign(i_ch, counter) *
1100 _Wij(i_gap, cross_index) / S_j / rho_j;
1101 PetscInt row_ct = i_ch + _n_channels * iz_ind;
1102 PetscInt col_ct = jj_ch + _n_channels * (iz_ind - 1);
1103 LibmeshPetscCall(MatSetValues(
1104 _amc_cross_derivative_mat, 1, &row_ct, 1, &col_ct, &value_ct, ADD_VALUES));
1105 }
1106 PetscScalar value_ct = (1.0 - alpha) *
1107 _subchannel_mesh.getCrossflowSign(i_ch, counter) *
1108 _Wij(i_gap, cross_index) / S_j / rho_j;
1109 PetscInt row_ct = i_ch + _n_channels * iz_ind;
1110 PetscInt col_ct = jj_ch + _n_channels * iz_ind;
1111 LibmeshPetscCall(MatSetValues(
1112 _amc_cross_derivative_mat, 1, &row_ct, 1, &col_ct, &value_ct, ADD_VALUES));
1113 }
1114
1115 if (iz == first_node)
1116 {
1117 PetscScalar value_vec_ct = -2.0 * alpha * (*_mdot_soln)(node_in)*_CT *
1118 _WijPrime(i_gap, cross_index) / (rho_interp * S_interp);
1119 value_vec_ct += alpha * (*_mdot_soln)(node_in_j)*_CT * _WijPrime(i_gap, cross_index) /
1120 (rho_j * S_j);
1121 value_vec_ct += alpha * (*_mdot_soln)(node_in_i)*_CT * _WijPrime(i_gap, cross_index) /
1122 (rho_i * S_i);
1123 PetscInt row_vec_ct = i_ch + _n_channels * iz_ind;
1124 LibmeshPetscCall(
1125 VecSetValues(_amc_cross_derivative_rhs, 1, &row_vec_ct, &value_vec_ct, ADD_VALUES));
1126 }
1127 else
1128 {
1129 PetscScalar value_center_ct =
1130 2.0 * alpha * _CT * _WijPrime(i_gap, cross_index) / (rho_interp * S_interp);
1131 PetscInt row_ct = i_ch + _n_channels * iz_ind;
1132 PetscInt col_ct = i_ch + _n_channels * (iz_ind - 1);
1133 LibmeshPetscCall(MatSetValues(
1134 _amc_cross_derivative_mat, 1, &row_ct, 1, &col_ct, &value_center_ct, ADD_VALUES));
1135
1136 PetscScalar value_left_ct =
1137 -1.0 * alpha * _CT * _WijPrime(i_gap, cross_index) / (rho_j * S_j);
1138 row_ct = i_ch + _n_channels * iz_ind;
1139 col_ct = jj_ch + _n_channels * (iz_ind - 1);
1140 LibmeshPetscCall(MatSetValues(
1141 _amc_cross_derivative_mat, 1, &row_ct, 1, &col_ct, &value_left_ct, ADD_VALUES));
1142
1143 PetscScalar value_right_ct =
1144 -1.0 * alpha * _CT * _WijPrime(i_gap, cross_index) / (rho_i * S_i);
1145 row_ct = i_ch + _n_channels * iz_ind;
1146 col_ct = ii_ch + _n_channels * (iz_ind - 1);
1147 LibmeshPetscCall(MatSetValues(
1148 _amc_cross_derivative_mat, 1, &row_ct, 1, &col_ct, &value_right_ct, ADD_VALUES));
1149 }
1150
1151 PetscScalar value_center_ct =
1152 2.0 * (1.0 - alpha) * _CT * _WijPrime(i_gap, cross_index) / (rho_interp * S_interp);
1153 PetscInt row_ct = i_ch + _n_channels * iz_ind;
1154 PetscInt col_ct = i_ch + _n_channels * iz_ind;
1155 LibmeshPetscCall(MatSetValues(
1156 _amc_cross_derivative_mat, 1, &row_ct, 1, &col_ct, &value_center_ct, ADD_VALUES));
1157
1158 PetscScalar value_left_ct =
1159 -1.0 * (1.0 - alpha) * _CT * _WijPrime(i_gap, cross_index) / (rho_j * S_j);
1160 row_ct = i_ch + _n_channels * iz_ind;
1161 col_ct = jj_ch + _n_channels * iz_ind;
1162 LibmeshPetscCall(MatSetValues(
1163 _amc_cross_derivative_mat, 1, &row_ct, 1, &col_ct, &value_left_ct, ADD_VALUES));
1164
1165 PetscScalar value_right_ct =
1166 -1.0 * (1.0 - alpha) * _CT * _WijPrime(i_gap, cross_index) / (rho_i * S_i);
1167 row_ct = i_ch + _n_channels * iz_ind;
1168 col_ct = ii_ch + _n_channels * iz_ind;
1169 LibmeshPetscCall(MatSetValues(
1170 _amc_cross_derivative_mat, 1, &row_ct, 1, &col_ct, &value_right_ct, ADD_VALUES));
1171 counter++;
1172 }
1173
1175 PetscScalar mdot_interp =
1176 computeInterpolatedValue((*_mdot_soln)(node_out), (*_mdot_soln)(node_in), Pe);
1177 auto Re = ((mdot_interp / S_interp) * Dh_i / mu_interp);
1178 _friction_args = FrictionStruct(i_ch, Re, S_interp, w_perim_interp);
1180 if (_ff_soln)
1181 _ff_soln->set(node_out, ff);
1183 auto ki = 0.0;
1184 if ((*_mdot_soln)(node_out) >= 0)
1185 ki = k_grid[i_ch][iz - 1];
1186 else
1187 ki = k_grid[i_ch][iz];
1188 auto coef = (ff * dz / Dh_i + ki) * 0.5 * std::abs((*_mdot_soln)(node_out)) /
1189 (S_interp * rho_interp);
1190 if (iz == first_node)
1191 {
1192 PetscScalar value_vec = -1.0 * alpha * coef * (*_mdot_soln)(node_in);
1193 PetscInt row_vec = i_ch + _n_channels * iz_ind;
1194 LibmeshPetscCall(
1195 VecSetValues(_amc_friction_force_rhs, 1, &row_vec, &value_vec, ADD_VALUES));
1196 }
1197 else
1198 {
1199 PetscInt row = i_ch + _n_channels * iz_ind;
1200 PetscInt col = i_ch + _n_channels * (iz_ind - 1);
1201 PetscScalar value = alpha * coef;
1202 LibmeshPetscCall(
1203 MatSetValues(_amc_friction_force_mat, 1, &row, 1, &col, &value, INSERT_VALUES));
1204 }
1205
1206 // Adding diagonal elements
1207 PetscInt row = i_ch + _n_channels * iz_ind;
1208 PetscInt col = i_ch + _n_channels * iz_ind;
1209 PetscScalar value = (1.0 - alpha) * coef;
1210 LibmeshPetscCall(
1211 MatSetValues(_amc_friction_force_mat, 1, &row, 1, &col, &value, INSERT_VALUES));
1212
1214 PetscScalar value_vec = _dir_grav * -1.0 * _g_grav * rho_interp * dz * S_interp;
1215 PetscInt row_vec = i_ch + _n_channels * iz_ind;
1216 LibmeshPetscCall(VecSetValues(_amc_gravity_rhs, 1, &row_vec, &value_vec, ADD_VALUES));
1217 }
1218 }
1220 LibmeshPetscCall(MatZeroEntries(_amc_sys_mdot_mat));
1221 LibmeshPetscCall(VecZeroEntries(_amc_sys_mdot_rhs));
1222 LibmeshPetscCall(MatAssemblyBegin(_amc_time_derivative_mat, MAT_FINAL_ASSEMBLY));
1223 LibmeshPetscCall(MatAssemblyEnd(_amc_time_derivative_mat, MAT_FINAL_ASSEMBLY));
1224 LibmeshPetscCall(MatAssemblyBegin(_amc_advective_derivative_mat, MAT_FINAL_ASSEMBLY));
1225 LibmeshPetscCall(MatAssemblyEnd(_amc_advective_derivative_mat, MAT_FINAL_ASSEMBLY));
1226 LibmeshPetscCall(MatAssemblyBegin(_amc_cross_derivative_mat, MAT_FINAL_ASSEMBLY));
1227 LibmeshPetscCall(MatAssemblyEnd(_amc_cross_derivative_mat, MAT_FINAL_ASSEMBLY));
1228 LibmeshPetscCall(MatAssemblyBegin(_amc_friction_force_mat, MAT_FINAL_ASSEMBLY));
1229 LibmeshPetscCall(MatAssemblyEnd(_amc_friction_force_mat, MAT_FINAL_ASSEMBLY));
1230 LibmeshPetscCall(MatAssemblyBegin(_amc_sys_mdot_mat, MAT_FINAL_ASSEMBLY));
1231 LibmeshPetscCall(MatAssemblyEnd(_amc_sys_mdot_mat, MAT_FINAL_ASSEMBLY));
1232 // Matrix
1233#if !PETSC_VERSION_LESS_THAN(3, 15, 0)
1234 LibmeshPetscCall(
1235 MatAXPY(_amc_sys_mdot_mat, 1.0, _amc_time_derivative_mat, UNKNOWN_NONZERO_PATTERN));
1236 LibmeshPetscCall(MatAssemblyBegin(_amc_sys_mdot_mat, MAT_FINAL_ASSEMBLY));
1237 LibmeshPetscCall(MatAssemblyEnd(_amc_sys_mdot_mat, MAT_FINAL_ASSEMBLY));
1238 LibmeshPetscCall(
1239 MatAXPY(_amc_sys_mdot_mat, 1.0, _amc_advective_derivative_mat, UNKNOWN_NONZERO_PATTERN));
1240 LibmeshPetscCall(MatAssemblyBegin(_amc_sys_mdot_mat, MAT_FINAL_ASSEMBLY));
1241 LibmeshPetscCall(MatAssemblyEnd(_amc_sys_mdot_mat, MAT_FINAL_ASSEMBLY));
1242 LibmeshPetscCall(
1243 MatAXPY(_amc_sys_mdot_mat, 1.0, _amc_cross_derivative_mat, UNKNOWN_NONZERO_PATTERN));
1244 LibmeshPetscCall(MatAssemblyBegin(_amc_sys_mdot_mat, MAT_FINAL_ASSEMBLY));
1245 LibmeshPetscCall(MatAssemblyEnd(_amc_sys_mdot_mat, MAT_FINAL_ASSEMBLY));
1246 LibmeshPetscCall(
1247 MatAXPY(_amc_sys_mdot_mat, 1.0, _amc_friction_force_mat, UNKNOWN_NONZERO_PATTERN));
1248#else
1249 LibmeshPetscCall(
1250 MatAXPY(_amc_sys_mdot_mat, 1.0, _amc_time_derivative_mat, DIFFERENT_NONZERO_PATTERN));
1251 LibmeshPetscCall(MatAssemblyBegin(_amc_sys_mdot_mat, MAT_FINAL_ASSEMBLY));
1252 LibmeshPetscCall(MatAssemblyEnd(_amc_sys_mdot_mat, MAT_FINAL_ASSEMBLY));
1253 LibmeshPetscCall(
1254 MatAXPY(_amc_sys_mdot_mat, 1.0, _amc_advective_derivative_mat, DIFFERENT_NONZERO_PATTERN));
1255 LibmeshPetscCall(MatAssemblyBegin(_amc_sys_mdot_mat, MAT_FINAL_ASSEMBLY));
1256 LibmeshPetscCall(MatAssemblyEnd(_amc_sys_mdot_mat, MAT_FINAL_ASSEMBLY));
1257 LibmeshPetscCall(
1258 MatAXPY(_amc_sys_mdot_mat, 1.0, _amc_cross_derivative_mat, DIFFERENT_NONZERO_PATTERN));
1259 LibmeshPetscCall(MatAssemblyBegin(_amc_sys_mdot_mat, MAT_FINAL_ASSEMBLY));
1260 LibmeshPetscCall(MatAssemblyEnd(_amc_sys_mdot_mat, MAT_FINAL_ASSEMBLY));
1261 LibmeshPetscCall(
1262 MatAXPY(_amc_sys_mdot_mat, 1.0, _amc_friction_force_mat, DIFFERENT_NONZERO_PATTERN));
1263#endif
1264 LibmeshPetscCall(MatAssemblyBegin(_amc_sys_mdot_mat, MAT_FINAL_ASSEMBLY));
1265 LibmeshPetscCall(MatAssemblyEnd(_amc_sys_mdot_mat, MAT_FINAL_ASSEMBLY));
1266 // RHS
1267 LibmeshPetscCall(VecAXPY(_amc_sys_mdot_rhs, 1.0, _amc_time_derivative_rhs));
1268 LibmeshPetscCall(VecAXPY(_amc_sys_mdot_rhs, 1.0, _amc_advective_derivative_rhs));
1269 LibmeshPetscCall(VecAXPY(_amc_sys_mdot_rhs, 1.0, _amc_cross_derivative_rhs));
1270 LibmeshPetscCall(VecAXPY(_amc_sys_mdot_rhs, 1.0, _amc_friction_force_rhs));
1271 LibmeshPetscCall(VecAXPY(_amc_sys_mdot_rhs, 1.0, _amc_gravity_rhs));
1272 if (_segregated_bool)
1273 {
1274 // Assembly the matrix system
1275 LibmeshPetscCall(populateVectorFromHandle<SolutionHandle>(
1276 _prod, *_mdot_soln, first_node, last_node, _n_channels));
1277 Vec ls;
1278 LibmeshPetscCall(VecDuplicate(_amc_sys_mdot_rhs, &ls));
1279 LibmeshPetscCall(MatMult(_amc_sys_mdot_mat, _prod, ls));
1280 LibmeshPetscCall(VecAXPY(ls, -1.0, _amc_sys_mdot_rhs));
1281 PetscScalar * xx;
1282 LibmeshPetscCall(VecGetArray(ls, &xx));
1283 for (unsigned int iz = first_node; iz < last_node + 1; iz++)
1284 {
1285 auto iz_ind = iz - first_node;
1286 for (unsigned int i_ch = 0; i_ch < _n_channels; i_ch++)
1287 {
1288 // Setting nodes
1289 auto * node_in = _subchannel_mesh.getChannelNode(i_ch, iz - 1);
1290 auto * node_out = _subchannel_mesh.getChannelNode(i_ch, iz);
1291
1292 // inlet, outlet, and interpolated axial surface area
1293 auto S_in = (*_S_flow_soln)(node_in);
1294 auto S_out = (*_S_flow_soln)(node_out);
1295 auto S_interp = computeInterpolatedValue(S_out, S_in, 0.5);
1296
1297 // Setting solutions
1298 if (S_interp != 0)
1299 {
1300 auto DP = (1 / S_interp) * xx[iz_ind * _n_channels + i_ch];
1301 _DP(i_ch, iz) = DP;
1302 if (_DP_soln)
1303 _DP_soln->set(node_out, DP);
1304 }
1305 else
1306 {
1307 auto DP = 0.0;
1308 _DP(i_ch, iz) = DP;
1309 if (_DP_soln)
1310 _DP_soln->set(node_out, DP);
1311 }
1312 }
1313 }
1314 LibmeshPetscCall(VecDestroy(&ls));
1315 }
1316 }
1317}
const double Re
virtual Real computeFrictionFactor(const FrictionStruct &friction_info) const =0
Computes the friction factor for the local conditions.
libMesh::DenseMatrix< Real > _DP
const bool _segregated_bool
Segregated solve.
PetscScalar computeInterpolatedValue(PetscScalar topValue, PetscScalar botValue, PetscScalar Peclet=0.0)
const SCMFrictionClosureBase * _friction_closure
Friction closure object.
libMesh::DenseMatrix< Real > _WijPrime
std::unique_ptr< SolutionHandle > _DP_soln
const MooseEnum _interpolation_scheme
The interpolation method used in constructing the systems.
std::unique_ptr< SolutionHandle > _rho_soln
struct SubChannel1PhaseProblem::FrictionStruct _friction_args
std::unique_ptr< SolutionHandle > _S_flow_soln
libMesh::DenseMatrix< Real > & _Wij
Real _TR
Flag that activates or deactivates the transient parts of the equations we solve by multiplication.
PetscScalar computeInterpolationCoefficients(PetscScalar Peclet=0.0)
Functions that computes the interpolation scheme given the Peclet number.
Real _CT
Turbulent modeling parameter used in axial momentum equation.
std::unique_ptr< SolutionHandle > _SumWij_soln
const bool _implicit_bool
Flag to define the usage of a implicit or explicit solution.
std::unique_ptr< SolutionHandle > _mdot_soln
Solutions handles and link to TH tables properties.
std::unique_ptr< SolutionHandle > _ff_soln
virtual const std::pair< unsigned int, unsigned int > & getGapChannels(unsigned int i_gap) const =0
Return a pair of subchannel indices for a given gap index.
virtual const Real & getCrossflowSign(unsigned int i_chan, unsigned int i_local) const =0
Return a sign for the crossflow given a subchannel index and local neighbor index.
virtual const std::vector< std::vector< Real > > & getKGrid() const
Get axial cell location and value of loss coefficient.
Real value(unsigned n, unsigned alpha, unsigned beta, Real x)

Referenced by SubChannel1PhaseProblem::implicitPetscSolve(), and SubChannel1PhaseProblem::residualFunction().

◆ computeGravityDir()

Real SubChannel1PhaseProblem::computeGravityDir ( const MooseEnum &  dir) const
inlineprotectedinherited

inline function that is used to define the gravity direction

Definition at line 166 of file SubChannel1PhaseProblem.h.

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 }
const std::string & name() const

◆ computeh()

void QuadSubChannel1PhaseProblem::computeh ( int  iblock)
overrideprotectedvirtual

Computes Enthalpy per channel for block iblock.

Advective derivative term

Cross derivative term

Added heat enthalpy

Assembling system

Implements SubChannel1PhaseProblem.

Definition at line 243 of file QuadSubChannel1PhaseProblem.C.

244{
245 unsigned int last_node = (iblock + 1) * _block_size;
246 unsigned int first_node = iblock * _block_size + 1;
247 if (iblock == 0)
248 {
249 for (unsigned int i_ch = 0; i_ch < _n_channels; i_ch++)
250 {
251 auto * node = _subchannel_mesh.getChannelNode(i_ch, 0);
252 auto h_out = _fp->h_from_p_T((*_P_soln)(node) + _P_out, (*_T_soln)(node));
253 if (h_out < 0)
254 {
256 name(), " : Calculation of negative Enthalpy h_out = : ", h_out, " Axial Level= : ", 0);
257 }
258 _h_soln->set(node, h_out);
259 }
260 }
261
262 if (!_implicit_bool)
263 {
264 for (unsigned int iz = first_node; iz < last_node + 1; iz++)
265 {
266 auto dz = _z_grid[iz] - _z_grid[iz - 1];
267 for (unsigned int i_ch = 0; i_ch < _n_channels; i_ch++)
268 {
269 auto * node_in = _subchannel_mesh.getChannelNode(i_ch, iz - 1);
270 auto * node_out = _subchannel_mesh.getChannelNode(i_ch, iz);
271 auto mdot_in = (*_mdot_soln)(node_in);
272 auto h_in = (*_h_soln)(node_in); // J/kg
273 auto volume = dz * (*_S_flow_soln)(node_in);
274 auto mdot_out = (*_mdot_soln)(node_out);
275 auto h_out = 0.0;
276 Real sumWijh = 0.0;
277 Real sumWijPrimeDhij = 0.0;
278 Real added_enthalpy = computeAddedHeatPin(i_ch, iz);
279 // Calculate sum of crossflow into channel i from channels j around i
280 unsigned int counter = 0;
281 for (auto i_gap : _subchannel_mesh.getChannelGaps(i_ch))
282 {
283 auto chans = _subchannel_mesh.getGapChannels(i_gap);
284 unsigned int ii_ch = chans.first;
285 // i is always the smallest and first index in the mapping
286 unsigned int jj_ch = chans.second;
287 auto * node_in_i = _subchannel_mesh.getChannelNode(ii_ch, iz - 1);
288 auto * node_in_j = _subchannel_mesh.getChannelNode(jj_ch, iz - 1);
289 // Define donor enthalpy
290 Real h_star = 0.0;
291 if (_Wij(i_gap, iz) > 0.0)
292 h_star = (*_h_soln)(node_in_i);
293 else if (_Wij(i_gap, iz) < 0.0)
294 h_star = (*_h_soln)(node_in_j);
295 // take care of the sign by applying the map, use donor cell
296 sumWijh += _subchannel_mesh.getCrossflowSign(i_ch, counter) * _Wij(i_gap, iz) * h_star;
297 sumWijPrimeDhij += _WijPrime(i_gap, iz) * (2 * (*_h_soln)(node_in) -
298 (*_h_soln)(node_in_j) - (*_h_soln)(node_in_i));
299 counter++;
300 }
301 h_out = (mdot_in * h_in - sumWijh - sumWijPrimeDhij + added_enthalpy +
302 _TR * _rho_soln->old(node_out) * _h_soln->old(node_out) * volume / _dt) /
303 (mdot_out + _TR * (*_rho_soln)(node_out)*volume / _dt);
304 if (h_out < 0)
305 {
307 " : Calculation of negative Enthalpy h_out = : ",
308 h_out,
309 " Axial Level= : ",
310 iz);
311 }
312 _h_soln->set(node_out, h_out); // J/kg
313 }
314 }
315 }
316 else
317 {
318 LibmeshPetscCall(MatZeroEntries(_hc_time_derivative_mat));
319 LibmeshPetscCall(MatZeroEntries(_hc_advective_derivative_mat));
320 LibmeshPetscCall(MatZeroEntries(_hc_cross_derivative_mat));
321 LibmeshPetscCall(VecZeroEntries(_hc_time_derivative_rhs));
322 LibmeshPetscCall(VecZeroEntries(_hc_advective_derivative_rhs));
323 LibmeshPetscCall(VecZeroEntries(_hc_cross_derivative_rhs));
324 LibmeshPetscCall(VecZeroEntries(_hc_added_heat_rhs));
325 LibmeshPetscCall(MatZeroEntries(_hc_sys_h_mat));
326 LibmeshPetscCall(VecZeroEntries(_hc_sys_h_rhs));
327 for (unsigned int iz = first_node; iz < last_node + 1; iz++)
328 {
329 auto dz = _z_grid[iz] - _z_grid[iz - 1];
330 auto iz_ind = iz - first_node;
331 for (unsigned int i_ch = 0; i_ch < _n_channels; i_ch++)
332 {
333 auto * node_in = _subchannel_mesh.getChannelNode(i_ch, iz - 1);
334 auto * node_out = _subchannel_mesh.getChannelNode(i_ch, iz);
335 auto S_in = (*_S_flow_soln)(node_in);
336 auto S_out = (*_S_flow_soln)(node_out);
337 auto S_interp = computeInterpolatedValue(S_out, S_in, 0.5);
338 auto volume = dz * S_interp;
339
340 // interpolation weight coefficient
341 auto alpha = computeInterpolationCoefficients(0.5);
342
343 // Keep temporal storage independent of the spatial interpolation scheme. Applying the
344 // upwind coefficient to this term puts the storage on the upstream node and makes the
345 // small-timestep matrix singular in the upwind limit.
346 PetscInt row_tt = i_ch + _n_channels * iz_ind;
347 PetscInt col_tt = i_ch + _n_channels * iz_ind;
348 PetscScalar value_tt = _TR * (*_rho_soln)(node_out)*volume / _dt;
349 LibmeshPetscCall(MatSetValues(
350 _hc_time_derivative_mat, 1, &row_tt, 1, &col_tt, &value_tt, INSERT_VALUES));
351
352 PetscScalar value_vec_tt =
353 _TR * _rho_soln->old(node_out) * _h_soln->old(node_out) * volume / _dt;
354 PetscInt row_vec_tt = i_ch + _n_channels * iz_ind;
355 LibmeshPetscCall(
356 VecSetValues(_hc_time_derivative_rhs, 1, &row_vec_tt, &value_vec_tt, ADD_VALUES));
357
359 if (iz == first_node)
360 {
361 PetscScalar value_vec_at = (*_mdot_soln)(node_in) * (*_h_soln)(node_in);
362 PetscInt row_vec_at = i_ch + _n_channels * iz_ind;
363 LibmeshPetscCall(VecSetValues(
364 _hc_advective_derivative_rhs, 1, &row_vec_at, &value_vec_at, ADD_VALUES));
365 }
366 else
367 {
368 PetscInt row_at = i_ch + _n_channels * iz_ind;
369 PetscInt col_at = i_ch + _n_channels * (iz_ind - 1);
370 PetscScalar value_at = -1.0 * (*_mdot_soln)(node_in);
371 LibmeshPetscCall(MatSetValues(
372 _hc_advective_derivative_mat, 1, &row_at, 1, &col_at, &value_at, INSERT_VALUES));
373 }
374
375 // Adding diagonal elements
376 PetscInt row_at = i_ch + _n_channels * iz_ind;
377 PetscInt col_at = i_ch + _n_channels * iz_ind;
378 PetscScalar value_at = (*_mdot_soln)(node_out);
379 LibmeshPetscCall(MatSetValues(
380 _hc_advective_derivative_mat, 1, &row_at, 1, &col_at, &value_at, INSERT_VALUES));
381
383 unsigned int counter = 0;
384 unsigned int cross_index = iz; // iz-1;
385 for (auto i_gap : _subchannel_mesh.getChannelGaps(i_ch))
386 {
387 auto chans = _subchannel_mesh.getGapChannels(i_gap);
388 unsigned int ii_ch = chans.first;
389 unsigned int jj_ch = chans.second;
390 auto * node_in_i = _subchannel_mesh.getChannelNode(ii_ch, iz - 1);
391 auto * node_in_j = _subchannel_mesh.getChannelNode(jj_ch, iz - 1);
392 PetscScalar h_star;
393 // figure out donor axial velocity
394 if (_Wij(i_gap, cross_index) > 0.0)
395 {
396 if (iz == first_node)
397 {
398 h_star = (*_h_soln)(node_in_i);
399 PetscScalar value_vec_ct = -1.0 * alpha *
400 _subchannel_mesh.getCrossflowSign(i_ch, counter) *
401 _Wij(i_gap, cross_index) * h_star;
402 PetscInt row_vec_ct = i_ch + _n_channels * iz_ind;
403 LibmeshPetscCall(VecSetValues(
404 _hc_cross_derivative_rhs, 1, &row_vec_ct, &value_vec_ct, ADD_VALUES));
405 }
406 else
407 {
408 PetscScalar value_ct = alpha * _subchannel_mesh.getCrossflowSign(i_ch, counter) *
409 _Wij(i_gap, cross_index);
410 PetscInt row_ct = i_ch + _n_channels * iz_ind;
411 PetscInt col_ct = ii_ch + _n_channels * (iz_ind - 1);
412 LibmeshPetscCall(MatSetValues(
413 _hc_cross_derivative_mat, 1, &row_ct, 1, &col_ct, &value_ct, ADD_VALUES));
414 }
415 PetscScalar value_ct = (1.0 - alpha) *
416 _subchannel_mesh.getCrossflowSign(i_ch, counter) *
417 _Wij(i_gap, cross_index);
418 PetscInt row_ct = i_ch + _n_channels * iz_ind;
419 PetscInt col_ct = ii_ch + _n_channels * iz_ind;
420 LibmeshPetscCall(MatSetValues(
421 _hc_cross_derivative_mat, 1, &row_ct, 1, &col_ct, &value_ct, ADD_VALUES));
422 }
423 else if (_Wij(i_gap, cross_index) < 0.0) // _Wij=0 operations not necessary
424 {
425 if (iz == first_node)
426 {
427 h_star = (*_h_soln)(node_in_j);
428 PetscScalar value_vec_ct = -1.0 * alpha *
429 _subchannel_mesh.getCrossflowSign(i_ch, counter) *
430 _Wij(i_gap, cross_index) * h_star;
431 PetscInt row_vec_ct = i_ch + _n_channels * iz_ind;
432 LibmeshPetscCall(VecSetValues(
433 _hc_cross_derivative_rhs, 1, &row_vec_ct, &value_vec_ct, ADD_VALUES));
434 }
435 else
436 {
437 PetscScalar value_ct = alpha * _subchannel_mesh.getCrossflowSign(i_ch, counter) *
438 _Wij(i_gap, cross_index);
439 PetscInt row_ct = i_ch + _n_channels * iz_ind;
440 PetscInt col_ct = jj_ch + _n_channels * (iz_ind - 1);
441 LibmeshPetscCall(MatSetValues(
442 _hc_cross_derivative_mat, 1, &row_ct, 1, &col_ct, &value_ct, ADD_VALUES));
443 }
444 PetscScalar value_ct = (1.0 - alpha) *
445 _subchannel_mesh.getCrossflowSign(i_ch, counter) *
446 _Wij(i_gap, cross_index);
447 PetscInt row_ct = i_ch + _n_channels * iz_ind;
448 PetscInt col_ct = jj_ch + _n_channels * iz_ind;
449 LibmeshPetscCall(MatSetValues(
450 _hc_cross_derivative_mat, 1, &row_ct, 1, &col_ct, &value_ct, ADD_VALUES));
451 }
452
453 // Turbulent cross flows
454 if (iz == first_node)
455 {
456 PetscScalar value_vec_ct =
457 -2.0 * alpha * (*_h_soln)(node_in)*_WijPrime(i_gap, cross_index);
458 value_vec_ct += alpha * (*_h_soln)(node_in_j)*_WijPrime(i_gap, cross_index);
459 value_vec_ct += alpha * (*_h_soln)(node_in_i)*_WijPrime(i_gap, cross_index);
460 PetscInt row_vec_ct = i_ch + _n_channels * iz_ind;
461 LibmeshPetscCall(
462 VecSetValues(_hc_cross_derivative_rhs, 1, &row_vec_ct, &value_vec_ct, ADD_VALUES));
463 }
464 else
465 {
466 PetscScalar value_center_ct = 2.0 * alpha * _WijPrime(i_gap, cross_index);
467 PetscInt row_ct = i_ch + _n_channels * iz_ind;
468 PetscInt col_ct = i_ch + _n_channels * (iz_ind - 1);
469 LibmeshPetscCall(MatSetValues(
470 _hc_cross_derivative_mat, 1, &row_ct, 1, &col_ct, &value_center_ct, ADD_VALUES));
471
472 PetscScalar value_left_ct = -1.0 * alpha * _WijPrime(i_gap, cross_index);
473 row_ct = i_ch + _n_channels * iz_ind;
474 col_ct = jj_ch + _n_channels * (iz_ind - 1);
475 LibmeshPetscCall(MatSetValues(
476 _hc_cross_derivative_mat, 1, &row_ct, 1, &col_ct, &value_left_ct, ADD_VALUES));
477
478 PetscScalar value_right_ct = -1.0 * alpha * _WijPrime(i_gap, cross_index);
479 row_ct = i_ch + _n_channels * iz_ind;
480 col_ct = ii_ch + _n_channels * (iz_ind - 1);
481 LibmeshPetscCall(MatSetValues(
482 _hc_cross_derivative_mat, 1, &row_ct, 1, &col_ct, &value_right_ct, ADD_VALUES));
483 }
484 PetscScalar value_center_ct = 2.0 * (1.0 - alpha) * _WijPrime(i_gap, cross_index);
485 PetscInt row_ct = i_ch + _n_channels * iz_ind;
486 PetscInt col_ct = i_ch + _n_channels * iz_ind;
487 LibmeshPetscCall(MatSetValues(
488 _hc_cross_derivative_mat, 1, &row_ct, 1, &col_ct, &value_center_ct, ADD_VALUES));
489
490 PetscScalar value_left_ct = -1.0 * (1.0 - alpha) * _WijPrime(i_gap, cross_index);
491 row_ct = i_ch + _n_channels * iz_ind;
492 col_ct = jj_ch + _n_channels * iz_ind;
493 LibmeshPetscCall(MatSetValues(
494 _hc_cross_derivative_mat, 1, &row_ct, 1, &col_ct, &value_left_ct, ADD_VALUES));
495
496 PetscScalar value_right_ct = -1.0 * (1.0 - alpha) * _WijPrime(i_gap, cross_index);
497 row_ct = i_ch + _n_channels * iz_ind;
498 col_ct = ii_ch + _n_channels * iz_ind;
499 LibmeshPetscCall(MatSetValues(
500 _hc_cross_derivative_mat, 1, &row_ct, 1, &col_ct, &value_right_ct, ADD_VALUES));
501 counter++;
502 }
503
505 PetscScalar added_enthalpy = computeAddedHeatPin(i_ch, iz);
506 PetscInt row_vec_ht = i_ch + _n_channels * iz_ind;
507 LibmeshPetscCall(
508 VecSetValues(_hc_added_heat_rhs, 1, &row_vec_ht, &added_enthalpy, ADD_VALUES));
509 }
510 }
512 LibmeshPetscCall(MatAssemblyBegin(_hc_time_derivative_mat, MAT_FINAL_ASSEMBLY));
513 LibmeshPetscCall(MatAssemblyEnd(_hc_time_derivative_mat, MAT_FINAL_ASSEMBLY));
514 LibmeshPetscCall(MatAssemblyBegin(_hc_advective_derivative_mat, MAT_FINAL_ASSEMBLY));
515 LibmeshPetscCall(MatAssemblyEnd(_hc_advective_derivative_mat, MAT_FINAL_ASSEMBLY));
516 LibmeshPetscCall(MatAssemblyBegin(_hc_cross_derivative_mat, MAT_FINAL_ASSEMBLY));
517 LibmeshPetscCall(MatAssemblyEnd(_hc_cross_derivative_mat, MAT_FINAL_ASSEMBLY));
518 LibmeshPetscCall(MatAssemblyBegin(_hc_sys_h_mat, MAT_FINAL_ASSEMBLY));
519 LibmeshPetscCall(MatAssemblyEnd(_hc_sys_h_mat, MAT_FINAL_ASSEMBLY));
520 // Matrix
521#if !PETSC_VERSION_LESS_THAN(3, 15, 0)
522 LibmeshPetscCall(MatAXPY(_hc_sys_h_mat, 1.0, _hc_time_derivative_mat, UNKNOWN_NONZERO_PATTERN));
523 LibmeshPetscCall(MatAssemblyBegin(_hc_sys_h_mat, MAT_FINAL_ASSEMBLY));
524 LibmeshPetscCall(MatAssemblyEnd(_hc_sys_h_mat, MAT_FINAL_ASSEMBLY));
525 LibmeshPetscCall(
526 MatAXPY(_hc_sys_h_mat, 1.0, _hc_advective_derivative_mat, UNKNOWN_NONZERO_PATTERN));
527 LibmeshPetscCall(MatAssemblyBegin(_hc_sys_h_mat, MAT_FINAL_ASSEMBLY));
528 LibmeshPetscCall(MatAssemblyEnd(_hc_sys_h_mat, MAT_FINAL_ASSEMBLY));
529 LibmeshPetscCall(
530 MatAXPY(_hc_sys_h_mat, 1.0, _hc_cross_derivative_mat, UNKNOWN_NONZERO_PATTERN));
531#else
532 LibmeshPetscCall(
533 MatAXPY(_hc_sys_h_mat, 1.0, _hc_time_derivative_mat, DIFFERENT_NONZERO_PATTERN));
534 LibmeshPetscCall(MatAssemblyBegin(_hc_sys_h_mat, MAT_FINAL_ASSEMBLY));
535 LibmeshPetscCall(MatAssemblyEnd(_hc_sys_h_mat, MAT_FINAL_ASSEMBLY));
536 LibmeshPetscCall(
537 MatAXPY(_hc_sys_h_mat, 1.0, _hc_advective_derivative_mat, DIFFERENT_NONZERO_PATTERN));
538 LibmeshPetscCall(MatAssemblyBegin(_hc_sys_h_mat, MAT_FINAL_ASSEMBLY));
539 LibmeshPetscCall(MatAssemblyEnd(_hc_sys_h_mat, MAT_FINAL_ASSEMBLY));
540 LibmeshPetscCall(
541 MatAXPY(_hc_sys_h_mat, 1.0, _hc_cross_derivative_mat, DIFFERENT_NONZERO_PATTERN));
542#endif
543 LibmeshPetscCall(MatAssemblyBegin(_hc_sys_h_mat, MAT_FINAL_ASSEMBLY));
544 LibmeshPetscCall(MatAssemblyEnd(_hc_sys_h_mat, MAT_FINAL_ASSEMBLY));
546 _console << "Block: " << iblock << " - Enthalpy conservation matrix assembled" << std::endl;
547 // RHS
548 LibmeshPetscCall(VecAXPY(_hc_sys_h_rhs, 1.0, _hc_time_derivative_rhs));
549 LibmeshPetscCall(VecAXPY(_hc_sys_h_rhs, 1.0, _hc_advective_derivative_rhs));
550 LibmeshPetscCall(VecAXPY(_hc_sys_h_rhs, 1.0, _hc_cross_derivative_rhs));
551 LibmeshPetscCall(VecAXPY(_hc_sys_h_rhs, 1.0, _hc_added_heat_rhs));
552
553 // Use system to solve for and populate enthalpy
554 LibmeshPetscCall(this->solveAndPopulateEnthalpy(
555 _hc_sys_h_mat, _hc_sys_h_rhs, first_node, last_node, "h_sys_"));
556 }
557}
const ConsoleStream _console
virtual Real computeAddedHeatPin(unsigned int i_ch, unsigned int iz) const override
Pure virtual: daughters provide different implementations.
const Real & getCrossflowSign(unsigned int i_chan, unsigned int i_local) const override
Return a sign for the crossflow given a subchannel index and local neighbor index.
Node * getChannelNode(unsigned int i_chan, unsigned int iz) const override
Get the subchannel mesh node for a given channel index and elevation index.
const std::pair< unsigned int, unsigned int > & getGapChannels(unsigned int i_gap) const override
Return a pair of subchannel indices for a given gap index.
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 SinglePhaseFluidProperties * _fp
Non-owning pointer to fluid properties user object.
const PostprocessorValue & _P_out
Outlet pressure postprocessor value.
std::unique_ptr< SolutionHandle > _P_soln
std::unique_ptr< SolutionHandle > _h_soln
std::unique_ptr< SolutionHandle > _T_soln
const bool _verbose_subchannel
Boolean to printout information related to subchannel solve.
Real volume(const MeshBase &mesh, unsigned int dim=libMesh::invalid_uint)

◆ computeInterpolatedValue()

PetscScalar SubChannel1PhaseProblem::computeInterpolatedValue ( PetscScalar  topValue,
PetscScalar  botValue,
PetscScalar  Peclet = 0.0 
)
protectedinherited

Definition at line 583 of file SubChannel1PhaseProblem.C.

586{
587 PetscScalar alpha = computeInterpolationCoefficients(Peclet);
588 return alpha * botValue + (1.0 - alpha) * topValue;
589}

Referenced by SubChannel1PhaseProblem::computeDP(), computeh(), TriSubChannel1PhaseProblem::computeh(), SubChannel1PhaseProblem::computeP(), and SubChannel1PhaseProblem::computeWijResidual().

◆ computeInterpolationCoefficients()

PetscScalar SubChannel1PhaseProblem::computeInterpolationCoefficients ( PetscScalar  Peclet = 0.0)
protectedinherited

Functions that computes the interpolation scheme given the Peclet number.

Definition at line 563 of file SubChannel1PhaseProblem.C.

564{
565 switch (_interpolation_scheme)
566 {
567 case 0: // upwind interpolation
568 return 1.0;
569 case 1: // downwind interpolation
570 return 0.0;
571 case 2: // central_difference interpolation
572 return 0.5;
573 case 3: // exponential interpolation (Peclet limited)
574 return ((Peclet - 1.0) * std::exp(Peclet) + 1) / (Peclet * (std::exp(Peclet) - 1.) + 1e-10);
575 default:
577 ": Interpolation scheme should be a string: upwind, downwind, central_difference, "
578 "exponential");
579 }
580}
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.
Definition Numerics.h:151

Referenced by SubChannel1PhaseProblem::computeDP(), computeh(), TriSubChannel1PhaseProblem::computeh(), SubChannel1PhaseProblem::computeInterpolatedValue(), SubChannel1PhaseProblem::computeP(), and SubChannel1PhaseProblem::computeWijResidual().

◆ computeMdot()

void SubChannel1PhaseProblem::computeMdot ( int  iblock)
protectedinherited

Computes mass flow per channel for block iblock.

Definition at line 691 of file SubChannel1PhaseProblem.C.

692{
693 const unsigned int last_node = (iblock + 1) * _block_size;
694 const unsigned int first_node = iblock * _block_size + 1;
695 if (!_implicit_bool)
696 {
697 for (unsigned int iz = first_node; iz < last_node + 1; iz++)
698 {
699 auto dz = _z_grid[iz] - _z_grid[iz - 1];
700 for (unsigned int i_ch = 0; i_ch < _n_channels; i_ch++)
701 {
702 auto * node_in = _subchannel_mesh.getChannelNode(i_ch, iz - 1);
703 auto * node_out = _subchannel_mesh.getChannelNode(i_ch, iz);
704 auto volume = dz * (*_S_flow_soln)(node_in);
705 auto time_term = _TR * ((*_rho_soln)(node_out)-_rho_soln->old(node_out)) * volume / _dt;
706 // Wij positive out of i into j;
707 auto mdot_out = (*_mdot_soln)(node_in) - (*_SumWij_soln)(node_out)-time_term;
708 if (mdot_out < 0)
709 {
710 _console << "Wij = : " << _Wij << "\n";
712 " : Calculation of negative mass flow mdot_out = : ",
713 mdot_out,
714 " Axial Level= : ",
715 iz,
716 " - Implicit solves are required for recirculating flow.");
717 }
718 _mdot_soln->set(node_out, mdot_out); // kg/sec
719 }
720 }
721 }
722 else
723 {
724 for (unsigned int iz = first_node; iz < last_node + 1; iz++)
725 {
726 auto dz = _z_grid[iz] - _z_grid[iz - 1];
727 auto iz_ind = iz - first_node;
728 for (unsigned int i_ch = 0; i_ch < _n_channels; i_ch++)
729 {
730 auto * node_in = _subchannel_mesh.getChannelNode(i_ch, iz - 1);
731 auto * node_out = _subchannel_mesh.getChannelNode(i_ch, iz);
732 auto volume = dz * (*_S_flow_soln)(node_in);
733
734 // Adding time derivative to the RHS
735 auto time_term = _TR * ((*_rho_soln)(node_out)-_rho_soln->old(node_out)) * volume / _dt;
736 PetscInt row_vec = i_ch + _n_channels * iz_ind;
737 PetscScalar value_vec = -1.0 * time_term;
738 LibmeshPetscCall(
739 VecSetValues(_mc_axial_convection_rhs, 1, &row_vec, &value_vec, INSERT_VALUES));
740
741 // Linearize transient density with respect to pressure at constant enthalpy. The
742 // temperature response at constant h is required even for a rho(T)-only liquid model:
743 //
744 // (d rho / d p)_h = (d rho / d p)_T
745 // - (d rho / d T)_p (d h / d p)_T / (d h / d T)_p.
746 //
747 // Without this Jacobian contribution, pressure-density coupling remains in the outer
748 // fixed-point iteration and scales as O(1 / dt). As the time step decreases, the iteration
749 // can become increasingly slow or noncontractive and may require stronger relaxation.
750 if (_TR && _compute_density && _compute_power && iz < last_node)
751 {
752 Real rho, drho_dp_T, drho_dT;
753 _fp->rho_from_p_T(
754 (*_P_soln)(node_out) + _P_out, (*_T_soln)(node_out), rho, drho_dp_T, drho_dT);
755 Real h, dh_dp_T, dh_dT;
756 _fp->h_from_p_T((*_P_soln)(node_out) + _P_out, (*_T_soln)(node_out), h, dh_dp_T, dh_dT);
757 const Real drho_dp_h = drho_dp_T - drho_dT * dh_dp_T / dh_dT;
758 const PetscScalar pressure_coefficient = volume / _dt * drho_dp_h;
759 const PetscInt pressure_col = i_ch + _n_channels * (iz_ind + 1);
760 LibmeshPetscCall(MatSetValues(_mc_density_pressure_mat,
761 1,
762 &row_vec,
763 1,
764 &pressure_col,
765 &pressure_coefficient,
766 INSERT_VALUES));
767 const PetscScalar linearization_rhs = pressure_coefficient * (*_P_soln)(node_out);
768 LibmeshPetscCall(
769 VecSetValues(_mc_axial_convection_rhs, 1, &row_vec, &linearization_rhs, ADD_VALUES));
770 }
771
772 // Imposing bottom boundary condition or adding of diagonal elements
773 if (iz == first_node)
774 {
775 PetscScalar value_vec = (*_mdot_soln)(node_in);
776 PetscInt row_vec = i_ch + _n_channels * iz_ind;
777 LibmeshPetscCall(
778 VecSetValues(_mc_axial_convection_rhs, 1, &row_vec, &value_vec, ADD_VALUES));
779 }
780 else
781 {
782 PetscInt row = i_ch + _n_channels * iz_ind;
783 PetscInt col = i_ch + _n_channels * (iz_ind - 1);
784 PetscScalar value = -1.0;
785 LibmeshPetscCall(
786 MatSetValues(_mc_axial_convection_mat, 1, &row, 1, &col, &value, INSERT_VALUES));
787 }
788
789 // Adding diagonal elements
790 PetscInt row = i_ch + _n_channels * iz_ind;
791 PetscInt col = i_ch + _n_channels * iz_ind;
792 PetscScalar value = 1.0;
793 LibmeshPetscCall(
794 MatSetValues(_mc_axial_convection_mat, 1, &row, 1, &col, &value, INSERT_VALUES));
795
796 // Adding cross flows RHS
798 {
799 PetscScalar value_vec_2 = -1.0 * (*_SumWij_soln)(node_out);
800 PetscInt row_vec_2 = i_ch + _n_channels * iz_ind;
801 LibmeshPetscCall(
802 VecSetValues(_mc_axial_convection_rhs, 1, &row_vec_2, &value_vec_2, ADD_VALUES));
803 }
804 }
805 }
806 LibmeshPetscCall(MatAssemblyBegin(_mc_axial_convection_mat, MAT_FINAL_ASSEMBLY));
807 LibmeshPetscCall(MatAssemblyEnd(_mc_axial_convection_mat, MAT_FINAL_ASSEMBLY));
808 LibmeshPetscCall(MatAssemblyBegin(_mc_density_pressure_mat, MAT_FINAL_ASSEMBLY));
809 LibmeshPetscCall(MatAssemblyEnd(_mc_density_pressure_mat, MAT_FINAL_ASSEMBLY));
810
812 {
813 KSP ksploc;
814 PC pc;
815 Vec sol;
816 LibmeshPetscCall(VecDuplicate(_mc_axial_convection_rhs, &sol));
817 LibmeshPetscCall(KSPCreate(PETSC_COMM_SELF, &ksploc));
818 LibmeshPetscCall(KSPSetOperators(ksploc, _mc_axial_convection_mat, _mc_axial_convection_mat));
819 LibmeshPetscCall(KSPGetPC(ksploc, &pc));
820 LibmeshPetscCall(PCSetType(pc, PCJACOBI));
821 LibmeshPetscCall(KSPSetTolerances(ksploc, _rtol, _atol, _dtol, _maxit));
822 LibmeshPetscCall(KSPSetFromOptions(ksploc));
823 LibmeshPetscCall(KSPSolve(ksploc, _mc_axial_convection_rhs, sol));
824 LibmeshPetscCall(populateSolutionChan<SolutionHandle>(
825 sol, *_mdot_soln, first_node, last_node, _n_channels));
826 LibmeshPetscCall(VecZeroEntries(_mc_axial_convection_rhs));
827 LibmeshPetscCall(KSPDestroy(&ksploc));
828 LibmeshPetscCall(VecDestroy(&sol));
829 }
830 }
831}
const double rho
const PetscReal & _dtol
The divergence tolerance for the ksp linear solver.
const bool _compute_power
Flag that informs if we need to solve the Enthalpy/Temperature equations or not.
const PetscInt & _maxit
The maximum number of iterations to use for the ksp linear solver.
const bool _compute_density
Flag that activates or deactivates the calculation of density.
const PetscReal & _rtol
The relative convergence tolerance, (relative decrease) for the ksp linear solver.
const PetscReal & _atol
The absolute convergence tolerance for the ksp linear solver.

Referenced by SubChannel1PhaseProblem::implicitPetscSolve(), and SubChannel1PhaseProblem::residualFunction().

◆ computeMixingParameter()

Real SubChannel1PhaseProblem::computeMixingParameter ( unsigned int  i_gap,
unsigned int  iz 
) const
protectedinherited

Computes and validates the turbulent mixing parameter.

Definition at line 2054 of file SubChannel1PhaseProblem.C.

2055{
2056 auto beta = _mixing_closure->computeMixingParameter(i_gap, iz);
2057 if (!std::isfinite(beta) || beta < 0.0)
2058 mooseError(name(),
2059 ": Mixing closure returned invalid beta = ",
2060 beta,
2061 " for gap ",
2062 i_gap,
2063 " at axial index ",
2064 iz,
2065 ". Beta must be finite and non-negative.");
2066
2067 return beta;
2068}
virtual Real computeMixingParameter(const unsigned int i_gap, const unsigned int iz) const =0
Computes the turbulent mixing coefficient for the local conditions around gap(i_gap) and axial level(...

Referenced by SubChannel1PhaseProblem::computeWijPrime().

◆ computeMu()

void SubChannel1PhaseProblem::computeMu ( int  iblock)
protectedinherited

Computes Viscosity per channel for block iblock.

Definition at line 1611 of file SubChannel1PhaseProblem.C.

1612{
1613 const unsigned int last_node = (iblock + 1) * _block_size;
1614 const unsigned int first_node = iblock * _block_size + 1;
1615 if (iblock == 0)
1616 {
1617 for (unsigned int i_ch = 0; i_ch < _n_channels; i_ch++)
1618 {
1619 auto * node = _subchannel_mesh.getChannelNode(i_ch, 0);
1620 _mu_soln->set(node, _fp->mu_from_p_T((*_P_soln)(node) + _P_out, (*_T_soln)(node)));
1621 }
1622 }
1623 for (unsigned int iz = first_node; iz < last_node + 1; iz++)
1624 {
1625 for (unsigned int i_ch = 0; i_ch < _n_channels; i_ch++)
1626 {
1627 auto * node = _subchannel_mesh.getChannelNode(i_ch, iz);
1628 _mu_soln->set(node, _fp->mu_from_p_T((*_P_soln)(node) + _P_out, (*_T_soln)(node)));
1629 }
1630 }
1631}
std::unique_ptr< SolutionHandle > _mu_soln

Referenced by SubChannel1PhaseProblem::externalSolve().

◆ computeP()

void SubChannel1PhaseProblem::computeP ( int  iblock)
protectedinherited

Computes Pressure per channel for block iblock.

Definition at line 1320 of file SubChannel1PhaseProblem.C.

1321{
1322 const unsigned int last_node = (iblock + 1) * _block_size;
1323 const unsigned int first_node = iblock * _block_size + 1;
1324 if (!_implicit_bool)
1325 {
1327 {
1328 for (unsigned int iz = last_node; iz > first_node - 1; iz--)
1329 {
1330 // Calculate pressure in the inlet of the cell assuming known outlet
1331 for (unsigned int i_ch = 0; i_ch < _n_channels; i_ch++)
1332 {
1333 auto * node_out = _subchannel_mesh.getChannelNode(i_ch, iz);
1334 auto * node_in = _subchannel_mesh.getChannelNode(i_ch, iz - 1);
1335 // update Pressure solution
1336 _P_soln->set(node_in, (*_P_soln)(node_out) + _DP(i_ch, iz));
1337 }
1338 }
1339 }
1340 else
1341 {
1342 for (unsigned int iz = last_node; iz > first_node - 1; iz--)
1343 {
1344 // Calculate pressure in the inlet of the cell assuming known outlet
1345 for (unsigned int i_ch = 0; i_ch < _n_channels; i_ch++)
1346 {
1347 auto * node_out = _subchannel_mesh.getChannelNode(i_ch, iz);
1348 auto * node_in = _subchannel_mesh.getChannelNode(i_ch, iz - 1);
1349 // update Pressure solution
1350 // Note: assuming uniform axial discretization in the curren code
1351 // We will need to update this later if we allow non-uniform refinements in the axial
1352 // direction
1353 PetscScalar Pe = 0.5;
1354 auto alpha = computeInterpolationCoefficients(Pe);
1355 if (iz == last_node)
1356 {
1357 _P_soln->set(node_in, (*_P_soln)(node_out) + _DP(i_ch, iz) / 2.0);
1358 }
1359 else
1360 {
1361 _P_soln->set(node_in,
1362 (*_P_soln)(node_out) + (1.0 - alpha) * _DP(i_ch, iz) +
1363 alpha * _DP(i_ch, iz - 1));
1364 }
1365 }
1366 }
1367 }
1368 }
1369 else
1370 {
1372 {
1373 LibmeshPetscCall(VecZeroEntries(_amc_pressure_force_rhs));
1374 for (unsigned int iz = last_node; iz > first_node - 1; iz--)
1375 {
1376 auto iz_ind = iz - first_node;
1377 // Calculate pressure in the inlet of the cell assuming known outlet
1378 for (unsigned int i_ch = 0; i_ch < _n_channels; i_ch++)
1379 {
1380 auto * node_out = _subchannel_mesh.getChannelNode(i_ch, iz);
1381 auto * node_in = _subchannel_mesh.getChannelNode(i_ch, iz - 1);
1382
1383 // inlet, outlet, and interpolated axial surface area
1384 auto S_in = (*_S_flow_soln)(node_in);
1385 auto S_out = (*_S_flow_soln)(node_out);
1386 auto S_interp = computeInterpolatedValue(S_out, S_in, 0.5);
1387
1388 // Creating matrix of coefficients
1389 PetscInt row = i_ch + _n_channels * iz_ind;
1390 PetscInt col = i_ch + _n_channels * iz_ind;
1391 PetscScalar value = -1.0 * S_interp;
1392 LibmeshPetscCall(
1393 MatSetValues(_amc_pressure_force_mat, 1, &row, 1, &col, &value, INSERT_VALUES));
1394
1395 if (iz == last_node)
1396 {
1397 PetscScalar value = -1.0 * (*_P_soln)(node_out)*S_interp;
1398 PetscInt row = i_ch + _n_channels * iz_ind;
1399 LibmeshPetscCall(VecSetValues(_amc_pressure_force_rhs, 1, &row, &value, ADD_VALUES));
1400 }
1401 else
1402 {
1403 PetscInt row = i_ch + _n_channels * iz_ind;
1404 PetscInt col = i_ch + _n_channels * (iz_ind + 1);
1405 PetscScalar value = 1.0 * S_interp;
1406 LibmeshPetscCall(
1407 MatSetValues(_amc_pressure_force_mat, 1, &row, 1, &col, &value, INSERT_VALUES));
1408 }
1409
1410 if (_segregated_bool)
1411 {
1412 auto dp_out = _DP(i_ch, iz);
1413 PetscScalar value_v = -1.0 * dp_out * S_interp;
1414 PetscInt row_v = i_ch + _n_channels * iz_ind;
1415 LibmeshPetscCall(
1416 VecSetValues(_amc_pressure_force_rhs, 1, &row_v, &value_v, ADD_VALUES));
1417 }
1418 }
1419 }
1420 // Solving pressure problem
1421 LibmeshPetscCall(MatAssemblyBegin(_amc_pressure_force_mat, MAT_FINAL_ASSEMBLY));
1422 LibmeshPetscCall(MatAssemblyEnd(_amc_pressure_force_mat, MAT_FINAL_ASSEMBLY));
1423 if (_segregated_bool)
1424 {
1425 KSP ksploc;
1426 PC pc;
1427 Vec sol;
1428 LibmeshPetscCall(VecDuplicate(_amc_pressure_force_rhs, &sol));
1429 LibmeshPetscCall(KSPCreate(PETSC_COMM_SELF, &ksploc));
1430 LibmeshPetscCall(KSPSetOperators(ksploc, _amc_pressure_force_mat, _amc_pressure_force_mat));
1431 LibmeshPetscCall(KSPGetPC(ksploc, &pc));
1432 LibmeshPetscCall(PCSetType(pc, PCJACOBI));
1433 LibmeshPetscCall(KSPSetTolerances(ksploc, _rtol, _atol, _dtol, _maxit));
1434 LibmeshPetscCall(KSPSetFromOptions(ksploc));
1435 LibmeshPetscCall(KSPSolve(ksploc, _amc_pressure_force_rhs, sol));
1436 PetscScalar * xx;
1437 LibmeshPetscCall(VecGetArray(sol, &xx));
1438 // update Pressure solution
1439 for (unsigned int iz = last_node; iz > first_node - 1; iz--)
1440 {
1441 auto iz_ind = iz - first_node;
1442 for (unsigned int i_ch = 0; i_ch < _n_channels; i_ch++)
1443 {
1444 auto * node_in = _subchannel_mesh.getChannelNode(i_ch, iz - 1);
1445 PetscScalar value = xx[iz_ind * _n_channels + i_ch];
1446 _P_soln->set(node_in, value);
1447 }
1448 }
1449 LibmeshPetscCall(VecZeroEntries(_amc_pressure_force_rhs));
1450 LibmeshPetscCall(KSPDestroy(&ksploc));
1451 LibmeshPetscCall(VecDestroy(&sol));
1452 }
1453 }
1454 else
1455 {
1456 LibmeshPetscCall(VecZeroEntries(_amc_pressure_force_rhs));
1457 for (unsigned int iz = last_node; iz > first_node - 1; iz--)
1458 {
1459 auto iz_ind = iz - first_node;
1460 // Calculate pressure in the inlet of the cell assuming known outlet
1461 for (unsigned int i_ch = 0; i_ch < _n_channels; i_ch++)
1462 {
1463 auto * node_out = _subchannel_mesh.getChannelNode(i_ch, iz);
1464 auto * node_in = _subchannel_mesh.getChannelNode(i_ch, iz - 1);
1465
1466 // inlet, outlet, and interpolated axial surface area
1467 auto S_in = (*_S_flow_soln)(node_in);
1468 auto S_out = (*_S_flow_soln)(node_out);
1469 auto S_interp = computeInterpolatedValue(S_out, S_in, 0.5);
1470
1471 // Creating matrix of coefficients
1472 PetscInt row = i_ch + _n_channels * iz_ind;
1473 PetscInt col = i_ch + _n_channels * iz_ind;
1474 PetscScalar value = -1.0 * S_interp;
1475 LibmeshPetscCall(
1476 MatSetValues(_amc_pressure_force_mat, 1, &row, 1, &col, &value, INSERT_VALUES));
1477
1478 if (iz == last_node)
1479 {
1480 PetscScalar value = -1.0 * (*_P_soln)(node_out)*S_interp;
1481 PetscInt row = i_ch + _n_channels * iz_ind;
1482 LibmeshPetscCall(VecSetValues(_amc_pressure_force_rhs, 1, &row, &value, ADD_VALUES));
1483
1484 auto dp_out = _DP(i_ch, iz);
1485 PetscScalar value_v = -1.0 * dp_out / 2.0 * S_interp;
1486 PetscInt row_v = i_ch + _n_channels * iz_ind;
1487 LibmeshPetscCall(
1488 VecSetValues(_amc_pressure_force_rhs, 1, &row_v, &value_v, ADD_VALUES));
1489 }
1490 else
1491 {
1492 PetscInt row = i_ch + _n_channels * iz_ind;
1493 PetscInt col = i_ch + _n_channels * (iz_ind + 1);
1494 PetscScalar value = 1.0 * S_interp;
1495 LibmeshPetscCall(
1496 MatSetValues(_amc_pressure_force_mat, 1, &row, 1, &col, &value, INSERT_VALUES));
1497
1498 if (_segregated_bool)
1499 {
1500 auto dp_in = _DP(i_ch, iz - 1);
1501 auto dp_out = _DP(i_ch, iz);
1502 auto dp_interp = computeInterpolatedValue(dp_out, dp_in, 0.5);
1503 PetscScalar value_v = -1.0 * dp_interp * S_interp;
1504 PetscInt row_v = i_ch + _n_channels * iz_ind;
1505 LibmeshPetscCall(
1506 VecSetValues(_amc_pressure_force_rhs, 1, &row_v, &value_v, ADD_VALUES));
1507 }
1508 }
1509 }
1510 }
1511 // Solving pressure problem
1512 LibmeshPetscCall(MatAssemblyBegin(_amc_pressure_force_mat, MAT_FINAL_ASSEMBLY));
1513 LibmeshPetscCall(MatAssemblyEnd(_amc_pressure_force_mat, MAT_FINAL_ASSEMBLY));
1515 _console << "Block: " << iblock << " - Axial momentum pressure force matrix assembled"
1516 << std::endl;
1517
1518 if (_segregated_bool)
1519 {
1520 KSP ksploc;
1521 PC pc;
1522 Vec sol;
1523 LibmeshPetscCall(VecDuplicate(_amc_pressure_force_rhs, &sol));
1524 LibmeshPetscCall(KSPCreate(PETSC_COMM_SELF, &ksploc));
1525 LibmeshPetscCall(KSPSetOperators(ksploc, _amc_pressure_force_mat, _amc_pressure_force_mat));
1526 LibmeshPetscCall(KSPGetPC(ksploc, &pc));
1527 LibmeshPetscCall(PCSetType(pc, PCJACOBI));
1528 LibmeshPetscCall(KSPSetTolerances(ksploc, _rtol, _atol, _dtol, _maxit));
1529 LibmeshPetscCall(KSPSetFromOptions(ksploc));
1530 LibmeshPetscCall(KSPSolve(ksploc, _amc_pressure_force_rhs, sol));
1531 PetscScalar * xx;
1532 LibmeshPetscCall(VecGetArray(sol, &xx));
1533 // update Pressure solution
1534 for (unsigned int iz = last_node; iz > first_node - 1; iz--)
1535 {
1536 auto iz_ind = iz - first_node;
1537 for (unsigned int i_ch = 0; i_ch < _n_channels; i_ch++)
1538 {
1539 auto * node_in = _subchannel_mesh.getChannelNode(i_ch, iz - 1);
1540 PetscScalar value = xx[iz_ind * _n_channels + i_ch];
1541 _P_soln->set(node_in, value);
1542 }
1543 }
1544 LibmeshPetscCall(VecZeroEntries(_amc_pressure_force_rhs));
1545 LibmeshPetscCall(KSPDestroy(&ksploc));
1546 LibmeshPetscCall(VecDestroy(&sol));
1547 }
1548 }
1549 }
1550}
const bool _staggered_pressure_bool
Flag to define the usage of staggered or collocated pressure.

Referenced by SubChannel1PhaseProblem::implicitPetscSolve(), and SubChannel1PhaseProblem::residualFunction().

◆ computeRho()

void SubChannel1PhaseProblem::computeRho ( int  iblock)
protectedinherited

Computes Density per channel for block iblock.

Definition at line 1588 of file SubChannel1PhaseProblem.C.

1589{
1590 const unsigned int last_node = (iblock + 1) * _block_size;
1591 const unsigned int first_node = iblock * _block_size + 1;
1592 if (iblock == 0)
1593 {
1594 for (unsigned int i_ch = 0; i_ch < _n_channels; i_ch++)
1595 {
1596 auto * node = _subchannel_mesh.getChannelNode(i_ch, 0);
1597 _rho_soln->set(node, _fp->rho_from_p_T((*_P_soln)(node) + _P_out, (*_T_soln)(node)));
1598 }
1599 }
1600 for (unsigned int iz = first_node; iz < last_node + 1; iz++)
1601 {
1602 for (unsigned int i_ch = 0; i_ch < _n_channels; i_ch++)
1603 {
1604 auto * node = _subchannel_mesh.getChannelNode(i_ch, iz);
1605 _rho_soln->set(node, _fp->rho_from_p_T((*_P_soln)(node) + _P_out, (*_T_soln)(node)));
1606 }
1607 }
1608}

Referenced by SubChannel1PhaseProblem::externalSolve().

◆ computeSumWij()

void SubChannel1PhaseProblem::computeSumWij ( int  iblock)
protectedinherited

Computes net diversion crossflow per channel for block iblock.

Definition at line 625 of file SubChannel1PhaseProblem.C.

626{
627 const unsigned int last_node = (iblock + 1) * _block_size;
628 const unsigned int first_node = iblock * _block_size + 1;
629 // Add to solution vector if explicit
630 if (!_implicit_bool)
631 {
632 for (unsigned int iz = first_node; iz < last_node + 1; iz++)
633 {
634 for (unsigned int i_ch = 0; i_ch < _n_channels; i_ch++)
635 {
636 auto * node_out = _subchannel_mesh.getChannelNode(i_ch, iz);
637 Real sumWij = 0.0;
638 // Calculate sum of crossflow into channel i from channels j around i
639 unsigned int counter = 0;
640 for (auto i_gap : _subchannel_mesh.getChannelGaps(i_ch))
641 {
642 sumWij += _subchannel_mesh.getCrossflowSign(i_ch, counter) * _Wij(i_gap, iz);
643 counter++;
644 }
645 // The net crossflow coming out of cell i [kg/sec]
646 _SumWij_soln->set(node_out, sumWij);
647 }
648 }
649 }
650 // Add to matrix if implicit
651 else
652 {
653 LibmeshPetscCall(MatZeroEntries(_mc_density_pressure_mat));
654 for (unsigned int iz = first_node; iz < last_node + 1; iz++)
655 {
656 unsigned int iz_ind = iz - first_node;
657 for (unsigned int i_ch = 0; i_ch < _n_channels; i_ch++)
658 {
659 // Calculate sum of crossflow into channel i from channels j around i
660 unsigned int counter = 0;
661 for (auto i_gap : _subchannel_mesh.getChannelGaps(i_ch))
662 {
663 PetscInt row = i_ch + _n_channels * iz_ind;
664 PetscInt col = i_gap + _n_gaps * iz_ind;
665 PetscScalar value = _subchannel_mesh.getCrossflowSign(i_ch, counter);
666 LibmeshPetscCall(MatSetValues(_mc_sumWij_mat, 1, &row, 1, &col, &value, INSERT_VALUES));
667 counter++;
668 }
669 }
670 }
671 LibmeshPetscCall(MatAssemblyBegin(_mc_sumWij_mat, MAT_FINAL_ASSEMBLY));
672 LibmeshPetscCall(MatAssemblyEnd(_mc_sumWij_mat, MAT_FINAL_ASSEMBLY));
674 {
675 Vec loc_prod;
676 Vec loc_Wij;
677 LibmeshPetscCall(VecDuplicate(_amc_sys_mdot_rhs, &loc_prod));
678 LibmeshPetscCall(VecDuplicate(_Wij_vec, &loc_Wij));
680 loc_Wij, _Wij, first_node, last_node, _n_gaps));
681 LibmeshPetscCall(MatMult(_mc_sumWij_mat, loc_Wij, loc_prod));
682 LibmeshPetscCall(populateSolutionChan<SolutionHandle>(
683 loc_prod, *_SumWij_soln, first_node, last_node, _n_channels));
684 LibmeshPetscCall(VecDestroy(&loc_prod));
685 LibmeshPetscCall(VecDestroy(&loc_Wij));
686 }
687 }
688}
PetscErrorCode populateVectorFromDense(Vec &x, const T &solution, const unsigned int first_axial_level, const unsigned int last_axial_level, const unsigned int cross_dimension)

Referenced by SubChannel1PhaseProblem::implicitPetscSolve(), and SubChannel1PhaseProblem::residualFunction().

◆ computeSweepFlowMixingParameter()

Real SubChannel1PhaseProblem::computeSweepFlowMixingParameter ( unsigned int  i_gap,
unsigned int  iz 
) const
protectedinherited

Computes and validates the sweep-flow mixing parameter.

Definition at line 2071 of file SubChannel1PhaseProblem.C.

2072{
2073 auto beta = _mixing_closure->computeSweepFlowMixingParameter(i_gap, iz);
2074 if (!std::isfinite(beta) || beta < 0.0)
2075 mooseError(name(),
2076 ": Mixing closure returned invalid sweep-flow coefficient = ",
2077 beta,
2078 " for gap ",
2079 i_gap,
2080 " at axial index ",
2081 iz,
2082 ". sweep-flow coefficient must be finite and non-negative.");
2083
2084 return beta;
2085}
virtual Real computeSweepFlowMixingParameter(const unsigned int i_gap, const unsigned int iz) const
Computes the wire-wrap sweep-flow coefficient for peripheral gaps.

Referenced by TriSubChannel1PhaseProblem::computeh().

◆ computeT()

Real SubChannel1PhaseProblem::computeT ( int  iblock)
protectedinherited

Computes and relaxes Temperature per channel for block iblock.

Returns
The normalized norm of (T - T_prev).

Definition at line 1553 of file SubChannel1PhaseProblem.C.

1554{
1555 const unsigned int last_node = (iblock + 1) * _block_size;
1556 const unsigned int first_node = iblock * _block_size + 1;
1557 std::vector<Real> residual;
1558 residual.reserve(_block_size * _n_channels);
1559 Real residual_norm_sq = 0.0;
1560 Real temperature_norm_sq = 0.0;
1561 for (unsigned int iz = first_node; iz < last_node + 1; iz++)
1562 {
1563 for (unsigned int i_ch = 0; i_ch < _n_channels; i_ch++)
1564 {
1565 auto * node = _subchannel_mesh.getChannelNode(i_ch, iz);
1566 const Real T = (*_T_soln)(node);
1567 const Real T_from_ph = _fp->T_from_p_h((*_P_soln)(node) + _P_out, (*_h_soln)(node));
1568 residual.push_back(T_from_ph - T);
1569 residual_norm_sq += Utility::pow<2>(residual.back());
1570 temperature_norm_sq += Utility::pow<2>(T);
1571 }
1572 }
1573
1574 // Set the temperature solution with relaxation if needed
1575 std::size_t i = 0;
1576 for (unsigned int iz = first_node; iz < last_node + 1; iz++)
1577 for (unsigned int i_ch = 0; i_ch < _n_channels; i_ch++)
1578 {
1579 auto * node = _subchannel_mesh.getChannelNode(i_ch, iz);
1580 _T_soln->set(node, (*_T_soln)(node) + _T_relaxation * residual[i]);
1581 ++i;
1582 }
1583
1584 return std::sqrt(residual_norm_sq) / (std::sqrt(temperature_norm_sq) + 1e-14);
1585}
const double T
const Real & _T_relaxation
Relaxation factor for temperature updates in the inner thermal-hydraulic iteration.

Referenced by SubChannel1PhaseProblem::externalSolve().

◆ computeWijFromSolve()

void SubChannel1PhaseProblem::computeWijFromSolve ( int  iblock)
protectedinherited

Computes diversion crossflow per gap for block iblock.

Definition at line 592 of file SubChannel1PhaseProblem.C.

593{
594 const unsigned int last_node = (iblock + 1) * _block_size;
595 const unsigned int first_node = iblock * _block_size + 1;
596 // Initial guess, port crossflow of block (iblock) into a vector that will act as my initial guess
597 libMesh::DenseVector<Real> solution_seed(_n_gaps * _block_size, 0.0);
598 for (unsigned int iz = first_node; iz < last_node + 1; iz++)
599 {
600 for (unsigned int i_gap = 0; i_gap < _n_gaps; i_gap++)
601 {
602 int i = _n_gaps * (iz - first_node) + i_gap; // column wise transfer
603 solution_seed(i) = _Wij(i_gap, iz);
604 }
605 }
606
607 // Solving the combined lateral momentum equation for Wij using a PETSc solver and update vector
608 // root
610 LibmeshPetscCall(petscSnesSolver(iblock, solution_seed, root));
611
612 // Assign the solution to the cross-flow matrix
613 int i = 0;
614 for (unsigned int iz = first_node; iz < last_node + 1; iz++)
615 {
616 for (unsigned int i_gap = 0; i_gap < _n_gaps; i_gap++)
617 {
618 _Wij(i_gap, iz) = root(i);
619 i++;
620 }
621 }
622}
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.
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.

Referenced by SubChannel1PhaseProblem::externalSolve().

◆ computeWijPrime()

void SubChannel1PhaseProblem::computeWijPrime ( int  iblock)
protectedinherited

Computes turbulent crossflow per gap for block iblock.

Update turbulent crossflow

Definition at line 1953 of file SubChannel1PhaseProblem.C.

1954{
1955 const unsigned int last_node = (iblock + 1) * _block_size;
1956 const unsigned int first_node = iblock * _block_size + 1;
1957 _mixing_closure->computeBlockMixingParameters(first_node, last_node);
1958 for (unsigned int iz = first_node; iz < last_node + 1; iz++)
1959 {
1960 auto dz = _z_grid[iz] - _z_grid[iz - 1];
1961 for (unsigned int i_gap = 0; i_gap < _n_gaps; i_gap++)
1962 {
1963 auto chans = _subchannel_mesh.getGapChannels(i_gap);
1964 unsigned int i_ch = chans.first;
1965 unsigned int j_ch = chans.second;
1966 auto * node_in_i = _subchannel_mesh.getChannelNode(i_ch, iz - 1);
1967 auto * node_out_i = _subchannel_mesh.getChannelNode(i_ch, iz);
1968 auto * node_in_j = _subchannel_mesh.getChannelNode(j_ch, iz - 1);
1969 auto * node_out_j = _subchannel_mesh.getChannelNode(j_ch, iz);
1970 auto Si_in = (*_S_flow_soln)(node_in_i);
1971 auto Sj_in = (*_S_flow_soln)(node_in_j);
1972 auto Si_out = (*_S_flow_soln)(node_out_i);
1973 auto Sj_out = (*_S_flow_soln)(node_out_j);
1974 auto gap = _subchannel_mesh.getGapWidth(iz, i_gap);
1975 auto Sij = dz * gap;
1976 // Mass flux of the gap: total mass flow rate of the two subchannels over their total flow
1977 // area, averaged over the inlet and outlet of the cell. This is the area-weighted mean of rho
1978 // V of the two subchannels; Eq. (30) of Pacio et al. (2022) uses the arithmetic mean rho (V_i
1979 // + V_j) / 2, which differs when the two subchannels have different flow areas
1980 auto avg_massflux =
1981 0.5 * (((*_mdot_soln)(node_in_i) + (*_mdot_soln)(node_in_j)) / (Si_in + Sj_in) +
1982 ((*_mdot_soln)(node_out_i) + (*_mdot_soln)(node_out_j)) / (Si_out + Sj_out));
1983 auto beta = computeMixingParameter(i_gap, iz);
1984
1985 if (!_implicit_bool)
1986 {
1987 _WijPrime(i_gap, iz) = beta * avg_massflux * Sij;
1988 }
1989 else
1990 {
1991 auto iz_ind = iz - first_node;
1992 PetscScalar base_value = beta * 0.5 * Sij;
1993
1994 // Bottom values
1995 if (iz == first_node)
1996 {
1997 PetscScalar value_tl = -1.0 * base_value / (Si_in + Sj_in) *
1998 ((*_mdot_soln)(node_in_i) + (*_mdot_soln)(node_in_j));
1999 PetscInt row = i_gap + _n_gaps * iz_ind;
2000 LibmeshPetscCall(
2001 VecSetValues(_amc_turbulent_cross_flows_rhs, 1, &row, &value_tl, INSERT_VALUES));
2002 }
2003 else
2004 {
2005 PetscScalar value_tl = base_value / (Si_in + Sj_in);
2006 PetscInt row = i_gap + _n_gaps * iz_ind;
2007
2008 PetscInt col_ich = i_ch + _n_channels * (iz_ind - 1);
2009 LibmeshPetscCall(MatSetValues(
2010 _amc_turbulent_cross_flows_mat, 1, &row, 1, &col_ich, &value_tl, INSERT_VALUES));
2011
2012 PetscInt col_jch = j_ch + _n_channels * (iz_ind - 1);
2013 LibmeshPetscCall(MatSetValues(
2014 _amc_turbulent_cross_flows_mat, 1, &row, 1, &col_jch, &value_tl, INSERT_VALUES));
2015 }
2016
2017 // Top values
2018 PetscScalar value_bl = base_value / (Si_out + Sj_out);
2019 PetscInt row = i_gap + _n_gaps * iz_ind;
2020
2021 PetscInt col_ich = i_ch + _n_channels * iz_ind;
2022 LibmeshPetscCall(MatSetValues(
2023 _amc_turbulent_cross_flows_mat, 1, &row, 1, &col_ich, &value_bl, INSERT_VALUES));
2024
2025 PetscInt col_jch = j_ch + _n_channels * iz_ind;
2026 LibmeshPetscCall(MatSetValues(
2027 _amc_turbulent_cross_flows_mat, 1, &row, 1, &col_jch, &value_bl, INSERT_VALUES));
2028 }
2029 }
2030 }
2031
2032 if (_implicit_bool)
2033 {
2034 LibmeshPetscCall(MatAssemblyBegin(_amc_turbulent_cross_flows_mat, MAT_FINAL_ASSEMBLY));
2035 LibmeshPetscCall(MatAssemblyEnd(_amc_turbulent_cross_flows_mat, MAT_FINAL_ASSEMBLY));
2036
2038 Vec loc_prod;
2039 Vec loc_Wij;
2040 LibmeshPetscCall(VecDuplicate(_amc_sys_mdot_rhs, &loc_prod));
2041 LibmeshPetscCall(VecDuplicate(_Wij_vec, &loc_Wij));
2042 LibmeshPetscCall(populateVectorFromHandle<SolutionHandle>(
2043 loc_prod, *_mdot_soln, first_node, last_node, _n_channels));
2044 LibmeshPetscCall(MatMult(_amc_turbulent_cross_flows_mat, loc_prod, loc_Wij));
2045 LibmeshPetscCall(VecAXPY(loc_Wij, -1.0, _amc_turbulent_cross_flows_rhs));
2047 loc_Wij, _WijPrime, first_node, last_node, _n_gaps));
2048 LibmeshPetscCall(VecDestroy(&loc_prod));
2049 LibmeshPetscCall(VecDestroy(&loc_Wij));
2050 }
2051}
virtual void computeBlockMixingParameters(const unsigned int, const unsigned int) const
Precomputes the mixing coefficients that depend on the flow solution of the axial levels first_node t...
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 computeMixingParameter(unsigned int i_gap, unsigned int iz) const
Computes and validates the turbulent mixing parameter.
virtual Real getGapWidth(unsigned int axial_index, unsigned int gap_index) const =0
Return gap width for a given gap index.

Referenced by SubChannel1PhaseProblem::externalSolve(), SubChannel1PhaseProblem::implicitPetscSolve(), and SubChannel1PhaseProblem::residualFunction().

◆ computeWijResidual()

void SubChannel1PhaseProblem::computeWijResidual ( int  iblock)
protectedinherited

Computes Residual Matrix based on the lateral momentum conservation equation for block iblock.

Assembling system

Definition at line 1634 of file SubChannel1PhaseProblem.C.

1635{
1636 const unsigned int last_node = (iblock + 1) * _block_size;
1637 const unsigned int first_node = iblock * _block_size + 1;
1638 // Cross flow residual
1639 if (!_implicit_bool)
1640 {
1641 const Real & pitch = _subchannel_mesh.getPitch();
1642 for (unsigned int iz = first_node; iz < last_node + 1; iz++)
1643 {
1644 auto dz = _z_grid[iz] - _z_grid[iz - 1];
1645 for (unsigned int i_gap = 0; i_gap < _n_gaps; i_gap++)
1646 {
1647 auto chans = _subchannel_mesh.getGapChannels(i_gap);
1648 unsigned int i_ch = chans.first;
1649 unsigned int j_ch = chans.second;
1650 auto * node_in_i = _subchannel_mesh.getChannelNode(i_ch, iz - 1);
1651 auto * node_out_i = _subchannel_mesh.getChannelNode(i_ch, iz);
1652 auto * node_in_j = _subchannel_mesh.getChannelNode(j_ch, iz - 1);
1653 auto * node_out_j = _subchannel_mesh.getChannelNode(j_ch, iz);
1654 auto rho_i = (*_rho_soln)(node_in_i);
1655 auto rho_j = (*_rho_soln)(node_in_j);
1656 auto Si = (*_S_flow_soln)(node_in_i);
1657 auto Sj = (*_S_flow_soln)(node_in_j);
1658 auto Sij = dz * _subchannel_mesh.getGapWidth(iz, i_gap);
1659 auto Lij = pitch;
1660 // total local form loss in the ij direction
1661 auto friction_term = _kij * _Wij(i_gap, iz) * std::abs(_Wij(i_gap, iz));
1662 auto DPij = (*_P_soln)(node_in_i) - (*_P_soln)(node_in_j);
1663 // Figure out donor cell density
1664 auto rho_star = 0.0;
1665 if (_Wij(i_gap, iz) > 0.0)
1666 rho_star = rho_i;
1667 else if (_Wij(i_gap, iz) < 0.0)
1668 rho_star = rho_j;
1669 else
1670 rho_star = (rho_i + rho_j) / 2.0;
1671 auto mass_term_out =
1672 (*_mdot_soln)(node_out_i) / (*_S_flow_soln)(node_out_i) / (*_rho_soln)(node_out_i) +
1673 (*_mdot_soln)(node_out_j) / (*_S_flow_soln)(node_out_j) / (*_rho_soln)(node_out_j);
1674 auto mass_term_in =
1675 (*_mdot_soln)(node_in_i) / Si / rho_i + (*_mdot_soln)(node_in_j) / Sj / rho_j;
1676 auto term_out = Sij * rho_star * (Lij / dz) * mass_term_out * _Wij(i_gap, iz);
1677 auto term_in = Sij * rho_star * (Lij / dz) * mass_term_in * _Wij(i_gap, iz - 1);
1678 auto inertia_term = term_out - term_in;
1679 auto pressure_term = 2 * Utility::pow<2>(Sij) * DPij * rho_star;
1680 auto time_term =
1681 _TR * 2.0 * (_Wij(i_gap, iz) - _Wij_old(i_gap, iz)) * Lij * Sij * rho_star / _dt;
1682
1683 _Wij_residual_matrix(i_gap, iz - 1 - iblock * _block_size) =
1684 time_term + friction_term + inertia_term - pressure_term;
1685 }
1686 }
1687 }
1688 else
1689 {
1690 // Initializing to zero the elements of the lateral momentum assembly
1691 LibmeshPetscCall(MatZeroEntries(_cmc_time_derivative_mat));
1692 LibmeshPetscCall(MatZeroEntries(_cmc_advective_derivative_mat));
1693 LibmeshPetscCall(MatZeroEntries(_cmc_friction_force_mat));
1694 LibmeshPetscCall(MatZeroEntries(_cmc_pressure_force_mat));
1695 LibmeshPetscCall(VecZeroEntries(_cmc_time_derivative_rhs));
1696 LibmeshPetscCall(VecZeroEntries(_cmc_advective_derivative_rhs));
1697 LibmeshPetscCall(VecZeroEntries(_cmc_friction_force_rhs));
1698 LibmeshPetscCall(VecZeroEntries(_cmc_pressure_force_rhs));
1699 LibmeshPetscCall(MatZeroEntries(_cmc_sys_Wij_mat));
1700 LibmeshPetscCall(VecZeroEntries(_cmc_sys_Wij_rhs));
1701 const Real & pitch = _subchannel_mesh.getPitch();
1702 for (unsigned int iz = first_node; iz < last_node + 1; iz++)
1703 {
1704 auto dz = _z_grid[iz] - _z_grid[iz - 1];
1705 auto iz_ind = iz - first_node;
1706 for (unsigned int i_gap = 0; i_gap < _n_gaps; i_gap++)
1707 {
1708 auto chans = _subchannel_mesh.getGapChannels(i_gap);
1709 unsigned int i_ch = chans.first;
1710 unsigned int j_ch = chans.second;
1711 auto * node_in_i = _subchannel_mesh.getChannelNode(i_ch, iz - 1);
1712 auto * node_out_i = _subchannel_mesh.getChannelNode(i_ch, iz);
1713 auto * node_in_j = _subchannel_mesh.getChannelNode(j_ch, iz - 1);
1714 auto * node_out_j = _subchannel_mesh.getChannelNode(j_ch, iz);
1715
1716 // inlet, outlet, and interpolated densities
1717 auto rho_i_in = (*_rho_soln)(node_in_i);
1718 auto rho_i_out = (*_rho_soln)(node_out_i);
1719 auto rho_i_interp = computeInterpolatedValue(rho_i_out, rho_i_in, 0.5);
1720 auto rho_j_in = (*_rho_soln)(node_in_j);
1721 auto rho_j_out = (*_rho_soln)(node_out_j);
1722 auto rho_j_interp = computeInterpolatedValue(rho_j_out, rho_j_in, 0.5);
1723
1724 // inlet, outlet, and interpolated areas
1725 auto S_i_in = (*_S_flow_soln)(node_in_i);
1726 auto S_i_out = (*_S_flow_soln)(node_out_i);
1727 auto S_j_in = (*_S_flow_soln)(node_in_j);
1728 auto S_j_out = (*_S_flow_soln)(node_out_j);
1729
1730 // Cross-sectional gap area
1731 auto Sij = dz * _subchannel_mesh.getGapWidth(iz, i_gap);
1732 auto Lij = pitch;
1733
1734 // Figure out donor cell density
1735 auto rho_star = 0.0;
1736 if (_Wij(i_gap, iz) > 0.0)
1737 rho_star = rho_i_interp;
1738 else if (_Wij(i_gap, iz) < 0.0)
1739 rho_star = rho_j_interp;
1740 else
1741 rho_star = (rho_i_interp + rho_j_interp) / 2.0;
1742
1743 // Assembling time derivative
1744 PetscScalar time_factor = _TR * Lij * Sij * rho_star / _dt;
1745 PetscInt row_td = i_gap + _n_gaps * iz_ind;
1746 PetscInt col_td = i_gap + _n_gaps * iz_ind;
1747 PetscScalar value_td = time_factor;
1748 LibmeshPetscCall(MatSetValues(
1749 _cmc_time_derivative_mat, 1, &row_td, 1, &col_td, &value_td, INSERT_VALUES));
1750 PetscScalar value_td_rhs = time_factor * _Wij_old(i_gap, iz);
1751 LibmeshPetscCall(
1752 VecSetValues(_cmc_time_derivative_rhs, 1, &row_td, &value_td_rhs, INSERT_VALUES));
1753
1754 // Assembling inertial term
1755 PetscScalar Pe = 0.5;
1756 auto alpha = computeInterpolationCoefficients(Pe);
1757 auto mass_term_out = (*_mdot_soln)(node_out_i) / S_i_out / rho_i_out +
1758 (*_mdot_soln)(node_out_j) / S_j_out / rho_j_out;
1759 auto mass_term_in = (*_mdot_soln)(node_in_i) / S_i_in / rho_i_in +
1760 (*_mdot_soln)(node_in_j) / S_j_in / rho_j_in;
1761 auto term_out = Sij * rho_star * (Lij / dz) * mass_term_out / 2.0;
1762 auto term_in = Sij * rho_star * (Lij / dz) * mass_term_in / 2.0;
1763 if (iz == first_node)
1764 {
1765 PetscInt row_ad = i_gap + _n_gaps * iz_ind;
1766 PetscScalar value_ad = term_in * alpha * _Wij(i_gap, iz - 1);
1767 LibmeshPetscCall(
1768 VecSetValues(_cmc_advective_derivative_rhs, 1, &row_ad, &value_ad, ADD_VALUES));
1769
1770 PetscInt col_ad = i_gap + _n_gaps * iz_ind;
1771 value_ad = -1.0 * term_in * (1.0 - alpha) + term_out * alpha;
1772 LibmeshPetscCall(MatSetValues(
1773 _cmc_advective_derivative_mat, 1, &row_ad, 1, &col_ad, &value_ad, INSERT_VALUES));
1774
1775 col_ad = i_gap + _n_gaps * (iz_ind + 1);
1776 value_ad = term_out * (1.0 - alpha);
1777 LibmeshPetscCall(MatSetValues(
1778 _cmc_advective_derivative_mat, 1, &row_ad, 1, &col_ad, &value_ad, INSERT_VALUES));
1779 }
1780 else if (iz == last_node)
1781 {
1782 PetscInt row_ad = i_gap + _n_gaps * iz_ind;
1783 PetscInt col_ad = i_gap + _n_gaps * (iz_ind - 1);
1784 PetscScalar value_ad = -1.0 * term_in * alpha;
1785 LibmeshPetscCall(MatSetValues(
1786 _cmc_advective_derivative_mat, 1, &row_ad, 1, &col_ad, &value_ad, INSERT_VALUES));
1787
1788 col_ad = i_gap + _n_gaps * iz_ind;
1789 value_ad = -1.0 * term_in * (1.0 - alpha) + term_out * alpha;
1790 LibmeshPetscCall(MatSetValues(
1791 _cmc_advective_derivative_mat, 1, &row_ad, 1, &col_ad, &value_ad, INSERT_VALUES));
1792
1793 value_ad = -1.0 * term_out * (1.0 - alpha) * _Wij(i_gap, iz);
1794 LibmeshPetscCall(
1795 VecSetValues(_cmc_advective_derivative_rhs, 1, &row_ad, &value_ad, ADD_VALUES));
1796 }
1797 else
1798 {
1799 PetscInt row_ad = i_gap + _n_gaps * iz_ind;
1800 PetscInt col_ad = i_gap + _n_gaps * (iz_ind - 1);
1801 PetscScalar value_ad = -1.0 * term_in * alpha;
1802 LibmeshPetscCall(MatSetValues(
1803 _cmc_advective_derivative_mat, 1, &row_ad, 1, &col_ad, &value_ad, INSERT_VALUES));
1804
1805 col_ad = i_gap + _n_gaps * iz_ind;
1806 value_ad = -1.0 * term_in * (1.0 - alpha) + term_out * alpha;
1807 LibmeshPetscCall(MatSetValues(
1808 _cmc_advective_derivative_mat, 1, &row_ad, 1, &col_ad, &value_ad, INSERT_VALUES));
1809
1810 col_ad = i_gap + _n_gaps * (iz_ind + 1);
1811 value_ad = term_out * (1.0 - alpha);
1812 LibmeshPetscCall(MatSetValues(
1813 _cmc_advective_derivative_mat, 1, &row_ad, 1, &col_ad, &value_ad, INSERT_VALUES));
1814 }
1815 // Assembling friction force
1816 PetscInt row_ff = i_gap + _n_gaps * iz_ind;
1817 PetscInt col_ff = i_gap + _n_gaps * iz_ind;
1818 PetscScalar value_ff = _kij * std::abs(_Wij(i_gap, iz)) / 2.0;
1819 LibmeshPetscCall(MatSetValues(
1820 _cmc_friction_force_mat, 1, &row_ff, 1, &col_ff, &value_ff, INSERT_VALUES));
1821
1822 // Assembling pressure force
1824
1826 {
1827 PetscScalar pressure_factor = Utility::pow<2>(Sij) * rho_star;
1828 PetscInt row_pf = i_gap + _n_gaps * iz_ind;
1829 PetscInt col_pf = i_ch + _n_channels * iz_ind;
1830 PetscScalar value_pf = -1.0 * alpha * pressure_factor;
1831 LibmeshPetscCall(
1832 MatSetValues(_cmc_pressure_force_mat, 1, &row_pf, 1, &col_pf, &value_pf, ADD_VALUES));
1833 col_pf = j_ch + _n_channels * iz_ind;
1834 value_pf = alpha * pressure_factor;
1835 LibmeshPetscCall(
1836 MatSetValues(_cmc_pressure_force_mat, 1, &row_pf, 1, &col_pf, &value_pf, ADD_VALUES));
1837
1838 if (iz == last_node)
1839 {
1840 PetscInt row_pf = i_gap + _n_gaps * iz_ind;
1841 PetscScalar value_pf = (1.0 - alpha) * pressure_factor * (*_P_soln)(node_out_i);
1842 LibmeshPetscCall(
1843 VecSetValues(_cmc_pressure_force_rhs, 1, &row_pf, &value_pf, ADD_VALUES));
1844 value_pf = -1.0 * (1.0 - alpha) * pressure_factor * (*_P_soln)(node_out_j);
1845 LibmeshPetscCall(
1846 VecSetValues(_cmc_pressure_force_rhs, 1, &row_pf, &value_pf, ADD_VALUES));
1847 }
1848 else
1849 {
1850 row_pf = i_gap + _n_gaps * iz_ind;
1851 col_pf = i_ch + _n_channels * (iz_ind + 1);
1852 value_pf = -1.0 * (1.0 - alpha) * pressure_factor;
1853 LibmeshPetscCall(MatSetValues(
1854 _cmc_pressure_force_mat, 1, &row_pf, 1, &col_pf, &value_pf, ADD_VALUES));
1855 col_pf = j_ch + _n_channels * (iz_ind + 1);
1856 value_pf = (1.0 - alpha) * pressure_factor;
1857 LibmeshPetscCall(MatSetValues(
1858 _cmc_pressure_force_mat, 1, &row_pf, 1, &col_pf, &value_pf, ADD_VALUES));
1859 }
1860 }
1861 else
1862 {
1863 PetscScalar pressure_factor = Utility::pow<2>(Sij) * rho_star;
1864 PetscInt row_pf = i_gap + _n_gaps * iz_ind;
1865 PetscInt col_pf = i_ch + _n_channels * iz_ind;
1866 PetscScalar value_pf = -1.0 * pressure_factor;
1867 LibmeshPetscCall(
1868 MatSetValues(_cmc_pressure_force_mat, 1, &row_pf, 1, &col_pf, &value_pf, ADD_VALUES));
1869 col_pf = j_ch + _n_channels * iz_ind;
1870 value_pf = pressure_factor;
1871 LibmeshPetscCall(
1872 MatSetValues(_cmc_pressure_force_mat, 1, &row_pf, 1, &col_pf, &value_pf, ADD_VALUES));
1873 }
1874 }
1875 }
1877 LibmeshPetscCall(MatZeroEntries(_cmc_sys_Wij_mat));
1878 LibmeshPetscCall(VecZeroEntries(_cmc_sys_Wij_rhs));
1879 LibmeshPetscCall(MatAssemblyBegin(_cmc_time_derivative_mat, MAT_FINAL_ASSEMBLY));
1880 LibmeshPetscCall(MatAssemblyEnd(_cmc_time_derivative_mat, MAT_FINAL_ASSEMBLY));
1881 LibmeshPetscCall(MatAssemblyBegin(_cmc_advective_derivative_mat, MAT_FINAL_ASSEMBLY));
1882 LibmeshPetscCall(MatAssemblyEnd(_cmc_advective_derivative_mat, MAT_FINAL_ASSEMBLY));
1883 LibmeshPetscCall(MatAssemblyBegin(_cmc_friction_force_mat, MAT_FINAL_ASSEMBLY));
1884 LibmeshPetscCall(MatAssemblyEnd(_cmc_friction_force_mat, MAT_FINAL_ASSEMBLY));
1885 LibmeshPetscCall(MatAssemblyBegin(_cmc_pressure_force_mat, MAT_FINAL_ASSEMBLY));
1886 LibmeshPetscCall(MatAssemblyEnd(_cmc_pressure_force_mat, MAT_FINAL_ASSEMBLY));
1887 LibmeshPetscCall(MatAssemblyBegin(_cmc_sys_Wij_mat, MAT_FINAL_ASSEMBLY));
1888 LibmeshPetscCall(MatAssemblyEnd(_cmc_sys_Wij_mat, MAT_FINAL_ASSEMBLY));
1889 // Matrix
1890#if !PETSC_VERSION_LESS_THAN(3, 15, 0)
1891 LibmeshPetscCall(
1892 MatAXPY(_cmc_sys_Wij_mat, 1.0, _cmc_time_derivative_mat, UNKNOWN_NONZERO_PATTERN));
1893 LibmeshPetscCall(MatAssemblyBegin(_cmc_sys_Wij_mat, MAT_FINAL_ASSEMBLY));
1894 LibmeshPetscCall(MatAssemblyEnd(_cmc_sys_Wij_mat, MAT_FINAL_ASSEMBLY));
1895 LibmeshPetscCall(
1896 MatAXPY(_cmc_sys_Wij_mat, 1.0, _cmc_advective_derivative_mat, UNKNOWN_NONZERO_PATTERN));
1897 LibmeshPetscCall(MatAssemblyBegin(_cmc_sys_Wij_mat, MAT_FINAL_ASSEMBLY));
1898 LibmeshPetscCall(MatAssemblyEnd(_cmc_sys_Wij_mat, MAT_FINAL_ASSEMBLY));
1899 LibmeshPetscCall(
1900 MatAXPY(_cmc_sys_Wij_mat, 1.0, _cmc_friction_force_mat, UNKNOWN_NONZERO_PATTERN));
1901#else
1902 LibmeshPetscCall(
1903 MatAXPY(_cmc_sys_Wij_mat, 1.0, _cmc_time_derivative_mat, DIFFERENT_NONZERO_PATTERN));
1904 LibmeshPetscCall(MatAssemblyBegin(_cmc_sys_Wij_mat, MAT_FINAL_ASSEMBLY));
1905 LibmeshPetscCall(MatAssemblyEnd(_cmc_sys_Wij_mat, MAT_FINAL_ASSEMBLY));
1906 LibmeshPetscCall(
1907 MatAXPY(_cmc_sys_Wij_mat, 1.0, _cmc_advective_derivative_mat, DIFFERENT_NONZERO_PATTERN));
1908 LibmeshPetscCall(MatAssemblyBegin(_cmc_sys_Wij_mat, MAT_FINAL_ASSEMBLY));
1909 LibmeshPetscCall(MatAssemblyEnd(_cmc_sys_Wij_mat, MAT_FINAL_ASSEMBLY));
1910 LibmeshPetscCall(
1911 MatAXPY(_cmc_sys_Wij_mat, 1.0, _cmc_friction_force_mat, DIFFERENT_NONZERO_PATTERN));
1912#endif
1913 LibmeshPetscCall(MatAssemblyBegin(_cmc_sys_Wij_mat, MAT_FINAL_ASSEMBLY));
1914 LibmeshPetscCall(MatAssemblyEnd(_cmc_sys_Wij_mat, MAT_FINAL_ASSEMBLY));
1915 // RHS
1916 LibmeshPetscCall(VecAXPY(_cmc_sys_Wij_rhs, 1.0, _cmc_time_derivative_rhs));
1917 LibmeshPetscCall(VecAXPY(_cmc_sys_Wij_rhs, 1.0, _cmc_advective_derivative_rhs));
1918 LibmeshPetscCall(VecAXPY(_cmc_sys_Wij_rhs, 1.0, _cmc_friction_force_rhs));
1919
1920 if (_segregated_bool)
1921 {
1922 // Assembly the matrix system
1923 Vec sol_holder_P;
1924 LibmeshPetscCall(createPetscVector(sol_holder_P, _block_size * _n_gaps));
1925 Vec sol_holder_W;
1926 LibmeshPetscCall(createPetscVector(sol_holder_W, _block_size * _n_gaps));
1927 LibmeshPetscCall(populateVectorFromHandle<SolutionHandle>(
1928 _prodp, *_P_soln, first_node - 1, last_node - 1, _n_channels));
1930 _Wij_vec, _Wij, first_node, last_node, _n_gaps));
1931 LibmeshPetscCall(MatMult(_cmc_sys_Wij_mat, _Wij_vec, sol_holder_W));
1932 LibmeshPetscCall(VecAXPY(sol_holder_W, -1.0, _cmc_sys_Wij_rhs));
1933 LibmeshPetscCall(MatMult(_cmc_pressure_force_mat, _prodp, sol_holder_P));
1934 LibmeshPetscCall(VecAXPY(sol_holder_P, -1.0, _cmc_pressure_force_rhs));
1935 LibmeshPetscCall(VecAXPY(sol_holder_W, 1.0, sol_holder_P));
1936 PetscScalar * xx;
1937 LibmeshPetscCall(VecGetArray(sol_holder_W, &xx));
1938 for (unsigned int iz = first_node; iz < last_node + 1; iz++)
1939 {
1940 auto iz_ind = iz - first_node;
1941 for (unsigned int i_gap = 0; i_gap < _n_gaps; i_gap++)
1942 {
1943 _Wij_residual_matrix(i_gap, iz - 1 - iblock * _block_size) = xx[iz_ind * _n_gaps + i_gap];
1944 }
1945 }
1946 LibmeshPetscCall(VecDestroy(&sol_holder_P));
1947 LibmeshPetscCall(VecDestroy(&sol_holder_W));
1948 }
1949 }
1950}
PetscErrorCode createPetscVector(Vec &v, PetscInt n)
Petsc Functions.
libMesh::DenseMatrix< Real > _Wij_residual_matrix
libMesh::DenseMatrix< Real > & _Wij_old
virtual const Real & getPitch() const
Return the undeformed pitch between 2 subchannels.

Referenced by SubChannel1PhaseProblem::implicitPetscSolve(), and SubChannel1PhaseProblem::residualFunction().

◆ createPetscMatrix()

PetscErrorCode SubChannel1PhaseProblem::createPetscMatrix ( Mat &  M,
PetscInt  n,
PetscInt  m 
)
inlineprotectedinherited

Definition at line 327 of file SubChannel1PhaseProblem.h.

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 }
const double M

Referenced by SubChannel1PhaseProblem::SubChannel1PhaseProblem(), and TriSubChannel1PhaseProblem::TriSubChannel1PhaseProblem().

◆ createPetscVector()

PetscErrorCode SubChannel1PhaseProblem::createPetscVector ( Vec &  v,
PetscInt  n 
)
inlineprotectedinherited

Petsc Functions.

Definition at line 316 of file SubChannel1PhaseProblem.h.

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 }
const double v

Referenced by SubChannel1PhaseProblem::computeWijResidual(), SubChannel1PhaseProblem::implicitPetscSolve(), SubChannel1PhaseProblem::SubChannel1PhaseProblem(), and TriSubChannel1PhaseProblem::TriSubChannel1PhaseProblem().

◆ detectDeformation()

void SubChannel1PhaseProblem::detectDeformation ( )
protectedinherited

Detects whether pin diameter or duct displacement fields require geometry recalculation.

Definition at line 459 of file SubChannel1PhaseProblem.C.

460{
462 const auto pin_diameter = _subchannel_mesh.getPinDiameter();
463
464 if (_pin_mesh_exist)
465 {
466 for (unsigned int iz = 0; iz < _n_cells + 1; iz++)
467 for (unsigned int i_pin = 0; i_pin < _n_pins; i_pin++)
468 {
469 auto * node = _subchannel_mesh.getPinNode(i_pin, iz);
470 const Real Dpin = (*_Dpin_soln)(node);
471 if (std::abs(Dpin) <= tol)
472 mooseError("Dpin is zero at node ",
473 node->id(),
474 ". You must initialize Dpin to a non-zero value.");
475 if (std::abs(Dpin - pin_diameter) > tol)
476 _deformation = true;
477 }
478 }
479
480 for (unsigned int iz = 0; iz < _n_cells + 1 && !_deformation; iz++)
481 for (unsigned int i_ch = 0; i_ch < _n_channels && !_deformation; i_ch++)
482 {
483 auto * node = _subchannel_mesh.getChannelNode(i_ch, iz);
484 auto subch_type = _subchannel_mesh.getSubchannelType(i_ch);
485
486 if ((subch_type == EChannelType::CORNER || subch_type == EChannelType::EDGE) &&
487 std::abs((*_displacement_soln)(node)) > tol)
488 _deformation = true;
489 }
490}
const double tol
std::unique_ptr< SolutionHandle > _displacement_soln
bool _deformation
Flag that activates the effect of deformation (pin/duct) based on the auxvalues for displacement,...
virtual const Real & getPinDiameter() const
Return undeformed Pin diameter.
virtual Node * getPinNode(unsigned int i_pin, unsigned int iz) const =0
Get the pin mesh node for a given pin index and elevation index.
static constexpr Real TOLERANCE

Referenced by initializeSolution(), and TriSubChannel1PhaseProblem::initializeSolution().

◆ externalSolve()

void SubChannel1PhaseProblem::externalSolve ( )
overridevirtualinherited

Assigning temperatures to duct

Implements ExternalProblem.

Definition at line 2762 of file SubChannel1PhaseProblem.C.

2763{
2764 _console << "Executing subchannel solver\n";
2765 _dt = (isTransient() ? dt() : _one);
2766 _TR = isTransient();
2767
2768 // The subchannel solver hardcodes a first-order backward (implicit) Euler time discretization, so
2769 // any other time integrator a user selects is silently ignored. Warn once if one is requested.
2771 {
2773 if (isTransient())
2774 if (auto * transient = dynamic_cast<TransientBase *>(_app.getExecutioner()))
2775 for (const auto * ti : transient->getTimeIntegrators())
2776 if (!dynamic_cast<const ImplicitEuler *>(ti))
2777 mooseWarning("The subchannel solver always uses implicit (backward) Euler time "
2778 "integration; the requested '",
2779 ti->type(),
2780 "' time integrator is ignored.");
2781 }
2782
2785 // Small helper functions to reduce repetition
2786 // Verbose print helper (no-op unless _verbose_subchannel is true)
2787 auto V = [&](const std::string & s)
2788 {
2790 _console << s << std::endl;
2791 };
2792 auto saveValues = [&](const SolutionHandle & solution,
2793 const unsigned int first_node,
2794 const unsigned int last_node)
2795 {
2796 std::vector<Real> values;
2797 values.reserve((last_node - first_node + 1) * _n_channels);
2798 for (unsigned int iz = first_node; iz <= last_node; ++iz)
2799 for (unsigned int i_ch = 0; i_ch < _n_channels; ++i_ch)
2800 values.push_back(solution(_subchannel_mesh.getChannelNode(i_ch, iz)));
2801 return values;
2802 };
2803 auto relativeChange = [&](const SolutionHandle & solution,
2804 const std::vector<Real> & old_values,
2805 const unsigned int first_node,
2806 const unsigned int last_node,
2807 const Real reference_offset)
2808 {
2809 Real difference_norm_sq = 0.0;
2810 Real reference_norm_sq = 0.0;
2811 std::size_t i = 0;
2812 for (unsigned int iz = first_node; iz <= last_node; ++iz)
2813 for (unsigned int i_ch = 0; i_ch < _n_channels; ++i_ch)
2814 {
2815 const Real value = solution(_subchannel_mesh.getChannelNode(i_ch, iz));
2816 difference_norm_sq += Utility::pow<2>(value - old_values[i]);
2817 reference_norm_sq += Utility::pow<2>(old_values[i] + reference_offset);
2818 ++i;
2819 }
2820 return std::sqrt(difference_norm_sq) / (std::sqrt(reference_norm_sq) + 1e-14);
2821 };
2822 V("Solution initialized");
2823 Real P_error = 1.0;
2824 unsigned int P_it = 0;
2825 unsigned int P_it_max;
2826 bool temperature_converged = true;
2827
2828 if (_segregated_bool)
2829 P_it_max = 20 * _n_blocks;
2830 else
2831 P_it_max = 100;
2832
2833 if ((_n_blocks == 1) && (_segregated_bool))
2834 P_it_max = 5;
2835
2836 if (_P_maxit > 0)
2837 P_it_max = _P_maxit;
2838
2839 while ((P_error > _P_tol && P_it < P_it_max))
2840 {
2841 P_it += 1;
2842 temperature_converged = true;
2844 _console << "Solving Outer Iteration : " << P_it << std::endl;
2845 const auto P_old = saveValues(*_P_soln, 0, _n_cells);
2846 for (unsigned int iblock = 0; iblock < _n_blocks; iblock++)
2847 {
2848 int last_level = (iblock + 1) * _block_size;
2849 int first_level = iblock * _block_size + 1;
2850 Real T_block_error = 1.0;
2851 auto T_it = 0;
2852 _console << "Solving Block: " << iblock << " From first level: " << first_level
2853 << " to last level: " << last_level << std::endl;
2854
2855 while (T_block_error > _T_tol && T_it < _T_maxit)
2856 {
2857 if (processor_id() == 0)
2858 {
2859 if (_segregated_bool)
2860 computeWijFromSolve(iblock);
2861 else
2862 {
2863 LibmeshPetscCall(implicitPetscSolve(iblock));
2864 computeWijPrime(iblock);
2865 V("Done with main solve.");
2866 }
2867 }
2868
2869 // A value of one preserves the original ordering by refreshing the flow solution before
2870 // every thermal update. Larger values opt into lagging flow during thermal subcycles.
2871 for (const auto enthalpy_subcycle : make_range(_enthalpy_subcycles))
2872 {
2873 if (T_block_error <= _T_tol || T_it >= _T_maxit)
2874 break;
2875
2876 V("Enthalpy subcycle: " + std::to_string(enthalpy_subcycle + 1));
2877 T_it += 1;
2878 const auto T_old = saveValues(*_T_soln, first_level, last_level);
2879 // We are only computing quantities on rank 0
2880 if (processor_id() > 0)
2881 {
2882 // Rank zero supplies the error through the maximum reduction below.
2883 T_block_error = 0.0;
2884 goto aux_close;
2885 }
2886
2887 if (_compute_power)
2888 {
2889 computeh(iblock);
2890 T_block_error = computeT(iblock);
2891 V("Done with thermal solve.");
2892 }
2893
2894 V("Start updating thermophysical properties.");
2895 if (_compute_density)
2896 computeRho(iblock);
2898 computeMu(iblock);
2899 V("Done updating thermophysical properties.");
2900
2901 // We must do a global assembly to make sure data is parallel consistent before we do
2902 // things like compute L2 norms
2903 aux_close:
2904 _aux->solution().close();
2905
2906 if (!_compute_power)
2907 T_block_error =
2908 relativeChange(*_T_soln, T_old, first_level, last_level, /*reference_offset=*/0.0);
2909 _console << "T_block_error: " << T_block_error << std::endl;
2910
2911 // All processes must have the same iteration count
2912 comm().max(T_block_error);
2913 }
2914 }
2915 const bool block_converged = T_block_error <= _T_tol;
2916 temperature_converged &= block_converged;
2917 if (!block_converged)
2918 {
2919 _console << "Reached maximum number of temperature iterations for block: " << iblock
2920 << std::endl;
2921 }
2922 }
2923 P_error = _segregated_bool ? relativeChange(*_P_soln, P_old, 0, _n_cells, _P_out)
2925 comm().max(P_error);
2926 _console << "P_error :" << P_error << std::endl;
2927 V("Iteration: " + std::to_string(P_it));
2928 V("Maximum iterations: " + std::to_string(P_it_max));
2929 }
2930 // Cache only the final iteration status. Earlier outer iterations may fail their thermal
2931 // tolerance and subsequently recover.
2932 const bool pressure_converged = P_error <= _P_tol;
2933 if (!pressure_converged)
2934 {
2935 _console << "Reached maximum number of axial pressure iterations" << std::endl;
2936 }
2937 _converged = pressure_converged && temperature_converged;
2938 // update old crossflow matrix
2939 _Wij_old = _Wij;
2940 _console << "Finished executing subchannel solver\n";
2941
2942 // set SumWij at the inlet equal to the one on the first axial level (for visualization purposes)
2943 for (unsigned int i_ch = 0; i_ch < _n_channels; i_ch++)
2944 {
2945 auto * node_in = _subchannel_mesh.getChannelNode(i_ch, 0);
2946 auto * node_out = _subchannel_mesh.getChannelNode(i_ch, 1);
2947 _SumWij_soln->set(node_in, (*_SumWij_soln)(node_out)); // kg/sec
2948 }
2949
2950 if (_pin_mesh_exist)
2951 {
2952 // Assign average HTC to subchannels. This is exact if all pins have the same diameter
2953 for (unsigned int iz = 0; iz < _n_cells + 1; ++iz)
2954 {
2955 for (unsigned int i_ch = 0; i_ch < _n_channels; i_ch++)
2956 {
2957 const auto * node = _subchannel_mesh.getChannelNode(i_ch, iz);
2958 auto mu = (*_mu_soln)(node);
2959 auto S = (*_S_flow_soln)(node);
2960 auto w_perim = (*_w_perim_soln)(node);
2961 auto Dh_i = 4.0 * S / w_perim;
2962 auto Re = (((*_mdot_soln)(node) / S) * Dh_i / mu);
2963 auto k = _fp->k_from_p_T((*_P_soln)(node) + _P_out, (*_T_soln)(node));
2964 auto cp = _fp->cp_from_p_T((*_P_soln)(node) + _P_out, (*_T_soln)(node));
2965 auto Pr = (*_mu_soln)(node)*cp / k;
2966 // Create Friction structure
2967 _friction_args = FrictionStruct(i_ch, Re, S, w_perim);
2968
2969 Real sumhw = 0.0;
2970 for (auto i_pin : _subchannel_mesh.getChannelPins(i_ch))
2971 {
2972 // Create nusselt number structure
2973 _nusselt_args = NusseltStruct(Re, Pr, i_pin, iz, i_ch);
2974
2975 // Compute HTC
2977 }
2978
2979 // Set HTC
2980 _HTC_soln->set(node, sumhw / _subchannel_mesh.getChannelPins(i_ch).size());
2981 }
2982 }
2983 _HTC_soln->close();
2984
2985 _console << "Commencing calculation of Pin surface temperature \n";
2986 for (unsigned int i_pin = 0; i_pin < _n_pins; i_pin++)
2987 {
2988 for (unsigned int iz = 0; iz < _n_cells + 1; ++iz)
2989 {
2990 const auto * pin_node = _subchannel_mesh.getPinNode(i_pin, iz);
2991 Real sumTemp = 0.0;
2992 // Calculate sum of pin surface temperatures that the channels around the pin see
2993 for (auto i_ch : _subchannel_mesh.getPinChannels(i_pin))
2994 {
2995 const auto * node = _subchannel_mesh.getChannelNode(i_ch, iz);
2996 auto mu = (*_mu_soln)(node);
2997 auto S = (*_S_flow_soln)(node);
2998 auto w_perim = (*_w_perim_soln)(node);
2999 auto Dh_i = 4.0 * S / w_perim;
3000 auto Re = (((*_mdot_soln)(node) / S) * Dh_i / mu);
3001 auto k = _fp->k_from_p_T((*_P_soln)(node) + _P_out, (*_T_soln)(node));
3002 auto cp = _fp->cp_from_p_T((*_P_soln)(node) + _P_out, (*_T_soln)(node));
3003 auto Pr = (*_mu_soln)(node)*cp / k;
3004 // Create Friction structure
3005 _friction_args = FrictionStruct(i_ch, Re, S, w_perim);
3006 // Create nusselt number structure
3007 _nusselt_args = NusseltStruct(Re, Pr, i_pin, iz, i_ch);
3008 // Compute HTC
3010 // Compute surface temperature contribution from subchannel side
3011 sumTemp +=
3012 (*_q_prime_soln)(pin_node) / ((*_Dpin_soln)(pin_node)*M_PI * hw) + (*_T_soln)(node);
3013 }
3014 if (_subchannel_mesh.getPinChannels(i_pin).size() > 0)
3015 _Tpin_soln->set(pin_node, sumTemp / _subchannel_mesh.getPinChannels(i_pin).size());
3016 else
3017 mooseError("Pin was not found for pin index: " + std::to_string(i_pin));
3018 }
3019 }
3020 }
3021
3023 if (_duct_mesh_exist && processor_id() == 0)
3024 {
3025 _console << "Commencing calculation of duct surface temperature " << std::endl;
3026 auto duct_nodes = _subchannel_mesh.getDuctNodes();
3027 for (Node * dn : duct_nodes)
3028 {
3029 auto * node_chan = _subchannel_mesh.getChannelNodeFromDuct(dn);
3030 auto mu = (*_mu_soln)(node_chan);
3031 auto S = (*_S_flow_soln)(node_chan);
3032 auto w_perim = (*_w_perim_soln)(node_chan);
3033 auto Dh_i = 4.0 * S / w_perim;
3034 auto Re = (((*_mdot_soln)(node_chan) / S) * Dh_i / mu);
3035 auto k = _fp->k_from_p_T((*_P_soln)(node_chan) + _P_out, (*_T_soln)(node_chan));
3036 auto cp = _fp->cp_from_p_T((*_P_soln)(node_chan) + _P_out, (*_T_soln)(node_chan));
3037 auto Pr = (*_mu_soln)(node_chan)*cp / k;
3038
3039 // Create nusselt number structure (consistent with pin case)
3040 const libMesh::Point & node_point = *_subchannel_mesh.getChannelNodeFromDuct(dn);
3041 const unsigned int iz = _subchannel_mesh.getZIndex(node_point);
3042 const unsigned int i_ch = _subchannel_mesh.channelIndex(node_point);
3043
3044 // Create nusselt number structure
3045 _nusselt_args = NusseltStruct(Re, Pr, std::numeric_limits<unsigned int>::max(), iz, i_ch);
3046
3047 // Create Friction structure
3048 _friction_args = FrictionStruct(i_ch, Re, S, w_perim);
3049
3050 // Compute HTC
3052
3053 // Compute Channel Temperature
3054 auto T_chan = (*_duct_heat_flux_soln)(dn) / hw + (*_T_soln)(node_chan);
3055 _Tduct_soln->set(dn, T_chan);
3056 }
3057 }
3058 _aux->solution().close();
3059 _aux->update();
3060
3061 // Called before the rank-0 early return since it broadcasts to all ranks
3063
3064 if (processor_id() != 0)
3065 return;
3066 Real power_in = 0.0;
3067 Real power_out = 0.0;
3068 Real mass_flow_in = 0.0;
3069 Real mass_flow_out = 0.0;
3070 for (unsigned int i_ch = 0; i_ch < _n_channels; i_ch++)
3071 {
3072 auto * node_in = _subchannel_mesh.getChannelNode(i_ch, 0);
3073 auto * node_out = _subchannel_mesh.getChannelNode(i_ch, _n_cells);
3074 const Real mdot_in = (*_mdot_soln)(node_in);
3075 power_in += mdot_in * (*_h_soln)(node_in);
3076 power_out += (*_mdot_soln)(node_out) * (*_h_soln)(node_out);
3077 mass_flow_in += mdot_in;
3078 mass_flow_out += (*_mdot_soln)(node_out);
3079 }
3080 auto h_bulk_out = power_out / mass_flow_out;
3081 auto T_bulk_out = _fp->T_from_p_h(_P_out, h_bulk_out);
3082
3085 {
3086 _console << " ======================================= " << std::endl;
3087 _console << " ======== Subchannel Print Outs ======== " << std::endl;
3088 _console << " ======================================= " << std::endl;
3089 _console << "Total flow area :" << _subchannel_mesh.getAssemblyFlowArea() << " m^2"
3090 << std::endl;
3091 _console << "Assembly hydraulic diameter :" << bulk_Dh << " m" << std::endl;
3092 _console << "Assembly Re number :" << _bulk_Re << " [-]" << std::endl;
3093 _console << "Bulk coolant temperature at outlet :" << T_bulk_out << " K" << std::endl;
3094 _console << "Power added to coolant is : " << power_out - power_in << " Watt" << std::endl;
3095 _console << "Mass flow rate in is : " << mass_flow_in << " kg/sec" << std::endl;
3096 _console << "Mass balance is : " << mass_flow_out - mass_flow_in << " kg/sec" << std::endl;
3097 _console << "User defined outlet pressure is : " << _P_out << " Pa" << std::endl;
3098 _console << " ======================================= " << std::endl;
3099 }
3100
3101 if (MooseUtils::absoluteFuzzyLessEqual((power_out - power_in), -1.0))
3103 "Energy conservation equation might not be solved correctly, Power added to coolant: " +
3104 std::to_string(power_out - power_in) + " Watt ");
3105}
const double mu
std::array< Real, 2 > values
std::shared_ptr< AuxiliarySystem > _aux
virtual Real & dt() const
virtual void transient(bool trans)
virtual bool isTransient() const override
Executioner * getExecutioner() const
const std::string & type() const
void mooseWarning(Args &&... args) const
MooseApp & _app
Real computeHTC(const FrictionStruct &friction_info, const NusseltStruct &nusselt_info, const Real conduction_k) const
Computes the convective heat transfer coefficient for the local conditions.
Provide a simple RAII interface for linear lagrange solution variables.
const SCMHTCClosureBase * _pin_HTC_closure
HTC closure objects.
const SCMHTCClosureBase * _duct_HTC_closure
virtual void initializeSolution()=0
Function to initialize the solution & geometry fields.
void computeRho(int iblock)
Computes Density per channel for block iblock.
const Real & _T_tol
Convergence tolerance for the temperature loop in internal solve.
std::unique_ptr< SolutionHandle > _Dpin_soln
unsigned int _n_blocks
number of axial blocks
std::unique_ptr< SolutionHandle > _Tduct_soln
virtual void computeh(int iblock)=0
Computes Enthalpy per channel for block iblock.
bool _time_integrator_checked
Whether the time integrator has been checked for consistency with the implementation.
const Real & _P_tol
Convergence tolerance for the pressure loop in external solve.
Real _pressure_fixed_point_error
Maximum pressure fixed-point update before solution relaxation over the blocks.
const bool _compute_viscosity
Flag that activates or deactivates the calculation of viscosity.
PetscErrorCode implicitPetscSolve(int iblock)
Computes implicit solve using PetSc.
bool _converged
Variable that informs whether we exited external solve with a converged solution or not.
const int & _T_maxit
Maximum iterations for the inner temperature loop.
std::unique_ptr< SolutionHandle > _Tpin_soln
const int & _P_maxit
Maximum number of pressure iterations; zero selects the solver's existing automatic limit.
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.
struct SubChannel1PhaseProblem::NusseltStruct _nusselt_args
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.
std::unique_ptr< SolutionHandle > _HTC_soln
virtual const std::vector< unsigned int > & getChannelPins(unsigned int i_chan) const =0
Return a vector of pin indices for a given channel index.
virtual unsigned int channelIndex(const Point &point) const =0
Node * getChannelNodeFromDuct(Node *duct_node) const
Function that gets the channel node from the duct node.
const std::vector< Node * > & getDuctNodes() const
Function that returns the vector with the duct nodes.
virtual unsigned int getZIndex(const Point &point) const
Get axial index of point.
virtual const std::vector< unsigned int > & getPinChannels(unsigned int i_pin) const =0
Return a vector of channel indices for a given Pin index.
void max(const T &r, T &o, Request &req) const
const Parallel::Communicator & comm() const
if(subdm)

◆ getAddedHeatDuct()

Real SubChannel1PhaseProblem::getAddedHeatDuct ( unsigned int  i_ch,
unsigned int  iz 
) const
inlineinherited

Return the added heat coming from the duct.

Definition at line 88 of file SubChannel1PhaseProblem.h.

89 {
90 return computeAddedHeatDuct(i_ch, iz);
91 }
virtual Real computeAddedHeatDuct(unsigned int i_ch, unsigned int iz) const
Non-pure: implemented in the base (or override in a child if needed)

◆ getAddedHeatPin()

Real SubChannel1PhaseProblem::getAddedHeatPin ( unsigned int  i_ch,
unsigned int  iz 
) const
inlineinherited

Return the added heat coming from the fuel pins.

Definition at line 82 of file SubChannel1PhaseProblem.h.

83 {
84 return computeAddedHeatPin(i_ch, iz);
85 }
virtual Real computeAddedHeatPin(unsigned int i_ch, unsigned int iz) const =0
Pure virtual: daughters provide different implementations.

◆ getBulkReynoldsNumber()

Real SubChannel1PhaseProblem::getBulkReynoldsNumber ( ) const
inlineinherited

◆ getBulkVelocity()

Real SubChannel1PhaseProblem::getBulkVelocity ( ) const
inlineinherited

Definition at line 48 of file SubChannel1PhaseProblem.h.

48{ return _bulk_V; }

Referenced by SCMMixingChenTodreas::computeBlockMixingParameters().

◆ getDuctHTCClosure()

const SCMHTCClosureBase * SubChannel1PhaseProblem::getDuctHTCClosure ( ) const
inlineinherited

◆ getFrictionClosure()

const SCMFrictionClosureBase * SubChannel1PhaseProblem::getFrictionClosure ( ) const
inlineinherited

◆ getOutletPressure()

const PostprocessorValue & SubChannel1PhaseProblem::getOutletPressure ( ) const
inlineinherited

Get outlet pressure.

Definition at line 97 of file SubChannel1PhaseProblem.h.

97{ return _P_out; }

Referenced by SCMMixingKimAndChung::computeLatticeMixingParameter().

◆ getPinHTCClosure()

const SCMHTCClosureBase * SubChannel1PhaseProblem::getPinHTCClosure ( ) const
inlineinherited

Definition at line 45 of file SubChannel1PhaseProblem.h.

45{ return _pin_HTC_closure; } // optional

◆ getSinglePhaseFluidProperties()

const SinglePhaseFluidProperties * SubChannel1PhaseProblem::getSinglePhaseFluidProperties ( ) const
inlineinherited

Get fluid properties object.

Definition at line 103 of file SubChannel1PhaseProblem.h.

103{ return _fp; }

Referenced by SCMMixingKimAndChung::computeLatticeMixingParameter().

◆ getSubChannelPeripheralDuctWidth()

Real QuadSubChannel1PhaseProblem::getSubChannelPeripheralDuctWidth ( unsigned int  i_ch) const
overrideprotectedvirtual

Function that computes the width of the duct cell that the peripheral subchannel i_ch sees.

Implements SubChannel1PhaseProblem.

Definition at line 228 of file QuadSubChannel1PhaseProblem.C.

229{
230 auto subch_type = _subchannel_mesh.getSubchannelType(i_ch);
231 if (subch_type == EChannelType::EDGE || subch_type == EChannelType::CORNER)
232 {
233 auto width = _subchannel_mesh.getPitch();
234 if (subch_type == EChannelType::CORNER)
235 width += 2.0 * _subchannel_mesh.getSideGap();
236 return width;
237 }
238 else
239 mooseError("Channel is not a perimetric subchannel ");
240}
const Real & getPitch() const override
Return the undeformed pitch between 2 subchannels.
EChannelType getSubchannelType(unsigned int index) const override
Return the type of the subchannel for given subchannel index.
const Real & getSideGap() const
Returns the side gap, not to be confused with the gap between pins, this refers to the gap next to th...

◆ implicitPetscSolve()

PetscErrorCode SubChannel1PhaseProblem::implicitPetscSolve ( int  iblock)
protectedinherited

Computes implicit solve using PetSc.

Definition at line 2280 of file SubChannel1PhaseProblem.C.

2281{
2283 // ---------- helper functions -----------------------------
2284 auto V = [&](const std::string & s)
2285 {
2287 _console << s << std::endl;
2288 };
2289
2290 auto DupMatAssembled = [&](Mat src, Mat * dst)
2291 {
2292 if (src)
2293 {
2294 LibmeshPetscCall(MatDuplicate(src, MAT_COPY_VALUES, dst));
2295 LibmeshPetscCall(MatAssemblyBegin(*dst, MAT_FINAL_ASSEMBLY));
2296 LibmeshPetscCall(MatAssemblyEnd(*dst, MAT_FINAL_ASSEMBLY));
2297 }
2298 else
2299 *dst = NULL;
2300 };
2301
2302 auto DupVecCopy = [&](Vec src, Vec * dst)
2303 {
2304 LibmeshPetscCall(VecDuplicate(src, dst));
2305 LibmeshPetscCall(VecCopy(src, *dst));
2306 };
2307
2308 const PetscInt Q = 3; // [mass conservation, axial momentum, cross momentum]
2309
2310 // small indexer
2311 auto Idx = [&](PetscInt r, PetscInt c) { return Q * r + c; };
2312
2313 // arrays that MUST be declared before lambdas use them
2314 std::vector<Mat> mat_array(Q * Q, NULL);
2315 std::vector<Vec> vec_array(Q, NULL);
2316
2317 // generic assembler for one governing equation row in the nested matrix
2318 auto AssembleEquation = [&](PetscInt f,
2319 Mat A0,
2320 Mat A1,
2321 Mat A2, // three blocks in row f (can be nullptr)
2322 Vec rhs, // base RHS for equation f
2323 Vec rhs_add, // optional extra RHS to add (can be nullptr)
2324 const char * label) // e.g. "Mass", "Lin mom", "Cross mom"
2325 {
2326 DupMatAssembled(A0, &mat_array[Idx(f, 0)]);
2327 DupMatAssembled(A1, &mat_array[Idx(f, 1)]);
2328 DupMatAssembled(A2, &mat_array[Idx(f, 2)]);
2329 DupVecCopy(rhs, &vec_array[f]);
2330 if (rhs_add)
2331 LibmeshPetscCall(VecAXPY(vec_array[f], 1.0, rhs_add));
2332 V(std::string(label) + " system assembled");
2333 };
2334
2335 // -----------------------------------------------------------------------------
2336 // Helper lambda that applies per-equation under-relaxation by modifying BOTH the
2337 // matrix block and the RHS for that equation.
2338 //
2339 // Specifically, with A_ff for the equation and D = diag(A_ff):
2340 // 1) Matrix diagonal scaling: D <- D / alpha, then A_ff's diagonal is replaced
2341 // with D. For alpha < 1 this increases diagonal dominance (more damping).
2342 // 2) RHS blending with the previous solution x_old:
2343 // rhs_f <- rhs_f + (1 - alpha) * (D / alpha) * x_old
2344 // where x_old is provided by the caller via `populate(work)`.
2345 //
2346 // Net effect: the solved x satisfies
2347 // A_ff x = rhs_f_original + ((1 - alpha)/alpha) * D * (x_old - x),
2348 // which damps updates toward x_old without changing the converged solution.
2349 // This equation relaxation is independent of the optional post-solve solution relaxation.
2350 // -----------------------------------------------------------------------------
2351 auto relaxEquation =
2352 [&](Mat diagonal_block, Vec rhs, Vec work, const Real relaxation, auto && populate)
2353 {
2354 if (relaxation == 1.0)
2355 return;
2356
2357 Vec diagonal = nullptr;
2358 LibmeshPetscCall(VecDuplicate(rhs, &diagonal));
2359
2360 // 1) diagonal_block: diag <- diag / relaxation
2361 LibmeshPetscCall(MatGetDiagonal(diagonal_block, diagonal));
2362 LibmeshPetscCall(VecScale(diagonal, 1.0 / relaxation));
2363 LibmeshPetscCall(MatDiagonalSet(diagonal_block, diagonal, INSERT_VALUES));
2364
2365 // 2) work <- x_old (caller-provided populator)
2366 LibmeshPetscCall(populate(work));
2367
2368 // 3) rhs += (1 - relaxation) * (diag .* work)
2369 LibmeshPetscCall(VecScale(diagonal, 1.0 - relaxation));
2370 LibmeshPetscCall(VecPointwiseMult(work, work, diagonal));
2371 LibmeshPetscCall(VecAXPY(rhs, 1.0, work));
2372
2373 LibmeshPetscCall(VecDestroy(&diagonal));
2374 };
2375
2376 // indices
2377 const unsigned int first_node = iblock * _block_size + 1;
2378 const unsigned int last_node = (iblock + 1) * _block_size;
2379
2380 // ---------- assemble per-block operators -----------------
2381 computeSumWij(iblock);
2382 computeMdot(iblock);
2383 computeWijPrime(iblock);
2384 computeDP(iblock);
2385 computeP(iblock);
2386 computeWijResidual(iblock);
2387
2388 V("Starting nested system.");
2389
2390 // Populate nested matrix with the individual physics
2391 // equation 0: Mass conservation
2392 AssembleEquation(/*f=*/0,
2395 /*A2=*/_mc_sumWij_mat,
2397 /*rhs_add=*/nullptr,
2398 /*label=*/"Mass");
2399
2400 // equation 1: Axial momentum conservation
2401 AssembleEquation(/*f=*/1,
2402 /*A0=*/_amc_sys_mdot_mat,
2404 /*A2=*/nullptr,
2406 /*rhs_add=*/_amc_sys_mdot_rhs,
2407 /*label=*/"Lin mom");
2408
2409 // equation 2: Cross momentum conservation
2410 AssembleEquation(/*f=*/2,
2411 /*A0=*/nullptr,
2413 /*A2=*/_cmc_sys_Wij_mat,
2414 /*rhs=*/_cmc_sys_Wij_rhs,
2415 /*rhs_add=*/_cmc_pressure_force_rhs,
2416 /*label=*/"Cross mom");
2417
2418 // ========================== Relaxation ====================
2419 if (true)
2420 {
2421 LibmeshPetscCall(populateVectorFromHandle<SolutionHandle>(
2422 _prod, *_mdot_soln, first_node, last_node, _n_channels));
2423
2424 Vec mdot_estimate;
2425 LibmeshPetscCall(createPetscVector(mdot_estimate, _block_size * _n_channels));
2426 Vec pmat_diag;
2427 LibmeshPetscCall(createPetscVector(pmat_diag, _block_size * _n_channels));
2428 Vec p_estimate;
2429 LibmeshPetscCall(createPetscVector(p_estimate, _block_size * _n_channels));
2430 Vec unity_vec;
2431 LibmeshPetscCall(createPetscVector(unity_vec, _block_size * _n_channels));
2432 LibmeshPetscCall(VecSet(unity_vec, 1.0));
2433 Vec sol_holder_P;
2434 LibmeshPetscCall(createPetscVector(sol_holder_P, _block_size * _n_gaps));
2435 Vec unity_vec_Wij;
2436 LibmeshPetscCall(createPetscVector(unity_vec_Wij, _block_size * _n_gaps));
2437 LibmeshPetscCall(VecSet(unity_vec_Wij, 1.0));
2438 Vec _Wij_loc_vec;
2439 LibmeshPetscCall(createPetscVector(_Wij_loc_vec, _block_size * _n_gaps));
2440 Vec _Wij_old_loc_vec;
2441 LibmeshPetscCall(createPetscVector(_Wij_old_loc_vec, _block_size * _n_gaps));
2442
2443 // ---- scale estimates ----
2444 // mdot_estimate = A(1,0) * mdot
2445 LibmeshPetscCall(MatMult(mat_array[Q /* (1,0) */], _prod, mdot_estimate));
2446
2447 // p_estimate = mdot_est / (diag(A(1,1)) + eps)
2448 LibmeshPetscCall(MatGetDiagonal(mat_array[Q + 1], pmat_diag));
2449 LibmeshPetscCall(VecAXPY(pmat_diag, 1e-10, unity_vec));
2450 LibmeshPetscCall(VecPointwiseDivide(p_estimate, mdot_estimate, pmat_diag));
2451
2452 // sol_holder_P = A(2,1) * p_estimate - rhs_cmc_pressure
2453 LibmeshPetscCall(MatMult(mat_array[2 * Q + 1], p_estimate, sol_holder_P));
2454 LibmeshPetscCall(VecAXPY(sol_holder_P, -1.0, _cmc_pressure_force_rhs));
2455
2456 // sumWij_loc from sol_holder_P (accumulate)
2457 Vec sumWij_loc;
2458 LibmeshPetscCall(createPetscVector(sumWij_loc, _block_size * _n_channels));
2459 for (unsigned int iz = first_node; iz <= last_node; ++iz)
2460 {
2461 const auto iz_ind = iz - first_node;
2462 for (unsigned int i_ch = 0; i_ch < _n_channels; ++i_ch)
2463 {
2464 PetscScalar sumWij = 0.0;
2465 unsigned int counter = 0;
2466 for (auto i_gap : _subchannel_mesh.getChannelGaps(i_ch))
2467 {
2468 PetscInt row_vec = i_gap + _n_gaps * iz_ind;
2469 PetscScalar loc_Wij_value;
2470 LibmeshPetscCall(VecGetValues(sol_holder_P, 1, &row_vec, &loc_Wij_value));
2471 sumWij += _subchannel_mesh.getCrossflowSign(i_ch, counter) * loc_Wij_value;
2472 counter++;
2473 }
2474 PetscInt row_vec = i_ch + _n_channels * iz_ind;
2475 LibmeshPetscCall(VecSetValues(sumWij_loc, 1, &row_vec, &sumWij, INSERT_VALUES));
2476 }
2477 }
2478 LibmeshPetscCall(VecAssemblyBegin(sumWij_loc));
2479 LibmeshPetscCall(VecAssemblyEnd(sumWij_loc));
2480
2481 // ---- robust scale measurements ----
2482 PetscScalar min_mdot, sum_mdot, avg_mdot;
2483 PetscInt n;
2484 LibmeshPetscCall(VecAbs(_prod));
2485 LibmeshPetscCall(VecMin(_prod, NULL, &min_mdot));
2486 LibmeshPetscCall(VecSum(_prod, &sum_mdot)); // Sum all entries
2487 LibmeshPetscCall(VecGetSize(_prod, &n)); // Number of entries
2488 avg_mdot = sum_mdot / static_cast<PetscScalar>(n);
2489
2490 V("Average estimated mdot: " + std::to_string(avg_mdot));
2491 V("Minimum estimated mdot: " + std::to_string(min_mdot));
2492
2493 LibmeshPetscCall(VecAbs(sumWij_loc));
2494 LibmeshPetscCall(VecMax(sumWij_loc, NULL, &_max_sumWij));
2495 _max_sumWij = std::max(1e-10, _max_sumWij);
2496 V("Maximum estimated Wij: " + std::to_string(_max_sumWij));
2497
2499 _Wij_loc_vec, _Wij, first_node, last_node, _n_gaps));
2500 LibmeshPetscCall(VecAbs(_Wij_loc_vec));
2502 _Wij_old_loc_vec, _Wij_old, first_node, last_node, _n_gaps));
2503 LibmeshPetscCall(VecAbs(_Wij_old_loc_vec));
2504 LibmeshPetscCall(VecAXPY(_Wij_loc_vec, -1.0, _Wij_old_loc_vec));
2505
2506 PetscScalar relax_factor;
2507 LibmeshPetscCall(VecAbs(_Wij_loc_vec));
2508#if !PETSC_VERSION_LESS_THAN(3, 16, 0)
2509 LibmeshPetscCall(VecMean(_Wij_loc_vec, &relax_factor));
2510#else
2511 VecSum(_Wij_loc_vec, &relax_factor);
2512 relax_factor /= _block_size * _n_gaps;
2513#endif
2514 relax_factor = relax_factor / _max_sumWij + 0.5;
2515 V("Relax base value: " + std::to_string(relax_factor));
2516
2517 // ---- crossflow resistance inflation ----
2518 const PetscScalar resistance_relaxation = 0.9;
2519 _added_K = _max_sumWij / min_mdot;
2520 V("New cross resistance: " + std::to_string(_added_K));
2521 _added_K = (_added_K * resistance_relaxation + (1.0 - resistance_relaxation) * _added_K_old) *
2522 relax_factor;
2523 V("Relaxed cross resistance: " + std::to_string(_added_K));
2524
2525 // Snap-up lower-bounding
2526 if (_added_K < 10 && _added_K >= 1.0)
2527 _added_K = 1.0;
2528 if (_added_K < 1.0 && _added_K >= 0.1)
2529 _added_K = 0.5;
2530 if (_added_K < 0.1 && _added_K >= 0.01)
2531 _added_K = 1. / 3.;
2532 if (_added_K < 1e-2 && _added_K >= 1e-3)
2533 _added_K = 0.1;
2534 V("Actual added cross resistance: " + std::to_string(_added_K));
2535 LibmeshPetscCall(VecScale(unity_vec_Wij, _added_K));
2537
2538 LibmeshPetscCall(MatDiagonalSet(mat_array[2 * Q + 2], unity_vec_Wij, ADD_VALUES));
2539
2540 // ---- cleanup temp vectors used above ----
2541 LibmeshPetscCall(VecDestroy(&mdot_estimate));
2542 LibmeshPetscCall(VecDestroy(&pmat_diag));
2543 LibmeshPetscCall(VecDestroy(&unity_vec));
2544 LibmeshPetscCall(VecDestroy(&p_estimate));
2545 LibmeshPetscCall(VecDestroy(&sol_holder_P));
2546 LibmeshPetscCall(VecDestroy(&unity_vec_Wij));
2547 LibmeshPetscCall(VecDestroy(&sumWij_loc));
2548 LibmeshPetscCall(VecDestroy(&_Wij_loc_vec));
2549 LibmeshPetscCall(VecDestroy(&_Wij_old_loc_vec));
2550 }
2551
2552 V("Relax mdot: " + std::to_string(_mass_flow_equation_relaxation));
2553 V("Relax P: " + std::to_string(_pressure_equation_relaxation));
2554 V("Relax Wij: " + std::to_string(_crossflow_equation_relaxation));
2555
2556 relaxEquation(mat_array[Idx(0, 0)],
2557 vec_array[0],
2558 _prod,
2560 [&](Vec work)
2561 {
2562 return populateVectorFromHandle<SolutionHandle>(
2563 work, *_mdot_soln, first_node, last_node, _n_channels);
2564 });
2565 V("mdot relaxed");
2566
2567 relaxEquation(mat_array[Idx(1, 1)],
2568 vec_array[1],
2569 _prodp,
2571 [&](Vec work)
2572 {
2573 // The pressure block represents the node below each axial momentum cell because
2574 // the outlet pressure is prescribed.
2575 return populateVectorFromHandle<SolutionHandle>(
2576 work, *_P_soln, first_node - 1, last_node - 1, _n_channels);
2577 });
2578 V("P relaxed");
2579
2580 relaxEquation(mat_array[Idx(2, 2)],
2581 vec_array[2],
2582 _Wij_vec,
2584 [&](Vec work)
2585 {
2586 return populateVectorFromDense<libMesh::DenseMatrix<Real>>(
2587 work, _Wij, first_node, last_node, _n_gaps);
2588 });
2589 V("Wij relaxed");
2590 V("Linear solver relaxed");
2591
2592 // ======================== Create and configure KSP =========================
2593 Mat A_nest;
2594 Vec b_nest;
2595 Vec x_nest;
2596 LibmeshPetscCall(MatCreateNest(PETSC_COMM_SELF, Q, NULL, Q, NULL, mat_array.data(), &A_nest));
2597 LibmeshPetscCall(VecCreateNest(PETSC_COMM_SELF, Q, NULL, vec_array.data(), &b_nest));
2598 V("Nested system created");
2599
2600 KSP ksp;
2601 PC pc;
2602 LibmeshPetscCall(KSPCreate(PETSC_COMM_SELF, &ksp));
2603 LibmeshPetscCall(KSPSetOptionsPrefix(ksp, "scm_coupled_"));
2604 LibmeshPetscCall(KSPSetType(ksp, KSPFGMRES));
2605 LibmeshPetscCall(KSPSetOperators(ksp, A_nest, A_nest));
2606 LibmeshPetscCall(KSPGetPC(ksp, &pc));
2607 LibmeshPetscCall(PCSetType(pc, PCFIELDSPLIT));
2608 LibmeshPetscCall(KSPSetTolerances(ksp, _rtol, _atol, _dtol, _maxit));
2609
2610 // split equations
2611 std::vector<IS> rows(Q);
2612 LibmeshPetscCall(MatNestGetISs(A_nest, rows.data(), NULL));
2613 for (PetscInt j = 0; j < Q; ++j)
2614 {
2615 IS part;
2616 LibmeshPetscCall(ISDuplicate(rows[j], &part));
2617 LibmeshPetscCall(PCFieldSplitSetIS(pc, NULL, part));
2618 LibmeshPetscCall(ISDestroy(&part));
2619 }
2620 LibmeshPetscCall(KSPSetFromOptions(ksp));
2621 V("Linear solver assembled");
2622
2623 // ============================== Solve =====================================
2624 LibmeshPetscCall(VecDuplicate(b_nest, &x_nest));
2625 LibmeshPetscCall(VecSet(x_nest, 0.0));
2626 LibmeshPetscCall(KSPSolve(ksp, b_nest, x_nest));
2627 KSPConvergedReason reason;
2628 LibmeshPetscCall(KSPGetConvergedReason(ksp, &reason));
2629 if (reason < 0)
2630 {
2631 PetscInt iterations;
2632 PetscReal residual_norm;
2633 LibmeshPetscCall(KSPGetIterationNumber(ksp, &iterations));
2634 LibmeshPetscCall(KSPGetResidualNorm(ksp, &residual_norm));
2635 mooseError(name(),
2636 ": coupled mass/momentum linear solve failed: ",
2637 KSPConvergedReasons[reason],
2638 " (",
2639 static_cast<int>(reason),
2640 ") after ",
2641 iterations,
2642 " iterations; residual norm = ",
2643 residual_norm,
2644 ".");
2645 }
2646
2647 // destroy solver containers first
2648 LibmeshPetscCall(VecDestroy(&b_nest));
2649 LibmeshPetscCall(MatDestroy(&A_nest));
2650 LibmeshPetscCall(KSPDestroy(&ksp));
2651 for (PetscInt i = 0; i < Q * Q; i++)
2652 LibmeshPetscCall(MatDestroy(&mat_array[i]));
2653 for (PetscInt i = 0; i < Q; i++)
2654 LibmeshPetscCall(VecDestroy(&vec_array[i]));
2655 V("Solver elements destroyed");
2656
2657 // ====================== Extract & scatter the solution =====================
2658 Vec sol_mdot, sol_p, sol_Wij;
2659 V("Vectors to hold solution created");
2660 PetscInt num_vecs;
2661 Vec * loc_vecs;
2662 LibmeshPetscCall(VecNestGetSubVecs(x_nest, &num_vecs, &loc_vecs));
2663 LibmeshPetscCall(VecDuplicate(_mc_axial_convection_rhs, &sol_mdot));
2664 LibmeshPetscCall(VecCopy(loc_vecs[0], sol_mdot));
2665 LibmeshPetscCall(VecDuplicate(_amc_sys_mdot_rhs, &sol_p));
2666 LibmeshPetscCall(VecCopy(loc_vecs[1], sol_p));
2667 LibmeshPetscCall(VecDuplicate(_cmc_sys_Wij_rhs, &sol_Wij));
2668 LibmeshPetscCall(VecCopy(loc_vecs[2], sol_Wij));
2669 V("Solution from coupled solver copied to solution vectors");
2670
2671 // Apply independent post-solve relaxation to the fixed-point solution update.
2672 auto relaxSolution = [&](Vec solution, Vec old_solution, const Real relaxation)
2673 {
2674 LibmeshPetscCall(VecScale(solution, relaxation));
2675 LibmeshPetscCall(VecAXPY(solution, 1.0 - relaxation, old_solution));
2676 };
2677 LibmeshPetscCall(populateVectorFromHandle<SolutionHandle>(
2678 _prod, *_mdot_soln, first_node, last_node, _n_channels));
2679 LibmeshPetscCall(populateVectorFromHandle<SolutionHandle>(
2680 _prodp, *_P_soln, first_node - 1, last_node - 1, _n_channels));
2681
2682 // Measure the pressure update before post-solve relaxation so changing that relaxation does
2683 // not change the meaning of the outer pressure tolerance.
2684 Vec pressure_residual;
2685 LibmeshPetscCall(VecDuplicate(sol_p, &pressure_residual));
2686 LibmeshPetscCall(VecCopy(sol_p, pressure_residual));
2687 LibmeshPetscCall(VecAXPY(pressure_residual, -1.0, _prodp));
2688
2689 const PetscScalar * residual_array;
2690 const PetscScalar * old_pressure_array;
2691 PetscInt pressure_size;
2692 LibmeshPetscCall(VecGetSize(pressure_residual, &pressure_size));
2693 LibmeshPetscCall(VecGetArrayRead(pressure_residual, &residual_array));
2694 LibmeshPetscCall(VecGetArrayRead(_prodp, &old_pressure_array));
2695 Real residual_norm_sq = 0.0;
2696 Real pressure_norm_sq = 0.0;
2697 for (PetscInt i = 0; i < pressure_size; ++i)
2698 {
2699 residual_norm_sq += Utility::pow<2>(residual_array[i]);
2700 pressure_norm_sq += Utility::pow<2>(old_pressure_array[i] + _P_out);
2701 }
2702 LibmeshPetscCall(VecRestoreArrayRead(pressure_residual, &residual_array));
2703 LibmeshPetscCall(VecRestoreArrayRead(_prodp, &old_pressure_array));
2704 LibmeshPetscCall(VecDestroy(&pressure_residual));
2707 std::sqrt(residual_norm_sq) / (std::sqrt(pressure_norm_sq) + 1e-14));
2708
2709 relaxSolution(sol_mdot, _prod, _mass_flow_relaxation);
2710 relaxSolution(sol_p, _prodp, _pressure_relaxation);
2712 _Wij_vec, _Wij, first_node, last_node, _n_gaps));
2713 relaxSolution(sol_Wij, _Wij_vec, _crossflow_relaxation);
2714
2715 // mass flow
2716 LibmeshPetscCall(populateSolutionChan<SolutionHandle>(
2717 sol_mdot, *_mdot_soln, first_node, last_node, _n_channels));
2718
2719 // pressure
2720 {
2721 PetscScalar * sol_p_array;
2722 LibmeshPetscCall(VecGetArray(sol_p, &sol_p_array));
2723 for (unsigned int iz = last_node; iz > first_node - 1; iz--)
2724 {
2725 const auto iz_ind = iz - first_node;
2726 for (unsigned int i_ch = 0; i_ch < _n_channels; i_ch++)
2727 {
2728 auto * node_in = _subchannel_mesh.getChannelNode(i_ch, iz - 1);
2729 PetscScalar value = sol_p_array[iz_ind * _n_channels + i_ch];
2730 _P_soln->set(node_in, value);
2731 }
2732 }
2733 LibmeshPetscCall(VecRestoreArray(sol_p, &sol_p_array));
2734 }
2735
2736 // crossflow dense + sumWij + correction factor
2738 sol_Wij, _Wij, first_node, last_node, _n_gaps));
2739
2740 LibmeshPetscCall(MatMult(_mc_sumWij_mat, sol_Wij, _prod));
2741 LibmeshPetscCall(populateSolutionChan<SolutionHandle>(
2742 _prod, *_SumWij_soln, first_node, last_node, _n_channels));
2743
2744 LibmeshPetscCall(VecAbs(_prod));
2745 LibmeshPetscCall(VecMax(_prod, NULL, &_max_sumWij_new));
2746 V("Maximum estimated Wij new: " + std::to_string(_max_sumWij_new));
2748 V("Correction factor: " + std::to_string(_correction_factor));
2749 V("Solutions assigned to MOOSE variables.");
2750
2751 // cleanup solution objects
2752 LibmeshPetscCall(VecDestroy(&x_nest));
2753 LibmeshPetscCall(VecDestroy(&sol_mdot));
2754 LibmeshPetscCall(VecDestroy(&sol_p));
2755 LibmeshPetscCall(VecDestroy(&sol_Wij));
2756 V("Solutions destroyed.");
2757
2758 PetscFunctionReturn(LIBMESH_PETSC_SUCCESS);
2759}
Real f(Real x)
Test function for Brents method.
void computeP(int iblock)
Computes Pressure per channel for block iblock.
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.
void computeDP(int iblock)
Computes Pressure Drop per channel for block iblock.
void computeWijResidual(int iblock)
Computes Residual Matrix based on the lateral momentum conservation equation for block iblock.
void computeSumWij(int iblock)
Computes net diversion crossflow per channel for block iblock.
const Real & _crossflow_relaxation
Relaxation factor for crossflow updates in the coupled implicit solve.
void computeMdot(int iblock)
Computes mass flow per channel for block iblock.
const Real & _mass_flow_relaxation
Relaxation factor for mass flow rate updates in the coupled implicit solve.
const Real & _crossflow_equation_relaxation
Equation relaxation factor for crossflow in the coupled implicit solve.
PetscScalar _added_K
Added resistances for monolithic convergence.
const Real & _pressure_relaxation
Relaxation factor for pressure updates in the coupled implicit solve.

Referenced by SubChannel1PhaseProblem::externalSolve().

◆ initializeSolution()

void QuadSubChannel1PhaseProblem::initializeSolution ( )
overrideprotectedvirtual

Function to initialize the solution & geometry fields.

update surface area, wetted perimeter based on: Dpin, displacement

Calculate subchannel area

Correct subchannel area and wetted perimeter in case of overlapping pins

Apply area reduction on subchannels affected by blockage

update map of gap between pins (gij) based on: Dpin, displacement

Implements SubChannel1PhaseProblem.

Definition at line 32 of file QuadSubChannel1PhaseProblem.C.

33{
35
37 if (_deformation)
38 {
39 _console << " =========== DEFORMATION RECALCULATION ACTIVATED ============== " << std::endl;
40 Real standard_area, additional_area, wetted_perimeter, displaced_area;
41 auto pitch = _subchannel_mesh.getPitch();
42 auto side_gap = _subchannel_mesh.getSideGap();
43 auto z_blockage = _subchannel_mesh.getZBlockage();
44 auto index_blockage = _subchannel_mesh.getIndexBlockage();
45 auto reduction_blockage = _subchannel_mesh.getReductionBlockage();
46 for (unsigned int iz = 0; iz < _n_cells + 1; iz++)
47 {
48 for (unsigned int i_ch = 0; i_ch < _n_channels; i_ch++)
49 {
50 auto * node = _subchannel_mesh.getChannelNode(i_ch, iz);
51 auto subch_type = _subchannel_mesh.getSubchannelType(i_ch);
52 auto Z = _z_grid[iz];
53 Real rod_area = 0.0;
54 Real rod_perimeter = 0.0;
55 for (auto i_pin : _subchannel_mesh.getChannelPins(i_ch))
56 {
57 auto * pin_node = _subchannel_mesh.getPinNode(i_pin, iz);
58 rod_area += 0.25 * 0.25 * M_PI * (*_Dpin_soln)(pin_node) * (*_Dpin_soln)(pin_node);
59 rod_perimeter += 0.25 * M_PI * (*_Dpin_soln)(pin_node);
60 }
61
62 if (subch_type == EChannelType::CORNER)
63 {
64 standard_area = 0.25 * pitch * pitch;
65 displaced_area = (2 * side_gap + pitch) * (*_displacement_soln)(node) / sqrt(2) +
66 (*_displacement_soln)(node) * (*_displacement_soln)(node) / 2;
67 additional_area = pitch * side_gap + side_gap * side_gap;
68 wetted_perimeter =
69 rod_perimeter + pitch + 2 * side_gap + 2 * (*_displacement_soln)(node) / sqrt(2);
70 }
71 else if (subch_type == EChannelType::EDGE)
72 {
73 standard_area = 0.5 * pitch * pitch;
74 additional_area = pitch * side_gap;
75 displaced_area = pitch * (*_displacement_soln)(node);
76 wetted_perimeter = rod_perimeter + pitch;
77 }
78 else
79 {
80 standard_area = pitch * pitch;
81 displaced_area = 0.0;
82 additional_area = 0.0;
83 wetted_perimeter = rod_perimeter;
84 }
85
87 auto subchannel_area = displaced_area + standard_area + additional_area - rod_area;
88
90 auto overlapping_pin_area = 0.0;
91 auto overlapping_wetted_perimeter = 0.0;
92 for (auto i_gap : _subchannel_mesh.getChannelGaps(i_ch))
93 {
94 auto gap_pins = _subchannel_mesh.getGapPins(i_gap);
95 auto pin_1 = gap_pins.first;
96 auto pin_2 = gap_pins.second;
97 auto * pin_node_1 = _subchannel_mesh.getPinNode(pin_1, iz);
98 auto * pin_node_2 = _subchannel_mesh.getPinNode(pin_2, iz);
99 auto Diameter1 = (*_Dpin_soln)(pin_node_1);
100 auto Radius1 = Diameter1 / 2.0;
101 auto Diameter2 = (*_Dpin_soln)(pin_node_2);
102 auto Radius2 = Diameter2 / 2.0;
103 auto pitch = _subchannel_mesh.getPitch();
104
105 if (pitch < (Radius1 + Radius2)) // overlapping pins
106 {
107 mooseWarning(" The gap of index : '", i_gap, " at axial cell ", iz, " ' is blocked.");
108 auto cos1 =
109 (pitch * pitch + Radius1 * Radius1 - Radius2 * Radius2) / (2 * pitch * Radius1);
110 auto cos2 =
111 (pitch * pitch + Radius2 * Radius2 - Radius1 * Radius1) / (2 * pitch * Radius2);
112 auto angle1 = 2.0 * acos(cos1);
113 auto angle2 = 2.0 * acos(cos2);
114 // half of the intersecting arc-length
115 overlapping_wetted_perimeter += 0.5 * angle1 * Radius1 + 0.5 * angle2 * Radius2;
116 // Half of the overlapping area
117 overlapping_pin_area +=
118 0.5 * Radius1 * Radius1 * acos(cos1) + 0.5 * Radius2 * Radius2 * acos(cos2) -
119 0.25 * sqrt((-pitch + Radius1 + Radius2) * (pitch + Radius1 - Radius2) *
120 (pitch - Radius1 + Radius2) * (pitch + Radius1 + Radius2));
121 }
122 }
123 subchannel_area += overlapping_pin_area; // correct surface area
124 wetted_perimeter += -overlapping_wetted_perimeter; // correct wetted perimeter
125
127 auto index = 0;
128 for (const auto & i_blockage : index_blockage)
129 {
130 if (i_ch == i_blockage && (Z >= z_blockage.front() && Z <= z_blockage.back()))
131 {
132 subchannel_area *= reduction_blockage[index];
133 }
134 index++;
135 }
136
137 _S_flow_soln->set(node, subchannel_area);
138 _w_perim_soln->set(node, wetted_perimeter);
139 }
140 }
142 for (unsigned int iz = 0; iz < _n_cells + 1; iz++)
143 {
144 for (unsigned int i_gap = 0; i_gap < _n_gaps; i_gap++)
145 {
146 auto gap_pins = _subchannel_mesh.getGapPins(i_gap);
147 auto pin_1 = gap_pins.first;
148 auto pin_2 = gap_pins.second;
149 auto * pin_node_1 = _subchannel_mesh.getPinNode(pin_1, iz);
150 auto * pin_node_2 = _subchannel_mesh.getPinNode(pin_2, iz);
151 if (pin_1 == pin_2) // Corner or edge gap
152 {
153 auto displacement = 0.0;
154 auto counter = 0.0;
155 for (auto i_ch : _subchannel_mesh.getPinChannels(pin_1))
156 {
157 auto subch_type = _subchannel_mesh.getSubchannelType(i_ch);
158 auto * node = _subchannel_mesh.getChannelNode(i_ch, iz);
159 if (subch_type == EChannelType::EDGE || subch_type == EChannelType::CORNER)
160 {
161 displacement += (*_displacement_soln)(node);
162 counter += 1.0;
163 }
164 }
165 displacement = displacement / counter;
167 iz, i_gap, (pitch - (*_Dpin_soln)(pin_node_1)) / 2.0 + side_gap + displacement);
168 }
169 else // center gap
170 {
172 iz, i_gap, pitch - (*_Dpin_soln)(pin_node_1) / 2.0 - (*_Dpin_soln)(pin_node_2) / 2.0);
173 }
174 // if pins come in contact, the gap is zero
175 if (_subchannel_mesh.getGapWidth(iz, i_gap) <= 0.0)
176 _subchannel_mesh.setGapWidth(iz, i_gap, 0.0);
177 }
178 }
179 }
180
181 for (unsigned int iz = 1; iz < _n_cells + 1; iz++)
182 {
183 for (unsigned int i_ch = 0; i_ch < _n_channels; i_ch++)
184 {
185 auto * node_out = _subchannel_mesh.getChannelNode(i_ch, iz);
186 auto * node_in = _subchannel_mesh.getChannelNode(i_ch, iz - 1);
187 _mdot_soln->set(node_out, (*_mdot_soln)(node_in));
188 }
189 }
190
191 // We must do a global assembly to make sure data is parallel consistent before we do things
192 // like compute L2 norms
193 _aux->solution().close();
194}
void setGapWidth(unsigned int axial_index, unsigned int gap_index, Real gap_width)
Set the gap width for a given axial cell and gap index.
Real getGapWidth(unsigned int axial_index, unsigned int gap_index) const override
Return gap width for a given gap index.
const std::pair< unsigned int, unsigned int > & getGapPins(unsigned int i_gap) const override
Return a pair of pin indices for a given gap index.
std::unique_ptr< SolutionHandle > _w_perim_soln
void detectDeformation()
Detects whether pin diameter or duct displacement fields require geometry recalculation.
virtual const std::vector< Real > & getZBlockage() const
Get axial location of blockage (in,out) [m].
virtual const std::vector< Real > & getReductionBlockage() const
Get area reduction of blocked subchannels.
virtual const std::vector< unsigned int > & getIndexBlockage() const
Get index of blocked subchannels.
CTSub CT_OPERATOR_BINARY CTMul CTCompareLess CTCompareGreater CTCompareEqual _arg template * sqrt(_arg)) *_arg.template D< dtag >()) CT_SIMPLE_UNARY_FUNCTION(tanh

◆ initialSetup()

void SubChannel1PhaseProblem::initialSetup ( )
overridevirtualinherited

Set value for turbulent momentum modeling parameter CT

Reimplemented from ExternalProblem.

Definition at line 368 of file SubChannel1PhaseProblem.C.

369{
370 // Create variables for output and storage. This comes before the base class setup, which runs
371 // the user objects executed on initial, such as SCMPinPowerPostprocessor, that read them.
372 _mdot_soln = std::make_unique<SolutionHandle>(getVariable(0, SubChannelApp::MASS_FLOW_RATE));
373 _SumWij_soln = std::make_unique<SolutionHandle>(getVariable(0, SubChannelApp::SUM_CROSSFLOW));
374 _P_soln = std::make_unique<SolutionHandle>(getVariable(0, SubChannelApp::PRESSURE));
375 if (getParam<bool>("full_output"))
376 {
377 _DP_soln = std::make_unique<SolutionHandle>(getVariable(0, SubChannelApp::PRESSURE_DROP));
378 _ff_soln = std::make_unique<SolutionHandle>(getVariable(0, SubChannelApp::FRICTION_FACTOR));
379 }
380 _h_soln = std::make_unique<SolutionHandle>(getVariable(0, SubChannelApp::ENTHALPY));
381 _T_soln = std::make_unique<SolutionHandle>(getVariable(0, SubChannelApp::TEMPERATURE));
382 if (_pin_mesh_exist)
383 {
384 _Tpin_soln = std::make_unique<SolutionHandle>(getVariable(0, SubChannelApp::PIN_TEMPERATURE));
385 _Dpin_soln = std::make_unique<SolutionHandle>(getVariable(0, SubChannelApp::PIN_DIAMETER));
386 _HTC_soln =
387 std::make_unique<SolutionHandle>(getVariable(0, SubChannelApp::HEAT_TRANSFER_COEFFICIENT));
388 }
389 _rho_soln = std::make_unique<SolutionHandle>(getVariable(0, SubChannelApp::DENSITY));
390 _mu_soln = std::make_unique<SolutionHandle>(getVariable(0, SubChannelApp::VISCOSITY));
391 _S_flow_soln = std::make_unique<SolutionHandle>(getVariable(0, SubChannelApp::SURFACE_AREA));
392 _w_perim_soln = std::make_unique<SolutionHandle>(getVariable(0, SubChannelApp::WETTED_PERIMETER));
393 _q_prime_soln = std::make_unique<SolutionHandle>(getVariable(0, SubChannelApp::LINEAR_HEAT_RATE));
395 std::make_unique<SolutionHandle>(getVariable(0, SubChannelApp::DISPLACEMENT));
397 {
399 std::make_unique<SolutionHandle>(getVariable(0, SubChannelApp::DUCT_HEAT_FLUX));
400 _Tduct_soln = std::make_unique<SolutionHandle>(getVariable(0, SubChannelApp::DUCT_TEMPERATURE));
401 }
402
404
405 _fp = &getUserObject<SinglePhaseFluidProperties>(getParam<UserObjectName>("fp"));
407 &getUserObject<SCMFrictionClosureBase>(getParam<UserObjectName>("friction_closure"));
409 &getUserObject<SCMMixingClosureBase>(getParam<UserObjectName>("mixing_closure"));
410
413
414 if (_pin_mesh_exist)
416 &getUserObject<SCMHTCClosureBase>(getParam<UserObjectName>("pin_HTC_closure"));
419 &getUserObject<SCMHTCClosureBase>(getParam<UserObjectName>("duct_HTC_closure"));
420}
virtual const MooseVariableFieldBase & getVariable(const THREAD_ID tid, const std::string &var_name, Moose::VarKindType expected_var_type=Moose::VarKindType::VAR_ANY, Moose::VarFieldType expected_var_field_type=Moose::VarFieldType::VAR_FIELD_ANY) const override
void initialSetup() override
virtual Real getCT() const
Return the Turbulent modeling parameter.
std::unique_ptr< SolutionHandle > _duct_heat_flux_soln
std::unique_ptr< SolutionHandle > _q_prime_soln
static const std::string ENTHALPY
static const std::string DISPLACEMENT
static const std::string PRESSURE_DROP
static const std::string WETTED_PERIMETER
static const std::string PRESSURE
static const std::string DUCT_TEMPERATURE
static const std::string FRICTION_FACTOR
static const std::string MASS_FLOW_RATE
static const std::string SURFACE_AREA
static const std::string VISCOSITY
static const std::string DENSITY
static const std::string PIN_DIAMETER
static const std::string HEAT_TRANSFER_COEFFICIENT
static const std::string LINEAR_HEAT_RATE
static const std::string DUCT_HEAT_FLUX
static const std::string SUM_CROSSFLOW
static const std::string PIN_TEMPERATURE
static const std::string TEMPERATURE

◆ petscSnesSolver()

PetscErrorCode SubChannel1PhaseProblem::petscSnesSolver ( int  iblock,
const libMesh::DenseVector< Real > &  solution,
libMesh::DenseVector< Real > &  root 
)
protectedinherited

Computes solution of nonlinear equation using snes and provided a residual in a formFunction.

Definition at line 2130 of file SubChannel1PhaseProblem.C.

2133{
2134 SNES snes;
2135 KSP ksp;
2136 PC pc;
2137 Vec x, r;
2138 PetscScalar * xx;
2139
2141 LibmeshPetscCall(SNESCreate(PETSC_COMM_SELF, &snes));
2142 LibmeshPetscCall(VecCreate(PETSC_COMM_SELF, &x));
2143 LibmeshPetscCall(VecSetSizes(x, PETSC_DECIDE, _block_size * _n_gaps));
2144 LibmeshPetscCall(VecSetFromOptions(x));
2145 LibmeshPetscCall(VecDuplicate(x, &r));
2146
2147#if PETSC_VERSION_LESS_THAN(3, 13, 0)
2148 LibmeshPetscCall(PetscOptionsSetValue(PETSC_NULL, "-snes_mf", PETSC_NULL));
2149#else
2150 LibmeshPetscCall(SNESSetUseMatrixFree(snes, PETSC_FALSE, PETSC_TRUE));
2151#endif
2152 Ctx ctx;
2153 ctx.iblock = iblock;
2154 ctx.schp = this;
2155 LibmeshPetscCall(SNESSetFunction(snes, r, formFunction, &ctx));
2156 LibmeshPetscCall(SNESGetKSP(snes, &ksp));
2157 LibmeshPetscCall(KSPGetPC(ksp, &pc));
2158 LibmeshPetscCall(PCSetType(pc, PCNONE));
2159 LibmeshPetscCall(KSPSetTolerances(ksp, _rtol, _atol, _dtol, _maxit));
2160 LibmeshPetscCall(SNESSetFromOptions(snes));
2161 LibmeshPetscCall(VecGetArray(x, &xx));
2162 for (unsigned int i = 0; i < _block_size * _n_gaps; i++)
2163 {
2164 xx[i] = solution(i);
2165 }
2166 LibmeshPetscCall(VecRestoreArray(x, &xx));
2167
2168 LibmeshPetscCall(SNESSolve(snes, NULL, x));
2169 LibmeshPetscCall(VecGetArray(x, &xx));
2170 for (unsigned int i = 0; i < _block_size * _n_gaps; i++)
2171 root(i) = xx[i];
2172
2173 LibmeshPetscCall(VecRestoreArray(x, &xx));
2174 LibmeshPetscCall(VecDestroy(&x));
2175 LibmeshPetscCall(VecDestroy(&r));
2176 LibmeshPetscCall(SNESDestroy(&snes));
2177 PetscFunctionReturn(LIBMESH_PETSC_SUCCESS);
2178}
const std::vector< double > x
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.
void * ctx

Referenced by SubChannel1PhaseProblem::computeWijFromSolve().

◆ populateDenseFromVector()

template<class T >
PetscErrorCode SubChannel1PhaseProblem::populateDenseFromVector ( const Vec &  x,
T &  solution,
const unsigned int  first_axial_level,
const unsigned int  last_axial_level,
const unsigned int  cross_dimension 
)
protectedinherited

Definition at line 449 of file SubChannel1PhaseProblem.h.

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}

Referenced by SubChannel1PhaseProblem::computeWijPrime(), and SubChannel1PhaseProblem::implicitPetscSolve().

◆ populateSolutionChan()

template<class T >
PetscErrorCode SubChannel1PhaseProblem::populateSolutionChan ( const Vec &  x,
T &  solution,
const unsigned int  first_axial_level,
const unsigned int  last_axial_level,
const unsigned int  cross_dimension 
)
protectedinherited

Definition at line 523 of file SubChannel1PhaseProblem.h.

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}

◆ populateVectorFromDense()

template<class T >
PetscErrorCode SubChannel1PhaseProblem::populateVectorFromDense ( Vec &  x,
const T &  solution,
const unsigned int  first_axial_level,
const unsigned int  last_axial_level,
const unsigned int  cross_dimension 
)
protectedinherited

Definition at line 500 of file SubChannel1PhaseProblem.h.

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}

Referenced by SubChannel1PhaseProblem::computeSumWij(), SubChannel1PhaseProblem::computeWijResidual(), and SubChannel1PhaseProblem::implicitPetscSolve().

◆ populateVectorFromHandle()

template<class T >
PetscErrorCode SubChannel1PhaseProblem::populateVectorFromHandle ( Vec &  x,
const T &  solution,
const unsigned int  first_axial_level,
const unsigned int  last_axial_level,
const unsigned int  cross_dimension 
)
protectedinherited

Definition at line 474 of file SubChannel1PhaseProblem.h.

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}

◆ residualFunction()

libMesh::DenseVector< Real > SubChannel1PhaseProblem::residualFunction ( int  iblock,
libMesh::DenseVector< Real >  solution 
)
protectedinherited

Computes Residual Vector based on the lateral momentum conservation equation for block iblock & updates flow variables based on current crossflow solution.

Definition at line 2088 of file SubChannel1PhaseProblem.C.

2089{
2090 const unsigned int last_node = (iblock + 1) * _block_size;
2091 const unsigned int first_node = iblock * _block_size + 1;
2092 libMesh::DenseVector<Real> Wij_residual_vector(_n_gaps * _block_size, 0.0);
2093 // Assign the solution to the cross-flow matrix
2094 int i = 0;
2095 for (unsigned int iz = first_node; iz < last_node + 1; iz++)
2096 {
2097 for (unsigned int i_gap = 0; i_gap < _n_gaps; i_gap++)
2098 {
2099 _Wij(i_gap, iz) = solution(i);
2100 i++;
2101 }
2102 }
2103
2104 // Calculating sum of crossflows
2105 computeSumWij(iblock);
2106 // Solving axial flux
2107 computeMdot(iblock);
2108 // Calculation of turbulent Crossflow
2109 computeWijPrime(iblock);
2110 // Solving for Pressure Drop
2111 computeDP(iblock);
2112 // Solving for pressure
2113 computeP(iblock);
2114 // Populating lateral crossflow residual matrix
2115 computeWijResidual(iblock);
2116
2117 // Turn the residual matrix into a residual vector
2118 for (unsigned int iz = 0; iz < _block_size; iz++)
2119 {
2120 for (unsigned int i_gap = 0; i_gap < _n_gaps; i_gap++)
2121 {
2122 int i = _n_gaps * iz + i_gap; // column wise transfer
2123 Wij_residual_vector(i) = _Wij_residual_matrix(i_gap, iz);
2124 }
2125 }
2126 return Wij_residual_vector;
2127}

◆ solveAndPopulateEnthalpy()

PetscErrorCode SubChannel1PhaseProblem::solveAndPopulateEnthalpy ( Mat  A,
Vec  rhs,
unsigned int  first_node,
unsigned int  last_node,
const char *  ksp_prefix 
)
protectedinherited

Solve a linear system (A * x = rhs) with a simple PCJACOBI KSP and populate the enthalpy solution into _h_soln for nodes [first_node, last_node].

Uses member tolerances (_rtol, _atol, _dtol, _maxit), mesh (_subchannel_mesh), channel count (_n_channels), and error/solution handles (mooseError, _h_soln).

Parameters
APETSc matrix (operators)
rhsPETSc vector (right-hand side)
first_nodeinclusive start axial node index
last_nodeinclusive end axial node index
ksp_prefixoptions prefix for KSP (e.g. "h_sys_"), may be nullptr

Definition at line 2181 of file SubChannel1PhaseProblem.C.

2183{
2185
2186 // Create solution vector with rhs layout
2187 Vec x = nullptr;
2188 LibmeshPetscCall(VecDuplicate(rhs, &x));
2189
2190 // KSP setup
2191 KSP ksp = nullptr;
2192 PC pc = nullptr;
2193 LibmeshPetscCall(KSPCreate(PETSC_COMM_SELF, &ksp));
2194 LibmeshPetscCall(KSPSetOperators(ksp, A, A));
2195 LibmeshPetscCall(KSPGetPC(ksp, &pc));
2196 LibmeshPetscCall(PCSetType(pc, PCJACOBI));
2197 LibmeshPetscCall(KSPSetTolerances(ksp, _rtol, _atol, _dtol, _maxit));
2198 if (ksp_prefix && *ksp_prefix)
2199 LibmeshPetscCall(KSPSetOptionsPrefix(ksp, ksp_prefix));
2200 LibmeshPetscCall(KSPSetFromOptions(ksp));
2201
2202 // Solve
2203 LibmeshPetscCall(KSPSolve(ksp, rhs, x));
2204 KSPConvergedReason reason;
2205 LibmeshPetscCall(KSPGetConvergedReason(ksp, &reason));
2206 if (reason < 0)
2207 {
2208 PetscInt iterations;
2209 PetscReal residual_norm;
2210 LibmeshPetscCall(KSPGetIterationNumber(ksp, &iterations));
2211 LibmeshPetscCall(KSPGetResidualNorm(ksp, &residual_norm));
2212 mooseError(name(),
2213 ": enthalpy linear solve failed: ",
2214 KSPConvergedReasons[reason],
2215 " (",
2216 static_cast<int>(reason),
2217 ") after ",
2218 iterations,
2219 " iterations; residual norm = ",
2220 residual_norm,
2221 ".");
2222 }
2223
2224 // Scatter to _h_soln with sanity checks
2225 PetscScalar * xx = nullptr;
2226 LibmeshPetscCall(VecGetArray(x, &xx));
2227 for (unsigned int iz = first_node; iz <= last_node; ++iz)
2228 {
2229 const unsigned int iz_ind = iz - first_node;
2230 for (unsigned int i_ch = 0; i_ch < _n_channels; ++i_ch)
2231 {
2232 auto * node_out = _subchannel_mesh.getChannelNode(i_ch, iz);
2233 const PetscScalar h_out = xx[iz_ind * _n_channels + i_ch];
2234 if (h_out < 0.0)
2235 mooseError(
2236 name(), " : Calculation of negative Enthalpy h_out = ", h_out, " Axial Level = ", iz);
2237 _h_soln->set(node_out, h_out);
2238 }
2239 }
2240 LibmeshPetscCall(VecRestoreArray(x, &xx));
2241
2242 // Cleanup
2243 LibmeshPetscCall(KSPDestroy(&ksp));
2244 LibmeshPetscCall(VecDestroy(&x));
2245
2246 PetscFunctionReturn(LIBMESH_PETSC_SUCCESS);
2247}

Referenced by computeh(), and TriSubChannel1PhaseProblem::computeh().

◆ solverSystemConverged()

bool SubChannel1PhaseProblem::solverSystemConverged ( const unsigned int  )
overridevirtualinherited

Reimplemented from ExternalProblem.

Definition at line 557 of file SubChannel1PhaseProblem.C.

558{
559 return _converged;
560}

◆ syncSolutions()

void SubChannel1PhaseProblem::syncSolutions ( Direction  direction)
overridevirtualinherited

Implements ExternalProblem.

Definition at line 3108 of file SubChannel1PhaseProblem.C.

3109{
3110}

◆ validParams()

InputParameters QuadSubChannel1PhaseProblem::validParams ( )
static

Definition at line 18 of file QuadSubChannel1PhaseProblem.C.

19{
22 "Solver class for subchannels in a square lattice assembly and bare fuel pins");
23 return params;
24}
void addClassDescription(const std::string &doc_string)
static InputParameters validParams()

Member Data Documentation

◆ _added_K

PetscScalar SubChannel1PhaseProblem::_added_K = 0.0
protectedinherited

Added resistances for monolithic convergence.

Definition at line 435 of file SubChannel1PhaseProblem.h.

Referenced by SubChannel1PhaseProblem::implicitPetscSolve().

◆ _added_K_old

PetscScalar SubChannel1PhaseProblem::_added_K_old = 1000.0
protectedinherited

◆ _amc_advective_derivative_mat

Mat SubChannel1PhaseProblem::_amc_advective_derivative_mat
protectedinherited

Axial momentum conservation - advective (Eulerian) derivative.

Definition at line 383 of file SubChannel1PhaseProblem.h.

Referenced by SubChannel1PhaseProblem::cleanUp(), SubChannel1PhaseProblem::computeDP(), and SubChannel1PhaseProblem::SubChannel1PhaseProblem().

◆ _amc_advective_derivative_rhs

Vec SubChannel1PhaseProblem::_amc_advective_derivative_rhs
protectedinherited

◆ _amc_cross_derivative_mat

Mat SubChannel1PhaseProblem::_amc_cross_derivative_mat
protectedinherited

Axial momentum conservation - cross flux derivative.

Definition at line 386 of file SubChannel1PhaseProblem.h.

Referenced by SubChannel1PhaseProblem::cleanUp(), SubChannel1PhaseProblem::computeDP(), and SubChannel1PhaseProblem::SubChannel1PhaseProblem().

◆ _amc_cross_derivative_rhs

Vec SubChannel1PhaseProblem::_amc_cross_derivative_rhs
protectedinherited

◆ _amc_friction_force_mat

Mat SubChannel1PhaseProblem::_amc_friction_force_mat
protectedinherited

Axial momentum conservation - friction force.

Definition at line 389 of file SubChannel1PhaseProblem.h.

Referenced by SubChannel1PhaseProblem::cleanUp(), SubChannel1PhaseProblem::computeDP(), and SubChannel1PhaseProblem::SubChannel1PhaseProblem().

◆ _amc_friction_force_rhs

Vec SubChannel1PhaseProblem::_amc_friction_force_rhs
protectedinherited

◆ _amc_gravity_rhs

Vec SubChannel1PhaseProblem::_amc_gravity_rhs
protectedinherited

Axial momentum conservation - buoyancy force No implicit matrix.

Definition at line 393 of file SubChannel1PhaseProblem.h.

Referenced by SubChannel1PhaseProblem::cleanUp(), SubChannel1PhaseProblem::computeDP(), and SubChannel1PhaseProblem::SubChannel1PhaseProblem().

◆ _amc_pressure_force_mat

Mat SubChannel1PhaseProblem::_amc_pressure_force_mat
protectedinherited

◆ _amc_pressure_force_rhs

Vec SubChannel1PhaseProblem::_amc_pressure_force_rhs
protectedinherited

◆ _amc_sys_mdot_mat

Mat SubChannel1PhaseProblem::_amc_sys_mdot_mat
protectedinherited

◆ _amc_sys_mdot_rhs

Vec SubChannel1PhaseProblem::_amc_sys_mdot_rhs
protectedinherited

◆ _amc_time_derivative_mat

Mat SubChannel1PhaseProblem::_amc_time_derivative_mat
protectedinherited

Axial momentum conservation - time derivative.

Definition at line 380 of file SubChannel1PhaseProblem.h.

Referenced by SubChannel1PhaseProblem::cleanUp(), SubChannel1PhaseProblem::computeDP(), and SubChannel1PhaseProblem::SubChannel1PhaseProblem().

◆ _amc_time_derivative_rhs

Vec SubChannel1PhaseProblem::_amc_time_derivative_rhs
protectedinherited

◆ _amc_turbulent_cross_flows_mat

Mat SubChannel1PhaseProblem::_amc_turbulent_cross_flows_mat
protectedinherited

Axial momentum Axial momentum conservation - compute turbulent cross fluxes.

Definition at line 377 of file SubChannel1PhaseProblem.h.

Referenced by SubChannel1PhaseProblem::cleanUp(), SubChannel1PhaseProblem::computeWijPrime(), and SubChannel1PhaseProblem::SubChannel1PhaseProblem().

◆ _amc_turbulent_cross_flows_rhs

Vec SubChannel1PhaseProblem::_amc_turbulent_cross_flows_rhs
protectedinherited

◆ _atol

const PetscReal& SubChannel1PhaseProblem::_atol
protectedinherited

◆ _block_size

unsigned int SubChannel1PhaseProblem::_block_size
protectedinherited

◆ _bulk_Re

Real SubChannel1PhaseProblem::_bulk_Re
protectedinherited

◆ _bulk_V

Real SubChannel1PhaseProblem::_bulk_V
protectedinherited

◆ _cmc_advective_derivative_mat

Mat SubChannel1PhaseProblem::_cmc_advective_derivative_mat
protectedinherited

Cross momentum conservation - advective (Eulerian) derivative.

Definition at line 406 of file SubChannel1PhaseProblem.h.

Referenced by SubChannel1PhaseProblem::cleanUp(), SubChannel1PhaseProblem::computeWijResidual(), and SubChannel1PhaseProblem::SubChannel1PhaseProblem().

◆ _cmc_advective_derivative_rhs

Vec SubChannel1PhaseProblem::_cmc_advective_derivative_rhs
protectedinherited

◆ _cmc_friction_force_mat

Mat SubChannel1PhaseProblem::_cmc_friction_force_mat
protectedinherited

◆ _cmc_friction_force_rhs

Vec SubChannel1PhaseProblem::_cmc_friction_force_rhs
protectedinherited

◆ _cmc_pressure_force_mat

Mat SubChannel1PhaseProblem::_cmc_pressure_force_mat
protectedinherited

◆ _cmc_pressure_force_rhs

Vec SubChannel1PhaseProblem::_cmc_pressure_force_rhs
protectedinherited

◆ _cmc_sys_Wij_mat

Mat SubChannel1PhaseProblem::_cmc_sys_Wij_mat
protectedinherited

◆ _cmc_sys_Wij_rhs

Vec SubChannel1PhaseProblem::_cmc_sys_Wij_rhs
protectedinherited

◆ _cmc_time_derivative_mat

Mat SubChannel1PhaseProblem::_cmc_time_derivative_mat
protectedinherited

Cross momentum Cross momentum conservation - time derivative.

Definition at line 403 of file SubChannel1PhaseProblem.h.

Referenced by SubChannel1PhaseProblem::cleanUp(), SubChannel1PhaseProblem::computeWijResidual(), and SubChannel1PhaseProblem::SubChannel1PhaseProblem().

◆ _cmc_time_derivative_rhs

Vec SubChannel1PhaseProblem::_cmc_time_derivative_rhs
protectedinherited

◆ _compute_density

const bool SubChannel1PhaseProblem::_compute_density
protectedinherited

Flag that activates or deactivates the calculation of density.

Definition at line 219 of file SubChannel1PhaseProblem.h.

Referenced by SubChannel1PhaseProblem::computeMdot(), and SubChannel1PhaseProblem::externalSolve().

◆ _compute_power

const bool SubChannel1PhaseProblem::_compute_power
protectedinherited

Flag that informs if we need to solve the Enthalpy/Temperature equations or not.

Definition at line 223 of file SubChannel1PhaseProblem.h.

Referenced by SubChannel1PhaseProblem::computeMdot(), and SubChannel1PhaseProblem::externalSolve().

◆ _compute_viscosity

const bool SubChannel1PhaseProblem::_compute_viscosity
protectedinherited

Flag that activates or deactivates the calculation of viscosity.

Definition at line 221 of file SubChannel1PhaseProblem.h.

Referenced by SubChannel1PhaseProblem::externalSolve().

◆ _converged

bool SubChannel1PhaseProblem::_converged
protectedinherited

Variable that informs whether we exited external solve with a converged solution or not.

Definition at line 229 of file SubChannel1PhaseProblem.h.

Referenced by SubChannel1PhaseProblem::externalSolve(), SubChannel1PhaseProblem::solverSystemConverged(), and SubChannel1PhaseProblem::SubChannel1PhaseProblem().

◆ _correction_factor

PetscScalar SubChannel1PhaseProblem::_correction_factor = 1.0
protectedinherited

◆ _crossflow_equation_relaxation

const Real& SubChannel1PhaseProblem::_crossflow_equation_relaxation
protectedinherited

Equation relaxation factor for crossflow in the coupled implicit solve.

Definition at line 257 of file SubChannel1PhaseProblem.h.

Referenced by SubChannel1PhaseProblem::implicitPetscSolve().

◆ _crossflow_relaxation

const Real& SubChannel1PhaseProblem::_crossflow_relaxation
protectedinherited

Relaxation factor for crossflow updates in the coupled implicit solve.

Definition at line 263 of file SubChannel1PhaseProblem.h.

Referenced by SubChannel1PhaseProblem::implicitPetscSolve().

◆ _CT

Real SubChannel1PhaseProblem::_CT
protectedinherited

Turbulent modeling parameter used in axial momentum equation.

Definition at line 239 of file SubChannel1PhaseProblem.h.

Referenced by SubChannel1PhaseProblem::computeDP(), and SubChannel1PhaseProblem::initialSetup().

◆ _deformation

bool SubChannel1PhaseProblem::_deformation = false
protectedinherited

Flag that activates the effect of deformation (pin/duct) based on the auxvalues for displacement, Dpin.

Definition at line 286 of file SubChannel1PhaseProblem.h.

Referenced by SubChannel1PhaseProblem::detectDeformation(), initializeSolution(), and TriSubChannel1PhaseProblem::initializeSolution().

◆ _dir_grav

const Real SubChannel1PhaseProblem::_dir_grav
protectedinherited

Definition at line 276 of file SubChannel1PhaseProblem.h.

Referenced by SubChannel1PhaseProblem::computeDP().

◆ _displacement_soln

std::unique_ptr<SolutionHandle> SubChannel1PhaseProblem::_displacement_soln
protectedinherited

◆ _DP

libMesh::DenseMatrix<Real> SubChannel1PhaseProblem::_DP
protectedinherited

◆ _DP_soln

std::unique_ptr<SolutionHandle> SubChannel1PhaseProblem::_DP_soln
protectedinherited

◆ _Dpin_soln

std::unique_ptr<SolutionHandle> SubChannel1PhaseProblem::_Dpin_soln
protectedinherited

◆ _dt

Real SubChannel1PhaseProblem::_dt
protectedinherited

◆ _dtol

const PetscReal& SubChannel1PhaseProblem::_dtol
protectedinherited

◆ _duct_heat_flux_soln

std::unique_ptr<SolutionHandle> SubChannel1PhaseProblem::_duct_heat_flux_soln
protectedinherited

Definition at line 309 of file SubChannel1PhaseProblem.h.

Referenced by SubChannel1PhaseProblem::initialSetup().

◆ _duct_HTC_closure

const SCMHTCClosureBase* SubChannel1PhaseProblem::_duct_HTC_closure
protectedinherited

◆ _duct_mesh_exist

const bool SubChannel1PhaseProblem::_duct_mesh_exist
protectedinherited

◆ _enthalpy_subcycles

const unsigned int& SubChannel1PhaseProblem::_enthalpy_subcycles
protectedinherited

Number of enthalpy, temperature, and property updates performed per flow solve.

Definition at line 251 of file SubChannel1PhaseProblem.h.

Referenced by SubChannel1PhaseProblem::externalSolve().

◆ _ff_soln

std::unique_ptr<SolutionHandle> SubChannel1PhaseProblem::_ff_soln
protectedinherited

◆ _fp

const SinglePhaseFluidProperties* SubChannel1PhaseProblem::_fp
inherited

◆ _friction_args

struct SubChannel1PhaseProblem::FrictionStruct SubChannel1PhaseProblem::_friction_args
inherited

◆ _friction_closure

const SCMFrictionClosureBase* SubChannel1PhaseProblem::_friction_closure
protectedinherited

◆ _g_grav

const Real SubChannel1PhaseProblem::_g_grav
protectedinherited

Definition at line 206 of file SubChannel1PhaseProblem.h.

Referenced by SubChannel1PhaseProblem::computeDP().

◆ _gravity_direction

const MooseEnum SubChannel1PhaseProblem::_gravity_direction
protectedinherited

The direction of gravity.

Definition at line 275 of file SubChannel1PhaseProblem.h.

◆ _h_soln

std::unique_ptr<SolutionHandle> SubChannel1PhaseProblem::_h_soln
protectedinherited

◆ _hc_added_heat_rhs

Vec SubChannel1PhaseProblem::_hc_added_heat_rhs
protectedinherited

◆ _hc_advective_derivative_mat

Mat SubChannel1PhaseProblem::_hc_advective_derivative_mat
protectedinherited

Enthalpy conservation - advective (Eulerian) derivative;.

Definition at line 423 of file SubChannel1PhaseProblem.h.

Referenced by SubChannel1PhaseProblem::cleanUp(), computeh(), TriSubChannel1PhaseProblem::computeh(), and SubChannel1PhaseProblem::SubChannel1PhaseProblem().

◆ _hc_advective_derivative_rhs

Vec SubChannel1PhaseProblem::_hc_advective_derivative_rhs
protectedinherited

◆ _hc_cross_derivative_mat

Mat SubChannel1PhaseProblem::_hc_cross_derivative_mat
protectedinherited

◆ _hc_cross_derivative_rhs

Vec SubChannel1PhaseProblem::_hc_cross_derivative_rhs
protectedinherited

◆ _hc_sys_h_mat

Mat SubChannel1PhaseProblem::_hc_sys_h_mat
protectedinherited

◆ _hc_sys_h_rhs

Vec SubChannel1PhaseProblem::_hc_sys_h_rhs
protectedinherited

◆ _hc_time_derivative_mat

Mat SubChannel1PhaseProblem::_hc_time_derivative_mat
protectedinherited

Enthalpy Enthalpy conservation - time derivative.

Definition at line 420 of file SubChannel1PhaseProblem.h.

Referenced by SubChannel1PhaseProblem::cleanUp(), computeh(), TriSubChannel1PhaseProblem::computeh(), and SubChannel1PhaseProblem::SubChannel1PhaseProblem().

◆ _hc_time_derivative_rhs

Vec SubChannel1PhaseProblem::_hc_time_derivative_rhs
protectedinherited

◆ _HTC_soln

std::unique_ptr<SolutionHandle> SubChannel1PhaseProblem::_HTC_soln
protectedinherited

◆ _implicit_bool

const bool SubChannel1PhaseProblem::_implicit_bool
protectedinherited

◆ _interpolation_scheme

const MooseEnum SubChannel1PhaseProblem::_interpolation_scheme
protectedinherited

The interpolation method used in constructing the systems.

Definition at line 273 of file SubChannel1PhaseProblem.h.

Referenced by SubChannel1PhaseProblem::computeDP(), TriSubChannel1PhaseProblem::computeh(), and SubChannel1PhaseProblem::computeInterpolationCoefficients().

◆ _kij

const Real& SubChannel1PhaseProblem::_kij
protectedinherited

◆ _mass_flow_equation_relaxation

const Real& SubChannel1PhaseProblem::_mass_flow_equation_relaxation
protectedinherited

Equation relaxation factor for mass flow rate in the coupled implicit solve.

Definition at line 253 of file SubChannel1PhaseProblem.h.

Referenced by SubChannel1PhaseProblem::implicitPetscSolve().

◆ _mass_flow_relaxation

const Real& SubChannel1PhaseProblem::_mass_flow_relaxation
protectedinherited

Relaxation factor for mass flow rate updates in the coupled implicit solve.

Definition at line 259 of file SubChannel1PhaseProblem.h.

Referenced by SubChannel1PhaseProblem::implicitPetscSolve().

◆ _max_sumWij

PetscScalar SubChannel1PhaseProblem::_max_sumWij
protectedinherited

◆ _max_sumWij_new

PetscScalar SubChannel1PhaseProblem::_max_sumWij_new
protectedinherited

◆ _maxit

const PetscInt& SubChannel1PhaseProblem::_maxit
protectedinherited

◆ _mc_axial_convection_mat

Mat SubChannel1PhaseProblem::_mc_axial_convection_mat
protectedinherited

◆ _mc_axial_convection_rhs

Vec SubChannel1PhaseProblem::_mc_axial_convection_rhs
protectedinherited

◆ _mc_density_pressure_mat

Mat SubChannel1PhaseProblem::_mc_density_pressure_mat
protectedinherited

◆ _mc_sumWij_mat

Mat SubChannel1PhaseProblem::_mc_sumWij_mat
protectedinherited

Matrices and vectors to be used in implicit assembly Mass conservation Mass conservation - sum of cross fluxes.

Definition at line 365 of file SubChannel1PhaseProblem.h.

Referenced by SubChannel1PhaseProblem::cleanUp(), SubChannel1PhaseProblem::computeSumWij(), SubChannel1PhaseProblem::implicitPetscSolve(), and SubChannel1PhaseProblem::SubChannel1PhaseProblem().

◆ _mdot_soln

std::unique_ptr<SolutionHandle> SubChannel1PhaseProblem::_mdot_soln
protectedinherited

◆ _mixing_closure

const SCMMixingClosureBase* SubChannel1PhaseProblem::_mixing_closure
protectedinherited

◆ _mu_soln

std::unique_ptr<SolutionHandle> SubChannel1PhaseProblem::_mu_soln
protectedinherited

◆ _n_blocks

unsigned int SubChannel1PhaseProblem::_n_blocks
protectedinherited

◆ _n_cells

unsigned int SubChannel1PhaseProblem::_n_cells
protectedinherited

◆ _n_channels

unsigned int SubChannel1PhaseProblem::_n_channels
protectedinherited

◆ _n_gaps

unsigned int SubChannel1PhaseProblem::_n_gaps
protectedinherited

◆ _n_pins

unsigned int SubChannel1PhaseProblem::_n_pins
protectedinherited

◆ _nusselt_args

struct SubChannel1PhaseProblem::NusseltStruct SubChannel1PhaseProblem::_nusselt_args
inherited

◆ _one

Real SubChannel1PhaseProblem::_one
protectedinherited

Definition at line 215 of file SubChannel1PhaseProblem.h.

Referenced by SubChannel1PhaseProblem::externalSolve().

◆ _P_maxit

const int& SubChannel1PhaseProblem::_P_maxit
protectedinherited

Maximum number of pressure iterations; zero selects the solver's existing automatic limit.

Definition at line 243 of file SubChannel1PhaseProblem.h.

Referenced by SubChannel1PhaseProblem::externalSolve().

◆ _P_out

const PostprocessorValue& SubChannel1PhaseProblem::_P_out
inherited

◆ _P_soln

std::unique_ptr<SolutionHandle> SubChannel1PhaseProblem::_P_soln
protectedinherited

◆ _P_tol

const Real& SubChannel1PhaseProblem::_P_tol
protectedinherited

Convergence tolerance for the pressure loop in external solve.

Definition at line 241 of file SubChannel1PhaseProblem.h.

Referenced by SubChannel1PhaseProblem::externalSolve().

◆ _pin_HTC_closure

const SCMHTCClosureBase* SubChannel1PhaseProblem::_pin_HTC_closure
protectedinherited

◆ _pin_mesh_exist

const bool SubChannel1PhaseProblem::_pin_mesh_exist
protectedinherited

◆ _pressure_equation_relaxation

const Real& SubChannel1PhaseProblem::_pressure_equation_relaxation
protectedinherited

Equation relaxation factor for pressure in the coupled implicit solve.

Definition at line 255 of file SubChannel1PhaseProblem.h.

Referenced by SubChannel1PhaseProblem::implicitPetscSolve().

◆ _pressure_fixed_point_error

Real SubChannel1PhaseProblem::_pressure_fixed_point_error = 1.0
protectedinherited

Maximum pressure fixed-point update before solution relaxation over the blocks.

Definition at line 441 of file SubChannel1PhaseProblem.h.

Referenced by SubChannel1PhaseProblem::externalSolve(), and SubChannel1PhaseProblem::implicitPetscSolve().

◆ _pressure_relaxation

const Real& SubChannel1PhaseProblem::_pressure_relaxation
protectedinherited

Relaxation factor for pressure updates in the coupled implicit solve.

Definition at line 261 of file SubChannel1PhaseProblem.h.

Referenced by SubChannel1PhaseProblem::implicitPetscSolve().

◆ _prod

Vec SubChannel1PhaseProblem::_prod
protectedinherited

◆ _prodp

Vec SubChannel1PhaseProblem::_prodp
protectedinherited

◆ _q_prime_soln

std::unique_ptr<SolutionHandle> SubChannel1PhaseProblem::_q_prime_soln
protectedinherited

Definition at line 308 of file SubChannel1PhaseProblem.h.

Referenced by SubChannel1PhaseProblem::initialSetup().

◆ _rho_soln

std::unique_ptr<SolutionHandle> SubChannel1PhaseProblem::_rho_soln
protectedinherited

◆ _rtol

const PetscReal& SubChannel1PhaseProblem::_rtol
protectedinherited

◆ _S_flow_soln

std::unique_ptr<SolutionHandle> SubChannel1PhaseProblem::_S_flow_soln
protectedinherited

◆ _segregated_bool

const bool SubChannel1PhaseProblem::_segregated_bool
protectedinherited

◆ _staggered_pressure_bool

const bool SubChannel1PhaseProblem::_staggered_pressure_bool
protectedinherited

Flag to define the usage of staggered or collocated pressure.

Definition at line 280 of file SubChannel1PhaseProblem.h.

Referenced by SubChannel1PhaseProblem::computeP(), and SubChannel1PhaseProblem::computeWijResidual().

◆ _subchannel_mesh

QuadSubChannelMesh& QuadSubChannel1PhaseProblem::_subchannel_mesh
protected

◆ _SumWij_soln

std::unique_ptr<SolutionHandle> SubChannel1PhaseProblem::_SumWij_soln
protectedinherited

◆ _T_maxit

const int& SubChannel1PhaseProblem::_T_maxit
protectedinherited

Maximum iterations for the inner temperature loop.

Definition at line 247 of file SubChannel1PhaseProblem.h.

Referenced by SubChannel1PhaseProblem::externalSolve().

◆ _T_relaxation

const Real& SubChannel1PhaseProblem::_T_relaxation
protectedinherited

Relaxation factor for temperature updates in the inner thermal-hydraulic iteration.

Definition at line 249 of file SubChannel1PhaseProblem.h.

Referenced by SubChannel1PhaseProblem::computeT().

◆ _T_soln

std::unique_ptr<SolutionHandle> SubChannel1PhaseProblem::_T_soln
protectedinherited

◆ _T_tol

const Real& SubChannel1PhaseProblem::_T_tol
protectedinherited

Convergence tolerance for the temperature loop in internal solve.

Definition at line 245 of file SubChannel1PhaseProblem.h.

Referenced by SubChannel1PhaseProblem::externalSolve().

◆ _Tduct_soln

std::unique_ptr<SolutionHandle> SubChannel1PhaseProblem::_Tduct_soln
protectedinherited

◆ _time_integrator_checked

bool SubChannel1PhaseProblem::_time_integrator_checked = false
protectedinherited

Whether the time integrator has been checked for consistency with the implementation.

Definition at line 235 of file SubChannel1PhaseProblem.h.

Referenced by SubChannel1PhaseProblem::externalSolve().

◆ _Tpin_soln

std::unique_ptr<SolutionHandle> SubChannel1PhaseProblem::_Tpin_soln
protectedinherited

◆ _TR

Real SubChannel1PhaseProblem::_TR
protectedinherited

Flag that activates or deactivates the transient parts of the equations we solve by multiplication.

Definition at line 217 of file SubChannel1PhaseProblem.h.

Referenced by SubChannel1PhaseProblem::computeDP(), computeh(), TriSubChannel1PhaseProblem::computeh(), SubChannel1PhaseProblem::computeMdot(), SubChannel1PhaseProblem::computeWijResidual(), and SubChannel1PhaseProblem::externalSolve().

◆ _verbose_subchannel

const bool SubChannel1PhaseProblem::_verbose_subchannel
protectedinherited

◆ _w_perim_soln

std::unique_ptr<SolutionHandle> SubChannel1PhaseProblem::_w_perim_soln
protectedinherited

◆ _Wij

libMesh::DenseMatrix<Real>& SubChannel1PhaseProblem::_Wij
protectedinherited

◆ _Wij_old

libMesh::DenseMatrix<Real>& SubChannel1PhaseProblem::_Wij_old
protectedinherited

◆ _Wij_residual_matrix

libMesh::DenseMatrix<Real> SubChannel1PhaseProblem::_Wij_residual_matrix
protectedinherited

◆ _Wij_vec

Vec SubChannel1PhaseProblem::_Wij_vec
protectedinherited

◆ _WijPrime

libMesh::DenseMatrix<Real> SubChannel1PhaseProblem::_WijPrime
protectedinherited

◆ _z_grid

std::vector<Real> SubChannel1PhaseProblem::_z_grid
protectedinherited

The documentation for this class was generated from the following files: