Public Member Functions | Static Public Member Functions | Static Public Attributes | Protected Member Functions | Static Protected Attributes | Private Member Functions | Static Private Member Functions | Static Private Attributes | List of all members
oomph::OcTree Class Reference

OcTree class: Recursively defined, generalised octree. More...

#include <octree.h>

+ Inheritance diagram for oomph::OcTree:

Public Member Functions

virtual ~OcTree ()
 Destructor. Note: Deleting a octree also deletes the objects associated with all non-leaf nodes! More...
 
 OcTree (const OcTree &dummy)=delete
 Broken copy constructor. More...
 
void operator= (const OcTree &)=delete
 Broken assignment operator. More...
 
Treeconstruct_son (RefineableElement *const &object_pt, Tree *const &father_pt, const int &son_type)
 Overload the function construct_son to ensure that the son is a specific OcTree and not a general Tree. More...
 
OcTreegteq_face_neighbour (const int &direction, Vector< unsigned > &translate_s, Vector< double > &s_sw, Vector< double > &s_ne, int &face, int &diff_level, bool &in_neighbouring_tree) const
 Find (pointer to) ‘greater-or-equal-sized face neighbour’ in given direction (L/R/U/D/F/B). Another way of interpreting this is that we're looking for the neighbour across the present element's face 'direction'. The various arguments return additional information about the size and relative orientation of the neighbouring octree. To interpret these we use the following General convention: More...
 
OcTreegteq_true_edge_neighbour (const int &direction, const unsigned &i_root_edge_neighbour, unsigned &nroot_edge_neighbour, Vector< unsigned > &translate_s, Vector< double > &s_lo, Vector< double > &s_hi, int &edge, int &diff_level) const
 Find (pointer to) ‘greater-or-equal-sized true edge neighbour’ in the given direction (LB,RB,DB,UB [the back edges], LD,RD,LU,RU [the side edges], LF,RF,DF,UF [the front edges]). More...
 
unsigned self_test ()
 Self-test: Check all neighbours. Return success (0) if the max. distance between corresponding points in the neighbours is less than the tolerance specified in the static value Tree::Max_neighbour_finding_tolerance. More...
 
- Public Member Functions inherited from oomph::Tree
virtual ~Tree ()
 Destructor. Note: Deleting a tree also deletes the objects associated with its non-leave nodes. More...
 
 Tree (const Tree &dummy)=delete
 Broken copy constructor. More...
 
void operator= (const Tree &)=delete
 Broken assignment operator. More...
 
RefineableElementobject_pt () const
 Return the pointer to the object (RefineableElement) represented by the tree. More...
 
void flush_object ()
 Flush the object represented by the tree. More...
 
Treeson_pt (const int &son_index) const
 Return pointer to the son for a given index. Note that to aid code readability specific enums have been defined for specific trees. However, these are simply aliases for ints and the general interface can be implemented once, here. More...
 
void set_son_pt (const Vector< Tree * > &son_pt)
 Set vector of pointers to sons, indexed by the appropriate enum that identies son types. (To aid code readability specific enums have been defined for specific trees. However, these are simply aliases for ints and the general interface can be implemented once, here). More...
 
unsigned nsons () const
 Return number of sons (zero if it's a leaf node) More...
 
void flush_sons ()
 Flush the sons. More...
 
TreeRoot *& root_pt ()
 Return pointer to root of the tree. More...
 
TreeRootroot_pt () const
 Return pointer to root of the tree (const version) More...
 
template<class ELEMENT >
void split_if_required ()
 If required, split the leaf and create its sons – criterion: bool object_pt()-> to_be_refined() = true. More...
 
template<class ELEMENT >
void p_refine_if_required (Mesh *&mesh_pt)
 If required, p-refine the leaf – criterion: bool object_pt()-> to_be_p_refined() = true or bool object_pt()-> to_be_p_unrefined() = true. More...
 
void merge_sons_if_required (Mesh *&mesh_pt)
 If required, merge the four sons for unrefinement – criterion: bool object_pt()-> sons_to_be_unrefined() = true. More...
 
void deactivate_object ()
 Call the RefineableElement's deactivate_element() function. More...
 
void traverse_all (Tree::VoidMemberFctPt member_function)
 Traverse the tree and execute void Tree member function member_function() at all its "nodes". More...
 
void traverse_all (Tree::VoidMeshPtArgumentMemberFctPt member_function, Mesh *&mesh_pt)
 Traverse the tree and excute void Tree member function that takes a pointer to a mesh as an argument. More...
 
void traverse_all_but_leaves (Tree::VoidMemberFctPt member_function)
 Traverse the tree and execute void Tree member function member_function() at all its "nodes" aparat from the leaves. More...
 
void traverse_leaves (Tree::VoidMemberFctPt member_function)
 Traverse the tree and execute void Tree member function member_function() only at its leaves. More...
 
void traverse_leaves (Tree::VoidMeshPtArgumentMemberFctPt member_function, Mesh *&mesh_pt)
 Traverse the tree and execute void Tree member function that takes a pointer to a mesh as an argument only at its leaves. More...
 
void stick_leaves_into_vector (Vector< Tree * > &)
 Traverse tree and stick pointers to leaf "nodes" (only) into Vector. More...
 
void stick_all_tree_nodes_into_vector (Vector< Tree * > &)
 Traverse and stick pointers to all "nodes" into Vector. More...
 
int son_type () const
 Return son type. More...
 
bool is_leaf ()
 Return true if the tree is a leaf node. More...
 
Treefather_pt () const
 Return pointer to father: NULL if it's a root node. More...
 
void set_father_pt (Tree *const &father_pt)
 Set the father. More...
 
unsigned level () const
 Return the level of the Tree (root=0) More...
 

Static Public Member Functions

static Vector< int > faces_of_common_edge (const int &edge)
 Function that, given an edge, returns the two faces on which it. More...
 
static void setup_static_data ()
 Setup the static data, rotation and reflection schemes, etc. More...
 
static void doc_face_neighbours (Vector< Tree * > forest_nodes_pt, std::ofstream &neighbours_file, std::ofstream &neighbours_txt_file, double &max_error)
 Doc/check all face neighbours of octree (nodes) contained in the Vector forest_node_pt. Output into neighbours_file which can be viewed from tecplot with OcTreeNeighbours.mcr Neighbour info and errors are displayed on neighbours_txt_file. Finally, compute the max. error between vertices when viewed from neighhbouring element. If the two filestreams are closed, output is suppressed. More...
 
static void doc_true_edge_neighbours (Vector< Tree * > forest_nodes_pt, std::ofstream &neighbours_file, std::ofstream &no_true_edge_file, std::ofstream &neighbours_txt_file, double &max_error)
 Doc/check all true edge neighbours of octree (nodes) contained in the Vector forest_node_pt. Output into neighbours_file which can be viewed from tecplot with OcTreeNeighbours.mcr Neighbour info and errors are displayed on neighbours_txt_file. Finally, compute the max. error between vertices when viewed from neighhbouring element. If the two filestreams are closed, output is suppressed. More...
 
static int get_the_other_face (const unsigned &n1, const unsigned &n2, const unsigned &nnode1d, const int &face)
 If an edge is bordered by the nodes whose local numbers are n1 and n2 in an element with nnode1d nodes along each coordinate direction, then this edge is shared by two faces. This function takes one of these faces as the argument face and returns the other one. (face is a direction in the set U,D,F,B,L,R). More...
 
static unsigned vertex_to_node_number (const int &vertex, const unsigned &nnode1d)
 Return the local node number of given vertex [LDB,RDB,...] in an element with nnode1d nodes in each coordinate direction. More...
 
static int node_number_to_vertex (const unsigned &n, const unsigned &nnode1d)
 Return the vertex [LDB,RDB,...] of local (vertex) node n in an element with nnode1d nodes in each coordinate direction. More...
 
static Vector< int > rotate (const int &new_up, const int &new_right, const Vector< int > &dir)
 If U[p] becomes new_up and R[ight] becomes new_right then the direction vector dir becomes rotate(new_up, new_right, dir) More...
 
static int rotate (const int &new_up, const int &new_right, const int &dir)
 If U[p] becomes new_up and R[ight] becomes new_right then the direction dir becomes rotate(new_up, new_right, dir) More...
 
- Static Public Member Functions inherited from oomph::Tree
static double & max_neighbour_finding_tolerance ()
 Max. allowed discrepancy in neighbour finding routine (distance between points when identified from two neighbouring elements) More...
 

Static Public Attributes

static Vector< std::string > Direct_string
 Translate (enumerated) directions into strings. More...
 
static Vector< int > Reflect_face
 Get opposite face, e.g. Reflect_face[L]=R. More...
 
static Vector< int > Reflect_edge
 Get opposite edge, e.g. Reflect_edge[DB]=UF. More...
 
static Vector< int > Reflect_vertex
 Get opposite vertex, e.g. Reflect_vertex[LDB]=RUF. More...
 
static Vector< Vector< int > > Vertex_at_end_of_edge
 Vector of vectors containing the two vertices for each edge, e.g. Vertex_at_end_of_edge[LU][0]=LUB and Vertex_at_end_of_edge[LU][1]=LUF. More...
 
static std::map< Vector< int >, int > Vector_to_direction
 Each vector representing a direction can be translated into a direction, either a son type (vertex), a face or an edge. E.g. : Vector_to_direction[(1,-1,1)]=RDF, Vector_to_direction[(0,1,0)]=U. More...
 
static Vector< Vector< int > > Direction_to_vector
 For each direction, i.e. a son_type (vertex), a face or an edge, this defines a vector that indicates this direction. E.g : Direction_to_vector[RDB]=(1,-1,-1), Direction_to_vector[U]=(0,1,0) More...
 
static std::map< std::pair< std::pair< int, int >, std::pair< int, int > >, std::pair< int, int > > Up_and_right_equivalent_for_pairs_of_vertices
 Storage for the up/right-equivalents corresponding to two pairs of vertices along an element edge: More...
 
- Static Public Attributes inherited from oomph::Tree
static const int OMEGA = 26
 Default value for an unassigned neighbour. More...
 

Protected Member Functions

 OcTree ()
 Default constructor (empty and broken) More...
 
 OcTree (RefineableElement *const &object_pt)
 Constructor for empty (root) tree: no father, no sons; just pass a pointer to its object (a RefineableQElement<3>). This is protected because OcTrees can only be created internally, during the split operation. Only OcTreeRoots can be created externally. More...
 
 OcTree (RefineableElement *const &object_pt, Tree *const &father_pt, const int &son_type)
 Constructor for tree that has a father: Pass it the pointer to its object, the pointer to its father and tell it what type of son (LDB,RDB,...) it is. Protected because OcTrees can only be created internally, during the split operation. Only OcTreeRoots can be created externally. More...
 
- Protected Member Functions inherited from oomph::Tree
 Tree ()
 Default constructor (empty and broken) More...
 
 Tree (RefineableElement *const &object_pt)
 Default constructor for empty (root) tree: no father, no sons; just pass a pointer to its object Protected because Trees can only be created internally, during the split operation. Only TreeRoots can be created externally. More...
 
 Tree (RefineableElement *const &object_pt, Tree *const &father_pt, const int &son_type)
 Constructor for tree that has a father: Pass it the pointer to its object, the pointer to its father and tell it what type of son it is. Protected because Trees can only be created internally, during the split operation. Only TreeRoots can be created externally. More...
 

Static Protected Attributes

static bool Static_data_has_been_setup = false
 Bool indicating that static member data has been setup. More...
 
- Static Protected Attributes inherited from oomph::Tree
static double Max_neighbour_finding_tolerance = 1.0e-14
 Max. allowed discrepancy in neighbour finding routine (distance between points when identified from two neighbouring elements) More...
 

Private Member Functions

OcTreegteq_face_neighbour (const int &direction, double &s_difflo, double &s_diffhi, int &diff_level, bool &in_neighbouring_tree, int max_level, OcTreeRoot *orig_root_pt) const
 Find ‘greater-or-equal-sized face neighbour’ in given direction (L/R/U/D/B/F). More...
 
OcTreegteq_edge_neighbour (const int &direction, const unsigned &i_root_edge_neighbour, unsigned &nroot_edge_neighbour, double &s_diff, int &diff_level, int max_level, OcTreeRoot *orig_root_pt) const
 Find ‘greater-or-equal-sized edge neighbour’ in given direction (LB,RB,DB,UB [the back edges], LD,RD,LU,RU [the side edges], LF,RF,DF,UF [the front edges]). More...
 
bool edge_neighbour_is_face_neighbour (const int &edge, OcTree *edge_neighb_pt) const
 Is the edge neighbour (for edge "edge") specified via the pointer also a face neighbour for one of the two adjacent faces? More...
 

Static Private Member Functions

static void construct_rotation_matrix (int &axis, int &angle, DenseMatrix< int > &mat)
 This constructs the rotation matrix of the rotation around the axis axis with an angle of angle*90. More...
 
static void mult_mat_vect (const DenseMatrix< int > &mat, const Vector< int > &vect1, Vector< int > &vect2)
 Helper function: Performs the operation : vect2 = mat*vect1. More...
 
static void mult_mat_mat (const DenseMatrix< int > &mat1, const DenseMatrix< int > &mat2, DenseMatrix< int > &mat3)
 Helper function: Performs the operation : mat3=mat1*mat2. More...
 
static Vector< int > vertex_node_to_vector (const unsigned &n, const unsigned &nnode1d)
 Returns the vector of the coordinate directions of vertex node number n in an element with nnode1d element per dimension. More...
 

Static Private Attributes

static Vector< int > Cosi
 Entry in rotation matrix: cos(i*90) More...
 
static Vector< int > Sini
 Entry in rotation matrix sin(i*90) More...
 
static DenseMatrix< bool > Is_adjacent
 Array of direction/octant adjacency scheme: Is_adjacent(direction,octant): Is face/edge direction adjacent to octant octant ? (Table in Samet's book) More...
 
static DenseMatrix< int > Reflect
 Reflection scheme: Reflect(direction,octant): Get mirror of octant/edge in specified direction. E.g. Reflect(LDF,L)=RDF. More...
 
static DenseMatrix< int > Common_face
 Determine common face of edges or octants. Slightly bizarre lookup scheme from Samet's book. More...
 
static Vector< std::string > Colour
 Colours for neighbours in various directions. More...
 
static DenseMatrix< double > S_base
 s_base(i,direction): Initial value for coordinate s[i] on the face indicated by direction (L/R/U/D/F/B) More...
 
static DenseMatrix< double > S_steplo
 Each face of the RefineableQElement<3> that is represented by the octree is parametrised by two (of the three) local coordinates that parametrise the entire 3D element. E.g. the B[ack] face is parametrised by (s[0], s[1]); the D[own] face is parametrised by (s[0],s[2]); etc. We always identify the in-face coordinate with the lower (3D) index with the subscript _lo and the one with the larger (3D) index with the subscript _hi. Here we set up the translation scheme between the 2D in-face coordinates (s_lo,s_hi) and the corresponding 3D coordinates: If we're located on face face [L/R/F/B/U/D], then an increase in s_lo from -1 to +1 corresponds to a change of s_steplo(i,face) in the 3D coordinate s[i]. More...
 
static DenseMatrix< double > S_stephi
 If we're located on face face [L/R/F/B/U/D], then an increase in s_hi from -1 to +1 corresponds to a change of s_stephi(i,face) in the 3D coordinate \ s[i]. [Read the discussion of s_steplo for an explanation of the subscripts _hi and _lo.]. More...
 
static DenseMatrix< double > S_directlo
 Relative to the left/down/back vertex in any (father) octree, the corresponding vertex in the son specified by son_octant has an offset. If we project the son_octant's left/down/back vertex onto the father's face face, it is located at the in-face coordinate s_lo = h/2 S_directlo(face,son_octant). [See discussion of s_steplo for an explanation of the subscripts _hi and _lo.]. More...
 
static DenseMatrix< double > S_directhi
 Relative to the left/down/back vertex in any (father) octree, the corresponding vertex in the son specified by son_octant has an offset. If we project the son_octant's left/down/back vertex onto the father's face face, it is located at the in-face coordinate s_hi = h/2 S_directlhi(face,son_octant). [See discussion of s_steplo for an explanation of the subscripts _hi and _lo.]. More...
 
static DenseMatrix< double > S_base_edge
 S_base_edge(i,edge): Initial value for coordinate s[i] on the specified edge (LF/RF/...). More...
 
static DenseMatrix< double > S_step_edge
 Each edge of the RefineableQElement<3> that is represented by the octree is parametrised by one (of the three) local coordinates that parametrise the entire 3D element. If we're located on edge edge [DB,UB,...], then an increase in s from -1 to +1 corresponds to a change of s_step_edge(i,edge) in the 3D coordinates s[i]. More...
 
static DenseMatrix< double > S_direct_edge
 Relative to the left/down/back vertex in any (father) octree, the corresponding vertex in the son specified by son_octant has an offset. If we project the son_octant's left/down/back vertex onto the father's edge edge, it is located at the in-face coordinate s_lo = h/2 S_direct_edge(edge,son_octant). More...
 

Additional Inherited Members

- Public Types inherited from oomph::Tree
typedef void(Tree::* VoidMemberFctPt) ()
 Function pointer to argument-free void Tree member function. More...
 
typedef void(Tree::* VoidMeshPtArgumentMemberFctPt) (Mesh *&mesh_pt)
 Function pointer to a void Tree member function that takes a pointer to a mesh as its argument. More...
 
- Protected Attributes inherited from oomph::Tree
TreeRootRoot_pt
 Pointer to the root of the tree. More...
 
TreeFather_pt
 Pointer to the Father of the Tree. More...
 
Vector< Tree * > Son_pt
 Vector of pointers to the sons of the Tree. More...
 
int Level
 Level of the Tree (level 0 = root) More...
 
int Son_type
 Son type (e.g. SW/SE/NW/NE in a quadtree) More...
 
RefineableElementObject_pt
 Pointer to the object represented by the tree. More...
 

Detailed Description

OcTree class: Recursively defined, generalised octree.

An OcTree has:

The tree can also be part of a forest. If that is the case, the root will have pointers to the roots of neighbouring octrees.

The objects contained in the octree are assumed to be (topologically) cubic elements whose geometry is parametrised by local coordinates $ {\bf s} \in [-1,1]^3 $.

The tree can be traversed while actions are being performed at all of its "nodes" or only at the leaf "nodes".

Finally, the leaf "nodes" can be split depending on criteria defined by the object.

Note that OcTrees are only generated by splitting existing OcTrees. Therefore, the constructors are protected. The only OcTree that "Joe User" can create is the (derived) class OcTreeRoot.

Definition at line 113 of file octree.h.

Constructor & Destructor Documentation

◆ ~OcTree()

virtual oomph::OcTree::~OcTree ( )
inlinevirtual

Destructor. Note: Deleting a octree also deletes the objects associated with all non-leaf nodes!

Definition at line 118 of file octree.h.

◆ OcTree() [1/4]

oomph::OcTree::OcTree ( const OcTree dummy)
delete

Broken copy constructor.

◆ OcTree() [2/4]

oomph::OcTree::OcTree ( )
inlineprotected

Default constructor (empty and broken)

Definition at line 382 of file octree.h.

Referenced by construct_son().

◆ OcTree() [3/4]

oomph::OcTree::OcTree ( RefineableElement *const &  object_pt)
inlineprotected

Constructor for empty (root) tree: no father, no sons; just pass a pointer to its object (a RefineableQElement<3>). This is protected because OcTrees can only be created internally, during the split operation. Only OcTreeRoots can be created externally.

Definition at line 395 of file octree.h.

◆ OcTree() [4/4]

oomph::OcTree::OcTree ( RefineableElement *const &  object_pt,
Tree *const &  father_pt,
const int &  son_type 
)
inlineprotected

Constructor for tree that has a father: Pass it the pointer to its object, the pointer to its father and tell it what type of son (LDB,RDB,...) it is. Protected because OcTrees can only be created internally, during the split operation. Only OcTreeRoots can be created externally.

Definition at line 404 of file octree.h.

Member Function Documentation

◆ construct_rotation_matrix()

void oomph::OcTree::construct_rotation_matrix ( int &  axis,
int &  angle,
DenseMatrix< int > &  mat 
)
staticprivate

This constructs the rotation matrix of the rotation around the axis axis with an angle of angle*90.

Build the rotation matrix for a rotation around the axis axis of an angle angle*90.

Definition at line 609 of file octree.cc.

References oomph::VectorHelpers::angle(), Cosi, oomph::OcTreeNames::F, i, oomph::BinaryTreeNames::R, oomph::OcTreeNames::R, Sini, and oomph::OcTreeNames::U.

Referenced by rotate().

◆ construct_son()

Tree * oomph::OcTree::construct_son ( RefineableElement *const &  object_pt,
Tree *const &  father_pt,
const int &  son_type 
)
inlinevirtual

Overload the function construct_son to ensure that the son is a specific OcTree and not a general Tree.

Implements oomph::Tree.

Definition at line 129 of file octree.h.

References oomph::Tree::father_pt(), oomph::Tree::object_pt(), OcTree(), and oomph::Tree::son_type().

◆ doc_face_neighbours()

void oomph::OcTree::doc_face_neighbours ( Vector< Tree * >  forest_nodes_pt,
std::ofstream &  neighbours_file,
std::ofstream &  neighbours_txt_file,
double &  max_error 
)
static

Doc/check all face neighbours of octree (nodes) contained in the Vector forest_node_pt. Output into neighbours_file which can be viewed from tecplot with OcTreeNeighbours.mcr Neighbour info and errors are displayed on neighbours_txt_file. Finally, compute the max. error between vertices when viewed from neighhbouring element. If the two filestreams are closed, output is suppressed.

Doc/check all face neighbours of octree (nodes) contained in the Vector forest_node_pt. Output into neighbours_file which can be viewed from tecplot with OcTreeNeighbours.mcr Neighbour info and errors are displayed on neighbours_txt_file. Finally, compute the max. error between vertices when viewed from neighbouring element. If the two filestreams are closed, output is suppressed. (Static function.)

Definition at line 4275 of file octree.cc.

References Colour, Direct_string, oomph::OcTreeNames::F, oomph::FiniteElement::get_x(), gteq_face_neighbour(), i, oomph::TreeRoot::is_neighbour_periodic(), oomph::BinaryTreeNames::L, oomph::Tree::Max_neighbour_finding_tolerance, oomph::RefineableElement::nodes_built(), oomph::RefineableElement::number(), oomph::Tree::object_pt(), oomph::Tree::OMEGA, oomph::pause(), oomph::Tree::root_pt(), s, S_base, S_stephi, and S_steplo.

Referenced by oomph::OcTreeForest::check_all_neighbours(), self_test(), and oomph::OcTreeForest::self_test().

◆ doc_true_edge_neighbours()

void oomph::OcTree::doc_true_edge_neighbours ( Vector< Tree * >  forest_nodes_pt,
std::ofstream &  neighbours_file,
std::ofstream &  no_true_edge_file,
std::ofstream &  neighbours_txt_file,
double &  max_error 
)
static

Doc/check all true edge neighbours of octree (nodes) contained in the Vector forest_node_pt. Output into neighbours_file which can be viewed from tecplot with OcTreeNeighbours.mcr Neighbour info and errors are displayed on neighbours_txt_file. Finally, compute the max. error between vertices when viewed from neighhbouring element. If the two filestreams are closed, output is suppressed.

///////////////////////////////////////////////////////////////////

Doc/check all true edge neighbours of octree (nodes) contained in the Vector forest_node_pt. Output into neighbours_file which can be viewed from tecplot with OcTreeNeighbours.mcr Neighbour info and errors are displayed on neighbours_txt_file. Finally, compute the max. error between vertices when viewed from neighbouring element. If the two filestreams are closed, output is suppressed. (Static function).

Definition at line 4552 of file octree.cc.

References Colour, Direct_string, faces_of_common_edge(), oomph::FiniteElement::get_x(), gteq_true_edge_neighbour(), i, oomph::Tree::is_leaf(), oomph::TreeRoot::is_neighbour_periodic(), oomph::OcTreeNames::LB, oomph::Tree::Max_neighbour_finding_tolerance, oomph::RefineableElement::nodes_built(), oomph::RefineableElement::number(), oomph::Tree::object_pt(), oomph::Tree::OMEGA, oomph::pause(), oomph::Tree::root_pt(), s, S_base_edge, S_step_edge, and oomph::OcTreeNames::UF.

Referenced by oomph::OcTreeForest::check_all_neighbours(), self_test(), and oomph::OcTreeForest::self_test().

◆ edge_neighbour_is_face_neighbour()

bool oomph::OcTree::edge_neighbour_is_face_neighbour ( const int &  edge,
OcTree edge_neighb_pt 
) const
private

◆ faces_of_common_edge()

Vector< int > oomph::OcTree::faces_of_common_edge ( const int &  edge)
static

◆ get_the_other_face()

int oomph::OcTree::get_the_other_face ( const unsigned &  n1,
const unsigned &  n2,
const unsigned &  nnode1d,
const int &  face 
)
static

If an edge is bordered by the nodes whose local numbers are n1 and n2 in an element with nnode1d nodes along each coordinate direction, then this edge is shared by two faces. This function takes one of these faces as the argument face and returns the other one. (face is a direction in the set U,D,F,B,L,R).

This function takes as argument two node numbers of two nodes delimiting an edge, and one face of this edge and returns the other face that is sharing this edge. The node numbers given to this function MUST be vertices nodes to work. it also need the value of nnode1d to work. (face is a direction in the set U,D,F,B,L,R).

Definition at line 565 of file octree.cc.

References Direction_to_vector, i, Vector_to_direction, and vertex_node_to_vector().

Referenced by oomph::OcTreeForest::construct_up_right_equivalents().

◆ gteq_edge_neighbour()

OcTree * oomph::OcTree::gteq_edge_neighbour ( const int &  direction,
const unsigned &  i_root_edge_neighbour,
unsigned &  nroot_edge_neighbour,
double &  s_diff,
int &  diff_level,
int  max_level,
OcTreeRoot orig_root_pt 
) const
private

Find ‘greater-or-equal-sized edge neighbour’ in given direction (LB,RB,DB,UB [the back edges], LD,RD,LU,RU [the side edges], LF,RF,DF,UF [the front edges]).

This is an auxiliary routine which allows neighbour finding in adjacent octrees. Needs to keep track of the maximum level to which search is performed because in the presence of OcTree forests, the search isn't purely recursive.

Parameters:

  • direction: (LB/RB/...) Direction in which neighbour has to be found.
  • In a forest, an OcTree can have multiple edge neighbours (across an edge where multiple trees meet). i_root_edge_neighbour specifies which of these is used. Use this as "reverse communication": First call with i_root_edge_neighbour=0 and n_root_edge_neighour initialised to anything you want (zero, ideally). On return from the fct, n_root_edge_neighour contains the total number of true edge neighbours, so additional calls to the fct with i_root_edge_neighbour>0 can be made until they've all been visited.
  • s_diff: Offset of the edge's "low" vertex from corresponding vertex in neighbour. Note that this is input/output as it needs to be incremented/ decremented during the recursive calls to this function.
  • diff_level <= 0 indicates the difference in octree levels between the current element and its neighbour.
  • max_level is the maximum level to which the neighbour search is allowed to proceed. This is necessary because in a forest, the neighbour search isn't based on pure recursion.
  • orig_root_pt identifies the root node of the element whose neighbour we're really trying to find by all these recursive calls.

Note: some of the auxiliary information may be incorrect if the neighbour is not a true edge neighbour. We don't care because we're not dealing with those!

This is an auxiliary routine which allows neighbour finding in adjacent octrees. Needs to keep track of previous son types and the maximum level to which search is performed.

Parameters:

  • direction: (LB,RB/...) Direction in which neighbour has to be found.
  • In a forest, an OcTree can have multiple edge neighbours (across an edge where multiple trees meet). i_root_edge_neighbour specifies which of these is used. Use this as "reverse communication": First call with i_root_edge_neighbour=0 and n_root_edge_neighour initialised to anything you want (zero, ideally). On return from the fct, n_root_edge_neighour contains the total number of true edge neighbours, so additional calls to the fct with i_root_edge_neighbour>0 can be made until they've all been visited.
  • s_diff: Offset of left/down/back vertex from corresponding vertex in neighbour. Note that this is input/output as it needs to be incremented/ decremented during the recursive calls to this function.
  • diff_level <= 0 indicates the difference in octree levels between the current element and its neighbour.
  • max_level is the maximum level to which the neighbour search is allowed to proceed. This is necessary because in a forest, the neighbour search isn't based on pure recursion.
  • orig_root_pt identifies the root node of the element whose neighbour we're really trying to find by all these recursive calls.

Definition at line 4015 of file octree.cc.

References Common_face, oomph::OcTreeNames::DB, oomph::OcTreeNames::DF, Direct_string, oomph::Tree::Father_pt, gteq_edge_neighbour(), gteq_face_neighbour(), Is_adjacent, oomph::OcTreeNames::LB, oomph::OcTreeNames::LD, oomph::Tree::Level, oomph::OcTreeNames::LF, oomph::OcTreeNames::LU, oomph::Tree::OMEGA, oomph::OcTreeNames::RB, oomph::OcTreeNames::RD, Reflect, oomph::OcTreeNames::RF, oomph::Tree::Root_pt, rotate(), oomph::OcTreeNames::RU, S_direct_edge, oomph::Tree::Son_pt, oomph::Tree::Son_type, oomph::OcTreeNames::UB, and oomph::OcTreeNames::UF.

Referenced by gteq_edge_neighbour(), and gteq_true_edge_neighbour().

◆ gteq_face_neighbour() [1/2]

OcTree * oomph::OcTree::gteq_face_neighbour ( const int &  direction,
double &  s_difflo,
double &  s_diffhi,
int &  diff_level,
bool &  in_neighbouring_tree,
int  max_level,
OcTreeRoot orig_root_pt 
) const
private

Find ‘greater-or-equal-sized face neighbour’ in given direction (L/R/U/D/B/F).

This is an auxiliary routine which allows neighbour finding in adjacent octrees. Needs to keep track of the maximum level to which search is performed because in the presence of OcTree forests, the search isn't purely recursive.

Parameters:

  • direction: (L/R/U/D/B/F) Direction in which neighbour has to be found.
  • s_difflo/s_diffhi: Offset of left/down/back vertex from corresponding vertex in neighbour. Note that this is input/output as it needs to be incremented/ decremented during the recursive calls to this function.
  • diff_level <= 0 indicates the difference in octree levels between the current element and its neighbour.
  • max_level is the maximum level to which the neighbour search is allowed to proceed. This is necessary because in a forest, the neighbour search isn't based on pure recursion.
  • orig_root_pt identifies the root node of the element whose neighbour we're really trying to find by all these recursive calls.

This is an auxiliary routine which allows neighbour finding in adjacent octrees. Needs to keep track of previous son types and the maximum level to which search is performed.

Parameters:

  • direction: (L/R/U/D/B/F) Direction in which neighbour has to be found.
  • s_difflo/s_diffhi: Offset of left/down/back vertex from corresponding vertex in neighbour. Note that this is input/output as it needs to be incremented/decremented during the recursive calls to this function.
  • face: We're looking for the neighbour across our face 'direction' (L/R/U/D/B/F). When viewed from the neighbour, this face is ‘face’ (L/R/U/D/B/F). [If there's no relative rotation between neighbours then this is a mere reflection, e.g. direction=F --> face=B etc.]
  • diff_level <= 0 indicates the difference in octree levels between the current element and its neighbour.
  • max_level is the maximum level to which the neighbour search is allowed to proceed. This is necessary because in a forest, the neighbour search isn't based on pure recursion.
  • orig_root_pt identifies the root node of the element whose neighbour we're really trying to find by all these recursive calls.

Definition at line 3839 of file octree.cc.

References oomph::OcTreeNames::B, oomph::OcTreeNames::D, Direct_string, oomph::OcTreeNames::F, oomph::Tree::Father_pt, gteq_face_neighbour(), Is_adjacent, oomph::BinaryTreeNames::L, oomph::Tree::Level, oomph::TreeRoot::neighbour_pt(), oomph::BinaryTreeNames::R, Reflect, oomph::Tree::Root_pt, rotate(), S_directhi, S_directlo, oomph::Tree::Son_pt, oomph::Tree::Son_type, and oomph::OcTreeNames::U.

◆ gteq_face_neighbour() [2/2]

OcTree * oomph::OcTree::gteq_face_neighbour ( const int &  direction,
Vector< unsigned > &  translate_s,
Vector< double > &  s_sw,
Vector< double > &  s_ne,
int &  face,
int &  diff_level,
bool &  in_neighbouring_tree 
) const

Find (pointer to) ‘greater-or-equal-sized face neighbour’ in given direction (L/R/U/D/F/B). Another way of interpreting this is that we're looking for the neighbour across the present element's face 'direction'. The various arguments return additional information about the size and relative orientation of the neighbouring octree. To interpret these we use the following General convention:

  • Each face of the element that is represented by the octree is parametrised by two (of the three) local coordinates that parametrise the entire 3D element. E.g. the B[ack] face is parametrised by (s[0], s[1]); the D[own] face is parametrised by (s[0],s[2]); etc. We always identify the in-face coordinate with the lower (3D) index with the subscript _lo and the one with the larger (3D) index with the subscript _hi.

With this convention, the interpretation of the arguments is as follows:

  • The vector translate_s turns the index of the local coordinate in the present octree into that of the neighbour. If there are no rotations then translate_s[i] = i.
  • In the present octree, the "south west" vertex of the face between the present octree and its neighbour is located at S_lo=-1, S_hi=-1. This point is located at the (3D) local coordinates (s_sw[0], s_sw[1], s_sw[2]) in the neighbouring octree.
  • ditto with s_ne: In the present octree, the "north east" vertex of the face between the present octree and its neighbour is located at S_lo=+1, S_hi=+1. This point is located at the (3D) local coordinates (s_ne[0], s_ne[1], s_ne[2]) in the neighbouring octree.
  • We're looking for a neighbour in the specified direction. When viewed from the neighbouring octree, the face that separates the present octree from its neighbour is the neighbour's face face. If there's no rotation between the two octrees, this is a simple reflection: For instance, if we're looking for a neighhbour in the R [ight] direction, face will be L [eft]
  • diff_level <= 0 indicates the difference in refinement levels between the two neighbours. If diff_level==0, the neighbour has the same size as the current octree.

Definition at line 3373 of file octree.cc.

References oomph::OcTreeNames::B, oomph::OcTreeNames::D, Direct_string, Direction_to_vector, oomph::OcTreeNames::F, gteq_face_neighbour(), i, oomph::BinaryTreeNames::L, oomph::Tree::Level, oomph::BinaryTreeNames::R, Reflect_face, oomph::OcTreeRoot::right_equivalent(), oomph::Tree::Root_pt, rotate(), S_base, S_stephi, S_steplo, oomph::OcTreeNames::U, and oomph::OcTreeRoot::up_equivalent().

Referenced by oomph::RefineableQElement< 3 >::check_integrity(), doc_face_neighbours(), edge_neighbour_is_face_neighbour(), gteq_edge_neighbour(), gteq_face_neighbour(), oomph::PRefineableQElement< 3, INITIAL_NNODE_1D >::node_created_by_neighbour(), oomph::RefineableQElement< 3 >::node_created_by_neighbour(), oomph::PRefineableQElement< 3, INITIAL_NNODE_1D >::node_created_by_son_of_neighbour(), oomph::RefineableQElement< 3 >::oc_hang_helper(), and oomph::PRefineableQElement< 3, INITIAL_NNODE_1D >::oc_hang_helper().

◆ gteq_true_edge_neighbour()

OcTree * oomph::OcTree::gteq_true_edge_neighbour ( const int &  direction,
const unsigned &  i_root_edge_neighbour,
unsigned &  nroot_edge_neighbour,
Vector< unsigned > &  translate_s,
Vector< double > &  s_lo,
Vector< double > &  s_hi,
int &  edge,
int &  diff_level 
) const

Find (pointer to) ‘greater-or-equal-sized true edge neighbour’ in the given direction (LB,RB,DB,UB [the back edges], LD,RD,LU,RU [the side edges], LF,RF,DF,UF [the front edges]).

Find (pointer to) ‘greater-or-equal-sized true edge neighbour’ in the given direction (LB,RB,DB,UB [the back edges], LD,RD,LU,RU [the side edges], LF,RF,DF,UF [the front edges]). Another way of interpreting this is that we're looking for the neighbour across the present element's edge 'direction'. The various arguments return additional information about the size and relative orientation of the neighbouring octree. Each edge of the element that is represented by the octree is parametrised by one (of the three) local coordinates that parametrise the entire 3D element. E.g. the L[eft]B[ack] edge is parametrised by s[1]; the "low" vertex of this edge (located at the low value of this coordinate, i.e. at s[1]=-1) is L[eft]D[own]B[ack]. The "high" vertex of this edge (located at the high value of this coordinate, i.e. at s[1]=1) is L[eft]U[p]B[ack]; etc The interpretation of the arguments is as follows:

Another way of interpreting this is that we're looking for the neighbour across the present element's edge 'direction'. The various arguments return additional information about the size and relative orientation of the neighbouring octree. Each edge of the element that is represented by the octree is parametrised by one (of the three) local coordinates that parametrise the entire 3D element. E.g. the L[eft]B[ack] edge is parametrised by s[1]; the "low" vertex of this edge (located at the low value of this coordinate, i.e. at s[1]=-1) is L[eft]D[own]B[ack]. The "high" vertex of this edge (located at the high value of this coordinate, i.e. at s[1]=1) is L[eft]U[p]B[ack]; etc

The interpretation of the arguments is as follows:

  • In a forest, an OcTree can have multiple edge neighbours (across an edge where multiple trees meet). i_root_edge_neighbour specifies which of these is used. Use this as "reverse communication": First call with i_root_edge_neighbour=0 and n_root_edge_neighour initialised to anything you want (zero, ideally). On return from the fct, n_root_edge_neighour contains the total number of true edge neighbours, so additional calls to the fct with i_root_edge_neighbour>0 can be made until they've all been visited.
  • The vector translate_s turns the index of the local coordinate in the present octree into that of the neighbour. If there are no rotations then translate_s[i] = i.
  • The "low" vertex of the edge in the present octree coincides with a certain vertex in the edge neighbour. In terms of the neighbour's local coordinates, this point is located at the (3D) local coordinates (s_lo[0], s_lo[1], s_lo[2])
  • ditto with s_hi: The "high" vertex of the edge in the present octree coincides with a certain vertex in the edge neighbour. In terms of the neighbour's local coordinates, this point is located at the (3D) local coordinates (s_hi[0], s_hi[1], s_hi[2])
  • We're looking for a neighbour in the specified direction. When viewed from the neighbouring octree, the edge that separates the present octree from its neighbour is the neighbour's edge edge. If there's no rotation between the two octrees, this is a simple reflection: For instance, if we're looking for a neighhbour in the DB direction, edge will be UF.
  • diff_level <= 0 indicates the difference in refinement levels between the two neighbours. If diff_level==0, the neighbour has the same size as the current octree.

Important: We're only looking for true edge neighbours i.e. edge neigbours that are not also face neighbours. This is an important difference to Samet's terminology. If the neighbour in a certain direction is not a true edge neighbour, or if there is no neighbour, then this function returns NULL.

  • In a forest, an OcTree can have multiple edge neighbours (across an edge where multiple trees meet). i_root_edge_neighbour specifies which of these is used. Use this as "reverse communication": First call with i_root_edge_neighbour=0 and n_root_edge_neighour initialised to anything you want (zero, ideally). On return from the fct, n_root_edge_neighour contains the total number of true edge neighbours, so additional calls to the fct with i_root_edge_neighbour>0 can be made until they've all been visited.
  • The vector translate_s turns the index of the local coordinate in the present octree into that of the neighbour. If there are no rotations then translate_s[i] = i.
  • The "low" vertex of the edge in the present octree coincides with a certain vertex in the edge neighbour. In terms of the neighbour's local coordinates, this point is located at the (3D) local coordinates (s_lo[0], s_lo[1], s_lo[2])
  • ditto with s_hi: The "high" vertex of the edge in the present octree coincides with a certain vertex in the edge neighbour. In terms of the neighbour's local coordinates, this point is located at the (3D) local coordinates (s_hi[0], s_hi[1], s_hi[2])
  • We're looking for a neighbour in the specified direction. When viewed from the neighbouring octree, the edge that separates the present octree from its neighbour is the neighbour's edge edge. If there's no rotation between the two octrees, this is a simple reflection: For instance, if we're looking for a neighhbour in the DB direction, edge will be UF.
  • diff_level <= 0 indicates the difference in refinement levels between the two neighbours. If diff_level==0, the neighbour has the same size as the current octree.

Important: We're only looking for true edge neighbours i.e. edge neigbours that are not also face neighbours. This is an important difference to Samet's terminology. If the neighbour in a certain direction is not a true edge neighbour, or if there is no neighbour, then this function returns NULL.

Definition at line 3618 of file octree.cc.

References oomph::OcTreeNames::DB, oomph::OcTreeNames::DF, Direct_string, Direction_to_vector, edge_neighbour_is_face_neighbour(), oomph::OcTreeNames::F, gteq_edge_neighbour(), i, oomph::OcTreeNames::LB, oomph::OcTreeNames::LD, oomph::Tree::Level, oomph::OcTreeNames::LF, oomph::OcTreeNames::LU, oomph::BinaryTreeNames::R, oomph::OcTreeNames::RB, oomph::OcTreeNames::RD, Reflect_edge, oomph::OcTreeNames::RF, oomph::OcTreeRoot::right_equivalent(), oomph::Tree::Root_pt, rotate(), oomph::OcTreeNames::RU, S_base_edge, S_step_edge, oomph::OcTreeNames::U, oomph::OcTreeNames::UB, oomph::OcTreeNames::UF, and oomph::OcTreeRoot::up_equivalent().

Referenced by doc_true_edge_neighbours(), oomph::PRefineableQElement< 3, INITIAL_NNODE_1D >::node_created_by_neighbour(), oomph::RefineableQElement< 3 >::node_created_by_neighbour(), oomph::PRefineableQElement< 3, INITIAL_NNODE_1D >::node_created_by_son_of_neighbour(), and oomph::PRefineableQElement< 3, INITIAL_NNODE_1D >::oc_hang_helper().

◆ mult_mat_mat()

void oomph::OcTree::mult_mat_mat ( const DenseMatrix< int > &  mat1,
const DenseMatrix< int > &  mat2,
DenseMatrix< int > &  mat3 
)
staticprivate

Helper function: Performs the operation : mat3=mat1*mat2.

Helper: Performs the operation Mat3=Mat1*Mat2.

Definition at line 664 of file octree.cc.

References i.

Referenced by rotate().

◆ mult_mat_vect()

void oomph::OcTree::mult_mat_vect ( const DenseMatrix< int > &  mat,
const Vector< int > &  vect1,
Vector< int > &  vect2 
)
staticprivate

Helper function: Performs the operation : vect2 = mat*vect1.

Helper: Performs the operation Vect2=Mat*Vect1.

Definition at line 687 of file octree.cc.

References i.

Referenced by rotate().

◆ node_number_to_vertex()

int oomph::OcTree::node_number_to_vertex ( const unsigned &  n,
const unsigned &  nnode1d 
)
static

Return the vertex [LDB,RDB,...] of local (vertex) node n in an element with nnode1d nodes in each coordinate direction.

Return the vertex of local (vertex) node n in an element with nnode1d nodes in each coordinate direction.

Definition at line 491 of file octree.cc.

References oomph::OcTreeNames::LDB, oomph::OcTreeNames::LDF, oomph::OcTreeNames::LUB, oomph::OcTreeNames::LUF, oomph::OcTreeNames::RDB, oomph::OcTreeNames::RDF, oomph::OcTreeNames::RUB, and oomph::OcTreeNames::RUF.

Referenced by oomph::OcTreeForest::construct_up_right_equivalents().

◆ operator=()

void oomph::OcTree::operator= ( const OcTree )
delete

Broken assignment operator.

◆ rotate() [1/2]

int oomph::OcTree::rotate ( const int &  new_up,
const int &  new_right,
const int &  dir 
)
static

If U[p] becomes new_up and R[ight] becomes new_right then the direction dir becomes rotate(new_up, new_right, dir)

A rotation is defined by the newUp and newRight directions; so if Up becomes newUp and Right becomes newRight then dir becomes rotate(newUp,newRight,dir);.

Definition at line 709 of file octree.cc.

References oomph::OcTreeNames::B, oomph::OcTreeNames::D, Direct_string, Direction_to_vector, oomph::OcTreeNames::F, oomph::BinaryTreeNames::L, oomph::BinaryTreeNames::R, rotate(), oomph::OcTreeNames::U, and Vector_to_direction.

◆ rotate() [2/2]

Vector< int > oomph::OcTree::rotate ( const int &  new_up,
const int &  new_right,
const Vector< int > &  dir 
)
static

If U[p] becomes new_up and R[ight] becomes new_right then the direction vector dir becomes rotate(new_up, new_right, dir)

This function rotates a vector according to a rotation of the axes that changes up to new_up and right to new_right.

Definition at line 750 of file octree.cc.

References oomph::OcTreeNames::B, construct_rotation_matrix(), oomph::OcTreeNames::D, Direct_string, oomph::OcTreeNames::F, i, oomph::BinaryTreeNames::L, mult_mat_mat(), mult_mat_vect(), oomph::BinaryTreeNames::R, and oomph::OcTreeNames::U.

Referenced by gteq_edge_neighbour(), gteq_face_neighbour(), gteq_true_edge_neighbour(), rotate(), and setup_static_data().

◆ self_test()

unsigned oomph::OcTree::self_test ( )

Self-test: Check all neighbours. Return success (0) if the max. distance between corresponding points in the neighbours is less than the tolerance specified in the static value Tree::Max_neighbour_finding_tolerance.

Self-test: Check neighbour finding routine. For each element in the tree and for each vertex, determine the distance between the vertex and its position in the neigbour. . If the difference is less than Tree::Max_neighbour_finding_tolerance. return success (0), otherwise failure (1)

Definition at line 4200 of file octree.cc.

References doc_face_neighbours(), doc_true_edge_neighbours(), i, oomph::Tree::Max_neighbour_finding_tolerance, oomph::oomph_info, and oomph::Tree::stick_all_tree_nodes_into_vector().

◆ setup_static_data()

void oomph::OcTree::setup_static_data ( )
static

◆ vertex_node_to_vector()

Vector< int > oomph::OcTree::vertex_node_to_vector ( const unsigned &  n,
const unsigned &  nnode1d 
)
staticprivate

Returns the vector of the coordinate directions of vertex node number n in an element with nnode1d element per dimension.

This function is used to translate the position of a vertex node (given by his local number n into a vector giving the position of this node in the local coordinates system. It also needs the value of nnode1d to work.

Definition at line 232 of file octree.cc.

Referenced by get_the_other_face().

◆ vertex_to_node_number()

unsigned oomph::OcTree::vertex_to_node_number ( const int &  vertex,
const unsigned &  nnode1d 
)
static

Return the local node number of given vertex [LDB,RDB,...] in an element with nnode1d nodes in each coordinate direction.

Return the local node number of given vertex in an element with nnode1d nodes in each coordinate direction.

Definition at line 414 of file octree.cc.

References Direct_string, oomph::OcTreeNames::LDB, oomph::OcTreeNames::LDF, oomph::OcTreeNames::LUB, oomph::OcTreeNames::LUF, oomph::OcTreeNames::RDB, oomph::OcTreeNames::RDF, oomph::OcTreeNames::RUB, and oomph::OcTreeNames::RUF.

Referenced by oomph::OcTreeForest::construct_up_right_equivalents(), and oomph::HelmholtzMGPreconditioner< DIM >::maximum_edge_width().

Member Data Documentation

◆ Colour

Vector< std::string > oomph::OcTree::Colour
staticprivate

Colours for neighbours in various directions.

Definition at line 540 of file octree.h.

Referenced by doc_face_neighbours(), doc_true_edge_neighbours(), and setup_static_data().

◆ Common_face

DenseMatrix< int > oomph::OcTree::Common_face
staticprivate

Determine common face of edges or octants. Slightly bizarre lookup scheme from Samet's book.

Definition at line 537 of file octree.h.

Referenced by gteq_edge_neighbour(), and setup_static_data().

◆ Cosi

Vector< int > oomph::OcTree::Cosi
staticprivate

Entry in rotation matrix: cos(i*90)

Definition at line 520 of file octree.h.

Referenced by construct_rotation_matrix(), and setup_static_data().

◆ Direct_string

Vector< std::string > oomph::OcTree::Direct_string
static

◆ Direction_to_vector

Vector< Vector< int > > oomph::OcTree::Direction_to_vector
static

◆ Is_adjacent

DenseMatrix< bool > oomph::OcTree::Is_adjacent
staticprivate

Array of direction/octant adjacency scheme: Is_adjacent(direction,octant): Is face/edge direction adjacent to octant octant ? (Table in Samet's book)

Array of direction/octant adjacency scheme: Is_adjacent(direction,octant): Is face/edge direction adjacent to octant octant ? Table in Samet's book.

Definition at line 529 of file octree.h.

Referenced by gteq_edge_neighbour(), gteq_face_neighbour(), and setup_static_data().

◆ Reflect

DenseMatrix< int > oomph::OcTree::Reflect
staticprivate

Reflection scheme: Reflect(direction,octant): Get mirror of octant/edge in specified direction. E.g. Reflect(LDF,L)=RDF.

Definition at line 533 of file octree.h.

Referenced by gteq_edge_neighbour(), gteq_face_neighbour(), and setup_static_data().

◆ Reflect_edge

Vector< int > oomph::OcTree::Reflect_edge
static

Get opposite edge, e.g. Reflect_edge[DB]=UF.

Definition at line 335 of file octree.h.

Referenced by gteq_true_edge_neighbour(), and setup_static_data().

◆ Reflect_face

Vector< int > oomph::OcTree::Reflect_face
static

Get opposite face, e.g. Reflect_face[L]=R.

Definition at line 332 of file octree.h.

Referenced by oomph::OcTreeForest::construct_up_right_equivalents(), gteq_face_neighbour(), and setup_static_data().

◆ Reflect_vertex

Vector< int > oomph::OcTree::Reflect_vertex
static

Get opposite vertex, e.g. Reflect_vertex[LDB]=RUF.

Definition at line 338 of file octree.h.

Referenced by setup_static_data().

◆ S_base

DenseMatrix< double > oomph::OcTree::S_base
staticprivate

s_base(i,direction): Initial value for coordinate s[i] on the face indicated by direction (L/R/U/D/F/B)

Definition at line 544 of file octree.h.

Referenced by doc_face_neighbours(), gteq_face_neighbour(), and setup_static_data().

◆ S_base_edge

DenseMatrix< double > oomph::OcTree::S_base_edge
staticprivate

S_base_edge(i,edge): Initial value for coordinate s[i] on the specified edge (LF/RF/...).

Definition at line 585 of file octree.h.

Referenced by doc_true_edge_neighbours(), gteq_true_edge_neighbour(), and setup_static_data().

◆ S_direct_edge

DenseMatrix< double > oomph::OcTree::S_direct_edge
staticprivate

Relative to the left/down/back vertex in any (father) octree, the corresponding vertex in the son specified by son_octant has an offset. If we project the son_octant's left/down/back vertex onto the father's edge edge, it is located at the in-face coordinate s_lo = h/2 S_direct_edge(edge,son_octant).

Definition at line 600 of file octree.h.

Referenced by gteq_edge_neighbour(), and setup_static_data().

◆ S_directhi

DenseMatrix< double > oomph::OcTree::S_directhi
staticprivate

Relative to the left/down/back vertex in any (father) octree, the corresponding vertex in the son specified by son_octant has an offset. If we project the son_octant's left/down/back vertex onto the father's face face, it is located at the in-face coordinate s_hi = h/2 S_directlhi(face,son_octant). [See discussion of s_steplo for an explanation of the subscripts _hi and _lo.].

Relative to the left/down/back vertex in any (father) octree, the corresponding vertex in the son specified by son_octant has an offset. If we project the son_octant's left/down/back vertex onto the father's face face, it is located at the in-face coordinate s_hi = h/2 S_directlhi(face,son_octant). [See discussion of S_steplo for an explanation of the subscripts _hi and _lo.].

Definition at line 581 of file octree.h.

Referenced by gteq_face_neighbour(), and setup_static_data().

◆ S_directlo

DenseMatrix< double > oomph::OcTree::S_directlo
staticprivate

Relative to the left/down/back vertex in any (father) octree, the corresponding vertex in the son specified by son_octant has an offset. If we project the son_octant's left/down/back vertex onto the father's face face, it is located at the in-face coordinate s_lo = h/2 S_directlo(face,son_octant). [See discussion of s_steplo for an explanation of the subscripts _hi and _lo.].

Relative to the left/down/back vertex in any (father) octree, the corresponding vertex in the son specified by son_octant has an offset. If we project the son_octant's left/down/back vertex onto the father's face face, it is located at the in-face coordinate s_lo = h/2 S_directlo(face,son_octant). [See discussion of S_steplo for an explanation of the subscripts _hi and _lo.].

Definition at line 573 of file octree.h.

Referenced by gteq_face_neighbour(), and setup_static_data().

◆ S_step_edge

DenseMatrix< double > oomph::OcTree::S_step_edge
staticprivate

Each edge of the RefineableQElement<3> that is represented by the octree is parametrised by one (of the three) local coordinates that parametrise the entire 3D element. If we're located on edge edge [DB,UB,...], then an increase in s from -1 to +1 corresponds to a change of s_step_edge(i,edge) in the 3D coordinates s[i].

Definition at line 593 of file octree.h.

Referenced by doc_true_edge_neighbours(), gteq_true_edge_neighbour(), and setup_static_data().

◆ S_stephi

DenseMatrix< double > oomph::OcTree::S_stephi
staticprivate

If we're located on face face [L/R/F/B/U/D], then an increase in s_hi from -1 to +1 corresponds to a change of s_stephi(i,face) in the 3D coordinate \ s[i]. [Read the discussion of s_steplo for an explanation of the subscripts _hi and _lo.].

If we're located on face face [L/R/F/B/U/D], then an increase in s_hi from -1 to +1 corresponds to a change of S_stephi(i,face) in the 3D coordinate \ s[i]. [Read the discussion of S_steplo for an explanation of the subscripts _hi and _lo.].

Definition at line 565 of file octree.h.

Referenced by doc_face_neighbours(), gteq_face_neighbour(), and setup_static_data().

◆ S_steplo

DenseMatrix< double > oomph::OcTree::S_steplo
staticprivate

Each face of the RefineableQElement<3> that is represented by the octree is parametrised by two (of the three) local coordinates that parametrise the entire 3D element. E.g. the B[ack] face is parametrised by (s[0], s[1]); the D[own] face is parametrised by (s[0],s[2]); etc. We always identify the in-face coordinate with the lower (3D) index with the subscript _lo and the one with the larger (3D) index with the subscript _hi. Here we set up the translation scheme between the 2D in-face coordinates (s_lo,s_hi) and the corresponding 3D coordinates: If we're located on face face [L/R/F/B/U/D], then an increase in s_lo from -1 to +1 corresponds to a change of s_steplo(i,face) in the 3D coordinate s[i].

Each face of the RefineableQElement<3> that is represented by the octree is parametrised by two (of the three) local coordinates that parametrise the entire 3D element. E.g. the B[ack] face is parametrised by (s[0], s[1]); the D[own] face is parametrised by (s[0],s[2]); etc. We always identify the in-face coordinate with the lower (3D) index with the subscript _lo and the one with the larger (3D) index with the subscript _hi. Here we set up the translation scheme between the 2D in-face coordinates (s_lo,s_hi) and the corresponding 3D coordinates: If we're located on face face [L/R/F/B/U/D], then an increase in s_lo from -1 to +1 corresponds to a change of S_steplo(i,face) in the 3D coordinate s[i]. S_steplo(i,direction)

Definition at line 558 of file octree.h.

Referenced by doc_face_neighbours(), gteq_face_neighbour(), and setup_static_data().

◆ Sini

Vector< int > oomph::OcTree::Sini
staticprivate

Entry in rotation matrix sin(i*90)

Entry in rotation matrix: sin(i*90)

Definition at line 523 of file octree.h.

Referenced by construct_rotation_matrix(), and setup_static_data().

◆ Static_data_has_been_setup

bool oomph::OcTree::Static_data_has_been_setup = false
staticprotected

Bool indicating that static member data has been setup.

Definition at line 412 of file octree.h.

Referenced by oomph::OcTreeRoot::OcTreeRoot(), and setup_static_data().

◆ Up_and_right_equivalent_for_pairs_of_vertices

std::map< std::pair< std::pair< int, int >, std::pair< int, int > >, std::pair< int, int > > oomph::OcTree::Up_and_right_equivalent_for_pairs_of_vertices
static

Storage for the up/right-equivalents corresponding to two pairs of vertices along an element edge:

  • The first pair contains
    1. the vertex in the reference element
    2. the corresponding vertex in the edge neighbour (i.e. the vertex in the edge neighbour that is located at the same position as that first vertex).
  • The second pair contains
    1. the vertex at the other end of the edge in the reference element
    2. the corresponding vertex in the edge neighbour.

These two pairs completely define the relative rotation between the reference element and its edge neighbour. The map returns a pair which contains the up_equivalent and the right_equivalent of the edge neighbour, i.e. it tells us which direction in the edge neighbour coincides with the up (or right) direction in the reference element.

Definition at line 377 of file octree.h.

Referenced by oomph::OcTreeForest::construct_up_right_equivalents(), and setup_static_data().

◆ Vector_to_direction

std::map< Vector< int >, int > oomph::OcTree::Vector_to_direction
static

Each vector representing a direction can be translated into a direction, either a son type (vertex), a face or an edge. E.g. : Vector_to_direction[(1,-1,1)]=RDF, Vector_to_direction[(0,1,0)]=U.

Map storing the information to translate a vector of directions (in the three coordinate directions) into a direction.

Definition at line 348 of file octree.h.

Referenced by oomph::RefineableQElement< 3 >::get_bcs(), oomph::RefineableSolidQElement< 3 >::get_solid_bcs(), get_the_other_face(), rotate(), oomph::RefineableQElement< 3 >::setup_father_bounds(), and setup_static_data().

◆ Vertex_at_end_of_edge

Vector< Vector< int > > oomph::OcTree::Vertex_at_end_of_edge
static

Vector of vectors containing the two vertices for each edge, e.g. Vertex_at_end_of_edge[LU][0]=LUB and Vertex_at_end_of_edge[LU][1]=LUF.

Map of vectors containing the two vertices for each edge.

Definition at line 343 of file octree.h.

Referenced by oomph::OcTreeForest::construct_up_right_equivalents(), and setup_static_data().


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