Skip to content

Commit

Permalink
Update mg solver for linear Nedelec elements.
Browse files Browse the repository at this point in the history
  • Loading branch information
scaomath committed Aug 4, 2020
1 parent 6213707 commit 2365c97
Show file tree
Hide file tree
Showing 5 changed files with 15 additions and 16 deletions.
4 changes: 1 addition & 3 deletions equation/Maxwell1saddle.m
Original file line number Diff line number Diff line change
Expand Up @@ -337,9 +337,7 @@
end

% multigrid options
% option.mg.isFreeEdge = isFreeEdge; % needed in mg solver
option.mg.isFreeEdge = isFreeEdge;
% option.mg.isFreeNode = isFreeNode;
option.mg.isFreeEdge = isFreeEdge; % needed in mg solver
option.mg.isFreeNode = isFreeNode;
switch method
case 'DIRECT'
Expand Down
4 changes: 2 additions & 2 deletions example/fem/Maxwell/cubeMaxwellSaddle.m
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@
%%
bdFlag = setboundary3(node,elem,'Dirichlet');
option.printlevel = 0;
option.solver = 'direct';
option.solver = 'mg';

%% Parameters
maxIt = 3;
Expand All @@ -37,7 +37,7 @@
[node,elem,bdFlag] = uniformrefine3(node,elem,bdFlag);
[soln,eqn,info] = Maxwellsaddle(node,elem,bdFlag,pde,option);
u = soln.u;
fprintf('\n # of DoFs = %d \n',length(u));
fprintf('\n\n # of DoFs = %d \n',length(u));
% compute error
uI = edgeinterpolate(pde.exactu,node,eqn.edge);
energyErr(k) = getHcurlerror3ND(node,elem,pde.curlu,u);
Expand Down
5 changes: 2 additions & 3 deletions example/fem/Maxwell/cubeMaxwellSaddle1.m
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@

%% Defacult setting
[node,elem] = cubemesh([-1,1,-1,1,-1,1],1);
[node,elem] = uniformrefine3(node,elem);
%%
pde.J = @(p) [sin(p(:,1)).*cos(p(:,2)).*sin(p(:,3)), ...
cos(p(:,1)).*sin(p(:,2)).*sin(p(:,3)), ...
Expand Down Expand Up @@ -39,14 +38,14 @@
[node,elem,bdFlag] = uniformrefine3(node,elem,bdFlag);
[soln,eqn,info] = Maxwell1saddle(node,elem,bdFlag,pde,option);
u = soln.u;
fprintf('\n # of DoFs = %d \n',length(u));
fprintf('\n\n # of DoFs = %d \n',length(u));
% compute error
uI = edgeinterpolate1(pde.exactu,node,eqn.edge);
energyErr(k) = getHcurlerror3ND1(node,elem,pde.curlu,u);
L2Err(k) = getL2error3ND1(node,elem,pde.exactu,u);
uIuhErr(k) = sqrt((u-uI)'*(eqn.A)*(u-uI));
% L2Err(k) = sqrt((u-uI)'*(eqn.M)*(u-uI));
fprintf('||curl(u-u_h)|| is %g \n',energyErr(k))
fprintf('\n ||curl(u-u_h)|| is %g \n',energyErr(k))
N(k) = length(u);
h(k) = 1./(size(node,1)^(1/3)-1);
end
Expand Down
4 changes: 2 additions & 2 deletions fem/getmassmat3.m
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,8 @@
% space specified by elemType.
%
% The type can be:
% - P1: full mass matrix for P1 element
% - lump: lumped mass matrix for P1 element
% - 'P1': full mass matrix for P1 element
% - 'lump': lumped mass matrix for P1 element

N = size(node,1);
NT = length(volume);
Expand Down
14 changes: 8 additions & 6 deletions solver/mgMaxwellsaddle.m
Original file line number Diff line number Diff line change
Expand Up @@ -61,14 +61,15 @@
else % linear ND (quadratic Lagrange for p)
elem2dof = dof3P2(elem);
M = getmassmat3(node,elem2dof,volume);
Mvlump = sum(M,2);
% Mvlump = sum(M,2);
Mvlump = diag(M);
end
end
if N>= Ng
DMinv = spdiags(1./Mvlump(option.isFreeNode),0,Ng,Ng);
else
isFreeDofu = [option.isFreeNode; option.isFreeEdge];
DMinv = spdiags(1./Mvlump(isFreeDofu),0,Ng,Ng);
isFreeDofp = [option.isFreeNode; option.isFreeEdge];
DMinv = spdiags(1./Mvlump(isFreeDofp),0,Ng,Ng);
end
f = f + G*(DMinv*g); % add second equation to the first one
Abar = A + G*DMinv*G'; % Hodge Laplacian
Expand All @@ -85,6 +86,7 @@
else
HB = [];
end

if N>= Ng
[u,info] = mgHodgeLapE(Abar,f,node,elem,bdFlag,option); % lowest order
else
Expand All @@ -93,14 +95,14 @@

Apoption.x0 = p0;
Apoption.printlevel = 1;
Apoption.freeDof = option.isFreeNode;
rg = g-G'*u;

if N>=Ng
Apoption.freeDof = option.isFreeNode;
[p,info2] = mg(Ap,rg,elem,Apoption,HB);
else
[~,edge] = dof3edge(elem);
[p,info2] = mg(Ap,rg,elem,Apoption,HB,edge);
Apoption.freeDof = [option.isFreeNode; option.isFreeEdge];
[p,info2] = mg(Ap,rg,elem,Apoption,HB);
end
% [p,info2] = amg(Ap,rg,Apmgoption);

Expand Down

0 comments on commit 2365c97

Please sign in to comment.