[P]arallel [Hi]gh-order [Li]brary for [P]DEs  Latest
Parallel High-Order Library for PDEs through hp-adaptive Discontinuous Galerkin methods
manufactured_solution.cpp
1 #include <CoDiPack/include/codi.hpp>
2 #include <Sacado.hpp>
3 #include <deal.II/base/function.h>
4 #include <deal.II/base/function.templates.h> // Needed to instantiate dealii::Function<PHILIP_DIM, Sacado::Fad::DFad<double>>
5 #include <deal.II/base/function_time.templates.h> // Needed to instantiate dealii::Function<PHILIP_DIM, Sacado::Fad::DFad<double>>
6 #include <boost/preprocessor/seq/for_each.hpp>
7 
8 #include "manufactured_solution.h"
9 
10 template class dealii::FunctionTime<Sacado::Fad::DFad<double>>; // Needed by Function
11 template class dealii::Function<PHILIP_DIM,Sacado::Fad::DFad<double>>;
12 
13 namespace PHiLiP {
14 
16 bool isfinite(double value)
17 {
18  return std::isfinite(static_cast<double>(value));
19 }
20 
22 bool isfinite(Sacado::Fad::DFad<double> value)
23 {
24  return std::isfinite(static_cast<double>(value.val()));
25 }
26 
28 bool isfinite(Sacado::Fad::DFad<Sacado::Fad::DFad<double>> value)
29 {
30  return std::isfinite(static_cast<double>(value.val().val()));
31 }
32 
34 bool isfinite(Sacado::Rad::ADvar<Sacado::Fad::DFad<double>> value)
35 {
36  return std::isfinite(static_cast<double>(value.val().val()));
37 }
38 
39 template <int dim, int nspecies, typename real>
41 ::value (const dealii::Point<dim,real> &/*point*/, const unsigned int /*istate*/) const
42 {
43  real value = 0;
44  return value;
45 }
46 
47 template <int dim, int nspecies, typename real>
49 ::value (const dealii::Point<dim,real> &point, const unsigned int istate) const
50 {
51  real value = this->amplitudes[istate];
52  for (int d=0; d<dim; d++) {
53  value *= sin( this->frequencies[istate][d] * point[d] );
54  assert(isfinite(value));
55  }
56  value += this->base_values[istate];
57  return value;
58 }
59 
60 template <int dim, int nspecies, typename real>
62 ::value (const dealii::Point<dim,real> &point, const unsigned int istate) const
63 {
64  real value = 0.0;
65  for (int d=0; d<dim; d++) {
66  value += this->amplitudes[istate]*sin( this->frequencies[istate][d] * point[d] );
67  assert(isfinite(value));
68  }
69  value += this->base_values[istate];
70  return value;
71 }
72 
73 template <int dim, int nspecies, typename real>
75 ::value (const dealii::Point<dim,real> &point, const unsigned int istate) const
76 {
77  real value = this->amplitudes[istate];
78  for (int d=0; d<dim; d++) {
79  value *= cos( this->frequencies[istate][d] * point[d] );
80  assert(isfinite(value));
81  }
82  value += this->base_values[istate];
83  return value;
84 }
85 
86 template <int dim, int nspecies, typename real>
88 ::value (const dealii::Point<dim,real> &point, const unsigned int istate) const
89 {
90  real value = 0.0;
91  for (int d=0; d<dim; d++) {
92  value += exp( point[d] );
93  assert(isfinite(value));
94  }
95  value += this->base_values[istate];
96  return value;
97 }
98 
99 template <int dim, int nspecies, typename real>
101 ::value (const dealii::Point<dim,real> &point, const unsigned int istate) const
102 {
103  real value = 0.0;
104  const double poly_max = 7;
105  for (int d=0; d<dim; d++) {
106  value += pow(point[d] + 0.5, poly_max);
107  }
108  value += this->base_values[istate];
109  return value;
110 }
111 
112 template <int dim, int nspecies, typename real>
114 ::value (const dealii::Point<dim,real> &point, const unsigned int istate) const
115 {
116  real value = 0.0;
117  for (int d=0; d<dim; d++) {
118  const real x = point[d];
119  value += 1.0 + x - x*x - x*x*x + x*x*x*x - x*x*x*x*x + x*x*x*x*x*x + 0.001*sin(50*x);
120  }
121  value += this->base_values[istate];
122  return value;
123 }
124 
125 template <int dim, int nspecies, typename real>
127 ::value(const dealii::Point<dim,real> &point, const unsigned int /*istate*/) const
128 {
129  real val = 1.0;
130  for(unsigned int i = 0; i < dim; ++i){
131  real x = point[i];
132  real val_dim = 0;
133  for(unsigned int j = 0; j < n_shocks[i]; ++j){
134  // taking the product of function in each direction
135  val_dim += atan(S_j[i][j]*(x-x_j[i][j]));
136  }
137  val *= val_dim;
138  }
139  return val;
140 }
141 
142 template <int dim, int nspecies, typename real>
144 ::value(const dealii::Point<dim,real> &point, const unsigned int istate) const
145 {
146  real val = 1.0;
147  for(unsigned int d = 0; d < dim; ++d){
148  real x = point[d];
149  val *= x + (exp(x/epsilon[istate][d])-1.0)/(1.0-exp(1.0/epsilon[istate][d]));
150  }
151  return val;
152 }
153 
154 template <int dim, int nspecies, typename real>
156 ::value(const dealii::Point<dim,real> &point, const unsigned int /*istate*/) const
157 {
158  real val = 0.0;
159  if(dim==2){
160  const real x = point[0], y = point[1];
161  // val = 0.75*tanh(2*(sin(5*y)-3*x));
162  // val = 0.75*tanh(20*(sin(10*y-5)-6*x+3));
163  val = a*tanh(b*sin(c*y + d) + e*x + f);
164  }
165  return val;
166 }
167 
168 template <int dim, int nspecies, typename real>
170 ::value(const dealii::Point<dim,real> &point, const unsigned int /*istate*/) const
171 {
172  real val = 0.0;
173  // f(x,y,z) = a*x^2 + b*y^2 + c*z^2
174  for(unsigned int d = 0; d < dim; ++d){
175  real x = point[d];
176  val += alpha_diag[d]*x*x;
177  }
178  return val;
179 }
180 
181 template <int dim, int nspecies, typename real>
183 ::value (const dealii::Point<dim,real> &point, const unsigned int istate) const
184 {
185  real value = 0.0;
186  for (int d=0; d<dim; d++) {
187  value += exp( point[d] ) + sin(point[d] );
188  assert(isfinite(value));
189  }
190  value += this->base_values[istate];
191  return value;
192 }
193 
194 template <int dim, int nspecies, typename real>
196 ::primitive_value(const dealii::Point<dim,real> &point, const unsigned int istate) const
197 {
198  real value = 0.;
199  if constexpr(dim == 2) {
200  const real x = point[0], y = point[1];
201  // // for RANS
202  // const real v_tilde = ncm[istate][0] + ncm[istate][1]*cos(ncm[istate][4]*c*x) + ncm[istate][2]*cos(ncm[istate][5]*c*y) + ncm[istate][3]*cos(ncm[istate][6]*c*x)*cos(ncm[istate][6]*c*y);
203 
204  if(istate==0) {
205  // density
206  value = ncm[0][0] + ncm[0][1]*sin(ncm[0][4]*c*x) + ncm[0][2]*cos(ncm[0][5]*c*y) + ncm[0][3]*cos(ncm[0][6]*c*x)*cos(ncm[0][6]*c*y);
207  }
208  if(istate==1) {
209  // x-velocity
210  value = ncm[1][0] + ncm[1][1]*sin(ncm[1][4]*c*x) + ncm[1][2]*cos(ncm[1][5]*c*y) + ncm[1][3]*cos(ncm[1][6]*c*x)*cos(ncm[1][6]*c*y);
211  }
212  if(istate==2) {
213  // y-velocity
214  value = ncm[2][0] + ncm[2][1]*cos(ncm[2][4]*c*x) + ncm[2][2]*sin(ncm[2][5]*c*y) + ncm[2][3]*cos(ncm[2][6]*c*x)*cos(ncm[2][6]*c*y);
215  }
216  if(istate==3) {
217  // pressure
218  value = ncm[3][0] + ncm[3][1]*cos(ncm[3][4]*c*x) + ncm[3][2]*sin(ncm[3][5]*c*y) + ncm[3][3]*cos(ncm[3][6]*c*x)*cos(ncm[3][6]*c*y);
219  }
220  if(istate==4) {
221  // turbulent working variable
222  value = ncm[4][0] + ncm[4][1]*cos(ncm[4][4]*c*x) + ncm[4][2]*cos(ncm[4][5]*c*y) + ncm[4][3]*cos(ncm[4][6]*c*x)*cos(ncm[4][6]*c*y);
223  }
224  }
225  return value;
226 }
227 
228 template <int dim, int nspecies, typename real>
230 ::value(const dealii::Point<dim,real> &point, const unsigned int istate) const
231 {
232  real value = 0.0;
233  if (dim == 2) {
234  const real density = primitive_value(point,0);
235  const real x_velocity = primitive_value(point,1);
236  const real y_velocity = primitive_value(point,2);
237  const real pressure = primitive_value(point,3);
238  const real turbulent_working_variable = primitive_value(point,4);
239 
240  // convert primitive to conservative solution
241  // - density:
242  if(istate==0) value = density;
243  // - x-momentum:
244  if(istate==1) value = density*x_velocity;
245  // - y-momentum:
246  if(istate==2) value = density*y_velocity;
247  // - total energy:
248  if(istate==3) value = pressure/(1.4-1.0) + 0.5*density*(x_velocity*x_velocity + y_velocity*y_velocity);
249  // - transport of the turbulent working variable:
250  if(istate==4) value = density*turbulent_working_variable;
251  }
252  return value;
253 }
254 
255 template <int dim, int nspecies, typename real>
256 inline dealii::Tensor<1,dim,real> ManufacturedSolutionZero<dim,nspecies,real>
257 ::gradient (const dealii::Point<dim,real> &/*point*/, const unsigned int /*istate*/) const
258 {
259  dealii::Tensor<1,dim,real> gradient;
260  for(unsigned int i = 0; i < dim; i++){
261  gradient[i] = 0;
262  }
263  return gradient;
264 }
265 
266 template <int dim, int nspecies, typename real>
267 inline dealii::Tensor<1,dim,real> ManufacturedSolutionSine<dim,nspecies,real>
268 ::gradient (const dealii::Point<dim,real> &point, const unsigned int istate) const
269 {
270  dealii::Tensor<1,dim,real> gradient;
271  for (int dim_deri=0; dim_deri<dim; dim_deri++) {
272  gradient[dim_deri] = this->amplitudes[istate] * this->frequencies[istate][dim_deri];
273  for (int dim_trig=0; dim_trig<dim; dim_trig++) {
274  const real angle = this->frequencies[istate][dim_trig] * point[dim_trig];
275  if (dim_deri == dim_trig) gradient[dim_deri] *= cos( angle );
276  if (dim_deri != dim_trig) gradient[dim_deri] *= sin( angle );
277  }
278  assert(isfinite(gradient[dim_deri]));
279  }
280  // Hard-coded is much more readable than the dimensionally generic one
281  const real A = this->amplitudes[istate];
282  const dealii::Tensor<1,dim,real> f = this->frequencies[istate];
283  if (dim==1) {
284  const real fx = f[0]*point[0];
285  gradient[0] = A*f[0]*cos(fx);
286  }
287  if (dim==2) {
288  const real fx = f[0]*point[0];
289  const real fy = f[1]*point[1];
290  gradient[0] = A*f[0]*cos(fx)*sin(fy);
291  gradient[1] = A*f[1]*sin(fx)*cos(fy);
292  }
293  if (dim==3) {
294  const real fx = f[0]*point[0];
295  const real fy = f[1]*point[1];
296  const real fz = f[2]*point[2];
297  gradient[0] = A*f[0]*cos(fx)*sin(fy)*sin(fz);
298  gradient[1] = A*f[1]*sin(fx)*cos(fy)*sin(fz);
299  gradient[2] = A*f[2]*sin(fx)*sin(fy)*cos(fz);
300  }
301  return gradient;
302 }
303 
304 template <int dim, int nspecies, typename real>
305 inline dealii::Tensor<1,dim,real> ManufacturedSolutionAdd<dim,nspecies,real>
306 ::gradient (const dealii::Point<dim,real> &point, const unsigned int istate) const
307 {
308  dealii::Tensor<1,dim,real> gradient;
309  const real A = this->amplitudes[istate];
310  const dealii::Tensor<1,dim,real> f = this->frequencies[istate];
311  if (dim==1) {
312  const real fx = f[0]*point[0];
313  gradient[0] = A*f[0]*cos(fx);
314  }
315  if (dim==2) {
316  const real fx = f[0]*point[0];
317  const real fy = f[1]*point[1];
318  gradient[0] = A*f[0]*cos(fx);
319  gradient[1] = A*f[1]*cos(fy);
320  }
321  if (dim==3) {
322  const real fx = f[0]*point[0];
323  const real fy = f[1]*point[1];
324  const real fz = f[2]*point[2];
325  gradient[0] = A*f[0]*cos(fx);
326  gradient[1] = A*f[1]*cos(fy);
327  gradient[2] = A*f[2]*cos(fz);
328  }
329  return gradient;
330 }
331 
332 template <int dim, int nspecies, typename real>
333 inline dealii::Tensor<1,dim,real> ManufacturedSolutionCosine<dim,nspecies,real>
334 ::gradient (const dealii::Point<dim,real> &point, const unsigned int istate) const
335 {
336  dealii::Tensor<1,dim,real> gradient;
337  const real A = this->amplitudes[istate];
338  const dealii::Tensor<1,dim,real> f = this->frequencies[istate];
339  if (dim==1) {
340  const real fx = f[0]*point[0];
341  gradient[0] = -A*f[0]*sin(fx);
342  }
343  if (dim==2) {
344  const real fx = f[0]*point[0];
345  const real fy = f[1]*point[1];
346  gradient[0] = -A*f[0]*sin(fx)*cos(fy);
347  gradient[1] = -A*f[1]*cos(fx)*sin(fy);
348  }
349  if (dim==3) {
350  const real fx = f[0]*point[0];
351  const real fy = f[1]*point[1];
352  const real fz = f[2]*point[2];
353  gradient[0] = -A*f[0]*sin(fx)*cos(fy)*cos(fz);
354  gradient[1] = -A*f[1]*cos(fx)*sin(fy)*cos(fz);
355  gradient[2] = -A*f[2]*cos(fx)*cos(fy)*sin(fz);
356  }
357  return gradient;
358 }
359 
360 template <int dim, int nspecies, typename real>
361 inline dealii::Tensor<1,dim,real> ManufacturedSolutionExp<dim,nspecies,real>
362 ::gradient (const dealii::Point<dim,real> &point, const unsigned int /*istate*/) const
363 {
364  dealii::Tensor<1,dim,real> gradient;
365  if (dim==1) {
366  gradient[0] = exp(point[0]);
367  }
368  if (dim==2) {
369  gradient[0] = exp(point[0]);
370  gradient[1] = exp(point[1]);
371  }
372  if (dim==3) {
373  gradient[0] = exp(point[0]);
374  gradient[1] = exp(point[1]);
375  gradient[2] = exp(point[2]);
376  }
377  return gradient;
378 }
379 
380 template <int dim, int nspecies, typename real>
381 inline dealii::Tensor<1,dim,real> ManufacturedSolutionEvenPoly<dim,nspecies,real>
382 ::gradient (const dealii::Point<dim,real> &point, const unsigned int /*istate*/) const
383 {
384  dealii::Tensor<1,dim,real> gradient;
385  const double poly_max = 7;
386  if (dim==1) {
387  gradient[0] = poly_max*pow(point[0] + 0.5, poly_max-1);
388  }
389  if (dim==2) {
390  gradient[0] = poly_max*pow(point[0] + 0.5, poly_max-1);
391  gradient[1] = poly_max*pow(point[1] + 0.5, poly_max-1);
392  }
393  if (dim==3) {
394  gradient[0] = poly_max*pow(point[0] + 0.5, poly_max-1);
395  gradient[1] = poly_max*pow(point[1] + 0.5, poly_max-1);
396  gradient[2] = poly_max*pow(point[2] + 0.5, poly_max-1);
397  }
398  return gradient;
399 }
400 
401 template <int dim, int nspecies, typename real>
402 inline dealii::Tensor<1,dim,real> ManufacturedSolutionPoly<dim,nspecies,real>
403 ::gradient (const dealii::Point<dim,real> &point, const unsigned int /*istate*/) const
404 {
405  dealii::Tensor<1,dim,real> gradient;
406  if (dim==1) {
407  const real x = point[0];
408  gradient[0] = 1.0 - 2*x -3*x*x + 4*x*x*x - 5*x*x*x*x + 6*x*x*x*x*x + 0.050*cos(50*x);
409  }
410  if (dim==2) {
411  real x = point[0];
412  gradient[0] = 1.0 - 2*x -3*x*x + 4*x*x*x - 5*x*x*x*x + 6*x*x*x*x*x + 0.050*cos(50*x);
413  x = point[1];
414  gradient[1] = 1.0 - 2*x -3*x*x + 4*x*x*x - 5*x*x*x*x + 6*x*x*x*x*x + 0.050*cos(50*x);
415  }
416  if (dim==3) {
417  real x = point[0];
418  gradient[0] = 1.0 - 2*x -3*x*x + 4*x*x*x - 5*x*x*x*x + 6*x*x*x*x*x;
419  x = point[1];
420  gradient[1] = 1.0 - 2*x -3*x*x + 4*x*x*x - 5*x*x*x*x + 6*x*x*x*x*x;
421  x = point[2];
422  gradient[2] = 1.0 - 2*x -3*x*x + 4*x*x*x - 5*x*x*x*x + 6*x*x*x*x*x;
423  }
424  return gradient;
425 }
426 
427 template <int dim, int nspecies, typename real>
428 inline dealii::Tensor<1,dim,real> ManufacturedSolutionAtan<dim,nspecies,real>
429 ::gradient(const dealii::Point<dim,real> &point, const unsigned int /*istate*/) const
430 {
431  dealii::Tensor<1,dim,real> gradient;
432  for(unsigned int k = 0; k < dim; ++k){
433  // taking the k^th derivative
434  real grad_dim = 1;
435  for(unsigned int i = 0; i < dim; ++i){
436  real x = point[i];
437  real val_dim = 0;
438  for(unsigned int j = 0; j < n_shocks[i]; ++j){
439  if(i==k){
440  // taking the derivative dimension
441  real coeff = S_j[i][j]*(x-x_j[i][j]);
442  val_dim += S_j[i][j]/(pow(coeff,2)+1);
443  }else{
444  // value product unaffected
445  val_dim += atan(S_j[i][j]*(x-x_j[i][j]));
446  }
447  }
448  grad_dim *= val_dim;
449  }
450  gradient[k] = grad_dim;
451  }
452  return gradient;
453 }
454 
455 template <int dim, int nspecies, typename real>
456 inline dealii::Tensor<1,dim,real> ManufacturedSolutionBoundaryLayer<dim,nspecies,real>
457 ::gradient(const dealii::Point<dim,real> &point, const unsigned int istate) const
458 {
459  dealii::Tensor<1,dim,real> gradient;
460  if(dim == 1){
461  const real x = point[0];
462  gradient[0] = (1 + (exp(x/epsilon[istate][0])/epsilon[istate][0])/(1.0-exp(1.0/epsilon[istate][0])));
463  }else if(dim == 2){
464  const real x = point[0], y = point[1];
465  gradient[0] = (1 + (exp(x/epsilon[istate][0])/epsilon[istate][0])/(1.0-exp(1.0/epsilon[istate][0])))
466  * (y + (exp(y/epsilon[istate][1])-1.0) /(1.0-exp(1.0/epsilon[istate][1])));
467  gradient[1] = (x + (exp(x/epsilon[istate][0])-1.0) /(1.0-exp(1.0/epsilon[istate][0])))
468  * (1 + (exp(y/epsilon[istate][1])/epsilon[istate][1])/(1.0-exp(1.0/epsilon[istate][1])));
469  }else if(dim == 3){
470  const real x = point[0], y = point[1], z = point[2];
471  gradient[0] = (1 + (exp(x/epsilon[istate][0])/epsilon[istate][0])/(1.0-exp(1.0/epsilon[istate][0])))
472  * (y + (exp(y/epsilon[istate][1])-1.0) /(1.0-exp(1.0/epsilon[istate][1])))
473  * (z + (exp(z/epsilon[istate][2])-1.0) /(1.0-exp(1.0/epsilon[istate][2])));
474  gradient[1] = (x + (exp(x/epsilon[istate][0])-1.0) /(1.0-exp(1.0/epsilon[istate][0])))
475  * (1 + (exp(y/epsilon[istate][1])/epsilon[istate][1])/(1.0-exp(1.0/epsilon[istate][1])))
476  * (z + (exp(z/epsilon[istate][2])-1.0) /(1.0-exp(1.0/epsilon[istate][2])));
477  gradient[2] = (x + (exp(x/epsilon[istate][0])-1.0) /(1.0-exp(1.0/epsilon[istate][0])))
478  * (y + (exp(y/epsilon[istate][1])-1.0) /(1.0-exp(1.0/epsilon[istate][1])))
479  * (1 + (exp(z/epsilon[istate][2])/epsilon[istate][2])/(1.0-exp(1.0/epsilon[istate][2])));
480  }
481  return gradient;
482 }
483 
484 template <int dim, int nspecies, typename real>
485 inline dealii::Tensor<1,dim,real> ManufacturedSolutionSShock<dim,nspecies,real>
486 ::gradient(const dealii::Point<dim,real> &point, const unsigned int /*istate*/) const
487 {
488  dealii::Tensor<1,dim,real> gradient;
489  if(dim == 2){
490  const real x = point[0], y = point[1];
491  // gradient[0] = -4.5*pow(cosh(6*x-2*sin(5*y)),-2);
492  // gradient[1] = 7.5*pow(cosh(6*x-2*sin(5*y)),-2)*cos(5*y);
493  // gradient[0] = -90*pow(cosh(-120*x-20*sin(5-10*y)+60),-2);
494  // gradient[1] = 150*pow(cosh(-120*x-20*sin(5-10*y)+60),-2)*cos(5-10*y);
495 
496  const real denominator = pow(cosh(f + e*x + b*sin(d + c*y)), -2);
497  gradient[0] = a*e*denominator;
498  gradient[1] = a*b*c*cos(d+c*y)*denominator;
499  }
500  return gradient;
501 }
502 
503 template <int dim, int nspecies, typename real>
504 inline dealii::Tensor<1,dim,real> ManufacturedSolutionQuadratic<dim,nspecies,real>
505 ::gradient(const dealii::Point<dim,real> &point, const unsigned int /*istate*/) const
506 {
507  dealii::Tensor<1,dim,real> gradient;
508  for(unsigned int d = 0; d < dim; ++d){
509  // dF = <2ax, 2by, 2cz>
510  const real x = point[d];
511  gradient[d] = 2*alpha_diag[d]*x;
512  }
513  return gradient;
514 }
515 
516 template <int dim, int nspecies, typename real>
517 inline dealii::Tensor<1,dim,real> ManufacturedSolutionExample<dim,nspecies,real>
518 ::gradient(const dealii::Point<dim,real> &point, const unsigned int /*istate*/) const
519 {
520  dealii::Tensor<1,dim,real> gradient;
521  for(unsigned int d = 0; d < dim; ++d){
522  gradient[d] = exp(point[d]) + cos(point[d]);
523  }
524  return gradient;
525 }
526 
527 template <int dim, int nspecies, typename real>
528 inline dealii::Tensor<1,dim,real> ManufacturedSolutionNavahBase<dim,nspecies,real>
529 ::primitive_gradient (const dealii::Point<dim,real> &point, const unsigned int istate) const
530 {
531  dealii::Tensor<1,dim,real> gradient;
532  // Gradients of primitive variables
533  if (dim == 2) {
534  const real x = point[0], y = point[1];
535 
536  if(istate==0) {
537  // density
538  gradient[0] = ncm[0][4]*c*ncm[0][1]*cos(ncm[0][4]*c*x) - ncm[0][6]*c*ncm[0][3]*sin(ncm[0][6]*c*x)*cos(ncm[0][6]*c*y); // dx
539  gradient[1] = -ncm[0][5]*c*ncm[0][2]*sin(ncm[0][5]*c*y) - ncm[0][6]*c*ncm[0][3]*cos(ncm[0][6]*c*x)*sin(ncm[0][6]*c*y); // dy
540  }
541  if(istate==1) {
542  // x-velocity
543  gradient[0] = ncm[1][4]*c*ncm[1][1]*cos(ncm[1][4]*c*x) - ncm[1][6]*c*ncm[1][3]*sin(ncm[1][6]*c*x)*cos(ncm[1][6]*c*y); // dx
544  gradient[1] = -ncm[1][5]*c*ncm[1][2]*sin(ncm[1][5]*c*y) - ncm[1][6]*c*ncm[1][3]*cos(ncm[1][6]*c*x)*sin(ncm[1][6]*c*y); // dy
545  }
546  if(istate==2) {
547  // y-velocity
548  gradient[0] = -ncm[2][4]*c*ncm[2][1]*sin(ncm[2][4]*c*x) - ncm[2][6]*c*ncm[2][3]*sin(ncm[2][6]*c*x)*cos(ncm[2][6]*c*y); // dx
549  gradient[1] = ncm[2][5]*c*ncm[2][2]*cos(ncm[2][5]*c*y) - ncm[2][6]*c*ncm[2][3]*cos(ncm[2][6]*c*x)*sin(ncm[2][6]*c*y); // dy
550  }
551  if(istate==3) {
552  // pressure
553  gradient[0] = -ncm[3][4]*c*ncm[3][1]*sin(ncm[3][4]*c*x) - ncm[3][6]*c*ncm[3][3]*sin(ncm[3][6]*c*x)*cos(ncm[3][6]*c*y); // dx
554  gradient[1] = ncm[3][5]*c*ncm[3][2]*cos(ncm[3][5]*c*y) - ncm[3][6]*c*ncm[3][3]*cos(ncm[3][6]*c*x)*sin(ncm[3][6]*c*y); // dy
555  }
556  if(istate==4) {
557  // turbulent working variable
558  gradient[0] = -ncm[4][4]*c*ncm[4][1]*sin(ncm[4][4]*c*x) - ncm[4][6]*c*ncm[4][3]*sin(ncm[4][6]*c*x)*cos(ncm[4][6]*c*y); // dx
559  gradient[1] = -ncm[4][5]*c*ncm[4][2]*sin(ncm[4][5]*c*y) - ncm[4][6]*c*ncm[4][3]*cos(ncm[4][6]*c*x)*sin(ncm[4][6]*c*y); // dy
560  }
561  }
562  return gradient;
563 }
564 
565 template <int dim, int nspecies, typename real>
566 inline dealii::Tensor<1,dim,real> ManufacturedSolutionNavahBase<dim,nspecies,real>
567 ::gradient (const dealii::Point<dim,real> &point, const unsigned int istate) const
568 {
569  dealii::Tensor<1,dim,real> gradient;
570 
571  if (dim == 2) {
572  const real rho = primitive_value(point,0);
573  const real u = primitive_value(point,1);
574  const real v = primitive_value(point,2);
575  // const real p = primitive_value(point,3);
576  const dealii::Tensor<1,dim,real> rho_grad = primitive_gradient(point,0);
577  const dealii::Tensor<1,dim,real> u_grad = primitive_gradient(point,1);
578  const dealii::Tensor<1,dim,real> v_grad = primitive_gradient(point,2);
579  const dealii::Tensor<1,dim,real> p_grad = primitive_gradient(point,3);
580 
581  // convert to primitive to gradient of conservative variables using product rule
582  if(istate==0) {
583  // density
584  for(int d=0; d<dim; d++) {
585  gradient[d] = rho_grad[d];
586  }
587  }
588  if(istate==1) {
589  // x-momentum
590  for(int d=0; d<dim; d++) {
591  gradient[d] = u*rho_grad[d] + rho*u_grad[d];
592  }
593  }
594  if(istate==2) {
595  // y-momentum
596  for(int d=0; d<dim; d++) {
597  gradient[d] = v*rho_grad[d] + rho*v_grad[d];
598  }
599  }
600  if(istate==3) {
601  // total energy
602  for(int d=0; d<dim; d++) {
603  gradient[d] = p_grad[d]/(1.4-1.0) + 0.5*rho_grad[d]*(u*u + v*v) + rho*(u*u_grad[d]+v*v_grad[d]);
604  }
605  }
606  if(istate==4) {
607  // transport of the turbulent working variable (twv)
608  const real twv = primitive_value(point,4);
609  const dealii::Tensor<1,dim,real> twv_grad = primitive_gradient(point,4); // only used for RANS
610  for(int d=0; d<dim; d++) {
611  gradient[d] = twv*rho_grad[d] + rho*twv_grad[d];
612  }
613  }
614  }
615  return gradient;
616 }
617 
618 template <int dim, int nspecies, typename real>
619 inline dealii::SymmetricTensor<2,dim,real> ManufacturedSolutionZero<dim,nspecies,real>
620 ::hessian (const dealii::Point<dim,real> &/*point*/, const unsigned int /*istate*/) const
621 {
622  dealii::SymmetricTensor<2,dim,real> hessian;
623  for(unsigned int i = 0; i < dim; i++){
624  for(unsigned int j = 0; j < dim; j++){
625  hessian[i][j] = 0;
626  }
627  }
628  return hessian;
629 }
630 
631 template <int dim, int nspecies, typename real>
632 inline dealii::SymmetricTensor<2,dim,real> ManufacturedSolutionSine<dim,nspecies,real>
633 ::hessian (const dealii::Point<dim,real> &point, const unsigned int istate) const
634 {
635  dealii::SymmetricTensor<2,dim,real> hessian;
636  // Hard-coded is much more readable than the dimensionally generic one
637  const real A = this->amplitudes[istate];
638  const dealii::Tensor<1,dim,real> f = this->frequencies[istate];
639  if (dim==1) {
640  const real fx = f[0]*point[0];
641  hessian[0][0] = -A*f[0]*f[0]*sin(fx);
642  }
643  if (dim==2) {
644  const real fx = f[0]*point[0];
645  const real fy = f[1]*point[1];
646  hessian[0][0] = -A*f[0]*f[0]*sin(fx)*sin(fy);
647  hessian[0][1] = A*f[0]*f[1]*cos(fx)*cos(fy);
648 
649  hessian[1][0] = A*f[1]*f[0]*cos(fx)*cos(fy);
650  hessian[1][1] = -A*f[1]*f[1]*sin(fx)*sin(fy);
651  }
652  if (dim==3) {
653  const real fx = f[0]*point[0];
654  const real fy = f[1]*point[1];
655  const real fz = f[2]*point[2];
656  hessian[0][0] = -A*f[0]*f[0]*sin(fx)*sin(fy)*sin(fz);
657  hessian[0][1] = A*f[0]*f[1]*cos(fx)*cos(fy)*sin(fz);
658  hessian[0][2] = A*f[0]*f[2]*cos(fx)*sin(fy)*cos(fz);
659 
660  hessian[1][0] = A*f[1]*f[0]*cos(fx)*cos(fy)*sin(fz);
661  hessian[1][1] = -A*f[1]*f[1]*sin(fx)*sin(fy)*sin(fz);
662  hessian[1][2] = A*f[1]*f[2]*sin(fx)*cos(fy)*cos(fz);
663 
664  hessian[2][0] = A*f[2]*f[0]*cos(fx)*sin(fy)*cos(fz);
665  hessian[2][1] = A*f[2]*f[1]*sin(fx)*cos(fy)*cos(fz);
666  hessian[2][2] = -A*f[2]*f[2]*sin(fx)*sin(fy)*sin(fz);
667  }
668  return hessian;
669 }
670 
671 template <int dim, int nspecies, typename real>
672 inline dealii::SymmetricTensor<2,dim,real> ManufacturedSolutionAdd<dim,nspecies,real>
673 ::hessian (const dealii::Point<dim,real> &point, const unsigned int istate) const
674 {
675  dealii::SymmetricTensor<2,dim,real> hessian;
676  const real A = this->amplitudes[istate];
677  const dealii::Tensor<1,dim,real> f = this->frequencies[istate];
678  if (dim==1) {
679  const real fx = f[0]*point[0];
680  hessian[0][0] = -A*f[0]*f[0]*sin(fx);
681  }
682  if (dim==2) {
683  const real fx = f[0]*point[0];
684  const real fy = f[1]*point[1];
685  hessian[0][0] = -A*f[0]*f[0]*sin(fx);
686  hessian[0][1] = 0.0;
687 
688  hessian[1][0] = 0.0;
689  hessian[1][1] = -A*f[1]*f[1]*sin(fy);
690  }
691  if (dim==3) {
692  const real fx = f[0]*point[0];
693  const real fy = f[1]*point[1];
694  const real fz = f[2]*point[2];
695  hessian[0][0] = -A*f[0]*f[0]*sin(fx);
696  hessian[0][1] = 0.0;
697  hessian[0][2] = 0.0;
698 
699  hessian[1][0] = 0.0;
700  hessian[1][1] = -A*f[1]*f[1]*sin(fy);
701  hessian[1][2] = 0.0;
702 
703  hessian[2][0] = 0.0;
704  hessian[2][1] = 0.0;
705  hessian[2][2] = -A*f[2]*f[2]*sin(fz);
706  }
707  return hessian;
708 }
709 
710 template <int dim, int nspecies, typename real>
711 inline dealii::SymmetricTensor<2,dim,real> ManufacturedSolutionCosine<dim,nspecies,real>
712 ::hessian (const dealii::Point<dim,real> &point, const unsigned int istate) const
713 {
714  dealii::SymmetricTensor<2,dim,real> hessian;
715  const real A = this->amplitudes[istate];
716  const dealii::Tensor<1,dim,real> f = this->frequencies[istate];
717  if (dim==1) {
718  const real fx = f[0]*point[0];
719  hessian[0][0] = -A*f[0]*f[0]*cos(fx);
720  }
721  if (dim==2) {
722  const real fx = f[0]*point[0];
723  const real fy = f[1]*point[1];
724  hessian[0][0] = -A*f[0]*f[0]*cos(fx)*cos(fy);
725  hessian[0][1] = A*f[0]*f[1]*sin(fx)*sin(fy);
726 
727  hessian[1][0] = A*f[1]*f[0]*sin(fx)*sin(fy);
728  hessian[1][1] = -A*f[1]*f[1]*cos(fx)*cos(fy);
729  }
730  if (dim==3) {
731  const real fx = f[0]*point[0];
732  const real fy = f[1]*point[1];
733  const real fz = f[2]*point[2];
734  hessian[0][0] = -A*f[0]*f[0]*cos(fx)*cos(fy)*cos(fz);
735  hessian[0][1] = A*f[0]*f[1]*sin(fx)*sin(fy)*cos(fz);
736  hessian[0][2] = A*f[0]*f[2]*sin(fx)*cos(fy)*sin(fz);
737 
738  hessian[1][0] = A*f[1]*f[0]*sin(fx)*sin(fy)*cos(fz);
739  hessian[1][1] = -A*f[1]*f[1]*cos(fx)*cos(fy)*cos(fz);
740  hessian[1][2] = A*f[1]*f[2]*cos(fx)*sin(fy)*sin(fz);
741 
742  hessian[2][0] = A*f[2]*f[0]*sin(fx)*cos(fy)*sin(fz);
743  hessian[2][1] = A*f[2]*f[1]*cos(fx)*sin(fy)*sin(fz);
744  hessian[2][2] = -A*f[2]*f[2]*cos(fx)*cos(fy)*cos(fz);
745  }
746  return hessian;
747 }
748 
749 template <int dim, int nspecies, typename real>
750 inline dealii::SymmetricTensor<2,dim,real> ManufacturedSolutionExp<dim,nspecies,real>
751 ::hessian (const dealii::Point<dim,real> &point, const unsigned int /*istate*/) const
752 {
753  dealii::SymmetricTensor<2,dim,real> hessian;
754  if (dim==1) {
755  hessian[0][0] = exp(point[0]);
756  }
757  if (dim==2) {
758  hessian[0][0] = exp(point[0]);
759  hessian[0][1] = 0.0;
760 
761  hessian[1][0] = 0.0;
762  hessian[1][1] = exp(point[1]);
763  }
764  if (dim==3) {
765  hessian[0][0] = exp(point[0]);
766  hessian[0][1] = 0.0;
767  hessian[0][2] = 0.0;
768 
769  hessian[1][0] = 0.0;
770  hessian[1][1] = exp(point[1]);
771  hessian[1][2] = 0.0;
772 
773  hessian[2][0] = 0.0;
774  hessian[2][1] = 0.0;
775  hessian[2][2] = exp(point[2]);
776  }
777  return hessian;
778 }
779 
780 template <int dim, int nspecies, typename real>
781 inline dealii::SymmetricTensor<2,dim,real> ManufacturedSolutionEvenPoly<dim,nspecies,real>
782 ::hessian (const dealii::Point<dim,real> &point, const unsigned int /*istate*/) const
783 {
784  dealii::SymmetricTensor<2,dim,real> hessian;
785  const double poly_max = 7;
786  if (dim==1) {
787  hessian[0][0] = poly_max*poly_max*pow(point[0] + 0.5, poly_max-2);
788  }
789  if (dim==2) {
790  hessian[0][0] = poly_max*poly_max*pow(point[0] + 0.5, poly_max-2);
791  hessian[0][1] = 0.0;
792 
793  hessian[1][0] = 0.0;
794  hessian[1][1] = poly_max*poly_max*pow(point[1] + 0.5, poly_max-2);
795  }
796  if (dim==3) {
797  hessian[0][0] = poly_max*poly_max*pow(point[0] + 0.5, poly_max-2);
798  hessian[0][1] = 0.0;
799  hessian[0][2] = 0.0;
800 
801  hessian[1][0] = 0.0;
802  hessian[1][1] = poly_max*poly_max*pow(point[1] + 0.5, poly_max-2);
803  hessian[1][2] = 0.0;
804 
805  hessian[2][0] = 0.0;
806  hessian[2][1] = 0.0;
807  hessian[2][2] = poly_max*poly_max*pow(point[2] + 0.5, poly_max-2);
808  }
809  return hessian;
810 }
811 
812 template <int dim, int nspecies, typename real>
813 inline dealii::SymmetricTensor<2,dim,real> ManufacturedSolutionPoly<dim,nspecies,real>
814 ::hessian (const dealii::Point<dim,real> &point, const unsigned int /*istate*/) const
815 {
816  dealii::SymmetricTensor<2,dim,real> hessian;
817  if (dim==1) {
818  const real x = point[0];
819  hessian[0][0] = - 2.0 -6*x + 12*x*x - 20*x*x*x + 30*x*x*x*x - 2.500*sin(50*x);
820  }
821  if (dim==2) {
822  real x = point[0];
823  hessian[0][0] = - 2.0 -6*x + 12*x*x - 20*x*x*x + 30*x*x*x*x - 2.500*sin(50*x);
824  x = point[1];
825  hessian[1][1] = - 2.0 -6*x + 12*x*x - 20*x*x*x + 30*x*x*x*x - 2.500*sin(50*x);
826  }
827  if (dim==3) {
828  real x = point[0];
829  hessian[0][0] = - 2.0 -6*x + 12*x*x - 20*x*x*x + 30*x*x*x*x - 2.500*sin(50*x);
830  x = point[1];
831  hessian[1][1] = - 2.0 -6*x + 12*x*x - 20*x*x*x + 30*x*x*x*x - 2.500*sin(50*x);
832  x = point[2];
833  hessian[2][2] = - 2.0 -6*x + 12*x*x - 20*x*x*x + 30*x*x*x*x - 2.500*sin(50*x);
834  }
835  return hessian;
836 }
837 
838 template <int dim, int nspecies, typename real>
839 inline dealii::SymmetricTensor<2,dim,real> ManufacturedSolutionAtan<dim,nspecies,real>
840 ::hessian(const dealii::Point<dim,real> &point, const unsigned int /*istate*/) const
841 {
842  dealii::SymmetricTensor<2,dim,real> hes;
843 
844  for(unsigned int k1 = 0; k1 < dim; ++k1){
845  // taking the k1^th derivative
846  for(unsigned int k2 = 0; k2 < dim; ++k2){
847  // taking the k2^th derivative
848  real hes_dim = 1;
849  for(unsigned int i = 0; i < dim; ++i){
850  real x = point[i];
851  real val_dim = 0;
852  for(unsigned int j = 0; j < n_shocks[i]; ++j){
853  if(i == k1 && i == k2){
854  // taking the second derivative in this dim
855  real coeff = S_j[i][j]*(x-x_j[i][j]);
856  val_dim += -2.0*pow(S_j[i][j],2)*coeff/pow(pow(coeff,2)+1,2);
857  }else if(i == k1 || i == k2){
858  // taking the first derivative in this dim
859  real coeff = S_j[i][j]*(x-x_j[i][j]);
860  val_dim += S_j[i][j]/(pow(coeff,2)+1);
861  }else{
862  // taking the value in this dim
863  val_dim += atan(S_j[i][j]*(x-x_j[i][j]));
864  }
865  }
866  hes_dim *= val_dim;
867  }
868  hes[k1][k2] = hes_dim;
869  }
870  }
871 
872  return hes;
873 }
874 
875 template <int dim, int nspecies, typename real>
876 inline dealii::SymmetricTensor<2,dim,real> ManufacturedSolutionBoundaryLayer<dim,nspecies,real>
877 ::hessian(const dealii::Point<dim,real> &point, const unsigned int istate) const
878 {
879  dealii::SymmetricTensor<2,dim,real> hessian;
880  if (dim==1) {
881  const real x = point[0];
882  hessian[0][0] = (exp(x/epsilon[istate][0])/pow(epsilon[istate][0],2)/(1.0-exp(1.0/epsilon[istate][0])));
883  }
884  if (dim==2) {
885  real x = point[0], y = point[1];
886  hessian[0][0] = (exp(x/epsilon[istate][0])/pow(epsilon[istate][0],2)/(1.0-exp(1.0/epsilon[istate][0])))
887  * (y + (exp(y/epsilon[istate][1])-1.0) /(1.0-exp(1.0/epsilon[istate][1])));
888  hessian[0][1] = (1 + (exp(x/epsilon[istate][0])/epsilon[istate][0]) /(1.0-exp(1.0/epsilon[istate][0])))
889  * (1 + (exp(y/epsilon[istate][1])/epsilon[istate][1]) /(1.0-exp(1.0/epsilon[istate][1])));
890 
891  hessian[1][0] = hessian[0][1];
892  hessian[1][1] = (x + (exp(x/epsilon[istate][0])-1.0) /(1.0-exp(1.0/epsilon[istate][0])))
893  * (exp(y/epsilon[istate][1])/pow(epsilon[istate][1],2)/(1.0-exp(1.0/epsilon[istate][1])));
894  }
895  if (dim==3) {
896  real x = point[0], y = point[1], z = point[2];
897  hessian[0][0] = (exp(x/epsilon[istate][0])/pow(epsilon[istate][0],2)/(1.0-exp(1.0/epsilon[istate][0])))
898  * (y + (exp(y/epsilon[istate][1])-1.0) /(1.0-exp(1.0/epsilon[istate][1])))
899  * (z + (exp(z/epsilon[istate][2])-1.0) /(1.0-exp(1.0/epsilon[istate][2])));
900  hessian[0][1] = (1 + (exp(x/epsilon[istate][0])/epsilon[istate][0]) /(1.0-exp(1.0/epsilon[istate][0])))
901  * (1 + (exp(y/epsilon[istate][1])/epsilon[istate][1]) /(1.0-exp(1.0/epsilon[istate][1])))
902  * (z + (exp(z/epsilon[istate][2])-1.0) /(1.0-exp(1.0/epsilon[istate][2])));
903  hessian[0][2] = (1 + (exp(x/epsilon[istate][0])/epsilon[istate][0]) /(1.0-exp(1.0/epsilon[istate][0])))
904  * (y + (exp(y/epsilon[istate][1])-1.0) /(1.0-exp(1.0/epsilon[istate][1])))
905  * (1 + (exp(z/epsilon[istate][2])/epsilon[istate][2]) /(1.0-exp(1.0/epsilon[istate][2])));
906 
907  hessian[1][0] = hessian[0][1];
908  hessian[1][1] = (x + (exp(x/epsilon[istate][0])-1.0) /(1.0-exp(1.0/epsilon[istate][0])))
909  * (exp(y/epsilon[istate][1])/pow(epsilon[istate][1],2)/(1.0-exp(1.0/epsilon[istate][1])))
910  * (z + (exp(z/epsilon[istate][2])-1.0) /(1.0-exp(1.0/epsilon[istate][2])));
911  hessian[1][2] = (x + (exp(x/epsilon[istate][0])-1.0) /(1.0-exp(1.0/epsilon[istate][0])))
912  * (1 + (exp(y/epsilon[istate][1])/epsilon[istate][1]) /(1.0-exp(1.0/epsilon[istate][1])))
913  * (1 + (exp(z/epsilon[istate][2])/epsilon[istate][2]) /(1.0-exp(1.0/epsilon[istate][2])));
914 
915  hessian[2][0] = hessian[0][2];
916  hessian[2][1] = hessian[2][1];
917  hessian[2][2] = (x + (exp(x/epsilon[istate][0])-1.0) /(1.0-exp(1.0/epsilon[istate][0])))
918  * (y + (exp(y/epsilon[istate][1])-1.0) /(1.0-exp(1.0/epsilon[istate][1])))
919  * (exp(z/epsilon[istate][2])/pow(epsilon[istate][2],2)/(1.0-exp(1.0/epsilon[istate][2])));
920  }
921  return hessian;
922 }
923 
924 template <int dim, int nspecies, typename real>
925 inline dealii::SymmetricTensor<2,dim,real> ManufacturedSolutionSShock<dim,nspecies,real>
926 ::hessian(const dealii::Point<dim,real> &point, const unsigned int /*istate*/) const
927 {
928  dealii::SymmetricTensor<2,dim,real> hessian;
929  if (dim==2) {
930  const real x = point[0], y = point[1];
931  // hessian[0][0] = 54*tanh(6*x-2*sin(5*y))*pow(cosh(6*x-2*sin(5*y)),-2);
932  // hessian[0][1] = -90*tanh(6*x-2*sin(5*y))*pow(cosh(6*x-2*sin(5*y)),-2)*cos(5*y);
933 
934  // hessian[1][0] = hessian[1][0];
935  // hessian[1][1] = pow(cosh(6*x-2*sin(5*y)),-2)*(-37.5*sin(5*y)+150*pow(cos(5*y),2)*tanh(6*x-2*sin(5*y)));
936 
937  // hessian[0][0] = 21600*pow(cosh(20*(-3+6*x+sin(5-10*y))),2)*tanh(20*(-3+6*x+sin(5-10*y)));
938  // hessian[0][1] = -36000*pow(cosh(20*(-3+6*x+sin(5-10*y))),2)*tanh(20*(-3+6*x+sin(5-10*y)))*cos(5-10*y);
939 
940  // hessian[1][0] = hessian[0][1];
941  // hessian[1][1] = 1500*pow(cosh(20*(-3+6*x+sin(5-10*y))),2)*(40*pow(cos(5-10*y),2)*tanh(20*(-3+6*x+sin(5-10*y)))+sin(5-10*y));
942 
943  const real component = f + e*x + b*sin(d+c*y);
944  const real numerator = sinh(component);
945  const real denominator = pow(cosh(component), -3);
946 
947  hessian[0][0] = -2*a*e*e*numerator*denominator;
948  hessian[0][1] = -2*a*b*c*e*cos(d+c*y)*numerator*denominator;
949 
950  hessian[1][0] = hessian[0][1];
951  hessian[1][1] = -a*b*c*c*pow(cosh(component), -2)*(2*b*pow(cos(c*y + d),2)*tanh(component) + sin(c*y + d));
952  }
953  return hessian;
954 }
955 
956 template <int dim, int nspecies, typename real>
957 inline dealii::SymmetricTensor<2,dim,real> ManufacturedSolutionQuadratic<dim,nspecies,real>
958 ::hessian(const dealii::Point<dim,real> &/* point */, const unsigned int /* istate */) const
959 {
960  dealii::SymmetricTensor<2,dim,real> hessian;
961  for(unsigned int i = 0; i < dim; ++i){
962  for(unsigned int j = 0; j < dim; ++j){
963  if(i == j){
964  hessian[i][i] = 2*alpha_diag[i];
965  }else{
966  hessian[i][j] = 0.0;
967  }
968  }
969  }
970  return hessian;
971 }
972 
973 template <int dim, int nspecies, typename real>
974 inline dealii::SymmetricTensor<2,dim,real> ManufacturedSolutionExample<dim,nspecies,real>
975 ::hessian (const dealii::Point<dim,real> &point, const unsigned int /*istate*/) const
976 {
977  dealii::SymmetricTensor<2,dim,real> hessian;
978  for(int idim=0; idim<dim; idim++){
979  for(int jdim=0; jdim<dim; jdim++){
980  if(idim == jdim)
981  hessian[idim][jdim] = exp(point[idim]) - sin(point[idim]);
982  else
983  hessian[idim][jdim] = 0.0;
984  }
985  }
986  return hessian;
987 }
988 
989 template <int dim, int nspecies, typename real>
990 inline dealii::SymmetricTensor<2,dim,real> ManufacturedSolutionNavahBase<dim,nspecies,real>
991 ::primitive_hessian (const dealii::Point<dim,real> &point, const unsigned int istate) const
992 {
993  dealii::SymmetricTensor<2,dim,real> hessian;
994 
995  if (dim == 2) {
996  const real x = point[0], y = point[1];
997 
998  if(istate==0) {
999  // density
1000  hessian[0][0] = -ncm[0][4]*c*ncm[0][4]*c*ncm[0][1]*sin(ncm[0][4]*c*x) - ncm[0][6]*c*ncm[0][6]*c*ncm[0][3]*cos(ncm[0][6]*c*x)*cos(ncm[0][6]*c*y); // dxdx
1001  hessian[0][1] = ncm[0][6]*c*ncm[0][6]*c*ncm[0][3]*sin(ncm[0][6]*c*x)*sin(ncm[0][6]*c*y); // dxdy
1002  hessian[1][0] = hessian[0][1]; // dydx
1003  hessian[1][1] = -ncm[0][5]*c*ncm[0][5]*c*ncm[0][2]*cos(ncm[0][5]*c*y) - ncm[0][6]*c*ncm[0][6]*c*ncm[0][3]*cos(ncm[0][6]*c*x)*cos(ncm[0][6]*c*y); // dydy
1004  }
1005  if(istate==1) {
1006  // x-velocity
1007  hessian[0][0] = -ncm[1][4]*c*ncm[1][4]*c*ncm[1][1]*sin(ncm[1][4]*c*x) - ncm[1][6]*c*ncm[1][6]*c*ncm[1][3]*cos(ncm[1][6]*c*x)*cos(ncm[1][6]*c*y); // dxdx
1008  hessian[0][1] = ncm[1][6]*c*ncm[1][6]*c*ncm[1][3]*sin(ncm[1][6]*c*x)*sin(ncm[1][6]*c*y); // dxdy
1009  hessian[1][0] = hessian[0][1]; // dydx
1010  hessian[1][1] = -ncm[1][5]*c*ncm[1][5]*c*ncm[1][2]*cos(ncm[1][5]*c*y) - ncm[1][6]*c*ncm[1][6]*c*ncm[1][3]*cos(ncm[1][6]*c*x)*cos(ncm[1][6]*c*y); // dydy
1011  }
1012  if(istate==2) {
1013  // y-velocity
1014  hessian[0][0] = -ncm[2][4]*c*ncm[2][4]*c*ncm[2][1]*cos(ncm[2][4]*c*x) - ncm[2][6]*c*ncm[2][6]*c*ncm[2][3]*cos(ncm[2][6]*c*x)*cos(ncm[2][6]*c*y); // dxdx
1015  hessian[0][1] = ncm[2][6]*c*ncm[2][6]*c*ncm[2][3]*sin(ncm[2][6]*c*x)*sin(ncm[2][6]*c*y); // dxdy
1016  hessian[1][0] = hessian[0][1]; // dydx
1017  hessian[1][1] = -ncm[2][5]*c*ncm[2][5]*c*ncm[2][2]*sin(ncm[2][5]*c*y) - ncm[2][6]*c*ncm[2][6]*c*ncm[2][3]*cos(ncm[2][6]*c*x)*cos(ncm[2][6]*c*y); // dydy
1018  }
1019  if(istate==3) {
1020  // pressure
1021  hessian[0][0] = -ncm[3][4]*c*ncm[3][4]*c*ncm[3][1]*cos(ncm[3][4]*c*x) - ncm[3][6]*c*ncm[3][6]*c*ncm[3][3]*cos(ncm[3][6]*c*x)*cos(ncm[3][6]*c*y); // dxdx
1022  hessian[0][1] = ncm[3][6]*c*ncm[3][6]*c*ncm[3][3]*sin(ncm[3][6]*c*x)*sin(ncm[3][6]*c*y); // dxdy
1023  hessian[1][0] = hessian[0][1]; // dydx
1024  hessian[1][1] = -ncm[3][5]*c*ncm[3][5]*c*ncm[3][2]*sin(ncm[3][5]*c*y) - ncm[3][6]*c*ncm[3][6]*c*ncm[3][3]*cos(ncm[3][6]*c*x)*cos(ncm[3][6]*c*y); // dydy
1025  }
1026  if(istate==4) {
1027  // turbulent working variable
1028  hessian[0][0] = -ncm[4][4]*c*ncm[4][4]*c*ncm[4][1]*cos(ncm[4][4]*c*x) - ncm[4][6]*c*ncm[4][6]*c*ncm[4][3]*cos(ncm[4][6]*c*x)*cos(ncm[4][6]*c*y); // dxdx
1029  hessian[0][1] = ncm[4][6]*c*ncm[4][6]*c*ncm[4][3]*sin(ncm[4][6]*c*x)*sin(ncm[4][6]*c*y); // dxdy
1030  hessian[1][0] = hessian[0][1]; // dydx
1031  hessian[1][1] = -ncm[4][5]*c*ncm[4][5]*c*ncm[4][2]*cos(ncm[4][5]*c*y) - ncm[4][6]*c*ncm[4][6]*c*ncm[4][3]*cos(ncm[4][6]*c*x)*cos(ncm[4][6]*c*y); // dydy
1032  }
1033  }
1034  return hessian;
1035 }
1036 
1037 template <int dim, int nspecies, typename real>
1038 inline dealii::SymmetricTensor<2,dim,real> ManufacturedSolutionNavahBase<dim,nspecies,real>
1039 ::hessian (const dealii::Point<dim,real> &point, const unsigned int istate) const
1040 {
1041  dealii::SymmetricTensor<2,dim,real> hessian;
1042 
1043  if (dim == 2) {
1044  const real rho = primitive_value(point,0);
1045  const real u = primitive_value(point,1);
1046  const real v = primitive_value(point,2);
1047  // const real p = primitive_value(point,3);
1048  const dealii::Tensor<1,dim,real> rho_grad = primitive_gradient(point,0);
1049  const dealii::Tensor<1,dim,real> u_grad = primitive_gradient(point,1);
1050  const dealii::Tensor<1,dim,real> v_grad = primitive_gradient(point,2);
1051  // const dealii::Tensor<1,dim,real> p_grad = primitive_gradient(point,3);
1052  const dealii::SymmetricTensor<2,dim,real> rho_hess = primitive_hessian(point,0);
1053  const dealii::SymmetricTensor<2,dim,real> u_hess = primitive_hessian(point,1);
1054  const dealii::SymmetricTensor<2,dim,real> v_hess = primitive_hessian(point,2);
1055  const dealii::SymmetricTensor<2,dim,real> p_hess = primitive_hessian(point,3);
1056 
1057  // convert to primitive to hessian of conservative variables using product rule
1058  if(istate==0) {
1059  // density
1060  for(int i=0; i<dim; i++) {
1061  for(int j=0; j<dim; j++) {
1062  hessian[i][j] = rho_hess[i][j];
1063  }
1064  }
1065  }
1066  if(istate==1) {
1067  // x-momentum
1068  for(int i=0; i<dim; i++) {
1069  for(int j=0; j<dim; j++) {
1070  hessian[i][j] = u_grad[j]*rho_grad[i] + u*rho_hess[i][j] + rho_grad[j]*u_grad[i] + rho*u_hess[i][j];
1071  }
1072  }
1073  }
1074  if(istate==2) {
1075  // y-momentum
1076  for(int i=0; i<dim; i++) {
1077  for(int j=0; j<dim; j++) {
1078  hessian[i][j] = v_grad[j]*rho_grad[i] + v*rho_hess[i][j] + rho_grad[j]*v_grad[i] + rho*v_hess[i][j];
1079  }
1080  }
1081  }
1082  if(istate==3) {
1083  // total energy
1084  for(int i=0; i<dim; i++) {
1085  for(int j=0; j<dim; j++) {
1086  hessian[i][j] = p_hess[i][j]/(1.4-1.0) + (u*u_grad[j]+v*v_grad[j])*rho_grad[i] + 0.5*(u*u + v*v)*rho_hess[i][j];
1087  hessian[i][j] += rho_grad[j]*(u*u_grad[i]+v*v_grad[i]);
1088  hessian[i][j] += rho*(u_grad[j]*u_grad[i] + u*u_hess[i][j] + v_grad[j]*v_grad[i] + v*v_hess[i][j]);
1089  }
1090  }
1091  }
1092  if(istate==4) {
1093  // transport of the turbulent working variable (twv)
1094  const real twv = primitive_value(point,4); // only used by istate=4
1095  const dealii::Tensor<1,dim,real> twv_grad = primitive_gradient(point,4); // only used by istate=4
1096  const dealii::SymmetricTensor<2,dim,real> twv_hess = primitive_hessian(point,4); // only used by istate=4
1097  for(int i=0; i<dim; i++) {
1098  for(int j=0; j<dim; j++) {
1099  hessian[i][j] = twv_grad[j]*rho_grad[i] + twv*rho_hess[i][j] + rho_grad[j]*twv_grad[i] + rho*twv_hess[i][j];
1100  }
1101  }
1102  }
1103  }
1104  return hessian;
1105 }
1106 
1107 template <int dim, int nspecies, typename real>
1109 ::ManufacturedSolutionFunction (const unsigned int nstate)
1110  :
1111  dealii::Function<dim,real>(nstate)
1112  , nstate(nstate)
1113  , base_values(nstate)
1114  , amplitudes(nstate)
1115  , frequencies(nstate)
1116 {
1117  const double pi = atan(1)*4.0;
1118  //const double ee = exp(1);
1119 
1120  for (int s=0; s<(int)nstate; s++) {
1121  base_values[s] = 1+(s+1.0)/nstate;
1122  if(nspecies == 1)
1123  base_values[nstate-1] = 10;
1124  else
1125  base_values[dim+1] = 10;
1126 
1127  // ensure species density < mixture density
1128  if (nspecies > 1 && s > dim+1) {
1129  base_values[s] /= pow(4.0, s-dim-1);
1130  }
1131 
1132  amplitudes[s] = 0.2*base_values[s]*sin((static_cast<double>(nstate)-s)/nstate);
1133  for (int d=0; d<dim; d++) {
1134  //frequencies[s][d] = 2.0 + sin(0.1+s*0.5+d*0.2) * pi / 2.0;
1135  frequencies[s][d] = 2.0 + sin(0.1+s*0.5+d*0.2) * pi / 2.0;
1136 
1137  // ensure species density < mixture density
1138  if (nspecies > 1 && s > dim+1) {
1139  frequencies[s][d] /= pow(4.0, s-dim-1);
1140  }
1141  }
1142 
1143  }
1144 }
1145 
1146 template <int dim, int nspecies, typename real>
1147 inline dealii::Tensor<1,dim,real> ManufacturedSolutionFunction<dim,nspecies,real>
1148 ::gradient_fd (const dealii::Point<dim,real> &point, const unsigned int istate) const
1149 {
1150  dealii::Tensor<1,dim,real> gradient;
1151  const double eps=1e-6;
1152  for (int dim_deri=0; dim_deri<dim; dim_deri++) {
1153  dealii::Point<dim,real> pert_p = point;
1154  dealii::Point<dim,real> pert_m = point;
1155  pert_p[dim_deri] += eps;
1156  pert_m[dim_deri] -= eps;
1157  const real value_p = value(pert_p,istate);
1158  const real value_m = value(pert_m,istate);
1159  gradient[dim_deri] = (value_p - value_m) / (2*eps);
1160  }
1161  return gradient;
1162 }
1163 
1164 template <int dim, int nspecies, typename real>
1165 inline dealii::SymmetricTensor<2,dim,real> ManufacturedSolutionFunction<dim,nspecies,real>
1166 ::hessian_fd (const dealii::Point<dim,real> &point, const unsigned int istate) const
1167 {
1168  dealii::SymmetricTensor<2,dim,real> hessian;
1169  const double eps=1e-4;
1170  for (int d1=0; d1<dim; d1++) {
1171  for (int d2=d1; d2<dim; d2++) {
1172  dealii::Point<dim,real> pert_p_p = point;
1173  dealii::Point<dim,real> pert_p_m = point;
1174  dealii::Point<dim,real> pert_m_p = point;
1175  dealii::Point<dim,real> pert_m_m = point;
1176 
1177  pert_p_p[d1] += (+eps); pert_p_p[d2] += (+eps);
1178  pert_p_m[d1] += (+eps); pert_p_m[d2] += (-eps);
1179  pert_m_p[d1] += (-eps); pert_m_p[d2] += (+eps);
1180  pert_m_m[d1] += (-eps); pert_m_m[d2] += (-eps);
1181 
1182  const real valpp = value(pert_p_p, istate);
1183  const real valpm = value(pert_p_m, istate);
1184  const real valmp = value(pert_m_p, istate);
1185  const real valmm = value(pert_m_m, istate);
1186 
1187  hessian[d1][d2] = (valpp - valpm - valmp + valmm) / (4*eps*eps);
1188  }
1189  }
1190  return hessian;
1191 }
1192 
1193 template <int dim, int nspecies, typename real>
1196  const dealii::Point<dim,real> &p,
1197  std::vector<dealii::Tensor<1,dim, real> > &gradients) const
1198 {
1199  for (unsigned int i = 0; i < nstate; ++i)
1200  gradients[i] = gradient(p, i);
1201 }
1202 
1203 
1204 template <int dim, int nspecies, typename real>
1205 inline std::vector<real> ManufacturedSolutionFunction<dim,nspecies,real>
1206 ::stdvector_values (const dealii::Point<dim,real> &point) const
1207 {
1208  std::vector<real> values(nstate);
1209  for (unsigned int s=0; s<nstate; s++) { values[s] = value(point, s); }
1210  return values;
1211 }
1212 
1213 template <int dim, int nspecies, typename real>
1214 std::shared_ptr< ManufacturedSolutionFunction<dim,nspecies,real> >
1216  Parameters::AllParameters const *const param,
1217  int nstate)
1218 {
1221 
1222  return create_ManufacturedSolution(solution_type, nstate);
1223 }
1224 
1225 template <int dim, int nspecies, typename real>
1226 std::shared_ptr< ManufacturedSolutionFunction<dim,nspecies,real> >
1229  int nstate)
1230 {
1231  if(solution_type == ManufacturedSolutionEnum::sine_solution){
1232  return std::make_shared<ManufacturedSolutionSine<dim,nspecies,real>>(nstate);
1233  }else if(solution_type == ManufacturedSolutionEnum::zero_solution){
1234  return std::make_shared<ManufacturedSolutionZero<dim,nspecies,real>>(nstate);
1235  }else if(solution_type == ManufacturedSolutionEnum::cosine_solution){
1236  return std::make_shared<ManufacturedSolutionCosine<dim,nspecies,real>>(nstate);
1237  }else if(solution_type == ManufacturedSolutionEnum::additive_solution){
1238  return std::make_shared<ManufacturedSolutionAdd<dim,nspecies,real>>(nstate);
1239  }else if(solution_type == ManufacturedSolutionEnum::exp_solution){
1240  return std::make_shared<ManufacturedSolutionExp<dim,nspecies,real>>(nstate);
1241  }else if(solution_type == ManufacturedSolutionEnum::poly_solution){
1242  return std::make_shared<ManufacturedSolutionPoly<dim,nspecies,real>>(nstate);
1243  }else if(solution_type == ManufacturedSolutionEnum::even_poly_solution){
1244  return std::make_shared<ManufacturedSolutionEvenPoly<dim,nspecies,real>>(nstate);
1245  }else if(solution_type == ManufacturedSolutionEnum::atan_solution){
1246  return std::make_shared<ManufacturedSolutionAtan<dim,nspecies,real>>(nstate);
1247  }else if(solution_type == ManufacturedSolutionEnum::boundary_layer_solution){
1248  return std::make_shared<ManufacturedSolutionBoundaryLayer<dim,nspecies,real>>(nstate);
1249  }else if((solution_type == ManufacturedSolutionEnum::s_shock_solution) && (dim==2)){
1250  return std::make_shared<ManufacturedSolutionSShock<dim,nspecies,real>>(nstate);
1251  }else if(solution_type == ManufacturedSolutionEnum::quadratic_solution){
1252  return std::make_shared<ManufacturedSolutionQuadratic<dim,nspecies,real>>(nstate);
1253  }else if(solution_type == ManufacturedSolutionEnum::example_solution){
1254  return std::make_shared<ManufacturedSolutionExample<dim,nspecies,real>>(nstate);
1255  }else if((solution_type == ManufacturedSolutionEnum::navah_solution_1) && (dim==2) && (nstate==dim+2 || nstate==dim+3)){
1256  return std::make_shared<ManufacturedSolutionNavah_MS1<dim,nspecies,real>>(nstate);
1257  }else if((solution_type == ManufacturedSolutionEnum::navah_solution_2) && (dim==2) && (nstate==dim+2 || nstate==dim+3)){
1258  return std::make_shared<ManufacturedSolutionNavah_MS2<dim,nspecies,real>>(nstate);
1259  }else if((solution_type == ManufacturedSolutionEnum::navah_solution_3) && (dim==2) && (nstate==dim+2 || nstate==dim+3)){
1260  return std::make_shared<ManufacturedSolutionNavah_MS3<dim,nspecies,real>>(nstate);
1261  }else if((solution_type == ManufacturedSolutionEnum::navah_solution_4) && (dim==2) && (nstate==dim+2 || nstate==dim+3)){
1262  return std::make_shared<ManufacturedSolutionNavah_MS4<dim,nspecies,real>>(nstate);
1263  }else if((solution_type == ManufacturedSolutionEnum::navah_solution_5) && (dim==2) && (nstate==dim+2 || nstate==dim+3)){
1264  return std::make_shared<ManufacturedSolutionNavah_MS5<dim,nspecies,real>>(nstate);
1265  }else{
1266  std::cout << "Invalid combination of Manufactured Solution, dimension, and PDE Type." << std::endl;
1267  }
1268  return nullptr;
1269 }
1270 
1271 using FadType = Sacado::Fad::DFad<double>;
1272 using FadFadType = Sacado::Fad::DFad<FadType>;
1273 
1274 static constexpr int dimForwardAD = 1;
1275 static constexpr int dimReverseAD = 1;
1276 
1277 using codi_FadType = codi::RealForwardGen<double, codi::Direction<double,dimForwardAD>>;
1278 //using codi_FadType = codi::RealForwardGen<double, codi::DirectionVar<double>>;
1279 
1280 using codi_JacobianComputationType = codi::RealReverseIndexVec<dimReverseAD>;
1281 using codi_HessianComputationType = codi::RealReversePrimalIndexGen< codi::RealForwardVec<dimForwardAD>,
1282  codi::Direction< codi::RealForwardVec<dimForwardAD>, dimReverseAD>
1283  >;
1284 //using RadFadType = Sacado::Rad::ADvar<FadType>; ///< Sacado AD type that allows 2nd derivatives.
1285 //using RadFadType = codi_JacobianComputationType; ///< Reverse only mode that only allows Jacobian computation.
1288 
1289 // Define a sequence of the types to be used for instantiation
1290 #define POSSIBLE_TYPE (double)(FadType)(RadType)(FadFadType)(RadFadType)
1291 
1292 // Define a macro to instantiate Manufactured Solution Functions for a specific type
1293 #define INSTANTIATE_MANUFACTURED_SOLN(r, data, type) \
1294  template class ManufacturedSolutionFunction<PHILIP_DIM, PHILIP_SPECIES, type>; \
1295  template class ManufacturedSolutionZero<PHILIP_DIM, PHILIP_SPECIES, type>; \
1296  template class ManufacturedSolutionSine<PHILIP_DIM, PHILIP_SPECIES, type>; \
1297  template class ManufacturedSolutionCosine<PHILIP_DIM, PHILIP_SPECIES, type>; \
1298  template class ManufacturedSolutionAdd<PHILIP_DIM, PHILIP_SPECIES, type>; \
1299  template class ManufacturedSolutionExp<PHILIP_DIM, PHILIP_SPECIES, type>; \
1300  template class ManufacturedSolutionPoly<PHILIP_DIM, PHILIP_SPECIES, type>; \
1301  template class ManufacturedSolutionEvenPoly<PHILIP_DIM, PHILIP_SPECIES, type>; \
1302  template class ManufacturedSolutionAtan<PHILIP_DIM, PHILIP_SPECIES, type>; \
1303  template class ManufacturedSolutionBoundaryLayer<PHILIP_DIM, PHILIP_SPECIES, type>; \
1304  template class ManufacturedSolutionSShock<PHILIP_DIM, PHILIP_SPECIES, type>; \
1305  template class ManufacturedSolutionQuadratic<PHILIP_DIM, PHILIP_SPECIES, type>; \
1306  template class ManufacturedSolutionNavahBase<PHILIP_DIM, PHILIP_SPECIES, type>; \
1307  template class ManufacturedSolutionNavah_MS1<PHILIP_DIM, PHILIP_SPECIES, type>; \
1308  template class ManufacturedSolutionNavah_MS2<PHILIP_DIM, PHILIP_SPECIES, type>; \
1309  template class ManufacturedSolutionNavah_MS3<PHILIP_DIM, PHILIP_SPECIES, type>; \
1310  template class ManufacturedSolutionNavah_MS4<PHILIP_DIM, PHILIP_SPECIES, type>; \
1311  template class ManufacturedSolutionNavah_MS5<PHILIP_DIM, PHILIP_SPECIES, type>; \
1312  template class ManufacturedSolutionFactory<PHILIP_DIM, PHILIP_SPECIES, type>;
1313 BOOST_PP_SEQ_FOR_EACH(INSTANTIATE_MANUFACTURED_SOLN, _, POSSIBLE_TYPE)
1314 }
dealii::Tensor< 1, dim, real > gradient_fd(const dealii::Point< dim, real > &point, const unsigned int istate=0) const
Uses finite-difference to evaluate the gradient.
ManufacturedSolutionType
Selects the manufactured solution to be used if use_manufactured_source_term=true.
ManufacturedSolutionFunction(const unsigned int nstate=1)
Constructor that initializes base_values, amplitudes, frequencies.
dealii::Tensor< 1, dim, real > gradient(const dealii::Point< dim, real > &point, const unsigned int istate=0) const override
Gradient.
codi::RealReverseIndexVec< dimReverseAD > codi_JacobianComputationType
Reverse mode type for Jacobian computation using TapeHelper.
Definition: ADTypes.hpp:20
real value(const dealii::Point< dim, real > &point, const unsigned int istate=0) const override
Value.
Sacado::Fad::DFad< FadType > FadFadType
Sacado AD type that allows 2nd derivatives.
Definition: ADTypes.hpp:12
dealii::SymmetricTensor< 2, dim, real > hessian(const dealii::Point< dim, real > &point, const unsigned int istate=0) const override
Hessian.
Sacado::Fad::DFad< double > FadType
Sacado AD type for first derivatives.
Definition: ADTypes.hpp:11
void vector_gradient(const dealii::Point< dim, real > &p, std::vector< dealii::Tensor< 1, dim, real > > &gradients) const
See dealii::Function<dim,real>::vector_gradient.
dealii::SymmetricTensor< 2, dim, real > hessian(const dealii::Point< dim, real > &point, const unsigned int istate=0) const override
Hessian.
real value(const dealii::Point< dim, real > &point, const unsigned int istate=0) const override
Value.
codi_JacobianComputationType RadType
CoDiPaco reverse-AD type for first derivatives.
Definition: ADTypes.hpp:27
real value(const dealii::Point< dim, real > &point, const unsigned int istate=0) const override
Value.
Files for the baseline physics.
Definition: ADTypes.hpp:10
ManufacturedSolutionParam manufactured_solution_param
Associated manufactured solution parameters.
dealii::SymmetricTensor< 2, dim, real > hessian(const dealii::Point< dim, real > &point, const unsigned int istate=0) const override
Hessian of conservative variables.
dealii::SymmetricTensor< 2, dim, real > hessian(const dealii::Point< dim, real > &point, const unsigned int istate=0) const override
Hessian.
real value(const dealii::Point< dim, real > &point, const unsigned int istate=0) const override
Value.
Main parameter class that contains the various other sub-parameter classes.
dealii::Tensor< 1, dim, real > gradient(const dealii::Point< dim, real > &point, const unsigned int istate=0) const override
Gradient.
dealii::Tensor< 1, dim, real > gradient(const dealii::Point< dim, real > &point, const unsigned int istate=0) const override
Gradient.
dealii::SymmetricTensor< 2, dim, real > hessian(const dealii::Point< dim, real > &point, const unsigned int istate=0) const override
Hessian.
ManufacturedConvergenceStudyParam manufactured_convergence_study_param
Contains parameters for manufactured convergence study.
real value(const dealii::Point< dim, real > &point, const unsigned int istate=0) const override
Value of conservative variables.
dealii::Tensor< 1, dim, real > gradient(const dealii::Point< dim, real > &point, const unsigned int istate=0) const override
Gradient.
real value(const dealii::Point< dim, real > &point, const unsigned int istate=0) const override
Value.
static constexpr int dimForwardAD
Size of the forward vector mode for CoDiPack.
Definition: ADTypes.hpp:14
dealii::Tensor< 1, dim, real > gradient(const dealii::Point< dim, real > &point, const unsigned int istate=0) const override
Gradient.
real primitive_value(const dealii::Point< dim, real > &point, const unsigned int istate=0) const
Value of primitive variables.
dealii::SymmetricTensor< 2, dim, real > hessian(const dealii::Point< dim, real > &point, const unsigned int istate=0) const override
Hessian.
dealii::Tensor< 1, dim, real > primitive_gradient(const dealii::Point< dim, real > &point, const unsigned int istate=0) const
Gradient of primitive variables.
dealii::Tensor< 1, dim, real > gradient(const dealii::Point< dim, real > &, const unsigned int=0) const override
Gradient.
dealii::SymmetricTensor< 2, dim, real > hessian(const dealii::Point< dim, real > &, const unsigned int=0) const override
Hessian.
dealii::Tensor< 1, dim, real > gradient(const dealii::Point< dim, real > &point, const unsigned int istate=0) const override
Gradient.
dealii::SymmetricTensor< 2, dim, real > primitive_hessian(const dealii::Point< dim, real > &point, const unsigned int istate=0) const
Hessian of primitive variables.
dealii::SymmetricTensor< 2, dim, real > hessian(const dealii::Point< dim, real > &point, const unsigned int istate=0) const override
Hessian.
real value(const dealii::Point< dim, real > &point, const unsigned int istate=0) const override
Value.
dealii::Tensor< 1, dim, real > gradient(const dealii::Point< dim, real > &point, const unsigned int istate=0) const override
Gradient.
real value(const dealii::Point< dim, real > &point, const unsigned int istate=0) const override
Value.
real value(const dealii::Point< dim, real > &point, const unsigned int istate=0) const override
Value.
std::vector< real > stdvector_values(const dealii::Point< dim, real > &point) const
Same as Function::values() except it returns it into a std::vector format.
real value(const dealii::Point< dim, real > &point, const unsigned int istate=0) const override
Value.
dealii::SymmetricTensor< 2, dim, real > hessian(const dealii::Point< dim, real > &point, const unsigned int istate=0) const override
Hessian.
codi::RealReversePrimalIndexGen< codi::RealForwardVec< dimForwardAD >, codi::Direction< codi::RealForwardVec< dimForwardAD >, dimReverseAD > > codi_HessianComputationType
Nested reverse-forward mode type for Jacobian and Hessian computation using TapeHelper.
Definition: ADTypes.hpp:23
static std::shared_ptr< ManufacturedSolutionFunction< dim, nspecies, real > > create_ManufacturedSolution(Parameters::AllParameters const *const param, int nstate)
Construct Manufactured solution object from global parameter file.
dealii::Tensor< 1, dim, real > gradient(const dealii::Point< dim, real > &point, const unsigned int istate=0) const override
Gradient.
bool isfinite(double value)
< Provide isfinite for double.
real value(const dealii::Point< dim, real > &point, const unsigned int istate=0) const override
Value.
dealii::SymmetricTensor< 2, dim, real > hessian(const dealii::Point< dim, real > &point, const unsigned int istate=0) const override
Hessian.
real value(const dealii::Point< dim, real > &, const unsigned int=0) const override
Value.
ManufacturedSolutionType manufactured_solution_type
Selected ManufacturedSolutionType from the input file.
dealii::SymmetricTensor< 2, dim, real > hessian(const dealii::Point< dim, real > &point, const unsigned int istate=0) const override
Hessian.
static constexpr int dimReverseAD
Size of the reverse vector mode for CoDiPack.
Definition: ADTypes.hpp:15
dealii::Tensor< 1, dim, real > gradient(const dealii::Point< dim, real > &point, const unsigned int istate=0) const override
Gradient.
codi::RealForwardGen< double, codi::Direction< double, dimForwardAD > > codi_FadType
Tapeless forward mode.
Definition: ADTypes.hpp:17
dealii::SymmetricTensor< 2, dim, real > hessian_fd(const dealii::Point< dim, real > &point, const unsigned int istate=0) const
Uses finite-difference to evaluate the hessian.
codi_HessianComputationType RadFadType
Nested reverse-forward mode type for Jacobian and Hessian computation using TapeHelper.
Definition: ADTypes.hpp:28
dealii::Tensor< 1, dim, real > gradient(const dealii::Point< dim, real > &point, const unsigned int istate=0) const override
Gradient.
real value(const dealii::Point< dim, real > &point, const unsigned int istate=0) const override
Value.
dealii::SymmetricTensor< 2, dim, real > hessian(const dealii::Point< dim, real > &point, const unsigned int istate=0) const override
Hessian.
dealii::SymmetricTensor< 2, dim, real > hessian(const dealii::Point< dim, real > &point, const unsigned int istate=0) const override
Hessian.
dealii::Tensor< 1, dim, real > gradient(const dealii::Point< dim, real > &point, const unsigned int istate=0) const override
Gradient of conservative variables.
dealii::Tensor< 1, dim, real > gradient(const dealii::Point< dim, real > &point, const unsigned int istate=0) const override
Gradient.