Block-Structured AMR Software Framework
AMReX_FilCC_3D_C.H
Go to the documentation of this file.
1 #ifndef AMREX_FILCC_3D_C_H_
2 #define AMREX_FILCC_3D_C_H_
3 #include <AMReX_Config.H>
4 
5 #include <AMReX_FArrayBox.H>
6 #include <AMReX_BCRec.H>
7 #include <AMReX_Geometry.H>
8 
9 namespace amrex {
10 
11 struct FilccCell
12 {
14  void operator() (const IntVect& iv, Array4<Real> const& q,
15  const int dcomp, const int numcomp,
16  Box const& domain_box, const BCRec* bcr,
17  const int bcomp) const noexcept
18  {
19  const int i = iv[0];
20  const int j = iv[1];
21  const int k = iv[2];
22 
23  const auto& domain_lo = domain_box.loVect();
24  const auto& domain_hi = domain_box.hiVect();
25  const int ilo = domain_lo[0];
26  const int jlo = domain_lo[1];
27  const int klo = domain_lo[2];
28  const int ihi = domain_hi[0];
29  const int jhi = domain_hi[1];
30  const int khi = domain_hi[2];
31 
32  for (int n = dcomp; n < numcomp+dcomp; ++n)
33  {
34  const BCRec& bc = bcr[bcomp+n-dcomp];
35 
36  if (i < ilo)
37  {
38  switch (bc.lo(0)) {
39  case (BCType::foextrap):
40  {
41  q(i,j,k,n) = q(ilo,j,k,n);
42  break;
43  }
44  case (BCType::hoextrap):
45  {
46  if (i < ilo - 1)
47  {
48  q(i,j,k,n) = q(ilo,j,k,n);
49  }
50  // i == ilo-1
51  else if (ilo+2 <= amrex::min(q.end.x-1,ihi))
52  {
53  q(i,j,k,n) = Real(0.125)*(Real(15.)*q(i+1,j,k,n) - Real(10.)*q(i+2,j,k,n) + Real(3.)*q(i+3,j,k,n));
54  }
55  else
56  {
57  q(i,j,k,n) = Real(0.5)*(Real(3.)*q(i+1,j,k,n) - q(i+2,j,k,n));
58  }
59  break;
60  }
61  case (BCType::hoextrapcc):
62  {
63  q(i,j,k,n) = Real(ilo-i)*(q(ilo,j,k,n) - q(ilo+1,j,k,n)) + q(ilo,j,k,n);
64  break;
65  }
66  case (BCType::reflect_even):
67  {
68  q(i,j,k,n) = q(2*ilo-i-1,j,k,n);
69  break;
70  }
71  case (BCType::reflect_odd):
72  {
73  q(i,j,k,n) = -q(2*ilo-i-1,j,k,n);
74  break;
75  }
76  default: { break; }
77  }
78  }
79  else if (i > ihi)
80  {
81  switch (bc.hi(0)) {
82  case (BCType::foextrap):
83  {
84  q(i,j,k,n) = q(ihi,j,k,n);
85  break;
86  }
87  case (BCType::hoextrap):
88  {
89  if (i > ihi + 1)
90  {
91  q(i,j,k,n) = q(ihi,j,k,n);
92  }
93  // i == ihi+1
94  else if (ihi-2 >= amrex::max(q.begin.x,ilo))
95  {
96  q(i,j,k,n) = Real(0.125)*(Real(15.)*q(i-1,j,k,n) - Real(10.)*q(i-2,j,k,n) + Real(3.)*q(i-3,j,k,n));
97  }
98  else
99  {
100  q(i,j,k,n) = Real(0.5)*(Real(3.)*q(i-1,j,k,n) - q(i-2,j,k,n));
101  }
102  break;
103  }
104  case (BCType::hoextrapcc):
105  {
106  q(i,j,k,n) = Real(i-ihi)*(q(ihi,j,k,n) - q(ihi-1,j,k,n)) + q(ihi,j,k,n);
107  break;
108  }
109  case (BCType::reflect_even):
110  {
111  q(i,j,k,n) = q(2*ihi-i+1,j,k,n);
112  break;
113  }
114  case (BCType::reflect_odd):
115  {
116  q(i,j,k,n) = -q(2*ihi-i+1,j,k,n);
117  break;
118  }
119  default: { break; }
120  }
121  }
122 
123  if (j < jlo)
124  {
125  switch (bc.lo(1)) {
126  case (BCType::foextrap):
127  {
128  q(i,j,k,n) = q(i,jlo,k,n);
129  break;
130  }
131  case (BCType::hoextrap):
132  {
133  if (j < jlo - 1)
134  {
135  q(i,j,k,n) = q(i,jlo,k,n);
136  }
137  // j == jlo-1
138  else if (jlo+2 <= amrex::min(q.end.y-1,jhi))
139  {
140  q(i,j,k,n) = Real(0.125)*(Real(15.)*q(i,j+1,k,n) - Real(10.)*q(i,j+2,k,n) + Real(3.)*q(i,j+3,k,n));
141  }
142  else
143  {
144  q(i,j,k,n) = Real(0.5)*(Real(3.)*q(i,j+1,k,n) - q(i,j+2,k,n));
145  }
146  break;
147  }
148  case (BCType::hoextrapcc):
149  {
150  q(i,j,k,n) = Real(jlo-j)*(q(i,jlo,k,n) - q(i,jlo+1,k,n)) + q(i,jlo,k,n);
151  break;
152  }
153  case (BCType::reflect_even):
154  {
155  q(i,j,k,n) = q(i,2*jlo-j-1,k,n);
156  break;
157  }
158  case (BCType::reflect_odd):
159  {
160  q(i,j,k,n) = -q(i,2*jlo-j-1,k,n);
161  break;
162  }
163  default: { break; }
164  }
165  }
166  else if (j > jhi)
167  {
168  switch (bc.hi(1)) {
169  case (BCType::foextrap):
170  {
171  q(i,j,k,n) = q(i,jhi,k,n);
172  break;
173  }
174  case (BCType::hoextrap):
175  {
176  if (j > jhi + 1)
177  {
178  q(i,j,k,n) = q(i,jhi,k,n);
179  }
180  // j == jhi+1
181  else if (jhi-2 >= amrex::max(q.begin.y,jlo))
182  {
183  q(i,j,k,n) = Real(0.125)*(Real(15.)*q(i,j-1,k,n) - Real(10.)*q(i,j-2,k,n) + Real(3.)*q(i,j-3,k,n));
184  }
185  else
186  {
187  q(i,j,k,n) = Real(0.5)*(Real(3.)*q(i,j-1,k,n) - q(i,j-2,k,n));
188  }
189  break;
190  }
191  case (BCType::hoextrapcc):
192  {
193  q(i,j,k,n) = Real(j-jhi)*(q(i,jhi,k,n) - q(i,jhi-1,k,n)) + q(i,jhi,k,n);
194  break;
195  }
196  case (BCType::reflect_even):
197  {
198  q(i,j,k,n) = q(i,2*jhi-j+1,k,n);
199  break;
200  }
201  case (BCType::reflect_odd):
202  {
203  q(i,j,k,n) = -q(i,2*jhi-j+1,k,n);
204  break;
205  }
206  default: { break; }
207  }
208  }
209 
210  if (k < klo)
211  {
212  switch (bc.lo(2)) {
213  case (BCType::foextrap):
214  {
215  q(i,j,k,n) = q(i,j,klo,n);
216  break;
217  }
218  case (BCType::hoextrap):
219  {
220  if (k < klo - 1)
221  {
222  q(i,j,k,n) = q(i,j,klo,n);
223  }
224  // k == klo-1
225  else if (klo+2 <= amrex::min(q.end.z-1,khi))
226  {
227  q(i,j,k,n) = Real(0.125)*(Real(15.)*q(i,j,k+1,n) - Real(10.)*q(i,j,k+2,n) + Real(3.)*q(i,j,k+3,n));
228  }
229  else
230  {
231  q(i,j,k,n) = Real(0.5)*(Real(3.)*q(i,j,k+1,n) - q(i,j,k+2,n));
232  }
233  break;
234  }
235  case (BCType::hoextrapcc):
236  {
237  q(i,j,k,n) = Real(klo-k)*(q(i,j,klo,n) - q(i,j,klo+1,n)) + q(i,j,klo,n);
238  break;
239  }
240  case (BCType::reflect_even):
241  {
242  q(i,j,k,n) = q(i,j,2*klo-k-1,n);
243  break;
244  }
245  case (BCType::reflect_odd):
246  {
247  q(i,j,k,n) = -q(i,j,2*klo-k-1,n);
248  break;
249  }
250  default: { break; }
251  }
252  }
253  else if (k > khi)
254  {
255  switch (bc.hi(2)) {
256  case (BCType::foextrap):
257  {
258  q(i,j,k,n) = q(i,j,khi,n);
259  break;
260  }
261  case (BCType::hoextrap):
262  {
263  if (k > khi + 1)
264  {
265  q(i,j,k,n) = q(i,j,khi,n);
266  }
267  // k == khi+1
268  else if (khi-2 >= amrex::max(q.begin.z,klo))
269  {
270  q(i,j,k,n) = Real(0.125)*(Real(15.)*q(i,j,k-1,n) - Real(10.)*q(i,j,k-2,n) + Real(3.)*q(i,j,k-3,n));
271  }
272  else
273  {
274  q(i,j,k,n) = Real(0.5)*(Real(3.)*q(i,j,k-1,n) - q(i,j,k-2,n));
275  }
276  break;
277  }
278  case (BCType::hoextrapcc):
279  {
280  q(i,j,k,n) = Real(k-khi)*(q(i,j,khi,n) - q(i,j,khi-1,n)) + q(i,j,khi,n);
281  break;
282  }
283  case (BCType::reflect_even):
284  {
285  q(i,j,k,n) = q(i,j,2*khi-k+1,n);
286  break;
287  }
288  case (BCType::reflect_odd):
289  {
290  q(i,j,k,n) = -q(i,j,2*khi-k+1,n);
291  break;
292  }
293  default: { break; }
294  }
295  }
296  }
297  }
298 };
299 
300 }
301 
302 #endif
#define AMREX_FORCE_INLINE
Definition: AMReX_Extension.H:119
#define AMREX_GPU_HOST_DEVICE
Definition: AMReX_GpuQualifiers.H:20
Boundary Condition Records. Necessary information and functions for computing boundary conditions.
Definition: AMReX_BCRec.H:17
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE const int * hi() const &noexcept
Return high-end boundary data.
Definition: AMReX_BCRec.H:106
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE const int * lo() const &noexcept
Return low-end boundary data.
Definition: AMReX_BCRec.H:100
Definition: AMReX_Amr.cpp:49
AMREX_GPU_HOST_DEVICE constexpr AMREX_FORCE_INLINE const T & max(const T &a, const T &b) noexcept
Definition: AMReX_Algorithm.H:35
AMREX_GPU_HOST_DEVICE constexpr AMREX_FORCE_INLINE const T & min(const T &a, const T &b) noexcept
Definition: AMReX_Algorithm.H:21
Definition: AMReX_Array4.H:61
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE void operator()(const IntVect &iv, Array4< Real > const &q, const int dcomp, const int numcomp, Box const &domain_box, const BCRec *bcr, const int bcomp) const noexcept
Definition: AMReX_FilCC_1D_C.H:14