annotate +scheme/Staggered1DAcousticsVariable.m @ 652:be941bb0a11a feature/d1_staggered

Add staggered 1D variable coefficient. Convergence study working.
author Martin Almquist <malmquist@stanford.edu>
date Mon, 04 Dec 2017 11:11:03 -0800
parents
children 2351a7690e8a
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
652
be941bb0a11a Add staggered 1D variable coefficient. Convergence study working.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
1 classdef Staggered1DAcousticsVariable < scheme.Scheme
be941bb0a11a Add staggered 1D variable coefficient. Convergence study working.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
2 properties
be941bb0a11a Add staggered 1D variable coefficient. Convergence study working.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
3 m % Number of points of primal grid in each direction, possibly a vector
be941bb0a11a Add staggered 1D variable coefficient. Convergence study working.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
4 h % Grid spacing
be941bb0a11a Add staggered 1D variable coefficient. Convergence study working.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
5
be941bb0a11a Add staggered 1D variable coefficient. Convergence study working.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
6 % Grids
be941bb0a11a Add staggered 1D variable coefficient. Convergence study working.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
7 grid % Total grid object
be941bb0a11a Add staggered 1D variable coefficient. Convergence study working.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
8 grid_primal
be941bb0a11a Add staggered 1D variable coefficient. Convergence study working.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
9 grid_dual
be941bb0a11a Add staggered 1D variable coefficient. Convergence study working.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
10
be941bb0a11a Add staggered 1D variable coefficient. Convergence study working.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
11 order % Order accuracy for the approximation
be941bb0a11a Add staggered 1D variable coefficient. Convergence study working.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
12
be941bb0a11a Add staggered 1D variable coefficient. Convergence study working.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
13 H % Combined norm
be941bb0a11a Add staggered 1D variable coefficient. Convergence study working.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
14 Hi % Inverse
be941bb0a11a Add staggered 1D variable coefficient. Convergence study working.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
15 D % Semi-discrete approximation matrix
be941bb0a11a Add staggered 1D variable coefficient. Convergence study working.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
16
be941bb0a11a Add staggered 1D variable coefficient. Convergence study working.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
17 D1_primal
be941bb0a11a Add staggered 1D variable coefficient. Convergence study working.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
18 D1_dual
be941bb0a11a Add staggered 1D variable coefficient. Convergence study working.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
19
be941bb0a11a Add staggered 1D variable coefficient. Convergence study working.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
20 % Pick out left or right boundary
be941bb0a11a Add staggered 1D variable coefficient. Convergence study working.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
21 e_l
be941bb0a11a Add staggered 1D variable coefficient. Convergence study working.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
22 e_r
be941bb0a11a Add staggered 1D variable coefficient. Convergence study working.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
23
be941bb0a11a Add staggered 1D variable coefficient. Convergence study working.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
24 % Initial data
be941bb0a11a Add staggered 1D variable coefficient. Convergence study working.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
25 v0
be941bb0a11a Add staggered 1D variable coefficient. Convergence study working.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
26
be941bb0a11a Add staggered 1D variable coefficient. Convergence study working.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
27 % Pick out primal or dual component
be941bb0a11a Add staggered 1D variable coefficient. Convergence study working.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
28 e_primal
be941bb0a11a Add staggered 1D variable coefficient. Convergence study working.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
29 e_dual
be941bb0a11a Add staggered 1D variable coefficient. Convergence study working.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
30
be941bb0a11a Add staggered 1D variable coefficient. Convergence study working.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
31 % System matrices
be941bb0a11a Add staggered 1D variable coefficient. Convergence study working.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
32 A
be941bb0a11a Add staggered 1D variable coefficient. Convergence study working.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
33 B
be941bb0a11a Add staggered 1D variable coefficient. Convergence study working.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
34
be941bb0a11a Add staggered 1D variable coefficient. Convergence study working.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
35 %
be941bb0a11a Add staggered 1D variable coefficient. Convergence study working.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
36 A_l, A_r
be941bb0a11a Add staggered 1D variable coefficient. Convergence study working.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
37 B_l, B_r
be941bb0a11a Add staggered 1D variable coefficient. Convergence study working.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
38 end
be941bb0a11a Add staggered 1D variable coefficient. Convergence study working.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
39
be941bb0a11a Add staggered 1D variable coefficient. Convergence study working.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
40
be941bb0a11a Add staggered 1D variable coefficient. Convergence study working.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
41 methods
be941bb0a11a Add staggered 1D variable coefficient. Convergence study working.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
42 % Scheme for A*u_t + B u_x = 0,
be941bb0a11a Add staggered 1D variable coefficient. Convergence study working.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
43 % u = [p, v];
be941bb0a11a Add staggered 1D variable coefficient. Convergence study working.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
44 % A: Diagonal and A > 0,
be941bb0a11a Add staggered 1D variable coefficient. Convergence study working.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
45 % A = [a1, 0;
be941bb0a11a Add staggered 1D variable coefficient. Convergence study working.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
46 % 0, a2]
be941bb0a11a Add staggered 1D variable coefficient. Convergence study working.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
47 %
be941bb0a11a Add staggered 1D variable coefficient. Convergence study working.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
48 % B = B^T and with diagonal entries = 0.
be941bb0a11a Add staggered 1D variable coefficient. Convergence study working.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
49 % B = [0 b
be941bb0a11a Add staggered 1D variable coefficient. Convergence study working.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
50 % b 0]
be941bb0a11a Add staggered 1D variable coefficient. Convergence study working.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
51 % Here we store p on the primal grid and v on the dual
be941bb0a11a Add staggered 1D variable coefficient. Convergence study working.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
52 function obj = Staggered1DAcousticsVariable(g, order, A, B)
be941bb0a11a Add staggered 1D variable coefficient. Convergence study working.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
53 default_arg('B',{@(x)0*x, @(x)0*x+1; @(x)0*x+1, @(x)0*x});
be941bb0a11a Add staggered 1D variable coefficient. Convergence study working.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
54 default_arg('A',{@(x)0*x+1, @(x)0*x; @(x)0*x, @(x)0*x+1});
be941bb0a11a Add staggered 1D variable coefficient. Convergence study working.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
55
be941bb0a11a Add staggered 1D variable coefficient. Convergence study working.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
56 obj.order = order;
be941bb0a11a Add staggered 1D variable coefficient. Convergence study working.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
57 obj.A = A;
be941bb0a11a Add staggered 1D variable coefficient. Convergence study working.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
58 obj.B = B;
be941bb0a11a Add staggered 1D variable coefficient. Convergence study working.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
59
be941bb0a11a Add staggered 1D variable coefficient. Convergence study working.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
60 % Grids
be941bb0a11a Add staggered 1D variable coefficient. Convergence study working.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
61 obj.m = g.size();
be941bb0a11a Add staggered 1D variable coefficient. Convergence study working.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
62 xl = g.getBoundary('l');
be941bb0a11a Add staggered 1D variable coefficient. Convergence study working.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
63 xr = g.getBoundary('r');
be941bb0a11a Add staggered 1D variable coefficient. Convergence study working.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
64 xlim = {xl, xr};
be941bb0a11a Add staggered 1D variable coefficient. Convergence study working.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
65
be941bb0a11a Add staggered 1D variable coefficient. Convergence study working.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
66 % Boundary matrices
be941bb0a11a Add staggered 1D variable coefficient. Convergence study working.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
67 obj.A_l = [A{1,1}(xl), A{1,2}(xl);....
be941bb0a11a Add staggered 1D variable coefficient. Convergence study working.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
68 A{2,1}(xl), A{2,2}(xl)];
be941bb0a11a Add staggered 1D variable coefficient. Convergence study working.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
69 obj.A_r = [A{1,1}(xr), A{1,2}(xr);....
be941bb0a11a Add staggered 1D variable coefficient. Convergence study working.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
70 A{2,1}(xr), A{2,2}(xr)];
be941bb0a11a Add staggered 1D variable coefficient. Convergence study working.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
71 obj.B_l = [B{1,1}(xl), B{1,2}(xl);....
be941bb0a11a Add staggered 1D variable coefficient. Convergence study working.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
72 B{2,1}(xl), B{2,2}(xl)];
be941bb0a11a Add staggered 1D variable coefficient. Convergence study working.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
73 obj.B_r = [B{1,1}(xr), B{1,2}(xr);....
be941bb0a11a Add staggered 1D variable coefficient. Convergence study working.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
74 B{2,1}(xr), B{2,2}(xr)];
be941bb0a11a Add staggered 1D variable coefficient. Convergence study working.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
75
be941bb0a11a Add staggered 1D variable coefficient. Convergence study working.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
76 obj.grid = g;
be941bb0a11a Add staggered 1D variable coefficient. Convergence study working.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
77 obj.grid_primal = g.grids{1};
be941bb0a11a Add staggered 1D variable coefficient. Convergence study working.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
78 obj.grid_dual = g.grids{2};
be941bb0a11a Add staggered 1D variable coefficient. Convergence study working.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
79 x_primal = obj.grid_primal.points();
be941bb0a11a Add staggered 1D variable coefficient. Convergence study working.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
80 x_dual = obj.grid_dual.points();
be941bb0a11a Add staggered 1D variable coefficient. Convergence study working.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
81
be941bb0a11a Add staggered 1D variable coefficient. Convergence study working.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
82 % Get operators
be941bb0a11a Add staggered 1D variable coefficient. Convergence study working.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
83 ops = sbp.D1StaggeredUpwind(obj.m, xlim, order);
be941bb0a11a Add staggered 1D variable coefficient. Convergence study working.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
84 obj.h = ops.h;
be941bb0a11a Add staggered 1D variable coefficient. Convergence study working.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
85
be941bb0a11a Add staggered 1D variable coefficient. Convergence study working.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
86 % Build combined operators
be941bb0a11a Add staggered 1D variable coefficient. Convergence study working.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
87 H_primal = ops.H_primal;
be941bb0a11a Add staggered 1D variable coefficient. Convergence study working.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
88 H_dual = ops.H_dual;
be941bb0a11a Add staggered 1D variable coefficient. Convergence study working.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
89 obj.H = blockmatrix.toMatrix( {H_primal, []; [], H_dual } );
be941bb0a11a Add staggered 1D variable coefficient. Convergence study working.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
90 obj.Hi = inv(obj.H);
be941bb0a11a Add staggered 1D variable coefficient. Convergence study working.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
91
be941bb0a11a Add staggered 1D variable coefficient. Convergence study working.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
92 D1_primal = ops.D1_primal;
be941bb0a11a Add staggered 1D variable coefficient. Convergence study working.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
93 D1_dual = ops.D1_dual;
be941bb0a11a Add staggered 1D variable coefficient. Convergence study working.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
94 A11_B12 = spdiag(-1./A{1,1}(x_primal).*B{1,2}(x_primal), 0);
be941bb0a11a Add staggered 1D variable coefficient. Convergence study working.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
95 A22_B21 = spdiag(-1./A{2,2}(x_dual).*B{2,1}(x_dual), 0);
be941bb0a11a Add staggered 1D variable coefficient. Convergence study working.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
96 D = {[], A11_B12*D1_primal;...
be941bb0a11a Add staggered 1D variable coefficient. Convergence study working.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
97 A22_B21*D1_dual, []};
be941bb0a11a Add staggered 1D variable coefficient. Convergence study working.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
98 obj.D = blockmatrix.toMatrix(D);
be941bb0a11a Add staggered 1D variable coefficient. Convergence study working.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
99 obj.D1_primal = D1_primal;
be941bb0a11a Add staggered 1D variable coefficient. Convergence study working.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
100 obj.D1_dual = D1_dual;
be941bb0a11a Add staggered 1D variable coefficient. Convergence study working.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
101
be941bb0a11a Add staggered 1D variable coefficient. Convergence study working.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
102 % Combined boundary operators
be941bb0a11a Add staggered 1D variable coefficient. Convergence study working.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
103 e_primal_l = ops.e_primal_l;
be941bb0a11a Add staggered 1D variable coefficient. Convergence study working.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
104 e_primal_r = ops.e_primal_r;
be941bb0a11a Add staggered 1D variable coefficient. Convergence study working.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
105 e_dual_l = ops.e_dual_l;
be941bb0a11a Add staggered 1D variable coefficient. Convergence study working.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
106 e_dual_r = ops.e_dual_r;
be941bb0a11a Add staggered 1D variable coefficient. Convergence study working.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
107 e_l = {e_primal_l, [];...
be941bb0a11a Add staggered 1D variable coefficient. Convergence study working.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
108 [] , e_dual_l};
be941bb0a11a Add staggered 1D variable coefficient. Convergence study working.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
109 e_r = {e_primal_r, [];...
be941bb0a11a Add staggered 1D variable coefficient. Convergence study working.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
110 [] , e_dual_r};
be941bb0a11a Add staggered 1D variable coefficient. Convergence study working.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
111 obj.e_l = blockmatrix.toMatrix(e_l);
be941bb0a11a Add staggered 1D variable coefficient. Convergence study working.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
112 obj.e_r = blockmatrix.toMatrix(e_r);
be941bb0a11a Add staggered 1D variable coefficient. Convergence study working.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
113
be941bb0a11a Add staggered 1D variable coefficient. Convergence study working.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
114 % Pick out first or second component of solution
be941bb0a11a Add staggered 1D variable coefficient. Convergence study working.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
115 N_primal = obj.grid_primal.N();
be941bb0a11a Add staggered 1D variable coefficient. Convergence study working.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
116 N_dual = obj.grid_dual.N();
be941bb0a11a Add staggered 1D variable coefficient. Convergence study working.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
117 obj.e_primal = [speye(N_primal, N_primal); sparse(N_dual, N_primal)];
be941bb0a11a Add staggered 1D variable coefficient. Convergence study working.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
118 obj.e_dual = [sparse(N_primal, N_dual); speye(N_dual, N_dual)];
be941bb0a11a Add staggered 1D variable coefficient. Convergence study working.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
119
be941bb0a11a Add staggered 1D variable coefficient. Convergence study working.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
120
be941bb0a11a Add staggered 1D variable coefficient. Convergence study working.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
121 end
be941bb0a11a Add staggered 1D variable coefficient. Convergence study working.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
122 % Closure functions return the operators applied to the own domain to close the boundary
be941bb0a11a Add staggered 1D variable coefficient. Convergence study working.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
123 % Penalty functions return the operators to force the solution. In the case of an interface it returns the operator applied to the other domain.
be941bb0a11a Add staggered 1D variable coefficient. Convergence study working.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
124 % boundary is a string specifying the boundary e.g. 'l','r' or 'e','w','n','s'.
be941bb0a11a Add staggered 1D variable coefficient. Convergence study working.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
125 % type is a string specifying the type of boundary condition if there are several.
be941bb0a11a Add staggered 1D variable coefficient. Convergence study working.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
126 % neighbour_scheme is an instance of Scheme that should be interfaced to.
be941bb0a11a Add staggered 1D variable coefficient. Convergence study working.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
127 % neighbour_boundary is a string specifying which boundary to interface to.
be941bb0a11a Add staggered 1D variable coefficient. Convergence study working.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
128 function [closure, penalty] = boundary_condition(obj, boundary, type)
be941bb0a11a Add staggered 1D variable coefficient. Convergence study working.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
129
be941bb0a11a Add staggered 1D variable coefficient. Convergence study working.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
130 default_arg('type','p');
be941bb0a11a Add staggered 1D variable coefficient. Convergence study working.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
131
be941bb0a11a Add staggered 1D variable coefficient. Convergence study working.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
132 % type = 'p' => boundary condition for p
be941bb0a11a Add staggered 1D variable coefficient. Convergence study working.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
133 % type = 'v' => boundary condition for v
be941bb0a11a Add staggered 1D variable coefficient. Convergence study working.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
134 % No other types implemented yet
be941bb0a11a Add staggered 1D variable coefficient. Convergence study working.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
135
be941bb0a11a Add staggered 1D variable coefficient. Convergence study working.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
136 % BC on the form Lu - g = 0;
be941bb0a11a Add staggered 1D variable coefficient. Convergence study working.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
137
be941bb0a11a Add staggered 1D variable coefficient. Convergence study working.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
138 % Get boundary matrices
be941bb0a11a Add staggered 1D variable coefficient. Convergence study working.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
139 switch boundary
be941bb0a11a Add staggered 1D variable coefficient. Convergence study working.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
140 case 'l'
be941bb0a11a Add staggered 1D variable coefficient. Convergence study working.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
141 A = full(obj.A_l);
be941bb0a11a Add staggered 1D variable coefficient. Convergence study working.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
142 B = full(obj.B_l);
be941bb0a11a Add staggered 1D variable coefficient. Convergence study working.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
143 case 'r'
be941bb0a11a Add staggered 1D variable coefficient. Convergence study working.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
144 A = full(obj.A_r);
be941bb0a11a Add staggered 1D variable coefficient. Convergence study working.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
145 B = full(obj.B_r);
be941bb0a11a Add staggered 1D variable coefficient. Convergence study working.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
146 end
be941bb0a11a Add staggered 1D variable coefficient. Convergence study working.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
147
be941bb0a11a Add staggered 1D variable coefficient. Convergence study working.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
148 % Diagonalize B
be941bb0a11a Add staggered 1D variable coefficient. Convergence study working.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
149 [T, Lambda] = eig(B);
be941bb0a11a Add staggered 1D variable coefficient. Convergence study working.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
150 lambda = diag(Lambda);
be941bb0a11a Add staggered 1D variable coefficient. Convergence study working.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
151
be941bb0a11a Add staggered 1D variable coefficient. Convergence study working.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
152 % Identify in- and outgoing characteristic variables
be941bb0a11a Add staggered 1D variable coefficient. Convergence study working.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
153 Iplus = lambda > 0;
be941bb0a11a Add staggered 1D variable coefficient. Convergence study working.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
154 Iminus = lambda < 0;
be941bb0a11a Add staggered 1D variable coefficient. Convergence study working.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
155
be941bb0a11a Add staggered 1D variable coefficient. Convergence study working.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
156 switch boundary
be941bb0a11a Add staggered 1D variable coefficient. Convergence study working.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
157 case 'l'
be941bb0a11a Add staggered 1D variable coefficient. Convergence study working.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
158 Iout = Iminus;
be941bb0a11a Add staggered 1D variable coefficient. Convergence study working.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
159 Iin = Iplus;
be941bb0a11a Add staggered 1D variable coefficient. Convergence study working.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
160 case 'r'
be941bb0a11a Add staggered 1D variable coefficient. Convergence study working.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
161 Iout = Iplus;
be941bb0a11a Add staggered 1D variable coefficient. Convergence study working.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
162 Iin = Iminus;
be941bb0a11a Add staggered 1D variable coefficient. Convergence study working.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
163 end
be941bb0a11a Add staggered 1D variable coefficient. Convergence study working.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
164
be941bb0a11a Add staggered 1D variable coefficient. Convergence study working.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
165 Tin = T(:,Iin);
be941bb0a11a Add staggered 1D variable coefficient. Convergence study working.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
166 Tout = T(:,Iout);
be941bb0a11a Add staggered 1D variable coefficient. Convergence study working.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
167
be941bb0a11a Add staggered 1D variable coefficient. Convergence study working.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
168 switch type
be941bb0a11a Add staggered 1D variable coefficient. Convergence study working.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
169 case 'p'
be941bb0a11a Add staggered 1D variable coefficient. Convergence study working.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
170 L = [1, 0];
be941bb0a11a Add staggered 1D variable coefficient. Convergence study working.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
171 case 'v'
be941bb0a11a Add staggered 1D variable coefficient. Convergence study working.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
172 L = [0, 1];
be941bb0a11a Add staggered 1D variable coefficient. Convergence study working.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
173 case 'characteristic'
be941bb0a11a Add staggered 1D variable coefficient. Convergence study working.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
174 L = Tin';
be941bb0a11a Add staggered 1D variable coefficient. Convergence study working.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
175 otherwise
be941bb0a11a Add staggered 1D variable coefficient. Convergence study working.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
176 error('Boundary condition not implemented.');
be941bb0a11a Add staggered 1D variable coefficient. Convergence study working.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
177 end
be941bb0a11a Add staggered 1D variable coefficient. Convergence study working.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
178
be941bb0a11a Add staggered 1D variable coefficient. Convergence study working.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
179 % Penalty parameters
be941bb0a11a Add staggered 1D variable coefficient. Convergence study working.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
180 sigma = [0; 0];
be941bb0a11a Add staggered 1D variable coefficient. Convergence study working.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
181 sigma(Iin) = lambda(Iin);
be941bb0a11a Add staggered 1D variable coefficient. Convergence study working.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
182 switch boundary
be941bb0a11a Add staggered 1D variable coefficient. Convergence study working.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
183 case 'l'
be941bb0a11a Add staggered 1D variable coefficient. Convergence study working.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
184 tau = -1*obj.e_l * inv(A) * T * sigma * inv(L*Tin);
be941bb0a11a Add staggered 1D variable coefficient. Convergence study working.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
185 closure = obj.Hi*tau*L*obj.e_l';
be941bb0a11a Add staggered 1D variable coefficient. Convergence study working.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
186
be941bb0a11a Add staggered 1D variable coefficient. Convergence study working.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
187 case 'r'
be941bb0a11a Add staggered 1D variable coefficient. Convergence study working.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
188 tau = 1*obj.e_r * inv(A) * T * sigma * inv(L*Tin);
be941bb0a11a Add staggered 1D variable coefficient. Convergence study working.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
189 closure = obj.Hi*tau*L*obj.e_r';
be941bb0a11a Add staggered 1D variable coefficient. Convergence study working.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
190
be941bb0a11a Add staggered 1D variable coefficient. Convergence study working.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
191 end
be941bb0a11a Add staggered 1D variable coefficient. Convergence study working.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
192
be941bb0a11a Add staggered 1D variable coefficient. Convergence study working.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
193 penalty = -obj.Hi*tau;
be941bb0a11a Add staggered 1D variable coefficient. Convergence study working.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
194
be941bb0a11a Add staggered 1D variable coefficient. Convergence study working.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
195 end
be941bb0a11a Add staggered 1D variable coefficient. Convergence study working.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
196
be941bb0a11a Add staggered 1D variable coefficient. Convergence study working.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
197 function [closure, penalty] = interface(obj,boundary,neighbour_scheme,neighbour_boundary)
be941bb0a11a Add staggered 1D variable coefficient. Convergence study working.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
198
be941bb0a11a Add staggered 1D variable coefficient. Convergence study working.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
199 error('Staggered1DAcoustics, interface not implemented');
be941bb0a11a Add staggered 1D variable coefficient. Convergence study working.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
200
be941bb0a11a Add staggered 1D variable coefficient. Convergence study working.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
201 switch boundary
be941bb0a11a Add staggered 1D variable coefficient. Convergence study working.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
202 % Upwind coupling
be941bb0a11a Add staggered 1D variable coefficient. Convergence study working.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
203 case {'l','left'}
be941bb0a11a Add staggered 1D variable coefficient. Convergence study working.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
204 tau = -1*obj.e_l;
be941bb0a11a Add staggered 1D variable coefficient. Convergence study working.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
205 closure = obj.Hi*tau*obj.e_l';
be941bb0a11a Add staggered 1D variable coefficient. Convergence study working.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
206 penalty = -obj.Hi*tau*neighbour_scheme.e_r';
be941bb0a11a Add staggered 1D variable coefficient. Convergence study working.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
207 case {'r','right'}
be941bb0a11a Add staggered 1D variable coefficient. Convergence study working.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
208 tau = 0*obj.e_r;
be941bb0a11a Add staggered 1D variable coefficient. Convergence study working.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
209 closure = obj.Hi*tau*obj.e_r';
be941bb0a11a Add staggered 1D variable coefficient. Convergence study working.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
210 penalty = -obj.Hi*tau*neighbour_scheme.e_l';
be941bb0a11a Add staggered 1D variable coefficient. Convergence study working.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
211 end
be941bb0a11a Add staggered 1D variable coefficient. Convergence study working.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
212
be941bb0a11a Add staggered 1D variable coefficient. Convergence study working.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
213 end
be941bb0a11a Add staggered 1D variable coefficient. Convergence study working.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
214
be941bb0a11a Add staggered 1D variable coefficient. Convergence study working.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
215 function N = size(obj)
be941bb0a11a Add staggered 1D variable coefficient. Convergence study working.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
216 N = obj.m;
be941bb0a11a Add staggered 1D variable coefficient. Convergence study working.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
217 end
be941bb0a11a Add staggered 1D variable coefficient. Convergence study working.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
218
be941bb0a11a Add staggered 1D variable coefficient. Convergence study working.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
219 end
be941bb0a11a Add staggered 1D variable coefficient. Convergence study working.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
220
be941bb0a11a Add staggered 1D variable coefficient. Convergence study working.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
221 methods(Static)
be941bb0a11a Add staggered 1D variable coefficient. Convergence study working.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
222 % Calculates the matrices needed for the inteface coupling between boundary bound_u of scheme schm_u
be941bb0a11a Add staggered 1D variable coefficient. Convergence study working.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
223 % and bound_v of scheme schm_v.
be941bb0a11a Add staggered 1D variable coefficient. Convergence study working.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
224 % [uu, uv, vv, vu] = inteface_coupling(A,'r',B,'l')
be941bb0a11a Add staggered 1D variable coefficient. Convergence study working.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
225 function [uu, uv, vv, vu] = interface_coupling(schm_u,bound_u,schm_v,bound_v)
be941bb0a11a Add staggered 1D variable coefficient. Convergence study working.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
226 [uu,uv] = schm_u.interface(bound_u,schm_v,bound_v);
be941bb0a11a Add staggered 1D variable coefficient. Convergence study working.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
227 [vv,vu] = schm_v.interface(bound_v,schm_u,bound_u);
be941bb0a11a Add staggered 1D variable coefficient. Convergence study working.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
228 end
be941bb0a11a Add staggered 1D variable coefficient. Convergence study working.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
229 end
be941bb0a11a Add staggered 1D variable coefficient. Convergence study working.
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
230 end