fortran66のブログ

fortran について書きます。

【メモ帳】intel fortran 2023 年の予定

Webinar : Intel oneAPI 2023 Release: Preview the Tools

上記表題のウェビナーがありました。まだアーカイブには載っていないようですが、そのうち出る事でしょう。

www.intel.com

Fortran の話はそれほど出ませんでしたが、一応以前のロードマップ通りに事を進めていて、文法の実装状況は llvmコンパイラ ifx が 旧来の ifort に並んだので、来年はユーザーからのフィードバックももらって、実アプリにおける性能向上を目指すとのことでした。また質疑の所では、DEC Fortran 以来の FORTRAN IV/66 文法も引き続きサポートして後方互換性を保つと言っておりました。

fortran66.hatenablog.com

【メモ帳】スエーデンの Fortran 動画講座

Fortran youtube 講座 全3日

追記:二日目以降の講義も上がっていました。標準 Fortran の入門を離れ、より発展的な話題になっています。

一日目は、OOPC/C++ 連携についての講座のようです。動画見てませんw スライドなどが GitHub に上がっています。


www.youtube.com


www.youtube.com

二日目は、次期規格以降で導入される Generics 等を扱っています。LFortran を利用してサンプルを示しています。


www.youtube.com


www.youtube.com


www.youtube.com

三日目は、Array について掘り下げているようです。


www.youtube.com


www.youtube.com

ABBA 1976 年

FORTRAN77 の頃。


www.youtube.com

@terryc.3390 2 年前 Fun Fact-This is LITERALLY the moment when ABBA revealed Dancing Queen to the world...ie. performed it for the first time EVER...at the wedding of the future queen of Sweden. Yes, it's a lip sync.

【メモ帳】ドンガラ SC22 講演 その他

Turing Award Lecture featuring Jack Dongarra

講演冒頭ドンガラがイタリア移民の子で失読症と知りました。

講演後半終わりの方では COTS の終わりと今後のアルゴリズム側からのハードウェアとのすり合わせの重要性が述べられていました。日本が成功例に上げられています。

中国に関しては、アメリカ産技術が入らなくなるので苦しくなるだろうとのこと。


www.youtube.com

富良野市議会、邪神ちゃんの内容不適切認定! 

市がふるさと納税で制作費を募ったが、一般会計決算を不認定!w

www.hokkaido-np.co.jp

すかさず当該回の限定公開する公式さすがw


www.youtube.com

秋も深まってまいりました

11月だけどw


www.youtube.com


www.youtube.com

ジャケ写がいい。

終点:月世界!

www.sankei.com

Destination Moon


www.youtube.com

Toxic: Bardcore version

コメント欄もいい味出してる。


www.youtube.com

ブリちゃん20年弱前とかw

【寝言】メモ帳 

Michel Polnareff 日本のテレビ出演

コメント欄にピクルス メンバーの書き込みがあって草


www.youtube.com

Adamo 「雪が降る」

日本語うまい。アダモも日本の歌番組に出て、日本語で歌っていたような...


www.youtube.com

Gigliola Cinquetti「雨」la pioggia

よく覚えていないのですが、昔 NHK-FM民族音楽の時間で、イタリア北部のアルプス地方出身のジリオラ・チンクエッティの歌うヨーデル風のアルプス音楽歌唱アルバムが放送された気がします。記憶違いかな?


www.youtube.com

Sergio Mendes & Brasil '66 Live At The Expo '70 大阪万博


www.youtube.com

おまけ


www.youtube.com

Grover Washington Jr. feat. Bill Withers

1,300万再生で二番煎じ三番煎じが大量発生していて草


www.youtube.com

【乞食速報】GitHub codespaces 無料化 Modern Fortran extension 可

GitHub codespaces 月60時間 無料化

www.itmedia.co.jp

新しい料金表によると、60時間分が無料で使えるのは2コアのプラン。4コアでは30時間が無料で、8コアでは15時間が無料で使えるようになります。ストレージも15GBまでは無料。

fortran

modern fortran extension も使えます。

gfortran も terminal から sudo apt update/upgrade の後なら sudo apt install gfortran で Ver.9 が入ります。

$ gfortran --version
GNU Fortran (Ubuntu 9.4.0-1ubuntu1~20.04.1) 9.4.0
Copyright (C) 2019 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

$ gfortran-10 --version
GNU Fortran (Ubuntu 10.3.0-1ubuntu1~20.04) 10.3.0
Copyright (C) 2020 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

ソース プログラム

module uniplot
    implicit none
    private
    public :: fig_t
    type :: fig_t
        private
        integer :: nx, ny
        integer, allocatable :: array(:, :)
    contains
        procedure :: init     
        procedure :: point 
        procedure :: show  
        procedure :: line0
        procedure :: line
    end type fig_t
contains
    subroutine init(fig, nx, ny)
        class(fig_t), intent(out) :: fig 
        integer, intent(in) :: nx, ny
        fig%nx = nx
        fig%ny = ny 
        allocate(fig%array(0:(nx+1)/2, 0:(ny+3)/4) )
    end subroutine init  

    subroutine point(fig, ix, iy)
        class(fig_t), intent(in out) :: fig 
        integer, intent(in) :: ix, iy
        integer :: iax, iay
        iax = ix / 2
        iay = iy / 4
        ! clipping
        if (0<=ix .and. ix<fig%nx .and. 0<=iy .and. iy<fig%ny) then
            fig%array(iax, iay) = ior(fig%array(iax, iay), icode(mod(ix, 2), mod(iy, 4)))
        end if     
    end subroutine point

    pure elemental integer function icode(kx, ky)
        integer, intent(in) :: kx, ky
        if (ky == 3) then
            icode = 64 + 64 * kx
        else ! 0, 1, 2
            icode = 2**(ky + 3*kx)  
        end if
    end function icode
  
    subroutine line0(fig, ix0, iy0, ix1, iy1)
        class(fig_t), intent(in out) :: fig 
        integer, intent(in) :: ix0, iy0, ix1, iy1
        integer :: i, ix, iy, nx, ny
        real :: d
        nx = ix1 - ix0
        ny = iy1 - iy0
        if (nx == 0 .and. ny ==0) then
            call fig%point(ix, iy) 
        else if (abs(nx) < abs(ny)) then
            d = nx / real(ny)
            do i = 0, abs(ny)
                ix = nint(ix0 + d * sign(i, ny))
                iy = iy0 + sign(i, ny)
                call fig%point(ix, iy)
              end do  
        else
            d = ny / real(nx)
            do i = 0, abs(nx)
                iy = nint(iy0 + d * sign(i, nx))
                ix = ix0 + sign(i, nx)
                call fig%point(ix, iy)
            end do  
        end if  
    end subroutine line0
  
    subroutine show(fig)
        class(fig_t), intent(in) :: fig 
        integer :: iy
        do iy = 0, ubound(fig%array, 2)
            print '(*(a))', reverse_endian(shift_code(fig%array(:, iy)))
        end do
    end subroutine show    
  
    pure elemental integer function shift_code(k)
        integer, intent(in) :: k
        integer, parameter :: n0 = Z'E2A080' !14852224
        shift_code = n0 + 256 * (k /64) + mod(k, 64)  !E2A180, E2A280, E2A380      
    end function shift_code    
    
    pure elemental character(len = 4) function reverse_endian(i)
        integer, intent(in) :: i
        character:: tmp(4)
        tmp = transfer(i, ' ', size = 4)
        reverse_endian = transfer(tmp(4:1:-1), '    ')  !array 4 to len 4
    end function reverse_endian
    
    
    subroutine line(fig, x, y, ipen)
        class(fig_t), intent(in out) :: fig
        real, intent(in) :: x, y
        integer, intent(in) :: ipen
        integer, save :: ix0 = 0, iy0 = 0 
        integer :: ix, iy
        real, parameter :: xn = 80.0, yn = 100.0, fx = 1.0, fy = 0.85
        ix = nint( fx * x + xn)      
        iy = nint(-fy * y + yn)
        if (ipen == 1) call fig%line0(ix0, iy0, ix, iy)
        ix0 = ix
        iy0 = iy
    end subroutine line

end module uniplot


program uniplot_main
    implicit none
    real, allocatable :: x(:), y(:)
    integer, parameter :: n = 10**3
    allocate(x(n), y(n))
    call random_seed()
    call random_number(x)
    call random_number(y)

plot: block 
        use :: uniplot
        type(fig_t) :: fig1
        integer :: i, ix0, iy0, ix1, iy1, k
        k = 100
        print *
        print *, 'Monte Carlo: estimated pi =', 4.0 * count(x**2 + y**2 < 1.0) / n 
        call fig1%init(k, k)
        ! draw box
        call fig1%line0(0, 0, k-1, 0)
        call fig1%line0(0, 0, 0, k-1)
        call fig1%line0(0, k-1, k-1, k-1)
        call fig1%line0(k-1, 0, k-1, k-1)
        ! draw 1/4 circle
        ix0 = 0
        iy0 = 0
        do ix1 = 0, k - 1
            iy1 = k - 1 - int(sqrt(real((k-1)**2 - ix1**2)))
            call fig1%line0(ix0, iy0, ix1, iy1)
            ix0 = ix1
            iy0 = iy1
        end do     
        ! plot dots
        do i = 1, n 
            call fig1%point(int(k * x(i)), int(k * y(i)))
        end do 
        call fig1%show()
    end block plot
end program uniplot_main

fortrangithub action


www.youtube.com

【メモ帳】Fortran Generics 追加情報

type, deferred

先日、LFortran での Generics の試験実装について書きましたが、その追加情報が出ていました。

fortran66.hatenablog.com

requirement の例題で「type :: T; end type」というのがあって、ダサいなと思っておりましたが、「type, deferred :: T」という書き方に変えたようです。この方が他の deferred とも合っていい気がします。

追加例では、operator を requirement で指定した関数位置に送る例も出していましたが、上の記事内で紹介した YouTube 講演では operator は先送り的なことを言っていたので、また変わったのかもしれません。それはともかく operator overload はどうやるんでしょうか。普通に interface を具象名に対して書けばいいのか、generic 名で一括で出来るのか?

旧例

    requirement S(T, F0) 
        type :: T; end type
        function F0(x) result(z)
            type(T), intent(in) :: x
            type(T) :: z
        end function
    end requirement

新例

requirement binary_op(T, U, V, op)
  type, deferred :: T, U, V
  function op(x, y) result(z)
    type(T), intent(in) :: x
    type(U), intent(in) :: y
    type(V) :: z
  end function
end requirement

fortran-lang.discourse.group

それにつけても requirement の方が abstract interface より abstract 度が高い気がして草。