Hi Qunitin,
I think you need to relax the updates on this. Introducing a transient
term does that. I think that the b vector causes and instability. The
b vector is
phi_old - delta_t * sin(phi_old)
with a transient term in the equation. For small phi, this should
never be negative, since phi should only grow, but for delta_t > 1
this can be negative. It's the same reason that explicit diffusion has
a time step restriction.
You can get around this restriction by linearizing the source term so
that the source looks like
- numerix.sin(phi) + phi * numerix.cos(phi) -
ImplicitSourceTerm(numerix.cos(phi))
There is now no time step restriction since the b vector is just
"phi_old" when phi is small.
After 100 sweeps, the non-linearized source is at a residual of 0.0022
(with dt=1) and the linearized source is at 0.0009 (with dt=1000),
which is somewhat better.
Possibly using Newton iterations could improve the convergence rate further.
Hope that helps.
Cheers,
Daniel
~~~~
import numpy as np
from fipy import *
nx = 10000
dx = 0.01
mesh = Grid1D(nx=nx, dx=dx)
phi = CellVariable(mesh=mesh, name="phi", hasOld=True)
phi.constrain(2*np.pi, where=mesh.facesLeft)
phi.constrain(0., where=mesh.facesRight)
# requires dt < 1
#eq = TransientTerm() == DiffusionTerm() - numerix.sin(phi)
# no dt requirment
eq = TransientTerm() == DiffusionTerm() - numerix.sin(phi) + phi *
numerix.cos(phi) - ImplicitSourceTerm(numerix.cos(phi))
sweeps=1000
view = Viewer(phi)
for i in range(sweeps):
res = eq.sweep(var=phi, dt=1000)
print(res)
view.plot()
phi.updateOld()
raw_input('stopped')
~~~~
On Thu, Mar 21, 2019 at 7:26 AM Meier Quintin <[email protected]> wrote:
>
> Dear fipy community,
> I’m new to FiPy, so forgive me if this is a trivial question.
> I’m trying to find the kink solution to the (static) sine-gordon equation
> using this simply piece of code.
>
> import numpy as np
> from fipy import *
> nx = 10000
> dx = 0.01
> mesh = Grid1D(nx=nx,dx=dx)
> phi = CellVariable(mesh=mesh, name=“Phi")
> phi.constrain(2*np.pi, where=mesh.facesLeft)
> phi.constrain(0., where=mesh.facesRight)
> eq = (DiffusionTerm(coeff=(1.0), var=phi) - numerix.sin(phi) == 0.0)
> sweeps=10
> for i in range(sweeps):
> eq.sweep(var=phi)
> MatplotlibViewer(phi)
>
> Unfortunately, I do not manage to get a numerically stable solution, the
> first sweep gives me a straight line and additional sweeps lead to numerical
> instabilities without convergence.
> I would be very thankful if someone could hint me to what I’m doing wrong.
>
> Best wishes,
> Quintin Meier
>
> _______________________________________________
> fipy mailing list
> [email protected]
> http://www.ctcms.nist.gov/fipy
> [ NIST internal ONLY: https://email.nist.gov/mailman/listinfo/fipy ]
--
Daniel Wheeler
_______________________________________________
fipy mailing list
[email protected]
http://www.ctcms.nist.gov/fipy
[ NIST internal ONLY: https://email.nist.gov/mailman/listinfo/fipy ]