PetscHelper.h 4.06 KB
Newer Older
1
2
3
4
5
6
7
/******************************************************************************
 *
 * AMDiS - Adaptive multidimensional simulations
 *
 * Copyright (C) 2013 Dresden University of Technology. All Rights Reserved.
 * Web: https://fusionforge.zih.tu-dresden.de/projects/amdis
 *
8
 * Authors:
9
10
11
12
13
14
15
16
17
 * Simon Vey, Thomas Witkowski, Andreas Naumann, Simon Praetorius, et al.
 *
 * This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
 * WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
 *
 *
 * This file is part of AMDiS
 *
 * See also license.opensource.txt in the distribution.
18
 *
19
 ******************************************************************************/
20
21
22
23
24
25
26
27
28
29
30
31



/** \file PetscHelper.h */

#ifndef AMDIS_PETSCHELPER_H
#define AMDIS_PETSCHELPER_H

#include <mpi.h>
#include <map>
#include <vector>
#include <petsc.h>
32
#include "AMDiS_fwd.h"
33

34
35
36
37
38
39
40
#if (PETSC_VERSION_MINOR >= 7)
  #define PETSC_MONITOR_CAST(...) \
    (PetscErrorCode (*)(KSP,PetscInt,PetscReal,void*))(__VA_ARGS__)
#else
  #define PETSC_MONITOR_CAST(...) __VA_ARGS__
#endif

41
42
43
44
namespace AMDiS
{
  namespace Parallel
  {
45

46
    /** \brief
47
    * In this namespace, we collect several auxiliary functions for using
48
    * PETSc in AMDiS. Many of these function may be replaced by new PETSc
49
50
51
52
53
54
    * function in upcoming versions.
    */
    namespace petsc_helper
    {

      /// Defines a PETSc matrix column wise
55
56
      typedef std::pair<std::vector<int>, std::vector<double> > SparseCol;
      typedef std::map<int, SparseCol> PetscMatCol;
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
83
84
85
86
87
88
89
90
91
92
93
94
95

      /** \brief
      * Returns for a distributed matrix on each rank the local matrix in a
      * sparce column format.
      *
      * \param[in]   mat     PETSc distributerd matrix.
      * \param[out]  matCol  The sparse column represenation of the local matrix.
      */
      void getMatLocalColumn(Mat mat, PetscMatCol &matCol);

      /** \brief
      * Set a local column vector in a distributed matrix.
      *
      * \param[out]  mat     Distributed matrix.
      * \param[in]   column  Column index.
      * \param[in]   vec     Column vector.
      */
      void setMatLocalColumn(Mat mat, int column, Vec vec);

      /** \brief
      * Create a local PETSc vector representing the column of a matrix
      * stored in \ref PetscMatCol type format.
      *
      * \param[in]   column   Sparse column representation.
      * \param[out]  vec      Vector representing one column of the matrix.
      */
      void getColumnVec(const SparseCol &matCol, Vec vec);

      /** \brief
      * Computes the matrix matrix product inv(A) B = C. Matrices B and C
      * are distributed matrices. Matrix A is a local matrix on each MPI
      * task. The overall number of rows of local matrices A must be the
      * number of distriubted rows in B.
      *
      * \param[in]   mpiComm  MPI Communicator object (must fit with ksp)
      * \param[in]   ksp      inv(A) matrix given by a PETSc solver object.
      * \param[in]   mat0     matrix B
      * \param[out]  mat1     resulting matrix C, is created inside the function
      */
96
97
98
      void blockMatMatSolve(MPI::Intracomm mpiComm,
			    KSP ksp,
			    Mat mat0,
99
100
101
102
103
104
105
106
107
108
			    Mat &mat1);

      /** \brief
      * Converts a 2x2 nested matrix to a MATAIJ matrix (thus not nested).
      *
      * \param[in]  matNest  nested input matrix
      * \param[out] mat      matrix of type MATAIJ, created inside this function.
      */
      void matNestConvert(Mat matNest, Mat &mat);

109
      void setSolverWithLu(KSP ksp,
110
			  const char* kspPrefix,
111
112
			  KSPType kspType,
			  PCType pcType,
113
114
115
116
117
			  const MatSolverPackage matSolverPackage,
			  PetscReal rtol = PETSC_DEFAULT,
			  PetscReal atol = PETSC_DEFAULT,
			  PetscInt maxIt = PETSC_DEFAULT);

118
      void setSolver(KSP ksp,
119
		    const char* kspPrefix,
120
121
		    KSPType kspType,
		    PCType pcType,
122
123
124
		    PetscReal rtol = PETSC_DEFAULT,
		    PetscReal atol = PETSC_DEFAULT,
		    PetscInt maxIt = PETSC_DEFAULT);
125

126
      void createSolver(MPI::Intracomm comm, KSP &ksp, Mat m, std::string kspPrefix = "", int info = 0);
127

128
129
130
    } // end namespace petsc_helper
  } // end namespace Parallel
} // end namespace AMDiS
131
132

#endif