26 #ifndef OOMPH_POROELASTICITY_ELEMENTS_HEADER
27 #define OOMPH_POROELASTICITY_ELEMENTS_HEADER
31 #include <oomph-lib-config.h>
34 #include "../generic/elements.h"
35 #include "../generic/shape.h"
37 #include "elasticity_tensor.h"
44 template<
unsigned DIM>
179 for (
unsigned i = 0;
i < n;
i++)
186 (*Force_solid_fct_pt)(time, x, b);
201 for (
unsigned i = 0;
i < n;
i++)
208 (*Force_fluid_fct_pt)(time, x, b);
225 (*Mass_source_fct_pt)(time, x, b);
236 const double E(
const unsigned&
i,
239 const unsigned& l)
const
255 virtual unsigned u_index(
const unsigned& n)
const = 0;
275 virtual double q_edge(
const unsigned& n)
const = 0;
279 virtual double q_edge(
const unsigned&
t,
const unsigned& n)
const = 0;
286 virtual double q_internal(
const unsigned&
t,
const unsigned& n)
const = 0;
296 Shape& q_basis)
const = 0;
301 Shape& div_q_basis_ds)
const = 0;
306 const unsigned n_node = this->
nnode();
307 Shape psi(n_node, DIM);
308 const unsigned n_q_basis = this->
nq_basis();
309 Shape q_basis_local(n_q_basis, DIM);
319 const unsigned& n)
const = 0;
333 virtual double p_value(
unsigned& n)
const = 0;
350 const Shape& q_basis_local,
353 Shape& q_basis)
const;
358 const Shape& q_basis_local,
360 Shape& q_basis)
const
362 const unsigned n_node = this->
nnode();
385 unsigned n_node =
nnode();
393 for (
unsigned i = 0;
i < DIM;
i++)
396 unsigned u_nodal_index =
u_index(
i);
402 for (
unsigned l = 0; l < n_node; l++)
413 unsigned n_node =
nnode();
422 unsigned u_nodal_index =
u_index(
i);
428 for (
unsigned l = 0; l < n_node; l++)
442 Shape q_basis(n_q_basis, DIM);
445 for (
unsigned i = 0;
i < DIM;
i++)
448 for (
unsigned l = 0; l < n_q_basis_edge; l++)
452 for (
unsigned l = n_q_basis_edge; l < n_q_basis; l++)
465 Shape q_basis(n_q_basis, DIM);
469 for (
unsigned l = 0; l < n_q_basis_edge; l++)
471 q_i +=
q_edge(l) * q_basis(l,
i);
473 for (
unsigned l = n_q_basis_edge; l < n_q_basis; l++)
475 q_i +=
q_internal(l - n_q_basis_edge) * q_basis(l,
i);
488 unsigned n_node =
nnode();
489 const unsigned n_q_basis =
nq_basis();
493 Shape div_q_basis_ds(n_q_basis);
513 for (
unsigned l = 0; l < n_q_basis_edge; l++)
515 div_q += 1.0 / det * div_q_basis_ds(l) *
q_edge(l);
520 for (
unsigned l = n_q_basis_edge; l < n_q_basis; l++)
522 div_q += 1.0 / det * div_q_basis_ds(l) *
q_internal(l - n_q_basis_edge);
546 Shape p_basis(n_p_basis);
555 for (
unsigned l = 0; l < n_p_basis; l++)
575 double du_dt(
const unsigned& n,
const unsigned&
i)
const
587 const unsigned u_nodal_index =
u_index(
i);
593 for (
unsigned t = 0;
t < n_time;
t++)
605 double d2u_dt2(
const unsigned& n,
const unsigned&
i)
const
617 const unsigned u_nodal_index =
u_index(
i);
623 for (
unsigned t = 0;
t < n_time;
t++)
652 for (
unsigned t = 0;
t < n_time;
t++)
682 for (
unsigned t = 0;
t < n_time;
t++)
714 void output(std::ostream& outfile,
const unsigned& nplot);
719 const unsigned& nplot,
725 const unsigned& nplot,
758 Shape& div_q_basis_ds,
759 Shape& div_q_test_ds)
const = 0;
775 Shape& div_q_basis_ds,
776 Shape& div_q_test_ds)
const = 0;
A Class for the derivatives of shape functions The class design is essentially the same as Shape,...
TimeStepper *& time_stepper_pt()
Return the pointer to the timestepper.
void set_time_stepper(TimeStepper *const &time_stepper_pt, const bool &preserve_existing_data)
Set a new timestepper by resizing the appropriate storage. If already assigned the equation numbering...
A base class that represents the fourth-rank elasticity tensor defined such that.
A general Finite Element class.
Node *& node_pt(const unsigned &n)
Return a pointer to the local node n.
double nodal_value(const unsigned &n, const unsigned &i) const
Return the i-th value stored at local node n. Produces suitably interpolated values for hanging nodes...
virtual void shape(const Vector< double > &s, Shape &psi) const =0
Calculate the geometric shape functions at local coordinate s. This function must be overloaded for e...
unsigned dim() const
Return the spatial dimension of the element, i.e. the number of local coordinates required to paramet...
unsigned nnode() const
Return the number of nodes.
void(* SteadyExactSolutionFctPt)(const Vector< double > &, Vector< double > &)
Function pointer for function that computes vector-valued steady "exact solution" as .
virtual double local_to_eulerian_mapping(const DShape &dpsids, DenseMatrix< double > &jacobian, DenseMatrix< double > &inverse_jacobian) const
Calculate the mapping from local to Eulerian coordinates, given the derivatives of the shape function...
virtual void dshape_local(const Vector< double > &s, Shape &psi, DShape &dpsids) const
Function to compute the geometric shape functions and derivatives w.r.t. local coordinates at local c...
void(* UnsteadyExactSolutionFctPt)(const double &, const Vector< double > &, Vector< double > &)
Function pointer for function that computes Vector-valued time-dependent function as .
Data *& internal_data_pt(const unsigned &i)
Return a pointer to i-th internal data object.
static DenseMatrix< double > Dummy_matrix
Empty dense matrix used as a dummy argument to combined residual and jacobian functions in the case w...
TimeStepper *& time_stepper_pt()
Access function for pointer to time stepper: Null if object is not time-dependent.
Class implementing the generic maths of the poroelasticity equations: linear elasticity coupled with ...
MassSourceFctPt & mass_source_fct_pt()
Access function: Pointer to mass source function.
SourceFctPt & force_fluid_fct_pt()
Access function: Pointer to fluid force function.
double dq_internal_dt(const unsigned &n) const
dq_internal/dt for the n-th internal degree of freedom
const double & porosity() const
Access function for the porosity.
virtual int q_edge_local_eqn(const unsigned &n) const =0
Return the equation number of the n-th edge (flux) degree of freedom.
SourceFctPt Force_fluid_fct_pt
Pointer to fluid source function.
void output_fct(std::ostream &outfile, const unsigned &nplot, FiniteElement::SteadyExactSolutionFctPt exact_soln_pt)
Output FE representation of exact soln: x,y,u1,u2,div_q,p at Nplot^DIM plot points.
virtual double shape_basis_test_local(const Vector< double > &s, Shape &psi, DShape &dpsi, Shape &u_basis, Shape &u_test, DShape &du_basis_dx, DShape &du_test_dx, Shape &q_basis, Shape &q_test, Shape &p_basis, Shape &p_test, Shape &div_q_basis_ds, Shape &div_q_test_ds) const =0
Returns the geometric basis, and the q, p and divergence basis functions and test functions at local ...
MassSourceFctPt Mass_source_fct_pt
Pointer to the mass source function.
double *& alpha_pt()
Access function for pointer to alpha.
ElasticityTensor *& elasticity_tensor_pt()
Return the pointer to the elasticity_tensor.
virtual double shape_basis_test_local_at_knot(const unsigned &ipt, Shape &psi, DShape &dpsi, Shape &u_basis, Shape &u_test, DShape &du_basis_dx, DShape &du_test_dx, Shape &q_basis, Shape &q_test, Shape &p_basis, Shape &p_test, Shape &div_q_basis_ds, Shape &div_q_test_ds) const =0
Returns the geometric basis, and the q, p and divergence basis functions and test functions at integr...
void(* SourceFctPt)(const double &time, const Vector< double > &x, Vector< double > &f)
Source function pointer typedef.
double * Porosity_pt
Porosity.
SourceFctPt force_fluid_fct_pt() const
Access function: Pointer to fluid force function (const version)
double interpolated_u(const Vector< double > &s, const unsigned &i) const
Calculate the FE representation of the i-th component of u.
const double & k_inv() const
Access function for the nondim inverse permeability.
virtual void pin_q_internal_value(const unsigned &n)=0
Pin the nth internal q value.
static double Default_porosity_value
Static default value for the porosity.
void force_solid(const double &time, const Vector< double > &x, Vector< double > &b) const
Indirect access to the solid force function - returns 0 if no forcing function has been set.
void mass_source(const double &time, const Vector< double > &x, double &b) const
Indirect access to the mass source function - returns 0 if no mass source function has been set.
SourceFctPt Force_solid_fct_pt
Pointer to solid source function.
virtual unsigned q_edge_node_number(const unsigned &n) const =0
Return the number of the node where the nth edge unknown is stored.
const double & alpha() const
Access function for alpha.
virtual unsigned u_index(const unsigned &n) const =0
Return the nodal index of the n-th solid displacement unknown.
virtual int q_internal_local_eqn(const unsigned &n) const =0
Return the equation number of the n-th internal (moment) degree of freedom.
double transform_basis(const Vector< double > &s, const Shape &q_basis_local, Shape &psi, DShape &dpsi, Shape &q_basis) const
Performs a div-conserving transformation of the vector basis functions from the reference element to ...
virtual unsigned np_basis() const =0
Return the total number of pressure basis functions.
static double Default_density_ratio_value
Static default value for the density ratio.
void get_stress(const Vector< double > &s, DenseMatrix< double > &sigma) const
Return the Cauchy stress tensor, as calculated from the elasticity tensor at specified local coordina...
virtual void fill_in_generic_residual_contribution(Vector< double > &residuals, DenseMatrix< double > &jacobian, bool flag)
Fill in residuals and, if flag==true, jacobian.
virtual unsigned q_internal_index() const =0
Return the index of the internal data where the q_internal degrees of freedom are stored.
double dq_edge_dt(const unsigned &n) const
dq_edge/dt for the n-th edge degree of freedom
void interpolated_p(const Vector< double > &s, double &p) const
Calculate the FE representation of p.
void fill_in_contribution_to_residuals(Vector< double > &residuals)
Fill in contribution to residuals for the Darcy equations.
double d2u_dt2(const unsigned &n, const unsigned &i) const
d^2u/dt^2 at local node n
virtual void pin_p_value(const unsigned &n, const double &p)=0
Pin the nth pressure value.
double interpolated_div_q(const Vector< double > &s)
Calculate the FE representation of div q and return it.
virtual double q_edge(const unsigned &n) const =0
Return the values of the edge (flux) degrees of freedom.
void interpolated_q(const Vector< double > &s, Vector< double > &u) const
Calculate the FE representation of q.
const double & density_ratio() const
Access function for the density ratio.
double *& lambda_sq_pt()
Access function for pointer to timescale ratio (nondim density)
double *& density_ratio_pt()
Access function for pointer to the density ratio.
void fill_in_contribution_to_jacobian(Vector< double > &residuals, DenseMatrix< double > &jacobian)
Fill in the Jacobian matrix for the Newton method.
virtual unsigned nq_basis_edge() const =0
Return the number of edge basis functions for q.
void(* MassSourceFctPt)(const double &time, const Vector< double > &x, double &f)
Mass source function pointer typedef.
virtual void scale_basis(Shape &basis) const =0
Scale the edge basis to allow arbitrary edge mappings.
static double Default_lambda_sq_value
Static default value for timescale ratio (1.0 – for natural scaling)
virtual double q_internal(const unsigned &n) const =0
Return the values of the internal (moment) degrees of freedom.
static double Default_alpha_value
Static default value for alpha.
virtual void edge_gauss_point_global(const unsigned &edge, const unsigned &n, Vector< double > &x) const =0
Returns the global coordinates of the nth gauss point along an edge.
virtual double q_internal(const unsigned &t, const unsigned &n) const =0
Return the values of the internal (moment) degrees of freedom at time history level t.
virtual int p_local_eqn(const unsigned &n) const =0
Return the equation number of the n-th pressure degree of freedom.
void compute_error(std::ostream &outfile, FiniteElement::SteadyExactSolutionFctPt exact_soln_pt, Vector< double > &error, Vector< double > &norm)
Compute the error between the FE solution and the exact solution using the H(div) norm for q and L^2 ...
ElasticityTensor * Elasticity_tensor_pt
Pointer to the elasticity tensor.
void set_q_internal_timestepper(TimeStepper *const time_stepper_pt)
Set the timestepper of the q internal data object.
virtual unsigned nedge_gauss_point() const =0
Returns the number of gauss points along each edge of the element.
void force_fluid(const double &time, const Vector< double > &x, Vector< double > &b) const
Indirect access to the fluid forcing function - returns 0 if no forcing function has been set.
PoroelasticityEquations()
Constructor.
void get_q_basis(const Vector< double > &s, Shape &q_basis) const
Returns the transformed basis at local coordinate s.
virtual void get_q_basis_local(const Vector< double > &s, Shape &q_basis) const =0
Returns the local form of the q basis at local coordinate s.
virtual unsigned required_nvalue(const unsigned &n) const =0
Number of values required at node n.
double *& k_inv_pt()
Access function for pointer to the nondim inverse permeability.
MassSourceFctPt mass_source_fct_pt() const
Access function: Pointer to mass source function (const version)
virtual double p_value(unsigned &n) const =0
Return the nth pressure value.
virtual unsigned q_edge_index(const unsigned &n) const =0
Return the nodal index at which the nth edge unknown is stored.
const double & lambda_sq() const
Access function for timescale ratio (nondim density)
double interpolated_p(const Vector< double > &s) const
Calculate the FE representation of p and return it.
double * Density_ratio_pt
Density ratio.
static double Default_k_inv_value
Static default value for 1/k.
double interpolated_q(const Vector< double > &s, const unsigned i) const
Calculate the FE representation of the i-th component of q.
void interpolated_div_q(const Vector< double > &s, double &div_q) const
Calculate the FE representation of div u.
void output(std::ostream &outfile)
Output with default number of plot points.
unsigned self_test()
Self-test: Check inversion of element & do self-test for GeneralisedElement. Return 0 if OK.
double du_dt(const unsigned &n, const unsigned &i) const
du/dt at local node n
virtual void get_div_q_basis_local(const Vector< double > &s, Shape &div_q_basis_ds) const =0
Returns the local form of the q basis and dbasis/ds at local coordinate s.
const double E(const unsigned &i, const unsigned &j, const unsigned &k, const unsigned &l) const
Access function to the entries in the elasticity tensor.
SourceFctPt & force_solid_fct_pt()
Access function: Pointer to solid force function.
void interpolated_u(const Vector< double > &s, Vector< double > &disp) const
Calculate the FE representation of u.
SourceFctPt force_solid_fct_pt() const
Access function: Pointer to solid force function (const version)
void get_strain(const Vector< double > &s, DenseMatrix< double > &strain) const
Return the strain tensor.
virtual unsigned nq_basis() const =0
Return the total number of computational basis functions for q.
virtual double q_edge(const unsigned &t, const unsigned &n) const =0
Return the values of the edge (flux) degrees of freedom at time history level t.
double transform_basis(const Vector< double > &s, const Shape &q_basis_local, Shape &psi, Shape &q_basis) const
Performs a div-conserving transformation of the vector basis functions from the reference element to ...
double * Lambda_sq_pt
Timescale ratio (non-dim. density)
virtual double edge_gauss_point(const unsigned &edge, const unsigned &n) const =0
Returns the nth gauss point along an edge.
virtual void get_p_basis(const Vector< double > &s, Shape &p_basis) const =0
Return the pressure basis.
double *& porosity_pt()
Access function for pointer to the porosity.
A Class for shape functions. In simple cases, the shape functions have only one index that can be tho...
////////////////////////////////////////////////////////////////////// //////////////////////////////...
unsigned ntstorage() const
Return the number of doubles required to represent history (one for steady)
virtual double weight(const unsigned &i, const unsigned &j) const
Access function for j-th weight for the i-th derivative.
bool is_steady() const
Flag to indicate if a timestepper has been made steady (possibly temporarily to switch off time-depen...
//////////////////////////////////////////////////////////////////// ////////////////////////////////...