ug4
ug::AdaptiveRegularRefiner_MultiGrid Class Reference

Specialization of IRefiner for adaptive multigrid refinement with closure. More...

#include <adaptive_regular_mg_refiner.h>

+ Inheritance diagram for ug::AdaptiveRegularRefiner_MultiGrid:

Public Types

typedef HangingNodeRefiner_MultiGrid BaseClass
 
- Public Types inherited from ug::HangingNodeRefiner_MultiGrid
typedef HangingNodeRefinerBase< MGSelectorBaseClass
 
enum  HNodeCoarsenMarks {
  HNCM_FIRST = HNRM_MAX + 1 , HNCM_NO_NBRS , HNCM_NONE , HNCM_PARTIAL ,
  HNCM_REPLACE , HNCM_ALL , HNCM_INVALID , HNCM_UNKNOWN
}
 
- Public Types inherited from ug::HangingNodeRefinerBase< MGSelector >
enum  HNodeRefMarks
 
typedef MGSelector selector_t
 

Public Member Functions

 AdaptiveRegularRefiner_MultiGrid (MultiGrid &mg, SPRefinementProjector projector=SPNULL)
 
 AdaptiveRegularRefiner_MultiGrid (SPRefinementProjector projector=SPNULL)
 
virtual void assign_grid (MultiGrid &mg)
 
virtual ~AdaptiveRegularRefiner_MultiGrid ()
 
- Public Member Functions inherited from ug::HangingNodeRefiner_MultiGrid
virtual bool adaptivity_supported () const
 returns whether the refiner is able to perform adaptive refinement More...
 
virtual bool coarsening_supported () const
 returns true, if the refiner supports coarsening. More...
 
virtual Gridget_associated_grid ()
 DEPRECIATED! Use grid(). Has to return the associated grid. Pure virtual. More...
 
virtual Gridgrid ()
 Returns the grid associated with the refiner. More...
 
virtual void grid_to_be_destroyed (Grid *grid)
 
 HangingNodeRefiner_MultiGrid (MultiGrid &mg, SPRefinementProjector projector=SPNULL)
 
 HangingNodeRefiner_MultiGrid (SPRefinementProjector projector=SPNULL)
 
virtual MultiGridmulti_grid ()
 
virtual ~HangingNodeRefiner_MultiGrid ()
 
- Public Member Functions inherited from ug::HangingNodeRefinerBase< MGSelector >
void add_ref_mark_adjuster (SPIRefMarkAdjuster adjuster)
 Add a refmark adjuster, which will be called while marks are adjusted during refinement / coarsening. More...
 
virtual void clear_marks ()
 clears all marks. Default implementation is empty More...
 
 HangingNodeRefinerBase (SPRefinementProjector projector=SPNULL)
 
void mark (const TIterator &iterBegin, const TIterator &iterEnd, RefinementMark refMark=RM_REFINE)
 marks all elements between iterBegin and iterEnd. More...
 
virtual bool mark (Edge *e, RefinementMark refMark=RM_REFINE)
 
virtual bool mark (Face *f, RefinementMark refMark=RM_REFINE)
 
virtual bool mark (GridObject *o, RefinementMark refMark=RM_REFINE)
 marks the specified geometric object More...
 
virtual bool mark (Vertex *v, RefinementMark refMark=RM_REFINE)
 Marks an element for refinement. Default implementation is empty. More...
 
virtual bool mark (Volume *v, RefinementMark refMark=RM_REFINE)
 
virtual void mark_neighborhood (size_t numIterations, RefinementMark refMark, bool sideNbrsOnly)
 Marks the neighborhood of the current selection. More...
 
bool marked_adaptive (TElem *elem) const
 
bool marked_coarsen (TElem *elem) const
 
bool marked_refine (Edge *elem) const
 
bool marked_refine (TElem *elem) const
 
bool marked_regular (TElem *elem) const
 
virtual bool save_marks_to_file (const char *filename)
 Writes the associated grid and marks to a file. Pure virtual. More...
 
virtual ~HangingNodeRefinerBase ()
 
void enable_node_dependency_order_1 (bool bEnable)
 enables or disables node-dependency-order-1. More...
 
bool node_dependency_order_1_enabled ()
 enables or disables node-dependency-order-1. More...
 
virtual bool mark (Vertex *v, RefinementMark refMark=RM_REFINE)
 Marks a element for refinement. More...
 
virtual bool mark (Edge *e, RefinementMark refMark=RM_REFINE)
 Marks a element for refinement. More...
 
virtual bool mark (Face *f, RefinementMark refMark=RM_REFINE)
 Marks a element for refinement. More...
 
virtual bool mark (Volume *v, RefinementMark refMark=RM_REFINE)
 Marks a element for refinement. More...
 
virtual RefinementMark get_mark (Vertex *v) const
 Returns the mark of a given element. More...
 
virtual RefinementMark get_mark (Edge *e) const
 Returns the mark of a given element. More...
 
virtual RefinementMark get_mark (Face *f) const
 Returns the mark of a given element. More...
 
virtual RefinementMark get_mark (Volume *v) const
 Returns the mark of a given element. More...
 
- Public Member Functions inherited from ug::IRefiner
bool coarsen ()
 Performs coarsening on the elements marked RM_COARSEN. More...
 
bool debugging_enabled () const
 
void enable_debugging (bool enable)
 
int get_local_edge_mark (Face *f, Edge *e) const
 returns the local mark of the specified edge of the given face More...
 
int get_local_edge_mark (Volume *vol, Edge *e) const
 returns the local mark of the specified edge of the given volume More...
 
int get_local_face_mark (Volume *vol, Face *f) const
 returns the local mark of the specified face of the given volume More...
 
virtual RefinementMark get_mark (GridObject *o) const
 returns the mark of the specified geometric object More...
 
 IRefiner (SPRefinementProjector projector=SPNULL)
 
virtual bool local_marks_supported () const
 returns true, if the refiner supports local marks. More...
 
template<class TIterator >
void mark (const TIterator &iterBegin, const TIterator &iterEnd, RefinementMark refMark=RM_REFINE)
 marks all elements between iterBegin and iterEnd. More...
 
virtual bool mark (GridObject *o, RefinementMark refMark=RM_REFINE)
 marks the specified geometric object More...
 
void mark_neighborhood (size_t numIterations)
 marks the neighborhood of currently marked elements. More...
 
template<class TElem >
bool marked_closure (TElem *elem) const
 
template<class TElem >
bool marked_full (TElem *elem) const
 
template<class TElem >
bool marked_local (TElem *elem) const
 
size_t num_marked_edges ()
 returns the number of (globally) marked edges on all levels of the hierarchy More...
 
size_t num_marked_edges (std::vector< int > &numMarkedEdgesOut)
 returns the number of (globally) marked edges on all levels of the hierarchy More...
 
size_t num_marked_elements ()
 returns the number of (globally) marked grid-objects of highest dimension More...
 
size_t num_marked_elements (std::vector< int > &numMarkedElemsOut)
 returns the number of (globally) marked grid-objects of highest dimension More...
 
size_t num_marked_faces ()
 returns the number of (globally) marked faces on all levels of the hierarchy More...
 
size_t num_marked_faces (std::vector< int > &numMarkedFacesOut)
 returns the number of (globally) marked faces on all levels of the hierarchy More...
 
size_t num_marked_volumes ()
 returns the number of (globally) marked volumes on all levels of the hierarchy More...
 
size_t num_marked_volumes (std::vector< int > &numMarkedVolsOut)
 returns the number of (globally) marked volumes on all levels of the hierarchy More...
 
SPRefinementProjector projector ()
 
void refine ()
 Performs refinement on the marked elements. More...
 
void set_adjusted_marks_debug_filename (const char *filename)
 sets a filename to which adjusted marks are saved during refinement / coarsening More...
 
void set_projector (SPRefinementProjector projector)
 
virtual ~IRefiner ()
 
virtual void mark_local (Face *e, int mark)
 Marks a face or volume for local refinement. More...
 
virtual void mark_local (Volume *e, int mark)
 Marks a face or volume for local refinement. More...
 
virtual int get_local_mark (Face *e) const
 returns the local mark of the specified face or volume. More...
 
virtual int get_local_mark (Volume *e) const
 returns the local mark of the specified face or volume. More...
 
void adaption_begins ()
 notifies all listeners of the associated message-hub, that adaption begins / ends. More...
 
void adaption_ends ()
 notifies all listeners of the associated message-hub, that adaption begins / ends. More...
 
- Public Member Functions inherited from ug::GridObserver
virtual void elements_to_be_cleared (Grid *grid)
 
virtual ~GridObserver ()
 
virtual void vertex_created (Grid *grid, Vertex *vrt, GridObject *pParent=NULL, bool replacesParent=false)
 Notified whenever a new element of the given type is created in the given grid. More...
 
virtual void edge_created (Grid *grid, Edge *e, GridObject *pParent=NULL, bool replacesParent=false)
 Notified whenever a new element of the given type is created in the given grid. More...
 
virtual void face_created (Grid *grid, Face *f, GridObject *pParent=NULL, bool replacesParent=false)
 Notified whenever a new element of the given type is created in the given grid. More...
 
virtual void volume_created (Grid *grid, Volume *vol, GridObject *pParent=NULL, bool replacesParent=false)
 Notified whenever a new element of the given type is created in the given grid. More...
 
virtual void vertex_to_be_erased (Grid *grid, Vertex *vrt, Vertex *replacedBy=NULL)
 Notified whenever an element of the given type is erased from the given grid. More...
 
virtual void edge_to_be_erased (Grid *grid, Edge *e, Edge *replacedBy=NULL)
 Notified whenever an element of the given type is erased from the given grid. More...
 
virtual void face_to_be_erased (Grid *grid, Face *f, Face *replacedBy=NULL)
 Notified whenever an element of the given type is erased from the given grid. More...
 
virtual void volume_to_be_erased (Grid *grid, Volume *vol, Volume *replacedBy=NULL)
 Notified whenever an element of the given type is erased from the given grid. More...
 
virtual void vertices_to_be_merged (Grid *grid, Vertex *target, Vertex *elem1, Vertex *elem2)
 Notified when two elements of the same type are going to be merged. More...
 
virtual void edges_to_be_merged (Grid *grid, Edge *target, Edge *elem1, Edge *elem2)
 Notified when two elements of the same type are going to be merged. More...
 
virtual void faces_to_be_merged (Grid *grid, Face *target, Face *elem1, Face *elem2)
 Notified when two elements of the same type are going to be merged. More...
 
virtual void volumes_to_be_merged (Grid *grid, Volume *target, Volume *elem1, Volume *elem2)
 Notified when two elements of the same type are going to be merged. More...
 

Protected Member Functions

void create_closure_elements ()
 calls create_closure_elements_2d / 3d, depending on the presence of volume elements. More...
 
void create_closure_elements_2d ()
 creates closure elements for 2d geometries More...
 
void create_closure_elements_3d ()
 creates closure elements for 3d geometries More...
 
template<class TElem >
void get_parents_of_marked_closure_elements (std::vector< GridObject * > &parents, Selector::status_t mark)
 collects parents of all closure elements which share a value with the given mark. More...
 
virtual bool perform_coarsening ()
 removes all closure elements, calls the base implementation and creates a new closure More...
 
virtual void perform_refinement ()
 removes all closure elements, calls the base implementation and creates a new closure More...
 
void remove_closure_elements ()
 remove closure elements More...
 
void set_grid (MultiGrid *mg)
 performs registration and deregistration at a grid. More...
 
- Protected Member Functions inherited from ug::HangingNodeRefiner_MultiGrid
virtual void assign_hnode_marks ()
 
virtual void broadcast_marks_horizontally (bool vertices, bool edges, bool faces, bool allowDeselection=false)
 
virtual void broadcast_marks_vertically (bool vertices, bool edges, bool faces, bool volumes, bool allowDeselection=false)
 
virtual bool contains_edges ()
 called to check, whether another iteration of collect_objects_for_coarsen has to be performed. More...
 
virtual bool contains_faces ()
 allows to check whether a distributed grid contains faces More...
 
virtual bool contains_volumes ()
 allows to check whether a distributed grid contains volumes More...
 
virtual void copy_marks_to_vmasters (bool vertices, bool edges, bool faces, bool volumes)
 
virtual void copy_marks_to_vslaves (bool vertices, bool edges, bool faces, bool volumes)
 
void debug_save (ISelector &sel, const char *filename)
 temporary method, which will be removed when debugging is done. More...
 
virtual void num_marked_edges_local (std::vector< int > &numMarkedEdgesOut)
 returns the number of (globally) marked edges on this level of the hierarchy More...
 
template<class TElem >
void num_marked_elems (std::vector< int > &numMarkedElemsOut)
 
virtual void num_marked_faces_local (std::vector< int > &numMarkedFacesOut)
 returns the number of (globally) marked faces on this level of the hierarchy More...
 
virtual void num_marked_volumes_local (std::vector< int > &numMarkedVolsOut)
 returns the number of (globally) marked volumes on this level of the hierarchy More...
 
virtual bool one_proc_true (bool localProcTrue)
 
virtual void post_coarsen ()
 called after elements have been removed in coarsening More...
 
virtual void pre_coarsen ()
 called before elements are removed in coarsening More...
 
virtual void pre_refine ()
 creates required vertices in higher levels. More...
 
virtual bool refinement_is_allowed (Edge *elem)
 a callback that allows to deny refinement of special edges More...
 
virtual bool refinement_is_allowed (Face *elem)
 a callback that allows to deny refinement of special faces More...
 
virtual bool refinement_is_allowed (Vertex *elem)
 a callback that allows to deny refinement of special vertices More...
 
virtual bool refinement_is_allowed (Volume *elem)
 a callback that allows to deny refinement of special volumes More...
 
void save_coarsen_marks_to_file (ISelector &sel, const char *filename)
 
void set_grid (MultiGrid *mg)
 performs registration and deregistration at a grid. More...
 
virtual void process_constraining_edge (ConstrainingEdge *cge)
 calls base implementation and replaces cge with a normal edge. More...
 
virtual void refine_edge_with_normal_vertex (Edge *e, Vertex **newCornerVrts=NULL)
 calls base implementation and replaces cge with a normal edge. More...
 
virtual void refine_edge_with_hanging_vertex (Edge *e, Vertex **newCornerVrts=NULL)
 calls base implementation and replaces cge with a normal edge. More...
 
virtual void refine_face_with_normal_vertex (Face *f, Vertex **newCornerVrts=NULL)
 calls base implementation and replaces cge with a normal edge. More...
 
virtual void refine_face_with_hanging_vertex (Face *f, Vertex **newCornerVrts=NULL)
 calls base implementation and replaces cge with a normal edge. More...
 
virtual void refine_volume_with_normal_vertex (Volume *v, Vertex **newVolumeVrts=NULL)
 calls base implementation and replaces cge with a normal edge. More...
 
virtual Vertexget_center_vertex (Edge *e)
 Returns the vertex associated with the edge. More...
 
virtual void set_center_vertex (Edge *e, Vertex *v)
 Associates a vertex with the edge. More...
 
virtual Vertexget_center_vertex (Face *f)
 Returns the vertex associated with the face. More...
 
virtual void set_center_vertex (Face *f, Vertex *v)
 Associates a vertex with the face. More...
 
template<class TElem >
void collect_child_corners (std::vector< Vertex * > &cornersOut, TElem *elem)
 collects corner vertices and fills them into the associated vector More...
 
virtual void restrict_selection_to_surface_coarsen_elements ()
 Makes sure that only surface elements are marked and that only coarsen marks are used. More...
 
virtual void restrict_selection_to_coarsen_families ()
 Deselects all elements which have an unselected sibling. More...
 
template<class TElem >
void restrict_selection_to_surface_coarsen_elements ()
 Deselects all non-surface elements and all elements not marked with RM_COARSEN. More...
 
template<class TElem >
void restrict_selection_to_coarsen_families ()
 Only complete families (all siblings are selected) may be coarsened. More...
 
virtual void collect_objects_for_coarsen (bool scheduleCoarseningBeginsMessage=false)
 adjusts the selection marks to those specified in HNodeCoarsenMarks. More...
 
- Protected Member Functions inherited from ug::HangingNodeRefinerBase< MGSelector >
void add_hmark (TElem *elem, HNodeRefMarks mark)
 
bool adjusting_ref_marks () const
 
virtual void collect_objects_for_refine ()
 marks unmarked elements that have to be refined due to marked neighbors. More...
 
virtual bool continue_collect_objects_for_refine (bool continueRequired)
 
MGSelectorget_refmark_selector ()
 returns the selector which is internally used to mark elements. More...
 
bool is_marked (Edge *e)
 
bool is_marked (Face *f)
 
bool is_marked (Vertex *v)
 
bool is_marked (Volume *v)
 
bool marked_to_constrained (TElem *elem) const
 
bool marked_to_constraining (TElem *elem) const
 
bool marked_to_normal (TElem *elem) const
 
void perform_refinement ()
 performs refinement on the marked elements. More...
 
virtual void post_refine ()
 
bool remove_coarsen_marks ()
 removes coarsen marks from the selection More...
 
void remove_hmark (TElem *elem, uint mark)
 
void set_grid (typename TSelector::grid_type *grid)
 performs registration and deregistration at a grid. More...
 
virtual void process_constrained_vertex (ConstrainedVertex *cdv)
 called to refine the specified element. More...
 
virtual void process_constrained_edge (ConstrainedEdge *cde)
 called to refine the specified element. More...
 
virtual void process_constrained_face (ConstrainedFace *cdf)
 called to refine the specified element. More...
 
virtual void process_constraining_face (ConstrainingFace *cgf)
 called to refine the specified element. More...
 
- Protected Member Functions inherited from ug::IRefiner
void set_message_hub (SPMessageHub msgHub)
 sets the message hub. More...
 

Protected Attributes

Selector m_closureElems
 
- Protected Attributes inherited from ug::HangingNodeRefinerBase< MGSelector >
std::vector< SPIRefMarkAdjusterm_refMarkAdjusters
 
MGSelector m_selMarkedElements
 
- Protected Attributes inherited from ug::IRefiner
bool m_adaptionIsActive
 
std::string m_adjustedMarksDebugFilename
 
bool m_debuggingEnabled
 
SPMessageHub m_messageHub
 
int m_msgIdAdaption
 
SPRefinementProjector m_projector
 

Additional Inherited Members

- Protected Types inherited from ug::HangingNodeRefinerBase< MGSelector >
typedef TSelector::template traits< Edge >::iterator sel_edge_iter
 
typedef TSelector::template traits< Face >::iterator sel_face_iter
 
typedef TSelector::template traits< Volume >::iterator sel_vol_iter
 
typedef TSelector::template traits< Vertex >::iterator sel_vrt_iter
 

Detailed Description

Specialization of IRefiner for adaptive multigrid refinement with closure.

The implementation is based on HangingNodeRefiner_MultiGrid. Hanging nodes are most likely present in the resulting grids, even though they should not be used by discretizations etc. Their sole purpose is to allow efficient grid adaption

Todo:
The current implementation has a performance overhead, since currently all closure elements are removed prior to grid adaption. This should be reduced to only remove closure elements which are affected by adaption. One could therefore replace Selector by BoolMarker and adjust the collect_objects_for_refinement / coarsening routines to use callbacks when identifying valid refine / coarsen objects.

Member Typedef Documentation

◆ BaseClass

Constructor & Destructor Documentation

◆ AdaptiveRegularRefiner_MultiGrid() [1/2]

ug::AdaptiveRegularRefiner_MultiGrid::AdaptiveRegularRefiner_MultiGrid ( SPRefinementProjector  projector = SPNULL)

◆ AdaptiveRegularRefiner_MultiGrid() [2/2]

ug::AdaptiveRegularRefiner_MultiGrid::AdaptiveRegularRefiner_MultiGrid ( MultiGrid mg,
SPRefinementProjector  projector = SPNULL 
)

References set_grid().

◆ ~AdaptiveRegularRefiner_MultiGrid()

ug::AdaptiveRegularRefiner_MultiGrid::~AdaptiveRegularRefiner_MultiGrid ( )
virtual

Member Function Documentation

◆ assign_grid()

void ug::AdaptiveRegularRefiner_MultiGrid::assign_grid ( MultiGrid mg)
virtual

Reimplemented from ug::HangingNodeRefiner_MultiGrid.

References set_grid().

◆ create_closure_elements()

void ug::AdaptiveRegularRefiner_MultiGrid::create_closure_elements ( )
protected

calls create_closure_elements_2d / 3d, depending on the presence of volume elements.

References create_closure_elements_2d(), create_closure_elements_3d(), ug::HangingNodeRefiner_MultiGrid::multi_grid(), ug::MultiGrid::num(), and UG_THROW.

Referenced by perform_coarsening(), and perform_refinement().

◆ create_closure_elements_2d()

◆ create_closure_elements_3d()

◆ get_parents_of_marked_closure_elements()

template<class TElem >
void ug::AdaptiveRegularRefiner_MultiGrid::get_parents_of_marked_closure_elements ( std::vector< GridObject * > &  parents,
Selector::status_t  mark 
)
protected

collects parents of all closure elements which share a value with the given mark.

Note that the parents container is not cleared. The method may thus be called multiple times. If a parent is a closure element (which shouldn't be the case) it won't be added to the container. Note that a parent may be added multiple times to the parents container.

References ug::MGSelector::begin(), ug::MGSelector::end(), ug::HangingNodeRefinerBase< MGSelector >::get_mark(), ug::MultiGrid::get_parent(), ug::ISelector::is_selected(), m_closureElems, ug::HangingNodeRefinerBase< MGSelector >::m_selMarkedElements, ug::HangingNodeRefinerBase< MGSelector >::mark(), ug::HangingNodeRefiner_MultiGrid::multi_grid(), and UG_ASSERT.

◆ perform_coarsening()

bool ug::AdaptiveRegularRefiner_MultiGrid::perform_coarsening ( )
protectedvirtual

removes all closure elements, calls the base implementation and creates a new closure

Reimplemented from ug::HangingNodeRefiner_MultiGrid.

References create_closure_elements(), ug::HangingNodeRefiner_MultiGrid::perform_coarsening(), and remove_closure_elements().

◆ perform_refinement()

void ug::AdaptiveRegularRefiner_MultiGrid::perform_refinement ( )
protectedvirtual

◆ remove_closure_elements()

void ug::AdaptiveRegularRefiner_MultiGrid::remove_closure_elements ( )
protected

◆ set_grid()

void ug::AdaptiveRegularRefiner_MultiGrid::set_grid ( MultiGrid mg)
protected

performs registration and deregistration at a grid.

Initializes all grid related variables. call set_grid(NULL) to unregister the observer from a grid.

Please note that though the base grid features a set_grid method, it is not declared virtual. This is because we want to call it during construction and destruction.

References ug::Selector::assign_grid(), ug::ISelector::enable_autoselection(), ug::ISelector::enable_selection_inheritance(), ug::ISelector::enable_strict_inheritance(), m_closureElems, and ug::HangingNodeRefiner_MultiGrid::set_grid().

Referenced by AdaptiveRegularRefiner_MultiGrid(), and assign_grid().

Member Data Documentation

◆ m_closureElems

Selector ug::AdaptiveRegularRefiner_MultiGrid::m_closureElems
protected

The documentation for this class was generated from the following files: