Ошибки METIS Seg при запуске из Фортрана
я пытаюсь использоватьMETIS библиотека для разбиения сетки как часть программы на Фортране I 'мы написали для конечно-элементных вычислений. METIS написан на С, но этоПредполагается, что он отлично работает с Fortran 90. Но я продолжаю получать ошибки сегмента.
Один потенциальный сбой заключается в том, что есть несколько аргументов, к которым яЯ даю нулевые указатели. У некоторых других людей возникли проблемы с получением вызова C-функции из Фортрана для распознавания объекта с нулевым указателем. Это было адресованоВот и я нене думаю, чтоэто вопрос, который яЯ имею.
Я думаю, что проблема в том, чтобы заставить METIS изменить индекс начального массива; в C это 'с 0, в Фортране это 'с 1. Там 'сoptions
массив передается каждой функции, которая должна иметь полеMETIS_OPTION_NUMBERING
что вы измените на1
если вы хотите конвенцию Фортрана. Невыполнение этого требования может привести к тому, что программы на Си попытаются получить доступ к индексу 0, что приведет к ошибке seg.
Сообщение от edunlop1Вот предполагает, что я просто делаю массивoptions
и некоторое согласованное соглашение с METIS определяет, какой элемент этого массива должен быть установлен в 1, чтобы он все нумеровал нумерацию. Но что это меняет в зависимости от того, какой рутиной выиспользуется, как и длина массива.
Во всяком случае, здесьмой код:
integer :: ndomains,ncommon,objval
integer :: options(0:40)
integer, dimension(:), allocatable :: eptr,eind
integer, pointer :: vwgt(:)=>null(), vsize(:)=>null(), opts(:)=>null()
real(kind=8), pointer :: tpwgts(:)=>null()
! Read in the mesh data
call getarg(1,meshname)
call readmesh(meshname)
allocate(color(ne),domain(nn))
allocate(eind(3*ne),eptr(ne+1))
do n=1,ne
eptr(n) = 1+3*(n-1)
do i=1,3
eind( eptr(n)+i-1 ) = elem(i,n)
enddo
enddo
! Try and call METIS
ncommon = 2
ndomains = 2
options = 0
options(0) = 1
options(8) = 1
call METIS_PartMeshDual(ne,nn,eptr,eind,vwgt,vsize, &
& ncommon,ndomains,tpwgts,options,objval,color,domain)
Соответствующий код в METIS для изменения нумерации находится в файле libmetis / meshpart.c:
/* renumber the mesh */
if (options && options[METIS_OPTION_NUMBERING] == 1) {
ChangeMesh2CNumbering(*ne, eptr, eind);
renumber = 1;
}
Какие-нибудь мысли? Я могу опубликовать вывод Valgrind, если это 'полезно