26 #ifndef OOMPH_AXISYM_POROELASTICITY_ELEMENTS_HEADER
27 #define OOMPH_AXISYM_POROELASTICITY_ELEMENTS_HEADER
31 #include <oomph-lib-config.h>
34 #include "../generic/elements.h"
35 #include "../generic/shape.h"
36 #include "../generic/error_estimator.h"
37 #include "../generic/projection.h"
96 const double&
nu()
const
101 std::ostringstream error_message;
102 error_message <<
"No pointer to Poisson's ratio set. Please set one!\n";
104 OOMPH_CURRENT_FUNCTION,
105 OOMPH_EXCEPTION_LOCATION);
241 for (
unsigned i = 0;
i < n;
i++)
248 (*Solid_body_force_fct_pt)(time, x, b);
263 for (
unsigned i = 0;
i < n;
i++)
270 (*Fluid_body_force_fct_pt)(time, x, b);
287 (*Mass_source_fct_pt)(time, x, b);
321 virtual double q_edge(
const unsigned& j)
const = 0;
325 virtual double q_edge(
const unsigned&
t,
const unsigned& j)
const = 0;
329 const unsigned& j)
const = 0;
344 virtual double q_internal(
const unsigned&
t,
const unsigned& j)
const = 0;
347 virtual void set_q_edge(
const unsigned& j,
const double& value) = 0;
356 const double& value) = 0;
362 const double& value) = 0;
378 Shape& q_basis)
const = 0;
383 Shape& div_q_basis_ds)
const = 0;
388 const unsigned n_node = this->
nnode();
389 Shape psi(n_node, 2);
390 const unsigned n_q_basis = this->
nq_basis();
391 Shape q_basis_local(n_q_basis, 2);
403 const unsigned& edge,
const unsigned& j)
const = 0;
408 const unsigned& edge,
const unsigned& j,
Vector<double>& x)
const = 0;
412 const double& value) = 0;
421 virtual double p_value(
const unsigned& j)
const = 0;
433 virtual void set_p_value(
const unsigned& j,
const double& value) = 0;
444 const Shape& q_basis_local,
447 Shape& q_basis)
const;
452 const Shape& q_basis_local,
454 Shape& q_basis)
const
456 const unsigned n_node = this->
nnode();
483 unsigned n_node =
nnode();
496 for (
unsigned i = 0;
i < 2;
i++)
499 div_dudt_components[
i] = 0.0;
503 for (
unsigned l = 0; l < n_node; l++)
505 div_dudt_components[
i] +=
du_dt(l,
i) * dpsidx(l,
i);
511 for (
unsigned l = 0; l < n_node; l++)
513 dur_dt +=
du_dt(l, 0) * psi(l);
517 div_dudt_components[0] += dur_dt / r;
520 return div_dudt_components[0] + div_dudt_components[1];
531 unsigned n_node =
nnode();
544 for (
unsigned i = 0;
i < 2;
i++)
550 div_u_components[
i] = 0.0;
554 for (
unsigned l = 0; l < n_node; l++)
556 div_u_components[
i] +=
nodal_value(l, u_nodal_index) * dpsidx(l,
i);
562 for (
unsigned l = 0; l < n_node; l++)
568 div_u_components[0] += ur / r;
571 return div_u_components[0] + div_u_components[1];
579 unsigned n_node =
nnode();
587 for (
unsigned i = 0;
i < 2;
i++)
596 for (
unsigned l = 0; l < n_node; l++)
607 unsigned n_node =
nnode();
622 for (
unsigned l = 0; l < n_node; l++)
635 const unsigned&
i)
const
638 unsigned n_node =
nnode();
653 for (
unsigned l = 0; l < n_node; l++)
667 unsigned n_node =
nnode();
675 for (
unsigned i = 0;
i < 2;
i++)
681 for (
unsigned l = 0; l < n_node; l++)
693 Shape q_basis(n_q_basis, 2);
695 for (
unsigned i = 0;
i < 2;
i++)
698 for (
unsigned l = 0; l < n_q_basis_edge; l++)
702 for (
unsigned l = n_q_basis_edge; l < n_q_basis; l++)
717 Shape q_basis(n_q_basis, 2);
719 for (
unsigned i = 0;
i < 2;
i++)
722 for (
unsigned l = 0; l < n_q_basis_edge; l++)
726 for (
unsigned l = n_q_basis_edge; l < n_q_basis; l++)
739 Shape q_basis(n_q_basis, 2);
743 for (
unsigned l = 0; l < n_q_basis_edge; l++)
745 q_i +=
q_edge(l) * q_basis(l,
i);
747 for (
unsigned l = n_q_basis_edge; l < n_q_basis; l++)
749 q_i +=
q_internal(l - n_q_basis_edge) * q_basis(l,
i);
759 const unsigned i)
const
764 Shape q_basis(n_q_basis, 2);
768 for (
unsigned l = 0; l < n_q_basis_edge; l++)
770 q_i +=
q_edge(
t, l) * q_basis(l,
i);
772 for (
unsigned l = n_q_basis_edge; l < n_q_basis; l++)
774 q_i +=
q_internal(
t, l - n_q_basis_edge) * q_basis(l,
i);
788 unsigned n_node =
nnode();
789 const unsigned n_q_basis =
nq_basis();
793 Shape div_q_basis_ds(n_q_basis);
813 for (
unsigned l = 0; l < n_q_basis_edge; l++)
815 div_q += 1.0 / det * div_q_basis_ds(l) *
q_edge(l);
820 for (
unsigned l = n_q_basis_edge; l < n_q_basis; l++)
822 div_q += 1.0 / det * div_q_basis_ds(l) *
q_internal(l - n_q_basis_edge);
853 Shape p_basis(n_p_basis);
862 for (
unsigned l = 0; l < n_p_basis; l++)
882 double du_dt(
const unsigned& n,
const unsigned&
i)
const
900 for (
unsigned t = 0;
t < n_time;
t++)
912 double d2u_dt2(
const unsigned& n,
const unsigned&
i)
const
930 for (
unsigned t = 0;
t < n_time;
t++)
959 for (
unsigned t = 0;
t < n_time;
t++)
989 for (
unsigned t = 0;
t < n_time;
t++)
1022 for (
unsigned j = 0; j < np; j++)
1030 for (
unsigned j = 0; j < nq; j++)
1037 for (
unsigned j = 0; j < nq; j++)
1061 const unsigned& nplot)
const
1068 for (
unsigned iplot = 0; iplot < num_plot_points; iplot++)
1098 file_out <<
du_dt[0] << std::endl;
1102 file_out <<
du_dt[1] << std::endl;
1107 std::stringstream error_stream;
1109 <<
"Axisymmetric poroelasticity elements only store 6 fields "
1112 OOMPH_CURRENT_FUNCTION,
1113 OOMPH_EXCEPTION_LOCATION);
1126 return "radial displacement";
1130 return "axial displacement";
1134 return "radial flux";
1138 return "axial flux";
1142 return "divergence of flux";
1146 return "pore pressure";
1150 return "radial skeleton velocity";
1154 return "axial skeleton velocity";
1159 std::stringstream error_stream;
1161 <<
"AxisymmetricPoroelasticityEquations only store 8 fields "
1164 OOMPH_CURRENT_FUNCTION,
1165 OOMPH_EXCEPTION_LOCATION);
1177 for (
unsigned i = 0;
i < 2;
i++)
1183 for (
unsigned i = 0;
i < 2;
i++)
1189 for (
unsigned i = 0;
i < 2;
i++)
1203 data.push_back(
du_dt[0]);
1204 data.push_back(
du_dt[1]);
1209 data.push_back(div_dudt_components[0]);
1210 data.push_back(div_dudt_components[1]);
1215 data.push_back(div_u_components[0]);
1216 data.push_back(div_u_components[1]);
1229 void output(std::ostream& outfile,
const unsigned& nplot);
1234 const unsigned& nplot,
1240 const unsigned& nplot,
1246 const unsigned& nplot,
1294 Shape& div_q_basis_ds,
1295 Shape& div_q_test_ds)
const = 0;
1300 const unsigned& ipt,
1311 Shape& div_q_basis_ds,
1312 Shape& div_q_test_ds)
const = 0;
1395 template<
class AXISYMMETRIC_POROELASTICITY_ELEMENT>
1413 std::stringstream error_stream;
1415 <<
"AxisymmetricPoroelasticity elements only store 4 fields so fld = "
1416 << fld <<
" is illegal \n";
1418 error_stream.str(), OOMPH_CURRENT_FUNCTION, OOMPH_EXCEPTION_LOCATION);
1430 Data* dat_pt = this->p_data_pt();
1431 unsigned nvalue = dat_pt->
nvalue();
1432 for (
unsigned i = 0;
i < nvalue;
i++)
1434 data_values.push_back(std::make_pair(dat_pt,
i));
1442 unsigned n = edge_dat_pt.size();
1443 for (
unsigned j = 0; j < n; j++)
1445 unsigned nvalue = this->nedge_flux_interpolation_point();
1446 for (
unsigned i = 0;
i < nvalue;
i++)
1448 data_values.push_back(
1449 std::make_pair(edge_dat_pt[j], this->q_edge_index(
i)));
1452 if (this->nq_basis_internal() > 0)
1454 Data* int_dat_pt = this->q_internal_data_pt();
1455 unsigned nvalue = int_dat_pt->
nvalue();
1456 for (
unsigned i = 0;
i < nvalue;
i++)
1458 data_values.push_back(std::make_pair(int_dat_pt,
i));
1466 unsigned nnod = this->
nnode();
1467 for (
unsigned j = 0; j < nnod; j++)
1471 data_values.push_back(std::make_pair(
1472 this->
node_pt(j), this->u_index_axisym_poroelasticity(fld)));
1494 std::stringstream error_stream;
1496 <<
"AxisymmetricPoroelasticity elements only store 4 fields so fld = "
1497 << fld <<
" is illegal\n";
1499 error_stream.str(), OOMPH_CURRENT_FUNCTION, OOMPH_EXCEPTION_LOCATION);
1507 if (fld == 2) return_value = 1;
1514 return return_value;
1533 std::stringstream error_stream;
1535 <<
"AxisymmetricPoroelasticity elements only store 4 fields so fld = "
1536 << fld <<
" is illegal.\n";
1538 error_stream.str(), OOMPH_CURRENT_FUNCTION, OOMPH_EXCEPTION_LOCATION);
1545 const unsigned n_dim = this->
dim();
1546 const unsigned n_node = this->
nnode();
1547 const unsigned n_q_basis = this->nq_basis();
1548 const unsigned n_p_basis = this->np_basis();
1552 Shape psi_geom(n_node), q_basis(n_q_basis, n_dim),
1553 q_test(n_q_basis, n_dim), p_basis(n_p_basis), p_test(n_p_basis),
1554 div_q_basis_ds(n_q_basis), div_q_test_ds(n_q_basis);
1555 DShape dpsidx_geom(n_node, n_dim);
1556 Shape u_basis(n_node);
1557 Shape u_test(n_node);
1558 DShape du_basis_dx(n_node, n_dim);
1559 DShape du_test_dx(n_node, n_dim);
1560 double J = this->shape_basis_test_local(
s,
1576 unsigned n = p_basis.nindex1();
1577 for (
unsigned i = 0;
i < n;
i++)
1579 psi[
i] = p_basis[
i];
1585 unsigned n = q_basis.
nindex1();
1586 unsigned m = q_basis.nindex2();
1587 for (
unsigned i = 0;
i < n;
i++)
1589 for (
unsigned j = 0; j < m; j++)
1591 psi(
i, j) = q_basis(
i, j);
1598 for (
unsigned j = 0; j < n_node; j++)
1600 psi[j] = u_basis[j];
1611 const unsigned& fld,
1617 std::stringstream error_stream;
1619 <<
"AxisymmetricPoroelasticity elements only store 4 fields so fld = "
1620 << fld <<
" is illegal\n";
1622 error_stream.str(), OOMPH_CURRENT_FUNCTION, OOMPH_EXCEPTION_LOCATION);
1626 double return_value = 0.0;
1636 "Pressure in AxisymmetricPoroelasticity has no time-dep.!",
1637 OOMPH_CURRENT_FUNCTION,
1638 OOMPH_EXCEPTION_LOCATION);
1641 this->interpolated_p(
s, return_value);
1647 "Don't call this function for AxisymmetricPoroelasticity!",
1648 OOMPH_CURRENT_FUNCTION,
1649 OOMPH_EXCEPTION_LOCATION);
1654 return_value = this->interpolated_u(
t,
s, fld);
1656 return return_value;
1666 std::stringstream error_stream;
1668 <<
"AxisymmetricPoroelasticity elements only store 4 fields so fld = "
1669 << fld <<
" is illegal\n";
1671 error_stream.str(), OOMPH_CURRENT_FUNCTION, OOMPH_EXCEPTION_LOCATION);
1675 unsigned return_value = 0;
1679 return_value = this->np_basis();
1684 return_value = this->nq_basis();
1689 return_value = this->
nnode();
1692 return return_value;
1702 std::stringstream error_stream;
1704 <<
"AxisymmetricPoroelasticity elements only store 4 fields so fld = "
1705 << fld <<
" is illegal\n";
1707 error_stream.str(), OOMPH_CURRENT_FUNCTION, OOMPH_EXCEPTION_LOCATION);
1711 int return_value = 0;
1716 return_value = this->p_local_eqn(j);
1721 unsigned nedge = this->nq_basis_edge();
1724 return_value = this->q_edge_local_eqn(j);
1728 return_value = this->q_internal_local_eqn(j - nedge);
1738 return return_value;
1743 void output(std::ostream& outfile,
const unsigned& nplot)
1754 const unsigned& flag)
1759 unsigned n_dim = this->
dim();
1768 const unsigned n_node = this->
nnode();
1780 for (
unsigned ipt = 0; ipt < n_intpt; ipt++)
1783 for (
unsigned i = 0;
i < n_dim;
i++)
1800 int local_eqn = 0, local_unknown = 0;
1808 if (solid_el_pt == 0)
1810 throw OomphLibError(
"Trying to project Lagrangian coordinates in "
1811 "non-SolidElement\n",
1812 OOMPH_CURRENT_FUNCTION,
1813 OOMPH_EXCEPTION_LOCATION);
1817 Shape psi(n_node, n_position_type);
1819 this->
shape(s, psi);
1832 double interpolated_xi_bar =
1837 for (
unsigned l = 0; l < n_node; ++l)
1840 for (
unsigned k = 0; k < n_position_type; ++k)
1850 residuals[local_eqn] +=
1851 (interpolated_xi_proj - interpolated_xi_bar) * psi(l, k) *
1857 for (
unsigned l2 = 0; l2 < n_node; l2++)
1860 for (
unsigned k2 = 0; k2 < n_position_type; k2++)
1864 if (local_unknown >= 0)
1866 jacobian(local_eqn, local_unknown) +=
1867 psi(l2, k2) * psi(l, k) *
W;
1883 Shape psi(n_node, n_position_type);
1885 this->
shape(s, psi);
1894 double interpolated_x_proj = 0.0;
1896 if (solid_el_pt != 0)
1898 interpolated_x_proj =
1904 interpolated_x_proj = this->
get_field(0, fld,
s);
1912 for (
unsigned l = 0; l < n_node; ++l)
1915 for (
unsigned k = 0; k < n_position_type; ++k)
1918 if (solid_el_pt != 0)
1932 if (n_position_type != 1)
1935 "positions not in SolidElement\n",
1936 OOMPH_CURRENT_FUNCTION,
1937 OOMPH_EXCEPTION_LOCATION);
1946 residuals[local_eqn] +=
1947 (interpolated_x_proj - interpolated_x_bar) * psi(l, k) *
W;
1952 for (
unsigned l2 = 0; l2 < n_node; l2++)
1955 for (
unsigned k2 = 0; k2 < n_position_type; k2++)
1958 if (solid_el_pt != 0)
1968 if (local_unknown >= 0)
1970 jacobian(local_eqn, local_unknown) +=
1971 psi(l2, k2) * psi(l, k) *
W;
2000 double interpolated_value_proj = this->
get_field(now, fld,
s);
2003 double interpolated_value_bar =
2007 for (
unsigned l = 0; l < n_value; l++)
2013 residuals[local_eqn] +=
2014 (interpolated_value_proj - interpolated_value_bar) *
2020 for (
unsigned l2 = 0; l2 < n_value; l2++)
2023 if (local_unknown >= 0)
2025 jacobian(local_eqn, local_unknown) +=
2026 psi[l2] * psi[l] *
W;
2037 Shape psi(n_value, n_dim);
2049 this->interpolated_q(now,
s, q_proj);
2053 cast_el_pt->interpolated_q(
2057 for (
unsigned l = 0; l < n_value; l++)
2063 for (
unsigned i = 0;
i < n_dim;
i++)
2066 residuals[local_eqn] +=
2067 (q_proj[
i] - q_bar[
i]) * psi(l,
i) *
W;
2072 for (
unsigned l2 = 0; l2 < n_value; l2++)
2075 if (local_unknown >= 0)
2077 jacobian(local_eqn, local_unknown) +=
2078 psi(l2,
i) * psi(l,
i) *
W;
2089 "Wrong field specified. This should never happen\n",
2090 OOMPH_CURRENT_FUNCTION,
2091 OOMPH_EXCEPTION_LOCATION);
2098 throw OomphLibError(
"Wrong type specificied in Projection_type. "
2099 "This should never happen\n",
2100 OOMPH_CURRENT_FUNCTION,
2101 OOMPH_EXCEPTION_LOCATION);
2115 template<
class ELEMENT>
Class implementing the generic maths of the axisym poroelasticity equations: axisym linear elasticity...
static double Default_lambda_sq_value
Static default value for timescale ratio.
void get_Z2_flux(const Vector< double > &s, Vector< double > &flux)
Z2 flux (use Darcy flux)
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.
static double Default_youngs_modulus_value
Static default value for Young's modulus (1.0 – for natural scaling, i.e. all stresses have been non-...
virtual unsigned q_internal_index() const =0
Return the index of the internal data where the q internal degrees of freedom are stored.
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 ...
void scalar_value_paraview(std::ofstream &file_out, const unsigned &i, const unsigned &nplot) const
Write values of the i-th scalar field at the plot points. Needs to be implemented for each new specif...
double * Lambda_sq_pt
Timescale ratio (non-dim. density)
virtual unsigned nedge_flux_interpolation_point() const =0
Returns the number of flux_interpolation points along each edge of the element.
double dq_internal_dt(const unsigned &n) const
dq_internal/dt for the n-th internal 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 ...
void point_output_data(const Vector< double > &s, Vector< double > &data)
Output solution in data vector at local cordinates s: r,z,u_r,u_z,q_r,q_z,div_q,p,...
unsigned num_Z2_flux_terms()
Number off flux terms for Z2 error estimator (use Darcy flux)
void output_with_projected_flux(std::ostream &outfile, const unsigned &nplot, const Vector< double > unit_normal)
Output incl. projection of fluxes into direction of the specified unit vector.
SourceFctPt & solid_body_force_fct_pt()
Access function: Pointer to solid body force function.
virtual void scale_basis(Shape &basis) const =0
Scale the edge basis to allow arbitrary edge mappings.
virtual unsigned u_index_axisym_poroelasticity(const unsigned &j) const =0
Return the nodal index of the j-th solid displacement unknown.
virtual Vector< Data * > q_edge_data_pt() const =0
Return vector of pointers to the Data objects that store the edge flux values.
unsigned self_test()
Self test.
unsigned nscalar_paraview() const
Number of scalars/fields output by this element. Reimplements broken virtual function in base class.
const double & porosity() const
Access function for the porosity.
virtual int q_edge_local_eqn(const unsigned &j) const =0
Return the equation number of the j-th edge (flux) degree of freedom.
void interpolated_u(const Vector< double > &s, Vector< double > &disp) const
Calculate the FE representation of u.
const double & youngs_modulus() const
Access function to non-dim Young's modulus (ratio of actual Young's modulus to reference stress used ...
virtual unsigned q_edge_node_number(const unsigned &j) const =0
Return the number of the node where the jth edge unknown is stored.
virtual void set_q_edge(const unsigned &t, const unsigned &j, const double &value)=0
Set the values of the j-th edge (flux) degree of freedom at time history level t.
virtual int q_internal_local_eqn(const unsigned &j) const =0
Return the equation number of the j-th internal degree of freedom.
double *& density_ratio_pt()
Access function for pointer to the density ratio (fluid to solid)
double interpolated_div_q(const Vector< double > &s) const
Calculate the FE representation of div q and return it.
double interpolated_u(const Vector< double > &s, const unsigned &i) const
Calculate the FE representation of the i-th component of u.
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
Compute the geometric basis, and the q, p and divergence basis functions and test functions at integr...
virtual void set_q_edge(const unsigned &j, const double &value)=0
Set the values of the j-th edge (flux) degree of freedom.
void interpolated_q(const Vector< double > &s, Vector< double > &q) const
Calculate the FE representation of q.
double interpolated_div_u(const Vector< double > &s, Vector< double > &div_u_components) const
Calculate the FE representation of the divergence of the skeleton displ, div(u), and its components: ...
void fill_in_contribution_to_residuals(Vector< double > &residuals)
Fill in contribution to residuals for the Darcy equations.
const double & permeability_ratio() const
Access function for the ratio of the material's actual permeability to the permeability used in the n...
AxisymmetricPoroelasticityEquations()
Constructor.
static double Default_porosity_value
Static default value for the porosity.
void(* MassSourceFctPt)(const double &time, const Vector< double > &x, double &f)
Mass source function pointer typedef.
double * Alpha_pt
Alpha – the biot parameter.
double * Nu_pt
Pointer to Poisson's ratio.
virtual void set_q_internal(const unsigned &j, const double &value)=0
Set the values of the j-th internal degree of freedom.
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
Compute the geometric basis, and the q, p and divergence basis functions and test functions at local ...
double du_dt(const unsigned &n, const unsigned &i) const
du/dt at local node n
virtual Data * p_data_pt() const =0
Return pointer to the Data object that stores the pressure values.
double * Porosity_pt
Porosity.
virtual unsigned q_edge_index(const unsigned &j) const =0
Return the nodal index at which the jth edge unknown is stored.
SourceFctPt Fluid_body_force_fct_pt
Pointer to fluid source function.
virtual void face_local_coordinate_of_flux_interpolation_point(const unsigned &edge, const unsigned &n, Vector< double > &s) const =0
Compute the face element coordinates of the nth flux interpolation point along an edge.
MassSourceFctPt mass_source_fct_pt() const
Access function: Pointer to mass source function (const version)
virtual unsigned face_index_of_q_edge_basis_fct(const unsigned &j) const =0
Return the face index associated with j-th edge flux degree of freedom.
double interpolated_q(const unsigned &t, const Vector< double > &s, const unsigned i) const
Calculate the FE representation of the i-th component of q at time level t (t=0: current)
double *& permeability_pt()
Access function for pointer to the nondim permeability.
static double Default_permeability_value
Static default value for the permeability (1.0 for natural scaling; i.e. timescale is given by L^2/(k...
double *& permeability_ratio_pt()
Access function for pointer to ratio of the material's actual permeability to the permeability used i...
void get_q_basis(const Vector< double > &s, Shape &q_basis) const
Compute the transformed basis at local coordinate s.
virtual unsigned face_index_of_edge(const unsigned &j) const =0
Return the face index associated with specified edge.
static double Default_permeability_ratio_value
Static default value for the ratio of the material's actual permeability to the permeability used to ...
void(* SourceFctPt)(const double &time, const Vector< double > &x, Vector< double > &f)
Source function pointer typedef.
virtual void pin_q_internal_value(const unsigned &j, const double &value)=0
Pin the jth internal q value and set it to specified value.
void interpolated_q(const unsigned &t, const Vector< double > &s, Vector< double > &q) const
Calculate the FE representation of q at time level t (t=0: current)
double *& nu_pt()
Access function for pointer to Poisson's ratio.
MassSourceFctPt Mass_source_fct_pt
Pointer to the mass source function.
void interpolated_div_q(const Vector< double > &s, double &div_q) const
Calculate the FE representation of div u.
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.
virtual unsigned nq_basis() const
Return the total number of computational basis functions for q.
virtual double q_edge(const unsigned &t, const unsigned &j) const =0
Return the values of the j-th edge (flux) degree of freedom at time history level t.
virtual unsigned required_nvalue(const unsigned &n) const =0
Number of values required at node n.
virtual void edge_flux_interpolation_point_global(const unsigned &edge, const unsigned &j, Vector< double > &x) const =0
Compute the global coordinates of the jth flux_interpolation point along an edge.
const double & density_ratio() const
Access function for the density ratio (fluid to solid)
SourceFctPt & fluid_body_force_fct_pt()
Access function: Pointer to fluid force function.
double *& youngs_modulus_pt()
Pointer to non-dim Young's modulus (ratio of actual Young's modulus to reference stress used to non-d...
double * Permeability_pt
permeability
virtual void set_p_value(const unsigned &j, const double &value)=0
Set the jth pressure value.
const double & lambda_sq() const
Access function for timescale ratio (nondim density)
double * Youngs_modulus_pt
Pointer to the nondim Young's modulus.
void switch_off_darcy()
Switch off Darcy flow.
virtual void pin_p_value(const unsigned &j, const double &p)=0
Pin the jth pressure value and set it to p.
double *& alpha_pt()
Access function for pointer to alpha, the Biot parameter.
virtual unsigned nq_basis_edge() const =0
Return the number of edge basis functions for q.
virtual double q_internal(const unsigned &j) const =0
Return the values of the j-th internal degree of freedom.
void interpolated_p(const Vector< double > &s, double &p) const
Calculate the FE representation of p.
void set_q_internal_timestepper(TimeStepper *const time_stepper_pt)
Set the timestepper of the q internal data object.
void interpolated_du_dt(const Vector< double > &s, Vector< double > &du_dt) const
Calculate the FE representation of du_dt.
bool darcy_is_switched_off()
Is Darcy flow switched off?
virtual double p_value(const unsigned &j) const =0
Return the jth pressure value.
std::string scalar_name_paraview(const unsigned &i) const
Name of the i-th scalar field. Default implementation returns V1 for the first one,...
double interpolated_div_du_dt(const Vector< double > &s, Vector< double > &div_dudt_components) const
Calculate the FE representation of the divergence of the skeleton velocity, div(du/dt),...
const double & permeability() const
Access function for the nondim permeability.
SourceFctPt solid_body_force_fct_pt() const
Access function: Pointer to solid body force function (const version)
virtual void fill_in_generic_residual_contribution(Vector< double > &residuals, DenseMatrix< double > &jacobian, bool flag)
Fill in residuals and, if flag==true, jacobian.
double interpolated_p(const Vector< double > &s) const
Calculate the FE representation of p and return it.
virtual void get_div_q_basis_local(const Vector< double > &s, Shape &div_q_basis_ds) const =0
Compute the local form of the q basis and dbasis/ds at local coordinate s.
SourceFctPt fluid_body_force_fct_pt() const
Access function: Pointer to fluid force function (const version)
double interpolated_q(const Vector< double > &s, const unsigned i) const
Calculate the FE representation of the i-th component of q.
MassSourceFctPt & mass_source_fct_pt()
Access function: Pointer to mass source function.
double d2u_dt2(const unsigned &n, const unsigned &i) const
d^2u/dt^2 at local node n
static double Default_density_ratio_value
Static default value for the density ratio.
virtual double q_internal(const unsigned &t, const unsigned &j) const =0
Return the values of the j-th internal degree of freedom at time history level t.
const double & alpha() const
Access function for alpha, the Biot parameter.
bool Darcy_is_switched_off
Boolean to record that darcy has been switched off.
virtual void pin_q_edge_value(const unsigned &j, const double &value)=0
Pin the j-th edge (flux) degree of freedom and set it to specified value.
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^2 plot points.
SourceFctPt Solid_body_force_fct_pt
Pointer to solid body force function.
void fluid_body_force(const double &time, const Vector< double > &x, Vector< double > &b) const
Indirect access to the fluid body force function - returns 0 if no forcing function has been set.
static double Default_alpha_value
Static default value for alpha, the biot parameter.
double * Permeability_ratio_pt
Ratio of the material's actual permeability to the permeability used in the non-dimensionalisation of...
double interpolated_u(const unsigned &t, const Vector< double > &s, const unsigned &i) const
Calculate the FE representation of the i-th component of u at time level t (t=0: current)
void solid_body_force(const double &time, const Vector< double > &x, Vector< double > &b) const
Indirect access to the solid body force function - returns 0 if no forcing function has been set.
virtual Vector< double > edge_flux_interpolation_point(const unsigned &edge, const unsigned &j) const =0
Returns the local coordinate of the jth flux_interpolation point along the specified edge.
virtual Data * q_internal_data_pt() const =0
Return pointer to the Data object that stores the internal flux values.
virtual double q_edge(const unsigned &j) const =0
Return the values of the j-th edge (flux) degree of freedom.
const double & nu() const
Access function for Poisson's ratio.
double *& lambda_sq_pt()
Access function for pointer to timescale ratio (nondim density)
virtual void get_p_basis(const Vector< double > &s, Shape &p_basis) const =0
Compute the pressure basis.
void fill_in_contribution_to_jacobian(Vector< double > &residuals, DenseMatrix< double > &jacobian)
Fill in the Jacobian matrix for the Newton method.
double dq_edge_dt(const unsigned &n) const
dq_edge/dt for the n-th edge degree of freedom
double * Density_ratio_pt
Density ratio.
double *& porosity_pt()
Access function for pointer to the porosity.
virtual void set_q_internal(const unsigned &t, const unsigned &j, const double &value)=0
Set the values of the j-th internal degree of freedom at time history level t.
virtual unsigned nq_basis_internal() const =0
Return the number of internal basis functions for q.
void output(std::ostream &outfile)
Output with default number of plot points.
virtual int p_local_eqn(const unsigned &j) const =0
Return the equation number of the j-th pressure degree of freedom.
virtual void get_q_basis_local(const Vector< double > &s, Shape &q_basis) const =0
Comute the local form of the q basis at local coordinate s.
A Class for the derivatives of shape functions The class design is essentially the same as Shape,...
A class that represents a collection of data; each Data object may contain many different individual ...
TimeStepper *& time_stepper_pt()
Return the pointer to the timestepper.
unsigned nvalue() const
Return number of values stored in data object (incl pinned ones).
unsigned ntstorage() const
Return total number of doubles stored per value to record time history of each value (one for steady ...
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...
Vector< double > & external_element_local_coord(const unsigned &interaction_index, const unsigned &ipt)
Access function to get source element's local coords for specified interaction index at specified int...
FiniteElement *& external_element_pt(const unsigned &interaction_index, const unsigned &ipt)
Access function to source element for specified interaction index at specified integration point.
Base class for finite elements that can compute the quantities that are required for the Z2 error est...
//////////////////////////////////////////////////////////////////// ////////////////////////////////...
A general Finite Element class.
virtual unsigned nplot_points_paraview(const unsigned &nplot) const
Return the number of actual plot points for paraview plot with parameter nplot. Broken virtual; can b...
virtual double J_eulerian(const Vector< double > &s) const
Return the Jacobian of mapping from local to global coordinates at local position s.
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...
unsigned nnodal_position_type() const
Return the number of coordinate types that the element requires to interpolate the geometry between t...
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...
virtual double interpolated_x(const Vector< double > &s, const unsigned &i) const
Return FE interpolated coordinate x[i] at local coordinate s.
int nodal_local_eqn(const unsigned &n, const unsigned &i) const
Return the local equation number corresponding to the i-th value at the n-th local node.
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 .
Integral *const & integral_pt() const
Return the pointer to the integration scheme (const version)
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 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...
double dshape_eulerian(const Vector< double > &s, Shape &psi, DShape &dpsidx) const
Compute the geometric shape functions and also first derivatives w.r.t. global coordinates at local c...
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.
virtual double knot(const unsigned &i, const unsigned &j) const =0
Return local coordinate s[j] of i-th integration point.
virtual unsigned nweight() const =0
Return the number of integration points of the scheme.
virtual double weight(const unsigned &i) const =0
Return weight of i-th integration point.
TimeStepper *& position_time_stepper_pt()
Return a pointer to the position timestepper.
An OomphLibError object which should be thrown when an run-time error is encountered....
///////////////////////////////////////////////////////////////////// ///////////////////////////////...
unsigned nhistory_values_for_coordinate_projection()
Number of positional history values (Note: count includes current value!)
int local_equation(const unsigned &fld, const unsigned &j)
Return local equation number of value j in field fld.
void residual_for_projection(Vector< double > &residuals, DenseMatrix< double > &jacobian, const unsigned &flag)
Residual for the projection step. Flag indicates if we want the Jacobian (1) or not (0)....
ProjectableAxisymmetricPoroelasticityElement()
Constructor [this was only required explicitly from gcc 4.5.2 onwards...].
double jacobian_and_shape_of_field(const unsigned &fld, const Vector< double > &s, Shape &psi)
Return Jacobian of mapping and shape functions of field fld at local coordinate s.
unsigned nfields_for_projection()
Number of fields to be projected: 4 (two displacement components, pressure, Darcy flux)
Vector< std::pair< Data *, unsigned > > data_values_of_field(const unsigned &fld)
Specify the values associated with field fld. The information is returned in a vector of pairs which ...
unsigned nvalue_of_field(const unsigned &fld)
Return number of values in field fld.
double get_field(const unsigned &t, const unsigned &fld, const Vector< double > &s)
Return interpolated field fld at local coordinate s, at time level t (t=0: present; t>0: history valu...
void output(std::ostream &outfile, const unsigned &nplot)
Output FE representation of soln as in underlying element.
unsigned nhistory_values_for_projection(const unsigned &fld)
Number of history values to be stored for fld-th field. (Note: count includes current value!...
Template-free Base class for projectable elements.
unsigned Projected_lagrangian
When projecting the Lagrangain coordinates indicate which coordiante is to be projected.
Projection_Type Projection_type
Variable to indicate if we're projecting the history values of the nodal coordinates (Coordinate) the...
unsigned Time_level_for_projection
Time level we are projecting (0=current values; >0: history values)
unsigned Projected_field
Field that is currently being projected.
unsigned Projected_coordinate
When projecting the history values of the nodal coordinates, this is the coordinate we're projecting.
virtual double get_field(const unsigned &time, const unsigned &fld, const Vector< double > &s)=0
Return the fld-th field at local coordinates s at time-level time (time=0: current value; time>0: his...
Wrapper class for projectable elements. Adds "projectability" to the underlying ELEMENT.
A Class for shape functions. In simple cases, the shape functions have only one index that can be tho...
unsigned nindex1() const
Return the range of index 1 of the shape function object.
////////////////////////////////////////////////////////////////////// //////////////////////////////...
int position_local_eqn(const unsigned &n, const unsigned &k, const unsigned &j) const
Access function that returns the local equation number that corresponds to the j-th coordinate of the...
////////////////////////////////////////////////////////////////////// //////////////////////////////...
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...
void output()
Doc the command line arguments.
std::string string(const unsigned &i)
Return the i-th string or "" if the relevant string hasn't been defined.
//////////////////////////////////////////////////////////////////// ////////////////////////////////...