Actual source code: ex262f.F90

  1: #include <petsc/finclude/petscmat.h>
  2: program main
  3:   use petscmat
  4:   implicit none

  6:   Mat A, B
  7:   PetscErrorCode ierr
  8:   PetscScalar, pointer :: km(:, :)
  9:   PetscInt, parameter :: three = 3, one = 1
 10:   PetscInt idxm(1), idxmj(1), i, j
 11:   PetscMPIInt rank, size

 13:   PetscCallA(PetscInitialize(ierr))

 15:   PetscCallMPIA(MPI_Comm_rank(PETSC_COMM_WORLD, rank, ierr))
 16:   PetscCallMPIA(MPI_Comm_size(PETSC_COMM_WORLD, size, ierr))

 18:   PetscCallA(MatCreate(PETSC_COMM_WORLD, A, ierr))
 19:   PetscCallA(MatSetSizes(A, three, three, PETSC_DECIDE, PETSC_DECIDE, ierr))
 20:   PetscCallA(MatSetBlockSize(A, three, ierr))
 21:   PetscCallA(MatSetUp(A, ierr))
 22:   PetscCallA(MatDuplicate(A, MAT_DO_NOT_COPY_VALUES, B, ierr))
 23:   idxm(1) = 0
 24:   allocate (km(three, three))
 25:   do i = 1, 3
 26:     do j = 1, 3
 27:       km(1, 1) = i + j
 28:       idxm(1) = i - 1 + 3*rank
 29:       idxmj(1) = j - 1 + 3*rank
 30:       PetscCallA(MatSetValues(B, one, idxm, one, idxmj, reshape(km, [three**2]), ADD_VALUES, ierr))
 31:     end do
 32:   end do

 34:   PetscCallA(MatAssemblyBegin(B, MAT_FINAL_ASSEMBLY, ierr))
 35:   PetscCallA(MatAssemblyEnd(B, MAT_FINAL_ASSEMBLY, ierr))
 36:   PetscCallA(MatView(B, PETSC_VIEWER_STDOUT_WORLD, ierr))

 38:   PetscCallA(MatDestroy(A, ierr))
 39:   PetscCallA(MatDestroy(B, ierr))

 41:   deallocate (km)
 42:   PetscCallA(PetscFinalize(ierr))
 43: end

 45: !/*TEST
 46: !
 47: !   test:
 48: !     nsize: 2
 49: !
 50: !TEST*/