devitocodes/devito

get wrong output

gfkdliucheng opened this issue · 4 comments

from devito import *
import matplotlib.pyplot as plt
def solver(I, dt, T, eqs):
dt = float(dt)
Nt = int(round(T/dt))
t = TimeDimension('t', spacing=Constant('h_t'))
u = TimeFunction(name='u', dimensions=(t,),
shape=(Nt+1,), space_order=2, time_order=2)
u.data[:] = I
eqn = eval(eqs)
stencil = Eq(u.forward, solve(eqn, u.forward))
op = Operator(stencil)
op.apply(h_t=dt, t_M=Nt-1)
return u.data, np.linspace(0, Nt*dt, Nt+1)

u,t = solver(1, 0.01, 1,r'u.dt-t')
print(u[-1]) # wrong output:50.499958

def solver1(I, dt, T):

dt = float(dt)
Nt = int(round(T/dt))
u = np.zeros(Nt+1)
t = np.linspace(0, Nt*dt, Nt+1)
u[0] = I
for n in range(Nt):
    u[n+1] = u[n] + dt*t[n]
return u, t

u,t = solver1(1, 0.01, 1)
print(u[-1]) # correct output: 1.494999

u[n+1] = u[n] + dt*t[n]

that's " u(t)' - t = 0" this has nothing to do with the other equation so not sure why comparing to this otr why you'd expect it to be the same.

"u'' + w**2u = 0 " that's u[n+1] = - u[n-1] + (2 + dt**2 * w**2) * u[n]

" u(t)' - t = 0" is my question, but how to implement this with devito,
def solver(I, dt, T, eqs):
dt = float(dt)
Nt = int(round(T/dt))
t = TimeDimension('t', spacing=Constant('h_t'))
u = TimeFunction(name='u', dimensions=(t,),
shape=(Nt+1,), space_order=2, time_order=2)
u.data[:] = I
eqn = eval(eqs)
stencil = Eq(u.forward, solve(eqn, u.forward))
op = Operator(stencil)
op.apply(h_t=dt, t_M=Nt-1)
return u.data, np.linspace(0, Nt*dt, Nt+1)

              u,t = solver(1, 0.01, 1,r'u.dt-t')
              print(u[-1]) # wrong output:50.499958

First order equation so you need

u = TimeFunction(name='u', dimensions=(t,), shape=(Nt+1,), space_order=2, time_order=1)

then r'u.dt-t' is the time index you need r'u.dt-t*t.spacing') to get the actual time

For future reference, please use triple quotes "```" to make code blocks so it's easier to read and test

In [8]: def solver(I, dt, T, eqs):
   ...:     dt = float(dt)
   ...:     Nt = int(round(T/dt))
   ...:     t = TimeDimension('t', spacing=Constant('h_t'))
   ...:     u = TimeFunction(name='u', dimensions=(t,),
   ...:     shape=(Nt+1,), space_order=2, time_order=1)
   ...:     u.data[:] = I
   ...:     eqn = eval(eqs)
   ...:     stencil = Eq(u.forward, solve(eqn, u.forward))
   ...:     print(stencil)
   ...:     op = Operator(stencil)
   ...:     op.apply(h_t=dt, t_M=Nt-1)
   ...:     return u.data, np.linspace(0, Nt*dt, Nt+1)
   ...: 
   ...: u,t = solver(1, 0.01, 1,r'u.dt-t*t.spacing')
   ...: print(u[-1]) # wrong output:50.499958
Eq(u(t + h_t), h_t*(t*h_t + u(t)/h_t))
Operator `Kernel` ran in 0.01 s
1.494997

Thank you, bro! God bless you, but how(where) can i get the information “using t*t.spacing to get the actual time”