如何从FORTRAN代码中调用python代码?

时间:2019-01-14 10:23:05

标签: python fortran abaqus

我已经编写了一个python代码,用于在Abaqus中对结构进行建模。我已经在命令窗口中通过abaqus cae noGUI=mycode.py进行了检查(这就是调用Abaqus来运行该代码的方式)。它完全可以工作。我还用abaqus(在Fortran中)编写了UMAT代码。我需要在该UMAT代码中调用Python代码。

我使用了st=system('abaqus cae noGUI=mycode.py'),而st是一个整数。但是,未调用python代码。我创建了一个批处理文件,其中写了abaqus cae noGUI=mycode.py。我用st=system('code.bat')在UMAT中调用了该文件,但收到一个错误,指出code.bat无法识别为内部或外部命令,可操作程序或批处理文件。

1 个答案:

答案 0 :(得分:1)

从Fortran子例程运行Abaqus / CAE Python脚本,甚至调用内置的Python解释器,当然可以完成。我发现它在某些带有警告的边缘情况下非常有用。 谨慎使用

您似乎走在正确的轨道上,但是您必须记住对Abaqus子例程中指定的所有外部文件使用完整文件路径。 您会发现Abaqus实用程序子例程getjobnamegetoutdir很有用。这是一个准系统示例片段,其中包含一些变量定义:

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和通用的“ hello world”样式的Python脚本成功进行了测试。

3。如果您使用的是ifort 17或更高版本(如果需要),还应该可以将ifport的可移植性功能替换为Fortran 2008固有的execute_command_line

4。您可以使用批处理文件,但是,该批处理文件(以及批处理文件中提到的Python脚本)仍必须具有完整的文件路径。