PetscSolverGlobalMatrix.h 2.44 KB
Newer Older
Thomas Witkowski's avatar
Thomas Witkowski committed
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43
// ============================================================================
// ==                                                                        ==
// == AMDiS - Adaptive multidimensional simulations                          ==
// ==                                                                        ==
// ==  http://www.amdis-fem.org                                              ==
// ==                                                                        ==
// ============================================================================
//
// Software License for AMDiS
//
// Copyright (c) 2010 Dresden University of Technology 
// All rights reserved.
// Authors: Simon Vey, Thomas Witkowski et al.
//
// This file is part of AMDiS
//
// See also license.opensource.txt in the distribution.



/** \file PetscSolverGlobalMatrix.h */

#ifndef AMDIS_PETSC_SOLVER_GLOBAL_MATRIX_H
#define AMDIS_PETSC_SOLVER_GLOBAL_MATRIX_H

#include "AMDiS_fwd.h"
#include "parallel/PetscSolver.h"

namespace AMDiS {

  using namespace std;


  class PetscSolverGlobalMatrix : public PetscSolver
  {
  public:
    PetscSolverGlobalMatrix()
      : PetscSolver(),
	d_nnz(NULL),
	o_nnz(NULL),
	lastMeshNnz(0),
	zeroStartVector(false)
    {
44
      Parameters::get("parallel->use zero start vector", zeroStartVector);
Thomas Witkowski's avatar
Thomas Witkowski committed
45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82
    }

    void fillPetscMatrix(Matrix<DOFMatrix*> *mat, SystemVector *vec);

    void solvePetscMatrix(SystemVector &vec, AdaptInfo *adaptInfo);    

  protected:
    /// Creates a new non zero pattern structure for the PETSc matrix. 
    void createPetscNnzStructure(Matrix<DOFMatrix*> *mat);
    
    /// 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<double>* vec, 
		      int disMult = 1, int dispAdd = 0, bool rankOnly = false);

  protected:
    /// 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;

    bool zeroStartVector;
  };


}

#endif