1 #include <AMReX_MultiFabUtil.H>
2 #include <AMReX_REAL.H>
3 #include <AMReX_MLCGSolver.H>
6 #include <AMReX_ArrayLim.H>
16 const Vector<BoxArray>& a_grids,
17 const Vector<DistributionMapping>& a_dmap,
19 {
define(a_geom, a_grids, a_dmap, a_info);}
30 BL_PROFILE(
"Operator::Diagonal::Diagonal::Fapply()");
31 std::cout <<
"in fapply, amrlev = " << amrlev << std::endl;
33 amrex::Box domain(m_geom[amrlev][mglev].Domain());
35 for (MFIter mfi(f,
true); mfi.isValid(); ++mfi)
37 const amrex::FArrayBox &ufab = u[mfi];
38 if(ufab.contains_inf())
Util::Abort(
INFO,
"Inf in ufab [before update]");
39 if(ufab.contains_nan())
Util::Abort(
INFO,
"Nan in ufab [before update]");
42 for (MFIter mfi(f,
true); mfi.isValid(); ++mfi)
44 const Box& bx = mfi.tilebox();
45 const amrex::FArrayBox &ufab = u[mfi];
46 amrex::FArrayBox &ffab = f[mfi];
48 AMREX_D_TERM(
for (
int m1 = bx.loVect()[0]; m1<=bx.hiVect()[0]; m1++),
49 for (
int m2 = bx.loVect()[1]; m2<=bx.hiVect()[1]; m2++),
50 for (
int m3 = bx.loVect()[2]; m3<=bx.hiVect()[2]; m3++))
53 for (
int i=0; i<AMREX_SPACEDIM; i++)
55 if (AMREX_D_TERM(m1 == domain.loVect()[0],
56 || m2 == domain.loVect()[1],
57 || m3 == domain.loVect()[2]) ||
58 AMREX_D_TERM(m1 == domain.hiVect()[0]+1,
59 || m2 == domain.hiVect()[1]+1,
60 || m3 == domain.hiVect()[2]+1))
62 ffab(m,i) = 2*ufab(m,i);
64 else if (AMREX_D_TERM(m1 == bx.loVect()[0],
65 || m2 == bx.loVect()[1],
66 || m3 == bx.loVect()[2]) ||
67 AMREX_D_TERM(m1 == bx.hiVect()[0],
68 || m2 == bx.hiVect()[1],
69 || m3 == bx.hiVect()[2]))
72 ffab(m,i) = 2*ufab(m,i);
76 for (MFIter mfi(f,
true); mfi.isValid(); ++mfi)
78 amrex::FArrayBox &ffab = f[mfi];
79 if(ffab.contains_inf())
Util::Abort(
INFO,
"Inf in ffab [after update]");
80 if(ffab.contains_nan())
Util::Abort(
INFO,
"Nan in ffab [after update]");
92 for (
int redblack = 0; redblack < 2; redblack++)
94 BL_PROFILE(
"Operator::Diagonal::Diagonal::Fsmooth()");
96 amrex::Box domain(m_geom[amrlev][mglev].Domain());
98 for (MFIter mfi(u,MFItInfo().EnableTiling().SetDynamic(
true));
101 const Box& bx = mfi.tilebox();
102 FArrayBox& ufab = u[mfi];
103 const FArrayBox& rhsfab = rhs[mfi];
105 AMREX_D_TERM(
for (
int m1 = bx.loVect()[0]; m1<=bx.hiVect()[0]; m1++),
106 for (
int m2 = bx.loVect()[1]; m2<=bx.hiVect()[1]; m2++),
107 for (
int m3 = bx.loVect()[2]; m3<=bx.hiVect()[2]; m3++))
109 if ((AMREX_D_TERM(m1, + m2, + m3))%2 == redblack)
continue;
112 for (
int i=0; i<AMREX_SPACEDIM; i++)
114 for (
int k=0; k<AMREX_SPACEDIM; k++)
116 if (AMREX_D_TERM(m1 == domain.loVect()[0],
117 || m2 == domain.loVect()[1],
118 || m3 == domain.loVect()[2]) ||
119 AMREX_D_TERM(m1 == domain.hiVect()[0]+1,
120 || m2 == domain.hiVect()[1]+1,
121 || m3 == domain.hiVect()[2]+1))
123 ufab(m,k) = rhsfab(m,k) / 2.0;
125 else if (AMREX_D_TERM(m1 == bx.loVect()[0],
126 || m2 == bx.loVect()[1],
127 || m3 == bx.loVect()[2]) ||
128 AMREX_D_TERM(m1 == bx.hiVect()[0],
129 || m2 == bx.hiVect()[1],
130 || m3 == bx.hiVect()[2]))
133 ufab(m,k) = rhsfab(m,k) / 2.0;