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.

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231
  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 12/16/2009
  9. @version $Id: WireAntenna.h 201 2015-01-03 00:07:47Z tirons $
  10. **/
  11. #ifndef __WIREANTENNA_H
  12. #define __WIREANTENNA_H
  13. #include "DipoleSource.h"
  14. #ifdef LEMMAUSEVTK
  15. #include "vtkActor.h"
  16. #endif
  17. namespace Lemma {
  18. // ===================================================================
  19. /**
  20. * \ingroup FDEM1D
  21. * \brief Class representing a wire antennae.
  22. * \details This is an abstract class.
  23. */
  24. // ===================================================================
  25. class WireAntenna : public LemmaObject {
  26. friend std::ostream &operator<<(std::ostream &stream, const WireAntenna &ob);
  27. public:
  28. // ==================== LIFECYCLE =======================
  29. /** Locked default constructor */
  30. explicit WireAntenna ( const ctor_key& );
  31. /** Locked deserializing constructor */
  32. WireAntenna ( const YAML::Node& node, const ctor_key& );
  33. /** Destructor */
  34. virtual ~WireAntenna();
  35. /**
  36. * Initialises antenna to contain no points, with no current
  37. * and no frequency. NumberOfTurns set to 1
  38. */
  39. static std::shared_ptr<WireAntenna> NewSP();
  40. /**
  41. * Provides deep copy
  42. */
  43. virtual std::shared_ptr<WireAntenna> Clone() 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<WireAntenna> DeSerialize( const YAML::Node& node );
  53. // ==================== OPERATORS =======================
  54. // ==================== OPERATIONS =======================
  55. /**
  56. * Approximates with evenly spaced electric dipoles around loop
  57. * @param[in] delta is the spacing between moments
  58. */
  59. virtual void ApproximateWithElectricDipoles(const Real &delta);
  60. // ==================== ACCESS =======================
  61. /**
  62. * Sets the number of turns in the loop, default is 1
  63. * @param[in] nturns is the number of turns of the loop.
  64. */
  65. void SetNumberOfTurns(const int &nturns);
  66. /**
  67. * Sets the number of points in the loop
  68. */
  69. void SetNumberOfPoints(const int &np);
  70. /**
  71. * Sets a corner point of the loop. Counting starts at 0. It
  72. * is not required to have the loop be closed right now, but
  73. * its a good idea.
  74. */
  75. void SetPoint(const int &p, const Vector3r &pos);
  76. /**
  77. * Sets a corner point of the loop. Counting starts at 0. It
  78. * is not required to have the loop be closed right now, but
  79. * its a good idea.
  80. */
  81. void SetPoint(const int &p, const Real&x, const Real& y, const Real& z);
  82. /** Sets the frequency of the current in the loop, default is 0
  83. * @param[in] ifreq is the frequency number to set
  84. * @param[in] freq is the frequency (Hz) of the current
  85. */
  86. void SetFrequency(const int& ifreq, const Real &freq);
  87. /**
  88. * Sets the number of frequencies.
  89. * @param[in] nfreq is the number of frequencies that will be
  90. * computed.
  91. */
  92. void SetNumberOfFrequencies(const int& nfreq);
  93. /**
  94. * Sets the current in the loop, default is 0
  95. * @param[in] amp is the current in the loop, in Amperes
  96. */
  97. void SetCurrent(const Real &amp);
  98. // ==================== INQUIRY =======================
  99. /**
  100. * Returns the number of turns
  101. * @return the number of turns of the loop.
  102. */
  103. int GetNumberOfTurns( );
  104. /**
  105. * Returns all of the points
  106. */
  107. Vector3Xr GetPoints();
  108. /**
  109. * Returns all of the points in a general matrix, useful for python wrapper
  110. */
  111. MatrixXr GetPointsMat();
  112. /**
  113. * Returns the frequency in the loop.
  114. * @return is the frequency in the loop in Hz
  115. */
  116. Real GetFrequency(const int& ifreq);
  117. /**
  118. * Returns the current in the loop.
  119. * @return is the Current
  120. */
  121. Real GetCurrent( );
  122. /**
  123. * Returns pointer to a dipole source
  124. */
  125. std::shared_ptr<DipoleSource> GetDipoleSource(const int &dip);
  126. /**
  127. * returns number of dipoles used to approximate this
  128. * loop
  129. */
  130. size_t GetNumberOfDipoles();
  131. /**
  132. * @return the number of frequencies of this wire loop.
  133. */
  134. int GetNumberOfFrequencies();
  135. #ifdef LEMMAUSEVTK
  136. /** Returns an actor that can be placed into a vtk scene easily
  137. * Note that this function throws a pointer, it is the
  138. * receivers job to manage this memory!
  139. */
  140. vtkActor* GetVtkActor(const int &idip);
  141. #endif
  142. /** Returns true or false if loop is horizontally planar
  143. */
  144. bool IsHorizontallyPlanar();
  145. /** Returns the name of the underlying class, similiar to Python's type */
  146. virtual std::string GetName() const;
  147. protected:
  148. // ==================== DATA MEMBERS =======================
  149. /**
  150. * Number of points that define the loop
  151. */
  152. int NumberOfPoints;
  153. /**
  154. * Current in antennae (Amps)
  155. */
  156. Real Current;
  157. /**
  158. * Number of turns
  159. */
  160. int NumberOfTurns;
  161. /**
  162. * List of the dipoles
  163. */
  164. std::vector< std::shared_ptr<DipoleSource> > Dipoles;
  165. /**
  166. * Points that define this loop
  167. */
  168. Vector3Xr Points;
  169. /**
  170. * Frequencies of the loop.
  171. */
  172. VectorXr Freqs;
  173. private:
  174. static constexpr auto CName = "WireAntenna";
  175. }; // ----- end of class WireAntenna -----
  176. }
  177. #endif // __WIREANTENNA_H