xref: /petsc/src/mat/tests/ex36f.F90 (revision ceeae6b5899f2879f7a95602f98efecbe51ff614)
1d8606c27SBarry Smith!
2d8606c27SBarry Smith!
3d8606c27SBarry Smith!   This program demonstrates use of PETSc dense matrices.
4d8606c27SBarry Smith!
5d8606c27SBarry Smith#include <petsc/finclude/petscsys.h>
6c5e229c2SMartin Diehl#include <petsc/finclude/petscmat.h>
7c5e229c2SMartin Diehlprogram main
8d8606c27SBarry Smith  use petscsys
9d8606c27SBarry Smith  implicit none
10d8606c27SBarry Smith
11d8606c27SBarry Smith  PetscErrorCode ierr
12d8606c27SBarry Smith
13d8606c27SBarry Smith  PetscCallA(PetscInitialize(ierr))
14d8606c27SBarry Smith
15d8606c27SBarry Smith!  Demo of PETSc-allocated dense matrix storage
16d8606c27SBarry Smith  call Demo1()
17d8606c27SBarry Smith
18d8606c27SBarry Smith!  Demo of user-allocated dense matrix storage
19d8606c27SBarry Smith  call Demo2()
20d8606c27SBarry Smith
21d8606c27SBarry Smith  PetscCallA(PetscFinalize(ierr))
22d8606c27SBarry Smithend
23d8606c27SBarry Smith
24d8606c27SBarry Smith! -----------------------------------------------------------------
25d8606c27SBarry Smith!
26d8606c27SBarry Smith!  Demo1 -  This subroutine demonstrates the use of PETSc-allocated dense
27ce78bad3SBarry Smith!  matrix storage.  Here MatDenseGetArray() is used for direct access to the
2842ce371bSBarry Smith!  array that stores the dense matrix.
29d8606c27SBarry Smith!
302c5cda21SPierre Jolivet!  Note the use of PETSC_NULL_SCALAR_ARRAY in MatCreateSeqDense() to indicate that no
31d8606c27SBarry Smith!  storage is being provided by the user. (Do NOT pass a zero in that
32d8606c27SBarry Smith!  location.)
33d8606c27SBarry Smith!
34d8606c27SBarry Smithsubroutine Demo1()
35d8606c27SBarry Smith  use petscmat
36d8606c27SBarry Smith  implicit none
37d8606c27SBarry Smith
38d8606c27SBarry Smith  Mat A
39d8606c27SBarry Smith  PetscInt n, m
40d8606c27SBarry Smith  PetscErrorCode ierr
4142ce371bSBarry Smith  PetscScalar, pointer :: aa(:, :)
42d8606c27SBarry Smith
43d8606c27SBarry Smith  n = 4
44d8606c27SBarry Smith  m = 5
45d8606c27SBarry Smith
46d8606c27SBarry Smith!  Create matrix
47d8606c27SBarry Smith
48d8606c27SBarry Smith  PetscCall(MatCreate(PETSC_COMM_SELF, A, ierr))
49d8606c27SBarry Smith  PetscCall(MatSetSizes(A, m, n, m, n, ierr))
50d8606c27SBarry Smith  PetscCall(MatSetType(A, MATSEQDENSE, ierr))
51d8606c27SBarry Smith  PetscCall(MatSetUp(A, ierr))
52d8606c27SBarry Smith
53d8606c27SBarry Smith!  Access array storage
54ce78bad3SBarry Smith  PetscCall(MatDenseGetArray(A, aa, ierr))
55d8606c27SBarry Smith
56d8606c27SBarry Smith!  Set matrix values directly
5742ce371bSBarry Smith  PetscCall(FillUpMatrix(m, n, aa))
58d8606c27SBarry Smith
59ce78bad3SBarry Smith  PetscCall(MatDenseRestoreArray(A, aa, ierr))
60d8606c27SBarry Smith
61d8606c27SBarry Smith!  Finalize matrix assembly
62d8606c27SBarry Smith  PetscCall(MatAssemblyBegin(A, MAT_FINAL_ASSEMBLY, ierr))
63d8606c27SBarry Smith  PetscCall(MatAssemblyEnd(A, MAT_FINAL_ASSEMBLY, ierr))
64d8606c27SBarry Smith
65d8606c27SBarry Smith!  View matrix
66d8606c27SBarry Smith  PetscCall(MatView(A, PETSC_VIEWER_STDOUT_SELF, ierr))
67d8606c27SBarry Smith
68d8606c27SBarry Smith!  Clean up
69d8606c27SBarry Smith  PetscCall(MatDestroy(A, ierr))
70d8606c27SBarry Smithend
71d8606c27SBarry Smith
72d8606c27SBarry Smith! -----------------------------------------------------------------
73d8606c27SBarry Smith!
74d8606c27SBarry Smith!  Demo2 -  This subroutine demonstrates the use of user-allocated dense
75d8606c27SBarry Smith!  matrix storage.
76d8606c27SBarry Smith!
77d8606c27SBarry Smithsubroutine Demo2()
78d8606c27SBarry Smith  use petscmat
79d8606c27SBarry Smith  implicit none
80d8606c27SBarry Smith
81d8606c27SBarry Smith  PetscInt n, m
82d8606c27SBarry Smith  PetscErrorCode ierr
83d8606c27SBarry Smith  parameter(m=5, n=4)
84d8606c27SBarry Smith  Mat A
85d8606c27SBarry Smith  PetscScalar aa(m, n)
86d8606c27SBarry Smith
87d8606c27SBarry Smith!  Create matrix
88d8606c27SBarry Smith  PetscCall(MatCreateSeqDense(PETSC_COMM_SELF, m, n, aa, A, ierr))
89d8606c27SBarry Smith
90d8606c27SBarry Smith!  Set matrix values directly
9142ce371bSBarry Smith  PetscCall(FillUpMatrix(m, n, aa))
92d8606c27SBarry Smith
93d8606c27SBarry Smith!  Finalize matrix assembly
94d8606c27SBarry Smith  PetscCall(MatAssemblyBegin(A, MAT_FINAL_ASSEMBLY, ierr))
95d8606c27SBarry Smith  PetscCall(MatAssemblyEnd(A, MAT_FINAL_ASSEMBLY, ierr))
96d8606c27SBarry Smith
97d8606c27SBarry Smith!  View matrix
98d8606c27SBarry Smith  PetscCall(MatView(A, PETSC_VIEWER_STDOUT_SELF, ierr))
99d8606c27SBarry Smith
100d8606c27SBarry Smith!  Clean up
101d8606c27SBarry Smith  PetscCall(MatDestroy(A, ierr))
102d8606c27SBarry Smithend
103d8606c27SBarry Smith
104d8606c27SBarry Smith! -----------------------------------------------------------------
105d8606c27SBarry Smith
106d8606c27SBarry Smithsubroutine FillUpMatrix(m, n, X)
107d8606c27SBarry Smith  PetscInt m, n, i, j
108d8606c27SBarry Smith  PetscScalar X(m, n)
109d8606c27SBarry Smith
110*ceeae6b5SMartin Diehl  do j = 1, n
111*ceeae6b5SMartin Diehl    do i = 1, m
112d8606c27SBarry Smith      X(i, j) = 1.0/real(i + j - 1)
113*ceeae6b5SMartin Diehl    end do
114*ceeae6b5SMartin Diehl  end do
115d8606c27SBarry Smithend
116