fortran66のブログ

fortran について書きます。

Cray Chapel から X-window に点を打つ

Chapel から bash on windows で X-window 利用

Julia 言語が Ver.1.0 になったとかで、記念にマイナー言語の Chapel をいじります。Chapel は coarray Fortran と同じく PGAS 言語です。同じ PGAS 仲間のよしみでいじります。

Chapel には、最近は Rust 言語のように transaction 的なメモリー管理も導入されているようですが、よく分かりません。

Chapel: Productive Parallel Programming

C言語との混成もできるようになったようなので、X-Window で図形を描くことに挑戦してみました。

Fortran の時と同じようにやってみました。ただ乱数ルーチンを調べるのが面倒なので、丸を書いてお茶を濁しました。
fortran66.hatenablog.com

コンパイル&ゴー

まず、gcc で C 言語のルーチンをコンパイルしてオブジェクトを生成しておきます。

それを chapel に渡します、Xwindow のライブラリなどを認識させるためリンカ―・オプション -lX11 をつけます。警告メッセージが沢山出ますが何とかなります。

実行は、マルチロケール対応版にしてあるので、ロケール数を指定してやります。(-nl 1 は1個)

O@HP8:~$ gfortran -c plot3.c
O@HP8:~$ chpl  plot3.o  plot3.chpl  -lX11
In file included from /tmp/chpl-O-4402.deleteme/_main.c:43:0:
/tmp/chpl-O-4402.deleteme/plot.c: In function ‘chpl_user_main’:
/tmp/chpl-O-4402.deleteme/plot.c:32:1: warning: implicit declaration of function ‘X_open’; did you mean ‘open’? [-Wimplicit-function-declaration]
 X_open(((int32_t)(INT64(800))), ((int32_t)(INT64(600))));
 ^~~~~~
 open
/tmp/chpl-O-4402.deleteme/plot.c:42:1: warning: implicit declaration of function ‘X_point’; did you mean ‘isprint’? [-Wimplicit-function-declaration]
 X_point(call_tmp_chpl4, ((int32_t)((INT32(300) + i_chpl))));
 ^~~~~~~
 isprint
/tmp/chpl-O-4402.deleteme/plot.c:59:1: warning: implicit declaration of function ‘X_close’; did you mean ‘pclose’? [-Wimplicit-function-declaration]
 X_close();
 ^~~~~~~
 pclose
O@HP8:~$ ./plot3 -nl 1
X-window plot

1
O@HP8:~$

コンパイルは遅いです。

出力図

f:id:fortran66:20180813025648p:plain

ソース・プログラム

C plot3.c

窓が立ち上がるまで1秒ほど時間をおいています。

#include <X11/Xlib.h>
#include <X11/Xutil.h>
#include <unistd.h>
// unistd.h -> sleep()
static Display* d;
static Window   w;
static GC       gc;
unsigned long white, black;

void X_open(int nx, int ny){
    // Open a display.
    d = XOpenDisplay(0);
    if ( !d ) return;
    //
    white = WhitePixel(d, DefaultScreen(d));
    black = BlackPixel(d, DefaultScreen(d));
    // Create the window
    w = XCreateSimpleWindow(d, DefaultRootWindow(d), 0, 0, nx, ny, 0, black, white);
    XMapWindow(d, w);
    gc = XCreateGC(d, w, 0, 0);
    XFlush(d);
    sleep(1);
}

void X_point(int ix, int iy){
     XDrawPoint(d, w, gc, ix, iy);
     XFlush(d);
}

void X_flush(){
     XFlush(d);
}

void X_close(void){
    XFreeGC(d, gc);
    XDestroyWindow(d, w);
    XFlush(d);
    XCloseDisplay(d);
}
chapel plot3.chpl

デフォルトの整数型が 64bit 整数のため、X-windowの 32bit 引数と合わず、型変換がうるさくなりましたが、無視しても大丈夫な模様です。コンソールからの入力は例外処理を強要させれるのですが、適当にごまかしました。

extern proc X_open(nx: int(32), ny: int(32));
extern proc X_point(ix:int(32), iy: int(32));
extern proc X_close();

module plot {

    proc main() {
        var i, ix, iy : int(32);
        var x, y: real;
        X_open(800, 600);

        writeln("X-window plot");
        for i in 0:int(32)..100:int(32)
        {
            y = i:real;
            x = sqrt(100.0**2-y**2);
            ix = 400:int(32) + x:int(32);
            iy = 300:int(32) + i;
            X_point(ix, iy);
            iy = 300:int(32) - i;
            X_point(ix, iy);
            ix = 400:int(32) - x:int(32);
            iy = 300:int(32) + i;
            X_point(ix, iy);
            iy = 300:int(32) - i;
            X_point(ix, iy);
        }

        try! {i = read(int(32));} // pause
        X_close();
    }
}