Hi FiPy,

I've been solving transient solutions on a uniform 2D grid for a
convection-diffusion equation that initially centers around some arbitrary
position, e.g., (1,1), and moves towards the origin. However, I just
discovered that if I inverse the process and simulates a movement starting
from the origin towards (1,1), with everything else kept the same, the
solution blows up. Sample scripts are attached here. Note that only lines
31 & 62 are different between the two.

How could this be?

I also tried reducing the time step increment in the unstable example but
without any success..

Any suggestion is greatly appreciated.

Cheers,
Yun
-- 
Graduate Group of Ecology Doctoral Candidate
Department of Environmental Science and Policy
Center for Population Biology
University of California, Davis
#!/usr/bin/env python
# encoding: utf-8
"""
bivariate diffusion and advection

Created by Yun Tao on 2012-05-14.
Copyright (c) 2012 __MyCompanyName__. All rights reserved.
"""
import matplotlib.pyplot as plt
from matplotlib import colors
from numpy.random import normal
from matplotlib.mlab import bivariate_normal
from fipy import *
from fipy import numerix

fig = plt.figure
ax1 = plt.subplot((111))

# mesh config
l = 8.
nx = 201.
ny = nx
dx = l/nx
dy = dx
mesh = Grid2D(nx=nx, ny=ny, dx=dx, dy=dy) + [[-l/2]]

convection = VanLeerConvectionTerm

# initial condition
x, y = mesh.getCellCenters()
z = bivariate_normal(x, y, .5, .5, 1., 1.)

# variable config
phi = CellVariable(mesh=mesh, value=z)

# boundary conditions
facesTopRight = ((mesh.getFacesRight()) 
                | (mesh.getFacesTop()))
facesBottomLeft = ((mesh.getFacesLeft())
                | (mesh.getFacesBottom()))

BCs = (FixedFlux(faces=facesTopRight, value=0.),
       FixedFlux(faces=facesBottomLeft, value=0.))

# viewer config
viewer1 = MatplotlibViewer(vars=phi,
                           datamin = 0.0, 
                           limits={'xmin': -l/2, 'xmax': l/2, 'ymin': -l/2, 'ymax': l/2}, 
                           cmap = plt.cm.Spectral,
                           axes=ax1)

# parameters                
D = 1.0
c = 1.0
b = ((c,), (c,))

alpha = 2./(dx * 0.5)

pos = FaceVariable(mesh=mesh, value=mesh.getFaceCenters(), rank=1)

xv, yv = mesh.getFaceCenters()
r = numerix.sqrt((xv)**2+(yv)**2)

# define equation 
eq3 = TransientTerm() == DiffusionTerm(coeff=D) + convection(coeff=(b*numerix.tanh(alpha*r)*pos/r))

# solver config
timeStepDuration = 1. * 1./2 * dx / c 
steps = 10#

for step in range(steps):
    eq3.solve(var=phi,
              boundaryConditions = BCs,
              dt=timeStepDuration)
    viewer1.plot()
    
    
#!/usr/bin/env python
# encoding: utf-8
"""
bivariate diffusion and advection

Created by Yun Tao on 2012-05-14.
Copyright (c) 2012 __MyCompanyName__. All rights reserved.
"""
import matplotlib.pyplot as plt
from matplotlib import colors
from numpy.random import normal
from matplotlib.mlab import bivariate_normal
from fipy import *
from fipy import numerix

fig = plt.figure
ax1 = plt.subplot((111))

# mesh config
l = 8.
nx = 201.
ny = nx
dx = l/nx
dy = dx
mesh = Grid2D(nx=nx, ny=ny, dx=dx, dy=dy) + [[-l/2]]

convection = VanLeerConvectionTerm

# initial condition
x, y = mesh.getCellCenters()
z = bivariate_normal(x, y, .5, .5, 0., 0.)

# variable config
phi = CellVariable(mesh=mesh, value=z)

# boundary conditions
facesTopRight = ((mesh.getFacesRight()) 
                | (mesh.getFacesTop()))
facesBottomLeft = ((mesh.getFacesLeft())
                | (mesh.getFacesBottom()))

BCs = (FixedFlux(faces=facesTopRight, value=0.),
       FixedFlux(faces=facesBottomLeft, value=0.))

# viewer config
viewer1 = MatplotlibViewer(vars=phi,
                           datamin = 0.0, 
                           limits={'xmin': -l/2, 'xmax': l/2, 'ymin': -l/2, 'ymax': l/2}, 
                           cmap = plt.cm.Spectral,
                           axes=ax1)

# parameters                
D = 1.0
c = 1.0
b = ((c,), (c,))

alpha = 2./(dx * 0.5)

pos = FaceVariable(mesh=mesh, value=mesh.getFaceCenters(), rank=1)

xv, yv = mesh.getFaceCenters()
r = numerix.sqrt((xv-1.)**2+(yv-1.)**2)

# define equation 
eq3 = TransientTerm() == DiffusionTerm(coeff=D) + convection(coeff=(b*numerix.tanh(alpha*r)*pos/r))

# solver config
timeStepDuration = 1. * 1./2 * dx / c 
steps = 10

for step in range(steps):
    eq3.solve(var=phi,
              boundaryConditions = BCs,
              dt=timeStepDuration)
    viewer1.plot()
    
    
_______________________________________________
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