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)); // write one output file for each BAZ
00074       }
00075   }
00076 
00077 void MultiAnisoSurfaceWaveObjective::WriteModel(const std::string &filename)
00078   {
00079     IndividualObjectives.front()->WriteModel(filename); //all models are the same, so we only write the first
00080   }
00081 
00082 void MultiAnisoSurfaceWaveObjective::WritePlot(const std::string &filename)
00083   {
00084     IndividualObjectives.front()->WritePlot(filename); //all models are the same, so we only write the first
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 }

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