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.cpp 97KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651
  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. **/
  10. #include "DipoleSource.h"
  11. #include "KernelEM1DManager.h"
  12. //#include "GroundedElectricDipole.h"
  13. //#include "UngroundedElectricDipole.h"
  14. //#include "MagneticDipole.h"
  15. #include "FieldPoints.h"
  16. #include "HankelTransform.h"
  17. namespace Lemma {
  18. // ==================== FRIENDS ======================
  19. std::ostream &operator<<(std::ostream &stream, const DipoleSource &ob) {
  20. stream << ob.Serialize() << "\n";
  21. return stream;
  22. }
  23. /*
  24. bool DipoleSource::operator == (DipoleSource& rhs) const {
  25. if (Location != rhs.Location) return false;
  26. return true;
  27. }
  28. */
  29. // ==================== LIFECYCLE ======================
  30. DipoleSource::DipoleSource( const ctor_key& key ) : LemmaObject( key ),
  31. Type(NOSOURCETYPE),
  32. irec(-1),
  33. Phase(0),
  34. Moment(1),
  35. KernelManager(nullptr),
  36. Receivers(nullptr),
  37. Earth(nullptr)
  38. {
  39. this->Location.setZero();
  40. this->Phat.setZero();
  41. }
  42. DipoleSource::DipoleSource( const YAML::Node& node, const ctor_key& key ) : LemmaObject( node, key ),
  43. Type(NOSOURCETYPE),
  44. irec(-1),
  45. Phase(0),
  46. Moment(1),
  47. KernelManager(nullptr),
  48. Receivers(nullptr),
  49. Earth(nullptr)
  50. {
  51. Type = string2Enum<DIPOLESOURCETYPE>(node["Type"].as<std::string>());
  52. this->Location = node["Location"].as<Vector3r>();
  53. this->Phat.setZero();
  54. }
  55. DipoleSource::~DipoleSource() {
  56. }
  57. std::shared_ptr<DipoleSource> DipoleSource::NewSP() {
  58. return std::make_shared<DipoleSource> ( ctor_key() );
  59. }
  60. YAML::Node DipoleSource::Serialize() const {
  61. YAML::Node node = LemmaObject::Serialize();
  62. node.SetTag( GetName() );
  63. node["Type"] = enum2String(Type);
  64. node["Location"] = Location;
  65. node["Phat"] = Phat;
  66. node["Freqs"] = Freqs;
  67. node["Phase"] = Phase;
  68. node["Moment"] = Moment;
  69. return node;
  70. }
  71. std::shared_ptr< DipoleSource > DipoleSource::DeSerialize(const YAML::Node& node) {
  72. if (node.Tag() != "DipoleSource") {
  73. throw DeSerializeTypeMismatch( "DipoleSource", node.Tag());
  74. }
  75. return std::make_shared<DipoleSource> ( node, ctor_key() );
  76. }
  77. std::shared_ptr<DipoleSource> DipoleSource::Clone() {
  78. auto Obj = DipoleSource::NewSP();
  79. // copy
  80. Obj->Type = Type;
  81. Obj->irec = irec;
  82. Obj->lays = lays;
  83. Obj->layr = layr;
  84. Obj->Phase = Phase;
  85. Obj->Moment = Moment;
  86. Obj->xxp = xxp;
  87. Obj->yyp = yyp;
  88. Obj->rho = rho;
  89. Obj->sp = sp;
  90. Obj->cp = cp;
  91. Obj->scp = scp;
  92. Obj->sps = sps;
  93. Obj->cps = cps;
  94. Obj->c2p = c2p;
  95. Obj->FieldsToCalculate = FieldsToCalculate;
  96. Obj->f = f;
  97. Obj->ik = ik;
  98. Obj->Location = Location;
  99. Obj->Phat = Phat;
  100. Obj->Freqs = Freqs;
  101. return Obj;
  102. }
  103. //--------------------------------------------------------------------------------------
  104. // Class: DipoleSource
  105. // Method: GetName
  106. // Description: Class identifier
  107. //--------------------------------------------------------------------------------------
  108. inline std::string DipoleSource::GetName ( ) const {
  109. return CName;
  110. } // ----- end of method DipoleSource::GetName -----
  111. // ==================== ACCESS ======================
  112. void DipoleSource::SetLocation(const Vector3r &posin) {
  113. this->Location = posin;
  114. }
  115. void DipoleSource::SetLocation(const Real &xp, const Real &yp,
  116. const Real &zp) {
  117. this->Location = Vector3r(xp, yp, zp);
  118. }
  119. void DipoleSource::SetPhase(const Real &phase) {
  120. this->Phase = phase;
  121. }
  122. void DipoleSource::SetPolarity(const DipoleSourcePolarity &pol) {
  123. static bool called = false;
  124. if (!called) {
  125. std::cerr << "\n\n=================================================================\n"
  126. << "WARNING: Use of deprecated method DipoleSource::SetPolarity(pol)\n"
  127. << "Use more general SetPolarisation( Vector3r ) or SetPolarisation( x, y, z );\n"
  128. << "This method will be removed in future versions of Lemma"
  129. << "\n=================================================================\n";
  130. called = true;
  131. }
  132. // Polarity = pol;
  133. // switch (Polarity) {
  134. // case POSITIVE:
  135. // Moment = std::abs(Moment);
  136. // break;
  137. // case NEGATIVE:
  138. // Moment = -std::abs(Moment);
  139. // break;
  140. // default:
  141. // throw NonValidDipolePolarity();
  142. // };
  143. }
  144. void DipoleSource::SetType(const DIPOLESOURCETYPE & stype) {
  145. switch (stype) {
  146. case (GROUNDEDELECTRICDIPOLE):
  147. this->Type = stype;
  148. break;
  149. case (UNGROUNDEDELECTRICDIPOLE):
  150. this->Type = stype;
  151. break;
  152. case (GROUNDINGPOINT):
  153. this->Type = stype;
  154. break;
  155. case (MAGNETICDIPOLE):
  156. this->Type = stype;
  157. break;
  158. default:
  159. throw NonValidDipoleTypeAssignment();
  160. }
  161. }
  162. void DipoleSource::SetPolarisation(const Vector3r& pol) {
  163. this->Phat = pol / pol.norm();
  164. }
  165. void DipoleSource::SetPolarisation(const Real& x, const Real& y, const Real& z) {
  166. Vector3r pol = (VectorXr(3) << x, y, z).finished();
  167. this->Phat = pol / pol.norm();
  168. }
  169. Vector3r DipoleSource::GetPolarisation() {
  170. return Phat;
  171. }
  172. DIPOLESOURCETYPE DipoleSource::GetType() {
  173. return Type;
  174. }
  175. void DipoleSource::SetPolarisation(const
  176. DipoleSourcePolarisation &pol) {
  177. static bool called = false;
  178. if (!called) {
  179. std::cout << "\n\n========================================================================================\n"
  180. << "WARNING: Use of deprecated method DipoleSource::SetPolarisation(DipleSourcePolarisation)\n"
  181. << "Use more general SetPolarisation( Vector3r ) or SetPolarisation( x, y, z );\n"
  182. << "This method will be removed in future versions of Lemma"
  183. << "\n========================================================================================\n";
  184. called = true;
  185. }
  186. switch (pol) {
  187. case (XPOLARISATION):
  188. this->Phat = (VectorXr(3) << 1, 0, 0).finished();
  189. break;
  190. case (YPOLARISATION):
  191. this->Phat = (VectorXr(3) << 0, 1, 0).finished();
  192. break;
  193. case (ZPOLARISATION):
  194. this->Phat = (VectorXr(3) << 0, 0, 1).finished();
  195. break;
  196. default:
  197. throw NonValidDipolePolarisationAssignment();
  198. }
  199. }
  200. void DipoleSource::SetMoment(const Real &moment) {
  201. this->Moment = moment;
  202. }
  203. // ==================== OPERATIONS =====================
  204. void DipoleSource::SetKernels(const int& ifreq, const FIELDCALCULATIONS& Fields , std::shared_ptr<FieldPoints> ReceiversIn, const int& irecin,
  205. std::shared_ptr<LayeredEarthEM> EarthIn ) {
  206. if (Receivers != ReceiversIn) {
  207. Receivers = ReceiversIn;
  208. }
  209. if (Earth != EarthIn) {
  210. Earth = EarthIn;
  211. }
  212. if (irecin != irec) {
  213. irec = irecin;
  214. }
  215. if (FieldsToCalculate != Fields) {
  216. FieldsToCalculate = Fields;
  217. }
  218. xxp = Receivers->GetLocation(irec)[0] - Location[0];
  219. yyp = Receivers->GetLocation(irec)[1] - Location[1];
  220. rho = (Receivers->GetLocation(irec).head<2>() - Location.head<2>()).norm();
  221. sp = yyp/rho;
  222. cp = xxp/rho;
  223. scp = sp*cp;
  224. sps = sp*sp;
  225. cps = cp*cp;
  226. c2p = cps-sps;
  227. f = VectorXcr::Zero(13);
  228. ik = VectorXi::Zero(13);
  229. lays = Earth->GetLayerAtThisDepth(Location[2]);
  230. layr = Earth->GetLayerAtThisDepth(Receivers->GetLocation(irec)[2]);
  231. // TODO, avoid smart pointer here maybe?
  232. KernelManager = KernelEM1DManager::NewSP();
  233. KernelManager->SetEarth(Earth);
  234. // alternative is to use weak_ptr here, this is deep and internal, and we are safe.
  235. //KernelManager->SetDipoleSource( shared_from_this().get() , ifreq, Receivers->GetLocation(irec)[2]);
  236. KernelManager->SetDipoleSource( this, ifreq, Receivers->GetLocation(irec)[2]);
  237. //KernelManager->SetDipoleSource( this.get() , ifreq, Receivers->GetLocation(irec)[2] );
  238. kernelFreq = Freqs(ifreq); // this is never used
  239. ReSetKernels( ifreq, Fields, Receivers, irec, Earth );
  240. return;
  241. }
  242. void DipoleSource::SetupLight(const int& ifreq, const FIELDCALCULATIONS& Fields, const int& irecin) {
  243. xxp = Receivers->GetLocation(irec)[0] - Location[0];
  244. yyp = Receivers->GetLocation(irec)[1] - Location[1];
  245. rho = (Receivers->GetLocation(irec).head<2>() - Location.head<2>()).norm();
  246. sp = yyp/rho;
  247. cp = xxp/rho;
  248. scp = sp*cp;
  249. sps = sp*sp;
  250. cps = cp*cp;
  251. c2p = cps-sps;
  252. return;
  253. }
  254. // TODO we could make the dipoles template specializations avoiding this rats nest of switch statements. Probably
  255. // not the most critical piece though
  256. void DipoleSource::ReSetKernels(const int& ifreq, const FIELDCALCULATIONS& Fields ,
  257. std::shared_ptr<FieldPoints> Receivers, const int& irec,
  258. std::shared_ptr<LayeredEarthEM> Earth ) {
  259. Vector3r Pol = Phat;
  260. switch (Type) {
  261. case (GROUNDEDELECTRICDIPOLE):
  262. if (std::abs(Pol[2]) > 0) { // z dipole
  263. switch(FieldsToCalculate) {
  264. case E:
  265. if (lays == 0 && layr == 0) {
  266. ik[10] = KernelManager->AddKernel<TM, 10, INAIR, INAIR>( );
  267. ik[11] = KernelManager->AddKernel<TM, 11, INAIR, INAIR>( );
  268. } else if (lays == 0 && layr > 0) {
  269. ik[10] = KernelManager->AddKernel<TM, 10, INAIR, INGROUND>( );
  270. ik[11] = KernelManager->AddKernel<TM, 11, INAIR, INGROUND>( );
  271. } else if (lays > 0 && layr == 0) {
  272. ik[10] = KernelManager->AddKernel<TM, 10, INGROUND, INAIR>( );
  273. ik[11] = KernelManager->AddKernel<TM, 11, INGROUND, INAIR>( );
  274. } else {
  275. ik[10] = KernelManager->AddKernel<TM, 10, INGROUND, INGROUND>( );
  276. ik[11] = KernelManager->AddKernel<TM, 11, INGROUND, INGROUND>( );
  277. }
  278. break;
  279. case H:
  280. if (lays == 0 && layr == 0) {
  281. ik[12] = KernelManager->AddKernel<TM, 12, INAIR, INAIR>( );
  282. } else if (lays == 0 && layr > 0) {
  283. ik[12] = KernelManager->AddKernel<TM, 12, INAIR, INGROUND>( );
  284. } else if (lays > 0 && layr == 0) {
  285. ik[12] = KernelManager->AddKernel<TM, 12, INGROUND, INAIR>( );
  286. } else {
  287. ik[12] = KernelManager->AddKernel<TM, 12, INGROUND, INGROUND>( );
  288. }
  289. break;
  290. case BOTH:
  291. if ( lays == 0 && layr == 0) {
  292. ik[10] = KernelManager->AddKernel<TM, 10, INAIR, INAIR>( );
  293. ik[11] = KernelManager->AddKernel<TM, 11, INAIR, INAIR>( );
  294. ik[12] = KernelManager->AddKernel<TM, 12, INAIR, INAIR>( );
  295. } else if (lays == 0 && layr > 0) {
  296. ik[10] = KernelManager->AddKernel<TM, 10, INAIR, INGROUND>( );
  297. ik[11] = KernelManager->AddKernel<TM, 11, INAIR, INGROUND>( );
  298. ik[12] = KernelManager->AddKernel<TM, 12, INAIR, INGROUND>( );
  299. } else if (lays > 0 && layr == 0) {
  300. ik[10] = KernelManager->AddKernel<TM, 10, INGROUND, INAIR>( );
  301. ik[11] = KernelManager->AddKernel<TM, 11, INGROUND, INAIR>( );
  302. ik[12] = KernelManager->AddKernel<TM, 12, INGROUND, INAIR>( );
  303. } else {
  304. ik[10] = KernelManager->AddKernel<TM, 10, INGROUND, INGROUND>( );
  305. ik[11] = KernelManager->AddKernel<TM, 11, INGROUND, INGROUND>( );
  306. ik[12] = KernelManager->AddKernel<TM, 12, INGROUND, INGROUND>( );
  307. }
  308. }
  309. }
  310. if (std::abs(Pol[1]) > 0 || std::abs(Pol[0]) > 0) { // x or y grounded HED dipole
  311. switch(FieldsToCalculate) {
  312. case E:
  313. if ( lays == 0 && layr == 0) {
  314. ik[0] = KernelManager->AddKernel<TM, 0, INAIR, INAIR>( );
  315. ik[1] = KernelManager->AddKernel<TM, 1, INAIR, INAIR>( );
  316. ik[4] = KernelManager->AddKernel<TM, 4, INAIR, INAIR>( );
  317. ik[2] = KernelManager->AddKernel<TE, 2, INAIR, INAIR>( );
  318. ik[3] = KernelManager->AddKernel<TE, 3, INAIR, INAIR>( );
  319. } else if (lays == 0 && layr > 0) {
  320. ik[0] = KernelManager->AddKernel<TM, 0, INAIR, INGROUND>( );
  321. ik[1] = KernelManager->AddKernel<TM, 1, INAIR, INGROUND>( );
  322. ik[4] = KernelManager->AddKernel<TM, 4, INAIR, INGROUND>( );
  323. ik[2] = KernelManager->AddKernel<TE, 2, INAIR, INGROUND>( );
  324. ik[3] = KernelManager->AddKernel<TE, 3, INAIR, INGROUND>( );
  325. } else if (lays > 0 && layr == 0) {
  326. ik[0] = KernelManager->AddKernel<TM, 0, INGROUND, INAIR>( );
  327. ik[1] = KernelManager->AddKernel<TM, 1, INGROUND, INAIR>( );
  328. ik[4] = KernelManager->AddKernel<TM, 4, INGROUND, INAIR>( );
  329. ik[2] = KernelManager->AddKernel<TE, 2, INGROUND, INAIR>( );
  330. ik[3] = KernelManager->AddKernel<TE, 3, INGROUND, INAIR>( );
  331. } else {
  332. ik[0] = KernelManager->AddKernel<TM, 0, INGROUND, INGROUND>( );
  333. ik[1] = KernelManager->AddKernel<TM, 1, INGROUND, INGROUND>( );
  334. ik[4] = KernelManager->AddKernel<TM, 4, INGROUND, INGROUND>( );
  335. ik[2] = KernelManager->AddKernel<TE, 2, INGROUND, INGROUND>( );
  336. ik[3] = KernelManager->AddKernel<TE, 3, INGROUND, INGROUND>( );
  337. }
  338. break;
  339. case H:
  340. if (lays == 0 && layr == 0) {
  341. ik[5] = KernelManager->AddKernel<TM, 5, INAIR, INAIR>( );
  342. ik[6] = KernelManager->AddKernel<TM, 6, INAIR, INAIR>( );
  343. ik[7] = KernelManager->AddKernel<TE, 7, INAIR, INAIR>( );
  344. ik[8] = KernelManager->AddKernel<TE, 8, INAIR, INAIR>( );
  345. ik[9] = KernelManager->AddKernel<TE, 9, INAIR, INAIR>( );
  346. } else if (lays == 0 && layr > 0) {
  347. ik[5] = KernelManager->AddKernel<TM, 5, INAIR, INGROUND>( );
  348. ik[6] = KernelManager->AddKernel<TM, 6, INAIR, INGROUND>( );
  349. ik[7] = KernelManager->AddKernel<TE, 7, INAIR, INGROUND>( );
  350. ik[8] = KernelManager->AddKernel<TE, 8, INAIR, INGROUND>( );
  351. ik[9] = KernelManager->AddKernel<TE, 9, INAIR, INGROUND>( );
  352. } else if (lays > 0 && layr == 0) {
  353. ik[5] = KernelManager->AddKernel<TM, 5, INGROUND, INAIR>( );
  354. ik[6] = KernelManager->AddKernel<TM, 6, INGROUND, INAIR>( );
  355. ik[7] = KernelManager->AddKernel<TE, 7, INGROUND, INAIR>( );
  356. ik[8] = KernelManager->AddKernel<TE, 8, INGROUND, INAIR>( );
  357. ik[9] = KernelManager->AddKernel<TE, 9, INGROUND, INAIR>( );
  358. } else {
  359. ik[5] = KernelManager->AddKernel<TM, 5, INGROUND, INGROUND>( );
  360. ik[6] = KernelManager->AddKernel<TM, 6, INGROUND, INGROUND>( );
  361. ik[7] = KernelManager->AddKernel<TE, 7, INGROUND, INGROUND>( );
  362. ik[8] = KernelManager->AddKernel<TE, 8, INGROUND, INGROUND>( );
  363. ik[9] = KernelManager->AddKernel<TE, 9, INGROUND, INGROUND>( );
  364. }
  365. break;
  366. case BOTH:
  367. if (lays == 0 && layr == 0) {
  368. ik[0] = KernelManager->AddKernel<TM, 0, INAIR, INAIR>( );
  369. ik[1] = KernelManager->AddKernel<TM, 1, INAIR, INAIR>( );
  370. ik[4] = KernelManager->AddKernel<TM, 4, INAIR, INAIR>( );
  371. ik[2] = KernelManager->AddKernel<TE, 2, INAIR, INAIR>( );
  372. ik[3] = KernelManager->AddKernel<TE, 3, INAIR, INAIR>( );
  373. ik[5] = KernelManager->AddKernel<TM, 5, INAIR, INAIR>( );
  374. ik[6] = KernelManager->AddKernel<TM, 6, INAIR, INAIR>( );
  375. ik[7] = KernelManager->AddKernel<TE, 7, INAIR, INAIR>( );
  376. ik[8] = KernelManager->AddKernel<TE, 8, INAIR, INAIR>( );
  377. ik[9] = KernelManager->AddKernel<TE, 9, INAIR, INAIR>( );
  378. } else if (lays == 0 && layr > 0) {
  379. ik[0] = KernelManager->AddKernel<TM, 0, INAIR, INGROUND>( );
  380. ik[1] = KernelManager->AddKernel<TM, 1, INAIR, INGROUND>( );
  381. ik[4] = KernelManager->AddKernel<TM, 4, INAIR, INGROUND>( );
  382. ik[2] = KernelManager->AddKernel<TE, 2, INAIR, INGROUND>( );
  383. ik[3] = KernelManager->AddKernel<TE, 3, INAIR, INGROUND>( );
  384. ik[5] = KernelManager->AddKernel<TM, 5, INAIR, INGROUND>( );
  385. ik[6] = KernelManager->AddKernel<TM, 6, INAIR, INGROUND>( );
  386. ik[7] = KernelManager->AddKernel<TE, 7, INAIR, INGROUND>( );
  387. ik[8] = KernelManager->AddKernel<TE, 8, INAIR, INGROUND>( );
  388. ik[9] = KernelManager->AddKernel<TE, 9, INAIR, INGROUND>( );
  389. } else if (lays > 0 && layr == 0) {
  390. ik[0] = KernelManager->AddKernel<TM, 0, INGROUND, INAIR>( );
  391. ik[1] = KernelManager->AddKernel<TM, 1, INGROUND, INAIR>( );
  392. ik[4] = KernelManager->AddKernel<TM, 4, INGROUND, INAIR>( );
  393. ik[2] = KernelManager->AddKernel<TE, 2, INGROUND, INAIR>( );
  394. ik[3] = KernelManager->AddKernel<TE, 3, INGROUND, INAIR>( );
  395. ik[5] = KernelManager->AddKernel<TM, 5, INGROUND, INAIR>( );
  396. ik[6] = KernelManager->AddKernel<TM, 6, INGROUND, INAIR>( );
  397. ik[7] = KernelManager->AddKernel<TE, 7, INGROUND, INAIR>( );
  398. ik[8] = KernelManager->AddKernel<TE, 8, INGROUND, INAIR>( );
  399. ik[9] = KernelManager->AddKernel<TE, 9, INGROUND, INAIR>( );
  400. } else {
  401. ik[0] = KernelManager->AddKernel<TM, 0, INGROUND, INGROUND>( );
  402. ik[1] = KernelManager->AddKernel<TM, 1, INGROUND, INGROUND>( );
  403. ik[4] = KernelManager->AddKernel<TM, 4, INGROUND, INGROUND>( );
  404. ik[2] = KernelManager->AddKernel<TE, 2, INGROUND, INGROUND>( );
  405. ik[3] = KernelManager->AddKernel<TE, 3, INGROUND, INGROUND>( );
  406. ik[5] = KernelManager->AddKernel<TM, 5, INGROUND, INGROUND>( );
  407. ik[6] = KernelManager->AddKernel<TM, 6, INGROUND, INGROUND>( );
  408. ik[7] = KernelManager->AddKernel<TE, 7, INGROUND, INGROUND>( );
  409. ik[8] = KernelManager->AddKernel<TE, 8, INGROUND, INGROUND>( );
  410. ik[9] = KernelManager->AddKernel<TE, 9, INGROUND, INGROUND>( );
  411. }
  412. break;
  413. }
  414. }
  415. break;
  416. case (GROUNDINGPOINT):
  417. if (std::abs(Pol[2]) > 0) { // z dipole
  418. switch(FieldsToCalculate) {
  419. case E:
  420. if (lays == 0 && layr == 0) {
  421. ik[10] = KernelManager->AddKernel<TM, 10, INAIR, INAIR>( );
  422. ik[11] = KernelManager->AddKernel<TM, 11, INAIR, INAIR>( );
  423. } else if (lays == 0 && layr > 0) {
  424. ik[10] = KernelManager->AddKernel<TM, 10, INAIR, INGROUND>( );
  425. ik[11] = KernelManager->AddKernel<TM, 11, INAIR, INGROUND>( );
  426. } else if (lays > 0 && layr == 0) {
  427. ik[10] = KernelManager->AddKernel<TM, 10, INGROUND, INAIR>( );
  428. ik[11] = KernelManager->AddKernel<TM, 11, INGROUND, INAIR>( );
  429. } else {
  430. ik[10] = KernelManager->AddKernel<TM, 10, INGROUND, INGROUND>( );
  431. ik[11] = KernelManager->AddKernel<TM, 11, INGROUND, INGROUND>( );
  432. }
  433. break;
  434. case H:
  435. if (lays == 0 && layr == 0) {
  436. ik[12] = KernelManager->AddKernel<TM, 12, INAIR, INAIR>( );
  437. } else if (lays == 0 && layr > 0) {
  438. ik[12] = KernelManager->AddKernel<TM, 12, INAIR, INGROUND>( );
  439. } else if (lays > 0 && layr == 0) {
  440. ik[12] = KernelManager->AddKernel<TM, 12, INGROUND, INAIR>( );
  441. } else {
  442. ik[12] = KernelManager->AddKernel<TM, 12, INGROUND, INGROUND>( );
  443. }
  444. break;
  445. case BOTH:
  446. if ( lays == 0 && layr == 0) {
  447. ik[10] = KernelManager->AddKernel<TM, 10, INAIR, INAIR>( );
  448. ik[11] = KernelManager->AddKernel<TM, 11, INAIR, INAIR>( );
  449. ik[12] = KernelManager->AddKernel<TM, 12, INAIR, INAIR>( );
  450. } else if (lays == 0 && layr > 0) {
  451. ik[10] = KernelManager->AddKernel<TM, 10, INAIR, INGROUND>( );
  452. ik[11] = KernelManager->AddKernel<TM, 11, INAIR, INGROUND>( );
  453. ik[12] = KernelManager->AddKernel<TM, 12, INAIR, INGROUND>( );
  454. } else if (lays > 0 && layr == 0) {
  455. ik[10] = KernelManager->AddKernel<TM, 10, INGROUND, INAIR>( );
  456. ik[11] = KernelManager->AddKernel<TM, 11, INGROUND, INAIR>( );
  457. ik[12] = KernelManager->AddKernel<TM, 12, INGROUND, INAIR>( );
  458. } else {
  459. ik[10] = KernelManager->AddKernel<TM, 10, INGROUND, INGROUND>( );
  460. ik[11] = KernelManager->AddKernel<TM, 11, INGROUND, INGROUND>( );
  461. ik[12] = KernelManager->AddKernel<TM, 12, INGROUND, INGROUND>( );
  462. }
  463. }
  464. }
  465. if (std::abs(Pol[1]) > 0 || std::abs(Pol[0]) > 0) { // x or y grounded HED dipole
  466. switch(FieldsToCalculate) {
  467. case E:
  468. if ( lays == 0 && layr == 0) {
  469. ik[0] = KernelManager->AddKernel<TM, 0, INAIR, INAIR>( );
  470. ik[1] = KernelManager->AddKernel<TM, 1, INAIR, INAIR>( );
  471. ik[4] = KernelManager->AddKernel<TM, 4, INAIR, INAIR>( );
  472. //ik[2] = KernelManager->AddKernel<TE, 2, INAIR, INAIR>( );
  473. //ik[3] = KernelManager->AddKernel<TE, 3, INAIR, INAIR>( );
  474. } else if (lays == 0 && layr > 0) {
  475. ik[0] = KernelManager->AddKernel<TM, 0, INAIR, INGROUND>( );
  476. ik[1] = KernelManager->AddKernel<TM, 1, INAIR, INGROUND>( );
  477. ik[4] = KernelManager->AddKernel<TM, 4, INAIR, INGROUND>( );
  478. //ik[2] = KernelManager->AddKernel<TE, 2, INAIR, INGROUND>( );
  479. //ik[3] = KernelManager->AddKernel<TE, 3, INAIR, INGROUND>( );
  480. } else if (lays > 0 && layr == 0) {
  481. ik[0] = KernelManager->AddKernel<TM, 0, INGROUND, INAIR>( );
  482. ik[1] = KernelManager->AddKernel<TM, 1, INGROUND, INAIR>( );
  483. ik[4] = KernelManager->AddKernel<TM, 4, INGROUND, INAIR>( );
  484. //ik[2] = KernelManager->AddKernel<TE, 2, INGROUND, INAIR>( );
  485. //ik[3] = KernelManager->AddKernel<TE, 3, INGROUND, INAIR>( );
  486. } else {
  487. ik[0] = KernelManager->AddKernel<TM, 0, INGROUND, INGROUND>( );
  488. ik[1] = KernelManager->AddKernel<TM, 1, INGROUND, INGROUND>( );
  489. ik[4] = KernelManager->AddKernel<TM, 4, INGROUND, INGROUND>( );
  490. //ik[2] = KernelManager->AddKernel<TE, 2, INGROUND, INGROUND>( );
  491. //ik[3] = KernelManager->AddKernel<TE, 3, INGROUND, INGROUND>( );
  492. }
  493. break;
  494. case H:
  495. if (lays == 0 && layr == 0) {
  496. ik[5] = KernelManager->AddKernel<TM, 5, INAIR, INAIR>( );
  497. ik[6] = KernelManager->AddKernel<TM, 6, INAIR, INAIR>( );
  498. //ik[7] = KernelManager->AddKernel<TE, 7, INAIR, INAIR>( );
  499. //ik[8] = KernelManager->AddKernel<TE, 8, INAIR, INAIR>( );
  500. //ik[9] = KernelManager->AddKernel<TE, 9, INAIR, INAIR>( );
  501. } else if (lays == 0 && layr > 0) {
  502. ik[5] = KernelManager->AddKernel<TM, 5, INAIR, INGROUND>( );
  503. ik[6] = KernelManager->AddKernel<TM, 6, INAIR, INGROUND>( );
  504. //ik[7] = KernelManager->AddKernel<TE, 7, INAIR, INGROUND>( );
  505. //ik[8] = KernelManager->AddKernel<TE, 8, INAIR, INGROUND>( );
  506. //ik[9] = KernelManager->AddKernel<TE, 9, INAIR, INGROUND>( );
  507. } else if (lays > 0 && layr == 0) {
  508. ik[5] = KernelManager->AddKernel<TM, 5, INGROUND, INAIR>( );
  509. ik[6] = KernelManager->AddKernel<TM, 6, INGROUND, INAIR>( );
  510. //ik[7] = KernelManager->AddKernel<TE, 7, INGROUND, INAIR>( );
  511. //ik[8] = KernelManager->AddKernel<TE, 8, INGROUND, INAIR>( );
  512. //ik[9] = KernelManager->AddKernel<TE, 9, INGROUND, INAIR>( );
  513. } else {
  514. ik[5] = KernelManager->AddKernel<TM, 5, INGROUND, INGROUND>( );
  515. ik[6] = KernelManager->AddKernel<TM, 6, INGROUND, INGROUND>( );
  516. //ik[7] = KernelManager->AddKernel<TE, 7, INGROUND, INGROUND>( );
  517. //ik[8] = KernelManager->AddKernel<TE, 8, INGROUND, INGROUND>( );
  518. //ik[9] = KernelManager->AddKernel<TE, 9, INGROUND, INGROUND>( );
  519. }
  520. break;
  521. case BOTH:
  522. if (lays == 0 && layr == 0) {
  523. ik[0] = KernelManager->AddKernel<TM, 0, INAIR, INAIR>( );
  524. ik[1] = KernelManager->AddKernel<TM, 1, INAIR, INAIR>( );
  525. ik[4] = KernelManager->AddKernel<TM, 4, INAIR, INAIR>( );
  526. //ik[2] = KernelManager->AddKernel<TE, 2, INAIR, INAIR>( );
  527. //ik[3] = KernelManager->AddKernel<TE, 3, INAIR, INAIR>( );
  528. ik[5] = KernelManager->AddKernel<TM, 5, INAIR, INAIR>( );
  529. ik[6] = KernelManager->AddKernel<TM, 6, INAIR, INAIR>( );
  530. //ik[7] = KernelManager->AddKernel<TE, 7, INAIR, INAIR>( );
  531. //ik[8] = KernelManager->AddKernel<TE, 8, INAIR, INAIR>( );
  532. //ik[9] = KernelManager->AddKernel<TE, 9, INAIR, INAIR>( );
  533. } else if (lays == 0 && layr > 0) {
  534. ik[0] = KernelManager->AddKernel<TM, 0, INAIR, INGROUND>( );
  535. ik[1] = KernelManager->AddKernel<TM, 1, INAIR, INGROUND>( );
  536. ik[4] = KernelManager->AddKernel<TM, 4, INAIR, INGROUND>( );
  537. //ik[2] = KernelManager->AddKernel<TE, 2, INAIR, INGROUND>( );
  538. //ik[3] = KernelManager->AddKernel<TE, 3, INAIR, INGROUND>( );
  539. ik[5] = KernelManager->AddKernel<TM, 5, INAIR, INGROUND>( );
  540. ik[6] = KernelManager->AddKernel<TM, 6, INAIR, INGROUND>( );
  541. //ik[7] = KernelManager->AddKernel<TE, 7, INAIR, INGROUND>( );
  542. //ik[8] = KernelManager->AddKernel<TE, 8, INAIR, INGROUND>( );
  543. //ik[9] = KernelManager->AddKernel<TE, 9, INAIR, INGROUND>( );
  544. } else if (lays > 0 && layr == 0) {
  545. ik[0] = KernelManager->AddKernel<TM, 0, INGROUND, INAIR>( );
  546. ik[1] = KernelManager->AddKernel<TM, 1, INGROUND, INAIR>( );
  547. ik[4] = KernelManager->AddKernel<TM, 4, INGROUND, INAIR>( );
  548. //ik[2] = KernelManager->AddKernel<TE, 2, INGROUND, INAIR>( );
  549. //ik[3] = KernelManager->AddKernel<TE, 3, INGROUND, INAIR>( );
  550. ik[5] = KernelManager->AddKernel<TM, 5, INGROUND, INAIR>( );
  551. ik[6] = KernelManager->AddKernel<TM, 6, INGROUND, INAIR>( );
  552. //ik[7] = KernelManager->AddKernel<TE, 7, INGROUND, INAIR>( );
  553. //ik[8] = KernelManager->AddKernel<TE, 8, INGROUND, INAIR>( );
  554. //ik[9] = KernelManager->AddKernel<TE, 9, INGROUND, INAIR>( );
  555. } else {
  556. ik[0] = KernelManager->AddKernel<TM, 0, INGROUND, INGROUND>( );
  557. ik[1] = KernelManager->AddKernel<TM, 1, INGROUND, INGROUND>( );
  558. ik[4] = KernelManager->AddKernel<TM, 4, INGROUND, INGROUND>( );
  559. //ik[2] = KernelManager->AddKernel<TE, 2, INGROUND, INGROUND>( );
  560. //ik[3] = KernelManager->AddKernel<TE, 3, INGROUND, INGROUND>( );
  561. ik[5] = KernelManager->AddKernel<TM, 5, INGROUND, INGROUND>( );
  562. ik[6] = KernelManager->AddKernel<TM, 6, INGROUND, INGROUND>( );
  563. //ik[7] = KernelManager->AddKernel<TE, 7, INGROUND, INGROUND>( );
  564. //ik[8] = KernelManager->AddKernel<TE, 8, INGROUND, INGROUND>( );
  565. //ik[9] = KernelManager->AddKernel<TE, 9, INGROUND, INGROUND>( );
  566. }
  567. break;
  568. }
  569. }
  570. break;
  571. case (UNGROUNDEDELECTRICDIPOLE):
  572. if (std::abs(Pol[2]) > 0) { // z dipole
  573. switch(FieldsToCalculate) {
  574. case E:
  575. if (lays == 0 && layr == 0) {
  576. ik[11] = KernelManager->AddKernel<TM, 11, INAIR, INAIR>( );
  577. } else if (lays == 0 && layr > 0) {
  578. ik[11] = KernelManager->AddKernel<TM, 11, INAIR, INGROUND>( );
  579. } else if (lays > 0 && layr == 0) {
  580. ik[11] = KernelManager->AddKernel<TM, 11, INGROUND, INAIR>( );
  581. } else {
  582. ik[11] = KernelManager->AddKernel<TM, 11, INGROUND, INGROUND>( );
  583. }
  584. break;
  585. case H:
  586. if (lays == 0 && layr == 0) {
  587. ik[12] = KernelManager->AddKernel<TM, 12, INAIR, INAIR>( );
  588. } else if (lays == 0 && layr > 0) {
  589. ik[12] = KernelManager->AddKernel<TM, 12, INAIR, INGROUND>( );
  590. } else if (lays > 0 && layr == 0) {
  591. ik[12] = KernelManager->AddKernel<TM, 12, INGROUND, INAIR>( );
  592. } else {
  593. ik[12] = KernelManager->AddKernel<TM, 12, INGROUND, INGROUND>( );
  594. }
  595. break;
  596. case BOTH:
  597. if ( lays == 0 && layr == 0) {
  598. ik[11] = KernelManager->AddKernel<TM, 11, INAIR, INAIR>( );
  599. ik[12] = KernelManager->AddKernel<TM, 12, INAIR, INAIR>( );
  600. } else if (lays == 0 && layr > 0) {
  601. ik[11] = KernelManager->AddKernel<TM, 11, INAIR, INGROUND>( );
  602. ik[12] = KernelManager->AddKernel<TM, 12, INAIR, INGROUND>( );
  603. } else if (lays > 0 && layr == 0) {
  604. ik[11] = KernelManager->AddKernel<TM, 11, INGROUND, INAIR>( );
  605. ik[12] = KernelManager->AddKernel<TM, 12, INGROUND, INAIR>( );
  606. } else {
  607. ik[11] = KernelManager->AddKernel<TM, 11, INGROUND, INGROUND>( );
  608. ik[12] = KernelManager->AddKernel<TM, 12, INGROUND, INGROUND>( );
  609. }
  610. }
  611. }
  612. if (std::abs(Pol[1]) > 0 || std::abs(Pol[0]) > 0) { // x or y grounded HED dipole
  613. switch(FieldsToCalculate) {
  614. case E:
  615. if ( lays == 0 && layr == 0) {
  616. ik[2] = KernelManager->AddKernel<TE, 2, INAIR, INAIR>( );
  617. ik[3] = KernelManager->AddKernel<TE, 3, INAIR, INAIR>( );
  618. } else if (lays == 0 && layr > 0) {
  619. ik[2] = KernelManager->AddKernel<TE, 2, INAIR, INGROUND>( );
  620. ik[3] = KernelManager->AddKernel<TE, 3, INAIR, INGROUND>( );
  621. } else if (lays > 0 && layr == 0) {
  622. ik[2] = KernelManager->AddKernel<TE, 2, INGROUND, INAIR>( );
  623. ik[3] = KernelManager->AddKernel<TE, 3, INGROUND, INAIR>( );
  624. } else {
  625. ik[2] = KernelManager->AddKernel<TE, 2, INGROUND, INGROUND>( );
  626. ik[3] = KernelManager->AddKernel<TE, 3, INGROUND, INGROUND>( );
  627. }
  628. break;
  629. case H:
  630. if (lays == 0 && layr == 0) {
  631. ik[5] = KernelManager->AddKernel<TM, 5, INAIR, INAIR>( );
  632. ik[6] = KernelManager->AddKernel<TM, 6, INAIR, INAIR>( );
  633. ik[7] = KernelManager->AddKernel<TE, 7, INAIR, INAIR>( );
  634. ik[8] = KernelManager->AddKernel<TE, 8, INAIR, INAIR>( );
  635. ik[9] = KernelManager->AddKernel<TE, 9, INAIR, INAIR>( );
  636. } else if (lays == 0 && layr > 0) {
  637. ik[5] = KernelManager->AddKernel<TM, 5, INAIR, INGROUND>( );
  638. ik[6] = KernelManager->AddKernel<TM, 6, INAIR, INGROUND>( );
  639. ik[7] = KernelManager->AddKernel<TE, 7, INAIR, INGROUND>( );
  640. ik[8] = KernelManager->AddKernel<TE, 8, INAIR, INGROUND>( );
  641. ik[9] = KernelManager->AddKernel<TE, 9, INAIR, INGROUND>( );
  642. } else if (lays > 0 && layr == 0) {
  643. ik[5] = KernelManager->AddKernel<TM, 5, INGROUND, INAIR>( );
  644. ik[6] = KernelManager->AddKernel<TM, 6, INGROUND, INAIR>( );
  645. ik[7] = KernelManager->AddKernel<TE, 7, INGROUND, INAIR>( );
  646. ik[8] = KernelManager->AddKernel<TE, 8, INGROUND, INAIR>( );
  647. ik[9] = KernelManager->AddKernel<TE, 9, INGROUND, INAIR>( );
  648. } else {
  649. ik[5] = KernelManager->AddKernel<TM, 5, INGROUND, INGROUND>( );
  650. ik[6] = KernelManager->AddKernel<TM, 6, INGROUND, INGROUND>( );
  651. ik[7] = KernelManager->AddKernel<TE, 7, INGROUND, INGROUND>( );
  652. ik[8] = KernelManager->AddKernel<TE, 8, INGROUND, INGROUND>( );
  653. ik[9] = KernelManager->AddKernel<TE, 9, INGROUND, INGROUND>( );
  654. }
  655. break;
  656. case BOTH:
  657. if (lays == 0 && layr == 0) {
  658. ik[5] = KernelManager->AddKernel<TM, 5, INAIR, INAIR>( );
  659. ik[6] = KernelManager->AddKernel<TM, 6, INAIR, INAIR>( );
  660. ik[2] = KernelManager->AddKernel<TE, 2, INAIR, INAIR>( );
  661. ik[3] = KernelManager->AddKernel<TE, 3, INAIR, INAIR>( );
  662. ik[7] = KernelManager->AddKernel<TE, 7, INAIR, INAIR>( );
  663. ik[8] = KernelManager->AddKernel<TE, 8, INAIR, INAIR>( );
  664. ik[9] = KernelManager->AddKernel<TE, 9, INAIR, INAIR>( );
  665. } else if (lays == 0 && layr > 0) {
  666. ik[5] = KernelManager->AddKernel<TM, 5, INAIR, INGROUND>( );
  667. ik[6] = KernelManager->AddKernel<TM, 6, INAIR, INGROUND>( );
  668. ik[2] = KernelManager->AddKernel<TE, 2, INAIR, INGROUND>( );
  669. ik[3] = KernelManager->AddKernel<TE, 3, INAIR, INGROUND>( );
  670. ik[7] = KernelManager->AddKernel<TE, 7, INAIR, INGROUND>( );
  671. ik[8] = KernelManager->AddKernel<TE, 8, INAIR, INGROUND>( );
  672. ik[9] = KernelManager->AddKernel<TE, 9, INAIR, INGROUND>( );
  673. } else if (lays > 0 && layr == 0) {
  674. ik[5] = KernelManager->AddKernel<TM, 5, INGROUND, INAIR>( );
  675. ik[6] = KernelManager->AddKernel<TM, 6, INGROUND, INAIR>( );
  676. ik[2] = KernelManager->AddKernel<TE, 2, INGROUND, INAIR>( );
  677. ik[3] = KernelManager->AddKernel<TE, 3, INGROUND, INAIR>( );
  678. ik[7] = KernelManager->AddKernel<TE, 7, INGROUND, INAIR>( );
  679. ik[8] = KernelManager->AddKernel<TE, 8, INGROUND, INAIR>( );
  680. ik[9] = KernelManager->AddKernel<TE, 9, INGROUND, INAIR>( );
  681. } else {
  682. ik[5] = KernelManager->AddKernel<TM, 5, INGROUND, INGROUND>( );
  683. ik[6] = KernelManager->AddKernel<TM, 6, INGROUND, INGROUND>( );
  684. ik[2] = KernelManager->AddKernel<TE, 2, INGROUND, INGROUND>( );
  685. ik[3] = KernelManager->AddKernel<TE, 3, INGROUND, INGROUND>( );
  686. ik[7] = KernelManager->AddKernel<TE, 7, INGROUND, INGROUND>( );
  687. ik[8] = KernelManager->AddKernel<TE, 8, INGROUND, INGROUND>( );
  688. ik[9] = KernelManager->AddKernel<TE, 9, INGROUND, INGROUND>( );
  689. }
  690. break;
  691. }
  692. }
  693. break;
  694. case (MAGNETICDIPOLE):
  695. if (std::abs(Pol[2]) > 0) { // z dipole
  696. switch (FieldsToCalculate) {
  697. case E:
  698. if (lays == 0 && layr == 0) {
  699. ik[12] = KernelManager->AddKernel<TE, 12, INAIR, INAIR>( );
  700. } else if (lays == 0 && layr > 0) {
  701. ik[12] = KernelManager->AddKernel<TE, 12, INAIR, INGROUND>( );
  702. } else if (lays > 0 && layr == 0) {
  703. ik[12] = KernelManager->AddKernel<TE, 12, INGROUND, INAIR>( );
  704. } else {
  705. ik[12] = KernelManager->AddKernel<TE, 12, INGROUND, INGROUND>( );
  706. }
  707. break;
  708. case H:
  709. if (lays == 0 && layr == 0) {
  710. ik[10] = KernelManager->AddKernel<TE, 10, INAIR, INAIR>( );
  711. ik[11] = KernelManager->AddKernel<TE, 11, INAIR, INAIR>( );
  712. } else if (lays == 0 && layr > 0) {
  713. ik[10] = KernelManager->AddKernel<TE, 10, INAIR, INGROUND>( );
  714. ik[11] = KernelManager->AddKernel<TE, 11, INAIR, INGROUND>( );
  715. } else if (lays > 0 && layr == 0) {
  716. ik[10] = KernelManager->AddKernel<TE, 10, INGROUND, INAIR>( );
  717. ik[11] = KernelManager->AddKernel<TE, 11, INGROUND, INAIR>( );
  718. } else {
  719. ik[10] = KernelManager->AddKernel<TE, 10, INGROUND, INGROUND>( );
  720. ik[11] = KernelManager->AddKernel<TE, 11, INGROUND, INGROUND>( );
  721. }
  722. break;
  723. case BOTH:
  724. if (lays == 0 && layr == 0) {
  725. ik[12] = KernelManager->AddKernel<TE, 12, INAIR, INAIR>( );
  726. ik[10] = KernelManager->AddKernel<TE, 10, INAIR, INAIR>( );
  727. ik[11] = KernelManager->AddKernel<TE, 11, INAIR, INAIR>( );
  728. } else if (lays == 0 && layr > 0) {
  729. ik[12] = KernelManager->AddKernel<TE, 12, INAIR, INGROUND>( );
  730. ik[10] = KernelManager->AddKernel<TE, 10, INAIR, INGROUND>( );
  731. ik[11] = KernelManager->AddKernel<TE, 11, INAIR, INGROUND>( );
  732. } else if (lays > 0 && layr == 0) {
  733. ik[12] = KernelManager->AddKernel<TE, 12, INGROUND, INAIR>( );
  734. ik[10] = KernelManager->AddKernel<TE, 10, INGROUND, INAIR>( );
  735. ik[11] = KernelManager->AddKernel<TE, 11, INGROUND, INAIR>( );
  736. } else {
  737. ik[12] = KernelManager->AddKernel<TE, 12, INGROUND, INGROUND>( );
  738. ik[10] = KernelManager->AddKernel<TE, 10, INGROUND, INGROUND>( );
  739. ik[11] = KernelManager->AddKernel<TE, 11, INGROUND, INGROUND>( );
  740. }
  741. }
  742. }
  743. if (std::abs(Pol[1]) > 0 || std::abs(Pol[0]) > 0) { // x or y grounded HED dipole
  744. switch (FieldsToCalculate) {
  745. case E:
  746. if ( lays == 0 && layr == 0) {
  747. ik[5] = KernelManager->AddKernel<TE, 5, INAIR, INAIR>( );
  748. ik[6] = KernelManager->AddKernel<TE, 6, INAIR, INAIR>( );
  749. ik[7] = KernelManager->AddKernel<TM, 7, INAIR, INAIR>( );
  750. ik[8] = KernelManager->AddKernel<TM, 8, INAIR, INAIR>( );
  751. ik[9] = KernelManager->AddKernel<TM, 9, INAIR, INAIR>( );
  752. } else if (lays == 0 && layr > 0) {
  753. ik[5] = KernelManager->AddKernel<TE, 5, INAIR, INGROUND>( );
  754. ik[6] = KernelManager->AddKernel<TE, 6, INAIR, INGROUND>( );
  755. ik[7] = KernelManager->AddKernel<TM, 7, INAIR, INGROUND>( );
  756. ik[8] = KernelManager->AddKernel<TM, 8, INAIR, INGROUND>( );
  757. ik[9] = KernelManager->AddKernel<TM, 9, INAIR, INGROUND>( );
  758. } else if (lays > 0 && layr == 0) {
  759. ik[5] = KernelManager->AddKernel<TE, 5, INGROUND, INAIR>( );
  760. ik[6] = KernelManager->AddKernel<TE, 6, INGROUND, INAIR>( );
  761. ik[7] = KernelManager->AddKernel<TM, 7, INGROUND, INAIR>( );
  762. ik[8] = KernelManager->AddKernel<TM, 8, INGROUND, INAIR>( );
  763. ik[9] = KernelManager->AddKernel<TM, 9, INGROUND, INAIR>( );
  764. } else {
  765. ik[5] = KernelManager->AddKernel<TE, 5, INGROUND, INGROUND>( );
  766. ik[6] = KernelManager->AddKernel<TE, 6, INGROUND, INGROUND>( );
  767. ik[7] = KernelManager->AddKernel<TM, 7, INGROUND, INGROUND>( );
  768. ik[8] = KernelManager->AddKernel<TM, 8, INGROUND, INGROUND>( );
  769. ik[9] = KernelManager->AddKernel<TM, 9, INGROUND, INGROUND>( );
  770. }
  771. break;
  772. case H:
  773. if ( lays == 0 && layr == 0) {
  774. ik[0] = KernelManager->AddKernel<TE, 0, INAIR, INAIR>( );
  775. ik[1] = KernelManager->AddKernel<TE, 1, INAIR, INAIR>( );
  776. ik[4] = KernelManager->AddKernel<TE, 4, INAIR, INAIR>( );
  777. ik[2] = KernelManager->AddKernel<TM, 2, INAIR, INAIR>( );
  778. ik[3] = KernelManager->AddKernel<TM, 3, INAIR, INAIR>( );
  779. } else if (lays == 0 && layr > 0) {
  780. ik[0] = KernelManager->AddKernel<TE, 0, INAIR, INGROUND>( );
  781. ik[1] = KernelManager->AddKernel<TE, 1, INAIR, INGROUND>( );
  782. ik[4] = KernelManager->AddKernel<TE, 4, INAIR, INGROUND>( );
  783. ik[2] = KernelManager->AddKernel<TM, 2, INAIR, INGROUND>( );
  784. ik[3] = KernelManager->AddKernel<TM, 3, INAIR, INGROUND>( );
  785. } else if (lays > 0 && layr == 0) {
  786. ik[0] = KernelManager->AddKernel<TE, 0, INGROUND, INAIR>( );
  787. ik[1] = KernelManager->AddKernel<TE, 1, INGROUND, INAIR>( );
  788. ik[4] = KernelManager->AddKernel<TE, 4, INGROUND, INAIR>( );
  789. ik[2] = KernelManager->AddKernel<TM, 2, INGROUND, INAIR>( );
  790. ik[3] = KernelManager->AddKernel<TM, 3, INGROUND, INAIR>( );
  791. } else {
  792. ik[0] = KernelManager->AddKernel<TE, 0, INGROUND, INGROUND>( );
  793. ik[1] = KernelManager->AddKernel<TE, 1, INGROUND, INGROUND>( );
  794. ik[4] = KernelManager->AddKernel<TE, 4, INGROUND, INGROUND>( );
  795. ik[2] = KernelManager->AddKernel<TM, 2, INGROUND, INGROUND>( );
  796. ik[3] = KernelManager->AddKernel<TM, 3, INGROUND, INGROUND>( );
  797. }
  798. break;
  799. case BOTH:
  800. if ( lays == 0 && layr == 0) {
  801. ik[5] = KernelManager->AddKernel<TE, 5, INAIR, INAIR>( );
  802. ik[6] = KernelManager->AddKernel<TE, 6, INAIR, INAIR>( );
  803. ik[7] = KernelManager->AddKernel<TM, 7, INAIR, INAIR>( );
  804. ik[8] = KernelManager->AddKernel<TM, 8, INAIR, INAIR>( );
  805. ik[9] = KernelManager->AddKernel<TM, 9, INAIR, INAIR>( );
  806. ik[0] = KernelManager->AddKernel<TE, 0, INAIR, INAIR>( );
  807. ik[1] = KernelManager->AddKernel<TE, 1, INAIR, INAIR>( );
  808. ik[4] = KernelManager->AddKernel<TE, 4, INAIR, INAIR>( );
  809. ik[2] = KernelManager->AddKernel<TM, 2, INAIR, INAIR>( );
  810. ik[3] = KernelManager->AddKernel<TM, 3, INAIR, INAIR>( );
  811. } else if (lays == 0 && layr > 0) {
  812. ik[5] = KernelManager->AddKernel<TE, 5, INAIR, INGROUND>( );
  813. ik[6] = KernelManager->AddKernel<TE, 6, INAIR, INGROUND>( );
  814. ik[7] = KernelManager->AddKernel<TM, 7, INAIR, INGROUND>( );
  815. ik[8] = KernelManager->AddKernel<TM, 8, INAIR, INGROUND>( );
  816. ik[9] = KernelManager->AddKernel<TM, 9, INAIR, INGROUND>( );
  817. ik[0] = KernelManager->AddKernel<TE, 0, INAIR, INGROUND>( );
  818. ik[1] = KernelManager->AddKernel<TE, 1, INAIR, INGROUND>( );
  819. ik[4] = KernelManager->AddKernel<TE, 4, INAIR, INGROUND>( );
  820. ik[2] = KernelManager->AddKernel<TM, 2, INAIR, INGROUND>( );
  821. ik[3] = KernelManager->AddKernel<TM, 3, INAIR, INGROUND>( );
  822. } else {
  823. ik[5] = KernelManager->AddKernel<TE, 5, INGROUND, INGROUND>( );
  824. ik[6] = KernelManager->AddKernel<TE, 6, INGROUND, INGROUND>( );
  825. ik[7] = KernelManager->AddKernel<TM, 7, INGROUND, INGROUND>( );
  826. ik[8] = KernelManager->AddKernel<TM, 8, INGROUND, INGROUND>( );
  827. ik[9] = KernelManager->AddKernel<TM, 9, INGROUND, INGROUND>( );
  828. ik[0] = KernelManager->AddKernel<TE, 0, INGROUND, INGROUND>( );
  829. ik[1] = KernelManager->AddKernel<TE, 1, INGROUND, INGROUND>( );
  830. ik[4] = KernelManager->AddKernel<TE, 4, INGROUND, INGROUND>( );
  831. ik[2] = KernelManager->AddKernel<TM, 2, INGROUND, INGROUND>( );
  832. ik[3] = KernelManager->AddKernel<TM, 3, INGROUND, INGROUND>( );
  833. }
  834. break;
  835. }
  836. }
  837. break;
  838. default:
  839. std::cerr << "Dipole type incorrect, in dipolesource.cpp";
  840. exit(EXIT_FAILURE);
  841. }
  842. }
  843. void DipoleSource::UpdateFields( const int& ifreq, HankelTransform* Hankel, const Real& wavef) {
  844. Vector3r Pol = Phat;
  845. switch (Type) {
  846. case (GROUNDEDELECTRICDIPOLE):
  847. //Hankel->ComputeRelated(rho, KernelManager);
  848. if (std::abs(Pol[2]) > 0) { // z dipole
  849. switch(FieldsToCalculate) {
  850. case E:
  851. f(10) = Hankel->Zgauss(10, TM, 1, rho, wavef, KernelManager->GetRAWKernel(ik[10])) / KernelManager->GetRAWKernel(ik[10])->GetYm();
  852. f(11) = Hankel->Zgauss(11, TM, 0, rho, wavef, KernelManager->GetRAWKernel(ik[11])) / KernelManager->GetRAWKernel(ik[11])->GetYm();
  853. this->Receivers->AppendEfield(ifreq, irec,
  854. -Pol[2]*QPI*cp*f(10)*Moment,
  855. -Pol[2]*QPI*sp*f(10)*Moment,
  856. Pol[2]*QPI*f(11)*Moment);
  857. break;
  858. case H:
  859. f(12) = Hankel->Zgauss(12, TM, 1, rho, wavef, KernelManager->GetRAWKernel(ik[12]));
  860. this->Receivers->AppendHfield(ifreq, irec,
  861. -Pol[2]*QPI*sp*f(12)*Moment,
  862. Pol[2]*QPI*cp*f(12)*Moment,
  863. 0. );
  864. break;
  865. case BOTH:
  866. f(10) = Hankel->Zgauss(10, TM, 1, rho, wavef, KernelManager->GetRAWKernel(ik[10])) / KernelManager->GetRAWKernel(ik[10])->GetYm();
  867. f(11) = Hankel->Zgauss(11, TM, 0, rho, wavef, KernelManager->GetRAWKernel(ik[11])) / KernelManager->GetRAWKernel(ik[11])->GetYm();
  868. this->Receivers->AppendEfield(ifreq, irec,
  869. -Pol[2]*QPI*cp*f(10)*Moment,
  870. -Pol[2]*QPI*sp*f(10)*Moment,
  871. Pol[2]*QPI*f(11)*Moment );
  872. f(12) = Hankel->Zgauss(12, TM, 1, rho, wavef, KernelManager->GetRAWKernel(ik[12]));
  873. this->Receivers->AppendHfield(ifreq, irec,
  874. -Pol[2]*QPI*sp*f(12)*Moment,
  875. Pol[2]*QPI*cp*f(12)*Moment,
  876. 0. );
  877. } // Fields to calculate Z polarity Electric dipole
  878. }
  879. if (std::abs(Pol[1]) > 0 || std::abs(Pol[0]) > 0) { // x or y dipole
  880. switch(FieldsToCalculate) {
  881. case E:
  882. f(2) = Hankel->Zgauss(2, TE, 0, rho, wavef, KernelManager->GetRAWKernel(ik[2])) * KernelManager->GetRAWKernel(ik[2])->GetZs();
  883. f(3) = Hankel->Zgauss(3, TE, 1, rho, wavef, KernelManager->GetRAWKernel(ik[3])) * KernelManager->GetRAWKernel(ik[3])->GetZs();
  884. f(0) = Hankel->Zgauss(0, TM, 0, rho, wavef, KernelManager->GetRAWKernel(ik[0])) / KernelManager->GetRAWKernel(ik[0])->GetYm();
  885. f(1) = Hankel->Zgauss(1, TM, 1, rho, wavef, KernelManager->GetRAWKernel(ik[1])) / KernelManager->GetRAWKernel(ik[1])->GetYm();
  886. f(4) = Hankel->Zgauss(4, TM, 1, rho, wavef, KernelManager->GetRAWKernel(ik[4])) / KernelManager->GetRAWKernel(ik[4])->GetYm();
  887. if (std::abs(Pol[1]) > 0) {
  888. this->Receivers->AppendEfield(ifreq, irec,
  889. Pol[1]*Moment*QPI*scp*((f(0)-(Real)(2.)*f(1)/rho)+(f(2)-(Real)(2.)*f(3)/rho)),
  890. Pol[1]*Moment*QPI*((sps*f(0)+c2p*f(1)/rho)-(cps*f(2)-c2p*f(3)/rho)),
  891. Pol[1]*Moment*QPI*sp*f(4));
  892. }
  893. if (std::abs(Pol[0]) > 0) {
  894. this->Receivers->AppendEfield(ifreq, irec,
  895. Pol[0]*Moment*QPI*((cps*f(0)-c2p*f(1)/rho)-(sps*f(2)+c2p*f(3)/rho)),
  896. Pol[0]*Moment*QPI*scp*((f(0)-(Real)(2.)*f(1)/rho)+(f(2)-(Real)(2.)*f(3)/rho)),
  897. Pol[0]*Moment*QPI*cp*f(4) );
  898. }
  899. break;
  900. case H:
  901. f(5) = Hankel->Zgauss(5, TM, 0, rho, wavef, KernelManager->GetRAWKernel(ik[5]));
  902. f(6) = Hankel->Zgauss(6, TM, 1, rho, wavef, KernelManager->GetRAWKernel(ik[6]));
  903. f(7) = Hankel->Zgauss(7, TE, 0, rho, wavef, KernelManager->GetRAWKernel(ik[7]))*KernelManager->GetRAWKernel(ik[7])->GetZs()/KernelManager->GetRAWKernel(ik[7])->GetZm();
  904. f(8) = Hankel->Zgauss(8, TE, 1, rho, wavef, KernelManager->GetRAWKernel(ik[8]))*KernelManager->GetRAWKernel(ik[8])->GetZs()/KernelManager->GetRAWKernel(ik[8])->GetZm();
  905. f(9) = Hankel->Zgauss(9, TE, 1, rho, wavef, KernelManager->GetRAWKernel(ik[9]))*KernelManager->GetRAWKernel(ik[9])->GetZs()/KernelManager->GetRAWKernel(ik[9])->GetZm();
  906. if (std::abs(Pol[1]) > 0) {
  907. this->Receivers->AppendHfield(ifreq, irec,
  908. Pol[1]*QPI*(sps*f(5)+c2p*f(6)/rho-cps*f(7)+c2p*f(8)/rho)*Moment,
  909. Pol[1]*QPI*scp*(-f(5)+(Real)(2.)*f(6)/rho-f(7)+(Real)(2.)*f(8)/rho)*Moment,
  910. -Pol[1]*QPI*cp*f(9)*Moment );
  911. }
  912. if (std::abs(Pol[0]) > 0) {
  913. this->Receivers->AppendHfield(ifreq, irec,
  914. Pol[0]*Moment*QPI*scp*(f(5)-(Real)(2.)*f(6)/rho+f(7)-(Real)(2.)*f(8)/rho),
  915. Pol[0]*Moment*QPI*(-cps*f(5)+c2p*f(6)/rho+sps*f(7)+c2p*f(8)/rho),
  916. Pol[0]*Moment*QPI*sp*f(9) );
  917. }
  918. break;
  919. case BOTH:
  920. f(0) = Hankel->Zgauss(0, TM, 0, rho, wavef, KernelManager->GetRAWKernel(ik[0])) / KernelManager->GetRAWKernel(ik[0])->GetYm();
  921. f(1) = Hankel->Zgauss(1, TM, 1, rho, wavef, KernelManager->GetRAWKernel(ik[1])) / KernelManager->GetRAWKernel(ik[1])->GetYm();
  922. f(4) = Hankel->Zgauss(4, TM, 1, rho, wavef, KernelManager->GetRAWKernel(ik[4])) / KernelManager->GetRAWKernel(ik[4])->GetYm();
  923. f(2) = Hankel->Zgauss(2, TE, 0, rho, wavef, KernelManager->GetRAWKernel(ik[2])) * KernelManager->GetRAWKernel(ik[2])->GetZs();
  924. f(3) = Hankel->Zgauss(3, TE, 1, rho, wavef, KernelManager->GetRAWKernel(ik[3])) * KernelManager->GetRAWKernel(ik[3])->GetZs();
  925. f(5) = Hankel->Zgauss(5, TM, 0, rho, wavef, KernelManager->GetRAWKernel(ik[5]));
  926. f(6) = Hankel->Zgauss(6, TM, 1, rho, wavef, KernelManager->GetRAWKernel(ik[6]));
  927. f(7) = Hankel->Zgauss(7, TE, 0, rho, wavef, KernelManager->GetRAWKernel(ik[7]))*KernelManager->GetRAWKernel(ik[7])->GetZs()/KernelManager->GetRAWKernel(ik[7])->GetZm();
  928. f(8) = Hankel->Zgauss(8, TE, 1, rho, wavef, KernelManager->GetRAWKernel(ik[8]))*KernelManager->GetRAWKernel(ik[8])->GetZs()/KernelManager->GetRAWKernel(ik[8])->GetZm();
  929. f(9) = Hankel->Zgauss(9, TE, 1, rho, wavef, KernelManager->GetRAWKernel(ik[9]))*KernelManager->GetRAWKernel(ik[9])->GetZs()/KernelManager->GetRAWKernel(ik[9])->GetZm();
  930. if (std::abs(Pol[1]) > 0) {
  931. this->Receivers->AppendEfield(ifreq, irec,
  932. Pol[1]*QPI*scp*((f(0)-(Real)(2.)*f(1)/rho)+(f(2)-(Real)(2.)*f(3)/rho))*Moment ,
  933. Pol[1]*QPI*((sps*f(0)+c2p*f(1)/rho)-(cps*f(2)-c2p*f(3)/rho))*Moment,
  934. Pol[1]*QPI*sp*f(4)*Moment);
  935. this->Receivers->AppendHfield(ifreq, irec,
  936. Pol[1]*QPI*(sps*f(5)+c2p*f(6)/rho-cps*f(7)+c2p*f(8)/rho)*Moment,
  937. Pol[1]*QPI*scp*(-f(5)+(Real)(2.)*f(6)/rho-f(7)+(Real)(2.)*f(8)/rho)*Moment,
  938. -Pol[1]*QPI*cp*f(9)*Moment );
  939. }
  940. if (std::abs(Pol[0]) > 0) {
  941. this->Receivers->AppendEfield(ifreq, irec,
  942. Pol[0]*Moment*QPI*((cps*f(0)-c2p*f(1)/rho)-(sps*f(2)+c2p*f(3)/rho)),
  943. Pol[0]*Moment*QPI*scp*((f(0)-(Real)(2.)*f(1)/rho)+(f(2)-(Real)(2.)*f(3)/rho)),
  944. Pol[0]*Moment*QPI*cp*f(4) );
  945. this->Receivers->AppendHfield(ifreq, irec,
  946. Pol[0]*Moment*QPI*scp*(f(5)-(Real)(2.)*f(6)/rho+f(7)-(Real)(2.)*f(8)/rho),
  947. Pol[0]*Moment*QPI*(-cps*f(5)+c2p*f(6)/rho+sps*f(7)+c2p*f(8)/rho),
  948. Pol[0]*Moment*QPI*sp*f(9) );
  949. }
  950. break;
  951. }
  952. }
  953. break; // GROUNDEDELECTRICDIPOLE
  954. case (GROUNDINGPOINT):
  955. if (std::abs(Pol[2]) > 0) { // z dipole
  956. switch(FieldsToCalculate) {
  957. case E:
  958. f(10) = Hankel->Zgauss(10, TM, 1, rho, wavef, KernelManager->GetRAWKernel(ik[10])) / KernelManager->GetRAWKernel(ik[10])->GetYm();
  959. f(11) = Hankel->Zgauss(11, TM, 0, rho, wavef, KernelManager->GetRAWKernel(ik[11])) / KernelManager->GetRAWKernel(ik[11])->GetYm();
  960. this->Receivers->AppendEfield(ifreq, irec,
  961. -Pol[2]*QPI*cp*f(10)*Moment,
  962. -Pol[2]*QPI*sp*f(10)*Moment,
  963. Pol[2]*QPI*f(11)*Moment);
  964. break;
  965. case H:
  966. f(12) = Hankel->Zgauss(12, TM, 1, rho, wavef, KernelManager->GetRAWKernel(ik[12]));
  967. this->Receivers->AppendHfield(ifreq, irec,
  968. -Pol[2]*QPI*sp*f(12)*Moment,
  969. Pol[2]*QPI*cp*f(12)*Moment,
  970. 0. );
  971. break;
  972. case BOTH:
  973. f(10) = Hankel->Zgauss(10, TM, 1, rho, wavef, KernelManager->GetRAWKernel(ik[10])) / KernelManager->GetRAWKernel(ik[10])->GetYm();
  974. f(11) = Hankel->Zgauss(11, TM, 0, rho, wavef, KernelManager->GetRAWKernel(ik[11])) / KernelManager->GetRAWKernel(ik[11])->GetYm();
  975. this->Receivers->AppendEfield(ifreq, irec,
  976. -Pol[2]*QPI*cp*f(10)*Moment,
  977. -Pol[2]*QPI*sp*f(10)*Moment,
  978. Pol[2]*QPI*f(11)*Moment );
  979. f(12) = Hankel->Zgauss(12, TM, 1, rho, wavef, KernelManager->GetRAWKernel(ik[12]));
  980. this->Receivers->AppendHfield(ifreq, irec,
  981. -Pol[2]*QPI*sp*f(12)*Moment,
  982. Pol[2]*QPI*cp*f(12)*Moment,
  983. 0. );
  984. } // Fields to calculate Z polarity Electric dipole
  985. }
  986. if (std::abs(Pol[1]) > 0 || std::abs(Pol[0]) > 0) { // x or y dipole
  987. switch(FieldsToCalculate) {
  988. case E:
  989. f(2) = 0;//Hankel->Zgauss(2, TE, 0, rho, wavef, KernelManager->GetRAWKernel(ik[2])) * KernelManager->GetRAWKernel(ik[2])->GetZs();
  990. f(3) = 0;//Hankel->Zgauss(3, TE, 1, rho, wavef, KernelManager->GetRAWKernel(ik[3])) * KernelManager->GetRAWKernel(ik[3])->GetZs();
  991. f(0) = Hankel->Zgauss(0, TM, 0, rho, wavef, KernelManager->GetRAWKernel(ik[0])) / KernelManager->GetRAWKernel(ik[0])->GetYm();
  992. f(1) = Hankel->Zgauss(1, TM, 1, rho, wavef, KernelManager->GetRAWKernel(ik[1])) / KernelManager->GetRAWKernel(ik[1])->GetYm();
  993. f(4) = Hankel->Zgauss(4, TM, 1, rho, wavef, KernelManager->GetRAWKernel(ik[4])) / KernelManager->GetRAWKernel(ik[4])->GetYm();
  994. if (std::abs(Pol[1]) > 0) {
  995. this->Receivers->AppendEfield(ifreq, irec,
  996. 0,0,0);
  997. //Pol[1]*QPI*Moment*scp*(f(0)+f(2)),
  998. //Pol[1]*QPI*Moment*((sps*f(0)+c2p*f(1)/rho)),
  999. //Pol[1]*QPI*Moment*(f(0)+f(2)),
  1000. //Pol[1]*QPI*Moment*((f(0)+f(1)/rho)),
  1001. //Pol[1]*QPI*sp*f(4)*Moment);
  1002. // std dipole
  1003. //Pol[1]*QPI*scp*((f(0)-(Real)(2.)*f(1)/rho)+(f(2)-(Real)(2.)*f(3)/rho))*Moment ,
  1004. //Pol[1]*QPI*((sps*f(0)+c2p*f(1)/rho)-(cps*f(2)-c2p*f(3)/rho))*Moment,
  1005. //Pol[1]*QPI*sp*f(4)*Moment);
  1006. }
  1007. if (std::abs(Pol[0]) > 0) {
  1008. this->Receivers->AppendEfield(ifreq, irec,
  1009. Pol[0]*Moment*QPI*((cps*f(0)-c2p*f(1)/rho)), //-(sps*f(2)+c2p*f(3)/rho)),
  1010. Pol[0]*Moment*QPI*scp*((f(0)-(Real)(2.)*f(1)/rho)), //+(f(2)-(Real)(2.)*f(3)/rho)),
  1011. Pol[0]*Moment*QPI*cp*f(4) );
  1012. }
  1013. break;
  1014. case H:
  1015. f(5) = Hankel->Zgauss(5, TM, 0, rho, wavef, KernelManager->GetRAWKernel(ik[5]));
  1016. f(6) = Hankel->Zgauss(6, TM, 1, rho, wavef, KernelManager->GetRAWKernel(ik[6]));
  1017. f(7) = Hankel->Zgauss(7, TE, 0, rho, wavef, KernelManager->GetRAWKernel(ik[7]))*KernelManager->GetRAWKernel(ik[7])->GetZs()/KernelManager->GetRAWKernel(ik[7])->GetZm();
  1018. f(8) = Hankel->Zgauss(8, TE, 1, rho, wavef, KernelManager->GetRAWKernel(ik[8]))*KernelManager->GetRAWKernel(ik[8])->GetZs()/KernelManager->GetRAWKernel(ik[8])->GetZm();
  1019. f(9) = Hankel->Zgauss(9, TE, 1, rho, wavef, KernelManager->GetRAWKernel(ik[9]))*KernelManager->GetRAWKernel(ik[9])->GetZs()/KernelManager->GetRAWKernel(ik[9])->GetZm();
  1020. if (std::abs(Pol[1]) > 0) {
  1021. this->Receivers->AppendHfield(ifreq, irec,
  1022. Pol[1]*QPI*(sps*f(5)+c2p*f(6)/rho-cps*f(7)+c2p*f(8)/rho)*Moment,
  1023. Pol[1]*QPI*scp*(-f(5)+(Real)(2.)*f(6)/rho-f(7)+(Real)(2.)*f(8)/rho)*Moment,
  1024. -Pol[1]*QPI*cp*f(9)*Moment );
  1025. }
  1026. if (std::abs(Pol[0]) > 0) {
  1027. this->Receivers->AppendHfield(ifreq, irec,
  1028. Pol[0]*Moment*QPI*scp*(f(5)-(Real)(2.)*f(6)/rho+f(7)-(Real)(2.)*f(8)/rho),
  1029. Pol[0]*Moment*QPI*(-cps*f(5)+c2p*f(6)/rho+sps*f(7)+c2p*f(8)/rho),
  1030. Pol[0]*Moment*QPI*sp*f(9) );
  1031. }
  1032. break;
  1033. case BOTH:
  1034. f(0) = Hankel->Zgauss(0, TM, 0, rho, wavef, KernelManager->GetRAWKernel(ik[0])) / KernelManager->GetRAWKernel(ik[0])->GetYm();
  1035. f(1) = Hankel->Zgauss(1, TM, 1, rho, wavef, KernelManager->GetRAWKernel(ik[1])) / KernelManager->GetRAWKernel(ik[1])->GetYm();
  1036. f(4) = Hankel->Zgauss(4, TM, 1, rho, wavef, KernelManager->GetRAWKernel(ik[4])) / KernelManager->GetRAWKernel(ik[4])->GetYm();
  1037. f(2) = Hankel->Zgauss(2, TE, 0, rho, wavef, KernelManager->GetRAWKernel(ik[2])) * KernelManager->GetRAWKernel(ik[2])->GetZs();
  1038. f(3) = Hankel->Zgauss(3, TE, 1, rho, wavef, KernelManager->GetRAWKernel(ik[3])) * KernelManager->GetRAWKernel(ik[3])->GetZs();
  1039. f(5) = Hankel->Zgauss(5, TM, 0, rho, wavef, KernelManager->GetRAWKernel(ik[5]));
  1040. f(6) = Hankel->Zgauss(6, TM, 1, rho, wavef, KernelManager->GetRAWKernel(ik[6]));
  1041. f(7) = Hankel->Zgauss(7, TE, 0, rho, wavef, KernelManager->GetRAWKernel(ik[7]))*KernelManager->GetRAWKernel(ik[7])->GetZs()/KernelManager->GetRAWKernel(ik[7])->GetZm();
  1042. f(8) = Hankel->Zgauss(8, TE, 1, rho, wavef, KernelManager->GetRAWKernel(ik[8]))*KernelManager->GetRAWKernel(ik[8])->GetZs()/KernelManager->GetRAWKernel(ik[8])->GetZm();
  1043. f(9) = Hankel->Zgauss(9, TE, 1, rho, wavef, KernelManager->GetRAWKernel(ik[9]))*KernelManager->GetRAWKernel(ik[9])->GetZs()/KernelManager->GetRAWKernel(ik[9])->GetZm();
  1044. if (std::abs(Pol[1]) > 0) {
  1045. this->Receivers->AppendEfield(ifreq, irec,
  1046. Pol[1]*QPI*scp*((f(0)-(Real)(2.)*f(1)/rho)+(f(2)-(Real)(2.)*f(3)/rho))*Moment ,
  1047. Pol[1]*QPI*((sps*f(0)+c2p*f(1)/rho)-(cps*f(2)-c2p*f(3)/rho))*Moment,
  1048. Pol[1]*QPI*sp*f(4)*Moment);
  1049. this->Receivers->AppendHfield(ifreq, irec,
  1050. Pol[1]*QPI*(sps*f(5)+c2p*f(6)/rho-cps*f(7)+c2p*f(8)/rho)*Moment,
  1051. Pol[1]*QPI*scp*(-f(5)+(Real)(2.)*f(6)/rho-f(7)+(Real)(2.)*f(8)/rho)*Moment,
  1052. -Pol[1]*QPI*cp*f(9)*Moment );
  1053. }
  1054. if (std::abs(Pol[0]) > 0) {
  1055. this->Receivers->AppendEfield(ifreq, irec,
  1056. Pol[0]*Moment*QPI*((cps*f(0)-c2p*f(1)/rho)-(sps*f(2)+c2p*f(3)/rho)),
  1057. Pol[0]*Moment*QPI*scp*((f(0)-(Real)(2.)*f(1)/rho)+(f(2)-(Real)(2.)*f(3)/rho)),
  1058. Pol[0]*Moment*QPI*cp*f(4) );
  1059. this->Receivers->AppendHfield(ifreq, irec,
  1060. Pol[0]*Moment*QPI*scp*(f(5)-(Real)(2.)*f(6)/rho+f(7)-(Real)(2.)*f(8)/rho),
  1061. Pol[0]*Moment*QPI*(-cps*f(5)+c2p*f(6)/rho+sps*f(7)+c2p*f(8)/rho),
  1062. Pol[0]*Moment*QPI*sp*f(9) );
  1063. }
  1064. break;
  1065. }
  1066. }
  1067. break; // GROUNDINGPOINT
  1068. case UNGROUNDEDELECTRICDIPOLE:
  1069. if (std::abs(Pol[2]) > 0) { // z dipole
  1070. switch(FieldsToCalculate) {
  1071. case E:
  1072. f(10) = 0;
  1073. f(11) = Hankel->Zgauss(11, TM, 0, rho, wavef, KernelManager->GetRAWKernel(ik[11])) / KernelManager->GetRAWKernel(ik[11])->GetYm();
  1074. this->Receivers->AppendEfield(ifreq, irec,
  1075. -Pol[2]*QPI*cp*f(10)*Moment,
  1076. -Pol[2]*QPI*sp*f(10)*Moment,
  1077. Pol[2]*QPI*f(11)*Moment);
  1078. break;
  1079. case H:
  1080. f(12) = Hankel->Zgauss(12, TM, 1, rho, wavef, KernelManager->GetRAWKernel(ik[12]));
  1081. this->Receivers->AppendHfield(ifreq, irec,
  1082. -Pol[2]*QPI*sp*f(12)*Moment,
  1083. Pol[2]*QPI*cp*f(12)*Moment,
  1084. 0. );
  1085. break;
  1086. case BOTH:
  1087. f(10) = 0;
  1088. f(11) = Hankel->Zgauss(11, TM, 0, rho, wavef, KernelManager->GetRAWKernel(ik[11])) / KernelManager->GetRAWKernel(ik[11])->GetYm();
  1089. this->Receivers->AppendEfield(ifreq, irec,
  1090. -Pol[2]*QPI*cp*f(10)*Moment,
  1091. -Pol[2]*QPI*sp*f(10)*Moment,
  1092. Pol[2]*QPI*f(11)*Moment );
  1093. f(12) = Hankel->Zgauss(12, TM, 1, rho, wavef, KernelManager->GetRAWKernel(ik[12]));
  1094. this->Receivers->AppendHfield(ifreq, irec,
  1095. -Pol[2]*QPI*sp*f(12)*Moment,
  1096. Pol[2]*QPI*cp*f(12)*Moment,
  1097. 0. );
  1098. } // Fields to calculate Z polarity Electric dipole
  1099. }
  1100. if (std::abs(Pol[1]) > 0 || std::abs(Pol[0]) > 0) { // x or y dipole
  1101. switch(FieldsToCalculate) {
  1102. case E:
  1103. //f(0) = 0;
  1104. //f(1) = 0;
  1105. //f(2) = Hankel->Zgauss(2, TE, 0, rho, wavef, KernelManager->GetRAWKernel(ik[2])) * KernelManager->GetRAWKernel(ik[2])->GetZs();
  1106. //f(3) = Hankel->Zgauss(3, TE, 1, rho, wavef, KernelManager->GetRAWKernel(ik[3])) * KernelManager->GetRAWKernel(ik[3])->GetZs();
  1107. //f(4) = 0;
  1108. f(2) = Hankel->Zgauss(2, TE, 0, rho, wavef, KernelManager->GetRAWKernel(ik[2])) * KernelManager->GetRAWKernel(ik[2])->GetZs();
  1109. f(3) = Hankel->Zgauss(3, TE, 1, rho, wavef, KernelManager->GetRAWKernel(ik[3])) * KernelManager->GetRAWKernel(ik[3])->GetZs();
  1110. f(0) = Hankel->Zgauss(0, TM, 0, rho, wavef, KernelManager->GetRAWKernel(ik[0])) / KernelManager->GetRAWKernel(ik[0])->GetYm();
  1111. f(1) = Hankel->Zgauss(1, TM, 1, rho, wavef, KernelManager->GetRAWKernel(ik[1])) / KernelManager->GetRAWKernel(ik[1])->GetYm();
  1112. f(4) = Hankel->Zgauss(4, TM, 1, rho, wavef, KernelManager->GetRAWKernel(ik[4])) / KernelManager->GetRAWKernel(ik[4])->GetYm();
  1113. if (std::abs(Pol[1]) > 0) {
  1114. this->Receivers->AppendEfield(ifreq, irec,
  1115. Pol[1]*QPI*scp*((f(0)-(Real)(2.)*f(1)/rho)+(f(2)-(Real)(2.)*f(3)/rho))*Moment,
  1116. Pol[1]*QPI*((sps*f(0)+c2p*f(1)/rho)-(cps*f(2)-c2p*f(3)/rho))*Moment,
  1117. Pol[1]*QPI*sp*f(4)*Moment);
  1118. }
  1119. if (std::abs(Pol[0]) > 0) {
  1120. this->Receivers->AppendEfield(ifreq, irec,
  1121. Pol[0]*Moment*QPI*((cps*f(0)-c2p*f(1)/rho)-(sps*f(2)+c2p*f(3)/rho)),
  1122. Pol[0]*Moment*QPI*scp*((f(0)-(Real)(2.)*f(1)/rho)+(f(2)-(Real)(2.)*f(3)/rho)),
  1123. Pol[0]*Moment*QPI*cp*f(4) );
  1124. }
  1125. break;
  1126. case H:
  1127. // TI - Comparisons with Amira show slight better agreement when neglecting these grounding terms
  1128. f(5) = 0; //Hankel->Zgauss(5, TM, 0, rho, wavef, KernelManager->GetRAWKernel(ik[5]));
  1129. f(6) = 0; //Hankel->Zgauss(6, TM, 1, rho, wavef, KernelManager->GetRAWKernel(ik[6]));
  1130. f(7) = Hankel->Zgauss(7, TE, 0, rho, wavef, KernelManager->GetRAWKernel(ik[7]))*KernelManager->GetRAWKernel(ik[7])->GetZs()/KernelManager->GetRAWKernel(ik[7])->GetZm();
  1131. f(8) = Hankel->Zgauss(8, TE, 1, rho, wavef, KernelManager->GetRAWKernel(ik[8]))*KernelManager->GetRAWKernel(ik[8])->GetZs()/KernelManager->GetRAWKernel(ik[8])->GetZm();
  1132. f(9) = Hankel->Zgauss(9, TE, 1, rho, wavef, KernelManager->GetRAWKernel(ik[9]))*KernelManager->GetRAWKernel(ik[9])->GetZs()/KernelManager->GetRAWKernel(ik[9])->GetZm();
  1133. if (std::abs(Pol[1]) > 0) {
  1134. this->Receivers->AppendHfield(ifreq, irec,
  1135. Pol[1]*QPI*(sps*f(5)+c2p*f(6)/rho-cps*f(7)+c2p*f(8)/rho)*Moment,
  1136. Pol[1]*QPI*scp*(-f(5)+(Real)(2.)*f(6)/rho-f(7)+(Real)(2.)*f(8)/rho)*Moment,
  1137. -Pol[1]*QPI*cp*f(9)*Moment );
  1138. }
  1139. if (std::abs(Pol[0]) > 0) {
  1140. this->Receivers->AppendHfield(ifreq, irec,
  1141. Pol[0]*Moment*QPI*scp*(f(5)-(Real)(2.)*f(6)/rho+f(7)-(Real)(2.)*f(8)/rho),
  1142. Pol[0]*Moment*QPI*(-cps*f(5)+c2p*f(6)/rho+sps*f(7)+c2p*f(8)/rho),
  1143. Pol[0]*Moment*QPI*sp*f(9) );
  1144. }
  1145. break;
  1146. case BOTH:
  1147. f(0) = 0;
  1148. f(1) = 0;
  1149. f(4) = 0;
  1150. f(2) = Hankel->Zgauss(2, TE, 0, rho, wavef, KernelManager->GetRAWKernel(ik[2])) * KernelManager->GetRAWKernel(0)->GetZs();
  1151. f(3) = Hankel->Zgauss(3, TE, 1, rho, wavef, KernelManager->GetRAWKernel(ik[3])) * KernelManager->GetRAWKernel(1)->GetZs();
  1152. f(5) = 0;//Hankel->Zgauss(5, TM, 0, rho, wavef, KernelManager->GetRAWKernel(ik[5]));
  1153. f(6) = 0;//Hankel->Zgauss(6, TM, 1, rho, wavef, KernelManager->GetRAWKernel(ik[6]));
  1154. f(7) = Hankel->Zgauss(7, TE, 0, rho, wavef, KernelManager->GetRAWKernel(ik[7]))*KernelManager->GetRAWKernel(ik[7])->GetZs()/KernelManager->GetRAWKernel(ik[7])->GetZm();
  1155. f(8) = Hankel->Zgauss(8, TE, 1, rho, wavef, KernelManager->GetRAWKernel(ik[8]))*KernelManager->GetRAWKernel(ik[8])->GetZs()/KernelManager->GetRAWKernel(ik[8])->GetZm();
  1156. f(9) = Hankel->Zgauss(9, TE, 1, rho, wavef, KernelManager->GetRAWKernel(ik[9]))*KernelManager->GetRAWKernel(ik[9])->GetZs()/KernelManager->GetRAWKernel(ik[9])->GetZm();
  1157. if (std::abs(Pol[1]) > 0) {
  1158. this->Receivers->AppendEfield(ifreq, irec,
  1159. Pol[1]*QPI*scp*((f(0)-(Real)(2.)*f(1)/rho)+(f(2)-(Real)(2.)*f(3)/rho))*Moment ,
  1160. Pol[1]*QPI*((sps*f(0)+c2p*f(1)/rho)-(cps*f(2)-c2p*f(3)/rho))*Moment,
  1161. Pol[1]*QPI*sp*f(4)*Moment);
  1162. this->Receivers->AppendHfield(ifreq, irec,
  1163. Pol[1]*QPI*(sps*f(5)+c2p*f(6)/rho-cps*f(7)+c2p*f(8)/rho)*Moment,
  1164. Pol[1]*QPI*scp*(-f(5)+(Real)(2.)*f(6)/rho-f(7)+(Real)(2.)*f(8)/rho)*Moment,
  1165. -Pol[1]*QPI*cp*f(9)*Moment );
  1166. }
  1167. if (std::abs(Pol[0]) > 0) {
  1168. this->Receivers->AppendEfield(ifreq, irec,
  1169. Pol[0]*Moment*QPI*((cps*f(0)-c2p*f(1)/rho)-(sps*f(2)+c2p*f(3)/rho)),
  1170. Pol[0]*Moment*QPI*scp*((f(0)-(Real)(2.)*f(1)/rho)+(f(2)-(Real)(2.)*f(3)/rho)),
  1171. Pol[0]*Moment*QPI*cp*f(4) );
  1172. this->Receivers->AppendHfield(ifreq, irec,
  1173. Pol[0]*Moment*QPI*scp*(f(5)-(Real)(2.)*f(6)/rho+f(7)-(Real)(2.)*f(8)/rho),
  1174. Pol[0]*Moment*QPI*(-cps*f(5)+c2p*f(6)/rho+sps*f(7)+c2p*f(8)/rho),
  1175. Pol[0]*Moment*QPI*sp*f(9) );
  1176. }
  1177. break;
  1178. }
  1179. }
  1180. break; // UNGROUNDEDELECTRICDIPOLE
  1181. case MAGNETICDIPOLE:
  1182. //Hankel->ComputeRelated(rho, KernelManager);
  1183. if (std::abs(Pol[2]) > 0) { // z dipole
  1184. switch(FieldsToCalculate) {
  1185. case E:
  1186. f(12)=Hankel->Zgauss(12, TE, 1, rho, wavef, KernelManager->GetRAWKernel(ik[12]))*KernelManager->GetRAWKernel(ik[12])->GetZs();
  1187. this->Receivers->AppendEfield(ifreq, irec,
  1188. Pol[2]*Moment*QPI*sp*f(12),
  1189. -Pol[2]*Moment*QPI*cp*f(12),
  1190. 0);
  1191. break;
  1192. case H:
  1193. f(10)=Hankel->Zgauss(10, TE, 1, rho, wavef, KernelManager->GetRAWKernel(ik[10]))*KernelManager->GetRAWKernel(ik[10])->GetZs()/KernelManager->GetRAWKernel(ik[10])->GetZm();
  1194. f(11)=Hankel->Zgauss(11, TE, 0, rho, wavef, KernelManager->GetRAWKernel(ik[11]))*KernelManager->GetRAWKernel(ik[11])->GetZs()/KernelManager->GetRAWKernel(ik[11])->GetZm();
  1195. this->Receivers->AppendHfield(ifreq, irec,
  1196. -Pol[2]*Moment*QPI*cp*f(10),
  1197. -Pol[2]*Moment*QPI*sp*f(10),
  1198. Pol[2]*Moment*QPI*f(11) );
  1199. break;
  1200. case BOTH:
  1201. f(12)=Hankel->Zgauss(12, TE, 1, rho, wavef, KernelManager->GetRAWKernel(ik[12]))*KernelManager->GetRAWKernel(ik[12])->GetZs();
  1202. f(10)=Hankel->Zgauss(10, TE, 1, rho, wavef, KernelManager->GetRAWKernel(ik[10]))*KernelManager->GetRAWKernel(ik[10])->GetZs()/KernelManager->GetRAWKernel(ik[10])->GetZm();
  1203. f(11)=Hankel->Zgauss(11, TE, 0, rho, wavef, KernelManager->GetRAWKernel(ik[11]))*KernelManager->GetRAWKernel(ik[11])->GetZs()/KernelManager->GetRAWKernel(ik[11])->GetZm();
  1204. this->Receivers->AppendEfield(ifreq, irec,
  1205. Pol[2]*Moment*QPI*sp*f(12),
  1206. -Pol[2]*Moment*QPI*cp*f(12),
  1207. 0);
  1208. this->Receivers->AppendHfield(ifreq, irec,
  1209. -Pol[2]*Moment*QPI*cp*f(10),
  1210. -Pol[2]*Moment*QPI*sp*f(10),
  1211. Pol[2]*Moment*QPI*f(11) );
  1212. break;
  1213. }
  1214. }
  1215. if (std::abs(Pol[1]) > 0 || std::abs(Pol[0]) > 0) { // x or y grounded HED dipole
  1216. switch (FieldsToCalculate) {
  1217. case E:
  1218. f(5) = Hankel->Zgauss(5, TE, 0, rho, wavef, KernelManager->GetRAWKernel(ik[5]))*KernelManager->GetRAWKernel(ik[5])->GetZs();
  1219. f(6) = Hankel->Zgauss(6, TE, 1, rho, wavef, KernelManager->GetRAWKernel(ik[6]))*KernelManager->GetRAWKernel(ik[6])->GetZs();
  1220. f(7) = Hankel->Zgauss(7, TM, 0, rho, wavef, KernelManager->GetRAWKernel(ik[7]))*KernelManager->GetRAWKernel(ik[7])->GetKs()/KernelManager->GetRAWKernel(ik[7])->GetYm();
  1221. f(8) = Hankel->Zgauss(8, TM, 1, rho, wavef, KernelManager->GetRAWKernel(ik[8]))*KernelManager->GetRAWKernel(ik[8])->GetKs()/KernelManager->GetRAWKernel(ik[8])->GetYm();
  1222. f(9) = Hankel->Zgauss(9, TM, 1, rho, wavef, KernelManager->GetRAWKernel(ik[9]))*KernelManager->GetRAWKernel(ik[9])->GetKs()/KernelManager->GetRAWKernel(ik[9])->GetYm();
  1223. if (std::abs(Pol[0]) > 0) {
  1224. this->Receivers->AppendEfield(ifreq, irec,
  1225. Pol[0]*Moment*QPI*scp*((-f(5)+(Real)(2.)*f(6)/rho)+(f(7)-(Real)(2.)*f(8)/rho)),
  1226. Pol[0]*Moment*QPI*((cps*f(5)-c2p*f(6)/rho)+(sps*f(7)+c2p*f(8)/rho)),
  1227. Pol[0]*Moment*QPI*sp*f(9));
  1228. }
  1229. if (std::abs(Pol[1]) > 0) {
  1230. this->Receivers->AppendEfield(ifreq, irec,
  1231. Pol[1]*Moment*QPI*(-(sps*f(5)+c2p*f(6)/rho)-(cps*f(7)-c2p*f(8)/rho)),
  1232. Pol[1]*Moment*QPI*scp*((f(5)-(Real)(2.)*f(6)/rho)-(f(7)-(Real)(2.)*f(8)/rho)),
  1233. -Pol[1]*Moment*QPI*cp*f(9) );
  1234. }
  1235. break;
  1236. case H:
  1237. f(0) = Hankel->Zgauss(0, TE, 0, rho, wavef, KernelManager->GetRAWKernel(ik[0]))*KernelManager->GetRAWKernel(ik[0])->GetZs()/KernelManager->GetRAWKernel(ik[0])->GetZm();
  1238. f(1) = Hankel->Zgauss(1, TE, 1, rho, wavef, KernelManager->GetRAWKernel(ik[1]))*KernelManager->GetRAWKernel(ik[1])->GetZs()/KernelManager->GetRAWKernel(ik[1])->GetZm();
  1239. f(4) = Hankel->Zgauss(4, TE, 1, rho, wavef, KernelManager->GetRAWKernel(ik[4]))*KernelManager->GetRAWKernel(ik[4])->GetZs()/KernelManager->GetRAWKernel(ik[4])->GetZm();
  1240. f(2) = Hankel->Zgauss(2, TM, 0, rho, wavef, KernelManager->GetRAWKernel(ik[2]))*KernelManager->GetRAWKernel(ik[2])->GetKs();
  1241. f(3) = Hankel->Zgauss(3, TM, 1, rho, wavef, KernelManager->GetRAWKernel(ik[3]))*KernelManager->GetRAWKernel(ik[3])->GetKs();
  1242. if (std::abs(Pol[0]) > 0) {
  1243. this->Receivers->AppendHfield(ifreq, irec,
  1244. Pol[0]*Moment*QPI*(cps*f(0)-c2p*f(1)/rho+(sps*f(2)+c2p*f(3)/rho)),
  1245. Pol[0]*Moment*QPI*scp*(f(0)-(Real)(2.)*f(1)/rho-(f(2)-(Real)(2.)*f(3)/rho)),
  1246. Pol[0]*Moment*QPI*cp*f(4) );
  1247. }
  1248. if (std::abs(Pol[1]) > 0) {
  1249. this->Receivers->AppendHfield(ifreq, irec,
  1250. Pol[1]*Moment*QPI*scp*(f(0)-(Real)(2.)*f(1)/rho-(f(2)-(Real)(2.)*f(3)/rho)),
  1251. Pol[1]*Moment*QPI*(sps*f(0)+c2p*f(1)/rho+(cps*f(2)-c2p*f(3)/rho)),
  1252. Pol[1]*Moment*QPI*sp*f(4));
  1253. }
  1254. break;
  1255. case BOTH:
  1256. f(5) = Hankel->Zgauss(5, TE, 0, rho, wavef, KernelManager->GetRAWKernel(ik[5]))*KernelManager->GetRAWKernel(ik[5])->GetZs();
  1257. f(6) = Hankel->Zgauss(6, TE, 1, rho, wavef, KernelManager->GetRAWKernel(ik[6]))*KernelManager->GetRAWKernel(ik[6])->GetZs();
  1258. f(7) = Hankel->Zgauss(7, TM, 0, rho, wavef, KernelManager->GetRAWKernel(ik[7]))*KernelManager->GetRAWKernel(ik[7])->GetKs()/KernelManager->GetRAWKernel(ik[7])->GetYm();
  1259. f(8) = Hankel->Zgauss(8, TM, 1, rho, wavef, KernelManager->GetRAWKernel(ik[8]))*KernelManager->GetRAWKernel(ik[8])->GetKs()/KernelManager->GetRAWKernel(ik[8])->GetYm();
  1260. f(9) = Hankel->Zgauss(9, TM, 1, rho, wavef, KernelManager->GetRAWKernel(ik[9]))*KernelManager->GetRAWKernel(ik[9])->GetKs()/KernelManager->GetRAWKernel(ik[9])->GetYm();
  1261. f(0) = Hankel->Zgauss(0, TE, 0, rho, wavef, KernelManager->GetRAWKernel(ik[0]))*KernelManager->GetRAWKernel(ik[0])->GetZs()/KernelManager->GetRAWKernel(ik[0])->GetZm();
  1262. f(1) = Hankel->Zgauss(1, TE, 1, rho, wavef, KernelManager->GetRAWKernel(ik[1]))*KernelManager->GetRAWKernel(ik[1])->GetZs()/KernelManager->GetRAWKernel(ik[1])->GetZm();
  1263. f(4) = Hankel->Zgauss(4, TE, 1, rho, wavef, KernelManager->GetRAWKernel(ik[4]))*KernelManager->GetRAWKernel(ik[4])->GetZs()/KernelManager->GetRAWKernel(ik[4])->GetZm();
  1264. f(2) = Hankel->Zgauss(2, TM, 0, rho, wavef, KernelManager->GetRAWKernel(ik[2]))*KernelManager->GetRAWKernel(ik[2])->GetKs();
  1265. f(3) = Hankel->Zgauss(3, TM, 1, rho, wavef, KernelManager->GetRAWKernel(ik[3]))*KernelManager->GetRAWKernel(ik[3])->GetKs();
  1266. if (std::abs(Pol[0]) > 0) {
  1267. this->Receivers->AppendEfield(ifreq, irec,
  1268. Pol[0]*Moment*QPI*scp*((-f(5)+(Real)(2.)*f(6)/rho)+(f(7)-(Real)(2.)*f(8)/rho)),
  1269. Pol[0]*Moment*QPI*((cps*f(5)-c2p*f(6)/rho)+(sps*f(7)+c2p*f(8)/rho)),
  1270. Pol[0]*Moment*QPI*sp*f(9));
  1271. this->Receivers->AppendHfield(ifreq, irec,
  1272. Pol[0]*Moment*QPI*(cps*f(0)-c2p*f(1)/rho+(sps*f(2)+c2p*f(3)/rho)),
  1273. Pol[0]*Moment*QPI*scp*(f(0)-(Real)(2.)*f(1)/rho-(f(2)-(Real)(2.)*f(3)/rho)),
  1274. Pol[0]*Moment*QPI*cp*f(4) );
  1275. }
  1276. if (std::abs(Pol[1]) > 0) {
  1277. this->Receivers->AppendEfield(ifreq, irec,
  1278. Pol[1]*Moment*QPI*(-(sps*f(5)+c2p*f(6)/rho)-(cps*f(7)-c2p*f(8)/rho)),
  1279. Pol[1]*Moment*QPI*scp*((f(5)-(Real)(2.)*f(6)/rho)-(f(7)-(Real)(2.)*f(8)/rho)),
  1280. -Pol[1]*Moment*QPI*cp*f(9) );
  1281. this->Receivers->AppendHfield(ifreq, irec,
  1282. Pol[1]*Moment*QPI*scp*(f(0)-(Real)(2.)*f(1)/rho-(f(2)-(Real)(2.)*f(3)/rho)),
  1283. Pol[1]*Moment*QPI*(sps*f(0)+c2p*f(1)/rho+(cps*f(2)-c2p*f(3)/rho)),
  1284. Pol[1]*Moment*QPI*sp*f(4));
  1285. }
  1286. break;
  1287. }
  1288. }
  1289. break;
  1290. case NOSOURCETYPE:
  1291. throw NonValidDipoleType(this);
  1292. } // Source Type Switch
  1293. }
  1294. // ==================== INQUIRY ======================
  1295. std::shared_ptr<KernelEM1DManager> DipoleSource::GetKernelManager() {
  1296. return KernelManager;
  1297. }
  1298. Vector3r DipoleSource::GetLocation() {
  1299. return this->Location;
  1300. }
  1301. #ifdef LEMMAUSEVTK
  1302. vtkActor* DipoleSource::GetVtkActor() {
  1303. vtkActor* vActor;
  1304. vtkLineSource* vLineSource;
  1305. vtkTubeFilter* vTube;
  1306. vtkPolyDataMapper* vMapper;
  1307. vtkRegularPolygonSource* vCircleSource;
  1308. vLineSource = vtkLineSource::New();
  1309. vTube = vtkTubeFilter::New();
  1310. vMapper = vtkPolyDataMapper::New();
  1311. vCircleSource = vtkRegularPolygonSource::New();
  1312. VectorXr M0 = Location - .5*Moment*Phat;
  1313. VectorXr M1 = Location + .5*Moment*Phat;
  1314. vActor = vtkActor::New();
  1315. switch (Type) {
  1316. case GROUNDEDELECTRICDIPOLE:
  1317. vLineSource->SetPoint1( M0(0), M0(1), M0(2));
  1318. vLineSource->SetPoint2( M1(0), M1(1), M1(2));
  1319. vTube->SetInputConnection(vLineSource->GetOutputPort());
  1320. vTube->SetRadius(.1 * std::abs(Moment));
  1321. vTube->SetNumberOfSides(6);
  1322. vTube->SetCapping(1);
  1323. vMapper->SetInputConnection(vTube->GetOutputPort());
  1324. vActor->SetMapper(vMapper);
  1325. vActor->GetProperty()->SetColor(Phat[0], Phat[1], Phat[2]);
  1326. break;
  1327. case UNGROUNDEDELECTRICDIPOLE:
  1328. vLineSource->SetPoint1( M0(0), M0(1), M0(2));
  1329. vLineSource->SetPoint2( M1(0), M1(1), M1(2));
  1330. vTube->SetInputConnection(vLineSource->GetOutputPort());
  1331. vTube->SetRadius(.1 * std::abs(Moment));
  1332. vTube->SetNumberOfSides(6);
  1333. vTube->SetCapping(1);
  1334. vMapper->SetInputConnection(vTube->GetOutputPort());
  1335. vActor->SetMapper(vMapper);
  1336. //vActor->GetProperty()->SetColor(Phat[0], Phat[1], Phat[2]);
  1337. vActor->GetProperty()->SetColor(rand()/(Real)(RAND_MAX), rand()/(Real)(RAND_MAX), rand()/(Real)(RAND_MAX));
  1338. vActor->GetProperty()->SetOpacity(1.);
  1339. break;
  1340. case MAGNETICDIPOLE:
  1341. vCircleSource->SetCenter(Location(0), Location(1),
  1342. Location(2));
  1343. vCircleSource->SetNumberOfSides(360);
  1344. vCircleSource->SetNormal(Phat[0], Phat[1], Phat[2]);
  1345. vCircleSource->SetRadius(0.2); // .2 m radius
  1346. vCircleSource->SetGeneratePolygon(false);
  1347. vCircleSource->SetGeneratePolyline(true);
  1348. vCircleSource->Update();
  1349. vTube->SetInputConnection(vCircleSource->GetOutputPort());
  1350. //vTube->SetRadius( max((float)(*xCoords->GetTuple(nx)),
  1351. // (float)(*yCoords->GetTuple(ny))) / 100);
  1352. vTube->SetRadius(.1*std::abs(Moment));
  1353. vTube->SetNumberOfSides(6);
  1354. vTube->SetCapping(1);
  1355. vMapper->SetInputConnection(vTube->GetOutputPort());
  1356. vActor->SetMapper(vMapper);
  1357. vActor->GetProperty()->SetColor(.9,.2,.9);
  1358. break;
  1359. default:
  1360. throw NonValidDipoleType();
  1361. }
  1362. vLineSource->Delete();
  1363. vCircleSource->Delete();
  1364. vTube->Delete();
  1365. vMapper->Delete();
  1366. return vActor;
  1367. }
  1368. #endif
  1369. Real DipoleSource::GetLocation(const int& coordinate) {
  1370. switch (coordinate) {
  1371. case (0):
  1372. return this->Location.x();
  1373. //break; // implicit
  1374. case (1):
  1375. return this->Location.y();
  1376. //break; // implicit
  1377. case (2):
  1378. return this->Location.z();
  1379. //break; // implicit
  1380. default:
  1381. throw NonValidLocationCoordinate( );
  1382. }
  1383. }
  1384. DIPOLESOURCETYPE DipoleSource::GetDipoleSourceType() {
  1385. return this->Type;
  1386. }
  1387. //DipoleSourcePolarisation DipoleSource::GetDipoleSourcePolarisation() {
  1388. // return this->Polarisation;
  1389. //}
  1390. Real DipoleSource::GetAngularFrequency(const int& ifreq) {
  1391. return 2.*PI*this->Freqs(ifreq);
  1392. }
  1393. Real DipoleSource::GetFrequency(const int& ifreq) {
  1394. return this->Freqs(ifreq);
  1395. }
  1396. VectorXr DipoleSource::GetFrequencies( ) {
  1397. return this->Freqs;
  1398. }
  1399. Real DipoleSource::GetPhase() {
  1400. return this->Phase;
  1401. }
  1402. Real DipoleSource::GetMoment() {
  1403. return this->Moment;
  1404. }
  1405. int DipoleSource::GetNumberOfFrequencies() {
  1406. return (int)(this->Freqs.size());
  1407. }
  1408. void DipoleSource::SetNumberOfFrequencies(const int &nfreq){
  1409. Freqs.resize(nfreq);
  1410. Freqs.setZero();
  1411. }
  1412. void DipoleSource::SetFrequency(const int &ifreq, const Real &freq){
  1413. Freqs(ifreq) = freq;
  1414. }
  1415. void DipoleSource::SetFrequencies(const VectorXr &freqs){
  1416. Freqs = freqs;
  1417. }
  1418. /////////////////////////////////////////////////////////////////
  1419. /////////////////////////////////////////////////////////////////
  1420. // Error classes
  1421. NullDipoleSource::NullDipoleSource() :
  1422. runtime_error( "NULL VALUED DIPOLE SOURCE") {}
  1423. NonValidDipoleTypeAssignment::NonValidDipoleTypeAssignment( ) :
  1424. runtime_error( "NON VALID DIPOLE TYPE ASSIGNMENT") { }
  1425. NonValidDipoleType::NonValidDipoleType( LemmaObject* ptr ) :
  1426. runtime_error( "NON VALID DIPOLE TYPE") {
  1427. std::cout << "Thrown by instance of "
  1428. << ptr->GetName() << std::endl;
  1429. }
  1430. NonValidDipoleType::NonValidDipoleType( ) :
  1431. runtime_error( "NON VALID DIPOLE TYPE") { }
  1432. NonValidDipolePolarity::NonValidDipolePolarity () :
  1433. runtime_error( "NON VALID DIPOLE POLARITY") { }
  1434. NonValidDipolePolarisation::NonValidDipolePolarisation( ) :
  1435. runtime_error( "NON VALID DIPOLE TYPE") { }
  1436. NonValidDipolePolarisationAssignment::
  1437. NonValidDipolePolarisationAssignment( ) :
  1438. runtime_error( "NON VALID DIPOLE POLARISATION ASSIGNMENT") { }
  1439. NonValidLocationCoordinate::NonValidLocationCoordinate( ) :
  1440. runtime_error( "NON VALID LOCATION COORDINATE REQUESTED") { }
  1441. }