Block-Structured AMR Software Framework
 
Loading...
Searching...
No Matches
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
9namespace amrex {
10
11struct 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 AMREX_FORCE_INLINE constexpr const T & min(const T &a, const T &b) noexcept
Definition AMReX_Algorithm.H:21
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE constexpr const T & max(const T &a, const T &b) noexcept
Definition AMReX_Algorithm.H:35
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