xref: /petsc/src/mat/tests/ex36f.F90 (revision 42ce371b2bd7d45eb85bb2bb31075ac1967f9fc8)
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
26*42ce371bSBarry Smith!  matrix storage.  Here MatDenseGetArrayF90() is used for direct access to the
27*42ce371bSBarry Smith!  array that stores the dense matrix.
28d8606c27SBarry Smith!
29d8606c27SBarry Smith!  Note the use of PETSC_NULL_SCALAR 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
41*42ce371bSBarry 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
54*42ce371bSBarry Smith      PetscCall(MatDenseGetArrayF90(A,aa,ierr))
55d8606c27SBarry Smith
56d8606c27SBarry Smith!  Set matrix values directly
57*42ce371bSBarry Smith      PetscCall(FillUpMatrix(m,n,aa))
58d8606c27SBarry Smith
59*42ce371bSBarry Smith      PetscCall(MatDenseRestoreArrayF90(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      return
71d8606c27SBarry Smith      end
72d8606c27SBarry Smith
73d8606c27SBarry Smith! -----------------------------------------------------------------
74d8606c27SBarry Smith!
75d8606c27SBarry Smith!  Demo2 -  This subroutine demonstrates the use of user-allocated dense
76d8606c27SBarry Smith!  matrix storage.
77d8606c27SBarry Smith!
78d8606c27SBarry Smith      subroutine Demo2()
79d8606c27SBarry Smith#include <petsc/finclude/petscmat.h>
80d8606c27SBarry Smith      use petscmat
81d8606c27SBarry Smith      implicit none
82d8606c27SBarry Smith
83d8606c27SBarry Smith      PetscInt   n,m
84d8606c27SBarry Smith      PetscErrorCode ierr
85d8606c27SBarry Smith      parameter (m=5,n=4)
86d8606c27SBarry Smith      Mat       A
87d8606c27SBarry Smith      PetscScalar    aa(m,n)
88d8606c27SBarry Smith
89d8606c27SBarry Smith!  Create matrix
90d8606c27SBarry Smith      PetscCall(MatCreateSeqDense(PETSC_COMM_SELF,m,n,aa,A,ierr))
91d8606c27SBarry Smith
92d8606c27SBarry Smith!  Set matrix values directly
93*42ce371bSBarry Smith      PetscCall(FillUpMatrix(m,n,aa))
94d8606c27SBarry Smith
95d8606c27SBarry Smith!  Finalize matrix assembly
96d8606c27SBarry Smith      PetscCall(MatAssemblyBegin(A,MAT_FINAL_ASSEMBLY,ierr))
97d8606c27SBarry Smith      PetscCall(MatAssemblyEnd(A,MAT_FINAL_ASSEMBLY,ierr))
98d8606c27SBarry Smith
99d8606c27SBarry Smith!  View matrix
100d8606c27SBarry Smith      PetscCall(MatView(A,PETSC_VIEWER_STDOUT_SELF,ierr))
101d8606c27SBarry Smith
102d8606c27SBarry Smith!  Clean up
103d8606c27SBarry Smith      PetscCall(MatDestroy(A,ierr))
104d8606c27SBarry Smith      return
105d8606c27SBarry Smith      end
106d8606c27SBarry Smith
107d8606c27SBarry Smith! -----------------------------------------------------------------
108d8606c27SBarry Smith
109d8606c27SBarry Smith      subroutine FillUpMatrix(m,n,X)
110d8606c27SBarry Smith      PetscInt          m,n,i,j
111d8606c27SBarry Smith      PetscScalar      X(m,n)
112d8606c27SBarry Smith
113d8606c27SBarry Smith      do 10, j=1,n
114d8606c27SBarry Smith        do 20, i=1,m
115d8606c27SBarry Smith          X(i,j) = 1.0/real(i+j-1)
116d8606c27SBarry Smith 20     continue
117d8606c27SBarry Smith 10   continue
118d8606c27SBarry Smith      return
119d8606c27SBarry Smith      end
120