16 #ifndef dealii_solver_cg_h 17 #define dealii_solver_cg_h 97 template <
typename VectorType = Vector<
double>>
135 template <
typename MatrixType,
typename PreconditionerType>
137 solve(
const MatrixType &
A,
140 const PreconditionerType &preconditioner);
148 boost::signals2::connection
150 const std::function<
void(
typename VectorType::value_type,
151 typename VectorType::value_type)> &slot);
159 boost::signals2::connection
161 const bool every_iteration =
false);
169 boost::signals2::connection
171 const std::function<
void(
const std::vector<double> &)> &slot,
172 const bool every_iteration =
false);
193 const std::vector<typename VectorType::value_type> &
diagonal,
194 const std::vector<typename VectorType::value_type> &offdiagonal,
195 const boost::signals2::signal<
void(
const std::vector<double> &)>
197 const boost::signals2::signal<
void(
double)> &cond_signal);
207 boost::signals2::signal<void(
typename VectorType::value_type,
208 typename VectorType::value_type)>
233 boost::signals2::signal<void(const std::vector<double> &)>
243 template <
typename VectorType>
253 template <
typename VectorType>
261 template <
typename VectorType>
271 template <
typename VectorType>
274 const std::vector<typename VectorType::value_type> &
diagonal,
275 const std::vector<typename VectorType::value_type> &offdiagonal,
276 const boost::signals2::signal<
void(
const std::vector<double> &)>
278 const boost::signals2::signal<
void(
double)> &cond_signal)
285 for (
size_type i = 0; i < diagonal.size(); ++i)
287 T(i, i) = diagonal[i];
288 if (i < diagonal.size() - 1)
289 T(i, i + 1) = offdiagonal[i];
291 T.compute_eigenvalues();
293 if (diagonal.size() > 1)
295 auto condition_number =
T.eigenvalue(
T.n() - 1) /
T.eigenvalue(0);
298 cond_signal(std::abs(condition_number));
305 for (
unsigned int j = 0; j <
T.n(); ++j)
318 template <
typename VectorType>
319 template <
typename MatrixType,
typename PreconditionerType>
324 const PreconditionerType &preconditioner)
326 using number =
typename VectorType::value_type;
343 const bool do_eigenvalues =
349 std::vector<typename VectorType::value_type>
diagonal;
350 std::vector<typename VectorType::value_type> offdiagonal;
355 typename VectorType::value_type eigen_beta_alpha = 0;
384 preconditioner.vmult(h, g);
401 number alpha = d * h;
406 res = std::sqrt(std::abs(g.add_and_dot(alpha, h, g)));
417 preconditioner.vmult(h, g);
423 d.sadd(beta, -1., h);
430 d.sadd(beta, -1., g);
440 diagonal.push_back(number(1.) / alpha + eigen_beta_alpha);
441 eigen_beta_alpha = beta / alpha;
442 offdiagonal.push_back(std::sqrt(beta) / alpha);
463 template <
typename VectorType>
464 boost::signals2::connection
466 const std::function<
void(
typename VectorType::value_type,
467 typename VectorType::value_type)> &slot)
474 template <
typename VectorType>
475 boost::signals2::connection
477 const std::function<
void(
double)> &slot,
478 const bool every_iteration)
492 template <
typename VectorType>
493 boost::signals2::connection
495 const std::function<
void(
const std::vector<double> &)> &slot,
496 const bool every_iteration)
virtual ~SolverCG() override=default
SolverCG(SolverControl &cn, VectorMemory< VectorType > &mem, const AdditionalData &data=AdditionalData())
boost::signals2::signal< void(const std::vector< double > &)> eigenvalues_signal
virtual void print_vectors(const unsigned int step, const VectorType &x, const VectorType &r, const VectorType &d) const
boost::signals2::signal< void(double)> all_condition_numbers_signal
boost::signals2::signal< SolverControl::State(const unsigned int iteration, const double check_value, const VectorType ¤t_iterate), StateCombiner > iteration_status
#define AssertThrow(cond, exc)
static ::ExceptionBase & ExcDivideByZero()
boost::signals2::signal< void(double)> condition_number_signal
boost::signals2::connection connect_condition_number_slot(const std::function< void(double)> &slot, const bool every_iteration=false)
Stop iteration, goal reached.
#define Assert(cond, exc)
AdditionalData additional_data
#define DEAL_II_NAMESPACE_CLOSE
boost::signals2::signal< void(typename VectorType::value_type, typename VectorType::value_type)> coefficients_signal
SymmetricTensor< 2, dim, Number > d(const Tensor< 2, dim, Number > &F, const Tensor< 2, dim, Number > &dF_dt)
SymmetricTensor< 2, dim, Number > b(const Tensor< 2, dim, Number > &F)
void solve(const MatrixType &A, VectorType &x, const VectorType &b, const PreconditionerType &preconditioner)
unsigned int global_dof_index
boost::signals2::signal< void(const std::vector< double > &)> all_eigenvalues_signal
boost::signals2::connection connect_eigenvalues_slot(const std::function< void(const std::vector< double > &)> &slot, const bool every_iteration=false)
#define DEAL_II_NAMESPACE_OPEN
Eigenvalue vector is filled.
static void compute_eigs_and_cond(const std::vector< typename VectorType::value_type > &diagonal, const std::vector< typename VectorType::value_type > &offdiagonal, const boost::signals2::signal< void(const std::vector< double > &)> &eigenvalues_signal, const boost::signals2::signal< void(double)> &cond_signal)
boost::signals2::connection connect_coefficients_slot(const std::function< void(typename VectorType::value_type, typename VectorType::value_type)> &slot)
T max(const T &t, const MPI_Comm &mpi_communicator)
VectorMemory< VectorType > & memory