int DSDPSetDefaultSchurMatrixStructure(DSDP dsdp){ int info; DSDPFunctionBegin; info=DSDPSchurMatOpsInitialize(&dsdpmatops000); DSDPCHKERR(info); dsdpmatops000.matsetup=DSDPCreateSchurMatrix; info=DSDPSetSchurMatOps(dsdp,&dsdpmatops000,(void*)dsdp);DSDPCHKERR(info); DSDPFunctionReturn(0); }
int PDSDPUsePLAPACKLinearSolver(DSDP dsdp, MPI_Comm comm, double ratio, int nb_distr){ int info; plapackM* ctx; DSDPFunctionBegin; DSDPCALLOC1(&ctx,plapackM,&info);DSDPCHKERR(info); info=DSDPPlapackOpsInit(&plapackdsdpops);DSDPCHKERR(info); info=DSDPSetSchurMatOps(dsdp,&plapackdsdpops,(void*)ctx);DSDPCHKERR(info); ctx->dsdp=dsdp; ctx->ratio=ratio; ctx->nb_distr=nb_distr; ctx->mpi_comm=comm; ctx->AMat=NULL; ctx->vVec=NULL; ctx->wVec=NULL; ctx->zero=NULL; ctx->one=NULL; ctx->dxerror=NULL; ctx->templ=NULL; DSDPFunctionReturn(0); }
static int DSDPCreateSchurMatrix(void *ctx, int m){ int info; int *rnnz,*tnnz,totalnnz; int gotit=0; DSDP dsdp=(DSDP)ctx; chfac *sf; MCholSolverALL *AMA; void *tdata; struct DSDPSchurMat_Ops *tmatops; DSDPFunctionBegin; if (m<=1){ info=DSDPGetDiagSchurMat(m,&tmatops,&tdata); DSDPCHKERR(info); info=DSDPSetSchurMatOps(dsdp,tmatops,tdata); DSDPCHKERR(info); return 0; } DSDPCALLOC2(&rnnz,int,(m+1),&info); DSDPCHKERR(info); DSDPCALLOC2(&tnnz,int,(m+1),&info); DSDPCHKERR(info); info=DSDPCheckForSparsity(dsdp,m,rnnz,tnnz,&totalnnz); DSDPCHKERR(info); if (totalnnz*2+m > m*m*0.1 && dsdpuselapack) { gotit=1; info=DSDPGetLAPACKSUSchurOps(m,&tmatops,&tdata); /* DSDPCHKERR(info); */ if (info) {gotit=0;printf("Try packed format\n"); } DSDPLogInfo(0,8,"Creating Dense Full LAPACK Schur Matrix\n"); info=DSDPSetSchurMatOps(dsdp,tmatops,tdata); DSDPCHKERR(info); } if ( 0 && totalnnz*2+m > m*m*0.1 && dsdpuselapack) { info=DSDPGetLAPACKPUSchurOps(m,&tmatops,&tdata); DSDPCHKERR(info); DSDPLogInfo(0,8,"Creating Dense Packed LAPACK Schur Matrix\n"); info=DSDPSetSchurMatOps(dsdp,tmatops,tdata); DSDPCHKERR(info); gotit=1; } if (gotit==0){ DSDPCALLOC1(&AMA,MCholSolverALL,&info);DSDPCHKERR(info); AMA->dsdp=dsdp; AMA->m=m; info=DSDPVecCreateSeq(m,&AMA->D1); DSDPCHKERR(info); if (totalnnz*2+m > m*m * 0.11 ){ info=MchlSetup2(m,&sf); DSDPCHKERR(info); AMA->M=sf; AMA->is_dense=1; AMA->rnnz=0; AMA->colnnz=0; DSDPLogInfo(0,8,"Creating Dense Full non LAPACK Schur Matrix\n"); } else { info=DSDPCreateM(AMA,&sf,rnnz,tnnz,totalnnz); DSDPCHKERR(info); DSDPLogInfo(0,8,"Creating Sparse Schur Matrix\n"); } AMA->M=sf; info=TMatOpsInit(&dsdpmatops); DSDPCHKERR(info); info=DSDPSetSchurMatOps(dsdp,&dsdpmatops,(void*)AMA); DSDPCHKERR(info); } DSDPFREE(&tnnz,&info);DSDPCHKERR(info); DSDPFREE(&rnnz,&info);DSDPCHKERR(info); DSDPFunctionReturn(0); }