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     //! Calculate the roughness of the model given by the parameter member
00034     void SeismicModelDiff::SafeParallel(const ttranscribed &member)
00035       {
00036         const unsigned int length = member.size() / 3; //we have 3 parameters in the model, so size/3 layers
00037         double roughness = 0.0; // init returnvalue
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; // the last layer is a halfspace
00045         vector<double> layerthick(memberdepth); //vector to contain the depths to interfaces in both models, contruct from inversion model
00046         copy(refdepth.begin(), refdepth.end(), back_inserter(layerthick)); // and insert reference model interfaces at back
00047         sort(layerthick.begin(), layerthick.end()); //then put them in right order
00048         adjacent_difference(layerthick.begin(), layerthick.end(),
00049             layerthick.begin());
00050         layerthick.erase(remove(layerthick.begin(), layerthick.end(), 0.0),
00051             layerthick.end()); //remove layers of 0 thickness
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: // memberdepth bigger
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   }

Generated on Tue Nov 3 13:24:14 2009 for GPLIB++ by  doxygen 1.5.8