xref: /petsc/src/mat/tutorials/ex4f.F90 (revision c5e229c2f66f66995aed5443a26600af2aec4a3f)
1c4762a1bSJed Brown#include <petsc/finclude/petscvec.h>
2c4762a1bSJed Brown#include <petsc/finclude/petscmat.h>
3*c5e229c2SMartin Diehlprogram main
4c4762a1bSJed Brown  use petscvec
5c4762a1bSJed Brown  use petscmat
6c4762a1bSJed Brown
7c4762a1bSJed Brown  implicit none
8c4762a1bSJed Brown
9c4762a1bSJed Brown  Mat A
10c4762a1bSJed Brown  PetscInt, parameter ::  n = 5, m = 5
11c4762a1bSJed Brown  PetscScalar, parameter ::  two = 2.0, one = 1.0
12c4762a1bSJed Brown  PetscInt, pointer, dimension(:) ::  dnnz, onnz
13c4762a1bSJed Brown  PetscInt    ::  i, rstart, rend, M1, N1
14c4762a1bSJed Brown  PetscErrorCode ierr
15c4762a1bSJed Brown
16d8606c27SBarry Smith  PetscCallA(PetscInitialize(ierr))
17c4762a1bSJed Brown
18c4762a1bSJed Brown  allocate (dnnz(0:m - 1))
19c4762a1bSJed Brown  allocate (onnz(0:m - 1))
20c4762a1bSJed Brown
21c4762a1bSJed Brown  do i = 0, m - 1
22c4762a1bSJed Brown    dnnz(i) = 1
23c4762a1bSJed Brown    onnz(i) = 1
24c4762a1bSJed Brown  end do
25c4762a1bSJed Brown
26d8606c27SBarry Smith  PetscCallA(MatCreateAIJ(PETSC_COMM_WORLD, m, n, PETSC_DETERMINE, PETSC_DETERMINE, PETSC_DECIDE, dnnz, PETSC_DECIDE, onnz, A, ierr))
27d8606c27SBarry Smith  PetscCallA(MatSetFromOptions(A, ierr))
28d8606c27SBarry Smith  PetscCallA(MatSetUp(A, ierr))
29c4762a1bSJed Brown  deallocate (dnnz)
30c4762a1bSJed Brown  deallocate (onnz)
31c4762a1bSJed Brown
32c4762a1bSJed Brown  !/* This assembly shrinks memory because we do not insert enough number of values */
33d8606c27SBarry Smith  PetscCallA(MatAssemblyBegin(A, MAT_FINAL_ASSEMBLY, ierr))
34d8606c27SBarry Smith  PetscCallA(MatAssemblyEnd(A, MAT_FINAL_ASSEMBLY, ierr))
35c4762a1bSJed Brown
36c4762a1bSJed Brown  !/* MatResetPreallocation restores the memory required by users */
37d8606c27SBarry Smith  PetscCallA(MatResetPreallocation(A, ierr))
38d8606c27SBarry Smith  PetscCallA(MatSetOption(A, MAT_NEW_NONZERO_ALLOCATION_ERR, PETSC_TRUE, ierr))
39d8606c27SBarry Smith  PetscCallA(MatGetOwnershipRange(A, rstart, rend, ierr))
40d8606c27SBarry Smith  PetscCallA(MatGetSize(A, M1, N1, ierr))
41c4762a1bSJed Brown  do i = rstart, rend - 1
42d8606c27SBarry Smith    PetscCallA(MatSetValue(A, i, i, two, INSERT_VALUES, ierr))
43d8606c27SBarry Smith    if (rend < N1) PetscCallA(MatSetValue(A, i, rend, one, INSERT_VALUES, ierr))
44c4762a1bSJed Brown  end do
45d8606c27SBarry Smith  PetscCallA(MatAssemblyBegin(A, MAT_FINAL_ASSEMBLY, ierr))
46d8606c27SBarry Smith  PetscCallA(MatAssemblyEnd(A, MAT_FINAL_ASSEMBLY, ierr))
47d8606c27SBarry Smith  PetscCallA(MatView(A, PETSC_VIEWER_STDOUT_WORLD, ierr))
48d8606c27SBarry Smith  PetscCallA(MatDestroy(A, ierr))
49d8606c27SBarry Smith  PetscCallA(PetscFinalize(ierr))
50c4762a1bSJed Brown
51c4762a1bSJed Brownend program
52c4762a1bSJed Brown
53c4762a1bSJed Brown!/*TEST
54c4762a1bSJed Brown!
55c4762a1bSJed Brown!   test:
56c4762a1bSJed Brown!      suffix: 1
57c4762a1bSJed Brown!      output_file: output/ex4_1.out
58c4762a1bSJed Brown!
59c4762a1bSJed Brown!   test:
60c4762a1bSJed Brown!      suffix: 2
61c4762a1bSJed Brown!      nsize: 2
62c4762a1bSJed Brown!      output_file: output/ex4_2.out
63c4762a1bSJed Brown!
64c4762a1bSJed Brown!TEST*/
65