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 4.0KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  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. /// @deprecated
  33. /// Performs numerical integration using Gaussian quadrature
  34. /// ikk: type of kernel depending on source and receiver couple
  35. /// imode: a switch for TE(0) and TM(1) mode
  36. /// itype: order of Bessel function
  37. /// rho is argument to integral
  38. /// wavef is the propogation constant of free space
  39. /// = omega * sqrt( EP*AMU ) amu = 4 pi e-7 ep = 8.85e-12
  40. /// @note compare performance of passing Kernel, instead consider
  41. /// passing by reference and using Kernel.get() instead.
  42. virtual Complex Zgauss(const int &ikk, const EMMODE &imode,
  43. const int &itype, const Real &rho,
  44. const Real &wavef, KernelEM1DBase* Kernel)=0;
  45. /// Computes related kernels, if applicable, otherwise this is
  46. /// just a dummy function.
  47. virtual void ComputeRelated(const Real& rho, std::shared_ptr<KernelEM1DBase> Kernel);
  48. virtual void ComputeRelated(const Real& rho, std::vector< std::shared_ptr<KernelEM1DBase> > KernelVec);
  49. virtual void ComputeRelated(const Real& rho, std::shared_ptr<KernelEM1DManager> KernelManager);
  50. // ==================== ACCESS =======================
  51. // ==================== INQUIRY =======================
  52. /** Returns the name of the underlying class, similiar to Python's type */
  53. virtual inline std::string GetName() const = 0 ;
  54. virtual Real GetABSER() { return 0; }
  55. virtual void ComputeLaggedRelated( const Real& rhomax, const int& nlag, std::shared_ptr<KernelEM1DManager> Manager ) {
  56. }
  57. virtual void SetLaggedArg( const Real& rho ) {}
  58. // ==================== DATA MEMBERS =======================
  59. protected:
  60. // ==================== LIFECYCLE =======================
  61. /// Default protected constructor.
  62. HankelTransform ( const ctor_key& );
  63. /// Default protected constructor.
  64. HankelTransform ( const YAML::Node& node, const ctor_key& );
  65. /// Default protected constructor.
  66. virtual ~HankelTransform ( );
  67. private:
  68. /** ASCII string representation of the class name */
  69. static constexpr auto CName = "HankelTransform";
  70. }; // ----- end of class HankelTransform -----
  71. }
  72. #endif // __hankeltransform_h