/* $Id: problem.h,v 1.1.1.1 1996/10/02 10:35:53 roitzsch Exp $ */ #ifndef PROBLEM_H #define PROBLEM_H #include "general.h" #include "utils.h" #include "numerics.h" #include "stack.h" #include "matrix.h" #include "statistic.h" class MESH; class PATCH; class Element; class Interface; class DirichletBCs; class Material; class NonLinearity; class Jacobian; class ErrorEstimator; class LinSystem; class SystemMatrix; class Preconditioner; class TransientProblem; class Statistic; //------------------------------------------------------------------------- class Problem { public: Problem(char* fileName, symmetryType symmetry, int spaceDim, int nComp=1); virtual ~Problem(); virtual Bool solve(Real relGlobalPrecision); virtual void compare(Vector& u, Real time); int SpaceDim() const { return spaceDim; } int NComp() const { return nComp; } protected: char* fileName; // triangulation (kaskade .geo file) const symmetryType symmetry; const int spaceDim, nComp; int maxRefSteps, minRefSteps, maxRefDepth; Stack Fct; // Fct = 1/2xAx-xb Stack Energy; // Energy = 1/2xAx Stack Error; // error in energy norm Vector u; // solution of A*u=b Material* material; DirichletBCs* dirichletBCs, *dirichletBCsDLY; Preconditioner* precond; LinSystem* Ab; Element* element; Interface* interface; ErrorEstimator* errorEstimator; Statistic* statistic; Bool biSection; int infoSolution; Bool plotSolution, postScript, compareSolution, writeSolution, writeStatistics; Bool timeAssembler, accTimeAssembler; Problem() : symmetry(sym), spaceDim(0), nComp(0) { } // dummy for MI virtual MESH* Mesh() const = 0; // return mesh virtual NonLinearity* getNonLinearity() { return 0; } virtual TransientProblem* castToTransientProblem() { return 0; } virtual DirichletBCs* newDirichletBCs() = 0; virtual void newMaterial() = 0; virtual void newPreconditioner(); virtual void newLinSystem(); virtual void newMesh() = 0; virtual void newInterface() = 0; virtual void newErrorEstimator() = 0; virtual Bool staticSolution(Real globalPrecision, Bool absPrecision=False, Real time=0.0); virtual void assembleGlobal(Real time); virtual void assemble(const Element& elem, const PATCH& t, const Jacobian& Jac, Matrix& A, Vector& b, const Matrix* APattern, Bool errorEstimatorCall=False) = 0; void SolutionInfo(int step); virtual void compEnergy(Vector& u, Real* energy, Num* fct); virtual Real EnergyNorm (const Vector& x); virtual Real EllipticNorm(const Vector& x) const; virtual Real L2Norm (const Vector& x) const; virtual Real L2MassNorm (const Vector& x) const; virtual Real energyProd(Matrix& AElem, const Vector& x, const Vector& globalNodes) const; virtual void resolveMesh(Real lambda0); // - superfluous ? void contractVector(Vector& newVec, Vector& oldPos, Vector& oldVec); void expandVector (Vector& oldVec, Vector& oldPos, Vector& newVec, Num fill=0.0); // - enum globConvTestType { estimRelError, estimAbsError, extrapolError }; globConvTestType globConvTest; Bool globalConvergenceTest(Real globalPrecision, int step); Bool estimRelErrorConvTest (Real globalPrecision, int step); Bool estimAbsErrorConvTest (Real globalPrecision, int step); Bool extrapolatedErrorConvTest(Real globalPrecision, int step); void notImplemented(const char* s) const; void missingObject(const char* function, const char* object) const; void missingMaterialTerm(const char* name, int classVal) const; friend class ErrorEstimator; friend class DLY; friend class EFDLY; friend class RK1; friend class RK2; friend class RKA; friend class RKB; friend class RKC; }; #endif