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);
enum Mode {HumanInfo, Random, Manual};
Mode mode=Random;
int nModels=1000;
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)) {
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;
}
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;
}