Alamo
Diagonal.cpp
Go to the documentation of this file.
1 #include <AMReX_MultiFabUtil.H>
2 #include <AMReX_REAL.H>
3 #include <AMReX_MLCGSolver.H>
4 #include "Set/Set.H"
5 
6 #include <AMReX_ArrayLim.H>
7 
8 #include "Set/Set.H"
9 #include "Diagonal.H"
10 
11 
12 
13 namespace Operator
14 {
15 Diagonal::Diagonal (const Vector<Geometry>& a_geom,
16  const Vector<BoxArray>& a_grids,
17  const Vector<DistributionMapping>& a_dmap,
18  const LPInfo& a_info)
19 {define(a_geom, a_grids, a_dmap, a_info);}
21 
22 
23 void
24 Diagonal::Fapply (int amrlev,
25  int mglev,
26  MultiFab& f,
27  const MultiFab& u
28  ) const
29 {
30  BL_PROFILE("Operator::Diagonal::Diagonal::Fapply()");
31  std::cout << "in fapply, amrlev = " << amrlev << std::endl;
32 
33  amrex::Box domain(m_geom[amrlev][mglev].Domain());
34 
35  for (MFIter mfi(f, true); mfi.isValid(); ++mfi)
36  {
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]");
40  }
41 
42  for (MFIter mfi(f, true); mfi.isValid(); ++mfi)
43  {
44  const Box& bx = mfi.tilebox();
45  const amrex::FArrayBox &ufab = u[mfi];
46  amrex::FArrayBox &ffab = f[mfi];
47 
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++))
51  {
52  amrex::IntVect m(AMREX_D_DECL(m1,m2,m3));
53  for (int i=0; i<AMREX_SPACEDIM; i++)
54  {
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))
61  {
62  ffab(m,i) = 2*ufab(m,i);
63  }
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]))
70  continue;
71  else
72  ffab(m,i) = 2*ufab(m,i);
73  }
74  }
75  }
76  for (MFIter mfi(f, true); mfi.isValid(); ++mfi)
77  {
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]");
81  }
82 }
83 
84 
85 void
86 Diagonal::Fsmooth (int amrlev,
87  int mglev,
88  MultiFab& u,
89  const MultiFab& rhs
90  ) const
91 {
92  for (int redblack = 0; redblack < 2; redblack++)
93  {
94  BL_PROFILE("Operator::Diagonal::Diagonal::Fsmooth()");
95 
96  amrex::Box domain(m_geom[amrlev][mglev].Domain());
97 
98  for (MFIter mfi(u,MFItInfo().EnableTiling().SetDynamic(true));
99  mfi.isValid(); ++mfi)
100  {
101  const Box& bx = mfi.tilebox();
102  FArrayBox& ufab = u[mfi];
103  const FArrayBox& rhsfab = rhs[mfi];
104 
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++))
108  {
109  if ((AMREX_D_TERM(m1, + m2, + m3))%2 == redblack) continue;
110  amrex::IntVect m(AMREX_D_DECL(m1,m2,m3));
111 
112  for (int i=0; i<AMREX_SPACEDIM; i++)
113  {
114  for (int k=0; k<AMREX_SPACEDIM; k++)
115  {
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))
122  {
123  ufab(m,k) = rhsfab(m,k) / 2.0;
124  }
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]))
131  continue;
132  else
133  ufab(m,k) = rhsfab(m,k) / 2.0;
134  }
135  }
136  }
137  }
138  }
139 }
140 }
Operator::Operator< Grid::Node >::define
void define(const Vector< Geometry > &a_geom, const Vector< BoxArray > &a_grids, const Vector< DistributionMapping > &a_dmap, const LPInfo &a_info=LPInfo(), const Vector< FabFactory< FArrayBox > const * > &a_factory={})
Definition: Operator.cpp:212
Operator
Documentation for operator namespace.
Definition: Diagonal.cpp:13
Operator::Diagonal::Diagonal
Diagonal()
Definition: Diagonal.H:18
Operator::AMREX_D_DECL
constexpr amrex::IntVect AMREX_D_DECL(Operator< Grid::Cell >::dx, Operator< Grid::Cell >::dy, Operator< Grid::Cell >::dz)
Operator::Diagonal::Fsmooth
virtual void Fsmooth(int amrlev, int mglev, MultiFab &sol, const MultiFab &rsh) const override final
Definition: Diagonal.cpp:86
Operator::Diagonal::~Diagonal
virtual ~Diagonal()
Definition: Diagonal.cpp:20
Operator::Diagonal::Fapply
virtual void Fapply(int amrlev, int mglev, MultiFab &out, const MultiFab &in) const override final
Definition: Diagonal.cpp:24
Util::Abort
void Abort(const char *msg)
Definition: Util.cpp:165
Diagonal.H
Set.H
INFO
#define INFO
Definition: Util.H:20