3.3.0
DUNE for Multi-{Phase, Component, Scale, Physics, ...} flow and transport in porous media
markelements.hh
Go to the documentation of this file.
1// -*- mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
2// vi: set et ts=4 sw=4 sts=4:
3/*****************************************************************************
4 * See the file COPYING for full copying permissions. *
5 * *
6 * This program is free software: you can redistribute it and/or modify *
7 * it under the terms of the GNU General Public License as published by *
8 * the Free Software Foundation, either version 3 of the License, or *
9 * (at your option) any later version. *
10 * *
11 * This program is distributed in the hope that it will be useful, *
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
14 * GNU General Public License for more details. *
15 * *
16 * You should have received a copy of the GNU General Public License *
17 * along with this program. If not, see <http://www.gnu.org/licenses/>. *
18 *****************************************************************************/
24#ifndef DUMUX_ADAPTIVE_MARKELEMENTS_HH
25#define DUMUX_ADAPTIVE_MARKELEMENTS_HH
26
27#include <dune/grid/common/rangegenerators.hh>
28
29namespace Dumux {
30
39template<class Grid, class Indicator>
40bool markElements(Grid& grid, const Indicator& indicator, bool verbose = true)
41{
42 // mark elements according to indicator
43 std::size_t refine = 0;
44 std::size_t coarsen = 0;
45 for (const auto& element : elements(grid.leafGridView(), Dune::Partitions::interior))
46 {
47 const auto mark = indicator(element);
48 if (mark > 0)
49 {
50 grid.mark(1, element);
51 ++refine;
52 }
53 else if (mark < 0)
54 {
55 grid.mark(-1, element);
56 ++coarsen;
57 }
58 }
59
60 // abort if nothing in grid is marked
61 const std::size_t sumRefine = grid.comm().sum(refine);
62 const std::size_t sumCoarsen = grid.comm().sum(coarsen);
63
64 if (grid.comm().rank() == 0 && verbose)
65 std::cout << sumRefine << " cells have been marked to be refined, "
66 << sumCoarsen << " to be coarsened." << std::endl;
67
68 // return whether or not anything has been marked
69 return sumRefine != 0 || sumCoarsen != 0;
70}
71
72} //end namespace Dumux
73
74#endif
bool markElements(Grid &grid, const Indicator &indicator, bool verbose=true)
A function to mark element for refinement or coarsening.
Definition: markelements.hh:40
Definition: adapt.hh:29