xref: /petsc/src/mat/tests/ex36f.F90 (revision 2c5cda212b649c0653959308dd61150a8db34f3d)
1d8606c27SBarry Smith!
2d8606c27SBarry Smith!
3d8606c27SBarry Smith!   This program demonstrates use of PETSc dense matrices.
4d8606c27SBarry Smith!
5d8606c27SBarry Smith      program main
6d8606c27SBarry Smith#include <petsc/finclude/petscsys.h>
7d8606c27SBarry Smith      use petscsys
8d8606c27SBarry Smith      implicit none
9d8606c27SBarry Smith
10d8606c27SBarry Smith      PetscErrorCode ierr
11d8606c27SBarry Smith
12d8606c27SBarry Smith      PetscCallA(PetscInitialize(ierr))
13d8606c27SBarry Smith
14d8606c27SBarry Smith!  Demo of PETSc-allocated dense matrix storage
15d8606c27SBarry Smith      call Demo1()
16d8606c27SBarry Smith
17d8606c27SBarry Smith!  Demo of user-allocated dense matrix storage
18d8606c27SBarry Smith      call Demo2()
19d8606c27SBarry Smith
20d8606c27SBarry Smith      PetscCallA(PetscFinalize(ierr))
21d8606c27SBarry Smith      end
22d8606c27SBarry Smith
23d8606c27SBarry Smith! -----------------------------------------------------------------
24d8606c27SBarry Smith!
25d8606c27SBarry Smith!  Demo1 -  This subroutine demonstrates the use of PETSc-allocated dense
26ce78bad3SBarry Smith!  matrix storage.  Here MatDenseGetArray() is used for direct access to the
2742ce371bSBarry Smith!  array that stores the dense matrix.
28d8606c27SBarry Smith!
29*2c5cda21SPierre Jolivet!  Note the use of PETSC_NULL_SCALAR_ARRAY in MatCreateSeqDense() to indicate that no
30d8606c27SBarry Smith!  storage is being provided by the user. (Do NOT pass a zero in that
31d8606c27SBarry Smith!  location.)
32d8606c27SBarry Smith!
33d8606c27SBarry Smith      subroutine Demo1()
34d8606c27SBarry Smith#include <petsc/finclude/petscmat.h>
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 Smith      end
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 Smith      subroutine Demo2()
78d8606c27SBarry Smith#include <petsc/finclude/petscmat.h>
79d8606c27SBarry Smith      use petscmat
80d8606c27SBarry Smith      implicit none
81d8606c27SBarry Smith
82d8606c27SBarry Smith      PetscInt   n,m
83d8606c27SBarry Smith      PetscErrorCode ierr
84d8606c27SBarry Smith      parameter (m=5,n=4)
85d8606c27SBarry Smith      Mat       A
86d8606c27SBarry Smith      PetscScalar    aa(m,n)
87d8606c27SBarry Smith
88d8606c27SBarry Smith!  Create matrix
89d8606c27SBarry Smith      PetscCall(MatCreateSeqDense(PETSC_COMM_SELF,m,n,aa,A,ierr))
90d8606c27SBarry Smith
91d8606c27SBarry Smith!  Set matrix values directly
9242ce371bSBarry Smith      PetscCall(FillUpMatrix(m,n,aa))
93d8606c27SBarry Smith
94d8606c27SBarry Smith!  Finalize matrix assembly
95d8606c27SBarry Smith      PetscCall(MatAssemblyBegin(A,MAT_FINAL_ASSEMBLY,ierr))
96d8606c27SBarry Smith      PetscCall(MatAssemblyEnd(A,MAT_FINAL_ASSEMBLY,ierr))
97d8606c27SBarry Smith
98d8606c27SBarry Smith!  View matrix
99d8606c27SBarry Smith      PetscCall(MatView(A,PETSC_VIEWER_STDOUT_SELF,ierr))
100d8606c27SBarry Smith
101d8606c27SBarry Smith!  Clean up
102d8606c27SBarry Smith      PetscCall(MatDestroy(A,ierr))
103d8606c27SBarry Smith      end
104d8606c27SBarry Smith
105d8606c27SBarry Smith! -----------------------------------------------------------------
106d8606c27SBarry Smith
107d8606c27SBarry Smith      subroutine FillUpMatrix(m,n,X)
108d8606c27SBarry Smith      PetscInt          m,n,i,j
109d8606c27SBarry Smith      PetscScalar      X(m,n)
110d8606c27SBarry Smith
111d8606c27SBarry Smith      do 10, j=1,n
112d8606c27SBarry Smith        do 20, i=1,m
113d8606c27SBarry Smith          X(i,j) = 1.0/real(i+j-1)
114d8606c27SBarry Smith 20     continue
115d8606c27SBarry Smith 10   continue
116d8606c27SBarry Smith      end
117