13#ifndef dealii_solver_minres_h
14#define dealii_solver_minres_h
67template <
typename VectorType = Vector<
double>>
101 template <
typename MatrixType,
typename PreconditionerType>
105 void solve(const MatrixType &A,
108 const PreconditionerType &preconditioner);
119 "The preconditioner
for MinRes must be a symmetric and "
120 "definite operator, even though MinRes can solve linear "
121 "systems with symmetric and *indefinite* operators. "
122 "During iterations, MinRes has detected that the "
123 "preconditioner is apparently not definite.");
139 print_vectors(const
unsigned int step,
142 const VectorType &d) const;
158template <
typename VectorType>
164 , res2(
numbers::signaling_nan<double>())
169template <
typename VectorType>
172 const AdditionalData &)
174 , res2(
numbers::signaling_nan<double>())
179template <
typename VectorType>
187template <
typename VectorType>
192 const VectorType &)
const
197template <
typename VectorType>
199template <
typename MatrixType,
typename PreconditionerType>
206 const PreconditionerType &preconditioner)
223 vecptr u[3] = {Vu0.get(), Vu1.get(), Vu2.get()};
224 vecptr m[3] = {Vm0.get(), Vm1.get(), Vm2.get()};
229 u[0]->reinit(b,
true);
230 u[1]->reinit(b,
true);
231 u[2]->reinit(b,
true);
232 m[0]->reinit(b,
true);
233 m[1]->reinit(b,
true);
234 m[2]->reinit(b,
true);
238 double delta[3] = {0, 0, 0};
239 double f[2] = {0, 0};
240 double e[2] = {0, 0};
262 preconditioner.vmult(v, *u[1]);
264 delta[1] = v * (*u[1]);
266 Assert(delta[1] >= 0, ExcPreconditionerNotDefinite());
282 const double inv_beta = 1.0 / beta;
289 u[2]->add(-beta /
std::sqrt(delta[0]), *u[0]);
291 const double gamma = *u[2] * v;
292 u[2]->add(-gamma * inv_beta, *u[1]);
298 preconditioner.vmult(v, *u[2]);
300 delta[2] = v * (*u[2]);
302 Assert(delta[2] >= 0, ExcPreconditionerNotDefinite());
311 d_ = s *
e[0] - c *
gamma;
317 const double d =
std::sqrt(d_ * d_ + delta[2]);
318 const double inv_d = 1.0 /
d;
330 m[0]->add(-e[0], *m[1]);
332 m[0]->add(-f[0], *m[2]);
335 r_l2 *= std::fabs(s);
337 conv = this->iteration_status(j, r_l2, x);
* * for(const auto &cell :triangulation.active_cell_iterators())
@ iterate
Continue iteration.
@ success
Stop iteration, goal reached.
virtual ~SolverMinRes() override=default
SolverMinRes(SolverControl &cn, const AdditionalData &data=AdditionalData())
void solve(const MatrixType &A, VectorType &x, const VectorType &b, const PreconditionerType &preconditioner)
virtual void print_vectors(const unsigned int step, const VectorType &x, const VectorType &r, const VectorType &d) const
virtual double criterion()
SolverMinRes(SolverControl &cn, VectorMemory< VectorType > &mem, const AdditionalData &data=AdditionalData())
#define DEAL_II_NAMESPACE_OPEN
#define DEAL_II_CXX20_REQUIRES(condition)
#define DEAL_II_NAMESPACE_CLOSE
#define Assert(cond, exc)
#define DeclExceptionMsg(Exception, defaulttext)
#define AssertThrow(cond, exc)
std::vector< index_type > data
Tpetra::Vector< Number, LO, GO, NodeType< MemorySpace > > VectorType
SymmetricTensor< 2, dim, Number > e(const Tensor< 2, dim, Number > &F)
SymmetricTensor< 2, dim, Number > b(const Tensor< 2, dim, Number > &F)
SymmetricTensor< 2, dim, Number > d(const Tensor< 2, dim, Number > &F, const Tensor< 2, dim, Number > &dF_dt)
long double gamma(const unsigned int n)
::VectorizedArray< Number, width > sqrt(const ::VectorizedArray< Number, width > &)
void swap(ObserverPointer< T, P > &t1, ObserverPointer< T, Q > &t2)