Source code for fe_utils.utils
import numpy as np
from .quadrature import gauss_quadrature
[docs]def errornorm(f1, f2):
"""Calculate the L^2 norm of the difference between f1 and f2."""
fs1 = f1.function_space
fs2 = f2.function_space
fe1 = fs1.element
fe2 = fs2.element
mesh = fs1.mesh
# Create a quadrature rule which is exact for (f1-f2)**2.
Q = gauss_quadrature(fe1.cell, 2*max(fe1.degree, fe2.degree))
# Evaluate the local basis functions at the quadrature points.
phi = fe1.tabulate(Q.points)
psi = fe2.tabulate(Q.points)
norm = 0.
for c in range(mesh.entity_counts[-1]):
# Find the appropriate global node numbers for this cell.
nodes1 = fs1.cell_nodes[c, :]
nodes2 = fs2.cell_nodes[c, :]
# Compute the change of coordinates.
J = mesh.jacobian(c)
detJ = np.abs(np.linalg.det(J))
# Compute the actual cell quadrature.
norm += np.dot((np.dot(f1.values[nodes1], phi.T) -
np.dot(f2.values[nodes2], psi.T))**2,
Q.weights) * detJ
return norm**0.5