refineable_tetgen_mesh.template.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 
27 #ifndef OOMPH_REFINEABLE_TETGEN_MESH_HEADER
28 #define OOMPH_REFINEABLE_TETGEN_MESH_HEADER
29 
30 // Config header generated by autoconfig
31 #ifdef HAVE_CONFIG_H
32 #include <oomph-lib-config.h>
33 #endif
34 
35 
36 #include "../generic/tetgen_scaffold_mesh.h"
37 #include "../generic/tet_mesh.h"
38 #include "../generic/refineable_mesh.h"
39 #include "tetgen_mesh.template.h"
40 
41 namespace oomph
42 {
43  //=========================================================================
44  // Unstructured refineable TetgenMesh
45  //=========================================================================
46  template<class ELEMENT>
47  class RefineableTetgenMesh : public virtual TetgenMesh<ELEMENT>,
48  public virtual RefineableTetMeshBase
49  {
50  public:
56  TetMeshFacetedClosedSurface* const& outer_boundary_pt,
57  Vector<TetMeshFacetedSurface*>& internal_closed_surface_pt,
58  const double& element_volume,
59  TimeStepper* time_stepper_pt = &Mesh::Default_TimeStepper,
60  const bool& use_attributes = false,
61  const bool& split_corner_elements = false,
62  Vector<double>* const& target_element_volume_in_region_pt = nullptr)
63  : TetgenMesh<ELEMENT>(outer_boundary_pt,
64  internal_closed_surface_pt,
65  element_volume,
66  time_stepper_pt,
67  use_attributes,
68  split_corner_elements,
69  target_element_volume_in_region_pt),
70  Corner_elements_must_be_split(split_corner_elements)
71  {
72  // Initialise the data associated with adaptation
74  }
75 
76 
77  protected:
83  const Vector<double>& target_volume,
84  tetgenio* const& tetgen_io_pt,
85  TetMeshFacetedClosedSurface* const& outer_boundary_pt,
86  Vector<TetMeshFacetedSurface*>& internal_surface_pt,
87  TimeStepper* time_stepper_pt = &Mesh::Default_TimeStepper,
88  const bool& use_attributes = false)
89  {
90  // NOTE THERE IS A CERTAIN AMOUNT OF DUPLICATION BETWEEN THE
91  // CODE IN HERE AND THE ONE IN THE CONSTRUCTOR OF THE TetgenMesh
92  // BUT THE FACT THAT WE HAVE TO MODIFY THE TETGENIO STRUCTURE
93  // MEANS WE CAN'T QUITE RECYCLE THIS.
94 
95  // Mesh can only be built with 3D Telements.
96  MeshChecker::assert_geometric_element<TElementGeometricBase, ELEMENT>(3);
97 
98  // Initialise the data associated with adaptation
100 
101  // Store Timestepper used to build elements
102  this->Time_stepper_pt = time_stepper_pt;
103 
104  // Triangulation has been created -- remember to wipe it!
105  this->Tetgenio_exists = true;
106  this->Tetgenio_pt = new tetgenio;
107 
108  // Add the volume constraints to the tetgenio data object.
109  // Note that since the tetgenio structure is referred to by pointer
110  // we're also modifying the one associated with the (still existing)
111  // original mesh. Bit naughty but shouldn't cause any problems
112  // since that mesh is already built and about to go out of scope
113  // anyway.
114 
115  // Create a local copy
116  tetgenio* tetgen_input_pt = new tetgenio;
117  ;
118  this->deep_copy_of_tetgenio(tetgen_io_pt, tetgen_input_pt);
119 
120  // Add volume constraints
121  tetgen_input_pt->tetrahedronvolumelist =
122  new double[tetgen_input_pt->numberoftetrahedra];
123  for (int e = 0; e < tetgen_input_pt->numberoftetrahedra; ++e)
124  {
125  tetgen_input_pt->tetrahedronvolumelist[e] = target_volume[e];
126  }
127 
128  // Input string
129  std::stringstream input_string_stream;
130  input_string_stream << "Vqra";
131 
132  // Convert to a *char
133  char tetswitches[100];
134  sprintf(tetswitches, "%s", input_string_stream.str().c_str());
135 
136  // Build triangulateio refined object
137  tetrahedralize(tetswitches, tetgen_input_pt, this->Tetgenio_pt);
138  // Build scaffold
139  this->Tmp_mesh_pt = new TetgenScaffoldMesh(*this->Tetgenio_pt);
140 
141  // Convert mesh from scaffold to actual mesh
142  this->build_from_scaffold(time_stepper_pt, use_attributes);
143 
144  // Kill the scaffold
145  delete this->Tmp_mesh_pt;
146  this->Tmp_mesh_pt = 0;
147 
148  // delete the input
149  delete tetgen_input_pt;
150 
151  // Store the boundary
152  this->Outer_boundary_pt = outer_boundary_pt;
153  // Setup the reverse lookup scheme
155  this->Outer_boundary_pt);
156  // Store the internal boundary
157  this->Internal_surface_pt = internal_surface_pt;
158  // Setup the reverse lookup schemes
159  {
160  unsigned n = this->Internal_surface_pt.size();
161  for (unsigned i = 0; i < n; i++)
162  {
164  this->Internal_surface_pt[i]);
165  }
166  }
167 
168  // Setup boundary coordinates for boundaries
169  unsigned nb = nboundary();
170  for (unsigned b = 0; b < nb; b++)
171  {
172  this->template setup_boundary_coordinates<ELEMENT>(b);
173  }
174 
175  // Now snap onto geometric objects associated with triangular facets
176  // (if any!)
178  }
179 
180 
181  public:
184 
187  {
188  // hierher do it
189  throw OomphLibError("refine_uniformly() not implemented yet",
192  }
193 
198  {
199  // hierher do it
200  throw OomphLibError("unrefine_uniformly() not implemented yet",
203  // dummy return
204  return 0;
205  }
206 
208  void adapt(const Vector<double>& elem_error);
209 
210 
213  {
214  return Projection_is_disabled;
215  }
216 
219  {
220  Projection_is_disabled = true;
221  }
222 
225  {
226  Projection_is_disabled = false;
227  }
228 
229 
230  protected:
233  {
234  // Set max and min targets for adaptation
235  this->Max_element_size = 1.0;
236  this->Min_element_size = 0.001;
237  this->Max_permitted_edge_ratio = 2.0;
238 
240  Projection_is_disabled = false;
241  }
242 
243  // Update the surface
245  TetMeshFacetedSurface*& faceted_surface_pt);
246 
247  // Update the inner hole
249 
252  const unsigned& b);
253 
256 
261  };
262 
266 
267 
268  //=========================================================================
269  // Unstructured refineable Tetgen Mesh upgraded to solid mesh
270  //=========================================================================
271  template<class ELEMENT>
273  : public virtual RefineableTetgenMesh<ELEMENT>,
274  public virtual SolidMesh
275  {
276  public:
281  TetMeshFacetedClosedSurface* const& outer_boundary_pt,
282  Vector<TetMeshFacetedSurface*>& internal_closed_surface_pt,
283  const double& element_volume,
284  TimeStepper* time_stepper_pt = &Mesh::Default_TimeStepper,
285  const bool& use_attributes = false,
286  const bool& split_corner_elements = false)
287  : TetgenMesh<ELEMENT>(outer_boundary_pt,
288  internal_closed_surface_pt,
289  element_volume,
290  time_stepper_pt,
291  use_attributes,
292  split_corner_elements),
293  RefineableTetgenMesh<ELEMENT>(outer_boundary_pt,
294  internal_closed_surface_pt,
295  element_volume,
296  time_stepper_pt,
297  use_attributes,
298  split_corner_elements)
299 
300  {
301  // Assign the Lagrangian coordinates
302  set_lagrangian_nodal_coordinates();
303  }
304 
305 
309  const Vector<double>& target_volume,
310  tetgenio* const& tetgen_io_pt,
311  TetMeshFacetedClosedSurface* const& outer_boundary_pt,
312  Vector<TetMeshFacetedSurface*>& internal_surface_pt,
313  TimeStepper* time_stepper_pt = &Mesh::Default_TimeStepper,
314  const bool& use_attributes = false)
315  : RefineableTetgenMesh<ELEMENT>(target_volume,
316  tetgen_io_pt,
317  outer_boundary_pt,
318  internal_surface_pt,
319  time_stepper_pt,
320  use_attributes)
321 
322  {
323  // Assign the Lagrangian coordinates
324  set_lagrangian_nodal_coordinates();
325  }
326 
329  };
330 
331 
332 } // namespace oomph
333 
334 #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.)
Scalar * b
Definition: benchVecAdd.cpp:17
Definition: oomph_utilities.h:499
static Steady< 0 > Default_TimeStepper
The Steady Timestepper.
Definition: mesh.h:75
unsigned nboundary() const
Return number of boundaries.
Definition: mesh.h:827
Definition: oomph_definitions.h:222
DocInfo doc_info()
Access fct for DocInfo.
Definition: refineable_mesh.h:243
Definition: uns_adapt_3d_fs.cc:1258
RefineableSolidTetgenMesh(const Vector< double > &target_volume, tetgenio *const &tetgen_io_pt, TetMeshFacetedClosedSurface *const &outer_boundary_pt, Vector< TetMeshFacetedSurface * > &internal_surface_pt, TimeStepper *time_stepper_pt=&Mesh::Default_TimeStepper, const bool &use_attributes=false)
Definition: refineable_tetgen_mesh.template.h:308
RefineableSolidTetgenMesh(TetMeshFacetedClosedSurface *const &outer_boundary_pt, Vector< TetMeshFacetedSurface * > &internal_closed_surface_pt, const double &element_volume, TimeStepper *time_stepper_pt=&Mesh::Default_TimeStepper, const bool &use_attributes=false, const bool &split_corner_elements=false)
Definition: refineable_tetgen_mesh.template.h:280
virtual ~RefineableSolidTetgenMesh()
Empty Destructor.
Definition: refineable_tetgen_mesh.template.h:328
Definition: uns_adapt_3d_fs.cc:86
void surface_remesh_for_inner_hole_boundaries()
bool Projection_is_disabled
Disable projection of solution onto new mesh during adaptation.
Definition: refineable_tetgen_mesh.template.h:255
bool projection_is_disabled()
Is projection of old solution onto new mesh disabled?
Definition: refineable_tetgen_mesh.template.h:212
void refine_uniformly(DocInfo &doc_info)
Refine mesh uniformly and doc process.
Definition: refineable_tetgen_mesh.template.h:186
bool Corner_elements_must_be_split
Definition: refineable_tetgen_mesh.template.h:260
void initialise_adaptation_data()
Helper function to initialise data associated with adaptation.
Definition: uns_adapt_3d_fs.cc:589
void enable_projection()
Disable projection of old solution onto new mesh.
Definition: refineable_tetgen_mesh.template.h:224
RefineableTetgenMesh(TetMeshFacetedClosedSurface *const &outer_boundary_pt, Vector< TetMeshFacetedSurface * > &internal_closed_surface_pt, const double &element_volume, TimeStepper *time_stepper_pt=&Mesh::Default_TimeStepper, const bool &use_attributes=false, const bool &split_corner_elements=false, Vector< double > *const &target_element_volume_in_region_pt=nullptr)
Definition: refineable_tetgen_mesh.template.h:55
virtual ~RefineableTetgenMesh()
Empty Destructor.
Definition: refineable_tetgen_mesh.template.h:183
void update_faceted_surface_using_face_mesh(TetMeshFacetedClosedSurface *faceted_surface_pt)
Definition: uns_adapt_3d_fs.cc:250
void snap_nodes_onto_boundary(RefineableTetgenMesh< ELEMENT > *&new_mesh_pt, const unsigned &b)
Snap the boundary nodes onto any curvilinear boundaries.
double Max_element_size
Max permitted element size.
Definition: uns_adapt_3d_fs.cc:734
double Min_element_size
Min permitted element size.
Definition: uns_adapt_3d_fs.cc:737
double Max_permitted_edge_ratio
Max edge ratio before remesh gets triggered.
Definition: uns_adapt_3d_fs.cc:740
void adapt(const Vector< double > &elem_error)
Adapt mesh, based on elemental error provided.
unsigned unrefine_uniformly()
Definition: refineable_tetgen_mesh.template.h:197
RefineableTetgenMesh(const Vector< double > &target_volume, tetgenio *const &tetgen_io_pt, TetMeshFacetedClosedSurface *const &outer_boundary_pt, Vector< TetMeshFacetedSurface * > &internal_surface_pt, TimeStepper *time_stepper_pt=&Mesh::Default_TimeStepper, const bool &use_attributes=false)
Definition: refineable_tetgen_mesh.template.h:82
void disable_projection()
Disable projection of old solution onto new mesh.
Definition: refineable_tetgen_mesh.template.h:218
Definition: mesh.h:2562
void snap_nodes_onto_geometric_objects()
Definition: tet_mesh.cc:483
TimeStepper * Time_stepper_pt
Timestepper used to build nodes.
Definition: tet_mesh.h:1057
Vector< TetMeshFacetedSurface * > Internal_surface_pt
Vector to faceted surfaces that define internal boundaries.
Definition: tet_mesh.h:1041
TetMeshFacetedClosedSurface * Outer_boundary_pt
Faceted surface that defines outer boundaries.
Definition: tet_mesh.h:1038
Definition: tet_mesh.h:538
Definition: tet_mesh.h:306
Definition: tetgen_mesh.template.h:52
tetgenio * Tetgenio_pt
Tetgen representation of mesh.
Definition: tetgen_mesh.template.h:720
void setup_reverse_lookup_schemes_for_faceted_surface(TetMeshFacetedSurface *const &faceted_surface_pt)
Function to setup the reverse look-up schemes.
Definition: tetgen_mesh.template.cc:828
void deep_copy_of_tetgenio(tetgenio *const &input_pt, tetgenio *&output_pt)
Definition: tetgen_mesh.template.cc:865
bool Tetgenio_exists
Definition: tetgen_mesh.template.h:717
TetgenScaffoldMesh * Tmp_mesh_pt
Temporary scaffold mesh.
Definition: tetgen_mesh.template.h:713
void build_from_scaffold(TimeStepper *time_stepper_pt, const bool &use_attributes)
Build mesh from scaffold.
Definition: tetgen_mesh.template.cc:48
Definition: tetgen_scaffold_mesh.h:43
Definition: timesteppers.h:231
Definition: tetgen.h:201
REAL * tetrahedronvolumelist
Definition: tetgen.h:323
int numberoftetrahedra
Definition: tetgen.h:325
int nb
Definition: level2_impl.h:286
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
void tetrahedralize(tetgenbehavior *b, tetgenio *in, tetgenio *out, tetgenio *addin=NULL, tetgenio *bgmin=NULL)