42 #ifndef USE_SUPERLU_MT
44 #include <sys/types.h>
61 struct SuperLUSolverData {
69 std::vector<int> perm_c,
80 SuperLUSolver::SuperLUSolver(
integer iMatOrd,
91 bRegenerateMatrix(
true)
95 "SuperLU scalar solver unknown permutation strategy");
97 SAFENEW(sld, SuperLUSolverData);
108 SuperLUSolver::~SuperLUSolver(
void)
115 SuperLUSolver::IsValid(
void)
const
126 SuperLUSolver::Factor(
void)
136 int info = 0, lwork = 0;
137 int panel_size = sp_ienv(1),
140 if (bRegenerateMatrix) {
143 set_default_options(&sld->options);
144 sld->options.DiagPivotThresh = dPivotFactor;
146 switch (permutation) {
148 sld->options.ColPerm = MMD_ATA;
152 sld->options.ColPerm = COLAMD;
155 sld->options.Fact = DOFACT;
156 sld->options.PrintStat = NO;
163 dCreate_Dense_Matrix(&sld->B, iN, 1,
165 iN, SLU_DN, SLU_D, SLU_GE);
168 dCreate_CompCol_Matrix(&sld->A, iN, iN, iNonZeroes,
169 Axp, Aip, App, SLU_NC, SLU_D, SLU_GE);
171 StatInit(&sld->Gstat);
173 sld->perm_c.resize(iN);
174 sld->perm_r.resize(iN);
175 sld->etree.resize(iN);
180 sld->options.Fact = DOFACT;
181 NCformat *Astore = (NCformat *) sld->A.Store;
185 Astore->nnz = iNonZeroes;
187 Astore->rowind = Aip;
188 Astore->colptr = App;
190 Destroy_CompCol_Permuted(&sld->AC);
191 Destroy_SuperNode_Matrix(&sld->L);
192 Destroy_CompCol_Matrix(&sld->U);
195 int *pc = &(sld->perm_c[0]);
196 get_perm_c(sld->options.ColPerm, &sld->A, pc);
198 bRegenerateMatrix =
false;
200 sld->options.Fact = SamePattern;
201 Destroy_CompCol_Permuted(&sld->AC);
202 Destroy_SuperNode_Matrix(&sld->L);
203 Destroy_CompCol_Matrix(&sld->U);
207 int *pr = &(sld->perm_r[0]),
208 *pc = &(sld->perm_c[0]),
209 *et = &(sld->etree[0]);
212 sp_preorder(&sld->options, &sld->A, pc, et, &sld->AC);
213 dgstrf(&sld->options, &sld->AC, drop_tol, relax, panel_size, et, work, lwork, pc, pr,
214 &sld->L, &sld->U, &sld->Gstat, &info);
220 SuperLUSolver::Solve(
void)
const
227 const_cast<SuperLUSolver *
>(
this)->
Factor();
228 bHasBeenReset =
false;
234 trans_t trans = NOTRANS;
237 int *pr = &(sld->perm_r[0]),
238 *pc = &(sld->perm_c[0]);
240 dgstrs(trans, &sld->L, &sld->U, pc, pr,
241 &sld->B, &sld->Gstat, &info);
247 std::vector<doublereal>& Ax,
248 std::vector<integer>& Ar, std::vector<integer>& Ac,
249 std::vector<integer>& Ap)
const
252 if (!bHasBeenReset) {
264 bRegenerateMatrix =
true;
267 Destroy_CompCol_Matrix(&sld->A);
277 SuperLUSparseSolutionManager::SuperLUSparseSolutionManager(
integer iSize,
278 const doublereal& dPivotFactor,
unsigned ptype)
286 ASSERT((dPivotFactor >= 0.0) && (dPivotFactor <= 1.0));
290 SuperLUSolver(iMatSize, dPivotFactor, ptype));
292 pLS->pdSetResVec(&(xb[0]));
293 pLS->pdSetSolVec(&(xb[0]));
294 pLS->SetSolutionManager(
this);
303 SuperLUSparseSolutionManager::~SuperLUSparseSolutionManager(
void)
315 SuperLUSparseSolutionManager::IsValid(
void)
const
319 #ifdef DEBUG_MEMMANAGER
324 ASSERT((VH.IsValid(), 1));
325 ASSERT((pLS->IsValid(), 1));
331 SuperLUSparseSolutionManager::MatrReset(
void)
341 SuperLUSparseSolutionManager::MakeCompressedColumnForm(
void)
348 pLS->MakeCompactForm(MH, Ax, Ai, Adummy, Ap);
353 SuperLUSparseSolutionManager::Solve(
void)
360 MakeCompressedColumnForm();
363 std::cerr <<
"### after MakeIndexForm:" << std::endl
364 <<
"{col Ap[col]}={" << std::endl;
365 for (
unsigned i = 0; i < Ap.size(); i++) {
366 std::cerr << i <<
" " << Ap[i] << std::endl;
368 std::cerr <<
"}" << std::endl;
370 std::cerr <<
"{idx Ai[idx] col Ax[idx]}={" << std::endl;
372 for (
unsigned i = 0; i < Ax.size(); i++) {
373 std::cerr << i <<
" " << Ai[i] <<
" " << c <<
" " << Ax[i] << std::endl;
378 std::cerr <<
"}" << std::endl;
384 std::cerr <<
"### after Solve:" << std::endl
385 <<
"{col Ap[col]}={" << std::endl;
386 for (
unsigned i = 0; i < Ap.size(); i++) {
387 std::cerr << i <<
" " << Ap[i] << std::endl;
389 std::cerr <<
"}" << std::endl;
391 std::cerr <<
"{idx Ai[idx] col Ax[idx]}={" << std::endl;
393 for (
unsigned i = 0; i < Ax.size(); i++) {
394 std::cerr << i <<
" " << Ai[i] <<
" " << c <<
" " << Ax[i] << std::endl;
399 std::cerr <<
"}" << std::endl;
408 SuperLUSparseCCSolutionManager<CC>::SuperLUSparseCCSolutionManager(
integer Dim,
410 : SuperLUSparseSolutionManager(Dim, dPivot, ptype),
418 SuperLUSparseCCSolutionManager<CC>::~SuperLUSparseCCSolutionManager(
void)
427 SuperLUSparseCCSolutionManager<CC>::MatrReset(
void)
435 SuperLUSparseCCSolutionManager<CC>::MakeCompressedColumnForm(
void)
438 pLS->MakeCompactForm(MH, Ax, Ai, Adummy, Ap);
451 SuperLUSparseCCSolutionManager<CC>::MatrInitialize()
461 SuperLUSparseCCSolutionManager<CC>::pMatHdl(
void)
const
471 template class SuperLUSparseCCSolutionManager<CColMatrixHandler<0> >;
472 template class SuperLUSparseCCSolutionManager<DirCColMatrixHandler<0> >;
#define ASSERTMSGBREAK(expr, msg)
virtual integer MakeCompressedColumnForm(doublereal *const Ax, integer *const Ai, integer *const Ap, int offset=0) const =0
#define SAFENEW(pnt, item)
#define ASSERT(expression)
#define SAFENEWWITHCONSTRUCTOR(pnt, item, constructor)
#define defaultMemoryManager
static std::stack< cleanup * > c