Hello, I have a matrix that have the option set MAT_SYMMETRY_ETERNAL and set some values in the upper triangular. When reading values I was expecting that Petsc makes it a symmetric matrix, but the lower triangular is empty like it was initialized.
Thanks, Florian Example code: #include <iostream> #include "petscmat.h" #include "petscviewer.h" using namespace std; // Compiling with: mpic++ -g3 -Wall -I ~/software/petsc/include -I ~/software/petsc/arch-linux2-c-debug/include -L ~/software/petsc/arch-linux2-c-debug/lib -lpetsc test.cpp int main(int argc, char **args) { PetscInitialize(&argc, &args, "", NULL); PetscErrorCode ierr = 0; int N = 4; Mat matrix; // Create dense matrix, but code should work for sparse, too (I hope) // dense is more convenient to MatView. ierr = MatCreateDense(PETSC_COMM_WORLD, PETSC_DECIDE, PETSC_DECIDE, N, N, NULL, &matrix); CHKERRQ(ierr); ierr = MatSetUp(matrix); CHKERRQ(ierr); ierr = MatSetOption(matrix, MAT_SYMMETRY_ETERNAL, PETSC_TRUE); CHKERRQ(ierr); MatSetValue(matrix, 1, 1, 1, INSERT_VALUES); MatSetValue(matrix, 1, 2, 2, INSERT_VALUES); MatSetValue(matrix, 1, 3, 3, INSERT_VALUES); MatSetValue(matrix, 2, 3, 4, INSERT_VALUES); ierr = MatAssemblyBegin(matrix, MAT_FINAL_ASSEMBLY); CHKERRQ(ierr); ierr = MatAssemblyEnd(matrix, MAT_FINAL_ASSEMBLY); CHKERRQ(ierr); const PetscScalar *vals; ierr = MatGetRow(matrix, 2, NULL, NULL, &vals); cout << "Vals = " << vals[0] << " " << vals[1] << " " << vals[2] << " " << vals[3] << endl; // prints: Vals = 0 0 0 4 // excepted: Vals = 0 2 0 4 ierr = MatRestoreRow(matrix, 2, NULL, NULL, &vals); ierr = MatView(matrix, PETSC_VIEWER_STDOUT_WORLD); CHKERRQ(ierr); PetscFinalize(); return 0; }