9 #include <deal.II/distributed/solution_transfer.h> 11 #include "testing/tests.h" 14 #include <deal.II/base/parameter_handler.h> 15 #include <deal.II/base/tensor.h> 16 #include <deal.II/numerics/vector_tools.h> 18 #include <deal.II/grid/grid_generator.h> 19 #include <deal.II/grid/grid_refinement.h> 20 #include <deal.II/grid/grid_tools.h> 21 #include <deal.II/grid/grid_out.h> 22 #include <deal.II/grid/grid_in.h> 24 #include <deal.II/dofs/dof_handler.h> 25 #include <deal.II/dofs/dof_tools.h> 26 #include <deal.II/dofs/dof_renumbering.h> 28 #include <deal.II/dofs/dof_accessor.h> 30 #include <deal.II/lac/vector.h> 31 #include <deal.II/lac/dynamic_sparsity_pattern.h> 32 #include <deal.II/lac/sparse_matrix.h> 34 #include <deal.II/meshworker/dof_info.h> 38 #include <deal.II/fe/mapping_q.h> 39 #include <deal.II/grid/manifold_lib.h> 40 #include <deal.II/numerics/data_out.h> 41 #include <deal.II/numerics/data_out_dof_data.h> 42 #include <deal.II/numerics/vector_tools.h> 43 #include <deal.II/numerics/vector_tools.templates.h> 45 #include "dg/dg_base.hpp" 46 #include "dg/dg_factory.hpp" 47 #include "operators/operators.h" 48 #include "parameters/all_parameters.h" 49 #include "parameters/parameters.h" 52 const double TOLERANCE = 1E-6;
57 class CurvManifold:
public dealii::ChartManifold<dim,dim,dim> {
58 virtual dealii::Point<dim> pull_back(
const dealii::Point<dim> &space_point)
const override;
59 virtual dealii::Point<dim> push_forward(
const dealii::Point<dim> &chart_point)
const override;
60 virtual dealii::DerivativeForm<1,dim,dim> push_forward_gradient(
const dealii::Point<dim> &chart_point)
const override;
62 virtual std::unique_ptr<dealii::Manifold<dim,dim> > clone()
const override;
69 const double pi = atan(1)*4.0;
70 dealii::Point<dim> x_ref;
71 dealii::Point<dim> x_phys;
72 for(
int idim=0; idim<dim; idim++){
73 x_ref[idim] = space_point[idim];
74 x_phys[idim] = space_point[idim];
76 dealii::Vector<double>
function(dim);
77 dealii::FullMatrix<double> derivative(dim);
78 double beta =1.0/10.0;
79 double alpha =1.0/10.0;
83 function[0] = x_ref[0] - x_phys[0] +beta*std::cos(pi/2.0*x_ref[0])*std::cos(3.0*pi/2.0*x_ref[1]);
84 function[1] = x_ref[1] - x_phys[1] +beta*std::sin(2.0*pi*(x_ref[0]))*std::cos(pi/2.0*x_ref[1]);
87 function[0] = x_ref[0] - x_phys[0] +alpha*(std::cos(pi * x_ref[2]) + std::cos(pi * x_ref[1]));
88 function[1] = x_ref[1] - x_phys[1] +alpha*exp(1.0-x_ref[1])*(std::sin(pi * x_ref[0]) + std::sin(pi* x_ref[2]));
89 function[2] = x_ref[2] - x_phys[2] +1.0/20.0*( std::sin(2.0 * pi * x_ref[0]) + std::sin(2.0 * pi * x_ref[1]));
92 derivative[0][0] = 1.0 - beta* pi/2.0 * std::sin(pi/2.0*x_ref[0])*std::cos(3.0*pi/2.0*x_ref[1]);
93 derivative[0][1] = - beta*3.0 *pi/2.0 * std::cos(pi/2.0*x_ref[0])*std::sin(3.0*pi/2.0*x_ref[1]);
95 derivative[1][0] = beta*2.0*pi*std::cos(2.0*pi*(x_ref[0]))*std::cos(pi/2.0*x_ref[1]);
96 derivative[1][1] = 1.0 -beta*pi/2.0*std::sin(2.0*pi*(x_ref[0]))*std::sin(pi/2.0*x_ref[1]);
99 derivative[0][0] = 1.0;
100 derivative[0][1] = - alpha*pi*std::sin(pi*x_ref[1]);
101 derivative[0][2] = - alpha*pi*std::sin(pi*x_ref[2]);
103 derivative[1][0] = alpha*pi*exp(1.0-x_ref[1])*std::cos(pi*x_ref[0]);
104 derivative[1][1] = 1.0 -alpha*exp(1.0-x_ref[1])*(std::sin(pi*x_ref[0])+std::sin(pi*x_ref[2]));
105 derivative[1][2] = alpha*pi*exp(1.0-x_ref[1])*std::cos(pi*x_ref[2]);
106 derivative[2][0] = 1.0/10.0*pi*std::cos(2.0*pi*x_ref[0]);
107 derivative[2][1] = 1.0/10.0*pi*std::cos(2.0*pi*x_ref[1]);
108 derivative[2][2] = 1.0;
111 dealii::FullMatrix<double> Jacobian_inv(dim);
112 Jacobian_inv.invert(derivative);
113 dealii::Vector<double> Newton_Step(dim);
114 Jacobian_inv.vmult(Newton_Step,
function);
115 for(
int idim=0; idim<dim; idim++){
116 x_ref[idim] -= Newton_Step[idim];
119 for(
int idim=0; idim<dim; idim++){
120 if(std::abs(
function[idim]) < 1e-15)
126 std::vector<double> function_check(dim);
128 function_check[0] = x_ref[0] + beta*std::cos(pi/2.0*x_ref[0])*std::cos(3.0*pi/2.0*x_ref[1]);
129 function_check[1] = x_ref[1] + beta*std::sin(2.0*pi*(x_ref[0]))*std::cos(pi/2.0*x_ref[1]);
132 function_check[0] = x_ref[0] +alpha*(std::cos(pi * x_ref[2]) + std::cos(pi * x_ref[1]));
133 function_check[1] = x_ref[1] +alpha*exp(1.0-x_ref[1])*(std::sin(pi * x_ref[0]) + std::sin(pi* x_ref[2]));
134 function_check[2] = x_ref[2] +1.0/20.0*( std::sin(2.0 * pi * x_ref[0]) + std::sin(2.0 * pi * x_ref[1]));
136 std::vector<double> error(dim);
137 for(
int idim=0; idim<dim; idim++)
138 error[idim] = std::abs(function_check[idim] - x_phys[idim]);
139 if (error[0] > 1e-13) {
140 std::cout <<
"Large error " << error[0] << std::endl;
141 for(
int idim=0;idim<dim; idim++)
142 std::cout <<
"dim " << idim <<
" xref " << x_ref[idim] <<
" x_phys " << x_phys[idim] <<
" function Check " << function_check[idim] <<
" Error " << error[idim] <<
" Flag " << flag << std::endl;
151 const double pi = atan(1)*4.0;
153 dealii::Point<dim> x_ref;
154 dealii::Point<dim> x_phys;
155 for(
int idim=0; idim<dim; idim++)
156 x_ref[idim] = chart_point[idim];
157 double beta = 1.0/10.0;
158 double alpha = 1.0/10.0;
160 x_phys[0] = x_ref[0] + beta*std::cos(pi/2.0*x_ref[0])*std::cos(3.0*pi/2.0*x_ref[1]);
161 x_phys[1] = x_ref[1] + beta*std::sin(2.0*pi*(x_ref[0]))*std::cos(pi/2.0*x_ref[1]);
164 x_phys[0] =x_ref[0] + alpha*(std::cos(pi * x_ref[2]) + std::cos(pi * x_ref[1]));
165 x_phys[1] =x_ref[1] + alpha*exp(1.0-x_ref[1])*(std::sin(pi * x_ref[0]) + std::sin(pi* x_ref[2]));
166 x_phys[2] =x_ref[2] + 1.0/20.0*( std::sin(2.0 * pi * x_ref[0]) + std::sin(2.0 * pi * x_ref[1]));
168 return dealii::Point<dim> (x_phys);
174 const double pi = atan(1)*4.0;
175 dealii::DerivativeForm<1, dim, dim> dphys_dref;
176 double beta = 1.0/10.0;
177 double alpha = 1.0/10.0;
178 dealii::Point<dim> x_ref;
179 for(
int idim=0; idim<dim; idim++){
180 x_ref[idim] = chart_point[idim];
184 dphys_dref[0][0] = 1.0 - beta*pi/2.0 * std::sin(pi/2.0*x_ref[0])*std::cos(3.0*pi/2.0*x_ref[1]);
185 dphys_dref[0][1] = - beta*3.0*pi/2.0 * std::cos(pi/2.0*x_ref[0])*std::sin(3.0*pi/2.0*x_ref[1]);
187 dphys_dref[1][0] = beta*2.0*pi*std::cos(2.0*pi*(x_ref[0]))*std::cos(pi/2.0*x_ref[1]);
188 dphys_dref[1][1] = 1.0 -beta*pi/2.0*std::sin(2.0*pi*(x_ref[0]))*std::sin(pi/2.0*x_ref[1]);
191 dphys_dref[0][0] = 1.0;
192 dphys_dref[0][1] = - alpha*pi*std::sin(pi*x_ref[1]);
193 dphys_dref[0][2] = - alpha*pi*std::sin(pi*x_ref[2]);
195 dphys_dref[1][0] = alpha*pi*exp(1.0-x_ref[1])*std::cos(pi*x_ref[0]);
196 dphys_dref[1][1] = 1.0 -alpha*exp(1.0-x_ref[1])*(std::sin(pi*x_ref[0])+std::sin(pi*x_ref[2]));
197 dphys_dref[1][2] = alpha*pi*exp(1.0-x_ref[1])*std::cos(pi*x_ref[2]);
198 dphys_dref[2][0] = 1.0/10.0*pi*std::cos(2.0*pi*x_ref[0]);
199 dphys_dref[2][1] = 1.0/10.0*pi*std::cos(2.0*pi*x_ref[1]);
200 dphys_dref[2][2] = 1.0;
209 return std::make_unique<CurvManifold<dim>>();
213 static dealii::Point<dim> warp (
const dealii::Point<dim> &p)
215 const double pi = atan(1)*4.0;
216 dealii::Point<dim> q = p;
218 double beta =1.0/10.0;
219 double alpha =1.0/10.0;
221 q[dim-2] =p[dim-2] + beta*std::cos(pi/2.0 * p[dim-2]) * std::cos(3.0 * pi/2.0 * p[dim-1]);
222 q[dim-1] =p[dim-1] + beta*std::sin(2.0 * pi * (p[dim-2])) * std::cos(pi /2.0 * p[dim-1]);
225 q[0] =p[0] + alpha*(std::cos(pi * p[2]) + std::cos(pi * p[1]));
226 q[1] =p[1] + alpha*exp(1.0-p[1])*(std::sin(pi * p[0]) + std::sin(pi* p[2]));
227 q[2] =p[2] + 1.0/20.0*( std::sin(2.0 * pi * p[0]) + std::sin(2.0 * pi * p[1]));
237 int main (
int argc,
char * argv[])
239 dealii::Utilities::MPI::MPI_InitFinalize mpi_initialization(argc, argv, 1);
242 std::cout << std::setprecision(std::numeric_limits<long double>::digits10 + 1) << std::scientific;
243 const int dim = PHILIP_DIM;
244 const int nspecies = 1;
245 const int nstate = 1;
246 dealii::ParameterHandler parameter_handler;
248 dealii::ConditionalOStream pcout(std::cout, dealii::Utilities::MPI::this_mpi_process(MPI_COMM_WORLD)==0);
258 const bool colorize =
true;
260 using Triangulation = dealii::parallel::distributed::Triangulation<dim>;
261 std::shared_ptr<Triangulation> grid = std::make_shared<Triangulation>(
263 typename dealii::Triangulation<dim>::MeshSmoothing(
264 dealii::Triangulation<dim>::smoothing_on_refinement |
265 dealii::Triangulation<dim>::smoothing_on_coarsening));
266 dealii::GridGenerator::hyper_cube (*grid, left, right, colorize);
267 grid->refine_global(0);
271 dealii::GridTools::transform (&warp<dim>, *grid);
275 unsigned int manifold_id=0;
276 grid->reset_all_manifolds();
277 grid->set_all_manifold_ids(manifold_id);
278 grid->set_manifold ( manifold_id, curv_manifold );
281 double surf_int = 0.0;
282 for(
unsigned int poly_degree = 2; poly_degree<6; poly_degree++){
283 unsigned int grid_degree = poly_degree + 1;
286 dg->allocate_system ();
288 const dealii::FESystem<dim> &fe_metric = (dg->high_order_grid->fe_system);
289 const unsigned int n_metric_dofs = fe_metric.dofs_per_cell;
290 auto metric_cell = dg->high_order_grid->dof_handler_grid.begin_active();
292 dealii::QGaussLobatto<1> grid_quad(grid_degree +1);
293 const dealii::FE_DGQ<1> fe_grid(grid_degree);
294 const dealii::FESystem<1,1> fe_sys_grid(fe_grid, nstate);
295 dealii::QGauss<1> flux_quad(poly_degree +1);
296 dealii::QGauss<0> flux_quad_face(poly_degree +1);
299 mapping_basis.build_1D_shape_functions_at_grid_nodes(fe_sys_grid, grid_quad);
300 mapping_basis.build_1D_shape_functions_at_flux_nodes(fe_sys_grid, flux_quad, flux_quad_face);
304 for (
auto current_cell = dg->dof_handler.begin_active(); current_cell!=dg->dof_handler.end(); ++current_cell, ++metric_cell) {
305 if (!current_cell->is_locally_owned())
continue;
307 std::vector<dealii::types::global_dof_index> current_metric_dofs_indices(n_metric_dofs);
308 metric_cell->get_dof_indices (current_metric_dofs_indices);
309 std::array<std::vector<real>,dim> mapping_support_points;
310 for(
int idim=0; idim<dim; idim++){
311 mapping_support_points[idim].resize(n_metric_dofs/dim);
313 dealii::QGaussLobatto<dim> vol_GLL(grid_degree +1);
314 for (
unsigned int igrid_node = 0; igrid_node< n_metric_dofs/dim; ++igrid_node) {
315 for (
unsigned int idof = 0; idof< n_metric_dofs; ++idof) {
316 const real val = (dg->high_order_grid->volume_nodes[current_metric_dofs_indices[idof]]);
317 const unsigned int istate = fe_metric.system_to_component_index(idof).first;
318 mapping_support_points[istate][igrid_node] += val * fe_metric.shape_value_component(idof,vol_GLL.point(igrid_node),istate);
322 const unsigned int n_quad_face_pts = dg->face_quadrature_collection[poly_degree].size();
323 const std::vector<real> &quad_weights = dg->face_quadrature_collection[poly_degree].get_weights ();
324 for (
unsigned int iface=0; iface < dealii::GeometryInfo<dim>::faces_per_cell; ++iface) {
326 metric_oper.build_facet_metric_operators(
328 n_quad_face_pts, n_metric_dofs/dim,
329 mapping_support_points,
333 const dealii::Tensor<1,dim,real> unit_normal_int = dealii::GeometryInfo<dim>::unit_normal_vector[iface];
334 std::vector<dealii::Tensor<1,dim,real>> normals_int(n_quad_face_pts);
335 for(
unsigned int iquad=0; iquad<n_quad_face_pts; iquad++){
336 for(
unsigned int idim=0; idim<dim; idim++){
337 normals_int[iquad][idim] = 0.0;
338 for(
int idim2=0; idim2<dim; idim2++){
339 normals_int[iquad][idim] += unit_normal_int[idim2] * metric_oper.metric_cofactor_surf[idim][idim2][iquad];
343 for(
unsigned int iquad=0; iquad<n_quad_face_pts; iquad++){
344 for(
int idim=0; idim<dim; idim++){
345 surf_int += 1.0 * quad_weights[iquad] * normals_int[iquad][idim] * 1.0;
351 const double surf_int_mpi= (dealii::Utilities::MPI::max(surf_int, MPI_COMM_WORLD));
353 if(std::abs(surf_int_mpi) > 1e-13){
354 pcout<<
" Metrics Do NOT Satisfy GCL Condition\n"<<std::endl;
358 pcout<<
" Metrics Satisfy GCL Condition\n"<<std::endl;
virtual dealii::Point< dim > pull_back(const dealii::Point< dim > &space_point) const override
See dealii::Manifold.
Files for the baseline physics.
Main parameter class that contains the various other sub-parameter classes.
Base metric operators class that stores functions used in both the volume and on surface.
The mapping shape functions evaluated at the desired nodes (facet set included in volume grid nodes f...
virtual std::unique_ptr< dealii::Manifold< dim, dim > > clone() const override
See dealii::Manifold.
static std::shared_ptr< DGBase< dim, nspecies, real, MeshType > > create_discontinuous_galerkin(const Parameters::AllParameters *const parameters_input, const unsigned int degree, const unsigned int max_degree_input, const unsigned int grid_degree_input, const std::shared_ptr< Triangulation > triangulation_input)
Creates a derived object DG, but returns it as DGBase.
virtual dealii::DerivativeForm< 1, dim, dim > push_forward_gradient(const dealii::Point< dim > &chart_point) const override
See dealii::Manifold.
void parse_parameters(dealii::ParameterHandler &prm)
Retrieve parameters from dealii::ParameterHandler.
virtual dealii::Point< dim > push_forward(const dealii::Point< dim > &chart_point) const override
See dealii::Manifold.
static void declare_parameters(dealii::ParameterHandler &prm)
Declare parameters that can be set as inputs and set up the default options.