From 4948fc18dba5918dbaa8ec4c3b7cdf5d6ead4fb0 Mon Sep 17 00:00:00 2001 From: Wolfgang Bangerth Date: Mon, 18 May 1998 08:35:58 +0000 Subject: [PATCH] Slight reorganisation (getting the ansatz points of a finite element) and doc updates. Also use the GeometryInfo class more often instead of handcrafted values. git-svn-id: https://svn.dealii.org/trunk@301 0785d39b-7218-0410-832d-ea1e28bc413d --- deal.II/deal.II/source/fe/fe.cc | 53 +++++++++++---- deal.II/deal.II/source/fe/fe_lib.linear.cc | 79 ++++++++++++++++++---- 2 files changed, 106 insertions(+), 26 deletions(-) diff --git a/deal.II/deal.II/source/fe/fe.cc b/deal.II/deal.II/source/fe/fe.cc index 602e91e364..e4f4d313b2 100644 --- a/deal.II/deal.II/source/fe/fe.cc +++ b/deal.II/deal.II/source/fe/fe.cc @@ -129,7 +129,7 @@ void FiniteElement<1>::fill_fe_values (const DoFHandler<1>::cell_iterator &cell, const bool compute_ansatz_points, vector > &q_points, const bool compute_q_points, - const Boundary<1> &) const { + const Boundary<1> &boundary) const { Assert (jacobians.size() == unit_points.size(), ExcWrongFieldDimension(jacobians.size(), unit_points.size())); Assert (q_points.size() == unit_points.size(), @@ -153,19 +153,8 @@ void FiniteElement<1>::fill_fe_values (const DoFHandler<1>::cell_iterator &cell, // belong to vertex one, the second ones // to vertex two, all following are // equally spaced along the line - if (compute_ansatz_points) - { - unsigned int next = 0; - // first the dofs in the vertices - for (unsigned int vertex=0; vertex<2; vertex++) - for (unsigned int i=0; ivertex(vertex); - - // now dofs on line - for (unsigned int i=0; ivertex(0) + - Point<1>((i+1.0)/(total_dofs+1.0)*h); - }; + if (compute_ansatz_points) + get_ansatz_points (cell, boundary, ansatz_points); }; @@ -309,6 +298,42 @@ void FiniteElement::fill_fe_subface_values (const DoFHandler::cell_ite }; + + +void FiniteElement<1>::get_ansatz_points (const DoFHandler<1>::cell_iterator &cell, + const Boundary<1> &, + vector > &ansatz_points) const { + Assert (ansatz_points.size() == total_dofs, + ExcWrongFieldDimension(ansatz_points.size(), total_dofs)); + // compute ansatz points. The first ones + // belong to vertex one, the second ones + // to vertex two, all following are + // equally spaced along the line + unsigned int next = 0; + // local mesh width + const double h=(cell->vertex(1)(0) - cell->vertex(0)(0)); + // first the dofs in the vertices + for (unsigned int vertex=0; vertex<2; vertex++) + for (unsigned int i=0; ivertex(vertex); + + // now dofs on line + for (unsigned int i=0; ivertex(0) + + Point<1>((i+1.0)/(total_dofs+1.0)*h); +}; + + + +template +void FiniteElement::get_ansatz_points (const DoFHandler::cell_iterator &, + const Boundary &, + vector > &) const { + Assert (false, ExcPureFunctionCalled()); +}; + + + /*------------------------------- Explicit Instantiations -------------*/ template class FiniteElementData<1>; diff --git a/deal.II/deal.II/source/fe/fe_lib.linear.cc b/deal.II/deal.II/source/fe/fe_lib.linear.cc index e242af0205..e7d081ea44 100644 --- a/deal.II/deal.II/source/fe/fe_lib.linear.cc +++ b/deal.II/deal.II/source/fe/fe_lib.linear.cc @@ -3,6 +3,7 @@ #include #include #include +#include #include @@ -89,6 +90,14 @@ void FELinear<1>::fill_fe_values (const DoFHandler<1>::cell_iterator &cell, +void FELinear<1>::get_ansatz_points (const typename DoFHandler<1>::cell_iterator &cell, + const Boundary<1> &boundary, + vector > &ansatz_points) const { + FiniteElement<1>::get_ansatz_points (cell, boundary, ansatz_points); +}; + + + void FELinear<1>::get_face_ansatz_points (const typename DoFHandler<1>::face_iterator &, const Boundary<1> &, vector > &) const { @@ -269,7 +278,7 @@ void FELinear::fill_fe_values (const DoFHandler::cell_iterator &cell, const bool compute_ansatz_points, vector > &q_points, const bool compute_q_points, - const Boundary &) const { + const Boundary &boundary) const { Assert (jacobians.size() == unit_points.size(), ExcWrongFieldDimension(jacobians.size(), unit_points.size())); Assert (q_points.size() == unit_points.size(), @@ -277,11 +286,10 @@ void FELinear::fill_fe_values (const DoFHandler::cell_iterator &cell, Assert (ansatz_points.size() == total_dofs, ExcWrongFieldDimension(ansatz_points.size(), total_dofs)); - const unsigned int n_vertices=(1< vertices[n_vertices]; - for (unsigned int l=0; l vertices[GeometryInfo::vertices_per_cell]; + for (unsigned int l=0; l::vertices_per_cell; ++l) vertices[l] = cell->vertex(l); @@ -299,7 +307,7 @@ void FELinear::fill_fe_values (const DoFHandler::cell_iterator &cell, // N_j(xi_l) be the value of the associated // basis function at xi_l, then // x_l(xi_l) = sum_j p_j N_j(xi_l) - for (unsigned int j=0; j::vertices_per_cell; ++j) for (unsigned int l=0; l::fill_fe_values (const DoFHandler::cell_iterator &cell, for (unsigned int l=0; l::vertices_per_cell; ++s) { // we want a linear transform and // if we prepend the class name in @@ -348,22 +356,35 @@ void FELinear::fill_fe_values (const DoFHandler::cell_iterator &cell, // compute ansatz points, which are // the corners for linear elements - if (compute_ansatz_points) - for (unsigned int vertex=0; vertex +void FELinear::get_ansatz_points (const typename DoFHandler::cell_iterator &cell, + const Boundary &, + vector > &ansatz_points) const { + Assert (ansatz_points.size() == total_dofs, + ExcWrongFieldDimension (ansatz_points.size(), 1<<(dim-1))); + + for (unsigned int vertex=0; vertex::vertices_per_cell; ++vertex) + ansatz_points[vertex] = cell->vertex(vertex); +}; + + template void FELinear::get_face_ansatz_points (const typename DoFHandler::face_iterator &face, const Boundary &, vector > &ansatz_points) const { - Assert (ansatz_points.size() == (1<<(dim-1)), - ExcWrongFieldDimension (ansatz_points.size(), 1<<(dim-1))); + Assert ((ansatz_points.size() == dofs_per_face) && + (ansatz_points.size() == GeometryInfo::vertices_per_face), + ExcWrongFieldDimension (ansatz_points.size(), + GeometryInfo::vertices_per_face)); - for (unsigned int vertex=0; vertex<(1<<(dim-1)); ++vertex) + for (unsigned int vertex=0; vertexvertex(vertex); }; @@ -498,6 +519,14 @@ void FEQuadratic<1>::fill_fe_values (const DoFHandler<1>::cell_iterator &cell, +void FEQuadratic<1>::get_ansatz_points (const typename DoFHandler<1>::cell_iterator &cell, + const Boundary<1> &boundary, + vector > &ansatz_points) const { + FiniteElement<1>::get_ansatz_points (cell, boundary, ansatz_points); +}; + + + void FEQuadratic<1>::get_face_ansatz_points (const typename DoFHandler<1>::face_iterator &, const Boundary<1> &, vector > &) const { @@ -609,6 +638,15 @@ void FEQuadratic::fill_fe_values (const DoFHandler::cell_iterator &, +template +void FEQuadratic::get_ansatz_points (const typename DoFHandler::cell_iterator &, + const Boundary &, + vector > &) const { + Assert (false, ExcNotImplemented()); +}; + + + template void FEQuadratic::get_face_ansatz_points (const typename DoFHandler::face_iterator &, const Boundary &, @@ -691,6 +729,14 @@ void FECubic<1>::fill_fe_values (const DoFHandler<1>::cell_iterator &cell, +void FECubic<1>::get_ansatz_points (const typename DoFHandler<1>::cell_iterator &cell, + const Boundary<1> &boundary, + vector > &ansatz_points) const { + FiniteElement<1>::get_ansatz_points (cell, boundary, ansatz_points); +}; + + + void FECubic<1>::get_face_ansatz_points (const typename DoFHandler<1>::face_iterator &, const Boundary<1> &, vector > &) const { @@ -789,6 +835,15 @@ void FECubic::fill_fe_values (const DoFHandler::cell_iterator &, +template +void FECubic::get_ansatz_points (const typename DoFHandler::cell_iterator &, + const Boundary &, + vector > &) const { + Assert (false, ExcNotImplemented()); +}; + + + template void FECubic::get_face_ansatz_points (const typename DoFHandler::face_iterator &, const Boundary &, -- 2.39.5