29 #ifndef OOMPH_AXISYM_FLUID_TRACTION_ELEMENTS_HEADER
30 #define OOMPH_AXISYM_FLUID_TRACTION_ELEMENTS_HEADER
34 #include <oomph-lib-config.h>
39 #include "../generic/shape.h"
40 #include "../generic/elements.h"
41 #include "../generic/element_with_external_element.h"
50 namespace AxisymmetricNavierStokesTractionElementHelper
56 const Vector<double>&
x,
57 const Vector<double>&
N,
58 Vector<double>&
load);
70 template<
class ELEMENT>
96 const unsigned& intpt,
128 ELEMENT* cast_element_pt =
dynamic_cast<ELEMENT*
>(element_pt);
129 this->U_index_axisymmetric_nst_traction.resize(n_dim + 1);
130 for (
unsigned i = 0;
i < n_dim + 1;
i++)
132 this->U_index_axisymmetric_nst_traction[
i] =
133 cast_element_pt->u_index_axi_nst(
i);
174 const unsigned&
i)
const
193 return 2 * (n_dim + 1);
200 const unsigned& nplot)
const
206 const unsigned n_node =
nnode();
220 for (
unsigned iplot = 0; iplot < num_plot_points; iplot++)
233 for (
unsigned i = 0;
i < n_dim;
i++)
239 for (
unsigned l = 0; l < n_node; l++)
242 for (
unsigned i = 0;
i < n_dim;
i++)
261 else if (k < 2 * n_dim + 1 && k >= n_dim + 1)
263 file_out << unit_normal[
k] << std::endl;
268 std::stringstream error_stream;
270 <<
"Axisymmetric Fluid Traction Navier-Stokes Elements only store "
271 << 2 * (n_dim + 1) <<
" fields " << std::endl;
293 else if (i < 2 * n_dim + 1 && i >= n_dim + 1)
300 std::stringstream error_stream;
302 <<
"Axisymmetric Fluid Traction Navier-Stokes Elements only store "
303 << 2 * (n_dim + 1) <<
" fields " << std::endl;
310 void output(std::ostream& outfile,
const unsigned& n_plot)
316 const unsigned n_node =
nnode();
333 for (
unsigned iplot = 0; iplot < num_plot_points; iplot++)
346 for (
unsigned i = 0;
i < n_dim;
i++)
352 for (
unsigned l = 0; l < n_node; l++)
355 for (
unsigned i = 0;
i < n_dim;
i++)
369 for (
unsigned i = 0;
i < n_dim;
i++)
375 for (
unsigned i = 0;
i < n_dim + 1;
i++)
381 for (
unsigned i = 0;
i < n_dim;
i++)
383 outfile << unit_normal[
i] <<
" ";
385 outfile << std::endl;
396 void output(FILE* file_pt,
const unsigned& n_plot)
419 template<
class ELEMENT>
423 unsigned n_dim = this->nodal_dimension();
427 interpolated_x(
s,
x);
431 outer_unit_normal(
s, unit_normal);
437 get_traction(time, ipt,
x, unit_normal, traction);
445 template<
class ELEMENT>
451 unsigned n_node = nnode();
454 double time = node_pt(0)->time_stepper_pt()->time_pt()->time();
458 unsigned n_position_type = this->nnodal_position_type();
459 if (n_position_type != 1)
461 throw OomphLibError(
"AxisymmetricNavierStokes is not yet implemented for "
462 "more than one position type",
469 unsigned n_dim = this->nodal_dimension();
472 unsigned u_nodal_index[n_dim + 1];
473 for (
unsigned i = 0;
i < n_dim + 1;
i++)
475 u_nodal_index[
i] = this->U_index_axisymmetric_nst_traction[
i];
485 DShape dpsids(n_node, n_dim - 1);
488 unsigned n_intpt = integral_pt()->nweight();
491 for (
unsigned ipt = 0; ipt < n_intpt; ipt++)
494 double w = integral_pt()->weight(ipt);
497 dshape_local_at_knot(ipt, psi, dpsids);
506 for (
unsigned l = 0; l < n_node; l++)
509 for (
unsigned i = 0;
i < n_dim;
i++)
512 const double x_local = nodal_position(l,
i);
513 interpolated_x[
i] += x_local * psi(l);
516 for (
unsigned j = 0;
j < n_dim - 1;
j++)
518 interpolated_A(
j,
i) += x_local * dpsids(l,
j);
525 for (
unsigned i = 0;
i < n_dim - 1;
i++)
527 for (
unsigned j = 0;
j < n_dim - 1;
j++)
533 for (
unsigned k = 0;
k < n_dim;
k++)
535 A(
i,
j) += interpolated_A(
i,
k) * interpolated_A(
j,
k);
542 outer_unit_normal(ipt, interpolated_normal);
552 Adet =
A(0, 0) *
A(1, 1) -
A(0, 1) *
A(1, 0);
556 "Wrong dimension in AxisymmetricNavierStokesTractionElement",
557 "AxisymmetricNavierStokesTractionElement::fill_in_contribution_to_"
564 double W =
w *
sqrt(Adet);
568 get_traction(time, ipt, interpolated_x, interpolated_normal, traction);
571 for (
unsigned l = 0; l < n_node; l++)
574 for (
unsigned i = 0;
i < n_dim + 1;
i++)
577 local_eqn = this->nodal_local_eqn(l, u_nodal_index[
i]);
582 residuals[local_eqn] -=
583 traction[
i] * psi(l) * interpolated_x[0] *
W;
600 namespace LinearisedFSIAxisymmetricNStNoSlipBCHelper
614 template<
class FLUID_BULK_ELEMENT,
class SOLID_BULK_ELEMENT>
629 const unsigned&
id = 0);
675 residuals, jacobian, 1);
690 void output(std::ostream& outfile,
const unsigned& n_plot)
701 for (
unsigned ipt = 0; ipt < n_intpt; ipt++)
704 for (
unsigned i = 0;
i < (
Dim - 1);
i++)
714 SOLID_BULK_ELEMENT* ext_el_pt =
718 ext_el_pt->interpolated_du_dt_axisymmetric_linear_elasticity(s_ext,
722 outfile << ext_el_pt->interpolated_x(s_ext, 0) <<
" "
723 << ext_el_pt->interpolated_x(s_ext, 1) <<
" " << dudt[0] <<
" "
724 << dudt[1] <<
" " << dudt[2] <<
" " <<
zeta[0] << std::endl;
736 void output(FILE* file_pt,
const unsigned& n_plot)
751 unsigned n_node =
nnode();
757 for (
unsigned i = 0;
i < n_node;
i++)
775 unsigned n_node =
nnode();
781 for (
unsigned i = 0;
i < n_node;
i++)
798 const unsigned& flag);
826 template<
class FLUID_BULK_ELEMENT,
class SOLID_BULK_ELEMENT>
828 SOLID_BULK_ELEMENT>::
829 LinearisedFSIAxisymmetricNStNoSlipBCElementElement(
831 const int& face_index,
859 for (
unsigned i = 0;
i < 3;
i++)
862 dynamic_cast<FLUID_BULK_ELEMENT*
>(bulk_el_pt)->u_index_axi_nst(
i);
880 template<
class FLUID_BULK_ELEMENT,
class SOLID_BULK_ELEMENT>
882 SOLID_BULK_ELEMENT>::
883 fill_in_generic_residual_contribution_fsi_no_slip_axisym(
886 const unsigned& flag)
889 const unsigned n_node = nnode();
892 Shape psif(n_node), testf(n_node);
895 const unsigned n_intpt = integral_pt()->nweight();
901 const double local_st = st();
908 for (
unsigned ipt = 0; ipt < n_intpt; ipt++)
911 for (
unsigned i = 0;
i < (
Dim - 1);
i++)
913 s[
i] = integral_pt()->knot(ipt,
i);
917 double w = integral_pt()->weight(ipt);
921 double J = shape_and_test(
s, psif, testf);
931 for (
unsigned j = 0;
j < n_node;
j++)
933 Node* nod_pt = node_pt(
j);
940 unsigned first_index =
944 for (
unsigned i = 0;
i <
Dim + 1;
i++)
948 nod_pt->
value(U_index_fsi_no_slip_axisym[
i]) * psif(
j);
953 SOLID_BULK_ELEMENT* ext_el_pt =
954 dynamic_cast<SOLID_BULK_ELEMENT*
>(external_element_pt(0, ipt));
957 ext_el_pt->interpolated_du_dt_axisymmetric_linear_elasticity(s_ext, dudt);
963 for (
unsigned l = 0; l < n_node; l++)
966 for (
unsigned i = 0;
i <
Dim + 1;
i++)
972 local_eqn = nodal_local_eqn(l, U_index_fsi_no_slip_axisym[
i]);
978 residuals[local_eqn] -=
lambda[
i] * testf[l] *
W;
985 for (
unsigned l2 = 0; l2 < n_node; l2++)
992 int local_unknown = nodal_local_eqn(
998 if (local_unknown >= 0)
1000 jacobian(local_eqn, local_unknown) -= psif[l2] * testf[l] *
W;
1013 int local_eqn = nodal_local_eqn(
1019 residuals[local_eqn] +=
1020 (local_st * dudt[
i] - fluid_veloc[
i]) * testf(l) *
W;
1027 for (
unsigned l2 = 0; l2 < n_node; l2++)
1030 nodal_local_eqn(l2, U_index_fsi_no_slip_axisym[
i]);
1033 if (local_unknown >= 0)
1035 jacobian(local_eqn, local_unknown) -= psif[l2] * testf[l] *
W;
AnnoyingScalar sqrt(const AnnoyingScalar &x)
Definition: AnnoyingScalar.h:134
int i
Definition: BiCGSTAB_step_by_step.cpp:9
const unsigned n
Definition: CG3DPackingUnitTest.cpp:11
cout<< "The eigenvalues of A are:"<< endl<< ces.eigenvalues()<< endl;cout<< "The matrix of eigenvectors, V, is:"<< endl<< ces.eigenvectors()<< endl<< endl;complex< float > lambda
Definition: ComplexEigenSolver_compute.cpp:9
JacobiRotation< float > J
Definition: Jacobi_makeJacobi.cpp:3
RowVector3d w
Definition: Matrix_resize_int.cpp:3
void load(Archive &ar, ParticleHandler &handl)
Definition: Particles.h:21
Matrix< SCALARA, Dynamic, Dynamic, opt_A > A
Definition: bench_gemm.cpp:47
Definition: axisym_fluid_traction_elements.h:74
void(*&)(const double &time, const Vector< double > &x, const Vector< double > &n, Vector< double > &traction) traction_fct_pt()
Reference to the traction function pointer.
Definition: axisym_fluid_traction_elements.h:143
double zeta_nodal(const unsigned &n, const unsigned &k, const unsigned &i) const
Definition: axisym_fluid_traction_elements.h:172
void fill_in_contribution_to_residuals(Vector< double > &residuals)
Return the residuals.
Definition: axisym_fluid_traction_elements.h:153
void scalar_value_paraview(std::ofstream &file_out, const unsigned &k, const unsigned &nplot) const
Definition: axisym_fluid_traction_elements.h:198
void output(FILE *file_pt, const unsigned &n_plot)
C-style output function.
Definition: axisym_fluid_traction_elements.h:396
unsigned nscalar_paraview() const
Definition: axisym_fluid_traction_elements.h:188
void traction(const double &time, const Vector< double > &s, Vector< double > &traction)
Definition: axisym_fluid_traction_elements.h:420
Vector< unsigned > U_index_axisymmetric_nst_traction
Index at which the i-th velocity component is stored.
Definition: axisym_fluid_traction_elements.h:77
std::string scalar_name_paraview(const unsigned &i) const
Definition: axisym_fluid_traction_elements.h:282
void(* Traction_fct_pt)(const double &time, const Vector< double > &x, const Vector< double > &n, Vector< double > &result)
Definition: axisym_fluid_traction_elements.h:84
virtual void get_traction(const double &time, const unsigned &intpt, const Vector< double > &x, const Vector< double > &n, Vector< double > &traction) const
Definition: axisym_fluid_traction_elements.h:95
AxisymmetricNavierStokesTractionElement(FiniteElement *const &element_pt, const int &face_index)
Definition: axisym_fluid_traction_elements.h:116
void output(std::ostream &outfile, const unsigned &n_plot)
Output function.
Definition: axisym_fluid_traction_elements.h:310
void output(FILE *file_pt)
C_style output function.
Definition: axisym_fluid_traction_elements.h:390
void fill_in_contribution_to_residuals_axisymmetric_nst_traction(Vector< double > &residuals)
Helper function that actually calculates the residuals.
Definition: axisym_fluid_traction_elements.h:447
void fill_in_contribution_to_jacobian(Vector< double > &residuals, DenseMatrix< double > &jacobian)
Fill in contribution from Jacobian.
Definition: axisym_fluid_traction_elements.h:160
void output(std::ostream &outfile)
Output function.
Definition: axisym_fluid_traction_elements.h:180
unsigned index_of_first_value_assigned_by_face_element(const unsigned &face_id=0) const
Definition: nodes.h:2061
TimeStepper *& time_stepper_pt()
Return the pointer to the timestepper.
Definition: nodes.h:238
Definition: element_with_external_element.h:56
Vector< double > & external_element_local_coord(const unsigned &interaction_index, const unsigned &ipt)
Definition: element_with_external_element.h:136
void set_ninteraction(const unsigned &n_interaction)
Definition: element_with_external_element.h:178
FiniteElement *& external_element_pt(const unsigned &interaction_index, const unsigned &ipt)
Definition: element_with_external_element.h:107
void fill_in_jacobian_from_external_interaction_by_fd(Vector< double > &residuals, DenseMatrix< double > &jacobian)
Definition: element_with_external_element.h:345
Definition: elements.h:4338
int & face_index()
Definition: elements.h:4626
void outer_unit_normal(const Vector< double > &s, Vector< double > &unit_normal) const
Compute outer unit normal at the specified local coordinate.
Definition: elements.cc:6006
double zeta_nodal(const unsigned &n, const unsigned &k, const unsigned &i) const
Definition: elements.h:4497
void add_additional_values(const Vector< unsigned > &nadditional_values, const unsigned &id)
Definition: elements.h:4428
double interpolated_x(const Vector< double > &s, const unsigned &i) const
Definition: elements.h:4528
double J_eulerian(const Vector< double > &s) const
Definition: elements.cc:5242
double J_eulerian_at_knot(const unsigned &ipt) const
Definition: elements.cc:5328
Definition: elements.h:4998
Definition: elements.h:1313
virtual unsigned nplot_points_paraview(const unsigned &nplot) const
Definition: elements.h:2862
void interpolated_zeta(const Vector< double > &s, Vector< double > &zeta) const
Definition: elements.cc:4675
Node *& node_pt(const unsigned &n)
Return a pointer to the local node n.
Definition: elements.h:2175
virtual void output(std::ostream &outfile)
Definition: elements.h:3050
virtual std::string tecplot_zone_string(const unsigned &nplot) const
Definition: elements.h:3161
virtual void build_face_element(const int &face_index, FaceElement *face_element_pt)
Definition: elements.cc:5132
virtual void shape(const Vector< double > &s, Shape &psi) const =0
unsigned nnode() const
Return the number of nodes.
Definition: elements.h:2210
Integral *const & integral_pt() const
Return the pointer to the integration scheme (const version)
Definition: elements.h:1963
virtual void get_s_plot(const unsigned &i, const unsigned &nplot, Vector< double > &s, const bool &shifted_to_interior=false) const
Definition: elements.h:3148
virtual unsigned nplot_points(const unsigned &nplot) const
Definition: elements.h:3186
double nodal_position(const unsigned &n, const unsigned &i) const
Definition: elements.h:2317
unsigned nodal_dimension() const
Return the required Eulerian dimension of the nodes in this element.
Definition: elements.h:2484
virtual void shape_at_knot(const unsigned &ipt, Shape &psi) const
Definition: elements.cc:3220
static DenseMatrix< double > Dummy_matrix
Definition: elements.h:227
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.
Definition: axisym_fluid_traction_elements.h:619
Vector< unsigned > U_index_fsi_no_slip_axisym
The index at which the unknowns are stored at the nodes.
Definition: axisym_fluid_traction_elements.h:804
double shape_and_test_at_knot(const unsigned &ipt, Shape &psi, Shape &test) const
Definition: axisym_fluid_traction_elements.h:770
double * St_pt
Pointer to fluid Strouhal number.
Definition: axisym_fluid_traction_elements.h:810
void output(FILE *file_pt)
C-style output function.
Definition: axisym_fluid_traction_elements.h:730
void output(FILE *file_pt, const unsigned &n_plot)
C-style output function.
Definition: axisym_fluid_traction_elements.h:736
double shape_and_test(const Vector< double > &s, Shape &psi, Shape &test) const
Definition: axisym_fluid_traction_elements.h:746
void output(std::ostream &outfile, const unsigned &n_plot)
Output function: Output at Gauss points; n_plot is ignored.
Definition: axisym_fluid_traction_elements.h:690
LinearisedFSIAxisymmetricNStNoSlipBCElementElement(const LinearisedFSIAxisymmetricNStNoSlipBCElementElement &dummy)=delete
Broken copy constructor.
LinearisedFSIAxisymmetricNStNoSlipBCElementElement(FiniteElement *const &bulk_el_pt, const int &face_index, const unsigned &id=0)
Definition: axisym_fluid_traction_elements.h:829
void fill_in_generic_residual_contribution_fsi_no_slip_axisym(Vector< double > &residuals, DenseMatrix< double > &jacobian, const unsigned &flag)
Definition: axisym_fluid_traction_elements.h:883
unsigned Id
Lagrange Id.
Definition: axisym_fluid_traction_elements.h:807
double st() const
Access function for the fluid Strouhal number.
Definition: axisym_fluid_traction_elements.h:653
void fill_in_contribution_to_residuals(Vector< double > &residuals)
Add the element's contribution to its residual vector.
Definition: axisym_fluid_traction_elements.h:659
void fill_in_contribution_to_jacobian(Vector< double > &residuals, DenseMatrix< double > &jacobian)
Definition: axisym_fluid_traction_elements.h:670
unsigned Dim
The spatial dimension of the problem.
Definition: axisym_fluid_traction_elements.h:801
void output(std::ostream &outfile)
Output function.
Definition: axisym_fluid_traction_elements.h:682
double *& st_pt()
Broken assignment operator.
Definition: axisym_fluid_traction_elements.h:647
unsigned ndim() const
Return (Eulerian) spatial dimension of the node.
Definition: nodes.h:1054
double value(const unsigned &i) const
Definition: nodes.cc:2408
Definition: oomph_definitions.h:222
Time *const & time_pt() const
Access function for the pointer to time (const version)
Definition: timesteppers.h:572
double & time()
Return the current value of the continuous time.
Definition: timesteppers.h:123
@ N
Definition: constructor.cpp:22
RealScalar s
Definition: level1_cplx_impl.h:130
char char char int int * k
Definition: level2_impl.h:374
EIGEN_STRONG_INLINE const Eigen::CwiseBinaryOp< Eigen::internal::scalar_zeta_op< typename DerivedX::Scalar >, const DerivedX, const DerivedQ > zeta(const Eigen::ArrayBase< DerivedX > &x, const Eigen::ArrayBase< DerivedQ > &q)
Definition: SpecialFunctionsArrayAPI.h:152
static const unsigned Dim
Problem dimension.
Definition: two_d_tilted_square.cc:62
void Zero_traction_fct(const double &time, const Vector< double > &x, const Vector< double > &N, Vector< double > &load)
Default load function (zero traction)
Definition: axisym_fluid_traction_elements.cc:47
std::string string(const unsigned &i)
Definition: oomph_definitions.cc:286
double Default_strouhal_number
Default for fluid Strouhal number.
Definition: axisym_fluid_traction_elements.cc:73
@ W
Definition: quadtree.h:63
std::string to_string(T object, unsigned float_precision=8)
Definition: oomph_utilities.h:189
DRAIG: Change all instances of (SPATIAL_DIM) to (DIM-1).
Definition: AnisotropicHookean.h:10
list x
Definition: plotDoE.py:28
Definition: indexed_view.cpp:20
#define OOMPH_EXCEPTION_LOCATION
Definition: oomph_definitions.h:61
#define OOMPH_CURRENT_FUNCTION
Definition: oomph_definitions.h:86
void output(std::ostream &outfile, const unsigned &nplot)
Overload output function.
Definition: overloaded_element_body.h:490
std::ptrdiff_t j
Definition: tut_arithmetic_redux_minmax.cpp:2