mtanalys.cpp

Go to the documentation of this file.
00001 #include "C1DMTObjective.h"
00002 #include "GradFunc.h"
00003 #include "convert.h"
00004 #include "C1DMTSynthData.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 "MTFitSetup.h"
00015 #include "C1dInvGaConf.h"
00016 #include "NumUtil.h"
00017 
00018 using namespace std;
00019 
00020 int main()
00021   {
00022     C1dInvGaConf Configuration;
00023     Configuration.GetData("1dinvga.conf");
00024     CMTStation MTData;
00025     string datanamebase;
00026     cout << "Data name base: ";
00027     cin >> datanamebase;
00028     MTData.GetData(datanamebase + ".mtt");
00029 
00030     C1DMTObjective MTObjective(MTData);
00031     SetupMTFitParameters(Configuration, MTObjective);
00032 
00033     string modelnamebase;
00034     cout << "Model name base: ";
00035     cin >> modelnamebase;
00036     C1DMTSynthData MTModel;
00037     MTModel.readmodel(modelnamebase + "_mt.mod");
00038 
00039     gplib::rvec MTModelVector = MTModel.GetModelVector();
00040     const size_t nmodelparms = MTModelVector.size();
00041     gplib::rvec varfactor(nmodelparms);
00042     double MTOldRMS = MTObjective.CalcPerformance(MTModelVector);
00043     cout << "RMS: " << MTOldRMS << endl;
00044     gplib::rvec OldData(MTObjective.GetSynthData());
00045     for (size_t i = 0; i < nmodelparms; ++i)
00046       {
00047         varfactor(i) = 1.0;
00048       }
00049     ModelAnalysis MTAnalyser(MTObjective);
00050     MTAnalyser.SetModel(MTModelVector);
00051     MTAnalyser.SetVariationFactor(varfactor);
00052     ofstream evals("mtevals.plot");
00053     gplib::rvec svals = MTAnalyser.GetSingularValues();
00054     gplib::rvec svalratios = svals;
00055     svalratios /= svals(0); // determine ratios to larges eigenvalue
00056     cout << "MT Singular Values : " << svals << endl;
00057     //cout << "Relative SVD Threshold: ";
00058     //double svdthreshold = 0.0;
00059     //cin >> svdthreshold;
00060 
00061     gplib::rvec modelerrors(nmodelparms);
00062     modelerrors *= 0.0;
00063     const double errorratio = 0.1;
00064     gplib::rvec parameterthresholds = MTModelVector;
00065     for (size_t i = 0; i < nmodelparms / 2; ++i)
00066       parameterthresholds(i) = pow(10, parameterthresholds(i));
00067     parameterthresholds *= errorratio;
00068     size_t eigenvindex = 0;
00069 
00070     C1DMTObjective::datafuncvector_t ErrorFunctions =
00071         MTObjective.GetErrorFunctions();
00072     const size_t nerrorfuncs = ErrorFunctions.size();
00073     const size_t ndata = MTData.GetMTData().size();
00074     gplib::rmat DataCovar(nerrorfuncs * ndata, nerrorfuncs * ndata);
00075     fill_n(DataCovar.data().begin(), DataCovar.size1() * DataCovar.size2(), 0.0);
00076     ;
00077     for (size_t e = 0; e < nerrorfuncs; ++e)
00078       {
00079         for (int i = 0; i < ndata; ++i)
00080           {
00081             DataCovar(i + e * ndata, i + e * ndata) = gplib::pow2(
00082                 ErrorFunctions.at(e)(&MTData.GetMTData().at(i)));
00083           }
00084       }
00085     ofstream mterrors("mterrors");
00086     gplib::rmat ModelCovar = MTAnalyser.GetModelCovariance(DataCovar);
00087     std::vector<double> reserr(nmodelparms / 2, 0.0), thickerr(nmodelparms / 2,
00088         0.0);
00089     const unsigned int nevals = svalratios.size();
00090     while (sum(modelerrors) < sum(parameterthresholds) && eigenvindex < nevals)
00091       {
00092         cout << "Accum Model Errors: " << sum(modelerrors) << endl;
00093         cout << "Accum Threshold Errors: " << sum(parameterthresholds) << endl;
00094         MTAnalyser.SetRelativeSVDThreshold(svalratios(eigenvindex));
00095         ModelCovar = MTAnalyser.GetModelCovariance(DataCovar);
00096         double currerr = 0;
00097         for (size_t i = 0; i < MTModel.GetThicknesses().size(); ++i)
00098           {
00099             currerr = 2.3025 * MTModel.GetResistivities().at(i) * sqrt(
00100                 ModelCovar(i, i));
00101             mterrors << "Res " << i << " : " << currerr << endl;
00102             reserr.at(i) = currerr;
00103             modelerrors(i) = currerr;
00104           }
00105         for (size_t i = MTModel.GetThicknesses().size(); i < 2
00106             * MTModel.GetThicknesses().size(); ++i)
00107           {
00108             currerr = sqrt(ModelCovar(i, i));
00109             mterrors << "Th " << i - MTModel.GetThicknesses().size() << " : "
00110                 << currerr << endl;
00111             modelerrors(i) = currerr;
00112             thickerr.at(i - MTModel.GetThicknesses().size()) = currerr;
00113           }
00114         ++eigenvindex;
00115       }
00116     cout << "Final Accum Model Errors: " << sum(modelerrors) << endl;
00117     cout << "Accum Threshold Errors: " << sum(parameterthresholds) << endl;
00118     WriteMatrixAsNetCDF("mtcovar.nc", ModelCovar);
00119     WriteMatrixAsNetCDF("mtcorr.nc", MTAnalyser.GetModelCorrelation(DataCovar));
00120     WriteMatrixAsNetCDF("mtsens.nc", MTAnalyser.GetSensitivityMatrix());
00121     WriteMatrixAsNetCDF("mtres.nc", MTAnalyser.GetModelResolution());
00122     WriteMatrixAsNetCDF("mtnull.nc", MTAnalyser.GetModelNullspace());
00123     WriteMatrixAsNetCDF("mtsinv.nc", MTAnalyser.GetSensitivityInverse());
00124     WriteMatrixAsNetCDF("senscheck.nc", prod(
00125         MTAnalyser.GetSensitivityInverse(), MTAnalyser.GetSensitivityMatrix()));
00126 
00127     MTModel.SetResistivityErrors(reserr);
00128     MTModel.SetThicknessErrors(thickerr);
00129     MTModel.writeplot("mterr.plot");
00130   }
00131 

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