27#ifndef OOMPH_REFINEABLE_TETGEN_MESH_HEADER
28#define OOMPH_REFINEABLE_TETGEN_MESH_HEADER
32#include <oomph-lib-config.h>
35#include "generic/tetgen_scaffold_mesh.h"
36#include "generic/tet_mesh.h"
37#include "generic/refineable_mesh.h"
45 template<
class ELEMENT>
47 public virtual RefineableTetMeshBase
57 const double& element_volume,
95 MeshChecker::assert_geometric_element<TElementGeometricBase, ELEMENT>(3);
152 delete tetgen_input_pt;
155 this->Outer_boundary_pt = outer_boundary_pt;
159 unsigned n_facet = this->Outer_boundary_pt->nfacet();
162 unsigned b = this->Outer_boundary_pt->one_based_facet_boundary_id(
f);
167 this->Outer_boundary_pt->facet_pt(
f);
172 error_message <<
"Boundary IDs have to be one-based. Yours is " <<
b
182 this->Internal_surface_pt = internal_surface_pt;
186 unsigned n = this->Internal_surface_pt.size();
187 for (
unsigned i = 0;
i <
n;
i++)
189 unsigned n_facet = this->Internal_surface_pt[
i]->nfacet();
193 this->Internal_surface_pt[
i]->one_based_facet_boundary_id(
f);
197 this->Internal_surface_pt[
i];
199 this->Internal_surface_pt[
i]->facet_pt(
f);
204 error_message <<
"Boundary IDs have to be one-based. Yours is "
216 for (
unsigned b = 0;
b <
nb;
b++)
234 throw OomphLibError(
"refine_uniformly() not implemented yet",
245 throw OomphLibError(
"unrefine_uniformly() not implemented yet",
278 this->Max_element_size = 1.0;
279 this->Min_element_size = 0.001;
280 this->Max_permitted_edge_ratio = 2.0;
314 template<
class ELEMENT>
317 public virtual SolidMesh
326 const double& element_volume,
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)
Build mesh from specified triangulation and associated target areas for elements in it.
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)
Build mesh, based on closed curve that specifies the outer boundary of the domain and any number of i...
virtual ~RefineableSolidTetgenMesh()
Empty Destructor.
void surface_remesh_for_inner_hole_boundaries()
Generate a new faceted representation of the inner hole boundaries.
bool Projection_is_disabled
Disable projection of solution onto new mesh during adaptation.
bool projection_is_disabled()
Is projection of old solution onto new mesh disabled?
void update_faceted_surface_using_face_mesh(TetMeshFacetedSurface *&faceted_surface_pt)
Helper function that updates the input faceted surface by using the flattened elements from FaceMesh(...
void refine_uniformly(DocInfo &doc_info)
Refine mesh uniformly and doc process.
bool Corner_elements_must_be_split
Corner elements which have all of their nodes on the outer boundary are to be split into elements whi...
void initialise_adaptation_data()
Helper function to initialise data associated with adaptation.
void enable_projection()
Disable projection of old solution onto new mesh.
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)
Build mesh, based on a TetMeshFacetedClosedSurface that specifies the outer boundary of the domain an...
virtual ~RefineableTetgenMesh()
Empty Destructor.
void snap_nodes_onto_boundary(RefineableTetgenMesh< ELEMENT > *&new_mesh_pt, const unsigned &b)
Snap the boundary nodes onto any curvilinear boundaries.
void adapt(const Vector< double > &elem_error)
Adapt mesh, based on elemental error provided.
unsigned unrefine_uniformly()
Unrefine mesh uniformly: Return 0 for success, 1 for failure (if unrefinement has reached the coarses...
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)
Specialised constructor used during adaptation only. Element sizes are specified by vector tetgen_io ...
void disable_projection()
Disable projection of old solution onto new mesh.
Unstructured refineable Triangle Mesh.
Unstructured tet mesh based on output from Tetgen: http://wias-berlin.de/software/tetgen/.
void build_from_scaffold(TimeStepper *time_stepper_pt, const bool &use_attributes)
Build mesh from scaffold.
tetgenio * Tetgenio_pt
Tetgen representation of mesh.
void deep_copy_of_tetgenio(tetgenio *const &input_pt, tetgenio *&output_pt)
Transfer tetgenio data from the input to the output The output is assumed to have been constructed an...
bool Tetgenio_exists
Boolean to indicate whether a tetgenio representation of the mesh exists.
TetgenScaffoldMesh * Tmp_mesh_pt
Temporary scaffold mesh.