Переглянути джерело

Bug fix for Anderson lagged solution which would occasionally result in NaN due to array index overrun in spline. Also work towards grounding points in wire antenna.

master
Trevor Irons 3 роки тому
джерело
коміт
32f3339fff

+ 4
- 4
CMake/SuperBuild.cmake Переглянути файл

@@ -41,13 +41,13 @@ else()
41 41
     )
42 42
 endif()
43 43
 
44
-if ( LEMMA_VTK8_SUPPORT )
45
-    if ( NOT VTK_FOUND OR  VTK_VERSION VERSION_GREATER "8.2.0" )
44
+if ( LEMMA_VTK9_SUPPORT )
45
+    if ( NOT VTK_FOUND OR  VTK_VERSION VERSION_LESS "9.0.0" )
46 46
         message( STATUS "VTK > 8.20.0 was found! Version found: " ${VTK_VERSION}, ${VTK_USE_FILE} )
47 47
         message( STATUS "External build of VTK 8 has been added, this may take some time to build." )
48
-        ExternalProject_Add(VTK8
48
+        ExternalProject_Add(VTK9
49 49
         GIT_REPOSITORY "https://gitlab.kitware.com/vtk/vtk.git"
50
-        GIT_TAG  "v8.2.0"
50
+        GIT_TAG  "v9.0.1"
51 51
         PREFIX ${CMAKE_CURRENT_BINARY_DIR}/external/vtk8
52 52
         CMAKE_ARGS
53 53
             -DCMAKE_INSTALL_PREFIX:PATH=${CMAKE_INSTALL_PREFIX}

+ 33
- 10
CMakeLists.txt Переглянути файл

@@ -47,6 +47,7 @@ option ( LEMMA_BUILD_EXAMPLES       "Compile example Lemma applications" OFF )
47 47
 option ( LEMMA_USE_OPENMP           "Use OpenMP in Lemma" OFF )
48 48
 option ( LEMMA_BUILD_DOCUMENTATION  "Build Doxygen man pages" OFF )
49 49
 option ( LEMMA_VTK8_SUPPORT         "VTK 8.x library for visualisation and grids" OFF )
50
+option ( LEMMA_VTK9_SUPPORT         "VTK 9.x library for visualisation and grids" OFF )
50 51
 option ( LEMMA_PYTHON3_BINDINGS     "Compile Python 3 bindings" OFF )
51 52
 
52 53
 # We end up using this for all builds, TODO remove this variable but follow same path
@@ -99,11 +100,32 @@ if (CMAKE_CROSSCOMPILING)
99 100
         QUIET
100 101
         ) 
101 102
     endif()
103
+    if (LEMMA_VTK9_SUPPORT)                                                            # Visualisation 
104
+        find_package (VTK  9.0.1      
105
+        COMPONENTS 
106
+        CommonCore 
107
+        RenderingCore 
108
+        FiltersCore 
109
+        FiltersSources 
110
+        CommonDataModel 
111
+        FiltersHyperTree 
112
+        IOXML 
113
+        IOImage 
114
+        IOLegacy 
115
+        IOGeometry 
116
+        InteractionStyle 
117
+        RenderingAnnotation 
118
+        FiltersHybrid 
119
+        FiltersModeling 
120
+        RenderingVolumeOpenGL2
121
+        QUIET
122
+        ) 
123
+    endif()
102 124
 else()
103 125
     find_package (Eigen3   3.3 QUIET )  # Matrix/Vector & Math
104 126
     find_package (yaml-cpp 0.6 QUIET )  # Serialisation of classes 
105
-    if (LEMMA_VTK8_SUPPORT)
106
-        find_package (VTK  8.2.0 COMPONENTS
127
+    if (LEMMA_VTK9_SUPPORT)
128
+        find_package (VTK  9.0.1 COMPONENTS
107 129
         vtkCommonCore 
108 130
         vtkRenderingCore 
109 131
         vtkFiltersCore 
@@ -125,10 +147,10 @@ endif()
125 147
 
126 148
 INCLUDE_DIRECTORIES(${YAML_CPP_INCLUDE_DIR})
127 149
 
128
-if (VTK_VERSION VERSION_GREATER "8.2.0")
129
-    message( STATUS "${VTK_VERSION} is compatible: ${VTK_VERSION_COMPATIBLE} exact? ${VTK_VERSION_EXACT}" )
130
-    set (VTK_FOUND False) 
131
-endif()
150
+#if (VTK_VERSION VERSION_GREATER "8.2.0")
151
+#    message( STATUS "${VTK_VERSION} is compatible: ${VTK_VERSION_COMPATIBLE} exact? ${VTK_VERSION_EXACT}" )
152
+#    set (VTK_FOUND False) 
153
+#endif()
132 154
 
133 155
 if (VTK_FOUND)
134 156
     set(volumeRenderer volumerenderer.cxx)
@@ -160,7 +182,7 @@ message ( STATUS "VTK Found? " ${VTK_FOUND} )
160 182
 if ( NOT Eigen3_FOUND OR 
161 183
      NOT yaml-cpp_FOUND OR 
162 184
      (LEMMA_PYTHON3_BINDINGS AND NOT pybind11_FOUND) OR 
163
-     (LEMMA_VTK8_SUPPORT AND NOT VTK_FOUND) OR
185
+     (LEMMA_VTK9_SUPPORT AND NOT VTK_FOUND) OR
164 186
      (LEMMA_ENABLE_TESTING AND NOT CxxTest_FOUND) )
165 187
     message ( STATUS "Missing hard dependencies have been found, these will be downloaded any compiled." )
166 188
     message ( STATUS "This necessitates a two step build." )
@@ -354,9 +376,10 @@ endif()
354 376
 ########################################################################
355 377
 # add a target to generate API documentation with Doxyfile.in 
356 378
 # ALL make documentation build by default if possible
357
-find_package(Doxygen)
379
+if (LEMMA_BUILD_DOCUMENTATION)
380
+    find_package(Doxygen)
358 381
 	if(DOXYGEN_FOUND)
359
-	if (LEMMA_BUILD_DOCUMENTATION)
382
+    message( STATUS "LEMMA_BUILD_DOCUMENTATION must be positive" )
360 383
 # Custom header and footer option, enable in Doxygen 
361 384
 #	file(COPY ${CMAKE_CURRENT_SOURCE_DIR}/Documentation/header.html
362 385
 #        DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/Documentation/header.html
@@ -371,7 +394,7 @@ find_package(Doxygen)
371 394
 			WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
372 395
 			COMMENT "Generating API documentation with Doxygen" VERBATIM
373 396
 		)
374
-	endif (LEMMA_BUILD_DOCUMENTATION)
375 397
 	endif(DOXYGEN_FOUND)
398
+endif (LEMMA_BUILD_DOCUMENTATION)
376 399
 
377 400
 # vim: set tabstop=4 shiftwidth=4 expandtab: 

+ 5
- 0
Modules/FDEM1D/CMakeLists.txt Переглянути файл

@@ -10,6 +10,11 @@ set_target_properties(fdem1d PROPERTIES
10 10
     CXX_STANDARD_REQUIRED ON
11 11
 )
12 12
 
13
+if ( LEMMA_VTK9_SUPPORT ) 
14
+	target_link_libraries(fdem1d ${visibility}VTK::RenderingCore VTK::CommonDataModel)
15
+	vtk_module_autoinit(TARGETS fdem1d MODULES VTK::RenderingCore)
16
+endif()
17
+
13 18
 # Linking
14 19
 target_link_libraries(fdem1d "lemmacore")
15 20
 target_link_libraries(fdem1d ${YAML_CPP_LIBRARIES}) 

+ 1
- 1
Modules/FDEM1D/include/KernelEM1DSpec.h Переглянути файл

@@ -1338,7 +1338,7 @@ namespace Lemma {
1338 1338
         static bool called = false;
1339 1339
         if (!called) {
1340 1340
             std::cout << "WARNING\n";
1341
-            std::cout << "Unspecialised PotentialBelowSourceLayer <" << Mode << " " << Ikernel << " "
1341
+            std::cout << "Unspecialised RelPotentialBelowSourceLayer <" << Mode << " " << Ikernel << " "
1342 1342
                   << Isource << " " << Irecv << ">...this function will be slow\n\n";
1343 1343
             called = true;
1344 1344
         }

+ 6
- 0
Modules/FDEM1D/include/PolygonalWireAntenna.h Переглянути файл

@@ -118,6 +118,12 @@ namespace Lemma {
118 118
             /// Maximum dipole moment allowed
119 119
             Real maxDipoleMoment;
120 120
 
121
+            /// Adds grounding point to non-closed wire loop
122
+            void AddGroundingPoint(
123
+                            const Vector3r &cp,
124
+                            const Vector3r &dir,
125
+                            std::vector< std::shared_ptr<DipoleSource> > &Dipoles );
126
+
121 127
             /// appends
122 128
             void PushXYZDipoles( const Vector3r &step, const Vector3r &cp,
123 129
                             const Vector3r &dir,

+ 2
- 2
Modules/FDEM1D/python/pyFDEM1D.cpp Переглянути файл

@@ -249,14 +249,14 @@ PYBIND11_MODULE(FDEM1D, m) {
249 249
         // modifiers
250 250
         .def("AttachWireAntenna", &Lemma::EMEarth1D::AttachWireAntenna,
251 251
             "Sets the wire antenna to use for calculations")
252
-        .def("AttachDipoleSOurce", &Lemma::EMEarth1D::AttachDipoleSource,
252
+        .def("AttachDipoleSource", &Lemma::EMEarth1D::AttachDipoleSource,
253 253
             "Sets a DipoleSource to use for calculations")
254 254
         .def("AttachFieldPoints", &Lemma::EMEarth1D::AttachFieldPoints,
255 255
             "Sets the FieldPoints to use for calculations")
256 256
         .def("AttachLayeredEarthEM", &Lemma::EMEarth1D::AttachLayeredEarthEM,
257 257
             "Sets the LayeredEarthEM to use for calculations")
258 258
 
259
-        .def("SetFieldToCalculate", &Lemma::EMEarth1D::SetFieldsToCalculate,
259
+        .def("SetFieldsToCalculate", &Lemma::EMEarth1D::SetFieldsToCalculate,
260 260
             "Sets which fields to calculate")
261 261
         .def("SetHankelTransformMethod", &Lemma::EMEarth1D::SetHankelTransformMethod,
262 262
             "Sets which Hankel transform to use")

+ 301
- 7
Modules/FDEM1D/src/DipoleSource.cpp Переглянути файл

@@ -183,6 +183,9 @@ namespace Lemma {
183 183
             case (UNGROUNDEDELECTRICDIPOLE):
184 184
                 this->Type = stype;
185 185
                 break;
186
+            case (GROUNDINGPOINT):
187
+                this->Type = stype;
188
+                break;
186 189
             case (MAGNETICDIPOLE):
187 190
                 this->Type = stype;
188 191
                 break;
@@ -485,6 +488,172 @@ namespace Lemma {
485 488
                     }
486 489
                 break;
487 490
 
491
+            case (GROUNDINGPOINT):
492
+
493
+                if (std::abs(Pol[2]) > 0) { // z dipole
494
+
495
+                    switch(FieldsToCalculate) {
496
+
497
+                        case E:
498
+                            if (lays == 0 && layr == 0) {
499
+                                ik[10] = KernelManager->AddKernel<TM, 10, INAIR, INAIR>( );
500
+                                ik[11] = KernelManager->AddKernel<TM, 11, INAIR, INAIR>( );
501
+                            } else if (lays == 0 && layr > 0) {
502
+                                ik[10] = KernelManager->AddKernel<TM, 10, INAIR, INGROUND>( );
503
+                                ik[11] = KernelManager->AddKernel<TM, 11, INAIR, INGROUND>( );
504
+                            } else if (lays > 0 && layr == 0) {
505
+                                ik[10] = KernelManager->AddKernel<TM, 10, INGROUND, INAIR>( );
506
+                                ik[11] = KernelManager->AddKernel<TM, 11, INGROUND, INAIR>( );
507
+                            } else {
508
+                                ik[10] = KernelManager->AddKernel<TM, 10, INGROUND, INGROUND>( );
509
+                                ik[11] = KernelManager->AddKernel<TM, 11, INGROUND, INGROUND>( );
510
+                            }
511
+                            break;
512
+
513
+                        case H:
514
+                            if (lays == 0 && layr == 0) {
515
+                                ik[12] = KernelManager->AddKernel<TM, 12, INAIR, INAIR>( );
516
+                            } else if (lays == 0 && layr > 0) {
517
+                                ik[12] = KernelManager->AddKernel<TM, 12, INAIR, INGROUND>( );
518
+                            } else if (lays > 0 && layr == 0) {
519
+                                ik[12] = KernelManager->AddKernel<TM, 12, INGROUND, INAIR>( );
520
+                            } else {
521
+                                ik[12] = KernelManager->AddKernel<TM, 12, INGROUND, INGROUND>( );
522
+                            }
523
+                            break;
524
+
525
+
526
+                        case BOTH:
527
+                            if ( lays == 0 && layr == 0) {
528
+                                ik[10] = KernelManager->AddKernel<TM, 10, INAIR, INAIR>( );
529
+                                ik[11] = KernelManager->AddKernel<TM, 11, INAIR, INAIR>( );
530
+                                ik[12] = KernelManager->AddKernel<TM, 12, INAIR, INAIR>( );
531
+                            } else if (lays == 0 && layr > 0) {
532
+                                ik[10] = KernelManager->AddKernel<TM, 10, INAIR, INGROUND>( );
533
+                                ik[11] = KernelManager->AddKernel<TM, 11, INAIR, INGROUND>( );
534
+                                ik[12] = KernelManager->AddKernel<TM, 12, INAIR, INGROUND>( );
535
+                            } else if (lays > 0 && layr == 0) {
536
+                                ik[10] = KernelManager->AddKernel<TM, 10, INGROUND, INAIR>( );
537
+                                ik[11] = KernelManager->AddKernel<TM, 11, INGROUND, INAIR>( );
538
+                                ik[12] = KernelManager->AddKernel<TM, 12, INGROUND, INAIR>( );
539
+                            } else {
540
+                                ik[10] = KernelManager->AddKernel<TM, 10, INGROUND, INGROUND>( );
541
+                                ik[11] = KernelManager->AddKernel<TM, 11, INGROUND, INGROUND>( );
542
+                                ik[12] = KernelManager->AddKernel<TM, 12, INGROUND, INGROUND>( );
543
+                            }
544
+                        }
545
+                }
546
+                if (std::abs(Pol[1]) > 0 || std::abs(Pol[0]) > 0) { // x or y grounded HED dipole
547
+
548
+                    switch(FieldsToCalculate) {
549
+
550
+                        case E:
551
+                            if ( lays == 0 && layr == 0) {
552
+                                ik[0] = KernelManager->AddKernel<TM, 0, INAIR, INAIR>( );
553
+                                ik[1] = KernelManager->AddKernel<TM, 1, INAIR, INAIR>( );
554
+                                ik[4] = KernelManager->AddKernel<TM, 4, INAIR, INAIR>( );
555
+                                //ik[2] = KernelManager->AddKernel<TE, 2, INAIR, INAIR>( );
556
+                                //ik[3] = KernelManager->AddKernel<TE, 3, INAIR, INAIR>( );
557
+                            } else if (lays == 0 && layr > 0) {
558
+                                ik[0] = KernelManager->AddKernel<TM, 0, INAIR, INGROUND>( );
559
+                                ik[1] = KernelManager->AddKernel<TM, 1, INAIR, INGROUND>( );
560
+                                ik[4] = KernelManager->AddKernel<TM, 4, INAIR, INGROUND>( );
561
+                                //ik[2] = KernelManager->AddKernel<TE, 2, INAIR, INGROUND>( );
562
+                                //ik[3] = KernelManager->AddKernel<TE, 3, INAIR, INGROUND>( );
563
+                            } else if (lays > 0 && layr == 0) {
564
+                                ik[0] = KernelManager->AddKernel<TM, 0, INGROUND, INAIR>( );
565
+                                ik[1] = KernelManager->AddKernel<TM, 1, INGROUND, INAIR>( );
566
+                                ik[4] = KernelManager->AddKernel<TM, 4, INGROUND, INAIR>( );
567
+                                //ik[2] = KernelManager->AddKernel<TE, 2, INGROUND, INAIR>( );
568
+                                //ik[3] = KernelManager->AddKernel<TE, 3, INGROUND, INAIR>( );
569
+                            } else {
570
+                                ik[0] = KernelManager->AddKernel<TM, 0, INGROUND, INGROUND>( );
571
+                                ik[1] = KernelManager->AddKernel<TM, 1, INGROUND, INGROUND>( );
572
+                                ik[4] = KernelManager->AddKernel<TM, 4, INGROUND, INGROUND>( );
573
+                                //ik[2] = KernelManager->AddKernel<TE, 2, INGROUND, INGROUND>( );
574
+                                //ik[3] = KernelManager->AddKernel<TE, 3, INGROUND, INGROUND>( );
575
+                            }
576
+                            break;
577
+
578
+                        case H:
579
+                            if (lays == 0 && layr == 0) {
580
+                                ik[5] = KernelManager->AddKernel<TM, 5, INAIR, INAIR>( );
581
+                                ik[6] = KernelManager->AddKernel<TM, 6, INAIR, INAIR>( );
582
+                                //ik[7] = KernelManager->AddKernel<TE, 7, INAIR, INAIR>( );
583
+                                //ik[8] = KernelManager->AddKernel<TE, 8, INAIR, INAIR>( );
584
+                                //ik[9] = KernelManager->AddKernel<TE, 9, INAIR, INAIR>( );
585
+                            } else if (lays == 0 && layr > 0) {
586
+                                ik[5] = KernelManager->AddKernel<TM, 5, INAIR, INGROUND>( );
587
+                                ik[6] = KernelManager->AddKernel<TM, 6, INAIR, INGROUND>( );
588
+                                //ik[7] = KernelManager->AddKernel<TE, 7, INAIR, INGROUND>( );
589
+                                //ik[8] = KernelManager->AddKernel<TE, 8, INAIR, INGROUND>( );
590
+                                //ik[9] = KernelManager->AddKernel<TE, 9, INAIR, INGROUND>( );
591
+                            } else if (lays > 0 && layr == 0) {
592
+                                ik[5] = KernelManager->AddKernel<TM, 5, INGROUND, INAIR>( );
593
+                                ik[6] = KernelManager->AddKernel<TM, 6, INGROUND, INAIR>( );
594
+                                //ik[7] = KernelManager->AddKernel<TE, 7, INGROUND, INAIR>( );
595
+                                //ik[8] = KernelManager->AddKernel<TE, 8, INGROUND, INAIR>( );
596
+                                //ik[9] = KernelManager->AddKernel<TE, 9, INGROUND, INAIR>( );
597
+                            } else {
598
+                                ik[5] = KernelManager->AddKernel<TM, 5, INGROUND, INGROUND>( );
599
+                                ik[6] = KernelManager->AddKernel<TM, 6, INGROUND, INGROUND>( );
600
+                                //ik[7] = KernelManager->AddKernel<TE, 7, INGROUND, INGROUND>( );
601
+                                //ik[8] = KernelManager->AddKernel<TE, 8, INGROUND, INGROUND>( );
602
+                                //ik[9] = KernelManager->AddKernel<TE, 9, INGROUND, INGROUND>( );
603
+                            }
604
+                            break;
605
+
606
+                        case BOTH:
607
+                            if (lays == 0 && layr == 0) {
608
+                                ik[0] = KernelManager->AddKernel<TM, 0, INAIR, INAIR>( );
609
+                                ik[1] = KernelManager->AddKernel<TM, 1, INAIR, INAIR>( );
610
+                                ik[4] = KernelManager->AddKernel<TM, 4, INAIR, INAIR>( );
611
+                                //ik[2] = KernelManager->AddKernel<TE, 2, INAIR, INAIR>( );
612
+                                //ik[3] = KernelManager->AddKernel<TE, 3, INAIR, INAIR>( );
613
+                                ik[5] = KernelManager->AddKernel<TM, 5, INAIR, INAIR>( );
614
+                                ik[6] = KernelManager->AddKernel<TM, 6, INAIR, INAIR>( );
615
+                                //ik[7] = KernelManager->AddKernel<TE, 7, INAIR, INAIR>( );
616
+                                //ik[8] = KernelManager->AddKernel<TE, 8, INAIR, INAIR>( );
617
+                                //ik[9] = KernelManager->AddKernel<TE, 9, INAIR, INAIR>( );
618
+                            } else if (lays == 0 && layr > 0) {
619
+                                ik[0] = KernelManager->AddKernel<TM, 0, INAIR, INGROUND>( );
620
+                                ik[1] = KernelManager->AddKernel<TM, 1, INAIR, INGROUND>( );
621
+                                ik[4] = KernelManager->AddKernel<TM, 4, INAIR, INGROUND>( );
622
+                                //ik[2] = KernelManager->AddKernel<TE, 2, INAIR, INGROUND>( );
623
+                                //ik[3] = KernelManager->AddKernel<TE, 3, INAIR, INGROUND>( );
624
+                                ik[5] = KernelManager->AddKernel<TM, 5, INAIR, INGROUND>( );
625
+                                ik[6] = KernelManager->AddKernel<TM, 6, INAIR, INGROUND>( );
626
+                                //ik[7] = KernelManager->AddKernel<TE, 7, INAIR, INGROUND>( );
627
+                                //ik[8] = KernelManager->AddKernel<TE, 8, INAIR, INGROUND>( );
628
+                                //ik[9] = KernelManager->AddKernel<TE, 9, INAIR, INGROUND>( );
629
+                            } else if (lays > 0 && layr == 0) {
630
+                                ik[0] = KernelManager->AddKernel<TM, 0, INGROUND, INAIR>( );
631
+                                ik[1] = KernelManager->AddKernel<TM, 1, INGROUND, INAIR>( );
632
+                                ik[4] = KernelManager->AddKernel<TM, 4, INGROUND, INAIR>( );
633
+                                //ik[2] = KernelManager->AddKernel<TE, 2, INGROUND, INAIR>( );
634
+                                //ik[3] = KernelManager->AddKernel<TE, 3, INGROUND, INAIR>( );
635
+                                ik[5] = KernelManager->AddKernel<TM, 5, INGROUND, INAIR>( );
636
+                                ik[6] = KernelManager->AddKernel<TM, 6, INGROUND, INAIR>( );
637
+                                //ik[7] = KernelManager->AddKernel<TE, 7, INGROUND, INAIR>( );
638
+                                //ik[8] = KernelManager->AddKernel<TE, 8, INGROUND, INAIR>( );
639
+                                //ik[9] = KernelManager->AddKernel<TE, 9, INGROUND, INAIR>( );
640
+                            } else {
641
+                                ik[0] = KernelManager->AddKernel<TM, 0, INGROUND, INGROUND>( );
642
+                                ik[1] = KernelManager->AddKernel<TM, 1, INGROUND, INGROUND>( );
643
+                                ik[4] = KernelManager->AddKernel<TM, 4, INGROUND, INGROUND>( );
644
+                                //ik[2] = KernelManager->AddKernel<TE, 2, INGROUND, INGROUND>( );
645
+                                //ik[3] = KernelManager->AddKernel<TE, 3, INGROUND, INGROUND>( );
646
+                                ik[5] = KernelManager->AddKernel<TM, 5, INGROUND, INGROUND>( );
647
+                                ik[6] = KernelManager->AddKernel<TM, 6, INGROUND, INGROUND>( );
648
+                                //ik[7] = KernelManager->AddKernel<TE, 7, INGROUND, INGROUND>( );
649
+                                //ik[8] = KernelManager->AddKernel<TE, 8, INGROUND, INGROUND>( );
650
+                                //ik[9] = KernelManager->AddKernel<TE, 9, INGROUND, INGROUND>( );
651
+                            }
652
+                            break;
653
+                        }
654
+                    }
655
+                break;
656
+
488 657
             case (UNGROUNDEDELECTRICDIPOLE):
489 658
 
490 659
                 if (std::abs(Pol[2]) > 0) { // z dipole
@@ -786,8 +955,6 @@ namespace Lemma {
786 955
                 exit(EXIT_FAILURE);
787 956
 
788 957
         }
789
-
790
-
791 958
     }
792 959
 
793 960
     void DipoleSource::UpdateFields( const int& ifreq, HankelTransform* Hankel, const Real& wavef) {
@@ -874,6 +1041,7 @@ namespace Lemma {
874 1041
                                     Pol[0]*Moment*QPI*sp*f(9) );
875 1042
                             }
876 1043
                             break;
1044
+
877 1045
                         case BOTH:
878 1046
                             f(0) = Hankel->Zgauss(0, TM, 0, rho, wavef, KernelManager->GetRAWKernel(ik[0])) / KernelManager->GetRAWKernel(ik[0])->GetYm();
879 1047
                             f(1) = Hankel->Zgauss(1, TM, 1, rho, wavef, KernelManager->GetRAWKernel(ik[1])) / KernelManager->GetRAWKernel(ik[1])->GetYm();
@@ -913,6 +1081,128 @@ namespace Lemma {
913 1081
                 }
914 1082
                 break; // GROUNDEDELECTRICDIPOLE
915 1083
 
1084
+            case (GROUNDINGPOINT):
1085
+                if (std::abs(Pol[2]) > 0) { // z dipole
1086
+                    switch(FieldsToCalculate) {
1087
+                        case E:
1088
+                            f(10) = Hankel->Zgauss(10, TM, 1, rho, wavef, KernelManager->GetRAWKernel(ik[10])) / KernelManager->GetRAWKernel(ik[10])->GetYm();
1089
+                            f(11) = Hankel->Zgauss(11, TM, 0, rho, wavef, KernelManager->GetRAWKernel(ik[11])) / KernelManager->GetRAWKernel(ik[11])->GetYm();
1090
+                            this->Receivers->AppendEfield(ifreq, irec,
1091
+                                -Pol[2]*QPI*cp*f(10)*Moment,
1092
+                                -Pol[2]*QPI*sp*f(10)*Moment,
1093
+                                 Pol[2]*QPI*f(11)*Moment);
1094
+                            break;
1095
+
1096
+                        case H:
1097
+                            f(12) = Hankel->Zgauss(12, TM, 1, rho, wavef, KernelManager->GetRAWKernel(ik[12]));
1098
+                            this->Receivers->AppendHfield(ifreq, irec,
1099
+                                -Pol[2]*QPI*sp*f(12)*Moment,
1100
+                                 Pol[2]*QPI*cp*f(12)*Moment,
1101
+                                 0. );
1102
+                            break;
1103
+
1104
+                        case BOTH:
1105
+                            f(10) = Hankel->Zgauss(10, TM, 1, rho, wavef, KernelManager->GetRAWKernel(ik[10])) / KernelManager->GetRAWKernel(ik[10])->GetYm();
1106
+                            f(11) = Hankel->Zgauss(11, TM, 0, rho, wavef, KernelManager->GetRAWKernel(ik[11])) / KernelManager->GetRAWKernel(ik[11])->GetYm();
1107
+                            this->Receivers->AppendEfield(ifreq, irec,
1108
+                                    -Pol[2]*QPI*cp*f(10)*Moment,
1109
+                                    -Pol[2]*QPI*sp*f(10)*Moment,
1110
+                                     Pol[2]*QPI*f(11)*Moment   );
1111
+
1112
+                            f(12) = Hankel->Zgauss(12, TM, 1, rho, wavef, KernelManager->GetRAWKernel(ik[12]));
1113
+                            this->Receivers->AppendHfield(ifreq, irec,
1114
+                                    -Pol[2]*QPI*sp*f(12)*Moment,
1115
+                                     Pol[2]*QPI*cp*f(12)*Moment,
1116
+                                     0. );
1117
+                    } // Fields to calculate Z polarity Electric dipole
1118
+                }
1119
+                if (std::abs(Pol[1]) > 0 || std::abs(Pol[0]) > 0) { // x or y dipole
1120
+                    switch(FieldsToCalculate) {
1121
+                        case E:
1122
+                            f(2) = 0;//Hankel->Zgauss(2, TE, 0, rho, wavef, KernelManager->GetRAWKernel(ik[2])) * KernelManager->GetRAWKernel(ik[2])->GetZs();
1123
+                            f(3) = 0;//Hankel->Zgauss(3, TE, 1, rho, wavef, KernelManager->GetRAWKernel(ik[3])) * KernelManager->GetRAWKernel(ik[3])->GetZs();
1124
+                            f(0) = Hankel->Zgauss(0, TM, 0, rho, wavef, KernelManager->GetRAWKernel(ik[0])) / KernelManager->GetRAWKernel(ik[0])->GetYm();
1125
+                            f(1) = Hankel->Zgauss(1, TM, 1, rho, wavef, KernelManager->GetRAWKernel(ik[1])) / KernelManager->GetRAWKernel(ik[1])->GetYm();
1126
+                            f(4) = Hankel->Zgauss(4, TM, 1, rho, wavef, KernelManager->GetRAWKernel(ik[4])) / KernelManager->GetRAWKernel(ik[4])->GetYm();
1127
+                            if (std::abs(Pol[1]) > 0) {
1128
+                                this->Receivers->AppendEfield(ifreq, irec,
1129
+                                    0,0,0);
1130
+                                    //Pol[1]*QPI*Moment*scp*(f(0)+f(2)),
1131
+                                    //Pol[1]*QPI*Moment*((sps*f(0)+c2p*f(1)/rho)),
1132
+                                    //Pol[1]*QPI*Moment*(f(0)+f(2)),
1133
+                                    //Pol[1]*QPI*Moment*((f(0)+f(1)/rho)),
1134
+                                    //Pol[1]*QPI*sp*f(4)*Moment);
1135
+                                    // std dipole
1136
+                                    //Pol[1]*QPI*scp*((f(0)-(Real)(2.)*f(1)/rho)+(f(2)-(Real)(2.)*f(3)/rho))*Moment ,
1137
+                                    //Pol[1]*QPI*((sps*f(0)+c2p*f(1)/rho)-(cps*f(2)-c2p*f(3)/rho))*Moment,
1138
+                                    //Pol[1]*QPI*sp*f(4)*Moment);
1139
+                            }
1140
+                            if (std::abs(Pol[0]) > 0) {
1141
+                                this->Receivers->AppendEfield(ifreq, irec,
1142
+                                    Pol[0]*Moment*QPI*((cps*f(0)-c2p*f(1)/rho)),          //-(sps*f(2)+c2p*f(3)/rho)),
1143
+                                    Pol[0]*Moment*QPI*scp*((f(0)-(Real)(2.)*f(1)/rho)),   //+(f(2)-(Real)(2.)*f(3)/rho)),
1144
+                                    Pol[0]*Moment*QPI*cp*f(4) );
1145
+                            }
1146
+                            break;
1147
+                        case H:
1148
+                            f(5) = Hankel->Zgauss(5, TM, 0, rho, wavef, KernelManager->GetRAWKernel(ik[5]));
1149
+                            f(6) = Hankel->Zgauss(6, TM, 1, rho, wavef, KernelManager->GetRAWKernel(ik[6]));
1150
+                            f(7) = Hankel->Zgauss(7, TE, 0, rho, wavef, KernelManager->GetRAWKernel(ik[7]))*KernelManager->GetRAWKernel(ik[7])->GetZs()/KernelManager->GetRAWKernel(ik[7])->GetZm();
1151
+                            f(8) = Hankel->Zgauss(8, TE, 1, rho, wavef, KernelManager->GetRAWKernel(ik[8]))*KernelManager->GetRAWKernel(ik[8])->GetZs()/KernelManager->GetRAWKernel(ik[8])->GetZm();
1152
+                            f(9) = Hankel->Zgauss(9, TE, 1, rho, wavef, KernelManager->GetRAWKernel(ik[9]))*KernelManager->GetRAWKernel(ik[9])->GetZs()/KernelManager->GetRAWKernel(ik[9])->GetZm();
1153
+                            if (std::abs(Pol[1]) > 0) {
1154
+                                this->Receivers->AppendHfield(ifreq, irec,
1155
+                                        Pol[1]*QPI*(sps*f(5)+c2p*f(6)/rho-cps*f(7)+c2p*f(8)/rho)*Moment,
1156
+                                        Pol[1]*QPI*scp*(-f(5)+(Real)(2.)*f(6)/rho-f(7)+(Real)(2.)*f(8)/rho)*Moment,
1157
+                                        -Pol[1]*QPI*cp*f(9)*Moment );
1158
+                            }
1159
+                            if (std::abs(Pol[0]) > 0) {
1160
+                                this->Receivers->AppendHfield(ifreq, irec,
1161
+                                    Pol[0]*Moment*QPI*scp*(f(5)-(Real)(2.)*f(6)/rho+f(7)-(Real)(2.)*f(8)/rho),
1162
+                                    Pol[0]*Moment*QPI*(-cps*f(5)+c2p*f(6)/rho+sps*f(7)+c2p*f(8)/rho),
1163
+                                    Pol[0]*Moment*QPI*sp*f(9) );
1164
+                            }
1165
+                            break;
1166
+
1167
+                        case BOTH:
1168
+                            f(0) = Hankel->Zgauss(0, TM, 0, rho, wavef, KernelManager->GetRAWKernel(ik[0])) / KernelManager->GetRAWKernel(ik[0])->GetYm();
1169
+                            f(1) = Hankel->Zgauss(1, TM, 1, rho, wavef, KernelManager->GetRAWKernel(ik[1])) / KernelManager->GetRAWKernel(ik[1])->GetYm();
1170
+                            f(4) = Hankel->Zgauss(4, TM, 1, rho, wavef, KernelManager->GetRAWKernel(ik[4])) / KernelManager->GetRAWKernel(ik[4])->GetYm();
1171
+                            f(2) = Hankel->Zgauss(2, TE, 0, rho, wavef, KernelManager->GetRAWKernel(ik[2])) * KernelManager->GetRAWKernel(ik[2])->GetZs();
1172
+                            f(3) = Hankel->Zgauss(3, TE, 1, rho, wavef, KernelManager->GetRAWKernel(ik[3])) * KernelManager->GetRAWKernel(ik[3])->GetZs();
1173
+                            f(5) = Hankel->Zgauss(5, TM, 0, rho, wavef, KernelManager->GetRAWKernel(ik[5]));
1174
+                            f(6) = Hankel->Zgauss(6, TM, 1, rho, wavef, KernelManager->GetRAWKernel(ik[6]));
1175
+                            f(7) = Hankel->Zgauss(7, TE, 0, rho, wavef, KernelManager->GetRAWKernel(ik[7]))*KernelManager->GetRAWKernel(ik[7])->GetZs()/KernelManager->GetRAWKernel(ik[7])->GetZm();
1176
+                            f(8) = Hankel->Zgauss(8, TE, 1, rho, wavef, KernelManager->GetRAWKernel(ik[8]))*KernelManager->GetRAWKernel(ik[8])->GetZs()/KernelManager->GetRAWKernel(ik[8])->GetZm();
1177
+                            f(9) = Hankel->Zgauss(9, TE, 1, rho, wavef, KernelManager->GetRAWKernel(ik[9]))*KernelManager->GetRAWKernel(ik[9])->GetZs()/KernelManager->GetRAWKernel(ik[9])->GetZm();
1178
+
1179
+                            if (std::abs(Pol[1]) > 0) {
1180
+                                this->Receivers->AppendEfield(ifreq, irec,
1181
+                                        Pol[1]*QPI*scp*((f(0)-(Real)(2.)*f(1)/rho)+(f(2)-(Real)(2.)*f(3)/rho))*Moment ,
1182
+                                        Pol[1]*QPI*((sps*f(0)+c2p*f(1)/rho)-(cps*f(2)-c2p*f(3)/rho))*Moment,
1183
+                                        Pol[1]*QPI*sp*f(4)*Moment);
1184
+
1185
+                                this->Receivers->AppendHfield(ifreq, irec,
1186
+                                        Pol[1]*QPI*(sps*f(5)+c2p*f(6)/rho-cps*f(7)+c2p*f(8)/rho)*Moment,
1187
+                                        Pol[1]*QPI*scp*(-f(5)+(Real)(2.)*f(6)/rho-f(7)+(Real)(2.)*f(8)/rho)*Moment,
1188
+                                       -Pol[1]*QPI*cp*f(9)*Moment );
1189
+                            }
1190
+                            if (std::abs(Pol[0]) > 0) {
1191
+                                this->Receivers->AppendEfield(ifreq, irec,
1192
+                                    Pol[0]*Moment*QPI*((cps*f(0)-c2p*f(1)/rho)-(sps*f(2)+c2p*f(3)/rho)),
1193
+                                    Pol[0]*Moment*QPI*scp*((f(0)-(Real)(2.)*f(1)/rho)+(f(2)-(Real)(2.)*f(3)/rho)),
1194
+                                    Pol[0]*Moment*QPI*cp*f(4) );
1195
+
1196
+                                this->Receivers->AppendHfield(ifreq, irec,
1197
+                                    Pol[0]*Moment*QPI*scp*(f(5)-(Real)(2.)*f(6)/rho+f(7)-(Real)(2.)*f(8)/rho),
1198
+                                    Pol[0]*Moment*QPI*(-cps*f(5)+c2p*f(6)/rho+sps*f(7)+c2p*f(8)/rho),
1199
+                                    Pol[0]*Moment*QPI*sp*f(9) );
1200
+                            }
1201
+                            break;
1202
+                    }
1203
+                }
1204
+                break; // GROUNDINGPOINT
1205
+
916 1206
 
917 1207
             case UNGROUNDEDELECTRICDIPOLE:
918 1208
 
@@ -955,11 +1245,16 @@ namespace Lemma {
955 1245
 
956 1246
                     switch(FieldsToCalculate) {
957 1247
                         case E:
958
-                            f(0) = 0;
959
-                            f(1) = 0;
1248
+                            //f(0) = 0;
1249
+                            //f(1) = 0;
1250
+                            //f(2) = Hankel->Zgauss(2, TE, 0, rho, wavef, KernelManager->GetRAWKernel(ik[2])) * KernelManager->GetRAWKernel(ik[2])->GetZs();
1251
+                            //f(3) = Hankel->Zgauss(3, TE, 1, rho, wavef, KernelManager->GetRAWKernel(ik[3])) * KernelManager->GetRAWKernel(ik[3])->GetZs();
1252
+                            //f(4) = 0;
960 1253
                             f(2) = Hankel->Zgauss(2, TE, 0, rho, wavef, KernelManager->GetRAWKernel(ik[2])) * KernelManager->GetRAWKernel(ik[2])->GetZs();
961 1254
                             f(3) = Hankel->Zgauss(3, TE, 1, rho, wavef, KernelManager->GetRAWKernel(ik[3])) * KernelManager->GetRAWKernel(ik[3])->GetZs();
962
-                            f(4) = 0;
1255
+                            f(0) = Hankel->Zgauss(0, TM, 0, rho, wavef, KernelManager->GetRAWKernel(ik[0])) / KernelManager->GetRAWKernel(ik[0])->GetYm();
1256
+                            f(1) = Hankel->Zgauss(1, TM, 1, rho, wavef, KernelManager->GetRAWKernel(ik[1])) / KernelManager->GetRAWKernel(ik[1])->GetYm();
1257
+                            f(4) = Hankel->Zgauss(4, TM, 1, rho, wavef, KernelManager->GetRAWKernel(ik[4])) / KernelManager->GetRAWKernel(ik[4])->GetYm();
963 1258
                             if (std::abs(Pol[1]) > 0) {
964 1259
                                 this->Receivers->AppendEfield(ifreq, irec,
965 1260
                                     Pol[1]*QPI*scp*((f(0)-(Real)(2.)*f(1)/rho)+(f(2)-(Real)(2.)*f(3)/rho))*Moment,
@@ -984,7 +1279,7 @@ namespace Lemma {
984 1279
                                 this->Receivers->AppendHfield(ifreq, irec,
985 1280
                                         Pol[1]*QPI*(sps*f(5)+c2p*f(6)/rho-cps*f(7)+c2p*f(8)/rho)*Moment,
986 1281
                                         Pol[1]*QPI*scp*(-f(5)+(Real)(2.)*f(6)/rho-f(7)+(Real)(2.)*f(8)/rho)*Moment,
987
-                                        -Pol[1]*QPI*cp*f(9)*Moment );
1282
+                                       -Pol[1]*QPI*cp*f(9)*Moment );
988 1283
                             }
989 1284
                             if (std::abs(Pol[0]) > 0) {
990 1285
                                 this->Receivers->AppendHfield(ifreq, irec,
@@ -1036,7 +1331,6 @@ namespace Lemma {
1036 1331
                 break; // UNGROUNDEDELECTRICDIPOLE
1037 1332
 
1038 1333
             case MAGNETICDIPOLE:
1039
-
1040 1334
                 //Hankel->ComputeRelated(rho, KernelManager);
1041 1335
                 if (std::abs(Pol[2]) > 0) { // z dipole
1042 1336
                     switch(FieldsToCalculate) {

+ 27
- 9
Modules/FDEM1D/src/EMEarth1D.cpp Переглянути файл

@@ -72,8 +72,7 @@ namespace Lemma {
72 72
     // TODO init large arrays here.
73 73
     EMEarth1D::EMEarth1D( const ctor_key& key ) : LemmaObject( key ),
74 74
             Dipole(nullptr), Earth(nullptr), Receivers(nullptr), Antenna(nullptr),
75
-            FieldsToCalculate(BOTH), HankelType(ANDERSON801), icalcinner(0), icalc(0)
76
-        {
75
+            FieldsToCalculate(BOTH), HankelType(ANDERSON801), icalcinner(0), icalc(0) {
77 76
     }
78 77
 
79 78
     EMEarth1D::~EMEarth1D() {
@@ -107,21 +106,36 @@ namespace Lemma {
107 106
     // ====================  ACCESS        ===================================
108 107
     void EMEarth1D::AttachDipoleSource( std::shared_ptr<DipoleSource> dipoleptr) {
109 108
         Dipole = dipoleptr;
110
-    }
111
-
112
-    void EMEarth1D::AttachLayeredEarthEM( std::shared_ptr<LayeredEarthEM> earthptr) {
113
-        Earth = earthptr;
109
+        if (Receivers != nullptr) {
110
+            // Check to make sure Receivers are set up for all calculations
111
+            switch(FieldsToCalculate) {
112
+                case E:
113
+                    if (Receivers->NumberOfBinsE != Dipole->GetNumberOfFrequencies())
114
+                        Receivers->SetNumberOfBinsE(Dipole->GetNumberOfFrequencies());
115
+                    break;
116
+                case H:
117
+                    if (Receivers->NumberOfBinsH != Dipole->GetNumberOfFrequencies())
118
+                        Receivers->SetNumberOfBinsH(Dipole->GetNumberOfFrequencies());
119
+                    break;
120
+                case BOTH:
121
+                    if (Receivers->NumberOfBinsH != Dipole->GetNumberOfFrequencies())
122
+                        Receivers->SetNumberOfBinsH(Dipole->GetNumberOfFrequencies());
123
+                    if (Receivers->NumberOfBinsE != Dipole->GetNumberOfFrequencies())
124
+                        Receivers->SetNumberOfBinsE(Dipole->GetNumberOfFrequencies());
125
+                    break;
126
+            }
127
+        }
114 128
     }
115 129
 
116 130
     void EMEarth1D::AttachFieldPoints( std::shared_ptr<FieldPoints> recptr) {
117 131
 
118 132
         Receivers = recptr;
119 133
         if (Receivers == nullptr) {
120
-            std::cout << "nullptr Receivers in emearth1d.cpp " << std::endl;
134
+            std::cerr << "nullptr Receivers in emearth1d.cpp " << std::endl;
121 135
             return;
122 136
         }
123 137
 
124
-        // This has an implicid need to first set a source before receivers, users
138
+        // This has an implicit need to first set a source before receivers, users
125 139
         // will not expect this. Fix
126 140
         if (Dipole != nullptr) {
127 141
             switch (FieldsToCalculate) {
@@ -152,6 +166,10 @@ namespace Lemma {
152 166
         }
153 167
     }
154 168
 
169
+    void EMEarth1D::AttachLayeredEarthEM( std::shared_ptr<LayeredEarthEM> earthptr) {
170
+        Earth = earthptr;
171
+    }
172
+
155 173
     void EMEarth1D::AttachWireAntenna(std::shared_ptr<WireAntenna> antennae) {
156 174
         this->Antenna = antennae;
157 175
     }
@@ -227,6 +245,7 @@ namespace Lemma {
227 245
             if ( Antenna->IsHorizontallyPlanar() && ( HankelType == ANDERSON801 || HankelType == FHTKEY201  || HankelType==FHTKEY101 ||
228 246
                                                       HankelType == FHTKEY51    || HankelType == FHTKONG61  || HankelType == FHTKONG121 ||
229 247
                                                       HankelType == FHTKONG241  || HankelType == IRONS )) {
248
+
230 249
                 std::unique_ptr<ProgressBar> mdisp;
231 250
                 if (progressbar) {
232 251
                     mdisp = std::make_unique< ProgressBar >( Receivers->GetNumberOfPoints()*Antenna->GetNumberOfFrequencies() );
@@ -255,7 +274,6 @@ namespace Lemma {
255 274
                     #endif
256 275
                 }
257 276
 
258
-
259 277
             } else if (Receivers->GetNumberOfPoints() > Antenna->GetNumberOfFrequencies()) {
260 278
 
261 279
                 //** Progress display bar for long calculations */

+ 2
- 3
Modules/FDEM1D/src/FHTAnderson801.cpp Переглянути файл

@@ -940,7 +940,8 @@ namespace Lemma {
940 940
         icount = 0;
941 941
         Manager = KernelManager;
942 942
         this->kernelVec = KernelManager->GetSTLVector();
943
-        this->SetNumConv(nlag);
943
+        this->SetNumConv(nlag+1);
944
+
944 945
 #ifdef LEMMA_SINGLE_PRECISION
945 946
  		Compute(rho, 1, 1e-8);
946 947
 #else
@@ -958,7 +959,6 @@ namespace Lemma {
958 959
             SplineI->SetKnots( Arg, Zans.col(ii).imag() );
959 960
             splineVecImag.push_back(SplineI);
960 961
         }
961
-
962 962
     }
963 963
 
964 964
     void FHTAnderson801::SetLaggedArg(const Real& rho) {
@@ -998,7 +998,6 @@ namespace Lemma {
998 998
         // in release.
999 999
         #ifndef NDEBUG
1000 1000
 		if (rho<=0) {
1001
-            //std::cout << "rho= " << rho << std::endl;
1002 1001
 			throw std::runtime_error("In Hankel 2 Argument rho <= 0; rho=" + to_string(rho) );
1003 1002
 		}
1004 1003
 

+ 42
- 7
Modules/FDEM1D/src/PolygonalWireAntenna.cpp Переглянути файл

@@ -117,25 +117,43 @@ namespace Lemma {
117 117
 	// ====================  OPERATIONS    =======================
118 118
 
119 119
 	void PolygonalWireAntenna::ApproximateWithElectricDipoles(const Vector3r &rp) {
120
+
120 121
         // Only resplit if necessary. Save a few cycles if repeated
121 122
         if ( (rRepeat-rp).norm() > 1e-16 ) {
122
-		    Dipoles.clear();
123
+
124
+            Dipoles.clear();
123 125
 
124 126
             ///////////////////
125 127
 		    // dipole array, this has impoved performance over directly pushing
126 128
 		    std::vector< std::shared_ptr<DipoleSource> >       xDipoles;
127 129
 
128
-		    // loop over all segments
130
+            // check to see if loop is closed
131
+            /*
132
+            int lastPoint = Points.cols()-1;
133
+            if ( (Points.col(0) - Points.col(lastPoint)).norm() > 1e-3 ) {
134
+                AddGroundingPoint( Points.col(0), Points.col(1)-Points.col(0), xDipoles );
135
+            }
136
+            */
137
+
138
+		    // loop over all segments, TODO fix for closed loops
129 139
 		    int iseg;
130
-            for (iseg=0; iseg<NumberOfPoints-1; ++iseg) {
140
+            for (iseg=0; iseg<NumberOfPoints-1; ++iseg) { // closed loop
141
+            //for (iseg=1; iseg<NumberOfPoints-2; ++iseg) { // grounded wire
131 142
 			    InterpolateLineSegment(Points.col(iseg), Points.col(iseg+1), rp, xDipoles);
132 143
 		    }
133 144
 
134
-            // Check to see if the loop is closed, if not, assume its grounded on ends,
135
-            if ( (Points.col(0)-Points.col(iseg)).norm() > 1e-3 ) {
136
-                xDipoles[0]->SetType(GROUNDEDELECTRICDIPOLE);
137
-                xDipoles.back()->SetType(GROUNDEDELECTRICDIPOLE);
145
+            // check to see if loop is closed
146
+            /*
147
+            if ( (Points.col(lastPoint)-Points.col( lastPoint-1 )).norm() > 1e-3 ) {
148
+                AddGroundingPoint( Points.col(lastPoint), Points.col(lastPoint)-Points.col(lastPoint-1), xDipoles );
138 149
             }
150
+            */
151
+
152
+            // Check to see if the loop is closed, if not, assume its grounded on ends,
153
+            //if ( (Points.col(0)-Points.col(iseg)).norm() > 1e-3 ) {
154
+            //    xDipoles[0]->SetType(GROUNDEDELECTRICDIPOLE);
155
+            //    xDipoles.back()->SetType(GROUNDEDELECTRICDIPOLE);
156
+            //}
139 157
 
140 158
             Dipoles = std::move(xDipoles);
141 159
             rRepeat = rp;
@@ -147,6 +165,23 @@ namespace Lemma {
147 165
         }
148 166
 	}
149 167
 
168
+    void PolygonalWireAntenna::AddGroundingPoint( const Vector3r &cp, const Vector3r& dir,
169
+                                std::vector< std::shared_ptr<DipoleSource> > &xDipoles) {
170
+		Real scale = (Real)(NumberOfTurns)*Current;
171
+        auto tx = DipoleSource::NewSP();
172
+		    tx->SetLocation(cp);
173
+		    tx->SetType(GROUNDINGPOINT);
174
+		    //tx->SetType(GROUNDEDELECTRICDIPOLE);
175
+		    //tx->SetType(MAGNETICDIPOLE);
176
+			tx->SetPolarisation(dir.array()); //dir.norm());
177
+			tx->SetFrequencies(Freqs);
178
+			tx->SetMoment(scale);
179
+			xDipoles.push_back(tx);
180
+        //std::cout << "cp " << cp.transpose() << std::endl;
181
+        //std::cout << "pol " << tx->GetPolarisation().transpose() << std::endl;
182
+        //std::cout << "moment " << tx->GetMoment() << std::endl;
183
+    }
184
+
150 185
 	Vector3r PolygonalWireAntenna::ClosestPointOnLine(const Vector3r &p1,
151 186
 					const Vector3r &p2, const Vector3r &tp) {
152 187
 

+ 6
- 0
Modules/LemmaCore/CMakeLists.txt Переглянути файл

@@ -33,6 +33,12 @@ if ( LEMMA_VTK6_SUPPORT OR LEMMA_VTK7_SUPPORT OR LEMMA_VTK8_SUPPORT )
33 33
 #	target_link_libraries(lemmacore "matplot")
34 34
 endif()
35 35
 
36
+
37
+if ( LEMMA_VTK9_SUPPORT ) 
38
+	target_link_libraries(lemmacore ${visibility}VTK::CommonCore VTK::IOXML VTK::FiltersHyperTree)
39
+	vtk_module_autoinit(TARGETS lemmacore MODULES VTK::CommonCore VTK::IOXML VTK::FiltersHyperTree)
40
+endif()
41
+
36 42
 # find_package(yaml-cpp) does not seem to properly define library names...
37 43
 # a better solution than this is welcome 
38 44
 

+ 1
- 1
Modules/LemmaCore/include/RectilinearGridVTKExporter.h Переглянути файл

@@ -26,7 +26,7 @@
26 26
 #include "LemmaObject.h"
27 27
 #include "RectilinearGrid.h"
28 28
 
29
-#include <vtkSmartPointer.h>
29
+#include "vtkSmartPointer.h"
30 30
 #include "vtkXMLRectilinearGridWriter.h"
31 31
 #include "vtkRectilinearGrid.h"
32 32
 #include "vtkDoubleArray.h"

+ 2
- 1
Modules/LemmaCore/include/lemma.h Переглянути файл

@@ -301,9 +301,10 @@
301 301
          @param NOSOURCETYPE is default.
302 302
          @param GROUNDEDELECTRICDIPOLE is an grounded electric dipole
303 303
          @param UNGROUNDEDELECTRICDIPOLE is an ungrounded electric dipole
304
+         @param GROUNDINGPOINT is a point of grounding in a bipole (or similiar) transmitter
304 305
          @param MAGNETICDIPOLE is a magnetic dipole
305 306
         */
306
-        enum DIPOLESOURCETYPE {NOSOURCETYPE, GROUNDEDELECTRICDIPOLE, UNGROUNDEDELECTRICDIPOLE, MAGNETICDIPOLE};
307
+        enum DIPOLESOURCETYPE {NOSOURCETYPE, GROUNDEDELECTRICDIPOLE, UNGROUNDEDELECTRICDIPOLE, GROUNDINGPOINT, MAGNETICDIPOLE};
307 308
 
308 309
         /// Only three polarizations are supported. They may be summed to
309 310
         /// approximate others

+ 7
- 3
Modules/LemmaCore/src/CubicSplineInterpolator.cpp Переглянути файл

@@ -173,17 +173,21 @@ namespace Lemma {
173 173
     //      Method:  Interpolate
174 174
     //--------------------------------------------------------------------------------------
175 175
     Real CubicSplineInterpolator::Interpolate ( const Real& x, int& i) {
176
+
176 177
         // O(n) search, could do bisection, but if these are sorted, then this is quick
177
-        while(Spline.x[i] < x && i<Spline.x.size()) {
178
+        while(Spline.x[i] < x && i<Spline.x.size()-1) {
178 179
             ++i;
179 180
         }
180 181
         --i;
181 182
 
182 183
 //         if ( x > Spline.x[i] ) {
183
-//             std::cout << "DOOM\t" << x << "\t" << i << "\t" << Spline.x[i];
184
-//             throw std::runtime_error("CubicSplineInterpolator::Interpolate ATTEMPT TO INTERPOLATE PAST LAST KNOT");
184
+//             std::cout << "DOOM in interplate\t x=" <<  x << "\ti=" << i << "\tSpline.x[i]=" << Spline.x[i] << std::endl;
185
+//             std::cout <<"Spline.x.size()" << Spline.x.size() << std::endl;
186
+//             std::cout << "Spline.x" << Spline.x.transpose() << std::endl;
187
+//             //throw std::runtime_error("CubicSplineInterpolator::Interpolate ATTEMPT TO INTERPOLATE PAST LAST KNOT");
185 188
 //         }
186 189
 
190
+
187 191
         return Spline.a[i] + Spline.b[i]*(x-Spline.x[i]) + Spline.c[i]*((x-Spline.x[i])*(x-Spline.x[i])) +
188 192
                Spline.d[i]*((x-Spline.x[i])*(x-Spline.x[i])*(x-Spline.x[i]) );
189 193
     }		// -----  end of method CubicSplineInterpolator::Interpolate  -----

+ 3
- 0
Modules/LemmaCore/src/helper.cpp Переглянути файл

@@ -185,6 +185,8 @@ std::string enum2String( const DIPOLESOURCETYPE& Type ) {
185 185
             return std::string("GROUNDEDELECTRICDIPOLE");
186 186
         case UNGROUNDEDELECTRICDIPOLE:
187 187
             return std::string("UNGROUNDEDELECTRICDIPOLE");
188
+        case GROUNDINGPOINT:
189
+            return std::string("GROUNDINGPOINT");
188 190
         case MAGNETICDIPOLE:
189 191
             return std::string("MAGNETICDIPOLE");
190 192
         default:
@@ -258,6 +260,7 @@ DIPOLESOURCETYPE string2Enum<DIPOLESOURCETYPE>( const std::string& str ) {
258 260
     if      (str == "NOSOURCETYPE")              return NOSOURCETYPE;
259 261
     if      (str == "GROUNDEDELECTRICDIPOLE")    return GROUNDEDELECTRICDIPOLE;
260 262
     if      (str == "UNGROUNDEDELECTRICDIPOLE")  return UNGROUNDEDELECTRICDIPOLE;
263
+    if      (str == "GROUNDINGPOINT")            return GROUNDINGPOINT;
261 264
     if      (str == "MAGNETICDIPOLE")            return MAGNETICDIPOLE;
262 265
     else {
263 266
         throw std::runtime_error("string not recognized as DipoleSource");

+ 1
- 1
vim/c.vim Переглянути файл

@@ -9,7 +9,7 @@ highlight eType ctermfg=Magenta guifg=Magenta
9 9
 syn keyword eType  MAGUNITS  TEMPUNITS  TIMEUNITS FREQUENCYUNITS FEMCOILORIENTATION ORIENTATION FIELDTYPE FIELDCOMPONENT SPATIALCOORDINANT HANKELTRANSFORMTYPE FIELDCALCULATIONS WINDOWTYPE DIPOLESOURCETYPE 
10 10
 
11 11
 highlight eeType ctermfg=Cyan guifg=Cyan
12
-syn keyword eeType  TESLA NANOTESLA GAUSS CELCIUS KELVIN SEC MILLISEC MICROSEC NANOSEC PICOSEC HZ KHZ MHZ GHZ COAXIAL COPLANAR HFIELDREAL HFIELDIMAG EFIELDREAL EFIELDIMAG XCOMPONENT YCOMPONENT ZCOMPONENT XCOORD YCOORD ZCOORD X Y Z NX  NY  NZ ANDERSON801 CHAVE FHTKEY201 FHTKEY101 FHTKEY51 FHTKONG241 FHTKONG121 FHTKONG61 QWEKEY E H BOTH HAMMING HANNING RECTANGULAR NOSOURCETYPE GROUNDEDELECTRICDIPOLE UNGROUNDEDELECTRICDIPOLE MAGNETICDIPOLE
12
+syn keyword eeType  TESLA NANOTESLA GAUSS CELCIUS KELVIN SEC MILLISEC MICROSEC NANOSEC PICOSEC HZ KHZ MHZ GHZ COAXIAL COPLANAR HFIELDREAL HFIELDIMAG EFIELDREAL EFIELDIMAG XCOMPONENT YCOMPONENT ZCOMPONENT XCOORD YCOORD ZCOORD X Y Z NX  NY  NZ ANDERSON801 CHAVE FHTKEY201 FHTKEY101 FHTKEY51 FHTKONG241 FHTKONG121 FHTKONG61 QWEKEY E H BOTH HAMMING HANNING RECTANGULAR NOSOURCETYPE GROUNDEDELECTRICDIPOLE GROUNDINGPOINT UNGROUNDEDELECTRICDIPOLE MAGNETICDIPOLE
13 13
 
14 14
 " Namespaces
15 15
 highlight nspace ctermfg=Red guifg=Red

Завантаження…
Відмінити
Зберегти