Nektar++
TimeRiemann.cpp
Go to the documentation of this file.
1 #include "../RiemannSolvers/RoeSolver.h"
2 
4 
6 
9 
10 #include "../RiemannSolvers/RoeSolver.h"
11 #include "../RiemannSolvers/RoeSolverSIMD.h"
12 
13 using namespace Nektar;
14 
15 int main(int argc, char const *argv[])
16 {
17 
20  LIKWID_MARKER_REGISTER("Riemann");
21  LIKWID_MARKER_REGISTER("RotationTo");
22  LIKWID_MARKER_REGISTER("v_Solve");
23  LIKWID_MARKER_REGISTER("RotationFrom");
24 
25  size_t nEle;
26  if (argc < 2)
27  {
28  nEle = 10;
29  }
30  else
31  {
32  nEle = std::stoi(argv[1]);
33  }
34 
35  std::cout << "number of faces\t" << nEle
36  << "\t(assuming 4*4 nodes per face)\n";
37 
38  // auto riemannSolver = RoeSolver();
39  auto riemannSolver = RoeSolverSIMD();
40  // Setting up parameters for Riemann solver
41  NekDouble gamma = 1.4;
42  riemannSolver.SetParam("gamma",
43  [&gamma]() -> NekDouble & { return gamma; });
44 
45  size_t spaceDim = 3;
46  size_t npts = 4 * 4 * nEle; // so that avx spillover loop is engaged
47 
48  // Set up locations of velocity vector.
50  vecLocs[0] = Array<OneD, NekDouble>(spaceDim);
51  for (size_t i = 0; i < spaceDim; ++i)
52  {
53  vecLocs[0][i] = 1 + i;
54  }
55  riemannSolver.SetAuxVec(
56  "vecLocs",
57  [&vecLocs]() -> const Array<OneD, const Array<OneD, NekDouble>> & {
58  return vecLocs;
59  });
60 
61  // setup normals
62  Array<OneD, Array<OneD, NekDouble>> normals(spaceDim);
63  for (size_t i = 0; i < spaceDim; ++i)
64  {
65  normals[i] = Array<OneD, NekDouble>(npts);
66  }
67  riemannSolver.SetVector(
68  "N", [&normals]() -> const Array<OneD, const Array<OneD, NekDouble>> & {
69  return normals;
70  });
71 
72  size_t nFields = spaceDim + 2;
73  Array<OneD, Array<OneD, NekDouble>> fwd(nFields), bwd(nFields),
74  flx(nFields), flxRef(nFields);
75  for (size_t i = 0; i < nFields; ++i)
76  {
77  fwd[i] = Array<OneD, NekDouble>(npts);
78  bwd[i] = Array<OneD, NekDouble>(npts);
79  flx[i] = Array<OneD, NekDouble>(npts);
80  flxRef[i] = Array<OneD, NekDouble>(npts);
81  }
82 
83  // up to now it is "boiler plate" code to set up the test
84  // below are the conditions for the test
85 
86  for (size_t i = 0; i < npts; ++i)
87  {
88  // density
89  NekDouble rho = 0.9;
90  fwd[0][i] = rho;
91  bwd[0][i] = rho;
92  // x-momentum
93  NekDouble rhou = rho * 1.0;
94  fwd[1][i] = rhou;
95  bwd[1][i] = rhou;
96  // y-momentum
97  NekDouble rhov = rho * 2.0;
98  fwd[2][i] = rhov;
99  bwd[2][i] = rhov;
100  // z-momentum
101  NekDouble rhow = rho * 3.0;
102  fwd[3][i] = rhow;
103  bwd[3][i] = rhow;
104  // energy
105  NekDouble p = 1.0;
106  NekDouble rhoe = p / (gamma - 1.0);
107  NekDouble E =
108  rhoe + 0.5 * (rhou * rhou + rhov * rhov + rhow * rhow) / rho;
109  fwd[nFields - 1][i] = E;
110  bwd[nFields - 1][i] = E;
111  // set face normal along x
112  normals[0][i] = 1.0;
113  // Ref solution
114  flxRef[0][i] = rhou;
115  flxRef[1][i] = rhou * rhou / rho + p;
116  flxRef[2][i] = rhou * rhov / rho;
117  flxRef[3][i] = rhou * rhow / rho;
118  flxRef[nFields - 1][i] = (E + p) * rhou / rho;
119  }
120 
121  // number of experiments
122  constexpr size_t experiments = 1 << 12;
123 
124  LIKWID_MARKER_START("Riemann");
125  for (size_t j = 0; j < experiments; ++j)
126  {
127  // time
128  riemannSolver.Solve(spaceDim, fwd, bwd, flx);
129  }
130  LIKWID_MARKER_STOP("Riemann");
131  // get likwid events
132  constexpr short CPU_CLK_UNHALTED_REF_id = 2;
133  int nevents{20};
134  std::vector<double> events(nevents);
135  double time;
136  int count;
137  boost::ignore_unused(time, count); //
138 
139  LIKWID_MARKER_GET("Riemann", &nevents, events.data(), &time, &count);
140  // print out CPE
141  double cpeRiemann = events[CPU_CLK_UNHALTED_REF_id] / npts / experiments;
142  std::cout << "Riemann likwid CPE\t" << cpeRiemann << '\n';
143  //
144  LIKWID_MARKER_GET("RotationTo", &nevents, events.data(), &time, &count);
145  // print out CPE
146  double cpeRotationTo = events[CPU_CLK_UNHALTED_REF_id] / npts / experiments;
147  std::cout << "RotationTo likwid CPE\t" << cpeRotationTo << '\n';
148  //
149  LIKWID_MARKER_GET("v_Solve", &nevents, events.data(), &time, &count);
150  // print out CPE
151  double cpev_Solve = events[CPU_CLK_UNHALTED_REF_id] / npts / experiments;
152  std::cout << "v_Solve likwid CPE\t" << cpev_Solve << '\n';
153  //
154  LIKWID_MARKER_GET("RotationFrom", &nevents, events.data(), &time, &count);
155  // print out CPE
156  double cpeRotationFrom =
157  events[CPU_CLK_UNHALTED_REF_id] / npts / experiments;
158  std::cout << "RotationFrom likwid CPE\t" << cpeRotationFrom << '\n';
159  // avoid opt out
160  std::cout << flx[0][0] << std::endl;
161 
163 }
#define LIKWID_MARKER_THREADINIT
Definition: Likwid.hpp:43
#define LIKWID_MARKER_START(regionTag)
Definition: Likwid.hpp:46
#define LIKWID_MARKER_CLOSE
Definition: Likwid.hpp:48
#define LIKWID_MARKER_INIT
Definition: Likwid.hpp:42
#define LIKWID_MARKER_REGISTER(regionTag)
Definition: Likwid.hpp:45
#define LIKWID_MARKER_STOP(regionTag)
Definition: Likwid.hpp:47
#define LIKWID_MARKER_GET(regionTag, nevents, events, time, count)
Definition: Likwid.hpp:49
int main(int argc, char const *argv[])
Definition: TimeRiemann.cpp:15
The above copyright notice and this permission notice shall be included.
Definition: CoupledSolver.h:1
double NekDouble