Defines | Functions
gpdepths/main.cpp File Reference
#include <DinverCore.h>
#include <DinverDCCore.h>
#include <QGpCoreTools.h>
#include "gpdepthsVersion.h"
#include "gpdepthsInstallPath.h"
#include "DepthDistribution.h"

Defines

#define DIFF_SIGN(A, B)   ((A<0 && B>0) || (A>0 && B<0))

Functions

ApplicationHelphelp ()
int main (int argc, char **argv)
 PACKAGE_INFO (gpdepths, GPDEPTHS)

Define Documentation

#define DIFF_SIGN (   A,
 
)    ((A<0 && B>0) || (A>0 && B<0))

Function Documentation

int main ( int  argc,
char **  argv 
)

References DinverDCCore::ParamProfile::addLayer(), DinverDCCore::Param3DGroundModel::addModel(), DinverDCCore::ParamGroundModel::addProfile(), DepthDistribution::calculate(), QGpCoreTools::endl(), QGpCoreTools::Point::fromString(), help(), DepthDistribution::layerCount(), DepthDistribution::maximumDepth(), DepthDistribution::minimumDepth(), DepthDistribution::report(), DinverDCCore::ParamLayer::setBottomMaximumValue(), DinverDCCore::ParamLayer::setBottomMinimumValue(), DinverDCCore::Param3DGroundModel::setCustomConditions(), DinverDCCore::ParamGroundModel::setCustomConditions(), DinverDCCore::ParamLayer::setDepth(), DepthDistribution::setLayerCount(), DinverDCCore::ParamLayer::setMaximumDepth(), DepthDistribution::setMaximumWavelength(), DinverDCCore::ParamLayer::setMinimumDepth(), DepthDistribution::setMinimumWavelength(), DinverDCCore::ParamGroundModel::setPosition(), DinverDCCore::ParamLayer::setShape(), DinverDCCore::ParamLayer::setTopMaximumValue(), DinverDCCore::ParamLayer::setTopMinimumValue(), sOut(), DepthDistribution::thickness(), QGpCoreTools::tr(), and QGpCoreTools::XMLHeader::xml_saveFile().

{
  CoreApplication app(argc, argv, help);

  // Options
  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;
  // Check arguments
  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;
}
PACKAGE_INFO ( gpdepths  ,
GPDEPTHS   
)
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Defines