Alamo
Stencil.H
Go to the documentation of this file.
1#ifndef NUMERIC_STENCIL_H_
2#define NUMERIC_STENCIL_H_
3
4#include <AMReX.H>
5#include <AMReX_MultiFab.H>
6#include "Set/Set.H"
7#include "Set/Base.H"
8#include "Set/Matrix3.H"
9#include "Set/Matrix4.H"
10
11#include "Set/Matrix4_Major.H"
15#include "Set/Matrix4_Full.H"
16
17/// \brief This namespace contains some numerical tools
18namespace Numeric
19{
20
22AMREX_GPU_HOST_DEVICE
23AMREX_FORCE_INLINE
24std::array<StencilType, AMREX_SPACEDIM> DefaultType()
25{
26 return {AMREX_D_DECL(
28}
29[[maybe_unused]] static std::array<StencilType, AMREX_SPACEDIM>
31[[maybe_unused]] static std::array<StencilType, AMREX_SPACEDIM>
33#if AMREX_SPACEDIM>1
34[[maybe_unused]] static std::array<StencilType, AMREX_SPACEDIM>
36[[maybe_unused]] static std::array<StencilType, AMREX_SPACEDIM>
38#endif
39#if AMREX_SPACEDIM>2
40[[maybe_unused]] static std::array<StencilType, AMREX_SPACEDIM>
42[[maybe_unused]] static std::array<StencilType, AMREX_SPACEDIM>
44#endif
45
46[[nodiscard]]
47static
48AMREX_GPU_HOST_DEVICE
49AMREX_FORCE_INLINE
50std::array<StencilType, AMREX_SPACEDIM>
51GetStencil(const int i, const int j, const int k, const amrex::Box domain)
52{
53 (void)i; (void)j; (void)k; // Suppress "unused variable" warnings.
54 std::array<StencilType, AMREX_SPACEDIM> sten;
55 const amrex::Dim3 lo = amrex::lbound(domain), hi = amrex::ubound(domain);
56 AMREX_D_TERM(sten[0] = (i == lo.x ? Numeric::StencilType::Hi :
57 i == hi.x ? Numeric::StencilType::Lo :
59 sten[1] = (j == lo.y ? Numeric::StencilType::Hi :
60 j == hi.y ? Numeric::StencilType::Lo :
62 sten[2] = (k == lo.z ? Numeric::StencilType::Hi :
63 k == hi.z ? Numeric::StencilType::Lo :
65 return sten;
66}
67
68template<class T, int x, int y, int z>
69struct Stencil
70{};
71
72//
73// FIRST order derivatives
74//
75
76template<class T>
77struct Stencil<T, 1, 0, 0>
78{
79 [[nodiscard]] AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE
80 static T D(const amrex::Array4<const T>& f,
81 const int& i, const int& j, const int& k, const int& m,
82 const Set::Scalar dx[AMREX_SPACEDIM],
83 std::array<StencilType, AMREX_SPACEDIM> stencil = DefaultType())
84 {
85 if (stencil[0] == StencilType::Lo)
86 return (f(i, j, k, m) - f(i - 1, j, k, m)) / dx[0]; // 1st order stencil
87 else if (stencil[0] == StencilType::Hi)
88 return (f(i + 1, j, k, m) - f(i, j, k, m)) / dx[0]; // 1st order stencil
89 else
90 return (f(i + 1, j, k, m) - f(i - 1, j, k, m)) * 0.5 / dx[0];
91 };
92 [[nodiscard]] AMREX_FORCE_INLINE
93 static std::pair<Set::Scalar,T>
94 Dsplit( const amrex::Array4<const T>& f,
95 const int& i, const int& j, const int& k, const int& m,
96 const Set::Scalar dx[AMREX_SPACEDIM],
97 std::array<StencilType, AMREX_SPACEDIM> stencil = DefaultType())
98 {
99 if (stencil[0] == StencilType::Lo)
100 return std::make_pair(
101 1.0 / dx[0],
102 -f(i - 1, j, k, m) / dx[0]
103 ); // 1st order
104 else if (stencil[0] == StencilType::Hi)
105 return std::make_pair(
106 -1.0 / dx[0],
107 f(i + 1, j, k, m) / dx[0]
108 ); // 1st order
109 else
110 return std::make_pair(
111 0.0,
112 (f(i + 1, j, k, m) - f(i - 1, j, k, m)) * 0.5 / dx[0]
113 );
114 };
115};
116
117template<class T>
118struct Stencil<T, 0, 1, 0>
119{
120 [[nodiscard]] AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE
121 static T D(const amrex::Array4<const T>& f,
122 const int& i, const int& j, const int& k, const int& m,
123 const Set::Scalar dx[AMREX_SPACEDIM],
124 std::array<StencilType, AMREX_SPACEDIM> stencil = DefaultType())
125 {
126 if (stencil[1] == StencilType::Lo)
127 return (f(i, j, k, m) - f(i, j - 1, k, m)) / dx[1];
128 else if (stencil[1] == StencilType::Hi)
129 return (f(i, j + 1, k, m) - f(i, j, k, m)) / dx[1];
130 else
131 return (f(i, j + 1, k, m) - f(i, j - 1, k, m)) * 0.5 / dx[1];
132 };
133 [[nodiscard]] AMREX_FORCE_INLINE
134 static std::pair<Set::Scalar,T>
135 Dsplit(const amrex::Array4<const T>& f,
136 const int& i, const int& j, const int& k, const int& m,
137 const Set::Scalar dx[AMREX_SPACEDIM],
138 std::array<StencilType, AMREX_SPACEDIM> stencil = DefaultType())
139 {
140 if (stencil[1] == StencilType::Lo)
141 return std::make_pair(
142 1.0 / dx[1],
143 - f(i, j - 1, k, m) / dx[1]
144 );
145 else if (stencil[1] == StencilType::Hi)
146 return std::make_pair(
147 - 1.0 / dx[1],
148 f(i, j + 1, k, m) / dx[1]
149 );
150 else
151 return std::make_pair(
152 0.0,
153 (f(i, j + 1, k, m) - f(i, j - 1, k, m)) * 0.5 / dx[1]
154 );
155 };
156};
157
158template<class T>
159struct Stencil<T, 0, 0, 1>
160{
161 [[nodiscard]] AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE
162 static T D(const amrex::Array4<const T>& f,
163 const int& i, const int& j, const int& k, const int& m,
164 const Set::Scalar dx[AMREX_SPACEDIM],
165 std::array<StencilType, AMREX_SPACEDIM> stencil = DefaultType())
166 {
167 if (stencil[2] == StencilType::Lo)
168 return (f(i, j, k, m) - f(i, j, k - 1, m)) / dx[2];
169 else if (stencil[2] == StencilType::Hi)
170 return (f(i, j, k + 1, m) - f(i, j, k, m)) / dx[2];
171 else
172 return (f(i, j, k + 1, m) - f(i, j, k - 1, m)) * 0.5 / dx[2];
173 };
174 [[nodiscard]] AMREX_FORCE_INLINE
175 static std::pair<Set::Scalar, T>
176 Dsplit(const amrex::Array4<const T>& f,
177 const int& i, const int& j, const int& k, const int& m,
178 const Set::Scalar dx[AMREX_SPACEDIM],
179 std::array<StencilType, AMREX_SPACEDIM> stencil = DefaultType())
180 {
181 if (stencil[2] == StencilType::Lo)
182 return std::make_pair(
183 1.0 / dx[2],
184 -f(i, j, k - 1, m) / dx[2]
185 );
186 else if (stencil[2] == StencilType::Hi)
187 return std::make_pair(
188 -1.0 / dx[2],
189 f(i, j, k + 1, m) / dx[2]
190 );
191 else
192 return std::make_pair(
193 0.0,
194 (f(i, j, k + 1, m) - f(i, j, k - 1, m)) * 0.5 / dx[2]
195 );
196 };
197};
198
199//
200// SECOND order derivatives
201//
202
203template<class T>
204struct Stencil<T, 2, 0, 0>
205{
206 [[nodiscard]] AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE
207 static T D(const amrex::Array4<const T>& f,
208 const int& i, const int& j, const int& k, const int& m,
209 const Set::Scalar dx[AMREX_SPACEDIM],
210 std::array<StencilType, AMREX_SPACEDIM> stencil = DefaultType())
211 {
212 if (stencil[0] == StencilType::Central)
213 return (f(i + 1, j, k, m) - 2.0 * f(i, j, k, m) + f(i - 1, j, k, m)) / dx[0] / dx[0];
214 else
215 return 0.0 * f(i, j, k, m); // TODO this is not a great way to do this
216 };
217};
218
219template<class T>
220struct Stencil<T, 0, 2, 0>
221{
222 [[nodiscard]] AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE
223 static T D(const amrex::Array4<const T>& f,
224 const int& i, const int& j, const int& k, const int& m,
225 const Set::Scalar dx[AMREX_SPACEDIM],
226 std::array<StencilType, AMREX_SPACEDIM> stencil = DefaultType())
227 {
228 if (stencil[1] == StencilType::Central)
229 return (f(i, j + 1, k, m) - 2.0 * f(i, j, k, m) + f(i, j - 1, k, m)) / dx[1] / dx[1];
230 else
231 return 0.0 * f(i, j, k, m); // TODO this is not a great way to do this
232 };
233};
234
235template<class T>
236struct Stencil<T, 0, 0, 2>
237{
238 [[nodiscard]] AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE
239 static T D(const amrex::Array4<const T>& f,
240 const int& i, const int& j, const int& k, const int& m,
241 const Set::Scalar dx[AMREX_SPACEDIM],
242 std::array<StencilType, AMREX_SPACEDIM> stencil = DefaultType())
243 {
244 if (stencil[2] == StencilType::Central)
245 return (f(i, j, k + 1, m) - 2.0 * f(i, j, k, m) + f(i, j, k - 1, m)) / dx[2] / dx[2];
246 else
247 return 0.0 * f(i, j, k, m); // TODO this is not a great way to do this
248 };
249};
250
251template<class T>
252struct Stencil<T, 1, 1, 0>
253{
254 [[nodiscard]] AMREX_FORCE_INLINE
255 static T D(const amrex::Array4<const T>& f,
256 const int& i, const int& j, const int& k, const int& m,
257 const Set::Scalar dx[AMREX_SPACEDIM],
258 std::array<StencilType, AMREX_SPACEDIM> stencil = DefaultType())
259 {
260 int ihi = 1, ilo = 1, jhi = 1, jlo = 1;
261 Set::Scalar ifac = 0.5, jfac = 0.5;
262 if (stencil[0] == StencilType::Hi) { ilo = 0; ifac = 1.0; }
263 if (stencil[0] == StencilType::Lo) { ihi = 0; ifac = 1.0; }
264 if (stencil[1] == StencilType::Hi) { jlo = 0; jfac = 1.0; }
265 if (stencil[1] == StencilType::Lo) { jhi = 0; jfac = 1.0; }
266
267 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]);
268 };
269};
270template<class T>
271struct Stencil<T, 1, 0, 1>
272{
273 [[nodiscard]] AMREX_FORCE_INLINE
274 static T D(const amrex::Array4<const T>& f,
275 const int& i, const int& j, const int& k, const int& m,
276 const Set::Scalar dx[AMREX_SPACEDIM],
277 std::array<StencilType, AMREX_SPACEDIM> stencil = DefaultType())
278 {
279 int khi = 1, klo = 1, ihi = 1, ilo = 1;
280 Set::Scalar kfac = 0.5, ifac = 0.5;
281 if (stencil[0] == StencilType::Hi) { ilo = 0; ifac = 1.0; }
282 if (stencil[0] == StencilType::Lo) { ihi = 0; ifac = 1.0; }
283 if (stencil[2] == StencilType::Hi) { klo = 0; kfac = 1.0; }
284 if (stencil[2] == StencilType::Lo) { khi = 0; kfac = 1.0; }
285
286 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]);
287 };
288};
289template<class T>
290struct Stencil<T, 0, 1, 1>
291{
292 [[nodiscard]] AMREX_FORCE_INLINE
293 static T D(const amrex::Array4<const T>& f,
294 const int& i, const int& j, const int& k, const int& m,
295 const Set::Scalar dx[AMREX_SPACEDIM],
296 std::array<StencilType, AMREX_SPACEDIM> stencil = DefaultType())
297 {
298 int jhi = 1, jlo = 1, khi = 1, klo = 1;
299 Set::Scalar jfac = 0.5, kfac = 0.5;
300 if (stencil[1] == StencilType::Hi) { jlo = 0; jfac = 1.0; }
301 if (stencil[1] == StencilType::Lo) { jhi = 0; jfac = 1.0; }
302 if (stencil[2] == StencilType::Hi) { klo = 0; kfac = 1.0; }
303 if (stencil[2] == StencilType::Lo) { khi = 0; kfac = 1.0; }
304
305 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]);
306 };
307};
308
309//
310// FOURTH order derivatives
311//
312
313template<class T>
314struct Stencil<T, 4, 0, 0>
315{
316 [[nodiscard]] AMREX_FORCE_INLINE
317 static T D(const amrex::Array4<const T>& f,
318 const int& i, const int& j, const int& k, const int& m,
319 const Set::Scalar dx[AMREX_SPACEDIM])
320 {
321 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))) /
322 (dx[0] * dx[0] * dx[0] * dx[0]);
323 };
324};
325template<class T>
326struct Stencil<T, 0, 4, 0>
327{
328 [[nodiscard]] AMREX_FORCE_INLINE
329 static T D(const amrex::Array4<const T>& f,
330 const int& i, const int& j, const int& k, const int& m,
331 const Set::Scalar dx[AMREX_SPACEDIM])
332 {
333 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))) /
334 (dx[1] * dx[1] * dx[1] * dx[1]);
335 };
336};
337template<class T>
338struct Stencil<T, 0, 0, 4>
339{
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,
343 const Set::Scalar dx[AMREX_SPACEDIM])
344 {
345 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))) /
346 (dx[2] * dx[2] * dx[2] * dx[2]);
347 };
348};
349
350/// Compute
351/// \f[ \frac{\partial^4}{\partial^3 x_1\partial x_2\f]
352template<class T>
353struct Stencil<T, 3, 1, 0>
354{
355 [[nodiscard]] AMREX_FORCE_INLINE
356 static T D(const amrex::Array4<const T>& f,
357 const int& i, const int& j, const int& k, const int& m,
358 const Set::Scalar dx[AMREX_SPACEDIM])
359 {
360 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))
361 - 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))
362 + 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))
363 - (-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))) /
364 (24.0 * dx[0] * dx[0] * dx[0] * dx[1]);
365 };
366};
367
368/// Compute
369/// \f[ \frac{\partial^4}{\partial^3 x_2\partial x_1\f]
370template<class T>
371struct Stencil<T, 1, 3, 0>
372{
373 [[nodiscard]] AMREX_FORCE_INLINE
374 static T D(const amrex::Array4<const T>& f,
375 const int& i, const int& j, const int& k, const int& m,
376 const Set::Scalar dx[AMREX_SPACEDIM])
377 {
378 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))
379 - 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))
380 + 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))
381 - (-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))) /
382 (24.0 * dx[0] * dx[1] * dx[1] * dx[1]);
383 };
384};
385
386/// Compute
387/// \f[ \frac{\partial^4}{\partial^3 x_2\partial x_3\f]
388template<class T>
389struct Stencil<T, 0, 3, 1>
390{
391 [[nodiscard]] AMREX_FORCE_INLINE
392 static T D(const amrex::Array4<const T>& f,
393 const int& i, const int& j, const int& k, const int& m,
394 const Set::Scalar dx[AMREX_SPACEDIM])
395 {
396 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))
397 - 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))
398 + 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))
399 - (-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))) /
400 (24.0 * dx[1] * dx[1] * dx[1] * dx[2]);
401 };
402};
403/// \brief Compute \f[ \frac{\partial^4}{\partial^3 x_3\partial x_2}\f]
404template<class T>
405struct Stencil<T, 0, 1, 3>
406{
407 [[nodiscard]] AMREX_FORCE_INLINE
408 static T D(const amrex::Array4<const T>& f,
409 const int& i, const int& j, const int& k, const int& m,
410 const Set::Scalar dx[AMREX_SPACEDIM])
411 {
412 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))
413 - 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))
414 + 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))
415 - (-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))) /
416 (24.0 * dx[1] * dx[2] * dx[2] * dx[2]);
417 };
418};
419/// \brief Compute \f[ \frac{\partial^4}{\partial^3 x_3\partial x_1}\f]
420template<class T>
421struct Stencil<T, 1, 0, 3>
422{
423 [[nodiscard]] AMREX_FORCE_INLINE
424 static T D(const amrex::Array4<const T>& f,
425 const int& i, const int& j, const int& k, const int& m,
426 const Set::Scalar dx[AMREX_SPACEDIM])
427 {
428 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))
429 - 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))
430 + 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))
431 - (-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))) /
432 (24.0 * dx[0] * dx[2] * dx[2] * dx[2]);
433
434 };
435};
436/// \brief Compute \f[ \frac{\partial^4}{\partial^3 x_1\partial x_3}\f]
437template<class T>
438struct Stencil<T, 3, 0, 1>
439{
440 [[nodiscard]] AMREX_FORCE_INLINE
441 static T D(const amrex::Array4<const T>& f,
442 const int& i, const int& j, const int& k, const int& m,
443 const Set::Scalar dx[AMREX_SPACEDIM])
444 {
445 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))
446 - 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))
447 + 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))
448 - (-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))) /
449 (24.0 * dx[0] * dx[0] * dx[0] * dx[2]);
450
451 };
452};
453/// \brief Compute \f[ \frac{\partial^4}{\partial^2 x_1\partial^2 x_2}\f]
454template<class T>
455struct Stencil<T, 2, 2, 0>
456{
457 [[nodiscard]] AMREX_FORCE_INLINE
458 static T D(const amrex::Array4<const T>& f,
459 const int& i, const int& j, const int& k, const int& m,
460 const Set::Scalar dx[AMREX_SPACEDIM])
461 {
462 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))
463 + 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))
464 - 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))
465 + 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))
466 - (-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))) /
467 (144.0 * dx[0] * dx[0] * dx[1] * dx[1]);
468 };
469};
470
471/// \brief Compute \f[ \frac{\partial^4}{\partial^2 x_2\partial^2 x_3}\f]
472template<class T>
473struct Stencil<T, 0, 2, 2>
474{
475 [[nodiscard]] AMREX_FORCE_INLINE
476 static T D(const amrex::Array4<const T>& f,
477 const int& i, const int& j, const int& k, const int& m,
478 const Set::Scalar dx[AMREX_SPACEDIM])
479 {
480 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))
481 + 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))
482 - 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))
483 + 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))
484 - (-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))) /
485 (144.0 * dx[0] * dx[0] * dx[2] * dx[2]);
486 };
487};
488/// \brief Compute \f[ \frac{\partial^4}{\partial^2 x_1\partial^2 x_3}\f]
489template<class T>
490struct Stencil<T, 2, 0, 2>
491{
492 [[nodiscard]] AMREX_FORCE_INLINE
493 static T D(const amrex::Array4<const T>& f,
494 const int& i, const int& j, const int& k, const int& m,
495 const Set::Scalar dx[AMREX_SPACEDIM])
496 {
497 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))
498 + 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))
499 - 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))
500 + 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))
501 - (-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))) /
502 (144.0 * dx[0] * dx[0] * dx[2] * dx[2]);
503 };
504};
505
506
507/// \brief Compute \f[ \frac{\partial^4}{\partial^2 x_1\partial x_2\partial x_3}\f]
508template<class T>
509struct Stencil<T, 2, 1, 1>
510{
511 [[nodiscard]] AMREX_FORCE_INLINE
512 static T D(const amrex::Array4<const T>& f,
513 const int& i, const int& j, const int& k, const int& m,
514 const Set::Scalar dx[AMREX_SPACEDIM])
515 {
516 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))
517 - (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))
518 - (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))
519 + (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)))
520 / (4.0 * dx[0] * dx[0] * dx[1] * dx[2]);
521
522 };
523};
524/// \brief Compute \f[ \frac{\partial^4}{\partial x_1\partial^2 x_2\partial x_3}\f]
525template<class T>
526struct Stencil<T, 1, 2, 1>
527{
528 [[nodiscard]] AMREX_FORCE_INLINE
529 static T D(const amrex::Array4<const T>& f,
530 const int& i, const int& j, const int& k, const int& m,
531 const Set::Scalar dx[AMREX_SPACEDIM])
532 {
533 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))
534 - (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))
535 - (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))
536 + (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)))
537 / (4.0 * dx[0] * dx[1] * dx[1] * dx[2]);
538
539 };
540};
541/// \brief Compute \f[ \frac{\partial^4}{\partial x_1\partial x_2\partial^2 x_3}\f]
542template<class T>
543struct Stencil<T, 1, 1, 2>
544{
545 [[nodiscard]] AMREX_FORCE_INLINE
546 static T D(const amrex::Array4<const T>& f,
547 const int& i, const int& j, const int& k, const int& m,
548 const Set::Scalar dx[AMREX_SPACEDIM])
549 {
550 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))
551 - (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))
552 - (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))
553 + (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)))
554 / (4.0 * dx[0] * dx[1] * dx[1] * dx[2]);
555
556 };
557};
558
559[[nodiscard]] AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE
561Laplacian(const amrex::Array4<const Set::Scalar>& f,
562 const int& i, const int& j, const int& k, const int& m,
563 const Set::Scalar dx[AMREX_SPACEDIM],
564 std::array<StencilType, AMREX_SPACEDIM> stencil = DefaultType())
565{
566 Set::Scalar ret = 0.0;
567 ret += (Numeric::Stencil<Set::Scalar, 2, 0, 0>::D(f, i, j, k, m, dx, stencil));
568#if AMREX_SPACEDIM > 1
569 ret += (Numeric::Stencil<Set::Scalar, 0, 2, 0>::D(f, i, j, k, m, dx, stencil));
570#if AMREX_SPACEDIM > 2
571 ret += (Numeric::Stencil<Set::Scalar, 0, 0, 2>::D(f, i, j, k, m, dx, stencil));
572#endif
573#endif
574 return ret;
575}
576
577[[nodiscard]] AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE
579Laplacian(const amrex::Array4<const Set::Vector>& f,
580 const int& i, const int& j, const int& k,
581 const Set::Scalar dx[AMREX_SPACEDIM])
582{
583 Set::Vector ret = Set::Vector::Zero();
584 ret += (Numeric::Stencil<Set::Vector, 2, 0, 0>::D(f, i, j, k, 0, dx));
585#if AMREX_SPACEDIM > 1
586 ret += (Numeric::Stencil<Set::Vector, 0, 2, 0>::D(f, i, j, k, 0, dx));
587#if AMREX_SPACEDIM > 2
588 ret += (Numeric::Stencil<Set::Vector, 0, 0, 2>::D(f, i, j, k, 0, dx));
589#endif
590#endif
591 return ret;
592}
593
594[[nodiscard]] AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE
596Divergence(const amrex::Array4<const Set::Matrix>& dw,
597 const int& i, const int& j, const int& k,
598 const Set::Scalar DX[AMREX_SPACEDIM],
599 std::array<StencilType, AMREX_SPACEDIM> stencil = DefaultType())
600{
601 Set::Vector ret = Set::Vector::Zero();
602
603 if (stencil[0] == StencilType::Central)
604 {
605 AMREX_D_TERM(ret(0) += (dw(i + 1, j, k)(0, 0) - dw(i - 1, j, k)(0, 0)) / 2. / DX[0];,
606 ret(1) += (dw(i + 1, j, k)(1, 0) - dw(i - 1, j, k)(1, 0)) / 2. / DX[0];,
607 ret(2) += (dw(i + 1, j, k)(2, 0) - dw(i - 1, j, k)(2, 0)) / 2. / DX[0];)
608 }
609 else if (stencil[0] == StencilType::Lo)
610 {
611 AMREX_D_TERM(ret(0) += (dw(i, j, k)(0, 0) - dw(i - 1, j, k)(0, 0)) / DX[0];,
612 ret(1) += (dw(i, j, k)(1, 0) - dw(i - 1, j, k)(1, 0)) / DX[0];,
613 ret(2) += (dw(i, j, k)(2, 0) - dw(i - 1, j, k)(2, 0)) / DX[0];)
614 }
615 else if (stencil[0] == StencilType::Hi)
616 {
617 AMREX_D_TERM(ret(0) += (dw(i + 1, j, k)(0, 0) - dw(i, j, k)(0, 0)) / DX[0];,
618 ret(1) += (dw(i + 1, j, k)(1, 0) - dw(i, j, k)(1, 0)) / DX[0];,
619 ret(2) += (dw(i + 1, j, k)(2, 0) - dw(i, j, k)(2, 0)) / DX[0];)
620 }
621
622#if AMREX_SPACEDIM > 1
623 if (stencil[1] == StencilType::Central)
624 {
625 AMREX_D_TERM(ret(0) += (dw(i, j + 1, k)(0, 1) - dw(i, j - 1, k)(0, 1)) / 2. / DX[1];,
626 ret(1) += (dw(i, j + 1, k)(1, 1) - dw(i, j - 1, k)(1, 1)) / 2. / DX[1];,
627 ret(2) += (dw(i, j + 1, k)(2, 1) - dw(i, j - 1, k)(2, 1)) / 2. / DX[1];)
628 }
629 else if (stencil[1] == StencilType::Lo)
630 {
631 AMREX_D_TERM(ret(0) += (dw(i, j, k)(0, 1) - dw(i, j - 1, k)(0, 1)) / DX[1];,
632 ret(1) += (dw(i, j, k)(1, 1) - dw(i, j - 1, k)(1, 1)) / DX[1];,
633 ret(2) += (dw(i, j, k)(2, 1) - dw(i, j - 1, k)(2, 1)) / DX[1];)
634 }
635 else if (stencil[1] == StencilType::Hi)
636 {
637 AMREX_D_TERM(ret(0) += (dw(i, j + 1, k)(0, 1) - dw(i, j, k)(0, 1)) / DX[1];,
638 ret(1) += (dw(i, j + 1, k)(1, 1) - dw(i, j, k)(1, 1)) / DX[1];,
639 ret(2) += (dw(i, j + 1, k)(2, 1) - dw(i, j, k)(2, 1)) / DX[1];)
640 }
641#endif
642#if AMREX_SPACEDIM > 2
643 if (stencil[2] == StencilType::Central)
644 {
645 AMREX_D_TERM(ret(0) += (dw(i, j, k + 1)(0, 2) - dw(i, j, k - 1)(0, 2)) / 2. / DX[2];,
646 ret(1) += (dw(i, j, k + 1)(1, 2) - dw(i, j, k - 1)(1, 2)) / 2. / DX[2];,
647 ret(2) += (dw(i, j, k + 1)(2, 2) - dw(i, j, k - 1)(2, 2)) / 2. / DX[2];)
648 }
649 else if (stencil[2] == StencilType::Lo)
650 {
651 AMREX_D_TERM(ret(0) += (dw(i, j, k)(0, 2) - dw(i, j, k - 1)(0, 2)) / DX[2];,
652 ret(1) += (dw(i, j, k)(1, 2) - dw(i, j, k - 1)(1, 2)) / DX[2];,
653 ret(2) += (dw(i, j, k)(2, 2) - dw(i, j, k - 1)(2, 2)) / DX[2];)
654 }
655 else if (stencil[2] == StencilType::Hi)
656 {
657 AMREX_D_TERM(ret(0) += (dw(i, j, k + 1)(0, 2) - dw(i, j, k)(0, 2)) / DX[2];,
658 ret(1) += (dw(i, j, k + 1)(1, 2) - dw(i, j, k)(1, 2)) / DX[2];,
659 ret(2) += (dw(i, j, k + 1)(2, 2) - dw(i, j, k)(2, 2)) / DX[2];)
660 }
661#endif
662 return ret;
663}
664
665
666[[nodiscard]] AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE
668Divergence(const amrex::Array4<const Set::Scalar> &f,
669 const int &i, const int &j, const int &k, const int &m,
670 const Set::Scalar dx[AMREX_SPACEDIM],
671 std::array<StencilType,AMREX_SPACEDIM> stencil = DefaultType())
672{
673 Set::Scalar ret;
674 ret = (Numeric::Stencil<Set::Scalar, 1, 0, 0>::D(f, i, j, k, m, dx, stencil));
675#if AMREX_SPACEDIM > 1
676 ret += (Numeric::Stencil<Set::Scalar, 0, 1, 0>::D(f, i, j, k, m, dx, stencil));
677#endif
678#if AMREX_SPACEDIM > 2
679 ret += (Numeric::Stencil<Set::Scalar, 0, 0, 1>::D(f, i, j, k, m, dx, stencil));
680#endif
681 return ret;
682}
683
684
685[[nodiscard]] AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE
687Gradient(const amrex::Array4<const Set::Scalar>& f,
688 const int& i, const int& j, const int& k, const int& m,
689 const Set::Scalar dx[AMREX_SPACEDIM],
690 std::array<StencilType, AMREX_SPACEDIM> stencil = DefaultType())
691{
692 Set::Vector ret;
693 ret(0) = (Numeric::Stencil<Set::Scalar, 1, 0, 0>::D(f, i, j, k, m, dx, stencil));
694#if AMREX_SPACEDIM > 1
695 ret(1) = (Numeric::Stencil<Set::Scalar, 0, 1, 0>::D(f, i, j, k, m, dx, stencil));
696#if AMREX_SPACEDIM > 2
697 ret(2) = (Numeric::Stencil<Set::Scalar, 0, 0, 1>::D(f, i, j, k, m, dx, stencil));
698#endif
699#endif
700 return ret;
701}
702
703[[nodiscard]] AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE
705CellGradientOnNode(const amrex::Array4<const Set::Scalar>& f,
706 const int& i, const int& j, const int& k, const int& m,
707 const Set::Scalar dx[AMREX_SPACEDIM])
708{
709 Set::Vector ret;
710#if AMREX_SPACEDIM == 1
711 ret(0) = (f(i, j, k, m) - f(i - 1, j, k, m)) / dx[0];
712#elif AMREX_SPACEDIM == 2
713 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];
714 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];
715#elif AMREX_SPACEDIM == 3
716 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];
717 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];
718 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];
719#endif
720 return ret;
721}
722
723
724template<class T>
725[[nodiscard]] AMREX_FORCE_INLINE
726std::array<T, AMREX_SPACEDIM>
727CellGradientOnNode(const amrex::Array4<const T>& f,
728 const int& i, const int& j, const int& k, const int& m,
729 const Set::Scalar dx[AMREX_SPACEDIM])
730{
731 std::array<T, AMREX_SPACEDIM> ret;
733#if AMREX_SPACEDIM == 1
734 ret[0] = (f(i, j, k, m) - f(i - 1, j, k, m)) / dx[0];
735#elif AMREX_SPACEDIM == 2
736 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];
737 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];
738#elif AMREX_SPACEDIM == 3
739 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];
740 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];
741 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];
742#endif
743 return ret;
744}
745
746
747
748[[nodiscard]] AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE
750Gradient(const amrex::Array4<const Set::Scalar>& f,
751 const int& i, const int& j, const int& k,
752 const Set::Scalar dx[AMREX_SPACEDIM],
753 std::array<StencilType, AMREX_SPACEDIM> stencil = DefaultType())
754{
755 Set::Matrix ret;
756 ret(0, 0) = (Numeric::Stencil<Set::Scalar, 1, 0, 0>::D(f, i, j, k, 0, dx, stencil));
757#if AMREX_SPACEDIM > 1
758 ret(0, 1) = (Numeric::Stencil<Set::Scalar, 0, 1, 0>::D(f, i, j, k, 0, dx, stencil));
759 ret(1, 0) = (Numeric::Stencil<Set::Scalar, 1, 0, 0>::D(f, i, j, k, 1, dx, stencil));
760 ret(1, 1) = (Numeric::Stencil<Set::Scalar, 0, 1, 0>::D(f, i, j, k, 1, dx, stencil));
761#if AMREX_SPACEDIM > 2
762 ret(0, 2) = (Numeric::Stencil<Set::Scalar, 0, 0, 1>::D(f, i, j, k, 0, dx, stencil));
763 ret(2, 0) = (Numeric::Stencil<Set::Scalar, 1, 0, 0>::D(f, i, j, k, 2, dx, stencil));
764 ret(1, 2) = (Numeric::Stencil<Set::Scalar, 0, 0, 1>::D(f, i, j, k, 1, dx, stencil));
765 ret(2, 1) = (Numeric::Stencil<Set::Scalar, 0, 1, 0>::D(f, i, j, k, 2, dx, stencil));
766 ret(2, 2) = (Numeric::Stencil<Set::Scalar, 0, 0, 1>::D(f, i, j, k, 2, dx, stencil));
767#endif
768#endif
769 return ret;
770}
771
772[[nodiscard]] AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE
774Gradient(const amrex::Array4<const Set::Vector>& f,
775 const int& i, const int& j, const int& k,
776 const Set::Scalar dx[AMREX_SPACEDIM],
777 std::array<StencilType, AMREX_SPACEDIM> stencil = DefaultType())
778{
779 Set::Matrix ret;
780
781#if AMREX_SPACEDIM > 0
782 ret.col(0) = Numeric::Stencil<Set::Vector, 1, 0, 0>::D(f, i, j, k, 0, dx, stencil);
783#endif
784#if AMREX_SPACEDIM > 1
785 ret.col(1) = Numeric::Stencil<Set::Vector, 0, 1, 0>::D(f, i, j, k, 0, dx, stencil);
786#endif
787#if AMREX_SPACEDIM > 2
788 ret.col(2) = Numeric::Stencil<Set::Vector, 0, 0, 1>::D(f, i, j, k, 0, dx, stencil);
789#endif
790
791 return ret;
792}
793
794[[nodiscard]] inline
796FaceGradient(const amrex::Array4<const Set::Vector>& f,
797 const int i, const int j, const int k, const int face,
798 const Set::Scalar dx[AMREX_SPACEDIM])
799{
800 Set::Matrix ret = Set::Matrix::Zero();
801 const int ip = i + (face == 0);
802 const int jp = j + (face == 1);
803 const int kp = k + (face == 2);
804 ret.col(face) = (f(ip, jp, kp) - f(i, j, k)) / dx[face];
805 for (int dir = 0; dir < AMREX_SPACEDIM; ++dir)
806 if (dir != face)
807 ret.col(dir) = (
808 f(i + (dir == 0), j + (dir == 1), k + (dir == 2))
809 - f(i - (dir == 0), j - (dir == 1), k - (dir == 2))
810 + f(ip + (dir == 0), jp + (dir == 1), kp + (dir == 2))
811 - f(ip - (dir == 0), jp - (dir == 1), kp - (dir == 2)))
812 / (4.0 * dx[dir]);
813 return ret;
814}
815
816[[nodiscard]] inline
818FaceGradient(const amrex::Array4<const Set::Scalar>& f,
819 const int i, const int j, const int k, const int face,
820 const Set::Scalar dx[AMREX_SPACEDIM])
821{
822 Set::Matrix ret = Set::Matrix::Zero();
823 const int ip = i + (face == 0);
824 const int jp = j + (face == 1);
825 const int kp = k + (face == 2);
826 for (int n = 0; n < AMREX_SPACEDIM; ++n)
827 {
828 ret(n, face) = (f(ip, jp, kp, n) - f(i, j, k, n)) / dx[face];
829 for (int dir = 0; dir < AMREX_SPACEDIM; ++dir)
830 if (dir != face)
831 ret(n, dir) = (
832 f(i + (dir == 0), j + (dir == 1), k + (dir == 2), n)
833 - f(i - (dir == 0), j - (dir == 1), k - (dir == 2), n)
834 + f(ip + (dir == 0), jp + (dir == 1),
835 kp + (dir == 2), n)
836 - f(ip - (dir == 0), jp - (dir == 1),
837 kp - (dir == 2), n))
838 / (4.0 * dx[dir]);
839 }
840 return ret;
841}
842
843[[nodiscard]] AMREX_FORCE_INLINE
844std::pair<Set::Vector,Set::Matrix>
845GradientSplit( const amrex::Array4<const Set::Vector>& f,
846 const int& i, const int& j, const int& k,
847 const Set::Scalar dx[AMREX_SPACEDIM],
848 std::array<StencilType, AMREX_SPACEDIM> stencil = DefaultType())
849{
850 Set::Vector diag;
851 Set::Matrix offdiag;
852
853 std::pair<Set::Scalar,Set::Vector> ret;
854#if AMREX_SPACEDIM > 0
855 ret = Numeric::Stencil<Set::Vector, 1, 0, 0>::Dsplit(f, i, j, k, 0, dx, stencil);
856 diag(0) = ret.first;
857 offdiag.col(0) = ret.second;
858#endif
859#if AMREX_SPACEDIM > 1
860 ret = Numeric::Stencil<Set::Vector, 0, 1, 0>::Dsplit(f, i, j, k, 0, dx, stencil);
861 diag(1) = ret.first;
862 offdiag.col(1) = ret.second;
863#endif
864#if AMREX_SPACEDIM > 2
865 ret = Numeric::Stencil<Set::Vector, 0, 0, 1>::Dsplit(f, i, j, k, 0, dx, stencil);
866 diag(2) = ret.first;
867 offdiag.col(2) = ret.second;
868#endif
869 return std::make_pair(diag,offdiag);
870}
871
872
873[[nodiscard]] AMREX_FORCE_INLINE
875NodeGradientOnCell(const amrex::Array4<const Set::Scalar>& f,
876 const int& i, const int& j, const int& k,
877 const Set::Scalar dx[AMREX_SPACEDIM])
878{
879 Set::Vector ret;
880#if AMREX_SPACEDIM == 1
881 ret(0) = (f(i + 1, j, k) - f(i, j, k)) / dx[0];
882#elif AMREX_SPACEDIM == 2
883 ret(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];
884 ret(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];
885#elif AMREX_SPACEDIM == 3
886 ret(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];
887 ret(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];
888 ret(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];
889#endif
890 return ret;
891}
892
893[[nodiscard]] AMREX_FORCE_INLINE
895NodeGradientOnCell(const amrex::Array4<const Set::Vector>& f,
896 const int& i, const int& j, const int& k,
897 const Set::Scalar dx[AMREX_SPACEDIM])
898{
899 Set::Matrix ret;
900#if AMREX_SPACEDIM == 1
901 ret.col(0) = (f(i + 1, j, k) - f(i, j, k)) / dx[0];
902#elif AMREX_SPACEDIM == 2
903 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];
904 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];
905#elif AMREX_SPACEDIM == 3
906 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];
907 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];
908 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];
909#endif
910 return ret;
911}
912
913[[nodiscard]] AMREX_FORCE_INLINE
915NodeGradientOnCell(const amrex::Array4<const Set::Scalar>& f,
916 const int& i, const int& j, const int& k, const int& m,
917 const Set::Scalar dx[AMREX_SPACEDIM])
918{
919 Set::Vector ret;
920#if AMREX_SPACEDIM == 1
921 ret(0) = (f(i + 1, j, k, m) - f(i, j, k, m)) / dx[0];
922#elif AMREX_SPACEDIM == 2
923 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];
924 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];
925#elif AMREX_SPACEDIM == 3
926 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];
927 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];
928 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];
929#endif
930 return ret;
931}
932
933[[nodiscard]] AMREX_FORCE_INLINE
935Gradient(const amrex::Array4<const Set::Matrix>& f,
936 const int& i, const int& j, const int& k,
937 const Set::Scalar dx[AMREX_SPACEDIM],
938 std::array<StencilType, AMREX_SPACEDIM> stencil = DefaultType())
939{
940 Set::Matrix3 ret;
941
942#if AMREX_SPACEDIM > 0
943 ret[0] = Numeric::Stencil<Set::Matrix, 1, 0, 0>::D(f, i, j, k, 0, dx, stencil);
944#endif
945#if AMREX_SPACEDIM > 1
946 ret[1] = Numeric::Stencil<Set::Matrix, 0, 1, 0>::D(f, i, j, k, 0, dx, stencil);
947#endif
948#if AMREX_SPACEDIM > 2
949 ret[2] = Numeric::Stencil<Set::Matrix, 0, 0, 1>::D(f, i, j, k, 0, dx, stencil);
950#endif
951
952 return ret;
953}
954
955template<class T>
956[[nodiscard]] AMREX_FORCE_INLINE
957std::array<T,AMREX_SPACEDIM>
958Gradient_Diagonal( const Set::Scalar dx[AMREX_SPACEDIM],
959 std::array<StencilType, AMREX_SPACEDIM> stencil = DefaultType());
960
961template<>
962[[nodiscard]] AMREX_FORCE_INLINE
963std::array<Set::Matrix,AMREX_SPACEDIM>
964Gradient_Diagonal( const Set::Scalar dx[AMREX_SPACEDIM],
965 std::array<StencilType, AMREX_SPACEDIM> stencil)
966{
967
968 std::array<Set::Matrix,AMREX_SPACEDIM> gradu;
969 AMREX_D_TERM( bool xmin = stencil[0] == StencilType::Hi;
970 bool xmax = stencil[0] == StencilType::Lo;,
971 bool ymin = stencil[1] == StencilType::Hi;
972 bool ymax = stencil[1] == StencilType::Lo;,
973 bool zmin = stencil[2] == StencilType::Hi;
974 bool zmax = stencil[2] == StencilType::Lo; );
975
976 for (int p = 0; p < AMREX_SPACEDIM; p++)
977 for (int q = 0; q < AMREX_SPACEDIM; q++)
978 {
979 AMREX_D_TERM(
980 gradu[p](q, 0) = ((!xmax ? 0.0 : (p == q ? 1.0 : 0.0)) - (!xmin ? 0.0 : (p == q ? 1.0 : 0.0))) / ((xmin || xmax ? 1.0 : 2.0) * dx[0]);,
981 gradu[p](q, 1) = ((!ymax ? 0.0 : (p == q ? 1.0 : 0.0)) - (!ymin ? 0.0 : (p == q ? 1.0 : 0.0))) / ((ymin || ymax ? 1.0 : 2.0) * dx[1]);,
982 gradu[p](q, 2) = ((!zmax ? 0.0 : (p == q ? 1.0 : 0.0)) - (!zmin ? 0.0 : (p == q ? 1.0 : 0.0))) / ((zmin || zmax ? 1.0 : 2.0) * dx[2]););
983 }
984 return gradu;
985}
986
987template<>
988[[nodiscard]] AMREX_FORCE_INLINE
989std::array<Set::Matrix3,AMREX_SPACEDIM>
990Gradient_Diagonal( const Set::Scalar dx[AMREX_SPACEDIM],
991 std::array<StencilType, AMREX_SPACEDIM> stencil)
992{
993 AMREX_D_TERM( Util::Assert(INFO,TEST(stencil[0]==StencilType::Central));,
996
997 std::array<Set::Matrix3,AMREX_SPACEDIM> gradgradu;
998
999 for (int p = 0; p < AMREX_SPACEDIM; p++)
1000 for (int q = 0; q < AMREX_SPACEDIM; q++)
1001 {
1002
1003 AMREX_D_TERM(
1004 gradgradu[p](q, 0, 0) = (p == q ? -2.0 : 0.0) / dx[0] / dx[0];
1005 ,// 2D
1006 gradgradu[p](q, 0, 1) = 0.0;
1007 gradgradu[p](q, 1, 0) = 0.0;
1008 gradgradu[p](q, 1, 1) = (p == q ? -2.0 : 0.0) / dx[1] / dx[1];
1009 ,// 3D
1010 gradgradu[p](q, 0, 2) = 0.0;
1011 gradgradu[p](q, 1, 2) = 0.0;
1012 gradgradu[p](q, 2, 0) = 0.0;
1013 gradgradu[p](q, 2, 1) = 0.0;
1014 gradgradu[p](q, 2, 2) = (p == q ? -2.0 : 0.0) / dx[2] / dx[2]);
1015 }
1016
1017 return gradgradu;
1018}
1019
1020
1021
1022[[nodiscard]] AMREX_FORCE_INLINE
1024NodeGradientOnCell(const amrex::Array4<const Set::Matrix>& f,
1025 const int& i, const int& j, const int& k,
1026 const Set::Scalar dx[AMREX_SPACEDIM])
1027{
1028 Set::Matrix3 ret;
1029
1030#if AMREX_SPACEDIM > 0
1031 ret[0] = (f(i+1,j,k) - f(i,j,k)) / dx[0];
1032#endif
1033#if AMREX_SPACEDIM > 1
1034 ret[1] = (f(i,j+1,k) - f(i,j,k)) / dx[1];
1035#endif
1036#if AMREX_SPACEDIM > 2
1037 ret[2] = (f(i,j,k+1) - f(i,j,k)) / dx[2];
1038#endif
1039
1040 return ret;
1041}
1042
1043
1044[[nodiscard]] AMREX_FORCE_INLINE
1046MatrixGradient(const amrex::Array4<const Set::Scalar>& f,
1047 const int& i, const int& j, const int& k,
1048 const Set::Scalar dx[AMREX_SPACEDIM],
1049 std::array<StencilType, AMREX_SPACEDIM> stencil = DefaultType())
1050{
1051 Set::Matrix3 ret;
1052#if AMREX_SPACEDIM == 1
1053 ret[0](0, 0) = (Numeric::Stencil<Set::Scalar, 1, 0, 0>::D(f, i, j, k, 0, dx, stencil));
1054#elif AMREX_SPACEDIM == 2
1055 ret[0](0, 0) = (Numeric::Stencil<Set::Scalar, 1, 0, 0>::D(f, i, j, k, 0, dx, stencil));
1056 ret[0](0, 1) = (Numeric::Stencil<Set::Scalar, 0, 1, 0>::D(f, i, j, k, 0, dx, stencil));
1057 ret[0](1, 0) = (Numeric::Stencil<Set::Scalar, 1, 0, 0>::D(f, i, j, k, 1, dx, stencil));
1058 ret[0](1, 1) = (Numeric::Stencil<Set::Scalar, 0, 1, 0>::D(f, i, j, k, 1, dx, stencil));
1059 ret[1](0, 0) = (Numeric::Stencil<Set::Scalar, 1, 0, 0>::D(f, i, j, k, 2, dx, stencil));
1060 ret[1](0, 1) = (Numeric::Stencil<Set::Scalar, 0, 1, 0>::D(f, i, j, k, 2, dx, stencil));
1061 ret[1](1, 0) = (Numeric::Stencil<Set::Scalar, 1, 0, 0>::D(f, i, j, k, 3, dx, stencil));
1062 ret[1](1, 1) = (Numeric::Stencil<Set::Scalar, 0, 1, 0>::D(f, i, j, k, 3, dx, stencil));
1063#elif AMREX_SPACEDIM == 3
1064 ret[0](0, 0) = (Numeric::Stencil<Set::Scalar, 1, 0, 0>::D(f, i, j, k, 0, dx, stencil));
1065 ret[0](1, 0) = (Numeric::Stencil<Set::Scalar, 1, 0, 0>::D(f, i, j, k, 1, dx, stencil));
1066 ret[0](2, 0) = (Numeric::Stencil<Set::Scalar, 1, 0, 0>::D(f, i, j, k, 2, dx, stencil));
1067 ret[1](0, 0) = (Numeric::Stencil<Set::Scalar, 1, 0, 0>::D(f, i, j, k, 3, dx, stencil));
1068 ret[1](1, 0) = (Numeric::Stencil<Set::Scalar, 1, 0, 0>::D(f, i, j, k, 4, dx, stencil));
1069 ret[1](2, 0) = (Numeric::Stencil<Set::Scalar, 1, 0, 0>::D(f, i, j, k, 5, dx, stencil));
1070 ret[2](0, 0) = (Numeric::Stencil<Set::Scalar, 1, 0, 0>::D(f, i, j, k, 6, dx, stencil));
1071 ret[2](1, 0) = (Numeric::Stencil<Set::Scalar, 1, 0, 0>::D(f, i, j, k, 7, dx, stencil));
1072 ret[2](2, 0) = (Numeric::Stencil<Set::Scalar, 1, 0, 0>::D(f, i, j, k, 8, dx, stencil));
1073 ret[0](0, 1) = (Numeric::Stencil<Set::Scalar, 0, 1, 0>::D(f, i, j, k, 0, dx, stencil));
1074 ret[0](1, 1) = (Numeric::Stencil<Set::Scalar, 0, 1, 0>::D(f, i, j, k, 1, dx, stencil));
1075 ret[0](2, 1) = (Numeric::Stencil<Set::Scalar, 0, 1, 0>::D(f, i, j, k, 2, dx, stencil));
1076 ret[1](0, 1) = (Numeric::Stencil<Set::Scalar, 0, 1, 0>::D(f, i, j, k, 3, dx, stencil));
1077 ret[1](1, 1) = (Numeric::Stencil<Set::Scalar, 0, 1, 0>::D(f, i, j, k, 4, dx, stencil));
1078 ret[1](2, 1) = (Numeric::Stencil<Set::Scalar, 0, 1, 0>::D(f, i, j, k, 5, dx, stencil));
1079 ret[2](0, 1) = (Numeric::Stencil<Set::Scalar, 0, 1, 0>::D(f, i, j, k, 6, dx, stencil));
1080 ret[2](1, 1) = (Numeric::Stencil<Set::Scalar, 0, 1, 0>::D(f, i, j, k, 7, dx, stencil));
1081 ret[2](2, 1) = (Numeric::Stencil<Set::Scalar, 0, 1, 0>::D(f, i, j, k, 8, dx, stencil));
1082 ret[0](0, 2) = (Numeric::Stencil<Set::Scalar, 0, 0, 1>::D(f, i, j, k, 0, dx, stencil));
1083 ret[0](1, 2) = (Numeric::Stencil<Set::Scalar, 0, 0, 1>::D(f, i, j, k, 1, dx, stencil));
1084 ret[0](2, 2) = (Numeric::Stencil<Set::Scalar, 0, 0, 1>::D(f, i, j, k, 2, dx, stencil));
1085 ret[1](0, 2) = (Numeric::Stencil<Set::Scalar, 0, 0, 1>::D(f, i, j, k, 3, dx, stencil));
1086 ret[1](1, 2) = (Numeric::Stencil<Set::Scalar, 0, 0, 1>::D(f, i, j, k, 4, dx, stencil));
1087 ret[1](2, 2) = (Numeric::Stencil<Set::Scalar, 0, 0, 1>::D(f, i, j, k, 5, dx, stencil));
1088 ret[2](0, 2) = (Numeric::Stencil<Set::Scalar, 0, 0, 1>::D(f, i, j, k, 6, dx, stencil));
1089 ret[2](1, 2) = (Numeric::Stencil<Set::Scalar, 0, 0, 1>::D(f, i, j, k, 7, dx, stencil));
1090 ret[2](2, 2) = (Numeric::Stencil<Set::Scalar, 0, 0, 1>::D(f, i, j, k, 8, dx, stencil));
1091#endif
1092 return ret;
1093}
1094
1095
1096[[nodiscard]] AMREX_FORCE_INLINE
1098Hessian(const amrex::Array4<const Set::Scalar>& f,
1099 const int& i, const int& j, const int& k, const int& m,
1100 const Set::Scalar dx[AMREX_SPACEDIM],
1101 std::array<StencilType, AMREX_SPACEDIM> stencil = DefaultType()
1102)
1103{
1104 Set::Matrix ret;
1105 ret(0, 0) = (Numeric::Stencil<Set::Scalar, 2, 0, 0>::D(f, i, j, k, m, dx, stencil));
1106#if AMREX_SPACEDIM > 1
1107 ret(1, 1) = (Numeric::Stencil<Set::Scalar, 0, 2, 0>::D(f, i, j, k, m, dx, stencil));
1108 ret(0, 1) = (Numeric::Stencil<Set::Scalar, 1, 1, 0>::D(f, i, j, k, m, dx, stencil));
1109 ret(1, 0) = ret(0, 1);
1110#if AMREX_SPACEDIM > 2
1111 ret(2, 2) = (Numeric::Stencil<Set::Scalar, 0, 0, 2>::D(f, i, j, k, m, dx, stencil));
1112 ret(1, 2) = (Numeric::Stencil<Set::Scalar, 0, 1, 1>::D(f, i, j, k, m, dx, stencil));
1113 ret(2, 0) = (Numeric::Stencil<Set::Scalar, 1, 0, 1>::D(f, i, j, k, m, dx, stencil));
1114 ret(2, 1) = ret(1, 2);
1115 ret(0, 2) = ret(2, 0);
1116#endif
1117#endif
1118 return ret;
1119}
1120
1121[[nodiscard]] AMREX_FORCE_INLINE
1123Hessian(const amrex::Array4<const Set::Scalar>& f,
1124 const int& i, const int& j, const int& k,
1125 const Set::Scalar DX[AMREX_SPACEDIM],
1126 std::array<StencilType, AMREX_SPACEDIM> stencil = DefaultType())
1127{
1128 Set::Matrix3 ret;
1129 // 1D
1130#if AMREX_SPACEDIM>0
1131 ret(0, 0, 0) = (Numeric::Stencil<Set::Scalar, 2, 0, 0>::D(f, i, j, k, 0, DX, stencil));
1132#endif
1133 // 2D
1134#if AMREX_SPACEDIM>1
1135 ret(0, 0, 1) = (Numeric::Stencil<Set::Scalar, 1, 1, 0>::D(f, i, j, k, 0, DX, stencil));
1136 ret(0, 1, 0) = ret(0, 0, 1);
1137 ret(0, 1, 1) = (Numeric::Stencil<Set::Scalar, 0, 2, 0>::D(f, i, j, k, 0, DX, stencil));
1138 ret(1, 0, 0) = (Numeric::Stencil<Set::Scalar, 2, 0, 0>::D(f, i, j, k, 1, DX, stencil));
1139 ret(1, 0, 1) = (Numeric::Stencil<Set::Scalar, 1, 1, 0>::D(f, i, j, k, 1, DX, stencil));
1140 ret(1, 1, 0) = ret(1, 0, 1);
1141 ret(1, 1, 1) = (Numeric::Stencil<Set::Scalar, 0, 2, 0>::D(f, i, j, k, 1, DX, stencil));
1142#endif
1143 // 3D
1144#if AMREX_SPACEDIM>2
1145 ret(0, 2, 2) = (Numeric::Stencil<Set::Scalar, 0, 0, 2>::D(f, i, j, k, 0, DX, stencil));
1146 ret(0, 0, 2) = (Numeric::Stencil<Set::Scalar, 1, 0, 1>::D(f, i, j, k, 0, DX, stencil));
1147 ret(0, 1, 2) = (Numeric::Stencil<Set::Scalar, 0, 1, 1>::D(f, i, j, k, 0, DX, stencil));
1148 ret(0, 2, 0) = ret(0, 0, 2);
1149 ret(0, 2, 1) = ret(0, 1, 2);;
1150 ret(1, 2, 2) = (Numeric::Stencil<Set::Scalar, 0, 0, 2>::D(f, i, j, k, 1, DX, stencil));
1151 ret(1, 0, 2) = (Numeric::Stencil<Set::Scalar, 1, 0, 1>::D(f, i, j, k, 1, DX, stencil));
1152 ret(1, 1, 2) = (Numeric::Stencil<Set::Scalar, 0, 1, 1>::D(f, i, j, k, 1, DX, stencil));
1153 ret(1, 2, 0) = ret(1, 0, 2);
1154 ret(1, 2, 1) = ret(1, 1, 2);;
1155 ret(2, 0, 0) = (Numeric::Stencil<Set::Scalar, 2, 0, 0>::D(f, i, j, k, 2, DX, stencil));
1156 ret(2, 1, 1) = (Numeric::Stencil<Set::Scalar, 0, 2, 0>::D(f, i, j, k, 2, DX, stencil));
1157 ret(2, 2, 2) = (Numeric::Stencil<Set::Scalar, 0, 0, 2>::D(f, i, j, k, 2, DX, stencil));
1158 ret(2, 0, 1) = (Numeric::Stencil<Set::Scalar, 1, 1, 0>::D(f, i, j, k, 2, DX, stencil));
1159 ret(2, 1, 0) = ret(2, 0, 1);
1160 ret(2, 0, 2) = (Numeric::Stencil<Set::Scalar, 1, 0, 1>::D(f, i, j, k, 2, DX, stencil));
1161 ret(2, 1, 2) = (Numeric::Stencil<Set::Scalar, 0, 1, 1>::D(f, i, j, k, 2, DX, stencil));
1162 ret(2, 2, 0) = ret(2, 0, 2);
1163 ret(2, 2, 1) = ret(2, 1, 2);;
1164#endif
1165 return ret;
1166}
1167
1168
1169// Returns Hessian of a vector field.
1170// Return value: ret[i](j,k) = ret_{i,jk}
1171[[nodiscard]] AMREX_FORCE_INLINE
1173Hessian(const amrex::Array4<const Set::Vector>& f,
1174 const int& i, const int& j, const int& k,
1175 const Set::Scalar dx[AMREX_SPACEDIM],
1176 std::array<StencilType, AMREX_SPACEDIM> stencil = DefaultType())
1177{
1178 Set::Matrix3 ret;
1179
1180#if AMREX_SPACEDIM>0
1181 Set::Vector f_11 = Numeric::Stencil<Set::Vector, 2, 0, 0>::D(f, i, j, k, 0, dx, stencil);
1182 ret[0](0, 0) = f_11(0);
1183#endif
1184#if AMREX_SPACEDIM>1
1185 ret[1](0, 0) = f_11(1);
1186 Set::Vector f_12 = Numeric::Stencil<Set::Vector, 1, 1, 0>::D(f, i, j, k, 0, dx, stencil);
1187 ret[0](1, 0) = ret[0](0, 1) = f_12(0);
1188 ret[1](1, 0) = ret[1](0, 1) = f_12(1);
1189 Set::Vector f_22 = Numeric::Stencil<Set::Vector, 0, 2, 0>::D(f, i, j, k, 0, dx, stencil);
1190 ret[0](1, 1) = f_22(0);
1191 ret[1](1, 1) = f_22(1);
1192#endif
1193#if AMREX_SPACEDIM>2
1194 ret[2](0, 0) = f_11(2);
1195 ret[2](1, 0) = ret[2](0, 1) = f_12(2);
1196 Set::Vector f_13 = Numeric::Stencil<Set::Vector, 1, 0, 1>::D(f, i, j, k, 0, dx, stencil);
1197 ret[0](2, 0) = ret[0](0, 2) = f_13(0);
1198 ret[1](2, 0) = ret[1](0, 2) = f_13(1);
1199 ret[2](2, 0) = ret[2](0, 2) = f_13(2);
1200 ret[2](1, 1) = f_22(2);
1201 Set::Vector f_23 = Numeric::Stencil<Set::Vector, 0, 1, 1>::D(f, i, j, k, 0, dx, stencil);
1202 ret[0](1, 2) = ret[0](2, 1) = f_23(0);
1203 ret[1](1, 2) = ret[1](2, 1) = f_23(1);
1204 ret[2](1, 2) = ret[2](2, 1) = f_23(2);
1205 Set::Vector f_33 = Numeric::Stencil<Set::Vector, 0, 0, 2>::D(f, i, j, k, 0, dx, stencil);
1206 ret[0](2, 2) = f_33(0);
1207 ret[1](2, 2) = f_33(1);
1208 ret[2](2, 2) = f_33(2);
1209#endif
1210 return ret;
1211}
1212
1213
1214[[nodiscard]] AMREX_FORCE_INLINE
1216FieldToMatrix(const amrex::Array4<const Set::Scalar>& f,
1217 const int& i, const int& j, const int& k)
1218{
1219 Set::Matrix ret;
1220#if AMREX_SPACEDIM == 1
1221 ret(0, 0) = f(i, j, k, 0);
1222
1223#elif AMREX_SPACEDIM == 2
1224 ret(0, 0) = f(i, j, k, 0); ret(0, 1) = f(i, j, k, 1);
1225 ret(1, 0) = f(i, j, k, 2); ret(1, 1) = f(i, j, k, 3);
1226
1227#elif AMREX_SPACEDIM == 3
1228 ret(0, 0) = f(i, j, k, 0); ret(0, 1) = f(i, j, k, 1); ret(0, 2) = f(i, j, k, 2);
1229 ret(1, 0) = f(i, j, k, 3); ret(1, 1) = f(i, j, k, 4); ret(1, 2) = f(i, j, k, 5);
1230 ret(2, 0) = f(i, j, k, 6); ret(2, 1) = f(i, j, k, 7); ret(2, 2) = f(i, j, k, 8);
1231#endif
1232
1233 return ret;
1234}
1235
1236[[nodiscard]] AMREX_FORCE_INLINE
1238FieldToMatrix(const amrex::Array4<Set::Scalar>& f,
1239 const int& i, const int& j, const int& k)
1240{
1241 Set::Matrix ret;
1242#if AMREX_SPACEDIM == 1
1243 ret(0, 0) = f(i, j, k, 0);
1244
1245#elif AMREX_SPACEDIM == 2
1246 ret(0, 0) = f(i, j, k, 0); ret(0, 1) = f(i, j, k, 1);
1247 ret(1, 0) = f(i, j, k, 2); ret(1, 1) = f(i, j, k, 3);
1248
1249#elif AMREX_SPACEDIM == 3
1250 ret(0, 0) = f(i, j, k, 0); ret(0, 1) = f(i, j, k, 1); ret(0, 2) = f(i, j, k, 2);
1251 ret(1, 0) = f(i, j, k, 3); ret(1, 1) = f(i, j, k, 4); ret(1, 2) = f(i, j, k, 5);
1252 ret(2, 0) = f(i, j, k, 6); ret(2, 1) = f(i, j, k, 7); ret(2, 2) = f(i, j, k, 8);
1253#endif
1254
1255 return ret;
1256}
1257
1258[[nodiscard]] AMREX_FORCE_INLINE
1260FieldToVector(const amrex::Array4<const Set::Scalar>& f,
1261 const int& i, const int& j, const int& k)
1262{
1263 Set::Vector ret;
1264 ret(0) = f(i, j, k, 0);
1265#if AMREX_SPACEDIM > 1
1266 ret(1) = f(i, j, k, 1);
1267#if AMREX_SPACEDIM > 2
1268 ret(2) = f(i, j, k, 2);
1269#endif
1270#endif
1271 return ret;
1272}
1273
1274[[nodiscard]] AMREX_FORCE_INLINE
1276FieldToVector(const amrex::Array4<Set::Scalar>& f,
1277 const int& i, const int& j, const int& k)
1278{
1279 Set::Vector ret;
1280 ret(0) = f(i, j, k, 0);
1281#if AMREX_SPACEDIM > 1
1282 ret(1) = f(i, j, k, 1);
1283#if AMREX_SPACEDIM > 2
1284 ret(2) = f(i, j, k, 2);
1285#endif
1286#endif
1287 return ret;
1288}
1289
1290AMREX_FORCE_INLINE
1291void
1292MatrixToField(const amrex::Array4<Set::Scalar>& f,
1293 const int& i, const int& j, const int& k,
1294 Set::Matrix matrix)
1295{
1296#if AMREX_SPACEDIM == 1
1297 f(i, j, k, 0) = matrix(0, 0);
1298#elif AMREX_SPACEDIM == 2
1299 f(i, j, k, 0) = matrix(0, 0); f(i, j, k, 1) = matrix(0, 1);
1300 f(i, j, k, 2) = matrix(1, 0); f(i, j, k, 3) = matrix(1, 1);
1301#elif AMREX_SPACEDIM == 3
1302 f(i, j, k, 0) = matrix(0, 0); f(i, j, k, 1) = matrix(0, 1); f(i, j, k, 2) = matrix(0, 2);
1303 f(i, j, k, 3) = matrix(1, 0); f(i, j, k, 4) = matrix(1, 1); f(i, j, k, 5) = matrix(1, 2);
1304 f(i, j, k, 6) = matrix(2, 0); f(i, j, k, 7) = matrix(2, 1); f(i, j, k, 8) = matrix(2, 2);
1305#endif
1306}
1307
1308AMREX_FORCE_INLINE
1309void
1310VectorToField(const amrex::Array4<Set::Scalar>& f,
1311 const int& i, const int& j, const int& k,
1312 Set::Vector vector)
1313{
1314 f(i, j, k, 0) = vector(0);
1315#if AMREX_SPACEDIM > 1
1316 f(i, j, k, 1) = vector(1);
1317#if AMREX_SPACEDIM > 2
1318 f(i, j, k, 2) = vector(2);
1319#endif
1320#endif
1321}
1322
1323template<int index, int SYM>
1324[[nodiscard]]
1327 const int, const int, const int, const Set::Scalar[AMREX_SPACEDIM],
1328 std::array<StencilType, AMREX_SPACEDIM> /*stecil*/ = DefaultType())
1329{
1330 Util::Abort(INFO, "Not implemented yet"); return Set::Matrix3::Zero();
1331}
1332
1333template<>
1334[[nodiscard]] AMREX_FORCE_INLINE
1336 const int i, const int j, const int k, const Set::Scalar dx[AMREX_SPACEDIM],
1337 std::array<StencilType, AMREX_SPACEDIM> stencil)
1338{
1339 Set::Matrix3 ret;
1340
1342 Numeric::Stencil<Set::Matrix4<AMREX_SPACEDIM, Set::Sym::Isotropic>, 1, 0, 0>::D(C, i, j, k, 0, dx, stencil);
1343#if AMREX_SPACEDIM>1
1345 Numeric::Stencil<Set::Matrix4<AMREX_SPACEDIM, Set::Sym::Isotropic>, 0, 1, 0>::D(C, i, j, k, 0, dx, stencil);
1346#endif
1347#if AMREX_SPACEDIM>2
1349 Numeric::Stencil<Set::Matrix4<AMREX_SPACEDIM, Set::Sym::Isotropic>, 0, 0, 1>::D(C, i, j, k, 0, dx, stencil);
1350#endif
1351
1352 for (int i = 0; i < AMREX_SPACEDIM; i++)
1353 for (int k = 0; k < AMREX_SPACEDIM; k++)
1354 for (int l = 0; l < AMREX_SPACEDIM; l++)
1355 {
1356 ret(i, k, l) = 0.0;
1357 ret(i, k, l) = gradCx(i, 0, k, l);
1358#if AMREX_SPACEDIM>1
1359 ret(i, k, l) = gradCy(i, 1, k, l);
1360#endif
1361#if AMREX_SPACEDIM>2
1362 ret(i, k, l) = gradCz(i, 2, k, l);
1363#endif
1364 }
1365 return ret;
1366}
1367
1368
1369
1370
1371template<int dim>
1372[[nodiscard]] AMREX_FORCE_INLINE
1374DoubleHessian(const amrex::Array4<const Set::Scalar>& f,
1375 const int& i, const int& j, const int& k, const int& m,
1376 const Set::Scalar dx[AMREX_SPACEDIM]);
1377
1378template<>
1379[[nodiscard]] AMREX_FORCE_INLINE
1381DoubleHessian<2>(const amrex::Array4<const Set::Scalar>& f,
1382 const int& i, const int& j, const int& k, const int& m,
1383 const Set::Scalar dx[AMREX_SPACEDIM])
1384{
1386 // [0,0,0,0]
1387 ret(0, 0, 0, 0) = Stencil<Set::Scalar, 4, 0, 0>::D(f, i, j, k, m, dx);
1388 // [0, 0, 0, 1]
1389 ret(0, 0, 0, 1) = Stencil<Set::Scalar, 3, 1, 0>::D(f, i, j, k, m, dx);
1390 // [0, 0, 1, 1]
1391 ret(0, 0, 1, 1) = Stencil<Set::Scalar, 2, 2, 0>::D(f, i, j, k, m, dx);
1392 // [0, 1, 1, 1]
1393 ret(0, 1, 1, 1) = Stencil<Set::Scalar, 1, 3, 0>::D(f, i, j, k, m, dx);
1394 // [1, 1, 1, 1]
1395 ret(1, 1, 1, 1) = Stencil<Set::Scalar, 0, 4, 0>::D(f, i, j, k, m, dx);
1396 return ret;
1397}
1398
1399template<>
1400[[nodiscard]] AMREX_FORCE_INLINE
1402DoubleHessian<3>(const amrex::Array4<const Set::Scalar>& f,
1403 const int& i, const int& j, const int& k, const int& m,
1404 const Set::Scalar dx[AMREX_SPACEDIM])
1405{
1407 // [0,0,0,0]
1408 ret(0, 0, 0, 0) = Stencil<Set::Scalar, 4, 0, 0>::D(f, i, j, k, m, dx);
1409 // [0, 0, 0, 1]
1410 ret(0, 0, 0, 1) = Stencil<Set::Scalar, 3, 1, 0>::D(f, i, j, k, m, dx);
1411 // [0, 0, 0, 2]
1412 ret(0, 0, 0, 2) = Stencil<Set::Scalar, 3, 0, 1>::D(f, i, j, k, m, dx);
1413 // [0, 0, 1, 1]
1414 ret(0, 0, 1, 1) = Stencil<Set::Scalar, 2, 2, 0>::D(f, i, j, k, m, dx);
1415 // [0, 0, 1, 2]
1416 ret(0, 0, 1, 2) = Stencil<Set::Scalar, 2, 1, 1>::D(f, i, j, k, m, dx);
1417 // [0, 0, 2, 2]
1418 ret(0, 0, 2, 2) = Stencil<Set::Scalar, 2, 0, 2>::D(f, i, j, k, m, dx);
1419 // [0, 1, 1, 1]
1420 ret(0, 1, 1, 1) = Stencil<Set::Scalar, 1, 3, 0>::D(f, i, j, k, m, dx);
1421 // [0, 1, 1, 2]
1422 ret(0, 1, 1, 2) = Stencil<Set::Scalar, 1, 2, 1>::D(f, i, j, k, m, dx);
1423 // [0, 1, 2, 2]
1424 ret(0, 1, 2, 2) = Stencil<Set::Scalar, 1, 1, 2>::D(f, i, j, k, m, dx);
1425 // [0, 2, 2, 2]
1426 ret(0, 2, 2, 2) = Stencil<Set::Scalar, 1, 0, 3>::D(f, i, j, k, m, dx);
1427 // [1, 1, 1, 1]
1428 ret(1, 1, 1, 1) = Stencil<Set::Scalar, 0, 4, 0>::D(f, i, j, k, m, dx);
1429 // [1, 1, 1, 2]
1430 ret(1, 1, 1, 2) = Stencil<Set::Scalar, 0, 3, 1>::D(f, i, j, k, m, dx);
1431 // [1, 1, 2, 2]
1432 ret(1, 1, 2, 2) = Stencil<Set::Scalar, 0, 2, 2>::D(f, i, j, k, m, dx);
1433 // [1, 2, 2, 2]
1434 ret(1, 2, 2, 2) = Stencil<Set::Scalar, 0, 1, 3>::D(f, i, j, k, m, dx);
1435 // [2, 2, 2, 2]
1436 ret(2, 2, 2, 2) = Stencil<Set::Scalar, 0, 0, 4>::D(f, i, j, k, m, dx);
1437 return ret;
1438}
1439
1441{
1442public:
1443 template<class T>
1444 [[nodiscard]] AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE
1445 static T CellToNodeAverage(const amrex::Array4<const T>& f,
1446 const int& i, const int& j, const int& k, const int& m,
1447 std::array<StencilType, AMREX_SPACEDIM> stencil = DefaultType())
1448 {
1449 int AMREX_D_DECL(
1450 ilo = (stencil[0] == Numeric::StencilType::Lo ? 0 : 1),
1451 jlo = (stencil[1] == Numeric::StencilType::Lo ? 0 : 1),
1452 klo = (stencil[2] == Numeric::StencilType::Lo ? 0 : 1));
1453
1454 return (AMREX_D_TERM(f(i, j, k, m) + f(i - ilo, j, k, m)
1455 ,
1456 +f(i, j - jlo, k, m) + f(i - ilo, j - jlo, k, m)
1457 ,
1458 +f(i, j, k - klo, m) + f(i - ilo, j, k - klo, m)
1459 + f(i, j - jlo, k - klo, m) + f(i - ilo, j - jlo, k - klo, m)
1460 )) * fac;
1461 }
1462 template<class T>
1463 [[nodiscard]] AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE
1464 static T CellToNodeAverage(const amrex::Array4<T>& f,
1465 const int& i, const int& j, const int& k, const int& m,
1466 std::array<StencilType, AMREX_SPACEDIM> stencil = DefaultType())
1467 {
1468 int AMREX_D_DECL(
1469 ilo = (stencil[0] == Numeric::StencilType::Lo ? 0 : 1),
1470 jlo = (stencil[1] == Numeric::StencilType::Lo ? 0 : 1),
1471 klo = (stencil[2] == Numeric::StencilType::Lo ? 0 : 1));
1472
1473 return (AMREX_D_TERM(f(i, j, k, m) + f(i - ilo, j, k, m)
1474 ,
1475 +f(i, j - jlo, k, m) + f(i - ilo, j - jlo, k, m)
1476 ,
1477 +f(i, j, k - klo, m) + f(i - ilo, j, k - klo, m)
1478 + f(i, j - jlo, k - klo, m) + f(i - ilo, j - jlo, k - klo, m)
1479 )) * fac;
1480 }
1481 template<class T>
1482 [[nodiscard]] AMREX_FORCE_INLINE
1483 static T NodeToCellAverage(const amrex::Array4<const T>& f,
1484 const int& i, const int& j, const int& k, const int& m)
1485 {
1486 return (AMREX_D_TERM(f(i, j, k, m) + f(i + 1, j, k, m)
1487 ,
1488 +f(i, j + 1, k, m) + f(i + 1, j + 1, k, m)
1489 ,
1490 +f(i, j, k + 1, m) + f(i + 1, j, k + 1, m)
1491 + f(i, j + 1, k + 1, m) + f(i + 1, j + 1, k + 1, m)
1492 )) * fac;
1493 }
1494 template<class T>
1495 [[nodiscard]] AMREX_FORCE_INLINE
1496 static T NodeToCellAverage(const amrex::Array4<T>& f,
1497 const int& i, const int& j, const int& k, const int& m)
1498 {
1499 return (AMREX_D_TERM(f(i, j, k, m) + f(i + 1, j, k, m)
1500 ,
1501 +f(i, j + 1, k, m) + f(i + 1, j + 1, k, m)
1502 ,
1503 +f(i, j, k + 1, m) + f(i + 1, j, k + 1, m)
1504 + f(i, j + 1, k + 1, m) + f(i + 1, j + 1, k + 1, m)
1505 )) * fac;
1506 }
1507 constexpr static Set::Scalar fac = AMREX_D_PICK(0.5, 0.25, 0.125);
1508};
1509
1510}
1511#endif
#define TEST(x)
Definition Util.H:25
#define INFO
Definition Util.H:24
static Matrix3 Zero()
Definition Matrix3.H:42
@ AMREX_D_DECL
Definition BC.H:33
This namespace contains some numerical tools.
Definition Advect.H:14
AMREX_FORCE_INLINE Set::Matrix FieldToMatrix(const amrex::Array4< const Set::Scalar > &f, const int &i, const int &j, const int &k)
Definition Stencil.H:1216
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])
Definition Stencil.H:1381
AMREX_GPU_HOST_DEVICE 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])
Definition Stencil.H:705
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)
Definition Stencil.H:1335
Set::Matrix FaceGradient(const amrex::Array4< const Set::Vector > &f, const int i, const int j, const int k, const int face, const Set::Scalar dx[AMREX_SPACEDIM])
Definition Stencil.H:796
AMREX_FORCE_INLINE void VectorToField(const amrex::Array4< Set::Scalar > &f, const int &i, const int &j, const int &k, Set::Vector vector)
Definition Stencil.H:1310
AMREX_GPU_HOST_DEVICE 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())
Definition Stencil.H:596
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())
Definition Stencil.H:1046
StencilType
Definition Stencil.H:21
@ Central
Definition Stencil.H:21
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
Definition Stencil.H:32
AMREX_FORCE_INLINE std::array< T, AMREX_SPACEDIM > Gradient_Diagonal(const Set::Scalar dx[AMREX_SPACEDIM], std::array< StencilType, AMREX_SPACEDIM > stencil=DefaultType())
static AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE std::array< StencilType, AMREX_SPACEDIM > GetStencil(const int i, const int j, const int k, const amrex::Box domain)
Definition Stencil.H:51
AMREX_FORCE_INLINE Set::Vector NodeGradientOnCell(const amrex::Array4< const Set::Scalar > &f, const int &i, const int &j, const int &k, const Set::Scalar dx[AMREX_SPACEDIM])
Definition Stencil.H:875
static std::array< StencilType, AMREX_SPACEDIM > XLo
Definition Stencil.H:30
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())
Definition Stencil.H:1098
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE std::array< StencilType, AMREX_SPACEDIM > DefaultType()
Definition Stencil.H:24
AMREX_GPU_HOST_DEVICE 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())
Definition Stencil.H:687
AMREX_FORCE_INLINE Set::Vector FieldToVector(const amrex::Array4< const Set::Scalar > &f, const int &i, const int &j, const int &k)
Definition Stencil.H:1260
AMREX_FORCE_INLINE void MatrixToField(const amrex::Array4< Set::Scalar > &f, const int &i, const int &j, const int &k, Set::Matrix matrix)
Definition Stencil.H:1292
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])
Definition Stencil.H:1402
AMREX_GPU_HOST_DEVICE 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())
Definition Stencil.H:561
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())
Definition Stencil.H:845
amrex::Real Scalar
Definition Base.H:19
Eigen::Matrix< amrex::Real, AMREX_SPACEDIM, 1 > Vector
Definition Base.H:21
Eigen::Matrix< amrex::Real, AMREX_SPACEDIM, AMREX_SPACEDIM > Matrix
Definition Base.H:24
AMREX_FORCE_INLINE AMREX_GPU_HOST_DEVICE void Assert(const char *file, const char *func, int line, const char *smt, bool pass, Args const &... args)
Definition Util.H:60
AMREX_GPU_HOST_DEVICE void Abort(const char *msg)
Definition Util.cpp:406
AMREX_GPU_HOST_DEVICE 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())
Definition Stencil.H:1464
static constexpr Set::Scalar fac
Definition Stencil.H:1507
static AMREX_FORCE_INLINE T NodeToCellAverage(const amrex::Array4< T > &f, const int &i, const int &j, const int &k, const int &m)
Definition Stencil.H:1496
static AMREX_FORCE_INLINE T NodeToCellAverage(const amrex::Array4< const T > &f, const int &i, const int &j, const int &k, const int &m)
Definition Stencil.H:1483
AMREX_GPU_HOST_DEVICE 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())
Definition Stencil.H:1445
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())
Definition Stencil.H:176
AMREX_GPU_HOST_DEVICE 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())
Definition Stencil.H:162
AMREX_GPU_HOST_DEVICE 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())
Definition Stencil.H:239
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])
Definition Stencil.H:341
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())
Definition Stencil.H:135
AMREX_GPU_HOST_DEVICE 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())
Definition Stencil.H:121
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())
Definition Stencil.H:293
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])
Definition Stencil.H:408
AMREX_GPU_HOST_DEVICE 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())
Definition Stencil.H:223
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])
Definition Stencil.H:476
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])
Definition Stencil.H:392
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])
Definition Stencil.H:329
AMREX_GPU_HOST_DEVICE 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())
Definition Stencil.H:80
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())
Definition Stencil.H:94
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())
Definition Stencil.H:274
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])
Definition Stencil.H:424
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())
Definition Stencil.H:255
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])
Definition Stencil.H:546
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])
Definition Stencil.H:529
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])
Definition Stencil.H:374
AMREX_GPU_HOST_DEVICE 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())
Definition Stencil.H:207
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])
Definition Stencil.H:493
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])
Definition Stencil.H:512
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])
Definition Stencil.H:458
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])
Definition Stencil.H:441
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])
Definition Stencil.H:356
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])
Definition Stencil.H:317