8#if defined(FEAT_HAVE_SUPERLU_DIST) && defined(FEAT_HAVE_MPI) 
   12#include <superlu_ddefs.h> 
   32        superlu_dist_options_t slu_opts;
 
   34        SuperLUStat_t slu_stats;
 
   36        SuperMatrix slu_matrix;
 
   38        NRformat_loc slu_matrix_store;
 
   40        dScalePermstruct_t slu_scale_perm;
 
   42        dLUstruct_t slu_lu_struct;
 
   44        dSOLVEstruct_t slu_solve_struct;
 
   50        std::vector<int_t> slu_row_ptr, slu_col_idx, slu_col_idx2;
 
   52        std::vector<double> a_val;
 
   54        std::vector<double> v_berr;
 
   61        template<
typename IT_>
 
   62        explicit Core(
const void* comm, Index num_global_dofs, Index my_dof_offset, Index num_owned_dofs,
 
   63          const IT_* row_ptr, 
const IT_* col_idx) :
 
   64          _comm(*reinterpret_cast<const MPI_Comm*>(comm)),
 
   69          memset(&slu_grid, 0, 
sizeof(gridinfo_t));
 
   70          memset(&slu_opts, 0, 
sizeof(superlu_dist_options_t));
 
   71          memset(&slu_stats, 0, 
sizeof(SuperLUStat_t));
 
   72          memset(&slu_matrix, 0, 
sizeof(SuperMatrix));
 
   73          memset(&slu_matrix_store, 0, 
sizeof(NRformat_loc));
 
   74          memset(&slu_scale_perm, 0, 
sizeof(dScalePermstruct_t));
 
   75          memset(&slu_lu_struct, 0, 
sizeof(dLUstruct_t));
 
   76          memset(&slu_solve_struct, 0, 
sizeof(dSOLVEstruct_t));
 
   80          MPI_Comm_size(_comm, &ranks);
 
   81          superlu_gridinit(_comm, ranks, 1, &slu_grid);
 
   84          v_berr.resize(num_owned_dofs);
 
   87          const Index num_nze(row_ptr[num_owned_dofs]);
 
   88          slu_row_ptr.resize(num_owned_dofs+1u);
 
   89          for(Index i(0); i <= num_owned_dofs; ++i)
 
   90            slu_row_ptr[i] = int_t(row_ptr[i]);
 
   91          slu_col_idx.resize(num_nze);
 
   92          for(Index i(0); i < num_nze; ++i)
 
   93            slu_col_idx[i] = int_t(col_idx[i]);
 
   94          slu_col_idx2 = slu_col_idx;
 
   97          a_val.resize(num_nze);
 
  100          slu_matrix.Stype = SLU_NR_loc; 
 
  101          slu_matrix.Dtype = SLU_D;      
 
  102          slu_matrix.Mtype = SLU_GE;     
 
  103          slu_matrix.nrow = int_t(num_global_dofs);
 
  104          slu_matrix.ncol = int_t(num_global_dofs); 
 
  105          slu_matrix.Store = &slu_matrix_store;
 
  108          slu_matrix_store.nnz_loc = int_t(num_nze);
 
  109          slu_matrix_store.m_loc   = int_t(num_owned_dofs);
 
  110          slu_matrix_store.fst_row = int_t(my_dof_offset);
 
  111          slu_matrix_store.nzval   = a_val.data();
 
  112          slu_matrix_store.rowptr  = slu_row_ptr.data();
 
  113          slu_matrix_store.colind  = slu_col_idx.data();
 
  116          set_default_options_dist(&slu_opts);
 
  119          slu_opts.PrintStat = NO;
 
  122          slu_opts.ReplaceTinyPivot = YES;
 
  125          dScalePermstructInit(int_t(num_global_dofs), int_t(num_global_dofs), &slu_scale_perm);
 
  128          dLUstructInit(int_t(num_global_dofs), &slu_lu_struct);
 
  131          PStatInit(&slu_stats);
 
  136          PStatFree(&slu_stats);
 
  137          dDestroy_LU(slu_matrix.nrow, &slu_grid, &slu_lu_struct);
 
  138          dLUstructFree(&slu_lu_struct);
 
  139          dScalePermstructFree(&slu_scale_perm);
 
  140          dSolveFinalize(&slu_opts, &slu_solve_struct);
 
  141          superlu_gridexit(&slu_grid);
 
  144        int init_numeric(
const double* vals)
 
  147          for(std::size_t i(0); i < a_val.size(); ++i)
 
  152          slu_col_idx = slu_col_idx2;
 
  155          slu_opts.Fact = (was_factorized ? SamePattern : DOFACT);
 
  163            int(slu_matrix_store.m_loc),
 
  177            was_factorized = 
true;
 
  187          slu_opts.Fact = FACTORED;
 
  195            int(slu_matrix_store.m_loc),
 
  209      void* create_core(
const void* comm, Index num_global_dofs, Index dof_offset,
 
  210        Index num_owned_dofs, 
const unsigned int* row_ptr, 
const unsigned int* col_idx)
 
  212        return new Core(comm, num_global_dofs, dof_offset, num_owned_dofs, row_ptr, col_idx);
 
  215      void* create_core(
const void* comm, Index num_global_dofs, Index dof_offset,
 
  216        Index num_owned_dofs, 
const unsigned long* row_ptr, 
const unsigned long* col_idx)
 
  218        return new Core(comm, num_global_dofs, dof_offset, num_owned_dofs, row_ptr, col_idx);
 
  221      void* create_core(
const void* comm, Index num_global_dofs, Index dof_offset,
 
  222        Index num_owned_dofs, 
const unsigned long long* row_ptr, 
const unsigned long long* col_idx)
 
  224        return new Core(comm, num_global_dofs, dof_offset, num_owned_dofs, row_ptr, col_idx);
 
  227      void destroy_core(
void* core)
 
  229        delete reinterpret_cast<Core*
>(core);
 
  232      int init_numeric(
void* core, 
const double* vals)
 
  234        return reinterpret_cast<Core*
>(core)->init_numeric(vals);
 
  237      int solve(
void* core, 
double* x)
 
  239        return reinterpret_cast<Core*
>(core)->
solve(x);
 
  247void dummy_superlu_function() {}
 
Status solve(SolverBase< Vector_ > &solver, Vector_ &vec_sol, const Vector_ &vec_rhs, const Matrix_ &matrix, const Filter_ &filter)
Solve linear system with initial solution guess.
std::uint64_t Index
Index data type.