Прежде чем найти ответ на вопрос, который я задал раньше , я написал очень простой код для очень похожей сетки (есть только два треугольника), как показано ниже, для вызова функции C в фортране. Для простоты кода. Здесь не используется ни интерфейсный модуль, ни iso_c_binding (насколько это возможно). Это очень похоже на этот пост. Есть еще одна ошибка.
program METIS_NoInterface
implicit none
integer :: ne, nn
integer, dimension(:), allocatable :: eptr, eind
integer, pointer :: vwgt=>null(), vsize=>null()
integer :: nparts
real, pointer :: tpwgts=>null()
integer, dimension(0:39) :: opts
integer :: objval
integer, dimension(:), allocatable :: epart, npart
! Input => 2 tri: too small mesh
!ne = 2
!nn = 4
!nparts = 2
!allocate(eptr(0:2), eind(0:5))
!eptr=[0, 3, 4]
!eind=[0,1,3,1,2,3]
! Output
!allocate(epart(0:1), npart(0:4))
! Input => 4 quad : reasonable result
ne = 4
nn = 9
nparts = 2
allocate(eptr(0:ne), eind(0:15))
eptr=[0,4,8,12,16]
eind=[0,1,8,7,1,2,3,8,3,4,5,8,5,6,7,8]
! Output
allocate(epart(0:ne-1), npart(0:nn-1))
! METIS function call
call METIS_SetDefaultOptions(opts)
!call METIS_PartMeshNodal(ne,ne,eptr,eind,vwgt,vsize,nparts,tpwgts,& !<=syntax error
call METIS_PartMeshNodal(ne,nn,eptr,eind,vwgt,vsize,nparts,tpwgts,&
opts,objval,epart,npart)
! Result print
write(*,*) epart
write(*,*) ''
write(*,*) npart
write(*,*) ''
end program
Выдает ошибку нарушения прав доступа из-за eind. Он запускается в любом случае, если вместо eind передается c_null_ptr. Размер массива eind и количество элементов совпадают. Как это можно исправить? => решено. Спасибо!
Проблема, с которой я столкнулся, заключалась в системной ошибке при вызове METIS_PartMeshNodal, 2-й аргумент был ne, который совпадает с 1-м аргументом ne. Это должно было быть nn.
Решение состояло в том, чтобы заменить второй аргумент на nn. Приведенный выше код может быть скомпилирован и выполнен.
ПРИМЕЧАНИЕ. Слишком маленькая сетка может не иметь разумного решения из-за схемы METIS.
Пожалуйста, обратитесь к другому post для использования интерфейсного модуля.
ne
иnn
? В частности, массивыeptr
иeind
имеют размер 3 и 6, но ни одна из ваших скалярных переменных, которые вы передаете функции, не содержит таких значений. - person Bálint Aradi   schedule 07.02.2013epart
=[0, 0]
иnpart
=[0, 0, 1, 1, 0]
(то есть сnn
, переданным в качестве второго аргумента). - person sigma   schedule 07.02.2013opts(7)=1
или без него. Я бы еще советовал использовать интерфейсный блок, который должен предупреждать о том, что дефолтное реальноеtpwgts
не совпадает сc_double
. - person sigma   schedule 11.02.2013