27#include "libmesh/quadrature_gauss.h"
28#include "libmesh/node_range.h"
29#include "libmesh/numeric_vector.h"
30#include "libmesh/default_coupling.h"
31#include "libmesh/string_to_enum.h"
32#include "libmesh/fe_interface.h"
43 _sys(subproblem.es().add_system<System>(
name)),
44 _current_solution(_sys.current_local_solution.
get()),
45 _aux_scalar_storage(_app.getExecuteOnEnum()),
46 _nodal_aux_storage(_app.getExecuteOnEnum()),
47 _mortar_nodal_aux_storage(_app.getExecuteOnEnum()),
48 _elemental_aux_storage(_app.getExecuteOnEnum()),
49 _nodal_vec_aux_storage(_app.getExecuteOnEnum()),
50 _elemental_vec_aux_storage(_app.getExecuteOnEnum()),
51 _nodal_array_aux_storage(_app.getExecuteOnEnum()),
52 _elemental_array_aux_storage(_app.getExecuteOnEnum())
53#ifdef MOOSE_KOKKOS_ENABLED
55 _kokkos_nodal_aux_storage(_app.getExecuteOnEnum()),
56 _kokkos_elemental_aux_storage(_app.getExecuteOnEnum())
62 if (!_fe_problem.defaultGhosting())
64 auto & dof_map = _sys.get_dof_map();
65 dof_map.remove_algebraic_ghosting_functor(dof_map.default_algebraic_ghosting());
66 dof_map.set_implicit_neighbor_dofs(
false);
75 TIME_SECTION(
"initialSetup", 3,
"Initializing Auxiliary System");
108#ifdef MOOSE_KOKKOS_ENABLED
141#ifdef MOOSE_KOKKOS_ENABLED
164#ifdef MOOSE_KOKKOS_ENABLED
205#ifdef MOOSE_KOKKOS_ENABLED
228#ifdef MOOSE_KOKKOS_ENABLED
246#ifdef MOOSE_KOKKOS_ENABLED
257 const std::string & name,
262 auto fe_type = FEType(Utility::string_to_enum<Order>(parameters.
get<
MooseEnum>(
"order")),
263 Utility::string_to_enum<FEFamily>(parameters.
get<
MooseEnum>(
"family")));
265 if (var_type ==
"MooseVariableScalar")
272 auto * var =
_vars[tid].getActualFieldVariable<RealVectorValue>(
name);
275 if (var->feType().family == LAGRANGE_VEC)
290 if (var->feType().family == LAGRANGE)
300 if (avar->feType().family == LAGRANGE)
311 const std::string & name,
316 const auto & base = parameters.
getBase();
317 if (base ==
"AuxKernel" || base ==
"Bounds")
319 std::shared_ptr<AuxKernel> kernel =
321 if (kernel->isNodal())
323 if (kernel->isMortar())
332 else if (base ==
"VectorAuxKernel")
334 std::shared_ptr<VectorAuxKernel> kernel =
336 if (kernel->isNodal())
338 if (kernel->isMortar())
339 mooseError(
"Vector mortar aux kernels not yet implemented");
346 else if (base ==
"ArrayAuxKernel")
348 std::shared_ptr<ArrayAuxKernel> kernel =
350 if (kernel->isNodal())
352 if (kernel->isMortar())
353 mooseError(
"Vector mortar aux kernels not yet implemented");
361 "Attempting to add AuxKernel of type '" + kernel_name +
"' and name '" +
name +
362 "' to the auxiliary system with invalid _moose_base: " + base);
368 const std::string & name,
373 std::shared_ptr<AuxScalarKernel> kernel =
383 var->computeElemValues();
388 var->computeElemValues();
396 var->computeElemValuesFace();
401 var->reinitAuxNeighbor();
402 var->computeElemValuesFace();
438 if (
_vars[0].scalars().size() > 0)
444 ti->computeTimeDerivatives();
447 if (
_vars[0].fieldVariables().size() > 0)
457#ifdef MOOSE_KOKKOS_ENABLED
471 ti->computeTimeDerivatives();
481 std::set<std::string> depend_objects;
485 const std::vector<std::shared_ptr<AuxKernel>> & auxs =
487 for (
const auto & aux : auxs)
489 const std::set<UserObjectName> & uo = aux->getDependObjects();
490 depend_objects.insert(uo.begin(), uo.end());
496 const std::vector<std::shared_ptr<VectorAuxKernel>> & auxs =
498 for (
const auto & aux : auxs)
500 const std::set<UserObjectName> & uo = aux->getDependObjects();
501 depend_objects.insert(uo.begin(), uo.end());
507 const std::vector<std::shared_ptr<ArrayAuxKernel>> & auxs =
509 for (
const auto & aux : auxs)
511 const std::set<UserObjectName> & uo = aux->getDependObjects();
512 depend_objects.insert(uo.begin(), uo.end());
518 const std::vector<std::shared_ptr<AuxKernel>> & auxs =
520 for (
const auto & aux : auxs)
522 const std::set<UserObjectName> & uo = aux->getDependObjects();
523 depend_objects.insert(uo.begin(), uo.end());
529 const std::vector<std::shared_ptr<AuxKernel>> & auxs =
531 for (
const auto & aux : auxs)
533 const std::set<UserObjectName> & uo = aux->getDependObjects();
534 depend_objects.insert(uo.begin(), uo.end());
540 const std::vector<std::shared_ptr<VectorAuxKernel>> & auxs =
542 for (
const auto & aux : auxs)
544 const std::set<UserObjectName> & uo = aux->getDependObjects();
545 depend_objects.insert(uo.begin(), uo.end());
551 const std::vector<std::shared_ptr<ArrayAuxKernel>> & auxs =
553 for (
const auto & aux : auxs)
555 const std::set<UserObjectName> & uo = aux->getDependObjects();
556 depend_objects.insert(uo.begin(), uo.end());
560#ifdef MOOSE_KOKKOS_ENABLED
563 const std::vector<std::shared_ptr<AuxKernelBase>> & auxs =
565 for (
const auto & aux : auxs)
567 const std::set<UserObjectName> & uo = aux->getDependObjects();
568 depend_objects.insert(uo.begin(), uo.end());
574 const std::vector<std::shared_ptr<AuxKernelBase>> & auxs =
576 for (
const auto & aux : auxs)
578 const std::set<UserObjectName> & uo = aux->getDependObjects();
579 depend_objects.insert(uo.begin(), uo.end());
584 return depend_objects;
590 std::set<std::string> depend_objects;
594 const std::vector<std::shared_ptr<AuxKernel>> & auxs =
596 for (
const auto & aux : auxs)
598 const std::set<UserObjectName> & uo = aux->getDependObjects();
599 depend_objects.insert(uo.begin(), uo.end());
605 const std::vector<std::shared_ptr<VectorAuxKernel>> & auxs =
607 for (
const auto & aux : auxs)
609 const std::set<UserObjectName> & uo = aux->getDependObjects();
610 depend_objects.insert(uo.begin(), uo.end());
616 const std::vector<std::shared_ptr<ArrayAuxKernel>> & auxs =
618 for (
const auto & aux : auxs)
620 const std::set<UserObjectName> & uo = aux->getDependObjects();
621 depend_objects.insert(uo.begin(), uo.end());
627 const std::vector<std::shared_ptr<AuxKernel>> & auxs =
_nodal_aux_storage.getActiveObjects();
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<AuxKernel>> & 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<VectorAuxKernel>> & auxs =
650 for (
const auto & aux : auxs)
652 const std::set<UserObjectName> & uo = aux->getDependObjects();
653 depend_objects.insert(uo.begin(), uo.end());
659 const std::vector<std::shared_ptr<ArrayAuxKernel>> & auxs =
661 for (
const auto & aux : auxs)
663 const std::set<UserObjectName> & uo = aux->getDependObjects();
664 depend_objects.insert(uo.begin(), uo.end());
668#ifdef MOOSE_KOKKOS_ENABLED
671 const std::vector<std::shared_ptr<AuxKernelBase>> & auxs =
673 for (
const auto & aux : auxs)
675 const std::set<UserObjectName> & uo = aux->getDependObjects();
676 depend_objects.insert(uo.begin(), uo.end());
682 const std::vector<std::shared_ptr<AuxKernelBase>> & auxs =
684 for (
const auto & aux : auxs)
686 const std::set<UserObjectName> & uo = aux->getDependObjects();
687 depend_objects.insert(uo.begin(), uo.end());
692 return depend_objects;
699 const std::vector<std::shared_ptr<AuxScalarKernel>> & objects = storage.
getActiveObjects(0);
701 std::set<TagID> needed_sc_var_matrix_tags;
702 std::set<TagID> needed_sc_var_vector_tags;
703 for (
const auto & obj : objects)
705 auto & sc_var_coup_vtags = obj->getScalarVariableCoupleableVectorTags();
706 needed_sc_var_vector_tags.insert(sc_var_coup_vtags.begin(), sc_var_coup_vtags.end());
708 auto & sc_var_coup_mtags = obj->getScalarVariableCoupleableMatrixTags();
709 needed_sc_var_matrix_tags.insert(sc_var_coup_mtags.begin(), sc_var_coup_mtags.end());
733 TIME_SECTION(
"computeScalarVars", 1);
743 const std::vector<std::shared_ptr<AuxScalarKernel>> & objects =
747 for (
const auto & obj : objects)
751 for (
const auto & var : scalar_vars)
767 TIME_SECTION(
"computeNodalVars", 3);
770 computeNodalVarsHelper<AuxKernel>(nodal);
776 TIME_SECTION(
"computeNodalVecVars", 3);
779 computeNodalVarsHelper<VectorAuxKernel>(nodal);
786 computeNodalVarsHelper<ArrayAuxKernel>(nodal);
792 TIME_SECTION(
"computeMortarNodalVars", 3);
797 "We don't allow creation of block restricted mortar nodal aux kernels.");
802 for (
const auto & [bnd_id, mortar_nodal_auxes] :
804 for (
const auto index : index_range(mortar_nodal_auxes))
811 _fe_problem, mortar_nodal_warehouse, bnd_id, index);
817 "Auxiliary variable computation:\n" +
818 std::string(e.
what()));
820 catch (MetaPhysicL::LogicError & e)
824 catch (std::exception & e)
828 if (!strstr(e.
what(),
"Jacobian") && !strstr(e.
what(),
"singular") &&
829 !strstr(e.
what(),
"det != 0"))
833 "nodal Auxiliary variable computation:\n" +
834 std::string(e.
what()));
850 TIME_SECTION(
"computeElementalVars", 3);
853 computeElementalVarsHelper<AuxKernel>(elemental);
859 TIME_SECTION(
"computeElementalVecVars", 3);
862 computeElementalVarsHelper<VectorAuxKernel>(elemental);
869 computeElementalVarsHelper<ArrayAuxKernel>(elemental);
874 std::vector<dof_id_type> & ,
875 std::vector<dof_id_type> &
883 Order order = CONSTANT;
884 std::vector<MooseVariableFEBase *>
vars =
_vars[0].fieldVariables();
885 for (
const auto & var :
vars)
889 FEType fe_type = var->feType();
890 if (fe_type.default_quadrature_order() > order)
891 order = fe_type.default_quadrature_order();
912template <
typename AuxKernelType>
930 "Auxiliary variable computation:\n" +
931 std::string(e.
what()));
945 TIME_SECTION(
"computeElementalVecVars", 3);
958 "elemental Auxiliary variable computation:\n" +
959 std::string(e.
what()));
971template <
typename AuxKernelType>
992 TIME_SECTION(
"computeBoundaryObjects", 3);
1010 std::vector<Number> & rel_diff_norms)
const
1016 for (
const auto n : make_range(
nVariables()))
1019 std::vector<dof_id_type> local_indices_n;
1021 Number diff_norm_n = 0;
1024 for (
const auto local_index : local_indices_n)
1026 const Number & value =
solution()(local_index);
1027 const Number & value_old =
solutionOld()(local_index);
1028 diff_norm_n += Utility::pow<2, Number>(value - value_old);
1029 norm_n += Utility::pow<2, Number>(value);
1034 diff_norm_n = sqrt(diff_norm_n);
1035 norm_n = sqrt(norm_n);
1036 rel_diff_norms[n] = diff_norm_n > 0 ? diff_norm_n / norm_n : 0.0;
1042template void AuxiliarySystem::computeElementalVarsHelper<VectorAuxKernel>(
1046template 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)
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.
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
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 initialSetup() override
Setup Functions.
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 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 rebuildLinearFVGradientStorage()
Rebuild cached gradient values and reusable scratch storage after mesh/DOF changes.
bool hasLinearFVGradients() const
Whether any linear finite-volume gradient fields have been registered to this object.
void computeGradients()
Compute and finalize all registered linear FV gradient fields.
Class for containing MooseEnum item information.
This is a "smart" enum class intended to replace many of the shortcomings in the C++ enum type It sho...
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 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
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