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);
00056 cout << "MT Singular Values : " << svals << endl;
00057
00058
00059
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