[petsc-users] MatGetRow and MatSetValues
Jin, Shuangshuang
Shuangshuang.Jin at pnnl.gov
Tue Sep 10 18:58:48 CDT 2013
Hello, PETSc developers, I have a question regarding the usage of MatGetRow and MatSetValues.
As shown in the piece of code below. I have a matrix A with n rows and N_Steps columns, for each time step I_Steps, I want to set A[x, I_Steps+1] = A[x, I_Steps] + someComputedValue;
As I understand, in order to read A[x, I_Steps], I have to get the x's rows values in A by MatGetRow; In order to set the A[x, I_Steps+1], I have to use the MatSetValues. And these operations require the MatAssemblyBegin and MatAssemblyEnd as well.
The problem is when I run the code, it only works when the number of processors equal to 1 or n. Otherwise, it's hanging there forever.
I feel like the MatAssemblyBegin and MatAssemblyEnd may be the source of the problem.
How to fix the error? Or is there a better way to implement this?
Thanks,
Shuangshuang
Mat A;
ierr = MatGetOwnershipRange(A, &lo, &hi); CHKERRQ(ierr);
const PetscScalar *AVals;
for (I_Steps = 0; I_Steps < N_Steps; I_Steps++) {
for (k = lo; k < hi; k++) {
ierr = MatGetRow(A, k, &ncols, &cols, &AVals); CHKERRQ(ierr);
val[0] = AVals[cols[I_Steps]] + someComputedValue;
ierr = MatRestoreRow(A, k, &ncols, &cols, &AVals); CHKERRQ(ierr);
j = I_Steps+1;
ierr = MatSetValues(A, 1, &k, 1, &j, val, INSERT_VALUES); CHKERRQ(ierr);
ierr = MatAssemblyBegin(A, MAT_FINAL_ASSEMBLY); CHKERRQ(ierr);
ierr = MatAssemblyEnd(A, MAT_FINAL_ASSEMBLY); CHKERRQ(ierr);
MatView(A, PETSC_VIEWER_STDOUT_WORLD);
}
}
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.mcs.anl.gov/pipermail/petsc-users/attachments/20130910/546dd050/attachment.html>
More information about the petsc-users
mailing list