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" 41 _sys(subproblem.es().add_system<
System>(
name)),
42 _current_solution(_sys.current_local_solution.
get()),
43 _aux_scalar_storage(_app.getExecuteOnEnum()),
44 _nodal_aux_storage(_app.getExecuteOnEnum()),
45 _mortar_nodal_aux_storage(_app.getExecuteOnEnum()),
46 _elemental_aux_storage(_app.getExecuteOnEnum()),
47 _nodal_vec_aux_storage(_app.getExecuteOnEnum()),
48 _elemental_vec_aux_storage(_app.getExecuteOnEnum()),
49 _nodal_array_aux_storage(_app.getExecuteOnEnum()),
50 _elemental_array_aux_storage(_app.getExecuteOnEnum())
51 #ifdef MOOSE_KOKKOS_ENABLED
53 _kokkos_nodal_aux_storage(_app.getExecuteOnEnum()),
54 _kokkos_elemental_aux_storage(_app.getExecuteOnEnum())
62 auto & dof_map = _sys.get_dof_map();
63 dof_map.remove_algebraic_ghosting_functor(dof_map.default_algebraic_ghosting());
64 dof_map.set_implicit_neighbor_dofs(
false);
73 TIME_SECTION(
"initialSetup", 3,
"Initializing Auxiliary System");
104 #ifdef MOOSE_KOKKOS_ENABLED 130 #ifdef MOOSE_KOKKOS_ENABLED 153 #ifdef MOOSE_KOKKOS_ENABLED 194 #ifdef MOOSE_KOKKOS_ENABLED 217 #ifdef MOOSE_KOKKOS_ENABLED 235 #ifdef MOOSE_KOKKOS_ENABLED 246 const std::string & name,
251 auto fe_type =
FEType(Utility::string_to_enum<Order>(parameters.
get<
MooseEnum>(
"order")),
252 Utility::string_to_enum<FEFamily>(parameters.
get<
MooseEnum>(
"family")));
254 if (var_type ==
"MooseVariableScalar")
259 if (FEInterface::field_type(fe_type) ==
TYPE_VECTOR)
279 if (var->feType().family ==
LAGRANGE)
289 if (avar->feType().family ==
LAGRANGE)
300 const std::string & name,
305 const auto & base = parameters.
getBase();
306 if (base ==
"AuxKernel" || base ==
"Bounds")
308 std::shared_ptr<AuxKernel> kernel =
310 if (kernel->isNodal())
312 if (kernel->isMortar())
321 else if (base ==
"VectorAuxKernel")
323 std::shared_ptr<VectorAuxKernel> kernel =
325 if (kernel->isNodal())
327 if (kernel->isMortar())
328 mooseError(
"Vector mortar aux kernels not yet implemented");
335 else if (base ==
"ArrayAuxKernel")
337 std::shared_ptr<ArrayAuxKernel> kernel =
339 if (kernel->isNodal())
341 if (kernel->isMortar())
342 mooseError(
"Vector mortar aux kernels not yet implemented");
350 "Attempting to add AuxKernel of type '" + kernel_name +
"' and name '" +
name +
351 "' to the auxiliary system with invalid _moose_base: " + base);
357 const std::string & name,
362 std::shared_ptr<AuxScalarKernel> kernel =
372 var->computeElemValues();
377 var->computeElemValues();
385 var->computeElemValuesFace();
390 var->reinitAuxNeighbor();
391 var->computeElemValuesFace();
427 if (
_vars[0].scalars().size() > 0)
433 ti->computeTimeDerivatives();
436 if (
_vars[0].fieldVariables().size() > 0)
446 #ifdef MOOSE_KOKKOS_ENABLED 453 ti->computeTimeDerivatives();
460 std::set<std::string>
463 std::set<std::string> depend_objects;
467 const std::vector<std::shared_ptr<AuxKernel>> & auxs =
469 for (
const auto & aux : auxs)
471 const std::set<UserObjectName> & uo = aux->getDependObjects();
472 depend_objects.insert(uo.begin(), uo.end());
478 const std::vector<std::shared_ptr<VectorAuxKernel>> & auxs =
480 for (
const auto & aux : auxs)
482 const std::set<UserObjectName> & uo = aux->getDependObjects();
483 depend_objects.insert(uo.begin(), uo.end());
489 const std::vector<std::shared_ptr<ArrayAuxKernel>> & auxs =
491 for (
const auto & aux : auxs)
493 const std::set<UserObjectName> & uo = aux->getDependObjects();
494 depend_objects.insert(uo.begin(), uo.end());
500 const std::vector<std::shared_ptr<AuxKernel>> & auxs =
502 for (
const auto & aux : auxs)
504 const std::set<UserObjectName> & uo = aux->getDependObjects();
505 depend_objects.insert(uo.begin(), uo.end());
511 const std::vector<std::shared_ptr<AuxKernel>> & auxs =
513 for (
const auto & aux : auxs)
515 const std::set<UserObjectName> & uo = aux->getDependObjects();
516 depend_objects.insert(uo.begin(), uo.end());
522 const std::vector<std::shared_ptr<VectorAuxKernel>> & auxs =
524 for (
const auto & aux : auxs)
526 const std::set<UserObjectName> & uo = aux->getDependObjects();
527 depend_objects.insert(uo.begin(), uo.end());
533 const std::vector<std::shared_ptr<ArrayAuxKernel>> & auxs =
535 for (
const auto & aux : auxs)
537 const std::set<UserObjectName> & uo = aux->getDependObjects();
538 depend_objects.insert(uo.begin(), uo.end());
542 #ifdef MOOSE_KOKKOS_ENABLED 545 const std::vector<std::shared_ptr<AuxKernelBase>> & auxs =
547 for (
const auto & aux : auxs)
549 const std::set<UserObjectName> & uo = aux->getDependObjects();
550 depend_objects.insert(uo.begin(), uo.end());
556 const std::vector<std::shared_ptr<AuxKernelBase>> & auxs =
558 for (
const auto & aux : auxs)
560 const std::set<UserObjectName> & uo = aux->getDependObjects();
561 depend_objects.insert(uo.begin(), uo.end());
566 return depend_objects;
569 std::set<std::string>
572 std::set<std::string> depend_objects;
576 const std::vector<std::shared_ptr<AuxKernel>> & auxs =
578 for (
const auto & aux : auxs)
580 const std::set<UserObjectName> & uo = aux->getDependObjects();
581 depend_objects.insert(uo.begin(), uo.end());
587 const std::vector<std::shared_ptr<VectorAuxKernel>> & auxs =
589 for (
const auto & aux : auxs)
591 const std::set<UserObjectName> & uo = aux->getDependObjects();
592 depend_objects.insert(uo.begin(), uo.end());
598 const std::vector<std::shared_ptr<ArrayAuxKernel>> & auxs =
600 for (
const auto & aux : auxs)
602 const std::set<UserObjectName> & uo = aux->getDependObjects();
603 depend_objects.insert(uo.begin(), uo.end());
609 const std::vector<std::shared_ptr<AuxKernel>> & auxs =
_nodal_aux_storage.getActiveObjects();
610 for (
const auto & aux : auxs)
612 const std::set<UserObjectName> & uo = aux->getDependObjects();
613 depend_objects.insert(uo.begin(), uo.end());
619 const std::vector<std::shared_ptr<AuxKernel>> & auxs =
621 for (
const auto & aux : auxs)
623 const std::set<UserObjectName> & uo = aux->getDependObjects();
624 depend_objects.insert(uo.begin(), uo.end());
630 const std::vector<std::shared_ptr<VectorAuxKernel>> & auxs =
632 for (
const auto & aux : auxs)
634 const std::set<UserObjectName> & uo = aux->getDependObjects();
635 depend_objects.insert(uo.begin(), uo.end());
641 const std::vector<std::shared_ptr<ArrayAuxKernel>> & auxs =
643 for (
const auto & aux : auxs)
645 const std::set<UserObjectName> & uo = aux->getDependObjects();
646 depend_objects.insert(uo.begin(), uo.end());
650 #ifdef MOOSE_KOKKOS_ENABLED 653 const std::vector<std::shared_ptr<AuxKernelBase>> & auxs =
655 for (
const auto & aux : auxs)
657 const std::set<UserObjectName> & uo = aux->getDependObjects();
658 depend_objects.insert(uo.begin(), uo.end());
664 const std::vector<std::shared_ptr<AuxKernelBase>> & auxs =
666 for (
const auto & aux : auxs)
668 const std::set<UserObjectName> & uo = aux->getDependObjects();
669 depend_objects.insert(uo.begin(), uo.end());
674 return depend_objects;
681 const std::vector<std::shared_ptr<AuxScalarKernel>> & objects = storage.
getActiveObjects(0);
683 std::set<TagID> needed_sc_var_matrix_tags;
684 std::set<TagID> needed_sc_var_vector_tags;
685 for (
const auto & obj : objects)
687 auto & sc_var_coup_vtags = obj->getScalarVariableCoupleableVectorTags();
688 needed_sc_var_vector_tags.insert(sc_var_coup_vtags.begin(), sc_var_coup_vtags.end());
690 auto & sc_var_coup_mtags = obj->getScalarVariableCoupleableMatrixTags();
691 needed_sc_var_matrix_tags.insert(sc_var_coup_mtags.begin(), sc_var_coup_mtags.end());
715 TIME_SECTION(
"computeScalarVars", 1);
725 const std::vector<std::shared_ptr<AuxScalarKernel>> & objects =
729 for (
const auto & obj : objects)
733 for (
const auto & var : scalar_vars)
749 TIME_SECTION(
"computeNodalVars", 3);
752 computeNodalVarsHelper<AuxKernel>(nodal);
758 TIME_SECTION(
"computeNodalVecVars", 3);
761 computeNodalVarsHelper<VectorAuxKernel>(nodal);
768 computeNodalVarsHelper<ArrayAuxKernel>(nodal);
774 TIME_SECTION(
"computeMortarNodalVars", 3);
779 "We don't allow creation of block restricted mortar nodal aux kernels.");
784 for (
const auto & [bnd_id, mortar_nodal_auxes] :
786 for (
const auto index :
index_range(mortar_nodal_auxes))
793 _fe_problem, mortar_nodal_warehouse, bnd_id, index);
794 Threads::parallel_reduce(bnd_nodes, mnabt);
799 "nodal Auxiliary variable computation:\n" +
800 std::string(e.what()));
805 "Auxiliary variable computation:\n" +
806 std::string(e.
what()));
808 catch (MetaPhysicL::LogicError & e)
826 TIME_SECTION(
"computeElementalVars", 3);
829 computeElementalVarsHelper<AuxKernel>(elemental);
835 TIME_SECTION(
"computeElementalVecVars", 3);
838 computeElementalVarsHelper<VectorAuxKernel>(elemental);
845 computeElementalVarsHelper<ArrayAuxKernel>(elemental);
850 std::vector<dof_id_type> & ,
851 std::vector<dof_id_type> &
860 std::vector<MooseVariableFEBase *>
vars =
_vars[0].fieldVariables();
861 for (
const auto & var :
vars)
865 FEType fe_type = var->feType();
888 template <
typename AuxKernelType>
901 Threads::parallel_reduce(range, eavt);
906 "Auxiliary variable computation:\n" +
907 std::string(e.
what()));
921 TIME_SECTION(
"computeElementalVecVars", 3);
929 Threads::parallel_reduce(bnd_elems, eabt);
934 "elemental Auxiliary variable computation:\n" +
935 std::string(e.
what()));
947 template <
typename AuxKernelType>
958 Threads::parallel_reduce(range, navt);
968 TIME_SECTION(
"computeBoundaryObjects", 3);
975 Threads::parallel_reduce(bnd_nodes, nabt);
986 std::vector<Number> & rel_diff_norms)
const 995 std::vector<dof_id_type> local_indices_n;
1000 for (
const auto local_index : local_indices_n)
1004 diff_norm_n += Utility::pow<2, Number>(
value - value_old);
1005 norm_n += Utility::pow<2, Number>(
value);
1010 diff_norm_n =
sqrt(diff_norm_n);
1011 norm_n =
sqrt(norm_n);
1012 rel_diff_norms[n] = diff_norm_n / norm_n;
1018 template void AuxiliarySystem::computeElementalVarsHelper<VectorAuxKernel>(
1022 template void AuxiliarySystem::computeNodalVarsHelper<VectorAuxKernel>(
std::string name(const ElemQuality q)
std::vector< std::shared_ptr< TimeIntegrator > > _time_integrators
Time integrator.
void addObject(std::shared_ptr< T > object, THREAD_ID tid=0, bool recurse=true) override
Adds an object to the storage structure.
ExecuteMooseObjectWarehouse< AuxKernel > _nodal_aux_storage
ExecuteMooseObjectWarehouse< AuxKernel > _mortar_nodal_aux_storage
virtual void timestepSetup() override
libMesh::ConstElemRange * getActiveLocalElementRange()
Return pointers to range objects for various types of ranges (local nodes, boundary elems...
virtual void clearActiveScalarVariableCoupleableVectorTags(const THREAD_ID tid) override
void computeNodalVarsHelper(const MooseObjectWarehouse< AuxKernelType > &warehouse)
virtual const char * what() const
Get out the error message.
const std::vector< MooseVariableScalar * > & getScalarVariables(THREAD_ID tid)
bool hasActiveBlockObjects(THREAD_ID tid=0) const
void computeScalarVars(ExecFlagType type)
void sort(THREAD_ID tid=0)
Performs a sort using the DependencyResolver.
This class evaluates a single mortar nodal aux kernel.
NumericVector< Number > & solution()
virtual void addVariable(const std::string &var_type, const std::string &var_name, InputParameters ¶meters)
Canonical method for adding a variable.
virtual void copyCurrentIntoPreviousNL()
Copies the current solution into the previous nonlinear iteration solution.
void mooseError(Args &&... args)
Emit an error message with the given stringified, concatenated args and terminate the application...
virtual void clearActiveScalarVariableCoupleableMatrixTags(const THREAD_ID tid) override
void updateActive(THREAD_ID tid=0) override
Updates the active objects storage.
virtual void setActiveScalarVariableCoupleableMatrixTags(std::set< TagID > &mtags, 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
void local_variable_indices(T &idx, const MeshBase &mesh, unsigned int var_num) const
void translateMetaPhysicLError(const MetaPhysicL::LogicError &)
emit a relatively clear error message when we catch a MetaPhysicL logic error
T * get(const std::unique_ptr< T > &u)
The MooseUtils::get() specializations are used to support making forwards-compatible code changes fro...
AuxiliarySystem(FEProblemBase &subproblem, const std::string &name)
ExecuteMooseObjectWarehouse< ArrayAuxKernel > _nodal_array_aux_storage
virtual void updateActive(THREAD_ID tid)
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 void customSetup(const ExecFlagType &exec_type, THREAD_ID tid=0) const
const NumericVector< Number > *const & currentSolution() const override
The solution vector that is currently being operated on.
Order default_quadrature_order() const
void computeElementalVarsHelper(const MooseObjectWarehouse< AuxKernelType > &warehouse)
const Parallel::Communicator & _communicator
The following methods are specializations for using the libMesh::Parallel::packed_range_* routines fo...
Base class for a system (of equations)
ExecuteMooseObjectWarehouse< AuxScalarKernel > _aux_scalar_storage
bool needMaterialOnSide(BoundaryID bnd_id)
Indicated whether this system needs material properties on boundaries.
virtual void reinitElem(const Elem *elem, THREAD_ID tid) override
Reinit an element assembly info.
std::unique_ptr< NumericVector< Number > > _serialized_solution
Serialized version of the solution vector, or nullptr if a serialized solution is not needed...
virtual void residualSetup() override
libMesh::ConstNodeRange * getLocalNodeRange()
Specialization of SubProblem for solving nonlinear equations plus auxiliary equations.
FEProblemBase & _fe_problem
void computeMortarNodalVars(ExecFlagType type)
dof_id_type n_dofs() const
virtual unsigned int nVariables() const
Get the number of variables in this system.
bool hasActiveBoundaryObjects(THREAD_ID tid=0) const
virtual const std::string & name() const
virtual void jacobianSetup()
ExecuteMooseObjectWarehouse< AuxKernelBase > _kokkos_elemental_aux_storage
void setScalarVariableCoupleableTags(ExecFlagType type)
void clearScalarVariableCoupleableTags()
std::set< std::string > getDependObjects()
virtual void jacobianSetup() override
ExecuteMooseObjectWarehouse< ArrayAuxKernel > _elemental_array_aux_storage
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...
void computeNodalArrayVars(ExecFlagType type)
virtual std::unique_ptr< Base > create()=0
void computeElementalVars(ExecFlagType type)
Real value(unsigned n, unsigned alpha, unsigned beta, Real x)
Base class for making kernels that work on auxiliary scalar variables.
boundary_id_type BoundaryID
virtual void timestepSetup(THREAD_ID tid=0) const
virtual libMesh::Order getMinQuadratureOrder() override
Get the minimum quadrature order for evaluating elemental auxiliary variables.
virtual void setActiveScalarVariableCoupleableVectorTags(std::set< TagID > &vtags, const THREAD_ID tid) override
This is a "smart" enum class intended to replace many of the shortcomings in the C++ enum type It sho...
void kokkosCompute(ExecFlagType type)
virtual void initialSetup(THREAD_ID tid=0) const
Convenience methods for calling object setup methods.
virtual void addVariable(const std::string &var_type, const std::string &name, InputParameters ¶meters) override
Canonical method for adding a variable.
Interface for objects interacting with the PerfGraph.
void jacobianSetup(THREAD_ID tid=0) const override
Convenience methods for calling object setup methods.
const std::map< BoundaryID, std::vector< std::shared_ptr< T > > > & getActiveBoundaryObjects(THREAD_ID tid=0) const
virtual void reinitElemFace(const Elem *elem, unsigned int side, THREAD_ID tid) override
Reinit assembly info for a side of an element.
virtual ~AuxiliarySystem()
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< MooseVariableFEBase * > > _nodal_vars
virtual void initialSetup() override
Setup Functions.
ExecuteMooseObjectWarehouse< VectorAuxKernel > _nodal_vec_aux_storage
std::vector< std::vector< MooseVariableFieldBase * > > _elem_vars
Elemental variables.
ExecuteMooseObjectWarehouse< AuxKernelBase > _kokkos_nodal_aux_storage
FEProblemBase & _fe_problem
the governing finite element/volume problem
std::vector< VariableWarehouse > _vars
Variable warehouses (one for each thread)
Provides a way for users to bail out of the current solve.
virtual void subdomainSetup()
void addKernel(const std::string &kernel_name, const std::string &name, InputParameters ¶meters)
Adds an auxiliary kernel.
Class for containing MooseEnum item information.
bool hasActiveObjects(THREAD_ID tid=0) const
CTSub CT_OPERATOR_BINARY CTMul CTCompareLess CTCompareGreater CTCompareEqual _arg template * sqrt(_arg)) *_arg.template D< dtag >()) CT_SIMPLE_UNARY_FUNCTION(tanh
virtual void compute(ExecFlagType type) override
Compute auxiliary variables.
IntRange< T > make_range(T beg, T end)
void computeNodalVars(ExecFlagType type)
virtual const NumericVector< Number > * solutionPreviousNewton() const
virtual void customSetup(const ExecFlagType &exec_type)
void addScalarKernel(const std::string &kernel_name, const std::string &name, InputParameters ¶meters)
Adds a scalar kernel.
ExecuteMooseObjectWarehouse< AuxKernel > _elemental_aux_storage
virtual void customSetup(const ExecFlagType &exec_type) override
libMesh::StoredRange< MooseMesh::const_bnd_elem_iterator, const BndElement * > * getBoundaryElementRange()
MOOSE now contains C++17 code, so give a reasonable error message stating what the user can do to add...
virtual void serializeSolution()
void computeNodalVecVars(ExecFlagType type)
void computeElementalArrayVars(ExecFlagType type)
ExecuteMooseObjectWarehouse< VectorAuxKernel > _elemental_vec_aux_storage
NumericVector< Number > & solutionOld()
virtual void initialSetup()
Setup Functions.
bool defaultGhosting()
Whether or not the user has requested default ghosting ot be on.
virtual Real & dt() const
const DofMap & get_dof_map() const
virtual void residualSetup()
void residualSetup(THREAD_ID tid=0) const override
virtual void subdomainSetup(THREAD_ID tid=0) const
libMesh::StoredRange< MooseMesh::const_bnd_node_iterator, const BndNode * > * getBoundaryNodeRange()
auto index_range(const T &sizable)
void variableWiseRelativeSolutionDifferenceNorm(std::vector< Number > &var_diffs) const
Computes and stores ||current - old|| / ||current|| for each variable in the given vector...
void computeElementalVecVars(ExecFlagType type)
virtual void subdomainSetup() override
virtual void timestepSetup()
virtual void localize(std::vector< T > &v_local) const=0