#include "acd_defn.hh" #include "acd_selfdoc.h" #include "grid.h" #include "iwop.hh" #include "gridpp.hh" #include "functions.hh" #include "cgnealg.hh" #include "adjtest.hh" #include "segyops.hh" //#define GTEST_VERBOSE IOKEY IWaveInfo::iwave_iokeys[] = { {"csq", 0, true, true }, {"data", 1, false, true }, {"source", 1, true, false}, {"", 0, false, false} }; using RVL::parse; using RVL::RVLException; using RVL::Vector; using RVL::Components; using RVL::Operator; using RVL::OperatorEvaluation; using RVL::LinearOp; using RVL::LinearOpFO; using RVL::OpComp; using RVL::SymmetricBilinearOp; using RVL::AssignFilename; using RVL::AssignParams; using RVL::RVLRandomize; using RVL::AdjointTest; using TSOpt::IWaveEnvironment; using TSOpt::IWaveTree; using TSOpt::IWaveSampler; using TSOpt::IWaveSim; using TSOpt::TASK_RELN; using TSOpt::IOTask; using TSOpt::IWaveOp; using TSOpt::SEGYLinMute; #ifdef IWAVE_USE_MPI using TSOpt::MPIGridSpace; using TSOpt::MPISEGYSpace; #else using TSOpt::GridSpace; using TSOpt::SEGYSpace; #endif using RVLUmin::CGNEAlg; int xargc; char **xargv; int main(int argc, char ** argv) { try { #ifdef IWAVE_USE_MPI int ts=0; MPI_Init_thread(&argc,&argv,MPI_THREAD_FUNNELED,&ts); #endif PARARRAY * pars = NULL; FILE * stream = NULL; IWaveEnvironment(argc, argv, 0, &pars, &stream); // the Op IWaveOp iwop(*pars,stream); SEGYLinMute mute(valparse(*pars,"mute_slope",0.0f), valparse(*pars,"mute_zotime",0.0f), valparse(*pars,"mute_width",0.0f)); LinearOpFO muteop(iwop.getRange(),iwop.getRange(),mute,mute); OpComp op(iwop,muteop); Vector m(op.getDomain()); Vector dm(op.getDomain()); Vector dd(op.getRange()); Vector mdd(op.getRange()); AssignFilename mfn(valparse(*pars,"rcsq")); //Components cm(m); //cm[0].eval(mfn); m.eval(mfn); AssignFilename dmfn(valparse(*pars,"icsq")); // Components cdm(dm); // cdm[0].eval(dmfn); dm.eval(dmfn); dm.zero(); AssignFilename ddfn(valparse(*pars,"data")); // Components cdd(dd); // cdd[0].eval(ddfn); dd.eval(ddfn); std::string mddnm = valparse(*pars,"datamut",""); if (mddnm.size()>0) { AssignFilename mddfn(mddnm); mdd.eval(mddfn); } muteop.applyOp(dd,mdd); float rtol=valparse(*pars,"ResidualTol",100.0*numeric_limits::epsilon()); float nrtol=valparse(*pars,"GradientTol",100.0*numeric_limits::epsilon()); int maxcount=valparse(*pars,"MaxIter",10); float maxstep=valparse(*pars,"MaxStep",numeric_limits::max()); RVLRandomize rnd(getpid(),-1.0,1.0); /* output stream */ std::stringstream res; res< opeval(op,m); // AdjointTest(opeval.getDeriv(),rnd,cerr); CGNEAlg alg(dm,opeval.getDeriv(),mdd, rnorm, nrnorm, rtol, nrtol, maxcount, maxstep, res); float nrnorm0=nrnorm; float rnorm0=rnorm; alg.run(); // display results res<<"\n ******* summary ******** "<(*pars,"datares",""); if (dataest.size()>0) { Vector est(op.getRange()); AssignFilename estfn(dataest); est.eval(estfn); opeval.getDeriv().applyOp(dm,est); if (datares.size()>0) { Vector dres(op.getRange()); AssignFilename resfn(datares); dres.eval(resfn); dres.copy(mdd); dres.linComb(-1.0f,est); } } if (retrieveRank() == 0) { std::string outfile = valparse(*pars,"outfile",""); if (outfile.size()>0) { ofstream outf(outfile.c_str()); outf<