forked from project-asgard/DG-SparseGrid
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmatrix_plot_D.m
executable file
·91 lines (64 loc) · 1.98 KB
/
matrix_plot_D.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
function [Meval,nodes] = matrix_plot_D(pde,dimension)
%%
% Generate the evaluation matrix and plotting points
% TODO : probably should be renamed to something more descriptive
%%
% Setup a few shortcuts
lev = dimension.lev;
deg = pde.deg;
xMin = dimension.domainMin;
xMax = dimension.domainMax;
FMWT = dimension.FMWT;
%%
% Jacobi of variable
n = 2^(lev);
h = (xMax-xMin)/n;
dof_1D = deg*n;
nodes = zeros(dof_1D,1);
%%
% Quadrature points (quad_x) and weights (quad_w)
[quad_x_interior_element,quad_w]=lgwt(deg,-1,1);
%%
% Add end points to plot
quad_x_left_element = [-1 quad_x_interior_element']';
quad_x_right_element = [quad_x_interior_element' +1]';
% quad_x_left_element = [quad_x_interior_element']';
% quad_x_right_element = [quad_x_interior_element']';
dof = numel(quad_x_interior_element);
p_val = lin_legendre(quad_x_interior_element,deg)*sqrt(1/h); % TODO : this call and normalization happens in several places. We should consolidate.
p_val_left = lin_legendre(quad_x_left_element,deg) *sqrt(1/h);
p_val_right = lin_legendre(quad_x_right_element,deg) *sqrt(1/h);
Meval = sparse(dof*(n-2)+(dof+1)*2,dof_1D);
% Meval = sparse(dof*(n-2)+(dof)*2,dof_1D);
for i=0:n-1
if i==0
quad_x = quad_x_left_element;
elseif i==n-1
quad_x = quad_x_right_element;
else
quad_x = quad_x_interior_element;
end
%%
% Mapping from [-1,1] to physical domain
xi = ((quad_x+1)/2+i)*h+xMin;
%%
% Coefficients for DG bases
Iv = [deg*i+1:deg*(i+1)];
if i==0
Iu = [1:dof+1];
% Iu = [1:dof];
Meval(Iu,Iv) = p_val_left;
elseif i==n-1
Iu = [dof*i+1+1:dof*(i+1)+2];
% Iu = [dof*i+1:dof*(i+1)];
Meval(Iu,Iv) = p_val_right;
else
Iu = [dof*i+1:dof*(i+1)]+1;
% Iu = [dof*i+1:dof*(i+1)];
Meval(Iu,Iv) = p_val;
end
nodes(Iu) = xi;
end
%%
% Transform back to real space from wavelet space
Meval = Meval*FMWT';