[petsc-users] Getting a matrix into PETSc

Alexis Morris amorris at mtroyal.ca
Mon Sep 27 17:10:56 CDT 2010


Hi everyone,

    I am new to PETSc, and am really excited about using it in 
combination with SLEPc to find the eigenvalues of a large hermitian 
sparse matrix.  I have read through the user manual, and one thing is 
really confusing me: how do I get my matrix into PETSc?

My code is organized into separate modules (I am using Fortran).  One of 
the modules calculates my matrix H and stores it in a compressed sparse 
row format.  I would like to then call from my main program an 
eigenvalue subroutine and pass the matrix H to it.   In this eigenvalue 
subroutine, I would use PETSc/SLEPc.  How do I get it to use my 
pre-calculated matrix?

For example, here is some code for my eigenvalue subroutine.  In this 
particular problem, my input matrix is just stored in the regular full 
matrix format so that I could more easily test the routine.

subroutine eigen(A)
#include "finclude/petscdef.h"
#include "finclude/slepcepsdef.h"
    use slepceps
    use kinds_module  !Contains data type definitions, like r8=double 
precision real.
    implicit none
    real (kind=r8), dimension(:,:), intent(in) :: A

! local variables

     PetscErrorCode :: ierr
     PetscMPIInt :: N            ! Size of A
     PetscMPIInt :: nconv    ! number of converged eigenpairs
     Mat :: A_PETSC            ! The PETSc equivalent of my input A


! Get size of A

     N = size(A, dim=1)

! Get my matrix into SLEPc.

     call SlepcInitialize(PETSC_NULL_CHARACTER,ierr); CHKERRQ(ierr)

< This is where I don't know what to do >
< How to I do A_PETSC = A>

     call MatAssemblyBegin(A_PETSC,MAT_FINAL_ASSEMBLY,ierr)
     call MatAssemblyEnd(A_PETSC,MAT_FINAL_ASSEMBLY,ierr)

! Find eigenpairs with SLEPc

     EPSCreate( PETSC_COMM_WORLD, eps, ierr)
     EPSSetOperators( eps, A_PETSC, PETSC_NULL )
     EPSSetProblemType( eps, EPS_HERMITIAN );
     EPSSetFromOptions( eps );
     EPSSolve( eps );
     EPSGetConverged( eps, nconv );
     ...
     EPSDestroy( eps );

     call SlepcFinalize(ierr)
     end subroutine eigen


Another thing I am confused about: my main program uses the usual 
fortran data types.  Should I worry about these clashing with the PETSc 
ones like PetscMPIInt, Vec, Mat, etc.?

I apologize if these things have already been discussed at length.  I 
have been searching the internet and this mailing list, and can't seem 
to find anything about getting a matrix into PETSc.  I appreciate any help.

Best regards,
Alexis


-- 
Dr Alexis Morris
Assistant Professor
Department of Mathematics, Physics and Engineering
Mount Royal University
4825 Mount Royal Gate SW
Calgary, Alberta, Canada
T3E 6K6
Phone: (403) 440-8507
Fax: (403) 440-6505



More information about the petsc-users mailing list