将 numpy 数组传递给 fortran 时遇到 f2py 维度错误

问题描述 投票:0回答:1

我一直在尝试包装一个 fortran 模块,该模块采用几个一维数组并返回计算值 CTP 和 HILOW。

subroutine ctp_hi_low ( nlev_in, tlev_in, qlev_in, plev_in,  &
                          t2m_in , q2m_in , psfc_in, CTP, HILOW , missing )

   implicit none
!
! Input/Output Variables
!
   integer, intent(in )                      ::  nlev_in   ! *** # of pressure levels
   real(4), intent(in )                      ::  missing   ! *** missing value - useful for obs
   real(4), intent(in ), dimension(nlev_in)  ::  tlev_in   ! *** air temperature at pressure levels [K]
   real(4), intent(in ), dimension(nlev_in)  ::  qlev_in   ! *** specific humidity levels [kg/kg]
   real(4), intent(in ), dimension(nlev_in)  ::  plev_in   ! *** pressure levels [Pa]
   real(4), intent(in )                      ::  psfc_in   ! *** surface pressure [Pa]
   real(4), intent(in )                      ::  t2m_in    ! *** 2-meter temperature [K]
   real(4), intent(in )                      ::  q2m_in    ! *** 2-meter specific humidity [kg/kg]
   real(4), intent(out)                      ::  CTP       ! *** Convective Triggering Potential [K]
   real(4), intent(out)                      ::  HILOW     ! *** Low-level humidity [K]

<internal variables and calculations>

包装成功,但运行程序时出现以下错误。

我一直在传递虚拟数据以确保所有数组具有相同的形状。

Traceback (most recent call last):
  File "/mnt/d/ResearchProjects/NSF-Drought/coupling-metrics/minimal/test.py", line 47, in <module>
    conv_trig_pot_mod.ctp_hi_low(10, arr, arr, arr, 1,1, 1)
ValueError: ctp_hilow.ctp_hilow.conv_trig_pot_mod.ctp_hi_low: failed to create array from the 2nd argument `qlev_in` -- 0-th dimension must be fixed to 1 but got 10

我一直在尝试以不同的维度传递我的一维数组,但它们都会产生相同的错误。

arr  = np.ones([10,], order='F')
arr  = np.ones([10,1], order='F')
arr  = np.ones([1,10], order='F')

我也一直在尝试传递一份清单。

我根本不知道如何满足 f2py 的形状要求。

如有任何帮助,我们将不胜感激

python numpy fortran f2py
1个回答
0
投票

最好从 python 中使用显式参数名称调用 fortran 子例程:

conv_trig_pot_mod.ctp_hi_low(nlev_in=10, tlev_in=arr, qlev_in=arr, plev_in=arr, t2m_in=1, q2m_in=1, psfc_in=????, missing=1)

fortran 和 python 的参数顺序不同。 你可以检查新的参数列表并在 python 中订购 __doc__:

# import may be different for different python version
from xxxx import yyyy as ctp_module
print(ctp_module.ctp_hi_low.__doc__)
© www.soinside.com 2019 - 2024. All rights reserved.