Am Montag, 13. Mai 2022, finden Wartungsarbeiten am Gitlab-Server (Update auf neue Version statt). Der Dienst wird daher am Montag für einige Zeit nicht verfügbar sein.
On Monday, May 13th 2022, the Gitlab server will be updated. The service will therefore not be accessible for some time on Monday.

Commit 52840f48 authored by Thomas Witkowski's avatar Thomas Witkowski
Browse files

Fixed merge with parallelization branch.

parent 6eed4757
......@@ -18,6 +18,7 @@ if USE_PARALLEL_AMDIS
$(PARALLEL_DIR)/ParallelProblem.h $(PARALLEL_DIR)/ParallelProblem.cc \
$(PARALLEL_DIR)/ParMetisPartitioner.h $(PARALLEL_DIR)/ParMetisPartitioner.cc \
$(PARALLEL_DIR)/PartitionElementData.h \
$(PARALLEL_DIR)/PollutionError.h $(PARALLEL_DIR)/PollutionError.cc
PARALLEL_INCLUDES = -I$(MPI_DIR)/include -I$(PARMETIS_DIR)
libamdis_la_CXXFLAGS += -DHAVE_PARALLEL_AMDIS=1
else
......
......@@ -86,14 +86,14 @@ am__libamdis_la_SOURCES_DIST = $(PARALLEL_DIR)/ParallelDomainBase.h \
$(PARALLEL_DIR)/ParallelProblem.cc \
$(PARALLEL_DIR)/ParMetisPartitioner.h \
$(PARALLEL_DIR)/ParMetisPartitioner.cc \
$(PARALLEL_DIR)/PartitionElementData.h PARALLEL_INCLUDES = \
-I$(MPI_DIR)/include -I$(PARMETIS_DIR) \
$(SOURCE_DIR)/DOFIndexed.h $(SOURCE_DIR)/DOFIndexed.cc \
$(SOURCE_DIR)/GNUPlotWriter.h $(SOURCE_DIR)/GNUPlotWriter.cc \
$(SOURCE_DIR)/VertexVector.h $(SOURCE_DIR)/VertexVector.cc \
$(SOURCE_DIR)/PeriodicBC.h $(SOURCE_DIR)/PeriodicBC.cc \
$(SOURCE_DIR)/Recovery.h $(SOURCE_DIR)/Recovery.cc \
$(SOURCE_DIR)/RecoveryEstimator.h \
$(PARALLEL_DIR)/PartitionElementData.h \
$(PARALLEL_DIR)/PollutionError.h \
$(PARALLEL_DIR)/PollutionError.cc $(SOURCE_DIR)/DOFIndexed.h \
$(SOURCE_DIR)/DOFIndexed.cc $(SOURCE_DIR)/GNUPlotWriter.h \
$(SOURCE_DIR)/GNUPlotWriter.cc $(SOURCE_DIR)/VertexVector.h \
$(SOURCE_DIR)/VertexVector.cc $(SOURCE_DIR)/PeriodicBC.h \
$(SOURCE_DIR)/PeriodicBC.cc $(SOURCE_DIR)/Recovery.h \
$(SOURCE_DIR)/Recovery.cc $(SOURCE_DIR)/RecoveryEstimator.h \
$(SOURCE_DIR)/RecoveryEstimator.cc \
$(SOURCE_DIR)/ResidualEstimator.h \
$(SOURCE_DIR)/ResidualEstimator.cc $(SOURCE_DIR)/Cholesky.h \
......@@ -237,6 +237,7 @@ am__libamdis_la_SOURCES_DIST = $(PARALLEL_DIR)/ParallelDomainBase.h \
@USE_PARALLEL_AMDIS_TRUE@ libamdis_la-ConditionalMarker.lo \
@USE_PARALLEL_AMDIS_TRUE@ libamdis_la-ParallelProblem.lo \
@USE_PARALLEL_AMDIS_TRUE@ libamdis_la-ParMetisPartitioner.lo \
@USE_PARALLEL_AMDIS_TRUE@ libamdis_la-PollutionError.lo \
@USE_PARALLEL_AMDIS_TRUE@ $(am__objects_1)
am_libamdis_la_OBJECTS = $(am__objects_2) libamdis_la-DOFIndexed.lo \
libamdis_la-GNUPlotWriter.lo libamdis_la-VertexVector.lo \
......@@ -471,10 +472,11 @@ libamdis_la_CXXFLAGS = $(am__append_1) $(am__append_3) $(am__append_5) \
@USE_PARALLEL_AMDIS_TRUE@ $(PARALLEL_DIR)/ParMetisPartitioner.h \
@USE_PARALLEL_AMDIS_TRUE@ $(PARALLEL_DIR)/ParMetisPartitioner.cc \
@USE_PARALLEL_AMDIS_TRUE@ $(PARALLEL_DIR)/PartitionElementData.h \
@USE_PARALLEL_AMDIS_TRUE@ PARALLEL_INCLUDES = \
@USE_PARALLEL_AMDIS_TRUE@ -I$(MPI_DIR)/include \
@USE_PARALLEL_AMDIS_TRUE@ -I$(PARMETIS_DIR) $(am__append_2)
@USE_PARALLEL_AMDIS_TRUE@ $(PARALLEL_DIR)/PollutionError.h \
@USE_PARALLEL_AMDIS_TRUE@ $(PARALLEL_DIR)/PollutionError.cc \
@USE_PARALLEL_AMDIS_TRUE@ $(am__append_2)
@USE_PARALLEL_AMDIS_FALSE@PARALLEL_INCLUDES =
@USE_PARALLEL_AMDIS_TRUE@PARALLEL_INCLUDES = -I$(MPI_DIR)/include -I$(PARMETIS_DIR)
TEMPLATE_INCLUDES = -I../lib/mtl4
INCLUDES = $(AMDIS_INCLUDES) $(PARALLEL_INCLUDES) $(TEMPLATE_INCLUDES)
libamdis_la_SOURCES = \
......@@ -784,6 +786,7 @@ distclean-compile:
@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-PngWriter.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libamdis_la-PollutionError.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-ProblemInstat.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libamdis_la-ProblemInterpolScal.Plo@am__quote@
......@@ -893,6 +896,13 @@ libamdis_la-ParMetisPartitioner.lo: $(PARALLEL_DIR)/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_DIR)/ParMetisPartitioner.cc' || echo '$(srcdir)/'`$(PARALLEL_DIR)/ParMetisPartitioner.cc
libamdis_la-PollutionError.lo: $(PARALLEL_DIR)/PollutionError.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-PollutionError.lo -MD -MP -MF "$(DEPDIR)/libamdis_la-PollutionError.Tpo" -c -o libamdis_la-PollutionError.lo `test -f '$(PARALLEL_DIR)/PollutionError.cc' || echo '$(srcdir)/'`$(PARALLEL_DIR)/PollutionError.cc; \
@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/libamdis_la-PollutionError.Tpo" "$(DEPDIR)/libamdis_la-PollutionError.Plo"; else rm -f "$(DEPDIR)/libamdis_la-PollutionError.Tpo"; exit 1; fi
@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$(PARALLEL_DIR)/PollutionError.cc' object='libamdis_la-PollutionError.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-PollutionError.lo `test -f '$(PARALLEL_DIR)/PollutionError.cc' || echo '$(srcdir)/'`$(PARALLEL_DIR)/PollutionError.cc
libamdis_la-DOFIndexed.lo: $(SOURCE_DIR)/DOFIndexed.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-DOFIndexed.lo -MD -MP -MF "$(DEPDIR)/libamdis_la-DOFIndexed.Tpo" -c -o libamdis_la-DOFIndexed.lo `test -f '$(SOURCE_DIR)/DOFIndexed.cc' || echo '$(srcdir)/'`$(SOURCE_DIR)/DOFIndexed.cc; \
@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/libamdis_la-DOFIndexed.Tpo" "$(DEPDIR)/libamdis_la-DOFIndexed.Plo"; else rm -f "$(DEPDIR)/libamdis_la-DOFIndexed.Tpo"; exit 1; fi
......
#include "PollutionError.h"
#include "mpi.h"
namespace AMDiS
{
PollutionErrorKonvex::BoundaryTraverseStack::BoundaryTraverseStack(Mesh *mesh,
PartitionStatus ps_)
{
TraverseStack myStack;
ElInfo *swap =
myStack.traverseFirst(mesh,-1,
Mesh::CALL_LEAF_EL | Mesh::FILL_COORDS | Mesh::FILL_NEIGH);
ps = ps_;
WorldVector<double>* centerWorld;
DimVec<double> center = DimVec<double>(2, DEFAULT_VALUE, 1.0 / 3.0);
while (swap != NULL) {
if (proofConditions(swap)) {
// if conditions are true, push the midpoint to the end of the list. a better
// algorithm should use the boundary edge
centerWorld = new WorldVector<double>();
swap->coordToWorld(center, *centerWorld);
push_back(centerWorld);
}
swap = myStack.traverseNext(swap);
}
}
bool AMDiS::PollutionErrorKonvex::BoundaryTraverseStack::proofConditions(ElInfo *elInfo)
{
if (elInfo == NULL)
return false;
Element *curEl = elInfo->getElement();
PartitionElementData *ped =
static_cast<PartitionElementData*>(curEl->getElementData(PARTITION_ED));
TEST_EXIT_DBG(ped != NULL)("No PartitionElementData found");
if (ped != NULL && ped->getPartitionStatus() == OVERLAP) {
//check neighbour
int nrNeigh = curEl->getGeo(NEIGH);
for (int i = 0; i < nrNeigh; i++) {
Element* curNeigh = elInfo->getNeighbour(i);
if (curNeigh != NULL) {
ped =
static_cast<PartitionElementData*>(curNeigh->getElementData(PARTITION_ED));
if (ped != NULL && ped->getPartitionStatus() == ps)
return true;
}
}
}
return false;
}
PollutionErrorKonvex::PollutionErrorKonvex(std::string name, int r)
: ResidualEstimator(name,r),
center(2,DEFAULT_VALUE, 1.0 / 3.0)
{
FUNCNAME("PollutionErrorKonvexEstimator::PollutionErrorKonvexEstimator()");
GET_PARAMETER(0, name + "->C1p", "%f", &C1p);
GET_PARAMETER(0, name + "->C2p", "%f", &C2p);
}
void PollutionErrorKonvex::init(double timestep)
{
FUNCNAME("PollutionErrorKonvex::init");
ResidualEstimator::init(timestep);
// set the distance (ie. width of the overlapped area)
// approximate the overlapped area as rectangle. then set d=max(edge1, edge2)
// retrieve all elements at the boundary overlapped -> out
bts = new BoundaryTraverseStack(mesh, IN);
}
void PollutionErrorKonvex::estimateElement(ElInfo *elInfo)
{
FUNCNAME("PollutionErrorKonvex::estimateElement()");
// switch between inner and outer
// inner part --> use H_1Norm
// outer part --> use L_2Norm
PartitionElementData* ped =
static_cast<PartitionElementData*>(elInfo->getElement()->getElementData(PARTITION_ED));
TEST_EXIT_DBG(ped != NULL)("No partition Elementdata found");
PartitionStatus ps = ped->getPartitionStatus();
TEST_EXIT_DBG(ps != UNDEFINED)("Elementstatus undefined");
// save old values
double C0 = ResidualEstimator::C0;
double C1 = ResidualEstimator::C1;
if (ps == OUT) {
//outer part
ResidualEstimator::norm = L2_NORM;
ResidualEstimator::C0 *= C2p;
//compute distance
double d = getDistance(elInfo);
ResidualEstimator::C1 *= C2p / d;
} else {
//inner part
ResidualEstimator::norm = H1_NORM;
ResidualEstimator::C0 *= C1p;
ResidualEstimator::C1 *= C1p;
}
ResidualEstimator::estimateElement(elInfo);
//set old values
ResidualEstimator::C0 = C0;
ResidualEstimator::C1 = C1;
}
double PollutionErrorKonvex::getDistance(ElInfo* element)
{
if (bts==NULL)
MSG("bts is null");
TEST_EXIT_DBG(bts!=NULL)("no bts");
double distance = 0.0;
double curDistance = 1.0;
//get center in world coord
WorldVector<double> centerWorld;
element->coordToWorld(center,centerWorld);
//start traversal over all Midpoints at the boundary overlap <-> in
for (BoundaryTraverseStack::iterator myIt = bts->begin();
myIt != bts->end(); myIt++) {
curDistance = 0;
for (int i = 0;i < dim;i++)
curDistance += ((*(*myIt))[i]-centerWorld[i]) * ((*(*myIt))[i] - centerWorld[i]);
distance = max(curDistance, distance);
}
return distance;
}
void PollutionErrorKonvex::exit(bool output = true)
{
ResidualEstimator::exit(output);
delete bts;
}
}
// ============================================================================
// == ==
// == AMDiS - Adaptive multidimensional simulations ==
// == ==
// ============================================================================
// == ==
// == TU Dresden ==
// == ==
// == Institut fr Wissenschaftliches Rechnen ==
// == Zellescher Weg 12-14 ==
// == 01069 Dresden ==
// == germany ==
// == ==
// ============================================================================
// == ==
// == https://gforge.zih.tu-dresden.de/projects/amdis/ ==
// == ==
// ============================================================================
/** \file PollutionError.h */
/** \defgroup Estimator Estimator module
* @{ <img src="estimator.png"> @}
*/
#ifndef AMDIS_POLLUTIONERROR_KONVEX_H
#define AMDIS_POLLUTIONERROR_KONVEX_H
#include <list>
#include <time.h>
#include "ResidualEstimator.h"
#include "PartitionElementData.h"
namespace AMDiS {
/** \ingroup Estimator
* \brief Estimator for parallel solutions.
*
* estimates the error using following formulae
* \f$||e_h||_{1,\Omega_0}=C_1 ||u_h||_{H_1(\Omega_1)}+
* \frac{C_2}{d^2}||u_h||_{L_2(\Omega\setminus\Omega_1}\f$
* where \f$\Omega\f$ is the complete area of interest and \f$\Omega_1\f$ the area of
* this process with overlapping. \f$\Omega_0\$ is the area of this process without
* overlapping,\f$d\$ contains the distance
* dist(\f$\partial \Omega_0,\partial \Omega_1\f$)
*/
class PollutionErrorKonvex : public ResidualEstimator
{
public:
class Creator : public EstimatorCreator
{
public:
Creator() : EstimatorCreator() {}
virtual ~Creator() {}
/// Returns a new ODirSolver object.
Estimator* create()
{
return new PollutionErrorKonvex(name, row);
}
};
PollutionErrorKonvex(std::string name, int r);
//sets the overlapping width for 2d-elements
virtual void init(double timestep);
virtual void estimateElement(ElInfo *elInfo);
virtual void exit(bool output);
protected:
/// constant in front of the inner residual
double C1p;
/// constant in front of the outer residual
double C2p;
///traverse-class for edges and there normals in 2d
class BoundaryTraverseStack: public std::list< WorldVector<double>* >
{
public:
BoundaryTraverseStack(Mesh *mesh, PartitionStatus p);
private:
PartitionStatus ps;
bool proofConditions(ElInfo *elInfo);
};
/// computes the squared distance of element el to the boundary of \f$\Omega_0$\f$
double getDistance(ElInfo* el);
/// stack to traverse over the boundary of \f$\Omega_0$\f$
BoundaryTraverseStack* bts;
/// barycentric center
DimVec<double> center;
};
}
#endif
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment