29 #ifndef OOMPH_POROELASITICTY_FACE_ELEMENTS_HEADER 
   30 #define OOMPH_POROELASITICTY_FACE_ELEMENTS_HEADER 
   34 #include <oomph-lib-config.h> 
   47   namespace PoroelasticityFaceElementHelper
 
   57       unsigned n_dim = load.size();
 
   58       for (
unsigned i = 0; 
i < n_dim; 
i++)
 
   85   template<
class ELEMENT>
 
  118                               const unsigned& intpt,
 
  132                               const unsigned& intpt,
 
  159         ELEMENT* elem_pt = 
new ELEMENT;
 
  161         if (elem_pt->dim() == 3)
 
  168                             "nodes are hanging\n",
 
  169                             OOMPH_CURRENT_FUNCTION,
 
  170                             OOMPH_EXCEPTION_LOCATION);
 
  177       Element_pt = 
dynamic_cast<ELEMENT*
>(element_pt);
 
  232                       const unsigned& 
i)
 const 
  244     void output(std::ostream& outfile, 
const unsigned& n_plot)
 
  256     void output(FILE* file_pt, 
const unsigned& n_plot)
 
  286   template<
class ELEMENT>
 
  291     unsigned n_dim = this->nodal_dimension();
 
  295     interpolated_x(
s, x);
 
  299     outer_unit_normal(
s, unit_normal);
 
  305     get_traction(time, ipt, x, unit_normal, traction);
 
  312   template<
class ELEMENT>
 
  317     unsigned n_dim = this->nodal_dimension();
 
  321     interpolated_x(
s, x);
 
  325     outer_unit_normal(
s, unit_normal);
 
  331     get_pressure(time, ipt, x, unit_normal, pressure);
 
  338   template<
class ELEMENT>
 
  343     unsigned n_node = nnode();
 
  346     double time = node_pt(0)->time_stepper_pt()->time_pt()->time();
 
  350     unsigned n_position_type = this->nnodal_position_type();
 
  351     if (n_position_type != 1)
 
  353       throw OomphLibError(
"Poroelasticity equations are not yet implemented " 
  354                           "for more than one position type",
 
  355                           OOMPH_CURRENT_FUNCTION,
 
  356                           OOMPH_EXCEPTION_LOCATION);
 
  361     unsigned n_dim = this->nodal_dimension();
 
  363     unsigned n_q_basis = Element_pt->nq_basis();
 
  364     unsigned n_q_basis_edge = Element_pt->nq_basis_edge();
 
  373     DShape dpsids(n_node, n_dim - 1);
 
  375     Shape q_basis(n_q_basis, n_dim);
 
  378     unsigned n_intpt = integral_pt()->nweight();
 
  387     for (
unsigned ipt = 0; ipt < n_intpt; ipt++)
 
  390       double w = integral_pt()->weight(ipt);
 
  393       dshape_local_at_knot(ipt, psi, dpsids);
 
  396       for (
unsigned i = 0; 
i < n_dim - 1; 
i++)
 
  398         s_face[
i] = integral_pt()->knot(ipt, 
i);
 
  401       s_bulk = local_coordinate_in_bulk(s_face);
 
  405       Element_pt->get_q_basis(s_bulk, q_basis);
 
  414       for (
unsigned l = 0; l < n_node; l++)
 
  417         for (
unsigned i = 0; 
i < n_dim; 
i++)
 
  420           const double x_local = nodal_position(l, 
i);
 
  421           interpolated_x[
i] += x_local * psi(l);
 
  424           for (
unsigned j = 0; j < n_dim - 1; j++)
 
  426             interpolated_A(j, 
i) += x_local * dpsids(l, j);
 
  433       for (
unsigned i = 0; 
i < n_dim - 1; 
i++)
 
  435         for (
unsigned j = 0; j < n_dim - 1; j++)
 
  441           for (
unsigned k = 0; k < n_dim; k++)
 
  443             A(
i, j) += interpolated_A(
i, k) * interpolated_A(j, k);
 
  450       outer_unit_normal(ipt, interpolated_normal);
 
  460           Adet = A(0, 0) * A(1, 1) - A(0, 1) * A(1, 0);
 
  463           throw OomphLibError(
"Wrong dimension in PoroelasticityFaceElement",
 
  464                               OOMPH_CURRENT_FUNCTION,
 
  465                               OOMPH_EXCEPTION_LOCATION);
 
  470       double W = w * sqrt(Adet);
 
  474       get_traction(time, ipt, interpolated_x, interpolated_normal, traction);
 
  478       get_pressure(time, ipt, interpolated_x, interpolated_normal, pressure);
 
  481       for (
unsigned l = 0; l < n_node; l++)
 
  484         for (
unsigned i = 0; 
i < n_dim; 
i++)
 
  486           local_eqn = this->nodal_local_eqn(l, Element_pt->u_index(
i));
 
  491             residuals[local_eqn] -= traction[
i] * psi(l) * 
W;
 
  498       for (
unsigned l = 0; l < n_q_basis_edge; l++)
 
  500         local_eqn = this->nodal_local_eqn(1, Element_pt->q_edge_index(l));
 
  506           for (
unsigned i = 0; 
i < n_dim; 
i++)
 
  509             residuals[local_eqn] +=
 
  510               pressure * q_basis(l, 
i) * interpolated_normal[
i] * 
W;
 
A Class for the derivatives of shape functions The class design is essentially the same as Shape,...
FaceElements are elements that coincide with the faces of higher-dimensional "bulk" elements....
int & face_index()
Index of the face (a number that uniquely identifies the face in the element)
double zeta_nodal(const unsigned &n, const unsigned &k, const unsigned &i) const
In a FaceElement, the "global" intrinsic coordinate of the element along the boundary,...
//////////////////////////////////////////////////////////////////// ////////////////////////////////...
A general Finite Element class.
virtual void output(std::ostream &outfile)
Output the element data — typically the values at the nodes in a format suitable for post-processing.
virtual void build_face_element(const int &face_index, FaceElement *face_element_pt)
Function for building a lower dimensional FaceElement on the specified face of the FiniteElement....
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....
A class for elements that allow the imposition of an applied pressure in the Darcy equations....
void fill_in_contribution_to_jacobian(Vector< double > &residuals, DenseMatrix< double > &jacobian)
Fill in contribution from Jacobian.
void(*&)(const double &time, const Vector< double > &x, const Vector< double > &n, double &pressure) pressure_fct_pt()
Reference to the pressure function pointer.
void traction(const double &time, const Vector< double > &s, Vector< double > &traction)
Compute traction vector at specified local coordinate Should only be used for post-processing; ignore...
PoroelasticityFaceElement(FiniteElement *const &element_pt, const int &face_index)
Constructor, which takes a "bulk" element and the value of the index and its limit.
void output(FILE *file_pt, const unsigned &n_plot)
C-style output function.
void fill_in_contribution_to_residuals(Vector< double > &residuals)
Return the residuals.
void(* Traction_fct_pt)(const double &time, const Vector< double > &x, const Vector< double > &n, Vector< double > &result)
Pointer to an imposed traction function. Arguments: Eulerian coordinate; outer unit normal; applied t...
void(*&)(const double &time, const Vector< double > &x, const Vector< double > &n, Vector< double > &traction) traction_fct_pt()
Reference to the traction function pointer.
void output(std::ostream &outfile)
Output function.
ELEMENT * Element_pt
pointer to the bulk element this face element is attached to
void fill_in_contribution_to_residuals_darcy_face(Vector< double > &residuals)
Helper function that actually calculates the residuals.
void output(FILE *file_pt)
C_style output function.
virtual void get_traction(const double &time, const unsigned &intpt, const Vector< double > &x, const Vector< double > &n, Vector< double > &traction)
Get the traction vector: Pass number of integration point (dummy), Eulerlian coordinate and normal ve...
virtual void get_pressure(const double &time, const unsigned &intpt, const Vector< double > &x, const Vector< double > &n, double &pressure)
Get the pressure value: Pass number of integration point (dummy), Eulerlian coordinate and normal vec...
void pressure(const double &time, const Vector< double > &s, double &pressure)
Compute pressure value at specified local coordinate Should only be used for post-processing; ignores...
void output(std::ostream &outfile, const unsigned &n_plot)
Output function.
double zeta_nodal(const unsigned &n, const unsigned &k, const unsigned &i) const
Specify the value of nodal zeta from the face geometry The "global" intrinsic coordinate of the eleme...
void(* Pressure_fct_pt)(const double &time, const Vector< double > &x, const Vector< double > &n, double &result)
Pointer to an imposed pressure function. Arguments: Eulerian coordinate; outer unit normal; applied p...
RefineableElements are FiniteElements that may be subdivided into children to provide a better local ...
A Class for shape functions. In simple cases, the shape functions have only one index that can be tho...
void Zero_traction_fct(const double &time, const Vector< double > &x, const Vector< double > &N, Vector< double > &load)
Default load function (zero traction)
void Zero_pressure_fct(const double &time, const Vector< double > &x, const Vector< double > &N, double &load)
Default load function (zero pressure)
//////////////////////////////////////////////////////////////////// ////////////////////////////////...