/* Two readers aquire a read-lock, one writer attempts a write block, the readers release their locks, the writer gets the lock. */ void tst_QSystemReadWriteLock::multipleReadersBlockRelease() { bool print = false; QSystemReadWriteLock testLock("Viper", QSystemReadWriteLock::Create); release = false; writeThreadStarted = false; writeThreadDone = false; ReadLockReleaseableThread rlt1(print); ReadLockReleaseableThread rlt2(print); rlt1.start(); rlt2.start(); QTest::qSleep(1000); WriteLockThread wlt(print); wlt.start(); QTest::qSleep(1000); QVERIFY(writeThreadStarted); QVERIFY(!writeThreadDone); QVERIFY(wlt.isRunning()); QVERIFY(rlt1.isRunning()); QVERIFY(rlt2.isRunning()); release = true; QVERIFY(wlt.wait()); QVERIFY(rlt1.wait(2000)); QVERIFY(rlt2.wait(2000)); QVERIFY(writeThreadDone); }
int main(int argc, char *argv[]) { /* initialize Madagascar */ sf_init(argc, argv); Logger::instance().init("essfwi"); EssFwiParams ¶ms = EssFwiParams::instance(); int nz = params.nz; int nx = params.nx; int nb = params.nb; int ng = params.ng; int nt = params.nt; int ns = params.ns; float dt = params.dt; float fm = params.fm; float dx = params.dx; // set random seed const int seed = 10; srand(seed); ShotPosition allSrcPos(params.szbeg, params.sxbeg, params.jsz, params.jsx, ns, nz); ShotPosition allGeoPos(params.gzbeg, params.gxbeg, params.jgz, params.jgx, ng, nz); // Damp4t10d fmMethod(allSrcPos, allGeoPos, dt, dx, fm, nb, nt); Damp4t10dNotrans fmMethod(allSrcPos, allGeoPos, dt, dx, fm, nb, nt); SfVelocityReader velReader(params.vinit); Velocity v0 = SfVelocityReader::read(params.vinit, nx, nz); Velocity exvel = fmMethod.expandDomain(v0); fmMethod.bindVelocity(exvel); std::vector<float> wlt(nt); rickerWavelet(&wlt[0], nt, fm, dt, params.amp); std::vector<float> dobs(ns * nt * ng); /* all observed data */ ShotDataReader::serialRead(params.shots, &dobs[0], ns, nt, ng); // EssFwiFramework essfwi(fmMethod, wlt, dobs); EssFwiNotrans essfwi(fmMethod, wlt, dobs); for (int iter = 0; iter < params.niter; iter++) { essfwi.epoch(iter, 0); essfwi.writeVel(params.vupdates); } /// end of iteration sf_close(); return 0; }
/* writer1 acquires a write-lock, writer 2 blocks, writer1 releases the lock, writer 2 gets the lock */ void tst_QSystemReadWriteLock::writeLockBlockRelease() { bool print = false; QSystemReadWriteLock testLock("Viper"); if (print) qDebug() << "Main Thread: About to lock for writing"; testLock.lockForWrite(); if (print) qDebug() << "Main Thread: After lock for writing"; writeThreadStarted = false; writeThreadDone = false; WriteLockThread wlt(print); wlt.start(); QTest::qSleep(1000); QVERIFY(writeThreadStarted); QVERIFY(!writeThreadDone); testLock.unlock(); if (print) qDebug() << "MainThread: After unlock(write)"; QVERIFY(wlt.wait(5000)); QVERIFY(writeThreadDone); }
int main(int argc, char *argv[]) { /* initialize Madagascar */ sf_init(argc, argv); Logger::instance().init("serial-fwi"); FwiParams ¶ms = FwiParams::instance(); std::vector<float> dobs(params.ns * params.nt * params.ng); /* observed data */ std::vector<float> cg(params.nz * params.nx, 0); /* conjugate gradient */ std::vector<float> g0(params.nz * params.nx, 0); /* gradient at previous step */ std::vector<float> wlt(params.nt); /* ricker wavelet */ std::vector<float> objval(params.niter, 0); /* objective/misfit function */ /* initialize wavelet */ rickerWavelet(&wlt[0], params.nt, params.fm, params.dt, params.amp); ShotPosition allSrcPos(params.szbeg, params.sxbeg, params.jsz, params.jsx, params.ns, params.nz); ShotPosition allGeoPos(params.gzbeg, params.gxbeg, params.jgz, params.jgx, params.ng, params.nz); // read velocity Velocity v0 = SfVelocityReader::read(params.vinit, params.nx, params.nz); // read observed data ShotDataReader::serialRead(params.shots, &dobs[0], params.ns, params.nt, params.ng); EnquistAbc2d fmMethod(params.dt, params.dx, params.dz); Velocity vel = fmMethod.expandDomain(v0); float obj0 = 0; for (int iter = 0; iter < params.niter; iter++) { boost::timer::cpu_timer timer; std::vector<float> g1(params.nz * params.nx, 0); /* gradient at curret step */ std::vector<float> derr(params.ns * params.ng * params.nt, 0); /* residual/error between synthetic and observation */ std::vector<float> illum(params.nz * params.nx, 0); /* illumination of the source wavefield */ Velocity vtmp = vel; /* temporary velocity computed with epsil */ fmMethod.bindVelocity(vel); /** * calculate local objective function & derr & illum & g1(gradient) */ float obj = cal_obj_derr_illum_grad(params, &derr[0], &illum[0], &g1[0], &wlt[0], &dobs[0], fmMethod, allSrcPos, allGeoPos); DEBUG() << format("sum_derr %f, sum_illum %f, sum_g1 %f") % sum(derr) % sum(illum) % sum(g1); objval[iter] = iter == 0 ? obj0 = obj, 1.0 : obj / obj0; float epsil = 0; float beta = 0; sf_floatwrite(&illum[0], params.nz * params.nx, params.illums); scale_gradient(&g1[0], &vel.dat[0], &illum[0], params.nz, params.nx, params.precon); bell_smoothz(&g1[0], &illum[0], params.rbell, params.nz, params.nx); bell_smoothx(&illum[0], &g1[0], params.rbell, params.nz, params.nx); sf_floatwrite(&g1[0], params.nz * params.nx, params.grads); DEBUG() << format("before beta: sum_g0: %f, sum_g1: %f, sum_cg: %f") % sum(g0) % sum(g1) % sum(cg); beta = iter == 0 ? 0.0 : cal_beta(&g0[0], &g1[0], &cg[0], params.nz, params.nx); cal_conjgrad(&g1[0], &cg[0], beta, params.nz, params.nx); epsil = cal_epsilon(&vel.dat[0], &cg[0], params.nz, params.nx); cal_vtmp(&vtmp.dat[0], &vel.dat[0], &cg[0], epsil, params.nz, params.nx); std::swap(g1, g0); // let g0 be the previous gradient fmMethod.bindVelocity(vtmp); float alpha = calVelUpdateStepLen(params, &wlt[0], &dobs[0], &derr[0], epsil, fmMethod, allSrcPos, allGeoPos); update_vel(&vel.dat[0], &cg[0], alpha, params.nz, params.nx); sf_floatwrite(&vel.dat[0], params.nz * params.nx, params.vupdates); // output important information at each FWI iteration INFO() << format("iteration %d obj=%f beta=%f epsil=%f alpha=%f") % (iter + 1) % obj % beta % epsil % alpha; // INFO() << timer.format(2); } /// end of iteration sf_floatwrite(&objval[0], params.niter, params.objs); sf_close(); return 0; }