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

[dennou-ruby:004015] Re: 一定値データの図の描画 with DCL



堀之内さま, みなさま

竹広です. 河合さんから dcdvlop に報告された問題に対処したいですが,
master に commit しても構わないでしょうか.

#0 field のコンターでエラーが出るのはストレスなので...

log10_safe の方は, ruby のバージョンが上がって Math::log10 の
エラーが 1.8 から変わっているので問題が生じたのかもしれませんが,
dclext の方も変わっているので問題が起きなくなっているのでは
ないかと想像します. 現在の ruby では Math::log10(0.0) はエラーでなく
-Infinity をかえすようです. 

                    Takepiro(竹広真一)@数理解析研究所. 京都大学
                      	E-mail:takepiro@xxxxxxxxxxxxxx
			       takepiro@xxxxxxxxxxxxxxxxxxxx


At Mon, 17 Apr 2017 09:08:05 +0900,
Shin-ichi Takehiro wrote:
> 
> 河合さん
> 
> 竹広です. サンプルありがとうございます.
> 
> そのままだと一定値場プロットできない問題に先にぶつかって
> エラーで止まりました. ue_linear_levels の対処をして一定値場を
> 描画できるよう対処して試してみましたが, 負の値でも問題なく
> 表示されました. 
> 
> log10_safe の使われかたが変わって問題が顕在化しなくなったように
> 想像してます. 
> 
>                     Takepiro(竹広真一)@数理解析研究所. 京都大学
>                       	E-mail:takepiro@xxxxxxxxxxxxxx
> 			       takepiro@xxxxxxxxxxxxxxxxxxxx
> 
> 
> 
> At Sun, 16 Apr 2017 15:13:51 +0900,
> Kawai Yuta wrote:
> > 
> > 竹広様, 
> > 
> > 河合です. 
> > 
> > 
> > > 竹広です. 少し前の話になりますが, GPhys の log10_safe が
> > > うまく動作しない例, どんなものがありますか. サンプルを
> > > いただけるとありがたいです.
> > 
> > 本当のことは八代さんに聞いてみないとわかりませんが, 
> > コードから想像するに, 
> >   「0 以下の一定値データの図を書くときに, カラーバーを表示させる」
> > と log10_safe の問題に当たるものと思われます. 
> > 
> >   #  dclext.rb の color_bar メソッド内で level_chval_fmt
> >   #  が呼ばれ, level_chval_fmt の内で,  log10_safe が呼ばれます. 
> > 
> > 
> > したがって, 以下のコードが,  gphys 1.5.1 で  log10_safe がうまく動作しない例に
> > なるかと思います. 
> > (すいません. 問題を検証できる環境がすぐには準備できないので, 想像です..)
> > 
> > require "numru/ggraph"
> > include NumRu
> > 
> > x = Axis.new.set_pos(VArray.new(NArray.sfloat(10).indgen!,{"units"=>"1"}, "x"))
> > y = Axis.new.set_pos(VArray.new(NArray.sfloat(10).indgen!,{"units"=>"1"}, "y"))
> > va = VArray.new(NArray.sfloat(10,10), {"units"=>"1"}, "test")
> > gp = GPhys.new(Grid.new(x,y), va)
> > 
> > gp[true,true] = 0.0
> > 
> > DCL.gropn(1)
> > GGraph.tone(gp, true)
> > GGraph.color_bar
> > DCL.grcls
> > 
> > 
> > よろしくお願いします. 
> > 
> > ====================================================
> > 
> > 神戸大学 理学研究科 地球惑星科学専攻
> >   地球および惑星大気科学研究室 博士課程
> > 
> > 理化学研究所 計算科学研究機構
> >    複合系気候科学研究チーム 大学院生リサーチアソシエイト
> > 
> >          河合 佑太
> > e-mail:ykawai@xxxxxxxxxxxxxx
> > 
> > 
> > 
> > 
> > 
> > > 2017/04/16 1:32、Shin-ichi Takehiro <takepiro@xxxxxxxxxxxxxx>のメール:
> > > 
> > > 河合さん
> > > 
> > > 竹広です. 少し前の話になりますが, GPhys の log10_safe が
> > > うまく動作しない例, どんなものがありますか. サンプルを
> > > いただけるとありがたいです.
> > > 
> > >                    Takepiro(竹広真一)@数理解析研究所. 京都大学
> > >                      	E-mail:takepiro@xxxxxxxxxxxxxx
> > > 			       takepiro@xxxxxxxxxxxxxxxxxxxx
> > > 
> > > 
> > > 
> > > 
> > > On Tue, 28 Mar 2017 14:58:59 +0900,
> > > Kawai Yuta wrote:
> > >> 
> > >> 乙部様, 竹広様, (Cc: 関係者の皆様)
> > >> 
> > >> 河合です. 
> > >> 
> > >> ご返信くださりありがとうございます. 
> > >> 
> > >>> 想像ですが, DCL 本体でなく GGraph でのオートスケーリングの方に
> > >>> 問題があるような気がしてます.
> > >> 
> > >> 竹広さんのご指摘のように, gem によってインストールされた
> > >> gphys 最新版(バージョン 1.5.1) に含まれる
> > >> 
> > >>  * ???/ruby/lib/ruby/gems/2.3.0/gems/gphys-1.5.1/lib/numru/dclext.rb
> > >> 
> > >> に問題がありました. 
> > >> # 八代さんから問題箇所を教えてもらいました. 
> > >> 
> > >> 以下の linear level を設定するメソッドで, 例えば max=0, min=0 が引数として与えられた時に, 
> > >> 934 行目で dz がゼロになります. そのため, その後の行でゼロ割りが発生し, 939, 943 行目で 
> > >> infinity に対して round がとられるため例外が発生し, 落ちるようです. 
> > >> 
> > >> 929    def ue_linear_levels(min, max, dx, lbound=false, inf_min=false, inf_max=false)                                                                                                                                                                                     
> > >> 930      if dx > 0                                                                                                                                                                                                                                                        
> > >> 931        dz = dx.to_f                                                                                                                                                                                                                                                   
> > >> 932      else                                                                                                                                                                                                                                                             
> > >> 933        nlev = ( dx==0 ? DCL.ueiget('nlev') : [dx.abs.round, 1].max )                                                                                                                                                                                                  
> > >> 934        dz = DCL.rgnge( (max-min)/nlev.to_f )                                                                                                                                                                                                                          
> > >> 935      end                                                                                                                                                                                                                                                              
> > >> 936                                                                                                                                                                                                                                                                       
> > >> 937      zmin = DCL.irle(min/dz)*dz                                                                                                                                                                                                                                       
> > >> 938      zmax = DCL.irge(max/dz)*dz                                                                                                                                                                                                                                       
> > >> 939      n = ((zmax-zmin)/dz).round                                                                                                                                                                                                                                       
> > >> 940                                                                                                                                                                                                                                                                       
> > >> 941      levels = Array.new                                                                                                                                                                                                                                               
> > >> 942      for i in 0..n                                                                                                                                                                                                                                                    
> > >> 943        x = ((zmin+i*dz)/dz).round * dz                                                                                                                                                                                                                                
> > >> 944        levels.push(x)                                                                                                                                                                                                                                                 
> > >> 945      end
> > >> 
> > >> あともう一点, 対数の処理に関して報告を受けていて, 
> > >> 同ファイルの以下の部分です. 
> > >> 
> > >> 2161    def log10_safe(val)                                                                                                                                                                                                                                                
> > >> 2162      begin                                                                                                                                                                                                                                                            
> > >> 2163        Math::log10(val)                                                                                                                                                                                                                                               
> > >> 2164      rescue Errno::ERANGE                                                                                                                                                                                                                                             
> > >> 2165        nil                                                                                                                                                                                                                                                            
> > >> 2166      end                                                                                                                                                                                                                                                              
> > >> 2167    end                                                                                                                                                                                                                                                                
> > >> 2168                                                                                                                                                                                                                                                                       
> > >> 2169    def log10_or_0(val)                                                                                                                                                                                                                                                
> > >> 2170      log10_safe(val) || 0                                                                                                                                                                                                                                             
> > >> 2171    end    
> > >> 
> > >> log10_or_0 では, 引数 val がゼロ以下の場合には 0 を返すことが期待しますが, 
> > >> そのような場合でも 2170 行目で log10_safe を呼ぶために, 2164 行目の例外処理
> > >> で落ちます. 
> > >> 
> > >> 
> > >>>> 可能ならサンプルをいただけるとチェックしてみたいとは思います
> > >>>> 
> > >>>> できたらシンプルなほうが嬉しいですが,
> > >> 
> > >> 
> > >> 
> > >> $ wget http://itpass.scitec.kobe-u.ac.jp/~ykawai/test.nc
> > >>   # 0 を埋めた 2 次元データです. 
> > >> 
> > >> して頂いて, gphys 最新版(バージョン 1.5.1)をインストールした環境において
> > >> 
> > >> $ gpview test.nc@data
> > >> 
> > >> を実行すると, 上述した ue_linear_levels 内の問題で落ちるようです. 
> > >> 
> > >> よろしくお願いします.  
> > >> 
> > >> 
> > >> ====================================================
> > >> 
> > >> 神戸大学 理学研究科 地球惑星科学専攻
> > >>  地球および惑星大気科学研究室 博士課程
> > >> 
> > >> 理化学研究所 計算科学研究機構
> > >>   複合系気候科学研究チーム 大学院生リサーチアソシエイト
> > >> 
> > >>         河合 佑太
> > >> e-mail:ykawai@xxxxxxxxxxxxxx
> > >> 
> > >> 
> > >> 
> > >> 
> > >> 
> > >>> 2017/03/28 11:27、Shin-ichi Takehiro <takepiro@xxxxxxxxxxxxxx>のメール:
> > >>> 
> > >>> 竹広です.
> > >>> 
> > >>> 想像ですが, DCL 本体でなく GGraph でのオートスケーリングの方に
> > >>> 問題があるような気がしてます. まずは ruby DCL で udcntr/uetone を
> > >>> 使って描画するのと, GGraph の tone, contor を使って描画することを
> > >>> 試して問題を切り分けるのがよいように思います. 
> > >>> 
> > >>> 一定値だけでなく, 全て負の値の場合もうまくいかなかった記憶があるの
> > >>> ですが, 今はどうなってるかな. いっしょに確かめてくれるとありがたいです. 
> > >>> 
> > >>>                   Takepiro(竹広真一)@数理解析研究所. 京都大学
> > >>>                     	E-mail:takepiro@xxxxxxxxxxxxxx
> > >>> 			       takepiro@xxxxxxxxxxxxxxxxxxxx
> > >>> 
> > >>> 
> > >>> At Tue, 28 Mar 2017 09:57:57 +0900,
> > >>> Otobe,naohito wrote:
> > >>>> 
> > >>>> 乙部です.
> > >>>> 
> > >>>> 不思議ですね.
> > >>>> たぶん,それに関連したところは修正していないと思うのですが
> > >>>> 可能ならサンプルをいただけるとチェックしてみたいとは思います
> > >>>> 
> > >>>> できたらシンプルなほうが嬉しいですが,
> > >>>> よろしくお願い足します.
> > >>>> 
> > >>>> 
> > >>>> On 2017/03/27 20:53, Kawai Yuta wrote:
> > >>>>> GPhys, Ruby-DCL, DCL の開発関係者の皆様,
> > >>>>> 
> > >>>>> 河合です.
> > >>>>> 
> > >>>>> お忙しいところ失礼いたします.
> > >>>>> 
> > >>>>> SCALE のとある開発者の方に質問されたのですが,
> > >>>>> 自分では解決策を見つけられず, お助け願います.
> > >>>>> 
> > >>>>> 一定の値が入った NetCDF ファイルを gpview で可視化した時に,
> > >>>>> 過去の DCL のバージョン(6.0.4)では, 真っ白な図(と一定値であることを
> > >>>>> 示すキャプション)が表示されたようなのですが, DCL7 にバージョンを
> > >>>>> 上げたところ,  プログラムが強制終了するようになったらしいです.
> > >>>>> (エラー出力によると DCL_ext.rb の 579 行目付近で落ちているらしいです. )
> > >>>>> 
> > >>>>> これは想定されている動作でしょうか?
> > >>>>> あるいは, 何か良い対処法はありませんでしょうか?
> > >>>>> # 以前に, 議論されていたらすいません…
> > >>>>> 
> > >>>>> # 応急処置として, gpview 実行時に ―range 0:100 を指定すると, プログラムは
> > >>>>> # 異常終了することなく, 図は描画されました. (―range 0:0 と指定した場合は,
> > >>>>> # 異常終了してしまいます.)
> > >>>>> 
> > >>>>> よろしくお願いします.
> > >>>>> 
> > >>>>> 
> > >>>>> ====================================================
> > >>>>> 
> > >>>>> 神戸大学 理学研究科 地球惑星科学専攻
> > >>>>> 地球および惑星大気科学研究室 博士課程
> > >>>>> 
> > >>>>> 理化学研究所 計算科学研究機構
> > >>>>>  複合系気候科学研究チーム 大学院生リサーチアソシエイト
> > >>>>> 
> > >>>>>        河合 佑太
> > >>>>> e-mail:ykawai@xxxxxxxxxxxxxx
> > >>>>> 
> > >>>>> 
> > >>>>> 
> > >>>>> 
> > >>>>> 
> > >>>> 
> > >>>> -- 
> > >>>> ==================================================
> > >>>> 福岡大学 理学部 地球圏科学教室
> > >>>> Otobe,Naohito (E-Mail:otobe@xxxxxxxxxxxxxx)
> > >>>> ==================================================
> > >>>> 
> > >> 
> > 
>