/* $Id: sysmatbl.h,v 1.1.1.1 1996/10/02 10:35:54 roitzsch Exp $ */ #ifndef SYSMATBL_H #define SYSMATBL_H #include "block.h" #include "sysmat.h" #include "sysmatma28.h" class Generation; //------------------------------------------------------------------------- //------------------------------------------------------------------------- class MLBlockMatrix : public MLMatrix, public MA28Matrix { protected: const int nComp; int dimension, noOfBlocks; Bool decomposed, ILUDecomposed, inverseDiag; Vector D; Vector L; Vector *symU; Vector dirichlet, mark, smooth; Vector rp, lp; Vector Block; Num* aux; FixedSizeAllocator dataAlloc; protected: virtual void invertDiagonal(); void setBlockPointers(Vector& lhs, Vector& rhs); void addBlock(int row, int col, Vector& Ap); void addBlock(int row, int col, Vector& data); void setBlockArray(); public: MLBlockMatrix(symmetryType symmetry, int spaceDim, int dim, int nComp); ~MLBlockMatrix(); virtual MLBlockMatrix* castToMLBlockMatrix() { return this; } virtual int Dim() const { return dimension; } virtual int SpaceDim() const { return spaceDim; } virtual void reset(); virtual int memSpace (int print=0) const; virtual int memSpaceLU(int print=0) const; virtual Num& operator()(int row, int col); virtual Num& Diag(int i); virtual Num Diag(int i) const; virtual void extend(int noOfNodes); virtual Bool isMarked(int node) { return Bool(mark[Block[node]]); } virtual void setMark (int node) { mark[Block[node]] = True; } virtual void markNodes(); virtual void unMarkNodes(); virtual void Smooth(int node) { smooth[Block[node]] = True; } virtual void dontSmooth(int node) { smooth[Block[node]] = False; } virtual Bool isSmoothed(int node) { return Bool(smooth[Block[node]]); } virtual void setDirichlet(int node) { dirichlet[node] = True; } virtual void resetRow (int block); virtual void removeRow(int block); virtual void removeLU(); virtual void removeNonSmoothedEntries() { } virtual void GalerkinRestriction(MLMatrix& Ap1, Generation& generation, const Vector* critical=0); virtual Bool DirectSolution() const { return decomposed; } virtual void Decompose(Bool removeOriginal=True); virtual void FBSubst(Vector& lhs, Vector& rhs); virtual void ILUDecompose(Real dropTol); virtual void ILUFBSubst(Vector& lhs, Vector& rhs); virtual void store(const Matrix& AElem, const Vector& globalNodes); 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); virtual void resetDirichletEntries(Vector& r) const; virtual void removeDirichletEntries(DirichletBCs& dirichletBCs); // -- operations for nonlinear solvers: //virtual void smoothNode(int no, Vector& e, const Vector& r); //virtual Num MultRow(int row, const Vector& e); //virtual void symmetricExpansion(); virtual void removeSymmetricExpansion() { } protected: virtual void setSymDirichletBCs(DirichletBCs& dirichletBCs, Vector& b, Vector& bS, Num& Funct, Num& E0); virtual void setASymDirichletBCs(DirichletBCs& dirichletBCs, Vector& b, Vector& bS, Num& Funct, Num& E0); virtual void fillMA28Vectors(); virtual void countEntries(int* dim, int* nEntries); public: virtual void print() const; friend class Interface; }; //------------------------------------------------------------------------- class LocalMLBlockMatrix : public MLBlockMatrix { public: LocalMLBlockMatrix(symmetryType symmetry0, int spaceDim0, int dim0, int nComp0) : MLBlockMatrix(symmetry0, spaceDim0, dim0, nComp0) { } ~LocalMLBlockMatrix() { } virtual LocalMLBlockMatrix* castToLocalMLBlockMatrix() { return this; } virtual void invertDiagonal(); virtual void DiagMult(Vector& lhs, Vector& rhs, Real omega=1.0); virtual void DiagDiv (Vector& lhs, Vector& rhs, Real omega=1.0); 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 void removeNonSmoothedEntries(); }; #endif