27 #ifndef OOMPH_MULTI_POISSON_ELEMENTS_HEADER
28 #define OOMPH_MULTI_POISSON_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"
63 template <
unsigned DIM,
unsigned NFIELDS>
110 std::list<std::pair<unsigned long,unsigned> >& block_lookup_list)
const
113 std::pair<unsigned,unsigned> block_lookup;
116 const unsigned n_node = this->
nnode();
122 for(
unsigned n=0;
n<n_node;
n++)
125 for(
unsigned i=0;
i<NFIELDS;
i++)
134 if (local_unknown >= 0)
138 block_lookup.first = this->
eqn_number(local_unknown);
139 block_lookup.second =
i;
142 block_lookup_list.push_front(block_lookup);
161 const unsigned& nplot)
const
166 std::stringstream error_stream;
168 <<
"MultiPoisson elements only stores "
169 << NFIELDS <<
" fields so i "
170 <<
i <<
" is illegal." << std::endl;
179 for(
unsigned j=0;
j<local_loop;
j++)
199 std::stringstream error_stream;
201 <<
"MultiPoisson elements only stores "
202 << NFIELDS <<
" fields so i "
203 <<
i <<
" is illegal." << std::endl;
217 const unsigned n_plot=5;
223 void output(std::ostream &outfile,
const unsigned &n_plot);
228 const unsigned n_plot=5;
234 void output(FILE* file_pt,
const unsigned &n_plot);
237 void output_fct(std::ostream &outfile,
const unsigned &n_plot,
243 virtual void output_fct(std::ostream &outfile,
const unsigned &n_plot,
249 "There is no time-dependent output_fct() for MultiPoisson elements ",
258 double&
error,
double& norm);
264 const double& time,
double&
error,
double& norm)
267 "There is no time-dependent compute_error() for MultiPoisson elements",
292 for (
unsigned i=0;
i<NFIELDS;
i++)
368 const unsigned n_node =
nnode();
380 double interpolated_u = 0.0;
383 for(
unsigned l=0;l<n_node;l++)
385 interpolated_u += this->
nodal_value(l,u_nodal_index)*psi[l];
388 return(interpolated_u);
410 (
const unsigned &ipt,
434 const unsigned& flag);
459 template <
unsigned DIM,
unsigned NNODE_1D,
unsigned NFIELDS>
498 void output(std::ostream &outfile,
const unsigned &n_plot)
510 void output(FILE* file_pt,
const unsigned &n_plot)
516 void output_fct(std::ostream &outfile,
const unsigned &n_plot,
525 void output_fct(std::ostream &outfile,
const unsigned &n_plot,
543 (
const unsigned& ipt,
577 template<
unsigned DIM,
unsigned NNODE_1D,
unsigned NFIELDS>
587 const double J = this->dshape_eulerian(
s,psi,dpsidx);
606 template<
unsigned DIM,
unsigned NNODE_1D,
unsigned NFIELDS>
616 const double J = this->dshape_eulerian_at_knot(ipt,psi,dpsidx);
636 template<
unsigned DIM,
unsigned NNODE_1D,
unsigned NFIELDS>
649 const double J = this->dshape_eulerian_at_knot(ipt,psi,dpsidx,
650 djacobian_dX,d_dpsidx_dX);
655 d_dtestdx_dX = d_dpsidx_dX;
675 template<
unsigned DIM,
unsigned NNODE_1D,
unsigned NFIELDS>
677 public virtual QElement<DIM-1,NNODE_1D>
696 template<
unsigned NNODE_1D,
unsigned NFIELDS>
958 template<
unsigned DIM,
unsigned NNODE_1D,
unsigned NFIELDS>
971 template <
unsigned DIM,
unsigned NFIELDS>
976 const unsigned& flag)
979 const unsigned n_node = nnode();
986 const unsigned n_intpt = integral_pt()->nweight();
989 int local_eqn=0, local_unknown=0;
992 for(
unsigned ipt=0;ipt<n_intpt;ipt++)
995 double w = integral_pt()->weight(ipt);
998 double J = dshape_and_dtest_eulerian_at_knot_multi_poisson(ipt,psi,dpsidx,
1013 for (
unsigned i=0;
i<NFIELDS;
i++)
1015 interpolated_dudx[
i].resize(
DIM);
1016 for (
unsigned ii=0;ii<
DIM;ii++)
1018 interpolated_dudx[
i][ii]=0.0;
1022 for(
unsigned l=0;l<n_node;l++)
1025 for(
unsigned j=0;
j<
DIM;
j++)
1027 interpolated_x[
j] += raw_nodal_position(l,
j)*psi(l);
1031 for (
unsigned i=0;
i<NFIELDS;
i++)
1034 unsigned u_nodal_index = u_index_multi_poisson(
i);
1037 double u_value = raw_nodal_value(l,u_nodal_index);
1038 interpolated_u[
i] += u_value*psi(l);
1041 for(
unsigned j=0;
j<
DIM;
j++)
1043 interpolated_dudx[
i][
j] += u_value*dpsidx(l,
j);
1051 get_source_multi_poisson(ipt,interpolated_x,
source);
1059 "Beta_pt hasn't been set!",
1064 const double beta_local=*Beta_pt;
1071 for(
unsigned l=0;l<n_node;l++)
1073 for (
unsigned i=0;
i<NFIELDS;
i++)
1076 unsigned u_nodal_index = u_index_multi_poisson(
i);
1079 local_eqn = nodal_local_eqn(l,u_nodal_index);
1088 for(
unsigned k=0;
k<
DIM;
k++)
1090 residuals[local_eqn] +=
1091 double(
i+1)*interpolated_dudx[
i][
k]*dtestdx(l,
k)*
W;
1095 for(
unsigned k=0;
k<NFIELDS;
k++)
1097 residuals[local_eqn] -=
1106 for(
unsigned l2=0;l2<n_node;l2++)
1108 for (
unsigned i2=0;i2<NFIELDS;i2++)
1111 unsigned u_nodal_index2 = u_index_multi_poisson(i2);
1113 local_unknown = nodal_local_eqn(l2,u_nodal_index2);
1115 if(local_unknown >= 0)
1120 for(
unsigned ii=0;ii<
DIM;ii++)
1122 jacobian(local_eqn,local_unknown)
1123 +=
double(
i+1)*dpsidx(l2,ii)*dtestdx(l,ii)*
W;
1126 jacobian(local_eqn,local_unknown) -=
1144 template <
unsigned DIM,
unsigned NFIELDS>
1177 template <
unsigned DIM,
unsigned NFIELDS>
1179 const unsigned &nplot)
1186 outfile << tecplot_zone_string(nplot);
1189 unsigned num_plot_points=nplot_points(nplot);
1190 for (
unsigned iplot=0;iplot<num_plot_points;iplot++)
1193 get_s_plot(iplot,nplot,
s);
1195 for(
unsigned i=0;
i<
DIM;
i++)
1197 outfile << interpolated_x(
s,
i) <<
" ";
1199 for(
unsigned i=0;
i<NFIELDS;
i++)
1201 outfile << interpolated_u_multi_poisson(
i,
s) <<
" ";
1203 outfile << std::endl;
1207 write_tecplot_zone_footer(outfile,nplot);
1219 template <
unsigned DIM,
unsigned NFIELDS>
1221 const unsigned &nplot)
1227 fprintf(file_pt,
"%s",tecplot_zone_string(nplot).c_str());
1230 unsigned num_plot_points=nplot_points(nplot);
1231 for (
unsigned iplot=0;iplot<num_plot_points;iplot++)
1234 get_s_plot(iplot,nplot,
s);
1236 for(
unsigned i=0;
i<
DIM;
i++)
1238 fprintf(file_pt,
"%g ",interpolated_x(
s,
i));
1240 for(
unsigned i=0;
i<NFIELDS;
i++)
1242 fprintf(file_pt,
"%g ",interpolated_u_multi_poisson(
i,
s));
1244 fprintf(file_pt,
"\n");
1248 write_tecplot_zone_footer(file_pt,nplot);
1261 template <
unsigned DIM,
unsigned NFIELDS>
1263 const unsigned &nplot,
1273 outfile << tecplot_zone_string(nplot);
1279 unsigned num_plot_points=nplot_points(nplot);
1280 for (
unsigned iplot=0;iplot<num_plot_points;iplot++)
1284 get_s_plot(iplot,nplot,
s);
1287 interpolated_x(
s,
x);
1293 for(
unsigned i=0;
i<
DIM;
i++)
1295 outfile <<
x[
i] <<
" ";
1297 for(
unsigned i=0;
i<NFIELDS;
i++)
1301 outfile << std::endl;
1305 write_tecplot_zone_footer(outfile,nplot);
1318 template <
unsigned DIM,
unsigned NFIELDS>
1320 std::ostream &outfile,
1322 double&
error,
double& norm)
1336 unsigned n_node = nnode();
1341 unsigned n_intpt = integral_pt()->nweight();
1344 outfile <<
"ZONE" << std::endl;
1350 for(
unsigned ipt=0;ipt<n_intpt;ipt++)
1353 for(
unsigned i=0;
i<
DIM;
i++)
1355 s[
i] = integral_pt()->knot(ipt,
i);
1359 double w = integral_pt()->weight(ipt);
1362 double J=J_eulerian(
s);
1368 interpolated_x(
s,
x);
1372 for(
unsigned i=0;
i<
DIM;
i++)
1374 outfile <<
x[
i] <<
" ";
1380 for(
unsigned i=0;
i<NFIELDS;
i++)
1383 double u_fe=interpolated_u_multi_poisson(
i,
s);
1390 outfile << std::endl;
int i
Definition: BiCGSTAB_step_by_step.cpp:9
const unsigned n
Definition: CG3DPackingUnitTest.cpp:11
JacobiRotation< float > J
Definition: Jacobi_makeJacobi.cpp:3
RowVector3d w
Definition: Matrix_resize_int.cpp:3
FaceGeometry()
Definition: multi_poisson_elements.h:705
FaceGeometry()
Definition: multi_poisson_elements.h:684
Definition: elements.h:4998
Definition: elements.h:1313
virtual unsigned nplot_points_paraview(const unsigned &nplot) const
Definition: elements.h:2862
double nodal_value(const unsigned &n, const unsigned &i) const
Definition: elements.h:2593
virtual void shape(const Vector< double > &s, Shape &psi) const =0
int nodal_local_eqn(const unsigned &n, const unsigned &i) const
Definition: elements.h:1432
unsigned nnode() const
Return the number of nodes.
Definition: elements.h:2210
void(* SteadyExactSolutionFctPt)(const Vector< double > &, Vector< double > &)
Definition: elements.h:1759
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 self_test()
Definition: elements.cc:4440
void(* UnsteadyExactSolutionFctPt)(const double &, const Vector< double > &, Vector< double > &)
Definition: elements.h:1765
unsigned long eqn_number(const unsigned &ieqn_local) const
Definition: elements.h:704
static DenseMatrix< double > Dummy_matrix
Definition: elements.h:227
Definition: multi_poisson_elements.h:65
double * Beta_pt
Pointer to interaction parameter Beta.
Definition: multi_poisson_elements.h:440
void output(std::ostream &outfile)
Output with default number of plot points.
Definition: multi_poisson_elements.h:215
unsigned self_test()
Self-test: Return 0 for OK.
Definition: multi_poisson_elements.h:1145
void compute_error(std::ostream &outfile, FiniteElement::UnsteadyExactSolutionFctPt exact_soln_pt, const double &time, double &error, double &norm)
Dummy, time dependent error checker.
Definition: multi_poisson_elements.h:262
virtual double dshape_and_dtest_eulerian_at_knot_multi_poisson(const unsigned &ipt, Shape &psi, DShape &dpsidx, Shape &test, DShape &dtestdx) const =0
MultiPoissonSourceFctPt Source_fct_pt
Pointer to source function:
Definition: multi_poisson_elements.h:437
std::string scalar_name_paraview(const unsigned &i) const
Definition: multi_poisson_elements.h:193
double *& beta_pt()
Access function: Pointer to interaction parameter beta.
Definition: multi_poisson_elements.h:273
void get_flux(const Vector< double > &s, Vector< double > &flux) const
Get flux: flux[i] = du/dx_i.
Definition: multi_poisson_elements.h:306
virtual double dshape_and_dtest_eulerian_at_knot_multi_poisson(const unsigned &ipt, Shape &psi, DShape &dpsidx, RankFourTensor< double > &d_dpsidx_dX, Shape &test, DShape &dtestdx, RankFourTensor< double > &d_dtestdx_dX, DenseMatrix< double > &djacobian_dX) const =0
virtual unsigned u_index_multi_poisson(const unsigned &i) const
Definition: multi_poisson_elements.h:92
virtual void get_source_multi_poisson(const unsigned &ipt, const Vector< double > &x, Vector< double > &source) const
Definition: multi_poisson_elements.h:285
MultiPoissonEquations()
Constructor (must initialise the Source_fct_pt to null)
Definition: multi_poisson_elements.h:76
MultiPoissonSourceFctPt source_fct_pt() const
Access function: Pointer to source function. Const version.
Definition: multi_poisson_elements.h:279
double interpolated_u_multi_poisson(const unsigned &i, const Vector< double > &s) const
Definition: multi_poisson_elements.h:364
void(* MultiPoissonSourceFctPt)(const Vector< double > &x, Vector< double > &f)
Definition: multi_poisson_elements.h:71
virtual void fill_in_generic_residual_contribution_multi_poisson(Vector< double > &residuals, DenseMatrix< double > &jacobian, const unsigned &flag)
Definition: multi_poisson_elements.h:973
void output_fct(std::ostream &outfile, const unsigned &n_plot, FiniteElement::SteadyExactSolutionFctPt exact_soln_pt)
Output exact soln: x,y,u_exact or x,y,z,u_exact at n_plot^DIM plot points.
Definition: multi_poisson_elements.h:1262
void fill_in_contribution_to_residuals(Vector< double > &residuals)
Add the element's contribution to its residual vector (wrapper)
Definition: multi_poisson_elements.h:342
unsigned ndof_types() const
Definition: multi_poisson_elements.h:98
unsigned nscalar_paraview() const
Definition: multi_poisson_elements.h:152
MultiPoissonEquations(const MultiPoissonEquations &dummy)
Broken copy constructor.
Definition: multi_poisson_elements.h:80
void output(FILE *file_pt)
C_style output with default number of plot points.
Definition: multi_poisson_elements.h:226
virtual double dshape_and_dtest_eulerian_multi_poisson(const Vector< double > &s, Shape &psi, DShape &dpsidx, Shape &test, DShape &dtestdx) const =0
void compute_error(std::ostream &outfile, FiniteElement::SteadyExactSolutionFctPt exact_soln_pt, double &error, double &norm)
Get error against and norm of exact solution.
Definition: multi_poisson_elements.h:1319
void fill_in_contribution_to_jacobian(Vector< double > &residuals, DenseMatrix< double > &jacobian)
Definition: multi_poisson_elements.h:353
void get_dof_numbers_for_unknowns(std::list< std::pair< unsigned long, unsigned > > &block_lookup_list) const
Definition: multi_poisson_elements.h:109
virtual void output_fct(std::ostream &outfile, const unsigned &n_plot, const double &time, FiniteElement::UnsteadyExactSolutionFctPt exact_soln_pt)
Definition: multi_poisson_elements.h:243
MultiPoissonSourceFctPt & source_fct_pt()
Access function: Pointer to source function.
Definition: multi_poisson_elements.h:276
void scalar_value_paraview(std::ofstream &file_out, const unsigned &i, const unsigned &nplot) const
Definition: multi_poisson_elements.h:159
Definition: oomph_definitions.h:222
Definition: elements.h:3439
Definition: Qelements.h:459
Definition: multi_poisson_elements.h:462
void output(std::ostream &outfile, const unsigned &n_plot)
Definition: multi_poisson_elements.h:498
QMultiPoissonElement(const QMultiPoissonElement< DIM, NNODE_1D, NFIELDS > &dummy)
Broken copy constructor.
Definition: multi_poisson_elements.h:480
void output_fct(std::ostream &outfile, const unsigned &n_plot, const double &time, FiniteElement::UnsteadyExactSolutionFctPt exact_soln_pt)
Definition: multi_poisson_elements.h:525
void output(FILE *file_pt, const unsigned &n_plot)
Definition: multi_poisson_elements.h:510
double dshape_and_dtest_eulerian_at_knot_multi_poisson(const unsigned &ipt, Shape &psi, DShape &dpsidx, Shape &test, DShape &dtestdx) const
Definition: multi_poisson_elements.h:608
unsigned required_nvalue(const unsigned &n) const
Definition: multi_poisson_elements.h:487
void output(FILE *file_pt)
Definition: multi_poisson_elements.h:504
QMultiPoissonElement()
Definition: multi_poisson_elements.h:475
double dshape_and_dtest_eulerian_multi_poisson(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.
Definition: multi_poisson_elements.h:579
static const unsigned Initial_Nvalue
Definition: multi_poisson_elements.h:468
void output_fct(std::ostream &outfile, const unsigned &n_plot, FiniteElement::SteadyExactSolutionFctPt exact_soln_pt)
Definition: multi_poisson_elements.h:516
void output(std::ostream &outfile)
Definition: multi_poisson_elements.h:492
A Rank 4 Tensor class.
Definition: matrices.h:1701
static int f(const TensorMap< Tensor< int, 3 > > &tensor)
Definition: cxx11_tensor_map.cpp:237
RealScalar s
Definition: level1_cplx_impl.h:130
char char char int int * k
Definition: level2_impl.h:374
#define DIM
Definition: linearised_navier_stokes_elements.h:44
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
void source(const Vector< double > &x, Vector< double > &f)
Source function.
Definition: unstructured_two_d_circle.cc:46
int error
Definition: calibrate.py:297
void broken_copy(const std::string &class_name)
Issue error message and terminate execution.
Definition: oomph_utilities.cc:212
std::string string(const unsigned &i)
Definition: oomph_definitions.cc:286
@ 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
std::ptrdiff_t j
Definition: tut_arithmetic_redux_minmax.cpp:2