1#ifndef AMREX_ML_CURL_CURL_K_H_
2#define AMREX_ML_CURL_CURL_K_H_
3#include <AMReX_Config.H>
188#if (AMREX_SPACEDIM < 3)
195#if (AMREX_SPACEDIM == 1)
198#elif (AMREX_SPACEDIM == 2)
212#if (AMREX_SPACEDIM == 1)
215#elif (AMREX_SPACEDIM == 2)
227#if (AMREX_SPACEDIM < 3)
239#if (AMREX_SPACEDIM == 1)
241 if ((i == 0) && (coord == 1)) {
257 }
else if (dim == 1) {
282#if (AMREX_SPACEDIM > 1)
296#if (AMREX_SPACEDIM == 3)
312#if (AMREX_SPACEDIM == 1)
315#elif (AMREX_SPACEDIM == 2)
324 }
else if (dir == 1) {
342#if (AMREX_SPACEDIM == 1)
345#elif (AMREX_SPACEDIM == 2)
347 Real dyy = adxinv[1] * adxinv[1];
348 Real dxy = adxinv[0] * adxinv[1];
349 Real ccex = ex(i ,j ,k ) * dyy * Real(2.0)
350 - dyy * (ex(i ,j-1,k ) +
352 + dxy * (ey(i ,j-1,k )
356#elif (AMREX_SPACEDIM == 3)
357 Real dyy = adxinv[1] * adxinv[1];
358 Real dzz = adxinv[2] * adxinv[2];
359 Real dxy = adxinv[0] * adxinv[1];
360 Real dxz = adxinv[0] * adxinv[2];
361 Real ccex = ex(i ,j ,k ) * (dyy+dzz)*Real(2.0)
362 - dyy * (ex(i ,j-1,k ) +
364 - dzz * (ex(i ,j ,k+1) +
366 + dxy * (ey(i ,j-1,k )
370 + dxz * (ez(i ,j ,k-1)
375 Ax(i,j,k) = ccex + beta * ex(i,j,k);
384#
if (AMREX_SPACEDIM < 3)
389#if (AMREX_SPACEDIM == 1)
393 ccey = ey(i ,j,k) * Real(2.0)
396 }
else if (coord == 1) {
398 ccey = ey(i ,j,k) * (Real( 1.0)/(Real(i)*Real(i)) + Real(2.0))
399 + ey(i-1,j,k) * (Real( 0.5)/Real(i) - Real(1.0))
400 + ey(i+1,j,k) * (Real(-0.5)/Real(i) - Real(1.0));
403 ccey = ey(i ,j,k) * Real(2.0)
404 + ey(i-1,j,k) * (Real( 1.0)/Real(i) - Real(1.0))
405 + ey(i+1,j,k) * (Real(-1.0)/Real(i) - Real(1.0));
407 ccey *= adxinv[0] * adxinv[0];
408#elif (AMREX_SPACEDIM == 2)
410 Real dxx = adxinv[0] * adxinv[0];
411 Real dxy = adxinv[0] * adxinv[1];
412 Real ccey = ey(i ,j ,k ) * dxx * Real(2.0)
413 - dxx * (ey(i-1,j ,k ) +
415 + dxy * (ex(i-1,j ,k )
419#elif (AMREX_SPACEDIM == 3)
420 Real dxx = adxinv[0] * adxinv[0];
421 Real dzz = adxinv[2] * adxinv[2];
422 Real dxy = adxinv[0] * adxinv[1];
423 Real dyz = adxinv[1] * adxinv[2];
424 Real ccey = ey(i ,j ,k ) * (dxx+dzz)*Real(2.0)
425 - dxx * (ey(i-1,j ,k ) +
427 - dzz * (ey(i ,j ,k-1) +
429 + dxy * (ex(i-1,j ,k )
433 + dyz * (ez(i ,j ,k-1)
438 Ay(i,j,k) = ccey + beta * ey(i,j,k);
447#
if (AMREX_SPACEDIM < 3)
452#if (AMREX_SPACEDIM == 1)
456 ccez = ez(i ,j,k) * Real(2.0)
459 }
else if (coord == 1) {
461 ccez = Real(4.0) * (ez(0,0,0) - ez(1,0,0));
463 ccez = ez(i ,j,k) * Real(2.0)
464 + ez(i-1,j,k) * (Real( 0.5)/Real(i) - Real(1.0))
465 + ez(i+1,j,k) * (Real(-0.5)/Real(i) - Real(1.0));
468 ccez = ez(i ,j,k) * Real(2.0)
469 + ez(i-1,j,k) * (Real( 1.0)/Real(i) - Real(1.0))
470 + ez(i+1,j,k) * (Real(-1.0)/Real(i) - Real(1.0));
472 ccez *= adxinv[0] * adxinv[0];
473#elif (AMREX_SPACEDIM == 2)
475 Real dxx = adxinv[0] * adxinv[0];
476 Real dyy = adxinv[1] * adxinv[1];
477 Real ccez = ez(i ,j ,k ) * (dxx+dyy)*Real(2.0)
478 - dxx * (ez(i-1,j ,k ) +
480 - dyy * (ez(i ,j-1,k ) +
482#elif (AMREX_SPACEDIM == 3)
483 Real dxx = adxinv[0] * adxinv[0];
484 Real dyy = adxinv[1] * adxinv[1];
485 Real dxz = adxinv[0] * adxinv[2];
486 Real dyz = adxinv[1] * adxinv[2];
487 Real ccez = ez(i ,j ,k ) * (dxx+dyy)*Real(2.0)
488 - dxx * (ez(i-1,j ,k ) +
490 - dyy * (ez(i ,j-1,k ) +
492 + dxz * (ex(i-1,j ,k )
496 + dyz * (ey(i ,j-1,k )
501 Az(i,j,k) = ccez + beta * ez(i,j,k);
504#if (AMREX_SPACEDIM == 1)
506void mlcurlcurl_smooth_1d (
int i,
int j,
int k,
507 Array4<Real>
const& ex,
508 Array4<Real>
const& ey,
509 Array4<Real>
const& ez,
510 Array4<Real const>
const& rhsx,
511 Array4<Real const>
const& rhsy,
512 Array4<Real const>
const& rhsz,
514 GpuArray<Real,AMREX_SPACEDIM>
const& adxinv,
516 CurlCurlDirichletInfo
const& dinfo,
bool valid_x,
519 Real dxx = adxinv[0] * adxinv[0];
523 if (my_color == color)
526 ex(i,j,k) = rhsx(i,j,k) / beta;
531 if (dinfo.is_dirichlet_node(i,j,k)) {
return; }
536 Real gamma = dxx * Real(2.0) + beta;
538 Real ccey = cm * ey(i-1,j,k) + cp * ey(i+1,j,k);
539 Real res_y = rhsy(i,j,k) - ( gamma * ey(i,j,k) + ccey );
540 ey(i,j,k) += res_y/gamma;
542 Real ccez = cm * ez(i-1,j,k) + cp * ez(i+1,j,k);
543 Real res_z = rhsz(i,j,k) - ( gamma * ez(i,j,k) + ccez );
544 ez(i,j,k) += res_z/gamma;
548 if ((i > 0) && ! dinfo.is_dirichlet_node(i,j,k)) {
549 Real cm = dxx * (Real( 0.5)/Real(i) - Real(1.0));
550 Real cp = dxx * (Real(-0.5)/Real(i) - Real(1.0));
552 Real gamma = dxx * (Real(1.0)/(Real(i)*Real(i)) + Real(2.0)) + beta;
554 Real ccey = cm * ey(i-1,j,k) + cp * ey(i+1,j,k);
555 Real res_y = rhsy(i,j,k) - ( gamma * ey(i,j,k) + ccey );
556 ey(i,j,k) += res_y/gamma;
558 gamma = dxx * Real(2.0) + beta;
560 Real ccez = cm * ez(i-1,j,k) + cp * ez(i+1,j,k);
561 Real res_z = rhsz(i,j,k) - ( gamma * ez(i,j,k) + ccez );
562 ez(i,j,k) += res_z/gamma;
564 if ((i == 0) || (i == 1)) {
565 ez(0,0,0) = (rhsz(0,0,0) + Real(4.0)*dxx*ez(1,0,0))
566 / (beta + Real(4.0)*dxx);
571 if (i == 0 || dinfo.is_dirichlet_node(i,j,k)) {
return; }
573 Real cm = dxx * (Real( 1.0)/Real(i) - Real(1.0));
574 Real cp = dxx * (Real(-1.0)/Real(i) - Real(1.0));
576 Real gamma = dxx * Real(2.0) + beta;
578 Real ccey = cm * ey(i-1,j,k) + cp * ey(i+1,j,k);
579 Real res_y = rhsy(i,j,k) - ( gamma * ey(i,j,k) + ccey );
580 ey(i,j,k) += res_y/gamma;
582 Real ccez = cm * ez(i-1,j,k) + cp * ez(i+1,j,k);
583 Real res_z = rhsz(i,j,k) - ( gamma * ez(i,j,k) + ccez );
584 ez(i,j,k) += res_z/gamma;
591void mlcurlcurl_smooth_1d (
int i,
int j,
int k,
592 Array4<Real>
const& ex,
593 Array4<Real>
const& ey,
594 Array4<Real>
const& ez,
595 Array4<Real const>
const& rhsx,
596 Array4<Real const>
const& rhsy,
597 Array4<Real const>
const& rhsz,
598 Array4<Real const>
const& betax,
599 Array4<Real const>
const& betay,
600 Array4<Real const>
const& betaz,
601 GpuArray<Real,AMREX_SPACEDIM>
const& adxinv,
603 CurlCurlDirichletInfo
const& dinfo,
bool valid_x,
606 Real dxx = adxinv[0] * adxinv[0];
610 if (my_color == color)
613 ex(i,j,k) = rhsx(i,j,k) / betax(i,j,k);
618 if (dinfo.is_dirichlet_node(i,j,k)) {
return; }
623 Real gamma_y = dxx * Real(2.0) + betay(i,j,k);
624 Real ccey = cm * ey(i-1,j,k) + cp * ey(i+1,j,k);
625 Real res_y = rhsy(i,j,k) - ( gamma_y * ey(i,j,k) + ccey );
626 ey(i,j,k) += res_y/gamma_y;
628 Real gamma_z = dxx * Real(2.0) + betaz(i,j,k);
629 Real ccez = cm * ez(i-1,j,k) + cp * ez(i+1,j,k);
630 Real res_z = rhsz(i,j,k) - ( gamma_z * ez(i,j,k) + ccez );
631 ez(i,j,k) += res_z/gamma_z;
635 if ((i > 0) && ! dinfo.is_dirichlet_node(i,j,k)) {
636 Real cm = dxx * (Real( 0.5)/Real(i) - Real(1.0));
637 Real cp = dxx * (Real(-0.5)/Real(i) - Real(1.0));
639 Real gamma = dxx * (Real(1.0)/(Real(i)*Real(i)) + Real(2.0)) + betay(i,j,k);
641 Real ccey = cm * ey(i-1,j,k) + cp * ey(i+1,j,k);
642 Real res_y = rhsy(i,j,k) - ( gamma * ey(i,j,k) + ccey );
643 ey(i,j,k) += res_y/gamma;
647 ez(0,0,0) = (rhsz(0,0,0) + Real(4.0)*dxx*ez(1,0,0)) / (betaz(0,0,0) + Real(4.0)*dxx);
648 }
else if (! dinfo.is_dirichlet_node(i,j,k)) {
649 Real cm = dxx * (Real( 0.5)/Real(i) - Real(1.0));
650 Real cp = dxx * (Real(-0.5)/Real(i) - Real(1.0));
652 Real gamma = dxx * Real(2.0) + betaz(i,j,k);
654 Real ccez = cm * ez(i-1,j,k) + cp * ez(i+1,j,k);
655 Real res_z = rhsz(i,j,k) - ( gamma * ez(i,j,k) + ccez );
656 ez(i,j,k) += res_z/gamma;
661 if (dinfo.is_dirichlet_node(i,j,k)) {
return; }
663 Real cm = dxx * (Real( 1.0)/Real(i) - Real(1.0));
664 Real cp = dxx * (Real(-1.0)/Real(i) - Real(1.0));
666 Real gamma_y = dxx * Real(2.0) + betay(i,j,k);
667 Real ccey = cm * ey(i-1,j,k) + cp * ey(i+1,j,k);
668 Real res_y = rhsy(i,j,k) - ( gamma_y * ey(i,j,k) + ccey );
669 ey(i,j,k) += res_y/gamma_y;
671 Real gamma_z = dxx * Real(2.0) + betaz(i,j,k);
672 Real ccez = cm * ez(i-1,j,k) + cp * ez(i+1,j,k);
673 Real res_z = rhsz(i,j,k) - ( gamma_z * ez(i,j,k) + ccez );
674 ez(i,j,k) += res_z/gamma_z;
682#if (AMREX_SPACEDIM > 1)
692#
if (AMREX_SPACEDIM == 2)
702 int my_color = i%2 + 2*(j%2);
704 my_color = 3 - my_color;
707#if (AMREX_SPACEDIM == 2)
709 Real dxx = adxinv[0] * adxinv[0];
710 Real dyy = adxinv[1] * adxinv[1];
712 if (((my_color == 0 || my_color == 3) && (color == 0 || color == 3)) ||
713 ((my_color == 1 || my_color == 2) && (color == 1 || color == 2)))
715 Real gamma = (dxx+dyy)*Real(2.0) + beta;
716 Real ccez = - dxx * (ez(i-1,j ,k ) +
718 - dyy * (ez(i ,j-1,k ) +
720 Real res = rhsz(i,j,k) - (gamma*ez(i,j,k) + ccez);
721 constexpr Real omega = Real(1.15);
722 ez(i,j,k) += omega/gamma * res;
725 if (my_color != color) {
return; }
727 Real dxy = adxinv[0]*adxinv[1];
730 {rhsx(i-1,j,k) - (-dyy * ( ex(i-1,j-1,k ) +
732 + dxy * ( ey(i-1,j-1,k )
734 rhsx(i ,j,k) - (-dyy * ( ex(i ,j-1,k ) +
736 + dxy * (-ey(i+1,j-1,k )
738 rhsy(i,j-1,k) - (-dxx * ( ey(i-1,j-1,k ) +
740 + dxy * ( ex(i-1,j-1,k )
742 rhsy(i,j ,k) - (-dxx * ( ey(i-1,j ,k ) +
744 + dxy * (-ex(i-1,j+1,k )
760 lusolver(
x.data(),
b.data());
761 ex(i-1,j ,k ) =
x[0];
763 ey(i ,j-1,k ) =
x[2];
766#elif (AMREX_SPACEDIM == 3)
768 if (my_color != color) {
return; }
770 Real dxx = adxinv[0]*adxinv[0];
771 Real dyy = adxinv[1]*adxinv[1];
772 Real dzz = adxinv[2]*adxinv[2];
773 Real dxy = adxinv[0]*adxinv[1];
774 Real dxz = adxinv[0]*adxinv[2];
775 Real dyz = adxinv[1]*adxinv[2];
778 {rhsx(i-1,j,k) - (-dyy * ( ex(i-1,j-1,k ) +
780 - dzz * ( ex(i-1,j ,k+1) +
782 + dxy * ( ey(i-1,j-1,k )
784 + dxz * ( ez(i-1,j ,k-1)
786 rhsx(i ,j,k) - (-dyy * ( ex(i ,j-1,k ) +
788 - dzz * ( ex(i ,j ,k+1) +
790 + dxy * (-ey(i+1,j-1,k )
792 + dxz * (-ez(i+1,j ,k-1)
794 rhsy(i,j-1,k) - (-dxx * ( ey(i-1,j-1,k ) +
796 - dzz * ( ey(i ,j-1,k-1) +
798 + dxy * ( ex(i-1,j-1,k )
800 + dyz * ( ez(i ,j-1,k-1)
802 rhsy(i,j ,k) - (-dxx * ( ey(i-1,j ,k ) +
804 - dzz * ( ey(i ,j ,k-1) +
806 + dxy * (-ex(i-1,j+1,k )
808 + dyz * (-ez(i ,j+1,k-1)
810 rhsz(i,j,k-1) - (-dxx * ( ez(i-1,j ,k-1) +
812 - dyy * ( ez(i ,j-1,k-1) +
814 + dxz * ( ex(i-1,j ,k-1)
816 + dyz * ( ey(i ,j-1,k-1)
818 rhsz(i,j,k ) - (-dxx * ( ez(i-1,j ,k ) +
820 - dyy * ( ez(i ,j-1,k ) +
822 + dxz * (-ex(i-1,j ,k+1)
824 + dyz * (-ey(i ,j-1,k+1)
846 lusolver(
x.data(),
b.data());
847 ex(i-1,j ,k ) =
x[0];
849 ey(i ,j-1,k ) =
x[2];
851 ez(i ,j ,k-1) =
x[4];
875 int my_color = i%2 + 2*(j%2);
877 my_color = 3 - my_color;
880#if (AMREX_SPACEDIM == 2)
882 Real dxx = adxinv[0] * adxinv[0];
883 Real dyy = adxinv[1] * adxinv[1];
885 if (((my_color == 0 || my_color == 3) && (color == 0 || color == 3)) ||
886 ((my_color == 1 || my_color == 2) && (color == 1 || color == 2)))
888 Real gamma = (dxx+dyy)*Real(2.0) + betaz(i,j,k);
889 Real ccez = - dxx * (ez(i-1,j ,k ) +
891 - dyy * (ez(i ,j-1,k ) +
893 Real res = rhsz(i,j,k) - (gamma*ez(i,j,k) + ccez);
894 constexpr Real omega = Real(1.15);
895 ez(i,j,k) += omega/gamma * res;
898 if (my_color != color) {
return; }
900 Real dxy = adxinv[0]*adxinv[1];
903 {rhsx(i-1,j,k) - (-dyy * ( ex(i-1,j-1,k ) +
905 + dxy * ( ey(i-1,j-1,k )
907 rhsx(i ,j,k) - (-dyy * ( ex(i ,j-1,k ) +
909 + dxy * (-ey(i+1,j-1,k )
911 rhsy(i,j-1,k) - (-dxx * ( ey(i-1,j-1,k ) +
913 + dxy * ( ex(i-1,j-1,k )
915 rhsy(i,j ,k) - (-dxx * ( ey(i-1,j ,k ) +
917 + dxy * (-ex(i-1,j+1,k )
924 beta[0] = beta[1] = betax(i,j,k);
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);
935 beta[2] = beta[3] = betay(i,j,k);
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);
945 Real diagInv[4] = {Real(1.0) / (dyy*Real(2.0) + beta[0]),
946 Real(1.0) / (dyy*Real(2.0) + beta[1]),
947 Real(1.0) / (dxx*Real(2.0) + beta[2]),
948 Real(1.0) / (dxx*Real(2.0) + beta[3])};
952 for (
int m = 0; m < 4; ++m) {
z[m] =
r[m] * diagInv[m]; }
957 Av[0] = (dyy*Real(2.0) + beta[0]) * v[0] - dxy * v[2] + dxy * v[3];
958 Av[1] = (dyy*Real(2.0) + beta[1]) * v[1] + dxy * v[2] - dxy * v[3];
959 Av[2] = -dxy * v[0] + dxy * v[1] + (dxx*Real(2.0) + beta[2]) * v[2];
960 Av[3] = dxy * v[0] - dxy * v[1] + (dxx*Real(2.0) + beta[3]) * v[3];
962 Real sol[4] = {0, 0, 0, 0};
963 pcg_solve<4>(sol,
b.data(), mat, precond, 8, Real(1.e-8));
964 ex(i-1,j ,k ) = sol[0];
965 ex(i ,j ,k ) = sol[1];
966 ey(i ,j-1,k ) = sol[2];
967 ey(i ,j ,k ) = sol[3];
970 ({dyy*Real(2.0) + beta[0],
976 dyy*Real(2.0) + beta[1],
982 dxx*Real(2.0) + beta[2],
988 dxx*Real(2.0) + beta[3]});
989 lusolver(beta.
data(),
b.data());
990 ex(i-1,j ,k ) = beta[0];
991 ex(i ,j ,k ) = beta[1];
992 ey(i ,j-1,k ) = beta[2];
993 ey(i ,j ,k ) = beta[3];
996#elif (AMREX_SPACEDIM == 3)
998 if (my_color != color) {
return; }
1000 Real dxx = adxinv[0]*adxinv[0];
1001 Real dyy = adxinv[1]*adxinv[1];
1002 Real dzz = adxinv[2]*adxinv[2];
1003 Real dxy = adxinv[0]*adxinv[1];
1004 Real dxz = adxinv[0]*adxinv[2];
1005 Real dyz = adxinv[1]*adxinv[2];
1008 {rhsx(i-1,j,k) - (-dyy * ( ex(i-1,j-1,k ) +
1010 - dzz * ( ex(i-1,j ,k+1) +
1012 + dxy * ( ey(i-1,j-1,k )
1014 + dxz * ( ez(i-1,j ,k-1)
1016 rhsx(i ,j,k) - (-dyy * ( ex(i ,j-1,k ) +
1018 - dzz * ( ex(i ,j ,k+1) +
1020 + dxy * (-ey(i+1,j-1,k )
1022 + dxz * (-ez(i+1,j ,k-1)
1024 rhsy(i,j-1,k) - (-dxx * ( ey(i-1,j-1,k ) +
1026 - dzz * ( ey(i ,j-1,k-1) +
1028 + dxy * ( ex(i-1,j-1,k )
1030 + dyz * ( ez(i ,j-1,k-1)
1032 rhsy(i,j ,k) - (-dxx * ( ey(i-1,j ,k ) +
1034 - dzz * ( ey(i ,j ,k-1) +
1036 + dxy * (-ex(i-1,j+1,k )
1038 + dyz * (-ez(i ,j+1,k-1)
1040 rhsz(i,j,k-1) - (-dxx * ( ez(i-1,j ,k-1) +
1042 - dyy * ( ez(i ,j-1,k-1) +
1044 + dxz * ( ex(i-1,j ,k-1)
1046 + dyz * ( ey(i ,j-1,k-1)
1048 rhsz(i,j,k ) - (-dxx * ( ez(i-1,j ,k ) +
1050 - dyy * ( ez(i ,j-1,k ) +
1052 + dxz * (-ex(i-1,j ,k+1)
1054 + dyz * (-ey(i ,j-1,k+1)
1061 beta[0] = beta[1] = betax(i,j,k);
1064 beta[0] = beta[1] = betax(i-1,j,k);
1066 beta[0] = betax(i-1,j,k);
1067 beta[1] = betax(i ,j,k);
1072 beta[2] = beta[3] = betay(i,j,k);
1075 beta[2] = beta[3] = betay(i,j-1,k);
1077 beta[2] = betay(i,j-1,k);
1078 beta[3] = betay(i,j ,k);
1083 beta[4] = beta[5] = betaz(i,j,k);
1086 beta[4] = beta[5] = betaz(i,j,k-1);
1088 beta[4] = betaz(i,j,k-1);
1089 beta[5] = betaz(i,j,k );
1092 if constexpr (PCG) {
1093 Real diagInv[6] = {Real(1.0) / ((dyy+dzz)*Real(2.0) + beta[0]),
1094 Real(1.0) / ((dyy+dzz)*Real(2.0) + beta[1]),
1095 Real(1.0) / ((dxx+dzz)*Real(2.0) + beta[2]),
1096 Real(1.0) / ((dxx+dzz)*Real(2.0) + beta[3]),
1097 Real(1.0) / ((dxx+dyy)*Real(2.0) + beta[4]),
1098 Real(1.0) / ((dxx+dyy)*Real(2.0) + beta[5])};
1102 for (
int m = 0; m < 6; ++m) {
z[m] =
r[m] * diagInv[m]; }
1107 Av[0] = ((dyy+dzz)*Real(2.0) + beta[0]) * v[0] - dxy * v[2]
1108 + dxy * v[3] - dxz * v[4] + dxz * v[5];
1109 Av[1] = ((dyy+dzz)*Real(2.0) + beta[1]) * v[1] + dxy * v[2]
1110 - dxy * v[3] + dxz * v[4] - dxz * v[5];
1111 Av[2] = -dxy * v[0] + dxy * v[1] + ((dxx+dzz)*Real(2.0) + beta[2]) * v[2]
1112 - dyz * v[4] + dyz * v[5];
1113 Av[3] = dxy * v[0] - dxy * v[1] + ((dxx+dzz)*Real(2.0) + beta[3]) * v[3]
1114 + dyz * v[4] - dyz * v[5];
1115 Av[4] = -dxz * v[0] + dxz * v[1] - dyz * v[2] + dyz * v[3]
1116 + ((dxx+dyy)*Real(2.0) + beta[4]) * v[4];
1117 Av[5] = dxz * v[0] - dxz * v[1] + dyz * v[2] - dyz * v[3]
1118 + ((dxx+dyy)*Real(2.0) + beta[5]) * v[5];
1120 Real sol[6] = {0, 0, 0, 0, 0, 0};
1121 pcg_solve<6>(sol,
b.data(), mat, precond, 8, Real(1.e-8));
1122 ex(i-1,j ,k ) = sol[0];
1123 ex(i ,j ,k ) = sol[1];
1124 ey(i ,j-1,k ) = sol[2];
1125 ey(i ,j ,k ) = sol[3];
1126 ez(i ,j ,k-1) = sol[4];
1127 ez(i ,j ,k ) = sol[5];
1130 ({(dyy+dzz)*Real(2.0) + beta[0],
1138 (dyy+dzz)*Real(2.0) + beta[1],
1146 (dxx+dzz)*Real(2.0) + beta[2],
1154 (dxx+dzz)*Real(2.0) + beta[3],
1162 (dxx+dyy)*Real(2.0) + beta[4],
1170 (dxx+dyy)*Real(2.0) + beta[5]});
1171 lusolver(beta.
data(),
b.data());
1172 ex(i-1,j ,k ) = beta[0];
1173 ex(i ,j ,k ) = beta[1];
1174 ey(i ,j-1,k ) = beta[2];
1175 ey(i ,j ,k ) = beta[3];
1176 ez(i ,j ,k-1) = beta[4];
1177 ez(i ,j ,k ) = beta[5];
1193 bool j_is_odd = (jc*2 != j);
1194 bool k_is_odd = (kc*2 != k);
1195 if (j_is_odd && k_is_odd) {
1196 fine(i,j,k) += Real(0.25) *
1197 (
crse(ic,jc,kc ) +
crse(ic,jc+1,kc ) +
1198 crse(ic,jc,kc+1) +
crse(ic,jc+1,kc+1));
1199 }
else if (j_is_odd) {
1200 fine(i,j,k) += Real(0.5) * (
crse(ic,jc,kc) +
crse(ic,jc+1,kc));
1201 }
else if (k_is_odd) {
1202 fine(i,j,k) += Real(0.5) * (
crse(ic,jc,kc) +
crse(ic,jc,kc+1));
1206 }
else if (dir == 1) {
1207 bool i_is_odd = (ic*2 != i);
1208 bool k_is_odd = (kc*2 != k);
1209 if (i_is_odd && k_is_odd) {
1210 fine(i,j,k) += Real(0.25) *
1211 (
crse(ic ,jc,kc ) +
crse(ic+1,jc,kc ) +
1212 crse(ic ,jc,kc+1) +
crse(ic+1,jc,kc+1));
1213 }
else if (i_is_odd) {
1214 fine(i,j,k) += Real(0.5) * (
crse(ic,jc,kc) +
crse(ic+1,jc,kc));
1215 }
else if (k_is_odd) {
1216 fine(i,j,k) += Real(0.5) * (
crse(ic,jc,kc) +
crse(ic,jc,kc+1));
1221 bool i_is_odd = (ic*2 != i);
1222 bool j_is_odd = (jc*2 != j);
1223 if (i_is_odd && j_is_odd) {
1224 fine(i,j,k) += Real(0.25) *
1225 (
crse(ic ,jc ,kc) +
crse(ic+1,jc ,kc) +
1226 crse(ic ,jc+1,kc) +
crse(ic+1,jc+1,kc));
1227 }
else if (i_is_odd) {
1228 fine(i,j,k) += Real(0.5) * (
crse(ic,jc,kc) +
crse(ic+1,jc,kc));
1229 }
else if (j_is_odd) {
1230 fine(i,j,k) += Real(0.5) * (
crse(ic,jc,kc) +
crse(ic,jc+1,kc));
1247 crse(i,j,k) = Real(0.0);
1251#if (AMREX_SPACEDIM == 3)
1253 crse(i,j,k) = Real(1./32.) * (
fine(ii ,jj-1,kk-1) +
1254 fine(ii ,jj ,kk-1) * Real(2.0) +
1255 fine(ii ,jj+1,kk-1) +
1256 fine(ii ,jj-1,kk ) * Real(2.0) +
1257 fine(ii ,jj ,kk ) * Real(4.0) +
1258 fine(ii ,jj+1,kk ) * Real(2.0) +
1259 fine(ii ,jj-1,kk+1) +
1260 fine(ii ,jj ,kk+1) * Real(2.0) +
1261 fine(ii ,jj+1,kk+1) +
1262 fine(ii+1,jj-1,kk-1) +
1263 fine(ii+1,jj ,kk-1) * Real(2.0) +
1264 fine(ii+1,jj+1,kk-1) +
1265 fine(ii+1,jj-1,kk ) * Real(2.0) +
1266 fine(ii+1,jj ,kk ) * Real(4.0) +
1267 fine(ii+1,jj+1,kk ) * Real(2.0) +
1268 fine(ii+1,jj-1,kk+1) +
1269 fine(ii+1,jj ,kk+1) * Real(2.0) +
1270 fine(ii+1,jj+1,kk+1) );
1271 }
else if (dir == 1) {
1272 crse(i,j,k) = Real(1./32.) * (
fine(ii-1,jj ,kk-1) +
1273 fine(ii ,jj ,kk-1) * Real(2.0) +
1274 fine(ii+1,jj ,kk-1) +
1275 fine(ii-1,jj ,kk ) * Real(2.0) +
1276 fine(ii ,jj ,kk ) * Real(4.0) +
1277 fine(ii+1,jj ,kk ) * Real(2.0) +
1278 fine(ii-1,jj ,kk+1) +
1279 fine(ii ,jj ,kk+1) * Real(2.0) +
1280 fine(ii+1,jj ,kk+1) +
1281 fine(ii-1,jj+1,kk-1) +
1282 fine(ii ,jj+1,kk-1) * Real(2.0) +
1283 fine(ii+1,jj+1,kk-1) +
1284 fine(ii-1,jj+1,kk ) * Real(2.0) +
1285 fine(ii ,jj+1,kk ) * Real(4.0) +
1286 fine(ii+1,jj+1,kk ) * Real(2.0) +
1287 fine(ii-1,jj+1,kk+1) +
1288 fine(ii ,jj+1,kk+1) * Real(2.0) +
1289 fine(ii+1,jj+1,kk+1) );
1291 crse(i,j,k) = Real(1./32.) * (
fine(ii-1,jj-1,kk ) +
1292 fine(ii ,jj-1,kk ) * Real(2.0) +
1293 fine(ii+1,jj-1,kk ) +
1294 fine(ii-1,jj ,kk ) * Real(2.0) +
1295 fine(ii ,jj ,kk ) * Real(4.0) +
1296 fine(ii+1,jj ,kk ) * Real(2.0) +
1297 fine(ii-1,jj+1,kk ) +
1298 fine(ii ,jj+1,kk ) * Real(2.0) +
1299 fine(ii+1,jj+1,kk ) +
1300 fine(ii-1,jj-1,kk+1) +
1301 fine(ii ,jj-1,kk+1) * Real(2.0) +
1302 fine(ii+1,jj-1,kk+1) +
1303 fine(ii-1,jj ,kk+1) * Real(2.0) +
1304 fine(ii ,jj ,kk+1) * Real(4.0) +
1305 fine(ii+1,jj ,kk+1) * Real(2.0) +
1306 fine(ii-1,jj+1,kk+1) +
1307 fine(ii ,jj+1,kk+1) * Real(2.0) +
1308 fine(ii+1,jj+1,kk+1) );
1310#elif (AMREX_SPACEDIM == 2)
1312 crse(i,j,0) = Real(0.125) * (
fine(ii ,jj-1,0) +
1313 fine(ii ,jj ,0) * Real(2.0) +
1316 fine(ii+1,jj ,0) * Real(2.0) +
1317 fine(ii+1,jj+1,0) );
1318 }
else if (dir == 1) {
1319 crse(i,j,0) = Real(0.125) * (
fine(ii-1,jj ,0) +
1320 fine(ii ,jj ,0) * Real(2.0) +
1323 fine(ii ,jj+1,0) * Real(2.0) +
1324 fine(ii+1,jj+1,0) );
1326 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)
1327 + Real(2.)*
fine(ii-1,jj ,0) + Real(4.)*
fine(ii ,jj ,0) + Real(2.)*
fine(ii+1,jj ,0)
1328 +
fine(ii-1,jj+1,0) + Real(2.)*
fine(ii ,jj+1,0) +
fine(ii+1,jj+1,0));
1332#elif (AMREX_SPACEDIM == 1)
1334 crse(i,0,0) = Real(0.5) * (
fine(ii,0,0) +
fine(ii+1,0,0));
1335 }
else if (i == 0 && dir == 2 && dinfo.coord == 1) {
1338 crse(i,0,0) = Real(0.25) * (
fine(ii-1,0,0) +
1339 fine(ii ,0,0) * Real(2.0) +
1361 a(i,j,k) = sign * a(i+
offset,j,k);
1362 }
else if (
idir == 1) {
1363 a(i,j,k) = sign * a(i,j+
offset,k);
1365 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
__host__ __device__ bool cellCentered() const noexcept
True if the IndexTypeND is CELL based in all directions.
Definition AMReX_IndexType.H:101
Definition AMReX_LUSolver.H:16
Encapsulation of the Orientation of the Faces of a Box.
Definition AMReX_Orientation.H:29
__host__ __device__ bool isLow() const noexcept
Returns true if Orientation is low.
Definition AMReX_Orientation.H:89
__host__ __device__ int coordDir() const noexcept
Returns the coordinate direction.
Definition AMReX_Orientation.H:83
Definition AMReX_Amr.cpp:49
__device__ 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:1238
__host__ __device__ void ignore_unused(const Ts &...)
This shuts up the compiler about unused variables.
Definition AMReX.H:138
CurlCurlStateType
Definition AMReX_MLCurlCurl_K.H:333
__host__ __device__ 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:1322
__device__ void mlcurlcurl_gs4_lu(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, GpuArray< Real, 3 > const &adxinv, int color, LUSolver< 3 *2, Real > const &lusolver, CurlCurlDirichletInfo const &dinfo, CurlCurlSymmetryInfo const &sinfo)
Definition AMReX_MLCurlCurl_K.H:685
__device__ void mlcurlcurl_bc_symmetry(int i, int j, int k, Orientation face, IndexType it, Array4< Real > const &a)
Definition AMReX_MLCurlCurl_K.H:1347
__device__ 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:1185
__device__ 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, 3 > const &adxinv)
Definition AMReX_MLCurlCurl_K.H:442
__device__ void mlcurlcurl_gs4(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, GpuArray< Real, 3 > const &adxinv, int color, Array4< Real const > const &betax, Array4< Real const > const &betay, Array4< Real const > const &betaz, CurlCurlDirichletInfo const &dinfo, CurlCurlSymmetryInfo const &sinfo)
Definition AMReX_MLCurlCurl_K.H:858
__device__ 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, 3 > const &adxinv)
Definition AMReX_MLCurlCurl_K.H:336
__device__ 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, 3 > const &adxinv)
Definition AMReX_MLCurlCurl_K.H:379
Definition AMReX_Array4.H:61
Definition AMReX_MLCurlCurl_K.H:185
__host__ __device__ bool is_dirichlet_z_edge(int i, int j, int) const
Definition AMReX_MLCurlCurl_K.H:237
__host__ __device__ bool is_dirichlet_x_edge(int, int j, int k) const
Definition AMReX_MLCurlCurl_K.H:210
__host__ __device__ bool is_dirichlet_edge(int dim, int i, int j, int k) const
Definition AMReX_MLCurlCurl_K.H:253
IntVect dirichlet_hi
Definition AMReX_MLCurlCurl_K.H:187
IntVect dirichlet_lo
Definition AMReX_MLCurlCurl_K.H:186
__host__ __device__ bool is_dirichlet_y_edge(int i, int, int k) const
Definition AMReX_MLCurlCurl_K.H:225
__host__ __device__ bool is_dirichlet_node(int i, int j, int k) const
Definition AMReX_MLCurlCurl_K.H:193
Definition AMReX_MLCurlCurl_K.H:266
__host__ __device__ bool zhi_is_symmetric(int k) const
Definition AMReX_MLCurlCurl_K.H:304
__host__ __device__ bool xhi_is_symmetric(int i) const
Definition AMReX_MLCurlCurl_K.H:277
__host__ __device__ bool yhi_is_symmetric(int j) const
Definition AMReX_MLCurlCurl_K.H:290
IntVect symmetry_hi
Definition AMReX_MLCurlCurl_K.H:268
IntVect symmetry_lo
Definition AMReX_MLCurlCurl_K.H:267
__host__ __device__ bool xlo_is_symmetric(int i) const
Definition AMReX_MLCurlCurl_K.H:271
__host__ __device__ bool ylo_is_symmetric(int j) const
Definition AMReX_MLCurlCurl_K.H:284
__host__ __device__ bool zlo_is_symmetric(int k) const
Definition AMReX_MLCurlCurl_K.H:298
bool is_symmetric(int dir, int side, int idx) const
Definition AMReX_MLCurlCurl_K.H:310
Definition AMReX_Array.H:34
__host__ __device__ const T * data() const noexcept
Definition AMReX_Array.H:66