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