1#ifndef AMREX_INTERP_2D_C_H_
2#define AMREX_INTERP_2D_C_H_
3#include <AMReX_Config.H>
12 Array4<Real>
const&
fine,
const int fcomp,
const int ncomp,
13 Array4<Real const>
const&
crse,
const int ccomp,
19 for (
int n = 0; n < ncomp; ++n) {
20 for (
int j = lo.y; j <= hi.y; ++j) {
23 for (
int i = lo.x; i <= hi.x; ++i) {
25 fine(i,j,0,n+fcomp) =
crse(ic,jc,0,n+ccomp);
32namespace interp_detail {
35 constexpr int ixy = 2;
42 const int icomp,
const int ncomp,
IntVect const& ratio)
noexcept
44 using namespace interp_detail;
52 for (
int n = 0; n < ncomp; ++n) {
53 for (
int j = lo.y; j <= hi.y; ++j) {
55 for (
int i = lo.x; i <= hi.x; ++i) {
56 T dx0 = u(i+1,j,0,n+icomp) - u(i,j,0,n+icomp);
57 T d0x = u(i,j+1,0,n+icomp) - u(i,j,0,n+icomp);
58 T dx1 = u(i+1,j+1,0,n+icomp) - u(i,j+1,0,n+icomp);
60 slope(i,j,0,n+ncomp*ix ) = rx*dx0;
61 slope(i,j,0,n+ncomp*iy ) = ry*d0x;
62 slope(i,j,0,n+ncomp*ixy) = rx*ry*(dx1 - dx0);
71 Array4<T const>
const&
slope, Array4<T const>
const&
crse,
72 const int ccomp,
IntVect const& ratio)
noexcept
74 using namespace interp_detail;
80 for (
int n = 0; n < ncomp; ++n) {
81 for (
int j = lo.y; j <= hi.y; ++j) {
83 const Real fy = j - jc*ratio[1];
85 for (
int i = lo.x; i <= hi.x; ++i) {
87 const Real fx = i - ic*ratio[0];
88 fine(i,j,0,n+fcomp) =
crse(ic,jc,0,n+ccomp)
89 + fx*
slope(ic,jc,0,n+ncomp*ix)
90 + fy*
slope(ic,jc,0,n+ncomp*iy)
91 + fx*fy*
slope(ic,jc,0,n+ncomp*ixy);
100 int nc,
int nf,
int idir,
101 Array4<T const>
const&
crse,
102 Array4<T>
const&
fine,
103 Array4<int const>
const&
mask,
107 if (!
mask(ci, cj, 0, nc))
111 const int fi = ci*ratio[0];
112 const int fj = cj*ratio[1];
117 const Real neg =
crse(ci, cj-1, 0, nc);
118 const Real cen =
crse(ci, cj , 0, nc);
119 const Real pos =
crse(ci, cj+1, 0, nc);
121 fine(fi, fj , 0, nf) =
Real(0.125)*(8*cen + neg - pos);
122 fine(fi, fj+1, 0, nf) =
Real(0.125)*(8*cen + pos - neg);
128 const Real neg =
crse(ci-1, cj, 0, nc);
129 const Real cen =
crse(ci , cj, 0, nc);
130 const Real pos =
crse(ci+1, cj, 0, nc);
132 fine(fi , fj, 0, nf) =
Real(0.125)*(8*cen + neg - pos);
133 fine(fi+1, fj, 0, nf) =
Real(0.125)*(8*cen + pos - neg);
144 GpuArray<Array4<T>, AMREX_SPACEDIM>
const&
fine,
146 GpuArray<Real, AMREX_SPACEDIM>
const& cellSize)
noexcept
148 const int fi = ci*ratio[0];
149 const int fj = cj*ratio[1];
152 const Real umm =
fine[0](fi, fj, 0, nf);
153 const Real ump =
fine[0](fi, fj+1, 0, nf);
154 const Real upm =
fine[0](fi+2, fj, 0, nf);
155 const Real upp =
fine[0](fi+2, fj+1, 0, nf);
157 const Real vmm =
fine[1](fi, fj, 0, nf);
158 const Real vmp =
fine[1](fi+1, fj, 0, nf);
159 const Real vpm =
fine[1](fi, fj+2, 0, nf);
160 const Real vpp =
fine[1](fi+1, fj+2, 0, nf);
162 const Real dxdy = cellSize[0]/cellSize[1];
163 const Real x_corr =
Real(0.25)*dxdy * (vpp+vmm-vmp-vpm);
164 const Real y_corr =
Real(0.25)/dxdy * (upp+umm-ump-upm);
167 fine[0](fi+1,fj ,0,nf) =
Real(0.5)*(umm+upm) + x_corr;
168 fine[0](fi+1,fj+1,0,nf) =
Real(0.5)*(ump+upp) + x_corr;
169 fine[1](fi, fj+1,0,nf) =
Real(0.5)*(vmm+vpm) + y_corr;
170 fine[1](fi+1,fj+1,0,nf) =
Real(0.5)*(vmp+vpp) + y_corr;
177 Array4<T const>
const&
crse,
IntVect const& ratio)
noexcept
181 if (i-ii*ratio[0] == 0) {
184 Real const w =
static_cast<Real>(i-ii*ratio[0]) * (
Real(1.)/
Real(ratio[0]));
196 if (j-jj*ratio[1] == 0) {
199 Real const w =
static_cast<Real>(j-jj*ratio[1]) * (
Real(1.)/
Real(ratio[1]));
218 int ihi =
amrex::min(ratio[0]*ic+(ratio[0]-1), fnbxhi.
x);
220 int jhi =
amrex::min(ratio[1]*jc+(ratio[1]-1), fnbxhi.
y);
225 for (
int n = 1; n < nvar-1; ++n) {
227 bool redo_me =
false;
228 for (
int j = jlo; j <= jhi; ++j) {
229 for (
int i = ilo; i <= ihi; ++i) {
230 if ((fine_state(i,j,0,n) +
fine(i,j,0,n)) < 0.0) {
250 const Real* cs_dx = cs_geomdata.CellSize();
253 cvol = cs_dx[0] * cs_dx[1];
256 const Real* cs_problo = cs_geomdata.ProbLo();
257 Real rp = cs_problo[0] + (ic+0.5_rt)*cs_dx[0];
258 Real rm = cs_problo[0] + (ic-0.5_rt)*cs_dx[0];
259 cvol = (rp*rp - rm*rm) * cs_dx[1];
276 for (
int j = jlo; j <= jhi; ++j) {
277 for (
int i = ilo; i <= ihi; ++i) {
281 const Real* fn_dx = fn_geomdata.CellSize();
284 fvol = fn_dx[0] * fn_dx[1];
287 const Real* fn_problo = fn_geomdata.ProbLo();
288 Real rp = fn_problo[0] + (i+0.5_rt)*fn_dx[0];
289 Real rm = fn_problo[0] + (i-0.5_rt)*fn_dx[0];
290 fvol = (rp*rp - rm*rm) * fn_dx[1];
294 crseTot += fvol *
fine(i,j,0,n);
295 if (fine_state(i,j,0,n) <= 0.0) {
296 SumN += fvol * fine_state(i,j,0,n);
298 SumP += fvol * fine_state(i,j,0,n);
303 if ( (crseTot > 0) && (crseTot > std::abs(SumN)) ) {
315 for (
int j = jlo; j <= jhi; ++j) {
316 for (
int i = ilo; i <= ihi; ++i) {
319 if (fine_state(i,j,0,n) < 0.0) {
320 fine(i,j,0,n) = -fine_state(i,j,0,n);
325 if (fine_state(i,j,0,n) > 0.0) {
326 Real alpha = (crseTot - std::abs(SumN)) / SumP;
327 fine(i,j,0,n) = alpha * fine_state(i,j,0,n);
330 Real posVal = (crseTot - std::abs(SumN)) / cvol;
331 fine(i,j,0,n) += posVal;
337 }
else if ( (crseTot > 0) && (crseTot < std::abs(SumN)) ) {
349 for (
int j = jlo; j <= jhi; ++j) {
350 for (
int i = ilo; i <= ihi; ++i) {
352 Real alpha = crseTot / std::abs(SumN);
353 if (fine_state(i,j,0,n) < 0.0) {
355 fine(i,j,0,n) = alpha * std::abs(fine_state(i,j,0,n));
364 }
else if ( (crseTot < 0) && (std::abs(crseTot) > SumP) ) {
376 for (
int j = jlo; j <= jhi; ++j) {
377 for (
int i = ilo; i <= ihi; ++i) {
380 Real negVal = (SumP + SumN + crseTot) / cvol;
381 fine(i,j,0,n) = negVal - fine_state(i,j,0,n);
386 }
else if ( (crseTot < 0) && (std::abs(crseTot) < SumP) &&
387 ((SumP+SumN+crseTot) > 0.0) ) {
397 for (
int j = jlo; j <= jhi; ++j) {
398 for (
int i = ilo; i <= ihi; ++i) {
400 if (fine_state(i,j,0,n) < 0.0) {
402 fine(i,j,0,n) = -fine_state(i,j,0,n);
405 Real alpha = (crseTot + SumN) / SumP;
406 fine(i,j,0,n) = alpha * fine_state(i,j,0,n);
412 }
else if ( (crseTot < 0) && (std::abs(crseTot) < SumP) &&
413 ((SumP+SumN+crseTot) < 0.0) ) {
425 for (
int j = jlo; j <= jhi; ++j) {
426 for (
int i = ilo; i <= ihi; ++i) {
428 if (fine_state(i,j,0,n) > 0.0) {
430 fine(i,j,0,n) = -fine_state(i,j,0,n);
433 Real alpha = (crseTot + SumP) / SumN;
434 fine(i,j,0,n) = alpha * fine_state(i,j,0,n);
445 for (
int j = jlo; j <= jhi; ++j) {
446 for (
int i = ilo; i <= ihi; ++i) {
448 for (
int n = 1; n < nvar-1; ++n) {
458 Array4<Real const>
const&
crse,
459 Array4<Real>
const&
fine)
noexcept
464 constexpr Array1D<
Real, -2, 2> cL = { -0.01171875_rt, 0.0859375_rt, 0.5_rt, -0.0859375_rt, 0.01171875_rt };
471 Array1D<
Real, -2, 2> ctmp;
472 for (
int ii = -2; ii <= 2; ++ii) {
473 ctmp(ii) = 2.0_rt * ( cL(-2)*
crse(ic+ii,jc-2,0,n)
474 + cL(-1)*
crse(ic+ii,jc-1,0,n)
475 + cL( 0)*
crse(ic+ii,jc, 0,n)
476 + cL( 1)*
crse(ic+ii,jc+1,0,n)
477 + cL( 2)*
crse(ic+ii,jc+2,0,n) );
479 ctmp(ii) = 2.0_rt *
crse(ic+ii,jc,0,n) - ctmp(ii);
483 Real ftmp = 2.0_rt * ( cL(-2)*ctmp(-2)
489 ftmp = 2.0_rt * ctmp(0) - ftmp;
492 fine(i,j,0,n) = ftmp;
#define AMREX_PRAGMA_SIMD
Definition AMReX_Extension.H:80
#define AMREX_FORCE_INLINE
Definition AMReX_Extension.H:119
#define AMREX_GPU_HOST_DEVICE
Definition AMReX_GpuQualifiers.H:20
int idir
Definition AMReX_HypreMLABecLap.cpp:1093
Array4< Real > fine
Definition AMReX_InterpFaceRegister.cpp:90
Array4< int const > mask
Definition AMReX_InterpFaceRegister.cpp:93
Array4< Real > slope
Definition AMReX_InterpFaceRegister.cpp:91
Array4< Real const > crse
Definition AMReX_InterpFaceRegister.cpp:92
@ cartesian
Definition AMReX_CoordSys.H:27
amrex_real Real
Floating Point Type for Fields.
Definition AMReX_REAL.H:79
__host__ __device__ BoxND< dim > coarsen(const BoxND< dim > &b, int ref_ratio) noexcept
Coarsen BoxND by given (positive) coarsening ratio.
Definition AMReX_Box.H:1409
Definition AMReX_Amr.cpp:49
__host__ __device__ Dim3 ubound(Array4< T > const &a) noexcept
Definition AMReX_Array4.H:319
__host__ __device__ void facediv_face_interp(int, int, int, int, int, int, Array4< T const > const &, Array4< T > const &, Array4< const int > const &, IntVect const &) noexcept
Definition AMReX_Interp_1D_C.H:75
__host__ __device__ void pcinterp_interp(Box const &bx, Array4< Real > const &fine, const int fcomp, const int ncomp, Array4< Real const > const &crse, const int ccomp, IntVect const &ratio) noexcept
Definition AMReX_Interp_1D_C.H:14
__host__ __device__ void ccprotect_2d(int ic, int jc, int, int nvar, Box const &fine_bx, IntVect const &ratio, GeometryData cs_geomdata, GeometryData fn_geomdata, Array4< T > const &fine, Array4< T const > const &fine_state) noexcept
Definition AMReX_Interp_2D_C.H:206
BoxND< 3 > Box
Box is an alias for amrex::BoxND instantiated with AMREX_SPACEDIM.
Definition AMReX_BaseFwd.H:27
__host__ __device__ void nodebilin_slopes(Box const &bx, Array4< T > const &slope, Array4< T const > const &u, const int icomp, const int ncomp, IntVect const &ratio) noexcept
Definition AMReX_Interp_1D_C.H:33
__host__ __device__ constexpr const T & min(const T &a, const T &b) noexcept
Definition AMReX_Algorithm.H:21
IntVectND< 3 > IntVect
IntVect is an alias for amrex::IntVectND instantiated with AMREX_SPACEDIM.
Definition AMReX_BaseFwd.H:30
__host__ __device__ void face_linear_interp_x(int i, int, int, int n, Array4< T > const &fine, Array4< T const > const &crse, IntVect const &ratio) noexcept
Definition AMReX_Interp_1D_C.H:97
__host__ __device__ constexpr const T & max(const T &a, const T &b) noexcept
Definition AMReX_Algorithm.H:35
__host__ __device__ void nodebilin_interp(Box const &bx, Array4< T > const &fine, const int fcomp, const int ncomp, Array4< T const > const &slope, Array4< T const > const &crse, const int ccomp, IntVect const &ratio) noexcept
Definition AMReX_Interp_1D_C.H:52
__host__ __device__ void facediv_int(int, int, int, int, GpuArray< Array4< T >, 3 > const &, IntVect const &, GpuArray< Real, 3 > const &) noexcept
Definition AMReX_Interp_1D_C.H:87
__host__ __device__ void ccquartic_interp(int i, int, int, int n, Array4< Real const > const &crse, Array4< Real > const &fine) noexcept
Definition AMReX_Interp_1D_C.H:110
__host__ __device__ void face_linear_interp_y(int i, int j, int, int n, Array4< T > const &fine, Array4< T const > const &crse, IntVect const &ratio) noexcept
Definition AMReX_Interp_2D_C.H:191
__host__ __device__ Dim3 lbound(Array4< T > const &a) noexcept
Definition AMReX_Array4.H:312
Definition AMReX_Array4.H:61
Definition AMReX_Dim3.H:12
int x
Definition AMReX_Dim3.H:12
int y
Definition AMReX_Dim3.H:12
Definition AMReX_Geometry.H:25