32 template <
typename ValueType, dftfe::utils::MemorySpace memorySpace>
36 const ValueType initVal )
39 std::make_unique<typename MultiVector<ValueType, memorySpace>::Storage>(
47 std::make_shared<const utils::mpi::MPIPatternP2P<memorySpace>>(size);
61 template <
typename ValueType, dftfe::utils::MemorySpace memorySpace>
74 std::make_shared<const utils::mpi::MPIPatternP2P<memorySpace>>(
85 template <
typename ValueType, dftfe::utils::MemorySpace memorySpace>
90 const ValueType initVal )
99 std::make_unique<typename MultiVector<ValueType, memorySpace>::Storage>(
114 template <
typename ValueType, dftfe::utils::MemorySpace memorySpace>
140 template <
typename ValueType, dftfe::utils::MemorySpace memorySpace>
142 const std::pair<global_size_type, global_size_type> locallyOwnedRange,
143 const std::vector<global_size_type> & ghostIndices,
144 const MPI_Comm & mpiComm,
146 const ValueType initVal )
152 int err = MPI_Comm_rank(mpiComm, &mpiRank);
157 "WARNING: Constructing a distributed MultiVector using locally owned "
158 "range and ghost indices is expensive. As far as possible, one should "
159 " use the constructor based on an input MPIPatternP2P.";
160 std::cout << msg << std::endl;
165 std::make_shared<const utils::mpi::MPIPatternP2P<memorySpace>>(
166 locallyOwnedRange, ghostIndices, mpiComm);
168 d_mpiCommunicatorP2P = std::make_unique<
170 d_mpiPatternP2P, numVectors);
172 d_globalSize = d_mpiPatternP2P->nGlobalIndices();
173 d_locallyOwnedSize = d_mpiPatternP2P->localOwnedSize();
174 d_ghostSize = d_mpiPatternP2P->localGhostSize();
175 d_localSize = d_locallyOwnedSize + d_ghostSize;
176 d_numVectors = numVectors;
178 std::make_unique<typename MultiVector<ValueType, memorySpace>::Storage>(
179 d_localSize * numVectors, initVal);
188 template <
typename ValueType, dftfe::utils::MemorySpace memorySpace>
190 const std::pair<global_size_type, global_size_type> locallyOwnedRange,
191 const MPI_Comm & mpiComm,
193 const ValueType initVal )
199 int err = MPI_Comm_rank(mpiComm, &mpiRank);
204 "WARNING: Constructing a distributed MultiVector using only locally owned "
205 "range is expensive. As far as possible, one should "
206 " use the constructor based on an input MPIPatternP2P.";
207 std::cout << msg << std::endl;
210 std::vector<dftfe::global_size_type> ghostIndices;
211 ghostIndices.resize(0);
213 std::make_shared<const utils::mpi::MPIPatternP2P<memorySpace>>(
214 locallyOwnedRange, ghostIndices, mpiComm);
216 d_mpiCommunicatorP2P = std::make_unique<
218 d_mpiPatternP2P, numVectors);
226 std::make_unique<typename MultiVector<ValueType, memorySpace>::Storage>(
241 template <
typename ValueType, dftfe::utils::MemorySpace memorySpace>
244 const MPI_Comm & mpiComm,
246 const ValueType initVal )
248 std::vector<dftfe::global_size_type> ghostIndices;
249 ghostIndices.resize(0);
251 std::pair<global_size_type, global_size_type> locallyOwnedRange;
257 int err = MPI_Comm_rank(mpiComm, &mpiRank);
262 "WARNING: Constructing a MultiVector using total number of indices across all processors "
263 "is expensive. As far as possible, one should "
264 " use the constructor based on an input MPIPatternP2P.";
265 std::cout << msg << std::endl;
269 int errProc = MPI_Comm_size(mpiComm, &mpiProcess);
277 startIndex += mpiRank;
281 locallyOwnedRange.first = startIndex;
288 std::make_shared<const utils::mpi::MPIPatternP2P<memorySpace>>(
289 locallyOwnedRange, ghostIndices, mpiComm);
301 std::make_unique<typename MultiVector<ValueType, memorySpace>::Storage>(
310 template <
typename ValueType, dftfe::utils::MemorySpace memorySpace>
314 std::make_unique<typename MultiVector<ValueType, memorySpace>::Storage>(
331 template <
typename ValueType, dftfe::utils::MemorySpace memorySpace>
334 const ValueType initVal )
337 std::make_unique<typename MultiVector<ValueType, memorySpace>::Storage>(
353 template <
typename ValueType, dftfe::utils::MemorySpace memorySpace>
369 template <
typename ValueType, dftfe::utils::MemorySpace memorySpace>
374 std::make_unique<typename MultiVector<ValueType, memorySpace>::Storage>(
392 template <
typename ValueType, dftfe::utils::MemorySpace memorySpace>
411 template <
typename ValueType, dftfe::utils::MemorySpace memorySpace>
442 template <
typename ValueType, dftfe::utils::MemorySpace memorySpace>
448 const ValueType initVal)
456 std::make_unique<typename MultiVector<ValueType, memorySpace>::Storage>(
468 template <
typename ValueType, dftfe::utils::MemorySpace memorySpace>
476 template <
typename ValueType, dftfe::utils::MemorySpace memorySpace>
483 template <
typename ValueType, dftfe::utils::MemorySpace memorySpace>
490 template <
typename ValueType, dftfe::utils::MemorySpace memorySpace>
497 template <
typename ValueType, dftfe::utils::MemorySpace memorySpace>
504 template <
typename ValueType, dftfe::utils::MemorySpace memorySpace>
511 template <
typename ValueType, dftfe::utils::MemorySpace memorySpace>
518 template <
typename ValueType, dftfe::utils::MemorySpace memorySpace>
525 template <
typename ValueType, dftfe::utils::MemorySpace memorySpace>
536 template <
typename ValueType, dftfe::utils::MemorySpace memorySpace>
544 template <
typename ValueType, dftfe::utils::MemorySpace memorySpace>
550 communicationChannel);
553 template <
typename ValueType, dftfe::utils::MemorySpace memorySpace>
559 communicationChannel);
562 template <
typename ValueType, dftfe::utils::MemorySpace memorySpace>
569 template <
typename ValueType, dftfe::utils::MemorySpace memorySpace>
578 template <
typename ValueType, dftfe::utils::MemorySpace memorySpace>
585 template <
typename ValueType, dftfe::utils::MemorySpace memorySpace>
604 template <
typename ValueType, dftfe::utils::MemorySpace memorySpace>
605 std::shared_ptr<const utils::mpi::MPIPatternP2P<memorySpace>>
611 template <
typename ValueType, dftfe::utils::MemorySpace memorySpace>
618 template <
typename ValueType, dftfe::utils::MemorySpace memorySpace>
625 template <
typename ValueType, dftfe::utils::MemorySpace memorySpace>
632 template <
typename ValueType, dftfe::utils::MemorySpace memorySpace>
639 template <
typename ValueType, dftfe::utils::MemorySpace memorySpace>
646 template <
typename ValueType, dftfe::utils::MemorySpace memorySpace>
647 template <
typename ValueBaseType>
653 "[] L2-Norm evaluation not implemented for DEVICE");
667 [](
auto &a,
auto &b) {
672 MPI_Allreduce(MPI_IN_PLACE,
678 std::transform(normVec, normVec +
d_numVectors, normVec, [](
auto &a) {
683 template <
typename ValueType, dftfe::utils::MemorySpace memorySpace>
684 template <
typename ValueBaseType>
691 "[] Add not implemented for DEVICE");
698 template <
typename ValueType, dftfe::utils::MemorySpace memorySpace>
699 template <
typename ValueBaseType>
706 "[] Add not implemented for DEVICE");
707 std::transform(
begin(),
711 [&val](
auto &a,
auto &b) {
return (a + val * b); });
714 template <
typename ValueType, dftfe::utils::MemorySpace memorySpace>
715 template <
typename ValueBaseType1,
typename ValueBaseType2>
718 const ValueBaseType1 valScale,
719 const ValueBaseType2 valAdd,
724 "[] Add not implemented for DEVICE");
725 std::transform(
begin(),
729 [&valScale, &valAdd](
auto &a,
auto &b) {
730 return valScale * (a + valAdd * b);
734 template <
typename ValueType, dftfe::utils::MemorySpace memorySpace>
735 template <
typename ValueBaseType1,
typename ValueBaseType2>
738 const ValueBaseType1 valScale,
739 const ValueBaseType2 valAdd,
744 "[] Add not implemented for DEVICE");
745 std::transform(
begin(),
749 [&valScale, &valAdd](
auto &a,
auto &b) {
750 return valScale * a + valAdd * b;
754 template <
typename ValueType, dftfe::utils::MemorySpace memorySpace>
755 template <
typename ValueBaseType>
761 "[] Add not implemented for DEVICE");
762 std::transform(
begin(),
765 [&val](
auto &a) {
return val * a; });
768 template <
typename ValueType, dftfe::utils::MemorySpace memorySpace>
775 "[] dot product evaluation not implemented for DEVICE");
779 dotVec[ib] = (*d_storage)[ib] *
796 MPI_Allreduce(MPI_IN_PLACE,
804 template <
typename ValueType, dftfe::utils::MemorySpace memorySpace>
812 template <
typename ValueType, dftfe::utils::MemorySpace memorySpace>
819 template <
typename ValueType, utils::MemorySpace memorySpace>
822 const std::shared_ptr<const dealii::Utilities::MPI::Partitioner>
827 const std::pair<global_size_type, global_size_type> &locallyOwnedRange =
828 partitioner->local_range();
831 std::vector<global_size_type> ghostIndices;
832 (partitioner->ghost_indices()).fill_index_vector(ghostIndices);
839 std::shared_ptr<dftfe::utils::mpi::MPIPatternP2P<memorySpace>>
841 std::make_shared<dftfe::utils::mpi::MPIPatternP2P<memorySpace>>(
844 partitioner->get_mpi_communicator());
846 multiVector.
reinit(mpiPatternP2PPtr, numVectors);
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
void setCommunicationPrecision(utils::mpi::communicationPrecision commPrecision)
Definition MultiVector.t.cc:806
bool isCompatible(const MultiVector< ValueType, memorySpace > &rhs) const
Definition MultiVector.t.cc:587
size_type d_numVectors
Definition MultiVector.h:508
std::shared_ptr< const utils::mpi::MPIPatternP2P< memorySpace > > getMPIPatternP2P() const
Definition MultiVector.t.cc:606
void scale(const ValueBaseType val)
Definition MultiVector.t.cc:757
size_type d_ghostSize
Definition MultiVector.h:507
std::unique_ptr< Storage > d_storage
Definition MultiVector.h:503
std::unique_ptr< utils::mpi::MPICommunicatorP2P< ValueType, memorySpace > > d_mpiCommunicatorP2P
Definition MultiVector.h:510
size_type d_locallyOwnedSize
Definition MultiVector.h:506
typename Storage::iterator iterator
Definition MultiVector.h:137
void accumulateAddLocallyOwnedEnd()
Definition MultiVector.t.cc:580
size_type d_localSize
Definition MultiVector.h:504
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
global_size_type globalSize() const
Definition MultiVector.t.cc:613
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
void updateGhostValues(const size_type communicationChannel=0)
Definition MultiVector.t.cc:538
void updateGhostValuesEnd()
Definition MultiVector.t.cc:564
size_type locallyOwnedSize() const
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
global_size_type d_globalSize
Definition MultiVector.h:505
void accumulateAddLocallyOwnedBegin(const size_type communicationChannel=0)
Definition MultiVector.t.cc:571
dftfe::utils::MemoryStorage< ValueType, memorySpace > Storage
Definition MultiVector.h:132
iterator end()
Return iterator pointing to the end of MultiVector data.
Definition MultiVector.t.cc:492
size_type numVectors() const
Definition MultiVector.t.cc:641
static void set(std::size_t size, ValueType *ptr, ValueType val)
Definition MemoryStorage.h:33
Definition MPICommunicatorP2P.h:63
A class template to store the communication pattern (i.e., which entries/nodes to receive from which ...
Definition MPIPatternP2P.h:57
MPI_Datatype mpi_type_id(const int *)
Definition dftfeDataTypes.h:51
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
double complexConj(const double x)
Definition DataTypeOverloads.h:77
void throwException(bool condition, std::string msg="")
@ DEVICE
Definition MemorySpaceType.h:36
double realPart(const double x)
Definition DataTypeOverloads.h:28
Definition pseudoPotentialToDftfeConverter.cc:34
unsigned int size_type
Definition TypeConfig.h:6
unsigned long int global_size_type
Definition TypeConfig.h:7