31 #include "libmesh/dof_map.h" 32 #include "libmesh/string_to_enum.h" 33 #include "libmesh/fe_interface.h" 34 #include "libmesh/static_condensation.h" 49 std::vector<dof_id_type> & n_nz,
50 std::vector<dof_id_type> & n_oz,
59 const std::string & name,
63 _subproblem(subproblem),
64 _fe_problem(fe_problem),
65 _app(subproblem.getMooseApp()),
66 _factory(_app.getFactory()),
67 _mesh(subproblem.
mesh()),
75 _u_dotdot_old(nullptr),
77 _saved_older(nullptr),
78 _saved_dot_old(nullptr),
79 _saved_dotdot_old(nullptr),
81 _max_var_n_dofs_per_elem(0),
82 _max_var_n_dofs_per_node(0),
83 _automatic_scaling(false),
85 _solution_states_initialized(false),
86 _skip_next_solution_to_old_copy(false)
96 mooseError(
"Variable '", var_name,
"' does not exist in this system");
110 template <
typename T>
114 return *
_vars[tid].getFieldVariable<T>(var_name);
117 template <
typename T>
121 return *
_vars[tid].getActualFieldVariable<T>(var_name);
124 template <
typename T>
128 return *
_vars[tid].getFVVariable<T>(var_name);
131 template <
typename T>
135 return *
_vars[tid].getFieldVariable<T>(var_number);
138 template <
typename T>
142 return *
_vars[tid].getActualFieldVariable<T>(var_number);
150 mooseError(
"Scalar variable '" + var_name +
"' does not exist in this system");
164 const std::set<SubdomainID> *
167 mooseAssert(
_var_map.find(var_number) !=
_var_map.end(),
"Variable does not exist.");
191 Threads::parallel_reduce(elem_range, aldit);
194 aldit.dofIndicesSetUnion();
196 const auto & all_dof_indices = aldit.getDofIndices();
203 if (vars_to_be_zeroed.size() > 0)
209 mooseError(
"System needs to be registered in FEProblemBase for using zeroVariables.");
213 Threads::parallel_reduce(elem_range, aldit);
219 for (
const auto & dof : dof_indices_to_zero)
245 const std::vector<MooseVariableFieldBase *> &
vars =
_vars[0].fieldVariables();
246 for (
const auto & var :
vars)
248 FEType fe_type = var->feType();
261 const std::set<MooseVariableFieldBase *> & active_elemental_moose_variables =
263 const std::vector<MooseVariableFieldBase *> &
vars =
_vars[tid].fieldVariables();
264 for (
const auto & var :
vars)
265 var->clearDofIndices();
267 for (
const auto & var : active_elemental_moose_variables)
268 if (&(var->sys()) ==
this)
273 const std::vector<MooseVariableFieldBase *> &
vars =
_vars[tid].fieldVariables();
274 for (
const auto & var :
vars)
285 const std::set<MooseVariableFieldBase *> & active_elemental_moose_variables =
288 std::vector<MooseVariableFieldBase *> newly_prepared_vars;
290 const std::vector<MooseVariableFieldBase *> &
vars =
_vars[tid].fieldVariables();
291 for (
const auto & var :
vars)
293 mooseAssert(&var->sys() ==
this,
294 "I will cry if we store variables in our warehouse that don't belong to us");
306 if (!active_elemental_moose_variables.count(var))
309 newly_prepared_vars.push_back(var);
315 for (
const auto var_ptr : newly_prepared_vars)
327 const std::vector<MooseVariableFieldBase *> &
vars =
_vars[tid].fieldVariables();
328 for (
const auto & var :
vars)
329 var->prepareNeighbor();
335 const std::vector<MooseVariableFieldBase *> &
vars =
_vars[tid].fieldVariables();
336 for (
const auto & var :
vars)
337 var->prepareLowerD();
345 const std::set<MooseVariableFieldBase *> & active_elemental_moose_variables =
347 for (
const auto & var : active_elemental_moose_variables)
348 if (&(var->sys()) ==
this)
349 var->computeElemValues();
353 const std::vector<MooseVariableFieldBase *> &
vars =
_vars[tid].fieldVariables();
354 for (
const auto & var :
vars)
355 var->computeElemValues();
358 if (
system().has_static_condensation())
362 cast_ptr<StaticCondensation *>(matrix)->set_current_elem(*elem);
369 const std::vector<MooseVariableFieldBase *> &
vars =
_vars[tid].fieldVariables();
370 for (
const auto & var :
vars)
371 var->computeElemValuesFace();
377 const std::vector<MooseVariableFieldBase *> &
vars =
_vars[tid].fieldVariables();
378 for (
const auto & var :
vars)
379 var->computeNeighborValuesFace();
385 const std::vector<MooseVariableFieldBase *> &
vars =
_vars[tid].fieldVariables();
386 for (
const auto & var :
vars)
387 var->computeNeighborValues();
393 const std::vector<MooseVariableFieldBase *> &
vars =
_vars[tid].fieldVariables();
394 for (
const auto & var :
vars)
395 var->computeLowerDValues();
401 const std::vector<MooseVariableFieldBase *> &
vars =
_vars[tid].fieldVariables();
402 for (
const auto & var :
vars)
405 if (var->isNodalDefined())
406 var->computeNodalValues();
413 const std::vector<MooseVariableFieldBase *> &
vars =
_vars[tid].fieldVariables();
414 for (
const auto & var :
vars)
417 if (var->isNodalDefined())
418 var->computeNodalValues();
425 const std::vector<MooseVariableFieldBase *> &
vars =
_vars[tid].fieldVariables();
426 for (
const auto & var :
vars)
428 var->reinitNodes(nodes);
429 var->computeNodalValues();
436 const std::vector<MooseVariableFieldBase *> &
vars =
_vars[tid].fieldVariables();
437 for (
const auto & var :
vars)
439 var->reinitNodesNeighbor(nodes);
440 var->computeNodalNeighborValues();
447 const std::vector<MooseVariableScalar *> &
vars =
_vars[tid].scalars();
448 for (
const auto & var :
vars)
449 var->reinit(reinit_for_derivative_reordering);
459 std::vector<dof_id_type> dof_indices;
463 unsigned int sys_num = sys.
number();
467 for (
const auto & elem_id : ghosted_elems)
476 for (
const auto & dof : dof_indices)
478 send_list.push_back(dof);
483 for (
unsigned int n = 0; n < elem->
n_nodes(); n++)
488 for (
unsigned int v = 0; v <
n_vars; v++)
491 unsigned int var_num = var.
number();
495 if (node->
n_dofs(sys_num, var_num) > 0)
498 for (
unsigned int c = 0; c < n_comp; c++)
499 send_list.push_back(node->
dof_number(sys_num, var_num, c));
518 for (
unsigned int i = 1; i <= states - 1; ++i)
523 for (
unsigned int i = 1; i <= states - 1; ++i)
548 for (
unsigned int i = 1; i <= states - 1; ++i)
552 removeVector(
"save_solution_state_" + std::to_string(i));
574 mooseError(
"Cannot add tagged matrix with TagID ",
578 "' because the tag does not exist in the problem");
594 mooseError(
"Cannot remove the matrix with TagID ",
598 "', because that tag does not exist in the problem");
622 mooseError(
"Cannot add tagged vector with TagID ",
626 "' because the tag does not exist in the problem");
632 if (type != ParallelType::AUTOMATIC && vec.
type() != type)
637 "' because a vector with the same name was found with a different parallel type");
657 "' because that tag does not exist in the problem");
659 mooseError(
"Cannot close vector tag with name '",
663 "' because there is no vector associated with that tag");
670 for (
const auto tag : tags)
682 "' because that tag does not exist in the problem");
684 mooseError(
"Cannot zero vector tag with name '",
688 "' because there is no vector associated with that tag");
696 for (
const auto tag : tags)
704 mooseError(
"Cannot remove the vector with TagID ",
708 "', because that tag does not exist in the problem");
720 const std::string & name,
725 const auto components = parameters.
get<
unsigned int>(
"components");
729 std::set<SubdomainID>
blocks;
730 const auto & block_param = parameters.
get<std::vector<SubdomainName>>(
"block");
731 for (
const auto & subdomain_name : block_param)
739 Utility::string_to_enum<FEFamily>(parameters.
get<
MooseEnum>(
"family")));
740 const auto fe_field_type = FEInterface::field_type(fe_type);
742 unsigned int var_num;
744 if (var_type ==
"ArrayMooseVariable")
747 mooseError(
"Vector family type cannot be used in an array variable");
749 std::vector<std::string> array_var_component_names;
750 const bool has_array_names = parameters.
isParamValid(
"array_var_component_names");
753 array_var_component_names =
754 parameters.
get<std::vector<std::string>>(
"array_var_component_names");
755 if (array_var_component_names.size() != components)
756 parameters.
paramError(
"array_var_component_names",
757 "Must be the same size as 'components' (size ",
759 ") for array variable '",
765 std::vector<std::string> var_names;
766 for (
unsigned int i = 0; i < components; i++)
768 if (!has_array_names)
769 array_var_component_names.push_back(std::to_string(i));
770 var_names.push_back(
name +
"_" + array_var_component_names[i]);
774 parameters.
set<std::vector<std::string>>(
"array_var_component_names") =
775 array_var_component_names;
784 "Must be set to true for variable '",
786 "' because 'components' > 1 (is an array variable)");
787 parameters.
set<
bool>(
"array") =
true;
792 parameters.
paramError(
"array_var_component_names",
793 "Should not be set because this variable (",
795 ") is a non-array variable");
799 parameters.
set<
unsigned int>(
"_var_num") = var_num;
805 std::shared_ptr<MooseVariableBase> var =
810 if (
auto fe_var = dynamic_cast<MooseVariableFieldBase *>(var.get()))
812 auto required_size = var_num + components;
815 for (MooseIndex(components) component = 0; component < components; ++component)
828 if (
auto scalar_var = dynamic_cast<MooseVariableScalar *>(var.get()))
833 mooseError(
"Scalar variables should be functors");
836 if (var->blockRestricted())
838 for (MooseIndex(components) component = 0; component < components; ++component)
839 _var_map[var_num + component].insert(
id);
841 for (MooseIndex(components) component = 0; component < components; ++component)
842 _var_map[var_num + component] = std::set<SubdomainID>();
855 if (
system().has_variable(var_name))
857 if (
std::find(names.begin(), names.end(), var_name) != names.end())
868 if (!
system().has_variable(var_name) &&
869 std::find(names.begin(), names.end(), var_name) != names.end())
879 if (
system().has_variable(var_name))
888 return (
system().variable(var_num).type().family ==
SCALAR);
895 n +=
_vars[0].scalars().size();
904 for (
auto & var :
_vars[0].fieldVariables())
914 for (
auto & var :
_vars[0].fieldVariables())
951 mooseError(
"Cannot retrieve vector with tag ", tag,
" because that tag does not exist");
953 mooseError(
"Cannot retrieve vector with tag ",
957 "'\nbecause a vector has not been associated with that tag.");
969 mooseError(
"Cannot retrieve vector with tag ", tag,
" because that tag does not exist");
971 mooseError(
"Cannot retrieve vector with tag ",
975 "'\nbecause a vector has not been associated with that tag.");
985 mooseError(
"Cannot associate vector to tag ", tag,
" because that tag does not exist");
997 mooseError(
"Cannot disassociate vector from tag ", tag,
" because that tag does not exist");
999 mooseError(
"You can not disassociate a vector from a tag which it was not associated to");
1008 mooseError(
"Cannot disassociate vector from tag ", tag,
" because that tag does not exist");
1019 for (
const auto tag : tags)
1030 mooseError(
"Cannot retrieve matrix with tag ", tag,
" because that tag does not exist");
1032 mooseError(
"Cannot retrieve matrix with tag ",
1036 "'\nbecause a matrix has not been associated with that tag.");
1048 mooseError(
"Cannot retrieve matrix with tag ", tag,
" because that tag does not exist");
1050 mooseError(
"Cannot retrieve matrix with tag ",
1054 "'\nbecause a matrix has not been associated with that tag.");
1063 for (
auto tag : tags)
1071 for (
auto tag : tags)
1080 mooseError(
"Cannot associate matrix to tag ", tag,
" because that tag does not exist");
1092 mooseError(
"Cannot disassociate matrix from tag ", tag,
" because that tag does not exist");
1094 mooseError(
"You can not disassociate a matrix from a tag which it was not associated to");
1103 mooseError(
"Cannot disassociate matrix from tag ", tag,
" because that tag does not exist");
1114 for (
const auto tag : tags)
1126 for (decltype(num_matrix_tags) tag = 0; tag < num_matrix_tags; tag++)
1139 for (
const auto tag :
make_range(num_matrix_tags))
1177 const std::string & source_name,
1178 const std::string & timestep)
1188 bool did_copy =
false;
1193 if (vci._timestep ==
"LATEST")
1198 timestep = MooseUtils::convert<int>(vci._timestep);
1199 if (timestep > n_steps)
1200 mooseError(
"Invalid value passed as \"initial_from_file_timestep\". Expected \"LATEST\" or " 1201 "a valid integer between 1 and ",
1203 " inclusive, received ",
1211 const auto & var =
getVariable(0, vci._dest_name);
1214 const auto & array_var = getFieldVariable<RealEigenVector>(0, vci._dest_name);
1215 for (MooseIndex(var.count()) i = 0; i < var.count(); ++i)
1217 const auto & exodus_var = var.arrayVariableComponent(i);
1218 const auto & system_var = array_var.componentName(i);
1236 mooseError(
"Unrecognized variable ", vci._dest_name,
" in variables to copy.");
1275 for (
unsigned int i = states - 1; i > 0; --i)
1306 const auto n_states =
1310 for (
unsigned int i = n_states - 1; i > 0; --i)
1322 mooseError(
"Cannot restore solutions without old solution");
1369 unsigned int state = 0;
1373 state =
std::max(state, var->oldestSolutionStateRequested());
1375 state =
std::max(state, var->oldestSolutionStateRequested());
1386 mooseAssert(state != 0,
"Not an old state");
1392 else if (state == 2)
1400 return "solution_state_" + std::to_string(state) +
"_" +
Moose::stringify(iteration_type);
1410 "': solution state ",
1412 " was requested in ",
1414 " but only up to state ",
1415 (
_solution_states[static_cast<unsigned short>(iteration_type)].size() == 0)
1417 :
_solution_states[static_cast<unsigned short>(iteration_type)].size() - 1,
1420 const auto & solution_states =
_solution_states[
static_cast<unsigned short>(iteration_type)];
1423 mooseAssert(solution_states[0] == &
solutionInternal(),
"Inconsistent current solution");
1425 mooseAssert(solution_states[state] ==
1427 "Inconsistent solution state");
1429 return *solution_states[state];
1438 return *
_solution_states[
static_cast<unsigned short>(iteration_type)][state];
1446 mooseError(
"solutionStateParallelType() may only be called if the solution state exists.");
1448 return _solution_states[
static_cast<unsigned short>(iteration_type)][state]->type();
1456 libmesh_parallel_only(this->
comm());
1457 mooseAssert(!Threads::in_threads,
1458 "This routine is not thread-safe. Request the solution state before using it in " 1459 "a threaded region.");
1464 auto & solution_states =
_solution_states[
static_cast<unsigned short>(iteration_type)];
1465 solution_states.resize(state + 1);
1468 if (!solution_states[0])
1471 mooseAssert(solution_states[0] == &
solutionInternal(),
"Inconsistent current solution");
1474 for (
unsigned int i = 1; i <= state; ++i)
1475 if (!solution_states[i])
1479 solution_states[i] = &
addVector(tag,
true, parallel_type);
1489 mooseError(
"The solution state has already been declared as PARALLEL");
1492 "Inconsistent solution state");
1499 for (MooseIndex(
_vars) thread = 0; thread <
_vars.size(); ++thread)
1501 auto & field_variables =
_vars[thread].fieldVariables();
1502 for (MooseIndex(field_variables) i = 0, p = 0; i < field_variables.size(); ++i)
1504 auto factors = field_variables[i]->arrayScalingFactor();
1505 for (
unsigned int j = 0; j < field_variables[i]->count(); ++j, ++p)
1506 factors[j] /= inverse_scaling_factors[p];
1508 field_variables[i]->scalingFactor(factors);
1511 auto offset = field_variables.size();
1513 auto & scalar_variables =
_vars[thread].scalars();
1514 for (MooseIndex(scalar_variables) i = 0; i < scalar_variables.size(); ++i)
1515 scalar_variables[i]->scalingFactor(
1516 {1. / inverse_scaling_factors[offset + i] * scalar_variables[i]->scalingFactor()});
1520 _console <<
"Automatic scaling factors:\n";
1526 for (
const auto & field_variable : field_variables)
1528 const auto & factors = field_variable->arrayScalingFactor();
1529 _console <<
" " << field_variable->name() <<
":";
1530 for (
const auto i :
make_range(field_variable->count()))
1534 for (
const auto & scalar_variable : scalar_variables)
1535 _console <<
" " << scalar_variable->name() <<
": " << scalar_variable->scalingFactor()
1549 addVector(
"scaling_factors",
false, libMesh::ParallelType::GHOSTED);
1604 for (
auto & var_warehouse :
_vars)
1605 var_warehouse.clearAllDofIndices();
1611 _vars[tid].setActiveVariableCoupleableVectorTags(vtags);
1618 _vars[tid].setActiveScalarVariableCoupleableVectorTags(vtags);
1648 const std::string & name,
1665 if (ti->integratesVar(var_num))
1679 mooseError(
"No time integrator found that integrates variable number ",
1680 std::to_string(var_num));
1683 const std::vector<std::shared_ptr<TimeIntegrator>> &
1695 const std::set<SubdomainID> &
1710 for (
const auto & warehouse :
_vars)
1711 for (
const auto & [var_num, var_ptr] : warehouse.numberToVariableMap())
1712 var_ptr->sizeMatrixTagData();
1716 const std::string & var_name);
1719 SystemBase::getFieldVariable<RealVectorValue>(
THREAD_ID tid,
const std::string & var_name);
1722 SystemBase::getFieldVariable<RealEigenVector>(
THREAD_ID tid,
const std::string & var_name);
1725 unsigned int var_number);
1728 SystemBase::getFieldVariable<RealVectorValue>(
THREAD_ID tid,
unsigned int var_number);
1731 SystemBase::getFieldVariable<RealEigenVector>(
THREAD_ID tid,
unsigned int var_number);
1734 SystemBase::getActualFieldVariable<Real>(
THREAD_ID tid,
const std::string & var_name);
1737 SystemBase::getActualFieldVariable<RealVectorValue>(
THREAD_ID tid,
const std::string & var_name);
1740 SystemBase::getActualFieldVariable<RealEigenVector>(
THREAD_ID tid,
const std::string & var_name);
1743 SystemBase::getActualFieldVariable<Real>(
THREAD_ID tid,
unsigned int var_number);
1746 SystemBase::getActualFieldVariable<RealVectorValue>(
THREAD_ID tid,
unsigned int var_number);
1749 SystemBase::getActualFieldVariable<RealEigenVector>(
THREAD_ID tid,
unsigned int var_number);
1752 const std::string & var_name);
std::string name(const ElemQuality q)
void zeroTaggedVector(const TagID tag)
Zero vector with the given tag.
std::vector< std::shared_ptr< TimeIntegrator > > _time_integrators
Time integrator.
virtual const std::set< SubdomainID > * getVariableBlocks(unsigned int var_number)
Get the block where a variable of this system is defined.
virtual void reinitNode(const Node *node, THREAD_ID tid)
Reinit nodal assembly info.
const std::vector< MooseVariableFieldBase * > & getVariables(THREAD_ID tid)
void closeTaggedVector(const TagID tag)
Close vector with the given tag.
virtual const NumericVector< Number > *const & currentSolution() const =0
The solution vector that is currently being operated on.
std::vector< std::vector< MooseVariableFieldBase * > > _numbered_vars
Map variable number to its pointer.
dof_id_type end_dof(const processor_id_type proc) const
libMesh::ConstElemRange * getActiveLocalElementRange()
Return pointers to range objects for various types of ranges (local nodes, boundary elems...
dof_id_type dof_number(const unsigned int s, const unsigned int var, const unsigned int comp) const
KOKKOS_INLINE_FUNCTION const T * find(const T &target, const T *const begin, const T *const end)
Find a value in an array.
std::vector< dof_id_type > _var_all_dof_indices
Container for the dof indices of a given variable.
std::vector< Real > _du_dot_du
Derivative of time derivative of u with respect to uj.
const Variable & variable(unsigned int var) const
virtual NumericVector< Number > & solutionInternal() const =0
Internal getter for solution owned by libMesh.
std::vector< libMesh::SparseMatrix< Number > * > _tagged_matrices
Tagged matrices (pointer)
const std::vector< MooseVariableScalar * > & getScalarVariables(THREAD_ID tid)
void zeroTaggedVectors(const std::set< TagID > &tags)
Zero all vectors for given tags.
bool hasVector(const std::string &tag_name) const
Check if the named vector exists in the system.
void applyScalingFactors(const std::vector< Real > &inverse_scaling_factors)
Applies scaling factors to the system's variables.
virtual bool uDotDotOldRequested()
Get boolean flag to check whether old solution second time derivative needs to be stored...
virtual void augmentSparsity(libMesh::SparsityPattern::Graph &sparsity, std::vector< dof_id_type > &n_nz, std::vector< dof_id_type > &n_oz)=0
Will modify the sparsity pattern to add logical geometric connections.
virtual void copyOldSolutions()
Shifts the solutions backwards in time.
bool _solution_states_initialized
Whether or not the solution states have been initialized.
virtual bool checkNonlocalCouplingRequirement() const =0
std::unordered_map< TagID, libMesh::SparseMatrix< Number > * > _active_tagged_matrices
Active tagged matrices. A matrix is active if its tag-matrix pair is present in the map...
virtual Elem * elemPtr(const dof_id_type i)
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 bool computingScalingJacobian() const =0
Getter for whether we're computing the scaling jacobian.
void dof_indices(const Elem *const elem, std::vector< dof_id_type > &di) const
void mooseError(Args &&... args)
Emit an error message with the given stringified, concatenated args and terminate the application...
const TagName OLDER_SOLUTION_TAG
std::vector< std::string > _vars_to_be_zeroed_on_residual
std::ios_base::fmtflags flags() const
Return the current flags.
NumericVector< Number > * _u_dot_old
old solution vector for u^dot
virtual bool uDotRequested()
Get boolean flag to check whether solution time derivative needs to be stored.
virtual void initSolutionState()
Initializes the solution state.
virtual void disassociateDefaultVectorTags()
Disassociate the vectors associated with the default vector tags of this system.
virtual void reinitElem(const Elem *elem, THREAD_ID tid)
Reinit an element assembly info.
virtual void reinitLowerD(THREAD_ID tid)
Compute the values of the variables on the lower dimensional element.
virtual bool uDotDotRequested()
Get boolean flag to check whether solution second time derivative needs to be stored.
virtual TagID addVectorTag(const TagName &tag_name, const Moose::VectorTagType type=Moose::VECTOR_TAG_RESIDUAL)
Create a Tag.
const TimeIntegrator & getTimeIntegrator(const unsigned int var_num) const
Retrieve the time integrator that integrates the given variable's equation.
virtual const std::set< MooseVariableFieldBase * > & getActiveElementalMooseVariables(const THREAD_ID tid) const
Get the MOOSE variables to be reinited on each element.
virtual void associateVectorToTag(NumericVector< Number > &vec, TagID tag)
Associate a vector for a given tag.
virtual libMesh::Order getMinQuadratureOrder()
Get minimal quadrature order needed for integrating variables in this system.
unsigned int add_variable_array(const std::vector< std::string > &vars, const FEType &type, const std::set< subdomain_id_type > *const active_subdomains=nullptr)
void addFunctor(const std::string &name, const Moose::FunctorBase< T > &functor, const THREAD_ID tid)
add a functor to the problem functor container
virtual libMesh::System & system()=0
Get the reference to the libMesh system.
virtual NumericVector< Number > & solutionState(const unsigned int state, Moose::SolutionIterationType iteration_type=Moose::SolutionIterationType::Time)
Get a state of the solution (0 = current, 1 = old, 2 = older, etc).
bool vectorTagNotZeroed(const TagID tag) const
Checks if a vector tag is in the list of vectors that will not be zeroed when other tagged vectors ar...
bool computingScalingJacobian() const
Whether we are computing an initial Jacobian for automatic variable scaling.
NumericVector< Number > * _u_dotdot
solution vector for u^dotdot
const Parallel::Communicator & comm() const
Order default_quadrature_order() const
NumericVector< Number > & add_vector(std::string_view vec_name, const bool projections=true, const ParallelType type=PARALLEL)
virtual void addVariableToCopy(const std::string &dest_name, const std::string &source_name, const std::string ×tep)
Add info about variable that will be copied.
virtual bool hasMatrix(TagID tag) const
Check if the tagged matrix exists in the system.
virtual NumericVector< Number > * solutionUDotDotOld()
void removeMatrix(TagID tag)
Removes a matrix with a given tag.
virtual void associateMatrixToTag(libMesh::SparseMatrix< Number > &matrix, TagID tag)
Associate a matrix to a tag.
This class provides an interface for common operations on field variables of both FE and FV types wit...
const Parallel::Communicator & _communicator
virtual void prepareFace(THREAD_ID tid, bool resize_data)
Prepare the system for use on sides.
void addScalingVector()
Add the scaling factor vector to the system.
The following methods are specializations for using the libMesh::Parallel::packed_range_* routines fo...
void addTimeIntegrator(const std::string &type, const std::string &name, InputParameters ¶meters)
void setActiveVariableCoupleableVectorTags(const std::set< TagID > &vtags, THREAD_ID tid)
Set the active vector tags for the variables.
Base class for a system (of equations)
virtual void copyPreviousNonlinearSolutions()
Shifts the solutions backwards in nonlinear iteration history.
virtual bool isArrayVariable(const std::string &var_name) const
If a variable is an array variable.
virtual void reinitNodes(const std::vector< dof_id_type > &nodes, THREAD_ID tid)
Reinit variables at a set of nodes.
std::unique_ptr< NumericVector< Number > > _serialized_solution
Serialized version of the solution vector, or nullptr if a serialized solution is not needed...
const TagName PREVIOUS_FP_SOLUTION_TAG
virtual void reinitNodesNeighbor(const std::vector< dof_id_type > &nodes, THREAD_ID tid)
Reinit variables at a set of neighbor nodes.
Specialization of SubProblem for solving nonlinear equations plus auxiliary equations.
MooseVariableFV< T > & getFVVariable(THREAD_ID tid, const std::string &var_name)
Return a finite volume variable.
virtual void disassociateMatrixFromTag(libMesh::SparseMatrix< Number > &matrix, TagID tag)
Disassociate a matrix from a tag.
const std::set< dof_id_type > & getDofIndices() const
auto max(const L &left, const R &right)
NumericVector< Number > & addVector(const std::string &vector_name, const bool project, const libMesh::ParallelType type)
Adds a solution length vector to the system.
void update()
Update the system (doing libMesh magic)
virtual unsigned int nVariables() const
Get the number of variables in this system.
void setActiveScalarVariableCoupleableVectorTags(const std::set< TagID > &vtags, THREAD_ID tid)
Set the active vector tags for the scalar variables.
virtual void activateAllMatrixTags()
Make all existing matrices active.
Grab all the (possibly semi)local dof indices for the variables passed in, in the system passed in...
virtual const std::string & name() const
virtual void jacobianSetup()
unsigned int n_dofs(const unsigned int s, const unsigned int var=libMesh::invalid_uint) const
void unsetf(std::ios_base::fmtflags mask) const
Unset format flags.
void closeTaggedMatrices(const std::set< TagID > &tags)
Close all matrices associated the tags.
std::vector< VarCopyInfo > _var_to_copy
virtual libMesh::DofMap & dofMap()
Gets writeable reference to the dof map.
void sizeVariableMatrixData()
size the matrix data for each variable for the number of matrix tags we have
virtual void deactivateAllMatrixTags()
Make matrices inactive.
void libmesh_ignore(const Args &...)
void copyTimeIntegrators(const SystemBase &other_sys)
Copy time integrators from another system.
unsigned int number() const
virtual NumericVector< Number > & serializedSolution()
Returns a reference to a serialized version of the solution vector for this subproblem.
void remove_vector(std::string_view vec_name)
bool _skip_next_solution_to_old_copy
Whether to skip the next copy from the solution to the old vector.
virtual std::unique_ptr< Base > create()=0
void copyVars(libMesh::ExodusII_IO &io)
virtual const Number & duDotDu(unsigned int var_num=0) const
virtual unsigned int n_nodes() const=0
const TagName OLD_SOLUTION_TAG
void remove_matrix(std::string_view mat_name)
unsigned int n_components() const
virtual void zeroVariablesForResidual()
Zero out the solution for the variables that were registered as needing to have their solutions zeroe...
std::string prefix() const
std::vector< bool > _matrix_tag_active_flags
Active flags for tagged matrices.
std::vector< std::string > _vars_to_be_zeroed_on_jacobian
boundary_id_type BoundaryID
void copy_nodal_solution(System &system, std::string system_var_name, std::string exodus_var_name, unsigned int timestep=1)
Information about variables that will be copied.
virtual NumericVector< Number > * solutionUDot()
void hasScalingVector(const unsigned int nl_sys_num)
Tells this problem that the assembly associated with the given nonlinear system number involves a sca...
VarKindType
Framework-wide stuff.
virtual void prepareNeighbor(THREAD_ID tid)
Prepare the system for use.
An inteface for the _console for outputting to the Console object.
virtual NumericVector< Number > * solutionUDotOld()
virtual void reinitScalars(THREAD_ID tid, bool reinit_for_derivative_reordering=false)
Reinit scalar varaibles.
void copy_elemental_solution(System &system, std::string system_var_name, std::string exodus_var_name, unsigned int timestep=1)
SubProblem & _subproblem
The subproblem for whom this class holds variable data, etc; this can either be the governing finite ...
virtual bool uDotOldRequested()
Get boolean flag to check whether old solution time derivative needs to be stored.
bool have_vector(std::string_view vec_name) const
virtual bool matrixTagActive(TagID tag) const
If or not a matrix tag is active.
This is a "smart" enum class intended to replace many of the shortcomings in the C++ enum type It sho...
virtual void reinitNeighborFace(const Elem *elem, unsigned int side, THREAD_ID tid)
Compute the values of the variables at all the current points.
unsigned int add_variable(std::string_view var, const FEType &type, const std::set< subdomain_id_type > *const active_subdomains=nullptr)
virtual void disassociateVectorFromTag(NumericVector< Number > &vec, TagID tag)
Disassociate a given vector from a given tag.
libMesh::SparseMatrix< Number > & addMatrix(TagID tag)
Adds a matrix with a given tag.
virtual void addDotVectors()
Add u_dot, u_dotdot, u_dot_old and u_dotdot_old vectors if requested by the time integrator.
virtual std::set< dof_id_type > & ghostedElems()
Return the list of elements that should have their DoFs ghosted to this processor.
NumericVector< Real > * _saved_dot_old
virtual bool vectorTagExists(const TagID tag_id) const
Check to see if a particular Tag exists.
virtual bool hasSolutionState(const unsigned int state, Moose::SolutionIterationType iteration_type=Moose::SolutionIterationType::Time) const
Whether or not the system has the solution state (0 = current, 1 = old, 2 = older, etc).
unsigned int number() const
Gets the number of this system.
std::string stringify(const T &t)
conversion to string
void closeTaggedVectors(const std::set< TagID > &tags)
Close all vectors for given tags.
virtual void reinitNeighbor(const Elem *elem, THREAD_ID tid)
Compute the values of the variables at all the current points.
void extraSendList(std::vector< dof_id_type > &send_list, void *context)
Free function used for a libMesh callback.
virtual void needSolutionState(const unsigned int state, Moose::SolutionIterationType iteration_type=Moose::SolutionIterationType::Time, libMesh::ParallelType parallel_type=GHOSTED)
Registers that the solution state state is needed.
const std::vector< std::shared_ptr< TimeIntegrator > > & getTimeIntegrators()
std::streamsize precision() const
Return the current precision.
virtual bool hasVariable(const std::string &var_name) const
Query a system for a variable.
std::map< unsigned int, std::set< SubdomainID > > _var_map
Map of variables (variable id -> array of subdomains where it lives)
virtual void copySolutionsBackwards()
Copy current solution into old and older.
virtual std::set< TagID > defaultMatrixTags() const
Get the default matrix tags associted with this system.
void copy_scalar_solution(System &system, std::vector< std::string > system_var_names, std::vector< std::string > exodus_var_names, unsigned int timestep=1)
virtual void solve()
Solve the system (using libMesh magic)
virtual unsigned int numMatrixTags() const
The total number of tags.
FEProblemBase & _fe_problem
the governing finite element/volume problem
virtual MooseVariableScalar & getScalarVariable(THREAD_ID tid, const std::string &var_name) const
Gets a reference to a scalar variable with specified number.
ParallelType type() const
virtual void saveOldSolutions()
Save the old and older solutions.
std::vector< VariableWarehouse > _vars
Variable warehouses (one for each thread)
const FEType & variable_type(const unsigned int i) const
Base class for time integrators.
virtual void subdomainSetup()
Generic class for solving transient nonlinear problems.
bool _verbose
True if printing out additional information.
void removeVector(const std::string &name)
Remove a vector from the system with the given name.
Class for containing MooseEnum item information.
unsigned int nFVVariables() const
Get the number of finite volume variables in this system.
NumericVector< Number > * _u_dot
solution vector for u^dot
virtual void addVariableToZeroOnResidual(std::string var_name)
Adds this variable to the list of variables to be zeroed during each residual evaluation.
MooseVariableFE< T > & getFieldVariable(THREAD_ID tid, const std::string &var_name)
Gets a reference to a variable of with specified name.
const Node * node_ptr(const unsigned int i) const
void prepareVariableNonlocal(MooseVariableFieldBase *var)
virtual libMesh::SparseMatrix< Number > & getMatrix(TagID tag)
Get a raw SparseMatrix.
virtual void reinitNodeFace(const Node *node, BoundaryID bnd_id, THREAD_ID tid)
Reinit nodal assembly info on a face.
virtual void zeroVariablesForJacobian()
Zero out the solution for the variables that were registered as needing to have their solutions zeroe...
virtual Assembly & assembly(const THREAD_ID tid, const unsigned int sys_num)=0
virtual std::set< TagID > defaultVectorTags() const
Get the default vector tags associated with this system.
TagName oldSolutionStateVectorName(const unsigned int, Moose::SolutionIterationType iteration_type) const
Gets the vector name used for an old (not current) solution state.
Class for scalar variables (they are different).
IntRange< T > make_range(T beg, T end)
std::string prefix() const
libMesh::ParallelType solutionStateParallelType(const unsigned int state, const Moose::SolutionIterationType iteration_type) const
Returns the parallel type of the given solution state.
NumericVector< Real > * _saved_dotdot_old
const std::vector< VariableName > & getVariableNames() const
virtual void prepare(THREAD_ID tid)
Prepare the system for use.
virtual void copyPreviousFixedPointSolutions()
virtual void addVariableToZeroOnJacobian(std::string var_name)
Adds this variable to the list of variables to be zeroed during each Jacobian evaluation.
std::array< std::vector< NumericVector< Number > * >, 3 > _solution_states
2D array of solution state vector pointers; first index corresponds to SolutionIterationType, second index corresponds to state index (0=current, 1=old, 2=older)
virtual const NumericVector< Number > * solutionPreviousNewton() const
virtual void customSetup(const ExecFlagType &exec_type)
const TimeIntegrator * queryTimeIntegrator(const unsigned int var_num) const
Retrieve the time integrator that integrates the given variable's equation.
const std::set< SubdomainID > & getSubdomainsForVar(unsigned int var_number) const
void prepareVariable(MooseVariableFieldBase *var)
Used for preparing the dense residual and jacobian blocks for one particular variable.
virtual bool isScalarVariable(unsigned int var_name) const
unsigned int nFieldVariables() const
Get the number of field variables in this system.
virtual void set(const numeric_index_type i, const T value)=0
virtual void reinitElemFace(const Elem *elem, unsigned int side, THREAD_ID tid)
Reinit assembly info for a side of an element.
virtual TagName vectorTagName(const TagID tag) const
Retrieve the name associated with a TagID.
const ConsoleStream _console
An instance of helper class to write streams to the Console objects.
virtual bool hasActiveElementalMooseVariables(const THREAD_ID tid) const
Whether or not a list of active elemental moose variables has been set.
virtual void prepareLowerD(THREAD_ID tid)
Prepare the system for use for lower dimensional elements.
MooseVariableFieldBase & getVariable(THREAD_ID tid, const std::string &var_name) const
Gets a reference to a variable of with specified name.
const std::string & name() const
dof_id_type first_dof(const processor_id_type proc) const
unsigned int number() const
virtual NumericVector< Number > * solutionUDotDot()
unsigned int n_vars() const
void setVariableGlobalDoFs(const std::string &var_name)
set all the global dof indices for a variable
std::vector< NumericVector< Number > * > _tagged_vectors
Tagged vectors (pointer)
void prefix_with_name(bool value)
NumericVector< Number > & solutionOld()
SystemBase(SubProblem &subproblem, FEProblemBase &fe_problem, const std::string &name, Moose::VarKindType var_kind)
virtual bool hasScalarVariable(const std::string &var_name) const
const TagName PREVIOUS_NL_SOLUTION_TAG
virtual void augmentSendList(std::vector< dof_id_type > &send_list)
Will modify the send_list to add all of the extra ghosted dofs for this system.
virtual void initialSetup()
Setup Functions.
virtual void restoreSolutions()
Restore current solutions (call after your solve failed)
SparseMatrix< Number > & add_matrix(std::string_view mat_name, ParallelType type=PARALLEL, MatrixBuildType mat_build_type=MatrixBuildType::AUTOMATIC)
virtual NumericVector< Number > & getVector(const std::string &name)
Get a raw NumericVector by name.
void extraSparsity(SparsityPattern::Graph &sparsity, std::vector< dof_id_type > &n_nz, std::vector< dof_id_type > &n_oz, void *context)
Free function used for a libMesh callback.
const DofMap & get_dof_map() const
virtual void residualSetup()
std::vector< NumericVector< Number > * > _saved_solution_states
The saved solution states (0 = current, 1 = old, 2 = older, etc)
virtual void disassociateDefaultMatrixTags()
Disassociate the matrices associated with the default matrix tags of this system. ...
void clearAllDofIndices()
Clear all dof indices from moose variables.
unsigned int _max_var_number
Maximum variable number.
virtual void zeroVariables(std::vector< std::string > &vars_to_be_zeroed)
Zero out the solution for the list of variables passed in.
virtual void restoreOldSolutions()
Restore the old and older solutions when the saved solutions present.
void flushTaggedMatrices(const std::set< TagID > &tags)
flushes all matrices associated to tags.
virtual bool matrixTagExists(const TagName &tag_name) const
Check to see if a particular Tag exists.
const NumericVector< Number > & get_vector(std::string_view vec_name) const
NumericVector< Number > * _u_dotdot_old
old solution vector for u^dotdot
virtual TagName matrixTagName(TagID tag)
Retrieve the name associated with a TagID.
SubdomainID getSubdomainID(const SubdomainName &subdomain_name) const
Get the associated subdomain ID for the subdomain name.
virtual void timestepSetup()
MooseVariableField< T > & getActualFieldVariable(THREAD_ID tid, const std::string &var_name)
Returns a field variable pointer - this includes finite volume variables.