26#ifndef OOMPH_THIN_LAYER_BRICK_ON_TET_MESH_TEMPLATE_HEADER
27#define OOMPH_THIN_LAYER_BRICK_ON_TET_MESH_TEMPLATE_HEADER
29#ifndef OOMPH_THIN_LAYER_BRICK_ON_TET_MESH_HEADER
30#error __FILE__ should only be included from thin_layer_brick_on_tet_mesh.h.
33#include "../solid/solid_elements.h"
53 template<
class ELEMENT>
64 MeshChecker::assert_geometric_element<QElementGeometricBase, ELEMENT>(3);
78 for (
unsigned i = 0;
i < 19;
i++)
199 for (
unsigned i = 0;
i < 19;
i++)
228 std::map<Node*, Vector<Vector<double>>>
normals;
243 for (
unsigned ib = 0;
ib <
nb;
ib++)
251 for (
unsigned j = 0;
j <
nnod;
j++)
256 std::set<unsigned>*
bnd_pt;
260 for (std::set<unsigned>::iterator
it = (*bnd_pt).begin();
261 it != (*bnd_pt).end();
275 for (
unsigned ib = 0;
ib <
nb;
ib++)
284 for (
unsigned j = 0;
j <
n;
j++)
288 for (
unsigned ib = 0;
ib <
nb;
ib++)
311 for (
unsigned ib = 0;
ib <
nb;
ib++)
324 for (
unsigned e = 0;
e <
nel;
e++)
330 int face_index =
tet_mesh_pt->face_index_at_boundary(b,
e);
341 <<
"Tet-element cannot be cast to SolidTElement<3,3>.\n"
342 <<
"ThinBrickOnTetMesh can only be erected on mesh containing\n"
343 <<
"quadratic tets." << std::endl;
359 <<
"Tet-element cannot be cast to TElement<3,3>.\n"
360 <<
"ThinBrickOnTetMesh can only be erected on mesh containing\n"
361 <<
"quadratic tets." << std::endl;
373 face_el_pt->set_boundary_number_in_bulk_mesh(b);
385 for (
unsigned j = 0;
j < 3;
j++)
437 std::set<unsigned>*
bnd_pt;
439 for (std::set<unsigned>::iterator
it = (*bnd_pt).begin();
440 it != (*bnd_pt).end();
463 j_local + 18, time_stepper_pt);
470 j_local + 18, time_stepper_pt);
492 j_local + 18, time_stepper_pt);
500 j_local + 18, time_stepper_pt);
515 j_local + 18, time_stepper_pt);
533 j_local + 18, time_stepper_pt);
598 std::set<unsigned>*
bnd_pt;
600 for (std::set<unsigned>::iterator
it = (*bnd_pt).begin();
601 it != (*bnd_pt).end();
624 j_local + 18, time_stepper_pt);
631 j_local + 18, time_stepper_pt);
653 j_local + 18, time_stepper_pt);
661 j_local + 18, time_stepper_pt);
676 j_local + 18, time_stepper_pt);
694 j_local + 18, time_stepper_pt);
763 std::set<unsigned>
bnd;
770 for (std::set<unsigned>::iterator
it =
bnd.begin();
it !=
bnd.end();
793 j_local + 18, time_stepper_pt);
800 j_local + 18, time_stepper_pt);
822 j_local + 18, time_stepper_pt);
830 j_local + 18, time_stepper_pt);
845 j_local + 18, time_stepper_pt);
863 j_local + 18, time_stepper_pt);
948 std::set<unsigned>
bnd;
955 for (std::set<unsigned>::iterator
it =
bnd.begin();
it !=
bnd.end();
978 j_local + 18, time_stepper_pt);
985 j_local + 18, time_stepper_pt);
1006 j_local + 18, time_stepper_pt);
1014 j_local + 18, time_stepper_pt);
1024 j_local + 9, time_stepper_pt);
1029 j_local + 18, time_stepper_pt);
1043 j_local + 9, time_stepper_pt);
1047 j_local + 18, time_stepper_pt);
1128 j_local + 18, time_stepper_pt);
1149 j_local + 9, time_stepper_pt);
1156 j_local + 18, time_stepper_pt);
1163 j_local + 18, time_stepper_pt);
1222 j_local + 18, time_stepper_pt);
1243 j_local + 9, time_stepper_pt);
1251 j_local + 18, time_stepper_pt);
1258 j_local + 18, time_stepper_pt);
1306 j_local + 18, time_stepper_pt);
1335 j_local + 18, time_stepper_pt);
1342 j_local + 18, time_stepper_pt);
1387 for (
unsigned j = 0;
j < 3;
j++)
1389 unsigned offset = 9 *
j;
1427 for (
unsigned j = 0;
j < 9;
j++)
1435 std::set<unsigned>*
bnd_pt;
1439 for (std::set<unsigned>::iterator
it = (*bnd_pt).begin();
1440 it != (*bnd_pt).end();
1448 for (
unsigned k = 0;
k <
n;
k++)
1457 if (
j == 1) face_index = -2;
1458 if (
j == 3) face_index = -1;
1459 if (
j == 5) face_index = 1;
1460 if (
j == 7) face_index = 2;
1462 if (face_index != 0)
1512 for (
unsigned jj = 0;
jj <
n;
jj++)
1525 for (
unsigned e = 0;
e <
nel;
e++)
1528 for (
unsigned j = 0;
j < 27;
j++)
1553 unsigned nnormals = ((*it).second).size();
1556 for (
unsigned i = 0;
i < 3;
i++)
1562 for (
unsigned i = 0;
i < 3;
i++)
1566 for (
unsigned i = 0;
i < 3;
i++)
1578 for (
unsigned j = 0;
j <
n;
j++)
1580 for (
unsigned i = 0;
i < 3;
i++)
1588 outfile << ((*it).first)->x(0) <<
" " << ((*it).first)->x(1) <<
" "
1589 << ((*it).first)->x(2) <<
" " <<
unit_normal[0] <<
" "
FaceElements are elements that coincide with the faces of higher-dimensional "bulk" elements....
A general Finite Element class.
void position(const Vector< double > &zeta, Vector< double > &r) const
Return the parametrised position of the FiniteElement in its incarnation as a GeomObject,...
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....
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.
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...
Node *& node_pt(const unsigned &n)
Return a pointer to the local node n.
void add_boundary_node(const unsigned &b, Node *const &node_pt)
Add a (pointer to) a node to the b-th boundary.
Vector< Node * > Node_pt
Vector of pointers to nodes.
Vector< Vector< FiniteElement * > > Boundary_element_pt
Vector of Vector of pointers to elements on the boundaries: Boundary_element_pt(b,...
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).
Vector< Vector< int > > Face_index_at_boundary
For the e-th finite element on boundary b, this is the index of the face that lies along that boundar...
void set_nboundary(const unsigned &nbound)
Set the number of boundaries in the mesh.
void set_boundary_coordinate_exists(const unsigned &i)
Set boundary coordinate on the i-th boundary to be existing.
Vector< GeneralisedElement * > Element_pt
Vector of pointers to generalised elements.
Nodes are derived from Data, but, in addition, have a definite (Eulerian) position in a space of a gi...
An OomphLibError object which should be thrown when an run-time error is encountered....
SolidFiniteElement class.
TAdvectionDiffusionReactionElement<NREAGENT,DIM,NNODE_1D> elements are isoparametric triangular DIM-d...
ThicknessFctPt Thickness_fct_pt
Function pointer to function that specifies the wall thickness as a fct of the coordinates of the inn...
unsigned Outer_boundary_id
Boundary ID of the "outer" surface – the non-wetted tube surface at a distance h_thick from the FSI s...
Vector< Vector< unsigned > > In_out_boundary_id
Vector of vectors containing the ids of the oomph-lib mesh boundaries that make up the specified in/o...
Vector< unsigned > in_out_boundary_id(const unsigned &boundary_id)
Access function to the vector containing the ids of the oomph-lib mesh boundaries that make up the sp...
Vector< unsigned > FSI_boundary_id
Vector of oomph-lib boundary ids that make up boundary on which the mesh was erected (typically the F...
ThinLayerBrickOnTetMesh(Mesh *tet_mesh_pt, const Vector< unsigned > &boundary_ids, ThicknessFctPt thickness_fct_pt, const unsigned &nlayer, const Vector< Vector< unsigned > > &in_out_boundary_id, TimeStepper *time_stepper_pt=&Mesh::Default_TimeStepper)
Constructor: Specify (quadratic) tet mesh, boundary IDs of boundary on which the current mesh is to b...
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).