From 534cc4291ae42d9fb3610af4ea4576a109c0b7b5 Mon Sep 17 00:00:00 2001 From: Thomas Witkowski <thomas.witkowski@gmx.de> Date: Tue, 5 Jan 2010 11:55:43 +0000 Subject: [PATCH] Merged with parallelization branch. --- AMDiS/bin/Makefile.am | 2 +- AMDiS/bin/Makefile.in | 17 +++++-- AMDiS/src/ConditionalEstimator.cc | 42 +++++++++++---- AMDiS/src/ConditionalEstimator.h | 22 ++++---- AMDiS/src/ConditionalMarker.cc | 85 +++++++++++++++++++++++++++++++ AMDiS/src/ConditionalMarker.h | 75 +++++---------------------- AMDiS/src/Marker.h | 6 +++ 7 files changed, 163 insertions(+), 86 deletions(-) create mode 100644 AMDiS/src/ConditionalMarker.cc diff --git a/AMDiS/bin/Makefile.am b/AMDiS/bin/Makefile.am index 2dd03c77..6b8700e0 100644 --- a/AMDiS/bin/Makefile.am +++ b/AMDiS/bin/Makefile.am @@ -13,7 +13,7 @@ libamdis_la_CXXFLAGS = if USE_PARALLEL_AMDIS PARALLEL_AMDIS_SOURCES = \ $(PARALLEL_DIR)/ConditionalEstimator.h $(PARALLEL_DIR)/ConditionalEstimator.cc \ - $(PARALLEL_DIR)/ConditionalMarker.h \ + $(PARALLEL_DIR)/ConditionalMarker.h \ $(PARALLEL_DIR)/ConditionalMarker.cc \ $(PARALLEL_DIR)/ParallelError.h $(PARALLEL_DIR)/ParallelError.hh \ $(PARALLEL_DIR)/ParallelProblem.h $(PARALLEL_DIR)/ParallelProblem.cc \ $(PARALLEL_DIR)/ParMetisPartitioner.h $(PARALLEL_DIR)/ParMetisPartitioner.cc \ diff --git a/AMDiS/bin/Makefile.in b/AMDiS/bin/Makefile.in index 1ef135b2..11fc047d 100644 --- a/AMDiS/bin/Makefile.in +++ b/AMDiS/bin/Makefile.in @@ -78,7 +78,8 @@ am__libamdis_la_SOURCES_DIST = $(PARALLEL_DIR)/ParallelDomainBase.h \ $(PARALLEL_DIR)/ParallelDomainVec.cc \ $(PARALLEL_DIR)/ConditionalEstimator.h \ $(PARALLEL_DIR)/ConditionalEstimator.cc \ - $(PARALLEL_DIR)/ConditionalMarker.h \ + $(PARALLEL_DIR)/ConditionalMarker.h \ \ + $(PARALLEL_DIR)/ConditionalMarker.cc \ $(PARALLEL_DIR)/ParallelError.h \ $(PARALLEL_DIR)/ParallelError.hh \ $(PARALLEL_DIR)/ParallelProblem.h \ @@ -167,7 +168,7 @@ am__libamdis_la_SOURCES_DIST = $(PARALLEL_DIR)/ParallelDomainBase.h \ $(SOURCE_DIR)/Estimator.cc $(SOURCE_DIR)/FiniteElemSpace.h \ $(SOURCE_DIR)/FixVec.h $(SOURCE_DIR)/FixVec.hh \ $(SOURCE_DIR)/FixVecConvert.h $(SOURCE_DIR)/Flag.h \ - $(SOURCE_DIR)/Global.h $(SOURCE_DIR)/UmfPackSolver.h \ \ + $(SOURCE_DIR)/Global.h $(SOURCE_DIR)/UmfPackSolver.h \ $(SOURCE_DIR)/UmfPackSolver.hh $(SOURCE_DIR)/Lagrange.h \ $(SOURCE_DIR)/Line.h $(SOURCE_DIR)/MacroElement.h \ $(SOURCE_DIR)/MacroWriter.h $(SOURCE_DIR)/Markings.h \ @@ -232,6 +233,7 @@ am__libamdis_la_SOURCES_DIST = $(PARALLEL_DIR)/ParallelDomainBase.h \ @USE_PARALLEL_AMDIS_FALSE@am__objects_2 = $(am__objects_1) @USE_PARALLEL_AMDIS_TRUE@am__objects_2 = \ @USE_PARALLEL_AMDIS_TRUE@ libamdis_la-ConditionalEstimator.lo \ +@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@ $(am__objects_1) @@ -459,7 +461,8 @@ libamdis_la_CXXFLAGS = $(am__append_1) $(am__append_3) $(am__append_5) \ @USE_PARALLEL_AMDIS_FALSE@PARALLEL_AMDIS_SOURCES = $(am__append_2) @USE_PARALLEL_AMDIS_TRUE@PARALLEL_AMDIS_SOURCES = $(PARALLEL_DIR)/ConditionalEstimator.h \ @USE_PARALLEL_AMDIS_TRUE@ $(PARALLEL_DIR)/ConditionalEstimator.cc \ -@USE_PARALLEL_AMDIS_TRUE@ $(PARALLEL_DIR)/ConditionalMarker.h \ +@USE_PARALLEL_AMDIS_TRUE@ $(PARALLEL_DIR)/ConditionalMarker.h \ \ +@USE_PARALLEL_AMDIS_TRUE@ $(PARALLEL_DIR)/ConditionalMarker.cc \ @USE_PARALLEL_AMDIS_TRUE@ $(PARALLEL_DIR)/ParallelError.h \ @USE_PARALLEL_AMDIS_TRUE@ $(PARALLEL_DIR)/ParallelError.hh \ @USE_PARALLEL_AMDIS_TRUE@ $(PARALLEL_DIR)/ParallelProblem.h \ @@ -734,6 +737,7 @@ distclean-compile: @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libamdis_la-CoarseningManager3d.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libamdis_la-ComponentTraverseInfo.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libamdis_la-ConditionalEstimator.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libamdis_la-ConditionalMarker.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libamdis_la-CreatorMap.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libamdis_la-DOFAdmin.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libamdis_la-DOFIndexed.Plo@am__quote@ @@ -865,6 +869,13 @@ libamdis_la-ConditionalEstimator.lo: $(PARALLEL_DIR)/ConditionalEstimator.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-ConditionalEstimator.lo `test -f '$(PARALLEL_DIR)/ConditionalEstimator.cc' || echo '$(srcdir)/'`$(PARALLEL_DIR)/ConditionalEstimator.cc +libamdis_la-ConditionalMarker.lo: $(PARALLEL_DIR)/ConditionalMarker.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-ConditionalMarker.lo -MD -MP -MF "$(DEPDIR)/libamdis_la-ConditionalMarker.Tpo" -c -o libamdis_la-ConditionalMarker.lo `test -f '$(PARALLEL_DIR)/ConditionalMarker.cc' || echo '$(srcdir)/'`$(PARALLEL_DIR)/ConditionalMarker.cc; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/libamdis_la-ConditionalMarker.Tpo" "$(DEPDIR)/libamdis_la-ConditionalMarker.Plo"; else rm -f "$(DEPDIR)/libamdis_la-ConditionalMarker.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$(PARALLEL_DIR)/ConditionalMarker.cc' object='libamdis_la-ConditionalMarker.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-ConditionalMarker.lo `test -f '$(PARALLEL_DIR)/ConditionalMarker.cc' || echo '$(srcdir)/'`$(PARALLEL_DIR)/ConditionalMarker.cc + libamdis_la-ParallelProblem.lo: $(PARALLEL_DIR)/ParallelProblem.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-ParallelProblem.lo -MD -MP -MF "$(DEPDIR)/libamdis_la-ParallelProblem.Tpo" -c -o libamdis_la-ParallelProblem.lo `test -f '$(PARALLEL_DIR)/ParallelProblem.cc' || echo '$(srcdir)/'`$(PARALLEL_DIR)/ParallelProblem.cc; \ @am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/libamdis_la-ParallelProblem.Tpo" "$(DEPDIR)/libamdis_la-ParallelProblem.Plo"; else rm -f "$(DEPDIR)/libamdis_la-ParallelProblem.Tpo"; exit 1; fi diff --git a/AMDiS/src/ConditionalEstimator.cc b/AMDiS/src/ConditionalEstimator.cc index f58d4b8a..3ab73099 100644 --- a/AMDiS/src/ConditionalEstimator.cc +++ b/AMDiS/src/ConditionalEstimator.cc @@ -7,14 +7,32 @@ namespace AMDiS { + ConditionalEstimator::ConditionalEstimator(Estimator* decorated) + : decoratedEstimator_(decorated), + elementCount_(0), + row_(decorated ? decorated->getRow() : 0) + { + FUNCNAME("ConditionalEstimator::ConditionalEstimator(Estimator* decorated)"); + + if (decorated!=NULL) { + name = decorated->getName(); + int swap; + int retVal = + Parameters::getGlobalParameter(0, name + "->estimate outer", "%d", &swap); + + if (retVal > 0) + estimateOut = (bool)swap; + else + estimateOut = false; + } + } + double ConditionalEstimator::estimate(double ts) { if (decoratedEstimator_) { double partition_sum = 0.0; - elementCount_ = 0; - decoratedEstimator_->init(ts); mesh = decoratedEstimator_->getMesh(); @@ -30,21 +48,27 @@ namespace AMDiS { TEST_EXIT_DBG(elData)("no partition data on leaf element %d (rank %d)\n", elInfo->getElement()->getIndex(), MPI::COMM_WORLD.Get_rank()); - - //if(status == IN || status == OVERLAP) { + + PartitionStatus status = elData->getPartitionStatus(); + + if (status == IN || status == OVERLAP || (estimateOut && status==OUT)) decoratedEstimator_->estimateElement(elInfo); - //} else { - // elInfo->getElement()->setMark(0); - //} + else + elInfo->getElement()->setMark(0); + elInfo = stack.traverseNext(elInfo); } elInfo = stack.traverseFirst(mesh, -1, traverseFlag); while (elInfo) { - //if(status == IN) { + PartitionElementData *elData = dynamic_cast<PartitionElementData*> + (elInfo->getElement()->getElementData(PARTITION_ED)); + PartitionStatus status = elData->getPartitionStatus(); + if (status == IN || status==OVERLAP || (estimateOut && status==OUT)) { elementCount_++; partition_sum += elInfo->getElement()->getEstimation(row_); - //} + } + elInfo = stack.traverseNext(elInfo); } diff --git a/AMDiS/src/ConditionalEstimator.h b/AMDiS/src/ConditionalEstimator.h index c44d9123..94940d7f 100644 --- a/AMDiS/src/ConditionalEstimator.h +++ b/AMDiS/src/ConditionalEstimator.h @@ -4,16 +4,16 @@ // == == // ============================================================================ // == == -// == TU Dresden == +// == crystal growth group == // == == -// == Institut für Wissenschaftliches Rechnen == -// == Zellescher Weg 12-14 == -// == 01069 Dresden == +// == Stiftung caesar == +// == Ludwig-Erhard-Allee 2 == +// == 53175 Bonn == // == germany == // == == // ============================================================================ // == == -// == https://gforge.zih.tu-dresden.de/projects/amdis/ == +// == http://www.caesar.de/cg/AMDiS == // == == // ============================================================================ @@ -39,11 +39,11 @@ namespace AMDiS { class ConditionalEstimator : public Estimator { public: - ConditionalEstimator(Estimator *decorated) - : decoratedEstimator_(decorated), - elementCount_(0), - row_(decorated ? decorated->getRow() : 0) - {} + /** + * Reads the estimateOuter parameter. default value is false! + * (i.e.: the ouer part is not estimated) + */ + ConditionalEstimator(Estimator *decorated); double estimate(double timestep); @@ -63,6 +63,8 @@ namespace AMDiS { int elementCount_; int row_; + + bool estimateOut; }; } diff --git a/AMDiS/src/ConditionalMarker.cc b/AMDiS/src/ConditionalMarker.cc new file mode 100644 index 00000000..9aeeb149 --- /dev/null +++ b/AMDiS/src/ConditionalMarker.cc @@ -0,0 +1,85 @@ +#include "ConditionalMarker.h" + +namespace AMDiS +{ + ConditionalMarker::ConditionalMarker(const std::string name_, + int row, + Marker *decoratedMarker, + int globalCoarseGridLevel, + int localCoarseGridLevel) + : Marker(name_, row), + decoratedMarker_(decoratedMarker), + globalCoarseGridLevel_(globalCoarseGridLevel), + localCoarseGridLevel_(localCoarseGridLevel) + { + if (decoratedMarker != NULL) + name = decoratedMarker->getName(); + else + std::cout << "no decorated Marker, mark outer path is" << name << "->mark outer" << std::endl; + + int swap; + int retVal = Parameters::getGlobalParameter(0, name + "->mark outer", "%d", &swap); + + if (retVal>0) + markOuter = (bool)swap; + else + markOuter = false; + + MSG("markOuter:" + markOuter); + } + + void ConditionalMarker::initMarking(AdaptInfo *adaptInfo, Mesh *mesh) + { + if (decoratedMarker_) + decoratedMarker_->initMarking(adaptInfo, mesh); + } + + void ConditionalMarker::finishMarking(AdaptInfo *adaptInfo) + { + if (decoratedMarker_) { + int tmp = decoratedMarker_->getElMarkRefine(); + MPI::COMM_WORLD.Allreduce(&tmp, + &elMarkRefine, + 1, + MPI_INT, + MPI_SUM); + tmp = decoratedMarker_->getElMarkCoarsen(); + MPI::COMM_WORLD.Allreduce(&tmp, + &elMarkCoarsen, + 1, + MPI_INT, + MPI_SUM); + decoratedMarker_->finishMarking(adaptInfo); + } + } + + + void ConditionalMarker::markElement(AdaptInfo *adaptInfo, ElInfo *elInfo) + { + FUNCNAME("ConditionalMarker::markElement()"); + + if (decoratedMarker_) { + PartitionElementData *elData = + dynamic_cast<PartitionElementData*>(elInfo->getElement()-> + getElementData(PARTITION_ED)); + + TEST_EXIT_DBG(elData)("no partition data\n"); + + decoratedMarker_->markElement(adaptInfo, elInfo); + + if (!markOuter && elData->getPartitionStatus() == OUT) { + Element *element = elInfo->getElement(); + if (element->getMark() > 0) + element->setMark(0); + } + + int minLevel = + elData->getPartitionStatus() != OUT ? + localCoarseGridLevel_ : + globalCoarseGridLevel_; + + if (elData->getLevel() + elInfo->getElement()->getMark() < minLevel) + elInfo->getElement()->setMark(-(elData->getLevel() - minLevel)); + } + } +} diff --git a/AMDiS/src/ConditionalMarker.h b/AMDiS/src/ConditionalMarker.h index ee1f8ae5..8328d657 100644 --- a/AMDiS/src/ConditionalMarker.h +++ b/AMDiS/src/ConditionalMarker.h @@ -4,16 +4,16 @@ // == == // ============================================================================ // == == -// == TU Dresden == +// == crystal growth group == // == == -// == Institut für Wissenschaftliches Rechnen == -// == Zellescher Weg 12-14 == -// == 01069 Dresden == +// == Stiftung caesar == +// == Ludwig-Erhard-Allee 2 == +// == 53175 Bonn == // == germany == // == == // ============================================================================ // == == -// == https://gforge.zih.tu-dresden.de/projects/amdis/ == +// == http://www.caesar.de/cg/AMDiS == // == == // ============================================================================ @@ -41,76 +41,25 @@ namespace AMDiS { { public: /// Constructor. - ConditionalMarker(std::string name, + ConditionalMarker(const std::string name, int row, Marker *decoratedMarker, int globalCoarseGridLevel, - int localCoarseGridLevel) - : Marker(name, row), - decoratedMarker_(decoratedMarker), - globalCoarseGridLevel_(globalCoarseGridLevel), - localCoarseGridLevel_(localCoarseGridLevel) - {} + int localCoarseGridLevel); + /// Implementation of MarkScal::initMarking(). - virtual void initMarking(AdaptInfo *adaptInfo, Mesh *mesh) - { - if (decoratedMarker_) - decoratedMarker_->initMarking(adaptInfo, mesh); - } + virtual void initMarking(AdaptInfo *adaptInfo, Mesh *mesh); - virtual void finishMarking(AdaptInfo *adaptInfo) - { - if (decoratedMarker_) { - int tmp = decoratedMarker_->getElMarkRefine(); - MPI::COMM_WORLD.Allreduce(&tmp, - &elMarkRefine, - 1, - MPI_INT, - MPI_SUM); - tmp = decoratedMarker_->getElMarkCoarsen(); - MPI::COMM_WORLD.Allreduce(&tmp, - &elMarkCoarsen, - 1, - MPI_INT, - MPI_SUM); - decoratedMarker_->finishMarking(adaptInfo); - } - } + virtual void finishMarking(AdaptInfo *adaptInfo); - void markElement(AdaptInfo *adaptInfo, ElInfo *elInfo) - { - FUNCNAME("ConditionalMarker::markElement()"); - - if (decoratedMarker_) { - PartitionElementData *elData = - dynamic_cast<PartitionElementData*>(elInfo->getElement()-> - getElementData(PARTITION_ED)); - - TEST_EXIT_DBG(elData)("no partition data\n"); - - decoratedMarker_->markElement(adaptInfo, elInfo); - - if (elData->getPartitionStatus() == OUT) { - Element *element = elInfo->getElement(); - if (element->getMark() > 0) - element->setMark(0); - } - - int minLevel = - elData->getPartitionStatus() != OUT ? - localCoarseGridLevel_ : - globalCoarseGridLevel_; - - if (elData->getLevel() + elInfo->getElement()->getMark() < minLevel) - elInfo->getElement()->setMark(-(elData->getLevel() - minLevel)); - } - } + void markElement(AdaptInfo *adaptInfo, ElInfo *elInfo); protected: Marker *decoratedMarker_; int globalCoarseGridLevel_; int localCoarseGridLevel_; + bool markOuter; }; } diff --git a/AMDiS/src/Marker.h b/AMDiS/src/Marker.h index 441fe9d7..edd4720f 100644 --- a/AMDiS/src/Marker.h +++ b/AMDiS/src/Marker.h @@ -117,6 +117,12 @@ namespace AMDiS { return elMarkCoarsen; } + // Returns \ref name of the Marker + inline std::string getName() const + { + return name; + } + /// Creates a scalr marker depending on the strategy set in parameters. static Marker *createMarker(std::string name, int row_); -- GitLab