Как я могу вызвать код Python из кода FORTRAN? - PullRequest
0 голосов
/ 14 января 2019

Я написал код на Python для моделирования структуры в Abaqus. Я проверил это с помощью abaqus cae noGUI=mycode.py в командном окне (так вызывается Abaqus для запуска этого кода). Работает полностью. Я также написал UMAT код на abaqus (на Фортране). Мне нужно вызвать код Python в этом UMAT коде.

Я использовал st=system('abaqus cae noGUI=mycode.py'), а st - целое число. Тем не менее, код Python не называется. Я создал командный файл, в котором я написал abaqus cae noGUI=mycode.py. Я вызвал этот файл в UMAT по st=system('code.bat') и получил ошибку, что code.bat не распознан как внутренняя или внешняя команда, работающая программа или пакетный файл.

1 Ответ

0 голосов
/ 19 января 2019

Выполнение скрипта Python Abaqus / CAE или даже вызов встроенного интерпретатора Python из подпрограммы Fortran, безусловно, может быть выполнено. Я нашел это очень полезным в определенных крайних случаях, с оговорками. Используйте с осторожностью .

Вы, кажется, на правильном пути, однако вы должны помнить, чтобы использовал полный путь к файлу для всех внешних файлов, указанных в подпрограмме Abaqus. Вы найдете полезными подпрограммы Abaqus getjobname и getoutdir. Вот пример скелета, с несколькими определениями переменных:

use ifport, only: system, ierrno    !! Note: `USE` must come before any `INLCUDE`

character(len=256)                  :: outdir, jobname
character(len=:), allocatable       :: cwd, cmd
integer                             :: jobnamelen, outdirlen, rc, errnum

call getjobname(jobname, jobnamelen)
call getoutdir(outdir, outdirlen)
cwd = outdir(1:outdirlen)
cmd = 'abaqus cae nogui=' // cwd // '/my_script.py' 

rc = system(cmd)
if (rc .eq. -1) then
  errnum = ierrno( )
  print *, 'Error: ', errnum
endif

Примечания:

1. Если полный путь не указан, Abaqus будет предполагать, что внешние файлы существуют / будут созданы в директории нуля. Обычно это не то же самое, что текущий рабочий каталог.

2. Приведенный выше фрагмент кода был успешно протестирован с использованием uexternaldb и универсального Python-скрипта в стиле «hello world».

3. Если вы используете ifort 17 или новее (и если вам это нужно), вы также сможете заменить функции переносимости ifport на встроенную в Fortran 2008 execute_command_line.

4. Вы можете использовать пакетный файл, однако, пакетный файл (а также скрипт Python, упомянутый в пакетном файле) должен по-прежнему иметь полный путь к файлу.

...