Mercurial > repos > public > sbplib
annotate +multiblock/LaplaceSquared.m @ 1198:2924b3a9b921 feature/d2_compatible
Add OpSet for fully compatible D2Variable, created from regular D2Variable by replacing d1 by first row of D1. Formal reduction by one order of accuracy at the boundary point.
author | Martin Almquist <malmquist@stanford.edu> |
---|---|
date | Fri, 16 Aug 2019 14:30:28 -0700 |
parents | 2aaced07d1e5 |
children |
rev | line source |
---|---|
1070
f6b3af6febf3
Start work on LaplaceSquared. FULL OF ERRORS?!
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
1 classdef LaplaceSquared < scheme.Scheme |
f6b3af6febf3
Start work on LaplaceSquared. FULL OF ERRORS?!
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
2 properties |
f6b3af6febf3
Start work on LaplaceSquared. FULL OF ERRORS?!
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
3 grid |
f6b3af6febf3
Start work on LaplaceSquared. FULL OF ERRORS?!
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
4 order |
f6b3af6febf3
Start work on LaplaceSquared. FULL OF ERRORS?!
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
5 laplaceDiffOp |
f6b3af6febf3
Start work on LaplaceSquared. FULL OF ERRORS?!
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
6 |
f6b3af6febf3
Start work on LaplaceSquared. FULL OF ERRORS?!
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
7 D |
f6b3af6febf3
Start work on LaplaceSquared. FULL OF ERRORS?!
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
8 H |
f6b3af6febf3
Start work on LaplaceSquared. FULL OF ERRORS?!
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
9 Hi |
f6b3af6febf3
Start work on LaplaceSquared. FULL OF ERRORS?!
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
10 |
f6b3af6febf3
Start work on LaplaceSquared. FULL OF ERRORS?!
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
11 a,b |
f6b3af6febf3
Start work on LaplaceSquared. FULL OF ERRORS?!
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
12 end |
f6b3af6febf3
Start work on LaplaceSquared. FULL OF ERRORS?!
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
13 |
f6b3af6febf3
Start work on LaplaceSquared. FULL OF ERRORS?!
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
14 methods |
f6b3af6febf3
Start work on LaplaceSquared. FULL OF ERRORS?!
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
15 % Discretisation of a*nabla*b*nabla |
f6b3af6febf3
Start work on LaplaceSquared. FULL OF ERRORS?!
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
16 function obj = LaplaceSquared(g, order, a, b, opGen) |
f6b3af6febf3
Start work on LaplaceSquared. FULL OF ERRORS?!
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
17 default_arg('order', 4); |
f6b3af6febf3
Start work on LaplaceSquared. FULL OF ERRORS?!
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
18 default_arg('a', 1); |
f6b3af6febf3
Start work on LaplaceSquared. FULL OF ERRORS?!
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
19 default_arg('b', 1); |
f6b3af6febf3
Start work on LaplaceSquared. FULL OF ERRORS?!
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
20 default_arg('opGen', @sbp.D4Variable); |
f6b3af6febf3
Start work on LaplaceSquared. FULL OF ERRORS?!
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
21 |
f6b3af6febf3
Start work on LaplaceSquared. FULL OF ERRORS?!
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
22 if isscalar(a) |
f6b3af6febf3
Start work on LaplaceSquared. FULL OF ERRORS?!
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
23 a = grid.evalOn(g, a); |
f6b3af6febf3
Start work on LaplaceSquared. FULL OF ERRORS?!
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
24 end |
f6b3af6febf3
Start work on LaplaceSquared. FULL OF ERRORS?!
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
25 |
f6b3af6febf3
Start work on LaplaceSquared. FULL OF ERRORS?!
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
26 if isscalar(b) |
f6b3af6febf3
Start work on LaplaceSquared. FULL OF ERRORS?!
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
27 b = grid.evalOn(g, b); |
f6b3af6febf3
Start work on LaplaceSquared. FULL OF ERRORS?!
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
28 end |
f6b3af6febf3
Start work on LaplaceSquared. FULL OF ERRORS?!
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
29 |
f6b3af6febf3
Start work on LaplaceSquared. FULL OF ERRORS?!
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
30 obj.grid = g; |
f6b3af6febf3
Start work on LaplaceSquared. FULL OF ERRORS?!
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
31 obj.order = order; |
f6b3af6febf3
Start work on LaplaceSquared. FULL OF ERRORS?!
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
32 obj.a = a; |
f6b3af6febf3
Start work on LaplaceSquared. FULL OF ERRORS?!
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
33 obj.b = b; |
f6b3af6febf3
Start work on LaplaceSquared. FULL OF ERRORS?!
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
34 |
f6b3af6febf3
Start work on LaplaceSquared. FULL OF ERRORS?!
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
35 obj.laplaceDiffOp = multiblock.Laplace(g, order, 1, 1, opGen); |
f6b3af6febf3
Start work on LaplaceSquared. FULL OF ERRORS?!
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
36 |
f6b3af6febf3
Start work on LaplaceSquared. FULL OF ERRORS?!
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
37 obj.H = obj.laplaceDiffOp.H; |
f6b3af6febf3
Start work on LaplaceSquared. FULL OF ERRORS?!
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
38 obj.Hi = spdiag(1./diag(obj.H)); |
f6b3af6febf3
Start work on LaplaceSquared. FULL OF ERRORS?!
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
39 |
f6b3af6febf3
Start work on LaplaceSquared. FULL OF ERRORS?!
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
40 A = spdiag(a); |
f6b3af6febf3
Start work on LaplaceSquared. FULL OF ERRORS?!
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
41 B = spdiag(b); |
f6b3af6febf3
Start work on LaplaceSquared. FULL OF ERRORS?!
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
42 |
f6b3af6febf3
Start work on LaplaceSquared. FULL OF ERRORS?!
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
43 D_laplace = obj.laplaceDiffOp.D; |
f6b3af6febf3
Start work on LaplaceSquared. FULL OF ERRORS?!
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
44 obj.D = A*D_laplace*B*D_laplace; |
f6b3af6febf3
Start work on LaplaceSquared. FULL OF ERRORS?!
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
45 end |
f6b3af6febf3
Start work on LaplaceSquared. FULL OF ERRORS?!
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
46 |
f6b3af6febf3
Start work on LaplaceSquared. FULL OF ERRORS?!
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
47 function s = size(obj) |
f6b3af6febf3
Start work on LaplaceSquared. FULL OF ERRORS?!
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
48 s = size(obj.laplaceDiffOp); |
f6b3af6febf3
Start work on LaplaceSquared. FULL OF ERRORS?!
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
49 end |
f6b3af6febf3
Start work on LaplaceSquared. FULL OF ERRORS?!
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
50 |
f6b3af6febf3
Start work on LaplaceSquared. FULL OF ERRORS?!
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
51 function op = getBoundaryOperator(obj, opName, boundary) |
f6b3af6febf3
Start work on LaplaceSquared. FULL OF ERRORS?!
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
52 switch opName |
f6b3af6febf3
Start work on LaplaceSquared. FULL OF ERRORS?!
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
53 case 'e' |
f6b3af6febf3
Start work on LaplaceSquared. FULL OF ERRORS?!
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
54 op = getBoundaryOperator(obj.laplaceDiffOp, 'e', boundary); |
f6b3af6febf3
Start work on LaplaceSquared. FULL OF ERRORS?!
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
55 case 'd1' |
f6b3af6febf3
Start work on LaplaceSquared. FULL OF ERRORS?!
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
56 op = getBoundaryOperator(obj.laplaceDiffOp, 'd', boundary); |
f6b3af6febf3
Start work on LaplaceSquared. FULL OF ERRORS?!
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
57 case 'd2' |
f6b3af6febf3
Start work on LaplaceSquared. FULL OF ERRORS?!
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
58 e = getBoundaryOperator(obj.laplaceDiffOp, 'e', boundary); |
f6b3af6febf3
Start work on LaplaceSquared. FULL OF ERRORS?!
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
59 op = (e'*obj.laplaceDiffOp.D)'; |
f6b3af6febf3
Start work on LaplaceSquared. FULL OF ERRORS?!
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
60 case 'd3' |
f6b3af6febf3
Start work on LaplaceSquared. FULL OF ERRORS?!
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
61 d1 = getBoundaryOperator(obj.laplaceDiffOp, 'd', boundary); |
f6b3af6febf3
Start work on LaplaceSquared. FULL OF ERRORS?!
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
62 op = (d1'*spdiag(obj.b)*obj.laplaceDiffOp.D)'; |
f6b3af6febf3
Start work on LaplaceSquared. FULL OF ERRORS?!
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
63 end |
f6b3af6febf3
Start work on LaplaceSquared. FULL OF ERRORS?!
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
64 end |
f6b3af6febf3
Start work on LaplaceSquared. FULL OF ERRORS?!
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
65 |
f6b3af6febf3
Start work on LaplaceSquared. FULL OF ERRORS?!
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
66 function op = getBoundaryQuadrature(obj, boundary) |
f6b3af6febf3
Start work on LaplaceSquared. FULL OF ERRORS?!
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
67 op = getBoundaryQuadrature(obj.laplaceDiffOp, boundary); |
f6b3af6febf3
Start work on LaplaceSquared. FULL OF ERRORS?!
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
68 end |
f6b3af6febf3
Start work on LaplaceSquared. FULL OF ERRORS?!
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
69 |
f6b3af6febf3
Start work on LaplaceSquared. FULL OF ERRORS?!
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
70 function [closure, penalty] = boundary_condition(obj,boundary,type) % TODO: Change name to boundaryCondition |
f6b3af6febf3
Start work on LaplaceSquared. FULL OF ERRORS?!
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
71 switch type |
f6b3af6febf3
Start work on LaplaceSquared. FULL OF ERRORS?!
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
72 case 'e' |
f6b3af6febf3
Start work on LaplaceSquared. FULL OF ERRORS?!
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
73 error('Bc of type ''e'' not implemented') |
f6b3af6febf3
Start work on LaplaceSquared. FULL OF ERRORS?!
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
74 case 'd1' |
f6b3af6febf3
Start work on LaplaceSquared. FULL OF ERRORS?!
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
75 error('Bc of type ''d1'' not implemented') |
f6b3af6febf3
Start work on LaplaceSquared. FULL OF ERRORS?!
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
76 case 'd2' |
f6b3af6febf3
Start work on LaplaceSquared. FULL OF ERRORS?!
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
77 e = obj.getBoundaryOperator('e', boundary); |
f6b3af6febf3
Start work on LaplaceSquared. FULL OF ERRORS?!
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
78 d1 = obj.getBoundaryOperator('d1', boundary); |
f6b3af6febf3
Start work on LaplaceSquared. FULL OF ERRORS?!
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
79 d2 = obj.getBoundaryOperator('d2', boundary); |
f6b3af6febf3
Start work on LaplaceSquared. FULL OF ERRORS?!
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
80 H_b = obj.getBoundaryQuadrature(boundary); |
f6b3af6febf3
Start work on LaplaceSquared. FULL OF ERRORS?!
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
81 |
f6b3af6febf3
Start work on LaplaceSquared. FULL OF ERRORS?!
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
82 A = spdiag(obj.a); |
f6b3af6febf3
Start work on LaplaceSquared. FULL OF ERRORS?!
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
83 B_b = spdiag(e'*obj.b); |
f6b3af6febf3
Start work on LaplaceSquared. FULL OF ERRORS?!
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
84 |
f6b3af6febf3
Start work on LaplaceSquared. FULL OF ERRORS?!
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
85 tau = obj.Hi*A*d1*B_b*H_b; |
f6b3af6febf3
Start work on LaplaceSquared. FULL OF ERRORS?!
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
86 closure = tau*d2'; |
f6b3af6febf3
Start work on LaplaceSquared. FULL OF ERRORS?!
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
87 penalty = -tau; |
f6b3af6febf3
Start work on LaplaceSquared. FULL OF ERRORS?!
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
88 case 'd3' |
f6b3af6febf3
Start work on LaplaceSquared. FULL OF ERRORS?!
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
89 e = obj.getBoundaryOperator('e', boundary); |
1073
95113a592421
Fix bug in d3 boundary condition
Jonatan Werpers <jonatan@werpers.com>
parents:
1070
diff
changeset
|
90 d3 = obj.getBoundaryOperator('d3', boundary); |
1070
f6b3af6febf3
Start work on LaplaceSquared. FULL OF ERRORS?!
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
91 H_b = obj.getBoundaryQuadrature(boundary); |
f6b3af6febf3
Start work on LaplaceSquared. FULL OF ERRORS?!
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
92 |
f6b3af6febf3
Start work on LaplaceSquared. FULL OF ERRORS?!
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
93 A = spdiag(obj.a); |
f6b3af6febf3
Start work on LaplaceSquared. FULL OF ERRORS?!
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
94 |
f6b3af6febf3
Start work on LaplaceSquared. FULL OF ERRORS?!
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
95 tau = -obj.Hi*A*e*H_b; |
f6b3af6febf3
Start work on LaplaceSquared. FULL OF ERRORS?!
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
96 closure = tau*d3'; |
f6b3af6febf3
Start work on LaplaceSquared. FULL OF ERRORS?!
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
97 penalty = -tau; |
f6b3af6febf3
Start work on LaplaceSquared. FULL OF ERRORS?!
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
98 end |
f6b3af6febf3
Start work on LaplaceSquared. FULL OF ERRORS?!
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
99 end |
f6b3af6febf3
Start work on LaplaceSquared. FULL OF ERRORS?!
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
100 |
f6b3af6febf3
Start work on LaplaceSquared. FULL OF ERRORS?!
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
101 function [closure, penalty] = interface(obj,boundary,neighbour_scheme,neighbour_boundary) |
f6b3af6febf3
Start work on LaplaceSquared. FULL OF ERRORS?!
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
102 error('Not implemented') |
f6b3af6febf3
Start work on LaplaceSquared. FULL OF ERRORS?!
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
103 end |
f6b3af6febf3
Start work on LaplaceSquared. FULL OF ERRORS?!
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
104 end |
1074 | 105 end |