1c4762a1bSJed Brown! 2c4762a1bSJed Brown! Program to test recently added F90 features for Mat 3c4762a1bSJed Brown! 4c4762a1bSJed Brown program main 5c4762a1bSJed Brown 6c4762a1bSJed Brown#include <petsc/finclude/petscmat.h> 7c4762a1bSJed Brown use petscmat 8c4762a1bSJed Brown implicit none 9c4762a1bSJed Brown 10c4762a1bSJed Brown PetscErrorCode ierr 11c4762a1bSJed Brown Mat A,B 12c4762a1bSJed Brown Mat C,SC 13c4762a1bSJed Brown MatNullSpace sp,sp1 14c4762a1bSJed Brown PetscInt one,zero,rend 15c4762a1bSJed Brown PetscScalar sone 16c4762a1bSJed Brown Vec x,y 17c4762a1bSJed Brown 18c4762a1bSJed Brown zero = 0 19c4762a1bSJed Brown one = 1 20c4762a1bSJed Brown sone = 1 21*d8606c27SBarry Smith PetscCallA(PetscInitialize(ierr)) 22c4762a1bSJed Brown 23*d8606c27SBarry Smith PetscCallA(MatCreate(PETSC_COMM_WORLD,A,ierr)) 24*d8606c27SBarry Smith PetscCallA(MatCreate(PETSC_COMM_WORLD,B,ierr)) 25c4762a1bSJed Brown 26*d8606c27SBarry Smith PetscCallA(MatGetNullSpace(A,sp,ierr)) 27c4762a1bSJed Brown if (sp .ne. PETSC_NULL_MATNULLSPACE) then; SETERRA(PETSC_COMM_SELF,PETSC_ERR_PLIB,"Matrix null space should not exist"); endif 28c4762a1bSJed Brown 29*d8606c27SBarry Smith PetscCallA(MatSetNullSpace(A,PETSC_NULL_MATNULLSPACE,ierr)) 30*d8606c27SBarry Smith PetscCallA(MatGetNullSpace(A,sp,ierr)) 31c4762a1bSJed Brown if (sp .ne. PETSC_NULL_MATNULLSPACE) then; SETERRA(PETSC_COMM_SELF,PETSC_ERR_PLIB,"Matrix null space should not exist"); endif 32c4762a1bSJed Brown 33*d8606c27SBarry Smith PetscCallA(MatNullSpaceCreate(PETSC_COMM_WORLD,PETSC_TRUE,zero,PETSC_NULL_VEC,sp,ierr)) 34*d8606c27SBarry Smith PetscCallA(MatSetNullSpace(A,sp,ierr)) 35*d8606c27SBarry Smith PetscCallA(MatGetNullSpace(A,sp1,ierr)) 36c4762a1bSJed Brown if (sp1 .eq. PETSC_NULL_MATNULLSPACE) then; SETERRA(PETSC_COMM_SELF,PETSC_ERR_PLIB,"Matrix null space should not be null"); endif 37*d8606c27SBarry Smith PetscCallA(MatNullSpaceDestroy(sp,ierr)) 38c4762a1bSJed Brown 39*d8606c27SBarry Smith PetscCallA(MatCreateSeqDense(PETSC_COMM_WORLD,one,one,PETSC_NULL_SCALAR,C,ierr)) 40*d8606c27SBarry Smith PetscCallA(MatSetValues(C,one,zero,one,zero,sone,INSERT_VALUES,ierr)) 41*d8606c27SBarry Smith PetscCallA(MatAssemblyBegin(C,MAT_FINAL_ASSEMBLY,ierr)) 42*d8606c27SBarry Smith PetscCallA(MatAssemblyEnd(C,MAT_FINAL_ASSEMBLY,ierr)) 43*d8606c27SBarry Smith PetscCallA(MatCreateSchurComplement(C,C,C,C,PETSC_NULL_MAT,SC,ierr)) 44*d8606c27SBarry Smith PetscCallA(MatGetOwnershipRange(SC,PETSC_NULL_INTEGER,rend,ierr)) 45*d8606c27SBarry Smith PetscCallA(VecCreateSeq(PETSC_COMM_SELF,one,x,ierr)) 46*d8606c27SBarry Smith PetscCallA(VecDuplicate(x,y,ierr)) 47*d8606c27SBarry Smith PetscCallA(VecSetValues(x,one,zero,sone,INSERT_VALUES,ierr)) 48*d8606c27SBarry Smith PetscCallA(VecAssemblyBegin(x,ierr)) 49*d8606c27SBarry Smith PetscCallA(VecAssemblyEnd(x,ierr)) 50*d8606c27SBarry Smith PetscCallA(MatMult(SC,x,y,ierr)) 51*d8606c27SBarry Smith PetscCallA(VecView(y,PETSC_VIEWER_STDOUT_SELF,ierr)) 52*d8606c27SBarry Smith PetscCallA(VecSetRandom(x,PETSC_NULL_RANDOM,ierr)) 53*d8606c27SBarry Smith PetscCallA(VecView(x,PETSC_VIEWER_STDOUT_SELF,ierr)) 54c4762a1bSJed Brown 55*d8606c27SBarry Smith PetscCallA(MatDestroy(SC,ierr)) 56*d8606c27SBarry Smith PetscCallA(MatDestroy(C,ierr)) 57*d8606c27SBarry Smith PetscCallA(VecDestroy(x,ierr)) 58*d8606c27SBarry Smith PetscCallA(VecDestroy(y,ierr)) 59*d8606c27SBarry Smith PetscCallA(MatDestroy(A,ierr)) 60*d8606c27SBarry Smith PetscCallA(MatDestroy(B,ierr)) 61*d8606c27SBarry Smith PetscCallA(PetscFinalize(ierr)) 62c4762a1bSJed Brown end 63c4762a1bSJed Brown 64c4762a1bSJed Brown!/*TEST 65c4762a1bSJed Brown! 66c4762a1bSJed Brown! test: 67c4762a1bSJed Brown! requires: !complex 68c4762a1bSJed Brown! 69c4762a1bSJed Brown!TEST*/ 70