From: wolf Date: Mon, 7 Jun 2004 14:42:34 +0000 (+0000) Subject: Change the way the transform_{co,contra}variant functions work, by providing them... X-Git-Url: https://gitweb.dealii.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=82343b1d79c0316dbce0bf45d5db0ffd176c4ae6;p=dealii-svn.git Change the way the transform_{co,contra}variant functions work, by providing them vectors to work on instead of pointers. This will allow to run our whole testsuite with the gcc3.4 debug libstdc++ finally. git-svn-id: https://svn.dealii.org/trunk@9391 0785d39b-7218-0410-832d-ea1e28bc413d --- diff --git a/deal.II/deal.II/include/fe/fe_nedelec.h b/deal.II/deal.II/include/fe/fe_nedelec.h index 0fd9674dc5..4755163d5a 100644 --- a/deal.II/deal.II/include/fe/fe_nedelec.h +++ b/deal.II/deal.II/include/fe/fe_nedelec.h @@ -580,7 +580,7 @@ class FE_Nedelec : public FiniteElement * multiplication with the * Jacobian of the mapping. */ - Table<2,Tensor<1,dim> > shape_values; + std::vector > > shape_values; /** * Array with shape function @@ -600,7 +600,7 @@ class FE_Nedelec : public FiniteElement * multiplication) when * visiting an actual cell. */ - Table<2,Tensor<2,dim> > shape_gradients; + std::vector > > shape_gradients; }; /** diff --git a/deal.II/deal.II/include/fe/fe_poly.h b/deal.II/deal.II/include/fe/fe_poly.h index 8a96788969..39818dcba2 100644 --- a/deal.II/deal.II/include/fe/fe_poly.h +++ b/deal.II/deal.II/include/fe/fe_poly.h @@ -375,7 +375,7 @@ class FE_Poly : public FiniteElement * them over when visiting a * concrete cell. */ - Table<2,double> shape_values; + std::vector > shape_values; /** * Array with shape function @@ -395,7 +395,7 @@ class FE_Poly : public FiniteElement * multiplication) when * visiting an actual cell. */ - Table<2,Tensor<1,dim> > shape_gradients; + std::vector > > shape_gradients; }; /** diff --git a/deal.II/deal.II/include/fe/fe_raviart_thomas.h b/deal.II/deal.II/include/fe/fe_raviart_thomas.h index 60051acb76..9532dc1b4d 100644 --- a/deal.II/deal.II/include/fe/fe_raviart_thomas.h +++ b/deal.II/deal.II/include/fe/fe_raviart_thomas.h @@ -540,7 +540,7 @@ class FE_RaviartThomas : public FiniteElement * multiplication with the * Jacobian of the mapping. */ - Table<2,Tensor<1,dim> > shape_values; + std::vector > > shape_values; /** * Array with shape function @@ -560,7 +560,7 @@ class FE_RaviartThomas : public FiniteElement * multiplication) when * visiting an actual cell. */ - Table<2,Tensor<2,dim> > shape_gradients; + std::vector > > shape_gradients; }; /** diff --git a/deal.II/deal.II/include/fe/fe_values.h b/deal.II/deal.II/include/fe/fe_values.h index 7a411f215c..d1acd508cc 100644 --- a/deal.II/deal.II/include/fe/fe_values.h +++ b/deal.II/deal.II/include/fe/fe_values.h @@ -105,13 +105,13 @@ class FEValuesData * is the same as for the * ShapeVector data type. */ - typedef Table<2,Tensor<1,dim> > GradientVector; + typedef std::vector > > GradientVector; /** * Likewise for second order * derivatives. */ - typedef Table<2,Tensor<2,dim> > GradGradVector; + typedef std::vector > > GradGradVector; /** * Store the values of the shape @@ -1342,10 +1342,10 @@ FEValuesBase::shape_grad (const unsigned int i, ExcAccessToUninitializedField()); Assert (fe->is_primitive (i), ExcShapeFunctionNotPrimitive(i)); - Assert (ishape_gradients.n_rows(), - ExcIndexRange (i, 0, this->shape_gradients.n_rows())); - Assert (jshape_gradients.n_cols(), - ExcIndexRange (j, 0, this->shape_gradients.n_cols())); + Assert (ishape_gradients.size(), + ExcIndexRange (i, 0, this->shape_gradients.size())); + Assert (jshape_gradients[0].size(), + ExcIndexRange (j, 0, this->shape_gradients[0].size())); // if the entire FE is primitive, // then we can take a short-cut: @@ -1438,10 +1438,10 @@ FEValuesBase::shape_2nd_derivative (const unsigned int i, ExcAccessToUninitializedField()); Assert (fe->is_primitive (i), ExcShapeFunctionNotPrimitive(i)); - Assert (ishape_2nd_derivatives.n_rows(), - ExcIndexRange (i, 0, this->shape_2nd_derivatives.n_rows())); - Assert (jshape_2nd_derivatives.n_cols(), - ExcIndexRange (j, 0, this->shape_2nd_derivatives.n_cols())); + Assert (ishape_2nd_derivatives.size(), + ExcIndexRange (i, 0, this->shape_2nd_derivatives.size())); + Assert (jshape_2nd_derivatives[0].size(), + ExcIndexRange (j, 0, this->shape_2nd_derivatives[0].size())); // if the entire FE is primitive, // then we can take a short-cut: diff --git a/deal.II/deal.II/include/fe/mapping.h b/deal.II/deal.II/include/fe/mapping.h index e6ca902b5c..5613229587 100644 --- a/deal.II/deal.II/include/fe/mapping.h +++ b/deal.II/deal.II/include/fe/mapping.h @@ -2,7 +2,7 @@ // $Id$ // Version: $Name$ // -// Copyright (C) 2000, 2001, 2002, 2003 by the deal.II authors +// Copyright (C) 2000, 2001, 2002, 2003, 2004 by the deal.II authors // // This file is subject to QPL and may not be distributed // without copyright and license information. Please refer @@ -237,33 +237,23 @@ class Mapping : public Subscriptor * transpose if the inverse * matrix. * - * The range of vectors spanned - * by @p begin and @p end must - * have as many elements as there - * are quadrature points (not - * tested inside the function). - * Also note the different - * convention for parameters - * compared to the standard C++ - * @p transform function: here, - * first destination, then source - * are specified, and the number - * of elements is determined by a - * range of destination - * vectors. This convention is - * due to the way the function is - * usually called. - * - * The vector @p src must - * contain at least as many - * elements as there are - * quadrature points. + * The list of arguments is as follows: + * we transform as many elements in the + * @p input field, starting from @offset, + * as there are elements in @p + * output. The @p input array may hold + * more elements than are needed (some + * finite element classes use this for a + * denser storage of data), but it needs + * to have at least + * output.size() elements + * starting with element @p offset. */ virtual void - transform_covariant (Tensor<1,dim> *begin, - Tensor<1,dim> *end, - const Tensor<1,dim> *src, + transform_covariant (const std::vector > &input, + const unsigned int offset, + std::vector > &output, const InternalDataBase &internal) const = 0; /** @@ -276,13 +266,13 @@ class Mapping : public Subscriptor * * The same applies as to the * function above regarding input - * and output ranges. + * and output arguments. */ virtual void - transform_covariant (Tensor<2,dim> *begin, - Tensor<2,dim> *end, - const Tensor<2,dim> *src, + transform_covariant (const std::vector > &input, + const unsigned int offset, + std::vector > &output, const InternalDataBase &internal) const = 0; /** @@ -294,34 +284,24 @@ class Mapping : public Subscriptor * of the transformation from * unit to real space cell. * - * The range of vectors spanned - * by @p begin and @p end must - * have as many elements as there - * are quadrature points (not - * tested inside the function). - * Also note the different - * convention for parameters - * compared to the standard C++ - * @p transform function: here, - * first destination, then source - * are specified, and the number - * of elements is determined by a - * range of destination - * vectors. This convention is - * due to the way the function is - * usually called. - * - * The vector @p src must - * contain at least as many - * elements as there are - * quadrature points. + * The list of arguments is as follows: + * we transform as many elements in the + * @p input field, starting from @offset, + * as there are elements in @p + * output. The @p input array may hold + * more elements than are needed (some + * finite element classes use this for a + * denser storage of data), but it needs + * to have at least + * output.size() elements + * starting with element @p offset. */ virtual void - transform_contravariant (Tensor<1,dim> *begin, - Tensor<1,dim> *end, - const Tensor<1,dim> *src, - const InternalDataBase &internal) const = 0; + transform_contravariant (const std::vector > &input, + const unsigned int offset, + std::vector > &output, + const typename Mapping::InternalDataBase &internal) const = 0; /** * Transform a set of matrices @@ -340,14 +320,14 @@ class Mapping : public Subscriptor * * The same applies as to the * function above regarding input - * and output ranges. + * and output arguments. */ - virtual - void - transform_contravariant (Tensor<2,dim> *begin, - Tensor<2,dim> *end, - const Tensor<2,dim> *src, - const InternalDataBase &internal) const = 0; + + virtual void + transform_contravariant (const std::vector > &intput, + const unsigned int offset, + std::vector > &output, + const typename Mapping::InternalDataBase &internal) const = 0; /** * Indicate fields to be updated diff --git a/deal.II/deal.II/include/fe/mapping_cartesian.h b/deal.II/deal.II/include/fe/mapping_cartesian.h index 017e524129..b174e0969f 100644 --- a/deal.II/deal.II/include/fe/mapping_cartesian.h +++ b/deal.II/deal.II/include/fe/mapping_cartesian.h @@ -80,28 +80,44 @@ class MappingCartesian : public Mapping std::vector > &boundary_form, std::vector > &normal_vectors) const ; + /** + * Implementation of the + * interface in Mapping. + */ virtual void - transform_covariant (Tensor<1,dim> *begin, - Tensor<1,dim> *end, - const Tensor<1,dim> *src, + transform_covariant (const std::vector > &input, + const unsigned int offset, + std::vector > &output, const typename Mapping::InternalDataBase &internal) const; + /** + * Implementation of the + * interface in Mapping. + */ virtual void - transform_covariant (Tensor<2,dim> *begin, - Tensor<2,dim> *end, - const Tensor<2,dim> *src, + transform_covariant (const std::vector > &input, + const unsigned int offset, + std::vector > &output, const typename Mapping::InternalDataBase &internal) const; + /** + * Implementation of the + * interface in Mapping. + */ virtual void - transform_contravariant (Tensor<1,dim> *begin, - Tensor<1,dim> *end, - const Tensor<1,dim> *src, + transform_contravariant (const std::vector > &input, + const unsigned int offset, + std::vector > &output, const typename Mapping::InternalDataBase &internal) const; + /** + * Implementation of the + * interface in Mapping. + */ virtual void - transform_contravariant (Tensor<2,dim> *begin, - Tensor<2,dim> *end, - const Tensor<2,dim> *src, + transform_contravariant (const std::vector > &input, + const unsigned int offset, + std::vector > &output, const typename Mapping::InternalDataBase &internal) const; virtual Point diff --git a/deal.II/deal.II/include/fe/mapping_q.h b/deal.II/deal.II/include/fe/mapping_q.h index e5e439ccaa..100b4fc952 100644 --- a/deal.II/deal.II/include/fe/mapping_q.h +++ b/deal.II/deal.II/include/fe/mapping_q.h @@ -82,9 +82,9 @@ class MappingQ : public MappingQ1 * interface in Mapping. */ virtual void - transform_covariant (Tensor<1,dim> *begin, - Tensor<1,dim> *end, - const Tensor<1,dim> *src, + transform_covariant (const std::vector > &input, + const unsigned int offset, + std::vector > &output, const typename Mapping::InternalDataBase &internal) const; /** @@ -92,9 +92,9 @@ class MappingQ : public MappingQ1 * interface in Mapping. */ virtual void - transform_covariant (Tensor<2,dim> *begin, - Tensor<2,dim> *end, - const Tensor<2,dim> *src, + transform_covariant (const std::vector > &input, + const unsigned int offset, + std::vector > &output, const typename Mapping::InternalDataBase &internal) const; /** @@ -102,9 +102,9 @@ class MappingQ : public MappingQ1 * interface in Mapping. */ virtual void - transform_contravariant (Tensor<1,dim> *begin, - Tensor<1,dim> *end, - const Tensor<1,dim> *src, + transform_contravariant (const std::vector > &input, + const unsigned int offset, + std::vector > &output, const typename Mapping::InternalDataBase &internal) const; /** @@ -112,9 +112,9 @@ class MappingQ : public MappingQ1 * interface in Mapping. */ virtual void - transform_contravariant (Tensor<2,dim> *begin, - Tensor<2,dim> *end, - const Tensor<2,dim> *src, + transform_contravariant (const std::vector > &intput, + const unsigned int offset, + std::vector > &output, const typename Mapping::InternalDataBase &internal) const; /** diff --git a/deal.II/deal.II/include/fe/mapping_q1.h b/deal.II/deal.II/include/fe/mapping_q1.h index acc75f0021..c67cd38f12 100644 --- a/deal.II/deal.II/include/fe/mapping_q1.h +++ b/deal.II/deal.II/include/fe/mapping_q1.h @@ -86,9 +86,9 @@ class MappingQ1 : public Mapping * Mapping. */ virtual void - transform_covariant (Tensor<1,dim> *begin, - Tensor<1,dim> *end, - const Tensor<1,dim> *src, + transform_covariant (const std::vector > &input, + const unsigned int offset, + std::vector > &output, const typename Mapping::InternalDataBase &internal) const; /** @@ -96,9 +96,9 @@ class MappingQ1 : public Mapping * Mapping. */ virtual void - transform_covariant (Tensor<2,dim> *begin, - Tensor<2,dim> *end, - const Tensor<2,dim> *src, + transform_covariant (const std::vector > &input, + const unsigned int offset, + std::vector > &output, const typename Mapping::InternalDataBase &internal) const; /** @@ -106,9 +106,9 @@ class MappingQ1 : public Mapping * Mapping. */ virtual void - transform_contravariant (Tensor<1,dim> *begin, - Tensor<1,dim> *end, - const Tensor<1,dim> *src, + transform_contravariant (const std::vector > &input, + const unsigned int offset, + std::vector > &output, const typename Mapping::InternalDataBase &internal) const; /** @@ -116,9 +116,9 @@ class MappingQ1 : public Mapping * Mapping. */ virtual void - transform_contravariant (Tensor<2,dim> *begin, - Tensor<2,dim> *end, - const Tensor<2,dim> *src, + transform_contravariant (const std::vector > &intput, + const unsigned int offset, + std::vector > &output, const typename Mapping::InternalDataBase &internal) const; /** @@ -305,12 +305,12 @@ class MappingQ1 : public Mapping * * Filled once. */ - Table<2,Tensor<1,dim> > unit_tangentials; + std::vector > > unit_tangentials; /** - * Auxuliary vectors for internal use. + * Auxiliary vectors for internal use. */ - Table<2,Tensor<1,dim> > aux; + std::vector > > aux; /** * Stores the support points of diff --git a/deal.II/deal.II/source/fe/fe.cc b/deal.II/deal.II/source/fe/fe.cc index bb210972e0..a5f0fdd22a 100644 --- a/deal.II/deal.II/source/fe/fe.cc +++ b/deal.II/deal.II/source/fe/fe.cc @@ -478,10 +478,10 @@ compute_2nd (const Mapping &mapping, n_nonzero_components_table.end(), 0U); - Assert (data.shape_2nd_derivatives.n_rows() == total_nonzero_components, + Assert (data.shape_2nd_derivatives.size() == total_nonzero_components, ExcInternalError()); // Number of quadrature points - const unsigned int n_q_points = data.shape_2nd_derivatives.n_cols(); + const unsigned int n_q_points = data.shape_2nd_derivatives[0].size(); // first reinit the fe_values // objects used for the finite @@ -496,7 +496,8 @@ compute_2nd (const Mapping &mapping, // quotients of gradients in each // direction (first index) and at // all q-points (second index) - Table<2,Tensor<1,dim> > diff_quot (dim, n_q_points); + std::vector > > + diff_quot (dim, std::vector > (n_q_points)); std::vector > diff_quot2 (n_q_points); // for all nonzero components of @@ -588,13 +589,13 @@ compute_2nd (const Mapping &mapping, Assert (diff_quot2.size() <= diff_quot[d].size(), ExcInternalError()); - mapping.transform_covariant (&*diff_quot2.begin(), &*diff_quot2.end(), - diff_quot[d].begin(), + mapping.transform_covariant (diff_quot[d], 0, diff_quot2, mapping_internal); for (unsigned int q=0; q::get_data (const UpdateFlags update_flags, // necessary. otherwise, don't // allocate memory if (flags & update_values) - data->shape_values.reinit (this->dofs_per_cell, n_q_points); + data->shape_values.resize (this->dofs_per_cell, + std::vector > (n_q_points)); if (flags & update_gradients) - data->shape_gradients.reinit (this->dofs_per_cell, n_q_points); + data->shape_gradients.resize (this->dofs_per_cell, + std::vector > (n_q_points)); // if second derivatives through // finite differencing is required, @@ -1021,9 +1023,8 @@ FE_Nedelec::fill_fe_values (const Mapping &mapping, // values... Assert (fe_data.shape_values[k].size() == n_q_points, ExcInternalError()); - mapping.transform_covariant(&*shape_values.begin(), - &*shape_values.end(), - fe_data.shape_values[k].begin(), + mapping.transform_covariant(fe_data.shape_values[k], 0, + shape_values, mapping_data); // then copy over to target: @@ -1039,9 +1040,9 @@ FE_Nedelec::fill_fe_values (const Mapping &mapping, std::vector > shape_grads1 (n_q_points); std::vector > shape_grads2 (n_q_points); - Assert (data.shape_gradients.n_rows() == this->dofs_per_cell * dim, + Assert (data.shape_gradients.size() == this->dofs_per_cell * dim, ExcInternalError()); - Assert (data.shape_gradients.n_cols() == n_q_points, + Assert (data.shape_gradients[0].size() == n_q_points, ExcInternalError()); // loop over all shape @@ -1072,17 +1073,14 @@ FE_Nedelec::fill_fe_values (const Mapping &mapping, Assert (fe_data.shape_gradients[k].size() == n_q_points, ExcInternalError()); // do first transformation - mapping.transform_covariant(&*shape_grads1.begin(), - &*shape_grads1.end(), - fe_data.shape_gradients[k].begin(), + mapping.transform_covariant(fe_data.shape_gradients[k], 0, + shape_grads1, mapping_data); // transpose matrix for (unsigned int q=0; q::fill_fe_face_values (const Mapping &mapp // check size of array. in 3d, // we have faces oriented both // ways - Assert (fe_data.shape_values.n_cols() == + Assert (fe_data.shape_values[0].size() == GeometryInfo::faces_per_cell * n_q_points * (dim == 3 ? 2 : 1), ExcInternalError()); @@ -1165,9 +1163,8 @@ FE_Nedelec::fill_fe_face_values (const Mapping &mapp { // first transform shape // values... - mapping.transform_covariant(&*shape_values.begin(), - &*shape_values.end(), - fe_data.shape_values[k].begin()+offset, + mapping.transform_covariant(fe_data.shape_values[k], offset, + shape_values, mapping_data); // then copy over to target: @@ -1183,7 +1180,7 @@ FE_Nedelec::fill_fe_face_values (const Mapping &mapp // check size of array. in 3d, // we have faces oriented both // ways - Assert (fe_data.shape_gradients.n_cols() == + Assert (fe_data.shape_gradients[0].size() == GeometryInfo::faces_per_cell * n_q_points * (dim == 3 ? 2 : 1), ExcInternalError()); @@ -1191,9 +1188,9 @@ FE_Nedelec::fill_fe_face_values (const Mapping &mapp std::vector > shape_grads1 (n_q_points); std::vector > shape_grads2 (n_q_points); - Assert (data.shape_gradients.n_rows() == this->dofs_per_cell * dim, + Assert (data.shape_gradients.size() == this->dofs_per_cell * dim, ExcInternalError()); - Assert (data.shape_gradients.n_cols() == n_q_points, + Assert (data.shape_gradients[0].size() == n_q_points, ExcInternalError()); // loop over all shape @@ -1223,17 +1220,14 @@ FE_Nedelec::fill_fe_face_values (const Mapping &mapp // little in between // // do first transformation - mapping.transform_covariant(&*shape_grads1.begin(), - &*shape_grads1.end(), - fe_data.shape_gradients[k].begin()+offset, + mapping.transform_covariant(fe_data.shape_gradients[k], offset, + shape_grads1, mapping_data); // transpose matrix for (unsigned int q=0; q::fill_fe_subface_values (const Mapping &m // number of conversions if (flags & update_values) { - Assert (fe_data.shape_values.n_cols() == + Assert (fe_data.shape_values[0].size() == GeometryInfo::subfaces_per_face * GeometryInfo::faces_per_cell * n_q_points, @@ -1313,9 +1307,8 @@ FE_Nedelec::fill_fe_subface_values (const Mapping &m { // first transform shape // values... - mapping.transform_covariant(&*shape_values.begin(), - &*shape_values.end(), - fe_data.shape_values[k].begin()+offset, + mapping.transform_covariant(fe_data.shape_values[k], offset, + shape_values, mapping_data); // then copy over to target: @@ -1328,7 +1321,7 @@ FE_Nedelec::fill_fe_subface_values (const Mapping &m if (flags & update_gradients) { - Assert (fe_data.shape_gradients.n_cols() == + Assert (fe_data.shape_gradients.size() == GeometryInfo::faces_per_cell * GeometryInfo::subfaces_per_face * n_q_points, @@ -1337,9 +1330,9 @@ FE_Nedelec::fill_fe_subface_values (const Mapping &m std::vector > shape_grads1 (n_q_points); std::vector > shape_grads2 (n_q_points); - Assert (data.shape_gradients.n_rows() == this->dofs_per_cell * dim, + Assert (data.shape_gradients.size() == this->dofs_per_cell * dim, ExcInternalError()); - Assert (data.shape_gradients.n_cols() == n_q_points, + Assert (data.shape_gradients[0].size() == n_q_points, ExcInternalError()); // loop over all shape @@ -1369,17 +1362,14 @@ FE_Nedelec::fill_fe_subface_values (const Mapping &m // little in between // // do first transformation - mapping.transform_covariant(&*shape_grads1.begin(), - &*shape_grads1.end(), - fe_data.shape_gradients[k].begin()+offset, + mapping.transform_covariant(fe_data.shape_gradients[k], offset, + shape_grads1, mapping_data); // transpose matrix for (unsigned int q=0; q::get_data (const UpdateFlags update_flags, if (flags & update_values) { values.resize (this->dofs_per_cell); - data->shape_values.reinit (this->dofs_per_cell, - n_q_points); + data->shape_values.resize (this->dofs_per_cell, + std::vector (n_q_points)); } if (flags & update_gradients) { grads.resize (this->dofs_per_cell); - data->shape_gradients.reinit (this->dofs_per_cell, - n_q_points); + data->shape_gradients.resize (this->dofs_per_cell, + std::vector > (n_q_points)); } // if second derivatives through @@ -235,11 +235,11 @@ FE_Poly::get_data (const UpdateFlags update_flags, template void FE_Poly::fill_fe_values (const Mapping &mapping, - const typename DoFHandler::cell_iterator &cell, - const Quadrature &quadrature, - typename Mapping::InternalDataBase &mapping_data, - typename Mapping::InternalDataBase &fedata, - FEValuesData &data) const + const typename DoFHandler::cell_iterator &cell, + const Quadrature &quadrature, + typename Mapping::InternalDataBase &mapping_data, + typename Mapping::InternalDataBase &fedata, + FEValuesData &data) const { // convert data object to internal // data for this class. fails with @@ -260,11 +260,10 @@ FE_Poly::fill_fe_values (const Mapping &mapping Assert (data.shape_gradients[k].size() <= fe_data.shape_gradients[k].size(), ExcInternalError()); - mapping.transform_covariant(data.shape_gradients[k].begin(), - data.shape_gradients[k].end(), - fe_data.shape_gradients[k].begin(), + mapping.transform_covariant(fe_data.shape_gradients[k], 0, + data.shape_gradients[k], mapping_data); - }; + } } const typename QProjector::DataSetDescriptor dsd; @@ -313,11 +312,10 @@ FE_Poly::fill_fe_face_values (const Mapping &ma Assert (data.shape_gradients[k].size() + offset <= fe_data.shape_gradients[k].size(), ExcInternalError()); - mapping.transform_covariant(data.shape_gradients[k].begin(), - data.shape_gradients[k].end(), - fe_data.shape_gradients[k].begin()+offset, + mapping.transform_covariant(fe_data.shape_gradients[k], offset, + data.shape_gradients[k], mapping_data); - }; + } } if (flags & update_second_derivatives) @@ -365,11 +363,10 @@ FE_Poly::fill_fe_subface_values (const Mapping Assert (data.shape_gradients[k].size() + offset <= fe_data.shape_gradients[k].size(), ExcInternalError()); - mapping.transform_covariant(data.shape_gradients[k].begin(), - data.shape_gradients[k].end(), - fe_data.shape_gradients[k].begin()+offset, + mapping.transform_covariant(fe_data.shape_gradients[k], offset, + data.shape_gradients[k], mapping_data); - }; + } } if (flags & update_second_derivatives) diff --git a/deal.II/deal.II/source/fe/fe_raviart_thomas.cc b/deal.II/deal.II/source/fe/fe_raviart_thomas.cc index a7629aca33..e045278fe1 100644 --- a/deal.II/deal.II/source/fe/fe_raviart_thomas.cc +++ b/deal.II/deal.II/source/fe/fe_raviart_thomas.cc @@ -2,7 +2,7 @@ // $Id$ // Version: $Name$ // -// Copyright (C) 2003 by the deal.II authors +// Copyright (C) 2003, 2004 by the deal.II authors // // This file is subject to QPL and may not be distributed // without copyright and license information. Please refer @@ -1445,10 +1445,12 @@ FE_RaviartThomas::get_data (const UpdateFlags update_flags, // necessary. otherwise, don't // allocate memory if (flags & update_values) - data->shape_values.reinit (this->dofs_per_cell, n_q_points); + data->shape_values.resize (this->dofs_per_cell, + std::vector > (n_q_points)); if (flags & update_gradients) - data->shape_gradients.reinit (this->dofs_per_cell, n_q_points); + data->shape_gradients.resize (this->dofs_per_cell, + std::vector > (n_q_points)); // if second derivatives through // finite differencing is required, @@ -1535,9 +1537,8 @@ FE_RaviartThomas::fill_fe_values (const Mapping &map // values... Assert (fe_data.shape_values[k].size() == n_q_points, ExcInternalError()); - mapping.transform_covariant(&*shape_values.begin(), - &*shape_values.end(), - fe_data.shape_values[k].begin(), + mapping.transform_covariant(fe_data.shape_values[k], 0, + shape_values, mapping_data); // then copy over to target: @@ -1553,9 +1554,9 @@ FE_RaviartThomas::fill_fe_values (const Mapping &map std::vector > shape_grads1 (n_q_points); std::vector > shape_grads2 (n_q_points); - Assert (data.shape_gradients.n_rows() == this->dofs_per_cell * dim, + Assert (data.shape_gradients.size() == this->dofs_per_cell * dim, ExcInternalError()); - Assert (data.shape_gradients.n_cols() == n_q_points, + Assert (data.shape_gradients[0].size() == n_q_points, ExcInternalError()); // loop over all shape @@ -1586,17 +1587,14 @@ FE_RaviartThomas::fill_fe_values (const Mapping &map Assert (fe_data.shape_gradients[k].size() == n_q_points, ExcInternalError()); // do first transformation - mapping.transform_covariant(&*shape_grads1.begin(), - &*shape_grads1.end(), - fe_data.shape_gradients[k].begin(), + mapping.transform_covariant(fe_data.shape_gradients[k], 0, + shape_grads1, mapping_data); // transpose matrix for (unsigned int q=0; q::fill_fe_face_values (const Mapping // number of conversions if (flags & update_values) { - Assert (fe_data.shape_values.n_cols() == + Assert (fe_data.shape_values.size() == GeometryInfo::faces_per_cell * n_q_points, ExcInternalError()); @@ -1675,9 +1673,8 @@ FE_RaviartThomas::fill_fe_face_values (const Mapping { // first transform shape // values... - mapping.transform_covariant(&*shape_values.begin(), - &*shape_values.end(), - fe_data.shape_values[k].begin()+offset, + mapping.transform_covariant(fe_data.shape_values[k], offset, + shape_values, mapping_data); // then copy over to target: @@ -1690,16 +1687,16 @@ FE_RaviartThomas::fill_fe_face_values (const Mapping if (flags & update_gradients) { - Assert (fe_data.shape_gradients.n_cols() == + Assert (fe_data.shape_gradients.size() == GeometryInfo::faces_per_cell * n_q_points, ExcInternalError()); std::vector > shape_grads1 (n_q_points); std::vector > shape_grads2 (n_q_points); - Assert (data.shape_gradients.n_rows() == this->dofs_per_cell * dim, + Assert (data.shape_gradients.size() == this->dofs_per_cell * dim, ExcInternalError()); - Assert (data.shape_gradients.n_cols() == n_q_points, + Assert (data.shape_gradients[0].size() == n_q_points, ExcInternalError()); // loop over all shape @@ -1729,17 +1726,14 @@ FE_RaviartThomas::fill_fe_face_values (const Mapping // little in between // // do first transformation - mapping.transform_covariant(&*shape_grads1.begin(), - &*shape_grads1.end(), - fe_data.shape_gradients[k].begin()+offset, + mapping.transform_covariant(fe_data.shape_gradients[k], offset, + shape_grads1, mapping_data); // transpose matrix for (unsigned int q=0; q::fill_fe_subface_values (const Mapping // number of conversions if (flags & update_values) { - Assert (fe_data.shape_values.n_cols() == + Assert (fe_data.shape_values[0].size() == GeometryInfo::faces_per_cell * GeometryInfo::subfaces_per_face * n_q_points, @@ -1819,9 +1813,8 @@ FE_RaviartThomas::fill_fe_subface_values (const Mapping { // first transform shape // values... - mapping.transform_covariant(&*shape_values.begin(), - &*shape_values.end(), - fe_data.shape_values[k].begin()+offset, + mapping.transform_covariant(fe_data.shape_values[k], offset, + shape_values, mapping_data); // then copy over to target: @@ -1834,7 +1827,7 @@ FE_RaviartThomas::fill_fe_subface_values (const Mapping if (flags & update_gradients) { - Assert (fe_data.shape_gradients.n_cols() == + Assert (fe_data.shape_gradients.size() == GeometryInfo::faces_per_cell * GeometryInfo::subfaces_per_face * n_q_points, @@ -1843,9 +1836,9 @@ FE_RaviartThomas::fill_fe_subface_values (const Mapping std::vector > shape_grads1 (n_q_points); std::vector > shape_grads2 (n_q_points); - Assert (data.shape_gradients.n_rows() == this->dofs_per_cell * dim, + Assert (data.shape_gradients.size() == this->dofs_per_cell * dim, ExcInternalError()); - Assert (data.shape_gradients.n_cols() == n_q_points, + Assert (data.shape_gradients[0].size() == n_q_points, ExcInternalError()); // loop over all shape @@ -1875,17 +1868,14 @@ FE_RaviartThomas::fill_fe_subface_values (const Mapping // little in between // // do first transformation - mapping.transform_covariant(&*shape_grads1.begin(), - &*shape_grads1.end(), - fe_data.shape_gradients[k].begin()+offset, + mapping.transform_covariant(fe_data.shape_gradients[k], offset, + shape_grads1, mapping_data); // transpose matrix for (unsigned int q=0; q::initialize (const unsigned int n_quadrature_points, n_quadrature_points); if (flags & update_gradients) - this->shape_gradients.reinit(n_nonzero_shape_components, - n_quadrature_points); + this->shape_gradients.resize (n_nonzero_shape_components, + std::vector > (n_quadrature_points)); if (flags & update_second_derivatives) - this->shape_2nd_derivatives.reinit(n_nonzero_shape_components, - n_quadrature_points); + this->shape_2nd_derivatives.resize (n_nonzero_shape_components, + std::vector > (n_quadrature_points)); if (flags & update_q_points) this->quadrature_points.resize(n_quadrature_points); diff --git a/deal.II/deal.II/source/fe/mapping_cartesian.cc b/deal.II/deal.II/source/fe/mapping_cartesian.cc index 447e33623b..587cfa98ad 100644 --- a/deal.II/deal.II/source/fe/mapping_cartesian.cc +++ b/deal.II/deal.II/source/fe/mapping_cartesian.cc @@ -432,34 +432,33 @@ MappingCartesian<1>::fill_fe_subface_values (const DoFHandler<1>::cell_iterator template void -MappingCartesian::transform_covariant (Tensor<1,dim> *begin, - Tensor<1,dim> *end, - const Tensor<1,dim> *src, - const typename Mapping::InternalDataBase &mapping_data) const +MappingCartesian:: +transform_covariant (const std::vector > &input, + const unsigned int offset, + std::vector > &output, + const typename Mapping::InternalDataBase &mapping_data) const { const InternalData &data = dynamic_cast (mapping_data); Assert (data.update_flags & update_covariant_transformation, ExcAccessToUninitializedField()); + + Assert (output.size() + offset <= input.size(), ExcInternalError()); // simply scale by inverse Jacobian // (which is diagonal here) - while (begin!=end) - { - for (unsigned int d=0;d void -MappingCartesian::transform_covariant (Tensor<2,dim> *begin, - Tensor<2,dim> *end, - const Tensor<2,dim> *src, +MappingCartesian::transform_covariant (const std::vector > &input, + const unsigned int offset, + std::vector > &output, const typename Mapping::InternalDataBase &mapping_data) const { const InternalData &data = dynamic_cast (mapping_data); @@ -467,26 +466,24 @@ MappingCartesian::transform_covariant (Tensor<2,dim> *begin, Assert (data.update_flags & update_covariant_transformation, ExcAccessToUninitializedField()); + Assert (output.size() + offset <= input.size(), ExcInternalError()); + // simply scale by inverse Jacobian // (which is diagonal here) - while (begin!=end) - { - for (unsigned int d=0; d void -MappingCartesian::transform_contravariant (Tensor<1,dim> *begin, - Tensor<1,dim> *end, - const Tensor<1,dim> *src, - const typename Mapping::InternalDataBase &mapping_data) const +MappingCartesian::transform_contravariant (const std::vector > &input, + const unsigned int offset, + std::vector > &output, + const typename Mapping::InternalDataBase &mapping_data) const { // convert data object to internal // data for this class. fails with @@ -497,25 +494,23 @@ MappingCartesian::transform_contravariant (Tensor<1,dim> *begin, Assert (data.update_flags & update_contravariant_transformation, ExcAccessToUninitializedField()); - // simply scale by Jacobian + Assert (output.size() + offset <= input.size(), ExcInternalError()); + + // simply scale by inverse Jacobian // (which is diagonal here) - while (begin!=end) - { - for (unsigned int d=0; d void -MappingCartesian::transform_contravariant (Tensor<2,dim> *begin, - Tensor<2,dim> *end, - const Tensor<2,dim> *src, - const typename Mapping::InternalDataBase &mapping_data) const +MappingCartesian::transform_contravariant (const std::vector > &input, + const unsigned int offset, + std::vector > &output, + const typename Mapping::InternalDataBase &mapping_data) const { // convert data object to internal // data for this class. fails with @@ -526,16 +521,14 @@ MappingCartesian::transform_contravariant (Tensor<2,dim> *begin, Assert (data.update_flags & update_contravariant_transformation, ExcAccessToUninitializedField()); - // simply scale by Jacobian + Assert (output.size() + offset <= input.size(), ExcInternalError()); + + // simply scale by inverse Jacobian // (which is diagonal here) - while (begin!=end) - { - for (unsigned int d=0; d::cell_iterator &, template void MappingQ:: -transform_covariant (Tensor<1,dim> *begin, - Tensor<1,dim> *end, - const Tensor<1,dim> *src, +transform_covariant (const std::vector > &input, + const unsigned int offset, + std::vector > &output, const typename Mapping::InternalDataBase &mapping_data) const { const typename MappingQ1::InternalData *q1_data = dynamic_cast::InternalData *> (&mapping_data); Assert(q1_data!=0, ExcInternalError()); + + Assert (output.size() + offset <= input.size(), ExcInternalError()); typename std::vector >::const_iterator tensor; @@ -1169,23 +1171,25 @@ transform_covariant (Tensor<1,dim> *begin, tensor = data->covariant.begin(); } - while (begin!=end) - contract (*(begin++), *(src++), *(tensor++)); + for (unsigned int i=0; i void -MappingQ::transform_covariant (Tensor<2,dim> *begin, - Tensor<2,dim> *end, - const Tensor<2,dim> *src, - const typename Mapping::InternalDataBase &mapping_data) const +MappingQ::transform_covariant (const std::vector > &input, + const unsigned int offset, + std::vector > &output, + const typename Mapping::InternalDataBase &mapping_data) const { const typename MappingQ1::InternalData *q1_data = dynamic_cast::InternalData *> (&mapping_data); Assert(q1_data!=0, ExcInternalError()); - + + Assert (output.size() + offset <= input.size(), ExcInternalError()); + typename std::vector >::const_iterator tensor; if (q1_data->is_mapping_q1_data) @@ -1201,8 +1205,8 @@ MappingQ::transform_covariant (Tensor<2,dim> *begin, tensor = data->covariant.begin(); } - while (begin!=end) - contract (*(begin++), *(src++), *(tensor++)); + for (unsigned int i=0; i::transform_covariant (Tensor<2,dim> *begin, template void MappingQ:: -transform_contravariant (Tensor<1,dim> *begin, - Tensor<1,dim> *end, - const Tensor<1,dim> *src, +transform_contravariant (const std::vector > &input, + const unsigned int offset, + std::vector > &output, const typename Mapping::InternalDataBase &mapping_data) const { const typename MappingQ1::InternalData *q1_data = dynamic_cast::InternalData *> (&mapping_data); Assert(q1_data!=0, ExcInternalError()); + Assert (output.size() + offset <= input.size(), ExcInternalError()); + typename std::vector >::const_iterator tensor; if (q1_data->is_mapping_q1_data) @@ -1234,23 +1240,25 @@ transform_contravariant (Tensor<1,dim> *begin, tensor = data->contravariant.begin(); } - while (begin!=end) - contract (*(begin++), *(tensor++), *(src++)); + for (unsigned int i=0; i void -MappingQ::transform_contravariant (Tensor<2,dim> *begin, - Tensor<2,dim> *end, - const Tensor<2,dim> *src, - const typename Mapping::InternalDataBase &mapping_data) const +MappingQ::transform_contravariant (const std::vector > &input, + const unsigned int offset, + std::vector > &output, + const typename Mapping::InternalDataBase &mapping_data) const { const typename MappingQ1::InternalData *q1_data = dynamic_cast::InternalData *> (&mapping_data); Assert(q1_data!=0, ExcInternalError()); + Assert (output.size() + offset <= input.size(), ExcInternalError()); + typename std::vector >::const_iterator tensor; if (q1_data->is_mapping_q1_data) @@ -1266,8 +1274,8 @@ MappingQ::transform_contravariant (Tensor<2,dim> *begin, tensor = data->contravariant.begin(); } - while (begin!=end) - contract (*(begin++), *(tensor++), *(src++)); + for (unsigned int i=0; i::compute_face_data (const UpdateFlags update_flags, if (data.update_flags & update_boundary_forms) { - data.aux.reinit(dim-1, n_original_q_points); + data.aux.resize (dim-1, std::vector > (n_original_q_points)); // Compute tangentials to the // unit cell. const unsigned int nfaces = GeometryInfo::faces_per_cell; - data.unit_tangentials.reinit(nfaces*(dim-1), - n_original_q_points); + data.unit_tangentials.resize (nfaces*(dim-1), + std::vector > (n_original_q_points)); for (unsigned int i=0; i::compute_fill_face (const typename DoFHandler::cell_iterator Assert (data.aux[0].size() <= data.unit_tangentials[face_no].size(), ExcInternalError()); - transform_contravariant(data.aux[0].begin(), - data.aux[0].end(), - data.unit_tangentials[face_no].begin(), + transform_contravariant(data.unit_tangentials[face_no], 0, + data.aux[0], data); typename std::vector >::iterator result = boundary_forms.begin(); const typename std::vector >::iterator end = boundary_forms.end(); - const Tensor<1,dim> * - tang1 = data.aux[0].begin(); switch (dim) { case 2: { - for (; result != end; ++result, ++tang1) - cross_product (*result, *tang1); + for (unsigned int i=0; result != end; ++result, ++i) + cross_product (*result, data.aux[0][i]); break; }; case 3: { Assert (face_no+GeometryInfo::faces_per_cell < - data.unit_tangentials.n_rows(), + data.unit_tangentials.size(), ExcInternalError()); Assert (data.aux[1].size() <= data.unit_tangentials[face_no+GeometryInfo::faces_per_cell].size(), ExcInternalError()); - transform_contravariant(data.aux[1].begin(), - data.aux[1].end(), - data.unit_tangentials[ - face_no+GeometryInfo::faces_per_cell].begin(), + transform_contravariant(data.unit_tangentials[ + face_no+GeometryInfo::faces_per_cell], 0, + data.aux[1], data); - const Tensor<1,dim> *tang2 = data.aux[1].begin(); - for (;result != end; ++result, ++tang1, ++tang2) - cross_product (*result, *tang1, *tang2); + for (unsigned int i=0; result != end; ++result, ++i) + cross_product (*result, data.aux[0][i], data.aux[1][i]); + break; }; @@ -787,10 +783,10 @@ MappingQ1<1>::fill_fe_subface_values (const DoFHandler<1>::cell_iterator &, template void -MappingQ1::transform_covariant (Tensor<1,dim> *begin, - Tensor<1,dim> *end, - const Tensor<1,dim> *src, - const typename Mapping::InternalDataBase &mapping_data) const +MappingQ1::transform_covariant (const std::vector > &input, + const unsigned int offset, + std::vector > &output, + const typename Mapping::InternalDataBase &mapping_data) const { const InternalData *data_ptr = dynamic_cast (&mapping_data); Assert(data_ptr!=0, ExcInternalError()); @@ -799,27 +795,20 @@ MappingQ1::transform_covariant (Tensor<1,dim> *begin, Assert (data.update_flags & update_covariant_transformation, ExcAccessToUninitializedField()); -//TODO: [GK] Can we do a similar assertion? -// Assert (dst.size() == data.contravariant.size(), -// ExcDimensionMismatch(dst.size() + src_offset, data.contravariant.size())); + Assert (output.size() + offset <= input.size(), ExcInternalError()); - typename std::vector >::const_iterator - tensor = data.covariant.begin(); - - while (begin!=end) - { - contract (*(begin++), *(src++), *(tensor++)); - } + for (unsigned int i=0; i void -MappingQ1::transform_covariant (Tensor<2,dim> *begin, - Tensor<2,dim> *end, - const Tensor<2,dim> *src, - const typename Mapping::InternalDataBase &mapping_data) const +MappingQ1::transform_covariant (const std::vector > &input, + const unsigned int offset, + std::vector > &output, + const typename Mapping::InternalDataBase &mapping_data) const { const InternalData *data_ptr = dynamic_cast (&mapping_data); Assert(data_ptr!=0, ExcInternalError()); @@ -828,17 +817,10 @@ MappingQ1::transform_covariant (Tensor<2,dim> *begin, Assert (data.update_flags & update_covariant_transformation, ExcAccessToUninitializedField()); -//TODO: [GK] Can we do a similar assertion? -// Assert (dst.size() == data.contravariant.size(), -// ExcDimensionMismatch(dst.size() + src_offset, data.contravariant.size())); + Assert (output.size() + offset <= input.size(), ExcInternalError()); - typename std::vector >::const_iterator - tensor = data.covariant.begin(); - - while (begin!=end) - { - contract (*(begin++), *(src++), *(tensor++)); - } + for (unsigned int i=0; i::transform_covariant (Tensor<2,dim> *begin, template void MappingQ1:: -transform_contravariant (Tensor<1,dim> *begin, - Tensor<1,dim> *end, - const Tensor<1,dim> *src, +transform_contravariant (const std::vector > &input, + const unsigned int offset, + std::vector > &output, const typename Mapping::InternalDataBase &mapping_data) const { const InternalData* data_ptr = dynamic_cast (&mapping_data); @@ -858,11 +840,10 @@ transform_contravariant (Tensor<1,dim> *begin, Assert (data.update_flags & update_contravariant_transformation, ExcAccessToUninitializedField()); - typename std::vector >::const_iterator - tensor = data.contravariant.begin(); - - while (begin!=end) - contract (*(begin++), *(tensor++), *(src++)); + Assert (output.size() + offset <= input.size(), ExcInternalError()); + + for (unsigned int i=0; i *begin, template void MappingQ1:: -transform_contravariant (Tensor<2,dim> *begin, - Tensor<2,dim> *end, - const Tensor<2,dim> *src, +transform_contravariant (const std::vector > &input, + const unsigned int offset, + std::vector > &output, const typename Mapping::InternalDataBase &mapping_data) const { const InternalData* data_ptr = dynamic_cast (&mapping_data); @@ -882,11 +863,10 @@ transform_contravariant (Tensor<2,dim> *begin, Assert (data.update_flags & update_contravariant_transformation, ExcAccessToUninitializedField()); - typename std::vector >::const_iterator - tensor = data.contravariant.begin(); - - while (begin!=end) - contract (*(begin++), *(tensor++), *(src++)); + Assert (output.size() + offset <= input.size(), ExcInternalError()); + + for (unsigned int i=0; i