如何使用 Abaqus、Python 和 Fortran(混合语言编程)运行 自定义计算程序?
How can I run a custom calculating procedure using Abaqus, Python and Fortran(mix-language programing)?
提前致谢!
我是 python 和混合语言编程方面的新手。
我的开发环境是Abaqus6.13(with python 2.6.2)
+MSVS2012
+inter Fortran 2013SP1
(我想用IMSL
),在Windows 7
。我的最终目的是在 Abaqus
中开发一个 GUI 插件 可以 运行 仅取决于 新安装的 Abaqus
.
我要做的事情排序如下:
- 在
Abaqus
中进行模态分析;
- GUI 插件 从modalResult.odb 中得到上述结果并将它们传输到 自定义计算模块中写在
Fortran
;
- GUI插件将计算结果转入另一个Abaqus odb;
最重要的是,我想用python
作为Abaqus
和Fortran
的粘合剂,我不知道如何传递变量(也许它们只是整数或浮点数和one/two维度数组)。
那么,我该如何解决这个问题?或者谁有类似经验可以给我一些建议?非常感谢。
我的失败经历:
f2py
:因为我在Win7
上工作,我发现如果选择f2py
,Abaqus python发行版中的文件必须修改,这与开发 新安装的 Abaqus
的目的背道而驰。
ctypes
+Dynamic linking library
:我使用 Fortran
检查以下代码生成 test.dll 并从 python
,它们 运行 在 python3.6
中很好,但是当我检查使用 Abaqus(python2.6)
时,它出错了 OSError: exception: access violation reading 0xxxxxx
.
Fortran
test.dll代代码:
module F90Module
use,intrinsic::iso_c_binding
implicit none
contains
subroutine fun_in_fortran(arr,nucle_num,n1,n2)
!dec$ attributes dllexport,decorate,alias:"fun_in_fortran" :: fun_in_python
integer(kind=c_int),intent(in),value::n1,n2,nucle_num
integer(kind=c_int),intent(out),dimension(n1,n2)::arr
xxxxxxxxxxxxxx
end subroutine fun_in_fortran
end module F90Module
Python
中的回调(另存为t.py):
#! /usr/bin/env python
#coding=utf-8
import numpy as np
from numpy.ctypeslib import load_library,ndpointer
from ctypes import *
# shape of 2d array
n1,n2 = 10,10
n3=3
# create an empty 2d array
data = np.zeros(shape=(n1,n2),dtype='int64',order='f')
flib = load_library("test.dll","./")
flib.argtypes = [ndpointer(dtype='int64',ndim=2),c_int,c_int,c_int]
flib.fun_in_python(data.ctypes.data,n3,n1,n2)
print "*"*80
print data
PS: 又查了一下问题,一头雾水。。好像是在Abaqus CAE
的运行时间。但是我真的不知道如何解决它。
在window终端中,当我使用abaqus python t.py
时,一切顺利。但是我想在Abaqus CAE
中做这个计算过程,所以我测试了命令abaqus cae noGui=t.py
,出现错误,如下:
Abaqus License Manager checked out the following license(s):
"cae" release 6.13 from zhouhongwei
<1023 out of 1024 licenses remain available>.
WindowsError: exception: access violation reading 0X000007FF080BA0A0
File "t.py" ,line 13, in <module>
flib.rand_nucle<data.ctypes.data,n3,nl,n2>
Abaqus Error: cae exited with an error
通过将 Abaqus 从 6.13 更新到 6.14,代码有效!
提前致谢!
我是 python 和混合语言编程方面的新手。
我的开发环境是Abaqus6.13(with python 2.6.2)
+MSVS2012
+inter Fortran 2013SP1
(我想用IMSL
),在Windows 7
。我的最终目的是在 Abaqus
中开发一个 GUI 插件 可以 运行 仅取决于 新安装的 Abaqus
.
我要做的事情排序如下:
- 在
Abaqus
中进行模态分析; - GUI 插件 从modalResult.odb 中得到上述结果并将它们传输到 自定义计算模块中写在
Fortran
; - GUI插件将计算结果转入另一个Abaqus odb;
最重要的是,我想用python
作为Abaqus
和Fortran
的粘合剂,我不知道如何传递变量(也许它们只是整数或浮点数和one/two维度数组)。
那么,我该如何解决这个问题?或者谁有类似经验可以给我一些建议?非常感谢。
我的失败经历:
f2py
:因为我在Win7
上工作,我发现如果选择f2py
,Abaqus python发行版中的文件必须修改,这与开发 新安装的Abaqus
的目的背道而驰。ctypes
+Dynamic linking library
:我使用Fortran
检查以下代码生成 test.dll 并从python
,它们 运行 在python3.6
中很好,但是当我检查使用Abaqus(python2.6)
时,它出错了OSError: exception: access violation reading 0xxxxxx
.
Fortran
test.dll代代码:
module F90Module
use,intrinsic::iso_c_binding
implicit none
contains
subroutine fun_in_fortran(arr,nucle_num,n1,n2)
!dec$ attributes dllexport,decorate,alias:"fun_in_fortran" :: fun_in_python
integer(kind=c_int),intent(in),value::n1,n2,nucle_num
integer(kind=c_int),intent(out),dimension(n1,n2)::arr
xxxxxxxxxxxxxx
end subroutine fun_in_fortran
end module F90Module
Python
中的回调(另存为t.py):
#! /usr/bin/env python
#coding=utf-8
import numpy as np
from numpy.ctypeslib import load_library,ndpointer
from ctypes import *
# shape of 2d array
n1,n2 = 10,10
n3=3
# create an empty 2d array
data = np.zeros(shape=(n1,n2),dtype='int64',order='f')
flib = load_library("test.dll","./")
flib.argtypes = [ndpointer(dtype='int64',ndim=2),c_int,c_int,c_int]
flib.fun_in_python(data.ctypes.data,n3,n1,n2)
print "*"*80
print data
PS: 又查了一下问题,一头雾水。。好像是在Abaqus CAE
的运行时间。但是我真的不知道如何解决它。
在window终端中,当我使用abaqus python t.py
时,一切顺利。但是我想在Abaqus CAE
中做这个计算过程,所以我测试了命令abaqus cae noGui=t.py
,出现错误,如下:
Abaqus License Manager checked out the following license(s):
"cae" release 6.13 from zhouhongwei
<1023 out of 1024 licenses remain available>.
WindowsError: exception: access violation reading 0X000007FF080BA0A0
File "t.py" ,line 13, in <module>
flib.rand_nucle<data.ctypes.data,n3,nl,n2>
Abaqus Error: cae exited with an error
通过将 Abaqus 从 6.13 更新到 6.14,代码有效!