examples.convection.exponential2D package

Submodules

examples.convection.exponential2D.cylindricalMesh2D module

This example solves the steady-state cylindrical convection-diffusion equation given by:

\nabla \cdot \left(D \nabla \phi + \vec{u} \phi \right) = 0

with coefficients D = 1 and \vec{u} = (10,), or

>>> diffCoeff = 1.
>>> convCoeff = ((10.,), (0.,))

We define a 2D cylindrical mesh representing an annulus. The mesh is a pseudo 1D mesh, but is a good test case for the CylindricalGrid2D mesh.

>>> from fipy import CellVariable, CylindricalGrid2D, DiffusionTerm, ExponentialConvectionTerm, Viewer
>>> from fipy.tools import numerix
>>> r0 = 1.
>>> r1 = 2.
>>> nr = 100
>>> mesh = CylindricalGrid2D(dr=(r1 - r0) / nr, dz=1., nr=nr, nz=1) + ((r0,),)

The solution variable is initialized to valueLeft:

>>> valueLeft = 0.
>>> valueRight = 1.
>>> var = CellVariable(mesh=mesh, name = "variable")

and impose the boundary conditions

\phi = \begin{cases}
0& \text{at $r = r_0$,} \\
1& \text{at $r = r_1$,}
\end{cases}

with

>>> var.constrain(valueLeft, mesh.facesLeft)
>>> var.constrain(valueRight, mesh.facesRight)

The equation is created with the DiffusionTerm and ExponentialConvectionTerm.

>>> eq = (DiffusionTerm(coeff=diffCoeff)
...       + ExponentialConvectionTerm(coeff=convCoeff))

More details of the benefits and drawbacks of each type of convection term can be found in sec:NumericalSchemes}. Essentially, the ExponentialConvectionTerm and PowerLawConvectionTerm will both handle most types of convection-diffusion cases, with the PowerLawConvectionTerm being more efficient.

We solve the equation

>>> eq.solve(var=var)

and test the solution against the analytical result

or

>>> axis = 0
>>> try:
...     from scipy.special import expi 
...     U = convCoeff[0][0]
...     r = mesh.cellCenters[axis]
...     AA = numerix.exp(U / diffCoeff * (r1 - r))
...     BB = expi(U * r0 / diffCoeff) - expi(U * r / diffCoeff) 
...     CC = expi(U * r0 / diffCoeff) - expi(U * r1 / diffCoeff) 
...     analyticalArray = AA * BB / CC 
... except ImportError:
...     print("The SciPy library is unavailable. It is required for testing purposes.")
>>> print(var.allclose(analyticalArray, atol=1e-3)) 
1

If the problem is run interactively, we can view the result:

>>> if __name__ == '__main__':
...     viewer = Viewer(vars=var)
...     viewer.plot()

examples.convection.exponential2D.cylindricalMesh2DNonUniform module

This example solves the steady-state cylindrical convection-diffusion equation given by:

\nabla \cdot \left(D \nabla \phi + \vec{u} \phi \right) = 0

with coefficients D = 1 and \vec{u} = (10,), or

>>> diffCoeff = 1.
>>> convCoeff = ((10.,), (0.,))

We define a 2D cylindrical mesh representing an annulus. The mesh is a pseudo-1D mesh, but is a good test case for the CylindricalGrid2D mesh. The mesh has a non-constant cell spacing.

>>> from fipy import CellVariable, CylindricalGrid2D, DiffusionTerm, ExponentialConvectionTerm, Viewer
>>> from fipy.tools import numerix
>>> r0 = 1.
>>> r1 = 2.
>>> nr = 100
>>> Rratio = (r1 / r0)**(1 / float(nr))
>>> dr = r0 * (Rratio - 1) * Rratio**numerix.arange(nr)
>>> mesh = CylindricalGrid2D(dr=dr, dz=1., nz=1) + ((r0,), (0.,))

The solution variable is initialized to valueLeft:

>>> valueLeft = 0.
>>> valueRight = 1.
>>> var = CellVariable(mesh=mesh, name = "variable")

and impose the boundary conditions

\phi = \begin{cases}
0& \text{at $r = r_0$,} \\
1& \text{at $r = r_1$,}
\end{cases}

with

>>> var.constrain(valueLeft, mesh.facesLeft)
>>> var.constrain(valueRight, mesh.facesRight)

The equation is created with the DiffusionTerm and ExponentialConvectionTerm.

>>> eq = (DiffusionTerm(coeff=diffCoeff)
...       + ExponentialConvectionTerm(coeff=convCoeff))

More details of the benefits and drawbacks of each type of convection term can be found in Numerical Schemes. Essentially, the ExponentialConvectionTerm and PowerLawConvectionTerm will both handle most types of convection-diffusion cases, with the PowerLawConvectionTerm being more efficient.

We solve the equation

>>> eq.solve(var=var)

and test the solution against the analytical result

>>> axis = 0
>>> try:
...     from scipy.special import expi 
...     r = mesh.cellCenters[axis]
...     U = convCoeff[0][0]
...     AA = numerix.exp(U / diffCoeff * (r1 - r))
...     BB = expi(U * r0 / diffCoeff) - expi(U * r / diffCoeff) 
...     CC = expi(U * r0 / diffCoeff) - expi(U * r1 / diffCoeff) 
...     analyticalArray = AA * BB / CC 
... except ImportError:
...     print("The SciPy library is unavailable. It is required for testing purposes.")
>>> print(var.allclose(analyticalArray, atol=1e-3)) 
1

If the problem is run interactively, we can view the result:

>>> if __name__ == '__main__':
...     viewer = Viewer(vars=var)
...     viewer.plot()

examples.convection.exponential2D.mesh2D module

This example solves the steady-state convection-diffusion equation as described in examples.diffusion.convection.exponential1D.mesh1D on a 2D mesh with nx = 10 and ny = 10:

>>> from fipy import CellVariable, Grid2D, DiffusionTerm, ExponentialConvectionTerm, DefaultAsymmetricSolver, Viewer
>>> from fipy.tools import numerix
>>> L = 10.
>>> nx = 10
>>> ny = 10
>>> mesh = Grid2D(L / nx, L / ny, nx, ny)
>>> valueLeft = 0.
>>> valueRight = 1.
>>> var = CellVariable(name = "concentration",
...                    mesh = mesh,
...                    value = valueLeft)
>>> var.constrain(valueLeft, mesh.facesLeft)
>>> var.constrain(valueRight, mesh.facesRight)
>>> diffCoeff = 1.
>>> convCoeff = (10., 0.)
>>> eq = DiffusionTerm(coeff=diffCoeff) + ExponentialConvectionTerm(coeff=convCoeff)
>>> eq.solve(var = var,
...          solver=DefaultAsymmetricSolver(tolerance=1.e-15, iterations=10000))

We test the solution against the analytical result:

>>> axis = 0
>>> x = mesh.cellCenters[axis]
>>> CC = 1. - numerix.exp(-convCoeff[axis] * x / diffCoeff)
>>> DD = 1. - numerix.exp(-convCoeff[axis] * L / diffCoeff)
>>> analyticalArray = CC / DD
>>> print(var.allclose(analyticalArray, rtol = 1e-10, atol = 1e-10))
1
>>> if __name__ == '__main__':
...     viewer = Viewer(vars = var)
...     viewer.plot()

examples.convection.exponential2D.tri2D module

This example solves the steady-state convection-diffusion equation as described in examples.diffusion.convection.exponential1D.mesh1D with nx = 10 and ny = 10.

>>> from fipy import CellVariable, Tri2D, DiffusionTerm, ExponentialConvectionTerm, Viewer
>>> from fipy.tools import numerix
>>> L = 10.
>>> nx = 10
>>> ny = 10
>>> mesh = Tri2D(L / nx, L / ny, nx, ny)
>>> valueLeft = 0.
>>> valueRight = 1.
>>> var = CellVariable(name = "concentration",
...                    mesh = mesh,
...                    value = valueLeft)
>>> var.constrain(valueLeft, mesh.facesLeft)
>>> var.constrain(valueRight, mesh.facesRight)
>>> diffCoeff = 1.
>>> convCoeff = (10., 0.)
>>> eq = (DiffusionTerm(coeff=diffCoeff)
...       + ExponentialConvectionTerm(coeff=convCoeff))
>>> eq.solve(var = var)

The analytical solution test for this problem is given by:

>>> axis = 0
>>> x = mesh.cellCenters[axis]
>>> CC = 1. - numerix.exp(-convCoeff[axis] * x / diffCoeff)
>>> DD = 1. - numerix.exp(-convCoeff[axis] * L / diffCoeff)
>>> analyticalArray = CC / DD
>>> print(var.allclose(analyticalArray, rtol = 1e-10, atol = 1e-10))
1
>>> if __name__ == '__main__':
...     viewer = Viewer(vars = var)
...     viewer.plot()
Last updated on Jun 27, 2023. Created using Sphinx 6.2.1.