27 #ifndef OOMPH_FOEPPLVONKARMAN_ELEMENTS_HEADER
28 #define OOMPH_FOEPPLVONKARMAN_ELEMENTS_HEADER
33 #include <oomph-lib-config.h>
39 #include "../generic/projection.h"
40 #include "../generic/nodes.h"
41 #include "../generic/Qelements.h"
42 #include "../generic/oomph_utilities.h"
86 const double&
eta()
const
105 if (data_pt->
nvalue() != 1)
107 throw OomphLibError(
"Data object that contains volume control pressure "
108 "should only contain a single value. ",
109 OOMPH_CURRENT_FUNCTION,
110 OOMPH_EXCEPTION_LOCATION);
139 const unsigned n_plot = 5;
145 void output(std::ostream& outfile,
const unsigned& n_plot);
150 const unsigned n_plot = 5;
156 void output(FILE* file_pt,
const unsigned& n_plot);
160 const unsigned& n_plot,
167 std::ostream& outfile,
168 const unsigned& n_plot,
173 "There is no time-dependent output_fct() for Foeppl von Karman"
175 OOMPH_CURRENT_FUNCTION,
176 OOMPH_EXCEPTION_LOCATION);
195 "There is no time-dependent compute_error() for Foeppl von Karman"
197 OOMPH_CURRENT_FUNCTION,
198 OOMPH_EXCEPTION_LOCATION);
231 double& pressure)
const
241 (*Pressure_fct_pt)(x, pressure);
251 double& airy_forcing)
const
261 (*Airy_forcing_fct_pt)(x, airy_forcing);
270 const unsigned n_node =
nnode();
283 for (
unsigned j = 0; j < 2; j++)
289 for (
unsigned l = 0; l < n_node; l++)
292 for (
unsigned j = 0; j < 2; j++)
294 gradient[j] += this->
nodal_value(l, w_nodal_index) * dpsidx(l, j);
309 unsigned index = 0)
const
312 const unsigned n_node =
nnode();
324 double interpolated_w = 0.0;
327 for (
unsigned l = 0; l < n_node; l++)
329 interpolated_w += this->
nodal_value(l, w_nodal_index) * psi[l];
332 return (interpolated_w);
348 const unsigned n_node =
nnode();
359 double integral_w = 0;
362 for (
unsigned ipt = 0; ipt < n_intpt; ipt++)
374 double interpolated_w = 0;
375 double w_nodal_value;
378 for (
unsigned l = 0; l < n_node; l++)
383 interpolated_w += w_nodal_value * psi(l);
387 integral_w += interpolated_w *
W;
410 unsigned total_fvk_nodal_indicies = 8;
413 unsigned n_node =
nnode();
416 for (
unsigned index = first_fvk_nodal_index + 2;
417 index < first_fvk_nodal_index + total_fvk_nodal_indicies;
421 for (
unsigned inod = 0; inod < n_node; inod++)
437 DShape& dtestdx)
const = 0;
447 DShape& dtestdx)
const = 0;
489 template<
unsigned NNODE_1D>
530 void output(std::ostream& outfile,
const unsigned& n_plot)
546 void output(FILE* file_pt,
const unsigned& n_plot)
555 const unsigned& n_plot,
566 const unsigned& n_plot,
571 outfile, n_plot, time, exact_soln_pt);
604 template<
unsigned NNODE_1D>
613 const double J = this->dshape_eulerian(
s, psi, dpsidx);
630 template<
unsigned NNODE_1D>
632 NNODE_1D>::dshape_and_dtest_eulerian_at_knot_fvk(
const unsigned& ipt,
639 const double J = this->dshape_eulerian_at_knot(ipt, psi, dpsidx);
661 template<
unsigned NNODE_1D>
663 :
public virtual QElement<1, NNODE_1D>
679 template<
class FVK_ELEMENT>
692 std::stringstream error_stream;
694 <<
"Foeppl von Karman elements only store eight fields so fld must be"
695 <<
"0 to 7 rather than " << fld << std::endl;
697 error_stream.str(), OOMPH_CURRENT_FUNCTION, OOMPH_EXCEPTION_LOCATION);
702 unsigned nnod = this->
nnode();
706 for (
unsigned j = 0; j < nnod; j++)
709 data_values[j] = std::make_pair(this->
node_pt(j), fld);
729 std::stringstream error_stream;
731 <<
"Foeppl von Karman elements only store eight fields so fld must be"
732 <<
"0 to 7 rather than " << fld << std::endl;
734 error_stream.str(), OOMPH_CURRENT_FUNCTION, OOMPH_EXCEPTION_LOCATION);
757 std::stringstream error_stream;
759 <<
"Foeppl von Karman elements only store eight fields so fld must be"
760 <<
"0 to 7 rather than " << fld << std::endl;
762 error_stream.str(), OOMPH_CURRENT_FUNCTION, OOMPH_EXCEPTION_LOCATION);
765 unsigned n_dim = this->
dim();
766 unsigned n_node = this->
nnode();
768 DShape dpsidx(n_node, n_dim), dtestdx(n_node, n_dim);
770 this->dshape_and_dtest_eulerian_fvk(
s, psi, dpsidx, test, dtestdx);
784 std::stringstream error_stream;
786 <<
"Foeppl von Karman elements only store eight fields so fld must be"
787 <<
"0 to 7 rather than " << fld << std::endl;
789 error_stream.str(), OOMPH_CURRENT_FUNCTION, OOMPH_EXCEPTION_LOCATION);
793 unsigned w_nodal_index = this->nodal_index_fvk(fld);
796 unsigned n_node = this->
nnode();
803 double interpolated_w = 0.0;
806 for (
unsigned l = 0; l < n_node; l++)
808 interpolated_w += this->
nodal_value(t, l, w_nodal_index) * psi[l];
810 return interpolated_w;
820 std::stringstream error_stream;
822 <<
"Foeppl von Karman elements only store eight fields so fld must be"
823 <<
"0 to 7 rather than " << fld << std::endl;
825 error_stream.str(), OOMPH_CURRENT_FUNCTION, OOMPH_EXCEPTION_LOCATION);
828 return this->
nnode();
838 std::stringstream error_stream;
840 <<
"Foeppl von Karman elements only store eight fields so fld must be"
841 <<
"0 to 7 rather than " << fld << std::endl;
843 error_stream.str(), OOMPH_CURRENT_FUNCTION, OOMPH_EXCEPTION_LOCATION);
846 const unsigned w_nodal_index = this->nodal_index_fvk(fld);
855 template<
class ELEMENT>
868 template<
class ELEMENT>
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 ...
void pin(const unsigned &i)
Pin the i-th stored variable.
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 ...
FaceGeometry()
Constructor: Call the constructor for the appropriate lower-dimensional QElement.
//////////////////////////////////////////////////////////////////// ////////////////////////////////...
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 double dshape_eulerian_at_knot(const unsigned &ipt, Shape &psi, DShape &dpsidx) const
Return the geometric shape functions and also first derivatives w.r.t. global coordinates at the ipt-...
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...
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)
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...
double raw_nodal_value(const unsigned &n, const unsigned &i) const
Return the i-th value stored at local node n but do NOT take hanging nodes into account.
void(* UnsteadyExactSolutionFctPt)(const double &, const Vector< double > &, Vector< double > &)
Function pointer for function that computes Vector-valued time-dependent function as .
A class for all isoparametric elements that solve the Foeppl von Karman equations.
void compute_error(std::ostream &outfile, FiniteElement::SteadyExactSolutionFctPt exact_soln_pt, double &error, double &norm)
Get error against and norm of exact solution.
void output(FILE *file_pt)
C_style output with default number of plot points.
double interpolated_w_fvk(const Vector< double > &s, unsigned index=0) const
Return FE representation of function value w_fvk(s) at local coordinate s (by default - if index > 0,...
FoepplvonKarmanPressureFctPt pressure_fct_pt() const
Access function: Pointer to pressure function. Const version.
void get_gradient_of_deflection(const Vector< double > &s, Vector< double > &gradient) const
Get gradient of deflection: gradient[i] = dw/dx_i.
void output_fct(std::ostream &outfile, const unsigned &n_plot, FiniteElement::SteadyExactSolutionFctPt exact_soln_pt)
Output exact soln: x,y,w_exact at n_plot^DIM plot points.
FoepplvonKarmanPressureFctPt airy_forcing_fct_pt() const
Access function: Pointer to Airy forcing function. Const version.
void(* FoepplvonKarmanPressureFctPt)(const Vector< double > &x, double &f)
Function pointer to pressure function fct(x,f(x)) – x is a Vector!
double *& eta_pt()
Pointer to eta.
virtual void output_fct(std::ostream &outfile, const unsigned &n_plot, const double &time, FiniteElement::UnsteadyExactSolutionFctPt exact_soln_pt)
Output exact soln: x,y,w_exact at n_plot^DIM plot points (dummy time-dependent version to keep intel ...
void output(std::ostream &outfile)
Output with default number of plot points.
void fill_in_contribution_to_residuals(Vector< double > &residuals)
Fill in the residuals with this element's contribution.
FoepplvonKarmanPressureFctPt & pressure_fct_pt()
Access function: Pointer to pressure function.
virtual void get_airy_forcing_fvk(const unsigned &ipt, const Vector< double > &x, double &airy_forcing) const
Get Airy forcing term at (Eulerian) position x. This function is virtual to allow overloading in mult...
FoepplvonKarmanEquations()
Constructor (must initialise the Pressure_fct_pt and Airy_forcing_fct_pt to null)....
virtual double dshape_and_dtest_eulerian_fvk(const Vector< double > &s, Shape &psi, DShape &dpsidx, Shape &test, DShape &dtestdx) const =0
Shape/test functions and derivs w.r.t. to global coords at local coord. s; return Jacobian of mapping...
int Volume_constraint_pressure_external_data_index
Index of the external Data object that represents the volume constraint pressure (initialised to -1 i...
void use_linear_bending_model()
Sets a flag to signify that we are solving the linear, pure bending equations, and pin all the nodal ...
virtual double get_bounded_volume() const
Return the integral of the displacement over the current element, effectively calculating its contrib...
bool Linear_bending_model
Flag which stores whether we are using a linear, pure bending model instead of the full non-linear Fo...
virtual void get_pressure_fvk(const unsigned &ipt, const Vector< double > &x, double &pressure) const
Get pressure term at (Eulerian) position x. This function is virtual to allow overloading in multi-ph...
double * Eta_pt
Pointer to global eta.
virtual unsigned nodal_index_fvk(const unsigned &i=0) const
Return the index at which the i-th unknown value is stored. The default value, i, is appropriate for ...
unsigned self_test()
Self-test: Return 0 for OK.
FoepplvonKarmanPressureFctPt & airy_forcing_fct_pt()
Access function: Pointer to Airy forcing function.
virtual double dshape_and_dtest_eulerian_at_knot_fvk(const unsigned &ipt, Shape &psi, DShape &dpsidx, Shape &test, DShape &dtestdx) const =0
Shape/test functions and derivs w.r.t. to global coords at integration point ipt; return Jacobian of ...
const double & eta() const
Eta.
FoepplvonKarmanPressureFctPt Pressure_fct_pt
Pointer to pressure function:
FoepplvonKarmanEquations(const FoepplvonKarmanEquations &dummy)=delete
Broken copy constructor.
void compute_error(std::ostream &outfile, FiniteElement::UnsteadyExactSolutionFctPt exact_soln_pt, const double &time, double &error, double &norm)
Dummy, time dependent error checker.
static double Default_Physical_Constant_Value
Default value for physical constants.
void interpolated_stress(const Vector< double > &s, double &sigma_xx, double &sigma_yy, double &sigma_xy)
Compute in-plane stresses.
FoepplvonKarmanPressureFctPt Airy_forcing_fct_pt
void set_volume_constraint_pressure_data_as_external_data(Data *data_pt)
Set Data value containing a single value which represents the volume control pressure as external dat...
void operator=(const FoepplvonKarmanEquations &)=delete
Broken assignment operator.
unsigned add_external_data(Data *const &data_pt, const bool &fd=true)
Add a (pointer to an) external data object to the element and return its index (i....
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....
Wrapper class for projectable elements. Adds "projectability" to the underlying ELEMENT.
///////////////////////////////////////////////////////////////////// ///////////////////////////////...
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.
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...
unsigned nhistory_values_for_coordinate_projection()
Number of positional history values (Note: count includes current value!)
unsigned nfields_for_projection()
Number of fields to be projected: Just two.
int local_equation(const unsigned &fld, const unsigned &j)
Return local equation number of field fld of node j.
unsigned nvalue_of_field(const unsigned &fld)
Return number of values in field fld: One per node.
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 nhistory_values_for_projection(const unsigned &fld)
Number of history values to be stored for fld-th field. (Note: count includes current value!...
/////////////////////////////////////////////////////////////////////// /////////////////////////////...
//////////////////////////////////////////////////////////////////////// ////////////////////////////...
void output(FILE *file_pt, const unsigned &n_plot)
C-style output function: x,y,w at n_plot^DIM plot points.
double dshape_and_dtest_eulerian_fvk(const Vector< double > &s, Shape &psi, DShape &dpsidx, Shape &test, DShape &dtestdx) const
Shape, test functions & derivs. w.r.t. to global coords. Return Jacobian.
void output(std::ostream &outfile)
Output function: x,y,w.
QFoepplvonKarmanElement(const QFoepplvonKarmanElement< NNODE_1D > &dummy)=delete
Broken copy constructor.
double dshape_and_dtest_eulerian_at_knot_fvk(const unsigned &ipt, Shape &psi, DShape &dpsidx, Shape &test, DShape &dtestdx) const
Shape, test functions & derivs. w.r.t. to global coords. at integration point ipt....
static const unsigned Initial_Nvalue
Static int that holds the number of variables at nodes: always the same.
void output(std::ostream &outfile, const unsigned &n_plot)
Output function: x,y,w at n_plot^DIM plot points.
void output(FILE *file_pt)
C-style output function: x,y,w.
void output_fct(std::ostream &outfile, const unsigned &n_plot, FiniteElement::SteadyExactSolutionFctPt exact_soln_pt)
Output function for an exact solution: x,y,w_exact at n_plot^DIM plot points.
unsigned required_nvalue(const unsigned &n) const
Required # of ‘values’ (pinned or dofs) at node n.
void output_fct(std::ostream &outfile, const unsigned &n_plot, const double &time, FiniteElement::UnsteadyExactSolutionFctPt exact_soln_pt)
Output function for a time-dependent exact solution. x,y,w_exact at n_plot^DIM plot points (Calls the...
QFoepplvonKarmanElement()
Constructor: Call constructors for QElement and FoepplvonKarmanEquations.
void operator=(const QFoepplvonKarmanElement< NNODE_1D > &)=delete
Broken assignment operator.
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)
//////////////////////////////////////////////////////////////////// ////////////////////////////////...