Public Member Functions | Protected Member Functions
SpacReader Class Reference

Brief description of class still missing. More...

#include <SpacReader.h>

Inheritance diagram for SpacReader:
QGpCoreTools::ArgumentStdinReader

List of all members.

Public Member Functions

bool setOptions (int &argc, char **argv)
 SpacReader ()
 ~SpacReader ()

Protected Member Functions

virtual bool parse (QTextStream &s)

Detailed Description

Brief description of class still missing.

Full description of class still missing


Constructor & Destructor Documentation

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;
}

References TRACE.

{
  TRACE;
  delete _dispersionFactory;
  delete _autocorrFactory;
}

Member Function Documentation

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;
}

The documentation for this class was generated from the following files:
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Defines