Actual source code: ex269f.F90
1: ! Test MatCreateNest() with NULL index sets
3: program main
4: #include <petsc/finclude/petscmat.h>
5: use petscmat
6: implicit none
8: Mat :: A,D,Id,Acopy
9: Mat,dimension(4) :: mats
10: Vec :: v,w
11: PetscInt :: i,rstart,rend
12: PetscInt,parameter :: n=6,nb=2
13: PetscScalar,parameter :: one=1.0, two=2.0
14: PetscErrorCode :: ierr
16: PetscCallA(PetscInitialize(ierr))
18: PetscCallA(MatCreateConstantDiagonal(PETSC_COMM_WORLD,PETSC_DETERMINE,PETSC_DETERMINE,n,n,one,Id,ierr))
19: PetscCallA(MatCreateVecs(Id,v,w,ierr))
20: PetscCallA(VecGetOwnershipRange(v,rstart,rend,ierr))
21: do i=rstart,rend-1
22: PetscCallA(VecSetValue(v,i,two/(i+1),INSERT_VALUES,ierr))
23: end do
24: PetscCallA(VecAssemblyBegin(v,ierr))
25: PetscCallA(VecAssemblyEnd(v,ierr))
26: PetscCallA(MatCreateDiagonal(v,D,ierr))
28: mats = [PETSC_NULL_MAT, D, Id, PETSC_NULL_MAT]
29: PetscCallA(MatCreateNest(PETSC_COMM_WORLD,nb,PETSC_NULL_IS_ARRAY,nb,PETSC_NULL_IS_ARRAY,mats,A,ierr))
30: PetscCallA(MatView(A,PETSC_VIEWER_STDOUT_WORLD,ierr))
31: PetscCallA(MatNestSetSubMats(A,nb,PETSC_NULL_IS_ARRAY,nb,PETSC_NULL_IS_ARRAY,mats,ierr))
32: PetscCallA(MatView(A,PETSC_VIEWER_STDOUT_WORLD,ierr))
34: ! test MatCopy()
35: PetscCallA(MatDuplicate(A,MAT_DO_NOT_COPY_VALUES,Acopy,ierr))
36: PetscCallA(MatCopy(A,Acopy,DIFFERENT_NONZERO_PATTERN,ierr))
38: PetscCallA(MatDestroy(Acopy,ierr))
39: PetscCallA(MatDestroy(Id,ierr))
40: PetscCallA(VecDestroy(v,ierr))
41: PetscCallA(VecDestroy(w,ierr))
42: PetscCallA(MatDestroy(D,ierr))
43: PetscCallA(MatDestroy(A,ierr))
44: PetscCallA(PetscFinalize(ierr))
46: end program
48: !/*TEST
49: !
50: ! test:
51: ! nsize: 2
52: !
53: !TEST*/