ug4
|
Specialization of IRefiner for adaptive multigrid refinement with closure. More...
#include <adaptive_regular_mg_refiner.h>
Public Types | |
typedef HangingNodeRefiner_MultiGrid | BaseClass |
Public Types inherited from ug::HangingNodeRefiner_MultiGrid | |
typedef HangingNodeRefinerBase< MGSelector > | BaseClass |
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 Grid * | get_associated_grid () |
DEPRECIATED! Use grid(). Has to return the associated grid. Pure virtual. More... | |
virtual Grid * | grid () |
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 MultiGrid * | multi_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 Vertex * | get_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 Vertex * | get_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) |
MGSelector & | get_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< SPIRefMarkAdjuster > | m_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 |
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
ug::AdaptiveRegularRefiner_MultiGrid::AdaptiveRegularRefiner_MultiGrid | ( | SPRefinementProjector | projector = SPNULL | ) |
ug::AdaptiveRegularRefiner_MultiGrid::AdaptiveRegularRefiner_MultiGrid | ( | MultiGrid & | mg, |
SPRefinementProjector | projector = SPNULL |
||
) |
References set_grid().
|
virtual |
|
virtual |
Reimplemented from ug::HangingNodeRefiner_MultiGrid.
References set_grid().
|
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().
|
protected |
creates closure elements for 2d geometries
References ug::Grid::associated_elements(), ug::Grid::associated_elements_sorted(), ug::MultiGrid::begin(), ug::PointerConstArray< TPtr >::clear(), ug::MultiGrid::create(), ug::ISelector::enable_autoselection(), ug::MultiGrid::end(), ug::MultiGrid::get_child_vertex(), ug::MultiGrid::has_children(), m_closureElems, ug::IRefiner::m_projector, ug::HangingNodeRefiner_MultiGrid::multi_grid(), ug::FaceVertices::num_vertices(), ug::Face::refine(), ug::Grid::register_element(), remove_closure_elements(), ug::EdgeDescriptor::set_vertices(), ug::PointerConstArray< TPtr >::size(), UG_THROW, SmartPtr< T, FreePolicy >::valid(), ug::EdgeVertices::vertex(), and ug::FaceVertices::vertices().
Referenced by create_closure_elements().
|
protected |
creates closure elements for 3d geometries
References ug::Grid::associated_elements(), ug::Grid::associated_elements_sorted(), ug::MultiGrid::begin(), ug::PointerConstArray< TPtr >::clear(), ug::MultiGrid::create(), ug::ISelector::enable_autoselection(), ug::MultiGrid::end(), ug::MultiGrid::get_child_vertex(), ug::MultiGrid::has_children(), m_closureElems, ug::IRefiner::m_projector, ug::HangingNodeRefiner_MultiGrid::multi_grid(), ug::FaceVertices::num_vertices(), ug::VolumeVertices::num_vertices(), ug::PointerConstArray< TPtr >::push_back(), ug::Face::refine(), ug::Volume::refine(), ug::Grid::register_element(), remove_closure_elements(), ug::EdgeDescriptor::set_vertices(), ug::PointerConstArray< TPtr >::size(), UG_THROW, SmartPtr< T, FreePolicy >::valid(), ug::EdgeVertices::vertex(), ug::FaceVertices::vertex(), ug::FaceVertices::vertices(), and ug::VolumeVertices::vertices().
Referenced by create_closure_elements().
|
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.
|
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().
|
protectedvirtual |
removes all closure elements, calls the base implementation and creates a new closure
Implements ug::IRefiner.
References create_closure_elements(), ug::HangingNodeRefinerBase< MGSelector >::mark(), ug::HangingNodeRefinerBase< MGSelector >::perform_refinement(), remove_closure_elements(), ug::RM_ANISOTROPIC, and ug::RM_REFINE.
|
protected |
remove closure elements
References ug::EraseSelectedObjects(), m_closureElems, ug::HangingNodeRefiner_MultiGrid::multi_grid(), and UG_THROW.
Referenced by create_closure_elements_2d(), create_closure_elements_3d(), perform_coarsening(), and perform_refinement().
|
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().
|
protected |