// ===========================================================================
//
// Filename: utfemforward.cpp
//
// Description:
//
// Version: 0.0
// Created: 01/15/2013 12:11:34 PM
// Revision: none
// Compiler: Tested with g++
//
// Author: M. Andy Kass (MAK)
//
// Organisation: 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() {
clock_t launch = clock();
// Banner display
std::string name;
std::string version;
std::string usage;
name = "FEM Forward Modeller - 1D ";
version = "1.0alpha";
usage = "utfemforward [inputfile]";
banner(name,version,usage);
time_t curr = time(0);
std::cout << std::endl << " Start time: " << ctime(&curr) << std::endl;
// Define some objects
DipoleSource* Trans = DipoleSource::New();
ReceiverPoints* Receivers = ReceiverPoints::New();
LayeredEarthEM* Earth = LayeredEarthEM::New();
// SINGLE SOUNDING
// Create new data object to receive forward model
DataFEM* modelledData = DataFEM::New();
// Create instrument object
InstrumentFem* theinstrument = InstrumentFem::New();
// Set up EMEarthModel
Earth->SetNumberOfLayers(5);
Earth->SetLayerConductivity((VectorXcr(5) << 0.,1.e-4,1.e-2,
1.e-4,1.e-6).finished());
Earth->SetLayerThickness((VectorXr(3) << 20.,5.,50.).finished());
// Set up transmitter
Real momtemp;
momtemp = 1;
Real freq;
freq = 391;
Trans->SetType(MAGNETICDIPOLE);
Trans->SetLocation(0,0,-1.e-3);
Trans->SetPolarisation(ZPOLARISATION);
// as a test
Trans->SetNumberOfFrequencies(1);
Trans->SetFrequency(0,freq);
Trans->SetMoment(momtemp);
// Set up receivers
Vector3r loc1;
Vector3r loc2;
Receivers->SetNumberOfReceivers(1);
loc1 << 9,0,-1.e-3;
Receivers->SetLocation(0,loc1);
// Attach to instrument
theinstrument->SetReceiverPoints(Receivers);
theinstrument->SetDipoleSource(Trans);
theinstrument->EMEarthModel(Earth);
theinstrument->SetOutputData(modelledData);
// Calculate
theinstrument->MakeCalculation();
// See what comes back...
std::cout << Receivers->GetHfield(0,0)(2) << std::endl;
// Need to convert H field to ppm
theinstrument->Delete();
modelledData->Delete();
// MULTIPLE SOUNDING MODEL USING READ-IN DATA
InstrumentFem* theinstrument2 = InstrumentFem::New();
DataFEM* modelledData2 = DataFEM::New();
// Using the UBC data reader to read in the survey params
// this will be used for the multiple sounding testing
std::string datfile;
datfile = "126.obs";
DataReaderFemUBC* Reader = DataReaderFemUBC::New();
DataFEM* inpdata = DataFEM::New();
Reader->SetDataFEM(inpdata);
try {
Reader->ReadData(datfile,1);
} catch(std::exception& e) {
exit(EXIT_FAILURE);
}
std::cout << *inpdata << std::endl;
theinstrument2->SetOutputData(modelledData2);
theinstrument2->AlignWithData(inpdata);
// Now, how do I want to pass it an earth model for each sounding?
//
inpdata->Delete();
// Need to loop over transmitters
// The relative positions of the transmitter and receiver is fixed
// For testing, do some kind of random realisation of Earth model?
// int nObs;
// int nFreqs;
// nObs = inpdata->GetnObs();
// nFreqs = inpdata->GetnFreq();
// Trans->SetType(MAGNETICDIPOLE);
// Trans->SetLocation(0,0,-1e-3);
// Vector3r loc;
// Receivers->SetNumberOfReceivers(1);
// loc << 0,0,-1e-3;
// Receivers->SetLocation(0,loc);
// Earth->SetNumberOfLayers(5); //Including the two halfspaces
// Earth->SetLayerConductivity((VectorXcr(5) << 0.,1.e-4,1.e-2,
// 1.e-4,1.e-6).finished());
// Earth->SetLayerThickness((VectorXr(3) << 20.,5.,50.).finished());
// for (int ii=0;iiSetMoment(inpdata->GetTxMom().coeff(jj));
//
// }
// }
//This is a bunch of testing stuff
//theinstrument->AlignWithData(inpdata);
//theinstrument->MakeCalculation();
//inpdata->Delete();
//theinstrument->MakeCalculation();
theinstrument2->Delete();
Reader->Delete();
Earth->Delete();
Receivers->Delete();
Trans->Delete();
// Timey-wimey stuff
Real time;
clock_t done = clock();
time = (done-launch)/CLOCKS_PER_SEC;
std::cout << " Execution time: " << time << " [CPU] seconds."
<< std::endl;
return EXIT_SUCCESS;
}