Заранее спасибо!
Я зеленая рука в программировании на Python и на разных языках.
Моя среда разработки - Abaqus6.13(with python 2.6.2)
+ MSVS2012
+ inter Fortran 2013SP1
(я хочу использовать IMSL
), на Windows 7
. И моей последней целью является разработка GUI-плагина в Abaqus
, который может быть запущен только в зависимости от новой установленной Abaqus
.
Я хочу отсортировать следующее:
- Выполните модальный анализ в
Abaqus
;
- Плагин графического интерфейса пользователя получает вышеуказанные результаты из modalResult.odb и передает их в пользовательский вычислительный модуль , который записан в
Fortran
;
- Плагин GUI перевод вычисленных результатов в другой Abaqus odb ;
Прежде всего, я хочу использовать python
в качестве клея для Abaqus
и Fortran
, и я не знаю, как передать переменные (возможно, это всего лишь числа в int или float и одно / двухмерные массивы ).
Итак, как я могу решить проблему? или у кого-нибудь есть подобный опыт, чтобы дать мне несколько советов? Большое спасибо.
Мой опыт неудач:
f2py
: Поскольку я работаю на Win7
, и я обнаружил, что если я выберу f2py
, файлы в дистрибутиве Python Abaqus должны быть изменены, что противоречит цели работы с new установлено Abaqus
.
ctypes
+ Dynamic linking library
: я проверяю следующие коды, используя Fortran
generate 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
. Однако я действительно понятия не имею о том, как это исправить.
В оконном терминале, когда я использую 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