1d8606c27SBarry Smith! 2d8606c27SBarry Smith! 3d8606c27SBarry Smith! This program demonstrates use of PETSc dense matrices. 4d8606c27SBarry Smith! 5d8606c27SBarry Smith#include <petsc/finclude/petscsys.h> 6c5e229c2SMartin Diehl#include <petsc/finclude/petscmat.h> 7c5e229c2SMartin Diehlprogram main 8d8606c27SBarry Smith use petscsys 9d8606c27SBarry Smith implicit none 10d8606c27SBarry Smith 11d8606c27SBarry Smith PetscErrorCode ierr 12d8606c27SBarry Smith 13d8606c27SBarry Smith PetscCallA(PetscInitialize(ierr)) 14d8606c27SBarry Smith 15d8606c27SBarry Smith! Demo of PETSc-allocated dense matrix storage 16d8606c27SBarry Smith call Demo1() 17d8606c27SBarry Smith 18d8606c27SBarry Smith! Demo of user-allocated dense matrix storage 19d8606c27SBarry Smith call Demo2() 20d8606c27SBarry Smith 21d8606c27SBarry Smith PetscCallA(PetscFinalize(ierr)) 22d8606c27SBarry Smithend 23d8606c27SBarry Smith 24d8606c27SBarry Smith! ----------------------------------------------------------------- 25d8606c27SBarry Smith! 26d8606c27SBarry Smith! Demo1 - This subroutine demonstrates the use of PETSc-allocated dense 27ce78bad3SBarry Smith! matrix storage. Here MatDenseGetArray() is used for direct access to the 2842ce371bSBarry Smith! array that stores the dense matrix. 29d8606c27SBarry Smith! 302c5cda21SPierre Jolivet! Note the use of PETSC_NULL_SCALAR_ARRAY in MatCreateSeqDense() to indicate that no 31d8606c27SBarry Smith! storage is being provided by the user. (Do NOT pass a zero in that 32d8606c27SBarry Smith! location.) 33d8606c27SBarry Smith! 34d8606c27SBarry Smithsubroutine Demo1() 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 Smithend 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 Smithsubroutine Demo2() 78d8606c27SBarry Smith use petscmat 79d8606c27SBarry Smith implicit none 80d8606c27SBarry Smith 81d8606c27SBarry Smith PetscInt n, m 82d8606c27SBarry Smith PetscErrorCode ierr 83d8606c27SBarry Smith parameter(m=5, n=4) 84d8606c27SBarry Smith Mat A 85d8606c27SBarry Smith PetscScalar aa(m, n) 86d8606c27SBarry Smith 87d8606c27SBarry Smith! Create matrix 88d8606c27SBarry Smith PetscCall(MatCreateSeqDense(PETSC_COMM_SELF, m, n, aa, A, ierr)) 89d8606c27SBarry Smith 90d8606c27SBarry Smith! Set matrix values directly 9142ce371bSBarry Smith PetscCall(FillUpMatrix(m, n, aa)) 92d8606c27SBarry Smith 93d8606c27SBarry Smith! Finalize matrix assembly 94d8606c27SBarry Smith PetscCall(MatAssemblyBegin(A, MAT_FINAL_ASSEMBLY, ierr)) 95d8606c27SBarry Smith PetscCall(MatAssemblyEnd(A, MAT_FINAL_ASSEMBLY, ierr)) 96d8606c27SBarry Smith 97d8606c27SBarry Smith! View matrix 98d8606c27SBarry Smith PetscCall(MatView(A, PETSC_VIEWER_STDOUT_SELF, ierr)) 99d8606c27SBarry Smith 100d8606c27SBarry Smith! Clean up 101d8606c27SBarry Smith PetscCall(MatDestroy(A, ierr)) 102d8606c27SBarry Smithend 103d8606c27SBarry Smith 104d8606c27SBarry Smith! ----------------------------------------------------------------- 105d8606c27SBarry Smith 106d8606c27SBarry Smithsubroutine FillUpMatrix(m, n, X) 107d8606c27SBarry Smith PetscInt m, n, i, j 108d8606c27SBarry Smith PetscScalar X(m, n) 109d8606c27SBarry Smith 110*ceeae6b5SMartin Diehl do j = 1, n 111*ceeae6b5SMartin Diehl do i = 1, m 112d8606c27SBarry Smith X(i, j) = 1.0/real(i + j - 1) 113*ceeae6b5SMartin Diehl end do 114*ceeae6b5SMartin Diehl end do 115d8606c27SBarry Smithend 116