/* $Id: precond.cc,v 1.2 1996/10/04 15:07:16 roitzsch Exp $ (C)opyright 1996 by Konrad-Zuse-Center, Berlin All rights reserved. Part of the Kaskade distribution */ #include "precond.h" #include "sysmat.h" #include "sysmatsp.h" #include "family.h" #include "dirichlet.h" #include "cmdpars.h" extern CmdPars Cmd; // Note: // // single- and multi-grid preconditioners delete all system matrices // which have been handed over to them (via the function update(...)) //------------------------------------------------------------------------- Preconditioner:: Preconditioner() : AP(0) { infoLinSystem = 0; Cmd.get("infoLinSystem", &infoLinSystem); timeLinSystem = 0; Cmd.get("timeLinSystem", &timeLinSystem); accTimeLinSystem = 0; Cmd.get("accTimeLinSystem", &accTimeLinSystem); infoPrecond = 0; Cmd.get("infoPrecond", &infoPrecond); } //------------------------------------------------------------------------- Preconditioner:: ~Preconditioner() { delete AP; } //------------------------------------------------------------------------- void Preconditioner:: update(SystemMatrix* APNew, FamilyTree* /*familyTree0*/, DirichletBCs* dirichletBCs0) { dirichletBCs = dirichletBCs0; if (APNew != AP) { delete AP; AP = APNew; } initParameters(); } //------------------------------------------------------------------------- void Preconditioner:: AMult(Vector& lhs, SystemMatrix* A, Vector& rhs) { A->Mult(lhs,rhs); } void Preconditioner:: ATMult(Vector& lhs, SystemMatrix* A,Vector& rhs) { A->ATMult(lhs,rhs); } //------------------------------------------------------------------------- void Preconditioner:: residual(Vector& newR, Vector& r, SystemMatrix& A, Vector& e) { int n, dim; dim = A.Dim(); for (n=1; n<=dim; ++n) newR[n] = 0.0; // local smoothing possible! A.Mult(newR,e); for (n=1; n<=dim; ++n) newR[n] = r[n]-newR[n]; }