From: guido Date: Wed, 7 Jun 2006 13:56:03 +0000 (+0000) Subject: implementation moved to templates.h X-Git-Url: https://gitweb.dealii.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=0a9f29dd42886ff409efa8cbac88f54968871a28;p=dealii-svn.git implementation moved to templates.h git-svn-id: https://svn.dealii.org/trunk@13189 0785d39b-7218-0410-832d-ea1e28bc413d --- diff --git a/deal.II/deal.II/include/fe/fe_poly.templates.h b/deal.II/deal.II/include/fe/fe_poly.templates.h new file mode 100644 index 0000000000..9bb8fe36e4 --- /dev/null +++ b/deal.II/deal.II/include/fe/fe_poly.templates.h @@ -0,0 +1,398 @@ +//--------------------------------------------------------------------------- +// $Id$ +// Version: $Name$ +// +// Copyright (C) 2006 by the deal.II authors +// +// This file is subject to QPL and may not be distributed +// without copyright and license information. Please refer +// to the file deal.II/doc/license.html for the text and +// further information on this license. +// +//--------------------------------------------------------------------------- + + +template +FE_Poly::FE_Poly (const POLY& poly_space, + const FiniteElementData &fe_data, + const std::vector &restriction_is_additive_flags, + const std::vector > &nonzero_components): + FiniteElement (fe_data, + restriction_is_additive_flags, + nonzero_components), + poly_space(poly_space) +{} + + +template +unsigned int +FE_Poly::get_degree () const +{ + return this->degree; +} + + +template +double +FE_Poly::shape_value (const unsigned int i, + const Point &p) const +{ + Assert (idofs_per_cell, ExcIndexRange(i,0,this->dofs_per_cell)); + return poly_space.compute_value(i, p); +} + + +template +double +FE_Poly::shape_value_component (const unsigned int i, + const Point &p, + const unsigned int component) const +{ + Assert (idofs_per_cell, ExcIndexRange(i,0,this->dofs_per_cell)); + Assert (component == 0, ExcIndexRange (component, 0, 1)); + return poly_space.compute_value(i, p); +} + + + +template +Tensor<1,dim> +FE_Poly::shape_grad (const unsigned int i, + const Point &p) const +{ + Assert (idofs_per_cell, ExcIndexRange(i,0,this->dofs_per_cell)); + return poly_space.compute_grad(i, p); +} + + + +template +Tensor<1,dim> +FE_Poly::shape_grad_component (const unsigned int i, + const Point &p, + const unsigned int component) const +{ + Assert (idofs_per_cell, ExcIndexRange(i,0,this->dofs_per_cell)); + Assert (component == 0, ExcIndexRange (component, 0, 1)); + return poly_space.compute_grad(i, p); +} + + + +template +Tensor<2,dim> +FE_Poly::shape_grad_grad (const unsigned int i, + const Point &p) const +{ + Assert (idofs_per_cell, ExcIndexRange(i,0,this->dofs_per_cell)); + return poly_space.compute_grad_grad(i, p); +} + + + +template +Tensor<2,dim> +FE_Poly::shape_grad_grad_component (const unsigned int i, + const Point &p, + const unsigned int component) const +{ + Assert (idofs_per_cell, ExcIndexRange(i,0,this->dofs_per_cell)); + Assert (component == 0, ExcIndexRange (component, 0, 1)); + return poly_space.compute_grad_grad(i, p); +} + + + +//--------------------------------------------------------------------------- +// Auxiliary functions +//--------------------------------------------------------------------------- + + + + +template +UpdateFlags +FE_Poly::update_once (const UpdateFlags flags) const +{ + // for this kind of elements, only + // the values can be precomputed + // once and for all. set this flag + // if the values are requested at + // all + return (update_default | (flags & update_values)); +} + + + +template +UpdateFlags +FE_Poly::update_each (const UpdateFlags flags) const +{ + UpdateFlags out = update_default; + + if (flags & update_gradients) + out |= update_gradients | update_covariant_transformation; + if (flags & update_second_derivatives) + out |= update_second_derivatives | update_covariant_transformation; + + return out; +} + + + +//--------------------------------------------------------------------------- +// Data field initialization +//--------------------------------------------------------------------------- + +template +typename Mapping::InternalDataBase * +FE_Poly::get_data (const UpdateFlags update_flags, + const Mapping &mapping, + const Quadrature &quadrature) const +{ + // generate a new data object and + // initialize some fields + InternalData* data = new InternalData; + + // check what needs to be + // initialized only once and what + // on every cell/face/subface we + // visit + data->update_once = update_once(update_flags); + data->update_each = update_each(update_flags); + data->update_flags = data->update_once | data->update_each; + + const UpdateFlags flags(data->update_flags); + const unsigned int n_q_points = quadrature.n_quadrature_points; + + // some scratch arrays + std::vector values(0); + std::vector > grads(0); + std::vector > grad_grads(0); + + // initialize fields only if really + // necessary. otherwise, don't + // allocate memory + if (flags & update_values) + { + values.resize (this->dofs_per_cell); + 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.resize (this->dofs_per_cell, + std::vector > (n_q_points)); + } + + // if second derivatives through + // finite differencing is required, + // then initialize some objects for + // that + if (flags & update_second_derivatives) + data->initialize_2nd (this, mapping, quadrature); + + // next already fill those fields + // of which we have information by + // now. note that the shape + // gradients are only those on the + // unit cell, and need to be + // transformed when visiting an + // actual cell + if (flags & (update_values | update_gradients)) + for (unsigned int i=0; idofs_per_cell; ++k) + data->shape_values[k][i] = values[k]; + + if (flags & update_gradients) + for (unsigned int k=0; kdofs_per_cell; ++k) + data->shape_gradients[k][i] = grads[k]; + } + return data; +} + + + + +//--------------------------------------------------------------------------- +// Fill data of FEValues +//--------------------------------------------------------------------------- + +template +void +FE_Poly::fill_fe_values (const Mapping &mapping, + const typename Triangulation::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 + // an exception if that is not + // possible + InternalData &fe_data = dynamic_cast (fedata); + + const UpdateFlags flags(fe_data.current_update_flags()); + + for (unsigned int k=0; kdofs_per_cell; ++k) + { + if (flags & update_values) + for (unsigned int i=0; i::DataSetDescriptor dsd; + if (flags & update_second_derivatives) + this->compute_2nd (mapping, cell, dsd.cell(), + mapping_data, fe_data, data); +} + + + +template +void +FE_Poly::fill_fe_face_values (const Mapping &mapping, + const typename Triangulation::cell_iterator &cell, + const unsigned int face, + 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 + // an exception if that is not + // possible + InternalData &fe_data = dynamic_cast (fedata); + + // offset determines which data set + // to take (all data sets for all + // faces are stored contiguously) + + const typename QProjector::DataSetDescriptor dsd; + const typename QProjector::DataSetDescriptor offset + = dsd.face (face, cell->face_orientation(face), + quadrature.n_quadrature_points); + + const UpdateFlags flags(fe_data.update_once | fe_data.update_each); + + for (unsigned int k=0; kdofs_per_cell; ++k) + { + if (flags & update_values) + for (unsigned int i=0; icompute_2nd (mapping, cell, offset, mapping_data, fe_data, data); +} + + + +template +void +FE_Poly::fill_fe_subface_values (const Mapping &mapping, + const typename Triangulation::cell_iterator &cell, + const unsigned int face, + const unsigned int subface, + 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 + // an exception if that is not + // possible + InternalData &fe_data = dynamic_cast (fedata); + + // offset determines which data set + // to take (all data sets for all + // sub-faces are stored contiguously) + + const typename QProjector::DataSetDescriptor dsd; + const typename QProjector::DataSetDescriptor offset + = dsd.subface (face, subface, cell->face_orientation(face), + quadrature.n_quadrature_points); + + const UpdateFlags flags(fe_data.update_once | fe_data.update_each); + + for (unsigned int k=0; kdofs_per_cell; ++k) + { + if (flags & update_values) + for (unsigned int i=0; icompute_2nd (mapping, cell, offset, mapping_data, fe_data, data); +} + + + +template +unsigned int +FE_Poly::n_base_elements () const +{ + return 1; +} + + + +template +const FiniteElement & +FE_Poly::base_element (const unsigned int index) const +{ + Assert (index==0, ExcIndexRange(index, 0, 1)); + return *this; +} + + + +template +unsigned int +FE_Poly::element_multiplicity (const unsigned int index) const +{ + Assert (index==0, ExcIndexRange(index, 0, 1)); + return 1; +} + + diff --git a/deal.II/deal.II/source/fe/fe_poly.cc b/deal.II/deal.II/source/fe/fe_poly.cc index 86932b2fce..266c40c2bf 100644 --- a/deal.II/deal.II/source/fe/fe_poly.cc +++ b/deal.II/deal.II/source/fe/fe_poly.cc @@ -17,391 +17,7 @@ #include #include - -template -FE_Poly::FE_Poly (const POLY& poly_space, - const FiniteElementData &fe_data, - const std::vector &restriction_is_additive_flags, - const std::vector > &nonzero_components): - FiniteElement (fe_data, - restriction_is_additive_flags, - nonzero_components), - poly_space(poly_space) -{} - - -template -unsigned int -FE_Poly::get_degree () const -{ - return this->degree; -} - - -template -double -FE_Poly::shape_value (const unsigned int i, - const Point &p) const -{ - Assert (idofs_per_cell, ExcIndexRange(i,0,this->dofs_per_cell)); - return poly_space.compute_value(i, p); -} - - -template -double -FE_Poly::shape_value_component (const unsigned int i, - const Point &p, - const unsigned int component) const -{ - Assert (idofs_per_cell, ExcIndexRange(i,0,this->dofs_per_cell)); - Assert (component == 0, ExcIndexRange (component, 0, 1)); - return poly_space.compute_value(i, p); -} - - - -template -Tensor<1,dim> -FE_Poly::shape_grad (const unsigned int i, - const Point &p) const -{ - Assert (idofs_per_cell, ExcIndexRange(i,0,this->dofs_per_cell)); - return poly_space.compute_grad(i, p); -} - - - -template -Tensor<1,dim> -FE_Poly::shape_grad_component (const unsigned int i, - const Point &p, - const unsigned int component) const -{ - Assert (idofs_per_cell, ExcIndexRange(i,0,this->dofs_per_cell)); - Assert (component == 0, ExcIndexRange (component, 0, 1)); - return poly_space.compute_grad(i, p); -} - - - -template -Tensor<2,dim> -FE_Poly::shape_grad_grad (const unsigned int i, - const Point &p) const -{ - Assert (idofs_per_cell, ExcIndexRange(i,0,this->dofs_per_cell)); - return poly_space.compute_grad_grad(i, p); -} - - - -template -Tensor<2,dim> -FE_Poly::shape_grad_grad_component (const unsigned int i, - const Point &p, - const unsigned int component) const -{ - Assert (idofs_per_cell, ExcIndexRange(i,0,this->dofs_per_cell)); - Assert (component == 0, ExcIndexRange (component, 0, 1)); - return poly_space.compute_grad_grad(i, p); -} - - - -//--------------------------------------------------------------------------- -// Auxiliary functions -//--------------------------------------------------------------------------- - - - - -template -UpdateFlags -FE_Poly::update_once (const UpdateFlags flags) const -{ - // for this kind of elements, only - // the values can be precomputed - // once and for all. set this flag - // if the values are requested at - // all - return (update_default | (flags & update_values)); -} - - - -template -UpdateFlags -FE_Poly::update_each (const UpdateFlags flags) const -{ - UpdateFlags out = update_default; - - if (flags & update_gradients) - out |= update_gradients | update_covariant_transformation; - if (flags & update_second_derivatives) - out |= update_second_derivatives | update_covariant_transformation; - - return out; -} - - - -//--------------------------------------------------------------------------- -// Data field initialization -//--------------------------------------------------------------------------- - -template -typename Mapping::InternalDataBase * -FE_Poly::get_data (const UpdateFlags update_flags, - const Mapping &mapping, - const Quadrature &quadrature) const -{ - // generate a new data object and - // initialize some fields - InternalData* data = new InternalData; - - // check what needs to be - // initialized only once and what - // on every cell/face/subface we - // visit - data->update_once = update_once(update_flags); - data->update_each = update_each(update_flags); - data->update_flags = data->update_once | data->update_each; - - const UpdateFlags flags(data->update_flags); - const unsigned int n_q_points = quadrature.n_quadrature_points; - - // some scratch arrays - std::vector values(0); - std::vector > grads(0); - std::vector > grad_grads(0); - - // initialize fields only if really - // necessary. otherwise, don't - // allocate memory - if (flags & update_values) - { - values.resize (this->dofs_per_cell); - 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.resize (this->dofs_per_cell, - std::vector > (n_q_points)); - } - - // if second derivatives through - // finite differencing is required, - // then initialize some objects for - // that - if (flags & update_second_derivatives) - data->initialize_2nd (this, mapping, quadrature); - - // next already fill those fields - // of which we have information by - // now. note that the shape - // gradients are only those on the - // unit cell, and need to be - // transformed when visiting an - // actual cell - if (flags & (update_values | update_gradients)) - for (unsigned int i=0; idofs_per_cell; ++k) - data->shape_values[k][i] = values[k]; - - if (flags & update_gradients) - for (unsigned int k=0; kdofs_per_cell; ++k) - data->shape_gradients[k][i] = grads[k]; - } - return data; -} - - - - -//--------------------------------------------------------------------------- -// Fill data of FEValues -//--------------------------------------------------------------------------- - -template -void -FE_Poly::fill_fe_values (const Mapping &mapping, - const typename Triangulation::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 - // an exception if that is not - // possible - InternalData &fe_data = dynamic_cast (fedata); - - const UpdateFlags flags(fe_data.current_update_flags()); - - for (unsigned int k=0; kdofs_per_cell; ++k) - { - if (flags & update_values) - for (unsigned int i=0; i::DataSetDescriptor dsd; - if (flags & update_second_derivatives) - this->compute_2nd (mapping, cell, dsd.cell(), - mapping_data, fe_data, data); -} - - - -template -void -FE_Poly::fill_fe_face_values (const Mapping &mapping, - const typename Triangulation::cell_iterator &cell, - const unsigned int face, - 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 - // an exception if that is not - // possible - InternalData &fe_data = dynamic_cast (fedata); - - // offset determines which data set - // to take (all data sets for all - // faces are stored contiguously) - - const typename QProjector::DataSetDescriptor dsd; - const typename QProjector::DataSetDescriptor offset - = dsd.face (face, cell->face_orientation(face), - quadrature.n_quadrature_points); - - const UpdateFlags flags(fe_data.update_once | fe_data.update_each); - - for (unsigned int k=0; kdofs_per_cell; ++k) - { - if (flags & update_values) - for (unsigned int i=0; icompute_2nd (mapping, cell, offset, mapping_data, fe_data, data); -} - - - -template -void -FE_Poly::fill_fe_subface_values (const Mapping &mapping, - const typename Triangulation::cell_iterator &cell, - const unsigned int face, - const unsigned int subface, - 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 - // an exception if that is not - // possible - InternalData &fe_data = dynamic_cast (fedata); - - // offset determines which data set - // to take (all data sets for all - // sub-faces are stored contiguously) - - const typename QProjector::DataSetDescriptor dsd; - const typename QProjector::DataSetDescriptor offset - = dsd.subface (face, subface, cell->face_orientation(face), - quadrature.n_quadrature_points); - - const UpdateFlags flags(fe_data.update_once | fe_data.update_each); - - for (unsigned int k=0; kdofs_per_cell; ++k) - { - if (flags & update_values) - for (unsigned int i=0; icompute_2nd (mapping, cell, offset, mapping_data, fe_data, data); -} - - - -template -unsigned int -FE_Poly::n_base_elements () const -{ - return 1; -} - - - -template -const FiniteElement & -FE_Poly::base_element (const unsigned int index) const -{ - Assert (index==0, ExcIndexRange(index, 0, 1)); - return *this; -} - - - -template -unsigned int -FE_Poly::element_multiplicity (const unsigned int index) const -{ - Assert (index==0, ExcIndexRange(index, 0, 1)); - return 1; -} - - +#include template class FE_Poly, deal_II_dimension>; template class FE_Poly, deal_II_dimension>;