27#ifndef OOMPH_TET_MESH_HEADER
28#define OOMPH_TET_MESH_HEADER
32#include <oomph-lib-config.h>
62 error_stream <<
"TetMeshVertex should only be used in 3D!\n"
63 <<
"Your Vector of coordinates, contains data for "
64 <<
x.
size() <<
"-dimensional coordinates." << std::endl;
79 error_stream <<
"TetMeshVertex should only be used in 3D!\n"
80 <<
"Your Node contains data for " <<
n_dim
81 <<
"-dimensional coordinates." << std::endl;
104 <<
"TetMeshVertex should only be used in 3D!\n"
105 <<
"Your Vector of intrinisic coordinates, contains data for "
106 <<
zeta.
size() <<
"-dimensional coordinates but should be 2!"
124 double x(
const unsigned&
i)
const
218 for (
unsigned j = 0;
j <
nv;
j++)
266 outfile <<
"ZONE I=" <<
n + 1 << std::endl;
267 for (
unsigned j = 0;
j <
n;
j++)
333 return Facet_pt[
j]->one_based_boundary_id();
395 for (
unsigned j = 0;
j <
n;
j++)
448 std::set<TetMeshVertex*>::iterator
iterator;
506 outfile <<
"<VTKFile type=\"UnstructuredGrid\" version=\"0.1\" "
507 "byte_order=\"BigEndian\">\n"
508 <<
"<UnstructuredGrid>\n"
510 <<
"\" NumberOfCells=\"" <<
offsets.
size() <<
"\">" << std::endl;
516 <<
"<DataArray type=\"Float32\" NumberOfComponents=\"3\" "
527 outfile <<
"</DataArray>\n</Points>" << std::endl;
532 outfile <<
"<Cells>\n<DataArray type=\"Int32\" "
533 "Name=\"connectivity\" format=\"ascii\">"
543 outfile <<
"</DataArray>" << std::endl;
548 outfile <<
"<DataArray type=\"Int32\" Name=\"offsets\" "
553 for (
const auto& offset :
offsets)
559 outfile <<
"</DataArray>" << std::endl;
564 outfile <<
"<DataArray type=\"Int32\" Name=\"types\" "
569 for (
const auto& type :
types)
575 outfile <<
"</DataArray>\n</Cells>" << std::endl;
580 outfile <<
"</Piece>\n</UnstructuredGrid>\n</VTKFile>";
693 for (
unsigned f = 0; f <
nf; f++)
697 for (
unsigned v = 0;
v <
nv;
v++)
755 const unsigned&
i)
const
887 template<
class ELEMENT>
918 template<
class ELEMENT>
949 template<
class ELEMENT>
973 template<
class ELEMENT>
984 const unsigned&
r)
const
988 std::map<unsigned, Vector<FiniteElement*>>::const_iterator
it =
992 return (
it->second).
size();
1004 const unsigned&
e)
const
1007 std::map<unsigned, Vector<FiniteElement*>>::const_iterator
it =
1011 return (
it->second)[
e];
1022 const unsigned&
e)
const
1025 std::map<unsigned, Vector<int>>::const_iterator
it =
1029 return (
it->second)[
e];
1033 std::ostringstream error_message;
1034 error_message <<
"Face indices not set up for boundary " << b
1035 <<
" in region " <<
r <<
"\n";
1036 error_message <<
"This probably means that the boundary is not "
1037 "adjacent to region\n";
1068 for (
unsigned i = 0;
i <
n;
i++)
1076 std::ostringstream error_message;
1077 error_message <<
"Region attributes should be unsigneds because we \n"
1078 <<
"only use them to set region ids\n";
1114 for (
unsigned i = 0;
i <
n;
i++)
1122 std::ostringstream error_message;
1123 error_message <<
"Region attributes should be unsigneds because we \n"
1124 <<
"only use the to set region ids\n";
1158 template<
class ELEMENT>
1175 template<
class ELEMENT>
1197 template<
class ELEMENT>
1250 std::map<unsigned, Vector<Vector<double>>>
1288 template<
class ELEMENT>
1308 f_pt = (*it).second;
1333 for (
unsigned e = 0;
e <
nel;
e++)
1358 for (
unsigned j = 0;
j <
nnod;
j++)
1445 ->outer_unit_normal(
s,
normal);
1449 double t1x =
f_pt->vertex_pt(1)->x(0) -
f_pt->vertex_pt(0)->x(0);
1451 double t1y =
f_pt->vertex_pt(1)->x(1) -
f_pt->vertex_pt(0)->x(1);
1453 double t1z =
f_pt->vertex_pt(1)->x(2) -
f_pt->vertex_pt(0)->x(2);
1455 double t2x =
f_pt->vertex_pt(2)->x(0) -
f_pt->vertex_pt(0)->x(0);
1457 double t2y =
f_pt->vertex_pt(2)->x(1) -
f_pt->vertex_pt(0)->x(1);
1459 double t2z =
f_pt->vertex_pt(2)->x(2) -
f_pt->vertex_pt(0)->x(2);
1485 for (
unsigned e = 0;
e <
nel;
e++)
1517 for (
unsigned j = 0;
j <
nnod;
j++)
1551 std::ostringstream error_message;
1553 <<
"Error in projection of boundary coordinates = "
1554 <<
sqrt(
error) <<
" > Tolerance_for_boundary_finding = "
1556 <<
"nv = " <<
nv << std::endl
1564 for (
unsigned j = 0;
j <
nnod;
j++)
1568 error_message <<
nod_pt->x(0) <<
" " <<
nod_pt->x(1) <<
" "
1569 <<
nod_pt->x(2) <<
" " << std::endl;
1579 nod_pt->set_coordinates_on_boundary(b,
zeta);
1598 for (
unsigned j = 0;
j < 3;
j++)
1614 for (
unsigned ii = 0;
ii < 2;
ii++)
1626 for (
unsigned e = 0;
e <
n;
e++)
1655 template<
class ELEMENT>
1668 "non_snapped_nodes_" + doc_info.
label() +
".dat";
1687 if (
nel != boundary_id.
size())
1689 std::ostringstream error_message;
1690 error_message <<
"Number of quadratic facets specified in "
1692 <<
"\nThis doesn't match the number of planar boundaries \n"
1693 <<
"specified in boundary_id which is "
1694 << boundary_id.
size() << std::endl;
1703 for (
unsigned e = 0;
e <
nel;
e++)
1732 for (
unsigned e = 0;
e <
nel;
e++)
1742 face_el_pt[
e]->set_boundary_number_in_bulk_mesh(boundary_id[
e]);
1752 for (
unsigned e = 0;
e <
nel;
e++)
1761 for (
unsigned j = 0;
j < 3;
j++)
1877 for (
unsigned j = 0;
j < 3;
j++)
1911 std::ostringstream error_message;
1913 <<
"Error in setup of boundary coordinate " <<
sqrt(
error)
1915 <<
"exceeds tolerance specified by the static member data\n"
1916 <<
"TetMeshBase::Tolerance_for_boundary_finding = "
1918 <<
"This usually means that the boundary is not planar.\n\n"
1919 <<
"You can suppress this error message by recompiling \n"
1920 <<
"recompiling without PARANOID or by changing the tolerance.\n";
1928 nod_pt->set_coordinates_on_boundary(boundary_id[
e],
zeta);
1962 for (
unsigned b = 0; b <
nel; b++)
1972 << doc_info.
label() << b <<
".dat";
1977 << doc_info.
label() << b <<
".dat";
1982 << doc_info.
label() << b <<
".dat";
2006 for (
unsigned i = 0;
i < 3;
i++)
2010 for (
unsigned i = 0;
i < 2;
i++)
2032 for (
unsigned e = 0;
e <
nel;
e++)
2040 for (
unsigned j = 0;
j <
nnod;
j++)
2043 if (
nod_pt->is_on_boundary(boundary_id[b]))
2069 std::ostringstream error_message;
2071 <<
"Warning: Couldn't find GeomObject during snapping to\n"
2072 <<
"quadratic surface for boundary " << boundary_id[b]
2073 <<
". I'm leaving the node where it was. Will bail out "
2076 "TetgenMesh::snap_to_quadratic_surface()",
2108 std::ostringstream error_message;
2110 <<
"Warning: Couldn't find GeomObject during snapping to\n"
2111 <<
"quadratic surface. Bailing out.\n"
2112 <<
"Nodes that couldn't be snapped are contained in \n"
2114 <<
"This problem may arise because the switch_normal flag was \n"
2115 <<
"set wrongly.\n";
2127 for (
unsigned e = 0;
e <
nel;
e++)
2135 for (
unsigned j = 0;
j <
nn;
j++)
2146 template<
class ELEMENT>
2161 if ((nnode_1d != 2) && (nnode_1d != 3))
2163 std::ostringstream error_message;
2164 error_message <<
"Mesh generation from tetgen currently only works\n";
2165 error_message <<
"for nnode_1d = 2 or 3. You're trying to use it\n";
2166 error_message <<
"for nnode_1d=" << nnode_1d << std::endl;
2173 std::map<FiniteElement*, unsigned>
count;
2177 for (
unsigned b = 0; b <
nb; b++)
2181 for (
unsigned e = 0;
e <
nel;
e++)
2195 for (std::map<FiniteElement*, unsigned>::iterator
it =
count.begin();
2216 std::map<FiniteElement*, Vector<FiniteElement*>>
2220 for (
unsigned e = 0;
e <
nel;
e++)
2226 std::set<FiniteElement*>::iterator
it = std::find(
2432 for (
unsigned i = 0;
i < 3;
i++)
2458 for (
unsigned i = 0;
i < 3; ++
i)
2467 for (
unsigned i = 0;
i < 3; ++
i)
2476 for (
unsigned i = 0;
i < 3; ++
i)
2485 for (
unsigned i = 0;
i < 3; ++
i)
2494 for (
unsigned i = 0;
i < 3; ++
i)
2503 for (
unsigned i = 0;
i < 3; ++
i)
2515 for (
unsigned i = 0;
i < 3; ++
i)
2518 for (
unsigned j = 0;
j < 4;
j++)
2530 for (
unsigned i = 0;
i < 3; ++
i)
2533 for (
unsigned j = 0;
j < 4;
j++)
2543 for (
unsigned i = 0;
i < 3; ++
i)
2546 for (
unsigned j = 0;
j < 4;
j++)
2556 for (
unsigned i = 0;
i < 3; ++
i)
2559 for (
unsigned j = 0;
j < 4;
j++)
2579 for (
unsigned e = 0;
e <
nel;
e++)
2612 oomph_info <<
"\nNo corner elements need splitting\n\n";
2670 std::ostringstream error_message;
2672 <<
"The corner element being split does not appear to be in any "
2673 <<
"region, so something has gone wrong with the region lookup "
2685 for (
unsigned i = 0;
i < 4;
i++)
2695 oomph_info <<
"\nNumber of outer corner elements split: "
Base class for upgraded disk-like GeomObject (i.e. 2D surface in 3D space) with specification of boun...
Information for documentation of results: Directory and file number to enable output in the form RESL...
std::string & label()
String used (e.g.) for labeling output files.
bool is_doc_enabled() const
Are we documenting?
void disable_doc()
Disable documentation.
std::string directory() const
Output directory.
A general Finite Element class.
void set_nodal_dimension(const unsigned &nodal_dim)
Set the dimension of the nodes in the element. This will typically only be required when constructing...
void position(const Vector< double > &zeta, Vector< double > &r) const
Return the parametrised position of the FiniteElement in its incarnation as a GeomObject,...
virtual std::string tecplot_zone_string(const unsigned &nplot) const
Return string for tecplot zone header (when plotting nplot points in each "coordinate direction")
void interpolated_zeta(const Vector< double > &s, Vector< double > &zeta) const
Calculate the interpolated value of zeta, the intrinsic coordinate of the element when viewed as a co...
double size() const
Calculate the size of the element (length, area, volume,...) in Eulerian computational coordinates....
void locate_zeta(const Vector< double > &zeta, GeomObject *&geom_object_pt, Vector< double > &s, const bool &use_coordinate_as_initial_guess=false)
For a given value of zeta, the "global" intrinsic coordinate of a mesh of FiniteElements represented ...
virtual Node * construct_node(const unsigned &n)
Construct the local node n and return a pointer to the newly created node object.
virtual double interpolated_x(const Vector< double > &s, const unsigned &i) const
Return FE interpolated coordinate x[i] at local coordinate s.
unsigned nnode() const
Return the number of nodes.
virtual void get_s_plot(const unsigned &i, const unsigned &nplot, Vector< double > &s, const bool &shifted_to_interior=false) const
Get cector of local coordinates of plot point i (when plotting nplot points in each "coordinate direc...
virtual Node * construct_boundary_node(const unsigned &n)
Construct the local node n as a boundary node; that is a node that MAY be placed on a mesh boundary a...
virtual unsigned nplot_points(const unsigned &nplot) const
Return total number of plot points (when plotting nplot points in each "coordinate direction")
Node *& node_pt(const unsigned &n)
Return a pointer to the local node n.
virtual unsigned nnode_1d() const
Return the number of nodes along one edge of the element Default is to return zero — must be overload...
virtual void write_tecplot_zone_footer(std::ostream &outfile, const unsigned &nplot) const
Add tecplot zone "footer" to output stream (when plotting nplot points in each "coordinate direction"...
A geometric object is an object that provides a parametrised description of its shape via the functio...
unsigned long nboundary_node(const unsigned &ibound) const
Return number of nodes on a particular boundary.
static Steady< 0 > Default_TimeStepper
Default Steady Timestepper, to be used in default arguments to Mesh constructors.
bool Lookup_for_elements_next_boundary_is_setup
Flag to indicate that the lookup schemes for elements that are adjacent to the boundaries has been se...
FiniteElement * finite_element_pt(const unsigned &e) const
Upcast (downcast?) to FiniteElement (needed to access FiniteElement member functions).
int face_index_at_boundary(const unsigned &b, const unsigned &e) const
For the e-th finite element on boundary b, return int to indicate the face_index of the face adjacent...
unsigned nboundary_element(const unsigned &b) const
Return number of finite elements that are adjacent to boundary b.
FiniteElement * boundary_element_pt(const unsigned &b, const unsigned &e) const
Return pointer to e-th finite element on boundary b.
unsigned nboundary() const
Return number of boundaries.
unsigned long nnode() const
Return number of nodes in the mesh.
void set_boundary_coordinate_exists(const unsigned &i)
Set boundary coordinate on the i-th boundary to be existing.
void add_node_pt(Node *const &node_pt)
Add a (pointer to a) node to the mesh.
Vector< GeneralisedElement * > Element_pt
Vector of pointers to generalised elements.
unsigned long nelement() const
Return number of elements in the mesh.
Node *& boundary_node_pt(const unsigned &b, const unsigned &n)
Return pointer to node n on boundary b.
Nodes are derived from Data, but, in addition, have a definite (Eulerian) position in a space of a gi...
unsigned ndim() const
Return (Eulerian) spatial dimension of the node.
virtual void add_to_boundary(const unsigned &b)
Broken interface for adding the node to the mesh boundary b Essentially here for error reporting.
virtual void set_coordinates_on_boundary(const unsigned &b, const unsigned &k, const Vector< double > &boundary_zeta)
Set the vector of the k-th generalised boundary coordinates on mesh boundary b. Broken virtual interf...
double & x(const unsigned &i)
Return the i-th nodal coordinate.
An OomphLibError object which should be thrown when an run-time error is encountered....
An OomphLibWarning object which should be created as a temporary object to issue a warning....
TAdvectionDiffusionReactionElement<NREAGENT,DIM,NNODE_1D> elements are isoparametric triangular DIM-d...
void output(std::ostream &outfile)
Output function: x,y,u or x,y,z,u.
Base class for tet meshes (meshes made of 3D tet elements).
virtual ~TetMeshBase()
Destructor (empty)
void snap_nodes_onto_geometric_objects()
Move the nodes on boundaries with associated GeomObjects so that they exactly coincide with the geome...
void snap_to_quadratic_surface(const Vector< unsigned > &boundary_id, const std::string &quadratic_surface_file_name, const bool &switch_normal, DocInfo &doc_info)
Snap boundaries specified by the IDs listed in boundary_id to a quadratric surface,...
int face_index_at_boundary_in_region(const unsigned &b, const unsigned &r, const unsigned &e) const
Return face index of the e-th element adjacent to boundary b in region r.
Vector< double > Region_attribute
Vector of attributes associated with the elements in each region NOTE: double is enforced on us by te...
double region_attribute(const unsigned &i)
Return the i-th region attribute (here only used as the (assumed to be unsigned) region id.
void setup_boundary_coordinates(const unsigned &b, const bool &switch_normal)
Setup boundary coordinate on boundary b which is assumed to be planar. Boundary coordinates are the x...
unsigned nregion()
Return the number of regions specified by attributes.
FiniteElement * boundary_element_in_region_pt(const unsigned &b, const unsigned &r, const unsigned &e) const
Return pointer to the e-th element adjacent to boundary b in region r.
TimeStepper * Time_stepper_pt
Timestepper used to build nodes.
FiniteElement * region_element_pt(const unsigned &r, const unsigned &e)
Return the e-th element in the r-th region.
unsigned nboundary_element_in_region(const unsigned &b, const unsigned &r) const
Return the number of elements adjacent to boundary b in region r.
std::map< unsigned, TetMeshFacetedSurface * > Tet_mesh_faceted_surface_pt
Reverse lookup scheme: Pointer to faceted surface (if any!) associated with boundary b.
Vector< TetMeshFacetedSurface * > Internal_surface_pt
Vector to faceted surfaces that define internal boundaries.
Vector< std::map< unsigned, Vector< FiniteElement * > > > Boundary_region_element_pt
Storage for elements adjacent to a boundary in a particular region.
void operator=(const TetMeshBase &)=delete
Broken assignment operator.
std::map< unsigned, TetMeshFacet * > Tet_mesh_facet_pt
Reverse lookup scheme: Pointer to facet (if any!) associated with boundary b.
void setup_boundary_coordinates(const unsigned &b)
Setup boundary coordinate on boundary b which is assumed to be planar. Boundary coordinates are the x...
TetMeshFacetedClosedSurface * Outer_boundary_pt
Faceted surface that defines outer boundaries.
static double Tolerance_for_boundary_finding
Global static data that specifies the permitted error in the setup of the boundary coordinates.
void assess_mesh_quality(std::ofstream &some_file)
Assess mesh quality: Ratio of max. edge length to min. height, so if it's very large it's BAAAAAD.
void add_element_in_region_pt(FiniteElement *const &elem_pt, const unsigned ®ion_id)
Add an element to a particular region; this helper checks if the specified element and region ID alre...
TetMeshBase()
Constructor.
void snap_to_quadratic_surface(const Vector< unsigned > &boundary_id, const std::string &quadratic_surface_file_name, const bool &switch_normal)
Snap boundaries specified by the IDs listed in boundary_id to a quadratric surface,...
void setup_boundary_element_info()
Setup lookup schemes which establish which elements are located next to mesh's boundaries (wrapper to...
Vector< std::map< unsigned, Vector< int > > > Face_index_region_at_boundary
Storage for the face index adjacent to a boundary in a particular region.
std::map< unsigned, Vector< Vector< double > > > Triangular_facet_vertex_boundary_coordinate
Boundary coordinates of vertices in triangular facets associated with given boundary....
void regenerate_region_boundary_lookups()
Clear and regenerate the lookup schemes for bulk elements and their corresponding face indices which ...
TetMeshBase(const TetMeshBase &node)=delete
Broken copy constructor.
Vector< Vector< FiniteElement * > > Region_element_pt
Vectors of vectors of elements in each region (note: this just stores them; the region IDs are contai...
void split_elements_in_corners(TimeStepper *time_stepper_pt=&Mesh::Default_TimeStepper)
Non-Delaunay split elements that have three faces on a boundary into sons. Timestepper species timest...
void setup_boundary_coordinates(const unsigned &b, std::ofstream &outfile)
Setup boundary coordinate on boundary b which is assumed to be planar. Boundary coordinates are the x...
unsigned nregion_element(const unsigned &r)
Return the number of elements in region r.
Facet for Tet mesh generation. Can lie on boundary (identified via one-based enumeration!...
Vector< TetMeshVertex * > Vertex_pt
Pointer to vertices.
void set_vertex_pt(const unsigned &j, TetMeshVertex *vertex_pt)
Set pointer to j-th vertex and pass one-based boundary id that may already have been set for this fac...
void output(std::ostream &outfile) const
Output.
void set_one_based_region_that_facet_is_embedded_in(const unsigned &one_based_region_id)
Facet is to be embedded in specified one-based region.
std::set< unsigned > One_based_adjacent_region_id
Set of one-based adjacent region ids; no adjacent region if it's zero.
bool facet_is_embedded_in_a_specified_region()
Boolean indicating that facet is embedded in a specified region.
void set_one_based_boundary_id(const unsigned &one_based_id)
Set (one-based!) boundary IDs this facet lives on. Passed to any existing vertices and to any future ...
unsigned one_based_boundary_id() const
Constant access to (one-based!) boundary IDs this facet lives on.
unsigned nvertex() const
Number of vertices.
unsigned One_based_boundary_id
(One-based!) boundary IDs this facet lives on
TetMeshVertex * vertex_pt(const unsigned &j) const
Pointer to j-th vertex (const)
unsigned One_based_region_id_that_facet_is_embedded_in
Facet is to be embedded in specified one-based region. Defaults to zero, indicating that its not embe...
void set_one_based_adjacent_region_id(const unsigned &one_based_id)
Set (one-based!) region ID this facet is adjacent to. Specification of zero argument is harmless as i...
unsigned one_based_region_that_facet_is_embedded_in()
Which (one-based) region is facet embedded in (if zero, it's not embedded in any region)
TetMeshFacet(const unsigned &nvertex)
Constructor: Specify number of vertices.
std::set< unsigned > one_based_adjacent_region_id() const
Return set of (one-based!) region IDs this facet is adjacent to.
virtual ~TetMeshFacetedClosedSurfaceForRemesh()
Destructor. Delete allocated memory.
Base class for closed tet mesh boundary bounded by polygonal planar facets.
TetMeshFacetedClosedSurface()
Constructor:
bool Faceted_volume_represents_hole_for_gmsh
Does closed surface represent hole for gmsh?
void enable_faceted_volume_represents_hole_for_gmsh()
Declare closed surface to represent hole for gmsh.
bool faceted_volume_represents_hole_for_gmsh() const
Does closed surface represent hole for gmsh?
Vector< std::pair< Vector< double >, int > > Internal_point_for_tetgen
Storage for internal points for tetgen. Stores pair of: – Vector containing coordinates of internal p...
virtual ~TetMeshFacetedClosedSurface()
Empty destructor.
unsigned ninternal_point_for_tetgen()
Number of internal points (identifying either regions or holes) for tetgen.
bool internal_point_identifies_region_for_tetgen(const unsigned &j)
Is j-th internal point for tetgen associated with a region?
const int & region_id_for_tetgen(const unsigned &j) const
Return the (zero-based) region ID of j-th internal point for tetgen. Negative if it's actually a hole...
bool internal_point_identifies_hole_for_tetgen(const unsigned &j)
Is j-th internal point for tetgen associated with a hole?
void disable_faceted_volume_represents_hole_for_gmsh()
Declare closed surface NOT to represent hole for gmsh.
void set_region_for_tetgen(const unsigned ®ion_id, const Vector< double > ®ion_point)
Specify a region; pass (zero-based) region ID and coordinate of point in region for tetgen.
void set_hole_for_tetgen(const Vector< double > &hole_point)
Specify coordinate of hole for tetgen.
const double & internal_point_for_tetgen(const unsigned &j, const unsigned &i) const
i=th coordinate of the j-th internal point for tetgen
Base class for tet mesh boundary defined by polygonal planar facets.
TetMeshFacet * facet_pt(const unsigned &j) const
Pointer to j-th facet.
unsigned nvertex_on_facet(const unsigned &j) const
Number of vertices defining the j-th facet.
bool Boundaries_can_be_split_in_tetgen
Boolean to indicate whether extra vertices can be added on the boundary in tetgen.
TetMeshVertex * vertex_pt(const unsigned &j) const
Pointer to j-th vertex.
void disable_boundaries_can_be_split_in_tetgen()
Test whether boundaries can be split in tetgen.
virtual void boundary_zeta01(const unsigned &facet_id, const double &zeta_boundary, Vector< double > &zeta)
Virtual function that specifies the variation of the zeta coordinates in the GeomObject along the bou...
Vector< TetMeshVertex * > Vertex_pt
Vector pointers to vertices.
unsigned nfacet() const
Number of facets.
Vector< Vector< unsigned > > Facet_vertex_index_in_tetgen
Facet connectivity: Facet_vertex_index[f][j] is the index of the j-th vertex (in the Vertex_pt vector...
void output_paraview(const std::string &filename) const
Outputs the faceted surface into a file with the specified name in the Paraview format....
DiskLikeGeomObjectWithBoundaries * Geom_object_with_boundaries_pt
GeomObject with boundaries associated with this surface.
Vector< unsigned > vertex_index_in_tetgen(const unsigned &f)
Facet connectivity: vertex_index[j] is the index of the j-th vertex (in the Vertex_pt vector) in face...
void output_paraview(std::ostream &outfile) const
Outputs the faceted surface into a specified file in the Paraview format for viewing in Paraview....
virtual void boundary_zeta12(const unsigned &facet_id, const double &zeta_boundary, Vector< double > &zeta)
Virtual function that specifies the variation of the zeta coordinates in the GeomObject along the bou...
bool boundaries_can_be_split_in_tetgen()
Test whether boundary can be split in tetgen.
Vector< TetMeshFacet * > Facet_pt
Vector of pointers to facets.
unsigned one_based_facet_boundary_id(const unsigned &j) const
One-based boundary id of j-th facet.
void enable_boundaries_can_be_split_in_tetgen()
Test whether boundaries can be split in tetgen.
DiskLikeGeomObjectWithBoundaries * geom_object_with_boundaries_pt()
Access to GeomObject with boundaries associated with this surface (Null if there isn't one!...
virtual void boundary_zeta20(const unsigned &facet_id, const double &zeta_boundary, Vector< double > &zeta)
Virtual function that specifies the variation of the zeta coordinates in the GeomObject along the bou...
void setup_facet_connectivity_for_tetgen()
Setup facet connectivity for tetgen.
double vertex_coordinate(const unsigned &j, const unsigned &i) const
i-th coordinate of j-th vertex
unsigned nvertex() const
Number of vertices.
TetMeshFacetedSurface()
Constructor:
void output(const std::string &filename) const
Output.
void output(std::ostream &outfile) const
Output.
virtual ~TetMeshFacetedSurface()
Empty destructor.
unsigned one_based_vertex_boundary_id(const unsigned &j) const
First (of possibly multiple) one-based boundary id of j-th vertex.
Vertex for Tet mesh generation. Can lie on multiple boundaries (identified via one-based enumeration!...
void set_zeta_in_geom_object(const Vector< double > &zeta)
Set intrinisic coordinates in GeomObject.
Vector< double > zeta_in_geom_object() const
Get intrinisic coordinates in GeomObject (returns zero sized vector if no such coordinates have been ...
Vector< double > X
Coordinate vector.
TetMeshVertex(Node *const &node_pt)
std::set< unsigned > One_based_boundary_id
Set of (one-based!) boundary IDs this vertex lives on.
unsigned one_based_boundary_id() const
First (of possibly multiple) one-based boundary id.
Vector< double > Zeta_in_geom_object
Intrinisic coordinates in GeomObject (zero sized if there isn't one.
void set_one_based_boundary_id(const unsigned &id)
Set of (one-based!) boundary IDs this vertex lives on.
double x(const unsigned &i) const
i-th coordinate
TetMeshVertex(const Vector< double > &x)
Constructor: Pass coordinates (length 3!)
Base class for time-stepping schemes. Timestepper provides an approximation of the temporal derivativ...
A slight extension to the standard template vector class so that we can include "graceful" array rang...
DRAIG: Change all instances of (SPATIAL_DIM) to (DIM-1).
OomphInfo oomph_info
Single (global) instantiation of the OomphInfo object – this is used throughout the library as a "rep...