[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[dennou-ruby:002024] Re: gphys-0.3.5 released



堀之内です。

> さっそく 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

とします。座標軸以外は値の代入は行わないので、そのままにします。