#include "gtest/gtest.h" #include "acd_defn.hh" #include "grid.h" #include "traceio.h" #include "iwsim.hh" //#define GTEST_VERBOSE IOKEY IWaveInfo::iwave_iokeys[] = { {"csq", 0, true, true }, {"data", 1, false, true }, {"source", 1, true, false}, {"movie", 1, false, false}, {"init", 1, true, false}, {"", 0, false, false} }; namespace { using RVL::parse; using RVL::RVLException; using TSOpt::IWaveEnvironment; using TSOpt::IWaveTree; using TSOpt::IWaveSampler; using TSOpt::IWaveSim; using TSOpt::TASK_RELN; using TSOpt::IOTask; #include "data.h" #include "hfile3d.h" class ACDSetupTest : public ::testing::Test { public: string hfile; string dfile; string hfile1; string dfile1; string hfile2; string dfile2; string hfile3; string dfile3; string hfiles; string dfiles; string hfilem; string dfilem; string hfilei; string dfilei; IWaveInfo ic; ACDSetupTest(): ic() { int nt; float dt; float ot; int nrec; int ntr_in_rec; float sx0; float dsx; float sz; float rx0; float drx; float rz; int scalel; int scalco; // first segy - single gather nt = 101; dt = 0.004; ot = 0.0; nrec = 3; ntr_in_rec = 101; sx0=3300; dsx=100; sz=40; rx0=100; drx=20; rz=50; scalel=0; scalco=0; string dn = "data.su"; create_fixed_2D_data(dn,nt,dt,ot, nrec,ntr_in_rec, sx0,dsx,sz, rx0,drx,rz, scalel,scalco); // segcond segy - source pulses nt = 51; dt = 0.004; ot = -100.0; nrec = 3; ntr_in_rec = 1; sx0=3300; dsx=100; sz=40; rx0=0.0; drx=0.0; rz=20; scalel=0; scalco=0; string wn = "wavelet.su"; create_fixed_2D_data(wn,nt,dt,ot, nrec,ntr_in_rec, sx0,dsx,sz, rx0,drx,rz, scalel,scalco); // hfile etc. = simple 2D // hfile1 etc. = x, z reversed // hfile2 = gdim=3, n3=3 etc. // hfile3 = gdim=3, h=1, z=2, x=3 hfile = "csq_4layer.rsf"; dfile = "csq_4layer.rsf@"; hfile1= "csq1.rsf"; dfile1= "csq1.rsf@"; hfile2= "csq2.rsf"; dfile2= "csq2.rsf@"; hfile3= "csq3.rsf"; dfile3= "csq3.rsf@"; hfiles= "csqsmall.rsf"; dfiles= "csqsmall.rsf@"; hfilem= "movie.rsf"; dfilem= "movie.rsf@"; hfilei= "init.rsf"; dfilei= "init.rsf@"; // create simple par file ofstream ps("parfile"); ps<<"INPUT DATA FOR IWAVE\n"; ps<<"------------------------------------------------------------------------\n"; ps<<"FD:\n"; ps<<"\n"; ps<<" order = 4 scheme half-order\n"; ps<<" cfl = 0.5 cfl number - frac of max stable\n"; ps<<" cmin = 1.0 min velocity - checked\n"; ps<<" cmax = 5.0 max velocity - checked\n"; ps<<" max_step = 0 1 = set adaptively, 0 = use standard cfl from cmax\n"; ps<<" fpeak = 0.010 nominal central frequency \n"; ps<<"\n"; ps<<"------------------------------------------------------------------------\n"; ps<<"Model info:\n"; ps<<"\n"; ps<<" csq = csq_4layer.rsf\n"; ps<<" csq_d1 = csq_4layer.rsf\n"; ps<<" csq_d2 = csq_4layer.rsf\n"; ps<<" csq_b1 = csq_4layer.rsf\n"; ps<<" csq_b2 = csq_4layer.rsf\n"; ps<<"\n"; ps<<"------------------------------------------------------------------------\n"; ps<<"MPI info:\n"; ps<<"\n"; ps<<" mpi_np1 = 1 n_doms along axis 1\n"; ps<<" mpi_np2 = 1 n_doms along axis 2\n"; ps<<" mpi_np3 = 1 n_doms along axis 3\n"; ps<<" partask = 1 task parallelization\n"; ps<<"\n"; ps<<"------------------------------------------------------------------------\n"; ps<<"Source info:\n"; ps<<"\n"; ps<<" source = wavelet.su\n"; ps<<" sampord = 1 sampling order\n"; ps<<"\n"; ps<<"------------------------------------------------------------------------\n"; ps<<"Trace info:\n"; ps<<"\n"; ps<<" data = data.su output data file\n"; ps<<"\n"; ps<<"------------------------------------------------------------------------\n"; ps<<"Output info:\n"; ps<<"\n"; ps<<" printact = 1 per-time-step verbosity level\n"; ps<<" 0 - none\n"; ps<<" 1 - time step index\n"; ps<<" 2 - internal time step info\n"; ps<<" > 5: dump everything\n"; ps<<" dump_pi = 1 dump parallel/dom. decomp info\n"; ps<<" dump_lda = 1 dump grid data for allocated arrays\n"; ps<<" dump_ldc = 1 dump grid data for computational arrays\n"; ps<<" dump_lds = 1 dump grid data for send arrays\n"; ps<<" dump_ldr = 1 dump grid data for receive arrays\n"; ps<<" dump_term = 0 dump terminator data\n"; ps<<" dump_pars = 0 print parameter table in IWaveOp\n"; ps<<" dump_steps = 0 print major steps in IWaveOp\n"; ps.flush(); ps.close(); ofstream qs("initfile"); qs<<"INPUT DATA FOR IWAVE\n"; qs<<"------------------------------------------------------------------------\n"; qs<<"FD:\n"; qs<<"\n"; qs<<" order = 2 scheme half-order\n"; qs<<" cfl = 0.5 cfl number - frac of max stable\n"; qs<<" cmin = 1.0 min velocity - checked\n"; qs<<" cmax = 2.0 max velocity - checked\n"; qs<<" max_step = 0 1 = set adaptively, 0 = use standard cfl from cmax\n"; qs<<" fpeak = 0.010 nominal central frequency \n"; qs<<" dt = 2.0"; qs<<"\n"; qs<<"------------------------------------------------------------------------\n"; qs<<"Model info:\n"; qs<<"\n"; qs<<" csq = csq_4layer.rsf\n"; qs<<" init = gauss.rsf\n"; qs<<" movie = movie.rsf\n"; qs<<"\n"; qs<<"------------------------------------------------------------------------\n"; qs<<"MPI info:\n"; qs<<"\n"; qs<<" mpi_np1 = 1 n_doms along axis 1\n"; qs<<" mpi_np2 = 1 n_doms along axis 2\n"; qs<<" mpi_np3 = 1 n_doms along axis 3\n"; qs<<" partask = 1 task parallelization\n"; qs<<"\n"; qs<<"------------------------------------------------------------------------\n"; qs<<"Output info:\n"; qs<<"\n"; qs<<" printact = 1 per-time-step verbosity level\n"; qs<<" 0 - none\n"; qs<<" 1 - time step index\n"; qs<<" 2 - internal time step info\n"; qs<<" > 5: dump everything\n"; qs<<" dump_pi = 1 dump parallel/dom. decomp info\n"; qs<<" dump_lda = 1 dump grid data for allocated arrays\n"; qs<<" dump_ldc = 1 dump grid data for computational arrays\n"; qs<<" dump_lds = 1 dump grid data for send arrays\n"; qs<<" dump_ldr = 1 dump grid data for receive arrays\n"; qs<<" dump_term = 0 dump terminator data\n"; qs<<" dump_pars = 0 print parameter table in IWaveOp\n"; qs<<" dump_steqs = 0 print major steqs in IWaveOp\n"; qs.flush(); qs.close(); grid g; g.dim=2; g.gdim=2; g.axes[0].n=416; g.axes[1].n=800; g.axes[2].n=3; g.axes[0].d=25.0; g.axes[1].d=25.0; g.axes[2].d=100.0; g.axes[0].o=0.0; g.axes[1].o=0.0; g.axes[2].o=-100.0; g.axes[0].id = 0; g.axes[1].id = 1; g.axes[2].id = 3; float val = 1.5; create_hfile(hfile, dfile, g, val); g.dim=2; g.gdim=2; g.axes[0].n=416; g.axes[1].n=800; g.axes[0].d=25.0; g.axes[1].d=25.0; g.axes[0].o=0.0; g.axes[1].o=0.0; g.axes[0].id = 0; g.axes[1].id = 1; val = 1.0; create_hfile(hfilei, dfilei, g, val); g.axes[0].n=800; g.axes[1].n=416; g.axes[0].id = 1; g.axes[1].id = 0; val=1.5; create_hfile(hfile1, dfile1, g, val); g.gdim=3; g.axes[0].n=416; g.axes[1].n=800; g.axes[2].n=3; g.axes[0].d=25.0; g.axes[1].d=25.0; g.axes[2].d=1.0; g.axes[0].o=0.0; g.axes[1].o=0.0; g.axes[2].o=0.0; g.axes[0].id = 0; g.axes[1].id = 1; g.axes[2].id = 3; create_hfile(hfile2, dfile2, g, val); g.axes[0].n=416; g.axes[0].d=25.0; g.axes[0].o=0.0; g.axes[0].id = 0; g.axes[1].n=800; g.axes[1].d=25.0; g.axes[1].o=0.0; g.axes[1].id = 1; g.axes[2].n=3; g.axes[2].d=100.0; g.axes[2].o=-100.0; g.axes[2].id = 101; create_hfile(hfile3, dfile3, g, val); g.dim=2; g.gdim=2; g.axes[0].n=5; g.axes[1].n=10; g.axes[2].n=1; g.axes[0].d=25.0; g.axes[1].d=25.0; g.axes[2].d=1.0; g.axes[0].o=0.0; g.axes[1].o=0.0; g.axes[2].o=0.0; g.axes[0].id = 0; g.axes[1].id = 1; g.axes[2].id = 2; create_hfile(hfiles, dfiles, g, 1.0, true); g.dim=2; g.gdim=3; g.axes[0].n=416; g.axes[1].n=800; g.axes[2].n=33; g.axes[0].d=25.0; g.axes[1].d=25.0; g.axes[2].d=200.0; g.axes[0].o=0.0; g.axes[1].o=0.0; g.axes[2].o=2.0; g.axes[0].id = 0; g.axes[1].id = 1; g.axes[2].id = 2; val = 0.0; create_hfile(hfilem, dfilem, g, val); g.dim=2; g.gdim=3; g.axes[0].n=416; g.axes[1].n=800; g.axes[2].n=1; g.axes[0].d=25.0; g.axes[1].d=25.0; g.axes[2].d=2.0; g.axes[0].o=0.0; g.axes[1].o=0.0; g.axes[2].o=0.0; g.axes[0].id = 0; g.axes[1].id = 1; g.axes[2].id = 2; float lam = 10; create_gauss(g,lam); } }; TEST_F(ACDSetupTest, setup_environment) { try { // fake command line environment int argc = 2; char * argvv = new char[128]; char ** argv = new char*[2]; argv[0]=&(argvv[0]); argv[1]=&(argvv[65]); strcpy(argv[1],"par=parfile"); PARARRAY * par = NULL; FILE * stream = NULL; IWaveEnvironment(argc, argv, 0, &par, &stream); delete [] argv; delete [] argvv; #ifdef GTEST_VERBOSE ps_printall(*par,stderr); #endif // check one of the main par entries string csq=""; parse(*par,"csq",csq); EXPECT_EQ("csq_4layer.rsf",csq); ps_delete(&par); fclose(stream); #ifndef GTEST_VERBOSE // unlink("parfile"); #endif } catch (RVLException & e) { e.write(cerr); exit(1); } } TEST_F(ACDSetupTest, iwavetree_2D_serial_order0) { try { // fake command line environment int argc = 2; char * argvv = new char[128]; char ** argv = new char*[2]; argv[0]=&(argvv[0]); argv[1]=&(argvv[65]); strcpy(argv[1],"par=parfile"); PARARRAY * par = NULL; FILE * stream = NULL; IWaveEnvironment(argc, argv, 0, &par, &stream); delete [] argv; delete [] argvv; // build order zero IWaveTree, check int order=0; // cerr<<"IWaveTree\n"; IWaveTree * wt = new IWaveTree(*par,stream,ic,order); // cerr<<"getStateArray\n"; IWAVE & w = *(wt->getStateArray()[0]); // cerr<<"printf\n"; iwave_printf(&w, par, stream,ic); IPNT cgs0, cge0, gs0, ge0; // cerr<<"ra+a\n"; ra_a_gse(&((w.model).ld_c._s[0]),gs0,ge0); ra_gse(&((w.model).ld_c._s[0]),cgs0,cge0); EXPECT_EQ(0,gs0[0]); EXPECT_EQ(415,ge0[0]); EXPECT_EQ(0,gs0[1]); EXPECT_EQ(799,ge0[1]); EXPECT_EQ(0,cgs0[0]); EXPECT_EQ(415,cge0[0]); EXPECT_EQ(0,cgs0[1]); EXPECT_EQ(799,cge0[1]); IPNT cgs1, cge1, gs1, ge1; ra_a_gse(&((w.model).ld_c._s[1]),gs1,ge1); ra_gse(&((w.model).ld_c._s[1]),cgs1,cge1); EXPECT_EQ(-3,gs1[0]); EXPECT_EQ(418,ge1[0]); EXPECT_EQ(-3,gs1[1]); EXPECT_EQ(802,ge1[1]); EXPECT_EQ(1,cgs1[0]); EXPECT_EQ(414,cge1[0]); EXPECT_EQ(1,cgs1[1]); EXPECT_EQ(798,cge1[1]); IPNT cgs2, cge2, gs2, ge2; ra_a_gse(&((w.model).ld_c._s[2]),gs2,ge2); ra_gse(&((w.model).ld_c._s[2]),cgs2,cge2); EXPECT_EQ(-3,gs2[0]); EXPECT_EQ(418,ge2[0]); EXPECT_EQ(-3,gs2[1]); EXPECT_EQ(802,ge2[1]); EXPECT_EQ(1,cgs2[0]); EXPECT_EQ(414,cge2[0]); EXPECT_EQ(1,cgs2[1]); EXPECT_EQ(798,cge2[1]); delete wt; ps_delete(&par); fclose(stream); #ifndef GTEST_VERBOSE #endif } catch (RVLException & e) { e.write(cerr); exit(1); } } TEST_F(ACDSetupTest, iwavetree_2D_serial_order0_axis_swap) { try { // fake command line environment int argc = 2; char * argvv = new char[128]; char ** argv = new char*[2]; argv[0]=&(argvv[0]); argv[1]=&(argvv[65]); strcpy(argv[1],"par=parfile"); PARARRAY * par = NULL; FILE * stream = NULL; IWaveEnvironment(argc, argv, 0, &par, &stream); delete [] argv; delete [] argvv; // modify - set csq=csq1.rsf ps_slcstring(*par,"csq","csq1.rsf"); // build order zero IWaveTree, check int order=0; IWaveTree * wt = new IWaveTree(*par,stream,ic,order); IWAVE & w = *(wt->getStateArray()[0]); iwave_printf(&w, par, stream,ic); IPNT cgs0, cge0, gs0, ge0; ra_a_gse(&((w.model).ld_c._s[0]),gs0,ge0); ra_gse(&((w.model).ld_c._s[0]),cgs0,cge0); EXPECT_EQ(0,gs0[1]); EXPECT_EQ(415,ge0[1]); EXPECT_EQ(0,gs0[0]); EXPECT_EQ(799,ge0[0]); EXPECT_EQ(0,cgs0[1]); EXPECT_EQ(415,cge0[1]); EXPECT_EQ(0,cgs0[0]); EXPECT_EQ(799,cge0[0]); IPNT cgs1, cge1, gs1, ge1; ra_a_gse(&((w.model).ld_c._s[1]),gs1,ge1); ra_gse(&((w.model).ld_c._s[1]),cgs1,cge1); EXPECT_EQ(-3,gs1[1]); EXPECT_EQ(418,ge1[1]); EXPECT_EQ(-3,gs1[0]); EXPECT_EQ(802,ge1[0]); EXPECT_EQ(1,cgs1[1]); EXPECT_EQ(414,cge1[1]); EXPECT_EQ(1,cgs1[0]); EXPECT_EQ(798,cge1[0]); IPNT cgs2, cge2, gs2, ge2; ra_a_gse(&((w.model).ld_c._s[2]),gs2,ge2); ra_gse(&((w.model).ld_c._s[2]),cgs2,cge2); EXPECT_EQ(-3,gs2[1]); EXPECT_EQ(418,ge2[1]); EXPECT_EQ(-3,gs2[0]); EXPECT_EQ(802,ge2[0]); EXPECT_EQ(1,cgs2[1]); EXPECT_EQ(414,cge2[1]); EXPECT_EQ(1,cgs2[0]); EXPECT_EQ(798,cge2[0]); delete wt; ps_delete(&par); fclose(stream); #ifndef GTEST_VERBOSE #endif } catch (RVLException & e) { e.write(cerr); exit(1); } } TEST_F(ACDSetupTest, iwavetree_2D_serial_order0_extend_shotrecord) { try { // fake command line environment int argc = 2; char * argvv = new char[128]; char ** argv = new char*[2]; argv[0]=&(argvv[0]); argv[1]=&(argvv[65]); strcpy(argv[1],"par=parfile"); PARARRAY * par = NULL; FILE * stream = NULL; IWaveEnvironment(argc, argv, 0, &par, &stream); delete [] argv; delete [] argvv; // modify - set csq=csq2.rsf ps_slcstring(*par,"csq","csq2.rsf"); // build order zero IWaveTree, check int order=0; IWaveTree * wt = new IWaveTree(*par,stream,ic,order); IWAVE & w = *(wt->getStateArray()[0]); iwave_printf(&w, par, stream,ic); int ndim0; IPNT cgs0, cge0, gs0, ge0; ra_ndim(&((w.model).ld_c._s[0]),&ndim0); ra_a_gse(&((w.model).ld_c._s[0]),gs0,ge0); ra_gse(&((w.model).ld_c._s[0]),cgs0,cge0); EXPECT_EQ(2,ndim0); EXPECT_EQ(0,gs0[0]); EXPECT_EQ(415,ge0[0]); EXPECT_EQ(0,gs0[1]); EXPECT_EQ(799,ge0[1]); EXPECT_EQ(0,cgs0[0]); EXPECT_EQ(415,cge0[0]); EXPECT_EQ(0,cgs0[1]); EXPECT_EQ(799,cge0[1]); int ndim1; IPNT cgs1, cge1, gs1, ge1; ra_ndim(&((w.model).ld_c._s[1]),&ndim1); ra_a_gse(&((w.model).ld_c._s[1]),gs1,ge1); ra_gse(&((w.model).ld_c._s[1]),cgs1,cge1); EXPECT_EQ(2,ndim1); EXPECT_EQ(-3,gs1[0]); EXPECT_EQ(418,ge1[0]); EXPECT_EQ(-3,gs1[1]); EXPECT_EQ(802,ge1[1]); EXPECT_EQ(1,cgs1[0]); EXPECT_EQ(414,cge1[0]); EXPECT_EQ(1,cgs1[1]); EXPECT_EQ(798,cge1[1]); IPNT cgs2, cge2, gs2, ge2; ra_a_gse(&((w.model).ld_c._s[2]),gs2,ge2); ra_gse(&((w.model).ld_c._s[2]),cgs2,cge2); EXPECT_EQ(-3,gs2[0]); EXPECT_EQ(418,ge2[0]); EXPECT_EQ(-3,gs2[1]); EXPECT_EQ(802,ge2[1]); EXPECT_EQ(1,cgs2[0]); EXPECT_EQ(414,cge2[0]); EXPECT_EQ(1,cgs2[1]); EXPECT_EQ(798,cge2[1]); delete wt; ps_delete(&par); fclose(stream); #ifndef GTEST_VERBOSE #endif } catch (RVLException & e) { e.write(cerr); exit(1); } } TEST_F(ACDSetupTest, iwavetree_2D_serial_order0_extend_internal) { try { // fake command line environment int argc = 2; char * argvv = new char[128]; char ** argv = new char*[2]; argv[0]=&(argvv[0]); argv[1]=&(argvv[65]); strcpy(argv[1],"par=parfile"); PARARRAY * par = NULL; FILE * stream = NULL; IWaveEnvironment(argc, argv, 0, &par, &stream); delete [] argv; delete [] argvv; // modify - set csq=csq3.rsf ps_slcstring(*par,"csq","csq3.rsf"); // build order zero IWaveTree, check int order=0; IWaveTree * wt = new IWaveTree(*par,stream,ic,order); IWAVE & w = *(wt->getStateArray()[0]); iwave_printf(&w, par, stream,ic); int ndim0; IPNT cgs0, cge0, gs0, ge0; ra_ndim(&((w.model).ld_c._s[0]),&ndim0); ra_a_gse(&((w.model).ld_c._s[0]),gs0,ge0); ra_gse(&((w.model).ld_c._s[0]),cgs0,cge0); EXPECT_EQ(3,ndim0); EXPECT_EQ(0,gs0[2]); EXPECT_EQ(2,ge0[2]); EXPECT_EQ(0,gs0[0]); EXPECT_EQ(415,ge0[0]); EXPECT_EQ(0,gs0[1]); EXPECT_EQ(799,ge0[1]); EXPECT_EQ(0,cgs0[2]); EXPECT_EQ(2,cge0[2]); EXPECT_EQ(0,cgs0[0]); EXPECT_EQ(415,cge0[0]); EXPECT_EQ(0,cgs0[1]); EXPECT_EQ(799,cge0[1]); int ndim1; IPNT cgs1, cge1, gs1, ge1; ra_ndim(&((w.model).ld_c._s[1]),&ndim1); ra_a_gse(&((w.model).ld_c._s[1]),gs1,ge1); ra_gse(&((w.model).ld_c._s[1]),cgs1,cge1); EXPECT_EQ(2,ndim1); EXPECT_EQ(-3,gs1[0]); EXPECT_EQ(418,ge1[0]); EXPECT_EQ(-3,gs1[1]); EXPECT_EQ(802,ge1[1]); EXPECT_EQ(1,cgs1[0]); EXPECT_EQ(414,cge1[0]); EXPECT_EQ(1,cgs1[1]); EXPECT_EQ(798,cge1[1]); IPNT cgs2, cge2, gs2, ge2; ra_a_gse(&((w.model).ld_c._s[2]),gs2,ge2); ra_gse(&((w.model).ld_c._s[2]),cgs2,cge2); EXPECT_EQ(-3,gs2[0]); EXPECT_EQ(418,ge2[0]); EXPECT_EQ(-3,gs2[1]); EXPECT_EQ(802,ge2[1]); EXPECT_EQ(1,cgs2[0]); EXPECT_EQ(414,cge2[0]); EXPECT_EQ(1,cgs2[1]); EXPECT_EQ(798,cge2[1]); delete wt; ps_delete(&par); fclose(stream); #ifndef GTEST_VERBOSE #endif } catch (RVLException & e) { e.write(cerr); exit(1); } } TEST_F(ACDSetupTest, iwavetree_2D_serial_order1) { try { // fake command line environment int argc = 2; char * argvv = new char[128]; char ** argv = new char*[2]; argv[0]=&(argvv[0]); argv[1]=&(argvv[65]); strcpy(argv[1],"par=parfile"); PARARRAY * par = NULL; FILE * stream = NULL; IWaveEnvironment(argc, argv, 0, &par, &stream); delete [] argv; delete [] argvv; // build order zero IWaveTree, check int order=1; IWaveTree * wt = new IWaveTree(*par,stream,ic,order); IWAVE & w = *(wt->getStateArray()[1]); iwave_printf(&w, par, stream,ic); IPNT cgs0, cge0, gs0, ge0; ra_a_gse(&((w.model).ld_c._s[0]),gs0,ge0); ra_gse(&((w.model).ld_c._s[0]),cgs0,cge0); EXPECT_EQ(0,gs0[0]); EXPECT_EQ(415,ge0[0]); EXPECT_EQ(0,gs0[1]); EXPECT_EQ(799,ge0[1]); EXPECT_EQ(0,cgs0[0]); EXPECT_EQ(415,cge0[0]); EXPECT_EQ(0,cgs0[1]); EXPECT_EQ(799,cge0[1]); IPNT cgs1, cge1, gs1, ge1; ra_a_gse(&((w.model).ld_c._s[1]),gs1,ge1); ra_gse(&((w.model).ld_c._s[1]),cgs1,cge1); EXPECT_EQ(-3,gs1[0]); EXPECT_EQ(418,ge1[0]); EXPECT_EQ(-3,gs1[1]); EXPECT_EQ(802,ge1[1]); EXPECT_EQ(1,cgs1[0]); EXPECT_EQ(414,cge1[0]); EXPECT_EQ(1,cgs1[1]); EXPECT_EQ(798,cge1[1]); IPNT cgs2, cge2, gs2, ge2; ra_a_gse(&((w.model).ld_c._s[2]),gs2,ge2); ra_gse(&((w.model).ld_c._s[2]),cgs2,cge2); EXPECT_EQ(-3,gs2[0]); EXPECT_EQ(418,ge2[0]); EXPECT_EQ(-3,gs2[1]); EXPECT_EQ(802,ge2[1]); EXPECT_EQ(1,cgs2[0]); EXPECT_EQ(414,cge2[0]); EXPECT_EQ(1,cgs2[1]); EXPECT_EQ(798,cge2[1]); delete wt; ps_delete(&par); fclose(stream); #ifndef GTEST_VERBOSE #endif } catch (RVLException & e) { e.write(cerr); exit(1); } } TEST_F(ACDSetupTest, isample_construct_rsf_input) { try { // fake command line environment int argc = 2; char * argvv = new char[128]; char ** argv = new char*[2]; argv[0]=&(argvv[0]); argv[1]=&(argvv[65]); strcpy(argv[1],"par=parfile"); PARARRAY * par = NULL; FILE * stream = NULL; IWaveEnvironment(argc, argv, 0, &par, &stream); delete [] argv; delete [] argvv; IWAVE w; if (int err = iwave_construct(&w,par,stream,ic)) { RVLException e; e<<"Error: ACDSetupTest - isample_construct_rsf_input\n"; e<<" error from iwave_construct = "< t; // step 1: create list of i/o tasks IOTask(t,order,fwd,ic); IWaveTree * wt = new IWaveTree(*par,stream,ic,order); for (int it=0; itkeyword<getStateArray()[0], t[it]->keyword, *par, stream); // note these are internal simulation axes, not archival, // which will require some re-arranging in traceio for (int i=0;igetNumAxes();i++) { // cerr<<"axis "<getAxis(i)); if (!grid_union(&g,&(tmp->getAxis(i)))) { RVLException e; e<<"Error: IWaveSim constructor from grid_union\n"; fprintf(stream,"Error: IWaveSim constructor from grid_union\n"); fprintf(stream," failed to add these axes:\n"); for (int j=0;jgetNumAxes(); j++) fprint_axis(stream,tmp->getAxis(j)); fprintf(stream," to grid:\n"); fprint_grid(stream,g); throw e; } } // for this test no need to build sampler vector // s.push_back(tmp); delete tmp; } EXPECT_EQ(4,g.gdim); EXPECT_EQ(416,g.axes[0].n); EXPECT_EQ(25.0,g.axes[0].d); EXPECT_EQ(0.0,g.axes[0].o); EXPECT_EQ(0,g.axes[0].id); EXPECT_EQ(800,g.axes[1].n); EXPECT_EQ(25.0,g.axes[1].d); EXPECT_EQ(0.0,g.axes[1].o); EXPECT_EQ(1,g.axes[1].id); EXPECT_EQ(284,g.axes[2].n); EXPECT_GT(1.e-6,fabs(g.axes[2].d-1.767767)); EXPECT_GT(1.e-4,fabs(-100.7627-g.axes[2].o)); EXPECT_EQ(2,g.axes[2].id); EXPECT_EQ(3,g.axes[3].n); EXPECT_EQ(1.0,g.axes[3].d); EXPECT_EQ(0.0,g.axes[3].o); EXPECT_EQ(3,g.axes[3].id); delete wt; ps_delete(&par); fclose(stream); } catch (RVLException & e) { e.write(cerr); exit(1); } } TEST_F(ACDSetupTest, spacetime_grid_build_axis_swap) { try { // fake command line environment int argc = 2; char * argvv = new char[128]; char ** argv = new char*[2]; argv[0]=&(argvv[0]); argv[1]=&(argvv[65]); strcpy(argv[1],"par=parfile"); PARARRAY * par = NULL; FILE * stream = NULL; IWaveEnvironment(argc, argv, 0, &par, &stream); delete [] argv; delete [] argvv; // modify - set csq=csq1.rsf ps_slcstring(*par,"csq","csq1.rsf"); // build order zero IWaveTree, check int order=0; bool fwd = true; // initialize grid grid g; init_default_grid(&g); // iotask list std::vector t; // step 1: create list of i/o tasks IOTask(t,order,fwd,ic); IWaveTree * wt = new IWaveTree(*par,stream,ic,order); for (int it=0; itkeyword<getStateArray()[0], t[it]->keyword, *par, stream); // note these are internal simulation axes, not archival, // which will require some re-arranging in traceio for (int i=0;igetNumAxes();i++) { // cerr<<"axis "<getAxis(i)); if (!grid_union(&g,&(tmp->getAxis(i)))) { RVLException e; e<<"Error: IWaveSim constructor from grid_union\n"; fprintf(stream,"Error: IWaveSim constructor from grid_union\n"); fprintf(stream," failed to add these axes:\n"); for (int j=0;jgetNumAxes(); j++) fprint_axis(stream,tmp->getAxis(j)); fprintf(stream," to grid:\n"); fprint_grid(stream,g); throw e; } } // cerr<<"grid"< t; // step 1: create list of i/o tasks IOTask(t,order,fwd,ic); IWaveTree * wt = new IWaveTree(*par,stream,ic,order); for (int it=0; itkeyword<getStateArray()[0], t[it]->keyword, *par, stream); // note these are internal simulation axes, not archival, // which will require some re-arranging in traceio for (int i=0;igetNumAxes();i++) { // cerr<<"axis "<getAxis(i)); if (!grid_union(&g,&(tmp->getAxis(i)))) { RVLException e; e<<"Error: IWaveSim constructor from grid_union\n"; fprintf(stream,"Error: IWaveSim constructor from grid_union\n"); fprintf(stream," failed to add these axes:\n"); for (int j=0;jgetNumAxes(); j++) fprint_axis(stream,tmp->getAxis(j)); fprintf(stream," to grid:\n"); fprint_grid(stream,g); throw e; } } // for this test no need to build sampler vector // s.push_back(tmp); delete tmp; } EXPECT_EQ(4,g.gdim); EXPECT_EQ(416,g.axes[0].n); EXPECT_EQ(25.0,g.axes[0].d); EXPECT_EQ(0.0,g.axes[0].o); EXPECT_EQ(0,g.axes[0].id); EXPECT_EQ(800,g.axes[1].n); EXPECT_EQ(25.0,g.axes[1].d); EXPECT_EQ(0.0,g.axes[1].o); EXPECT_EQ(1,g.axes[1].id); EXPECT_EQ(284,g.axes[2].n); EXPECT_GT(1.e-6,fabs(g.axes[2].d-1.767767)); EXPECT_GT(1.e-4,fabs(-100.7627-g.axes[2].o)); EXPECT_EQ(2,g.axes[2].id); EXPECT_EQ(3,g.axes[3].n); EXPECT_EQ(1.0,g.axes[3].d); EXPECT_EQ(0.0,g.axes[3].o); EXPECT_EQ(3,g.axes[3].id); delete wt; ps_delete(&par); fclose(stream); } catch (RVLException & e) { e.write(cerr); exit(1); } } TEST_F(ACDSetupTest, spacetime_grid_build_extend_internal) { try { // fake command line environment int argc = 2; char * argvv = new char[128]; char ** argv = new char*[2]; argv[0]=&(argvv[0]); argv[1]=&(argvv[65]); strcpy(argv[1],"par=parfile"); PARARRAY * par = NULL; FILE * stream = NULL; IWaveEnvironment(argc, argv, 0, &par, &stream); delete [] argv; delete [] argvv; // modify - set csq=csq3.rsf ps_slcstring(*par,"csq","csq3.rsf"); // ps_printall(*par,stderr); // build order zero IWaveTree, check int order=0; bool fwd = true; // initialize grid grid g; init_default_grid(&g); // iotask list std::vector t; // step 1: create list of i/o tasks IOTask(t,order,fwd,ic); IWaveTree * wt = new IWaveTree(*par,stream,ic,order); for (int it=0; itkeyword<getStateArray()[0], t[it]->keyword, *par, stream); // note these are internal simulation axes, not archival, // which will require some re-arranging in traceio for (int i=0;igetNumAxes();i++) { cerr<<"step it="<keyword<<" testing axis "<getAxis(i)); if (!grid_union(&g,&(tmp->getAxis(i)))) { RVLException e; e<<"Error: IWaveSim constructor from grid_union\n"; fprintf(stream,"Error: IWaveSim constructor from grid_union\n"); fprintf(stream," failed to add these axes:\n"); for (int j=0;jgetNumAxes(); j++) fprint_axis(stream,tmp->getAxis(j)); fprintf(stream," to grid:\n"); fprint_grid(stream,g); throw e; } } // for this test no need to build sampler vector // s.push_back(tmp); delete tmp; cerr<<"after grid build step "<write(cerr); #endif string tstr = "IWaveSim forward simulator\n derivative order = 0\n number of dynamic arrays in each RDOM = 2\n number of i/o tasks = 3\n"; stringstream ostr; sim->write(ostr); EXPECT_EQ(tstr,ostr.str()); delete sim; ps_delete(&par); fclose(stream); } catch (RVLException & e) { e.write(cerr); exit(1); } } TEST_F(ACDSetupTest, construct_sim_fwd_order0_movie) { try { // fake command line environment int argc = 2; char * argvv = new char[128]; char ** argv = new char*[2]; argv[0]=&(argvv[0]); argv[1]=&(argvv[65]); strcpy(argv[1],"par=initfile"); PARARRAY * par = NULL; FILE * stream = NULL; IWaveEnvironment(argc, argv, 0, &par, &stream); delete [] argv; delete [] argvv; // ps_slcstring(*par,"movie","movie.rsf"); // build order zero IWaveTree, check int order=0; bool fwd = true; int printact=0; int snaps=0; IWaveSim * sim = new IWaveSim(order,fwd,*par,stream,ic,printact); #ifdef GTEST_VERBOSE sim->write(cerr); #endif string tstr = "IWaveSim forward simulator\n derivative order = 0\n number of dynamic arrays in each RDOM = 2\n number of i/o tasks = 3\n"; stringstream ostr; sim->write(ostr); EXPECT_EQ(tstr,ostr.str()); delete sim; ps_delete(&par); fclose(stream); } catch (RVLException & e) { e.write(cerr); exit(1); } } TEST_F(ACDSetupTest, construct_sim_fwd_order1) { try { // fake command line environment int argc = 2; char * argvv = new char[128]; char ** argv = new char*[2]; argv[0]=&(argvv[0]); argv[1]=&(argvv[65]); strcpy(argv[1],"par=parfile"); PARARRAY * par = NULL; FILE * stream = NULL; IWaveEnvironment(argc, argv, 0, &par, &stream); delete [] argv; delete [] argvv; // build order zero IWaveTree, check int order=1; bool fwd = true; int printact=0; int snaps=0; IWaveSim * sim = new IWaveSim(order,fwd,*par,stream,ic,printact); #ifdef GTEST_VERBOSE sim->write(cerr); #endif string tstr = "IWaveSim forward simulator\n derivative order = 1\n number of dynamic arrays in each RDOM = 2\n number of i/o tasks = 4\n"; stringstream ostr; sim->write(ostr); EXPECT_EQ(tstr,ostr.str()); delete sim; ps_delete(&par); fclose(stream); } catch (RVLException & e) { e.write(cerr); exit(1); } } TEST_F(ACDSetupTest, construct_sim_adj_order01) { try { // fake command line environment int argc = 2; char * argvv = new char[128]; char ** argv = new char*[2]; argv[0]=&(argvv[0]); argv[1]=&(argvv[65]); strcpy(argv[1],"par=parfile"); PARARRAY * par = NULL; FILE * stream = NULL; IWaveEnvironment(argc, argv, 0, &par, &stream); delete [] argv; delete [] argvv; // build order zero IWaveTree, check bool fwd = false; stringstream err1; stringstream err2; stringstream err3; try { int order=0; int printact=0; int snaps=0; IWaveSim * sim = new IWaveSim(order,fwd,*par,stream,ic,printact); delete sim; } catch (RVLException & e) { e.write(err1); } try { int order=0; int printact=0; int snaps=1; IWaveSim * sim = new IWaveSim(order,fwd,*par,stream,ic,printact); delete sim; } catch (RVLException & e) { e.write(err2); } try { int order=1; int printact=0; int snaps=0; IWaveSim * sim = new IWaveSim(order,fwd,*par,stream,ic,printact); delete sim; } catch (RVLException & e) { e.write(err3); } string terr1 = "Error: IWaveSim constructor\n adjoint mode (fwd=false):\n must provide positive number of \n storage units for checkpoints (argument \"snaps\")\n however snaps = 0\n does not make sense for reference simulation (order=0)\n order supplied in argument list = 0\n\ncalled from IWaveSim constructor\n\n"; string terr2 = "Error: IWaveSim constructor\n adjoint mode (fwd=false):\n does not make sense for reference simulation (order=0)\n order supplied in argument list = 0\n\ncalled from IWaveSim constructor\n\n"; string terr3 = "Error: IWaveSim constructor\n adjoint mode (fwd=false):\n must provide positive number of \n storage units for checkpoints (argument \"snaps\")\n however snaps = 0\n\ncalled from IWaveSim constructor\n\n"; EXPECT_EQ(terr1,err1.str()); EXPECT_EQ(terr2,err2.str()); EXPECT_EQ(terr3,err3.str()); int order=1; int printact=0; int snaps=5; IWaveSim * sim = new IWaveSim(order,fwd,*par,stream,ic,printact); #ifdef GTEST_VERBOSE sim->write(cerr); #endif string tstr = "IWaveSim adjoint simulator\n derivative order = 1\n number of dynamic arrays in each RDOM = 2\n number of i/o tasks = 4\n number of checkpoint states = 5\n number of checkpoint RARRs = 10\n"; stringstream ostr; sim->write(ostr); EXPECT_EQ(tstr,ostr.str()); delete sim; ps_delete(&par); fclose(stream); } catch (RVLException & e) { e.write(cerr); exit(1); } } TEST_F(ACDSetupTest, construct_sim_fwd_order2) { try { // fake command line environment int argc = 2; char * argvv = new char[128]; char ** argv = new char*[2]; argv[0]=&(argvv[0]); argv[1]=&(argvv[65]); strcpy(argv[1],"par=parfile"); PARARRAY * par = NULL; FILE * stream = NULL; IWaveEnvironment(argc, argv, 0, &par, &stream); delete [] argv; delete [] argvv; // build order zero IWaveTree, check int order=2; bool fwd = true; int printact=0; int snaps=0; IWaveSim * sim = new IWaveSim(order,fwd,*par,stream,ic,printact); #ifdef GTEST_VERBOSE sim->write(cerr); #endif string tstr = "IWaveSim forward simulator\n derivative order = 2\n number of dynamic arrays in each RDOM = 2\n number of i/o tasks = 5\n"; stringstream ostr; sim->write(ostr); EXPECT_EQ(tstr,ostr.str()); delete sim; ps_delete(&par); fclose(stream); } catch (RVLException & e) { e.write(cerr); exit(1); } } TEST_F(ACDSetupTest, construct_sim_adj_order2) { try { // fake command line environment int argc = 2; char * argvv = new char[128]; char ** argv = new char*[2]; argv[0]=&(argvv[0]); argv[1]=&(argvv[65]); strcpy(argv[1],"par=parfile"); PARARRAY * par = NULL; FILE * stream = NULL; IWaveEnvironment(argc, argv, 0, &par, &stream); delete [] argv; delete [] argvv; // build order zero IWaveTree, check int order=2; bool fwd = false; int printact=0; int snaps=5; IWaveSim * sim = new IWaveSim(order,fwd,*par,stream,ic,printact); #ifdef GTEST_VERBOSE sim->write(cerr); #endif string tstr = "IWaveSim adjoint simulator\n derivative order = 2\n number of dynamic arrays in each RDOM = 2\n number of i/o tasks = 5\n number of checkpoint states = 5\n number of checkpoint RARRs = 20\n"; stringstream ostr; sim->write(ostr); EXPECT_EQ(tstr,ostr.str()); delete sim; ps_delete(&par); fclose(stream); } catch (RVLException & e) { e.write(cerr); exit(1); } } TEST_F(ACDSetupTest, dryrun_sim_fwd_ord0) { try { // fake command line environment int argc = 2; char * argvv = new char[128]; char ** argv = new char*[2]; argv[0]=&(argvv[0]); argv[1]=&(argvv[65]); strcpy(argv[1],"par=parfile"); PARARRAY * par = NULL; FILE * stream = NULL; IWaveEnvironment(argc, argv, 0, &par, &stream); delete [] argv; delete [] argvv; // build order zero IWaveTree, check int order=0; bool fwd = true; int printact=0; int snaps=0; bool dryrun=true; ofstream drystr("dryrun_sim_fwd_ord0"); IWaveSim * sim = new IWaveSim(order,fwd,*par,stream,ic,printact,snaps,dryrun,drystr,cerr); sim->run(); drystr.close(); delete sim; ps_delete(&par); fclose(stream); } catch (RVLException & e) { e.write(cerr); exit(1); } } TEST_F(ACDSetupTest, dryrun_sim_fwd_ord0_swapxz) { try { // fake command line environment int argc = 2; char * argvv = new char[128]; char ** argv = new char*[2]; argv[0]=&(argvv[0]); argv[1]=&(argvv[65]); strcpy(argv[1],"par=parfile"); PARARRAY * par = NULL; FILE * stream = NULL; IWaveEnvironment(argc, argv, 0, &par, &stream); delete [] argv; delete [] argvv; ps_slcstring(*par,"csq","csq1.rsf"); // build order zero IWaveTree, check int order=0; bool fwd = true; int printact=0; int snaps=0; bool dryrun=true; ofstream drystr("dryrun_sim_fwd_ord0_swapxz"); IWaveSim * sim = new IWaveSim(order,fwd,*par,stream,ic,printact,snaps,dryrun,drystr); sim->run(); drystr.close(); delete sim; ps_delete(&par); fclose(stream); } catch (RVLException & e) { e.write(cerr); exit(1); } } TEST_F(ACDSetupTest, dryrun_sim_fwd_ord0_extend_shotrecord) { try { // fake command line environment int argc = 2; char * argvv = new char[128]; char ** argv = new char*[2]; argv[0]=&(argvv[0]); argv[1]=&(argvv[65]); strcpy(argv[1],"par=parfile"); PARARRAY * par = NULL; FILE * stream = NULL; IWaveEnvironment(argc, argv, 0, &par, &stream); delete [] argv; delete [] argvv; ps_slcstring(*par,"csq","csq2.rsf"); // build order zero IWaveTree, check int order=0; bool fwd = true; int printact=0; int snaps=0; bool dryrun=true; ofstream drystr("dryrun_sim_fwd_ord0_ext_sx"); IWaveSim * sim = new IWaveSim(order,fwd,*par,stream,ic,printact,snaps,dryrun,drystr); sim->run(); drystr.close(); delete sim; ps_delete(&par); fclose(stream); } catch (RVLException & e) { e.write(cerr); exit(1); } } TEST_F(ACDSetupTest, dryrun_sim_fwd_ord0_movie) { try { // fake command line environment int argc = 2; char * argvv = new char[128]; char ** argv = new char*[2]; argv[0]=&(argvv[0]); argv[1]=&(argvv[65]); strcpy(argv[1],"par=initfile"); PARARRAY * par = NULL; FILE * stream = NULL; IWaveEnvironment(argc, argv, 0, &par, &stream); delete [] argv; delete [] argvv; // build order zero IWaveTree, check int order=0; bool fwd = true; int printact=0; int snaps=0; bool dryrun=true; ofstream drystr("dryrun_sim_fwd_ord0_movie"); IWaveSim * sim = new IWaveSim(order,fwd,*par,stream,ic,printact,snaps,dryrun,drystr); sim->run(); drystr.close(); delete sim; ps_delete(&par); fclose(stream); } catch (RVLException & e) { e.write(cerr); exit(1); } } TEST_F(ACDSetupTest, dryrun_sim_fwd_ord0_init) { try { // cerr<<"dryrun_sim_fwd_ord0_init"<IWaveEnv"<IWaveSim constr"<IWaveSim run"<run(); drystr.close(); delete sim; ps_delete(&par); fclose(stream); } catch (RVLException & e) { e.write(cerr); exit(1); } } TEST_F(ACDSetupTest, dryrun_sim_fwd_ord1) { try { // fake command line environment int argc = 2; char * argvv = new char[128]; char ** argv = new char*[2]; argv[0]=&(argvv[0]); argv[1]=&(argvv[65]); strcpy(argv[1],"par=parfile"); PARARRAY * par = NULL; FILE * stream = NULL; IWaveEnvironment(argc, argv, 0, &par, &stream); delete [] argv; delete [] argvv; // build order zero IWaveTree, check int order=1; bool fwd = true; int printact=0; int snaps=0; bool dryrun=true; ofstream drystr("dryrun_sim_fwd_ord1"); IWaveSim * sim = new IWaveSim(order,fwd,*par,stream,ic,printact,snaps,dryrun,drystr); sim->run(); drystr.close(); delete sim; ps_delete(&par); fclose(stream); } catch (RVLException & e) { e.write(cerr); exit(1); } } TEST_F(ACDSetupTest, dryrun_sim_adj_ord1) { try { // fake command line environment int argc = 2; char * argvv = new char[128]; char ** argv = new char*[2]; argv[0]=&(argvv[0]); argv[1]=&(argvv[65]); strcpy(argv[1],"par=parfile"); PARARRAY * par = NULL; FILE * stream = NULL; IWaveEnvironment(argc, argv, 0, &par, &stream); delete [] argv; delete [] argvv; // build order zero IWaveTree, check int order=1; bool fwd = false; int printact=0; int snaps=5; bool dryrun=true; ofstream drystr("dryrun_sim_adj_ord1"); IWaveSim * sim = new IWaveSim(order,fwd,*par,stream,ic,printact,snaps,dryrun,drystr); sim->run(); drystr.close(); delete sim; ps_delete(&par); fclose(stream); } catch (RVLException & e) { e.write(cerr); exit(1); } } TEST_F(ACDSetupTest, dryrun_sim_fwd_ord2) { try { // fake command line environment int argc = 2; char * argvv = new char[128]; char ** argv = new char*[2]; argv[0]=&(argvv[0]); argv[1]=&(argvv[65]); strcpy(argv[1],"par=parfile"); PARARRAY * par = NULL; FILE * stream = NULL; IWaveEnvironment(argc, argv, 0, &par, &stream); delete [] argv; delete [] argvv; // build order zero IWaveTree, check int order=2; bool fwd = true; int printact=0; int snaps=0; bool dryrun=true; ofstream drystr("dryrun_sim_fwd_ord2"); IWaveSim * sim = new IWaveSim(order,fwd,*par,stream,ic,printact,snaps,dryrun,drystr); sim->run(); drystr.close(); delete sim; ps_delete(&par); fclose(stream); } catch (RVLException & e) { e.write(cerr); exit(1); } } TEST_F(ACDSetupTest, dryrun_sim_adj_ord2) { try { // fake command line environment int argc = 2; char * argvv = new char[128]; char ** argv = new char*[2]; argv[0]=&(argvv[0]); argv[1]=&(argvv[65]); strcpy(argv[1],"par=parfile"); PARARRAY * par = NULL; FILE * stream = NULL; IWaveEnvironment(argc, argv, 0, &par, &stream); delete [] argv; delete [] argvv; // build order zero IWaveTree, check int order=2; bool fwd = false; int printact=0; int snaps=5; bool dryrun=true; ofstream drystr("dryrun_sim_adj_ord2"); IWaveSim * sim = new IWaveSim(order,fwd,*par,stream,ic,printact,snaps,dryrun,drystr); sim->run(); drystr.close(); delete sim; ps_delete(&par); fclose(stream); } catch (RVLException & e) { e.write(cerr); exit(1); } } TEST_F(ACDSetupTest, dryrun_sim_fwd_ord0_extend_internal) { try { // fake command line environment int argc = 2; char * argvv = new char[128]; char ** argv = new char*[2]; argv[0]=&(argvv[0]); argv[1]=&(argvv[65]); strcpy(argv[1],"par=parfile"); PARARRAY * par = NULL; FILE * stream = NULL; IWaveEnvironment(argc, argv, 0, &par, &stream); delete [] argv; delete [] argvv; ps_slcstring(*par,"csq","csq3.rsf"); // build order zero IWaveTree, check int order=0; bool fwd = true; int printact=0; int snaps=0; bool dryrun=true; ofstream drystr("dryrun_sim_fwd_ord0_hx"); IWaveSim * sim = new IWaveSim(order,fwd,*par,stream,ic,printact,snaps,dryrun,drystr); sim->run(); drystr.close(); delete sim; ps_delete(&par); fclose(stream); } catch (RVLException & e) { e.write(cerr); exit(1); } } } #include "main.h"