31 #ifndef OOMPH_REFINEABLE_TETGEN_MESH_HEADER 32 #define OOMPH_REFINEABLE_TETGEN_MESH_HEADER 36 #include <oomph-lib-config.h> 40 #include "../generic/tetgen_scaffold_mesh.h" 41 #include "../generic/tet_mesh.h" 42 #include "../generic/refineable_mesh.h" 53 template<
class ELEMENT>
67 const double &element_volume,
69 const bool &use_attributes =
false,
70 const bool& split_corner_elements =
false) :
72 internal_closed_surface_pt,
90 tetgenio*
const &tetgen_io_pt,
95 const bool &use_attributes=
false)
104 MeshChecker::assert_geometric_element<TElementGeometricBase,ELEMENT>(3);
124 tetgenio *tetgen_input_pt =
new tetgenio;;
128 tetgen_input_pt->tetrahedronvolumelist =
129 new double[tetgen_input_pt->numberoftetrahedra];
130 for(
int e=0;
e<tetgen_input_pt->numberoftetrahedra;++
e)
132 tetgen_input_pt->tetrahedronvolumelist[
e] = target_volume[
e];
136 std::stringstream input_string_stream;
137 input_string_stream<<
"Vqra";
140 char tetswitches[100];
141 sprintf(tetswitches,
"%s",input_string_stream.str().c_str());
144 tetrahedralize(tetswitches, tetgen_input_pt, this->
Tetgenio_pt);
156 delete tetgen_input_pt;
164 for (
unsigned f=0;f<n_facet;f++)
174 std::ostringstream error_message;
175 error_message <<
"Boundary IDs have to be one-based. Yours is " 178 OOMPH_CURRENT_FUNCTION,
179 OOMPH_EXCEPTION_LOCATION);
189 unsigned n=this->Internal_surface_pt.size();
190 for (
unsigned i=0;
i<n;
i++)
192 unsigned n_facet=this->Internal_surface_pt[
i]->nfacet();
193 for (
unsigned f=0;f<n_facet;f++)
195 unsigned b=this->Internal_surface_pt[
i]->
196 one_based_facet_boundary_id(f);
200 this->Internal_surface_pt[
i];
202 this->Internal_surface_pt[
i]->facet_pt(f);
206 std::ostringstream error_message;
207 error_message <<
"Boundary IDs have to be one-based. Yours is " 210 OOMPH_CURRENT_FUNCTION,
211 OOMPH_EXCEPTION_LOCATION);
220 for (
unsigned b=0;b<nb;b++)
222 this->
template setup_boundary_coordinates<ELEMENT>(b);
241 throw OomphLibError(
"refine_uniformly() not implemented yet",
242 OOMPH_CURRENT_FUNCTION,
243 OOMPH_EXCEPTION_LOCATION);
252 throw OomphLibError(
"unrefine_uniformly() not implemented yet",
253 OOMPH_CURRENT_FUNCTION,
254 OOMPH_EXCEPTION_LOCATION);
static Steady< 0 > Default_TimeStepper
Default Steady Timestepper, to be used in default arguments to Mesh constructors. ...
void build_from_scaffold(TimeStepper *time_stepper_pt, const bool &use_attributes)
Build mesh from scaffold.
Information for documentation of results: Directory and file number to enable output in the form RESL...
TimeStepper * Time_stepper_pt
Timestepper used to build nodes.
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 ...
TetgenScaffoldMesh * Tmp_mesh_pt
Temporary scaffold mesh.
bool Projection_is_disabled
Disable projection of solution onto new mesh during adaptation.
TetMeshFacet * facet_pt(const unsigned &j) const
Pointer to j-th facet.
double Max_element_size
Max permitted element size.
void snap_nodes_onto_geometric_objects()
Move the nodes on boundaries with associated GeomObjects so that they exactly coincide with the geome...
bool Tetgenio_exists
Boolean to indicate whether a tetgenio representation of the mesh exists.
Unstructured tet mesh based on output from Tetgen: http://wias-berlin.de/software/tetgen/.
void refine_uniformly(DocInfo &doc_info)
Refine mesh uniformly and doc process.
TetMeshFacetedClosedSurface * Outer_boundary_pt
Faceted surface that defines outer boundaries.
unsigned nboundary() const
Return number of boundaries.
std::map< unsigned, TetMeshFacetedSurface * > Tet_mesh_faceted_surface_pt
Reverse lookup scheme: Pointer to faceted surface (if any!) associated with boundary b...
void deep_copy_of_tetgenio(tetgenio *const &input_pt, tetgenio *&output_pt)
double Min_element_size
Min permitted element size.
unsigned nfacet() const
Number of facets.
unsigned unrefine_uniformly()
Unrefine mesh uniformly: Return 0 for success, 1 for failure (if unrefinement has reached the coarses...
void adapt(const Vector< double > &elem_error)
Adapt mesh, based on elemental error provided.
bool projection_is_disabled()
Is projection of old solution onto new mesh disabled?
DocInfo doc_info()
Access fct for DocInfo.
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...
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)
Build mesh, based on a TetMeshFacetedClosedSurface that specifies the outer boundary of the domain an...
unsigned one_based_facet_boundary_id(const unsigned &j) const
One-based boundary id of j-th facet.
Mesh that is based on input files generated by the tetrahedra mesh generator tetgen.
virtual ~RefineableTetgenMesh()
Empty Destructor.
void initialise_adaptation_data()
Helper function to initialise data associated with adaptation.
Base class for refineable tet meshes.
void enable_projection()
Disable projection of old solution onto new mesh.
void disable_projection()
Disable projection of old solution onto new mesh.
Base class for time-stepping schemes. Timestepper provides an approximation of the temporal derivativ...
Vector< TetMeshFacetedSurface * > Internal_surface_pt
Vector to faceted surfaces that define internal boundaries.
std::map< unsigned, TetMeshFacet * > Tet_mesh_facet_pt
Reverse lookup scheme: Pointer to facet (if any!) associated with boundary b.
double Max_permitted_edge_ratio
Max edge ratio before remesh gets triggered.
tetgenio * Tetgenio_pt
Tetgen representation of mesh.