booleantype is_square(SUNMatrix A) { if (SUNSparseMatrix_Rows(A) == SUNSparseMatrix_Columns(A)) return SUNTRUE; else return SUNFALSE; }
CAMLprim value sunml_lsolver_klu(value vnvec, value vsmat) { CAMLparam2(vnvec, vsmat); #if SUNDIALS_LIB_VERSION >= 300 && defined SUNDIALS_ML_KLU SUNMatrix smat = MAT_VAL(vsmat); SUNLinearSolver ls = SUNKLU(NVEC_VAL(vnvec), smat); if (ls == NULL) { if (SUNSparseMatrix_Rows(smat) != SUNSparseMatrix_Columns(smat)) caml_raise_constant(LSOLVER_EXN(MatrixNotSquare)); if (SUNBandMatrix_Rows(smat) != NV_LENGTH_S(NVEC_VAL(vnvec))) caml_raise_constant(LSOLVER_EXN(MatrixVectorMismatch)); caml_raise_out_of_memory(); } CAMLreturn(alloc_lsolver(ls)); #else CAMLreturn(Val_unit); #endif }
/* ---------------------------------------------------------------------- * Check matrix * --------------------------------------------------------------------*/ int check_matrix(SUNMatrix A, SUNMatrix B, realtype tol) { int failure = 0; realtype *Adata, *Bdata; sunindextype *Aindexptrs, *Bindexptrs; sunindextype *Aindexvals, *Bindexvals; sunindextype i, ANP, BNP, Annz, Bnnz; /* get matrix pointers */ Adata = SUNSparseMatrix_Data(A); Aindexptrs = SUNSparseMatrix_IndexPointers(A); Aindexvals = SUNSparseMatrix_IndexValues(A); ANP = SUNSparseMatrix_NP(A); Annz = Aindexptrs[ANP]; Bdata = SUNSparseMatrix_Data(B); Bindexptrs = SUNSparseMatrix_IndexPointers(B); Bindexvals = SUNSparseMatrix_IndexValues(B); BNP = SUNSparseMatrix_NP(B); Bnnz = Bindexptrs[BNP]; /* matrices must have same sparsetype, shape and actual data lengths */ if (SUNMatGetID(A) != SUNMatGetID(B)) { printf(">>> ERROR: check_matrix: Different storage types (%d vs %d)\n", SUNMatGetID(A), SUNMatGetID(B)); return(1); } if (SUNSparseMatrix_SparseType(A) != SUNSparseMatrix_SparseType(B)) { printf(">>> ERROR: check_matrix: Different storage types (%d vs %d)\n", SUNSparseMatrix_SparseType(A), SUNSparseMatrix_SparseType(B)); return(1); } if (SUNSparseMatrix_Rows(A) != SUNSparseMatrix_Rows(B)) { printf(">>> ERROR: check_matrix: Different numbers of rows (%ld vs %ld)\n", (long int) SUNSparseMatrix_Rows(A), (long int) SUNSparseMatrix_Rows(B)); return(1); } if (SUNSparseMatrix_Columns(A) != SUNSparseMatrix_Columns(B)) { printf(">>> ERROR: check_matrix: Different numbers of columns (%ld vs %ld)\n", (long int) SUNSparseMatrix_Columns(A), (long int) SUNSparseMatrix_Columns(B)); return(1); } if (Annz != Bnnz) { printf(">>> ERROR: check_matrix: Different numbers of nonzeos (%ld vs %ld)\n", (long int) Annz, (long int) Bnnz); return(1); } /* compare sparsity patterns */ for (i=0; i<ANP; i++) failure += (Aindexptrs[i] != Bindexptrs[i]); if (failure > ZERO) { printf(">>> ERROR: check_matrix: Different indexptrs \n"); return(1); } for (i=0; i<Annz; i++) failure += (Aindexvals[i] != Bindexvals[i]); if (failure > ZERO) { printf(">>> ERROR: check_matrix: Different indexvals \n"); return(1); } /* compare matrix values */ for(i=0; i<Annz; i++) failure += FNEQ(Adata[i], Bdata[i], tol); if (failure > ZERO) { printf(">>> ERROR: check_matrix: Different entries \n"); return(1); } return(0); }