1 #include <CoDiPack/include/codi.hpp> 3 #include <deal.II/base/function.h> 4 #include <deal.II/base/function.templates.h> 5 #include <deal.II/base/function_time.templates.h> 6 #include <boost/preprocessor/seq/for_each.hpp> 8 #include "manufactured_solution.h" 10 template class dealii::FunctionTime<Sacado::Fad::DFad<double>>;
11 template class dealii::Function<PHILIP_DIM,Sacado::Fad::DFad<double>>;
18 return std::isfinite(static_cast<double>(value));
24 return std::isfinite(static_cast<double>(value.val()));
28 bool isfinite(Sacado::Fad::DFad<Sacado::Fad::DFad<double>> value)
30 return std::isfinite(static_cast<double>(value.val().val()));
34 bool isfinite(Sacado::Rad::ADvar<Sacado::Fad::DFad<double>> value)
36 return std::isfinite(static_cast<double>(value.val().val()));
39 template <
int dim,
int nspecies,
typename real>
41 ::value (
const dealii::Point<dim,real> &,
const unsigned int )
const 47 template <
int dim,
int nspecies,
typename real>
49 ::value (
const dealii::Point<dim,real> &point,
const unsigned int istate)
const 51 real value = this->amplitudes[istate];
52 for (
int d=0; d<dim; d++) {
53 value *= sin( this->frequencies[istate][d] * point[d] );
56 value += this->base_values[istate];
60 template <
int dim,
int nspecies,
typename real>
62 ::value (
const dealii::Point<dim,real> &point,
const unsigned int istate)
const 65 for (
int d=0; d<dim; d++) {
66 value += this->amplitudes[istate]*sin( this->frequencies[istate][d] * point[d] );
69 value += this->base_values[istate];
73 template <
int dim,
int nspecies,
typename real>
75 ::value (
const dealii::Point<dim,real> &point,
const unsigned int istate)
const 77 real value = this->amplitudes[istate];
78 for (
int d=0; d<dim; d++) {
79 value *= cos( this->frequencies[istate][d] * point[d] );
82 value += this->base_values[istate];
86 template <
int dim,
int nspecies,
typename real>
88 ::value (
const dealii::Point<dim,real> &point,
const unsigned int istate)
const 91 for (
int d=0; d<dim; d++) {
92 value += exp( point[d] );
95 value += this->base_values[istate];
99 template <
int dim,
int nspecies,
typename real>
101 ::value (
const dealii::Point<dim,real> &point,
const unsigned int istate)
const 104 const double poly_max = 7;
105 for (
int d=0; d<dim; d++) {
106 value += pow(point[d] + 0.5, poly_max);
108 value += this->base_values[istate];
112 template <
int dim,
int nspecies,
typename real>
114 ::value (
const dealii::Point<dim,real> &point,
const unsigned int istate)
const 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);
121 value += this->base_values[istate];
125 template <
int dim,
int nspecies,
typename real>
127 ::value(
const dealii::Point<dim,real> &point,
const unsigned int )
const 130 for(
unsigned int i = 0; i < dim; ++i){
133 for(
unsigned int j = 0; j < n_shocks[i]; ++j){
135 val_dim += atan(S_j[i][j]*(x-x_j[i][j]));
142 template <
int dim,
int nspecies,
typename real>
144 ::value(
const dealii::Point<dim,real> &point,
const unsigned int istate)
const 147 for(
unsigned int d = 0; d < dim; ++d){
149 val *= x + (exp(x/epsilon[istate][d])-1.0)/(1.0-exp(1.0/epsilon[istate][d]));
154 template <
int dim,
int nspecies,
typename real>
156 ::value(
const dealii::Point<dim,real> &point,
const unsigned int )
const 160 const real x = point[0], y = point[1];
163 val = a*tanh(b*sin(c*y + d) + e*x + f);
168 template <
int dim,
int nspecies,
typename real>
170 ::value(
const dealii::Point<dim,real> &point,
const unsigned int )
const 174 for(
unsigned int d = 0; d < dim; ++d){
176 val += alpha_diag[d]*x*x;
181 template <
int dim,
int nspecies,
typename real>
183 ::value (
const dealii::Point<dim,real> &point,
const unsigned int istate)
const 186 for (
int d=0; d<dim; d++) {
187 value += exp( point[d] ) + sin(point[d] );
190 value += this->base_values[istate];
194 template <
int dim,
int nspecies,
typename real>
199 if constexpr(dim == 2) {
200 const real x = point[0], y = point[1];
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);
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);
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);
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);
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);
228 template <
int dim,
int nspecies,
typename real>
230 ::value(
const dealii::Point<dim,real> &point,
const unsigned int istate)
const 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);
242 if(istate==0) value = density;
244 if(istate==1) value = density*x_velocity;
246 if(istate==2) value = density*y_velocity;
248 if(istate==3) value = pressure/(1.4-1.0) + 0.5*density*(x_velocity*x_velocity + y_velocity*y_velocity);
250 if(istate==4) value = density*turbulent_working_variable;
255 template <
int dim,
int nspecies,
typename real>
257 ::gradient (
const dealii::Point<dim,real> &,
const unsigned int )
const 259 dealii::Tensor<1,dim,real> gradient;
260 for(
unsigned int i = 0; i < dim; i++){
266 template <
int dim,
int nspecies,
typename real>
268 ::gradient (
const dealii::Point<dim,real> &point,
const unsigned int istate)
const 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 );
278 assert(
isfinite(gradient[dim_deri]));
281 const real A = this->amplitudes[istate];
282 const dealii::Tensor<1,dim,real> f = this->frequencies[istate];
284 const real fx = f[0]*point[0];
285 gradient[0] = A*f[0]*cos(fx);
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);
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);
304 template <
int dim,
int nspecies,
typename real>
306 ::gradient (
const dealii::Point<dim,real> &point,
const unsigned int istate)
const 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];
312 const real fx = f[0]*point[0];
313 gradient[0] = A*f[0]*cos(fx);
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);
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);
332 template <
int dim,
int nspecies,
typename real>
334 ::gradient (
const dealii::Point<dim,real> &point,
const unsigned int istate)
const 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];
340 const real fx = f[0]*point[0];
341 gradient[0] = -A*f[0]*sin(fx);
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);
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);
360 template <
int dim,
int nspecies,
typename real>
362 ::gradient (
const dealii::Point<dim,real> &point,
const unsigned int )
const 364 dealii::Tensor<1,dim,real> gradient;
366 gradient[0] = exp(point[0]);
369 gradient[0] = exp(point[0]);
370 gradient[1] = exp(point[1]);
373 gradient[0] = exp(point[0]);
374 gradient[1] = exp(point[1]);
375 gradient[2] = exp(point[2]);
380 template <
int dim,
int nspecies,
typename real>
382 ::gradient (
const dealii::Point<dim,real> &point,
const unsigned int )
const 384 dealii::Tensor<1,dim,real> gradient;
385 const double poly_max = 7;
387 gradient[0] = poly_max*pow(point[0] + 0.5, poly_max-1);
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);
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);
401 template <
int dim,
int nspecies,
typename real>
403 ::gradient (
const dealii::Point<dim,real> &point,
const unsigned int )
const 405 dealii::Tensor<1,dim,real> gradient;
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);
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);
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);
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;
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;
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;
427 template <
int dim,
int nspecies,
typename real>
429 ::gradient(
const dealii::Point<dim,real> &point,
const unsigned int )
const 431 dealii::Tensor<1,dim,real> gradient;
432 for(
unsigned int k = 0; k < dim; ++k){
435 for(
unsigned int i = 0; i < dim; ++i){
438 for(
unsigned int j = 0; j < n_shocks[i]; ++j){
441 real coeff = S_j[i][j]*(x-x_j[i][j]);
442 val_dim += S_j[i][j]/(pow(coeff,2)+1);
445 val_dim += atan(S_j[i][j]*(x-x_j[i][j]));
450 gradient[k] = grad_dim;
455 template <
int dim,
int nspecies,
typename real>
457 ::gradient(
const dealii::Point<dim,real> &point,
const unsigned int istate)
const 459 dealii::Tensor<1,dim,real> gradient;
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])));
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])));
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])));
484 template <
int dim,
int nspecies,
typename real>
486 ::gradient(
const dealii::Point<dim,real> &point,
const unsigned int )
const 488 dealii::Tensor<1,dim,real> gradient;
490 const real x = point[0], y = point[1];
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;
503 template <
int dim,
int nspecies,
typename real>
505 ::gradient(
const dealii::Point<dim,real> &point,
const unsigned int )
const 507 dealii::Tensor<1,dim,real> gradient;
508 for(
unsigned int d = 0; d < dim; ++d){
510 const real x = point[d];
511 gradient[d] = 2*alpha_diag[d]*x;
516 template <
int dim,
int nspecies,
typename real>
518 ::gradient(
const dealii::Point<dim,real> &point,
const unsigned int )
const 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]);
527 template <
int dim,
int nspecies,
typename real>
531 dealii::Tensor<1,dim,real> gradient;
534 const real x = point[0], y = point[1];
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);
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);
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);
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);
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);
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);
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);
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);
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);
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);
565 template <
int dim,
int nspecies,
typename real>
567 ::gradient (
const dealii::Point<dim,real> &point,
const unsigned int istate)
const 569 dealii::Tensor<1,dim,real> gradient;
572 const real rho = primitive_value(point,0);
573 const real u = primitive_value(point,1);
574 const real v = primitive_value(point,2);
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);
584 for(
int d=0; d<dim; d++) {
585 gradient[d] = rho_grad[d];
590 for(
int d=0; d<dim; d++) {
591 gradient[d] = u*rho_grad[d] + rho*u_grad[d];
596 for(
int d=0; d<dim; d++) {
597 gradient[d] = v*rho_grad[d] + rho*v_grad[d];
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]);
608 const real twv = primitive_value(point,4);
609 const dealii::Tensor<1,dim,real> twv_grad = primitive_gradient(point,4);
610 for(
int d=0; d<dim; d++) {
611 gradient[d] = twv*rho_grad[d] + rho*twv_grad[d];
618 template <
int dim,
int nspecies,
typename real>
620 ::hessian (
const dealii::Point<dim,real> &,
const unsigned int )
const 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++){
631 template <
int dim,
int nspecies,
typename real>
633 ::hessian (
const dealii::Point<dim,real> &point,
const unsigned int istate)
const 635 dealii::SymmetricTensor<2,dim,real> hessian;
637 const real A = this->amplitudes[istate];
638 const dealii::Tensor<1,dim,real> f = this->frequencies[istate];
640 const real fx = f[0]*point[0];
641 hessian[0][0] = -A*f[0]*f[0]*sin(fx);
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);
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);
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);
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);
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);
671 template <
int dim,
int nspecies,
typename real>
673 ::hessian (
const dealii::Point<dim,real> &point,
const unsigned int istate)
const 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];
679 const real fx = f[0]*point[0];
680 hessian[0][0] = -A*f[0]*f[0]*sin(fx);
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);
689 hessian[1][1] = -A*f[1]*f[1]*sin(fy);
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);
700 hessian[1][1] = -A*f[1]*f[1]*sin(fy);
705 hessian[2][2] = -A*f[2]*f[2]*sin(fz);
710 template <
int dim,
int nspecies,
typename real>
712 ::hessian (
const dealii::Point<dim,real> &point,
const unsigned int istate)
const 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];
718 const real fx = f[0]*point[0];
719 hessian[0][0] = -A*f[0]*f[0]*cos(fx);
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);
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);
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);
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);
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);
749 template <
int dim,
int nspecies,
typename real>
751 ::hessian (
const dealii::Point<dim,real> &point,
const unsigned int )
const 753 dealii::SymmetricTensor<2,dim,real> hessian;
755 hessian[0][0] = exp(point[0]);
758 hessian[0][0] = exp(point[0]);
762 hessian[1][1] = exp(point[1]);
765 hessian[0][0] = exp(point[0]);
770 hessian[1][1] = exp(point[1]);
775 hessian[2][2] = exp(point[2]);
780 template <
int dim,
int nspecies,
typename real>
782 ::hessian (
const dealii::Point<dim,real> &point,
const unsigned int )
const 784 dealii::SymmetricTensor<2,dim,real> hessian;
785 const double poly_max = 7;
787 hessian[0][0] = poly_max*poly_max*pow(point[0] + 0.5, poly_max-2);
790 hessian[0][0] = poly_max*poly_max*pow(point[0] + 0.5, poly_max-2);
794 hessian[1][1] = poly_max*poly_max*pow(point[1] + 0.5, poly_max-2);
797 hessian[0][0] = poly_max*poly_max*pow(point[0] + 0.5, poly_max-2);
802 hessian[1][1] = poly_max*poly_max*pow(point[1] + 0.5, poly_max-2);
807 hessian[2][2] = poly_max*poly_max*pow(point[2] + 0.5, poly_max-2);
812 template <
int dim,
int nspecies,
typename real>
814 ::hessian (
const dealii::Point<dim,real> &point,
const unsigned int )
const 816 dealii::SymmetricTensor<2,dim,real> hessian;
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);
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);
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);
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);
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);
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);
838 template <
int dim,
int nspecies,
typename real>
840 ::hessian(
const dealii::Point<dim,real> &point,
const unsigned int )
const 842 dealii::SymmetricTensor<2,dim,real> hes;
844 for(
unsigned int k1 = 0; k1 < dim; ++k1){
846 for(
unsigned int k2 = 0; k2 < dim; ++k2){
849 for(
unsigned int i = 0; i < dim; ++i){
852 for(
unsigned int j = 0; j < n_shocks[i]; ++j){
853 if(i == k1 && i == k2){
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){
859 real coeff = S_j[i][j]*(x-x_j[i][j]);
860 val_dim += S_j[i][j]/(pow(coeff,2)+1);
863 val_dim += atan(S_j[i][j]*(x-x_j[i][j]));
868 hes[k1][k2] = hes_dim;
875 template <
int dim,
int nspecies,
typename real>
877 ::hessian(
const dealii::Point<dim,real> &point,
const unsigned int istate)
const 879 dealii::SymmetricTensor<2,dim,real> hessian;
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])));
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])));
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])));
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])));
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])));
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])));
924 template <
int dim,
int nspecies,
typename real>
926 ::hessian(
const dealii::Point<dim,real> &point,
const unsigned int )
const 928 dealii::SymmetricTensor<2,dim,real> hessian;
930 const real x = point[0], y = point[1];
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);
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;
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));
956 template <
int dim,
int nspecies,
typename real>
958 ::hessian(
const dealii::Point<dim,real> &,
const unsigned int )
const 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){
964 hessian[i][i] = 2*alpha_diag[i];
973 template <
int dim,
int nspecies,
typename real>
975 ::hessian (
const dealii::Point<dim,real> &point,
const unsigned int )
const 977 dealii::SymmetricTensor<2,dim,real> hessian;
978 for(
int idim=0; idim<dim; idim++){
979 for(
int jdim=0; jdim<dim; jdim++){
981 hessian[idim][jdim] = exp(point[idim]) - sin(point[idim]);
983 hessian[idim][jdim] = 0.0;
989 template <
int dim,
int nspecies,
typename real>
993 dealii::SymmetricTensor<2,dim,real> hessian;
996 const real x = point[0], y = point[1];
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);
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);
1002 hessian[1][0] = hessian[0][1];
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);
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);
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);
1009 hessian[1][0] = hessian[0][1];
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);
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);
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);
1016 hessian[1][0] = hessian[0][1];
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);
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);
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);
1023 hessian[1][0] = hessian[0][1];
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);
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);
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);
1030 hessian[1][0] = hessian[0][1];
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);
1037 template <
int dim,
int nspecies,
typename real>
1039 ::hessian (
const dealii::Point<dim,real> &point,
const unsigned int istate)
const 1041 dealii::SymmetricTensor<2,dim,real> hessian;
1044 const real rho = primitive_value(point,0);
1045 const real u = primitive_value(point,1);
1046 const real v = primitive_value(point,2);
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);
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);
1060 for(
int i=0; i<dim; i++) {
1061 for(
int j=0; j<dim; j++) {
1062 hessian[i][j] = rho_hess[i][j];
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];
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];
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]);
1094 const real twv = primitive_value(point,4);
1095 const dealii::Tensor<1,dim,real> twv_grad = primitive_gradient(point,4);
1096 const dealii::SymmetricTensor<2,dim,real> twv_hess = primitive_hessian(point,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];
1107 template <
int dim,
int nspecies,
typename real>
1111 dealii::Function<dim,real>(nstate)
1113 , base_values(nstate)
1114 , amplitudes(nstate)
1115 , frequencies(nstate)
1117 const double pi = atan(1)*4.0;
1120 for (
int s=0; s<(int)nstate; s++) {
1121 base_values[s] = 1+(s+1.0)/nstate;
1123 base_values[nstate-1] = 10;
1125 base_values[dim+1] = 10;
1128 if (nspecies > 1 && s > dim+1) {
1129 base_values[s] /= pow(4.0, s-dim-1);
1132 amplitudes[s] = 0.2*base_values[s]*sin((static_cast<double>(nstate)-s)/nstate);
1133 for (
int d=0; d<dim; d++) {
1135 frequencies[s][d] = 2.0 + sin(0.1+s*0.5+d*0.2) * pi / 2.0;
1138 if (nspecies > 1 && s > dim+1) {
1139 frequencies[s][d] /= pow(4.0, s-dim-1);
1146 template <
int dim,
int nspecies,
typename real>
1148 ::gradient_fd (
const dealii::Point<dim,real> &point,
const unsigned int istate)
const 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);
1164 template <
int dim,
int nspecies,
typename real>
1166 ::hessian_fd (
const dealii::Point<dim,real> &point,
const unsigned int istate)
const 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;
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);
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);
1187 hessian[d1][d2] = (valpp - valpm - valmp + valmm) / (4*eps*eps);
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 1199 for (
unsigned int i = 0; i < nstate; ++i)
1200 gradients[i] = gradient(p, i);
1204 template <
int dim,
int nspecies,
typename real>
1208 std::vector<real> values(nstate);
1209 for (
unsigned int s=0; s<nstate; s++) { values[s] = value(point, s); }
1213 template <
int dim,
int nspecies,
typename real>
1214 std::shared_ptr< ManufacturedSolutionFunction<dim,nspecies,real> >
1222 return create_ManufacturedSolution(solution_type, nstate);
1225 template <
int dim,
int nspecies,
typename real>
1226 std::shared_ptr< ManufacturedSolutionFunction<dim,nspecies,real> >
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);
1266 std::cout <<
"Invalid combination of Manufactured Solution, dimension, and PDE Type." << std::endl;
1271 using FadType = Sacado::Fad::DFad<double>;
1272 using FadFadType = Sacado::Fad::DFad<FadType>;
1277 using codi_FadType = codi::RealForwardGen<double, codi::Direction<double,dimForwardAD>>;
1282 codi::Direction< codi::RealForwardVec<dimForwardAD>, dimReverseAD>
1290 #define POSSIBLE_TYPE (double)(FadType)(RadType)(FadFadType)(RadFadType) 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)
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.
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.
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.
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.
real value(const dealii::Point< dim, real > &point, const unsigned int istate=0) const override
Value.
Files for the baseline physics.
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.
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.
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.
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.
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.
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.