16 #ifndef dealii__solver_cg_h 17 #define dealii__solver_cg_h 20 #include <deal.II/base/config.h> 21 #include <deal.II/lac/tridiagonal_matrix.h> 22 #include <deal.II/lac/solver.h> 23 #include <deal.II/lac/solver_control.h> 24 #include <deal.II/base/exceptions.h> 25 #include <deal.II/base/logstream.h> 26 #include <deal.II/base/subscriptor.h> 29 DEAL_II_NAMESPACE_OPEN
98 template <
typename VectorType = Vector<
double> >
146 const bool compute_condition_number =
false,
147 const bool compute_all_condition_numbers =
false,
168 const AdditionalData &data=AdditionalData());
178 template <typename MatrixType, typename PreconditionerType>
180 solve (const MatrixType &A,
183 const PreconditionerType &precondition);
191 boost::signals2::connection
193 const
std_cxx11::function<
void (
double,
double)> &slot);
201 boost::signals2::connection
203 const
bool every_iteration=false);
211 boost::signals2::connection
213 const
std_cxx11::function<
void (const
std::vector<
double> &)> &slot,
214 const
bool every_iteration=false);
231 const VectorType &d) const;
242 const
std::vector<
double> &diagonal,
243 const
std::vector<
double> &offdiagonal,
245 const boost::signals2::signal<
void (
double)> &cond_signal,
246 const
bool log_eigenvalues,
247 const
bool log_cond);
291 boost::signals2::signal<
void (const
std::vector<
double> &)> eigenvalues_signal;
309 template <
typename VectorType>
313 const bool compute_condition_number,
314 const bool compute_all_condition_numbers,
315 const bool compute_eigenvalues)
317 log_coefficients (log_coefficients),
318 compute_condition_number(compute_condition_number),
319 compute_all_condition_numbers(compute_all_condition_numbers),
320 compute_eigenvalues(compute_eigenvalues)
325 template <
typename VectorType>
330 log_coefficients (
false),
331 compute_condition_number(
false),
332 compute_all_condition_numbers(
false),
333 compute_eigenvalues(
false)
338 template <
typename VectorType>
341 const AdditionalData &data)
349 template <
typename VectorType>
351 const AdditionalData &data)
359 template <
typename VectorType>
365 template <
typename VectorType>
369 return std::sqrt(res2);
374 template <
typename VectorType>
386 template <
typename VectorType>
391 const VectorType &)
const 396 template <
typename VectorType>
399 (
const std::vector<double> &diagonal,
400 const std::vector<double> &offdiagonal,
401 const boost::signals2::signal<
void (
const std::vector<double> &)> &eigenvalues_signal,
402 const boost::signals2::signal<
void (
double)> &cond_signal,
403 const bool log_eigenvalues,
407 if (!cond_signal.empty()|| !eigenvalues_signal.empty() || log_cond ||
411 for (size_type i=0; i<diagonal.size(); ++i)
413 T(i,i) = diagonal[i];
414 if (i< diagonal.size()-1)
415 T(i,i+1) = offdiagonal[i];
417 T.compute_eigenvalues();
419 if (diagonal.size()>1)
421 double condition_number=T.eigenvalue(T.n()-1)/T.eigenvalue(0);
422 cond_signal(condition_number);
426 deallog <<
"Condition number estimate: " <<
427 condition_number << std::endl;
432 if (!eigenvalues_signal.empty())
434 std::vector<double> eigenvalues(T.n());
435 for (
unsigned int j = 0; j < T.n(); ++j)
437 eigenvalues.at(j)=T.eigenvalue(j);
443 for (size_type i=0; i<T.n(); ++i)
444 deallog <<
' ' << T.eigenvalue(i);
445 deallog << std::endl;
453 template <
typename VectorType>
454 template <
typename MatrixType,
typename PreconditionerType>
459 const PreconditionerType &precondition)
466 Vr = this->
memory.alloc();
467 Vz = this->
memory.alloc();
468 Vp = this->
memory.alloc();
471 const bool do_eigenvalues = !condition_number_signal.empty()
472 |!all_condition_numbers_signal.empty()
473 |!eigenvalues_signal.empty()
474 |!all_eigenvalues_signal.empty()
478 double eigen_beta_alpha = 0;
482 std::vector<double> diagonal;
483 std::vector<double> offdiagonal;
486 double res = -std::numeric_limits<double>::max();
501 double gh,alpha,beta;
524 precondition.vmult(h,g);
542 Assert(alpha != 0., ExcDivideByZero());
546 res = std::sqrt(g.add_and_dot(alpha, h, g));
557 precondition.vmult(h,g);
560 Assert(beta != 0., ExcDivideByZero());
575 deallog <<
"alpha-beta:" << alpha <<
'\t' << beta << std::endl;
582 diagonal.push_back(1./alpha + eigen_beta_alpha);
583 eigen_beta_alpha = beta/alpha;
584 offdiagonal.push_back(std::sqrt(beta)/alpha);
587 all_condition_numbers_signal,
false,
597 condition_number_signal,
612 template<
typename VectorType>
613 boost::signals2::connection
615 (
const std_cxx11::function<
void(
double,
double)> &slot)
617 return coefficients_signal.connect(slot);
622 template<
typename VectorType>
623 boost::signals2::connection
625 (
const std_cxx11::function<
void(
double)> &slot,
626 const bool every_iteration)
630 return all_condition_numbers_signal.connect(slot);
634 return condition_number_signal.connect(slot);
640 template<
typename VectorType>
641 boost::signals2::connection
643 (
const std_cxx11::function<
void (
const std::vector<double> &)> &slot,
644 const bool every_iteration)
648 return all_eigenvalues_signal.connect(slot);
652 return eigenvalues_signal.connect(slot);
660 DEAL_II_NAMESPACE_CLOSE
boost::signals2::signal< void(double, double)> coefficients_signal
void solve(const MatrixType &A, VectorType &x, const VectorType &b, const PreconditionerType &precondition)
static void compute_eigs_and_cond(const std::vector< double > &diagonal, const std::vector< double > &offdiagonal, const boost::signals2::signal< void(const std::vector< double > &)> &eigenvalues_signal, const boost::signals2::signal< void(double)> &cond_signal, const bool log_eigenvalues, const bool log_cond)
boost::signals2::signal< void(double)> condition_number_signal
SolverCG(SolverControl &cn, VectorMemory< VectorType > &mem, const AdditionalData &data=AdditionalData())
boost::signals2::connection connect_eigenvalues_slot(const std_cxx11::function< void(const std::vector< double > &)> &slot, const bool every_iteration=false)
virtual void print_vectors(const unsigned int step, const VectorType &x, const VectorType &r, const VectorType &d) const
boost::signals2::signal< void(const std::vector< double > &)> eigenvalues_signal
#define AssertThrow(cond, exc)
BlockDynamicSparsityPattern BlockCompressedSparsityPattern DEAL_II_DEPRECATED
bool compute_condition_number
unsigned int global_dof_index
Stop iteration, goal reached.
#define Assert(cond, exc)
AdditionalData additional_data
virtual double criterion()
bool compute_all_condition_numbers
VectorMemory< VectorType > & memory
boost::signals2::signal< SolverControl::State(const unsigned int iteration, const double check_value, const VectorType ¤t_iterate), StateCombiner > iteration_status
boost::signals2::signal< void(double)> all_condition_numbers_signal
void push(const std::string &text)
boost::signals2::connection connect_condition_number_slot(const std_cxx11::function< void(double)> &slot, const bool every_iteration=false)
boost::signals2::signal< void(const std::vector< double > &)> all_eigenvalues_signal
boost::signals2::connection connect_coefficients_slot(const std_cxx11::function< void(double, double)> &slot)
types::global_dof_index size_type