1#ifndef NUMERIC_STENCIL_H_
2#define NUMERIC_STENCIL_H_
5#include <AMReX_MultiFab.H>
13static std::array<StencilType, AMREX_SPACEDIM>
15[[maybe_unused]]
static std::array<StencilType, AMREX_SPACEDIM>
17[[maybe_unused]]
static std::array<StencilType, AMREX_SPACEDIM>
20[[maybe_unused]]
static std::array<StencilType, AMREX_SPACEDIM>
22[[maybe_unused]]
static std::array<StencilType, AMREX_SPACEDIM>
26[[maybe_unused]]
static std::array<StencilType, AMREX_SPACEDIM>
28[[maybe_unused]]
static std::array<StencilType, AMREX_SPACEDIM>
35std::array<StencilType, AMREX_SPACEDIM>
36GetStencil(
const int i,
const int j,
const int k,
const amrex::Box domain)
38 (void)i; (void)j; (void)k;
39 std::array<StencilType, AMREX_SPACEDIM> sten;
40 const amrex::Dim3 lo = amrex::lbound(domain), hi = amrex::ubound(domain);
53template<
class T,
int x,
int y,
int z>
64 [[nodiscard]] AMREX_FORCE_INLINE
65 static T
D(
const amrex::Array4<const T>& f,
66 const int& i,
const int& j,
const int& k,
const int& m,
68 std::array<StencilType, AMREX_SPACEDIM> stencil =
DefaultType)
71 return (f(i, j, k, m) - f(i - 1, j, k, m)) / dx[0];
73 return (f(i + 1, j, k, m) - f(i, j, k, m)) / dx[0];
75 return (f(i + 1, j, k, m) - f(i - 1, j, k, m)) * 0.5 / dx[0];
77 [[nodiscard]] AMREX_FORCE_INLINE
78 static std::pair<Set::Scalar,T>
79 Dsplit(
const amrex::Array4<const T>& f,
80 const int& i,
const int& j,
const int& k,
const int& m,
82 std::array<StencilType, AMREX_SPACEDIM> stencil =
DefaultType)
85 return std::make_pair(
87 -f(i - 1, j, k, m) / dx[0]
90 return std::make_pair(
92 f(i + 1, j, k, m) / dx[0]
95 return std::make_pair(
97 (f(i + 1, j, k, m) - f(i - 1, j, k, m)) * 0.5 / dx[0]
105 [[nodiscard]] AMREX_FORCE_INLINE
106 static T
D(
const amrex::Array4<const T>& f,
107 const int& i,
const int& j,
const int& k,
const int& m,
109 std::array<StencilType, AMREX_SPACEDIM> stencil =
DefaultType)
112 return (f(i, j, k, m) - f(i, j - 1, k, m)) / dx[1];
114 return (f(i, j + 1, k, m) - f(i, j, k, m)) / dx[1];
116 return (f(i, j + 1, k, m) - f(i, j - 1, k, m)) * 0.5 / dx[1];
118 [[nodiscard]] AMREX_FORCE_INLINE
119 static std::pair<Set::Scalar,T>
121 const int& i,
const int& j,
const int& k,
const int& m,
123 std::array<StencilType, AMREX_SPACEDIM> stencil =
DefaultType)
126 return std::make_pair(
128 - f(i, j - 1, k, m) / dx[1]
131 return std::make_pair(
133 f(i, j + 1, k, m) / dx[1]
136 return std::make_pair(
138 (f(i, j + 1, k, m) - f(i, j - 1, k, m)) * 0.5 / dx[1]
146 [[nodiscard]] AMREX_FORCE_INLINE
147 static T
D(
const amrex::Array4<const T>& f,
148 const int& i,
const int& j,
const int& k,
const int& m,
150 std::array<StencilType, AMREX_SPACEDIM> stencil =
DefaultType)
153 return (f(i, j, k, m) - f(i, j, k - 1, m)) / dx[2];
155 return (f(i, j, k + 1, m) - f(i, j, k, m)) / dx[2];
157 return (f(i, j, k + 1, m) - f(i, j, k - 1, m)) * 0.5 / dx[2];
159 [[nodiscard]] AMREX_FORCE_INLINE
160 static std::pair<Set::Scalar, T>
162 const int& i,
const int& j,
const int& k,
const int& m,
164 std::array<StencilType, AMREX_SPACEDIM> stencil =
DefaultType)
167 return std::make_pair(
169 -f(i, j, k - 1, m) / dx[2]
172 return std::make_pair(
174 f(i, j, k + 1, m) / dx[2]
177 return std::make_pair(
179 (f(i, j, k + 1, m) - f(i, j, k - 1, m)) * 0.5 / dx[2]
191 [[nodiscard]] AMREX_FORCE_INLINE
192 static T
D(
const amrex::Array4<const T>& f,
193 const int& i,
const int& j,
const int& k,
const int& m,
195 std::array<StencilType, AMREX_SPACEDIM> stencil =
DefaultType)
198 return (f(i + 1, j, k, m) - 2.0 * f(i, j, k, m) + f(i - 1, j, k, m)) / dx[0] / dx[0];
200 return 0.0 * f(i, j, k, m);
207 [[nodiscard]] AMREX_FORCE_INLINE
208 static T
D(
const amrex::Array4<const T>& f,
209 const int& i,
const int& j,
const int& k,
const int& m,
211 std::array<StencilType, AMREX_SPACEDIM> stencil =
DefaultType)
214 return (f(i, j + 1, k, m) - 2.0 * f(i, j, k, m) + f(i, j - 1, k, m)) / dx[1] / dx[1];
216 return 0.0 * f(i, j, k, m);
223 [[nodiscard]] AMREX_FORCE_INLINE
224 static T
D(
const amrex::Array4<const T>& f,
225 const int& i,
const int& j,
const int& k,
const int& m,
227 std::array<StencilType, AMREX_SPACEDIM> stencil =
DefaultType)
230 return (f(i, j, k + 1, m) - 2.0 * f(i, j, k, m) + f(i, j, k - 1, m)) / dx[2] / dx[2];
232 return 0.0 * f(i, j, k, m);
239 [[nodiscard]] AMREX_FORCE_INLINE
240 static T
D(
const amrex::Array4<const T>& f,
241 const int& i,
const int& j,
const int& k,
const int& m,
243 std::array<StencilType, AMREX_SPACEDIM> stencil =
DefaultType)
245 int ihi = 1, ilo = 1, jhi = 1, jlo = 1;
252 return ifac * jfac * (f(i + ihi, j + jhi, k, m) + f(i - ilo, j - jlo, k, m) - f(i + ihi, j - jlo, k, m) - f(i - ilo, j + jhi, k, m)) / (dx[0] * dx[1]);
258 [[nodiscard]] AMREX_FORCE_INLINE
259 static T
D(
const amrex::Array4<const T>& f,
260 const int& i,
const int& j,
const int& k,
const int& m,
262 std::array<StencilType, AMREX_SPACEDIM> stencil =
DefaultType)
264 int khi = 1, klo = 1, ihi = 1, ilo = 1;
271 return kfac * ifac * (f(i + ihi, j, k + khi, m) + f(i - ilo, j, k - klo, m) - f(i + ihi, j, k - klo, m) - f(i - ilo, j, k + khi, m)) / (dx[0] * dx[2]);
277 [[nodiscard]] AMREX_FORCE_INLINE
278 static T
D(
const amrex::Array4<const T>& f,
279 const int& i,
const int& j,
const int& k,
const int& m,
281 std::array<StencilType, AMREX_SPACEDIM> stencil =
DefaultType)
283 int jhi = 1, jlo = 1, khi = 1, klo = 1;
290 return jfac * kfac * (f(i, j + jhi, k + khi, m) + f(i, j - jlo, k - klo, m) - f(i, j + jhi, k - klo, m) - f(i, j - jlo, k + khi, m)) / (dx[1] * dx[2]);
301 [[nodiscard]] AMREX_FORCE_INLINE
302 static T
D(
const amrex::Array4<const T>& f,
303 const int& i,
const int& j,
const int& k,
const int& m,
306 return ((f(i + 2, j, k, m)) - 4. * (f(i + 1, j, k, m)) + 6. * (f(i, j, k, m)) - 4. * (f(i - 1, j, k, m)) + (f(i - 2, j, k, m))) /
307 (dx[0] * dx[0] * dx[0] * dx[0]);
313 [[nodiscard]] AMREX_FORCE_INLINE
314 static T
D(
const amrex::Array4<const T>& f,
315 const int& i,
const int& j,
const int& k,
const int& m,
318 return ((f(i, j + 2, k, m)) - 4. * (f(i, j + 1, k, m)) + 6. * (f(i, j, k, m)) - 4. * (f(i, j - 1, k, m)) + (f(i, j - 2, k, m))) /
319 (dx[1] * dx[1] * dx[1] * dx[1]);
325 [[nodiscard]] AMREX_FORCE_INLINE
326 static T
D(
const amrex::Array4<const T>& f,
327 const int& i,
const int& j,
const int& k,
const int& m,
330 return ((f(i, j, k + 2, m)) - 4. * (f(i, j, k + 1, m)) + 6. * (f(i, j, k, m)) - 4. * (f(i, j, k - 1, m)) + (f(i, j, k - 2, m))) /
331 (dx[2] * dx[2] * dx[2] * dx[2]);
340 [[nodiscard]] AMREX_FORCE_INLINE
341 static T
D(
const amrex::Array4<const T>& f,
342 const int& i,
const int& j,
const int& k,
const int& m,
345 return ((-f(i + 2, j + 2, k, m) + 8.0 * f(i + 2, j + 1, k, m) - 8.0 * f(i + 2, j - 1, k, m) + f(i + 2, j - 2, k, m))
346 - 2 * (-f(i + 1, j + 2, k, m) + 8.0 * f(i + 1, j + 1, k, m) - 8.0 * f(i + 1, j - 1, k, m) + f(i + 1, j - 2, k, m))
347 + 2 * (-f(i - 1, j + 2, k, m) + 8.0 * f(i - 1, j + 1, k, m) - 8.0 * f(i - 1, j - 1, k, m) + f(i - 1, j - 2, k, m))
348 - (-f(i - 2, j + 2, k, m) + 8.0 * f(i - 2, j + 1, k, m) - 8.0 * f(i - 2, j - 1, k, m) + f(i - 2, j - 2, k, m))) /
349 (24.0 * dx[0] * dx[0] * dx[0] * dx[1]);
358 [[nodiscard]] AMREX_FORCE_INLINE
359 static T
D(
const amrex::Array4<const T>& f,
360 const int& i,
const int& j,
const int& k,
const int& m,
363 return ((-f(i + 2, j + 2, k, m) + 8.0 * f(i + 1, j + 2, k, m) - 8.0 * f(i - 1, j + 2, k, m) + f(i - 2, j + 2, k, m))
364 - 2 * (-f(i + 2, j + 1, k, m) + 8.0 * f(i + 1, j + 1, k, m) - 8.0 * f(i - 1, j + 1, k, m) + f(i - 2, j + 1, k, m))
365 + 2 * (-f(i + 2, j - 1, k, m) + 8.0 * f(i + 1, j - 1, k, m) - 8.0 * f(i - 1, j - 1, k, m) + f(i - 2, j - 1, k, m))
366 - (-f(i + 2, j - 2, k, m) + 8.0 * f(i + 1, j - 2, k, m) - 8.0 * f(i - 1, j - 2, k, m) + f(i - 2, j - 2, k, m))) /
367 (24.0 * dx[0] * dx[1] * dx[1] * dx[1]);
376 [[nodiscard]] AMREX_FORCE_INLINE
377 static T
D(
const amrex::Array4<const T>& f,
378 const int& i,
const int& j,
const int& k,
const int& m,
381 return ((-f(i, j + 2, k + 2, m) + 8.0 * f(i, j + 2, k + 1, m) - 8.0 * f(i, j + 2, k - 1, m) + f(i, j + 2, k - 2, m))
382 - 2 * (-f(i, j + 1, k + 2, m) + 8.0 * f(i, j + 1, k + 1, m) - 8.0 * f(i, j + 1, k - 1, m) + f(i, j + 1, k - 2, m))
383 + 2 * (-f(i, j - 1, k + 2, m) + 8.0 * f(i, j - 1, k + 1, m) - 8.0 * f(i, j - 1, k - 1, m) + f(i, j - 1, k - 2, m))
384 - (-f(i, j - 2, k + 2, m) + 8.0 * f(i, j - 2, k + 1, m) - 8.0 * f(i, j - 2, k - 1, m) + f(i, j - 2, k - 2, m))) /
385 (24.0 * dx[1] * dx[1] * dx[1] * dx[2]);
392 [[nodiscard]] AMREX_FORCE_INLINE
393 static T
D(
const amrex::Array4<const T>& f,
394 const int& i,
const int& j,
const int& k,
const int& m,
397 return ((-f(i, j + 2, k + 2, m) + 8.0 * f(i, j + 1, k + 2, m) - 8.0 * f(i, j - 1, k + 2, m) + f(i, j - 2, k + 2, m))
398 - 2 * (-f(i, j + 2, k + 1, m) + 8.0 * f(i, j + 1, k + 1, m) - 8.0 * f(i, j - 1, k + 1, m) + f(i, j - 2, k + 1, m))
399 + 2 * (-f(i, j + 2, k - 1, m) + 8.0 * f(i, j + 1, k - 1, m) - 8.0 * f(i, j - 1, k - 1, m) + f(i, j - 2, k - 1, m))
400 - (-f(i, j + 2, k - 2, m) + 8.0 * f(i, j + 1, k - 2, m) - 8.0 * f(i, j - 1, k - 2, m) + f(i, j - 2, k - 2, m))) /
401 (24.0 * dx[1] * dx[2] * dx[2] * dx[2]);
408 [[nodiscard]] AMREX_FORCE_INLINE
409 static T
D(
const amrex::Array4<const T>& f,
410 const int& i,
const int& j,
const int& k,
const int& m,
413 return ((-f(i + 2, j, k + 2, m) + 8.0 * f(i + 1, j, k + 2, m) - 8.0 * f(i - 1, j, k + 2, m) + f(i - 2, j, k + 2, m))
414 - 2 * (-f(i + 2, j, k + 1, m) + 8.0 * f(i + 1, j, k + 1, m) - 8.0 * f(i - 1, j, k + 1, m) + f(i - 2, j, k + 1, m))
415 + 2 * (-f(i + 2, j, k - 1, m) + 8.0 * f(i + 1, j, k - 1, m) - 8.0 * f(i - 1, j, k - 1, m) + f(i - 2, j, k - 1, m))
416 - (-f(i + 2, j, k - 2, m) + 8.0 * f(i + 1, j, k - 2, m) - 8.0 * f(i - 1, j, k - 2, m) + f(i - 2, j, k - 2, m))) /
417 (24.0 * dx[0] * dx[2] * dx[2] * dx[2]);
425 [[nodiscard]] AMREX_FORCE_INLINE
426 static T
D(
const amrex::Array4<const T>& f,
427 const int& i,
const int& j,
const int& k,
const int& m,
430 return ((-f(i + 2, j, k + 2, m) + 8.0 * f(i + 2, j, k + 1, m) - 8.0 * f(i + 2, j, k - 1, m) + f(i + 2, j, k - 2, m))
431 - 2 * (-f(i + 1, j, k + 2, m) + 8.0 * f(i + 1, j, k + 1, m) - 8.0 * f(i + 1, j, k - 1, m) + f(i + 1, j, k - 2, m))
432 + 2 * (-f(i - 1, j, k + 2, m) + 8.0 * f(i - 1, j, k + 1, m) - 8.0 * f(i - 1, j, k - 1, m) + f(i - 1, j, k - 2, m))
433 - (-f(i - 2, j, k + 2, m) + 8.0 * f(i - 2, j, k + 1, m) - 8.0 * f(i - 2, j, k - 1, m) + f(i - 2, j, k - 2, m))) /
434 (24.0 * dx[0] * dx[0] * dx[0] * dx[2]);
442 [[nodiscard]] AMREX_FORCE_INLINE
443 static T
D(
const amrex::Array4<const T>& f,
444 const int& i,
const int& j,
const int& k,
const int& m,
447 return (-(-f(i + 2, j + 2, k, m) + 16.0 * f(i + 1, j + 2, k, m) - 30.0 * f(i, j + 2, k, m) + 16.0 * f(i - 1, j + 2, k, m) - f(i - 2, j + 2, k, m))
448 + 16 * (-f(i + 2, j + 1, k, m) + 16.0 * f(i + 1, j + 1, k, m) - 30.0 * f(i, j + 1, k, m) + 16.0 * f(i - 1, j + 1, k, m) - f(i - 2, j + 1, k, m))
449 - 30 * (-f(i + 2, j, k, m) + 16.0 * f(i + 1, j, k, m) - 30.0 * f(i, j, k, m) + 16.0 * f(i - 1, j, k, m) - f(i - 2, j, k, m))
450 + 16 * (-f(i + 2, j - 1, k, m) + 16.0 * f(i + 1, j - 1, k, m) - 30.0 * f(i, j - 1, k, m) + 16.0 * f(i - 1, j - 1, k, m) - f(i - 2, j - 1, k, m))
451 - (-f(i + 2, j - 2, k, m) + 16.0 * f(i + 1, j - 2, k, m) - 30.0 * f(i, j - 2, k, m) + 16.0 * f(i - 1, j - 2, k, m) - f(i - 2, j - 2, k, m))) /
452 (144.0 * dx[0] * dx[0] * dx[1] * dx[1]);
460 [[nodiscard]] AMREX_FORCE_INLINE
461 static T
D(
const amrex::Array4<const T>& f,
462 const int& i,
const int& j,
const int& k,
const int& m,
465 return (-(-f(i, j + 2, k + 2, m) + 16.0 * f(i, j + 2, k + 1, m) - 30.0 * f(i, j + 2, k, m) + 16.0 * f(i, j + 2, k - 1, m) - f(i, j + 2, k - 2, m))
466 + 16 * (-f(i, j + 1, k + 2, m) + 16.0 * f(i, j + 1, k + 1, m) - 30.0 * f(i, j + 1, k, m) + 16.0 * f(i, j + 1, k - 1, m) - f(i, j + 1, k - 2, m))
467 - 30 * (-f(i, j, k + 2, m) + 16.0 * f(i, j, k + 1, m) - 30.0 * f(i, j, k, m) + 16.0 * f(i, j, k - 1, m) - f(i, j, k - 2, m))
468 + 16 * (-f(i, j - 1, k + 2, m) + 16.0 * f(i, j - 1, k + 1, m) - 30.0 * f(i, j - 1, k, m) + 16.0 * f(i, j - 1, k - 1, m) - f(i, j - 1, k - 2, m))
469 - (-f(i, j - 2, k + 2, m) + 16.0 * f(i, j - 2, k + 1, m) - 30.0 * f(i, j - 2, k, m) + 16.0 * f(i, j - 2, k - 1, m) - f(i, j - 2, k - 2, m))) /
470 (144.0 * dx[0] * dx[0] * dx[2] * dx[2]);
477 [[nodiscard]] AMREX_FORCE_INLINE
478 static T
D(
const amrex::Array4<const T>& f,
479 const int& i,
const int& j,
const int& k,
const int& m,
482 return (-(-f(i + 2, j, k + 2, m) + 16.0 * f(i + 2, j, k + 1, m) - 30.0 * f(i + 2, j, k, m) + 16.0 * f(i + 2, j, k - 1, m) - f(i + 2, j, k - 2, m))
483 + 16 * (-f(i + 1, j, k + 2, m) + 16.0 * f(i + 1, j, k + 1, m) - 30.0 * f(i + 1, j, k, m) + 16.0 * f(i + 1, j, k - 1, m) - f(i + 1, j, k - 2, m))
484 - 30 * (-f(i, j, k + 2, m) + 16.0 * f(i, j, k + 1, m) - 30.0 * f(i, j, k, m) + 16.0 * f(i, j, k - 1, m) - f(i, j, k - 2, m))
485 + 16 * (-f(i - 1, j, k + 2, m) + 16.0 * f(i - 1, j, k + 1, m) - 30.0 * f(i - 1, j, k, m) + 16.0 * f(i - 1, j, k - 1, m) - f(i - 1, j, k - 2, m))
486 - (-f(i - 2, j, k + 2, m) + 16.0 * f(i - 2, j, k + 1, m) - 30.0 * f(i - 2, j, k, m) + 16.0 * f(i - 2, j, k - 1, m) - f(i - 2, j, k - 2, m))) /
487 (144.0 * dx[0] * dx[0] * dx[2] * dx[2]);
496 [[nodiscard]] AMREX_FORCE_INLINE
497 static T
D(
const amrex::Array4<const T>& f,
498 const int& i,
const int& j,
const int& k,
const int& m,
501 return (+(f(i + 1, j + 1, k + 1, m) - 2.0 * f(i, j + 1, k + 1, m) + f(i - 1, j + 1, k + 1, m))
502 - (f(i + 1, j - 1, k + 1, m) - 2.0 * f(i, j - 1, k + 1, m) + f(i - 1, j - 1, k + 1, m))
503 - (f(i + 1, j + 1, k - 1, m) - 2.0 * f(i, j + 1, k - 1, m) + f(i - 1, j + 1, k - 1, m))
504 + (f(i + 1, j - 1, k - 1, m) - 2.0 * f(i, j - 1, k - 1, m) + f(i - 1, j - 1, k - 1, m)))
505 / (4.0 * dx[0] * dx[0] * dx[1] * dx[2]);
513 [[nodiscard]] AMREX_FORCE_INLINE
514 static T
D(
const amrex::Array4<const T>& f,
515 const int& i,
const int& j,
const int& k,
const int& m,
518 return (+(f(i + 1, j + 1, k + 1, m) - 2.0 * f(i + 1, j, k + 1, m) + f(i + 1, j - 1, k + 1, m))
519 - (f(i - 1, j + 1, k + 1, m) - 2.0 * f(i - 1, j, k + 1, m) + f(i - 1, j - 1, k + 1, m))
520 - (f(i + 1, j + 1, k - 1, m) - 2.0 * f(i + 1, j, k - 1, m) + f(i + 1, j - 1, k - 1, m))
521 + (f(i - 1, j + 1, k - 1, m) - 2.0 * f(i - 1, j, k - 1, m) + f(i - 1, j - 1, k - 1, m)))
522 / (4.0 * dx[0] * dx[1] * dx[1] * dx[2]);
530 [[nodiscard]] AMREX_FORCE_INLINE
531 static T
D(
const amrex::Array4<const T>& f,
532 const int& i,
const int& j,
const int& k,
const int& m,
535 return (+(f(i + 1, j + 1, k + 1, m) - 2.0 * f(i + 1, j + 1, k, m) + f(i + 1, j + 1, k - 1, m))
536 - (f(i - 1, j + 1, k + 1, m) - 2.0 * f(i - 1, j + 1, k, m) + f(i - 1, j + 1, k - 1, m))
537 - (f(i + 1, j - 1, k + 1, m) - 2.0 * f(i + 1, j - 1, k, m) + f(i + 1, j - 1, k - 1, m))
538 + (f(i - 1, j - 1, k + 1, m) - 2.0 * f(i - 1, j - 1, k, m) + f(i - 1, j - 1, k - 1, m)))
539 / (4.0 * dx[0] * dx[1] * dx[1] * dx[2]);
544[[nodiscard]] AMREX_FORCE_INLINE
547 const int& i,
const int& j,
const int& k,
const int& m,
549 std::array<StencilType, AMREX_SPACEDIM>& stencil =
DefaultType)
553#if AMREX_SPACEDIM > 1
555#if AMREX_SPACEDIM > 2
562[[nodiscard]] AMREX_FORCE_INLINE
565 const int& i,
const int& j,
const int& k,
570#if AMREX_SPACEDIM > 1
572#if AMREX_SPACEDIM > 2
579[[nodiscard]] AMREX_FORCE_INLINE
582 const int& i,
const int& j,
const int& k,
584 std::array<StencilType, AMREX_SPACEDIM>& stencil =
DefaultType)
590 AMREX_D_TERM(ret(0) += (dw(i + 1, j, k)(0, 0) - dw(i - 1, j, k)(0, 0)) / 2. / DX[0];,
591 ret(1) += (dw(i + 1, j, k)(1, 0) - dw(i - 1, j, k)(1, 0)) / 2. / DX[0];,
592 ret(2) += (dw(i + 1, j, k)(2, 0) - dw(i - 1, j, k)(2, 0)) / 2. / DX[0];)
596 AMREX_D_TERM(ret(0) += (dw(i, j, k)(0, 0) - dw(i - 1, j, k)(0, 0)) / DX[0];,
597 ret(1) += (dw(i, j, k)(1, 0) - dw(i - 1, j, k)(1, 0)) / DX[0];,
598 ret(2) += (dw(i, j, k)(2, 0) - dw(i - 1, j, k)(2, 0)) / DX[0];)
602 AMREX_D_TERM(ret(0) += (dw(i + 1, j, k)(0, 0) - dw(i, j, k)(0, 0)) / DX[0];,
603 ret(1) += (dw(i + 1, j, k)(1, 0) - dw(i, j, k)(1, 0)) / DX[0];,
604 ret(2) += (dw(i + 1, j, k)(2, 0) - dw(i, j, k)(2, 0)) / DX[0];)
607#if AMREX_SPACEDIM > 1
610 AMREX_D_TERM(ret(0) += (dw(i, j + 1, k)(0, 1) - dw(i, j - 1, k)(0, 1)) / 2. / DX[1];,
611 ret(1) += (dw(i, j + 1, k)(1, 1) - dw(i, j - 1, k)(1, 1)) / 2. / DX[1];,
612 ret(2) += (dw(i, j + 1, k)(2, 1) - dw(i, j - 1, k)(2, 1)) / 2. / DX[1];)
616 AMREX_D_TERM(ret(0) += (dw(i, j, k)(0, 1) - dw(i, j - 1, k)(0, 1)) / DX[1];,
617 ret(1) += (dw(i, j, k)(1, 1) - dw(i, j - 1, k)(1, 1)) / DX[1];,
618 ret(2) += (dw(i, j, k)(2, 1) - dw(i, j - 1, k)(2, 1)) / DX[1];)
622 AMREX_D_TERM(ret(0) += (dw(i, j + 1, k)(0, 1) - dw(i, j, k)(0, 1)) / DX[1];,
623 ret(1) += (dw(i, j + 1, k)(1, 1) - dw(i, j, k)(1, 1)) / DX[1];,
624 ret(2) += (dw(i, j + 1, k)(2, 1) - dw(i, j, k)(2, 1)) / DX[1];)
627#if AMREX_SPACEDIM > 2
630 AMREX_D_TERM(ret(0) += (dw(i, j, k + 1)(0, 2) - dw(i, j, k - 1)(0, 2)) / 2. / DX[2];,
631 ret(1) += (dw(i, j, k + 1)(1, 2) - dw(i, j, k - 1)(1, 2)) / 2. / DX[2];,
632 ret(2) += (dw(i, j, k + 1)(2, 2) - dw(i, j, k - 1)(2, 2)) / 2. / DX[2];)
636 AMREX_D_TERM(ret(0) += (dw(i, j, k)(0, 2) - dw(i, j, k - 1)(0, 2)) / DX[2];,
637 ret(1) += (dw(i, j, k)(1, 2) - dw(i, j, k - 1)(1, 2)) / DX[2];,
638 ret(2) += (dw(i, j, k)(2, 2) - dw(i, j, k - 1)(2, 2)) / DX[2];)
642 AMREX_D_TERM(ret(0) += (dw(i, j, k + 1)(0, 2) - dw(i, j, k)(0, 2)) / DX[2];,
643 ret(1) += (dw(i, j, k + 1)(1, 2) - dw(i, j, k)(1, 2)) / DX[2];,
644 ret(2) += (dw(i, j, k + 1)(2, 2) - dw(i, j, k)(2, 2)) / DX[2];)
651[[nodiscard]] AMREX_FORCE_INLINE
654 const int &i,
const int &j,
const int &k,
const int &m,
656 std::array<StencilType,AMREX_SPACEDIM> stencil =
DefaultType)
660#if AMREX_SPACEDIM > 1
663#if AMREX_SPACEDIM > 2
670[[nodiscard]] AMREX_FORCE_INLINE
673 const int& i,
const int& j,
const int& k,
const int& m,
675 std::array<StencilType, AMREX_SPACEDIM> stencil =
DefaultType)
679#if AMREX_SPACEDIM > 1
681#if AMREX_SPACEDIM > 2
688[[nodiscard]] AMREX_FORCE_INLINE
691 const int& i,
const int& j,
const int& k,
const int& m,
695#if AMREX_SPACEDIM == 1
696 ret(0) = (f(i, j, k, m) - f(i - 1, j, k, m)) / dx[0];
697#elif AMREX_SPACEDIM == 2
698 ret(0) = 0.5 * (f(i, j, k, m) - f(i - 1, j, k, m) + f(i, j - 1, k, m) - f(i - 1, j - 1, k, m)) / dx[0];
699 ret(1) = 0.5 * (f(i, j, k, m) - f(i, j - 1, k, m) + f(i - 1, j, k, m) - f(i - 1, j - 1, k, m)) / dx[1];
700#elif AMREX_SPACEDIM == 3
701 ret(0) = 0.25 * (f(i, j, k, m) - f(i - 1, j, k, m) + f(i, j - 1, k, m) - f(i - 1, j - 1, k, m) + f(i, j, k - 1, m) - f(i - 1, j, k - 1, m) + f(i, j - 1, k - 1, m) - f(i - 1, j - 1, k - 1, m)) / dx[0];
702 ret(1) = 0.25 * (f(i, j, k, m) - f(i, j - 1, k, m) + f(i - 1, j, k, m) - f(i - 1, j - 1, k, m) + f(i, j, k - 1, m) - f(i, j - 1, k - 1, m) + f(i - 1, j, k - 1, m) - f(i - 1, j - 1, k - 1, m)) / dx[1];
703 ret(2) = 0.25 * (f(i, j, k, m) - f(i, j, k - 1, m) + f(i - 1, j, k, m) - f(i - 1, j, k - 1, m) + f(i, j - 1, k, m) - f(i, j - 1, k - 1, m) + f(i - 1, j - 1, k, m) - f(i - 1, j - 1, k - 1, m)) / dx[2];
710[[nodiscard]] AMREX_FORCE_INLINE
711std::array<T, AMREX_SPACEDIM>
713 const int& i,
const int& j,
const int& k,
const int& m,
716 std::array<T, AMREX_SPACEDIM> ret;
718#if AMREX_SPACEDIM == 1
719 ret[0] = (f(i, j, k, m) - f(i - 1, j, k, m)) / dx[0];
720#elif AMREX_SPACEDIM == 2
721 ret[0] = (f(i, j, k, m) - f(i - 1, j, k, m) + f(i, j - 1, k, m) - f(i - 1, j - 1, k, m)) * 0.5 / dx[0];
722 ret[1] = (f(i, j, k, m) - f(i, j - 1, k, m) + f(i - 1, j, k, m) - f(i - 1, j - 1, k, m)) * 0.5 / dx[1];
723#elif AMREX_SPACEDIM == 3
724 ret[0] = (f(i, j, k, m) - f(i - 1, j, k, m) + f(i, j - 1, k, m) - f(i - 1, j - 1, k, m) + f(i, j, k - 1, m) - f(i - 1, j, k - 1, m) + f(i, j - 1, k - 1, m) - f(i - 1, j - 1, k - 1, m)) * 0.25 / dx[0];
725 ret[1] = (f(i, j, k, m) - f(i, j - 1, k, m) + f(i - 1, j, k, m) - f(i - 1, j - 1, k, m) + f(i, j, k - 1, m) - f(i, j - 1, k - 1, m) + f(i - 1, j, k - 1, m) - f(i - 1, j - 1, k - 1, m)) * 0.25 / dx[1];
726 ret[2] = (f(i, j, k, m) - f(i, j, k - 1, m) + f(i - 1, j, k, m) - f(i - 1, j, k - 1, m) + f(i, j - 1, k, m) - f(i, j - 1, k - 1, m) + f(i - 1, j - 1, k, m) - f(i - 1, j - 1, k - 1, m)) * 0.25 / dx[2];
733[[nodiscard]] AMREX_FORCE_INLINE
736 const int& i,
const int& j,
const int& k,
738 std::array<StencilType, AMREX_SPACEDIM> stencil =
DefaultType)
741 ret(0, 0) = (
Numeric::Stencil<Set::Scalar, 1, 0, 0>::D(f, i, j, k, 0, dx, stencil));
742#if AMREX_SPACEDIM > 1
743 ret(0, 1) = (
Numeric::Stencil<Set::Scalar, 0, 1, 0>::D(f, i, j, k, 0, dx, stencil));
744 ret(1, 0) = (
Numeric::Stencil<Set::Scalar, 1, 0, 0>::D(f, i, j, k, 1, dx, stencil));
745 ret(1, 1) = (
Numeric::Stencil<Set::Scalar, 0, 1, 0>::D(f, i, j, k, 1, dx, stencil));
746#if AMREX_SPACEDIM > 2
747 ret(0, 2) = (
Numeric::Stencil<Set::Scalar, 0, 0, 1>::D(f, i, j, k, 0, dx, stencil));
748 ret(2, 0) = (
Numeric::Stencil<Set::Scalar, 1, 0, 0>::D(f, i, j, k, 2, dx, stencil));
749 ret(1, 2) = (
Numeric::Stencil<Set::Scalar, 0, 0, 1>::D(f, i, j, k, 1, dx, stencil));
750 ret(2, 1) = (
Numeric::Stencil<Set::Scalar, 0, 1, 0>::D(f, i, j, k, 2, dx, stencil));
751 ret(2, 2) = (
Numeric::Stencil<Set::Scalar, 0, 0, 1>::D(f, i, j, k, 2, dx, stencil));
757[[nodiscard]] AMREX_FORCE_INLINE
760 const int& i,
const int& j,
const int& k,
762 std::array<StencilType, AMREX_SPACEDIM> stencil =
DefaultType)
766#if AMREX_SPACEDIM > 0
769#if AMREX_SPACEDIM > 1
772#if AMREX_SPACEDIM > 2
779[[nodiscard]] AMREX_FORCE_INLINE
780std::pair<Set::Vector,Set::Matrix>
782 const int& i,
const int& j,
const int& k,
784 std::array<StencilType, AMREX_SPACEDIM> stencil =
DefaultType)
789 std::pair<Set::Scalar,Set::Vector> ret;
790#if AMREX_SPACEDIM > 0
793 offdiag.col(0) = ret.second;
795#if AMREX_SPACEDIM > 1
798 offdiag.col(1) = ret.second;
800#if AMREX_SPACEDIM > 2
803 offdiag.col(2) = ret.second;
805 return std::make_pair(diag,offdiag);
809[[nodiscard]] AMREX_FORCE_INLINE
812 const int& i,
const int& j,
const int& k,
816#if AMREX_SPACEDIM == 1
817 ret.col(0) = (f(i + 1, j, k) - f(i, j, k)) / dx[0];
818#elif AMREX_SPACEDIM == 2
819 ret.col(0) = (f(i + 1, j, k) - f(i, j, k) + f(i + 1, j + 1, k) - f(i, j + 1, k)) * 0.5 / dx[0];
820 ret.col(1) = (f(i, j + 1, k) - f(i, j, k) + f(i + 1, j + 1, k) - f(i + 1, j, k)) * 0.5 / dx[1];
821#elif AMREX_SPACEDIM == 3
822 ret.col(0) = (f(i + 1, j, k) - f(i, j, k) + f(i + 1, j + 1, k) - f(i, j + 1, k) + f(i + 1, j, k + 1) - f(i, j, k + 1) + f(i + 1, j + 1, k + 1) - f(i, j + 1, k + 1)) * 0.25 / dx[0];
823 ret.col(1) = (f(i, j + 1, k) - f(i, j, k) + f(i + 1, j + 1, k) - f(i + 1, j, k) + f(i, j + 1, k + 1) - f(i, j, k + 1) + f(i + 1, j + 1, k + 1) - f(i + 1, j, k + 1)) * 0.25 / dx[1];
824 ret.col(2) = (f(i, j, k + 1) - f(i, j, k) + f(i, j + 1, k + 1) - f(i, j + 1, k) + f(i + 1, j, k + 1) - f(i + 1, j, k) + f(i + 1, j + 1, k + 1) - f(i + 1, j + 1, k)) * 0.25 / dx[2];
829[[nodiscard]] AMREX_FORCE_INLINE
832 const int& i,
const int& j,
const int& k,
const int& m,
836#if AMREX_SPACEDIM == 1
837 ret(0) = (f(i + 1, j, k, m) - f(i, j, k, m)) / dx[0];
838#elif AMREX_SPACEDIM == 2
839 ret(0) = 0.5 * (f(i + 1, j + 1, k, m) - f(i, j + 1, k, m) + f(i + 1, j, k, m) - f(i, j, k, m)) / dx[0];
840 ret(1) = 0.5 * (f(i + 1, j + 1, k, m) - f(i + 1, j, k, m) + f(i, j + 1, k, m) - f(i, j, k, m)) / dx[1];
841#elif AMREX_SPACEDIM == 3
842 ret(0) = 0.25 * (f(i + 1, j + 1, k + 1, m) - f(i, j + 1, k + 1, m) + f(i + 1, j, k + 1, m) - f(i, j, k + 1, m) + f(i + 1, j + 1, k, m) - f(i, j + 1, k, m) + f(i + 1, j, k, m) - f(i, j, k, m)) / dx[0];
843 ret(1) = 0.25 * (f(i + 1, j + 1, k + 1, m) - f(i + 1, j, k + 1, m) + f(i, j + 1, k + 1, m) - f(i, j, k + 1, m) + f(i + 1, j + 1, k, m) - f(i + 1, j, k, m) + f(i, j + 1, k, m) - f(i, j, k, m)) / dx[1];
844 ret(2) = 0.25 * (f(i + 1, j + 1, k + 1, m) - f(i + 1, j + 1, k, m) + f(i, j + 1, k + 1, m) - f(i, j + 1, k, m) + f(i + 1, j, k + 1, m) - f(i + 1, j, k, m) + f(i, j, k + 1, m) - f(i, j, k, m)) / dx[2];
849[[nodiscard]] AMREX_FORCE_INLINE
852 const int& i,
const int& j,
const int& k,
854 std::array<StencilType, AMREX_SPACEDIM> stencil =
DefaultType)
858#if AMREX_SPACEDIM > 0
861#if AMREX_SPACEDIM > 1
864#if AMREX_SPACEDIM > 2
870[[nodiscard]] AMREX_FORCE_INLINE
873 const int& i,
const int& j,
const int& k,
878#if AMREX_SPACEDIM > 0
879 ret[0] = (f(i+1,j,k) - f(i,j,k)) / dx[0];
881#if AMREX_SPACEDIM > 1
882 ret[1] = (f(i,j+1,k) - f(i,j,k)) / dx[1];
884#if AMREX_SPACEDIM > 2
885 ret[2] = (f(i,j,k+1) - f(i,j,k)) / dx[2];
892[[nodiscard]] AMREX_FORCE_INLINE
895 const int& i,
const int& j,
const int& k,
897 std::array<StencilType, AMREX_SPACEDIM> stencil =
DefaultType)
900#if AMREX_SPACEDIM == 1
901 ret[0](0, 0) = (
Numeric::Stencil<Set::Scalar, 1, 0, 0>::D(f, i, j, k, 0, dx, stencil));
902#elif AMREX_SPACEDIM == 2
903 ret[0](0, 0) = (
Numeric::Stencil<Set::Scalar, 1, 0, 0>::D(f, i, j, k, 0, dx, stencil));
904 ret[0](0, 1) = (
Numeric::Stencil<Set::Scalar, 0, 1, 0>::D(f, i, j, k, 0, dx, stencil));
905 ret[0](1, 0) = (
Numeric::Stencil<Set::Scalar, 1, 0, 0>::D(f, i, j, k, 1, dx, stencil));
906 ret[0](1, 1) = (
Numeric::Stencil<Set::Scalar, 0, 1, 0>::D(f, i, j, k, 1, dx, stencil));
907 ret[1](0, 0) = (
Numeric::Stencil<Set::Scalar, 1, 0, 0>::D(f, i, j, k, 2, dx, stencil));
908 ret[1](0, 1) = (
Numeric::Stencil<Set::Scalar, 0, 1, 0>::D(f, i, j, k, 2, dx, stencil));
909 ret[1](1, 0) = (
Numeric::Stencil<Set::Scalar, 1, 0, 0>::D(f, i, j, k, 3, dx, stencil));
910 ret[1](1, 1) = (
Numeric::Stencil<Set::Scalar, 0, 1, 0>::D(f, i, j, k, 3, dx, stencil));
911#elif AMREX_SPACEDIM == 3
912 ret[0](0, 0) = (
Numeric::Stencil<Set::Scalar, 1, 0, 0>::D(f, i, j, k, 0, dx, stencil));
913 ret[0](1, 0) = (
Numeric::Stencil<Set::Scalar, 1, 0, 0>::D(f, i, j, k, 1, dx, stencil));
914 ret[0](2, 0) = (
Numeric::Stencil<Set::Scalar, 1, 0, 0>::D(f, i, j, k, 2, dx, stencil));
915 ret[1](0, 0) = (
Numeric::Stencil<Set::Scalar, 1, 0, 0>::D(f, i, j, k, 3, dx, stencil));
916 ret[1](1, 0) = (
Numeric::Stencil<Set::Scalar, 1, 0, 0>::D(f, i, j, k, 4, dx, stencil));
917 ret[1](2, 0) = (
Numeric::Stencil<Set::Scalar, 1, 0, 0>::D(f, i, j, k, 5, dx, stencil));
918 ret[2](0, 0) = (
Numeric::Stencil<Set::Scalar, 1, 0, 0>::D(f, i, j, k, 6, dx, stencil));
919 ret[2](1, 0) = (
Numeric::Stencil<Set::Scalar, 1, 0, 0>::D(f, i, j, k, 7, dx, stencil));
920 ret[2](2, 0) = (
Numeric::Stencil<Set::Scalar, 1, 0, 0>::D(f, i, j, k, 8, dx, stencil));
921 ret[0](0, 1) = (
Numeric::Stencil<Set::Scalar, 0, 1, 0>::D(f, i, j, k, 0, dx, stencil));
922 ret[0](1, 1) = (
Numeric::Stencil<Set::Scalar, 0, 1, 0>::D(f, i, j, k, 1, dx, stencil));
923 ret[0](2, 1) = (
Numeric::Stencil<Set::Scalar, 0, 1, 0>::D(f, i, j, k, 2, dx, stencil));
924 ret[1](0, 1) = (
Numeric::Stencil<Set::Scalar, 0, 1, 0>::D(f, i, j, k, 3, dx, stencil));
925 ret[1](1, 1) = (
Numeric::Stencil<Set::Scalar, 0, 1, 0>::D(f, i, j, k, 4, dx, stencil));
926 ret[1](2, 1) = (
Numeric::Stencil<Set::Scalar, 0, 1, 0>::D(f, i, j, k, 5, dx, stencil));
927 ret[2](0, 1) = (
Numeric::Stencil<Set::Scalar, 0, 1, 0>::D(f, i, j, k, 6, dx, stencil));
928 ret[2](1, 1) = (
Numeric::Stencil<Set::Scalar, 0, 1, 0>::D(f, i, j, k, 7, dx, stencil));
929 ret[2](2, 1) = (
Numeric::Stencil<Set::Scalar, 0, 1, 0>::D(f, i, j, k, 8, dx, stencil));
930 ret[0](0, 2) = (
Numeric::Stencil<Set::Scalar, 0, 0, 1>::D(f, i, j, k, 0, dx, stencil));
931 ret[0](1, 2) = (
Numeric::Stencil<Set::Scalar, 0, 0, 1>::D(f, i, j, k, 1, dx, stencil));
932 ret[0](2, 2) = (
Numeric::Stencil<Set::Scalar, 0, 0, 1>::D(f, i, j, k, 2, dx, stencil));
933 ret[1](0, 2) = (
Numeric::Stencil<Set::Scalar, 0, 0, 1>::D(f, i, j, k, 3, dx, stencil));
934 ret[1](1, 2) = (
Numeric::Stencil<Set::Scalar, 0, 0, 1>::D(f, i, j, k, 4, dx, stencil));
935 ret[1](2, 2) = (
Numeric::Stencil<Set::Scalar, 0, 0, 1>::D(f, i, j, k, 5, dx, stencil));
936 ret[2](0, 2) = (
Numeric::Stencil<Set::Scalar, 0, 0, 1>::D(f, i, j, k, 6, dx, stencil));
937 ret[2](1, 2) = (
Numeric::Stencil<Set::Scalar, 0, 0, 1>::D(f, i, j, k, 7, dx, stencil));
938 ret[2](2, 2) = (
Numeric::Stencil<Set::Scalar, 0, 0, 1>::D(f, i, j, k, 8, dx, stencil));
944[[nodiscard]] AMREX_FORCE_INLINE
946Hessian(
const amrex::Array4<const Set::Scalar>& f,
947 const int& i,
const int& j,
const int& k,
const int& m,
949 std::array<StencilType, AMREX_SPACEDIM> stencil =
DefaultType
953 ret(0, 0) = (
Numeric::Stencil<Set::Scalar, 2, 0, 0>::D(f, i, j, k, m, dx, stencil));
954#if AMREX_SPACEDIM > 1
955 ret(1, 1) = (
Numeric::Stencil<Set::Scalar, 0, 2, 0>::D(f, i, j, k, m, dx, stencil));
956 ret(0, 1) = (
Numeric::Stencil<Set::Scalar, 1, 1, 0>::D(f, i, j, k, m, dx, stencil));
957 ret(1, 0) = ret(0, 1);
958#if AMREX_SPACEDIM > 2
959 ret(2, 2) = (
Numeric::Stencil<Set::Scalar, 0, 0, 2>::D(f, i, j, k, m, dx, stencil));
960 ret(1, 2) = (
Numeric::Stencil<Set::Scalar, 0, 1, 1>::D(f, i, j, k, m, dx, stencil));
961 ret(2, 0) = (
Numeric::Stencil<Set::Scalar, 1, 0, 1>::D(f, i, j, k, m, dx, stencil));
962 ret(2, 1) = ret(1, 2);
963 ret(0, 2) = ret(2, 0);
969[[nodiscard]] AMREX_FORCE_INLINE
971Hessian(
const amrex::Array4<const Set::Scalar>& f,
972 const int& i,
const int& j,
const int& k,
974 std::array<StencilType, AMREX_SPACEDIM> stencil =
DefaultType)
979 ret(0, 0, 0) = (
Numeric::Stencil<Set::Scalar, 2, 0, 0>::D(f, i, j, k, 0, DX, stencil));
983 ret(0, 0, 1) = (
Numeric::Stencil<Set::Scalar, 1, 1, 0>::D(f, i, j, k, 0, DX, stencil));
984 ret(0, 1, 0) = ret(0, 0, 1);
985 ret(0, 1, 1) = (
Numeric::Stencil<Set::Scalar, 0, 2, 0>::D(f, i, j, k, 0, DX, stencil));
986 ret(1, 0, 0) = (
Numeric::Stencil<Set::Scalar, 2, 0, 0>::D(f, i, j, k, 1, DX, stencil));
987 ret(1, 0, 1) = (
Numeric::Stencil<Set::Scalar, 1, 1, 0>::D(f, i, j, k, 1, DX, stencil));
988 ret(1, 1, 0) = ret(1, 0, 1);
989 ret(1, 1, 1) = (
Numeric::Stencil<Set::Scalar, 0, 2, 0>::D(f, i, j, k, 1, DX, stencil));
993 ret(0, 2, 2) = (
Numeric::Stencil<Set::Scalar, 0, 0, 2>::D(f, i, j, k, 0, DX, stencil));
994 ret(0, 0, 2) = (
Numeric::Stencil<Set::Scalar, 1, 0, 1>::D(f, i, j, k, 0, DX, stencil));
995 ret(0, 1, 2) = (
Numeric::Stencil<Set::Scalar, 0, 1, 1>::D(f, i, j, k, 0, DX, stencil));
996 ret(0, 2, 0) = ret(0, 0, 2);
997 ret(0, 2, 1) = ret(0, 1, 2);;
998 ret(1, 2, 2) = (
Numeric::Stencil<Set::Scalar, 0, 0, 2>::D(f, i, j, k, 1, DX, stencil));
999 ret(1, 0, 2) = (
Numeric::Stencil<Set::Scalar, 1, 0, 1>::D(f, i, j, k, 1, DX, stencil));
1000 ret(1, 1, 2) = (
Numeric::Stencil<Set::Scalar, 0, 1, 1>::D(f, i, j, k, 1, DX, stencil));
1001 ret(1, 2, 0) = ret(1, 0, 2);
1002 ret(1, 2, 1) = ret(1, 1, 2);;
1003 ret(2, 0, 0) = (
Numeric::Stencil<Set::Scalar, 2, 0, 0>::D(f, i, j, k, 2, DX, stencil));
1004 ret(2, 1, 1) = (
Numeric::Stencil<Set::Scalar, 0, 2, 0>::D(f, i, j, k, 2, DX, stencil));
1005 ret(2, 2, 2) = (
Numeric::Stencil<Set::Scalar, 0, 0, 2>::D(f, i, j, k, 2, DX, stencil));
1006 ret(2, 0, 1) = (
Numeric::Stencil<Set::Scalar, 1, 1, 0>::D(f, i, j, k, 2, DX, stencil));
1007 ret(2, 1, 0) = ret(2, 0, 1);
1008 ret(2, 0, 2) = (
Numeric::Stencil<Set::Scalar, 1, 0, 1>::D(f, i, j, k, 2, DX, stencil));
1009 ret(2, 1, 2) = (
Numeric::Stencil<Set::Scalar, 0, 1, 1>::D(f, i, j, k, 2, DX, stencil));
1010 ret(2, 2, 0) = ret(2, 0, 2);
1011 ret(2, 2, 1) = ret(2, 1, 2);;
1019[[nodiscard]] AMREX_FORCE_INLINE
1022 const int& i,
const int& j,
const int& k,
1024 std::array<StencilType, AMREX_SPACEDIM> stencil =
DefaultType)
1030 ret[0](0, 0) = f_11(0);
1033 ret[1](0, 0) = f_11(1);
1035 ret[0](1, 0) = ret[0](0, 1) = f_12(0);
1036 ret[1](1, 0) = ret[1](0, 1) = f_12(1);
1038 ret[0](1, 1) = f_22(0);
1039 ret[1](1, 1) = f_22(1);
1042 ret[2](0, 0) = f_11(2);
1043 ret[2](1, 0) = ret[2](0, 1) = f_12(2);
1045 ret[0](2, 0) = ret[0](0, 2) = f_13(0);
1046 ret[1](2, 0) = ret[1](0, 2) = f_13(1);
1047 ret[2](2, 0) = ret[2](0, 2) = f_13(2);
1048 ret[2](1, 1) = f_22(2);
1050 ret[0](1, 2) = ret[0](2, 1) = f_23(0);
1051 ret[1](1, 2) = ret[1](2, 1) = f_23(1);
1052 ret[2](1, 2) = ret[2](2, 1) = f_23(2);
1054 ret[0](2, 2) = f_33(0);
1055 ret[1](2, 2) = f_33(1);
1056 ret[2](2, 2) = f_33(2);
1062[[nodiscard]] AMREX_FORCE_INLINE
1065 const int& i,
const int& j,
const int& k)
1068#if AMREX_SPACEDIM == 1
1069 ret(0, 0) = f(i, j, k, 0);
1071#elif AMREX_SPACEDIM == 2
1072 ret(0, 0) = f(i, j, k, 0); ret(0, 1) = f(i, j, k, 1);
1073 ret(1, 0) = f(i, j, k, 2); ret(1, 1) = f(i, j, k, 3);
1075#elif AMREX_SPACEDIM == 3
1076 ret(0, 0) = f(i, j, k, 0); ret(0, 1) = f(i, j, k, 1); ret(0, 2) = f(i, j, k, 2);
1077 ret(1, 0) = f(i, j, k, 3); ret(1, 1) = f(i, j, k, 4); ret(1, 2) = f(i, j, k, 5);
1078 ret(2, 0) = f(i, j, k, 6); ret(2, 1) = f(i, j, k, 7); ret(2, 2) = f(i, j, k, 8);
1084[[nodiscard]] AMREX_FORCE_INLINE
1087 const int& i,
const int& j,
const int& k)
1090#if AMREX_SPACEDIM == 1
1091 ret(0, 0) = f(i, j, k, 0);
1093#elif AMREX_SPACEDIM == 2
1094 ret(0, 0) = f(i, j, k, 0); ret(0, 1) = f(i, j, k, 1);
1095 ret(1, 0) = f(i, j, k, 2); ret(1, 1) = f(i, j, k, 3);
1097#elif AMREX_SPACEDIM == 3
1098 ret(0, 0) = f(i, j, k, 0); ret(0, 1) = f(i, j, k, 1); ret(0, 2) = f(i, j, k, 2);
1099 ret(1, 0) = f(i, j, k, 3); ret(1, 1) = f(i, j, k, 4); ret(1, 2) = f(i, j, k, 5);
1100 ret(2, 0) = f(i, j, k, 6); ret(2, 1) = f(i, j, k, 7); ret(2, 2) = f(i, j, k, 8);
1106[[nodiscard]] AMREX_FORCE_INLINE
1109 const int& i,
const int& j,
const int& k)
1112 ret(0) = f(i, j, k, 0);
1113#if AMREX_SPACEDIM > 1
1114 ret(1) = f(i, j, k, 1);
1115#if AMREX_SPACEDIM > 2
1116 ret(2) = f(i, j, k, 2);
1122[[nodiscard]] AMREX_FORCE_INLINE
1125 const int& i,
const int& j,
const int& k)
1128 ret(0) = f(i, j, k, 0);
1129#if AMREX_SPACEDIM > 1
1130 ret(1) = f(i, j, k, 1);
1131#if AMREX_SPACEDIM > 2
1132 ret(2) = f(i, j, k, 2);
1141 const int& i,
const int& j,
const int& k,
1144#if AMREX_SPACEDIM == 1
1145 f(i, j, k, 0) = matrix(0, 0);
1146#elif AMREX_SPACEDIM == 2
1147 f(i, j, k, 0) = matrix(0, 0); f(i, j, k, 1) = matrix(0, 1);
1148 f(i, j, k, 2) = matrix(1, 0); f(i, j, k, 3) = matrix(1, 1);
1149#elif AMREX_SPACEDIM == 3
1150 f(i, j, k, 0) = matrix(0, 0); f(i, j, k, 1) = matrix(0, 1); f(i, j, k, 2) = matrix(0, 2);
1151 f(i, j, k, 3) = matrix(1, 0); f(i, j, k, 4) = matrix(1, 1); f(i, j, k, 5) = matrix(1, 2);
1152 f(i, j, k, 6) = matrix(2, 0); f(i, j, k, 7) = matrix(2, 1); f(i, j, k, 8) = matrix(2, 2);
1159 const int& i,
const int& j,
const int& k,
1162 f(i, j, k, 0) = vector(0);
1163#if AMREX_SPACEDIM > 1
1164 f(i, j, k, 1) = vector(1);
1165#if AMREX_SPACEDIM > 2
1166 f(i, j, k, 2) = vector(2);
1171template<
int index,
int SYM>
1175 const int,
const int,
const int,
const Set::Scalar[AMREX_SPACEDIM],
1176 std::array<StencilType, AMREX_SPACEDIM> =
DefaultType)
1182[[nodiscard]] AMREX_FORCE_INLINE
1184 const int i,
const int j,
const int k,
const Set::Scalar dx[AMREX_SPACEDIM],
1185 std::array<StencilType, AMREX_SPACEDIM> stencil)
1190 Numeric::Stencil<Set::Matrix4<AMREX_SPACEDIM, Set::Sym::Isotropic>, 1, 0, 0>::D(C, i, j, k, 0, dx, stencil);
1193 Numeric::Stencil<Set::Matrix4<AMREX_SPACEDIM, Set::Sym::Isotropic>, 0, 1, 0>::D(C, i, j, k, 0, dx, stencil);
1197 Numeric::Stencil<Set::Matrix4<AMREX_SPACEDIM, Set::Sym::Isotropic>, 0, 0, 1>::D(C, i, j, k, 0, dx, stencil);
1200 for (
int i = 0; i < AMREX_SPACEDIM; i++)
1201 for (
int k = 0; k < AMREX_SPACEDIM; k++)
1202 for (
int l = 0; l < AMREX_SPACEDIM; l++)
1205 ret(i, k, l) = gradCx(i, 0, k, l);
1207 ret(i, k, l) = gradCy(i, 1, k, l);
1210 ret(i, k, l) = gradCz(i, 2, k, l);
1220[[nodiscard]] AMREX_FORCE_INLINE
1223 const int& i,
const int& j,
const int& k,
const int& m,
1227[[nodiscard]] AMREX_FORCE_INLINE
1230 const int& i,
const int& j,
const int& k,
const int& m,
1235 ret(0, 0, 0, 0) =
Stencil<Set::Scalar, 4, 0, 0>::D(f, i, j, k, m, dx);
1237 ret(0, 0, 0, 1) =
Stencil<Set::Scalar, 3, 1, 0>::D(f, i, j, k, m, dx);
1239 ret(0, 0, 1, 1) =
Stencil<Set::Scalar, 2, 2, 0>::D(f, i, j, k, m, dx);
1241 ret(0, 1, 1, 1) =
Stencil<Set::Scalar, 1, 3, 0>::D(f, i, j, k, m, dx);
1243 ret(1, 1, 1, 1) =
Stencil<Set::Scalar, 0, 4, 0>::D(f, i, j, k, m, dx);
1248[[nodiscard]] AMREX_FORCE_INLINE
1251 const int& i,
const int& j,
const int& k,
const int& m,
1256 ret(0, 0, 0, 0) =
Stencil<Set::Scalar, 4, 0, 0>::D(f, i, j, k, m, dx);
1258 ret(0, 0, 0, 1) =
Stencil<Set::Scalar, 3, 1, 0>::D(f, i, j, k, m, dx);
1260 ret(0, 0, 0, 2) =
Stencil<Set::Scalar, 3, 0, 1>::D(f, i, j, k, m, dx);
1262 ret(0, 0, 1, 1) =
Stencil<Set::Scalar, 2, 2, 0>::D(f, i, j, k, m, dx);
1264 ret(0, 0, 1, 2) =
Stencil<Set::Scalar, 2, 1, 1>::D(f, i, j, k, m, dx);
1266 ret(0, 0, 2, 2) =
Stencil<Set::Scalar, 2, 0, 2>::D(f, i, j, k, m, dx);
1268 ret(0, 1, 1, 1) =
Stencil<Set::Scalar, 1, 3, 0>::D(f, i, j, k, m, dx);
1270 ret(0, 1, 1, 2) =
Stencil<Set::Scalar, 1, 2, 1>::D(f, i, j, k, m, dx);
1272 ret(0, 1, 2, 2) =
Stencil<Set::Scalar, 1, 1, 2>::D(f, i, j, k, m, dx);
1274 ret(0, 2, 2, 2) =
Stencil<Set::Scalar, 1, 0, 3>::D(f, i, j, k, m, dx);
1276 ret(1, 1, 1, 1) =
Stencil<Set::Scalar, 0, 4, 0>::D(f, i, j, k, m, dx);
1278 ret(1, 1, 1, 2) =
Stencil<Set::Scalar, 0, 3, 1>::D(f, i, j, k, m, dx);
1280 ret(1, 1, 2, 2) =
Stencil<Set::Scalar, 0, 2, 2>::D(f, i, j, k, m, dx);
1282 ret(1, 2, 2, 2) =
Stencil<Set::Scalar, 0, 1, 3>::D(f, i, j, k, m, dx);
1284 ret(2, 2, 2, 2) =
Stencil<Set::Scalar, 0, 0, 4>::D(f, i, j, k, m, dx);
1292 [[nodiscard]] AMREX_FORCE_INLINE
1294 const int& i,
const int& j,
const int& k,
const int& m,
1295 std::array<StencilType, AMREX_SPACEDIM> stencil =
DefaultType)
1302 return (AMREX_D_TERM(f(i, j, k, m) + f(i - ilo, j, k, m)
1304 +f(i, j - jlo, k, m) + f(i - ilo, j - jlo, k, m)
1306 +f(i, j, k - klo, m) + f(i - ilo, j, k - klo, m)
1307 + f(i, j - jlo, k - klo, m) + f(i - ilo, j - jlo, k - klo, m)
1311 [[nodiscard]] AMREX_FORCE_INLINE
1313 const int& i,
const int& j,
const int& k,
const int& m,
1314 std::array<StencilType, AMREX_SPACEDIM> stencil =
DefaultType)
1321 return (AMREX_D_TERM(f(i, j, k, m) + f(i - ilo, j, k, m)
1323 +f(i, j - jlo, k, m) + f(i - ilo, j - jlo, k, m)
1325 +f(i, j, k - klo, m) + f(i - ilo, j, k - klo, m)
1326 + f(i, j - jlo, k - klo, m) + f(i - ilo, j - jlo, k - klo, m)
1330 [[nodiscard]] AMREX_FORCE_INLINE
1332 const int& i,
const int& j,
const int& k,
const int& m)
1334 return (AMREX_D_TERM(f(i, j, k, m) + f(i + 1, j, k, m)
1336 +f(i, j + 1, k, m) + f(i + 1, j + 1, k, m)
1338 +f(i, j, k + 1, m) + f(i + 1, j, k + 1, m)
1339 + f(i, j + 1, k + 1, m) + f(i + 1, j + 1, k + 1, m)
1343 [[nodiscard]] AMREX_FORCE_INLINE
1345 const int& i,
const int& j,
const int& k,
const int& m)
1347 return (AMREX_D_TERM(f(i, j, k, m) + f(i + 1, j, k, m)
1349 +f(i, j + 1, k, m) + f(i + 1, j + 1, k, m)
1351 +f(i, j, k + 1, m) + f(i + 1, j, k + 1, m)
1352 + f(i, j + 1, k + 1, m) + f(i + 1, j + 1, k + 1, m)
This namespace contains some numerical tools.
AMREX_FORCE_INLINE Set::Matrix FieldToMatrix(const amrex::Array4< const Set::Scalar > &f, const int &i, const int &j, const int &k)
AMREX_FORCE_INLINE Set::Scalar Laplacian(const amrex::Array4< const Set::Scalar > &f, const int &i, const int &j, const int &k, const int &m, const Set::Scalar dx[AMREX_SPACEDIM], std::array< StencilType, AMREX_SPACEDIM > &stencil=DefaultType)
AMREX_FORCE_INLINE Set::Matrix4< 2, Set::Sym::Full > DoubleHessian< 2 >(const amrex::Array4< const Set::Scalar > &f, const int &i, const int &j, const int &k, const int &m, const Set::Scalar dx[AMREX_SPACEDIM])
AMREX_FORCE_INLINE Set::Matrix3 Divergence< 2, Set::Sym::Isotropic >(const amrex::Array4< const Set::Matrix4< AMREX_SPACEDIM, Set::Sym::Isotropic > > &C, const int i, const int j, const int k, const Set::Scalar dx[AMREX_SPACEDIM], std::array< StencilType, AMREX_SPACEDIM > stencil)
AMREX_FORCE_INLINE void VectorToField(const amrex::Array4< Set::Scalar > &f, const int &i, const int &j, const int &k, Set::Vector vector)
static std::array< StencilType, AMREX_SPACEDIM > DefaultType
AMREX_FORCE_INLINE Set::Matrix4< dim, Set::Sym::Full > DoubleHessian(const amrex::Array4< const Set::Scalar > &f, const int &i, const int &j, const int &k, const int &m, const Set::Scalar dx[AMREX_SPACEDIM])
static std::array< StencilType, AMREX_SPACEDIM > XHi
AMREX_FORCE_INLINE Set::Matrix3 MatrixGradient(const amrex::Array4< const Set::Scalar > &f, const int &i, const int &j, const int &k, const Set::Scalar dx[AMREX_SPACEDIM], std::array< StencilType, AMREX_SPACEDIM > stencil=DefaultType)
static AMREX_FORCE_INLINE std::array< StencilType, AMREX_SPACEDIM > GetStencil(const int i, const int j, const int k, const amrex::Box domain)
AMREX_FORCE_INLINE Set::Matrix NodeGradientOnCell(const amrex::Array4< const Set::Vector > &f, const int &i, const int &j, const int &k, const Set::Scalar dx[AMREX_SPACEDIM])
static std::array< StencilType, AMREX_SPACEDIM > XLo
AMREX_FORCE_INLINE Set::Vector FieldToVector(const amrex::Array4< const Set::Scalar > &f, const int &i, const int &j, const int &k)
AMREX_FORCE_INLINE void MatrixToField(const amrex::Array4< Set::Scalar > &f, const int &i, const int &j, const int &k, Set::Matrix matrix)
AMREX_FORCE_INLINE Set::Vector CellGradientOnNode(const amrex::Array4< const Set::Scalar > &f, const int &i, const int &j, const int &k, const int &m, const Set::Scalar dx[AMREX_SPACEDIM])
AMREX_FORCE_INLINE Set::Matrix Hessian(const amrex::Array4< const Set::Scalar > &f, const int &i, const int &j, const int &k, const int &m, const Set::Scalar dx[AMREX_SPACEDIM], std::array< StencilType, AMREX_SPACEDIM > stencil=DefaultType)
AMREX_FORCE_INLINE Set::Matrix4< 3, Set::Sym::Full > DoubleHessian< 3 >(const amrex::Array4< const Set::Scalar > &f, const int &i, const int &j, const int &k, const int &m, const Set::Scalar dx[AMREX_SPACEDIM])
AMREX_FORCE_INLINE Set::Vector Gradient(const amrex::Array4< const Set::Scalar > &f, const int &i, const int &j, const int &k, const int &m, const Set::Scalar dx[AMREX_SPACEDIM], std::array< StencilType, AMREX_SPACEDIM > stencil=DefaultType)
AMREX_FORCE_INLINE Set::Vector Divergence(const amrex::Array4< const Set::Matrix > &dw, const int &i, const int &j, const int &k, const Set::Scalar DX[AMREX_SPACEDIM], std::array< StencilType, AMREX_SPACEDIM > &stencil=DefaultType)
AMREX_FORCE_INLINE std::pair< Set::Vector, Set::Matrix > GradientSplit(const amrex::Array4< const Set::Vector > &f, const int &i, const int &j, const int &k, const Set::Scalar dx[AMREX_SPACEDIM], std::array< StencilType, AMREX_SPACEDIM > stencil=DefaultType)
Eigen::Matrix< amrex::Real, AMREX_SPACEDIM, 1 > Vector
Eigen::Matrix< amrex::Real, AMREX_SPACEDIM, AMREX_SPACEDIM > Matrix
void Abort(const char *msg)
static constexpr Set::Scalar fac
static AMREX_FORCE_INLINE T CellToNodeAverage(const amrex::Array4< T > &f, const int &i, const int &j, const int &k, const int &m, std::array< StencilType, AMREX_SPACEDIM > stencil=DefaultType)
static AMREX_FORCE_INLINE T NodeToCellAverage(const amrex::Array4< T > &f, const int &i, const int &j, const int &k, const int &m)
static AMREX_FORCE_INLINE T NodeToCellAverage(const amrex::Array4< const T > &f, const int &i, const int &j, const int &k, const int &m)
static AMREX_FORCE_INLINE T CellToNodeAverage(const amrex::Array4< const T > &f, const int &i, const int &j, const int &k, const int &m, std::array< StencilType, AMREX_SPACEDIM > stencil=DefaultType)
static AMREX_FORCE_INLINE std::pair< Set::Scalar, T > Dsplit(const amrex::Array4< const T > &f, const int &i, const int &j, const int &k, const int &m, const Set::Scalar dx[AMREX_SPACEDIM], std::array< StencilType, AMREX_SPACEDIM > stencil=DefaultType)
static AMREX_FORCE_INLINE T D(const amrex::Array4< const T > &f, const int &i, const int &j, const int &k, const int &m, const Set::Scalar dx[AMREX_SPACEDIM], std::array< StencilType, AMREX_SPACEDIM > stencil=DefaultType)
static AMREX_FORCE_INLINE T D(const amrex::Array4< const T > &f, const int &i, const int &j, const int &k, const int &m, const Set::Scalar dx[AMREX_SPACEDIM], std::array< StencilType, AMREX_SPACEDIM > stencil=DefaultType)
static AMREX_FORCE_INLINE T D(const amrex::Array4< const T > &f, const int &i, const int &j, const int &k, const int &m, const Set::Scalar dx[AMREX_SPACEDIM])
static AMREX_FORCE_INLINE T D(const amrex::Array4< const T > &f, const int &i, const int &j, const int &k, const int &m, const Set::Scalar dx[AMREX_SPACEDIM], std::array< StencilType, AMREX_SPACEDIM > stencil=DefaultType)
static AMREX_FORCE_INLINE std::pair< Set::Scalar, T > Dsplit(const amrex::Array4< const T > &f, const int &i, const int &j, const int &k, const int &m, const Set::Scalar dx[AMREX_SPACEDIM], std::array< StencilType, AMREX_SPACEDIM > stencil=DefaultType)
static AMREX_FORCE_INLINE T D(const amrex::Array4< const T > &f, const int &i, const int &j, const int &k, const int &m, const Set::Scalar dx[AMREX_SPACEDIM], std::array< StencilType, AMREX_SPACEDIM > stencil=DefaultType)
static AMREX_FORCE_INLINE T D(const amrex::Array4< const T > &f, const int &i, const int &j, const int &k, const int &m, const Set::Scalar dx[AMREX_SPACEDIM])
static AMREX_FORCE_INLINE T D(const amrex::Array4< const T > &f, const int &i, const int &j, const int &k, const int &m, const Set::Scalar dx[AMREX_SPACEDIM], std::array< StencilType, AMREX_SPACEDIM > stencil=DefaultType)
static AMREX_FORCE_INLINE T D(const amrex::Array4< const T > &f, const int &i, const int &j, const int &k, const int &m, const Set::Scalar dx[AMREX_SPACEDIM])
static AMREX_FORCE_INLINE T D(const amrex::Array4< const T > &f, const int &i, const int &j, const int &k, const int &m, const Set::Scalar dx[AMREX_SPACEDIM])
static AMREX_FORCE_INLINE T D(const amrex::Array4< const T > &f, const int &i, const int &j, const int &k, const int &m, const Set::Scalar dx[AMREX_SPACEDIM])
static AMREX_FORCE_INLINE T D(const amrex::Array4< const T > &f, const int &i, const int &j, const int &k, const int &m, const Set::Scalar dx[AMREX_SPACEDIM], std::array< StencilType, AMREX_SPACEDIM > stencil=DefaultType)
static AMREX_FORCE_INLINE std::pair< Set::Scalar, T > Dsplit(const amrex::Array4< const T > &f, const int &i, const int &j, const int &k, const int &m, const Set::Scalar dx[AMREX_SPACEDIM], std::array< StencilType, AMREX_SPACEDIM > stencil=DefaultType)
static AMREX_FORCE_INLINE T D(const amrex::Array4< const T > &f, const int &i, const int &j, const int &k, const int &m, const Set::Scalar dx[AMREX_SPACEDIM], std::array< StencilType, AMREX_SPACEDIM > stencil=DefaultType)
static AMREX_FORCE_INLINE T D(const amrex::Array4< const T > &f, const int &i, const int &j, const int &k, const int &m, const Set::Scalar dx[AMREX_SPACEDIM])
static AMREX_FORCE_INLINE T D(const amrex::Array4< const T > &f, const int &i, const int &j, const int &k, const int &m, const Set::Scalar dx[AMREX_SPACEDIM], std::array< StencilType, AMREX_SPACEDIM > stencil=DefaultType)
static AMREX_FORCE_INLINE T D(const amrex::Array4< const T > &f, const int &i, const int &j, const int &k, const int &m, const Set::Scalar dx[AMREX_SPACEDIM])
static AMREX_FORCE_INLINE T D(const amrex::Array4< const T > &f, const int &i, const int &j, const int &k, const int &m, const Set::Scalar dx[AMREX_SPACEDIM])
static AMREX_FORCE_INLINE T D(const amrex::Array4< const T > &f, const int &i, const int &j, const int &k, const int &m, const Set::Scalar dx[AMREX_SPACEDIM])
static AMREX_FORCE_INLINE T D(const amrex::Array4< const T > &f, const int &i, const int &j, const int &k, const int &m, const Set::Scalar dx[AMREX_SPACEDIM], std::array< StencilType, AMREX_SPACEDIM > stencil=DefaultType)
static AMREX_FORCE_INLINE T D(const amrex::Array4< const T > &f, const int &i, const int &j, const int &k, const int &m, const Set::Scalar dx[AMREX_SPACEDIM])
static AMREX_FORCE_INLINE T D(const amrex::Array4< const T > &f, const int &i, const int &j, const int &k, const int &m, const Set::Scalar dx[AMREX_SPACEDIM])
static AMREX_FORCE_INLINE T D(const amrex::Array4< const T > &f, const int &i, const int &j, const int &k, const int &m, const Set::Scalar dx[AMREX_SPACEDIM])
static AMREX_FORCE_INLINE T D(const amrex::Array4< const T > &f, const int &i, const int &j, const int &k, const int &m, const Set::Scalar dx[AMREX_SPACEDIM])
static AMREX_FORCE_INLINE T D(const amrex::Array4< const T > &f, const int &i, const int &j, const int &k, const int &m, const Set::Scalar dx[AMREX_SPACEDIM])
static AMREX_FORCE_INLINE T D(const amrex::Array4< const T > &f, const int &i, const int &j, const int &k, const int &m, const Set::Scalar dx[AMREX_SPACEDIM])