template <int dim, int spacedim>
void
FE_DGPNonparametric<dim,spacedim>::fill_fe_values (
const Mapping<dim,spacedim> &,
const typename Triangulation<dim,spacedim>::cell_iterator & cell,
const Quadrature<dim> &,
typename Mapping<dim,spacedim>::InternalDataBase &,
typename Mapping<dim,spacedim>::InternalDataBase &fedata,
FEValuesData<dim,spacedim> &data,
CellSimilarity::Similarity &/*cell_similarity*/) const
{
// convert data object to internal
// data for this class. fails with
// an exception if that is not
// possible
Assert (dynamic_cast<InternalData *> (&fedata) != 0,
ExcInternalError());
InternalData &fe_data = static_cast<InternalData &> (fedata);
const UpdateFlags flags(fe_data.current_update_flags());
Assert (flags & update_quadrature_points, ExcInternalError());
const unsigned int n_q_points = data.quadrature_points.size();
double h = cell->diameter();
if (flags & (update_values | update_gradients))
for (unsigned int i=0; i<n_q_points; ++i)
{
const Point<dim> p = (data.quadrature_points[i] - cell->center())/h;
polynomial_space.compute(p, /* data.quadrature_points[i] */
fe_data.values, fe_data.grads, fe_data. grad_grads);
for (unsigned int k=0; k<this->dofs_per_cell; ++k)
{
if (flags & update_values)
data.shape_values[k][i] = fe_data.values[k];
if (flags & update_gradients)
data.shape_gradients[k][i] = fe_data.grads[k]/h;
if (flags & update_hessians)
data.shape_hessians[k][i] = fe_data.grad_grads[k]/h/h;
}
}
}
This seems to work for my example. I have similarly modified the other fill_fe_face_values and fill_fe_subface_values functions. Are these changes correct and sufficient, or do I need to change anything else ?