int main(int argc, char* argv[]){ /*dsp *RLMc1=dspread("RLMc_old.bin"); */ if(argc!=2){ error("Need 1 argument\n"); } dspcell *RLM=dspcellread("%s",argv[1]); dsp *RLMc=dspcell2sp(RLM); tic;info2("chol ..."); spchol *R1=chol_factorize(RLMc); toc("done"); rand_t rstat; seed_rand(&rstat,1); dmat *y=dnew(RLMc->m, 1); drandn(y, 1, &rstat); dmat *x=NULL, *x2=NULL, *x3=NULL; chol_convert(R1, 1); tic; chol_solve(&x, R1, y); toc("cholmod");tic; chol_solve(&x, R1, y); toc("cholmod");tic; chol_solve_upper(&x3, R1, y); toc("upper");tic; chol_solve_upper(&x3, R1, y); toc("upper");tic; chol_solve_lower(&x2, R1,y); toc("lower");tic; chol_solve_lower(&x2, R1,y); toc("lower");tic; chol_solve(&x, R1, y); toc("cholmod");tic; chol_solve(&x, R1, y); toc("cholmod");tic; writebin(y,"y"); writebin(x,"x"); writebin(x2,"x2"); writebin(x3,"x3"); chol_free(R1); dspfree(RLMc); dspcellfree(RLM); }
//--------------------------------------------------------- DMat& NDG2D::CurvedDGJump2D ( const DMat& gU, // [in] const IVec& gmapD, // [in] const DVec& bcU // [in] ) //--------------------------------------------------------- { // function [jumpU] = CurvedDGJump2D(gU, gmapD, bcU) // purpose: compute discontinuous Galerkin jump applied // to a field given at cubature and Gauss nodes DMat mmCHOL; DVec gUM,gUP,fx; DMat *tmp = new DMat("jumpU", OBJ_temp); DMat &jumpU(*tmp); // shorthand references Cub2D& cub = this->m_cub; Gauss2D& gauss = this->m_gauss; // surface traces at Gauss nodes gUM = gU(gauss.mapM); gUP = gU(gauss.mapP); if (gmapD.size()>0) { gUP(gmapD) = bcU(gmapD); } // compute jump term and lift to triangle interiors fx = gUM - gUP; jumpU = -gauss.interpT*(gauss.W.dm(fx)); // multiply straight sided triangles by inverse mass matrix jumpU(All,straight) = VVT * dd(jumpU(All,straight), J(All,straight)); // multiply by custom inverse mass matrix for each curvilinear triangle int Ncurved = curved.size(), k=0; for (int m=1; m<=Ncurved; ++m) { k = curved(m); mmCHOL.borrow(Np,Np, cub.mmCHOL.pCol(k)); mmCHOL.set_factmode(FACT_CHOL); // indicate factored state jumpU(All,k) = chol_solve(mmCHOL, jumpU(All,k)); } // these parameters may be OBJ_temp (allocated on the fly) if (OBJ_temp == gU.get_mode()) { delete (&gU); } if (OBJ_temp == bcU.get_mode()) { delete (&bcU); } return jumpU; }
// overload to allow Region1D as rhs arg //--------------------------------------------------------- DVec& chol_solve(const DMat& ch, Region1D<DVec> R) //--------------------------------------------------------- { DVec rhs(R); return chol_solve(ch,rhs); }
/** solves A * X' = B' for X in place */ void chol_solve_t(Eigen::MatrixXd & A, Eigen::MatrixXd & B) { if (A.rows() != B.cols()) {throw std::runtime_error("A.rows() must equal B.cols()");} B.transposeInPlace(); chol_solve(A, B); B.transposeInPlace(); }