49template<
class ConversionPolicy,
class real_type>
61 MPI_Comm_size( col_policy.communicator(), &size);
67 thrust::host_vector<int>{} };
70 MPI_Comm_rank( col_policy.communicator(), &rank);
73 std::vector<int> global_row( A.
num_rows(), 0);
76 for(
int i = 0; i < (int)A.
num_rows(); i++)
79 assert( col_policy.global2localIdx( A.
column_indices()[jj], lIdx[jj], pids[jj]));
87 thrust::host_vector<std::array<int,2>> outer_col;
88 thrust::host_vector<int> inner_row, inner_col, outer_row;
89 thrust::host_vector<real_type> inner_val, outer_val;
90 thrust::host_vector<int> row_scatter;
91 inner_row.push_back(0);
92 outer_row.push_back(0);
93 for(
int i = 0; i < (int)A.
num_rows(); i++)
97 if( global_row[i] == 1)
99 outer_col.push_back( {pids[jj],lIdx[jj]});
100 outer_val.push_back( A.
values()[jj]);
104 inner_col.push_back( lIdx[jj]);
105 inner_val.push_back( A.
values()[jj]);
108 if( global_row[i] == 1)
110 row_scatter.push_back(i);
111 int old_end = outer_row.back();
113 inner_row.push_back( inner_row[i]);
122 col_policy.local_size(), inner_row, inner_col, inner_val);
124 thrust::host_vector<int> lColIdx;
125 auto gather_map = dg::gIdx2unique_idx( outer_col, lColIdx);
127 col_policy.communicator());
130 mpi_gather.buffer_size(), outer_row, lColIdx, outer_val);
132 return { inner, outer,
mpi_gather, row_scatter};
173template<
class ConversionPolicy,
class real_type>
178 MPI_Comm_size( row_policy.communicator(), &size);
187 thrust::host_vector<int> pids = dg::gIdx2gIdx( global_row_indices, row_policy);
188 std::map<int, thrust::host_vector<int>> rows, cols;
189 std::map<int, thrust::host_vector<real_type>> vals;
190 for(
unsigned u=0; u<global_row_indices.size(); u++)
192 rows[pids[u]].push_back( global_row_indices[u]);
194 vals[pids[u]].push_back( global.
values()[u]);
204 dg::detail::flatten_map( row_buf),
205 dg::detail::flatten_map(col_buf),
206 dg::detail::flatten_map(val_buf),
true);
244template<
class ConversionPolicy,
class real_type>
249 MPI_Comm_rank( policy.communicator(), &rank);
254 assert( policy.local2globalIdx(local_cols[i], rank, local_cols[i]) );
265template<
class MPITopology,
typename = std::enable_if_t<
dg::is_vector_v<
266 typename MPITopology::host_vector, MPIVectorTag>>>
268 g_new,
const MPITopology& g_old, std::string method =
"dg")
271 g_new.local(), g_old.global(), method);
286template<
class MPITopology,
typename = std::enable_if_t<
dg::is_vector_v<
289 g_new,
const MPITopology& g_old, std::string method =
"dg")
292 g_new.global(), g_old.local(), method);
299template<
class RecursiveHostVector,
class real_type,
size_t Nd>
301 const RecursiveHostVector& x,
303 std::array<dg::bc, Nd> bcx,
304 std::string method =
"dg")
323template<
class host_vector,
class real_type>
325 const host_vector& x,
328 std::string method =
"dg")
346template<
class host_vector,
class real_type>
348 const host_vector& x,
349 const host_vector&
y,
352 std::string method =
"dg")
371template<
class host_vector,
class real_type>
373 const host_vector& x,
374 const host_vector&
y,
375 const host_vector&
z,
378 std::string method =
"dg")
bc
Switch between boundary conditions.
Definition enums.h:15
@ PER
periodic boundaries
Definition enums.h:16
@ NEU
Neumann on both boundaries.
Definition enums.h:20
constexpr bool is_vector_v
Utility typedef.
Definition predicate.h:75
dg::MIHMatrix_t< typename MPITopology::value_type > projection(const MPITopology &g_new, const MPITopology &g_old, std::string method="dg")
Create a projection between two grids.
Definition mpi_projection.h:288
dg::SparseMatrix< int, real_type, thrust::host_vector > interpolation(const RecursiveHostVector &x, const aRealTopology< real_type, Nd > &g, std::array< dg::bc, Nd > bcx, std::string method="dg")
Create interpolation matrix of a list of points in given grid.
Definition interpolation.h:445
void mpi_gather(const thrust::host_vector< std::array< int, 2 > > &gather_map, const ContainerType &gatherFrom, ContainerType &result, MPI_Comm comm)
Un-optimized distributed gather operation.
Definition mpi_permutation.h:148
std::map< int, MessageType > mpi_permute(const std::map< int, MessageType > &messages, MPI_Comm comm)
Exchange messages between processes in a communicator.
Definition mpi_permutation.h:90
void convertLocal2GlobalCols(dg::IHMatrix_t< real_type > &local, const ConversionPolicy &policy)
Convert a matrix with local column indices to a matrix with global column indices.
Definition mpi_projection.h:245
dg::IHMatrix_t< real_type > convertGlobal2LocalRows(const dg::IHMatrix_t< real_type > &global, const ConversionPolicy &row_policy)
Convert a (column-distributed) matrix with global row and column indices to a row distributed matrix.
Definition mpi_projection.h:174
dg::MIHMatrix_t< real_type > make_mpi_matrix(const dg::IHMatrix_t< real_type > &global_cols, const ConversionPolicy &col_policy)
Convert a (row-distributed) matrix with local row and global column indices to a row distributed MPI ...
Definition mpi_projection.h:50
I csr2coo(const I &csr)
Definition sparsematrix.h:45
This is the namespace for all functions and classes defined and used by the discontinuous Galerkin li...
Creation of projection matrices.
Distributed memory matrix class, asynchronous communication.
Definition mpi_matrix.h:395
Optimized MPI Gather operation.
Definition mpi_gather.h:673
A distributed vector contains a data container and a MPI communicator.
Definition vector_categories.h:52
The simplest implementation of aRealMPITopology3d.
Definition mpi_grid.h:804
A CSR formatted sparse matrix.
Definition sparsematrix.h:102
size_t & num_cols()
Set number of columns in matrix (empties performance cache)
Definition sparsematrix.h:282
const Vector< Index > & row_offsets() const
Read row_offsets vector.
Definition sparsematrix.h:298
void setFromCoo(size_t num_rows, size_t num_cols, const Vector< Index > &row_indices, const Vector< Index > &column_indices, const Vector< Value > &values, bool sort=false)
Set csr values from coo formatted sparse matrix.
Definition sparsematrix.h:177
size_t & num_rows()
Set number of rows in matrix (empties performance cache)
Definition sparsematrix.h:280
size_t num_nnz() const
Number of nonzero elements in matrix.
Definition sparsematrix.h:291
const Vector< Index > & column_indices() const
Read column indices vector.
Definition sparsematrix.h:302
const Vector< Value > & values() const
Read values vector.
Definition sparsematrix.h:306
An abstract base class for MPI distributed Nd-dimensional dG grids.
Definition mpi_grid.h:95
const RealGrid< real_type, Nd > & global() const
The global grid as a shared memory grid.
Definition mpi_grid.h:288
Useful typedefs of commonly used types.