SeismicModelDiff.cpp
Go to the documentation of this file.00001 #include "SeismicModelDiff.h"
00002 #include <gsl/gsl_math.h>
00003 #include <iostream>
00004 #include <numeric>
00005 using namespace std;
00006
00007 namespace gplib
00008 {
00009 SeismicModelDiff::SeismicModelDiff(const ResPkModel &Seis) :
00010 Model(Seis)
00011 {
00012 }
00013
00014 SeismicModelDiff::~SeismicModelDiff()
00015 {
00016 }
00017
00018 SeismicModelDiff::SeismicModelDiff(const SeismicModelDiff &Old) :
00019 GeneralObjective(Old), Model(Old.Model)
00020 {
00021 }
00022
00023 SeismicModelDiff& SeismicModelDiff::operator=(
00024 const SeismicModelDiff& source)
00025 {
00026 if (this == &source)
00027 return *this;
00028 GeneralObjective::operator=(source);
00029 Model = source.Model;
00030 return *this;
00031 }
00032
00033
00034 void SeismicModelDiff::SafeParallel(const ttranscribed &member)
00035 {
00036 const unsigned int length = member.size() / 3;
00037 double roughness = 0.0;
00038
00039 vector<double> memberdepth, refdepth;
00040 partial_sum(member.begin() + length, member.begin() + 2 * length,
00041 back_inserter(memberdepth));
00042 partial_sum(Model.GetThickness().begin(), Model.GetThickness().end(),
00043 back_inserter(refdepth));
00044 refdepth.back() += 1000.0;
00045 vector<double> layerthick(memberdepth);
00046 copy(refdepth.begin(), refdepth.end(), back_inserter(layerthick));
00047 sort(layerthick.begin(), layerthick.end());
00048 adjacent_difference(layerthick.begin(), layerthick.end(),
00049 layerthick.begin());
00050 layerthick.erase(remove(layerthick.begin(), layerthick.end(), 0.0),
00051 layerthick.end());
00052 unsigned int refindex = 0;
00053 unsigned int memberindex = 0;
00054 unsigned int thickindex = 0;
00055 double currthick = 0.0;
00056 while (refindex < Model.GetThickness().size() && memberindex < length)
00057 {
00058 int difference = gsl_fcmp(memberdepth.at(memberindex), refdepth.at(
00059 refindex), GSL_DBL_EPSILON);
00060 currthick = layerthick.at(thickindex);
00061 roughness += gsl_pow_2((member(memberindex + 2 * length)
00062 - Model.GetSVelocity().at(refindex)) / Model.GetSVelocity().at(
00063 refindex) * currthick);
00064 switch (difference)
00065 {
00066 case 1:
00067
00068 ++refindex;
00069 break;
00070 case -1:
00071
00072 ++memberindex;
00073 break;
00074 case 0:
00075
00076 ++refindex;
00077 ++memberindex;
00078 break;
00079 }
00080 thickindex++;
00081 }
00082 SetRMS(roughness);
00083 }
00084
00085 double SeismicModelDiff::PostParallel(const ttranscribed &member)
00086 {
00087 return GetRMS();
00088 }
00089 }