gpt4 book ai didi

c - 在 Fortran 代码中使用 Metis 库...基础知识

转载 作者:行者123 更新时间:2023-11-30 17:44:27 33 4
gpt4 key购买 nike

如果这有点多余,我提前道歉,我已经查看了其他引用 Metis 与 Fortran 代码的帖子。另外我是个菜鸟,所以请用小词慢慢说! :p

我正在尝试使用 Metis 5.1.0 在我编写的 Fortran 代码中对网格进行分区。我想知道通过调用 c 库来编译 fortran 代码的基础知识?我怎么做?这是在编译时完成的还是我需要在代码中包含某种包含语句?目前,当我尝试编译时,我有以下相关片段:

程序的顶部(我是否需要包含或使用语句?)

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}
<小时/>

调用metis分区相关的子程序(使用直接调用)

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 文件是错误的,但我想知道为什么当我引用 metis 需要的 c 库时,为什么它会给我 c 库的错误,当我的代码和所有内容都“生活”在同一个中时文件夹作为metis库meshpart.c。正确安装的metis是否没有正确链接或引用其库和必要组件?

感谢任何人可以提供的帮助!再次感谢您的耐心等待,我知道这是一个非常基本的问题。

最佳答案

什么是meshpart.c?您应该能够直接从 Fortran 调用 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

希望有帮助。

关于c - 在 Fortran 代码中使用 Metis 库...基础知识,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20006253/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com