22 #ifndef AMR_OPEN_BOUNDARY_H
23 #define AMR_OPEN_BOUNDARY_H
29 template <
class Level>
33 typedef typename Level::umap_t
umap_t;
34 typedef typename Level::lo_t
lo_t;
35 typedef typename Level::go_t
go_t;
126 template <
class Level>
137 this->abc3_m(iv, dir, map, value, mglevel,
nr);
142 this->abc2_m(iv, dir, map, value, mglevel,
nr);
147 this->abc1_m(iv, dir, map, value, mglevel,
nr);
152 this->abc0_m(iv, dir, map, value, mglevel,
nr);
157 this->robin_m(iv, dir, map, value, mglevel,
nr);
163 "Order not supported.");
169 template <
class Level>
180 if ( iv[dir] == -1 ) {
186 niv[dir] =
nr[dir] - 1;
187 n2iv[dir] =
nr[dir] - 2;
191 scalar_t h = mglevel->cellSize(dir);
196 map[mglevel->serialize(niv)] -= 2.0 * h / d * value;
197 map[mglevel->serialize(n2iv)] += value;
201 template <
class Level>
212 if ( iv[dir] == -1 ) {
218 niv[dir] =
nr[dir] - 1;
221 map[mglevel->serialize(niv)] -= value;
225 template <
class Level>
239 if ( iv[dir] == -1 ) {
248 niv[dir] =
nr[dir] - 1;
249 n2iv[dir] =
nr[dir] - 2;
253 scalar_t h = mglevel->cellSize(dir);
256 scalar_t x = this->coordinate_m(niv, 0, mglevel,
nr) +
sign * dist_m * h;
257 scalar_t y = this->coordinate_m(niv, 1, mglevel,
nr) +
sign * dist_m * h;
258 #if AMREX_SPACEDIM == 3
259 scalar_t z = this->coordinate_m(niv, 2, mglevel,
nr) +
sign * dist_m * h;
267 map[mglevel->serialize(niv)] -= 2.0 * h / d * value;
268 map[mglevel->serialize(n2iv)] += value;
272 template <
class Level>
285 if ( iv[dir] == -1 ) {
294 niv[dir] =
nr[dir] - 1;
295 n2iv[dir] =
nr[dir] - 2;
299 scalar_t h = mglevel->cellSize(dir);
302 scalar_t x = this->coordinate_m(niv, 0, mglevel,
nr) +
sign * dist_m * h;
303 scalar_t y = this->coordinate_m(niv, 1, mglevel,
nr) +
sign * dist_m * h;
304 #if AMREX_SPACEDIM == 3
305 scalar_t z = this->coordinate_m(niv, 2, mglevel,
nr) +
sign * dist_m * h;
312 map[mglevel->serialize(niv)] += 2.0 * (d * d - h * h) / ( d * d + 2.0 * h * d ) * value;
313 map[mglevel->serialize(n2iv)] += (2.0 * h - d) / (2.0 * h + d) * value;
317 template <
class Level>
333 if ( iv[dir] == -1 ) {
345 niv[dir] =
nr[dir] - 1;
346 n1iv[dir] =
nr[dir] - 2;
347 n2iv[dir] =
nr[dir] - 3;
348 n3iv[dir] =
nr[dir] - 4;
349 n4iv[dir] =
nr[dir] - 5;
354 scalar_t h = mglevel->cellSize(dir);
359 scalar_t x = this->coordinate_m(niv, 0, mglevel,
nr);
360 scalar_t y = this->coordinate_m(niv, 1, mglevel,
nr);
361 #if AMREX_SPACEDIM == 3
362 scalar_t z = this->coordinate_m(niv, 2, mglevel,
nr);
369 map[mglevel->serialize(niv)] += (2.0 * d / hd - 2.0 * h * h / (3.0 * d * hd) +
sign * 5.0 * d * d / (18.0 * h * hd)) * value;
370 map[mglevel->serialize(n1iv)] += (h / hd - d / hd -
sign * d * d / ( hd * h) ) * value;
371 map[mglevel->serialize(n2iv)] +=
sign * 4.0 * d * d / (3.0 * h * hd) * value;
372 map[mglevel->serialize(n3iv)] -=
sign * 7.0 * d * d / (9.0 * h * hd) * value;
373 map[mglevel->serialize(n4iv)] +=
sign * d * d / (6.0 * h * hd) * value;
377 template <
class Level>
388 scalar_t h = mglevel->cellSize(dir);
390 scalar_t lower = mglevel->geom.ProbLo(dir) + 0.5 * h;
391 scalar_t upper = mglevel->geom.ProbHi(dir) - 0.5 * h;
393 scalar_t m = (upper - lower) / (
nr[dir] - 1 );
395 return m * iv[dir] + lower;
Tps< T > sqrt(const Tps< T > &x)
Square root.
amrex::IntVect AmrIntVect_t
amr::AmrIntVect_t AmrIntVect_t
void abc2_m(const AmrIntVect_t &iv, const lo_t &dir, umap_t &map, const scalar_t &value, Level *mglevel, const go_t *nr)
amr::AmrIntVect_t AmrIntVect_t
void robin_m(const AmrIntVect_t &iv, const lo_t &dir, umap_t &map, const scalar_t &value, Level *mglevel, const go_t *nr)
void abc1_m(const AmrIntVect_t &iv, const lo_t &dir, umap_t &map, const scalar_t &value, Level *mglevel, const go_t *nr)
void apply(const AmrIntVect_t &iv, const lo_t &dir, umap_t &map, const scalar_t &value, Level *mglevel, const go_t *nr)
void abc3_m(const AmrIntVect_t &iv, const lo_t &dir, umap_t &map, const scalar_t &value, Level *mglevel, const go_t *nr)
scalar_t coordinate_m(const AmrIntVect_t &iv, const lo_t &dir, Level *mglevel, const go_t *nr)
void abc0_m(const AmrIntVect_t &iv, const lo_t &dir, umap_t &map, const scalar_t &value, Level *mglevel, const go_t *nr)
The base class for all OPAL exceptions.