1 2 static char help[] = "Passes a sparse matrix to MATLAB.\n\n"; 3 4 #include <petscmat.h> 5 6 int main(int argc, char **args) 7 { 8 PetscInt m = 4, n = 5, i, j, II, J; 9 PetscScalar one = 1.0, v; 10 Vec x; 11 Mat A; 12 13 PetscFunctionBeginUser; 14 PetscCall(PetscInitialize(&argc, &args, (char *)0, help)); 15 PetscCall(PetscOptionsGetInt(NULL, NULL, "-m", &m, NULL)); 16 PetscCall(PetscOptionsGetInt(NULL, NULL, "-n", &n, NULL)); 17 18 PetscCall(MatCreate(PETSC_COMM_WORLD, &A)); 19 PetscCall(MatSetSizes(A, PETSC_DECIDE, PETSC_DECIDE, m * n, m * n)); 20 PetscCall(MatSetFromOptions(A)); 21 PetscCall(MatSetUp(A)); 22 23 for (i = 0; i < m; i++) { 24 for (j = 0; j < n; j++) { 25 v = -1.0; 26 II = j + n * i; 27 if (i > 0) { 28 J = II - n; 29 PetscCall(MatSetValues(A, 1, &II, 1, &J, &v, INSERT_VALUES)); 30 } 31 if (i < m - 1) { 32 J = II + n; 33 PetscCall(MatSetValues(A, 1, &II, 1, &J, &v, INSERT_VALUES)); 34 } 35 if (j > 0) { 36 J = II - 1; 37 PetscCall(MatSetValues(A, 1, &II, 1, &J, &v, INSERT_VALUES)); 38 } 39 if (j < n - 1) { 40 J = II + 1; 41 PetscCall(MatSetValues(A, 1, &II, 1, &J, &v, INSERT_VALUES)); 42 } 43 v = 4.0; 44 PetscCall(MatSetValues(A, 1, &II, 1, &II, &v, INSERT_VALUES)); 45 } 46 } 47 PetscCall(MatAssemblyBegin(A, MAT_FINAL_ASSEMBLY)); 48 PetscCall(MatAssemblyEnd(A, MAT_FINAL_ASSEMBLY)); 49 #if defined(PETSC_USE_SOCKET_VIEWER) 50 PetscCall(MatView(A, PETSC_VIEWER_SOCKET_WORLD)); 51 #endif 52 PetscCall(VecCreateSeq(PETSC_COMM_SELF, m, &x)); 53 PetscCall(VecSet(x, one)); 54 #if defined(PETSC_USE_SOCKET_VIEWER) 55 PetscCall(VecView(x, PETSC_VIEWER_SOCKET_WORLD)); 56 #endif 57 58 PetscCall(PetscSleep(30)); 59 60 PetscCall(VecDestroy(&x)); 61 PetscCall(MatDestroy(&A)); 62 PetscCall(PetscFinalize()); 63 return 0; 64 } 65 66 /*TEST 67 68 test: 69 TODO: cannot test with socket viewer 70 71 TEST*/ 72