150 const unsigned int deriv_var)
const
153 if (deriv_var != 1 && deriv_var != 2)
178 const Real & x1 =
_x1[lx];
179 const Real & x2 =
_x1[ux];
180 const Real & y1 =
_x2[ly];
181 const Real & y2 =
_x2[uy];
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);
198 const Real & x3 =
_x1[lx + 1];
199 const Real & y3 =
_x2[ly + 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);
225 const Real & x0 =
_x1[lx - 1];
226 const Real & y3 =
_x2[ly + 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);
252 const Real & x3 =
_x1[lx + 1];
253 const Real & y0 =
_x2[ly - 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);
279 const Real & x0 =
_x1[lx - 1];
280 const Real & y0 =
_x2[ly - 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);
310 const Real & x3 =
_x1[lx + 1];
311 const Real & y0 =
_x2[ly - 1];
312 const Real & y3 =
_x2[ly + 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);
340 const Real & x0 =
_x1[lx - 1];
341 const Real & y0 =
_x2[ly - 1];
342 const Real & y3 =
_x2[ly + 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);
370 const Real & x0 =
_x1[lx - 1];
371 const Real & x3 =
_x1[lx + 1];
372 const Real & y0 =
_x2[ly - 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);
400 const Real & x0 =
_x1[lx - 1];
401 const Real & x3 =
_x1[lx + 1];
402 const Real & y3 =
_x2[ly + 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);
432 const Real & x0 =
_x1[lx - 1];
433 const Real & x3 =
_x1[lx + 1];
434 const Real & y0 =
_x2[ly - 1];
435 const Real & y3 =
_x2[ly + 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)
473 const Real & x0 =
_x1[lx - 1];
474 const Real & x3 =
_x1[lx + 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)
495 const Real & x3 =
_x1[lx + 1];
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)
509 const Real & x0 =
_x1[ux - 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)
542 const Real & y0 =
_x2[ly - 1];
543 const Real & y3 =
_x2[ly + 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)
564 const Real & y3 =
_x2[ly + 1];
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)
578 const Real & y0 =
_x2[ly - 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);