mtcovar.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 using namespace std;
00017
00018 int main()
00019 {
00020 C1dInvGaConf Configuration;
00021 Configuration.GetData("1dinvga.conf");
00022 CMTStation MTData;
00023 string datanamebase;
00024 cout << "Data name base: ";
00025 cin >> datanamebase;
00026 MTData.GetData(datanamebase + ".mtt");
00027
00028 C1DMTObjective MTObjective(MTData);
00029 SetupFitParameters(Configuration, MTObjective);
00030
00031 string modelnamebase;
00032 cout << "Model name base: ";
00033 cin >> modelnamebase;
00034 C1DMTSynthData MTModel;
00035 MTModel.readmodel(modelnamebase + "_mt.mod");
00036
00037 gplib::rvec MTModelVector(2 * MTModel.GetThicknesses().size());
00038 for (int i = 0; i < MTModel.GetThicknesses().size(); ++i)
00039 {
00040 MTModelVector(i) = log10(MTModel.GetResistivities().at(i));
00041 MTModelVector(i + MTModel.GetThicknesses().size())
00042 = MTModel.GetThicknesses().at(i);
00043 }
00044
00045 double MTOldRMS = MTObjective.CalcPerformance(MTModelVector);
00046 cout << "RMS: " << MTOldRMS << endl;
00047 gplib::rvec OldData(MTObjective.GetSynthData());
00048
00049 ModelAnalysis MTAnalyser(MTObjective);
00050 MTAnalyser.SetModel(MTModelVector);
00051 ofstream evals("mtevals.plot");
00052 for (int i = 0; i < MTAnalyser.GetSingularValues().size(); ++i)
00053 evals << i << " " << MTAnalyser.GetSingularValues()(i) << endl;
00054 cout << "MT Singular Values : " << MTAnalyser.GetSingularValues() << endl;
00055 cout << "Relative SVD Threshold: ";
00056 double svdthreshold = 0.0;
00057 cin >> svdthreshold;
00058
00059 MTAnalyser.SetRelativeSVDThreshold(svdthreshold);
00060
00061 gplib::rmat DataCovar(2 * MTData.GetMTData().size(), 2
00062 * MTData.GetMTData().size());
00063 fill_n(DataCovar.data().begin(), DataCovar.size1() * DataCovar.size2(), 0.0);
00064 const size_t length = MTData.GetMTData().size();
00065 for (int i = 0; i < length; ++i)
00066 {
00067 DataCovar(i, i) = MTData.GetMTData().at(i).GetdBerd()
00068 * MTData.GetMTData().at(i).GetdBerd();
00069 DataCovar(i + length, i + length) = MTData.GetMTData().at(i).GetdBerd()
00070 * MTData.GetMTData().at(i).GetdBerd();
00071 }
00072 gplib::rmat ModelCovar = MTAnalyser.GetModelCovariance(DataCovar);
00073 WriteMatrixAsNetCDF("mtcovar.nc", ModelCovar);
00074 WriteMatrixAsNetCDF("mtsens.nc", MTAnalyser.GetSensitivityMatrix());
00075 ofstream mterrors("mterrors");
00076 for (int i = 0; i < MTModel.GetThicknesses().size(); ++i)
00077 {
00078
00079 mterrors << sqrt(ModelCovar(i, i)) << endl;
00080 }
00081 for (int i = MTModel.GetThicknesses().size(); i < 2
00082 * MTModel.GetThicknesses().size(); ++i)
00083 mterrors << sqrt(ModelCovar(i, i)) << endl;
00084
00085 }