recanalys.cpp
Go to the documentation of this file.00001 #include "C1DRecObjective.h"
00002 #include "GradFunc.h"
00003 #include "convert.h"
00004 #include "SeismicDataComp.h"
00005 #include "netcdfcpp.h"
00006 #include <iostream>
00007 #include <fstream>
00008 #include <boost/bind.hpp>
00009 #include "VecMat.h"
00010 #include "Adaptors.h"
00011 #include <algorithm>
00012 #include <string>
00013 #include "NetCDFTools.h"
00014 #include "ResPkModel.h"
00015 #include "C1dInvGaConf.h"
00016 #include "MatNorm.h"
00017 #include "NumUtil.h"
00018
00019 using namespace std;
00020
00021 int main()
00022 {
00023 SeismicDataComp RecData;
00024
00025 string datanamebase;
00026 cout << "Data name base: ";
00027 cin >> datanamebase;
00028 RecData.GetData(datanamebase + ".rec");
00029
00030 C1dInvGaConf Configuration;
00031 Configuration.GetData("1dinvga.conf");
00032
00033 C1DRecObjective RecObjective(RecData, Configuration.shift,
00034 Configuration.omega, Configuration.sigma, Configuration.cc,
00035 Configuration.slowness);
00036
00037 string modelnamebase;
00038 cout << "Model name base: ";
00039 cin >> modelnamebase;
00040 ResPkModel RecModel;
00041 RecModel.GetData(modelnamebase + "_rec.mod");
00042
00043 const size_t nmodelparms = RecModel.SVelocity.size() * 2;
00044 gplib::rvec RecModelVector(nmodelparms);
00045 for (int i = 0; i < nmodelparms / 2; ++i)
00046 {
00047 RecModelVector(i) = RecModel.Thickness.at(i);
00048 RecModelVector(i + nmodelparms / 2) = RecModel.SVelocity.at(i);
00049 }
00050
00051 gplib::rvec varfactor(nmodelparms);
00052 RecObjective.SetPoisson(Configuration.poisson);
00053 RecObjective.SetTimeWindow(Configuration.starttime, Configuration.endtime);
00054 RecObjective.SetErrorLevel(Configuration.recerror);
00055 RecObjective.SetFitExponent(Configuration.recfitexponent);
00056 double RecOldRMS = RecObjective.CalcPerformance(RecModelVector);
00057 cout << "RMS: " << RecOldRMS << endl;
00058 gplib::rvec OldData(RecObjective.GetSynthData());
00059 for (size_t i = 0; i < nmodelparms; ++i)
00060 {
00061 varfactor(i) = 1.0;
00062 }
00063
00064 ModelAnalysis RecAnalyser(RecObjective);
00065 RecAnalyser.SetModel(RecModelVector);
00066 RecAnalyser.SetVariationFactor(varfactor);
00067 ofstream evals("mtevals.plot");
00068 gplib::rvec svals = RecAnalyser.GetSingularValues();
00069 gplib::rvec svalratios = svals;
00070 svalratios /= svals(0);
00071 cout << "MT Singular Values : " << svals << endl;
00072
00073
00074
00075
00076 gplib::rvec modelerrors(nmodelparms);
00077 fill_n(modelerrors.begin(), nmodelparms, 0.0);
00078 const double errorratio = 0.1;
00079 gplib::rvec parameterthresholds = RecModelVector;
00080 for (size_t i = 0; i < nmodelparms; ++i)
00081 parameterthresholds(i) *= varfactor(i);
00082
00083 parameterthresholds *= errorratio;
00084 size_t eigenvindex = 0;
00085
00086 const size_t ndata = RecData.GetData().size();
00087 gplib::rmat DataCovar(ndata, ndata);
00088 fill_n(DataCovar.data().begin(), DataCovar.size1() * DataCovar.size2(), 0.0);
00089
00090 for (int i = 0; i < ndata; ++i)
00091 {
00092 DataCovar(i, i) = gplib::pow2(RecData.GetData().at(i)
00093 * Configuration.recerror);
00094 }
00095
00096 ofstream recerrors("recerrors");
00097 gplib::rmat ModelCovar = RecAnalyser.GetModelCovariance(DataCovar);
00098
00099 while (sum(modelerrors) < sum(parameterthresholds))
00100 {
00101 cout << "Ratio: " << svalratios(eigenvindex) << endl;
00102 RecAnalyser.SetRelativeSVDThreshold(svalratios(eigenvindex));
00103 cout << "Accum Model Errors: " << sum(modelerrors) << endl;
00104 cout << "Accum Threshold Errors: " << sum(parameterthresholds) << endl;
00105
00106 ModelCovar = RecAnalyser.GetModelCovariance(DataCovar);
00107 double currerr = 0;
00108 for (size_t i = 0; i < nmodelparms; ++i)
00109 {
00110 currerr = sqrt(ModelCovar(i, i));
00111 recerrors << i << " : " << currerr << endl;
00112 modelerrors(i) = currerr;
00113 }
00114 ++eigenvindex;
00115 }
00116 std::vector<double> thickerr, svelerr;
00117 for (int i = 0; i < nmodelparms / 2; ++i)
00118 {
00119 thickerr.push_back(modelerrors(i));
00120 svelerr.push_back(modelerrors(i + nmodelparms / 2));
00121 }
00122 RecModel.SetThickErrors(thickerr);
00123 RecModel.SetSVelErrors(svelerr);
00124 cout << "Final Accum Model Errors: " << sum(modelerrors) << endl;
00125 cout << "Accum Threshold Errors: " << sum(parameterthresholds) << endl;
00126 WriteMatrixAsNetCDF("reccovar.nc", ModelCovar);
00127 WriteMatrixAsNetCDF("reccorr.nc",
00128 RecAnalyser.GetModelCorrelation(DataCovar));
00129 WriteMatrixAsNetCDF("recsens.nc", RecAnalyser.GetSensitivityMatrix());
00130 WriteMatrixAsNetCDF("recres.nc", RecAnalyser.GetModelResolution());
00131 WriteMatrixAsNetCDF("recnull.nc", RecAnalyser.GetModelNullspace());
00132 WriteMatrixAsNetCDF("recsinv.nc", RecAnalyser.GetSensitivityInverse());
00133 RecModel.PlotVelWithErrors("recerr.plot");
00134 }
00135