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