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

[dennou-ruby:003664] GPhys#cyclic_ext の拡張



堀之内さま, みなさま:

神代です.

以前他の方からも要望があったような気がしますが, 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)