From: Jaeryun Yim Date: Fri, 30 Sep 2016 12:42:49 +0000 (+0900) Subject: Edit the functions related with face & subface data. X-Git-Tag: v8.5.0-rc1~624^2~3 X-Git-Url: https://gitweb.dealii.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=56866aed262f717ae9c92313bbcd738673fc8004;p=dealii.git Edit the functions related with face & subface data. - Add get_face_data(), get_subface_data() - Fix fill_fe_face_values(), fill_fe_subface_values() --- diff --git a/include/deal.II/fe/fe_p1nc.h b/include/deal.II/fe/fe_p1nc.h index 39b9e9363c..2ecd699b49 100644 --- a/include/deal.II/fe/fe_p1nc.h +++ b/include/deal.II/fe/fe_p1nc.h @@ -275,7 +275,8 @@ private: * Do the work which is needed before cellwise data computation. * Since the shape functions are constructed independently on each cell, * the data on the reference cell is not necessary. - * It returns an empty variable type of @ InternalDataBase and updates @ update_flags. + * It returns an empty variable type of @ InternalDataBase and updates @ update_flags, + * and computes trivially zero Hessian for each cell if it is needed. */ virtual FiniteElement<2,2>::InternalDataBase * get_data (const UpdateFlags update_flags, @@ -283,15 +284,27 @@ private: const Quadrature<2> &quadrature, dealii::internal::FEValues::FiniteElementRelatedData<2,2> &output_data) const; + virtual FiniteElement<2,2>::InternalDataBase * + get_face_data (const UpdateFlags update_flags, + const Mapping<2,2> &, + const Quadrature<1> &quadrature, + dealii::internal::FEValues::FiniteElementRelatedData<2,2> &output_data) const; + + virtual FiniteElement<2,2>::InternalDataBase * + get_subface_data (const UpdateFlags update_flags, + const Mapping<2,2> &, + const Quadrature<1> &quadrature, + dealii::internal::FEValues::FiniteElementRelatedData<2,2> &output_data) const; + /** * Compute the data on the current cell. */ virtual void fill_fe_values (const Triangulation<2,2>::cell_iterator &cell, - const CellSimilarity::Similarity, - const Quadrature<2> &, - const Mapping<2,2> &, - const Mapping<2,2>::InternalDataBase &, + const CellSimilarity::Similarity cell_similarity, + const Quadrature<2> &quadrature, + const Mapping<2,2> &mapping, + const Mapping<2,2>::InternalDataBase &mapping_internal, const internal::FEValues::MappingRelatedData<2,2> &mapping_data, const FiniteElement<2,2>::InternalDataBase &fe_internal, internal::FEValues::FiniteElementRelatedData<2,2> &output_data) const; diff --git a/source/fe/fe_p1nc.cc b/source/fe/fe_p1nc.cc index f8003c10e8..74e0738bd2 100644 --- a/source/fe/fe_p1nc.cc +++ b/source/fe/fe_p1nc.cc @@ -154,12 +154,54 @@ FE_P1NC::get_data (const UpdateFlags update_flags, +FiniteElement<2,2>::InternalDataBase * +FE_P1NC::get_face_data (const UpdateFlags update_flags, + const Mapping<2,2> &, + const Quadrature<1> &quadrature, + dealii::internal::FEValues::FiniteElementRelatedData<2,2> &output_data) const +{ + FiniteElement<2,2>::InternalDataBase *data = new FiniteElement<2,2>::InternalDataBase; + + data->update_each = requires_update_flags(update_flags); + + // hessian + const unsigned int n_q_points = quadrature.size(); + output_data.initialize (n_q_points, FE_P1NC(), data->update_each); + if (data->update_each & update_hessians) + output_data.shape_hessians.fill(Tensor<2,2>()); + + return data; +} + + + +FiniteElement<2,2>::InternalDataBase * +FE_P1NC::get_subface_data (const UpdateFlags update_flags, + const Mapping<2,2> &, + const Quadrature<1> &quadrature, + dealii::internal::FEValues::FiniteElementRelatedData<2,2> &output_data) const +{ + FiniteElement<2,2>::InternalDataBase *data = new FiniteElement<2,2>::InternalDataBase; + + data->update_each = requires_update_flags(update_flags); + + // hessian + const unsigned int n_q_points = quadrature.size(); + output_data.initialize (n_q_points, FE_P1NC(), data->update_each); + if (data->update_each & update_hessians) + output_data.shape_hessians.fill(Tensor<2,2>()); + + return data; +} + + + void FE_P1NC::fill_fe_values (const Triangulation<2,2>::cell_iterator &cell, - const CellSimilarity::Similarity, - const Quadrature<2> &, - const Mapping<2,2> &, - const Mapping<2,2>::InternalDataBase &, + const CellSimilarity::Similarity cell_similarity, + const Quadrature<2> &quadrature, + const Mapping<2,2> &mapping, + const Mapping<2,2>::InternalDataBase &mapping_internal, const internal::FEValues::MappingRelatedData<2,2> &mapping_data, const FiniteElement<2,2>::InternalDataBase &fe_internal, internal::FEValues::FiniteElementRelatedData<2,2> &output_data) const @@ -174,7 +216,7 @@ FE_P1NC::fill_fe_values (const Triangulation<2,2>::cell_iterator &cell // linear shape functions std_cxx11::array,4> coeffs = get_linear_shape_coefficients (cell); - // compute basis functions + // compute on the cell if (flags & (update_values | update_gradients)) for (unsigned int i=0; i::cell_iterator // linear shape functions std_cxx11::array,4> coeffs = get_linear_shape_coefficients (cell); - // compute basis functions - if (flags & (update_values | update_gradients)) - for (unsigned int i=0; idofs_per_cell; ++k) - { - if (flags & update_values) - { - values[k] = coeffs[k][0]*mapping_data.quadrature_points[i](0) + coeffs[k][1]*mapping_data.quadrature_points[i](1) + coeffs[k][2]; - output_data.shape_values[k][i] = values[k]; - } - - if (flags & update_gradients) - { - grads[k][0] = coeffs[k][0]; - grads[k][1] = coeffs[k][1]; - output_data.shape_gradients[k][i] = grads[k]; - } - } - } + // compute on the face + Quadrature<2> quadrature_on_face = QProjector<2>::project_to_face(quadrature, face_no); + Point<2> quadrature_point; + for (unsigned int i=0; idofs_per_cell; ++k) + { + if (flags & update_values) + { + quadrature_point = mapping.transform_unit_to_real_cell(cell, quadrature_on_face.point(i)); + values[k] = coeffs[k][0]*quadrature_point(0) + coeffs[k][1]*quadrature_point(1) + coeffs[k][2]; + output_data.shape_values[k][i] = values[k]; + } + + if (flags & update_gradients) + { + grads[k][0] = coeffs[k][0]; + grads[k][1] = coeffs[k][1]; + output_data.shape_gradients[k][i] = grads[k]; + } + } + } } @@ -263,26 +307,28 @@ FE_P1NC::fill_fe_subface_values (const Triangulation<2,2>::cell_iterator // linear shape functions std_cxx11::array,4> coeffs = get_linear_shape_coefficients (cell); - // compute basis functions - if (flags & (update_values | update_gradients)) - for (unsigned int i=0; idofs_per_cell; ++k) - { - if (flags & update_values) - { - values[k] = coeffs[k][0]*mapping_data.quadrature_points[i](0) + coeffs[k][1]*mapping_data.quadrature_points[i](1) + coeffs[k][2]; - output_data.shape_values[k][i] = values[k]; - } - - if (flags & update_gradients) - { - grads[k][0] = coeffs[k][0]; - grads[k][1] = coeffs[k][1]; - output_data.shape_gradients[k][i] = grads[k]; - } - } - } + // compute on the subface + Quadrature<2> quadrature_on_subface = QProjector<2>::project_to_subface(quadrature, face_no, sub_no); + Point<2> quadrature_point; + for (unsigned int i=0; idofs_per_cell; ++k) + { + if (flags & update_values) + { + quadrature_point = mapping.transform_unit_to_real_cell(cell, quadrature_on_subface.point(i)); + values[k] = coeffs[k][0]*quadrature_point(0) + coeffs[k][1]*quadrature_point(1) + coeffs[k][2]; + output_data.shape_values[k][i] = values[k]; + } + + if (flags & update_gradients) + { + grads[k][0] = coeffs[k][0]; + grads[k][1] = coeffs[k][1]; + output_data.shape_gradients[k][i] = grads[k]; + } + } + } }