[petsc-users] Problem with MatCreateSeqAIJWithArrays
Chung-Kan Huang
ckhuangf at gmail.com
Thu Sep 19 00:05:13 CDT 2013
Hi,
I am writing a testing code that read CRS matrix M and rhs vector B from
two files and solve M*B=X.
I got error message indicating that I have segmentation fault but problem
disappeared after I removed MatDestroy(& M);
Another problem is that I am not sure if I should have
MatAssemblyBegin(M, MAT_FINAL_ASSEMBLY);
MatAssemblyEnd(M, MAT_FINAL_ASSEMBLY);
after
MatCreateSeqAIJWithArrays(PETSC_COMM_WORLD, nrow, ncol, rowptr, colptr,
mat, &M);
I attached my test code and hope someone can give me some pointers.
Thanks,
Kan
#include "petscksp.h"
#include "petscao.h"
#include "petsc.h"
#include "HYPRE.h"
#include "boost/timer/timer.hpp"
#include <string>
#include <iostream>
typedef boost::timer::cpu_timer Timer;
void P_Solve(const char * matrixFileName,
const char * rhsFileName,
const char * solFileName)
{
Timer timer;
PetscInitialize(PETSC_NULL,
PETSC_NULL,
PETSC_NULL,
PETSC_NULL);
Mat M; // initial matrix downloaded from disk
Vec B; // initial RHS vector downloaded from disk
Vec X; // initial guess=0/solution vector
PC prec;
KSP solver;
FILE * fp;
char temp[3];
PetscInt nrow, ncol, nnz;
PetscFOpen(PETSC_COMM_WORLD, matrixFileName, "r", &fp);
fscanf(fp, "%s", temp); //#
fscanf(fp, "%i %i %i", &nrow, &ncol, &nnz);
PetscInt * rowptr = new PetscInt [nrow + 1];
PetscInt * colptr = new PetscInt [nnz];
PetscReal * mat = new PetscReal [nnz];
fscanf(fp, "%s", temp); //#
for (int i = 0; i < nrow + 1; i++) {
fscanf(fp, "%i", &rowptr[i]);
}
fscanf(fp, "%s", temp); //#
for (int i = 0; i < nnz; i++) {
fscanf(fp, "%i", &colptr[i]);
}
fscanf(fp, "%s", temp); //#
for (int i = 0; i < nnz; i++) {
fscanf(fp, "%lf", &mat[i]);
}
fclose(fp);
MatCreateSeqAIJWithArrays(PETSC_COMM_WORLD, nrow, ncol, rowptr, colptr,
mat, &M);
MatAssemblyBegin(M, MAT_FINAL_ASSEMBLY);
MatAssemblyEnd(M, MAT_FINAL_ASSEMBLY);
// MatView(M, PETSC_VIEWER_STDOUT_WORLD);
PetscFOpen(PETSC_COMM_WORLD, rhsFileName, "r", &fp);
PetscReal * rhs = new PetscReal [nrow];
PetscReal * x = new PetscReal [nrow];
for (int i = 0; i < nrow; i++) {
fscanf(fp, "%lf", &rhs[i]);
}
fclose(fp);
VecCreateSeqWithArray(PETSC_COMM_WORLD, 1, nrow, rhs, &B);
// VecView(B, PETSC_VIEWER_STDOUT_WORLD);
MatGetVecs(M, &X, NULL);
KSPCreate(PETSC_COMM_WORLD, &solver);
KSPSetFromOptions(solver);
KSPConvergedReason reason;
PetscReal rtol = 0;
PetscReal atol = 0;
PetscReal dtol = 0;
PetscInt it = 0;
PetscInt its = 0;
KSPGetTolerances( solver, &rtol, &atol, &dtol, &it);
rtol = 1e-6;
it = 500;
KSPSetTolerances( solver, rtol, atol, dtol, it);
KSPSetOperators(solver, M, M, SAME_NONZERO_PATTERN);
KSPSetType(solver, KSPBCGS);
KSPSetPCSide(solver, PC_RIGHT); // right preconditioning
KSPSetInitialGuessNonzero(solver,PETSC_FALSE);
KSPGetPC(solver, &prec);
PCSetType(prec, PCILU);
KSPSetFromOptions(solver);
KSPSetUp(solver);
PCSetUp(prec);
PCFactorGetMatrix(prec, &M);
timer.resume();
KSPSolve(solver,B,X);
timer.stop();
KSPGetConvergedReason(solver,&reason);
if (reason==KSP_DIVERGED_INDEFINITE_PC) {
PetscPrintf(PETSC_COMM_WORLD,"\nDivergence because of indefinite
preconditioner;\n");
PetscPrintf(PETSC_COMM_WORLD,"Run the executable again but with
'-pc_factor_shift_type POSITIVE_DEFINITE' option.\n");
} else if (reason<0) {
PetscPrintf(PETSC_COMM_WORLD,"\nOther kind of divergence: this should not
happen. %d\n",reason);
}
KSPGetIterationNumber(solver, &its);
std::cout << "PETSc ITS = " << its << " "
<< "TIMES(SEC) = " << timer.elapsed().wall / 1.e9 << "\n";
// VecView(X, PETSC_VIEWER_STDOUT_WORLD);
VecGetArray(X, &x);
PetscFOpen(PETSC_COMM_WORLD, solFileName, "w", &fp);
for (int i = 0; i < nrow; i++) {
fprintf(fp, "%.20e\n", x[i]);
}
VecRestoreArray(X, &x);
fclose(fp);
KSPDestroy(& solver);
VecDestroy(& B);
VecDestroy(& X);
MatDestroy(& M);
if (rowptr == NULL) delete [] rowptr;
if (colptr == NULL) delete [] colptr;
if (mat == NULL) delete [] mat;
if (rhs == NULL) delete [] rhs;
PetscFinalize();
}
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.mcs.anl.gov/pipermail/petsc-users/attachments/20130919/50446f01/attachment-0001.html>
More information about the petsc-users
mailing list