61inline TYPE
det(
const TYPE *M )
63 if constexpr ( NDIM == 1 ) {
65 }
else if constexpr ( NDIM == 2 ) {
66 return M[0] * M[3] - M[1] * M[2];
67 }
else if constexpr ( NDIM == 3 ) {
69 det += M[0] * ( M[4] * M[8] - M[7] * M[5] );
70 det -= M[3] * ( M[1] * M[8] - M[7] * M[2] );
71 det += M[6] * ( M[1] * M[5] - M[4] * M[2] );
73 }
else if constexpr ( NDIM == 4 ) {
75 tmp[0] = M[2] * M[7] - M[6] * M[3];
76 tmp[1] = M[2] * M[11] - M[10] * M[3];
77 tmp[2] = M[2] * M[15] - M[14] * M[3];
78 tmp[3] = M[6] * M[11] - M[10] * M[7];
79 tmp[4] = M[6] * M[15] - M[14] * M[7];
80 tmp[5] = M[10] * M[15] - M[14] * M[11];
82 det += M[0] * ( M[5] * tmp[5] - M[9] * tmp[4] + M[13] * tmp[3] );
83 det -= M[4] * ( M[1] * tmp[5] - M[9] * tmp[2] + M[13] * tmp[1] );
84 det += M[8] * ( M[1] * tmp[4] - M[5] * tmp[2] + M[13] * tmp[0] );
85 det -= M[12] * ( M[1] * tmp[3] - M[5] * tmp[1] + M[9] * tmp[0] );
88 throw std::logic_error(
"Not programmed" );
134inline void solve(
const TYPE *M,
const TYPE *b, TYPE *x, TYPE &det_M )
136 if constexpr ( NDIM == 1 ) {
139 }
else if constexpr ( NDIM == 2 ) {
140 det_M = M[0] * M[3] - M[1] * M[2];
141 x[0] = M[3] * b[0] - M[2] * b[1];
142 x[1] = M[0] * b[1] - M[1] * b[0];
143 }
else if constexpr ( NDIM == 3 ) {
145 inv[0] = M[4] * M[8] - M[7] * M[5];
146 inv[1] = M[7] * M[2] - M[1] * M[8];
147 inv[2] = M[1] * M[5] - M[4] * M[2];
148 inv[3] = M[6] * M[5] - M[3] * M[8];
149 inv[4] = M[0] * M[8] - M[6] * M[2];
150 inv[5] = M[3] * M[2] - M[0] * M[5];
151 inv[6] = M[3] * M[7] - M[6] * M[4];
152 inv[7] = M[6] * M[1] - M[0] * M[7];
153 inv[8] = M[0] * M[4] - M[3] * M[1];
154 det_M = M[0] * inv[0] + M[3] * inv[1] + M[6] * inv[2];
155 x[0] = inv[0] * b[0] + inv[3] * b[1] + inv[6] * b[2];
156 x[1] = inv[1] * b[0] + inv[4] * b[1] + inv[7] * b[2];
157 x[2] = inv[2] * b[0] + inv[5] * b[1] + inv[8] * b[2];
158 }
else if constexpr ( NDIM == 4 ) {
160 TYPE m00 = M[0], m01 = M[4], m02 = M[8], m03 = M[12];
161 TYPE m10 = M[1], m11 = M[5], m12 = M[9], m13 = M[13];
162 TYPE m20 = M[2], m21 = M[6], m22 = M[10], m23 = M[14];
163 TYPE m30 = M[3], m31 = M[7], m32 = M[11], m33 = M[15];
164 det_M = det<TYPE, NDIM>( M );
165 inv[0] = m12 * m23 * m31 - m13 * m22 * m31 + m13 * m21 * m32 - m11 * m23 * m32 -
166 m12 * m21 * m33 + m11 * m22 * m33;
167 inv[1] = m03 * m22 * m31 - m02 * m23 * m31 - m03 * m21 * m32 + m01 * m23 * m32 +
168 m02 * m21 * m33 - m01 * m22 * m33;
169 inv[2] = m02 * m13 * m31 - m03 * m12 * m31 + m03 * m11 * m32 - m01 * m13 * m32 -
170 m02 * m11 * m33 + m01 * m12 * m33;
171 inv[3] = m03 * m12 * m21 - m02 * m13 * m21 - m03 * m11 * m22 + m01 * m13 * m22 +
172 m02 * m11 * m23 - m01 * m12 * m23;
173 inv[4] = m13 * m22 * m30 - m12 * m23 * m30 - m13 * m20 * m32 + m10 * m23 * m32 +
174 m12 * m20 * m33 - m10 * m22 * m33;
175 inv[5] = m02 * m23 * m30 - m03 * m22 * m30 + m03 * m20 * m32 - m00 * m23 * m32 -
176 m02 * m20 * m33 + m00 * m22 * m33;
177 inv[6] = m03 * m12 * m30 - m02 * m13 * m30 - m03 * m10 * m32 + m00 * m13 * m32 +
178 m02 * m10 * m33 - m00 * m12 * m33;
179 inv[7] = m02 * m13 * m20 - m03 * m12 * m20 + m03 * m10 * m22 - m00 * m13 * m22 -
180 m02 * m10 * m23 + m00 * m12 * m23;
181 inv[8] = m11 * m23 * m30 - m13 * m21 * m30 + m13 * m20 * m31 - m10 * m23 * m31 -
182 m11 * m20 * m33 + m10 * m21 * m33;
183 inv[9] = m03 * m21 * m30 - m01 * m23 * m30 - m03 * m20 * m31 + m00 * m23 * m31 +
184 m01 * m20 * m33 - m00 * m21 * m33;
185 inv[10] = m01 * m13 * m30 - m03 * m11 * m30 + m03 * m10 * m31 - m00 * m13 * m31 -
186 m01 * m10 * m33 + m00 * m11 * m33;
187 inv[11] = m03 * m11 * m20 - m01 * m13 * m20 - m03 * m10 * m21 + m00 * m13 * m21 +
188 m01 * m10 * m23 - m00 * m11 * m23;
189 inv[12] = m12 * m21 * m30 - m11 * m22 * m30 - m12 * m20 * m31 + m10 * m22 * m31 +
190 m11 * m20 * m32 - m10 * m21 * m32;
191 inv[13] = m01 * m22 * m30 - m02 * m21 * m30 + m02 * m20 * m31 - m00 * m22 * m31 -
192 m01 * m20 * m32 + m00 * m21 * m32;
193 inv[14] = m02 * m11 * m30 - m01 * m12 * m30 - m02 * m10 * m31 + m00 * m12 * m31 +
194 m01 * m10 * m32 - m00 * m11 * m32;
195 inv[15] = m01 * m12 * m20 - m02 * m11 * m20 + m02 * m10 * m21 - m00 * m12 * m21 -
196 m01 * m10 * m22 + m00 * m11 * m22;
197 x[0] = ( inv[0] * b[0] + inv[1] * b[1] + inv[2] * b[2] + inv[3] * b[3] );
198 x[1] = ( inv[4] * b[0] + inv[5] * b[1] + inv[6] * b[2] + inv[7] * b[3] );
199 x[2] = ( inv[8] * b[0] + inv[9] * b[1] + inv[10] * b[2] + inv[11] * b[3] );
200 x[3] = ( inv[12] * b[0] + inv[13] * b[1] + inv[14] * b[2] + inv[15] * b[3] );
225 const std::array<TYPE, NDIM> &xi )
230 ETYPE T[NDIM * NDIM];
231 for (
int i = 0; i < NDIM; i++ ) {
232 for (
int j = 0; j < NDIM; j++ )
233 T[j + i * NDIM] = ETYPE( x[i][j] - x[NDIM][j] );
236 for (
int i = 0; i < NDIM; i++ )
237 r[i] = ETYPE( xi[i] - x[NDIM][i] );
238 ETYPE L2[NDIM + 1],
det( 0 );
239 DelaunayHelpers::solve<ETYPE, NDIM>( T, r, L2,
det );
241 for (
int i = 0; i < NDIM; i++ )
244 double scale = 1.0 /
static_cast<double>(
det );
245 std::array<double, NDIM + 1> L = { 0 };
246 for (
int i = 0; i < NDIM + 1; i++ )
247 L[i] =
static_cast<double>( L2[i] ) * scale;