Brief description of class still missing. More...
#include <AutocorrFactory.h>
Public Member Functions | |
| AutocorrFactory (const QVector< AutocorrRing > *rings) | |
| void | calculate (DispersionFactory *disp) |
| void | calculate (double alphaR, DispersionFactory *disp) |
| void | calculateHorizontal (double alphaR, DispersionFactory *disp) |
| void | calculateHorizontal (int iOmega, double alphaR, DispersionFactory *disp) |
| void | calculateVertical (DispersionFactory *disp) |
| int | horizontalModeCount () const |
| void | init () |
| bool | isRadial () const |
| bool | isTransverse () const |
| bool | isVertical () const |
| virtual const RealValue * | mode (const Mode &m) const |
| ModalStorage & | radial (int ringIndex) const |
| double | radialAutocorr (double omega, double r1, double r2, double alpha, double cr, double cl) |
| int | ringCount () const |
| virtual void | setMode (const Mode &m) |
| virtual ModalStorage * | storage (int storageIndex) const |
| virtual int | storageCount () const |
| ModalStorage & | transverse (int ringIndex) const |
| double | transverseAutocorr (double omega, double r1, double r2, double alpha, double cr, double cl) |
| ModalStorage & | vertical (int ringIndex) const |
| int | verticalModeCount () const |
| virtual void | writeReportHeader (QDataStream &s) const |
| ~AutocorrFactory () | |
Protected Member Functions | |
| ModalStorage ** | newHorizontalStorage () |
| virtual ModalStorage * | newStorage (int nModes) |
| void | upgrade (ModalStorage **&s, int ringIndex, int requestedMode) |
Brief description of class still missing.
Full description of class still missing
| QGpCoreWave::AutocorrFactory::AutocorrFactory | ( | const QVector< AutocorrRing > * | rings | ) |
Description of destructor still missing
References TRACE.
{
TRACE;
int nRings=_rings->count();
for(int i=0;i<nRings;i++) {
if(_vertical) delete _vertical[i];
if(_radial) delete _radial[i];
if(_transverse) delete _transverse[i];
/*if(_jRR) delete _jRR[i];
if(_jLR) delete _jLR[i];
if(_jRT) delete _jRT[i];
if(_jLT) delete _jLT[i];*/
}
delete [] _vertical;
delete [] _radial;
delete [] _transverse;
/*delete [] _jRR;
delete [] _jLR;
delete [] _jRT;
delete [] _jLT;
if(_alpha) {
for(int i=0; i<_nHorizontalModes; i++) {
delete [] _alpha[i];
}
delete [] _alpha;
}*/
}
| void QGpCoreWave::AutocorrFactory::calculate | ( | DispersionFactory * | disp | ) |
References calculateVertical(), isVertical(), and TRACE.
Referenced by DinverDCCore::TargetList::surfaceMisfit().
{
TRACE;
if(isVertical()) calculateVertical(disp);
/* To be implemented correctly
if(isRadial() || isTransverse()) {
Dispersion& dispRayleigh=*disp->phaseRayleigh();
Dispersion& dispLove=*disp->phaseLove();
int nr=_rings->count();
int nx=_x.count();
ASSERT(_nHorizontalModes <= dispRayleigh.modeCount());
ASSERT(_nHorizontalModes <= dispLove.modeCount());
AutocorrEngine eng(x());
for(int iMode=0;iMode < _nHorizontalModes;iMode++ ) {
autocorr.setDispersion(dispRayleigh.mode(iMode), dispLove.mode(iMode) );
for(int iRing=0;iRing < nr; iRing++ ) {
if(_radial[iRing] && _transverse[iRing]) {
autocorr.setRing(_rings->at(iRing), radial(iRing).mode(iMode), transverse(iRing).mode(iMode),
_jRR[iRing]->mode(iMode), _jLR[iRing]->mode(iMode), _jRT[iRing]->mode(iMode), _jLT[iRing]->mode(iMode));
if(autocorr.isThinRing()) {
for(int j=0;j < nx;j++ ) autocorr.horizontalThinRing(j);
} else {
for(int j=0;j < nx;j++ ) autocorr.horizontalThickRing(j);
}
}
}
}
}*/
}
| void QGpCoreWave::AutocorrFactory::calculate | ( | double | alphaR, |
| DispersionFactory * | disp | ||
| ) |
References calculateHorizontal(), calculateVertical(), isRadial(), isTransverse(), isVertical(), and TRACE.
{
TRACE;
if(isVertical()) calculateVertical(disp);
if(isRadial() || isTransverse()) calculateHorizontal(alphaR, disp);
}
| void QGpCoreWave::AutocorrFactory::calculateHorizontal | ( | double | alphaR, |
| DispersionFactory * | disp | ||
| ) |
References QGpCoreWave::ModalFactory::_x, QGpCoreWave::ModalStorage::mode(), QGpCoreWave::ModalStorage::modeCount(), QGpCoreWave::DispersionFactory::phaseLove(), QGpCoreWave::DispersionFactory::phaseRayleigh(), radial(), QGpCoreTools::Value< numberType >::setValid(), TRACE, transverse(), and QGpCoreWave::ModalFactory::x().
Referenced by calculate(), SpacReader::parse(), and Spac3CForward::setModel().
{
TRACE;
double alphaL=1.0 - alphaR;
Dispersion& dispRayleigh=*disp->phaseRayleigh();
Dispersion& dispLove=*disp->phaseLove();
int nr=_rings->count();
int nx=_x.count();
ASSERT(_nHorizontalModes <= dispRayleigh.modeCount());
ASSERT(_nHorizontalModes <= dispLove.modeCount());
AutocorrEngine eng;
for(int iMode=0;iMode < _nHorizontalModes;iMode++ ) {
RealValue * dispR=dispRayleigh.mode(iMode);
RealValue * dispL=dispLove.mode(iMode);
for(int iRing=0;iRing < nr; iRing++ ) {
if(_radial[iRing] && _transverse[iRing]) {
eng.setHorizontalRing(_rings->at(iRing) );
RealValue * autocorrR=radial(iRing).mode(iMode);
RealValue * autocorrT=transverse(iRing).mode(iMode);
if(eng.isThinRing()) {
for(int ix=0; ix < nx; ix++ ) {
if(eng.initHorizontalThinRing(x()->at(ix), dispR[ix], dispL[ix] )) {
autocorrR[ix]=eng.radial(alphaR, alphaL);
autocorrT[ix]=eng.transverse(alphaR, alphaL);
} else {
autocorrR[ix].setValid(false);
autocorrT[ix].setValid(false);
}
}
} else {
for(int ix=0; ix < nx; ix++ ) {
if(eng.initHorizontalThickRing(x()->at(ix), dispR[ix], dispL[ix] )) {
autocorrR[ix]=eng.radial(alphaR, alphaL);
autocorrT[ix]=eng.transverse(alphaR, alphaL);
} else {
autocorrR[ix].setValid(false);
autocorrT[ix].setValid(false);
}
}
}
}
}
}
}
| void QGpCoreWave::AutocorrFactory::calculateHorizontal | ( | int | iOmega, |
| double | alphaR, | ||
| DispersionFactory * | disp | ||
| ) |
Calculation radial and transverse autocorrelations for the iOmega th frequency and for fundamental mode
References QGpCoreWave::ModalStorage::mode(), QGpCoreWave::ModalStorage::modeCount(), QGpCoreWave::DispersionFactory::phaseLove(), QGpCoreWave::DispersionFactory::phaseRayleigh(), radial(), QGpCoreTools::Value< numberType >::setValid(), TRACE, transverse(), and QGpCoreWave::ModalFactory::x().
{
TRACE;
double alphaL=1.0 - alphaR;
Dispersion& dispRayleigh=*disp->phaseRayleigh();
Dispersion& dispLove=*disp->phaseLove();
int nr=_rings->count();
ASSERT(_nHorizontalModes <= dispRayleigh.modeCount());
ASSERT(_nHorizontalModes <= dispLove.modeCount());
AutocorrEngine eng;
RealValue * dispR=dispRayleigh.mode(0);
RealValue * dispL=dispLove.mode(0);
for(int iRing=0;iRing < nr; iRing++ ) {
if(_radial[iRing] && _transverse[iRing]) {
eng.setHorizontalRing(_rings->at(iRing) );
RealValue * autocorrR=radial(iRing).mode(0);
RealValue * autocorrT=transverse(iRing).mode(0);
if(eng.isThinRing()) {
if(eng.initHorizontalThinRing(x()->at(iOmega), dispR[iOmega], dispL[iOmega] )) {
autocorrR[iOmega]=eng.radial(alphaR, alphaL);
autocorrT[iOmega]=eng.transverse(alphaR, alphaL);
} else {
autocorrR[iOmega].setValid(false);
autocorrT[iOmega].setValid(false);
}
} else {
if(eng.initHorizontalThickRing(x()->at(iOmega), dispR[iOmega], dispL[iOmega] )) {
autocorrR[iOmega]=eng.radial(alphaR, alphaL);
autocorrT[iOmega]=eng.transverse(alphaR, alphaL);
} else {
autocorrR[iOmega].setValid(false);
autocorrT[iOmega].setValid(false);
}
}
}
}
}
| void QGpCoreWave::AutocorrFactory::calculateVertical | ( | DispersionFactory * | disp | ) |
Calculate the autocorrelation curves from a dispersion curve for all possible modes Min(nModes(),disp.nModes())
References QGpCoreWave::ModalFactory::_x, QGpCoreWave::ModalStorage::mode(), QGpCoreWave::ModalStorage::modeCount(), QGpCoreWave::DispersionFactory::phaseRayleigh(), TRACE, vertical(), and QGpCoreWave::ModalFactory::x().
Referenced by calculate(), SpacReader::parse(), and Spac3CForward::setModel().
{
TRACE;
Dispersion& dispRayleigh=*disp->phaseRayleigh();
int nr=_rings->count();
int nx=_x.count();
ASSERT(_nVerticalModes <= dispRayleigh.modeCount());
AutocorrEngine eng;
for(int iMode=0;iMode < _nVerticalModes;iMode++ ) {
RealValue * dispR=dispRayleigh.mode(iMode);
for(int iRing=0;iRing < nr; iRing++ ) {
if(_vertical[iRing] ) {
eng.setVerticalRing(_rings->at(iRing) );
RealValue * autocorrV=vertical(iRing).mode(iMode);
if(eng.isThinRing()) {
for(int ix=0; ix < nx; ix++ )
autocorrV[ix]=eng.verticalThinRing(x()->at(ix), dispR[ix] );
} else {
for(int ix=0; ix < nx; ix++ )
autocorrV[ix]=eng.verticalThickRing(x()->at(ix), dispR[ix] );
}
}
}
}
}
| int QGpCoreWave::AutocorrFactory::horizontalModeCount | ( | ) | const |
References TRACE.
Referenced by init(), and QGpCoreWave::DispersionFactory::validate().
{
TRACE;
int nm=maxModeCount(_radial);
int nTransverse=maxModeCount(_transverse);
if(nTransverse < nm) nm=nTransverse;
return nm;
}
| void QGpCoreWave::AutocorrFactory::init | ( | ) |
References horizontalModeCount(), isRadial(), isTransverse(), isVertical(), TRACE, and verticalModeCount().
Referenced by Spac3CForward::setCurves(), SpacReader::setOptions(), and DinverDCCore::TargetList::validateTargets().
{
TRACE;
if(isRadial() || isTransverse()) {
//int nx=_x.count();
_nHorizontalModes=horizontalModeCount();
setInvalid(_radial);
setInvalid(_transverse);
//_jRR=newHorizontalStorage();
//_jLR=newHorizontalStorage();
//_jRT=newHorizontalStorage();
//_jLT=newHorizontalStorage();
/*_alpha=new RealStatisticalValue *[_nHorizontalModes];
for(int i=0; i<_nHorizontalModes; i++) {
RealStatisticalValue * s=new RealStatisticalValue[nx];
for(int j=0; j<nx; j++) {
s[j].setValid(false);
}
_alpha[i]=s;
}*/
}
if(isVertical()) {
_nVerticalModes=verticalModeCount();
setInvalid(_vertical);
}
}
| bool QGpCoreWave::AutocorrFactory::isRadial | ( | ) | const [inline] |
Referenced by calculate(), and init().
{return _radial;}
| bool QGpCoreWave::AutocorrFactory::isTransverse | ( | ) | const [inline] |
Referenced by calculate(), and init().
{return _transverse;}
| bool QGpCoreWave::AutocorrFactory::isVertical | ( | ) | const [inline] |
Referenced by calculate(), and init().
{return _vertical;}
| const RealValue * QGpCoreWave::AutocorrFactory::mode | ( | const Mode & | m | ) | const [virtual] |
Implements QGpCoreWave::ModalFactory.
References QGpCoreWave::Mode::index(), QGpCoreWave::ModalStorage::mode(), QGpCoreWave::Mode::polarisation(), QGpCoreWave::Mode::Radial, QGpCoreWave::Mode::ringIndex(), and QGpCoreWave::Mode::Transverse.
Referenced by Spac3CForward::misfit().
{
switch (m.polarisation()) {
case Mode::Radial:
return _radial ? _radial[m.ringIndex()]->mode(m.index()) : 0;
case Mode::Transverse:
return _transverse ? _transverse[m.ringIndex()]->mode(m.index()) : 0;
default:
return _vertical ? _vertical[m.ringIndex()]->mode(m.index()) : 0;
}
}
| ModalStorage ** QGpCoreWave::AutocorrFactory::newHorizontalStorage | ( | ) | [protected] |
References newStorage(), and TRACE.
{
TRACE;
int nRings=_rings->count();
ModalStorage ** s=new ModalStorage * [nRings];
for(int i=0;i<nRings;i++) {
if(_radial[i] && _transverse[i] ) {
s[i]=newStorage(_nHorizontalModes);
} else {
s[i]=0;
}
}
return s;
}
| virtual ModalStorage* QGpCoreWave::AutocorrFactory::newStorage | ( | int | nModes | ) | [inline, protected, virtual] |
Implements QGpCoreWave::ModalFactory.
Referenced by newHorizontalStorage().
{return new ModalStorage (nModes, x());}
| ModalStorage& QGpCoreWave::AutocorrFactory::radial | ( | int | ringIndex | ) | const [inline] |
Referenced by calculateHorizontal(), SpacReader::parse(), and Spac3CForward::radial().
{return *_radial[ringIndex];}
| double QGpCoreWave::AutocorrFactory::radialAutocorr | ( | double | omega, |
| double | r1, | ||
| double | r2, | ||
| double | alpha, | ||
| double | cr, | ||
| double | cl | ||
| ) |
Unoptimized litteral impletation, for testing only
References TRACE.
{
TRACE;
//printf("%lf: %lf %lf %lf %lf %lf\n",omega, r1, r2, alpha, cr,cl);
double omegaR1=omega*r1/cr;
double omegaR2=omega*r2/cr;
double omegaL1=omega*r1/cl;
double omegaL2=omega*r2/cl;
return 4/(r2*r2-r1*r1)*(alpha*cr/omega*(cr/omega*(j0(omegaR2)-j0(omegaR1))+(r2*j1(omegaR2)-r1*j1(omegaR1)))-(1-alpha)*cl*cl/(omega*omega)*(j0(omegaL2)-j0(omegaL1)));
}
| int QGpCoreWave::AutocorrFactory::ringCount | ( | ) | const [inline] |
{return _rings->count();}
| void QGpCoreWave::AutocorrFactory::setMode | ( | const Mode & | m | ) | [virtual] |
Implements QGpCoreWave::ModalFactory.
References QGpCoreWave::Mode::index(), QGpCoreWave::Mode::polarisation(), QGpCoreWave::Mode::Radial, QGpCoreWave::Mode::ringIndex(), TRACE, QGpCoreWave::Mode::Transverse, and upgrade().
Referenced by SpacReader::setOptions().
{
TRACE;
switch (m.polarisation()) {
case Mode::Radial:
upgrade(_radial, m.ringIndex(), m.index()); break;
case Mode::Transverse:
upgrade(_transverse, m.ringIndex(), m.index()); break;
default:
upgrade(_vertical, m.ringIndex(), m.index()); break;
}
}
| ModalStorage * QGpCoreWave::AutocorrFactory::storage | ( | int | storageIndex | ) | const [inline, virtual] |
Implements QGpCoreWave::ModalFactory.
References TRACE.
{
TRACE;
int iRing=storageIndex/3;
int iComponent=storageIndex-iRing*3;
switch (iComponent) {
case 1:
if(_radial) return _radial[iRing]; else return 0;
case 2:
if(_transverse) return _transverse[iRing]; else return 0;
default:
if(_vertical) return _vertical[iRing]; else return 0;
}
}
| virtual int QGpCoreWave::AutocorrFactory::storageCount | ( | ) | const [inline, virtual] |
Implements QGpCoreWave::ModalFactory.
{return _rings->count()*3;}
| ModalStorage& QGpCoreWave::AutocorrFactory::transverse | ( | int | ringIndex | ) | const [inline] |
Referenced by calculateHorizontal(), SpacReader::parse(), and Spac3CForward::transverse().
{return *_transverse[ringIndex];}
| double QGpCoreWave::AutocorrFactory::transverseAutocorr | ( | double | omega, |
| double | r1, | ||
| double | r2, | ||
| double | alpha, | ||
| double | cr, | ||
| double | cl | ||
| ) |
Unoptimized litteral impletation, for testing only
References TRACE.
{
TRACE;
double omegaR1=omega*r1/cr;
double omegaR2=omega*r2/cr;
double omegaL1=omega*r1/cl;
double omegaL2=omega*r2/cl;
return 4/(r2*r2-r1*r1)*(-alpha*cr*cr/(omega*omega)*(j0(omegaR2)-j0(omegaR1))+(1-alpha)*cl/omega*(cl/omega*(j0(omegaL2)-j0(omegaL1))+(r2*j1(omegaL2)-r1*j1(omegaL1))));
}
| void QGpCoreWave::AutocorrFactory::upgrade | ( | ModalStorage **& | s, |
| int | ringIndex, | ||
| int | requestedMode | ||
| ) | [protected] |
| ModalStorage& QGpCoreWave::AutocorrFactory::vertical | ( | int | ringIndex | ) | const [inline] |
Referenced by calculateVertical(), Spac3CForward::omega(), SpacReader::parse(), and Spac3CForward::vertical().
{return *_vertical[ringIndex];}
| int QGpCoreWave::AutocorrFactory::verticalModeCount | ( | ) | const [inline] |
Referenced by init(), and QGpCoreWave::DispersionFactory::validate().
{return maxModeCount(_vertical);}
| void QGpCoreWave::AutocorrFactory::writeReportHeader | ( | QDataStream & | s | ) | const [inline, virtual] |