12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472 |
- /* This file is part of Lemma, a geophysical modelling and inversion API */
-
- /* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
- /**
- @file
- @author Trevor Irons
- @date 05/16/2012
- **/
-
- #ifndef KERNELEM1DSPEC_INC
- #define KERNELEM1DSPEC_INC
-
- #include "KernelEM1DBase.h"
- #include "KernelEM1DReflSpec.h"
-
- #include "KernelEM1DReflBase.h"
- #include "LayeredEarthEM.h"
- #include "DipoleSource.h"
-
- namespace Lemma {
-
- //class KernelEM1DReflBase;
-
- // ===================================================================
- // Class: KernelEM1DSpec
- /**
- \ingroup FDEM1D
- \brief Optimized version of KernelEm1D
- \details Through use of template specialisations, this KernelEm1D
- class delivers much better performance.
- \note This class is internal and cannot be serialized.
- */
- // ===================================================================
- template<EMMODE Mode, int Ikernel, DIPOLE_LOCATION Isource, DIPOLE_LOCATION Irecv>
- class KernelEM1DSpec : public KernelEM1DBase {
-
- public:
-
- // ==================== LIFECYCLE =======================
-
- /// Default locked constructor.
- explicit KernelEM1DSpec (const ctor_key& key ) : KernelEM1DBase( key ), ReflCalc(nullptr) {
- }
-
- /// Default destructor.
- ~KernelEM1DSpec () {
- }
-
- /** Returns a pointer to a new object of type KernelEM1DSpec.
- * It allocates all necessary memory.
- */
- static std::shared_ptr<KernelEM1DSpec> NewSP() {
- return std::make_shared< KernelEM1DSpec > ( ctor_key() );
- }
-
- static std::shared_ptr<KernelEM1DSpec> NewSP(LayeredEarthEM* Earth, std::shared_ptr<DipoleSource> Dipole,
- const int& ifreq, const Real& rz) {
- auto Obj = std::make_shared< KernelEM1DSpec > ( ctor_key() );
-
- // under this scenario KernelEM1DSpec manages its own Refl Base
- Obj->ReflCalc = KernelEM1DReflSpec<Mode, Isource, Irecv>::NewSP();
- Obj->ReflCalc->Initialise(Earth);
- Obj->ReflCalc->SetUpSource(Dipole, ifreq);
- Obj->ReflCalc->SetUpReceiver( rz );
-
- return Obj;
- }
-
- // ==================== OPERATORS =======================
-
- // ==================== OPERATIONS =======================
-
- /** Returns the Complex bessel argument to be evaluated for a given
- * lambda value. This is specialised for each kernel type.
- */
- Complex BesselArg(const Real& lambda);
-
- /** Returns the Complex bessel argument to be evaluated for a given
- * lambda value. This is used in the calculation of related kernels.
- * This function does not call
- * KernelEM1DReflBase->ComputeReflectionCoeffs() Which saves
- * significant cost. This is specialised for each kernel type.
- */
- Complex RelBesselArg(const Real& lambda);
-
- // ==================== ACCESS =======================
-
- void SetIk(const int& ikin) {
- std::cerr << "deprecated (SetIk in KernelEm1dSpec.h)\n";
- exit(EXIT_FAILURE);
- }
-
- void SetMode(const EMMODE& modein) {
- //ReflCalc->mode = modein;
- std::cerr << "deprecated (SetMode in KernelEM1DSpec.h)\n";
- exit(EXIT_FAILURE);
- }
-
- void SetReflBase( std::shared_ptr<KernelEM1DReflBase> Base ) {
- ReflCalc = Base;
- }
-
- // ==================== INQUIRY =======================
-
- int GetNumRel() {
- std::cerr << "deprecated GetNumRel() (in KernelEM1DSpec.h) ";
- return -1;
- }
-
- int GetBesselOrder();
-
-
- Complex GetZm() {
- return ReflCalc->GetZm();
- }
-
- Complex GetYm() {
- return ReflCalc->GetYm();
- }
-
- Complex GetZs() {
- return ReflCalc->GetZs();
- }
-
- Complex GetKs() {
- return ReflCalc->GetKs();
- }
-
- /** Returns the name of the underlying class, similiar to Python's type */
- virtual std::string GetName() const;
-
- protected:
-
- // ==================== OPERATIONS =======================
-
- /// Calculates the potential when the receiver is above the source
- /// layer
- Complex PotentialAboveSourceLayer(const Real &ra);
-
- /// Calculates the potential when the receiver is below the source
- /// layer
- Complex PotentialBelowSourceLayer(const Real &ra);
-
- /// Calculates the potential when the receiver is below the source
- /// layer
- Complex RelPotentialBelowSourceLayer(const Real &ra);
-
- /// Used for related kernels. Stores expensive exp(Complex) values
- Complex PotentialInSourceLayer(const Real &ra);
-
- /// Used for related kernels. Stores expensive exp(Complex) values
- Complex RelPotentialInSourceLayer(const Real &ra);
-
- // ==================== DATA MEMBERS =========================
-
- /// Make these static consts
- static const Eigen::Matrix<int, 13, 1> JD;
-
- static const Eigen::Matrix<Real, 4, 4> SS_SN;
-
- static const Eigen::Matrix<Real, 4, 4> SR_SN;
-
- static const Eigen::Matrix<Real, 4, 4> RS_SN;
-
- static const Eigen::Matrix<Real, 4, 2> SS_SL;
-
- std::shared_ptr<KernelEM1DReflBase> ReflCalc;
-
- private:
-
- static constexpr auto CName = "KernelEM1DSpec";
-
- }; // ----- end of class KernelEM1DSpec -----
-
- // ================ INITIALISE STATIC CONSTS ==========================
-
- template<EMMODE Mode, int Ikernel, DIPOLE_LOCATION Isource, DIPOLE_LOCATION Irecv>
- const Eigen::Matrix<int, 13, 1> KernelEM1DSpec<Mode, Ikernel, Isource, Irecv>::JD =
- ( Eigen::Matrix<int, 13, 1>() << 4, 4, 1, 1, 3, 3, 3, 2, 2, 1, 2, 1, 1 ).finished();
-
- template<EMMODE Mode, int Ikernel, DIPOLE_LOCATION Isource, DIPOLE_LOCATION Irecv>
- const Eigen::Matrix<Real, 4, 4> KernelEM1DSpec<Mode, Ikernel, Isource, Irecv>::SS_SN =
- ( Eigen::Matrix<Real, 4, 4>() <<
- 1.e0, 1.e0, 1.e0, 1.e0,
- -1.e0, -1.e0, 1.e0, 1.e0,
- -1.e0, 1.e0, 1.e0, -1.e0,
- 1.e0, -1.e0, 1.e0, -1.e0 ).finished();
-
- template<EMMODE Mode, int Ikernel, DIPOLE_LOCATION Isource, DIPOLE_LOCATION Irecv>
- const Eigen::Matrix<Real, 4, 4> KernelEM1DSpec<Mode, Ikernel, Isource, Irecv>::SR_SN =
- ( Eigen::Matrix<Real, 4, 4>() <<
- 1.e0, 1.e0, 1.e0, 1.e0,
- -1.e0, -1.e0, 1.e0, 1.e0,
- 1.e0, -1.e0, 1.e0, -1.e0,
- -1.e0, 1.e0, 1.e0, -1.e0 ).finished();
-
- template<EMMODE Mode, int Ikernel, DIPOLE_LOCATION Isource, DIPOLE_LOCATION Irecv>
- const Eigen::Matrix<Real, 4, 4> KernelEM1DSpec<Mode, Ikernel, Isource, Irecv>::RS_SN =
- ( Eigen::Matrix<Real, 4, 4>() <<
- 1.e0, 1.e0, 1.e0, 1.e0,
- -1.e0, -1.e0, 1.e0, 1.e0,
- -1.e0, 1.e0, -1.e0, 1.e0,
- 1.e0, -1.e0, -1.e0, 1.e0 ).finished();
-
- template<EMMODE Mode, int Ikernel, DIPOLE_LOCATION Isource, DIPOLE_LOCATION Irecv>
- const Eigen::Matrix<Real, 4, 2> KernelEM1DSpec<Mode, Ikernel, Isource, Irecv>::SS_SL =
- ( Eigen::Matrix<Real, 4, 2>() <<
- 1.e0, 1.e0,
- -1.e0, 1.e0,
- 1.e0, -1.e0,
- -1.e0, -1.e0 ).finished();
-
- template<EMMODE Mode, int Ikernel, DIPOLE_LOCATION Isource, DIPOLE_LOCATION Irecv>
- std::string KernelEM1DSpec<Mode, Ikernel, Isource, Irecv>::GetName() const {
- return CName;
- }
-
- ///////////////////////////////////////////////
- // Declarations of specialisations for private fuctions
- // (some compilers seem to need these, or defaults are fallen back on)
-
- /* Bessel Args */
-
- template <>
- Complex KernelEM1DSpec<TM, 0, INAIR, INAIR>::BesselArg( const Real& lambda );
-
- template <>
- Complex KernelEM1DSpec<TM, 0, INAIR, INAIR>::RelBesselArg( const Real& lambda );
-
- template <>
- Complex KernelEM1DSpec<TM, 1, INAIR, INAIR>::BesselArg( const Real& lambda );
-
- template <>
- Complex KernelEM1DSpec<TM, 1, INAIR, INAIR>::RelBesselArg( const Real& lambda );
-
- template <>
- Complex KernelEM1DSpec<TM, 2, INAIR, INAIR>::BesselArg( const Real& lambda );
-
- template <>
- Complex KernelEM1DSpec<TM, 2, INAIR, INAIR>::RelBesselArg( const Real& lambda );
-
- template <>
- Complex KernelEM1DSpec<TM, 3, INAIR, INAIR>::BesselArg( const Real& lambda );
-
- template <>
- Complex KernelEM1DSpec<TM, 3, INAIR, INAIR>::RelBesselArg( const Real& lambda );
-
- template <>
- Complex KernelEM1DSpec<TM, 4, INAIR, INAIR>::BesselArg( const Real& lambda );
-
- template <>
- Complex KernelEM1DSpec<TM, 4, INAIR, INAIR>::RelBesselArg( const Real& lambda );
-
- template <>
- Complex KernelEM1DSpec<TM, 5, INAIR, INAIR>::BesselArg( const Real& lambda );
-
- template <>
- Complex KernelEM1DSpec<TM, 5, INAIR, INAIR>::RelBesselArg( const Real& lambda );
-
- template <>
- Complex KernelEM1DSpec<TM, 6, INAIR, INAIR>::BesselArg( const Real& lambda );
-
- template <>
- Complex KernelEM1DSpec<TM, 6, INAIR, INAIR>::RelBesselArg( const Real& lambda );
-
- template <>
- Complex KernelEM1DSpec<TM, 7, INAIR, INAIR>::BesselArg( const Real& lambda );
-
- template <>
- Complex KernelEM1DSpec<TM, 7, INAIR, INAIR>::RelBesselArg( const Real& lambda );
-
- template <>
- Complex KernelEM1DSpec<TM, 8, INAIR, INAIR>::BesselArg( const Real& lambda );
-
- template <>
- Complex KernelEM1DSpec<TM, 8, INAIR, INAIR>::RelBesselArg( const Real& lambda );
-
- template <>
- Complex KernelEM1DSpec<TM, 9, INAIR, INAIR>::BesselArg( const Real& lambda );
-
- template <>
- Complex KernelEM1DSpec<TM, 9, INAIR, INAIR>::RelBesselArg( const Real& lambda );
-
- template <>
- Complex KernelEM1DSpec<TM, 10, INAIR, INAIR>::BesselArg( const Real& lambda );
-
- template <>
- Complex KernelEM1DSpec<TM, 10, INAIR, INAIR>::RelBesselArg( const Real& lambda );
-
- template <>
- Complex KernelEM1DSpec<TM, 11, INAIR, INAIR>::BesselArg( const Real& lambda );
-
- template <>
- Complex KernelEM1DSpec<TM, 11, INAIR, INAIR>::RelBesselArg( const Real& lambda );
-
- template <>
- Complex KernelEM1DSpec<TM, 12, INAIR, INAIR>::BesselArg( const Real& lambda );
-
- template <>
- Complex KernelEM1DSpec<TM, 12, INAIR, INAIR>::RelBesselArg( const Real& lambda );
-
- template <>
- Complex KernelEM1DSpec<TE, 0, INAIR, INAIR>::BesselArg( const Real& lambda );
-
- template <>
- Complex KernelEM1DSpec<TE, 0, INAIR, INAIR>::RelBesselArg( const Real& lambda );
-
- template <>
- Complex KernelEM1DSpec<TE, 1, INAIR, INAIR>::BesselArg( const Real& lambda );
-
- template <>
- Complex KernelEM1DSpec<TE, 1, INAIR, INAIR>::RelBesselArg( const Real& lambda );
-
- template <>
- Complex KernelEM1DSpec<TE, 2, INAIR, INAIR>::BesselArg( const Real& lambda );
-
- template <>
- Complex KernelEM1DSpec<TE, 2, INAIR, INAIR>::RelBesselArg( const Real& lambda );
-
- template <>
- Complex KernelEM1DSpec<TE, 3, INAIR, INAIR>::BesselArg( const Real& lambda );
-
- template <>
- Complex KernelEM1DSpec<TE, 3, INAIR, INAIR>::RelBesselArg( const Real& lambda );
-
- template <>
- Complex KernelEM1DSpec<TE, 4, INAIR, INAIR>::BesselArg( const Real& lambda );
-
- template <>
- Complex KernelEM1DSpec<TE, 4, INAIR, INAIR>::RelBesselArg( const Real& lambda );
-
- template <>
- Complex KernelEM1DSpec<TE, 5, INAIR, INAIR>::BesselArg( const Real& lambda );
-
- template <>
- Complex KernelEM1DSpec<TE, 5, INAIR, INAIR>::RelBesselArg( const Real& lambda );
-
- template <>
- Complex KernelEM1DSpec<TE, 6, INAIR, INAIR>::BesselArg( const Real& lambda );
-
- template <>
- Complex KernelEM1DSpec<TE, 6, INAIR, INAIR>::RelBesselArg( const Real& lambda );
-
- template <>
- Complex KernelEM1DSpec<TE, 7, INAIR, INAIR>::BesselArg( const Real& lambda );
-
- template <>
- Complex KernelEM1DSpec<TE, 7, INAIR, INAIR>::RelBesselArg( const Real& lambda );
-
- template <>
- Complex KernelEM1DSpec<TE, 8, INAIR, INAIR>::BesselArg( const Real& lambda );
-
- template <>
- Complex KernelEM1DSpec<TE, 8, INAIR, INAIR>::RelBesselArg( const Real& lambda );
-
- template <>
- Complex KernelEM1DSpec<TE, 9, INAIR, INAIR>::BesselArg( const Real& lambda );
-
- template <>
- Complex KernelEM1DSpec<TE, 9, INAIR, INAIR>::RelBesselArg( const Real& lambda );
-
- template <>
- Complex KernelEM1DSpec<TE, 10, INAIR, INAIR>::BesselArg( const Real& lambda );
-
- template <>
- Complex KernelEM1DSpec<TE, 10, INAIR, INAIR>::RelBesselArg( const Real& lambda );
-
- template <>
- Complex KernelEM1DSpec<TE, 11, INAIR, INAIR>::BesselArg( const Real& lambda );
-
- template <>
- Complex KernelEM1DSpec<TE, 11, INAIR, INAIR>::RelBesselArg( const Real& lambda );
-
- template <>
- Complex KernelEM1DSpec<TE, 12, INAIR, INAIR>::BesselArg( const Real& lambda );
-
- template <>
- Complex KernelEM1DSpec<TE, 12, INAIR, INAIR>::RelBesselArg( const Real& lambda );
-
- template <>
- Complex KernelEM1DSpec<TM, 0, INAIR, INGROUND>::BesselArg( const Real& lambda );
-
- template <>
- Complex KernelEM1DSpec<TM, 0, INAIR, INGROUND>::RelBesselArg( const Real& lambda );
-
- template <>
- Complex KernelEM1DSpec<TM, 1, INAIR, INGROUND>::BesselArg( const Real& lambda );
-
- template <>
- Complex KernelEM1DSpec<TM, 1, INAIR, INGROUND>::RelBesselArg( const Real& lambda );
-
- template <>
- Complex KernelEM1DSpec<TM, 2, INAIR, INGROUND>::BesselArg( const Real& lambda );
-
- template <>
- Complex KernelEM1DSpec<TM, 2, INAIR, INGROUND>::RelBesselArg( const Real& lambda );
-
- template <>
- Complex KernelEM1DSpec<TM, 3, INAIR, INGROUND>::BesselArg( const Real& lambda );
-
- template <>
- Complex KernelEM1DSpec<TM, 3, INAIR, INGROUND>::RelBesselArg( const Real& lambda );
-
- template <>
- Complex KernelEM1DSpec<TM, 4, INAIR, INGROUND>::BesselArg( const Real& lambda );
-
- template <>
- Complex KernelEM1DSpec<TM, 4, INAIR, INGROUND>::RelBesselArg( const Real& lambda );
-
- template <>
- Complex KernelEM1DSpec<TM, 5, INAIR, INGROUND>::BesselArg( const Real& lambda );
-
- template <>
- Complex KernelEM1DSpec<TM, 5, INAIR, INGROUND>::RelBesselArg( const Real& lambda );
-
- template <>
- Complex KernelEM1DSpec<TM, 6, INAIR, INGROUND>::BesselArg( const Real& lambda );
-
- template <>
- Complex KernelEM1DSpec<TM, 6, INAIR, INGROUND>::RelBesselArg( const Real& lambda );
-
- template <>
- Complex KernelEM1DSpec<TM, 7, INAIR, INGROUND>::BesselArg( const Real& lambda );
-
- template <>
- Complex KernelEM1DSpec<TM, 7, INAIR, INGROUND>::RelBesselArg( const Real& lambda );
-
- template <>
- Complex KernelEM1DSpec<TM, 8, INAIR, INGROUND>::BesselArg( const Real& lambda );
-
- template <>
- Complex KernelEM1DSpec<TM, 8, INAIR, INGROUND>::RelBesselArg( const Real& lambda );
-
- template <>
- Complex KernelEM1DSpec<TM, 9, INAIR, INGROUND>::BesselArg( const Real& lambda );
-
- template <>
- Complex KernelEM1DSpec<TM, 9, INAIR, INGROUND>::RelBesselArg( const Real& lambda );
-
- template <>
- Complex KernelEM1DSpec<TM, 10, INAIR, INGROUND>::BesselArg( const Real& lambda );
-
- template <>
- Complex KernelEM1DSpec<TM, 10, INAIR, INGROUND>::RelBesselArg( const Real& lambda );
-
- template <>
- Complex KernelEM1DSpec<TM, 11, INAIR, INGROUND>::BesselArg( const Real& lambda );
-
- template <>
- Complex KernelEM1DSpec<TM, 11, INAIR, INGROUND>::RelBesselArg( const Real& lambda );
-
- template <>
- Complex KernelEM1DSpec<TM, 12, INAIR, INGROUND>::BesselArg( const Real& lambda );
-
- template <>
- Complex KernelEM1DSpec<TM, 12, INAIR, INGROUND>::RelBesselArg( const Real& lambda );
-
- template <>
- Complex KernelEM1DSpec<TE, 0, INAIR, INGROUND>::BesselArg( const Real& lambda );
-
- template <>
- Complex KernelEM1DSpec<TE, 0, INAIR, INGROUND>::RelBesselArg( const Real& lambda );
-
- template <>
- Complex KernelEM1DSpec<TE, 1, INAIR, INGROUND>::BesselArg( const Real& lambda );
-
- template <>
- Complex KernelEM1DSpec<TE, 1, INAIR, INGROUND>::RelBesselArg( const Real& lambda );
-
- template <>
- Complex KernelEM1DSpec<TE, 2, INAIR, INGROUND>::BesselArg( const Real& lambda );
-
- template <>
- Complex KernelEM1DSpec<TE, 2, INAIR, INGROUND>::RelBesselArg( const Real& lambda );
-
- template <>
- Complex KernelEM1DSpec<TE, 3, INAIR, INGROUND>::BesselArg( const Real& lambda );
-
- template <>
- Complex KernelEM1DSpec<TE, 3, INAIR, INGROUND>::RelBesselArg( const Real& lambda );
-
- template <>
- Complex KernelEM1DSpec<TE, 4, INAIR, INGROUND>::BesselArg( const Real& lambda );
-
- template <>
- Complex KernelEM1DSpec<TE, 4, INAIR, INGROUND>::RelBesselArg( const Real& lambda );
-
- template <>
- Complex KernelEM1DSpec<TE, 5, INAIR, INGROUND>::BesselArg( const Real& lambda );
-
- template <>
- Complex KernelEM1DSpec<TE, 5, INAIR, INGROUND>::RelBesselArg( const Real& lambda );
-
- template <>
- Complex KernelEM1DSpec<TE, 6, INAIR, INGROUND>::BesselArg( const Real& lambda );
-
- template <>
- Complex KernelEM1DSpec<TE, 6, INAIR, INGROUND>::RelBesselArg( const Real& lambda );
-
- template <>
- Complex KernelEM1DSpec<TE, 7, INAIR, INGROUND>::BesselArg( const Real& lambda );
-
- template <>
- Complex KernelEM1DSpec<TE, 7, INAIR, INGROUND>::RelBesselArg( const Real& lambda );
-
- template <>
- Complex KernelEM1DSpec<TE, 8, INAIR, INGROUND>::BesselArg( const Real& lambda );
-
- template <>
- Complex KernelEM1DSpec<TE, 8, INAIR, INGROUND>::RelBesselArg( const Real& lambda );
-
- template <>
- Complex KernelEM1DSpec<TE, 9, INAIR, INGROUND>::BesselArg( const Real& lambda );
-
- template <>
- Complex KernelEM1DSpec<TE, 9, INAIR, INGROUND>::RelBesselArg( const Real& lambda );
-
- template <>
- Complex KernelEM1DSpec<TE, 10, INAIR, INGROUND>::BesselArg( const Real& lambda );
-
- template <>
- Complex KernelEM1DSpec<TE, 10, INAIR, INGROUND>::RelBesselArg( const Real& lambda );
-
- template <>
- Complex KernelEM1DSpec<TE, 11, INAIR, INGROUND>::BesselArg( const Real& lambda );
-
- template <>
- Complex KernelEM1DSpec<TE, 11, INAIR, INGROUND>::RelBesselArg( const Real& lambda );
-
- template <>
- Complex KernelEM1DSpec<TE, 12, INAIR, INGROUND>::BesselArg( const Real& lambda );
-
- template <>
- Complex KernelEM1DSpec<TE, 12, INAIR, INGROUND>::RelBesselArg( const Real& lambda );
-
- /* Get Bessel Order */
-
- template <>
- int KernelEM1DSpec<TM, 0, INAIR, INAIR>::GetBesselOrder( );
-
- template <>
- int KernelEM1DSpec<TM, 1, INAIR, INAIR>::GetBesselOrder( );
-
- template <>
- int KernelEM1DSpec<TM, 2, INAIR, INAIR>::GetBesselOrder( );
-
- template <>
- int KernelEM1DSpec<TM, 3, INAIR, INAIR>::GetBesselOrder( );
-
- template <>
- int KernelEM1DSpec<TM, 4, INAIR, INAIR>::GetBesselOrder( );
-
- template <>
- int KernelEM1DSpec<TM, 5, INAIR, INAIR>::GetBesselOrder( );
-
- template <>
- int KernelEM1DSpec<TM, 6, INAIR, INAIR>::GetBesselOrder( );
-
- template <>
- int KernelEM1DSpec<TM, 7, INAIR, INAIR>::GetBesselOrder( );
-
- template <>
- int KernelEM1DSpec<TM, 8, INAIR, INAIR>::GetBesselOrder( );
-
- template <>
- int KernelEM1DSpec<TM, 9, INAIR, INAIR>::GetBesselOrder( );
-
- template <>
- int KernelEM1DSpec<TM, 10, INAIR, INAIR>::GetBesselOrder( );
-
- template <>
- int KernelEM1DSpec<TM, 11, INAIR, INAIR>::GetBesselOrder( );
-
- template <>
- int KernelEM1DSpec<TM, 12, INAIR, INAIR>::GetBesselOrder( );
-
- template <>
- int KernelEM1DSpec<TE, 0, INAIR, INAIR>::GetBesselOrder( );
-
- template <>
- int KernelEM1DSpec<TE, 1, INAIR, INAIR>::GetBesselOrder( );
-
- template <>
- int KernelEM1DSpec<TE, 2, INAIR, INAIR>::GetBesselOrder( );
-
- template <>
- int KernelEM1DSpec<TE, 3, INAIR, INAIR>::GetBesselOrder( );
-
- template <>
- int KernelEM1DSpec<TE, 4, INAIR, INAIR>::GetBesselOrder( );
-
- template <>
- int KernelEM1DSpec<TE, 5, INAIR, INAIR>::GetBesselOrder( );
-
- template <>
- int KernelEM1DSpec<TE, 6, INAIR, INAIR>::GetBesselOrder( );
-
- template <>
- int KernelEM1DSpec<TE, 7, INAIR, INAIR>::GetBesselOrder( );
-
- template <>
- int KernelEM1DSpec<TE, 8, INAIR, INAIR>::GetBesselOrder( );
-
- template <>
- int KernelEM1DSpec<TE, 9, INAIR, INAIR>::GetBesselOrder( );
-
- template <>
- int KernelEM1DSpec<TE, 10, INAIR, INAIR>::GetBesselOrder( );
-
- template <>
- int KernelEM1DSpec<TE, 11, INAIR, INAIR>::GetBesselOrder( );
-
- template <>
- int KernelEM1DSpec<TE, 12, INAIR, INAIR>::GetBesselOrder( );
-
- template <>
- int KernelEM1DSpec<TM, 0, INAIR, INGROUND>::GetBesselOrder( );
-
- template <>
- int KernelEM1DSpec<TM, 1, INAIR, INGROUND>::GetBesselOrder( );
-
- template <>
- int KernelEM1DSpec<TM, 2, INAIR, INGROUND>::GetBesselOrder( );
-
- template <>
- int KernelEM1DSpec<TM, 3, INAIR, INGROUND>::GetBesselOrder( );
-
- template <>
- int KernelEM1DSpec<TM, 4, INAIR, INGROUND>::GetBesselOrder( );
-
- template <>
- int KernelEM1DSpec<TM, 5, INAIR, INGROUND>::GetBesselOrder( );
-
- template <>
- int KernelEM1DSpec<TM, 6, INAIR, INGROUND>::GetBesselOrder( );
-
- template <>
- int KernelEM1DSpec<TM, 7, INAIR, INGROUND>::GetBesselOrder( );
-
- template <>
- int KernelEM1DSpec<TM, 8, INAIR, INGROUND>::GetBesselOrder( );
-
- template <>
- int KernelEM1DSpec<TM, 9, INAIR, INGROUND>::GetBesselOrder( );
-
- template <>
- int KernelEM1DSpec<TM, 10, INAIR, INGROUND>::GetBesselOrder( );
-
- template <>
- int KernelEM1DSpec<TM, 11, INAIR, INGROUND>::GetBesselOrder( );
-
- template <>
- int KernelEM1DSpec<TM, 12, INAIR, INGROUND>::GetBesselOrder( );
-
- template <>
- int KernelEM1DSpec<TE, 0, INAIR, INGROUND>::GetBesselOrder( );
-
- template <>
- int KernelEM1DSpec<TE, 1, INAIR, INGROUND>::GetBesselOrder( );
-
- template <>
- int KernelEM1DSpec<TE, 2, INAIR, INGROUND>::GetBesselOrder( );
-
- template <>
- int KernelEM1DSpec<TE, 3, INAIR, INGROUND>::GetBesselOrder( );
-
- template <>
- int KernelEM1DSpec<TE, 4, INAIR, INGROUND>::GetBesselOrder( );
-
- template <>
- int KernelEM1DSpec<TE, 5, INAIR, INGROUND>::GetBesselOrder( );
-
- template <>
- int KernelEM1DSpec<TE, 6, INAIR, INGROUND>::GetBesselOrder( );
-
- template <>
- int KernelEM1DSpec<TE, 7, INAIR, INGROUND>::GetBesselOrder( );
-
- template <>
- int KernelEM1DSpec<TE, 8, INAIR, INGROUND>::GetBesselOrder( );
-
- template <>
- int KernelEM1DSpec<TE, 9, INAIR, INGROUND>::GetBesselOrder( );
-
- template <>
- int KernelEM1DSpec<TE, 10, INAIR, INGROUND>::GetBesselOrder( );
-
- template <>
- int KernelEM1DSpec<TE, 11, INAIR, INGROUND>::GetBesselOrder( );
-
- template <>
- int KernelEM1DSpec<TE, 12, INAIR, INGROUND>::GetBesselOrder( );
-
- template <>
- int KernelEM1DSpec<TM, 0, INGROUND, INGROUND>::GetBesselOrder( );
-
- template <>
- int KernelEM1DSpec<TM, 1, INGROUND, INGROUND>::GetBesselOrder( );
-
- template <>
- int KernelEM1DSpec<TM, 2, INGROUND, INGROUND>::GetBesselOrder( );
-
- template <>
- int KernelEM1DSpec<TM, 3, INGROUND, INGROUND>::GetBesselOrder( );
-
- template <>
- int KernelEM1DSpec<TM, 4, INGROUND, INGROUND>::GetBesselOrder( );
-
- template <>
- int KernelEM1DSpec<TM, 5, INGROUND, INGROUND>::GetBesselOrder( );
-
- template <>
- int KernelEM1DSpec<TM, 6, INGROUND, INGROUND>::GetBesselOrder( );
-
- template <>
- int KernelEM1DSpec<TM, 7, INGROUND, INGROUND>::GetBesselOrder( );
-
- template <>
- int KernelEM1DSpec<TM, 8, INGROUND, INGROUND>::GetBesselOrder( );
-
- template <>
- int KernelEM1DSpec<TM, 9, INGROUND, INGROUND>::GetBesselOrder( );
-
- template <>
- int KernelEM1DSpec<TM, 10, INGROUND, INGROUND>::GetBesselOrder( );
-
- template <>
- int KernelEM1DSpec<TM, 11, INGROUND, INGROUND>::GetBesselOrder( );
-
- template <>
- int KernelEM1DSpec<TM, 12, INGROUND, INGROUND>::GetBesselOrder( );
-
- template <>
- int KernelEM1DSpec<TE, 0, INGROUND, INGROUND>::GetBesselOrder( );
-
- template <>
- int KernelEM1DSpec<TE, 1, INGROUND, INGROUND>::GetBesselOrder( );
-
- template <>
- int KernelEM1DSpec<TE, 2, INGROUND, INGROUND>::GetBesselOrder( );
-
- template <>
- int KernelEM1DSpec<TE, 3, INGROUND, INGROUND>::GetBesselOrder( );
-
- template <>
- int KernelEM1DSpec<TE, 4, INGROUND, INGROUND>::GetBesselOrder( );
-
- template <>
- int KernelEM1DSpec<TE, 5, INGROUND, INGROUND>::GetBesselOrder( );
-
- template <>
- int KernelEM1DSpec<TE, 6, INGROUND, INGROUND>::GetBesselOrder( );
-
- template <>
- int KernelEM1DSpec<TE, 7, INGROUND, INGROUND>::GetBesselOrder( );
-
- template <>
- int KernelEM1DSpec<TE, 8, INGROUND, INGROUND>::GetBesselOrder( );
-
- template <>
- int KernelEM1DSpec<TE, 9, INGROUND, INGROUND>::GetBesselOrder( );
-
- template <>
- int KernelEM1DSpec<TE, 10, INGROUND, INGROUND>::GetBesselOrder( );
-
- template <>
- int KernelEM1DSpec<TE, 11, INGROUND, INGROUND>::GetBesselOrder( );
-
- template <>
- int KernelEM1DSpec<TE, 12, INGROUND, INGROUND>::GetBesselOrder( );
-
- template <>
- int KernelEM1DSpec<TM, 0, INGROUND, INAIR>::GetBesselOrder( );
-
- template <>
- int KernelEM1DSpec<TM, 1, INGROUND, INAIR>::GetBesselOrder( );
-
- template <>
- int KernelEM1DSpec<TM, 2, INGROUND, INAIR>::GetBesselOrder( );
-
- template <>
- int KernelEM1DSpec<TM, 3, INGROUND, INAIR>::GetBesselOrder( );
-
- template <>
- int KernelEM1DSpec<TM, 4, INGROUND, INAIR>::GetBesselOrder( );
-
- template <>
- int KernelEM1DSpec<TM, 5, INGROUND, INAIR>::GetBesselOrder( );
-
- template <>
- int KernelEM1DSpec<TM, 6, INGROUND, INAIR>::GetBesselOrder( );
-
- template <>
- int KernelEM1DSpec<TM, 7, INGROUND, INAIR>::GetBesselOrder( );
-
- template <>
- int KernelEM1DSpec<TM, 8, INGROUND, INAIR>::GetBesselOrder( );
-
- template <>
- int KernelEM1DSpec<TM, 9, INGROUND, INAIR>::GetBesselOrder( );
-
- template <>
- int KernelEM1DSpec<TM, 10, INGROUND, INAIR>::GetBesselOrder( );
-
- template <>
- int KernelEM1DSpec<TM, 11, INGROUND, INAIR>::GetBesselOrder( );
-
- template <>
- int KernelEM1DSpec<TM, 12, INGROUND, INAIR>::GetBesselOrder( );
-
- template <>
- int KernelEM1DSpec<TE, 0, INGROUND, INAIR>::GetBesselOrder( );
-
- template <>
- int KernelEM1DSpec<TE, 1, INGROUND, INAIR>::GetBesselOrder( );
-
- template <>
- int KernelEM1DSpec<TE, 2, INGROUND, INAIR>::GetBesselOrder( );
-
- template <>
- int KernelEM1DSpec<TE, 3, INGROUND, INAIR>::GetBesselOrder( );
-
- template <>
- int KernelEM1DSpec<TE, 4, INGROUND, INAIR>::GetBesselOrder( );
-
- template <>
- int KernelEM1DSpec<TE, 5, INGROUND, INAIR>::GetBesselOrder( );
-
- template <>
- int KernelEM1DSpec<TE, 6, INGROUND, INAIR>::GetBesselOrder( );
-
- template <>
- int KernelEM1DSpec<TE, 7, INGROUND, INAIR>::GetBesselOrder( );
-
- template <>
- int KernelEM1DSpec<TE, 8, INGROUND, INAIR>::GetBesselOrder( );
-
- template <>
- int KernelEM1DSpec<TE, 9, INGROUND, INAIR>::GetBesselOrder( );
-
- template <>
- int KernelEM1DSpec<TE, 10, INGROUND, INAIR>::GetBesselOrder( );
-
- template <>
- int KernelEM1DSpec<TE, 11, INGROUND, INAIR>::GetBesselOrder( );
-
- template <>
- int KernelEM1DSpec<TE, 12, INGROUND, INAIR>::GetBesselOrder( );
-
- /* POTENTIAL CALCULATIONS */
-
- /* Potential in air source layer*/
- template<>
- Complex KernelEM1DSpec<TM, 0, INAIR, INAIR>::PotentialInSourceLayer(const Real &ra);
-
- template<>
- Complex KernelEM1DSpec<TM, 0, INAIR, INAIR>::RelPotentialInSourceLayer(const Real &ra);
-
- template<>
- Complex KernelEM1DSpec<TM, 1, INAIR, INAIR>::PotentialInSourceLayer(const Real &ra);
-
- template<>
- Complex KernelEM1DSpec<TM, 1, INAIR, INAIR>::RelPotentialInSourceLayer(const Real &ra);
-
- template<>
- Complex KernelEM1DSpec<TM, 2, INAIR, INAIR>::PotentialInSourceLayer(const Real &ra);
-
- template<>
- Complex KernelEM1DSpec<TM, 2, INAIR, INAIR>::RelPotentialInSourceLayer(const Real &ra);
-
- template<>
- Complex KernelEM1DSpec<TM, 3, INAIR, INAIR>::PotentialInSourceLayer(const Real &ra);
-
- template<>
- Complex KernelEM1DSpec<TM, 3, INAIR, INAIR>::RelPotentialInSourceLayer(const Real &ra);
-
- template<>
- Complex KernelEM1DSpec<TM, 4, INAIR, INAIR>::PotentialInSourceLayer(const Real &ra);
-
- template<>
- Complex KernelEM1DSpec<TM, 4, INAIR, INAIR>::RelPotentialInSourceLayer(const Real &ra);
-
- template<>
- Complex KernelEM1DSpec<TM, 5, INAIR, INAIR>::PotentialInSourceLayer(const Real &ra);
-
- template<>
- Complex KernelEM1DSpec<TM, 5, INAIR, INAIR>::RelPotentialInSourceLayer(const Real &ra);
-
- template<>
- Complex KernelEM1DSpec<TM, 6, INAIR, INAIR>::PotentialInSourceLayer(const Real &ra);
-
- template<>
- Complex KernelEM1DSpec<TM, 6, INAIR, INAIR>::RelPotentialInSourceLayer(const Real &ra);
-
- template<>
- Complex KernelEM1DSpec<TM, 7, INAIR, INAIR>::PotentialInSourceLayer(const Real &ra);
-
- template<>
- Complex KernelEM1DSpec<TM, 7, INAIR, INAIR>::RelPotentialInSourceLayer(const Real &ra);
-
- template<>
- Complex KernelEM1DSpec<TM, 8, INAIR, INAIR>::PotentialInSourceLayer(const Real &ra);
-
- template<>
- Complex KernelEM1DSpec<TM, 8, INAIR, INAIR>::RelPotentialInSourceLayer(const Real &ra);
-
- template<>
- Complex KernelEM1DSpec<TM, 9, INAIR, INAIR>::PotentialInSourceLayer(const Real &ra);
-
- template<>
- Complex KernelEM1DSpec<TM, 9, INAIR, INAIR>::RelPotentialInSourceLayer(const Real &ra);
-
- template<>
- Complex KernelEM1DSpec<TM, 10, INAIR, INAIR>::PotentialInSourceLayer(const Real &ra);
-
- template<>
- Complex KernelEM1DSpec<TM, 10, INAIR, INAIR>::RelPotentialInSourceLayer(const Real &ra);
-
- template<>
- Complex KernelEM1DSpec<TM, 11, INAIR, INAIR>::PotentialInSourceLayer(const Real &ra);
-
- template<>
- Complex KernelEM1DSpec<TM, 11, INAIR, INAIR>::RelPotentialInSourceLayer(const Real &ra);
-
- template<>
- Complex KernelEM1DSpec<TM, 12, INAIR, INAIR>::PotentialInSourceLayer(const Real &ra);
-
- template<>
- Complex KernelEM1DSpec<TM, 12, INAIR, INAIR>::RelPotentialInSourceLayer(const Real &ra);
-
- /* Potential in air source layer TE*/
- template<>
- Complex KernelEM1DSpec<TE, 0, INAIR, INAIR>::PotentialInSourceLayer(const Real &ra);
-
- template<>
- Complex KernelEM1DSpec<TE, 0, INAIR, INAIR>::RelPotentialInSourceLayer(const Real &ra);
-
- template<>
- Complex KernelEM1DSpec<TE, 1, INAIR, INAIR>::PotentialInSourceLayer(const Real &ra);
-
- template<>
- Complex KernelEM1DSpec<TE, 1, INAIR, INAIR>::RelPotentialInSourceLayer(const Real &ra);
-
- template<>
- Complex KernelEM1DSpec<TE, 2, INAIR, INAIR>::PotentialInSourceLayer(const Real &ra);
-
- template<>
- Complex KernelEM1DSpec<TE, 2, INAIR, INAIR>::RelPotentialInSourceLayer(const Real &ra);
-
- template<>
- Complex KernelEM1DSpec<TE, 3, INAIR, INAIR>::PotentialInSourceLayer(const Real &ra);
-
- template<>
- Complex KernelEM1DSpec<TE, 3, INAIR, INAIR>::RelPotentialInSourceLayer(const Real &ra);
-
- template<>
- Complex KernelEM1DSpec<TE, 4, INAIR, INAIR>::PotentialInSourceLayer(const Real &ra);
-
- template<>
- Complex KernelEM1DSpec<TE, 4, INAIR, INAIR>::RelPotentialInSourceLayer(const Real &ra);
-
- template<>
- Complex KernelEM1DSpec<TE, 5, INAIR, INAIR>::PotentialInSourceLayer(const Real &ra);
-
- template<>
- Complex KernelEM1DSpec<TE, 5, INAIR, INAIR>::RelPotentialInSourceLayer(const Real &ra);
-
- template<>
- Complex KernelEM1DSpec<TE, 6, INAIR, INAIR>::PotentialInSourceLayer(const Real &ra);
-
- template<>
- Complex KernelEM1DSpec<TE, 6, INAIR, INAIR>::RelPotentialInSourceLayer(const Real &ra);
-
- template<>
- Complex KernelEM1DSpec<TE, 7, INAIR, INAIR>::PotentialInSourceLayer(const Real &ra);
-
- template<>
- Complex KernelEM1DSpec<TE, 7, INAIR, INAIR>::RelPotentialInSourceLayer(const Real &ra);
-
- template<>
- Complex KernelEM1DSpec<TE, 8, INAIR, INAIR>::PotentialInSourceLayer(const Real &ra);
-
- template<>
- Complex KernelEM1DSpec<TE, 8, INAIR, INAIR>::RelPotentialInSourceLayer(const Real &ra);
-
- template<>
- Complex KernelEM1DSpec<TE, 9, INAIR, INAIR>::PotentialInSourceLayer(const Real &ra);
-
- template<>
- Complex KernelEM1DSpec<TE, 9, INAIR, INAIR>::RelPotentialInSourceLayer(const Real &ra);
-
- template<>
- Complex KernelEM1DSpec<TE, 10, INAIR, INAIR>::PotentialInSourceLayer(const Real &ra);
-
- template<>
- Complex KernelEM1DSpec<TE, 10, INAIR, INAIR>::RelPotentialInSourceLayer(const Real &ra);
-
- template<>
- Complex KernelEM1DSpec<TE, 11, INAIR, INAIR>::PotentialInSourceLayer(const Real &ra);
-
- template<>
- Complex KernelEM1DSpec<TE, 11, INAIR, INAIR>::RelPotentialInSourceLayer(const Real &ra);
-
- template<>
- Complex KernelEM1DSpec<TE, 12, INAIR, INAIR>::PotentialInSourceLayer(const Real &ra);
-
- template<>
- Complex KernelEM1DSpec<TE, 12, INAIR, INAIR>::RelPotentialInSourceLayer(const Real &ra);
-
- /* Potential below source in air*/
-
- template<>
- Complex KernelEM1DSpec<TM, 0, INAIR, INGROUND>::PotentialBelowSourceLayer(const Real &ra);
-
- template<>
- Complex KernelEM1DSpec<TM, 0, INAIR, INGROUND>::RelPotentialBelowSourceLayer(const Real &ra);
-
- template<>
- Complex KernelEM1DSpec<TM, 1, INAIR, INGROUND>::PotentialBelowSourceLayer(const Real &ra);
-
- template<>
- Complex KernelEM1DSpec<TM, 1, INAIR, INGROUND>::RelPotentialBelowSourceLayer(const Real &ra);
-
- template<>
- Complex KernelEM1DSpec<TM, 2, INAIR, INGROUND>::PotentialBelowSourceLayer(const Real &ra);
-
- template<>
- Complex KernelEM1DSpec<TM, 2, INAIR, INGROUND>::RelPotentialBelowSourceLayer(const Real &ra);
-
- template<>
- Complex KernelEM1DSpec<TM, 3, INAIR, INGROUND>::PotentialBelowSourceLayer(const Real &ra);
-
- template<>
- Complex KernelEM1DSpec<TM, 3, INAIR, INGROUND>::RelPotentialBelowSourceLayer(const Real &ra);
-
- template<>
- Complex KernelEM1DSpec<TM, 4, INAIR, INGROUND>::PotentialBelowSourceLayer(const Real &ra);
-
- template<>
- Complex KernelEM1DSpec<TM, 4, INAIR, INGROUND>::RelPotentialBelowSourceLayer(const Real &ra);
-
- template<>
- Complex KernelEM1DSpec<TM, 5, INAIR, INGROUND>::PotentialBelowSourceLayer(const Real &ra);
-
- template<>
- Complex KernelEM1DSpec<TM, 5, INAIR, INGROUND>::RelPotentialBelowSourceLayer(const Real &ra);
-
- template<>
- Complex KernelEM1DSpec<TM, 6, INAIR, INGROUND>::PotentialBelowSourceLayer(const Real &ra);
-
- template<>
- Complex KernelEM1DSpec<TM, 6, INAIR, INGROUND>::RelPotentialBelowSourceLayer(const Real &ra);
-
- template<>
- Complex KernelEM1DSpec<TM, 7, INAIR, INGROUND>::PotentialBelowSourceLayer(const Real &ra);
-
- template<>
- Complex KernelEM1DSpec<TM, 7, INAIR, INGROUND>::RelPotentialBelowSourceLayer(const Real &ra);
-
- template<>
- Complex KernelEM1DSpec<TM, 8, INAIR, INGROUND>::PotentialBelowSourceLayer(const Real &ra);
-
- template<>
- Complex KernelEM1DSpec<TM, 8, INAIR, INGROUND>::RelPotentialBelowSourceLayer(const Real &ra);
-
- template<>
- Complex KernelEM1DSpec<TM, 9, INAIR, INGROUND>::PotentialBelowSourceLayer(const Real &ra);
-
- template<>
- Complex KernelEM1DSpec<TM, 9, INAIR, INGROUND>::RelPotentialBelowSourceLayer(const Real &ra);
-
- template<>
- Complex KernelEM1DSpec<TM, 10, INAIR, INGROUND>::PotentialBelowSourceLayer(const Real &ra);
-
- template<>
- Complex KernelEM1DSpec<TM, 10, INAIR, INGROUND>::RelPotentialBelowSourceLayer(const Real &ra);
-
- template<>
- Complex KernelEM1DSpec<TM, 11, INAIR, INGROUND>::PotentialBelowSourceLayer(const Real &ra);
-
- template<>
- Complex KernelEM1DSpec<TM, 11, INAIR, INGROUND>::RelPotentialBelowSourceLayer(const Real &ra);
-
- template<>
- Complex KernelEM1DSpec<TM, 12, INAIR, INGROUND>::PotentialBelowSourceLayer(const Real &ra);
-
- template<>
- Complex KernelEM1DSpec<TM, 12, INAIR, INGROUND>::RelPotentialBelowSourceLayer(const Real &ra);
-
- template<>
- Complex KernelEM1DSpec<TE, 0, INAIR, INGROUND>::PotentialBelowSourceLayer(const Real &ra);
-
- template<>
- Complex KernelEM1DSpec<TE, 0, INAIR, INGROUND>::RelPotentialBelowSourceLayer(const Real &ra);
-
- template<>
- Complex KernelEM1DSpec<TE, 1, INAIR, INGROUND>::PotentialBelowSourceLayer(const Real &ra);
-
- template<>
- Complex KernelEM1DSpec<TE, 1, INAIR, INGROUND>::RelPotentialBelowSourceLayer(const Real &ra);
-
- template<>
- Complex KernelEM1DSpec<TE, 2, INAIR, INGROUND>::PotentialBelowSourceLayer(const Real &ra);
-
- template<>
- Complex KernelEM1DSpec<TE, 2, INAIR, INGROUND>::RelPotentialBelowSourceLayer(const Real &ra);
-
- template<>
- Complex KernelEM1DSpec<TE, 3, INAIR, INGROUND>::PotentialBelowSourceLayer(const Real &ra);
-
- template<>
- Complex KernelEM1DSpec<TE, 3, INAIR, INGROUND>::RelPotentialBelowSourceLayer(const Real &ra);
-
- template<>
- Complex KernelEM1DSpec<TE, 4, INAIR, INGROUND>::PotentialBelowSourceLayer(const Real &ra);
-
- template<>
- Complex KernelEM1DSpec<TE, 4, INAIR, INGROUND>::RelPotentialBelowSourceLayer(const Real &ra);
-
- template<>
- Complex KernelEM1DSpec<TE, 5, INAIR, INGROUND>::PotentialBelowSourceLayer(const Real &ra);
-
- template<>
- Complex KernelEM1DSpec<TE, 5, INAIR, INGROUND>::RelPotentialBelowSourceLayer(const Real &ra);
-
- template<>
- Complex KernelEM1DSpec<TE, 6, INAIR, INGROUND>::PotentialBelowSourceLayer(const Real &ra);
-
- template<>
- Complex KernelEM1DSpec<TE, 6, INAIR, INGROUND>::RelPotentialBelowSourceLayer(const Real &ra);
-
- template<>
- Complex KernelEM1DSpec<TE, 7, INAIR, INGROUND>::PotentialBelowSourceLayer(const Real &ra);
-
- template<>
- Complex KernelEM1DSpec<TE, 7, INAIR, INGROUND>::RelPotentialBelowSourceLayer(const Real &ra);
-
- template<>
- Complex KernelEM1DSpec<TE, 8, INAIR, INGROUND>::PotentialBelowSourceLayer(const Real &ra);
-
- template<>
- Complex KernelEM1DSpec<TE, 8, INAIR, INGROUND>::RelPotentialBelowSourceLayer(const Real &ra);
-
- template<>
- Complex KernelEM1DSpec<TE, 9, INAIR, INGROUND>::PotentialBelowSourceLayer(const Real &ra);
-
- template<>
- Complex KernelEM1DSpec<TE, 9, INAIR, INGROUND>::RelPotentialBelowSourceLayer(const Real &ra);
-
- template<>
- Complex KernelEM1DSpec<TE, 10, INAIR, INGROUND>::PotentialBelowSourceLayer(const Real &ra);
-
- template<>
- Complex KernelEM1DSpec<TE, 10, INAIR, INGROUND>::RelPotentialBelowSourceLayer(const Real &ra);
-
- template<>
- Complex KernelEM1DSpec<TE, 11, INAIR, INGROUND>::PotentialBelowSourceLayer(const Real &ra);
-
- template<>
- Complex KernelEM1DSpec<TE, 11, INAIR, INGROUND>::RelPotentialBelowSourceLayer(const Real &ra);
-
- template<>
- Complex KernelEM1DSpec<TE, 12, INAIR, INGROUND>::PotentialBelowSourceLayer(const Real &ra);
-
- template<>
- Complex KernelEM1DSpec<TE, 12, INAIR, INGROUND>::RelPotentialBelowSourceLayer(const Real &ra);
-
- /////////////////////////////////////////////////////////////////////////////////
- ///////////////////////////////////////////////
- // Default mode definitions
-
- template<EMMODE Mode, int Ikernel, DIPOLE_LOCATION Isource, DIPOLE_LOCATION Irecv>
- Complex KernelEM1DSpec<Mode, Ikernel, Isource, Irecv>::BesselArg(const Real& lambda) {
- static bool called = false;
- if (!called) {
- std::cout << "Unspecialised KernelEM1DSpec::BesselArg() <" << Mode << " " << Ikernel << " "
- << Isource << " " << Irecv << ">...slow" << std::endl;
- called = true;
- }
-
- ///////////////////////////////////////////////
- // Compute reflection coeffs (4) ways
- // 1) Member function pointer
- // 2) Fast Delegates way
- // 3) Boost::function and boost::bind way
- // 4) No function pointers, all logic @ each step.
- // For (4) about 40% of time is spent in this loop.
- // However, none of the other options are producing
- // apreciably faster code.
-
- // Function pointers used to specilized cases
- //(this->*ComputeReflectionCoeffs)( );
-
- // Boost::bind way and fast delegates way
- //ComputeReflectionCoeffs();
- //ComputeReflectionCoeffsTempl<TE>();
-
-
- // Don't use function pointers, ~ same speed right now :(
- ReflCalc->ComputeReflectionCoeffs(lambda);
-
- ReflCalc->id = this->JD(Ikernel);
-
- // If these params are equal they share reflection coeffs
- // + layr
- // ++ ifirst;
-
- Real ra=1.0;
- int i1=(Ikernel )*(Ikernel- 2)*(Ikernel- 5)*(Ikernel- 7);
- int i2=(Ikernel-4)*(Ikernel- 9)*(Ikernel-10)*(Ikernel-12);
-
- if(i1 == 0) ra=lambda;
- if(i2 == 0) ra=ReflCalc->rams;
- if(Ikernel == 11) ra=lambda*ReflCalc->rams;
- Complex pot;
-
- if (ReflCalc->lays == ReflCalc->layr) {
- pot = PotentialInSourceLayer(ra);
- } else if (ReflCalc->layr > ReflCalc->lays) {
- pot = PotentialBelowSourceLayer(ra);
- } else {
- pot = PotentialAboveSourceLayer(ra);
- }
-
- return pot/ReflCalc->uk;
-
- }
-
- template<EMMODE Mode, int Ikernel, DIPOLE_LOCATION Isource, DIPOLE_LOCATION Irecv>
- int KernelEM1DSpec<Mode, Ikernel, Isource, Irecv>::GetBesselOrder( ) {
- std::cerr << "Calling base GetBesselOrder in KernelEM1DSpec < " << Mode
- << "\t" << Ikernel << "\t" << Isource << "\t" << Irecv << "\n";
- exit(EXIT_FAILURE);
- return 1;
- }
-
- template<EMMODE Mode, int Ikernel, DIPOLE_LOCATION Isource, DIPOLE_LOCATION Irecv>
- Complex KernelEM1DSpec<Mode, Ikernel, Isource, Irecv>::RelBesselArg(const Real& lambda) {
- static bool called = false;
- if (!called) {
- std::cout << "Unspecialised KernelEM1DSpec::RelBesselArg <" << Mode << " " << Ikernel << " "
- << Isource << " " << Irecv << ">...slow" << std::endl;
- called = true;
- }
- return this->BesselArg(lambda);
- }
-
- template<EMMODE Mode, int Ikernel, DIPOLE_LOCATION Isource, DIPOLE_LOCATION Irecv>
- Complex KernelEM1DSpec<Mode, Ikernel, Isource, Irecv>::PotentialAboveSourceLayer(const Real &ra) {
- static bool called = false;
- if (!called) {
- std::cout << "WARNING: ";
- std::cout << "Unspecialised PotentialAboveSourceLayer <" << Mode << " " << Ikernel << " "
- << Isource << " " << Irecv << ">...this function will be slow\n\n";
- called = true;
- }
- Complex ud;
- switch (ReflCalc->id) {
- case (2):
- ud = ReflCalc->um;
- break;
- case (3):
- ud = ReflCalc->uk;
- break;
- case (4):
- ud = ReflCalc->um*ReflCalc->uk;
- break;
- default:
- ud = Complex(1,0);
- }
- int I1 = (Ikernel )*(Ikernel- 1)*(Ikernel- 4)*(Ikernel- 7)*
- (Ikernel- 8)*(Ikernel- 9)*(Ikernel-10)*(Ikernel-11);
- Complex CC, DD(1,0);
- if (Mode==TM && ReflCalc->layr==0 && I1==0) {
- CC = (Real)(2.) * ReflCalc->rtu(ReflCalc->lays)*ReflCalc->u(1)*ReflCalc->yh(0) /
- (ReflCalc->yh(0)*ReflCalc->u(1)-ReflCalc->yh(1)*ReflCalc->u(0));
- } else {
- CC = ReflCalc->rtu(ReflCalc->lays)+ReflCalc->rtu(ReflCalc->lays)/ReflCalc->rtu(ReflCalc->layr+1);
- }
- if (ReflCalc->lays < ReflCalc->nlay) {
- DD -= ReflCalc->rtu(ReflCalc->lays) * ReflCalc->rtd(ReflCalc->lays) * ReflCalc->cf(ReflCalc->lays) ;
- }
- if (ReflCalc->layr > 0) {
- DD *= ( (Real)(1.) + ReflCalc->rtu(ReflCalc->layr)*ReflCalc->cf(ReflCalc->layr));
- }
- Complex A = CC/DD;
- int LS = ReflCalc->layr + 1;
- int LE = ReflCalc->lays - 1;
- if (LE >= LS) {
- for (int N=LS; N<=LE; ++N) {
- A *= (ReflCalc->rtu(N)+ReflCalc->rtu(N)/ReflCalc->rtu(N+1)) /
- ( (Real)(1.)+ReflCalc->rtu(N)*ReflCalc->cf(N));
- }
- }
- Complex P(0);
- Complex CON(0);
-
- if (ReflCalc->layr == 0) {
- P = - ReflCalc->u(0)*ReflCalc->rx_z;
- if (LE > 0) {
- for (int N=1; N<=LE; ++N) {
- P += (Real)(2.)*ReflCalc->u(N)*ReflCalc->LayerThickness(N)+(ReflCalc->u(N+1)-ReflCalc->u(N))*ReflCalc->LayerDepth(N);
- }
- }
- CON = RS_SN(ReflCalc->id-1, 2) * std::exp(-P-ReflCalc->uk*(ReflCalc->tx_z-(Real)(2.)*ReflCalc->LayerDepth(ReflCalc->lays-1)));
- if (ReflCalc->lays < ReflCalc->nlay-1) {
- CON += RS_SN(ReflCalc->id-1, 3)*ReflCalc->rtd(ReflCalc->lays) *
- std::exp(-P-ReflCalc->uk*((Real)(2.)*ReflCalc->LayerThickness(ReflCalc->lays)-ReflCalc->tx_z));
- }
- } else {
- for (int N=ReflCalc->layr; N<=LE; ++N) {
- P += (Real)(2.)*ReflCalc->u(N)*ReflCalc->LayerThickness(N)+(ReflCalc->u(N+1)-ReflCalc->u(N))*ReflCalc->LayerDepth(N);
- }
- CON = RS_SN(ReflCalc->id-1, 0)*ReflCalc->rtu(ReflCalc->layr) *
- std::exp(-P-ReflCalc->uk*(ReflCalc->tx_z-(Real)(2.)*ReflCalc->LayerDepth(ReflCalc->lays-1))-ReflCalc->um*ReflCalc->rx_z) +
- RS_SN(ReflCalc->id-1, 2) *
- std::exp(-P-ReflCalc->uk*(ReflCalc->tx_z-(Real)(2.)*ReflCalc->LayerDepth(ReflCalc->lays-1))-
- ReflCalc->um*((Real)(2.)*ReflCalc->LayerDepth(ReflCalc->layr-1)-ReflCalc->rx_z));
- if (ReflCalc->layr < ReflCalc->nlay-1) {
- CON += ReflCalc->rtd(ReflCalc->lays)*(RS_SN(ReflCalc->id-1,1)*ReflCalc->rtu(ReflCalc->layr) *
- std::exp(-P-ReflCalc->uk*( (Real)(2.)*ReflCalc->LayerThickness(ReflCalc->lays)-ReflCalc->tx_z)-
- ReflCalc->um*ReflCalc->rx_z) + RS_SN(ReflCalc->id-1,3)*
- std::exp(-P-ReflCalc->uk*( (Real)(2.)*ReflCalc->LayerThickness(ReflCalc->lays)-ReflCalc->tx_z)-
- ReflCalc->um*( (Real)(2.)*ReflCalc->LayerDepth(ReflCalc->layr-1)-ReflCalc->rx_z)));
- }
- }
-
- return ra*A*CON*ud;
- }
-
- template<EMMODE Mode, int Ikernel, DIPOLE_LOCATION Isource, DIPOLE_LOCATION Irecv>
- Complex KernelEM1DSpec<Mode, Ikernel, Isource, Irecv>::RelPotentialBelowSourceLayer(const Real &ra) {
- static bool called = false;
- if (!called) {
- std::cout << "WARNING\n";
- std::cout << "Unspecialised PotentialBelowSourceLayer <" << Mode << " " << Ikernel << " "
- << Isource << " " << Irecv << ">...this function will be slow\n\n";
- called = true;
- }
- return PotentialBelowSourceLayer(ra);
- }
-
- template<EMMODE Mode, int Ikernel, DIPOLE_LOCATION Isource, DIPOLE_LOCATION Irecv>
- Complex KernelEM1DSpec<Mode, Ikernel, Isource, Irecv>::PotentialBelowSourceLayer(const Real &ra) {
- static bool called = false;
- if (!called) {
- std::cout << "WARNING\n";
- std::cout << "Unspecialised PotentialBelowSourceLayer <" << Mode << " " << Ikernel << " "
- << Isource << " " << Irecv << ">...this function will be slow\n\n";
- called = true;
- }
- Complex ud;
- switch (ReflCalc->id) {
- case 2:
- ud = ReflCalc->um;
- break;
- case 3:
- ud = ReflCalc->uk;
- break;
- case 4:
- ud = ReflCalc->um*ReflCalc->uk;
- break;
- default:
- ud = 1.;
- }
- Complex dd(1.,0);
- if (ReflCalc->lays > 0) {
- dd -= ReflCalc->rtu(ReflCalc->lays)*ReflCalc->rtd(ReflCalc->lays)*ReflCalc->cf(ReflCalc->lays);
- }
- if (ReflCalc->lays < ReflCalc->nlay) {
- dd *= ((Real)(1.)+ReflCalc->rtd(ReflCalc->lays+1)*ReflCalc->cf(ReflCalc->lays+1));
- }
- Complex a = ((Real)(1.) + ReflCalc->rtd(ReflCalc->lays)) / dd;
- if (ReflCalc->layr >= ReflCalc->lays+2) {
- for (int n=ReflCalc->lays+2; n<=ReflCalc->layr; ++n) {
- a *= ((Real)(1.)+ReflCalc->rtd(n-1));
- if (n < ReflCalc->nlay-1) {
- a /= ((Real)(1.)+ReflCalc->rtd(n)*ReflCalc->cf(n));
- }
- }
- }
- Complex p(0,0);
- for (int n=ReflCalc->lays+1; n<=ReflCalc->layr; ++n) {
- Complex ut = ReflCalc->u(0);
- if (n>1) {
- ut = ReflCalc->u(n-1);
- }
- p += (ReflCalc->u(n)-ut) * ReflCalc->LayerDepth(n-1);
- }
- Complex con = SR_SN(ReflCalc->id-1, 0) * std::exp(ReflCalc->uk*ReflCalc->tx_z - ReflCalc->um*ReflCalc->rx_z + p);
- if (ReflCalc->layr < ReflCalc->Earth->GetNumberOfLayers()-1) {
- con += SR_SN(ReflCalc->id-1, 2) * ReflCalc->rtd(ReflCalc->layr) * std::exp(ReflCalc->uk*ReflCalc->tx_z-
- ReflCalc->um*((Real)(2.)*ReflCalc->LayerDepth(ReflCalc->layr)-ReflCalc->rx_z)+p);
- }
- if (ReflCalc->lays > 0) {
- con += SR_SN(ReflCalc->id-1, 1) * ReflCalc->rtu(ReflCalc->lays)*std::exp(ReflCalc->uk*( (Real)(2.)*
- ReflCalc->LayerDepth(ReflCalc->lays-1)-ReflCalc->tx_z)-ReflCalc->um*ReflCalc->rx_z+p);
- if (ReflCalc->layr < ReflCalc->Earth->GetNumberOfLayers()-1) {
- con += SR_SN(ReflCalc->id-1, 3) * ReflCalc->rtu(ReflCalc->lays)*ReflCalc->rtd(ReflCalc->layr) *
- std::exp(ReflCalc->uk*((Real)(2.)*ReflCalc->LayerDepth(ReflCalc->lays-1)-ReflCalc->tx_z)-ReflCalc->um*
- ((Real)(2.)*ReflCalc->LayerDepth(ReflCalc->layr)-ReflCalc->rx_z)+p);
- }
- }
- return ra*a*con*ud;
- }
-
- template<EMMODE Mode, int Ikernel, DIPOLE_LOCATION Isource, DIPOLE_LOCATION Irecv>
- Complex KernelEM1DSpec<Mode, Ikernel, Isource, Irecv>::RelPotentialInSourceLayer(const Real &ra) {
- static bool called = false;
- if (!called) {
- std::cout << "Unspecialised KernelEM1DSpec::RelPotentialInSourceLayer() <" << Mode << " " << Ikernel << " "
- << Isource << " " << Irecv << ">...slow" << std::endl;
- called = true;
- }
- return PotentialInSourceLayer(ra);
- }
-
- template<EMMODE Mode, int Ikernel, DIPOLE_LOCATION Isource, DIPOLE_LOCATION Irecv>
- Complex KernelEM1DSpec<Mode, Ikernel, Isource, Irecv>::PotentialInSourceLayer(const Real &ra) {
- static bool called = false;
- if (!called) {
- std::cout << "WARNING\n";
- std::cout << "Unspecialised PotentialInSourceLayer <" << Mode << " " << Ikernel << " "
- << Isource << " " << Irecv << ">...this function will be slow\n\n";
- called = true;
- }
- int iud(0);
- if (ReflCalc->rx_z <= ReflCalc->tx_z) iud=1;
- Real adz = std::abs(ReflCalc->rx_z - ReflCalc->tx_z);
- Complex con;
- Complex ud;
- switch (ReflCalc->id) {
- case (1):
- ud = 1.;
- break;
- case (4):
- ud = ReflCalc->uk*ReflCalc->uk;
- break;
- default:
- ud = ReflCalc->uk;
- }
- if (ReflCalc->lays == 0) {
- con = ReflCalc->rtd(0)*std::exp(ReflCalc->u(0)*(ReflCalc->rx_z+ReflCalc->tx_z));
- } else {
- if (ReflCalc->lays == ReflCalc->Earth->GetNumberOfLayers() - 1) {
- con = SS_SN(ReflCalc->id-1, 0)*ReflCalc->rtu(ReflCalc->nlay-1)*std::exp(ReflCalc->u(ReflCalc->nlay-1) *
- ((Real)(2.)*ReflCalc->LayerDepth(ReflCalc->nlay-2)-ReflCalc->rx_z-ReflCalc->tx_z));
- } else {
- con = ReflCalc->rtu(ReflCalc->lays)*(SS_SN(ReflCalc->id-1,0)*
- std::exp(ReflCalc->uk*((Real)(2.)*ReflCalc->LayerDepth(ReflCalc->lays-1)-ReflCalc->rx_z-ReflCalc->tx_z))
- + SS_SN(ReflCalc->id-1, 1)*ReflCalc->rtd(ReflCalc->lays)
- * std::exp(ReflCalc->uk*(ReflCalc->tx_z-ReflCalc->rx_z-(Real)(2.)* ReflCalc->LayerThickness(ReflCalc->lays))))
- + ReflCalc->rtd(ReflCalc->lays)
- * ( SS_SN(ReflCalc->id-1, 2)
- * std::exp(ReflCalc->uk*(ReflCalc->rx_z+ReflCalc->tx_z-(Real)(2.) * ReflCalc->LayerDepth(ReflCalc->lays)))
- + SS_SN(ReflCalc->id-1, 3)*ReflCalc->rtu(ReflCalc->lays)
- * std::exp(ReflCalc->uk*(ReflCalc->rx_z-ReflCalc->tx_z-(Real)(2.) * ReflCalc->LayerThickness(ReflCalc->lays)))
- ) ;
- con /= ((Real)(1.)-ReflCalc->rtu(ReflCalc->lays)*ReflCalc->rtd(ReflCalc->lays)*ReflCalc->cf(ReflCalc->lays)) ;
- }
- }
- // Add singular term (source term)
- con += SS_SL(ReflCalc->id-1, iud)*std::exp(-ReflCalc->uk*adz);
- return ra*ud*con;
- }
-
- } // ----- end of Lemma name -----
-
- #endif // ----- #ifndef KERNELEM1DSPEC_INC -----
|