22#ifndef AMR_OPEN_BOUNDARY_H
23#define AMR_OPEN_BOUNDARY_H
33 typedef typename Level::umap_t
umap_t;
34 typedef typename Level::lo_t
lo_t;
35 typedef typename Level::go_t
go_t;
126template <
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.");
169template <
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;
201template <
class Level>
212 if ( iv[dir] == -1 ) {
218 niv[dir] =
nr[dir] - 1;
221 map[mglevel->serialize(niv)] -= value;
225template <
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);
258#if AMREX_SPACEDIM == 3
261 scalar_t r = std::sqrt( AMREX_D_TERM(x * x, + y * y, + z * z) );
267 map[mglevel->serialize(niv)] -= 2.0 * h / d * value;
268 map[mglevel->serialize(n2iv)] += value;
272template <
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);
304#if AMREX_SPACEDIM == 3
307 scalar_t r = std::sqrt( AMREX_D_TERM(x * x, + y * y, + z * z) );
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;
317template <
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);
361#if AMREX_SPACEDIM == 3
365 scalar_t d = std::sqrt( AMREX_D_TERM(x * x, + y * y, + z * z) );
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;
377template <
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;
amrex::IntVect AmrIntVect_t
AmrBoundary(go_t nPoints)
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.