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 nstate = 1;
245 dealii::ParameterHandler parameter_handler;
247 dealii::ConditionalOStream pcout(std::cout, dealii::Utilities::MPI::this_mpi_process(MPI_COMM_WORLD)==0);
257 const bool colorize =
true;
259 using Triangulation = dealii::parallel::distributed::Triangulation<dim>;
260 std::shared_ptr<Triangulation> grid = std::make_shared<Triangulation>(
262 typename dealii::Triangulation<dim>::MeshSmoothing(
263 dealii::Triangulation<dim>::smoothing_on_refinement |
264 dealii::Triangulation<dim>::smoothing_on_coarsening));
265 dealii::GridGenerator::hyper_cube (*grid, left, right, colorize);
266 grid->refine_global(0);
270 dealii::GridTools::transform (&warp<dim>, *grid);
274 unsigned int manifold_id=0;
275 grid->reset_all_manifolds();
276 grid->set_all_manifold_ids(manifold_id);
277 grid->set_manifold ( manifold_id, curv_manifold );
280 double surf_int = 0.0;
281 for(
unsigned int poly_degree = 2; poly_degree<6; poly_degree++){
282 unsigned int grid_degree = poly_degree + 1;
285 dg->allocate_system ();
287 const dealii::FESystem<dim> &fe_metric = (dg->high_order_grid->fe_system);
288 const unsigned int n_metric_dofs = fe_metric.dofs_per_cell;
289 auto metric_cell = dg->high_order_grid->dof_handler_grid.begin_active();
291 dealii::QGaussLobatto<1> grid_quad(grid_degree +1);
292 const dealii::FE_DGQ<1> fe_grid(grid_degree);
293 const dealii::FESystem<1,1> fe_sys_grid(fe_grid, nstate);
294 dealii::QGauss<1> flux_quad(poly_degree +1);
295 dealii::QGauss<0> flux_quad_face(poly_degree +1);
298 mapping_basis.build_1D_shape_functions_at_grid_nodes(fe_sys_grid, grid_quad);
299 mapping_basis.build_1D_shape_functions_at_flux_nodes(fe_sys_grid, flux_quad, flux_quad_face);
303 for (
auto current_cell = dg->dof_handler.begin_active(); current_cell!=dg->dof_handler.end(); ++current_cell, ++metric_cell) {
304 if (!current_cell->is_locally_owned())
continue;
306 std::vector<dealii::types::global_dof_index> current_metric_dofs_indices(n_metric_dofs);
307 metric_cell->get_dof_indices (current_metric_dofs_indices);
308 std::array<std::vector<real>,dim> mapping_support_points;
309 for(
int idim=0; idim<dim; idim++){
310 mapping_support_points[idim].resize(n_metric_dofs/dim);
312 dealii::QGaussLobatto<dim> vol_GLL(grid_degree +1);
313 for (
unsigned int igrid_node = 0; igrid_node< n_metric_dofs/dim; ++igrid_node) {
314 for (
unsigned int idof = 0; idof< n_metric_dofs; ++idof) {
315 const real val = (dg->high_order_grid->volume_nodes[current_metric_dofs_indices[idof]]);
316 const unsigned int istate = fe_metric.system_to_component_index(idof).first;
317 mapping_support_points[istate][igrid_node] += val * fe_metric.shape_value_component(idof,vol_GLL.point(igrid_node),istate);
321 const unsigned int n_quad_face_pts = dg->face_quadrature_collection[poly_degree].size();
322 const std::vector<real> &quad_weights = dg->face_quadrature_collection[poly_degree].get_weights ();
323 for (
unsigned int iface=0; iface < dealii::GeometryInfo<dim>::faces_per_cell; ++iface) {
325 metric_oper.build_facet_metric_operators(
327 n_quad_face_pts, n_metric_dofs/dim,
328 mapping_support_points,
332 const dealii::Tensor<1,dim,real> unit_normal_int = dealii::GeometryInfo<dim>::unit_normal_vector[iface];
333 std::vector<dealii::Tensor<1,dim,real>> normals_int(n_quad_face_pts);
334 for(
unsigned int iquad=0; iquad<n_quad_face_pts; iquad++){
335 for(
unsigned int idim=0; idim<dim; idim++){
336 normals_int[iquad][idim] = 0.0;
337 for(
int idim2=0; idim2<dim; idim2++){
338 normals_int[iquad][idim] += unit_normal_int[idim2] * metric_oper.metric_cofactor_surf[idim][idim2][iquad];
342 for(
unsigned int iquad=0; iquad<n_quad_face_pts; iquad++){
343 for(
int idim=0; idim<dim; idim++){
344 surf_int += 1.0 * quad_weights[iquad] * normals_int[iquad][idim] * 1.0;
350 const double surf_int_mpi= (dealii::Utilities::MPI::max(surf_int, MPI_COMM_WORLD));
352 if(std::abs(surf_int_mpi) > 1e-13){
353 pcout<<
" Metrics Do NOT Satisfy GCL Condition\n"<<std::endl;
357 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.
static std::shared_ptr< DGBase< dim, 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.
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.
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.