18 #ifdef DEAL_II_WITH_P4EST
30 namespace experimental
32 template <
int dim,
typename VectorType,
int spacedim>
47 template <
int dim,
typename VectorType,
int spacedim>
51 const VectorType & in,
52 const unsigned int fe_nothing_index)
54 const unsigned int dofs_per_cell =
55 dof_handler.get_fe_collection().max_dofs_per_cell();
60 for (
auto &val : dummy_cell_solution)
62 val = std::numeric_limits<Number>::infinity();
65 in.update_ghost_values();
67 std::vector<types::global_dof_index> dof_indices(dofs_per_cell);
68 for (
const auto &cell : dof_handler.active_cell_iterators())
70 if ((cell->is_locally_owned()) &&
71 (cell->active_fe_index() != fe_nothing_index))
73 cell->get_dof_values(in, cell_solution);
74 data_to_transfer.push_back(cell_solution);
78 data_to_transfer.push_back(dummy_cell_solution);
82 cell_data_transfer->prepare_for_coarsening_and_refinement(
88 template <
int dim,
typename VectorType,
int spacedim>
95 const unsigned int dofs_per_cell =
96 dof_handler.get_fe_collection().max_dofs_per_cell();
97 std::vector<Vector<Number>> transferred_data(
98 dof_handler.get_triangulation().n_active_cells(),
101 cell_data_transfer->unpack(transferred_data);
104 data_to_transfer.clear();
106 for (
unsigned int i = 0; i < out.locally_owned_size(); ++i)
107 out.local_element(i) = std::numeric_limits<Number>::infinity();
109 unsigned int cell_i = 0;
110 for (
auto const &cell : dof_handler.active_cell_iterators())
112 if ((cell->is_locally_owned()) &&
113 (transferred_data[cell_i][0] !=
114 std::numeric_limits<Number>::infinity()))
116 cell->set_dof_values(transferred_data[cell_i], out);
126 std::vector<types::global_dof_index> dof_indices;
127 std::vector<types::global_dof_index> dofs_map;
128 std::vector<std::vector<std::pair<types::global_dof_index, Number>>>
130 std::vector<Number> constraint_values;
131 IndexSet locally_owned_dofs = dof_handler.locally_owned_dofs();
132 for (
auto constrained_dof : locally_owned_dofs)
137 const unsigned int line_size = constraint->size();
138 bool add_line =
false;
139 for (
unsigned int i = 0; i < line_size; ++i)
142 (*constraint)[i].first;
145 if (out[constraining_dof] ==
146 std::numeric_limits<Number>::infinity())
155 std::vector<std::pair<types::global_dof_index, Number>> line;
156 Number val = out[constrained_dof];
158 for (
unsigned int i = 0; i < line_size; ++i)
161 (*constraint)[i].first;
163 if (out[constraining_dof] ==
164 std::numeric_limits<Number>::infinity())
166 auto constraining_dof_map_it =
167 std::find(dofs_map.begin(),
170 if (constraining_dof_map_it == dofs_map.end())
172 dofs_map.push_back(constraining_dof);
174 line.push_back((*constraint)[i]);
179 out[constraining_dof] * (*constraint)[i].second;
182 constraint_lines.push_back(line);
183 constraint_values.push_back(val);
188 const unsigned int n_rows = constraint_lines.size();
191 const unsigned int n_cols = dofs_map.size();
195 for (
unsigned int i = 0; i < n_rows; ++i)
197 for (
unsigned int j = 0; j < n_cols; ++j)
199 if (j < constraint_lines[i].size())
202 std::find(dofs_map.begin(),
204 constraint_lines[i][j].first);
205 constraints_matrix(i,
206 constraint_it - dofs_map.begin()) =
207 constraint_lines[i][j].second;
211 constraint_values_vec[i] = constraint_values[i];
217 constraints_matrix.
vmult(new_constrained_values,
218 constraint_values_vec);
220 for (
unsigned int i = 0; i < n_cols; ++i)
222 out[dofs_map[i]] = new_constrained_values[i];
227 std::for_each(out.begin(), out.end(), [&](
Number &val) {
228 if (val == std::numeric_limits<Number>::infinity())
239 # include "field_transfer.inst"
bool is_constrained(const size_type line_n) const
const std::vector< std::pair< size_type, number > > * get_constraint_entries(const size_type line_n) const
const Triangulation< dim, spacedim > & get_triangulation() const
void vmult(Vector< number2 > &w, const Vector< number2 > &v, const bool adding=false) const
void compute_inverse_svd(const double threshold=0.)
std::unique_ptr< CellDataTransfer< dim, spacedim, std::vector< Vector< Number > > > > cell_data_transfer
void prepare_for_coarsening_and_refinement(const VectorType &in, const unsigned int fe_nothing_index)
FieldTransfer(const DoFHandler< dim, spacedim > &dof_handler)
typename VectorType::value_type Number
const DoFHandler< dim, spacedim > & dof_handler
void interpolate(const Number &new_value, const AffineConstraints< Number > &affine_constraints, VectorType &out)
#define DEAL_II_NAMESPACE_OPEN
#define DEAL_II_NAMESPACE_CLOSE
unsigned int global_dof_index