Thank you.
I am busy for the week, but then will get a chance to think about this :-)

Cheers,
Jamie

On Tue, Oct 4, 2016 at 1:16 PM, Daniel Wheeler <daniel.wheel...@gmail.com>
wrote:

> Hi James,
>
> Thanks for this example. I think I understand what is happening. Let's
> start with the code for solving the problem,
>
> ~~~~
> import fipy
> import numpy
>
> mesh = fipy.Grid1D(nx=10)
>
> var = fipy.CellVariable(mesh=mesh)
> var[:] = 2 * numpy.random.random(mesh.numberOfCells)
> var.constrain(1., where=mesh.facesRight)
> var.faceGrad.constrain(0, where=mesh.facesLeft)
>
> eqn = fipy.ConvectionTerm([-1]) == fipy.DiffusionTerm(1.0)
>
> for _ in range(100):
>     eqn.sweep(var)
>     print var
> ~~~
>
> Note that the "var.faceGrad.constrain" is required with convection
> terms to make sure that there is an outlet flow. This is a weird
> decision in many ways, but was made for backwards compatibility with
> previous FiPy versions, but this is not the main issue here.
>
> Notice that when the diffusion coefficient is small or large then this
> system solves in one sweep or close to one sweep (set it to 1000.0 or
> 0.0001 for example). The number of sweeps required to solve the system
> is at its worst when the diffiusion and convection coefficients are
> close in magnitude. So what is going on? Basically, the system is not
> fully implicit.
>
> The left hand boundary condition is dependent on the left hand cell
> value but gets added to the b vector in the case of non upwind
> convection terms. In the case of fully upwind convection terms this
> contribution is zero so as the diffusion coefficient goes to zero the
> CovectionTerm becomes fully upwind (or if a UpwindConvectionTerm is
> selected). As the diffusion coefficient gets large the contribution of
> the convection term decreases and thus the contribution from the
> explicit boundary condition is reduced.
>
> The discretization for the left most cell for a central difference
> scheme (we're using power law above, but it has some central
> difference contribution at D=1 and u=-1) is
>
>   D * phi0 - (u / 2 + D) * phi1 = -u * phiB / 2
>
> where phi0 is the value at the left most cell and phi1 is the cell to
> the right. In FiPy, phiB (the boundary value of phiB) is not
> calculated implicitly, but is explicitly set for the convection term
> boundary condition. Basically phiB is the previous value of phi0 in
> the FiPy code. That may not be the best way to deal with this. It may
> be that it needs to be explicit for stability reasons.
>
> A possible way to deal with this issue is to use terms for the outlet
> condition that are upwind at the outflow, but power law everywhere
> else.
>
> Anyway, I hope that helps with understanding what's going on even if
> the implementation is sub-optimal.
>
> Cheers,
>
> Daniel
>
> On Thu, Sep 15, 2016 at 5:13 PM, James Pringle <jprin...@unh.edu> wrote:
> > Dear FiPy users --
> >
> >    This is a simple example of how and why fipy may fail to solve a
> >    steady advection diffusion problem, and how solving the transient
> >    problem can reduce the error. I also found something that was a
> >    surprise -- the "initial" condition of a steady problem can affect
> >    the solution for some solvers.
> >
> >    At the end are two interesting questions for those who want to
> >    understand what FiPy is actually doing.... I admit to being a bit
> >    lost
> >
> >    The equation I am solving is
> >
> >         \Del\dot (D\del psi + u*psi) =0
> >
> >    Where the diffusion D is 1, and u is a vector (1,0) -- so there is
> >    only a flow of speed -1 in the x direction.  I solve this equation
> >    on a 10 by 10 grid. The boundary conditions are no normal gradient
> >    on the y=0 and y=10 boundary:
> >
> >         psi_y =0 at y=0 and y=10
> >
> >    For the x boundary, I impose a value of x=1 on the inflow boundary at
> > x=10
> >    (this is a little tricky -- the way the equation is written, u is
> >    the negative of velocity).
> >
> >         psi=1 at x=10
> >
> >    and a no-normal-gradient condition at x=0.
> >
> >         psi_x=0 at x=0
> >
> >    since all of the domain and boundary is symmetrical with respect to
> >    y, we can assume psi_y=0 is zero everywhere. This reduces the
> equation to
> >
> >         psi_xx + psi_x =0
> >
> >    The general solution to this equation is
> >
> >         psi=C1+C2*exp(-x)
> >
> >    Where C1 and C2 are constants. For these boundary conditions, C1=1
> >    and C2=0, so psi=1 everywhere.
> >
> >    Now run the code SquareGrid_HomemadeDelaunay and look at figure(3)
> >    -- this is the plot of psi versus x, and you can see that it does
> >    not match the true solution of psi=1 everywhere! Instead, it
> >    appears to be decaying exponential. The blue line is actually just
> >    (1+exp(-x)). What is going on? It appears that small errors in the
> >    boundary condition at x=0 are allowing C2 to not be exactly 0, and
> >    this error is this exponential mode. The error is the artificial
> >    exiting of a correct mode of the interior equation, albeit one that
> >    should not be excited by these BC's.
> >
> >    Interestingly, the size of this error depends on the value the psi
> >    is initially set to. If the line
> >
> >        psi=fipy.CellVariable(name='psi',mesh=mesh,value=0.0)
> >
> >    is changed so psi is initially 1, the error goes away entirely; if
> >    it is set to some other value, you get different errors. I do not
> >    know if this is a bug, or just numerical error in a well programmed
> >    solver.
> >
> >    Now if you run SquareGrid_HomemadeDelaunay_transient  which
> implements
> >
> >          psi_t = \Del\dot (D\del psi + u*psi)
> >
> >    you can see that the error in the numerical solution is advected
> >    out of the x=0 boundary, and the solution approaches the true
> >    solution of psi=1 rapidly.
> >
> >    The interesting question is if the formulation of the boundary
> >    condition at x=0 could be altered to less excite the spurious mode?
> >
> >    Also, why does the "initial" condition have any effect on the
> >    steady equation?
> >
> >    Cheers,
> >    Jamie
> >
> >
> > _______________________________________________
> > fipy mailing list
> > fipy@nist.gov
> > https://urldefense.proofpoint.com/v2/url?u=http-3A__www.
> ctcms.nist.gov_fipy&d=DQICAg&c=c6MrceVCY5m5A_KAUkrdoA&r=
> 7HJI3EH6RqKWf16fbYIYKw&m=tZaHEx9flGw_0A9dbKvkhX2A2ZKYl0jHC2CQn6iZFO
> 4&s=lIeSkvrgSp7C56l_JXBrrtJGnWXSYmtREoARHhZ8gYI&e=
> >   [ NIST internal ONLY: https://urldefense.proofpoint.
> com/v2/url?u=https-3A__email.nist.gov_mailman_listinfo_
> fipy&d=DQICAg&c=c6MrceVCY5m5A_KAUkrdoA&r=7HJI3EH6RqKWf16fbYIYKw&m=
> tZaHEx9flGw_0A9dbKvkhX2A2ZKYl0jHC2CQn6iZFO4&s=nvZbf-
> 2vJlO4vBbZz4Vwi2RrSieAIr7clFYllQqV4ng&e=  ]
> >
>
>
>
> --
> Daniel Wheeler
> _______________________________________________
> fipy mailing list
> fipy@nist.gov
> https://urldefense.proofpoint.com/v2/url?u=http-3A__www.
> ctcms.nist.gov_fipy&d=DQICAg&c=c6MrceVCY5m5A_KAUkrdoA&r=
> 7HJI3EH6RqKWf16fbYIYKw&m=tZaHEx9flGw_0A9dbKvkhX2A2ZKYl0jHC2CQn6iZFO
> 4&s=lIeSkvrgSp7C56l_JXBrrtJGnWXSYmtREoARHhZ8gYI&e=
>   [ NIST internal ONLY: https://urldefense.proofpoint.
> com/v2/url?u=https-3A__email.nist.gov_mailman_listinfo_
> fipy&d=DQICAg&c=c6MrceVCY5m5A_KAUkrdoA&r=7HJI3EH6RqKWf16fbYIYKw&m=
> tZaHEx9flGw_0A9dbKvkhX2A2ZKYl0jHC2CQn6iZFO4&s=nvZbf-
> 2vJlO4vBbZz4Vwi2RrSieAIr7clFYllQqV4ng&e=  ]
>
_______________________________________________
fipy mailing list
fipy@nist.gov
http://www.ctcms.nist.gov/fipy
  [ NIST internal ONLY: https://email.nist.gov/mailman/listinfo/fipy ]

Reply via email to