159 int* entry_offset,
Real* entry_values,
171 if (fine_mask(i,j,k)) {
173 for (
int m = 1; m < 2*AMREX_SPACEDIM+1; ++m) {
174 stencil(i,j,k)[m] =
Real(0.0);
176 }
else if (nentries_to(i,j,k) > 0) {
177 int const fromoff = offset_from(i,j,k);
181 nentries[fromoff] = nentries_to(i,j,k);
182 int const tooff = offset_to(i,j,k);
183 entry_offset[fromoff] = tooff;
189 bool corner[3] = {
false,
false,
false};
190 if ((fine_mask(i-1,j,k) || fine_mask(i+1,j,k)) &&
191 (! fine_mask(i,j-1,k-1)) &&
192 (! fine_mask(i,j+1,k-1)) &&
193 (! fine_mask(i,j-1,k+1)) &&
194 (! fine_mask(i,j+1,k+1)) &&
195 ( crse_mask(i,j-1,k-1)) &&
196 ( crse_mask(i,j+1,k-1)) &&
197 ( crse_mask(i,j-1,k+1)) &&
198 ( crse_mask(i,j+1,k+1)))
202 if((fine_mask(i,j-1,k) || fine_mask(i,j+1,k)) &&
203 (! fine_mask(i-1,j,k-1)) &&
204 (! fine_mask(i+1,j,k-1)) &&
205 (! fine_mask(i-1,j,k+1)) &&
206 (! fine_mask(i+1,j,k+1)) &&
207 ( crse_mask(i-1,j,k-1)) &&
208 ( crse_mask(i+1,j,k-1)) &&
209 ( crse_mask(i-1,j,k+1)) &&
210 ( crse_mask(i+1,j,k+1)))
214 if((fine_mask(i,j,k-1) || fine_mask(i,j,k+1)) &&
215 (! fine_mask(i-1,j-1,k)) &&
216 (! fine_mask(i+1,j-1,k)) &&
217 (! fine_mask(i-1,j+1,k)) &&
218 (! fine_mask(i+1,j+1,k)) &&
219 ( crse_mask(i-1,j-1,k)) &&
220 ( crse_mask(i+1,j-1,k)) &&
221 ( crse_mask(i-1,j+1,k)) &&
222 ( crse_mask(i+1,j+1,k)))
226 int nentries_c = 4 * (int(corner[0]) + int(corner[1]) + int(corner[2]));
227 int foff = tooff + nentries_c;
236 if (fine_mask(i,j,k-1)) {
237 stencil(i,j,k)[0] += stencil(i,j,k)[5];
238 stencil(i,j,k)[5] =
Real(0.0);
246 poly_interp_coeff<3>(dzf*
Real(-0.5), zz, cc);
247 for (
int iry = 0; iry < rr[1]; ++iry) {
248 for (
int irx = 0; irx < rr[0]; ++irx) {
249 Real bzm = bz ? bz[offset_bz(i,j,k)+irx+iry*rr[0]] :
Real(1.0);
250 Real fac = sb*dzcinv*dzfinv*bzm/
Real(rr[0]*rr[1]);
259 entry_values[foff+irx+iry*rr[0] ] += fac* cc[2];
260 entry_values[foff+irx+iry*rr[0]+rr[0]*rr[1]] += fac*(cc[1]-
Real(1.0));
265 Real fac0 = fac*cc[0];
268 if ( fine_mask(i-1,j,k) ||
272 stencil(i,j,k)[2] += fac0*
Real(0.5)*
x;
273 }
else if ( fine_mask(i+1,j,k) ||
274 !crse_mask(i+1,j,k)) {
276 stencil(i,j,k)[1] += fac0*
Real(-0.5)*
x;
279 stencil(i,j,k)[1] += fac0*
Real(0.5)*
x*(
x-
Real(1.0));
280 stencil(i,j,k)[2] += fac0*
Real(0.5)*
x*(
x+
Real(1.0));
283 if ( fine_mask(i,j-1,k) ||
287 stencil(i,j,k)[4] += fac0*
Real(0.5)*
y;
288 }
else if ( fine_mask(i,j+1,k) ||
289 !crse_mask(i,j+1,k)) {
291 stencil(i,j,k)[3] += fac0*
Real(-0.5)*
y;
294 stencil(i,j,k)[3] += fac0*
Real(0.5)*
y*(
y-
Real(1.0));
295 stencil(i,j,k)[4] += fac0*
Real(0.5)*
y*(
y+
Real(1.0));
298 stencil(i,j,k)[0] += fac0*s0;
301 int offset = tooff + (corner[0] ? 2 : 0) + (corner[1] ? 2 : 0);
308 foff += 2*rr[0]*rr[1];
311 if (fine_mask(i,j-1,k)) {
312 stencil(i,j,k)[0] += stencil(i,j,k)[3];
313 stencil(i,j,k)[3] =
Real(0.0);
321 poly_interp_coeff<3>(dyf*
Real(-0.5), yy, cc);
322 for (
int irz = 0; irz < rr[2]; ++irz) {
323 for (
int irx = 0; irx < rr[0]; ++irx) {
324 Real bym = by ? by[offset_by(i,j,k)+irx+irz*rr[0]] :
Real(1.0);
325 Real fac = sb*dycinv*dyfinv*bym/
Real(rr[0]*rr[2]);
334 entry_values[foff+irx +irz*rr[0]*2] += fac* cc[2];
335 entry_values[foff+irx+rr[0]+irz*rr[0]*2] += fac*(cc[1]-
Real(1.0));
340 Real fac0 = fac*cc[0];
343 if ( fine_mask(i-1,j,k) ||
347 stencil(i,j,k)[2] += fac0*
Real(0.5)*
x;
348 }
else if ( fine_mask(i+1,j,k) ||
349 !crse_mask(i+1,j,k)) {
351 stencil(i,j,k)[1] += fac0*
Real(-0.5)*
x;
354 stencil(i,j,k)[1] += fac0*
Real(0.5)*
x*(
x-
Real(1.0));
355 stencil(i,j,k)[2] += fac0*
Real(0.5)*
x*(
x+
Real(1.0));
358 if ( fine_mask(i,j,k-1) ||
362 stencil(i,j,k)[6] += fac0*
Real(0.5)*
z;
363 }
else if ( fine_mask(i,j,k+1) ||
364 !crse_mask(i,j,k+1)) {
366 stencil(i,j,k)[5] += fac0*
Real(-0.5)*
z;
369 stencil(i,j,k)[5] += fac0*
Real(0.5)*
z*(
z-
Real(1.0));
370 stencil(i,j,k)[6] += fac0*
Real(0.5)*
z*(
z+
Real(1.0));
373 stencil(i,j,k)[0] += fac0*s0;
376 int offset = tooff + (corner[0] ? 1 : 0);
379 if (corner[0]) {
offset += 2; }
380 if (corner[2]) {
offset += 4; }
385 foff += 2*rr[0]*rr[2];
388 if (fine_mask(i-1,j,k)) {
389 stencil(i,j,k)[0] += stencil(i,j,k)[1];
390 stencil(i,j,k)[1] =
Real(0.0);
398 poly_interp_coeff<3>(dxf*
Real(-0.5), xx, cc);
399 for (
int irz = 0; irz < rr[2]; ++irz) {
400 for (
int iry = 0; iry < rr[1]; ++iry) {
401 Real bxm = bx ? bx[offset_bx(i,j,k)+iry+irz*rr[1]] :
Real(1.0);
402 Real fac = sb*dxcinv*dxfinv*bxm/
Real(rr[1]*rr[2]);
411 entry_values[foff++] = fac* cc[2];
412 entry_values[foff++] = fac*(cc[1] -
Real(1.0));
417 Real fac0 = fac*cc[0];
420 if ( fine_mask(i,j-1,k) ||
424 stencil(i,j,k)[4] += fac0*
Real(0.5)*
y;
425 }
else if ( fine_mask(i,j+1,k) ||
426 !crse_mask(i,j+1,k)) {
428 stencil(i,j,k)[3] += fac0*
Real(-0.5)*
y;
431 stencil(i,j,k)[3] += fac0*
Real(0.5)*
y*(
y-
Real(1.0));
432 stencil(i,j,k)[4] += fac0*
Real(0.5)*
y*(
y+
Real(1.0));
435 if ( fine_mask(i,j,k-1) ||
439 stencil(i,j,k)[6] += fac0*
Real(0.5)*
z;
440 }
else if ( fine_mask(i,j,k+1) ||
441 !crse_mask(i,j,k+1)) {
443 stencil(i,j,k)[5] += fac0*
Real(-0.5)*
z;
446 stencil(i,j,k)[5] += fac0*
Real(0.5)*
z*(
z-
Real(1.0));
447 stencil(i,j,k)[6] += fac0*
Real(0.5)*
z*(
z+
Real(1.0));
450 stencil(i,j,k)[0] += fac0*s0;
455 if (corner[1]) {
offset += 2; }
457 if (corner[2]) {
offset += 4; }
459 if (corner[1]) {
offset += 2; }
465 if (fine_mask(i+1,j,k)) {
466 stencil(i,j,k)[0] += stencil(i,j,k)[2];
467 stencil(i,j,k)[2] =
Real(0.0);
475 poly_interp_coeff<3>(dxf*
Real(-0.5), xx, cc);
476 for (
int irz = 0; irz < rr[2]; ++irz) {
477 for (
int iry = 0; iry < rr[1]; ++iry) {
478 Real bxp = bx ? bx[offset_bx(i+1,j,k)+iry+irz*rr[1]] :
Real(1.0);
479 Real fac = sb*dxcinv*dxfinv*bxp/
Real(rr[1]*rr[2]);
487 entry_values[foff++] = fac*(cc[1] -
Real(1.0));
488 entry_values[foff++] = fac* cc[2];
493 Real fac0 = fac*cc[0];
496 if ( fine_mask(i,j-1,k) ||
500 stencil(i,j,k)[4] += fac0*
Real(0.5)*
y;
501 }
else if ( fine_mask(i,j+1,k) ||
502 !crse_mask(i,j+1,k)) {
504 stencil(i,j,k)[3] += fac0*
Real(-0.5)*
y;
507 stencil(i,j,k)[3] += fac0*
Real(0.5)*
y*(
y-
Real(1.0));
508 stencil(i,j,k)[4] += fac0*
Real(0.5)*
y*(
y+
Real(1.0));
511 if ( fine_mask(i,j,k-1) ||
515 stencil(i,j,k)[6] += fac0*
Real(0.5)*
z;
516 }
else if ( fine_mask(i,j,k+1) ||
517 !crse_mask(i,j,k+1)) {
519 stencil(i,j,k)[5] += fac0*
Real(-0.5)*
z;
522 stencil(i,j,k)[5] += fac0*
Real(0.5)*
z*(
z-
Real(1.0));
523 stencil(i,j,k)[6] += fac0*
Real(0.5)*
z*(
z+
Real(1.0));
526 stencil(i,j,k)[0] += fac0*s0;
531 if (corner[1]) {
offset += 2; }
533 if (corner[2]) {
offset += 4; }
535 if (corner[1]) {
offset += 2; }
541 if (fine_mask(i,j+1,k)) {
542 stencil(i,j,k)[0] += stencil(i,j,k)[4];
543 stencil(i,j,k)[4] =
Real(0.0);
551 poly_interp_coeff<3>(dyf*
Real(-0.5), yy, cc);
552 for (
int irz = 0; irz < rr[2]; ++irz) {
553 for (
int irx = 0; irx < rr[0]; ++irx) {
554 Real byp = by ? by[offset_by(i,j+1,k)+irx+irz*rr[0]] :
Real(1.0);
555 Real fac = sb*dycinv*dyfinv*byp/
Real(rr[0]*rr[2]);
564 entry_values[foff+irx +irz*rr[0]*2] += fac*(cc[1]-
Real(1.0));
565 entry_values[foff+irx+rr[0]+irz*rr[0]*2] += fac* cc[2];
570 Real fac0 = fac*cc[0];
573 if ( fine_mask(i-1,j,k) ||
577 stencil(i,j,k)[2] += fac0*
Real(0.5)*
x;
578 }
else if ( fine_mask(i+1,j,k) ||
579 !crse_mask(i+1,j,k)) {
581 stencil(i,j,k)[1] += fac0*
Real(-0.5)*
x;
584 stencil(i,j,k)[1] += fac0*
Real(0.5)*
x*(
x-
Real(1.0));
585 stencil(i,j,k)[2] += fac0*
Real(0.5)*
x*(
x+
Real(1.0));
588 if ( fine_mask(i,j,k-1) ||
592 stencil(i,j,k)[6] += fac0*
Real(0.5)*
z;
593 }
else if ( fine_mask(i,j,k+1) ||
594 !crse_mask(i,j,k+1)) {
596 stencil(i,j,k)[5] += fac0*
Real(-0.5)*
z;
599 stencil(i,j,k)[5] += fac0*
Real(0.5)*
z*(
z-
Real(1.0));
600 stencil(i,j,k)[6] += fac0*
Real(0.5)*
z*(
z+
Real(1.0));
603 stencil(i,j,k)[0] += fac0*s0;
606 int offset = tooff + (corner[0] ? 1 : 0);
609 if (corner[0]) {
offset += 2; }
610 if (corner[2]) {
offset += 4; }
615 foff += 2*rr[0]*rr[2];
618 if (fine_mask(i,j,k+1)) {
619 stencil(i,j,k)[0] += stencil(i,j,k)[6];
620 stencil(i,j,k)[6] =
Real(0.0);
628 poly_interp_coeff<3>(dzf*
Real(-0.5), zz, cc);
629 for (
int iry = 0; iry < rr[1]; ++iry) {
630 for (
int irx = 0; irx < rr[0]; ++irx) {
631 Real bzp = bz ? bz[offset_bz(i,j,k+1)+irx+iry*rr[0]] :
Real(1.0);
632 Real fac = sb*dzcinv*dzfinv*bzp/
Real(rr[0]*rr[1]);
641 entry_values[foff+irx+iry*rr[0] ] += fac*(cc[1]-
Real(1.0));
642 entry_values[foff+irx+iry*rr[0]+rr[0]*rr[1]] += fac* cc[2];
647 Real fac0 = fac*cc[0];
650 if ( fine_mask(i-1,j,k) ||
654 stencil(i,j,k)[2] += fac0*
Real(0.5)*
x;
655 }
else if ( fine_mask(i+1,j,k) ||
656 !crse_mask(i+1,j,k)) {
658 stencil(i,j,k)[1] += fac0*
Real(-0.5)*
x;
661 stencil(i,j,k)[1] += fac0*
Real(0.5)*
x*(
x-
Real(1.0));
662 stencil(i,j,k)[2] += fac0*
Real(0.5)*
x*(
x+
Real(1.0));
665 if ( fine_mask(i,j-1,k) ||
669 stencil(i,j,k)[4] += fac0*
Real(0.5)*
y;
670 }
else if ( fine_mask(i,j+1,k) ||
671 !crse_mask(i,j+1,k)) {
673 stencil(i,j,k)[3] += fac0*
Real(-0.5)*
y;
676 stencil(i,j,k)[3] += fac0*
Real(0.5)*
y*(
y-
Real(1.0));
677 stencil(i,j,k)[4] += fac0*
Real(0.5)*
y*(
y+
Real(1.0));
680 stencil(i,j,k)[0] += fac0*s0;
683 int offset = tooff + (corner[0] ? 2 : 0) + (corner[1] ? 2 : 0);