1#ifndef AMREX_ML_CURL_CURL_K_H_
2#define AMREX_ML_CURL_CURL_K_H_
3#include <AMReX_Config.H>
192#if (AMREX_SPACEDIM == 1)
195#elif (AMREX_SPACEDIM == 2)
209#if (AMREX_SPACEDIM == 1)
212#elif (AMREX_SPACEDIM == 2)
224#if (AMREX_SPACEDIM < 3)
236#if (AMREX_SPACEDIM == 1)
250 }
else if (dim == 1) {
275#if (AMREX_SPACEDIM > 1)
277 bool ylo_is_symmetric (
int j)
const
283 bool yhi_is_symmetric (
int j)
const
289#if (AMREX_SPACEDIM == 3)
291 bool zlo_is_symmetric (
int k)
const
297 bool zhi_is_symmetric (
int k)
const
305#if (AMREX_SPACEDIM == 1)
308#elif (AMREX_SPACEDIM == 2)
312 return (side == 0) ? ylo_is_symmetric(idx) : yhi_is_symmetric(idx);
317 }
else if (dir == 1) {
318 return (side == 0) ? ylo_is_symmetric(idx) : yhi_is_symmetric(idx);
320 return (side == 0) ? zlo_is_symmetric(idx) : zhi_is_symmetric(idx);
335#if (AMREX_SPACEDIM == 1)
338#elif (AMREX_SPACEDIM == 2)
340 Real dyy = adxinv[1] * adxinv[1];
341 Real dxy = adxinv[0] * adxinv[1];
342 Real ccex = ex(i ,j ,k ) * dyy * Real(2.0)
343 - dyy * (ex(i ,j-1,k ) +
345 + dxy * (ey(i ,j-1,k )
349#elif (AMREX_SPACEDIM == 3)
350 Real dyy = adxinv[1] * adxinv[1];
351 Real dzz = adxinv[2] * adxinv[2];
352 Real dxy = adxinv[0] * adxinv[1];
353 Real dxz = adxinv[0] * adxinv[2];
354 Real ccex = ex(i ,j ,k ) * (dyy+dzz)*Real(2.0)
355 - dyy * (ex(i ,j-1,k ) +
357 - dzz * (ex(i ,j ,k+1) +
359 + dxy * (ey(i ,j-1,k )
363 + dxz * (ez(i ,j ,k-1)
368 Ax(i,j,k) = ccex + beta * ex(i,j,k);
378#if (AMREX_SPACEDIM == 1)
380 Real dxx = adxinv[0] * adxinv[0];
381 Real ccey = ey(i ,j ,k ) * dxx * Real(2.0)
382 - dxx * (ey(i-1,j ,k ) +
384#elif (AMREX_SPACEDIM == 2)
386 Real dxx = adxinv[0] * adxinv[0];
387 Real dxy = adxinv[0] * adxinv[1];
388 Real ccey = ey(i ,j ,k ) * dxx * Real(2.0)
389 - dxx * (ey(i-1,j ,k ) +
391 + dxy * (ex(i-1,j ,k )
395#elif (AMREX_SPACEDIM == 3)
396 Real dxx = adxinv[0] * adxinv[0];
397 Real dzz = adxinv[2] * adxinv[2];
398 Real dxy = adxinv[0] * adxinv[1];
399 Real dyz = adxinv[1] * adxinv[2];
400 Real ccey = ey(i ,j ,k ) * (dxx+dzz)*Real(2.0)
401 - dxx * (ey(i-1,j ,k ) +
403 - dzz * (ey(i ,j ,k-1) +
405 + dxy * (ex(i-1,j ,k )
409 + dyz * (ez(i ,j ,k-1)
414 Ay(i,j,k) = ccey + beta * ey(i,j,k);
424#if (AMREX_SPACEDIM == 1)
426 Real dxx = adxinv[0] * adxinv[0];
427 Real ccez = ez(i ,j ,k ) * dxx*Real(2.0)
428 - dxx * (ez(i-1,j ,k ) +
430#elif (AMREX_SPACEDIM == 2)
432 Real dxx = adxinv[0] * adxinv[0];
433 Real dyy = adxinv[1] * adxinv[1];
434 Real ccez = ez(i ,j ,k ) * (dxx+dyy)*Real(2.0)
435 - dxx * (ez(i-1,j ,k ) +
437 - dyy * (ez(i ,j-1,k ) +
439#elif (AMREX_SPACEDIM == 3)
440 Real dxx = adxinv[0] * adxinv[0];
441 Real dyy = adxinv[1] * adxinv[1];
442 Real dxz = adxinv[0] * adxinv[2];
443 Real dyz = adxinv[1] * adxinv[2];
444 Real ccez = ez(i ,j ,k ) * (dxx+dyy)*Real(2.0)
445 - dxx * (ez(i-1,j ,k ) +
447 - dyy * (ez(i ,j-1,k ) +
449 + dxz * (ex(i-1,j ,k )
453 + dyz * (ey(i ,j-1,k )
458 Az(i,j,k) = ccez + beta * ez(i,j,k);
461#if (AMREX_SPACEDIM == 1)
477 Real dxx = adxinv[0] * adxinv[0];
481 if (my_color == color)
484 ex(i,j,k) = rhsx(i,j,k) / beta;
487 Real gamma_y = dxx * Real(2.0) + beta;
488 Real ccey = - dxx * (ey(i-1,j ,k ) +
490 Real res_y = rhsy(i,j,k) - ( gamma_y * ey(i,j,k) + ccey );
491 ey(i,j,k) += res_y/gamma_y;
493 Real gamma_z = dxx * Real(2.0) + beta;
494 Real ccez = -dxx * (ez(i-1,j ,k ) +
496 Real res_z = rhsz(i,j,k) - ( gamma_z * ez(i,j,k) + ccez );
497 ez(i,j,k) += res_z/gamma_z;
518 Real dxx = adxinv[0] * adxinv[0];
522 if (my_color == color)
525 ex(i,j,k) = rhsx(i,j,k) / betax(i,j,k);
528 Real gamma_y = dxx * Real(2.0) + betay(i,j,k);
529 Real ccey = - dxx * (ey(i-1,j ,k ) +
531 Real res_y = rhsy(i,j,k) - ( gamma_y * ey(i,j,k) + ccey );
532 ey(i,j,k) += res_y/gamma_y;
534 Real gamma_z = dxx * Real(2.0) + betaz(i,j,k);
535 Real ccez = -dxx * (ez(i-1,j ,k ) +
537 Real res_z = rhsz(i,j,k) - ( gamma_z * ez(i,j,k) + ccez );
538 ez(i,j,k) += res_z/gamma_z;
545#if (AMREX_SPACEDIM > 1)
548void mlcurlcurl_gs4_lu (
int i,
int j,
int k,
549 Array4<Real>
const& ex,
550 Array4<Real>
const& ey,
551 Array4<Real>
const& ez,
552 Array4<Real const>
const& rhsx,
553 Array4<Real const>
const& rhsy,
554 Array4<Real const>
const& rhsz,
555#
if (AMREX_SPACEDIM == 2)
558 GpuArray<Real,AMREX_SPACEDIM>
const& adxinv,
559 int color, LUSolver<AMREX_SPACEDIM*2,Real>
const& lusolver,
560 CurlCurlDirichletInfo
const& dinfo,
561 CurlCurlSymmetryInfo
const& sinfo)
563 if (dinfo.is_dirichlet_node(i,j,k)) {
return; }
565 int my_color = i%2 + 2*(j%2);
567 my_color = 3 - my_color;
570#if (AMREX_SPACEDIM == 2)
572 Real dxx = adxinv[0] * adxinv[0];
573 Real dyy = adxinv[1] * adxinv[1];
575 if (((my_color == 0 || my_color == 3) && (color == 0 || color == 3)) ||
576 ((my_color == 1 || my_color == 2) && (color == 1 || color == 2)))
578 Real gamma = (dxx+dyy)*Real(2.0) + beta;
579 Real ccez = - dxx * (ez(i-1,j ,k ) +
581 - dyy * (ez(i ,j-1,k ) +
583 Real res = rhsz(i,j,k) - (gamma*ez(i,j,k) + ccez);
584 constexpr Real omega = Real(1.15);
585 ez(i,j,k) += omega/gamma * res;
588 if (my_color != color) {
return; }
590 Real dxy = adxinv[0]*adxinv[1];
593 {rhsx(i-1,j,k) - (-dyy * ( ex(i-1,j-1,k ) +
595 + dxy * ( ey(i-1,j-1,k )
597 rhsx(i ,j,k) - (-dyy * ( ex(i ,j-1,k ) +
599 + dxy * (-ey(i+1,j-1,k )
601 rhsy(i,j-1,k) - (-dxx * ( ey(i-1,j-1,k ) +
603 + dxy * ( ex(i-1,j-1,k )
605 rhsy(i,j ,k) - (-dxx * ( ey(i-1,j ,k ) +
607 + dxy * (-ex(i-1,j+1,k )
610 if (sinfo.xlo_is_symmetric(i)) {
612 }
else if (sinfo.xhi_is_symmetric(i)) {
616 if (sinfo.ylo_is_symmetric(j)) {
618 }
else if (sinfo.yhi_is_symmetric(j)) {
623 lusolver(
x.data(),
b.data());
624 ex(i-1,j ,k ) =
x[0];
626 ey(i ,j-1,k ) =
x[2];
629#elif (AMREX_SPACEDIM == 3)
631 if (my_color != color) {
return; }
633 Real dxx = adxinv[0]*adxinv[0];
634 Real dyy = adxinv[1]*adxinv[1];
635 Real dzz = adxinv[2]*adxinv[2];
636 Real dxy = adxinv[0]*adxinv[1];
637 Real dxz = adxinv[0]*adxinv[2];
638 Real dyz = adxinv[1]*adxinv[2];
641 {rhsx(i-1,j,k) - (-dyy * ( ex(i-1,j-1,k ) +
643 - dzz * ( ex(i-1,j ,k+1) +
645 + dxy * ( ey(i-1,j-1,k )
647 + dxz * ( ez(i-1,j ,k-1)
649 rhsx(i ,j,k) - (-dyy * ( ex(i ,j-1,k ) +
651 - dzz * ( ex(i ,j ,k+1) +
653 + dxy * (-ey(i+1,j-1,k )
655 + dxz * (-ez(i+1,j ,k-1)
657 rhsy(i,j-1,k) - (-dxx * ( ey(i-1,j-1,k ) +
659 - dzz * ( ey(i ,j-1,k-1) +
661 + dxy * ( ex(i-1,j-1,k )
663 + dyz * ( ez(i ,j-1,k-1)
665 rhsy(i,j ,k) - (-dxx * ( ey(i-1,j ,k ) +
667 - dzz * ( ey(i ,j ,k-1) +
669 + dxy * (-ex(i-1,j+1,k )
671 + dyz * (-ez(i ,j+1,k-1)
673 rhsz(i,j,k-1) - (-dxx * ( ez(i-1,j ,k-1) +
675 - dyy * ( ez(i ,j-1,k-1) +
677 + dxz * ( ex(i-1,j ,k-1)
679 + dyz * ( ey(i ,j-1,k-1)
681 rhsz(i,j,k ) - (-dxx * ( ez(i-1,j ,k ) +
683 - dyy * ( ez(i ,j-1,k ) +
685 + dxz * (-ex(i-1,j ,k+1)
687 + dyz * (-ey(i ,j-1,k+1)
690 if (sinfo.xlo_is_symmetric(i)) {
692 }
else if (sinfo.xhi_is_symmetric(i)) {
696 if (sinfo.ylo_is_symmetric(j)) {
698 }
else if (sinfo.yhi_is_symmetric(j)) {
702 if (sinfo.zlo_is_symmetric(k)) {
704 }
else if (sinfo.zhi_is_symmetric(k)) {
709 lusolver(
x.data(),
b.data());
710 ex(i-1,j ,k ) =
x[0];
712 ey(i ,j-1,k ) =
x[2];
714 ez(i ,j ,k-1) =
x[4];
721void mlcurlcurl_gs4 (
int i,
int j,
int k,
722 Array4<Real>
const& ex,
723 Array4<Real>
const& ey,
724 Array4<Real>
const& ez,
725 Array4<Real const>
const& rhsx,
726 Array4<Real const>
const& rhsy,
727 Array4<Real const>
const& rhsz,
728 GpuArray<Real,AMREX_SPACEDIM>
const& adxinv,
730 Array4<Real const>
const& betax,
731 Array4<Real const>
const& betay,
732 Array4<Real const>
const& betaz,
733 CurlCurlDirichletInfo
const& dinfo,
734 CurlCurlSymmetryInfo
const& sinfo)
736 if (dinfo.is_dirichlet_node(i,j,k)) {
return; }
738 int my_color = i%2 + 2*(j%2);
740 my_color = 3 - my_color;
743#if (AMREX_SPACEDIM == 2)
745 Real dxx = adxinv[0] * adxinv[0];
746 Real dyy = adxinv[1] * adxinv[1];
748 if (((my_color == 0 || my_color == 3) && (color == 0 || color == 3)) ||
749 ((my_color == 1 || my_color == 2) && (color == 1 || color == 2)))
751 Real gamma = (dxx+dyy)*Real(2.0) + betaz(i,j,k);
752 Real ccez = - dxx * (ez(i-1,j ,k ) +
754 - dyy * (ez(i ,j-1,k ) +
756 Real res = rhsz(i,j,k) - (gamma*ez(i,j,k) + ccez);
757 constexpr Real omega = Real(1.15);
758 ez(i,j,k) += omega/gamma * res;
761 if (my_color != color) {
return; }
763 Real dxy = adxinv[0]*adxinv[1];
766 {rhsx(i-1,j,k) - (-dyy * ( ex(i-1,j-1,k ) +
768 + dxy * ( ey(i-1,j-1,k )
770 rhsx(i ,j,k) - (-dyy * ( ex(i ,j-1,k ) +
772 + dxy * (-ey(i+1,j-1,k )
774 rhsy(i,j-1,k) - (-dxx * ( ey(i-1,j-1,k ) +
776 + dxy * ( ex(i-1,j-1,k )
778 rhsy(i,j ,k) - (-dxx * ( ey(i-1,j ,k ) +
780 + dxy * (-ex(i-1,j+1,k )
783 GpuArray<Real,4> beta;
785 if (sinfo.xlo_is_symmetric(i)) {
787 beta[0] = beta[1] = betax(i,j,k);
788 }
else if (sinfo.xhi_is_symmetric(i)) {
790 beta[0] = beta[1] = betax(i-1,j,k);
792 beta[0] = betax(i-1,j,k);
793 beta[1] = betax(i ,j,k);
796 if (sinfo.ylo_is_symmetric(j)) {
798 beta[2] = beta[3] = betay(i,j,k);
799 }
else if (sinfo.yhi_is_symmetric(j)) {
801 beta[2] = beta[3] = betay(i,j-1,k);
803 beta[2] = betay(i,j-1,k);
804 beta[3] = betay(i,j ,k);
808 Real diagInv[4] = {Real(1.0) / (dyy*Real(2.0) + beta[0]),
809 Real(1.0) / (dyy*Real(2.0) + beta[1]),
810 Real(1.0) / (dxx*Real(2.0) + beta[2]),
811 Real(1.0) / (dxx*Real(2.0) + beta[3])};
815 for (
int m = 0; m < 4; ++m) { z[m] =
r[m] * diagInv[m]; }
820 Av[0] = (dyy*Real(2.0) + beta[0]) * v[0] - dxy * v[2] + dxy * v[3];
821 Av[1] = (dyy*Real(2.0) + beta[1]) * v[1] + dxy * v[2] - dxy * v[3];
822 Av[2] = -dxy * v[0] + dxy * v[1] + (dxx*Real(2.0) + beta[2]) * v[2];
823 Av[3] = dxy * v[0] - dxy * v[1] + (dxx*Real(2.0) + beta[3]) * v[3];
825 Real sol[4] = {0, 0, 0, 0};
826 pcg_solve<4>(sol,
b.data(), mat, precond, 8, Real(1.e-8));
827 ex(i-1,j ,k ) = sol[0];
828 ex(i ,j ,k ) = sol[1];
829 ey(i ,j-1,k ) = sol[2];
830 ey(i ,j ,k ) = sol[3];
832 LUSolver<4,Real> lusolver
833 ({dyy*Real(2.0) + beta[0],
839 dyy*Real(2.0) + beta[1],
845 dxx*Real(2.0) + beta[2],
851 dxx*Real(2.0) + beta[3]});
852 lusolver(beta.data(),
b.data());
853 ex(i-1,j ,k ) = beta[0];
854 ex(i ,j ,k ) = beta[1];
855 ey(i ,j-1,k ) = beta[2];
856 ey(i ,j ,k ) = beta[3];
859#elif (AMREX_SPACEDIM == 3)
861 if (my_color != color) {
return; }
863 Real dxx = adxinv[0]*adxinv[0];
864 Real dyy = adxinv[1]*adxinv[1];
865 Real dzz = adxinv[2]*adxinv[2];
866 Real dxy = adxinv[0]*adxinv[1];
867 Real dxz = adxinv[0]*adxinv[2];
868 Real dyz = adxinv[1]*adxinv[2];
871 {rhsx(i-1,j,k) - (-dyy * ( ex(i-1,j-1,k ) +
873 - dzz * ( ex(i-1,j ,k+1) +
875 + dxy * ( ey(i-1,j-1,k )
877 + dxz * ( ez(i-1,j ,k-1)
879 rhsx(i ,j,k) - (-dyy * ( ex(i ,j-1,k ) +
881 - dzz * ( ex(i ,j ,k+1) +
883 + dxy * (-ey(i+1,j-1,k )
885 + dxz * (-ez(i+1,j ,k-1)
887 rhsy(i,j-1,k) - (-dxx * ( ey(i-1,j-1,k ) +
889 - dzz * ( ey(i ,j-1,k-1) +
891 + dxy * ( ex(i-1,j-1,k )
893 + dyz * ( ez(i ,j-1,k-1)
895 rhsy(i,j ,k) - (-dxx * ( ey(i-1,j ,k ) +
897 - dzz * ( ey(i ,j ,k-1) +
899 + dxy * (-ex(i-1,j+1,k )
901 + dyz * (-ez(i ,j+1,k-1)
903 rhsz(i,j,k-1) - (-dxx * ( ez(i-1,j ,k-1) +
905 - dyy * ( ez(i ,j-1,k-1) +
907 + dxz * ( ex(i-1,j ,k-1)
909 + dyz * ( ey(i ,j-1,k-1)
911 rhsz(i,j,k ) - (-dxx * ( ez(i-1,j ,k ) +
913 - dyy * ( ez(i ,j-1,k ) +
915 + dxz * (-ex(i-1,j ,k+1)
917 + dyz * (-ey(i ,j-1,k+1)
920 GpuArray<Real,6> beta;
922 if (sinfo.xlo_is_symmetric(i)) {
924 beta[0] = beta[1] = betax(i,j,k);
925 }
else if (sinfo.xhi_is_symmetric(i)) {
927 beta[0] = beta[1] = betax(i-1,j,k);
929 beta[0] = betax(i-1,j,k);
930 beta[1] = betax(i ,j,k);
933 if (sinfo.ylo_is_symmetric(j)) {
935 beta[2] = beta[3] = betay(i,j,k);
936 }
else if (sinfo.yhi_is_symmetric(j)) {
938 beta[2] = beta[3] = betay(i,j-1,k);
940 beta[2] = betay(i,j-1,k);
941 beta[3] = betay(i,j ,k);
944 if (sinfo.zlo_is_symmetric(k)) {
946 beta[4] = beta[5] = betaz(i,j,k);
947 }
else if (sinfo.zhi_is_symmetric(k)) {
949 beta[4] = beta[5] = betaz(i,j,k-1);
951 beta[4] = betaz(i,j,k-1);
952 beta[5] = betaz(i,j,k );
956 Real diagInv[6] = {Real(1.0) / ((dyy+dzz)*Real(2.0) + beta[0]),
957 Real(1.0) / ((dyy+dzz)*Real(2.0) + beta[1]),
958 Real(1.0) / ((dxx+dzz)*Real(2.0) + beta[2]),
959 Real(1.0) / ((dxx+dzz)*Real(2.0) + beta[3]),
960 Real(1.0) / ((dxx+dyy)*Real(2.0) + beta[4]),
961 Real(1.0) / ((dxx+dyy)*Real(2.0) + beta[5])};
965 for (
int m = 0; m < 6; ++m) { z[m] =
r[m] * diagInv[m]; }
970 Av[0] = ((dyy+dzz)*Real(2.0) + beta[0]) * v[0] - dxy * v[2]
971 + dxy * v[3] - dxz * v[4] + dxz * v[5];
972 Av[1] = ((dyy+dzz)*Real(2.0) + beta[1]) * v[1] + dxy * v[2]
973 - dxy * v[3] + dxz * v[4] - dxz * v[5];
974 Av[2] = -dxy * v[0] + dxy * v[1] + ((dxx+dzz)*Real(2.0) + beta[2]) * v[2]
975 - dyz * v[4] + dyz * v[5];
976 Av[3] = dxy * v[0] - dxy * v[1] + ((dxx+dzz)*Real(2.0) + beta[3]) * v[3]
977 + dyz * v[4] - dyz * v[5];
978 Av[4] = -dxz * v[0] + dxz * v[1] - dyz * v[2] + dyz * v[3]
979 + ((dxx+dyy)*Real(2.0) + beta[4]) * v[4];
980 Av[5] = dxz * v[0] - dxz * v[1] + dyz * v[2] - dyz * v[3]
981 + ((dxx+dyy)*Real(2.0) + beta[5]) * v[5];
983 Real sol[6] = {0, 0, 0, 0, 0, 0};
984 pcg_solve<6>(sol,
b.data(), mat, precond, 8, Real(1.e-8));
985 ex(i-1,j ,k ) = sol[0];
986 ex(i ,j ,k ) = sol[1];
987 ey(i ,j-1,k ) = sol[2];
988 ey(i ,j ,k ) = sol[3];
989 ez(i ,j ,k-1) = sol[4];
990 ez(i ,j ,k ) = sol[5];
992 LUSolver<6,Real> lusolver
993 ({(dyy+dzz)*Real(2.0) + beta[0],
1001 (dyy+dzz)*Real(2.0) + beta[1],
1009 (dxx+dzz)*Real(2.0) + beta[2],
1017 (dxx+dzz)*Real(2.0) + beta[3],
1025 (dxx+dyy)*Real(2.0) + beta[4],
1033 (dxx+dyy)*Real(2.0) + beta[5]});
1034 lusolver(beta.data(),
b.data());
1035 ex(i-1,j ,k ) = beta[0];
1036 ex(i ,j ,k ) = beta[1];
1037 ey(i ,j-1,k ) = beta[2];
1038 ey(i ,j ,k ) = beta[3];
1039 ez(i ,j ,k-1) = beta[4];
1040 ez(i ,j ,k ) = beta[5];
1056 bool j_is_odd = (jc*2 != j);
1057 bool k_is_odd = (kc*2 != k);
1058 if (j_is_odd && k_is_odd) {
1059 fine(i,j,k) += Real(0.25) *
1060 (
crse(ic,jc,kc ) +
crse(ic,jc+1,kc ) +
1061 crse(ic,jc,kc+1) +
crse(ic,jc+1,kc+1));
1062 }
else if (j_is_odd) {
1063 fine(i,j,k) += Real(0.5) * (
crse(ic,jc,kc) +
crse(ic,jc+1,kc));
1064 }
else if (k_is_odd) {
1065 fine(i,j,k) += Real(0.5) * (
crse(ic,jc,kc) +
crse(ic,jc,kc+1));
1069 }
else if (dir == 1) {
1070 bool i_is_odd = (ic*2 != i);
1071 bool k_is_odd = (kc*2 != k);
1072 if (i_is_odd && k_is_odd) {
1073 fine(i,j,k) += Real(0.25) *
1074 (
crse(ic ,jc,kc ) +
crse(ic+1,jc,kc ) +
1075 crse(ic ,jc,kc+1) +
crse(ic+1,jc,kc+1));
1076 }
else if (i_is_odd) {
1077 fine(i,j,k) += Real(0.5) * (
crse(ic,jc,kc) +
crse(ic+1,jc,kc));
1078 }
else if (k_is_odd) {
1079 fine(i,j,k) += Real(0.5) * (
crse(ic,jc,kc) +
crse(ic,jc,kc+1));
1084 bool i_is_odd = (ic*2 != i);
1085 bool j_is_odd = (jc*2 != j);
1086 if (i_is_odd && j_is_odd) {
1087 fine(i,j,k) += Real(0.25) *
1088 (
crse(ic ,jc ,kc) +
crse(ic+1,jc ,kc) +
1089 crse(ic ,jc+1,kc) +
crse(ic+1,jc+1,kc));
1090 }
else if (i_is_odd) {
1091 fine(i,j,k) += Real(0.5) * (
crse(ic,jc,kc) +
crse(ic+1,jc,kc));
1092 }
else if (j_is_odd) {
1093 fine(i,j,k) += Real(0.5) * (
crse(ic,jc,kc) +
crse(ic,jc+1,kc));
1110 crse(i,j,k) = Real(0.0);
1114#if (AMREX_SPACEDIM == 3)
1116 crse(i,j,k) = Real(1./32.) * (
fine(ii ,jj-1,kk-1) +
1117 fine(ii ,jj ,kk-1) * Real(2.0) +
1118 fine(ii ,jj+1,kk-1) +
1119 fine(ii ,jj-1,kk ) * Real(2.0) +
1120 fine(ii ,jj ,kk ) * Real(4.0) +
1121 fine(ii ,jj+1,kk ) * Real(2.0) +
1122 fine(ii ,jj-1,kk+1) +
1123 fine(ii ,jj ,kk+1) * Real(2.0) +
1124 fine(ii ,jj+1,kk+1) +
1125 fine(ii+1,jj-1,kk-1) +
1126 fine(ii+1,jj ,kk-1) * Real(2.0) +
1127 fine(ii+1,jj+1,kk-1) +
1128 fine(ii+1,jj-1,kk ) * Real(2.0) +
1129 fine(ii+1,jj ,kk ) * Real(4.0) +
1130 fine(ii+1,jj+1,kk ) * Real(2.0) +
1131 fine(ii+1,jj-1,kk+1) +
1132 fine(ii+1,jj ,kk+1) * Real(2.0) +
1133 fine(ii+1,jj+1,kk+1) );
1134 }
else if (dir == 1) {
1135 crse(i,j,k) = Real(1./32.) * (
fine(ii-1,jj ,kk-1) +
1136 fine(ii ,jj ,kk-1) * Real(2.0) +
1137 fine(ii+1,jj ,kk-1) +
1138 fine(ii-1,jj ,kk ) * Real(2.0) +
1139 fine(ii ,jj ,kk ) * Real(4.0) +
1140 fine(ii+1,jj ,kk ) * Real(2.0) +
1141 fine(ii-1,jj ,kk+1) +
1142 fine(ii ,jj ,kk+1) * Real(2.0) +
1143 fine(ii+1,jj ,kk+1) +
1144 fine(ii-1,jj+1,kk-1) +
1145 fine(ii ,jj+1,kk-1) * Real(2.0) +
1146 fine(ii+1,jj+1,kk-1) +
1147 fine(ii-1,jj+1,kk ) * Real(2.0) +
1148 fine(ii ,jj+1,kk ) * Real(4.0) +
1149 fine(ii+1,jj+1,kk ) * Real(2.0) +
1150 fine(ii-1,jj+1,kk+1) +
1151 fine(ii ,jj+1,kk+1) * Real(2.0) +
1152 fine(ii+1,jj+1,kk+1) );
1154 crse(i,j,k) = Real(1./32.) * (
fine(ii-1,jj-1,kk ) +
1155 fine(ii ,jj-1,kk ) * Real(2.0) +
1156 fine(ii+1,jj-1,kk ) +
1157 fine(ii-1,jj ,kk ) * Real(2.0) +
1158 fine(ii ,jj ,kk ) * Real(4.0) +
1159 fine(ii+1,jj ,kk ) * Real(2.0) +
1160 fine(ii-1,jj+1,kk ) +
1161 fine(ii ,jj+1,kk ) * Real(2.0) +
1162 fine(ii+1,jj+1,kk ) +
1163 fine(ii-1,jj-1,kk+1) +
1164 fine(ii ,jj-1,kk+1) * Real(2.0) +
1165 fine(ii+1,jj-1,kk+1) +
1166 fine(ii-1,jj ,kk+1) * Real(2.0) +
1167 fine(ii ,jj ,kk+1) * Real(4.0) +
1168 fine(ii+1,jj ,kk+1) * Real(2.0) +
1169 fine(ii-1,jj+1,kk+1) +
1170 fine(ii ,jj+1,kk+1) * Real(2.0) +
1171 fine(ii+1,jj+1,kk+1) );
1173#elif (AMREX_SPACEDIM == 2)
1175 crse(i,j,0) = Real(0.125) * (
fine(ii ,jj-1,0) +
1176 fine(ii ,jj ,0) * Real(2.0) +
1179 fine(ii+1,jj ,0) * Real(2.0) +
1180 fine(ii+1,jj+1,0) );
1181 }
else if (dir == 1) {
1182 crse(i,j,0) = Real(0.125) * (
fine(ii-1,jj ,0) +
1183 fine(ii ,jj ,0) * Real(2.0) +
1186 fine(ii ,jj+1,0) * Real(2.0) +
1187 fine(ii+1,jj+1,0) );
1189 crse(i,j,0) = Real(1./16.)*(
fine(ii-1,jj-1,0) + Real(2.)*
fine(ii ,jj-1,0) +
fine(ii+1,jj-1,0)
1190 + Real(2.)*
fine(ii-1,jj ,0) + Real(4.)*
fine(ii ,jj ,0) + Real(2.)*
fine(ii+1,jj ,0)
1191 +
fine(ii-1,jj+1,0) + Real(2.)*
fine(ii ,jj+1,0) +
fine(ii+1,jj+1,0));
1195#elif (AMREX_SPACEDIM == 1)
1197 crse(i,0,0) = Real(0.5) * (
fine(ii,0,0) +
fine(ii+1,0,0));
1199 crse(i,0,0) = Real(0.25) * (
fine(ii-1,0,0) +
1200 fine(ii ,0,0) * Real(2.0) +
1222 a(i,j,k) = sign * a(i+
offset,j,k);
1223 }
else if (
idir == 1) {
1224 a(i,j,k) = sign * a(i,j+
offset,k);
1226 a(i,j,k) = sign * a(i,j,k+
offset);
#define AMREX_FORCE_INLINE
Definition AMReX_Extension.H:119
#define AMREX_RESTRICT
Definition AMReX_Extension.H:37
#define AMREX_GPU_DEVICE
Definition AMReX_GpuQualifiers.H:18
#define AMREX_GPU_HOST_DEVICE
Definition AMReX_GpuQualifiers.H:20
int idir
Definition AMReX_HypreMLABecLap.cpp:1093
Array4< int const > offset
Definition AMReX_HypreMLABecLap.cpp:1089
Array4< Real > fine
Definition AMReX_InterpFaceRegister.cpp:90
Array4< Real const > crse
Definition AMReX_InterpFaceRegister.cpp:92
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE bool cellCentered() const noexcept
True if the IndexTypeND is CELL based in all directions.
Definition AMReX_IndexType.H:101
Encapsulation of the Orientation of the Faces of a Box.
Definition AMReX_Orientation.H:29
AMREX_GPU_HOST_DEVICE int coordDir() const noexcept
Returns the coordinate direction.
Definition AMReX_Orientation.H:83
AMREX_GPU_HOST_DEVICE bool isLow() const noexcept
Returns true if Orientation is low.
Definition AMReX_Orientation.H:89
Definition AMReX_Amr.cpp:49
AMREX_GPU_DEVICE AMREX_FORCE_INLINE void mlcurlcurl_1D(int i, int j, int k, Array4< Real > const &ex, Array4< Real > const &ey, Array4< Real > const &ez, Array4< Real const > const &rhsx, Array4< Real const > const &rhsy, Array4< Real const > const &rhsz, Real beta, GpuArray< Real, AMREX_SPACEDIM > const &adxinv, int color, CurlCurlDirichletInfo const &dinfo, bool valid_x)
Definition AMReX_MLCurlCurl_K.H:463
CurlCurlStateType
Definition AMReX_MLCurlCurl_K.H:326
AMREX_GPU_DEVICE AMREX_FORCE_INLINE void mlcurlcurl_interpadd(int dir, int i, int j, int k, Array4< Real > const &fine, Array4< Real const > const &crse)
Definition AMReX_MLCurlCurl_K.H:1048
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE BoxND< dim > coarsen(const BoxND< dim > &b, int ref_ratio) noexcept
Coarsen BoxND by given (positive) refinement ratio. NOTE: if type(dir) = CELL centered: lo <- lo/rati...
Definition AMReX_Box.H:1304
AMREX_GPU_DEVICE AMREX_FORCE_INLINE void mlcurlcurl_adotx_y(int i, int j, int k, Array4< Real > const &Ay, Array4< Real const > const &ex, Array4< Real const > const &ey, Array4< Real const > const &ez, Real beta, GpuArray< Real, AMREX_SPACEDIM > const &adxinv)
Definition AMReX_MLCurlCurl_K.H:372
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE void ignore_unused(const Ts &...)
This shuts up the compiler about unused variables.
Definition AMReX.H:127
AMREX_GPU_DEVICE AMREX_FORCE_INLINE void mlcurlcurl_bc_symmetry(int i, int j, int k, Orientation face, IndexType it, Array4< Real > const &a)
Definition AMReX_MLCurlCurl_K.H:1208
AMREX_GPU_DEVICE AMREX_FORCE_INLINE void mlcurlcurl_adotx_z(int i, int j, int k, Array4< Real > const &Az, Array4< Real const > const &ex, Array4< Real const > const &ey, Array4< Real const > const &ez, Real beta, GpuArray< Real, AMREX_SPACEDIM > const &adxinv)
Definition AMReX_MLCurlCurl_K.H:418
AMREX_GPU_DEVICE AMREX_FORCE_INLINE void mlcurlcurl_adotx_x(int i, int j, int k, Array4< Real > const &Ax, Array4< Real const > const &ex, Array4< Real const > const &ey, Array4< Real const > const &ez, Real beta, GpuArray< Real, AMREX_SPACEDIM > const &adxinv)
Definition AMReX_MLCurlCurl_K.H:329
AMREX_GPU_DEVICE AMREX_FORCE_INLINE void mlcurlcurl_restriction(int dir, int i, int j, int k, Array4< Real > const &crse, Array4< Real const > const &fine, CurlCurlDirichletInfo const &dinfo)
Definition AMReX_MLCurlCurl_K.H:1101
Definition AMReX_Array4.H:61
Definition AMReX_MLCurlCurl_K.H:185
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE bool is_dirichlet_node(int i, int j, int k) const
Definition AMReX_MLCurlCurl_K.H:190
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE bool is_dirichlet_edge(int dim, int i, int j, int k) const
Definition AMReX_MLCurlCurl_K.H:246
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE bool is_dirichlet_z_edge(int i, int j, int) const
Definition AMReX_MLCurlCurl_K.H:234
IntVect dirichlet_hi
Definition AMReX_MLCurlCurl_K.H:187
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE bool is_dirichlet_y_edge(int i, int, int k) const
Definition AMReX_MLCurlCurl_K.H:222
IntVect dirichlet_lo
Definition AMReX_MLCurlCurl_K.H:186
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE bool is_dirichlet_x_edge(int, int j, int k) const
Definition AMReX_MLCurlCurl_K.H:207
Definition AMReX_MLCurlCurl_K.H:259
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE bool xlo_is_symmetric(int i) const
Definition AMReX_MLCurlCurl_K.H:264
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE bool xhi_is_symmetric(int i) const
Definition AMReX_MLCurlCurl_K.H:270
IntVect symmetry_hi
Definition AMReX_MLCurlCurl_K.H:261
IntVect symmetry_lo
Definition AMReX_MLCurlCurl_K.H:260
bool is_symmetric(int dir, int side, int idx) const
Definition AMReX_MLCurlCurl_K.H:303
Definition AMReX_Array.H:34