Использование библиотек Metis в Fortran Code... основы

Я заранее прошу прощения, если это несколько избыточно, я рассмотрел другие посты, которые ссылаются на использование Metis с кодом Fortran. Кроме того, я очень нуби, поэтому, пожалуйста, используйте маленькие слова и говорите их медленно!:п

Я пытаюсь использовать Metis 5.1.0 для разбиения меша в написанном мною коде Фортрана. Я задаюсь вопросом об основах компиляции кода на Fortran с вызовами библиотек c? Как я могу это сделать? Это делается во время компиляции или мне нужно что-то вроде включения в коде? В настоящее время, когда я пытаюсь скомпилировать, у меня есть следующие соответствующие фрагменты:

Верхняя часть программы (мне даже нужно иметь оператор включения или использования?)

PROGRAM ONEDGRIDGEN
IMPLICIT NONE
!include 'meshpart.c'
!use 'meshpart.c'

Makefile (в котором я уверен, что есть ошибки)

CC = gcc
FC = gfortran
FCFLAG1 = -g -fbacktrace -ffree-line-length-0 -fdefault-real-8
FCFLAG2 =
CCFLAG  =
OBJ   = 1Dgridgen_Mod
OBJ2  = meshpart

1Dgridgen: ${OBJ}.f95
        ${FC} -o ${OBJ} ${OBJ}.f95 ${OBJ2}.c ${FCFLAG1}

Подпрограмма, относящаяся к вызову разделения метисов (используя прямой вызов)

SUBROUTINE METIS_CALL(ne,nn,eptr,eind)
use iso_c_binding
IMPLICIT NONE

integer(c_int),INTENT(IN):: ne,nn
integer(c_int)::nparts,objval,ncommon 
integer(c_int),dimension(0:((nn)*2-1)),INTENT(IN)::eind
integer(c_int),dimension(nn),INTENT(IN)::eptr
integer(c_int),dimension(:),allocatable::epart,npart 
integer,pointer::vwgt=>null(), vsize=>null(), options=>null() 
real(kind=8),pointer::tpwgts=>null()       

ALLOCATE(epart(ne),npart(nn))
ncommon = 1

write(*,*) 'How many domains do you wish to have?'
read(*,*) nparts

CALL METIS_PartMeshDual(ne,nn,eptr,eind,vwgt,vsize,ncommon,nparts,tpwgts,options,objval,epart,npart)

write(*,*) 'epart', epart
write(*,*) 'npart', npart


END SUBROUTINE METIS_CALL

Когда я пытаюсь скомпилировать, я получаю следующую ошибку

gfortran -o 1Dgridgen_Mod 1Dgridgen_Mod.f95 meshpart.c -g -fbacktrace -ffree-line-length-0 -fdefault-real-8
cc1: warning: command line option "-fbacktrace" is valid for Fortran but not for C
cc1: warning: command line option "-ffree-line-length-0" is valid for Fortran but not for C
cc1: warning: command line option "-fdefault-real-8" is valid for Fortran but not for C
In file included from meshpart.c:15:
metislib.h:17:19: error: GKlib.h: No such file or directory
metislib.h:24:19: error: metis.h: No such file or directory
metislib.h:25:20: error: rename.h: No such file or directory
metislib.h:26:24: error: gklib_defs.h: No such file or directory
metislib.h:28:18: error: defs.h: No such file or directory
metislib.h:29:20: error: struct.h: No such file or directory
metislib.h:30:20: error: macros.h: No such file or directory
metislib.h:31:19: error: proto.h: No such file or directory
meshpart.c:22: error: expected ')' before '*' token
meshpart.c:90: error: expected ')' before '*' token
meshpart.c:179: error: expected ')' before 'nrows'
make: *** [1Dgridgen] Error 1

Я вижу, что мой make-файл неверен, но мне интересно, почему, когда я ссылаюсь на нужную мне библиотеку c из metis, она дает мне ошибки для библиотеки c, когда мой код и все "живет" в той же папке, что и библиотека метисов meshpart.c. Правильно ли установлен metis, если бы его библиотеки и необходимые компоненты не были связаны или на них не ссылались?

Спасибо за любую помощь, которую может предложить любой!! И еще раз спасибо за ваше терпение. Я понимаю, что это довольно простой вопрос.

1 ответ

Что такое meshpart.c? Вы должны иметь возможность звонить в METIS напрямую из Фортрана. METIS также имеет подпрограмму, которая может напрямую разделять сетку. Вот пример:

program test
  implicit none
  integer, parameter   :: nels=2, nnds=6, npel=4
  integer              :: eptr(nels+1), nodes(nels*npel), epart(nels), npart(nnds), n
  integer, pointer     :: vwgt=>null(), vsize=>null(), mopts=>null()
  real(8), pointer     :: tpwgts=>null()
  eptr=(/0,4,8/)
  nodes=(/0,1,2,3,1,4,5,2/) ! Element 1 has nodes 0 1 2 3
                            ! Element 2 has nodes 1 4 5 2
  call METIS_PartMeshNodal(nels,nnds,eptr,nodes,vwgt,vsize,2,tpwgts,mopts,n,epart,npart) 
  print*, npart; print*, epart
end program test

И вот вывод:

[stali@submit libmetis]$ gfortran test.f90 libmetis.a 
[stali@submit libmetis]$ ./a.out 
       0           0           1           0           1           1
       0           1

Надеюсь, это поможет.

Другие вопросы по тегам