/* $Id: sysmat.h,v 1.2 1996/10/04 15:07:39 roitzsch Exp $ */ #ifndef SYSMAT_H #define SYSMAT_H #include "general.h" #include "kvector.h" #include "matrix.h" class SparseMatrix; class MLMatrix; class MLSparseMatrix; class LocalMLSparseMatrix; class MLBlockMatrix; class LocalMLBlockMatrix; class Generation; class DirichletBCs; //------------------------------------------------------------------------- class SystemMatrix { public: const symmetryType symmetry; SystemMatrix(symmetryType symmetry); SystemMatrix(SystemMatrix* A, SystemMatrix* B=0, Num lambda=0.0); virtual ~SystemMatrix() { } virtual SparseMatrix* castToSparseMatrix() { return 0; } virtual MLMatrix* castToMLMatrix() { return 0; } virtual int Dim() const = 0; virtual int SpaceDim() const = 0; virtual void reset() = 0; virtual void checkDiagonal(); virtual int memSpace (int print=0) const = 0; virtual int memSpaceLU(int /*print*/=0) const { return 0; } virtual Num& operator() (int n1, int n2) = 0; virtual Num& Diag(int i) = 0; virtual void store(const Matrix& AElem, const Vector& globalNodes); virtual Bool DirectSolution() const = 0; virtual void Mult (Vector& lhs, Vector& rhs); virtual void ATMult(Vector& lhs, Vector& rhs); virtual void DiagMult(Vector& lhs, Vector& rhs, Real omega=1.0); virtual void DiagDiv (Vector& lhs, Vector& rhs, Real omega=1.0); virtual void LMult(Vector& lhs, Vector& rhs); virtual void UMult(Vector& lhs, Vector& rhs); virtual void F (Vector& lhs, Vector& rhs, Real omega=1.0); virtual void FT (Vector& lhs, Vector& rhs, Real omega=1.0); virtual void Fm1(Vector& lhs, Vector& rhs, Real omega=1.0); virtual void FmT(Vector& lhs, Vector& rhs, Real omega=1.0); virtual Real omegaOpt(int mode) const; virtual void setDirichletBCs(DirichletBCs& dirichletBCs, Vector& b, Vector& bS, Num& Funct, Num& E0) = 0; virtual void resetDirichletEntries(Vector& /*r*/) const { } virtual void Decompose(Bool removeOriginal=True); virtual void ILUDecompose(Real dropTol); virtual void FBSubst(Vector& lhs, Vector& rhs); virtual void ILUFBSubst(Vector& lhs, Vector& rhs); virtual void print() const; virtual void printMatLabFormat() const; virtual void smoothNode(int no, Vector& e, const Vector& r); virtual Num MultRow(int row, const Vector& e); virtual void removeLU(); virtual void symmetricExpansion(); virtual void removeSymmetricExpansion(); void notImplemented(const char* s) const; void callError(const char* s) const; }; //------------------------------------------------------------------------- // -- base class for multi-level matrices class MLMatrix : public SystemMatrix { public: MLMatrix(symmetryType symmetry0) : SystemMatrix(symmetry0) { } ~MLMatrix() { } virtual MLMatrix* castToMLMatrix() { return this; } virtual MLSparseMatrix* castToMLSparseMatrix() { return 0; } virtual LocalMLSparseMatrix* castToLocalMLSparseMatrix() { return 0; } virtual MLBlockMatrix* castToMLBlockMatrix() { return 0; } virtual LocalMLBlockMatrix* castToLocalMLBlockMatrix() { return 0; } virtual void extend(int noOfNodes) = 0; virtual void Smooth(int node) = 0; virtual void dontSmooth(int node) = 0; virtual Bool isSmoothed(int node) = 0; virtual void setDirichlet(int node) = 0; virtual Bool isMarked(int node) = 0; virtual void setMark(int node) = 0; virtual void markNodes() = 0; virtual void unMarkNodes() = 0; virtual void removeNonSmoothedEntries() = 0; virtual void GalerkinRestriction(MLMatrix& Ah, Generation& generation, const Vector* critical=0) = 0; }; #endif