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.

WireAntenna.h 6.9KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239
  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. /**
  54. * Constructs an object from a string representation of a YAML::Node. This is primarily
  55. * used in Python wrapping
  56. */
  57. static std::shared_ptr<WireAntenna> DeSerialize( const std::string& node ) {
  58. return WireAntenna::DeSerialize(YAML::Load(node));
  59. }
  60. // ==================== OPERATORS =======================
  61. // ==================== OPERATIONS =======================
  62. /**
  63. * Approximates with evenly spaced electric dipoles around loop
  64. * @param[in] delta is the spacing between moments
  65. */
  66. virtual void ApproximateWithElectricDipoles(const Real &delta);
  67. // ==================== ACCESS =======================
  68. /**
  69. * Sets the number of turns in the loop, default is 1
  70. * @param[in] nturns is the number of turns of the loop.
  71. */
  72. void SetNumberOfTurns(const int &nturns);
  73. /**
  74. * Sets the number of points in the loop
  75. */
  76. void SetNumberOfPoints(const int &np);
  77. /**
  78. * Sets a corner point of the loop. Counting starts at 0. It
  79. * is not required to have the loop be closed right now, but
  80. * its a good idea.
  81. */
  82. void SetPoint(const int &p, const Vector3r &pos);
  83. /**
  84. * Sets a corner point of the loop. Counting starts at 0. It
  85. * is not required to have the loop be closed right now, but
  86. * its a good idea.
  87. */
  88. void SetPoint(const int &p, const Real&x, const Real& y, const Real& z);
  89. /** Sets the frequency of the current in the loop, default is 0
  90. * @param[in] ifreq is the frequency number to set
  91. * @param[in] freq is the frequency (Hz) of the current
  92. */
  93. void SetFrequency(const int& ifreq, const Real &freq);
  94. /**
  95. * Sets the number of frequencies.
  96. * @param[in] nfreq is the number of frequencies that will be
  97. * computed.
  98. */
  99. void SetNumberOfFrequencies(const int& nfreq);
  100. /**
  101. * Sets the current in the loop, default is 0
  102. * @param[in] amp is the current in the loop, in Amperes
  103. */
  104. void SetCurrent(const Real &amp);
  105. // ==================== INQUIRY =======================
  106. /**
  107. * Returns the number of turns
  108. * @return the number of turns of the loop.
  109. */
  110. int GetNumberOfTurns( );
  111. /**
  112. * Returns all of the points
  113. */
  114. Vector3Xr GetPoints();
  115. /**
  116. * Returns all of the points in a general matrix, useful for python wrapper
  117. */
  118. MatrixXr GetPointsMat();
  119. /**
  120. * Returns the frequency in the loop.
  121. * @return is the frequency in the loop in Hz
  122. */
  123. Real GetFrequency(const int& ifreq);
  124. /**
  125. * Returns the current in the loop.
  126. * @return is the Current
  127. */
  128. Real GetCurrent( );
  129. /**
  130. * Returns pointer to a dipole source
  131. */
  132. std::shared_ptr<DipoleSource> GetDipoleSource(const int &dip);
  133. /**
  134. * returns number of dipoles used to approximate this
  135. * loop
  136. */
  137. size_t GetNumberOfDipoles();
  138. /**
  139. * @return the number of frequencies of this wire loop.
  140. */
  141. int GetNumberOfFrequencies();
  142. #ifdef LEMMAUSEVTK
  143. /** Returns an actor that can be placed into a vtk scene easily
  144. * Note that this function throws a pointer, it is the
  145. * receivers job to manage this memory!
  146. */
  147. vtkActor* GetVtkActor(const int &idip);
  148. #endif
  149. /** Returns true or false if loop is horizontally planar
  150. */
  151. bool IsHorizontallyPlanar();
  152. /** Returns the name of the underlying class, similiar to Python's type */
  153. virtual std::string GetName() const;
  154. protected:
  155. // ==================== DATA MEMBERS =======================
  156. /**
  157. * Number of points that define the loop
  158. */
  159. int NumberOfPoints;
  160. /**
  161. * Current in antennae (Amps)
  162. */
  163. Real Current;
  164. /**
  165. * Number of turns
  166. */
  167. int NumberOfTurns;
  168. /**
  169. * List of the dipoles
  170. */
  171. std::vector< std::shared_ptr<DipoleSource> > Dipoles;
  172. /**
  173. * Points that define this loop
  174. */
  175. Vector3Xr Points;
  176. /**
  177. * Frequencies of the loop.
  178. */
  179. VectorXr Freqs;
  180. private:
  181. static constexpr auto CName = "WireAntenna";
  182. }; // ----- end of class WireAntenna -----
  183. }
  184. #endif // __WIREANTENNA_H