3 #if AMREX_SPACEDIM == 3
15 template <
class Level>
19 template <
class Level>
23 template <
class Level>
27 template <
class Level>
31 #if AMREX_SPACEDIM == 3
32 template <
class Level>
36 template <
class Level>
40 template <
class Level>
44 template <
class Level>
48 template <
class Level>
52 template <
class Level>
56 template <
class Level>
60 template <
class Level>
68 template <
class Level>
74 template <
class Level>
78 typename Level::umap_t& map,
86 template <
class Level>
89 typename Level::umap_t& map,
96 switch ( this->nPoints_m - 1 ) {
98 case Order::QUADRATIC:
99 this->crseQuadratic_m(iv, map, scale, dir, shift, rfab, riv, mglevel);
102 this->crseLinear_m(iv, map, scale, dir, shift, rfab, riv, mglevel);
106 "Not implemented interpolation");
111 template <
class Level>
114 typename Level::umap_t& map,
120 switch ( this->nPoints_m - 1 ) {
122 case Order::QUADRATIC:
123 this->fineQuadratic_m(iv, map, scale, dir, shift, mglevel);
126 this->fineLinear_m(iv, map, scale, dir, shift, mglevel);
130 "Not implemented interpolation");
135 template <
class Level>
138 typename Level::umap_t& map,
149 map[mglevel->serialize(tmp)] += 2.0 * scale;
153 map[mglevel->serialize(tmp)] -= scale;
157 template <
class Level>
160 typename Level::umap_t& map,
168 map[mglevel->serialize(tmp)] += 2.0 / 3.0 * scale;
172 map[mglevel->serialize(tmp)] -= 0.2 * scale;
176 template <
class Level>
179 typename Level::umap_t& map,
185 #if AMREX_SPACEDIM == 2
186 bool top = (riv[(dir+1)%AMREX_SPACEDIM] % 2 == 1);
190 niv[(dir+1)%AMREX_SPACEDIM ] += 1;
194 miv[(dir+1)%AMREX_SPACEDIM ] -= 1;
199 if ( mglevel->isValid(niv) && rfab(niv) != Level::Refined::YES ) {
201 map[mglevel->serialize(iv)] += fac * lookup2a_ms[top];
202 map[mglevel->serialize(niv)] += fac * lookup1a_ms[top];
204 }
else if ( mglevel->isValid(miv) && rfab(miv) != Level::Refined::YES ) {
206 map[mglevel->serialize(iv)] += fac * lookup2a_ms[top];
207 map[mglevel->serialize(miv)] += fac * lookup1a_ms[top];
210 throw OpalException(
"AmrLagrangeInterpolater::crseLinear_m()",
211 "No valid interpolation scenario found!");
213 #elif AMREX_SPACEDIM == 3
235 lo_t d1 = (dir+1)%AMREX_SPACEDIM;
236 lo_t d2 = (dir+2)%AMREX_SPACEDIM;
242 for (
int i = -1; i < 2; ++i) {
244 for (
int j = -1; j < 2; ++j) {
248 area[bit] = ( mglevel->isValid(tmp) && rfab(tmp) );
258 qpattern_t::const_iterator pit = std::begin(this->lpattern_ms);
260 while ( pit != std::end(this->lpattern_ms) ) {
261 if ( *pit == (area & lbits_t(*pit)).to_ulong() )
270 lo_t top1 = riv[d1] % 2;
273 lo_t top2 = riv[d2] % 2;
275 lo_t begin[2] = { 0, 0 };
276 lo_t end[2] = { 0, 0 };
279 case this->lpattern_ms[0]:
282 L[0] = lookup1a_ms[top1];
283 L[1] = lookup2a_ms[top1];
287 K[0] = lookup1a_ms[top2];
288 K[1] = lookup2a_ms[top2];
293 case this->lpattern_ms[1]:
296 L[0] = lookup2b_ms[top1];
297 L[1] = lookup1b_ms[top1];
301 K[0] = lookup1a_ms[top2];
302 K[1] = lookup2a_ms[top2];
307 case this->lpattern_ms[2]:
310 L[0] = lookup2b_ms[top1];
311 L[1] = lookup1b_ms[top1];
315 K[0] = lookup2b_ms[top2];
316 K[1] = lookup1b_ms[top2];
321 case this->lpattern_ms[3]:
324 L[0] = lookup1a_ms[top1];
325 L[1] = lookup2a_ms[top1];
329 K[0] = lookup2b_ms[top2];
330 K[1] = lookup1b_ms[top2];
336 throw OpalException(
"AmrLagrangeInterpolater::crseLinear_m()",
337 "No valid interpolation scenario found!");
344 for (
int i = begin[0]; i <= end[0]; ++i) {
346 for (
int j = begin[1]; j <= end[1]; ++j) {
349 scalar_t value = fac * L[i-begin[0]] * K[j-begin[1]];
350 if ( !mglevel->applyBoundary(niv, rfab, map, value) )
351 map[mglevel->serialize(niv)] += value;
360 #error Lagrange interpolation: Only 2D and 3D are supported!
366 template <
class Level>
369 typename Level::umap_t& map,
375 #if AMREX_SPACEDIM == 2
377 bool top = (riv[(dir+1)%AMREX_SPACEDIM] % 2 == 1);
381 niv[(dir+1)%AMREX_SPACEDIM ] += 1;
385 miv[(dir+1)%AMREX_SPACEDIM ] -= 1;
389 n2iv[(dir+1)%AMREX_SPACEDIM ] += 1;
393 m2iv[(dir+1)%AMREX_SPACEDIM ] -= 1;
411 bool rub = rfab(niv);
417 bool rub2 = rfab(n2iv);
420 bool lf2 = rfab(m2iv);
430 map[mglevel->serialize(iv)] += 0.5 * scale;
433 scalar_t value = scale * ((top) ? 1.0 / 12.0 : -0.05);
434 if ( !mglevel->applyBoundary(niv, rfab, map, value) )
435 map[mglevel->serialize(niv)] += value;
438 value = scale * ((top) ? -0.05 : 1.0 / 12.0);
439 if ( !mglevel->applyBoundary(miv, rfab, map, value) )
440 map[mglevel->serialize(miv)] += value;
442 }
else if ( rub && rub2 ) {
447 scalar_t value = scale * ((top) ? 7.0 / 20.0 : 0.75);
448 map[mglevel->serialize(iv)] += value;
451 value = scale * ((top) ? 7.0 / 30.0 : -0.3);
452 if ( !mglevel->applyBoundary(niv, rfab, map, value) )
453 map[mglevel->serialize(niv)] += value;
456 value = scale * ((top) ? -0.05 : 1.0 / 12.0);
457 if ( !mglevel->applyBoundary(n2iv, rfab, map, value) )
458 map[mglevel->serialize(n2iv)] += value;
460 }
else if ( lf && lf2 ) {
465 scalar_t value = scale * ((top) ? 0.75 : 7.0 / 20.0);
466 map[mglevel->serialize(iv)] += value;
469 value = scale * ((top) ? -0.3 : 7.0 / 30);
470 if ( !mglevel->applyBoundary(miv, rfab, map, value) )
471 map[mglevel->serialize(miv)] += value;
474 value = scale * ((top) ? 1.0 / 12.0 : -0.05);
475 if ( !mglevel->applyBoundary(m2iv, rfab, map, value) )
476 map[mglevel->serialize(m2iv)] += value;
482 this->crseLinear_m(iv, map, scale, dir, shift, rfab, riv, mglevel);
485 #elif AMREX_SPACEDIM == 3
513 lo_t d1 = (dir+1)%AMREX_SPACEDIM;
514 lo_t d2 = (dir+2)%AMREX_SPACEDIM;
520 for (
int i = -2; i < 3; ++i) {
522 for (
int j = -2; j < 3; ++j) {
526 area[bit] = ( mglevel->isValid(tmp) && rfab(tmp) );
536 qpattern_t::const_iterator pit = std::begin(this->qpattern_ms);
538 while ( pit != std::end(this->qpattern_ms) ) {
539 if ( *pit == (area & qbits_t(*pit)).to_ulong() )
548 lo_t top1 = riv[d1] % 2;
551 lo_t top2 = riv[d2] % 2;
553 lo_t begin[2] = { 0, 0 };
554 lo_t end[2] = { 0, 0 };
557 case this->qpattern_ms[0]:
560 L[0] = lookup3_ms[top1];
562 L[2] = lookup3r_ms[top1];
566 K[0] = lookup3_ms[top2];
568 K[2] = lookup3r_ms[top2];
573 case this->qpattern_ms[1]:
576 L[0] = lookup3r_ms[top1];
577 L[1] = lookup4_ms[top1];
578 L[2] = lookup5r_ms[top1];
582 K[0] = lookup3_ms[top2];
584 K[2] = lookup3r_ms[top2];
589 case this->qpattern_ms[2]:
592 L[0] = lookup3_ms[top1];
594 L[2] = lookup3r_ms[top1];
598 K[0] = lookup3r_ms[top2];
599 K[1] = lookup4_ms[top2];
600 K[2] = lookup5r_ms[top2];
605 case this->qpattern_ms[3]:
608 L[0] = lookup5_ms[top1];
609 L[1] = lookup4r_ms[top1];
610 L[2] = lookup3_ms[top1];
614 K[0] = lookup3_ms[top2];
616 K[2] = lookup3r_ms[top2];
621 case this->qpattern_ms[4]:
624 L[0] = lookup3_ms[top1];
626 L[2] = lookup3r_ms[top1];
630 K[0] = lookup5_ms[top2];
631 K[1] = lookup4r_ms[top2];
632 K[2] = lookup3_ms[top2];
637 case this->qpattern_ms[5]:
640 L[0] = lookup3r_ms[top1];
641 L[1] = lookup4_ms[top1];
642 L[2] = lookup5r_ms[top1];
646 K[0] = lookup5_ms[top2];
647 K[1] = lookup4r_ms[top2];
648 K[2] = lookup3_ms[top2];
653 case this->qpattern_ms[6]:
656 L[0] = lookup3r_ms[top1];
657 L[1] = lookup4_ms[top1];
658 L[2] = lookup5r_ms[top1];
662 K[0] = lookup3r_ms[top2];
663 K[1] = lookup4_ms[top2];
664 K[2] = lookup5r_ms[top2];
669 case this->qpattern_ms[7]:
672 L[0] = lookup5_ms[top1];
673 L[1] = lookup4r_ms[top1];
674 L[2] = lookup3_ms[top1];
678 K[0] = lookup3r_ms[top2];
679 K[1] = lookup4_ms[top2];
680 K[2] = lookup5r_ms[top2];
685 case this->qpattern_ms[8]:
688 L[0] = lookup5_ms[top1];
689 L[1] = lookup4r_ms[top1];
690 L[2] = lookup3_ms[top1];
694 K[0] = lookup5_ms[top2];
695 K[1] = lookup4r_ms[top2];
696 K[2] = lookup3_ms[top2];
706 this->crseLinear_m(iv, map, scale, dir, shift, rfab, riv, mglevel);
715 for (
int i = begin[0]; i <= end[0]; ++i) {
717 for (
int j = begin[1]; j <= end[1]; ++j) {
720 scalar_t value = fac * L[i-begin[0]] * K[j-begin[1]];
721 if ( !mglevel->applyBoundary(tmp1, rfab, map, value) )
722 map[mglevel->serialize(tmp1)] += value;
732 #error Lagrange interpolation: Only 2D and 3D are supported!
Level::basefab_t basefab_t
void stencil(const AmrIntVect_t &iv, const basefab_t &fab, umap_t &map, const scalar_t &scale, Level *mglevel)
< Abstract base class for all coarse to fine cell interpolaters
The base class for all OPAL exceptions.
void crseLinear_m(const AmrIntVect_t &iv, umap_t &map, const scalar_t &scale, lo_t dir, lo_t shift, const basefab_t &rfab, const AmrIntVect_t &riv, Level *mglevel)
amr::AmrIntVect_t AmrIntVect_t
void coarse(const AmrIntVect_t &iv, umap_t &map, const scalar_t &scale, lo_t dir, lo_t shift, const basefab_t &rfab, const AmrIntVect_t &riv, Level *mglevel)
void fineLinear_m(const AmrIntVect_t &iv, umap_t &map, const scalar_t &scale, lo_t dir, lo_t shift, Level *mglevel)
void crseQuadratic_m(const AmrIntVect_t &iv, umap_t &map, const scalar_t &scale, lo_t dir, lo_t shift, const basefab_t &rfab, const AmrIntVect_t &riv, Level *mglevel)
void fineQuadratic_m(const AmrIntVect_t &iv, umap_t &map, const scalar_t &scale, lo_t dir, lo_t shift, Level *mglevel)
AmrLagrangeInterpolater(Order order)
void fine(const AmrIntVect_t &iv, umap_t &map, const scalar_t &scale, lo_t dir, lo_t shift, Level *mglevel)