🐷

FortranやCからgnuplotを呼び出す(シェルコマンドを呼び出す)

2022/11/29に公開

概要

この記事は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に読み込ませるバッチファイル
make_graph_with_gnuplot.f90
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の場合と同じです.

make_graph_with_gnuplot.c
#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