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