Lemma is an Electromagnetics API
Vous ne pouvez pas sélectionner plus de 25 sujets Les noms de sujets doivent commencer par une lettre ou un nombre, peuvent contenir des tirets ('-') et peuvent comporter jusqu'à 35 caractères.

PolygonalWireAntenna.h 5.9KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160
  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 05/18/2010
  9. @version $Id: PolygonalWireAntenna.h 211 2015-02-27 05:43:26Z tirons $
  10. **/
  11. #ifndef POLYGONALWIREANTENNA_INC
  12. #define POLYGONALWIREANTENNA_INC
  13. #include "DipoleSource.h"
  14. #include "WireAntenna.h"
  15. namespace Lemma {
  16. // ===================================================================
  17. // Class: PolygonalWireAntenna
  18. /// \ingroup FDEM1D
  19. /// \brief Class representing polygonal wire antennae.
  20. /// \details For EM calculations, dipoles representing this loop are
  21. /// created dynamically, depending on receiver location.
  22. /// @todo enforce minimum dipole moment.
  23. // ===================================================================
  24. class PolygonalWireAntenna : public WireAntenna {
  25. friend std::ostream &operator<<(std::ostream &stream, const PolygonalWireAntenna &ob);
  26. public:
  27. // ==================== LIFECYCLE =======================
  28. /// Default protected constructor.
  29. explicit PolygonalWireAntenna ( const ctor_key& );
  30. /// Default protected constructor.
  31. PolygonalWireAntenna (const YAML::Node& node, const ctor_key& );
  32. /// Default protected constructor.
  33. virtual ~PolygonalWireAntenna ();
  34. /**
  35. * Declares all memory and returns a new instance.
  36. */
  37. static std::shared_ptr<PolygonalWireAntenna> NewSP();
  38. /// Makes a deep copy of this antenna with all connections except
  39. /// the dipole approximation.
  40. virtual std::shared_ptr<WireAntenna> Clone() const ;
  41. /// Makes a deep copy of this antenna with all connections except
  42. /// the dipole approximation.
  43. virtual std::shared_ptr<PolygonalWireAntenna> ClonePA() const ;
  44. /**
  45. * Uses YAML to serialize this object.
  46. * @return a YAML::Node
  47. */
  48. YAML::Node Serialize() const;
  49. /**
  50. * Constructs an object from a YAML::Node.
  51. */
  52. static std::shared_ptr<PolygonalWireAntenna> DeSerialize(const YAML::Node& node);
  53. // ==================== OPERATORS =======================
  54. // ==================== OPERATIONS =======================
  55. /// Approximates with ungrounded electrical dipoles, such that
  56. /// minDipoleRatio is satisfied.
  57. virtual void ApproximateWithElectricDipoles(const Vector3r &rp);
  58. /** Sets the minimum ratio for dipole moments to be used to
  59. * approximate the loop. A smaller ratio yields a more accurate
  60. * result, but is more expensive. Default is (1/5).
  61. */
  62. void SetMinDipoleRatio(const Real& ratio);
  63. /** Sets the minimum moment for dipole moments to be used to
  64. * approximate the loop.
  65. */
  66. void SetMinDipoleMoment(const Real& m);
  67. /** Sets the minimum moment for dipole moments to be used to
  68. * approximate the loop.
  69. */
  70. void SetMaxDipoleMoment(const Real& m);
  71. // ==================== ACCESS =======================
  72. // ==================== INQUIRY =======================
  73. /** Returns the name of the underlying class, similiar to Python's type */
  74. virtual std::string GetName() const ;
  75. protected:
  76. // ==================== DATA MEMBERS =======================
  77. /// minimum ratio of dipole moment to distance to receiver point
  78. Real minDipoleRatio;
  79. /// Maximum dipole moment allowed
  80. Real minDipoleMoment;
  81. /// Maximum dipole moment allowed
  82. Real maxDipoleMoment;
  83. /// appends
  84. void PushXYZDipoles( const Vector3r &step, const Vector3r &cp,
  85. const Vector3r &dir,
  86. std::vector< std::shared_ptr<DipoleSource> > &Dipoles) ;
  87. /// corrects for overstep
  88. void CorrectOverstepXYZDipoles( const Vector3r &step,
  89. const Vector3r &cp,
  90. const Vector3r &dir,
  91. std::vector< std::shared_ptr<DipoleSource> > &Dipoles );
  92. // ==================== OPERATIONS =======================
  93. /// Returns the nearest point on a line segment to another point.
  94. /// if the point is not on the line-segment, return the
  95. /// nearest end-point
  96. /// @param[in] p0, p1 define the line segement
  97. /// @param[in] rp is a point in space. The function returns the
  98. /// closest point on the line to this point.
  99. /// @return The point (Lemma::Vector3r) on the line defined by p0,
  100. /// and p1, closest to rp
  101. Vector3r ClosestPointOnLine(const Vector3r &p0, const Vector3r &p1,
  102. const Vector3r &rp);
  103. /// Interpolates dipoles along line segment defined by p0 and p1.
  104. void InterpolateLineSegment(const Vector3r &p0, const Vector3r &p1,
  105. const Vector3r &rp);
  106. /// List of the dipoles
  107. //std::vector<DipoleSource*> Dipoles;
  108. /// Points that define this loop
  109. //Vector3Xr Points;
  110. private:
  111. Vector3r rRepeat;
  112. static constexpr auto CName = "PolygonalWireAntenna";
  113. }; // ----- end of class PolygonalWireAntenna -----
  114. } // ----- end of Lemma name -----
  115. #endif // ----- #ifndef POLYGONALWIREANTENNA_INC -----