// ============================================================================ // == == // == AMDiS - Adaptive multidimensional simulations == // == == // ============================================================================ // == == // == crystal growth group == // == == // == Stiftung caesar == // == Ludwig-Erhard-Allee 2 == // == 53175 Bonn == // == germany == // == == // ============================================================================ // == == // == http://www.caesar.de/cg/AMDiS == // == == // ============================================================================ /** \file ParallelDomainProblem.h */ #ifndef AMDIS_PARALLELDOMAINPROBLEM_H #define AMDIS_PARALLELDOMAINPROBLEM_H #include #include #include "ProblemTimeInterface.h" #include "ProblemIterationInterface.h" #include "FiniteElemSpace.h" #include "AdaptInfo.h" #include "InteriorBoundary.h" #include "petscao.h" #include "mpi.h" namespace AMDiS { class ProblemScal; class ProblemInstatScal; class ParMetisPartitioner; class Mesh; class ParallelDomainProblemBase : public ProblemIterationInterface, public ProblemTimeInterface { public: ParallelDomainProblemBase(const std::string& name, ProblemIterationInterface *iterationIF, ProblemTimeInterface *timeIF, FiniteElemSpace *feSpace); virtual ~ParallelDomainProblemBase() {} void initParallelization(AdaptInfo *adaptInfo); void exitParallelization(AdaptInfo *adaptInfo); /// Set for each element on the partitioning level the number of leaf elements. double setElemWeights(AdaptInfo *adaptInfo); void partitionMesh(AdaptInfo *adaptInfo); virtual void setTime(AdaptInfo *adaptInfo) {} virtual void initTimestep(AdaptInfo *adaptInfo) {} virtual void closeTimestep(AdaptInfo *adaptInfo) {} virtual void solveInitialProblem(AdaptInfo *adaptInfo) {} virtual void transferInitialSolution(AdaptInfo *adaptInfo) {} virtual void beginIteration(AdaptInfo *adaptInfo) { iterationIF->beginIteration(adaptInfo); } virtual Flag oneIteration(AdaptInfo *adaptInfo, Flag toDo = FULL_ITERATION); virtual void endIteration(AdaptInfo *adaptInfo) { iterationIF->endIteration(adaptInfo); } virtual int getNumProblems() {} inline virtual const std::string& getName() { return name; } /// Returns pointer to \ref applicationOrdering. AO* getApplicationOrdering() { return &applicationOrdering; } /// Returns \ref nRankDOFs, the number of DOFs in the rank mesh. int getNumberRankDOFs() { return nRankDOFs; } virtual ProblemStatBase *getProblem(int number = 0) {} virtual void serialize(std::ostream&) {} virtual void deserialize(std::istream&) {} protected: /// ProblemIterationInterface *iterationIF; /// ProblemTimeInterface *timeIF; /// The rank of the current process. int mpiRank; /// Overall number of processes. int mpiSize; /** \brief * MPI communicator collected all processes, which should * be used for calculation. The Debug procces is not included * in this communicator. */ MPI::Intracomm mpiComm; /// Name of the problem (as used in the init files) std::string name; /// Finite element space of the problem. FiniteElemSpace *feSpace; /// Mesh of the problem. Mesh *mesh; /// Pointer to the paritioner which is used to devide a mesh into partitions. ParMetisPartitioner *partitioner; /// Weights for the elements, i.e., the number of leaf elements within this element. std::map elemWeights; /// Is true, if the mesh was not partitioned before, otherwise it's false. bool initialPartitionMesh; /** \brief * Stores to every coarse element index the number of the partition it * corresponds to. */ std::map partitionVec; /** \brief * Stores an old partitioning of elements. To every element index the number * of the parition it corresponds to is stored. */ std::map oldPartitionVec; /// Petsc application ordering AO applicationOrdering; /// Number of DOFs in the rank mesh. int nRankDOFs; /** \brief * Defines the interioir boundaries of the domain that result from partitioning * the whole mesh. */ InteriorBoundary interiorBoundary; std::map boundaryDofs; }; class ParallelDomainProblemScal : public ParallelDomainProblemBase { public: ParallelDomainProblemScal(const std::string& name, ProblemScal *problem, ProblemInstatScal *problemInstat); }; } #endif // AMDIS_PARALLELDOMAINPROBLEM_H