在Python数组和Fortran 90派生类型中使用ctype

大家好!
我尝试从Python调用一些Fortran 90例程生成的.so库中包含的几个例程。在编译.so时,库中的所有对象都使用-fPIC标志进行解析。
我有一个样例代码,如下所示

选择 | 换行 | 行号
  1. from numpy import *
  2. from ctypes import *
  3.  
  4. lib_test = cdll.LoadLibrary("./lib_test.so")
  5.  
  6. method = lib_test.__test_MOD_wrap_xbelem
  7. method.restype = None
  8.  
  9. MaxElNod = 3
  10. NumElems = 2
  11. NumNodes = (c_int *NumElems)()
  12. Length   = zeros(NumElems, dtype=double, order="Fortran")
  13. RBMass   = zeros((MaxElNod*NumElems,6,6), dtype=double, order="Fortran")
  14.  
  15. # Call the function in the .so
  16. method(byref(c_int(NumElems)), byref(NumNodes), Length.ctypes.data_as(POINTER(c_double)), RBMass.ctypes.data_as(POINTER(c_double)) )
  17.  

我有几个问题希望你能帮忙。
1)代码工作正常,如上所示。但是,我想传递整数数组(上面的粗体),就像传递类型为Double的数组一样。我渴望有一个代码,看起来更像这样

选择 | 换行 | 行号
  1. NumNodes = zeros(NumElems, dtype=int, order="Fortran")
  2.  
  3. method(byref(c_int(NumElems)), NumNodes.ctypes.data_as(POINTER(c_int)), Length.ctypes.data_as(POINTER(c_double)), RBMass.ctypes.data_as(POINTER(c_double)) )
  4.  

在第二种情况下,数组NumNodes等于数组([8589934594,0]),而NumNodes的两个元素都应该等于2。我前面没有说过,但NumNodes只在Python中初始化,它获得Fortran90中的值,其中它们是以正确的方式计算的。第一个示例代码产生了正确的结果。我不知道我错过了什么,因为我假设对双精度类型的数组执行的类似操作也可以应用于int类型的数组。
2)我的另一个问题是关于派生类型的。Fortran 90代码使用派生类型,这就是我们决定使用派生类型创建.so库的原因。目前,Python脚本不能与相应的结构一起工作,派生类型的字段都被赋予了一个单独的变量。这意味着将几个输入参数传递给.so中的包装器,然后压缩适当的字段以形成Fortran 90中的派生类型。在这种情况下,数组也会转换为多维实体。
我想我可以向你请教一些进一步的建议。想象一下,在Fortran 90中有一个派生类型的表单

选择 | 换行 | 行号
  1.  type xbelem
  2.   integer:: NumNodes
  3.   real(8):: Length
  4.   real(8):: RBMass(MaxElNod,6,6)
  5.  end type xbelem
  6.  

在某些例程中使用,并将其初始化为

选择 | 换行 | 行号
  1. type(xbelem),intent(inout):: Elem(NumElems)
  2.  

在Python中,类似的结构是什么?以及如何将其传递到.so库?
我要感谢你所能提供的任何帮助。
向您致以亲切的问候,
安德里亚。

标签: python

添加新评论