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., dftfe::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 */
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,
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 dftfe::uInt 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 */
246 MultiVector(const std::pair<dftfe::uInt, dftfe::uInt> locallyOwnedRange,
247 const std::vector<dftfe::uInt> &ghostIndices,
248 const MPI_Comm &mpiComm,
250 ValueType initVal = 0);
251
252 /**
253 * @brief Constructor for a special case of \b distributed MultiVector where none
254 * none of the processors have any ghost indices.
255 * @note This way of construction is expensive. One should use the other
256 * constructor based on an input MPIPatternP2P as far as possible.
257 *
258 * @param[in] locallyOwnedRange a pair \f$(a,b)\f$ which defines a range
259 * of indices (continuous) that are owned by the current processor.
260 * @param[in] mpiComm MPI_Comm object associated with the group
261 * of processors across which the MultiVector is to be distributed
262 * @param[in] numVectors number of vectors in the MultiVector
263 * @param[in] initVal value with which the MultiVector shoud be
264 * initialized
265 *
266 * @note The locallyOwnedRange should be an open interval where the start index included,
267 * but the end index is not included.
268 */
269 MultiVector(const std::pair<dftfe::uInt, dftfe::uInt> locallyOwnedRange,
270 const MPI_Comm &mpiComm,
272 const ValueType initVal = 0);
273
274
275 /**
276 * @brief Constructor for a \b distributed MultiVector based on total number of global indices.
277 * The resulting MultiVector will not contain any ghost indices on any of
278 * the processors. Internally, the vector is divided to ensure as much
279 * equitable distribution across all the processors much as possible.
280 * @note This way of construction is expensive. One should use the other
281 * constructor based on an input MPIPatternP2P as far as possible.
282 * Further, the decomposition is not compatible with other ways of
283 * distributed MultiVector construction.
284 * @param[in] globalSize Total number of global indices that is
285 * distributed over the processors.
286 * @param[in] mpiComm MPI_Comm object associated with the group
287 * of processors across which the MultiVector is to be distributed
288 * @param[in] numVectors number of vectors in the MultiVector
289 * @param[in] initVal value with which the MultiVector shoud be
290 * initialized
291 */
293 const MPI_Comm &mpiComm,
295 const ValueType initVal = 0);
296
297
298 /**
299 * @brief Copy constructor
300 * @param[in] u MultiVector object to copy from
301 */
303
304 /**
305 * @brief Copy constructor with reinitialisation
306 * @param[in] u MultiVector object to copy from
307 * @param[in] initVal Initial value of the MultiVector
308 */
309 MultiVector(const MultiVector &u, const ValueType initVal = 0);
310
311 /**
312 * @brief Move constructor
313 * @param[in] u MultiVector object to move from
314 */
316
317 /**
318 * @brief Copy assignment operator
319 * @param[in] u const reference to MultiVector object to copy
320 * from
321 * @return reference to this object after copying data from u
322 */
325
326 /**
327 * @brief Move assignment operator
328 * @param[in] u const reference to MultiVector object to move
329 * from
330 * @return reference to this object after moving data from u
331 */
334
335 /**
336 * @brief pointer swap
337 *
338 */
339 void
341
342 /**
343 * @brief reinit for a \b distributed MultiVector based on an input MPIPatternP2P.
344 *
345 * @param[in] mpiPatternP2P A shared_ptr to const MPIPatternP2P
346 * based on which the distributed MultiVector will be reinitialized.
347 * @param[in] numVectors number of vectors in the MultiVector
348 * @param[in] initVal value with which the MultiVector shoud be
349 * reinitialized
350 */
351 void
353 mpiPatternP2P,
355 const ValueType initVal = 0);
356
357 /**
358 * @brief reinit based on an input distributed MultiVector.
359 *
360 */
361 void
363
364
365 /**
366 * @brief Return iterator pointing to the beginning of MultiVector data.
367 *
368 * @returns Iterator pointing to the beginning of MultiVector.
369 */
372
373 /**
374 * @brief Return iterator pointing to the beginning of MultiVector
375 * data.
376 *
377 * @returns Constant iterator pointing to the beginning of
378 * MultiVector.
379 */
381 begin() const;
382
383 /**
384 * @brief Return iterator pointing to the end of MultiVector data.
385 *
386 * @returns Iterator pointing to the end of MultiVector.
387 */
390
391 /**
392 * @brief Return iterator pointing to the end of MultiVector data.
393 *
394 * @returns Constant iterator pointing to the end of
395 * MultiVector.
396 */
398 end() const;
399
400 /**
401 * @brief Return the raw pointer to the MultiVector data
402 * @return pointer to data
403 */
404 ValueType *
406
407 /**
408 * @brief Return the constant raw pointer to the MultiVector data
409 * @return pointer to const data
410 */
411 const ValueType *
412 data() const;
413
414
415 /**
416 * @brief Set all entries of the MultiVector to a given value
417 *
418 * @param[in] val The value to which the entries are to be set
419 */
420 void
421 setValue(const ValueType val);
422
423 template <typename ValueBaseType>
424 void
425 scale(const ValueBaseType val);
426
427 template <typename ValueBaseType>
428 void
429 add(const ValueBaseType *valVec, const MultiVector &u);
430
431 template <typename ValueBaseType>
432 void
433 add(const ValueBaseType val, const MultiVector &u);
434
435 template <typename ValueBaseType1, typename ValueBaseType2>
436 void
437 addAndScale(const ValueBaseType1 valScale,
438 const ValueBaseType2 valAdd,
439 const MultiVector &u);
440
441 template <typename ValueBaseType1, typename ValueBaseType2>
442 void
443 scaleAndAdd(const ValueBaseType1 valScale,
444 const ValueBaseType2 valAdd,
445 const MultiVector &u);
446
447 void
448 dot(const MultiVector &u, ValueType *dotVec);
449
450 void
452
453 void
454 updateGhostValues(const dftfe::uInt communicationChannel = 0);
455
456 void
457 accumulateAddLocallyOwned(const dftfe::uInt communicationChannel = 0);
458
459 void
460 updateGhostValuesBegin(const dftfe::uInt communicationChannel = 0);
461
462 void
464
465 void
467 const dftfe::uInt communicationChannel = 0);
468
469 void
471
472 bool
474
475 std::shared_ptr<const utils::mpi::MPIPatternP2P<memorySpace>>
477
478 template <typename ValueBaseType>
479 void
480 l2Norm(ValueBaseType *normVec) const;
481
482 void
485
486
488 globalSize() const;
490 localSize() const;
494 ghostSize() const;
496 numVectors() const;
497
498 const Storage &
499 getData() const;
500
501 private:
502 std::unique_ptr<Storage> d_storage;
508 std::unique_ptr<utils::mpi::MPICommunicatorP2P<ValueType, memorySpace>>
510 std::shared_ptr<const utils::mpi::MPIPatternP2P<memorySpace>>
512 };
513
514 //
515 // helper functions
516 //
517 template <typename ValueType, utils::MemorySpace memorySpace>
518 void
520 const std::shared_ptr<const dealii::Utilities::MPI::Partitioner>
521 &partitioner,
522 const dftfe::uInt numVectors,
524
525 } // end of namespace linearAlgebra
526} // end of namespace dftfe
527#include "MultiVector.t.cc"
528#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(const dftfe::uInt size, const dftfe::uInt numVectors, const ValueType initVal=0)
Constructor for serial MultiVector with vector size, number of vectors and initial value arguments.
Definition MultiVector.t.cc:33
MultiVector & operator=(const MultiVector &u)
Copy assignment operator.
Definition MultiVector.t.cc:371
dftfe::uInt localSize() const
Definition MultiVector.t.cc:620
std::shared_ptr< const utils::mpi::MPIPatternP2P< memorySpace > > d_mpiPatternP2P
Definition MultiVector.h:511
void updateGhostValues(const dftfe::uInt communicationChannel=0)
Definition MultiVector.t.cc:538
void setCommunicationPrecision(utils::mpi::communicationPrecision commPrecision)
Definition MultiVector.t.cc:806
MultiVector(std::unique_ptr< typename MultiVector< ValueType, memorySpace >::Storage > storage, dftfe::uInt numVectors)
Constructor for a \serial MultiVector with a predefined MultiVector::Storage (i.e....
Definition MultiVector.t.cc:62
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 updateGhostValuesBegin(const dftfe::uInt communicationChannel=0)
Definition MultiVector.t.cc:555
void scale(const ValueBaseType val)
Definition MultiVector.t.cc:757
dftfe::uInt locallyOwnedSize() const
Definition MultiVector.t.cc:627
std::unique_ptr< Storage > d_storage
Definition MultiVector.h:502
std::unique_ptr< utils::mpi::MPICommunicatorP2P< NumberType, memorySpace > > d_mpiCommunicatorP2P
Definition MultiVector.h:509
MultiVector(MultiVector &&u) noexcept
Move constructor.
Definition MultiVector.t.cc:354
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 dftfe::uInt 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 dftfe::uInt globalSize, const MPI_Comm &mpiComm, const dftfe::uInt numVectors, const ValueType initVal=0)
Constructor for a distributed MultiVector based on total number of global indices....
Definition MultiVector.t.cc:242
~MultiVector()=default
Default Destructor.
MultiVector(std::unique_ptr< typename MultiVector< ValueType, memorySpace >::Storage > &storage, std::shared_ptr< const utils::mpi::MPIPatternP2P< memorySpace > > mpiPatternP2P, const dftfe::uInt numVectors)
Constructor for a distributed MultiVector with a predefined MultiVector::Storage (i....
Definition MultiVector.t.cc:115
iterator begin()
Return iterator pointing to the beginning of MultiVector data.
Definition MultiVector.t.cc:478
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.
dftfe::uInt ghostSize() const
Definition MultiVector.t.cc:634
void zeroOutGhosts()
Definition MultiVector.t.cc:527
void accumulateAddLocallyOwnedBegin(const dftfe::uInt communicationChannel=0)
Definition MultiVector.t.cc:571
void accumulateAddLocallyOwned(const dftfe::uInt communicationChannel=0)
Definition MultiVector.t.cc:546
MultiVector(std::shared_ptr< const utils::mpi::MPIPatternP2P< memorySpace > > mpiPatternP2P, const dftfe::uInt numVectors, const ValueType initVal=0)
Constructor for a distributed MultiVector based on an input MPIPatternP2P.
Definition MultiVector.t.cc:86
MultiVector(const std::pair< dftfe::uInt, dftfe::uInt > locallyOwnedRange, const MPI_Comm &mpiComm, const dftfe::uInt 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
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 updateGhostValuesEnd()
Definition MultiVector.t.cc:564
void add(const ValueBaseType val, const MultiVector &u)
Definition MultiVector.t.cc:701
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
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(const std::pair< dftfe::uInt, dftfe::uInt > locallyOwnedRange, const std::vector< dftfe::uInt > &ghostIndices, const MPI_Comm &mpiComm, const dftfe::uInt numVectors, ValueType initVal=0)
Constructor for a \distributed MultiVector based on locally owned and ghost indices.
Definition MultiVector.t.cc:141
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 dftfe::uInt numVectors, MultiVector< ValueType, memorySpace > &multiVector)
Definition MultiVector.t.cc:821
communicationPrecision
Definition MPICommunicatorP2P.h:55
Definition pseudoPotentialToDftfeConverter.cc:34
std::uint32_t uInt
Definition TypeConfig.h:10