fortran66のブログ

fortran について書きます。

【メモ帳】M1 Mac で Fortran から X-window に図

M1 mac X-window

mac の window システムが全く不明なので、X-window で図を書くことにします。

以前、Linux でやったものを再現することを目指します。 fortran66.hatenablog.com

X-window 用ソフト XQuartz インストール

www.xquartz.org

インストールするとアプリケーション・フォルダの中のその他に入っておりました。一度 logoff して再度 login 後に実行する必要がある様です。

xclock が起動することを確かめました。

実行

f:id:fortran66:20210327021811p:plain

include path と lib path を指定してのコンパイルで上手くゆきました。

 gfortran plot3.c plot.f90 -lX11 -I/opt/X11/include -L/opt/X11/lib

plot3.c

#include <X11/Xlib.h>
#include <X11/Xutil.h>
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 a window
    w = XCreateSimpleWindow(d, DefaultRootWindow(d), 0, 0, nx, ny, 0, black, white);
    XMapWindow(d, w);
    gc = XCreateGC(d, w, 0, 0);
    XFlush(d);
}

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);
}

plot.f90

module m_plot
    implicit none
    interface
        subroutine Xopen(nx, ny) bind(c, name = 'X_open')
            integer, value :: nx, ny
        end subroutine Xopen

        subroutine Xpoint(ix, iy) bind(c, name = 'X_point')
            integer, value :: ix, iy
        end subroutine Xpoint

        subroutine Xclose() bind(c, name = 'X_close')
        end subroutine Xclose

        subroutine Xflush() bind(c, name = 'X_flush')
        end subroutine Xflush
    end interface
end module m_plot


program plot
    use m_plot
    implicit none
    integer, parameter :: n = 10000, nx = 500, ny = nx
    real :: x(n), y(n)
    integer :: i, ix, iy

    call random_seed()
    call random_number(x)
    call random_number(y)

    call Xopen(nx, ny)
    call sleep(1)                              ! non-standard
    do ix = 0, nx
        iy = sqrt(real(ny**2 - ix**2))
        call Xpoint(ix, iy)
    end do
    do iy = 0, ny
        ix = sqrt(real(nx**2 - iy**2))
        call Xpoint(ix, iy)
    end do
    call Xflush()

    do i = 1, n
        ix = nx * x(i)
        iy = ny * y(i)
        call Xpoint(ix, iy)
    end do
    call Xflush()
    print *, 'Monte-Carlo Pi=', 4 * count(x**2 + y**2 < 1.0) / real(n)

    print *, 'press enter'
    read *
    call Xclose()
end program plot 

最新 Apple Mac mini Apple M1 Chip (8GB RAM, 256GB SSD)

最新 Apple Mac mini Apple M1 Chip (8GB RAM, 256GB SSD)

  • 発売日: 2020/11/17
  • メディア: Personal Computers