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