Line data Source code
1 : /*
2 : * Copyright (c) 2012-2015: G-CSC, Goethe University Frankfurt
3 : * Author: Sebastian Reiter
4 : *
5 : * This file is part of UG4.
6 : *
7 : * UG4 is free software: you can redistribute it and/or modify it under the
8 : * terms of the GNU Lesser General Public License version 3 (as published by the
9 : * Free Software Foundation) with the following additional attribution
10 : * requirements (according to LGPL/GPL v3 §7):
11 : *
12 : * (1) The following notice must be displayed in the Appropriate Legal Notices
13 : * of covered and combined works: "Based on UG4 (www.ug4.org/license)".
14 : *
15 : * (2) The following notice must be displayed at a prominent place in the
16 : * terminal output of covered works: "Based on UG4 (www.ug4.org/license)".
17 : *
18 : * (3) The following bibliography is recommended for citation and must be
19 : * preserved in all covered files:
20 : * "Reiter, S., Vogel, A., Heppner, I., Rupp, M., and Wittum, G. A massively
21 : * parallel geometric multigrid solver on hierarchically distributed grids.
22 : * Computing and visualization in science 16, 4 (2013), 151-164"
23 : * "Vogel, A., Reiter, S., Rupp, M., Nägel, A., and Wittum, G. UG4 -- a novel
24 : * flexible software system for simulating pde based models on high performance
25 : * computers. Computing and visualization in science 16, 4 (2013), 165-179"
26 : *
27 : * This program is distributed in the hope that it will be useful,
28 : * but WITHOUT ANY WARRANTY; without even the implied warranty of
29 : * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
30 : * GNU Lesser General Public License for more details.
31 : */
32 :
33 : #ifndef __H__UG__refmark_adjuster_interface__
34 : #define __H__UG__refmark_adjuster_interface__
35 :
36 : #include "refiner_interface.h"
37 : #include "common/util/smart_pointer.h"
38 :
39 : namespace ug{
40 :
41 : /// \addtogroup lib_grid_algorithms_refinement
42 : /// @{
43 :
44 : /** Used to steer the mark-adjustment process in classes derived from IRefiner.
45 : * Instances can be registered at IRefiner and are then used to mark new elements
46 : * based on already marked elements. Different specializations can thereby implement
47 : * different rules (e.g. for parallel refinement or anisotropic refinement).
48 : * The different specialization should be constructed orthogonal to each other,
49 : * so that they can be chained.
50 : *
51 : * The callback-methods 'ref_marks_changed' and 'coarsen_marks_changed' are called
52 : * with lists of elements which have been marked since the last adjustment-round.
53 : * The callbacks can then use IRefiner::mark to adjust marks as required.
54 : * If a callback changes a ref-mark on an element,
55 : * this will automatically trigger a new round of adjustments
56 : * (then only considering elements which have been marked in the current round).
57 : *
58 : * Adjustment normally stops as soon as no adjuster marked any new elements.
59 : */
60 : class IRefMarkAdjuster
61 : {
62 : public:
63 0 : IRefMarkAdjuster() :
64 0 : m_enabled(true),
65 0 : m_nodeDependencyOrder1(true)
66 : {}
67 :
68 0 : virtual ~IRefMarkAdjuster() {}
69 :
70 0 : virtual void ref_marks_changed(IRefiner& ref,
71 : const std::vector<Vertex*>& vrts,
72 : const std::vector<Edge*>& edges,
73 : const std::vector<Face*>& faces,
74 : const std::vector<Volume*>& vols)
75 0 : {}
76 :
77 0 : virtual void coarsen_marks_changed(IRefiner& ref,
78 : const std::vector<Vertex*>& vrts,
79 : const std::vector<Edge*>& edges,
80 : const std::vector<Face*>& faces,
81 : const std::vector<Volume*>& vols)
82 0 : {return;}
83 :
84 0 : virtual void enable(bool enable) {m_enabled = enable;}
85 0 : virtual bool enabled() const {return m_enabled;}
86 :
87 : /// enables or disables node-dependency-order-1.
88 : /** \{
89 : * If enabled, hanging nodes may only depend on non-hanging nodes.
90 : * An edge containing a hanging node thus will not have a hanging-node
91 : * as a corner vertex.
92 : *
93 : * Enabled by default.*/
94 0 : void enable_node_dependency_order_1(bool bEnable) {m_nodeDependencyOrder1 = bEnable;}
95 0 : bool node_dependency_order_1_enabled() {return m_nodeDependencyOrder1;}
96 : /** \} */
97 :
98 : private:
99 : bool m_enabled;
100 : bool m_nodeDependencyOrder1;
101 : };
102 :
103 : typedef SmartPtr<IRefMarkAdjuster> SPIRefMarkAdjuster;
104 :
105 : /// @}
106 :
107 : }// end of namespace
108 :
109 : #endif
|