PetscSolverGlobalMatrix.h 4.12 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
// ============================================================================
// ==                                                                        ==
// == 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

26
#include <boost/tuple/tuple.hpp>
Thomas Witkowski's avatar
Thomas Witkowski committed
27
#include "AMDiS_fwd.h"
28
#include "parallel/MatrixNnzStructure.h"
Thomas Witkowski's avatar
Thomas Witkowski committed
29
30
31
32
33
34
#include "parallel/PetscSolver.h"

namespace AMDiS {

  using namespace std;

35
36
37
38
  /** 
   * PETSc solver which creates a globally distributed matrix. Supports also
   * coarse space assembling.
   */
Thomas Witkowski's avatar
Thomas Witkowski committed
39
40
41
  class PetscSolverGlobalMatrix : public PetscSolver
  {
  public:
42
    PetscSolverGlobalMatrix(string name);
Thomas Witkowski's avatar
Thomas Witkowski committed
43

44
45
    void fillPetscMatrix(Matrix<DOFMatrix*> *mat);

46
47
    void fillPetscMatrixWithCoarseSpace(Matrix<DOFMatrix*> *mat);

48
    void fillPetscRhs(SystemVector *vec);
Thomas Witkowski's avatar
Thomas Witkowski committed
49
50
51

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

52
53
    void solveGlobal(Vec &rhs, Vec &sol);

54
    void destroyMatrixData();
55

56
57
    void destroyVectorData();

58
  protected:
59
    void removeDirichletRows(Matrix<DOFMatrix*> *seqMat);
60

61
    void removeDirichletRows(SystemVector *seqVec);
62

63
64
    /// Reads field split information and creats a splitting based on 
    /// component numbers.
65
66
    void createFieldSplit(PC pc);

67
68
69
70
71
72
73
74
75
76
77
78
79
    /** \brief 
     * Creates a new field split for a preconditioner object.
     *
     * \param[in] pc          PETSc preconditioner object, must be of
     *                        type PCFIELDSPLIT
     * \param[in] splitName   Name of the field split, can be used to set other
     *                        parameters of the PCFIELDSPLIT preconditioner on
     *                        the command line.
     * \param[in] components  System component numbers of the field split. At
     *                        the moment only continuous splits are allowed.
     */
    void createFieldSplit(PC pc, string splitName, vector<int> &components);

80
81
82
83
84
85
86
87
    /// Wrapper to create field split from only one component.
    void createFieldSplit(PC pc, string splitName, int component)
    {
      vector<int> components;
      components.push_back(component);
      createFieldSplit(pc, splitName, components);
    }

88
    virtual void initSolver(KSP &ksp);
89
90
91

    virtual void exitSolver(KSP ksp);

92
93
94
95
    virtual void initPreconditioner(PC pc);

    virtual void exitPreconditioner(PC pc);

Thomas Witkowski's avatar
Thomas Witkowski committed
96
    /// Takes a DOF matrix and sends the values to the global PETSc matrix.
Thomas Witkowski's avatar
Thomas Witkowski committed
97
    void setDofMatrix(DOFMatrix* mat, int rowComp = 0, int colComp = 0);
Thomas Witkowski's avatar
Thomas Witkowski committed
98
99

    /// Takes a DOF vector and sends its values to a given PETSc vector.
Thomas Witkowski's avatar
Thomas Witkowski committed
100
101
102
    void setDofVector(Vec vecInterior,
		      Vec vecCoarse,
		      DOFVector<double>* vec, 
Thomas Witkowski's avatar
Thomas Witkowski committed
103
104
		      int rowCompxo, 
		      bool rankOnly = false);
Thomas Witkowski's avatar
Thomas Witkowski committed
105

Thomas Witkowski's avatar
Thomas Witkowski committed
106
107
    inline void setDofVector(Vec vecInterior,
			     DOFVector<double>* vec, 
Thomas Witkowski's avatar
Thomas Witkowski committed
108
109
			     int rowComp, 
			     bool rankOnly = false)
Thomas Witkowski's avatar
Thomas Witkowski committed
110
    {
Thomas Witkowski's avatar
Thomas Witkowski committed
111
      setDofVector(vecInterior, PETSC_NULL, vec, rowComp, rankOnly);
Thomas Witkowski's avatar
Thomas Witkowski committed
112
113
    }

114
115
116
117
118
119
120
121
122
    inline void setDofVector(Vec vecInterior, 
			     SystemVector &vec, 
			     bool rankOnly = false)
    {
      for (int i = 0; i < vec.getSize(); i++)
	setDofVector(vecInterior, PETSC_NULL, vec.getDOFVector(i), i, rankOnly);
    }

    PetscSolver* createSubSolver(int component, string kspPrefix);
Thomas Witkowski's avatar
Thomas Witkowski committed
123

124
125
    void setConstantNullSpace(KSP ksp, int constFeSpace, bool test = false);

Thomas Witkowski's avatar
blub  
Thomas Witkowski committed
126
127
    void setConstantNullSpace(KSP ksp);

Thomas Witkowski's avatar
Thomas Witkowski committed
128
129
  protected:
    bool zeroStartVector;
130

131
132
133
    /// If true, after parallel assembling, information about the matrix
    /// are printed.
    bool printMatInfo;
Thomas Witkowski's avatar
Thomas Witkowski committed
134
135
136
137
138
139
140
  };


}

#endif