MultiAnisoSurfaceWaveObjective.cpp
Go to the documentation of this file.00001 #include "MultiAnisoSurfaceWaveObjective.h"
00002 #include "FatalException.h"
00003 #include "convert.h"
00004 #include <boost/bind.hpp>
00005 #include <numeric>
00006 namespace gplib
00007 {
00008 MultiAnisoSurfaceWaveObjective::MultiAnisoSurfaceWaveObjective()
00009 {
00010 }
00011
00012 MultiAnisoSurfaceWaveObjective::~MultiAnisoSurfaceWaveObjective()
00013 {
00014 }
00015
00016 void MultiAnisoSurfaceWaveObjective::AddMeasurement(
00017 const ParkSurfaceWaveData &Measured, const double back, const double avel)
00018 {
00019 boost::shared_ptr<AnisoSurfaceWaveObjective> CurrObj(
00020 new AnisoSurfaceWaveObjective(Measured,back,avel));
00021 IndividualObjectives.push_back(CurrObj);
00022 backazimuths.push_back(back);
00023 }
00024
00025 void MultiAnisoSurfaceWaveObjective::PreParallel(const ttranscribed &member)
00026 {
00027 if (IndividualObjectives.empty())
00028 throw FatalException("In Multi1DRecObjective: No Objective functions set !");
00029 const size_t nobjs = IndividualObjectives.size();
00030 for (size_t i = 0; i < nobjs; ++i)
00031 {
00032 IndividualObjectives.at(i)->SetParallelID(GetParallelID()+stringify(i));
00033 IndividualObjectives.at(i)->PreParallel(member);
00034 }
00035 }
00036
00037 double MultiAnisoSurfaceWaveObjective::PostParallel(const ttranscribed &member)
00038 {
00039 std::vector<double> values;
00040 transform(IndividualObjectives.begin(), IndividualObjectives.end(), back_inserter(values),
00041 boost::bind( &AnisoSurfaceWaveObjective::PostParallel, _1, member));
00042 double sumsquares = inner_product(values.begin(), values.end(),
00043 values.begin(), 0.0);
00044 return sqrt(sumsquares/values.size());
00045 }
00046
00047 void MultiAnisoSurfaceWaveObjective::SafeParallel(const ttranscribed &member)
00048 {
00049 for_each(IndividualObjectives.begin(), IndividualObjectives.end(), boost::bind(
00050 &AnisoSurfaceWaveObjective::SafeParallel, _1, member));
00051 }
00052
00053 MultiAnisoSurfaceWaveObjective::MultiAnisoSurfaceWaveObjective(
00054 const MultiAnisoSurfaceWaveObjective &Old)
00055 {
00056 const size_t nobjs = Old.IndividualObjectives.size();
00057 IndividualObjectives.clear();
00058 backazimuths.clear();
00059 copy(Old.backazimuths.begin(), Old.backazimuths.end(),
00060 back_inserter(backazimuths));
00061 for (size_t i = 0; i < nobjs; ++i)
00062 {
00063 boost::shared_ptr<AnisoSurfaceWaveObjective> Obj(Old.IndividualObjectives.at(i)->clone());
00064 IndividualObjectives.push_back(Obj);
00065 }
00066 }
00067
00068 void MultiAnisoSurfaceWaveObjective::WriteData(const std::string &filename)
00069 {
00070 const size_t nobjs = IndividualObjectives.size();
00071 for (size_t i = 0; i < nobjs; ++i)
00072 {
00073 IndividualObjectives.at(i)->WriteData(filename+stringify(i));
00074 }
00075 }
00076
00077 void MultiAnisoSurfaceWaveObjective::WriteModel(const std::string &filename)
00078 {
00079 IndividualObjectives.front()->WriteModel(filename);
00080 }
00081
00082 void MultiAnisoSurfaceWaveObjective::WritePlot(const std::string &filename)
00083 {
00084 IndividualObjectives.front()->WritePlot(filename);
00085 }
00086
00087 MultiAnisoSurfaceWaveObjective& MultiAnisoSurfaceWaveObjective::operator=(const MultiAnisoSurfaceWaveObjective& source)
00088 {
00089 if (this == &source) return *this;
00090 const size_t nobjs = source.IndividualObjectives.size();
00091 IndividualObjectives.clear();
00092 backazimuths.clear();
00093 copy(source.backazimuths.begin(),source.backazimuths.end(),back_inserter(backazimuths));
00094 for (size_t i = 0; i < nobjs; ++i)
00095 {
00096 boost::shared_ptr<AnisoSurfaceWaveObjective> Obj(source.IndividualObjectives.at(i)->clone());
00097 IndividualObjectives.push_back(Obj);
00098 }
00099 return *this;
00100 }
00101 }