42#include "libmesh/linear_solver.h"
43#include "libmesh/quadrature_gauss.h"
44#include "libmesh/dense_vector.h"
45#include "libmesh/boundary_info.h"
46#include "libmesh/petsc_matrix.h"
47#include "libmesh/petsc_vector.h"
48#include "libmesh/petsc_nonlinear_solver.h"
49#include "libmesh/numeric_vector.h"
50#include "libmesh/mesh.h"
51#include "libmesh/dense_subvector.h"
52#include "libmesh/dense_submatrix.h"
53#include "libmesh/dof_map.h"
54#include "libmesh/sparse_matrix.h"
55#include "libmesh/petsc_matrix.h"
56#include "libmesh/default_coupling.h"
57#include "libmesh/diagonal_matrix.h"
58#include "libmesh/petsc_solver_exception.h"
71 auto & lin_sys = sys.linearImplicitSystem();
72 auto & matrix = *(sys.linearImplicitSystem().matrix);
73 auto & rhs = *(sys.linearImplicitSystem().rhs);
85 _rhs_non_time_tag(-1),
111#ifdef MOOSE_KOKKOS_ENABLED
123 const auto & var_names =
_vars[0].names();
124 for (
const auto &
name : var_names)
126 mooseError(
"You are trying to add a nonlinear variable to a linear system! The variable "
127 "which is assigned to the wrong system: ",
135 std::vector<LinearFVElementalKernel *> fv_elemental_kernels;
138 .template condition<AttribSysNum>(
number())
139 .template condition<AttribSystem>(
"LinearFVElementalKernel")
140 .template condition<AttribKokkos>(
false)
141 .template condition<AttribThread>(tid)
144 for (
auto * fv_kernel : fv_elemental_kernels)
145 fv_kernel->initialSetup();
147 std::vector<LinearFVFluxKernel *> fv_flux_kernels;
150 .template condition<AttribSysNum>(
number())
151 .template condition<AttribSystem>(
"LinearFVFluxKernel")
152 .template condition<AttribKokkos>(
false)
153 .template condition<AttribThread>(tid)
156 for (
auto * fv_kernel : fv_flux_kernels)
157 fv_kernel->initialSetup();
159 std::vector<LinearFVBoundaryCondition *> fv_bcs;
162 .template condition<AttribSysNum>(
number())
163 .template condition<AttribSystem>(
"LinearFVBoundaryCondition")
164 .template condition<AttribKokkos>(
false)
165 .template condition<AttribThread>(tid)
168 for (
auto * fv_bc : fv_bcs)
169 fv_bc->initialSetup();
172#ifdef MOOSE_KOKKOS_ENABLED
186 const std::set<TagID> & matrix_tags,
187 const bool compute_gradients)
189 parallel_object_only();
191 TIME_SECTION(
"LinearSystem::computeLinearSystemTags", 5);
203 _console <<
"Exception detected " << e.
what() << std::endl;
212 const std::set<TagID> & matrix_tags,
213 const bool compute_gradients)
215 TIME_SECTION(
"computeLinearSystemInternal", 3);
224 for (
auto tag : matrix_tags)
230 LibmeshPetscCall(MatSetOption(petsc_matrix->mat(),
231 MAT_KEEP_NONZERO_PATTERN,
235 MatSetOption(petsc_matrix->mat(), MAT_NEW_NONZERO_ALLOCATION_ERR, PETSC_FALSE));
239 if (compute_gradients)
242#ifdef MOOSE_KOKKOS_ENABLED
253 TIME_SECTION(
"LinearFVKernels_FullSystem", 3 );
301 std::vector<dof_id_type> & ,
302 std::vector<dof_id_type> & )
304 mooseError(
"LinearSystem does not support AugmentSparsity!");
310 TIME_SECTION(
"LinearSystem::solve", 2,
"Solving linear system");
320 auto & linear_solver =
324 _converged = linear_solver.get_converged_reason() > 0;
326 _console <<
"System: " << this->
name() <<
" Initial residual: " << _initial_linear_residual
336 const std::set<TagID> & vector_tags_to_close)
347 std::vector<LinearFVKernel *> kernels;
350 .template condition<AttribSysNum>(this->
number())
351 .template condition<AttribSystem>(
"LinearFVKernel")
354 bool contains_time_kernel =
false;
355 for (
const auto kernel : kernels)
358 if (contains_time_kernel)
362 return contains_time_kernel;
void mooseError(Args &&... args)
Emit an error message with the given stringified, concatenated args and terminate the application.
const ExecFlagType EXEC_NONLINEAR
Adds contributions from volumetric terms discretized using the finite volume method to the matrix and...
Adds contributions from face terms discretized using the finite volume method to the matrix and right...
const ConsoleStream _console
An instance of helper class to write streams to the Console objects.
Specialization of SubProblem for solving nonlinear equations plus auxiliary equations.
virtual void computeLinearSystemSys(libMesh::LinearImplicitSystem &sys, libMesh::SparseMatrix< libMesh::Number > &system_matrix, NumericVector< libMesh::Number > &rhs, const bool compute_gradients=true)
Assemble both the right hand side and the system matrix of a given linear system.
LinearSystem & getLinearSystem(unsigned int sys_num)
Get non-constant reference to a linear system.
virtual Real & dt() const
bool hasKokkosResidualObjects() const
void setCurrentLinearSystem(unsigned int sys_num)
Set the current linear system pointer.
unsigned int linearSysNum(const LinearSystemName &linear_sys_name) const override
virtual MooseMesh & mesh() override
bool errorOnJacobianNonzeroReallocation() const
Will return True if the user wants to get an error when a nonzero is reallocated in the Jacobian by P...
TheWarehouse & theWarehouse() const
Scope guard for starting and stopping Floating Point Exception Trapping.
Shared storage and allocation logic for linear finite-volume cell gradients for variables in the syst...
void rebuildLinearFVGradientStorage()
Rebuild persistent raw and temporary gradient storage after mesh/DOF changes.
Kernel that adds contributions from a time derivative term to a linear system populated using the fin...
virtual void augmentSparsity(SparsityPattern::Graph &sparsity, std::vector< dof_id_type > &n_nz, std::vector< dof_id_type > &n_oz) override
Will modify the sparsity pattern to add logical geometric connections.
NumericVector< Number > & getRightHandSideNonTimeVector()
Return a numeric vector that is associated with the nontime tag.
virtual bool containsTimeKernel() override
If the system has a kernel that corresponds to a time derivative.
Real _initial_linear_residual
The initial linear residual.
virtual void initialSetup() override
Setup Functions.
virtual void stopSolve(const ExecFlagType &exec_flag, const std::set< TagID > &vector_tags_to_close) override
Quit the current solve as soon as possible.
TagID _rhs_tag
Used for the right hand side vector from PETSc.
TagID _system_matrix_tag
Tag for every contribution to system matrix.
System & _sys
Base class reference to the libmesh system.
virtual void reinit() override
Reinitialize the system when the degrees of freedom in this system have changed.
virtual void preInit() override
This is called prior to the libMesh system has been init'd.
unsigned int _n_linear_iters
Number of linear iterations.
virtual System & system() override
Get the reference to the libMesh system.
NumericVector< Number > * _rhs_non_time
right hand side vector for non-time contributions
NumericVector< Number > & getRightHandSideTimeVector()
Return a numeric vector that is associated with the time tag.
unsigned int _current_l_its
The linear iterations needed for convergence.
void computeKokkosLinearSystem(const std::set< TagID > &vector_tags, const std::set< TagID > &matrix_tags)
Assemble the Kokkos contributions to the linear system for the given tags.
Real _final_linear_residual
The final linear residual.
libMesh::LinearImplicitSystem & _linear_implicit_system
Base class reference to the linear implicit system in libmesh.
LinearSystem(FEProblemBase &problem, const std::string &name)
void computeLinearSystemInternal(const std::set< TagID > &vector_tags, const std::set< TagID > &matrix_tags, const bool compute_gradients=true)
Compute the right hand side and system matrix for given tags.
bool _converged
If the solve on the linear system converged.
void computeLinearSystemTags(const std::set< TagID > &vector_tags, const std::set< TagID > &matrix_tags, const bool compute_gradients=true)
Compute the right hand side and the system matrix of the system for given tags.
void initialSetupKokkosLinearFV()
Perform the initial setup of the Kokkos linear finite volume kernels and boundary conditions.
virtual void compute(ExecFlagType type) override
Compute time derivatives, auxiliary variables, etc.
NumericVector< Number > * _rhs_time
right hand side vector for time contributions
virtual void solve() override
Solve the system (using libMesh magic)
void computeGradients()
Compute and store raw and requested limited Green-Gauss gradients for linear FV variables.
SolutionInvalidity & solutionInvalidity()
Get the SolutionInvalidity for this app.
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.
face_info_iterator ownedFaceInfoEnd()
elem_info_iterator ownedElemInfoEnd()
face_info_iterator ownedFaceInfoBegin()
Iterators to owned faceInfo objects.
elem_info_iterator ownedElemInfoBegin()
Iterators to owned faceInfo objects.
Interface for objects interacting with the PerfGraph.
void accumulateIterationIntoTimeStepOccurences()
Pass the number of solution invalid occurrences from current iteration to cumulative counters.
void syncIteration()
Sync iteration counts to main processor Sum across all processors.
virtual void preInit() override
This is called prior to the libMesh system has been init'd.
void checkInvalidSolution()
const NumericVector< Number > * _current_solution
solution vector from solver
virtual TagID addVectorTag(const TagName &tag_name, const Moose::VectorTagType type=Moose::VECTOR_TAG_RESIDUAL)
Create a Tag.
virtual TagID addMatrixTag(TagName tag_name)
Create a Tag.
Base class for a system (of equations)
virtual libMesh::SparseMatrix< Number > & getMatrix(TagID tag)
Get a raw SparseMatrix.
FEProblemBase & _fe_problem
the governing finite element/volume problem
std::vector< std::shared_ptr< TimeIntegrator > > _time_integrators
Time integrator.
MooseVariableFieldBase & getVariable(THREAD_ID tid, const std::string &var_name) const
Gets a reference to a variable of with specified name.
unsigned int number() const
Gets the number of this system.
virtual void activateAllMatrixTags()
Make all existing matrices active.
virtual void initialSetup()
Setup Functions.
virtual void associateVectorToTag(NumericVector< Number > &vec, TagID tag)
Associate a vector for a given tag.
void closeTaggedVectors(const std::set< TagID > &tags)
Close all vectors for given tags.
std::vector< VariableWarehouse > _vars
Variable warehouses (one for each thread)
void closeTaggedMatrices(const std::set< TagID > &tags)
Close all matrices associated the tags.
virtual const std::string & name() const
std::vector< T * > & queryInto(std::vector< T * > &results, Args &&... args)
queryInto executes the query and stores the results in the given vector.
Query query()
query creates and returns an initialized a query object for querying objects from the warehouse.
void full_sparsity_pattern_needed()
NumericVector< Number > * rhs
SparseMatrix< Number > * matrix
Real final_linear_residual() const
virtual LinearSolver< Number > * get_linear_solver() const override
unsigned int n_linear_iterations() const
const T & get(std::string_view) const
std::unique_ptr< NumericVector< Number > > current_local_solution
void attach_assemble_function(void fptr(EquationSystems &es, const std::string &name))
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...
void compute_linear_system(libMesh::EquationSystems &es, const std::string &system_name)
void parallel_reduce(const Range &range, Body &body, unsigned int n_threads=libMesh::n_threads())
The following methods are specializations for using the libMesh::Parallel::packed_range_* routines fo...