OPAL (Object Oriented Parallel Accelerator Library)  2.2.0
OPAL
AmrLagrangeInterpolater.hpp
Go to the documentation of this file.
2 
3 #if AMREX_SPACEDIM == 3
4 template <class Level>
7 
8 
9 template <class Level>
12 #endif
13 
14 // y_b y_t
15 template <class Level>
18 
19 template <class Level>
22 
23 template <class Level>
26 
27 template <class Level>
30 
31 #if AMREX_SPACEDIM == 3
32 template <class Level>
34  AmrLagrangeInterpolater<Level>::lookup3_ms[2] = {5.0 / 32.0, -3.0 / 32.0 };
35 
36 template <class Level>
38  AmrLagrangeInterpolater<Level>::lookup3r_ms[2] = {-3.0 / 32.0, 5.0 / 32.0 };
39 
40 template <class Level>
42  AmrLagrangeInterpolater<Level>::lookup4_ms[2] = {7.0 / 16.0, -9.0 / 16.0 };
43 
44 template <class Level>
46  AmrLagrangeInterpolater<Level>::lookup4r_ms[2] = {-9.0 / 16.0, 7.0 / 16.0 };
47 
48 template <class Level>
50  AmrLagrangeInterpolater<Level>::lookup5_ms[2] = {45.0 / 32.0, 21.0 / 32.0};
51 
52 template <class Level>
54  AmrLagrangeInterpolater<Level>::lookup5r_ms[2] = {21.0 / 32.0, 45.0 / 32.0};
55 
56 template <class Level>
59 
60 template <class Level>
63 #endif
64 
65 
66 
67 
68 template <class Level>
70  : AmrInterpolater<Level>( lo_t(order) + 1 )
71 { }
72 
73 
74 template <class Level>
76  const AmrIntVect_t& iv,
77  const basefab_t& fab,
78  typename Level::umap_t& map,
79  const typename Level::scalar_t& scale,
80  Level* mglevel)
81 {
82 
83 }
84 
85 
86 template <class Level>
88  const AmrIntVect_t& iv,
89  typename Level::umap_t& map,
90  const typename Level::scalar_t& scale,
91  lo_t dir, lo_t shift, const basefab_t& rfab,
92  const AmrIntVect_t& riv,
93  Level* mglevel)
94 {
95  // polynomial degree = #points - 1
96  switch ( this->nPoints_m - 1 ) {
97 
98  case Order::QUADRATIC:
99  this->crseQuadratic_m(iv, map, scale, dir, shift, rfab, riv, mglevel);
100  break;
101  case Order::LINEAR:
102  this->crseLinear_m(iv, map, scale, dir, shift, rfab, riv, mglevel);
103  break;
104  default:
105  throw OpalException("AmrLagrangeInterpolater::coarse()",
106  "Not implemented interpolation");
107  }
108 }
109 
110 
111 template <class Level>
113  const AmrIntVect_t& iv,
114  typename Level::umap_t& map,
115  const typename Level::scalar_t& scale,
116  lo_t dir, lo_t shift,
117  Level* mglevel)
118 {
119  // polynomial degree = #points - 1
120  switch ( this->nPoints_m - 1 ) {
121 
122  case Order::QUADRATIC:
123  this->fineQuadratic_m(iv, map, scale, dir, shift, mglevel);
124  break;
125  case Order::LINEAR:
126  this->fineLinear_m(iv, map, scale, dir, shift, mglevel);
127  break;
128  default:
129  throw OpalException("AmrLagrangeInterpolater::fine()",
130  "Not implemented interpolation");
131  }
132 }
133 
134 
135 template <class Level>
137  const AmrIntVect_t& iv,
138  typename Level::umap_t& map,
139  const typename Level::scalar_t& scale,
140  lo_t dir, lo_t shift,
141  Level* mglevel)
142 {
143  /*
144  * computes the ghost cell directly
145  */
146  AmrIntVect_t tmp = iv;
147  // first fine cell on refined coarse cell (closer to interface)
148  tmp[dir] += shift;
149  map[mglevel->serialize(tmp)] += 2.0 * scale;
150 
151  // second fine cell on refined coarse cell (further away from interface)
152  tmp[dir] += shift;
153  map[mglevel->serialize(tmp)] -= scale;
154 }
155 
156 
157 template <class Level>
159  const AmrIntVect_t& iv,
160  typename Level::umap_t& map,
161  const typename Level::scalar_t& scale,
162  lo_t dir, lo_t shift,
163  Level* mglevel)
164 {
165  AmrIntVect_t tmp = iv;
166  // first fine cell on refined coarse cell (closer to interface)
167  tmp[dir] += shift;
168  map[mglevel->serialize(tmp)] += 2.0 / 3.0 * scale;
169 
170  // second fine cell on refined coarse cell (further away from interface)
171  tmp[dir] += shift;
172  map[mglevel->serialize(tmp)] -= 0.2 * scale;
173 }
174 
175 
176 template <class Level>
178  const AmrIntVect_t& iv,
179  typename Level::umap_t& map,
180  const typename Level::scalar_t& scale,
181  lo_t dir, lo_t shift, const basefab_t& rfab,
182  const AmrIntVect_t& riv,
183  Level* mglevel)
184 {
185 #if AMREX_SPACEDIM == 2
186  bool top = (riv[(dir+1)%AMREX_SPACEDIM] % 2 == 1);
187 
188  // right / upper / back
189  AmrIntVect_t niv = iv;
190  niv[(dir+1)%AMREX_SPACEDIM ] += 1;
191 
192  // left / lower / front
193  AmrIntVect_t miv = iv;
194  miv[(dir+1)%AMREX_SPACEDIM ] -= 1;
195 
196  // factor for fine
197  scalar_t fac = 8.0 / 15.0 * scale;
198 
199  if ( mglevel->isValid(niv) && rfab(niv) != Level::Refined::YES ) {
200  // check r / u / b --> 1: valid; 0: not valid
201  map[mglevel->serialize(iv)] += fac * lookup2a_ms[top];
202  map[mglevel->serialize(niv)] += fac * lookup1a_ms[top];
203 
204  } else if ( mglevel->isValid(miv) && rfab(miv) != Level::Refined::YES ) {
205  // check l / f --> 1: valid; 0: not valid
206  map[mglevel->serialize(iv)] += fac * lookup2a_ms[top];
207  map[mglevel->serialize(miv)] += fac * lookup1a_ms[top];
208 
209  } else
210  throw OpalException("AmrLagrangeInterpolater::crseLinear_m()",
211  "No valid interpolation scenario found!");
212 
213 #elif AMREX_SPACEDIM == 3
214 
215  /* x y z
216  * ------------------
217  * dir: 0 1 2
218  * top1: 1 2 0 (i, L)
219  * top2: 2 0 1 (j, K)
220  */
221 
222  /* There are 4 coefficients from Lagrange interpolation.
223  * Those are given by the product of one of
224  * L0, L1 and one of K0, K1.
225  *
226  * g(x, y) = f(x0, y0) * L0(x) * K0(y) +
227  * f(x0, y1) * L0(x) * K1(y) +
228  * f(x1, y0) * L1(x) * K0(y) +
229  * f(x1, y1) * L1(x) * K1(y) +
230  */
231 
232  /*
233  * check in 3x3 area (using iv as center) if 4 cells are not covered
234  */
235  lo_t d1 = (dir+1)%AMREX_SPACEDIM;
236  lo_t d2 = (dir+2)%AMREX_SPACEDIM;
237 
238  lbits_t area;
239  lo_t bit = 0;
240 
241  AmrIntVect_t tmp = iv;
242  for (int i = -1; i < 2; ++i) {
243  tmp[d1] += i;
244  for (int j = -1; j < 2; ++j) {
245 
246  tmp[d2] += j;
247  // make use of "short-circuit evaluation"
248  area[bit] = ( mglevel->isValid(tmp) && rfab(tmp) );
249  ++bit;
250 
251  // undo
252  tmp[d2] -= j;
253  }
254  // undo
255  tmp[d1] -= i;
256  }
257 
258  qpattern_t::const_iterator pit = std::begin(this->lpattern_ms);
259 
260  while ( pit != std::end(this->lpattern_ms) ) {
261  if ( *pit == (area & lbits_t(*pit)).to_ulong() )
262  break;
263  ++pit;
264  }
265 
266  // factor for fine
267  scalar_t fac = factor_ms * scale;
268 
269  scalar_t L[2] = {0.0, 0.0};
270  lo_t top1 = riv[d1] % 2;
271 
272  scalar_t K[2] = {0.0, 0.0};
273  lo_t top2 = riv[d2] % 2;
274 
275  lo_t begin[2] = { 0, 0 };
276  lo_t end[2] = { 0, 0 };
277 
278  switch ( *pit ) {
279  case this->lpattern_ms[0]:
280  {
281  // corner top right pattern
282  L[0] = lookup1a_ms[top1]; // L_{-1}
283  L[1] = lookup2a_ms[top1]; // L_{0}
284  begin[0] = -1;
285  end[0] = 0;
286 
287  K[0] = lookup1a_ms[top2]; // K_{-1}
288  K[1] = lookup2a_ms[top2]; // K_{0}
289  begin[1] = -1;
290  end[1] = 0;
291  break;
292  }
293  case this->lpattern_ms[1]:
294  {
295  // corner bottom right pattern
296  L[0] = lookup2b_ms[top1]; // L_{0}
297  L[1] = lookup1b_ms[top1]; // L_{1}
298  begin[0] = 0;
299  end[0] = 1;
300 
301  K[0] = lookup1a_ms[top2]; // K_{-1}
302  K[1] = lookup2a_ms[top2]; // K_{0}
303  begin[1] = -1;
304  end[1] = 0;
305  break;
306  }
307  case this->lpattern_ms[2]:
308  {
309  // corner bottom left pattern
310  L[0] = lookup2b_ms[top1]; // L_{0}
311  L[1] = lookup1b_ms[top1]; // L_{1}
312  begin[0] = 0;
313  end[0] = 1;
314 
315  K[0] = lookup2b_ms[top2]; // K_{0}
316  K[1] = lookup1b_ms[top2]; // K_{1}
317  begin[1] = 0;
318  end[1] = 1;
319  break;
320  }
321  case this->lpattern_ms[3]:
322  {
323  // corner top left pattern
324  L[0] = lookup1a_ms[top1]; // L_{-1}
325  L[1] = lookup2a_ms[top1]; // L_{0}
326  begin[0] = -1;
327  end[0] = 0;
328 
329  K[0] = lookup2b_ms[top2]; // K_{0}
330  K[1] = lookup1b_ms[top2]; // K_{1}
331  begin[1] = 0;
332  end[1] = 1;
333  break;
334  }
335  default:
336  throw OpalException("AmrLagrangeInterpolater::crseLinear_m()",
337  "No valid interpolation scenario found!");
338  }
339 
340  /*
341  * if pattern is known --> add stencil
342  */
343  AmrIntVect_t niv = iv;
344  for (int i = begin[0]; i <= end[0]; ++i) {
345  niv[d1] += i;
346  for (int j = begin[1]; j <= end[1]; ++j) {
347  niv[d2] += j;
348 
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;
352 
353  // undo
354  niv[d2] -= j;
355  }
356  // undo
357  niv[d1] -= i;
358  }
359 #else
360  #error Lagrange interpolation: Only 2D and 3D are supported!
361 #endif
362  // the neighbour cancels out
363 }
364 
365 
366 template <class Level>
368  const AmrIntVect_t& iv,
369  typename Level::umap_t& map,
370  const typename Level::scalar_t& scale,
371  lo_t dir, lo_t shift, const basefab_t& rfab,
372  const AmrIntVect_t& riv,
373  Level* mglevel)
374 {
375 #if AMREX_SPACEDIM == 2
376 
377  bool top = (riv[(dir+1)%AMREX_SPACEDIM] % 2 == 1);
378 
379  // right / upper / back
380  AmrIntVect_t niv = iv;
381  niv[(dir+1)%AMREX_SPACEDIM ] += 1;
382 
383  // left / lower / front
384  AmrIntVect_t miv = iv;
385  miv[(dir+1)%AMREX_SPACEDIM ] -= 1;
386 
387  // 2nd right / upper / back
388  AmrIntVect_t n2iv = niv;
389  n2iv[(dir+1)%AMREX_SPACEDIM ] += 1;
390 
391  // 2nd left / lower / front
392  AmrIntVect_t m2iv = miv;
393  m2iv[(dir+1)%AMREX_SPACEDIM ] -= 1;
394 
395  /* 3 cases:
396  * --------
397  * r: right neighbour of iv (center of Laplacian)
398  * u: upper neighbour of iv
399  * b: back neighbour of iv
400  *
401  * l: lower / left neighbour of iv
402  * f: front neighbour of iv
403  *
404  * -1 --> not valid, error happend
405  * 0 --> r / u / b and 2nd r / u / b are valid
406  * 1 --> direct neighbours (r / u / b and l / f) of iv are valid (has priority)
407  * 2 --> l / f and 2nd l / f are valid
408  */
409 
410  // check r / u / b --> 1: valid; 0: not valid
411  bool rub = rfab(niv);
412 
413  // check l / f --> 1: valid; 0: not valid
414  bool lf = rfab(miv);
415 
416  // check 2nd r / u / b
417  bool rub2 = rfab(n2iv);
418 
419  // check 2nd l / f
420  bool lf2 = rfab(m2iv);
421 
422  if ( rub && lf )
423  {
424  /*
425  * standard case -1, +1 are not-refined nor at physical/mesh boundary
426  */
427  // cell is not refined and not at physical boundary
428 
429  // y_t or y_b
430  map[mglevel->serialize(iv)] += 0.5 * scale;
431 
432  // y_t y_b
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;
436 
437  // y_t y_b
438  value = scale * ((top) ? -0.05 : 1.0 / 12.0);
439  if ( !mglevel->applyBoundary(miv, rfab, map, value) )
440  map[mglevel->serialize(miv)] += value;
441 
442  } else if ( rub && rub2 ) {
443  /*
444  * corner case --> right / upper / back + 2nd right / upper / back
445  */
446  // y_t y_b
447  scalar_t value = scale * ((top) ? 7.0 / 20.0 : 0.75);
448  map[mglevel->serialize(iv)] += value;
449 
450  // y_t y_b
451  value = scale * ((top) ? 7.0 / 30.0 : -0.3);
452  if ( !mglevel->applyBoundary(niv, rfab, map, value) )
453  map[mglevel->serialize(niv)] += value;
454 
455  // y_t y_b
456  value = scale * ((top) ? -0.05 : 1.0 / 12.0);
457  if ( !mglevel->applyBoundary(n2iv, rfab, map, value) )
458  map[mglevel->serialize(n2iv)] += value;
459 
460  } else if ( lf && lf2 ) {
461  /*
462  * corner case --> left / lower / front + 2nd left / lower / front
463  */
464  // y_t y_b
465  scalar_t value = scale * ((top) ? 0.75 : 7.0 / 20.0);
466  map[mglevel->serialize(iv)] += value;
467 
468  // y_t y_b
469  value = scale * ((top) ? -0.3 : 7.0 / 30);
470  if ( !mglevel->applyBoundary(miv, rfab, map, value) )
471  map[mglevel->serialize(miv)] += value;
472 
473  // y_t y_b
474  value = scale * ((top) ? 1.0 / 12.0 : -0.05);
475  if ( !mglevel->applyBoundary(m2iv, rfab, map, value) )
476  map[mglevel->serialize(m2iv)] += value;
477 
478  } else {
479  /* last trial: linear Lagrange interpolation
480  * --> it throws an error if not possible
481  */
482  this->crseLinear_m(iv, map, scale, dir, shift, rfab, riv, mglevel);
483  }
484 
485 #elif AMREX_SPACEDIM == 3
486 
487  /* x y z
488  * ------------------
489  * dir: 0 1 2
490  * top1: 1 2 0 (i, L)
491  * top2: 2 0 1 (j, K)
492  */
493 
494  /* There are 9 coefficients from Lagrange interpolation.
495  * Those are given by the product of one of
496  * L0, L1, L2 and one of K0, K1, K2.
497  *
498  * g(x, y) = f(x0, y0) * L0(x) * K0(y) +
499  * f(x0, y1) * L0(x) * K1(y) +
500  * f(x0, y2) * L0(x) * K2(y) +
501  * f(x1, y0) * L1(x) * K0(y) +
502  * f(x1, y1) * L1(x) * K1(y) +
503  * f(x1, y2) * L1(x) * K2(y) +
504  * f(x2, y0) * L2(x) * K0(y) +
505  * f(x2, y1) * L2(x) * K1(y) +
506  * f(x2, y2) * L2(x) * K2(y) +
507  */
508 
509 
510  /*
511  * check in 5x5 area (using iv as center) if 9 cells are not covered
512  */
513  lo_t d1 = (dir+1)%AMREX_SPACEDIM;
514  lo_t d2 = (dir+2)%AMREX_SPACEDIM;
515 
516  qbits_t area;
517  lo_t bit = 0;
518 
519  AmrIntVect_t tmp = iv;
520  for (int i = -2; i < 3; ++i) {
521  tmp[d1] += i;
522  for (int j = -2; j < 3; ++j) {
523 
524  tmp[d2] += j;
525 
526  area[bit] = ( mglevel->isValid(tmp) && rfab(tmp) );
527  ++bit;
528 
529  // undo
530  tmp[d2] -= j;
531  }
532  // undo
533  tmp[d1] -= i;
534  }
535 
536  qpattern_t::const_iterator pit = std::begin(this->qpattern_ms);
537 
538  while ( pit != std::end(this->qpattern_ms) ) {
539  if ( *pit == (area & qbits_t(*pit)).to_ulong() )
540  break;
541  ++pit;
542  }
543 
544  // factor for fine
545  scalar_t fac = factor_ms * scale;
546 
547  scalar_t L[3] = {0.0, 0.0, 0.0};
548  lo_t top1 = riv[d1] % 2;
549 
550  scalar_t K[3] = {0.0, 0.0, 0.0};
551  lo_t top2 = riv[d2] % 2;
552 
553  lo_t begin[2] = { 0, 0 };
554  lo_t end[2] = { 0, 0 };
555 
556  switch ( *pit ) {
557  case this->qpattern_ms[0]:
558  {
559  // cross pattern
560  L[0] = lookup3_ms[top1]; // L_{-1}
561  L[1] = lookup6_ms; // L_{0}
562  L[2] = lookup3r_ms[top1]; // L_{1}
563  begin[0] = -1;
564  end[0] = 1;
565 
566  K[0] = lookup3_ms[top2]; // K_{-1}
567  K[1] = lookup6_ms; // K_{0}
568  K[2] = lookup3r_ms[top2]; // K_{1}
569  begin[1] = -1;
570  end[1] = 1;
571  break;
572  }
573  case this->qpattern_ms[1]:
574  {
575  // T pattern
576  L[0] = lookup3r_ms[top1]; // L_{-2}
577  L[1] = lookup4_ms[top1]; // L_{-1}
578  L[2] = lookup5r_ms[top1]; // L_{0}
579  begin[0] = -2;
580  end[0] = 0;
581 
582  K[0] = lookup3_ms[top2]; // K_{-1}
583  K[1] = lookup6_ms; // K_{0}
584  K[2] = lookup3r_ms[top2]; // K_{1}
585  begin[1] = -1;
586  end[1] = 1;
587  break;
588  }
589  case this->qpattern_ms[2]:
590  {
591  // right hammer pattern
592  L[0] = lookup3_ms[top1]; // L_{-1}
593  L[1] = lookup6_ms; // L_{0}
594  L[2] = lookup3r_ms[top1]; // L_{1}
595  begin[0] = -1;
596  end[0] = 1;
597 
598  K[0] = lookup3r_ms[top2]; // K_{-2}
599  K[1] = lookup4_ms[top2]; // K_{-1}
600  K[2] = lookup5r_ms[top2]; // K_{0}
601  begin[1] = -2;
602  end[1] = 0;
603  break;
604  }
605  case this->qpattern_ms[3]:
606  {
607  // T on head pattern
608  L[0] = lookup5_ms[top1]; // L_{0}
609  L[1] = lookup4r_ms[top1]; // L_{1}
610  L[2] = lookup3_ms[top1]; // L_{2}
611  begin[0] = 0;
612  end[0] = 2;
613 
614  K[0] = lookup3_ms[top2]; // K_{-1}
615  K[1] = lookup6_ms; // K_{0}
616  K[2] = lookup3r_ms[top2]; // K_{1}
617  begin[1] = -1;
618  end[1] = 1;
619  break;
620  }
621  case this->qpattern_ms[4]:
622  {
623  // left hammer pattern
624  L[0] = lookup3_ms[top1]; // L_{-1}
625  L[1] = lookup6_ms; // L_{0}
626  L[2] = lookup3r_ms[top1]; // L_{1}
627  begin[0] = -1;
628  end[0] = 1;
629 
630  K[0] = lookup5_ms[top2]; // K_{0}
631  K[1] = lookup4r_ms[top2]; // K_{1}
632  K[2] = lookup3_ms[top2]; // K_{2}
633  begin[1] = 0;
634  end[1] = 2;
635  break;
636  }
637  case this->qpattern_ms[5]:
638  {
639  // upper left corner pattern
640  L[0] = lookup3r_ms[top1]; // L_{-2}
641  L[1] = lookup4_ms[top1]; // L_{-1}
642  L[2] = lookup5r_ms[top1]; // L_{0}
643  begin[0] = -2;
644  end[0] = 0;
645 
646  K[0] = lookup5_ms[top2]; // K_{0}
647  K[1] = lookup4r_ms[top2]; // K_{1}
648  K[2] = lookup3_ms[top2]; // K_{2}
649  begin[1] = 0;
650  end[1] = 2;
651  break;
652  }
653  case this->qpattern_ms[6]:
654  {
655  // upper right corner pattern
656  L[0] = lookup3r_ms[top1]; // L_{-2}
657  L[1] = lookup4_ms[top1]; // L_{-1}
658  L[2] = lookup5r_ms[top1]; // L_{0}
659  begin[0] = -2;
660  end[0] = 0;
661 
662  K[0] = lookup3r_ms[top2]; // K_{-2}
663  K[1] = lookup4_ms[top2]; // K_{-1}
664  K[2] = lookup5r_ms[top2]; // K_{0}
665  begin[1] = -2;
666  end[1] = 0;
667  break;
668  }
669  case this->qpattern_ms[7]:
670  {
671  // mirrored L pattern
672  L[0] = lookup5_ms[top1]; // L_{0}
673  L[1] = lookup4r_ms[top1]; // L_{1}
674  L[2] = lookup3_ms[top1]; // L_{2}
675  begin[0] = 0;
676  end[0] = 2;
677 
678  K[0] = lookup3r_ms[top2]; // K_{-2}
679  K[1] = lookup4_ms[top2]; // K_{-1}
680  K[2] = lookup5r_ms[top2]; // K_{0}
681  begin[1] = -2;
682  end[1] = 0;
683  break;
684  }
685  case this->qpattern_ms[8]:
686  {
687  // L pattern
688  L[0] = lookup5_ms[top1]; // L_{0}
689  L[1] = lookup4r_ms[top1]; // L_{1}
690  L[2] = lookup3_ms[top1]; // L_{2}
691  begin[0] = 0;
692  end[0] = 2;
693 
694  K[0] = lookup5_ms[top2]; // K_{0}
695  K[1] = lookup4r_ms[top2]; // K_{1}
696  K[2] = lookup3_ms[top2]; // K_{2}
697  begin[1] = 0;
698  end[1] = 2;
699  break;
700  }
701  default:
702  {
703  /* unknown pattern --> last trial: linear Lagrange interpolation
704  * --> it throws an error if not possible
705  */
706  this->crseLinear_m(iv, map, scale, dir, shift, rfab, riv, mglevel);
707  return;
708  }
709  }
710 
711  /*
712  * if pattern is known --> add stencil
713  */
714  AmrIntVect_t tmp1 = iv;
715  for (int i = begin[0]; i <= end[0]; ++i) {
716  tmp1[d1] += i;
717  for (int j = begin[1]; j <= end[1]; ++j) {
718  tmp1[d2] += j;
719 
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;
723 
724  // undo
725  tmp1[d2] -= j;
726  }
727  // undo
728  tmp1[d1] -= i;
729  }
730 
731 #else
732  #error Lagrange interpolation: Only 2D and 3D are supported!
733 #endif
734 }
Level::basefab_t basefab_t
void stencil(const AmrIntVect_t &iv, const basefab_t &fab, umap_t &map, const scalar_t &scale, Level *mglevel)
&lt; Abstract base class for all coarse to fine cell interpolaters
The base class for all OPAL exceptions.
Definition: OpalException.h:28
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)
void fine(const AmrIntVect_t &iv, umap_t &map, const scalar_t &scale, lo_t dir, lo_t shift, Level *mglevel)
#define K
Definition: integrate.cpp:118
Level::lo_t lo_t
double scalar_t