1 #ifndef AMR_OPEN_BOUNDARY_H
2 #define AMR_OPEN_BOUNDARY_H
12 typedef typename Level::umap_t
umap_t;
13 typedef typename Level::lo_t
lo_t;
14 typedef typename Level::go_t
go_t;
105 template <
class Level>
116 this->abc3_m(iv, dir, map, value, mglevel, nr);
121 this->abc2_m(iv, dir, map, value, mglevel, nr);
126 this->abc1_m(iv, dir, map, value, mglevel, nr);
131 this->abc0_m(iv, dir, map, value, mglevel, nr);
136 this->robin_m(iv, dir, map, value, mglevel, nr);
142 "Order not supported.");
148 template <
class Level>
159 if ( iv[dir] == -1 ) {
165 niv[dir] = nr[dir] - 1;
166 n2iv[dir] = nr[dir] - 2;
170 scalar_t h = mglevel->cellSize(dir);
175 map[mglevel->serialize(niv)] -= 2.0 * h / d * value;
176 map[mglevel->serialize(n2iv)] += value;
180 template <
class Level>
191 if ( iv[dir] == -1 ) {
197 niv[dir] = nr[dir] - 1;
200 map[mglevel->serialize(niv)] -= value;
204 template <
class Level>
218 if ( iv[dir] == -1 ) {
227 niv[dir] = nr[dir] - 1;
228 n2iv[dir] = nr[dir] - 2;
232 scalar_t h = mglevel->cellSize(dir);
235 scalar_t x = this->coordinate_m(niv, 0, mglevel, nr) + sign * dist_m * h;
236 scalar_t y = this->coordinate_m(niv, 1, mglevel, nr) + sign * dist_m * h;
237 #if AMREX_SPACEDIM == 3
238 scalar_t z = this->coordinate_m(niv, 2, mglevel, nr) + sign * dist_m * h;
246 map[mglevel->serialize(niv)] -= 2.0 * h / d * value;
247 map[mglevel->serialize(n2iv)] += value;
251 template <
class Level>
264 if ( iv[dir] == -1 ) {
273 niv[dir] = nr[dir] - 1;
274 n2iv[dir] = nr[dir] - 2;
278 scalar_t h = mglevel->cellSize(dir);
281 scalar_t x = this->coordinate_m(niv, 0, mglevel, nr) + sign * dist_m * h;
282 scalar_t y = this->coordinate_m(niv, 1, mglevel, nr) + sign * dist_m * h;
283 #if AMREX_SPACEDIM == 3
284 scalar_t z = this->coordinate_m(niv, 2, mglevel, nr) + sign * dist_m * h;
291 map[mglevel->serialize(niv)] += 2.0 * (d * d - h * h) / ( d * d + 2.0 * h * d ) * value;
292 map[mglevel->serialize(n2iv)] += (2.0 * h - d) / (2.0 * h + d) * value;
296 template <
class Level>
312 if ( iv[dir] == -1 ) {
324 niv[dir] = nr[dir] - 1;
325 n1iv[dir] = nr[dir] - 2;
326 n2iv[dir] = nr[dir] - 3;
327 n3iv[dir] = nr[dir] - 4;
328 n4iv[dir] = nr[dir] - 5;
333 scalar_t h = mglevel->cellSize(dir);
338 scalar_t x = this->coordinate_m(niv, 0, mglevel, nr);
339 scalar_t y = this->coordinate_m(niv, 1, mglevel, nr);
340 #if AMREX_SPACEDIM == 3
341 scalar_t z = this->coordinate_m(niv, 2, mglevel, nr);
348 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;
349 map[mglevel->serialize(n1iv)] += (h / hd - d / hd - sign * d * d / ( hd * h) ) * value;
350 map[mglevel->serialize(n2iv)] += sign * 4.0 * d * d / (3.0 * h * hd) * value;
351 map[mglevel->serialize(n3iv)] -= sign * 7.0 * d * d / (9.0 * h * hd) * value;
352 map[mglevel->serialize(n4iv)] += sign * d * d / (6.0 * h * hd) * value;
356 template <
class Level>
367 scalar_t h = mglevel->cellSize(dir);
369 scalar_t lower = mglevel->geom.ProbLo(dir) + 0.5 * h;
370 scalar_t upper = mglevel->geom.ProbHi(dir) - 0.5 * h;
372 scalar_t m = (upper - lower) / ( nr[dir] - 1 );
374 return m * iv[dir] + lower;
amr::AmrIntVect_t AmrIntVect_t
scalar_t coordinate_m(const AmrIntVect_t &iv, const lo_t &dir, Level *mglevel, const go_t *nr)
The base class for all OPAL exceptions.
amrex::IntVect AmrIntVect_t
void apply(const AmrIntVect_t &iv, const lo_t &dir, umap_t &map, const scalar_t &value, Level *mglevel, const go_t *nr)
void abc2_m(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)
void abc0_m(const AmrIntVect_t &iv, const lo_t &dir, umap_t &map, const scalar_t &value, Level *mglevel, const go_t *nr)
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)
Tps< T > sqrt(const Tps< T > &x)
Square root.
amr::AmrIntVect_t AmrIntVect_t