Fix in phase term of coils!
authorT-bone <trevorirons@gmail.com>
Thu, 8 Dec 2016 14:23:06 +0000 (14:23 +0000)
committerT-bone <trevorirons@gmail.com>
Thu, 8 Dec 2016 14:23:06 +0000 (14:23 +0000)
examples/Coupling.cpp
examples/Interference.cpp
examples/KV0-3loops.cpp
examples/KernelV0.cpp
include/KernelV0.h
src/KernelV0.cpp
src/LoopInteractions.cpp

index 998cb74..bdc0880 100644 (file)
@@ -39,7 +39,6 @@ int main(int argc, char** argv) {
        auto earth = LayeredEarthEM::NewSP();
                earth->SetNumberOfLayers(3);
                earth->SetLayerConductivity( (VectorXcr(3) << Complex(0.,0), Complex(1./50.,0), Complex(1./100.)).finished() );
-               //earth->SetLayerConductivity( (VectorXcr(3) << Complex(0.,0), Complex(1./7.,0), Complex(1./100.)).finished() );
                earth->SetLayerThickness( (VectorXr(1) << 10).finished() );
         // Set mag field info
         // From NOAA, Laramie WY, June 9 2016, aligned with mag. north
@@ -60,12 +59,12 @@ int main(int argc, char** argv) {
         Kern->SetLayeredEarthEM( earth );
 
         Kern->SetIntegrationSize( (Vector3r() << 50,200,20).finished() );
-        Kern->SetIntegrationOrigin( (Vector3r() << 0,0,0.01).finished() );
-        Kern->SetTolerance( 1e-12 ); // 1e-12
+        Kern->SetIntegrationOrigin( (Vector3r() << 0,0,0.1).finished() );
+        Kern->SetTolerance( 1e-7 ); // 1e-12
 
     std::vector<std::string> tx = {std::string("Coil 1")};//,std::string("Coil 2")};
     std::vector<std::string> rx = {std::string("Coil 2")};
-    VectorXr Offsets = VectorXr::LinSpaced(30, 0.00, 45.0); // nbins, low, high
+    VectorXr Offsets = VectorXr::LinSpaced(121, 0.00, 60.0); // nbins, low, high
 
     auto outfile = std::ofstream("coupling.dat");
     for (int ii=0; ii< Offsets.size(); ++ii) {
index 6c146fd..ef2fb8e 100644 (file)
@@ -22,8 +22,8 @@ using namespace Lemma;
 
 static constexpr Real GAMMA = 2.67518e8;                  // MKS units
 
-std::shared_ptr<PolygonalWireAntenna> CircularLoop ( int nd, Real radius, Real Offsetx, Real Offsety, Real wL ) ;
-void MoveLoop( std::shared_ptr<PolygonalWireAntenna> Loop, int nd, Real Radius, Real Offsetx, Real Offsety, Real wL );
+std::shared_ptr<PolygonalWireAntenna>       CircularLoop ( int nd, Real Radius, Real Offsetx, Real Offsety, Real wL, Real pol=1. ) ;
+void MoveLoop( std::shared_ptr<PolygonalWireAntenna> Loop, int nd, Real Radius, Real Offsetx, Real Offsety, Real wL, Real pol=1. );
 
 int main(int argc, char** argv) {
     /*
@@ -50,8 +50,8 @@ int main(int argc, char** argv) {
     Real Larmor = earth->GetMagneticFieldMagnitude()*GAMMA/(2*PI);
 
     // Transmitter loops
-    auto Tx1 = CircularLoop(21, 15, 50, 50, Larmor);
-    auto Tx2 = CircularLoop(21, 15, 50, 50, Larmor); // initially coincident
+    auto Tx1 = CircularLoop(21, 15, 50, 50, Larmor,  1);
+    auto Tx2 = CircularLoop(21, 15, 50, 50, Larmor, -1); // initially coincident
 
     auto Kern = LoopInteractions<INTERFERENCE>::NewSP();
         Kern->PushCoil( "Coil 1", Tx1 );
@@ -59,16 +59,16 @@ int main(int argc, char** argv) {
         Kern->SetLayeredEarthEM( earth );
 
         Kern->SetIntegrationSize( (Vector3r()   << 50,200,50).finished() );
-        Kern->SetIntegrationOrigin( (Vector3r() << 0,0,5.0).finished() );
-        Kern->SetTolerance( 1e-3 ); // 1e-12
+        Kern->SetIntegrationOrigin( (Vector3r() << 0, 0, 0.1).finished() );
+        Kern->SetTolerance( 1e-5 ); // 1e-12
 
     std::vector<std::string> tx = {std::string("Coil 1")};//,std::string("Coil 2")};
     std::vector<std::string> rx = {std::string("Coil 2")};
     VectorXr Offsets = VectorXr::LinSpaced(61, 0.00, 60.0); // nbins, low, high
 
-    auto outfile = std::ofstream("interference.dat");
+    auto outfile = std::ofstream("interference-opposed.dat");
     for (int ii=0; ii< Offsets.size(); ++ii) {
-        MoveLoop(Tx2, 21, 15, 50, 50 + Offsets(ii), Larmor);
+        MoveLoop(Tx2, 21, 15, 50, 50 + Offsets(ii), Larmor, -1.);
         #ifdef LEMMAUSEVTK
         Complex coupling = Kern->Calculate( tx, rx, true );
         #else
@@ -80,7 +80,7 @@ int main(int argc, char** argv) {
     outfile.close();
 }
 
-std::shared_ptr<Lemma::PolygonalWireAntenna> CircularLoop ( int nd, Real Radius, Real Offsetx, Real Offsety, Real wL ) {
+std::shared_ptr<Lemma::PolygonalWireAntenna> CircularLoop ( int nd, Real Radius, Real Offsetx, Real Offsety, Real wL, Real pol ) {
 
     auto Tx1 = Lemma::PolygonalWireAntenna::NewSP();
          Tx1->SetNumberOfPoints(nd);
@@ -88,7 +88,7 @@ std::shared_ptr<Lemma::PolygonalWireAntenna> CircularLoop ( int nd, Real Radius,
     VectorXr range = VectorXr::LinSpaced(nd, 0, 2*PI);
     int ii;
     for (ii=0; ii<nd; ++ii) {
-        Tx1->SetPoint(ii, Vector3r(Offsetx+Radius*std::cos(range(ii)), Offsety+Radius*std::sin(range(ii)),  -1e-3));
+        Tx1->SetPoint(ii, Vector3r(Offsetx+Radius*std::cos(range(ii)), Offsety+pol*Radius*std::sin(range(ii)),  -1e-3));
     }
 
     Tx1->SetCurrent(1.);
@@ -99,14 +99,14 @@ std::shared_ptr<Lemma::PolygonalWireAntenna> CircularLoop ( int nd, Real Radius,
     return Tx1;
 }
 
-void MoveLoop( std::shared_ptr<Lemma::PolygonalWireAntenna> Tx1, int nd, Real Radius, Real Offsetx, Real Offsety, Real wL ) {
+void MoveLoop( std::shared_ptr<Lemma::PolygonalWireAntenna> Tx1, int nd, Real Radius, Real Offsetx, Real Offsety, Real wL, Real pol ) {
 
     Tx1->SetNumberOfPoints(nd);
 
     VectorXr range = VectorXr::LinSpaced(nd, 0, 2*PI);
     int ii;
     for (ii=0; ii<nd; ++ii) {
-        Tx1->SetPoint(ii, Vector3r(Offsetx+Radius*std::cos(range(ii)), Offsety+Radius*std::sin(range(ii)),  -1e-3));
+        Tx1->SetPoint(ii, Vector3r(Offsetx+Radius*std::cos(range(ii)), Offsety+pol*Radius*std::sin(range(ii)),  -1e-3));
     }
 
     Tx1->SetCurrent(1.);
index 89e5706..fc82327 100644 (file)
@@ -25,7 +25,7 @@ std::shared_ptr<PolygonalWireAntenna> CircularLoop ( int nd, Real radius, Real O
 int main(int argc, char** argv) {
 
     if (argc < 3) {
-        std::cout << "./KVo-3loops  <offset>  <tolerance>" << std::endl;
+        std::cout << "./KVo-3loops  <offset>  <tolerance> <rx>" << std::endl;
         exit(0);
     }
 
@@ -40,12 +40,17 @@ int main(int argc, char** argv) {
         // Set mag field info
         // From NOAA, Laramie WY, June 9 2016, aligned with mag. north
         earth->SetMagneticFieldIncDecMag( 67, 0, 52750, NANOTESLA );
+        //earth->SetMagneticFieldIncDecMag( 90, 0, 52750, NANOTESLA );
+        std::cout << "B0 " << earth->GetMagneticField( ).transpose() << std::endl;
+        std::cout << "hat BO " << earth->GetMagneticFieldUnitVector().transpose() << std::endl ;
+        std::cout << "hat |BO| " << earth->GetMagneticFieldUnitVector().norm() << std::endl ;
 
     // Transmitter loops
-    auto Tx1 = CircularLoop(21, 15, 100+offset/2., 100 - offset/2.);
-    auto Tx2 = CircularLoop(21, 15, 100+offset/2., 100 + offset/2.); // 100, 115, 124.8, 130
-    auto Tx3 = CircularLoop(21, 15, 100-offset/2., 100); // 100, 115, 124.8, 130
-    //auto Tx1 = CircularLoop(60, 15, 0, 0); // was 60
+    auto Tx1 = CircularLoop(21, 15, 100+offset/2., 100-offset/2.);
+    auto Tx2 = CircularLoop(21, 15, 100+offset/2., 100+offset/2.);
+    auto Tx3 = CircularLoop(21, 15, 100-offset/2., 100          );
+
+
 
     auto Kern = KernelV0::NewSP();
         Kern->PushCoil( "Coil 1", Tx1 );
@@ -85,10 +90,11 @@ int main(int argc, char** argv) {
     // may be more natural to work with?
     std::vector<std::string> tx = {std::string("Coil 1"), std::string("Coil 2"), std::string("Coil 3") };
     std::vector<std::string> rx = {std::string("Coil 1"), std::string("Coil 2"), std::string("Coil 3") };
-    //std::vector<std::string> rx = {std::string("Coil 1")};
+    //std::vector<std::string> rx = {std::string("Coil 1"), std::string("Coil 2")};//, std::string("Coil 3") };
+    //std::vector<std::string> rx = {std::string(argv[3])};
     Kern->CalculateK0( tx, rx, true );
 
-    std::ofstream dout = std::ofstream(std::string("k0-3Tx-RxCh1-")+ std::string(argv[1])+ std::string(".dat"));
+    std::ofstream dout = std::ofstream(std::string("k0-3Tx-RxCh-") + std::string(argv[3]) + std::string("-tol") + std::string(argv[1])+ std::string(".dat"));
     dout << "# Transmitters: ";
     for (auto lp : tx) {
         dout << lp << "\t";
@@ -109,10 +115,10 @@ int main(int argc, char** argv) {
         dout << Kern->GetKernel().imag() << std::endl;
         dout.close();
 
-    std::ofstream out = std::ofstream(std::string("k0-3Tx-RxCh1-")+std::string(argv[1])+std::string(".yaml"));
+    //std::ofstream out = std::ofstream(std::string("k0-3Tx-RxCh1-")+std::string(argv[1])+std::string(".yaml"));
     //std::ofstream out = std::ofstream(std::string("k-coincident.yaml"));
-    out << *Kern;
-    out.close();
+    //out << *Kern;
+    //out.close();
 }
 
 std::shared_ptr<Lemma::PolygonalWireAntenna> CircularLoop ( int nd, Real Radius, Real Offsetx, Real Offsety ) {
index 9d0ea8f..f80bfa7 100644 (file)
@@ -25,7 +25,6 @@ std::shared_ptr<PolygonalWireAntenna> CircularLoop ( int nd, Real radius, Real O
 int main(int argc, char** argv) {
 
     Real offset = atof(argv[1]);
-        std::cout << offset << std::endl;
 
        auto earth = LayeredEarthEM::NewSP();
                earth->SetNumberOfLayers(3);
@@ -64,8 +63,8 @@ int main(int argc, char** argv) {
         //Kern->SetPulseCurrent( VectorXr::LinSpaced( 1, 10, 200 )  ); // nbins, low, high
         Kern->SetPulseCurrent( I ); // nbins, low, high
 
-        //Kern->SetDepthLayerInterfaces( VectorXr::LinSpaced( 30, 3, 45.5 ) ); // nlay, low, high
-        VectorXr interfaces = VectorXr::LinSpaced( 41, .5, 45.5 ); // nlay, low, high
+        //VectorXr interfaces = VectorXr::LinSpaced( 41, .5, 45.5 ); // nlay, low, high
+        VectorXr interfaces = VectorXr::LinSpaced( 51, .5, 45.5 ); // nlay, low, high
         Real thick = .5;
         for (int ilay=1; ilay<interfaces.size(); ++ilay) {
             interfaces(ilay) = interfaces(ilay-1) + thick;
@@ -76,10 +75,10 @@ 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> rx = {std::string("Coil 1")};
+    std::vector<std::string> rx = {std::string("Coil 2")};
     Kern->CalculateK0( tx, rx, false );
 
-    std::ofstream dout = std::ofstream(std::string("k-")+ std::string(argv[1])+ std::string(".dat"));
+    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;
         dout << I.transpose() << std::endl;
@@ -89,7 +88,7 @@ int main(int argc, char** argv) {
         dout << Kern->GetKernel().imag() << std::endl;
         dout.close();
 
-    std::ofstream out = std::ofstream(std::string("k-")+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("k-coincident.yaml"));
     out << *Kern;
     out.close();
index d18b97f..1179561 100644 (file)
@@ -271,7 +271,7 @@ namespace Lemma {
         int                                       ilay;
         int                                       nleaves;
         int                                       minLevel=4;
-        int                                       maxLevel=8;
+        int                                       maxLevel=10;
 
         Real                                      VOLSUM;
         Real                                      tol=1e-11;
index 2c8702b..2adc4dd 100644 (file)
@@ -281,14 +281,14 @@ namespace Lemma {
 
         // Compute phase delay
         // TODO add transmiiter current phase and delay induced apparent time phase!
-        Complex PhaseTerm = EBR.bhat.dot(EBT.bhat) + (B0hat.dot(EBR.bhat.cross(EBT.bhat) ));
+        Complex PhaseTerm = EBR.bhat.dot(EBT.bhat) + Complex(0, (B0hat.dot(EBR.bhat.cross(EBT.bhat))));
         Complex ejztr = std::exp(Complex(0, EBR.zeta + EBT.zeta));
 
         // Calcuate vector of all responses
         VectorXcr F = VectorXcr::Zero( PulseI.size() );
         for (int iq=0; iq<PulseI.size(); ++iq) {
             // Compute the tipping angle
-            Real sintheta = std::sin(0.5*GAMMA*PulseI(iq)*Taup*std::abs(EBT.alpha-EBT.beta));
+            Real sintheta = std::sin(0.5*GAMMA*PulseI(iq)*Taup*(EBT.alpha-EBT.beta)); // why std::abs
             F(iq) = -volume*Complex(0,Larmor)*Mn0Abs*(EBR.alpha+EBR.beta)*ejztr*sintheta*PhaseTerm;
         }
         return F;
@@ -412,7 +412,7 @@ namespace Lemma {
         // implicit else, is a leaf
         Kern.row(ilay) += ksum;
         VOLSUM += 8.*vol;
-        nleaves += 1;
+        nleaves += 8; // reflects the number of kernel evaluations
         return;     // is leaf
     }
 
@@ -425,7 +425,7 @@ namespace Lemma {
         const VectorXcr& parentVal, vtkHyperOctree* oct, vtkHyperOctreeCursor* curse) {
 
         std::cout << "\r" << (int)(1e2*VOLSUM/(Size[0]*Size[1]*Size[2])) << "\t" << nleaves;
-        std::cout.flush();
+        //std::cout.flush();
 
         // Next level step, interested in one level below
         // bitshift requires one extra, faster than, and equivalent to std::pow(2, level+1)
@@ -502,11 +502,25 @@ namespace Lemma {
             }
             return;  // not a leaf
         }
+        /* just stuff with sum of the kids and don't subdivide */
+        /*
         LeafDict[curse->GetLeafId()] = ksum/(8.*vol);
         LeafDictIdx[curse->GetLeafId()] = nleaves;
+        */
+        /* Alternatively, subdivide the VTK octree here and stuff the children to make better
+         * visuals, but also 8x the storage...
+         */
+        oct->SubdivideLeaf(curse);
+        for (int ichild=0; ichild<8; ++ichild) {
+            curse->ToChild(ichild);
+            LeafDict[curse->GetLeafId()] = ksum/(8.*vol);
+            LeafDictIdx[curse->GetLeafId()] = nleaves;
+            curse->ToParent();
+        }
+
         Kern.row(ilay) += ksum;
         VOLSUM += 8*vol;
-        nleaves += 1;
+        nleaves += 8; // good reason to say 1 or 8 here...8 sounds better and reflects kernel evaluations
         return;     // is a leaf
     }
 
index 67b69f8..c6aa299 100644 (file)
@@ -47,7 +47,8 @@ namespace Lemma {
 
     template <>
     Complex LoopInteractions<INTERFERENCE>::f( const Vector3r& r, const Real& volume, const Vector3cr& Ht, const Vector3cr& Hr ) {
-        return volume * (1.-((Ht+Hr).norm()/(Hr.norm() + Ht.norm()))); // interference
+        //return volume * (1.-((Ht+Hr).norm()/(Hr.norm() + Ht.norm()))); // normalized interference
+        return volume * (Ht+Hr).norm();  // interference not normalized
     }
 
     template <>