Liebe Gitlab-Nutzer, lieber Gitlab-Nutzer,
es ist nun möglich sich mittels des ZIH-Logins/LDAP an unserem Dienst anzumelden. Die Konten der externen Nutzer:innen sind über den Reiter "Standard" erreichbar.
Die Administratoren


Dear Gitlab user,
it is now possible to log in to our service using the ZIH login/LDAP. The accounts of external users can be accessed via the "Standard" tab.
The administrators

Commit cd4895db authored by Thomas Witkowski's avatar Thomas Witkowski
Browse files

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)
{}