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