00001 #include "C1DRecObjective.h"
00002 #include "miscfunc.h"
00003 #include <iostream>
00004 #include <numeric>
00005 #include <algorithm>
00006 #include <cstdio>
00007 #include <boost/bind.hpp>
00008 #include <boost/cast.hpp>
00009 #include <gsl/gsl_math.h>
00010 #include "CollapseModel.h"
00011 #include "SeisTools.h"
00012
00013 using namespace std;
00014
00015
00016 C1DRecObjective::C1DRecObjective(boost::shared_ptr<const SeismicDataComp> TheRecData,
00017 const int myshift, const double myomega, const double mysigma,
00018 const double myc, const double myslowness, const RecCalc::trfmethod method) :
00019 RecCalculator(myshift, myomega, mysigma, myc, false, method),
00020 ObservedData(TheRecData)
00021 {
00022 slowness = myslowness;
00023 poisson = sqrt(3.);
00024 errorlevel = 0.01;
00025 starttime = -1;
00026 endtime = -1;
00027 RecCalculator.SetNormalize(true);
00028 }
00029
00030 C1DRecObjective::~C1DRecObjective()
00031 {
00032 }
00033
00034 C1DRecObjective::C1DRecObjective(const C1DRecObjective &Old) :
00035 PlottableObjective(Old), RecSynthData(Old.RecSynthData),
00036 slowness(Old.slowness), Model(Old.Model),
00037 RecCalculator(Old.RecCalculator), errorlevel(Old.errorlevel),
00038 poisson(Old.poisson), starttime(Old.starttime), endtime(Old.endtime),
00039 ObservedData(Old.ObservedData)
00040 {
00041 }
00042
00043 C1DRecObjective& C1DRecObjective::operator= (const C1DRecObjective& source)
00044 {
00045 if (this == &source) return *this;
00046 PlottableObjective::operator=(source);
00047 RecSynthData = source.RecSynthData;
00048 slowness = source.slowness;
00049 Model = source.Model;
00050 RecCalculator = source.RecCalculator;
00051 poisson = source.poisson;
00052 errorlevel = source.errorlevel;
00053 starttime = source.starttime;
00054 endtime = source.endtime;
00055 ObservedData = source.ObservedData;
00056 return *this;
00057 }
00058
00059 void C1DRecObjective::PreParallel(const ttranscribed &member)
00060 {
00061 const unsigned int nfulllayers = member.size()/2;
00062
00063 Model.SetSlowness(slowness);
00064 ttranscribed thickness(nfulllayers), velocity(nfulllayers);
00065 copy(member.begin(), member.begin()+nfulllayers, thickness.begin());
00066 copy(member.begin()+nfulllayers, member.begin()+2*nfulllayers,
00067 velocity.begin());
00068 CollapseModel(thickness, velocity);
00069 const unsigned int ncolllayers = velocity.size();
00070 Model.Init(ncolllayers);
00071 copy(thickness.begin(), thickness.end(), Model.SetThickness().begin());
00072 copy(velocity.begin(), velocity.end(), Model.SetSVelocity().begin());
00073 transform(velocity.begin(), velocity.end(), Model.SetDensity().begin(), CalcDensity());
00074 transform(velocity.begin(), velocity.end(),
00075 Model.SetPVelocity().begin(), boost::bind(multiplies<double>(), _1, poisson));
00076 Model.SetDt(ObservedData->GetDt());
00077 Model.SetNpts(ObservedData->GetData().size());
00078 std::string temp(tmpnam(NULL));
00079 tempname = temp;
00080 RecCalculator.SynthPreParallel(tempname, Model, RecSynthData, true);
00081 }
00082
00083 double C1DRecObjective::PostParallel(const ttranscribed &member)
00084 {
00085 RecCalculator.SynthPostParallel(tempname, Model, RecSynthData, true);
00086 return GetRMS();
00087 }
00088
00089 void C1DRecObjective::SafeParallel(const ttranscribed &member)
00090 {
00091 RecCalculator.SynthSafeParallel(tempname, Model, RecSynthData, true);
00092
00093 size_t startpoint = 0;
00094 size_t endpoint = ObservedData->GetData().size();
00095 if (starttime > 0)
00096 {
00097 startpoint = boost::numeric_cast<size_t>((starttime-ObservedData->GetB())/ObservedData->GetDt());
00098
00099 }
00100 if (endtime > 0)
00101
00102 {
00103 endpoint = min(boost::numeric_cast<size_t>((endtime-ObservedData->GetB())/ObservedData->GetDt()),ObservedData->GetData().size());
00104 }
00105 assert(endpoint > startpoint);
00106 tmisfit LocalMisfit(endpoint-startpoint);
00107 tdata LocalData(endpoint-startpoint);
00108 double returnvalue = 0;
00109 double currvalue = 0.0;
00110 for (size_t i = startpoint; i < endpoint; ++i)
00111
00112 {
00113 currvalue = ObservedData->GetData().at(i) - RecSynthData.GetData().at(i);
00114 currvalue /= errorlevel;
00115 currvalue = gsl_pow_int(currvalue,GetFitExponent());
00116
00117 assert(gsl_finite(currvalue));
00118 LocalMisfit(i-startpoint)= fabs(currvalue);
00119 LocalData(i-startpoint)= RecSynthData.GetData().at(i);
00120 returnvalue += fabs(currvalue);
00121 }
00122 SetMisfit(LocalMisfit);
00123 SetSynthData(LocalData);
00124
00125 SetRMS(pow(returnvalue/LocalMisfit.size(),1.0/GetFitExponent()));
00126 }