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);
enum AppMode {Vertical, AllComponent};
AppMode mode=Vertical;
bool outputDispersion=false;
double kmin=0.1, kmax=1;
int maxSolutionCount=5;
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;
}
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++) {
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();
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();
}
}
}