趣味で計算流砂水理

趣味で計算流砂水理 Computational Sediment Hydraulics for Fun Learning

数値計算とか河川工学とかプログラミングのことを書いています

MENU

ライセンス

ライセンスについて

もし、ソフトウェアとして組み込む予定があるのならMITがよろしいかと思います。

なければGPLで良いかと。

何を目的にするかということもありますが、あのプログラムは非常に勉強になると思います。 また、世の中の河川の計算のほとんどは、ソースを見たことがありません。 もちろん、よくわからない人があーだ、こーだ言う可能性があるので、晒せないのはわかりますが・・・。

それでも、みんなが勉強する意味で公開するのは良いかなと。

あまり考えていないのであれば、MITですかね。

VBA

以前、2007と2013で差があることを知りました。 関数が変わっているのですかね・・・。グラフに関する関数だったと記憶しています。

正直、VBAは生き残るとは思いますが、MSがVBに力を入れているとは思えません。。。

最近、可視化についてはgnuplotとRを使ってます。 (なぜmatplotlibではないのかはさておき)

ただ、ここら辺は時事刻々と変化することを受け入れないと、 プログラムは書けないと感じてます。

pythonは最たるものだと思いますが(笑)。

EXCELのVBAが。。。

ふと気付いたのですが、Excel 2016に変更してからExcel 2007で作っていたマクロの中でユーザーフォームを使ってグラフをコントロールするものがすべて動かないです。

多分描画速度の低下(データ更新時処理のアルゴリズムが変わった?)の影響かと思いますが、いろいろ試しましたが駄目っぽいです。作り込んだものが多いのでショックです。

いっその事、これを気にExcel GUIはやめようかと思い始めました。

グラフを使ったGUIってどうゆうものを使ってますか?

ライセンスの話

例のSection Quasi 2Dモデルについて、Githubで公開しようかなと考えているのですが、そろそろライセンスのことも気にしたほうが良いかもしれないと思ってます。

どうしましょうか。MITかGPLかと思いますが、GPLにするほど大したものじゃないですが悩ましいです。

作者はこのHPにします。ミスがあればその都度gitで直していこうかと思います。

また、jupyterの部分はpythonのコードに変更しようと思います。GUIは作らないです。

流砂の話とか

  • fortranpythonですが、calSectionProfileとinitializeを呼んでます。いろいろ試していると、fortranの共有部分でallocateしたものが、ずっと残ってしまうので、計算が終わるごとにdeallocateしたほうが良さそうです。また、まとめて報告します。

  • XeonGPUとか使いたいのですが、まだまだ計算の力が追いついてないです。すごいコードができから回したいですね。

  • 今年最後になると思いますが、ゆっくりだけどそれなりコードを書いた一年でした。徐々にストックも溜まってきてうれしいです。来年も頑張ります。

断面準二次元モデルの修正方針

  • 自分の中での反省ですが、自分の中では粗度係数はパラメータじゃないと言ってきたのですが、このモデルでは相当粗度を同化するとか言ってるので矛盾していることに気付きました。
  • そこで、相当粗度は、例えば、黒木・岸のΦ-τ*の関係等から断面平均的に小規模河床波に応じた抵抗を設定し、それより流速場を計算し、観測結果との比較により、duneっぽいなとかを議論できるモデルに変更しようと思います。

流砂の話

  • 最近感じるのですが、流砂はDEMじゃ無理だな思います。というのも、河川流では粘性底層の流れでさえも未だに解けていないため、掃流砂や浮遊砂のように明らかに流れ場に影響を与えるようなものに対して、その間隙流を解析することは不可能だと思うからです。
  • 仮に河床にNon-Slip条件を与えて解けるモデルがあれば、粒子の面にもNonslip条件を与えて(IB法とか面白そう)、流れ場とのインタラクションが評価できるので可能と思いますが、流体力学の分野でもまだまだなので、ちょっと遠いかなと思います。
  • 逆にwashloadのような流れ場に影響与えないものはDEMでも可能かと思います。
  • 当面は、掃流砂・浮遊砂は連続体しかないと思ってます。昔流行っていた二層モデルなんかが良いような気がします。
  • 先日ボスと話していたら、流砂研究が人気のない要因は、意味の分からない経験則ばかりだからだと言っていて、確かに流砂の運動方程式がないのはまずいなと思いました。微分方程式がないので、例えば計算で精度を上げようとしても無理ですし、楽しみもないです。流砂は、河道管理の最重要課題なので、何とかしたいものですね。

平面二次元モデル

  • 数ヶ月前の話ですが、例のコロケート格子で流速0の場合に凹凸が消せない件ですが、何かアイデアは浮かびましたでしょうか。私は、どう考えても分からないので非物理的なフィルタで消すことしか思い浮かびません。次回にでも相談させて下さい。

FortranとかPythonとか流砂とか

Fortran + Python

Fortranとの連携

ソースコードだけ見ました。力作ですね。

fortranのcalSectionProfileを呼び出してるということで良いんでしょうか?

Pythonを使ってしまうと、行列の演算は他の言語だとキツくなってきますね。 fortranもライブラリを使えば良いのでしょうが、ちょっとしたものだとどうしてもPythonですね。

楽なのでPythonで書いてしまうのですが、2次元以上だと計算時間が厳しくなって、 結局Fortranで書き換えるのですが、辛いです。

あともはや最近はCを書けなくなってます。ヘッダが書きたくないです。

ソースはWindowsで試してみますね。

matplotによる可視化

可視化が使えるのが良いですね。グラフも綺麗ですし。

仕事では、gnuplotが多いですが、matplotの方がカッコイイです。

会社の人間はあまり新しいプログラミング言語だったり、新しいツールに興味に持つのが難しいようですね。 仕事なので仕方ない部分もありますが。

フリーのコンパイラ

先月PGIのコンパイラにCommunity Editionが出た模様です。

https://www.softek.co.jp/SPG/Pgi/product.html

基本はフリーで使えますが、最新版のみのライセンスのようです。

また、LinuxMacのみでWindowsは対応未定のようです。 PGIはGPUとの連携が強いので、使ってみたいです。

Macでは入れてみましたが、特に問題なく動きました。 動作チェックしかしていないので、実行速度については見ていませんし、 家にGPUマシンがないので、ちゃんと使えてはいませんが。。。

python+fortran:2003+OOP

本業が忙しくて全然だめです。

python+fortran:2003+OOP

以前書いた話の続きですが、pythonからfortranのdllを使うときもやっぱりOOPで書きたいので、チャレンジしてみました。

結果から言うと、main文に共有moduleを設け、その中で共有のclassを設定することにより雰囲気はでました。 C系だとpythonからobjectを渡せるのでこんなことをする必要はないと思いますが、fortranだとこれが限界です。

あと忘れないように書いておくと、fortranのfunctionは使えません。

!file name : test.f90
!class
module classModel
    implicit none
    private    
    type, public :: model
        DOUBLE PRECISION :: x
    contains
        procedure, public :: init
    end type
contains

subroutine init(self, x)
    class(model) :: self
    DOUBLE PRECISION, INTENT(IN) :: x
    self%x = x
end subroutine

end module classModel

!main
module pubMod
    use classModel
    CLASS(model), ALLOCATABLE :: m
end module

subroutine init(x)
    !DEC$ ATTRIBUTES DLLEXPORT :: init
    use pubMod
    DOUBLE PRECISION, INTENT(IN) :: x
    allocate(m)
    call m%init(x)
end subroutine

subroutine plus(y, ans)
    !DEC$ ATTRIBUTES DLLEXPORT :: plus
    use pubMod
    DOUBLE PRECISION, INTENT(IN) :: y
    DOUBLE PRECISION, INTENT(OUT) :: ans
    ans = m%x + y
end subroutine
@echo off
gfortran -std=f2003 -shared -o test.dll test.f90
import numpy as np
from ctypes import *

f = np.ctypeslib.load_library("test.dll",".")

f.init_.argtypes = [POINTER(c_double)]
f.plus_.argtypes = [POINTER(c_double),POINTER(c_double)]

x,y = 2.0 ,1.1
x = c_double(x)
y = c_double(y)
res = c_double()

f.init_(byref(x))
f.plus_(byref(y), byref(res))
print(res.value) # 3.1

del f

DBに置いておくので回してみて下さい。

これを使ってsection2Dモデルの拡張版を書いているので近々公開します。

WindowsFORTRAN環境構築について訂正

先日gfortranの4.8が良いって言いましたが、6.0代も安定してますのでこっちのほうが良さそうです。

64bit の Windows10 上でフリーの fortran コンパイラを導入して、簡単なプログラムを作成する - あらきけいすけの雑記帳

exe一発です。

windowsfortranコンパイル用のmakefileって....

最近知ったのですが、inteのnmakeとgmakeって結構違いますね。どちらでもmake一発でという思いでmakeファイルを書いていたので、残念です。

書く気をなくしました。