// ============================================================================ // == == // == AMDiS - Adaptive multidimensional simulations == // == == // ============================================================================ // == == // == TU Dresden == // == == // == Institut für Wissenschaftliches Rechnen == // == Zellescher Weg 12-14 == // == 01069 Dresden == // == germany == // == == // ============================================================================ // == == // == https://gforge.zih.tu-dresden.de/projects/amdis/ == // == == // ============================================================================ /** \file GlobalMatrixSolver.h */ #ifndef AMDIS_GLOBALMATRIXSOLVER_H #define AMDIS_GLOBALMATRIXSOLVER_H #include "AMDiS_fwd.h" #include "Global.h" #include "ParallelDomainBase.h" #include "ProblemVec.h" #include "ProblemInstat.h" #include "petsc.h" #include "petscsys.h" #include "petscao.h" namespace AMDiS { class GlobalMatrixSolver : public ProblemVec { public: GlobalMatrixSolver(std::string nameStr, ProblemIterationInterface *problemIteration = NULL) : ProblemVec(nameStr, problemIteration), meshDistributor(NULL), d_nnz(NULL), o_nnz(NULL), lastMeshNnz(0) {} ~GlobalMatrixSolver() {} void addToMeshDistributor(MeshDistributor&); void buildAfterCoarsen(AdaptInfo *adaptInfo, Flag flag, bool assembleMatrix = true, bool assembleVector = true); void solve(AdaptInfo *adaptInfo, bool fixedMatrix = false); protected: /// Creates a new non zero pattern structure for the Petsc matrix. void createPetscNnzStructure(Matrix *mat); /** \brief * Create a PETSc matrix and PETSc vectors. The given DOF matrices are used to * create the nnz structure of the PETSc matrix and the values are transfered to it. * The given DOF vectors are used to the the values of the PETSc rhs vector. * * \param[in] mat * \param[in] vec */ void fillPetscMatrix(Matrix *mat, SystemVector *vec); /// Takes a dof matrix and sends the values to the global petsc matrix. void setDofMatrix(DOFMatrix* mat, int dispMult = 1, int dispAddRow = 0, int dispAddCol = 0); /// Takes a dof vector and sends its values to a given petsc vector. void setDofVector(Vec& petscVec, DOFVector* vec, int disMult = 1, int dispAdd = 0); void solvePetscMatrix(SystemVector &vec); protected: MeshDistributor *meshDistributor; /// Petsc's matrix structure. Mat petscMatrix; /** \brief * Petsc's vector structures for the rhs vector, the solution vector and a * temporary vector for calculating the final residuum. */ Vec petscRhsVec, petscSolVec, petscTmpVec; /// Arrays definig the non zero pattern of Petsc's matrix. int *d_nnz, *o_nnz; /** \brief * Stores the mesh change index of the mesh the nnz structure was created for. * Therefore, if the mesh change index is higher than this value, we have to create * a new nnz structure for PETSc matrices, because the mesh has been changed and * therefore also the assembled matrix structure. */ int lastMeshNnz; }; } //namespace AMDiS #endif