300 BL_PROFILE(
"Operator::Elastic::Diagonal()");
302 amrex::Box domain(m_geom[amrlev][mglev].growPeriodicDomain(1));
303 domain.convert(amrex::IntVect::TheNodeVector());
305 amrex::Box stencilbox(m_geom[amrlev][mglev].growPeriodicDomain(2));
306 stencilbox.convert(amrex::IntVect::TheNodeVector());
308 const Real* DX = m_geom[amrlev][mglev].CellSize();
310 for (MFIter mfi(a_diag,
false); mfi.isValid(); ++mfi)
312 Box bx = mfi.validbox().grow(1) & domain;
313 amrex::Box tilebox = mfi.grownnodaltilebox() & bx;
315 amrex::Array4<MATRIX4>
const& DDW = (*(m_ddw_mf[amrlev][mglev])).array(mfi);
316 amrex::Array4<Set::Scalar>
const& diag = a_diag.array(mfi);
317 amrex::Array4<Set::Scalar>
const& psi = m_psi_mf[amrlev][mglev]->array(mfi);
319 const Dim3 lo = amrex::lbound(stencilbox), hi = amrex::ubound(stencilbox);
321 amrex::ParallelFor(tilebox, [=] AMREX_GPU_DEVICE(
int i,
int j,
int k)
325 std::array<Numeric::StencilType, AMREX_SPACEDIM>
329 std::array<Set::Matrix,AMREX_SPACEDIM> gradu = Numeric::Gradient_Diagonal<Set::Matrix>(DX, sten);
332 std::array<Set::Matrix3,AMREX_SPACEDIM> gradgradu = Numeric::Gradient_Diagonal<Set::Matrix3>(DX);
338 AMREX_D_DECL(xmin = (i == lo.x), ymin = (j == lo.y), zmin = (k == lo.z)),
339 AMREX_D_DECL(xmax = (i == hi.x), ymax = (j == hi.y), zmax = (k == hi.z));
346 for (
int p = 0; p < AMREX_SPACEDIM; p++)
349 diag(i, j, k, p) = 0.0;
353 if (AMREX_D_TERM(xmax || xmin, || ymax || ymin, || zmax || zmin))
355 Set::Matrix sig = DDW(i, j, k) * gradu[p] * psi_avg;
358 f = (*m_bc)(u, gradu[p], sig, i, j, k, stencilbox);
359 diag(i, j, k, p) = f(p);
363 Set::Vector f = (DDW(i, j, k) * gradgradu[p]) * psi_avg;
364 diag(i, j, k, p) += f(p);
368 if (std::isnan(diag(i, j, k, p)))
Util::Abort(
INFO,
"diagonal is nan at (", i,
",", j,
",", k,
"), amrlev=", amrlev,
", mglev=", mglev);
369 if (std::isinf(diag(i, j, k, p)))
Util::Abort(
INFO,
"diagonal is inf at (", i,
",", j,
",", k,
"), amrlev=", amrlev,
", mglev=", mglev);
370 if (diag(i, j, k, p) == 0)
Util::Abort(
INFO,
"diagonal is zero at (", i,
",", j,
",", k,
"), amrlev=", amrlev,
", mglev=", mglev);
377 a_diag.FillBoundaryAndSync(Geom(amrlev,mglev).periodicity());
378 nodalSync(amrlev,mglev,a_diag);
429 amrex::MultiFab& a_eps,
430 const amrex::MultiFab& a_u,
433 BL_PROFILE(
"Operator::Elastic::Strain()");
435 const amrex::Real* DX = m_geom[amrlev][0].CellSize();
436 amrex::Box domain(m_geom[amrlev][0].Domain());
437 domain.convert(amrex::IntVect::TheNodeVector());
440 for (MFIter mfi(a_u, amrex::TilingIfNotGPU()); mfi.isValid(); ++mfi)
442 const Box& bx = mfi.tilebox();
443 amrex::Array4<amrex::Real>
const& epsilon = a_eps.array(mfi);
444 amrex::Array4<const amrex::Real>
const& u = a_u.array(mfi);
445 amrex::ParallelFor(bx, [=] AMREX_GPU_DEVICE(
int i,
int j,
int k)
449 std::array<Numeric::StencilType, AMREX_SPACEDIM> sten
453 for (
int p = 0; p < AMREX_SPACEDIM; p++)
455 AMREX_D_TERM(gradu(p, 0) = (
Numeric::Stencil<Set::Scalar, 1, 0, 0>::D(u, i, j, k, p, DX, sten));,
456 gradu(p, 1) = (
Numeric::Stencil<Set::Scalar, 0, 1, 0>::D(u, i, j, k, p, DX, sten));,
457 gradu(p, 2) = (
Numeric::Stencil<Set::Scalar, 0, 0, 1>::D(u, i, j, k, p, DX, sten)););
460 Set::Matrix eps = 0.5 * (gradu + gradu.transpose());
464 AMREX_D_PICK(epsilon(i, j, k, 0) = eps(0, 0);
466 epsilon(i, j, k, 0) = eps(0, 0); epsilon(i, j, k, 1) = eps(1, 1); epsilon(i, j, k, 2) = eps(0, 1);
468 epsilon(i, j, k, 0) = eps(0, 0); epsilon(i, j, k, 1) = eps(1, 1); epsilon(i, j, k, 2) = eps(2, 2);
469 epsilon(i, j, k, 3) = eps(1, 2); epsilon(i, j, k, 4) = eps(2, 0); epsilon(i, j, k, 5) = eps(0, 1););
473 AMREX_D_PICK(epsilon(i, j, k, 0) = eps(0, 0);
475 epsilon(i, j, k, 0) = eps(0, 0); epsilon(i, j, k, 1) = eps(0, 1);
476 epsilon(i, j, k, 2) = eps(1, 0); epsilon(i, j, k, 3) = eps(1, 1);
478 epsilon(i, j, k, 0) = eps(0, 0); epsilon(i, j, k, 1) = eps(0, 1); epsilon(i, j, k, 2) = eps(0, 2);
479 epsilon(i, j, k, 3) = eps(1, 0); epsilon(i, j, k, 4) = eps(1, 1); epsilon(i, j, k, 5) = eps(1, 2);
480 epsilon(i, j, k, 6) = eps(2, 0); epsilon(i, j, k, 7) = eps(2, 1); epsilon(i, j, k, 8) = eps(2, 2););
490 amrex::MultiFab& a_sigma,
491 const amrex::MultiFab& a_u,
492 bool voigt,
bool a_homogeneous)
494 BL_PROFILE(
"Operator::Elastic::Stress()");
495 SetHomogeneous(a_homogeneous);
497 const amrex::Real* DX = m_geom[amrlev][0].CellSize();
498 amrex::Box domain(m_geom[amrlev][0].Domain());
499 domain.convert(amrex::IntVect::TheNodeVector());
501 for (MFIter mfi(a_u, amrex::TilingIfNotGPU()); mfi.isValid(); ++mfi)
503 const Box& bx = mfi.tilebox();
504 amrex::Array4<Set::Matrix4<AMREX_SPACEDIM, SYM>>
const& DDW = (*(m_ddw_mf[amrlev][0])).array(mfi);
505 amrex::Array4<amrex::Real>
const& sigma = a_sigma.array(mfi);
506 amrex::Array4<Set::Scalar>
const& psi = m_psi_mf[amrlev][0]->array(mfi);
507 amrex::Array4<const amrex::Real>
const& u = a_u.array(mfi);
508 amrex::ParallelFor(bx, [=] AMREX_GPU_DEVICE(
int i,
int j,
int k)
512 std::array<Numeric::StencilType, AMREX_SPACEDIM> sten
516 for (
int p = 0; p < AMREX_SPACEDIM; p++)
518 AMREX_D_TERM(gradu(p, 0) = (
Numeric::Stencil<Set::Scalar, 1, 0, 0>::D(u, i, j, k, p, DX, sten));,
519 gradu(p, 1) = (
Numeric::Stencil<Set::Scalar, 0, 1, 0>::D(u, i, j, k, p, DX, sten));,
520 gradu(p, 2) = (
Numeric::Stencil<Set::Scalar, 0, 0, 1>::D(u, i, j, k, p, DX, sten)););
525 Set::Matrix sig = (DDW(i, j, k) * gradu) * psi_avg;
529 AMREX_D_PICK(sigma(i, j, k, 0) = sig(0, 0);
531 sigma(i, j, k, 0) = sig(0, 0); sigma(i, j, k, 1) = sig(1, 1); sigma(i, j, k, 2) = sig(0, 1);
533 sigma(i, j, k, 0) = sig(0, 0); sigma(i, j, k, 1) = sig(1, 1); sigma(i, j, k, 2) = sig(2, 2);
534 sigma(i, j, k, 3) = sig(1, 2); sigma(i, j, k, 4) = sig(2, 0); sigma(i, j, k, 5) = sig(0, 1););
538 AMREX_D_PICK(sigma(i, j, k, 0) = sig(0, 0);
540 sigma(i, j, k, 0) = sig(0, 0); sigma(i, j, k, 1) = sig(0, 1);
541 sigma(i, j, k, 2) = sig(1, 0); sigma(i, j, k, 3) = sig(1, 1);
543 sigma(i, j, k, 0) = sig(0, 0); sigma(i, j, k, 1) = sig(0, 1); sigma(i, j, k, 2) = sig(0, 2);
544 sigma(i, j, k, 3) = sig(1, 0); sigma(i, j, k, 4) = sig(1, 1); sigma(i, j, k, 5) = sig(1, 2);
545 sigma(i, j, k, 6) = sig(2, 0); sigma(i, j, k, 7) = sig(2, 1); sigma(i, j, k, 8) = sig(2, 2););
632 BL_PROFILE(
"Operator::Elastic::averageDownCoeffsDifferentAmrLevels()");
635 const int crse_amrlev = fine_amrlev - 1;
638 MultiTab& crse_ddw = *m_ddw_mf[crse_amrlev][0];
639 MultiTab& fine_ddw = *m_ddw_mf[fine_amrlev][0];
641 amrex::Box cdomain(m_geom[crse_amrlev][0].Domain());
642 cdomain.convert(amrex::IntVect::TheNodeVector());
644 const Geometry& cgeom = m_geom[crse_amrlev][0];
646 const BoxArray& fba = fine_ddw.boxArray();
647 const DistributionMapping& fdm = fine_ddw.DistributionMap();
649 MultiTab fine_ddw_for_coarse(amrex::coarsen(fba, 2), fdm, ncomp, 2);
650 fine_ddw_for_coarse.ParallelCopy(crse_ddw, 0, 0, ncomp, 0, 0, cgeom.periodicity());
652 const int coarse_fine_node = 1;
653 const int fine_fine_node = 2;
655 amrex::iMultiFab nodemask(amrex::coarsen(fba, 2), fdm, 1, 2);
656 nodemask.ParallelCopy(*m_nd_fine_mask[crse_amrlev], 0, 0, 1, 0, 0, cgeom.periodicity());
658 amrex::iMultiFab cellmask(amrex::convert(amrex::coarsen(fba, 2), amrex::IntVect::TheCellVector()), fdm, 1, 2);
659 cellmask.ParallelCopy(*m_cc_fine_mask[crse_amrlev], 0, 0, 1, 1, 1, cgeom.periodicity());
661 for (MFIter mfi(fine_ddw_for_coarse,
false); mfi.isValid(); ++mfi)
663 const Box& bx = mfi.validbox();
665 amrex::Array4<const int>
const& nmask = nodemask.array(mfi);
668 amrex::Array4<MATRIX4>
const& cdata = fine_ddw_for_coarse.array(mfi);
669 amrex::Array4<const MATRIX4>
const& fdata = fine_ddw.array(mfi);
671 const Dim3 lo = amrex::lbound(cdomain), hi = amrex::ubound(cdomain);
673 for (
int n = 0; n < fine_ddw.nComp(); n++)
677 amrex::ParallelFor(bx, [=] AMREX_GPU_DEVICE(
int I,
int J,
int K) {
678 int i = I * 2, j = J * 2, k = K * 2;
680 if (nmask(I, J, K) == fine_fine_node || nmask(I, J, K) == coarse_fine_node)
682 if ((I == lo.x || I == hi.x) &&
683 (J == lo.y || J == hi.y) &&
684 (K == lo.z || K == hi.z))
685 cdata(I, J, K, n) = fdata(i, j, k, n);
686 else if ((J == lo.y || J == hi.y) &&
687 (K == lo.z || K == hi.z))
688 cdata(I, J, K, n) = fdata(i - 1, j, k, n) * 0.25 + fdata(i, j, k, n) * 0.5 + fdata(i + 1, j, k, n) * 0.25;
689 else if ((K == lo.z || K == hi.z) &&
690 (I == lo.x || I == hi.x))
691 cdata(I, J, K, n) = fdata(i, j - 1, k, n) * 0.25 + fdata(i, j, k, n) * 0.5 + fdata(i, j + 1, k, n) * 0.25;
692 else if ((I == lo.x || I == hi.x) &&
693 (J == lo.y || J == hi.y))
694 cdata(I, J, K, n) = fdata(i, j, k - 1, n) * 0.25 + fdata(i, j, k, n) * 0.5 + fdata(i, j, k + 1, n) * 0.25;
695 else if (I == lo.x || I == hi.x)
697 (fdata(i, j - 1, k - 1, n) + fdata(i, j, k - 1, n) * 2.0 + fdata(i, j + 1, k - 1, n)
698 + fdata(i, j - 1, k, n) * 2.0 + fdata(i, j, k, n) * 4.0 + fdata(i, j + 1, k, n) * 2.0
699 + fdata(i, j - 1, k + 1, n) + fdata(i, j, k + 1, n) * 2.0 + fdata(i, j + 1, k + 1, n)) / 16.0;
700 else if (J == lo.y || J == hi.y)
702 (fdata(i - 1, j, k - 1, n) + fdata(i - 1, j, k, n) * 2.0 + fdata(i - 1, j, k + 1, n)
703 + fdata(i, j, k - 1, n) * 2.0 + fdata(i, j, k, n) * 4.0 + fdata(i, j, k + 1, n) * 2.0
704 + fdata(i + 1, j, k - 1, n) + fdata(i + 1, j, k, n) * 2.0 + fdata(i + 1, j, k + 1, n)) / 16.0;
705 else if (K == lo.z || K == hi.z)
707 (fdata(i - 1, j - 1, k, n) + fdata(i, j - 1, k, n) * 2.0 + fdata(i + 1, j - 1, k, n)
708 + fdata(i - 1, j, k, n) * 2.0 + fdata(i, j, k, n) * 4.0 + fdata(i + 1, j, k, n) * 2.0
709 + fdata(i - 1, j + 1, k, n) + fdata(i, j + 1, k, n) * 2.0 + fdata(i + 1, j + 1, k, n)) / 16.0;
712 (fdata(i - 1, j - 1, k - 1, n) + fdata(i - 1, j - 1, k + 1, n) + fdata(i - 1, j + 1, k - 1, n) + fdata(i - 1, j + 1, k + 1, n) +
713 fdata(i + 1, j - 1, k - 1, n) + fdata(i + 1, j - 1, k + 1, n) + fdata(i + 1, j + 1, k - 1, n) + fdata(i + 1, j + 1, k + 1, n)) / 64.0
715 (fdata(i, j - 1, k - 1, n) + fdata(i, j - 1, k + 1, n) + fdata(i, j + 1, k - 1, n) + fdata(i, j + 1, k + 1, n) +
716 fdata(i - 1, j, k - 1, n) + fdata(i + 1, j, k - 1, n) + fdata(i - 1, j, k + 1, n) + fdata(i + 1, j, k + 1, n) +
717 fdata(i - 1, j - 1, k, n) + fdata(i - 1, j + 1, k, n) + fdata(i + 1, j - 1, k, n) + fdata(i + 1, j + 1, k, n)) / 32.0
719 (fdata(i - 1, j, k, n) + fdata(i, j - 1, k, n) + fdata(i, j, k - 1, n) +
720 fdata(i + 1, j, k, n) + fdata(i, j + 1, k, n) + fdata(i, j, k + 1, n)) / 16.0
722 fdata(i, j, k, n) / 8.0;
725 if (cdata(I, J, K).contains_nan())
Util::Abort(
INFO,
"restricted model is nan at (", i,
",", j,
",", k,
"), fine_amrlev=", fine_amrlev);
736 crse_ddw.ParallelCopy(fine_ddw_for_coarse, 0, 0, ncomp, 0, 0, cgeom.periodicity());
740 FillBoundaryCoeff(crse_ddw,Geom(fine_amrlev,0).periodicity());
750 BL_PROFILE(
"Elastic::averageDownCoeffsSameAmrLevel()");
752 for (
int mglev = 1; mglev < m_num_mg_levels[amrlev]; ++mglev)
754 amrex::Box cdomain(m_geom[amrlev][mglev].growPeriodicDomain(2));
755 cdomain.convert(amrex::IntVect::TheNodeVector());
756 amrex::Box fdomain(m_geom[amrlev][mglev - 1].Domain());
757 fdomain.convert(amrex::IntVect::TheNodeVector());
759 MultiTab& crse = *m_ddw_mf[amrlev][mglev];
760 MultiTab& fine = *m_ddw_mf[amrlev][mglev - 1];
762 amrex::BoxArray crseba = crse.boxArray();
763 amrex::BoxArray fineba = fine.boxArray();
765 BoxArray newba = crseba;
768 fine_on_crseba.define(newba, crse.DistributionMap(), 1, 4);
769 fine_on_crseba.ParallelCopy(fine, 0, 0, 1, 2, 4, m_geom[amrlev][mglev-1].periodicity());
772 for (MFIter mfi(crse,
false); mfi.isValid(); ++mfi)
775 Box bx = mfi.grownnodaltilebox() & cdomain;
778 amrex::Array4<const Set::Matrix4<AMREX_SPACEDIM, SYM>>
const& fdata = fine_on_crseba.array(mfi);
779 amrex::Array4<Set::Matrix4<AMREX_SPACEDIM, SYM>>
const& cdata = crse.array(mfi);
781 const Dim3 lo = amrex::lbound(bx), hi = amrex::ubound(bx);
786 amrex::ParallelFor(bx, [=] AMREX_GPU_DEVICE(
int I,
int J,
int K) {
787 int i = 2 * I, j = 2 * J, k = 2 * K;
789 if ((I == lo.x || I == hi.x) &&
790 (J == lo.y || J == hi.y) &&
791 (K == lo.z || K == hi.z))
792 cdata(I, J, K) = fdata(i, j, k);
793 else if ((J == lo.y || J == hi.y) &&
794 (K == lo.z || K == hi.z))
795 cdata(I, J, K) = fdata(i - 1, j, k) * 0.25 + fdata(i, j, k) * 0.5 + fdata(i + 1, j, k) * 0.25;
796 else if ((K == lo.z || K == hi.z) &&
797 (I == lo.x || I == hi.x))
798 cdata(I, J, K) = fdata(i, j - 1, k) * 0.25 + fdata(i, j, k) * 0.5 + fdata(i, j + 1, k) * 0.25;
799 else if ((I == lo.x || I == hi.x) &&
800 (J == lo.y || J == hi.y))
801 cdata(I, J, K) = fdata(i, j, k - 1) * 0.25 + fdata(i, j, k) * 0.5 + fdata(i, j, k + 1) * 0.25;
802 else if (I == lo.x || I == hi.x)
804 (fdata(i, j - 1, k - 1) + fdata(i, j, k - 1) * 2.0 + fdata(i, j + 1, k - 1)
805 + fdata(i, j - 1, k) * 2.0 + fdata(i, j, k) * 4.0 + fdata(i, j + 1, k) * 2.0
806 + fdata(i, j - 1, k + 1) + fdata(i, j, k + 1) * 2.0 + fdata(i, j + 1, k + 1)) / 16.0;
807 else if (J == lo.y || J == hi.y)
809 (fdata(i - 1, j, k - 1) + fdata(i - 1, j, k) * 2.0 + fdata(i - 1, j, k + 1)
810 + fdata(i, j, k - 1) * 2.0 + fdata(i, j, k) * 4.0 + fdata(i, j, k + 1) * 2.0
811 + fdata(i + 1, j, k - 1) + fdata(i + 1, j, k) * 2.0 + fdata(i + 1, j, k + 1)) / 16.0;
812 else if (K == lo.z || K == hi.z)
814 (fdata(i - 1, j - 1, k) + fdata(i, j - 1, k) * 2.0 + fdata(i + 1, j - 1, k)
815 + fdata(i - 1, j, k) * 2.0 + fdata(i, j, k) * 4.0 + fdata(i + 1, j, k) * 2.0
816 + fdata(i - 1, j + 1, k) + fdata(i, j + 1, k) * 2.0 + fdata(i + 1, j + 1, k)) / 16.0;
819 (fdata(i - 1, j - 1, k - 1) + fdata(i - 1, j - 1, k + 1) + fdata(i - 1, j + 1, k - 1) + fdata(i - 1, j + 1, k + 1) +
820 fdata(i + 1, j - 1, k - 1) + fdata(i + 1, j - 1, k + 1) + fdata(i + 1, j + 1, k - 1) + fdata(i + 1, j + 1, k + 1)) / 64.0
822 (fdata(i, j - 1, k - 1) + fdata(i, j - 1, k + 1) + fdata(i, j + 1, k - 1) + fdata(i, j + 1, k + 1) +
823 fdata(i - 1, j, k - 1) + fdata(i + 1, j, k - 1) + fdata(i - 1, j, k + 1) + fdata(i + 1, j, k + 1) +
824 fdata(i - 1, j - 1, k) + fdata(i - 1, j + 1, k) + fdata(i + 1, j - 1, k) + fdata(i + 1, j + 1, k)) / 32.0
826 (fdata(i - 1, j, k) + fdata(i, j - 1, k) + fdata(i, j, k - 1) +
827 fdata(i + 1, j, k) + fdata(i, j + 1, k) + fdata(i, j, k + 1)) / 16.0
829 fdata(i, j, k) / 8.0;
832 if (cdata(I, J, K).contains_nan())
Util::Abort(
INFO,
"restricted model is nan at crse coordinates (I=", I,
",J=", J,
",K=", k,
"), amrlev=", amrlev,
" interpolating from mglev", mglev - 1,
" to ", mglev);
836 FillBoundaryCoeff(crse, Geom(amrlev,mglev).periodicity());
839 if (!m_psi_set)
continue;
841 amrex::Box cdomain_cell(m_geom[amrlev][mglev].Domain());
842 amrex::Box fdomain_cell(m_geom[amrlev][mglev - 1].Domain());
843 MultiFab& crse_psi = *m_psi_mf[amrlev][mglev];
844 MultiFab& fine_psi = *m_psi_mf[amrlev][mglev - 1];
845 MultiFab fine_psi_on_crseba;
846 fine_psi_on_crseba.define(newba.convert(amrex::IntVect::TheCellVector()), crse_psi.DistributionMap(), 1, 1);
847 fine_psi_on_crseba.ParallelCopy(fine_psi, 0, 0, 1, 1, 1, m_geom[amrlev][mglev].periodicity());
849 for (MFIter mfi(crse_psi, amrex::TilingIfNotGPU()); mfi.isValid(); ++mfi)
851 Box bx = mfi.tilebox();
852 bx = bx & cdomain_cell;
854 amrex::Array4<const Set::Scalar>
const& fdata = fine_psi_on_crseba.array(mfi);
855 amrex::Array4<Set::Scalar>
const& cdata = crse_psi.array(mfi);
857 const Dim3 lo = amrex::lbound(cdomain), hi = amrex::ubound(cdomain);
861 amrex::ParallelFor(bx, [=] AMREX_GPU_DEVICE(
int I,
int J,
int K) {
862 int i = 2 * I, j = 2 * J, k = 2 * K;
864 if ((I == lo.x || I == hi.x) &&
865 (J == lo.y || J == hi.y) &&
866 (K == lo.z || K == hi.z))
867 cdata(I, J, K) = fdata(i, j, k);
868 else if ((J == lo.y || J == hi.y) &&
869 (K == lo.z || K == hi.z))
870 cdata(I, J, K) = fdata(i - 1, j, k) * 0.25 + fdata(i, j, k) * 0.5 + fdata(i + 1, j, k) * 0.25;
871 else if ((K == lo.z || K == hi.z) &&
872 (I == lo.x || I == hi.x))
873 cdata(I, J, K) = fdata(i, j - 1, k) * 0.25 + fdata(i, j, k) * 0.5 + fdata(i, j + 1, k) * 0.25;
874 else if ((I == lo.x || I == hi.x) &&
875 (J == lo.y || J == hi.y))
876 cdata(I, J, K) = fdata(i, j, k - 1) * 0.25 + fdata(i, j, k) * 0.5 + fdata(i, j, k + 1) * 0.25;
877 else if (I == lo.x || I == hi.x)
879 (fdata(i, j - 1, k - 1) + fdata(i, j, k - 1) * 2.0 + fdata(i, j + 1, k - 1)
880 + fdata(i, j - 1, k) * 2.0 + fdata(i, j, k) * 4.0 + fdata(i, j + 1, k) * 2.0
881 + fdata(i, j - 1, k + 1) + fdata(i, j, k + 1) * 2.0 + fdata(i, j + 1, k + 1)) / 16.0;
882 else if (J == lo.y || J == hi.y)
884 (fdata(i - 1, j, k - 1) + fdata(i - 1, j, k) * 2.0 + fdata(i - 1, j, k + 1)
885 + fdata(i, j, k - 1) * 2.0 + fdata(i, j, k) * 4.0 + fdata(i, j, k + 1) * 2.0
886 + fdata(i + 1, j, k - 1) + fdata(i + 1, j, k) * 2.0 + fdata(i + 1, j, k + 1)) / 16.0;
887 else if (K == lo.z || K == hi.z)
889 (fdata(i - 1, j - 1, k) + fdata(i, j - 1, k) * 2.0 + fdata(i + 1, j - 1, k)
890 + fdata(i - 1, j, k) * 2.0 + fdata(i, j, k) * 4.0 + fdata(i + 1, j, k) * 2.0
891 + fdata(i - 1, j + 1, k) + fdata(i, j + 1, k) * 2.0 + fdata(i + 1, j + 1, k)) / 16.0;
894 (fdata(i - 1, j - 1, k - 1) + fdata(i - 1, j - 1, k + 1) + fdata(i - 1, j + 1, k - 1) + fdata(i - 1, j + 1, k + 1) +
895 fdata(i + 1, j - 1, k - 1) + fdata(i + 1, j - 1, k + 1) + fdata(i + 1, j + 1, k - 1) + fdata(i + 1, j + 1, k + 1)) / 64.0
897 (fdata(i, j - 1, k - 1) + fdata(i, j - 1, k + 1) + fdata(i, j + 1, k - 1) + fdata(i, j + 1, k + 1) +
898 fdata(i - 1, j, k - 1) + fdata(i + 1, j, k - 1) + fdata(i - 1, j, k + 1) + fdata(i + 1, j, k + 1) +
899 fdata(i - 1, j - 1, k) + fdata(i - 1, j + 1, k) + fdata(i + 1, j - 1, k) + fdata(i + 1, j + 1, k)) / 32.0
901 (fdata(i - 1, j, k) + fdata(i, j - 1, k) + fdata(i, j, k - 1) +
902 fdata(i + 1, j, k) + fdata(i, j + 1, k) + fdata(i, j, k + 1)) / 16.0
904 fdata(i, j, k) / 8.0;
907 FillBoundaryCoeff(crse_psi, Geom(amrlev,mglev).periodicity());