{
CoreApplication app(argc, argv, help);
DepthDistribution dd;
QString outputParam;
double vpMin=200.0;
double vpMax=5000.0;
double vsMin=150.0;
double vsMax=3500.0;
double nuMin=0.2;
double nuMax=0.5;
double rhoMin=2000.0;
double rhoMax=2000.0;
bool fixDepths=false;
double vsLink=-1;
QVector<Point> positions;
int i, j=1;
for(i=1; i<argc; i++) {
QByteArray arg=argv[i];
if(arg[0]=='-') {
if(arg=="-min") {
CoreApplication::checkOptionArg(i, argc, argv);
dd.setMinimumWavelength(atof( argv[i] ));
} else if(arg=="-max") {
CoreApplication::checkOptionArg(i, argc, argv);
dd.setMaximumWavelength(atof( argv[i] ));
} else if(arg=="-n") {
CoreApplication::checkOptionArg(i, argc, argv);
if( ! dd.setLayerCount(atoi( argv[i] )) ) {
App::stream() << tr("gpdepths: null or negative number of layers (%1).").arg(argv[i]) << endl;
return 2;
}
} else if(arg=="-o") {
CoreApplication::checkOptionArg(i, argc, argv);
outputParam=argv[i];
} else if(arg=="-vp-min") {
CoreApplication::checkOptionArg(i, argc, argv);
vpMin=atof(argv[i]);
} else if(arg=="-vp-max") {
CoreApplication::checkOptionArg(i, argc, argv);
vpMax=atof(argv[i]);
} else if(arg=="-vs-min") {
CoreApplication::checkOptionArg(i, argc, argv);
vsMin=atof(argv[i]);
} else if(arg=="-vs-max") {
CoreApplication::checkOptionArg(i, argc, argv);
vsMax=atof(argv[i]);
} else if(arg=="-nu-min") {
CoreApplication::checkOptionArg(i, argc, argv);
nuMin=atof(argv[i]);
} else if(arg=="-nu-max") {
CoreApplication::checkOptionArg(i, argc, argv);
nuMax=atof(argv[i]);
} else if(arg=="-rho-min") {
CoreApplication::checkOptionArg(i, argc, argv);
rhoMin=atof(argv[i]);
} else if(arg=="-rho-max") {
CoreApplication::checkOptionArg(i, argc, argv);
rhoMax=atof(argv[i]);
} else if(arg=="-fix-depths") {
fixDepths=true;
} else if(arg=="-p") {
CoreApplication::checkOptionArg(i, argc, argv);
Point position;
if(!position.fromString(QString(argv[i]))) {
App::stream() << tr("gpdepths: error setting position from \"%1\"").arg(argv[i]) << endl;
return 2;
}
positions.append(position);
} else if(arg=="-link-vs") {
CoreApplication::checkOptionArg(i, argc, argv);
vsLink=atof(argv[i]);
} else {
App::stream() << tr("gpdepths: bad option %1, see -help").arg(argv[i]) << endl;
return 2;
}
} else {
argv[j++]=argv[i];
}
}
if(j < argc) {
argv[j]=0;
argc=j;
}
QTextStream sOut(stdout);
if(!dd.calculate()) {
return 2;
}
dd.report(sOut);
if( ! outputParam.isEmpty()) {
ParamGroundModel gm;
ParamProfile * vp=new ParamProfile( "Vp", tr("Compression-wave velocity"), tr("m/s"), vpMin, vpMax,
ParamProfile::Param, SimpleCondition::LessThan);
gm.addProfile(vp);
ParamProfile * nu=new ParamProfile( "Nu", tr("Poisson's Ratio"), "", nuMin, nuMax,
ParamProfile::Condition, SimpleCondition::GreaterThan);
gm.addProfile(nu);
ParamProfile * vs=new ParamProfile( "Vs", tr("Shear-wave velocity"), tr("m/s"), vsMin, vsMax,
ParamProfile::Param, SimpleCondition::LessThan);
gm.addProfile(vs);
ParamProfile * rho=new ParamProfile( "Rho", tr("Density"), tr("kg/m3"), rhoMin, rhoMax,
ParamProfile::Param, SimpleCondition::LessThan);
gm.addProfile(rho);
ParamLayer * l;
l=new ParamLayer(vp, 0);
if(nuMin<nuMax) {
l->setShape(ParamLayer::LinearIncrease);
l->setMinimumDepth(dd.minimumDepth(0));
l->setMaximumDepth(dd.maximumDepth(dd.layerCount()-1));
vp->addLayer(l);
vp->addLayer(new ParamLayer(vp, 1));
} else {
l->setTopMinimumValue(200.0);
l->setTopMaximumValue(200.0);
l->setBottomMinimumValue(200.0);
l->setBottomMaximumValue(200.0);
vp->addLayer(l);
}
nu->addLayer(new ParamLayer(nu, 0) );
QString layerThicknessConditions;
for(int i=0; i<dd.layerCount(); i++ ) {
l=new ParamLayer(vs, i);
if(fixDepths) {
l->setDepth(false);
l->setMinimumDepth(dd.thickness(i));
l->setMaximumDepth(dd.thickness(i));
} else {
l->setMinimumDepth(dd.minimumDepth(i));
l->setMaximumDepth(dd.maximumDepth(i));
if(i>0) {
layerThicknessConditions+=QString("linear(\"%4DVs%1\",\">\",1.0,\"%4DVs%2\",%3);\n")
.arg(i).arg(i-1).arg(dd.thickness(i)*0.5);
}
}
vs->addLayer(l);
}
vs->addLayer(new ParamLayer(vs, dd.layerCount()) );
rho->addLayer(new ParamLayer(rho, 0) );
if(positions.count()<=1) {
if(positions.count()==1) {
gm.setPosition(positions.first());
}
if(!fixDepths) {
gm.setCustomConditions(layerThicknessConditions.arg(""));
}
XMLVirtualPlugin plugin(&gm, "DispersionCurve");
XMLDinverHeader hdr(&plugin);
hdr.xml_saveFile(outputParam);
} else {
Param3DGroundModel gm3d;
int n=positions.count();
QString globalCustomConditions;
for(int i=0; i<n; i++) {
gm.setPosition(positions.at(i));
QString profilePrefix=QString(65+i)+"_";
if(!fixDepths) {
gm.setCustomConditions(layerThicknessConditions.arg(profilePrefix));
}
if(vsLink>0.0 && i>0) {
for(int iLayer=0; iLayer<dd.layerCount(); iLayer++) {
globalCustomConditions+=QString("linear(\"%2TopVs%1\", \">\", %3, \"A_TopVs%1\",0);\n")
.arg(iLayer).arg(profilePrefix).arg(1.0-vsLink);
globalCustomConditions+=QString("linear(\"%2TopVs%1\", \"<\", %3, \"A_TopVs%1\",0);\n")
.arg(iLayer).arg(profilePrefix).arg(1.0+vsLink);
}
}
gm3d.addModel(gm);
}
gm3d.setCustomConditions(globalCustomConditions);
XMLVirtualPlugin plugin(&gm3d, "DispersionCurve2D");
XMLDinverHeader hdr(&plugin);
hdr.xml_saveFile(outputParam);
}
}
return 0;
}