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
13namespace Operator
14{
15Diagonal::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
23void
24Diagonal::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
85void
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}
#define INFO
Definition Util.H:20
virtual void Fapply(int amrlev, int mglev, MultiFab &out, const MultiFab &in) const override final
Definition Diagonal.cpp:24
virtual ~Diagonal()
Definition Diagonal.cpp:20
virtual void Fsmooth(int amrlev, int mglev, MultiFab &sol, const MultiFab &rsh) const override final
Definition Diagonal.cpp:86
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
Documentation for operator namespace.
Definition Diagonal.cpp:14
constexpr amrex::IntVect AMREX_D_DECL(Operator< Grid::Cell >::dx, Operator< Grid::Cell >::dy, Operator< Grid::Cell >::dz)
void Abort(const char *msg)
Definition Util.cpp:170