// =========================================================================== // // Filename: uttemforward.cpp // // Description: TEM Forward Modeller // // Version: 0.0 // Created: 02/10/2011 03:32:18 PM // Revision: none // Compiler: Tested with g++, icpc, and MSVC 2000 // // Author: M. Andy Kass (MAK) // // Copyright: 2011 Trevor Irons and M. Andy Kass // // Organisation: Colorado School of Mines (CSM) // Broken Spoke Development, LLC // // Email: mkass@numericalgeo.com // // 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 "Lemma" #include "banner.h" using namespace Lemma; #ifdef LEMMAUSEVTK #include "matplot.h" using namespace matplot; #endif int main(int argv, char** argc) { // Just for timing clock_t launch =clock(); // Banner display std::string name; std::string version; std::string usage; name = "TEM Forward Modeller - 1D"; version = "1.0beta"; usage = "temforward1d [inputfile]"; banner(name,version,usage); if ( argv < 2 ) { std::cout << "No input file specified, should be of format\n"; std::cout << "origparabk.obsy ! Observations-style file.\n\ origpara.con ! Starting model.\n\ 100 ! Number of Hankel kernel evaluations.\n\ 100 1. 1.0E+10 ! Number of Fourier kernel evaluations, & min & max freq.\n\ N ! Is noise to be added?\n\ 5. 1.0E-08 30 ! Noise to be added: percentage, threshold, seed.\n\ " << std::endl; exit(0); } time_t curr=time(0); std::cout << std::endl; std::cout << " Start time: " << ctime(&curr) << std::endl; // Define objects PolygonalWireAntenna* Trans = PolygonalWireAntenna::New(); // PolygonalWireAntenna* pa = PolygonalWireAntenna::New(); // pa->SetNumberOfPoints(5); // pa->SetPoint(0, Vector3r( 0, 0, -30.001)); // pa->SetPoint(1, Vector3r( 0, 20, -35.001)); // pa->SetPoint(2, Vector3r( 20 , 20, -35.001)); // pa->SetPoint(3, Vector3r( 20, 0, -30.001)); // pa->SetPoint(4, Vector3r( 0, 0, -30.001)); // pa->SetCurrent(100.); // pa->SetNumberOfTurns(1); //DipoleSource* Trans = DipoleSource::New(); ReceiverPoints *Receivers = ReceiverPoints::New(); LayeredEarthEM *Earth = LayeredEarthEM::New(); VectorXr maintimes; ///////////////////////////////////// // Using model reader ModelReaderTem1DUBC* Reader = ModelReaderTem1DUBC::New(); Reader->SetEMEarth1D(Earth); Reader->SetTransmitter(Trans); Reader->SetReceiver(Receivers); Reader->ReadParameters( argc[1] ); maintimes = Reader->GetTimes(); // Attach it to instrumentTEM InstrumentTem *instrument = InstrumentTem::New(); instrument->EMEarthModel(Earth); instrument->SetTransmitLoop(Trans); //instrument->SetTransmitLoop(pa); //instrument->SetDipoleSource(Trans); instrument->SetReceiver(Receivers); // TODO need to input these VectorXr widths = VectorXr::Ones(maintimes.size()); // * 1e-5; /* widths.segment(0,5).array() *= 5e-6; widths.segment(5,5).array() *= 1e-5; widths.segment(10,5).array() *= 5e-5; widths.segment(15,5).array() *= 2e-4; widths.segment(20,5).array() *= 4e-4; //widths.segment(25,5).array() *= 4e-4; */ /* widths << .48,4.,8.,8.,8.,8.,8.,12.,12.,12.,16.,16.,16.,20.,24.,24.,28.,32.,32.,36.,40.,44.,52., 56.,64.,68.,76.,88.,96.,104.,120.,132.,144.,160.,180.,200.,220.,248.,272.,304.,336.,376., 416.,464.,516.,572.,636.,708.,784.,872.,968.,1076.,1196.,1328.,1476.,1640.,1824.,2024., 2248.,2500. ; */ widths *= 1e-6; std::cout << widths.transpose() << std::endl; instrument->SetReferenceTime(.025); //instrument->SetReferenceTime(.025); instrument->SetTimeGates(maintimes, widths); //instrument->SetReceiverType(MAGNETOMETER); instrument->SetReceiverType(INDUCTIVE); // Set the pulse VectorXr Amp(4); Amp << 0,1,1,0; VectorXr Times(4); Times << 0., .0005, .02497, .025; //VectorXr Amp(4); Amp << 0,1,1,0; //VectorXr Times(4); Times << -0.025, -0.0245, -0.00003, 0.0; //instrument->SetPulse(Amp, Times); //VectorXr Amp(3); Amp << 0,1,0; //VectorXr Times(3); Times << 0, .015, .030; //instrument->SetPulse(Amp, Times); //VectorXr Amp(3); Amp << 0,1,0; //VectorXr Times(3); Times << 0, .01, .020; instrument->SetPulse(Amp, Times); std::cout << *Earth << "\n" << *Trans << "\n" << *Receivers << std::endl; // Perform the forward model //instrument->MakeDirectCalculation( FHTKEY201 ); //instrument->MakeLaggedCalculation( ANDERSON801 ); //instrument->MakeLaggedCalculation( QWEKEY ); //instrument->MakeLaggedCalculation( CHAVE ); instrument->MakeLaggedCalculation( FHTKEY201 ); //instrument->MakeLaggedCalculation( FHTKEY101 ); int nlag = instrument->GetMeasurements().rows(); // Output results to screen for (int ii=0; iiGetMeasurements()(ii,0)<<" "<GetMeasurements()(ii,1)<GetMeasurements()(ii,0)<< "\t" << (MU0*1e9)*instrument->GetMeasurements()(ii,1)<GetMeasurements()(ii,0)<< "\t" << MU0*instrument->GetMeasurements()(ii,1) << std::endl; //outfile1 << instrument->GetMeasurements()(ii,0)<< "\t" << instrument->GetMeasurements()(ii,1)<Delete(); Trans->Delete(); Earth->Delete(); Receivers->Delete(); Reader->Delete(); return EXIT_SUCCESS; }