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         //mterrors << sqrt(2.3025 * pow(10,MTModel.GetResistivities().at(i)) * ModelCovar(i,i)) << endl;
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   }

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