Brief description of class still missing. More...
#include <SpacReader.h>
Public Member Functions | |
bool | setOptions (int &argc, char **argv) |
SpacReader () | |
~SpacReader () | |
Protected Member Functions | |
virtual bool | parse (QTextStream &s) |
Brief description of class still missing.
Full description of class still missing
Description of constructor still missing
References TRACE.
: ArgumentStdinReader() { TRACE; _nModes=1; _vertical=false; _radial=false; _transverse=false; _alpha = 0.5; _oneMode=false; _dispersionFactory=0; _autocorrFactory=0; }
bool SpacReader::parse | ( | QTextStream & | s | ) | [protected, virtual] |
Implements QGpCoreTools::ArgumentStdinReader.
References QGpCoreWave::DispersionFactory::calculate(), QGpCoreWave::AutocorrFactory::calculateHorizontal(), QGpCoreWave::AutocorrFactory::calculateVertical(), QGpCoreWave::Seismic1DModel::fromStream(), QGpCoreWave::Seismic1DModel::layerCount(), QGpCoreWave::AutocorrFactory::radial(), sOut(), QGpCoreWave::ModalStorage::toStream(), TRACE, QGpCoreWave::AutocorrFactory::transverse(), and QGpCoreWave::AutocorrFactory::vertical().
{ TRACE; QTextStream sOut(stdout); Seismic1DModel m; QString comments; if(!m.fromStream(s, &comments)) { return false; } if(m.layerCount()>0) { sOut << comments; _dispersionFactory->calculate(&m, 0); if(_vertical) { _autocorrFactory->calculateVertical(_dispersionFactory); } if(_radial || _transverse) { _autocorrFactory->calculateHorizontal(_alpha, _dispersionFactory); } for(int iRing=0; iRing<_rings.count(); iRing++) { if (_vertical) { sOut << QString("# Ring %1 (from %2 to %3), %4 Vertical autocorrelation modes\n") .arg(iRing) .arg(_rings.at(iRing).minRadius()) .arg(_rings.at(iRing).maxRadius()) .arg(_nModes); _autocorrFactory->vertical(iRing).toStream(sOut, _oneMode ? _nModes-1 : -1); } if(_radial) { sOut << QString("# Ring %1 (from %2 to %3), %4 Radial autocorrelation modes\n") .arg(iRing) .arg(_rings.at(iRing).minRadius()) .arg(_rings.at(iRing).maxRadius()) .arg(_nModes); _autocorrFactory->radial(iRing).toStream(sOut, _oneMode ? _nModes-1 : -1); } if(_transverse) { sOut << QString("# Ring %1 (from %2 to %3), %4 Transverse autocorrelation modes\n") .arg(iRing) .arg(_rings.at(iRing).minRadius()) .arg(_rings.at(iRing).maxRadius()) .arg(_nModes); _autocorrFactory->transverse(iRing).toStream(sOut, _oneMode ? _nModes-1 : -1); } } } return true; }
bool SpacReader::setOptions | ( | int & | argc, |
char ** | argv | ||
) |
References QGpCoreTools::endl(), QGpCoreTools::Function, QGpCoreWave::AutocorrFactory::init(), QGpCoreTools::InversedScale, QGpCoreTools::StringSection::isValid(), QGpCoreTools::Curve< pointType >::line(), QGpCoreTools::LinearScale, QGpCoreWave::ModalFactory::linkX(), QGpCoreTools::LogScale, QGpCoreTools::StringSection::nextField(), QGpCoreTools::Curve< pointType >::resample(), QGpCoreWave::ModalFactory::setAngularFrequency(), QGpCoreWave::AutocorrFactory::setMode(), QGpCoreWave::ModalFactory::setX(), QGpCoreTools::StringSection::toDouble(), QGpCoreTools::tr(), TRACE, and QGpCoreWave::DispersionFactory::validate().
Referenced by main().
{ TRACE; // Options SamplingOption samplingType=LogScale; int nSamples=100; double minRange=0.2; double maxRange=20.0; // Check arguments int i, j=1; for (i=1; i<argc; i++) { QByteArray arg=argv[i]; if(arg[0]=='-') { if(arg=="-vertical") { _vertical=true; } else if(arg=="-radial") { _radial=true; } else if(arg=="-transverse") { _transverse=true; } else if(arg=="-M") { CoreApplication::checkOptionArg(i, argc, argv); _nModes = atoi(argv[i]); } else if(arg=="-one-mode") { _oneMode=true; } else if(arg=="-alpha") { CoreApplication::checkOptionArg(i, argc, argv); _alpha=atof(argv[i]); } else if(arg=="-s") { CoreApplication::checkOptionArg(i, argc, argv); if(strcmp(argv[i],"period")==0) { samplingType=InversedScale; } else if(strcmp(argv[i],"frequency")==0) { samplingType=LinearScale; } else { samplingType=LogScale; } } else if(arg=="-min") { CoreApplication::checkOptionArg(i, argc, argv); minRange=atof(argv[i]); } else if(arg=="-max") { CoreApplication::checkOptionArg(i, argc, argv); maxRange=atof(argv[i]); } else if(arg=="-n") { CoreApplication::checkOptionArg(i, argc, argv); nSamples=atoi(argv[i]); if(nSamples<=0) { App::stream() << tr("gpspac: negative or null number of samples (option -n)") << endl; return false; } } else if(arg=="-r") { CoreApplication::checkOptionArg(i, argc, argv); QFile f(argv[i]); if(f.open(QIODevice::ReadOnly)) { QTextStream s(&f); QString buf; int iLine=0; while(!s.atEnd()) { buf=s.readLine(); iLine++; if(!buf.isEmpty() && buf[0]!='\n' && buf[0]!='#') { StringSection fields(buf); StringSection field; const QChar * p=0; double r1,r2; field=fields.nextField(p); if(!field.isValid()) { App::stream() << tr("gpspac: error reading minimum radius at line %1 in file %1").arg(iLine).arg(argv[i]) << endl; return false; } r1=field.toDouble(); field=fields.nextField(p); if(!field.isValid()) { App::stream() << tr("gpspac: error reading maximum radius at line %1 in file %1").arg(iLine).arg(argv[i]) << endl; return false; } r2=field.toDouble(); _rings.append(AutocorrRing( r1, r2) ); } } } else { App::stream() << tr("gpspac: cannot open ring file %1").arg(argv[i]) << endl; return false; } } else if(arg=="-rmin") { CoreApplication::checkOptionArg(i, argc, argv); double r=atof(argv[i]); _rings.append(AutocorrRing( r, r) ); } else if(arg=="-rmax") { CoreApplication::checkOptionArg(i, argc, argv); double r=atof(argv[i]); if(_rings.isEmpty()) { _rings.append(AutocorrRing( r, r) ); } else { _rings.last().setRadii(_rings.last().minRadius(), r); } } else { App::stream() << tr("gpspac: bad option %1, see -help").arg(argv[i]) << endl; return false; } } else { argv[j++]=argv[i]; } } if(j < argc) { argv[j]=0; argc=j; } // Check that at least a component has been choosen if(!_vertical && !_radial && !_transverse) { _vertical=true; } // Control rings if(_rings.isEmpty()) { App::stream() << tr("gpspac: missing ring definition, see -help") << endl; return false; } // Compute common sampling scale ModalCurve c; c.line(FactoryPoint(minRange, 0), FactoryPoint(maxRange, 0)); c.resample(nSamples, minRange, maxRange, samplingType | Function); // Init autocorr factory _autocorrFactory=new AutocorrFactory(&_rings); _autocorrFactory->setX(c); _autocorrFactory->linkX(c); if (_vertical>0) { for (int i=_rings.count()-1; i>=0; i--) { _autocorrFactory->setMode(Mode(Mode::Vertical, i, _nModes-1)); } } if (_radial || _transverse) { for (int i=_rings.count()-1; i>=0; i--) { _autocorrFactory->setMode(Mode(Mode::Radial, i, _nModes-1)); _autocorrFactory->setMode(Mode(Mode::Transverse, i, _nModes-1)); } } _dispersionFactory=new DispersionFactory; _dispersionFactory->setX( *_autocorrFactory); _dispersionFactory->validate(0, _autocorrFactory); _dispersionFactory->setAngularFrequency(); _autocorrFactory->setAngularFrequency(); _autocorrFactory->init(); return true; }