1 #ifndef NUMERIC_STENCIL_H_
2 #define NUMERIC_STENCIL_H_
5 #include <AMReX_MultiFab.H>
13 static std::array<StencilType, AMREX_SPACEDIM>
19 std::array<StencilType, AMREX_SPACEDIM>
20 GetStencil(
const int i,
const int j,
const int k,
const amrex::Box domain)
22 (void)i; (void)j; (void)k;
23 std::array<StencilType, AMREX_SPACEDIM> sten;
24 const amrex::Dim3 lo = amrex::lbound(domain), hi = amrex::ubound(domain);
37 template<
class T,
int x,
int y,
int z>
48 [[nodiscard]] AMREX_FORCE_INLINE
49 static T
D(
const amrex::Array4<const T>& f,
50 const int& i,
const int& j,
const int& k,
const int& m,
52 std::array<StencilType, AMREX_SPACEDIM> stencil =
DefaultType)
55 return (f(i, j, k, m) - f(i - 1, j, k, m)) / dx[0];
57 return (f(i + 1, j, k, m) - f(i, j, k, m)) / dx[0];
59 return (f(i + 1, j, k, m) - f(i - 1, j, k, m)) * 0.5 / dx[0];
61 [[nodiscard]] AMREX_FORCE_INLINE
62 static std::pair<Set::Scalar,T>
63 Dsplit(
const amrex::Array4<const T>& f,
64 const int& i,
const int& j,
const int& k,
const int& m,
66 std::array<StencilType, AMREX_SPACEDIM> stencil =
DefaultType)
69 return std::make_pair(
71 -f(i - 1, j, k, m) / dx[0]
74 return std::make_pair(
76 f(i + 1, j, k, m) / dx[0]
79 return std::make_pair(
81 (f(i + 1, j, k, m) - f(i - 1, j, k, m)) * 0.5 / dx[0]
89 [[nodiscard]] AMREX_FORCE_INLINE
90 static T
D(
const amrex::Array4<const T>& f,
91 const int& i,
const int& j,
const int& k,
const int& m,
93 std::array<StencilType, AMREX_SPACEDIM> stencil =
DefaultType)
96 return (f(i, j, k, m) - f(i, j - 1, k, m)) / dx[1];
98 return (f(i, j + 1, k, m) - f(i, j, k, m)) / dx[1];
100 return (f(i, j + 1, k, m) - f(i, j - 1, k, m)) * 0.5 / dx[1];
102 [[nodiscard]] AMREX_FORCE_INLINE
103 static std::pair<Set::Scalar,T>
105 const int& i,
const int& j,
const int& k,
const int& m,
107 std::array<StencilType, AMREX_SPACEDIM> stencil =
DefaultType)
110 return std::make_pair(
112 - f(i, j - 1, k, m) / dx[1]
115 return std::make_pair(
117 f(i, j + 1, k, m) / dx[1]
120 return std::make_pair(
122 (f(i, j + 1, k, m) - f(i, j - 1, k, m)) * 0.5 / dx[1]
130 [[nodiscard]] AMREX_FORCE_INLINE
131 static T
D(
const amrex::Array4<const T>& f,
132 const int& i,
const int& j,
const int& k,
const int& m,
134 std::array<StencilType, AMREX_SPACEDIM> stencil =
DefaultType)
137 return (f(i, j, k, m) - f(i, j, k - 1, m)) / dx[2];
139 return (f(i, j, k + 1, m) - f(i, j, k, m)) / dx[2];
141 return (f(i, j, k + 1, m) - f(i, j, k - 1, m)) * 0.5 / dx[2];
143 [[nodiscard]] AMREX_FORCE_INLINE
144 static std::pair<Set::Scalar, T>
146 const int& i,
const int& j,
const int& k,
const int& m,
148 std::array<StencilType, AMREX_SPACEDIM> stencil =
DefaultType)
151 return std::make_pair(
153 -f(i, j, k - 1, m) / dx[2]
156 return std::make_pair(
158 f(i, j, k + 1, m) / dx[2]
161 return std::make_pair(
163 (f(i, j, k + 1, m) - f(i, j, k - 1, m)) * 0.5 / dx[2]
175 [[nodiscard]] AMREX_FORCE_INLINE
176 static T
D(
const amrex::Array4<const T>& f,
177 const int& i,
const int& j,
const int& k,
const int& m,
179 std::array<StencilType, AMREX_SPACEDIM> stencil =
DefaultType)
182 return (f(i + 1, j, k, m) - 2.0 * f(i, j, k, m) + f(i - 1, j, k, m)) / dx[0] / dx[0];
184 return 0.0 * f(i, j, k, m);
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, j + 1, k, m) - 2.0 * f(i, j, k, m) + f(i, j - 1, k, m)) / dx[1] / dx[1];
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, k + 1, m) - 2.0 * f(i, j, k, m) + f(i, j, k - 1, m)) / dx[2] / dx[2];
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)
229 int ihi = 1, ilo = 1, jhi = 1, jlo = 1;
236 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]);
242 [[nodiscard]] AMREX_FORCE_INLINE
243 static T
D(
const amrex::Array4<const T>& f,
244 const int& i,
const int& j,
const int& k,
const int& m,
246 std::array<StencilType, AMREX_SPACEDIM> stencil =
DefaultType)
248 int khi = 1, klo = 1, ihi = 1, ilo = 1;
255 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]);
261 [[nodiscard]] AMREX_FORCE_INLINE
262 static T
D(
const amrex::Array4<const T>& f,
263 const int& i,
const int& j,
const int& k,
const int& m,
265 std::array<StencilType, AMREX_SPACEDIM> stencil =
DefaultType)
267 int jhi = 1, jlo = 1, khi = 1, klo = 1;
274 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]);
285 [[nodiscard]] AMREX_FORCE_INLINE
286 static T
D(
const amrex::Array4<const T>& f,
287 const int& i,
const int& j,
const int& k,
const int& m,
290 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))) /
291 (dx[0] * dx[0] * dx[0] * dx[0]);
297 [[nodiscard]] AMREX_FORCE_INLINE
298 static T
D(
const amrex::Array4<const T>& f,
299 const int& i,
const int& j,
const int& k,
const int& m,
302 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))) /
303 (dx[1] * dx[1] * dx[1] * dx[1]);
309 [[nodiscard]] AMREX_FORCE_INLINE
310 static T
D(
const amrex::Array4<const T>& f,
311 const int& i,
const int& j,
const int& k,
const int& m,
314 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))) /
315 (dx[2] * dx[2] * dx[2] * dx[2]);
324 [[nodiscard]] AMREX_FORCE_INLINE
325 static T
D(
const amrex::Array4<const T>& f,
326 const int& i,
const int& j,
const int& k,
const int& m,
329 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))
330 - 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))
331 + 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))
332 - (-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))) /
333 (24.0 * dx[0] * dx[0] * dx[0] * dx[1]);
342 [[nodiscard]] AMREX_FORCE_INLINE
343 static T
D(
const amrex::Array4<const T>& f,
344 const int& i,
const int& j,
const int& k,
const int& m,
347 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))
348 - 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))
349 + 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))
350 - (-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))) /
351 (24.0 * dx[0] * dx[1] * dx[1] * dx[1]);
360 [[nodiscard]] AMREX_FORCE_INLINE
361 static T
D(
const amrex::Array4<const T>& f,
362 const int& i,
const int& j,
const int& k,
const int& m,
365 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))
366 - 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))
367 + 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))
368 - (-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))) /
369 (24.0 * dx[1] * dx[1] * dx[1] * dx[2]);
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 + 1, k + 2, m) - 8.0 * f(i, j - 1, k + 2, m) + f(i, j - 2, k + 2, m))
382 - 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))
383 + 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))
384 - (-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))) /
385 (24.0 * dx[1] * dx[2] * dx[2] * 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 + 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))
398 - 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))
399 + 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))
400 - (-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))) /
401 (24.0 * dx[0] * dx[2] * dx[2] * dx[2]);
409 [[nodiscard]] AMREX_FORCE_INLINE
410 static T
D(
const amrex::Array4<const T>& f,
411 const int& i,
const int& j,
const int& k,
const int& m,
414 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))
415 - 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))
416 + 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))
417 - (-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))) /
418 (24.0 * dx[0] * dx[0] * dx[0] * dx[2]);
426 [[nodiscard]] AMREX_FORCE_INLINE
427 static T
D(
const amrex::Array4<const T>& f,
428 const int& i,
const int& j,
const int& k,
const int& m,
431 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))
432 + 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))
433 - 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))
434 + 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))
435 - (-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))) /
436 (144.0 * dx[0] * dx[0] * dx[1] * dx[1]);
444 [[nodiscard]] AMREX_FORCE_INLINE
445 static T
D(
const amrex::Array4<const T>& f,
446 const int& i,
const int& j,
const int& k,
const int& m,
449 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))
450 + 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))
451 - 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))
452 + 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))
453 - (-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))) /
454 (144.0 * dx[0] * dx[0] * dx[2] * dx[2]);
461 [[nodiscard]] AMREX_FORCE_INLINE
462 static T
D(
const amrex::Array4<const T>& f,
463 const int& i,
const int& j,
const int& k,
const int& m,
466 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))
467 + 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))
468 - 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))
469 + 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))
470 - (-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))) /
471 (144.0 * dx[0] * dx[0] * dx[2] * dx[2]);
480 [[nodiscard]] AMREX_FORCE_INLINE
481 static T
D(
const amrex::Array4<const T>& f,
482 const int& i,
const int& j,
const int& k,
const int& m,
485 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))
486 - (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))
487 - (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))
488 + (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)))
489 / (4.0 * dx[0] * dx[0] * dx[1] * dx[2]);
497 [[nodiscard]] AMREX_FORCE_INLINE
498 static T
D(
const amrex::Array4<const T>& f,
499 const int& i,
const int& j,
const int& k,
const int& m,
502 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))
503 - (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))
504 - (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))
505 + (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)))
506 / (4.0 * dx[0] * dx[1] * dx[1] * dx[2]);
514 [[nodiscard]] AMREX_FORCE_INLINE
515 static T
D(
const amrex::Array4<const T>& f,
516 const int& i,
const int& j,
const int& k,
const int& m,
519 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))
520 - (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))
521 - (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))
522 + (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)))
523 / (4.0 * dx[0] * dx[1] * dx[1] * dx[2]);
528 [[nodiscard]] AMREX_FORCE_INLINE
531 const int& i,
const int& j,
const int& k,
const int& m,
536 #if AMREX_SPACEDIM > 1
538 #if AMREX_SPACEDIM > 2
545 [[nodiscard]] AMREX_FORCE_INLINE
548 const int& i,
const int& j,
const int& k,
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,
567 std::array<StencilType, AMREX_SPACEDIM>& stencil =
DefaultType)
573 AMREX_D_TERM(ret(0) += (dw(i + 1, j, k)(0, 0) - dw(i - 1, j, k)(0, 0)) / 2. / DX[0];,
574 ret(1) += (dw(i + 1, j, k)(1, 0) - dw(i - 1, j, k)(1, 0)) / 2. / DX[0];,
575 ret(2) += (dw(i + 1, j, k)(2, 0) - dw(i - 1, j, k)(2, 0)) / 2. / DX[0];)
579 AMREX_D_TERM(ret(0) += (dw(i, j, k)(0, 0) - dw(i - 1, j, k)(0, 0)) / DX[0];,
580 ret(1) += (dw(i, j, k)(1, 0) - dw(i - 1, j, k)(1, 0)) / DX[0];,
581 ret(2) += (dw(i, j, k)(2, 0) - dw(i - 1, j, k)(2, 0)) / DX[0];)
585 AMREX_D_TERM(ret(0) += (dw(i + 1, j, k)(0, 0) - dw(i, j, k)(0, 0)) / DX[0];,
586 ret(1) += (dw(i + 1, j, k)(1, 0) - dw(i, j, k)(1, 0)) / DX[0];,
587 ret(2) += (dw(i + 1, j, k)(2, 0) - dw(i, j, k)(2, 0)) / DX[0];)
590 #if AMREX_SPACEDIM > 1
593 AMREX_D_TERM(ret(0) += (dw(i, j + 1, k)(0, 1) - dw(i, j - 1, k)(0, 1)) / 2. / DX[1];,
594 ret(1) += (dw(i, j + 1, k)(1, 1) - dw(i, j - 1, k)(1, 1)) / 2. / DX[1];,
595 ret(2) += (dw(i, j + 1, k)(2, 1) - dw(i, j - 1, k)(2, 1)) / 2. / DX[1];)
599 AMREX_D_TERM(ret(0) += (dw(i, j, k)(0, 1) - dw(i, j - 1, k)(0, 1)) / DX[1];,
600 ret(1) += (dw(i, j, k)(1, 1) - dw(i, j - 1, k)(1, 1)) / DX[1];,
601 ret(2) += (dw(i, j, k)(2, 1) - dw(i, j - 1, k)(2, 1)) / DX[1];)
605 AMREX_D_TERM(ret(0) += (dw(i, j + 1, k)(0, 1) - dw(i, j, k)(0, 1)) / DX[1];,
606 ret(1) += (dw(i, j + 1, k)(1, 1) - dw(i, j, k)(1, 1)) / DX[1];,
607 ret(2) += (dw(i, j + 1, k)(2, 1) - dw(i, j, k)(2, 1)) / DX[1];)
610 #if AMREX_SPACEDIM > 2
613 AMREX_D_TERM(ret(0) += (dw(i, j, k + 1)(0, 2) - dw(i, j, k - 1)(0, 2)) / 2. / DX[2];,
614 ret(1) += (dw(i, j, k + 1)(1, 2) - dw(i, j, k - 1)(1, 2)) / 2. / DX[2];,
615 ret(2) += (dw(i, j, k + 1)(2, 2) - dw(i, j, k - 1)(2, 2)) / 2. / DX[2];)
619 AMREX_D_TERM(ret(0) += (dw(i, j, k)(0, 2) - dw(i, j, k - 1)(0, 2)) / DX[2];,
620 ret(1) += (dw(i, j, k)(1, 2) - dw(i, j, k - 1)(1, 2)) / DX[2];,
621 ret(2) += (dw(i, j, k)(2, 2) - dw(i, j, k - 1)(2, 2)) / DX[2];)
625 AMREX_D_TERM(ret(0) += (dw(i, j, k + 1)(0, 2) - dw(i, j, k)(0, 2)) / DX[2];,
626 ret(1) += (dw(i, j, k + 1)(1, 2) - dw(i, j, k)(1, 2)) / DX[2];,
627 ret(2) += (dw(i, j, k + 1)(2, 2) - dw(i, j, k)(2, 2)) / DX[2];)
634 [[nodiscard]] AMREX_FORCE_INLINE
637 const int& i,
const int& j,
const int& k,
const int& m,
639 std::array<StencilType, AMREX_SPACEDIM> stencil =
DefaultType)
643 #if AMREX_SPACEDIM > 1
646 #if AMREX_SPACEDIM > 2
653 [[nodiscard]] AMREX_FORCE_INLINE
655 Gradient(
const amrex::Array4<const Set::Scalar>& f,
656 const int& i,
const int& j,
const int& k,
const int& m,
658 std::array<StencilType, AMREX_SPACEDIM> stencil =
DefaultType)
662 #if AMREX_SPACEDIM > 1
664 #if AMREX_SPACEDIM > 2
671 [[nodiscard]] AMREX_FORCE_INLINE
674 const int& i,
const int& j,
const int& k,
const int& m,
678 #if AMREX_SPACEDIM == 1
679 ret(0) = (f(i, j, k, m) - f(i - 1, j, k, m)) / dx[0];
680 #elif AMREX_SPACEDIM == 2
681 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];
682 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];
683 #elif AMREX_SPACEDIM == 3
684 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];
685 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];
686 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];
693 [[nodiscard]] AMREX_FORCE_INLINE
694 std::array<T, AMREX_SPACEDIM>
696 const int& i,
const int& j,
const int& k,
const int& m,
699 std::array<T, AMREX_SPACEDIM> ret;
701 #if AMREX_SPACEDIM == 1
702 ret[0] = (f(i, j, k, m) - f(i - 1, j, k, m)) / dx[0];
703 #elif AMREX_SPACEDIM == 2
704 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];
705 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];
706 #elif AMREX_SPACEDIM == 3
707 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];
708 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];
709 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];
716 [[nodiscard]] AMREX_FORCE_INLINE
718 Gradient(
const amrex::Array4<const Set::Scalar>& f,
719 const int& i,
const int& j,
const int& k,
721 std::array<StencilType, AMREX_SPACEDIM> stencil =
DefaultType)
724 ret(0, 0) = (
Numeric::Stencil<Set::Scalar, 1, 0, 0>::D(f, i, j, k, 0, dx, stencil));
725 #if AMREX_SPACEDIM > 1
726 ret(0, 1) = (
Numeric::Stencil<Set::Scalar, 0, 1, 0>::D(f, i, j, k, 0, dx, stencil));
727 ret(1, 0) = (
Numeric::Stencil<Set::Scalar, 1, 0, 0>::D(f, i, j, k, 1, dx, stencil));
728 ret(1, 1) = (
Numeric::Stencil<Set::Scalar, 0, 1, 0>::D(f, i, j, k, 1, dx, stencil));
729 #if AMREX_SPACEDIM > 2
730 ret(0, 2) = (
Numeric::Stencil<Set::Scalar, 0, 0, 1>::D(f, i, j, k, 0, dx, stencil));
731 ret(2, 0) = (
Numeric::Stencil<Set::Scalar, 1, 0, 0>::D(f, i, j, k, 2, dx, stencil));
732 ret(1, 2) = (
Numeric::Stencil<Set::Scalar, 0, 0, 1>::D(f, i, j, k, 1, dx, stencil));
733 ret(2, 1) = (
Numeric::Stencil<Set::Scalar, 0, 1, 0>::D(f, i, j, k, 2, dx, stencil));
734 ret(2, 2) = (
Numeric::Stencil<Set::Scalar, 0, 0, 1>::D(f, i, j, k, 2, dx, stencil));
740 [[nodiscard]] AMREX_FORCE_INLINE
742 Gradient(
const amrex::Array4<const Set::Vector>& f,
743 const int& i,
const int& j,
const int& k,
745 std::array<StencilType, AMREX_SPACEDIM> stencil =
DefaultType)
749 #if AMREX_SPACEDIM > 0
752 #if AMREX_SPACEDIM > 1
755 #if AMREX_SPACEDIM > 2
762 [[nodiscard]] AMREX_FORCE_INLINE
763 std::pair<Set::Vector,Set::Matrix>
765 const int& i,
const int& j,
const int& k,
767 std::array<StencilType, AMREX_SPACEDIM> stencil =
DefaultType)
772 std::pair<Set::Scalar,Set::Vector> ret;
773 #if AMREX_SPACEDIM > 0
776 offdiag.col(0) = ret.second;
778 #if AMREX_SPACEDIM > 1
781 offdiag.col(1) = ret.second;
783 #if AMREX_SPACEDIM > 2
786 offdiag.col(2) = ret.second;
788 return std::make_pair(diag,offdiag);
792 [[nodiscard]] AMREX_FORCE_INLINE
795 const int& i,
const int& j,
const int& k,
799 #if AMREX_SPACEDIM == 1
800 ret.col(0) = (f(i + 1, j, k) - f(i, j, k)) / dx[0];
801 #elif AMREX_SPACEDIM == 2
802 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];
803 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];
804 #elif AMREX_SPACEDIM == 3
805 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];
806 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];
807 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];
812 [[nodiscard]] AMREX_FORCE_INLINE
814 Gradient(
const amrex::Array4<const Set::Matrix>& f,
815 const int& i,
const int& j,
const int& k,
817 std::array<StencilType, AMREX_SPACEDIM> stencil =
DefaultType)
821 #if AMREX_SPACEDIM > 0
824 #if AMREX_SPACEDIM > 1
827 #if AMREX_SPACEDIM > 2
833 [[nodiscard]] AMREX_FORCE_INLINE
836 const int& i,
const int& j,
const int& k,
841 #if AMREX_SPACEDIM > 0
842 ret[0] = (f(i+1,j,k) - f(i,j,k)) / dx[0];
844 #if AMREX_SPACEDIM > 1
845 ret[1] = (f(i,j+1,k) - f(i,j,k)) / dx[1];
847 #if AMREX_SPACEDIM > 2
848 ret[2] = (f(i,j,k+1) - f(i,j,k)) / dx[2];
855 [[nodiscard]] AMREX_FORCE_INLINE
858 const int& i,
const int& j,
const int& k,
860 std::array<StencilType, AMREX_SPACEDIM> stencil =
DefaultType)
863 #if AMREX_SPACEDIM == 1
864 ret[0](0, 0) = (
Numeric::Stencil<Set::Scalar, 1, 0, 0>::D(f, i, j, k, 0, dx, stencil));
865 #elif AMREX_SPACEDIM == 2
866 ret[0](0, 0) = (
Numeric::Stencil<Set::Scalar, 1, 0, 0>::D(f, i, j, k, 0, dx, stencil));
867 ret[0](0, 1) = (
Numeric::Stencil<Set::Scalar, 0, 1, 0>::D(f, i, j, k, 0, dx, stencil));
868 ret[0](1, 0) = (
Numeric::Stencil<Set::Scalar, 1, 0, 0>::D(f, i, j, k, 1, dx, stencil));
869 ret[0](1, 1) = (
Numeric::Stencil<Set::Scalar, 0, 1, 0>::D(f, i, j, k, 1, dx, stencil));
870 ret[1](0, 0) = (
Numeric::Stencil<Set::Scalar, 1, 0, 0>::D(f, i, j, k, 2, dx, stencil));
871 ret[1](0, 1) = (
Numeric::Stencil<Set::Scalar, 0, 1, 0>::D(f, i, j, k, 2, dx, stencil));
872 ret[1](1, 0) = (
Numeric::Stencil<Set::Scalar, 1, 0, 0>::D(f, i, j, k, 3, dx, stencil));
873 ret[1](1, 1) = (
Numeric::Stencil<Set::Scalar, 0, 1, 0>::D(f, i, j, k, 3, dx, stencil));
874 #elif AMREX_SPACEDIM == 3
875 ret[0](0, 0) = (
Numeric::Stencil<Set::Scalar, 1, 0, 0>::D(f, i, j, k, 0, dx, stencil));
876 ret[0](1, 0) = (
Numeric::Stencil<Set::Scalar, 1, 0, 0>::D(f, i, j, k, 1, dx, stencil));
877 ret[0](2, 0) = (
Numeric::Stencil<Set::Scalar, 1, 0, 0>::D(f, i, j, k, 2, dx, stencil));
878 ret[1](0, 0) = (
Numeric::Stencil<Set::Scalar, 1, 0, 0>::D(f, i, j, k, 3, dx, stencil));
879 ret[1](1, 0) = (
Numeric::Stencil<Set::Scalar, 1, 0, 0>::D(f, i, j, k, 4, dx, stencil));
880 ret[1](2, 0) = (
Numeric::Stencil<Set::Scalar, 1, 0, 0>::D(f, i, j, k, 5, dx, stencil));
881 ret[2](0, 0) = (
Numeric::Stencil<Set::Scalar, 1, 0, 0>::D(f, i, j, k, 6, dx, stencil));
882 ret[2](1, 0) = (
Numeric::Stencil<Set::Scalar, 1, 0, 0>::D(f, i, j, k, 7, dx, stencil));
883 ret[2](2, 0) = (
Numeric::Stencil<Set::Scalar, 1, 0, 0>::D(f, i, j, k, 8, dx, stencil));
884 ret[0](0, 1) = (
Numeric::Stencil<Set::Scalar, 0, 1, 0>::D(f, i, j, k, 0, dx, stencil));
885 ret[0](1, 1) = (
Numeric::Stencil<Set::Scalar, 0, 1, 0>::D(f, i, j, k, 1, dx, stencil));
886 ret[0](2, 1) = (
Numeric::Stencil<Set::Scalar, 0, 1, 0>::D(f, i, j, k, 2, dx, stencil));
887 ret[1](0, 1) = (
Numeric::Stencil<Set::Scalar, 0, 1, 0>::D(f, i, j, k, 3, dx, stencil));
888 ret[1](1, 1) = (
Numeric::Stencil<Set::Scalar, 0, 1, 0>::D(f, i, j, k, 4, dx, stencil));
889 ret[1](2, 1) = (
Numeric::Stencil<Set::Scalar, 0, 1, 0>::D(f, i, j, k, 5, dx, stencil));
890 ret[2](0, 1) = (
Numeric::Stencil<Set::Scalar, 0, 1, 0>::D(f, i, j, k, 6, dx, stencil));
891 ret[2](1, 1) = (
Numeric::Stencil<Set::Scalar, 0, 1, 0>::D(f, i, j, k, 7, dx, stencil));
892 ret[2](2, 1) = (
Numeric::Stencil<Set::Scalar, 0, 1, 0>::D(f, i, j, k, 8, dx, stencil));
893 ret[0](0, 2) = (
Numeric::Stencil<Set::Scalar, 0, 0, 1>::D(f, i, j, k, 0, dx, stencil));
894 ret[0](1, 2) = (
Numeric::Stencil<Set::Scalar, 0, 0, 1>::D(f, i, j, k, 1, dx, stencil));
895 ret[0](2, 2) = (
Numeric::Stencil<Set::Scalar, 0, 0, 1>::D(f, i, j, k, 2, dx, stencil));
896 ret[1](0, 2) = (
Numeric::Stencil<Set::Scalar, 0, 0, 1>::D(f, i, j, k, 3, dx, stencil));
897 ret[1](1, 2) = (
Numeric::Stencil<Set::Scalar, 0, 0, 1>::D(f, i, j, k, 4, dx, stencil));
898 ret[1](2, 2) = (
Numeric::Stencil<Set::Scalar, 0, 0, 1>::D(f, i, j, k, 5, dx, stencil));
899 ret[2](0, 2) = (
Numeric::Stencil<Set::Scalar, 0, 0, 1>::D(f, i, j, k, 6, dx, stencil));
900 ret[2](1, 2) = (
Numeric::Stencil<Set::Scalar, 0, 0, 1>::D(f, i, j, k, 7, dx, stencil));
901 ret[2](2, 2) = (
Numeric::Stencil<Set::Scalar, 0, 0, 1>::D(f, i, j, k, 8, dx, stencil));
907 [[nodiscard]] AMREX_FORCE_INLINE
909 Hessian(
const amrex::Array4<const Set::Scalar>& f,
910 const int& i,
const int& j,
const int& k,
const int& m,
912 std::array<StencilType, AMREX_SPACEDIM> stencil =
DefaultType
916 ret(0, 0) = (
Numeric::Stencil<Set::Scalar, 2, 0, 0>::D(f, i, j, k, m, dx, stencil));
917 #if AMREX_SPACEDIM > 1
918 ret(1, 1) = (
Numeric::Stencil<Set::Scalar, 0, 2, 0>::D(f, i, j, k, m, dx, stencil));
919 ret(0, 1) = (
Numeric::Stencil<Set::Scalar, 1, 1, 0>::D(f, i, j, k, m, dx, stencil));
920 ret(1, 0) = ret(0, 1);
921 #if AMREX_SPACEDIM > 2
922 ret(2, 2) = (
Numeric::Stencil<Set::Scalar, 0, 0, 2>::D(f, i, j, k, m, dx, stencil));
923 ret(1, 2) = (
Numeric::Stencil<Set::Scalar, 0, 1, 1>::D(f, i, j, k, m, dx, stencil));
924 ret(2, 0) = (
Numeric::Stencil<Set::Scalar, 1, 0, 1>::D(f, i, j, k, m, dx, stencil));
925 ret(2, 1) = ret(1, 2);
926 ret(0, 2) = ret(2, 0);
932 [[nodiscard]] AMREX_FORCE_INLINE
934 Hessian(
const amrex::Array4<const Set::Scalar>& f,
935 const int& i,
const int& j,
const int& k,
937 std::array<StencilType, AMREX_SPACEDIM> stencil =
DefaultType)
942 ret(0, 0, 0) = (
Numeric::Stencil<Set::Scalar, 2, 0, 0>::D(f, i, j, k, 0, DX, stencil));
946 ret(0, 0, 1) = (
Numeric::Stencil<Set::Scalar, 1, 1, 0>::D(f, i, j, k, 0, DX, stencil));
947 ret(0, 1, 0) = ret(0, 0, 1);
948 ret(0, 1, 1) = (
Numeric::Stencil<Set::Scalar, 0, 2, 0>::D(f, i, j, k, 0, DX, stencil));
949 ret(1, 0, 0) = (
Numeric::Stencil<Set::Scalar, 2, 0, 0>::D(f, i, j, k, 1, DX, stencil));
950 ret(1, 0, 1) = (
Numeric::Stencil<Set::Scalar, 1, 1, 0>::D(f, i, j, k, 1, DX, stencil));
951 ret(1, 1, 0) = ret(1, 0, 1);
952 ret(1, 1, 1) = (
Numeric::Stencil<Set::Scalar, 0, 2, 0>::D(f, i, j, k, 1, DX, stencil));
956 ret(0, 2, 2) = (
Numeric::Stencil<Set::Scalar, 0, 0, 2>::D(f, i, j, k, 0, DX, stencil));
957 ret(0, 0, 2) = (
Numeric::Stencil<Set::Scalar, 1, 0, 1>::D(f, i, j, k, 0, DX, stencil));
958 ret(0, 1, 2) = (
Numeric::Stencil<Set::Scalar, 0, 1, 1>::D(f, i, j, k, 0, DX, stencil));
959 ret(0, 2, 0) = ret(0, 0, 2);
960 ret(0, 2, 1) = ret(0, 1, 2);;
961 ret(1, 2, 2) = (
Numeric::Stencil<Set::Scalar, 0, 0, 2>::D(f, i, j, k, 1, DX, stencil));
962 ret(1, 0, 2) = (
Numeric::Stencil<Set::Scalar, 1, 0, 1>::D(f, i, j, k, 1, DX, stencil));
963 ret(1, 1, 2) = (
Numeric::Stencil<Set::Scalar, 0, 1, 1>::D(f, i, j, k, 1, DX, stencil));
964 ret(1, 2, 0) = ret(1, 0, 2);
965 ret(1, 2, 1) = ret(1, 1, 2);;
966 ret(2, 0, 0) = (
Numeric::Stencil<Set::Scalar, 2, 0, 0>::D(f, i, j, k, 2, DX, stencil));
967 ret(2, 1, 1) = (
Numeric::Stencil<Set::Scalar, 0, 2, 0>::D(f, i, j, k, 2, DX, stencil));
968 ret(2, 2, 2) = (
Numeric::Stencil<Set::Scalar, 0, 0, 2>::D(f, i, j, k, 2, DX, stencil));
969 ret(2, 0, 1) = (
Numeric::Stencil<Set::Scalar, 1, 1, 0>::D(f, i, j, k, 2, DX, stencil));
970 ret(2, 1, 0) = ret(2, 0, 1);
971 ret(2, 0, 2) = (
Numeric::Stencil<Set::Scalar, 1, 0, 1>::D(f, i, j, k, 2, DX, stencil));
972 ret(2, 1, 2) = (
Numeric::Stencil<Set::Scalar, 0, 1, 1>::D(f, i, j, k, 2, DX, stencil));
973 ret(2, 2, 0) = ret(2, 0, 2);
974 ret(2, 2, 1) = ret(2, 1, 2);;
982 [[nodiscard]] AMREX_FORCE_INLINE
984 Hessian(
const amrex::Array4<const Set::Vector>& f,
985 const int& i,
const int& j,
const int& k,
987 std::array<StencilType, AMREX_SPACEDIM> stencil =
DefaultType)
993 ret[0](0, 0) = f_11(0);
996 ret[1](0, 0) = f_11(1);
998 ret[0](1, 0) = ret[0](0, 1) = f_12(0);
999 ret[1](1, 0) = ret[1](0, 1) = f_12(1);
1001 ret[0](1, 1) = f_22(0);
1002 ret[1](1, 1) = f_22(1);
1004 #if AMREX_SPACEDIM>2
1005 ret[2](0, 0) = f_11(2);
1006 ret[2](1, 0) = ret[2](0, 1) = f_12(2);
1008 ret[0](2, 0) = ret[0](0, 2) = f_13(0);
1009 ret[1](2, 0) = ret[1](0, 2) = f_13(1);
1010 ret[2](2, 0) = ret[2](0, 2) = f_13(2);
1011 ret[2](1, 1) = f_22(2);
1013 ret[0](1, 2) = ret[0](2, 1) = f_23(0);
1014 ret[1](1, 2) = ret[1](2, 1) = f_23(1);
1015 ret[2](1, 2) = ret[2](2, 1) = f_23(2);
1017 ret[0](2, 2) = f_33(0);
1018 ret[1](2, 2) = f_33(1);
1019 ret[2](2, 2) = f_33(2);
1025 [[nodiscard]] AMREX_FORCE_INLINE
1028 const int& i,
const int& j,
const int& k)
1031 #if AMREX_SPACEDIM == 1
1032 ret(0, 0) = f(i, j, k, 0);
1034 #elif AMREX_SPACEDIM == 2
1035 ret(0, 0) = f(i, j, k, 0); ret(0, 1) = f(i, j, k, 1);
1036 ret(1, 0) = f(i, j, k, 2); ret(1, 1) = f(i, j, k, 3);
1038 #elif AMREX_SPACEDIM == 3
1039 ret(0, 0) = f(i, j, k, 0); ret(0, 1) = f(i, j, k, 1); ret(0, 2) = f(i, j, k, 2);
1040 ret(1, 0) = f(i, j, k, 3); ret(1, 1) = f(i, j, k, 4); ret(1, 2) = f(i, j, k, 5);
1041 ret(2, 0) = f(i, j, k, 6); ret(2, 1) = f(i, j, k, 7); ret(2, 2) = f(i, j, k, 8);
1047 [[nodiscard]] AMREX_FORCE_INLINE
1050 const int& i,
const int& j,
const int& k)
1053 #if AMREX_SPACEDIM == 1
1054 ret(0, 0) = f(i, j, k, 0);
1056 #elif AMREX_SPACEDIM == 2
1057 ret(0, 0) = f(i, j, k, 0); ret(0, 1) = f(i, j, k, 1);
1058 ret(1, 0) = f(i, j, k, 2); ret(1, 1) = f(i, j, k, 3);
1060 #elif AMREX_SPACEDIM == 3
1061 ret(0, 0) = f(i, j, k, 0); ret(0, 1) = f(i, j, k, 1); ret(0, 2) = f(i, j, k, 2);
1062 ret(1, 0) = f(i, j, k, 3); ret(1, 1) = f(i, j, k, 4); ret(1, 2) = f(i, j, k, 5);
1063 ret(2, 0) = f(i, j, k, 6); ret(2, 1) = f(i, j, k, 7); ret(2, 2) = f(i, j, k, 8);
1069 [[nodiscard]] AMREX_FORCE_INLINE
1072 const int& i,
const int& j,
const int& k)
1075 ret(0) = f(i, j, k, 0);
1076 #if AMREX_SPACEDIM > 1
1077 ret(1) = f(i, j, k, 1);
1078 #if AMREX_SPACEDIM > 2
1079 ret(2) = f(i, j, k, 2);
1085 [[nodiscard]] AMREX_FORCE_INLINE
1088 const int& i,
const int& j,
const int& k)
1091 ret(0) = f(i, j, k, 0);
1092 #if AMREX_SPACEDIM > 1
1093 ret(1) = f(i, j, k, 1);
1094 #if AMREX_SPACEDIM > 2
1095 ret(2) = f(i, j, k, 2);
1104 const int& i,
const int& j,
const int& k,
1107 #if AMREX_SPACEDIM == 1
1108 f(i, j, k, 0) = matrix(0, 0);
1109 #elif AMREX_SPACEDIM == 2
1110 f(i, j, k, 0) = matrix(0, 0); f(i, j, k, 1) = matrix(0, 1);
1111 f(i, j, k, 2) = matrix(1, 0); f(i, j, k, 3) = matrix(1, 1);
1112 #elif AMREX_SPACEDIM == 3
1113 f(i, j, k, 0) = matrix(0, 0); f(i, j, k, 1) = matrix(0, 1); f(i, j, k, 2) = matrix(0, 2);
1114 f(i, j, k, 3) = matrix(1, 0); f(i, j, k, 4) = matrix(1, 1); f(i, j, k, 5) = matrix(1, 2);
1115 f(i, j, k, 6) = matrix(2, 0); f(i, j, k, 7) = matrix(2, 1); f(i, j, k, 8) = matrix(2, 2);
1122 const int& i,
const int& j,
const int& k,
1125 f(i, j, k, 0) = vector(0);
1126 #if AMREX_SPACEDIM > 1
1127 f(i, j, k, 1) = vector(1);
1128 #if AMREX_SPACEDIM > 2
1129 f(i, j, k, 2) = vector(2);
1134 template<
int index,
int SYM>
1138 const int,
const int,
const int,
const Set::Scalar[AMREX_SPACEDIM],
1139 std::array<StencilType, AMREX_SPACEDIM> =
DefaultType)
1145 [[nodiscard]] AMREX_FORCE_INLINE
1147 const int i,
const int j,
const int k,
const Set::Scalar dx[AMREX_SPACEDIM],
1148 std::array<StencilType, AMREX_SPACEDIM> stencil)
1153 Numeric::Stencil<Set::Matrix4<AMREX_SPACEDIM, Set::Sym::Isotropic>, 1, 0, 0>::D(C, i, j, k, 0, dx, stencil);
1154 #if AMREX_SPACEDIM>1
1156 Numeric::Stencil<Set::Matrix4<AMREX_SPACEDIM, Set::Sym::Isotropic>, 0, 1, 0>::D(C, i, j, k, 0, dx, stencil);
1158 #if AMREX_SPACEDIM>2
1160 Numeric::Stencil<Set::Matrix4<AMREX_SPACEDIM, Set::Sym::Isotropic>, 0, 0, 1>::D(C, i, j, k, 0, dx, stencil);
1163 for (
int i = 0; i < AMREX_SPACEDIM; i++)
1164 for (
int k = 0; k < AMREX_SPACEDIM; k++)
1165 for (
int l = 0; l < AMREX_SPACEDIM; l++)
1168 ret(i, k, l) = gradCx(i, 0, k, l);
1169 #if AMREX_SPACEDIM>1
1170 ret(i, k, l) = gradCy(i, 1, k, l);
1172 #if AMREX_SPACEDIM>2
1173 ret(i, k, l) = gradCz(i, 2, k, l);
1183 [[nodiscard]] AMREX_FORCE_INLINE
1186 const int& i,
const int& j,
const int& k,
const int& m,
1190 [[nodiscard]] AMREX_FORCE_INLINE
1193 const int& i,
const int& j,
const int& k,
const int& m,
1198 ret(0, 0, 0, 0) =
Stencil<Set::Scalar, 4, 0, 0>::D(f, i, j, k, m, dx);
1200 ret(0, 0, 0, 1) =
Stencil<Set::Scalar, 3, 1, 0>::D(f, i, j, k, m, dx);
1202 ret(0, 0, 1, 1) =
Stencil<Set::Scalar, 2, 2, 0>::D(f, i, j, k, m, dx);
1204 ret(0, 1, 1, 1) =
Stencil<Set::Scalar, 1, 3, 0>::D(f, i, j, k, m, dx);
1206 ret(1, 1, 1, 1) =
Stencil<Set::Scalar, 0, 4, 0>::D(f, i, j, k, m, dx);
1211 [[nodiscard]] AMREX_FORCE_INLINE
1214 const int& i,
const int& j,
const int& k,
const int& m,
1219 ret(0, 0, 0, 0) =
Stencil<Set::Scalar, 4, 0, 0>::D(f, i, j, k, m, dx);
1221 ret(0, 0, 0, 1) =
Stencil<Set::Scalar, 3, 1, 0>::D(f, i, j, k, m, dx);
1223 ret(0, 0, 0, 2) =
Stencil<Set::Scalar, 3, 0, 1>::D(f, i, j, k, m, dx);
1225 ret(0, 0, 1, 1) =
Stencil<Set::Scalar, 2, 2, 0>::D(f, i, j, k, m, dx);
1227 ret(0, 0, 1, 2) =
Stencil<Set::Scalar, 2, 1, 1>::D(f, i, j, k, m, dx);
1229 ret(0, 0, 2, 2) =
Stencil<Set::Scalar, 2, 0, 2>::D(f, i, j, k, m, dx);
1231 ret(0, 1, 1, 1) =
Stencil<Set::Scalar, 1, 3, 0>::D(f, i, j, k, m, dx);
1233 ret(0, 1, 1, 2) =
Stencil<Set::Scalar, 1, 2, 1>::D(f, i, j, k, m, dx);
1235 ret(0, 1, 2, 2) =
Stencil<Set::Scalar, 1, 1, 2>::D(f, i, j, k, m, dx);
1237 ret(0, 2, 2, 2) =
Stencil<Set::Scalar, 1, 0, 3>::D(f, i, j, k, m, dx);
1239 ret(1, 1, 1, 1) =
Stencil<Set::Scalar, 0, 4, 0>::D(f, i, j, k, m, dx);
1241 ret(1, 1, 1, 2) =
Stencil<Set::Scalar, 0, 3, 1>::D(f, i, j, k, m, dx);
1243 ret(1, 1, 2, 2) =
Stencil<Set::Scalar, 0, 2, 2>::D(f, i, j, k, m, dx);
1245 ret(1, 2, 2, 2) =
Stencil<Set::Scalar, 0, 1, 3>::D(f, i, j, k, m, dx);
1247 ret(2, 2, 2, 2) =
Stencil<Set::Scalar, 0, 0, 4>::D(f, i, j, k, m, dx);
1255 [[nodiscard]] AMREX_FORCE_INLINE
1257 const int& i,
const int& j,
const int& k,
const int& m,
1258 std::array<StencilType, AMREX_SPACEDIM> stencil =
DefaultType)
1265 return (AMREX_D_TERM(f(i, j, k, m) + f(i - ilo, j, k, m)
1267 +f(i, j - jlo, k, m) + f(i - ilo, j - jlo, k, m)
1269 +f(i, j, k - klo, m) + f(i - ilo, j, k - klo, m)
1270 + f(i, j - jlo, k - klo, m) + f(i - ilo, j - jlo, k - klo, m)
1274 [[nodiscard]] AMREX_FORCE_INLINE
1276 const int& i,
const int& j,
const int& k,
const int& m,
1277 std::array<StencilType, AMREX_SPACEDIM> stencil =
DefaultType)
1284 return (AMREX_D_TERM(f(i, j, k, m) + f(i - ilo, j, k, m)
1286 +f(i, j - jlo, k, m) + f(i - ilo, j - jlo, k, m)
1288 +f(i, j, k - klo, m) + f(i - ilo, j, k - klo, m)
1289 + f(i, j - jlo, k - klo, m) + f(i - ilo, j - jlo, k - klo, m)
1293 [[nodiscard]] AMREX_FORCE_INLINE
1295 const int& i,
const int& j,
const int& k,
const int& m)
1297 return (AMREX_D_TERM(f(i, j, k, m) + f(i + 1, j, k, m)
1299 +f(i, j + 1, k, m) + f(i + 1, j + 1, k, m)
1301 +f(i, j, k + 1, m) + f(i + 1, j, k + 1, m)
1302 + f(i, j + 1, k + 1, m) + f(i + 1, j + 1, k + 1, m)
1306 [[nodiscard]] AMREX_FORCE_INLINE
1308 const int& i,
const int& j,
const int& k,
const int& m)
1310 return (AMREX_D_TERM(f(i, j, k, m) + f(i + 1, j, k, m)
1312 +f(i, j + 1, k, m) + f(i + 1, j + 1, k, m)
1314 +f(i, j, k + 1, m) + f(i + 1, j, k + 1, m)
1315 + f(i, j + 1, k + 1, m) + f(i + 1, j + 1, k + 1, m)