def RunAcoustic(q): Nxy = 100 tf = 0.1 # Final time direction = 0 u0_expr = Expression(\ '100*pow(x[i]-.25,2)*pow(x[i]-0.75,2)*(x[i]<=0.75)*(x[i]>=0.25)', i=direction) class LeftRight(SubDomain): def inside(self, x, on_boundary): return (x[direction] < 1e-16 or x[direction] > 1.0 - 1e-16) \ and on_boundary h = 1. / Nxy mesh = UnitSquareMesh(Nxy, Nxy, "crossed") V = FunctionSpace(mesh, 'Lagrange', q) Vl = FunctionSpace(mesh, 'Lagrange', 1) Dt = h / (q * 10.) Wave = AcousticWave({'V': V, 'Vl': Vl, 'Vr': Vl}) Wave.verbose = True Wave.lump = True Wave.set_abc(mesh, LeftRight()) Wave.update({'lambda':1.0, 'rho':1.0, 't0':0.0, 'tf':tf, 'Dt':Dt,\ 'u0init':interpolate(u0_expr, V), 'utinit':Function(V)}) sol, tmp = Wave.solve()
def run_test(): q = 3 Nxy = 100 tf = 0.1 h = 1. / Nxy mesh = UnitSquareMesh(Nxy, Nxy, "crossed") V = FunctionSpace(mesh, 'Lagrange', q) Vl = FunctionSpace(mesh, 'Lagrange', 1) Dt = h / (q * 10.) u0_expr = Expression(\ '100*pow(x[i]-.25,2)*pow(x[i]-0.75,2)*(x[i]<=0.75)*(x[i]>=0.25)', i=0) Wave = AcousticWave({'V': V, 'Vl': Vl, 'Vr': Vl}) Wave.lump = True Wave.timestepper = 'backward' Wave.update({'lambda':1.0, 'rho':1.0, 't0':0.0, 'tf':tf, 'Dt':Dt,\ 'u0init':interpolate(u0_expr, V), 'utinit':Function(V)}) K = Wave.K u = Wave.u0 u.vector()[:] = 1.0 b = Wave.u1 for ii in range(100): K * u.vector() (K * u.vector()).array() b.vector()[:] = (K * u.vector()).array() b.vector()[:] = 0.0 b.vector().axpy(1.0, K * u.vector()) b.vector()[:] = (K * u.vector()).array() + (K * u.vector()).array() b.vector()[:] = (K * u.vector() + K * u.vector()).array() b.vector()[:] = 2.*u.vector().array() + u.vector().array() + \ Dt*u.vector().array() b.vector()[:] = 0.0 b.vector().axpy(2.0, u.vector()) b.vector().axpy(1.0, u.vector()) b.vector().axpy(Dt, u.vector()) b.assign(u) b.vector().zero()
#Pt = PointSources(V, [[0.1,y_src], [0.25,y_src], [0.4,y_src],\ #[0.6,y_src], [0.75,y_src], [0.9,y_src]]) Pt = PointSources(V, [[0.1, y_src], [0.4, y_src], [0.6, y_src], [0.9, y_src]]) srcv = dl.Function(V).vector() # Boundary conditions: class ABCdom(dl.SubDomain): def inside(self, x, on_boundary): return on_boundary and (x[1] < Y) Wave = AcousticWave({ 'V': V, 'Vm': Vl }, { 'print': False, 'lumpM': True, 'timestepper': 'backward' }) Wave.set_abc(mesh, ABCdom(), lumpD=False) at, bt, ct, _, _ = targetmediumparameters(Vl, X) a0, b0, _, _, _ = initmediumparameters(Vl, X) Wave.update({'b':bt, 'a':at, 't0':0.0, 'tf':tf, 'Dt':Dt,\ 'u0init':dl.Function(V), 'utinit':dl.Function(V)}) if PRINT: print 'nb of src={}, nb of timesteps={}'.format(len(Pt.src_loc), Wave.Nt) sources, timesteps = partition_work(mpicomm_local, mpicomm_global, \ len(Pt.src_loc), Wave.Nt)
print 'Compute most accurate solution as reference' qq = 20 N = int(qq / cmin) h = 1. / N mesh = dl.UnitSquareMesh(N, N) Vl = dl.FunctionSpace(mesh, 'Lagrange', 1) Vex = dl.FunctionSpace(mesh, 'Lagrange', r) Pt = PointSources(Vex, [[.5, .5]]) mydelta = Pt[0].array() def mysrc(tt): return Ricker(tt) * mydelta Waveex = AcousticWave({'V': Vex, 'Vm': Vl}) Waveex.timestepper = 'backward' Waveex.lump = True Waveex.update({'a':1.0, 'b':1.0, 't0':0.0, 'tf':tf, 'Dt':Dt,\ 'u0init':dl.Function(Vex), 'utinit':dl.Function(Vex)}) Waveex.ftime = mysrc sol, _ = Waveex.solve() Waveex.exact = dl.Function(Vex) normex = Waveex.computeabserror() # plot myplot.set_varname('u-q' + str(qq)) plotu = dl.Function(Vex) for index, uu in enumerate(sol): if index % boolplot == 0: setfct(plotu, uu[0]) myplot.plot_vtk(plotu, index)
b_target_fn = dl.interpolate(b_target, Vm) a_target = dl.Expression(\ '1.0 + 0.4*(x[0]<=0.7)*(x[0]>=0.3)*(x[1]<=0.7)*(x[1]>=0.3)') a_target_fn = dl.interpolate(a_target, Vm) checkdt(Dt, 1. / Nxy, r, np.sqrt(2.0), False) # observation operator: obspts = [[0.0, ii/10.] for ii in range(1,10)] + \ [[1.0, ii/10.] for ii in range(1,10)] + \ [[ii/10., 0.0] for ii in range(1,10)] + \ [[ii/10., 1.0] for ii in range(1,10)] obsop = TimeObsPtwise({'V': V, 'Points': obspts}, [t0, t1, t2, tf]) # define pde operator: wavepde = AcousticWave({'V': V, 'Vm': Vm}) wavepde.timestepper = 'backward' wavepde.lump = True wavepde.update({'a':a_target_fn, 'b':b_target_fn, \ 't0':t0, 'tf':tf, 'Dt':Dt, 'u0init':dl.Function(V), 'utinit':dl.Function(V)}) # parameters Vm = wavepde.Vm V = wavepde.V lenobspts = obsop.PtwiseObs.nbPts # set up plots: filename, ext = splitext(sys.argv[0]) if isdir(filename + '/'): rmtree(filename + '/') myplot = PlotFenics(filename + str(Nxy)) myplot.set_varname('a_target')
class AllFour(SubDomain): def inside(self, x, on_boundary): return on_boundary for r in RR: V = FunctionSpace(mesh, 'Lagrange', r) Pt = PointSources(V, [[.5, .5]]) mydelta = Pt[0].array() def mysrc(tt): return Ricker(tt) * mydelta # Computation: if myrank == 0: print '\n\th = {}, Dt = {}'.format(h, Dt) Wave = AcousticWave({'V': V, 'Vm': Vl}) #Wave.verbose = True Wave.timestepper = 'centered' Wave.lump = True Wave.set_abc(mesh, AllFour(), True) Wave.exact = Function(V) Wave.update({'b':1.0, 'a':1.0, 't0':0.0, 'tf':tf, 'Dt':Dt,\ 'u0init':Function(V), 'utinit':Function(V)}) Wave.ftime = mysrc sol, error = Wave.solve() ERROR.append(error) if myrank == 0: print 'relative error = {:.5e}'.format(error) if not mycomm == None: MPI.barrier(mycomm) # Plots: try:
V = dl.FunctionSpace(mesh, 'Lagrange', r) y_src = 1.0 # 0.1->transmission, 1.0->reflection Pt = PointSources(V, [[0.5 * X, y_src]]) mydelta = Pt[0] def mysrc(tt): return mydelta * Ricker(tt) # Computation: if mpirank == 0: print '\n\th = {}, Dt = {}'.format(h, Dt) Wave = AcousticWave({ 'V': V, 'Vm': Vl }, { 'print': (not mpirank), 'lumpM': True, 'timestepper': 'backward' }) Wave.set_abc(mesh, ABCdom(), lumpD=False) #Wave.exact = dl.Function(V) Wave.ftime = mysrc # af, bf, _, _, _ = targetmediumparameters(Vl, X, myplot) # Wave.update({'b':bf, 'a':af, 't0':0.0, 'tf':tf, 'Dt':Dt,\ 'u0init':dl.Function(V), 'utinit':dl.Function(V)}) sol, _, _, error = Wave.solve() if mpirank == 0: print 'relative error = {:.5e}'.format(error) MPI.barrier(mesh.mpi_comm())
t=tf) def source(tt): return Expression('6*(sqrt(pow(x[0]-0.5,2)+pow(x[1]-0.5,2))<=t)', t=tt) for Nxy in NN: h = 1. / Nxy print '\n\th = {}'.format(h) mesh = UnitSquareMesh(Nxy, Nxy, "crossed") q = 1 # Polynomial order V = FunctionSpace(mesh, 'Lagrange', q) Dt = h / (q * 5. * c) Wave = AcousticWave({'V': V, 'Vl': V, 'Vr': V}) Wave.timestepper = 'backward' Wave.lump = True #Wave.verbose = True Wave.exact = interpolate(exact_expr, V) Wave.update({'lambda':lam, 'rho':rho, 't0':0.0, 'tf':tf, 'Dt':Dt,\ 'u0init':Function(V), 'utinit':Function(V)}) test = TestFunction(V) def srcterm(tt): src_expr = source(tt) src_vect = assemble(src_expr * test * dx) return src_vect.array() Wave.ftime = srcterm sol, error = Wave.solve()