// ===========================================================================
//
// Filename: utdipolesource.cpp
//
// Description:
//
// Version: 0.0
// Created: 12/02/2009 11:57:14 AM
// Revision: none
// Compiler: g++ (c++)
//
// Author: Trevor Irons (ti)
//
// Organisation: Colorado School of Mines (CSM)
// United States Geological Survey (USGS)
//
// Email: tirons@mines.edu, tirons@usgs.gov
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program. If not, see .
//
// ===========================================================================
#include
#include
#include "dipolesource.h"
#include "layeredearth.h"
#include "receiverpoints.h"
#include "emearth1d.h"
#include "WireAntenna.h"
#include "PolygonalWireAntenna.h"
#if LEMMAUSEVTK
#include "vtkRenderer.h"
#include "vtkRenderWindow.h"
#include "vtkRenderWindowInteractor.h"
#include "vtkRenderLargeImage.h"
#include "vtkPNGWriter.h"
#endif // ----- not LEMMA_USE_VTK -----
// For testing purposes disable VTK and run scale.sh
//#undef LEMMAUSEVTK
#include "timer.h"
using namespace Lemma;
double randDouble(double low, double high) {
//srand(time(0));
double temp;
/* swap low & high around if the user makes no sense */
if (low > high) {
temp = low;
low = high;
high = temp;
}
/* calculate the random number & return it */
temp = (rand() / (static_cast(RAND_MAX) + 1.0))
* (high - low) + low;
return temp;
}
int main() {
// Keep track of time
jsw_timer timer;
srand(time(0));
PolygonalWireAntenna *pa = PolygonalWireAntenna::New();
pa->SetNumberOfFrequencies(1);
pa->SetFrequency(0, 1000);
pa->SetNumberOfPoints(5);
pa->SetPoint(0, Vector3r( 0, 0, -.001));
pa->SetPoint(1, Vector3r( 100, 0, -.001));
pa->SetPoint(2, Vector3r( 100, 100, -.001));
pa->SetPoint(3, Vector3r( 0, 100, -.001));
pa->SetPoint(4, Vector3r( 0, 0, -.001));
pa->SetCurrent(1.);
pa->SetNumberOfTurns(1);
//Vector3r rp = Vector3r::Random(3);
//rp << 150., 10, 0.;
//rp << -27.1456, 15.2350, -1e-3;
//rp << randDouble(-35,35), randDouble(-35,35), randDouble(-35,35);
//rp << 3.22806, -13.1548, 14.9695;
//rp.setRandom(3);
//std::cout << "rp " << rp.transpose() << std::endl;
//pa->ApproximateWithElectricDipoles(rp);
WireAntenna *wire = WireAntenna::New();
wire->SetNumberOfPoints(5);
wire->SetPoint(0, Vector3r( 0, 0, -1e-3));
wire->SetPoint(1, Vector3r( 10, 0, -1e-3));
wire->SetPoint(2, Vector3r( 10, 10, -1e-3));
wire->SetPoint(3, Vector3r( 0, 10, -1e-3));
wire->SetPoint(4, Vector3r( 0, 0, -1e-3));
// TODO change wire antennae to use my class
//wire->SetNumberOfFrequencies(1);
wire->SetCurrent(1.);
wire->SetNumberOfFrequencies(1);
wire->SetFrequency(0, 1000);
wire->SetNumberOfTurns(1);
//wire->ApproximateWithElectricDipoles(5);
// Define model
VectorXcr sigma(2);
sigma << Complex(0.,0), Complex(.1,0);
VectorXr thick(1);
thick << 10;
LayeredEarthEM *earth = LayeredEarthEM::New();
earth->SetNumberOfLayers(2);
earth->SetLayerConductivity(sigma);
//earth->SetLayerThickness(thick);
// Receivers
ReceiverPoints *receivers = ReceiverPoints::New();
Vector3r loc;
Real ox = 50.561 ;
Real oy = 105.235 ;
Real depth = -3.75e1;
Real depth2 = depth;
Real dx = 1.;
int nz = 1;
receivers->SetNumberOfReceivers(nz);
int ir = 0;
for (int iz=0; izSetLocation(ir, loc);
depth += dx;
++ ir;
}
// EmEarth
EMEarth1D *EmEarth = EMEarth1D::New();
//EmEarth->AttachWireAntenna(wire);
EmEarth->AttachWireAntenna(pa);
EmEarth->AttachLayeredEarthEM(earth);
EmEarth->AttachReceiverPoints(receivers);
EmEarth->SetFieldsToCalculate(H);
//EmEarth->SetHankelTransformMethod(GAUSSIANQUADRATURE);
// Do calculation
timer.begin();
EmEarth->CalculateWireAntennaFields();
Real paTime = timer.end();
std::cout << "Polygonal wire antennae time: " << paTime << "\n";
//EmEarth->AttachWireAntenna(wire);
//timer.begin();
//EmEarth->CalculateWireAntennaFields();
//Real waTime = timer.end();
//std::cout << "Fixed wire antennae time: " << waTime << "\n";
depth = depth2;
std::fstream real("reale_lay.dat", std::ios::out);
std::fstream imag("image_lay.dat", std::ios::out);
std::fstream hreal("real_lay.dat", std::ios::out);
std::fstream himag("imag_lay.dat", std::ios::out);
for (int iz=0; izGetEfield(0,iz);
real << ox << "\t" << oy << "\t" << depth << "\t"
<< temp(0).real() << "\t" << temp(1).real()
<< "\t" << temp(2).real() << std::endl;
imag << ox << "\t" << oy << "\t" << depth << "\t"
<< std::imag(temp(0)) << "\t" << std::imag(temp(1))
<< "\t" << std::imag(temp(2)) << std::endl;
temp = receivers->GetHfield(0, iz);
hreal << ox << "\t" << oy << "\t" << depth << "\t"
<< std::real(temp(0)) << "\t" << std::real(temp(1))
<< "\t" << std::real(temp(2)) << std::endl;
himag << ox << "\t" << oy << "\t" << depth << "\t"
<< std::imag(temp(0)) << "\t" << std::imag(temp(1))
<< "\t" << std::imag(temp(2)) << std::endl;
depth += dx;
}
real.close();
imag.close();
hreal.close();
himag.close();
EmEarth->Delete();
receivers->Delete();
earth->Delete();
//wire->Delete();
#if LEMMAUSEVTK
// Create the usual rendering stuff.
vtkRenderer *renderer = vtkRenderer::New();
vtkRenderWindow *renWin = vtkRenderWindow::New();
vtkRenderWindowInteractor *iren = vtkRenderWindowInteractor::New();
// Line of tx
vtkLineSource *vline = vtkLineSource::New();
vtkTubeFilter *vTube = vtkTubeFilter::New();
vtkPolyDataMapper *vMapper = vtkPolyDataMapper::New();
vtkActor *vActor = vtkActor::New();
vline->SetPoint1(0,0,0);
vline->SetPoint2(10,0,0);
vTube->SetInputConnection(vline->GetOutputPort());
vTube->SetRadius(.2);
vTube->SetNumberOfSides(6);
vMapper->SetInputConnection(vTube->GetOutputPort());
vActor->SetMapper(vMapper);
vActor->GetProperty()->SetColor(0.0, .0, 1.0);
vActor->GetProperty()->SetOpacity(.15);
renderer->AddActor(vActor);
vtkLineSource *vline2 = vtkLineSource::New();
vtkTubeFilter *vTube2 = vtkTubeFilter::New();
vtkPolyDataMapper *vMapper2 = vtkPolyDataMapper::New();
vtkActor *vActor2 = vtkActor::New();
vline2->SetPoint1(10,0,0);
vline2->SetPoint2(10,10,0);
vTube2->SetInputConnection(vline2->GetOutputPort());
vTube2->SetRadius(.2);
vTube2->SetNumberOfSides(6);
vMapper2->SetInputConnection(vTube2->GetOutputPort());
vActor2->SetMapper(vMapper2);
vActor2->GetProperty()->SetColor(0.0, .0, 1.0);
vActor2->GetProperty()->SetOpacity(.15);
renderer->AddActor(vActor2);
vtkLineSource *vline3 = vtkLineSource::New();
vtkTubeFilter *vTube3 = vtkTubeFilter::New();
vtkPolyDataMapper *vMapper3 = vtkPolyDataMapper::New();
vtkActor *vActor3 = vtkActor::New();
vline3->SetPoint1(10,10,0);
vline3->SetPoint2(0,10,0);
vTube3->SetInputConnection(vline3->GetOutputPort());
vTube3->SetRadius(.2);
vTube3->SetNumberOfSides(6);
vMapper3->SetInputConnection(vTube3->GetOutputPort());
vActor3->SetMapper(vMapper3);
vActor3->GetProperty()->SetColor(0.0, .0, 1.0);
vActor3->GetProperty()->SetOpacity(.15);
renderer->AddActor(vActor3);
vtkLineSource *vline4 = vtkLineSource::New();
vtkTubeFilter *vTube4 = vtkTubeFilter::New();
vtkPolyDataMapper *vMapper4 = vtkPolyDataMapper::New();
vtkActor *vActor4 = vtkActor::New();
vline4->SetPoint1(0,10,0);
vline4->SetPoint2(0,0,0);
vTube4->SetInputConnection(vline4->GetOutputPort());
vTube4->SetRadius(.2);
vTube4->SetNumberOfSides(6);
vMapper4->SetInputConnection(vTube4->GetOutputPort());
vActor4->SetMapper(vMapper4);
vActor4->GetProperty()->SetColor(0.0, .0, 1.0);
vActor4->GetProperty()->SetOpacity(.15);
renderer->AddActor(vActor4);
loc << 50, 50, -1e-3;
pa->ApproximateWithElectricDipoles(loc);
vtkActor **pdipActors = new vtkActor*[pa->GetNumberOfDipoles()];
std::cout << "Wire approximated with " << pa->GetNumberOfDipoles() << std::endl;
for (int id=0; idGetNumberOfDipoles(); ++id) {
pdipActors[id] = pa->GetVtkActor(id);
renderer->AddActor(pdipActors[id]);
}
/*
vtkActor **dipActors = new vtkActor*[wire->GetNumberOfDipoles()];
for (int id=0; idGetNumberOfDipoles(); ++id) {
dipActors[id] = wire->GetVtkActor(id);
renderer->AddActor(dipActors[id]);
}
*/
renderer->SetBackground(1,1,1);
// Render the window
renWin->AddRenderer(renderer);
renWin->SetWindowName("Wire antennae");
iren->SetRenderWindow(renWin);
iren->Initialize();
iren->Start();
iren->Render();
#if 0
cout << "Enter File name?: ";
std::string pngName;
std::cin >> pngName;
vtkPNGWriter *pngwrite = vtkPNGWriter::New();
vtkRenderLargeImage *renlarge = vtkRenderLargeImage::New();
renlarge->SetInput(renderer);
renlarge->SetMagnification(2);
pngwrite->SetInputConnection(renlarge->GetOutputPort());
pngName.append(".png");
pngwrite->SetFileName(pngName.c_str());
pngwrite->Write();
#endif
#endif // ----- not LEMMA_USE_VTK -----
//std::cout << *pa << std::endl;
//pa->Delete();
return 0;
}