Skip to content
Snippets Groups Projects
Commit 8a0d8643 authored by Müller, Felix's avatar Müller, Felix Committed by Praetorius, Simon
Browse files

Changed template parameter of Marker class from Grid to Traits

parent e746ee51
No related branches found
No related tags found
No related merge requests found
...@@ -8,8 +8,8 @@ namespace AMDiS { ...@@ -8,8 +8,8 @@ namespace AMDiS {
using std::pow; using std::pow;
template <class Grid> template <class Traits>
Marker<Grid>* Marker<Grid>::createMarker(std::string name, int row, const EstType& est, Grid* grid) Marker<Traits>* Marker<Traits>::createMarker(std::string name, int row, const EstType& est, Grid* grid)
{ {
int strategy = 0; int strategy = 0;
Parameters::get(name + "->strategy", strategy); Parameters::get(name + "->strategy", strategy);
...@@ -21,19 +21,19 @@ namespace AMDiS { ...@@ -21,19 +21,19 @@ namespace AMDiS {
break; break;
case 1: case 1:
msg("Creating global refinement (GR) marker\n"); msg("Creating global refinement (GR) marker\n");
marker = new GRMarker<Grid>(name, row, est, grid); marker = new GRMarker<Traits>(name, row, est, grid);
break; break;
case 2: case 2:
msg("Creating maximum strategy (MS) marker\n"); msg("Creating maximum strategy (MS) marker\n");
marker = new MSMarker<Grid>(name, row, est, grid); marker = new MSMarker<Traits>(name, row, est, grid);
break; break;
case 3: case 3:
msg("Creating equidistribution strategy (ES) marker\n"); msg("Creating equidistribution strategy (ES) marker\n");
marker = new ESMarker<Grid>(name, row, est, grid); marker = new ESMarker<Traits>(name, row, est, grid);
break; break;
case 4: case 4:
msg("Creating guaranteed error reduction strategy (GERS) marker\n"); msg("Creating guaranteed error reduction strategy (GERS) marker\n");
marker = new GERSMarker<Grid>(name, row, est, grid); marker = new GERSMarker<Traits>(name, row, est, grid);
break; break;
default: default:
error_exit("invalid strategy\n"); error_exit("invalid strategy\n");
...@@ -44,8 +44,8 @@ namespace AMDiS { ...@@ -44,8 +44,8 @@ namespace AMDiS {
template <class Grid> template <class Traits>
void Marker<Grid>::initMarking(AdaptInfo& adaptInfo) void Marker<Traits>::initMarking(AdaptInfo& adaptInfo)
{ {
int row_ = row == -1 ? 0 : row; int row_ = row == -1 ? 0 : row;
...@@ -57,8 +57,8 @@ namespace AMDiS { ...@@ -57,8 +57,8 @@ namespace AMDiS {
template <class Grid> template <class Traits>
void Marker<Grid>::finishMarking(AdaptInfo& adaptInfo) void Marker<Traits>::finishMarking(AdaptInfo& adaptInfo)
{ {
msg(elMarkRefine, " elements marked for refinement\n"); msg(elMarkRefine, " elements marked for refinement\n");
msg(elMarkCoarsen, " elements marked for coarsening\n"); msg(elMarkCoarsen, " elements marked for coarsening\n");
...@@ -66,12 +66,12 @@ namespace AMDiS { ...@@ -66,12 +66,12 @@ namespace AMDiS {
template <class Grid> template <class Traits>
void Marker<Grid>::markElement(AdaptInfo& adaptInfo, const Element& elem) void Marker<Traits>::markElement(AdaptInfo& adaptInfo, const Element& elem)
{ {
int row_ = row == -1 ? 0 : row; int row_ = row == -1 ? 0 : row;
const auto& index = grid->leafIndexSet().index(elem); const auto& index = grid->leafIndexSet().index(elem);
double lError = est[index][row_]; double lError = est[index];
if (adaptInfo.isRefinementAllowed(row_) && lError > markRLimit) { if (adaptInfo.isRefinementAllowed(row_) && lError > markRLimit) {
if (maxRefineLevel == -1 || elem.level() < maxRefineLevel) { if (maxRefineLevel == -1 || elem.level() < maxRefineLevel) {
...@@ -91,8 +91,8 @@ namespace AMDiS { ...@@ -91,8 +91,8 @@ namespace AMDiS {
template <class Grid> template <class Traits>
Flag Marker<Grid>::markGrid(AdaptInfo& adaptInfo) Flag Marker<Traits>::markGrid(AdaptInfo& adaptInfo)
{ {
test_exit(grid, "No grid!\n"); test_exit(grid, "No grid!\n");
...@@ -120,10 +120,10 @@ namespace AMDiS { ...@@ -120,10 +120,10 @@ namespace AMDiS {
} }
template <class Grid> template <class Traits>
void MSMarker<Grid>::initMarking(AdaptInfo& adaptInfo) void MSMarker<Traits>::initMarking(AdaptInfo& adaptInfo)
{ {
Marker<Grid>::initMarking(adaptInfo); Marker<Traits>::initMarking(adaptInfo);
int row_ = this->row == -1 ? 0 : this->row; int row_ = this->row == -1 ? 0 : this->row;
...@@ -137,10 +137,10 @@ namespace AMDiS { ...@@ -137,10 +137,10 @@ namespace AMDiS {
} }
template <class Grid> template <class Traits>
void ESMarker<Grid>::initMarking(AdaptInfo& adaptInfo) void ESMarker<Traits>::initMarking(AdaptInfo& adaptInfo)
{ {
Marker<Grid>::initMarking(adaptInfo); Marker<Traits>::initMarking(adaptInfo);
int row_ = this->row == -1 ? 0 : this->row; int row_ = this->row == -1 ? 0 : this->row;
...@@ -160,10 +160,10 @@ namespace AMDiS { ...@@ -160,10 +160,10 @@ namespace AMDiS {
} }
template <class Grid> template <class Traits>
Flag GERSMarker<Grid>::markGrid(AdaptInfo& adaptInfo) Flag GERSMarker<Traits>::markGrid(AdaptInfo& adaptInfo)
{ {
Marker<Grid>::initMarking(adaptInfo); Marker<Traits>::initMarking(adaptInfo);
int row_ = this->row == -1 ? 0 : this->row; int row_ = this->row == -1 ? 0 : this->row;
...@@ -225,7 +225,7 @@ namespace AMDiS { ...@@ -225,7 +225,7 @@ namespace AMDiS {
msg("GERS coarsening with gamma = ", GERSGamma, "\n"); msg("GERS coarsening with gamma = ", GERSGamma, "\n");
} }
Marker<Grid>::finishMarking(adaptInfo); Marker<Traits>::finishMarking(adaptInfo);
Flag markFlag; Flag markFlag;
if (this->elMarkRefine) if (this->elMarkRefine)
...@@ -237,11 +237,11 @@ namespace AMDiS { ...@@ -237,11 +237,11 @@ namespace AMDiS {
} }
template <class Grid> template <class Traits>
void GERSMarker<Grid>::markElementForRefinement(AdaptInfo& adaptInfo, const Element& elem) void GERSMarker<Traits>::markElementForRefinement(AdaptInfo& adaptInfo, const Element& elem)
{ {
int row_ = this->row == -1 ? 0 : this->row; int row_ = this->row == -1 ? 0 : this->row;
double lError = (this->est)[(this->grid->leafIndexSet()).index(elem)][row_]; double lError = (this->est)[(this->grid->leafIndexSet()).index(elem)];
if (lError > this->markRLimit) { if (lError > this->markRLimit) {
GERSSum += lError; GERSSum += lError;
...@@ -250,11 +250,11 @@ namespace AMDiS { ...@@ -250,11 +250,11 @@ namespace AMDiS {
} }
template <class Grid> template <class Traits>
void GERSMarker<Grid>::markElementForCoarsening(AdaptInfo& adaptInfo, const Element& elem) void GERSMarker<Traits>::markElementForCoarsening(AdaptInfo& adaptInfo, const Element& elem)
{ {
int row_ = this->row == -1 ? 0 : this->row; int row_ = this->row == -1 ? 0 : this->row;
double lError = (this->est)[(this->grid->leafIndexSet()).index(elem)][row_]; double lError = (this->est)[(this->grid->leafIndexSet()).index(elem)];
if ((this->grid)->getMark(elem) <= 0) { if ((this->grid)->getMark(elem) <= 0) {
/* if (elem->getElementData()->getElementData(COARSENABLE))*/ /* if (elem->getElementData()->getElementData(COARSENABLE))*/
......
...@@ -17,14 +17,15 @@ namespace AMDiS { ...@@ -17,14 +17,15 @@ namespace AMDiS {
* \brief * \brief
* Base class for all scalar markers. * Base class for all scalar markers.
*/ */
template <class Grid> template <class Traits>
class Marker class Marker
{ {
using GlobalBasis = typename Traits::GlobalBasis;
using GridView = typename Grid::LeafGridView; using GridView = typename GlobalBasis::GridView;
using Grid = typename GridView::Grid;
using IndexSet = typename GridView::IndexSet; using IndexSet = typename GridView::IndexSet;
using Element = typename GridView::template Codim<0>::Entity; using Element = typename GridView::template Codim<0>::Entity;
using EstType = std::vector<std::vector<double> >; using EstType = std::vector<double>;
public: public:
/// Constructor. /// Constructor.
...@@ -113,7 +114,7 @@ namespace AMDiS { ...@@ -113,7 +114,7 @@ namespace AMDiS {
} }
/// Creates a scalar marker depending on the strategy set in parameters. /// Creates a scalar marker depending on the strategy set in parameters.
static Marker<Grid>* createMarker(std::string name, int row_, const EstType& est_, Grid* grid_); static Marker<Traits>* createMarker(std::string name, int row_, const EstType& est_, Grid* grid_);
protected: protected:
/// Name of the scalar marker. /// Name of the scalar marker.
...@@ -173,18 +174,20 @@ namespace AMDiS { ...@@ -173,18 +174,20 @@ namespace AMDiS {
* \brief * \brief
* Global refinement. * Global refinement.
*/ */
template <class Grid> template <class Traits>
class GRMarker : public Marker<Grid> class GRMarker : public Marker<Traits>
{ {
using GridView = typename Grid::LeafGridView; using GlobalBasis = typename Traits::GlobalBasis;
using GridView = typename GlobalBasis::GridView;
using Grid = typename GridView::Grid;
using IndexSet = typename GridView::IndexSet; using IndexSet = typename GridView::IndexSet;
using Element = typename GridView::template Codim<0>::Entity; using Element = typename GridView::template Codim<0>::Entity;
using EstType = std::vector<std::vector<double> >; using EstType = std::vector<double>;
public: public:
/// Constructor. /// Constructor.
GRMarker(std::string name_, int row_, const EstType& est_, Grid* grid_) GRMarker(std::string name_, int row_, const EstType& est_, Grid* grid_)
: Marker<Grid>(name_, row_, est_, grid_) : Marker<Traits>(name_, row_, est_, grid_)
{} {}
/// Implementation of Marker::markElement(). /// Implementation of Marker::markElement().
...@@ -203,18 +206,20 @@ namespace AMDiS { ...@@ -203,18 +206,20 @@ namespace AMDiS {
* Maximum strategy. * Maximum strategy.
*/ */
template <class Grid> template <class Traits>
class MSMarker : public Marker<Grid> class MSMarker : public Marker<Traits>
{ {
using GridView = typename Grid::LeafGridView; using GlobalBasis = typename Traits::GlobalBasis;
using GridView = typename GlobalBasis::GridView;
using Grid = typename GridView::Grid;
using IndexSet = typename GridView::IndexSet; using IndexSet = typename GridView::IndexSet;
using Element = typename GridView::template Codim<0>::Entity; using Element = typename GridView::template Codim<0>::Entity;
using EstType = std::vector<std::vector<double> >; using EstType = std::vector<double>;
public: public:
/// Constructor. /// Constructor.
MSMarker(std::string name_, int row_, const EstType& est_, Grid* grid_) MSMarker(std::string name_, int row_, const EstType& est_, Grid* grid_)
: Marker<Grid>(name_, row_, est_, grid_), : Marker<Traits>(name_, row_, est_, grid_),
MSGamma(0.5), MSGamma(0.5),
MSGammaC(0.1) MSGammaC(0.1)
{ {
...@@ -241,18 +246,20 @@ namespace AMDiS { ...@@ -241,18 +246,20 @@ namespace AMDiS {
* Equidistribution strategy * Equidistribution strategy
*/ */
template <class Grid> template <class Traits>
class ESMarker : public Marker<Grid> class ESMarker : public Marker<Traits>
{ {
using GridView = typename Grid::LeafGridView; using GlobalBasis = typename Traits::GlobalBasis;
using GridView = typename GlobalBasis::GridView;
using Grid = typename GridView::Grid;
using IndexSet = typename GridView::IndexSet; using IndexSet = typename GridView::IndexSet;
using Element = typename GridView::template Codim<0>::Entity; using Element = typename GridView::template Codim<0>::Entity;
using EstType = std::vector<std::vector<double> >; using EstType = std::vector<double>;
public: public:
/// Constructor. /// Constructor.
ESMarker(std::string name_, int row_, const EstType& est_, Grid* grid_) ESMarker(std::string name_, int row_, const EstType& est_, Grid* grid_)
: Marker<Grid>(name_, row_, est_, grid_), : Marker<Traits>(name_, row_, est_, grid_),
ESTheta(0.9), ESTheta(0.9),
ESThetaC(0.2) ESThetaC(0.2)
{ {
...@@ -279,18 +286,20 @@ namespace AMDiS { ...@@ -279,18 +286,20 @@ namespace AMDiS {
* Guaranteed error reduction strategy * Guaranteed error reduction strategy
*/ */
template <class Grid> template <class Traits>
class GERSMarker : public Marker<Grid> class GERSMarker : public Marker<Traits>
{ {
using GridView = typename Grid::LeafGridView; using GlobalBasis = typename Traits::GlobalBasis;
using GridView = typename GlobalBasis::GridView;
using Grid = typename GridView::Grid;
using IndexSet = typename GridView::IndexSet; using IndexSet = typename GridView::IndexSet;
using Element = typename GridView::template Codim<0>::Entity; using Element = typename GridView::template Codim<0>::Entity;
using EstType = std::vector<std::vector<double> >; using EstType = std::vector<double>;
public: public:
/// Constructor. /// Constructor.
GERSMarker(std::string name_, int row_, const EstType& est_, Grid* grid_) GERSMarker(std::string name_, int row_, const EstType& est_, Grid* grid_)
: Marker<Grid>(name_, row_, est_, grid_), : Marker<Traits>(name_, row_, est_, grid_),
oldErrSum(0.0), oldErrSum(0.0),
GERSThetaStar(0.6), GERSThetaStar(0.6),
GERSNu(0.1), GERSNu(0.1),
......
...@@ -35,6 +35,7 @@ ...@@ -35,6 +35,7 @@
#include <amdis/io/FileWriterInterface.hpp> #include <amdis/io/FileWriterInterface.hpp>
#include <amdis/utility/TreeData.hpp>
#include <amdis/utility/TreePath.hpp> #include <amdis/utility/TreePath.hpp>
namespace AMDiS namespace AMDiS
...@@ -75,8 +76,8 @@ namespace AMDiS ...@@ -75,8 +76,8 @@ namespace AMDiS
, name_(std::move(name)) , name_(std::move(name))
{} {}
/// Constructor taking additionally a reference to a mesh that is used /// Constructor taking additionally a reference to a grid that is used
/// instead of the default created mesh, \ref ProblemStat /// instead of the default created grid, \ref ProblemStat
ProblemStat(std::string name, Grid& grid) ProblemStat(std::string name, Grid& grid)
: ProblemStat(std::move(name)) : ProblemStat(std::move(name))
{ {
...@@ -213,7 +214,7 @@ namespace AMDiS ...@@ -213,7 +214,7 @@ namespace AMDiS
/// Return a pointer to the grid, \ref grid /// Return a pointer to the grid, \ref grid
std::shared_ptr<Grid> getGrid() { return grid_; } std::shared_ptr<Grid> getGrid() { return grid_; }
/// Set the mesh. Stores pointer to passed reference and initializes feSpaces /// Set the grid. Stores pointer to passed reference and initializes feSpaces
/// matrices and vectors, as well as the file-writer. /// matrices and vectors, as well as the file-writer.
void setGrid(Grid& grid) void setGrid(Grid& grid)
{ {
...@@ -247,7 +248,7 @@ namespace AMDiS ...@@ -247,7 +248,7 @@ namespace AMDiS
{ {
gridName_ = ""; gridName_ = "";
Parameters::get(name_ + "->mesh", gridName_); Parameters::get(name_ + "->mesh", gridName_);
test_exit(!gridName_.empty(), "No mesh name specified for '", name_, "->mesh'!"); test_exit(!gridName_.empty(), "No grid name specified for '", name_, "->mesh'!");
grid_ = MeshCreator<Grid>::create(gridName_); grid_ = MeshCreator<Grid>::create(gridName_);
...@@ -329,15 +330,17 @@ namespace AMDiS ...@@ -329,15 +330,17 @@ namespace AMDiS
marker.resize(nComponents); marker.resize(nComponents);
for (std::size_t i = 0; i < nComponents; i++) { for (std::size_t i = 0; i < nComponents; i++) {
marker[i] = Marker<Grid>:: //treePath =
marker[i] = Marker<Traits>:: // must use the same treePath as corresponding estimator
createMarker(name + "->marker[" + std::to_string(i) + "]", i, createMarker(name + "->marker[" + std::to_string(i) + "]", i,
estimates, componentGrids[i]); estimates[i]/*[treePath]*/, componentGrids[i]);
if (marker[i]) { if (marker[i]) {
nMarkersCreated++; nMarkersCreated++;
// If there is more than one marker, and all components are defined // If there is more than one marker, and all components are defined
// on the same mesh, the maximum marking has to be enabled. // on the same grid, the maximum marking has to be enabled.
// TODO: What about two markers each for two grids?
if (nMarkersCreated > 1 && nGrids == 1) if (nMarkersCreated > 1 && nGrids == 1)
marker[i]->setMaximumMarking(true); marker[i]->setMaximumMarking(true);
} }
...@@ -393,7 +396,7 @@ namespace AMDiS ...@@ -393,7 +396,7 @@ namespace AMDiS
/// Number of grids /// Number of grids
int nGrids = 1; int nGrids = 1;
/// Name of the mesh /// Name of the grid
std::string gridName_ = "none"; std::string gridName_ = "none";
/// FE spaces of this problem. /// FE spaces of this problem.
...@@ -404,7 +407,7 @@ namespace AMDiS ...@@ -404,7 +407,7 @@ namespace AMDiS
std::list<std::shared_ptr<FileWriterInterface>> filewriter_; std::list<std::shared_ptr<FileWriterInterface>> filewriter_;
/// Pointer to the adaptation markers /// Pointer to the adaptation markers
std::vector<Marker<Grid>* > marker; std::vector<Marker<Traits>* > marker;
/// Pointer to the estimators for this problem /// Pointer to the estimators for this problem
// std::vector<Estimator*> estimator; // std::vector<Estimator*> estimator;
...@@ -419,6 +422,7 @@ namespace AMDiS ...@@ -419,6 +422,7 @@ namespace AMDiS
std::shared_ptr<SystemVector> solution_; std::shared_ptr<SystemVector> solution_;
/// A vector with the local element error estimates /// A vector with the local element error estimates
/// reverse indexed by [component index][element index]
std::vector<std::vector<double> > estimates; std::vector<std::vector<double> > estimates;
/// A block-vector (load-vector) corresponding to the right.hand side /// A block-vector (load-vector) corresponding to the right.hand side
...@@ -431,6 +435,8 @@ namespace AMDiS ...@@ -431,6 +435,8 @@ namespace AMDiS
MatrixOperators<GlobalBasis> matrixOperators_; MatrixOperators<GlobalBasis> matrixOperators_;
VectorOperators<GlobalBasis> rhsOperators_; VectorOperators<GlobalBasis> rhsOperators_;
Constraints<GlobalBasis> constraints_; Constraints<GlobalBasis> constraints_;
// VectorData<GlobalBasis, TODO: NodeData> estimates_;
}; };
#if DUNE_HAVE_CXX_CLASS_TEMPLATE_ARGUMENT_DEDUCTION #if DUNE_HAVE_CXX_CLASS_TEMPLATE_ARGUMENT_DEDUCTION
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment