25#include <boost/scope_exit.hpp>
27#include "arccore/alina/MessagePassingUtils.h"
28#include "arccore/alina/AlinaLib.h"
29#include "AlinaSamplesCommon.h"
30#include "arccore/trace/ITraceMng.h"
32#include "DomainPartition.h"
34double constant_deflation(
int, ptrdiff_t,
void*)
47 int rank = world.rank;
48 int size = world.size;
53 tm->
info() <<
"World size: " << size;
55 const ptrdiff_t n = argc > 1 ? atoi(argv[1]) : 1024;
56 const ptrdiff_t n2 = n * n;
59 boost::array<ptrdiff_t, 2> lo = { { 0, 0 } };
60 boost::array<ptrdiff_t, 2> hi = { { n - 1, n - 1 } };
62 DomainPartition<2> part(lo, hi, size);
63 ptrdiff_t chunk = part.size(rank);
65 std::vector<ptrdiff_t> domain(size + 1);
68 mpAllGather(world.m_message_passing_mng.get(), send_buf, receive_buf);
69 std::partial_sum(domain.begin(), domain.end(), domain.begin());
71 ptrdiff_t chunk_start = domain[rank];
72 ptrdiff_t chunk_end = domain[rank + 1];
74 std::vector<ptrdiff_t> renum(n2);
75 for (ptrdiff_t j = 0, idx = 0; j < n; ++j) {
76 for (ptrdiff_t i = 0; i < n; ++i, ++idx) {
77 boost::array<ptrdiff_t, 2> p = { { i, j } };
78 std::pair<int, ptrdiff_t> v = part.index(p);
79 renum[idx] = domain[v.first] + v.second;
86 using ColumnType = Int32;
90 std::vector<ColumnType> ptr;
91 std::vector<ColumnType> col;
92 std::vector<double> val;
93 std::vector<double> rhs;
95 ptr.reserve(chunk + 1);
96 col.reserve(chunk * 5);
97 val.reserve(chunk * 5);
102 const double hinv = (n - 1);
103 const double h2i = (n - 1) * (n - 1);
104 for (ptrdiff_t j = 0, idx = 0; j < n; ++j) {
105 for (ptrdiff_t i = 0; i < n; ++i, ++idx) {
106 if (renum[idx] < chunk_start || renum[idx] >= chunk_end)
110 col.push_back(renum[idx - n]);
115 col.push_back(renum[idx - 1]);
116 val.push_back(-h2i - hinv);
119 col.push_back(renum[idx]);
120 val.push_back(4 * h2i + hinv);
123 col.push_back(renum[idx + 1]);
128 col.push_back(renum[idx + n]);
133 ptr.push_back(col.size());
140 AlinaLib::params_set_string(prm,
"local.coarsening.type",
"smoothed_aggregation");
141 AlinaLib::params_set_string(prm,
"local.relax.type",
"spai0");
142 AlinaLib::params_set_string(prm,
"isolver.type",
"bicgstabl");
143 AlinaLib::params_set_string(prm,
"dsolver.type",
"skyline_lu");
146 chunk, ptr.data(), col.data(), val.data(),
147 1, constant_deflation, NULL, prm);
150 std::vector<double> x(chunk, 0);
153 std::cout <<
"Iterations: " << cnv.iterations << std::endl
154 <<
"Error: " << cnv.residual << std::endl;
157 AlinaLib::solver_mpi_destroy(solver);
158 AlinaLib::params_destroy(prm);
162 std::vector<double> X(n2);
163 std::copy(x.begin(), x.end(), X.begin());
165 for (
int i = 1; i < size; ++i)
166 MPI_Recv(&X[domain[i]], domain[i + 1] - domain[i], MPI_DOUBLE, i, 42, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
168 std::ofstream f(
"out.dat", std::ios::binary);
170 f.write((
char*)&m,
sizeof(
int));
171 for (ptrdiff_t i = 0; i < n2; ++i)
172 f.write((
char*)&X[renum[i]],
sizeof(
double));
175 MPI_Send(x.data(), chunk, MPI_DOUBLE, 0, 42, MPI_COMM_WORLD);
181int main(
int argc,
char* argv[])
183 return Arcane::Alina::SampleMainContext::execMain(main2, argc, argv);
Modifiable view of an array of type T.
Constant view of an array of type T.
virtual TraceMessage info()=0
Stream for an information message.
void mpAllGather(IMessagePassingMng *pm, const ISerializer *send_serializer, ISerializer *receive_serialize)
allGather() message for serialization
-- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature --
Convenience wrapper around MPI_Comm.