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

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

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

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

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

2回答

2562閲覧

装置番号を引数とするFortranのサブルーチンをpythonから呼ぶ方法

syoukera

総合スコア10

FORTRAN

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

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

1クリップ

投稿2019/05/14 00:08

編集2019/05/19 01:15

前提・実現したいこと

燃焼の化学反応解析コードCHEMKIN-II(Fortran77で作成)を使用しております.Pythonのリッチなデータ入出力およびデータ可視化機能を使いたく,PythonからFortran77のsubroutineを使用したいと思っております.

CHEMKIN-IIの内部で実行しているmainのProgramでは装置番号のopenと,装置番号を引数としたサブルーチンの呼び出しが行われております.

質問

PythonでOpenと同等の操作により装置番号を作成し,それを引数としてサブルーチンを呼ぶことは可能でしょうか.可能であればその方法を教えていただきたく.

該当のソースコード

参考までにPythonで再現したい箇所のCHEMKIIN-IIコードを記載します.

Fortran77

1 PROGRAM DRIVER 2C 3C*****DOUBLE PRECISION 4 IMPLICIT DOUBLE PRECISION (A-H, O-Z), INTEGER (I-N) 5C*****END DOUBLE PRECISION 6C*****SINGLE PRECISION 7C IMPLICIT REAL (A-H, O-Z), INTEGER (I-N) 8C*****END SINGLE PRECISION 9 PARAMETER ( LENIWK = 25000, LENRWK = 250000, LENCWK = 200, 10 1 LENSYM = 16) 11 DIMENSION IWORK (LENIWK), RWORK (LENRWK) 12 LOGICAL LEXIST 13 CHARACTER CWORK(LENCWK)*(LENSYM) 14 DATA LIN/5/, LOUT/6/, LINKCK/25/, LSAVE/7/, LIGN/9/, LREST/10/ 15C 16C LIN = Unit number for Keyword input 17C LOUT = Unit number for text output to terminal 18C LIGN = Unit number for text output file 19C LSAVE = Unit number for binary output file 20C LINKCK = Unit number for CHENKIN linking file 21C LREST = Unit number for binary restart file 22C LENIWK = Length of integer work array 23C LENRWK = Length of real work array 24C LENCWK = Length of character work array 25C LENSYM = Length of a character string in character work array 26C IWORK = Integer work array 27C RWORK = Real work array 28C CWORK = Character work array 29C 30C*****vms 31C SET I/O UNITS AND OPEN FILES. OPERATING SYSTEM IS vms VMS. 32C OPEN (LINKCK, STATUS='OLD', FORM='UNFORMATTED') 33C OPEN (LSAVE, STATUS='NEW', FORM='UNFORMATTED') 34C OPEN (LOUT, STATUS='NEW', FORM='FORMATTED') 35C OPEN (LIGN, STATUS='NEW', FORM='FORMATTED') 36C OPEN (LIN, STATUS='OLD', FORM='FORMATTED') 37C INQUIRE (FILE='restart', EXIST=LEXIST) 38C IF (LEXIST) OPEN (LREST,STATUS='OLD',FORM='UNFORMATTED') 39C*****END vms 40C 41C*****unix 42 OPEN (LINKCK, FORM='UNFORMATTED', FILE='cklink') 43 OPEN (LSAVE, FORM='UNFORMATTED', FILE ='save') 44 OPEN (LOUT, FORM='FORMATTED', FILE='terminalout') 45 OPEN (LIGN, FORM='FORMATTED', FILE = 'skout') 46 OPEN (LIN, FORM='FORMATTED', FILE='inp') 47 INQUIRE (FILE='restart', EXIST=LEXIST) 48 IF (LEXIST) THEN 49 OPEN (LREST, FORM='UNFORMATTED', 50 1 FILE='restart') 51 ENDIF 52C*****END unix 53C 54C PASS CONTROL TO SENKIN 55C 56 CALL SENKIN (LIN, LOUT, LINKCK, LSAVE, LIGN, LREST, 57 1 LENRWK, RWORK, LENIWK, IWORK, LENCWK, CWORK) 58C 59 STOP 60 END 61C 62 SUBROUTINE TEMPT (TIME, TEMP) 63 IMPLICIT DOUBLE PRECISION (A-H, O-Z), INTEGER (I-N) 64 RETURN 65 END 66C 67 SUBROUTINE VOLT (TIME, VOL, DVDT) 68 IMPLICIT DOUBLE PRECISION (A-H, O-Z), INTEGER (I-N) 69 RETURN 70 END 71 72

追記20190519

Python上で整数型の値を管理し,Fortranに渡して装置番号として使用するということを考えました.テストのためにPythonからOpen文を含むコードを書いて実行を.結果は以下.

実行環境結果
Pythonで装置番号を定義,Fortranに渡すSegmentation fault
Pythonから引数なしでFortranを呼ぶ,Fortranで装置番号を定義実行可能

Fortran上で整数型を定義して渡すうまくいきますが,Pythonで管理しようとするとOPENの過程で怒られました.
参考に使用したコードを置いておきます.

python

1import ctypes 2import numpy as np 3 4# device number as argument 5def call_openfiles(readDN, writeDN): 6 f = np.ctypeslib.load_library("libfort.so", ".") 7 f.openfiles_.argtypes = [ 8 ctypes.c_int32, 9 ctypes.c_int32 10 ] 11 f.openfiles_.restype = ctypes.c_void_p 12 13 f.openfiles_(readDN, writeDN) 14 15# non argument 16def call_fortran(): 17 f = np.ctypeslib.load_library("libfort.so", ".") 18 f.main_.restype = ctypes.c_void_p 19 20 f.main_() 21 22# 装置番号を定義して引数として渡すとき 23readDN = 10 24writeDN = 11 25print("**call fortran from python with device number as argument") 26call_openfiles(readDN, writeDN) 27 28# 引数なしで渡すとき 29# print("**call fortran from python with non argument") 30# call_fortran()

fortran90

1subroutine main() 2 implicit none 3 integer :: readDN = 10 4 integer :: writeDN = 11 5 6 call openFiles(readDN, writeDN) 7 call rwNumbers(readDN, writeDN) 8 call closeFiles(readDN, writeDN) 9end subroutine main 10 11subroutine rwNumbers(readDN, writeDN) 12 implicit none 13 real,dimension(30)::numbers 14 real temp 15 integer i, j 16 integer readDN 17 integer writeDN 18 19 ! read numbers 20 do i = 1, 30 21 read(readDN, *) numbers(i) 22 end do 23 close(10) 24 25 ! baggle sort 26 do i = 2, 30 27 do j = 2, 32-i 28 if (numbers(j) < numbers(j-1)) then 29 temp = numbers(j) 30 numbers(j) = numbers(j-1) 31 numbers(j-1) = temp 32 end if 33 end do 34 end do 35 36 ! print numbers 37 print *, "Sorted numbers is written in sortedNumbers.txt" 38 do i=1, 30 39 write(writeDN,*) numbers(i) 40 end do 41end subroutine 42 43subroutine openFiles(readDN, writeDN) 44 implicit none 45 integer(4),intent(in) :: readDN 46 integer(4),intent(in) :: writeDN 47 48 print *, "Open files from fortran" 49 open(readDN , file='numbers.txt', status='old') 50 open(writeDN , file='sortedNumbers.txt', status='replace') 51end subroutine 52 53subroutine closeFiles(readDN, writeDN) 54 implicit none 55 integer readDN, writeDN 56 close(readDN) 57 close(writeDN) 58end subroutine

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

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

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

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

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

guest

回答2

0

装置番号という整数値と、実際のファイルはFortranランタイムの中で関連づけられていると思うので、文字通りには無理ではないかと。

ということでopen命令だけはFortranプログラムを呼ばないといけないでしょう。
出来るとすると、
1.装置番号を決めて、openだけするFortranサブルーチンを呼ぶ
2.Pythonの何らかの処理が必要ならする
3.装置番号を引数に指定して目的のFortranサブルーチンを呼ぶ
ですが、1で呼んだときのFortran実行環境が3と共有できなさそうな気がするので、駄目な気がします。
出来るかもしれないので、やってみてください。

投稿2019/05/14 01:51

otn

総合スコア84538

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

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

syoukera

2019/05/14 12:40

おっしゃる通りにopen文はfortranの呼び出しが必要なようですね.何かしらやってみて上手くいったか報告したいと思います.
syoukera

2019/05/19 01:15

やってみましたがOpen文の呼び出しでセグフォが出てしまいました.追記に記載しております.
otn

2019/05/19 09:56

Fortran側のopenFilesで、Pythonから渡された引数をそのままopenに渡すのでなく、Fortranのローカル変数に代入してから、そのFortranの変数をopenに渡したらどうでしょうか? あと、参考までに、libfort.so を作った方法を教えてください。
guest

0

Fortran無知なので参考になりそうなページの紹介まで。
Pythonで簡単にFortranのsubroutineを用いる方法

投稿2019/05/14 01:05

can110

総合スコア38266

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

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

syoukera

2019/05/14 12:37

回答いただきありがとうございます.参考にいたします.
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問