Lemma is an Electromagnetics API
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

HankelTransform.h 3.7KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. /* This file is part of Lemma, a geophysical modelling and inversion API */
  2. /* This Source Code Form is subject to the terms of the Mozilla Public
  3. * License, v. 2.0. If a copy of the MPL was not distributed with this
  4. * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
  5. /**
  6. @file
  7. @author Trevor Irons
  8. @date 01/28/2010
  9. **/
  10. #ifndef __hankeltransform_h
  11. #define __hankeltransform_h
  12. #include "KernelEM1DSpec.h"
  13. #include "KernelEM1DManager.h"
  14. namespace Lemma {
  15. class KernelEM1DBase;
  16. // ===================================================================
  17. // Class: HankelTransform
  18. /// \ingroup FDEM1D
  19. /// \brief Abstract class for hankel transforms
  20. /// \details
  21. // ===================================================================
  22. class HankelTransform : public LemmaObject {
  23. public:
  24. /// Prints out basic info about the class
  25. friend std::ostream &operator<<(std::ostream &stream,
  26. const HankelTransform &ob);
  27. // ==================== LIFECYCLE =======================
  28. // ==================== OPERATORS =======================
  29. // ==================== OPERATIONS =======================
  30. /// @todo this is actually a deprecated function. Only Chave
  31. /// uses this.
  32. /// Performs numerical integration using Gaussian quadrature
  33. /// ikk: type of kernel depending on source and receiver couple
  34. /// imode: a switch for TE(0) and TM(1) mode
  35. /// itype: order of Bessel function
  36. /// rho is argument to integral
  37. /// wavef is the propogation constant of free space
  38. /// = omega * sqrt( EP*AMU ) amu = 4 pi e-7 ep = 8.85e-12
  39. /// @note compare performance of passing Kernel, instead consider
  40. /// passing by reference and using Kernel.get() instead.
  41. virtual Complex Zgauss(const int &ikk, const EMMODE &imode,
  42. const int &itype, const Real &rho,
  43. const Real &wavef, KernelEM1DBase* Kernel)=0;
  44. /// Computes related kernels, if applicable, otherwise this is
  45. /// just a dummy function.
  46. virtual void ComputeRelated(const Real& rho, std::shared_ptr<KernelEM1DBase> Kernel);
  47. virtual void ComputeRelated(const Real& rho, std::vector< std::shared_ptr<KernelEM1DBase> > KernelVec);
  48. virtual void ComputeRelated(const Real& rho, std::shared_ptr<KernelEM1DManager> KernelManager);
  49. // ==================== ACCESS =======================
  50. // ==================== INQUIRY =======================
  51. /** Returns the name of the underlying class, similiar to Python's type */
  52. virtual inline std::string GetName() const = 0 ;
  53. // ==================== DATA MEMBERS =======================
  54. protected:
  55. // ==================== LIFECYCLE =======================
  56. /// Default protected constructor.
  57. HankelTransform ( const ctor_key& );
  58. /// Default protected constructor.
  59. HankelTransform ( const YAML::Node& node, const ctor_key& );
  60. /// Default protected constructor.
  61. ~HankelTransform ( );
  62. private:
  63. /** ASCII string representation of the class name */
  64. static constexpr auto CName = "HankelTransform";
  65. }; // ----- end of class HankelTransform -----
  66. }
  67. #endif // __hankeltransform_h