From: guido Date: Tue, 2 Jul 2002 16:12:36 +0000 (+0000) Subject: co- and contravariant transformation simplified X-Git-Url: https://gitweb.dealii.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=81dbcf9c2a81c0773dfe768a062f7f1ce5b8936a;p=dealii-svn.git co- and contravariant transformation simplified git-svn-id: https://svn.dealii.org/trunk@6213 0785d39b-7218-0410-832d-ea1e28bc413d --- diff --git a/deal.II/common/scripts/build-test/configurations/ultra-gcc31-mt.cfg b/deal.II/common/scripts/build-test/configurations/ultra-gcc31-mt.cfg index 439027ff0d..c9943fb5c5 100644 --- a/deal.II/common/scripts/build-test/configurations/ultra-gcc31-mt.cfg +++ b/deal.II/common/scripts/build-test/configurations/ultra-gcc31-mt.cfg @@ -14,7 +14,7 @@ s'CXX=.*'CXX=g++'; s'CC=.*'CC=gcc'; s'CVS=.*'CVS=cvs'; s'MAKE=.*'MAKE="make"'; -s'MAIL=.*'MAIL=mail'; +s'MAIL=.*'MAIL="ssh1 atlas mail"'; # Path variables diff --git a/deal.II/common/scripts/build-test/configurations/utwente-gcc.cfg b/deal.II/common/scripts/build-test/configurations/utwente-gcc.cfg index 0acfdda345..5f6b1babb0 100644 --- a/deal.II/common/scripts/build-test/configurations/utwente-gcc.cfg +++ b/deal.II/common/scripts/build-test/configurations/utwente-gcc.cfg @@ -5,14 +5,16 @@ s/\@Id\@/$id/; s'compiler=.*'compiler=gcc295'; +# it seems that we cannot get this from config.guess + +s!`./config.guess`!i686-pc-cygwin!; + # Commands s'CXX=.*'CXX=g++'; s'CC=.*'CC=gcc'; s'CVS=.*'CVS=cvs'; s'MAKE=.*'MAKE="make"'; -#s'MAIL=.*'MAIL="cat > "'; -s!\$MAIL build-(.*)\@dealii.org.*!cp log > ../../$1!; # Path variables @@ -25,6 +27,4 @@ s'export CVSROOT=.*'export CVSROOT=:pserver:build@eris.iwr.uni-heidelberg.de:/ho # Work around missing mail - -s'build-failure\@dealii.org'../../Failure'; -s'build-success\@dealii.org'../../Success'; +s!\$MAIL build-(.*)\@dealii.org < log 2>\&1!cp log ../../$1!; diff --git a/deal.II/common/scripts/build-test/template b/deal.II/common/scripts/build-test/template index 385dc1c6f0..077388478e 100644 --- a/deal.II/common/scripts/build-test/template +++ b/deal.II/common/scripts/build-test/template @@ -95,7 +95,7 @@ echo "BUILDING LIBRARY AT " `date '+%Y-%m-%d %T'` | tee -a log (if ($MAKE all -k 2>&1) ; then echo "CLEANING OBJECT FILES AT " `date '+%Y-%m-%d %T'` | tee -a log - $MAKE clean + $MAKE clean -k 2>&1 echo "BUILDING EXAMPLES AT " `date '+%Y-%m-%d %T'` | tee -a log if (cd examples ; $MAKE -k 2>&1) ; then result=succeeded ; diff --git a/deal.II/deal.II/include/fe/mapping.h b/deal.II/deal.II/include/fe/mapping.h index 41afb3822b..ec3f2f3c20 100644 --- a/deal.II/deal.II/include/fe/mapping.h +++ b/deal.II/deal.II/include/fe/mapping.h @@ -189,64 +189,42 @@ class Mapping : public Subscriptor /** * Tranform a field of covariant - * vectors. There must be one - * vector for each quadrature - * point. Alternatively, for - * faces and subfaces, the number - * of the first quadrature point - * can be given as additional - * argument. - */ - virtual void transform_covariant (typename std::vector > &dst, - const typename std::vector > &src, - const InternalDataBase &internal, - const unsigned int src_offset) const = 0; - - /** - * Tranform a field of - * contravariant vectors. There - * must be one vector for each - * quadrature - * point. Alternatively, for - * faces and subfaces, the number - * of the first quadrature point - * can be given as additional - * argument. - */ - virtual - void - transform_contravariant (typename std::vector > &dst, - const typename std::vector > &src, - const InternalDataBase &internal, - const unsigned int src_offset) const = 0; - - /** - * Tranform a field of covariant vectors. - * There must be one vector for each quadrature - * point. Alternatively, for faces and subfaces, - * the first quadrature point can be - * given as additional argument. + * vectors. The vector spanned by + * @p{begin} and @p{end} must + * have as many elements as there + * are quadrature points (not + * tested inside the function). + * + * The vector @p{src} must + * contain at least as many + * elements. */ virtual void - transform_covariant (typename std::vector > &dst, - const typename std::vector > &src, - const InternalDataBase &internal, - const unsigned int src_offset) const = 0; + transform_covariant (Tensor<1,dim>* begin, + const Tensor<1,dim>* end, + const Tensor<1,dim>* src, + const InternalDataBase& internal) const = 0; /** - * Tranform a field of contravariant vectors. - * There must be one vector for each quadrature - * point. Alternatively, for faces and subfaces, - * the first quadrature point can be - * given as additional argument. + * Tranform a field of + * contravariant vectors. The + * vector spanned by @p{begin} + * and @p{end} must have as many + * elements as there are + * quadrature points (not tested + * inside the function). + * + * The vector @p{src} must + * contain at least as many + * elements. */ virtual void - transform_contravariant (typename std::vector > &dst, - const typename std::vector > &src, - const InternalDataBase &internal, - const unsigned int src_offset) const = 0; + transform_contravariant (Tensor<1,dim>* begin, + const Tensor<1,dim>* end, + const Tensor<1,dim>* src, + const InternalDataBase& internal) const = 0; /** * Indicate fields to be updated in the diff --git a/deal.II/deal.II/include/fe/mapping_cartesian.h b/deal.II/deal.II/include/fe/mapping_cartesian.h index 587cad2965..af5c50ec00 100644 --- a/deal.II/deal.II/include/fe/mapping_cartesian.h +++ b/deal.II/deal.II/include/fe/mapping_cartesian.h @@ -105,41 +105,21 @@ class MappingCartesian : public Mapping * @ref{Mapping}. */ virtual void - transform_covariant (typename std::vector > &dst, - const typename std::vector > &src, - const typename Mapping::InternalDataBase &mapping_data, - const unsigned int src_offset) const; + transform_covariant (Tensor<1,dim>* begin, + const Tensor<1,dim>* end, + const Tensor<1,dim>* src, + const typename Mapping::InternalDataBase &mapping_data) const; /** * Implementation of the interface in * @ref{Mapping}. */ virtual void - transform_contravariant (typename std::vector > &dst, - const typename std::vector > &src, - const typename Mapping::InternalDataBase &mapping_data, - const unsigned int src_offset) const; + transform_contravariant (Tensor<1,dim>* begin, + const Tensor<1,dim>* end, + const Tensor<1,dim>* src, + const typename Mapping::InternalDataBase &mapping_data) const; - /** - * Implementation of the interface in - * @ref{Mapping}. - */ - virtual void - transform_covariant (typename std::vector > &dst, - const typename std::vector > &src, - const typename Mapping::InternalDataBase &mapping_data, - const unsigned int src_offset) const; - - /** - * Implementation of the interface in - * @ref{Mapping}. - */ - virtual void - transform_contravariant (typename std::vector > &dst, - const typename std::vector > &src, - const typename Mapping::InternalDataBase &mapping_data, - const unsigned int src_offset) const; - /** * Transforms the point @p{p} on * the unit cell to the point @@ -182,25 +162,6 @@ class MappingCartesian : public Mapping DeclException0 (ExcInvalidData); protected: - /** - * Implementation of the - * covariant transformation. - */ - template - void covariant_transformation (typename std::vector &dst, - const typename std::vector &src, - const typename Mapping::InternalDataBase &mapping_data, - const unsigned int src_offset) const; - - /** - * Implementation of the - * contravariant transformation. - */ - template - void contravariant_transformation (typename std::vector &dst, - const typename std::vector &src, - const typename Mapping::InternalDataBase &mapping_data, - const unsigned int src_offset) const; /** * Storage for internal data of diff --git a/deal.II/deal.II/include/fe/mapping_q.h b/deal.II/deal.II/include/fe/mapping_q.h index c11f052b89..82ba320cbd 100644 --- a/deal.II/deal.II/include/fe/mapping_q.h +++ b/deal.II/deal.II/include/fe/mapping_q.h @@ -83,40 +83,20 @@ class MappingQ : public MappingQ1 * @ref{Mapping}. */ virtual void - transform_covariant (typename std::vector > &dst, - const typename std::vector > &src, - const typename Mapping::InternalDataBase &mapping_data, - const unsigned int src_offset) const; + transform_covariant (Tensor<1,dim>* begin, + const Tensor<1,dim>* end, + const Tensor<1,dim>* src, + const typename Mapping::InternalDataBase &mapping_data) const; /** * Implementation of the interface in * @ref{Mapping}. */ virtual void - transform_contravariant (typename std::vector > &dst, - const typename std::vector > &src, - const typename Mapping::InternalDataBase &mapping_data, - const unsigned int src_offset) const; - - /** - * Implementation of the interface in - * @ref{Mapping}. - */ - virtual void - transform_covariant (typename std::vector > &dst, - const typename std::vector > &src, - const typename Mapping::InternalDataBase &mapping_data, - const unsigned int src_offset) const; - - /** - * Implementation of the interface in - * @ref{Mapping}. - */ - virtual void - transform_contravariant (typename std::vector > &dst, - const typename std::vector > &src, - const typename Mapping::InternalDataBase &mapping_data, - const unsigned int src_offset) const; + transform_contravariant (Tensor<1,dim>* begin, + const Tensor<1,dim>* end, + const Tensor<1,dim>* src, + const typename Mapping::InternalDataBase &mapping_data) const; /** * Return the degree of the diff --git a/deal.II/deal.II/include/fe/mapping_q1.h b/deal.II/deal.II/include/fe/mapping_q1.h index bbe2afd378..a3c4d92aac 100644 --- a/deal.II/deal.II/include/fe/mapping_q1.h +++ b/deal.II/deal.II/include/fe/mapping_q1.h @@ -72,41 +72,20 @@ class MappingQ1 : public Mapping * @ref{Mapping}. */ virtual void - transform_covariant (typename std::vector > &dst, - const typename std::vector > &src, - const typename Mapping::InternalDataBase &mapping_data, - const unsigned int src_offset) const; + transform_covariant (Tensor<1,dim>* begin, + const Tensor<1,dim>* end, + const Tensor<1,dim>* src, + const typename Mapping::InternalDataBase &mapping_data) const; /** * Implementation of the interface in * @ref{Mapping}. */ virtual void - transform_contravariant (typename std::vector > &dst, - const typename std::vector > &src, - const typename Mapping::InternalDataBase &mapping_data, - const unsigned int src_offset) const; - - /** - * Implementation of the interface in - * @ref{Mapping}. - */ - virtual void - transform_covariant (typename std::vector > &dst, - const typename std::vector > &src, - const typename Mapping::InternalDataBase &mapping_data, - const unsigned int src_offset) const; - - /** - * Implementation of the interface in - * @ref{Mapping}. - */ - virtual void - transform_contravariant (typename std::vector > &dst, - const typename std::vector > &src, - const typename Mapping::InternalDataBase &mapping_data, - const unsigned int src_offset) const; - + transform_contravariant (Tensor<1,dim>* begin, + const Tensor<1,dim>* end, + const Tensor<1,dim>* src, + const typename Mapping::InternalDataBase &mapping_data) const; /** * Implementation of the interface in @@ -162,26 +141,6 @@ class MappingQ1 : public Mapping typename std::vector > &boundary_form, typename std::vector > &normal_vectors) const ; - /** - * Implementation of the - * covariant transformation. - */ - template - void covariant_transformation (typename std::vector &dst, - const typename std::vector &src, - const typename Mapping::InternalDataBase &mapping_data, - const unsigned int src_offset) const; - - /** - * Implementation of the - * contravariant transformation. - */ - template - void contravariant_transformation (typename std::vector &dst, - const typename std::vector &src, - const typename Mapping::InternalDataBase &mapping_data, - const unsigned int src_offset) const; - /** * Storage for internal data of * d-linear transformation. diff --git a/deal.II/deal.II/source/fe/fe.cc b/deal.II/deal.II/source/fe/fe.cc index 50b0b86cf9..02f3981b3d 100644 --- a/deal.II/deal.II/source/fe/fe.cc +++ b/deal.II/deal.II/source/fe/fe.cc @@ -465,8 +465,9 @@ compute_2nd (const Mapping &mapping, // cell for (unsigned int d=0; d::fill_fe_values (const Mapping &mapping, data.shape_values(k,i) = fe_data.shape_values[k][i]; if (flags & update_gradients) - mapping.transform_covariant(data.shape_gradients[k], - fe_data.shape_gradients[k], - mapping_data, 0); + mapping.transform_covariant(data.shape_gradients[k].begin(), + data.shape_gradients[k].end(), + fe_data.shape_gradients[k].begin(), + mapping_data); } if (flags & update_second_derivatives) @@ -334,9 +335,10 @@ FE_DGP::fill_fe_face_values (const Mapping &mapping, data.shape_values(k,i) = fe_data.shape_values[k][i+offset]; if (flags & update_gradients) - mapping.transform_covariant(data.shape_gradients[k], - fe_data.shape_gradients[k], - mapping_data, offset); + mapping.transform_covariant(data.shape_gradients[k].begin(), + data.shape_gradients[k].end(), + &fe_data.shape_gradients[k][offset], + mapping_data); } if (flags & update_second_derivatives) @@ -379,9 +381,10 @@ FE_DGP::fill_fe_subface_values (const Mapping &mappi data.shape_values(k,i) = fe_data.shape_values[k][i+offset]; if (flags & update_gradients) - mapping.transform_covariant(data.shape_gradients[k], - fe_data.shape_gradients[k], - mapping_data, offset); + mapping.transform_covariant(data.shape_gradients[k].begin(), + data.shape_gradients[k].end(), + &fe_data.shape_gradients[k][offset], + mapping_data); } if (flags & update_second_derivatives) diff --git a/deal.II/deal.II/source/fe/fe_dgq.cc b/deal.II/deal.II/source/fe/fe_dgq.cc index af9b968ecf..633e75f2a9 100644 --- a/deal.II/deal.II/source/fe/fe_dgq.cc +++ b/deal.II/deal.II/source/fe/fe_dgq.cc @@ -491,9 +491,10 @@ FE_DGQ::fill_fe_values (const Mapping &mapping, data.shape_values(k,i) = fe_data.shape_values[k][i]; if (flags & update_gradients) - mapping.transform_covariant(data.shape_gradients[k], - fe_data.shape_gradients[k], - mapping_data, 0); + mapping.transform_covariant(data.shape_gradients[k].begin(), + data.shape_gradients[k].end(), + fe_data.shape_gradients[k].begin(), + mapping_data); } if (flags & update_second_derivatives) @@ -534,9 +535,10 @@ FE_DGQ::fill_fe_face_values (const Mapping &mapping, data.shape_values(k,i) = fe_data.shape_values[k][i+offset]; if (flags & update_gradients) - mapping.transform_covariant(data.shape_gradients[k], - fe_data.shape_gradients[k], - mapping_data, offset); + mapping.transform_covariant(data.shape_gradients[k].begin(), + data.shape_gradients[k].end(), + &fe_data.shape_gradients[k][offset], + mapping_data); } if (flags & update_second_derivatives) @@ -579,9 +581,10 @@ FE_DGQ::fill_fe_subface_values (const Mapping &mappi data.shape_values(k,i) = fe_data.shape_values[k][i+offset]; if (flags & update_gradients) - mapping.transform_covariant(data.shape_gradients[k], - fe_data.shape_gradients[k], - mapping_data, offset); + mapping.transform_covariant(data.shape_gradients[k].begin(), + data.shape_gradients[k].end(), + &fe_data.shape_gradients[k][offset], + mapping_data); } if (flags & update_second_derivatives) diff --git a/deal.II/deal.II/source/fe/fe_q.cc b/deal.II/deal.II/source/fe/fe_q.cc index 991d38236a..a63cb08ad8 100644 --- a/deal.II/deal.II/source/fe/fe_q.cc +++ b/deal.II/deal.II/source/fe/fe_q.cc @@ -1183,9 +1183,10 @@ FE_Q::fill_fe_values (const Mapping &mapping, data.shape_values(k,i) = fe_data.shape_values[k][i]; if (flags & update_gradients) - mapping.transform_covariant(data.shape_gradients[k], - fe_data.shape_gradients[k], - mapping_data, 0); + mapping.transform_covariant(data.shape_gradients[k].begin(), + data.shape_gradients[k].end(), + fe_data.shape_gradients[k].begin(), + mapping_data); } if (flags & update_second_derivatives) @@ -1226,9 +1227,10 @@ FE_Q::fill_fe_face_values (const Mapping &mapping, data.shape_values(k,i) = fe_data.shape_values[k][i+offset]; if (flags & update_gradients) - mapping.transform_covariant(data.shape_gradients[k], - fe_data.shape_gradients[k], - mapping_data, offset); + mapping.transform_covariant(data.shape_gradients[k].begin(), + data.shape_gradients[k].end(), + &fe_data.shape_gradients[k][offset], + mapping_data); } if (flags & update_second_derivatives) @@ -1271,9 +1273,10 @@ FE_Q::fill_fe_subface_values (const Mapping &mapping data.shape_values(k,i) = fe_data.shape_values[k][i+offset]; if (flags & update_gradients) - mapping.transform_covariant(data.shape_gradients[k], - fe_data.shape_gradients[k], - mapping_data, offset); + mapping.transform_covariant(data.shape_gradients[k].begin(), + data.shape_gradients[k].end(), + &fe_data.shape_gradients[k][offset], + mapping_data); } if (flags & update_second_derivatives) diff --git a/deal.II/deal.II/source/fe/mapping_cartesian.cc b/deal.II/deal.II/source/fe/mapping_cartesian.cc index 6c08421476..1a56f051f0 100644 --- a/deal.II/deal.II/source/fe/mapping_cartesian.cc +++ b/deal.II/deal.II/source/fe/mapping_cartesian.cc @@ -438,49 +438,58 @@ MappingCartesian<1>::fill_fe_subface_values (const DoFHandler<1>::cell_iterator template void -MappingCartesian::transform_covariant (typename std::vector > &dst, - const typename std::vector > &src, - const typename Mapping::InternalDataBase &mapping_data, - const unsigned int src_offset) const +MappingCartesian::transform_covariant ( + Tensor<1,dim>* begin, + const Tensor<1,dim>* end, + const Tensor<1,dim>* src, + const typename Mapping::InternalDataBase &mapping_data) const { - covariant_transformation(dst, src, mapping_data, src_offset); -} - + const InternalData &data = dynamic_cast (mapping_data); -template -void -MappingCartesian::transform_covariant (typename std::vector > &dst, - const typename std::vector > &src, - const typename Mapping::InternalDataBase &mapping_data, - const unsigned int src_offset) const -{ - covariant_transformation(dst, src, mapping_data, src_offset); + Assert (data.update_flags & update_covariant_transformation, + typename FEValuesBase::ExcAccessToUninitializedField()); + + // simply scale by inverse Jacobian + // (which is diagonal here) + while (begin!=end) + { + for (unsigned int d=0;d void -MappingCartesian::transform_contravariant (typename std::vector > &dst, - const typename std::vector > &src, - const typename Mapping::InternalDataBase &mapping_data, - const unsigned int src_offset) const +MappingCartesian::transform_contravariant ( + Tensor<1,dim>* begin, + const Tensor<1,dim>* end, + const Tensor<1,dim>* src, + const typename Mapping::InternalDataBase &mapping_data) const { - contravariant_transformation(dst, src, mapping_data, src_offset); -} - + // convert data object to internal + // data for this class. fails with + // an exception if that is not + // possible + const InternalData &data = dynamic_cast (mapping_data); + Assert (data.update_flags & update_contravariant_transformation, + typename FEValuesBase::ExcAccessToUninitializedField()); -template -void -MappingCartesian::transform_contravariant (typename std::vector > &dst, - const typename std::vector > &src, - const typename Mapping::InternalDataBase &mapping_data, - const unsigned int src_offset) const -{ - contravariant_transformation(dst, src, mapping_data, src_offset); + // simply scale by Jacobian + // (which is diagonal here) + while (begin!=end) + { + for (unsigned int d=0; d Point MappingCartesian::transform_unit_to_real_cell ( const typename Triangulation::cell_iterator cell, @@ -545,110 +554,7 @@ Point MappingCartesian::transform_real_to_unit_cell ( } - -template -template -void -MappingCartesian:: -contravariant_transformation (typename std::vector &dst, - const typename std::vector &src, - const typename Mapping::InternalDataBase &mapping_data, - const unsigned int src_offset) const -{ - Assert(tensor_::dimension==dim && tensor_::rank==1, ExcInvalidData()); - - // convert data object to internal - // data for this class. fails with - // an exception if that is not - // possible - const InternalData &data = dynamic_cast (mapping_data); - - Assert (data.update_flags & update_contravariant_transformation, - typename FEValuesBase::ExcAccessToUninitializedField()); - - typename std::vector::const_iterator vec = src.begin() + src_offset; - typename std::vector::iterator result = dst.begin(); - typename std::vector::const_iterator end = dst.end(); - - // simply scale by Jacobian - // (which is diagonal here) - while (result!=end) - { - for (unsigned int d=0; d -template -void -MappingCartesian:: -covariant_transformation (typename std::vector &dst, - const typename std::vector &src, - const typename Mapping::InternalDataBase &mapping_data, - const unsigned int src_offset) const -{ - Assert(tensor_::dimension==dim && tensor_::rank==1, ExcInvalidData()); - - // convert data object to internal - // data for this class. fails with - // an exception if that is not - // possible - const InternalData &data = dynamic_cast (mapping_data); - - Assert (data.update_flags & update_covariant_transformation, - typename FEValuesBase::ExcAccessToUninitializedField()); - - typename std::vector::const_iterator vec = src.begin() + src_offset; - typename std::vector::iterator result = dst.begin(); - typename std::vector::const_iterator end = dst.end(); - - // simply scale by inverse Jacobian - // (which is diagonal here) - while (result!=end) - { - for (unsigned int d=0;d; - -template void MappingCartesian:: -contravariant_transformation > ( - std::vector > &dst, - const std::vector > &src, - const Mapping::InternalDataBase& internal, - const unsigned int src_offset) const; - -template void MappingCartesian:: -contravariant_transformation > ( - std::vector > &dst, - const std::vector > &src, - const Mapping::InternalDataBase& internal, - const unsigned int src_offset) const; - -template void MappingCartesian:: -covariant_transformation > ( - std::vector > &dst, - const std::vector > &src, - const Mapping::InternalDataBase& internal, - const unsigned int src_offset) const; - -template void MappingCartesian:: -covariant_transformation > ( - std::vector > &dst, - const std::vector > &src, - const Mapping::InternalDataBase& internal, - const unsigned int src_offset) const; diff --git a/deal.II/deal.II/source/fe/mapping_q.cc b/deal.II/deal.II/source/fe/mapping_q.cc index bdad90bbfe..98e5a36e23 100644 --- a/deal.II/deal.II/source/fe/mapping_q.cc +++ b/deal.II/deal.II/source/fe/mapping_q.cc @@ -1068,113 +1068,67 @@ MappingQ::fill_quad_support_points_simple (const typename Triangulation void -MappingQ::transform_covariant (typename std::vector > &dst, - const typename std::vector > &src, - const typename Mapping::InternalDataBase &mapping_data, - const unsigned int src_offset) const +MappingQ::transform_covariant ( + Tensor<1,dim>* begin, + const Tensor<1,dim>* end, + const Tensor<1,dim>* src, + const typename Mapping::InternalDataBase &mapping_data) const { - const typename MappingQ1::InternalData *q1_data_ptr = + const typename MappingQ1::InternalData *q1_data = dynamic_cast::InternalData *> (&mapping_data); - Assert(q1_data_ptr!=0, ExcInternalError()); - const typename MappingQ1::InternalData &q1_data=*q1_data_ptr; + Assert(q1_data!=0, ExcInternalError()); + + typename std::vector >::const_iterator tensor; - if (q1_data.is_mapping_q1_data) - covariant_transformation(dst, src, q1_data, src_offset); + if (q1_data->is_mapping_q1_data) + tensor = q1_data->covariant.begin(); else { - const InternalData *data_ptr = dynamic_cast (q1_data_ptr); - Assert(data_ptr!=0, ExcInternalError()); - const InternalData &data=*data_ptr; + const InternalData *data = dynamic_cast (q1_data); + Assert(data!=0, ExcInternalError()); - if (data.use_mapping_q1_on_current_cell) - covariant_transformation(dst, src, data.mapping_q1_data, src_offset); + if (data->use_mapping_q1_on_current_cell) + tensor = data->mapping_q1_data.covariant.begin(); else - covariant_transformation(dst, src, data, src_offset); + tensor = data->covariant.begin(); } -} - - -template -void -MappingQ::transform_covariant (typename std::vector > &dst, - const typename std::vector > &src, - const typename Mapping::InternalDataBase &mapping_data, - const unsigned int src_offset) const -{ - const typename MappingQ1::InternalData *q1_data_ptr = - dynamic_cast::InternalData *> (&mapping_data); - Assert(q1_data_ptr!=0, ExcInternalError()); - const typename MappingQ1::InternalData &q1_data=*q1_data_ptr; - - if (q1_data.is_mapping_q1_data) - covariant_transformation(dst, src, q1_data, src_offset); - else + while (begin!=end) { - const InternalData *data_ptr = dynamic_cast (q1_data_ptr); - Assert(data_ptr!=0, ExcInternalError()); - const InternalData &data=*data_ptr; - - if (data.use_mapping_q1_on_current_cell) - covariant_transformation(dst, src, data.mapping_q1_data, src_offset); - else - covariant_transformation(dst, src, data, src_offset); - } + contract (*(begin++), *(src++), *(tensor++)); + } } template void -MappingQ::transform_contravariant (typename std::vector > &dst, - const typename std::vector > &src, - const typename Mapping::InternalDataBase &mapping_data, - const unsigned int src_offset) const +MappingQ::transform_contravariant ( + Tensor<1,dim>* begin, + const Tensor<1,dim>* end, + const Tensor<1,dim>* src, + const typename Mapping::InternalDataBase &mapping_data) const { - const typename MappingQ1::InternalData *q1_data_ptr = + const typename MappingQ1::InternalData *q1_data = dynamic_cast::InternalData *> (&mapping_data); - Assert(q1_data_ptr!=0, ExcInternalError()); - const typename MappingQ1::InternalData &q1_data=*q1_data_ptr; + Assert(q1_data!=0, ExcInternalError()); + + typename std::vector >::const_iterator tensor; - if (q1_data.is_mapping_q1_data) - contravariant_transformation(dst, src, q1_data, src_offset); + if (q1_data->is_mapping_q1_data) + tensor = q1_data->contravariant.begin(); else { - const InternalData *data_ptr = dynamic_cast (q1_data_ptr); - Assert(data_ptr!=0, ExcInternalError()); - const InternalData &data=*data_ptr; + const InternalData *data = dynamic_cast (q1_data); + Assert(data!=0, ExcInternalError()); - if (data.use_mapping_q1_on_current_cell) - contravariant_transformation(dst, src, data.mapping_q1_data, src_offset); + if (data->use_mapping_q1_on_current_cell) + tensor = data->mapping_q1_data.contravariant.begin(); else - contravariant_transformation(dst, src, data, src_offset); + tensor = data->contravariant.begin(); } -} - - -template -void -MappingQ::transform_contravariant (typename std::vector > &dst, - const typename std::vector > &src, - const typename Mapping::InternalDataBase &mapping_data, - const unsigned int src_offset) const -{ - const typename MappingQ1::InternalData *q1_data_ptr = - dynamic_cast::InternalData *> (&mapping_data); - Assert(q1_data_ptr!=0, ExcInternalError()); - const typename MappingQ1::InternalData &q1_data=*q1_data_ptr; - - if (q1_data.is_mapping_q1_data) - contravariant_transformation(dst, src, q1_data, src_offset); - else + while (begin!=end) { - const InternalData *data_ptr = dynamic_cast (q1_data_ptr); - Assert(data_ptr!=0, ExcInternalError()); - const InternalData &data=*data_ptr; - - if (data.use_mapping_q1_on_current_cell) - contravariant_transformation(dst, src, data.mapping_q1_data, src_offset); - else - contravariant_transformation(dst, src, data, src_offset); - } + contract (*(begin++), *(tensor++), *(src++)); + } } diff --git a/deal.II/deal.II/source/fe/mapping_q1.cc b/deal.II/deal.II/source/fe/mapping_q1.cc index fce9cbfb5c..54973f58a2 100644 --- a/deal.II/deal.II/source/fe/mapping_q1.cc +++ b/deal.II/deal.II/source/fe/mapping_q1.cc @@ -602,9 +602,10 @@ MappingQ1::compute_fill_face (const typename DoFHandler::cell_iterator ExcDimensionMismatch(JxW_values.size(), npts)); - transform_contravariant(data.aux[0], - data.unit_tangentials[face_no], - data, 0); + transform_contravariant(data.aux[0].begin(), + data.aux[0].end(), + data.unit_tangentials[face_no].begin(), + data); typename std::vector >::iterator result = boundary_forms.begin(); @@ -624,10 +625,11 @@ MappingQ1::compute_fill_face (const typename DoFHandler::cell_iterator case 3: { - transform_contravariant(data.aux[1], + transform_contravariant(data.aux[1].begin(), + data.aux[1].end(), data.unit_tangentials[ - face_no+GeometryInfo::faces_per_cell], - data, 0); + face_no+GeometryInfo::faces_per_cell].begin(), + data); typename std::vector >::const_iterator tang2 = data.aux[1].begin(); for (;result != end; ++result, ++tang1, ++tang2) @@ -777,47 +779,54 @@ MappingQ1<1>::fill_fe_subface_values (const DoFHandler<1>::cell_iterator &, template void -MappingQ1::transform_covariant (std::vector > &dst, - const std::vector > &src, - const typename Mapping::InternalDataBase &mapping_data, - const unsigned int src_offset) const +MappingQ1::transform_covariant ( + Tensor<1,dim>* begin, + const Tensor<1,dim>* end, + const Tensor<1,dim>* src, + const typename Mapping::InternalDataBase &mapping_data) const { - covariant_transformation(dst, src, mapping_data, src_offset); -} + const InternalData *data_ptr = dynamic_cast (&mapping_data); + Assert(data_ptr!=0, ExcInternalError()); + const InternalData &data=*data_ptr; + Assert (data.update_flags & update_covariant_transformation, + typename FEValuesBase::ExcAccessToUninitializedField()); -template -void -MappingQ1::transform_covariant (std::vector > &dst, - const std::vector > &src, - const typename Mapping::InternalDataBase &mapping_data, - const unsigned int src_offset) const -{ - covariant_transformation(dst, src, mapping_data, src_offset); -} +//TODO: [GK] Can we do a similar assertion? +// Assert (dst.size() == data.contravariant.size(), +// ExcDimensionMismatch(dst.size() + src_offset, data.contravariant.size())); -template -void -MappingQ1::transform_contravariant (std::vector > &dst, - const std::vector > &src, - const typename Mapping::InternalDataBase &mapping_data, - const unsigned int src_offset) const -{ - contravariant_transformation(dst, src, mapping_data, src_offset); + typename std::vector >::const_iterator tensor = data.covariant.begin(); + + while (begin!=end) + { + contract (*(begin++), *(src++), *(tensor++)); + } } template void -MappingQ1::transform_contravariant (std::vector > &dst, - const std::vector > &src, - const typename Mapping::InternalDataBase &mapping_data, - const unsigned int src_offset) const +MappingQ1::transform_contravariant ( + Tensor<1,dim>* begin, + const Tensor<1,dim>* end, + const Tensor<1,dim>* src, + const typename Mapping::InternalDataBase &mapping_data) const { - contravariant_transformation(dst, src, mapping_data, src_offset); -} + const InternalData* data_ptr = dynamic_cast (&mapping_data); + Assert(data_ptr!=0, ExcInternalError()); + const InternalData &data=*data_ptr; + Assert (data.update_flags & update_contravariant_transformation, + typename FEValuesBase::ExcAccessToUninitializedField()); + typename std::vector >::const_iterator tensor = data.contravariant.begin(); + + while (begin!=end) + { + contract (*(begin++), *(tensor++), *(src++)); + } +} template Point MappingQ1::transform_unit_to_real_cell ( @@ -965,103 +974,6 @@ void MappingQ1::transform_real_to_unit_cell_internal ( } } - - -template -template -void -MappingQ1::contravariant_transformation (std::vector &dst, - const std::vector &src, - const typename Mapping::InternalDataBase &mapping_data, - const unsigned int src_offset) const -{ - 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; - - Assert (data.update_flags & update_contravariant_transformation, - typename FEValuesBase::ExcAccessToUninitializedField()); - - Assert (src.size() + src_offset >= data.contravariant.size(), - ExcDimensionMismatch(src.size(), data.contravariant.size())); - Assert (dst.size() == data.contravariant.size(), - ExcDimensionMismatch(dst.size(), data.contravariant.size())); - - typename std::vector::const_iterator vec = src.begin()+src_offset; - typename std::vector >::const_iterator tensor = data.contravariant.begin(); - typename std::vector::iterator result = dst.begin(); - typename std::vector::const_iterator end = dst.end(); - - while (result!=end) - { - contract (*(result++), *(tensor++), *(vec++)); - } -} - - -template -template -void -MappingQ1::covariant_transformation (std::vector &dst, - const std::vector &src, - const typename Mapping::InternalDataBase &mapping_data, - const unsigned int src_offset) const -{ - 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; - - Assert (data.update_flags & update_covariant_transformation, - typename FEValuesBase::ExcAccessToUninitializedField()); - - Assert (src.size() + src_offset >= data.contravariant.size(), - ExcDimensionMismatch(src.size() + src_offset, data.contravariant.size())); - Assert (dst.size() == data.contravariant.size(), - ExcDimensionMismatch(dst.size() + src_offset, data.contravariant.size())); - - typename std::vector::const_iterator vec = src.begin() + src_offset; - typename std::vector >::const_iterator tensor = data.covariant.begin(); - typename std::vector::iterator result = dst.begin(); - const typename std::vector::const_iterator end = dst.end(); - - while (result!=end) - { - contract (*(result++), *(vec++), *(tensor++)); - } -} - - - //----------------------------------------------------------------------// template class MappingQ1; - -template void MappingQ1:: -contravariant_transformation > ( - std::vector > &dst, - const std::vector > &src, - const Mapping::InternalDataBase& internal, - const unsigned int src_offset) const; - -template void MappingQ1:: -contravariant_transformation > ( - std::vector > &dst, - const std::vector > &src, - const Mapping::InternalDataBase& internal, - const unsigned int src_offset) const; - -template void MappingQ1:: -covariant_transformation > ( - std::vector > &dst, - const std::vector > &src, - const Mapping::InternalDataBase& internal, - const unsigned int src_offset) const; - -template void MappingQ1:: -covariant_transformation > ( - std::vector > &dst, - const std::vector > &src, - const Mapping::InternalDataBase& internal, - const unsigned int src_offset) const;