Использование f2py в коде Fortran, связанном с PETSc

Мой вопрос связан с этим постом:

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

в котором постер пытался скомпилировать код Fortran (Test.f90) с помощью f2py и связать его с предварительно скомпилированной библиотекой (или, в моем случае, с объектом, myex44f.o). Ответ позволил мне скомпилировать код Fortran и сгенерировать модуль Python.

Моя проблема отличается от описанной выше проблемы с плакатами тем, что мой объект связан с PETSc. Когда я пытаюсь импортировать мою библиотеку, сгенерированную f2py, в python, я получаю сообщение об ошибке, что она не может найти «VecDestroy», подпрограмму PETSc. Моя последняя попытка была:

f2py -c --fcompiler=gfortran -I. myex44f.o ../../../Коды/третья_сторона/petsc/include/petsc/finclude/petscdef.h -m test Test.f90

Вот код Test.f90:

subroutine test  
USE petsctest  
call mainsub  
end subroutine test

который вызывает mainsub из модуля petsctest:

      module petsctest   !   Solves the linear system  J x = f
#include <petsc/finclude/petscdef.h>
      contains
      subroutine mainsub
      use petscksp; use petscdm
      Vec x,f
      Mat J
      DM da
      KSP ksp
      PetscErrorCode ierr
      call PetscInitialize(PETSC_NULL_CHARACTER,ierr)

      call DMDACreate1d(MPI_COMM_WORLD,DM_BOUNDARY_NONE,8,1,1,        &
     &  PETSC_NULL_INTEGER,da,ierr)
      call DMCreateGlobalVector(da,x,ierr)
      call VecDuplicate(x,f,ierr)
      call DMSetMatType(da,MATAIJ,ierr)
      call DMCreateMatrix(da,J,ierr)

      call ComputeRHS(da,f,ierr)
      call ComputeMatrix(da,J,ierr)

      call KSPCreate(MPI_COMM_WORLD,ksp,ierr)
      call KSPSetOperators(ksp,J,J,ierr)
      call KSPSetFromOptions(ksp,ierr)
      call KSPSolve(ksp,f,x,ierr)

      call MatDestroy(J,ierr)
      call VecDestroy(x,ierr)
      call VecDestroy(f,ierr)
      call KSPDestroy(ksp,ierr)
      call DMDestroy(da,ierr)
      call PetscFinalize(ierr)
      end

Ошибка, которую я получаю:

import test Traceback (последний последний вызов): Файл "", строка 1, в ImportError: ./test.so: неопределенный символ: vecdestroy_

У кого-нибудь есть предложения? Большое спасибо за любую помощь, которую вы можете мне оказать.

ОБНОВЛЕНИЕ: я сгенерировал исходный объект myex44f.o, используя make-файл, прилагаемый к примерам PETSc. Глядя на строку ссылок, я подумал, что мне может понадобиться связать библиотеку petsc при компиляции с помощью f2py. Моя текущая попытка:

f2py -c --fcompiler=gfortran -m test Test.f90 -I. myex44f.o -I/home/costoich/Documents/AFPWork/Codes/third_party/petsc/include -I/home/costoich/Documents/AFPWork/Codes/third_party/petsc/arch-linux2-c-debug/include -L/home/costoich/Documents/AFPWork/Codes/third_party/petsc/arch-linux2-c-debug/lib -lpetsc

Кажется, это правильно связывается на этапах компиляции (если я просто напишу -lpetsc без пути, компилятор выйдет из строя). Однако, когда я набираю ldd test.so, я получаю:

linux-vdso.so.1 => (0x00007ffe09886000) libpetsc.so.3.7 => not found libgfortran.so.3 => /usr/lib/x86_64-linux-gnu/libgfortran.so.3 (0x00007fc315be5000) libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fc31581b000) libquadmath.so.0 => /usr/lib/x86_64-linux-gnu/libquadmath.so.0 (0x00007fc3155dc000) libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007fc3152d3000) libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007fc3150bc000) /lib64/ld-linux-x86-64.so.2 (0x000055a3fad27000)

Нужно ли использовать два флага ссылок Wl,rpath? f2py, кажется, не понимает этого. Спасибо за любые комментарии.

РЕШЕНО Проблема найдена. Я не могу заставить f2py принять параметры -Wl,rpath, но если я определю переменную среды LD_LIBRARY_PATH=/home/costoich/Documents/AFPWork/Codes/third_party/petsc/arch-linux2-c-debug/lib, все получится. Спасибо за помощь.


person costoich    schedule 20.10.2016    source источник
comment
Вы должны показать имеющуюся у вас информацию, шаги, ведущие к сообщению об ошибке, и само сообщение об ошибке. Также подходит некоторый код.   -  person Vladimir F    schedule 21.10.2016
comment
Отредактируйте вопрос и поместите туда код. Не забудьте сообщение об ошибке с командой, которая его создала.   -  person Vladimir F    schedule 21.10.2016
comment
Еще раз спасибо @VladimirF. Я отредактировал пост, правда все равно не правильно сделал, думаю немного понятнее. Я ценю совет.   -  person costoich    schedule 21.10.2016
comment
Похоже, что VecDestrou не находится в используемом вами модуле PETSC.   -  person Vladimir F    schedule 21.10.2016
comment
Вы можете запустить код только на Фортране без f2py?   -  person Vladimir F    schedule 21.10.2016
comment
модули и f2py обычно плохо сочетаются друг с другом. Я рекомендую написать оболочку, чтобы ваш модуль был доступен только вашему компилятору fortran, а не f2py.   -  person Mohammed Li    schedule 21.10.2016
comment
Это неправда, они работают нормально.   -  person Vladimir F    schedule 21.10.2016
comment
@VladimirF, код работает на Фортране. Это было хорошее предложение.   -  person costoich    schedule 23.10.2016


Ответы (1)


@VladimirF, имеет смысл.

Похоже, что VecDestrou не находится в используемом вами модуле PETSC.

Мне кажется, что в вашем модуле необходимы следующие части PETSc.

#include <petsc/finclude/petscsysdef.h>
#include <petsc/finclude/petscvecdef.h>
! Optional
#include <petsc/finclude/petscdef.h>
#include <petsc/finclude/petscdm.h>
#include <petsc/finclude/petscvec.h> 
#include <petsc/finclude/petscvec.h90>  
#include <petsc/finclude/petscmat.h>
#include <petsc/finclude/petscmat.h90>
! might be not completed
! Or
use petscksp
use petscdm
use petscvec
use petscmat 
!might be not completed

Как использовать PETSc с Fortran, обсуждается здесь, лично я выбираю вариант 2 на этой странице. Большинство существующих примеров PETSc также следуют варианту 2.

Позвольте мне уточнить, что я не призываю вас использовать include вместо use, так Я привык делать только. В документации PETSc есть пример использования модулей Fortran, например здесь. Таким образом, вы можете выбрать любой из этих методов или иметь оба опционально (пожалуйста, обратите внимание, что опция препроцессора в этом примере, PETSC_USE_FORTRAN_MODULES), но все равно нужно добавить необходимые модули, зависит от того, что вы используете.

person trblnc    schedule 23.10.2016