Brief description of class still missing. More...
#include <ShReader.h>
Public Member Functions | |
| bool | setOptions (int &argc, char **argv) |
| ShReader () | |
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 QGpCoreTools::LogScale, and TRACE.
: ArgumentStdinReader() { TRACE; _nSamples=100; _samplingType=LogScale; _nSamples=100; _minRange=0.2; _maxRange=20.0; _qp=0.0; _qs=0.0; }
| bool ShReader::parse | ( | QTextStream & | s | ) | [protected, virtual] |
Implements QGpCoreTools::ArgumentStdinReader.
References QGpCoreTools::Curve< pointType >::append(), QGpCoreTools::Curve< pointType >::cut(), QGpCoreTools::endl(), QGpCoreWave::Seismic1DModel::fromStream(), QGpCoreTools::Function, QGpCoreWave::Seismic1DModel::h(), QGpCoreWave::Seismic1DModel::layerCount(), psv1d_(), QGpCoreWave::Seismic1DModel::qp(), QGpCoreWave::Seismic1DModel::qs(), QGpCoreTools::Curve< pointType >::resample(), QGpCoreWave::Seismic1DModel::rho(), QGpCoreWave::Seismic1DModel::slowP(), QGpCoreWave::Seismic1DModel::slowS(), sOut(), QGpCoreTools::Curve< pointType >::toString(), QGpCoreTools::tr(), and TRACE.
{
TRACE;
QTextStream sOut(stdout);
Seismic1DModel m;
QString comments;
if(!m.fromStream(s, &comments)) {
return false;
}
if(m.layerCount()>0) {
int nf=_nRawSamples;
float fmax=_maxRange;
int ln=m.layerCount();
int nTransferFonction=2*nf+1;
float * thickness=new float[ln];
float * alpha0=new float[ln];
float * beta0=new float[ln];
float * dens=new float[ln];
float * qp=new float[ln];
float * qs=new float[ln];
float * transferFonction=new float[nTransferFonction];
for(int i=0;i<ln; i++) {
thickness[i]=i<ln-1 ? m.h(i) : 0;
alpha0[i]=1.0/m.slowP(i);
beta0[i]=1.0/m.slowS(i);
dens[i]=m.rho(i);
if(_qp>0.0) {
qp[i]=_qp;
} else {
qp[i]=m.qp(i);
if(qp[i]<=0) {
App::stream() << tr("gpsh: negative or null value for Qp at layer %1").arg(i) << endl;
delete [] thickness;
delete [] alpha0;
delete [] beta0;
delete [] dens;
delete [] qp;
delete [] qs;
delete [] transferFonction;
return false;
}
}
if(_qs>0.0) {
qs[i]=_qs;
} else {
qs[i]=m.qs(i);
if(qs[i]<=0) {
App::stream() << tr("gpsh: negative or null value for Qs at layer %1").arg(i) << endl;
delete [] thickness;
delete [] alpha0;
delete [] beta0;
delete [] dens;
delete [] qp;
delete [] qs;
delete [] transferFonction;
return false;
}
}
}
psv1d_(&nf, &fmax, &ln, thickness, alpha0, beta0, dens, qp, qs, transferFonction, &nTransferFonction);
Curve<Point2D> c;
double df=(double)fmax/(nTransferFonction-1);
for(int i=0;i<nTransferFonction;i++) {
c.append(Point2D(df*i, 0.5*transferFonction[i]));
}
c.resample(_x, Function);
c.cut(_x[0], _x[_x.count()-1], Function);
sOut << "# SH transfer function\n"
<< comments
<< c.toString();
delete [] thickness;
delete [] alpha0;
delete [] beta0;
delete [] dens;
delete [] qp;
delete [] qs;
delete [] transferFonction;
}
return true;
}
| bool ShReader::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, 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=="-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("gpsh: 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("gpsh: negative or null value for -max") << endl;
return false;
}
} else if(arg=="-qp") {
CoreApplication::checkOptionArg(i, argc, argv);
_qp=atoi(argv[i]);
if(_qp<0) {
App::stream() << tr("gpsh: negative Qp (option -qp)") << endl;
return false;
}
} else if(arg=="-qs") {
CoreApplication::checkOptionArg(i, argc, argv);
_qs=atoi(argv[i]);
if(_qs<0) {
App::stream() << tr("gpsh: negative Qs (option -qs)") << endl;
return false;
}
} else if(arg=="-n") {
CoreApplication::checkOptionArg(i, argc, argv);
_nSamples=atoi(argv[i]);
if(_nSamples<2) {
App::stream() << tr("gpsh: number of samples less than 2 (option -n)") << endl;
return false;
}
} else {
App::stream() << tr("gpsh: 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);
_x=c.xVector();
// SH is primarily computed on a linear scale. Get the minimum spacing between two samples
// to adjust the number of samples for the fortran call.
double minStep;
switch(_samplingType) {
case InversedScale:
minStep=_x[_x.count()-1]-_x[_x.count()-2];
break;
default:
minStep=_x[1]-_x[0];
break;
}
_nRawSamples=(int)ceil(_maxRange/minStep);
if(_nRawSamples>4096) {
App::stream() << tr("gpsh: maximum number of samples reached (max=4096, value=%1). Either "
"increase minimum frequency, reduce the number of sample or "
"switch to 'frequency' scale (option '-s').").arg(_nRawSamples) << endl;
return false;
}
// Round to next power of 2
int n2=2;
while(n2<_nRawSamples) n2=n2 << 1;
_nRawSamples=n2;
return true;
}