def iso_stencil(field, time_order, m, s, damp, **kwargs):
"""
Stencil for the acoustic isotropic wave-equation:
u.dt2 - H + damp*u.dt = 0
:param field: Symbolic TimeFunction object, solution to be computed
:param time_order: time order
:param m: square slowness
:param s: symbol for the time-step
:param damp: ABC dampening field (Function)
:param kwargs: forwad/backward wave equation (sign of u.dt will change accordingly
as well as the updated time-step (u.forwad or u.backward)
:return: Stencil for the wave-equation
"""
# Creat a temporary symbol for H to avoid expensive sympy solve
H = Symbol('H')
# Define time sep to be updated
next = field.forward if kwargs.get('forward', True) else field.backward
# Define PDE
eq = m * field.dt2 - H - kwargs.get('q', 0)
# Add dampening field according to the propagation direction
eq += damp * field.dt if kwargs.get('forward', True) else -damp * field.dt
# Solve the symbolic equation for the field to be updated
eq_time = solve(eq, next, rational=False, simplify=False)[0]
# Get the spacial FD
lap = laplacian(field, time_order, m, s)
# return the Stencil with H replaced by its symbolic expression
return [Eq(next, eq_time.subs({H: lap}))]
评论列表
文章目录