Alsvinn  0.5.3
The fast FVM simulator with UQ support
Burgers.hpp
Go to the documentation of this file.
1 /* Copyright (c) 2018 ETH Zurich, Kjetil Olsen Lye
2  * This program is free software: you can redistribute it and/or modify
3  * it under the terms of the GNU General Public License as published by
4  * the Free Software Foundation, either version 3 of the License, or
5  * (at your option) any later version.
6  *
7  * This program is distributed in the hope that it will be useful,
8  * but WITHOUT ANY WARRANTY; without even the implied warranty of
9  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10  * GNU General Public License for more details.
11  *
12  * You should have received a copy of the GNU General Public License
13  * along with this program. If not, see <http://www.gnu.org/licenses/>.
14  */
15 
16 #pragma once
17 #include "alsfvm/types.hpp"
18 #include <cmath>
24 
26 #include "alsfvm/volume/Volume.hpp"
28 #define USE_LOG_ENTROPY 1
29 namespace alsfvm {
30 namespace equation {
31 namespace burgers {
32 
33 class Burgers {
34 public:
35 
37  // empty
38  }
39 
45 
49  static std::string getName() {
50  return "burgers";
51  }
52 
56  static const std::vector<std::string> conservedVariables;
57 
61  static const std::vector<std::string> primitiveVariables;
62 
66  static const std::vector<std::string> extraVariables;
67 
71  static const size_t numberOfConservedVariables = 1;
72 
78  static const constexpr real entropyLowerBound = 0;
79 
85  static const constexpr real entropyUpperBound = 2;
86 
88  return 1;
89  }
90 
94 
99 
100 
105  size_t index) const {
106  return makeAllVariables(views.u.at(index));
107  }
108 
109  template<class T, class S>
110  __device__ __host__ static ConservedVariables fetchConservedVariables(
111  burgers::Views<T, S>& views, size_t index) {
112  return ConservedVariables(views.u.at(index));
113  }
114 
116  size_t index) const {
117  return ExtraVariables();
118  }
119 
123  __device__ __host__ static void setViewAt(Views& output, size_t index,
124  const ConservedVariables& input) {
125  output.u.at(index) = input.u;
126  }
127 
131  __device__ __host__ void setExtraViewAt(ViewsExtra& output, size_t index,
132  const ExtraVariables& input) const {
133  // empty
134  }
135 
141  __device__ __host__ static void addToViewAt(Views& output, size_t index,
142  const ConservedVariables& input) {
143  output.u.at(index) += input.u;
144  }
145 
157 
158  template<size_t direction>
159  __device__ __host__ void computePointFlux(const AllVariables& u,
160  ConservedVariables& F) const {
161  static_assert(direction < 3, "We only support up to three dimensions");
162 
163  F = u.u * u.u / 2;
164  }
165 
166 
167 
171  __device__ __host__ ExtraVariables computeExtra(const ConservedVariables& u)
172  const {
173  return ExtraVariables();
174  }
175 
180  __device__ __host__ ExtraVariables computeExtra(const PrimitiveVariables&
181  primitiveVariables) const {
182  return ExtraVariables();
183  }
184 
194  const PrimitiveVariables& primitiveVariables) const {
195  return ConservedVariables(primitiveVariables.u);
196  }
197 
202  template<int direction>
203  __device__ __host__ real computeWaveSpeed(const ConservedVariables& u,
204  const ExtraVariables& v) const {
205  static_assert(direction >= 0, "Direction can not be negative");
206  static_assert(direction < 3, "We only support dimension up to and inclusive 3");
207 
208  return std::abs(u.u);
209  }
210 
220  __device__ __host__ bool obeysConstraints(const ConservedVariables& u,
221  const ExtraVariables& v) const {
222 
223  return u.u < INFINITY && (u.u == u.u);
224  }
225 
226  __device__ __host__ AllVariables makeAllVariables(real u) const {
227 
228  return AllVariables(u);
229  }
230 
231  __device__ __host__ real getWeight(const ConstViews& in, size_t index) const {
232  return in.u.at(index);
233  }
234 
236  const ConservedVariables& conserved) const {
237  return PrimitiveVariables(conserved.u);
238  }
239 
248  conserved) const {
249 #if USE_LOG_ENTROPY
250  return (1 / (entropyUpperBound - conserved.u)) - 1 / (conserved.u -
252 #else
253  return conserved.u;
254 #endif
255 
256  }
257 
265  conserved) const {
266 #if USE_LOG_ENTROPY
267  return computeEntropyVariables(conserved) * 0.5 * conserved.u * conserved.u -
268  (-2 * conserved.u
269  - entropyUpperBound * log(entropyUpperBound - conserved.u) - entropyLowerBound *
270  log(conserved.u - entropyLowerBound));
271 #else
272  return 1.0 / 6.0 * (conserved.u * conserved.u * conserved.u);
273 #endif
274 
275  }
276 
277  template<int direction>
279  const ConservedVariables& conserved) const {
280 
281 #if USE_LOG_ENTROPY
282  return rvec1(2.0 * conserved.u / (conserved.u * (conserved.u - 2)));
283 #else
284  return rvec1(conserved.u);
285 #endif
286  }
287 
288  template<int direction>
290  conserved) const {
291 
292  matrix1 matrixWithEigenVectors;
293  matrixWithEigenVectors(0, 0) = 1;
294  return matrixWithEigenVectors;
295  }
296 
297  template<int direction>
298  __device__ __host__ rvec1 computeEigenValues(const ConservedVariables&
299  conserved) const {
300  return conserved.u;
301  }
302 
303 };
304 } // namespace alsfvm
305 } // namespace equation
306 } // namespace burgers
static const std::vector< std::string > conservedVariables
Definition: Burgers.hpp:56
static const size_t numberOfConservedVariables
Definition: Burgers.hpp:71
equation::burgers::Views< const volume::Volume, const memory::View< const real > > ConstViews
Definition: Burgers.hpp:93
Definition: ViewsExtra.hpp:29
__device__ __host__ real computeWaveSpeed(const ConservedVariables &u, const ExtraVariables &v) const
Definition: Burgers.hpp:203
static const std::vector< std::string > primitiveVariables
Definition: Burgers.hpp:61
__device__ __host__ matrix1 computeEigenVectorMatrix(const ConservedVariables &conserved) const
Definition: Burgers.hpp:289
Burgers(const EquationParameters &parameters)
Definition: Burgers.hpp:36
static std::string getName()
Definition: Burgers.hpp:49
burgers::ConservedVariables ConservedVariables
Definition: Burgers.hpp:41
simulator::SimulatorParameters & parameters
Definition: CellComputerFactory.cpp:60
ViewType u
Definition: Views.hpp:55
__device__ static __host__ void addToViewAt(Views &output, size_t index, const ConservedVariables &input)
Definition: Burgers.hpp:141
static const constexpr real entropyUpperBound
Definition: Burgers.hpp:85
Definition: Views.hpp:29
Definition: ConservedVariables.hpp:26
#define __host__
Definition: types.hpp:46
equation::burgers::ViewsExtra< volume::Volume, memory::View< real > > ViewsExtra
Definition: Burgers.hpp:96
Definition: PrimitiveVariables.hpp:23
double real
Definition: types.hpp:65
__device__ __host__ ExtraVariables computeExtra(const ConservedVariables &u) const
Definition: Burgers.hpp:171
burgers::PrimitiveVariables PrimitiveVariables
Definition: Burgers.hpp:43
__device__ __host__ rvec1 computeEntropyPotential(const ConservedVariables &conserved) const
Definition: Burgers.hpp:264
__device__ __host__ rvec1 computeEntropyVariables(const ConservedVariables &conserved) const
Definition: Burgers.hpp:247
__device__ __host__ PrimitiveVariables computePrimitiveVariables(const ConservedVariables &conserved) const
Definition: Burgers.hpp:235
Definition: mat.hpp:23
Definition: EquationParameters.hpp:21
burgers::AllVariables AllVariables
Definition: Burgers.hpp:44
__device__ __host__ rvec1 computeEigenValues(const ConservedVariables &conserved) const
Definition: Burgers.hpp:298
Definition: vec1.hpp:24
__device__ __host__ void setExtraViewAt(ViewsExtra &output, size_t index, const ExtraVariables &input) const
Definition: Burgers.hpp:131
#define static_assert(x, y)
Definition: types.hpp:52
static const std::vector< std::string > extraVariables
Definition: Burgers.hpp:66
__device__ static __host__ size_t getNumberOfConservedVariables()
Definition: Burgers.hpp:87
static const constexpr real entropyLowerBound
Definition: Burgers.hpp:78
__device__ __host__ AllVariables makeAllVariables(real u) const
Definition: Burgers.hpp:226
real u
Definition: PrimitiveVariables.hpp:34
#define __device__
Definition: types.hpp:45
__device__ __host__ AllVariables fetchAllVariables(ConstViews &views, size_t index) const
Definition: Burgers.hpp:104
equation::burgers::ViewsExtra< const volume::Volume, const memory::View< const real > > ConstViewsExtra
Definition: Burgers.hpp:98
__device__ static __host__ ConservedVariables fetchConservedVariables(burgers::Views< T, S > &views, size_t index)
Definition: Burgers.hpp:110
__device__ static __host__ void setViewAt(Views &output, size_t index, const ConservedVariables &input)
Definition: Burgers.hpp:123
Definition: Burgers.hpp:33
EquationParameters Parameters
Definition: Burgers.hpp:40
Various utility functions to implement the tecno flux.
Definition: types.hpp:30
real u
Definition: ConservedVariables.hpp:54
Definition: ExtraVariables.hpp:22
vec1< real > rvec1
Definition: types.hpp:70
__device__ __host__ ExtraVariables fetchExtraVariables(ConstViewsExtra &views, size_t index) const
Definition: Burgers.hpp:115
__device__ __host__ void computePointFlux(const AllVariables &u, ConservedVariables &F) const
Definition: Burgers.hpp:159
__device__ __host__ rvec1 computeEntropyVariablesMultipliedByEigenVectorMatrix(const ConservedVariables &conserved) const
Definition: Burgers.hpp:278
burgers::ExtraVariables ExtraVariables
Definition: Burgers.hpp:42
__device__ __host__ ExtraVariables computeExtra(const PrimitiveVariables &primitiveVariables) const
computes the extra variables from the primitive ones
Definition: Burgers.hpp:180
Definition: AllVariables.hpp:24
__device__ __host__ real getWeight(const ConstViews &in, size_t index) const
Definition: Burgers.hpp:231
__device__ __host__ ConservedVariables computeConserved(const PrimitiveVariables &primitiveVariables) const
computes the conserved variables from the primitive ones
Definition: Burgers.hpp:193
__device__ __host__ bool obeysConstraints(const ConservedVariables &u, const ExtraVariables &v) const
Definition: Burgers.hpp:220
equation::burgers::Views< volume::Volume, memory::View< real > > Views
Definition: Burgers.hpp:91