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

#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)
 Broken copy constructor. More...
 
void operator= (const OcTree &)
 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) 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)
 Broken copy constructor. More...
 
void operator= (const Tree &)
 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. 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 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. 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, 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)
 
- 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 99 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 106 of file octree.h.

◆ OcTree() [1/4]

oomph::OcTree::OcTree ( const OcTree dummy)
inline

Broken copy constructor.

Definition at line 110 of file octree.h.

References oomph::BrokenCopy::broken_copy().

◆ OcTree() [2/4]

oomph::OcTree::OcTree ( )
inlineprotected

Default constructor (empty and broken)

Definition at line 371 of file octree.h.

◆ 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 385 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 394 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 476 of file octree.cc.

References oomph::VectorHelpers::angle(), Cosi, oomph::OcTreeNames::F, i, oomph::BinaryTreeNames::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 124 of file octree.h.

References oomph::self_test().

◆ 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 neighhbouring element. If the two filestreams are closed, output is suppressed. (Static function.)

Definition at line 4099 of file octree.cc.

References Colour, Direct_string, oomph::OcTreeNames::F, oomph::FiniteElement::get_x(), gteq_face_neighbour(), i, oomph::BinaryTreeNames::L, oomph::Tree::Max_neighbour_finding_tolerance, oomph::RefineableElement::nodes_built(), oomph::RefineableElement::number(), oomph::Tree::object_pt(), oomph::Tree::OMEGA, oomph::oomph_info, oomph::pause(), 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 neighhbouring element. If the two filestreams are closed, output is suppressed. (Static function).

Definition at line 4356 of file octree.cc.

References Colour, Direct_string, oomph::FiniteElement::get_x(), gteq_true_edge_neighbour(), i, oomph::Tree::is_leaf(), oomph::OcTreeNames::LB, oomph::Tree::Max_neighbour_finding_tolerance, oomph::RefineableElement::nodes_built(), oomph::RefineableElement::number(), oomph::Tree::object_pt(), oomph::Tree::OMEGA, oomph::oomph_info, oomph::pause(), 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

◆ 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 433 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!

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 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 3832 of file octree.cc.

References Common_face, oomph::OcTreeNames::DB, oomph::OcTreeNames::DF, Direct_string, oomph::Tree::Father_pt, 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_true_edge_neighbour().

◆ gteq_face_neighbour() [1/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 
) 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.

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 3167 of file octree.cc.

References oomph::OcTreeNames::B, oomph::OcTreeNames::D, Direct_string, Direction_to_vector, oomph::OcTreeNames::F, 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(), and gteq_face_neighbour().

◆ gteq_face_neighbour() [2/2]

OcTree * oomph::OcTree::gteq_face_neighbour ( const int &  direction,
double &  s_difflo,
double &  s_diffhi,
int &  diff_level,
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.

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 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 3645 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::TreeRoot::neighbour_pt(), oomph::BinaryTreeNames::R, Reflect, oomph::Tree::Root_pt, rotate(), S_directhi, S_directlo, oomph::Tree::Son_type, and oomph::OcTreeNames::U.

◆ 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]).

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.

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:

  • 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 3416 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().

◆ 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 509 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 533 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.

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

in an element with nnode1d nodes in each coordinate direction.

Definition at line 375 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 )
inline

Broken assignment operator.

Definition at line 116 of file octree.h.

References oomph::BrokenCopy::broken_assign().

◆ rotate() [1/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 604 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().

◆ rotate() [2/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 557 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.

◆ 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 4022 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 245 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 289 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().

Member Data Documentation

◆ Colour

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

Colours for neighbours in various directions.

Definition at line 530 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.

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

Definition at line 527 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 510 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 519 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.

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

Definition at line 523 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 324 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 321 of file octree.h.

Referenced by 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 327 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)

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 534 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/...).

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

Definition at line 575 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).

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 590 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 571 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 563 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].

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 583 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 555 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 548 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 513 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 400 of file octree.h.

Referenced by 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 365 of file octree.h.

Referenced by 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 337 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 332 of file octree.h.

Referenced by setup_static_data().


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