27 #ifndef OOMPH_FOURIER_DECOMPOSED_HELMHOLTZ_ELEMENTS_HEADER
28 #define OOMPH_FOURIER_DECOMPOSED_HELMHOLTZ_ELEMENTS_HEADER
33 #include <oomph-lib-config.h>
41 #include "../generic/projection.h"
42 #include "../generic/nodes.h"
43 #include "../generic/Qelements.h"
44 #include "../generic/oomph_utilities.h"
51 namespace Legendre_functions_helper
54 extern double factorial(
const unsigned& l);
57 extern double plgndr1(
const unsigned& n,
const double& x);
60 extern double plgndr2(
const unsigned& l,
117 return std::complex<unsigned>(0, 1);
162 const unsigned n_plot = 5;
168 void output(std::ostream& outfile,
const unsigned& n_plot);
177 const unsigned& n_plot);
182 const unsigned n_plot = 5;
188 void output(FILE* file_pt,
const unsigned& n_plot);
193 const unsigned& n_plot,
199 std::ostream& outfile,
200 const unsigned& n_plot,
204 throw OomphLibError(
"There is no time-dependent output_fct() for "
205 "FourierDecomposedHelmholtz elements ",
206 OOMPH_CURRENT_FUNCTION,
207 OOMPH_EXCEPTION_LOCATION);
218 const unsigned& n_plot,
236 throw OomphLibError(
"There is no time-dependent compute_error() for "
237 "FourierDecomposedHelmholtz elements",
238 OOMPH_CURRENT_FUNCTION,
239 OOMPH_EXCEPTION_LOCATION);
264 std::complex<double>& source)
const
269 source = std::complex<double>(0.0, 0.0);
274 (*Source_fct_pt)(x, source);
281 Vector<std::complex<double>>& flux)
const
284 const unsigned n_node =
nnode();
294 const std::complex<double> zero(0.0, 0.0);
295 for (
unsigned j = 0; j < 2; j++)
301 for (
unsigned l = 0; l < n_node; l++)
304 const std::complex<double> u_value(
309 for (
unsigned j = 0; j < 2; j++)
311 flux[j] += u_value * dpsidx(l, j);
334 residuals, jacobian, 1);
344 const unsigned n_node =
nnode();
353 std::complex<double> interpolated_u(0.0, 0.0);
356 const unsigned u_nodal_index_real =
358 const unsigned u_nodal_index_imag =
362 for (
unsigned l = 0; l < n_node; l++)
365 const std::complex<double> u_value(
369 interpolated_u += u_value * psi[l];
371 return interpolated_u;
387 DShape& dtestdx)
const = 0;
397 DShape& dtestdx)
const = 0;
404 const unsigned& flag);
427 template<
unsigned NNODE_1D>
429 :
public virtual QElement<2, NNODE_1D>,
469 void output(std::ostream& outfile,
const unsigned& n_plot)
481 const unsigned& n_plot)
494 void output(FILE* file_pt,
const unsigned& n_plot)
502 const unsigned& n_plot,
506 outfile, n_plot, exact_soln_pt);
516 const unsigned& n_plot,
520 outfile, phi, n_plot, exact_soln_pt);
528 const unsigned& n_plot,
533 outfile, n_plot, time, exact_soln_pt);
567 template<
unsigned NNODE_1D>
577 const double J = this->dshape_eulerian(
s, psi, dpsidx);
594 template<
unsigned NNODE_1D>
604 const double J = this->dshape_eulerian_at_knot(ipt, psi, dpsidx);
625 template<
unsigned NNODE_1D>
627 :
public virtual QElement<1, NNODE_1D>
644 template<
class FOURIER_DECOMPOSED_HELMHOLTZ_ELEMENT>
661 std::stringstream error_stream;
662 error_stream <<
"Fourier decomposed Helmholtz elements only store 2 "
664 << fld <<
" is illegal \n";
666 error_stream.str(), OOMPH_CURRENT_FUNCTION, OOMPH_EXCEPTION_LOCATION);
671 unsigned nnod = this->
nnode();
675 for (
unsigned j = 0; j < nnod; j++)
678 data_values[j] = std::make_pair(this->
node_pt(j), fld);
698 std::stringstream error_stream;
699 error_stream <<
"Helmholtz elements only store two fields so fld = "
700 << fld <<
" is illegal\n";
702 error_stream.str(), OOMPH_CURRENT_FUNCTION, OOMPH_EXCEPTION_LOCATION);
724 std::stringstream error_stream;
725 error_stream <<
"Helmholtz elements only store two fields so fld = "
726 << fld <<
" is illegal.\n";
728 error_stream.str(), OOMPH_CURRENT_FUNCTION, OOMPH_EXCEPTION_LOCATION);
731 unsigned n_dim = this->
dim();
732 unsigned n_node = this->
nnode();
734 DShape dpsidx(n_node, n_dim), dtestdx(n_node, n_dim);
735 double J = this->dshape_and_dtest_eulerian_fourier_decomposed_helmholtz(
736 s, psi, dpsidx, test, dtestdx);
750 std::stringstream error_stream;
751 error_stream <<
"Helmholtz elements only store two fields so fld = "
752 << fld <<
" is illegal\n";
754 error_stream.str(), OOMPH_CURRENT_FUNCTION, OOMPH_EXCEPTION_LOCATION);
758 std::complex<unsigned> complex_u_nodal_index =
759 this->u_index_fourier_decomposed_helmholtz();
760 unsigned u_nodal_index = 0;
763 u_nodal_index = complex_u_nodal_index.real();
767 u_nodal_index = complex_u_nodal_index.imag();
772 unsigned n_node = this->
nnode();
779 double interpolated_u = 0.0;
782 for (
unsigned l = 0; l < n_node; l++)
784 interpolated_u += this->
nodal_value(t, l, u_nodal_index) * psi[l];
786 return interpolated_u;
796 std::stringstream error_stream;
797 error_stream <<
"Helmholtz elements only store two fields so fld = "
798 << fld <<
" is illegal\n";
800 error_stream.str(), OOMPH_CURRENT_FUNCTION, OOMPH_EXCEPTION_LOCATION);
803 return this->
nnode();
813 std::stringstream error_stream;
814 error_stream <<
"Helmholtz elements only store two fields so fld = "
815 << fld <<
" is illegal\n";
817 error_stream.str(), OOMPH_CURRENT_FUNCTION, OOMPH_EXCEPTION_LOCATION);
820 std::complex<unsigned> complex_u_nodal_index =
821 this->u_index_fourier_decomposed_helmholtz();
822 unsigned u_nodal_index = 0;
825 u_nodal_index = complex_u_nodal_index.real();
829 u_nodal_index = complex_u_nodal_index.imag();
837 void output(std::ostream& outfile,
const unsigned& nplot)
848 template<
class ELEMENT>
861 template<
class ELEMENT>
A Class for the derivatives of shape functions The class design is essentially the same as Shape,...
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 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 .
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...
void(* UnsteadyExactSolutionFctPt)(const double &, const Vector< double > &, Vector< double > &)
Function pointer for function that computes Vector-valued time-dependent function as .
//////////////////////////////////////////////////////////////////// ////////////////////////////////...
FourierDecomposedHelmholtzSourceFctPt Source_fct_pt
Pointer to source function:
void output_real_fct(std::ostream &outfile, const double &phi, const unsigned &n_plot, FiniteElement::SteadyExactSolutionFctPt exact_soln_pt)
Output function for real part of full time-dependent fct u = Re( (u_r +i u_i) exp(-i omega t) at phas...
virtual void fill_in_generic_residual_contribution_fourier_decomposed_helmholtz(Vector< double > &residuals, DenseMatrix< double > &jacobian, const unsigned &flag)
Compute element residual Vector only (if flag=and/or element Jacobian matrix.
int * N_fourier_pt
Pointer to Fourier wave number.
virtual void output_fct(std::ostream &outfile, const unsigned &n_plot, const double &time, FiniteElement::UnsteadyExactSolutionFctPt exact_soln_pt)
Output exact soln: (dummy time-dependent version to keep intel compiler happy)
double * K_squared_pt
Pointer to square of wavenumber.
unsigned self_test()
Self-test: Return 0 for OK.
int *& fourier_wavenumber_pt()
Get pointer to Fourier wavenumber.
void(* FourierDecomposedHelmholtzSourceFctPt)(const Vector< double > &x, std::complex< double > &f)
Function pointer to source function fct(x,f(x)) – x is a Vector!
void output_real(std::ostream &outfile, const double &phi, const unsigned &n_plot)
Output function for real part of full time-dependent solution u = Re( (u_r +i u_i) exp(-i omega t) at...
void get_flux(const Vector< double > &s, Vector< std::complex< double >> &flux) const
Get flux: flux[i] = du/dx_i for real and imag part.
void fill_in_contribution_to_jacobian(Vector< double > &residuals, DenseMatrix< double > &jacobian)
Add the element's contribution to its residual vector and element Jacobian matrix (wrapper)
void compute_norm(double &norm)
Compute norm of fe solution.
double k_squared()
Get the square of wavenumber.
double *& k_squared_pt()
Get pointer to square of wavenumber.
void output_fct(std::ostream &outfile, const unsigned &n_plot, FiniteElement::SteadyExactSolutionFctPt exact_soln_pt)
Output exact soln: r,z,u_re_exact,u_im_exact at n_plot^2 plot points.
virtual double dshape_and_dtest_eulerian_fourier_decomposed_helmholtz(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...
virtual double dshape_and_dtest_eulerian_at_knot_fourier_decomposed_helmholtz(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 ...
FourierDecomposedHelmholtzSourceFctPt source_fct_pt() const
Access function: Pointer to source function. Const version.
FourierDecomposedHelmholtzSourceFctPt & source_fct_pt()
Access function: Pointer to source function.
FourierDecomposedHelmholtzEquations(const FourierDecomposedHelmholtzEquations &dummy)=delete
Broken copy constructor.
void output(std::ostream &outfile)
Output with default number of plot points.
FourierDecomposedHelmholtzEquations()
Constructor.
std::complex< double > interpolated_u_fourier_decomposed_helmholtz(const Vector< double > &s) const
Return FE representation of function value u(s) at local coordinate s.
void compute_error(std::ostream &outfile, FiniteElement::SteadyExactSolutionFctPt exact_soln_pt, double &error, double &norm)
Get error against and norm of exact solution.
virtual std::complex< unsigned > u_index_fourier_decomposed_helmholtz() const
Broken assignment operator.
virtual void get_source_fourier_decomposed_helmholtz(const unsigned &ipt, const Vector< double > &x, std::complex< double > &source) const
Get source term at (Eulerian) position x. This function is virtual to allow overloading in multi-phys...
void output(FILE *file_pt)
C_style output with default number of plot points.
void fill_in_contribution_to_residuals(Vector< double > &residuals)
Add the element's contribution to its residual vector (wrapper)
void compute_error(std::ostream &outfile, FiniteElement::UnsteadyExactSolutionFctPt exact_soln_pt, const double &time, double &error, double &norm)
Dummy, time dependent error checker.
int fourier_wavenumber()
Get the Fourier wavenumber.
static DenseMatrix< double > Dummy_matrix
Empty dense matrix used as a dummy argument to combined residual and jacobian functions in the case w...
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 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 nfields_for_projection()
Number of fields to be projected: 2 (real and imag part)
ProjectableFourierDecomposedHelmholtzElement()
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.
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 ...
int local_equation(const unsigned &fld, const unsigned &j)
Return local equation number of value j in field fld.
unsigned nhistory_values_for_coordinate_projection()
Number of positional history values (Note: count includes current value!)
unsigned nvalue_of_field(const unsigned &fld)
Return number of values in field fld: One per node.
void output(std::ostream &outfile, const unsigned &nplot)
Output FE representation of soln: x,y,u or x,y,z,u at n_plot^DIM plot points.
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_real(std::ostream &outfile, const double &phi, const unsigned &n_plot)
Output function for real part of full time-dependent solution u = Re( (u_r +i u_i) exp(-i omega t) at...
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. r,z,u_exact at n_plot^2 plot points (Calls the s...
void output(FILE *file_pt)
C-style output function: r,z,u.
void output_fct(std::ostream &outfile, const unsigned &n_plot, FiniteElement::SteadyExactSolutionFctPt exact_soln_pt)
Output function for an exact solution: r,z,u_exact at n_plot^2 plot points.
void output(std::ostream &outfile)
Output function: r,z,u.
void output_real_fct(std::ostream &outfile, const double &phi, const unsigned &n_plot, FiniteElement::SteadyExactSolutionFctPt exact_soln_pt)
Output function for real part of full time-dependent fct u = Re( (u_r +i u_i) exp(-i omega t) at phas...
static const unsigned Initial_Nvalue
Static int that holds the number of variables at nodes: always the same.
QFourierDecomposedHelmholtzElement()
Constructor: Call constructors for QElement and FourierDecomposedHelmholtz equations.
void output(FILE *file_pt, const unsigned &n_plot)
C-style output function: r,z,u at n_plot^2 plot points.
double dshape_and_dtest_eulerian_at_knot_fourier_decomposed_helmholtz(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....
unsigned required_nvalue(const unsigned &n) const
Broken assignment operator.
void output(std::ostream &outfile, const unsigned &n_plot)
Output function: r,z,u at n_plot^2 plot points.
double dshape_and_dtest_eulerian_fourier_decomposed_helmholtz(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.
QFourierDecomposedHelmholtzElement(const QFourierDecomposedHelmholtzElement< NNODE_1D > &dummy)=delete
Broken copy constructor.
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)
void output()
Doc the command line arguments.
double factorial(const unsigned &l)
Factorial.
double plgndr1(const unsigned &n, const double &x)
Legendre polynomials depending on one parameter.
double plgndr2(const unsigned &l, const unsigned &m, const double &x)
Legendre polynomials depending on two parameters.
//////////////////////////////////////////////////////////////////// ////////////////////////////////...