48 #ifndef MUI_BICONJUGATE_GRADIENT_STABILIZED_H_
49 #define MUI_BICONJUGATE_GRADIENT_STABILIZED_H_
57 template<
typename ITYPE,
typename VTYPE>
61 bicgstab_solve_tol_(bicgstab_solve_tol),
62 bicgstab_max_iter_(bicgstab_max_iter),
64 assert(b_.get_cols() == 1 &&
65 "MUI Error [solver_bicgstab.h]: Number of column of b matrix must be 1");
66 x_.resize(A_.get_rows(),1);
67 r_.resize(A_.get_rows(),1);
68 rTilde_.resize(A_.get_rows(),1);
69 v_.resize(A_.get_rows(),1);
70 t_.resize(A_.get_rows(),1);
71 p_.resize(A_.get_rows(),1);
72 s_.resize(A_.get_rows(),1);
73 h_.resize(A_.get_rows(),1);
74 y_.resize(A_.get_rows(),1);
75 z_.resize(A_.get_rows(),1);
84 template<
typename ITYPE,
typename VTYPE>
88 bicgstab_solve_tol_(bicgstab_solve_tol),
89 bicgstab_max_iter_(bicgstab_max_iter),
91 assert(A_.get_rows() == b_.get_rows() &&
92 "MUI Error [solver_bicgstab.h]: Number of rows of A matrix must be the same as the number of rows of b matrix");
93 b_column_.resize(b_.get_rows(),1);
94 x_.resize(b_.get_rows(),b_.get_cols());
95 x_init_column_.resize(b_.get_rows(),1);
99 template<
typename ITYPE,
typename VTYPE>
120 bicgstab_solve_tol_ = 0;
121 bicgstab_max_iter_ = 0;
130 template<
typename ITYPE,
typename VTYPE>
136 b_column_.set_zero();
137 x_init_column_.set_zero();
139 bicgstab_solve_tol_ = 0;
140 bicgstab_max_iter_ = 0;
149 template<
typename ITYPE,
typename VTYPE>
151 if (!x_init.
empty()){
152 assert(((x_init.
get_rows() == x_.get_rows()) && (x_init.
get_cols() == x_.get_cols())) &&
153 "MUI Error [solver_bicgstab.h]: Size of x_init matrix mismatch with size of x_ matrix");
169 bool debug_switch =
true;
172 std::cout <<
"MUI Warning [solver_bicgstab.h]: Preconditioner is not yet supported by BiCGStab yet. "
173 <<
"The preconditioner is ignored."<< std::endl;
174 debug_switch =
false;
177 if (M_ && debug_switch) {
179 tempR = M_->apply(r_);
186 VTYPE r_norm0 = r_.dot_product(r_);
188 "MUI Error [solver_bicgstab.h]: Divide by zero assert for r_norm0");
189 VTYPE r_norm = r_norm0;
190 VTYPE r_norm_rel = std::sqrt(r_norm/r_norm0);
193 if(bicgstab_max_iter_ == 0) {
196 kIter = bicgstab_max_iter_;
199 ITYPE acturalKIterCount = 0;
201 for (ITYPE k = 0; k < kIter; ++k) {
204 rho_ = rTilde_.dot_product(r_);
206 "MUI Error [solver_bicgstab.h]: Divide by zero assert for rhoTilde_");
208 "MUI Error [solver_bicgstab.h]: Divide by zero assert for omega_");
210 beta_ = (rho_ / rhoTilde_) * (alpha_ / omega_);
214 p_.copy(r_ + beta_p_omega_dot_v);
222 if (M_ && debug_switch) {
224 tempY = M_->apply(y_);
231 VTYPE rTilde_dot_v = rTilde_.dot_product(v_);
233 "MUI Error [solver_bicgstab.h]: Divide by zero assert for rTilde_dot_v");
234 alpha_ = rho_ / rTilde_dot_v;
237 h_.copy(x_ + alpha_dot_p);
240 s_.copy(r_ - alpha_dot_v);
244 if (M_ && debug_switch) {
246 tempZ = M_->apply(z_);
253 VTYPE t_dot_t = t_.dot_product(t_);
255 "MUI Error [solver_bicgstab.h]: Divide by zero assert for t_dot_t");
256 omega_ = t_.dot_product(s_) / t_dot_t;
259 x_.copy(h_ + omega_dot_s);
262 r_.copy(s_ - omega_dot_t);
264 if (M_ && debug_switch) {
266 tempR = M_->apply(r_);
273 r_norm = r_.dot_product(r_);
274 r_norm_rel = std::sqrt(r_norm/r_norm0);
275 if (r_norm_rel <= bicgstab_solve_tol_) {
281 return std::make_pair(acturalKIterCount,r_norm_rel);
285 template<
typename ITYPE,
typename VTYPE>
287 if (!x_init.
empty()){
288 assert(((x_init.
get_rows() == b_.get_rows()) && (x_init.
get_cols() == b_.get_cols())) &&
289 "MUI Error [solver_bicgstab.h]: Size of x_init matrix mismatch with size of b_ matrix");
292 std::pair<ITYPE, VTYPE> bicgstabReturn;
293 for (ITYPE j = 0; j < b_.get_cols(); ++j) {
294 b_column_.set_zero();
295 b_column_ = b_.segment(0,(b_.get_rows()-1),j,j);
297 if (!x_init.
empty()) {
298 x_init_column_.set_zero();
301 std::pair<ITYPE, VTYPE> bicgstabReturnTemp = bicgstab.
solve(x_init_column_);
302 if (bicgstabReturn.first < bicgstabReturnTemp.first)
303 bicgstabReturn.first = bicgstabReturnTemp.first;
304 bicgstabReturn.second += bicgstabReturnTemp.second;
307 for (ITYPE i = 0; i < x_column.
get_rows(); ++i) {
308 x_.set_value(i, j, x_column.
get_value(i,0));
311 bicgstabReturn.second /= b_.get_cols();
313 return bicgstabReturn;
317 template<
typename ITYPE,
typename VTYPE>
323 template<
typename ITYPE,
typename VTYPE>
sparse_matrix< ITYPE, VTYPE > getSolution()
Definition: solver_bicgstab.h:318
biconjugate_gradient_stabilized_1d(sparse_matrix< ITYPE, VTYPE >, sparse_matrix< ITYPE, VTYPE >, VTYPE=1e-6, ITYPE=0, preconditioner< ITYPE, VTYPE > *=nullptr)
Definition: solver_bicgstab.h:58
std::pair< ITYPE, VTYPE > solve(sparse_matrix< ITYPE, VTYPE >=sparse_matrix< ITYPE, VTYPE >())
Definition: solver_bicgstab.h:150
~biconjugate_gradient_stabilized_1d()
Definition: solver_bicgstab.h:100
~biconjugate_gradient_stabilized()
Definition: solver_bicgstab.h:131
biconjugate_gradient_stabilized(sparse_matrix< ITYPE, VTYPE >, sparse_matrix< ITYPE, VTYPE >, VTYPE=1e-6, ITYPE=0, preconditioner< ITYPE, VTYPE > *=nullptr)
Definition: solver_bicgstab.h:85
sparse_matrix< ITYPE, VTYPE > getSolution()
Definition: solver_bicgstab.h:324
std::pair< ITYPE, VTYPE > solve(sparse_matrix< ITYPE, VTYPE >=sparse_matrix< ITYPE, VTYPE >())
Definition: solver_bicgstab.h:286
Definition: preconditioner.h:55
ITYPE get_rows() const
Definition: matrix_io_info.h:579
void set_zero()
Definition: matrix_manipulation.h:418
VTYPE get_value(ITYPE, ITYPE) const
Definition: matrix_io_info.h:523
sparse_matrix< ITYPE, VTYPE > segment(ITYPE, ITYPE, ITYPE, ITYPE, bool=true)
Definition: matrix_manipulation.h:153
ITYPE get_cols() const
Definition: matrix_io_info.h:585
void copy(const sparse_matrix< ITYPE, VTYPE > &)
Definition: matrix_manipulation.h:79
bool empty() const
Definition: matrix_io_info.h:665
u u u u u u min
Definition: dim.h:289
SCALAR max(vexpr< E, SCALAR, D > const &u)
Definition: point.h:350