Arcane  4.2.2.0
Developer documentation
Loading...
Searching...
No Matches
DistributedComplex.cc
1// -*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
2//-----------------------------------------------------------------------------
3// Copyright 2000-2026 CEA (www.cea.fr) IFPEN (www.ifpenergiesnouvelles.com)
4// See the top-level COPYRIGHT file for details.
5// SPDX-License-Identifier: Apache-2.0
6//-----------------------------------------------------------------------------
7/*---------------------------------------------------------------------------*/
8/*---------------------------------------------------------------------------*/
9/*
10 * This file is based on the work on AMGCL library (version march 2026)
11 * which can be found at https://github.com/ddemidov/amgcl.
12 *
13 * Copyright (c) 2012-2022 Denis Demidov <dennis.demidov@gmail.com>
14 * SPDX-License-Identifier: MIT
15 */
16/*---------------------------------------------------------------------------*/
17/*---------------------------------------------------------------------------*/
18
19#include <iostream>
20#include <vector>
21#include <string>
22#include <complex>
23
24#include "arccore/alina/BuiltinBackend.h"
25#include "arccore/alina/ValueTypeComplex.h"
26#include "arccore/alina/Adapters.h"
27
28#include "arccore/alina/DistributedPreconditionedSolver.h"
29#include "arccore/alina/DistributedPreconditioner.h"
30#include "arccore/alina/DistributedSolverRuntime.h"
31
32#include "arccore/alina/IO.h"
33#include "arccore/alina/Profiler.h"
34
35#include "arccore/common/internal/ProgramOptions.h"
36
37#include "SampleProblemCommon.h"
38
39using namespace Arcane;
40using namespace Arcane::Alina;
41
42//---------------------------------------------------------------------------
43void solve_scalar(Alina::mpi_communicator comm,
44 ptrdiff_t chunk,
45 const std::vector<ptrdiff_t>& ptr,
46 const std::vector<ptrdiff_t>& col,
47 const std::vector<std::complex<double>>& val,
48 const Alina::PropertyTree& prm,
49 const std::vector<std::complex<double>>& rhs)
50{
51 auto& prof = Alina::Profiler::globalProfiler();
53
56
57 prof.tic("setup");
58 Solver solve(comm, std::tie(chunk, ptr, col, val), prm);
59 prof.toc("setup");
60
61 if (comm.rank == 0) {
62 std::cout << solve << std::endl;
63 }
64
65 std::vector<std::complex<double>> x(chunk);
66
67 prof.tic("solve");
68 Alina::SolverResult r = solve(rhs, x);
69 prof.toc("solve");
70
71 if (comm.rank == 0) {
72 std::cout << "Iterations: " << r.nbIteration() << std::endl
73 << "Error: " << r.residual() << std::endl
74 << prof << std::endl;
75 }
76}
77
78//---------------------------------------------------------------------------
79int main(int argc, char* argv[])
80{
81 auto& prof = Alina::Profiler::globalProfiler();
82 Alina::mpi_init_thread mpi(&argc, &argv);
83 Alina::mpi_communicator comm(MPI_COMM_WORLD);
84
85 if (comm.rank == 0)
86 std::cout << "World size: " << comm.size << std::endl;
87
88 // Read configuration from command line
89 namespace po = Arcane::ProgramOptions;
90 po::options_description desc("Options");
91
92 desc.add_options()("help,h", "show help");
93 desc.add_options()("size,n", po::value<ptrdiff_t>()->default_value(128), "domain size");
94 desc.add_options()("prm-file,P", po::value<std::string>(), "Parameter file in json format. ");
95 desc.add_options()("prm,p", po::value<std::vector<std::string>>()->multitoken(),
96 "Parameters specified as name=value pairs. "
97 "May be provided multiple times. Examples:\n"
98 " -p solver.tol=1e-3\n"
99 " -p precond.coarse_enough=300");
100
102 p.add("prm", -1);
103
105 po::store(po::command_line_parser(argc, argv).options(desc).positional(p).run(), vm);
106 po::notify(vm);
107
108 if (vm.count("help")) {
109 if (comm.rank == 0)
110 std::cout << desc << std::endl;
111 return 0;
112 }
113
115 if (vm.count("prm-file")) {
116 prm.read_json(vm["prm-file"].as<std::string>());
117 }
118
119 if (vm.count("prm")) {
120 for (const std::string& v : vm["prm"].as<std::vector<std::string>>()) {
121 prm.putKeyValue(v);
122 }
123 }
124
125 ptrdiff_t n;
126 std::vector<ptrdiff_t> ptr;
127 std::vector<ptrdiff_t> col;
128 std::vector<std::complex<double>> val;
129 std::vector<std::complex<double>> rhs;
130
131 prof.tic("assemble");
132 n = sample_problem_distributed(comm.rank, comm.size, vm["size"].as<ptrdiff_t>(), 1, ptr, col, val, rhs);
133 prof.toc("assemble");
134
135 solve_scalar(comm, n, ptr, col, val, prm, rhs);
136}
Iterative solver wrapper for distributed linear systems.
Class to store parameters as a hierarchical key/value tree.
Definition AlinaUtils.h:112
Result of a solution.
Definition AlinaUtils.h:53
Fluent command-line parser builder.
Describes a set of command-line options.
Describes positional (non-option) arguments.
Stores parsed option values.
-- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature --
Convenience wrapper around MPI_Comm.
Convenience wrapper around MPI_Init_threads/MPI_Finalize.