Как запустить пользовательскую процедуру расчета с использованием Abaqus, Python и Fortran (программирование на разных языках)? - PullRequest
0 голосов
/ 07 мая 2018

Заранее спасибо!

Я зеленая рука в программировании на Python и на разных языках.

Моя среда разработки - Abaqus6.13(with python 2.6.2) + MSVS2012 + inter Fortran 2013SP1 (я хочу использовать IMSL), на Windows 7. И моей последней целью является разработка GUI-плагина в Abaqus, который может быть запущен только в зависимости от новой установленной Abaqus.

Я хочу отсортировать следующее:

  1. Выполните модальный анализ в Abaqus;
  2. Плагин графического интерфейса пользователя получает вышеуказанные результаты из modalResult.odb и передает их в пользовательский вычислительный модуль , который записан в Fortran;
  3. Плагин GUI перевод вычисленных результатов в другой Abaqus odb ;

Прежде всего, я хочу использовать python в качестве клея для Abaqus и Fortran, и я не знаю, как передать переменные (возможно, это всего лишь числа в int или float и одно / двухмерные массивы ).

Итак, как я могу решить проблему? или у кого-нибудь есть подобный опыт, чтобы дать мне несколько советов? Большое спасибо.


Мой опыт неудач:

  1. f2py: Поскольку я работаю на Win7, и я обнаружил, что если я выберу f2py, файлы в дистрибутиве Python Abaqus должны быть изменены, что противоречит цели работы с new установлено Abaqus.
  2. 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

1 Ответ

0 голосов
/ 28 июля 2019

При обновлении Abaqus с 6.13 до 6.14 коды работают!

...