Mercurial > repos > public > sbplib
comparison +multiblock/LaplaceSquared.m @ 1070:f6b3af6febf3 feature/grids/LaplaceSquared
Start work on LaplaceSquared. FULL OF ERRORS?!
author | Jonatan Werpers <jonatan@werpers.com> |
---|---|
date | Tue, 24 Jul 2018 21:08:08 -0700 |
parents | |
children | 95113a592421 |
comparison
equal
deleted
inserted
replaced
784:085fc0fe537f | 1070:f6b3af6febf3 |
---|---|
1 classdef LaplaceSquared < scheme.Scheme | |
2 properties | |
3 grid | |
4 order | |
5 laplaceDiffOp | |
6 | |
7 D | |
8 H | |
9 Hi | |
10 | |
11 a,b | |
12 end | |
13 | |
14 methods | |
15 % Discretisation of a*nabla*b*nabla | |
16 function obj = LaplaceSquared(g, order, a, b, opGen) | |
17 default_arg('order', 4); | |
18 default_arg('a', 1); | |
19 default_arg('b', 1); | |
20 default_arg('opGen', @sbp.D4Variable); | |
21 | |
22 if isscalar(a) | |
23 a = grid.evalOn(g, a); | |
24 end | |
25 | |
26 if isscalar(b) | |
27 b = grid.evalOn(g, b); | |
28 end | |
29 | |
30 obj.grid = g; | |
31 obj.order = order; | |
32 obj.a = a; | |
33 obj.b = b; | |
34 | |
35 obj.laplaceDiffOp = multiblock.Laplace(g, order, 1, 1, opGen); | |
36 | |
37 obj.H = obj.laplaceDiffOp.H; | |
38 obj.Hi = spdiag(1./diag(obj.H)); | |
39 | |
40 A = spdiag(a); | |
41 B = spdiag(b); | |
42 | |
43 D_laplace = obj.laplaceDiffOp.D; | |
44 obj.D = A*D_laplace*B*D_laplace; | |
45 end | |
46 | |
47 function s = size(obj) | |
48 s = size(obj.laplaceDiffOp); | |
49 end | |
50 | |
51 function op = getBoundaryOperator(obj, opName, boundary) | |
52 switch opName | |
53 case 'e' | |
54 op = getBoundaryOperator(obj.laplaceDiffOp, 'e', boundary); | |
55 case 'd1' | |
56 op = getBoundaryOperator(obj.laplaceDiffOp, 'd', boundary); | |
57 case 'd2' | |
58 e = getBoundaryOperator(obj.laplaceDiffOp, 'e', boundary); | |
59 op = (e'*obj.laplaceDiffOp.D)'; | |
60 case 'd3' | |
61 d1 = getBoundaryOperator(obj.laplaceDiffOp, 'd', boundary); | |
62 op = (d1'*spdiag(obj.b)*obj.laplaceDiffOp.D)'; | |
63 end | |
64 end | |
65 | |
66 function op = getBoundaryQuadrature(obj, boundary) | |
67 op = getBoundaryQuadrature(obj.laplaceDiffOp, boundary); | |
68 end | |
69 | |
70 function [closure, penalty] = boundary_condition(obj,boundary,type) % TODO: Change name to boundaryCondition | |
71 switch type | |
72 case 'e' | |
73 error('Bc of type ''e'' not implemented') | |
74 case 'd1' | |
75 error('Bc of type ''d1'' not implemented') | |
76 case 'd2' | |
77 e = obj.getBoundaryOperator('e', boundary); | |
78 d1 = obj.getBoundaryOperator('d1', boundary); | |
79 d2 = obj.getBoundaryOperator('d2', boundary); | |
80 H_b = obj.getBoundaryQuadrature(boundary); | |
81 | |
82 A = spdiag(obj.a); | |
83 B_b = spdiag(e'*obj.b); | |
84 | |
85 tau = obj.Hi*A*d1*B_b*H_b; | |
86 closure = tau*d2'; | |
87 penalty = -tau; | |
88 case 'd3' | |
89 e = obj.getBoundaryOperator('e', boundary); | |
90 d3 = obj.getBoundaryOperator('d1', boundary); | |
91 H_b = obj.getBoundaryQuadrature(boundary); | |
92 | |
93 A = spdiag(obj.a); | |
94 | |
95 tau = -obj.Hi*A*e*H_b; | |
96 closure = tau*d3'; | |
97 penalty = -tau; | |
98 end | |
99 end | |
100 | |
101 function [closure, penalty] = interface(obj,boundary,neighbour_scheme,neighbour_boundary) | |
102 error('Not implemented') | |
103 end | |
104 end | |
105 end |