I recently got a copy of E.Bueler's petsc book and was converting the
programs to fortran for my students and have run into a compile error that
I can not figure out.  I comment out the MatSetValues line the code compiles fine.

When I run make on vecmatkspf.F90, I get the error:

       42 | PetscCallA(MatSetValues(A,1,i,4,j,aA,INSERT_VALUES,ierr))
          | 1
   Error: There is no specific subroutine for the generic
   'matsetvalues' at (1)

My petsc set works, runs with my FEA code and compiles and runs the fortran
programs in the petsc tutorials directories just fine.  And in particular, compiles
and runs the C versions from Bueler.

I've attached the make file and the source.  I must be doing something obviously wrong but I can not spot it.

-sanjay

--

! Fortran version of vecmatksp.c

program vecmatkspf
#include <petsc/finclude/petscksp.h>

    use petscksp
    use petscmat

    Vec       ::  x, b
    Mat       ::  A
    KSP       ::  ksp

    PetscInt  ::  i, j(4) 
    PetscReal ::  ab(4),aA(4,4)

    PetscErrorCode :: ierr

    data j  /0,1,2,3/
    data ab /7.0, 1.0, 1.0, 3.0/
    data aA /1.0, 2.0, -1.0, 0.0, &
             2.0, 1.0,  1.0, 1.0, &
             3.0, -2.0, 1.0, 1.0, &
             0.0, -3.0, 0.0, -1.0/


    PetscCallA(PetscInitialize(PETSC_NULL_CHARACTER,"Solve a 4x4 linear system 
using KSP.\n",ierr))

    PetscCallA(VecCreate(PETSC_COMM_WORLD,b,ierr))
    PetscCallA(VecSetSizes(b,PETSC_DECIDE,4,ierr))
    PetscCallA(VecSetFromOptions(b,ierr))

    PetscCallA(VecSetValues(b,4,j,ab,INSERT_VALUES,ierr))
    PetscCallA(VecAssemblyBegin(b,ierr))
    PetscCallA(VecAssemblyEnd(b,ierr))

    PetscCallA(MatCreate(PETSC_COMM_WORLD,A,ierr))
    PetscCallA(MatSetSizes(A,PETSC_DECIDE,PETSC_DECIDE,4,4,ierr))
    PetscCallA(MatSetFromOptions(A,ierr))
    PetscCallA(MatSetUp(A,ierr))

    do i = 0,3 
      PetscCallA(MatSetValues(A,1,i,4,j,aA,INSERT_VALUES,ierr))
    end do 

    PetscCallA(MatAssemblyBegin(A,MAT_FINAL_ASSEMBLY,ierr))
    PetscCallA(MatAssemblyEnd(A,MAT_FINAL_ASSEMBLY,ierr))

    PetscCallA(KSPCreate(PETSC_COMM_WORLD,ksp,ierr))
    PetscCallA(KSPSetOperators(ksp,A,A,ierr))
    PetscCallA(KSPSetFromOptions(ksp,ierr))

    PetscCallA(VecDuplicate(b,x,ierr))

    PetscCallA(KSPSolve(ksp,b,x,ierr))

    PetscCallA(VecView(x,PETSC_VIEWER_STDOUT_WORLD,ierr))

    PetscCallA(KSPDestroy(ksp,ierr))
    PetscCallA(MatDestroy(A,ierr))
    PetscCallA(VecDestroy(x,ierr))
    PetscCallA(VecDestroy(b,ierr))
    PetscCallA(PetscFinalize(ierr))

end program vecmatkspf
include ${PETSC_DIR}/lib/petsc/conf/variables
include ${PETSC_DIR}/lib/petsc/conf/rules

CFLAGS += -pedantic -std=c99

sparsemat: sparsemat.o
        -${CLINKER} -o sparsemat sparsemat.o  ${PETSC_LIB}
        ${RM} sparsemat.o

vecmatksp: vecmatksp.o
        -${CLINKER} -o vecmatksp vecmatksp.o  ${PETSC_LIB}
        ${RM} vecmatksp.o

vecmatkspf: vecmatkspf.o
        -${FLINKER} -o vecmatkspf vecmatkspf.o ${PETSC_FORTRAN_LIB} ${PETSC_LIB}
        ${RM} vecmatkspf.o

tri: tri.o
        -${CLINKER} -o tri tri.o  ${PETSC_LIB}
        ${RM} tri.o

loadsolve: loadsolve.o
        -${CLINKER} -o loadsolve loadsolve.o  ${PETSC_LIB}
        ${RM} loadsolve.o

# testing
runsparsemat_1:
        -@../testit.sh sparsemat "-mat_view" 1 1

runvecmatksp_1:
        -@../testit.sh vecmatksp "" 1 1

runtri_1:
        -@../testit.sh tri "-a_mat_view ::ascii_dense" 1 1

runtri_2:
        -@../testit.sh tri "-tri_m 1000 -ksp_rtol 1.0e-4 -ksp_type cg -pc_type 
bjacobi -sub_pc_type jacobi -ksp_converged_reason" 2 2

runloadsolve_1:
        -@./tri -ksp_view_mat binary:A.dat -ksp_view_rhs binary:b.dat > 
/dev/null
        -@../testit.sh loadsolve "-verbose -fA A.dat -fb b.dat -ksp_view_mat 
-ksp_view_rhs -ksp_view_solution" 1 1

test_sparsemat: runsparsemat_1

test_vecmatksp: runvecmatksp_1

test_tri: runtri_1 runtri_2

test_loadsolve: runloadsolve_1

test: test_sparsemat test_vecmatksp test_tri test_loadsolve

# etc

.PHONY: clean distclean runvecmatksp_1 runtri_1 runtri_2 runloadsolve_1 test 
test_vecmatksp test_tri test_loadsolve

distclean: clean

clean::
        @rm -f *~ sparsemat vecmatksp tri loadsolve *tmp
        @rm -f *.dat *.dat.info

Reply via email to