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.

LayeredEarthEM.h 11KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318
  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 06/24/2009
  9. @version 0.0
  10. **/
  11. #ifndef __LAYEREDEARTHEM_H
  12. #define __LAYEREDEARTHEM_H
  13. #include "LayeredEarth.h"
  14. namespace Lemma {
  15. // =======================================================================
  16. // Class: LayeredEarthEM
  17. /// \ingroup FDEM1D
  18. /// \brief 1D layered earth. Attributes include all aspects of
  19. /// Cole-Cole model.
  20. /// \details Primarily used for EM calculations.
  21. /** @todo Layer 0 can be set right now, but all logic ignores and assumes
  22. air layer. This is surprising to users and constitutes a bug.
  23. */
  24. // =======================================================================
  25. class LayeredEarthEM : public LayeredEarth {
  26. // ==================== FRIENDS ===========================
  27. /** Recursively streams information about this class */
  28. friend std::ostream &operator<<(std::ostream &stream, const LayeredEarthEM &ob);
  29. public:
  30. // ==================== LIFECYCLE ===========================
  31. /** Default locked constructor. */
  32. explicit LayeredEarthEM ( const ctor_key& );
  33. /** Locked deserializing constructor. */
  34. LayeredEarthEM ( const YAML::Node& node, const ctor_key& );
  35. /** Default destructor */
  36. virtual ~LayeredEarthEM ();
  37. /**
  38. * Factory method for generating concrete class.
  39. * @return a std::shared_ptr of type LayeredEarthEM
  40. */
  41. static std::shared_ptr<LayeredEarthEM> NewSP();
  42. /** YAML Serializing method
  43. */
  44. YAML::Node Serialize() const;
  45. /**
  46. * Constructs an object from a YAML::Node.
  47. */
  48. static std::shared_ptr< LayeredEarthEM > DeSerialize(const YAML::Node& node);
  49. /**
  50. * Constructs an object from a string representation of a YAML::Node. This is primarily
  51. * used in Python wrapping
  52. */
  53. static std::shared_ptr< LayeredEarthEM > DeSerialize( const std::string& node ) {
  54. return LayeredEarthEM::DeSerialize(YAML::Load(node));
  55. }
  56. /** @return a deep copy
  57. */
  58. std::shared_ptr<LayeredEarthEM> Clone();
  59. // ==================== OPERATORS ===========================
  60. // ==================== OPERATIONS ===========================
  61. /** Evaluates the cole-cole model for suceptability and
  62. * permeability.
  63. * @param[in] omega is the frequency in Hz
  64. */
  65. void EvaluateColeColeModel(const Real& omega);
  66. // ==================== ACCESS ===========================
  67. /** Sets the number of layers and resizes all model parameters to
  68. * be the correct size, finally initialises all values to free
  69. * space.
  70. * @param[in] nlay is the number of layers
  71. */
  72. virtual void SetNumberOfLayers(const int& nlay);
  73. /** Sets Complex Conductivity of the layers
  74. * @param[in] sigma is a vector of the conducivity of the layers
  75. */
  76. void SetLayerConductivity(const VectorXcr &sigma);
  77. /** Sets Complex Conductivity of a single layer
  78. * @param[in] sigma is the conducivity of the layer
  79. * @param[in] ilay is the layer index
  80. */
  81. void SetLayerConductivity(const int& ilay, const Complex& sigma);
  82. /* Sets Complex resitivity of the layers
  83. * @param[in] ohm is a vector of the resistivity of the layers
  84. Singularity at 0 resistivity in air. Need to reformaulat things a bit
  85. */
  86. //void SetLayerResistivity(const VectorXcr &ohm);
  87. /** Sets the thickness of the layers
  88. * @param[in] thick is a vector of the thicknesses of the layers.
  89. * Must be two less than the total number of Layers as the top and
  90. * bottom layers are assumed infinite.
  91. */
  92. void SetLayerThickness(const VectorXr &thick);
  93. /** Sets the High frequency susceptibility
  94. */
  95. void SetLayerHighFreqSusceptibility(const VectorXr& sushi);
  96. /** Sets the Low frequency susceptibility
  97. */
  98. void SetLayerLowFreqSusceptibility(const VectorXr& sushi);
  99. /** Sets the Layer breath susceptibility
  100. */
  101. void SetLayerBreathSusceptibility(const VectorXr& susbr);
  102. /** Sets the Layer tau susceptibility
  103. */
  104. void SetLayerTauSusceptibility(const VectorXr& susta);
  105. /** Sets the High frequency permitivity
  106. */
  107. void SetLayerHighFreqPermitivity(const VectorXr& sushi);
  108. /** Sets the Low frequency permitivity
  109. */
  110. void SetLayerLowFreqPermitivity(const VectorXr& sushi);
  111. /** Sets the Layer breath permitivity
  112. */
  113. void SetLayerBreathPermitivity(const VectorXr& oerbr);
  114. /** Sets the Layer breath permitivity
  115. */
  116. void SetLayerTauPermitivity(const VectorXr& oerbr);
  117. // ==================== INQUIRY ===========================
  118. /** Returns the thickness of a layer
  119. @return a VectorXcr of the layer conductivities.
  120. */
  121. VectorXcr GetLayerConductivity( );
  122. /** Returns the conductivity of a layer
  123. * @param[in] ilay is the layer indice of interest
  124. * @return the complex valued conductivity of the layer of
  125. * interest.
  126. */
  127. Complex GetLayerConductivity(const int &ilay);
  128. /** Returns the susceptibility of a layer
  129. * @param[in] ilay is the layer indice of interest.
  130. * @return a Complex value of the electrical susceptibility of the
  131. * probes layer.
  132. */
  133. Complex GetLayerSusceptibility(const int &ilay);
  134. /** Returns the Susceptibility of Cole-Cole model
  135. * @return a VectorXcr of the suceptibilities of the model.
  136. */
  137. VectorXcr GetLayerSusceptibility( );
  138. /** Returns the low freq susceptibility of a layer
  139. */
  140. Real GetLayerLowFreqSusceptibility(const int &ilay);
  141. /** Returns the low freq susceptibility of a layer
  142. */
  143. VectorXr GetLayerLowFreqSusceptibility( );
  144. /** Returns the low freq susceptibility of a layer
  145. */
  146. Real GetLayerHighFreqSusceptibility(const int &ilay);
  147. /** Returns the low freq susceptibility of a layer
  148. */
  149. VectorXr GetLayerHighFreqSusceptibility( );
  150. /** Returns the low freq susceptibility of a layer
  151. */
  152. Real GetLayerTauSusceptibility(const int &ilay);
  153. /** Returns the low freq susceptibility of a layer
  154. */
  155. VectorXr GetLayerTauSusceptibility( );
  156. /** Returns the low freq susceptibility of a layer
  157. */
  158. Real GetLayerBreathSusceptibility(const int &ilay);
  159. /** Returns the low freq susceptibility of a layer
  160. */
  161. VectorXr GetLayerBreathSusceptibility( );
  162. /** Returns the Relative Permitivity of the cole cole model
  163. */
  164. VectorXcr GetLayerPermitivity( );
  165. /** Returns the conductivity of a layer
  166. * @param[in] ilay is the layer indice of interest.
  167. * @return a Complex value of the electrical permitivity of the
  168. * probed layer.
  169. */
  170. Complex GetLayerPermitivity(const int &ilay);
  171. /** Low Freq permivitity
  172. */
  173. VectorXr GetLayerLowFreqPermitivity( );
  174. /** Returns the low freq susceptibility of a layer
  175. */
  176. Real GetLayerLowFreqPermitivity(const int &ilay);
  177. /** Returns the low freq susceptibility of a layer
  178. */
  179. Real GetLayerHighFreqPermitivity(const int &ilay);
  180. /** Returns the low freq susceptibility of a layer
  181. */
  182. VectorXr GetLayerHighFreqPermitivity( );
  183. /** Returns the low freq susceptibility of a layer
  184. */
  185. Real GetLayerTauPermitivity(const int &ilay);
  186. /** Returns the low freq susceptibility of a layer
  187. */
  188. VectorXr GetLayerTauPermitivity( );
  189. /** Returns the low freq susceptibility of a layer
  190. */
  191. Real GetLayerBreathPermitivity(const int &ilay);
  192. /** Returns the low freq susceptibility of a layer
  193. */
  194. VectorXr GetLayerBreathPermitivity( );
  195. /** Returns the name of the underlying class, similiar to Python's type */
  196. virtual std::string GetName() const ;
  197. protected:
  198. private:
  199. // ==================== DATA MEMBERS ===========================
  200. /** Vector of layer Conductivity */
  201. VectorXcr LayerConductivity;
  202. /** Vector of layer Susceptibility (chi)
  203. * This is calculated using the Cole-Cole model
  204. * \f[ sus(i) = sush(i)
  205. * + \frac{(susl(i)-sush(i))} {(1+(jw * sustau(i))^{susalp(i)})} \f]
  206. */
  207. VectorXcr LayerSusceptibility;
  208. /** Vector of low frequency susceptibility, for use in Cole-Cole
  209. model */
  210. VectorXr LayerLowFreqSusceptibility;
  211. /** Vector of high frequency susceptibility, for use in Cole-Cole
  212. model */
  213. VectorXr LayerHighFreqSusceptibility;
  214. /** Vector of relaxation time constants, for use in Cole-Cole model
  215. */
  216. VectorXr LayerTauSusceptibility;
  217. /** Vector relaxation breath, for use in Cole-Cole model
  218. */
  219. VectorXr LayerBreathSusceptibility;
  220. /** Vector of Layer Permitivity (epsilon)
  221. * Calculated using the Cole-Cole model
  222. * \f[ epr(i) = eprh(i)
  223. * + \frac{ (eprl(i)-eprh(i))} { (1+(jw*eprtau(i))^{epralp(i)})} \f]
  224. */
  225. VectorXcr LayerPermitivity;
  226. /** Low frequency permitivity for each layer */
  227. VectorXr LayerLowFreqPermitivity;
  228. /** High frequency permitivity for each layer */
  229. VectorXr LayerHighFreqPermitivity;
  230. /** Decay time constant for each layer */
  231. VectorXr LayerTauPermitivity;
  232. /** Relaxation breath for each layer */
  233. VectorXr LayerBreathPermitivity;
  234. /** ASCII string representation of the class name */
  235. static constexpr auto CName = "LayeredEarthEM";
  236. }; // ----- end of class LayeredEarthEM -----
  237. } // namespace Lemma
  238. #endif // __LAYEREDEARTHEM_H
  239. /* vim: set tabstop=4 expandtab: */
  240. /* vim: set filetype=cpp: */