Reference documentation for deal.II version 9.2.0
\(\newcommand{\dealvcentcolon}{\mathrel{\mathop{:}}}\) \(\newcommand{\dealcoloneq}{\dealvcentcolon\mathrel{\mkern-1.2mu}=}\) \(\newcommand{\jump}[1]{\left[\!\left[ #1 \right]\!\right]}\) \(\newcommand{\average}[1]{\left\{\!\left\{ #1 \right\}\!\right\}}\)
dof_accessor_set.cc
Go to the documentation of this file.
1 // ---------------------------------------------------------------------
2 //
3 // Copyright (C) 1998 - 2020 by the deal.II authors
4 //
5 // This file is part of the deal.II library.
6 //
7 // The deal.II library is free software; you can use it, redistribute
8 // it, and/or modify it under the terms of the GNU Lesser General
9 // Public License as published by the Free Software Foundation; either
10 // version 2.1 of the License, or (at your option) any later version.
11 // The full text of the license can be found in the file LICENSE.md at
12 // the top level directory of deal.II.
13 //
14 // ---------------------------------------------------------------------
15 
19 
20 #include <deal.II/fe/fe.h>
21 
23 #include <deal.II/grid/tria_iterator.templates.h>
24 
25 #include <deal.II/hp/dof_handler.h>
26 
30 #include <deal.II/lac/la_vector.h>
38 #include <deal.II/lac/vector.h>
39 
40 #include <vector>
41 
43 
44 
45 template <typename DoFHandlerType, bool lda>
46 template <class OutputVector, typename number>
47 void
49  const Vector<number> &local_values,
50  OutputVector & values,
51  const unsigned int fe_index) const
52 {
53  if (this->is_active() && !this->is_artificial())
54  {
55  if ((dynamic_cast<DoFHandler<DoFHandlerType::dimension,
56  DoFHandlerType::space_dimension> *>(
57  this->dof_handler) != nullptr) ||
58  // for hp-DoFHandlers, we need to require that on
59  // active cells, you either don't specify an fe_index,
60  // or that you specify the correct one
61  (fe_index == this->active_fe_index()) ||
62  (fe_index == DoFHandlerType::default_fe_index))
63  // simply set the values on this cell
64  this->set_dof_values(local_values, values);
65  else
66  {
67  Assert(local_values.size() ==
68  this->dof_handler->get_fe(fe_index).dofs_per_cell,
69  ExcMessage("Incorrect size of local_values vector."));
70 
71  FullMatrix<double> interpolation(
72  this->get_fe().dofs_per_cell,
73  this->dof_handler->get_fe(fe_index).dofs_per_cell);
74 
75  this->get_fe().get_interpolation_matrix(
76  this->dof_handler->get_fe(fe_index), interpolation);
77 
78  // do the interpolation to the target space. for historical
79  // reasons, matrices are set to size 0x0 internally even
80  // we reinit as 4x0, so we have to treat this case specially
81  Vector<number> tmp(this->get_fe().dofs_per_cell);
82  if ((tmp.size() > 0) && (local_values.size() > 0))
83  interpolation.vmult(tmp, local_values);
84 
85  // now set the dof values in the global vector
86  this->set_dof_values(tmp, values);
87  }
88  }
89  else
90  // otherwise distribute them to the children
91  {
92  Assert((dynamic_cast<DoFHandler<DoFHandlerType::dimension,
93  DoFHandlerType::space_dimension> *>(
94  this->dof_handler) != nullptr) ||
95  (fe_index != DoFHandlerType::default_fe_index),
96  ExcMessage(
97  "You cannot call this function on non-active cells "
98  "of hp::DoFHandler objects unless you provide an explicit "
99  "finite element index because they do not have naturally "
100  "associated finite element spaces associated: degrees "
101  "of freedom are only distributed on active cells for which "
102  "the active_fe_index has been set."));
103 
104  const FiniteElement<dim, spacedim> &fe =
105  this->get_dof_handler().get_fe(fe_index);
106  const unsigned int dofs_per_cell = fe.dofs_per_cell;
107 
108  Assert(this->dof_handler != nullptr,
109  typename BaseClass::ExcInvalidObject());
110  Assert(local_values.size() == dofs_per_cell,
111  typename BaseClass::ExcVectorDoesNotMatch());
112  Assert(values.size() == this->dof_handler->n_dofs(),
113  typename BaseClass::ExcVectorDoesNotMatch());
114 
115  Vector<number> tmp(dofs_per_cell);
116 
117  for (unsigned int child = 0; child < this->n_children(); ++child)
118  {
119  if (tmp.size() > 0)
120  fe.get_prolongation_matrix(child, this->refinement_case())
121  .vmult(tmp, local_values);
122  this->child(child)->set_dof_values_by_interpolation(tmp,
123  values,
124  fe_index);
125  }
126  }
127 }
128 
129 
130 // --------------------------------------------------------------------------
131 // explicit instantiations
132 #include "dof_accessor_set.inst"
133 
la_vector.h
sparse_matrix.h
FullMatrix::vmult
void vmult(Vector< number2 > &w, const Vector< number2 > &v, const bool adding=false) const
tria_iterator.h
Vector::size
size_type size() const
DoFHandler
Definition: dof_handler.h:205
la_parallel_vector.h
StandardExceptions::ExcMessage
static ::ExceptionBase & ExcMessage(std::string arg1)
block_vector.h
FiniteElementData::dofs_per_cell
const unsigned int dofs_per_cell
Definition: fe_base.h:282
la_parallel_block_vector.h
DEAL_II_NAMESPACE_OPEN
#define DEAL_II_NAMESPACE_OPEN
Definition: config.h:358
DoFCellAccessor::set_dof_values_by_interpolation
void set_dof_values_by_interpolation(const Vector< number > &local_values, OutputVector &values, const unsigned int fe_index=DoFHandlerType::default_fe_index) const
Definition: dof_accessor_set.cc:48
fe.h
petsc_block_vector.h
FiniteElement
Definition: fe.h:648
trilinos_tpetra_vector.h
Assert
#define Assert(cond, exc)
Definition: exceptions.h:1419
vector.h
dof_handler.h
dof_accessor.h
FiniteElement::get_prolongation_matrix
virtual const FullMatrix< double > & get_prolongation_matrix(const unsigned int child, const RefinementCase< dim > &refinement_case=RefinementCase< dim >::isotropic_refinement) const
Definition: fe.cc:328
petsc_vector.h
FullMatrix< double >
DEAL_II_NAMESPACE_CLOSE
#define DEAL_II_NAMESPACE_CLOSE
Definition: config.h:359
dof_levels.h
trilinos_vector.h
Vector< number >
trilinos_epetra_vector.h
trilinos_parallel_block_vector.h
dof_handler.h