Note
Go to the end to download the full example code.
Gauss’ Law of Electrostatics#
Here we use the discretize package to solve for the electric potential
(
where
To solve this problem numerically, we use the weak formulation; that is, we
take the inner product of each equation with an appropriate test function.
Where
In the case of Gauss’ law, we have a volume integral containing the Dirac delta function, thus:
where
where
For the second weak form equation, we make use of the divergence theorem as follows:
where the surface integral is zero due to the boundary conditions we imposed. Evaluating this expression according to the finite volume approach we obtain:
where
from which we can solve for
Import Packages#
Here we import the packages required for this tutorial.
from discretize import TensorMesh
from scipy.sparse.linalg import spsolve
import matplotlib.pyplot as plt
import numpy as np
from discretize.utils import sdiag
Solving the Problem#
# Create a tensor mesh
h = np.ones(75)
mesh = TensorMesh([h, h], "CC")
# Create system
DIV = mesh.face_divergence # Faces to cell centers divergence
Mf_inv = mesh.get_face_inner_product(invert_matrix=True)
Mc = sdiag(mesh.cell_volumes)
A = Mc * DIV * Mf_inv * DIV.T * Mc
# Define RHS (charge distributions at cell centers)
xycc = mesh.gridCC
kneg = (xycc[:, 0] == -10) & (xycc[:, 1] == 0) # -ve charge distr. at (-10, 0)
kpos = (xycc[:, 0] == 10) & (xycc[:, 1] == 0) # +ve charge distr. at (10, 0)
rho = np.zeros(mesh.nC)
rho[kneg] = -1
rho[kpos] = 1
# LU factorization and solve
phi = spsolve(A, rho)
# Compute electric fields
E = Mf_inv * DIV.T * Mc * phi
# Plotting
fig = plt.figure(figsize=(14, 4))
ax1 = fig.add_subplot(131)
mesh.plot_image(rho, v_type="CC", ax=ax1)
ax1.set_title("Charge Density")
ax2 = fig.add_subplot(132)
mesh.plot_image(phi, v_type="CC", ax=ax2)
ax2.set_title("Electric Potential")
ax3 = fig.add_subplot(133)
mesh.plot_image(
E, ax=ax3, v_type="F", view="vec", stream_opts={"color": "w", "density": 1.0}
)
ax3.set_title("Electric Fields")

Text(0.5, 1.0, 'Electric Fields')
Total running time of the script: (0 minutes 0.590 seconds)