47
47
# Compute error norm
49
49
# Function - Expression
50
error = (u - u_exact)**2*dx
50
error = (u - u_e)**2*dx
51
51
E1 = sqrt(assemble(error))
53
# Explicit interpolation of u_exact onto the same space as u:
54
u_e = interpolate(u_exact, V)
55
error = (u - u_e)**2*dx
53
# Explicit interpolation of u_e onto the same space as u:
54
u_e_V = interpolate(u_e, V)
55
error = (u - u_e_V)**2*dx
56
56
E2 = sqrt(assemble(error))
58
# Explicit interpolation of u_exact to higher-order elements,
58
# Explicit interpolation of u_e to higher-order elements,
59
59
# u will also be interpolated to the space Ve before integration
60
60
Ve = FunctionSpace(mesh, 'Lagrange', degree=5)
61
u_e = interpolate(u_exact, Ve)
62
error = (u - u_e)**2*dx
61
u_e_Ve = interpolate(u_e, Ve)
62
error = (u - u_e_Ve)**2*dx
63
63
E3 = sqrt(assemble(error))
65
# errornorm interpolates u and u_exact to a space with
65
# errornorm interpolates u and u_e to a space with
66
66
# given degree, and creates the error field by subtracting
67
67
# the degrees of freedom, then the error field is integrated
68
# TEMPORARY BUG - doesn't accept Expression for u_exact
69
#E4 = errornorm(u_exact, u, normtype='l2', degree=3)
68
# TEMPORARY BUG - doesn't accept Expression for u_e
69
#E4 = errornorm(u_e, u, normtype='l2', degree=3)
70
70
# Manual implementation
71
def errornorm(u_exact, u, Ve):
71
def errornorm(u_e, u, Ve):
72
72
u_Ve = interpolate(u, Ve)
73
u_e_Ve = interpolate(u_exact, Ve)
73
u_e_Ve = interpolate(u_e, Ve)
74
74
e_Ve = Function(Ve)
75
75
# Subtract degrees of freedom for the error field
76
e_Ve.vector()[:] = u_e_Ve.vector().array() - \
76
e_Ve.vector()[:] = u_e_Ve.vector().array() - u_Ve.vector().array()
78
77
# More efficient computation (avoids the rhs array result above)
79
78
#e_Ve.assign(u_e_Ve) # e_Ve = u_e_Ve
80
79
#e_Ve.vector().axpy(-1.0, u_Ve.vector()) # e_Ve += -1.0*u_Ve
82
81
return sqrt(assemble(error, mesh=Ve.mesh())), e_Ve
83
E4, e_Ve = errornorm(u_exact, u, Ve)
82
E4, e_Ve = errornorm(u_e, u, Ve)
85
84
# Infinity norm based on nodal values
86
u_e = interpolate(u_exact, V)
87
E5 = abs(u_e.vector().array() - u.vector().array()).max()
85
u_e_V = interpolate(u_e, V)
86
E5 = abs(u_e_V.vector().array() - u.vector().array()).max()
95
94
E6 = sqrt(assemble(error))
97
96
# Collect error measures in a dictionary with self-explanatory keys
98
errors = {'u - u_exact': E1,
99
'u - interpolate(u_exact,V)': E2,
100
'interpolate(u,Ve) - interpolate(u_exact,Ve)': E3,
97
errors = {'u - u_e': E1,
98
'u - interpolate(u_e,V)': E2,
99
'interpolate(u,Ve) - interpolate(u_e,Ve)': E3,
101
100
'error field': E4,
102
101
'infinity norm (of dofs)': E5,
103
102
'grad(error field)': E6}
107
106
# Perform experiments