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.

DipoleSource.h 11KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336
  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/02/2009
  9. @version $Id: dipolesource.h 203 2015-01-09 21:19:04Z tirons $
  10. **/
  11. #ifndef __DIPOLESOURCE_H
  12. #define __DIPOLESOURCE_H
  13. #include "LemmaObject.h"
  14. #include "LayeredEarthEM.h"
  15. #include "receiverpoints.h"
  16. #include "emearth1d.h"
  17. #ifdef LEMMAUSEVTK
  18. #include "vtkActor.h"
  19. #include "vtkLineSource.h"
  20. #include "vtkSphereSource.h"
  21. #include "vtkPolyDataMapper.h"
  22. #include "vtkTubeFilter.h"
  23. #include "vtkRegularPolygonSource.h"
  24. #include "vtkProperty.h"
  25. #endif
  26. namespace Lemma {
  27. class KernelEM1DManager;
  28. class ReceiverPoints;
  29. class HankelTransform;
  30. // ==========================================================================
  31. // Class: DipoleSource
  32. /// \brief Dipole sources form the backbone of Lemma.
  33. /// \details More complex sources are constructed from a superposition of
  34. /// dipoles.
  35. // ==========================================================================
  36. class DipoleSource : public LemmaObject {
  37. public:
  38. // ==================== FRIENDS ======================
  39. friend std::ostream &operator<<(std::ostream &stream,
  40. const DipoleSource &ob);
  41. // ==================== LIFECYCLE ======================
  42. /**
  43. * Returns pointer to new DipoleSource. Location is
  44. * initialized to (0,0,0) type and polarization are
  45. * initialized to nonworking values that will throw
  46. * exceptions if used.
  47. */
  48. static DipoleSource* New();
  49. /** Returns a deep copy of the dipole. Used to make thread safe methods. Does not
  50. copy attachments.
  51. */
  52. DipoleSource* Clone();
  53. /**
  54. * @copybrief LemmaObject::Delete()
  55. * @copydetails LemmaObject::Delete()
  56. */
  57. void Delete();
  58. // ==================== OPERATORS ======================
  59. // ==================== OPERATIONS ======================
  60. /** Determines if kernels have been loaded already, and if so if they can be reused
  61. */
  62. void SetKernels(const int& ifreq, const FIELDCALCULATIONS& Fields, ReceiverPoints* Receivers, const int& irec,
  63. LayeredEarthEM* Earth );
  64. /** resets the kernels if they cannot be reused */
  65. virtual void ReSetKernels(const int& ifreq, const FIELDCALCULATIONS& Fields, ReceiverPoints* Receivers, const int& irec,
  66. LayeredEarthEM* Earth );
  67. /** Updates the receiver fields */
  68. virtual void UpdateFields(const int& ifreq, HankelTransform* Hankel, const Real& wavef);
  69. // ==================== ACCESS ======================
  70. /** Sets the position.
  71. * @param [in] posin
  72. */
  73. void SetLocation(const Vector3r &posin);
  74. /** Sets the location using three Real coordinate arguments.
  75. * @param[in] xp is the x coordinate of the dipole
  76. * @param[in] yp is the y coordinate of the dipole
  77. * @param[in] zp is the z coordinate of the dipole
  78. */
  79. void SetLocation(const Real &xp, const Real &yp, const Real &zp);
  80. /** Sets the dipole direction (polarisation). This method
  81. * replaced SetPolarisation(DipoleSourcePolarisation) and allows for general dipole
  82. * directionality.
  83. * @param[in] dir is the direction of the dipole. This will be normalised.
  84. */
  85. void SetPolarisation(const Vector3r &dir);
  86. /** Sets the polarisation of the dipole. Conveneince method that calls
  87. * SetPolarisation(const Vector3r &dir), constructing the normalized Vector | <x, y, z> |
  88. */
  89. void SetPolarisation(const Real& x, const Real& y, const Real& z );
  90. /// Sets the dipole polarisation
  91. /// @param[in] pol is the enumerated polarisation
  92. void SetPolarisation(const DipoleSourcePolarisation &pol);
  93. /// Sets the dipole source type
  94. /// @param[in] stype is one of the enerated values taking either
  95. /// ELECTRICDIPOLE or MAGNETICDIPOLE
  96. void SetType(const DipoleSourceType &stype);
  97. /// Sets the dipole moment
  98. void SetMoment(const Real &moment);
  99. /// Sets the dipole phse
  100. void SetPhase(const Real &phase);
  101. /// Sets the polarity
  102. void SetPolarity(const DipoleSourcePolarity& pol);
  103. /// Sets number of frequencies
  104. void SetNumberOfFrequencies(const int &nfreq);
  105. /// Sets a specific frequency.
  106. /// @param[in] ifreq is the frequency bin number
  107. /// @param[in] freq is the frequency to set, in Hz
  108. void SetFrequency(const int &ifreq, const Real &freq);
  109. /// Sets the frequencies of the dipole.
  110. /// @param[in] freqs is a vector of the frequencies. Also sets
  111. /// number of frequencies
  112. void SetFrequencies(const VectorXr& freqs);
  113. // ==================== INQUIRY ======================
  114. /** Accessor to polarisation vector.
  115. @return returns the unit polarisation vector.
  116. */
  117. Vector3r GetPolarisation();
  118. /// Returns Vector3r position of the dipole
  119. Vector3r GetLocation();
  120. /// Returns a specific coordinate of the dipole
  121. /// @param coordinate 0=x, 1=y, 2=z
  122. Real GetLocation(const int &coordinate);
  123. /// Returns enumerated of DipoleSourceType
  124. DipoleSourceType GetDipoleSourceType();
  125. /// Returns the dipole type
  126. DipoleSourceType GetType();
  127. /// Returns pointer to KernelEM1DManager
  128. KernelEM1DManager* GetKernelManager();
  129. // Returns enumerated DipoleSourcePolarization
  130. //DipoleSourcePolarisation GetDipoleSourcePolarisation();
  131. /// Returns the dipole moment
  132. Real GetMoment();
  133. /// Returns the angular frequency of the dipole
  134. Real GetAngularFrequency(const int &ifreq);
  135. /// Returns the frequency of the dipole (Hz)
  136. Real GetFrequency(const int &ifreq);
  137. /// Returns the frequency of the dipole (Hz)
  138. VectorXr GetFrequencies( );
  139. /// Returns the phase offset of the dipole
  140. Real GetPhase();
  141. /// Returns the number of frequencies
  142. int GetNumberOfFrequencies();
  143. #ifdef LEMMAUSEVTK
  144. /// Returns an actor that can be placed into a vtk scene easily
  145. /// Note that this function throws a pointer, it is the receivers
  146. /// job to manage this memory!
  147. vtkActor* GetVtkActor();
  148. #endif
  149. protected:
  150. // ==================== LIFECYCLE ======================
  151. /// Default protected constructor.
  152. DipoleSource (const std::string &name);
  153. /// Default protected constructor.
  154. ~DipoleSource ();
  155. /**
  156. * @copybrief LemmaObject::Release()
  157. * @copydetails LemmaObject::Release()
  158. */
  159. void Release();
  160. // ==================== DATA MEMBERS ======================
  161. /// Defines the type of source (magnetic or electric)
  162. DipoleSourceType Type;
  163. // Polarization of the dipole, (x, y or z)
  164. //DipoleSourcePolarisation Polarisation;
  165. // Dipole polarity
  166. //DipoleSourcePolarity Polarity;
  167. /// Which receiver index should Kernels be configured for
  168. int irec;
  169. int lays;
  170. int layr;
  171. /// Phase offset of the dipole, referenced from 0
  172. Real Phase;
  173. /// Dipole Moment
  174. Real Moment;
  175. Real xxp;
  176. Real yyp;
  177. Real rho;
  178. Real sp;
  179. Real cp;
  180. Real scp;
  181. Real sps;
  182. Real cps;
  183. Real c2p;
  184. Real kernelFreq;
  185. FIELDCALCULATIONS FieldsToCalculate;
  186. VectorXcr f;
  187. VectorXi ik;
  188. /// Central location of the dipole
  189. Vector3r Location;
  190. /// Unit vector defining directionality of the dipole
  191. Vector3r Phat;
  192. /// Freqencies of the source, in Hz
  193. VectorXr Freqs;
  194. /// Storage of the EM1D kernels used by this dipole
  195. KernelEM1DManager* KernelManager;
  196. /// Receiver points, keep track if these have changed
  197. ReceiverPoints* Receivers;
  198. /// Layered Earth used by Kernels
  199. LayeredEarthEM* Earth;
  200. }; // ----- end of class DipoleSource -----
  201. /** If no dipole source has been specified, throw this error.
  202. */
  203. class NullDipoleSource : public std::runtime_error {
  204. public:
  205. /** Thrown when a DipoleSource pointer is NULL
  206. */
  207. NullDipoleSource ( );
  208. };
  209. /** Error class for assignment of a dipole source that did not connect properly.
  210. */
  211. class NonValidDipoleTypeAssignment : public std::runtime_error {
  212. public:
  213. NonValidDipoleTypeAssignment( );
  214. };
  215. /** Error class for a non-valid dipole type. Generally thrown if this was not
  216. * set properly.
  217. */
  218. class NonValidDipoleType : public std::runtime_error {
  219. public:
  220. /** Throws error. This is a deprecated function. Call the method with
  221. * the pointer address instead.
  222. */
  223. NonValidDipoleType( );
  224. /** Throws error with information on the class throwing the error.
  225. */
  226. NonValidDipoleType( LemmaObject *ptr );
  227. };
  228. /** Error class for non valid dipole polarisation
  229. */
  230. class NonValidDipolePolarisation : public std::runtime_error {
  231. public:
  232. NonValidDipolePolarisation( );
  233. };
  234. /** Error class for non valid dipole polarity
  235. */
  236. class NonValidDipolePolarity : public std::runtime_error {
  237. public:
  238. NonValidDipolePolarity( );
  239. };
  240. /** Error class for non valid dipole polarisation
  241. */
  242. class NonValidDipolePolarisationAssignment : public std::runtime_error {
  243. public:
  244. NonValidDipolePolarisationAssignment( );
  245. };
  246. /** Error class for non valid location coordinate.
  247. */
  248. class NonValidLocationCoordinate : public std::runtime_error {
  249. public:
  250. NonValidLocationCoordinate( );
  251. };
  252. }
  253. #endif // __DIPOLESOURCE_H