comparison +scheme/Hypsyst3d.m @ 1231:e1f9bedd64a9 feature/volcano

Add opSet to Hypsyst3d
author Vidar Stiernström <vidar.stiernstrom@it.uu.se>
date Mon, 18 Nov 2019 17:17:16 -0800
parents ef08adea56c4
children 10881b234f77
comparison
equal deleted inserted replaced
1228:ef08adea56c4 1231:e1f9bedd64a9
11 Aevaluated,Bevaluated,Cevaluated, Eevaluated 11 Aevaluated,Bevaluated,Cevaluated, Eevaluated
12 12
13 H % Discrete norm 13 H % Discrete norm
14 Hx, Hy, Hz % Norms in the x, y and z directions 14 Hx, Hy, Hz % Norms in the x, y and z directions
15 Hxi,Hyi, Hzi % Kroneckerd norms. 1'*Hx*v corresponds to integration in the x dir. 15 Hxi,Hyi, Hzi % Kroneckerd norms. 1'*Hx*v corresponds to integration in the x dir.
16 I_x,I_y, I_z, I_N
17 e_w, e_e, e_s, e_n, e_b, e_t 16 e_w, e_e, e_s, e_n, e_b, e_t
18 params % Parameters for the coefficient matrices 17 params % Parameters for the coefficient matrices
19 end 18 end
20 19
21 20
22 methods 21 methods
23 % Solving Hyperbolic systems on the form u_t=-Au_x-Bu_y-Cu_z-Eu 22 % Solving Hyperbolic systems on the form u_t=-Au_x-Bu_y-Cu_z-Eu
24 function obj = Hypsyst3d(cartesianGrid, order, A, B, C, E, params, operator) 23 function obj = Hypsyst3d(cartesianGrid, order, A, B, C, E, params, opSet)
25 assertType(cartesianGrid, 'grid.Cartesian'); 24 assertType(cartesianGrid, 'grid.Cartesian');
26 default_arg('E', []) 25 default_arg('E', [])
26 default_arg('opSet', @sbp.D2Standard)
27 obj.grid = cartesianGrid; 27 obj.grid = cartesianGrid;
28 xlim = obj.grid.lim{1};
29 ylim = obj.grid.lim{2};
30 zlim = obj.grid.lim{3};
31 28
32 obj.A = A; 29 obj.A = A;
33 obj.B = B; 30 obj.B = B;
34 obj.C = C; 31 obj.C = C;
35 obj.E = E; 32 obj.E = E;
36 m_x = obj.grid.m(1);
37 m_y = obj.grid.m(2);
38 m_z = obj.grid.m(3);
39 obj.params = params; 33 obj.params = params;
40 34 dim = obj.grid.d;
41 switch operator 35 assert(dim == 3, 'Dimensions not correct')
42 case 'upwind'
43 ops_x = sbp.D1Upwind(m_x,xlim,order);
44 ops_y = sbp.D1Upwind(m_y,ylim,order);
45 ops_z = sbp.D1Upwind(m_z,zlim,order);
46 otherwise
47 ops_x = sbp.D2Standard(m_x,xlim,order);
48 ops_y = sbp.D2Standard(m_y,ylim,order);
49 ops_z = sbp.D2Standard(m_z,zlim,order);
50 end
51
52 x = obj.grid.x{1};
53 y = obj.grid.x{2};
54 z = obj.grid.x{3};
55 points = obj.grid.points(); 36 points = obj.grid.points();
56 X = points(:, 1); 37 m = obj.grid.m;
57 Y = points(:, 2); 38 for i = 1:dim
58 Z = points(:, 3); 39 ops{i} = opSet(m(i),obj.grid.lim{i},order);
59 40 x{i} = obj.grid.x{i};
60 obj.Yx = kr(y, ones(m_z,1)); 41 X{i} = points(:,i);
61 obj.Zx = kr(ones(m_y,1), z); 42 end
62 obj.Xy = kr(x, ones(m_z,1)); 43
63 obj.Zy = kr(ones(m_x,1), z); 44 obj.Yx = kr(x{2}, ones(m(3),1));
64 obj.Xz = kr(x, ones(m_y,1)); 45 obj.Zx = kr(ones(m(2),1), x{3});
65 obj.Yz = kr(ones(m_z,1), y); 46 obj.Xy = kr(x{1}, ones(m(3),1));
66 47 obj.Zy = kr(ones(m(1),1), x{3});
67 obj.Aevaluated = obj.evaluateCoefficientMatrix(A, X, Y, Z); 48 obj.Xz = kr(x{1}, ones(m(2),1));
68 obj.Bevaluated = obj.evaluateCoefficientMatrix(B, X, Y, Z); 49 obj.Yz = kr(ones(m(3),1), x{2});
69 obj.Cevaluated = obj.evaluateCoefficientMatrix(C, X, Y, Z); 50
70 obj.Eevaluated = obj.evaluateCoefficientMatrix(E, X, Y, Z); 51 obj.Aevaluated = obj.evaluateCoefficientMatrix(A, X{:});
52 obj.Bevaluated = obj.evaluateCoefficientMatrix(B, X{:});
53 obj.Cevaluated = obj.evaluateCoefficientMatrix(C, X{:});
54 obj.Eevaluated = obj.evaluateCoefficientMatrix(E, X{:});
71 55
72 obj.nEquations = length(A(obj.params,0,0,0)); 56 obj.nEquations = length(A(obj.params,0,0,0));
73 57
74 I_n = speye(obj.nEquations); 58 I_n = speye(obj.nEquations);
75 I_x = speye(m_x); 59 I_x = speye(m(1));
76 obj.I_x = I_x; 60 I_y = speye(m(2));
77 I_y = speye(m_y); 61 I_z = speye(m(3));
78 obj.I_y = I_y;
79 I_z = speye(m_z);
80 obj.I_z = I_z;
81 I_N = kr(I_n,I_x,I_y,I_z); 62 I_N = kr(I_n,I_x,I_y,I_z);
82 63
83 obj.Hxi = kr(I_n, ops_x.HI, I_y,I_z); 64 obj.Hxi = kr(I_n, ops{1}.HI, I_y,I_z);
84 obj.Hx = ops_x.H; 65 obj.Hx = ops{1}.H;
85 obj.Hyi = kr(I_n, I_x, ops_y.HI,I_z); 66 obj.Hyi = kr(I_n, I_x, ops{2}.HI,I_z);
86 obj.Hy = ops_y.H; 67 obj.Hy = ops{2}.H;
87 obj.Hzi = kr(I_n, I_x,I_y, ops_z.HI); 68 obj.Hzi = kr(I_n, I_x,I_y, ops{3}.HI);
88 obj.Hz = ops_z.H; 69 obj.Hz = ops{3}.H;
89 70
90 obj.e_w = kr(I_n, ops_x.e_l, I_y,I_z); 71 obj.e_w = kr(I_n, ops{1}.e_l, I_y,I_z);
91 obj.e_e = kr(I_n, ops_x.e_r, I_y,I_z); 72 obj.e_e = kr(I_n, ops{1}.e_r, I_y,I_z);
92 obj.e_s = kr(I_n, I_x, ops_y.e_l,I_z); 73 obj.e_s = kr(I_n, I_x, ops{2}.e_l,I_z);
93 obj.e_n = kr(I_n, I_x, ops_y.e_r,I_z); 74 obj.e_n = kr(I_n, I_x, ops{2}.e_r,I_z);
94 obj.e_b = kr(I_n, I_x, I_y, ops_z.e_l); 75 obj.e_b = kr(I_n, I_x, I_y, ops{3}.e_l);
95 obj.e_t = kr(I_n, I_x, I_y, ops_z.e_r); 76 obj.e_t = kr(I_n, I_x, I_y, ops{3}.e_r);
96 77
97 obj.order = order; 78 obj.order = order;
98 79
99 switch operator 80 switch toString(opSet)
100 case 'upwind' 81 case 'sbp.D1Upwind'
101 alphaA = max(abs(eig(A(params, x(end), y(end), z(end))))); 82 alphaA = max(abs(eig(A(params, x{1}(end), x{2}(end), x{3}(end)))));
102 alphaB = max(abs(eig(B(params, x(end), y(end), z(end))))); 83 alphaB = max(abs(eig(B(params, x{1}(end), x{2}(end), x{3}(end)))));
103 alphaC = max(abs(eig(C(params, x(end), y(end), z(end))))); 84 alphaC = max(abs(eig(C(params, x{1}(end), x{2}(end), x{3}(end)))));
104 85
105 Ap = (obj.Aevaluated+alphaA*I_N)/2; 86 Ap = (obj.Aevaluated+alphaA*I_N)/2;
106 Am = (obj.Aevaluated-alphaA*I_N)/2; 87 Am = (obj.Aevaluated-alphaA*I_N)/2;
107 Dpx = kr(I_n, ops_x.Dp, I_y,I_z); 88 Dpx = kr(I_n, ops{1}.Dp, I_y,I_z);
108 Dmx = kr(I_n, ops_x.Dm, I_y,I_z); 89 Dmx = kr(I_n, ops{1}.Dm, I_y,I_z);
109 obj.D = -Am*Dpx; 90 obj.D = -Am*Dpx;
110 temp = Ap*Dmx; 91 temp = Ap*Dmx;
111 obj.D = obj.D-temp; 92 obj.D = obj.D-temp;
112 clear Ap Am Dpx Dmx 93 clear Ap Am Dpx Dmx
113 94
114 Bp = (obj.Bevaluated+alphaB*I_N)/2; 95 Bp = (obj.Bevaluated+alphaB*I_N)/2;
115 Bm = (obj.Bevaluated-alphaB*I_N)/2; 96 Bm = (obj.Bevaluated-alphaB*I_N)/2;
116 Dpy = kr(I_n, I_x, ops_y.Dp,I_z); 97 Dpy = kr(I_n, I_x, ops{2}.Dp,I_z);
117 Dmy = kr(I_n, I_x, ops_y.Dm,I_z); 98 Dmy = kr(I_n, I_x, ops{2}.Dm,I_z);
118 temp = Bm*Dpy; 99 temp = Bm*Dpy;
119 obj.D = obj.D-temp; 100 obj.D = obj.D-temp;
120 temp = Bp*Dmy; 101 temp = Bp*Dmy;
121 obj.D = obj.D-temp; 102 obj.D = obj.D-temp;
122 clear Bp Bm Dpy Dmy 103 clear Bp Bm Dpy Dmy
123 104
124 105
125 Cp = (obj.Cevaluated+alphaC*I_N)/2; 106 Cp = (obj.Cevaluated+alphaC*I_N)/2;
126 Cm = (obj.Cevaluated-alphaC*I_N)/2; 107 Cm = (obj.Cevaluated-alphaC*I_N)/2;
127 Dpz = kr(I_n, I_x, I_y,ops_z.Dp); 108 Dpz = kr(I_n, I_x, I_y,ops{3}.Dp);
128 Dmz = kr(I_n, I_x, I_y,ops_z.Dm); 109 Dmz = kr(I_n, I_x, I_y,ops{3}.Dm);
129 110
130 temp = Cm*Dpz; 111 temp = Cm*Dpz;
131 obj.D = obj.D-temp; 112 obj.D = obj.D-temp;
132 temp = Cp*Dmz; 113 temp = Cp*Dmz;
133 obj.D = obj.D-temp; 114 obj.D = obj.D-temp;
134 clear Cp Cm Dpz Dmz 115 clear Cp Cm Dpz Dmz
135 obj.D = obj.D-obj.Eevaluated; 116 obj.D = obj.D-obj.Eevaluated;
136 117
137 case 'standard' 118 case {'sbp.D2Standard', 'sbp.D2Variable', 'sbp.D4Standard', 'sbp.D4Variable'}
138 D1_x = kr(I_n, ops_x.D1, I_y,I_z); 119 D1_x = kr(I_n, ops{1}.D1, I_y,I_z);
139 D1_y = kr(I_n, I_x, ops_y.D1,I_z); 120 D1_y = kr(I_n, I_x, ops{2}.D1,I_z);
140 D1_z = kr(I_n, I_x, I_y,ops_z.D1); 121 D1_z = kr(I_n, I_x, I_y,ops{3}.D1);
141 obj.D = -obj.Aevaluated*D1_x-obj.Bevaluated*D1_y-obj.Cevaluated*D1_z-obj.Eevaluated; 122 obj.D = -obj.Aevaluated*D1_x-obj.Bevaluated*D1_y-obj.Cevaluated*D1_z-obj.Eevaluated;
142 otherwise 123 otherwise
143 error('Opperator not supported'); 124 error('Operator not supported');
144 end 125 end
145 end 126 end
146 127
147 % Closure functions return the operators applied to the own domain to close the boundary 128 % Closure functions return the operators applied to the own domain to close the boundary
148 % Penalty functions return the operators to force the solution. In the case of an interface it returns the operator applied to the other doamin. 129 % Penalty functions return the operators to force the solution. In the case of an interface it returns the operator applied to the other doamin.