Public Member Functions | Protected Member Functions
DispersionReader Class Reference

Brief description of class still missing. More...

#include <DispersionReader.h>

Inheritance diagram for DispersionReader:
QGpCoreTools::ArgumentStdinReader

List of all members.

Public Member Functions

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

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 QGpCoreTools::LogScale, and TRACE.

    : ArgumentStdinReader()
{
  TRACE;
  _nRayleigh=1;
  _nLove=0;
  _groupSlowness=false;
  _samplingType=LogScale;
  _nSamples=100;
  _minRange=0.2;
  _maxRange=20.0;
  _vNSamples=100;
  _vMinRange=100.0;
  _vMaxRange=3000.0;
  _mode=CurveMode;
  _oneMode=false;
  _force=false;
  _deltaK=false;
}
{

}

Member Function Documentation

bool DispersionReader::parse ( QTextStream &  s) [protected, virtual]

Implements QGpCoreTools::ArgumentStdinReader.

References QGpCoreWave::Dispersion::calculate(), QGpCoreWave::Dispersion::deltaK(), QGpCoreWave::Seismic1DModel::fromStream(), QGpCoreTools::IrregularGrid2D::init(), QGpCoreWave::Seismic1DModel::layerCount(), QGpCoreWave::Dispersion::setGroupSlowness(), QGpCoreTools::IrregularGrid2D::setLinear(), QGpCoreTools::IrregularGrid2D::setLog(), QGpCoreWave::Love::setOmega(), QGpCoreWave::RayleighTemplate< RealType >::setOmega(), QGpCoreTools::IrregularGrid2D::setValue(), sOut(), QGpCoreWave::ModalStorage::toStream(), TRACE, QGpCoreTools::IrregularGrid2D::x(), QGpCoreTools::XAxis, QGpCoreWave::Love::y(), QGpCoreWave::RayleighTemplate< RealType >::y(), QGpCoreTools::IrregularGrid2D::y(), and QGpCoreTools::YAxis.

{
  TRACE;
  QTextStream sOut(stdout);
  Seismic1DModel m;
  QString comments;
  if(!m.fromStream(s, &comments)) {
    return false;
  }
  if(m.layerCount()>0) {
    switch(_mode) {
    case GridMode: {
        IrregularGrid2D grid;
        grid.init(_nSamples, _vNSamples, 0.0);
        grid.setLinear(YAxis, 1.0/_vMaxRange, 1.0/_vMinRange);
        grid.setLog(XAxis, _minRange, _maxRange);
        if(_nLove>_nRayleigh) {
          Love love(&m);
          for(int ix=0; ix<_nSamples; ix++) {
            double f=grid.x(ix);
            love.setOmega(2.0*M_PI*f);
            double factor=1.0/(f*f);
            for(int iy=0; iy<_vNSamples; iy++) {
              grid.setValue(ix, iy, fabs(love.y(grid.y(iy))*factor));
            }
          }
        } else {
          Rayleigh rayleigh(&m);
          for(int ix=0; ix<_nSamples; ix++) {
            double f=grid.x(ix);
            rayleigh.setOmega(2.0*M_PI*f);
            double factor=1.0/(f*f);
            for(int iy=0; iy<_vNSamples; iy++) {
              grid.setValue(ix, iy, fabs(rayleigh.y(grid.y(iy))*factor));
            }
          }
        }
        sOut << comments;
        sOut << grid;
      }
      break;
    case CurveMode:
      if(_nRayleigh>0) {
        Rayleigh rayleigh(&m);
        QTime t;
        t.start();
        Dispersion dispersion (_nRayleigh, &_x);
        if(dispersion.calculate(&rayleigh, 0)) {
          if(_groupSlowness) {
            dispersion.setGroupSlowness();
          }
          int dt=t.elapsed();
          sOut << comments;
          sOut << QString("# %1 Rayleigh dispersion mode(s)\n").arg(_nRayleigh);
          sOut << QString("# CPU Time=%1 ms\n").arg(dt);
          if(_deltaK) {
            ModalStorage * dk=dispersion.deltaK();
            dk->toStream(sOut, _oneMode ? _nRayleigh-2 : -1);
            delete dk;
          } else {
            dispersion.toStream(sOut, _oneMode ? _nRayleigh-1 : -1);
          }
        } else if(_force) {
          int dt=t.elapsed();
          sOut << comments;
          sOut << QString("# %1 Rayleigh dispersion mode(s)\n").arg(_nRayleigh);
          sOut << QString("# CPU Time=%1 ms\n").arg(dt);
          sOut << QString("# Failed: cannot compute dispersion curves\n");
        } else {
          return false;
        }
      }
      if(_nLove>0) {
        Love love(&m);
        QTime t;
        t.start();
        Dispersion dispersion (_nLove, &_x);
        if(dispersion.calculate(&love)) {
          if(_groupSlowness) {
            dispersion.setGroupSlowness();
          }
          int dt=t.elapsed();
          sOut << comments;
          sOut << QString("# %1 Love dispersion mode(s)\n").arg(_nLove);
          sOut << QString("# CPU Time=%1 ms\n").arg(dt);
          if(_deltaK) {
            ModalStorage * dk=dispersion.deltaK();
            dk->toStream(sOut, _oneMode ? _nLove-2 : -1);
            delete dk;
          } else {
            dispersion.toStream(sOut, _oneMode ? _nLove-1 : -1);
          }
        } else if(_force) {
          int dt=t.elapsed();
          sOut << comments;
          sOut << QString("# %1 Love dispersion mode(s)\n").arg(_nLove);
          sOut << QString("# CPU Time=%1 ms\n").arg(dt);
          sOut << QString("# Failed: cannot compute dispersion curves\n");
        } else {
          return false;
        }
      }
      break;
    }
  }
  return true;
}
bool DispersionReader::setOptions ( int &  argc,
char **  argv 
)

References QGpCoreTools::endl(), QGpCoreTools::Function, QGpCoreTools::InversedScale, QGpCoreTools::Curve< pointType >::line(), QGpCoreTools::LinearScale, QGpCoreTools::LogScale, QGpCoreTools::Curve< pointType >::resample(), QGpCoreTools::tr(), TRACE, QGpCoreTools::Curve< pointType >::xMultiply(), and QGpCoreTools::Curve< pointType >::xVector().

Referenced by main().

{
  TRACE;
  // Check arguments
  int i, j=1;
  for(i=1; i<argc; i++) {
    QByteArray arg=argv[i];
    if(arg[0]=='-') {
      if(arg=="-grid") {
        CoreApplication::checkOptionArg(i, argc, argv);
        if(argv[i][0]=='R') {
          _nLove=0;
          _nRayleigh=1;
        } else {
          _nLove=1;
          _nRayleigh=0;
        }
        _mode=GridMode;
      } else if(arg=="-vmin") {
        CoreApplication::checkOptionArg(i, argc, argv);
        _vMinRange=atof(argv[i]);
        if(_vMinRange<=0) {
          App::stream() << tr("gpdc: negative or null value for -vmin") << endl;
          return false;
        }
      } else if(arg=="-vmax") {
        CoreApplication::checkOptionArg(i, argc, argv);
        _vMaxRange=atof(argv[i]);
        if(_vMaxRange<=0) {
          App::stream() << tr("gpdc: negative or null value for -vmax") << endl;
          return false;
        }
      } else if(arg=="-vn") {
        CoreApplication::checkOptionArg(i, argc, argv);
        _vNSamples=atoi(argv[i]);
        if(_vNSamples<=0) {
          App::stream() << tr("gpdc: negative or null number of samples (option -vn)") << endl;
          return false;
        }
      } else if(arg=="-R") {
        CoreApplication::checkOptionArg(i, argc, argv);
        _nRayleigh=atoi(argv[i]);
      } else if(arg=="-L") {
        CoreApplication::checkOptionArg(i, argc, argv);
        _nLove=atoi(argv[i]);
      } else if(arg=="-one-mode") {
        _oneMode=true;
      } else if(arg=="-delta-k") {
        _deltaK=true;
      } else if(arg=="-f") {
        _force=true;
      } else if(arg=="-group") {
        _groupSlowness=true;
      } 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]);
        if(_minRange<=0) {
          App::stream() << tr("gpdc: negative or null value for -min") << endl;
          return false;
        }
      } else if(arg=="-max") {
        CoreApplication::checkOptionArg(i, argc, argv);
        _maxRange=atof(argv[i]);
        if(_maxRange<=0) {
          App::stream() << tr("gpdc: negative or null value for -max") << endl;
          return false;
        }
      } else if(arg=="-n") {
        CoreApplication::checkOptionArg(i, argc, argv);
        _nSamples=atoi(argv[i]);
        if(_nSamples<=0) {
          App::stream() << tr("gpdc: negative or null number of samples (option -n)") << endl;
          return false;
        }
      } else {
        App::stream() << tr("gpdc: bad option %1, see -help").arg(argv[i]) << endl;
        return false;
      }
    } else {
      argv[j++]=argv[i];
    }
  }
  if(j < argc) {
    argv[j]=0;
    argc=j;
  }
  // Compute common sampling scale
  Curve<Point1D> c;
  c.line(_minRange, _maxRange);
  c.resample(_nSamples, _minRange, _maxRange, _samplingType | Function);
  c.xMultiply(2*M_PI); // convert to angular frequency
  _x=c.xVector();
  // Check arguments
  if(_deltaK) {
    if(_nRayleigh>0) {
      if(_nRayleigh<2) {
        App::stream() << tr("gpdc: wiht option -delta-k, the minimum number of Rayleigh modes is 2") << endl;
        return false;
      }
    }
    if(_nLove>0) {
      if(_nLove<2) {
        App::stream() << tr("gpdc: wiht option -delta-k, the minimum number of Love modes is 2") << endl;
        return false;
      }
    }
  }
  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