octree.h
Go to the documentation of this file.
1 // LIC// ====================================================================
2 // LIC// This file forms part of oomph-lib, the object-oriented,
3 // LIC// multi-physics finite-element library, available
4 // LIC// at http://www.oomph-lib.org.
5 // LIC//
6 // LIC// Copyright (C) 2006-2022 Matthias Heil and Andrew Hazel
7 // LIC//
8 // LIC// This library is free software; you can redistribute it and/or
9 // LIC// modify it under the terms of the GNU Lesser General Public
10 // LIC// License as published by the Free Software Foundation; either
11 // LIC// version 2.1 of the License, or (at your option) any later version.
12 // LIC//
13 // LIC// This library is distributed in the hope that it will be useful,
14 // LIC// but WITHOUT ANY WARRANTY; without even the implied warranty of
15 // LIC// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 // LIC// Lesser General Public License for more details.
17 // LIC//
18 // LIC// You should have received a copy of the GNU Lesser General Public
19 // LIC// License along with this library; if not, write to the Free Software
20 // LIC// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
21 // LIC// 02110-1301 USA.
22 // LIC//
23 // LIC// The authors may be contacted at oomph-lib@maths.man.ac.uk.
24 // LIC//
25 // LIC//====================================================================
26 #ifndef OOMPH_OCTREE_HEADER
27 #define OOMPH_OCTREE_HEADER
28 
29 // Config header generated by autoconfig
30 #ifdef HAVE_CONFIG_H
31 #include <oomph-lib-config.h>
32 #endif
33 
34 // OOMPH-LIB headers
35 #include "tree.h"
36 #include "matrices.h"
37 
38 namespace oomph
39 {
40  //====================================================================
41  // Namespace for OcTree directions
42  //====================================================================
43  namespace OcTreeNames
44  {
47  enum
48  {
49  LDB,
50  RDB,
51  LUB,
52  RUB, // back octants/vertices
53  LDF,
54  RDF,
55  LUF,
56  RUF, // front octants/vertices
57  LB,
58  RB,
59  DB,
60  UB, // back edges
61  LD,
62  RD,
63  LU,
64  RU, // side edges
65  LF,
66  RF,
67  DF,
68  UF, // front edges
69  L,
70  R,
71  D,
72  U,
73  B,
74  F, // faces
75  OMEGA = 26
76  };
77  } // namespace OcTreeNames
78 
79 
80  // Forward definitions
81  class OcTreeRoot;
82 
83  //================================================================
112  //=================================================================
113  class OcTree : public virtual Tree
114  {
115  public:
118  virtual ~OcTree() {}
119 
120 
122  OcTree(const OcTree& dummy) = delete;
123 
125  void operator=(const OcTree&) = delete;
126 
130  Tree* const& father_pt,
131  const int& son_type)
132  {
133  OcTree* temp_oc_pt = new OcTree(object_pt, father_pt, son_type);
134  return temp_oc_pt;
135  }
136 
138  // lies between, i.e. the faces to which it is a common edge
139  static Vector<int> faces_of_common_edge(const int& edge);
140 
183  OcTree* gteq_face_neighbour(const int& direction,
184  Vector<unsigned>& translate_s,
185  Vector<double>& s_sw,
186  Vector<double>& s_ne,
187  int& face,
188  int& diff_level,
189  bool& in_neighbouring_tree) const;
190 
247  OcTree* gteq_true_edge_neighbour(const int& direction,
248  const unsigned& i_root_edge_neighbour,
249  unsigned& nroot_edge_neighbour,
250  Vector<unsigned>& translate_s,
251  Vector<double>& s_lo,
252  Vector<double>& s_hi,
253  int& edge,
254  int& diff_level) const;
255 
256 
261  unsigned self_test();
262 
264  static void setup_static_data();
265 
266 
274  static void doc_face_neighbours(Vector<Tree*> forest_nodes_pt,
275  std::ofstream& neighbours_file,
276  std::ofstream& neighbours_txt_file,
277  double& max_error);
278 
279 
287  static void doc_true_edge_neighbours(Vector<Tree*> forest_nodes_pt,
288  std::ofstream& neighbours_file,
289  std::ofstream& no_true_edge_file,
290  std::ofstream& neighbours_txt_file,
291  double& max_error);
292 
298  static int get_the_other_face(const unsigned& n1,
299  const unsigned& n2,
300  const unsigned& nnode1d,
301  const int& face);
302 
306  static unsigned vertex_to_node_number(const int& vertex,
307  const unsigned& nnode1d);
308 
309 
312  static int node_number_to_vertex(const unsigned& n,
313  const unsigned& nnode1d);
314 
315 
318  static Vector<int> rotate(const int& new_up,
319  const int& new_right,
320  const Vector<int>& dir);
321 
322 
325  static int rotate(const int& new_up, const int& new_right, const int& dir);
326 
327 
330 
333 
336 
339 
344 
348  static std::map<Vector<int>, int> Vector_to_direction;
349 
354 
355 
375  static std::map<std::pair<std::pair<int, int>, std::pair<int, int>>,
376  std::pair<int, int>>
378 
379 
380  protected:
383  {
384  throw OomphLibError("Don't call empty constructor for OcTree!",
387  }
388 
396 
397 
405  Tree* const& father_pt,
406  const int& son_type)
408  {
409  }
410 
413 
414 
415  private:
437  OcTree* gteq_face_neighbour(const int& direction,
438  double& s_difflo,
439  double& s_diffhi,
440  int& diff_level,
441  bool& in_neighbouring_tree,
442  int max_level,
443  OcTreeRoot* orig_root_pt) const;
444 
445 
480  OcTree* gteq_edge_neighbour(const int& direction,
481  const unsigned& i_root_edge_neighbour,
482  unsigned& nroot_edge_neighbour,
483  double& s_diff,
484  int& diff_level,
485  int max_level,
486  OcTreeRoot* orig_root_pt) const;
487 
488 
491  bool edge_neighbour_is_face_neighbour(const int& edge,
492  OcTree* edge_neighb_pt) const;
493 
494 
497  static void construct_rotation_matrix(int& axis,
498  int& angle,
500 
502  static void mult_mat_vect(const DenseMatrix<int>& mat,
503  const Vector<int>& vect1,
504  Vector<int>& vect2);
505 
507  static void mult_mat_mat(const DenseMatrix<int>& mat1,
508  const DenseMatrix<int>& mat2,
509  DenseMatrix<int>& mat3);
510 
511 
515  static Vector<int> vertex_node_to_vector(const unsigned& n,
516  const unsigned& nnode1d);
517 
518 
521 
524 
525 
530 
534 
538 
541 
545 
559 
566 
574 
582 
586 
594 
601  };
602 
603 
604  //===================================================================
609  //==================================================================
610  class OcTreeRoot : public virtual OcTree, public virtual TreeRoot
611  {
612  private:
616  std::map<int, Vector<TreeRoot*>> Edge_neighbour_pt;
617 
627  std::map<TreeRoot*, int> Up_equivalent;
628 
635  std::map<TreeRoot*, int> Right_equivalent;
636 
637 
638  public:
643  {
644 #ifdef PARANOID
645  // Check that static member data has been set up
647  {
648  std::string error_message =
649  "Static member data hasn't been setup yet.\n";
650  error_message += "Call OcTree::setup_static_data() before creating\n";
651  error_message += "any OcTreeRoots\n";
652 
653  throw OomphLibError(
655  }
656 #endif
657  }
658 
659 
661  OcTreeRoot(const OcTreeRoot& dummy) = delete;
662 
664  void operator=(const OcTreeRoot&) = delete;
665 
668  Vector<TreeRoot*> edge_neighbour_pt(const unsigned& edge_direction)
669  {
670 #ifdef PARANOID
671  using namespace OcTreeNames;
672  if ((edge_direction != LB) && (edge_direction != RB) &&
673  (edge_direction != DB) && (edge_direction != UB) &&
674  (edge_direction != LD) && (edge_direction != RD) &&
675  (edge_direction != LU) && (edge_direction != RU) &&
676  (edge_direction != LF) && (edge_direction != RF) &&
677  (edge_direction != DF) && (edge_direction != UF))
678  {
679  std::ostringstream error_stream;
680  error_stream << "Wrong edge_direction: "
681  << Direct_string[edge_direction] << std::endl;
682  throw OomphLibError(
683  error_stream.str(), OOMPH_CURRENT_FUNCTION, OOMPH_EXCEPTION_LOCATION);
684  }
685 #endif
686 
687  return Edge_neighbour_pt[edge_direction];
688  }
689 
690 
693  unsigned nedge_neighbour(const unsigned& edge_direction)
694  {
695 #ifdef PARANOID
696  using namespace OcTreeNames;
697  if ((edge_direction != LB) && (edge_direction != RB) &&
698  (edge_direction != DB) && (edge_direction != UB) &&
699  (edge_direction != LD) && (edge_direction != RD) &&
700  (edge_direction != LU) && (edge_direction != RU) &&
701  (edge_direction != LF) && (edge_direction != RF) &&
702  (edge_direction != DF) && (edge_direction != UF))
703  {
704  std::ostringstream error_stream;
705  error_stream << "Wrong edge_direction: "
706  << Direct_string[edge_direction] << std::endl;
707  throw OomphLibError(
708  error_stream.str(), OOMPH_CURRENT_FUNCTION, OOMPH_EXCEPTION_LOCATION);
709  }
710 #endif
711  return Edge_neighbour_pt[edge_direction].size();
712  }
713 
716  void add_edge_neighbour_pt(TreeRoot* oc_tree_root_pt,
717  const unsigned& edge_direction)
718  {
719 #ifdef PARANOID
720  using namespace OcTreeNames;
721  if ((edge_direction != LB) && (edge_direction != RB) &&
722  (edge_direction != DB) && (edge_direction != UB) &&
723  (edge_direction != LD) && (edge_direction != RD) &&
724  (edge_direction != LU) && (edge_direction != RU) &&
725  (edge_direction != LF) && (edge_direction != RF) &&
726  (edge_direction != DF) && (edge_direction != UF))
727  {
728  std::ostringstream error_stream;
729  error_stream << "Wrong edge_direction: "
730  << Direct_string[edge_direction] << std::endl;
731  throw OomphLibError(
732  error_stream.str(), OOMPH_CURRENT_FUNCTION, OOMPH_EXCEPTION_LOCATION);
733  }
734 #endif
735 
737  find(Edge_neighbour_pt[edge_direction].begin(),
738  Edge_neighbour_pt[edge_direction].end(),
739  oc_tree_root_pt);
740  if (it == Edge_neighbour_pt[edge_direction].end())
741  {
742  Edge_neighbour_pt[edge_direction].push_back(oc_tree_root_pt);
743  }
744  }
745 
746 
757  int up_equivalent(TreeRoot* tree_root_pt)
758  {
759  if (direction_of_neighbour(tree_root_pt) == OMEGA)
760  {
761  return OMEGA;
762  }
763  else
764  {
765  return Up_equivalent[tree_root_pt];
766  }
767  }
768 
769 
779  void set_up_equivalent(TreeRoot* tree_root_pt, const int& dir)
780  {
781  Up_equivalent[tree_root_pt] = dir;
782  }
783 
784 
790  int right_equivalent(TreeRoot* tree_root_pt)
791  {
792  if (direction_of_neighbour(tree_root_pt) == OMEGA)
793  {
794  return OMEGA;
795  }
796  else
797  {
798  return Right_equivalent[tree_root_pt];
799  }
800  }
801 
806  void set_right_equivalent(TreeRoot* tree_root_pt, const int& dir)
807  {
808  Right_equivalent[tree_root_pt] = dir;
809  }
810 
814  int direction_of_neighbour(TreeRoot* octree_root_pt)
815  {
816  using namespace OcTreeNames;
817 
818  if (Neighbour_pt[U] == octree_root_pt)
819  {
820  return U;
821  }
822  if (Neighbour_pt[D] == octree_root_pt)
823  {
824  return D;
825  }
826  if (Neighbour_pt[L] == octree_root_pt)
827  {
828  return L;
829  }
830  if (Neighbour_pt[R] == octree_root_pt)
831  {
832  return R;
833  }
834  if (Neighbour_pt[F] == octree_root_pt)
835  {
836  return F;
837  }
838  if (Neighbour_pt[B] == octree_root_pt)
839  {
840  return B;
841  }
842 
843  if (Neighbour_pt[LB] == octree_root_pt)
844  {
845  return LB;
846  }
847  if (Neighbour_pt[RB] == octree_root_pt)
848  {
849  return RB;
850  }
851  if (Neighbour_pt[DB] == octree_root_pt)
852  {
853  return DB;
854  }
855  if (Neighbour_pt[UB] == octree_root_pt)
856  {
857  return UB;
858  }
859 
860  if (Neighbour_pt[LD] == octree_root_pt)
861  {
862  return LD;
863  }
864  if (Neighbour_pt[RD] == octree_root_pt)
865  {
866  return RD;
867  }
868  if (Neighbour_pt[LU] == octree_root_pt)
869  {
870  return LU;
871  }
872  if (Neighbour_pt[RU] == octree_root_pt)
873  {
874  return RU;
875  }
876 
877  if (Neighbour_pt[LF] == octree_root_pt)
878  {
879  return LF;
880  }
881  if (Neighbour_pt[RF] == octree_root_pt)
882  {
883  return RF;
884  }
885  if (Neighbour_pt[DF] == octree_root_pt)
886  {
887  return DF;
888  }
889  if (Neighbour_pt[UF] == octree_root_pt)
890  {
891  return UF;
892  }
893 
894 
895  // Search over all edge neighbours
896  for (int dir = LB; dir <= UF; dir++)
897  {
898  Vector<TreeRoot*> edge_neigh_pt = this->edge_neighbour_pt(dir);
899  unsigned n_neigh = edge_neigh_pt.size();
900  for (unsigned e = 0; e < n_neigh; e++)
901  {
902  if (edge_neigh_pt[e] == octree_root_pt)
903  {
904  return dir;
905  }
906  }
907  }
908 
909 
910  // If we get here, it's not a neighbour
911  return OMEGA;
912  }
913  };
914 
915 
919 
920 
921  //================================================================
926  //=================================================================
927  class OcTreeForest : public TreeForest
928  {
929  public:
932  OcTreeForest(Vector<TreeRoot*>& trees_pt);
933 
936  {
937  throw OomphLibError("Don't call empty constructor for OcTreeForest!",
940  }
941 
943  OcTreeForest(const OcTreeForest& dummy) = delete;
944 
946  void operator=(const OcTreeForest&) = delete;
947 
950  virtual ~OcTreeForest() {}
951 
952 
957  void check_all_neighbours(DocInfo& doc_info);
958 
961  void open_hanging_node_files(DocInfo& doc_info,
962  Vector<std::ofstream*>& output_stream);
963 
968  unsigned self_test();
969 
973  OcTreeRoot* octree_pt(const unsigned& i) const
974  {
975  return dynamic_cast<OcTreeRoot*>(Trees_pt[i]);
976  }
977 
982  OcTreeRoot* oc_face_neigh_pt(const unsigned& i, const int& direction)
983  {
984 #ifdef PARANOID
985  using namespace OcTreeNames;
986  if ((direction != U) && (direction != D) && (direction != F) &&
987  (direction != B) && (direction != L) && (direction != R))
988  {
989  std::ostringstream error_stream;
990  error_stream << "Wrong edge_direction: "
991  << OcTree::Direct_string[direction] << std::endl;
992  throw OomphLibError(
993  error_stream.str(), OOMPH_CURRENT_FUNCTION, OOMPH_EXCEPTION_LOCATION);
994  }
995 #endif
996  return dynamic_cast<OcTreeRoot*>(Trees_pt[i]->neighbour_pt(direction));
997  }
998 
1002  Vector<TreeRoot*> oc_edge_neigh_pt(const unsigned& i, const int& direction)
1003  {
1004  // Note: paranoia check is done in edge_neighbour_pt
1005  return dynamic_cast<OcTreeRoot*>(Trees_pt[i])
1006  ->edge_neighbour_pt(direction);
1007  }
1008 
1010  void construct_up_right_equivalents();
1011 
1012  private:
1014  void find_neighbours();
1015  };
1016 
1017 } // namespace oomph
1018 
1019 #endif
int i
Definition: BiCGSTAB_step_by_step.cpp:9
const unsigned n
Definition: CG3DPackingUnitTest.cpp:11
Array< double, 1, 3 > e(1./3., 0.5, 2.)
MatrixXd L
Definition: LLT_example.cpp:6
@ R
Definition: StatisticsVector.h:21
MatrixXd mat1(size, size)
Definition: oomph_utilities.h:499
Definition: matrices.h:74
Definition: octree.h:928
OcTreeForest()
Default constructor (empty and broken)
Definition: octree.h:935
OcTreeForest(const OcTreeForest &dummy)=delete
Broken copy constructor.
Vector< TreeRoot * > oc_edge_neigh_pt(const unsigned &i, const int &direction)
Definition: octree.h:1002
OcTreeRoot * oc_face_neigh_pt(const unsigned &i, const int &direction)
Definition: octree.h:982
OcTreeRoot * octree_pt(const unsigned &i) const
Definition: octree.h:973
virtual ~OcTreeForest()
Definition: octree.h:950
void operator=(const OcTreeForest &)=delete
Broken assignment operator.
Definition: octree.h:611
std::map< TreeRoot *, int > Up_equivalent
Definition: octree.h:627
OcTreeRoot(const OcTreeRoot &dummy)=delete
Broken copy constructor.
int right_equivalent(TreeRoot *tree_root_pt)
Definition: octree.h:790
OcTreeRoot(RefineableElement *const &object_pt)
Definition: octree.h:641
void operator=(const OcTreeRoot &)=delete
Broken assignment operator.
int direction_of_neighbour(TreeRoot *octree_root_pt)
Definition: octree.h:814
std::map< TreeRoot *, int > Right_equivalent
Definition: octree.h:635
void set_up_equivalent(TreeRoot *tree_root_pt, const int &dir)
Definition: octree.h:779
void add_edge_neighbour_pt(TreeRoot *oc_tree_root_pt, const unsigned &edge_direction)
Definition: octree.h:716
int up_equivalent(TreeRoot *tree_root_pt)
Definition: octree.h:757
void set_right_equivalent(TreeRoot *tree_root_pt, const int &dir)
Definition: octree.h:806
Vector< TreeRoot * > edge_neighbour_pt(const unsigned &edge_direction)
Definition: octree.h:668
unsigned nedge_neighbour(const unsigned &edge_direction)
Definition: octree.h:693
std::map< int, Vector< TreeRoot * > > Edge_neighbour_pt
Definition: octree.h:616
Definition: octree.h:114
static DenseMatrix< double > S_step_edge
Definition: octree.h:593
static Vector< std::string > Colour
Colours for neighbours in various directions.
Definition: octree.h:540
static DenseMatrix< double > S_base
Definition: octree.h:544
static DenseMatrix< double > S_directhi
Definition: octree.h:581
void operator=(const OcTree &)=delete
Broken assignment operator.
static DenseMatrix< bool > Is_adjacent
Definition: octree.h:529
static Vector< int > rotate(const int &new_up, const int &new_right, const Vector< int > &dir)
Definition: octree.cc:750
static Vector< int > faces_of_common_edge(const int &edge)
Function that, given an edge, returns the two faces on which it.
Definition: octree.cc:268
OcTree(RefineableElement *const &object_pt)
Definition: octree.h:395
OcTree(const OcTree &dummy)=delete
Broken copy constructor.
static Vector< std::string > Direct_string
Translate (enumerated) directions into strings.
Definition: octree.h:329
static DenseMatrix< double > S_directlo
Definition: octree.h:573
Tree * construct_son(RefineableElement *const &object_pt, Tree *const &father_pt, const int &son_type)
Definition: octree.h:129
static int node_number_to_vertex(const unsigned &n, const unsigned &nnode1d)
Definition: octree.cc:491
static void mult_mat_vect(const DenseMatrix< int > &mat, const Vector< int > &vect1, Vector< int > &vect2)
Helper function: Performs the operation : vect2 = mat*vect1.
Definition: octree.cc:687
static DenseMatrix< int > Common_face
Definition: octree.h:537
static Vector< int > Reflect_face
Get opposite face, e.g. Reflect_face[L]=R.
Definition: octree.h:332
static Vector< int > Sini
Entry in rotation matrix sin(i*90)
Definition: octree.h:523
virtual ~OcTree()
Definition: octree.h:118
static void setup_static_data()
Setup the static data, rotation and reflection schemes, etc.
Definition: octree.cc:1040
unsigned self_test()
Definition: octree.cc:4200
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
Definition: octree.cc:3373
static Vector< int > vertex_node_to_vector(const unsigned &n, const unsigned &nnode1d)
Definition: octree.cc:232
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)
Definition: octree.cc:4552
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
Definition: octree.h:377
static DenseMatrix< double > S_base_edge
Definition: octree.h:585
static Vector< int > Cosi
Entry in rotation matrix: cos(i*90)
Definition: octree.h:520
static DenseMatrix< int > Reflect
Definition: octree.h:533
static int get_the_other_face(const unsigned &n1, const unsigned &n2, const unsigned &nnode1d, const int &face)
Definition: octree.cc:565
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
Definition: octree.cc:3618
bool edge_neighbour_is_face_neighbour(const int &edge, OcTree *edge_neighb_pt) const
Definition: octree.cc:2769
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
Definition: octree.cc:4015
OcTree()
Default constructor (empty and broken)
Definition: octree.h:382
static DenseMatrix< double > S_direct_edge
Definition: octree.h:600
static Vector< int > Reflect_vertex
Get opposite vertex, e.g. Reflect_vertex[LDB]=RUF.
Definition: octree.h:338
static Vector< Vector< int > > Vertex_at_end_of_edge
Map of vectors containing the two vertices for each edge.
Definition: octree.h:343
static void construct_rotation_matrix(int &axis, int &angle, DenseMatrix< int > &mat)
Definition: octree.cc:609
static void mult_mat_mat(const DenseMatrix< int > &mat1, const DenseMatrix< int > &mat2, DenseMatrix< int > &mat3)
Helper function: Performs the operation : mat3=mat1*mat2.
Definition: octree.cc:664
static bool Static_data_has_been_setup
Bool indicating that static member data has been setup.
Definition: octree.h:412
static DenseMatrix< double > S_stephi
Definition: octree.h:565
static Vector< Vector< int > > Direction_to_vector
Definition: octree.h:353
static Vector< int > Reflect_edge
Get opposite edge, e.g. Reflect_edge[DB]=UF.
Definition: octree.h:335
static std::map< Vector< int >, int > Vector_to_direction
Definition: octree.h:348
static DenseMatrix< double > S_steplo
Definition: octree.h:558
static unsigned vertex_to_node_number(const int &vertex, const unsigned &nnode1d)
Definition: octree.cc:414
OcTree(RefineableElement *const &object_pt, Tree *const &father_pt, const int &son_type)
Definition: octree.h:404
static void doc_face_neighbours(Vector< Tree * > forest_nodes_pt, std::ofstream &neighbours_file, std::ofstream &neighbours_txt_file, double &max_error)
Definition: octree.cc:4275
Definition: oomph_definitions.h:222
Definition: refineable_elements.h:97
Definition: tree.h:409
Definition: tree.h:324
std::map< int, TreeRoot * > Neighbour_pt
Definition: tree.h:330
Definition: tree.h:74
RefineableElement * object_pt() const
Definition: tree.h:88
Tree * father_pt() const
Return pointer to father: NULL if it's a root node.
Definition: tree.h:235
int son_type() const
Return son type.
Definition: tree.h:214
static const int OMEGA
Default value for an unassigned neighbour.
Definition: tree.h:262
static constexpr lastp1_t end
Definition: IndexedViewHelper.h:79
double angle(const double &t)
Angular position as a function of time t.
Definition: jeffery_orbit.cc:98
double max_error
Definition: MortaringCantileverCompareToNonMortaring.cpp:188
std::string string(const unsigned &i)
Definition: oomph_definitions.cc:286
@ RDF
Definition: octree.h:54
@ DF
Definition: octree.h:67
@ RD
Definition: octree.h:62
@ B
Definition: octree.h:73
@ RUB
Definition: octree.h:52
@ D
Definition: octree.h:71
@ L
Definition: octree.h:69
@ RB
Definition: octree.h:58
@ R
Definition: octree.h:70
@ UF
Definition: octree.h:68
@ LUF
Definition: octree.h:55
@ RU
Definition: octree.h:64
@ F
Definition: octree.h:74
@ LDF
Definition: octree.h:53
@ LF
Definition: octree.h:65
@ RDB
Definition: octree.h:50
@ LD
Definition: octree.h:61
@ LUB
Definition: octree.h:51
@ U
Definition: octree.h:72
@ RUF
Definition: octree.h:56
@ RF
Definition: octree.h:66
@ LDB
Definition: octree.h:49
@ OMEGA
Definition: octree.h:75
@ LU
Definition: octree.h:63
@ DB
Definition: octree.h:59
@ UB
Definition: octree.h:60
@ LB
Definition: octree.h:57
DRAIG: Change all instances of (SPATIAL_DIM) to (DIM-1).
Definition: AnisotropicHookean.h:10
#define OOMPH_EXCEPTION_LOCATION
Definition: oomph_definitions.h:61
#define OOMPH_CURRENT_FUNCTION
Definition: oomph_definitions.h:86