Hermes2D
3.0

This class characterizes a neighborhood of a given edge in terms of adjacent elements and provides methods for getting limit values of discontinuous functions from both sides of the edge. More...
#include "src/neighbor_search.h"
Classes  
class  ExtendedShapeset 
class  NeighborEdgeInfo 
Structure containing all the needed information about the active edge from the neighbor's side. More...  
class  Transformations 
Transformations of an element to one of its neighbors. More...  
Public Member Functions  
NeighborSearch (Element *el, MeshSharedPtr mesh)  
NeighborSearch (const NeighborSearch &ns)  
~NeighborSearch ()  
Destructor.  
void  free () 
void  set_active_edge (int edge) 
bool  set_active_edge_multimesh (const int &edge) 
Enhancement of set_active_edge for multimesh assembling.  
std::vector< unsigned int >  get_transforms (uint64_t sub_idx) const 
Extract transformations in the correct direction from the provided sub_idx.  
bool  is_inter_edge (const int &edge, const std::vector< unsigned int > &transformations) const 
Gives an info if edge is an intra or inter element edge.  
void  update_according_to_sub_idx (const std::vector< unsigned int > &transformations) 
Update according to the subelement mapping of the central element.  
void  handle_sub_idx_way_down (const std::vector< unsigned int > &transformations) 
Special function for handling subelement transformations in the case of more than one neighboring active elements.  
bool  compatible_transformations (unsigned int a, unsigned int b, int edge) const 
void  clear_initial_sub_idx () 
void  delete_neighbor (unsigned int position) 
In case we determine a neighbor is not correct due to a subelement mapping, we delete it.  
DiscontinuousFunc< Scalar > *  init_ext_fn (MeshFunction< Scalar > *fu) 
ExtendedShapeset *  create_extended_asmlist (SpaceSharedPtr< Scalar > space, AsmList< Scalar > *al) 
ExtendedShapeset *  create_extended_asmlist_multicomponent (SpaceSharedPtr< Scalar > space, AsmList< Scalar > *al) 
void  set_quad_order (int order) 
int  get_quad_eo (bool on_neighbor=false) const 
int  get_num_neighbors () const 
const std::vector< Element * > *  get_neighbors () const 
void  clear_supported_shapes () 
Frees the memory occupied by the extended shapeset.  
void  set_ignore_errors (bool value) 
Function that sets the variable ignore_errors. See the variable description.  
int  get_active_segment () const 
Returns the current active segment.  
void  set_active_segment (unsigned int index) 
Sets the active segment, neighbor element, and neighbor edge accordingly.  
Element *  get_neighb_el () const 
Returns the current neighbor element according to the current active segment.  
NeighborEdgeInfo  get_neighbor_edge () const 
Returns the current active neighbor edge according to the current active segment.  
unsigned int  get_central_n_trans (unsigned int index) const 
Returns the number(depth) of the current central transformation according to the current active segment.  
unsigned int  get_central_transformations (unsigned int index_1, unsigned int index_2) const 
Returns the current central transformations according to the current active segment.  
unsigned int  get_neighbor_n_trans (unsigned int index) const 
Returns the number(depth) of the current neighbor transformation according to the current active segment.  
unsigned int  get_neighbor_transformations (unsigned int index_1, unsigned int index_2) const 
Returns the current neighbor transformations according to the current active segment.  
void  add_central_transformations (Transformations *to_add, int position, bool replace=false) 
void  add_neighbor_transformations (Transformations *to_add, int position, bool replace=false) 
Public Attributes  
ExtendedShapeset *  supported_shapes 
Object allowing to set/get a particular shape function from the extended. More...  
bool  ignore_errors 
MeshSharedPtr  mesh 
Transformations **  central_transformations 
Array of transformations of the central element to each neighbor. More...  
unsigned int  central_transformations_size 
unsigned int  central_transformations_alloc_size 
Transformations **  neighbor_transformations 
Array of transformations of the neighbor to the central element (goup).  
unsigned int  neighbor_transformations_size 
unsigned int  neighbor_transformations_alloc_size 
uint64_t  original_central_el_transform 
Subelement transformation of any function that comes from the. More...  
Element *  central_el 
Central (currently assembled) element.  
Element *  neighb_el 
Currently selected neighbor element (on the other side of active segment).  
Static Public Attributes  
static const unsigned int  H2D_INITIAL_NEIGHBOR_NUMBER_GUESS = 32 
This class characterizes a neighborhood of a given edge in terms of adjacent elements and provides methods for getting limit values of discontinuous functions from both sides of the edge.
Each instance of the class is connected to a mesh and its active element. The active element becomes the central element of the neighborhood and all adjacent elements the neighbors .
In order to search for the neighboring elements, one selects a particular edge of the central element and calls the method set_active_edge
. This enumerates the neighbors and fills in the array transformations
, which will be needed later for getting function values at matching points from both sides of the selected (active) edge.
The actual procedure depends on the relative size of the central element with respect to the neighbor element(s) across the active edge:
Element::get_neighbor
is used to retrieve pointer to the neighboring element. Moreover, no transformations are needed to obtain values of any given function from either side of active edge.transformations
array. These transformations will have to be pushed to a function on the neighboring (bigger) element in order to obtain values at points matching those from the central element's side.transformations
. This way, we obtain for each neighbor a set of transformations which have to be applied on the central element to transform integration points to its correct part matching the neighbor.There may be either one or more neighbors (see below). In the second case, each of the neighbors shares with the central element a unique segment of the active edge. The next step is therefore a loop through all neighbors, setting the appropriate active segment through set_active_segment
at the beginning of every iteration. This also handles the "godown" transformations of the attached central element's pss and creates a pss on the neighbor element for use in evaluating discontinuous bilinear forms (see below).
If only external functions are supposed to be discontinuous across the active edge (e.g. in the case of linear forms), the init_ext_fn
methods may now be used to create pointers to new DiscontinuousFunc
objects  first to one used for evaluating integration order and then, after computing the quadrature order for given form and setting it via set_quad_order
, to that with the actual values at the matching integration points from both sides of the active segment.
If also the test functions need to be considered discontinuous (e.g when assembling DG bilinear forms), the local precalculated shapesets on the central element (attached from the assembling procedure) and on the current neighbor element are extended by zero to the whole neighborhood of the two elements (see create_extended_shapeset
). A socalled extended shapeset thus created is stored in the variable supported_shapes
and may be queried for the count of all contained extended shapes and their global DOF numbers. Assembling is done over all shape functions from the extended shapes. The user gets a pointer to the current extended shape function by calling supported_shapes.get_extended_shape_fn
and may use it then to obtain DiscontinuousFunc
objects with the shape function's order/values on both sides of active edge as in the previous case of external functions.
Definition at line 27 of file error_thread_calculator.h.
Hermes::Hermes2D::NeighborSearch< Scalar >::NeighborSearch  (  Element *  el, 
MeshSharedPtr  mesh  
) 
Constructor.
[in]  el  Central element of the neighborhood (current active element in the assembling procedure). 
[in]  mesh  Mesh on which we search for the neighbors. 
Definition at line 24 of file neighbor_search.cpp.
void Hermes::Hermes2D::NeighborSearch< Scalar >::clear_initial_sub_idx  (  ) 
Clear the initial_sub_idxs from the central element transformations of NeighborSearches with multiple neighbors. Does nothing in the opposite case.
Definition at line 555 of file neighbor_search.cpp.
Referenced by Hermes::Hermes2D::ErrorThreadCalculator< Scalar >::DGErrorCalculator::init_neighbors().
bool Hermes::Hermes2D::NeighborSearch< Scalar >::compatible_transformations  (  unsigned int  a, 
unsigned int  b,  
int  edge  
)  const 
Give the info if the two transformations are correct, w.r.t. the edge. Simply compares a to b in case of triangles, does more work in case of quads.
Definition at line 515 of file neighbor_search.cpp.
NeighborSearch< Scalar >::ExtendedShapeset * Hermes::Hermes2D::NeighborSearch< Scalar >::create_extended_asmlist  (  SpaceSharedPtr< Scalar >  space, 
AsmList< Scalar > *  al  
) 
Form the extended shapeset.
Initializes the class attribute supported_shapes
for the first time and updates it whenever the active segment or edge change. The extended shapeset consists of shape functions from both the central element and current neighbor element, extended by zero to the union of these elements.
[in]  space  Space from which the local shapesets are drawn. 
[in]  al  Assembly list for the central element. 
Definition at line 916 of file neighbor_search.cpp.
const std::vector< Element * > * Hermes::Hermes2D::NeighborSearch< Scalar >::get_neighbors  (  )  const 
Retrieve all neighbor elements.
Definition at line 128 of file neighbor_search.cpp.
int Hermes::Hermes2D::NeighborSearch< Scalar >::get_num_neighbors  (  )  const 
Return the number of elements (neighbors) adjacent to the central element across the common (active) edge.
Definition at line 122 of file neighbor_search.cpp.
Referenced by Hermes::Hermes2D::EggShell::get_egg_shell().
int Hermes::Hermes2D::NeighborSearch< Scalar >::get_quad_eo  (  bool  on_neighbor = false  )  const 
Get the integration pseudoorder for the active edge (assumes the true order has been set by set_quad_order
).
[in]  on_neighbor  If true, order is returned for the neighbor el. (using its local active edge number). 
Definition at line 942 of file neighbor_search.cpp.
Referenced by Hermes::Hermes2D::NeighborSearch< Scalar >::init_ext_fn().
DiscontinuousFunc< Scalar > * Hermes::Hermes2D::NeighborSearch< Scalar >::init_ext_fn  (  MeshFunction< Scalar > *  fu  ) 
Fill arrays with function values / derivatives at both sides of the active segment of active edge. Assumes that integration order has been set by set_quad_order
.
[in]  fu  MeshFunction whose values are requested. 
Definition at line 1018 of file neighbor_search.cpp.
void Hermes::Hermes2D::NeighborSearch< Scalar >::set_active_edge  (  int  edge  ) 
Set active edge and compute all information about the neighbors.
In particular, it fills the neighbors
and neighbor_edges
vectors and the transformations
array used for transforming either the central or the neighboring elements to the same size. It also sets neighborhood_type
, according to whether we can find a vertex in the middle of the active edge  if we can, then we go down and the corresponding transformations will be filled for the bigger central element. This is performed by the method find_act_elem_down
. Otherwise, we go up and will later push the transformations from transfomations
to functions on the bigger neighboring element. Way up is Realized by the method find_act_elem_up
.
[in]  edge  Local (element dependent) number of the edge. 
[in]  ignore_visited_segments  If true, it indicates that an edgebased discontinuous Galerkin formulation is assumed. This means that once an edge is visited during assembling, integrals on that edge from both its sides are assembled at once and the edge should be ignored when the neighbor is assembled. A sum of edgeintegrals over edges represents interelement coupling across the edge in the math. formulation. 
If false, an elementbased DG formulation is assumed, where each edge of every element is assembled (a sum of edgeintegrals over elements appears in the mathematical formulation). Note that this may be also use in the edgebased form., e.g. to specify linear forms.
Definition at line 177 of file neighbor_search.cpp.
Referenced by Hermes::Hermes2D::EggShell::get_egg_shell(), and Hermes::Hermes2D::DiscreteProblemSelectiveAssembler< Scalar >::prepare_sparse_structure().
void Hermes::Hermes2D::NeighborSearch< Scalar >::set_quad_order  (  int  order  ) 
Sets the quadrature order to be used for obtaining integration points and weights in both neighbors.
[in]  order  The integration order. 
Definition at line 935 of file neighbor_search.cpp.
Transformations** Hermes::Hermes2D::NeighborSearch< Scalar >::central_transformations 
Array of transformations of the central element to each neighbor.
(in a godown neighborhood; stored as on Transformation
structure for each neighbor).
Definition at line 335 of file neighbor_search.h.
Referenced by Hermes::Hermes2D::NeighborSearch< Scalar >::delete_neighbor(), Hermes::Hermes2D::NeighborSearch< Scalar >::get_central_n_trans(), Hermes::Hermes2D::NeighborSearch< Scalar >::get_central_transformations(), and Hermes::Hermes2D::NeighborSearch< Scalar >::NeighborSearch().
bool Hermes::Hermes2D::NeighborSearch< Scalar >::ignore_errors 
When creating sparse structure of a matrix using this class, we want to ignore errors and do nothing instead when set_active_edge() function is called for a nonboundary edge.
Definition at line 263 of file neighbor_search.h.
Referenced by Hermes::Hermes2D::NeighborSearch< Scalar >::NeighborSearch().
uint64_t Hermes::Hermes2D::NeighborSearch< Scalar >::original_central_el_transform 
Subelement transformation of any function that comes from the.
assembly, before transforms from transformations
are pushed to it.
Definition at line 349 of file neighbor_search.h.
Referenced by Hermes::Hermes2D::ErrorThreadCalculator< Scalar >::DGErrorCalculator::init_neighbors(), and Hermes::Hermes2D::NeighborSearch< Scalar >::NeighborSearch().
ExtendedShapeset* Hermes::Hermes2D::NeighborSearch< Scalar >::supported_shapes 
Object allowing to set/get a particular shape function from the extended.
shapeset and retrieve global assembly information for it.
Definition at line 147 of file neighbor_search.h.