Mercurial > repos > public > sbplib
comparison +scheme/Hypsyst3dCurve.m @ 354:dbac99d2c318 feature/hypsyst
Removed inv(Vi) to save time
author | Ylva Rydin <ylva.rydin@telia.com> |
---|---|
date | Mon, 28 Nov 2016 08:46:28 +0100 |
parents | 7cc3d5bd3692 |
children | 69b078cf8072 |
comparison
equal
deleted
inserted
replaced
353:fd4f1c80755d | 354:dbac99d2c318 |
---|---|
26 J, Ji | 26 J, Ji |
27 | 27 |
28 H % Discrete norm | 28 H % Discrete norm |
29 % Norms in the x, y and z directions | 29 % Norms in the x, y and z directions |
30 Hxii,Hetai,Hzetai, Hzi % Kroneckerd norms. 1'*Hx*v corresponds to integration in the x dir. | 30 Hxii,Hetai,Hzetai, Hzi % Kroneckerd norms. 1'*Hx*v corresponds to integration in the x dir. |
31 Hxi,Heta,Hzeta | |
31 I_xi,I_eta,I_zeta, I_N,onesN | 32 I_xi,I_eta,I_zeta, I_N,onesN |
32 e_w, e_e, e_s, e_n, e_b, e_t | 33 e_w, e_e, e_s, e_n, e_b, e_t |
33 index_w, index_e,index_s,index_n, index_b, index_t | 34 index_w, index_e,index_s,index_n, index_b, index_t |
34 params %parameters for the coeficient matrice | 35 params %parameters for the coeficient matrice |
35 end | 36 end |
36 | 37 |
37 | 38 |
38 methods | 39 methods |
39 function obj = Hypsyst3dCurve(m, order, A, B,C, E, params,ti) | 40 function obj = Hypsyst3dCurve(m, order, A, B,C, E, params,ti,operator) |
40 xilim ={0 1}; | 41 xilim ={0 1}; |
41 etalim = {0 1}; | 42 etalim = {0 1}; |
42 zetalim = {0 1}; | 43 zetalim = {0 1}; |
43 | 44 |
44 if length(m) == 1 | 45 if length(m) == 1 |
45 m = [m m m]; | 46 m = [m m m]; |
46 end | 47 end |
47 m_xi = m(1); | 48 m_xi = m(1); |
48 m_eta = m(2); | 49 m_eta = m(2); |
49 m_zeta=m(3); | 50 m_zeta = m(3); |
50 m_tot=m_xi*m_eta*m_zeta; | 51 m_tot = m_xi*m_eta*m_zeta; |
51 obj.params = params; | 52 obj.params = params; |
52 obj.n = length(A(obj,0,0,0)); | 53 obj.n = length(A(obj,0,0,0)); |
53 | 54 |
54 obj.m=m; | 55 obj.m = m; |
55 | 56 |
56 obj.order=order; | 57 obj.order = order; |
57 obj.onesN=ones(obj.n); | 58 obj.onesN = ones(obj.n); |
58 ops_xi = sbp.D2Standard(m_xi,xilim,order); | 59 |
59 ops_eta = sbp.D2Standard(m_eta,etalim,order); | 60 switch operator |
60 ops_zeta = sbp.D2Standard(m_zeta,zetalim,order); | 61 case 'upwind' |
62 ops_xi = sbp.D1Upwind(m_xi,xilim,order); | |
63 ops_eta = sbp.D1Upwind(m_eta,etalim,order); | |
64 ops_zeta = sbp.D1Upwind(m_zeta,zetalim,order); | |
65 case 'standard' | |
66 ops_xi = sbp.D2Standard(m_xi,xilim,order); | |
67 ops_eta = sbp.D2Standard(m_eta,etalim,order); | |
68 ops_zeta = sbp.D2Standard(m_zeta,zetalim,order); | |
69 otherwise | |
70 error('Operator not available') | |
71 end | |
61 | 72 |
62 obj.xi = ops_xi.x; | 73 obj.xi = ops_xi.x; |
63 obj.eta = ops_eta.x; | 74 obj.eta = ops_eta.x; |
64 obj.zeta = ops_zeta.x; | 75 obj.zeta = ops_zeta.x; |
65 | 76 |
66 obj.Xi = kr(obj.xi,ones(m_eta,1),ones(m_zeta,1));%% Que pasa? | 77 obj.Xi = kr(obj.xi,ones(m_eta,1),ones(m_zeta,1));%% Que pasa? |
67 obj.Eta = kr(ones(m_xi,1),obj.eta,ones(m_zeta,1)); | 78 obj.Eta = kr(ones(m_xi,1),obj.eta,ones(m_zeta,1)); |
68 obj.Zeta = kr(ones(m_xi,1),ones(m_eta,1),obj.zeta); | 79 obj.Zeta = kr(ones(m_xi,1),ones(m_eta,1),obj.zeta); |
69 | 80 |
70 obj.Eta_xi=kr(obj.eta,ones(m_xi,1)); | 81 obj.Eta_xi = kr(obj.eta,ones(m_xi,1)); |
71 obj.Zeta_xi=kr(ones(m_eta,1),obj.zeta); | 82 obj.Zeta_xi = kr(ones(m_eta,1),obj.zeta); |
72 | 83 |
73 obj.Xi_eta=kr(obj.xi,ones(m_zeta,1)); | 84 obj.Xi_eta = kr(obj.xi,ones(m_zeta,1)); |
74 obj.Zeta_eta=kr(ones(m_xi,1),obj.zeta); | 85 obj.Zeta_eta = kr(ones(m_xi,1),obj.zeta); |
75 | 86 |
76 obj.Xi_zeta=kr(obj.xi,ones(m_eta,1)); | 87 obj.Xi_zeta = kr(obj.xi,ones(m_eta,1)); |
77 obj.Eta_zeta=kr(ones(m_zeta,1),obj.eta); | 88 obj.Eta_zeta = kr(ones(m_zeta,1),obj.eta); |
78 | 89 |
79 [X,Y,Z] = ti.map(obj.Xi,obj.Eta,obj.Zeta); | 90 [X,Y,Z] = ti.map(obj.Xi,obj.Eta,obj.Zeta); |
80 obj.X=X; | 91 obj.X = X; |
81 obj.Y=Y; | 92 obj.Y = Y; |
82 obj.Z=Z; | 93 obj.Z = Z; |
83 | 94 |
84 I_n = eye(obj.n); | 95 I_n = eye(obj.n); |
85 I_xi = speye(m_xi); | 96 I_xi = speye(m_xi); |
86 obj.I_xi = I_xi; | 97 obj.I_xi = I_xi; |
87 I_eta = speye(m_eta); | 98 I_eta = speye(m_eta); |
88 obj.I_eta = I_eta; | 99 obj.I_eta = I_eta; |
89 I_zeta = speye(m_zeta); | 100 I_zeta = speye(m_zeta); |
90 obj.I_zeta = I_zeta; | 101 obj.I_zeta = I_zeta; |
91 | 102 |
92 | 103 I_N=kr(I_n,I_xi,I_eta,I_zeta); |
93 O_xi=ones(m_xi,1); | 104 |
94 O_eta=ones(m_eta,1); | 105 O_xi = ones(m_xi,1); |
95 O_zeta=ones(m_zeta,1); | 106 O_eta = ones(m_eta,1); |
96 | 107 O_zeta = ones(m_zeta,1); |
97 D1_xi = kr(ops_xi.D1, I_eta,I_zeta); | 108 |
98 obj.Hxii = kr(I_n, ops_xi.HI, I_eta,I_zeta); | 109 obj.Hxii = kr(I_n, ops_xi.HI, I_eta,I_zeta); |
99 D1_eta = kr(I_xi, ops_eta.D1,I_zeta); | 110 obj.Hetai = kr(I_n, I_xi, ops_eta.HI,I_zeta); |
100 obj.Hetai = kr(I_n, I_xi, ops_eta.HI,I_zeta); | |
101 D1_zeta = kr(I_xi, I_eta,ops_zeta.D1); | |
102 obj.Hzetai = kr(I_n, I_xi,I_eta, ops_zeta.HI); | 111 obj.Hzetai = kr(I_n, I_xi,I_eta, ops_zeta.HI); |
103 obj.h=[ops_xi.h ops_eta.h ops_zeta.h]; | 112 obj.Hxi = ops_xi.H; |
113 obj.Heta = ops_eta.H; | |
114 obj.Hzeta = ops_zeta.H; | |
115 obj.h = [ops_xi.h ops_eta.h ops_zeta.h]; | |
116 | |
117 switch operator | |
118 case 'upwind' | |
119 D1_xi = kr((ops_xi.Dp+ops_xi.Dm)/2, I_eta,I_zeta); | |
120 D1_eta = kr(I_xi, (ops_eta.Dp+ops_eta.Dm)/2,I_zeta); | |
121 D1_zeta = kr(I_xi, I_eta,(ops_zeta.Dp+ops_zeta.Dm)/2); | |
122 otherwise | |
123 D1_xi = kr(ops_xi.D1, I_eta,I_zeta); | |
124 D1_eta = kr(I_xi, ops_eta.D1,I_zeta); | |
125 D1_zeta = kr(I_xi, I_eta,ops_zeta.D1); | |
126 end | |
104 | 127 |
105 obj.e_w = kr(I_n, ops_xi.e_l, I_eta,I_zeta); | 128 obj.e_w = kr(I_n, ops_xi.e_l, I_eta,I_zeta); |
106 obj.e_e = kr(I_n, ops_xi.e_r, I_eta,I_zeta); | 129 obj.e_e = kr(I_n, ops_xi.e_r, I_eta,I_zeta); |
107 obj.e_s = kr(I_n, I_xi, ops_eta.e_l,I_zeta); | 130 obj.e_s = kr(I_n, I_xi, ops_eta.e_l,I_zeta); |
108 obj.e_n = kr(I_n, I_xi, ops_eta.e_r,I_zeta); | 131 obj.e_n = kr(I_n, I_xi, ops_eta.e_r,I_zeta); |
109 obj.e_b = kr(I_n, I_xi, I_eta, ops_zeta.e_l); | 132 obj.e_b = kr(I_n, I_xi, I_eta, ops_zeta.e_l); |
110 obj.e_t = kr(I_n, I_xi, I_eta, ops_zeta.e_r); | 133 obj.e_t = kr(I_n, I_xi, I_eta, ops_zeta.e_r); |
111 | 134 |
112 obj.A=A; | 135 obj.A = A; |
113 obj.B=B; | 136 obj.B = B; |
114 obj.C=C; | 137 obj.C = C; |
115 | 138 |
116 obj.X_xi=D1_xi*X; | 139 obj.X_xi = D1_xi*X; |
117 obj.X_eta=D1_eta*X; | 140 obj.X_eta = D1_eta*X; |
118 obj.X_zeta=D1_zeta*X; | 141 obj.X_zeta = D1_zeta*X; |
119 obj.Y_xi=D1_xi*Y; | 142 obj.Y_xi = D1_xi*Y; |
120 obj.Y_eta=D1_eta*Y; | 143 obj.Y_eta = D1_eta*Y; |
121 obj.Y_zeta=D1_zeta*Y; | 144 obj.Y_zeta = D1_zeta*Y; |
122 obj.Z_xi=D1_xi*Z; | 145 obj.Z_xi = D1_xi*Z; |
123 obj.Z_eta=D1_eta*Z; | 146 obj.Z_eta = D1_eta*Z; |
124 obj.Z_zeta=D1_zeta*Z; | 147 obj.Z_zeta = D1_zeta*Z; |
125 | 148 |
126 D1_xi=kr(I_n,D1_xi); | 149 D1_xi = kr(I_n,D1_xi); |
127 D1_eta=kr(I_n,D1_eta); | 150 D1_eta = kr(I_n,D1_eta); |
128 D1_zeta=kr(I_n,D1_zeta); | 151 D1_zeta = kr(I_n,D1_zeta); |
129 | 152 |
130 obj.index_w=(kr(ops_xi.e_l, O_eta,O_zeta)==1); | 153 obj.index_w = (kr(ops_xi.e_l, O_eta,O_zeta)==1); |
131 obj.index_e=(kr(ops_xi.e_r, O_eta,O_zeta)==1); | 154 obj.index_e = (kr(ops_xi.e_r, O_eta,O_zeta)==1); |
132 obj.index_s=(kr(O_xi, ops_eta.e_l,O_zeta)==1); | 155 obj.index_s = (kr(O_xi, ops_eta.e_l,O_zeta)==1); |
133 obj.index_n=(kr(O_xi, ops_eta.e_r,O_zeta)==1); | 156 obj.index_n = (kr(O_xi, ops_eta.e_r,O_zeta)==1); |
134 obj.index_b=(kr(O_xi, O_eta, ops_zeta.e_l)==1); | 157 obj.index_b = (kr(O_xi, O_eta, ops_zeta.e_l)==1); |
135 obj.index_t=(kr(O_xi, O_eta, ops_zeta.e_r)==1); | 158 obj.index_t = (kr(O_xi, O_eta, ops_zeta.e_r)==1); |
136 | 159 |
137 | 160 |
138 obj.Ahat=@transform_coefficient_matrix; | 161 obj.Ahat = @transform_coefficient_matrix; |
139 obj.Bhat=@transform_coefficient_matrix; | 162 obj.Bhat = @transform_coefficient_matrix; |
140 obj.Chat=@transform_coefficient_matrix; | 163 obj.Chat = @transform_coefficient_matrix; |
141 obj.E=@(obj,x,y,z,~,~,~,~,~,~)E(obj,x,y,z); | 164 obj.E = @(obj,x,y,z,~,~,~,~,~,~)E(obj,x,y,z); |
142 | 165 |
143 obj.Aevaluated = obj.evaluateCoefficientMatrix(obj.Ahat,obj.X, obj.Y,obj.Z, obj.X_eta,obj.X_zeta,obj.Y_eta,obj.Y_zeta,obj.Z_eta,obj.Z_zeta); | 166 obj.Aevaluated = obj.evaluateCoefficientMatrix(obj.Ahat,obj.X, obj.Y,obj.Z, obj.X_eta,obj.X_zeta,obj.Y_eta,obj.Y_zeta,obj.Z_eta,obj.Z_zeta); |
144 obj.Bevaluated = obj.evaluateCoefficientMatrix(obj.Bhat,obj.X, obj.Y,obj.Z, obj.X_zeta,obj.X_xi,obj.Y_zeta,obj.Y_xi,obj.Z_zeta,obj.Z_xi); | 167 obj.Bevaluated = obj.evaluateCoefficientMatrix(obj.Bhat,obj.X, obj.Y,obj.Z, obj.X_zeta,obj.X_xi,obj.Y_zeta,obj.Y_xi,obj.Z_zeta,obj.Z_xi); |
145 obj.Cevaluated = obj.evaluateCoefficientMatrix(obj.Chat,obj.X,obj.Y,obj.Z, obj.X_xi,obj.X_eta,obj.Y_xi,obj.Y_eta,obj.Z_xi,obj.Z_eta); | 168 obj.Cevaluated = obj.evaluateCoefficientMatrix(obj.Chat,obj.X,obj.Y,obj.Z, obj.X_xi,obj.X_eta,obj.Y_xi,obj.Y_eta,obj.Z_xi,obj.Z_eta); |
146 obj.Eevaluated = obj.evaluateCoefficientMatrix(obj.E, obj.X, obj.Y,obj.Z,[],[],[],[],[],[]); | 169 obj.Eevaluated = obj.evaluateCoefficientMatrix(obj.E, obj.X, obj.Y,obj.Z,[],[],[],[],[],[]); |
147 | 170 |
148 obj.J=obj.X_xi.*obj.Y_eta.*obj.Z_zeta... | 171 obj.J = obj.X_xi.*obj.Y_eta.*obj.Z_zeta... |
149 +obj.X_zeta.*obj.Y_xi.*obj.Z_eta... | 172 +obj.X_zeta.*obj.Y_xi.*obj.Z_eta... |
150 +obj.X_eta.*obj.Y_zeta.*obj.Z_xi... | 173 +obj.X_eta.*obj.Y_zeta.*obj.Z_xi... |
151 -obj.X_xi.*obj.Y_zeta.*obj.Z_eta... | 174 -obj.X_xi.*obj.Y_zeta.*obj.Z_eta... |
152 -obj.X_eta.*obj.Y_xi.*obj.Z_zeta... | 175 -obj.X_eta.*obj.Y_xi.*obj.Z_zeta... |
153 -obj.X_zeta.*obj.Y_eta.*obj.Z_xi; | 176 -obj.X_zeta.*obj.Y_eta.*obj.Z_xi; |
154 | 177 |
155 obj.Ji =kr(I_n,spdiags(1./obj.J,0,m_tot,m_tot)); | 178 obj.Ji = kr(I_n,spdiags(1./obj.J,0,m_tot,m_tot)); |
156 | 179 |
157 obj.D=obj.Ji*(-obj.Aevaluated*D1_xi-obj.Bevaluated*D1_eta -obj.Cevaluated*D1_zeta)-obj.Eevaluated; | 180 |
158 end | 181 switch operator |
159 | 182 case 'upwind' |
160 function [ret]=transform_coefficient_matrix(obj,x,y,z,x_1,x_2,y_1,y_2,z_1,z_2) | 183 alphaA = max(eig(obj.Ahat(obj,obj.X(end), obj.Y(end),obj.Z(end), obj.X_eta(end),obj.X_zeta(end),obj.Y_eta(end),obj.Y_zeta(end),obj.Z_eta(end),obj.Z_zeta(end)))); |
161 ret=obj.A(obj,x,y,z).*(y_1.*z_2-z_1.*y_2); | 184 alphaB = max(eig(obj.Bhat(obj,obj.X(end), obj.Y(end),obj.Z(end), obj.X_zeta(end),obj.X_xi(end),obj.Y_zeta(end),obj.Y_xi(end),obj.Z_zeta(end),obj.Z_xi(end)))); |
162 ret=ret+obj.B(obj,x,y,z).*(x_2.*z_1-x_1.*z_2); | 185 alphaC = max(eig(obj.Chat(obj,obj.X(end), obj.Y(end),obj.Z(end), obj.X_xi(end),obj.X_eta(end),obj.Y_xi(end),obj.Y_eta(end),obj.Z_xi(end),obj.Z_eta(end)))); |
163 ret=ret+obj.C(obj,x,y,z).*(x_1.*y_2-x_2.*y_1); | 186 |
187 Ap = (obj.Aevaluated+alphaA*I_N)/2; | |
188 Am = (obj.Aevaluated-alphaA*I_N)/2; | |
189 Bp = (obj.Bevaluated+alphaB*I_N)/2; | |
190 Bm = (obj.Bevaluated-alphaB*I_N)/2; | |
191 Cp = (obj.Cevaluated+alphaC*I_N)/2; | |
192 Cm = (obj.Cevaluated-alphaC*I_N)/2; | |
193 | |
194 Dpxi = kr(I_n, ops_xi.Dp, I_eta,I_zeta); | |
195 Dmxi = kr(I_n, ops_xi.Dm, I_eta,I_zeta); | |
196 Dpeta = kr(I_n, I_xi, ops_eta.Dp,I_zeta); | |
197 Dmeta = kr(I_n, I_xi, ops_eta.Dm,I_zeta); | |
198 Dpzeta = kr(I_n, I_xi, I_eta,ops_zeta.Dp); | |
199 Dmzeta = kr(I_n, I_xi, I_eta,ops_zeta.Dm); | |
200 | |
201 obj.D = obj.Ji*(-Am*Dpxi-Ap*Dmxi-Bm*Dpeta-Bp*Dmeta-Cm*Dpzeta-Cp*Dmzeta)-obj.Eevaluated; | |
202 otherwise | |
203 obj.D = obj.Ji*(-obj.Aevaluated*D1_xi-obj.Bevaluated*D1_eta -obj.Cevaluated*D1_zeta)-obj.Eevaluated; | |
204 end | |
205 | |
206 | |
207 end | |
208 | |
209 function [ret] = transform_coefficient_matrix(obj,x,y,z,x_1,x_2,y_1,y_2,z_1,z_2) | |
210 ret = obj.A(obj,x,y,z).*(y_1.*z_2-z_1.*y_2); | |
211 ret = ret+obj.B(obj,x,y,z).*(x_2.*z_1-x_1.*z_2); | |
212 ret = ret+obj.C(obj,x,y,z).*(x_1.*y_2-x_2.*y_1); | |
164 end | 213 end |
165 | 214 |
166 | 215 |
167 % Closure functions return the opertors applied to the own doamin to close the boundary | 216 % Closure functions return the opertors applied to the own doamin to close the boundary |
168 % Penalty functions return the opertors to force the solution. In the case of an interface it returns the operator applied to the other doamin. | 217 % Penalty functions return the opertors to force the solution. In the case of an interface it returns the operator applied to the other doamin. |
169 % boundary is a string specifying the boundary e.g. 'l','r' or 'e','w','n','s'. | 218 % boundary is a string specifying the boundary e.g. 'l','r' or 'e','w','n','s'. |
170 % type is a string specifying the type of boundary condition if there are several. | 219 % type is a string specifying the type of boundary condition if there are several. |
171 % data is a function returning the data that should be applied at the boundary. | 220 % data is a function returning the data that should be applied at the boundary. |
172 function [closure, penalty] = boundary_condition(obj,boundary,type,L) | 221 function [closure, penalty] = boundary_condition(obj,boundary,type,L) |
173 default_arg('type','char'); | 222 default_arg('type','char'); |
174 BM=boundary_matrices(obj,boundary); | 223 BM = boundary_matrices(obj,boundary); |
175 | 224 |
176 switch type | 225 switch type |
177 case{'c','char'} | 226 case{'c','char'} |
178 [closure,penalty]=boundary_condition_char(obj,BM); | 227 [closure,penalty] = boundary_condition_char(obj,BM); |
179 case{'general'} | 228 case{'general'} |
180 [closure,penalty]=boundary_condition_general(obj,BM,boundary,L); | 229 [closure,penalty] = boundary_condition_general(obj,BM,boundary,L); |
181 otherwise | 230 otherwise |
182 error('No such boundary condition') | 231 error('No such boundary condition') |
183 end | 232 end |
184 end | 233 end |
185 | 234 |
190 function N = size(obj) | 239 function N = size(obj) |
191 N = obj.m; | 240 N = obj.m; |
192 end | 241 end |
193 | 242 |
194 function [ret] = evaluateCoefficientMatrix(obj,mat, X, Y, Z , x_1 , x_2 , y_1 , y_2 , z_1 , z_2) | 243 function [ret] = evaluateCoefficientMatrix(obj,mat, X, Y, Z , x_1 , x_2 , y_1 , y_2 , z_1 , z_2) |
195 params=obj.params; | 244 params = obj.params; |
196 side=max(length(X),length(Y)); | 245 side = max(length(X),length(Y)); |
197 if isa(mat,'function_handle') | 246 if isa(mat,'function_handle') |
198 [rows,cols]=size(mat(obj,0,0,0,0,0,0,0,0,0)); | 247 [rows,cols] = size(mat(obj,0,0,0,0,0,0,0,0,0)); |
199 x_1=kr(obj.onesN,x_1); | 248 x_1 = kr(obj.onesN,x_1); |
200 x_2=kr(obj.onesN,x_2); | 249 x_2 = kr(obj.onesN,x_2); |
201 y_1=kr(obj.onesN,y_1); | 250 y_1 = kr(obj.onesN,y_1); |
202 y_2=kr(obj.onesN,y_2); | 251 y_2 = kr(obj.onesN,y_2); |
203 z_1=kr(obj.onesN,z_1); | 252 z_1 = kr(obj.onesN,z_1); |
204 z_2=kr(obj.onesN,z_2); | 253 z_2 = kr(obj.onesN,z_2); |
205 matVec=mat(obj,X',Y',Z',x_1',x_2',y_1',y_2',z_1',z_2'); | 254 matVec = mat(obj,X',Y',Z',x_1',x_2',y_1',y_2',z_1',z_2'); |
206 matVec=sparse(matVec); | 255 matVec = sparse(matVec); |
207 else | 256 else |
208 matVec=mat; | 257 matVec = mat; |
209 [rows,cols]=size(matVec); | 258 [rows,cols] = size(matVec); |
210 side=max(length(X),length(Y)); | 259 side = max(length(X),length(Y)); |
211 cols=cols/side; | 260 cols = cols/side; |
212 end | 261 end |
213 ret=cell(rows,cols); | 262 ret = cell(rows,cols); |
214 | 263 |
215 | 264 |
216 for ii=1:rows | 265 for ii=1:rows |
217 for jj=1:cols | 266 for jj=1:cols |
218 ret{ii,jj}=diag(matVec(ii,(jj-1)*side+1:jj*side)); | 267 ret{ii,jj} = diag(matVec(ii,(jj-1)*side+1:jj*side)); |
219 end | 268 end |
220 end | 269 end |
221 | 270 |
222 ret=cell2mat(ret); | 271 ret = cell2mat(ret); |
223 end | 272 end |
224 | 273 |
225 | 274 |
226 function [BM]=boundary_matrices(obj,boundary) | 275 function [BM] = boundary_matrices(obj,boundary) |
227 params=obj.params; | 276 params = obj.params; |
228 BM.boundary=boundary; | 277 BM.boundary = boundary; |
229 switch boundary | 278 switch boundary |
230 case {'w','W','west'} | 279 case {'w','W','west'} |
231 BM.e_=obj.e_w; | 280 BM.e_ = obj.e_w; |
232 mat=obj.Ahat; | 281 mat = obj.Ahat; |
233 BM.boundpos='l'; | 282 BM.boundpos = 'l'; |
234 BM.Hi=obj.Hxii; | 283 BM.Hi = obj.Hxii; |
235 BM.index=obj.index_w; | 284 BM.index = obj.index_w; |
236 BM.x_1=obj.X_eta(BM.index); | 285 BM.x_1 = obj.X_eta(BM.index); |
237 BM.x_2=obj.X_zeta(BM.index); | 286 BM.x_2 = obj.X_zeta(BM.index); |
238 BM.y_1=obj.Y_eta(BM.index); | 287 BM.y_1 = obj.Y_eta(BM.index); |
239 BM.y_2=obj.Y_zeta(BM.index); | 288 BM.y_2 = obj.Y_zeta(BM.index); |
240 BM.z_1=obj.Z_eta(BM.index); | 289 BM.z_1 = obj.Z_eta(BM.index); |
241 BM.z_2=obj.Z_zeta(BM.index); | 290 BM.z_2 = obj.Z_zeta(BM.index); |
242 case {'e','E','east'} | 291 case {'e','E','east'} |
243 BM.e_=obj.e_e; | 292 BM.e_ = obj.e_e; |
244 mat=obj.Ahat; | 293 mat = obj.Ahat; |
245 BM.boundpos='r'; | 294 BM.boundpos = 'r'; |
246 BM.Hi=obj.Hxii; | 295 BM.Hi = obj.Hxii; |
247 BM.index=obj.index_e; | 296 BM.index = obj.index_e; |
248 BM.x_1=obj.X_eta(BM.index); | 297 BM.x_1 = obj.X_eta(BM.index); |
249 BM.x_2=obj.X_zeta(BM.index); | 298 BM.x_2 = obj.X_zeta(BM.index); |
250 BM.y_1=obj.Y_eta(BM.index); | 299 BM.y_1 = obj.Y_eta(BM.index); |
251 BM.y_2=obj.Y_zeta(BM.index); | 300 BM.y_2 = obj.Y_zeta(BM.index); |
252 BM.z_1=obj.Z_eta(BM.index); | 301 BM.z_1 = obj.Z_eta(BM.index); |
253 BM.z_2=obj.Z_zeta(BM.index); | 302 BM.z_2 = obj.Z_zeta(BM.index); |
254 case {'s','S','south'} | 303 case {'s','S','south'} |
255 BM.e_=obj.e_s; | 304 BM.e_ = obj.e_s; |
256 mat=obj.Bhat; | 305 mat = obj.Bhat; |
257 BM.boundpos='l'; | 306 BM.boundpos = 'l'; |
258 BM.Hi=obj.Hetai; | 307 BM.Hi = obj.Hetai; |
259 BM.index=obj.index_s; | 308 BM.index = obj.index_s; |
260 BM.x_1=obj.X_zeta(BM.index); | 309 BM.x_1 = obj.X_zeta(BM.index); |
261 BM.x_2=obj.X_xi(BM.index); | 310 BM.x_2 = obj.X_xi(BM.index); |
262 BM.y_1=obj.Y_zeta(BM.index); | 311 BM.y_1 = obj.Y_zeta(BM.index); |
263 BM.y_2=obj.Y_xi(BM.index); | 312 BM.y_2 = obj.Y_xi(BM.index); |
264 BM.z_1=obj.Z_zeta(BM.index); | 313 BM.z_1 = obj.Z_zeta(BM.index); |
265 BM.z_2=obj.Z_xi(BM.index); | 314 BM.z_2 = obj.Z_xi(BM.index); |
266 case {'n','N','north'} | 315 case {'n','N','north'} |
267 BM.e_=obj.e_n; | 316 BM.e_ = obj.e_n; |
268 mat=obj.Bhat; | 317 mat = obj.Bhat; |
269 BM.boundpos='r'; | 318 BM.boundpos = 'r'; |
270 BM.Hi=obj.Hetai; | 319 BM.Hi = obj.Hetai; |
271 BM.index=obj.index_n; | 320 BM.index = obj.index_n; |
272 BM.x_1=obj.X_zeta(BM.index); | 321 BM.x_1 = obj.X_zeta(BM.index); |
273 BM.x_2=obj.X_xi(BM.index); | 322 BM.x_2 = obj.X_xi(BM.index); |
274 BM.y_1=obj.Y_zeta(BM.index); | 323 BM.y_1 = obj.Y_zeta(BM.index); |
275 BM.y_2=obj.Y_xi(BM.index); | 324 BM.y_2 = obj.Y_xi(BM.index); |
276 BM.z_1=obj.Z_zeta(BM.index); | 325 BM.z_1 = obj.Z_zeta(BM.index); |
277 BM.z_2=obj.Z_xi(BM.index); | 326 BM.z_2 = obj.Z_xi(BM.index); |
278 case{'b','B','Bottom'} | 327 case{'b','B','Bottom'} |
279 BM.e_=obj.e_b; | 328 BM.e_ = obj.e_b; |
280 mat=obj.Chat; | 329 mat = obj.Chat; |
281 BM.boundpos='l'; | 330 BM.boundpos = 'l'; |
282 BM.Hi=obj.Hzetai; | 331 BM.Hi = obj.Hzetai; |
283 BM.index=obj.index_b; | 332 BM.index = obj.index_b; |
284 BM.x_1=obj.X_xi(BM.index); | 333 BM.x_1 = obj.X_xi(BM.index); |
285 BM.x_2=obj.X_eta(BM.index); | 334 BM.x_2 = obj.X_eta(BM.index); |
286 BM.y_1=obj.Y_xi(BM.index); | 335 BM.y_1 = obj.Y_xi(BM.index); |
287 BM.y_2=obj.Y_eta(BM.index); | 336 BM.y_2 = obj.Y_eta(BM.index); |
288 BM.z_1=obj.Z_xi(BM.index); | 337 BM.z_1 = obj.Z_xi(BM.index); |
289 BM.z_2=obj.Z_eta(BM.index); | 338 BM.z_2 = obj.Z_eta(BM.index); |
290 case{'t','T','Top'} | 339 case{'t','T','Top'} |
291 BM.e_=obj.e_t; | 340 BM.e_ = obj.e_t; |
292 mat=obj.Chat; | 341 mat = obj.Chat; |
293 BM.boundpos='r'; | 342 BM.boundpos = 'r'; |
294 BM.Hi=obj.Hzetai; | 343 BM.Hi = obj.Hzetai; |
295 BM.index=obj.index_t; | 344 BM.index = obj.index_t; |
296 BM.x_1=obj.X_xi(BM.index); | 345 BM.x_1 = obj.X_xi(BM.index); |
297 BM.x_2=obj.X_eta(BM.index); | 346 BM.x_2 = obj.X_eta(BM.index); |
298 BM.y_1=obj.Y_xi(BM.index); | 347 BM.y_1 = obj.Y_xi(BM.index); |
299 BM.y_2=obj.Y_eta(BM.index); | 348 BM.y_2 = obj.Y_eta(BM.index); |
300 BM.z_1=obj.Z_xi(BM.index); | 349 BM.z_1 = obj.Z_xi(BM.index); |
301 BM.z_2=obj.Z_eta(BM.index); | 350 BM.z_2 = obj.Z_eta(BM.index); |
302 end | 351 end |
303 [BM.V,BM.Vi,BM.D,signVec]=obj.matrixDiag(mat,obj.X(BM.index),obj.Y(BM.index),obj.Z(BM.index),... | 352 [BM.V,BM.Vi,BM.D,signVec] = obj.matrixDiag(mat,obj.X(BM.index),obj.Y(BM.index),obj.Z(BM.index),... |
304 BM.x_1,BM.x_2,BM.y_1,BM.y_2,BM.z_1,BM.z_2); | 353 BM.x_1,BM.x_2,BM.y_1,BM.y_2,BM.z_1,BM.z_2); |
305 BM.side=sum(BM.index); | 354 BM.side = sum(BM.index); |
306 BM.pos=signVec(1); BM.zeroval=signVec(2); BM.neg=signVec(3); | 355 BM.pos = signVec(1); BM.zeroval=signVec(2); BM.neg=signVec(3); |
307 end | 356 end |
308 | 357 |
309 | 358 |
310 function [closure, penalty]=boundary_condition_char(obj,BM) | 359 function [closure, penalty]=boundary_condition_char(obj,BM) |
311 side = BM.side; | 360 side = BM.side; |
312 pos = BM.pos; | 361 pos = BM.pos; |
313 neg = BM.neg; | 362 neg = BM.neg; |
314 zeroval=BM.zeroval; | 363 zeroval = BM.zeroval; |
315 V = BM.V; | 364 V = BM.V; |
316 Vi = BM.Vi; | 365 Vi = BM.Vi; |
317 Hi=BM.Hi; | 366 Hi = BM.Hi; |
318 D=BM.D; | 367 D = BM.D; |
319 e_=BM.e_; | 368 e_ = BM.e_; |
320 | 369 |
321 switch BM.boundpos | 370 switch BM.boundpos |
322 case {'l'} | 371 case {'l'} |
323 tau=sparse(obj.n*side,pos); | 372 tau = sparse(obj.n*side,pos); |
324 Vi_plus=Vi(1:pos,:); | 373 Vi_plus = Vi(1:pos,:); |
325 tau(1:pos,:)=-abs(D(1:pos,1:pos)); | 374 tau(1:pos,:) = -abs(D(1:pos,1:pos)); |
326 closure=Hi*e_*V*tau*Vi_plus*e_'; | 375 closure = Hi*e_*V*tau*Vi_plus*e_'; |
327 penalty=-Hi*e_*V*tau*Vi_plus; | 376 penalty = -Hi*e_*V*tau*Vi_plus; |
328 case {'r'} | 377 case {'r'} |
329 tau=sparse(obj.n*side,neg); | 378 tau = sparse(obj.n*side,neg); |
330 tau((pos+zeroval)+1:obj.n*side,:)=-abs(D((pos+zeroval)+1:obj.n*side,(pos+zeroval)+1:obj.n*side)); | 379 tau((pos+zeroval)+1:obj.n*side,:) = -abs(D((pos+zeroval)+1:obj.n*side,(pos+zeroval)+1:obj.n*side)); |
331 Vi_minus=Vi((pos+zeroval)+1:obj.n*side,:); | 380 Vi_minus = Vi((pos+zeroval)+1:obj.n*side,:); |
332 closure=Hi*e_*V*tau*Vi_minus*e_'; | 381 closure = Hi*e_*V*tau*Vi_minus*e_'; |
333 penalty=-Hi*e_*V*tau*Vi_minus; | 382 penalty = -Hi*e_*V*tau*Vi_minus; |
334 end | 383 end |
335 end | 384 end |
336 | 385 |
337 | 386 |
338 function [closure,penalty]=boundary_condition_general(obj,BM,boundary,L) | 387 function [closure,penalty]=boundary_condition_general(obj,BM,boundary,L) |
339 side = BM.side; | 388 side = BM.side; |
340 pos = BM.pos; | 389 pos = BM.pos; |
341 neg = BM.neg; | 390 neg = BM.neg; |
342 zeroval=BM.zeroval; | 391 zeroval = BM.zeroval; |
343 V = BM.V; | 392 V = BM.V; |
344 Vi = BM.Vi; | 393 Vi = BM.Vi; |
345 Hi=BM.Hi; | 394 Hi = BM.Hi; |
346 D=BM.D; | 395 D = BM.D; |
347 e_=BM.e_; | 396 e_ = BM.e_; |
348 index=BM.index; | 397 index = BM.index; |
349 | 398 |
350 switch BM.boundary | 399 switch BM.boundary |
351 case{'b','B','bottom'} | 400 case{'b','B','bottom'} |
352 Ji_vec=diag(obj.Ji); | 401 Ji_vec = diag(obj.Ji); |
353 Ji=diag(Ji_vec(index)); | 402 Ji = diag(Ji_vec(index)); |
354 Zeta_x=Ji*(obj.Y_xi(index).*obj.Z_eta(index)-obj.Z_xi(index).*obj.Y_eta(index)); | 403 Zeta_x = Ji*(obj.Y_xi(index).*obj.Z_eta(index)-obj.Z_xi(index).*obj.Y_eta(index)); |
355 Zeta_y=Ji*(obj.X_eta(index).*obj.Z_xi(index)-obj.X_xi(index).*obj.Z_eta(index)); | 404 Zeta_y = Ji*(obj.X_eta(index).*obj.Z_xi(index)-obj.X_xi(index).*obj.Z_eta(index)); |
356 Zeta_z=Ji*(obj.X_xi(index).*obj.Y_eta(index)-obj.Y_xi(index).*obj.X_eta(index)); | 405 Zeta_z = Ji*(obj.X_xi(index).*obj.Y_eta(index)-obj.Y_xi(index).*obj.X_eta(index)); |
357 | 406 |
358 L=obj.evaluateCoefficientMatrix(L,Zeta_x,Zeta_y,Zeta_z,[],[],[],[],[],[]); | 407 L = obj.evaluateCoefficientMatrix(L,Zeta_x,Zeta_y,Zeta_z,[],[],[],[],[],[]); |
359 end | 408 end |
360 | 409 |
361 switch BM.boundpos | 410 switch BM.boundpos |
362 case {'l'} | 411 case {'l'} |
363 tau=sparse(obj.n*side,pos); | 412 tau = sparse(obj.n*side,pos); |
364 Vi_plus=Vi(1:pos,:); | 413 Vi_plus = Vi(1:pos,:); |
365 Vi_minus=Vi(pos+zeroval+1:obj.n*side,:); | 414 Vi_minus = Vi(pos+zeroval+1:obj.n*side,:); |
366 V_plus=V(:,1:pos); | 415 V_plus = V(:,1:pos); |
367 V_minus=V(:,(pos+zeroval)+1:obj.n*side); | 416 V_minus = V(:,(pos+zeroval)+1:obj.n*side); |
368 | 417 |
369 tau(1:pos,:)=-abs(D(1:pos,1:pos)); | 418 tau(1:pos,:) = -abs(D(1:pos,1:pos)); |
370 R=-inv(L*V_plus)*(L*V_minus); | 419 R = -inv(L*V_plus)*(L*V_minus); |
371 closure=Hi*e_*V*tau*(Vi_plus-R*Vi_minus)*e_'; | 420 closure = Hi*e_*V*tau*(Vi_plus-R*Vi_minus)*e_'; |
372 penalty=-Hi*e_*V*tau*inv(L*V_plus)*L; | 421 penalty = -Hi*e_*V*tau*inv(L*V_plus)*L; |
373 case {'r'} | 422 case {'r'} |
374 tau=sparse(obj.n*side,neg); | 423 tau = sparse(obj.n*side,neg); |
375 tau((pos+zeroval)+1:obj.n*side,:)=-abs(D((pos+zeroval)+1:obj.n*side,(pos+zeroval)+1:obj.n*side)); | 424 tau((pos+zeroval)+1:obj.n*side,:) = -abs(D((pos+zeroval)+1:obj.n*side,(pos+zeroval)+1:obj.n*side)); |
376 Vi_plus=Vi(1:pos,:); | 425 Vi_plus = Vi(1:pos,:); |
377 Vi_minus=Vi((pos+zeroval)+1:obj.n*side,:); | 426 Vi_minus = Vi((pos+zeroval)+1:obj.n*side,:); |
378 | 427 |
379 V_plus=V(:,1:pos); | 428 V_plus = V(:,1:pos); |
380 V_minus=V(:,(pos+zeroval)+1:obj.n*side); | 429 V_minus = V(:,(pos+zeroval)+1:obj.n*side); |
381 R=-inv(L*V_minus)*(L*V_plus); | 430 R = -inv(L*V_minus)*(L*V_plus); |
382 closure=Hi*e_*V*tau*(Vi_minus-R*Vi_plus)*e_'; | 431 closure = Hi*e_*V*tau*(Vi_minus-R*Vi_plus)*e_'; |
383 penalty=-Hi*e_*V*tau*inv(L*V_minus)*L; | 432 penalty = -Hi*e_*V*tau*inv(L*V_minus)*L; |
384 end | 433 end |
385 end | 434 end |
386 | 435 |
387 | 436 |
388 function [V,Vi, D,signVec]=matrixDiag(obj,mat,x,y,z,x_1,x_2,y_1,y_2,z_1,z_2) | 437 function [V,Vi, D,signVec] = matrixDiag(obj,mat,x,y,z,x_1,x_2,y_1,y_2,z_1,z_2) |
389 params=obj.params; | 438 params = obj.params; |
390 eps=10^(-10); | 439 eps = 10^(-10); |
391 if(sum(abs(x_1))>eps) | 440 if(sum(abs(x_1))>eps) |
392 syms x_1s | 441 syms x_1s |
393 else | 442 else |
394 x_1s=0; | 443 x_1s = 0; |
395 end | 444 end |
396 | 445 |
397 if(sum(abs(x_2))>eps) | 446 if(sum(abs(x_2))>eps) |
398 syms x_2s; | 447 syms x_2s; |
399 else | 448 else |
400 x_2s=0; | 449 x_2s = 0; |
401 end | 450 end |
402 | 451 |
403 | 452 |
404 if(sum(abs(y_1))>eps) | 453 if(sum(abs(y_1))>eps) |
405 syms y_1s | 454 syms y_1s |
406 else | 455 else |
407 y_1s=0; | 456 y_1s = 0; |
408 end | 457 end |
409 | 458 |
410 if(sum(abs(y_2))>eps) | 459 if(sum(abs(y_2))>eps) |
411 syms y_2s; | 460 syms y_2s; |
412 else | 461 else |
413 y_2s=0; | 462 y_2s = 0; |
414 end | 463 end |
415 | 464 |
416 if(sum(abs(z_1))>eps) | 465 if(sum(abs(z_1))>eps) |
417 syms z_1s | 466 syms z_1s |
418 else | 467 else |
419 z_1s=0; | 468 z_1s = 0; |
420 end | 469 end |
421 | 470 |
422 if(sum(abs(z_2))>eps) | 471 if(sum(abs(z_2))>eps) |
423 syms z_2s; | 472 syms z_2s; |
424 else | 473 else |
425 z_2s=0; | 474 z_2s = 0; |
426 end | 475 end |
427 | 476 |
428 syms xs ys zs | 477 syms xs ys zs |
429 [V, D]=eig(mat(obj,xs,ys,zs,x_1s,x_2s,y_1s,y_2s,z_1s,z_2s)); | 478 [V, D] = eig(mat(obj,xs,ys,zs,x_1s,x_2s,y_1s,y_2s,z_1s,z_2s)); |
430 Vi=inv(V); | 479 Vi = inv(V); |
431 % syms x_1s x_2s y_1s y_2s z_1s z_2s | 480 % syms x_1s x_2s y_1s y_2s z_1s z_2s |
432 xs=x; | 481 xs = x; |
433 ys=y; | 482 ys = y; |
434 zs=z; | 483 zs = z; |
435 x_1s=x_1; | 484 x_1s = x_1; |
436 x_2s=x_2; | 485 x_2s = x_2; |
437 y_1s=y_1; | 486 y_1s = y_1; |
438 y_2s=y_2; | 487 y_2s = y_2; |
439 z_1s=z_1; | 488 z_1s = z_1; |
440 z_2s=z_2; | 489 z_2s = z_2; |
441 | 490 |
442 side=max(length(x),length(y)); | 491 side = max(length(x),length(y)); |
443 Dret=zeros(obj.n,side*obj.n); | 492 Dret = zeros(obj.n,side*obj.n); |
444 Vret=zeros(obj.n,side*obj.n); | 493 Vret = zeros(obj.n,side*obj.n); |
445 Viret=zeros(obj.n,side*obj.n); | 494 Viret = zeros(obj.n,side*obj.n); |
446 | 495 |
447 for ii=1:obj.n | 496 for ii=1:obj.n |
448 for jj=1:obj.n | 497 for jj=1:obj.n |
449 Dret(jj,(ii-1)*side+1:side*ii)=eval(D(jj,ii)); | 498 Dret(jj,(ii-1)*side+1:side*ii) = eval(D(jj,ii)); |
450 Vret(jj,(ii-1)*side+1:side*ii)=eval(V(jj,ii)); | 499 Vret(jj,(ii-1)*side+1:side*ii) = eval(V(jj,ii)); |
451 Viret(jj,(ii-1)*side+1:side*ii)=eval(Vi(jj,ii)); | 500 Viret(jj,(ii-1)*side+1:side*ii) = eval(Vi(jj,ii)); |
452 end | 501 end |
453 end | 502 end |
454 | 503 |
455 D=sparse(Dret); | 504 D = sparse(Dret); |
456 V=sparse(Vret); | 505 V = sparse(Vret); |
457 Vi=sparse(Viret); | 506 Vi = sparse(Viret); |
458 V=obj.evaluateCoefficientMatrix(V,x,y,z,x_1,x_2,y_1,y_2,z_1,z_2); | 507 V = obj.evaluateCoefficientMatrix(V,x,y,z,x_1,x_2,y_1,y_2,z_1,z_2); |
459 D=obj.evaluateCoefficientMatrix(D,x,y,z,x_1,x_2,y_1,y_2,z_1,z_2); | 508 D = obj.evaluateCoefficientMatrix(D,x,y,z,x_1,x_2,y_1,y_2,z_1,z_2); |
460 Vi=obj.evaluateCoefficientMatrix(Vi,x,y,z,x_1,x_2,y_1,y_2,z_1,z_2); | 509 Vi = obj.evaluateCoefficientMatrix(Vi,x,y,z,x_1,x_2,y_1,y_2,z_1,z_2); |
461 DD=diag(D); | 510 DD = diag(D); |
462 | 511 |
463 poseig=(DD>0); | 512 poseig = (DD>0); |
464 zeroeig=(DD==0); | 513 zeroeig = (DD==0); |
465 negeig=(DD<0); | 514 negeig = (DD<0); |
466 | 515 |
467 D=diag([DD(poseig); DD(zeroeig); DD(negeig)]); | 516 D = diag([DD(poseig); DD(zeroeig); DD(negeig)]); |
468 V=[V(:,poseig) V(:,zeroeig) V(:,negeig)]; | 517 V = [V(:,poseig) V(:,zeroeig) V(:,negeig)]; |
469 Vi=[Vi(poseig,:); Vi(zeroeig,:); Vi(negeig,:)]; | 518 Vi = [Vi(poseig,:); Vi(zeroeig,:); Vi(negeig,:)]; |
470 signVec=[sum(poseig),sum(zeroeig),sum(negeig)]; | 519 signVec = [sum(poseig),sum(zeroeig),sum(negeig)]; |
471 end | 520 end |
472 end | 521 end |
473 end | 522 end |