oomph::HelmholtzDtNMesh< ELEMENT > Class Template Reference

#include <helmholtz_bc_elements.h>

+ Inheritance diagram for oomph::HelmholtzDtNMesh< ELEMENT >:

Public Member Functions

 HelmholtzDtNMesh (const double &outer_radius, const unsigned &nfourier_terms)
 
void setup_gamma ()
 of the mesh's constituent elements More...
 
void compute_fourier_components (Vector< std::complex< double >> &a_coeff_pos, Vector< std::complex< double >> &a_coeff_neg)
 
Vector< std::complex< double > > & gamma_at_gauss_point (FiniteElement *el_pt)
 
Vector< std::map< unsigned, std::complex< double > > > & d_gamma_at_gauss_point (FiniteElement *el_pt)
 
doubleouter_radius ()
 The outer radius. More...
 
unsignednfourier_terms ()
 
- Public Member Functions inherited from oomph::Mesh
 Mesh ()
 Default constructor. More...
 
 Mesh (const Vector< Mesh * > &sub_mesh_pt)
 
void merge_meshes (const Vector< Mesh * > &sub_mesh_pt)
 
virtual void setup_boundary_element_info ()
 
virtual void setup_boundary_element_info (std::ostream &outfile)
 
virtual void reset_boundary_element_info (Vector< unsigned > &ntmp_boundary_elements, Vector< Vector< unsigned >> &ntmp_boundary_elements_in_region, Vector< FiniteElement * > &deleted_elements)
 Virtual function to perform the reset boundary elements info rutines. More...
 
template<class BULK_ELEMENT >
void doc_boundary_coordinates (const unsigned &b, std::ofstream &the_file)
 
virtual void scale_mesh (const double &factor)
 
 Mesh (const Mesh &dummy)=delete
 Broken copy constructor. More...
 
void operator= (const Mesh &)=delete
 Broken assignment operator. More...
 
virtual ~Mesh ()
 Virtual Destructor to clean up all memory. More...
 
void flush_element_and_node_storage ()
 
void flush_element_storage ()
 
void flush_node_storage ()
 
Node *& node_pt (const unsigned long &n)
 Return pointer to global node n. More...
 
Nodenode_pt (const unsigned long &n) const
 Return pointer to global node n (const version) More...
 
GeneralisedElement *& element_pt (const unsigned long &e)
 Return pointer to element e. More...
 
GeneralisedElementelement_pt (const unsigned long &e) const
 Return pointer to element e (const version) More...
 
const Vector< GeneralisedElement * > & element_pt () const
 Return reference to the Vector of elements. More...
 
Vector< GeneralisedElement * > & element_pt ()
 Return reference to the Vector of elements. More...
 
FiniteElementfinite_element_pt (const unsigned &e) const
 
Node *& boundary_node_pt (const unsigned &b, const unsigned &n)
 Return pointer to node n on boundary b. More...
 
Nodeboundary_node_pt (const unsigned &b, const unsigned &n) const
 Return pointer to node n on boundary b. More...
 
void set_nboundary (const unsigned &nbound)
 Set the number of boundaries in the mesh. More...
 
void remove_boundary_nodes ()
 Clear all pointers to boundary nodes. More...
 
void remove_boundary_nodes (const unsigned &b)
 
void remove_boundary_node (const unsigned &b, Node *const &node_pt)
 Remove a node from the boundary b. More...
 
void add_boundary_node (const unsigned &b, Node *const &node_pt)
 Add a (pointer to) a node to the b-th boundary. More...
 
void copy_boundary_node_data_from_nodes ()
 
bool boundary_coordinate_exists (const unsigned &i) const
 Indicate whether the i-th boundary has an intrinsic coordinate. More...
 
unsigned long nelement () const
 Return number of elements in the mesh. More...
 
unsigned long nnode () const
 Return number of nodes in the mesh. More...
 
unsigned ndof_types () const
 Return number of dof types in mesh. More...
 
unsigned elemental_dimension () const
 Return number of elemental dimension in mesh. More...
 
unsigned nodal_dimension () const
 Return number of nodal dimension in mesh. More...
 
void add_node_pt (Node *const &node_pt)
 Add a (pointer to a) node to the mesh. More...
 
void add_element_pt (GeneralisedElement *const &element_pt)
 Add a (pointer to) an element to the mesh. More...
 
virtual void node_update (const bool &update_all_solid_nodes=false)
 
virtual void reorder_nodes (const bool &use_old_ordering=true)
 
virtual void get_node_reordering (Vector< Node * > &reordering, const bool &use_old_ordering=true) const
 
template<class BULK_ELEMENT , template< class > class FACE_ELEMENT>
void build_face_mesh (const unsigned &b, Mesh *const &face_mesh_pt)
 
unsigned self_test ()
 Self-test: Check elements and nodes. Return 0 for OK. More...
 
void max_and_min_element_size (double &max_size, double &min_size)
 
double total_size ()
 
void check_inverted_elements (bool &mesh_has_inverted_elements, std::ofstream &inverted_element_file)
 
void check_inverted_elements (bool &mesh_has_inverted_elements)
 
unsigned check_for_repeated_nodes (const double &epsilon=1.0e-12)
 
Vector< Node * > prune_dead_nodes ()
 
unsigned nboundary () const
 Return number of boundaries. More...
 
unsigned long nboundary_node (const unsigned &ibound) const
 Return number of nodes on a particular boundary. More...
 
FiniteElementboundary_element_pt (const unsigned &b, const unsigned &e) const
 Return pointer to e-th finite element on boundary b. More...
 
Nodeget_some_non_boundary_node () const
 
unsigned nboundary_element (const unsigned &b) const
 Return number of finite elements that are adjacent to boundary b. More...
 
int face_index_at_boundary (const unsigned &b, const unsigned &e) const
 
virtual void dump (std::ofstream &dump_file, const bool &use_old_ordering=true) const
 Dump the data in the mesh into a file for restart. More...
 
void dump (const std::string &dump_file_name, const bool &use_old_ordering=true) const
 Dump the data in the mesh into a file for restart. More...
 
virtual void read (std::ifstream &restart_file)
 Read solution from restart file. More...
 
void output_paraview (std::ofstream &file_out, const unsigned &nplot) const
 
void output_fct_paraview (std::ofstream &file_out, const unsigned &nplot, FiniteElement::SteadyExactSolutionFctPt exact_soln_pt) const
 
void output_fct_paraview (std::ofstream &file_out, const unsigned &nplot, const double &time, FiniteElement::UnsteadyExactSolutionFctPt exact_soln_pt) const
 
void output (std::ostream &outfile)
 Output for all elements. More...
 
void output (std::ostream &outfile, const unsigned &n_plot)
 Output at f(n_plot) points in each element. More...
 
void output (FILE *file_pt)
 Output for all elements (C-style output) More...
 
void output (FILE *file_pt, const unsigned &nplot)
 Output at f(n_plot) points in each element (C-style output) More...
 
void output (const std::string &output_filename)
 Output for all elements. More...
 
void output (const std::string &output_filename, const unsigned &n_plot)
 Output at f(n_plot) points in each element. More...
 
void output_fct (std::ostream &outfile, const unsigned &n_plot, FiniteElement::SteadyExactSolutionFctPt)
 Output a given Vector function at f(n_plot) points in each element. More...
 
void output_fct (std::ostream &outfile, const unsigned &n_plot, const double &time, FiniteElement::UnsteadyExactSolutionFctPt)
 
void output_boundaries (std::ostream &outfile)
 Output the nodes on the boundaries (into separate tecplot zones) More...
 
void output_boundaries (const std::string &output_filename)
 
void assign_initial_values_impulsive ()
 Assign initial values for an impulsive start. More...
 
void shift_time_values ()
 
void calculate_predictions ()
 
void set_nodal_and_elemental_time_stepper (TimeStepper *const &time_stepper_pt, const bool &preserve_existing_data)
 
virtual void set_mesh_level_time_stepper (TimeStepper *const &time_stepper_pt, const bool &preserve_existing_data)
 
void set_consistent_pinned_values_for_continuation (ContinuationStorageScheme *const &continuation_stepper_pt)
 Set consistent values for pinned data in continuation. More...
 
bool does_pointer_correspond_to_mesh_data (double *const &parameter_pt)
 Does the double pointer correspond to any mesh data. More...
 
void set_nodal_time_stepper (TimeStepper *const &time_stepper_pt, const bool &preserve_existing_data)
 Set the timestepper associated with the nodal data in the mesh. More...
 
void set_elemental_internal_time_stepper (TimeStepper *const &time_stepper_pt, const bool &preserve_existing_data)
 
virtual void compute_norm (double &norm)
 
virtual void compute_norm (Vector< double > &norm)
 
virtual void compute_error (std::ostream &outfile, FiniteElement::UnsteadyExactSolutionFctPt exact_soln_pt, const double &time, double &error, double &norm)
 
virtual void compute_error (std::ostream &outfile, FiniteElement::SteadyExactSolutionFctPt exact_soln_pt, double &error, double &norm)
 
virtual void compute_error (FiniteElement::SteadyExactSolutionFctPt exact_soln_pt, double &error, double &norm)
 
virtual void compute_error (FiniteElement::SteadyExactSolutionFctPt exact_soln_pt, Vector< double > &error, Vector< double > &norm)
 
virtual void compute_error (std::ostream &outfile, FiniteElement::UnsteadyExactSolutionFctPt exact_soln_pt, const double &time, Vector< double > &error, Vector< double > &norm)
 
virtual void compute_error (std::ostream &outfile, FiniteElement::SteadyExactSolutionFctPt exact_soln_pt, Vector< double > &error, Vector< double > &norm)
 
virtual void compute_error (FiniteElement::UnsteadyExactSolutionFctPt exact_soln_pt, const double &time, double &error, double &norm)
 Returns the norm of the error and that of the exact solution. More...
 
virtual void compute_error (FiniteElement::UnsteadyExactSolutionFctPt exact_soln_pt, const double &time, Vector< double > &error, Vector< double > &norm)
 
bool is_mesh_distributed () const
 Boolean to indicate if Mesh has been distributed. More...
 
OomphCommunicatorcommunicator_pt () const
 
void delete_all_external_storage ()
 Wipe the storage for all externally-based elements. More...
 

Private Attributes

double Outer_radius
 Outer radius. More...
 
unsigned Nfourier_terms
 Nbr of Fourier terms used in the Gamma computation. More...
 
std::map< FiniteElement *, Vector< std::complex< double > > > Gamma_at_gauss_point
 
std::map< FiniteElement *, Vector< std::map< unsigned, std::complex< double > > > > D_Gamma_at_gauss_point
 

Additional Inherited Members

- Public Types inherited from oomph::Mesh
typedef void(FiniteElement::* SteadyExactSolutionFctPt) (const Vector< double > &x, Vector< double > &soln)
 
typedef void(FiniteElement::* UnsteadyExactSolutionFctPt) (const double &time, const Vector< double > &x, Vector< double > &soln)
 
- Static Public Attributes inherited from oomph::Mesh
static Steady< 0 > Default_TimeStepper
 The Steady Timestepper. More...
 
static bool Suppress_warning_about_empty_mesh_level_time_stepper_function
 Static boolean flag to control warning about mesh level timesteppers. More...
 
- Protected Member Functions inherited from oomph::Mesh
unsigned long assign_global_eqn_numbers (Vector< double * > &Dof_pt)
 Assign (global) equation numbers to the nodes. More...
 
void describe_dofs (std::ostream &out, const std::string &current_string) const
 
void describe_local_dofs (std::ostream &out, const std::string &current_string) const
 
void assign_local_eqn_numbers (const bool &store_local_dof_pt)
 Assign local equation numbers in all elements. More...
 
void convert_to_boundary_node (Node *&node_pt, const Vector< FiniteElement * > &finite_element_pt)
 
void convert_to_boundary_node (Node *&node_pt)
 
- Protected Attributes inherited from oomph::Mesh
Vector< Vector< Node * > > Boundary_node_pt
 
bool Lookup_for_elements_next_boundary_is_setup
 
Vector< Vector< FiniteElement * > > Boundary_element_pt
 
Vector< Vector< int > > Face_index_at_boundary
 
Vector< Node * > Node_pt
 Vector of pointers to nodes. More...
 
Vector< GeneralisedElement * > Element_pt
 Vector of pointers to generalised elements. More...
 
std::vector< boolBoundary_coordinate_exists
 

Detailed Description

template<class ELEMENT>
class oomph::HelmholtzDtNMesh< ELEMENT >

/////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// ================================================================= Mesh for DtN boundary condition elements – provides functionality to apply Sommerfeld radiation condtion

via DtN BC

Constructor & Destructor Documentation

◆ HelmholtzDtNMesh()

template<class ELEMENT >
oomph::HelmholtzDtNMesh< ELEMENT >::HelmholtzDtNMesh ( const double outer_radius,
const unsigned nfourier_terms 
)
inline

Constructor: Specify radius of outer boundary and number of Fourier terms used in the computation of the gamma integral

568  {
569  }
unsigned Nfourier_terms
Nbr of Fourier terms used in the Gamma computation.
Definition: helmholtz_bc_elements.h:613
unsigned & nfourier_terms()
Definition: helmholtz_bc_elements.h:603
double Outer_radius
Outer radius.
Definition: helmholtz_bc_elements.h:610
double & outer_radius()
The outer radius.
Definition: helmholtz_bc_elements.h:596

Member Function Documentation

◆ compute_fourier_components()

template<class ELEMENT >
void oomph::HelmholtzDtNMesh< ELEMENT >::compute_fourier_components ( Vector< std::complex< double >> &  a_coeff_pos,
Vector< std::complex< double >> &  a_coeff_neg 
)

Compute Fourier components of the solution – length of vector indicates number of terms to be computed.

////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////// ================================================================ Compute Fourier components of the solution – length of

vector indicates number of terms to be computed.

1624  {
1625 #ifdef PARANOID
1626  if (a_coeff_pos.size() != a_coeff_neg.size())
1627  {
1628  std::ostringstream error_stream;
1629  error_stream << "a_coeff_pos and a_coeff_neg must have "
1630  << "the same size. \n";
1631  throw OomphLibError(
1632  error_stream.str(), OOMPH_CURRENT_FUNCTION, OOMPH_EXCEPTION_LOCATION);
1633  }
1634 #endif
1635 
1636  // Initialise
1637  unsigned n = a_coeff_pos.size();
1638  Vector<std::complex<double>> el_a_coeff_pos(n);
1639  Vector<std::complex<double>> el_a_coeff_neg(n);
1640  for (unsigned i = 0; i < n; i++)
1641  {
1642  a_coeff_pos[i] = std::complex<double>(0.0, 0.0);
1643  a_coeff_neg[i] = std::complex<double>(0.0, 0.0);
1644  }
1645 
1646  // Loop over elements e
1647  unsigned nel = this->nelement();
1648  for (unsigned e = 0; e < nel; e++)
1649  {
1650  // Get a pointer to element
1651  HelmholtzBCElementBase<ELEMENT>* el_pt =
1652  dynamic_cast<HelmholtzBCElementBase<ELEMENT>*>(this->element_pt(e));
1653 
1654  // Compute contribution
1655  el_pt->compute_contribution_to_fourier_components(el_a_coeff_pos,
1656  el_a_coeff_neg);
1657 
1658  // Add to coefficients
1659  for (unsigned i = 0; i < n; i++)
1660  {
1661  a_coeff_pos[i] += el_a_coeff_pos[i];
1662  a_coeff_neg[i] += el_a_coeff_neg[i];
1663  }
1664  }
1665  }
int i
Definition: BiCGSTAB_step_by_step.cpp:9
const unsigned n
Definition: CG3DPackingUnitTest.cpp:11
Array< double, 1, 3 > e(1./3., 0.5, 2.)
const Vector< GeneralisedElement * > & element_pt() const
Return reference to the Vector of elements.
Definition: mesh.h:460
unsigned long nelement() const
Return number of elements in the mesh.
Definition: mesh.h:590
#define OOMPH_EXCEPTION_LOCATION
Definition: oomph_definitions.h:61
#define OOMPH_CURRENT_FUNCTION
Definition: oomph_definitions.h:86

References oomph::HelmholtzBCElementBase< ELEMENT >::compute_contribution_to_fourier_components(), e(), i, n, OOMPH_CURRENT_FUNCTION, and OOMPH_EXCEPTION_LOCATION.

◆ d_gamma_at_gauss_point()

template<class ELEMENT >
Vector<std::map<unsigned, std::complex<double> > >& oomph::HelmholtzDtNMesh< ELEMENT >::d_gamma_at_gauss_point ( FiniteElement el_pt)
inline

Derivative of Gamma integral w.r.t global unknown, evaluated at Gauss points for specified element

591  {
592  return D_Gamma_at_gauss_point[el_pt];
593  }
std::map< FiniteElement *, Vector< std::map< unsigned, std::complex< double > > > > D_Gamma_at_gauss_point
Definition: helmholtz_bc_elements.h:624

References oomph::HelmholtzDtNMesh< ELEMENT >::D_Gamma_at_gauss_point.

◆ gamma_at_gauss_point()

template<class ELEMENT >
Vector<std::complex<double> >& oomph::HelmholtzDtNMesh< ELEMENT >::gamma_at_gauss_point ( FiniteElement el_pt)
inline

Gamma integral evaluated at Gauss points for specified element

583  {
584  return Gamma_at_gauss_point[el_pt];
585  }
std::map< FiniteElement *, Vector< std::complex< double > > > Gamma_at_gauss_point
Definition: helmholtz_bc_elements.h:618

References oomph::HelmholtzDtNMesh< ELEMENT >::Gamma_at_gauss_point.

◆ nfourier_terms()

template<class ELEMENT >
unsigned& oomph::HelmholtzDtNMesh< ELEMENT >::nfourier_terms ( )
inline

Number of Fourier terms used in the computation of the gamma integral

604  {
605  return Nfourier_terms;
606  }

References oomph::HelmholtzDtNMesh< ELEMENT >::Nfourier_terms.

◆ outer_radius()

template<class ELEMENT >
double& oomph::HelmholtzDtNMesh< ELEMENT >::outer_radius ( )
inline

The outer radius.

597  {
598  return Outer_radius;
599  }

References oomph::HelmholtzDtNMesh< ELEMENT >::Outer_radius.

◆ setup_gamma()

template<class ELEMENT >
void oomph::HelmholtzDtNMesh< ELEMENT >::setup_gamma

of the mesh's constituent elements

Compute and store the gamma integral at all integration points of the constituent elements.

================================================================ Compute and store the gamma integral and derivates

1675  {
1676 #ifdef PARANOID
1677  {
1678  // Loop over elements e
1679  unsigned nel = this->nelement();
1680  for (unsigned e = 0; e < nel; e++)
1681  {
1682  FiniteElement* fe_pt = finite_element_pt(e);
1683  unsigned nnod = fe_pt->nnode();
1684  for (unsigned j = 0; j < nnod; j++)
1685  {
1686  Node* nod_pt = fe_pt->node_pt(j);
1687 
1688  // Extract nodal coordinates from node:
1689  Vector<double> x(2);
1690  x[0] = nod_pt->x(0);
1691  x[1] = nod_pt->x(1);
1692 
1693  // Evaluate the radial distance
1694  double r = sqrt(x[0] * x[0] + x[1] * x[1]);
1695 
1696  // Check
1697  if (Outer_radius == 0.0)
1698  {
1699  throw OomphLibError("Outer radius for DtN BC must not be zero!",
1702  }
1703 
1704  if (std::fabs((r - this->Outer_radius) / Outer_radius) >
1706  {
1707  std::ostringstream error_stream;
1708  error_stream << "Node at " << x[0] << " " << x[1] << " has radius "
1709  << r << " which does not "
1710  << " agree with \nspecified outer radius "
1711  << this->Outer_radius << " within relative tolerance "
1713  << ".\nYou can adjust the tolerance via\n"
1714  << "ToleranceForHelmholtzOuterBoundary::Tol\n"
1715  << "or recompile without PARANOID.\n";
1716  throw OomphLibError(error_stream.str(),
1719  }
1720  }
1721  }
1722  }
1723 #endif
1724 
1725 
1726  // Get Helmholtz parameter from bulk element
1727  HelmholtzDtNBoundaryElement<ELEMENT>* el_pt =
1728  dynamic_cast<HelmholtzDtNBoundaryElement<ELEMENT>*>(this->element_pt(0));
1729  double k =
1730  sqrt(dynamic_cast<ELEMENT*>(el_pt->bulk_element_pt())->k_squared());
1731 
1732  // Precompute factors in sum
1733  Vector<std::complex<double>> h_a(Nfourier_terms), hp_a(Nfourier_terms),
1734  q(Nfourier_terms);
1736  Nfourier_terms, Outer_radius * k, h_a, hp_a);
1737  for (unsigned i = 0; i < Nfourier_terms; i++)
1738  {
1739  q[i] = (k / (2.0 * MathematicalConstants::Pi)) * (hp_a[i] / h_a[i]);
1740  }
1741 
1742  // first loop over elements e
1743  unsigned nel = this->nelement();
1744  for (unsigned e = 0; e < nel; e++)
1745  {
1746  // Get a pointer to element
1747  HelmholtzDtNBoundaryElement<ELEMENT>* el_pt =
1748  dynamic_cast<HelmholtzDtNBoundaryElement<ELEMENT>*>(
1749  this->element_pt(e));
1750 
1751  // Set the value of n_intpt
1752  const unsigned n_intpt = el_pt->integral_pt()->nweight();
1753 
1754  // initialise gamma integral and its derivatives
1755  Vector<std::complex<double>> gamma_vector(n_intpt,
1756  std::complex<double>(0.0, 0.0));
1757  Vector<std::map<unsigned, std::complex<double>>> d_gamma_vector(n_intpt);
1758 
1759  // Loop over the integration points
1760  for (unsigned ipt = 0; ipt < n_intpt; ipt++)
1761  {
1762  // Allocate and initialise coordinate
1763  unsigned ndim_local = el_pt->dim();
1764  Vector<double> x(ndim_local + 1, 0.0);
1765 
1766  // Set the Vector to hold local coordinates
1767  Vector<double> s(ndim_local, 0.0);
1768  for (unsigned i = 0; i < ndim_local; i++)
1769  {
1770  s[i] = el_pt->integral_pt()->knot(ipt, i);
1771  }
1772 
1773  // Get the coordinates of the integration point
1774  el_pt->interpolated_x(s, x);
1775 
1776  // Polar angle
1777  double phi = atan2(x[1], x[0]);
1778 
1779  // Elemental contribution to gamma integral and its derivative
1780  std::complex<double> gamma_con_p(0.0, 0.0), gamma_con_n(0.0, 0.0);
1781  std::map<unsigned, std::complex<double>> d_gamma_con_p, d_gamma_con_n;
1782 
1783  // loop over the Fourier terms
1784  for (unsigned nn = 0; nn < Nfourier_terms; nn++)
1785  {
1786  // Second loop over the element
1787  // to evaluate the complete integral
1788  for (unsigned ee = 0; ee < nel; ee++)
1789  {
1790  HelmholtzDtNBoundaryElement<ELEMENT>* eel_pt =
1791  dynamic_cast<HelmholtzDtNBoundaryElement<ELEMENT>*>(
1792  this->element_pt(ee));
1793 
1794  // contribution of the positive term in the sum
1795  eel_pt->compute_gamma_contribution(
1796  phi, int(nn), gamma_con_p, d_gamma_con_p);
1797 
1798  // contribution of the negative term in the sum
1799  eel_pt->compute_gamma_contribution(
1800  phi, -int(nn), gamma_con_n, d_gamma_con_n);
1801 
1802  unsigned n_node = eel_pt->nnode();
1803  if (nn == 0)
1804  {
1805  gamma_vector[ipt] += q[nn] * gamma_con_p;
1806  for (unsigned l = 0; l < n_node; l++)
1807  {
1808  // Add the contribution of the real local data
1809  int local_unknown_p_real = eel_pt->nodal_local_eqn(
1810  l, eel_pt->u_index_helmholtz().real());
1811  if (local_unknown_p_real >= 0)
1812  {
1813  int global_unknown_p_real =
1814  eel_pt->eqn_number(local_unknown_p_real);
1815  d_gamma_vector[ipt][global_unknown_p_real] +=
1816  q[nn] * d_gamma_con_p[global_unknown_p_real];
1817  }
1818 
1819  // Add the contribution of the imag local data
1820  int local_unknown_p_imag = eel_pt->nodal_local_eqn(
1821  l, eel_pt->u_index_helmholtz().imag());
1822 
1823  if (local_unknown_p_imag >= 0)
1824  {
1825  int global_unknown_p_imag =
1826  eel_pt->eqn_number(local_unknown_p_imag);
1827 
1828  d_gamma_vector[ipt][global_unknown_p_imag] +=
1829  q[nn] * d_gamma_con_p[global_unknown_p_imag];
1830  }
1831  } // end of loop over the node
1832  } // End of if
1833  else
1834  {
1835  gamma_vector[ipt] += q[nn] * (gamma_con_p + gamma_con_n);
1836  for (unsigned l = 0; l < n_node; l++)
1837  {
1838  // Add the contribution of the real local data
1839  int local_unknown_real = eel_pt->nodal_local_eqn(
1840  l, eel_pt->u_index_helmholtz().real());
1841  if (local_unknown_real >= 0)
1842  {
1843  int global_unknown_real =
1844  eel_pt->eqn_number(local_unknown_real);
1845  d_gamma_vector[ipt][global_unknown_real] +=
1846  q[nn] * (d_gamma_con_p[global_unknown_real] +
1847  d_gamma_con_n[global_unknown_real]);
1848  }
1849  // Add the contribution of the imag local data
1850  int local_unknown_imag = eel_pt->nodal_local_eqn(
1851  l, eel_pt->u_index_helmholtz().imag());
1852  if (local_unknown_imag >= 0)
1853  {
1854  int global_unknown_imag =
1855  eel_pt->eqn_number(local_unknown_imag);
1856  d_gamma_vector[ipt][global_unknown_imag] +=
1857  q[nn] * (d_gamma_con_p[global_unknown_imag] +
1858  d_gamma_con_n[global_unknown_imag]);
1859  }
1860  } // end of loop over the node
1861  } // End of else
1862  } // End of second loop over the elements
1863  } // End of loop over Fourier terms
1864  } // end of loop over integration point
1865 
1866  // Store it in map
1867  Gamma_at_gauss_point[el_pt] = gamma_vector;
1868  D_Gamma_at_gauss_point[el_pt] = d_gamma_vector;
1869 
1870  } // end of first loop over element
1871  }
AnnoyingScalar atan2(const AnnoyingScalar &y, const AnnoyingScalar &x)
Definition: AnnoyingScalar.h:139
AnnoyingScalar sqrt(const AnnoyingScalar &x)
Definition: AnnoyingScalar.h:134
FiniteElement * finite_element_pt(const unsigned &e) const
Definition: mesh.h:473
RealScalar s
Definition: level1_cplx_impl.h:130
char char char int int * k
Definition: level2_impl.h:374
EIGEN_DEVICE_FUNC const Scalar & q
Definition: SpecialFunctionsImpl.h:2019
r
Definition: UniformPSDSelfTest.py:20
Real fabs(const Real &a)
Definition: boostmultiprec.cpp:117
void Hankel_first(const unsigned &n, const double &x, Vector< std::complex< double >> &h, Vector< std::complex< double >> &hp)
Definition: helmholtz_bc_elements.h:62
const double Pi
50 digits from maple
Definition: oomph_utilities.h:157
double Tol
Definition: helmholtz_bc_elements.h:1607
list x
Definition: plotDoE.py:28
std::ptrdiff_t j
Definition: tut_arithmetic_redux_minmax.cpp:2

References atan2(), oomph::FaceElement::bulk_element_pt(), oomph::HelmholtzDtNBoundaryElement< ELEMENT >::compute_gamma_contribution(), oomph::FiniteElement::dim(), e(), oomph::GeneralisedElement::eqn_number(), boost::multiprecision::fabs(), oomph::Hankel_functions_for_helmholtz_problem::Hankel_first(), i, oomph::FiniteElement::integral_pt(), oomph::FaceElement::interpolated_x(), j, k, oomph::Integral::knot(), oomph::FiniteElement::nnode(), oomph::FiniteElement::nodal_local_eqn(), oomph::FiniteElement::node_pt(), oomph::Integral::nweight(), OOMPH_CURRENT_FUNCTION, OOMPH_EXCEPTION_LOCATION, GlobalParameters::Outer_radius, oomph::MathematicalConstants::Pi, Eigen::numext::q, UniformPSDSelfTest::r, s, sqrt(), oomph::ToleranceForHelmholtzOuterBoundary::Tol, oomph::HelmholtzBCElementBase< ELEMENT >::u_index_helmholtz(), plotDoE::x, and oomph::Node::x().

Member Data Documentation

◆ D_Gamma_at_gauss_point

template<class ELEMENT >
std::map<FiniteElement*, Vector<std::map<unsigned, std::complex<double> > > > oomph::HelmholtzDtNMesh< ELEMENT >::D_Gamma_at_gauss_point
private

Container to store the derivate of Gamma integral w.r.t global unknown evaluated at Gauss points for specified element

Referenced by oomph::HelmholtzDtNMesh< ELEMENT >::d_gamma_at_gauss_point().

◆ Gamma_at_gauss_point

template<class ELEMENT >
std::map<FiniteElement*, Vector<std::complex<double> > > oomph::HelmholtzDtNMesh< ELEMENT >::Gamma_at_gauss_point
private

Container to store the gamma integral for given Gauss point and element

Referenced by oomph::HelmholtzDtNMesh< ELEMENT >::gamma_at_gauss_point().

◆ Nfourier_terms

template<class ELEMENT >
unsigned oomph::HelmholtzDtNMesh< ELEMENT >::Nfourier_terms
private

Nbr of Fourier terms used in the Gamma computation.

Referenced by oomph::HelmholtzDtNMesh< ELEMENT >::nfourier_terms().

◆ Outer_radius

template<class ELEMENT >
double oomph::HelmholtzDtNMesh< ELEMENT >::Outer_radius
private

The documentation for this class was generated from the following file: