Ошибки 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, если это 'полезно

Ответы на вопрос(3)

Ваш ответ на вопрос