xref: /petsc/src/mat/tests/ex269f.F90 (revision b2ccae6bdc8edea944f1c160ca3b2eb32c69ecb2)
1! Test MatCreateNest() with NULL index sets
2
3program main
4#include <petsc/finclude/petscmat.h>
5  use petscmat
6  implicit none
7
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
15
16  PetscCallA(PetscInitialize(ierr))
17
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))
27
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))
33
34  ! test MatCopy()
35  PetscCallA(MatDuplicate(A, MAT_DO_NOT_COPY_VALUES, Acopy, ierr))
36  PetscCallA(MatCopy(A, Acopy, DIFFERENT_NONZERO_PATTERN, ierr))
37
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))
45
46end program
47
48!/*TEST
49!
50!   test:
51!      nsize: 2
52!
53!TEST*/
54