-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathfem2d_l2_error_quadratic.m
149 lines (124 loc) · 3.53 KB
/
fem2d_l2_error_quadratic.m
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
function e2 = fem2d_l2_error_quadratic ( nx, ny, x, y, u, exact )
%*****************************************************************************80
%
%% FEM2D_L2_ERROR_QUADRATIC: L2 error norm of a finite element solution.
%
% Discussion:
%
% The finite element method has been used, over a rectangle,
% involving a grid of NXxNY nodes, with piecewise quadratic elements used
% for the basis.
%
% The finite element coefficients have been computed, and a formula for the
% exact solution is known.
%
% This function estimates E2, the L2 norm of the error:
%
% E2 = Integral ( X, Y ) ( U(X,Y) - EXACT(X,Y) )^2 dX dY
%
% Licensing:
%
% This code is distributed under the GNU LGPL license.
%
% Modified:
%
% 23 June 2014
%
% Author:
%
% John Burkardt
%
% Parameters:
%
% Input, integer NX, NY, the number of nodes in the X and Y directions.
%
% Input, real X(NX), Y(NY), the grid coordinates.
%
% Input, real U(NX,NY), the finite element coefficients.
%
% Input, function EQ = EXACT(X,Y), returns the value of the exact
% solution at the point (X,Y).
%
% Output, real E2, the estimated L2 norm of the error.
%
e2 = 0.0;
%
% Quadrature definitions.
%
quad_num = 3;
abscissa(1) = -0.774596669241483377035853079956;
abscissa(2) = 0.000000000000000000000000000000;
abscissa(3) = 0.774596669241483377035853079956;
weight(1) = 0.555555555555555555555555555556;
weight(2) = 0.888888888888888888888888888889;
weight(3) = 0.555555555555555555555555555556;
ex_num = ( nx - 1 ) / 2;
ey_num = ( ny - 1 ) / 2;
for ex = 1 : ex_num
w = 2 * ex - 1;
cc = 2 * ex;
e = 2 * ex + 1;
xx(1) = x(w);
xx(2) = x(cc);
xx(3) = x(e);
for ey = 1 : ey_num
s = 2 * ey - 1;
mm = 2 * ey;
n = 2 * ey + 1;
yy(1) = y(s);
yy(2) = y(mm);
yy(3) = y(n);
%
% Node indices
%
% 7 8 9 wn cn en
% 4 5 6 wm cm em
% 1 2 3 ws cs es
%
node(1) = ( 2 * ey - 2 ) * nx + ( ex - 1 ) * 2 + 1;
node(2) = ( 2 * ey - 2 ) * nx + ( ex - 1 ) * 2 + 2;
node(3) = ( 2 * ey - 2 ) * nx + ( ex - 1 ) * 2 + 3;
node(4) = ( 2 * ey - 1 ) * nx + ( ex - 1 ) * 2 + 1;
node(5) = ( 2 * ey - 1 ) * nx + ( ex - 1 ) * 2 + 2;
node(6) = ( 2 * ey - 1 ) * nx + ( ex - 1 ) * 2 + 3;
node(7) = ( 2 * ey ) * nx + ( ex - 1 ) * 2 + 1;
node(8) = ( 2 * ey ) * nx + ( ex - 1 ) * 2 + 2;
node(9) = ( 2 * ey ) * nx + ( ex - 1 ) * 2 + 3;
for qx = 1 : quad_num
xq = ( ( 1.0 - abscissa(qx) ) * xx(1) ...
+ ( 1.0 + abscissa(qx) ) * xx(3) ) ...
/ 2.0;
for qy = 1 : quad_num
yq = ( ( 1.0 - abscissa(qy) ) * yy(1) ...
+ ( 1.0 + abscissa(qy) ) * yy(3) ) ...
/ 2.0;
wq = weight(qx) * ( xx(3) - xx(1) ) / 2.0 ...
* weight(qy) * ( yy(3) - yy(1) ) / 2.0;
uq = 0.0;
v = ones ( 9, 1 );
k = 0;
for jl = 1 : 3
for il = 1 : 3
k = k + 1;
for il2 = 1 : 3
if ( il2 ~= il )
v(k) = v(k) * ( xq - xx(il2) ) / ( xx(il) - xx(il2) );
end
end
for jl2 = 1 : 3
if ( jl2 ~= jl )
v(k) = v(k) * ( yq - yy(jl2) ) / ( yy(jl) - yy(jl2) );
end
end
uq = uq + u(node(k)) * v(k);
end
end
eq = exact ( xq, yq );
e2 = e2 + wq * ( uq - eq )^2;
end
end
end
end
e2 = sqrt ( e2 );
return
end