[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[dennou-ruby:002024] Re: gphys-0.3.5 released
- To: dennou-ruby@xxxxxxxxxxx
- Subject: [dennou-ruby:002024] Re: gphys-0.3.5 released
- From: Takeshi Horinouchi <horinout@xxxxxxxxxxxxxxxxxx>
- Date: Mon, 17 Jan 2005 19:01:42 +0900
堀之内です。
> さっそく gphys-0.3.5 の GGraph を使ってみていますが,うまくいかないと
> ころがあるので相談させてください.
...
> としたときに,vx[-1] だけでなく vx[0] も 0.0 から 360.0 に変わっている
> のが原因じゃないかと思います.
ご指摘有難うございます。サイクリック展開メソッド
GPhys#cyclic_ext のバグです。lib/numru/gphys/gphys.rb の
l.365 を
vx = newgp.coord(dim)
から
vx = newgp.coord(dim).copy
に変えれば直ります。うかつでした。
(cvs にはコミットしました)
以下、GPhysユーザーのための背景説明です。cyclic_ext は、以下よう
になってます
def cyclic_ext(dim_or_dimname, modulo)
..略..
if extendible # 上の略した部分で、一つ伸ばせば繋がると判断した場合
dim = @grid.dim_index(dim_or_dimname)
newgp = self.copy[false, [0...vx.length, 0], *([true]*(rank-1-dim))]
vx = newgp.coord(dim).copy
vx[-1] = vx[-1].val + modulo
newgp.axis(dim).set_pos(vx)
return newgp
else
return self
end
end
newgp = self.copy[false, [0...vx.length, 0], *([true]*(rank-1-dim))]
^^^^^^^^^^^^^^^^^^
^^^ をつけた部分で、dim 番目の軸を 0, 1, 2, ..., vx.length-1, 0
と、最後にひとつもとに戻ったのを追加します。ただし、この時点では
追加後オブジェクトのデータは追加前のデータとの関係を知っているだ
けで、新しい配列を生成しませんので、両端の実体は重なっています。
データを読むだけならそれで十分ですが、このままでは一方に書き込む
と他方も変化します。ですから
vx = newgp.coord(dim).copy
^^^^^
によって、参照による結び付きを切って新しいオブジェクトを作った上
で、
vx[-1] = vx[-1].val + modulo
とします。座標軸以外は値の代入は行わないので、そのままにします。