21#ifndef B2LINALG_SOLVER_SLAVE_H_
22#define B2LINALG_SOLVER_SLAVE_H_
31#include "b2ppconfig.h"
32#include "utils/b2comm.H"
36#ifdef HAVE_UPMUMPS_DMUMPS_C_H
37#include "MUMPS/dmumps_c.h"
39#ifdef HAVE_MUMPS_DMUMPS_C_H
40#include "mumps/dmumps_c.h"
48#ifdef HAVE_UPMUMPS_ZMUMPS_C_H
49#include "MUMPS/zmumps_c.h"
51#ifdef HAVE_MUMPS_ZMUMPS_C_H
52#include "mumps/zmumps_c.h"
75namespace b2000 {
namespace b2linalg {
79 inline static std::weak_ptr<Communicator> b2comm;
89 std::shared_ptr<Communicator> solvecomm = b2comm.lock();
90 check_comm_ptr(solvecomm,
"SolverSlave::Start()");
91 solvecomm->Bcast(&buffer, 1, 0);
95 uint64_t buffer[bsize];
97 std::shared_ptr<Communicator> solvecomm = b2comm.lock();
98 check_comm_ptr(solvecomm,
"SolverSlave::End()");
99 solvecomm->Bcast(buffer, bsize);
102 static int GetFcomm() {
103 std::shared_ptr<Communicator> solvecomm = b2comm.lock();
104 check_comm_ptr(solvecomm,
"SolverSlave::GetFcomm()");
105 return solvecomm->GetFcomm();
108 static void MumpsSend(
unsigned int action,
unsigned int type,
void*
id,
unsigned int sym_job) {
109 uint64_t buffer[bsize] = {1, action, type,
reinterpret_cast<uint64_t
>(id), sym_job};
110 std::shared_ptr<Communicator> solvecomm = b2comm.lock();
111 check_comm_ptr(solvecomm,
"SolverSlave::MumpsSend()");
112 solvecomm->Bcast(buffer, bsize);
115 static void PastixSend(
unsigned int type,
void*
id,
unsigned int action, uint64_t n) {
116 uint64_t buffer[bsize] = {2, type,
reinterpret_cast<uint64_t
>(id), action, n};
117 std::shared_ptr<Communicator> solvecomm = b2comm.lock();
118 check_comm_ptr(solvecomm,
"SolverSlave::PastixSend()");
119 solvecomm->Bcast(buffer, bsize);
123 std::shared_ptr<Communicator> solvecomm = b2comm.lock();
124 check_comm_ptr(solvecomm,
"SolverSlave::Run()");
127 solvecomm->Bcast(&buffer, 1, 0);
128 logger_is_enabled_for_debug = buffer == 1 ? true :
false;
131 uint64_t buffer[bsize];
132 solvecomm->Bcast(buffer, bsize);
155 enum StrucType { d = 0, z = 1 };
156 static constexpr int bsize = 5;
157 bool logger_is_enabled_for_debug;
158 std::map<unsigned long int, DMUMPS_STRUC_C> dmumps_object_map;
159 std::map<unsigned long int, ZMUMPS_STRUC_C> zmumps_object_map;
162 static void check_comm_ptr(std::shared_ptr<Communicator> comm, std::string label) {
164 Exception() <<
"Comm Error: tried to access invalid communicator in"
165 <<
" " << label <<
THROW;
169 void Mumps(uint64_t* buffer) {
174 DMUMPS_STRUC_C& mumps_struct = dmumps_object_map[buffer[2]];
175 mumps_struct.sym = buffer[3];
176 mumps_struct.par = 1;
177 mumps_struct.job = -1;
178 mumps_struct.comm_fortran =
static_cast<MUMPS_INT
>(GetFcomm());
179 dmumps_c(&mumps_struct);
180 mumps_struct.irn =
nullptr;
181 mumps_struct.jcn =
nullptr;
183 if (logger_is_enabled_for_debug) {
184 mumps_struct.icntl[0] = 6;
185 mumps_struct.icntl[1] = 6;
186 mumps_struct.icntl[2] = 6;
187 mumps_struct.icntl[3] = 3;
188 mumps_struct.icntl[10] = 1;
190 mumps_struct.icntl[0] = 0;
191 mumps_struct.icntl[1] = 0;
192 mumps_struct.icntl[2] = 0;
193 mumps_struct.icntl[3] = 0;
198 ZMUMPS_STRUC_C& mumps_struct = zmumps_object_map[buffer[2]];
199 mumps_struct.sym = buffer[3];
200 mumps_struct.par = 1;
201 mumps_struct.job = -1;
202 mumps_struct.comm_fortran =
static_cast<MUMPS_INT
>(GetFcomm());
203 zmumps_c(&mumps_struct);
204 mumps_struct.irn =
nullptr;
205 mumps_struct.jcn =
nullptr;
207 if (logger_is_enabled_for_debug) {
208 mumps_struct.icntl[0] = 6;
209 mumps_struct.icntl[1] = 6;
210 mumps_struct.icntl[2] = 6;
211 mumps_struct.icntl[3] = 3;
212 mumps_struct.icntl[10] = 1;
214 mumps_struct.icntl[0] = 0;
215 mumps_struct.icntl[1] = 0;
216 mumps_struct.icntl[2] = 0;
217 mumps_struct.icntl[3] = 0;
229 DMUMPS_STRUC_C& mumps_struct = dmumps_object_map[buffer[2]];
230 mumps_struct.job = buffer[3];
231 dmumps_c(&mumps_struct);
235 ZMUMPS_STRUC_C& mumps_struct = zmumps_object_map[buffer[2]];
236 mumps_struct.job = buffer[3];
237 zmumps_c(&mumps_struct);
258 std::vector<double> a;
259 std::vector<int> perm;
260 std::vector<int> invp;
266 std::map<unsigned long int, PastixData> pastix_object_map;
268 void Pastix(uint64_t* buffer) {
269 PastixData& pd = pastix_object_map[buffer[1]];
270 std::vector<double> rhs(1);
271 std::shared_ptr<Communicator> solvecomm = b2comm.lock();
272 check_comm_ptr(solvecomm,
"SolverSlave::Pastix()");
277 pd.ia.resize(buffer[3] + 1);
278 pd.perm.resize(buffer[3]);
279 pd.invp.resize(buffer[3]);
280 solvecomm->Bcast(&pd.ia[0], buffer[3] + 1, 0);
281 pd.ja.resize(pd.ia[buffer[3]]);
282 pd.a.resize(pd.ia[buffer[3]]);
283 solvecomm->Bcast(&pd.ja[0], pd.ia[buffer[3]], 0);
284 solvecomm->Bcast(&pd.a[0], pd.ia[buffer[3]], 0);
306 solvecomm->Bcast(&pd.a[0], pd.ia[buffer[3]], 0);
307 rhs.resize(buffer[3]);
308 solvecomm->Bcast(&rhs[0], buffer[3], 0);
314 rhs.resize(buffer[3]);
315 solvecomm->Bcast(&rhs[0], buffer[3], 0);
346 if (buffer[2] == 4) {
348 pastix_object_map.erase(buffer[1]);
#define THROW
Definition b2exception.H:198
Logger & get_logger(const std::string &logger_name="")
Definition b2logging.H:829
Contains the base classes for implementing Finite Elements.
Definition b2boundary_condition.H:32