diff --git a/AMDiS/bin/Makefile.am b/AMDiS/bin/Makefile.am index 5bf7184e8f4078d0dac1cfd2435c68f6c87738fe..c650107263f7e31f7ab407b318baa8de2b9234cc 100644 --- a/AMDiS/bin/Makefile.am +++ b/AMDiS/bin/Makefile.am @@ -16,6 +16,7 @@ if USE_PARALLEL_AMDIS $(PARALLEL_DIR)/MeshStructure_ED.h \ $(PARALLEL_DIR)/ParallelError.h $(PARALLEL_DIR)/ParallelError.hh \ $(PARALLEL_DIR)/ParallelProblem.h $(PARALLEL_DIR)/ParallelProblem.cc \ + $(PARALLEL_DIR)/ParallelDomainProblem.h $(PARALLEL_DIR)/ParallelDomainProblem.cc \ $(PARALLEL_DIR)/ParMetisPartitioner.h $(PARALLEL_DIR)/ParMetisPartitioner.cc \ $(PARALLEL_DIR)/PartitionElementData.h PARALLEL_INCLUDES = -I$(MPI_DIR)/include -I$(PARMETIS_DIR) diff --git a/AMDiS/bin/Makefile.in b/AMDiS/bin/Makefile.in index bc647ad245708542513703d7928dbc057350a89c..3c77cd69ebc7bf1843f5297a72da10bf7c27e7bf 100644 --- a/AMDiS/bin/Makefile.in +++ b/AMDiS/bin/Makefile.in @@ -75,6 +75,8 @@ am__libamdis_la_SOURCES_DIST = $(PARALLEL_DIR)/ConditionalEstimator.h \ $(PARALLEL_DIR)/ParallelError.hh \ $(PARALLEL_DIR)/ParallelProblem.h \ $(PARALLEL_DIR)/ParallelProblem.cc \ + $(PARALLEL_DIR)/ParallelDomainProblem.h \ + $(PARALLEL_DIR)/ParallelDomainProblem.cc \ $(PARALLEL_DIR)/ParMetisPartitioner.h \ $(PARALLEL_DIR)/ParMetisPartitioner.cc \ $(PARALLEL_DIR)/PartitionElementData.h \ @@ -258,6 +260,7 @@ am__libamdis_la_SOURCES_DIST = $(PARALLEL_DIR)/ConditionalEstimator.h \ @USE_PARALLEL_AMDIS_TRUE@ libamdis_la-ConditionalEstimator.lo \ @USE_PARALLEL_AMDIS_TRUE@ libamdis_la-MeshStructure.lo \ @USE_PARALLEL_AMDIS_TRUE@ libamdis_la-ParallelProblem.lo \ +@USE_PARALLEL_AMDIS_TRUE@ libamdis_la-ParallelDomainProblem.lo \ @USE_PARALLEL_AMDIS_TRUE@ libamdis_la-ParMetisPartitioner.lo am_libamdis_la_OBJECTS = $(am__objects_1) \ libamdis_la-MultiGridPreconWrapper.lo \ @@ -490,6 +493,7 @@ AMDIS_INCLUDES = -I$(SOURCE_DIR) $(am__append_2) $(am__append_5) @USE_PARALLEL_AMDIS_TRUE@ $(PARALLEL_DIR)/MeshStructure_ED.h \ @USE_PARALLEL_AMDIS_TRUE@ $(PARALLEL_DIR)/ParallelError.h $(PARALLEL_DIR)/ParallelError.hh \ @USE_PARALLEL_AMDIS_TRUE@ $(PARALLEL_DIR)/ParallelProblem.h $(PARALLEL_DIR)/ParallelProblem.cc \ +@USE_PARALLEL_AMDIS_TRUE@ $(PARALLEL_DIR)/ParallelDomainProblem.h $(PARALLEL_DIR)/ParallelDomainProblem.cc \ @USE_PARALLEL_AMDIS_TRUE@ $(PARALLEL_DIR)/ParMetisPartitioner.h $(PARALLEL_DIR)/ParMetisPartitioner.cc \ @USE_PARALLEL_AMDIS_TRUE@ $(PARALLEL_DIR)/PartitionElementData.h @@ -836,6 +840,7 @@ distclean-compile: @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libamdis_la-NonLinUpdater.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libamdis_la-Operator.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libamdis_la-ParMetisPartitioner.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libamdis_la-ParallelDomainProblem.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libamdis_la-ParallelProblem.Plo@am__quote@ @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@ @@ -932,6 +937,13 @@ libamdis_la-ParallelProblem.lo: $(PARALLEL_DIR)/ParallelProblem.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-ParallelProblem.lo `test -f '$(PARALLEL_DIR)/ParallelProblem.cc' || echo '$(srcdir)/'`$(PARALLEL_DIR)/ParallelProblem.cc +libamdis_la-ParallelDomainProblem.lo: $(PARALLEL_DIR)/ParallelDomainProblem.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-ParallelDomainProblem.lo -MD -MP -MF "$(DEPDIR)/libamdis_la-ParallelDomainProblem.Tpo" -c -o libamdis_la-ParallelDomainProblem.lo `test -f '$(PARALLEL_DIR)/ParallelDomainProblem.cc' || echo '$(srcdir)/'`$(PARALLEL_DIR)/ParallelDomainProblem.cc; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/libamdis_la-ParallelDomainProblem.Tpo" "$(DEPDIR)/libamdis_la-ParallelDomainProblem.Plo"; else rm -f "$(DEPDIR)/libamdis_la-ParallelDomainProblem.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$(PARALLEL_DIR)/ParallelDomainProblem.cc' object='libamdis_la-ParallelDomainProblem.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-ParallelDomainProblem.lo `test -f '$(PARALLEL_DIR)/ParallelDomainProblem.cc' || echo '$(srcdir)/'`$(PARALLEL_DIR)/ParallelDomainProblem.cc + libamdis_la-ParMetisPartitioner.lo: $(PARALLEL_DIR)/ParMetisPartitioner.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-ParMetisPartitioner.lo -MD -MP -MF "$(DEPDIR)/libamdis_la-ParMetisPartitioner.Tpo" -c -o libamdis_la-ParMetisPartitioner.lo `test -f '$(PARALLEL_DIR)/ParMetisPartitioner.cc' || echo '$(srcdir)/'`$(PARALLEL_DIR)/ParMetisPartitioner.cc; \ @am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/libamdis_la-ParMetisPartitioner.Tpo" "$(DEPDIR)/libamdis_la-ParMetisPartitioner.Plo"; else rm -f "$(DEPDIR)/libamdis_la-ParMetisPartitioner.Tpo"; exit 1; fi diff --git a/AMDiS/libtool b/AMDiS/libtool index a72d8a2512643ae7c52dd8fe014f74a751bb8e63..c1ffc52dc2a18e9aea6a1c54bd62b799a57e937c 100755 --- a/AMDiS/libtool +++ b/AMDiS/libtool @@ -44,7 +44,7 @@ available_tags=" CXX F77" # ### BEGIN LIBTOOL CONFIG -# Libtool was configured on host p1s060: +# Libtool was configured on host p2s148: # Shell to use when invoking shell scripts. SHELL="/bin/sh" @@ -6760,7 +6760,7 @@ build_old_libs=`case $build_libtool_libs in yes) $echo no;; *) $echo yes;; esac` # End: # ### BEGIN LIBTOOL TAG CONFIG: CXX -# Libtool was configured on host p1s060: +# Libtool was configured on host p2s148: # Shell to use when invoking shell scripts. SHELL="/bin/sh" @@ -7065,7 +7065,7 @@ include_expsyms="" # ### BEGIN LIBTOOL TAG CONFIG: F77 -# Libtool was configured on host p1s060: +# Libtool was configured on host p2s148: # Shell to use when invoking shell scripts. SHELL="/bin/sh" diff --git a/AMDiS/src/ParallelDomainProblem.cc b/AMDiS/src/ParallelDomainProblem.cc new file mode 100644 index 0000000000000000000000000000000000000000..7ccc6de1833b6e58fb7fb7961c9229a8a441ebc2 --- /dev/null +++ b/AMDiS/src/ParallelDomainProblem.cc @@ -0,0 +1,119 @@ +#include "ParallelDomainProblem.h" +#include "ProblemScal.h" +#include "ProblemInstat.h" +#include "ParMetisPartitioner.h" +#include "Mesh.h" +#include "Traverse.h" +#include "ElInfo.h" +#include "Element.h" +#include "MacroElement.h" +#include "PartitionElementData.h" + +namespace AMDiS { + + ParallelDomainProblemBase::ParallelDomainProblemBase(const std::string& name, + ProblemIterationInterface *iterationIF, + ProblemTimeInterface *timeIF, + Mesh *m) + : mesh(m) + { + mpiRank = MPI::COMM_WORLD.Get_rank(); + mpiSize = MPI::COMM_WORLD.Get_size(); + mpiComm = MPI::COMM_WORLD; + partitioner = new ParMetisPartitioner(mesh, &mpiComm); + } + + void ParallelDomainProblemBase::initParallelization(AdaptInfo *adaptInfo) + { + if (mpiSize <= 1) + return; + + // create an initial partitioning of the mesh + partitioner->createPartitionData(); + // set the element weights, which are 1 at the very first begin + setElemWeights(adaptInfo); + // and now partition the mesh + partitionMesh(adaptInfo); + + + TraverseStack stack; + ElInfo *elInfo = stack.traverseFirst(mesh, -1, Mesh::CALL_LEAF_EL); + int nLeaves = 0; + while (elInfo) { + Element *element = elInfo->getElement(); + PartitionElementData *partitionData = + dynamic_cast<PartitionElementData*> + (element->getElementData(PARTITION_ED)); + if (partitionData->getPartitionStatus() != IN) { + element->setHidden(true); + } else { + nLeaves++; + } + + elInfo = stack.traverseNext(elInfo); + } + + mesh->setNumberOfLeaves(nLeaves); + } + + void ParallelDomainProblemBase::exitParallelization(AdaptInfo *adaptInfo) + { + } + + double ParallelDomainProblemBase::setElemWeights(AdaptInfo *adaptInfo) + { + double localWeightSum = 0.0; + int elNum = -1; + + elemWeights.clear(); + + TraverseStack stack; + ElInfo *elInfo = stack.traverseFirst(mesh, -1, + Mesh::CALL_EVERY_EL_PREORDER); + while (elInfo) { + Element *element = elInfo->getElement(); + + // get partition data + PartitionElementData *partitionData = dynamic_cast<PartitionElementData*> + (element->getElementData(PARTITION_ED)); + + if (partitionData && partitionData->getPartitionStatus() == IN) { + if (partitionData->getLevel() == 0) { + elNum = element->getIndex(); + } + TEST_EXIT(elNum != -1)("invalid element number\n"); + if (element->isLeaf()) { + elemWeights[elNum] += 1.0; + localWeightSum += 1.0; + } + } + + elInfo = stack.traverseNext(elInfo); + } + + return localWeightSum; + } + + void ParallelDomainProblemBase::partitionMesh(AdaptInfo *adaptInfo) + { + if (initialPartitionMesh) { + initialPartitionMesh = false; + partitioner->fillCoarsePartitionVec(&oldPartitionVec); + partitioner->partition(&elemWeights, INITIAL); + } else { + oldPartitionVec = partitionVec; + partitioner->partition(&elemWeights, ADAPTIVE_REPART, 100.0 /*0.000001*/); + } + + partitioner->fillCoarsePartitionVec(&partitionVec); + } + + ParallelDomainProblemScal::ParallelDomainProblemScal(const std::string& name, + ProblemScal *problem, + ProblemInstatScal *problemInstat) + : ParallelDomainProblemBase(name, problem, problemInstat, problem->getMesh()) + { + } + + +} diff --git a/AMDiS/src/ParallelDomainProblem.h b/AMDiS/src/ParallelDomainProblem.h new file mode 100644 index 0000000000000000000000000000000000000000..40903a96e0bc3fc09079a485c2693f03e4ce20d7 --- /dev/null +++ b/AMDiS/src/ParallelDomainProblem.h @@ -0,0 +1,136 @@ +// ============================================================================ +// == == +// == AMDiS - Adaptive multidimensional simulations == +// == == +// ============================================================================ +// == == +// == crystal growth group == +// == == +// == Stiftung caesar == +// == Ludwig-Erhard-Allee 2 == +// == 53175 Bonn == +// == germany == +// == == +// ============================================================================ +// == == +// == http://www.caesar.de/cg/AMDiS == +// == == +// ============================================================================ + +/** \file ParallelDomainProblem.h */ + +#ifndef AMDIS_PARALLELDOMAINPROBLEM_H +#define AMDIS_PARALLELDOMAINPROBLEM_H + +#include <map> +#include <vector> + +#include "ProblemTimeInterface.h" +#include "ProblemIterationInterface.h" +#include "AdaptInfo.h" +#include "mpi.h" + +namespace AMDiS { + + class ProblemScal; + class ProblemInstatScal; + class ParMetisPartitioner; + class Mesh; + + class ParallelDomainProblemBase : public ProblemIterationInterface, + public ProblemTimeInterface + { + public: + ParallelDomainProblemBase(const std::string& name, + ProblemIterationInterface *iterationIF, + ProblemTimeInterface *timeIF, + Mesh *mesh); + + virtual ~ParallelDomainProblemBase() {} + + void initParallelization(AdaptInfo *adaptInfo); + + void exitParallelization(AdaptInfo *adaptInfo); + + /// Set for each element on the partitioning level the number of leaf elements. + double setElemWeights(AdaptInfo *adaptInfo); + + void partitionMesh(AdaptInfo *adaptInfo); + + virtual void setTime(AdaptInfo *adaptInfo) {} + + virtual void initTimestep(AdaptInfo *adaptInfo) {} + + virtual void closeTimestep(AdaptInfo *adaptInfo) {} + + virtual void solveInitialProblem(AdaptInfo *adaptInfo) {} + + virtual void transferInitialSolution(AdaptInfo *adaptInfo) {} + + virtual Flag oneIteration(AdaptInfo *adaptInfo, Flag toDo = FULL_ITERATION) {} + + virtual int getNumProblems() {} + + inline virtual const std::string& getName() { + return name; + } + + virtual ProblemStatBase *getProblem(int number = 0) {} + + virtual void serialize(std::ostream&) {} + + virtual void deserialize(std::istream&) {} + + protected: + /// The rank of the current process. + int mpiRank; + + /// Overall number of processes. + int mpiSize; + + /** \brief + * MPI communicator collected all processes, which should + * be used for calculation. The Debug procces is not included + * in this communicator. + */ + MPI::Intracomm mpiComm; + + /// Name of the problem (as used in the init files) + std::string name; + + /// Mesh of the problem. + Mesh *mesh; + + /// Pointer to the paritioner which is used to devide a mesh into partitions. + ParMetisPartitioner *partitioner; + + /// Weights for the elements, i.e., the number of leaf elements within this element. + std::map<int, double> elemWeights; + + /// Is true, if the mesh was not partitioned before, otherwise it's false. + bool initialPartitionMesh; + + /** \brief + * Stores to every coarse element index the number of the partition it + * corresponds to. + */ + std::map<int, int> partitionVec; + + /** \brief + * Stores an old partitioning of elements. To every element index the number + * of the parition it corresponds to is stored. + */ + std::map<int, int> oldPartitionVec; + }; + + class ParallelDomainProblemScal : public ParallelDomainProblemBase + { + public: + ParallelDomainProblemScal(const std::string& name, + ProblemScal *problem, + ProblemInstatScal *problemInstat); + + }; +} + +#endif // AMDIS_PARALLELDOMAINPROBLEM_H diff --git a/AMDiS/src/ParallelProblem.cc b/AMDiS/src/ParallelProblem.cc index 5ca1b8337085358e31381c45bf77e8f8668b9aac..da1ff965fac8183d481939b64c1bfc9344a0edfe 100644 --- a/AMDiS/src/ParallelProblem.cc +++ b/AMDiS/src/ParallelProblem.cc @@ -190,12 +190,12 @@ namespace AMDiS { ProblemIterationInterface *iterationIF, ProblemTimeInterface *timeIF, std::vector<DOFVector<double>*> vectors, - Mesh *mesh, + Mesh *mesh_, RefinementManager *rm, CoarseningManager *cm) : ParallelProblemBase(name, iterationIF, timeIF), name_(name), - mesh(mesh), + mesh(mesh_), refinementManager(rm), coarseningManager(cm), repartitionSteps_(1), @@ -1053,8 +1053,7 @@ namespace AMDiS { elemWeights.clear(); TraverseStack stack; - ElInfo *elInfo = stack.traverseFirst(mesh, - -1, + ElInfo *elInfo = stack.traverseFirst(mesh, -1, Mesh::CALL_EVERY_EL_PREORDER); while (elInfo) { Element *element = elInfo->getElement(); @@ -1359,29 +1358,6 @@ namespace AMDiS { // and now partition the mesh partitionMesh(adaptInfo); -#if 0 - // 2009-03-31 THOMAS, DO NOT REMOVE THIS BLOCK - TraverseStack stack; - ElInfo *elInfo = stack.traverseFirst(mesh, -1, Mesh::CALL_LEAF_EL); - int nLeaves = 0; - while (elInfo) { - Element *element = elInfo->getElement(); - PartitionElementData *partitionData = - dynamic_cast<PartitionElementData*> - (element->getElementData(PARTITION_ED)); - if (partitionData->getPartitionStatus() != IN) { - element->setHidden(true); - } else { - nLeaves++; - } - - elInfo = stack.traverseNext(elInfo); - } - - mesh->setNumberOfLeaves(nLeaves); -#endif - -#if 1 globalRefineOutOfPartition(adaptInfo); refineOverlap(adaptInfo); @@ -1429,8 +1405,6 @@ namespace AMDiS { std::string(number) + "_"); (*fwIt)->setTraverseProperties(-1, 0, elementInPartition); } - -#endif } } diff --git a/AMDiS/src/ParallelProblem.h b/AMDiS/src/ParallelProblem.h index 39aa008f84d71dc3e06fa152f5a6e84058ffef22..8abaec2348468eccab5b29ef7db5859baac62e8e 100644 --- a/AMDiS/src/ParallelProblem.h +++ b/AMDiS/src/ParallelProblem.h @@ -22,23 +22,18 @@ #ifndef AMDIS_PARALLELPROBLEM_H #define AMDIS_PARALLELPROBLEM_H +#include <map> +#include <vector> +#include <set> + #include "ProblemTimeInterface.h" #include "ProblemIterationInterface.h" #include "AdaptInfo.h" #include "mpi.h" -#include <map> -#include <vector> -#include <set> namespace AMDiS { - // ========================================================================= - // ===== class ParallelProblemInterface ==================================== - // ========================================================================= - - /** \brief - * Interface for parallel problems - */ + /// Interface for parallel problems class ParallelProblemInterface { public: @@ -47,13 +42,7 @@ namespace AMDiS { virtual void exitParallelization(AdaptInfo *adaptInfo) = 0; }; - // ========================================================================= - // ===== class ParallelProblemBase ========================================= - // ========================================================================= - - /** \brief - * Schablonen Klasse - */ + /// Schablonen Klasse class ParallelProblemBase : public ParallelProblemInterface, public ProblemIterationInterface, public ProblemTimeInterface @@ -88,19 +77,10 @@ namespace AMDiS { virtual void coarsenOutOfPartition(AdaptInfo *adaptInfo) = 0; - /** \brief - * - */ virtual void synchronizeMeshes(AdaptInfo *adaptInfo) = 0; - /** \brief - * - */ virtual void exchangeRankSolutions(AdaptInfo *adaptInfo) = 0; - /** \brief - * - */ virtual void buildGlobalSolution(AdaptInfo *adaptInfo) = 0; virtual void exitParallelization(AdaptInfo *adaptInfo); @@ -160,14 +140,10 @@ namespace AMDiS { double partitioningTime; - /** \brief - * The rank of the current process. - */ + /// The rank of the current process. int mpiRank; - /** \brief - * Overall number of processes. - */ + /// Overall number of processes. int mpiSize; /** \brief @@ -177,16 +153,10 @@ namespace AMDiS { */ MPI::Intracomm mpiComm; - /** \brief - * The MPI group, which is used for the communicator - * \ref mpiComm. - */ + /// The MPI group, which is used for the communicator \ref mpiComm. MPI::Group amdisGroup; - /** \brief - * Defines the debug mode. If it is 1, a debug server will be started - * on rank 0. - */ + /// Defines the debug mode. If it is 1, a debug server will be started on rank 0. int debugMode; /** \brief @@ -328,74 +298,32 @@ namespace AMDiS { /// int repartitionSteps_; - /** \brief - * - */ bool puEveryTimestep_; - /** \brief - * - */ std::vector<DOFVector<double>*> dofVectors_; - /** \brief - * - */ double upperPartThreshold_; - /** \brief - * - */ double lowerPartThreshold_; - /** \brief - * - */ int globalCoarseGridLevel_; - /** \brief - * - */ int localCoarseGridLevel_; - /** \brief - * - */ int globalRefinements_; - /** \brief - * - */ std::map<Element*, int> overlapDistance_; - /** \brief - * - */ int adaptiveThresholds_; - /** \brief - * - */ double thresholdIncFactor_; - /** \brief - * - */ double thresholdDecFactor_; - /** \brief - * - */ double repartTimeFactor_; - /** \brief - * - */ double minUpperTH_; - /** \brief - * - */ double maxLowerTH_; }; @@ -458,19 +386,13 @@ namespace AMDiS { Marker *oldMarker; - /** \brief - * Vector of all process' solution DOFVectors. - */ + /// Vector of all process' solution DOFVectors. std::vector<DOFVector<double>*> rankSolution; - /** \brief - * - */ + /// Estimator *usersEstimator; - /** \brief - * - */ + /// Marker *usersMarker; }; @@ -527,41 +449,28 @@ namespace AMDiS { virtual void debugFunction(AdaptInfo *adaptInfo) {} protected: + /// ProblemVec *problem; - /** \brief - * - */ + /// ProblemInstatVec *problemInstat_; - /** \brief - * - */ + /// std::vector<Estimator*> oldEstimator; - /** \brief - * - */ + /// std::vector<Marker*> oldMarker; - /** \brief - * Vector of all process' solution SystemVectors. - */ + /// Vector of all process' solution SystemVectors. std::vector<SystemVector*> rankSolution; - /** \brief - * - */ + /// std::vector<Estimator*> usersEstimator; - /** \brief - * - */ + /// std::vector<Marker*> usersMarker; - /** \brief - * Number of components of the vectorial problem. - */ + /// Number of components of the vectorial problem. int nComponents; };