DFT-FE 1.1.0-pre
Density Functional Theory With Finite-Elements
Loading...
Searching...
No Matches
MultiVector.h
Go to the documentation of this file.
1// ---------------------------------------------------------------------
2//
3// Copyright (c) 2017-2025 The Regents of the University of Michigan and DFT-FE
4// authors.
5//
6// This file is part of the DFT-FE code.
7//
8// The DFT-FE code is free software; you can use it, redistribute
9// it, and/or modify it under the terms of the GNU Lesser General
10// Public License as published by the Free Software Foundation; either
11// version 2.1 of the License, or (at your option) any later version.
12// The full text of the license can be found in the file LICENSE at
13// the top level of the DFT-FE distribution.
14//
15// ---------------------------------------------------------------------
16//
17
18
19/*
20 * @author Sambit Das, Bikash Kanungo
21 */
22
23
24#ifndef dftfeMultiVector_h
25#define dftfeMultiVector_h
26
27#include <TypeConfig.h>
28#include <MemoryStorage.h>
29#include <MPIPatternP2P.h>
30#include <MPICommunicatorP2P.h>
31#include <memory>
32#include <deal.II/lac/la_parallel_vector.h>
33namespace dftfe
34{
35 namespace linearAlgebra
36 {
37 /**
38 * @brief An class template to encapsulate a MultiVector.
39 * A MultiVector is a collection of \f$N\f$ vectors belonging to the same
40 * finite-dimensional vector space, where usual notion of vector size
41 * denotes the dimension of the vector space. Note that this in the
42 * mathematical sense and not in the sense of an multi-dimensional array.The
43 * MultiVector is stored contiguously with the vector index being the
44 * fastest index, or in other words a matrix of size \f$M \times N\f$ in row
45 * major format with \f$M \f$ denoting the dimension of the vector space
46 * (size of individual vector).
47 *
48 * This class handles both serial and distributed MultiVector
49 * in a unfied way. There are different constructors provided for the
50 * serial and distributed case.
51 *
52 * The serial MultiVector, as the name suggests, resides entirely in a
53 * processor.
54 *
55 * The distributed MultiVector, on the other hand, is distributed across a
56 * set of processors. The storage of each of the \f$N\f$ vectors in the
57 * distributed MultiVector in a processor follows along similar lines to
58 * a distributed Vector object and comprises of two parts:
59 * 1. <b>locally owned part</b>: A part of the distribute MultiVector,
60 * defined through a contiguous range of indices \f$[a,b)\f$ (\f$a\f$ is
61 * included, but \f$b\f$ is not), for which the current processor is the
62 * sole owner. The size of the locally owned part (i.e., \f$b-a\f$) is
63 * termed as \e locallyOwnedSize. Note that the range of indices that
64 * comprises the locally owned part (i.e., \f$[a,b)\f$) is same for all the
65 * \f$N\f$ vectors in the MultiVector
66 * 2. <b>ghost part</b>: Part of the MultiVector, defined
67 * through a set of ghost indices, that are owned by other processors.
68 * The size of ghost indices for each vector is termed as \e ghostSize. Note
69 * that the set of indices that define the ghost indices are same for all
70 * the \f$N\f$ vectors in the MultiVector
71 *
72 * The global size of each vector in the distributed MultiVector
73 * (i.e., the number of unique indices across all the processors) is simply
74 * termed as \e size. Additionally, we define \e localSize = \e
75 * locallyOwnedSize + \e ghostSize.
76 *
77 * We handle the serial MultiVector as a special case of the distributed
78 * MultiVector, wherein \e size = \e locallyOwnedSize and \e ghostSize = 0.
79 *
80 * @note While typically one would link to an MPI library while compiling this class,
81 * care is taken to seamlessly allow usage of this class even while not
82 * linking to an MPI library. To do so, we have our own MPI wrappers that
83 * redirect to the MPI library's function calls and definitions while
84 * linking to an MPI library. While not linking to an MPI library, the MPI
85 * wrappers provide equivalent functions and definitions that mimic the MPI
86 * functions and definitions, albeit for a single processor. This allows the
87 * user of this class to seamlessly switch between linking and de-linking to
88 * an MPI library without any change in the code and with the expected
89 * behavior.
90 *
91 * @note Note that the case of not linking to an MPI library and the case of
92 * creating a serial mult-Vector are two independent things. One can still
93 * create a serial MultiVector while linking to an MPI library and
94 * running the code across multipe processors. That is, one can create a
95 * serial MultiVector in one or more than one of the set of processors used
96 * when running in parallel. Internally, we handle this by using
97 * MPI_COMM_SELF as our MPI_Comm for the serial MultiVector (i.e., the
98 * processor does self communication). However, while not linking to an MPI
99 * library (which by definition means running on a single processor), there
100 * is no notion of communication (neither with self nor with other
101 * processors). In such case, both serial and distributed mult-Vector mean
102 * the same thing and the MPI wrappers ensure the expected behavior (i.e.,
103 * the behavior of a MultiVector while using just one processor)
104 *
105 * @tparam template parameter ValueType defines underlying datatype being stored
106 * in the MultiVector (i.e., int, double, complex<double>, etc.)
107 * @tparam template parameter memorySpace defines the MemorySpace (i.e., HOST or
108 * DEVICE) in which the MultiVector must reside.
109 *
110 * @note Broadly, there are two ways of constructing a distributed MultiVector.
111 * 1. [<b>Prefered and efficient approach</b>] The first approach takes a
112 * pointer to an MPIPatternP2P as an input argument (along with other
113 * arguments). The MPIPatternP2P, in turn, contains all the information
114 * regarding the locally owned and ghost part of the MultiVector as well
115 * as the interaction map between processors. This is the most efficient way
116 * of constructing a distributed MultiVector as it allows for reusing of an
117 * already constructed MPIPatternP2P.
118 * 2. [<b> Expensive approach</b>] The second approach takes in the
119 * locally owned, ghost indices or the total number of indices
120 * across all the processors and internally creates an
121 * MPIPatternP2P object. Given that the creation of an MPIPatternP2P is
122 * expensive, this route of constructing a distributed MultiVector
123 * <b>should</b> be avoided.
124 */
125 template <typename ValueType, dftfe::utils::MemorySpace memorySpace>
127 {
128 public:
129 //
130 // typedefs
131 //
134 using pointer = typename Storage::pointer;
137 using iterator = typename Storage::iterator;
139
140 public:
141 /**
142 * @brief Default Constructor
143 */
144 MultiVector() = default;
145
146 /**
147 * @brief Default Destructor
148 */
149 ~MultiVector() = default;
150
151 /**
152 * @brief Constructor for \b serial MultiVector with vector size, number of vectors and initial value arguments
153 * @param[in] size size of each vector in the MultiVector
154 * @param[in] numVectors number of vectors in the MultiVector
155 * @param[in] initVal initial value of elements of the MultiVector
156 *
157 */
159 const size_type numVectors,
160 const ValueType initVal = 0);
161
162 /**
163 * @brief Constructor for a \serial MultiVector with a predefined
164 * MultiVector::Storage (i.e., utils::MemoryStorage).
165 * This constructor transfers the ownership of the input Storage to the
166 * MultiVector. This is useful when one does not want to allocate new
167 * memory and instead use memory allocated in the MultiVector::Storage
168 * (i.e., utils::MemoryStorage).
169 * The \e locallyOwnedSize, \e ghostSize, etc., are automatically set
170 * using the size of the input Storage object.
171 *
172 * @param[in] storage unique_ptr to MultiVector::Storage whose ownership
173 * is to be transfered to the MultiVector
174 * @param[in] numVectors number of vectors in the MultiVector
175 * @note This Constructor transfers the ownership from the input
176 * unique_ptr \p storage to the internal data member of the MultiVector.
177 * Thus, after the function call \p storage will point to NULL and any
178 * access through \p storage will lead to <b>undefined behavior</b>.
179 *
180 */
182 std::unique_ptr<typename MultiVector<ValueType, memorySpace>::Storage>
183 storage,
185
186 /**
187 * @brief Constructor for a \b distributed MultiVector based on an input MPIPatternP2P.
188 *
189 * @param[in] mpiPatternP2P A shared_ptr to const MPIPatternP2P
190 * based on which the distributed MultiVector will be created.
191 * @param[in] numVectors number of vectors in the MultiVector
192 * @param[in] initVal value with which the MultiVector shoud be
193 * initialized
194 */
196 mpiPatternP2P,
197 const size_type numVectors,
198 const ValueType initVal = 0);
199
200 /**
201 * @brief Constructor for a \b distributed MultiVector with a predefined
202 * MultiVector::Storage (i.e., utils::MemoryStorage) and MPIPatternP2P.
203 * This constructor transfers the ownership of the input Storage to the
204 * MultiVector. This is useful when one does not want to allocate new
205 * memory and instead use memory allocated in the input
206 * MultiVector::Storage (i.e., utils::MemoryStorage).
207 *
208 * @param[in] storage unique_ptr to MultiVector::Storage whose ownership
209 * is to be transfered to the MultiVector
210 * @param[in] mpiPatternP2P A shared_ptr to const MPIPatternP2P
211 * based on which the distributed MultiVector will be created.
212 * @param[in] numVectors number of vectors in the MultiVector
213 *
214 * @note This Constructor transfers the ownership from the input
215 * unique_ptr \p storage to the internal data member of the MultiVector.
216 * Thus, after the function call \p storage will point to NULL and any
217 * access through \p storage will lead to <b>undefined behavior</b>.
218 *
219 */
221 std::unique_ptr<typename MultiVector<ValueType, memorySpace>::Storage>
222 &storage,
223 std::shared_ptr<const utils::mpi::MPIPatternP2P<memorySpace>>
224 mpiPatternP2P,
225 const size_type numVectors);
226
227 /**
228 * @brief Constructor for a \distributed MultiVector based on locally
229 * owned and ghost indices.
230 * @note This way of construction is expensive. One should use the other
231 * constructor based on an input MPIPatternP2P as far as possible.
232 *
233 * @param[in] locallyOwnedRange a pair \f$(a,b)\f$ which defines a range
234 * of indices (continuous) that are owned by the current processor.
235 * @param[in] ghostIndices vector containing an ordered set of ghost
236 * indices (ordered in increasing order and non-repeating)
237 * @param[in] mpiComm MPI_Comm object associated with the group
238 * of processors across which the MultiVector is to be distributed
239 * @param[in] numVectors number of vectors in the MultiVector
240 * @param[in] initVal value with which the MultiVector shoud be
241 * initialized
242 *
243 * @note The locallyOwnedRange should be an open interval where the start
244 * index is included, but the end index is not included.
245 */
247 const std::pair<global_size_type, global_size_type> locallyOwnedRange,
248 const std::vector<global_size_type> & ghostIndices,
249 const MPI_Comm & mpiComm,
250 const size_type numVectors,
251 ValueType initVal = 0);
252
253 /**
254 * @brief Constructor for a special case of \b distributed MultiVector where none
255 * none of the processors have any ghost indices.
256 * @note This way of construction is expensive. One should use the other
257 * constructor based on an input MPIPatternP2P as far as possible.
258 *
259 * @param[in] locallyOwnedRange a pair \f$(a,b)\f$ which defines a range
260 * of indices (continuous) that are owned by the current processor.
261 * @param[in] mpiComm MPI_Comm object associated with the group
262 * of processors across which the MultiVector is to be distributed
263 * @param[in] numVectors number of vectors in the MultiVector
264 * @param[in] initVal value with which the MultiVector shoud be
265 * initialized
266 *
267 * @note The locallyOwnedRange should be an open interval where the start index included,
268 * but the end index is not included.
269 */
271 const std::pair<global_size_type, global_size_type> locallyOwnedRange,
272 const MPI_Comm & mpiComm,
273 const size_type numVectors,
274 const ValueType initVal = 0);
275
276
277 /**
278 * @brief Constructor for a \b distributed MultiVector based on total number of global indices.
279 * The resulting MultiVector will not contain any ghost indices on any of
280 * the processors. Internally, the vector is divided to ensure as much
281 * equitable distribution across all the processors much as possible.
282 * @note This way of construction is expensive. One should use the other
283 * constructor based on an input MPIPatternP2P as far as possible.
284 * Further, the decomposition is not compatible with other ways of
285 * distributed MultiVector construction.
286 * @param[in] globalSize Total number of global indices that is
287 * distributed over the processors.
288 * @param[in] mpiComm MPI_Comm object associated with the group
289 * of processors across which the MultiVector is to be distributed
290 * @param[in] numVectors number of vectors in the MultiVector
291 * @param[in] initVal value with which the MultiVector shoud be
292 * initialized
293 */
295 const MPI_Comm & mpiComm,
296 const size_type numVectors,
297 const ValueType initVal = 0);
298
299
300 /**
301 * @brief Copy constructor
302 * @param[in] u MultiVector object to copy from
303 */
305
306 /**
307 * @brief Copy constructor with reinitialisation
308 * @param[in] u MultiVector object to copy from
309 * @param[in] initVal Initial value of the MultiVector
310 */
311 MultiVector(const MultiVector &u, const ValueType initVal = 0);
312
313 /**
314 * @brief Move constructor
315 * @param[in] u MultiVector object to move from
316 */
318
319 /**
320 * @brief Copy assignment operator
321 * @param[in] u const reference to MultiVector object to copy
322 * from
323 * @return reference to this object after copying data from u
324 */
327
328 /**
329 * @brief Move assignment operator
330 * @param[in] u const reference to MultiVector object to move
331 * from
332 * @return reference to this object after moving data from u
333 */
336
337 /**
338 * @brief pointer swap
339 *
340 */
341 void
343
344 /**
345 * @brief reinit for a \b distributed MultiVector based on an input MPIPatternP2P.
346 *
347 * @param[in] mpiPatternP2P A shared_ptr to const MPIPatternP2P
348 * based on which the distributed MultiVector will be reinitialized.
349 * @param[in] numVectors number of vectors in the MultiVector
350 * @param[in] initVal value with which the MultiVector shoud be
351 * reinitialized
352 */
353 void
355 mpiPatternP2P,
356 const size_type numVectors,
357 const ValueType initVal = 0);
358
359 /**
360 * @brief reinit based on an input distributed MultiVector.
361 *
362 */
363 void
365
366
367 /**
368 * @brief Return iterator pointing to the beginning of MultiVector data.
369 *
370 * @returns Iterator pointing to the beginning of MultiVector.
371 */
374
375 /**
376 * @brief Return iterator pointing to the beginning of MultiVector
377 * data.
378 *
379 * @returns Constant iterator pointing to the beginning of
380 * MultiVector.
381 */
383 begin() const;
384
385 /**
386 * @brief Return iterator pointing to the end of MultiVector data.
387 *
388 * @returns Iterator pointing to the end of MultiVector.
389 */
392
393 /**
394 * @brief Return iterator pointing to the end of MultiVector data.
395 *
396 * @returns Constant iterator pointing to the end of
397 * MultiVector.
398 */
400 end() const;
401
402 /**
403 * @brief Return the raw pointer to the MultiVector data
404 * @return pointer to data
405 */
406 ValueType *
408
409 /**
410 * @brief Return the constant raw pointer to the MultiVector data
411 * @return pointer to const data
412 */
413 const ValueType *
414 data() const;
415
416
417 /**
418 * @brief Set all entries of the MultiVector to a given value
419 *
420 * @param[in] val The value to which the entries are to be set
421 */
422 void
423 setValue(const ValueType val);
424
425 template <typename ValueBaseType>
426 void
427 scale(const ValueBaseType val);
428
429 template <typename ValueBaseType>
430 void
431 add(const ValueBaseType *valVec, const MultiVector &u);
432
433 template <typename ValueBaseType>
434 void
435 add(const ValueBaseType val, const MultiVector &u);
436
437 template <typename ValueBaseType1, typename ValueBaseType2>
438 void
439 addAndScale(const ValueBaseType1 valScale,
440 const ValueBaseType2 valAdd,
441 const MultiVector & u);
442
443 template <typename ValueBaseType1, typename ValueBaseType2>
444 void
445 scaleAndAdd(const ValueBaseType1 valScale,
446 const ValueBaseType2 valAdd,
447 const MultiVector & u);
448
449 void
450 dot(const MultiVector &u, ValueType *dotVec);
451
452 void
454
455 void
456 updateGhostValues(const size_type communicationChannel = 0);
457
458 void
459 accumulateAddLocallyOwned(const size_type communicationChannel = 0);
460
461 void
462 updateGhostValuesBegin(const size_type communicationChannel = 0);
463
464 void
466
467 void
468 accumulateAddLocallyOwnedBegin(const size_type communicationChannel = 0);
469
470 void
472
473 bool
475
476 std::shared_ptr<const utils::mpi::MPIPatternP2P<memorySpace>>
478
479 template <typename ValueBaseType>
480 void
481 l2Norm(ValueBaseType *normVec) const;
482
483 void
486
487
489 globalSize() const;
491 localSize() const;
495 ghostSize() const;
497 numVectors() const;
498
499 const Storage &
500 getData() const;
501
502 private:
503 std::unique_ptr<Storage> d_storage;
509 std::unique_ptr<utils::mpi::MPICommunicatorP2P<ValueType, memorySpace>>
511 std::shared_ptr<const utils::mpi::MPIPatternP2P<memorySpace>>
513 };
514
515 //
516 // helper functions
517 //
518 template <typename ValueType, utils::MemorySpace memorySpace>
519 void
521 const std::shared_ptr<const dealii::Utilities::MPI::Partitioner>
522 & partitioner,
523 const size_type numVectors,
525
526 } // end of namespace linearAlgebra
527} // end of namespace dftfe
528#include "MultiVector.t.cc"
529#endif // dftfeMultiVector_h
An class template to encapsulate a MultiVector. A MultiVector is a collection of vectors belonging t...
Definition MultiVector.h:127
void setValue(const ValueType val)
Set all entries of the MultiVector to a given value.
Definition MultiVector.t.cc:520
MultiVector & operator=(const MultiVector &u)
Copy assignment operator.
Definition MultiVector.t.cc:371
void updateGhostValuesBegin(const size_type communicationChannel=0)
Definition MultiVector.t.cc:555
std::shared_ptr< const utils::mpi::MPIPatternP2P< memorySpace > > d_mpiPatternP2P
Definition MultiVector.h:512
MultiVector(const std::pair< global_size_type, global_size_type > locallyOwnedRange, const MPI_Comm &mpiComm, const size_type numVectors, const ValueType initVal=0)
Constructor for a special case of distributed MultiVector where none none of the processors have any ...
Definition MultiVector.t.cc:189
void setCommunicationPrecision(utils::mpi::communicationPrecision commPrecision)
Definition MultiVector.t.cc:806
const_iterator begin() const
Return iterator pointing to the beginning of MultiVector data.
Definition MultiVector.t.cc:485
typename Storage::const_reference const_reference
Definition MultiVector.h:136
bool isCompatible(const MultiVector< ValueType, memorySpace > &rhs) const
Definition MultiVector.t.cc:587
std::shared_ptr< const utils::mpi::MPIPatternP2P< memorySpace > > getMPIPatternP2P() const
Definition MultiVector.t.cc:606
void reinit(const MultiVector &u)
reinit based on an input distributed MultiVector.
Definition MultiVector.t.cc:470
void scale(const ValueBaseType val)
Definition MultiVector.t.cc:757
MultiVector(const size_type size, const size_type numVectors, const ValueType initVal=0)
Constructor for serial MultiVector with vector size, number of vectors and initial value arguments.
Definition MultiVector.t.cc:33
std::unique_ptr< Storage > d_storage
Definition MultiVector.h:503
std::unique_ptr< utils::mpi::MPICommunicatorP2P< NumberType, memorySpace > > d_mpiCommunicatorP2P
Definition MultiVector.h:510
MultiVector(MultiVector &&u) noexcept
Move constructor.
Definition MultiVector.t.cc:354
MultiVector(std::shared_ptr< const utils::mpi::MPIPatternP2P< memorySpace > > mpiPatternP2P, const size_type numVectors, const ValueType initVal=0)
Constructor for a distributed MultiVector based on an input MPIPatternP2P.
Definition MultiVector.t.cc:86
typename Storage::iterator iterator
Definition MultiVector.h:137
void accumulateAddLocallyOwnedEnd()
Definition MultiVector.t.cc:580
void reinit(std::shared_ptr< const utils::mpi::MPIPatternP2P< memorySpace > > mpiPatternP2P, const size_type numVectors, const ValueType initVal=0)
reinit for a distributed MultiVector based on an input MPIPatternP2P.
Definition MultiVector.t.cc:444
void addAndScale(const ValueBaseType1 valScale, const ValueBaseType2 valAdd, const MultiVector &u)
Definition MultiVector.t.cc:717
const ValueType * data() const
Return the constant raw pointer to the MultiVector data.
Definition MultiVector.t.cc:513
MultiVector(const std::pair< global_size_type, global_size_type > locallyOwnedRange, const std::vector< global_size_type > &ghostIndices, const MPI_Comm &mpiComm, const size_type numVectors, ValueType initVal=0)
Constructor for a \distributed MultiVector based on locally owned and ghost indices.
Definition MultiVector.t.cc:141
~MultiVector()=default
Default Destructor.
iterator begin()
Return iterator pointing to the beginning of MultiVector data.
Definition MultiVector.t.cc:478
size_type localSize() const
Definition MultiVector.t.cc:620
void l2Norm(ValueBaseType *normVec) const
Definition MultiVector.t.cc:649
void scaleAndAdd(const ValueBaseType1 valScale, const ValueBaseType2 valAdd, const MultiVector &u)
Definition MultiVector.t.cc:737
MultiVector()=default
Default Constructor.
void zeroOutGhosts()
Definition MultiVector.t.cc:527
size_type ghostSize() const
Definition MultiVector.t.cc:634
void accumulateAddLocallyOwned(const size_type communicationChannel=0)
Definition MultiVector.t.cc:546
MultiVector & operator=(MultiVector &&u)
Move assignment operator.
Definition MultiVector.t.cc:394
const_iterator end() const
Return iterator pointing to the end of MultiVector data.
Definition MultiVector.t.cc:499
void updateGhostValues(const size_type communicationChannel=0)
Definition MultiVector.t.cc:538
void updateGhostValuesEnd()
Definition MultiVector.t.cc:564
void add(const ValueBaseType val, const MultiVector &u)
Definition MultiVector.t.cc:701
size_type locallyOwnedSize() const
Definition MultiVector.t.cc:627
typename Storage::const_iterator const_iterator
Definition MultiVector.h:138
ValueType * data()
Return the raw pointer to the MultiVector data.
Definition MultiVector.t.cc:506
void swap(MultiVector &u)
pointer swap
Definition MultiVector.t.cc:413
const Storage & getData() const
Definition MultiVector.t.cc:814
void add(const ValueBaseType *valVec, const MultiVector &u)
Definition MultiVector.t.cc:686
void dot(const MultiVector &u, ValueType *dotVec)
Definition MultiVector.t.cc:770
typename Storage::pointer pointer
Definition MultiVector.h:134
void accumulateAddLocallyOwnedBegin(const size_type communicationChannel=0)
Definition MultiVector.t.cc:571
MultiVector(const global_size_type globalSize, const MPI_Comm &mpiComm, const size_type numVectors, const ValueType initVal=0)
Constructor for a distributed MultiVector based on total number of global indices....
Definition MultiVector.t.cc:242
MultiVector(std::unique_ptr< typename MultiVector< ValueType, memorySpace >::Storage > storage, size_type numVectors)
Constructor for a \serial MultiVector with a predefined MultiVector::Storage (i.e....
Definition MultiVector.t.cc:62
typename Storage::value_type value_type
Definition MultiVector.h:133
dftfe::utils::MemoryStorage< NumberType, memorySpace > Storage
Definition MultiVector.h:132
iterator end()
Return iterator pointing to the end of MultiVector data.
Definition MultiVector.t.cc:492
MultiVector(const MultiVector &u)
Copy constructor.
Definition MultiVector.t.cc:311
typename Storage::reference reference
Definition MultiVector.h:135
MultiVector(const MultiVector &u, const ValueType initVal=0)
Copy constructor with reinitialisation.
Definition MultiVector.t.cc:332
MultiVector(std::unique_ptr< typename MultiVector< ValueType, memorySpace >::Storage > &storage, std::shared_ptr< const utils::mpi::MPIPatternP2P< memorySpace > > mpiPatternP2P, const size_type numVectors)
Constructor for a distributed MultiVector with a predefined MultiVector::Storage (i....
Definition MultiVector.t.cc:115
Definition MemoryStorage.h:33
ValueType * iterator
Definition MemoryStorage.h:54
ValueType & reference
Definition MemoryStorage.h:52
ValueType * pointer
Definition MemoryStorage.h:51
ValueType value_type
A class template to provide an interface that can act similar to STL vectors but with different Memor...
Definition MemoryStorage.h:50
const ValueType & const_reference
Definition MemoryStorage.h:53
const ValueType * const_iterator
Definition MemoryStorage.h:55
A class template to store the communication pattern (i.e., which entries/nodes to receive from which ...
Definition MPIPatternP2P.h:57
Definition BLASWrapper.h:33
void createMultiVectorFromDealiiPartitioner(const std::shared_ptr< const dealii::Utilities::MPI::Partitioner > &partitioner, const size_type numVectors, MultiVector< ValueType, memorySpace > &multiVector)
Definition MultiVector.t.cc:821
communicationPrecision
Definition MPICommunicatorP2P.h:55
Definition pseudoPotentialToDftfeConverter.cc:34
unsigned int size_type
Definition TypeConfig.h:6
unsigned long int global_size_type
Definition TypeConfig.h:7