PetscSolverGlobalMatrix.h 3.07 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
// ============================================================================
// ==                                                                        ==
// == 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),
42 43
	zeroStartVector(false),
	alwaysCreateNnzStructure(false)
Thomas Witkowski's avatar
Thomas Witkowski committed
44
    {
45
      Parameters::get("parallel->use zero start vector", zeroStartVector);
46 47
      Parameters::get("parallel->always create nnz structure", 
		      alwaysCreateNnzStructure);
Thomas Witkowski's avatar
Thomas Witkowski committed
48 49
    }

50 51 52
    void fillPetscMatrix(Matrix<DOFMatrix*> *mat);

    void fillPetscRhs(SystemVector *vec);
Thomas Witkowski's avatar
Thomas Witkowski committed
53 54 55

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

56
    void destroyMatrixData();
57

Thomas Witkowski's avatar
Thomas Witkowski committed
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
  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;
83 84 85 86 87 88 89 90

    /// If this variable is set to true, the non-zero matrix structure is
    /// created each time from scratch by calling \ref createPetscNnzStrcuture.
    /// This can be necessary if the number of non-zeros in the matrix varies
    /// though the mesh does not change. This may happen if there are many
    /// operators using DOFVectors from old timestep containing many zeros due to
    /// some phase fields.
    bool alwaysCreateNnzStructure;
Thomas Witkowski's avatar
Thomas Witkowski committed
91 92 93 94 95 96 97
  };


}

#endif