[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[dennou-ruby:003664] GPhys#cyclic_ext の拡張
- To: dennou-ruby@xxxxxxxxxxx
- Subject: [dennou-ruby:003664] GPhys#cyclic_ext の拡張
- From: Tsuyoshi Koshiro <koshiro@xxxxxxxxxxxxxx>
- Date: Fri, 13 Dec 2013 23:32:45 +0900
堀之内さま, みなさま:
神代です.
以前他の方からも要望があったような気がしますが, GPhysで経度方向に
サブセットを取る場合, たとえば0-360度でデータが格納されているとき
に, 0度をまたいだ領域を取りたいことがよくあって, 困ります.
これを簡単にできるように, cyclic_ext メソッドを拡張したらどうかな
と思いました.
cyclic_ext の最後にいくつ伸ばすかの引数を新しく加えます. デフォル
トを1にしておけば, 既存プログラムの変更は不要です.
実用的には, 単純に2倍の範囲にする cyclic_ext2 を用意しておいて,
それをさらに cut で経度範囲指定, という感じで使えば, あまり悩まず
にさくっとできるかなと思います.
そのように実装してみたパッチを添付します. いかがでしょうか...?
--
神代 剛 (こうしろ つよし)
気象研究所気候研究部第四研究室 支援研究員
--- gphys.rb_old 2013-11-14 13:39:23.000000000 +0900
+++ gphys.rb 2013-12-13 16:00:20.000000000 +0900
@@ -953,7 +953,7 @@
end
alias shape shape_current
- def cyclic_ext(dim_or_dimname, modulo)
+ def cyclic_ext(dim_or_dimname, modulo, addlen=1)
# Cyclic extention to push the first element after the last element
# if appropriate.
@@ -963,6 +963,9 @@
vx = coord(dim_or_dimname)
return self if vx.length <= 1
+ return self if addlen < 1
+ addlen = vx.length if addlen > vx.length
+
vvx = vx.val
width = (vvx[-1] - vvx[0]).abs
dx = width / (vx.length-1)
@@ -972,9 +975,9 @@
if extendible
dim = @grid.dim_index(dim_or_dimname)
- newgp = self.copy[false, [0...vx.length, 0], *([true]*(rank-1-dim))]
+ newgp = self.copy[false, [0...vx.length, 0...addlen], *([true]*(rank-1-dim))]
vx = newgp.coord(dim).copy
- vx[-1] = vx[-1].val + modulo
+ vx[-addlen..-1] = vx[-addlen..-1].val + modulo
newgp.axis(dim).set_pos(vx)
return newgp
else
@@ -982,6 +985,11 @@
end
end
+ def cyclic_ext2(dim_or_dimname, modulo)
+ vx = coord(dim_or_dimname)
+ cyclic_ext(dim_or_dimname, modulo, vx.length)
+ end
+
def self.each_along_dims(gphyses, loopdims)
if !gphyses.is_a?(Array)
gphyses = [gphyses] # put in an Array (if a single GPhys)