OPAL (Object Oriented Parallel Accelerator Library)  2.2.0
OPAL
AmrTrilinearInterpolater.hpp
Go to the documentation of this file.
1 template <class Level>
3  : AmrInterpolater<Level>(2 << (AMREX_SPACEDIM - 1))
4 { }
5 
6 
7 template <class Level>
9  const AmrIntVect_t& iv,
10  const basefab_t& fab,
11  umap_t& map,
12  const scalar_t& scale,
13  Level* mglevel)
14 {
15  /* lower left coarse cell (i, j, k)
16  * floor( i - 0.5 ) / rr[0]
17  * floor( j - 0.5 ) / rr[1]
18  * floor( k - 0.5 ) / rr[2]
19  */
20  AmrIntVect_t civ;
21  for (int d = 0; d < AMREX_SPACEDIM; ++d) {
22 
23  scalar_t tmp = iv[d] - 0.5;
24  if ( std::signbit(tmp) )
25  civ[d] = std::floor(tmp);
26  else
27  civ[d] = tmp;
28  }
29 
30  civ.coarsen(mglevel->refinement());
31 
32  // ref ratio 2 only
33  scalar_t dx = 0.5 * ( iv[0] - civ[0] * 2 ) - 0.25;
34  scalar_t dy = 0.5 * ( iv[1] - civ[1] * 2 ) - 0.25;
35 #if AMREX_SPACEDIM == 3
36  scalar_t dz = 0.5 * ( iv[2] - civ[2] * 2 ) - 0.25;
37 #endif
38 
39  scalar_t xdiff = 1.0 - dx;
40  scalar_t ydiff = 1.0 - dy;
41 #if AMREX_SPACEDIM == 3
42  scalar_t zdiff = 1.0 - dz;
43 #endif
44  // (i, j, k)
45  go_t crse_gidx = mglevel->serialize(civ);
46  scalar_t value = AMREX_D_TERM(xdiff, * ydiff, * zdiff) * scale;
47 
48  if ( !mglevel->applyBoundary(civ, fab, map, value) )
49  map[crse_gidx] += value;
50 
51  // (i+1, j, k)
52  AmrIntVect_t tmp(D_DECL(civ[0]+1, civ[1], civ[2]));
53  value = AMREX_D_TERM(dx, * ydiff, * zdiff) * scale;
54  if ( !mglevel->applyBoundary(tmp, map, value) )
55  map[mglevel->serialize(tmp)] += value;
56 
57  // (i, j+1, k)
58  tmp = AmrIntVect_t(D_DECL(civ[0], civ[1]+1, civ[2]));
59  value = AMREX_D_TERM(xdiff, * dy, * zdiff) * scale;
60  if ( !mglevel->applyBoundary(tmp, map, value) )
61  map[mglevel->serialize(tmp)] += value;
62 
63  // (i+1, j+1, k)
64  tmp = AmrIntVect_t(D_DECL(civ[0]+1, civ[1]+1, civ[2]));
65  value = AMREX_D_TERM(dx, * dy, * zdiff) * scale;
66  if ( !mglevel->applyBoundary(tmp, map, value) )
67  map[mglevel->serialize(tmp)] += value;
68 
69 #if AMREX_SPACEDIM == 3
70  // (i, j, k+1)
71  tmp = AmrIntVect_t(D_DECL(civ[0], civ[1], civ[2]+1));
72  value = AMREX_D_TERM(xdiff, * ydiff, * dz) * scale;
73  if ( !mglevel->applyBoundary(tmp, map, value) )
74  map[mglevel->serialize(tmp)] += value;
75 
76  // (i+1, j, k+1)
77  tmp = AmrIntVect_t(D_DECL(civ[0]+1, civ[1], civ[2]+1));
78  value = AMREX_D_TERM(dx, * ydiff, * dz) * scale;
79  if ( !mglevel->applyBoundary(tmp, map, value) )
80  map[mglevel->serialize(tmp)] += value;
81 
82  // (i, j+1, k+1)
83  tmp = AmrIntVect_t(D_DECL(civ[0], civ[1]+1, civ[2]+1));
84  value = AMREX_D_TERM(xdiff, * dy, * dz) * scale;
85  if ( !mglevel->applyBoundary(tmp, map, value) )
86  map[mglevel->serialize(tmp)] += value;
87 
88  // (i+1, j+1, k+1)
89  tmp = AmrIntVect_t(D_DECL(civ[0]+1, civ[1]+1, civ[2]+1));
90  value = AMREX_D_TERM(dx, * dy, * dz) * scale;
91  if ( !mglevel->applyBoundary(tmp, map, value) )
92  map[mglevel->serialize(tmp)] += value;
93 #endif
94 }
95 
96 
97 template <class Level>
99  const AmrIntVect_t& iv,
100  umap_t& map,
101  const scalar_t& scale,
102  lo_t dir, lo_t shift, const basefab_t& rfab,
103  const AmrIntVect_t& riv,
104  Level* mglevel)
105 {
106  // do nothing
107 }
108 
109 
110 template <class Level>
112  const AmrIntVect_t& iv,
113  umap_t& map,
114  const scalar_t& scale,
115  lo_t dir, lo_t shift, const basefab_t& fab,
116  Level* mglevel)
117 {
118  /*
119  * The AmrTrilinearInterpolater interpolates directly to the
120  * fine ghost cell.
121  */
122  this->stencil(iv, fab, map, scale, mglevel);
123 }
Level::basefab_t basefab_t
&lt; Abstract base class for all coarse to fine cell interpolaters
void fine(const AmrIntVect_t &iv, umap_t &map, const scalar_t &scale, lo_t dir, lo_t shift, const basefab_t &fab, Level *mglevel)
amrex::IntVect AmrIntVect_t
Definition: AmrDefs.h:28
Level::scalar_t scalar_t
amr::AmrIntVect_t AmrIntVect_t
Level::umap_t umap_t
Level::go_t go_t
void stencil(const AmrIntVect_t &iv, const basefab_t &fab, umap_t &map, const scalar_t &scale, Level *mglevel)
void coarse(const AmrIntVect_t &iv, umap_t &map, const scalar_t &scale, lo_t dir, lo_t shift, const basefab_t &rfab, const AmrIntVect_t &riv, Level *mglevel)
Level::lo_t lo_t
PETE_TUTree< FnFloor, typename T::PETE_Expr_t > floor(const PETE_Expr< T > &l)
Definition: PETE.h:816