Functions
gpparam2model/main.cpp File Reference
#include <DinverCore.h>
#include <DinverDCCore.h>
#include <QGpCoreTools.h>
#include <QGpCoreWave.h>
#include "gpparam2modelVersion.h"
#include "gpparam2modelInstallPath.h"
#include "ModelGenerator.h"

Functions

ApplicationHelphelp ()
int main (int argc, char **argv)
 PACKAGE_INFO (gpparam2model, GPPARAM2MODEL)

Function Documentation

int main ( int  argc,
char **  argv 
)

References DinverCore::RealSpace::adjustRanges(), DinverCore::RealSpace::allParameterCount(), QGpCoreWave::Profile::depths(), QGpCoreTools::endl(), DinverDCCore::ParamGroundModel::find(), DinverCore::Parameter::getRectangularLimits(), help(), DinverCore::RealSpace::humanInfo(), DinverDCCore::ParamGroundModel::initFinalProfiles(), DinverDCCore::ParamGroundModel::isEmpty(), DinverCore::RealSpace::isOkDebug(), ModelGenerator::misfit(), mode, DinverCore::Parameter::name(), DinverCore::AbstractForward::parameterSpace(), DinverDCCore::ParamProfile::resampledProfile(), DinverCore::Neighborhood::setForward(), ModelGenerator::setParamSpace(), DinverCore::Parameter::setRealValue(), DinverCore::RealSpace::setVariableParameters(), DinverCore::Neighborhood::start(), QGpCoreTools::LineParser::toDouble(), DinverDCCore::ParamGroundModel::toParameters(), QGpCoreWave::Seismic1DModel::toStream(), QGpCoreTools::tr(), DinverDCCore::ParamGroundModel::updateFinalProfiles(), QGpCoreWave::Profile::values(), DinverCore::RealSpace::variableParameter(), DinverCore::RealSpace::variableParameterCount(), and QGpCoreTools::XMLHeader::xml_restoreFile().

{
  CoreApplication a(argc, argv, help);

  // Options
  enum Mode {HumanInfo, Random, Manual};
  Mode mode=Random;
  int nModels=1000;
  // Check arguments
  int i, j=1;
  for(i=1; i<argc; i++) {
    QByteArray arg=argv[i];
    if(arg[0]=='-') {
      if(arg=="-n") {
        CoreApplication::checkOptionArg(i, argc, argv);
        nModels=atoi(argv[i]);
      } else if(arg=="-m") {
        mode=Manual;
      } else if(arg=="-i") {
        mode=HumanInfo;
      } else {
        App::stream() << tr("gpparam2model: bad option %1, see --help").arg(argv[i]) << endl;
        return 2;
      }
    } else {
      argv[j++]=argv[i];
    }
  }
  if(j < argc) {
    argv[j]=0;
    argc=j;
  }

  if(argc<1) {
    App::stream() << tr("gpparam2mmodel: no parameter file specified, see --help") << endl;
    return 2;
  }
  ParamGroundModel gm;
  XMLVirtualPlugin plugin(&gm, "DispersionCurve");
  XMLDinverHeader hdr(&plugin);
  if(hdr.xml_restoreFile(argv[1] )!=XMLClass::NoError) {
    App::stream() << tr("gpparam2mmodel: error loading parameterization file %1").arg(argv[1]) << endl;
    return 2;
  }
  if(gm.isEmpty()) {
    App::stream() << tr("gpparam2mmodel: parametrized model is empty or at least one of its profiles is missing.") << endl;
    return 2;
  }
  gm.initFinalProfiles();
  switch(mode) {
  case HumanInfo: {
      RealSpace ps;
      gm.toParameters(ps);
      ps.setVariableParameters();
      ps.humanInfo();
    }
    return 0;
  case Manual: {
      RealSpace ps;
      gm.toParameters(ps);
      ps.setVariableParameters();
      if(ps.variableParameterCount()==0) {
        gm.updateFinalProfiles();
        ParamProfile * vp=gm.find( "Vp" );
        ParamProfile * vs=gm.find( "Vs" );
        ParamProfile * rho=gm.find( "Rho" );
        Seismic1DModel * m =DCReportBlock::surfaceWaveModel(vp->resampledProfile().depths(),
                                                          vp->resampledProfile().values(),
                                                          vs->resampledProfile().values(),
                                                          rho->resampledProfile().values());
        QTextStream s(stdout);
        m->toStream(s);
        delete m;
        return 0;
      }
      int bufLen=256;
      char * buf=new char[bufLen];
      int nLines=0;
      while(!feof(stdin)) {
        // Fill in parameter values with stdin
        QString l=File::readLine(true);
        nLines++;
        if(l.isEmpty() || l[0]=='#') continue;
        LineParser lp(l);
        bool ok=true;
        for(int i=0;i<ps.variableParameterCount();) {
          double v=lp.toDouble(i, ok);
          if(ok) {
            const Parameter * p=ps.variableParameter(i);
            double min, max;
            p->getRectangularLimits(min, max);
            if(v>=min && v<=max) {
              ps.variableParameter(i)->setRealValue(v);
              i++;
            } else {
              App::stream() << tr("gpparam2mmodel: parameter %1(%2) out of range [ %3, %4 ] at line %5")
                                  .arg(p->name()).arg(v).arg(min).arg(max).arg(nLines) << endl;
              delete buf;
              return 2;
            }
          } else {
            App::stream() << tr("gpparam2mmodel: not enough parameters at line %1, %2 are required")
                                .arg(nLines).arg(ps.variableParameterCount()) << endl;
            delete buf;
            return 2;
          }
        }
        if(!ps.isOkDebug()) {
          App::stream() << tr("gpparam2mmodel: parameter set does not satisfy all conditions at line %1").arg(nLines) << endl;
          delete buf;
          return 2;
        }
        // Parameter set now ready for transformation into layered model
        gm.updateFinalProfiles();
        ParamProfile * vp=gm.find( "Vp" );
        ParamProfile * vs=gm.find( "Vs" );
        ParamProfile * rho=gm.find( "Rho" );
        Seismic1DModel * m =DCReportBlock::surfaceWaveModel(vp->resampledProfile().depths(),
                                                          vp->resampledProfile().values(),
                                                          vs->resampledProfile().values(),
                                                          rho->resampledProfile().values());
        QTextStream s(stdout);
        s << QString("# Parameter set %1:").arg(nLines) << endl;
        s << "# " << buf << endl;
        m->toStream(s);
        delete m;
      }
      delete buf;
    }
    break;
  case Random: {
      ModelGenerator m;
      if(!m.setParamSpace(&gm)) {
        App::stream() << tr("gpparam2model: error in initializationof parameter space.") << endl;
        return 2;
      }
      m.parameterSpace().setVariableParameters();
      if(!m.parameterSpace().adjustRanges()) {
        App::stream() << tr("gpparam2model: error adjusting ranges") << endl;
        return 2;
      }
      if(m.parameterSpace().variableParameterCount()==0) {
        App::stream() << tr("gpparam2model: no variable parameters(fixed parameters=%1).")
                               .arg(m.parameterSpace().allParameterCount()) << endl;
        bool ok;
        gm.updateFinalProfiles();
        m.misfit(ok);
        return 2;
      }
      Neighborhood na;
      na.setForward(&m);
      na.start(0, nModels, 0);
    }
    break;
  }
  return 0;
}
PACKAGE_INFO ( gpparam2model  ,
GPPARAM2MODEL   
)
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Defines