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
00037 *misfit += Configuration.weights.at(0) * MTObjective.CalcPerformance(
00038 mtmember);
00039 }
00040 if (Configuration.weights.at(1) > 0)
00041 {
00042
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 }