https://mooseframework.inl.gov
Public Types | Public Member Functions | Static Public Member Functions | Public Attributes | Static Public Attributes | Protected Member Functions | Protected Attributes | List of all members
TriSubChannel1PhaseProblem Class Referenceabstract

Triangular subchannel solver. More...

#include <TriSubChannel1PhaseProblem.h>

Inheritance diagram for TriSubChannel1PhaseProblem:
[legend]

Public Types

enum  Direction { Direction::TO_EXTERNAL_APP, Direction::FROM_EXTERNAL_APP }
 
enum  CoverageCheckMode {
  CoverageCheckMode::FALSE, CoverageCheckMode::TRUE, CoverageCheckMode::OFF, CoverageCheckMode::ON,
  CoverageCheckMode::SKIP_LIST, CoverageCheckMode::ONLY_LIST
}
 
typedef DataFileName DataFileParameterType
 

Public Member Functions

 TriSubChannel1PhaseProblem (const InputParameters &params)
 
virtual ~TriSubChannel1PhaseProblem ()
 
virtual void externalSolve () override
 
virtual void syncSolutions (Direction direction) override
 
virtual bool solverSystemConverged (const unsigned int) override
 
virtual void initialSetup () override
 
const SCMHTCClosureBasegetDuctHTCClosure () const
 
const SCMHTCClosureBasegetPinHTCClosure () const
 
const SCMFrictionClosureBasegetFrictionClosure () const
 
Real getAddedHeatPin (unsigned int i_ch, unsigned int iz) const
 Return the added heat coming from the fuel pins. More...
 
Real getAddedHeatDuct (unsigned int i_ch, unsigned int iz) const
 Return the added heat coming from the duct. More...
 
const PostprocessorValuegetOutletPressure () const
 Get outlet pressure. More...
 
const SinglePhaseFluidPropertiesgetSinglePhaseFluidProperties () const
 Get fluid properties object. More...
 
virtual void solve (unsigned int nl_sys_num=0) override final
 
virtual void addExternalVariables ()
 
bool initialized () const
 
virtual libMesh::EquationSystemses () override
 
virtual MooseMeshmesh () override
 
virtual const MooseMeshmesh () const override
 
const MooseMeshmesh (bool use_displaced) const override
 
MooseMeshmesh (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::CouplingMatrixcouplingMatrix (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< MooseVariableFEBase *, MooseVariableFEBase *> > & couplingEntries (const THREAD_ID tid, const unsigned int nl_sys_num)
 
std::vector< std::pair< MooseVariableFEBase *, MooseVariableFEBase *> > & nonlocalCouplingEntries (const THREAD_ID tid, const unsigned int nl_sys_num)
 
virtual bool hasVariable (const std::string &var_name) const override
 
bool hasSolverVariable (const std::string &var_name) const
 
virtual const MooseVariableFieldBasegetVariable (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 MooseVariableFieldBasegetVariable (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 MooseVariableFieldBasegetVariable (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)
 
virtual MooseVariableFieldBasegetVariable (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)
 
MooseVariableFieldBasegetActualFieldVariable (const THREAD_ID tid, const std::string &var_name) override
 
virtual MooseVariablegetStandardVariable (const THREAD_ID tid, const std::string &var_name) override
 
virtual VectorMooseVariablegetVectorVariable (const THREAD_ID tid, const std::string &var_name) override
 
virtual ArrayMooseVariablegetArrayVariable (const THREAD_ID tid, const std::string &var_name) override
 
virtual bool hasScalarVariable (const std::string &var_name) const override
 
virtual MooseVariableScalargetScalarVariable (const THREAD_ID tid, const std::string &var_name) override
 
virtual libMesh::SystemgetSystem (const std::string &var_name) override
 
const RestartableEquationSystemsgetRestartableEquationSystems () 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 Assemblyassembly (const THREAD_ID tid, const unsigned int sys_num) override
 
virtual const Assemblyassembly (const THREAD_ID tid, const unsigned int sys_num) const override
 
Moose::Kokkos::AssemblykokkosAssembly ()
 
const Moose::Kokkos::AssemblykokkosAssembly () 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 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 reinitNodes (const std::vector< dof_id_type > &nodes, const THREAD_ID tid) override
 
virtual void reinitNodesNeighbor (const std::vector< dof_id_type > &nodes, 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 Realtime () const
 
virtual RealtimeOld () const
 
virtual inttimeStep () const
 
virtual Realdt () const
 
virtual RealdtOld () 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 ()
 
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::PetscOptionsgetPetscOptions ()
 
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 FunctiongetFunction (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)
 
TgetKokkosFunction (const std::string &name)
 
virtual void addMeshDivision (const std::string &type, const std::string &name, InputParameters &params)
 
MeshDivisiongetMeshDivision (const std::string &name, const THREAD_ID tid=0) const
 
virtual void addConvergence (const std::string &type, const std::string &name, InputParameters &parameters)
 
virtual ConvergencegetConvergence (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 ()
 
LineSearchgetLineSearch () override
 
virtual void addDistribution (const std::string &type, const std::string &name, InputParameters &parameters)
 
virtual bool hasDistribution (const std::string &name) const
 
virtual DistributiongetDistribution (const std::string &name)
 
virtual void addSampler (const std::string &type, const std::string &name, InputParameters &parameters)
 
virtual SamplergetSampler (const std::string &name, const THREAD_ID tid=0)
 
NonlinearSystemBasegetNonlinearSystemBase (const unsigned int sys_num)
 
const NonlinearSystemBasegetNonlinearSystemBase (const unsigned int sys_num) const
 
void setCurrentNonlinearSystem (const unsigned int nl_sys_num)
 
NonlinearSystemBasecurrentNonlinearSystem ()
 
const NonlinearSystemBasecurrentNonlinearSystem () const
 
virtual const SystemBasesystemBaseNonlinear (const unsigned int sys_num) const override
 
virtual SystemBasesystemBaseNonlinear (const unsigned int sys_num) override
 
virtual const SystemBasesystemBaseSolver (const unsigned int sys_num) const override
 
virtual SystemBasesystemBaseSolver (const unsigned int sys_num) override
 
virtual const SystemBasesystemBaseAuxiliary () const override
 
virtual SystemBasesystemBaseAuxiliary () override
 
virtual NonlinearSystemgetNonlinearSystem (const unsigned int sys_num)
 
virtual const SystemBasegetSystemBase (const unsigned int sys_num) const
 
virtual SystemBasegetSystemBase (const unsigned int sys_num)
 
SystemBasegetSystemBase (const std::string &sys_name)
 
LinearSystemgetLinearSystem (unsigned int sys_num)
 
const LinearSystemgetLinearSystem (unsigned int sys_num) const
 
SolverSystemgetSolverSystem (unsigned int sys_num)
 
const SolverSystemgetSolverSystem (unsigned int sys_num) const
 
void setCurrentLinearSystem (unsigned int sys_num)
 
LinearSystemcurrentLinearSystem ()
 
const LinearSystemcurrentLinearSystem () const
 
virtual const SystemBasesystemBaseLinear (unsigned int sys_num) const override
 
virtual SystemBasesystemBaseLinear (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 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)
 
AuxiliarySystemgetAuxiliarySystem ()
 
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 ReporterDatagetReporterData () const
 
ReporterDatagetReporterData (ReporterData::WriteKey)
 
virtual std::vector< std::shared_ptr< UserObject > > addUserObject (const std::string &user_object_name, const std::string &name, InputParameters &parameters)
 
TgetUserObject (const std::string &name, unsigned int tid=0) const
 
const UserObjectgetUserObjectBase (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 TgetKokkosUserObject (const std::string &name) const
 
bool hasKokkosUserObject (const std::string &name) const
 
void checkUserObjectNameCollision (const std::string &name, const std::string &type) const
 
const PositionsgetPositionsObject (const std::string &name) const
 
virtual void addFVInterpolationMethod (const std::string &method_type, const std::string &name, InputParameters &parameters)
 
const FVInterpolationMethodgetFVInterpolationMethod (const InterpolationMethodName &name, const THREAD_ID tid=0) const
 
const FVFaceInterpolationMethodgetFVFaceInterpolationMethod (const InterpolationMethodName &name, const THREAD_ID tid=0) const
 
const FVAdvectedInterpolationMethodgetFVAdvectedInterpolationMethod (const InterpolationMethodName &name, const THREAD_ID tid=0) const
 
bool hasFVInterpolationMethod (const InterpolationMethodName &name) const
 
bool hasPostprocessorValueByName (const PostprocessorName &name) const
 
const PostprocessorgetPostprocessorObjectByName (const PostprocessorName &object_name, const THREAD_ID tid=0) const
 
const PostprocessorValuegetPostprocessorValueByName (const PostprocessorName &name, std::size_t t_index=0) const
 
virtual const PostprocessorValuegetPostprocessorValueByName (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 VectorPostprocessorValuegetVectorPostprocessorValueByName (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 VectorPostprocessorgetVectorPostprocessorObjectByName (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< MultiAppgetMultiApp (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)
 
bool execMultiApps (ExecFlagType type, bool auto_advance=true)
 
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)
 
void execTransfers (ExecFlagType type)
 
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 DisplacedProblemgetDisplacedProblem () const
 
virtual std::shared_ptr< DisplacedProblemgetDisplacedProblem ()
 
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 std::unordered_map< std::pair< BoundaryID, BoundaryID >, std::unique_ptr< AutomaticMortarGeneration > > & getMortarInterfaces (bool on_displaced) const
 
virtual void possiblyRebuildGeomSearchPatches ()
 
virtual GeometricSearchDatageomSearchData () override
 
void setRestartFile (const std::string &file_name)
 
const MaterialPropertyRegistrygetMaterialPropertyRegistry () const
 
const InitialConditionWarehousegetInitialConditionWarehouse () const
 
const FVInitialConditionWarehousegetFVInitialConditionWarehouse () const
 
SolverParamssolverParams (unsigned int solver_sys_num=0)
 
const SolverParamssolverParams (unsigned int solver_sys_num=0) const
 
Adaptivityadaptivity ()
 
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< XFEMInterfacegetXFEM ()
 
bool haveXFEM ()
 
virtual bool updateMeshXFEM ()
 
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 MaterialWarehousegetMaterialWarehouse () const
 
const MaterialWarehousegetRegularMaterialsWarehouse () const
 
const MaterialWarehousegetDiscreteMaterialWarehouse () const
 
const MaterialWarehousegetInterfaceMaterialsWarehouse () const
 
const MaterialWarehousegetKokkosMaterialsWarehouse () const
 
std::shared_ptr< MaterialBasegetMaterial (std::string name, Moose::MaterialDataType type, const THREAD_ID tid=0, bool no_warn=false)
 
MaterialDatagetMaterialData (Moose::MaterialDataType type, const THREAD_ID tid=0, const MooseObject *object=nullptr) const
 
MaterialDatagetKokkosMaterialData (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 ExecutorgetExecutor (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
 
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 &)
 
TheWarehousetheWarehouse () 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 haveADObjects () const
 
bool shouldSolve () const
 
const MortarInterfaceWarehousemortarData () const
 
MortarInterfaceWarehousemortarData ()
 
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)
 
bool computingNonlinearResid () const
 
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
 
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)
 
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
 
MooseAppCoordTransformcoordTransform ()
 
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::CouplingMatrixnonlocalCouplingMatrix (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
 
const bool & currentlyComputingResidual () 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 VectorTaggetVectorTag (const TagID tag_id) const
 
std::vector< VectorTaggetVectorTags (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 DiracKernelInfodiracKernelInfo ()
 
void reinitNeighborLowerDElem (const Elem *elem, const THREAD_ID tid=0)
 
void reinitMortarElem (const Elem *elem, const THREAD_ID tid=0)
 
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< SubdomainIDgetMaterialPropertyBlocks (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< BoundaryIDgetMaterialPropertyBoundaryIDs (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 hasScalingVector (const unsigned int nl_sys_num)
 
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
 
bool havePRefinement () const
 
void markFamilyPRefinement (const InputParameters &params)
 
MooseVariableFEBasegetVariableHelper (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 ConsoleStreamconsole () const
 
virtual bool enabled () const
 
std::shared_ptr< MooseObjectgetSharedPtr ()
 
std::shared_ptr< const MooseObjectgetSharedPtr () const
 
bool isKokkosObject () const
 
MooseAppgetMooseApp () 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 InputParametersparameters () const
 
const hit::Node * getHitNode () const
 
bool hasBase () const
 
const std::string & getBase () const
 
const TgetParam (const std::string &name) const
 
std::vector< std::pair< T1, T2 > > getParam (const std::string &param1, const std::string &param2) const
 
const TqueryParam (const std::string &name) const
 
const TgetRenamedParam (const std::string &old_name, const std::string &new_name) const
 
T getCheckedPointerParam (const std::string &name, const std::string &error_string="") const
 
bool haveParameter (const std::string &name) 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
 
PerfGraphperfGraph ()
 
const libMesh::ConstElemRangegetEvaluableElementRange ()
 
const libMesh::ConstElemRangegetEvaluableElementRange ()
 
const libMesh::ConstElemRangegetNonlinearEvaluableElementRange ()
 
const libMesh::ConstElemRangegetNonlinearEvaluableElementRange ()
 
const libMesh::ConstElemRangegetCurrentAlgebraicElementRange ()
 
const libMesh::ConstElemRangegetCurrentAlgebraicElementRange ()
 
const libMesh::ConstNodeRangegetCurrentAlgebraicNodeRange ()
 
const libMesh::ConstNodeRangegetCurrentAlgebraicNodeRange ()
 
const ConstBndNodeRangegetCurrentAlgebraicBndNodeRange ()
 
const ConstBndNodeRangegetCurrentAlgebraicBndNodeRange ()
 
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::SystemgetKokkosSystem (const unsigned int sys_num)
 
const Moose::Kokkos::SystemgetKokkosSystem (const unsigned int sys_num) const
 
Moose::Kokkos::SystemgetKokkosSystem (const unsigned int sys_num)
 
const Moose::Kokkos::SystemgetKokkosSystem (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 AutomaticMortarGenerationgetMortarInterface (const std::pair< BoundaryID, BoundaryID > &primary_secondary_boundary_pair, const std::pair< SubdomainID, SubdomainID > &primary_secondary_subdomain_pair, bool on_displaced) const
 
AutomaticMortarGenerationgetMortarInterface (const std::pair< BoundaryID, BoundaryID > &primary_secondary_boundary_pair, const std::pair< SubdomainID, SubdomainID > &primary_secondary_subdomain_pair, bool on_displaced)
 
const AutomaticMortarGenerationgetMortarInterface (const std::pair< BoundaryID, BoundaryID > &primary_secondary_boundary_pair, const std::pair< SubdomainID, SubdomainID > &primary_secondary_subdomain_pair, bool on_displaced) const
 
AutomaticMortarGenerationgetMortarInterface (const std::pair< BoundaryID, BoundaryID > &primary_secondary_boundary_pair, const std::pair< SubdomainID, SubdomainID > &primary_secondary_subdomain_pair, bool on_displaced)
 
const MaterialPropertyStoragegetMaterialPropertyStorage ()
 
const MaterialPropertyStoragegetMaterialPropertyStorage ()
 
const MaterialPropertyStoragegetBndMaterialPropertyStorage ()
 
const MaterialPropertyStoragegetBndMaterialPropertyStorage ()
 
const MaterialPropertyStoragegetNeighborMaterialPropertyStorage ()
 
const MaterialPropertyStoragegetNeighborMaterialPropertyStorage ()
 
Moose::Kokkos::MaterialPropertyStoragegetKokkosMaterialPropertyStorage ()
 
Moose::Kokkos::MaterialPropertyStoragegetKokkosMaterialPropertyStorage ()
 
Moose::Kokkos::MaterialPropertyStoragegetKokkosBndMaterialPropertyStorage ()
 
Moose::Kokkos::MaterialPropertyStoragegetKokkosBndMaterialPropertyStorage ()
 
Moose::Kokkos::MaterialPropertyStoragegetKokkosNeighborMaterialPropertyStorage ()
 
Moose::Kokkos::MaterialPropertyStoragegetKokkosNeighborMaterialPropertyStorage ()
 
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 ExecFlagTypegetCurrentExecuteOnFlag () const
 
const ExecFlagTypegetCurrentExecuteOnFlag () 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 PostprocessorValuegetPostprocessorValue (const std::string &param_name, const unsigned int index=0) const
 
const PostprocessorValuegetPostprocessorValue (const std::string &param_name, const unsigned int index=0) const
 
const PostprocessorValuegetPostprocessorValueOld (const std::string &param_name, const unsigned int index=0) const
 
const PostprocessorValuegetPostprocessorValueOld (const std::string &param_name, const unsigned int index=0) const
 
const PostprocessorValuegetPostprocessorValueOlder (const std::string &param_name, const unsigned int index=0) const
 
const PostprocessorValuegetPostprocessorValueOlder (const std::string &param_name, const unsigned int index=0) const
 
const PostprocessorValuegetPostprocessorValueOldByName (const PostprocessorName &name) const
 
const PostprocessorValuegetPostprocessorValueOldByName (const PostprocessorName &name) const
 
const PostprocessorValuegetPostprocessorValueOlderByName (const PostprocessorName &name) const
 
const PostprocessorValuegetPostprocessorValueOlderByName (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. More...
 
const SinglePhaseFluidProperties_fp
 Non-owning pointer to fluid properties user object. More...
 
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. More...
 
virtual Real computeAddedHeatPin (unsigned int i_ch, unsigned int iz) const override
 Pure virtual: daughters provide different implementations. More...
 
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. More...
 
virtual void computeh (int iblock) override
 Computes Enthalpy per channel for block iblock. More...
 
PetscErrorCode cleanUp ()
 
virtual Real computeAddedHeatDuct (unsigned int i_ch, unsigned int iz) const
 Non-pure: implemented in the base (or override in a child if needed) More...
 
void computeWijFromSolve (int iblock)
 Computes diversion crossflow per gap for block iblock. More...
 
void computeSumWij (int iblock)
 Computes net diversion crossflow per channel for block iblock. More...
 
void computeMdot (int iblock)
 Computes mass flow per channel for block iblock. More...
 
void computeWijPrime (int iblock)
 Computes turbulent crossflow per gap for block iblock. More...
 
Real computeMixingParameter (unsigned int i_gap, unsigned int iz) const
 Computes and validates the turbulent mixing parameter. More...
 
Real computeSweepFlowMixingParameter (unsigned int i_gap, unsigned int iz) const
 Computes and validates the sweep-flow mixing parameter. More...
 
void computeDP (int iblock)
 Computes Pressure Drop per channel for block iblock. More...
 
void computeP (int iblock)
 Computes Pressure per channel for block iblock. More...
 
void computeT (int iblock)
 Computes Temperature per channel for block iblock. More...
 
void computeRho (int iblock)
 Computes Density per channel for block iblock. More...
 
void computeMu (int iblock)
 Computes Viscosity per channel for block iblock. More...
 
void computeWijResidual (int iblock)
 Computes Residual Matrix based on the lateral momentum conservation equation for block iblock. More...
 
libMesh::DenseVector< RealresidualFunction (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. More...
 
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. More...
 
PetscErrorCode implicitPetscSolve (int iblock)
 Computes implicit solve using PetSc. More...
 
void detectDeformation ()
 Detects whether pin diameter or duct displacement fields require geometry recalculation. More...
 
PetscScalar computeInterpolationCoefficients (PetscScalar Peclet=0.0)
 Functions that computes the interpolation scheme given the Peclet number. More...
 
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 More...
 
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]. More...
 
PetscErrorCode createPetscVector (Vec &v, PetscInt n)
 Petsc Functions. More...
 
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 ()
 
MooseVariableFieldBasegetVariableHelper (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 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
 
TdeclareRestartableData (const std::string &data_name, Args &&... args)
 
ManagedValue< TdeclareManagedRestartableDataWithContext (const std::string &data_name, void *context, Args &&... args)
 
const TgetRestartableData (const std::string &data_name) const
 
TdeclareRestartableDataWithContext (const std::string &data_name, void *context, Args &&... args)
 
TdeclareRecoverableData (const std::string &data_name, Args &&... args)
 
TdeclareRestartableDataWithObjectName (const std::string &data_name, const std::string &object_name, Args &&... args)
 
TdeclareRestartableDataWithObjectNameWithContext (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

TriSubChannelMesh_tri_sch_mesh
 
Mat _hc_axial_heat_conduction_mat
 
Vec _hc_axial_heat_conduction_rhs
 
Mat _hc_radial_heat_conduction_mat
 
Vec _hc_radial_heat_conduction_rhs
 
Mat _hc_sweep_enthalpy_mat
 
Vec _hc_sweep_enthalpy_rhs
 
SubChannelMesh_subchannel_mesh
 
unsigned int _n_blocks
 number of axial blocks More...
 
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 More...
 
Real _one
 
Real _TR
 Flag that activates or deactivates the transient parts of the equations we solve by multiplication. More...
 
const bool _compute_density
 Flag that activates or deactivates the calculation of density. More...
 
const bool _compute_viscosity
 Flag that activates or deactivates the calculation of viscosity. More...
 
const bool _compute_power
 Flag that informs if we need to solve the Enthalpy/Temperature equations or not. More...
 
const bool _pin_mesh_exist
 Flag that informs if there is a pin mesh or not. More...
 
const bool _duct_mesh_exist
 Flag that informs if there is a duct mesh or not. More...
 
bool _converged
 Variable that informs whether we exited external solve with a converged solution or not. More...
 
bool _time_integrator_checked = false
 Whether the time integrator has been checked for consistency with the implementation. More...
 
Real _dt
 Time step. More...
 
Real _CT
 Turbulent modeling parameter used in axial momentum equation. More...
 
const Real_P_tol
 Convergence tolerance for the pressure loop in external solve. More...
 
const Real_T_tol
 Convergence tolerance for the temperature loop in internal solve. More...
 
const int_T_maxit
 Maximum iterations for the inner temperature loop. More...
 
const PetscReal & _rtol
 The relative convergence tolerance, (relative decrease) for the ksp linear solver. More...
 
const PetscReal & _atol
 The absolute convergence tolerance for the ksp linear solver. More...
 
const PetscReal & _dtol
 The divergence tolerance for the ksp linear solver. More...
 
const PetscInt & _maxit
 The maximum number of iterations to use for the ksp linear solver. More...
 
const MooseEnum _interpolation_scheme
 The interpolation method used in constructing the systems. More...
 
const MooseEnum _gravity_direction
 The direction of gravity. More...
 
const Real _dir_grav
 
const bool _implicit_bool
 Flag to define the usage of a implicit or explicit solution. More...
 
const bool _staggered_pressure_bool
 Flag to define the usage of staggered or collocated pressure. More...
 
const bool _segregated_bool
 Segregated solve. More...
 
const bool _verbose_subchannel
 Boolean to printout information related to subchannel solve. More...
 
bool _deformation = false
 Flag that activates the effect of deformation (pin/duct) based on the auxvalues for displacement, Dpin. More...
 
const SCMFrictionClosureBase_friction_closure
 Friction closure object. More...
 
const SCMMixingClosureBase_mixing_closure
 Turbulent Mixing closure object. More...
 
const SCMHTCClosureBase_pin_HTC_closure
 HTC closure objects. More...
 
const SCMHTCClosureBase_duct_HTC_closure
 
std::unique_ptr< SolutionHandle_mdot_soln
 Solutions handles and link to TH tables properties. More...
 
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. More...
 
Vec _Wij_vec
 
Vec _prod
 
Vec _prodp
 
Mat _mc_axial_convection_mat
 Mass conservation - axial convection. More...
 
Vec _mc_axial_convection_rhs
 
Mat _amc_turbulent_cross_flows_mat
 Mass conservation - density time derivative No implicit matrix. More...
 
Vec _amc_turbulent_cross_flows_rhs
 
Mat _amc_time_derivative_mat
 Axial momentum conservation - time derivative. More...
 
Vec _amc_time_derivative_rhs
 
Mat _amc_advective_derivative_mat
 Axial momentum conservation - advective (Eulerian) derivative. More...
 
Vec _amc_advective_derivative_rhs
 
Mat _amc_cross_derivative_mat
 Axial momentum conservation - cross flux derivative. More...
 
Vec _amc_cross_derivative_rhs
 
Mat _amc_friction_force_mat
 Axial momentum conservation - friction force. More...
 
Vec _amc_friction_force_rhs
 
Vec _amc_gravity_rhs
 Axial momentum conservation - buoyancy force No implicit matrix. More...
 
Mat _amc_pressure_force_mat
 Axial momentum conservation - pressure force. More...
 
Vec _amc_pressure_force_rhs
 
Mat _amc_sys_mdot_mat
 Axial momentum system matrix. More...
 
Vec _amc_sys_mdot_rhs
 
Mat _cmc_time_derivative_mat
 Cross momentum Cross momentum conservation - time derivative. More...
 
Vec _cmc_time_derivative_rhs
 
Mat _cmc_advective_derivative_mat
 Cross momentum conservation - advective (Eulerian) derivative. More...
 
Vec _cmc_advective_derivative_rhs
 
Mat _cmc_friction_force_mat
 Cross momentum conservation - friction force. More...
 
Vec _cmc_friction_force_rhs
 
Mat _cmc_pressure_force_mat
 Cross momentum conservation - pressure force. More...
 
Vec _cmc_pressure_force_rhs
 
Mat _cmc_sys_Wij_mat
 Lateral momentum system matrix. More...
 
Vec _cmc_sys_Wij_rhs
 
Mat _hc_time_derivative_mat
 Enthalpy Enthalpy conservation - time derivative. More...
 
Vec _hc_time_derivative_rhs
 
Mat _hc_advective_derivative_mat
 Enthalpy conservation - advective (Eulerian) derivative;. More...
 
Vec _hc_advective_derivative_rhs
 
Mat _hc_cross_derivative_mat
 Enthalpy conservation - cross flux derivative. More...
 
Vec _hc_cross_derivative_rhs
 
Vec _hc_added_heat_rhs
 Enthalpy conservation - source and sink. More...
 
Mat _hc_sys_h_mat
 System matrices. More...
 
Vec _hc_sys_h_rhs
 
PetscScalar _added_K = 0.0
 Added resistances for monolithic convergence. More...
 
PetscScalar _added_K_old = 1000.0
 
PetscScalar _max_sumWij
 
PetscScalar _max_sumWij_new
 
PetscScalar _correction_factor = 1.0
 
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
 
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
 
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
 
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
 
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
 
CoverageCheckMode _material_coverage_check
 
std::vector< SubdomainName > _material_coverage_blocks
 
bool _fv_bcs_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
 

Detailed Description

Triangular subchannel solver.

Definition at line 19 of file TriSubChannel1PhaseProblem.h.

Constructor & Destructor Documentation

◆ TriSubChannel1PhaseProblem()

TriSubChannel1PhaseProblem::TriSubChannel1PhaseProblem ( const InputParameters params)

Definition at line 31 of file TriSubChannel1PhaseProblem.C.

32  : SubChannel1PhaseProblem(params),
33  _tri_sch_mesh(SCM::getMesh<TriSubChannelMesh>(_subchannel_mesh))
34 {
35  // Initializing heat conduction system
36  LibmeshPetscCall(createPetscMatrix(
39  LibmeshPetscCall(createPetscMatrix(
42  LibmeshPetscCall(createPetscMatrix(
45 }
PetscErrorCode createPetscVector(Vec &v, PetscInt n)
Petsc Functions.
PetscErrorCode createPetscMatrix(Mat &M, PetscInt n, PetscInt m)
SubChannel1PhaseProblem(const InputParameters &params)

◆ ~TriSubChannel1PhaseProblem()

TriSubChannel1PhaseProblem::~TriSubChannel1PhaseProblem ( )
virtual

Definition at line 47 of file TriSubChannel1PhaseProblem.C.

48 {
49  PetscErrorCode ierr = cleanUp();
50  if (ierr)
51  mooseError(name(), ": Error in memory cleanup");
52 }
const std::string & name() const
void mooseError(Args &&... args) const

Member Function Documentation

◆ cleanUp()

PetscErrorCode TriSubChannel1PhaseProblem::cleanUp ( )
protected

Definition at line 55 of file TriSubChannel1PhaseProblem.C.

Referenced by ~TriSubChannel1PhaseProblem().

56 {
58  // Clean up heat conduction system
59  LibmeshPetscCall(MatDestroy(&_hc_axial_heat_conduction_mat));
60  LibmeshPetscCall(VecDestroy(&_hc_axial_heat_conduction_rhs));
61  LibmeshPetscCall(MatDestroy(&_hc_radial_heat_conduction_mat));
62  LibmeshPetscCall(VecDestroy(&_hc_radial_heat_conduction_rhs));
63  LibmeshPetscCall(MatDestroy(&_hc_sweep_enthalpy_mat));
64  LibmeshPetscCall(VecDestroy(&_hc_sweep_enthalpy_rhs));
65  PetscFunctionReturn(LIBMESH_PETSC_SUCCESS);
66 }
PetscFunctionBegin
PetscFunctionReturn(LIBMESH_PETSC_SUCCESS)

◆ 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 2066 of file SubChannel1PhaseProblem.C.

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

2067 {
2068  mooseAssert(iz > 0, "Trapezoidal rule requires starting at index 1 at least");
2069  if (_duct_mesh_exist)
2070  {
2071  auto subch_type = _subchannel_mesh.getSubchannelType(i_ch);
2072  if (subch_type == EChannelType::EDGE || subch_type == EChannelType::CORNER)
2073  {
2074  auto dz = _z_grid[iz] - _z_grid[iz - 1];
2075  auto * node_in_chan = _subchannel_mesh.getChannelNode(i_ch, iz - 1);
2076  auto * node_out_chan = _subchannel_mesh.getChannelNode(i_ch, iz);
2077  auto * node_in_duct = _subchannel_mesh.getDuctNodeFromChannel(node_in_chan);
2078  auto * node_out_duct = _subchannel_mesh.getDuctNodeFromChannel(node_out_chan);
2079  auto heat_rate_in = (*_duct_heat_flux_soln)(node_in_duct);
2080  auto heat_rate_out = (*_duct_heat_flux_soln)(node_out_duct);
2081  auto width = getSubChannelPeripheralDuctWidth(i_ch);
2082  return 0.5 * (heat_rate_in + heat_rate_out) * dz * width;
2083  }
2084  else
2085  {
2086  return 0.0;
2087  }
2088  }
2089  else
2090  {
2091  return 0.0;
2092  }
2093 }
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.
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
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.
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...

◆ computeAddedHeatPin()

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

Pure virtual: daughters provide different implementations.

Implements SubChannel1PhaseProblem.

Definition at line 262 of file TriSubChannel1PhaseProblem.C.

Referenced by computeh().

263 {
264  if (!_pin_mesh_exist)
265  return 0.0;
266 
267  // Compute axial location of nodes.
268  auto z2 = _z_grid[iz];
269  auto z1 = _z_grid[iz - 1];
270  auto heated_length = _subchannel_mesh.getHeatedLength();
271  auto unheated_length_entry = _subchannel_mesh.getHeatedLengthEntry();
272  if (MooseUtils::absoluteFuzzyGreaterThan(z2, unheated_length_entry) &&
273  MooseUtils::absoluteFuzzyLessThan(z1, unheated_length_entry + heated_length))
274  {
275  // Compute the height of this element.
276  auto dz = z2 - z1;
277  Real factor;
278  auto subch_type = _subchannel_mesh.getSubchannelType(i_ch);
279  switch (subch_type)
280  {
282  factor = 1.0 / 6.0;
283  break;
284  case EChannelType::EDGE:
285  factor = 1.0 / 4.0;
286  break;
288  factor = 1.0 / 6.0;
289  break;
290  default:
291  return 0.0; // handle invalid subch_type if needed
292  }
293  double heat_rate_in = 0.0;
294  double heat_rate_out = 0.0;
295  for (auto i_pin : _subchannel_mesh.getChannelPins(i_ch))
296  {
297  auto * node_in = _subchannel_mesh.getPinNode(i_pin, iz - 1);
298  auto * node_out = _subchannel_mesh.getPinNode(i_pin, iz);
299  heat_rate_out += factor * (*_q_prime_soln)(node_out);
300  heat_rate_in += factor * (*_q_prime_soln)(node_in);
301  }
302  return (heat_rate_in + heat_rate_out) * dz / 2.0;
303  }
304  else
305  return 0.0;
306 }
const bool _pin_mesh_exist
Flag that informs if there is a pin mesh or not.
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 EChannelType getSubchannelType(unsigned int index) const =0
Return the type of the subchannel for given subchannel index.
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.
std::vector< Real > _z_grid
axial location of nodes
virtual const Real & getHeatedLength() const
Return heated length.
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
virtual const Real & getHeatedLengthEntry() const
Return unheated length at entry.

◆ computeDP()

void SubChannel1PhaseProblem::computeDP ( int  iblock)
protectedinherited

Computes Pressure Drop per channel for block iblock.

Upwind local form loss

Upwind local form loss

Time derivative term

Advective derivative term

Cross derivative term

Friction term

Upwind local form loss

Gravity force

Assembling system

Definition at line 676 of file SubChannel1PhaseProblem.C.

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

677 {
678  const unsigned int last_node = (iblock + 1) * _block_size;
679  const unsigned int first_node = iblock * _block_size + 1;
680  if (!_implicit_bool)
681  {
682  for (unsigned int iz = first_node; iz < last_node + 1; iz++)
683  {
684  auto k_grid = _subchannel_mesh.getKGrid();
685  auto dz = _z_grid[iz] - _z_grid[iz - 1];
686  for (unsigned int i_ch = 0; i_ch < _n_channels; i_ch++)
687  {
688  auto * node_in = _subchannel_mesh.getChannelNode(i_ch, iz - 1);
689  auto * node_out = _subchannel_mesh.getChannelNode(i_ch, iz);
690  auto rho_in = (*_rho_soln)(node_in);
691  auto rho_out = (*_rho_soln)(node_out);
692  auto mu_in = (*_mu_soln)(node_in);
693  auto S = (*_S_flow_soln)(node_in);
694  auto w_perim = (*_w_perim_soln)(node_in);
695  // hydraulic diameter in the i direction
696  auto Dh_i = 4.0 * S / w_perim;
697  auto time_term = _TR * ((*_mdot_soln)(node_out)-_mdot_soln->old(node_out)) * dz / _dt -
698  dz * 2.0 * (*_mdot_soln)(node_out) * (rho_out - _rho_soln->old(node_out)) /
699  rho_in / _dt;
700  auto mass_term1 =
701  Utility::pow<2>((*_mdot_soln)(node_out)) * (1.0 / S / rho_out - 1.0 / S / rho_in);
702  auto mass_term2 = -2.0 * (*_mdot_soln)(node_out) * (*_SumWij_soln)(node_out) / S / rho_in;
703  auto crossflow_term = 0.0;
704  auto turbulent_term = 0.0;
705  unsigned int counter = 0;
706  for (auto i_gap : _subchannel_mesh.getChannelGaps(i_ch))
707  {
708  auto chans = _subchannel_mesh.getGapChannels(i_gap);
709  unsigned int ii_ch = chans.first;
710  unsigned int jj_ch = chans.second;
711  auto * node_in_i = _subchannel_mesh.getChannelNode(ii_ch, iz - 1);
712  auto * node_in_j = _subchannel_mesh.getChannelNode(jj_ch, iz - 1);
713  auto * node_out_i = _subchannel_mesh.getChannelNode(ii_ch, iz);
714  auto * node_out_j = _subchannel_mesh.getChannelNode(jj_ch, iz);
715  auto rho_i = (*_rho_soln)(node_in_i);
716  auto rho_j = (*_rho_soln)(node_in_j);
717  auto Si = (*_S_flow_soln)(node_in_i);
718  auto Sj = (*_S_flow_soln)(node_in_j);
719  Real u_star = 0.0;
720  // figure out donor axial velocity
721  if (_Wij(i_gap, iz) > 0.0)
722  u_star = (*_mdot_soln)(node_out_i) / Si / rho_i;
723  else
724  u_star = (*_mdot_soln)(node_out_j) / Sj / rho_j;
725 
726  crossflow_term +=
727  _subchannel_mesh.getCrossflowSign(i_ch, counter) * _Wij(i_gap, iz) * u_star;
728 
729  turbulent_term += _WijPrime(i_gap, iz) * (2 * (*_mdot_soln)(node_out) / rho_in / S -
730  (*_mdot_soln)(node_out_j) / Sj / rho_j -
731  (*_mdot_soln)(node_out_i) / Si / rho_i);
732  counter++;
733  }
734  turbulent_term *= _CT;
735  auto Re = (((*_mdot_soln)(node_in) / S) * Dh_i / mu_in);
736  _friction_args = FrictionStruct(i_ch, Re, S, w_perim);
738  if (_ff_soln)
739  _ff_soln->set(node_out, ff);
741  auto ki = 0.0;
742  if ((*_mdot_soln)(node_out) >= 0)
743  ki = k_grid[i_ch][iz - 1];
744  else
745  ki = k_grid[i_ch][iz];
746  auto friction_term = (ff * dz / Dh_i + ki) * 0.5 *
747  (*_mdot_soln)(node_out)*std::abs((*_mdot_soln)(node_out)) /
748  (S * (*_rho_soln)(node_out));
749  auto gravity_term = _dir_grav * _g_grav * (*_rho_soln)(node_out)*dz * S;
750  auto DP = (1 / S) * (time_term + mass_term1 + mass_term2 + crossflow_term + turbulent_term +
751  friction_term + gravity_term); // Pa
752  _DP(i_ch, iz) = DP;
753  if (_DP_soln)
754  _DP_soln->set(node_out, DP);
755  }
756  }
757  }
758  else
759  {
760  LibmeshPetscCall(MatZeroEntries(_amc_time_derivative_mat));
761  LibmeshPetscCall(MatZeroEntries(_amc_advective_derivative_mat));
762  LibmeshPetscCall(MatZeroEntries(_amc_cross_derivative_mat));
763  LibmeshPetscCall(MatZeroEntries(_amc_friction_force_mat));
764  LibmeshPetscCall(VecZeroEntries(_amc_time_derivative_rhs));
765  LibmeshPetscCall(VecZeroEntries(_amc_advective_derivative_rhs));
766  LibmeshPetscCall(VecZeroEntries(_amc_cross_derivative_rhs));
767  LibmeshPetscCall(VecZeroEntries(_amc_friction_force_rhs));
768  LibmeshPetscCall(VecZeroEntries(_amc_gravity_rhs));
769  LibmeshPetscCall(MatZeroEntries(_amc_sys_mdot_mat));
770  LibmeshPetscCall(VecZeroEntries(_amc_sys_mdot_rhs));
771  for (unsigned int iz = first_node; iz < last_node + 1; iz++)
772  {
773  auto k_grid = _subchannel_mesh.getKGrid();
774  auto dz = _z_grid[iz] - _z_grid[iz - 1];
775  auto iz_ind = iz - first_node;
776  for (unsigned int i_ch = 0; i_ch < _n_channels; i_ch++)
777  {
778  // inlet and outlet nodes
779  auto * node_in = _subchannel_mesh.getChannelNode(i_ch, iz - 1);
780  auto * node_out = _subchannel_mesh.getChannelNode(i_ch, iz);
781 
782  // interpolation weight coefficient
783  PetscScalar Pe = 0.5;
784  if (_interpolation_scheme == 3)
785  {
786  // Compute the Peclet number
787  auto S_in = (*_S_flow_soln)(node_in);
788  auto S_out = (*_S_flow_soln)(node_out);
789  auto S_interp = computeInterpolatedValue(S_out, S_in, 0.5);
790  auto w_perim_in = (*_w_perim_soln)(node_in);
791  auto w_perim_out = (*_w_perim_soln)(node_out);
792  auto w_perim_interp = this->computeInterpolatedValue(w_perim_out, w_perim_in, 0.5);
793  auto mdot_loc =
794  this->computeInterpolatedValue((*_mdot_soln)(node_out), (*_mdot_soln)(node_in), 0.5);
795  auto mu_in = (*_mu_soln)(node_in);
796  auto mu_out = (*_mu_soln)(node_out);
797  auto mu_interp = this->computeInterpolatedValue(mu_out, mu_in, 0.5);
798  auto Dh_i = 4.0 * S_interp / w_perim_interp;
799  // Compute friction factor
800  auto Re = ((mdot_loc / S_interp) * Dh_i / mu_interp);
801  _friction_args = FrictionStruct(i_ch, Re, S_interp, w_perim_interp);
803  if (_ff_soln)
804  _ff_soln->set(node_out, ff);
806  auto ki = 0.0;
807  if ((*_mdot_soln)(node_out) >= 0)
808  ki = k_grid[i_ch][iz - 1];
809  else
810  ki = k_grid[i_ch][iz];
811  Pe = 1.0 / ((ff * dz / Dh_i + ki) * 0.5) * mdot_loc / std::abs(mdot_loc);
812  }
814 
815  // inlet, outlet, and interpolated density
816  auto rho_in = (*_rho_soln)(node_in);
817  auto rho_out = (*_rho_soln)(node_out);
818  auto rho_interp = computeInterpolatedValue(rho_out, rho_in, Pe);
819 
820  // inlet, outlet, and interpolated viscosity
821  auto mu_in = (*_mu_soln)(node_in);
822  auto mu_out = (*_mu_soln)(node_out);
823  auto mu_interp = computeInterpolatedValue(mu_out, mu_in, Pe);
824 
825  // inlet, outlet, and interpolated axial surface area
826  auto S_in = (*_S_flow_soln)(node_in);
827  auto S_out = (*_S_flow_soln)(node_out);
828  auto S_interp = computeInterpolatedValue(S_out, S_in, Pe);
829 
830  // inlet, outlet, and interpolated wetted perimeter
831  auto w_perim_in = (*_w_perim_soln)(node_in);
832  auto w_perim_out = (*_w_perim_soln)(node_out);
833  auto w_perim_interp = computeInterpolatedValue(w_perim_out, w_perim_in, Pe);
834 
835  // hydraulic diameter in the i direction
836  auto Dh_i = 4.0 * S_interp / w_perim_interp;
837 
839  if (iz == first_node)
840  {
841  PetscScalar value_vec_tt = -1.0 * _TR * alpha * (*_mdot_soln)(node_in)*dz / _dt;
842  PetscInt row_vec_tt = i_ch + _n_channels * iz_ind;
843  LibmeshPetscCall(
844  VecSetValues(_amc_time_derivative_rhs, 1, &row_vec_tt, &value_vec_tt, ADD_VALUES));
845  }
846  else
847  {
848  PetscInt row_tt = i_ch + _n_channels * iz_ind;
849  PetscInt col_tt = i_ch + _n_channels * (iz_ind - 1);
850  PetscScalar value_tt = _TR * alpha * dz / _dt;
851  LibmeshPetscCall(MatSetValues(
852  _amc_time_derivative_mat, 1, &row_tt, 1, &col_tt, &value_tt, INSERT_VALUES));
853  }
854 
855  // Adding diagonal elements
856  PetscInt row_tt = i_ch + _n_channels * iz_ind;
857  PetscInt col_tt = i_ch + _n_channels * iz_ind;
858  PetscScalar value_tt = _TR * (1.0 - alpha) * dz / _dt;
859  LibmeshPetscCall(MatSetValues(
860  _amc_time_derivative_mat, 1, &row_tt, 1, &col_tt, &value_tt, INSERT_VALUES));
861 
862  // Adding RHS elements
863  PetscScalar mdot_old_interp =
864  computeInterpolatedValue(_mdot_soln->old(node_out), _mdot_soln->old(node_in), Pe);
865  PetscScalar value_vec_tt = _TR * mdot_old_interp * dz / _dt;
866  PetscInt row_vec_tt = i_ch + _n_channels * iz_ind;
867  LibmeshPetscCall(
868  VecSetValues(_amc_time_derivative_rhs, 1, &row_vec_tt, &value_vec_tt, ADD_VALUES));
869 
871  if (iz == first_node)
872  {
873  PetscScalar value_vec_at = Utility::pow<2>((*_mdot_soln)(node_in)) / (S_in * rho_in);
874  PetscInt row_vec_at = i_ch + _n_channels * iz_ind;
875  LibmeshPetscCall(VecSetValues(
876  _amc_advective_derivative_rhs, 1, &row_vec_at, &value_vec_at, ADD_VALUES));
877  }
878  else
879  {
880  PetscInt row_at = i_ch + _n_channels * iz_ind;
881  PetscInt col_at = i_ch + _n_channels * (iz_ind - 1);
882  PetscScalar value_at = -1.0 * std::abs((*_mdot_soln)(node_in)) / (S_in * rho_in);
883  LibmeshPetscCall(MatSetValues(
884  _amc_advective_derivative_mat, 1, &row_at, 1, &col_at, &value_at, INSERT_VALUES));
885  }
886 
887  // Adding diagonal elements
888  PetscInt row_at = i_ch + _n_channels * iz_ind;
889  PetscInt col_at = i_ch + _n_channels * iz_ind;
890  PetscScalar value_at = std::abs((*_mdot_soln)(node_out)) / (S_out * rho_out);
891  LibmeshPetscCall(MatSetValues(
892  _amc_advective_derivative_mat, 1, &row_at, 1, &col_at, &value_at, INSERT_VALUES));
893 
895  unsigned int counter = 0;
896  unsigned int cross_index = iz; // iz-1;
897  for (auto i_gap : _subchannel_mesh.getChannelGaps(i_ch))
898  {
899  auto chans = _subchannel_mesh.getGapChannels(i_gap);
900  unsigned int ii_ch = chans.first;
901  unsigned int jj_ch = chans.second;
902  auto * node_in_i = _subchannel_mesh.getChannelNode(ii_ch, iz - 1);
903  auto * node_in_j = _subchannel_mesh.getChannelNode(jj_ch, iz - 1);
904  auto * node_out_i = _subchannel_mesh.getChannelNode(ii_ch, iz);
905  auto * node_out_j = _subchannel_mesh.getChannelNode(jj_ch, iz);
906  auto rho_i =
907  computeInterpolatedValue((*_rho_soln)(node_out_i), (*_rho_soln)(node_in_i), Pe);
908  auto rho_j =
909  computeInterpolatedValue((*_rho_soln)(node_out_j), (*_rho_soln)(node_in_j), Pe);
910  auto S_i =
911  computeInterpolatedValue((*_S_flow_soln)(node_out_i), (*_S_flow_soln)(node_in_i), Pe);
912  auto S_j =
913  computeInterpolatedValue((*_S_flow_soln)(node_out_j), (*_S_flow_soln)(node_in_j), Pe);
914  auto u_star = 0.0;
915  // figure out donor axial velocity
916  if (_Wij(i_gap, cross_index) > 0.0)
917  {
918  if (iz == first_node)
919  {
920  u_star = (*_mdot_soln)(node_in_i) / S_i / rho_i;
921  PetscScalar value_vec_ct = -1.0 * alpha *
922  _subchannel_mesh.getCrossflowSign(i_ch, counter) *
923  _Wij(i_gap, cross_index) * u_star;
924  PetscInt row_vec_ct = i_ch + _n_channels * iz_ind;
925  LibmeshPetscCall(VecSetValues(
926  _amc_cross_derivative_rhs, 1, &row_vec_ct, &value_vec_ct, ADD_VALUES));
927  }
928  else
929  {
930  PetscScalar value_ct = alpha * _subchannel_mesh.getCrossflowSign(i_ch, counter) *
931  _Wij(i_gap, cross_index) / S_i / rho_i;
932  PetscInt row_ct = i_ch + _n_channels * iz_ind;
933  PetscInt col_ct = ii_ch + _n_channels * (iz_ind - 1);
934  LibmeshPetscCall(MatSetValues(
935  _amc_cross_derivative_mat, 1, &row_ct, 1, &col_ct, &value_ct, ADD_VALUES));
936  }
937  PetscScalar value_ct = (1.0 - alpha) *
938  _subchannel_mesh.getCrossflowSign(i_ch, counter) *
939  _Wij(i_gap, cross_index) / S_i / rho_i;
940  PetscInt row_ct = i_ch + _n_channels * iz_ind;
941  PetscInt col_ct = ii_ch + _n_channels * iz_ind;
942  LibmeshPetscCall(MatSetValues(
943  _amc_cross_derivative_mat, 1, &row_ct, 1, &col_ct, &value_ct, ADD_VALUES));
944  }
945  else if (_Wij(i_gap, cross_index) < 0.0) // _Wij=0 operations not necessary
946  {
947  if (iz == first_node)
948  {
949  u_star = (*_mdot_soln)(node_in_j) / S_j / rho_j;
950  PetscScalar value_vec_ct = -1.0 * alpha *
951  _subchannel_mesh.getCrossflowSign(i_ch, counter) *
952  _Wij(i_gap, cross_index) * u_star;
953  PetscInt row_vec_ct = i_ch + _n_channels * iz_ind;
954  LibmeshPetscCall(VecSetValues(
955  _amc_cross_derivative_rhs, 1, &row_vec_ct, &value_vec_ct, ADD_VALUES));
956  }
957  else
958  {
959  PetscScalar value_ct = alpha * _subchannel_mesh.getCrossflowSign(i_ch, counter) *
960  _Wij(i_gap, cross_index) / S_j / rho_j;
961  PetscInt row_ct = i_ch + _n_channels * iz_ind;
962  PetscInt col_ct = jj_ch + _n_channels * (iz_ind - 1);
963  LibmeshPetscCall(MatSetValues(
964  _amc_cross_derivative_mat, 1, &row_ct, 1, &col_ct, &value_ct, ADD_VALUES));
965  }
966  PetscScalar value_ct = (1.0 - alpha) *
967  _subchannel_mesh.getCrossflowSign(i_ch, counter) *
968  _Wij(i_gap, cross_index) / S_j / rho_j;
969  PetscInt row_ct = i_ch + _n_channels * iz_ind;
970  PetscInt col_ct = jj_ch + _n_channels * iz_ind;
971  LibmeshPetscCall(MatSetValues(
972  _amc_cross_derivative_mat, 1, &row_ct, 1, &col_ct, &value_ct, ADD_VALUES));
973  }
974 
975  if (iz == first_node)
976  {
977  PetscScalar value_vec_ct = -2.0 * alpha * (*_mdot_soln)(node_in)*_CT *
978  _WijPrime(i_gap, cross_index) / (rho_interp * S_interp);
979  value_vec_ct += alpha * (*_mdot_soln)(node_in_j)*_CT * _WijPrime(i_gap, cross_index) /
980  (rho_j * S_j);
981  value_vec_ct += alpha * (*_mdot_soln)(node_in_i)*_CT * _WijPrime(i_gap, cross_index) /
982  (rho_i * S_i);
983  PetscInt row_vec_ct = i_ch + _n_channels * iz_ind;
984  LibmeshPetscCall(
985  VecSetValues(_amc_cross_derivative_rhs, 1, &row_vec_ct, &value_vec_ct, ADD_VALUES));
986  }
987  else
988  {
989  PetscScalar value_center_ct =
990  2.0 * alpha * _CT * _WijPrime(i_gap, cross_index) / (rho_interp * S_interp);
991  PetscInt row_ct = i_ch + _n_channels * iz_ind;
992  PetscInt col_ct = i_ch + _n_channels * (iz_ind - 1);
993  LibmeshPetscCall(MatSetValues(
994  _amc_cross_derivative_mat, 1, &row_ct, 1, &col_ct, &value_center_ct, ADD_VALUES));
995 
996  PetscScalar value_left_ct =
997  -1.0 * alpha * _CT * _WijPrime(i_gap, cross_index) / (rho_j * S_j);
998  row_ct = i_ch + _n_channels * iz_ind;
999  col_ct = jj_ch + _n_channels * (iz_ind - 1);
1000  LibmeshPetscCall(MatSetValues(
1001  _amc_cross_derivative_mat, 1, &row_ct, 1, &col_ct, &value_left_ct, ADD_VALUES));
1002 
1003  PetscScalar value_right_ct =
1004  -1.0 * alpha * _CT * _WijPrime(i_gap, cross_index) / (rho_i * S_i);
1005  row_ct = i_ch + _n_channels * iz_ind;
1006  col_ct = ii_ch + _n_channels * (iz_ind - 1);
1007  LibmeshPetscCall(MatSetValues(
1008  _amc_cross_derivative_mat, 1, &row_ct, 1, &col_ct, &value_right_ct, ADD_VALUES));
1009  }
1010 
1011  PetscScalar value_center_ct =
1012  2.0 * (1.0 - alpha) * _CT * _WijPrime(i_gap, cross_index) / (rho_interp * S_interp);
1013  PetscInt row_ct = i_ch + _n_channels * iz_ind;
1014  PetscInt col_ct = i_ch + _n_channels * iz_ind;
1015  LibmeshPetscCall(MatSetValues(
1016  _amc_cross_derivative_mat, 1, &row_ct, 1, &col_ct, &value_center_ct, ADD_VALUES));
1017 
1018  PetscScalar value_left_ct =
1019  -1.0 * (1.0 - alpha) * _CT * _WijPrime(i_gap, cross_index) / (rho_j * S_j);
1020  row_ct = i_ch + _n_channels * iz_ind;
1021  col_ct = jj_ch + _n_channels * iz_ind;
1022  LibmeshPetscCall(MatSetValues(
1023  _amc_cross_derivative_mat, 1, &row_ct, 1, &col_ct, &value_left_ct, ADD_VALUES));
1024 
1025  PetscScalar value_right_ct =
1026  -1.0 * (1.0 - alpha) * _CT * _WijPrime(i_gap, cross_index) / (rho_i * S_i);
1027  row_ct = i_ch + _n_channels * iz_ind;
1028  col_ct = ii_ch + _n_channels * iz_ind;
1029  LibmeshPetscCall(MatSetValues(
1030  _amc_cross_derivative_mat, 1, &row_ct, 1, &col_ct, &value_right_ct, ADD_VALUES));
1031  counter++;
1032  }
1033 
1035  PetscScalar mdot_interp =
1036  computeInterpolatedValue((*_mdot_soln)(node_out), (*_mdot_soln)(node_in), Pe);
1037  auto Re = ((mdot_interp / S_interp) * Dh_i / mu_interp);
1038  _friction_args = FrictionStruct(i_ch, Re, S_interp, w_perim_interp);
1040  if (_ff_soln)
1041  _ff_soln->set(node_out, ff);
1043  auto ki = 0.0;
1044  if ((*_mdot_soln)(node_out) >= 0)
1045  ki = k_grid[i_ch][iz - 1];
1046  else
1047  ki = k_grid[i_ch][iz];
1048  auto coef = (ff * dz / Dh_i + ki) * 0.5 * std::abs((*_mdot_soln)(node_out)) /
1049  (S_interp * rho_interp);
1050  if (iz == first_node)
1051  {
1052  PetscScalar value_vec = -1.0 * alpha * coef * (*_mdot_soln)(node_in);
1053  PetscInt row_vec = i_ch + _n_channels * iz_ind;
1054  LibmeshPetscCall(
1055  VecSetValues(_amc_friction_force_rhs, 1, &row_vec, &value_vec, ADD_VALUES));
1056  }
1057  else
1058  {
1059  PetscInt row = i_ch + _n_channels * iz_ind;
1060  PetscInt col = i_ch + _n_channels * (iz_ind - 1);
1061  PetscScalar value = alpha * coef;
1062  LibmeshPetscCall(
1063  MatSetValues(_amc_friction_force_mat, 1, &row, 1, &col, &value, INSERT_VALUES));
1064  }
1065 
1066  // Adding diagonal elements
1067  PetscInt row = i_ch + _n_channels * iz_ind;
1068  PetscInt col = i_ch + _n_channels * iz_ind;
1069  PetscScalar value = (1.0 - alpha) * coef;
1070  LibmeshPetscCall(
1071  MatSetValues(_amc_friction_force_mat, 1, &row, 1, &col, &value, INSERT_VALUES));
1072 
1074  PetscScalar value_vec = _dir_grav * -1.0 * _g_grav * rho_interp * dz * S_interp;
1075  PetscInt row_vec = i_ch + _n_channels * iz_ind;
1076  LibmeshPetscCall(VecSetValues(_amc_gravity_rhs, 1, &row_vec, &value_vec, ADD_VALUES));
1077  }
1078  }
1080  LibmeshPetscCall(MatZeroEntries(_amc_sys_mdot_mat));
1081  LibmeshPetscCall(VecZeroEntries(_amc_sys_mdot_rhs));
1082  LibmeshPetscCall(MatAssemblyBegin(_amc_time_derivative_mat, MAT_FINAL_ASSEMBLY));
1083  LibmeshPetscCall(MatAssemblyEnd(_amc_time_derivative_mat, MAT_FINAL_ASSEMBLY));
1084  LibmeshPetscCall(MatAssemblyBegin(_amc_advective_derivative_mat, MAT_FINAL_ASSEMBLY));
1085  LibmeshPetscCall(MatAssemblyEnd(_amc_advective_derivative_mat, MAT_FINAL_ASSEMBLY));
1086  LibmeshPetscCall(MatAssemblyBegin(_amc_cross_derivative_mat, MAT_FINAL_ASSEMBLY));
1087  LibmeshPetscCall(MatAssemblyEnd(_amc_cross_derivative_mat, MAT_FINAL_ASSEMBLY));
1088  LibmeshPetscCall(MatAssemblyBegin(_amc_friction_force_mat, MAT_FINAL_ASSEMBLY));
1089  LibmeshPetscCall(MatAssemblyEnd(_amc_friction_force_mat, MAT_FINAL_ASSEMBLY));
1090  LibmeshPetscCall(MatAssemblyBegin(_amc_sys_mdot_mat, MAT_FINAL_ASSEMBLY));
1091  LibmeshPetscCall(MatAssemblyEnd(_amc_sys_mdot_mat, MAT_FINAL_ASSEMBLY));
1092  // Matrix
1093 #if !PETSC_VERSION_LESS_THAN(3, 15, 0)
1094  LibmeshPetscCall(
1095  MatAXPY(_amc_sys_mdot_mat, 1.0, _amc_time_derivative_mat, UNKNOWN_NONZERO_PATTERN));
1096  LibmeshPetscCall(MatAssemblyBegin(_amc_sys_mdot_mat, MAT_FINAL_ASSEMBLY));
1097  LibmeshPetscCall(MatAssemblyEnd(_amc_sys_mdot_mat, MAT_FINAL_ASSEMBLY));
1098  LibmeshPetscCall(
1099  MatAXPY(_amc_sys_mdot_mat, 1.0, _amc_advective_derivative_mat, UNKNOWN_NONZERO_PATTERN));
1100  LibmeshPetscCall(MatAssemblyBegin(_amc_sys_mdot_mat, MAT_FINAL_ASSEMBLY));
1101  LibmeshPetscCall(MatAssemblyEnd(_amc_sys_mdot_mat, MAT_FINAL_ASSEMBLY));
1102  LibmeshPetscCall(
1103  MatAXPY(_amc_sys_mdot_mat, 1.0, _amc_cross_derivative_mat, UNKNOWN_NONZERO_PATTERN));
1104  LibmeshPetscCall(MatAssemblyBegin(_amc_sys_mdot_mat, MAT_FINAL_ASSEMBLY));
1105  LibmeshPetscCall(MatAssemblyEnd(_amc_sys_mdot_mat, MAT_FINAL_ASSEMBLY));
1106  LibmeshPetscCall(
1107  MatAXPY(_amc_sys_mdot_mat, 1.0, _amc_friction_force_mat, UNKNOWN_NONZERO_PATTERN));
1108 #else
1109  LibmeshPetscCall(
1110  MatAXPY(_amc_sys_mdot_mat, 1.0, _amc_time_derivative_mat, DIFFERENT_NONZERO_PATTERN));
1111  LibmeshPetscCall(MatAssemblyBegin(_amc_sys_mdot_mat, MAT_FINAL_ASSEMBLY));
1112  LibmeshPetscCall(MatAssemblyEnd(_amc_sys_mdot_mat, MAT_FINAL_ASSEMBLY));
1113  LibmeshPetscCall(
1114  MatAXPY(_amc_sys_mdot_mat, 1.0, _amc_advective_derivative_mat, DIFFERENT_NONZERO_PATTERN));
1115  LibmeshPetscCall(MatAssemblyBegin(_amc_sys_mdot_mat, MAT_FINAL_ASSEMBLY));
1116  LibmeshPetscCall(MatAssemblyEnd(_amc_sys_mdot_mat, MAT_FINAL_ASSEMBLY));
1117  LibmeshPetscCall(
1118  MatAXPY(_amc_sys_mdot_mat, 1.0, _amc_cross_derivative_mat, DIFFERENT_NONZERO_PATTERN));
1119  LibmeshPetscCall(MatAssemblyBegin(_amc_sys_mdot_mat, MAT_FINAL_ASSEMBLY));
1120  LibmeshPetscCall(MatAssemblyEnd(_amc_sys_mdot_mat, MAT_FINAL_ASSEMBLY));
1121  LibmeshPetscCall(
1122  MatAXPY(_amc_sys_mdot_mat, 1.0, _amc_friction_force_mat, DIFFERENT_NONZERO_PATTERN));
1123 #endif
1124  LibmeshPetscCall(MatAssemblyBegin(_amc_sys_mdot_mat, MAT_FINAL_ASSEMBLY));
1125  LibmeshPetscCall(MatAssemblyEnd(_amc_sys_mdot_mat, MAT_FINAL_ASSEMBLY));
1126  // RHS
1127  LibmeshPetscCall(VecAXPY(_amc_sys_mdot_rhs, 1.0, _amc_time_derivative_rhs));
1128  LibmeshPetscCall(VecAXPY(_amc_sys_mdot_rhs, 1.0, _amc_advective_derivative_rhs));
1129  LibmeshPetscCall(VecAXPY(_amc_sys_mdot_rhs, 1.0, _amc_cross_derivative_rhs));
1130  LibmeshPetscCall(VecAXPY(_amc_sys_mdot_rhs, 1.0, _amc_friction_force_rhs));
1131  LibmeshPetscCall(VecAXPY(_amc_sys_mdot_rhs, 1.0, _amc_gravity_rhs));
1132  if (_segregated_bool)
1133  {
1134  // Assembly the matrix system
1135  LibmeshPetscCall(populateVectorFromHandle<SolutionHandle>(
1136  _prod, *_mdot_soln, first_node, last_node, _n_channels));
1137  Vec ls;
1138  LibmeshPetscCall(VecDuplicate(_amc_sys_mdot_rhs, &ls));
1139  LibmeshPetscCall(MatMult(_amc_sys_mdot_mat, _prod, ls));
1140  LibmeshPetscCall(VecAXPY(ls, -1.0, _amc_sys_mdot_rhs));
1141  PetscScalar * xx;
1142  LibmeshPetscCall(VecGetArray(ls, &xx));
1143  for (unsigned int iz = first_node; iz < last_node + 1; iz++)
1144  {
1145  auto iz_ind = iz - first_node;
1146  for (unsigned int i_ch = 0; i_ch < _n_channels; i_ch++)
1147  {
1148  // Setting nodes
1149  auto * node_in = _subchannel_mesh.getChannelNode(i_ch, iz - 1);
1150  auto * node_out = _subchannel_mesh.getChannelNode(i_ch, iz);
1151 
1152  // inlet, outlet, and interpolated axial surface area
1153  auto S_in = (*_S_flow_soln)(node_in);
1154  auto S_out = (*_S_flow_soln)(node_out);
1155  auto S_interp = computeInterpolatedValue(S_out, S_in, 0.5);
1156 
1157  // Setting solutions
1158  if (S_interp != 0)
1159  {
1160  auto DP = (1 / S_interp) * xx[iz_ind * _n_channels + i_ch];
1161  _DP(i_ch, iz) = DP;
1162  if (_DP_soln)
1163  _DP_soln->set(node_out, DP);
1164  }
1165  else
1166  {
1167  auto DP = 0.0;
1168  _DP(i_ch, iz) = DP;
1169  if (_DP_soln)
1170  _DP_soln->set(node_out, DP);
1171  }
1172  }
1173  }
1174  LibmeshPetscCall(VecDestroy(&ls));
1175  }
1176  }
1177 }
Mat _amc_sys_mdot_mat
Axial momentum system matrix.
Vec _amc_gravity_rhs
Axial momentum conservation - buoyancy force No implicit matrix.
Real _TR
Flag that activates or deactivates the transient parts of the equations we solve by multiplication...
libMesh::DenseMatrix< Real > _DP
std::unique_ptr< SolutionHandle > _S_flow_soln
Mat _amc_friction_force_mat
Axial momentum conservation - friction force.
PetscScalar computeInterpolatedValue(PetscScalar topValue, PetscScalar botValue, PetscScalar Peclet=0.0)
const bool _segregated_bool
Segregated solve.
virtual const std::vector< unsigned int > & getChannelGaps(unsigned int i_chan) const =0
Return a vector of gap indices for a given channel index.
std::unique_ptr< SolutionHandle > _rho_soln
Mat _amc_advective_derivative_mat
Axial momentum conservation - advective (Eulerian) derivative.
std::vector< Real > _z_grid
axial location of nodes
virtual Real computeFrictionFactor(const FrictionStruct &friction_info) const =0
Computes the friction factor for the local conditions.
Real value(unsigned n, unsigned alpha, unsigned beta, Real x)
static const std::string S
Definition: NS.h:167
PetscScalar computeInterpolationCoefficients(PetscScalar Peclet=0.0)
Functions that computes the interpolation scheme given the Peclet number.
const double Re
virtual const std::vector< std::vector< Real > > & getKGrid() const
Get axial cell location and value of loss coefficient.
virtual Node * getChannelNode(unsigned int i_chan, unsigned int iz) const =0
Get the subchannel mesh node for a given channel index and elevation index.
const MooseEnum _interpolation_scheme
The interpolation method used in constructing the systems.
const SCMFrictionClosureBase * _friction_closure
Friction closure object.
std::unique_ptr< SolutionHandle > _mdot_soln
Solutions handles and link to TH tables properties.
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
std::unique_ptr< SolutionHandle > _DP_soln
libMesh::DenseMatrix< Real > & _Wij
static const std::string alpha
Definition: NS.h:138
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.
std::unique_ptr< SolutionHandle > _SumWij_soln
Real _CT
Turbulent modeling parameter used in axial momentum equation.
Mat _amc_cross_derivative_mat
Axial momentum conservation - cross flux derivative.
std::unique_ptr< SolutionHandle > _ff_soln
struct SubChannel1PhaseProblem::FrictionStruct _friction_args
const bool _implicit_bool
Flag to define the usage of a implicit or explicit solution.
Mat _amc_time_derivative_mat
Axial momentum conservation - time derivative.
libMesh::DenseMatrix< Real > _WijPrime
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.

◆ computeGravityDir()

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

inline function that is used to define the gravity direction

Definition at line 161 of file SubChannel1PhaseProblem.h.

162  {
163  switch (dir)
164  {
165  case 0: // counter_flow
166  return 1.0;
167  case 1: // co_flow
168  return -1.0;
169  case 2: // none
170  return 0.0;
171  default:
172  mooseError(name(), ": Invalid gravity direction: expected counter_flow, co_flow, or none");
173  }
174  }
const std::string & name() const
void mooseError(Args &&... args) const

◆ computeh()

void TriSubChannel1PhaseProblem::computeh ( int  iblock)
overrideprotectedvirtual

Computes Enthalpy per channel for block iblock.

TODO: Current axial derivative is zero - check if outflow conditions may make a difference

Implements SubChannel1PhaseProblem.

Definition at line 325 of file TriSubChannel1PhaseProblem.C.

326 {
327  unsigned int last_node = (iblock + 1) * _block_size;
328  unsigned int first_node = iblock * _block_size + 1;
329  const Real & wire_lead_length = _tri_sch_mesh.getWireLeadLength();
330  const Real & wire_diameter = _tri_sch_mesh.getWireDiameter();
331  const Real & pitch = _subchannel_mesh.getPitch();
332  const Real & pin_diameter = _subchannel_mesh.getPinDiameter();
333 
334  if (iblock == 0)
335  {
336  for (unsigned int i_ch = 0; i_ch < _n_channels; i_ch++)
337  {
338  auto * node = _subchannel_mesh.getChannelNode(i_ch, 0);
339  auto h_out = _fp->h_from_p_T((*_P_soln)(node) + _P_out, (*_T_soln)(node));
340  if (h_out < 0)
341  {
342  mooseError(
343  name(), " : Calculation of negative Enthalpy h_out = : ", h_out, " Axial Level= : ", 0);
344  }
345  _h_soln->set(node, h_out);
346  }
347  }
348 
349  if (!_implicit_bool)
350  {
351  for (unsigned int iz = first_node; iz < last_node + 1; iz++)
352  {
353  auto z_grid = _subchannel_mesh.getZGrid();
354  auto dz = z_grid[iz] - z_grid[iz - 1];
355  // Calculation of average mass flux of all periphery subchannels
356  Real edge_flux_ave = 0.0;
357  Real mdot_sum = 0.0;
358  Real si_sum = 0.0;
359  for (unsigned int i_ch = 0; i_ch < _n_channels; i_ch++)
360  {
361  auto subch_type = _subchannel_mesh.getSubchannelType(i_ch);
362  if (subch_type == EChannelType::EDGE || subch_type == EChannelType::CORNER)
363  {
364  auto * node_in = _subchannel_mesh.getChannelNode(i_ch, iz - 1);
365  auto Si = (*_S_flow_soln)(node_in);
366  auto mdot_in = (*_mdot_soln)(node_in);
367  mdot_sum = mdot_sum + mdot_in;
368  si_sum = si_sum + Si;
369  }
370  }
371  edge_flux_ave = mdot_sum / si_sum;
372 
373  for (unsigned int i_ch = 0; i_ch < _n_channels; i_ch++)
374  {
375  auto * node_in = _subchannel_mesh.getChannelNode(i_ch, iz - 1);
376  auto * node_out = _subchannel_mesh.getChannelNode(i_ch, iz);
377  auto mdot_in = (*_mdot_soln)(node_in);
378  auto h_in = (*_h_soln)(node_in); // J/kg
379  auto volume = dz * (*_S_flow_soln)(node_in);
380  auto mdot_out = (*_mdot_soln)(node_out);
381  auto h_out = 0.0;
382  Real sumWijh = 0.0;
383  Real sumWijPrimeDhij = 0.0;
384  Real sweep_enthalpy = 0.0;
385  Real e_cond = 0.0;
386 
387  // Calculate added enthalpy from heatflux (Pin, Duct)
388  Real added_enthalpy = computeAddedHeatPin(i_ch, iz);
389  added_enthalpy += computeAddedHeatDuct(i_ch, iz);
390 
391  // Calculate net sum of enthalpy into/out-of channel i from channels j around i
392  // (Turbulent diffusion, Diversion Crossflow, Sweep flow Enthalpy, Radial heat conduction)
393  unsigned int counter = 0;
394  for (auto i_gap : _subchannel_mesh.getChannelGaps(i_ch))
395  {
396  auto chans = _subchannel_mesh.getGapChannels(i_gap);
397  auto gap = _subchannel_mesh.getGapWidth(iz, i_gap);
398  auto Sij = dz * gap;
399  unsigned int ii_ch = chans.first; // the first subchannel next to gap i_gap
400  unsigned int jj_ch = chans.second; // the second subchannel next to gap i_gap
401  auto * node_in_i = _subchannel_mesh.getChannelNode(ii_ch, iz - 1);
402  auto * node_in_j = _subchannel_mesh.getChannelNode(jj_ch, iz - 1);
403  auto subch_type_i = _subchannel_mesh.getSubchannelType(ii_ch);
404  auto subch_type_j = _subchannel_mesh.getSubchannelType(jj_ch);
405  // Define donor enthalpy
406  auto h_star = 0.0;
407  if (_Wij(i_gap, iz) > 0.0)
408  h_star = (*_h_soln)(node_in_i);
409  else if (_Wij(i_gap, iz) < 0.0)
410  h_star = (*_h_soln)(node_in_j);
411  // Diversion crossflow
412  // take care of the sign by applying the map, use donor cell
413  sumWijh += _subchannel_mesh.getCrossflowSign(i_ch, counter) * _Wij(i_gap, iz) * h_star;
414  counter++;
415  // SWEEP FLOW is calculated if i_gap is located in the periphery
416  // and we have a wire-wrap (if i_gap is in the periphery then i_ch is in the periphery)
417  // There are two gaps per periphery subchannel that this is true.
418  if ((subch_type_i == EChannelType::CORNER || subch_type_i == EChannelType::EDGE) &&
419  (subch_type_j == EChannelType::CORNER || subch_type_j == EChannelType::EDGE) &&
420  (wire_lead_length != 0) && (wire_diameter != 0))
421  {
422  // donor subchannel and node of sweep flow. The donor subchannel is the subchannel next
423  // to i_ch that sweep flow, flows from and into i_ch
424  auto sweep_donor = _tri_sch_mesh.getSweepFlowChans(i_ch).first;
425  auto * node_sweep_donor = _subchannel_mesh.getChannelNode(sweep_donor, iz - 1);
426  // if one of the neighbor subchannels of the periphery gap is the donor subchannel
427  //(the other would be the i_ch) sweep enthalpy flows into i_ch
428  if ((ii_ch == sweep_donor) || (jj_ch == sweep_donor))
429  {
430  sweep_enthalpy += computeSweepFlowMixingParameter(i_gap, iz) * edge_flux_ave * Sij *
431  (*_h_soln)(node_sweep_donor);
432  }
433  // else sweep enthalpy flows out of i_ch
434  else
435  {
436  sweep_enthalpy -= computeSweepFlowMixingParameter(i_gap, iz) * edge_flux_ave * Sij *
437  (*_h_soln)(node_in);
438  }
439  }
440  // Inner gap
441  // Turbulent Diffusion
442  else
443  {
444  sumWijPrimeDhij +=
445  _WijPrime(i_gap, iz) * (2 * h_in - (*_h_soln)(node_in_j) - (*_h_soln)(node_in_i));
446  }
447 
448  // compute the radial heat conduction through the gaps
449  Real dist_ij = pitch;
450 
451  if (subch_type_i == EChannelType::EDGE && subch_type_j == EChannelType::EDGE)
452  {
453  dist_ij = pitch;
454  }
455  else if ((subch_type_i == EChannelType::CORNER && subch_type_j == EChannelType::EDGE) ||
456  (subch_type_i == EChannelType::EDGE && subch_type_j == EChannelType::CORNER))
457  {
458  dist_ij = pitch;
459  }
460  else
461  {
462  dist_ij = pitch / std::sqrt(3);
463  }
464 
465  auto thcon_i = _fp->k_from_p_T((*_P_soln)(node_in_i) + _P_out, (*_T_soln)(node_in_i));
466  auto thcon_j = _fp->k_from_p_T((*_P_soln)(node_in_j) + _P_out, (*_T_soln)(node_in_j));
467  auto shape_factor =
468  0.66 * (pitch / pin_diameter) *
469  std::pow((_subchannel_mesh.getGapWidth(iz, i_gap) / pin_diameter), -0.3);
470  if (ii_ch == i_ch)
471  {
472  e_cond += 0.5 * (thcon_i + thcon_j) * Sij * shape_factor *
473  ((*_T_soln)(node_in_j) - (*_T_soln)(node_in_i)) / dist_ij;
474  }
475  else
476  {
477  e_cond += -0.5 * (thcon_i + thcon_j) * Sij * shape_factor *
478  ((*_T_soln)(node_in_j) - (*_T_soln)(node_in_i)) / dist_ij;
479  }
480  }
481 
482  // compute the axial heat conduction between current and lower axial node
483  auto * node_in_i = _subchannel_mesh.getChannelNode(i_ch, iz);
484  auto * node_in_j = _subchannel_mesh.getChannelNode(i_ch, iz - 1);
485  auto thcon_i = _fp->k_from_p_T((*_P_soln)(node_in_i) + _P_out, (*_T_soln)(node_in_i));
486  auto thcon_j = _fp->k_from_p_T((*_P_soln)(node_in_j) + _P_out, (*_T_soln)(node_in_j));
487  auto Si = (*_S_flow_soln)(node_in_i);
488  auto dist_ij = z_grid[iz] - z_grid[iz - 1];
489 
490  e_cond += 0.5 * (thcon_i + thcon_j) * Si * ((*_T_soln)(node_in_j) - (*_T_soln)(node_in_i)) /
491  dist_ij;
492 
493  unsigned int nz = _subchannel_mesh.getNumOfAxialCells();
494  // compute the axial heat conduction between current and upper axial node
495  if (iz < nz)
496  {
497  auto * node_in_i = _subchannel_mesh.getChannelNode(i_ch, iz);
498  auto * node_in_j = _subchannel_mesh.getChannelNode(i_ch, iz + 1);
499  auto thcon_i = _fp->k_from_p_T((*_P_soln)(node_in_i) + _P_out, (*_T_soln)(node_in_i));
500  auto thcon_j = _fp->k_from_p_T((*_P_soln)(node_in_j) + _P_out, (*_T_soln)(node_in_j));
501  auto Si = (*_S_flow_soln)(node_in_i);
502  auto dist_ij = z_grid[iz + 1] - z_grid[iz];
503  e_cond += 0.5 * (thcon_i + thcon_j) * Si *
504  ((*_T_soln)(node_in_j) - (*_T_soln)(node_in_i)) / dist_ij;
505  }
506 
507  // end of radial heat conduction calc.
508  h_out =
509  (mdot_in * h_in - sumWijh - sumWijPrimeDhij + added_enthalpy + e_cond + sweep_enthalpy +
510  _TR * _rho_soln->old(node_out) * _h_soln->old(node_out) * volume / _dt) /
511  (mdot_out + _TR * (*_rho_soln)(node_out)*volume / _dt);
512  if (h_out < 0)
513  {
514  mooseError(name(),
515  " : Calculation of negative Enthalpy h_out = : ",
516  h_out,
517  " Axial Level= : ",
518  iz);
519  }
520  _h_soln->set(node_out, h_out); // J/kg
521  }
522  }
523  }
524  else
525  {
526  LibmeshPetscCall(MatZeroEntries(_hc_time_derivative_mat));
527  LibmeshPetscCall(MatZeroEntries(_hc_advective_derivative_mat));
528  LibmeshPetscCall(MatZeroEntries(_hc_cross_derivative_mat));
529  LibmeshPetscCall(MatZeroEntries(_hc_axial_heat_conduction_mat));
530  LibmeshPetscCall(MatZeroEntries(_hc_radial_heat_conduction_mat));
531  LibmeshPetscCall(MatZeroEntries(_hc_sweep_enthalpy_mat));
532 
533  LibmeshPetscCall(VecZeroEntries(_hc_time_derivative_rhs));
534  LibmeshPetscCall(VecZeroEntries(_hc_advective_derivative_rhs));
535  LibmeshPetscCall(VecZeroEntries(_hc_cross_derivative_rhs));
536  LibmeshPetscCall(VecZeroEntries(_hc_added_heat_rhs));
537  LibmeshPetscCall(VecZeroEntries(_hc_axial_heat_conduction_rhs));
538  LibmeshPetscCall(VecZeroEntries(_hc_radial_heat_conduction_rhs));
539  LibmeshPetscCall(VecZeroEntries(_hc_sweep_enthalpy_rhs));
540 
541  LibmeshPetscCall(MatZeroEntries(_hc_sys_h_mat));
542  LibmeshPetscCall(VecZeroEntries(_hc_sys_h_rhs));
543 
544  for (unsigned int iz = first_node; iz < last_node + 1; iz++)
545  {
546  auto dz = _z_grid[iz] - _z_grid[iz - 1];
548  auto pin_diameter = _subchannel_mesh.getPinDiameter();
549  auto iz_ind = iz - first_node;
550 
551  for (unsigned int i_ch = 0; i_ch < _n_channels; i_ch++)
552  {
553  auto * node_in = _subchannel_mesh.getChannelNode(i_ch, iz - 1);
554  auto * node_out = _subchannel_mesh.getChannelNode(i_ch, iz);
555  auto S_in = (*_S_flow_soln)(node_in);
556  auto S_out = (*_S_flow_soln)(node_out);
557  auto S_interp = computeInterpolatedValue(S_out, S_in, 0.5);
558  auto volume = dz * S_interp;
559 
560  PetscScalar Pe = 0.5;
561  if (_interpolation_scheme == 3)
562  {
563  // Compute the Peclet number
564  auto w_perim_in = (*_w_perim_soln)(node_in);
565  auto w_perim_out = (*_w_perim_soln)(node_out);
566  auto w_perim_interp = this->computeInterpolatedValue(w_perim_out, w_perim_in, 0.5);
567  auto K_in = _fp->k_from_p_T((*_P_soln)(node_in) + _P_out, (*_T_soln)(node_in));
568  auto K_out = _fp->k_from_p_T((*_P_soln)(node_out) + _P_out, (*_T_soln)(node_out));
569  auto K = this->computeInterpolatedValue(K_out, K_in, 0.5);
570  auto cp_in = _fp->cp_from_p_T((*_P_soln)(node_in) + _P_out, (*_T_soln)(node_in));
571  auto cp_out = _fp->cp_from_p_T((*_P_soln)(node_out) + _P_out, (*_T_soln)(node_out));
572  auto cp = this->computeInterpolatedValue(cp_out, cp_in, 0.5);
573  auto mdot_loc =
574  this->computeInterpolatedValue((*_mdot_soln)(node_out), (*_mdot_soln)(node_in), 0.5);
575  // hydraulic diameter in the i direction
576  auto Dh_i = 4.0 * S_interp / w_perim_interp;
577  Pe = mdot_loc * Dh_i * cp / (K * S_interp) * (mdot_loc / std::abs(mdot_loc));
578  }
580 
581  // Time derivative term
582  if (iz == first_node)
583  {
584  PetscScalar value_vec_tt =
585  -1.0 * _TR * alpha * (*_rho_soln)(node_in) * (*_h_soln)(node_in)*volume / _dt;
586  PetscInt row_vec_tt = i_ch + _n_channels * iz_ind;
587  LibmeshPetscCall(
588  VecSetValues(_hc_time_derivative_rhs, 1, &row_vec_tt, &value_vec_tt, ADD_VALUES));
589  }
590  else
591  {
592  PetscInt row_tt = i_ch + _n_channels * iz_ind;
593  PetscInt col_tt = i_ch + _n_channels * (iz_ind - 1);
594  PetscScalar value_tt = _TR * alpha * (*_rho_soln)(node_in)*volume / _dt;
595  LibmeshPetscCall(MatSetValues(
596  _hc_time_derivative_mat, 1, &row_tt, 1, &col_tt, &value_tt, INSERT_VALUES));
597  }
598 
599  // Adding diagonal elements
600  PetscInt row_tt = i_ch + _n_channels * iz_ind;
601  PetscInt col_tt = i_ch + _n_channels * iz_ind;
602  PetscScalar value_tt = _TR * (1.0 - alpha) * (*_rho_soln)(node_out)*volume / _dt;
603  LibmeshPetscCall(MatSetValues(
604  _hc_time_derivative_mat, 1, &row_tt, 1, &col_tt, &value_tt, INSERT_VALUES));
605 
606  // Adding RHS elements
607  PetscScalar rho_old_interp =
608  computeInterpolatedValue(_rho_soln->old(node_out), _rho_soln->old(node_in), Pe);
609  PetscScalar h_old_interp =
610  computeInterpolatedValue(_h_soln->old(node_out), _h_soln->old(node_in), Pe);
611  PetscScalar value_vec_tt = _TR * rho_old_interp * h_old_interp * volume / _dt;
612  PetscInt row_vec_tt = i_ch + _n_channels * iz_ind;
613  LibmeshPetscCall(
614  VecSetValues(_hc_time_derivative_rhs, 1, &row_vec_tt, &value_vec_tt, ADD_VALUES));
615 
616  // Advective derivative term
617  if (iz == first_node)
618  {
619  PetscInt row_at = i_ch + _n_channels * iz_ind;
620  PetscScalar value_at = alpha * (*_mdot_soln)(node_in) * (*_h_soln)(node_in);
621  LibmeshPetscCall(
622  VecSetValues(_hc_advective_derivative_rhs, 1, &row_at, &value_at, ADD_VALUES));
623 
624  value_at = alpha * (*_mdot_soln)(node_out) - (1 - alpha) * (*_mdot_soln)(node_in);
625  PetscInt col_at = i_ch + _n_channels * iz_ind;
626  LibmeshPetscCall(MatSetValues(
627  _hc_advective_derivative_mat, 1, &row_at, 1, &col_at, &value_at, ADD_VALUES));
628 
629  value_at = (1 - alpha) * (*_mdot_soln)(node_out);
630  col_at = i_ch + _n_channels * (iz_ind + 1);
631  LibmeshPetscCall(MatSetValues(
632  _hc_advective_derivative_mat, 1, &row_at, 1, &col_at, &value_at, ADD_VALUES));
633  }
634  else if (iz == last_node)
635  {
636  PetscInt row_at = i_ch + _n_channels * iz_ind;
637  PetscScalar value_at = 1.0 * (*_mdot_soln)(node_out);
638  PetscInt col_at = i_ch + _n_channels * iz_ind;
639  LibmeshPetscCall(MatSetValues(
640  _hc_advective_derivative_mat, 1, &row_at, 1, &col_at, &value_at, ADD_VALUES));
641 
642  value_at = -1.0 * (*_mdot_soln)(node_in);
643  col_at = i_ch + _n_channels * (iz_ind - 1);
644  LibmeshPetscCall(MatSetValues(
645  _hc_advective_derivative_mat, 1, &row_at, 1, &col_at, &value_at, ADD_VALUES));
646  }
647  else
648  {
649  PetscInt row_at = i_ch + _n_channels * iz_ind;
650  PetscInt col_at;
651 
652  PetscScalar value_at = -alpha * (*_mdot_soln)(node_in);
653  col_at = i_ch + _n_channels * (iz_ind - 1);
654  LibmeshPetscCall(MatSetValues(
655  _hc_advective_derivative_mat, 1, &row_at, 1, &col_at, &value_at, ADD_VALUES));
656 
657  value_at = alpha * (*_mdot_soln)(node_out) - (1 - alpha) * (*_mdot_soln)(node_in);
658  col_at = i_ch + _n_channels * iz_ind;
659  LibmeshPetscCall(MatSetValues(
660  _hc_advective_derivative_mat, 1, &row_at, 1, &col_at, &value_at, ADD_VALUES));
661 
662  value_at = (1 - alpha) * (*_mdot_soln)(node_out);
663  col_at = i_ch + _n_channels * (iz_ind + 1);
664  LibmeshPetscCall(MatSetValues(
665  _hc_advective_derivative_mat, 1, &row_at, 1, &col_at, &value_at, ADD_VALUES));
666  }
667 
668  // Axial heat conduction
669  auto * node_center = _subchannel_mesh.getChannelNode(i_ch, iz);
670  auto K_center = _fp->k_from_p_T((*_P_soln)(node_center) + _P_out, (*_T_soln)(node_center));
671  auto cp_center =
672  _fp->cp_from_p_T((*_P_soln)(node_center) + _P_out, (*_T_soln)(node_center));
673  auto diff_center = K_center / (cp_center + 1e-15);
674 
675  if (iz == first_node)
676  {
677  auto * node_top = _subchannel_mesh.getChannelNode(i_ch, iz + 1);
678  auto * node_bottom = _subchannel_mesh.getChannelNode(i_ch, iz - 1);
679  auto K_bottom =
680  _fp->k_from_p_T((*_P_soln)(node_bottom) + _P_out, (*_T_soln)(node_bottom));
681  auto K_top = _fp->k_from_p_T((*_P_soln)(node_top) + _P_out, (*_T_soln)(node_top));
682  auto cp_bottom =
683  _fp->cp_from_p_T((*_P_soln)(node_bottom) + _P_out, (*_T_soln)(node_bottom));
684  auto cp_top = _fp->cp_from_p_T((*_P_soln)(node_top) + _P_out, (*_T_soln)(node_top));
685  auto diff_bottom = K_bottom / (cp_bottom + 1e-15);
686  auto diff_top = K_top / (cp_top + 1e-15);
687 
688  auto dz_up = _z_grid[iz + 1] - _z_grid[iz];
689  auto dz_down = _z_grid[iz] - _z_grid[iz - 1];
690  auto S_up =
691  computeInterpolatedValue((*_S_flow_soln)(node_top), (*_S_flow_soln)(node_center));
692  auto S_down =
693  computeInterpolatedValue((*_S_flow_soln)(node_center), (*_S_flow_soln)(node_bottom));
694  auto diff_up = computeInterpolatedValue(diff_top, diff_center);
695  auto diff_down = computeInterpolatedValue(diff_center, diff_bottom);
696 
697  // Diagonal value
698  PetscInt row_at = i_ch + _n_channels * iz_ind;
699  PetscInt col_at = i_ch + _n_channels * iz_ind;
700  PetscScalar value_at = diff_up * S_up / dz_up + diff_down * S_down / dz_down;
701  LibmeshPetscCall(MatSetValues(
702  _hc_axial_heat_conduction_mat, 1, &row_at, 1, &col_at, &value_at, INSERT_VALUES));
703 
704  // Bottom value
705  value_at = 1.0 * diff_down * S_down / dz_down * (*_h_soln)(node_bottom);
706  LibmeshPetscCall(
707  VecSetValues(_hc_axial_heat_conduction_rhs, 1, &row_at, &value_at, ADD_VALUES));
708 
709  // Top value
710  col_at = i_ch + _n_channels * (iz_ind + 1);
711  value_at = -diff_up * S_up / dz_up;
712  LibmeshPetscCall(MatSetValues(
713  _hc_axial_heat_conduction_mat, 1, &row_at, 1, &col_at, &value_at, INSERT_VALUES));
714  }
715  else if (iz == last_node)
716  {
717  auto * node_bottom = _subchannel_mesh.getChannelNode(i_ch, iz - 1);
718  auto K_bottom =
719  _fp->k_from_p_T((*_P_soln)(node_bottom) + _P_out, (*_T_soln)(node_bottom));
720  auto cp_bottom =
721  _fp->cp_from_p_T((*_P_soln)(node_bottom) + _P_out, (*_T_soln)(node_bottom));
722  auto diff_bottom = K_bottom / (cp_bottom + 1e-15);
723 
724  auto dz_down = _z_grid[iz] - _z_grid[iz - 1];
725  auto S_down = 0.5 * ((*_S_flow_soln)(node_center) + (*_S_flow_soln)(node_bottom));
726  auto diff_down = 0.5 * (diff_center + diff_bottom);
727 
728  // Diagonal value
729  PetscInt row_at = i_ch + _n_channels * iz_ind;
730  PetscInt col_at = i_ch + _n_channels * iz_ind;
731  PetscScalar value_at = diff_down * S_down / dz_down;
732  LibmeshPetscCall(MatSetValues(
733  _hc_axial_heat_conduction_mat, 1, &row_at, 1, &col_at, &value_at, INSERT_VALUES));
734 
735  // Bottom value
736  col_at = i_ch + _n_channels * (iz_ind - 1);
737  value_at = -diff_down * S_down / dz_down;
738  LibmeshPetscCall(MatSetValues(
739  _hc_axial_heat_conduction_mat, 1, &row_at, 1, &col_at, &value_at, INSERT_VALUES));
740 
741  // Outflow derivative
743  // value_at = -1.0 * (*_mdot_soln)(node_center) * (*_h_soln)(node_center);
744  // VecSetValues(_hc_axial_heat_conduction_rhs, 1, &row_at, &value_at, ADD_VALUES);
745  }
746  else
747  {
748  auto * node_top = _subchannel_mesh.getChannelNode(i_ch, iz + 1);
749  auto * node_bottom = _subchannel_mesh.getChannelNode(i_ch, iz - 1);
750  auto K_bottom =
751  _fp->k_from_p_T((*_P_soln)(node_bottom) + _P_out, (*_T_soln)(node_bottom));
752  auto K_top = _fp->k_from_p_T((*_P_soln)(node_top) + _P_out, (*_T_soln)(node_top));
753  auto cp_bottom =
754  _fp->cp_from_p_T((*_P_soln)(node_bottom) + _P_out, (*_T_soln)(node_bottom));
755  auto cp_top = _fp->cp_from_p_T((*_P_soln)(node_top) + _P_out, (*_T_soln)(node_top));
756  auto diff_bottom = K_bottom / (cp_bottom + 1e-15);
757  auto diff_top = K_top / (cp_top + 1e-15);
758 
759  auto dz_up = _z_grid[iz + 1] - _z_grid[iz];
760  auto dz_down = _z_grid[iz] - _z_grid[iz - 1];
761  auto S_up =
762  computeInterpolatedValue((*_S_flow_soln)(node_top), (*_S_flow_soln)(node_center));
763  auto S_down =
764  computeInterpolatedValue((*_S_flow_soln)(node_center), (*_S_flow_soln)(node_bottom));
765  auto diff_up = computeInterpolatedValue(diff_top, diff_center);
766  auto diff_down = computeInterpolatedValue(diff_center, diff_bottom);
767 
768  // Diagonal value
769  PetscInt row_at = i_ch + _n_channels * iz_ind;
770  PetscInt col_at = i_ch + _n_channels * iz_ind;
771  PetscScalar value_at = diff_up * S_up / dz_up + diff_down * S_down / dz_down;
772  LibmeshPetscCall(MatSetValues(
773  _hc_axial_heat_conduction_mat, 1, &row_at, 1, &col_at, &value_at, INSERT_VALUES));
774 
775  // Bottom value
776  col_at = i_ch + _n_channels * (iz_ind - 1);
777  value_at = -diff_down * S_down / dz_down;
778  LibmeshPetscCall(MatSetValues(
779  _hc_axial_heat_conduction_mat, 1, &row_at, 1, &col_at, &value_at, INSERT_VALUES));
780 
781  // Top value
782  col_at = i_ch + _n_channels * (iz_ind + 1);
783  value_at = -diff_up * S_up / dz_up;
784  LibmeshPetscCall(MatSetValues(
785  _hc_axial_heat_conduction_mat, 1, &row_at, 1, &col_at, &value_at, INSERT_VALUES));
786  }
787 
788  // Radial Terms
789  unsigned int counter = 0;
790  unsigned int cross_index = iz;
791  // Real radial_heat_conduction(0.0);
792  for (auto i_gap : _subchannel_mesh.getChannelGaps(i_ch))
793  {
794  auto chans = _subchannel_mesh.getGapChannels(i_gap);
795  unsigned int ii_ch = chans.first;
796  unsigned int jj_ch = chans.second;
797  auto * node_in_i = _subchannel_mesh.getChannelNode(ii_ch, iz - 1);
798  auto * node_in_j = _subchannel_mesh.getChannelNode(jj_ch, iz - 1);
799  PetscScalar h_star;
800  // figure out donor axial velocity
801  if (_Wij(i_gap, cross_index) > 0.0)
802  {
803  if (iz == first_node)
804  {
805  h_star = (*_h_soln)(node_in_i);
806  PetscScalar value_vec_ct = -1.0 * alpha *
807  _subchannel_mesh.getCrossflowSign(i_ch, counter) *
808  _Wij(i_gap, cross_index) * h_star;
809  PetscInt row_vec_ct = i_ch + _n_channels * iz_ind;
810  LibmeshPetscCall(VecSetValues(
811  _hc_cross_derivative_rhs, 1, &row_vec_ct, &value_vec_ct, ADD_VALUES));
812  }
813  else
814  {
815  PetscScalar value_ct = alpha * _subchannel_mesh.getCrossflowSign(i_ch, counter) *
816  _Wij(i_gap, cross_index);
817  PetscInt row_ct = i_ch + _n_channels * iz_ind;
818  PetscInt col_ct = ii_ch + _n_channels * (iz_ind - 1);
819  LibmeshPetscCall(MatSetValues(
820  _hc_cross_derivative_mat, 1, &row_ct, 1, &col_ct, &value_ct, ADD_VALUES));
821  }
822  PetscScalar value_ct = (1.0 - alpha) *
823  _subchannel_mesh.getCrossflowSign(i_ch, counter) *
824  _Wij(i_gap, cross_index);
825  PetscInt row_ct = i_ch + _n_channels * iz_ind;
826  PetscInt col_ct = ii_ch + _n_channels * iz_ind;
827  LibmeshPetscCall(MatSetValues(
828  _hc_cross_derivative_mat, 1, &row_ct, 1, &col_ct, &value_ct, ADD_VALUES));
829  }
830  else if (_Wij(i_gap, cross_index) < 0.0) // _Wij=0 operations not necessary
831  {
832  if (iz == first_node)
833  {
834  h_star = (*_h_soln)(node_in_j);
835  PetscScalar value_vec_ct = -1.0 * alpha *
836  _subchannel_mesh.getCrossflowSign(i_ch, counter) *
837  _Wij(i_gap, cross_index) * h_star;
838  PetscInt row_vec_ct = i_ch + _n_channels * iz_ind;
839  LibmeshPetscCall(VecSetValues(
840  _hc_cross_derivative_rhs, 1, &row_vec_ct, &value_vec_ct, ADD_VALUES));
841  }
842  else
843  {
844  PetscScalar value_ct = alpha * _subchannel_mesh.getCrossflowSign(i_ch, counter) *
845  _Wij(i_gap, cross_index);
846  PetscInt row_ct = i_ch + _n_channels * iz_ind;
847  PetscInt col_ct = jj_ch + _n_channels * (iz_ind - 1);
848  LibmeshPetscCall(MatSetValues(
849  _hc_cross_derivative_mat, 1, &row_ct, 1, &col_ct, &value_ct, ADD_VALUES));
850  }
851  PetscScalar value_ct = (1.0 - alpha) *
852  _subchannel_mesh.getCrossflowSign(i_ch, counter) *
853  _Wij(i_gap, cross_index);
854  PetscInt row_ct = i_ch + _n_channels * iz_ind;
855  PetscInt col_ct = jj_ch + _n_channels * iz_ind;
856  LibmeshPetscCall(MatSetValues(
857  _hc_cross_derivative_mat, 1, &row_ct, 1, &col_ct, &value_ct, ADD_VALUES));
858  }
859 
860  // Turbulent cross flows
861  if (iz == first_node)
862  {
863  PetscScalar value_vec_ct =
864  -2.0 * alpha * (*_h_soln)(node_in)*_WijPrime(i_gap, cross_index);
865  value_vec_ct += alpha * (*_h_soln)(node_in_j)*_WijPrime(i_gap, cross_index);
866  value_vec_ct += alpha * (*_h_soln)(node_in_i)*_WijPrime(i_gap, cross_index);
867  PetscInt row_vec_ct = i_ch + _n_channels * iz_ind;
868  LibmeshPetscCall(
869  VecSetValues(_hc_cross_derivative_rhs, 1, &row_vec_ct, &value_vec_ct, ADD_VALUES));
870  }
871  else
872  {
873  PetscScalar value_center_ct = 2.0 * alpha * _WijPrime(i_gap, cross_index);
874  PetscInt row_ct = i_ch + _n_channels * iz_ind;
875  PetscInt col_ct = i_ch + _n_channels * (iz_ind - 1);
876  LibmeshPetscCall(MatSetValues(
877  _hc_cross_derivative_mat, 1, &row_ct, 1, &col_ct, &value_center_ct, ADD_VALUES));
878 
879  PetscScalar value_left_ct = -1.0 * alpha * _WijPrime(i_gap, cross_index);
880  row_ct = i_ch + _n_channels * iz_ind;
881  col_ct = jj_ch + _n_channels * (iz_ind - 1);
882  LibmeshPetscCall(MatSetValues(
883  _hc_cross_derivative_mat, 1, &row_ct, 1, &col_ct, &value_left_ct, ADD_VALUES));
884 
885  PetscScalar value_right_ct = -1.0 * alpha * _WijPrime(i_gap, cross_index);
886  row_ct = i_ch + _n_channels * iz_ind;
887  col_ct = ii_ch + _n_channels * (iz_ind - 1);
888  LibmeshPetscCall(MatSetValues(
889  _hc_cross_derivative_mat, 1, &row_ct, 1, &col_ct, &value_right_ct, ADD_VALUES));
890  }
891  PetscScalar value_center_ct = 2.0 * (1.0 - alpha) * _WijPrime(i_gap, cross_index);
892  PetscInt row_ct = i_ch + _n_channels * iz_ind;
893  PetscInt col_ct = i_ch + _n_channels * iz_ind;
894  LibmeshPetscCall(MatSetValues(
895  _hc_cross_derivative_mat, 1, &row_ct, 1, &col_ct, &value_center_ct, ADD_VALUES));
896 
897  PetscScalar value_left_ct = -1.0 * (1.0 - alpha) * _WijPrime(i_gap, cross_index);
898  row_ct = i_ch + _n_channels * iz_ind;
899  col_ct = jj_ch + _n_channels * iz_ind;
900  LibmeshPetscCall(MatSetValues(
901  _hc_cross_derivative_mat, 1, &row_ct, 1, &col_ct, &value_left_ct, ADD_VALUES));
902 
903  PetscScalar value_right_ct = -1.0 * (1.0 - alpha) * _WijPrime(i_gap, cross_index);
904  row_ct = i_ch + _n_channels * iz_ind;
905  col_ct = ii_ch + _n_channels * iz_ind;
906  LibmeshPetscCall(MatSetValues(
907  _hc_cross_derivative_mat, 1, &row_ct, 1, &col_ct, &value_right_ct, ADD_VALUES));
908 
909  // Radial heat conduction
910  auto subch_type_i = _subchannel_mesh.getSubchannelType(ii_ch);
911  auto subch_type_j = _subchannel_mesh.getSubchannelType(jj_ch);
912  Real dist_ij = pitch;
913 
914  if (subch_type_i == EChannelType::EDGE && subch_type_j == EChannelType::EDGE)
915  {
916  dist_ij = pitch;
917  }
918  else if ((subch_type_i == EChannelType::CORNER && subch_type_j == EChannelType::EDGE) ||
919  (subch_type_i == EChannelType::EDGE && subch_type_j == EChannelType::CORNER))
920  {
921  dist_ij = pitch;
922  }
923  else
924  {
925  dist_ij = pitch / std::sqrt(3);
926  }
927 
928  auto Sij = dz * _subchannel_mesh.getGapWidth(iz, i_gap);
929  auto K_i = _fp->k_from_p_T((*_P_soln)(node_in_i) + _P_out, (*_T_soln)(node_in_i));
930  auto K_j = _fp->k_from_p_T((*_P_soln)(node_in_j) + _P_out, (*_T_soln)(node_in_j));
931  auto cp_i = _fp->cp_from_p_T((*_P_soln)(node_in_i) + _P_out, (*_T_soln)(node_in_i));
932  auto cp_j = _fp->cp_from_p_T((*_P_soln)(node_in_j) + _P_out, (*_T_soln)(node_in_j));
933  auto A_i = K_i / cp_i;
934  auto A_j = K_j / cp_j;
935  auto harm_A = 2.0 * A_i * A_j / (A_i + A_j);
936  auto shape_factor =
937  0.66 * (pitch / pin_diameter) *
938  std::pow((_subchannel_mesh.getGapWidth(iz, i_gap) / pin_diameter), -0.3);
939  // auto base_value = 0.5 * (A_i + A_j) * Sij * shape_factor / dist_ij;
940  auto base_value = harm_A * shape_factor * Sij / dist_ij;
941  auto neg_base_value = -1.0 * base_value;
942 
943  row_ct = ii_ch + _n_channels * iz_ind;
944  col_ct = ii_ch + _n_channels * iz_ind;
945  LibmeshPetscCall(MatSetValues(
946  _hc_radial_heat_conduction_mat, 1, &row_ct, 1, &col_ct, &base_value, ADD_VALUES));
947 
948  row_ct = jj_ch + _n_channels * iz_ind;
949  col_ct = jj_ch + _n_channels * iz_ind;
950  LibmeshPetscCall(MatSetValues(
951  _hc_radial_heat_conduction_mat, 1, &row_ct, 1, &col_ct, &base_value, ADD_VALUES));
952 
953  row_ct = ii_ch + _n_channels * iz_ind;
954  col_ct = jj_ch + _n_channels * iz_ind;
955  LibmeshPetscCall(MatSetValues(
956  _hc_radial_heat_conduction_mat, 1, &row_ct, 1, &col_ct, &neg_base_value, ADD_VALUES));
957 
958  row_ct = jj_ch + _n_channels * iz_ind;
959  col_ct = ii_ch + _n_channels * iz_ind;
960  LibmeshPetscCall(MatSetValues(
961  _hc_radial_heat_conduction_mat, 1, &row_ct, 1, &col_ct, &neg_base_value, ADD_VALUES));
962  counter++;
963  }
964 
965  // Compute the sweep flow enthalpy change
966  // Calculation of average mass flux of all periphery subchannels
967  Real edge_flux_ave = 0.0;
968  Real mdot_sum = 0.0;
969  Real si_sum = 0.0;
970  for (unsigned int i_ch = 0; i_ch < _n_channels; i_ch++)
971  {
972  auto subch_type = _subchannel_mesh.getSubchannelType(i_ch);
973  if (subch_type == EChannelType::EDGE || subch_type == EChannelType::CORNER)
974  {
975  auto * node_in = _subchannel_mesh.getChannelNode(i_ch, iz - 1);
976  auto Si = (*_S_flow_soln)(node_in);
977  auto mdot_in = (*_mdot_soln)(node_in);
978  mdot_sum = mdot_sum + mdot_in;
979  si_sum = si_sum + Si;
980  }
981  }
982  edge_flux_ave = mdot_sum / si_sum;
983  auto subch_type = _subchannel_mesh.getSubchannelType(i_ch);
984  PetscScalar sweep_enthalpy = 0.0;
985  if ((subch_type == EChannelType::EDGE || subch_type == EChannelType::CORNER) &&
986  (wire_diameter != 0.0) && (wire_lead_length != 0.0))
987  {
988  auto beta_in = std::numeric_limits<double>::quiet_NaN();
989  auto beta_out = std::numeric_limits<double>::quiet_NaN();
990  // donor sweep channel for i_ch
991  auto sweep_donor = _tri_sch_mesh.getSweepFlowChans(i_ch).first;
992  auto * node_sweep_donor = _subchannel_mesh.getChannelNode(sweep_donor, iz - 1);
993  // Calculation of turbulent mixing parameter
994  for (auto i_gap : _subchannel_mesh.getChannelGaps(i_ch))
995  {
996  auto chans = _subchannel_mesh.getGapChannels(i_gap);
997  unsigned int ii_ch = chans.first;
998  unsigned int jj_ch = chans.second;
999  auto subch_type_i = _subchannel_mesh.getSubchannelType(ii_ch);
1000  auto subch_type_j = _subchannel_mesh.getSubchannelType(jj_ch);
1001  if ((subch_type_i == EChannelType::CORNER || subch_type_i == EChannelType::EDGE) &&
1002  (subch_type_j == EChannelType::CORNER || subch_type_j == EChannelType::EDGE))
1003  {
1004  if ((ii_ch == sweep_donor) || (jj_ch == sweep_donor))
1005  {
1006  beta_in = computeSweepFlowMixingParameter(i_gap, iz);
1007  }
1008  else
1009  {
1010  beta_out = computeSweepFlowMixingParameter(i_gap, iz);
1011  }
1012  }
1013  }
1014  // Abort execution if required values are unset
1015  mooseAssert(!std::isnan(beta_in),
1016  "beta_in was not set. Check gap logic for i_ch = " + std::to_string(i_ch) +
1017  ", iz = " + std::to_string(iz));
1018  mooseAssert(!std::isnan(beta_out),
1019  "beta_out was not set. Check gap logic for i_ch = " + std::to_string(i_ch) +
1020  ", iz = " + std::to_string(iz));
1021 
1022  auto gap = _tri_sch_mesh.getDuctToPinGap();
1023  auto Sij = dz * gap;
1024  auto wsweep_in = edge_flux_ave * beta_in * Sij;
1025  auto wsweep_out = edge_flux_ave * beta_out * Sij;
1026  auto sweep_hin = (*_h_soln)(node_sweep_donor);
1027  auto sweep_hout = (*_h_soln)(node_in);
1028  sweep_enthalpy = (wsweep_in * sweep_hin - wsweep_out * sweep_hout);
1029 
1030  if (iz == first_node)
1031  {
1032  PetscInt row_sh = i_ch + _n_channels * iz_ind;
1033  PetscScalar value_hs = -sweep_enthalpy;
1034  LibmeshPetscCall(
1035  VecSetValues(_hc_sweep_enthalpy_rhs, 1, &row_sh, &value_hs, ADD_VALUES));
1036  }
1037  else
1038  {
1039  // coefficient of sweep_hin
1040  PetscInt row_sh = i_ch + _n_channels * (iz_ind - 1);
1041  PetscInt col_sh = i_ch + _n_channels * (iz_ind - 1);
1042  LibmeshPetscCall(MatSetValues(
1043  _hc_sweep_enthalpy_mat, 1, &row_sh, 1, &col_sh, &wsweep_out, ADD_VALUES));
1044  PetscInt col_sh_l = sweep_donor + _n_channels * (iz_ind - 1);
1045  PetscScalar neg_sweep_in = -1.0 * wsweep_in;
1046  // coefficient of sweep_hout
1047  LibmeshPetscCall(MatSetValues(
1048  _hc_sweep_enthalpy_mat, 1, &row_sh, 1, &col_sh_l, &(neg_sweep_in), ADD_VALUES));
1049  }
1050  }
1051 
1052  // Add heat enthalpy from pin and/or duct
1053  PetscScalar added_enthalpy = computeAddedHeatPin(i_ch, iz);
1054  added_enthalpy += computeAddedHeatDuct(i_ch, iz);
1055  PetscInt row_vec_ht = i_ch + _n_channels * iz_ind;
1056  LibmeshPetscCall(
1057  VecSetValues(_hc_added_heat_rhs, 1, &row_vec_ht, &added_enthalpy, ADD_VALUES));
1058  }
1059  }
1060  // Assembling system
1061  LibmeshPetscCall(MatAssemblyBegin(_hc_time_derivative_mat, MAT_FINAL_ASSEMBLY));
1062  LibmeshPetscCall(MatAssemblyEnd(_hc_time_derivative_mat, MAT_FINAL_ASSEMBLY));
1063  LibmeshPetscCall(MatAssemblyBegin(_hc_advective_derivative_mat, MAT_FINAL_ASSEMBLY));
1064  LibmeshPetscCall(MatAssemblyEnd(_hc_advective_derivative_mat, MAT_FINAL_ASSEMBLY));
1065  LibmeshPetscCall(MatAssemblyBegin(_hc_cross_derivative_mat, MAT_FINAL_ASSEMBLY));
1066  LibmeshPetscCall(MatAssemblyEnd(_hc_cross_derivative_mat, MAT_FINAL_ASSEMBLY));
1067  LibmeshPetscCall(MatAssemblyBegin(_hc_axial_heat_conduction_mat, MAT_FINAL_ASSEMBLY));
1068  LibmeshPetscCall(MatAssemblyEnd(_hc_axial_heat_conduction_mat, MAT_FINAL_ASSEMBLY));
1069  LibmeshPetscCall(MatAssemblyBegin(_hc_radial_heat_conduction_mat, MAT_FINAL_ASSEMBLY));
1070  LibmeshPetscCall(MatAssemblyEnd(_hc_radial_heat_conduction_mat, MAT_FINAL_ASSEMBLY));
1071  LibmeshPetscCall(MatAssemblyBegin(_hc_sweep_enthalpy_mat, MAT_FINAL_ASSEMBLY));
1072  LibmeshPetscCall(MatAssemblyEnd(_hc_sweep_enthalpy_mat, MAT_FINAL_ASSEMBLY));
1073  LibmeshPetscCall(MatAssemblyBegin(_hc_sys_h_mat, MAT_FINAL_ASSEMBLY));
1074  LibmeshPetscCall(MatAssemblyEnd(_hc_sys_h_mat, MAT_FINAL_ASSEMBLY));
1075  // Add all matrices together
1076  LibmeshPetscCall(
1077  MatAXPY(_hc_sys_h_mat, 1.0, _hc_time_derivative_mat, DIFFERENT_NONZERO_PATTERN));
1078  LibmeshPetscCall(MatAssemblyBegin(_hc_sys_h_mat, MAT_FINAL_ASSEMBLY));
1079  LibmeshPetscCall(MatAssemblyEnd(_hc_sys_h_mat, MAT_FINAL_ASSEMBLY));
1080  LibmeshPetscCall(
1081  MatAXPY(_hc_sys_h_mat, 1.0, _hc_advective_derivative_mat, DIFFERENT_NONZERO_PATTERN));
1082  LibmeshPetscCall(MatAssemblyBegin(_hc_sys_h_mat, MAT_FINAL_ASSEMBLY));
1083  LibmeshPetscCall(MatAssemblyEnd(_hc_sys_h_mat, MAT_FINAL_ASSEMBLY));
1084  LibmeshPetscCall(
1085  MatAXPY(_hc_sys_h_mat, 1.0, _hc_cross_derivative_mat, DIFFERENT_NONZERO_PATTERN));
1086  LibmeshPetscCall(MatAssemblyBegin(_hc_sys_h_mat, MAT_FINAL_ASSEMBLY));
1087  LibmeshPetscCall(MatAssemblyEnd(_hc_sys_h_mat, MAT_FINAL_ASSEMBLY));
1088  LibmeshPetscCall(
1089  MatAXPY(_hc_sys_h_mat, 1.0, _hc_axial_heat_conduction_mat, DIFFERENT_NONZERO_PATTERN));
1090  LibmeshPetscCall(MatAssemblyBegin(_hc_sys_h_mat, MAT_FINAL_ASSEMBLY));
1091  LibmeshPetscCall(MatAssemblyEnd(_hc_sys_h_mat, MAT_FINAL_ASSEMBLY));
1092  LibmeshPetscCall(
1093  MatAXPY(_hc_sys_h_mat, 1.0, _hc_radial_heat_conduction_mat, DIFFERENT_NONZERO_PATTERN));
1094  LibmeshPetscCall(MatAssemblyBegin(_hc_sys_h_mat, MAT_FINAL_ASSEMBLY));
1095  LibmeshPetscCall(MatAssemblyEnd(_hc_sys_h_mat, MAT_FINAL_ASSEMBLY));
1096  LibmeshPetscCall(
1097  MatAXPY(_hc_sys_h_mat, 1.0, _hc_sweep_enthalpy_mat, DIFFERENT_NONZERO_PATTERN));
1098  LibmeshPetscCall(MatAssemblyBegin(_hc_sys_h_mat, MAT_FINAL_ASSEMBLY));
1099  LibmeshPetscCall(MatAssemblyEnd(_hc_sys_h_mat, MAT_FINAL_ASSEMBLY));
1100  if (_verbose_subchannel)
1101  _console << "Block: " << iblock << " - Enthalpy conservation matrix assembled" << std::endl;
1102  // RHS
1103  LibmeshPetscCall(VecAXPY(_hc_sys_h_rhs, 1.0, _hc_time_derivative_rhs));
1104  LibmeshPetscCall(VecAXPY(_hc_sys_h_rhs, 1.0, _hc_advective_derivative_rhs));
1105  LibmeshPetscCall(VecAXPY(_hc_sys_h_rhs, 1.0, _hc_cross_derivative_rhs));
1106  LibmeshPetscCall(VecAXPY(_hc_sys_h_rhs, 1.0, _hc_added_heat_rhs));
1107  LibmeshPetscCall(VecAXPY(_hc_sys_h_rhs, 1.0, _hc_axial_heat_conduction_rhs));
1108  LibmeshPetscCall(VecAXPY(_hc_sys_h_rhs, 1.0, _hc_radial_heat_conduction_rhs));
1109  LibmeshPetscCall(VecAXPY(_hc_sys_h_rhs, 1.0, _hc_sweep_enthalpy_rhs));
1110 
1111  // Use system to solve for and populate enthalpy
1112  LibmeshPetscCall(this->solveAndPopulateEnthalpy(
1113  _hc_sys_h_mat, _hc_sys_h_rhs, first_node, last_node, "h_sys_"));
1114  }
1115 }
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 Real & getWireDiameter() const
Return wire diameter.
virtual const Real & getPinDiameter() const
Return undeformed Pin diameter.
std::unique_ptr< SolutionHandle > _T_soln
std::unique_ptr< SolutionHandle > _h_soln
Real _TR
Flag that activates or deactivates the transient parts of the equations we solve by multiplication...
const PostprocessorValue & _P_out
Outlet pressure postprocessor value.
virtual const std::vector< Real > & getZGrid() const
Get axial location of layers.
static const std::string K
Definition: NS.h:174
virtual const Real & getPitch() const
Return the undeformed pitch between 2 subchannels.
virtual EChannelType getSubchannelType(unsigned int index) const =0
Return the type of the subchannel for given subchannel index.
std::unique_ptr< SolutionHandle > _S_flow_soln
virtual Real computeAddedHeatPin(unsigned int i_ch, unsigned int iz) const override
Pure virtual: daughters provide different implementations.
PetscScalar computeInterpolatedValue(PetscScalar topValue, PetscScalar botValue, PetscScalar Peclet=0.0)
virtual const std::vector< unsigned int > & getChannelGaps(unsigned int i_chan) const =0
Return a vector of gap indices for a given channel index.
const Real & getDuctToPinGap() const
Return the the gap thickness between the duct and peripheral fuel pins.
std::unique_ptr< SolutionHandle > _rho_soln
static const std::string cp
Definition: NS.h:125
Vec _hc_added_heat_rhs
Enthalpy conservation - source and sink.
std::vector< Real > _z_grid
axial location of nodes
const std::string & name() const
static const std::string pitch
PetscScalar computeInterpolationCoefficients(PetscScalar Peclet=0.0)
Functions that computes the interpolation scheme given the Peclet number.
Mat _hc_cross_derivative_mat
Enthalpy conservation - cross flux derivative.
Real computeSweepFlowMixingParameter(unsigned int i_gap, unsigned int iz) const
Computes and validates the sweep-flow mixing parameter.
virtual Node * getChannelNode(unsigned int i_chan, unsigned int iz) const =0
Get the subchannel mesh node for a given channel index and elevation index.
const MooseEnum _interpolation_scheme
The interpolation method used in constructing the systems.
Real volume(const MeshBase &mesh, unsigned int dim=libMesh::invalid_uint)
virtual unsigned int getNumOfAxialCells() const
Return the number of axial cells.
std::unique_ptr< SolutionHandle > _mdot_soln
Solutions handles and link to TH tables properties.
virtual Real getGapWidth(unsigned int axial_index, unsigned int gap_index) const =0
Return gap width for a given gap index.
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
libMesh::DenseMatrix< Real > & _Wij
static const std::string alpha
Definition: NS.h:138
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.
const bool _verbose_subchannel
Boolean to printout information related to subchannel solve.
void mooseError(Args &&... args) const
Mat _hc_advective_derivative_mat
Enthalpy conservation - advective (Eulerian) derivative;.
const bool _implicit_bool
Flag to define the usage of a implicit or explicit solution.
const std::pair< unsigned int, unsigned int > & getSweepFlowChans(unsigned int i_chan) const
const ConsoleStream _console
Mat _hc_time_derivative_mat
Enthalpy Enthalpy conservation - time derivative.
libMesh::DenseMatrix< Real > _WijPrime
const Real & getWireLeadLength() const
Return the wire lead length.
virtual Real computeAddedHeatDuct(unsigned int i_ch, unsigned int iz) const
Non-pure: implemented in the base (or override in a child if needed)
MooseUnits pow(const MooseUnits &, int)
std::unique_ptr< SolutionHandle > _P_soln
const SinglePhaseFluidProperties * _fp
Non-owning pointer to fluid properties user object.
Mat _hc_sys_h_mat
System matrices.
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.

◆ computeInterpolatedValue()

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

Definition at line 459 of file SubChannel1PhaseProblem.C.

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

462 {
464  return alpha * botValue + (1.0 - alpha) * topValue;
465 }
PetscScalar computeInterpolationCoefficients(PetscScalar Peclet=0.0)
Functions that computes the interpolation scheme given the Peclet number.
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:153
static const std::string alpha
Definition: NS.h:138

◆ computeInterpolationCoefficients()

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

Functions that computes the interpolation scheme given the Peclet number.

Definition at line 439 of file SubChannel1PhaseProblem.C.

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

440 {
441  switch (_interpolation_scheme)
442  {
443  case 0: // upwind interpolation
444  return 1.0;
445  case 1: // downwind interpolation
446  return 0.0;
447  case 2: // central_difference interpolation
448  return 0.5;
449  case 3: // exponential interpolation (Peclet limited)
450  return ((Peclet - 1.0) * std::exp(Peclet) + 1) / (Peclet * (std::exp(Peclet) - 1.) + 1e-10);
451  default:
452  mooseError(name(),
453  ": Interpolation scheme should be a string: upwind, downwind, central_difference, "
454  "exponential");
455  }
456 }
const std::string & name() const
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:153
const MooseEnum _interpolation_scheme
The interpolation method used in constructing the systems.
void mooseError(Args &&... args) const

◆ computeMdot()

void SubChannel1PhaseProblem::computeMdot ( int  iblock)
protectedinherited

Computes mass flow per channel for block iblock.

Definition at line 566 of file SubChannel1PhaseProblem.C.

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

567 {
568  const unsigned int last_node = (iblock + 1) * _block_size;
569  const unsigned int first_node = iblock * _block_size + 1;
570  if (!_implicit_bool)
571  {
572  for (unsigned int iz = first_node; iz < last_node + 1; iz++)
573  {
574  auto dz = _z_grid[iz] - _z_grid[iz - 1];
575  for (unsigned int i_ch = 0; i_ch < _n_channels; i_ch++)
576  {
577  auto * node_in = _subchannel_mesh.getChannelNode(i_ch, iz - 1);
578  auto * node_out = _subchannel_mesh.getChannelNode(i_ch, iz);
579  auto volume = dz * (*_S_flow_soln)(node_in);
580  auto time_term = _TR * ((*_rho_soln)(node_out)-_rho_soln->old(node_out)) * volume / _dt;
581  // Wij positive out of i into j;
582  auto mdot_out = (*_mdot_soln)(node_in) - (*_SumWij_soln)(node_out)-time_term;
583  if (mdot_out < 0)
584  {
585  _console << "Wij = : " << _Wij << "\n";
586  mooseError(name(),
587  " : Calculation of negative mass flow mdot_out = : ",
588  mdot_out,
589  " Axial Level= : ",
590  iz,
591  " - Implicit solves are required for recirculating flow.");
592  }
593  _mdot_soln->set(node_out, mdot_out); // kg/sec
594  }
595  }
596  }
597  else
598  {
599  for (unsigned int iz = first_node; iz < last_node + 1; iz++)
600  {
601  auto dz = _z_grid[iz] - _z_grid[iz - 1];
602  auto iz_ind = iz - first_node;
603  for (unsigned int i_ch = 0; i_ch < _n_channels; i_ch++)
604  {
605  auto * node_in = _subchannel_mesh.getChannelNode(i_ch, iz - 1);
606  auto * node_out = _subchannel_mesh.getChannelNode(i_ch, iz);
607  auto volume = dz * (*_S_flow_soln)(node_in);
608 
609  // Adding time derivative to the RHS
610  auto time_term = _TR * ((*_rho_soln)(node_out)-_rho_soln->old(node_out)) * volume / _dt;
611  PetscInt row_vec = i_ch + _n_channels * iz_ind;
612  PetscScalar value_vec = -1.0 * time_term;
613  LibmeshPetscCall(
614  VecSetValues(_mc_axial_convection_rhs, 1, &row_vec, &value_vec, INSERT_VALUES));
615 
616  // Imposing bottom boundary condition or adding of diagonal elements
617  if (iz == first_node)
618  {
619  PetscScalar value_vec = (*_mdot_soln)(node_in);
620  PetscInt row_vec = i_ch + _n_channels * iz_ind;
621  LibmeshPetscCall(
622  VecSetValues(_mc_axial_convection_rhs, 1, &row_vec, &value_vec, ADD_VALUES));
623  }
624  else
625  {
626  PetscInt row = i_ch + _n_channels * iz_ind;
627  PetscInt col = i_ch + _n_channels * (iz_ind - 1);
628  PetscScalar value = -1.0;
629  LibmeshPetscCall(
630  MatSetValues(_mc_axial_convection_mat, 1, &row, 1, &col, &value, INSERT_VALUES));
631  }
632 
633  // Adding diagonal elements
634  PetscInt row = i_ch + _n_channels * iz_ind;
635  PetscInt col = i_ch + _n_channels * iz_ind;
636  PetscScalar value = 1.0;
637  LibmeshPetscCall(
638  MatSetValues(_mc_axial_convection_mat, 1, &row, 1, &col, &value, INSERT_VALUES));
639 
640  // Adding cross flows RHS
641  if (_segregated_bool)
642  {
643  PetscScalar value_vec_2 = -1.0 * (*_SumWij_soln)(node_out);
644  PetscInt row_vec_2 = i_ch + _n_channels * iz_ind;
645  LibmeshPetscCall(
646  VecSetValues(_mc_axial_convection_rhs, 1, &row_vec_2, &value_vec_2, ADD_VALUES));
647  }
648  }
649  }
650  LibmeshPetscCall(MatAssemblyBegin(_mc_axial_convection_mat, MAT_FINAL_ASSEMBLY));
651  LibmeshPetscCall(MatAssemblyEnd(_mc_axial_convection_mat, MAT_FINAL_ASSEMBLY));
652 
653  if (_segregated_bool)
654  {
655  KSP ksploc;
656  PC pc;
657  Vec sol;
658  LibmeshPetscCall(VecDuplicate(_mc_axial_convection_rhs, &sol));
659  LibmeshPetscCall(KSPCreate(PETSC_COMM_SELF, &ksploc));
660  LibmeshPetscCall(KSPSetOperators(ksploc, _mc_axial_convection_mat, _mc_axial_convection_mat));
661  LibmeshPetscCall(KSPGetPC(ksploc, &pc));
662  LibmeshPetscCall(PCSetType(pc, PCJACOBI));
663  LibmeshPetscCall(KSPSetTolerances(ksploc, _rtol, _atol, _dtol, _maxit));
664  LibmeshPetscCall(KSPSetFromOptions(ksploc));
665  LibmeshPetscCall(KSPSolve(ksploc, _mc_axial_convection_rhs, sol));
666  LibmeshPetscCall(populateSolutionChan<SolutionHandle>(
667  sol, *_mdot_soln, first_node, last_node, _n_channels));
668  LibmeshPetscCall(VecZeroEntries(_mc_axial_convection_rhs));
669  LibmeshPetscCall(KSPDestroy(&ksploc));
670  LibmeshPetscCall(VecDestroy(&sol));
671  }
672  }
673 }
const PetscReal & _dtol
The divergence tolerance for the ksp linear solver.
Real _TR
Flag that activates or deactivates the transient parts of the equations we solve by multiplication...
const bool _segregated_bool
Segregated solve.
std::unique_ptr< SolutionHandle > _rho_soln
std::vector< Real > _z_grid
axial location of nodes
const std::string & name() const
Real value(unsigned n, unsigned alpha, unsigned beta, Real x)
const PetscReal & _atol
The absolute convergence tolerance for the ksp linear solver.
Mat _mc_axial_convection_mat
Mass conservation - axial convection.
const PetscInt & _maxit
The maximum number of iterations to use for the ksp linear solver.
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.
Real volume(const MeshBase &mesh, unsigned int dim=libMesh::invalid_uint)
std::unique_ptr< SolutionHandle > _mdot_soln
Solutions handles and link to TH tables properties.
const PetscReal & _rtol
The relative convergence tolerance, (relative decrease) for the ksp linear solver.
libMesh::DenseMatrix< Real > & _Wij
std::unique_ptr< SolutionHandle > _SumWij_soln
void mooseError(Args &&... args) const
const bool _implicit_bool
Flag to define the usage of a implicit or explicit solution.
const ConsoleStream _console

◆ computeMixingParameter()

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

Computes and validates the turbulent mixing parameter.

Definition at line 1889 of file SubChannel1PhaseProblem.C.

Referenced by SubChannel1PhaseProblem::computeWijPrime().

1890 {
1891  auto beta = _mixing_closure->computeMixingParameter(i_gap, iz);
1892  if (!std::isfinite(beta) || beta < 0.0)
1893  mooseError(name(),
1894  ": Mixing closure returned invalid beta = ",
1895  beta,
1896  " for gap ",
1897  i_gap,
1898  " at axial index ",
1899  iz,
1900  ". Beta must be finite and non-negative.");
1901 
1902  return beta;
1903 }
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(...
const SCMMixingClosureBase * _mixing_closure
Turbulent Mixing closure object.
const std::string & name() const
void mooseError(Args &&... args) const

◆ computeMu()

void SubChannel1PhaseProblem::computeMu ( int  iblock)
protectedinherited

Computes Viscosity per channel for block iblock.

Definition at line 1451 of file SubChannel1PhaseProblem.C.

Referenced by SubChannel1PhaseProblem::externalSolve().

1452 {
1453  const unsigned int last_node = (iblock + 1) * _block_size;
1454  const unsigned int first_node = iblock * _block_size + 1;
1455  if (iblock == 0)
1456  {
1457  for (unsigned int i_ch = 0; i_ch < _n_channels; i_ch++)
1458  {
1459  auto * node = _subchannel_mesh.getChannelNode(i_ch, 0);
1460  _mu_soln->set(node, _fp->mu_from_p_T((*_P_soln)(node) + _P_out, (*_T_soln)(node)));
1461  }
1462  }
1463  for (unsigned int iz = first_node; iz < last_node + 1; iz++)
1464  {
1465  for (unsigned int i_ch = 0; i_ch < _n_channels; i_ch++)
1466  {
1467  auto * node = _subchannel_mesh.getChannelNode(i_ch, iz);
1468  _mu_soln->set(node, _fp->mu_from_p_T((*_P_soln)(node) + _P_out, (*_T_soln)(node)));
1469  }
1470  }
1471 }
std::unique_ptr< SolutionHandle > _T_soln
const PostprocessorValue & _P_out
Outlet pressure postprocessor value.
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.
std::unique_ptr< SolutionHandle > _P_soln
const SinglePhaseFluidProperties * _fp
Non-owning pointer to fluid properties user object.
std::unique_ptr< SolutionHandle > _mu_soln

◆ computeP()

void SubChannel1PhaseProblem::computeP ( int  iblock)
protectedinherited

Computes Pressure per channel for block iblock.

Definition at line 1180 of file SubChannel1PhaseProblem.C.

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

1181 {
1182  const unsigned int last_node = (iblock + 1) * _block_size;
1183  const unsigned int first_node = iblock * _block_size + 1;
1184  if (!_implicit_bool)
1185  {
1187  {
1188  for (unsigned int iz = last_node; iz > first_node - 1; iz--)
1189  {
1190  // Calculate pressure in the inlet of the cell assuming known outlet
1191  for (unsigned int i_ch = 0; i_ch < _n_channels; i_ch++)
1192  {
1193  auto * node_out = _subchannel_mesh.getChannelNode(i_ch, iz);
1194  auto * node_in = _subchannel_mesh.getChannelNode(i_ch, iz - 1);
1195  // update Pressure solution
1196  _P_soln->set(node_in, (*_P_soln)(node_out) + _DP(i_ch, iz));
1197  }
1198  }
1199  }
1200  else
1201  {
1202  for (unsigned int iz = last_node; iz > first_node - 1; iz--)
1203  {
1204  // Calculate pressure in the inlet of the cell assuming known outlet
1205  for (unsigned int i_ch = 0; i_ch < _n_channels; i_ch++)
1206  {
1207  auto * node_out = _subchannel_mesh.getChannelNode(i_ch, iz);
1208  auto * node_in = _subchannel_mesh.getChannelNode(i_ch, iz - 1);
1209  // update Pressure solution
1210  // Note: assuming uniform axial discretization in the curren code
1211  // We will need to update this later if we allow non-uniform refinements in the axial
1212  // direction
1213  PetscScalar Pe = 0.5;
1215  if (iz == last_node)
1216  {
1217  _P_soln->set(node_in, (*_P_soln)(node_out) + _DP(i_ch, iz) / 2.0);
1218  }
1219  else
1220  {
1221  _P_soln->set(node_in,
1222  (*_P_soln)(node_out) + (1.0 - alpha) * _DP(i_ch, iz) +
1223  alpha * _DP(i_ch, iz - 1));
1224  }
1225  }
1226  }
1227  }
1228  }
1229  else
1230  {
1232  {
1233  LibmeshPetscCall(VecZeroEntries(_amc_pressure_force_rhs));
1234  for (unsigned int iz = last_node; iz > first_node - 1; iz--)
1235  {
1236  auto iz_ind = iz - first_node;
1237  // Calculate pressure in the inlet of the cell assuming known outlet
1238  for (unsigned int i_ch = 0; i_ch < _n_channels; i_ch++)
1239  {
1240  auto * node_out = _subchannel_mesh.getChannelNode(i_ch, iz);
1241  auto * node_in = _subchannel_mesh.getChannelNode(i_ch, iz - 1);
1242 
1243  // inlet, outlet, and interpolated axial surface area
1244  auto S_in = (*_S_flow_soln)(node_in);
1245  auto S_out = (*_S_flow_soln)(node_out);
1246  auto S_interp = computeInterpolatedValue(S_out, S_in, 0.5);
1247 
1248  // Creating matrix of coefficients
1249  PetscInt row = i_ch + _n_channels * iz_ind;
1250  PetscInt col = i_ch + _n_channels * iz_ind;
1251  PetscScalar value = -1.0 * S_interp;
1252  LibmeshPetscCall(
1253  MatSetValues(_amc_pressure_force_mat, 1, &row, 1, &col, &value, INSERT_VALUES));
1254 
1255  if (iz == last_node)
1256  {
1257  PetscScalar value = -1.0 * (*_P_soln)(node_out)*S_interp;
1258  PetscInt row = i_ch + _n_channels * iz_ind;
1259  LibmeshPetscCall(VecSetValues(_amc_pressure_force_rhs, 1, &row, &value, ADD_VALUES));
1260  }
1261  else
1262  {
1263  PetscInt row = i_ch + _n_channels * iz_ind;
1264  PetscInt col = i_ch + _n_channels * (iz_ind + 1);
1265  PetscScalar value = 1.0 * S_interp;
1266  LibmeshPetscCall(
1267  MatSetValues(_amc_pressure_force_mat, 1, &row, 1, &col, &value, INSERT_VALUES));
1268  }
1269 
1270  if (_segregated_bool)
1271  {
1272  auto dp_out = _DP(i_ch, iz);
1273  PetscScalar value_v = -1.0 * dp_out * S_interp;
1274  PetscInt row_v = i_ch + _n_channels * iz_ind;
1275  LibmeshPetscCall(
1276  VecSetValues(_amc_pressure_force_rhs, 1, &row_v, &value_v, ADD_VALUES));
1277  }
1278  }
1279  }
1280  // Solving pressure problem
1281  LibmeshPetscCall(MatAssemblyBegin(_amc_pressure_force_mat, MAT_FINAL_ASSEMBLY));
1282  LibmeshPetscCall(MatAssemblyEnd(_amc_pressure_force_mat, MAT_FINAL_ASSEMBLY));
1283  if (_segregated_bool)
1284  {
1285  KSP ksploc;
1286  PC pc;
1287  Vec sol;
1288  LibmeshPetscCall(VecDuplicate(_amc_pressure_force_rhs, &sol));
1289  LibmeshPetscCall(KSPCreate(PETSC_COMM_SELF, &ksploc));
1290  LibmeshPetscCall(KSPSetOperators(ksploc, _amc_pressure_force_mat, _amc_pressure_force_mat));
1291  LibmeshPetscCall(KSPGetPC(ksploc, &pc));
1292  LibmeshPetscCall(PCSetType(pc, PCJACOBI));
1293  LibmeshPetscCall(KSPSetTolerances(ksploc, _rtol, _atol, _dtol, _maxit));
1294  LibmeshPetscCall(KSPSetFromOptions(ksploc));
1295  LibmeshPetscCall(KSPSolve(ksploc, _amc_pressure_force_rhs, sol));
1296  PetscScalar * xx;
1297  LibmeshPetscCall(VecGetArray(sol, &xx));
1298  // update Pressure solution
1299  for (unsigned int iz = last_node; iz > first_node - 1; iz--)
1300  {
1301  auto iz_ind = iz - first_node;
1302  for (unsigned int i_ch = 0; i_ch < _n_channels; i_ch++)
1303  {
1304  auto * node_in = _subchannel_mesh.getChannelNode(i_ch, iz - 1);
1305  PetscScalar value = xx[iz_ind * _n_channels + i_ch];
1306  _P_soln->set(node_in, value);
1307  }
1308  }
1309  LibmeshPetscCall(VecZeroEntries(_amc_pressure_force_rhs));
1310  LibmeshPetscCall(KSPDestroy(&ksploc));
1311  LibmeshPetscCall(VecDestroy(&sol));
1312  }
1313  }
1314  else
1315  {
1316  LibmeshPetscCall(VecZeroEntries(_amc_pressure_force_rhs));
1317  for (unsigned int iz = last_node; iz > first_node - 1; iz--)
1318  {
1319  auto iz_ind = iz - first_node;
1320  // Calculate pressure in the inlet of the cell assuming known outlet
1321  for (unsigned int i_ch = 0; i_ch < _n_channels; i_ch++)
1322  {
1323  auto * node_out = _subchannel_mesh.getChannelNode(i_ch, iz);
1324  auto * node_in = _subchannel_mesh.getChannelNode(i_ch, iz - 1);
1325 
1326  // inlet, outlet, and interpolated axial surface area
1327  auto S_in = (*_S_flow_soln)(node_in);
1328  auto S_out = (*_S_flow_soln)(node_out);
1329  auto S_interp = computeInterpolatedValue(S_out, S_in, 0.5);
1330 
1331  // Creating matrix of coefficients
1332  PetscInt row = i_ch + _n_channels * iz_ind;
1333  PetscInt col = i_ch + _n_channels * iz_ind;
1334  PetscScalar value = -1.0 * S_interp;
1335  LibmeshPetscCall(
1336  MatSetValues(_amc_pressure_force_mat, 1, &row, 1, &col, &value, INSERT_VALUES));
1337 
1338  if (iz == last_node)
1339  {
1340  PetscScalar value = -1.0 * (*_P_soln)(node_out)*S_interp;
1341  PetscInt row = i_ch + _n_channels * iz_ind;
1342  LibmeshPetscCall(VecSetValues(_amc_pressure_force_rhs, 1, &row, &value, ADD_VALUES));
1343 
1344  auto dp_out = _DP(i_ch, iz);
1345  PetscScalar value_v = -1.0 * dp_out / 2.0 * S_interp;
1346  PetscInt row_v = i_ch + _n_channels * iz_ind;
1347  LibmeshPetscCall(
1348  VecSetValues(_amc_pressure_force_rhs, 1, &row_v, &value_v, ADD_VALUES));
1349  }
1350  else
1351  {
1352  PetscInt row = i_ch + _n_channels * iz_ind;
1353  PetscInt col = i_ch + _n_channels * (iz_ind + 1);
1354  PetscScalar value = 1.0 * S_interp;
1355  LibmeshPetscCall(
1356  MatSetValues(_amc_pressure_force_mat, 1, &row, 1, &col, &value, INSERT_VALUES));
1357 
1358  if (_segregated_bool)
1359  {
1360  auto dp_in = _DP(i_ch, iz - 1);
1361  auto dp_out = _DP(i_ch, iz);
1362  auto dp_interp = computeInterpolatedValue(dp_out, dp_in, 0.5);
1363  PetscScalar value_v = -1.0 * dp_interp * S_interp;
1364  PetscInt row_v = i_ch + _n_channels * iz_ind;
1365  LibmeshPetscCall(
1366  VecSetValues(_amc_pressure_force_rhs, 1, &row_v, &value_v, ADD_VALUES));
1367  }
1368  }
1369  }
1370  }
1371  // Solving pressure problem
1372  LibmeshPetscCall(MatAssemblyBegin(_amc_pressure_force_mat, MAT_FINAL_ASSEMBLY));
1373  LibmeshPetscCall(MatAssemblyEnd(_amc_pressure_force_mat, MAT_FINAL_ASSEMBLY));
1374  if (_verbose_subchannel)
1375  _console << "Block: " << iblock << " - Axial momentum pressure force matrix assembled"
1376  << std::endl;
1377 
1378  if (_segregated_bool)
1379  {
1380  KSP ksploc;
1381  PC pc;
1382  Vec sol;
1383  LibmeshPetscCall(VecDuplicate(_amc_pressure_force_rhs, &sol));
1384  LibmeshPetscCall(KSPCreate(PETSC_COMM_SELF, &ksploc));
1385  LibmeshPetscCall(KSPSetOperators(ksploc, _amc_pressure_force_mat, _amc_pressure_force_mat));
1386  LibmeshPetscCall(KSPGetPC(ksploc, &pc));
1387  LibmeshPetscCall(PCSetType(pc, PCJACOBI));
1388  LibmeshPetscCall(KSPSetTolerances(ksploc, _rtol, _atol, _dtol, _maxit));
1389  LibmeshPetscCall(KSPSetFromOptions(ksploc));
1390  LibmeshPetscCall(KSPSolve(ksploc, _amc_pressure_force_rhs, sol));
1391  PetscScalar * xx;
1392  LibmeshPetscCall(VecGetArray(sol, &xx));
1393  // update Pressure solution
1394  for (unsigned int iz = last_node; iz > first_node - 1; iz--)
1395  {
1396  auto iz_ind = iz - first_node;
1397  for (unsigned int i_ch = 0; i_ch < _n_channels; i_ch++)
1398  {
1399  auto * node_in = _subchannel_mesh.getChannelNode(i_ch, iz - 1);
1400  PetscScalar value = xx[iz_ind * _n_channels + i_ch];
1401  _P_soln->set(node_in, value);
1402  }
1403  }
1404  LibmeshPetscCall(VecZeroEntries(_amc_pressure_force_rhs));
1405  LibmeshPetscCall(KSPDestroy(&ksploc));
1406  LibmeshPetscCall(VecDestroy(&sol));
1407  }
1408  }
1409  }
1410 }
const PetscReal & _dtol
The divergence tolerance for the ksp linear solver.
libMesh::DenseMatrix< Real > _DP
PetscScalar computeInterpolatedValue(PetscScalar topValue, PetscScalar botValue, PetscScalar Peclet=0.0)
const bool _segregated_bool
Segregated solve.
const bool _staggered_pressure_bool
Flag to define the usage of staggered or collocated pressure.
Mat _amc_pressure_force_mat
Axial momentum conservation - pressure force.
Real value(unsigned n, unsigned alpha, unsigned beta, Real x)
const PetscReal & _atol
The absolute convergence tolerance for the ksp linear solver.
PetscScalar computeInterpolationCoefficients(PetscScalar Peclet=0.0)
Functions that computes the interpolation scheme given the Peclet number.
const PetscInt & _maxit
The maximum number of iterations to use for the ksp linear solver.
virtual Node * getChannelNode(unsigned int i_chan, unsigned int iz) const =0
Get the subchannel mesh node for a given channel index and elevation index.
const PetscReal & _rtol
The relative convergence tolerance, (relative decrease) for the ksp linear solver.
static const std::string alpha
Definition: NS.h:138
const bool _verbose_subchannel
Boolean to printout information related to subchannel solve.
const bool _implicit_bool
Flag to define the usage of a implicit or explicit solution.
const ConsoleStream _console
std::unique_ptr< SolutionHandle > _P_soln

◆ computeRho()

void SubChannel1PhaseProblem::computeRho ( int  iblock)
protectedinherited

Computes Density per channel for block iblock.

Definition at line 1428 of file SubChannel1PhaseProblem.C.

Referenced by SubChannel1PhaseProblem::externalSolve().

1429 {
1430  const unsigned int last_node = (iblock + 1) * _block_size;
1431  const unsigned int first_node = iblock * _block_size + 1;
1432  if (iblock == 0)
1433  {
1434  for (unsigned int i_ch = 0; i_ch < _n_channels; i_ch++)
1435  {
1436  auto * node = _subchannel_mesh.getChannelNode(i_ch, 0);
1437  _rho_soln->set(node, _fp->rho_from_p_T((*_P_soln)(node) + _P_out, (*_T_soln)(node)));
1438  }
1439  }
1440  for (unsigned int iz = first_node; iz < last_node + 1; iz++)
1441  {
1442  for (unsigned int i_ch = 0; i_ch < _n_channels; i_ch++)
1443  {
1444  auto * node = _subchannel_mesh.getChannelNode(i_ch, iz);
1445  _rho_soln->set(node, _fp->rho_from_p_T((*_P_soln)(node) + _P_out, (*_T_soln)(node)));
1446  }
1447  }
1448 }
std::unique_ptr< SolutionHandle > _T_soln
const PostprocessorValue & _P_out
Outlet pressure postprocessor value.
std::unique_ptr< SolutionHandle > _rho_soln
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.
std::unique_ptr< SolutionHandle > _P_soln
const SinglePhaseFluidProperties * _fp
Non-owning pointer to fluid properties user object.

◆ computeSumWij()

void SubChannel1PhaseProblem::computeSumWij ( int  iblock)
protectedinherited

Computes net diversion crossflow per channel for block iblock.

Definition at line 501 of file SubChannel1PhaseProblem.C.

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

502 {
503  const unsigned int last_node = (iblock + 1) * _block_size;
504  const unsigned int first_node = iblock * _block_size + 1;
505  // Add to solution vector if explicit
506  if (!_implicit_bool)
507  {
508  for (unsigned int iz = first_node; iz < last_node + 1; iz++)
509  {
510  for (unsigned int i_ch = 0; i_ch < _n_channels; i_ch++)
511  {
512  auto * node_out = _subchannel_mesh.getChannelNode(i_ch, iz);
513  Real sumWij = 0.0;
514  // Calculate sum of crossflow into channel i from channels j around i
515  unsigned int counter = 0;
516  for (auto i_gap : _subchannel_mesh.getChannelGaps(i_ch))
517  {
518  sumWij += _subchannel_mesh.getCrossflowSign(i_ch, counter) * _Wij(i_gap, iz);
519  counter++;
520  }
521  // The net crossflow coming out of cell i [kg/sec]
522  _SumWij_soln->set(node_out, sumWij);
523  }
524  }
525  }
526  // Add to matrix if implicit
527  else
528  {
529  for (unsigned int iz = first_node; iz < last_node + 1; iz++)
530  {
531  unsigned int iz_ind = iz - first_node;
532  for (unsigned int i_ch = 0; i_ch < _n_channels; i_ch++)
533  {
534  // Calculate sum of crossflow into channel i from channels j around i
535  unsigned int counter = 0;
536  for (auto i_gap : _subchannel_mesh.getChannelGaps(i_ch))
537  {
538  PetscInt row = i_ch + _n_channels * iz_ind;
539  PetscInt col = i_gap + _n_gaps * iz_ind;
540  PetscScalar value = _subchannel_mesh.getCrossflowSign(i_ch, counter);
541  LibmeshPetscCall(MatSetValues(_mc_sumWij_mat, 1, &row, 1, &col, &value, INSERT_VALUES));
542  counter++;
543  }
544  }
545  }
546  LibmeshPetscCall(MatAssemblyBegin(_mc_sumWij_mat, MAT_FINAL_ASSEMBLY));
547  LibmeshPetscCall(MatAssemblyEnd(_mc_sumWij_mat, MAT_FINAL_ASSEMBLY));
548  if (_segregated_bool)
549  {
550  Vec loc_prod;
551  Vec loc_Wij;
552  LibmeshPetscCall(VecDuplicate(_amc_sys_mdot_rhs, &loc_prod));
553  LibmeshPetscCall(VecDuplicate(_Wij_vec, &loc_Wij));
555  loc_Wij, _Wij, first_node, last_node, _n_gaps));
556  LibmeshPetscCall(MatMult(_mc_sumWij_mat, loc_Wij, loc_prod));
557  LibmeshPetscCall(populateSolutionChan<SolutionHandle>(
558  loc_prod, *_SumWij_soln, first_node, last_node, _n_channels));
559  LibmeshPetscCall(VecDestroy(&loc_prod));
560  LibmeshPetscCall(VecDestroy(&loc_Wij));
561  }
562  }
563 }
const bool _segregated_bool
Segregated solve.
virtual const std::vector< unsigned int > & getChannelGaps(unsigned int i_chan) const =0
Return a vector of gap indices for a given channel index.
Mat _mc_sumWij_mat
Matrices and vectors to be used in implicit assembly Mass conservation Mass conservation - sum of cro...
PetscErrorCode populateVectorFromDense(Vec &x, const T &solution, const unsigned int first_axial_level, const unsigned int last_axial_level, const unsigned int cross_dimension)
Real value(unsigned n, unsigned alpha, unsigned beta, Real x)
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.
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
libMesh::DenseMatrix< Real > & _Wij
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.
std::unique_ptr< SolutionHandle > _SumWij_soln
const bool _implicit_bool
Flag to define the usage of a implicit or explicit solution.

◆ computeSweepFlowMixingParameter()

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

Computes and validates the sweep-flow mixing parameter.

Definition at line 1906 of file SubChannel1PhaseProblem.C.

Referenced by computeh().

1907 {
1908  auto beta = _mixing_closure->computeSweepFlowMixingParameter(i_gap, iz);
1909  if (!std::isfinite(beta) || beta < 0.0)
1910  mooseError(name(),
1911  ": Mixing closure returned invalid sweep-flow coefficient = ",
1912  beta,
1913  " for gap ",
1914  i_gap,
1915  " at axial index ",
1916  iz,
1917  ". sweep-flow coefficient must be finite and non-negative.");
1918 
1919  return beta;
1920 }
const SCMMixingClosureBase * _mixing_closure
Turbulent Mixing closure object.
const std::string & name() const
virtual Real computeSweepFlowMixingParameter(const unsigned int i_gap, const unsigned int iz) const
Computes the wire-wrap sweep-flow coefficient for peripheral gaps.
void mooseError(Args &&... args) const

◆ computeT()

void SubChannel1PhaseProblem::computeT ( int  iblock)
protectedinherited

Computes Temperature per channel for block iblock.

Definition at line 1413 of file SubChannel1PhaseProblem.C.

Referenced by SubChannel1PhaseProblem::externalSolve().

1414 {
1415  const unsigned int last_node = (iblock + 1) * _block_size;
1416  const unsigned int first_node = iblock * _block_size + 1;
1417  for (unsigned int iz = first_node; iz < last_node + 1; iz++)
1418  {
1419  for (unsigned int i_ch = 0; i_ch < _n_channels; i_ch++)
1420  {
1421  auto * node = _subchannel_mesh.getChannelNode(i_ch, iz);
1422  _T_soln->set(node, _fp->T_from_p_h((*_P_soln)(node) + _P_out, (*_h_soln)(node)));
1423  }
1424  }
1425 }
std::unique_ptr< SolutionHandle > _T_soln
std::unique_ptr< SolutionHandle > _h_soln
const PostprocessorValue & _P_out
Outlet pressure postprocessor value.
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.
std::unique_ptr< SolutionHandle > _P_soln
const SinglePhaseFluidProperties * _fp
Non-owning pointer to fluid properties user object.

◆ computeWijFromSolve()

void SubChannel1PhaseProblem::computeWijFromSolve ( int  iblock)
protectedinherited

Computes diversion crossflow per gap for block iblock.

Definition at line 468 of file SubChannel1PhaseProblem.C.

Referenced by SubChannel1PhaseProblem::externalSolve().

469 {
470  const unsigned int last_node = (iblock + 1) * _block_size;
471  const unsigned int first_node = iblock * _block_size + 1;
472  // Initial guess, port crossflow of block (iblock) into a vector that will act as my initial guess
473  libMesh::DenseVector<Real> solution_seed(_n_gaps * _block_size, 0.0);
474  for (unsigned int iz = first_node; iz < last_node + 1; iz++)
475  {
476  for (unsigned int i_gap = 0; i_gap < _n_gaps; i_gap++)
477  {
478  int i = _n_gaps * (iz - first_node) + i_gap; // column wise transfer
479  solution_seed(i) = _Wij(i_gap, iz);
480  }
481  }
482 
483  // Solving the combined lateral momentum equation for Wij using a PETSc solver and update vector
484  // root
486  LibmeshPetscCall(petscSnesSolver(iblock, solution_seed, root));
487 
488  // Assign the solution to the cross-flow matrix
489  int i = 0;
490  for (unsigned int iz = first_node; iz < last_node + 1; iz++)
491  {
492  for (unsigned int i_gap = 0; i_gap < _n_gaps; i_gap++)
493  {
494  _Wij(i_gap, iz) = root(i);
495  i++;
496  }
497  }
498 }
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&#39;s method.
Definition: BrentsMethod.C:66
libMesh::DenseMatrix< Real > & _Wij
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.

◆ computeWijPrime()

void SubChannel1PhaseProblem::computeWijPrime ( int  iblock)
protectedinherited

Computes turbulent crossflow per gap for block iblock.

Update turbulent crossflow

Definition at line 1793 of file SubChannel1PhaseProblem.C.

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

1794 {
1795  const unsigned int last_node = (iblock + 1) * _block_size;
1796  const unsigned int first_node = iblock * _block_size + 1;
1797  for (unsigned int iz = first_node; iz < last_node + 1; iz++)
1798  {
1799  auto dz = _z_grid[iz] - _z_grid[iz - 1];
1800  for (unsigned int i_gap = 0; i_gap < _n_gaps; i_gap++)
1801  {
1802  auto chans = _subchannel_mesh.getGapChannels(i_gap);
1803  unsigned int i_ch = chans.first;
1804  unsigned int j_ch = chans.second;
1805  auto * node_in_i = _subchannel_mesh.getChannelNode(i_ch, iz - 1);
1806  auto * node_out_i = _subchannel_mesh.getChannelNode(i_ch, iz);
1807  auto * node_in_j = _subchannel_mesh.getChannelNode(j_ch, iz - 1);
1808  auto * node_out_j = _subchannel_mesh.getChannelNode(j_ch, iz);
1809  auto Si_in = (*_S_flow_soln)(node_in_i);
1810  auto Sj_in = (*_S_flow_soln)(node_in_j);
1811  auto Si_out = (*_S_flow_soln)(node_out_i);
1812  auto Sj_out = (*_S_flow_soln)(node_out_j);
1813  auto gap = _subchannel_mesh.getGapWidth(iz, i_gap);
1814  auto Sij = dz * gap;
1815  auto avg_massflux =
1816  0.5 * (((*_mdot_soln)(node_in_i) + (*_mdot_soln)(node_in_j)) / (Si_in + Sj_in) +
1817  ((*_mdot_soln)(node_out_i) + (*_mdot_soln)(node_out_j)) / (Si_out + Sj_out));
1818  auto beta = computeMixingParameter(i_gap, iz);
1819 
1820  if (!_implicit_bool)
1821  {
1822  _WijPrime(i_gap, iz) = beta * avg_massflux * Sij;
1823  }
1824  else
1825  {
1826  auto iz_ind = iz - first_node;
1827  PetscScalar base_value = beta * 0.5 * Sij;
1828 
1829  // Bottom values
1830  if (iz == first_node)
1831  {
1832  PetscScalar value_tl = -1.0 * base_value / (Si_in + Sj_in) *
1833  ((*_mdot_soln)(node_in_i) + (*_mdot_soln)(node_in_j));
1834  PetscInt row = i_gap + _n_gaps * iz_ind;
1835  LibmeshPetscCall(
1836  VecSetValues(_amc_turbulent_cross_flows_rhs, 1, &row, &value_tl, INSERT_VALUES));
1837  }
1838  else
1839  {
1840  PetscScalar value_tl = base_value / (Si_in + Sj_in);
1841  PetscInt row = i_gap + _n_gaps * iz_ind;
1842 
1843  PetscInt col_ich = i_ch + _n_channels * (iz_ind - 1);
1844  LibmeshPetscCall(MatSetValues(
1845  _amc_turbulent_cross_flows_mat, 1, &row, 1, &col_ich, &value_tl, INSERT_VALUES));
1846 
1847  PetscInt col_jch = j_ch + _n_channels * (iz_ind - 1);
1848  LibmeshPetscCall(MatSetValues(
1849  _amc_turbulent_cross_flows_mat, 1, &row, 1, &col_jch, &value_tl, INSERT_VALUES));
1850  }
1851 
1852  // Top values
1853  PetscScalar value_bl = base_value / (Si_out + Sj_out);
1854  PetscInt row = i_gap + _n_gaps * iz_ind;
1855 
1856  PetscInt col_ich = i_ch + _n_channels * iz_ind;
1857  LibmeshPetscCall(MatSetValues(
1858  _amc_turbulent_cross_flows_mat, 1, &row, 1, &col_ich, &value_bl, INSERT_VALUES));
1859 
1860  PetscInt col_jch = j_ch + _n_channels * iz_ind;
1861  LibmeshPetscCall(MatSetValues(
1862  _amc_turbulent_cross_flows_mat, 1, &row, 1, &col_jch, &value_bl, INSERT_VALUES));
1863  }
1864  }
1865  }
1866 
1867  if (_implicit_bool)
1868  {
1869  LibmeshPetscCall(MatAssemblyBegin(_amc_turbulent_cross_flows_mat, MAT_FINAL_ASSEMBLY));
1870  LibmeshPetscCall(MatAssemblyEnd(_amc_turbulent_cross_flows_mat, MAT_FINAL_ASSEMBLY));
1871 
1873  Vec loc_prod;
1874  Vec loc_Wij;
1875  LibmeshPetscCall(VecDuplicate(_amc_sys_mdot_rhs, &loc_prod));
1876  LibmeshPetscCall(VecDuplicate(_Wij_vec, &loc_Wij));
1877  LibmeshPetscCall(populateVectorFromHandle<SolutionHandle>(
1878  loc_prod, *_mdot_soln, first_node, last_node, _n_channels));
1879  LibmeshPetscCall(MatMult(_amc_turbulent_cross_flows_mat, loc_prod, loc_Wij));
1880  LibmeshPetscCall(VecAXPY(loc_Wij, -1.0, _amc_turbulent_cross_flows_rhs));
1882  loc_Wij, _WijPrime, first_node, last_node, _n_gaps));
1883  LibmeshPetscCall(VecDestroy(&loc_prod));
1884  LibmeshPetscCall(VecDestroy(&loc_Wij));
1885  }
1886 }
Real computeMixingParameter(unsigned int i_gap, unsigned int iz) const
Computes and validates the turbulent mixing parameter.
Mat _amc_turbulent_cross_flows_mat
Mass conservation - density time derivative No implicit matrix.
std::vector< Real > _z_grid
axial location of nodes
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.
std::unique_ptr< SolutionHandle > _mdot_soln
Solutions handles and link to TH tables properties.
PetscErrorCode populateDenseFromVector(const Vec &x, T &solution, const unsigned int first_axial_level, const unsigned int last_axial_level, const unsigned int cross_dimension)
virtual Real getGapWidth(unsigned int axial_index, unsigned int gap_index) const =0
Return gap width for a given gap index.
const bool _implicit_bool
Flag to define the usage of a implicit or explicit solution.
libMesh::DenseMatrix< Real > _WijPrime
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.

◆ 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 1474 of file SubChannel1PhaseProblem.C.

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

1475 {
1476  const unsigned int last_node = (iblock + 1) * _block_size;
1477  const unsigned int first_node = iblock * _block_size + 1;
1478  // Cross flow residual
1479  if (!_implicit_bool)
1480  {
1481  const Real & pitch = _subchannel_mesh.getPitch();
1482  for (unsigned int iz = first_node; iz < last_node + 1; iz++)
1483  {
1484  auto dz = _z_grid[iz] - _z_grid[iz - 1];
1485  for (unsigned int i_gap = 0; i_gap < _n_gaps; i_gap++)
1486  {
1487  auto chans = _subchannel_mesh.getGapChannels(i_gap);
1488  unsigned int i_ch = chans.first;
1489  unsigned int j_ch = chans.second;
1490  auto * node_in_i = _subchannel_mesh.getChannelNode(i_ch, iz - 1);
1491  auto * node_out_i = _subchannel_mesh.getChannelNode(i_ch, iz);
1492  auto * node_in_j = _subchannel_mesh.getChannelNode(j_ch, iz - 1);
1493  auto * node_out_j = _subchannel_mesh.getChannelNode(j_ch, iz);
1494  auto rho_i = (*_rho_soln)(node_in_i);
1495  auto rho_j = (*_rho_soln)(node_in_j);
1496  auto Si = (*_S_flow_soln)(node_in_i);
1497  auto Sj = (*_S_flow_soln)(node_in_j);
1498  auto Sij = dz * _subchannel_mesh.getGapWidth(iz, i_gap);
1499  auto Lij = pitch;
1500  // total local form loss in the ij direction
1501  auto friction_term = _kij * _Wij(i_gap, iz) * std::abs(_Wij(i_gap, iz));
1502  auto DPij = (*_P_soln)(node_in_i) - (*_P_soln)(node_in_j);
1503  // Figure out donor cell density
1504  auto rho_star = 0.0;
1505  if (_Wij(i_gap, iz) > 0.0)
1506  rho_star = rho_i;
1507  else if (_Wij(i_gap, iz) < 0.0)
1508  rho_star = rho_j;
1509  else
1510  rho_star = (rho_i + rho_j) / 2.0;
1511  auto mass_term_out =
1512  (*_mdot_soln)(node_out_i) / (*_S_flow_soln)(node_out_i) / (*_rho_soln)(node_out_i) +
1513  (*_mdot_soln)(node_out_j) / (*_S_flow_soln)(node_out_j) / (*_rho_soln)(node_out_j);
1514  auto mass_term_in =
1515  (*_mdot_soln)(node_in_i) / Si / rho_i + (*_mdot_soln)(node_in_j) / Sj / rho_j;
1516  auto term_out = Sij * rho_star * (Lij / dz) * mass_term_out * _Wij(i_gap, iz);
1517  auto term_in = Sij * rho_star * (Lij / dz) * mass_term_in * _Wij(i_gap, iz - 1);
1518  auto inertia_term = term_out - term_in;
1519  auto pressure_term = 2 * Utility::pow<2>(Sij) * DPij * rho_star;
1520  auto time_term =
1521  _TR * 2.0 * (_Wij(i_gap, iz) - _Wij_old(i_gap, iz)) * Lij * Sij * rho_star / _dt;
1522 
1523  _Wij_residual_matrix(i_gap, iz - 1 - iblock * _block_size) =
1524  time_term + friction_term + inertia_term - pressure_term;
1525  }
1526  }
1527  }
1528  else
1529  {
1530  // Initializing to zero the elements of the lateral momentum assembly
1531  LibmeshPetscCall(MatZeroEntries(_cmc_time_derivative_mat));
1532  LibmeshPetscCall(MatZeroEntries(_cmc_advective_derivative_mat));
1533  LibmeshPetscCall(MatZeroEntries(_cmc_friction_force_mat));
1534  LibmeshPetscCall(MatZeroEntries(_cmc_pressure_force_mat));
1535  LibmeshPetscCall(VecZeroEntries(_cmc_time_derivative_rhs));
1536  LibmeshPetscCall(VecZeroEntries(_cmc_advective_derivative_rhs));
1537  LibmeshPetscCall(VecZeroEntries(_cmc_friction_force_rhs));
1538  LibmeshPetscCall(VecZeroEntries(_cmc_pressure_force_rhs));
1539  LibmeshPetscCall(MatZeroEntries(_cmc_sys_Wij_mat));
1540  LibmeshPetscCall(VecZeroEntries(_cmc_sys_Wij_rhs));
1541  const Real & pitch = _subchannel_mesh.getPitch();
1542  for (unsigned int iz = first_node; iz < last_node + 1; iz++)
1543  {
1544  auto dz = _z_grid[iz] - _z_grid[iz - 1];
1545  auto iz_ind = iz - first_node;
1546  for (unsigned int i_gap = 0; i_gap < _n_gaps; i_gap++)
1547  {
1548  auto chans = _subchannel_mesh.getGapChannels(i_gap);
1549  unsigned int i_ch = chans.first;
1550  unsigned int j_ch = chans.second;
1551  auto * node_in_i = _subchannel_mesh.getChannelNode(i_ch, iz - 1);
1552  auto * node_out_i = _subchannel_mesh.getChannelNode(i_ch, iz);
1553  auto * node_in_j = _subchannel_mesh.getChannelNode(j_ch, iz - 1);
1554  auto * node_out_j = _subchannel_mesh.getChannelNode(j_ch, iz);
1555 
1556  // inlet, outlet, and interpolated densities
1557  auto rho_i_in = (*_rho_soln)(node_in_i);
1558  auto rho_i_out = (*_rho_soln)(node_out_i);
1559  auto rho_i_interp = computeInterpolatedValue(rho_i_out, rho_i_in, 0.5);
1560  auto rho_j_in = (*_rho_soln)(node_in_j);
1561  auto rho_j_out = (*_rho_soln)(node_out_j);
1562  auto rho_j_interp = computeInterpolatedValue(rho_j_out, rho_j_in, 0.5);
1563 
1564  // inlet, outlet, and interpolated areas
1565  auto S_i_in = (*_S_flow_soln)(node_in_i);
1566  auto S_i_out = (*_S_flow_soln)(node_out_i);
1567  auto S_j_in = (*_S_flow_soln)(node_in_j);
1568  auto S_j_out = (*_S_flow_soln)(node_out_j);
1569 
1570  // Cross-sectional gap area
1571  auto Sij = dz * _subchannel_mesh.getGapWidth(iz, i_gap);
1572  auto Lij = pitch;
1573 
1574  // Figure out donor cell density
1575  auto rho_star = 0.0;
1576  if (_Wij(i_gap, iz) > 0.0)
1577  rho_star = rho_i_interp;
1578  else if (_Wij(i_gap, iz) < 0.0)
1579  rho_star = rho_j_interp;
1580  else
1581  rho_star = (rho_i_interp + rho_j_interp) / 2.0;
1582 
1583  // Assembling time derivative
1584  PetscScalar time_factor = _TR * Lij * Sij * rho_star / _dt;
1585  PetscInt row_td = i_gap + _n_gaps * iz_ind;
1586  PetscInt col_td = i_gap + _n_gaps * iz_ind;
1587  PetscScalar value_td = time_factor;
1588  LibmeshPetscCall(MatSetValues(
1589  _cmc_time_derivative_mat, 1, &row_td, 1, &col_td, &value_td, INSERT_VALUES));
1590  PetscScalar value_td_rhs = time_factor * _Wij_old(i_gap, iz);
1591  LibmeshPetscCall(
1592  VecSetValues(_cmc_time_derivative_rhs, 1, &row_td, &value_td_rhs, INSERT_VALUES));
1593 
1594  // Assembling inertial term
1595  PetscScalar Pe = 0.5;
1597  auto mass_term_out = (*_mdot_soln)(node_out_i) / S_i_out / rho_i_out +
1598  (*_mdot_soln)(node_out_j) / S_j_out / rho_j_out;
1599  auto mass_term_in = (*_mdot_soln)(node_in_i) / S_i_in / rho_i_in +
1600  (*_mdot_soln)(node_in_j) / S_j_in / rho_j_in;
1601  auto term_out = Sij * rho_star * (Lij / dz) * mass_term_out / 2.0;
1602  auto term_in = Sij * rho_star * (Lij / dz) * mass_term_in / 2.0;
1603  if (iz == first_node)
1604  {
1605  PetscInt row_ad = i_gap + _n_gaps * iz_ind;
1606  PetscScalar value_ad = term_in * alpha * _Wij(i_gap, iz - 1);
1607  LibmeshPetscCall(
1608  VecSetValues(_cmc_advective_derivative_rhs, 1, &row_ad, &value_ad, ADD_VALUES));
1609 
1610  PetscInt col_ad = i_gap + _n_gaps * iz_ind;
1611  value_ad = -1.0 * term_in * (1.0 - alpha) + term_out * alpha;
1612  LibmeshPetscCall(MatSetValues(
1613  _cmc_advective_derivative_mat, 1, &row_ad, 1, &col_ad, &value_ad, INSERT_VALUES));
1614 
1615  col_ad = i_gap + _n_gaps * (iz_ind + 1);
1616  value_ad = term_out * (1.0 - alpha);
1617  LibmeshPetscCall(MatSetValues(
1618  _cmc_advective_derivative_mat, 1, &row_ad, 1, &col_ad, &value_ad, INSERT_VALUES));
1619  }
1620  else if (iz == last_node)
1621  {
1622  PetscInt row_ad = i_gap + _n_gaps * iz_ind;
1623  PetscInt col_ad = i_gap + _n_gaps * (iz_ind - 1);
1624  PetscScalar value_ad = -1.0 * term_in * alpha;
1625  LibmeshPetscCall(MatSetValues(
1626  _cmc_advective_derivative_mat, 1, &row_ad, 1, &col_ad, &value_ad, INSERT_VALUES));
1627 
1628  col_ad = i_gap + _n_gaps * iz_ind;
1629  value_ad = -1.0 * term_in * (1.0 - alpha) + term_out * alpha;
1630  LibmeshPetscCall(MatSetValues(
1631  _cmc_advective_derivative_mat, 1, &row_ad, 1, &col_ad, &value_ad, INSERT_VALUES));
1632 
1633  value_ad = -1.0 * term_out * (1.0 - alpha) * _Wij(i_gap, iz);
1634  LibmeshPetscCall(
1635  VecSetValues(_cmc_advective_derivative_rhs, 1, &row_ad, &value_ad, ADD_VALUES));
1636  }
1637  else
1638  {
1639  PetscInt row_ad = i_gap + _n_gaps * iz_ind;
1640  PetscInt col_ad = i_gap + _n_gaps * (iz_ind - 1);
1641  PetscScalar value_ad = -1.0 * term_in * alpha;
1642  LibmeshPetscCall(MatSetValues(
1643  _cmc_advective_derivative_mat, 1, &row_ad, 1, &col_ad, &value_ad, INSERT_VALUES));
1644 
1645  col_ad = i_gap + _n_gaps * iz_ind;
1646  value_ad = -1.0 * term_in * (1.0 - alpha) + term_out * alpha;
1647  LibmeshPetscCall(MatSetValues(
1648  _cmc_advective_derivative_mat, 1, &row_ad, 1, &col_ad, &value_ad, INSERT_VALUES));
1649 
1650  col_ad = i_gap + _n_gaps * (iz_ind + 1);
1651  value_ad = term_out * (1.0 - alpha);
1652  LibmeshPetscCall(MatSetValues(
1653  _cmc_advective_derivative_mat, 1, &row_ad, 1, &col_ad, &value_ad, INSERT_VALUES));
1654  }
1655  // Assembling friction force
1656  PetscInt row_ff = i_gap + _n_gaps * iz_ind;
1657  PetscInt col_ff = i_gap + _n_gaps * iz_ind;
1658  PetscScalar value_ff = _kij * std::abs(_Wij(i_gap, iz)) / 2.0;
1659  LibmeshPetscCall(MatSetValues(
1660  _cmc_friction_force_mat, 1, &row_ff, 1, &col_ff, &value_ff, INSERT_VALUES));
1661 
1662  // Assembling pressure force
1664 
1666  {
1667  PetscScalar pressure_factor = Utility::pow<2>(Sij) * rho_star;
1668  PetscInt row_pf = i_gap + _n_gaps * iz_ind;
1669  PetscInt col_pf = i_ch + _n_channels * iz_ind;
1670  PetscScalar value_pf = -1.0 * alpha * pressure_factor;
1671  LibmeshPetscCall(
1672  MatSetValues(_cmc_pressure_force_mat, 1, &row_pf, 1, &col_pf, &value_pf, ADD_VALUES));
1673  col_pf = j_ch + _n_channels * iz_ind;
1674  value_pf = alpha * pressure_factor;
1675  LibmeshPetscCall(
1676  MatSetValues(_cmc_pressure_force_mat, 1, &row_pf, 1, &col_pf, &value_pf, ADD_VALUES));
1677 
1678  if (iz == last_node)
1679  {
1680  PetscInt row_pf = i_gap + _n_gaps * iz_ind;
1681  PetscScalar value_pf = (1.0 - alpha) * pressure_factor * (*_P_soln)(node_out_i);
1682  LibmeshPetscCall(
1683  VecSetValues(_cmc_pressure_force_rhs, 1, &row_pf, &value_pf, ADD_VALUES));
1684  value_pf = -1.0 * (1.0 - alpha) * pressure_factor * (*_P_soln)(node_out_j);
1685  LibmeshPetscCall(
1686  VecSetValues(_cmc_pressure_force_rhs, 1, &row_pf, &value_pf, ADD_VALUES));
1687  }
1688  else
1689  {
1690  row_pf = i_gap + _n_gaps * iz_ind;
1691  col_pf = i_ch + _n_channels * (iz_ind + 1);
1692  value_pf = -1.0 * (1.0 - alpha) * pressure_factor;
1693  LibmeshPetscCall(MatSetValues(
1694  _cmc_pressure_force_mat, 1, &row_pf, 1, &col_pf, &value_pf, ADD_VALUES));
1695  col_pf = j_ch + _n_channels * (iz_ind + 1);
1696  value_pf = (1.0 - alpha) * pressure_factor;
1697  LibmeshPetscCall(MatSetValues(
1698  _cmc_pressure_force_mat, 1, &row_pf, 1, &col_pf, &value_pf, ADD_VALUES));
1699  }
1700  }
1701  else
1702  {
1703  PetscScalar pressure_factor = Utility::pow<2>(Sij) * rho_star;
1704  PetscInt row_pf = i_gap + _n_gaps * iz_ind;
1705  PetscInt col_pf = i_ch + _n_channels * iz_ind;
1706  PetscScalar value_pf = -1.0 * pressure_factor;
1707  LibmeshPetscCall(
1708  MatSetValues(_cmc_pressure_force_mat, 1, &row_pf, 1, &col_pf, &value_pf, ADD_VALUES));
1709  col_pf = j_ch + _n_channels * iz_ind;
1710  value_pf = pressure_factor;
1711  LibmeshPetscCall(
1712  MatSetValues(_cmc_pressure_force_mat, 1, &row_pf, 1, &col_pf, &value_pf, ADD_VALUES));
1713  }
1714  }
1715  }
1717  LibmeshPetscCall(MatZeroEntries(_cmc_sys_Wij_mat));
1718  LibmeshPetscCall(VecZeroEntries(_cmc_sys_Wij_rhs));
1719  LibmeshPetscCall(MatAssemblyBegin(_cmc_time_derivative_mat, MAT_FINAL_ASSEMBLY));
1720  LibmeshPetscCall(MatAssemblyEnd(_cmc_time_derivative_mat, MAT_FINAL_ASSEMBLY));
1721  LibmeshPetscCall(MatAssemblyBegin(_cmc_advective_derivative_mat, MAT_FINAL_ASSEMBLY));
1722  LibmeshPetscCall(MatAssemblyEnd(_cmc_advective_derivative_mat, MAT_FINAL_ASSEMBLY));
1723  LibmeshPetscCall(MatAssemblyBegin(_cmc_friction_force_mat, MAT_FINAL_ASSEMBLY));
1724  LibmeshPetscCall(MatAssemblyEnd(_cmc_friction_force_mat, MAT_FINAL_ASSEMBLY));
1725  LibmeshPetscCall(MatAssemblyBegin(_cmc_pressure_force_mat, MAT_FINAL_ASSEMBLY));
1726  LibmeshPetscCall(MatAssemblyEnd(_cmc_pressure_force_mat, MAT_FINAL_ASSEMBLY));
1727  LibmeshPetscCall(MatAssemblyBegin(_cmc_sys_Wij_mat, MAT_FINAL_ASSEMBLY));
1728  LibmeshPetscCall(MatAssemblyEnd(_cmc_sys_Wij_mat, MAT_FINAL_ASSEMBLY));
1729  // Matrix
1730 #if !PETSC_VERSION_LESS_THAN(3, 15, 0)
1731  LibmeshPetscCall(
1732  MatAXPY(_cmc_sys_Wij_mat, 1.0, _cmc_time_derivative_mat, UNKNOWN_NONZERO_PATTERN));
1733  LibmeshPetscCall(MatAssemblyBegin(_cmc_sys_Wij_mat, MAT_FINAL_ASSEMBLY));
1734  LibmeshPetscCall(MatAssemblyEnd(_cmc_sys_Wij_mat, MAT_FINAL_ASSEMBLY));
1735  LibmeshPetscCall(
1736  MatAXPY(_cmc_sys_Wij_mat, 1.0, _cmc_advective_derivative_mat, UNKNOWN_NONZERO_PATTERN));
1737  LibmeshPetscCall(MatAssemblyBegin(_cmc_sys_Wij_mat, MAT_FINAL_ASSEMBLY));
1738  LibmeshPetscCall(MatAssemblyEnd(_cmc_sys_Wij_mat, MAT_FINAL_ASSEMBLY));
1739  LibmeshPetscCall(
1740  MatAXPY(_cmc_sys_Wij_mat, 1.0, _cmc_friction_force_mat, UNKNOWN_NONZERO_PATTERN));
1741 #else
1742  LibmeshPetscCall(
1743  MatAXPY(_cmc_sys_Wij_mat, 1.0, _cmc_time_derivative_mat, DIFFERENT_NONZERO_PATTERN));
1744  LibmeshPetscCall(MatAssemblyBegin(_cmc_sys_Wij_mat, MAT_FINAL_ASSEMBLY));
1745  LibmeshPetscCall(MatAssemblyEnd(_cmc_sys_Wij_mat, MAT_FINAL_ASSEMBLY));
1746  LibmeshPetscCall(
1747  MatAXPY(_cmc_sys_Wij_mat, 1.0, _cmc_advective_derivative_mat, DIFFERENT_NONZERO_PATTERN));
1748  LibmeshPetscCall(MatAssemblyBegin(_cmc_sys_Wij_mat, MAT_FINAL_ASSEMBLY));
1749  LibmeshPetscCall(MatAssemblyEnd(_cmc_sys_Wij_mat, MAT_FINAL_ASSEMBLY));
1750  LibmeshPetscCall(
1751  MatAXPY(_cmc_sys_Wij_mat, 1.0, _cmc_friction_force_mat, DIFFERENT_NONZERO_PATTERN));
1752 #endif
1753  LibmeshPetscCall(MatAssemblyBegin(_cmc_sys_Wij_mat, MAT_FINAL_ASSEMBLY));
1754  LibmeshPetscCall(MatAssemblyEnd(_cmc_sys_Wij_mat, MAT_FINAL_ASSEMBLY));
1755  // RHS
1756  LibmeshPetscCall(VecAXPY(_cmc_sys_Wij_rhs, 1.0, _cmc_time_derivative_rhs));
1757  LibmeshPetscCall(VecAXPY(_cmc_sys_Wij_rhs, 1.0, _cmc_advective_derivative_rhs));
1758  LibmeshPetscCall(VecAXPY(_cmc_sys_Wij_rhs, 1.0, _cmc_friction_force_rhs));
1759 
1760  if (_segregated_bool)
1761  {
1762  // Assembly the matrix system
1763  Vec sol_holder_P;
1764  LibmeshPetscCall(createPetscVector(sol_holder_P, _block_size * _n_gaps));
1765  Vec sol_holder_W;
1766  LibmeshPetscCall(createPetscVector(sol_holder_W, _block_size * _n_gaps));
1767  LibmeshPetscCall(populateVectorFromHandle<SolutionHandle>(
1768  _prodp, *_P_soln, first_node - 1, last_node - 1, _n_channels));
1770  _Wij_vec, _Wij, first_node, last_node, _n_gaps));
1771  LibmeshPetscCall(MatMult(_cmc_sys_Wij_mat, _Wij_vec, sol_holder_W));
1772  LibmeshPetscCall(VecAXPY(sol_holder_W, -1.0, _cmc_sys_Wij_rhs));
1773  LibmeshPetscCall(MatMult(_cmc_pressure_force_mat, _prodp, sol_holder_P));
1774  LibmeshPetscCall(VecAXPY(sol_holder_P, -1.0, _cmc_pressure_force_rhs));
1775  LibmeshPetscCall(VecAXPY(sol_holder_W, 1.0, sol_holder_P));
1776  PetscScalar * xx;
1777  LibmeshPetscCall(VecGetArray(sol_holder_W, &xx));
1778  for (unsigned int iz = first_node; iz < last_node + 1; iz++)
1779  {
1780  auto iz_ind = iz - first_node;
1781  for (unsigned int i_gap = 0; i_gap < _n_gaps; i_gap++)
1782  {
1783  _Wij_residual_matrix(i_gap, iz - 1 - iblock * _block_size) = xx[iz_ind * _n_gaps + i_gap];
1784  }
1785  }
1786  LibmeshPetscCall(VecDestroy(&sol_holder_P));
1787  LibmeshPetscCall(VecDestroy(&sol_holder_W));
1788  }
1789  }
1790 }
Mat _cmc_friction_force_mat
Cross momentum conservation - friction force.
Real _TR
Flag that activates or deactivates the transient parts of the equations we solve by multiplication...
libMesh::DenseMatrix< Real > _Wij_old
virtual const Real & getPitch() const
Return the undeformed pitch between 2 subchannels.
std::unique_ptr< SolutionHandle > _S_flow_soln
PetscErrorCode createPetscVector(Vec &v, PetscInt n)
Petsc Functions.
PetscScalar computeInterpolatedValue(PetscScalar topValue, PetscScalar botValue, PetscScalar Peclet=0.0)
const bool _segregated_bool
Segregated solve.
Mat _cmc_sys_Wij_mat
Lateral momentum system matrix.
const bool _staggered_pressure_bool
Flag to define the usage of staggered or collocated pressure.
PetscErrorCode populateVectorFromDense(Vec &x, const T &solution, const unsigned int first_axial_level, const unsigned int last_axial_level, const unsigned int cross_dimension)
std::unique_ptr< SolutionHandle > _rho_soln
std::vector< Real > _z_grid
axial location of nodes
static const std::string pitch
PetscScalar computeInterpolationCoefficients(PetscScalar Peclet=0.0)
Functions that computes the interpolation scheme given the Peclet number.
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.
libMesh::DenseMatrix< Real > _Wij_residual_matrix
std::unique_ptr< SolutionHandle > _mdot_soln
Solutions handles and link to TH tables properties.
virtual Real getGapWidth(unsigned int axial_index, unsigned int gap_index) const =0
Return gap width for a given gap index.
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
libMesh::DenseMatrix< Real > & _Wij
static const std::string alpha
Definition: NS.h:138
const bool _implicit_bool
Flag to define the usage of a implicit or explicit solution.
Mat _cmc_time_derivative_mat
Cross momentum Cross momentum conservation - time derivative.
Mat _cmc_pressure_force_mat
Cross momentum conservation - pressure force.
std::unique_ptr< SolutionHandle > _P_soln
Mat _cmc_advective_derivative_mat
Cross momentum conservation - advective (Eulerian) derivative.
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.

◆ createPetscMatrix()

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

Definition at line 300 of file SubChannel1PhaseProblem.h.

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

301  {
303  LibmeshPetscCall(MatCreate(PETSC_COMM_SELF, &M));
304  LibmeshPetscCall(MatSetSizes(M, PETSC_DECIDE, PETSC_DECIDE, n, m));
305  LibmeshPetscCall(MatSetFromOptions(M));
306  LibmeshPetscCall(MatSetUp(M));
307  PetscFunctionReturn(LIBMESH_PETSC_SUCCESS);
308  }
const double M
PetscFunctionBegin
PetscFunctionReturn(LIBMESH_PETSC_SUCCESS)

◆ createPetscVector()

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

Petsc Functions.

Definition at line 289 of file SubChannel1PhaseProblem.h.

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

290  {
292  LibmeshPetscCall(VecCreate(PETSC_COMM_SELF, &v));
293  LibmeshPetscCall(PetscObjectSetName((PetscObject)v, "Solution"));
294  LibmeshPetscCall(VecSetSizes(v, PETSC_DECIDE, n));
295  LibmeshPetscCall(VecSetFromOptions(v));
296  LibmeshPetscCall(VecZeroEntries(v));
297  PetscFunctionReturn(LIBMESH_PETSC_SUCCESS);
298  }
PetscFunctionBegin
const double v
PetscFunctionReturn(LIBMESH_PETSC_SUCCESS)

◆ detectDeformation()

void SubChannel1PhaseProblem::detectDeformation ( )
protectedinherited

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

Definition at line 336 of file SubChannel1PhaseProblem.C.

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

337 {
338  const Real tol = libMesh::TOLERANCE;
339  const auto pin_diameter = _subchannel_mesh.getPinDiameter();
340 
341  if (_pin_mesh_exist)
342  {
343  for (unsigned int iz = 0; iz < _n_cells + 1; iz++)
344  for (unsigned int i_pin = 0; i_pin < _n_pins; i_pin++)
345  {
346  auto * node = _subchannel_mesh.getPinNode(i_pin, iz);
347  const Real Dpin = (*_Dpin_soln)(node);
348  if (std::abs(Dpin) <= tol)
349  mooseError("Dpin is zero at node ",
350  node->id(),
351  ". You must initialize Dpin to a non-zero value.");
352  if (std::abs(Dpin - pin_diameter) > tol)
353  _deformation = true;
354  }
355  }
356 
357  for (unsigned int iz = 0; iz < _n_cells + 1 && !_deformation; iz++)
358  for (unsigned int i_ch = 0; i_ch < _n_channels && !_deformation; i_ch++)
359  {
360  auto * node = _subchannel_mesh.getChannelNode(i_ch, iz);
361  auto subch_type = _subchannel_mesh.getSubchannelType(i_ch);
362 
363  if ((subch_type == EChannelType::CORNER || subch_type == EChannelType::EDGE) &&
364  std::abs((*_displacement_soln)(node)) > tol)
365  _deformation = true;
366  }
367 }
const bool _pin_mesh_exist
Flag that informs if there is a pin mesh or not.
virtual const Real & getPinDiameter() const
Return undeformed Pin diameter.
static constexpr Real TOLERANCE
const double tol
virtual EChannelType getSubchannelType(unsigned int index) const =0
Return the type of the subchannel for given subchannel index.
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.
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.
bool _deformation
Flag that activates the effect of deformation (pin/duct) based on the auxvalues for displacement...
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
std::unique_ptr< SolutionHandle > _displacement_soln
void mooseError(Args &&... args) const

◆ externalSolve()

void SubChannel1PhaseProblem::externalSolve ( )
overridevirtualinherited

Assigning temperatures to duct

Implements ExternalProblem.

Definition at line 2514 of file SubChannel1PhaseProblem.C.

2515 {
2516  _console << "Executing subchannel solver\n";
2517  _dt = (isTransient() ? dt() : _one);
2518  _TR = isTransient();
2519 
2520  // The subchannel solver hardcodes a first-order backward (implicit) Euler time discretization, so
2521  // any other time integrator a user selects is silently ignored. Warn once if one is requested.
2523  {
2524  _time_integrator_checked = true;
2525  if (isTransient())
2526  if (auto * transient = dynamic_cast<TransientBase *>(_app.getExecutioner()))
2527  for (const auto * ti : transient->getTimeIntegrators())
2528  if (!dynamic_cast<const ImplicitEuler *>(ti))
2529  mooseWarning("The subchannel solver always uses implicit (backward) Euler time "
2530  "integration; the requested '",
2531  ti->type(),
2532  "' time integrator is ignored.");
2533  }
2534 
2536  // Small helper functions to reduce repetition
2537  // Verbose print helper (no-op unless _verbose_subchannel is true)
2538  auto V = [&](const std::string & s)
2539  {
2540  if (_verbose_subchannel)
2541  _console << s << std::endl;
2542  };
2543  V("Solution initialized");
2544  Real P_error = 1.0;
2545  unsigned int P_it = 0;
2546  unsigned int P_it_max;
2547 
2548  if (_segregated_bool)
2549  P_it_max = 20 * _n_blocks;
2550  else
2551  P_it_max = 100;
2552 
2553  if ((_n_blocks == 1) && (_segregated_bool))
2554  P_it_max = 5;
2555 
2556  while ((P_error > _P_tol && P_it < P_it_max))
2557  {
2558  P_it += 1;
2559  if (P_it == P_it_max && _n_blocks != 1)
2560  {
2561  _console << "Reached maximum number of axial pressure iterations" << std::endl;
2562  _converged = false;
2563  }
2564  _console << "Solving Outer Iteration : " << P_it << std::endl;
2565  auto P_L2norm_old_axial = _P_soln->L2norm();
2566  for (unsigned int iblock = 0; iblock < _n_blocks; iblock++)
2567  {
2568  int last_level = (iblock + 1) * _block_size;
2569  int first_level = iblock * _block_size + 1;
2570  Real T_block_error = 1.0;
2571  auto T_it = 0;
2572  _console << "Solving Block: " << iblock << " From first level: " << first_level
2573  << " to last level: " << last_level << std::endl;
2574  while (T_block_error > _T_tol && T_it < _T_maxit)
2575  {
2576  T_it += 1;
2577  if (T_it == _T_maxit)
2578  {
2579  _console << "Reached maximum number of temperature iterations for block: " << iblock
2580  << std::endl;
2581  _converged = false;
2582  }
2583  auto T_L2norm_old_block = _T_soln->L2norm();
2584  // We are only computing quantities on rank 0
2585  if (processor_id() > 0)
2586  goto aux_close;
2587 
2588  if (_segregated_bool)
2589  {
2590  computeWijFromSolve(iblock);
2591  if (_compute_power)
2592  {
2593  computeh(iblock);
2594  computeT(iblock);
2595  }
2596  }
2597  else
2598  {
2599  LibmeshPetscCall(implicitPetscSolve(iblock));
2600  computeWijPrime(iblock);
2601  V("Done with main solve.");
2602  if (_compute_power)
2603  {
2604  computeh(iblock);
2605  computeT(iblock);
2606  }
2607  V("Done with thermal solve.");
2608  }
2609 
2610  V("Start updating thermophysical properties.");
2611  if (_compute_density)
2612  computeRho(iblock);
2613  if (_compute_viscosity)
2614  computeMu(iblock);
2615  V("Done updating thermophysical properties.");
2616 
2617  // We must do a global assembly to make sure data is parallel consistent before we do things
2618  // like compute L2 norms
2619  aux_close:
2620  _aux->solution().close();
2621 
2622  auto T_L2norm_new = _T_soln->L2norm();
2623  T_block_error =
2624  std::abs((T_L2norm_new - T_L2norm_old_block) / (T_L2norm_old_block + 1E-14));
2625  _console << "T_block_error: " << T_block_error << std::endl;
2626 
2627  // All processes must have the same iteration count
2628  comm().max(T_block_error);
2629  }
2630  }
2631  auto P_L2norm_new_axial = _P_soln->L2norm();
2632  P_error =
2633  std::abs((P_L2norm_new_axial - P_L2norm_old_axial) / (P_L2norm_old_axial + _P_out + 1E-14));
2634  _console << "P_error :" << P_error << std::endl;
2635  V("Iteration: " + std::to_string(P_it));
2636  V("Maximum iterations: " + std::to_string(P_it_max));
2637  }
2638  // update old crossflow matrix
2639  _Wij_old = _Wij;
2640  _console << "Finished executing subchannel solver\n";
2641 
2642  // set SumWij at the inlet equal to the one on the first axial level (for visualization purposes)
2643  for (unsigned int i_ch = 0; i_ch < _n_channels; i_ch++)
2644  {
2645  auto * node_in = _subchannel_mesh.getChannelNode(i_ch, 0);
2646  auto * node_out = _subchannel_mesh.getChannelNode(i_ch, 1);
2647  _SumWij_soln->set(node_in, (*_SumWij_soln)(node_out)); // kg/sec
2648  }
2649 
2650  if (_pin_mesh_exist)
2651  {
2652  // Assign average HTC to subchannels. This is exact if all pins have the same diameter
2653  for (unsigned int iz = 0; iz < _n_cells + 1; ++iz)
2654  {
2655  for (unsigned int i_ch = 0; i_ch < _n_channels; i_ch++)
2656  {
2657  const auto * node = _subchannel_mesh.getChannelNode(i_ch, iz);
2658  auto mu = (*_mu_soln)(node);
2659  auto S = (*_S_flow_soln)(node);
2660  auto w_perim = (*_w_perim_soln)(node);
2661  auto Dh_i = 4.0 * S / w_perim;
2662  auto Re = (((*_mdot_soln)(node) / S) * Dh_i / mu);
2663  auto k = _fp->k_from_p_T((*_P_soln)(node) + _P_out, (*_T_soln)(node));
2664  auto cp = _fp->cp_from_p_T((*_P_soln)(node) + _P_out, (*_T_soln)(node));
2665  auto Pr = (*_mu_soln)(node)*cp / k;
2666  // Create Friction structure
2667  _friction_args = FrictionStruct(i_ch, Re, S, w_perim);
2668 
2669  Real sumhw = 0.0;
2670  for (auto i_pin : _subchannel_mesh.getChannelPins(i_ch))
2671  {
2672  // Create nusselt number structure
2673  _nusselt_args = NusseltStruct(Re, Pr, i_pin, iz, i_ch);
2674 
2675  // Compute HTC
2677  }
2678 
2679  // Set HTC
2680  _HTC_soln->set(node, sumhw / _subchannel_mesh.getChannelPins(i_ch).size());
2681  }
2682  }
2683  _HTC_soln->close();
2684 
2685  _console << "Commencing calculation of Pin surface temperature \n";
2686  for (unsigned int i_pin = 0; i_pin < _n_pins; i_pin++)
2687  {
2688  for (unsigned int iz = 0; iz < _n_cells + 1; ++iz)
2689  {
2690  const auto * pin_node = _subchannel_mesh.getPinNode(i_pin, iz);
2691  Real sumTemp = 0.0;
2692  // Calculate sum of pin surface temperatures that the channels around the pin see
2693  for (auto i_ch : _subchannel_mesh.getPinChannels(i_pin))
2694  {
2695  const auto * node = _subchannel_mesh.getChannelNode(i_ch, iz);
2696  auto mu = (*_mu_soln)(node);
2697  auto S = (*_S_flow_soln)(node);
2698  auto w_perim = (*_w_perim_soln)(node);
2699  auto Dh_i = 4.0 * S / w_perim;
2700  auto Re = (((*_mdot_soln)(node) / S) * Dh_i / mu);
2701  auto k = _fp->k_from_p_T((*_P_soln)(node) + _P_out, (*_T_soln)(node));
2702  auto cp = _fp->cp_from_p_T((*_P_soln)(node) + _P_out, (*_T_soln)(node));
2703  auto Pr = (*_mu_soln)(node)*cp / k;
2704  // Create Friction structure
2705  _friction_args = FrictionStruct(i_ch, Re, S, w_perim);
2706  // Create nusselt number structure
2707  _nusselt_args = NusseltStruct(Re, Pr, i_pin, iz, i_ch);
2708  // Compute HTC
2710  // Compute surface temperature contribution from subchannel side
2711  sumTemp +=
2712  (*_q_prime_soln)(pin_node) / ((*_Dpin_soln)(pin_node)*M_PI * hw) + (*_T_soln)(node);
2713  }
2714  if (_subchannel_mesh.getPinChannels(i_pin).size() > 0)
2715  _Tpin_soln->set(pin_node, sumTemp / _subchannel_mesh.getPinChannels(i_pin).size());
2716  else
2717  mooseError("Pin was not found for pin index: " + std::to_string(i_pin));
2718  }
2719  }
2720  }
2721 
2723  if (_duct_mesh_exist && processor_id() == 0)
2724  {
2725  _console << "Commencing calculation of duct surface temperature " << std::endl;
2726  auto duct_nodes = _subchannel_mesh.getDuctNodes();
2727  for (Node * dn : duct_nodes)
2728  {
2729  auto * node_chan = _subchannel_mesh.getChannelNodeFromDuct(dn);
2730  auto mu = (*_mu_soln)(node_chan);
2731  auto S = (*_S_flow_soln)(node_chan);
2732  auto w_perim = (*_w_perim_soln)(node_chan);
2733  auto Dh_i = 4.0 * S / w_perim;
2734  auto Re = (((*_mdot_soln)(node_chan) / S) * Dh_i / mu);
2735  auto k = _fp->k_from_p_T((*_P_soln)(node_chan) + _P_out, (*_T_soln)(node_chan));
2736  auto cp = _fp->cp_from_p_T((*_P_soln)(node_chan) + _P_out, (*_T_soln)(node_chan));
2737  auto Pr = (*_mu_soln)(node_chan)*cp / k;
2738 
2739  // Create nusselt number structure (consistent with pin case)
2740  const libMesh::Point & node_point = *_subchannel_mesh.getChannelNodeFromDuct(dn);
2741  const unsigned int iz = _subchannel_mesh.getZIndex(node_point);
2742  const unsigned int i_ch = _subchannel_mesh.channelIndex(node_point);
2743 
2744  // Create nusselt number structure
2745  _nusselt_args = NusseltStruct(Re, Pr, std::numeric_limits<unsigned int>::max(), iz, i_ch);
2746 
2747  // Create Friction structure
2748  _friction_args = FrictionStruct(i_ch, Re, S, w_perim);
2749 
2750  // Compute HTC
2752 
2753  // Compute Channel Temperature
2754  auto T_chan = (*_duct_heat_flux_soln)(dn) / hw + (*_T_soln)(node_chan);
2755  _Tduct_soln->set(dn, T_chan);
2756  }
2757  }
2758  _aux->solution().close();
2759  _aux->update();
2760 
2761  if (processor_id() != 0)
2762  return;
2763  Real power_in = 0.0;
2764  Real power_out = 0.0;
2765  Real viscosity_in = 0.0;
2766  Real mass_flow_in = 0.0;
2767  Real mass_flow_out = 0.0;
2768  for (unsigned int i_ch = 0; i_ch < _n_channels; i_ch++)
2769  {
2770  auto * node_in = _subchannel_mesh.getChannelNode(i_ch, 0);
2771  auto * node_out = _subchannel_mesh.getChannelNode(i_ch, _n_cells);
2772  const Real mdot_in = (*_mdot_soln)(node_in);
2773  power_in += mdot_in * (*_h_soln)(node_in);
2774  power_out += (*_mdot_soln)(node_out) * (*_h_soln)(node_out);
2775  viscosity_in += mdot_in * (*_mu_soln)(node_in);
2776  mass_flow_in += mdot_in;
2777  mass_flow_out += (*_mdot_soln)(node_out);
2778  }
2779  auto h_bulk_out = power_out / mass_flow_out;
2780  auto T_bulk_out = _fp->T_from_p_h(_P_out, h_bulk_out);
2781 
2783  Real inlet_mu = viscosity_in / mass_flow_in;
2784  Real bulk_Re = mass_flow_in * bulk_Dh / (inlet_mu * _subchannel_mesh.getAssemblyFlowArea());
2785  if (_verbose_subchannel)
2786  {
2787  _console << " ======================================= " << std::endl;
2788  _console << " ======== Subchannel Print Outs ======== " << std::endl;
2789  _console << " ======================================= " << std::endl;
2790  _console << "Total flow area :" << _subchannel_mesh.getAssemblyFlowArea() << " m^2"
2791  << std::endl;
2792  _console << "Assembly hydraulic diameter :" << bulk_Dh << " m" << std::endl;
2793  _console << "Assembly Re number :" << bulk_Re << " [-]" << std::endl;
2794  _console << "Bulk coolant temperature at outlet :" << T_bulk_out << " K" << std::endl;
2795  _console << "Power added to coolant is : " << power_out - power_in << " Watt" << std::endl;
2796  _console << "Mass flow rate in is : " << mass_flow_in << " kg/sec" << std::endl;
2797  _console << "Mass balance is : " << mass_flow_out - mass_flow_in << " kg/sec" << std::endl;
2798  _console << "User defined outlet pressure is : " << _P_out << " Pa" << std::endl;
2799  _console << " ======================================= " << std::endl;
2800  }
2801 
2802  if (MooseUtils::absoluteFuzzyLessEqual((power_out - power_in), -1.0))
2803  mooseWarning(
2804  "Energy conservation equation might not be solved correctly, Power added to coolant: " +
2805  std::to_string(power_out - power_in) + " Watt ");
2806 }
const bool _pin_mesh_exist
Flag that informs if there is a pin mesh or not.
void computeRho(int iblock)
Computes Density per channel for block iblock.
std::unique_ptr< SolutionHandle > _Tduct_soln
unsigned int _n_blocks
number of axial blocks
const bool _compute_power
Flag that informs if we need to solve the Enthalpy/Temperature equations or not.
std::unique_ptr< SolutionHandle > _T_soln
std::unique_ptr< SolutionHandle > _h_soln
virtual const std::vector< unsigned int > & getPinChannels(unsigned int i_pin) const =0
Return a vector of channel indices for a given Pin index.
Real _TR
Flag that activates or deactivates the transient parts of the equations we solve by multiplication...
libMesh::DenseMatrix< Real > _Wij_old
const PostprocessorValue & _P_out
Outlet pressure postprocessor value.
void computeT(int iblock)
Computes Temperature per channel for block iblock.
virtual const std::vector< unsigned int > & getChannelPins(unsigned int i_chan) const =0
Return a vector of pin indices for a given channel index.
const SCMHTCClosureBase * _pin_HTC_closure
HTC closure objects.
const bool _compute_density
Flag that activates or deactivates the calculation of density.
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.
const Parallel::Communicator & comm() const
const bool _duct_mesh_exist
Flag that informs if there is a duct mesh or not.
const Real & _T_tol
Convergence tolerance for the temperature loop in internal solve.
void computeMu(int iblock)
Computes Viscosity per channel for block iblock.
Real getAssemblyHydraulicDiameter() const
Return undeformed bundle-average hydraulic diameter.
const bool _segregated_bool
Segregated solve.
bool _converged
Variable that informs whether we exited external solve with a converged solution or not...
virtual void initializeSolution()=0
Function to initialize the solution & geometry fields.
const SCMHTCClosureBase * _duct_HTC_closure
virtual void computeh(int iblock)=0
Computes Enthalpy per channel for block iblock.
static const std::string cp
Definition: NS.h:125
std::unique_ptr< SolutionHandle > _HTC_soln
const int & _T_maxit
Maximum iterations for the inner temperature loop.
const std::vector< Node * > & getDuctNodes() const
Function that returns the vector with the duct nodes.
bool _time_integrator_checked
Whether the time integrator has been checked for consistency with the implementation.
static const std::string S
Definition: NS.h:167
Node * getChannelNodeFromDuct(Node *duct_node) const
Function that gets the channel node from the duct node.
std::shared_ptr< AuxiliarySystem > _aux
const double Re
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.
std::unique_ptr< SolutionHandle > _Dpin_soln
Real getAssemblyFlowArea() const
Return undeformed bundle inlet flow area.
Executioner * getExecutioner() const
virtual unsigned int channelIndex(const Point &point) const =0
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
const bool _compute_viscosity
Flag that activates or deactivates the calculation of viscosity.
MooseApp & _app
libMesh::DenseMatrix< Real > & _Wij
void max(const T &r, T &o, Request &req) const
void computeWijPrime(int iblock)
Computes turbulent crossflow per gap for block iblock.
std::unique_ptr< SolutionHandle > _SumWij_soln
void mooseWarning(Args &&... args) const
const bool _verbose_subchannel
Boolean to printout information related to subchannel solve.
virtual void transient(bool trans)
void mooseError(Args &&... args) const
const Real & _P_tol
Convergence tolerance for the pressure loop in external solve.
struct SubChannel1PhaseProblem::FrictionStruct _friction_args
void computeWijFromSolve(int iblock)
Computes diversion crossflow per gap for block iblock.
const ConsoleStream _console
virtual bool isTransient() const override
PetscErrorCode implicitPetscSolve(int iblock)
Computes implicit solve using PetSc.
processor_id_type processor_id() const
const double mu
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.
virtual Real & dt() const
std::unique_ptr< SolutionHandle > _P_soln
virtual unsigned int getZIndex(const Point &point) const
Get axial index of point.
static const std::string k
Definition: NS.h:134
struct SubChannel1PhaseProblem::NusseltStruct _nusselt_args
const SinglePhaseFluidProperties * _fp
Non-owning pointer to fluid properties user object.
std::unique_ptr< SolutionHandle > _Tpin_soln

◆ getAddedHeatDuct()

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

Return the added heat coming from the duct.

Definition at line 86 of file SubChannel1PhaseProblem.h.

87  {
88  return computeAddedHeatDuct(i_ch, iz);
89  }
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 80 of file SubChannel1PhaseProblem.h.

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

◆ getDuctHTCClosure()

const SCMHTCClosureBase* SubChannel1PhaseProblem::getDuctHTCClosure ( ) const
inlineinherited

◆ getFrictionClosure()

const SCMFrictionClosureBase* SubChannel1PhaseProblem::getFrictionClosure ( ) const
inlineinherited

Definition at line 46 of file SubChannel1PhaseProblem.h.

Referenced by SCMMixingKimAndChung::computeLatticeMixingParameter(), and SCMHTCGnielinski::computeNusseltNumber().

46 { return _friction_closure; }
const SCMFrictionClosureBase * _friction_closure
Friction closure object.

◆ getOutletPressure()

const PostprocessorValue& SubChannel1PhaseProblem::getOutletPressure ( ) const
inlineinherited

Get outlet pressure.

Definition at line 95 of file SubChannel1PhaseProblem.h.

Referenced by SCMMixingKimAndChung::computeLatticeMixingParameter().

95 { return _P_out; }
const PostprocessorValue & _P_out
Outlet pressure postprocessor value.

◆ getPinHTCClosure()

const SCMHTCClosureBase* SubChannel1PhaseProblem::getPinHTCClosure ( ) const
inlineinherited

Definition at line 45 of file SubChannel1PhaseProblem.h.

45 { return _pin_HTC_closure; } // optional
const SCMHTCClosureBase * _pin_HTC_closure
HTC closure objects.

◆ getSinglePhaseFluidProperties()

const SinglePhaseFluidProperties* SubChannel1PhaseProblem::getSinglePhaseFluidProperties ( ) const
inlineinherited

Get fluid properties object.

Definition at line 101 of file SubChannel1PhaseProblem.h.

Referenced by SCMMixingKimAndChung::computeLatticeMixingParameter().

101 { return _fp; }
const SinglePhaseFluidProperties * _fp
Non-owning pointer to fluid properties user object.

◆ getSubChannelPeripheralDuctWidth()

Real TriSubChannel1PhaseProblem::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 309 of file TriSubChannel1PhaseProblem.C.

310 {
311  auto subch_type = _subchannel_mesh.getSubchannelType(i_ch);
312  if (subch_type == EChannelType::EDGE || subch_type == EChannelType::CORNER)
313  {
314  auto width = _subchannel_mesh.getPitch();
315  if (subch_type == EChannelType::CORNER)
316  width = 2.0 / std::sqrt(3.0) *
318  return width;
319  }
320  else
321  mooseError("Channel is not a perimetric subchannel ");
322 }
virtual const Real & getPinDiameter() const
Return undeformed Pin diameter.
virtual const Real & getPitch() const
Return the undeformed pitch between 2 subchannels.
virtual EChannelType getSubchannelType(unsigned int index) const =0
Return the type of the subchannel for given subchannel index.
const Real & getDuctToPinGap() const
Return the the gap thickness between the duct and peripheral fuel pins.
void mooseError(Args &&... args) const

◆ implicitPetscSolve()

PetscErrorCode SubChannel1PhaseProblem::implicitPetscSolve ( int  iblock)
protectedinherited

Computes implicit solve using PetSc.

Definition at line 2096 of file SubChannel1PhaseProblem.C.

Referenced by SubChannel1PhaseProblem::externalSolve().

2097 {
2099  // ---------- helper functions -----------------------------
2100  auto V = [&](const std::string & s)
2101  {
2102  if (_verbose_subchannel)
2103  _console << s << std::endl;
2104  };
2105 
2106  auto DupMatAssembled = [&](Mat src, Mat * dst)
2107  {
2108  if (src)
2109  {
2110  LibmeshPetscCall(MatDuplicate(src, MAT_COPY_VALUES, dst));
2111  LibmeshPetscCall(MatAssemblyBegin(*dst, MAT_FINAL_ASSEMBLY));
2112  LibmeshPetscCall(MatAssemblyEnd(*dst, MAT_FINAL_ASSEMBLY));
2113  }
2114  else
2115  *dst = NULL;
2116  };
2117 
2118  auto DupVecCopy = [&](Vec src, Vec * dst)
2119  {
2120  LibmeshPetscCall(VecDuplicate(src, dst));
2121  LibmeshPetscCall(VecCopy(src, *dst));
2122  };
2123 
2124  const PetscInt Q = 3; // [mass conservation, axial momentum, cross momentum]
2125 
2126  // small indexer
2127  auto Idx = [&](PetscInt r, PetscInt c) { return Q * r + c; };
2128 
2129  // arrays that MUST be declared before lambdas use them
2130  std::vector<Mat> mat_array(Q * Q, NULL);
2131  std::vector<Vec> vec_array(Q, NULL);
2132 
2133  // generic assembler for one governing equation row in the nested matrix
2134  auto AssembleEquation = [&](PetscInt f,
2135  Mat A0,
2136  Mat A1,
2137  Mat A2, // three blocks in row f (can be nullptr)
2138  Vec rhs, // base RHS for equation f
2139  Vec rhs_add, // optional extra RHS to add (can be nullptr)
2140  const char * label) // e.g. "Mass", "Lin mom", "Cross mom"
2141  {
2142  DupMatAssembled(A0, &mat_array[Idx(f, 0)]);
2143  DupMatAssembled(A1, &mat_array[Idx(f, 1)]);
2144  DupMatAssembled(A2, &mat_array[Idx(f, 2)]);
2145  DupVecCopy(rhs, &vec_array[f]);
2146  if (rhs_add)
2147  LibmeshPetscCall(VecAXPY(vec_array[f], 1.0, rhs_add));
2148  V(std::string(label) + " system assembled");
2149  };
2150 
2151  // -----------------------------------------------------------------------------
2152  // Helper lambda that applies per-equation under-relaxation by modifying BOTH the
2153  // matrix block and the RHS for that equation.
2154  //
2155  // Specifically, with A_ff for the equation and D = diag(A_ff):
2156  // 1) Matrix diagonal scaling: D <- D / alpha, then A_ff's diagonal is replaced
2157  // with D. For alpha < 1 this increases diagonal dominance (more damping).
2158  // 2) RHS blending with the previous solution x_old:
2159  // rhs_f <- rhs_f + (1 - alpha) * (D / alpha) * x_old
2160  // where x_old is provided by the caller via `populate(work)`.
2161  //
2162  // Net effect: the solved x satisfies
2163  // A_ff x = rhs_f_original + ((1 - alpha)/alpha) * D * (x_old - x),
2164  // which damps updates toward x_old without changing the converged solution.
2165  // -----------------------------------------------------------------------------
2166  auto RelaxEquation =
2167  [&](Mat A_ff, Vec rhs_f, Vec like_vec, Vec work, PetscScalar alpha, auto && populate)
2168  {
2169  Vec d = nullptr;
2170  LibmeshPetscCall(VecDuplicate(like_vec, &d));
2171 
2172  // 1) A_ff: diag <- diag / alpha
2173  LibmeshPetscCall(MatGetDiagonal(A_ff, d));
2174  LibmeshPetscCall(VecScale(d, 1.0 / alpha));
2175  LibmeshPetscCall(MatDiagonalSet(A_ff, d, INSERT_VALUES));
2176 
2177  // 2) work <- x_old (caller-provided populator)
2178  LibmeshPetscCall(populate(work));
2179 
2180  // 3) rhs_f += (1 - alpha) * (diag .* work)
2181  LibmeshPetscCall(VecScale(d, (1.0 - alpha)));
2182  LibmeshPetscCall(VecPointwiseMult(work, work, d));
2183  LibmeshPetscCall(VecAXPY(rhs_f, 1.0, work));
2184 
2185  LibmeshPetscCall(VecDestroy(&d));
2186  };
2187 
2188  // indices
2189  const unsigned int first_node = iblock * _block_size + 1;
2190  const unsigned int last_node = (iblock + 1) * _block_size;
2191 
2192  // ---------- assemble per-block operators -----------------
2193  computeSumWij(iblock);
2194  computeMdot(iblock);
2195  computeWijPrime(iblock);
2196  computeDP(iblock);
2197  computeP(iblock);
2198  computeWijResidual(iblock);
2199 
2200  V("Starting nested system.");
2201 
2202  // Populate nested matrix with the individual physics
2203  // equation 0: Mass conservation
2204  AssembleEquation(/*f=*/0,
2205  /*A0=*/_mc_axial_convection_mat,
2206  /*A1=*/nullptr,
2207  /*A2=*/_mc_sumWij_mat,
2208  /*rhs=*/_mc_axial_convection_rhs,
2209  /*rhs_add=*/nullptr,
2210  /*label=*/"Mass");
2211 
2212  // equation 1: Axial momentum conservation
2213  AssembleEquation(/*f=*/1,
2214  /*A0=*/_amc_sys_mdot_mat,
2215  /*A1=*/_amc_pressure_force_mat,
2216  /*A2=*/nullptr,
2217  /*rhs=*/_amc_pressure_force_rhs,
2218  /*rhs_add=*/_amc_sys_mdot_rhs,
2219  /*label=*/"Lin mom");
2220 
2221  // equation 2: Cross momentum conservation
2222  AssembleEquation(/*f=*/2,
2223  /*A0=*/nullptr,
2224  /*A1=*/_cmc_pressure_force_mat,
2225  /*A2=*/_cmc_sys_Wij_mat,
2226  /*rhs=*/_cmc_sys_Wij_rhs,
2227  /*rhs_add=*/_cmc_pressure_force_rhs,
2228  /*label=*/"Cross mom");
2229 
2230  // ========================== Relaxation ====================
2231  if (true)
2232  {
2233  LibmeshPetscCall(populateVectorFromHandle<SolutionHandle>(
2234  _prod, *_mdot_soln, first_node, last_node, _n_channels));
2235 
2236  Vec mdot_estimate;
2237  LibmeshPetscCall(createPetscVector(mdot_estimate, _block_size * _n_channels));
2238  Vec pmat_diag;
2239  LibmeshPetscCall(createPetscVector(pmat_diag, _block_size * _n_channels));
2240  Vec p_estimate;
2241  LibmeshPetscCall(createPetscVector(p_estimate, _block_size * _n_channels));
2242  Vec unity_vec;
2243  LibmeshPetscCall(createPetscVector(unity_vec, _block_size * _n_channels));
2244  LibmeshPetscCall(VecSet(unity_vec, 1.0));
2245  Vec sol_holder_P;
2246  LibmeshPetscCall(createPetscVector(sol_holder_P, _block_size * _n_gaps));
2247  Vec unity_vec_Wij;
2248  LibmeshPetscCall(createPetscVector(unity_vec_Wij, _block_size * _n_gaps));
2249  LibmeshPetscCall(VecSet(unity_vec_Wij, 1.0));
2250  Vec _Wij_loc_vec;
2251  LibmeshPetscCall(createPetscVector(_Wij_loc_vec, _block_size * _n_gaps));
2252  Vec _Wij_old_loc_vec;
2253  LibmeshPetscCall(createPetscVector(_Wij_old_loc_vec, _block_size * _n_gaps));
2254 
2255  // ---- scale estimates ----
2256  // mdot_estimate = A(1,0) * mdot
2257  LibmeshPetscCall(MatMult(mat_array[Q /* (1,0) */], _prod, mdot_estimate));
2258 
2259  // p_estimate = mdot_est / (diag(A(1,1)) + eps)
2260  LibmeshPetscCall(MatGetDiagonal(mat_array[Q + 1], pmat_diag));
2261  LibmeshPetscCall(VecAXPY(pmat_diag, 1e-10, unity_vec));
2262  LibmeshPetscCall(VecPointwiseDivide(p_estimate, mdot_estimate, pmat_diag));
2263 
2264  // sol_holder_P = A(2,1) * p_estimate - rhs_cmc_pressure
2265  LibmeshPetscCall(MatMult(mat_array[2 * Q + 1], p_estimate, sol_holder_P));
2266  LibmeshPetscCall(VecAXPY(sol_holder_P, -1.0, _cmc_pressure_force_rhs));
2267 
2268  // sumWij_loc from sol_holder_P (accumulate)
2269  Vec sumWij_loc;
2270  LibmeshPetscCall(createPetscVector(sumWij_loc, _block_size * _n_channels));
2271  for (unsigned int iz = first_node; iz <= last_node; ++iz)
2272  {
2273  const auto iz_ind = iz - first_node;
2274  for (unsigned int i_ch = 0; i_ch < _n_channels; ++i_ch)
2275  {
2276  PetscScalar sumWij = 0.0;
2277  unsigned int counter = 0;
2278  for (auto i_gap : _subchannel_mesh.getChannelGaps(i_ch))
2279  {
2280  auto chans = _subchannel_mesh.getGapChannels(i_gap);
2281  unsigned int i_ch_loc = chans.first;
2282  PetscInt row_vec = i_ch_loc + _n_channels * iz_ind;
2283  PetscScalar loc_Wij_value;
2284  LibmeshPetscCall(VecGetValues(sol_holder_P, 1, &row_vec, &loc_Wij_value));
2285  sumWij += _subchannel_mesh.getCrossflowSign(i_ch, counter) * loc_Wij_value;
2286  counter++;
2287  }
2288  PetscInt row_vec = i_ch + _n_channels * iz_ind;
2289  LibmeshPetscCall(VecSetValues(sumWij_loc, 1, &row_vec, &sumWij, INSERT_VALUES));
2290  }
2291  }
2292  LibmeshPetscCall(VecAssemblyBegin(sumWij_loc));
2293  LibmeshPetscCall(VecAssemblyEnd(sumWij_loc));
2294 
2295  // ---- robust scale measurements ----
2296  PetscScalar min_mdot;
2297  LibmeshPetscCall(VecAbs(_prod));
2298  LibmeshPetscCall(VecMin(_prod, NULL, &min_mdot));
2299  V("Minimum estimated mdot: " + std::to_string(min_mdot));
2300 
2301  LibmeshPetscCall(VecAbs(sumWij_loc));
2302  LibmeshPetscCall(VecMax(sumWij_loc, NULL, &_max_sumWij));
2303  _max_sumWij = std::max(1e-10, _max_sumWij);
2304  V("Maximum estimated Wij: " + std::to_string(_max_sumWij));
2305 
2307  _Wij_loc_vec, _Wij, first_node, last_node, _n_gaps));
2308  LibmeshPetscCall(VecAbs(_Wij_loc_vec));
2310  _Wij_old_loc_vec, _Wij_old, first_node, last_node, _n_gaps));
2311  LibmeshPetscCall(VecAbs(_Wij_old_loc_vec));
2312  LibmeshPetscCall(VecAXPY(_Wij_loc_vec, -1.0, _Wij_old_loc_vec));
2313 
2314  PetscScalar relax_factor;
2315  LibmeshPetscCall(VecAbs(_Wij_loc_vec));
2316 #if !PETSC_VERSION_LESS_THAN(3, 16, 0)
2317  LibmeshPetscCall(VecMean(_Wij_loc_vec, &relax_factor));
2318 #else
2319  VecSum(_Wij_loc_vec, &relax_factor);
2320  relax_factor /= _block_size * _n_gaps;
2321 #endif
2322  relax_factor = relax_factor / _max_sumWij + 0.5;
2323  V("Relax base value: " + std::to_string(relax_factor));
2324 
2325  // ---- crossflow resistance inflation ----
2326  const PetscScalar resistance_relaxation = 0.9;
2327  _added_K = _max_sumWij / min_mdot;
2328  V("New cross resistance: " + std::to_string(_added_K));
2329  _added_K = (_added_K * resistance_relaxation + (1.0 - resistance_relaxation) * _added_K_old) *
2330  relax_factor;
2331  V("Relaxed cross resistance: " + std::to_string(_added_K));
2332 
2333  // Snap-up lower-bounding
2334  if (_added_K < 10 && _added_K >= 1.0)
2335  _added_K = 1.0;
2336  if (_added_K < 1.0 && _added_K >= 0.1)
2337  _added_K = 0.5;
2338  if (_added_K < 0.1 && _added_K >= 0.01)
2339  _added_K = 1. / 3.;
2340  if (_added_K < 1e-2 && _added_K >= 1e-3)
2341  _added_K = 0.1;
2342  V("Actual added cross resistance: " + std::to_string(_added_K));
2343  LibmeshPetscCall(VecScale(unity_vec_Wij, _added_K));
2345 
2346  LibmeshPetscCall(MatDiagonalSet(mat_array[2 * Q + 2], unity_vec_Wij, ADD_VALUES));
2347 
2348  // ---- cleanup temp vectors used above ----
2349  LibmeshPetscCall(VecDestroy(&mdot_estimate));
2350  LibmeshPetscCall(VecDestroy(&pmat_diag));
2351  LibmeshPetscCall(VecDestroy(&unity_vec));
2352  LibmeshPetscCall(VecDestroy(&p_estimate));
2353  LibmeshPetscCall(VecDestroy(&sol_holder_P));
2354  LibmeshPetscCall(VecDestroy(&unity_vec_Wij));
2355  LibmeshPetscCall(VecDestroy(&sumWij_loc));
2356  LibmeshPetscCall(VecDestroy(&_Wij_loc_vec));
2357  LibmeshPetscCall(VecDestroy(&_Wij_old_loc_vec));
2358 
2359  // ---- per-equation under-relaxation ----
2360  const PetscScalar relaxation_factor_mdot = 1.0;
2361  const PetscScalar relaxation_factor_P = 1.0;
2362  const PetscScalar relaxation_factor_Wij = 0.1;
2363 
2364  V("Relax mdot: " + std::to_string(relaxation_factor_mdot));
2365  V("Relax P: " + std::to_string(relaxation_factor_P));
2366  V("Relax Wij: " + std::to_string(relaxation_factor_Wij));
2367 
2368  // mdot
2369  RelaxEquation(mat_array[Idx(0, 0)],
2370  vec_array[0],
2371  vec_array[0],
2372  _prod,
2373  relaxation_factor_mdot,
2374  [&](Vec dst)
2375  {
2376  return populateVectorFromHandle<SolutionHandle>(
2377  dst, *_mdot_soln, first_node, last_node, _n_channels);
2378  });
2379  V("mdot relaxed");
2380 
2381  // pressure
2382  RelaxEquation(mat_array[Idx(1, 1)],
2383  vec_array[1],
2384  vec_array[1],
2385  _prod,
2386  relaxation_factor_P,
2387  [&](Vec dst)
2388  {
2389  return populateVectorFromHandle<SolutionHandle>(
2390  dst, *_P_soln, first_node, last_node, _n_channels);
2391  });
2392  V("P relaxed");
2393 
2394  // crossflow
2395  RelaxEquation(mat_array[Idx(2, 2)],
2396  vec_array[2],
2397  vec_array[2],
2398  _Wij_vec,
2399  relaxation_factor_Wij,
2400  [&](Vec dst)
2401  {
2402  return populateVectorFromDense<libMesh::DenseMatrix<Real>>(
2403  dst, _Wij, first_node, last_node, _n_gaps);
2404  });
2405  V("Wij relaxed");
2406  }
2407  V("Linear solver relaxed");
2408 
2409  // ======================== Create and configure KSP =========================
2410  Mat A_nest;
2411  Vec b_nest;
2412  Vec x_nest;
2413  LibmeshPetscCall(MatCreateNest(PETSC_COMM_SELF, Q, NULL, Q, NULL, mat_array.data(), &A_nest));
2414  LibmeshPetscCall(VecCreateNest(PETSC_COMM_SELF, Q, NULL, vec_array.data(), &b_nest));
2415  V("Nested system created");
2416 
2417  KSP ksp;
2418  PC pc;
2419  LibmeshPetscCall(KSPCreate(PETSC_COMM_SELF, &ksp));
2420  LibmeshPetscCall(KSPSetType(ksp, KSPFGMRES));
2421  LibmeshPetscCall(KSPSetOperators(ksp, A_nest, A_nest));
2422  LibmeshPetscCall(KSPGetPC(ksp, &pc));
2423  LibmeshPetscCall(PCSetType(pc, PCFIELDSPLIT));
2424  LibmeshPetscCall(KSPSetTolerances(ksp, _rtol, _atol, _dtol, _maxit));
2425 
2426  // split equations
2427  std::vector<IS> rows(Q);
2428  LibmeshPetscCall(MatNestGetISs(A_nest, rows.data(), NULL));
2429  for (PetscInt j = 0; j < Q; ++j)
2430  {
2431  IS part;
2432  LibmeshPetscCall(ISDuplicate(rows[j], &part));
2433  LibmeshPetscCall(PCFieldSplitSetIS(pc, NULL, part));
2434  LibmeshPetscCall(ISDestroy(&part));
2435  }
2436  V("Linear solver assembled");
2437 
2438  // ============================== Solve =====================================
2439  LibmeshPetscCall(VecDuplicate(b_nest, &x_nest));
2440  LibmeshPetscCall(VecSet(x_nest, 0.0));
2441  LibmeshPetscCall(KSPSolve(ksp, b_nest, x_nest));
2442 
2443  // destroy solver containers first
2444  LibmeshPetscCall(VecDestroy(&b_nest));
2445  LibmeshPetscCall(MatDestroy(&A_nest));
2446  LibmeshPetscCall(KSPDestroy(&ksp));
2447  for (PetscInt i = 0; i < Q * Q; i++)
2448  LibmeshPetscCall(MatDestroy(&mat_array[i]));
2449  for (PetscInt i = 0; i < Q; i++)
2450  LibmeshPetscCall(VecDestroy(&vec_array[i]));
2451  V("Solver elements destroyed");
2452 
2453  // ====================== Extract & scatter the solution =====================
2454  Vec sol_mdot, sol_p, sol_Wij;
2455  V("Vectors to hold solution created");
2456  PetscInt num_vecs;
2457  Vec * loc_vecs;
2458  LibmeshPetscCall(VecNestGetSubVecs(x_nest, &num_vecs, &loc_vecs));
2459  LibmeshPetscCall(VecDuplicate(_mc_axial_convection_rhs, &sol_mdot));
2460  LibmeshPetscCall(VecCopy(loc_vecs[0], sol_mdot));
2461  LibmeshPetscCall(VecDuplicate(_amc_sys_mdot_rhs, &sol_p));
2462  LibmeshPetscCall(VecCopy(loc_vecs[1], sol_p));
2463  LibmeshPetscCall(VecDuplicate(_cmc_sys_Wij_rhs, &sol_Wij));
2464  LibmeshPetscCall(VecCopy(loc_vecs[2], sol_Wij));
2465  V("Solution from coupled solver copied to solution vectors");
2466 
2467  // mass flow
2468  LibmeshPetscCall(populateSolutionChan<SolutionHandle>(
2469  sol_mdot, *_mdot_soln, first_node, last_node, _n_channels));
2470 
2471  // pressure
2472  {
2473  PetscScalar * sol_p_array;
2474  LibmeshPetscCall(VecGetArray(sol_p, &sol_p_array));
2475  for (unsigned int iz = last_node; iz > first_node - 1; iz--)
2476  {
2477  const auto iz_ind = iz - first_node;
2478  for (unsigned int i_ch = 0; i_ch < _n_channels; i_ch++)
2479  {
2480  auto * node_in = _subchannel_mesh.getChannelNode(i_ch, iz - 1);
2481  PetscScalar value = sol_p_array[iz_ind * _n_channels + i_ch];
2482  _P_soln->set(node_in, value);
2483  }
2484  }
2485  LibmeshPetscCall(VecRestoreArray(sol_p, &sol_p_array));
2486  }
2487 
2488  // crossflow dense + sumWij + correction factor
2490  sol_Wij, _Wij, first_node, last_node, _n_gaps));
2491 
2492  LibmeshPetscCall(MatMult(_mc_sumWij_mat, sol_Wij, _prod));
2493  LibmeshPetscCall(populateSolutionChan<SolutionHandle>(
2494  _prod, *_SumWij_soln, first_node, last_node, _n_channels));
2495 
2496  LibmeshPetscCall(VecAbs(_prod));
2497  LibmeshPetscCall(VecMax(_prod, NULL, &_max_sumWij_new));
2498  V("Maximum estimated Wij new: " + std::to_string(_max_sumWij_new));
2500  V("Correction factor: " + std::to_string(_correction_factor));
2501  V("Solutions assigned to MOOSE variables.");
2502 
2503  // cleanup solution objects
2504  LibmeshPetscCall(VecDestroy(&x_nest));
2505  LibmeshPetscCall(VecDestroy(&sol_mdot));
2506  LibmeshPetscCall(VecDestroy(&sol_p));
2507  LibmeshPetscCall(VecDestroy(&sol_Wij));
2508  V("Solutions destroyed.");
2509 
2510  PetscFunctionReturn(LIBMESH_PETSC_SUCCESS);
2511 }
Mat _amc_sys_mdot_mat
Axial momentum system matrix.
void computeSumWij(int iblock)
Computes net diversion crossflow per channel for block iblock.
const PetscReal & _dtol
The divergence tolerance for the ksp linear solver.
void computeP(int iblock)
Computes Pressure per channel for block iblock.
libMesh::DenseMatrix< Real > _Wij_old
void computeMdot(int iblock)
Computes mass flow per channel for block iblock.
PetscScalar _added_K
Added resistances for monolithic convergence.
PetscErrorCode createPetscVector(Vec &v, PetscInt n)
Petsc Functions.
PetscFunctionBegin
Mat _cmc_sys_Wij_mat
Lateral momentum system matrix.
virtual const std::vector< unsigned int > & getChannelGaps(unsigned int i_chan) const =0
Return a vector of gap indices for a given channel index.
Mat _mc_sumWij_mat
Matrices and vectors to be used in implicit assembly Mass conservation Mass conservation - sum of cro...
PetscErrorCode populateVectorFromDense(Vec &x, const T &solution, const unsigned int first_axial_level, const unsigned int last_axial_level, const unsigned int cross_dimension)
Mat _amc_pressure_force_mat
Axial momentum conservation - pressure force.
Real value(unsigned n, unsigned alpha, unsigned beta, Real x)
void computeWijResidual(int iblock)
Computes Residual Matrix based on the lateral momentum conservation equation for block iblock...
Real f(Real x)
Test function for Brents method.
const PetscReal & _atol
The absolute convergence tolerance for the ksp linear solver.
Mat _mc_axial_convection_mat
Mass conservation - axial convection.
const PetscInt & _maxit
The maximum number of iterations to use for the ksp linear solver.
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.
std::unique_ptr< SolutionHandle > _mdot_soln
Solutions handles and link to TH tables properties.
PetscErrorCode populateDenseFromVector(const Vec &x, T &solution, const unsigned int first_axial_level, const unsigned int last_axial_level, const unsigned int cross_dimension)
const PetscReal & _rtol
The relative convergence tolerance, (relative decrease) for the ksp linear solver.
libMesh::DenseMatrix< Real > & _Wij
void computeWijPrime(int iblock)
Computes turbulent crossflow per gap for block iblock.
static const std::string alpha
Definition: NS.h:138
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.
std::unique_ptr< SolutionHandle > _SumWij_soln
const bool _verbose_subchannel
Boolean to printout information related to subchannel solve.
static const std::complex< double > j(0, 1)
Complex number "j" (also known as "i")
const ConsoleStream _console
void computeDP(int iblock)
Computes Pressure Drop per channel for block iblock.
PetscFunctionReturn(LIBMESH_PETSC_SUCCESS)
Mat _cmc_pressure_force_mat
Cross momentum conservation - pressure force.
std::unique_ptr< SolutionHandle > _P_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.

◆ initializeSolution()

void TriSubChannel1PhaseProblem::initializeSolution ( )
overrideprotectedvirtual

Function to initialize the solution & geometry fields.

Implements SubChannel1PhaseProblem.

Definition at line 69 of file TriSubChannel1PhaseProblem.C.

70 {
72 
73  if (_deformation)
74  {
75  // update surface area, wetted perimeter based on: Dpin, displacement
76  Real standard_area, wire_area, additional_area, wetted_perimeter, displaced_area;
77  auto flat_to_flat = _tri_sch_mesh.getFlatToFlat();
78  auto n_rings = _tri_sch_mesh.getNumOfRings();
80  auto pin_diameter = _subchannel_mesh.getPinDiameter();
81  auto wire_diameter = _tri_sch_mesh.getWireDiameter();
82  auto wire_lead_length = _tri_sch_mesh.getWireLeadLength();
83  auto gap = _tri_sch_mesh.getDuctToPinGap();
84  auto z_blockage = _subchannel_mesh.getZBlockage();
85  auto index_blockage = _subchannel_mesh.getIndexBlockage();
86  auto reduction_blockage = _subchannel_mesh.getReductionBlockage();
87  auto theta =
88  std::acos(wire_lead_length /
89  std::sqrt(Utility::pow<2>(wire_lead_length) +
90  Utility::pow<2>(libMesh::pi * (pin_diameter + wire_diameter))));
91  for (unsigned int iz = 0; iz < _n_cells + 1; iz++)
92  {
93  for (unsigned int i_ch = 0; i_ch < _n_channels; i_ch++)
94  {
95  auto subch_type = _subchannel_mesh.getSubchannelType(i_ch);
96  auto * node = _subchannel_mesh.getChannelNode(i_ch, iz);
97  auto Z = _z_grid[iz];
98  Real rod_area = 0.0;
99  Real rod_perimeter = 0.0;
100  for (auto i_pin : _subchannel_mesh.getChannelPins(i_ch))
101  {
102  auto * pin_node = _subchannel_mesh.getPinNode(i_pin, iz);
103  if (subch_type == EChannelType::CENTER || subch_type == EChannelType::CORNER)
104  {
105  rod_area +=
106  (1.0 / 6.0) * 0.25 * M_PI * (*_Dpin_soln)(pin_node) * (*_Dpin_soln)(pin_node);
107  rod_perimeter += (1.0 / 6.0) * M_PI * (*_Dpin_soln)(pin_node);
108  }
109  else
110  {
111  rod_area +=
112  (1.0 / 4.0) * 0.25 * M_PI * (*_Dpin_soln)(pin_node) * (*_Dpin_soln)(pin_node);
113  rod_perimeter += (1.0 / 4.0) * M_PI * (*_Dpin_soln)(pin_node);
114  }
115  }
116 
117  if (subch_type == EChannelType::CENTER)
118  {
119  standard_area = Utility::pow<2>(pitch) * std::sqrt(3.0) / 4.0;
120  additional_area = 0.0;
121  displaced_area = 0.0;
122  wire_area = libMesh::pi * Utility::pow<2>(wire_diameter) / 8.0 / std::cos(theta);
123  wetted_perimeter = rod_perimeter + 0.5 * libMesh::pi * wire_diameter / std::cos(theta);
124  }
125  else if (subch_type == EChannelType::EDGE)
126  {
127  standard_area = pitch * (pin_diameter / 2.0 + gap);
128  additional_area = 0.0;
129  displaced_area = (*_displacement_soln)(node)*pitch;
130  wire_area = libMesh::pi * Utility::pow<2>(wire_diameter) / 8.0 / std::cos(theta);
131  wetted_perimeter =
132  rod_perimeter + 0.5 * libMesh::pi * wire_diameter / std::cos(theta) + pitch;
133  }
134  else
135  {
136  standard_area = 1.0 / std::sqrt(3.0) * Utility::pow<2>(pin_diameter / 2.0 + gap);
137  additional_area = 0.0;
138  displaced_area = 1.0 / std::sqrt(3.0) *
139  (pin_diameter + 2.0 * gap + (*_displacement_soln)(node)) *
140  (*_displacement_soln)(node);
141  wire_area = libMesh::pi / 24.0 * Utility::pow<2>(wire_diameter) / std::cos(theta);
142  wetted_perimeter =
143  rod_perimeter + libMesh::pi * wire_diameter / std::cos(theta) / 6.0 +
144  2.0 / std::sqrt(3.0) * (pin_diameter / 2.0 + gap + (*_displacement_soln)(node));
145  }
146 
147  // Calculate subchannel area
148  auto subchannel_area =
149  standard_area + additional_area + displaced_area - rod_area - wire_area;
150 
151  // Correct subchannel area and wetted perimeter in case of overlapping pins
152  auto overlapping_pin_area = 0.0;
153  auto overlapping_wetted_perimeter = 0.0;
154  for (auto i_gap : _subchannel_mesh.getChannelGaps(i_ch))
155  {
156  auto gap_pins = _subchannel_mesh.getGapPins(i_gap);
157  auto pin_1 = gap_pins.first;
158  auto pin_2 = gap_pins.second;
159  auto * pin_node_1 = _subchannel_mesh.getPinNode(pin_1, iz);
160  auto * pin_node_2 = _subchannel_mesh.getPinNode(pin_2, iz);
161  auto Diameter1 = (*_Dpin_soln)(pin_node_1);
162  auto Radius1 = Diameter1 / 2.0;
163  auto Diameter2 = (*_Dpin_soln)(pin_node_2);
164  auto Radius2 = Diameter2 / 2.0;
166 
167  if (pitch < (Radius1 + Radius2)) // overlapping pins
168  {
169  mooseWarning(" The gap of index : '", i_gap, " at axial cell ", iz, " ' is blocked.");
170  auto cos1 =
171  (pitch * pitch + Radius1 * Radius1 - Radius2 * Radius2) / (2 * pitch * Radius1);
172  auto cos2 =
173  (pitch * pitch + Radius2 * Radius2 - Radius1 * Radius1) / (2 * pitch * Radius2);
174  auto angle1 = 2.0 * acos(cos1);
175  auto angle2 = 2.0 * acos(cos2);
176  // half of the intersecting arc-length
177  overlapping_wetted_perimeter += 0.5 * angle1 * Radius1 + 0.5 * angle2 * Radius2;
178  // Half of the overlapping area
179  overlapping_pin_area +=
180  0.5 * Radius1 * Radius1 * acos(cos1) + 0.5 * Radius2 * Radius2 * acos(cos2) -
181  0.25 * sqrt((-pitch + Radius1 + Radius2) * (pitch + Radius1 - Radius2) *
182  (pitch - Radius1 + Radius2) * (pitch + Radius1 + Radius2));
183  }
184  }
185  subchannel_area += overlapping_pin_area; // correct surface area
186  wetted_perimeter += -overlapping_wetted_perimeter; // correct wetted perimeter
187 
188  // Apply area reduction on subchannels affected by blockage
189  auto index = 0;
190  for (const auto & i_blockage : index_blockage)
191  {
192  if (i_ch == i_blockage && (Z >= z_blockage.front() && Z <= z_blockage.back()))
193  {
194  subchannel_area *= reduction_blockage[index];
195  }
196  index++;
197  }
198  _S_flow_soln->set(node, subchannel_area);
199  _w_perim_soln->set(node, wetted_perimeter);
200  }
201  }
202  // update map of gap between pins (gij) based on: Dpin, displacement
203  for (unsigned int iz = 0; iz < _n_cells + 1; iz++)
204  {
205  for (unsigned int i_gap = 0; i_gap < _n_gaps; i_gap++)
206  {
207  auto gap_pins = _subchannel_mesh.getGapPins(i_gap);
208  auto pin_1 = gap_pins.first;
209  auto pin_2 = gap_pins.second;
210  auto * pin_node_1 = _subchannel_mesh.getPinNode(pin_1, iz);
211  auto * pin_node_2 = _subchannel_mesh.getPinNode(pin_2, iz);
212 
213  if (pin_1 == pin_2) // Corner or edge gap
214  {
215  auto displacement = 0.0;
216  auto counter = 0.0;
217  for (auto i_ch : _subchannel_mesh.getPinChannels(pin_1))
218  {
219  auto subch_type = _subchannel_mesh.getSubchannelType(i_ch);
220  auto * node = _subchannel_mesh.getChannelNode(i_ch, iz);
221  if (subch_type == EChannelType::EDGE || subch_type == EChannelType::CORNER)
222  {
223  displacement += (*_displacement_soln)(node);
224  counter += 1.0;
225  }
226  }
227  displacement = displacement / counter;
229  i_gap,
230  0.5 * (flat_to_flat - (n_rings - 1) * pitch * std::sqrt(3.0) -
231  (*_Dpin_soln)(pin_node_1)) +
232  displacement);
233  }
234  else // center gap
235  {
237  iz, i_gap, pitch - (*_Dpin_soln)(pin_node_1) / 2.0 - (*_Dpin_soln)(pin_node_2) / 2.0);
238  }
239  // if pins come in contact, the gap is zero
240  if (_tri_sch_mesh.getGapWidth(iz, i_gap) <= 0.0)
241  _tri_sch_mesh.setGapWidth(iz, i_gap, 0.0);
242  }
243  }
244  }
245 
246  for (unsigned int iz = 1; iz < _n_cells + 1; iz++)
247  {
248  for (unsigned int i_ch = 0; i_ch < _n_channels; i_ch++)
249  {
250  auto * node_out = _subchannel_mesh.getChannelNode(i_ch, iz);
251  auto * node_in = _subchannel_mesh.getChannelNode(i_ch, iz - 1);
252  _mdot_soln->set(node_out, (*_mdot_soln)(node_in));
253  }
254  }
255 
256  // We must do a global assembly to make sure data is parallel consistent before we do things
257  // like compute L2 norms
258  _aux->solution().close();
259 }
const Real & getWireDiameter() const
Return wire diameter.
virtual const std::pair< unsigned int, unsigned int > & getGapPins(unsigned int i_gap) const =0
Return a pair of pin indices for a given gap index.
virtual const Real & getPinDiameter() const
Return undeformed Pin diameter.
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 setGapWidth(unsigned int axial_index, unsigned int gap_index, Real gap_width)
Set the gap width for a given axial cell and gap index.
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 const Real & getPitch() const
Return the undeformed pitch between 2 subchannels.
virtual EChannelType getSubchannelType(unsigned int index) const =0
Return the type of the subchannel for given subchannel index.
std::unique_ptr< SolutionHandle > _S_flow_soln
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.
virtual const std::vector< unsigned int > & getChannelGaps(unsigned int i_chan) const =0
Return a vector of gap indices for a given channel index.
const unsigned int & getNumOfRings() const
Return the number of fuel-pin rings, counting the center pin as the first ring.
const Real & getDuctToPinGap() const
Return the the gap thickness between the duct and peripheral fuel pins.
std::vector< Real > _z_grid
axial location of nodes
static const std::string pitch
std::shared_ptr< AuxiliarySystem > _aux
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.
std::unique_ptr< SolutionHandle > _Dpin_soln
bool _deformation
Flag that activates the effect of deformation (pin/duct) based on the auxvalues for displacement...
virtual const std::vector< Real > & getReductionBlockage() const
Get area reduction of blocked subchannels.
std::unique_ptr< SolutionHandle > _mdot_soln
Solutions handles and link to TH tables properties.
const Real & getFlatToFlat() const
Return flat to flat [m].
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
virtual const std::vector< Real > & getZBlockage() const
Get axial location of blockage (in,out) [m].
CTSub CT_OPERATOR_BINARY CTMul CTCompareLess CTCompareGreater CTCompareEqual _arg template * sqrt(_arg)) *_arg.template D< dtag >()) CT_SIMPLE_UNARY_FUNCTION(tanh
void detectDeformation()
Detects whether pin diameter or duct displacement fields require geometry recalculation.
Real getGapWidth(unsigned int axial_index, unsigned int gap_index) const override
Return gap width for a given gap index.
void mooseWarning(Args &&... args) const
virtual const std::vector< unsigned int > & getIndexBlockage() const
Get index of blocked subchannels.
const Real & getWireLeadLength() const
Return the wire lead length.
std::unique_ptr< SolutionHandle > _w_perim_soln
const Real pi

◆ initialSetup()

void SubChannel1PhaseProblem::initialSetup ( )
overridevirtualinherited

Set value for turbulent momentum modeling parameter CT

Reimplemented from ExternalProblem.

Definition at line 285 of file SubChannel1PhaseProblem.C.

286 {
288 
289  _fp = &getUserObject<SinglePhaseFluidProperties>(getParam<UserObjectName>("fp"));
291  &getUserObject<SCMFrictionClosureBase>(getParam<UserObjectName>("friction_closure"));
293  &getUserObject<SCMMixingClosureBase>(getParam<UserObjectName>("mixing_closure"));
294 
297 
298  // Create variables for output and storage
299  _mdot_soln = std::make_unique<SolutionHandle>(getVariable(0, SubChannelApp::MASS_FLOW_RATE));
300  _SumWij_soln = std::make_unique<SolutionHandle>(getVariable(0, SubChannelApp::SUM_CROSSFLOW));
301  _P_soln = std::make_unique<SolutionHandle>(getVariable(0, SubChannelApp::PRESSURE));
302  if (getParam<bool>("full_output"))
303  {
304  _DP_soln = std::make_unique<SolutionHandle>(getVariable(0, SubChannelApp::PRESSURE_DROP));
305  _ff_soln = std::make_unique<SolutionHandle>(getVariable(0, SubChannelApp::FRICTION_FACTOR));
306  }
307  _h_soln = std::make_unique<SolutionHandle>(getVariable(0, SubChannelApp::ENTHALPY));
308  _T_soln = std::make_unique<SolutionHandle>(getVariable(0, SubChannelApp::TEMPERATURE));
309  if (_pin_mesh_exist)
310  {
311  _Tpin_soln = std::make_unique<SolutionHandle>(getVariable(0, SubChannelApp::PIN_TEMPERATURE));
312  _Dpin_soln = std::make_unique<SolutionHandle>(getVariable(0, SubChannelApp::PIN_DIAMETER));
313  _HTC_soln =
314  std::make_unique<SolutionHandle>(getVariable(0, SubChannelApp::HEAT_TRANSFER_COEFFICIENT));
316  &getUserObject<SCMHTCClosureBase>(getParam<UserObjectName>("pin_HTC_closure"));
317  }
318  _rho_soln = std::make_unique<SolutionHandle>(getVariable(0, SubChannelApp::DENSITY));
319  _mu_soln = std::make_unique<SolutionHandle>(getVariable(0, SubChannelApp::VISCOSITY));
320  _S_flow_soln = std::make_unique<SolutionHandle>(getVariable(0, SubChannelApp::SURFACE_AREA));
321  _w_perim_soln = std::make_unique<SolutionHandle>(getVariable(0, SubChannelApp::WETTED_PERIMETER));
322  _q_prime_soln = std::make_unique<SolutionHandle>(getVariable(0, SubChannelApp::LINEAR_HEAT_RATE));
324  std::make_unique<SolutionHandle>(getVariable(0, SubChannelApp::DISPLACEMENT));
325  if (_duct_mesh_exist)
326  {
328  std::make_unique<SolutionHandle>(getVariable(0, SubChannelApp::DUCT_HEAT_FLUX));
329  _Tduct_soln = std::make_unique<SolutionHandle>(getVariable(0, SubChannelApp::DUCT_TEMPERATURE));
331  &getUserObject<SCMHTCClosureBase>(getParam<UserObjectName>("duct_HTC_closure"));
332  }
333 }
static const std::string PRESSURE_DROP
Definition: SubChannelApp.h:32
static const std::string FRICTION_FACTOR
Definition: SubChannelApp.h:44
static const std::string MASS_FLOW_RATE
Definition: SubChannelApp.h:28
const bool _pin_mesh_exist
Flag that informs if there is a pin mesh or not.
std::unique_ptr< SolutionHandle > _Tduct_soln
std::unique_ptr< SolutionHandle > _duct_heat_flux_soln
static const std::string DENSITY
Definition: SubChannelApp.h:37
std::unique_ptr< SolutionHandle > _T_soln
std::unique_ptr< SolutionHandle > _h_soln
std::unique_ptr< SolutionHandle > _S_flow_soln
const SCMHTCClosureBase * _pin_HTC_closure
HTC closure objects.
static const std::string PIN_DIAMETER
Definition: SubChannelApp.h:36
const SCMMixingClosureBase * _mixing_closure
Turbulent Mixing closure object.
const bool _duct_mesh_exist
Flag that informs if there is a duct mesh or not.
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
static const std::string DUCT_HEAT_FLUX
Definition: SubChannelApp.h:41
static const std::string DUCT_TEMPERATURE
Definition: SubChannelApp.h:42
const SCMHTCClosureBase * _duct_HTC_closure
static const std::string WETTED_PERIMETER
Definition: SubChannelApp.h:39
std::unique_ptr< SolutionHandle > _rho_soln
static const std::string VISCOSITY
Definition: SubChannelApp.h:38
std::unique_ptr< SolutionHandle > _HTC_soln
static const std::string PIN_TEMPERATURE
Definition: SubChannelApp.h:35
static const std::string LINEAR_HEAT_RATE
Definition: SubChannelApp.h:40
std::unique_ptr< SolutionHandle > _q_prime_soln
static const std::string ENTHALPY
Definition: SubChannelApp.h:33
void initialSetup() override
virtual Real getCT() const
Return the Turbulent modeling parameter.
const SCMFrictionClosureBase * _friction_closure
Friction closure object.
std::unique_ptr< SolutionHandle > _Dpin_soln
std::unique_ptr< SolutionHandle > _mdot_soln
Solutions handles and link to TH tables properties.
static const std::string SUM_CROSSFLOW
Definition: SubChannelApp.h:30
std::unique_ptr< SolutionHandle > _displacement_soln
std::unique_ptr< SolutionHandle > _DP_soln
static const std::string PRESSURE
Definition: SubChannelApp.h:31
std::unique_ptr< SolutionHandle > _SumWij_soln
static const std::string SURFACE_AREA
Definition: SubChannelApp.h:29
Real _CT
Turbulent modeling parameter used in axial momentum equation.
std::unique_ptr< SolutionHandle > _ff_soln
static const std::string HEAT_TRANSFER_COEFFICIENT
Definition: SubChannelApp.h:45
static const std::string DISPLACEMENT
Definition: SubChannelApp.h:43
static const std::string TEMPERATURE
Definition: SubChannelApp.h:34
std::unique_ptr< SolutionHandle > _P_soln
std::unique_ptr< SolutionHandle > _w_perim_soln
const SinglePhaseFluidProperties * _fp
Non-owning pointer to fluid properties user object.
std::unique_ptr< SolutionHandle > _mu_soln
std::unique_ptr< SolutionHandle > _Tpin_soln

◆ 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 1965 of file SubChannel1PhaseProblem.C.

Referenced by SubChannel1PhaseProblem::computeWijFromSolve().

1968 {
1969  SNES snes;
1970  KSP ksp;
1971  PC pc;
1972  Vec x, r;
1973  PetscScalar * xx;
1974 
1976  LibmeshPetscCall(SNESCreate(PETSC_COMM_SELF, &snes));
1977  LibmeshPetscCall(VecCreate(PETSC_COMM_SELF, &x));
1978  LibmeshPetscCall(VecSetSizes(x, PETSC_DECIDE, _block_size * _n_gaps));
1979  LibmeshPetscCall(VecSetFromOptions(x));
1980  LibmeshPetscCall(VecDuplicate(x, &r));
1981 
1982 #if PETSC_VERSION_LESS_THAN(3, 13, 0)
1983  LibmeshPetscCall(PetscOptionsSetValue(PETSC_NULL, "-snes_mf", PETSC_NULL));
1984 #else
1985  LibmeshPetscCall(SNESSetUseMatrixFree(snes, PETSC_FALSE, PETSC_TRUE));
1986 #endif
1987  Ctx ctx;
1988  ctx.iblock = iblock;
1989  ctx.schp = this;
1990  LibmeshPetscCall(SNESSetFunction(snes, r, formFunction, &ctx));
1991  LibmeshPetscCall(SNESGetKSP(snes, &ksp));
1992  LibmeshPetscCall(KSPGetPC(ksp, &pc));
1993  LibmeshPetscCall(PCSetType(pc, PCNONE));
1994  LibmeshPetscCall(KSPSetTolerances(ksp, _rtol, _atol, _dtol, _maxit));
1995  LibmeshPetscCall(SNESSetFromOptions(snes));
1996  LibmeshPetscCall(VecGetArray(x, &xx));
1997  for (unsigned int i = 0; i < _block_size * _n_gaps; i++)
1998  {
1999  xx[i] = solution(i);
2000  }
2001  LibmeshPetscCall(VecRestoreArray(x, &xx));
2002 
2003  LibmeshPetscCall(SNESSolve(snes, NULL, x));
2004  LibmeshPetscCall(VecGetArray(x, &xx));
2005  for (unsigned int i = 0; i < _block_size * _n_gaps; i++)
2006  root(i) = xx[i];
2007 
2008  LibmeshPetscCall(VecRestoreArray(x, &xx));
2009  LibmeshPetscCall(VecDestroy(&x));
2010  LibmeshPetscCall(VecDestroy(&r));
2011  LibmeshPetscCall(SNESDestroy(&snes));
2012  PetscFunctionReturn(LIBMESH_PETSC_SUCCESS);
2013 }
const PetscReal & _dtol
The divergence tolerance for the ksp linear solver.
PetscFunctionBegin
const std::vector< double > x
const PetscReal & _atol
The absolute convergence tolerance for the ksp linear solver.
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&#39;s method.
Definition: BrentsMethod.C:66
const PetscInt & _maxit
The maximum number of iterations to use for the ksp linear solver.
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.
const PetscReal & _rtol
The relative convergence tolerance, (relative decrease) for the ksp linear solver.
void * ctx
PetscFunctionReturn(LIBMESH_PETSC_SUCCESS)

◆ 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 420 of file SubChannel1PhaseProblem.h.

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

425 {
426  PetscScalar * xx;
427 
429  LibmeshPetscCall(VecGetArray(x, &xx));
430  for (unsigned int iz = first_axial_level; iz < last_axial_level + 1; iz++)
431  {
432  unsigned int iz_ind = iz - first_axial_level;
433  for (unsigned int i_l = 0; i_l < cross_dimension; i_l++)
434  {
435  loc_solution(i_l, iz) = xx[iz_ind * cross_dimension + i_l];
436  }
437  }
438  LibmeshPetscCall(VecRestoreArray(x, &xx));
439 
440  PetscFunctionReturn(LIBMESH_PETSC_SUCCESS);
441 }
PetscFunctionBegin
const std::vector< double > x
PetscFunctionReturn(LIBMESH_PETSC_SUCCESS)

◆ 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 494 of file SubChannel1PhaseProblem.h.

499 {
500  PetscScalar * xx;
502  LibmeshPetscCall(VecGetArray(x, &xx));
503  Node * loc_node;
504  for (unsigned int iz = first_axial_level; iz < last_axial_level + 1; iz++)
505  {
506  unsigned int iz_ind = iz - first_axial_level;
507  for (unsigned int i_l = 0; i_l < cross_dimension; i_l++)
508  {
509  loc_node = _subchannel_mesh.getChannelNode(i_l, iz);
510  loc_solution.set(loc_node, xx[iz_ind * cross_dimension + i_l]);
511  }
512  }
513  PetscFunctionReturn(LIBMESH_PETSC_SUCCESS);
514 }
PetscFunctionBegin
const std::vector< double > x
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.
PetscFunctionReturn(LIBMESH_PETSC_SUCCESS)

◆ 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 471 of file SubChannel1PhaseProblem.h.

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

476 {
477  PetscScalar * xx;
479  LibmeshPetscCall(VecGetArray(x, &xx));
480  for (unsigned int iz = first_axial_level; iz < last_axial_level + 1; iz++)
481  {
482  unsigned int iz_ind = iz - first_axial_level;
483  for (unsigned int i_l = 0; i_l < cross_dimension; i_l++)
484  {
485  xx[iz_ind * cross_dimension + i_l] = loc_solution(i_l, iz);
486  }
487  }
488  LibmeshPetscCall(VecRestoreArray(x, &xx));
489  PetscFunctionReturn(LIBMESH_PETSC_SUCCESS);
490 }
PetscFunctionBegin
const std::vector< double > x
PetscFunctionReturn(LIBMESH_PETSC_SUCCESS)

◆ 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 445 of file SubChannel1PhaseProblem.h.

450 {
451  PetscScalar * xx;
452 
454  LibmeshPetscCall(VecGetArray(x, &xx));
455  for (unsigned int iz = first_axial_level; iz < last_axial_level + 1; iz++)
456  {
457  unsigned int iz_ind = iz - first_axial_level;
458  for (unsigned int i_l = 0; i_l < cross_dimension; i_l++)
459  {
460  auto * loc_node = _subchannel_mesh.getChannelNode(i_l, iz);
461  xx[iz_ind * cross_dimension + i_l] = loc_solution(loc_node);
462  }
463  }
464  LibmeshPetscCall(VecRestoreArray(x, &xx));
465 
466  PetscFunctionReturn(LIBMESH_PETSC_SUCCESS);
467 }
PetscFunctionBegin
const std::vector< double > x
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.
PetscFunctionReturn(LIBMESH_PETSC_SUCCESS)

◆ 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 1923 of file SubChannel1PhaseProblem.C.

Referenced by formFunction().

1924 {
1925  const unsigned int last_node = (iblock + 1) * _block_size;
1926  const unsigned int first_node = iblock * _block_size + 1;
1927  libMesh::DenseVector<Real> Wij_residual_vector(_n_gaps * _block_size, 0.0);
1928  // Assign the solution to the cross-flow matrix
1929  int i = 0;
1930  for (unsigned int iz = first_node; iz < last_node + 1; iz++)
1931  {
1932  for (unsigned int i_gap = 0; i_gap < _n_gaps; i_gap++)
1933  {
1934  _Wij(i_gap, iz) = solution(i);
1935  i++;
1936  }
1937  }
1938 
1939  // Calculating sum of crossflows
1940  computeSumWij(iblock);
1941  // Solving axial flux
1942  computeMdot(iblock);
1943  // Calculation of turbulent Crossflow
1944  computeWijPrime(iblock);
1945  // Solving for Pressure Drop
1946  computeDP(iblock);
1947  // Solving for pressure
1948  computeP(iblock);
1949  // Populating lateral crossflow residual matrix
1950  computeWijResidual(iblock);
1951 
1952  // Turn the residual matrix into a residual vector
1953  for (unsigned int iz = 0; iz < _block_size; iz++)
1954  {
1955  for (unsigned int i_gap = 0; i_gap < _n_gaps; i_gap++)
1956  {
1957  int i = _n_gaps * iz + i_gap; // column wise transfer
1958  Wij_residual_vector(i) = _Wij_residual_matrix(i_gap, iz);
1959  }
1960  }
1961  return Wij_residual_vector;
1962 }
void computeSumWij(int iblock)
Computes net diversion crossflow per channel for block iblock.
void computeP(int iblock)
Computes Pressure per channel for block iblock.
void computeMdot(int iblock)
Computes mass flow per channel for block iblock.
void computeWijResidual(int iblock)
Computes Residual Matrix based on the lateral momentum conservation equation for block iblock...
libMesh::DenseMatrix< Real > _Wij_residual_matrix
libMesh::DenseMatrix< Real > & _Wij
void computeWijPrime(int iblock)
Computes turbulent crossflow per gap for block iblock.
void computeDP(int iblock)
Computes Pressure Drop per channel for block iblock.

◆ 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 2016 of file SubChannel1PhaseProblem.C.

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

2018 {
2020 
2021  // Create solution vector with rhs layout
2022  Vec x = nullptr;
2023  LibmeshPetscCall(VecDuplicate(rhs, &x));
2024 
2025  // KSP setup
2026  KSP ksp = nullptr;
2027  PC pc = nullptr;
2028  LibmeshPetscCall(KSPCreate(PETSC_COMM_SELF, &ksp));
2029  LibmeshPetscCall(KSPSetOperators(ksp, A, A));
2030  LibmeshPetscCall(KSPGetPC(ksp, &pc));
2031  LibmeshPetscCall(PCSetType(pc, PCJACOBI));
2032  LibmeshPetscCall(KSPSetTolerances(ksp, _rtol, _atol, _dtol, _maxit));
2033  if (ksp_prefix && *ksp_prefix)
2034  LibmeshPetscCall(KSPSetOptionsPrefix(ksp, ksp_prefix));
2035  LibmeshPetscCall(KSPSetFromOptions(ksp));
2036 
2037  // Solve
2038  LibmeshPetscCall(KSPSolve(ksp, rhs, x));
2039 
2040  // Scatter to _h_soln with sanity checks
2041  PetscScalar * xx = nullptr;
2042  LibmeshPetscCall(VecGetArray(x, &xx));
2043  for (unsigned int iz = first_node; iz <= last_node; ++iz)
2044  {
2045  const unsigned int iz_ind = iz - first_node;
2046  for (unsigned int i_ch = 0; i_ch < _n_channels; ++i_ch)
2047  {
2048  auto * node_out = _subchannel_mesh.getChannelNode(i_ch, iz);
2049  const PetscScalar h_out = xx[iz_ind * _n_channels + i_ch];
2050  if (h_out < 0.0)
2051  mooseError(
2052  name(), " : Calculation of negative Enthalpy h_out = ", h_out, " Axial Level = ", iz);
2053  _h_soln->set(node_out, h_out);
2054  }
2055  }
2056  LibmeshPetscCall(VecRestoreArray(x, &xx));
2057 
2058  // Cleanup
2059  LibmeshPetscCall(KSPDestroy(&ksp));
2060  LibmeshPetscCall(VecDestroy(&x));
2061 
2062  PetscFunctionReturn(LIBMESH_PETSC_SUCCESS);
2063 }
std::unique_ptr< SolutionHandle > _h_soln
const PetscReal & _dtol
The divergence tolerance for the ksp linear solver.
PetscFunctionBegin
const std::string & name() const
const std::vector< double > x
const PetscReal & _atol
The absolute convergence tolerance for the ksp linear solver.
const PetscInt & _maxit
The maximum number of iterations to use for the ksp linear solver.
virtual Node * getChannelNode(unsigned int i_chan, unsigned int iz) const =0
Get the subchannel mesh node for a given channel index and elevation index.
const PetscReal & _rtol
The relative convergence tolerance, (relative decrease) for the ksp linear solver.
void mooseError(Args &&... args) const
PetscFunctionReturn(LIBMESH_PETSC_SUCCESS)

◆ solverSystemConverged()

bool SubChannel1PhaseProblem::solverSystemConverged ( const unsigned int  )
overridevirtualinherited

Reimplemented from ExternalProblem.

Definition at line 433 of file SubChannel1PhaseProblem.C.

434 {
435  return _converged;
436 }
bool _converged
Variable that informs whether we exited external solve with a converged solution or not...

◆ syncSolutions()

void SubChannel1PhaseProblem::syncSolutions ( Direction  direction)
overridevirtualinherited

Implements ExternalProblem.

Definition at line 2809 of file SubChannel1PhaseProblem.C.

2810 {
2811 }

◆ validParams()

InputParameters TriSubChannel1PhaseProblem::validParams ( )
static

Definition at line 23 of file TriSubChannel1PhaseProblem.C.

24 {
26  params.addClassDescription("Solver class for subchannels in a triangular lattice assembly and "
27  "bare/wire-wrapped fuel pins");
28  return params;
29 }
static InputParameters validParams()
void addClassDescription(const std::string &doc_string)

Member Data Documentation

◆ _added_K

PetscScalar SubChannel1PhaseProblem::_added_K = 0.0
protectedinherited

Added resistances for monolithic convergence.

Definition at line 408 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 356 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 359 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 362 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 366 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 353 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

Mass conservation - density time derivative No implicit matrix.

Axial momentum Axial momentum conservation - compute turbulent cross fluxes

Definition at line 350 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

◆ _cmc_advective_derivative_mat

Mat SubChannel1PhaseProblem::_cmc_advective_derivative_mat
protectedinherited

Cross momentum conservation - advective (Eulerian) derivative.

Definition at line 379 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 376 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 214 of file SubChannel1PhaseProblem.h.

Referenced by 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 218 of file SubChannel1PhaseProblem.h.

Referenced by SubChannel1PhaseProblem::externalSolve().

◆ _compute_viscosity

const bool SubChannel1PhaseProblem::_compute_viscosity
protectedinherited

Flag that activates or deactivates the calculation of viscosity.

Definition at line 216 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 224 of file SubChannel1PhaseProblem.h.

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

◆ _correction_factor

PetscScalar SubChannel1PhaseProblem::_correction_factor = 1.0
protectedinherited

◆ _CT

Real SubChannel1PhaseProblem::_CT
protectedinherited

Turbulent modeling parameter used in axial momentum equation.

Definition at line 230 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 259 of file SubChannel1PhaseProblem.h.

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

◆ _dir_grav

const Real SubChannel1PhaseProblem::_dir_grav
protectedinherited

Definition at line 249 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 282 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

◆ _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 201 of file SubChannel1PhaseProblem.h.

Referenced by SubChannel1PhaseProblem::computeDP().

◆ _gravity_direction

const MooseEnum SubChannel1PhaseProblem::_gravity_direction
protectedinherited

The direction of gravity.

Definition at line 248 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 396 of file SubChannel1PhaseProblem.h.

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

◆ _hc_advective_derivative_rhs

Vec SubChannel1PhaseProblem::_hc_advective_derivative_rhs
protectedinherited

◆ _hc_axial_heat_conduction_mat

Mat TriSubChannel1PhaseProblem::_hc_axial_heat_conduction_mat
protected

Definition at line 34 of file TriSubChannel1PhaseProblem.h.

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

◆ _hc_axial_heat_conduction_rhs

Vec TriSubChannel1PhaseProblem::_hc_axial_heat_conduction_rhs
protected

Definition at line 35 of file TriSubChannel1PhaseProblem.h.

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

◆ _hc_cross_derivative_mat

Mat SubChannel1PhaseProblem::_hc_cross_derivative_mat
protectedinherited

◆ _hc_cross_derivative_rhs

Vec SubChannel1PhaseProblem::_hc_cross_derivative_rhs
protectedinherited

◆ _hc_radial_heat_conduction_mat

Mat TriSubChannel1PhaseProblem::_hc_radial_heat_conduction_mat
protected

Definition at line 36 of file TriSubChannel1PhaseProblem.h.

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

◆ _hc_radial_heat_conduction_rhs

Vec TriSubChannel1PhaseProblem::_hc_radial_heat_conduction_rhs
protected

Definition at line 37 of file TriSubChannel1PhaseProblem.h.

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

◆ _hc_sweep_enthalpy_mat

Mat TriSubChannel1PhaseProblem::_hc_sweep_enthalpy_mat
protected

Definition at line 38 of file TriSubChannel1PhaseProblem.h.

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

◆ _hc_sweep_enthalpy_rhs

Vec TriSubChannel1PhaseProblem::_hc_sweep_enthalpy_rhs
protected

Definition at line 39 of file TriSubChannel1PhaseProblem.h.

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

◆ _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

◆ _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 246 of file SubChannel1PhaseProblem.h.

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

◆ _kij

const Real& SubChannel1PhaseProblem::_kij
protectedinherited

◆ _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_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 338 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 210 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 232 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

◆ _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 281 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 253 of file SubChannel1PhaseProblem.h.

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

◆ _subchannel_mesh

SubChannelMesh& SubChannel1PhaseProblem::_subchannel_mesh
protectedinherited

◆ _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 236 of file SubChannel1PhaseProblem.h.

Referenced by SubChannel1PhaseProblem::externalSolve().

◆ _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 234 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 226 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 212 of file SubChannel1PhaseProblem.h.

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

◆ _tri_sch_mesh

TriSubChannelMesh& TriSubChannel1PhaseProblem::_tri_sch_mesh
protected

◆ _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: