First, I hope you're considering the broad set of FiPy examples <http://www.ctcms.nist.gov/fipy/examples/README.html> as part of the documentation. They can serve as a great starting point for many problems. Second, solving convection problems without any diffusion is notoriously a bit difficult with standard finite volume techniques. So, despite the apparent simplicity of your starting example, you've happened to pick one that's likely to disagree with the analytical solution because of numerical challenges. That said, you may try using different forms of the convection term (mentioned here <http://www.ctcms.nist.gov/fipy/examples/convection/generated/examples.convection.exponential1D.mesh1D.html>) and letting the simulation run for convection beyond a single grid point. Anyway, it's usually a good idea to start with simple examples like this, but here, you might consider letting FiPy's examples guide your choice in getting started unless you're specifically looking at problems of the form you've begun with here.
If you really need to solve convection problems without the numerically smoothing diffusion, then you might consider different numerical schemes designed for hyperbolic equations, such as those implemented in clawpack: http://www.clawpack.org/ Very similar to your problem: http://www.clawpack.org/pyclaw/gallery/gallery_all.html#dimensional-advection Best, Ray On Wed, Mar 23, 2016 at 7:54 AM, Tyler ABBOT <[email protected]> wrote: > Hello! > > I'm new to FiPy and am having a lot of trouble finding my way using only > the documentation... > > I am trying to understand how FiPy works by working an example, in > particular I would like to solve the following simple convection equation > with periodic boundary: > > $$\partial_t u + \partial_x u = 0$$ > > If initial data is given by $u(x, 0) = F(x)$, then the analytical solution > is $u(x, t) = F(x - t)$. I do get a solution, but it is not correct. > > What am I missing? Is there a better resource for understanding FiPy than > the documentation? It is very sparse... > > Here is my attempt > > from fipy import * > import numpy as np > > # Generate mesh > nx = 20 > dx = 2*np.pi/nx > mesh = PeriodicGrid1D(nx=nx, dx=dx) > > # Generate solution object with initial discontinuity > phi = CellVariable(name="solution variable", mesh=mesh) > phiAnalytical = CellVariable(name="analytical value", mesh=mesh) > phi.setValue(1.) > phi.setValue(0., where=x > 1.) > > # Define the pde > D = [[-1.]] > eq = TransientTerm() == ConvectionTerm(coeff=D) > > # Set discretization so analytical solution is exactly one cell translation > dt = 0.01*dx > steps = 2*int(dx/dt) > > # Set the analytical value at the end of simulation > phiAnalytical.setValue(np.roll(phi.value, 1)) > > for step in range(steps): > eq.solve(var=phi, dt=dt) > > print(phi.allclose(phiAnalytical, atol=1e-1)) > > Thanks for any guidance you could give! > > Tyler Abbot > Phd Student > Department of Economics > Sciences Po, Paris > [email protected] > > _______________________________________________ > fipy mailing list > [email protected] > http://www.ctcms.nist.gov/fipy > [ NIST internal ONLY: https://email.nist.gov/mailman/listinfo/fipy ] > >
_______________________________________________ fipy mailing list [email protected] http://www.ctcms.nist.gov/fipy [ NIST internal ONLY: https://email.nist.gov/mailman/listinfo/fipy ]
