Mercurial > repos > public > sbplib
comparison +scheme/Hypsyst3dCurve.m @ 366:7ada2db63268 feature/hypsyst
Tried to speed up the matrix set-up a little
author | Ylva Rydin <ylva.rydin@telia.com> |
---|---|
date | Tue, 13 Dec 2016 09:28:33 +0100 |
parents | 69b078cf8072 |
children | 53abf04f5e4e |
comparison
equal
deleted
inserted
replaced
361:4a5d83324ec1 | 366:7ada2db63268 |
---|---|
62 ops_eta = sbp.D1Upwind(m_eta,etalim,order); | 62 ops_eta = sbp.D1Upwind(m_eta,etalim,order); |
63 ops_zeta = sbp.D1Upwind(m_zeta,zetalim,order); | 63 ops_zeta = sbp.D1Upwind(m_zeta,zetalim,order); |
64 case 'standard' | 64 case 'standard' |
65 ops_xi = sbp.D2Standard(m_xi,xilim,order); | 65 ops_xi = sbp.D2Standard(m_xi,xilim,order); |
66 ops_eta = sbp.D2Standard(m_eta,etalim,order); | 66 ops_eta = sbp.D2Standard(m_eta,etalim,order); |
67 ops_zeta = sbp.D2Standard(m_zeta,zetalim,order); | 67 ops_zeta = sbp.D2Standard(m_zeta,zetalim,order); |
68 otherwise | 68 otherwise |
69 error('Operator not available') | 69 error('Operator not available') |
70 end | 70 end |
71 | 71 |
72 obj.xi = ops_xi.x; | 72 obj.xi = ops_xi.x; |
75 | 75 |
76 obj.Xi = kr(obj.xi,ones(m_eta,1),ones(m_zeta,1));%% Que pasa? | 76 obj.Xi = kr(obj.xi,ones(m_eta,1),ones(m_zeta,1));%% Que pasa? |
77 obj.Eta = kr(ones(m_xi,1),obj.eta,ones(m_zeta,1)); | 77 obj.Eta = kr(ones(m_xi,1),obj.eta,ones(m_zeta,1)); |
78 obj.Zeta = kr(ones(m_xi,1),ones(m_eta,1),obj.zeta); | 78 obj.Zeta = kr(ones(m_xi,1),ones(m_eta,1),obj.zeta); |
79 | 79 |
80 obj.Eta_xi = kr(obj.eta,ones(m_xi,1)); | |
81 obj.Zeta_xi = kr(ones(m_eta,1),obj.zeta); | |
82 | |
83 obj.Xi_eta = kr(obj.xi,ones(m_zeta,1)); | |
84 obj.Zeta_eta = kr(ones(m_xi,1),obj.zeta); | |
85 | |
86 obj.Xi_zeta = kr(obj.xi,ones(m_eta,1)); | |
87 obj.Eta_zeta = kr(ones(m_zeta,1),obj.eta); | |
88 | 80 |
89 [X,Y,Z] = ti.map(obj.Xi,obj.Eta,obj.Zeta); | 81 [X,Y,Z] = ti.map(obj.Xi,obj.Eta,obj.Zeta); |
90 obj.X = X; | 82 obj.X = X; |
91 obj.Y = Y; | 83 obj.Y = Y; |
92 obj.Z = Z; | 84 obj.Z = Z; |
95 I_xi = speye(m_xi); | 87 I_xi = speye(m_xi); |
96 obj.I_xi = I_xi; | 88 obj.I_xi = I_xi; |
97 I_eta = speye(m_eta); | 89 I_eta = speye(m_eta); |
98 obj.I_eta = I_eta; | 90 obj.I_eta = I_eta; |
99 I_zeta = speye(m_zeta); | 91 I_zeta = speye(m_zeta); |
100 obj.I_zeta = I_zeta; | 92 obj.I_zeta = I_zeta; |
101 | 93 |
102 I_N=kr(I_n,I_xi,I_eta,I_zeta); | 94 I_N=kr(I_n,I_xi,I_eta,I_zeta); |
103 | 95 |
104 O_xi = ones(m_xi,1); | 96 O_xi = ones(m_xi,1); |
105 O_eta = ones(m_eta,1); | 97 O_eta = ones(m_eta,1); |
106 O_zeta = ones(m_zeta,1); | 98 O_zeta = ones(m_zeta,1); |
107 | 99 |
108 obj.Hxii = kr(I_n, ops_xi.HI, I_eta,I_zeta); | 100 |
109 obj.Hetai = kr(I_n, I_xi, ops_eta.HI,I_zeta); | |
110 obj.Hzetai = kr(I_n, I_xi,I_eta, ops_zeta.HI); | |
111 obj.Hxi = ops_xi.H; | 101 obj.Hxi = ops_xi.H; |
112 obj.Heta = ops_eta.H; | 102 obj.Heta = ops_eta.H; |
113 obj.Hzeta = ops_zeta.H; | 103 obj.Hzeta = ops_zeta.H; |
114 obj.h = [ops_xi.h ops_eta.h ops_zeta.h]; | 104 obj.h = [ops_xi.h ops_eta.h ops_zeta.h]; |
115 | 105 |
116 switch operator | 106 switch operator |
117 case 'upwind' | 107 case 'upwind' |
118 D1_xi = kr((ops_xi.Dp+ops_xi.Dm)/2, I_eta,I_zeta); | 108 D1_xi = kr((ops_xi.Dp+ops_xi.Dm)/2, I_eta,I_zeta); |
119 D1_eta = kr(I_xi, (ops_eta.Dp+ops_eta.Dm)/2,I_zeta); | 109 D1_eta = kr(I_xi, (ops_eta.Dp+ops_eta.Dm)/2,I_zeta); |
120 D1_zeta = kr(I_xi, I_eta,(ops_zeta.Dp+ops_zeta.Dm)/2); | 110 D1_zeta = kr(I_xi, I_eta,(ops_zeta.Dp+ops_zeta.Dm)/2); |
121 otherwise | 111 otherwise |
122 D1_xi = kr(ops_xi.D1, I_eta,I_zeta); | 112 D1_xi = kr(ops_xi.D1, I_eta,I_zeta); |
123 D1_eta = kr(I_xi, ops_eta.D1,I_zeta); | 113 D1_eta = kr(I_xi, ops_eta.D1,I_zeta); |
124 D1_zeta = kr(I_xi, I_eta,ops_zeta.D1); | 114 D1_zeta = kr(I_xi, I_eta,ops_zeta.D1); |
125 end | 115 end |
126 | |
127 obj.e_w = kr(I_n, ops_xi.e_l, I_eta,I_zeta); | |
128 obj.e_e = kr(I_n, ops_xi.e_r, I_eta,I_zeta); | |
129 obj.e_s = kr(I_n, I_xi, ops_eta.e_l,I_zeta); | |
130 obj.e_n = kr(I_n, I_xi, ops_eta.e_r,I_zeta); | |
131 obj.e_b = kr(I_n, I_xi, I_eta, ops_zeta.e_l); | |
132 obj.e_t = kr(I_n, I_xi, I_eta, ops_zeta.e_r); | |
133 | 116 |
134 obj.A = A; | 117 obj.A = A; |
135 obj.B = B; | 118 obj.B = B; |
136 obj.C = C; | 119 obj.C = C; |
137 | 120 |
142 obj.Y_eta = D1_eta*Y; | 125 obj.Y_eta = D1_eta*Y; |
143 obj.Y_zeta = D1_zeta*Y; | 126 obj.Y_zeta = D1_zeta*Y; |
144 obj.Z_xi = D1_xi*Z; | 127 obj.Z_xi = D1_xi*Z; |
145 obj.Z_eta = D1_eta*Z; | 128 obj.Z_eta = D1_eta*Z; |
146 obj.Z_zeta = D1_zeta*Z; | 129 obj.Z_zeta = D1_zeta*Z; |
147 | 130 |
148 D1_xi = kr(I_n,D1_xi); | 131 obj.Ahat = @transform_coefficient_matrix; |
149 D1_eta = kr(I_n,D1_eta); | 132 obj.Bhat = @transform_coefficient_matrix; |
150 D1_zeta = kr(I_n,D1_zeta); | 133 obj.Chat = @transform_coefficient_matrix; |
134 obj.E = @(obj,x,y,z,~,~,~,~,~,~)E(obj,x,y,z); | |
135 | |
136 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); | |
137 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); | |
138 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); | |
139 | |
140 switch operator | |
141 case 'upwind' | |
142 clear D1_xi D1_eta D1_zeta | |
143 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)))); | |
144 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)))); | |
145 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)))); | |
146 | |
147 Ap = (obj.Aevaluated+alphaA*I_N)/2; | |
148 Dmxi = kr(I_n, ops_xi.Dm, I_eta,I_zeta); | |
149 diffSum=-Ap*Dmxi; | |
150 clear Ap Dmxi | |
151 | |
152 Am = (obj.Aevaluated-alphaA*I_N)/2; | |
153 obj.Aevaluated=[]; | |
154 Dpxi = kr(I_n, ops_xi.Dp, I_eta,I_zeta); | |
155 temp=Am*Dpxi; | |
156 diffSum=diffSum-temp; | |
157 clear Am Dpxi | |
158 | |
159 Bp = (obj.Bevaluated+alphaB*I_N)/2; | |
160 Dmeta = kr(I_n, I_xi, ops_eta.Dm,I_zeta); | |
161 temp=Bp*Dmeta; | |
162 diffSum=diffSum-temp; | |
163 clear Bp Dmeta | |
164 | |
165 Bm = (obj.Bevaluated-alphaB*I_N)/2; | |
166 obj.Bevaluated=[]; | |
167 Dpeta = kr(I_n, I_xi, ops_eta.Dp,I_zeta); | |
168 temp=Bm*Dpeta; | |
169 diffSum=diffSum-temp; | |
170 clear Bm Dpeta | |
171 | |
172 | |
173 Cp = (obj.Cevaluated+alphaC*I_N)/2; | |
174 Dmzeta = kr(I_n, I_xi, I_eta,ops_zeta.Dm); | |
175 temp=Cp*Dmzeta; | |
176 diffSum=diffSum-temp; | |
177 clear Cp Dmzeta | |
178 | |
179 Cm = (obj.Cevaluated-alphaC*I_N)/2; | |
180 clear I_N | |
181 obj.Cevaluated=[]; | |
182 Dpzeta = kr(I_n, I_xi, I_eta,ops_zeta.Dp); | |
183 temp=Cm*Dpzeta; | |
184 diffSum=diffSum-temp; | |
185 clear Cm Dpzeta temp | |
186 | |
187 | |
188 obj.J = obj.X_xi.*obj.Y_eta.*obj.Z_zeta... | |
189 +obj.X_zeta.*obj.Y_xi.*obj.Z_eta... | |
190 +obj.X_eta.*obj.Y_zeta.*obj.Z_xi... | |
191 -obj.X_xi.*obj.Y_zeta.*obj.Z_eta... | |
192 -obj.X_eta.*obj.Y_xi.*obj.Z_zeta... | |
193 -obj.X_zeta.*obj.Y_eta.*obj.Z_xi; | |
194 | |
195 obj.Ji = kr(I_n,spdiags(1./obj.J,0,m_tot,m_tot)); | |
196 obj.Eevaluated = obj.evaluateCoefficientMatrix(obj.E, obj.X, obj.Y,obj.Z,[],[],[],[],[],[]); | |
197 | |
198 obj.D = obj.Ji*diffSum-obj.Eevaluated; | |
199 otherwise | |
200 D1_xi=kr(I_n,D1_xi); | |
201 D1_eta=kr(I_n,D1_eta); | |
202 D1_zeta=kr(I_n,D1_zeta); | |
203 | |
204 obj.J = obj.X_xi.*obj.Y_eta.*obj.Z_zeta... | |
205 +obj.X_zeta.*obj.Y_xi.*obj.Z_eta... | |
206 +obj.X_eta.*obj.Y_zeta.*obj.Z_xi... | |
207 -obj.X_xi.*obj.Y_zeta.*obj.Z_eta... | |
208 -obj.X_eta.*obj.Y_xi.*obj.Z_zeta... | |
209 -obj.X_zeta.*obj.Y_eta.*obj.Z_xi; | |
210 | |
211 obj.Ji = kr(I_n,spdiags(1./obj.J,0,m_tot,m_tot)); | |
212 obj.Eevaluated = obj.evaluateCoefficientMatrix(obj.E, obj.X, obj.Y,obj.Z,[],[],[],[],[],[]); | |
213 | |
214 obj.D = obj.Ji*(-obj.Aevaluated*D1_xi-obj.Bevaluated*D1_eta -obj.Cevaluated*D1_zeta)-obj.Eevaluated; | |
215 end | |
216 obj.Hxii = kr(I_n, ops_xi.HI, I_eta,I_zeta); | |
217 obj.Hetai = kr(I_n, I_xi, ops_eta.HI,I_zeta); | |
218 obj.Hzetai = kr(I_n, I_xi,I_eta, ops_zeta.HI); | |
151 | 219 |
152 obj.index_w = (kr(ops_xi.e_l, O_eta,O_zeta)==1); | 220 obj.index_w = (kr(ops_xi.e_l, O_eta,O_zeta)==1); |
153 obj.index_e = (kr(ops_xi.e_r, O_eta,O_zeta)==1); | 221 obj.index_e = (kr(ops_xi.e_r, O_eta,O_zeta)==1); |
154 obj.index_s = (kr(O_xi, ops_eta.e_l,O_zeta)==1); | 222 obj.index_s = (kr(O_xi, ops_eta.e_l,O_zeta)==1); |
155 obj.index_n = (kr(O_xi, ops_eta.e_r,O_zeta)==1); | 223 obj.index_n = (kr(O_xi, ops_eta.e_r,O_zeta)==1); |
156 obj.index_b = (kr(O_xi, O_eta, ops_zeta.e_l)==1); | 224 obj.index_b = (kr(O_xi, O_eta, ops_zeta.e_l)==1); |
157 obj.index_t = (kr(O_xi, O_eta, ops_zeta.e_r)==1); | 225 obj.index_t = (kr(O_xi, O_eta, ops_zeta.e_r)==1); |
158 | 226 |
159 | 227 obj.e_w = kr(I_n, ops_xi.e_l, I_eta,I_zeta); |
160 obj.Ahat = @transform_coefficient_matrix; | 228 obj.e_e = kr(I_n, ops_xi.e_r, I_eta,I_zeta); |
161 obj.Bhat = @transform_coefficient_matrix; | 229 obj.e_s = kr(I_n, I_xi, ops_eta.e_l,I_zeta); |
162 obj.Chat = @transform_coefficient_matrix; | 230 obj.e_n = kr(I_n, I_xi, ops_eta.e_r,I_zeta); |
163 obj.E = @(obj,x,y,z,~,~,~,~,~,~)E(obj,x,y,z); | 231 obj.e_b = kr(I_n, I_xi, I_eta, ops_zeta.e_l); |
164 | 232 obj.e_t = kr(I_n, I_xi, I_eta, ops_zeta.e_r); |
165 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); | 233 |
166 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); | 234 |
167 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); | 235 |
168 obj.Eevaluated = obj.evaluateCoefficientMatrix(obj.E, obj.X, obj.Y,obj.Z,[],[],[],[],[],[]); | 236 obj.Eta_xi = kr(obj.eta,ones(m_xi,1)); |
169 | 237 obj.Zeta_xi = kr(ones(m_eta,1),obj.zeta); |
170 obj.J = obj.X_xi.*obj.Y_eta.*obj.Z_zeta... | 238 obj.Xi_eta = kr(obj.xi,ones(m_zeta,1)); |
171 +obj.X_zeta.*obj.Y_xi.*obj.Z_eta... | 239 obj.Zeta_eta = kr(ones(m_xi,1),obj.zeta); |
172 +obj.X_eta.*obj.Y_zeta.*obj.Z_xi... | 240 obj.Xi_zeta = kr(obj.xi,ones(m_eta,1)); |
173 -obj.X_xi.*obj.Y_zeta.*obj.Z_eta... | 241 obj.Eta_zeta = kr(ones(m_zeta,1),obj.eta); |
174 -obj.X_eta.*obj.Y_xi.*obj.Z_zeta... | |
175 -obj.X_zeta.*obj.Y_eta.*obj.Z_xi; | |
176 | |
177 obj.Ji = kr(I_n,spdiags(1./obj.J,0,m_tot,m_tot)); | |
178 | |
179 | |
180 switch operator | |
181 case 'upwind' | |
182 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)))); | |
183 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)))); | |
184 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)))); | |
185 | |
186 Ap = (obj.Aevaluated+alphaA*I_N)/2; | |
187 Dmxi = kr(I_n, ops_xi.Dm, I_eta,I_zeta); | |
188 diffSum=-Ap*Dmxi; | |
189 clear Ap Dmxi | |
190 | |
191 Am = (obj.Aevaluated-alphaA*I_N)/2; | |
192 clear obj.Aevaluated | |
193 Dpxi = kr(I_n, ops_xi.Dp, I_eta,I_zeta); | |
194 temp=Am*Dpxi; | |
195 diffSum=diffSum-temp; | |
196 clear Am Dpxi | |
197 | |
198 Bp = (obj.Bevaluated+alphaB*I_N)/2; | |
199 Dmeta = kr(I_n, I_xi, ops_eta.Dm,I_zeta); | |
200 temp=Bp*Dmeta; | |
201 diffSum=diffSum-temp; | |
202 clear Bp Dmeta | |
203 | |
204 Bm = (obj.Bevaluated-alphaB*I_N)/2; | |
205 clear obj.Bevaluated | |
206 Dpeta = kr(I_n, I_xi, ops_eta.Dp,I_zeta); | |
207 temp=Bm*Dpeta; | |
208 diffSum=diffSum-temp; | |
209 | |
210 | |
211 Cp = (obj.Cevaluated+alphaC*I_N)/2; | |
212 Dmzeta = kr(I_n, I_xi, I_eta,ops_zeta.Dm); | |
213 temp=Cp*Dmzeta; | |
214 diffSum=diffSum-temp; | |
215 clear Cp Dmzeta | |
216 | |
217 Cm = (obj.Cevaluated-alphaC*I_N)/2; | |
218 clear obj.Cevaluated | |
219 Dpzeta = kr(I_n, I_xi, I_eta,ops_zeta.Dp); | |
220 temp=Cm*Dpzeta; | |
221 diffSum=diffSum-temp; | |
222 | |
223 obj.D = obj.Ji*diffSum-obj.Eevaluated; | |
224 otherwise | |
225 obj.D = obj.Ji*(-obj.Aevaluated*D1_xi-obj.Bevaluated*D1_eta -obj.Cevaluated*D1_zeta)-obj.Eevaluated; | |
226 end | |
227 | |
228 | 242 |
229 end | 243 end |
230 | 244 |
231 function [ret] = transform_coefficient_matrix(obj,x,y,z,x_1,x_2,y_1,y_2,z_1,z_2) | 245 function [ret] = transform_coefficient_matrix(obj,x,y,z,x_1,x_2,y_1,y_2,z_1,z_2) |
232 ret = obj.A(obj,x,y,z).*(y_1.*z_2-z_1.*y_2); | 246 ret = obj.A(obj,x,y,z).*(y_1.*z_2-z_1.*y_2); |
279 matVec = mat; | 293 matVec = mat; |
280 [rows,cols] = size(matVec); | 294 [rows,cols] = size(matVec); |
281 side = max(length(X),length(Y)); | 295 side = max(length(X),length(Y)); |
282 cols = cols/side; | 296 cols = cols/side; |
283 end | 297 end |
298 matVec(abs(matVec)<10^(-10))=0; | |
284 ret = cell(rows,cols); | 299 ret = cell(rows,cols); |
285 | 300 |
286 | 301 |
287 for ii=1:rows | 302 for ii=1:rows |
288 for jj=1:cols | 303 for jj=1:cols |
289 ret{ii,jj} = diag(matVec(ii,(jj-1)*side+1:jj*side)); | 304 ret{ii,jj} = diag(matVec(ii,(jj-1)*side+1:jj*side)); |
290 end | 305 end |
291 end | 306 end |
292 | 307 |
293 ret = cell2mat(ret); | 308 ret = cell2mat(ret); |
309 | |
294 end | 310 end |
295 | 311 |
296 | 312 |
297 function [BM] = boundary_matrices(obj,boundary) | 313 function [BM] = boundary_matrices(obj,boundary) |
298 params = obj.params; | 314 params = obj.params; |