PythonからFortranのsubroutineを呼び出して早くしたい
Pythonのループが遅いため,遅いループ部分だけFortranで記述し,Pythonでその関数を呼び出したいと考えています.
知識が乏しいため,ネットの情報を頼りにコードを書いたのですが,エラーが発生してしまいます.
根本的に間違っているかもしれないので,確認とエラーの対処法をお聞きしたいです.
エラーの内容
File "C:\Program Files (x86)\Microsoft Visual Studio\Shared\Anaconda3_64\lib\site-packages\spyder\utils\site\sitecustomize.py", line 705, in runfile execfile(filename, namespace) File "C:\Program Files (x86)\Microsoft Visual Studio\Shared\Anaconda3_64\lib\site-packages\spyder\utils\site\sitecustomize.py", line 102, in execfile exec(compile(f.read(), filename, 'exec'), namespace) File "E:/Programming/Python/コード試験場/instant_with_Fortran.py", line 333, in <module> call_Fortran(t,x,y,size,XmaxCut,XminCut,StartY,EndY,Ufluc,Vfluc,Wfluc,dudx,dvdx,dwdx,dudy,dvdy,dwdy,dwdz,Q,Q_noX,Q_noY,Q_noZ,lambda0,lambda_noX,lambda_noY,lambda_noZ) File "E:/Programming/Python/コード試験場/instant_with_Fortran.py", line 273, in call_Fortran np.ctypeslib.ndpointer(dtype=np.float64), np.ctypeslib.ndpointer(dtype=np.float64)] File "C:\Program Files (x86)\Microsoft Visual Studio\Shared\Anaconda3_64\lib\ctypes\__init__.py", line 361, in __getattr__ func = self.__getitem__(name) File "C:\Program Files (x86)\Microsoft Visual Studio\Shared\Anaconda3_64\lib\ctypes\__init__.py", line 366, in __getitem__ func = self._FuncPtr((name_or_ordinal, self)) AttributeError: function 'Export_' not found
問題のソースコード
Fortran
1 2subroutine Export(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z) 3 integer a, d, g, h, zz 4 real(8),intent(inout) :: b(1:d),c(1:d),e(1:6),f(1:6) & 5 ,i(1:d),j(1:d),k(1:d),l(1:d),m(1:d) & 6 ,n(1:d),o(1:d),p(1:d),q(1:d),r(1:d) & 7 ,s(1:d),t(1:d),u(1:d),v(1:d),w(1:d) & 8 ,x(1:d),y(1:d),z(1:d) 9 character filename*128 10 implicit none 11 12 write(filename,'("Instant//vel",i3.3,".plt")')a 13 open(1000+a, file=filename) 14 write(1000+a,'(a23)') 'TITLE = "stereoPIV.plt"' 15 write(1000+a,'(a280)') 'VARIABLES =x" "y" "Ufluc" "Vfluc" "Wfluc" & 16 "dudx" "dvdx" "dwdx" "dudy" "dvdy" "dwdy" "dwdz "Q" "Q_noX" "Q_noY" "Q_noZ" & 17 "lambda0" "lambda_noX" "lambda_noY" "lambda_noZ" ' 18 write(1000+a,'(a17,i3.3,a4,i3.3,a14)') 'ZONE T="STAT", I=73, J=',d-c+1,', K=1, F=POINT' 19 20 do zz=1,d 21 22 write(1000+a, '(18e13.5)') b(zz),c(zz),i(zz),j(zz),k(zz),l(zz),m(zz),n(zz) & 23 ,o(zz),p(zz),q(zz),r(zz),s(zz),t(zz),u(zz),x(zz) & 24 ,y(zz),z(zz) 25 end do 26 27 close(a) 28end subroutine Export 29 30
python
1def call_Fortran(t,x,y,size,XmaxCut,XminCut,StartY,EndY,Ufluc,Vfluc,Wfluc,dudx,dvdx,dwdx,dudy,dvdy,dwdy,dwdz,Q,Q_noX,Q_noY,Q_noZ,lambda0,lambda_noX,lambda_noY,lambda_noZ): 2 f = ctypes.CDLL("./libfort.dll") #ctypesにおいてのライブラリ読み込み設定 3 f.export_.argtypes=[ctypes.POINTER(ctypes.c_int32), np.ctypeslib.ndpointer(dtype=np.float64), 4 np.ctypeslib.ndpointer(dtype=np.float64), ctypes.POINTER(ctypes.c_int32), 5 ctypes.POINTER(ctypes.c_int32), np.ctypeslib.ndpointer(dtype=np.float64), 6 np.ctypeslib.ndpointer(dtype=np.float64), ctypes.POINTER(ctypes.c_int32), 7 ctypes.POINTER(ctypes.c_int32),np.ctypeslib.ndpointer(dtype=np.float64), 8 np.ctypeslib.ndpointer(dtype=np.float64), 9 np.ctypeslib.ndpointer(dtype=np.float64), np.ctypeslib.ndpointer(dtype=np.float64), 10 np.ctypeslib.ndpointer(dtype=np.float64), np.ctypeslib.ndpointer(dtype=np.float64), 11 np.ctypeslib.ndpointer(dtype=np.float64), np.ctypeslib.ndpointer(dtype=np.float64), 12 np.ctypeslib.ndpointer(dtype=np.float64), np.ctypeslib.ndpointer(dtype=np.float64), 13 np.ctypeslib.ndpointer(dtype=np.float64), np.ctypeslib.ndpointer(dtype=np.float64), 14 np.ctypeslib.ndpointer(dtype=np.float64), np.ctypeslib.ndpointer(dtype=np.float64), 15 np.ctypeslib.ndpointer(dtype=np.float64), np.ctypeslib.ndpointer(dtype=np.float64), 16 np.ctypeslib.ndpointer(dtype=np.float64), np.ctypeslib.ndpointer(dtype=np.float64)] 17 f.export_.restype = ctypes.c_void_p 18 f.Export(t,x,y,size,XmaxCut,XminCut,StartY,EndY,Ufluc,Vfluc,Wfluc,dudx,dvdx,dwdx,dudy,dvdy,dwdy,dwdz,Q,Q_noX,Q_noY,Q_noZ,lambda0,lambda_noX,lambda_noY,lambda_noZ)