質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

FORTRAN

FORTRAN(フォートラン)は科学時術計算に向いた手続き型プログラミング言語です。 並列計算の最適化が行いやすい特性上、数値予報および気候モデルなどの大規模な計算を行う分野のスーパーコンピュータで使われています。

Q&A

1回答

2252閲覧

PythonからFortranのsubroutineを呼び出し

GIBA

総合スコア10

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

FORTRAN

FORTRAN(フォートラン)は科学時術計算に向いた手続き型プログラミング言語です。 並列計算の最適化が行いやすい特性上、数値予報および気候モデルなどの大規模な計算を行う分野のスーパーコンピュータで使われています。

0グッド

0クリップ

投稿2019/03/26 07:09

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)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

otn

2019/03/26 07:20

回答ではありませんが、FortranでなくCで書く方が、障壁が低いと思います。 しかし、このコードだと、ファイルの読み書きしかしてないので、有意に速くはなりませんよ。
tiitoi

2019/03/26 07:59

Python で数値計算なら、まず numpy を使って書けないか検討されてはどうでしょうか。 numpy の関数や機能を使えば、大抵のアルゴリズムは for ループを使わずに書けるはずです。 それでも速度が十分でない場合は otn さんがおっしゃる通り C で実装して Python から呼び出せばよいと思います。
guest

回答1

0

どちらも詳しくないので、ちょっと調べてみました。

エラーは、Export_ という関数が無いと言っています。Pythonのソースを見ると、 f.export_.argtypes という記述があるので、この最後の "_" が余分じゃないかと思いますが、どうでしょう?

検索したら、PythonからFortranを使う と言うページがあり、見てみたところ、fortran側の関数宣言を C形式に変える必要があるようですが、その辺はどうでしょうか?
(多分、これは別の実行時エラーになると思う)

気が付いたところで。

投稿2019/03/28 14:55

pepperleaf

総合スコア6383

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問