From: Peter Munch <peterrmuench@gmail.com> Date: Tue, 17 Nov 2020 18:50:16 +0000 (+0100) Subject: Actually use ShapeInfo for Simplex::FE_P and Simplex::QGauss X-Git-Tag: v9.3.0-rc1~889^2 X-Git-Url: https://gitweb.dealii.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=refs%2Fpull%2F11196%2Fhead;p=dealii.git Actually use ShapeInfo for Simplex::FE_P and Simplex::QGauss --- diff --git a/include/deal.II/matrix_free/mapping_info.h b/include/deal.II/matrix_free/mapping_info.h index e4852ea9eb..d717e3fc17 100644 --- a/include/deal.II/matrix_free/mapping_info.h +++ b/include/deal.II/matrix_free/mapping_info.h @@ -125,6 +125,14 @@ namespace internal */ QuadratureDescriptor(); + /** + * Set up the lengths in the various members of this struct. + */ + template <int dim_q> + void + initialize(const Quadrature<dim_q> &quadrature, + const UpdateFlags update_flags_inner_faces = update_default); + /** * Set up the lengths in the various members of this struct. */ diff --git a/include/deal.II/matrix_free/mapping_info.templates.h b/include/deal.II/matrix_free/mapping_info.templates.h index 1d89993cc5..e81fcb0fe8 100644 --- a/include/deal.II/matrix_free/mapping_info.templates.h +++ b/include/deal.II/matrix_free/mapping_info.templates.h @@ -51,6 +51,34 @@ namespace internal + template <int structdim, + int spacedim, + typename Number, + typename VectorizedArrayType> + template <int dim_q> + void + MappingInfoStorage<structdim, spacedim, Number, VectorizedArrayType>:: + QuadratureDescriptor::initialize( + const Quadrature<dim_q> &quadrature, + const UpdateFlags update_flags_inner_faces) + { + Assert(structdim + 1 <= spacedim || + update_flags_inner_faces == update_default, + ExcMessage("Volume cells do not allow for setting inner faces")); + this->quadrature = quadrature; + n_q_points = quadrature.size(); + quadrature_weights.resize(n_q_points); + for (unsigned int i = 0; i < n_q_points; ++i) + quadrature_weights[i] = quadrature.weight(i); + + // note: quadrature_1 and tensor_quadrature_weights are not set up + + // TODO: set up face_orientations + (void)update_flags_inner_faces; + } + + + template <int structdim, int spacedim, typename Number, @@ -338,27 +366,41 @@ namespace internal cell_data[my_q].descriptor.resize(n_hp_quads); for (unsigned int q = 0; q < n_hp_quads; ++q) { - Assert(quad[my_q][q].is_tensor_product(), ExcNotImplemented()); - for (unsigned int i = 1; i < dim; ++i) - { - Assert(quad[my_q][q].get_tensor_basis()[0] == - quad[my_q][q].get_tensor_basis()[i], - ExcNotImplemented()); - } + bool flag = quad[my_q][q].is_tensor_product(); - cell_data[my_q].descriptor[q].initialize( - quad[my_q][q].get_tensor_basis()[0], update_default); + if (flag) + for (unsigned int i = 1; i < dim; ++i) + { + flag &= quad[my_q][q].get_tensor_basis()[0] == + quad[my_q][q].get_tensor_basis()[i]; + } +#ifdef DEAL_II_WITH_SIMPLEX_SUPPORT + if (flag == false) + cell_data[my_q].descriptor[q].initialize(quad[my_q][q], + update_default); + else +#endif + cell_data[my_q].descriptor[q].initialize( + quad[my_q][q].get_tensor_basis()[0], update_default); } face_data[my_q].descriptor.resize(n_hp_quads); for (unsigned int hpq = 0; hpq < n_hp_quads; ++hpq) { - Assert(quad[my_q][hpq].is_tensor_product(), ExcNotImplemented()); - for (unsigned int i = 1; i < dim; ++i) + bool flag = quad[my_q][hpq].is_tensor_product(); + + if (flag) + for (unsigned int i = 1; i < dim; ++i) + flag &= quad[my_q][hpq].get_tensor_basis()[0] == + quad[my_q][hpq].get_tensor_basis()[i]; + + if (flag == false) { - Assert(quad[my_q][hpq].get_tensor_basis()[0] == - quad[my_q][hpq].get_tensor_basis()[i], - ExcNotImplemented()); +#ifdef DEAL_II_WITH_SIMPLEX_SUPPORT + continue; // TODO: face data is not set up +#else + Assert(false, ExcNotImplemented()); +#endif } face_data[my_q].descriptor[hpq].initialize( @@ -369,12 +411,20 @@ namespace internal face_data_by_cells[my_q].descriptor.resize(n_hp_quads); for (unsigned int hpq = 0; hpq < n_hp_quads; ++hpq) { - Assert(quad[my_q][hpq].is_tensor_product(), ExcNotImplemented()); - for (unsigned int i = 1; i < dim; ++i) + bool flag = quad[my_q][hpq].is_tensor_product(); + + if (flag) + for (unsigned int i = 1; i < dim; ++i) + flag &= quad[my_q][hpq].get_tensor_basis()[0] == + quad[my_q][hpq].get_tensor_basis()[i]; + + if (flag == false) { - Assert(quad[my_q][hpq].get_tensor_basis()[0] == - quad[my_q][hpq].get_tensor_basis()[i], - ExcNotImplemented()); +#ifdef DEAL_II_WITH_SIMPLEX_SUPPORT + continue; // TODO: face data is not set up +#else + Assert(false, ExcNotImplemented()); +#endif } face_data_by_cells[my_q].descriptor[hpq].initialize(