11 #include "libmesh/int_range.h" 16 const std::vector<Real> & yaxis,
25 unsigned int & lowerX,
26 unsigned int & upperX)
const 34 else if (x >= inArr[
N - 1])
49 else if (x == inArr[i])
96 if ((lx == ux) && (ly == uy))
110 return fQ11 + (fQ12 - fQ11) * (y - y1) / (y2 - y1);
114 return fQ11 + (fQ21 - fQ11) * (x - x1) / (x2 - x1);
116 auto fxy = fQ11 * (x2 - x) * (y2 - y);
117 fxy += fQ21 * (x - x1) * (y2 - y);
118 fxy += fQ12 * (x2 - x) * (y - y1);
119 fxy += fQ22 * (x - x1) * (y - y1);
120 fxy /= ((x2 - x1) * (y2 - y1));
133 const unsigned int deriv_var)
const 141 const unsigned int deriv_var)
const 146 template <
typename T>
150 const unsigned int deriv_var)
const 153 if (deriv_var != 1 && deriv_var != 2)
184 const auto nx1 =
_x1.size();
185 const auto nx2 =
_x2.size();
193 if (ux == 0 && uy == 0)
197 const auto & fQ33 =
_z_surface(ly + 1, lx + 1);
203 auto dfdx = fQ11 * (y - y3);
204 dfdx += fQ31 * (y3 - y);
205 dfdx += fQ13 * (y1 - y);
206 dfdx += fQ33 * (y - y1);
207 dfdx /= ((x3 - x1) * (y3 - y1));
210 else if (deriv_var == 2)
212 auto dfdy = fQ11 * (x - x3);
213 dfdy += fQ31 * (x1 - x);
214 dfdy += fQ13 * (x3 - x);
215 dfdy += fQ33 * (x - x1);
216 dfdy /= ((x3 - x1) * (y3 - y1));
220 else if (uy == 0 && lx == nx1 - 1)
223 const auto & fQ03 =
_z_surface(ly + 1, lx - 1);
230 auto dfdx = fQ01 * (y - y3);
231 dfdx += fQ21 * (y3 - y);
232 dfdx += fQ03 * (y1 - y);
233 dfdx += fQ23 * (y - y1);
234 dfdx /= ((x2 - x0) * (y3 - y1));
237 else if (deriv_var == 2)
239 auto dfdy = fQ01 * (x - x2);
240 dfdy += fQ21 * (x0 - x);
241 dfdy += fQ03 * (x2 - x);
242 dfdy += fQ23 * (x - x0);
243 dfdy /= ((x2 - x0) * (y3 - y1));
247 else if (ly == nx2 - 1 && ux == 0)
250 const auto & fQ30 =
_z_surface(ly - 1, lx + 1);
257 auto dfdx = fQ10 * (y - y2);
258 dfdx += fQ30 * (y2 - y);
259 dfdx += fQ12 * (y0 - y);
260 dfdx += fQ32 * (y - y0);
261 dfdx /= ((x3 - x1) * (y2 - y0));
264 else if (deriv_var == 2)
266 auto dfdy = fQ10 * (x - x3);
267 dfdy += fQ30 * (x1 - x);
268 dfdy += fQ12 * (x3 - x);
269 dfdy += fQ32 * (x - x1);
270 dfdy /= ((x3 - x1) * (y2 - y0));
274 else if (ly == nx2 - 1 && lx == nx1 - 1)
276 const auto & fQ00 =
_z_surface(ly - 1, lx - 1);
284 auto dfdx = fQ00 * (y - y2);
285 dfdx += fQ20 * (y2 - y);
286 dfdx += fQ02 * (y0 - y);
287 dfdx += fQ22 * (y - y0);
288 dfdx /= ((x2 - x0) * (y2 - y0));
291 else if (deriv_var == 2)
293 auto dfdy = fQ00 * (x - x2);
294 dfdy += fQ20 * (x0 - x);
295 dfdy += fQ02 * (x2 - x);
296 dfdy += fQ22 * (x - x0);
297 dfdy /= ((x2 - x0) * (y2 - y0));
303 else if (ux == 0 && ly == uy && ux == lx)
308 const auto & fQ33 =
_z_surface(uy + 1, ux + 1);
316 auto dfdx = fQ10 * (y - y3);
317 dfdx += fQ30 * (y3 - y);
318 dfdx += fQ13 * (y0 - y);
319 dfdx += fQ33 * (y - y0);
320 dfdx /= ((x3 - x1) * (y3 - y0));
323 else if (deriv_var == 2)
325 auto dfdy = fQ10 * (x - x3);
326 dfdy += fQ30 * (x1 - x);
327 dfdy += fQ13 * (x3 - x);
328 dfdy += fQ33 * (x - x1);
329 dfdy /= ((x3 - x1) * (y3 - y0));
333 else if (lx == nx1 - 1 && ly == uy && ux == lx)
335 const auto & fQ00 =
_z_surface(uy - 1, lx - 1);
337 const auto & fQ03 =
_z_surface(uy + 1, lx - 1);
346 auto dfdx = fQ00 * (y - y3);
347 dfdx += fQ10 * (y3 - y);
348 dfdx += fQ03 * (y0 - y);
349 dfdx += fQ13 * (y - y0);
350 dfdx /= ((x1 - x0) * (y3 - y0));
353 else if (deriv_var == 2)
355 auto dfdy = fQ00 * (x - x1);
356 dfdy += fQ10 * (x0 - x);
357 dfdy += fQ03 * (x1 - x);
358 dfdy += fQ13 * (x - x0);
359 dfdy /= ((x1 - x0) * (y3 - y0));
363 else if (uy == nx2 - 1 && ly == uy && ux == lx)
365 const auto & fQ00 =
_z_surface(uy - 1, lx - 1);
367 const auto & fQ30 =
_z_surface(uy - 1, lx + 1);
376 auto dfdx = fQ00 * (y - y1);
377 dfdx += fQ30 * (y1 - y);
378 dfdx += fQ01 * (y0 - y);
379 dfdx += fQ31 * (y - y0);
380 dfdx /= ((x3 - x0) * (y1 - y0));
383 else if (deriv_var == 2)
385 auto dfdy = fQ00 * (x - x3);
386 dfdy += fQ30 * (x0 - x);
387 dfdy += fQ01 * (x3 - x);
388 dfdy += fQ31 * (x - x0);
389 dfdy /= ((x3 - x0) * (y1 - y0));
393 else if (uy == 0 && ly == uy && ux == lx)
396 const auto & fQ03 =
_z_surface(ly + 1, lx - 1);
398 const auto & fQ33 =
_z_surface(ly + 1, lx + 1);
406 auto dfdx = fQ01 * (y - y3);
407 dfdx += fQ31 * (y3 - y);
408 dfdx += fQ03 * (y1 - y);
409 dfdx += fQ33 * (y - y1);
410 dfdx /= ((x3 - x0) * (y3 - y1));
413 else if (deriv_var == 2)
415 auto dfdy = fQ01 * (x - x3);
416 dfdy += fQ31 * (x0 - x);
417 dfdy += fQ03 * (x3 - x);
418 dfdy += fQ33 * (x - x0);
419 dfdy /= ((x3 - x0) * (y3 - y1));
425 else if (ux == lx && uy == ly)
427 const auto & fQ00 =
_z_surface(ly - 1, lx - 1);
428 const auto & fQ03 =
_z_surface(ly + 1, lx - 1);
429 const auto & fQ30 =
_z_surface(ly - 1, lx + 1);
430 const auto & fQ33 =
_z_surface(ly + 1, lx + 1);
439 auto dfdx = fQ00 * (y - y3);
440 dfdx += fQ30 * (y3 - y);
441 dfdx += fQ03 * (y0 - y);
442 dfdx += fQ33 * (y - y0);
443 dfdx /= ((x3 - x0) * (y3 - y0));
446 else if (deriv_var == 2)
448 auto dfdy = fQ00 * (x - x3);
449 dfdy += fQ30 * (x0 - x);
450 dfdy += fQ03 * (x3 - x);
451 dfdy += fQ33 * (x - x0);
452 dfdy /= ((x3 - x0) * (y3 - y0));
463 return (fQ21 - fQ11) / (x2 - x1);
465 else if (lx == ux && lx > 0 && ux < nx1 - 1)
476 auto dfdx_a = fQ01 * (y - y2);
477 dfdx_a += fQ11 * (y2 - y);
478 dfdx_a += fQ02 * (y1 - y);
479 dfdx_a += fQ12 * (y - y1);
480 dfdx_a /= ((x1 - x0) * (y2 - y1));
482 auto dfdx_b = fQ11 * (y - y2);
483 dfdx_b += fQ31 * (y2 - y);
484 dfdx_b += fQ12 * (y1 - y);
485 dfdx_b += fQ32 * (y - y1);
486 dfdx_b /= ((x3 - x1) * (y2 - y1));
487 return 0.5 * (dfdx_a + dfdx_b);
490 else if (lx == ux && lx == 0)
497 auto dfdx = fQ11 * (y - y2);
498 dfdx += fQ31 * (y2 - y);
499 dfdx += fQ12 * (y1 - y);
500 dfdx += fQ32 * (y - y1);
501 dfdx /= ((x3 - x1) * (y2 - y1));
505 else if (lx == ux && ux == nx1 - 1)
511 auto dfdx = fQ01 * (y - y2);
512 dfdx += fQ11 * (y2 - y);
513 dfdx += fQ02 * (y1 - y);
514 dfdx += fQ12 * (y - y1);
515 dfdx /= ((x1 - x0) * (y2 - y1));
521 auto dfdx_xy = fQ11 * (y - y2);
522 dfdx_xy += fQ21 * (y2 - y);
523 dfdx_xy += fQ12 * (y1 - y);
524 dfdx_xy += fQ22 * (y - y1);
525 dfdx_xy /= ((x2 - x1) * (y2 - y1));
530 else if (deriv_var == 2)
533 return (fQ12 - fQ11) / (y2 - y1);
535 else if (ly == uy && ly > 0 && uy < nx2 - 1)
545 auto dfdy_a = fQ10 * (x - x2);
546 dfdy_a += fQ20 * (x1 - x);
547 dfdy_a += fQ11 * (x2 - x);
548 dfdy_a += fQ21 * (x - x1);
549 dfdy_a /= ((x2 - x1) * (y1 - y0));
551 auto dfdy_b = fQ11 * (x - x2);
552 dfdy_b += fQ21 * (x1 - x);
553 dfdy_b += fQ13 * (x2 - x);
554 dfdy_b += fQ23 * (x - x1);
555 dfdy_b /= ((x2 - x1) * (y3 - y1));
556 return 0.5 * (dfdy_a + dfdy_b);
559 else if (ly == uy && ly == 0)
566 auto dfdy = fQ11 * (x - x2);
567 dfdy += fQ21 * (x1 - x);
568 dfdy += fQ13 * (x2 - x);
569 dfdy += fQ23 * (x - x1);
570 dfdy /= ((x2 - x1) * (y3 - y1));
574 else if (ly == uy && uy == nx2 - 1)
580 auto dfdy = fQ10 * (x - x2);
581 dfdy += fQ20 * (x1 - x);
582 dfdy += fQ11 * (x2 - x);
583 dfdy += fQ21 * (x - x1);
584 dfdy /= ((x2 - x1) * (y1 - y0));
590 auto dfdy_xy = fQ11 * (x - x2);
591 dfdy_xy += fQ21 * (x1 - x);
592 dfdy_xy += fQ12 * (x2 - x);
593 dfdy_xy += fQ22 * (x - x1);
594 dfdy_xy /= ((x2 - x1) * (y2 - y1));
598 mooseError(
"Bilinear interpolation failed to select a case for x1= ", s1,
" x2= ", s2);
603 Real s1, Real s2, Real & y, Real & dy_ds1, Real & dy_ds2)
const
void mooseError(Args &&... args)
Emit an error message with the given stringified, concatenated args and terminate the application...
DualNumber< Real, Real > ChainedReal
BilinearInterpolation(const std::vector< Real > &xaxis, const std::vector< Real > &yaxis, const ColumnMajorMatrix &zsurface)
Constructor, Takes two vectors of points for which to apply the fit.
void sampleValueAndDerivatives(Real s1, Real s2, Real &y, Real &dy_ds1, Real &dy_ds2) const override
Samples value and first derivatives at point (x1, x2) Use this function for speed when computing both...
std::vector< Real > _x1
Independent values in the x1 direction.
ColumnMajorMatrix _z_surface
Real sampleDerivative(const Real s1, const Real s2, unsigned int deriv_var) const override
Samples first derivative at point (s1, s2)
T sampleDerivativeInternal(const T s1, const T s2, const unsigned int deriv_var) const
T sampleInternal(const T &s1, const T &s2) const
sampleInternal only used by BilinearInterpolation, hence made private
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
std::vector< Real > _x2
Independent values in the x2 direction.
Real sample(const Real s1, const Real s2) const override
This function will take an independent variable input and will return the dependent variable based on...
IntRange< T > make_range(T beg, T end)
void getNeighborIndices(const std::vector< Real > &inArr, Real x, unsigned int &lowerX, unsigned int &upperX) const
This class interpolates tabulated data with a Bidimension function (either bicubic or bilinear)...