namespace Lemma{
/**
\page Minimal
\ref Intro "Intro"
| \ref Compiling "Compiling"
| \ref Memory "Memory management"
| \b Minimal \b programme
| \ref EmSources "EM Sources"
\section Download Download
Lemma source code may be obtained via svn server
\code
svn co http://cgem.ath.cx/repos/MR/Lemma Lemma
\endcode
Binary versions of the library for Microsoft Windows will be available for download shortly.
To compile you will also need the Eigen3 linear algebra header library, freely available at
.
We use the scons, a make replacement for builds which is available at .
Finally a good C++ compiler is needed. We actively support gcc, intel, and
Microsoft Visual C++ 2010. Your mileage may vary with other compilers. Lemma has been sucessfully compiled on
Microsoft Windows, Mac OSX, many flavours of Linux 64 and 32 bit, and BSD's.
\section Exposing Exposing the API
You may choose to either include individual pieces of Lemma, or instead to simply
include all of Lemma using '#include Lemma'. Examples will be shown both ways but
generally speaking including all of Lemma is a fine thing to do. All of the objects
are defined within the Lemma namespace, so you may want to use that, too.
\code
#include "Lemma"
using namespace Lemma;
int main() {
// Any Lemma Code is OK
}
\endcode
\section Compiling_old
Compiling Lemma code is fairly straightforward. For example using g++
\code
g++ min.cpp -I/path/to/Lemma/include -L/path/to/Lemma/lib -llemma -lmatio -lticppd -lem1d
\endcode
\subsection Libs Whoa, what are all those libs
Compiling Lemma builds several libraries. The largest one is liblemma.so(dll). This contains all the Lemma classes.
The libmatio is responsible for reading in MATLAB files and libticcppd is an XML reader/writer/parser. The libem1d library is a FORTRAN implimentation of a dipole em solver that is used for quality control and assurance.
We use scons to build Lemma. It is easy to extend scons to compile your applications as well, taking care of all
the compiler linker details.
\section VTK
Lemma can be integrated with VTK to produce data visualizations. Using the VTK interfaces is a slightly more advanced
topic and will be handled in a later tutorial.
\section Small Small example application.
We will now spend the next few pages building a Lemma application that computes fields from a wire loop in a time domain survey.
When forward modelling geophysical data, it is natural to break up what is needed into several catagories: the transmitter, the receiver, the earth model, and the specific instrument. In fact, these are exactly the classes needed by Lemma to execute a forward model. Therefore, the first step will be to define these classes. Continuing the code from above, we add class constructors:
\code
#include "Lemma"
using namespace Lemma;
int main() {
PolygonalWireAntenna* Trans = PolygonalWireAntenna::New();
ReceiverPoints* Receivers = ReceiverPoints::New();
LayeredEarthEM *Earth = LayeredEarthEM::New();
// More Lemma code to go here
return EXIT_SUCCESS;
}
\endcode
Now that we have created objects for a transmitter, a receiver, and a layered earth model, we need to populate them with their appropriate parameters.
For the transmitter, we will define a 100 metre by 100 metre loop just above the surface of the Earth with 1 A current and one turn. We input the following after our new objects:
\code
Trans->SetNumberOfPoints(5);
Trans->SetPoint(0, Vector3r( 0, 0, -1e-3));
Trans->SetPoint(1, Vector3r( 100, 0, -1e-3));
Trans->SetPoint(2, Vector3r( 100, 100, -1e-3));
Trans->SetPoint(3, Vector3r( 0, 100, -1e-3));
Trans->SetPoint(4, Vector3r( 0, 0, -1e-3));
Trans->SetCurrent(1);
Trans->SetNumberOfTurns(1);
\endcode
For the receiver location, we'll put one receiver in the centre of the transmitter loop.
\code
Vector3r loc;
Real ox = 50.;
Real oy = 50.;
Real depth = -1.e-3;
Receivers->SetNumberOfReceivers(1);
loc << ox,oy,depth;
Receivers->SetLocation(0,loc);
\endcode
We now set our 5 layer earth model up, with conductivities in S/m. The 5 layers include the air and basement halfspace.
\code
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) << 10,5,50).finished() );
\endcode
Finally, we set up an instrument object and attach these objects to it. Since this is a time domain survey, we also define and attach the centre-gate times for a particular instrument.
\code
VectorXr maintimes;
maintimes.resize(25);
maintimes << 191.,216.,246.,286.,336.,400.,480.,584.,
714.,883.,1097.,1366.,1714.,2157.,2724.,3445.,4361.,
5535.,7032.,8858.,10724.,13151.,16196.,20047.,25012.;
maintimes = maintimes.array() /1000000;
InstrumentTem *instrument = InstrumentTem::New();
instrument->EMEarthModel(Earth);
instrument->SetTransmitLoop(Trans);
instrument->SetReceiver(Receivers);
instrument->SetTimes(maintimes);
\endcode
We are now ready to make the calculation and get our results.
\code
instrument->MakeCalculation();
// Output results to file
std::ofstream outfile1;
outfile1.open("solution.out");
for (int ii=0;iiGetMeasurements()(ii,0)<<" "<<
instrument->GetMeasurements()(ii,1)<Delete();
Trans->Delete();
Earth->Delete();
Receivers->Delete();
\endcode
Congrats! You have used Lemma to create a forward modelling program. Hopefully now you can see how easy it is to use Lemma to create powerful programs.
*/
}
//\include utdipolesource.cpp