Solve a linear system using stabilized bi conjugate-gradient method.
Definition at line 20 of file CG.h.
Implements LinearSolver.
Definition at line 26 of file CG.cpp.
References LinearSolver::absoluteTolerance, MultiFieldMatrix::computeResidual(), LinearSystem::getB(), LinearSystem::getBPtr(), LinearSystem::getDelta(), LinearSystem::getDeltaPtr(), LinearSystem::getMatrix(), MultiField::getOneNorm(), LinearSystem::getResidual(), MultiFieldMatrix::multiply(), MultiField::newCopy(), LinearSolver::nMaxIterations, preconditioner, LinearSolver::relativeTolerance, LinearSystem::replaceB(), LinearSystem::replaceDelta(), LinearSolver::smooth(), and LinearSolver::verbosity.
32 shared_ptr<MultiField> bOrig(ls.
getBPtr());
38 shared_ptr<MultiField> r(dynamic_pointer_cast<MultiField>(ls.
getResidual().
newCopy()));
40 shared_ptr<MultiField> p;
41 shared_ptr<MultiField> z(dynamic_pointer_cast<MultiField>(x->newClone()));
42 shared_ptr<MultiField> q(dynamic_pointer_cast<MultiField>(x->newClone()));
52 cout << 0 <<
": " << *rNorm0 << endl;
56 if (
verbosity >0 && MPI::COMM_WORLD.Get_rank() == 0)
57 cout << 0 <<
": " << *rNorm0 << endl;
77 p = dynamic_pointer_cast<
MultiField>(z->newCopy());
81 MFRPtr beta = (*rho) / (*rhoPrev);
88 MFRPtr ptq = p->dotWith(*q);
91 alpha = (*rho)/(*ptq);
96 MFRPtr rNorm = r->getOneNorm();
99 MFRPtr normRatio(rNorm->normalize(*rNorm0));
103 cout << i+1 <<
": " << *rNorm << endl;
107 if (
verbosity >0 && MPI::COMM_WORLD.Get_rank() == 0)
108 cout << i+1 <<
": " << *rNorm << endl;
127 cout <<
"n" <<
": " << *rNormn << endl;
132 if (
verbosity >0 && MPI::COMM_WORLD.Get_rank() == 0)
133 cout <<
"n" <<
": " << *rNormn << endl;
virtual shared_ptr< IContainer > newCopy() const
MultiField & getResidual()
void replaceB(shared_ptr< MultiField > newB)
shared_ptr< MultiField > getDeltaPtr()
shared_ptr< MultiFieldReduction > getOneNorm() const
virtual void computeResidual(const IContainer &xB, const IContainer &bB, IContainer &rB) const
shared_ptr< MultiFieldReduction > MFRPtr
virtual void multiply(IContainer &yB, const IContainer &xB) const
virtual void smooth(LinearSystem &ls)=0
LinearSolver * preconditioner
void replaceDelta(shared_ptr< MultiField > newDelta)
shared_ptr< MultiField > getBPtr()
MultiFieldMatrix & getMatrix()