[petsc-users] Problem with assembling 2 matrices

Jonas Mairhofer mairhofer at itt.uni-stuttgart.de
Wed Jun 11 06:47:03 CDT 2014


Dear PETSc-Team,

I am trying to set a global array X as column 0 of a dense matrix A and 
another global array Y as the first column of a second dense matrix B.
Everything works perfectly fine in serial and parallel as long as I do 
this only for one of the matrices. However, when I try to do it for both 
matrices, the entries of matrix A seem to be overwritten by the values 
of matrix B.

This is the output I get (first vectors X and Y, then matrices A and B):

  Vector Object:Vec_0x84000000_0 1 MPI processes
   type: mpi
Process [0]
1
1
1
Vector Object:Vec_0x84000000_1 1 MPI processes
   type: mpi
Process [0]
2
2
2
Matrix Object: 1 MPI processes
   type: seqdense
2.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
2.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
2.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
Matrix Object: 1 MPI processes
   type: seqdense
2.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
2.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
2.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00

I also attached the Fortran code:




program main
implicit none

#include <finclude/petscsys.h>
#include <finclude/petscvec.h>
#include <finclude/petscdmda.h>
#include <finclude/petscis.h>
#include <finclude/petscmat.h>
#include <finclude/petscksp.h>
#include <finclude/petscpc.h>
#include <finclude/petscsnes.h>
#include <finclude/petscvec.h90>
#include <finclude/petscdmda.h90>

       PetscInt  i,j,m,n
       PetscErrorCode ierr

       PetscScalar one
       Mat         A
       Mat         B

       PetscInt row(3)
       DM    da
       Vec X
       Vec Y
       PetscScalar,pointer :: X_pointer(:)
       PetscScalar,pointer :: Y_pointer(:)
       PetscInt xs,xm

!Initialize
       call PetscInitialize(PETSC_NULL_CHARACTER,ierr)

       m = 3 !col
       n = 3 !row


call DMDACreate1d(PETSC_COMM_WORLD, &  !MPI communicator
      & DMDA_BOUNDARY_NONE,                                          & 
!Boundary type at boundary of physical domain
      & n,                                                       & 
!global dimension of array (if negative number, then value can be 
changed by user via command line!)
      & 1,                                                           & 
!number of degrees of freedom per grid point (number of unknowns at each 
grid point)
      & 0,                                                           & 
!number of ghost points accessible to local vectors
      & PETSC_NULL_INTEGER,                                          & 
!could be an array to specify the number of grid points per processor
      & da,                                                          & 
!the resulting distributed array object
      &     ierr)

call DMDAGetCorners(da,       & !the distributed array
      &   xs,                   & !corner index in x direction
      &   PETSC_NULL_INTEGER,        & !corner index in y direction
      &   PETSC_NULL_INTEGER,        & !corner index in z direction
      &   xm,                   & !width of locally owned part in x 
direction
      &   PETSC_NULL_INTEGER,        & !width of locally owned part in y 
direction
      &   PETSC_NULL_INTEGER,        & !width of locally owned part in z 
direction
      &   ierr)                        !error check



       one  = 1.0


!set indices of matrix rows to be set
       Do i = xs,xs+xm-1
          row(i) = i
       END DO


!Set up vector X and Matrix A
       call DMCreateGlobalVector(da,X,ierr)
       call VecSet(X,one,ierr)      !set all entries of global array to 1
       call VecGetArrayF90(X,X_pointer,ierr)

       call 
MatCreateDense(PETSC_COMM_WORLD,PETSC_DECIDE,PETSC_DECIDE,n,m,PETSC_NULL_CHARACTER,A,ierr) 

       call 
MatSetValues(A,xm,row(xs:xs+xm-1),1,0,X_pointer(1:xm),INSERT_VALUES,ierr)
       call MatAssemblyBegin(A,MAT_FINAL_ASSEMBLY,ierr)
       call MatAssemblyEnd(A,MAT_FINAL_ASSEMBLY,ierr)


!Set up vector Y and matrix B
       call DMCreateGlobalVector(da,Y,ierr)
       call VecSet(Y,2.d0*one,ierr)      !set all entries of global 
array to 2
       call VecGetArrayF90(Y,Y_pointer,ierr)

       call 
MatCreateDense(PETSC_COMM_WORLD,PETSC_DECIDE,PETSC_DECIDE,n,m,PETSC_NULL_CHARACTER,B,ierr) 

       call 
MatSetValues(B,xm,row(xs:xs+xm-1),1,0,Y_pointer(1:xm),INSERT_VALUES,ierr)
       call MatAssemblyBegin(B,MAT_FINAL_ASSEMBLY,ierr)
       call MatAssemblyEnd(B,MAT_FINAL_ASSEMBLY,ierr)


!print out matrices and vectors to check entries
       call VecView(X,PETSC_VIEWER_STDOUT_WORLD,ierr)
       call VecView(Y,PETSC_VIEWER_STDOUT_WORLD,ierr)
       call MatView(A,PETSC_VIEWER_STDOUT_WORLD,ierr)
       call MatView(B,PETSC_VIEWER_STDOUT_WORLD,ierr)

!free objects
       call VecRestoreArrayF90(X,X_pointer,ierr)
       call VecDestroy(X,ierr)
       call MatDestroy(A,ierr)
       call VecRestoreArrayF90(Y,Y_pointer,ierr)
       call VecDestroy(Y,ierr)
       call MatDestroy(B,ierr)


       call PetscFinalize(ierr)
end



Am I doing something wrong in my code?
Thank you for your help!
Jonas









More information about the petsc-users mailing list