FortranやCからgnuplotを呼び出す(シェルコマンドを呼び出す)
概要
この記事はFortranやCからgnuplotを呼び出す際の手続きについての備忘録です.図1はFortranからgnuplotを呼び出したときの例です.Visual Studio Codeの拡張機能であるCode Runnerなどを同時に利用することで,Fortranなどの言語でも,PythonやJuliaのようにコンパイル〜グラフ描画まで一気通貫で実行できます.
図1. Fortranからgnuplotを呼び出した場合の例(Visual Studio CodeのCode Runner使用)
Fortranの場合
Fortranの場合は下記のどちらかを記述すれば良いです.後述しますが,どちらの関数にも注意点があります.
・call system("gnuplot -persist 'FILE_NAME' ")
・call execute_command_line("gnuplot -persist 'FILE_NAME' ")
system()
関数もexecute_command_line()
関数もシェルコマンドを実行するための関数です(参考[1,2]).なのでsystem("ls")
やsystem("mkdir dir_name")
のようなこともできます.FILE_NAME
にはgnuplotに読み込ませるバッチファイルの名前を記述します.gnuplotに渡している-persist
はコマンド実行後もグラフを残すためのオプションです.-persist
をつけなくてもコマンド自体は通りますが,グラフが一瞬で消えてしまいます.
サンプルプログラムを下記に示します.2次関数をプロットするためのプログラムになります.サンプルプログラムでは下記の2つのファイルを生成し,gnuplotに読み込ませています.
- xy_data.txt : xとyのテーブルデータ
- plot_file.gnu : gnuplotに読み込ませるバッチファイル
program make_graph
implicit none
integer i
integer, parameter :: N = 100, fout_data = 10, fout_gnu = 11
double precision x, y
double precision, parameter :: dx = 0.1d0
open(fout_data, file = 'xy_data.txt')
do i = 0, N
x = i * dx
y = x ** 2
write(fout_data, *) x, y
end do
close(fout_data)
open(fout_gnu, file = 'plot_file.gnu')
write(fout_gnu,*) "plot 'xy_data.txt' with line "
close(fout_gnu)
call system("gnuplot -persist 'plot_file.gnu' ")
!call execute_command_line("gnuplot -persist 'plot_file.gnu' ")
end program make_graph
Cの場合
C言語の場合は,stdlib.hをincludeして下記を記述すれば良いです.C言語の場合はsystem()関数がstdlib.hの組み込み関数として用意されています.
#include <stdlib.h>
//~~ 中略 ~~
system("gnuplot -persist 'FILE_NAME' ")
C言語の場合のサンプルプログラムは下記になります.やっていることはFortranの場合と同じです.
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
int main(void)
{
long int i;
const long int N = 100;
double x, y;
const double dx = 0.1;
FILE *fout_data, *fout_gnu;
fout_data = fopen("xy_data.txt", "w");
for (i = 0; i <= N; i++) {
x = i * dx;
y = pow(x, 2);
fprintf(fout_data, "%lf %lf\n", x, y);
}
fclose(fout_data);
fout_gnu = fopen("plot_file.gnu", "w");
fprintf(fout_gnu, "plot 'xy_data.txt' with line\n");
fclose(fout_gnu);
system("gnuplot -persist 'plot_file.gnu' ");
return 0;
}
環境
・OS: Ubuntu 22.04 LTS
・Fortran: gfortran(GNU Fortran), ver.11.3.0
・C: gcc(GNU C), ver.11.3.0
・gnuplot: ver.5.4.2
・shell: GNU bash, ver.5.1.16
・Editor: Visual Studio Code, ver.1.73.1
・Extension Pack(Visual Studio Code): Code Runner, ver.0.11.8
参考
[1]. SYSTEM — Execute a shell command(GNU gfortran公式マニュアル)
[2]. EXECUTE_COMMAND_LINE — Execute a shell command(GNU gfortran公式マニュアル)
[3]. SYSTEM, Development Reference Guides(Intel fortran公式マニュアル)
[4]. f90_unix_proc(NAG fortran公式マニュアル)
Discussion