1 #ifndef __MANUFACTUREDSOLUTIONFUNCTION_H__ 2 #define __MANUFACTUREDSOLUTIONFUNCTION_H__ 4 #include <deal.II/lac/vector.h> 6 #include <deal.II/base/function.h> 12 #include "parameters/all_parameters.h" 21 template <
int dim,
typename real>
30 using dealii::Function<dim,real>::value;
31 using dealii::Function<dim,real>::gradient;
32 using dealii::Function<dim,real>::hessian;
33 using dealii::Function<dim,real>::vector_gradient;
50 virtual real
value (
const dealii::Point<dim,real> &point,
const unsigned int istate = 0)
const = 0;
60 virtual dealii::Tensor<1,dim,real>
gradient (
const dealii::Point<dim,real> &point,
const unsigned int istate = 0)
const = 0;
63 dealii::Tensor<1,dim,real>
gradient_fd (
const dealii::Point<dim,real> &point,
const unsigned int istate = 0)
const;
83 virtual dealii::SymmetricTensor<2,dim,real>
hessian (
const dealii::Point<dim,real> &point,
const unsigned int istate = 0)
const = 0;
86 dealii::SymmetricTensor<2,dim,real>
hessian_fd (
const dealii::Point<dim,real> &point,
const unsigned int istate = 0)
const;
89 std::vector<real>
stdvector_values (
const dealii::Point<dim,real> &point)
const;
94 std::vector<dealii::Tensor<1,dim, real> > &gradients)
const;
138 template <
int dim,
typename real>
148 using dealii::Function<dim,real>::value;
149 using dealii::Function<dim,real>::gradient;
150 using dealii::Function<dim,real>::hessian;
157 real
value (
const dealii::Point<dim,real> &,
const unsigned int = 0)
const override;
159 dealii::Tensor<1,dim,real>
gradient (
const dealii::Point<dim,real> &,
const unsigned int = 0)
const override;
161 dealii::SymmetricTensor<2,dim,real>
hessian (
const dealii::Point<dim,real> &,
const unsigned int = 0)
const override;
165 template <
int dim,
typename real>
175 using dealii::Function<dim,real>::value;
176 using dealii::Function<dim,real>::gradient;
177 using dealii::Function<dim,real>::hessian;
184 real
value (
const dealii::Point<dim,real> &point,
const unsigned int istate = 0)
const override;
186 dealii::Tensor<1,dim,real>
gradient (
const dealii::Point<dim,real> &point,
const unsigned int istate = 0)
const override;
188 dealii::SymmetricTensor<2,dim,real>
hessian (
const dealii::Point<dim,real> &point,
const unsigned int istate = 0)
const override;
192 template <
int dim,
typename real>
202 using dealii::Function<dim,real>::value;
203 using dealii::Function<dim,real>::gradient;
204 using dealii::Function<dim,real>::hessian;
210 real
value (
const dealii::Point<dim,real> &point,
const unsigned int istate = 0)
const override;
212 dealii::Tensor<1,dim,real>
gradient (
const dealii::Point<dim,real> &point,
const unsigned int istate = 0)
const override;
214 dealii::SymmetricTensor<2,dim,real>
hessian (
const dealii::Point<dim,real> &point,
const unsigned int istate = 0)
const override;
218 template <
int dim,
typename real>
228 using dealii::Function<dim,real>::value;
229 using dealii::Function<dim,real>::gradient;
230 using dealii::Function<dim,real>::hessian;
236 real
value (
const dealii::Point<dim,real> &point,
const unsigned int istate = 0)
const override;
238 dealii::Tensor<1,dim,real>
gradient (
const dealii::Point<dim,real> &point,
const unsigned int istate = 0)
const override;
240 dealii::SymmetricTensor<2,dim,real>
hessian (
const dealii::Point<dim,real> &point,
const unsigned int istate = 0)
const override;
244 template <
int dim,
typename real>
254 using dealii::Function<dim,real>::value;
255 using dealii::Function<dim,real>::gradient;
256 using dealii::Function<dim,real>::hessian;
262 real
value (
const dealii::Point<dim,real> &point,
const unsigned int istate = 0)
const override;
264 dealii::Tensor<1,dim,real>
gradient (
const dealii::Point<dim,real> &point,
const unsigned int istate = 0)
const override;
266 dealii::SymmetricTensor<2,dim,real>
hessian (
const dealii::Point<dim,real> &point,
const unsigned int istate = 0)
const override;
270 template <
int dim,
typename real>
280 using dealii::Function<dim,real>::value;
281 using dealii::Function<dim,real>::gradient;
282 using dealii::Function<dim,real>::hessian;
288 real
value (
const dealii::Point<dim,real> &point,
const unsigned int istate = 0)
const override;
290 dealii::Tensor<1,dim,real>
gradient (
const dealii::Point<dim,real> &point,
const unsigned int istate = 0)
const override;
292 dealii::SymmetricTensor<2,dim,real>
hessian (
const dealii::Point<dim,real> &point,
const unsigned int istate = 0)
const override;
296 template <
int dim,
typename real>
306 using dealii::Function<dim,real>::value;
307 using dealii::Function<dim,real>::gradient;
308 using dealii::Function<dim,real>::hessian;
314 real
value (
const dealii::Point<dim,real> &point,
const unsigned int istate = 0)
const override;
316 dealii::Tensor<1,dim,real>
gradient (
const dealii::Point<dim,real> &point,
const unsigned int istate = 0)
const override;
318 dealii::SymmetricTensor<2,dim,real>
hessian (
const dealii::Point<dim,real> &point,
const unsigned int istate = 0)
const override;
322 template <
int dim,
typename real>
332 using dealii::Function<dim,real>::value;
333 using dealii::Function<dim,real>::gradient;
334 using dealii::Function<dim,real>::hessian;
340 n_shocks.resize(dim);
344 for(
unsigned int i = 0; i<dim; ++i){
347 S_j[i].resize(n_shocks[i]);
348 x_j[i].resize(n_shocks[i]);
356 x_j[i][0] = -1/sqrt(2);
357 x_j[i][1] = 1/sqrt(2);
364 real
value (
const dealii::Point<dim,real> &point,
const unsigned int istate = 0)
const override;
366 dealii::Tensor<1,dim,real>
gradient (
const dealii::Point<dim,real> &point,
const unsigned int istate = 0)
const override;
368 dealii::SymmetricTensor<2,dim,real>
hessian (
const dealii::Point<dim,real> &point,
const unsigned int istate = 0)
const override;
372 std::vector<std::vector<real>>
S_j;
373 std::vector<std::vector<real>>
x_j;
377 template <
int dim,
typename real>
387 using dealii::Function<dim,real>::value;
388 using dealii::Function<dim,real>::gradient;
389 using dealii::Function<dim,real>::hessian;
396 for(
int istate = 0; istate < (int)
nstate; ++istate){
397 for (
int d=0; d<dim; d++){
399 epsilon[istate][d] = 0.005;
404 real
value (
const dealii::Point<dim,real> &point,
const unsigned int istate = 0)
const override;
406 dealii::Tensor<1,dim,real>
gradient (
const dealii::Point<dim,real> &point,
const unsigned int istate = 0)
const override;
408 dealii::SymmetricTensor<2,dim,real>
hessian (
const dealii::Point<dim,real> &point,
const unsigned int istate = 0)
const override;
412 std::vector<dealii::Tensor<1,dim,real>>
epsilon;
416 template <
int dim,
typename real>
426 using dealii::Function<dim,real>::value;
427 using dealii::Function<dim,real>::gradient;
428 using dealii::Function<dim,real>::hessian;
446 double scale_atan = 2.0;
453 e = -12.0*scale_atan;
457 real
value(
const dealii::Point<dim,real> &point,
const unsigned int istate = 0)
const override;
459 dealii::Tensor<1,dim,real>
gradient(
const dealii::Point<dim,real> &point,
const unsigned int istate = 0)
const override;
461 dealii::SymmetricTensor<2,dim,real>
hessian(
const dealii::Point<dim,real> &point,
const unsigned int istate = 0)
const override;
466 real a, b, c, d, e,
f;
471 template <
int dim,
typename real>
481 using dealii::Function<dim,real>::value;
482 using dealii::Function<dim,real>::gradient;
483 using dealii::Function<dim,real>::hessian;
490 for(
unsigned int d = 0; d < dim; ++d){
492 alpha_diag[d] = (d+1)*(d+1);
496 real
value (
const dealii::Point<dim,real> &point,
const unsigned int istate = 0)
const override;
498 dealii::Tensor<1,dim,real>
gradient (
const dealii::Point<dim,real> &point,
const unsigned int istate = 0)
const override;
500 dealii::SymmetricTensor<2,dim,real>
hessian (
const dealii::Point<dim,real> &point,
const unsigned int istate = 0)
const override;
510 template <
int dim,
typename real>
520 using dealii::Function<dim,real>::value;
521 using dealii::Function<dim,real>::gradient;
522 using dealii::Function<dim,real>::hessian;
528 real
value (
const dealii::Point<dim,real> &point,
const unsigned int istate = 0)
const override;
530 dealii::Tensor<1,dim,real>
gradient (
const dealii::Point<dim,real> &point,
const unsigned int istate = 0)
const override;
532 dealii::SymmetricTensor<2,dim,real>
hessian (
const dealii::Point<dim,real> &point,
const unsigned int istate = 0)
const override;
537 template <
int dim,
typename real>
547 using dealii::Function<dim,real>::value;
548 using dealii::Function<dim,real>::gradient;
549 using dealii::Function<dim,real>::hessian;
558 const double pi = atan(1)*4.0;
563 real
value (
const dealii::Point<dim,real> &point,
const unsigned int istate = 0)
const override;
565 dealii::Tensor<1,dim,real>
gradient (
const dealii::Point<dim,real> &point,
const unsigned int istate = 0)
const override;
567 dealii::SymmetricTensor<2,dim,real>
hessian (
const dealii::Point<dim,real> &point,
const unsigned int istate = 0)
const override;
569 std::array<dealii::Tensor<1,7,double>,5>
ncm;
571 real primitive_value(
const dealii::Point<dim,real> &point,
const unsigned int istate = 0)
const;
574 dealii::Tensor<1,dim,real> primitive_gradient (
const dealii::Point<dim,real> &point,
const unsigned int istate = 0)
const;
576 dealii::SymmetricTensor<2,dim,real> primitive_hessian (
const dealii::Point<dim,real> &point,
const unsigned int istate = 0)
const;
580 template <
int dim,
typename real>
593 std::array<dealii::Tensor<1,7,double>,5> ncm;
595 ncm[0][0]= 1.0; ncm[0][1]=0.3; ncm[0][2]=-0.2; ncm[0][3]=0.3; ncm[0][4]=1.0; ncm[0][5]=1.0; ncm[0][6]=1.0;
596 ncm[1][0]= 1.0; ncm[1][1]=0.3; ncm[1][2]= 0.3; ncm[1][3]=0.3; ncm[1][4]=3.0; ncm[1][5]=1.0; ncm[1][6]=1.0;
597 ncm[2][0]= 1.0; ncm[2][1]=0.3; ncm[2][2]= 0.3; ncm[2][3]=0.3; ncm[2][4]=1.0; ncm[2][5]=1.0; ncm[2][6]=1.0;
598 ncm[3][0]=18.0; ncm[3][1]=5.0; ncm[3][2]= 5.0; ncm[3][3]=0.5; ncm[3][4]=2.0; ncm[3][5]=1.0; ncm[3][6]=1.0;
599 for(
int j=0; j<7; j++) {
607 template <
int dim,
typename real>
620 std::array<dealii::Tensor<1,7,double>,5> ncm;
622 ncm[0][0]=2.7; ncm[0][1]=0.9; ncm[0][2]=-0.9; ncm[0][3]=1.0; ncm[0][4]=1.5; ncm[0][5]=1.5; ncm[0][6]=1.5;
623 ncm[1][0]=2.0; ncm[1][1]=0.7; ncm[1][2]= 0.7; ncm[1][3]=0.4; ncm[1][4]=1.0; ncm[1][5]=1.0; ncm[1][6]=1.0;
624 ncm[2][0]=2.0; ncm[2][1]=0.4; ncm[2][2]= 0.4; ncm[2][3]=0.4; ncm[2][4]=1.0; ncm[2][5]=1.0; ncm[2][6]=1.0;
625 ncm[3][0]=2.0; ncm[3][1]=1.0; ncm[3][2]= 1.0; ncm[3][3]=0.5; ncm[3][4]=1.0; ncm[3][5]=1.0; ncm[3][6]=1.5;
626 for(
int j=0; j<7; j++) {
634 template <
int dim,
typename real>
647 std::array<dealii::Tensor<1,7,double>,5> ncm;
649 ncm[0][0]= 1.0; ncm[0][1]=0.1; ncm[0][2]=-0.2; ncm[0][3]=0.1; ncm[0][4]=1.0; ncm[0][5]=1.0; ncm[0][6]=1.0;
650 ncm[1][0]= 2.0; ncm[1][1]=0.3; ncm[1][2]= 0.3; ncm[1][3]=0.3; ncm[1][4]=3.0; ncm[1][5]=1.0; ncm[1][6]=1.0;
651 ncm[2][0]= 2.0; ncm[2][1]=0.3; ncm[2][2]= 0.3; ncm[2][3]=0.3; ncm[2][4]=1.0; ncm[2][5]=1.0; ncm[2][6]=1.0;
652 ncm[3][0]=10.0; ncm[3][1]=1.0; ncm[3][2]= 1.0; ncm[3][3]=0.5; ncm[3][4]=2.0; ncm[3][5]=1.0; ncm[3][6]=1.0;
653 for(
int j=0; j<7; j++) {
661 template <
int dim,
typename real>
674 std::array<dealii::Tensor<1,7,double>,5> ncm;
676 ncm[0][0]= 1.0; ncm[0][1]= 0.1; ncm[0][2]= -0.2; ncm[0][3]= 0.1; ncm[0][4]=1.0; ncm[0][5]=1.0; ncm[0][6]=1.0;
677 ncm[1][0]= 2.0; ncm[1][1]= 0.3; ncm[1][2]= 0.3; ncm[1][3]= 0.3; ncm[1][4]=3.0; ncm[1][5]=1.0; ncm[1][6]=1.0;
678 ncm[2][0]= 2.0; ncm[2][1]= 0.3; ncm[2][2]= 0.3; ncm[2][3]= 0.3; ncm[2][4]=1.0; ncm[2][5]=1.0; ncm[2][6]=1.0;
679 ncm[3][0]=10.0; ncm[3][1]= 1.0; ncm[3][2]= 1.0; ncm[3][3]= 0.5; ncm[3][4]=2.0; ncm[3][5]=1.0; ncm[3][6]=1.0;
680 ncm[4][0]= 0.6; ncm[4][1]=-0.03; ncm[4][2]=-0.02; ncm[4][3]=0.02; ncm[4][4]=2.0; ncm[4][5]=1.0; ncm[4][6]=3.0;
686 template <
int dim,
typename real>
699 std::array<dealii::Tensor<1,7,double>,5> ncm;
701 ncm[0][0]= 1.0; ncm[0][1]= 0.1; ncm[0][2]=-0.2; ncm[0][3]=0.1; ncm[0][4]=1.0; ncm[0][5]=1.0; ncm[0][6]=1.0;
702 ncm[1][0]= 2.0; ncm[1][1]= 0.3; ncm[1][2]= 0.3; ncm[1][3]=0.3; ncm[1][4]=3.0; ncm[1][5]=1.0; ncm[1][6]=1.0;
703 ncm[2][0]= 2.0; ncm[2][1]= 0.3; ncm[2][2]= 0.3; ncm[2][3]=0.3; ncm[2][4]=1.0; ncm[2][5]=1.0; ncm[2][6]=1.0;
704 ncm[3][0]=10.0; ncm[3][1]= 1.0; ncm[3][2]= 1.0; ncm[3][3]=0.5; ncm[3][4]=2.0; ncm[3][5]=1.0; ncm[3][6]=1.0;
705 ncm[4][0]=-6.0; ncm[4][1]=-0.3; ncm[4][2]=-0.2; ncm[4][3]=0.2; ncm[4][4]=2.0; ncm[4][5]=1.0; ncm[4][6]=3.0;
722 template <
int dim,
typename real>
729 static std::shared_ptr< ManufacturedSolutionFunction<dim,real> >
730 create_ManufacturedSolution(
735 static std::shared_ptr< ManufacturedSolutionFunction<dim,real> >
736 create_ManufacturedSolution(
744 #endif //__MANUFACTUREDSOLUTIONFUNCTION_H__ std::vector< double > amplitudes
ManufacturedSolutionType
Selects the manufactured solution to be used if use_manufactured_source_term=true.
Sum of even order polynomial functions manufactured solution.
virtual dealii::Tensor< 1, dim, real > gradient(const dealii::Point< dim, real > &point, const unsigned int istate=0) const =0
Gradient of the exact manufactured solution.
ManufacturedSolutionSShock(const unsigned int nstate=1)
Constructor.
Navah and Nadarajah free flows manufactured solution: MS5.
std::vector< std::vector< real > > S_j
shock strengths
std::vector< dealii::Tensor< 1, dim, real > > epsilon
Boundary layer strength parameter.
ManufacturedSolutionQuadratic(const unsigned int nstate=1)
Constructor.
virtual real value(const dealii::Point< dim, real > &point, const unsigned int istate=0) const =0
Manufactured solution exact value.
ManufacturedSolutionNavah_MS2(const unsigned int nstate=4)
Manufactured solution used for grid studies to check convergence orders.
ManufacturedSolutionExp(const unsigned int nstate=1)
Constructor.
ManufacturedSolutionSine(const unsigned int nstate=1)
Constructor.
Files for the baseline physics.
Manufactured solution function factory.
ManufacturedSolutionEvenPoly(const unsigned int nstate=1)
Constructor.
std::array< dealii::Tensor< 1, 7, double >, 5 > ncm
Navah Coefficient Matrix (ncm); placeholder.
ManufacturedSolutionZero(const unsigned int nstate=1)
Constructor.
Main parameter class that contains the various other sub-parameter classes.
std::vector< double > base_values
std::array< real, dim > alpha_diag
Diagonal hessian component scaling.
Sum of polynomial manufactured solution.
ManufacturedSolutionPoly(const unsigned int nstate=1)
Constructor.
Scalar boundary layer manufactured solution.
ManufacturedSolutionAtan(const unsigned int nstate=1)
Constructor.
Product of cosine waves manufactured solution.
Navah and Nadarajah free flows manufactured solution: MS3.
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.
std::vector< std::vector< real > > x_j
shock positions
Sum of exponential functions manufactured solution.
ManufacturedSolutionNavah_MS1(const unsigned int nstate=4)
ManufacturedSolutionNavah_MS4(const unsigned int nstate=4)
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.
virtual dealii::SymmetricTensor< 2, dim, real > hessian(const dealii::Point< dim, real > &point, const unsigned int istate=0) const =0
Hessian of the exact manufactured solution.
Navah and Nadarajah free flows manufactured solution: MS1.
Product of sine waves manufactured solution.
std::vector< unsigned int > n_shocks
number of shocks
ManufacturedSolutionExample(const unsigned int nstate=1)
Constructor.
ManufacturedSolutionCosine(const unsigned int nstate=1)
Constructor.
Navah and Nadarajah free flows manufactured solution: MS4.
Hump manufactured solution based on arctangent functions.
Sum of sine waves manufactured solution.
ManufacturedSolutionBoundaryLayer(const unsigned int nstate=1)
Constructor.
std::vector< dealii::Tensor< 1, dim, real > > frequencies
Product of zero waves manufactured solution.
ManufacturedSolutionNavah_MS5(const unsigned int nstate=4)
const unsigned int nstate
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.
ManufacturedSolutionNavah_MS3(const unsigned int nstate=4)
ManufacturedSolutionNavahBase(const unsigned int nstate=4)
Constructor.
ManufacturedSolutionFunction(const unsigned int nstate=1)
Constructor that initializes base_values, amplitudes, frequencies.
Navah and Nadarajah free flows manufactured solution: MS2.
ManufacturedSolutionAdd(const unsigned int nstate=1)
Constructor.
S-Shock manufactured solution.
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.
Quadratic function manufactured solution.