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