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); // determine ratios to larges eigenvalue
00071     cout << "MT Singular Values : " << svals << endl;
00072     //cout << "Relative SVD Threshold: ";
00073     //double svdthreshold = 0.0;
00074     //cin >> svdthreshold;
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 

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