From 4b49ea55ebc850d5828a4b5e8a841f2efe216d67 Mon Sep 17 00:00:00 2001 From: bangerth Date: Fri, 25 Aug 2006 14:48:03 +0000 Subject: [PATCH] Implement using the correct transformation also for subfaces git-svn-id: https://svn.dealii.org/trunk@13743 0785d39b-7218-0410-832d-ea1e28bc413d --- deal.II/deal.II/source/fe/fe_poly_tensor.cc | 174 ++++++++++++++------ tests/fe/rt_14.cc | 2 +- tests/fe/rt_14/cmp/generic | 168 +++++++------------ tests/fe/rt_15.cc | 4 +- 4 files changed, 187 insertions(+), 161 deletions(-) diff --git a/deal.II/deal.II/source/fe/fe_poly_tensor.cc b/deal.II/deal.II/source/fe/fe_poly_tensor.cc index cf97b95d1e..3a980be316 100644 --- a/deal.II/deal.II/source/fe/fe_poly_tensor.cc +++ b/deal.II/deal.II/source/fe/fe_poly_tensor.cc @@ -506,11 +506,11 @@ FE_PolyTensor::fill_fe_face_values ( // ExcNotImplemented()); //TODO: Size assertions - // Create table with sign changes, due to the special structure of the RT elements. - // TODO: Preliminary hack to demonstrate the overall prinicple! +// Create table with sign changes, due to the special structure of the RT elements. +// TODO: Preliminary hack to demonstrate the overall prinicple! - // Compute eventual sign changes depending on the neighborhood - // between two faces. + // Compute eventual sign changes depending + // on the neighborhood between two faces. std::vector sign_change (n_dofs, 1.0); get_face_sign_change (cell, sign_change); @@ -524,37 +524,54 @@ FE_PolyTensor::fill_fe_face_values ( { case independent: case independent_on_cartesian: + { for (unsigned int k=0; k > shape_values (n_quad); - if (mapping_type == covariant) - mapping.transform_covariant(fe_data.shape_values[i], offset, + { + // Use auxiliary vector + // for transformation + std::vector > shape_values (n_quad); + if (mapping_type == covariant) + mapping.transform_covariant(fe_data.shape_values[i], offset, + shape_values, mapping_data); + else + mapping.transform_contravariant(fe_data.shape_values[i], offset, shape_values, mapping_data); - else - mapping.transform_contravariant(fe_data.shape_values[i], offset, - shape_values, mapping_data); + + // then copy over to target: + for (unsigned int k=0; k::fill_fe_face_values ( { std::vector > shape_grads1 (n_quad); std::vector > shape_grads2 (n_quad); + switch(mapping_type) { case independent: case independent_on_cartesian: + { mapping.transform_covariant(fe_data.shape_grads[i], offset, shape_grads1, mapping_data); for (unsigned int k=0; k::fill_fe_face_values ( for (unsigned int d=0;d::fill_fe_face_values ( for (unsigned int k=0; k::fill_fe_subface_values ( { case independent: case independent_on_cartesian: + { for (unsigned int k=0; k > shape_values (n_quad); - if (mapping_type == covariant) - mapping.transform_covariant(fe_data.shape_values[i], offset, + { + // Use auxiliary vector for + // transformation + std::vector > shape_values (n_quad); + if (mapping_type == covariant) + mapping.transform_covariant(fe_data.shape_values[i], offset, + shape_values, mapping_data); + else + mapping.transform_contravariant(fe_data.shape_values[i], offset, shape_values, mapping_data); - else - mapping.transform_contravariant(fe_data.shape_values[i], offset, - shape_values, mapping_data); - // then copy over to target: - for (unsigned int k=0; k::fill_fe_subface_values ( { std::vector > shape_grads1 (n_quad); std::vector > shape_grads2 (n_quad); + switch(mapping_type) { case independent: case independent_on_cartesian: + { mapping.transform_covariant(fe_data.shape_grads[i], offset, shape_grads1, mapping_data); for (unsigned int k=0; k::fill_fe_subface_values ( for (unsigned int d=0;d