#ifndef FILE_BEM #define FILE_BEM /*********************************************************************/ /* File: bem.hh */ /* Author: Joachim Schoeberl */ /* Date: 5. Dec. 2001 */ /*********************************************************************/ /** BEM Bilinear-form for boundary element methods */ class BEMElement : public SpecialElement { protected: ///fe spaces for Dirichlet data const FESpace & fes; /// fe space for Neumann data const FESpace & fes_neumann; /// node renumbering: ARRAY bem2fem; /// node renumbering, reverse: ARRAY fem2bem; /// number of fem dofs int dimfem; /// number of Dirichlet - BEM dofs int dimd; /// number of Neumann - BEM dofs int dimn; public: BEMElement (const FESpace & afes, const FESpace & afespacen); /* virtual void Assemble (FlatMatrix & elmat, LocalHeap & lh) const; virtual void Assemble (FlatMatrix & elmat, LocalHeap & lh) const; */ virtual void GetDofNrs (ARRAY & dnums) const; virtual void Update (); }; /// template class S_BEMElement : public BEMElement { public: typedef SCAL TSCAL; S_BEMElement (const FESpace & afes, const FESpace & afes_neumann); virtual void Assemble (FlatMatrix & elmat, LocalHeap & lh) const; virtual void AssembleIntegralOps (FlatMatrix & singlelayer, FlatMatrix & doublelayer, FlatMatrix & hypersingular, FlatMatrix & duality, LocalHeap & lh) const = 0; }; template class S_LaplaceBEMElement : public S_BEMElement { public: typedef SCAL TSCAL; S_LaplaceBEMElement (const FESpace & afes, const FESpace & afes_neumann) : S_BEMElement (afes, afes_neumann) { ; } virtual void AssembleIntegralOps (FlatMatrix & singlelayer, FlatMatrix & doublelayer, FlatMatrix & hypersingular, FlatMatrix & duality, LocalHeap & lh) const; virtual void AssembleElementMatrix (const NodalFiniteElement & feld1, const NodalFiniteElement & feld2, const NodalFiniteElement & feln1, const NodalFiniteElement & feln2, const ElementTransformation & eltrans1, const ElementTransformation & eltrans2, FlatMatrix & elsingle, FlatMatrix & eldouble, FlatMatrix & elduality, FlatMatrix & elhyper, LocalHeap & locheap) const; double Fundamental (double * x) const; double DFundamental (double * x, double * nx) const; double DDFundamental (double * x, double * nx, double * ny) const; }; /// class Helmholtz_BEMElement : public S_BEMElement { double k0; S_LaplaceBEMElement laplace; public: typedef Complex TSCAL; Helmholtz_BEMElement (const FESpace & afes, const FESpace & afes_neumann, double ak); virtual void Update (); virtual void AssembleIntegralOps (FlatMatrix & singlelayer, FlatMatrix & doublelayer, FlatMatrix & hypersingular, FlatMatrix & duality, LocalHeap & lh) const; virtual void AssembleElementMatrix (const NodalFiniteElement & feld1, const NodalFiniteElement & feld2, const NodalFiniteElement & feln1, const NodalFiniteElement & feln2, const ElementTransformation & eltrans1, const ElementTransformation & eltrans2, FlatMatrix & elsingle, FlatMatrix & eldouble, FlatMatrix & elduality, FlatMatrix & elhyper, LocalHeap & locheap) const; Complex Fundamental (double * x) const; Complex DFundamental (double * x, double * nx) const; Complex DDFundamental (double * x, double * nx, double * ny) const; }; #endif