Commit cd4895db authored by Thomas Witkowski's avatar Thomas Witkowski

New structure for PETSc solver objects.

parent aee5a801
......@@ -36,7 +36,8 @@ else
endif
PARMETIS_LIB = -L$(PARMETIS_DIR) -lparmetis -lmetis
ZOLTAN_LIB = -L$(AMDIS_DIR)/lib/zoltan_build/lib -lzoltan
#ZOLTAN_LIB = -L$(AMDIS_DIR)/lib/zoltan_build/lib -lzoltan
ZOLTAN_LIB =
LIBS += $(AMDIS_LIB) $(PNG_LIB)
LIBS += -lboost_iostreams -lboost_filesystem -lboost_system -lboost_date_time
......
......@@ -399,7 +399,7 @@ namespace AMDiS {
void serialize(std::ostream &out);
/// Reads a matrix from an input stream.
void deserialize(::std::istream &in);
void deserialize(std::istream &in);
///
int memsize();
......
......@@ -52,7 +52,7 @@ namespace AMDiS {
public:
/// The constructor reads needed parameters and sets solvers \ref name.
ITL_OEMSolver(::std::string name) : OEMSolver(name) {}
ITL_OEMSolver(std::string name) : OEMSolver(name) {}
~ITL_OEMSolver() {}
......@@ -102,7 +102,7 @@ namespace AMDiS {
typedef DOFMatrix::value_type value_type;
public:
/// The constructor reads needed parameters and sets solvers \ref name.
ITL_OEMSolver_para(::std::string name)
ITL_OEMSolver_para(std::string name)
: OEMSolver(name), ell(OEMSolver::max_iter)
{
GET_PARAMETER(0, name + "->ell", "%d", &ell);
......
......@@ -20,8 +20,8 @@ if USE_PARALLEL_DOMAIN_AMDIS
parallel/ParallelDebug.cc \
parallel/ParallelProblemStatBase.cc \
parallel/ParMetisPartitioner.cc \
parallel/PetscProblemStat.cc \
parallel/PetscSolver.cc \
parallel/PetscSolverSchur.cc \
parallel/StdMpi.cc
libamdis_la_CXXFLAGS += -DHAVE_PARALLEL_DOMAIN_AMDIS=1
AMDIS_INCLUDES += -I$(PARMETIS_DIR)
......@@ -252,8 +252,8 @@ parallel/MpiHelper.h \
parallel/ParallelDebug.h \
parallel/ParallelProblemStatBase.h \
parallel/ParMetisPartitioner.h \
parallel/PetscProblemStat.h \
parallel/PetscSolver.h \
parallel/PetscSolverSchur.h \
parallel/StdMpi.h \
parallel/ZoltanPartitioner.h \
reinit/BoundaryElementDist.h \
......
......@@ -46,8 +46,8 @@ host_triplet = @host@
@USE_PARALLEL_DOMAIN_AMDIS_TRUE@ parallel/ParallelDebug.cc \
@USE_PARALLEL_DOMAIN_AMDIS_TRUE@ parallel/ParallelProblemStatBase.cc \
@USE_PARALLEL_DOMAIN_AMDIS_TRUE@ parallel/ParMetisPartitioner.cc \
@USE_PARALLEL_DOMAIN_AMDIS_TRUE@ parallel/PetscProblemStat.cc \
@USE_PARALLEL_DOMAIN_AMDIS_TRUE@ parallel/PetscSolver.cc \
@USE_PARALLEL_DOMAIN_AMDIS_TRUE@ parallel/PetscSolverSchur.cc \
@USE_PARALLEL_DOMAIN_AMDIS_TRUE@ parallel/StdMpi.cc
@USE_PARALLEL_DOMAIN_AMDIS_TRUE@am__append_2 = -DHAVE_PARALLEL_DOMAIN_AMDIS=1
......@@ -91,8 +91,8 @@ am__libamdis_la_SOURCES_DIST = parallel/ElementObjectData.cc \
parallel/MeshDistributor.cc parallel/MeshManipulation.cc \
parallel/MeshPartitioner.cc parallel/MpiHelper.cc \
parallel/ParallelDebug.cc parallel/ParallelProblemStatBase.cc \
parallel/ParMetisPartitioner.cc parallel/PetscSolver.cc \
parallel/PetscSolverSchur.cc parallel/StdMpi.cc \
parallel/ParMetisPartitioner.cc parallel/PetscProblemStat.cc \
parallel/PetscSolver.cc parallel/StdMpi.cc \
parallel/ZoltanPartitioner.cc AdaptBase.cc AdaptInfo.cc \
AdaptInstationary.cc AdaptStationary.cc Assembler.cc \
BasisFunction.cc Boundary.cc BoundaryManager.cc Cholesky.cc \
......@@ -137,8 +137,8 @@ am__libamdis_la_SOURCES_DIST = parallel/ElementObjectData.cc \
@USE_PARALLEL_DOMAIN_AMDIS_TRUE@ libamdis_la-ParallelDebug.lo \
@USE_PARALLEL_DOMAIN_AMDIS_TRUE@ libamdis_la-ParallelProblemStatBase.lo \
@USE_PARALLEL_DOMAIN_AMDIS_TRUE@ libamdis_la-ParMetisPartitioner.lo \
@USE_PARALLEL_DOMAIN_AMDIS_TRUE@ libamdis_la-PetscProblemStat.lo \
@USE_PARALLEL_DOMAIN_AMDIS_TRUE@ libamdis_la-PetscSolver.lo \
@USE_PARALLEL_DOMAIN_AMDIS_TRUE@ libamdis_la-PetscSolverSchur.lo \
@USE_PARALLEL_DOMAIN_AMDIS_TRUE@ libamdis_la-StdMpi.lo
@USE_ZOLTAN_TRUE@am__objects_2 = libamdis_la-ZoltanPartitioner.lo
am__objects_3 = $(am__objects_1) $(am__objects_2)
......@@ -574,8 +574,8 @@ parallel/MpiHelper.h \
parallel/ParallelDebug.h \
parallel/ParallelProblemStatBase.h \
parallel/ParMetisPartitioner.h \
parallel/PetscProblemStat.h \
parallel/PetscSolver.h \
parallel/PetscSolverSchur.h \
parallel/StdMpi.h \
parallel/ZoltanPartitioner.h \
reinit/BoundaryElementDist.h \
......@@ -879,8 +879,8 @@ distclean-compile:
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libamdis_la-Parameters.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libamdis_la-Parametric.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libamdis_la-PeriodicBC.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libamdis_la-PetscProblemStat.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libamdis_la-PetscSolver.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libamdis_la-PetscSolverSchur.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libamdis_la-PngWriter.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libamdis_la-PovrayWriter.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libamdis_la-ProblemImplicit.Plo@am__quote@
......@@ -1029,6 +1029,13 @@ libamdis_la-ParMetisPartitioner.lo: parallel/ParMetisPartitioner.cc
@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCXX_FALSE@ $(LIBTOOL) --tag=CXX --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libamdis_la_CXXFLAGS) $(CXXFLAGS) -c -o libamdis_la-ParMetisPartitioner.lo `test -f 'parallel/ParMetisPartitioner.cc' || echo '$(srcdir)/'`parallel/ParMetisPartitioner.cc
libamdis_la-PetscProblemStat.lo: parallel/PetscProblemStat.cc
@am__fastdepCXX_TRUE@ if $(LIBTOOL) --tag=CXX --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libamdis_la_CXXFLAGS) $(CXXFLAGS) -MT libamdis_la-PetscProblemStat.lo -MD -MP -MF "$(DEPDIR)/libamdis_la-PetscProblemStat.Tpo" -c -o libamdis_la-PetscProblemStat.lo `test -f 'parallel/PetscProblemStat.cc' || echo '$(srcdir)/'`parallel/PetscProblemStat.cc; \
@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/libamdis_la-PetscProblemStat.Tpo" "$(DEPDIR)/libamdis_la-PetscProblemStat.Plo"; else rm -f "$(DEPDIR)/libamdis_la-PetscProblemStat.Tpo"; exit 1; fi
@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='parallel/PetscProblemStat.cc' object='libamdis_la-PetscProblemStat.lo' libtool=yes @AMDEPBACKSLASH@
@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCXX_FALSE@ $(LIBTOOL) --tag=CXX --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libamdis_la_CXXFLAGS) $(CXXFLAGS) -c -o libamdis_la-PetscProblemStat.lo `test -f 'parallel/PetscProblemStat.cc' || echo '$(srcdir)/'`parallel/PetscProblemStat.cc
libamdis_la-PetscSolver.lo: parallel/PetscSolver.cc
@am__fastdepCXX_TRUE@ if $(LIBTOOL) --tag=CXX --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libamdis_la_CXXFLAGS) $(CXXFLAGS) -MT libamdis_la-PetscSolver.lo -MD -MP -MF "$(DEPDIR)/libamdis_la-PetscSolver.Tpo" -c -o libamdis_la-PetscSolver.lo `test -f 'parallel/PetscSolver.cc' || echo '$(srcdir)/'`parallel/PetscSolver.cc; \
@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/libamdis_la-PetscSolver.Tpo" "$(DEPDIR)/libamdis_la-PetscSolver.Plo"; else rm -f "$(DEPDIR)/libamdis_la-PetscSolver.Tpo"; exit 1; fi
......@@ -1036,13 +1043,6 @@ libamdis_la-PetscSolver.lo: parallel/PetscSolver.cc
@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCXX_FALSE@ $(LIBTOOL) --tag=CXX --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libamdis_la_CXXFLAGS) $(CXXFLAGS) -c -o libamdis_la-PetscSolver.lo `test -f 'parallel/PetscSolver.cc' || echo '$(srcdir)/'`parallel/PetscSolver.cc
libamdis_la-PetscSolverSchur.lo: parallel/PetscSolverSchur.cc
@am__fastdepCXX_TRUE@ if $(LIBTOOL) --tag=CXX --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libamdis_la_CXXFLAGS) $(CXXFLAGS) -MT libamdis_la-PetscSolverSchur.lo -MD -MP -MF "$(DEPDIR)/libamdis_la-PetscSolverSchur.Tpo" -c -o libamdis_la-PetscSolverSchur.lo `test -f 'parallel/PetscSolverSchur.cc' || echo '$(srcdir)/'`parallel/PetscSolverSchur.cc; \
@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/libamdis_la-PetscSolverSchur.Tpo" "$(DEPDIR)/libamdis_la-PetscSolverSchur.Plo"; else rm -f "$(DEPDIR)/libamdis_la-PetscSolverSchur.Tpo"; exit 1; fi
@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='parallel/PetscSolverSchur.cc' object='libamdis_la-PetscSolverSchur.lo' libtool=yes @AMDEPBACKSLASH@
@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCXX_FALSE@ $(LIBTOOL) --tag=CXX --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libamdis_la_CXXFLAGS) $(CXXFLAGS) -c -o libamdis_la-PetscSolverSchur.lo `test -f 'parallel/PetscSolverSchur.cc' || echo '$(srcdir)/'`parallel/PetscSolverSchur.cc
libamdis_la-StdMpi.lo: parallel/StdMpi.cc
@am__fastdepCXX_TRUE@ if $(LIBTOOL) --tag=CXX --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libamdis_la_CXXFLAGS) $(CXXFLAGS) -MT libamdis_la-StdMpi.lo -MD -MP -MF "$(DEPDIR)/libamdis_la-StdMpi.Tpo" -c -o libamdis_la-StdMpi.lo `test -f 'parallel/StdMpi.cc' || echo '$(srcdir)/'`parallel/StdMpi.cc; \
@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/libamdis_la-StdMpi.Tpo" "$(DEPDIR)/libamdis_la-StdMpi.Plo"; else rm -f "$(DEPDIR)/libamdis_la-StdMpi.Tpo"; exit 1; fi
......
......@@ -39,6 +39,8 @@
namespace AMDiS {
using namespace std;
struct OperatorPos
{
int row, col;
......@@ -51,14 +53,14 @@ namespace AMDiS {
{
protected:
// Defines a mapping type from dof indices to world coordinates.
typedef std::map<DegreeOfFreedom, WorldVector<double> > DofToCoord;
typedef map<DegreeOfFreedom, WorldVector<double> > DofToCoord;
// Defines a mapping type from dof indices to world coordinates.
typedef std::map<WorldVector<double>, DegreeOfFreedom> CoordToDof;
typedef map<WorldVector<double>, DegreeOfFreedom> CoordToDof;
public:
/// Constructor
ProblemVec(std::string nameStr,
ProblemVec(string nameStr,
ProblemIterationInterface *problemIteration = NULL)
: StandardProblemIteration(this),
name(nameStr),
......@@ -227,7 +229,7 @@ namespace AMDiS {
void writeFiles(AdaptInfo &adaptInfo, bool force);
/// Interpolates fct to \ref solution.
void interpolInitialSolution(std::vector<AbstractFunction<double, WorldVector<double> >*> *fct);
void interpolInitialSolution(vector<AbstractFunction<double, WorldVector<double> >*> *fct);
/// Adds an operator to \ref A.
void addMatrixOperator(Operator *op, int i, int j,
......@@ -346,7 +348,7 @@ namespace AMDiS {
}
/// Returns \ref meshes
inline std::vector<Mesh*> getMeshes()
inline vector<Mesh*> getMeshes()
{
return meshes;
}
......@@ -361,19 +363,19 @@ namespace AMDiS {
}
/// Returns \ref feSpaces.
inline std::vector<FiniteElemSpace*> getFeSpaces()
inline vector<FiniteElemSpace*> getFeSpaces()
{
return feSpaces;
}
/// Returns \ref componentSpaces;
inline std::vector<FiniteElemSpace*> getComponentFeSpaces()
inline vector<FiniteElemSpace*> getComponentFeSpaces()
{
return componentSpaces;
}
/// Returns \ref estimator.
inline std::vector<Estimator*> getEstimators()
inline vector<Estimator*> getEstimators()
{
return estimator;
}
......@@ -409,13 +411,13 @@ namespace AMDiS {
}
/// Returns \ref marker.
inline std::vector<Marker*> getMarkers()
inline vector<Marker*> getMarkers()
{
return marker;
}
/// Returns the name of the problem
inline virtual std::string getName()
inline virtual string getName()
{
return name;
}
......@@ -445,7 +447,7 @@ namespace AMDiS {
*/
/// Sets \ref estimator.
inline void setEstimator(std::vector<Estimator*> est)
inline void setEstimator(vector<Estimator*> est)
{
estimator = est;
}
......@@ -511,17 +513,17 @@ namespace AMDiS {
* Outputs the mesh of the given component, but the values are taken from the
* residual error estimator.
*/
void writeResidualMesh(int comp, AdaptInfo *adaptInfo, std::string name);
void writeResidualMesh(int comp, AdaptInfo *adaptInfo, string name);
/// Function that implements the serialization procedure.
virtual void serialize(std::ostream &out);
virtual void serialize(ostream &out);
/// Function that implements the deserialization procedure.
virtual void deserialize(std::istream &in);
virtual void deserialize(istream &in);
/// Returns \ref fileWriters.
std::vector<FileWriterInterface*>& getFileWriterList()
vector<FileWriterInterface*>& getFileWriterList()
{
return fileWriters;
}
......@@ -536,7 +538,7 @@ namespace AMDiS {
protected:
/// Name of this problem.
std::string name;
string name;
/// Number of problem components
int nComponents;
......@@ -549,16 +551,16 @@ namespace AMDiS {
int nMeshes;
/// FE spaces of this problem.
std::vector<FiniteElemSpace*> feSpaces;
vector<FiniteElemSpace*> feSpaces;
/// Meshes of this problem.
std::vector<Mesh*> meshes;
vector<Mesh*> meshes;
/// Pointer to the fe spaces for the different problem components
std::vector<FiniteElemSpace*> componentSpaces;
vector<FiniteElemSpace*> componentSpaces;
/// Pointer to the meshes for the different problem components
std::vector<Mesh*> componentMeshes;
vector<Mesh*> componentMeshes;
/** \brief
* Stores information about which meshes must be traversed to assemble the
......@@ -568,10 +570,10 @@ namespace AMDiS {
ComponentTraverseInfo traverseInfo;
/// Responsible for element marking.
std::vector<Marker*> marker;
vector<Marker*> marker;
/// Estimator of this problem. Used in \ref estimate().
std::vector<Estimator*> estimator;
vector<Estimator*> estimator;
/// Linear solver of this problem. Used in \ref solve().
OEMSolver *solver;
......@@ -595,7 +597,7 @@ namespace AMDiS {
* be assembled only once. All other matrices will be assembled at every
* time step.
*/
std::vector< std::vector< bool > > assembleMatrixOnlyOnce;
vector<vector<bool> > assembleMatrixOnlyOnce;
/** \brief
* If [i][j] of this field is set to true, the corresponding DOFMatrix of
......@@ -603,13 +605,13 @@ namespace AMDiS {
* to determine, if assembling of a matrix can be ommitted, if it is set
* to be assembled only once.
*/
std::vector< std::vector< bool > > assembledMatrix;
vector<vector<bool> > assembledMatrix;
/// Determines whether domain boundaries should be considered at assembling.
bool useGetBound;
/// Writes the meshes and solution after the adaption loop.
std::vector<FileWriterInterface*> fileWriters;
vector<FileWriterInterface*> fileWriters;
/** \brief
* All actions of mesh refinement are performed by refinementManager.
......@@ -636,7 +638,7 @@ namespace AMDiS {
* the problem. This may be used to compute the real error of the computed
* solution.
*/
std::vector<AbstractFunction<double, WorldVector<double> >*> exactSolutionFcts;
vector<AbstractFunction<double, WorldVector<double> >*> exactSolutionFcts;
/** \brief
* If true, the error is not estimated but computed from the exact solution
......@@ -654,9 +656,9 @@ namespace AMDiS {
/// If true, AMDiS prints information about the assembling procedure to the screen.
bool writeAsmInfo;
std::map<Operator*, std::vector<OperatorPos> > operators;
map<Operator*, vector<OperatorPos> > operators;
std::map<Operator*, Flag> opFlags;
map<Operator*, Flag> opFlags;
};
}
......
......@@ -60,9 +60,9 @@ namespace AMDiS {
}
MeshDistributor::MeshDistributor(string str)
MeshDistributor::MeshDistributor()
: probStat(0),
name(str),
name("parallel"),
feSpace(NULL),
mesh(NULL),
refineManager(NULL),
......
......@@ -72,13 +72,13 @@ namespace AMDiS {
typedef map<const DegreeOfFreedom*, DegreeOfFreedom> DofIndexMap;
/// Mapps a boundar type, i.e., a boundary identifier index, to a periodic
/// dof mapping.
/// DOF mapping.
typedef map<BoundaryType, DofMapping> PeriodicDofMap;
typedef vector<MeshStructure> MeshCodeVec;
public:
MeshDistributor(string str);
MeshDistributor();
virtual ~MeshDistributor() {}
......@@ -106,7 +106,7 @@ namespace AMDiS {
* This function checks if the mesh has changed on at least on rank. In this case,
* the interior boundaries are adapted on all ranks such that they fit together on
* all ranks. Furthermore the function \ref updateLocalGlobalNumbering() is called
* to update the dof numberings and mappings on all rank due to the new mesh
* to update the DOF numberings and mappings on all rank due to the new mesh
* structure.
*
* \param[in] tryRepartition If this parameter is true, repartitioning may be
......@@ -160,7 +160,7 @@ namespace AMDiS {
return mapLocalGlobalDofs;
}
/// Maps a local dof to its global index.
/// Maps a local DOF to its global index.
inline DegreeOfFreedom mapLocalToGlobal(DegreeOfFreedom dof)
{
return mapLocalGlobalDofs[dof];
......@@ -168,7 +168,7 @@ namespace AMDiS {
DegreeOfFreedom mapGlobalToLocal(DegreeOfFreedom dof);
/// Maps a local dof to its local index.
/// Maps a local DOF to its local index.
inline DegreeOfFreedom mapLocalToDofIndex(DegreeOfFreedom dof)
{
return mapLocalDofIndex[dof];
......
This diff is collapsed.
// ============================================================================
// == ==
// == 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 PetscProblemStat.h */
#ifndef AMDIS_PETSC_PROBLEM_STAT_H
#define AMDIS_PETSC_PROBLEM_STAT_H
#include "AMDiS_fwd.h"
#include "Global.h"
#include "MeshDistributor.h"
#include "ProblemVec.h"
#include "ProblemInstat.h"
#include "ParallelProblemStatBase.h"
#include "petsc.h"
#include "petscsys.h"
#include "petscao.h"
namespace AMDiS {
class PetscProblemStat : public ParallelProblemStatBase
{
public:
PetscProblemStat(std::string nameStr,
ProblemIterationInterface *problemIteration = NULL)
: ParallelProblemStatBase(nameStr, problemIteration),
d_nnz(NULL),
o_nnz(NULL),
lastMeshNnz(0)
{}
~PetscProblemStat()
{}
void solve(AdaptInfo *adaptInfo, bool fixedMatrix = false);
protected:
/// Creates a new non zero pattern structure for the Petsc matrix.
void createPetscNnzStructure(Matrix<DOFMatrix*> *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<DOFMatrix*> *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<double>* vec,
int disMult = 1, int dispAdd = 0);
/// Use PETSc to solve the linear system of equations
void solvePetscMatrix(SystemVector &vec, AdaptInfo *adaptInfo);
protected:
/// 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;
};
typedef PetscProblemStat ParallelProblemStat;
} // namespace AMDiS
#endif
This diff is collapsed.
......@@ -20,92 +20,66 @@
/** \file PetscSolver.h */
#ifndef AMDIS_PETSCSOLVER_H
#define AMDIS_PETSCSOLVER_H
#ifndef AMDIS_PETSC_SOLVER_H
#define AMDIS_PETSC_SOLVER_H
#include "AMDiS_fwd.h"
#include "Global.h"
#include "MeshDistributor.h"
#include "ProblemVec.h"
#include "ProblemInstat.h"
#include "ParallelProblemStatBase.h"
#include "petsc.h"
#include "petscsys.h"
#include "petscao.h"
#include "parallel/PetscProblemStat.h"
#include "CreatorInterface.h"
namespace AMDiS {
class PetscSolver : public ParallelProblemStatBase
{
public:
PetscSolver(std::string nameStr,
ProblemIterationInterface *problemIteration = NULL)
: ParallelProblemStatBase(nameStr, problemIteration),
d_nnz(NULL),
o_nnz(NULL),
lastMeshNnz(0)
{}
~PetscSolver()
using namespace std;
class PetscSolver
{
protected:
PetscSolver(Mat& petscMatrix, MeshDistributor *dist, int n)
: matrix(petscMatrix),
meshDistributor(dist),
nComponents(n)
{}
void solve(AdaptInfo *adaptInfo, bool fixedMatrix = false);
public:
virtual ~PetscSolver() {}
protected:
/// Creates a new non zero pattern structure for the Petsc matrix.
void createPetscNnzStructure(Matrix<DOFMatrix*> *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<DOFMatrix*> *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<double>* vec,
int disMult = 1, int dispAdd = 0);
/// Use PETSc to solve the linear system of equations
void solvePetscMatrix(SystemVector &vec, AdaptInfo *adaptInfo);
private:
/// Is used to create a PETSc solver and preconditioner object. This function may
/// be overridden to create some special PETSc solver.
virtual void providePetscSolver(KSP &solver, PC &pc);
virtual void providePetscSolver(KSP &solver, PC &pc) = 0;
static PetscSolver* getPetscSolver(Mat& petscMatrix,
MeshDistributor *dist,
int n);
protected:
/// 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;
Mat& matrix;
MeshDistributor *meshDistributor;
int nComponents;
};
typedef PetscSolver ParallelProblemStat;
} //namespace AMDiS
class PetscSolverGlobalMatrix : public PetscSolver
{
public:
PetscSolverGlobalMatrix(Mat& petscMatrix, MeshDistributor *dist, int n)
: PetscSolver(petscMatrix, dist, n)
{}
void providePetscSolver(KSP &solver, PC &pc);
};
class PetscSolverSchur : public PetscSolver
{
public:
PetscSolverSchur(Mat& petscMatrix, MeshDistributor *dist, int n)
: PetscSolver(petscMatrix, dist, n)
{}
void providePetscSolver(KSP &solver, PC &pc);
};
} // namespace AMDiS
#endif
//
// 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.