28#include "libmesh/quadrature_gauss.h"
29#include "libmesh/node_range.h"
30#include "libmesh/numeric_vector.h"
31#include "libmesh/default_coupling.h"
32#include "libmesh/string_to_enum.h"
33#include "libmesh/fe_interface.h"
44 _sys(subproblem.es().add_system<System>(
name)),
45 _current_solution(_sys.current_local_solution.
get()),
46 _aux_scalar_storage(_app.getExecuteOnEnum()),
47 _nodal_aux_storage(_app.getExecuteOnEnum()),
48 _mortar_nodal_aux_storage(_app.getExecuteOnEnum()),
49 _elemental_aux_storage(_app.getExecuteOnEnum()),
50 _nodal_vec_aux_storage(_app.getExecuteOnEnum()),
51 _elemental_vec_aux_storage(_app.getExecuteOnEnum()),
52 _nodal_array_aux_storage(_app.getExecuteOnEnum()),
53 _elemental_array_aux_storage(_app.getExecuteOnEnum())
54#ifdef MOOSE_KOKKOS_ENABLED
56 _kokkos_nodal_aux_storage(_app.getExecuteOnEnum()),
57 _kokkos_elemental_aux_storage(_app.getExecuteOnEnum())
63 if (!_fe_problem.defaultGhosting())
65 auto & dof_map = _sys.get_dof_map();
66 dof_map.remove_algebraic_ghosting_functor(dof_map.default_algebraic_ghosting());
67 dof_map.set_implicit_neighbor_dofs(
false);
83 TIME_SECTION(
"initialSetup", 3,
"Initializing Auxiliary System");
116#ifdef MOOSE_KOKKOS_ENABLED
134 const bool skip_current_to_old)
163#ifdef MOOSE_KOKKOS_ENABLED
186#ifdef MOOSE_KOKKOS_ENABLED
227#ifdef MOOSE_KOKKOS_ENABLED
250#ifdef MOOSE_KOKKOS_ENABLED
268#ifdef MOOSE_KOKKOS_ENABLED
279 const std::string & name,
286 if (var_type ==
"MooseVariableScalar")
293 auto * var =
_vars[tid].getActualFieldVariable<RealVectorValue>(
name);
296 if (var->feType().family == LAGRANGE_VEC)
311 if (var->feType().family == LAGRANGE)
321 if (avar->feType().family == LAGRANGE)
332 const std::string & name,
337 const auto & base = parameters.
getBase();
338 if (base ==
"AuxKernel" || base ==
"Bounds")
340 std::shared_ptr<AuxKernel> kernel =
342 if (kernel->isNodal())
344 if (kernel->isMortar())
353 else if (base ==
"VectorAuxKernel")
355 std::shared_ptr<VectorAuxKernel> kernel =
357 if (kernel->isNodal())
359 if (kernel->isMortar())
360 mooseError(
"Vector mortar aux kernels not yet implemented");
367 else if (base ==
"ArrayAuxKernel")
369 std::shared_ptr<ArrayAuxKernel> kernel =
371 if (kernel->isNodal())
373 if (kernel->isMortar())
374 mooseError(
"Vector mortar aux kernels not yet implemented");
382 "Attempting to add AuxKernel of type '" + kernel_name +
"' and name '" +
name +
383 "' to the auxiliary system with invalid _moose_base: " + base);
389 const std::string & name,
394 std::shared_ptr<AuxScalarKernel> kernel =
404 var->computeElemValues();
409 var->computeElemValues();
417 var->computeElemValuesFace();
422 var->reinitAuxNeighbor();
423 var->computeElemValuesFace();
459 if (
_vars[0].scalars().size() > 0)
465 ti->computeTimeDerivatives();
468 if (
_vars[0].fieldVariables().size() > 0)
478#ifdef MOOSE_KOKKOS_ENABLED
492 ti->computeTimeDerivatives();
502 std::set<std::string> depend_objects;
506 const std::vector<std::shared_ptr<AuxKernel>> & auxs =
508 for (
const auto & aux : auxs)
510 const std::set<UserObjectName> & uo = aux->getDependObjects();
511 depend_objects.insert(uo.begin(), uo.end());
517 const std::vector<std::shared_ptr<VectorAuxKernel>> & auxs =
519 for (
const auto & aux : auxs)
521 const std::set<UserObjectName> & uo = aux->getDependObjects();
522 depend_objects.insert(uo.begin(), uo.end());
528 const std::vector<std::shared_ptr<ArrayAuxKernel>> & auxs =
530 for (
const auto & aux : auxs)
532 const std::set<UserObjectName> & uo = aux->getDependObjects();
533 depend_objects.insert(uo.begin(), uo.end());
539 const std::vector<std::shared_ptr<AuxKernel>> & auxs =
541 for (
const auto & aux : auxs)
543 const std::set<UserObjectName> & uo = aux->getDependObjects();
544 depend_objects.insert(uo.begin(), uo.end());
550 const std::vector<std::shared_ptr<AuxKernel>> & auxs =
552 for (
const auto & aux : auxs)
554 const std::set<UserObjectName> & uo = aux->getDependObjects();
555 depend_objects.insert(uo.begin(), uo.end());
561 const std::vector<std::shared_ptr<VectorAuxKernel>> & auxs =
563 for (
const auto & aux : auxs)
565 const std::set<UserObjectName> & uo = aux->getDependObjects();
566 depend_objects.insert(uo.begin(), uo.end());
572 const std::vector<std::shared_ptr<ArrayAuxKernel>> & auxs =
574 for (
const auto & aux : auxs)
576 const std::set<UserObjectName> & uo = aux->getDependObjects();
577 depend_objects.insert(uo.begin(), uo.end());
581#ifdef MOOSE_KOKKOS_ENABLED
584 const std::vector<std::shared_ptr<AuxKernelBase>> & auxs =
586 for (
const auto & aux : auxs)
588 const std::set<UserObjectName> & uo = aux->getDependObjects();
589 depend_objects.insert(uo.begin(), uo.end());
595 const std::vector<std::shared_ptr<AuxKernelBase>> & auxs =
597 for (
const auto & aux : auxs)
599 const std::set<UserObjectName> & uo = aux->getDependObjects();
600 depend_objects.insert(uo.begin(), uo.end());
605 return depend_objects;
611 std::set<std::string> depend_objects;
615 const std::vector<std::shared_ptr<AuxKernel>> & auxs =
617 for (
const auto & aux : auxs)
619 const std::set<UserObjectName> & uo = aux->getDependObjects();
620 depend_objects.insert(uo.begin(), uo.end());
626 const std::vector<std::shared_ptr<VectorAuxKernel>> & auxs =
628 for (
const auto & aux : auxs)
630 const std::set<UserObjectName> & uo = aux->getDependObjects();
631 depend_objects.insert(uo.begin(), uo.end());
637 const std::vector<std::shared_ptr<ArrayAuxKernel>> & auxs =
639 for (
const auto & aux : auxs)
641 const std::set<UserObjectName> & uo = aux->getDependObjects();
642 depend_objects.insert(uo.begin(), uo.end());
648 const std::vector<std::shared_ptr<AuxKernel>> & auxs =
_nodal_aux_storage.getActiveObjects();
649 for (
const auto & aux : auxs)
651 const std::set<UserObjectName> & uo = aux->getDependObjects();
652 depend_objects.insert(uo.begin(), uo.end());
658 const std::vector<std::shared_ptr<AuxKernel>> & auxs =
660 for (
const auto & aux : auxs)
662 const std::set<UserObjectName> & uo = aux->getDependObjects();
663 depend_objects.insert(uo.begin(), uo.end());
669 const std::vector<std::shared_ptr<VectorAuxKernel>> & auxs =
671 for (
const auto & aux : auxs)
673 const std::set<UserObjectName> & uo = aux->getDependObjects();
674 depend_objects.insert(uo.begin(), uo.end());
680 const std::vector<std::shared_ptr<ArrayAuxKernel>> & auxs =
682 for (
const auto & aux : auxs)
684 const std::set<UserObjectName> & uo = aux->getDependObjects();
685 depend_objects.insert(uo.begin(), uo.end());
689#ifdef MOOSE_KOKKOS_ENABLED
692 const std::vector<std::shared_ptr<AuxKernelBase>> & auxs =
694 for (
const auto & aux : auxs)
696 const std::set<UserObjectName> & uo = aux->getDependObjects();
697 depend_objects.insert(uo.begin(), uo.end());
703 const std::vector<std::shared_ptr<AuxKernelBase>> & auxs =
705 for (
const auto & aux : auxs)
707 const std::set<UserObjectName> & uo = aux->getDependObjects();
708 depend_objects.insert(uo.begin(), uo.end());
713 return depend_objects;
720 const std::vector<std::shared_ptr<AuxScalarKernel>> & objects = storage.
getActiveObjects(0);
722 std::set<TagID> needed_sc_var_matrix_tags;
723 std::set<TagID> needed_sc_var_vector_tags;
724 for (
const auto & obj : objects)
726 auto & sc_var_coup_vtags = obj->getScalarVariableCoupleableVectorTags();
727 needed_sc_var_vector_tags.insert(sc_var_coup_vtags.begin(), sc_var_coup_vtags.end());
729 auto & sc_var_coup_mtags = obj->getScalarVariableCoupleableMatrixTags();
730 needed_sc_var_matrix_tags.insert(sc_var_coup_mtags.begin(), sc_var_coup_mtags.end());
754 TIME_SECTION(
"computeScalarVars", 1);
764 const std::vector<std::shared_ptr<AuxScalarKernel>> & objects =
768 for (
const auto & obj : objects)
772 for (
const auto & var : scalar_vars)
788 TIME_SECTION(
"computeNodalVars", 3);
791 computeNodalVarsHelper<AuxKernel>(nodal);
797 TIME_SECTION(
"computeNodalVecVars", 3);
800 computeNodalVarsHelper<VectorAuxKernel>(nodal);
807 computeNodalVarsHelper<ArrayAuxKernel>(nodal);
813 TIME_SECTION(
"computeMortarNodalVars", 3);
818 "We don't allow creation of block restricted mortar nodal aux kernels.");
823 for (
const auto & [bnd_id, mortar_nodal_auxes] :
825 for (
const auto index : index_range(mortar_nodal_auxes))
832 _fe_problem, mortar_nodal_warehouse, bnd_id, index);
838 "Auxiliary variable computation:\n" +
839 std::string(e.
what()));
841 catch (MetaPhysicL::LogicError & e)
845 catch (std::exception & e)
849 if (!strstr(e.
what(),
"Jacobian") && !strstr(e.
what(),
"singular") &&
850 !strstr(e.
what(),
"det != 0"))
854 "nodal Auxiliary variable computation:\n" +
855 std::string(e.
what()));
871 TIME_SECTION(
"computeElementalVars", 3);
874 computeElementalVarsHelper<AuxKernel>(elemental);
880 TIME_SECTION(
"computeElementalVecVars", 3);
883 computeElementalVarsHelper<VectorAuxKernel>(elemental);
890 computeElementalVarsHelper<ArrayAuxKernel>(elemental);
895 std::vector<dof_id_type> & ,
896 std::vector<dof_id_type> &
904 Order order = CONSTANT;
905 std::vector<MooseVariableFEBase *>
vars =
_vars[0].fieldVariables();
906 for (
const auto & var :
vars)
910 FEType fe_type = var->feType();
911 if (fe_type.default_quadrature_order() > order)
912 order = fe_type.default_quadrature_order();
933template <
typename AuxKernelType>
951 "Auxiliary variable computation:\n" +
952 std::string(e.
what()));
966 TIME_SECTION(
"computeElementalVecVars", 3);
979 "elemental Auxiliary variable computation:\n" +
980 std::string(e.
what()));
992template <
typename AuxKernelType>
1013 TIME_SECTION(
"computeBoundaryObjects", 3);
1031 std::vector<Number> & rel_diff_norms)
const
1037 for (
const auto n : make_range(
nVariables()))
1040 std::vector<dof_id_type> local_indices_n;
1042 Number diff_norm_n = 0;
1045 for (
const auto local_index : local_indices_n)
1047 const Number & value =
solution()(local_index);
1048 const Number & value_old =
solutionOld()(local_index);
1049 diff_norm_n += Utility::pow<2, Number>(value - value_old);
1050 norm_n += Utility::pow<2, Number>(value);
1055 diff_norm_n = sqrt(diff_norm_n);
1056 norm_n = sqrt(norm_n);
1057 rel_diff_norms[n] = diff_norm_n > 0 ? diff_norm_n / norm_n : 0.0;
1063template void AuxiliarySystem::computeElementalVarsHelper<VectorAuxKernel>(
1067template void AuxiliarySystem::computeNodalVarsHelper<VectorAuxKernel>(
boundary_id_type BoundaryID
void mooseError(Args &&... args)
Emit an error message with the given stringified, concatenated args and terminate the application.
Base class for making kernels that work on auxiliary scalar variables.
virtual void copyCurrentIntoPreviousNL()
Copies the current solution into the previous nonlinear iteration solution.
bool needMaterialOnSide(BoundaryID bnd_id)
Indicated whether this system needs material properties on boundaries.
virtual void jacobianSetup() override
virtual void residualSetup() override
void computeScalarVars(ExecFlagType type)
void addKernel(const std::string &kernel_name, const std::string &name, InputParameters ¶meters)
Adds an auxiliary kernel.
ExecuteMooseObjectWarehouse< ArrayAuxKernel > _nodal_array_aux_storage
void clearScalarVariableCoupleableTags()
virtual void compute(ExecFlagType type) override
Compute auxiliary variables.
void kokkosCompute(ExecFlagType type)
virtual void copyAdditionalStateBackwards(Moose::SolutionIterationType iteration_type, bool skip_current_to_old) override
Copy system-owned state not represented by solution vectors.
void computeMortarNodalVars(ExecFlagType type)
void computeElementalVars(ExecFlagType type)
void computeElementalVarsHelper(const MooseObjectWarehouse< AuxKernelType > &warehouse)
const NumericVector< Number > * _current_solution
solution vector from nonlinear solver
virtual void subdomainSetup() override
ExecuteMooseObjectWarehouse< AuxKernelBase > _kokkos_elemental_aux_storage
virtual libMesh::Order getMinQuadratureOrder() override
Get the minimum quadrature order for evaluating elemental auxiliary variables.
virtual void initSolutionState() override
Initializes the solution state.
ExecuteMooseObjectWarehouse< AuxKernel > _elemental_aux_storage
void computeNodalVecVars(ExecFlagType type)
void variableWiseRelativeSolutionDifferenceNorm(std::vector< Number > &var_diffs) const
Computes and stores ||current - old|| / ||current|| for each variable in the given vector.
void setScalarVariableCoupleableTags(ExecFlagType type)
std::set< std::string > getDependObjects()
virtual void customSetup(const ExecFlagType &exec_type) override
ExecuteMooseObjectWarehouse< ArrayAuxKernel > _elemental_array_aux_storage
ExecuteMooseObjectWarehouse< VectorAuxKernel > _elemental_vec_aux_storage
ExecuteMooseObjectWarehouse< AuxKernel > _nodal_aux_storage
void computeElementalVecVars(ExecFlagType type)
ExecuteMooseObjectWarehouse< VectorAuxKernel > _nodal_vec_aux_storage
virtual void restoreAdditionalStates() override
Restore system-owned state not represented by solution vectors.
void addScalarKernel(const std::string &kernel_name, const std::string &name, InputParameters ¶meters)
Adds a scalar kernel.
AuxiliarySystem(FEProblemBase &subproblem, const std::string &name)
virtual void reinitElem(const Elem *elem, THREAD_ID tid) override
Reinit an element assembly info.
ExecuteMooseObjectWarehouse< AuxKernel > _mortar_nodal_aux_storage
virtual ~AuxiliarySystem()
virtual void addVariable(const std::string &var_type, const std::string &name, InputParameters ¶meters) override
Canonical method for adding a variable.
ExecuteMooseObjectWarehouse< AuxKernelBase > _kokkos_nodal_aux_storage
const NumericVector< Number > *const & currentSolution() const override
The solution vector that is currently being operated on.
void computeElementalArrayVars(ExecFlagType type)
void computeNodalVars(ExecFlagType type)
virtual void updateActive(THREAD_ID tid)
virtual void augmentSparsity(libMesh::SparsityPattern::Graph &, std::vector< dof_id_type > &, std::vector< dof_id_type > &) override
Will modify the sparsity pattern to add logical geometric connections.
std::vector< std::vector< MooseVariableFieldBase * > > _elem_vars
Elemental variables.
std::vector< std::vector< MooseVariableFEBase * > > _nodal_vars
virtual void serializeSolution()
ExecuteMooseObjectWarehouse< AuxScalarKernel > _aux_scalar_storage
virtual void reinitElemFace(const Elem *elem, unsigned int side, THREAD_ID tid) override
Reinit assembly info for a side of an element.
void computeNodalArrayVars(ExecFlagType type)
virtual void timestepSetup() override
virtual void initialSetup() override
Setup Functions.
virtual void reinit() override
Reinitialize the system when the degrees of freedom in this system have changed.
void computeNodalVarsHelper(const MooseObjectWarehouse< AuxKernelType > &warehouse)
This class evaluates a single mortar nodal aux kernel.
void jacobianSetup(THREAD_ID tid=0) const override
Convenience methods for calling object setup methods.
void updateActive(THREAD_ID tid=0) override
Updates the active objects storage.
void addObject(std::shared_ptr< T > object, THREAD_ID tid=0, bool recurse=true) override
Adds an object to the storage structure.
void residualSetup(THREAD_ID tid=0) const override
void sort(THREAD_ID tid=0)
Performs a sort using the DependencyResolver.
Specialization of SubProblem for solving nonlinear equations plus auxiliary equations.
virtual void setActiveScalarVariableCoupleableVectorTags(std::set< TagID > &vtags, const THREAD_ID tid) override
virtual void reinitScalars(const THREAD_ID tid, bool reinit_for_derivative_reordering=false) override
fills the VariableValue arrays for scalar variables from the solution vector
virtual void setException(const std::string &message)
Set an exception, which is stored at this point by toggling a member variable in this class,...
virtual Real & dt() const
virtual void setActiveScalarVariableCoupleableMatrixTags(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
std::shared_ptr< MooseObject > create(const std::string &obj_name, const std::string &name, const InputParameters ¶meters, THREAD_ID tid=0, bool print_deprecated=true)
Registration, update, and allocation logic for linear finite-volume cell gradients.
void computeGradients()
Compute and finalize all registered linear FV gradient fields.
void rebuildLinearFVGradientStorage()
Rebuild cached gradient values and reusable scratch storage after mesh/DOF changes.
void copyPreviousGradientStates(Moose::SolutionIterationType iteration_type, bool skip_current_to_old)
Copy published gradient values into requested older states.
bool hasLinearFVGradients() const
Whether any linear finite-volume gradient fields have been registered to this object.
void restoreGradientStates()
Restore current gradients from state one after a failed timestep.
void initializeLinearFVGradientHistoryStorage()
Register named system vectors for requested historical gradient states.
void initializeLinearFVGradientStorage()
Initialize private current and replacement gradient storage.
Class for containing MooseEnum item information.
Provides a way for users to bail out of the current solve.
virtual const char * what() const
Get out the error message.
libMesh::ConstNodeRange * getLocalNodeRange()
libMesh::StoredRange< MooseMesh::const_bnd_node_iterator, const BndNode * > * getBoundaryNodeRange()
const libMesh::ConstElemRange * getActiveLocalElementRange()
Return pointers to range objects for various types of ranges (local nodes, boundary elems,...
libMesh::StoredRange< MooseMesh::const_bnd_elem_iterator, const BndElement * > * getBoundaryElementRange()
bool hasActiveObjects(THREAD_ID tid=0) const
const std::map< BoundaryID, std::vector< std::shared_ptr< T > > > & getActiveBoundaryObjects(THREAD_ID tid=0) const
bool hasActiveBlockObjects(THREAD_ID tid=0) const
bool hasActiveBoundaryObjects(THREAD_ID tid=0) const
const std::vector< std::shared_ptr< T > > & getActiveObjects(THREAD_ID tid=0) const
Retrieve complete vector to the active all/block/boundary restricted objects for a given thread.
A storage container for MooseObjects that inherit from SetupInterface.
virtual void timestepSetup(THREAD_ID tid=0) const
virtual void customSetup(const ExecFlagType &exec_type, THREAD_ID tid=0) const
virtual void subdomainSetup(THREAD_ID tid=0) const
virtual void initialSetup(THREAD_ID tid=0) const
Convenience methods for calling object setup methods.
Class for stuff related to variables.
Interface for objects interacting with the PerfGraph.
Base class for a system (of equations)
std::unique_ptr< NumericVector< Number > > _serialized_solution
Serialized version of the solution vector, or nullptr if a serialized solution is not needed.
FEProblemBase & _fe_problem
the governing finite element/volume problem
virtual void subdomainSetup()
std::vector< std::shared_ptr< TimeIntegrator > > _time_integrators
Time integrator.
virtual unsigned int nVariables() const
Get the number of variables in this system.
virtual void addVariable(const std::string &var_type, const std::string &var_name, InputParameters ¶meters)
Canonical method for adding a variable.
virtual void customSetup(const ExecFlagType &exec_type)
NumericVector< Number > & solutionOld()
virtual void initialSetup()
Setup Functions.
virtual void initSolutionState()
Initializes the solution state.
virtual void timestepSetup()
virtual void jacobianSetup()
virtual void residualSetup()
std::vector< VariableWarehouse > _vars
Variable warehouses (one for each thread)
virtual const NumericVector< Number > * solutionPreviousNewton() const
virtual const std::string & name() const
NumericVector< Number > & solution()
const std::vector< MooseVariableScalar * > & getScalarVariables(THREAD_ID tid)
void local_variable_indices(T &idx, const MeshBase &mesh, unsigned int var_num) const
virtual void localize(std::vector< T > &v_local) const=0
const Parallel::Communicator & _communicator
std::unique_ptr< NumericVector< Number > > current_local_solution
dof_id_type n_dofs() const
const DofMap & get_dof_map() const
libMesh::FEType variableFEType(const InputParameters ¶ms)
MOOSE now contains C++17 code, so give a reasonable error message stating what the user can do to add...
std::string name(const ElemQuality q)
const Elem & get(const ElemType type_in)
void parallel_reduce(const Range &range, Body &body, unsigned int n_threads=libMesh::n_threads())
Tnew cast_ref(Told &oldvar)
void translateMetaPhysicLError(const MetaPhysicL::LogicError &)
emit a relatively clear error message when we catch a MetaPhysicL logic error