27 #ifndef OOMPH_POISSON_ELEMENTS_WITH_SINGULARITY_HEADER
28 #define OOMPH_POISSON_ELEMENTS_WITH_SINGULARITY_HEADER
49 template<
class WRAPPED_POISSON_ELEMENT>
59 (
const Vector<double>&
x);
80 add_internal_data(
new Data(1));
99 return internal_data_pt(0)->value(0);
106 wrapped_poisson_el_pt,
107 const Vector<double>&
s,
108 unsigned* direction_pt)
114 unsigned nnod=wrapped_poisson_el_pt->nnode();
117 for (
unsigned j=0;
j<nnod;
j++)
144 std::stringstream error_stream;
146 <<
"Pointer to singular function hasn't been defined!"
164 double c=internal_data_pt(0)->value(0);
181 Vector<double> dsingular(cached_dim);
186 std::stringstream error_stream;
188 <<
"Pointer to gradient of singular function hasn't been defined!"
209 Vector<double> dubar(cached_dim);
212 double c=internal_data_pt(0)->value(0);
213 for (
unsigned i=0;
i<cached_dim;
i++)
215 dubar[
i] =
c*dsingular[
i];
226 (residual,GeneralisedElement::Dummy_matrix,0);
242 const unsigned& flag)
246 int eqn_number=internal_local_eqn(0,0);
250 Vector<double>
flux(cached_dim);
255 residual[eqn_number] = derivative;
267 DShape dpsidx(n_node,cached_dim);
272 for (
unsigned j=0;
j<n_node;
j++)
275 int node_eqn_number = external_local_eqn(
j,0);
276 if (node_eqn_number>=0)
279 jacobian(eqn_number,node_eqn_number) = dpsidx(
j,*
Direction_pt);
324 template<
class BASIC_POISSON_ELEMENT>
334 unsigned n_node = this->nnode();
342 for (
unsigned j=0;
j<n_node;
j++)
353 for (
unsigned j=0;
j<n_node;
j++)
377 unsigned n_node = this->nnode();
378 for (
unsigned j=0;
j<n_node;
j++)
417 this->add_external_data(c_pt->internal_data_pt(0));
422 double u_bar(
const unsigned&
i,
const Vector<double>&
x)
const
435 Vector<double>
grad_u_bar(
const unsigned i,
const Vector<double>&
x)
const
442 const Vector<double>&
x)
const
453 const unsigned n_node = this->nnode();
456 const unsigned u_nodal_index = this->u_index_poisson();
465 double interpolated_u = 0.0;
469 for(
unsigned l=0;l<n_node;l++)
471 interpolated_u += this->nodal_value(l,u_nodal_index)*psi[l];
474 return interpolated_u;
481 const unsigned n_node = this->nnode();
484 const unsigned u_nodal_index = this->u_index_poisson();
493 double interpolated_u = 0.0;
496 unsigned cached_dim=this->dim();
497 Vector<double>
x(cached_dim,0.0);
501 for(
unsigned l=0;l<n_node;l++)
503 interpolated_u += this->nodal_value(l,u_nodal_index)*psi[l];
504 for (
unsigned i=0;
i<cached_dim;
i++)
506 x[
i]+=this->raw_nodal_position(l,
i)*psi(l);
512 for (
unsigned i=0;
i<n_sing;
i++)
518 return(interpolated_u);
527 residuals,GeneralisedElement::Dummy_matrix,0);
541 void output(std::ostream &outfile,
const unsigned &nplot)
544 unsigned cached_dim = this->dim();
547 Vector<double>
s(cached_dim);
550 outfile << this->tecplot_zone_string(nplot);
553 unsigned num_plot_points=this->nplot_points(nplot);
554 for (
unsigned iplot=0;iplot<num_plot_points;iplot++)
558 this->get_s_plot(iplot,nplot,
s);
560 Vector<double>
x(cached_dim);
561 for(
unsigned i=0;
i<cached_dim;
i++)
563 outfile << this->interpolated_x(
s,
i) <<
" ";
564 x[
i] = this->interpolated_x(
s,
i);
575 this->write_tecplot_zone_footer(outfile,nplot);
581 FiniteElement::SteadyExactSolutionFctPt exact_soln_pt,
582 double&
error,
double& norm)
590 unsigned cached_dim = this->dim();
593 Vector<double>
s(cached_dim);
596 Vector<double>
x(cached_dim);
599 unsigned n_node = this->nnode();
604 unsigned n_intpt = this->integral_pt()->nweight();
607 outfile <<
"ZONE" << std::endl;
613 for(
unsigned ipt=0;ipt<n_intpt;ipt++)
617 for(
unsigned i=0;
i<cached_dim;
i++)
619 s[
i] = this->integral_pt()->knot(ipt,
i);
623 double w = this->integral_pt()->weight(ipt);
626 double J=this->J_eulerian(
s);
632 this->interpolated_x(
s,
x);
641 for(
unsigned i=0;
i<cached_dim;
i++)
643 outfile <<
x[
i] <<
" ";
658 Vector<double> &residuals,
660 const unsigned& flag)
663 BASIC_POISSON_ELEMENT::fill_in_generic_residual_contribution_poisson
664 (residuals,jacobian,flag);
667 bool all_singular_functions_satisfy_laplace_equation=
true;
673 const unsigned u_nodal_index = this->u_index_poisson();
676 unsigned cached_dim=this->dim();
679 const unsigned n_node = this->nnode();
682 Vector<int> local_equation_number_C(n_sing);
683 for (
unsigned i=0;
i<n_sing;
i++)
685 local_equation_number_C[
i] =
686 this->external_local_eqn(
i,0);
688 singular_function_satisfies_laplace_equation()))
690 all_singular_functions_satisfy_laplace_equation=
false;
696 if (!all_singular_functions_satisfy_laplace_equation)
700 Shape psi(n_node),
test(n_node);
701 DShape dpsidx(n_node,cached_dim), dtestdx(n_node,cached_dim);
704 const unsigned n_intpt = this->integral_pt()->nweight();
710 for(
unsigned ipt=0;ipt<n_intpt;ipt++)
714 double w = this->integral_pt()->weight(ipt);
717 double J = this->dshape_and_dtest_eulerian_at_knot_poisson(ipt,psi,dpsidx,
724 Vector<double> interpolated_x(cached_dim,0.0);
726 for(
unsigned l=0;l<n_node;l++)
729 for(
unsigned j=0;
j<cached_dim;
j++)
731 interpolated_x[
j] += this->raw_nodal_position(l,
j)*psi(l);
736 Vector<Vector<double> > grad_u_bar_local(n_sing);
737 for (
unsigned i=0;
i<n_sing;
i++)
741 Vector<Vector<double> > grad_singular_function_local(n_sing);
742 for (
unsigned i=0;
i<n_sing;
i++)
754 for(
unsigned l=0;l<n_node;l++)
757 local_eqn = this->nodal_local_eqn(l,u_nodal_index);
766 for(
unsigned i=0;
i<n_sing;
i++)
769 singular_function_satisfies_laplace_equation()))
771 for (
unsigned k=0;
k<cached_dim;
k++)
773 residuals[local_eqn] +=
774 grad_u_bar_local[
i][
k]*dtestdx(l,
k)*
W;
787 for (
unsigned i=0;
i<n_sing;
i++)
790 singular_function_satisfies_laplace_equation()))
792 if (local_equation_number_C[
i]>=0)
794 for(
unsigned d=0;d<cached_dim;d++)
796 jacobian(local_eqn,local_equation_number_C[
i])
797 += grad_singular_function_local[
i][d]*
817 for (
unsigned j=0;
j<n_node;
j++)
823 Vector<double> global_coordinate_boundary_node(cached_dim);
824 for (
unsigned d=0;d<cached_dim;d++)
826 global_coordinate_boundary_node[d] = this->raw_nodal_position(
j,d);
830 int local_eqn_number_boundary_node =
831 this->nodal_local_eqn(
j,u_nodal_index);
832 if (local_eqn_number_boundary_node >= 0)
835 residuals[local_eqn_number_boundary_node] =
836 this->raw_nodal_value(
j,u_nodal_index);
839 for (
unsigned i=0;
i<n_sing;
i++)
841 residuals[local_eqn_number_boundary_node] +=
842 u_bar(
i,global_coordinate_boundary_node);
851 for (
unsigned l=0;l<n_node;l++)
854 int local_unknown = this->nodal_local_eqn(l,u_nodal_index);
857 if (local_unknown >=0)
860 jacobian(local_eqn_number_boundary_node,local_unknown)=0.0;
865 jacobian(local_eqn_number_boundary_node,
866 local_eqn_number_boundary_node) += 1.0;
869 for (
unsigned i=0;
i<n_sing;
i++)
872 int local_unknown=local_equation_number_C[
i];
873 if (local_unknown>=0)
875 jacobian(local_eqn_number_boundary_node,
int i
Definition: BiCGSTAB_step_by_step.cpp:9
JacobiRotation< float > J
Definition: Jacobi_makeJacobi.cpp:3
RowVector3d w
Definition: Matrix_resize_int.cpp:3
Definition: poisson_elements_with_singularity.h:326
void fill_in_contribution_to_jacobian(Vector< double > &residuals, DenseMatrix< double > &jacobian)
Definition: poisson_elements_with_singularity.h:532
double singular_function(const unsigned &i, const Vector< double > &x) const
Evaluate i-th "raw" singular function at Eulerian position x.
Definition: poisson_elements_with_singularity.h:428
void fill_in_generic_residual_contribution_wrapped_poisson(Vector< double > &residuals, DenseMatrix< double > &jacobian, const unsigned &flag)
Overloaded fill-in function.
Definition: poisson_elements_with_singularity.h:657
Vector< double > grad_u_bar(const unsigned i, const Vector< double > &x) const
Definition: poisson_elements_with_singularity.h:435
void undo_dirichlet_bc_on_all_nodes()
Undo Dirichlet BCs on all nodes.
Definition: poisson_elements_with_singularity.h:375
void fill_in_contribution_to_residuals(Vector< double > &residuals)
Add the element's contribution to its residual vector (wrapper)
Definition: poisson_elements_with_singularity.h:522
double interpolated_u_poisson(const Vector< double > &s) const
Overloaded version including the singular contributions.
Definition: poisson_elements_with_singularity.h:478
void add_c_equation_element_pt(SingularPoissonSolutionElement< PoissonElementWithSingularity< BASIC_POISSON_ELEMENT > > *c_pt)
Definition: poisson_elements_with_singularity.h:408
PoissonElementWithSingularity()
Constructor.
Definition: poisson_elements_with_singularity.h:331
vector< bool > Node_is_subject_to_dirichlet_bc
Definition: poisson_elements_with_singularity.h:894
void set_dirichlet_value_on_node(const unsigned &j, const double &value)
Specify Dirichlet boundary value for j-th local node.
Definition: poisson_elements_with_singularity.h:385
Vector< SingularPoissonSolutionElement< PoissonElementWithSingularity< BASIC_POISSON_ELEMENT > > * > C_equation_elements_pt
Vector of pointers to SingularPoissonSolutionElement objects.
Definition: poisson_elements_with_singularity.h:890
void undo_dirichlet_bc_on_node(const unsigned &j)
Undo Dirichlet BCs on jth node.
Definition: poisson_elements_with_singularity.h:369
Vector< SingularPoissonSolutionElement< PoissonElementWithSingularity< BASIC_POISSON_ELEMENT > > * > c_equation_elements_pt()
Definition: poisson_elements_with_singularity.h:397
void compute_error(std::ostream &outfile, FiniteElement::SteadyExactSolutionFctPt exact_soln_pt, double &error, double &norm)
Compute error.
Definition: poisson_elements_with_singularity.h:580
void impose_dirichlet_bc_on_node(const unsigned &j)
Definition: poisson_elements_with_singularity.h:363
double interpolated_u_poisson_fe_only(const Vector< double > &s) const
Definition: poisson_elements_with_singularity.h:450
double u_bar(const unsigned &i, const Vector< double > &x) const
Definition: poisson_elements_with_singularity.h:422
Vector< double > Imposed_value_at_node
Definition: poisson_elements_with_singularity.h:898
void output(std::ostream &outfile, const unsigned &nplot)
Overloaded output fct: x, y [,z], u, u_fe_only, u-u_fe_only.
Definition: poisson_elements_with_singularity.h:541
Vector< double > grad_singular_function(const unsigned &i, const Vector< double > &x) const
Evaluate the gradient of the i-th "raw" singular at Eulerian position x.
Definition: poisson_elements_with_singularity.h:441
Definition: poisson_elements_with_singularity.h:51
PoissonGradSingularFctPt & grad_singular_fct_pt()
Access function to pointer to the gradient of sing function.
Definition: poisson_elements_with_singularity.h:171
double u_bar(const Vector< double > &x)
Definition: poisson_elements_with_singularity.h:161
void set_wrapped_poisson_element_pt(WRAPPED_POISSON_ELEMENT *wrapped_poisson_el_pt, const Vector< double > &s, unsigned *direction_pt)
Definition: poisson_elements_with_singularity.h:105
Vector< double > S_in_wrapped_poisson_element
Local coordinates of singularity in the wrapped Poisson element.
Definition: poisson_elements_with_singularity.h:297
double singular_function(const Vector< double > &x) const
Evaluate singular function at Eulerian position x.
Definition: poisson_elements_with_singularity.h:139
WRAPPED_POISSON_ELEMENT * Wrapped_poisson_el_pt
Pointer to Poisson element that contains the singularity.
Definition: poisson_elements_with_singularity.h:288
bool & singular_function_satisfies_laplace_equation()
Definition: poisson_elements_with_singularity.h:91
PoissonGradSingularFctPt Grad_singular_fct_pt
Pointer to the gradient of the singular function.
Definition: poisson_elements_with_singularity.h:294
double c() const
Find the value of the unknown C.
Definition: poisson_elements_with_singularity.h:97
void fill_in_generic_contribution_to_residuals(Vector< double > &residual, DenseMatrix< double > &jacobian, const unsigned &flag)
Compute local residual, and, if flag=1, local jacobian matrix.
Definition: poisson_elements_with_singularity.h:240
bool Singular_function_satisfies_laplace_equation
Does singular fct satisfy Laplace's eqn?
Definition: poisson_elements_with_singularity.h:303
unsigned * Direction_pt
Direction of the derivative used for the residual of the element.
Definition: poisson_elements_with_singularity.h:300
Vector< double > grad_singular_function(const Vector< double > &x) const
Evaluate the gradient of the sing function at Eulerian position x.
Definition: poisson_elements_with_singularity.h:175
PoissonSingularFctPt Singular_fct_pt
Pointer to singular function.
Definition: poisson_elements_with_singularity.h:291
SingularPoissonSolutionElement()
Constructor.
Definition: poisson_elements_with_singularity.h:62
PoissonSingularFctPt & singular_fct_pt()
Access function to pointer to singular function.
Definition: poisson_elements_with_singularity.h:136
void fill_in_contribution_to_residuals(Vector< double > &residual)
Definition: poisson_elements_with_singularity.h:223
Vector< double >(* PoissonGradSingularFctPt)(const Vector< double > &x)
Function pointer to the gradient of the singular function:
Definition: poisson_elements_with_singularity.h:59
double(* PoissonSingularFctPt)(const Vector< double > &x)
Function pointer to the singular function:
Definition: poisson_elements_with_singularity.h:55
void fill_in_contribution_to_jacobian(Vector< double > &residual, DenseMatrix< double > &jacobian)
Definition: poisson_elements_with_singularity.h:230
Vector< double > grad_u_bar(const Vector< double > &x)
Gradient of ubar (including the constant!)
Definition: poisson_elements_with_singularity.h:202
Matrix< Type, Size, 1 > Vector
\cpp11 SizeĆ1 vector of type Type.
Definition: Eigen/Eigen/src/Core/Matrix.h:515
RealScalar s
Definition: level1_cplx_impl.h:130
char char char int int * k
Definition: level2_impl.h:374
squared absolute value
Definition: GlobalFunctions.h:87
squared absolute sa ArrayBase::abs2 DOXCOMMA MatrixBase::cwiseAbs2 sa Eigen::abs2 DOXCOMMA Eigen::pow DOXCOMMA ArrayBase::square nearest sa Eigen::floor DOXCOMMA Eigen::ceil DOXCOMMA ArrayBase::round nearest integer not less than the given sa Eigen::floor DOXCOMMA ArrayBase::ceil not a number test
Definition: GlobalFunctions.h:109
void flux(const double &time, const Vector< double > &x, double &flux)
Get flux applied along boundary x=0.
Definition: pretend_melt.cc:59
void exact_soln(const double &time, const Vector< double > &x, Vector< double > &soln)
Definition: unstructured_two_d_curved.cc:301
int error
Definition: calibrate.py:297
void shape(const double &s, double *Psi)
Definition: shape.h:564
@ W
Definition: quadtree.h:63
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
std::ptrdiff_t j
Definition: tut_arithmetic_redux_minmax.cpp:2