A 9-node target. More...
#include <TargetList2D.h>
Public Member Functions | |
void | addTarget (TargetList *t) |
void | humanInfo () const |
bool | isPoissonRatioOk (const GroundParameter *from) |
double | misfit (int nDimensions, bool &ok) |
bool | setParamProfiles (Param3DGroundModel *gm, RealSpace &ps) |
TargetList * | target (int index) const |
int | targetCount () const |
TargetList2D () | |
TargetList2D (const TargetList2D &o) | |
void | writeReport (ReportWriter *report) const |
virtual const QString & | xml_tagName () const |
~TargetList2D () | |
Static Public Attributes | |
static const QString | xmlTargetList2DTag = "TargetList2D" |
Protected Member Functions | |
virtual XMLMember | xml_member (XML_MEMBER_ARGS) |
virtual void | xml_writeChildren (XML_WRITECHILDREN_ARGS) const |
Friends | |
class | DCReportBlock |
A 9-node target.
1D target are defined for 9 nodes
DinverDCCore::TargetList2D::TargetList2D | ( | const TargetList2D & | o | ) |
Description of constructor still missing
References TRACE.
: XMLClass() { TRACE; qDeleteAll(_targets); _targets.clear(); for(QVector<TargetList *>::const_iterator it=o._targets.begin(); it!=o._targets.end(); it++) { _targets.append(new TargetList(**it)); } }
void DinverDCCore::TargetList2D::addTarget | ( | TargetList * | t | ) |
void DinverDCCore::TargetList2D::humanInfo | ( | ) | const |
bool DinverDCCore::TargetList2D::isPoissonRatioOk | ( | const GroundParameter * | from | ) | [inline] |
double DinverDCCore::TargetList2D::misfit | ( | int | nDimensions, |
bool & | ok | ||
) |
nDimensions is number of free parameters. This is used only if Akaike misfit is computed.
References QGpCoreWave::Profile::collectDepths(), QGpCoreWave::Profile::depths(), DinverDCCore::ParamProfile::maxRawProfile(), DinverDCCore::ParamProfile::minRawProfile(), DinverDCCore::TargetList::position(), DinverDCCore::ParamProfile::rawProfile(), QGpCoreWave::Profile::resample(), DinverDCCore::TargetList::surfaceMisfit(), DinverDCCore::DCReportBlock::surfaceWaveModel(), TRACE, QGpCoreTools::unique(), and QGpCoreWave::Profile::values().
{ TRACE; double totalMisfit=0; double totalWeight=0; Seismic1DModel * m=0; int n=_targets.count(); for(int i=0; i<n; i++) { TargetList * tl=_targets.at(i); Profile vp, nuMin, nuMax, vs, rho, rvp, rnuMin, rnuMax, rvs, rrho; // Construction of vp, vs and rho profiles at target position interpole(tl->position(), _vp[0]->rawProfile(), _vp[1]->rawProfile(), _vp[2]->rawProfile(), vp); interpole(tl->position(), _nu[0]->minRawProfile(), _nu[1]->minRawProfile(), _nu[2]->minRawProfile(), nuMin); interpole(tl->position(), _nu[0]->maxRawProfile(), _nu[1]->maxRawProfile(), _nu[2]->maxRawProfile(), nuMax); interpole(tl->position(), _vs[0]->rawProfile(), _vs[1]->rawProfile(), _vs[2]->rawProfile(), vs); interpole(tl->position(), _rho[0]->rawProfile(), _rho[1]->rawProfile(), _rho[2]->rawProfile(), rho); // Merge profile sampling QVector<double> depths; vp.collectDepths(depths); nuMin.collectDepths(depths); nuMax.collectDepths(depths); vs.collectDepths(depths); rho.collectDepths(depths); /*QVector<double>::iterator itD; for(itD=depths.begin();itD!=depths.end();itD++) { printf("Before sort %lg\n",*itD); }*/ qSort(depths); unique(depths); /*for(itD=depths.begin();itD!=depths.end();itD++) { printf("After unique %lg\n",*itD); }*/ rvp.resample(vp, depths); rnuMin.resample(nuMin, depths); rnuMax.resample(nuMax, depths); rvs.resample(vs, depths); rrho.resample(rho, depths); m=DCReportBlock::surfaceWaveModel(rvp.depths(), rvp.values(), rvs.values(), rrho.values(), &rnuMin.values(), &rnuMax.values()); tl->surfaceMisfit(totalMisfit, totalWeight, m, nDimensions, ok); delete m; if(!ok) return 0.0; if(i==0) { _reportVp=rvp; _reportVs=rvs; _reportRho=rrho; } } if(totalWeight > 0) return totalMisfit/totalWeight; else return totalMisfit; }
bool DinverDCCore::TargetList2D::setParamProfiles | ( | Param3DGroundModel * | gm, |
RealSpace & | ps | ||
) |
References DinverCore::RealSpace::addCondition(), DinverDCCore::ParamProfile::Condition, QGpCoreTools::endl(), DinverDCCore::ParamGroundModel::find(), DinverDCCore::Param3DGroundModel::model(), DinverDCCore::Param3DGroundModel::modelCount(), DinverDCCore::ParamProfile::nLayers(), DinverDCCore::ParamGroundModel::position(), QGpCoreTools::Plane::setNormalVector(), QGpCoreTools::Plane::setReference(), QGpCoreTools::tr(), and TRACE.
{ TRACE; ASSERT(gm->modelCount()==3); for(int i=0; i<3; i++) { ParamGroundModel * m=gm->model(i); _vp[i]=m->find( "Vp" ); _vs[i]=m->find( "Vs" ); _rho[i]=m->find( "Rho" ); if(_vp[i] && _vs[i]) { _nu[i]=m->find( "Nu" ); ASSERT(_nu[i] && _nu[i]->type()==ParamProfile::Condition); _poissonCondition[i]=new PoissonCondition(_vp[i], _vs[i], _nu[i] ); ps.addCondition(_poissonCondition[i]); } _planeEngine.setReference(i, m->position()); _models.insert(m, i); } if(!_planeEngine.setNormalVector()) { return false; } // Check if number of layers is the same for all models for(int i=1; i<3; i++) { if(_vp[i]->nLayers()!=_vp[i-1]->nLayers() || _nu[i]->nLayers()!=_nu[i-1]->nLayers() || _vs[i]->nLayers()!=_vs[i-1]->nLayers() || _rho[i]->nLayers()!=_rho[i-1]->nLayers()) { App::stream() << tr("Numer of layers must be the same for all reference models") << endl; return false; } } return true; }
TargetList* DinverDCCore::TargetList2D::target | ( | int | index | ) | const [inline] |
{return _targets.at(index);}
int DinverDCCore::TargetList2D::targetCount | ( | ) | const [inline] |
{return _targets.count();}
void DinverDCCore::TargetList2D::writeReport | ( | ReportWriter * | report | ) | const |
References TRACE, and DinverDCCore::DCReportBlock::write().
{ TRACE; DCReportBlock::write(report, *_targets[0], &_reportVp, &_reportVs, &_reportRho); }
XMLMember DinverDCCore::TargetList2D::xml_member | ( | XML_MEMBER_ARGS | ) | [protected, virtual] |
Re-implement this function to offer XML restore (children and properties) support to your class.
From tag and map (with contains the attibute value) return a unique identifier under the format of a XMLMember. XMLMember is initialized with 3 types of contructors:
Map of attributes can be inspected in this way (can be achived also in xml_setProperty()):
static const QString tmp("childrenName"); XMLRestoreAttributeIterator it=map.find(tmp); if(it!=map.end()) { // found attribute "childrenName" }
If the map of attributes is not used:
Q_UNUSED(attributes); if(tag=="x1") return XMLMember(0); else if(tag=="y1") return XMLMember(1); else if(tag=="x2") return XMLMember(2); else if(tag=="y2") return XMLMember(3); else return XMLMember(XMLMember::Unknown);
Arithmetic operations + and - apply to XMLMember to avoid confusion of property id numbers between inherited objects. Offset 3 corresponds to the number of properties defined in this object.
if(tag=="anInteger") return XMLMember(0); else if(tag=="aString") return XMLMember(1); else if(tag=="aDouble") return XMLMember(2); return AbstractLine::xml_member(tag, attributes, context)+3;
For the arguments of this function use Macro XML_MEMBER_ARGS.
Reimplemented from QGpCoreTools::XMLClass.
References TRACE.
virtual const QString& DinverDCCore::TargetList2D::xml_tagName | ( | ) | const [inline, virtual] |
Implements QGpCoreTools::XMLClass.
{return xmlTargetList2DTag;}
void DinverDCCore::TargetList2D::xml_writeChildren | ( | XML_WRITECHILDREN_ARGS | ) | const [protected, virtual] |
Reimplemented from QGpCoreTools::XMLClass.
References TRACE.
{ TRACE; for(QVector<TargetList *>::const_iterator it=_targets.begin(); it!=_targets.end(); it++) { (*it)->xml_save(s, context); } }
friend class DCReportBlock [friend] |
const QString DinverDCCore::TargetList2D::xmlTargetList2DTag = "TargetList2D" [static] |