cadijoint.cpp

Go to the documentation of this file.
00001 #include "cadijoint.h"
00002 #include <iostream>
00003 #include "C1DMTObjective.h"
00004 #include "CMTStation.h"
00005 #include "gentypes.h"
00006 #include "C1DRecObjective.h"
00007 #include "SeismicDataComp.h"
00008 #include "CLevmarConf.h"
00009 #include "MTFitSetup.h"
00010 #include <boost/bind.hpp>
00011 
00012 using namespace std;
00013 using namespace gplib;
00014 
00015 CMTStation MTData, Best;
00016 SeismicDataComp RecData;
00017 CLevmarConf Configuration;
00018 C1DMTObjective MTObjective(MTData);
00019 C1DRecObjective RecObjective(RecData, Configuration.shift, Configuration.omega,
00020     Configuration.sigma, Configuration.wlevel, Configuration.slowness);
00021 
00022 void misfit(float *p, float *misfit, int *m)
00023   {
00024     const int nlayers = abs(*m) / 3;
00025     const int nparam = nlayers * 2;
00026     ttranscribed mtmember(nparam), recmember(nparam);
00027     for (int i = 0; i < nparam; ++i)
00028       {
00029         mtmember(i) = p[i];
00030       }
00031     for (int i = 0; i < nparam; ++i)
00032       recmember(i) = p[i + nlayers];
00033     *misfit = 0.0;
00034     if (Configuration.weights.at(0) > 0)
00035       {
00036         //cout << "Calculating MT misfit" << endl;
00037         *misfit += Configuration.weights.at(0) * MTObjective.CalcPerformance(
00038             mtmember);
00039       }
00040     if (Configuration.weights.at(1) > 0)
00041       {
00042         //cout << "Calculating Rec misfit" << endl;
00043         *misfit += RecObjective.CalcPerformance(recmember)
00044             * Configuration.weights.at(1);
00045       }
00046   }
00047 
00048 void init(int* nd, float* ranges)
00049   {
00050 
00051     string version = "$Id: levjoint.cpp 1131 2007-05-15 22:25:06Z max $";
00052     cout << endl << endl;
00053     cout << "Program " << version << endl;
00054     cout << " Levenberg Marquardt to jointly invert seismic and MT data "
00055         << endl;
00056     cout << " look at levmar.conf for configuration and setup " << endl;
00057     cout << " output files will be of the form " << endl;
00058     cout << " best_lev + ending " << endl;
00059 
00060     Configuration.GetData("levmar.conf");
00061     try
00062       {
00063         MTData.GetData(Configuration.mtinputdata);
00064         RecData.GetData(Configuration.recinputdata, SeismicDataComp::sac);
00065       } catch (FatalException &e)
00066       {
00067         cerr << e.what() << endl;
00068       }
00069 
00070     SetupMTFitParameters(Configuration, MTObjective);
00071 
00072     RecObjective = C1DRecObjective(RecData, Configuration.shift,
00073         Configuration.omega, Configuration.sigma, Configuration.wlevel,
00074         Configuration.slowness);
00075     RecObjective.SetPoisson(Configuration.poisson);
00076     RecObjective.SetTimeWindow(Configuration.starttime, Configuration.endtime);
00077     RecObjective.SetErrorLevel(Configuration.recerror);
00078 
00079     const int nlayers = Configuration.minres.size();
00080     const int nparams = nlayers * 3;
00081     *nd = nparams;
00082     ttranscribed mtmember(nlayers * 2), recmember(nlayers * 2);
00083     copy(Configuration.startres.begin(), Configuration.startres.end(),
00084         mtmember.begin());
00085     copy(Configuration.startthick.begin(), Configuration.startthick.end(),
00086         mtmember.begin() + nlayers);
00087     copy(Configuration.startthick.begin(), Configuration.startthick.end(),
00088         recmember.begin());
00089     copy(Configuration.startsvel.begin(), Configuration.startsvel.end(),
00090         recmember.begin() + nlayers);
00091     MTObjective.CalcPerformance(mtmember);
00092     RecObjective.CalcPerformance(recmember);
00093 
00094     for (int i = 0; i < nlayers; ++i)
00095       {
00096         ranges[2 * i] = Configuration.minres.at(i);
00097         ranges[2 * i + 1] = Configuration.maxres.at(i);
00098       }
00099     for (int i = 0; i < nlayers; ++i)
00100       {
00101         ranges[2 * i + 2 * nlayers] = Configuration.minthick.at(i);
00102         ranges[2 * i + 2 * nlayers + 1] = Configuration.maxthick.at(i);
00103       }
00104     for (int i = 0; i < nlayers; ++i)
00105       {
00106         ranges[2 * i + 4 * nlayers] = Configuration.minsvel.at(i);
00107         ranges[2 * i + 4 * nlayers + 1] = Configuration.maxsvel.at(i);
00108       }
00109     cout << "Init finished ! " << endl;
00110     ;
00111   }

Generated on Tue May 4 16:52:14 2010 for GPLIB++ by  doxygen 1.5.8