//============================================================================ // Copyright (c) Kitware, Inc. // All rights reserved. // See LICENSE.txt for details. // // This software is distributed WITHOUT ANY WARRANTY; without even // the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR // PURPOSE. See the above copyright notice for more information. //============================================================================ #include #include #include #include #include #include #include // clang-format off VTKM_THIRDPARTY_PRE_INCLUDE #include VTKM_THIRDPARTY_POST_INCLUDE // clang-format on namespace vtkm { namespace cont { VTKM_CONT PartitionedDataSet::PartitionedDataSet(const vtkm::cont::DataSet& ds) { this->Partitions.insert(this->Partitions.end(), ds); } VTKM_CONT PartitionedDataSet::PartitionedDataSet(const std::vector& partitions) { this->Partitions = partitions; } VTKM_CONT PartitionedDataSet::PartitionedDataSet(vtkm::Id size) { this->Partitions.reserve(static_cast(size)); } VTKM_CONT vtkm::cont::Field PartitionedDataSet::GetFieldFromPartition(const std::string& field_name, int partition_index) const { assert(partition_index >= 0); assert(static_cast(partition_index) < this->Partitions.size()); return this->Partitions[static_cast(partition_index)].GetField(field_name); } VTKM_CONT vtkm::Id PartitionedDataSet::GetNumberOfPartitions() const { return static_cast(this->Partitions.size()); } VTKM_CONT vtkm::Id PartitionedDataSet::GetGlobalNumberOfPartitions() const { #ifdef VTKM_ENABLE_MPI auto comm = vtkm::cont::EnvironmentTracker::GetCommunicator(); vtkm::Id globalSize = 0; vtkmdiy::mpi::all_reduce(comm, GetNumberOfPartitions(), globalSize, std::plus{}); return globalSize; #else return GetNumberOfPartitions(); #endif } VTKM_CONT const vtkm::cont::DataSet& PartitionedDataSet::GetPartition(vtkm::Id blockId) const { return this->Partitions[static_cast(blockId)]; } VTKM_CONT const std::vector& PartitionedDataSet::GetPartitions() const { return this->Partitions; } VTKM_CONT void PartitionedDataSet::AppendPartition(const vtkm::cont::DataSet& ds) { this->Partitions.insert(this->Partitions.end(), ds); } VTKM_CONT void PartitionedDataSet::AppendPartitions(const std::vector& partitions) { this->Partitions.insert(this->Partitions.end(), partitions.begin(), partitions.end()); } VTKM_CONT void PartitionedDataSet::InsertPartition(vtkm::Id index, const vtkm::cont::DataSet& ds) { if (index <= static_cast(this->Partitions.size())) { this->Partitions.insert(this->Partitions.begin() + index, ds); } else { std::string msg = "invalid insert position\n "; throw ErrorBadValue(msg); } } VTKM_CONT void PartitionedDataSet::ReplacePartition(vtkm::Id index, const vtkm::cont::DataSet& ds) { if (index < static_cast(this->Partitions.size())) this->Partitions.at(static_cast(index)) = ds; else { std::string msg = "invalid replace position\n "; throw ErrorBadValue(msg); } } VTKM_CONT void PartitionedDataSet::CopyPartitions(const vtkm::cont::PartitionedDataSet& source) { this->Partitions = source.Partitions; } VTKM_CONT void PartitionedDataSet::PrintSummary(std::ostream& stream) const { stream << "PartitionedDataSet [" << this->Partitions.size() << " partitions]:\n"; for (size_t part = 0; part < this->Partitions.size(); ++part) { stream << "Partition " << part << ":\n"; this->Partitions[part].PrintSummary(stream); } stream << " Fields[" << this->GetNumberOfFields() << "]\n"; for (vtkm::Id index = 0; index < this->GetNumberOfFields(); index++) { this->GetField(index).PrintSummary(stream); } } } } // namespace vtkm::cont