Functions
spac2disp/spac2disp.cpp File Reference
#include <QSize>
#include <QPoint>
#include <QFileInfo>
#include <DinverCore.h>
#include <DinverDCCore.h>
#include <QGpCoreWave.h>
#include <QGpGuiTools.h>
#include "spac2dispVersion.h"
#include "spac2dispInstallPath.h"
#include "SpacSelector.h"
#include "Spac3CForward.h"

Functions

ApplicationHelphelp ()
int main (int argc, char **argv)
 PACKAGE_INFO (spac2disp, SPAC2DISP)

Function Documentation

int main ( int  argc,
char **  argv 
)

References QGpCoreWave::AutocorrCurves::add(), QGpCoreTools::Curve< pointType >::append(), DinverDCCore::TargetList::autocorrTarget(), DinverCore::Neighborhood::bestModelIndex(), SpacSelector::createObjects(), DinverDCCore::AutocorrTarget::curves(), QGpCoreWave::AutocorrCurves::curves(), QGpCoreWave::AutocorrCurves::dispersionCurve(), QGpCoreTools::endl(), help(), QGpCoreWave::AutocorrCurves::isEmpty(), QGpCoreWave::AutocorrRing::maxRadius(), QGpCoreWave::AutocorrRing::minRadius(), DinverCore::Neighborhood::misfit(), mode, QGpCoreWave::ModalCurve::modes(), MSG_ID, Spac3CForward::omega(), Spac3CForward::omegasCount(), DinverCore::Neighborhood::openReport(), DinverCore::AbstractForward::parameterSpace(), QGpCoreWave::Mode::polarisation(), Spac3CForward::radial(), QGpCoreWave::AutocorrCurves::ring(), QGpCoreWave::Mode::ringIndex(), Spac3CForward::setCurves(), DinverCore::Neighborhood::setForward(), Spac3CForward::setFrequency(), SpacSelector::setMaximumSolutionCount(), Spac3CForward::setModel(), DinverCore::RealSpace::setVariableParameters(), sOut(), DinverCore::Neighborhood::start(), targets, QGpCoreTools::Curve< pointType >::toString(), QGpCoreTools::tr(), Spac3CForward::transverse(), DinverCore::Neighborhood::validModelCount(), DinverCore::Neighborhood::variableParameterValue(), Spac3CForward::vertical(), w, and QGpCoreTools::XMLHeader::xml_restoreFile().

{
  Application a(argc, argv, help);

  // Options
  enum AppMode {Vertical, AllComponent};
  AppMode mode=Vertical;
  bool outputDispersion=false;
  double kmin=0.1, kmax=1;
  int maxSolutionCount=5;
  // Check arguments
  int i, j=1;
  for(i=1; i<argc; i++) {
    QByteArray arg=argv[i];
    if(arg[0]=='-') {
      if(arg=="-V") {
        mode=Vertical;
      } else if(arg=="-VRT") {
        mode=AllComponent;
      } else if(arg=="-dispersion") {
        outputDispersion=true;
      } else if(arg=="-kmin") {
        CoreApplication::checkOptionArg(i, argc, argv);
        kmin=atof(argv[i] );
      } else if(arg=="-kmax") {
        CoreApplication::checkOptionArg(i, argc, argv);
        kmax=atof(argv[i] );
      } else if(arg=="-max-solutions") {
        CoreApplication::checkOptionArg(i, argc, argv);
        maxSolutionCount=atoi(argv[i] );
      } else {
        App::stream() << tr("spac2disp: bad option %1, see --help").arg(argv[i]) << endl;
        return 2;
      }
    } else {
      argv[j++]=argv[i];
    }
  }
  if(j < argc) {
    argv[j]=0;
    argc=j;
  }
  // get curves
  AutocorrCurves autocorr;
  QString title("spac2disp - ");
  i=1;
  while(i<argc) {
    QFileInfo fi(argv[i]);
    title+=fi.fileName()+" ";
    TargetList tl;
    XMLVirtualPlugin plugin(&tl, "DispersionCurve");
    XMLDinverHeader hdr(&plugin);
    if(hdr.xml_restoreFile(argv[i] )!=XMLClass::NoError) {
      Message::warning(MSG_ID, tr("Loading Dinver target/environment ..." ),
                          tr("Error while reading file %1" ).arg(argv[i]), Message::cancel());
      return 2;
    }
    autocorr.add(tl.autocorrTarget().curves());
    i++;
  }

  if(autocorr.isEmpty()) {
    QStringList files=Message::getOpenFileNames(tr("Loading SPAC files"),
                                                   tr("Dinver targets (*.target);;Dinver environment (*.dinver)"));
    if(files.isEmpty()) {
      App::stream() << tr("spac2disp: no spac files provided") << endl;
      return 2;
    }
    for(QStringList::iterator it=files.begin(); it!=files.end(); it++) {
      QFileInfo fi(*it);
      title+=fi.fileName()+" ";
      TargetList tl;
      XMLVirtualPlugin plugin(&tl, "DispersionCurve");
      XMLDinverHeader hdr(&plugin);
      if(hdr.xml_restoreFile( *it)!=XMLClass::NoError) {
        Message::warning(MSG_ID, tr("Loading Dinver target/project ..." ),
                            tr("Error while reading file %1" ).arg(*it), Message::cancel());
        return 2;
      }
      autocorr.add(tl.autocorrTarget().curves());
    }
  }

  QTextStream sOut(stdout);
  if(mode==Vertical) {
    if(outputDispersion) {
      int n=autocorr.curves().count();
      for(int i=0; i<n; i++ ) {
        ModalCurve c=autocorr.dispersionCurve(i, kmin, kmax, maxSolutionCount);
        const ModalCurve& curve=autocorr.curves().at(i);
        int iRing=curve.modes().first().ringIndex();
        const AutocorrRing& ring=autocorr.ring(iRing);
        sOut << QString("# Curve %1, ring %2 (from %3 to %4)\n")
                .arg(i).arg(iRing).arg(ring.minRadius()).arg(ring.maxRadius())
             << c.toString();
      }
      return 0;
    }
    SciFigsGlobal s;
    SpacSelector * w=new SpacSelector;
    w->setMaximumSolutionCount(maxSolutionCount);
    w->setWindowTitle(title);
    if(!w->createObjects(&autocorr)) {
      delete w;
      return 2;
    }

    w->show();
    int appReturn=a.exec();
    delete w;

    return appReturn;
  } else if(mode==AllComponent) {
    Spac3CForward forward;
    forward.setCurves(autocorr);
    forward.parameterSpace().setVariableParameters();

    int omegaCount=forward.omegasCount();
    int curveCount=autocorr.curves().count();
    Curve<Point2D> rayleigh, love, alpha;
    Curve<Point2D> targets[curveCount];
    for(int i=0; i<omegaCount; i++) {
    //int i=18;
      forward.setFrequency(i);
      Neighborhood na;
      na.setForward(&forward);
      static const QString baseName="frequency_%1";
      double f=forward.omega(i)*0.5/M_PI;
      na.openReport(baseName.arg(f));
      na.start();
      /*double m[3];
      m[0]=0.0014;
      m[1]=0.0026;
      m[2]=0.2;
      bool ok=true;
      printf("%i-%lf Hz: %lf %lf %lf --> %lf\n", i,t.omega(i)*0.5/M_PI, m[0], m[1], m[2], t.misfit(m,ok));
      printf("%i-%lf Hz: %lf %lf %lf --> %lf\n", i,t.omega(i)*0.5/M_PI, m[0], m[1], m[2], t.misfit(m,ok));*/
      if(na.validModelCount()>0) {
        int iBest=na.bestModelIndex();
        double model[3];
        model[0]=na.variableParameterValue(iBest, 0);
        model[1]=na.variableParameterValue(iBest, 1);
        model[2]=na.variableParameterValue(iBest, 2);
        rayleigh.append(Point2D(f,model[0]));
        love.append(Point2D(f,model[1]));
        alpha.append(Point2D(f,model[2]));
        printf("%i-%lf Hz: %lf\n", i,f, na.misfit(iBest));
        forward.setModel(model);
        for(int ci=0; ci<curveCount;ci++) {
          Mode m=autocorr.curves().at(ci).modes().first();
          switch(m.polarisation()) {
          case Mode::Vertical:
            targets[ci].append(Point2D(f,forward.vertical(m.ringIndex())));
            break;
          case Mode::Radial:
            targets[ci].append(Point2D(f,forward.radial(m.ringIndex())));
            break;
          case Mode::Transverse:
            targets[ci].append(Point2D(f,forward.transverse(m.ringIndex())));
            break;
          default:
            break;
          }
        }
      }
    }
    sOut << "# Rayleigh\n"
         << rayleigh.toString()
         << "# Love\n"
         << love.toString()
         << "# Alpha\n"
         <<  alpha.toString();
    for(int ci=0; ci<curveCount;ci++) {
      sOut << QString("# %1\n").arg(autocorr.curves().at(ci).modes().first().toString())
           << targets[ci].toString();
    }
    /*
    struct Model {
      double alphaR, slowR, slowL, misfit;
    };
    Model solution[omegaCount];
    for(int i =0;i<omegaCount; i++) {
      solution[i].misfit=1e99;
    }

    Value * dispR=dispFactory.phaseRayleigh()->mode(0);
    Value * dispL=dispFactory.phaseLove()->mode(0);
    double inv2pi=0.5/M_PI;

    for(double alphaR=0.0; alphaR < 1.0; alphaR +=0.01) {
      fprintf(stderr,"alphaR=%lg\n", alphaR);
      for(double slowR=0.00025; slowR<0.01; slowR +=1e-4) {
        fprintf(stderr,"slowR=%lg\n", slowR);
        for(int i=0; i<omegaCount; i++) {
          dispR[i].setValue(slowR);
        }
        for(double slowL=0.00025; slowL<0.01; slowL +=1e-4) {
          for(int i=0; i<omegaCount; i++) {
            dispL[i].setValue(slowL);
          }
          autocorrFactory.calculate(alphaR, &dispFactory);
          for(int i=0; i<omegaCount; i++) {
            double misfit=0.0;
            int nValues=0;
            int nData=0;
            for(QList<ModalCurve>::ConstIterator it=curveList.begin(); it!=curveList.end(); ++it) {
              const Value * values=autocorrFactory.mode(it->modes().first());
              const FactoryPoint& p=it->at(i);
              misfit+=p.misfit2(nValues, nData, values[ p.index() ] );
            }
            //printf( "%lg %lg %lg %lg %lg\n", inv2pi*autocorrFactory.x()->at(i), alphaR, slowR, slowL, misfit);
            if(misfit<solution[i].misfit) {
              solution[i].alphaR=alphaR;
              solution[i].slowR=slowR;
              solution[i].slowL=slowL;
              solution[i].misfit=misfit;
              fprintf(stderr, "improving... %lg %lg %lg %lg %lg\n", inv2pi*autocorrFactory.x()->at(i),
                      solution[i].alphaR, solution[i].slowR, solution[i].slowL, solution[i].misfit);
            }
          }
        }
      }
    }
    for(int i=0; i<omegaCount; i++) {
      printf( "%lg %lg %lg %lg %lg\n", inv2pi*autocorrFactory.x()->at(i),
              solution[i].alphaR, solution[i].slowR, solution[i].slowL, solution[i].misfit);
    }*/
  }
}
PACKAGE_INFO ( spac2disp  ,
SPAC2DISP   
)
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Defines