From: kanschat Date: Thu, 27 Dec 2007 19:53:51 +0000 (+0000) Subject: add assignment operator to Quadrature X-Git-Url: https://gitweb.dealii.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=4a2faacea4693b20d3482f15c3b8a17406bed729;p=dealii-svn.git add assignment operator to Quadrature git-svn-id: https://svn.dealii.org/trunk@15613 0785d39b-7218-0410-832d-ea1e28bc413d --- diff --git a/deal.II/base/include/base/quadrature.h b/deal.II/base/include/base/quadrature.h index 0d6a57e80d..4db976bc85 100644 --- a/deal.II/base/include/base/quadrature.h +++ b/deal.II/base/include/base/quadrature.h @@ -93,9 +93,24 @@ class Quadrature : public Subscriptor typedef Quadrature SubQuadrature; /** + * @deprecated Use size() + * instead. + * * Number of quadrature points. + * + * @warning After introduction of + * the assignment operator, this + * number is not constant anymore + * and erroneous assignment can + * compromise integrity of the + * Quadrature object. Since + * direct data access should be + * considered a design flaw + * anyway, it is strongly + * suggested to use size() + * instead. */ - const unsigned int n_quadrature_points; + unsigned int n_quadrature_points; /** * Constructor. @@ -109,7 +124,7 @@ class Quadrature : public Subscriptor * q_collection(QGauss@(3)) * was meant. */ - explicit Quadrature (const unsigned int n_quadrature_points); + explicit Quadrature (const unsigned int n_quadrature_points = 0); /** * Build this quadrature formula @@ -189,11 +204,24 @@ class Quadrature : public Subscriptor * this point to one. */ Quadrature (const Point &point); + + /** + * Assignment operator. Copies + * contents of #weights and + * #quadrature_points as well as + * size. + */ + Quadrature& operator = (const Quadrature&); /** * Virtual destructor. */ virtual ~Quadrature (); + + /** + * Number of quadrature points. + */ + unsigned int size () const; /** * Return the ith quadrature @@ -344,6 +372,42 @@ class QIterated : public Quadrature #ifndef DOXYGEN +// ---------------------------------------------------------------------- + + +template +inline +unsigned int +Quadrature::size () const +{ + return weights.size(); +} + + +template +inline +const Point & +Quadrature::point (const unsigned int i) const +{ + Assert (dim != 0, ExcNotImplemented()); + AssertIndexRange(i, size()); + return quadrature_points[i]; +} + + + +template +double +Quadrature::weight (const unsigned int i) const +{ + Assert (dim != 0, ExcNotImplemented()); + AssertIndexRange(i, size()); + return weights[i]; +} + + + + /* -------------- declaration of explicit specializations ------------- */ template <> @@ -363,13 +427,9 @@ Quadrature<1>::Quadrature (const Quadrature<0> &, template <> Quadrature<1>::Quadrature (const Quadrature<0> &); -template <> -const Point<0> & Quadrature<0>::point (const unsigned int) const; template <> const std::vector > & Quadrature<0>::get_points () const; template <> -double Quadrature<0>::weight (const unsigned int) const; -template <> const std::vector & Quadrature<0>::get_weights () const; #endif // DOXYGEN diff --git a/deal.II/base/source/quadrature.cc b/deal.II/base/source/quadrature.cc index af50860b19..319043f901 100644 --- a/deal.II/base/source/quadrature.cc +++ b/deal.II/base/source/quadrature.cc @@ -133,14 +133,14 @@ template Quadrature::Quadrature (const SubQuadrature &q1, const Quadrature<1> &q2) : - n_quadrature_points (q1.n_quadrature_points * - q2.n_quadrature_points), + n_quadrature_points (q1.size() * + q2.size()), quadrature_points (n_quadrature_points), weights (n_quadrature_points, 0) { unsigned int present_index = 0; - for (unsigned int i2=0; i2::Quadrature (const SubQuadrature &q1, }; #ifdef DEBUG - if (n_quadrature_points > 0) + if (size() > 0) { double sum = 0; - for (unsigned int i=0; i Quadrature::Quadrature (const Quadrature &q) : Subscriptor(), - n_quadrature_points (dimpow(q.n_quadrature_points)), + n_quadrature_points (dimpow(q.size())), quadrature_points (n_quadrature_points), weights (n_quadrature_points, 0.) { Assert (dim <= 3, ExcNotImplemented()); - const unsigned int n0 = q.n_quadrature_points; + const unsigned int n0 = q.size(); const unsigned int n1 = (dim>1) ? n0 : 1; const unsigned int n2 = (dim>2) ? n0 : 1; @@ -227,37 +227,27 @@ template Quadrature::Quadrature (const Quadrature &q) : Subscriptor(), - n_quadrature_points (q.n_quadrature_points), + n_quadrature_points (q.size()), quadrature_points (q.quadrature_points), weights (q.weights) {} - template -Quadrature::~Quadrature () -{} - - - -template <> -const Point<0> & -Quadrature<0>::point (const unsigned int) const +Quadrature& +Quadrature::operator= (const Quadrature& q) { - Assert (false, ExcInternalError()); - static const Point<0> dummy; - return dummy; + weights = q.weights; + quadrature_points = q.quadrature_points; + n_quadrature_points = q.size(); + return *this; } template -const Point & -Quadrature::point (const unsigned int i) const -{ - Assert (i::~Quadrature () +{} @@ -280,26 +270,6 @@ Quadrature::get_points () const -template <> -double -Quadrature<0>::weight (const unsigned int) const -{ - Assert (false, ExcInternalError()); - return 0; -} - - - -template -double -Quadrature::weight (const unsigned int i) const -{ - Assert (i const std::vector & Quadrature::get_weights () const @@ -331,16 +301,16 @@ Quadrature::memory_consumption () const //--------------------------------------------------------------------------- template QAnisotropic::QAnisotropic(const Quadrature<1>& qx) - : Quadrature(qx.n_quadrature_points) + : Quadrature(qx.size()) { Assert (dim==1, ExcImpossibleInDim(dim)); unsigned int k=0; - for (unsigned int k1=0;k1quadrature_points[k](0) = qx.point(k1)(0); this->weights[k++] = qx.weight(k1); } - Assert (k==this->n_quadrature_points, ExcInternalError()); + Assert (k==this->size(), ExcInternalError()); } @@ -348,19 +318,19 @@ QAnisotropic::QAnisotropic(const Quadrature<1>& qx) template QAnisotropic::QAnisotropic(const Quadrature<1>& qx, const Quadrature<1>& qy) - : Quadrature(qx.n_quadrature_points - *qy.n_quadrature_points) + : Quadrature(qx.size() + *qy.size()) { Assert (dim==2, ExcImpossibleInDim(dim)); unsigned int k=0; - for (unsigned int k2=0;k2quadrature_points[k](0) = qx.point(k1)(0); this->quadrature_points[k](1) = qy.point(k2)(0); this->weights[k++] = qx.weight(k1) * qy.weight(k2); } - Assert (k==this->n_quadrature_points, ExcInternalError()); + Assert (k==this->size(), ExcInternalError()); } @@ -369,22 +339,22 @@ template QAnisotropic::QAnisotropic(const Quadrature<1>& qx, const Quadrature<1>& qy, const Quadrature<1>& qz) - : Quadrature(qx.n_quadrature_points - *qy.n_quadrature_points - *qz.n_quadrature_points) + : Quadrature(qx.size() + *qy.size() + *qz.size()) { Assert (dim==3, ExcImpossibleInDim(dim)); unsigned int k=0; - for (unsigned int k3=0;k3quadrature_points[k](0) = qx.point(k1)(0); this->quadrature_points[k](1) = qy.point(k2)(0); this->quadrature_points[k](2) = qz.point(k3)(0); this->weights[k++] = qx.weight(k1) * qy.weight(k2) * qz.weight(k3); } - Assert (k==this->n_quadrature_points, ExcInternalError()); + Assert (k==this->size(), ExcInternalError()); } @@ -397,9 +367,9 @@ template Quadrature<2> QProjector::reflect (const Quadrature<2> &q) { - std::vector > q_points (q.n_quadrature_points); - std::vector weights (q.n_quadrature_points); - for (unsigned int i=0; i > q_points (q.size()); + std::vector weights (q.size()); + for (unsigned int i=0; i QProjector::rotate (const Quadrature<2> &q, const unsigned int n_times) { - std::vector > q_points (q.n_quadrature_points); - std::vector weights (q.n_quadrature_points); - for (unsigned int i=0; i > q_points (q.size()); + std::vector weights (q.size()); + for (unsigned int i=0; i::project_to_face (const Quadrature<1> &quadrature, { const unsigned int dim=2; Assert (face_no<2*dim, ExcIndexRange (face_no, 0, 2*dim)); - Assert (q_points.size() == quadrature.n_quadrature_points, - ExcDimensionMismatch (q_points.size(), quadrature.n_quadrature_points)); + Assert (q_points.size() == quadrature.size(), + ExcDimensionMismatch (q_points.size(), quadrature.size())); - for (unsigned int p=0; p::project_to_face (const Quadrature<2> &quadrature, { const unsigned int dim=3; Assert (face_no<2*dim, ExcIndexRange (face_no, 0, 2*dim)); - Assert (q_points.size() == quadrature.n_quadrature_points, - ExcDimensionMismatch (q_points.size(), quadrature.n_quadrature_points)); + Assert (q_points.size() == quadrature.size(), + ExcDimensionMismatch (q_points.size(), quadrature.size())); - for (unsigned int p=0; p::project_to_subface (const Quadrature<1> &quadrature, const unsigned int dim=2; Assert (face_no<2*dim, ExcIndexRange (face_no, 0, 2*dim)); Assert (subface_no<(1<<(dim-1)), ExcIndexRange (face_no, 0, 1<<(dim-1))); - Assert (q_points.size() == quadrature.n_quadrature_points, - ExcDimensionMismatch (q_points.size(), quadrature.n_quadrature_points)); + Assert (q_points.size() == quadrature.size(), + ExcDimensionMismatch (q_points.size(), quadrature.size())); - for (unsigned int p=0; p::project_to_subface (const Quadrature<2> &quadrature, const unsigned int dim=3; Assert (face_no<2*dim, ExcIndexRange (face_no, 0, 2*dim)); Assert (subface_no<(1<<(dim-1)), ExcIndexRange (face_no, 0, 1<<(dim-1))); - Assert (q_points.size() == quadrature.n_quadrature_points, - ExcDimensionMismatch (q_points.size(), quadrature.n_quadrature_points)); + Assert (q_points.size() == quadrature.size(), + ExcDimensionMismatch (q_points.size(), quadrature.size())); // for all faces and subfaces: // first project onto the first // subface of each face, then move // it to the right place - for (unsigned int p=0; p::project_to_all_faces (const SubQuadrature &quadrature) { const unsigned int dim = 2; - const unsigned int n_points = quadrature.n_quadrature_points, + const unsigned int n_points = quadrature.size(), n_faces = GeometryInfo::faces_per_cell; // first fix quadrature points @@ -867,7 +837,7 @@ QProjector<3>::project_to_all_faces (const SubQuadrature &quadrature) - const unsigned int n_points = quadrature.n_quadrature_points, + const unsigned int n_points = quadrature.size(), n_faces = GeometryInfo::faces_per_cell; // first fix quadrature points @@ -927,7 +897,7 @@ QProjector<2>::project_to_all_subfaces (const SubQuadrature &quadrature) { const unsigned int dim = 2; - const unsigned int n_points = quadrature.n_quadrature_points, + const unsigned int n_points = quadrature.size(), n_faces = GeometryInfo::faces_per_cell, subfaces_per_face = GeometryInfo::subfaces_per_face; @@ -982,7 +952,7 @@ QProjector<3>::project_to_all_subfaces (const SubQuadrature &quadrature) rotate (q_reflected,2), rotate (q_reflected,1)}; - const unsigned int n_points = quadrature.n_quadrature_points, + const unsigned int n_points = quadrature.size(), n_faces = GeometryInfo::faces_per_cell, subfaces_per_face = GeometryInfo::subfaces_per_face; @@ -1036,7 +1006,7 @@ QProjector::project_to_child (const Quadrature &quadrature, Assert (child_no < GeometryInfo::children_per_cell, ExcIndexRange (child_no, 0, GeometryInfo::children_per_cell)); - const unsigned int n_q_points = quadrature.n_quadrature_points; + const unsigned int n_q_points = quadrature.size(); std::vector > q_points(n_q_points); for (unsigned int i=0; i::project_to_line( const Point& p1, const Point& p2) { - const unsigned int n = quadrature.n_quadrature_points; + const unsigned int n = quadrature.size(); std::vector > points(n); std::vector weights(n); const double length = p1.distance(p2); @@ -1249,7 +1219,7 @@ Quadrature QProjector::project_to_face(const SubQuadrature &quadrature, const unsigned int face_no) { - std::vector > points(quadrature.n_quadrature_points); + std::vector > points(quadrature.size()); project_to_face(quadrature, face_no, points); return Quadrature(points, quadrature.get_weights()); } @@ -1261,7 +1231,7 @@ QProjector::project_to_subface(const SubQuadrature &quadrature, const unsigned int face_no, const unsigned int subface_no) { - std::vector > points(quadrature.n_quadrature_points); + std::vector > points(quadrature.size()); project_to_subface(quadrature, face_no, subface_no, points); return Quadrature(points, quadrature.get_weights()); } @@ -1276,7 +1246,7 @@ QIterated<1>::uses_both_endpoints (const Quadrature<1> &base_quadrature) { bool at_left = false, at_right = false; - for (unsigned int i=0; i(0.0)) at_left = true; @@ -1294,8 +1264,8 @@ QIterated<1>::QIterated (const Quadrature<1> &base_quadrature, const unsigned int n_copies) : Quadrature<1> (uses_both_endpoints(base_quadrature) ? - (base_quadrature.n_quadrature_points-1) * n_copies + 1 : - base_quadrature.n_quadrature_points * n_copies) + (base_quadrature.size()-1) * n_copies + 1 : + base_quadrature.size() * n_copies) { Assert (n_copies > 0, ExcZero()); @@ -1306,7 +1276,7 @@ QIterated<1>::QIterated (const Quadrature<1> &base_quadrature, { unsigned int next_point = 0; for (unsigned int copy=0; copyquadrature_points[next_point] = Point<1>(base_quadrature.point(q_point)(0) / n_copies @@ -1330,7 +1300,7 @@ QIterated<1>::QIterated (const Quadrature<1> &base_quadrature, // the same double double_point_weight = 0; unsigned int n_end_points = 0; - for (unsigned int i=0; i(0.0)) || @@ -1349,7 +1319,7 @@ QIterated<1>::QIterated (const Quadrature<1> &base_quadrature, for (unsigned int copy=0; copy::QIterated (const Quadrature<1> &base_quadrature, #if DEBUG double sum_of_weights = 0; - for (unsigned int i=0; in_quadrature_points; ++i) + for (unsigned int i=0; isize(); ++i) sum_of_weights += this->weight(i); Assert (std::fabs(sum_of_weights-1) < 1e-15, ExcInternalError()); diff --git a/deal.II/doc/news/changes.h b/deal.II/doc/news/changes.h index 8f0c23c108..d40ddf13ff 100644 --- a/deal.II/doc/news/changes.h +++ b/deal.II/doc/news/changes.h @@ -129,7 +129,12 @@ inconvenience this causes.

base

    -
  1. Fixed: MultithreadInfo::n_cpus now gives the correct result +

  2. Improved: Quadrature now has an assignment operator. +
    +(GK 2007/12/27) +

  3. + +
  4. Fixed: MultithreadInfo::n_cpus now gives the correct result also on my Intel MacBook Pro.
    (Luca Heltai 2007/11/12)