Updates for better integration with Akvo
authorTrevor Irons <Trevor.Irons@lemmasoftware.org>
Tue, 27 Nov 2018 00:51:04 +0000 (17:51 -0700)
committerTrevor Irons <Trevor.Irons@lemmasoftware.org>
Tue, 27 Nov 2018 00:51:04 +0000 (17:51 -0700)
CMakeLists.txt
examples/CMakeLists.txt
examples/KernelAligner.cpp
examples/KernelV0-2.cpp
examples/KernelV0.cpp
include/KernelV0.h
include/LoopInteractions.h
src/KernelV0.cpp

index c70ac0a..6245b27 100644 (file)
@@ -1,7 +1,7 @@
 # Configure Merlin 
 set(MERLIN_VERSION_MAJOR "0")
 set(MERLIN_VERSION_MINOR "0")
-set(MERLIN_VERSION_PATCH "2")
+set(MERLIN_VERSION_PATCH "3")
 set(MERLIN_VERSION "\"${MERLIN_VERSION_MAJOR}.${MERLIN_VERSION_MINOR}.${MERLIN_VERSION_PATCH}\"")
 set(MERLIN_VERSION_NOQUOTES "${MERLIN_VERSION_MAJOR}.${MERLIN_VERSION_MINOR}.${MERLIN_VERSION_PATCH}")
 
index 4468557..ce23426 100644 (file)
@@ -32,6 +32,8 @@ endif()
 
 INSTALL_TARGETS( "/share/Merlin/"
        KernelV0
+       KernelV0-2
+       KernelAligner
        Coupling
        Interference
 )
index cd93b50..c5b9b5b 100644 (file)
@@ -28,6 +28,5 @@ int main(int argc, char** argv) {
         exit(EXIT_SUCCESS);
     }
     auto K0 = KernelV0::NewSP();
-
     std::cout << *K0 << std::endl;
 }
index e06323b..59dcaf9 100644 (file)
@@ -30,6 +30,7 @@ int main(int argc, char** argv) {
 
     std::cout << "Using kernel paramaters: " << argv[1] << std::endl;
     auto Kern = KernelV0::DeSerialize( YAML::LoadFile(argv[1]) );
+    std::cout << "Kernel DeSerialized successful" << std::endl;
 
     std::vector<std::string> tx = {std::string(argv[2])};
     std::vector<std::string> rx = {std::string(argv[3])};
index 9f6e0bf..4e7aa69 100644 (file)
@@ -24,7 +24,10 @@ std::shared_ptr<PolygonalWireAntenna> CircularLoop ( int nd, Real radius, Real O
 
 int main(int argc, char** argv) {
 
-    Real offset = atof(argv[1]);
+    if (argc < 6) {             // 1          2           3                    4                5
+        std::cout << "./KernelV0 TxCoil.yaml RxCoil.yaml  EMEarthModel.yaml    AkvoDataSet.yaml Output.yaml \n";
+        exit(EXIT_SUCCESS);
+    }
 
        auto earth = LayeredEarthEM::NewSP();
                earth->SetNumberOfLayers(3);
@@ -34,10 +37,19 @@ int main(int argc, char** argv) {
         // From NOAA, Laramie WY, June 9 2016, aligned with mag. north
         earth->SetMagneticFieldIncDecMag( 67, 9, 52750, NANOTESLA );
 
-    // Transmitter loops
-    auto Tx1 = CircularLoop(21, 15, 100, 100);
-    auto Tx2 = CircularLoop(21, 15, 100, 100 + offset); // 100, 115, 124.8, 130
-    //auto Tx1 = CircularLoop(60, 15, 0, 0); // was 60
+        auto Tx1 = PolygonalWireAntenna::DeSerialize( YAML::LoadFile(argv[1]) );
+        auto Tx2 = PolygonalWireAntenna::DeSerialize( YAML::LoadFile(argv[2]) );
+
+        //////////////////////////////////////               _
+        Tx1->SetCurrent(1.);                //               |
+        Tx1->SetNumberOfTurns(1);           //    Set these from Akvo input!
+        Tx1->SetNumberOfFrequencies(1);     //               |
+        Tx1->SetFrequency(0,2246);          //               |
+        Tx2->SetCurrent(1.);                //               |
+        Tx2->SetNumberOfTurns(1);           //           \   |   /
+        Tx2->SetNumberOfFrequencies(1);     //            \  |  /
+        Tx2->SetFrequency(0,2246);          //             \ | /
+        //////////////////////////////////////               _
 
     auto Kern = KernelV0::NewSP();
         Kern->PushCoil( "Coil 1", Tx1 );
@@ -46,24 +58,15 @@ int main(int argc, char** argv) {
 
         Kern->SetIntegrationSize( (Vector3r() << 200,200,200).finished() );
         Kern->SetIntegrationOrigin( (Vector3r() << 0,0,0).finished() );
-        Kern->SetTolerance( 1e-12 ); // 1e-12
+        Kern->SetTolerance( 1e-9 ); // 1e-12
 
-        Kern->AlignWithAkvoDataset( YAML::LoadFile(argv[2]) );
+        auto AkvoDataNode = YAML::LoadFile(argv[4]);
+        Kern->AlignWithAkvoDataset( AkvoDataNode );
 
-        Kern->SetPulseDuration(0.020);
-        VectorXr I(36);
+        // These should to into AlignWithAkvoDataSet...
+        Kern->SetPulseDuration( AkvoDataNode["pulseLength"][0].as<Real>() );
+        Kern->SetPulseCurrent( AkvoDataNode["Pulses"]["Pulse 1"]["current"].as<VectorXr>() ); // nbins, low, high
 
-        // off from VC by 1.075926340216996
-        // Pulses from Wyoming Red Buttes exp 0
-        I << 397.4208916184016, 352.364477036168, 313.0112765842783, 278.37896394065376, 247.81424224324982,
-             220.77925043190442, 196.76493264105017, 175.31662279234038, 156.0044839325404, 138.73983004230124,
-             123.42064612625474, 109.82713394836259, 97.76534468972267, 87.06061858367781, 77.56000002944572, 69.1280780096311,
-             61.64250263640252, 54.99473044877554, 49.091182970515476, 43.84634004556388, 39.184136917167976, 35.03619319797924,
-             31.347205894128976, 28.06346770557137, 25.139117042424758, 22.53420773366429, 20.214205433283347,
-             18.144318026099942, 16.299965972298878, 14.652633628829891, 13.184271405688083, 11.870540177313893,
-             10.697057141915716, 9.64778948429609, 8.709338689612677, 7.871268012862094;
-        //Kern->SetPulseCurrent( VectorXr::LinSpaced( 1, 10, 200 )  ); // nbins, low, high
-        Kern->SetPulseCurrent( I ); // nbins, low, high
 
         //VectorXr interfaces = VectorXr::LinSpaced( 41, .5, 45.5 ); // nlay, low, high
         VectorXr interfaces = VectorXr::LinSpaced( 51, .5, 45.5 ); // nlay, low, high
@@ -76,10 +79,12 @@ int main(int argc, char** argv) {
 
     // We could, I suppose, take the earth model in here? For non-linear that
     // may be more natural to work with?
-    std::vector<std::string> tx = {std::string("Coil 1"), std::string("Coil 2") };
+    //std::vector<std::string> tx = {std::string("Coil 1"), std::string("Coil 2") };
+    std::vector<std::string> tx = {std::string("Coil 1")};  //, std::string("Coil 2") };
     std::vector<std::string> rx = {std::string("Coil 2")};
     Kern->CalculateK0( tx, rx, false );
 
+/*
     std::ofstream dout = std::ofstream(std::string("k-Tx2coil-Rx1coil-offset-")+ std::string(argv[1])+ std::string(".dat"));
     //std::ofstream dout = std::ofstream(std::string("k-coincident.dat"));
         dout << interfaces.transpose() << std::endl;
@@ -89,8 +94,10 @@ int main(int argc, char** argv) {
         dout << "#imag\n";
         dout << Kern->GetKernel().imag() << std::endl;
         dout.close();
+*/
 
-    std::ofstream out = std::ofstream(std::string("k-Tx2coil-Rx1coil-offset-")+std::string(argv[1])+std::string(".yaml"));
+    //std::ofstream out = std::ofstream(std::string("k-Tx2coil-Rx1coil-offset-")+std::string(argv[1])+std::string(".yaml"));
+    std::ofstream out = std::ofstream(std::string(argv[5]));
     //std::ofstream out = std::ofstream(std::string("k-coincident.yaml"));
     out << *Kern;
     out.close();
index ab22041..fa81ca8 100644 (file)
@@ -20,7 +20,7 @@
 #define  KERNELV0_INC
 
 #pragma once
-#include "LemmaObject.h"
+#include "MerlinObject.h"
 #include "LayeredEarthEM.h"
 #include "PolygonalWireAntenna.h"
 #include "EMEarth1D.h"
@@ -58,7 +58,7 @@ namespace Lemma {
      * \details This class calculates the imaging kernel for a free induction decay
      *          pulse. The methodology follows from Weichman et al., 2000.
      */
-    class KernelV0 : public LemmaObject {
+    class KernelV0 : public MerlinObject {
 
         friend std::ostream &operator<<(std::ostream &stream, const KernelV0 &ob);
 
index 664dde0..9800a85 100644 (file)
@@ -41,8 +41,8 @@ namespace Lemma {
 
     /**
      * \ingroup Merlin
-     * \brief
-     * \details
+     * \brief   Class for calculating the interactions between wire loops.
+     * \details The calculations are done in the frequency domain.
      */
     template< INTERACTION Type  >
     class LoopInteractions : public LemmaObject {
index 85ab6a9..ea7a10f 100644 (file)
@@ -17,7 +17,7 @@
  * @copyright Copyright (c) 2008, Colorado School of Mines
  */
 
-
+#include "MerlinConfig.h"
 #include "KernelV0.h"
 #include "FieldPoints.h"
 
@@ -37,7 +37,7 @@ namespace Lemma {
     //      Method:  KernelV0
     // Description:  constructor (locked)
     //--------------------------------------------------------------------------------------
-    KernelV0::KernelV0 (const ctor_key& key) : LemmaObject( key ) {
+    KernelV0::KernelV0 (const ctor_key& key) : MerlinObject( key ) {
 
     }  // -----  end of method KernelV0::KernelV0  (constructor)  -----
 
@@ -46,7 +46,8 @@ namespace Lemma {
     //      Method:  KernelV0
     // Description:  DeSerializing constructor (locked)
     //--------------------------------------------------------------------------------------
-    KernelV0::KernelV0 (const YAML::Node& node, const ctor_key& key) : LemmaObject(node, key) {
+    KernelV0::KernelV0 (const YAML::Node& node, const ctor_key& key) : MerlinObject(node, key) {
+
         //node["PulseType"] = "FID";
         Larmor = node["Larmor"].as<Real>();
         Temperature = node["Temperature"].as<Real>();
@@ -116,7 +117,8 @@ namespace Lemma {
     //      Method:  Serialize
     //--------------------------------------------------------------------------------------
     YAML::Node  KernelV0::Serialize (  ) const {
-        YAML::Node node = LemmaObject::Serialize();
+
+        YAML::Node node = MerlinObject::Serialize();
         node.SetTag( GetName() );
 
         // Coils Transmitters & Receivers
@@ -173,11 +175,13 @@ namespace Lemma {
             std::cout << node["processed"] << std::endl;
         }
         if (node["pulseType"].as<std::string>() == "FID") {
+            std::cout << "FID pulse detected" << std::endl;
             PulseI  = node["Pulses"]["Pulse 1"]["current"].as<VectorXr>();
             this->SetPulseDuration( node["pulseLength"][0].as<double>() );
         } else {
             std::cerr << "Pulse Type " << node["PulseType"] << "is not supported\n";
         }
+        std::cout << "Finished with Akvo file read" << std::endl;
     }
 
     //--------------------------------------------------------------------------------------