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