Browse Source

Work towards port to C++-11. Still not functioning, but a snapshot.

enhancement_3
Trevor Irons 8 years ago
parent
commit
fe87e26a9a

+ 46
- 40
Modules/FDEM1D/include/DipoleSource.h View File

14
 #ifndef __DIPOLESOURCE_H
14
 #ifndef __DIPOLESOURCE_H
15
 #define __DIPOLESOURCE_H
15
 #define __DIPOLESOURCE_H
16
 
16
 
17
-#include "LemmaObject.h"
18
 #include "LayeredEarthEM.h"
17
 #include "LayeredEarthEM.h"
18
+#include "FieldPoints.h"
19
 
19
 
20
-#include "receiverpoints.h"
21
-#include "emearth1d.h"
20
+//#include "emearth1d.h"
22
 
21
 
23
 #ifdef LEMMAUSEVTK
22
 #ifdef LEMMAUSEVTK
24
 #include "vtkActor.h"
23
 #include "vtkActor.h"
32
 
31
 
33
 namespace Lemma {
32
 namespace Lemma {
34
 
33
 
34
+    // Forward declarations
35
     class KernelEM1DManager;
35
     class KernelEM1DManager;
36
-    class ReceiverPoints;
37
     class HankelTransform;
36
     class HankelTransform;
38
 
37
 
39
     // ==========================================================================
38
     // ==========================================================================
44
     // ==========================================================================
43
     // ==========================================================================
45
     class DipoleSource : public LemmaObject {
44
     class DipoleSource : public LemmaObject {
46
 
45
 
47
-        public:
46
+        // ====================    FRIENDS     ======================
48
 
47
 
49
-            // ====================    FRIENDS     ======================
48
+        friend std::ostream &operator<<(std::ostream &stream, const DipoleSource &ob);
50
 
49
 
51
-            friend std::ostream &operator<<(std::ostream &stream,
52
-                        const DipoleSource &ob);
50
+        struct ctor_key{};
53
 
51
 
52
+        public:
54
 
53
 
55
             // ====================  LIFECYCLE     ======================
54
             // ====================  LIFECYCLE     ======================
56
 
55
 
56
+            /** Default locked constructor. */
57
+            explicit DipoleSource ( const ctor_key& );
58
+
59
+            /** Locked deserializing constructor */
60
+            DipoleSource ( const YAML::Node& node, const ctor_key& );
61
+
62
+            /** Default locked constructor. */
63
+            ~DipoleSource ();
64
+
57
             /**
65
             /**
58
-             *  Returns pointer to new DipoleSource. Location is
66
+             *  Returns shared_ptr  to new DipoleSource. Location is
59
              *  initialized to (0,0,0) type and polarization are
67
              *  initialized to (0,0,0) type and polarization are
60
              *  initialized  to nonworking values that will throw
68
              *  initialized  to nonworking values that will throw
61
              *  exceptions if used.
69
              *  exceptions if used.
62
              */
70
              */
63
-            static DipoleSource* New();
71
+            static std::shared_ptr< DipoleSource > NewSP();
64
 
72
 
65
-
66
-            /** Returns a deep copy of the dipole. Used to make thread safe methods. Does not
67
-                copy attachments.
73
+            /**
74
+             *   YAML Serializing method
68
              */
75
              */
69
-            DipoleSource* Clone();
76
+            YAML::Node Serialize() const;
70
 
77
 
71
             /**
78
             /**
72
-             * @copybrief LemmaObject::Delete()
73
-             * @copydetails LemmaObject::Delete()
79
+             *   Constructs an object from a YAML::Node.
74
              */
80
              */
75
-            void Delete();
81
+            static std::shared_ptr< DipoleSource > DeSerialize(const YAML::Node& node);
82
+
83
+
84
+            /** Returns a deep copy of the dipole. Used to make thread safe methods. Does not
85
+                copy attachments.
86
+             */
87
+            std::shared_ptr< DipoleSource > Clone();
76
 
88
 
77
             // ====================  OPERATORS     ======================
89
             // ====================  OPERATORS     ======================
78
 
90
 
80
 
92
 
81
             /** Determines if kernels have been loaded already, and if so if they can be reused
93
             /** Determines if kernels have been loaded already, and if so if they can be reused
82
              */
94
              */
83
-            void SetKernels(const int& ifreq,  const FIELDCALCULATIONS&  Fields, ReceiverPoints* Receivers, const int& irec,
84
-                    LayeredEarthEM* Earth );
95
+            void SetKernels(const int& ifreq,  const FIELDCALCULATIONS&  Fields, std::shared_ptr<FieldPoints> Receivers, const int& irec,
96
+                    std::shared_ptr<LayeredEarthEM> Earth );
85
 
97
 
86
             /** resets the kernels if they cannot be reused */
98
             /** resets the kernels if they cannot be reused */
87
-            virtual void ReSetKernels(const int& ifreq,  const FIELDCALCULATIONS&  Fields, ReceiverPoints* Receivers, const int& irec,
88
-                    LayeredEarthEM* Earth );
99
+            virtual void ReSetKernels(const int& ifreq,  const FIELDCALCULATIONS&  Fields, std::shared_ptr<FieldPoints> Receivers,
100
+                    const int& irec, std::shared_ptr<LayeredEarthEM> Earth );
89
 
101
 
90
             /** Updates the receiver fields */
102
             /** Updates the receiver fields */
91
-            virtual void UpdateFields(const int& ifreq, HankelTransform* Hankel, const Real& wavef);
103
+            virtual void UpdateFields(const int& ifreq, std::shared_ptr<HankelTransform> Hankel, const Real& wavef);
92
 
104
 
93
             // ====================  ACCESS        ======================
105
             // ====================  ACCESS        ======================
94
 
106
 
169
             DipoleSourceType GetType();
181
             DipoleSourceType GetType();
170
 
182
 
171
             /// Returns pointer to KernelEM1DManager
183
             /// Returns pointer to KernelEM1DManager
172
-            KernelEM1DManager*  GetKernelManager();
184
+            std::shared_ptr<KernelEM1DManager>  GetKernelManager();
173
 
185
 
174
             // Returns enumerated DipoleSourcePolarization
186
             // Returns enumerated DipoleSourcePolarization
175
             //DipoleSourcePolarisation GetDipoleSourcePolarisation();
187
             //DipoleSourcePolarisation GetDipoleSourcePolarisation();
199
             vtkActor* GetVtkActor();
211
             vtkActor* GetVtkActor();
200
             #endif
212
             #endif
201
 
213
 
202
-        protected:
214
+            /** Returns the name of the underlying class, similiar to Python's type */
215
+            virtual inline std::string GetName() const {
216
+                return CName;
217
+            }
203
 
218
 
204
-            // ====================  LIFECYCLE     ======================
205
-
206
-            /// Default protected constructor.
207
-            DipoleSource (const std::string &name);
208
-
209
-            /// Default protected constructor.
210
-            ~DipoleSource ();
211
-
212
-            /**
213
-             * @copybrief LemmaObject::Release()
214
-             * @copydetails LemmaObject::Release()
215
-             */
216
-            void Release();
219
+        private:
217
 
220
 
218
             // ====================  DATA MEMBERS  ======================
221
             // ====================  DATA MEMBERS  ======================
219
 
222
 
263
             VectorXr                     Freqs;
266
             VectorXr                     Freqs;
264
 
267
 
265
             /// Storage of the EM1D kernels used by this dipole
268
             /// Storage of the EM1D kernels used by this dipole
266
-            KernelEM1DManager*          KernelManager;
269
+            std::shared_ptr<KernelEM1DManager>          KernelManager;
267
 
270
 
268
             /// Receiver points, keep track if these have changed
271
             /// Receiver points, keep track if these have changed
269
-            ReceiverPoints*             Receivers;
272
+            std::shared_ptr<FieldPoints>                Receivers;
270
 
273
 
271
             /// Layered Earth used by Kernels
274
             /// Layered Earth used by Kernels
272
-            LayeredEarthEM*             Earth;
275
+            std::shared_ptr<LayeredEarthEM>             Earth;
276
+
277
+            /** ASCII string representation of the class name */
278
+            static constexpr auto CName = "DipoleSource";
273
 
279
 
274
     }; // -----  end of class  DipoleSource  -----
280
     }; // -----  end of class  DipoleSource  -----
275
 
281
 

+ 6
- 4
Modules/FDEM1D/include/FieldPoints.h View File

28
 #endif
28
 #endif
29
 
29
 
30
 #include "LemmaObject.h"
30
 #include "LemmaObject.h"
31
-//#include "dipolesource.h"
31
+//#include "DipoleSource.h"
32
 
32
 
33
 namespace Lemma {
33
 namespace Lemma {
34
 
34
 
35
     // Forward Declarations
35
     // Forward Declarations
36
-    class DipoleSource;
36
+    //class DipoleSource;
37
 
37
 
38
     // =======================================================================
38
     // =======================================================================
39
     //        Class:  FieldPoints
39
     //        Class:  FieldPoints
48
     // =======================================================================
48
     // =======================================================================
49
     class FieldPoints : public LemmaObject {
49
     class FieldPoints : public LemmaObject {
50
 
50
 
51
+        friend class EMEarth1D;
52
+        friend class DipoleSource;
53
+
51
         /**
54
         /**
52
          *  Stream operator printing out information about this class.
55
          *  Stream operator printing out information about this class.
53
          */
56
          */
59
 
62
 
60
             // ====================    FRIENDS     ===========================
63
             // ====================    FRIENDS     ===========================
61
 
64
 
62
-            //friend class EMEarth1D;
63
-            //friend class DipoleSource;
65
+
64
 
66
 
65
             // ====================  LIFECYCLE     ===========================
67
             // ====================  LIFECYCLE     ===========================
66
 
68
 

Modules/FDEM1D/include/kernelem1dmanager.h → Modules/FDEM1D/include/KernelEM1DManager.h View File

17
 //#include "dipolesource.h"
17
 //#include "dipolesource.h"
18
 //#include "kernelem1dreflbase.h"
18
 //#include "kernelem1dreflbase.h"
19
 #include "kernelem1dbase.h"
19
 #include "kernelem1dbase.h"
20
-#include "kernelem1dspec.h"
20
+#include "KernelEM1DSpec.h"
21
 
21
 
22
 namespace Lemma {
22
 namespace Lemma {
23
 
23
 
34
     // ===================================================================
34
     // ===================================================================
35
     class KernelEM1DManager : public LemmaObject {
35
     class KernelEM1DManager : public LemmaObject {
36
 
36
 
37
-        public:
37
+        struct ctor_key {};
38
+
39
+        friend std::ostream &operator<<(std::ostream &stream, const KernelEM1DManager &ob);
38
 
40
 
39
-            friend std::ostream &operator<<(std::ostream &stream,
40
-                        const KernelEM1DManager &ob);
41
+        public:
41
 
42
 
42
             // ====================  LIFECYCLE     =======================
43
             // ====================  LIFECYCLE     =======================
43
 
44
 
45
+            /** Default protected constructor. */
46
+            KernelEM1DManager (const std::string& name);
47
+
48
+            /** Default protected constructor. */
49
+            ~KernelEM1DManager ();
50
+
44
             /** Returns a pointer to a new object of type KernelEM1DManager.
51
             /** Returns a pointer to a new object of type KernelEM1DManager.
45
              * It allocates all necessary memory.
52
              * It allocates all necessary memory.
46
              */
53
              */
47
-            static KernelEM1DManager* New();
48
-
49
-            /** Deletes this object. Delete also disconnects any
50
-             * attachments to this object.
51
-             */
52
-            void Delete();
54
+            static std::shared_ptr<KernelEM1DManager> NewSP();
53
 
55
 
54
             // ====================  OPERATORS     =======================
56
             // ====================  OPERATORS     =======================
55
 
57
 
60
             /*
62
             /*
61
             {
63
             {
62
 
64
 
63
-                KernelEm1DSpec<Mode, Ikernel, Isource, Irecv>* NewKern =
64
-                    KernelEm1DSpec<Mode, Ikernel, Isource, Irecv>::New();
65
+                KernelEM1DSpec<Mode, Ikernel, Isource, Irecv>* NewKern =
66
+                    KernelEM1DSpec<Mode, Ikernel, Isource, Irecv>::New();
65
                 KernelVec.push_back( NewKern );
67
                 KernelVec.push_back( NewKern );
66
                 NewKern->managerIdx = KernelVec.size()-1;
68
                 NewKern->managerIdx = KernelVec.size()-1;
67
                 switch (Mode) {
69
                 switch (Mode) {
99
 
101
 
100
             /** Clears the vector of kernels */
102
             /** Clears the vector of kernels */
101
             void ClearVec() {
103
             void ClearVec() {
102
-                for (unsigned int ik=0; ik<this->KernelVec.size(); ++ik) {
103
-                    this->KernelVec[ik]->Delete();
104
-                }
105
                 KernelVec.clear();
104
                 KernelVec.clear();
106
             }
105
             }
107
 
106
 
109
 
108
 
110
             /** Sets the LayeredEarthEM class that will be used by the kernels.
109
             /** Sets the LayeredEarthEM class that will be used by the kernels.
111
              */
110
              */
112
-            void SetEarth( LayeredEarthEM*   Earth);
111
+            void SetEarth( std::shared_ptr<LayeredEarthEM>   Earth);
113
 
112
 
114
             /** Sets the source of the kernels */
113
             /** Sets the source of the kernels */
115
-            void SetDipoleSource( DipoleSource*   Dipole, const int& ifreq, const Real& rx_zin);
114
+            void SetDipoleSource( std::shared_ptr<DipoleSource> Dipole, const int& ifreq, const Real& rx_zin);
116
 
115
 
117
             /** Returns pointer to specified kernel indice. Indices are assigned in the same
116
             /** Returns pointer to specified kernel indice. Indices are assigned in the same
118
                 order as they are created by AddKernel.
117
                 order as they are created by AddKernel.
119
              */
118
              */
120
-            KernelEm1DBase*    GetKernel(const unsigned int& ik);
119
+            std::shared_ptr<KernelEm1DBase>    GetKernel(const unsigned int& ik);
121
 
120
 
122
             /** Returns pointer to connected dipole.
121
             /** Returns pointer to connected dipole.
123
              */
122
              */
124
-            DipoleSource*    GetDipole( );
123
+            std::shared_ptr<DipoleSource>    GetDipole( );
125
 
124
 
126
-            inline std::vector<KernelEm1DBase*>  GetSTLVector() {
125
+            inline std::vector< std::shared_ptr<KernelEm1DBase> >  GetSTLVector() {
127
                 return KernelVec;
126
                 return KernelVec;
128
             }
127
             }
129
 
128
 
130
             // ====================  INQUIRY       =======================
129
             // ====================  INQUIRY       =======================
131
 
130
 
131
+            /** Returns the name of the underlying class, similiar to Python's type */
132
+            virtual inline std::string GetName() const {
133
+                return CName;
134
+            }
135
+
132
         protected:
136
         protected:
133
 
137
 
134
             // ====================  LIFECYCLE     =======================
138
             // ====================  LIFECYCLE     =======================
135
 
139
 
136
-            /** Default protected constructor. */
137
-            KernelEM1DManager (const std::string& name);
138
-
139
-            /** Default protected constructor. */
140
-            ~KernelEM1DManager ();
141
-
142
-            /**
143
-             * @copybrief LemmaObject::Release()
144
-             * @copydetails LemmaObject::Release()
145
-             */
146
-            void Release();
147
-
148
             // ====================  DATA MEMBERS  =========================
140
             // ====================  DATA MEMBERS  =========================
149
 
141
 
150
             /** List of KernelEm1D instances */
142
             /** List of KernelEm1D instances */
151
-            std::vector<KernelEm1DBase*>           KernelVec;
143
+            std::vector< std::shared_ptr<KernelEm1DBase> >  KernelVec;
152
 
144
 
153
             /** Reflection base used for TE mode */
145
             /** Reflection base used for TE mode */
154
-            KernelEM1DReflBase*                    TEReflBase;
146
+            std::shared_ptr<KernelEM1DReflBase>        TEReflBase;
155
 
147
 
156
             /** Reflection base used for TM mode */
148
             /** Reflection base used for TM mode */
157
-            KernelEM1DReflBase*                    TMReflBase;
149
+            std::shared_ptr<KernelEM1DReflBase>        TMReflBase;
158
 
150
 
159
             /** EmEarth Class */
151
             /** EmEarth Class */
160
-            LayeredEarthEM*                        Earth;
152
+            std::shared_ptr<LayeredEarthEM>            Earth;
161
 
153
 
162
             /** EM dipole souce */
154
             /** EM dipole souce */
163
-            DipoleSource*                          Dipole;
155
+            std::shared_ptr<DipoleSource>              Dipole;
164
 
156
 
165
             /** Frequency index for the sources */
157
             /** Frequency index for the sources */
166
-            int                                    ifreq;
158
+            int                                        ifreq;
167
 
159
 
168
             /** Receiver height */
160
             /** Receiver height */
169
-            Real                                   rx_z;
161
+            Real                                       rx_z;
170
 
162
 
171
         private:
163
         private:
172
 
164
 
165
+            static constexpr auto CName = "KernelEM1DManager";
166
+
173
     }; // -----  end of class  KernelEM1DManager  -----
167
     }; // -----  end of class  KernelEM1DManager  -----
174
 
168
 
175
     // template methods
169
     // template methods
176
     template<EMMODE Mode, int Ikernel, DIPOLE_LOCATION Isource, DIPOLE_LOCATION Irecv>
170
     template<EMMODE Mode, int Ikernel, DIPOLE_LOCATION Isource, DIPOLE_LOCATION Irecv>
177
     int KernelEM1DManager::AddKernel( ) {
171
     int KernelEM1DManager::AddKernel( ) {
178
 
172
 
179
-        KernelEm1DSpec<Mode, Ikernel, Isource, Irecv>* NewKern =
180
-                    KernelEm1DSpec<Mode, Ikernel, Isource, Irecv>::New();
173
+        auto NewKern = KernelEM1DSpec<Mode, Ikernel, Isource, Irecv>::NewSP();
181
         KernelVec.push_back( NewKern );
174
         KernelVec.push_back( NewKern );
182
         NewKern->managerIdx = KernelVec.size()-1;
175
         NewKern->managerIdx = KernelVec.size()-1;
183
         switch (Mode) {
176
         switch (Mode) {
184
             case TE:
177
             case TE:
185
-                if (TEReflBase == NULL) {
186
-                    TEReflBase = KernelEM1DReflSpec<TE, Isource, Irecv>::New();
178
+                if (TEReflBase == nullptr) {
179
+                    TEReflBase = KernelEM1DReflSpec<TE, Isource, Irecv>::NewSP();
187
                     TEReflBase->Initialise(Earth);
180
                     TEReflBase->Initialise(Earth);
188
                     TEReflBase->SetUpSource(Dipole, ifreq);
181
                     TEReflBase->SetUpSource(Dipole, ifreq);
189
                     TEReflBase->SetUpReceiver( rx_z );
182
                     TEReflBase->SetUpReceiver( rx_z );
191
                 NewKern->SetReflBase(TEReflBase);
184
                 NewKern->SetReflBase(TEReflBase);
192
                 break;
185
                 break;
193
             case TM:
186
             case TM:
194
-                if (TMReflBase == NULL) {
195
-                    TMReflBase = KernelEM1DReflSpec<TM, Isource, Irecv>::New();
187
+                if (TMReflBase == nullptr) {
188
+                    TMReflBase = KernelEM1DReflSpec<TM, Isource, Irecv>::NewSP();
196
                     TMReflBase->Initialise(Earth);
189
                     TMReflBase->Initialise(Earth);
197
                     TMReflBase->SetUpSource(Dipole, ifreq);
190
                     TMReflBase->SetUpSource(Dipole, ifreq);
198
                     TMReflBase->SetUpReceiver( rx_z );
191
                     TMReflBase->SetUpReceiver( rx_z );

Modules/FDEM1D/include/kernelem1dreflspec.h → Modules/FDEM1D/include/KernelEM1DReflSpec.h View File

14
 #ifndef  KERNELEM1DREFLSPEC_INC
14
 #ifndef  KERNELEM1DREFLSPEC_INC
15
 #define  KERNELEM1DREFLSPEC_INC
15
 #define  KERNELEM1DREFLSPEC_INC
16
 
16
 
17
-#include "dipolesource.h"
18
-#include "kernelem1dreflbase.h"
19
-#include "layeredearthem.h"
17
+#include "DipoleSource.h"
18
+#include "LayeredEarthEM.h"
20
 
19
 
21
-// #include<unordered_map> // for caching results
20
+#include "kernelem1dreflbase.h"
22
 
21
 
23
 namespace Lemma {
22
 namespace Lemma {
24
 
23
 
25
-    // forward declare
26
-    //struct cache;
27
-    // Simple container to hold reflection results
28
-    struct  cache {
29
-        Real                       rho0;
30
-        Real                       lambda[805];
31
-        Real                       rams[805];
32
-        Complex                    uk[805];
33
-        Complex                    um[805];
34
-        Real                       zh0i[805];
35
-        VectorXcr                  Rtd[805];
36
-        VectorXcr                  Rtu[805];
37
-        VectorXcr                  u[805];
38
-        VectorXcr                  cf[805];
39
-        VectorXcr                  kk[805];
40
-        const Real                 epsilon;
41
-        //bool                       nc;
42
-        cache( ) : epsilon (std::numeric_limits<Real>::epsilon() ) { // TODO reset to precision of Real
43
-            //Rtd = VectorXcr::Zero(805);
44
-            //Rtu = VectorXcr::Zero(805);
45
-        }
46
-    };
47
-
48
     // forward declaration for friend
24
     // forward declaration for friend
49
     template<EMMODE Mode, int Ikernel, DIPOLE_LOCATION Isource, DIPOLE_LOCATION Irecv>
25
     template<EMMODE Mode, int Ikernel, DIPOLE_LOCATION Isource, DIPOLE_LOCATION Irecv>
50
-    class KernelEm1DSpec;
26
+    class KernelEM1DSpec;
51
 
27
 
52
     // ===================================================================
28
     // ===================================================================
53
     //  Class:  KernelEM1DReflSpec
29
     //  Class:  KernelEM1DReflSpec
55
       @class
31
       @class
56
       \brief   Specialized version of KernelEM1DReflBase
32
       \brief   Specialized version of KernelEM1DReflBase
57
       \details Through use of template specialisations, this KernelEm1D
33
       \details Through use of template specialisations, this KernelEm1D
58
-               class delivers much better performance.
34
+               class delivers much better performance. This class is internal
35
+               to Lemma, you should never need to instantiate it. The constructors
36
+               are public to allow make_shared. Additonally, this class is not
37
+               serializable.
59
      */
38
      */
60
     // ===================================================================
39
     // ===================================================================
61
     template<EMMODE Mode, DIPOLE_LOCATION Isource, DIPOLE_LOCATION Irecv>
40
     template<EMMODE Mode, DIPOLE_LOCATION Isource, DIPOLE_LOCATION Irecv>
62
     class KernelEM1DReflSpec : public KernelEM1DReflBase {
41
     class KernelEM1DReflSpec : public KernelEM1DReflBase {
63
 
42
 
43
+        // TODO can we use the manager's key instead to lock for that?
44
+        struct ctor_key{};
45
+
64
         public:
46
         public:
65
 
47
 
48
+            // what do these template parameters do -TI
66
             template<EMMODE Mode2, int Ikernel2, DIPOLE_LOCATION Isource2, DIPOLE_LOCATION Irecv2>
49
             template<EMMODE Mode2, int Ikernel2, DIPOLE_LOCATION Isource2, DIPOLE_LOCATION Irecv2>
67
-            friend class KernelEm1DSpec;
50
+            friend class KernelEM1DSpec;
68
             friend class KernelEM1DManager;
51
             friend class KernelEM1DManager;
69
 
52
 
70
             // ====================  LIFECYCLE     =======================
53
             // ====================  LIFECYCLE     =======================
71
 
54
 
72
-            static KernelEM1DReflSpec* New() {
73
-                KernelEM1DReflSpec<Mode, Isource, Irecv>*  Obj =
74
-                    new KernelEM1DReflSpec<Mode, Isource, Irecv>("KernelEM1DReflSpec<>");
75
-                Obj->AttachTo(Obj);
76
-                return Obj;
55
+            /// Default locked constructor.
56
+            explicit KernelEM1DReflSpec ( const ctor_key& ) : KernelEM1DReflBase( ) {
77
             }
57
             }
78
 
58
 
79
-            void Delete() {
80
-                this->DetachFrom(this);
59
+            /// Default protected constructor.
60
+            ~KernelEM1DReflSpec () {
61
+            }
62
+
63
+            static std::shared_ptr<KernelEM1DReflSpec<Mode, Isource, Irecv> > NewSP() {
64
+                return std::make_shared<KernelEM1DReflSpec<Mode, Isource, Irecv> >( ctor_key() );
81
             }
65
             }
82
 
66
 
83
             // ====================  OPERATORS     =======================
67
             // ====================  OPERATORS     =======================
89
             // ====================  INQUIRY       =======================
73
             // ====================  INQUIRY       =======================
90
 
74
 
91
         protected:
75
         protected:
76
+        private:
92
 
77
 
93
             // ====================  LIFECYCLE     =======================
78
             // ====================  LIFECYCLE     =======================
94
 
79
 
95
-            /// Default protected constructor.
96
-            KernelEM1DReflSpec (const std::string& name) : KernelEM1DReflBase(name)
97
-            {
98
-            }
99
-
100
-            /// Default protected constructor.
101
-            ~KernelEM1DReflSpec () {
102
-                if (this->NumberOfReferences > 0)
103
-                    throw DeleteObjectWithReferences( this );
104
-            }
105
-
106
-            void Release() {
107
-                delete this;
108
-            }
109
-
110
             // ====================  OPERATIONS    =======================
80
             // ====================  OPERATIONS    =======================
111
 
81
 
112
             /** Computes reflection coefficients. Depending on the
82
             /** Computes reflection coefficients. Depending on the
134
 
104
 
135
             // ====================  DATA MEMBERS  =========================
105
             // ====================  DATA MEMBERS  =========================
136
 
106
 
137
-        private:
138
-
139
-            //** Storage container for reused results */
140
-            //static std::unordered_map<Real, cache> CACHE;
141
-
142
-            //** Currenly used cache */
143
-            //cache* tcache;
144
-            //#pragma omp threadprivate(tcache)
145
-
146
     }; // -----  end of class  KernelEM1DReflSpec  -----
107
     }; // -----  end of class  KernelEM1DReflSpec  -----
147
 
108
 
148
     //template<EMMODE Mode, DIPOLE_LOCATION Isource, DIPOLE_LOCATION Irecv>
109
     //template<EMMODE Mode, DIPOLE_LOCATION Isource, DIPOLE_LOCATION Irecv>
180
 
141
 
181
     ///////////////////////////////////////////////
142
     ///////////////////////////////////////////////
182
     // Default mode definitions
143
     // Default mode definitions
183
-
184
-/*
185
-    template<EMMODE Mode, DIPOLE_LOCATION Isource, DIPOLE_LOCATION Irecv>
186
-    void KernelEM1DReflSpec<Mode, Isource, Irecv>::SetTCache(const Real& rho0) {
187
-       #ifdef LEMMAUSEOMP
188
-        #pragma omp critical
189
-        #endif
190
-        {
191
-        this->tcache = &this->CACHE[rho0];
192
-        }
193
-    }
194
-*/
195
-
196
-/*
197
-    template<EMMODE Mode, DIPOLE_LOCATION Isource, DIPOLE_LOCATION Irecv>
198
-    void KernelEM1DReflSpec<Mode, Isource, Irecv>::ComputeReflectionCoeffs(const Real& lambda, const int& idx) {
199
-
200
-        if ( (std::abs(this->tcache->lambda[idx]-lambda) <= this->tcache->epsilon) &&
201
-            this->tcache->u[idx].size() > 0  && std::abs(this->kk(0) - this->tcache->kk[idx](0)) <= this->tcache->epsilon ) {
202
-            //std::cout << "USING CACHED RESULTS !!!!!!" << std::endl;
203
-            // load all the values we need
204
-            this->u   = this->tcache->u[idx];
205
-            this->rams = this->tcache->rams[idx];
206
-            this->cf = this->tcache->cf[idx];
207
-            //this->kk = this->tcache->kk[idx];
208
-            this->uk = this->tcache->uk[idx];
209
-            this->um = this->tcache->um[idx];
210
-            this->rtd = this->tcache->Rtd[idx];
211
-            this->rtu = this->tcache->Rtu[idx];
212
-
213
-        } else { // else do the work
214
-        }
215
-
216
-        ComputeReflectionCoeffs(lambda);
217
-
218
-        //#pragma omp critical
219
-        //{
220
-        //std::cout << idx << "\t" << lambda << "\t" << rtd.transpose() << std::endl;
221
-        //}
222
-        // store the results
223
-        this->tcache->u[idx]      = this->u;
224
-        this->tcache->cf[idx]     = this->cf;
225
-        this->tcache->kk[idx]     = this->kk;
226
-        this->tcache->uk[idx]     = this->uk;
227
-        this->tcache->um[idx]     = this->um;
228
-        this->tcache->Rtd[idx]    = this->rtd;
229
-        this->tcache->Rtu[idx]    = this->rtu;
230
-        this->tcache->zh0i[idx]    = std::imag(this->zh[0]);
231
-        this->tcache->lambda[idx] = lambda;
232
-        this->tcache->rams[idx]   = rams;
233
-
234
-        }
235
-
236
-        return;
237
-    }
238
-*/
239
-
240
     template<EMMODE Mode, DIPOLE_LOCATION Isource, DIPOLE_LOCATION Irecv>
144
     template<EMMODE Mode, DIPOLE_LOCATION Isource, DIPOLE_LOCATION Irecv>
241
     void KernelEM1DReflSpec<Mode, Isource, Irecv>::ComputeReflectionCoeffs(const Real& lambda) {
145
     void KernelEM1DReflSpec<Mode, Isource, Irecv>::ComputeReflectionCoeffs(const Real& lambda) {
242
         static bool called = false;
146
         static bool called = false;

+ 0
- 1
Modules/FDEM1D/include/LayeredEarthEM.h View File

15
 #define __LAYEREDEARTHEM_H
15
 #define __LAYEREDEARTHEM_H
16
 
16
 
17
 #include "LayeredEarth.h"
17
 #include "LayeredEarth.h"
18
-#include <iomanip>
19
 
18
 
20
 namespace Lemma {
19
 namespace Lemma {
21
 
20
 

+ 37
- 47
Modules/FDEM1D/include/PolygonalWireAntenna.h View File

10
   @date     05/18/2010
10
   @date     05/18/2010
11
   @version  $Id: PolygonalWireAntenna.h 211 2015-02-27 05:43:26Z tirons $
11
   @version  $Id: PolygonalWireAntenna.h 211 2015-02-27 05:43:26Z tirons $
12
  **/
12
  **/
13
-
14
-#include "WireAntenna.h"
15
-
16
 #ifndef  POLYGONALWIREANTENNA_INC
13
 #ifndef  POLYGONALWIREANTENNA_INC
17
 #define  POLYGONALWIREANTENNA_INC
14
 #define  POLYGONALWIREANTENNA_INC
18
 
15
 
16
+#include "DipoleSource.h"
17
+#include "WireAntenna.h"
18
+
19
 namespace Lemma {
19
 namespace Lemma {
20
 
20
 
21
     // ===================================================================
21
     // ===================================================================
27
     // ===================================================================
27
     // ===================================================================
28
     class PolygonalWireAntenna : public WireAntenna {
28
     class PolygonalWireAntenna : public WireAntenna {
29
 
29
 
30
-        friend std::ostream &operator<<(std::ostream &stream,
31
-                const PolygonalWireAntenna &ob);
30
+        friend std::ostream &operator<<(std::ostream &stream, const PolygonalWireAntenna &ob);
31
+
32
+        struct ctor_key {};
32
 
33
 
33
         public:
34
         public:
34
 
35
 
35
             // ====================  LIFECYCLE     =======================
36
             // ====================  LIFECYCLE     =======================
36
 
37
 
38
+            /// Default protected constructor.
39
+            explicit PolygonalWireAntenna ( const ctor_key& );
40
+
41
+            /// Default protected constructor.
42
+            PolygonalWireAntenna (const YAML::Node& node, const ctor_key& );
43
+
44
+            /// Default protected constructor.
45
+            virtual ~PolygonalWireAntenna ();
46
+
37
             /**
47
             /**
38
              * Declares all memory and returns a new instance.
48
              * Declares all memory and returns a new instance.
39
              */
49
              */
40
-            static PolygonalWireAntenna* New();
50
+            static std::shared_ptr<PolygonalWireAntenna> NewSP();
51
+
52
+            /// Makes a deep copy of this antenna with all connections except
53
+            /// the dipole approximation.
54
+            std::shared_ptr<PolygonalWireAntenna> Clone();
41
 
55
 
42
             /**
56
             /**
43
-             * @copybrief LemmaObject::Delete()
44
-             * @copydetails LemmaObject::Delete()
57
+             *  Uses YAML to serialize this object.
58
+             *  @return a YAML::Node
45
              */
59
              */
46
-            void Delete();
60
+            YAML::Node Serialize() const;
47
 
61
 
48
-            /// Makes a deep copy of this antenna with all connections except
49
-            /// the dipole approximation.
50
-            PolygonalWireAntenna* Clone();
62
+            /**
63
+             *   Constructs an object from a YAML::Node.
64
+             */
65
+            static std::shared_ptr<PolygonalWireAntenna> DeSerialize(const YAML::Node& node);
51
 
66
 
52
             // ====================  OPERATORS     =======================
67
             // ====================  OPERATORS     =======================
53
 
68
 
77
 
92
 
78
             // ====================  INQUIRY       =======================
93
             // ====================  INQUIRY       =======================
79
 
94
 
80
-            #ifdef HAVE_YAMLCPP
81
-            /**
82
-             *  Uses YAML to serialize this object.
83
-             *  @return a YAML::Node
84
-             */
85
-            YAML::Node Serialize() const;
86
-
87
-            /**
88
-             *   Constructs an object from a YAML::Node.
89
-             */
90
-            static PolygonalWireAntenna* DeSerialize(const YAML::Node& node);
91
-            #endif
95
+            /** Returns the name of the underlying class, similiar to Python's type */
96
+            virtual inline std::string GetName() const {
97
+                return CName;
98
+            }
92
 
99
 
93
         protected:
100
         protected:
94
 
101
 
95
-            // ====================  LIFECYCLE     =======================
96
-
97
-            /// Default protected constructor.
98
-            PolygonalWireAntenna (const std::string& name);
99
-
100
-#ifdef HAVE_YAMLCPP
101
-            /// Default protected constructor.
102
-            PolygonalWireAntenna (const YAML::Node& node);
103
-#endif
104
-
105
-            /// Default protected constructor.
106
-            ~PolygonalWireAntenna ();
107
-
108
-            /**
109
-             * @copybrief LemmaObject::Release()
110
-             * @copydetails LemmaObject::Release()
111
-             */
112
-            void Release();
113
-
114
             // ====================  DATA MEMBERS  =======================
102
             // ====================  DATA MEMBERS  =======================
115
 
103
 
116
             /// minimum ratio of dipole moment to distance to receiver point
104
             /// minimum ratio of dipole moment to distance to receiver point
123
             Real maxDipoleMoment;
111
             Real maxDipoleMoment;
124
 
112
 
125
             /// appends
113
             /// appends
126
-            void PushXYZDipoles(const Vector3r &step, const Vector3r &cp,
114
+            void PushXYZDipoles( const Vector3r &step, const Vector3r &cp,
127
                             const Vector3r &dir,
115
                             const Vector3r &dir,
128
-                            std::vector<DipoleSource*> &Dipoles) ;
116
+                            std::vector< std::shared_ptr<DipoleSource> > &Dipoles) ;
129
 
117
 
130
             /// corrects for overstep
118
             /// corrects for overstep
131
-            void CorrectOverstepXYZDipoles(const Vector3r &step,
119
+            void CorrectOverstepXYZDipoles( const Vector3r &step,
132
                             const Vector3r &cp,
120
                             const Vector3r &cp,
133
                             const Vector3r &dir,
121
                             const Vector3r &dir,
134
-                            std::vector<DipoleSource*> &Dipoles );
122
+                            std::vector< std::shared_ptr<DipoleSource> > &Dipoles );
135
 
123
 
136
             // ====================  OPERATIONS    =======================
124
             // ====================  OPERATIONS    =======================
137
 
125
 
162
 
150
 
163
             Vector3r                               rRepeat;
151
             Vector3r                               rRepeat;
164
 
152
 
153
+            static constexpr auto CName = "PolygonalWireAntenna";
154
+
165
     }; // -----  end of class  PolygonalWireAntenna  -----
155
     }; // -----  end of class  PolygonalWireAntenna  -----
166
 
156
 
167
 }       // -----  end of Lemma  name  -----
157
 }       // -----  end of Lemma  name  -----

+ 32
- 47
Modules/FDEM1D/include/WireAntenna.h View File

14
 #ifndef __WIREANTENNA_H
14
 #ifndef __WIREANTENNA_H
15
 #define __WIREANTENNA_H
15
 #define __WIREANTENNA_H
16
 
16
 
17
-#include "LemmaObject.h"
18
-#include "dipolesource.h"
17
+#include "DipoleSource.h"
19
 
18
 
20
 #ifdef LEMMAUSEVTK
19
 #ifdef LEMMAUSEVTK
21
 #include "vtkActor.h"
20
 #include "vtkActor.h"
32
     // ===================================================================
31
     // ===================================================================
33
     class WireAntenna : public LemmaObject {
32
     class WireAntenna : public LemmaObject {
34
 
33
 
35
-        friend std::ostream &operator<<(std::ostream &stream,
36
-            const WireAntenna &ob);
34
+        friend std::ostream &operator<<(std::ostream &stream, const WireAntenna &ob);
35
+
36
+        struct ctor_key {};
37
 
37
 
38
         public:
38
         public:
39
 
39
 
40
             // ====================  LIFECYCLE     =======================
40
             // ====================  LIFECYCLE     =======================
41
 
41
 
42
+            /** Locked default constructor */
43
+            explicit WireAntenna ( const ctor_key& );
44
+
45
+            /** Locked deserializing constructor */
46
+            WireAntenna ( const YAML::Node& node, const ctor_key& );
47
+
48
+            /** Destructor */
49
+            virtual ~WireAntenna();
50
+
42
             /**
51
             /**
43
              * Initialises antenna to contain no points, with no current
52
              * Initialises antenna to contain no points, with no current
44
              * and no frequency. NumberOfTurns set to 1
53
              * and no frequency. NumberOfTurns set to 1
45
              */
54
              */
46
-            static WireAntenna* New();
55
+            static std::shared_ptr<WireAntenna> NewSP();
47
 
56
 
48
             /**
57
             /**
49
              * Provides deep copy
58
              * Provides deep copy
50
              */
59
              */
51
-            virtual WireAntenna* Clone();
60
+            virtual std::shared_ptr<WireAntenna> Clone();
52
 
61
 
53
             /**
62
             /**
54
-             * @copybrief LemmaObject::Delete()
55
-             * @copydetails LemmaObject::Delete()
63
+             *  Uses YAML to serialize this object.
64
+             *  @return a YAML::Node
56
              */
65
              */
57
-            void Delete();
66
+            YAML::Node Serialize() const;
67
+
68
+            /**
69
+             *   Constructs an object from a YAML::Node.
70
+             */
71
+            static std::shared_ptr<WireAntenna> DeSerialize( const YAML::Node& node );
58
 
72
 
59
             // ====================  OPERATORS     =======================
73
             // ====================  OPERATORS     =======================
60
 
74
 
113
 
127
 
114
             // ====================  INQUIRY       =======================
128
             // ====================  INQUIRY       =======================
115
 
129
 
116
-            #ifdef HAVE_YAMLCPP
117
-            /**
118
-             *  Uses YAML to serialize this object.
119
-             *  @return a YAML::Node
120
-             */
121
-            YAML::Node Serialize() const;
122
-
123
-            /**
124
-             *   Constructs an object from a YAML::Node.
125
-             */
126
-            static WireAntenna* DeSerialize(const YAML::Node& node);
127
-            #endif
128
-
129
 			/**
130
 			/**
130
               * Returns the number of turns
131
               * Returns the number of turns
131
               * @return the number of turns of the loop.
132
               * @return the number of turns of the loop.
159
 			/**
160
 			/**
160
               * Returns pointer to a dipole source
161
               * Returns pointer to a dipole source
161
 			  */
162
 			  */
162
-            DipoleSource* GetDipoleSource(const int &dip);
163
+            std::shared_ptr<DipoleSource> GetDipoleSource(const int &dip);
163
 
164
 
164
 			/**
165
 			/**
165
               * returns number of dipoles used to approximate this
166
               * returns number of dipoles used to approximate this
184
              */
185
              */
185
             bool IsHorizontallyPlanar();
186
             bool IsHorizontallyPlanar();
186
 
187
 
187
-        protected:
188
-
189
-            // ====================  LIFECYCLE     =======================
190
-
191
-			/**
192
-              * Default protected constructor.
193
-			  */
194
-            WireAntenna (const std::string &name);
195
-
196
-#ifdef HAVE_YAMLCPP
197
-        /** Protected DeDerializing constructor, use factory DeSerialize  method*/
198
-            WireAntenna (const YAML::Node& node);
199
-#endif
200
-
201
-			/**
202
-              * Default protected destructor.
203
-			  */
204
-            ~WireAntenna ();
188
+            /** Returns the name of the underlying class, similiar to Python's type */
189
+            virtual inline std::string GetName() const {
190
+                return CName;
191
+            }
205
 
192
 
206
-            /**
207
-             * @copybrief LemmaObject::Release()
208
-             * @copydetails LemmaObject::Release()
209
-             */
210
-            void Release();
193
+        protected:
211
 
194
 
212
             // ====================  DATA MEMBERS  =======================
195
             // ====================  DATA MEMBERS  =======================
213
 
196
 
229
 			/**
212
 			/**
230
               * List of the dipoles
213
               * List of the dipoles
231
 			  */
214
 			  */
232
-            std::vector<DipoleSource*>           Dipoles;
215
+            std::vector< std::shared_ptr<DipoleSource> > Dipoles;
233
 
216
 
234
 			/**
217
 			/**
235
               * Points that define this loop
218
               * Points that define this loop
243
 
226
 
244
         private:
227
         private:
245
 
228
 
229
+            static constexpr auto CName = "WireAntenna";
230
+
246
     }; // -----  end of class  WireAntenna  -----
231
     }; // -----  end of class  WireAntenna  -----
247
 
232
 
248
 }
233
 }

+ 40
- 46
Modules/FDEM1D/include/emearth1d.h View File

14
 #ifndef __EMEARTH1D_H
14
 #ifndef __EMEARTH1D_H
15
 #define __EMEARTH1D_H
15
 #define __EMEARTH1D_H
16
 
16
 
17
-#include "dipolesource.h"
18
-#include "layeredearthem.h"
19
-#include "receiverpoints.h"
20
-#include "WireAntenna.h"
21
-#include "PolygonalWireAntenna.h"
22
-#include "kernelem1dspec.h"
23
-#include "kernelem1dmanager.h"
17
+
18
+
19
+// forward declare these due to include cycle
20
+//#include "LayeredEarthEM.h"
21
+//#include "DipoleSource.h"
22
+//#include "FieldPoints.h"
23
+//#include "WireAntenna.h"
24
+//#include "PolygonalWireAntenna.h"
25
+//#include "KernelEM1DManager.h"
26
+
27
+#include "KernelEM1DSpec.h"
24
 #include "hankeltransformgaussianquadrature.h"
28
 #include "hankeltransformgaussianquadrature.h"
25
 #include "hankeltransformhankel2.h"
29
 #include "hankeltransformhankel2.h"
26
 #include "FHTKey.h"
30
 #include "FHTKey.h"
35
 
39
 
36
 namespace Lemma {
40
 namespace Lemma {
37
 
41
 
42
+    class WireAntenna;
43
+    class PolygonalWireAntenna;
44
+    class FieldPoints;
45
+    class DipoleSource;
46
+    class LayeredEarthEM;
47
+
38
     // =======================================================================
48
     // =======================================================================
39
     //        Class:  EmEarth1D
49
     //        Class:  EmEarth1D
40
     /// \brief  Implimentation of 1D EM solution.
50
     /// \brief  Implimentation of 1D EM solution.
45
 		friend std::ostream &operator<<(std::ostream &stream,
55
 		friend std::ostream &operator<<(std::ostream &stream,
46
 			const EMEarth1D &ob);
56
 			const EMEarth1D &ob);
47
 
57
 
58
+        struct ctor_key{};
59
+
48
         public:
60
         public:
49
 
61
 
50
             //friend class KernelEm1D;
62
             //friend class KernelEm1D;
51
 
63
 
52
             // ====================  LIFECYCLE     ===========================
64
             // ====================  LIFECYCLE     ===========================
53
 
65
 
66
+            /** Default protected constructor. */
67
+            EMEarth1D ( const ctor_key& );
68
+
69
+            /** Default protected constructor. */
70
+			EMEarth1D ( const YAML::Node& node, const ctor_key& );
71
+
72
+            /** Default protected constructor. */
73
+            ~EMEarth1D ();
74
+
54
             /**
75
             /**
55
              *  Returns pointer to new EMEarth1D. Location is
76
              *  Returns pointer to new EMEarth1D. Location is
56
              *  initialized to (0,0,0) type and polarization are
77
              *  initialized to (0,0,0) type and polarization are
57
              *  initialized  to nonworking values that will throw
78
              *  initialized  to nonworking values that will throw
58
              *  exceptions if used.
79
              *  exceptions if used.
59
              */
80
              */
60
-            static EMEarth1D* New();
61
-
62
-            /**
63
-             * @copybrief LemmaObject::Delete()
64
-             * @copydetails LemmaObject::Delete()
65
-             */
66
-            void Delete();
81
+            static std::shared_ptr<EMEarth1D> NewSP();
67
 
82
 
68
             /** stream debugging info to std::out
83
             /** stream debugging info to std::out
69
              */
84
              */
70
             void Query();
85
             void Query();
71
 
86
 
72
-            #ifdef HAVE_YAMLCPP
73
             /** YAML Serializing method
87
             /** YAML Serializing method
74
              */
88
              */
75
             YAML::Node Serialize() const;
89
             YAML::Node Serialize() const;
76
 
90
 
77
             //static EMEarth1D* DeSerialize(const YAML::Node& node);
91
             //static EMEarth1D* DeSerialize(const YAML::Node& node);
78
-            #endif
79
 
92
 
80
             // ====================  OPERATORS     ===========================
93
             // ====================  OPERATORS     ===========================
81
 
94
 
99
             void AttachWireAntenna(WireAntenna *antennae);
112
             void AttachWireAntenna(WireAntenna *antennae);
100
 
113
 
101
             /** Attaches a dipole for calculation */
114
             /** Attaches a dipole for calculation */
102
-            void AttachDipoleSource(DipoleSource *dipole);
115
+            void AttachDipoleSource( std::shared_ptr<DipoleSource> dipole);
103
 
116
 
104
             /** Attaches a layered earth model for calculation */
117
             /** Attaches a layered earth model for calculation */
105
-            void AttachLayeredEarthEM(LayeredEarthEM *Earth);
118
+            void AttachLayeredEarthEM( std::shared_ptr<LayeredEarthEM> Earth);
106
 
119
 
107
             /** Attaches a set of receiver points for calculation */
120
             /** Attaches a set of receiver points for calculation */
108
-            void AttachReceiverPoints(ReceiverPoints *Receivers);
121
+            void AttachFieldPoints( std::shared_ptr<FieldPoints> Receivers);
109
 
122
 
110
             /** Sets the fields that are calcultated, E,H or BOTH */
123
             /** Sets the fields that are calcultated, E,H or BOTH */
111
             void SetFieldsToCalculate(const FIELDCALCULATIONS &calc);
124
             void SetFieldsToCalculate(const FIELDCALCULATIONS &calc);
118
 
131
 
119
         protected:
132
         protected:
120
 
133
 
121
-            // ====================  LIFECYCLE     ===========================
122
-
123
-            /** Default protected constructor. */
124
-            EMEarth1D (const std::string& name);
125
-
126
-            #ifdef HAVE_YAMLCPP
127
-            /** Default protected constructor. */
128
-			EMEarth1D (const YAML::Node& node);
129
-            #endif
130
-
131
-            /** Default protected constructor. */
132
-            ~EMEarth1D ();
133
-
134
-            /**
135
-             * @copybrief LemmaObject::Release()
136
-             * @copydetails LemmaObject::Release()
137
-             */
138
-            void Release();
139
-
140
             // ====================  OPERATIONS    ===========================
134
             // ====================  OPERATIONS    ===========================
141
 
135
 
142
             /** Used internally, this is the innermost loop of the MakeCalc3,
136
             /** Used internally, this is the innermost loop of the MakeCalc3,
143
              *  and CalculateWireAntennaField routines.
137
              *  and CalculateWireAntennaField routines.
144
              */
138
              */
145
             void SolveSingleTxRxPair(const int &irec,
139
             void SolveSingleTxRxPair(const int &irec,
146
-                    HankelTransform *Hankel,
140
+                    std::shared_ptr<HankelTransform> Hankel,
147
                     const Real &wavef, const int &ifreq,
141
                     const Real &wavef, const int &ifreq,
148
-                    DipoleSource *tDipole);
142
+                    std::shared_ptr<DipoleSource> tDipole);
149
 
143
 
150
             /** Used internally, this is the innermost loop of the MakeCalc3,
144
             /** Used internally, this is the innermost loop of the MakeCalc3,
151
              *  and CalculateWireAntennaField routines.
145
              *  and CalculateWireAntennaField routines.
152
              */
146
              */
153
-            void SolveLaggedTxRxPair(const int &irec, Hankel2* Hankel,
147
+            void SolveLaggedTxRxPair(const int &irec, std::shared_ptr<Hankel2> Hankel,
154
                     const Real &wavef, const int &ifreq,
148
                     const Real &wavef, const int &ifreq,
155
-                    PolygonalWireAntenna* antenna);
149
+                    std::shared_ptr<PolygonalWireAntenna> antenna);
156
 
150
 
157
             /** Removes all connections */
151
             /** Removes all connections */
158
             void DetachAll();
152
             void DetachAll();
160
             // ====================  DATA MEMBERS  ===========================
154
             // ====================  DATA MEMBERS  ===========================
161
 
155
 
162
             /** Computes field due to dipole */
156
             /** Computes field due to dipole */
163
-            DipoleSource*        Dipole;
157
+            std::shared_ptr<DipoleSource>        Dipole;
164
 
158
 
165
             /** Earth model (Cole-cole) */
159
             /** Earth model (Cole-cole) */
166
-            LayeredEarthEM*      Earth;
160
+            std::shared_ptr<LayeredEarthEM>      Earth;
167
 
161
 
168
             /** Receiver points */
162
             /** Receiver points */
169
-            ReceiverPoints*      Receivers;
163
+            std::shared_ptr<FieldPoints>         Receivers;
170
 
164
 
171
             /** Wire antennae tx */
165
             /** Wire antennae tx */
172
-            WireAntenna*         Antenna;
166
+            std::shared_ptr<WireAntenna>         Antenna;
173
 
167
 
174
             /** What fields are wanted */
168
             /** What fields are wanted */
175
             FIELDCALCULATIONS    FieldsToCalculate;
169
             FIELDCALCULATIONS    FieldsToCalculate;

+ 9
- 7
Modules/FDEM1D/include/hankeltransform.h View File

14
 #ifndef __hankeltransform_h
14
 #ifndef __hankeltransform_h
15
 #define __hankeltransform_h
15
 #define __hankeltransform_h
16
 
16
 
17
-#include "LemmaObject.h"
18
-#include "kernelem1dbase.h"
19
-#include "kernelem1dspec.h"
20
-#include "kernelem1dmanager.h"
17
+//#include "kernelem1dbase.h"
18
+#include "KernelEM1DSpec.h"
19
+#include "KernelEM1DManager.h"
21
 
20
 
22
 namespace Lemma {
21
 namespace Lemma {
23
 
22
 
23
+
24
+        class KernelEM1DBase;
25
+
24
         // ===================================================================
26
         // ===================================================================
25
         //        Class:  HankelTransform
27
         //        Class:  HankelTransform
26
         /// \brief  Pure abstract class for hankel transforms
28
         /// \brief  Pure abstract class for hankel transforms
55
                 /// = omega * sqrt( EP*AMU )  amu = 4 pi e-7  ep = 8.85e-12
57
                 /// = omega * sqrt( EP*AMU )  amu = 4 pi e-7  ep = 8.85e-12
56
                 virtual Complex Zgauss(const int &ikk, const EMMODE &imode,
58
                 virtual Complex Zgauss(const int &ikk, const EMMODE &imode,
57
                             const int &itype, const Real &rho,
59
                             const int &itype, const Real &rho,
58
-                            const Real &wavef, KernelEm1DBase *Kernel)=0;
60
+                            const Real &wavef, std::shared_ptr<KernelEm1DBase> Kernel)=0;
59
 
61
 
60
                 /// Computes related kernels, if applicable, otherwise this is
62
                 /// Computes related kernels, if applicable, otherwise this is
61
                 /// just a dummy function.
63
                 /// just a dummy function.
62
                 virtual void ComputeRelated(const Real& rho, KernelEm1DBase* Kernel);
64
                 virtual void ComputeRelated(const Real& rho, KernelEm1DBase* Kernel);
63
 
65
 
64
-                virtual void ComputeRelated(const Real& rho, std::vector< KernelEm1DBase* > KernelVec);
66
+                virtual void ComputeRelated(const Real& rho, std::vector< std::shared_ptr<KernelEM1DBase> > KernelVec);
65
 
67
 
66
-                virtual void ComputeRelated(const Real& rho, KernelEM1DManager* KernelManager);
68
+                virtual void ComputeRelated(const Real& rho, std::shared_ptr<KernelEM1DManager> KernelManager);
67
 
69
 
68
                 // ====================  ACCESS        =======================
70
                 // ====================  ACCESS        =======================
69
 
71
 

+ 1
- 1
Modules/FDEM1D/include/hankeltransformhankel2.h View File

16
 
16
 
17
 #include "hankeltransform.h"
17
 #include "hankeltransform.h"
18
 #include "kernelem1dbase.h"
18
 #include "kernelem1dbase.h"
19
-#include "kernelem1dspec.h"
19
+#include "KernelEM1DSpec.h"
20
 #include "CubicSplineInterpolator.h"
20
 #include "CubicSplineInterpolator.h"
21
 
21
 
22
 namespace Lemma {
22
 namespace Lemma {

+ 12
- 20
Modules/FDEM1D/include/kernelem1dbase.h View File

38
 
38
 
39
             // ====================  LIFECYCLE     =======================
39
             // ====================  LIFECYCLE     =======================
40
 
40
 
41
+            /// Default protected constructor.
42
+            KernelEm1DBase ( ) : LemmaObject( ) {
43
+
44
+            }
45
+
46
+            /// Default protected constructor.
47
+            ~KernelEm1DBase () {
48
+            }
49
+
41
             // ====================  OPERATORS     =======================
50
             // ====================  OPERATORS     =======================
42
 
51
 
43
             // ====================  OPERATIONS    =======================
52
             // ====================  OPERATIONS    =======================
77
 
86
 
78
         protected:
87
         protected:
79
 
88
 
80
-            // ====================  LIFECYCLE     =======================
81
-
82
-            /// Default protected constructor.
83
-            KernelEm1DBase (const std::string& name) : LemmaObject(name)
84
-            {
85
-            }
86
-
87
-            /// Default protected constructor.
88
-            ~KernelEm1DBase () {
89
-                if (this->NumberOfReferences > 0)
90
-                    throw DeleteObjectWithReferences( this );
91
-            }
92
-
93
-            void Release() {
94
-                delete this;
95
-            }
96
-
97
-            // ====================  OPERATIONS    =======================
98
-
99
-
100
             // ====================  DATA MEMBERS  =========================
89
             // ====================  DATA MEMBERS  =========================
101
 
90
 
102
             /** Where does this kernel live on the vector managed by the manager */
91
             /** Where does this kernel live on the vector managed by the manager */
104
 
93
 
105
         private:
94
         private:
106
 
95
 
96
+            /** ASCII string representation of the class name */
97
+            static constexpr auto CName = "KernelEM1DBase";
98
+
107
     }; // -----  end of class  KernelEm1DBase  -----
99
     }; // -----  end of class  KernelEm1DBase  -----
108
 
100
 
109
 } // namespace Lemma
101
 } // namespace Lemma

+ 14
- 21
Modules/FDEM1D/include/kernelem1dreflbase.h View File

14
 #ifndef  KERNELEM1DREFLBASE_INC
14
 #ifndef  KERNELEM1DREFLBASE_INC
15
 #define  KERNELEM1DREFLBASE_INC
15
 #define  KERNELEM1DREFLBASE_INC
16
 
16
 
17
-#include "dipolesource.h"
18
-#include "kernelem1dbase.h"
19
-#include "layeredearthem.h"
20
-//#include "kernelem1dspec.h"
17
+#include "KernelEM1DSpec.h"
18
+//#include "kernelem1dbase.h"
19
+#include "DipoleSource.h"
20
+#include "LayeredEarthEM.h"
21
 
21
 
22
 namespace Lemma {
22
 namespace Lemma {
23
 
23
 
24
-    //class DipoleSource;
25
-
26
     enum DIPOLE_LOCATION { INAIR, INGROUND };
24
     enum DIPOLE_LOCATION { INAIR, INGROUND };
27
 
25
 
28
     // forward declaration for friend
26
     // forward declaration for friend
29
-    template<EMMODE Mode, int Ikernel, DIPOLE_LOCATION Isource, DIPOLE_LOCATION Irecv>
30
-    class KernelEm1DSpec;
27
+    //template<EMMODE Mode, int Ikernel, DIPOLE_LOCATION Isource, DIPOLE_LOCATION Irecv>
28
+    //class KernelEM1DSpec;
31
 
29
 
32
 
30
 
33
     // ===================================================================
31
     // ===================================================================
40
     // ===================================================================
38
     // ===================================================================
41
     class KernelEM1DReflBase : public LemmaObject {
39
     class KernelEM1DReflBase : public LemmaObject {
42
 
40
 
43
-        template<EMMODE Mode, int Ikernel, DIPOLE_LOCATION Isource, DIPOLE_LOCATION Irecv>
44
-        friend class KernelEm1DSpec;
45
-        friend class KernelEM1DManager;
41
+        //template<EMMODE Mode, int Ikernel, DIPOLE_LOCATION Isource, DIPOLE_LOCATION Irecv>
42
+        friend class KernelEM1DSpec;
43
+        //friend class KernelEM1DManager;
44
+        //friend class DipoleSource;
46
 
45
 
47
         public:
46
         public:
48
 
47
 
52
 
51
 
53
             // ====================  OPERATIONS    =======================
52
             // ====================  OPERATIONS    =======================
54
 
53
 
55
-            void Initialise(LayeredEarthEM* EarthIn) {
54
+            void Initialise( std::shared_ptr<LayeredEarthEM> EarthIn) {
56
 
55
 
57
                 nlay = EarthIn->GetNumberOfLayers();
56
                 nlay = EarthIn->GetNumberOfLayers();
58
                 zh = VectorXcr::Zero(nlay);
57
                 zh = VectorXcr::Zero(nlay);
88
 
87
 
89
             }
88
             }
90
 
89
 
91
-            void SetUpSource(DipoleSource *Dipole, const int &ifreq) {
90
+            void SetUpSource( std::shared_ptr<DipoleSource> Dipole, const int &ifreq ) {
92
 
91
 
93
                 zh(0) = Complex(0, Dipole->GetAngularFrequency(ifreq)*MU0);
92
                 zh(0) = Complex(0, Dipole->GetAngularFrequency(ifreq)*MU0);
94
                 yh(0) = Complex(0, Dipole->GetAngularFrequency(ifreq)*EPSILON0);
93
                 yh(0) = Complex(0, Dipole->GetAngularFrequency(ifreq)*EPSILON0);
150
             // ====================  LIFECYCLE     =======================
149
             // ====================  LIFECYCLE     =======================
151
 
150
 
152
             /// Default protected constructor.
151
             /// Default protected constructor.
153
-            KernelEM1DReflBase (const std::string& name) : LemmaObject(name)
152
+            KernelEM1DReflBase ( ) : LemmaObject( )
154
             {
153
             {
155
             }
154
             }
156
 
155
 
157
             /// Default protected constructor.
156
             /// Default protected constructor.
158
             ~KernelEM1DReflBase () {
157
             ~KernelEM1DReflBase () {
159
-                if (this->NumberOfReferences > 0)
160
-                    throw DeleteObjectWithReferences( this );
161
-            }
162
-
163
-            void Release() {
164
-                delete this;
165
             }
158
             }
166
 
159
 
167
             // ====================  OPERATIONS    =======================
160
             // ====================  OPERATIONS    =======================
220
 			EMMODE mode;
213
 			EMMODE mode;
221
 
214
 
222
             /// Pointer to layered earth
215
             /// Pointer to layered earth
223
-            LayeredEarthEM *Earth;
216
+            std::shared_ptr<LayeredEarthEM> Earth;
224
 
217
 
225
 			Complex       uk;
218
 			Complex       uk;
226
 			Complex       um;
219
 			Complex       um;

+ 0
- 1485
Modules/FDEM1D/include/kernelem1dspec.h
File diff suppressed because it is too large
View File


+ 2
- 1
Modules/FDEM1D/src/CMakeLists.txt View File

3
 	#${CMAKE_CURRENT_SOURCE_DIR}/AEMSurvey.cpp
3
 	#${CMAKE_CURRENT_SOURCE_DIR}/AEMSurvey.cpp
4
 	${CMAKE_CURRENT_SOURCE_DIR}/LayeredEarthEM.cpp
4
 	${CMAKE_CURRENT_SOURCE_DIR}/LayeredEarthEM.cpp
5
 	${CMAKE_CURRENT_SOURCE_DIR}/FieldPoints.cpp
5
 	${CMAKE_CURRENT_SOURCE_DIR}/FieldPoints.cpp
6
-	#${CMAKE_CURRENT_SOURCE_DIR}/DipoleSource.cpp
6
+	${CMAKE_CURRENT_SOURCE_DIR}/WireAntenna.cpp
7
+#	${CMAKE_CURRENT_SOURCE_DIR}/DipoleSource.cpp
7
 	#${CMAKE_CURRENT_SOURCE_DIR}/UngroundedElectricDipole.cpp
8
 	#${CMAKE_CURRENT_SOURCE_DIR}/UngroundedElectricDipole.cpp
8
 	PARENT_SCOPE
9
 	PARENT_SCOPE
9
 )
10
 )

+ 26
- 112
Modules/FDEM1D/src/DipoleSource.cpp View File

11
   @version  $Id: dipolesource.cpp 203 2015-01-09 21:19:04Z tirons $
11
   @version  $Id: dipolesource.cpp 203 2015-01-09 21:19:04Z tirons $
12
  **/
12
  **/
13
 
13
 
14
-#include "dipolesource.h"
15
-#include "kernelem1dmanager.h"
14
+#include "DipoleSource.h"
15
+#include "KernelEM1DManager.h"
16
+#include "FieldPoints.h"
17
+
18
+//#include "GroundedElectricDipole.h"
19
+//#include "UngroundedElectricDipole.h"
20
+//#include "MagneticDipole.h"
16
 
21
 
17
-#include "GroundedElectricDipole.h"
18
-#include "UngroundedElectricDipole.h"
19
-#include "MagneticDipole.h"
20
-#include "receiverpoints.h"
21
 #include "hankeltransform.h"
22
 #include "hankeltransform.h"
22
 
23
 
23
 namespace Lemma {
24
 namespace Lemma {
24
 
25
 
25
 
26
 
26
     // ====================    FRIENDS     ======================
27
     // ====================    FRIENDS     ======================
27
-    std::ostream &operator<<(std::ostream &stream,
28
-                const DipoleSource &ob) {
29
-
30
-        stream << *(LemmaObject*)(&ob);
31
-        switch (ob.Type) {
32
-            case (NOSOURCETYPE):
33
-                stream << "\tType=" << ob.Type << " (Uninitialized dipole)"
34
-                << "\n";
35
-                break;
36
-            case (GROUNDEDELECTRICDIPOLE):
37
-                stream << "\tType=" << ob.Type << " (Grounded Electric dipole)"
38
-                << "\n";
39
-                break;
40
-            case (UNGROUNDEDELECTRICDIPOLE):
41
-                stream << "\tType=" << ob.Type << " (Ungrounded Electric dipole)"
42
-                << "\n";
43
-                break;
44
-            case (MAGNETICDIPOLE):
45
-                stream << "\tType=" << ob.Type << " (Magnetic dipole)"
46
-                << "\n";
47
-                break;
48
-            default:
49
-                throw NonValidDipoleType( );
50
-        }
51
-
52
-        /*
53
-        switch (ob.Polarisation) {
54
-
55
-            case(NOPOLARISATION):
56
-                stream << "Polarisation=" << ob.Polarisation <<
57
-                        " (Unset polarisation)" << "\n";
58
-                break;
59
-
60
-            case(XPOLARISATION):
61
-                stream << "Polarisation=" << ob.Polarisation <<
62
-                        " (X polarised)" << "\n";
63
-                break;
64
-
65
-            case(YPOLARISATION):
66
-                stream << "Polarisation=" << ob.Polarisation <<
67
-                        " (Y polarised)" << "\n";
68
-                break;
69
-
70
-            case(ZPOLARISATION):
71
-                stream << "Polarisation=" << ob.Polarisation <<
72
-                        " (Z polarised)" << "\n";
73
-                break;
74
-        }
75
-        */
76
-        stream << "\tPolarisation " << ob.Phat.transpose() << "\n";
77
-        stream << "\tLocation= " << ob.Location.transpose()
78
-                << " [metres] \n";
79
-        stream << "\tFrequencies= " << ob.Freqs.transpose() << " [Hz] \n";
80
-        stream << "\tPhase= " << ob.Phase << "\n";
81
-        stream << "\tMoment= " << ob.Moment << "\n";
28
+    std::ostream &operator<<(std::ostream &stream, const DipoleSource &ob) {
29
+        stream << ob.Serialize()  << "\n---\n"; // End of doc ---
82
         return stream;
30
         return stream;
83
     }
31
     }
84
 
32
 
85
 
33
 
86
     // ====================  LIFECYCLE     ======================
34
     // ====================  LIFECYCLE     ======================
87
 
35
 
88
-    DipoleSource::DipoleSource(const std::string &name) :
89
-                    LemmaObject(name),
36
+    DipoleSource::DipoleSource( const ctor_key& ) : LemmaObject( ),
90
                     Type(NOSOURCETYPE),
37
                     Type(NOSOURCETYPE),
91
                     Phase(0),
38
                     Phase(0),
92
                     Moment(1),
39
                     Moment(1),
93
-                    KernelManager(NULL),
94
-                    Receivers(NULL),
95
-                    Earth(NULL)
40
+                    KernelManager(nullptr),
41
+                    Receivers(nullptr),
42
+                    Earth(nullptr)
96
     {
43
     {
97
         this->Location.setZero();
44
         this->Location.setZero();
98
         this->Phat.setZero();
45
         this->Phat.setZero();
99
     }
46
     }
100
 
47
 
101
     DipoleSource::~DipoleSource() {
48
     DipoleSource::~DipoleSource() {
102
-        if (this->NumberOfReferences != 0)
103
-            throw DeleteObjectWithReferences(this);
104
-        /* These are not attched as they are connected for such a short time that the reference counting
105
-           was getting tricked and calling delete
106
-        if (Receivers != NULL) {
107
-            Receivers->DetachFrom(this);
108
-        }
109
-
110
-        if (Earth != NULL) {
111
-            Earth->DetachFrom(this);
112
-        }
113
-        */
114
-        if (KernelManager != NULL) {
115
-            KernelManager->Delete();
116
-        }
117
-
118
     }
49
     }
119
 
50
 
120
-    DipoleSource* DipoleSource::New() {
121
-        DipoleSource* Obj = new DipoleSource("DipoleSource");
122
-        Obj->AttachTo(Obj);
123
-        return Obj;
51
+    std::shared_ptr<DipoleSource> DipoleSource::NewSP() {
52
+        return std::make_shared<DipoleSource> ( ctor_key() );
124
     }
53
     }
125
 
54
 
126
-    DipoleSource* DipoleSource::Clone() {
127
 
55
 
128
-        DipoleSource* Obj = new DipoleSource("DipoleSource");
129
-        Obj->AttachTo(Obj);
56
+    std::shared_ptr<DipoleSource> DipoleSource::Clone() {
57
+
58
+        auto Obj = DipoleSource::NewSP();
130
 
59
 
131
         // copy
60
         // copy
132
         Obj->Type = Type;
61
         Obj->Type = Type;
159
         return Obj;
88
         return Obj;
160
     }
89
     }
161
 
90
 
162
-    void DipoleSource::Delete() {
163
-        this->DetachFrom(this);
164
-    }
165
-
166
-    void DipoleSource::Release() {
167
-        delete this;
168
-    }
169
-
170
     // ====================  ACCESS        ======================
91
     // ====================  ACCESS        ======================
171
     void DipoleSource::SetLocation(const Vector3r &posin) {
92
     void DipoleSource::SetLocation(const Vector3r &posin) {
172
         this->Location = posin;
93
         this->Location = posin;
275
 
196
 
276
     // ====================  OPERATIONS     =====================
197
     // ====================  OPERATIONS     =====================
277
 
198
 
278
-    void DipoleSource::SetKernels(const int& ifreq, const FIELDCALCULATIONS&  Fields , ReceiverPoints* ReceiversIn, const int& irecin,
279
-            LayeredEarthEM* EarthIn  ) {
199
+    void DipoleSource::SetKernels(const int& ifreq, const FIELDCALCULATIONS&  Fields , std::shared_ptr<FieldPoints> ReceiversIn, const int& irecin,
200
+            std::shared_ptr<LayeredEarthEM> EarthIn  ) {
280
 
201
 
281
-        // These are not properly attached because in tight parallel loops reference counting is unreliable. This is safe as this
282
-        // method is not exposed to the public API and we know what we are doing here -TI
283
         if (Receivers != ReceiversIn) {
202
         if (Receivers != ReceiversIn) {
284
-            //if (Receivers != NULL) Receivers->DetachFrom(this);
285
             Receivers = ReceiversIn;
203
             Receivers = ReceiversIn;
286
-            //ReceiversIn->AttachTo(this);
287
         }
204
         }
288
 
205
 
289
         if (Earth != EarthIn) {
206
         if (Earth != EarthIn) {
290
-            //if (Earth != NULL) Earth->DetachFrom(this);
291
             Earth = EarthIn;
207
             Earth = EarthIn;
292
-            //EarthIn->AttachTo(this);
293
         }
208
         }
294
 
209
 
295
         if (irecin != irec) {
210
         if (irecin != irec) {
317
         lays = Earth->GetLayerAtThisDepth(Location[2]);
232
         lays = Earth->GetLayerAtThisDepth(Location[2]);
318
         layr = Earth->GetLayerAtThisDepth(Receivers->GetLocation(irec)[2]);
233
         layr = Earth->GetLayerAtThisDepth(Receivers->GetLocation(irec)[2]);
319
 
234
 
320
-        if (KernelManager != NULL) KernelManager->Delete();
321
-        KernelManager = KernelEM1DManager::New();
235
+        KernelManager = KernelEM1DManager::NewSP();
322
             KernelManager->SetEarth(Earth);
236
             KernelManager->SetEarth(Earth);
323
-            KernelManager->SetDipoleSource(this, ifreq, Receivers->GetLocation(irec)[2]);
237
+            KernelManager->SetDipoleSource(shared_from_this(), ifreq, Receivers->GetLocation(irec)[2]);
324
         kernelFreq = Freqs(ifreq); // this is never used
238
         kernelFreq = Freqs(ifreq); // this is never used
325
         ReSetKernels( ifreq, Fields, Receivers, irec, Earth );
239
         ReSetKernels( ifreq, Fields, Receivers, irec, Earth );
326
 
240
 
329
 
243
 
330
     // TODO we could make the dipoles template specializations avoiding this rats nest of switch statements. Probably
244
     // TODO we could make the dipoles template specializations avoiding this rats nest of switch statements. Probably
331
     //      not the most critical piece though
245
     //      not the most critical piece though
332
-    void DipoleSource::ReSetKernels(const int& ifreq, const FIELDCALCULATIONS&  Fields , ReceiverPoints* Receivers, const int& irec,
333
-            LayeredEarthEM* Earth  ) {
246
+    void DipoleSource::ReSetKernels(const int& ifreq, const FIELDCALCULATIONS&  Fields , std::shared_ptr<FieldPoints> Receivers, const int& irec,
247
+            std::shared_ptr<LayeredEarthEM> Earth  ) {
334
 
248
 
335
         Vector3r Pol = Phat;
249
         Vector3r Pol = Phat;
336
 
250
 
807
 
721
 
808
     }
722
     }
809
 
723
 
810
-    void DipoleSource::UpdateFields( const int& ifreq, HankelTransform* Hankel, const Real& wavef) {
724
+    void DipoleSource::UpdateFields( const int& ifreq, std::shared_ptr<HankelTransform> Hankel, const Real& wavef) {
811
 
725
 
812
         Vector3r Pol = Phat;
726
         Vector3r Pol = Phat;
813
 
727
 
1189
 
1103
 
1190
     // ====================  INQUIRY       ======================
1104
     // ====================  INQUIRY       ======================
1191
 
1105
 
1192
-    KernelEM1DManager*  DipoleSource::GetKernelManager() {
1106
+    std::shared_ptr<KernelEM1DManager>  DipoleSource::GetKernelManager() {
1193
         return KernelManager;
1107
         return KernelManager;
1194
     }
1108
     }
1195
 
1109
 

Modules/FDEM1D/src/kernelem1dmanager.cpp → Modules/FDEM1D/src/KernelEM1DManager.cpp View File


+ 38
- 83
Modules/FDEM1D/src/WireAntenna.cpp View File

15
 
15
 
16
 namespace Lemma {
16
 namespace Lemma {
17
 
17
 
18
-    #ifdef HAVE_YAMLCPP
19
     std::ostream &operator << (std::ostream &stream, const WireAntenna &ob) {
18
     std::ostream &operator << (std::ostream &stream, const WireAntenna &ob) {
20
-        stream << ob.Serialize()  << "\n---\n"; // End of doc --- as a direct stream should encapulste thingy
19
+        stream << ob.Serialize()  << "\n---\n"; // End of doc ---
21
         return stream;
20
         return stream;
22
     }
21
     }
23
-    #else
24
-    std::ostream &operator<<(std::ostream &stream,
25
-                const WireAntenna &ob) {
26
-
27
-        stream << *(LemmaObject*)(&ob);
28
-        stream << "Current: " << ob.Current << " [A]\n";
29
-        stream << "Frequencies: " << ob.Freqs.transpose() << " [Hz]\n";
30
-        stream << "Number of points " << ob.NumberOfPoints << "\n";
31
-        stream << "Number of turns " << ob.NumberOfTurns << "\n";
32
-
33
-        if (ob.NumberOfPoints) {
34
-            stream << "Points:\n" << ob.Points.transpose() << "\n";
35
-            //stream << "Dipoles used to approximate " << ob.Dipoles.size() << "\n";
36
-        }
37
-        return stream;
38
-    }
39
-    #endif
22
+
40
     // ====================  LIFECYCLE     =======================
23
     // ====================  LIFECYCLE     =======================
41
 
24
 
42
-    WireAntenna::WireAntenna(const std::string &name) :
43
-        LemmaObject(name),
25
+    WireAntenna::WireAntenna( const ctor_key& ) : LemmaObject( ),
44
         NumberOfPoints(0), Current(1), NumberOfTurns(1) {
26
         NumberOfPoints(0), Current(1), NumberOfTurns(1) {
45
     }
27
     }
46
 
28
 
47
-#ifdef HAVE_YAMLCPP
48
-    WireAntenna::WireAntenna(const YAML::Node &node) :
49
-        LemmaObject(node) {
29
+    WireAntenna::WireAntenna( const YAML::Node& node, const ctor_key& ) : LemmaObject( node ) {
50
         Points =  node["Points"].as<Vector3Xr>();
30
         Points =  node["Points"].as<Vector3Xr>();
51
         Freqs = node["Freqs"].as<VectorXr>();
31
         Freqs = node["Freqs"].as<VectorXr>();
52
         NumberOfPoints = node["NumberOfPoints"].as<int>();
32
         NumberOfPoints = node["NumberOfPoints"].as<int>();
53
         NumberOfTurns = node["NumberOfTurns"].as<int>();
33
         NumberOfTurns = node["NumberOfTurns"].as<int>();
54
         Current = node["Current"].as<Real>();
34
         Current = node["Current"].as<Real>();
55
     }
35
     }
56
-#endif
57
 
36
 
58
     WireAntenna::~WireAntenna() {
37
     WireAntenna::~WireAntenna() {
59
-        for (unsigned int id=0; id<Dipoles.size(); ++id) {
60
-            Dipoles[id]->Delete();
61
-        }
62
-        Dipoles.clear();
63
-        if (this->NumberOfReferences != 0) {
64
-            throw DeleteObjectWithReferences(this);
65
-        }
66
     }
38
     }
67
 
39
 
68
-    WireAntenna* WireAntenna::New() {
69
-        WireAntenna* Obj = new WireAntenna("WireAntenna");
70
-        Obj->AttachTo(Obj);
71
-        return Obj;
40
+    std::shared_ptr<WireAntenna> WireAntenna::NewSP() {
41
+        return std::make_shared<WireAntenna>( ctor_key() );
72
     }
42
     }
73
 
43
 
74
-    WireAntenna* WireAntenna::Clone() {
75
-        WireAntenna* copy = WireAntenna::New();
76
-		//copy->AttachTo(copy); // NO! Attached above!
44
+    std::shared_ptr<WireAntenna> WireAntenna::Clone() {
45
+        auto copy = WireAntenna::NewSP();
46
+
77
 		copy->NumberOfPoints = this->NumberOfPoints;
47
 		copy->NumberOfPoints = this->NumberOfPoints;
78
 		copy->Freqs = this->Freqs;
48
 		copy->Freqs = this->Freqs;
79
 		copy->Current = this->Current;
49
 		copy->Current = this->Current;
83
 		return copy;
53
 		return copy;
84
     }
54
     }
85
 
55
 
86
-    void WireAntenna::Delete() {
87
-        this->DetachFrom(this);
88
-    }
56
+    //--------------------------------------------------------------------------------------
57
+    //       Class:  WireAntenna
58
+    //      Method:  Serialize
59
+    //--------------------------------------------------------------------------------------
60
+    YAML::Node WireAntenna::Serialize (  ) const {
61
+        YAML::Node node = LemmaObject::Serialize();
62
+        node.SetTag( GetName() );
63
+        node["NumberOfPoints"] = NumberOfPoints;
64
+        node["NumberOfTurns"] = NumberOfTurns;
65
+        node["Current"] = Current;
66
+        node["Points"] = Points;
67
+        node["Freqs"] = Freqs;
68
+        return node;
69
+    }		// -----  end of method WireAntenna::Serialize  -----
89
 
70
 
90
-    void WireAntenna::Release() {
91
-        delete this;
92
-    }
71
+
72
+    //--------------------------------------------------------------------------------------
73
+    //       Class:  WireAntenna
74
+    //      Method:  DeSerialize
75
+    //--------------------------------------------------------------------------------------
76
+    std::shared_ptr<WireAntenna> WireAntenna::DeSerialize ( const YAML::Node& node ) {
77
+        if (node.Tag() != "WireAntenna") {
78
+            throw  DeSerializeTypeMismatch( "WireAntenna", node.Tag());
79
+        }
80
+        return std::make_shared<WireAntenna> ( node, ctor_key() );
81
+    }		// -----  end of method WireAntenna::DeSerialize  -----
93
 
82
 
94
 
83
 
95
     // ====================  ACCESS        =======================
84
     // ====================  ACCESS        =======================
165
     void WireAntenna::ApproximateWithElectricDipoles(const Real &deltai) {
154
     void WireAntenna::ApproximateWithElectricDipoles(const Real &deltai) {
166
 
155
 
167
         // Get rid of any dipoles
156
         // Get rid of any dipoles
168
-        for (unsigned int id=0; id<Dipoles.size(); ++id) {
169
-            Dipoles[id]->Delete();
170
-        }
171
         Dipoles.clear();
157
         Dipoles.clear();
172
 
158
 
173
         Real Dist(0);
159
         Real Dist(0);
190
 
176
 
191
                 // X dipoles
177
                 // X dipoles
192
                 if (std::abs(r[0]) > 1e-6) {
178
                 if (std::abs(r[0]) > 1e-6) {
193
-                    DipoleSource *tx = DipoleSource::New();
179
+                    auto tx = DipoleSource::NewSP();
194
                     tx->SetLocation(p);
180
                     tx->SetLocation(p);
195
                     tx->SetType(GROUNDEDELECTRICDIPOLE);
181
                     tx->SetType(GROUNDEDELECTRICDIPOLE);
196
                     tx->SetPolarisation(XPOLARISATION);
182
                     tx->SetPolarisation(XPOLARISATION);
201
 
187
 
202
                 // Y dipoles
188
                 // Y dipoles
203
                 if (std::abs(r[1]) > 1e-6) {
189
                 if (std::abs(r[1]) > 1e-6) {
204
-                    DipoleSource *ty = DipoleSource::New();
190
+                    auto ty = DipoleSource::NewSP();
205
                     ty->SetLocation(p);
191
                     ty->SetLocation(p);
206
                     ty->SetType(GROUNDEDELECTRICDIPOLE);
192
                     ty->SetType(GROUNDEDELECTRICDIPOLE);
207
                     ty->SetPolarisation(YPOLARISATION);
193
                     ty->SetPolarisation(YPOLARISATION);
212
 
198
 
213
                 // Z dipoles
199
                 // Z dipoles
214
                 if (std::abs(r[2]) > 1e-6) {
200
                 if (std::abs(r[2]) > 1e-6) {
215
-                    DipoleSource *tz = DipoleSource::New();
201
+                    auto tz = DipoleSource::NewSP();
216
                     tz->SetLocation(p);
202
                     tz->SetLocation(p);
217
                     tz->SetType(GROUNDEDELECTRICDIPOLE);
203
                     tz->SetType(GROUNDEDELECTRICDIPOLE);
218
                     tz->SetPolarisation(ZPOLARISATION);
204
                     tz->SetPolarisation(ZPOLARISATION);
233
         return Dipoles.size();
219
         return Dipoles.size();
234
     }
220
     }
235
 
221
 
236
-    DipoleSource* WireAntenna::GetDipoleSource(const int &dip) {
222
+    std::shared_ptr<DipoleSource> WireAntenna::GetDipoleSource(const int &dip) {
237
         return this->Dipoles[dip];
223
         return this->Dipoles[dip];
238
     }
224
     }
239
 
225
 
243
     }
229
     }
244
     #endif
230
     #endif
245
 
231
 
246
-    #ifdef HAVE_YAMLCPP
247
-    //--------------------------------------------------------------------------------------
248
-    //       Class:  WireAntenna
249
-    //      Method:  Serialize
250
-    //--------------------------------------------------------------------------------------
251
-    YAML::Node WireAntenna::Serialize (  ) const {
252
-        YAML::Node node = LemmaObject::Serialize();
253
-        node.SetTag( this->Name );
254
-        node["NumberOfPoints"] = NumberOfPoints;
255
-        node["NumberOfTurns"] = NumberOfTurns;
256
-        node["Current"] = Current;
257
-        node["Points"] = Points;
258
-        node["Freqs"] = Freqs;
259
-        return node;
260
-    }		// -----  end of method WireAntenna::Serialize  -----
261
-
262
-
263
-    //--------------------------------------------------------------------------------------
264
-    //       Class:  WireAntenna
265
-    //      Method:  DeSerialize
266
-    //--------------------------------------------------------------------------------------
267
-    WireAntenna* WireAntenna::DeSerialize ( const YAML::Node& node ) {
268
-        WireAntenna* Object = new WireAntenna(node);
269
-        Object->AttachTo(Object);
270
-        DESERIALIZECHECK( node, Object )
271
-        return Object ;
272
-    }		// -----  end of method WireAntenna::DeSerialize  -----
273
-
274
-    #endif
275
-
276
-
277
     //--------------------------------------------------------------------------------------
232
     //--------------------------------------------------------------------------------------
278
     //       Class:  WireAntenna
233
     //       Class:  WireAntenna
279
     //      Method:  IsPlanar
234
     //      Method:  IsPlanar

+ 312
- 312
Modules/FDEM1D/src/kernelem1dspec.cpp
File diff suppressed because it is too large
View File


+ 1
- 1
Modules/LemmaCore/include/LemmaObject.h View File

34
   *           standard. All Lemma objects should be created as C++-11 Smart pointers, using
34
   *           standard. All Lemma objects should be created as C++-11 Smart pointers, using
35
   *           the supplied New method. Calls to Delete are no longer necessary or available.
35
   *           the supplied New method. Calls to Delete are no longer necessary or available.
36
   */
36
   */
37
-class LemmaObject {
37
+class LemmaObject : public std::enable_shared_from_this<LemmaObject> {
38
 
38
 
39
     /**
39
     /**
40
      *  Streams class information as YAML::Node
40
      *  Streams class information as YAML::Node

Loading…
Cancel
Save