hyper.deal
Loading...
Searching...
No Matches
matrix_free.h
1// ---------------------------------------------------------------------
2//
3// Copyright (C) 2020 by the hyper.deal authors
4//
5// This file is part of the hyper.deal library.
6//
7// The hyper.deal 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 3.0 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 hyper.deal.
13//
14// ---------------------------------------------------------------------
15
16#ifndef HYPERDEAL_NDIM_MATRIXFREE
17#define HYPERDEAL_NDIM_MATRIXFREE
18
19#include <hyper.deal/base/config.h>
20
21#include <deal.II/lac/la_parallel_vector.h>
22
23#include <deal.II/matrix_free/matrix_free.h>
24
25#include <hyper.deal/base/memory_consumption.h>
26#include <hyper.deal/base/timers.h>
27#include <hyper.deal/matrix_free/dof_info.h>
28#include <hyper.deal/matrix_free/face_info.h>
29#include <hyper.deal/matrix_free/id.h>
30#include <hyper.deal/matrix_free/shape_info.h>
31#include <hyper.deal/matrix_free/vector_partitioner.h>
32
33namespace hyperdeal
34{
38 template <int dim_x, int dim_v, typename Number, typename VectorizedArrayType>
40 {
41 public:
42 using ID = TensorID;
43
44 using VectorizedArrayTypeX = VectorizedArrayType;
45 using VectorizedArrayTypeV = dealii::VectorizedArray<Number, 1>;
46
53 {
54 none,
55 values,
56 gradients,
57 unspecified
58 };
59
64 {
69 : do_ghost_faces(true)
70 , do_buffering(false)
71 , use_ecl(true)
72 , overlapping_level(0 /*no overlapping communication-computation*/)
73 {}
74
81
89
96 bool use_ecl;
97
101 unsigned int overlapping_level;
102 };
103
104
108 MatrixFree(const MPI_Comm comm,
109 const MPI_Comm comm_sm,
110 const dealii::MatrixFree<dim_x, Number, VectorizedArrayTypeX>
111 &matrix_free_x,
112 const dealii::MatrixFree<dim_v, Number, VectorizedArrayTypeV>
113 &matrix_free_v);
114
118 void
119 reinit(const AdditionalData &ad = AdditionalData());
120
124 template <typename OutVector, typename InVector>
125 void
126 cell_loop(
127 const std::function<
128 void(const MatrixFree &, OutVector &, const InVector &, const ID)>
129 & cell_operation,
130 OutVector & dst,
131 const InVector &src) const;
132
136 template <typename CLASS, typename OutVector, typename InVector>
137 void
138 cell_loop(void (CLASS::*cell_operation)(const MatrixFree &,
139 OutVector &,
140 const InVector &,
141 const ID),
142 CLASS * owning_class,
143 OutVector & dst,
144 const InVector &src) const;
145
150 template <typename OutVector, typename InVector>
151 void
153 const std::function<
154 void(const MatrixFree &, OutVector &, const InVector &, const ID)>
155 & cell_operation,
156 OutVector & dst,
157 const InVector & src,
158 const DataAccessOnFaces src_vector_face_access =
159 DataAccessOnFaces::unspecified,
160 Timers *timers = nullptr) const;
161
165 template <typename CLASS, typename OutVector, typename InVector>
166 void
167 loop_cell_centric(void (CLASS::*cell_operation)(const MatrixFree &,
168 OutVector &,
169 const InVector &,
170 const ID),
171 CLASS * owning_class,
172 OutVector & dst,
173 const InVector & src,
174 const DataAccessOnFaces src_vector_face_access =
175 DataAccessOnFaces::unspecified,
176 Timers *timers = nullptr) const;
177
183 template <typename OutVector, typename InVector>
184 void
185 loop(const std::function<
186 void(const MatrixFree &, OutVector &, const InVector &, const ID)>
187 &cell_operation,
188 const std::function<
189 void(const MatrixFree &, OutVector &, const InVector &, const ID)>
190 &face_operation,
191 const std::function<
192 void(const MatrixFree &, OutVector &, const InVector &, const ID)>
193 & boundary_operation,
194 OutVector & dst,
195 const InVector & src,
196 const DataAccessOnFaces dst_vector_face_access =
197 DataAccessOnFaces::unspecified,
198 const DataAccessOnFaces src_vector_face_access =
199 DataAccessOnFaces::unspecified,
200 Timers *timers = nullptr) const;
201
207 template <typename CLASS, typename OutVector, typename InVector>
208 void
209 loop(void (CLASS::*cell_operation)(const MatrixFree &,
210 OutVector &,
211 const InVector &,
212 const ID),
213 void (CLASS::*face_operation)(const MatrixFree &,
214 OutVector &,
215 const InVector &,
216 const ID),
217 void (CLASS::*boundary_operation)(const MatrixFree &,
218 OutVector &,
219 const InVector &,
220 const ID),
221 CLASS * owning_class,
222 OutVector & dst,
223 const InVector & src,
224 const DataAccessOnFaces dst_vector_face_access =
225 DataAccessOnFaces::unspecified,
226 const DataAccessOnFaces src_vector_face_access =
227 DataAccessOnFaces::unspecified,
228 Timers *timers = nullptr) const;
229
233 const MPI_Comm &
234 get_communicator() const;
235
243 void
245 dealii::LinearAlgebra::distributed::Vector<Number> &vec,
246 const unsigned int dof_handler_index = 0,
247 const bool do_ghosts = true,
248 const bool zero_out_values = true) const;
249
253 dealii::types::boundary_id
254 get_boundary_id(const ID macro_face) const;
255
263 dealii::types::boundary_id
264 get_faces_by_cells_boundary_id(const TensorID & macro_cell,
265 const unsigned int face_number) const;
266
270 bool
271 is_ecl_supported() const;
272
276 bool
278
282 const dealii::MatrixFree<dim_x, Number, VectorizedArrayTypeX> &
283 get_matrix_free_x() const;
284
288 const dealii::MatrixFree<dim_v, Number, VectorizedArrayTypeV> &
289 get_matrix_free_v() const;
290
295 get_dof_info() const;
296
301 get_face_info() const;
302
307 get_shape_info() const;
308
313 memory_consumption() const;
314
318 const std::shared_ptr<
319 const dealii::internal::MatrixFreeFunctions::VectorDataExchange::Base> &
321
322
323 private:
327 const MPI_Comm comm;
328
332 const MPI_Comm comm_sm;
333
337 const dealii::MatrixFree<dim_x, Number, VectorizedArrayTypeX>
338 &matrix_free_x;
339
343 const dealii::MatrixFree<dim_v, Number, VectorizedArrayTypeV>
344 &matrix_free_v;
345
349 bool do_buffering;
350
354 bool do_ghost_faces;
355
359 bool use_ecl;
360
364 std::shared_ptr<
365 const dealii::internal::MatrixFreeFunctions::VectorDataExchange::Base>
366 partitioner;
367
372
377
382
388 std::array<std::vector<ID>, 3> partitions;
389 };
390
391} // namespace hyperdeal
392
393#include <hyper.deal/matrix_free/matrix_free.templates.h>
394
395#endif
Definition matrix_free.h:40
const MPI_Comm & get_communicator() const
Definition matrix_free.templates.h:1752
const dealii::MatrixFree< dim_v, Number, VectorizedArrayTypeV > & get_matrix_free_v() const
Definition matrix_free.templates.h:1862
void cell_loop(const std::function< void(const MatrixFree &, OutVector &, const InVector &, const ID)> &cell_operation, OutVector &dst, const InVector &src) const
Definition matrix_free.templates.h:1420
MemoryConsumption memory_consumption() const
Definition matrix_free.templates.h:1899
MatrixFree(const MPI_Comm comm, const MPI_Comm comm_sm, const dealii::MatrixFree< dim_x, Number, VectorizedArrayTypeX > &matrix_free_x, const dealii::MatrixFree< dim_v, Number, VectorizedArrayTypeV > &matrix_free_v)
Definition matrix_free.templates.h:847
DataAccessOnFaces
Definition matrix_free.h:53
bool is_ecl_supported() const
Definition matrix_free.templates.h:1824
const internal::MatrixFreeFunctions::DoFInfo & get_dof_info() const
Definition matrix_free.templates.h:1872
dealii::types::boundary_id get_boundary_id(const ID macro_face) const
Definition matrix_free.templates.h:1762
dealii::types::boundary_id get_faces_by_cells_boundary_id(const TensorID &macro_cell, const unsigned int face_number) const
Definition matrix_free.templates.h:1781
void loop_cell_centric(const std::function< void(const MatrixFree &, OutVector &, const InVector &, const ID)> &cell_operation, OutVector &dst, const InVector &src, const DataAccessOnFaces src_vector_face_access=DataAccessOnFaces::unspecified, Timers *timers=nullptr) const
Definition matrix_free.templates.h:1497
void loop(const std::function< void(const MatrixFree &, OutVector &, const InVector &, const ID)> &cell_operation, const std::function< void(const MatrixFree &, OutVector &, const InVector &, const ID)> &face_operation, const std::function< void(const MatrixFree &, OutVector &, const InVector &, const ID)> &boundary_operation, OutVector &dst, const InVector &src, const DataAccessOnFaces dst_vector_face_access=DataAccessOnFaces::unspecified, const DataAccessOnFaces src_vector_face_access=DataAccessOnFaces::unspecified, Timers *timers=nullptr) const
Definition matrix_free.templates.h:1637
const dealii::MatrixFree< dim_x, Number, VectorizedArrayTypeX > & get_matrix_free_x() const
Definition matrix_free.templates.h:1848
bool are_ghost_faces_supported() const
Definition matrix_free.templates.h:1835
const std::shared_ptr< const dealii::internal::MatrixFreeFunctions::VectorDataExchange::Base > & get_vector_partitioner() const
Definition matrix_free.templates.h:1917
void initialize_dof_vector(dealii::LinearAlgebra::distributed::Vector< Number > &vec, const unsigned int dof_handler_index=0, const bool do_ghosts=true, const bool zero_out_values=true) const
Definition matrix_free.templates.h:1369
const internal::MatrixFreeFunctions::FaceInfo & get_face_info() const
Definition matrix_free.templates.h:1881
const internal::MatrixFreeFunctions::ShapeInfo< Number > & get_shape_info() const
Definition matrix_free.templates.h:1890
void reinit(const AdditionalData &ad=AdditionalData())
Definition matrix_free.templates.h:862
Definition memory_consumption.h:349
Definition timers.h:97
Definition matrix_free.h:64
bool use_ecl
Definition matrix_free.h:96
bool do_ghost_faces
Definition matrix_free.h:80
bool do_buffering
Definition matrix_free.h:88
AdditionalData()
Definition matrix_free.h:68
unsigned int overlapping_level
Definition matrix_free.h:101
Definition id.h:27