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*/