---------------------------------------------------------------------------- SPDX-License-Identifier: GPL-3.0-or-later © 2008-2024 San Diego State University Research Foundation (SDSURF). See LICENSE file or https://www.gnu.org/licenses/gpl-3.0.html for details. ----------------------------------------------------------------------------
0001 function [Nx, Ny, Nz] = nodal3DCurv(k, X, Y, Z) 0002 % ---------------------------------------------------------------------------- 0003 % SPDX-License-Identifier: GPL-3.0-or-later 0004 % © 2008-2024 San Diego State University Research Foundation (SDSURF). 0005 % See LICENSE file or https://www.gnu.org/licenses/gpl-3.0.html for details. 0006 % ---------------------------------------------------------------------------- 0007 0008 % Get the determinant of the jacobian and the metrics 0009 [J, Xe, Xn, Xc, Ye, Yn, Yc, Ze, Zn, Zc] = jacobian3D(k, X, Y, Z); 0010 0011 % Dimensions of nodal grid 0012 [n, m, o] = size(X); 0013 0014 len = n*m*o; 0015 0016 % Convert metrics to diagonal matrices 0017 J = spdiags(1./J, 0, numel(len), numel(len)); 0018 A = spdiags(Yn.*Zc-Zn.*Yc, 0, len, len); 0019 B = spdiags(Zn.*Xc-Xn.*Zc, 0, len, len); 0020 C = spdiags(Xn.*Yc-Yn.*Xc, 0, len, len); 0021 D = spdiags(Ze.*Yc-Ye.*Zc, 0, len, len); 0022 E = spdiags(Xe.*Zc-Ze.*Xc, 0, len, len); 0023 F = spdiags(Ye.*Xc-Xe.*Yc, 0, len, len); 0024 G = spdiags(Ye.*Zn-Ze.*Yn, 0, len, len); 0025 H = spdiags(Ze.*Xn-Xe.*Zn, 0, len, len); 0026 I = spdiags(Xe.*Yn-Ye.*Xn, 0, len, len); 0027 0028 % Construct 3D uniform nodal operator 0029 N = nodal3D(k, m, 1, n, 1, o, 1); % N is tall and skinny 0030 Ne = N(1:len, :); 0031 Nn = N(len+1:2*len, :); 0032 Nc = N(2*len+1:end, :); 0033 0034 % Apply transformation 0035 Nx = J*(A*Ne+D*Nn+G*Nc); 0036 Ny = J*(B*Ne+E*Nn+H*Nc); 0037 Nz = J*(C*Ne+F*Nn+I*Nc); 0038 0039 % [J*A J*D J*G; 0040 % J*B J*E J*H; 0041 % J*C J*F J*I]*[Ne; Nn; Nc] 0042 end