Alamo
Stencil.H
Go to the documentation of this file.
1 #ifndef TEST_NUMERIC_STENCIL
2 #define TEST_NUMERIC_STENCIL
3 
4 #include <AMReX.H>
5 
6 #include "Set/Set.H"
7 #include "IC/Trig.H"
8 #include "IC/Trig2.H"
9 #include "Numeric/Stencil.H"
10 
11 namespace Test
12 {
13 /// Tests for the Numeric namespace classes
14 namespace Numeric
15 {
16 class Stencil
17 {
18 
19 public:
20  Stencil() {};
21  ~Stencil() {};
22 
23  void Define(amrex::IntVect _ncells)
24  {
25  ncells = _ncells;
26  amrex::RealBox rb({AMREX_D_DECL(0.,0.,0.)}, {AMREX_D_DECL(L,L,L)});
27  amrex::Geometry::Setup(&rb, 0);
28 
29  amrex::Box domain(amrex::IntVect{AMREX_D_DECL(0,0,0)}, ncells,
30  amrex::IntVect::TheCellVector());
31  geom.resize(1);
32  grids.resize(1);
33  dmap.resize(1);
34  phi.resize(1);
35  DphiNumeric.resize(1);
36  DphiExact.resize(1);
37 
38  geom[0].define(domain);
39  grids[0].define(domain);
40  grids[0].maxSize(ncells[0]/2);
41  dmap[0].define(grids[0]);
42 
43  phi .Define(0,grids[0],dmap[0],1,nghost);
44  DphiNumeric.Define(0,grids[0],dmap[0],1,nghost);
45  DphiExact .Define(0,grids[0],dmap[0],1,nghost);
46 
47  phi[0]->setVal(0.0);
48  // Initial function is
49  // cos(2*pi*x/L) * cos(2*pi*y/L) * cos(2*pi*z / L)
50  IC::Trig2 ic(geom,1.0,AMREX_D_DECL(0.0,0.0,0.0),AMREX_D_DECL(1,1,1));
51  ic.Add(0,phi,0.0);
52  }
53  void Define(int _ncells)
54  {
55  Define(amrex::IntVect{AMREX_D_DECL(_ncells,_ncells,_ncells)});
56  }
57 
58  template<int i,int j,int k>
59  bool Derivative(int verbose,std::string plotfile = "")
60  {
61  const Set::Scalar tolerance = 1E-2;
62 
63  DphiExact[0]->setVal(0.0);
64  DphiNumeric[0]->setVal(0.0);
65 
66  //
67  // Compute exact derivative
68  //
69  Set::Scalar AMREX_D_DECL(theta1 = 0.0, theta2 = 0.0, theta3 = 0.0);
70  Set::Scalar fac = 1.0;
71  AMREX_D_TERM( for (int p = 0; p < i; p++) theta1 += 0.5*Set::Constant::Pi;,
72  for (int q = 0; q < j; q++) theta2 += 0.5*Set::Constant::Pi;,
73  for (int r = 0; r < k; r++) theta3 += 0.5*Set::Constant::Pi; );
74 
75  AMREX_D_TERM( for (int p = 0; p < i; p++) fac *= 1.0*Set::Constant::Pi / L;,
76  for (int q = 0; q < j; q++) fac *= 1.0*Set::Constant::Pi / L;,
77  for (int r = 0; r < k; r++) fac *= 1.0*Set::Constant::Pi / L;);
78  IC::Trig2 ic(geom,fac,AMREX_D_DECL(theta1,theta2,theta3),AMREX_D_DECL(1,1,1));
79  ic.Add(0,DphiExact,0.0);
80 
81 
82  //
83  // Compute numeric derivative
84  //
85  const amrex::Real* DX = geom[0].CellSize();
86  for ( amrex::MFIter mfi(*phi[0],amrex::TilingIfNotGPU()); mfi.isValid(); ++mfi )
87  {
88  const amrex::Box& bx = mfi.tilebox();
89  amrex::Array4<const amrex::Real> const& Phi = phi[0]->array(mfi);
90  amrex::Array4<amrex::Real> const& DPhi = DphiNumeric[0]->array(mfi);
91  amrex::ParallelFor (bx,[=] AMREX_GPU_DEVICE(int p, int q, int r){ DPhi(p,q,r) = ::Numeric::Stencil<Set::Scalar,i,j,k>::D(Phi,p,q,r,0,DX); });
92  }
93 
94  amrex::MultiFab diff(grids[0],dmap[0],ncomp,nghost);
95  amrex::MultiFab::Copy (diff,*DphiExact[0] ,0,0,ncomp,nghost);
96  amrex::MultiFab::Subtract(diff,*DphiNumeric[0],0,0,ncomp,nghost);
97 
98  Set::Scalar error = diff.norm0(0,0,false) / DphiExact[0]->norm0(0,0,false);
99 
100  if (verbose) Util::Message(INFO,"Infinity norm of error = ", 100*error,"%");
101 
102  if (plotfile != "")
103  WritePlotFile(plotfile);
104 
105  if (error < tolerance) return 0;
106  else return 1;
107  }
108 
109 
110  void WritePlotFile(std::string plotfile)
111  {
112  amrex::Vector<amrex::MultiFab> plotmf(1);
113  plotmf[0].define(grids[0], dmap[0], 3, 0);
114  for (amrex::MFIter mfi(plotmf[0],false); mfi.isValid(); ++mfi)
115  {
116  amrex::Box bx = mfi.validbox();
117  plotmf[0][mfi].copy((*phi[0])[mfi] ,bx, 0, bx, 0, 1);
118  plotmf[0][mfi].copy((*DphiExact[0])[mfi] ,bx, 0, bx, 1, 1);
119  plotmf[0][mfi].copy((*DphiNumeric[0])[mfi],bx, 0, bx, 2, 1);
120  }
121  amrex::WriteSingleLevelPlotfile(plotfile,plotmf[0],varnames,geom[0],0.0,1);
122  }
123 
124 
125 private:
126  amrex::IntVect ncells;
127  const Set::Scalar L = 1.0;
128  const int ncomp = 1, nghost = 2;
129  amrex::Vector<amrex::Geometry> geom;
130  amrex::Vector<amrex::BoxArray> grids;
131  amrex::Vector<amrex::DistributionMapping> dmap;
132 
136  amrex::Vector<std::string> varnames = {"phi","dphi_exact","dphi_numeric"};
137 };
138 }
139 }
140 
141 
142 
143 #endif
IC::Trig2::Add
virtual void Add(const int &lev, Set::Field< Set::Scalar > &field, Set::Scalar)
Definition: Trig2.H:51
Test::Numeric::Stencil::phi
Set::Field< Set::Scalar > phi
Definition: Stencil.H:133
BC::AMREX_D_DECL
@ AMREX_D_DECL
Definition: BC.H:34
Test::Numeric::Stencil::DphiExact
Set::Field< Set::Scalar > DphiExact
Definition: Stencil.H:134
Test::Numeric::Stencil::ncomp
const int ncomp
Definition: Stencil.H:128
IC::Trig2
Initialize using a trigonometric series.
Definition: Trig2.H:14
Set::Field< Set::Scalar >
Definition: Set.H:236
Test::Numeric::Stencil::L
const Set::Scalar L
Definition: Stencil.H:127
Test::Numeric::Stencil::ncells
amrex::IntVect ncells
Definition: Stencil.H:126
Test::Numeric::Stencil::WritePlotFile
void WritePlotFile(std::string plotfile)
Definition: Stencil.H:110
Test::Numeric::Stencil::Define
void Define(amrex::IntVect _ncells)
Definition: Stencil.H:23
Trig2.H
Trig.H
Set::Scalar
amrex::Real Scalar
Definition: Base.H:19
Test::Numeric::Stencil::dmap
amrex::Vector< amrex::DistributionMapping > dmap
Definition: Stencil.H:131
Test::Numeric::Stencil::nghost
const int nghost
Definition: Stencil.H:128
Test::Numeric::Stencil
Definition: Stencil.H:16
Set::Field< Set::Scalar >::Define
void Define(int a_levs, const amrex::Vector< amrex::BoxArray > &a_grids, const amrex::Vector< amrex::DistributionMapping > &a_dmap, int a_ncomp, int a_nghost)
Definition: Set.H:241
Test::Numeric::Stencil::geom
amrex::Vector< amrex::Geometry > geom
Definition: Stencil.H:129
Test::Numeric::Stencil::DphiNumeric
Set::Field< Set::Scalar > DphiNumeric
Definition: Stencil.H:135
Test::Numeric::Stencil::~Stencil
~Stencil()
Definition: Stencil.H:21
Test::Numeric::Stencil::grids
amrex::Vector< amrex::BoxArray > grids
Definition: Stencil.H:130
Test::Numeric::Stencil::Define
void Define(int _ncells)
Definition: Stencil.H:53
Set.H
Test::Numeric::Stencil::Stencil
Stencil()
Definition: Stencil.H:20
Set::Constant::Pi
static const Set::Scalar Pi
Definition: Set.H:286
Test
Definition: GB.H:7
Numeric
This namespace contains some numerical tools.
Definition: Function.H:5
Test::Numeric::Stencil::Derivative
bool Derivative(int verbose, std::string plotfile="")
Definition: Stencil.H:59
INFO
#define INFO
Definition: Util.H:20
Util::Message
void Message(std::string file, std::string func, int line, Args const &... args)
Definition: Util.H:133
Test::Numeric::Stencil::varnames
amrex::Vector< std::string > varnames
Definition: Stencil.H:136