Nektar++
Functions
TimeRiemann.cpp File Reference
#include "../RiemannSolvers/RoeSolver.h"
#include <LibUtilities/SimdLib/tinysimd.hpp>
#include <LibUtilities/BasicUtils/SharedArray.hpp>
#include <LibUtilities/BasicUtils/Timer.h>
#include <LibUtilities/BasicUtils/Likwid.hpp>
#include "../RiemannSolvers/RoeSolverSIMD.h"

Go to the source code of this file.

Functions

int main (int argc, char const *argv[])
 

Function Documentation

◆ main()

int main ( int  argc,
char const *  argv[] 
)

Definition at line 15 of file TimeRiemann.cpp.

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", [&gamma]()
43  -> 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("vecLocs", [&vecLocs]()
56  -> const Array<OneD, const Array<OneD, NekDouble>>&
57  {return vecLocs;});
58 
59  // setup normals
60  Array<OneD, Array<OneD, NekDouble>> normals(spaceDim);
61  for (size_t i = 0; i < spaceDim; ++i)
62  {
63  normals[i] = Array<OneD, NekDouble>(npts);
64  }
65  riemannSolver.SetVector("N", [&normals]()
66  -> const Array<OneD, const Array<OneD, NekDouble>>&
67  {return normals;});
68 
69  size_t nFields = spaceDim + 2;
70  Array<OneD, Array<OneD, NekDouble>> fwd(nFields), bwd(nFields),
71  flx(nFields), flxRef(nFields);
72  for (size_t i = 0; i < nFields; ++i)
73  {
74  fwd[i] = Array<OneD, NekDouble>(npts);
75  bwd[i] = Array<OneD, NekDouble>(npts);
76  flx[i] = Array<OneD, NekDouble>(npts);
77  flxRef[i] = Array<OneD, NekDouble>(npts);
78  }
79 
80  // up to now it is "boiler plate" code to set up the test
81  // below are the conditions for the test
82 
83  for (size_t i = 0; i < npts; ++i)
84  {
85  // density
86  NekDouble rho = 0.9;
87  fwd[0][i] = rho;
88  bwd[0][i] = rho;
89  // x-momentum
90  NekDouble rhou = rho*1.0;
91  fwd[1][i] = rhou;
92  bwd[1][i] = rhou;
93  // y-momentum
94  NekDouble rhov = rho*2.0;
95  fwd[2][i] = rhov;
96  bwd[2][i] = rhov;
97  // z-momentum
98  NekDouble rhow = rho*3.0;
99  fwd[3][i] = rhow;
100  bwd[3][i] = rhow;
101  // energy
102  NekDouble p = 1.0;
103  NekDouble rhoe = p / (gamma - 1.0);
104  NekDouble E = rhoe + 0.5*(rhou*rhou + rhov*rhov + rhow*rhow) / rho;
105  fwd[nFields-1][i] = E;
106  bwd[nFields-1][i] = E;
107  // set face normal along x
108  normals[0][i] = 1.0;
109  // Ref solution
110  flxRef[0][i] = rhou;
111  flxRef[1][i] = rhou*rhou/rho + p;
112  flxRef[2][i] = rhou*rhov/rho;
113  flxRef[3][i] = rhou*rhow/rho;
114  flxRef[nFields-1][i] = (E+p)*rhou/rho;
115  }
116 
117  // number of experiments
118  constexpr size_t experiments = 1 << 12;
119 
120  LIKWID_MARKER_START("Riemann");
121  for (size_t j = 0; j < experiments; ++j)
122  {
123  // time
124  riemannSolver.Solve(spaceDim, fwd, bwd, flx);
125  }
126  LIKWID_MARKER_STOP("Riemann");
127  // get likwid events
128  constexpr short CPU_CLK_UNHALTED_REF_id = 2;
129  int nevents{20};
130  std::vector<double> events(nevents);
131  double time;
132  int count;
133  boost::ignore_unused(time,count);//
134 
135  LIKWID_MARKER_GET("Riemann", &nevents, events.data(), &time, &count);
136  // print out CPE
137  double cpeRiemann = events[CPU_CLK_UNHALTED_REF_id]/npts/experiments;
138  std::cout << "Riemann likwid CPE\t" << cpeRiemann << '\n';
139  //
140  LIKWID_MARKER_GET("RotationTo", &nevents, events.data(), &time, &count);
141  // print out CPE
142  double cpeRotationTo = events[CPU_CLK_UNHALTED_REF_id]/npts/experiments;
143  std::cout << "RotationTo likwid CPE\t" << cpeRotationTo << '\n';
144  //
145  LIKWID_MARKER_GET("v_Solve", &nevents, events.data(), &time, &count);
146  // print out CPE
147  double cpev_Solve = events[CPU_CLK_UNHALTED_REF_id]/npts/experiments;
148  std::cout << "v_Solve likwid CPE\t" << cpev_Solve << '\n';
149  //
150  LIKWID_MARKER_GET("RotationFrom", &nevents, events.data(), &time, &count);
151  // print out CPE
152  double cpeRotationFrom = events[CPU_CLK_UNHALTED_REF_id]/npts/experiments;
153  std::cout << "RotationFrom likwid CPE\t" << cpeRotationFrom << '\n';
154  // avoid opt out
155  std::cout << flx[0][0] << std::endl;
156 
157 
158 
160 
161 }
#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
double NekDouble

References LIKWID_MARKER_CLOSE, LIKWID_MARKER_GET, LIKWID_MARKER_INIT, LIKWID_MARKER_REGISTER, LIKWID_MARKER_START, LIKWID_MARKER_STOP, LIKWID_MARKER_THREADINIT, and CellMLToNektar.cellml_metadata::p.