From 673450c06a363d1f5667ffb1cc8b8af118d56829 Mon Sep 17 00:00:00 2001 From: Ralf Hartmann Date: Thu, 15 Mar 2001 19:07:18 +0000 Subject: [PATCH] Remove InternalDataBase argument of transform_unit_to_real_cell function; new implementation of transform_unit_to_real_cell_internal function. New internal helper function: get_cell_data. git-svn-id: https://svn.dealii.org/trunk@4225 0785d39b-7218-0410-832d-ea1e28bc413d --- deal.II/deal.II/source/fe/mapping_q1.cc | 122 ++++++++++++------------ 1 file changed, 61 insertions(+), 61 deletions(-) diff --git a/deal.II/deal.II/source/fe/mapping_q1.cc b/deal.II/deal.II/source/fe/mapping_q1.cc index 19a896fa1c..c15c557305 100644 --- a/deal.II/deal.II/source/fe/mapping_q1.cc +++ b/deal.II/deal.II/source/fe/mapping_q1.cc @@ -834,52 +834,35 @@ MappingQ1::transform_contravariant (std::vector > &dst, template Point MappingQ1::transform_unit_to_real_cell ( const typename Triangulation::cell_iterator cell, - const Point &p, - const typename Mapping::InternalDataBase *const m_data) const + const Point &p) const { - // If m_data!=0 use this - // InternalData. - // - // Otherwise use the get_data - // function to create an - // InternalData with data vectors - // already of the right size; And - // compute shape values and mapping - // support points. - // - // Let, at the end, mdata be a - // pointer to the given or the new - // created InternalData - const InternalData *mdata; - InternalData *mdata_local=0; - if (m_data==0) - { - static Point dummy_p; - static Quadrature dummy_quadrature(dummy_p); - mdata_local=dynamic_cast (get_data(update_transformation_values, - dummy_quadrature)); - Assert(mdata_local!=0, ExcInternalError()); - - compute_shapes(std::vector > (1, p), *mdata_local); - - compute_mapping_support_points(cell, mdata_local->mapping_support_points); - - mdata=mdata_local; - } - else -//TODO: can we assume that m_data->mapping_support_points is initialized - mdata = dynamic_cast (m_data); + // Use the get_cell_data function + // to create an InternalData with + // data vectors already of the + // right size and with mapping + // support points set. + InternalData *mdata=get_cell_data(cell, update_transformation_values); Assert(mdata!=0, ExcInternalError()); - // use now the InternalData, that - // mdata is pointing to, to compute - // the point in real space. + return transform_unit_to_real_cell_internal(cell, p, *mdata); +} + + +template +Point MappingQ1::transform_unit_to_real_cell_internal ( + const typename Triangulation::cell_iterator cell, + const Point &p, + const InternalData &data) const +{ + const unsigned int n_mapping_points=data.mapping_support_points.size(); + Assert(data.shape_values.size()==n_mapping_points, ExcInternalError()); + + // use now the InternalData to + // compute the point in real space. Point p_real; - for (unsigned int i=0; imapping_support_points.size(); ++i) - p_real+=mdata->mapping_support_points[i] * mdata->shape(0,i); + for (unsigned int i=0; i MappingQ1::transform_real_to_unit_cell ( const typename Triangulation::cell_iterator cell, const Point &p) const { - // Use the get_data - // function to create an - // InternalData with data vectors - // already of the right size. - static Point dummy_p; - static Quadrature dummy_quadrature(dummy_p); - Quadrature dummy_q(Point()); - InternalData *mdata= - dynamic_cast (get_data(update_transformation_values - | update_transformation_gradients, - dummy_quadrature)); + // Use the get_cell_data function + // to create an InternalData with + // data vectors already of the + // right size and with mapping + // support points set. + InternalData *mdata=get_cell_data(cell, + update_transformation_values + | update_transformation_gradients); Assert(mdata!=0, ExcInternalError()); - - // compute the mapping support - // points std::vector > &points=mdata->mapping_support_points; - compute_mapping_support_points(cell, points); // Newton iteration to solve // f(x)=p(x)-p=0 @@ -924,7 +900,7 @@ Point MappingQ1::transform_real_to_unit_cell ( compute_shapes(std::vector > (1, p_unit), *mdata); // f(x) - Point p_real(transform_unit_to_real_cell(cell, p_unit, mdata)); + Point p_real(transform_unit_to_real_cell_internal(cell, p_unit, *mdata)); Point f = p_real-p; const double eps=1e-15*cell->diameter(); @@ -957,14 +933,38 @@ Point MappingQ1::transform_real_to_unit_cell ( compute_shapes(std::vector > (1, p_unit), *mdata); // f(x) - p_real=transform_unit_to_real_cell(cell, p_unit, mdata); + p_real=transform_unit_to_real_cell_internal(cell, p_unit, *mdata); f = p_real-p; } - + + delete mdata; return p_unit; } +template +MappingQ1::InternalData* +MappingQ1::get_cell_data(const typename Triangulation::cell_iterator cell, + const UpdateFlags update_flags) const +{ + static Point dummy_p; + static Quadrature dummy_quadrature(dummy_p); + + InternalData *mdata=dynamic_cast ( + get_data(update_flags, dummy_quadrature)); + Assert(mdata!=0, ExcInternalError()); + + // compute the mapping support + // points + std::vector > &points=mdata->mapping_support_points; + compute_mapping_support_points(cell, points); + + return mdata; +} + + + + template template @@ -975,7 +975,7 @@ MappingQ1::contravariant_transformation (std::vector &dst, const Mapping::InternalDataBase &mapping_data, const unsigned int src_offset) const { - Assert(tensor_::dimension==dim && tensor_::rank==1, ExcInvalidData()); + Assert(tensor_::dimension==dim && tensor_::rank==1, Mapping::ExcInvalidData()); const InternalData* data_ptr = dynamic_cast (&mapping_data); Assert(data_ptr!=0, ExcInternalError()); const InternalData &data=*data_ptr; @@ -1009,7 +1009,7 @@ MappingQ1::covariant_transformation (std::vector &dst, const Mapping::InternalDataBase &mapping_data, const unsigned int src_offset) const { - Assert(tensor_::dimension==dim && tensor_::rank==1, ExcInvalidData()); + Assert(tensor_::dimension==dim && tensor_::rank==1, Mapping::ExcInvalidData()); const InternalData *data_ptr = dynamic_cast (&mapping_data); Assert(data_ptr!=0, ExcInternalError()); const InternalData &data=*data_ptr; -- 2.39.5