GPhys ¥Á¥å¡¼¥È¥ê¥¢¥ë

ËÙÇ·Æâ Éð

ºîÀ®: 2003ǯ8·î

ºÇ½ª²þÄû: 2006ǯ8Æü


Ìܼ¡

  1. ¤Ï¤¸¤á¤Ë
  2. ¥É¥­¥å¥á¥ó¥È
  3. ¥ê¥ó¥¯
  4. ¥¤¥ó¥¹¥È¡¼¥ë
  5. ËÜ¥Á¥å¡¼¥È¥ê¥¢¥ë¤ÇÍѤ¤¤ë¥Ç¡¼¥¿
  6. ¤È¤ê¤¢¤¨¤º²Ä»ë²½
  7. ÍÍ¡¹¤Ê¥Õ¥¡¥¤¥ë·Á¼°
  8. irb¤òÍѤ¤¤¿ÂÐÏÃÍøÍÑ(1)
  9. GPhys¤ÎÃæ¿È¤òÄ´¤Ù¤ë
  10. ¥Ç¥£¥ì¥¯¥È¥ê¡¼¤ò¥Ö¥é¥¦¥º -- GDir¤ÎÍøÍÑ
  11. irb¤òÍѤ¤¤¿ÂÐÏÃÍøÍÑ(2)
  12. ¥Ç¡¼¥¿Áàºî¤Î´ðÁÃ
  13. ʪÍýÎ̤Îñ°Ì
  14. ¥Ç¡¼¥¿¤ò¥Õ¥¡¥¤¥ë¤Ë½ñ½Ð¤¹
  15. µðÂç¥Ç¡¼¥¿¤Î°·¤¤
  16. ʬ³ä¥Õ¥¡¥¤¥ë¤ò¥Ð¡¼¥Á¥ã¥ë¤Ë¤Ò¤È¤Þ¤È¤á
  17. GGraph¤ò»È¤¤¤³¤Ê¤¹(¤½¤Î1)
  18. GGraph¤ò»È¤¤¤³¤Ê¤¹(¤½¤Î2)
  19. ±ó³Ö¥Ç¡¼¥¿¤Ë¥¢¥¯¥»¥¹¤¹¤ë¡¿¤µ¤»¤ë

¤Ï¤¸¤á¤Ë


GPhys¤È¤Ï, ʪÍýÎ̤Υǡ¼¥¿¤ò°·¤¦¤¿¤á¤Î¥¯¥é¥¹¤Ç¤¢¤ë. ¤³¤³¤ÇÁÛÄꤷ¤Æ¤¤ ¤ë¤Î¤Ï, ³Ê»Ò¾õ¤ËÎ¥»¶²½¤µ¤ì¤¿Ï¢Â³ÂΤÎʪÍýÎ̤Ç, ³Ê»ÒÅÀ¤Ë´Ø¤¹¤ë½ô¾ðÊó¤È³Æ ÅÀ¤Ë¤ª¤±¤ëʪÍýÎ̤ÎÃÍ, ¤µ¤é¤Ë¤½¤ÎʪÍýÎ̤˴ؤ¹¤ëÉÕ²ÃŪ¤Ê¾ðÊ󤫤é¤Ê¤ë. ¾ÜºÙ¤ÏÄɤ¤Äɤ¤ÀâÌÀ¤¹¤ë¤È¤·¤Æ, GPhys ¤Ï¤³¤ó¤Ê»þ¤ËÊØÍø¤Ç¤¢¤ë.

GPhys ¤¬°·¤¨¤ë¥Õ¥¡¥¤¥ë·Á¼°¤Ïº£¤Î¤È¤³¤í NetCDF, GrADS, grib ¤Î3¤Ä¤Ç¤¢¤ë. grib ¤Î¥µ¥Ý¡¼¥È¤Ï GPhys 0.4.0 ¤«¤é¤È¤Ê¤ë. ¾­ÍèŪ¤Ë¤Ï¥µ¥Ý¡¼¥È¤¹¤ë·Á¼°¤òÁý¤ä¤·¤¿¤¤¤È¹Í¤¨¤Æ¤¤¤ë.


ËÜ¥Á¥å¡¼¥È¥ê¥¢¥ë¤Ç¤Ï, 2ÈÖÌܤΥ·¥ß¥å¥ì¡¼¥·¥ç¥ó¤Ë¤Ï¿¨¤ì¤º, ²Ä»ë²½¤òÃæ¿´¤Ë, ´û¤Ë¥Õ¥¡¥¤¥ë¤Ë¤Ê¤Ã¤Æ¤¤¤ë¥Ç¡¼¥¿¤Î°·¤¤¤Ë½¸Ã椹¤ë¤³¤È¤Ë¤¹¤ë. ¥Ç¡¼¥¿¤Ï´ðËÜŪ¤Ë¥í¡¼¥«¥ë¥Û¥¹¥È¤Ë¸ºß¤¹¤ë¤â¤Î¤ò°·¤¦¤¬, ±ó³Ö¥Û¥¹¥È¤Ë¸ºß¤¹¤ë¥Ç¡¼¥¿¤Ë¥¢¥¯¥»¥¹¤¹¤ë, ¤´¤¯´Êñ¤Ê¥µ¡¼¥Ð¡¼¤È¥¯¥é¥¤¥¢¥ó¥È¤ÎÎã¤â¼¨¤¹.


°Ê²¼¤Ç¤Ï GPhys ¤ËÉÕ°¤ÎÉÁ²è¥é¥¤¥Ö¥é¥ê¡¼ GGraph ¤ò»È¤Ã¤¿Î㤬¿¤¯½Ð¤Æ¤¯¤ë. ¤·¤«¤·, GGraph ¤Ï, ¤¢¤¯¤Þ¤Ç GPhys ¤ÎÍøÍÑÎã¤Î°ì¤Ä¤È¤¤¤¦Î©¾ì¤Ë¤Ê¤Ã¤Æ¤ª¤ê, GPhys ¤Îɬ¿Ü¹½À®Í×ÁǤǤϤʤ¤. ¤³¤Î¤¿¤á, GPhys ¼«ÂÎ¤Ï GGraph ¤È¤½¤Î²¼ÀÁ¤±¤Î RubyDCL ¤¬¤Ê¤¯¤Æ¤âưºî¤¹¤ë(¤½¤Î¾ì¹ç¤Ï ¤³¤³ ¤Ë½ñ¤¤¤¿¤è¤¦¤Ë, require "numru/gphys" ¤È¤¤¤¦·Á¤Ç»È¤¦). GPhys ¤ÎÍøÍѼԤÏ, GGraph ¤È¤ÏÆÈΩ¤Ë, ¼«Ê¬¼«¿È¤Î ÉÁ²è¥é¥¤¥Ö¥é¥ê¡¼¤ò³«È¯¤¹¤ë¤³¤È¤¬¤Ç¤­¤ë. Î㤨¤Ð¥°¥é¥Õ¥£¥«¥ë¥æ¡¼¥¶¡¼¥¤¥ó¥¿¡¼¥Õ¥§¡¼¥¹¤Î gave ¤Ï, GGraph ¤òÍѤ¤¤Æ¤¤¤Ê¤¤.


ÍѤ¤¤¿ GPhys ¤Î¥Ð¡¼¥¸¥ç¥ó


ËÜ¥Á¥å¡¼¥È¥ê¥¢¥ë¤Î¥µ¥ó¥×¥ë¥×¥í¥°¥é¥à¤Ï, GPhys-0.4.0 ¤Ç¼Â¹Ô¡¦³Îǧ¤·¤¿¤¬¡¤°ìÉô¤Ï GPhys-0.5.0 ¤Î¿·µ¡Ç½¤ò»È¤Ã¤Æ¤ª¤ê¡¤0.5.0 ¤Ç³Îǧ¤·¤¿¡Ê´Ø·¸¤¹¤ë¤Î¤Ï GDir ¤Ë´Ø¤ï¤ë²Õ½ê ¤Ç¤¢¤ê¡¤ËÜÊ¸Ãæ¤ËÌÀ¼¨¤·¤Æ¤¢¤ë¡Ë¡¥¤Þ¤¿¡¤Â¿¤¯¤Î¥×¥í¥°¥é¥à¤Ï 0.3.5 ¤Ç¤âưºî¤¹¤ë.


¥É¥­¥å¥á¥ó¥È


GPhys ¤Î¥ì¥Õ¥¡¥ì¥ó¥¹¥Þ¥Ë¥å¥¢¥ë¤Ï¤³¤³¤Ë¤¢¤ë¡§

¸½ºß¤Î¤È¤³¤íÉôʬŪ¤Ë¤·¤«ºîÀ®¤µ¤ì¤Æ¤¤¤Ê¤¤¤¬, ¸å½Ò¤¹¤ëÉÁ²è¥é¥¤¥Ö¥é¥ê¡¼ GGraph ¤Î¥Þ¥Ë¥å¥¢¥ë¤ÏÀ°È÷¤µ¤ì¤Æ¤¤¤ë.



¥ê¥ó¥¯


¥¤¥ó¥¹¥È¡¼¥ë


¥Ñ¥Ã¥±¡¼¥¸¤Î¥¤¥ó¥¹¥È¡¼¥ë

´ö¤Ä¤«¤ÎOS¤Ë¤ª¤¤¤Æ¤Ï, °Í¸¥é¥¤¥Ö¥é¥ê¡¼¤â´Þ¤á¤Æ¼«Æ°¤Ç¥¤¥ó¥¹¥È¡¼¥ë¤¹¤ë¤³¤È¤¬¤Ç¤­¤ë. ÅÅǾRubyÆüËܸì¥Û¡¼¥à¥Ú¡¼¥¸ ¤Î¡Ö¥¤¥ó¥¹¥È¡¼¥ë¥¬¥¤¥É¡×¥³¡¼¥Ê¡¼¤ò»²¾È¤Î¤³¤È.

¥½¡¼¥¹¤«¤é¤Î¥¤¥ó¥¹¥È¡¼¥ë

°Ê²¼, GPhys ¤Î¥Ð¡¼¥¸¥ç¥ó¤Ï 0.3.0 ¤Ç¤¢¤ë¤È¤¹¤ë. GPhys ¤Ï Ruby ¤À¤±¤Ç½ñ¤«¤ì¤Æ¤¤¤ë¤Î¤Ç, ¥¤¥ó¥¹¥È¡¼¥ë¤ÏŬÅö¤Ê¥Ñ¥¹¤Ë¥³ ¥Ô¡¼¤¹¤ë¤À¤±¤Ç¤¢¤ë. °Ê²¼¤Ï¤½¤ì¤ò¹Ô¤¦¡§
% tar xvzf gphys-0.4.0.tar.gz 
% cd gphys-0.4.0
% ruby install.rb

¤¿¤À¤·, ¤½¤ÎÁ°¤Ë¤¤¤í¤¤¤í¥¤¥ó¥¹¥È¡¼¥ë¤·¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¤â¤Î¤¬¤¢¤ë. ¾Ü¤·¤¯¤Ï GPhys¥Û¡¼¥à¥Ú¡¼¥¸¤ò»²¾È¤µ¤ì¤¿¤¤. ɬÍ×¤Ê¤Î¤Ï NArray, NArrayMiss, RubyNetCDF, RubyDCL ¤Ç¤¢¤ë. FFT¤Îµ¡Ç½¤ÎÃæ¤Ë¤Ï RubyFFTW3 ¤òÍפ¹¤ë¤â¤Î¤â¤¢¤ë. ¾å½Ò¤Î¤è¤¦¤Ë, ²Ä»ë²½¤·¤Ê¤¤¤Ê¤é RubyDCL ¤Ï¤Ê¤¯¤Æ¤â¤è¤¤.



ËÜ¥Á¥å¡¼¥È¥ê¥¢¥ë¤ÇÍѤ¤¤ë¥Ç¡¼¥¿


NetCDF¥Ç¡¼¥¿


GPhys ¤ÎÇÛÉۥѥ屡¼¥¸¤Ë¤Ï¥Æ¥¹¥ÈÍѤË, T.jan.nc¤È¤¤¤¦ NetCDF¥Õ¥¡¥¤¥ë¤¬´Þ¤Þ¤ì¤Æ¤¤¤ë¤Î¤Ç, ¤½¤ì¤ò»È¤¦¤³¤È¤Ë¤¹¤ë (testdata¤È¤¤¤¦¥µ¥Ö¥Ç¥£¥ì¥¯¥È¥ê¤Ë¤¢¤ë). Ʊ¤¸¤â¤Î¤Ï, ¤³¤³¤«¤é¤â¥À¥¦¥ó¥í¡¼¥É½ÐÍè¤ë. Ãæ¿È¤Ï NCEP ºÆ²òÀϤˤè¤ë, Á´µå¤Îµ¤²¹¤Î1·î¤Îµ¤¸õÃͤǤ¢¤ë. ¤³¤Î¥Õ¥¡¥¤¥ë¤òºî¶ÈÍѤΥǥ£¥ì¥¯¥È¥ê¡¼¤Ë¥³¥Ô¡¼¤·, °Ê²¼¤Î¥á¥Ë¥å¡¼¤Ï ¤½¤³¤Ç¼Â¹Ô¤¹¤ë¤â¤Î¤È¤¹¤ë.


¤Þ¤º¤Ï, ¤³¤Î¥Õ¥¡¥¤¥ë¤Î³µÍפò¸«¤è¤¦. NetCDFÉÕ°¤Î¥³¥Þ¥ó¥É ncdump ¤òÍѤ¤¤ë.
% ncdump -c T.jan.nc 
netcdf T.jan {
dimensions:
        lon = 36 ;
        lat = 19 ;
        level = 9 ;
variables:
        float lon(lon) ;
                lon:units = "degrees_east" ;
                lon:long_name = "Longitude" ;
                lon:actual_range = 0.f, 357.5f ;
        float lat(lat) ;
                lat:units = "degrees_north" ;
                lat:actual_range = 90.f, -90.f ;
                lat:long_name = "Latitude" ;
        float level(level) ;
                level:units = "millibar" ;
                level:long_name = "Level" ;
                level:positive = "down" ;
                level:GRIB_id = 100s ;
                level:GRIB_name = "hPa" ;
                level:actual_range = 10.f, 1000.f ;
        float T(level, lat, lon) ;
                T:long_name = "Monthly Mean Air temperature" ;
                T:actual_range = -72.66724f, -24.35f ;
                T:units = "degC" ;
                T:add_offset = 0.f ;
                T:scale_factor = 1.f ;
                T:missing_value = -9.96921e+36f ;
..ÃæÎ¬..

data:

 lon = 0, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 110, 120, 130, 140, 150, 
    160, 170, 180, 190, 200, 210, 220, 230, 240, 250, 260, 270, 280, 290, 
    300, 310, 320, 330, 340, 350 ;

 lat = 90, 80, 70, 60, 50, 40, 30, 20, 10, 0, -10, -20, -30, -40, -50, -60, 
    -70, -80, -90 ;

 level = 1000, 850, 600, 400, 250, 150, 70, 30, 10 ;
}

¥ª¥ê¥¸¥Ê¥ë¤Î NCEP ¥Ç¡¼¥¿¤Ï¿åÊ¿¤Ë 2.5 ÅÙ¤Îʬ²òǽ¤Ç¤¢¤ë¤¬, ¤³¤³¤Ç¤ÏÁƤ¯¤·¤Æ¥Ç¡¼¥¿¥µ¥¤¥º¤ò²¡¤¨¤Æ¤¢¤ë. ±ôľÊý¸þ¤Ë¤â¥Ç¡¼¥¿¤ò´Ö°ú¤¤¤Æ¤¢¤ë. µ¤²¹ T ¤Ï·ÐÅÙ, °ÞÅÙ, °µÎϤΣ³¼¡¸µ¥Ç¡¼¥¿¤Ç, ¤â¤Ã¤È¤â¡Ö®¤¯¤Þ¤ï¤ë¡×¤Î¤Ï ·ÐÅÙ¼´¤Ç¤¢¤ë. ncdump ¤Î¼¡¸µ¤Îɽ¼¨¤Ï C ¸À¸ì¤Î¥¹¥¿¥¤¥ë¤Ç¤¢¤ë¤Î¤Ç, T(level, lat, lon) ¤Ç¤¢¤ë¤¬, Ruby ¤Î¿¼¡¸µ¥Ç¡¼¥¿¤Ç¤Ï ¤½¤ÎµÕ¤Ë lon, lat, level ¤Î½çÈ֤Ǽ¡¸µ¤òÊÂ¤Ù¤ë ¡Ê¤³¤ì¤Ï NArray ¤Î¥¹¥¿¥¤¥ë¤Ç¤¢¤ê, RubyNetCDF ¤ä GPhys Åù, Á´¤Æ¤Î¿¼¡¸µ¥Ç¡¼¥¿¥é¥¤¥Ö¥é¥ê¡¼¤¬½¾¤Ã¤Æ¤¤¤ë. ¤è¤Ã¤Æ, Fortran¤ÈƱ¤¸Ê¤ÙÊý¤Ç¤¢¤ë¤¬, ÇÛÎóź»ú¤Ï Ruby ¤Î Array ¥¯¥é¥¹¤Ë¹ç¤ï¤»¤Æ¤¢¤ê, ¾ï¤Ë¥¼¥í¤«¤é»Ï¤Þ¤ë¡Ë. ·ÐÅÙ, °ÞÅÙ, ¹âÅ٤γʻÒÅÀÃͤÏ, ¼¡¸µÌ¾¤ÈƱ¤¸Ì¾Á°¤ò»ý¤Ä°ì¼¡¸µÊÑ¿ô lon, lat, level ¤Ë³ÊǼ¤µ¤ì¤Æ¤¤¤ë.


GrADS¥Ç¡¼¥¿


¾åµ­¤Î NetCDF ¥Ç¡¼¥¿¤È´ðËÜŪ¤ËƱ¤¸ÆâÍÆ¤Î¤â¤Î¤ò GrADS ·Á¼°¤Ç¤âÍѰդ·¤Æ¤¢¤ë. ¤³¤ì¤â GPhys ¤ÎÇÛÉۥѥ屡¼¥¸¤Ë´Þ¤Þ¤ì¤Æ¤¤¤ë. GrADS ¤Î¾ì¹ç, ¥Æ¥­¥¹¥È·Á¼°¤Î¥³¥ó¥È¥í¡¼¥ë¥Õ¥¡¥¤¥ë¤È, ¥Ð¥¤¥Ê¥ê¡¼¤Î¥Ç¡¼¥¿¥Õ¥¡¥¤¥ë¤Ëʬ¤«¤ì¤Æ¤¤¤ë. ¸å½Ò¤Î¤è¤¦¤ËÆÉ¤ß¹þ¤ß¤Î¤¿¤á¤Î¥Ö¡¼¥È¥¹¥È¥é¥Ã¥×¤Ë»È¤¦¤Î¤Ï¥³¥ó¥È¥í¡¼¥ë¥Õ¥¡ ¥¤¥ë¤Î¤Û¤¦¤Ç¤¢¤ë. ¥Ç¡¼¥¿¥Õ¥¡¥¤¥ë¤ÏƱ¤¸¥Ç¥£¥ì¥¯¥È¥ê¡¼¤Ë¥À¥¦¥ó¥í¡¼¥É¤·¤Æ¤ª¤¯É¬ÍפϤ¢¤ë¤¬, °Ê¸å¤Ï¥Õ¥¡¥¤¥ë̾¤Ï˺¤ì¤Æ¤¤¤¤.

grib¥Ç¡¼¥¿


¾åµ­¤Î NetCDF ¥Ç¡¼¥¿¤È´ðËÜŪ¤ËƱ¤¸ÆâÍÆ¤Î¤â¤Î¤ò grib (ver.1) ·Á¼°¤Ç¤âÍѰդ·¤Æ¤¢¤ë. ¤³¤ì¤â GPhys ¤ÎÇÛÉۥѥ屡¼¥¸¤Ë´Þ¤Þ¤ì¤Æ¤¤¤ë. grib ·Á¼°¤ËÂбþ¤·¤Æ¤¤¤ë¤Î¤Ï GPhys 0.4.0 °Ê¹ß¤Ç¤¢¤ë. grib ver.2 ¤Ï¥µ¥Ý¡¼¥È¤·¤Æ¤Ê¤¤. ¼ÂºÝÌäÂê¤È¤·¤Æ¤Ï, º£¤Î¤È¤³¤í grib 2 ¤Ï¤¢¤Þ¤ê»È¤ï¤ì¤Æ¤ª¤é¤º, ¿¤¯¤Î¥½¥Õ¥È¤¬Âбþ¤·¤Æ¤Ê¤¤.


¤È¤ê¤¢¤¨¤º²Ä»ë²½


ºÇ®ÉÁ²è(¥³¥ó¥¿¡¼)


Áᮿޤò½ñ¤¤¤Æ¤ß¤è¤¦. GPhys ÇÛÉۥѥ屡¼¥¸¤Ë¤Ï, GPhys²Ä»ë²½ÍѤΠ¥°¥é¥Õ¥£¥Ã¥¯¥é¥¤¥Ö¥é¥ê¡¼ GGraph ¤¬´Þ¤Þ¤ì¤Æ¤¤¤ë¤Î¤Ç, ¤½¤ì¤òÍѤ¤¤ë¤³¤È¤Ë¤¹¤ë. GGraph ¤Ï¥â¥¸¥å¡¼¥ë¤È¤Ê¤Ã¤Æ¤ª¤ê, ÉÁ²è¥á¥½¥Ã¥É¤ò¥â¥¸¥å¡¼¥ë´Ø¿ô¤È¤·¤ÆÄó ¶¡¤¹¤ë. Î㤨¤Ð¥³¥ó¥¿¡¼¿Þ¤ò½ñ¤¯¥á¥½¥Ã¥É(¥â¥¸¥å¡¼¥ë´Ø¿ô)¤Ï GGraph::contour ¤Ç¤¢¤ë. ¤Ê¤ª, GPhys ¤â GGraph ¤â, ¾¤Î ÅÅǾ Ruby ¥é¥¤¥Ö¥é¥ê¡¼Æ±ÍÍ, NumRu ¤È¤¤¤¦¥â¥¸¥å¡¼¥ë¤ËÆþ¤ì¤Æ ̾Á°¶õ´Ö¤òÊݸ¤Æ¤¢¤ë. ¤è¤Ã¤Æ, ¥Õ¥ë¥Í¡¼¥à¤Ï NumRu::GPhys, NumRu::GGraph ¤Ê¤É¤È¤Ê¤ë.


GGraph¤Ë¤ª¤±¤ë£²¼¡¸µÉÁ²è¥á¥½¥Ã¥É(contour, tone) ¤Ç¤Ï, Í¿¤¨¤é¤ì¤¿¥Ç¡¼¥¿¤¬£³¼¡¸µ°Ê¾å¤Ê¤é, 3,4,..¼¡¸µÌܤˤĤ¤¤Æ¤Ï ºÇ½é¤Î³Ê»ÒÅÀ¤ò¼«Æ°Åª¤ËÁª¤Ö¤è¤¦¤Ë¤Ê¤Ã¤Æ¤¤¤ë. ½¾¤Ã¤Æ, °Ê²¼¤Î¥×¥í¥°¥é¥à¤Ï, 3¼¡¸µÌܤκǽé¤Î³Ê»ÒÅÀ¡áºÇ²¼ÁØ(1000hPa)¤Îµ¤²¹¤òɽ¼¨¤¹¤ë (¹ÔÈÖ¹æ¤ÏÀâÌÀ¤ÎÊØ¤Î¤¿¤á¤ËÉÕ¤±¤Æ¤¢¤ë. ¼ÂºÝ¤Ë¤Ï´Þ¤Þ¤ì¤Ê¤¤).

contour1000mb_1.rb
1: require "numru/ggraph"
2: include NumRu
3: gphys = GPhys::IO.open('T.jan.nc', 'T')
4: DCL.gropn(1)
5: DCL.sgpset('lcntl', false) ; DCL.uzfact(0.7)
6: GGraph.contour( gphys )
7: DCL.grcls

°Ê²¼¤Î¤è¤¦¤Ë¼Â¹Ô¤¹¤ë.
% ruby contour1000mb_1.rb

¤¹¤ë¤È, ¼¡¤Î¿Þ¤¬²èÌ̤Ëɽ¼¨¤µ¤ì¤ë.


contour1000mb_1.rb¼Â¹Ô·ë²Ì

¾åµ­¥×¥í¥°¥é¥à¤ÎÂè1, 2¹ÔÌܤÏËè²ó¸Æ¤Ö¤ª¤Þ¤¸¤Ê¤¤¤Ç¤¢¤ë. ºÇ½é¤Îrequire "numru/ggraph" ¤ÏɬÍפʥ饤¥Ö¥é¥ê¡¼¤ò Á´¤Æ¥í¡¼¥É¤¹¤ë. ¼¡¤Îinclude NumRu ¤Ï¤·¤Ê¤¯¤Æ¤â¤è¤¤¤¬, ¤½¤Î¾ì¹ç GGraph¤ä DCL ¤Ï¤¹¤Ù¤Æ ¥Õ¥ë¥Í¡¼¥à, ¤Ä¤Þ¤ê NumRu::GGraph ¤ä NumRu::DCL ¤Ç¸Æ¤Ð¤Í¤Ð¤Ê¤é¤Ê¤¤.


Âè3¹ÔÌÜ gphys = GPhys::IO.open('T.jan.nc', 'T') ¤Ç¤Ï, ¥Õ¥¡¥¤¥ë T.jan.nc Ãæ¤ÎÊÑ¿ô T ¤ËÂФ·, GPhys ¥ª¥Ö¥¸¥§¥¯¥È¤ò¹½À®¤·, ÊÑ¿ô̾ gphys ¤ò³ä¤êÅö¤Æ¤Æ¤¤¤ë. GPhys::IO.open ¤Ï¥Õ¥¡¥¤¥ë¤Î¼ïÎà¤ò¼«Æ°È½Ê̤·, ¤½¤ì¤¾¤ì¤ËÂбþ¤·¤¿¥â¥¸¥å¡¼¥ë¤Ë½èÍý¤òÅꤲ¤ë. º£²ó¤Ï NetCDF ¤Ç¤¢¤ë¤¿¤á, ¼ÂºÝ¤Ë¤Ï GPhys::NetCDF_IO.open ¤¬¸Æ¤Ð¤ì¤ë. ¤³¤³¤Ç, ¥â¥¸¥å¡¼¥ë GPhys::NetCDF_IO ¤Ï NetCDF ¥Õ¥¡¥¤¥ë¤Î²ò¼á¤ò»Ê¤ë. ¥æ¡¼¥¶¡¼¤¬ÆÃ¤Ë»ØÄꤷ¤Ê¤¤¸Â¤ê, NetCDF¥æ¡¼¥¶¡¼¥º¥¬¥¤¥É¤Ë½¾¤Ã¤¿¥³¥ó¥Ù¥ó¥·¥ç¥ó²ò¼á¤¬¹Ô¤ï¤ì¤ë. ¨¤Á, ¼¡¸µÌ¾¡áÊÑ¿ô̾¤Î¥ë¡¼¥ë¤Ë§¤Ã¤ÆºÂɸÊÑ¿ô(lon, lat, level)¤â²ò¼á¤µ¤ì, GPhys ¥ª¥Ö¥¸¥§¥¯¥È (¤³¤³¤Ç¤ÏÊÑ¿ô̾gphys) Æâ¤Ë»²¾È¤¬ÊÝ»ý¤µ¤ì¤ë. ¥Ç¡¼¥¿·ç»¤Ë¤Ä¤¤¤Æ¤â²ò¼á¤¬¹Ô¤ï¤ì, °À­ valid_range ¤ä missing_value ¤¬»ØÄꤵ¤ì¤Æ¤¤¤ë¾ì¹ç, ·ç»¤Î¸ºß¤ò¹Íθ¤¹¤ë. ¶ñÂÎŪ¤Ë¤ÏÃͤò¼è½Ð¤¹ºÝ¡Ê¸å½Ò¡Ë¤Ï·ç»ÃÍÉդΠNArray ¤¿¤ë NArrayMiss ¥¯¥é¥¹¤Î¥ª¥Ö¥¸¥§¥¯¥È¤¬ÊÖ¤ë¤è¤¦¤Ë¤Ê¤ë.


Âè4¹ÔÌÜ DCL.gropn(1) ¤Ï, DCL ¤Î¥°¥é¥Õ¥£¥Ã¥¯ÁõÃÖ½é´ü²½¤Ç¤¢¤ë. °ú¿ô¤¬ 1 ¤Î¾ì¹ç, üËö²èÌ̤Ëɽ¼¨¤µ¤ì¤ë. Âè5¹ÔÌܤÏÄ̾ïɬÍפʤ¤¤¬, ¤³¤³¤Ç¤ÏÀ©¸æÊ¸»ú¤Î ²ò¼á¤òÍÞÀ©¤·(DCL.sgpset('lcntl', false) ¥¢¥ó¥À¡¼¥¹¥³¥¢¡¼ Åù¤¬ÆÃ¼ìʸ»ú¤È¤·¤Æ²ò¼á¤µ¤ì¤Ê¤¤¤è¤¦¤Ë¤¹¤ë), ºÂɸ¼´¤Ë¤Ä¤±¤ëʸ»ú¤ÎÂ礭¤µ¤ò 0.7 Çܤˤ·¤Æ¤¤¤ë (DCL.uzfact(0.7)).


Âè6¹ÔÌܤǤ¤¤è¤¤¤èÉÁ²è¤Ç¤¢¤ë. GGraph.contour(gphys) ¤Ï, °ú¿ô¤ËÍ¿¤¨¤é¤ì¤¿ GPhys ¥ª¥Ö¥¸¥§¥¯¥È¤Î¥Ç¡¼¥¿¤òÅù¹âÀþɽ¼¨¤¹¤ë. Á°½Ò¤Î¤è¤¦¤Ë, £³¼¡¸µÌܰʹߤ˴ؤ·¤Æ¤Ï¼«Æ°Åª¤ËºÇ½é¤ÎÅÀ¤¬Áª¤Ð¤ì¤ë¤Î¤Ç, 1000 mb ¤Ë¤ª¤±¤ë¿åʿʬÉۤΥץí¥Ã¥È¤È¤Ê¤ë. 1000 mb ¤¬Áª¤Ð¤ì¤¿¤³¤È¤Ï, ¿Þ¤Î±¦¾å¤ÎÏȳ°¤Ëɽ¼¨¤µ¤ì¤¿ level=1000 milibar¤Îɽ¼¨¤«¤é¤ï¤«¤ë. ¿Þ¤«¤é¤ï¤«¤ë¤è¤¦¤Ë, GGraph.contour ¤Ï¼«Æ°Åª¤ËºÂɸ¼´Åù¤Î²ò¼á¤ò¹Ô¤¦¡Êx¼´, y¼´¤¬Àµ¤·¤¯½ñ¤«¤ì¤Æ¤¤¤ë¤³¤È¤ËÃí°Õ¡Ë. ¼Â¤Ï, Âè5¹ÔÌܤÇÀ©¸æÊ¸»ú²ò¼á¤òÍÞÀ©¤·¤¿¤Î¤Ï, ɽ¼¨¤µ¤ì¤ë x, y ¼´¤Îñ°Ì¤Ë ¥¢¥ó¥À¡¼¥¹¥³¥¢¡¼¤¬´Þ¤Þ¤ì¤Æ¤¤¤ë¤«¤é¤Ç¤¢¤ë.


Âè7¹ÔÌÜ¤Ï DCL ¤Î½ªÎ»½èÍý¤Ç¤¢¤ë.

°Ê¾å, ɬ¤º¤·¤âɬÍפʤ¤Âè5¹ÔÌܤò½ü¤±¤Ð, Á´Éô¤Ç6¹Ô¤Ç¥Õ¥¡¥¤¥ë¤Î¥ª¡¼ ¥×¥ó¤«¤é²Ä»ë²½, ½ªÎ»½èÍý¤Þ¤Ç¤¬¹Ô¤¨¤ë. ¿Þ¤ò¥«¥¹¥¿¥Þ¥¤¥º¤¹¤ëÊýË¡¤Ï¸å¤Ç½Ò¤Ù¤ë. ¤½¤ÎºÝ, ¥×¥í¥°¥é¥à¤¬µÞ¤ËŤ¯¤Ê¤Ã¤¿¤ê¤·¤Ê¤¤¤Î¤¬¥Ý¥¤¥ó¥È¤Ç¤¢¤ë.


ºÇ®ÉÁ²è(ÀÞ¤ìÀþ)


Ʊ¤¸Í×ÎΤÇÀÞ¤ìÀþ¤òÉÁ¤¤¤Æ¤ß¤è¤¦. ¾å¤Î¥×¥í¥°¥é¥à¤Ç 6 ¹ÔÌܤΠGGraph.contour(gphys) ¤ò GGraph.line(gphys) ¤ËÊѤ¨¤ì¤Ð¤è¤¤. ⤷¤½¤ì¤À¤È£²¼¡¸µÌÜ(°ÞÅÙ)¤Ë´Ø¤·, ºÇ½é¤Î³Ê»ÒÅÀ ¡Ê¤Ä¤Þ¤êË̶ˡˤ¬Áª¤Ð¤ì¤Æ¤·¤Þ¤¤ÌÌÇò¤¯¤Ê¤¤. ¤½¤³¤Ç, ÆüËÜÉÕ¶á¤Î ±ôľ¥×¥í¥Õ¥¡¥¤¥ë¤òÉÁ¤¤¤Æ¤ß¤è¤¦. GPhys¤Î¥á¥½¥Ã¥É cut ¤Ï¼Â¶õ´Ö¤Ç¤ÎÀÚ¤ê½Ð¤·¤ò¹Ô¤¦. ¤³¤ì¤Ï¼¡¸µ¤ò½çÈ֤˻ØÄꤹ¤ëÊýË¡¤È, ¼¡¸µ¤ò̾Á°¤Ç»ØÄꤹ¤ëÊýË¡¤Î£²Ä̤ê¤Î»È¤¤Êý¤¬¤Ç¤­¤ë. °Ê²¼¤Î2¹Ô¤ÏÁ´¤¯Æ±¤¸·ë²Ì¤È¤Ê¤ë.
gp_jpn = gphys.cut(135,35,true)
gp_jpn = gphys.cut('lon'=>135,'lat'=>35)

ºÇ½é¤Î¾ì¹ç¤Î°ú¿ô¤Î»ØÄêÊýË¡¤Ï NArray ¤Î [] ¥á¥½¥Ã¥É¤ÈƱÍͤǤ¢¤ë. ½¾¤Ã¤Æ, ̾Á°¤Ç»ØÄꤷ¤¿¾ì¹ç¤ÈƱÍͤˣ²¼¡¸µ°Ê¾åǤ°Õ¤Î¼¡¸µ¿ô(rank)¤Î¥Ç¡¼¥¿ ¤ËÂбþ¤¹¤ë¤Ë¤Ï, ²¼µ­¤Î¤è¤¦¤Ë true ¤Ç¤Ê¤¯ false ¤Ë¤è¤ë¡Ö¥é¥Ð¡¼¼¡¸µ¡×¤ò»È¤¨¤ÐÎɤ¤. ¥é¥Ð¡¼¼¡¸µ¤ÏǤ°Õ¸Ä¤Î true (Á´ÈϰϤλØÄê) ¤ËÁêÅö¤¹¤ë.
gp_jpn = gphys.cut(135,35,false)

¡Ê;Ã̤À¤¬ yorick ¤È¤¤¤¦¸À¸ì¤Ç¤Ï¥é¥Ð¡¼¼¡¸µ¤Ï .. ¤Èɽ¤»¤ë. ¤Ä¤Þ¤ê (135,35,..) ¤Ê¤É. ¤³¤ÎÊý¤¬¸«¤¿Ìܤ狼¤ê¤ä¤¹¤¤¤¬, Ruby ¤Ç¤Ï .. ¤òÆÈΩ¤µ¤»¤ë¤³¤È¤Ï¤Ç¤­¤Ê¤¤¤Î¤Ç»È¤¨¤Ê¤¤. ¡Ë


¤Ç¤Ï, ¿Þ¤òÉÁ¤¤¤Æ¤ß¤è¤¦.


line_1.rb
1: require "numru/ggraph"
2: include NumRu
3: gphys = GPhys::IO.open('T.jan.nc', 'T')
4: DCL.gropn(1)
5: DCL.sgpset('lcntl', false) ; DCL.uzfact(0.7)
6: GGraph.line( gphys.cut(135,35,false) )
7: DCL.grcls

·ë²Ì¤Ï¤³¤¦¤Ê¤ë¡§


line_1.rb¼Â¹Ô·ë²Ì

±¦¾åÏȳ°¤Ë¤Ï, "lon=130.0 degrees_east", "lat=40.0 degress_north" ¤Èɽ ¼¨¤µ¤ì¤ë. cut ¤Ï°ìÈֶᤤ³Ê»ÒÅÀ¤òÁª¤Ö¤è¤¦¤Ë¤Ê¤Ã¤Æ¤ª¤ê, ¤Á¤ç¤¦¤É¿¿¤óÃæ ¤ò»ØÄꤷ¤¿¾ì¹ç¤Ï¤è¤ê³Ê»ÒÅÀÈÖ¹æ¤Î¾®¤µ¤¤Êý¤¬Áª¤Ð¤ì¤ë. ·ÐÅÙ¤ÏÅ좪À¾, °ÞÅÙ¤ÏËÌ¢ªÆî¤Ë³ÊǼ¤µ¤ì¤Æ¤¤¤ë¤Î¤Ç, ¤³¤Î¤è¤¦¤Ê°ÞÅÙ¡¦·ÐÅÙ¤¬Áª¤Ð¤ì¤ë¤Î¤Ç¤¢¤ë.


¤µ¤Æ, ±ôľºÂɸ¤Ç¤¢¤ë°µÎϤ¬²£¼´¤ËÍè¤ë¤È, ¤É¤¦¤â±ôľ¥×¥í¥Õ¥¡¥¤¥ë¤Ç¤¢¤ë¤è¤¦¤Êµ¤¤¬¤·¤Ê¤¤. ¤½¤³¤Ç, ½Ä¼´¤È²£¼´¤òÆþ¤ìÂØ¤¨, °µÎϼ´¤ÏÂпô¥¹¥±¡¼¥ë¤Çɽ¼¨¤·¤Æ¤ß¤è¤¦. ¤Ä¤¤¤Ç¤Ë, Ïȳ°±¦¾å¤Î¾ðÊó¤¬ÀÚ¤ì¤Ê¤¤¤è¤¦Á´²èÌÌɽ¼¨¤Ë¤·¤è¤¦ (DCL.sgpset('lfull',true)).


line_2.rb
1: require "numru/ggraph"
2: include NumRu
3: gphys = GPhys::IO.open('T.jan.nc', 'T')
4: DCL.gropn(1)
5: DCL.sgpset('isub', 96)   # control character of subscription: '_' --> '`'
6: DCL.sgpset('lfull',true) ; DCL.uzfact(0.6)
7: GGraph.set_fig( 'itr'=> 2, 'viewport'=>[0.25,0.7,0.15,0.6] )
8: GGraph.line( gphys.cut(135,35,false), true, 'exchange'=>true )
9: DCL.grcls


line_2.rb¼Â¹Ô·ë²Ì

¾å¤Î¥×¥í¥°¥é¥à¤Ç¤Ï, ½Ä¼´¤òÂпô¥¹¥±¡¼¥ê¥ó¥°¤Ë¤¹¤ë¤¿¤á, Âè6¹ÔÌÜ¤Ç GGraph.fig ¤Î¥ª¥×¥·¥ç¥ó itr ¤òÀßÄꤷ¤Æ¤¤¤ë (GGraph¥Þ¥Ë¥å¥¢¥ë»²¾È). ¤³¤Î¾ì¹ç, ¥³¥ó¥È¥í¡¼¥ëʸ»ú¤ò̵¸ú¤Ë¤¹¤ë¤È, ¼´¤Ë¤Ä¤±¤ë¥é¥Ù¥ë¤¬¤¢¤Þ¤êÈþ¤·¤¯¤Ê¤¯¤Ê¤ë¤Î¤Ç, DCL.sgpset('lcntl', false) ¤Ç̵¸ú¤Ë¤¹¤ë¤Î¤Ç¤Ï¤Ê¤¯, 5¹ÔÌܤΠDCL.sgpset('isub', 96) ¤Ç, ²¼¤Ä¤­¤ò¼¨¤¹»ú¤ò '_' ¤«¤é '`' ¤ËÊѹ¹¤·¤¿. ¤µ¤é¤Ë, Á´²èÌÌɽ¼¨¤Ë¸Æ±þ¤·¤Æ, viewport ¤òÊѤ¨¤Æ¤¤¤ë¡Ê¥Ç¥Õ¥©¥ë¥ÈÃÍ¤Ï [0.2,0.8,0.2,0.8]¡Ë. GGraph.fig ¤Ï¿·¤·¤¤¿Þ¤ÎÏȤòÄêµÁ¤¹¤ë¥á¥½¥Ã¥É¤Ç¤¢¤ê, GGraph.line ¤ÎÂ裲°ú¿ô¤¬ true ¤Î¤È¤­¸Æ¤Ð¤ì¤ë. Â裲°ú¿ô¤Ï¾Êά²Äǽ¤Ç true ¤Ï¥Ç¥Õ¥©¥ë¥ÈÃͤǤ¢¤ë. Âè7¹ÔÌÜ¤Ï GGraph.line ¤ò¸Æ¤ó¤Ç¤¤¤ë¤¬, GGraph.line ¤Î¥ª¥×¥·¥ç¥ó¤ÏÂ裳°ú ¿ô(°Ê¹ß)¤Ç¤¢¤ë¤Î¤Ç, Âè2°ú¿ô¤Î true ¤òÍÛ¤ËÀßÄꤷ¤Æ¤¤¤ë¡Ê´Ö°ã¤¨¤ä¤¹¤¤¤Î ¤ÇÂè2°ú¿ô¤¬ true/false °Ê³°¤Ê¤éÎã³°¤Ë¤è¤ê¥æ¡¼¥¶¡¼¤ËÄÌÃΤ¹¤ë¡Ë. ¤½¤·¤Æ, ¥ª¥×¥·¥ç¥ó¤È¤·¤Æ 'exchange'=>true ¤ò»ØÄꤷ¤Æ¤¤¤ë. ¤³¤ì¤Ë¤è¤ê, ¥Ç¥Õ¥©¥ë¥È¤ÈµÕ¤Ë, ºÂɸ¤ò½Ä¼´, ¥Ç¡¼¥¿¤ò²£¼´¤Ë½ñ¤¯¤è¤¦¤Ë¤Ê¤ë. ¥ª¥×¥·¥ç¥ó¤Ë¤Ä¤¤¤Æ¤Ï¤Þ¤¿¸å¤Ç²òÀ⤹¤ë.


ÍÍ¡¹¤Ê¥Õ¥¡¥¤¥ë·Á¼°


GPhys ¤Ç¤Ï NetCDF, GrADS, grib ·Á¼°¤Î¥Õ¥¡¥¤¥ë¤òƱ¤¸¤è¤¦¤Ë °·¤¦¤³¤È¤¬½ÐÍè¤ë. ⤷º£¤Î¤È¤³¤í GrADS ·Á¼°¤Ç¤Î½ñ¤­½Ð¤·¤Ï¥µ¥Ý¡¼¥È¤·¤Ê¤¤.

¥Õ¥¡¥¤¥ë·Á¼°¤ÎȽÊÌ


GPhys::IO.open(file, varname) ¤Ë¤ª¤¤¤Æ, file ¤Ïʸ»úÎó¤Çɽ¤·¤¿¥Ñ¥¹, ¤Þ¤¿¤Ï NumRu::NetCDF Åù¥Õ¥¡¥¤¥ë¤òľÀÜÂåɽ¤¹¤ë¥¯¥é¥¹¤Î¥ª¥Ö¥¸¥§¥¯¥È¤ò¼è¤ì¤ë. ¥Ñ¥¹¤Î¾ì¹ç, ¥Õ¥¡¥¤¥ë¤Î¼ïÎà¤Ï¼«Æ°Åª¤ËȽÊ̤µ¤ì¤ë. ¤½¤Î¥ë¡¼¥ë¤Ï²¼µ­¤ÎÄ̤ê¤Ç¤¢¤ë.

  1. ¥µ¥Õ¥£¥Ã¥¯¥¹¤¬ 'nc', 'ctl', 'grib': ¤½¤ì¤¾¤ì NetCDF, GrADS, grib ¤ò²¾Äê.
  2. ¤½¤ì°Ê³°. ¥Õ¥¡¥¤¥ë¤ÎºÇ½é¤Î¤Û¤¦¤òÆÉ¤ó¤ÇȽÊ̤¹¤ë.

¥Õ¥¡¥¤¥ë·Á¼°¤òÍۤ˻ØÄꤷ¤ÆÆÉ¤ß¹þ¤à¤³¤È¤â¤Ç¤­¤ë. ¤½¤ì¤¾¤ì, GPhys::NetCDF_IO.open, GPhys::GrADS_IO.open, GPhys::Grib_IO.open ¤òÍѤ¤¤ë.

GrADS,grib¥Õ¥¡¥¤¥ëÉÁ²èÎã


¼¡¤Î¥×¥í¥°¥é¥à¤Ï, ¾åµ­¤Î contour1000mb_1.rb ¤Î3¹ÔÌܤǥե¡¥¤¥ë̾¤À¤±¤ò T.jan.nc ¤«¤é T.jan.ctl ¤ËÊѤ¨¤¿¤À¤±¤Î¤â¤Î¤Ç¤¢¤ë. ¤½¤ì°Ê³°¤ÏÁ´¤¯Æ±¤¸¥×¥í¥°¥é¥à¤Ç GrADS ·Á¼°¤Î¥Ç¡¼¥¿¤òÉÁ²è¤Ç¤­¤ë.

contour1000mb_grd.rb
 1: require "numru/ggraph"
 2: include NumRu
 3: gphys = GPhys::IO.open('T.jan.ctl', 'T')
 4: DCL.gropn(1)
 5: DCL.sgpset('lcntl', false) ; DCL.uzfact(0.7)
 6: GGraph.contour( gphys )
 7: DCL.grcls

ƱÍͤË, ¼¡¤Î¥×¥í¥°¥é¥à¤Ï grib ¥Õ¥¡¥¤¥ë¤Î¥Ç¡¼¥¿¤òÉÁ²è¤¹¤ë. ¼Â¹Ô¤Ë¤Ï, GPhys 0.4.0 °Ê¾å¤¬É¬ÍפǤ¢¤ë.

contour1000mb_grib.rb
 1: require "numru/ggraph"
 2: include NumRu
 3: gphys = GPhys::IO.open('T.jan.grib', 'TMP')
 4: DCL.gropn(1)
 5: DCL.sgpset('lcntl', false) ; DCL.uzfact(0.7)
 6: GGraph.contour( gphys )
 7: DCL.grcls

¾å¤Ç¤Ï, ÊÑ¿ô̾¤¬¤³¤ì¤Þ¤Ç¤Î 'T' ¤Ç¤Ê¤¯ 'TMP' ¤È¤Ê¤Ã¤Æ¤¤¤ë¤³¤È¤ËÃí°Õ. grib¥Õ¥¡¥¤¥ëÃæ¤Ç¤ÏÊÑ¿ô¤Ï̾Á°¤ò»ý¤¿¤º, ÊÑ¿ô¤Î¼ïÎà¤Ë±þ¤¸¤Æ·è¤Þ¤Ã¤¿ÈÖ¹æ ¤¬¤¢¤ë¤À¤±¤Ç¤¢¤ë. GPhys::Grib_IO ¤Ë¤ª¤¤¤Æ¤Ï¤½¤ÎÈÖ¹æ¤Ë wgrib ¤Ç»È¤ï¤ì¤Æ¤¤¤ë̾Á°¤ò³ä¤êÅö¤Æ¤Æ¤¤¤ë. ¤½¤ì¤¬, µ¤²¹¤Ë´Ø¤·¤Æ¤Ï 'TMP' ¤Ê¤Î¤Ç¤¢¤ë. ⤷, wgrib ¤Ç¤ÏƱ¤¸ÊÑ¿ô¤Ç¤â°Û¤Ê¤ëÊ£¿ô¤Î̾Á°¤¬»È¤ï¤ì¤Æ¤¤¤ë¤³¤È¤¬¤¢¤ë¤Î¤Ç, wgrib ¥³¥Þ¥ó¥É¤Î¼ÂºÝ¤Î½ÐÎÏ¤È GPhys::Grib_IO ¤Ë¤ª¤±¤ëÊÑ¿ô̾¤Ïɬ¤º¤·¤â°ìÃפ·¤Ê¤¤. ¤Ç¤Ï¤É¤¦¤¹¤ì¤ÐÎɤ¤¤«¤Ë¤Ä¤¤¤Æ¤Ï¼¡¤ò»²¾È¤Î¤³¤È.

¥Õ¥¡¥¤¥ëÃæ¤ÎÊÑ¿ô̾¤ÎÄ´¤ÙÊý


NetCDF¥Õ¥¡¥¤¥ë¤Ç¤¢¤ì¤Ð, ¾åµ­¤Î¤è¤¦¤Ë¥³¥Þ¥ó¥É¥é¥¤¥ó¤Ç ncdump ¥³¥Þ¥ó¥É¤ÇÄ´¤Ù¤é¤ì¤ë. GrADS¥Õ¥¡¥¤¥ë¤Ç¤¢¤ì¤Ð, ¥³¥ó¥È¥í¡¼¥ë¥Õ¥¡¥¤¥ë¤Ï¥Æ¥­¥¹¥È¤Ê¤Î¤Ç¤½¤ì¤ò¸«¤ì¤Ð¤è¤¤. ¤·¤«¤·, GPhys ¤òÍѤ¤¤ì¤Ð, ¥Õ¥¡¥¤¥ë¤Î¼ïÎà¤Ë°Í¸¤»¤ºÆ±¤¸ÊýË¡¤ÇÄ´¤Ù¤é¤ì¤ë.

inspect_varnames.rb
 1: require "numru/gphys"
 2: p NumRu::GPhys::IO.var_names('T.jan.grib')
 3: p NumRu::GPhys::IO.var_names('T.jan.ctl')
 4: p NumRu::GPhys::IO.var_names('T.jan.nc')


·ë²Ì¤Ï²¼µ­¤ÎÄ̤ê¤Ç¤¢¤ë.
% ruby inspect_varnames.rb
["TMP"]
["T"]
["lon", "lat", "level", "T"]

grib¥Õ¥¡¥¤¥ë¤Ë¤Ï "TMP", GrADS, NetCDF ¥Õ¥¡¥¤¥ë¤Ë¤Ï "T" ¤È¤¤¤¦ÊÑ¿ô¤¬¤¢¤ë¤³¤È¤¬¤ï¤«¤ë. NetCDF¥Õ¥¡¥¤¥ë¤Ç¤Ï¾¤Ë¡¡"lon", "lat", "level" ¤È¤¤¤¦ÊÑ¿ô̾¤â¤Ç¤ë¤¬, NetCDF ¤Ç¤Ï¤³¤ì¤éºÂɸÊÑ¿ô¤â¼«Ê¬¼«¿È¤òºÂɸÊÑ¿ô¤È¤¹¤ë GPhys ¥ª¥Ö¥¸¥§¥¯¥È¤È¤·¤Æ GPhys::IO.open ¤Ç³«¤¯¤³¤È¤¬¤Ç¤­¤ë. ¤·¤«¤·, ¤³¤ì¤À¤±¤Î¤¿¤á¤Ë¥×¥í¥°¥é¥à¤ò¥Õ¥¡¥¤¥ë¤Ë¤¹¤ë¤Î¤ÏÌÌÅݤÀ¤È»×¤ï¤ì¤è¤¦. ¼¡¤Ë, ÂÐÏÃŪ¤ÊÍøÍÑË¡¤ò¾Ò²ð¤¹¤ë.


irb¤òÍѤ¤¤¿ÂÐÏÃÍøÍÑ(1)


Ruby ¤Ëɸ½àźÉդΠirb ¤È¤¤¤¦¥³¥Þ¥ó¥É¤Ï, ÂÐÏÃŪ¤Ê¥»¥Ã¥·¥ç¥ó¤Ë¤ª¤¤¤Æ ruby ¤Î¥×¥í¥°¥é¥à¤ò¹Ôñ°Ì¤Ç²ò¼á¤·¼Â¹Ô¤¹¤ë shell ¤Î¤è¤¦¤Ê¤â¤Î¤Ç¤¢¤ë. ¾¤Ë, emacs ¾å¤Ç¼Â¹Ô¤¹¤ë irb-shell ¤È¤¤¤¦¤â¤Î¤â¤¢¤ë. °Ê²¼¤Ï, ¾åµ­¤ÎÊÑ¿ô̾Ĵ¤Ù¤ò irb ¤Ç¹Ô¤Ã¤¿·ë²Ì¤ò¥«¥Ã¥È¥¢¥ó¥É¥Ú¡¼¥¹¥È¤·¤¿¤â¤Î¤Ç¤¢¤ë. irb(main):001:0> Åù¤Ï irb ¤Î¥×¥í¥ó¥×¥È, ¡É=>¡É °Ê²¼¤Ï³Æ¹Ô¤Î¼Â¹Ô·ë²Ì¤Î½ÐÎϤǤ¢¤ë.
% irb
irb(main):001:0> require "numru/gphys"
=> true
irb(main):002:0> include NumRu
=> Object
irb(main):003:0> GPhys::IO.var_names('T.jan.grib')
=> ["TMP"]
irb(main):004:0> GPhys::IO.var_names('T.jan.ctl')
=> ["T"]
irb(main):005:0> GPhys::IO.var_names('T.jan.nc')
=> ["lon", "lat", "level", "T"]

Âè1¹ÔÌÜ¤ÎÆþÎϤÏ, ¤³¤ì¤Þ¤Ç¤Î require "numru/ggraph" ¤È°ã¤¤, require "numru/gphs" ¤È¤Ê¤Ã¤Æ¤¤¤ë. ¤³¤¦¤¹¤ë¤È GPhys ËÜÂΤÀ¤±¤¬ÆÉ¤ß¹þ¤Þ¤ì, ¥°¥é¥Õ¥£¥Ã¥¯¥é¥¤¥Ö¥é¥ê¡¼ GGraph ¤ÏÆÉ¤ß¹þ¤Þ¤ì¤Ê¤¤. (ÌÞÏÀ¿Þ¤ò½ñ¤«¤Ê¤¤¾ì¹ç¤Ç¤â require "numru/ggraph" ¤Ç¹½¤ï¤Ê¤¤¤¬, ¤³¤Î¤Û¤¦¤¬¼ã´³Î©¤Á¾å¤²¤¬Áᤤ¤Ç¤¢¤í¤¦.)

irb ¤Ï¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¥³¥Þ¥ó¥É¤Î¼Â¹Ô·ë²Ì¤ò p ¤Çɽ¼¨¤¹¤ë¤Î¤Ç, ¾åµ­¤Î¥×¥í¥°¥é¥à¤È°Û¤Ê¤ê, ÍÛ¤Ë¤Ï p ¤ò¤Ä¤±¤Æ¤Ê¤¤.

¥¹¥¿¡¼¥È¥¢¥Ã¥×¥Õ¥¡¥¤¥ë¤ÎÍøÍÑ(1)


irb ¤Î¥»¥Ã¥·¥ç¥ó³«»Ï»þ¤ËËè²ó require "numru/gphys", include NumRu ¤Ê¤É¤Î¡Ö¤ª¤Þ¤¸¤Ê¤¤¡×¤ò¸Æ¤Ö¤Î¤ÏÌÌÅݤʤΤÇ, ¥¹¥¿¡¼¥È¥¢¥Ã¥×¥Õ¥¡¥¤¥ë¤òÍøÍѤ·¤Æ¼«Æ°²½¤¹¤ë¤ÈÎɤ¤.

É®¼Ô¤Ï£²¤ÎÊýË¡¤ò¼è¤Ã¤Æ¤¤¤ë. °Ê²¼¤ËξÊý¤Î¶ñÂÎÎã¤ò¤·¤á¤¹.

.irbrc ÍøÍÑÎã (ÊýË¡£±)


GPhys ¤ÏÍøÍѤ¹¤ë¤¬, GGraph ¤ÏÍøÍѤ·¤Ê¤¤¾ì¹ç.
% cat ~/.irbrc
require "numru/gphys"
include NumRu
% irb
irb(main):001:0> GPhys::IO.var_names('T.jan.grib')
=> ["TMP"]
irb(main):002:0> GPhys::IO.var_names('T.jan.ctl')
=> ["T"]
irb(main):003:0> GPhys::IO.var_names('T.jan.nc')
=> ["lon", "lat", "level", "T"]

GGraph ¤âÍøÍѤ¹¤ë¾ì¹ç¤ÎÎã.
% cat ~/.irbrc
require "numru/ggraph"
include NumRu
include GGraph
DCL.swpset('iwidth',700)   # image width
DCL.swpset('iheight',700)  # image height
DCL.swpset('lwait',false)  # don't wait mouse click to show the next page
DCL.gropn(1)
DCL.sgpset('isub', 96)     # control character of subscription: '_' --> '`'
DCL.sgpset('lfprop',true)  # to use the propotional font

¤³¤Î¤è¤¦¤Ë, require "numru/gphys", include NumRu ¤Ë²Ã¤¨¤Æ, ºî¿Þ¤ò¤¹¤ë¾å¤Ç¶¦Ä̤˸ƤÖÌ¿Îá¤ò¼Â¹Ô¤¹¤ë¤è¤¦¤Ë¤·¤Æ¤ª¤¯¤ÈÎɤ¤. ¤Ê¤ª, ¾å¤Ç¤Ï²èÌ̤Υǥե©¥ë¥È¥µ¥¤¥º¤ò 700¡ß700 ¤Ë¤·, ÉÁ²è»þ¤ÎÂÔ¤Á¤ò¤Ê¤¯¤·¤Æ¥Þ¥¦¥¹¥¯¥ê¥Ã¥¯¤Ê¤·¤Ç¼¡¤Î¥Ú¡¼¥¸¤¬É½¼¨¤µ¤ì¤ë¤è¤¦¤Ë¤·, ¤·¤¿¤Ä¤­Åº»ú¤òɽ¤¹¤¿¤á¤Î¥³¥ó¥È¥í¡¼¥ëʸ»ú¤ò _ ¤«¤é ` ¤ËÊѹ¹¤¹¤ë¤Ê¤É¤·¤Æ¤¤¤ë. ¥¹¥¿¡¼¥È¥¢¥Ã¥×¥Õ¥¡¥¤¥ë¤µ¤¨ÀßÄꤷ¤Æ¤ª¤±¤Ð, ¼¡¤Î¤è¤¦¤Ë irb µ¯Æ°¸å¤Ë£²¹ÔÆþÎϤ¹¤ë¤À¤±¤Ç¿Þ¤¬½Ð¤»¤ë. ¤Ê¤ª, html ¤ÎÅÔ¹ç¾å, ¤«¤®³ç¸Ì¤ÏÁ´³Ñ¤Ë¤·¤Æ¤¢¤ë.
% irb
 *** MESSAGE (SWDOPN) ***  GRPH1 : STARTED / IWS =  1.                         
irb(main):001:0> gphys = GPhys::IO.open('T.jan.nc', 'T')
=> <GPhys grid=<3D grid <axis pos=<'lon' in 'T.jan.nc'  sfloat[36]>>
        <axis pos=<'lat' in 'T.jan.nc'  sfloat[19]>>
        <axis pos=<'level' in 'T.jan.nc'  sfloat[9]>>>
   data=<'T' in 'T.jan.nc'  sfloat[36, 19, 9]>>
irb(main):002:0> contour( gphys.mean(0) )
=> nil

¤³¤³¤Ç, gphys = GPhys::IO.open('T.jan.nc', 'T') ¤Î·ë²Ì¤Î½ÐÎϤθ«Êý¤Ï¸å¤Ç²òÀ⤹¤ë. 2¹ÔÌÜ¤ÎÆþÎϤˤª¤±¤ë mean(0) ¤ÏºÇ½é¤Î¼¡¸µ(¡á·ÐÅÙ)¤Ë´Ø¤¹¤ëÊ¿¶Ñ¤Ç¤¢¤ë. ¾Ü¤·¤¯¤Ï¤³¤Á¤é¤ò»²¾È¤Î¤³¤È.

¾åµ­¤Î irb ¥»¥Ã¥·¥ç¥ó¼Â¹Ô·ë²Ì


.irbrc ¤òÍøÍѤ·¤Ê¤¤Îã (ÊýË¡£²)


²¼µ­¤Î¤è¤¦¤Ë, irb ¤Î¥¹¥¿¡¼¥È¥¢¥Ã¥×¥Õ¥¡¥¤¥ë¤È¤·¤Æ¤Ïǧ¼±¤µ¤ì¤Ê¤¤ ̾Á°¤Î¥Õ¥¡¥¤¥ë¤Ë¼Â¹Ô¤¹¤ë¥³¡¼¥É¤ò½ñ¤­¥¨¥ê¥¢¥¹¤Çµ¯Æ°¤¹¤ë¤è¤¦¤Ë¤¹¤ë. °Ê²¼¤Î alias ¤Ï .cshrc ¤Ê¤É¤Ë½ñ¤­¹þ¤ó¤Ç¤ª¤¯¤ÈÎɤ¤.
% alias irb_ggraph  'irb -r ~/.irbrc_ggraph'
% cat ~/.irbrc_ggraph.rb
require "numru/ggraph"
include NumRu
include GGraph
DCL.swpset('iwidth',700)   # image width
DCL.swpset('iheight',700)  # image height
DCL.swpset('lwait',false)  # don't wait mouse click to show the next page
DCL.gropn(1)
DCL.sgpset('isub', 96)     # control character of subscription: '_' --> '`'
DCL.sgpset('lfprop',true)  # to use the propotional font

¤³¤Î¤è¤¦¤Ë¤¹¤ë¤È, GGraph ¤Î¥»¥Ã¥·¥ç¥óÍѤΠirb ¤¬ irb_ggraph ¤È¤¤¤¦Ì¾Á°¤ÇÀßÄꤵ¤ì¤ë. ¤ä¤Ï¤ê²¼µ­¤Î¤è¤¦¤Ë2¹Ô¤Çºî¿Þ¤Ç¤­¤ë.
% irb_ggraph
 *** MESSAGE (SWDOPN) ***  GRPH1 : STARTED / IWS =  1.                         
irb(main):001:0> gphys = GPhys::IO.open('T.jan.nc', 'T')
=> <GPhys grid=<3D grid <axis pos=<'lon' in 'T.jan.nc'  sfloat[36]>>
        <axis pos=<'lat' in 'T.jan.nc'  sfloat[19]>>
        <axis pos=<'level' in 'T.jan.nc'  sfloat[9]>>>
   data=<'T' in 'T.jan.nc'  sfloat[36, 19, 9]>>
irb(main):002:0> contour( gphys.mean(0) )
=> nil

É®¼Ô¤Ï¤³¤ÎÊýË¡¤ò°¦ÍѤ·¤Æ¤¤¤ë.


GPhys¤ÎÃæ¿È¤òÄ´¤Ù¤ë


¿Þ¤ò½ñ¤«¤º¤Ë¥Ç¡¼¥¿¤ÎÃæ¿È¤ò´Êñ¤ËÄ´¤Ù¤ëÊýË¡¤òÀâÌÀ¤¹¤ë. ¾å¤Ç¾Ò²ð¤·¤¿ Ruby ¤ÎÂÐÏÃ¥·¥§¥ë irb ¤ò»È¤¦¤³¤È¤Ë¤·¤è¤¦. ¥Á¥å¡¼¥È¥ê¥¢¥ë¤È¤·¤Æ¤ÎÈÆÍÑÀ­¤Î¤¿¤á, ¥¹¥¿¡¼¥È¥¢¥Ã¥×¥Õ¥¡¥¤¥ë¤Ï»È¤ï¤Ê¤¤¤â¤Î¤È¤¹¤ë. »È¤Ã¤Æ¤¤¤ë¾ì¹ç¤Ï ºÇ½é¤Î¿ô¹Ô¤òŬµ¹¾Êά¤¹¤ì¤ÐÎɤ¤. °Ê²¼¤Ï kterm ¤Î²èÌ̤ò¥«¥Ã¥È¥¢¥ó¥É¥Ú¡¼¥¹¥È¤·¤¿¤â¤Î¤Ç¤¢¤ë¤¬, html ¤ÎÅÔ¹ç¾å, ¤«¤®³ç¸Ì¤ÏÁ´³Ñ¤Ë¤·¤Æ¤¢¤ë.
% irb
irb(main):001:0> require "numru/gphys"
=> true
irb(main):002:0> include NumRu
=> Object
irb(main):003:0> T  ¢« ¤³¤³¤Ç¤Ï T ¤ÈÆþ¤ì¤Æ¥¿¥Ö¤ò£²²óÆþÎÏ (²¼¤Î¤è¤¦¤Ë¥Õ¥¡¥¤¥ë̾¤¬½Ð¤Ê¤¤¥±¡¼¥¹¤â¤¢¤ë)
T.jan.ctl   T.jan.dat   T.jan.grib  T.jan.nc    ToDo        
irb(main):003:0> GPhys::IO.var_names('T.jan.nc')  # for GPhys >= 0.4.0
=> ["lon", "lat", "level", "T"]
irb(main):004:0> gphys = GPhys::IO.open('T.jan.nc', 'T')
=> <GPhys grid=<3D grid <axis pos=<'lon' in 'T.jan.nc'  sfloat[36]>>
        <axis pos=<'lat' in 'T.jan.nc'  sfloat[19]>>
        <axis pos=<'level' in 'T.jan.nc'  sfloat[9]>>>
   data=<'T' in 'T.jan.nc'  sfloat[36, 19, 9]>>
irb(main):005:0> 

irb ¤Ï³Æ¹Ô¤ò¼Â¹Ô¤·¤¿·ë²Ì¤ò, ¤ªÇ¤¤»É½¼¨´Ø¿ô p ¤ò»È¤Ã¤ÆÉ¸½à½ÐÎϤ˽ÐÎϤ¹¤ë. p ¤Ë¤è¤ëɽ¼¨¤Ïɬ¤º¤·¤âåºÎï¤È¤Ï¸Â¤é¤Ê¤¤¤¬, ÊØÍø¤Ç¤¢¤ë. 1,2¹ÔÌÜ¤ÎÆþÎÏ(001,002)¤Ï¤¤¤Ä¤â¤Î¤ª¤Þ¤¸¤Ê¤¤¤Ç¤¢¤ë. 3¹ÔÌÜ¤Ç¤Ï T ¤Ë³¤¤¤Æ TAB ¥­¡¼¤ò2²óÆþÎϤ·¤Æ¤ß¤è¤¦. ¿¤¯¤Î¥±¡¼¥¹¤Ç T ¤«¤é»Ï¤Þ¤ë¥Õ¥¡¥¤¥ë̾¤Î¥ê¥¹¥È¤¬É½¼¨¤µ¤ì¤ë¤Ï¤º¤Ç¤¢¤ë. ¤³¤ì¤Ï¶²¤é¤¯ irb ¼«ÂΤε¡Ç½¤Ç¤Ê¤¯, ¥­¡¼ÆþÎϤò»Ê¤ë readline ¤È¤¤¤¦¥é¥¤¥Ö¥é¥ê¡¼¤Îµ¡Ç½¤Ê¤Î¤Ç, ¤³¤¦¤Ê¤é¤Ê¤¤¥±¡¼¥¹¤â¤¢¤ë. ³¤¤¤Æ¤ä¤êľ¤·¤Ë¤Ê¤ë¼ÂºÝ¤Î3¹ÔÌÜ¤ÎÆþÎÏ (£²ÅÙÌܤÎ003) ¤Ï, GPhys 0.4.0 ¤Ç¥µ¥Ý¡¼¥È¤µ¤ì¤¿´Ø¿ô GPhys::IO.var_names ¤òÍѤ¤¤Æ¥Õ¥¡¥¤¥ëÃæ¤Î GPhys ²½²Äǽ¤ÊÊÑ¿ô̾¤òɽ¼¨¤¹¤ë. ¤½¤·¤Æ£´¹ÔÌÜ¤ÎÆþÎϤǤÏÊÑ¿ô 'T' ¤Ë´Ø¤· GPhys ¥ª¥Ö¥¸¥§¥¯¥È¤òºîÀ®¤¹¤ë (gphys = GPhys::NetCDF_IO.open('T.jan.nc', 'T')). ¤½¤Î·ë²Ì¤¬ p ¤Çɽ¼¨¤µ¤ì¤¿¤â¤Î¤Ï£´¹Ô¤Ë¤ï¤¿¤Ã¤Æ¤¤¤ë. ¾¯¤·¸«¤Ë¤¯¤¤¤¬, lon, lat, level ¤Î£³¼¡¸µ¥Ç¡¼¥¿ T ¤È¤Ê¤Ã¤Æ¤ª¤ê, ¤½¤ì¤¾¤ì¤¬¥Õ¥¡¥¤¥ë T.jan.nc ¤Ë³ÊǼ¤µ¤ì¤Æ¤¤¤ë¤³¤È¤¬¸«¤Æ¼è¤ì¤ë. ¿ôÃÍ·¿¤ä³Æ¼¡¸µ¤ÎŤµ¤â ɽ¼¨¤µ¤ì¤Æ¤¤¤ë. ¼¡¸µ¤ÎʤÙÊý¤Ï Fortran ¤ÈƱÍͤÇ, ¡Ö°ìÈÖ®¤¯¤Þ¤ï¤ë¡×¼¡¸µ¤¬ºÇ½é¤ËÍè¤ë(¤³¤³¤ò»²¾È).


¤Ç¤Ï, ¼¡¤Î¥×¥í¥°¥é¥à¤ò¼Â¹Ô¤·¤è¤¦.


inspect.rb
 1: require "numru/gphys"
 2: include NumRu
 3: p gphys = GPhys::NetCDF_IO.open('T.jan.nc', 'T')
 4: p 'name = '+gphys.name, 'rank:',gphys.rank, 'shape:', gphys.shape
 5: print '[1st dim]  name:', gphys.coord(0).name, 
 6:      '  long_name:',gphys.coord(0).get_att('long_name'),
 7:      '  units:',gphys.coord(0).get_att('units'),
 8:      "  min,max:#{gphys.coord(0).min},#{gphys.coord(0).max}\n"
 9: prs = gphys.coord(2).val
10: t_jpn = gphys.cut(135,35,true).val
11: print "\n#{gphys.coord(0).name}\t#{gphys.name}\n"
12: for i in 0...prs.length do
13:   print prs[i], "\t", t_jpn[i], "\n"
14:end


º£ÅÙ¤Ï irb ¤ò»È¤ï¤Ê¤¤¤Î¤Ç p ¤ÏÍۤ˸ƤФʤ±¤ì¤Ð¤Ê¤é¤Ê¤¤ (3¹ÔÌÜ etc). °Ê²¼¤Ë¼Â¹Ô·ë²Ì¤ò¼¨¤¹.


% ruby inspect.rb
<GPhys grid=<3D grid <axis pos=<'lon' in 'T.jan.nc'  sfloat[36]>>
        <axis pos=<'lat' in 'T.jan.nc'  sfloat[19]>>
        <axis pos=<'level' in 'T.jan.nc'  sfloat[9]>>>
   data=<'T' in 'T.jan.nc'  sfloat[36, 19, 9]>>
"name = T"
"rank:"
3
"shape:"
[36, 19, 9]
[1st dim]  name:lon  long_name:Longitude  units:degrees_east  min,max:0.0 degrees_east,350.0 degrees_east

lon     T
1000.0  -5.50255870819092
850.0   -13.0088624954224
600.0   -23.8766059875488
400.0   -41.1900672912598
250.0   -52.6089935302734
150.0   -51.7955780029297
70.0    -55.255916595459
30.0    -51.0108757019043
10.0    -43.6157722473145

¥×¥í¥°¥é¥à¤Î 4 ¹ÔÌܰʹߤò²òÀ⤷¤è¤¦.


4 ¹ÔÌÜ:

     p 'name = '+gphys.name, 'rank:',gphys.rank, 'shape:', gphys.shape

¤Ï GPhys ¥ª¥Ö¥¨¥¸¥§¥¯¥È¤Î̾Á°(name), ¼¡¸µ¿ô(rank), ³Æ¼¡¸µ¤ÎŤµ(shape)¤òɽ¼¨¤¹¤ë.


5¡Á8 ¹ÔÌÜ:

     print '[1st dim]  name:', gphys.coord(0).name, 
          '  long_name:',gphys.coord(0).get_att('long_name'),
          '  units:',gphys.coord(0).get_att('units'),
          "  min,max:#{gphys.coord(0).min},#{gphys.coord(0).max}\n"

¤Ï°ì³¤­¤ÎÌ¿Îá¤Ç¤¢¤ë. Âè 5,6,7 ¹Ô¤¬¥³¥ó¥Þ¤Ç½ª¤ë¤¿¤á, ·Ñ³¤ÎɬÍפ¬ÌÀ¤é¤«¤À¤«¤é¤½¤¦²ò¼á¤µ¤ì¤ë. gphys.coord(idim) ¤Ï, idimÈÖÌܤμ¡¸µ (0¤«¤é¿ô¤¨¤ë) ¤ÎºÂɸÃͤò³ÊǼ¤¹¤ë¥Ç¡¼¥¿¤òÊÖ¤¹¡Ê¤Ê¤ª, GPhys ¤ÏºÂɸÃͰʳ°¤Ë¤â³Æ¼¡¸µ¤Ë´Ø¤¹¤ë¾ðÊó¤òÀ°Íý¤·¤Æ´ÉÍý¤¹¤ë¤è¤¦¤Ë¤Ê¤Ã¤Æ¤¤¤ë. ³Æ¼¡¸µ¤Ë´Ø¤¹¤ë¾ðÊó¤Ï gphys.axis(idim) ¤ÇÆÀ¤é¤ì, ºÂɸÃͤϤ½¤ì¤Ë pos ¥á¥½¥Ã¥É¤òŬÍѤ¹¤ë¤³¤È¤Ç¤âÆÀ¤é¤ì¤ë. ¤Ä¤Þ¤ê, gphys.axis(idim).pos ¤Ï gphys.coord(idim) ¤ÈƱ¤¸·ë²Ì¤òÊÖ¤¹. ¤³¤³¤Ç¤Ï´Êñ¤Î¤¿¤á¤³¤ì°Ê¾å¤Î²òÀâ¤Ï¤·¤Ê¤¤¡Ë. ºÂɸÃͤÏ, VArray (¡áVirtual Array) ¤È¤¤¤¦, ¿¼¡¸µÇÛÎó¤È´ðËÜŪ¤Ë¤ÏƱ¤¸µ¡Ç½¤ò»ý¤Ä¥¯¥é¥¹¤Î¥ª¥Ö¥¸¥§¥¯¥È¤òÊÖ¤¹. VArray ¤Ï, ¿¼¡¸µ¤Î¿ôÃͥǡ¼¥¿¤Ë²Ã¤¨¤Æ, ̾Á°¤ÈǤ°Õ¸Ä¤Î¡Ö°À­¡× ¤ò»ý¤Ä¤³¤È¤¬½ÐÍè¤ë. °À­¤È¤ÏǤ°Õ¤Î̾Á°(ʸ»úÎó)¤ÈÃͤÎÁȤÇ, ÃͤλÅÍÍ¤Ï NetCDF ¤ÈƱÍͤǤ¢¤ë(¿ôÃͤÎ1¼¡¸µÇÛÎó¤Þ¤¿¤Ïʸ»úÎó). VArray ¤Î¥Ç¡¼¥¿ËÜÂÎ¤Ï NArray ¤Ç¤â¤è¤¤¤·, NetCDF ¥Õ¥¡¥¤¥ëÃæ¤ÎÊÑ¿ô¤Ç¤â¤è¤¤. ¤³¤³¤Ç¤Ï¸å¼Ô¤Ç¤¢¤ë. ¤³¤Î¾ì¹ç, ɬÍפˤʤë¤Þ¤Ç¥Ç¡¼¥¿¤ÎÆÉ¤ß¹þ¤ß¤Ï¹Ô¤ï¤ì¤Ê¤¤. ¤è¤Ã¤Æ, µðÂç¤Ê¥Ç¡¼¥¿¥Õ¥¡¥¤¥ë¤ò³«¤¯¤³¤È¤¬Ä¾¤Á¤Ë¥á¥â¥ê¡¼¤ò°µÇ÷¤¹¤ë¤³¤È¤Ë¤Ï¤Ê¤é¤Ê¤¤. ¥×¥í¥°¥é¥à¤Î 5¡Á8 ¹ÔÌܤȽÐÎϤò¸«Èæ¤Ù¤ë¤È, gphys.coord(0).name ¤Ï̾Á°¤ò, gphys.coord(0).get_att('long_name') ¤Ï°À­ long_name ¤ò gphys.coord(0).max ¤ÏºÂɸÃͤκÇÂçÃͤòÊÖ¤¹¤³¤È¤Ê¤É¤¬¤ï¤«¤ë¤Ç¤¢¤í¤¦. ¸ºß¤·¤Ê¤¤Â°À­¤òÆÉ¤ß¹þ¤â¤¦¤È¤¹¤ë¤È, ÊÖ¤êÃÍ¤Ï nil ¤È¤Ê¤ë (Îã³°¤ÏȯÀ¸¤·¤Ê¤¤).


9¹ÔÌÜ(prs = gphys.coord(2).val)¤Ç¤Ï, (¥¼¥í¤«¤é¿ô¤¨¤Æ)Âè2¼¡¸µ, ¨¤Á°µÎÏ (ÊÑ¿ô̾level) ¤ÎÃͤòÆÉ¤ß¹þ¤à. VArray ¤Î¥á¥½¥Ã¥É val ¤Ï ¥Ç¡¼¥¿¤ÎÃͤò NArray ¤ÇÊÖ¤¹. ½¾¤Ã¤Æ¤³¤³¤Ç¤Ï (¤³¤³¤Ç½é¤á¤Æ) ¥Õ¥¡¥¤¥ë¤«¤é¤ÎÊÑ¿ôÃÍ¤ÎÆÉ¤ß¹þ¤ß¤¬È¯À¸¤¹¤ë.


10¹ÔÌÜ(t_jpn = gphys.cut(135,35,true).val)¤Ç¤Ï, ÆüËÜÉÕ¶á¤Î£±±ôľ¥×¥í¥Õ¥¡¥¤¥ë¤òÁª¤ó¤À¾å¤Ç, ¥Ç¡¼¥¿¤òÆÉ¤ß¹þ¤à. ¥Ç¡¼¥¿ÆÉ¤ß¹þ¤ß¤Î»ÅÍͤˤĤ¤¤Æ¤Ï, ¼¡¤ÎÀá¤Ç²òÀ⤹¤ë.


11¹ÔÌܤϤ½¤ì¤¾¤ì¤Î̾Á°(name)¤òɽ¼¨¤·¤Æ, 12¡Á14 ¹ÔÌܤdzƳʻÒÅÀ¤Ç¤Î°µÎϤȵ¤²¹¤ÎÃͤò½ñ½Ð¤¹.



¥Ç¥£¥ì¥¯¥È¥ê¡¼¤ò¥Ö¥é¥¦¥º -- GDir¤ÎÍøÍÑ


GPhys-0.5.0 ¤è¤ê¡¤GPhys ÍѤ˥ե¡¥¤¥ë¥·¥¹¥Æ¥àÃæ¤Î¥Ç¥£¥ì¥¯¥È¥ê¡¼¤òÂåɽ¤¹ ¤ë¥¯¥é¥¹ GDir ¤¬Æ³Æþ¤µ¤ì¤¿¡¥Ruby ÁȤ߹þ¤ß¤Î Dir ¤ÈƱÍͤǤ¢¤ë¤¬¡¤ºÇÂç¤Î °ã¤¤¤Ï

¤³¤È¤Ç¤¢¤ë¡¥Â¨¤Á¡¤NetCDF ¤Ê¤É¤Î¥Õ¥¡¥¤¥ë¤Ë "cd" ¤·¡¤ÊÑ¿ô¤ò "ls" ¤¹¤ë¤³ ¤È¤¬½ÐÍè¤ë¡¥¤Ê¤ª¡¤¾­Íè, HDF ¤ä NetCDF-4 ¤Ê¤É¡¤¥Õ¥¡¥¤¥ëÃæ¤Ë¥Ç¥£ ¥ì¥¯¥È¥ê¡¼¹½Â¤¤ò¤È¤ì¤ë·Á¼°¤ò¥µ¥Ý¡¼¥È¤¹¤ëºÝ¤Ë¤Ï¡¤¤½¤ì¤â GDir ¥ª¥Ö¥¸¥§¥¯ ¥È¤Ë½ÐÍè¤ë¤è¤¦¤Ë¤¹¤ëͽÄê¤Ç¤¢¤ë¡¥

¾åµ­°Ê³°¤Î¼ç¤Ê°ã¤¤¤Ë¤Ï¼¡¤Î¤è¤¦¤Ë¤Ê¤ë¡¥

¾Ü¤·¤¯¤Ï Gdir¤Î¥ª¥ó¥é¥¤¥ó¥Þ¥Ë¥å¥¢¥ë¤ò»²¾È¤Î¤³¤È¡¥

GDirÍøÍÑÎã(1)


GDir ¤Ï irb ¤òÍѤ¤¤¿ÂÐÏÃÍøÍѤËŬ¤·¤Æ¤¤¤ë¡¥ÍøÍѤ˺ݤ·¤Æ¤Ï¡¤ ¥¹¥¿¡¼¥È¥¢¥Ã¥×¥Õ¥¡¥¤¥ë¤Ë¤Æ½àÈ÷¤¹¤ë ¤ÈÊØÍø¤Ç¤¢¤ë¤¬¡¤¤³¤³¤Ç¤Ï¥³¥Ô¡¼¡õ¥Ú¡¼¥¹¥È¤À¤±¤ÇÍøÍѤǤ­¤ë¤è¤¦¤Ë À¸¤Î irb ¤Ë¤ª¤±¤ëÍøÍÑË¡¤ò¼¨¤¹¡¥
% pwd
/hogehoge/TUTORIAL
% irb
irb(main):001:0> require "numru/gphys"
=> true
irb(main):002:0> include NumRu
=> Object
irb(main):003:0> GDir.top
=> "/"                      # ¥Ç¥Õ¥©¥ë¥È¤Î¥È¥Ã¥×¥Ç¥£¥ì¥¯¥È¥ê¡¼
irb(main):004:0> GDir.top = Dir.pwd    # ¥È¥Ã¥×¥Ç¥£¥ì¥¯¥È¥ê¡¼¤ò¸½ºß¤Î¥Ç¥£¥ì¥¯¥È¥ê¡¼¤ËÊѹ¹
=> "/hogehoge/TUTORIAL"
irb(main):005:0> GDir.pwd
=> "/"     # ¥«¥ì¥ó¥È¥Ç¥£¥ì¥¯¥È¥ê¡¼¤Î¥Ç¥Õ¥©¥ë¥È¤Ï¥È¥Ã¥×¡Ê¥Õ¥¡¥¤¥ë¥·¥¹¥Æ¥à¥ë¡¼¥È¤È¤Ï°ã¤¦¡Ë
irb(main):006:0> GDir.ls
Directories:
  'T.jan.ctl/'           # GPhys ²½²Äǽ¤ÊÊÑ¿ô¤ò¼ý¤á¤¿¥Õ¥¡¥¤¥ë¤Ï
  'T.jan.grib/'          # ¥Ç¥£¥ì¥¯¥È¥ê¤È¤·¤ÆÉ½¼¨¤µ¤ì¤ë
  'T.jan.nc/'
  'testdir/'             # ¤³¤ì¤Ï¤Û¤ó¤È¤Ë¥Ç¥£¥ì¥¯¥È¥ê
Text files?:         # ¥É¥­¥å¥á¥ó¥ÈÅù¸«¤é¤ì¤ë¤è¤¦¤Ë¡¤¥Æ¥­¥¹¥È¥Õ¥¡¥¤¥ë¤é¤·
  'ToDo'             # ¤­¤â¤Î¤Ïɽ¼¨¤µ¤ì¤ë¡¥¤½¤Î¾¤Î¥Õ¥¡¥¤¥ë¤Ï̵»ë¤µ¤ì¤ë
irb(main):007:0> GDir.ls_l      # ¤è¤ê¾Ü¤·¤¯É½¼¨
Directories:
         423  Sep 16  2003 T.jan.ctl/       # ¥Õ¥¡¥¤¥ë¥µ¥¤¥º¡¤¹¹¿·Æü»þ¡¤Ì¾Á°
       13167  Mar 10 13:03 T.jan.grib/
       26664  Aug 28  2003 T.jan.nc/
         512  Jul 21 13:13 testdir/
Text files?:
         206  Mar 23  2004  ToDo
=> nil
irb(main):008:0> GDir.cd 'T.jan.nc'
=> /T.jan.nc/
irb(main):009:0> GDir.ls
Data:            # Data: ¤È¤·¤ÆÉ½¼¨¤µ¤ì¤ë¤Î¤Ï¡¤GPhys²½²Äǽ¤ÊÊÑ¿ô
  'lon'          # NetCDF ¤Î¾ì¹ç¡¤ºÂɸÊÑ¿ô¤â¤½¤ì¼«¿È¤òºÂɸ¤Ë¤â¤Ä GPhys 
  'lat'          # ¤È¤·¤Æ³«¤±¤ë¤Î¤Ç¡¤Ì¾Á°¤¬É½¼¨¤µ¤ì¤ë¡¥
  'level'
  'T'
=> nil
irb(main):010:0> GDir.ls_l     # ¤è¤ê¾Ü¤·¤¯
Data:
  lon   [lon=36]        'Longitude'     (degrees_east)
  lat   [lat=19]        'Latitude'      (degrees_north)
  level [level=9]       'Level' (millibar)
  T     [lon=36,lat=19,level=9] 'Temperature'   (degC)
=> nil
irb(main):022:0> temp = GDir.data 'T'  # ¥«¥ì¥ó¥È¥Ç¥£¥ì¥¯¥È¥ê¡¼¤ÎÊÑ¿ô¤ò³«¤¯
=> <GPhys grid=<3D grid <axis pos=<'lon' in '/hogehoge/TUTORIAL/T.jan.nc'  sfloat[36]>>
        <axis pos=<'lat' in '/hogehoge/TUTORIAL/T.jan.nc'  sfloat[19]>>
        <axis pos=<'level' in '/hogehoge/TUTORIAL/T.jan.nc'  sfloat[9]>>>
   data=<'T' in '/hogehoge/TUTORIAL/T.jan.nc'  sfloat[36, 19, 9]>>

¤³¤Î¤è¤¦¤Ë¡¤¥Õ¥¡¥¤¥ë¤â´Þ¤á¥Ç¥£¥ì¥¯¥È¥ê¡¼¤È¤·¤Æ°·¤¦¤³¤È¤Ç¡¤ ³¬ÁØÅª¤ËÀ°Íý¤µ¤ì¤¿¥Ç¡¼¥¿¥»¥Ã¥È¤«¤é½ê˾¤ÎÊÑ¿ô¤òõ¤·¡¤ GPhys ¥ª¥Ö¥¸¥§¥¯¥È¤È¤·¤Æ³«¤¯¤³¤È¤¬¤Ç¤­¤ë¡¥

GDirÍøÍÑÎã(2)


¾å¤ÎÎã¤Ç¤Ï¡¤GDir ¤Î¥«¥ì¥ó¥È¥Ç¥£¥ì¥¯¥È¥ê¡¼¡ÊGDir¤Î¥¯¥é¥¹ÊÑ¿ô¤Ë¤Ê¤Ã¤Æ¤¤ ¤ë¡Ë¤Î¤ß¤òÍѤ¤¤¿¤Î¤Ç¡¤GDir ¥ª¥Ö¥¸¥§¥¯¥È¤ÏÍۤˤϸ½¤ì¤Ê¤«¤Ã¤¿¡¥º£Å٤ϡ¤ GDir ¥ª¥Ö¥¸¥§¥¯¥È¤ò°·¤¦Îã¤ò¼¨¤¹¡¥
% irb
irb(main):001:0> require "numru/gphys"
=> true
irb(main):002:0> include NumRu
=> Object
irb(main):003:0> GDir.top = Dir.pwd    # ¥È¥Ã¥×¥Ç¥£¥ì¥¯¥È¥ê¡¼¤ò¸½ºß¤Î¥Ç¥£¥ì¥¯¥È¥ê¡¼¤ËÊѹ¹
=> "/hogehoge/TUTORIAL"
irb(main):004:0> dir = GDir.cwd   # ¥«¥ì¥ó¥È¥Ç¥£¥ì¥¯¥È¥ê¡¼¤ò¼èÆÀ
=> /
irb(main):005:0> dir.class
=> NumRu::GDir        # dir ¤Ï GDir ¥ª¥Ö¥¸¥§¥¯¥È¤Ç¤¢¤ë
irb(main):006:0> dir.ls
Directories:
  'T.jan.ctl/'
  'T.jan.grib/'
  'T.jan.nc/'
  'testdir/'
Text files?:
  'ToDo'
=> nil
irb(main):007:0> dir2 = dir.dir('T.jan.grib/')
=> /T.jan.grib/
irb(main):008:0> dir2.ls_l
Data:
  TMP   [lon=36,lat=19,level=9] 'Temperature'   (K)
=> nil
irb(main):009:0> temp = dir2.data('TMP')
=> <GPhys grid=<3D grid <axis pos=<'lon' in 'TMP'  36>>
        <axis pos=<'lat' in 'TMP'  19>>
        <axis pos=<'level' in 'TMP'  9>>>
   data=<'TMP' in '/hogehoge/TUTORIAL/T.jan.grib'  [36, 19, 9]>>

¤³¤ÎÎã¤Ç¤Ï¡¤GDir ¤Î¥«¥ì¥ó¥È¥Ç¥£¥ì¥¯¥È¥ê¡¼¤Ï¥È¥Ã¥×¥Ç¥£¥ì¥¯¥È¥ê¡¼¤Î¤Þ¤Þ¡¤ ¥µ¥Ö¥Ç¥£¥ì¥¯¥È¥ê¡¼¤ò GDir ¥ª¥Ö¥¸¥§¥¯¥È¤È¤·¤Æ³«¤­¡ÊÊÑ¿ô̾ dir2¡Ë¡¤¤½¤Î Ãæ¤Î¥Ç¡¼¥¿¤ò GPhys ¥ª¥Ö¥¸¥§¥¯¥È¤È¤·¤Æ³«¤¤¤¿¡¥


irb¤òÍѤ¤¤¿ÂÐÏÃÍøÍÑ(2)


¥¹¥¿¡¼¥È¥¢¥Ã¥×¥Õ¥¡¥¤¥ë¤ÎÍøÍÑ(2) -- GDir ¤ÎÍøÍÑ


Á°½Ò¤Î irb ÆÉ¤ß¹þ¤ßÍÑ¥Õ¥¡¥¤¥ë .irbrc_ggraph ¤Ë GDir ¤Ë´Ø¤¹¤ëÀßÄê¤òÄɲ䷤ơ¤shell ¤Î¤è¤¦¤Ë irb ¤ò»È¤¨¤ë¤è¤¦¤Ë¤¹¤ë¡¥¡Öshell ¤Î¤è¤¦¤Ë¡×¤È¤Ï¡¤ls ¤ä ls_l ¤ÈÂǤÁ¹þ¤á ¤Ð¥Ç¥£¥ì¥¯¥È¥ê¡¼¤äÊÑ¿ô¤¬¥ê¥¹¥È¤µ¤ì¡¤cd ¤Ç¥Ç¥£¥ì¥¯¥È¥ê¡¼¤òÊѤ俤ꡤ ´Êñ¤Ë GPhys ÊÑ¿ô¤¬³«¤±¤¿¤ê¡Ê¥³¥Þ¥ó¥É̾¤Ï open ¤È¤¹¤ë¡Ë¤¹¤ë¤È¤¤¤¦¤³¤È ¤Ç¤¢¤ë¡¥
% alias irb_ggraph  'irb -r ~/.irbrc_ggraph'
% cat ~/.irbrc_ggraph.rb
print "Start interactive GGraph session\n"

require "numru/ggraph"
include NumRu
include GGraph

#<< GDir Setting >>
GDir.top='/'
GDir.cd(Dir.pwd)
def cwd; GDir.cwd; end        # returns the current working directory of GDir
def pwd; GDir.pwd; end        # prints the current working directory of GDir
def ls(path=nil); GDir.cwd.ls(path); end         # listing
def ls_l(path=nil); GDir.cwd.ls_l(path); end     # verbose listing
alias dir ls_l
def cd(path); GDir.cd(path); end
def open_all_data; GDir.cwd.open_all_data; end  # --> Hash of GPhys objs in cwd
def data(path); GDir.cwd.data(path); end        # --> GPhys
alias open data

#<< Graphic Setting >>
DCL.swpset('iwidth',700)      # window width
DCL.swpset('iheight',700)     # window height
###DCL.swpset('ldump',true)      # dump image files
DCL.swpset('lwait',false)     # do not wait mouse click to show the next page
###DCL.swpset('lalt',true)       # background plot
DCL.sgscmn(10)                # change colomap (see below)
###DCL.sgscmn(5)                 # change colomap (see below)

DCL.gropn(1)
DCL.sgpset('lfprop',true)   # to use the propotional font
DCL.sgpset('lcorner',false) # do not show the corner mark
DCL.sgpset('isub', 96)      # control character of subscription: '_' --> '`'
DCL.glpset('lmiss',true)    # handle data missing
=begin
¥«¥é¡¼¥Þ¥Ã¥×ÈÖ¹æ
 1:  dcl_original
 2:  black-orange-yellow-white
 3:  black-blue-cyan-white
 4:  blue-cyan-white-yellow-red
 5:  gray_scale
 6:  pastel_rainbow
 7:  black-rainbow-black
 8:  white_yellow_red
 9:  white_blue_black
 10: short_green_original
 11: black-rainbow-white
 12: pink-rainbow-pink
=end

¤Ç¤Ï¡¤¤³¤ì¤ò»È¤Ã¤Æ¥Ç¡¼¥¿¤òÉÁ²è¤·¤Æ¤ß¤è¤¦¡¥¥³¥Þ¥ó¥É̾¤Ï¡¤ ¾å¤Ç¤Î alias ¤Ë¤è¤ê¡¤irb_ggraph ¤Ç¤¢¤ë¡¥
% irb_ggraph
Start interactive GGraph session
 *** MESSAGE (SWDOPN) ***  GRPH1 : STARTED / IWS =  1.                         
irb(main):001:0> ls
Directories:
  'T.jan.ctl/'
  'T.jan.grib/'
  'T.jan.nc/'
  'testdir/'
Text files?:
  'ToDo'
=> nil
irb(main):002:0> cd  'T.jan.nc/'
=> /hogehoge/TUTORIAL/T.jan.nc/
irb(main):003:0> ls
Data:
  'lon'
  'lat'
  'level'
  'T'
=> nil
irb(main):004:0> temp = open 'T'
=> <GPhys grid=<3D grid <axis pos=<'lon' in '/hogehoge/TUTORIAL/T.jan.nc'  sfloat[36]>>
        <axis pos=<'lat' in '/hogehoge/TUTORIAL/T.jan.nc'  sfloat[19]>>
        <axis pos=<'level' in '/hogehoge/TUTORIAL/T.jan.nc'  sfloat[9]>>>
   data=<'T' in '/hogehoge/TUTORIAL/T.jan.nc'  sfloat[36, 19, 9]>>
irb(main):005:0> tone temp
=> nil

¤³¤Î¤è¤¦¤Ë shell ¤Î¤è¤¦¤Ë¥Ç¥£¥ì¥¯¥È¥ê¡¼¤òõ¤ê¤Ê¤¬¤é¡¤¥Ç¡¼¥¿¤Î¿Þ¼¨¤ä ²òÀϤ¬¤Ç¤­¤ë¡¥

¾åµ­¤Î¥»¥Ã¥·¥ç¥ó¤Î¼Â¹Ô·ë²Ì



¥Ç¡¼¥¿Áàºî¤Î´ðÁÃ


¤³¤³¤Ç, GPhys ¤Ë¤ª¤±¤ë¥Ç¡¼¥¿Áàºî¤Î´ðÁäòÀ°Íý¤·¤Æ¤ª¤³¤¦. µðÂç¤Ê¥Ç¡¼¥¿¤ò°·¤¦ºÝ¤Ëµ¤¤Ë¤¹¤Ù¤­, ¥Ç¡¼¥¿ÆÉ¤ß¹þ¤ß¤Ë´Ø¤¹¤ëÃí°Õ¤â½Ò¤Ù¤ë.

ÀÚ¤ê½Ð¤·


¾å¤Ç¤Ï, ¥á¥½¥Ã¥É cut ¤Ë¤è¤ê GPhys ¤ÎÀÚ¤ê½Ð¤·¤¬¹Ô¤¨¤ë¤³¤È¤ò½Ò¤Ù¤¿. GPhys ¤Î¥Ç¡¼¥¿ÀÚ¤ê½Ð¤·¥á¥½¥Ã¥É¤Ë¤Ï cut ¤È [] ¤Î2¼ïÎब¤¢¤ë. cut ¤ÏʪÍýŪ¤ÊºÂɸ¤ò»ØÄꤷ¤Æ¤ÎÀÚ¤ê½Ð¤·¤ò¹Ô¤¤, [] ¤Ï¥Ç¡¼¥¿¤Î³Ê»ÒÅÀ ¤Î¥¤¥ó¥Ç¥Ã¥¯¥¹¡Ê¡áÇÛÎó¤È¤·¤Æ¤Îź»ú¡Ë¤Ë´ð¤Å¤¤¤¿ÀÚ¤ê½Ð¤·¤ò¹Ô¤¦. ¤Þ¤º¤Ï¤½¤ì¤¾¤ì¤Î»ÅÍͤòÎã¤Ç¼¨¤¹.


kiridashi.rb
require "numru/gphys"
include NumRu
gphys = GPhys::NetCDF_IO.open('T.jan.nc', 'T')
print "gphys: rank=#{gphys.rank} shape=#{gphys.shape.inspect}\n"

gp135 = gphys.cut('lon'=>0..90)           # lon ¤È¤¤¤¦Ì¾Á°¤Î¼´¤ò 0¡Á90 ÅÙ¤Þ¤Ç
print "gp135: rank=#{gp135.rank} shape=#{gp135.shape.inspect}\n"

gprg1 = gphys.cut( 100.0..150.0, 30..50, 850) # 1,2¼¡¸µÌܤÏÈϰÏ, 3¼¡¸µÌܤÏÃͤÇ
print "gprg1 rank=#{gprg1.rank} shape=#{gprg1.shape.inspect}",
      "  0th dim: #{gprg1.coord(0).min} .. #{gprg1.coord(0).max}\n"

gprg2 = gphys[ 0..3, -3..-1, 0]               # ¾å¤ÈƱÍͤÀ¤¬ÇÛÎóź»ú¤Ç»ØÄê
print "gprg2 rank=#{gprg2.rank} shape=#{gprg2.shape.inspect}",
      "  0th dim: #{gprg2.coord(0).min} .. #{gprg2.coord(0).max}\n"
p gprg2     # ¤ª¤Þ¤«¤»É½¼¨


°Ê²¼¤Ï¼Â¹Ô·ë²Ì¡§


% ruby -Ke kiridashi.rb
gphys: rank=3 shape=[36, 19, 9]
gp135: rank=3 shape=[10, 19, 9]
gprg1 rank=2 shape=[6, 3]  0th dim: 100.0 degrees_east .. 150.0 degrees_east
gprg2 rank=2 shape=[4, 3]  0th dim: 0.0 degrees_east .. 30.0 degrees_east
<GPhys grid=<2D grid <axis pos=<'lon' shape=[4]  subset of a NumRu::VArrayNetCDF>>
        <axis pos=<'lat' shape=[3]  subset of a NumRu::VArrayNetCDF>>>
   data=<'T' shape=[4, 3]  subset of a NumRu::VArrayNetCDF>>


ºÇ¸å¤Î¹Ô¤Î p ¤Ë¤è¤ë¤ªÇ¤¤»É½¼¨ (p gprg2) ¤Î·ë²Ì¤Ï, 'lon', 'lat', 'T' ¤Î¥Ç¡¼¥¿¤¬¤¤¤º¤ì¤â "subset of a NumRu::VArrayNetCDF" ¤Ç¤¢¤ë¤³¤È¤ò¼¨¤·¤Æ ¤¤¤ë (VArrayNetCDF¤ÏNetCDFÊÑ¿ô¤ò¤¢¤¿¤«¤â ÇÛÎó¤Î¤è¤¦¤Ë¸«¤»¤ë¤¿¤á¤Î¥½¥±¥Ã¥È¤Î¤è¤¦¤Ê¥¯¥é¥¹¤Ç¤¢¤ë). ¼Â¤Ï, GPhys ¤Ë¤ª¤±¤ë¡ÖÀÚ¤ê½Ð¤·¡×¤ÏÁ´¤Æ, ¸µ¤Î¥Ç¡¼¥¿¤Ø¤ÎÈϰϤò ¸Â¤Ã¤¿»²¾È¤òÄêµÁ¤¹¤ë¤À¤±¤Ê¤Î¤Ç¤¢¤ë. ¤µ¤é¤Ë, ¤³¤ÎÎã¤Î¤è¤¦¤Ë NetCDF ¥Õ¥¡¥¤¥ëÃæ¤Î¥Ç¡¼¥¿¤Ë´Ø¤·¤Æ GPhys ¥ª¥Ö¥¸¥§¥¯¥È¤òÄêµÁ¤·¤¿¾ì¹ç, ¼õ¤±»®¤È¤Ê¤ë VArrayNetCDF ¤Ï, ÆâÉô¥Ç¡¼¥¿¤È¤·¤Æ¤Ï NetCDF ÊÑ¿ô¤Ø¤Î»²¾È¤·¤«»ý¤¿¤Ê¤¤. ¤è¤Ã¤Æ, ¾åµ­¤Î kiridashi.rb ¤ò¼Â¹Ô¤·¤¿¤À¤±¤Ç¤Ï, ÊÑ¿ô¤ÎÃÍ¤ÏÆÉ¤ß¹þ¤Þ¤ì¤Ê¤¤¡Ê¤¿¤À¤·Â°À­¤ÏɬÍפ˱þ¤¸¤ÆÆÉ¤ß¹þ¤Þ¤ì¤ë¡Ë. ÃÍ¤ÎÆÉ¤ß¹þ¤ß¤Ï, ²Ä»ë²½¤Ê¤É¤Î¤¿¤á¤Ë¼ÂºÝ¤ËɬÍפˤʤë¤Þ¤Ç¹Ô¤ï¤ì¤Ê¤¤¤Î¤Ç¤¢¤ë.


²Ä»ë²½¤ÎºÇ½é¤ÎÎã¤Ë¤ª¤±¤ë GGraph.contour( gphys ) ¤Ç¤Ï, À褺ºÇ½é¤Ë£²¼¡¸µ¤Î¥µ¥Ö¥»¥Ã¥È(ºÇ²¼Áإǡ¼¥¿)¤ÎÀÚ¤ê½Ð¤·¤¬¹Ô¤ï¤ì, ¤½¤Î¸å¿Þ¼¨¤ËɬÍפʥǡ¼¥¿¤Î¤ß¤òÆÉ¤ß¹þ¤à. ½¾¤Ã¤Æ, ²¾¤Ë¸µ¤Î¥Ç¡¼¥¿ ¤¬¿ô100MB¤Î£´¼¡¸µ¥Ç¡¼¥¿¤À¤Ã¤¿¤È¤·¤Æ¤âÌäÂê¤Ê¤¤.


¤µ¤Æ, ÀÚ¤ê½Ð¤·¤Ï»²¾È¤Ç¤¢¤ë¤«¤é, ¤â¤·¤â¾åµ­¤Î gprg2 ¤ËÃͤò½ñ¤­¹þ¤á¤Ð gphys, ¤½¤·¤ÆÂ縵¤Î NetCDF ¥Õ¥¡¥¤¥ë¤ËÊѹ¹¤¬È¿±Ç¤µ¤ì¤ë¤³¤È¤Ë¤Ê¤ë. ¤·¤«¤·, ¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¥Õ¥¡¥¤¥ë¤Ï Read-only ¤Ç¥ª¡¼¥×¥ó¤µ¤ì¤ë¤Î¤Ç, ÉÔÍѰդ˥ե¡¥¤¥ë¤òÊѹ¹¤¹¤ë¿´ÇۤϤ¤¤é¤Ê¤¤. ¼Â¤Ï, GPhys::NetCDF_IO.open ¤ÎÂè°ì°ú¿ô¤Ï, NetCDF ¥ª¥Ö¥¸¥§¥¯¥È¤Þ¤¿¤Ï ʸ»úÎó¤ò¼õ¤±¼è¤ë¤³¤È¤Ë¤Ê¤Ã¤Æ¤¤¤ë. ¤½¤·¤Æ, ¤â¤·Ê¸»úÎó¤Ê¤éÆâÉô¤Ç read-only ¤Î NetCDF ¥ª¥Ö¥¸¥§¥¯¥È ¤ò¥ª¡¼¥×¥ó¤·¤Æ»È¤¦.


½ñ¤­¹þ¤ß¤òµö¤·¤¿¤±¤ì¤Ð, °Ê²¼¤Î¤è¤¦¤Ë, ͽ¤á½ñ¤­¹þ¤ß²Äǽ¤È¤·¤Æ¥ª¡¼¥×¥ó¤·¤¿ NetCDF ¥ª¥Ö¥¸¥§¥¯¥È¤ò GPhys::NetCDF_IO.open ¤ËÍ¿¤¨¤ëɬÍפ¬¤¢¤ë.


file = NetCDF.open('T.jan.nc', 'a')        # 'a' ¤Ï¥Õ¥¡¥¤¥ë¤ÎÊÔ½¸¤òµö¤¹¥â¡¼¥É
gphys = GPhys::NetCDF_IO.open(file, 'T')

NetCDF.open ¤Î°ú¿ô¤Ï, ¥Õ¥¡¥¤¥ë̾¤ÈÆþ½ÐÎϥ⡼¥É¡Ê¾Êά²Ä¡Ë¤Ç¤¢¤ë. Æþ½ÐÎϥ⡼¥É¤Ï Ruby ¤ËÁȤ߹þ¤ß¤Î File ¥¯¥é¥¹¤Î»ÅÍÍ¤ÈÆ±¤¸¤Ç¤¢¤ë (¤½¤·¤Æ¤½¤ì¤Ï C ¸À¸ì¤Î»ÅÍÍ¤ÈÆ±¤¸¤Ç¤¢¤ë). ⤷, NetCDF¤Ï¾ï¤Ë¥Ð¥¤¥Ê¥ê¡¼¤Ç¤¢¤ë¤¿¤á 'b' ¤ÏɬÍפ¯, ¤Þ¤¿¤É¤Î¥â¡¼¥É¤Ç¤âÆÉ¤ß¹þ¤ß¤Ï²Äǽ¤Ç¤¢¤ë.


Ê¿¶Ñ¤ä¤½¤Î¾¤Î±é»»¤Ë¤Ä¤¤¤Æ


GPhys ¥Ç¡¼¥¿¤ÏÀÚ¤ê½Ð¤¹¤À¤±¤Ç¤Ê¤¯, Ê¿¶Ñ¤ò¼è¤Ã¤¿¤ê ¿ô³Ø±é»»¤äÅý·×Áàºî¤ò¹Ô¤¦¤³¤È¤¬¤Ç¤­¤ë. ÀÚ¤ê½Ð¤·¤Þ¤Ç¤Ï¥Ç¡¼¥¿¤Ë´Ø¤¹¤ë±é»»¤¬ÉÔÍפǤ¢¤ë¤Î¤Ç, GPhys¥ª¥Ö¥¸¥§¥¯¥È¤Ï NetCDF ¥Õ¥¡¥¤¥ëÃæ¤ÎÊÑ¿ô ¤Ø¤Î»²¾È¤òÊÝ»ý¤·¤Æ¤¤¤ë¤À¤±¤À¤Ã¤¿¤¬, Ê¿¶Ñ¤ò¤È¤ë¤Ê¤É¤È¤Ê¤ì¤Ð¼ÂºÝ¤Î¥Ç¡¼¥¿¤ÎÆÉ¤ß½Ð¤·¤È±é»»¤¬¹Ô¤ï¤ì¤ë¤³¤È¤Ë¤Ê¤ë. ¥Ç¡¼¥¿¤Ï¤â¤Ï¤ä¥Õ¥¡¥¤¥ë¤òÎ¥¤ì, ¥á¥â¥ê¡¼¾å¤ËÊÝ»ý¤µ¤ì¤ë. ¤·¤«¤·, GPhys ¤Ë¤ª¤¤¤Æ¤Ï, ¥á¥â¥ê¡¼¾å¤Î¥Ç¡¼¥¿¤â, ¥Õ¥¡¥¤¥ëÃæ¤Ë¤¢¤ë¥Ç¡¼¥¿¤ÈÁ´¤¯Æ±ÍÍ¤Ë °·¤ï¤ì¤ë. ½¾¤Ã¤Æ, ÍøÍѼԤÏξ¼Ô¤ò¶èÊ̤¹¤ëɬÍפϤʤ¤. ⤷, µðÂç¤Ê ¥Ç¡¼¥¿¤ò°·¤Ã¤Æ¤¤¤ëºÝ¤Ë¤Ï, ¥á¥â¥ê¡¼¤ò°µÇ÷¤·¤Ê¤¤¤è¤¦, ɬÍפÊÉôʬ¤òÀÚ¤ê½Ð ¤·¤Æ¤«¤é±é»»¤¹¤ë¤³¤È¤Ï¿´³Ý¤±¤¿¤Û¤¦¤¬Îɤ¤.


¼ÂºÝ, ¥¯¥é¥¹ GPhys ¤Ï, ¥Ç¡¼¥¿¤¬¥Õ¥¡¥¤¥ëÃæ¤Ë¤¢¤ë¤Î¤« NArray Ãæ¤Ë¤¢¤ë¤Î¤«¤ò, ľÀܤˤÏÁ´¤¯ÃΤé¤Ê¤¤. ¤³¤Î°ã¤¤¤Ï, GPhys ÇÛ²¼¤Î VArray (= Virtual Array)¤¬µÛ¼ý¤¹¤ë. Î㤨¤ÐÁ°½Ò¤Î VArrayNetCDF ¤Ï, VArray ¤Î¥µ¥Ö¥¯¥é¥¹¤Ç¤¢¤ë. ¡Ê¤è¤Ã¤Æ, ̤¥µ¥Ý¡¼¥È¤Î¥Õ¥©¡¼¥Þ¥Ã¥È¤Ø¤ÎÂбþ¤Ï, Âбþ¤¹¤ë VArray ¤òºî¤ë¤³¤È¤¬¼ç¤Ê»Å»ö¤È¤Ê¤ë. ¡Ë


¤µ¤Æ, ²¼¤Î¥×¥í¥°¥é¥à¤Ï, Á´µåÊ¿¶Ñµ¤²¹¤Î±ôľ¥×¥í¥Õ¥¡¥¤¥ë¤òɽ¼¨¤¹¤ë. ¥½¡¼¥¹¤Ï line_2.rb ¤È¤Û¤È¤ó¤ÉÊѤé¤Ê¤¤¤³¤È¤ËÃí°Õ¤»¤è.


line_3.rb
 1: require "numru/ggraph"
 2: include NumRu
 3: gphys = GPhys::IO.open('T.jan.nc', 'T')
 4: DCL.gropn(1)
 5: DCL.sgpset('isub', 96)
 6: DCL.sgpset('lfull',true)
 7: DCL.uzfact(0.6)
 8: GGraph.set_fig( 'itr'=> 2, 'viewport'=>[0.25,0.7,0.15,0.6] )
 9: GGraph.line( gphys.mean(0,1), true, 'exchange'=>true )
10: DCL.grcls

·ë²Ì¤Î¿Þ¤Ï²¼. Ïȳ°±¦¾å¤Î¾ðÊó¤¬Ê¿¶Ñ¤òɽ¤¹¤â¤Î¤ËÊѤäƤ¤¤ë¤³¤È¤ËÃí°Õ.


line_3.rb¼Â¹Ô·ë²Ì


¤³¤³¤Ç¤Ï, mean(0,1)¤ÇÂè 1,2 ¼¡¸µÌܤÎÊ¿¶Ñ¤ò¼è¤Ã¤Æ¤¤¤ë. ÇÛÎóÍ×ÁÇÆ±ÍÍ, ¼¡¸µ¤â 0 ¤«¤é¿ô¤¨¤ë¤Î¤Ç¤¢¤ë. GPhys¤Î¥á¥½¥Ã¥É mean ¤Ï³Æ³Ê»ÒÅÀ¤Î½Å¤ß¤¬Åù¤·¤¤Ã±½ãÊ¿¶Ñ¤ò¹Ô¤¦. ÍøÍÑË¡¤Ï NArray ¤Î¥á¥½¥Ã¥É mean ¤ÈƱ¤¸¤Ç¤¢¤ë¡Ê¤½¤·¤Æ, ƱÍÍ¤Ë sum, max, min, stddev ¤Ê¤É¤Î¥á¥½¥Ã¥É¤¬¤¢¤ë¡Ë.


¤µ¤Æ, ¼ÂºÝ¤Ë¤Ï, ¥Ç¡¼¥¿¤Ï 90N-90S ¤ÇÎ¥»¶Åª¤Ë¥µ¥ó¥×¥ë¤µ¤ì¤â¤Î¤¬ Æþ¤Ã¤Æ¤¤¤ë¤ï¤±¤À¤«¤é, Ê¿¶Ñ¤Ï¤à¤·¤í, Âæ·Á¸ø¼°¤ä¥·¥ó¥×¥½¥ó¸ø¼°Åù¤ÇÀÑʬ¤·¤¿¾å¤Ç, Ťµ¤Ç³ä¤ë¤Î¤¬¼«Á³¤Ç¤¢¤ë. ¤³¤Î¤è¤¦¤Ê¼Â¶õ´Ö¤Ç¤ÎÊ¿¶Ñ¤Ï¥á¥½¥Ã¥É average ¤Ç¹Ô¤¦¤³¤È¤¬¤Ç¤­¤ë¡§


9: GGraph.line( gphys.average(1).average(0), true, 'exchange'=>true )

¤³¤Î¤è¤¦¤Ê, ¼Â¶õ´Ö¤Ë¤ª¤±¤ëÁàºî¤ò¹Ô¤¦¥á¥½¥Ã¥É¤Ï, ¸½ºß¤Î¤È¤³¤í average ¤È integrate ¤Î£²¤Ä¤Ç¤¢¤ë. ¶¦¤Ë¥Ç¥Õ¥©¥ë¥È¤ÎÀÑʬ¥¢¥ë¥´¥ê¥º¥à¤Ï Âæ·Á¸ø¼°¤Ç¤¢¤ë¡Ê¼ÂºÝ¤Ë¤Ï³Ê»Ò¤ÎÀ­³Ê¤Ë¤è¤Ã¤Æ¥¢¥ë¥´¥ê¥º¥à¤¬ÊѤ뤬, NetCDF¤Î¥æ¡¼¥¶¡¼¥º¥¬¥¤¥É¤Î¤ß¤ò²ò¼á¤·¤Æ¤¤¤ë¾ì¹ç, ³Ê»Ò¤ÎÀ­³Ê¤ÏÃΤêÆÀ¤Ê¤¤ ¤Î¤Ç¤½¤¦¤Ê¤ë¡Ë. ¤³¤ì¤é¤Ï³Æ¼¡¸µËè¤Ë¹Ô¤¦É¬Íפ¬¤¢¤ë¤Î¤Ç, average(1).average(0) ¤È½Å¤Í¤Æ¸Æ¤ó¤Ç¤¤¤ë. ¤Ê¤ª, ¤³¤Î¾ì¹ç¤Ç¤â, ¶ËÉÕ¶á¤Î³Ê»ÒÅÀ¤Î·ÐÅÙ´Ö³Ö¤¬Ã»¤¤¤³¤È¤ò¹Íθ¤·¤¿Ê¿¶Ñ¤Ë¤Ï¤Ê¤é¤Ê¤¤¤³¤È¤ËÃí°Õ. ¾­ÍèŪ¤Ë¤Ï, µåºÂɸ¤Ê¤É¤¤¤Ã¤¿ºÂɸ·Ï¤òÀßÄꤷ, ²ò¼á¤µ¤»¤é¤ì¤ë¤è¤¦¤Ë¤¹¤ëͽÄê¤Ç¤¢¤ë.



ʪÍýÎ̤Îñ°Ì


VArray, GPhys ¤Ï, ʪÍýÎ̤Îñ°Ì¤òǧ¼±¤¹¤ë.


ñ°Ì¤Ï°À­ "units" ¤Ç»ØÄꤵ¤ì, ¤½¤Î±é»»¤Ï NumRu::Units ¤¬¹Ô¤¦. ¤³¤ì¤Ë¤è¤ê, Î㤨¤Ð VAray ¤ä GPhys ¤Î³Ý¤±»»¤ò ¹Ô¤¦¤È, ñ°Ì¤Î³Ý¤±»»¤â¹Ô¤ï¤ì¤ë. ¤Þ¤¿, Äê¿ôÇÜ and/or ¥ª¥Õ¥»¥Ã¥Èʬ¤Î°ã¤¤ ¤¬¤¢¤ëñ°Ì¤ò»ý¤Ä¥Ç¡¼¥¿¤ÎÏ¡¦º¹¤Ï, Â裲¹à¤òÂ裱¹à¤Îñ°Ì¤Ë¹ç¤ï¤»¤ë´¹»»¤ò ¹Ô¤Ã¤Æ¤«¤é¹Ô¤¦¡ÊÎ㤨¤Ð, km ¤È m ¤ä degree_C ¤È K ¤Î´Ö¤Î´¹»»¤Ê¤É¡Ë.


¤µ¤é¤Ë, GPhys ¤Î¥Ñ¥Ã¥±¡¼¥¸Æâ¤Ë¤Ï, ¤³¤ì¤òÍѤ¤¤¿ NumRu::UNumeric ¤È¤¤¤¦, ñ°ÌÉդοôÃÍ(¥¹¥«¥é¡¼)¤Î¥¯¥é¥¹¤¬ÄêµÁ¤µ¤ì¤Æ¤¤¤ë. GPhys, VArray, UNumeric ¤Ï¼«Í³¤Ë£²¹à±é»»¤ò¹Ô¤¦¤³¤È¤¬¤Ç¤­¤ë. ¡Ê·ë²Ì¤Î¥¯¥é¥¹¤Ï GPhys, VArray, UNumeric ¤Î½ç¤Ë¹ç¤ï¤µ¤ì¤ë. Î㤨¤Ð UNumric ¤È GPhys ¤Î±é»»·ë²Ì¤Ï GPhys. ¡Ë


op_units.rb
 1: require "numru/gphys"
 1: include NumRu
 2: temp = GPhys::NetCDF_IO.open('T.jan.nc', 'T')
 3: p( temp.data.get_att('units') )
 4: p( (temp*temp).data.get_att('units') )
 5: p( (temp*temp).units.to_s )
 6: 
 7: R = UNumeric[ 287.04, 'J.K-1.kg-1' ]   # Gas const of dry air
 8: p( (R*temp).data.get_att('units') )  # Bad, because temperature should be in K
 9: zeroK = UNumeric[ 0.0, 'K' ]
10: tempK = zeroK + temp
11: p( (R*tempK).data.get_att('units') )


°Ê²¼¤Ï¼Â¹Ô·ë²Ì¡§


% ruby op_units.rb
"degC"
"degC2"
"degC2"
"J.K^(-1.0).degC.kg-1"
"J.kg-1"


Â裴¹ÔÌܤΠ(temp*temp) ¤Î·ë²Ì¤È¤·¤Æ, µ¤²¹¤Îñ°Ì "degC" ¤¬2¾è¤µ¤ì¤Æ "degC2" ¤È¤Ê¤Ã¤Æ¤¤¤ë¤³¤È¤¬¤ï¤«¤ë. £·¹ÔÌܤǤÏ, µ¤ÂÎÄê¿ô R = 287.04 [J.kg-1.K-1] ¤ò½àÈ÷¤·, £¸¹ÔÌܤǤϵ¤²¹¤È³Ý¤±¹ç¤ï¤µ¤ì¤ë. ¤½¤Î·ë²Ì¤Îñ°Ì¤Ï "J.K^(-1.0).degC.kg-1" ¤È¤Ê¤Ã¤¿. K ¤È degC ¤¬¥­¥ã¥ó¥»¥ë¤·¤Æ¤Ê¤¤¤Î¤Ç¾¯¤·¸«¤Ë¤¯¤¤¤¬, ¤·¤«¤·, Îɤ¯¹Í¤¨¤ë¤Èµ¤ÂÎÄê¿ô¤Ë³Ý¤±¤Æ°ÕÌ£¤¬¤¢¤ë¤Î¤Ï, Ä̾ï¤ÏÀäÂв¹Å٤Ǥ¢¤ë¤³¤È¤ò»×¤¤½Ð¤¹¤Ç¤¢¤í¤¦¡Ê¤¿¤Ö¤ó¡Ë. ¤½¤³¤Ç, 9,10¹ÔÌܤǤÏ, ­¤·»»¤Î·ë²Ì¤Îñ°Ì¤¬Âè°ì¹à¤Ë¹ç¤ï¤µ¤ì¤ë¤³¤È¤òÍøÍѤ·¤Æ, Kelvin ¤ËÊÑ´¹¤¹¤ë¡§

    zeroK = UNumeric[ 0.0, 'K' ]
    tempK = zeroK + temp

¤³¤Î·ë²Ì¤Ë R ¤ò³Ý¤±¤ë¡Ê11¹ÔÌܡˤÈ, ·ë²Ì¤Îñ°Ì¤Ï "J.kg-1" ¤È½Ð¤¿.



¥Ç¡¼¥¿¤ò¥Õ¥¡¥¤¥ë¤Ë½ñ½Ð¤¹


GPhys ¤òÍøÍѤ¹¤ë¤È¼«¸Êµ­½ÒŪ¤Ê¥Õ¥¡¥¤¥ë¤Î½ñ¤­½Ð¤·¤¬Íưפ˹Ԥ¨¤ë. À褺ºÇ½é¤Ë NetCDF ¤Ê¤É, ¤¹¤Ç¤Ë¼«¸Êµ­½ÒŪ¤Ê¥Ç¡¼¥¿¤ò GPhys ¤È¤·¤ÆÆÉ¤ß¹þ¤ó¤Ç¤«¤é¡ÊɬÍפ˱þ¤¸¤Æ²Ã¹©¤Î¾å¡Ë¥Õ¥¡¥¤¥ë¤Ë½ÐÎϤ¹¤ë ¥±¡¼¥¹¤ò°·¤¦. ¸å¤Ç¼¨¤¹¤è¤¦¤Ë¥Õ¥¡¥¤¥ë¤Î·¿ÊÑ´¹¤âÍÆ°×¤Ç¤¢¤ë. ¤Ä¤¤¤Ç, È󼫸ʵ­½ÒŪ¤Ê¥Ç¡¼¥¿Åù¤ò¤â¤È¤Ë°ì¤«¤é GPhys ¥ª¥Ö¥¸¥§¥¯¥È¤ò¹½À®¤·¤¿¾å¤Ç¥Õ¥¡¥¤¥ë¤Ë½ñ½Ð¤¹Îã¤ò¼¨¤¹. ¸½ºß¤Î¤È¤³¤í½ñ½Ð¤¹¥Õ¥¡¥¤¥ë·Á¼°¤Ï NetCDF ¤Þ¤¿¤Ï grib ¤À¤±¤Ç, GrADS ¤Î½ñ½Ð¤·¤Ï¤Þ¤À¥µ¥Ý¡¼¥È¤·¤Æ¤Ê¤¤.

GPhys¥Ç¡¼¥¿¤Î½ñ½Ð¤·


GPhys ¥ª¥Ö¥¸¥§¥¯¥È¤ÎÁ´ÂΤò, ¼«¸Êµ­½ÒÀ­¤òÊݤ俤ޤÞ, ¥Õ¥¡¥¤¥ë¤Ë½ñ½Ð¤¹¤³¤È¤¬¤Ç¤­¤ë. ¼¡¤ÎÎã¤Ç¤Ï, NetCDF ¥Õ¥¡¥¤¥ë¤òÆÉ¤ß¹þ¤ó¤Ç, Îΰè¤ò¸Â¤Ã¤¿°ìÉôʬ¤ò NetCDF ¥Õ¥¡¥¤¥ë¤Ë½ñ½Ð¤¹. ½ñ½Ð¤¹Îΰè¤ËÂбþ¤·¤ÆºÂɸÊÑ¿ô¤âÀµ¤·¤¯ÀÚ¤ê½Ð¤µ¤ì¤ë.

ncwrite1.rb
1: require "numru/gphys"
2: include NumRu
3: gphys = GPhys::NetCDF_IO.open('T.jan.nc', 'T')
4: outfile = NetCDF.create('tmp.nc')
5: GPhys::NetCDF_IO.write( outfile, gphys.cut('level'=>1000..250).mean(0) )
6: GPhys::NetCDF_IO.write( outfile, gphys.cut('level'=>1000..250).mean(0,1).rename('T00') )
7: outfile.close

% ruby ncwrite1.rb
% ncdump -c tmp.nc
netcdf tmp {
dimensions:
        lat = 19 ;
        level = 5 ;
variables:
        float lat(lat) ;
                lat:units = "degrees_north" ;
                lat:actual_range = 90.f, -90.f ;
                lat:long_name = "Latitude" ;
        float level(level) ;
...(ÃæÎ¬)...
        float T(level, lat) ;
...(ÃæÎ¬)...
        float T00(level) ;
...(ÃæÎ¬)...
// global attributes:
                :history = "2004-03-19 19:40:17 JST horinout> NumRu::GPhys::NetCDF_IO.write T" ;
data:

 lat = 90, 80, 70, 60, 50, 40, 30, 20, 10, 0, -10, -20, -30, -40, -50, -60, 
    -70, -80, -90 ;

 level = 1000, 850, 600, 400, 250 ;
}

¥½¡¼¥¹¤ÎÂè 5,6 ¹ÔÌܤΤ褦¤Ë, GPhys::NetCDF_IO.write ¤ò·«¤êÊÖ¤·¤Æ, °ì¤Ä¤Î¥Õ¥¡¥¤¥ë¤ËÊ£¿ô¸Ä¤ÎÊÑ¿ô¤ò ½ñ¤¯¤³¤È¤¬½ÐÍè¤ë. ⤷, NetCDF ¤ÎÀ©Ìó¤ÇƱ¤¸Ì¾Á°¤ÎÊÑ¿ô¤Ï°ì¤Ä¤·¤«½ñ¤±¤Ê¤¤¤Î¤Ç, ¤³¤³¤Ç¤Ï2ÈÖÌܤ˽ñ¤¯¥Ç¡¼¥¿¤ò 'T00' ¤È²þ̾¤·¤Æ¤¤¤ë. ²þ̾¤·¤Ê¤±¤ì¤Ðξ¥Ç¡¼¥¿¤Î̾Á°¤ÏƱ¤¸¤Ê¤Î¤ÇÎã³°¤¬È¯À¸¤¹¤ë. °ìÊý, ºÂɸÊÑ¿ô¤Î¾ì¹ç¤Ï, Ê£¿ô¤Î GPhys ¤Ç¶¦Í­¤·¤Æ¤ë¾ì¹ç¤¬Â¿¤¤¤Î¤Ç, ´û¸¤ÎƱ̾¤Î¤â¤Î¤¬¤¢¤ë¾ì¹ç¤Ï¼¡¸µ¤È¥µ¥¤¥º(shape)¤ò¥Á¥§¥Ã¥¯¤·, °ìÃפ¹¤ì¤ÐƱ¤¸¤â¤Î¤È¸«¤Ê¤·½ñ¤­¹þ¤ß¤ò¾Êά¤¹¤ë. °ìÃפ·¤Ê¤¤¾ì¹ç¤ÏÎã³°¤¬È¯À¸¤¹¤ë. ¾å¤ÎÎã¤Ç¤Ï, level¤È¤¤¤¦ºÂɸÊÑ¿ô¤¬¶¦Í­¤µ¤ì¤Æ¤¤¤ë.

¥Õ¥¡¥¤¥ë·Á¼°¤ÎÊÑ´¹


GPhys¤ò²ð¤¹¤ë¤³¤È¤Ç, ¥Õ¥¡¥¤¥ë¤Î·¿ÊÑ´¹¤ò´Êñ¤Ë¹Ô¤¦¤³¤È¤¬¤Ç¤­¤ë.

convert.rb
 1: require "numru/gphys"
 2: include NumRu
 3: 
 4: usage = "\nUSAGE:\n % #{$0} in_file out_file\n"
 5: ifpath = ARGV.shift || raise(usage)
 6: ofpath = ARGV.shift || raise(usage)
 7: 
 8: raise "File #{ofpath} present. Delete it if needed." if File.exist?(ofpath)
 9: case ofpath
10: when /\.nc$/
11:   ofile = NetCDF.create(ofpath)
12: when /\.grib$/
13:   ofile = Grib.create(ofpath)
14: else
15:   raise "unsupported file type (judged by suffix): "+ofpath
16: end
17: 
18: GPhys::IO.var_names_except_coordinates( ifpath ).each do |varname|
19:   GPhys::IO.write(ofile, GPhys::IO.open(ifpath, varname) )
20: end
21: 
22: ofile.close

¤³¤Î¥×¥í¥°¥é¥à¤Ç¤Ï, ÊÑ´¹Àè¤Î¥Õ¥¡¥¤¥ë¤Î·¿¤ò, ¥µ¥Õ¥£¥Ã¥¯¥¹ (.nc ¤« .grib) ¤Ë±þ¤¸¤Æ·è¤á¤Æ¤¤¤ë. ÆþÎÏ¥Õ¥¡¥¤¥ë¤Î·¿¤Ï¼«Æ°È½Ê̤µ¤ì¤ë¤Î¤Ç, ÆÃ¤Ë²¿¤â¤·¤Ê¤¯¤Æ¤è¤¤. ¤Ê¤ª, 19 ¹ÔÌÜ¤Ç¤ÏÆþÎϤ¹¤ë¥Õ¥¡¥¤¥ëÃæ¤ÎÊÑ¿ô¤ò°ìöÁ´Éô¥á¥â¥ê¡¼¤Ë ÆÉ¤ß¹þ¤ó¤Ç¤«¤é¥Õ¥¡¥¤¥ë¤Ë½ñ½Ð¤¹¤è¤¦¤Ë¤Ê¤Ã¤Æ¤¤¤ë¤Î¤Ç, µðÂç¥Ç¡¼¥¿¤Î°·¤¤¤Ë¤ÏÁê±þ¤·¤¯¤Ê¤¤. µðÂç¥Ç¡¼¥¿¤Î¼è¤ê°·¤¤ÊýË¡¤Ï¸å½Ò¤¹¤ë. ¤Ê¤ª, GPhys 0.4.0 ¤Ç¤Ï¥Ð¥°¤Î¤¿¤á, ¾åµ­¥×¥í¥°¥é¥à¤Ë¤è¤ë grib ¥Õ¥¡¥¤¥ë¤Ø¤ÎÊÑ´¹¤¬¹Ô¤¨¤Ê¤¤. º£¸å¥ê¥ê¡¼¥¹¤µ¤ì¤ë 0.4.1 °Ê¹ß¤¬É¬Íפˤʤë.

¼Â¹ÔÎã (⤷, 3ÈÖÌÜ¤Î¤Ï GPhys 0.4.0 ¤Ç¤ÏÀµ¾ï¤Ë¼Â¹Ô¤Ç¤­¤Ê¤¤):
% ruby convert.rb T.jan.grib tmp1.nc
% ruby convert.rb T.jan.ctl tmp2.nc
% ruby convert.rb T.jan.nc tmp.grib
% ls tmp*
tmp.grib  tmp1.nc  tmp2.nc

½ÐÍ褿¥Õ¥¡¥¤¥ë¤Î³Îǧ:
% ncdump -h tmp1.nc 
netcdf tmp1 {
dimensions:
        lon = 36 ;
        lat = 19 ;
        level = 9 ;

variables:
        float lon(lon) ;
                lon:long_name = "longitude" ;
                lon:units = "degrees_east" ;
                lon:short_name = "lon" ;
        float lat(lat) ;
                lat:long_name = "latitude" ;
                lat:units = "degrees_north" ;
                lat:short_name = "lat" ;
        long level(level) ;
                level:long_name = "isobaric level" ;
                level:units = "hPa" ;
        double TMP(level, lat, lon) ;
                TMP:time = "0000-01-01 00:00:0.0" ;
                TMP:long_name = "Temperature" ;
                TMP:units = "K" ;
                TMP:standard_name = "air_temperature" ;

// global attributes:
                :history = "2005-03-21 18:06:19 JST horinout> NumRu::GPhys::NetCDF_IO.write TMP" ;
}
% wgrib tmp.grib
1:0:d=00010100:TMP:kpds5=11:kpds6=100:kpds7=1000:TR=1:P1=0:P2=0:TimeU=0:1000 mb:anl:NAve=0
2:1463:d=00010100:TMP:kpds5=11:kpds6=100:kpds7=850:TR=1:P1=0:P2=0:TimeU=0:850 mb:anl:NAve=0
3:2926:d=00010100:TMP:kpds5=11:kpds6=100:kpds7=600:TR=1:P1=0:P2=0:TimeU=0:600 mb:anl:NAve=0
4:4389:d=00010100:TMP:kpds5=11:kpds6=100:kpds7=400:TR=1:P1=0:P2=0:TimeU=0:400 mb:anl:NAve=0
5:5852:d=00010100:TMP:kpds5=11:kpds6=100:kpds7=250:TR=1:P1=0:P2=0:TimeU=0:250 mb:anl:NAve=0
6:7315:d=00010100:TMP:kpds5=11:kpds6=100:kpds7=150:TR=1:P1=0:P2=0:TimeU=0:150 mb:anl:NAve=0
7:8778:d=00010100:TMP:kpds5=11:kpds6=100:kpds7=70:TR=1:P1=0:P2=0:TimeU=0:70 mb:anl:NAve=0
8:10241:d=00010100:TMP:kpds5=11:kpds6=100:kpds7=30:TR=1:P1=0:P2=0:TimeU=0:30 mb:anl:NAve=0
9:11704:d=00010100:TMP:kpds5=11:kpds6=100:kpds7=10:TR=1:P1=0:P2=0:TimeU=0:10 mb:anl:NAve=0

ÈóGPhys¥Ç¡¼¥¿¤Î½ñ½Ð¤· -- GPhys¥ª¥Ö¥¸¥§¥¯¥È¤ò°ì¤«¤éºî¤ë


(by À¾ß·À¿Ìé, ²þ: ËÙÇ·Æâ)

°ì¤«¤éNetCDF¥Õ¥¡¥¤¥ë¤ò½ñ¤­½Ð¤¹ºÝ¤Ë¤âGPhys¤ò»È¤¦¤È´Êñ¤Ë½ñ¤¯¤³¤È¤¬¤Ç¤­¤ë.

°Ê²¼¤Î¥×¥í¥°¥é¥à¤Ç¤Ï¥Õ¥¡¥¤¥ë¤ÏÆÉ¤ß¹þ¤ó¤Ç¤ª¤é¤º, ºÂɸ¾ðÊó¤â´Þ¤á°ì¤«¤é GPhys ¥ª¥Ö¥¸¥§¥¯¥È¤ò¹½À®¤·, ¤½¤ì¤ò NetCDF ¥Õ¥¡¥¤¥ë¤Ë½ÐÎϤ¹¤ë. °ìö GPhys ¥ª¥Ö¥¸¥§¥¯¥È¤ò·Ðͳ¤¹¤ë¤³¤È¤Ç, RubyNetCDF ¤Î¥á¥½¥Ã¥É¤òľÀܰ·¤ï¤º¤ËºÑ¤ß, ¥×¥í¥°¥é¥à¤¬´Êñ¤Ë¤Ê¤ë.

ncwrite2.rb
require "numru/gphys"
include NumRu

nlon = 36
nlat = 18

lon_a = VArray.new( NArray.sfloat(nlon).indgen(0,360.0/nlon),
                    {"long_name"=>"longitude", "units"=>"degrees_east"},
                    "lon" )
lon = Axis.new.set_pos(lon_a)
 
lat_a = VArray.new( NArray.sfloat(nlat).indgen(0,180/nlat),
                    {"long_name"=>"latitude","units"=>"degrees_north"},
                    "lat" )
lat = Axis.new.set_pos(lat_a)
 
data = VArray.new( NArray.sfloat(nlon,nlat).indgen,
                   {"long_name"=>"temperature", "units"=>"K"},
                   "T" )
gphys = GPhys.new( Grid.new(lon,lat), data )
 
file = NetCDF.create("tmp.nc")
GPhys::NetCDF_IO.write(file,gphys)
file.close

¾åµ­¤Î¥×¥í¥°¥é¥à¤ò¼Â¹Ô¤·, ½ÐÍè¤ë¥Õ¥¡¥¤¥ë tmp.nc ¤ÎÃæ¿È¤ò³Îǧ¤·¤è¤¦¡§
% ruby ncwrite2.rb
% ncdump -c tmp.nc
netcdf tmp {
dimensions:
        lon = 36 ;
        lat = 18 ;
variables:
        float lon(lon) ;
                lon:long_name = "longitude" ;
                lon:units = "degrees_east" ;
        float lat(lat) ;
                lat:long_name = "latitude" ;
                lat:units = "degrees_north" ;
        float T(lat, lon) ;
                T:long_name = "temperature" ;
                T:units = "K" ;
 
// global attributes:
                :history = "2004-04-19 12:02:36 JST horinout> NumRu::GPhys::NetCDF_IO.write T" ;
data:
 
 lon = 0, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 110, 120, 130, 140, 150,
    160, 170, 180, 190, 200, 210, 220, 230, 240, 250, 260, 270, 280, 290,
    300, 310, 320, 330, 340, 350 ;
 
 lat = 0, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 110, 120, 130, 140, 150,
    160, 170 ;
}
°ìÅÙÊÑ¿ô¤ÎVArray Class¥ª¥Ö¥¸¥§¥¯¥È¤òºî¤Ã¤Æ¤«¤éAxis Class¤äGPhys Class¥ª¥Ö¥¸¥§¥¯¥È¤òºî¤ë.


µðÂç¥Ç¡¼¥¿¤Î°·¤¤


°ìÊÑ¿ô¤¬¿ô100MB°Ê¾å¤Î¥Ç¡¼¥¿¤ò°·¤¦¾ì¹ç, °ìÅÙ¤ËÆÉ¤ß¹þ¤à¤È·×»»µ¡¤Î¥á¥â¥ê¡¼¤ò°µÇ÷¤¹¤ë¤Ç¤¢¤í¤¦. GPhys ¤Ç¤Ï¤½¤ì¤òÈò¤±¤ë¤¿¤á¤Î¹©Éפ¬´ö¤Ä¤«¤¢¤ë.

GPhys¤Ë¤ª¤±¤ë¥µ¥Ö¥»¥Ã¥È¤È¥¯¥í¡¼¥Ë¥ó¥°


¤½¤ÎÂè°ì¤Ï, ¡ÖɬÍפˤʤé¤Ê¤¤¸Â¤ê¥Ç¡¼¥¿¤ÏÆÉ¤ß¹þ¤Þ¤Ê¤¤¡×¤È¤¤¤¦ GPhys ¤ÎÀß·×Êý¿Ë¤Ç¤¢¤ë. Î㤨¤Ð, [] ¤ä cut ¤Ë¤è¤ë¥µ¥Ö¥»¥Ã¥ÈÀÚ¼è¤Ç¤Ï¥Õ¥¡¥¤¥ë¤ÎÆÉ¤ß¹þ¤ß¤ÏȯÀ¸¤·¤Ê¤¤. ²¼µ­¤ÎÎã¤ò¸«¤ÆÌ㤤¤¿¤¤.
% irb
irb(main):001:0>  require "numru/gphys"
=> true
irb(main):002:0> include NumRu
=> Object
irb(main):003:0> gphys = GPhys::IO.open('T.jan.nc','T')
=> <GPhys grid=<3D grid <axis pos=<'lon' in 'T.jan.nc'  sfloat[36]>>
        <axis pos=<'lat' in 'T.jan.nc'  sfloat[19]>>
        <axis pos=<'level' in 'T.jan.nc'  sfloat[9]>>>
   data=<'T' in 'T.jan.nc'  sfloat[36, 19, 9]>>
irb(main):004:0> sub = gphys.cut('lon'=>0,'lat'=>10..60)
=> <GPhys grid=<2D grid <axis pos=<'lat' shape=[6]  subset of a NumRu::VArrayNetCDF>>
        <axis pos=<'level' shape=[9]  subset of a NumRu::VArrayNetCDF>>>
   data=<'T' shape=[6, 9]  subset of a NumRu::VArrayNetCDF>>

sub = gphys.cut('lon'=>0,'lat'=>10..60) ¤Î·ë²Ì¤Îɽ¼¨¤Ë¤ª¤¤¤Æ, 'lat', 'T' ¤Ë¤Ä¤¤¤Æ¤Ï subset of a NumRu::VArrayNetCDF ¤Èɽ¼¨¤µ¤ì¤Æ¤¤¤ë. ¤³¤ì¤Ï, VArray ¤Ë¤ª¤¤¤Æ¥µ¥Ö¥»¥Ã¥ÈºîÀ®¤¹¤ëºÝ, ¿·¥ª¥Ö¥¸¥§¥¯¥È¤ÏÃͤò¥³¥Ô¡¼¤·¤ÆÊÝ»ý¤¹¤ë¤Î¤Ç¤Ê¤¯, ¸µ¤Î¥ª¥Ö¥¸¥§¥¯¥È¤Ø¤Î»²¾È¤È¥µ¥Ö¥»¥Ã¥È¤Î¼ÌÁüÊýË¡¤òÊÝ»ý¤¹¤ë¤è¤¦¤Ë¤Ê¤Ã¤Æ¤¤¤ë¤«¤é¤Ç¤¢¤ë. ¾åµ­¤Î²Ä»ë²½¤ÎÎã¤Ç¤â, ²Ä»ë²½¤¹¤ë¥Ç¡¼¥¿¤ÎÀÚ¤ê½Ð¤·¤Ï [] ¤ä cut ¤Ç¹Ô¤¦¤¿¤á, ¥Õ¥¡¥¤¥ë¤«¤éÆÉ¤ß¹þ¤Þ¤ì¤ë¥Ç¡¼¥¿¤Ïºî²è¤Ë»È¤ï¤ì¤ëʬ¤Î¤ß¤Ç¤¢¤ë. ¤è¤Ã¤Æ, ñ¤Ë¿Þ¼¨¤¹¤ë¤À¤±¤Ê¤é, µðÂç¤Ê¥Ç¡¼¥¿¤ÎÁ´ÂΤòÁê¼ê¤Ë GPhys ¥ª¥Ö¥¸¥§¥¯¥È¤òºîÀ®¤·¤Æ¹½¤ï¤Ê¤¤.


¤Ê¤ª, ¤â¤·¤âÃÍ¤ÎÆÉ¤ß¹þ¤ó¤Ç¥³¥Ô¡¼¤òºîÀ®¤·¤¿¤±¤ì¤Ð copy ¥á¥½¥Ã¥É¤òÍѤ¤¤ì¤Ð¤è¤¤. ¤³¤ì¤Ï¿·¥ª¥Ö¥¸¥§¥¯¥È¤¬µì¥ª¥Ö¥¸¥§¥¯¥È¤Ø¤Î»²¾È¤ò´Þ¤Þ¤Ê¤¤, ¤¤¤ï¤æ¤ë deep clone ¤òºîÀ®¤¹¤ë (¥ª¥Ö¥¸¥§¥¯¥È¥Ä¥ê¡¼¤ò¤Þ¤ë¤´¤ÈÊ£À½¤¹¤ë). ¼¡¤ò»²¾È¤Î¤³¤È.


¾åµ­ irb ¥»¥Ã¥·¥ç¥ó¤Î³¤­:
irb(main):005:0> csub = sub.copy
=> <GPhys grid=<2D grid <axis pos=<'lat' sfloat[6] val=[60.0,50.0,40.0,30.0,...]>>
        <axis pos=<'level' sfloat[9] val=[1000.0,850.0,600.0,400.0,...]>>>
   data=<'T' sfloat[6, 9]
    val=[4.25522947311401,4.68513584136963,9.936279296875,14.2176637649536,...]>>

º£ÅÙ¤ÏÃͤΰìÉô¤¬É½¼¨¤µ¤ì¤Æ¤¤¤ë. ¥Ç¡¼¥¿¤ÏÆÉ¤ß¹þ¤Þ¤ì¤Æ, NArray ¥ª¥Ö¥¸¥§¥¯¥È¤È¤·¤Æ¥á¥â¥ê¡¼¾å¤ËÊÝ»ý¤µ¤ì¤Æ¤¤¤ë.


µðÂç¥Ç¡¼¥¿ÍѼ«Æ°Ê¬³ä¥¤¥Æ¥ì¡¼¥¿¡¼


¤µ¤Æ, ¾å¤Ç¡ÖɬÍפˤʤé¤Ê¤¤¸Â¤ê¥Ç¡¼¥¿¤ÏÆÉ¤ß¹þ¤Þ¤Ê¤¤¡×¥Ý¥ê¥·¡¼¤òÀâÌÀ¤·¤¿¤¬, ¤½¤Î¡ÖɬÍספϤ·¤Ð¤·¤Ð¤ä¤Ã¤Æ¤¯¤ë. Î㤨¤Ð gphys.mean(0) ¤ä gphys3 = gphys1 + gphys2 ¤Î¤è¤¦¤Ë±é»»¤ò¹Ô¤¦¾ì¹ç¤Ï¤½¤¦¤Ç¤¢¤ë. ¤Þ¤¿, ¥Õ¥¡¥¤¥ë·Á¼°¤ÎÊÑ´¹ ¤ÎÀá¤Ç½Ò¤Ù¤¿¤è¤¦¤Ë, ¥Õ¥¡¥¤¥ë¤òÆÉ¤ó¤Ç½ñ½Ð¤¹ºÝ¤Ë¤â, °ìöÆÉ¤ß¹þ¤ß¤¬È¯À¸¤¹¤ë.


¤³¤Î¤è¤¦¤Ê¾ì¹ç, ÆÉ¤ß¹þ¤ß¤ò¾¯¤·¤º¤Ä¹Ô¤¦¤³¤È¤Ç ¥á¥â¥ê¡¼¤ò°µÇ÷¤·¤Ê¤¤¤è¤¦¤Ë¤¹¤ë¤³¤È¤¬¹Í¤¨¤é¤ì¤ë. Î㤨¤Ð¼¡¤Î¤è¤¦¤Ë (¤³¤ì¤ÏÈ󼫯°²½Îã. ¤½¤Î¼¡¤Ë¼«Æ°²½Îã¤ò¼¨¤¹).


iterate_over_dim_1.rb
 1: require "numru/gphys"
 2: include NumRu
 3: 
 4: gphys = GPhys::NetCDF_IO.open('T.jan.nc', 'T')
 5: 
 6: #< all at once >
 7: print "Case 1: all at once\n"
 8: p gphys.mean(0,1).val
 9: 
10: #< iterate over the last dimension >
11: print "\nCase 2: iterated\n"
12: nz = gphys.axis(2).length
13: for i in 0...nz
14:   p gphys[false,i].mean(0,1).val
15: end

% ruby iterate_over_dim_1.rb
Case 1: all at once
NArrayMiss.sfloat(9):
[ 5.058, -0.5645, -14.03, -32.75, -49.6, -57.47, -61.5, -53.99, -42.25 ]

Case 2: iterated
5.05842492176078
-0.564510100069102
-14.0251893160636
-32.7455883360746
-49.5988384046053
-57.4673908077485
-61.4999143366228
-53.9931640625
-42.247435809576

¤·¤«¤·, ¾å¤ÎÎã¤Ç¤Ï°ìÊդˤ¹¤ë¾ì¹ç¤È, ¥¤¥Æ¥ì¡¼¥¿¡¼¤ò»È¤¦¾ì¹ç¤Ç, ÆÀ¤é¤ì¤ë·ë²Ì¤Ï Ruby ¥ª¥Ö¥¸¥§¥¯¥È¤È¤·¤Æ¤ÏƱ¤¸¤Ç¤Ï¤Ê¤¤. Á°¼Ô¤Ï°ì¤Ä¤Î£±¼¡¸µ¥Ç¡¼¥¿¤Ç¤¢¤ë¤Î¤ËÂФ·, ¸å¼Ô¤ÏÊ£¿ô¤Î¥¼¥í¼¡¸µ¤Ç¤¢¤ë¤«¤é.


GPhys¤Ë¤Ï, µðÂç¥Ç¡¼¥¿¤ËÂФ¹¤ë±é»»¤òʬ³ä¤·¤Æ¹Ô¤¦¤³¤È¤ò»Ù±ç¤¹¤ë¥¤¥Æ¥ì¡¼¥¿¡¼¤¬¼ÂÁõ¤µ¤ì¤Æ¤¤¤ë. ¤½¤ì¤Ï¼¡¤Î¤è¤¦¤ËÍѤ¤¤ë.


iterate_over_dim_2.rb
 1: require "numru/gphys"
 2: include NumRu
 3: gphys = GPhys::NetCDF_IO.open('T.jan.nc', 'T')
 4: 
 5: # < all at once >
 6: ofile1 = NetCDF.create('tmp1.nc')
 7: gp10 = gphys*10
 8: GPhys::NetCDF_IO.write(ofile1, gp10)
 9: ofile1.close
10: 
11: #< iterate over the last dimension >
12: ofile2 = NetCDF.create('tmp2.nc')
13: GPhys::NetCDF_IO.each_along_dims_write(gphys, ofile2, -1) do |sub|
14:   sub10 = sub*10
15:   [sub10]
16: end
17: ofile2.close

Á°È¾¤Ç¤Ï, ¥Ç¡¼¥¿¤ÎÃͤò10Çܤ·¤Æ, "tmp1.nc" ¤È¤¤¤¦¥Õ¥¡¥¤¥ë¤Ë½ñ½Ð¤¹¤Î¤ÏÌÀÇò¤Ç¤¢¤í¤¦. ¸åȾ¤Ïʬ¤«¤ê¤Ë¤¯¤¤¤«¤â¤·¤ì¤Ê¤¤¤¬, ¼Â¤ÏÁ´¤¯Æ±¤¸·×»»¤ò¤·¤Æ, "tmp2.nc" ¤È¤¤¤¦¥Õ¥¡¥¤¥ë¤Ë½ñ½Ð¤·¤¹. ¤¿¤À¤·, ¤½¤ÎºÝ, ºÇ¸å¤Î¼¡¸µ¤Ë´Ø¤·¤Æ¥ë¡¼¥×¤ò²ó¤¹. GPhys::NetCDF_IO.each_along_dims_write ¤Ï, 1ÈÖÌܤΰú¿ô¤Ç»ØÄꤷ¤¿ GPhys ¥ª¥Ö¥¸¥§¥¯¥È¤ò, 3ÈÖÌܤΰú¿ô¤Ç»ØÄꤷ¤¿¼¡¸µ¤Ë¤½¤Ã¤ÆÊ¬³ä¤·¤Æ¥Ö¥í¥Ã¥¯¤Î°ú¿ô¤È¤· (¾å¤ÎÎã¤Ç¤ÏÊÑ¿ô sub), ¥Ö¥í¥Ã¥¯¤ÎÊÖ¤êÃÍ (¾å¤Ç¤Ï15¹ÔÌܤΠ[sub10]) ¤ò 2 ÈÖÌܤΰú¿ô¤Ç»ØÄꤷ¤¿¥Õ¥¡¥¤¥ë¤Ë½ñ¤­¹þ¤à. ¥Õ¥¡¥¤¥ë¤Ë½ñ¤­¤¿¤¤¥Ç¡¼¥¿¤Ï°ì¤Ä¤È¤Ï¸Â¤é¤Ê¤¤¤Î¤Ç, ÊÖ¤êÃÍ¤Ï GPhys ¥ª¥Ö¥¸¥§¥¯¥È¤ÎÇÛÎó¤È¤¹¤ë. ¤½¤ÎºÝÊÖ¤êÃͤÏÁ´ÂΤΥµ¥Ö¥»¥Ã¥È¤Ç¤¢¤ë¤Ï¤º¤Ç¤¢¤ë¤«¤é, Àµ¤·¤¯Á´ÂΤòÉü¸µ¤·¤¿¾å¤Ç½ñ¤­¹þ¤ß¤ò¹Ô¤¦. ¤³¤ÎºÇ¸å¤ÎÅÀ¤¬¥Ý¥¤¥ó¥È¤Ç, ¸Î¤ËÁ°È¾¤ÎÎã¤ÈƱÍͤË, ·ë²Ì¤Ïʬ³ä½èÍý¤ò¹Ô¤ï¤Ê¤«¤Ã¤¿¾ì¹ç¤ÈƱ¤¸¤Ë¤Ê¤ë¤Î¤Ç¤¢¤ë.


¾å¤Ç¤Ï sub ¤Ï, ºÇ¸å¤Î¼¡¸µ¤ÎŤµ¤¬£±¤Ë¤Ê¤ë. Â绨ÇĤ˸À¤¨¤Ð, °Ê²¼¤Î¥ë¡¼¥×¤ò¼Â¹Ô¤·¤Æ¤¤¤ë¤è¤¦¤Ê¤â¤Î¤Ç¤¢¤ë.
for i in 0...gphys.shape[-1]
  sub = gphys[false, i..i]   # i..i ¤Ë¤è¤ê, ºÇ¸å¤Î¼¡¸µ¤ò¾Ã¤µ¤ºÄ¹¤µ£±¤Ë¤¹¤ë.
  ...
end

Á´ÂΤÎÉü¸µ¤Î¤¿¤á, ¥Ö¥í¥Ã¥¯¤ÎÌá¤êÃͤˤª¤¤¤Æ¤Ï, ʬ³ä¤µ¤ì¤¿¼¡¸µ¤¬¾Ã¤¨¤Æ¤¤¤Æ¤Ï¤Ê¤é¤Ê¤¤.


¤Ê¤ª, GPhys::NetCDF_IO.each_along_dims_write ¤ÎÂè°ì°ú¿ô¤Ï°ì¤Ä¤Î GPhys ¥ª¥Ö¥¸¥§¥¯¥È¤Ç¤â, Ê£¿ô¤Î GPhys ¥ª¥Ö¥¸¥§¥¯¥È¤òÆþ¤ì¤¿ÇÛÎó¤Ç¤â¤è¤¤. ÆþÎϤΠGPhys ¥ª¥Ö¥¸¥§¥¯¥È¤Î¿ô¤Ë±þ¤¸¤Æ, ¥Ö¥í¥Ã¥¯¤Î°ú¿ô¤Î¿ô¤âÁý¤¨¤ë. ¤Þ¤¿, ¼¡¸µ¤ÏÈÖ¹æ¤Ç¤Ê¤¯Ì¾Á°¤Ç»ØÄꤹ¤ë¤³¤È¤â¤Ç¤­¤ë. ¼¡¤Ï¤½¤ÎÎã:
GPhys::NetCDF_IO.each_along_dims_write([gp1,gp2,gp3], ofile2, 'level') do
    |sub1, sub2, sub3|
    ....

¤³¤³¤Ç¤Ï gp1, gp2, gp3 ¤¬¶¦Ä̤μ´ 'level' ¤Ë±è¤Ã¤ÆÊ¬³ä¤µ¤ì¤ë. ¤â¤Á¤í¤óÁ´¤Æ¤¬ 'level' ¤È¤¤¤¦¼´¤ò»ý¤Ã¤Æ¤¤¤Æ, ¤½¤ÎŤµ¤¬Åù¤·¤¤¤Î¤Ç¤Ê¤±¤ì¤Ð¥¨¥é¡¼¤Ë¤Ê¤ë.


½ÐÎϤ¹¤ë¥Õ¥¡¥¤¥ë¤âÊ£¿ô»ØÄꤷ¤Æ¹Ô¤­Àè¤òʬ¤±¤ë¤³¤È¤â¤Ç¤­¤ë. ¤Þ¤¿Ê¬³ä¤Ë»È¤¦¼¡¸µ¤òÊ£¿ô»ØÄꤹ¤ë¤³¤È¤â½ÐÍè¤ë:
GPhys::NetCDF_IO.each_along_dims_write(gp, [ofile1, ofile2], 'lat', 'level') do
    |sub|
    ....
    [res1, res2]
end

¤³¤³¤Ç¤Ï res1 ¤Ï ofile1, res2 ¤Ï ofile2 ¤Ë½ñ¤«¤ì¤ë. ÊÖ¤êÃͤθĿô¤¬¥Õ¥¡¥¤¥ë¿ô¤è¤êÂ礭¤¤¾ì¹ç¤Ï, Ê£¿ô¤Î¥ª¥Ö¥¸¥§¥¯¥È¤¬¤Þ¤È¤á¤Æ(»ØÄꤷ¤¿ºÇ¸å¤Î)½ÐÎÏ¥Õ¥¡¥¤¥ë¤ËÆþ¤ë.


GPhys::NetCDF_IO.each_along_dims_write ¤Ï·ë²Ì¤ò NetCDF ¥Õ¥¡¥¤¥ë¤Ë½ñ½Ð¤¹. ¾­ÍèŪ¤Ë¤Ï, ¥Õ¥¡¥¤¥ë¤Ë½ñ½Ð¤µ¤Ê¤¤ GPhys::each_along_dims ¤È¤¤¤¦¥á¥½¥Ã¥É¤âºîÀ®¤¹¤ëͽÄê¤Ç¤¢¤ë. ¤³¤ì¤ÏÆþÎϥǡ¼¥¿¤ÏµðÂç¤À¤¬, ½èÍý¤Î·ë²Ì¤Ï¾®¤µ¤¤¤È¤¤¤¦¾ì¹ç¤ËÍ­ÍѤǤ¢¤í¤¦. (·ë²Ì¤âµðÂç¤Ê¤é¥Õ¥¡¥¤¥ë¤Ë½Ð¤µ¤¶¤ë¤òÆÀ¤Ê¤¤¤Î¤Ç, ¤Þ¤º¤½¤Á¤é¤ò¼ÂÁõ¤·¤¿¤Î¤Ç¤¢¤ë.)



ʬ³ä¥Õ¥¡¥¤¥ë¤ò¥Ð¡¼¥Á¥ã¥ë¤Ë¤Ò¤È¤Þ¤È¤á


GPhys ¤Ï¤¢¤ë¥Ç¡¼¥¿¤Î¥µ¥Ö¥»¥Ã¥È¤ò, ¤¢¤¿¤«¤âÁ´ÂΤǤ¢¤ë¤¬¤´¤È¤¯°·¤¨¤ë¤³¤È¤Ï´û¤ËÀâÌÀ¤·¤¿. ¤½¤ì¤È¤ÏµÕ¤Ë, ¼ÂºÝ¤Ë¤Ï°ì¤Ä¤Î¥Ç¡¼¥¿¤¬Ê£¿ô¤Î¥Õ¥¡¥¤¥ë¤Ëʬ³ä¤µ¤ì¤Æ¤¤¤ë¾ì¹ç¤â°·¤¦¤³¤È¤¬½ÐÍè¤ë. ⤷, ¸½ºß¤³¤Îµ¡Ç½¤Ï NetCDF ¤Î¤ß¤Ë´Ø¤·¼ÂÁõ¤µ¤ì¤Æ¤¤¤ë.


Î㤨¤Ð, ÆüÊ¿¶Ñ¤Îµ¤²¹¤Î¥Ç¡¼¥¿¤¬Ç¯¤´¤È¤Ë T.2001.nc, T.2002.nc, T.2003.nc ¤Èʬ¤«¤ì¤Æ¤¤¤ë¤È¤·¤è¤¦. ¤³¤Î£³Ç¯Ê¬¤Î¥Ç¡¼¥¿¤ÎÊ¿¶Ñ¤ò¤È¤ë¤È¤« 2001 ǯ 11 ·î¤«¤é 2002 ǯ 2 ·î¤Þ¤Ç¤ÎÊ¿¶Ñ¤ò¼è¤í¤¦¤È»×¤¦¤È (µ¤¾Ý´Ø·¸¤Î¿Í¤ÏÎɤ¯¤¢¤ê¤Þ¤¹¤Í?), Ä̾ï¤Î¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¥×¥í¥°¥é¥à¤Ç¤Ï, ¤Þ¤º¤³¤ì¤é¤Î¥Õ¥¡¥¤¥ë¤ò¤¯¤Ã¤Ä¤±¤ëɬÍפ¬¤¢¤ë¤À¤¢¤í¤¦. ¤·¤«¤·, GPhys ¤Ç¤Ï, °Ê²¼¤Î¤è¤¦¤Ë¤¹¤ì¤ÐÎɤ¤

gphys = GPhys::IO.open(['T.2001.nc','T.2002.nc','T.2002.nc'], 'T')

¤Þ¤¿¤Ï

gphys = GPhys::IO.open( /T.(\d\d\d\d).nc/, 'T')

Á°¼Ô¤Ï¥Õ¥¡¥¤¥ë¤ò°ì¼¡¸µ¤ÎÇÛÎó¤Ë¼ý¤á¤ë¤³¤È¤Ç, °ì¼¡¸µ¤Îʬ³ä¤Ç¤¢¤ë¤³¤È¤ò GPhys::IO.open ¤Ë¶µ¤¨¤Æ¤¤¤ë. 2¼¡¸µÊ¬³ä¤Ê¤é2¼¡¸µÇÛÎó¤òÍѤ¤¤ë. ¸å¼Ô¤Ï, Àµµ¬É½¸½¤Ç¥Õ¥¡¥¤¥ë¤ò»ØÄꤷ¤Æ¤¤¤ë. ¤³¤³¤Ç¤Ï¥Õ¥¡¥¤¥ë¤Ë¤è¤Ã¤ÆÊѲ½¤¹¤ë¥Ñ¥¿¡¼¥ó¤ò³ç¸Ì¤Ç°Ï¤à¤³¤È¤¬É¬ÍפǤ¢¤ë. ³ç¸Ì¤¬°ì¤Ä¤Ç¤¢¤ì¤Ð°ì¼¡¸µÊ¬³ä¤Ç¤¢¤ë¤³¤È¤ò°ÕÌ£¤¹¤ë.

¤Ç¤Ï, ¤³¤ì¤Þ¤Ç¤ÈƱ¤¸¥Ç¡¼¥¿¤ò»È¤Ã¤Æ, ʬ³ä¥Õ¥¡¥¤¥ë¤ÎÆÉ¤ß¹þ¤ß¤Î¥Ç¥â¤ò¤·¤è¤¦. ¤Þ¤º»Ï¤á¤Ë¥Õ¥¡¥¤¥ë¤òʬ³ä¤·, ²þ¤á¤Æ¤½¤ì¤òÆÉ¤ß¿Þ¤òÉÁ¤¯¤³¤È¤Ë¤¹¤ë.

multiple_files.rb
 1: require "numru/ggraph"
 2: include NumRu
 3: gp = GPhys::IO.open('T.jan.nc', 'T')
 4: 
 5: # < create test files: divide into 4 files (2 by 2) >
 6: 
 7: GPhys::IO.write( f=NetCDF.create('tmp00.nc'), gp[0..17,0..9,{0..6,6}] )
 8: f.close
 9: GPhys::IO.write( f=NetCDF.create('tmp01.nc'), gp[0..17,10..-1,{0..6,6}])
10: f.close
11: GPhys::IO.write( f=NetCDF.create('tmp10.nc'), gp[18..-1,0..9,{0..6,6}])
12: f.close
13: GPhys::IO.write( f=NetCDF.create('tmp11.nc'), gp[18..-1,10..-1,{0..6,6}])
14: f.close
15: 
16: # < open two-dimentionally divided data >
17: 
18: files = /tmp(\d)(\d).nc/
19: p gpcompo = GPhys::IO.open( files, 'T' )
20: 
21: # < test graphics >
22: 
23: DCL.gropn(1)
24: DCL.sgpset('lcntl', false) ; DCL.uzfact(0.7)
25: DCL.sldiv('y',2,1)
26: GGraph.contour( gpcompo )
27: GGraph.contour( gpcompo[false,1] )
28: DCL.grcls
29: 
30: # < clean up >
31: 
32: File.unlink('tmp00.nc')
33: File.unlink('tmp01.nc')
34: File.unlink('tmp10.nc')
35: File.unlink('tmp11.nc')

¾å¤Ç¤Ï·ÐÅÙ¡¦°ÞÅ٤˴ؤ·¤Æ¤½¤ì¤¾¤ì¥Ç¡¼¥¿¤ò£²Ê¬³ä¤·, tmp00.nc, tmp01.nc, tmp10.nc, tmp11.nc ¤È¤¤¤¦£´¤Ä¤Î¥Õ¥¡¥¤¥ë¤Ë¼ý¤á¤Æ¤¤¤ë. ¤½¤ì¤ò, Àµµ¬É½¸½¤ò»È¤Ã¤Æ /tmp(\d)(\d).nc/ ¤È¤¤¤¦·Á¤Ç»ØÄꤷ, GPhys ¥ª¥Ö¥¸¥§¥¯¥È gpcompo ¤ò³«¤¤¤Æ¤¤¤ë. ¤½¤Î·ë²Ì¤ò¿Þ¼¨¤¹¤ë¤È²¼¤Î¤è¤¦¤ËÁ´µå¤Î²¹ÅÙʬÉÛ¤¬É½¼¨¤µ¤ì¤ë. ¤Ê¤ª, Âè3¼¡¸µÌÜ(°µÎÏ)¤Ë´Ø¤·¤Æ¤ÏºÇ²¼ÁØÊ¤Ӥ˲¼¤«¤é 7ÈÖÌܤÎÁؤÀ¤±¤òÀÚ¤ê½Ð¤·¤Æ¤¤¤ë. ²¼¤Î¿Þ¤Î2ËçÌÜ¤Ï 70 mb ¤Î¿Þ¤È¤Ê¤Ã¤Æ¤¤¤ë¤³¤È¤ËÃí°Õ. ¥×¥í¥°¥é¥à¤ÎºÇ¸å¤Ç, ºîÀ®¤·¤¿¥Õ¥¡¥¤¥ë tmp??nc ¤ò¾Ã¤·¤Æ¤¤¤ë.

multiple_files.rb¼Â¹Ô·ë²Ì


GGraph¤ò»È¤¤¤³¤Ê¤¹(¤½¤Î1)


ºÆ¤Ó²Ä»ë²½¤ÎÏÃÂê¤ËÌá¤ë.

ÆÉ¤ß¹þ¤ß¥Õ¥¡¥¤¥ë¤Î³èÍÑ


¾å½Ò¤Î GGraph ÍÑ irb ¥¹¥¿¡¼¥È¥¢¥Ã¥×¥Õ¥¡¥¤¥ë ¤ÎÍøÍÑ¤Ï irb ¤Î¤ß¤Ë¸Â¤ëɬÍפϤʤ¤. ²¼¤Î¤è¤¦¤ËÄ̾ï¥×¥í¥°¥é¥à¤Ë¤ª¤¤¤Æ¤â, GGraph ÍøÍÑ»þ¤Î½èÍý¤ò¤Þ¤È¤á¤¿¤â¤Î¤È¤·¤ÆÍѤ¤¤ë¤³¤È¤¬¤Ç¤­¤ë. ⤷, ¥¹¥¿¡¼¥È¥¢¥Ã¥×¥Õ¥¡¥¤¥ë¤ÎÃæ¿È¤ò½ñ¤­´¹¤¨¤ë¤È¼Â¹ÔÆâÍÆ¤¬ÊѤë¤Î¤Ç, Ť¯¼è¤Ã¤Æ¤ª¤¯¥×¥í¥°¥é¥à¤ËÍøÍѤ¹¤ë¤³¤È¤ÏÁ¦¤á¤Ê¤¤. ¤Þ¤¿, ÂÐÏýèÍý¤È¥×¥í¥°¥é¥à¼Â¹Ô¤Ç¤Ï°Û¤Ê¤ëÀßÄ꤬¹¥¤Þ¤·¤¤¾ì¹ç¤â¤¢¤ë¤À¤í¤¦¤«¤é (Î㤨¤Ð DCL ¤Î¥Ñ¥é¥á¥¿¡¼ 'lwait' ¤Ï, Ä̾ï¤ÏÊѹ¹¤·¤Ê¤¤¤Î¤¬¤è¤«¤í¤¦), ¼ÂºÝ¤Ë¤Ï irb ÍѤΤȤÏÊ̤˥¹¥¿¡¼¥È¥¢¥Ã¥×¥Õ¥¡¥¤¥ë¤òÍѰդ¹¤ë¤Î¤¬Îɤ¤¤À¤í¤¦.

contour1000mb_2.rb
 1: require File.expand_path("~/.irbrc_ggraph.rb")  # irbÍѤΤòήÍÑ
 2: gphys = GPhys::IO.open('T.jan.nc', 'T')
 3: GGraph.contour( gphys )
 4: DCL.grcls


¤³¤³¤Ç File.expand_path ¤Ï ~ ¤ò¥Û¡¼¥à¥Ç¥£¥ì¥¯¥È¥ê¡¼¤È¤·¤ÆÅ¸³«¤¹¤ë¤¿¤á¤ËÍѤ¤¤Æ¤¤¤ë.

ÉÁ²è¥ª¥×¥·¥ç¥ó


¤È¤ê¤¢¤¨¤º, ¾å¤Ç½ñ¤¤¤¿ÀÞ¤ìÀþ¤Ë¤ª¤¤¤Æ, ±¦¾åÏȳ°¤Î¥á¥Ã¥»¡¼¥¸¡Ê"lon=130.0 degrees_east" Åù¡Ë ¤òɽ¼¨¤·¤Ê¤¤¤è ¤¦¤Ë¤·¤Æ¤ß¤è¤¦. ¤½¤¦¤¹¤ì¤Ðɽ¼¨¤¹¤ëʸ»ú¤Ë¥¢¥ó¥À¡¼¥¹¥³¥¢¡¼¤¬´Þ¤Þ¤ì¤Ê¤¯¤Ê¤ë¤Î¤Ç, À©¸æÊ¸»ú²ò¼á¤òÍÞÀ©¤·¤Ê¤¯¤Æ¤âÎɤ¤¡§


line_4.rb
1: require "numru/ggraph"
2: include NumRu
3: gphys = GPhys::IO.open('T.jan.nc', 'T')
4: DCL.gropn(1)
5: DCL.uzfact(0.7)
6: GGraph.set_fig( 'itr'=> 2 )
7: GGraph.line( gphys.cut(135,35,false), true, 'exchange'=>true, 'annot'=>false )
8: DCL.grcls

¤³¤³¤Ç¤Ï¥ª¥×¥·¥ç¥ó 'annotate' ¤ò false ¤Ë¤·¤¿. ¥ª¥×¥·¥ç¥ó̾¤Ï, Á°Êý°ìÃ×¤Ç¸å ¤í¤ò¾Êά¤Ç¤­¤ë(ÌÞÏÀ2¤Ä°Ê¾å¤Î¥ª¥×¥·¥ç¥ó̾¤Ë¥Þ¥Ã¥Á¤¹¤ë¤è¤¦¤Ê¾Êά¤Ï¤Ç¤­¤Ê¤¤).


line_4.rb¼Â¹Ô·ë²Ì

ÉÁ²è¥á¥½¥Ã¥É¤Î¥ª¥×¥·¥ç¥ó¤Î»ÅÁȤß


¤³¤ì¤Þ¤Ç, ÉÁ²è¥á¥½¥Ã¥É¤Î¥ª¥×¥·¥ç¥ó¤¬´ö¤Ä¤«½Ð¤Æ¤­¤¿¤¬, 'exchange'=>true ¤È¤¤¤Ã¤¿½ñ¼°¤Ë¸ÍÏǤ俤«¤â¤·¤ì¤Ê¤¤¤Î¤Ç, ²òÀ⤹¤ë. ¾å¤Î¥×¥í¥°¥é¥à¤Ë¤ª¤±¤ë
GGraph.line( gphys.cut(135,35,false), true, 'exchange'=>true, 'annot'=>false )

¤Ï,
GGraph.line( gphys.cut(135,35,false), true, {'exchange'=>true, 'annot'=>false})

¤Î¾Êά·Á¤Ç¤¢¤ë(Ruby¤Îʸˡ¾å¤½¤¦¤Ê¤Ã¤Æ¤¤¤ë). ¤½¤·¤Æ,
{'exchange'=>true, 'annot'=>false}

¤Ï, Ï¢ÁÛÇÛÎó(Hash)¤ÎÄêµÁ¤ò°ÕÌ£¤¹¤ë. ¤Ä¤Þ¤ê, °ú¿ô¤ÎºÇ¸å¤Ë key => value ¤òÏ¢¤Í¤¿¤â¤Î¤Ï, Ï¢ÁÛÇÛÎó¤ÎÄêµÁ¤È ¸«¤Ê¤µ¤ì¤ë¤Î¤Ç¤¢¤ë. ¾å¤ÎÎã¤Ç¤Ï, ʸ»úÎó 'exchange' ¤ËÂФ· true ¤ò, ʸ»úÎó 'annot' ¤ËÂФ· false ¤ò³ä¤êÅö¤Æ¤ëÏ¢ÁÛÇÛÎ󤬺î¤é¤ì¤ë. ¤È¤¤¤¦¤ï¤±¤Ç, ²¼¤Î¤è¤¦¤Ëʬ²ò¤¹¤ë¤Èʬ¤«¤ê¤ä¤¹¤¤¤Ç¤¢¤í¤¦.
hash = {'exchange'=>true, 'annot'=>false}
GGraph.line( gphys.cut(135,35,false), true, hash )
¤Ä¤Þ¤ê, GGraph.line ¤Î£³ÈÖÌܤΰú¿ô¤ËÏ¢ÁÛÇÛÎó¤òÍ¿¤¨¤Æ¤¤¤ë¤À¤±¤Ç, ¥­¡¼¥ï¡¼¥É°ú¿ô¡Ê½çÈ֤Ǥʤ¯Ì¾Á°¤Ç¼±Ê̤¹¤ë°ú¿ô¡Ë¤ò»È¤Ã¤Æ¤¤¤ë¤Î ¤Ç¤Ï¤Ê¤¤. Ruby ¤Îʸˡ¤Ë¤Ï¥­¡¼¥ï¡¼¥É°ú¿ô¤Ï¸ºß¤·¤Ê¤¤¤¬, Ï¢ÁÛÇÛÎó¤ò»È¤Ã¤Æ
GGraph.line( gphys.cut(135,35,false), true, 'exchange'=>true, 'annot'=>false )
¤Î¤è¤¦¤Ëɽ¸½¤Ç¤­¤ë¤È¤¤¤¦¤³¤È¤Ç, ¼Â¼ÁŪ¤Ë¤Ï¥­¡¼¥ï¡¼¥É°ú¿ô¤¬»È¤¨¤ë¤è¤¦¤Ë ¤Ê¤Ã¤Æ¤¤¤ë¤Î¤Ç¤¢¤ë.


Ï¢ÁÛÇÛÎó Hash ¤Ë¤ª¤¤¤Æ¤Ï, ¡Ö¥­¡¼¡×¤Ï´°Á´°ìÃפǤʤ±¤ì¤Ð¤Ê¤é¤Ê¤¤¤¬, GGraph ¤Ç¤ÏÁ°Êý°ìÃפǺѤà¤è¤¦¹©Éפ·¤Æ¤¤¤ë. ¤½¤ì¤ò»Ù¤¨¤ë¤Î¤Ï, GPhys ËÜÂΤǤϤʤ¯ Misc ¥é¥¤¥Ö¥é¥ê¡¼ ¤Ë´Þ¤Þ¤ì¤Æ¤¤¤ë, KeywordOpt ʤӤˤ½¤Î¥µ¥Ö¥¯¥é¥¹ ¤Ç¤¢¤ë KeywordOptAutoHelp ¤Ç¤¢¤ë. Misc¥é¥¤¥Ö¥é¥ê¡¼¤Ï, Ruby¥×¥í¥°¥é¥ß¥ó ¥°Á´È̤ò»Ù±ç¤¹¤ë, °ìÈÌÀ­¤Î¹â¤¤¥é¥¤¥Ö¥é¥ê¡¼¤ò½¸¤á¤¿¤â¤Î¤Ç¤¢¤ë.

¥ª¥×¥·¥ç¥ó¤Î¥Ç¥Õ¥©¥ë¥ÈÃͤòÃΤë


³Æ¥á¥½¥Ã¥É¤Î¥ª¥×¥·¥ç¥ó¤Î¥Ç¥Õ¥©¥ë¥ÈÃͤÏ, GGraph ¥Þ¥Ë¥å¥¢¥ë¤ËºÜ¤Ã¤Æ¤¤¤ë¤¬, °Ê²¼¤Î¤è¤¦¤Ë¤âÄ´¤Ù¤é¤ì¤ë. ¤³¤³¤Ç¤Ï, Ruby ¤ÎÂÐÏÃ¥·¥§¥ë irb ¤ò»È¤ª¤¦. °Ê²¼¤Ç irb(main):001:0> Åù¤Ï irb ¤Î¥×¥í¥ó¥×¥È¤Ç¤¢¤ë. ¥×¥í¥ó¥×¥È¤Î¤Ê¤¤¹Ô¤Ï, irb ¤Ë¤è¤ë½ÐÎϤǤ¢¤ë.


% irb
irb(main):001:0> require "numru/ggraph"
=> true
irb(main):002:0> include NumRu
=> Object
irb(main):003:0> GGraph.line( nil, true, 'help'=>true )
<< Description of options >>
  option name   default value   # description:
  "title"       nil     # Title of the figure(if nil, internally
                        # determined)
  "annotate"    true    # if false, do not put texts on the right
                        # margin even when newframe==true
  "exchange"    false   # whether to exchange x and y axes
  "index"       1       # line/mark index
  "type"        1       # line type
  "label"       nil     # if a String is given, it is shown as the label
  "max" nil     # maximam data value
  "min" nil     # minimam data value
  "help"        false   # show help message if true
 Current values={"annotate"=>true, "help"=>true, "title"=>nil, "type"=>1, "max"=>nil, "exchange"=>false, "index"=>1, "min"=>nil, "label"=>nil}
NumRu::Misc::HelpMessagingException: ** help messaging done **
        from /usr/local/lib/ruby/site_ruby/1.8/numru/misc/keywordopt.rb:343:in `interpret'
        from /usr/local/lib/ruby/site_ruby/1.8/numru/ggraph.rb:2389:in `line'
        from (irb):3
irb(main):004:0>

¾å¤Ç¤Ï, ¤Þ¤º¤ªÌó«¤Î£²¹Ô¡Êrequire "numru/ggraph" ¤È include NumRu¡Ë¤òÂǤÁ¹þ¤ó¤À¸å, GGraph.line ¤ò ¥ª¥×¥·¥ç¥ó 'help'=>true ¤ò»ØÄꤷ¤Æ¼Â¹Ô¤·¤Æ¤¤¤ë. ¤¹¤ë¤È, ¤½¤Î²¼¤Î¤Ë¼¨¤µ¤ì¤¿¤è¤¦¤Ê¥á¥Ã¥»¡¼¥¸¤¬É½¼¨¤µ¤ì¤ë. ¤³¤Î¤È¤­¼Â¹Ô¤ÏÃæÃǤµ¤ì, ÉÁ²è¤Ï¹Ô¤ï¤ì¤Ê¤¤¤Î¤Ç, ¥Ç¡¼¥¿¤Ï¥À¥ß¡¼¤ÇÎɤ¤. ¾å¤Ç¤Ï, nil ¤òÍ¿¤¨¤Æ¤¤¤ë (GGraph.line¤ÎÂ裱°ú¿ô).


¤½¤ì¤Ç¤Ï°ú¤­Â³¤­, ¾¤ÎÉÁ²è¥á¥½¥Ã¥É¤Î¥ª¥×¥·¥ç¥ó¤òɽ¼¨¤·¤Æ¤ß¤è¤¦.


irb(main):004:0> GGraph.contour( nil, true, 'help'=>true )
<< Description of options >>
  option name   default value   # description:
  "title"       nil     # Title of the figure(if nil, internally
                        # determined)
  "annotate"    true    # if false, do not put texts on the right
                        # margin even when newframe==true
  "transpose"   false   # if true, exchange x and y axes
  "min" nil     # minimum contour value
  "max" nil     # maximum contour value
  "nlev"        nil     # number of levels
  "interval"    nil     # contour interval
  "nozero"      nil     # delete zero contour
  "coloring"    false   # set color contours with ud_coloring
  "clr_min"     13      # (if coloring) minimum color id
  "clr_max"     100     # (if coloring) maximum color id
  "help"        false   # show help message if true
  "levels"      nil     # contour levels (Array/NArray of Numeric)
  "index"       nil     # (if levels) line index(es) (Array/NArray of
                        # integers, Integer, or nil)
  "line_type"   nil     # (if levels) line type(s) (Array/NArray of
                        # integers, Integer, or nil)
  "label"       nil     # (if levels) contour label(s) (Array/NArray of
                        # String, String, true, false, nil). nil is
                        # recommended.
  "label_height"        nil     # (if levels) label height(s) (Array/NArray
                        # of Numeric, Numeric, or nil). nil is recommended.
 Current values={"label_height"=>nil, "annotate"=>true, "help"=>true, "title"=>nil, "coloring"=>false, "transpose"=>false, "max"=>nil, "nlev"=>nil, "line_type"=>nil, "min"=>nil, "clr_max"=>100, "index"=>nil, "levels"=>nil, "interval"=>nil, "nozero"=>nil, "label"=>nil, "clr_min"=>13}
NumRu::Misc::HelpMessagingException: ** help messaging done **
        from /usr/local/lib/ruby/site_ruby/1.6/numru/misc/keywordopt.rb:343:in `interpret'
        from /usr/local/lib/ruby/site_ruby/1.6/numru/ggraph.rb:1350:in `contour'
        from (irb):4
irb(main):005:0> 

¤³¤Î·ë²Ì¤«¤é¤ï¤«¤ë¤è¤¦¤Ë, ¼Â¹ÔÃæÃÇ¤Ï NumRu::Misc::HelpMessagingException ¤È¤¤¤¦Îã³°¤ò¾å¤²¤ë¤³¤È¤Ç¹Ô¤ï¤ì¤ë. irb ¤ò»È¤Ã¤Æ¤¤¤ë¾ì¹ç, Îã³°¤¬¾å¤¬¤ë¤È À©¸æ¤¬¥æ¡¼¥¶¡¼¤ËÌá¤ê¼¡¤Î¥×¥í¥ó¥×¥È¤¬É½¼¨¤µ¤ì¤ë. ¥×¥í¥°¥é¥à¤ò¥Õ¥¡¥¤¥ë¤Ë ¤¹¤ë¾ì¹ç, Ä̾ï¤ÏÎã³°¤¬¾å¤¬¤ë¤È¼Â¹Ô¤¬ÃæÃǤ¹¤ë. ÃæÃǤµ¤»¤¿¤¯¤Ê¤¤¾ì¹ç, ²¼¤Î¤è¤¦¤Ë begin ¡Á rescure ¡Á end Àá¤ÇÊݸ¤ì¤Ð¤è¤¤.


help_ggraph.rb
require "numru/ggraph"
include NumRu
begin
  print "\n** optoions of  GGraph.line **\n"
  GGraph.line( nil, true, 'help'=>true )
rescue
end
begin
  print "\n** optoions of  GGraph.contour **\n"
  GGraph.contour( nil, true, 'help'=>true )
rescue
end

¼Â¹Ô·ë²Ì¤Ï irb ¤Î¾ì¹ç¤ÈƱÍͤʤΤǾÊά¤¹¤ë. help¥ª¥×¥·¥ç¥ó¤òÉÕ¤±¤é¤ì¤ë¤½¤Î¾¤Î¥á¥½¥Ã¥É¤Ï, GGraph.fig, GGraph.axes, GGraph.mark, GGraph.tone ¤Ç¤¢¤ë.



GGraph¤ò»È¤¤¤³¤Ê¤¹(¤½¤Î2)


¾åµ­¤Î help ¥á¥Ã¥»¡¼¥¸É½¼¨¤Çʬ¤«¤ë¤è¤¦¤Ë, GGraph ¤ÎÉÁ²è¥á¥½¥Ã¥É¤Ë¤ÏÍÍ¡¹¤Ê¥ª¥×¥·¥ç¥ó¤¬¤¢¤ë. ¥ª¥×¥·¥ç¥ó¤Ë¤è¤ë»ØÄê¤Ï¤½¤Î»þ¤Ë¸Â¤ê¤À¤¬, ¥Ç¥Õ¥©¥ë¥ÈÃͤòÊѤ¨¤ë¤³¤È¤Ç, ¤½¤Î¸å¤º¤Ã¤ÈÍ­¸ú¤ÊÀßÄê¤â¤Ç¤­¤ë. °Ê²¼¤ËÎã¤ò¼¨¤¹.

¥³¥ó¥¿¡¼¡¿¥È¡¼¥ó (¥ì¥Ù¥ë¼«Æ°À¸À®)


¼¡¤Î¥×¥í¥°¥é¥à¤ò¼Â¹Ô¤·¤è¤¦.

contour101.rb
 1: require "numru/ggraph"
 1: include NumRu
 2: gphys = GPhys::IO.open('T.jan.nc', 'T')
 3: 
 4: #< DCL¤Î¥ª¡¼¥×¥ó¤ÈÀßÄê >
 5: DCL.gropn(1)
 6: DCL.sldiv('y',2,2)           # 2x2¤Ë²èÌÌʬ³ä, 'y'=yoko: º¸¾å¢ª±¦¾å¢ªº¸²¼...
 7: DCL.sgpset('lcntl', false)   # À©¸æÊ¸»ú¤ò²ò¼á¤·¤Ê¤¤
 8: DCL.sgpset('lfull',true)     # Á´²èÌÌɽ¼¨
 9: DCL.uzfact(0.75)             # ºÂɸ¼´¤Îʸ»úÎó¥µ¥¤¥º¤ò 0.75 ÇÜ
10: DCL.sgpset('lfprop',true)    # ¥×¥í¥Ý¡¼¥·¥ç¥Ê¥ë¥Õ¥©¥ó¥È¤ò»È¤¦
11: 
12: #< GGraph ¤Ë¤è¤ë ÉÁ²è >
13: GGraph.set_fig('viewport'=>[0.15,0.75,0.15,0.6])    # set_*: ¤º¤Ã¤ÈÍ­¸ú¤ÊÀßÄê
14: # 1ËçÌÜ
15: GGraph.contour( gphys )
16: GGraph.tone( gphys, false, 'ltone'=>false )        # ¥¼¥í°Ê²¼¤Ë¥·¥§¡¼¥Ç¥£¥ó¥°
17: # 2ËçÌÜ
18: GGraph.next_fig('itr'=>2 )                         # next_*: ¼¡¤À¤±Í­¸ú¤ÊÀßÄê
19: GGraph.contour( gphys.average(0), true, 'color'=>true )        # Æú¿§¥³¥ó¥¿¡¼
20: # 3ËçÌÜ
21: GGraph.set_axes('xunits'=>'','yunits'=>'')  # ¶õʸ»úÎó --> ¼´¤Îñ°Ì¤Ï½ñ¤«¤Ê¤¤
22: GGraph.tone( gphys.cut(true,true,70) )        # tone ¤Î¥Ç¥Õ¥©¥ë¥È¤Ï¥«¥é¡¼É½¼¨
23: GGraph.contour( gphys.cut(true,true,70), false )  # Âè2°ú¿ô false -> ½Å¤Í½ñ¤­
24: # 4ËçÌÜ
25: GGraph.set_linear_contour_options( 'min'=>0, 'nlev'=>20 )  
26:                  # contour¤Î¥Ç¥Õ¥©¥ë¥ÈÊѹ¹. ¼¡²ó¤Î¤ßÍ­¸ú¤Ênext_linear..¤â¤¢¤ë
27: GGraph.contour( gphys.average(0) )
28: 
29: #< ¤ª¤·¤Þ¤¤ >
30: DCL.grcls

¼Â¹Ô¤¹¤ë¤È, ²¼¤Î¤è¤¦¤Ë¥³¥ó¥¿¡¼µÚ¤Ó¿§Åɤê¤Î¿Þ¤¬4Ëçɽ¼¨¤µ¤ì¤ë¤Ï ¤º¤Ç¤¢¤ë. ³Æ¹Ô¤Î²òÀâ¤Ï¥×¥í¥°¥é¥àÃæ¤Ë½ñ¤¤¤Æ¤¢¤ë¤Î¤Ç¤¢¤Þ¤êɬÍפʤ«¤í¤¦. ¤³¤³¤Ç¤Ï°ìÉô¤À¤±²òÀ⤹¤ë. Âè16¹ÔÌÜ¤Ç¤Ï 'ltone'=>false ¤Ë¤è¤ê, Ãͤ¬¥¼¥í°Ê²¼¤ÎÎΰè¤ËÂФ¹¤ë¥·¥§¡¼¥Ç¥£¥ó¥°¤È¤Ê¤ë. ¤³¤ì¤Ï DCL ¤Î¥È¡¼¥ó¥é¥¤¥Ö¥é¥ê¡¼ UEPACK ¤Î¥ª¥×¥·¥ç¥ó¤½¤Î¤Þ¤Þ¤Ç¤¢¤ë. ⤷, UEPACK ¤Ç¤Ï 'ltone' == false ¤¬¥Ç¥Õ¥©¥ë¥È¤Ç¤¢¤ë¤Î¤ËÂФ·, GGraph ¤Ç¤Ï 'ltone' == true ¤ò¥Ç¥Õ¥©¥ë¥È¤Ë¤·¤Æ¤¤¤ë.


¤µ¤é¤Ë, Á´È̤ˤ«¤«¤ï¤ë¤³¤È¤òÊä­¤¹¤ë. GGraph¤Ç¤Ï, °ìÈ̤ËÉÁ²è¥á¥½¥Ã¥É hogehoge ¤ËÂФ·, ¥ª¥×¥·¥ç¥ó¤Î¥Ç¥Õ¥©¥ë¥ÈÃͤòÊѹ¹¤¹¤ë set_hogehoge ¤¬Â¸ºß¤¹¤ë. ¤Þ¤¿, ¥ª¥×¥·¥ç¥ó¤È¤¹¤ë¤Ë¤Ï Ť¹¤®¤¿¤ê, ¤¢¤ë¤¤¤Ï¥ª¥×¥·¥ç¥ó¤ò»È¤¦¤³¤È¼«ÂΤ¬¹¥¤ß¤Ç¤Ê¤¤¿Í¤Î¤¿¤á¤Ë, next_hogehoge ¤È¤¤¤¦¥á¥½¥Ã¥É¤¬ÍѰդ·¤Æ¤¢¤ê, ¼¡²ó¤Î hogehoge ¤Î¤ß¤Ë±Æ¶Á¤òÍ¿¤¨¤ë ¡Ê¤Ä¤Þ¤ê·ë²Ì¤Ï hogehoge ¤Ë¥ª¥×¥·¥ç¥ó¤òÍ¿¤¨¤ë¤Î¤ÈƱ¤¸¡Ë. ¤¿¤À¤·, contour¤Î¾ì¹ç, ¼«Æ°¥ì¥Ù¥ëÀ¸À®¤Ë´Ø¤ï¤ë (set|next)_linear_contour_options ¤È, ¥ì¥Ù¥ë¤òÍۤ˻ØÄꤹ¤ë (set|next)_contour_levels ¤Ëʬ¤«¤ì¤Æ¤¤¤ë. ¿§Åɤ꡿¥·¥§¡¼¥Ç¥£¥ó¥° ¤ò¹Ô¤¦ tone ¤Ë¤Ä¤¤¤Æ¤âƱÍÍ.


contour101.rb¼Â¹Ô·ë²Ì


contour ¤Ç¤Ï, ¥ª¥×¥·¥ç¥ó coloring¤òÀßÄꤹ¤ë¤È, ¥«¥é¡¼¥³¥ó¥¿¡¼¤òÀ¸À®¤¹¤ë. ¤½¤Î¾ì¹ç, ¥ª¥×¥·¥ç¥ó¤Ç¥³¥ó¥¿¡¼¤ÎºÇ¾®ÃͤȺÇÂçÃͤ˳ä¤êÅö¤Æ¤ë¿§¤ò»ØÄê¤Ç¤­¤ë (clr_min ¤È clr_max).


¥³¥ó¥¿¡¼¡¿¥È¡¼¥ó¥ì¥Ù¥ë¤Ï, ¼¡¹à¤ÇÀâÌÀ¤¹¤ëÌÀ¼¨Åª¤Ê¥ì¥Ù¥ë»ØÄê¤ò¹Ô¤ï¤Ê¤±¤ì¤Ð, Åù´Ö³Ö¤ËÀ¸À®¤µ¤ì¤ë. ¤½¤ÎºÝ, ´°Á´¤ªÇ¤¤»¤â½ÐÍè¤ë¤·, (1)ºÇ¾®ÃÍ(min), (2)ºÇÂçÃÍ(max), (3)´Ö³Ö(interval)¤Þ¤¿¤ÏËÜ¿ô (nlev), ¤Î£³¤Ä¤Î¥Ñ¥é¥á¥¿¡¼¤Î ¤¦¤ÁǤ°Õ¸Ä¤ò»ØÄꤷ¤ÆÀ©¸æ¤¹¤ë¤³¤È¤â¤Ç¤­¤ë. ´Ö³Ö¤ÈËÜ¿ô¤ÎξÊý¤ò»ØÄꤹ¤ë¤È, ¸å¼Ô¤Ï̵»ë¤µ¤ì¤ë. ºÇ½ªÅª¤ÊÀ¸À®¤Ï DCL.udgcl[ab], DCL.uegtl[ab] ¤ËǤ¤µ¤ì¤ë¤Î¤Ç, »ØÄꤷ¤¿ºÇÂç¡¿ºÇ¾®ÃͤÏÀÚ¤ê¤Î¤è¤¤ÃͤËÊÑ´¹¤µ¤ì¤ë. ÅöÁ³, icycle ¤Ê¤É¤Î (UD|UE)PACK ¤Î¥Ñ¥é¥á¥¿¡¼¤â²ò¼á¤µ¤ì¤ë. tone ¤Ë¤ª¤¤¤Æ¥·¥§¡¼¥Ç¥£¥ó¥°¤ò¹Ô¤¦¤¿¤á¤Ë, ¥ª¥×¥·¥ç¥ó ltone ¤ò false ¤Ë¤¹¤ë¤È, ñ¤Ë¥ì¥Ù¥ëÀ¸À®¤ò¤ä¤á¤ë¤À¤± ¤Ê¤Î¤Ç, ¼Â¤Ï¤â¤·¤â UEPACK ¤Î¥Ñ¥é¥á¥¿¡¼ ltone ¤¬ true ¤Ë¤Ê¤Ã¤Æ¤¤¤ì¤Ð, ¤ä¤Ï¤ê¥«¥é¡¼¥È¡¼¥ó¤¬É½¼¨¤µ¤ì¤ë¤³¤È¤Ë¤Ê¤ë ¡Ê¤È¤¤¤¦Ãí°Õ¤ò´­µ¯¤¹¤ë¤¿¤á, ¤¢¤¨¤Æ¤³¤Îʬ¤«¤ê¤Ë¤¯¤¤Ì¾Á°¤ò¤½¤Î¤Þ¤ÞºÎÍÑ ¤·¤Æ¤¤¤ë¡Ë. contour ¤Ë¸Â¤ê, Ãͤ¬¥¼¥í¤Î¥³¥ó¥¿¡¼¤ò¼è¤ê½ü¤¯¥ª¥×¥·¥ç¥ó¤¬¤¢¤ë (nozero).


¥«¥é¡¼¥Ð¡¼


GGraph.coloar_bar ¤ÏľÁ°¤Î tone ÉÁ²è¤Ë´Ø¤¹¤ë¥«¥é¡¼¥Ð¡¼¤òɽ¼¨¤¹¤ë (ľÁ°¤Î¤òÍѤ¤¤º, Íۤ˥ì¥Ù¥ë¤È¥Ñ¥¿¡¼¥ó¤ò»ØÄꤹ¤ë¤³¤È¤â¤Ç¤­¤ë¤¬, ¤¢¤Þ¤ê»È¤ï¤Ê¤¤¤À¤í¤¦). ²¼¤Ë¥«¥é¡¼¥Ð¡¼¤ÎÉÁ²èÎã¤ò¼¨¤¹. ¿ºÌ¤Ê»ØÄ꤬½ÐÍè¤ë¤³¤È¤¬Ê¬¤«¤ë¤Ç¤¢¤í¤¦.


color_bar.rb
 1: require "numru/ggraph"
 2: include NumRu
 3: gphys = GPhys::IO.open('T.jan.nc', 'T')
 4: 
 5: #< DCL¤Î¥ª¡¼¥×¥ó¤ÈÀßÄê >
 6: DCL.gropn(1)
 7: DCL.sldiv('y',2,2)           # 2x2¤Ë²èÌÌʬ³ä, 'y'=yoko: º¸¾å¢ª±¦¾å¢ªº¸²¼...
 8: DCL.sgpset('isub', 96)       # ²¼ÉÕ¤ò¼¨¤¹À©¸æÊ¸»úÊѹ¹: '_' --> '`'
 9: DCL.sgpset('lfull',true)     # Á´²èÌÌɽ¼¨
10: DCL.uzfact(0.75)             # ºÂɸ¼´¤Îʸ»úÎó¥µ¥¤¥º¤ò 0.75 ÇÜ
11: DCL.sgpset('lfprop',true)    # ¥×¥í¥Ý¡¼¥·¥ç¥Ê¥ë¥Õ¥©¥ó¥È¤ò»È¤¦
12: 
13: #< GGraph ¤Ë¤è¤ë ÉÁ²è >
14: GGraph.set_fig('viewport'=>[0.15,0.7,0.2,0.6])    # set_*: ¤º¤Ã¤ÈÍ­¸ú¤ÊÀßÄê
15: # 1ËçÌÜ
16: GGraph.tone( gphys.cut(true,true,850) )
17: GGraph.contour( gphys.cut(true,true,850), false )
18: GGraph.color_bar                          # ¥«¥é¡¼¥Ð¡¼ (¥Ç¥Õ¥©¥ë¥È¤Ï½Ä)
19: 
20: # 2ËçÌÜ
21: GGraph.next_fig('viewport'=>[0.2,0.75,0.2,0.6])
22: GGraph.tone( gphys.cut(true,true,850) )
23: GGraph.contour( gphys.cut(true,true,850), false )
24: GGraph.color_bar('left'=>true,'labelintv'=>1)   # º¸Â¦¤Ëɽ¼¨, Á´Éô¥é¥Ù¥ë(¢è1¸Ä¤ª¤­)
25: 
26: # 3ËçÌÜ
27: GGraph.next_fig('itr'=>2 )
28: GGraph.tone( gphys.mean(0), true, 'int'=>4)
29: GGraph.color_bar('vlength'=>0.5,"landscape"=>true,'tickintv'=>0)
30:                     # Ťµ»ØÄê, ²£¤Ëɽ¼¨, tick mark¤Ê¤·(0¤Î¾ì¹ç¤ÎÆÃÎã)
31: 
32: # 4ËçÌÜ
33: GGraph.next_fig('itr'=>2 )
34: rmiss = DCL.glpget('rmiss')
35: GGraph.tone( gphys.mean(0), true, 'levels'=>
36:              [rmiss,-70,-60,-50,-40,-30,-20,-10,0,10,20,rmiss] )
37: GGraph.color_bar("voff"=>0.04)        # ¤Á¤ç¤Ã¤È;ʬ¤Ë²£¤ËÎ¥¤¹
38:                                       # ¡Þ̵¸ÂÂç¤Ï GrADS É÷¤Ë»°³Ñ¤Ë¤Ê¤ë
39: 
40: #< ¤ª¤·¤Þ¤¤ >
41: DCL.grcls

color_bar.rb¼Â¹Ô·ë²Ì


ÃÏ¿ÞÅê±Æ


DCL ¤Ë¤ÏÃÏ¿ÞÅê±Æµ¡Ç½¤¬¤¢¤ë¡¥ GGraph ¤Ç¤Ï¡¤¤½¤ì¤ò»È¤¤¤ä¤¹¤¤·Á¤Ë¥é¥Ã¥×¤·¤ÆÄ󶡤¹¤ë¡¥ Åê±ÆË¡¤Ï¡¤ºÂɸÊÑ´¹ÈÖ¹æ¤Ç»ØÄꤹ¤ë¡¥ GGraph ¤Ç¤ÎÃÏ¿ÞÅê±Æ¼ÂÁ©¤ÎÁ°¤Ë¡¤¤Þ¤º¤Ï¡¤DCL¤Ë¤ª¤±¤ëÃÏ¿ÞÅê±ÆË¡¤Î²òÀâ ¤ò°ìÆÉ¤µ¤ì¤¿¤¤¡¥


DCL¤¬¥µ¥Ý¡¼¥È¤¹¤ëÃÏ¿ÞÅê±ÆË¡¤Ï²¼µ­¤Ç¤¢¤ë¡¥


GGraph ¤Ç¤Ï¤½¤ì¤¾¤ì¤ËÂФ·¡¤¡Ö¤è¤­¤Ë·×¤é¤¦¡×¥Ç¥Õ¥©¥ë¥ÈÀßÄê¤òÍÑ°Õ ¤·¤Æ¤¢¤ë¡¥¤Þ¤º¤Ï´Êñ¤Ê¥×¥í¥°¥é¥à¤Ç¡¤¤¤¤¯¤Ä¤«¤ÎÅê±ÆË¡¤ÇÉÁ²è¤·¤Æ¤ß¤è¤¦¡¥


map_proj1.rb
 1: itr = ARGV[0] ? ARGV[0].to_i : 10
 2: 
 3: require "numru/ggraph"
 4: include NumRu
 5: gphys = GPhys::IO.open('T.jan.nc', 'T')
 6: DCL.gropn(1)
 7: DCL.sgpset('lcntl', false)
 8: DCL.sgpset('lclip', true)
 9: DCL.uzfact(0.7)
10: DCL.sgpset('lfull',true)
11: GGraph.set_fig 'itr'=>itr, 'viewport'=>[0.15,0.85,0.1,0.6]
12: GGraph.set_map 'coast_world'=>true
13: GGraph.tone( gphys )
14: DCL.grcls
¤³¤Î¥×¥í¥°¥é¥à¤Ï¡¤Âè°ì°ú¿ô¤È¤·¤ÆÃÏ¿ÞÅê±ÆÈÖ¹æ¤ò¤È¤ë¡¥ ±ßÅû¿ÞË¡¡¤±ß¿í¿ÞË¡¡¤Êý°Ì¿ÞË¡¤òÂåɽ¤·¤Æ¡¤Àµµ÷±ßÅû¿ÞË¡(10), Àµµ÷±ß¿í¿ÞË¡(20), Àµ¼Í¿ÞË¡(30) ¤ò»î¤·¤Æ¤ß¤ë¡¥
% ruby map_proj1.rb 10
% ruby map_proj1.rb 20
% ruby map_proj1.rb 30

¤½¤ì¤¾¤ì¤Î·ë²Ì¤ò¼¨¤¹¡¥


ruby map_proj1.rb 10 ¼Â¹Ô·ë²Ì


ruby map_proj1.rb 20 ¼Â¹Ô·ë²Ì


ruby map_proj1.rb 30 ¼Â¹Ô·ë²Ì


¤¤¤¯¤Ä¤«¤ÎÆÃÊ̤ÊÅê±ÆË¡¤Ë¤Ä¤¤¤Æ

¥Ý¡¼¥é¡¼¥¹¥Æ¥ì¥ª¿ÞË¡(ÈÖ¹æ31)¤Î¾ì¹ç¡¤¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï²èÌÌÁ´ÂΤ˺î¿Þ¤µ¤ì¤ë ¡ÊÄêµÁÈϰϤ¬Ìµ¸Â±ó¤Þ¤Ç¡Ë¡¥¥Ó¥å¡¼¥Ý¡¼¥È¤ËÉÁ²è¤òǼ¤á¤ë¤¿¤á¤Ë¤Ï¡¤
DCL.sgpset('lclip', true)
¤ò»ØÄꤹ¤ë¡¥


Àµµ÷±ßÅû¿ÞË¡¡ÊÈÖ¹æ10¡Ë¤Ï¡¤¤¤¤ï¤æ¤ë°ÞÅÙ·ÐÅÙºÂɸ¤Ç¤¢¤ë¡¥¤³¤Î¾ì¹ç¡¤ linear-linearľ¸òºÂɸ¡ÊÈÖ¹æ10¡ËÍѤκÂɸ¼´¤ò½ñ¤¯¤³¤È¤¬¤Ç¤­¤ë¡¥ GGraph ¤Î¥á¥½¥Ã¥É contour, tone, line ¤Ë¤ª¤¤¤Æ¡¤¥ª¥×¥·¥ç¥ó 'map_axes' ¤ò true ¤Ë»ØÄꤹ¤ë¡¥


map_axes_itr10.rb
 1: require "numru/ggraph"
 2: include NumRu
 3: gphys = GPhys::IO.open('T.jan.nc', 'T')
 4: DCL.gropn(1)
 5: DCL.sgpset('lcntl', false)
 6: DCL.sgpset('lclip', true)
 7: DCL.uzfact(0.7)
 8: DCL.sgpset('lfull',true)
 9: GGraph.set_fig 'itr'=>10, 'viewport'=>[0.15,0.85,0.1,0.6]
10: GGraph.set_map 'coast_japan'=>true
11: GGraph.tone( gphys.cut('lon'=>120..150,'lat'=>20..50), true, 'map_axes'=>true )
12: DCL.grcls

map_axes_itr10.rb¼Â¹Ô·ë²Ì


ÃÏ¿ÞÅê±Æ´ØÏ¢¥ª¥×¥·¥ç¥ó


ÃÏ¿ÞÅê±Æ´Ø·¸¤Î¥ª¥×¥·¥ç¥ó¤Ï¡¤GGraph::fig ¤È GGraph::map ¤Ë¤¢¤ë¡¥ GGraph::fig¤ÎÃϿ޴ط¸¥ª¥×¥·¥ç¥ó¤Ï²¼µ­¡§

GGraph::map¤Î¼ç¤Ê¥ª¥×¥·¥ç¥ó¤Ï²¼µ­¡§

¾Ü¤·¤¯¤Ï¡¤²¼¤Î¤è¤¦¤Ë¥ª¥×¥·¥ç¥ó help ¤Çɽ¼¨¤µ¤ì¤ë¡¥
>> require "numru/ggraph"
=> true
>> NumRu::GGraph.fig nil, nil, 'help'=>true
<< Description of options >>
  option name   default value   # description:
  "new_frame"   true    # whether to define a new frame by DCL.grfrm
                        # (otherwise, DCL.grfig is called)
  "itr" 1       # coordinate transformation number
  "viewport"    [0.2, 0.8, 0.2, 0.8]    # [vxmin, vxmax, vymin, vymax]
  "window"      nil     # (for itr<10,>50) [uxmin, uxmax, uymin, uymax].
                        # each element allowd nil (only for itr<5,>50)
  "xreverse"    "positive:down,units:hPa"       # (for itr<10,>50) Assign
                        # max value to UXMIN and min value to UXMAX if
                        # condition is satisfied (nil:never, true:always,
                        # String: when an attibute has the value specified
                        # ("key:value,key:value,..")
  "yreverse"    "positive:down,units:hPa"       # (for itr<10,>50) Assign
                        # max value to UYMIN and min value to UYMAX if
                        # condition is satisfied (nil:never, true:always,
                        # String: when an attibute has the value specified
                        # ("key:value,key:value,..")
  "similar"     nil     # 3-element float array for similar
                        # transformation in a rectangular curvilinear
                        # coordinate, which is fed in
                        # DCL:grssim:[simfac,vxoff,vyoff],  where simfac
                        # and [vxoff,vyoff] represent scaling factor and
                        # origin shift, respectively.
  "map_axis"    nil     # (for all map projections) 3-element float
                        # array to be fed in DCL::umscnt: [uxc, uxy, rot],
                        # where [uxc, uyc] represents the tangential point
                        # (or the pole at top side for cylindrical
                        # projections), and rot represents the rotation
                        # angle. If nil, internally determined. (units:
                        # degrees)
  "map_radius"  nil     # (for itr>=20: conical/azimuhal map
                        # projections) raidus around the tangential point.
                        # (units: degrees)
  "map_fit"     nil     # (Only for itr=10(cylindrical) and 11
                        # (Mercator)) true: fit the plot to the data window
                        # (overrides map_window and map_axis); false: do
                        # not fit (then map_window and map_axis are used);
                        # nil: true if itr==10, false if itr==11
  "map_window"  [-180, 180, -75, 75]    # (for itr<20: cylindrical
                        # map projections) lon-lat window [lon_min,
                        # lon_max, lat_min, lat_max ] to draw the map
                        # (units: degres)
  "help"        false   # show help message if true
 Current values={"map_window"=>[-180, 180, -75, 75], "help"=>true, "similar"=>nil, "map_axis"=>nil, "window"=>nil, "new_frame"=>true, "itr"=>1, "map_fit"=>nil, "yreverse"=>"positive:down,units:hPa", "viewport"=>[0.2, 0.8, 0.2, 0.8], "xreverse"=>"positive:down,units:hPa", "map_radius"=>nil}
NumRu::Misc::HelpMessagingException: ** help messaging done **
        from /usr/local/lib/ruby/site_ruby/1.8/numru/misc/keywordopt.rb:386:in `interpret'
        from /usr/local/lib/ruby/site_ruby/1.8/numru/ggraph.rb:2261:in `fig'
        from (irb):5
>> NumRu::GGraph.map 'help'=>true
<< Description of options >>
  option name   default value   # description:
  "lim" true    # draw map lim (t or f)
  "grid"        true    # draw map grid (t or f)
  "vpt_boundary"        false   # draw viewport boundaries (f, t or
                        # 1,2,3.., representing the line width)
  "wwd_boundary"        false   # draw worksation window boundaries (f, t
                        # or 1,2,3.., representing the line width)
  "fill"        false   # fill the map if coast_world or coast_japan is
                        # true (t or f)
  "coast_world" false   # draw world coast lines (t or f)
  "border_world"        false   # draw nation borders (t or f)
  "plate_world" false   # draw plate boundaries (t or f)
  "state_usa"   false   # draw state boundaries of US (t or f)
  "coast_japan" false   # draw japanese coast lines (t or f)
  "pref_japan"  false   # draw japanese prefecture boundaries (t or
                        # f)
  "dgridmj"     nil     # the interval between the major lines of
                        # latitudes and longitudes. If nil, internally
                        # determined. (units: degrees) (this is a UMPACK
                        # parameter, which is nullified when uminit or
                        # grfrm is called)
  "dgridmn"     nil     # the interval between the minor lines of
                        # latitudes and longitudes. If nil, internally
                        # determined. (units: degrees) (this is a UMPACK
                        # parameter, which is nullified when uminit or
                        # grfrm is called)
  "help"        false   # show help message if true
 Current values={"dgridmn"=>nil, "help"=>true, "border_world"=>false, "lim"=>true, "wwd_boundary"=>false, "fill"=>false, "coast_japan"=>false, "dgridmj"=>nil, "vpt_boundary"=>false, "coast_world"=>false, "plate_world"=>false, "grid"=>true, "state_usa"=>false, "pref_japan"=>false}
NumRu::Misc::HelpMessagingException: ** help messaging done **
        from /usr/local/lib/ruby/site_ruby/1.8/numru/misc/keywordopt.rb:386:in `interpret'
        from /usr/local/lib/ruby/site_ruby/1.8/numru/ggraph.rb:2546:in `map'
        from (irb):6

¤µ¤é¤Ê¤ë¥µ¥ó¥×¥ë

¤³¤Î¥µ¥ó¥×¥ë¥×¥í¥°¥é¥à ¤òÁö¤é¤¹¤È¡¤²¼¤Î£µËç¤Î¿Þ¤¬ÆÀ¤é¤ì¤ë¡¥¤Û¤·¤¤µ¡Ç½¤ò»È¤Ã¤Æ¤¤¤½¤¦¤ÊÉôʬ¤¬ ¤¢¤ì¤Ð»²¹Í¤Ë¤µ¤ì¤¿¤¤¡¥

1ËçÌÜ

2ËçÌÜ

3ËçÌÜ

4ËçÌÜ

5ËçÌÜ


°µÎϼ´¤À¤±¤ÏÃͤÎÂ礭¤¤¤Û¤¦¤¬º¸¡¿²¼¤ËÍè¤ë¤Î¤Ï¤Ê¤¼¡©


°µÎϤϳΤ«¤ËÂ礭¤¤¤Û¤É¹âÅÙ¤¬Ä㤤¤Î¤Ç, ¤½¤¦¤Ê¤ë¤È¹¥ÅÔ¹ç¤Ç¤Ï¤¢¤ë¤¬, ²¿¤â»ØÄꤷ¤Ê¤¤¤Î¤Ë¤½¤¦¤Ê¤ë¤Î¤Ï²¿¤«ÉÔÆ©ÌÀ¤ÊÁàºî¤¬¹Ô¤ï¤ì¤Æ¤¤¤ë¤«¤é¤Ç¤¢¤í¤¦¤«¡© ¼Â¤Ï, ¤½¤¦¤¹¤Ù¤­¤È¤¤¤¦¤³¤È¤Ï, ¸µ¤Î NetCDF ¥Õ¥¡¥¤¥ë¤Ë½ñ¤¤¤Æ¤¢¤ë¤Î¤Ç, ¤½¤ì¤ò²ò¼á¤·¤Æ¤¤¤ë¤Þ¤Ç¤Ç¤¢¤ë. T.jan.nc ¤Î ncdump ¤Ë¤è¤ëɽ¼¨¤ò¤ß¤ë¤È, ÊÑ¿ô level ¤Ë¤À¤±, positive °À­¤¬¤¢¤ê, Ãͤ¬ "down" ¤È¤Ê¤Ã¤Æ¤¤¤ë. ¤³¤ì¤Ï, NetCDF ¥æ¡¼¥¶¡¼¥¬¥¤¥É¤Ë¤³¤½¤Ê¤¤¤â¤Î¤Î, ¿¤¯¤Î¥³¥ó¥Ù¥ó¥·¥ç¥ó¤Çɸ½àŪ¤Ê°À­¤È¤Ê¤Ã¤Æ¤¤¤ë (gtool4 NetCDF µ¬Ìó¤ò»²¾È¤Î¤³¤È).


¤Ç¤Ï, positive °À­¤òÉÕ¤±¤Æ¤¤¤Ê¤¤¥Ç¡¼¥¿¤Ï¤É¤¦¤¹¤ì¤Ð¤¤ ¤¤¤Î¤À¤í¤¦¤«. GGraph ¤Ï¤½¤ì¤âÇÛθ¤·¤Æºî¤é¤ì¤Æ¤¤¤ë¤Î¤ÇÂç¾æÉפǤ¢¤ë. ¶ñÂÎŪ¤Ë¤Ï, ¥á¥½¥Ã¥É fig ¤Î¥Ñ¥é¥á¥¿¡¼¤Î¥Ç¥Õ¥©¥ë¥ÈÃͤòÊѤ¨¤ì¤Ð¤è¤¤.


¤Þ¤º¤Ï¼¡¤Î, ¤¿¤Ã¤¿2¹Ô¤Î¥×¥í¥°¥é¥à¤ò¼Â¹Ô¤·¤Æ¤ß¤è¤¦. ¡Ê¤ï¤¶¤ï¤¶¥Õ¥¡¥¤¥ë¤Ë¤·¤Ê¤¯¤Æ¤â irb ¤Ç½½Ê¬¤Ç¤¢¤ë¡Ë


fig_help.rb
require "numru/ggraph"
NumRu::GGraph.fig( nil, true, 'help'=>true )

¤¹¤ë¤È, °Ê²¼¤Î¤è¤¦¤Ë¥ª¥×¥·¥ç¥ó¤Î¥á¥Ë¥å¡¼¤¬É½¼¨¤µ¤ì¤ë.


% ruby fig_help.rb
<< Description of options >>
  option name   default value   # description:
  "new_frame"   true    # whether to define a new frame by DCL.grfrm
                        # (otherwise, DCL.grfig is called)
  "itr" 1       # coordinate transformation number
  "viewport"    [0.2, 0.8, 0.2, 0.8]    # [vxmin, vxmax, vymin, vymax]
  "window"      nil     # (for itr<10,>50) [uxmin, uxmax, uymin, uymax].
                        # each element allowd nil (only for itr<5,>50)
  "xreverse"    "positive:down,units:hPa"       # (for itr<10,>50) Assign
                        # max value to UXMIN and min value to UXMAX if
                        # condition is satisfied (nil:never, true:always,
                        # String: when an attibute has the value specified
                        # ("key:value,key:value,..")
  "yreverse"    "positive:down,units:hPa"       # (for itr<10,>50) Assign
                        # max value to UYMIN and min value to UYMAX if
                        # condition is satisfied (nil:never, true:always,
                        # String: when an attibute has the value specified
                        # ("key:value,key:value,..")
  "similar"     nil     # 3-element float array for similar
                        # transformation in a rectangular curvilinear
                        # coordinate, which is fed in
                        # DCL:grssim:[simfac,vxoff,vyoff],  where simfac
                        # and [vxoff,vyoff] represent scaling factor and
                        # origin shift, respectively.
  "map_axis"    nil     # (for all map projections) 3-element float
                        # array to be fed in DCL::umscnt: [uxc, uxy, rot],
                        # where [uxc, uyc] represents the tangential point
                        # (or the pole at top side for cylindrical
                        # projections), and rot represents the rotation
                        # angle. If nil, internally determined. (units:
                        # degrees)
  "map_radius"  nil     # (for itr>=20: conical/azimuhal map
                        # projections) raidus around the tangential point.
                        # (units: degrees)
  "map_lat_range"       nil     # (for itr<20: cylindrical map projections)
                        # latitudinal range to draw the map. By default
                        # (nil), the map is drawn between 75E and 75S.
                        # (units: degres)
  "help"        false   # show help message if true
 Current values={"help"=>true, "similar"=>nil, "map_axis"=>nil, "window"=>nil, "new_frame"=>true, "itr"=>1, "map_lat_range"=>nil, "yreverse"=>"positive:down,units:hPa", "viewport"=>[0.2, 0.8, 0.2, 0.8], "xreverse"=>"positive:down,units:hPa", "map_radius"=>nil}
/usr/local/lib/ruby/site_ruby/1.8/numru/misc/keywordopt.rb:343:in `interpret': ** help messaging done ** (NumRu::Misc::HelpMessagingException)
        from /usr/local/lib/ruby/site_ruby/1.8/numru/ggraph.rb:2083:in `fig'
        from fig_help.rb:2

¿Þ¤Îº¸±¦¾å²¼¤Îü¤ÎºÂɸÃÍ (uxmin, uxmax, uymin, uymax) ¤Ï¥ª¥×¥·¥ç¥ó window ¤Ç·è¤Þ¤ë¤Î¤Ç, ºÂɸ¼´¤Îº¸±¦¡¿¾å²¼¤òÆþ¤ìÂØ ¤¨¤¿¤±¤ì¤Ð, ¤³¤ì¤òÍÛ¤ËÀßÄꤹ¤ë¤È¤¤¤¦¤Î¤¬°ìË¡¤Ç¤¢¤ë. ¤·¤«¤·, ¤½¤ì¤Ç¤ÏÍÍ¡¹¤Ê¿Þ¤ò½ñ¤­¤¿¤¤¾ì¹ç¤ÏÉÔÊØ¤Ç¤¢¤ë. ¤½¤³¤Ç, window ¤òÀßÄꤻ¤º¤Ë, ¼«Æ°È½ÃǤε¬Â§¤òÊѤ¨¤è¤¦. ¤½¤ì¤ò¹Ô¤¦¤Î¤¬, ¥ª¥×¥·¥ç¥ó xreverse, yreverse ¤Ç¤¢¤ë. ¾å¤Î½ÐÎϤ«¤é, ¥Ç¥Õ¥©¥ë¥ÈÃͤ¬¤È¤â¤Ë "positive:down,units:hPa" ¤È¤Ê¤Ã¤Æ¤¤¤ë¤³¤È¤¬¤ï¤«¤ë. ¤³¤ì¤Ï, °À­ positive ¤¬Â¸ºß¤· ¤Æ¤½¤ÎÃͤ¬ "down" ¤Ç¤¢¤ë¤«, ¤Þ¤¿¤Ï °À­ units ¤¬Â¸ºß¤·¤Æ¤½¤ÎÃͤ¬ "hPa" ¤Ç¤¢¤ë¾ì¹ç¤Ï, º¸±¦¤Þ¤¿¤Ï¾å²¼¤òµÕ¤Ë¤¹¤ë¤È¤¤¤¦°ÕÌ£¤Ç¤¢¤ë. ¤È¤¦¤³¤È¤Ç, ¼Â¤Ï¤ä¤Ã¤Ñ¤ê°µÎϤòÆÃḚ̂·¤¤¤·¤Æ¤¤¤¿¤Î¤Ç¤¢¤ë¤¬, º£²óÍѤ¤¤¿¥Ç¡¼¥¿¤Ç¤Ï level ¤Îñ°Ì¤Ï hPa ¤Ç¤Ê¤¯ milibar¤È¤Ê¤Ã¤Æ¤¤¤ë¤Î¤Ç, ¤½¤ì¤¬¸¶°ø¤Ç¤Ï¤Ê¤¤.


¥Ç¥Õ¥©¥ë¥ÈÃͤòÎ㤨¤Ð "units:mb,units:hPa,units:milibar" ¤ËÊѤ¨¤ì¤Ð, °À­ units ¤¬ "mb", "hPa", "milibar" ¤Î¤¤¤º¤ì¤«¤Î¾ì¹ç¤Ë°ú¤Ã¤¯¤êÊÖ¤¹¤È ¤¤¤¦ÀßÄê¤Ë¤Ê¤ë¡§
GGraph.set_fig( "xrev"=>"units:mb,units:hPa,units:milibar",
                "yrev"=>"units:mb,units:hPa,units:milibar")

°ìÊý, °µÎϤòÆÃÊ̻뤻¤º, ½ã¿è¤Ë postive ¤À¤±¤Ç¾¡É餷¤¿¤±¤ì¤Ð, "positive:down" ¤È¤¹¤ì¤ÐÎɤ¤. ¤Ê¤ª, xreverse, yreverse ¤Ë nil ¤òÀßÄꤹ¤ì¤Ð¾ï¤Ë°ú¤Ã¤¯¤êÊÖ¤·¤ò¹Ô¤ï¤º, true ¤È¤¹¤ì¤Ð¾ï¤Ë°ú¤Ã¤¯¤êÊÖ¤¹. ¤È¤¤¤Ã¤Æ¤âÌÞÏÀ window ¤¬Íۤ˻ØÄꤵ¤ì¤ì¤Ð, ¤½¤ì¤Ë½¾¤¦.


¥È¡¼¥ó¥ì¥Ù¥ë¤Î¥æ¡¼¥¶¡¼»ØÄê


GGraph¤Ç¤Ï, ¥³¥ó¥¿¡¼¤ä¥È¡¼¥ó(¿§Åɤê)¤Î¥ì¥Ù¥ë¤òÇÛÎó¤ÇÍۤ˻ØÄꤹ¤ë¤³¤È¤¬½ÐÍè¤ë.


¥È¡¼¥ó¤Ï¥ì¥Ù¥ë¤È¥Ñ¥¿¡¼¥óÈÖ¹æ¤Ç»ØÄꤵ¤ì¤ë. ¥Ñ¥¿¡¼¥óÈÖ¹æ¤Ï¿§¤È¥È¡¼¥ó¥Ñ¥¿¡¼ ¥ó¤òƱ»þ¤Ë»ØÄꤹ¤ë. ¤½¤Î»ÅÍÍ¤Ï RubyDCL¤Î¥Þ¥Ë¥å¥¢¥ë (GRPH1¤Î¡Ö³µÍס×)¤ò»²¾È¤Î¤³¤È. GGraph ¤Ç¤Ï, ¥È¡¼¥ó¤Ï GGraph.set_tone_levels ¤ÇÀßÄꤹ¤ë¤«(°Ê¸å·Ñ³Ū¤ËÍѤ¤¤ë¾ì¹ç), GGraph.tone ¤Î¥ª¥×¥·¥ç¥ó 'levels' ¤È 'patterns' ¤Ë¤è¤ê»ØÄꤹ¤ë(¤½¤Î¾ì¸Â¤ê). ¡Ê¤Ê¤ª, ¸½ºß¤Î¼ÂÁõ¤Ç¤Ï, ¸å¼Ô¤ò»È¤¦¤È¤½¤ì°ÊÁ°¤Î GGraph.set_tone_levels ¤Ï̵¸ú¤Ë¤Ê¤ë¤¬, ¤½¤¦¤Ê¤é¤Ê¤¤¤è¤¦¤Ë²þÄû¤¹¤ëͽÄê¡Ë

¤½¤ì¤Ç¤Ï, ¤ä¤êÊý¤òÎã¤Ç¼¨¤¹.

tone201.rb
 1: require "numru/ggraph"
 2: include NumRu
 3: gphys = GPhys::NetCDF_IO.open('T.jan.nc', 'T')
 4: 
 5: #< DCL¤Î¥ª¡¼¥×¥ó¤ÈÀßÄê >
 6: DCL.gropn(1)
 7: DCL.sldiv('y',2,2)           # 2x2¤Ë²èÌÌʬ³ä, 'y'=yoko: º¸¾å¢ª±¦¾å¢ªº¸²¼...
 8: DCL.sgpset('lcntl', false)   # À©¸æÊ¸»ú¤ò²ò¼á¤·¤Ê¤¤
 9: DCL.sgpset('lfull',true)     # Á´²èÌÌɽ¼¨
10: DCL.sgpset('lfprop',true)    # ¥×¥í¥Ý¡¼¥·¥ç¥Ê¥ë¥Õ¥©¥ó¥È¤ò»È¤¦
11: 
12: #< GGraph ¤Ë¤è¤ë ÉÁ²è >
13: GGraph.set_fig('viewport'=>[0.15,0.82,0.15,0.6])
14: # 1ËçÌÜ
15: GGraph.set_tone_levels( 'levels'=>[-20,-15,-10,-5,0],
16:                         'patterns'=>[10999,20999,30999,40999] )
17: GGraph.tone( gphys )
18: # 2ËçÌÜ
19: GGraph.tone( gphys, true, 'lev'=>[-20,0,20],     # ¥ì¥Ù¥ë¡õ¥Ñ¥¿¡¼¥ó¤òÍۤ˻ØÄê
20:              'pat'=>[20999,40999,70999,80999] ) # ¥Ñ¥¿¥ó¤ÎÊý¤¬1¤Ä¿¢ª¡Þ¡ç¤Þ¤Ç
21: GGraph.contour( gphys, false, 'lev'=>[-20,0,20], 'index'=>3 )      # »²¹Í¤Þ¤Ç
22: # 3ËçÌÜ
23: GGraph.tone( gphys, true, 'lev'=>[-20,0,20], 
24:                     'pat'=>[40999,70999,80999] ) # ¥ì¥Ù¥ë¤ÈƱ¿ô¢ª¡Ü¡ç¤Þ¤Ç³ÈÄ¥
25: # 4ËçÌÜ
26: GGraph.tone( gphys, true, 'lev'=>[-20,0,20], 
27:                     'pat'=>[40999,70999] )    # ¥Ñ¥¿¥ó¤Î¤Û¤¦¤¬1¤Ä¾¯¢ª´Ö¤òÅɤë
28: #< ¤ª¤·¤Þ¤¤ >
29: DCL.grcls

15¹ÔÌܤè¤ê²òÀ⤹¤ë. 15¡Á16¹ÔÌܤǤÏ, ¥È¡¼¥ó¤Î¥ì¥Ù¥ë¤È¥Ñ¥¿¡¼¥óÈÖ¹æ¤òÀßÄꤷ¤Æ¤¤¤ë. GGraph.set_tone_levels ¤Ç¤Ï, 'levels' ¤È 'patterns' ¤ÎξÊý¤Î¥Ñ¥é¥á¥¿¡¼¤òÇÛÎó¤Ç»ØÄꤹ¤ë. GGraph.tone ¤ä¸å½Ò¤¹¤ë¥³¥ó¥¿¡¼¤Î¾ì¹ç¤È·Á¼°¤È¤¢¤ï¤»¤ë¤¿¤á¥ª¥×¥·¥ç¥ó¤Î·Á¤ò¼è¤Ã¤Æ¤¤¤ë¤¬, ξÊý¤È¤â¾Êά½ÐÍè¤Ê¤¤¡Ê¤Ä¤Þ¤êËÜÅö¤Ï¥ª¥×¥·¥ç¥ó¤Ç¤Ï¤Ê¤¤¡Ë. ¥ì¥Ù¥ë¤òÀßÄꤹ¤ë¤Ê¤é¿§¤âƱ»þ¤Ë»ØÄꤷ¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤. 17¹ÔÌܤÏ, ľÁ°¤ÎÀßÄê¤Ë½¾¤Ã¤Æ1ËçÌܤοޤòÉÁ²è¤¹¤ë. 19¡Á20¹ÔÌܤǤÏ, ¥ì¥Ù¥ë¤È¥Ñ¥¿¡¼¥ó¤ò GGraph.tone ¤Î¥ª¥×¥·¥ç¥ó¤È¤·¤Æ Íۤ˻ØÄꤷ, £²ËçÌܤòÉÁ²è¤·¤Æ¤¤¤ë. »ØÄꤷ¤¿¥Ñ¥¿¡¼¥ó¤Ï¥ì¥Ù¥ë¤è¤êÍ×ÁǤ¬£±¤Ä¿¤¤¤¬, ¤½¤Î¾ì¹ç, ¡Ý¡ç, levels[0], levels[1], .., levels[-1], ¡Ü¡ç ¤Î´Ö¤¬Åɤé¤ì¤ë. ¥ª¥×¥·¥ç¥ó̾¤Î¸å¤í¤¬¾Êά½ÐÍè¤ë¤Î¤Ï´û¤Ë½Ò¤Ù¤¿Ä̤ê. ¤Ê¤ª, ¥È¡¼¥ó¥ì¥Ù¥ë¤¬Ê¬¤«¤ê¤ä¤¹¤¤¤è¤¦¥³¥ó¥¿¡¼¤ò ½Å¤Í½ñ¤­¤·¤¿. ¥³¥ó¥¿¡¼¤Î¥ì¥Ù¥ëÀßÄê¤Ë¤Ä¤¤¤Æ¤Ï¸å½Ò¤¹¤ë. 23¡Á24¹ÔÌܤϣ³ËçÌܤòÉÁ²è¤¹¤ë. ¥ì¥Ù¥ë¤È¥Ñ¥¿¡¼¥ó¤ÎÍ×ÁÇ¿ô¤¬Åù¤·¤¤¤¬, ¤³¤Î¾ì¹ç levels[0], levels[1], .., levels[-1], ¡Ü¡ç ¤Î´Ö¤¬Åɤé¤ì¤ë. 26¡Á27¹ÔÌܤÎ4ËçÌܤǤÏ, ¥Ñ¥¿¡¼¥ó¤Î¤Û¤¦¤¬£±¤ÄÍ×ÁǤ¬¾¯¤Ê¤¤¤Î¤Ç, levels ¤Î´Ö¤¬Åɤé¤ì¤ë. ¥ì¥Ù¥ë¤È¥Ñ¥¿¡¼¥ó¤ÎÍ×ÁÇ¿ô¤Î´Ø·¸¤¬ ¤³¤ì¤é°Ê³°¤Î¾ì¹ç¤ÏÎã³°¤¬È¯À¸¤¹¤ë.

tone201.rb¼Â¹Ô·ë²Ì


¥³¥ó¥¿¡¼¥ì¥Ù¥ë¤Î¥æ¡¼¥¶¡¼»ØÄê


¥³¥ó¥¿¡¼¥ì¥Ù¥ë¤òÇÛÎó¤ÇÍۤ˻ØÄꤹ¤ëÊýË¡¤òÀâÌÀ¤¹¤ë. ¥³¥ó¥¿¡¼¤Î¾ì¹ç¤Ï, £±ËÜ£±ËܤËÀþ¤ÎÂÀ¤µÅù, ÍÍ¡¹¤Ê¥Ñ¥é¥á¥¿¡¼¤¬¤¢¤ê, ¤½¤ì¤é¤â·è¤á¤Í¤Ð¤Ê¤é¤Ê¤¤¤¬, GGraph ¤Ç¤Ï, ÍøÍѼԤÎÊØ¤ò¹Í¤¨¤Æ²Äǽ¤Ê¸Â¤ê¾Êά¤Þ¤¿¤Ï´Êά²½¤Ç¤­¤ë¤è¤¦¤Ë¤Ê¤Ã¤Æ¤¤¤ë. ¥È¡¼¥ó¤Î¾ì¹ç¤ÈƱÍÍ, ¥ì¥Ù¥ë¤ÎÀßÄê¤Ï GGraph.set_contour_levels ¤ÇÀßÄꤹ¤ë¾ì¹ç(°Ê¸å·Ñ³Ū¤ËÍѤ¤¤ë¾ì¹ç)¤È, GGraph.contour ¤Î¥ª¥×¥·¥ç¥ó¤Ç»ØÄꤹ¤ë¾ì¹ç (¤½¤Î¾ì¸Â¤ê) ¤Î£²Ä̤꤬¤¢¤ë. »ØÄꤹ¤ë¥Ñ¥é¥á¥¿¡¼¤Ï, ɬ¤ºÉ¬Í×¤Ê 'levels' ¤Ë²Ã¤¨¤Æ, ¥ª¥×¥·¥ç¥ó¤Ç 'index', 'line_type', 'label', 'label_height' ¤Ç¤¢¤ë. ¡Ê¤³¤ì¤é¤Ï DCL.udsclv ¤Î¥Ñ¥é¥á¥¿¡¼¤Ç¤¢¤ë. GGraph ¤Ï, ¾Êά¤µ¤ì¤¿¤â¤Î¤ò°Ê²¼¤Î¤è¤¦¤Ëµ¬Â§¤Ë§¤Ã¤Æ·èÄꤷ, DCL.udsclv ¤ò¸Æ¤Ö. ¡Ë


¤½¤ì¤Ç¤Ï, °Ê²¼¤Î¥×¥í¥°¥é¥à¤ò¼Â¹Ô¤·¤è¤¦.

contour201.rb
 1: require "numru/ggraph"
 2: include NumRu
 3: gphys = GPhys::NetCDF_IO.open('T.jan.nc', 'T')
 4: 
 5: #< DCL¤Î¥ª¡¼¥×¥ó¤ÈÀßÄê >
 6: DCL.gropn(1)
 7: DCL.sldiv('y',2,2)           # 2x2¤Ë²èÌÌʬ³ä, 'y'=yoko: º¸¾å¢ª±¦¾å¢ªº¸²¼...
 8: DCL.sgpset('lcntl', false)   # À©¸æÊ¸»ú¤ò²ò¼á¤·¤Ê¤¤
 9: DCL.sgpset('lfull',true)     # Á´²èÌÌɽ¼¨
10: DCL.sgpset('lfprop',true)    # ¥×¥í¥Ý¡¼¥·¥ç¥Ê¥ë¥Õ¥©¥ó¥È¤ò»È¤¦
11: 
12: #< GGraph ¤Ë¤è¤ë ÉÁ²è >
13: GGraph.set_fig('viewport'=>[0.15,0.82,0.15,0.6])
14: levels = 5*( NArray.float(7).indgen! )                # NArray: [0,5,10,...]
15: mj = DCL.udpget('indxmj')
16: mn = DCL.udpget('indxmn')
17: # 1ËçÌÜ
18: GGraph.set_contour_levels( 'levels'=>levels, 'index'=>mj )    # ¥³¥ó¥¿¡¼ÀßÄê
19: GGraph.contour( gphys )
20: # 2ËçÌÜ
21: GGraph.contour( gphys, true, 'lev'=>levels, 
22:                 'index'=>[mj,mn], 'line_type'=>[1,2,2,2] )
23: # 3ËçÌÜ
24: GGraph.contour( gphys, true, 'lev'=>levels, 
25:                 'index'=>mn, 'label'=>true )
26: # 4ËçÌÜ
27: GGraph.contour( gphys, true, 'lev'=>levels, 
28:                 'index'=>mn, 'label'=>['A','B','C','D'],
29:                 'label_height'=>[0.015,0.02,0.025,0.03] )
30: #< ¤ª¤·¤Þ¤¤ >
31: DCL.grcls

14¹ÔÌܤǤÏ, Ãæ¿È¤¬ [0,5,10,...] ¤Ç¤¢¤ë NArray ¤Î1¼¡¸µÇÛÎó¤òÀ¸À®¤·¤Æ¤¤¤ë. indgen! ¤ÏÃæ¿È¤ò [0,1,2,..] ¤ÇÃÖ¤­´¹¤¨¤ë¥á¥½¥Ã¥É¤Ç, NArray ¤Ç¤ÏÎɤ¯»È¤ï¤ì¤ë. ¥³¥ó¥¿¡¼¤Ë¥é¥Ù¥ë¤ò½ñ¤¯¤«¤É¤¦¤«¤Ï, ¥Ç¥Õ¥©¥ë¥È¤Ç¤ÏÀþ¤ÎÂÀ¤µ (index) ¤¬, UDPACK ¤Î¥Ñ¥é¥á¥¿¡¼ 'indxmj' ¤ËÅù¤·¤¤¤«¤É¤¦¤«¤ÇȽÃǤ·¤Æ¤¤¤ë (½é´üÃͤÏ3). 18¹ÔÌܤǤϥª¥×¥·¥ç¥ó 'index' ¤Ë¤½¤ì¤ò»ØÄꤷ¤Æ¤ë¤Î¤Ç, 19¹ÔÌܤǽñ¤«¤ì¤ë¥³¥ó¥¿¡¼¤Ë¤Ï, ¥³¥ó¥¿¡¼¥ì¥Ù¥ëÃͤò¼¨¤¹¥é¥Ù¥ë¤¬ÉÕ¤¤¤Æ¤¤¤ë. 'index' Åù¤Î¥ª¥×¥·¥ç¥ó¤Ç¤Ï, ¥¹¥«¥é¡¼¤¬»ØÄꤵ¤ì¤ì¤ÐÁ´¤Æ¤Î¥³¥ó¥¿¡¼ ¤Ë¤½¤ÎÃͤòŬÍѤ¹¤ë¤è¤¦¤Ë¤Ê¤Ã¤Æ¤¤¤ë.

2ËçÌܤοްʹߤÏ, contour ¤Î¥ª¥×¥·¥ç¥ó¤ÇÍۤ˥ì¥Ù¥ëÅù¤ò»ØÄꤷ¤ÆÉÁ²è ¤·¤Æ¤¤¤ë. 2ËçÌܤǤÏ, index ¤Ï [mj, mn] ¤ÈÇÛÎó¤ÇÍ¿¤¨¤é¤ì¤Æ¤¤¤ë. ¤½¤Î¾ì¹ç, [mj, mn, mj, mn,...] ¤È¤¤¤¦·«¤êÊÖ¤·¤È²ò¼á¤µ¤ì¤ë. ¾¤Î¥ª¥×¥·¥ç¥ó¤Ë¤Ä¤¤¤Æ¤âƱÍͤǤ¢¤ë. line_type ¤Ï [1,2,2,2] ¤Ê¤Î¤Ç, [1,2,2,2, 1,2,2,2,..] ¤È²ò¼á¤µ¤ì¤ë. 3ËçÌܤοޤǤÏ, label ¤ò true ¤È»ØÄꤷ¤Æ¤ë¤Î¤Ç, Á´¤Æ¤Î¥³¥ó¥¿¡¼¤Ë¥é¥Ù¥ë ¤ò½ñ¤¯. 4ËçÌܤǤϥé¥Ù¥ë¤Îʸ»úÎó¤òÍۤ˻ØÄꤷ¤Æ¤¤¤ë (label¤Ï true ¤Ê¤é¥³¥ó¥¿¡¼¥ì¥Ù¥ë¤òɽ¤¹Ê¸»úÎó¤òÆâÉô¤ÇÀ¸À®¤·¤Æ½ñ¤¯¤¬, ʸ»úÎó¤¬Í¿¤¨¤é¤ì¤¿¾ì¹ç¤Ï¤½¤ì¤ò»È¤¦). 4ËçÌܤǤÏ, label_height ¤Ë¤è¤ê ʸ»úÎó¤ÎÂ礭¤µ¤ò¸Ä¡¹¤ËÀßÄꤷ¤Æ¤¤¤ë. ¤·¤«¤·, ÉáÄ̤ϰìΧ¤ËÊѤ¨¤¿¤¤¤À¤í¤¦. ¤½¤Î¾ì¹ç label_height ¤ò»È¤ï¤º, UDPACK ¤Î¥Ñ¥é¥á¥¿¡¼ RSIZEL ¤òÊѤ¨¤ë¤³¤È¤ò´«¤á¤ë.

contour201.rb¼Â¹Ô·ë²Ì


¥ì¥¤¥¢¥¦¥È¤Ë¶Å¤ë


Åê¹ÆÏÀʸ¤Ë½Ð¤¹À¶½ñÍѤοޤǤÏ, ¥ì¥¤¥¢¥¦¥È¤Ë¶Å¤ê¤¿¤¤¤À¤í¤¦. GGraph¤Ï, DCL¤Î¶¯ÎϤʥ쥤¥¢¥¦¥Èµ¡Ç½¤ò³è¤«¤·°×¤¤¤è¤¦¤Ë¤Ê¤Ã¤Æ¤¤¤ë.


¼¡¤ÎÎã¤Ç¤Ï, Ê£¿ô¤Î¥Ñ¥Í¥ë¤«¤éɬÍפʤ¤ºÂɸ¼´¥¿¥¤¥È¥ë¡õ¥é¥Ù¥ë¤ò Í¤Æ¤¹¤Ã¤­¤ê¤µ¤», ¤Þ¤¿¥¹¥Ú¡¼¥¹¤òÀáÌ󤹤ë. ¥¹¥Ú¡¼¥¹ÀáÌó¤Ï, DCL.sldiv ¤ò»È¤ï¤º, 1¥Õ¥ì¡¼¥àÃæ¤ËÊ£¿ô¤Î¿Þ¤òÇÛÃÖ¤¹¤ë¤³¤È¤Ç¹Ô¤¦. ¤½¤Î¤¿¤á¤Ë³Æ¿Þ¤Î¥Ó¥å¡¼¥Ý¡¼¥È¤òÍÛ¤ËÀßÄꤷ, ¤µ¤é¤Ë¥¿¥¤¥È¥ë¤Î½ñ¤­Êý¤âºÙ¤«¤¯Ä´À°¤·¤Æ¤¤¤ë¤Î¤Ç, ¥½¡¼¥¹¤ÏŤ¯¤Ê¤Ã¤Æ¤¤¤ë. ³Æ¡¹¤Î¥³¥Þ¥ó¥É¤Ë´Ø¤·¤Æ¤Ï RubyDCL ¤Î¥Þ¥Ë¥å¥¢¥ë¤ò»²¾È¤Î¤³¤È.

layout1.rb
require "numru/ggraph"
include NumRu
gphys = GPhys::NetCDF_IO.open('T.jan.nc', 'T')

DCL.gropn(1)
DCL.sgpset('lcntl', false)   # À©¸æÊ¸»ú¤ò²ò¼á¤·¤Ê¤¤
DCL.sgpset('lfull',true)     # Á´²èÌÌɽ¼¨
DCL.sgpset('lcorner',false)  # ¥³¡¼¥Ê¡¼¥Þ¡¼¥¯¤ò½ñ¤«¤Ê¤¤
DCL.uzfact(0.35)             # ºÂɸ¼´¤Îʸ»úÎó¥µ¥¤¥º¤òÄê¿ôÇÜ
DCL.sgpset('lfprop',true)    # ¥×¥í¥Ý¡¼¥·¥ç¥Ê¥ë¥Õ¥©¥ó¥È¤ò»È¤¦
DCL.udpset('lmsg',false)     # ¥³¥ó¥¿¡¼´Ö³ÖÈóɽ¼¨

vpt = NArray[0.05, 0.45, 0.05, 0.25]             # ¥Ó¥å¡¼¥Ý¡¼¥È¥µ¥¤¥º (2:1)
vpt00 = ( vpt + ([0.050]*2 + [0.32]*2) ).to_a    # x,yÊý¸þ¤Ë¤º¤é¤·¤ÆArray²½
vpt01 = ( vpt + ([0.474]*2 + [0.32]*2) ).to_a    # x,yÊý¸þ¤Ë¤º¤é¤·¤ÆArray²½
vpt10 = ( vpt + ([0.050]*2 + [0.10]*2) ).to_a    # x,yÊý¸þ¤Ë¤º¤é¤·¤ÆArray²½
vpt11 = ( vpt + ([0.474]*2 + [0.10]*2) ).to_a    # x,yÊý¸þ¤Ë¤º¤é¤·¤ÆArray²½

GGraph.set_fig('viewport'=>vpt00)
GGraph.set_axes('xunits'=>'','yunits'=>'','xtitle'=>'') 
DCL.uzpset('labelxb',false)
GGraph.contour( gphys.cut(true,true,1000), true, 'annot'=>false, 'titl'=>'' )
DCL.uzpset('pad1',0.2) ; DCL.uxsttl('t','1000 hPa',-1) ; DCL.uzpset('pad1',0.7)

GGraph.set_fig('viewport'=>vpt01, 'new_frame'=>false)
GGraph.set_axes('ytitle'=>'')
DCL.uzpset('labelyl',false)
GGraph.contour( gphys.cut(true,true,250), true, 'annot'=>false, 'titl'=>'' )
DCL.uzpset('pad1',0.2) ; DCL.uxsttl('t','250 hPa',-1) ; DCL.uzpset('pad1',0.7)

GGraph.set_fig('viewport'=>vpt10, 'new_frame'=>false)
GGraph.set_axes('ytitle'=>nil,'xtitle'=>nil)
DCL.uzpset('labelyl',true); DCL.uzpset('labelxb',true)
GGraph.contour( gphys.cut(true,true,70), true, 'annot'=>false, 'titl'=>'' )
DCL.uzpset('pad1',0.2) ; DCL.uxsttl('t','70 hPa',-1) ; DCL.uzpset('pad1',0.7)

GGraph.set_fig('viewport'=>vpt11, 'new_frame'=>false)
GGraph.set_axes('ytitle'=>'')
DCL.uzpset('labelyl',false)
GGraph.contour( gphys.cut(true,true,10), true, 'annot'=>false, 'titl'=>'' )
DCL.uzpset('pad1',0.2) ; DCL.uxsttl('t','10 hPa',-1) ; DCL.uzpset('pad1',0.7)

DCL::sgtxzv(0.5,vpt00[3]+0.028,'January Monthly Mean Temperature',
	    1.15*DCL.uzpget('rsizec2'),0,0,3)

DCL.grcls

print "\n** PRESSURE LEVELS ** " ; p gphys.coord(2).val

layout1.rb¼Â¹Ô·ë²Ì


ºÂɸ¼´¤Ë¶Å¤ë


GGraph ¤ÏºÂɸ¼´ÉÁ²è¤ò DCL ¤Î USPACK ¤ËǤ¤»¤ë¡ÊDCL.usxaxs, DCL.usyaxs¤ò¸Æ¤Ö¡Ë. ¤Ç¤Ï, ÆüÉÕ¼´¤òÉÕ¤±¤¿¤ê¡ÊUCPACK¤òÍøÍÑ¡Ë, U[XY]PACK ¤ò»È¤Ã¤Æ¤è¤êºÙ¤«¤¯ºÂɸ¼´¤òÀ©¸æ¤¹¤ë¤Ë¤Ï¤É¤¦¤¹¤ì¤Ð¤¤¤¤¤Î¤À¤í¤¦¤«¡© ¤½¤ÎÅú¤¨¤Ï, º£¤Î¤È¤³¤í, GGraph ¤Ë½ñ¤«¤»¤º¼«Ê¬¤Ç½ñ¤¯, ¤Ç¤¢¤ë. GGraph ¤Ç¼´¤ò½ñ¤¯¥á¥½¥Ã¥É axes ¤¬ÉÁ¤¯¼´¤Ï, °Ê²¼¤Î¤è¤¦¤Ë¥ª¥×¥·¥ç¥ó 'xside', 'yside' ¤ÇÀ©¸æ¤Ç¤­¤ë. Î㤨¤Ð X ¼´¤ò²¼¤À¤±ÉÁ¤¯¤Ê¤é, 'xside'=>'b' ¤Ç¤¢¤ë. ¥Ç¥Õ¥©¥ë¥È¤Î½é´üÃÍ¤Ï 'xside'=>'tb', 'yside'=>'lr'.

axes1.rb
require "numru/ggraph"
include NumRu
gphys = GPhys::IO.open('T.jan.nc', 'T')
DCL.gropn(1)
DCL.sgpset('lfull',true) ; DCL.uzfact(0.6)
GGraph.set_fig( 'itr'=> 2, 'viewport'=>[0.25,0.7,0.15,0.6] )
GGraph.set_axes( 'xside'=>'b', 'yside'=>'l' )
GGraph.line( gphys.mean(0,1), true, 'exchange'=>true, 'annot'=>false )
DCL.grcls

axes1.rb¼Â¹Ô·ë²Ì


GGraph ¤ò»È¤Ã¤Æ½ñ¤«¤Ê¤«¤Ã¤¿¤È¤³¤í¤Ë UCPACK Åù¤Ç¸å¤«¤éºÂɸ¼´¤ò½ñ¤±¤ÐÎɤ¤.



±ó³Ö¥Ç¡¼¥¿¤Ë¥¢¥¯¥»¥¹¤¹¤ë¡¿¤µ¤»¤ë


GPhys ¤Ï, ¥í¡¼¥«¥ë¤Ê¥Ç¥£¥¹¥¯¾å¤Î¥Õ¥¡¥¤¥ë¤À¤±¤Ç¤Ê¤¯, ±ó³Ö¥µ¡¼¥Ð¡¼¤Ë ÃÖ¤¤¤¿¥Ç¡¼¥¿¤Ë¥¢¥¯¥»¥¹¤¹¤ë¤¿¤á¤ÎÏÈÁȤߺî¤ê¤ËÌò¤À¤Ä¤è¤¦¤Ë½ÐÍè¤Æ¤¤¤ë. °Ê²¼¤Ç¤Ï, OPeNDAP/DODS ¤È¤¤¤¦ cgi ¤Ë¤è¤ë±ó³Ö¥ª¥Ö¥¸¥§¥¯¥ÈÄó¶¡¡¤ÊÂ¤Ó¤Ë dRuby ¤È¤¤¤¦ Ruby ¤Ë¤ª¤±¤ëʬ»¶¥ª¥Ö¥¸¥§¥¯¥È¥é¥¤¥Ö¥é¥ê¡¼¤òÍøÍѤ¹¤ëÎã¤ò¼¨¤¹.


¡ÖdRuby¤ò»È¤Ã¤¿¥¯¥é¥¤¥¢¥ó¥È¡õ¥µ¡¼¥Ð¡¼¡×¤Î ¼«ºîÊÔ¤½¤Î£±, ¼«ºîÊÔ¤½¤Î £² ¤Ç¤Ï¡¤±ó³ÖÄ󶡤¹¤ë GPhys ¥ª¥Ö¥¸¥§¥¯¥È¤ò¸ÇÄꤷ¤¿´Êñ¤ÊÎã¤òÍѤ¤¤Æ »ÅÁȤߤòÀâÌÀ¤¹¤ë¡¥»ÅÁȤߤϤȤ⤫¤¯»È¤¤¤¿¤¤¾ì¹ç¤Ï¤È¤Ð¤·¤Æ¡¤ GDir¤ò»È¤Ã¤¿¤ª¤Þ¤«¤»ÊÔ ¤Ë¿Ê¤à¤È Îɤ¤¡¥GDir ¤ò»È¤Ã¤Æ¥Ç¥£¥ì¥¯¥È¥ê¡¼¥Ä¥ê¡¼¤Ë±ó³Ö¥¢¥¯¥»¥¹¤¹¤ë¤¿¤á¤Î GPhys ÁȤ߹þ¤ß¥é¥¤¥Ö¥é¥ê¡¼ gphys-remote ¤Ë¤Ä¤¤¤ÆÀâÌÀ¤¹¤ë¡¥


º£¸å¤Ï¡¤CGI ¤ä¥ê¥ì¡¼¥·¥ç¥Ê¥ë¥Ç¡¼¥¿¥Ù¡¼¥¹¤ÎÍøÍÑ¡¤¥¦¥§¥Ö¥µ¡¼¥Ó¥¹ ¤Ë¤Ä¤¤¤Æ¤â½ñ¤¯Í½Äê¤Ç¤¢¤ë¡¥


OPeNDAP/DODS¤òÍѤ¤¤¿±ó³Ö¥Ç¡¼¥¿¥¢¥¯¥»¥¹


OPeNDAP/DODS ¤Ï¡¤CGI ¤Ë¤è¤ë ±ó³Ö¥Ç¡¼¥¿Äó¶¡¥µ¡¼¥Ó¥¹¤Ç¤¢¤ë¡¥°·¤¦¥Ç¡¼¥¿¤Ï NetCDF Åù¤Î¥Õ¥¡¥¤¥ë¤Ë¼ý¤Þ¤Ã ¤¿ÊªÍýÎ̤οôÃͥǡ¼¥¿¤Ç¡¤ÍÍ¡¹¤Ê¥µ¡¼¥Ð¡¼¤ÇÍѤ¤¤é¤ì¤Æ¤¤¤ë¡¥ Åö½é¤Ï³¤ÍγؼԤ¬³«È¯¤ò¤Ï¤¸¤á¤¿¤â¤Î¤Ç¤¢¤ê(DODS=Distributed Ocean Data Sytem)¤Ç¥Ö¥¤Åù¤Î¥¹¥Æ¡¼¥·¥ç¥ó¥Ç¡¼¥¿¤È¡¤³Ê»ÒÅÀ¥Ç¡¼¥¿¤òǰƬ¤Ë¤ª¤¤¤Æ ³«È¯¤µ¤ì¤Æ¤¤¤ë¡¥GPhys ¤ÈƱÍͤʰÕÌ£¤Ç¤Î¥Ç¡¼¥¿¹½Â¤¤ÎÃê¾Ý²½¤ò¹Ô¤¦¤³¤È¤Ç¡¤ Ê£¿ô¤Î¥Õ¥¡¥¤¥ë·Á¼°¤òÆ©²áŪ¤Ë¥µ¥Ý¡¼¥È¤·¤Æ¤¤¤ë¡¥


OPeNDAP/DODS ¤Ï "Grid" ¤È¸Æ¤Ö¥Ç¡¼¥¿¹½Â¤(¥¯¥é¥¹)¤Ë¤è¤ê¡¤ºÂɸÃÍ¤È³Ê »ÒÅÀÃͤ«¤é¤Ê¤ë GPhys ¤ÈƱÍͤʥª¥Ö¥¸¥§¥¯¥È²½¤ò¹Ô¤¦¡¥OPeNDAP/DODS ¥µ¡¼¥Ð¡¼ ¤Ë¾è¤Ã¤¿ NetCDF ¥Õ¥¡¥¤¥ë¤Ç¤¢¤ì¤Ð¡¤¼«Æ°Åª¤ËºÂɸÊÑ¿ô¤Î²ò¼á¤ò¹Ô¤¤ Grid ¥ª¥Ö¥¸¥§¥¯¥È¤ò·ÁÀ®¤¹¤ë¡¥


¤Þ¤¿¡¤OPeNDAP/DODS Âбþ¤Î NetCDF ¥¯¥é¥¤¥¢¥ó¥È¥é¥¤¥Ö¥é¥ê¡¼¤¬ Ä󶡤µ¤ì¤Æ¤ª¤ê¡¤¤³¤ì¤òÍѤ¤¤ë¤È NetCDF ¤Î¥Õ¥¡¥¤¥ë̾¤ÎÂå¤ï¤ê¤Ë OPeNDAP/DODS ¤Î URL ¤òÍ¿¤¨¤ë¤³¤È¤Ç¡¤±ó³Ö¥Ç¡¼¥¿¤ò¥À¥¦¥ó¥í¡¼¥É¤¹¤ë¤³¤È¤Ê ¤¯Ä¾ÀÜÆÉ¤à¤³¤È¤¬¤Ç¤­¤ë¡¥¤½¤ÎºÝ¡¤¥µ¡¼¥Ð¡¼Â¦¤Ë¤¢¤ë¥Õ¥¡¥¤¥ë¤Ï NetCDF ¤Ç¤Ê ¤¯¤Æ¤âÎɤ¤¤¬¡¤NetCDF Ū¤Ê¥Ç¡¼¥¿¹½Â¤¤ò»ý¤Ã¤Æ¤¤¤ëɬÍפ¬¤¢¤ë¡¥¥¹¥Æ¡¼¥·¥ç ¥ó¥Ç¡¼¥¿¤ä HDF ¥Ç¡¼¥¿¤Î¿¤¯¤Ï¤³¤ì¤Ë½¾¤ï¤Ê¤¤¡¥


GPhys ¤Î²¼ÀÁ¤Ç¤¢¤ë Ruby/NetCDF ¤Ï¡¤OPeNDAP/DODS Âбþ¤Î NetCDF ¥¯¥é¥¤¥¢¥ó¥È¤¬¥¤¥ó¥¹¥È¡¼¥ë¤µ¤ì¤Æ¤¤¤ë¾ì¹ç¡¤ ¥³¥ó¥Ñ¥¤¥ë»þ¤Ë¤½¤Á¤é¤ò¥ê¥ó¥¯¤¹¤ë¤è¤¦¤ÊÀßÄê¤Ë¤Ê¤Ã¤Æ¤¤¤ë¡¥Vine ¤ä Debian ÍѤΥХ¤¥Ê¥ê¡¼¥Ñ¥Ã¥±¡¼¥¸¤Ç¤â¡¤¤½¤¦¤Ê¤Ã¤Æ¤¤¤ë¡¥¤³¤Î¾ì¹ç¡¤ ¥Õ¥¡¥¤¥ë̾¤È¤·¤Æ OPeNDAP/DODS URL ¤òÍ¿¤¨¤ë¤À¤±¤Ç¡¤¥í¡¼¥«¥ë¤Ê NetCDF ¥Õ¥¡¥¤¥ë¤ÈƱÍÍ¤ÎÆÉ¤ß½ñ¤­¤¬¤Ç¤­¤ë¡¥


¤½¤ì¤Ç¤Ï¥Ç¡¼¥¿¤Ë¥¢¥¯¥»¥¹¤·¤Æ¤ß¤è¤¦¡¥¤³¤³¤Ç¤Ï ÅÅǾ¶æ³ÚÉô¥Ç¡¼¥¿¥µ¡¼¥Ð¡¼ ¾å¤Îµ¤¾ÝģͽÊó¥Ç¡¼¥¿¤òÍѤ¤¤ë¡¥OPeNDAP/DODS ¤Ç¤Ï¡¤¥Ç¥£¥ì¥¯¥È¥ê¡¼ ¡Ê¥Û¥ë¥À¡¼¡Ë¤ÏÄ̾ï¤Î html ¥µ¡¼¥Ð¡¼¤ÈƱÍͤ˥֥饦¥º¤¹¤ë¤³¤È¤¬¤Ç¤­¤ë¡§ ºÇ¶á£±½µ´Ö¤Ö¤ó¤Î¥Ç¡¼¥¿¡¥ ¥¢¥¸¥¢°è¥â¥Ç¥ë RSM ¤ÎºÇ¿·¤ÎͽÊó¥Ç¡¼¥¿¤Îµ¤°µÌ̥ǡ¼¥¿¤Î ¥Ç¡¼¥¿¥Õ¥¡¥¤¥ë¤Î¾ðÊó ¤Ë¥¢¥¯¥»¥¹¤·¤Æ¤ß¤è¤¦¡¥Ç¼¤á¤é¤ì¤Æ¤¤¤ë NetCDF ¥Õ¥¡¥¤¥ë¤Î¥Ø¥Ã¥À¡¼¾ðÊó¤ò html ²½¤·¤¿¤â¤Î¤¬É½¼¨¤µ¤ì¤ë¤Ï¤º¤À¡¥ ÊÑ¿ô̾¤Ë¤Ï temp ¤Ê¤É¤¬¤¢¤ë¤³¤È¤¬¤ï¤«¤ë¡¥


¤Ç¤Ï¡¤¤³¤ì¤ò²Ä»ë²½¤·¤è¤¦¡¥¡Ö¥¹¥¿¡¼¥È¥¢¥Ã ¥×¥Õ¥¡¥¤¥ë¤ÎÍøÍÑ(2) -- GDir ¤ÎÍøÍѡפǾҲ𤷤¿ irbrc_ggraph ¤òÍѤ¤¡¤ÂÐÏÃŪ¤Ë¼Â¹Ô¤¹¤ë¤³¤È¤Ë¤¹¤ë¡¥


% irb_ggraph --simple-prompt
Start interactive GGraph session
 *** MESSAGE (SWDOPN) ***  GRPH1 : STARTED / IWS =  1.                         
>> GPhys::IO.var_names('http://davis-dods.rish.kyoto-u.ac.jp/cgi-bin/nph-dods/jmadata/gpv/latest/gpv/latest/RSM_P_latest.nc')
=> ["lon", "lat", "p", "time", "ref_time", "z", "u", "v", "temp", "rh", "omega"]
>> temp = GPhys::IO.open('http://davis-dods.rish.kyoto-u.ac.jp/cgi-bin/nph-dods/jmadata/gpv/latest/gpv/latest/RSM_P_latest.nc', 'temp')
=> <GPhys grid=<4D grid <axis pos=<'lon' in 'http://davis-dods.rish.kyoto-u.ac.jp/cgi-bin/nph-dods/jmadata/gpv/latest/gpv/latest/RSM_P_latest.nc'  sfloat[60]>>
        <axis pos=<'lat' in 'http://davis-dods.rish.kyoto-u.ac.jp/cgi-bin/nph-dods/jmadata/gpv/latest/gpv/latest/RSM_P_latest.nc'  sfloat[75]>>
        <axis pos=<'p' in 'http://davis-dods.rish.kyoto-u.ac.jp/cgi-bin/nph-dods/jmadata/gpv/latest/gpv/latest/RSM_P_latest.nc'  sfloat[16]>>
        <axis pos=<'time' in 'http://davis-dods.rish.kyoto-u.ac.jp/cgi-bin/nph-dods/jmadata/gpv/latest/gpv/latest/RSM_P_latest.nc'  sfloat[18]>>>
   data=<'temp' in 'http://davis-dods.rish.kyoto-u.ac.jp/cgi-bin/nph-dods/jmadata/gpv/latest/gpv/latest/RSM_P_latest.nc'  sfloat[60, 75, 16, 18]>>
>> set_fig 'itr'=>10
=> {"itr"=>1}
>> set_map 'coast_japan'=>true
=> {"coast_japan"=>false}
>> tone temp
=> nil
>> contour temp, false
=> nil

°Ê¾å¤Ç¡¤²¼¤Î¤è¤¦¤Ê¿Þ¤¬¤«¤±¤ë¡¥


¼Â¹Ô·ë²Ì

dRuby¤ò»È¤Ã¤¿¥¯¥é¥¤¥¢¥ó¥È¡õ¥µ¡¼¥Ð¡¼¡Ê¼«ºîÊÔ¤½¤Î£±¡Ë


Ãí°Õ¡§¼ê¤Ã¼è¤êÁ᤯»È¤¦¤Ë¤Ï¡¤¤³¤³¤ÏÈô¤Ð¤·¤Æ GDir¤ò»È¤Ã¤¿¤ª¤Þ¤«¤»ÊÔ ¤Ë¿Ê¤à¤ÈÎɤ¤¡¥


dRuby ¤Ï, Ruby¤Î¥á¥½¥Ã¥É¸Æ½Ð¤·¤ò³ÈÄ¥¤·, ¥Í¥Ã¥È¥ï¡¼¥¯±Û¤·¤Ë¥á¥½¥Ã¥É¸Æ½Ð¤· ¤ò¹Ô¤¨¤ë¤è¤¦¤Ë¤·¤¿¥é¥¤¥Ö¥é¥ê¡¼¤Ç¤¢¤ë. Ruby 1.8 ¤Ë¤Ï, ɸ½àźÉÕ¤µ¤ì ¤Æ¤¤¤ë. Ruby 1.6 ¤Þ¤Ç¤Ç¤â¥À¥¦¥ó¥í¡¼¥É¤·¤Æ¥¤¥ó¥¹¥È¡¼¥ë¤¹¤ì¤ÐÎɤ¤. dRuby ¤ò»È¤¦¤È¥ê¥â¡¼¥È¥×¥í¥»¥¹¾å¤Î¥ª¥Ö¥¸¥§¥¯¥È¤Ø¤Î¥¢¥¯¥»¥¹¤¬, ¥í¡¼¥«¥ë¤Ê¥ª¥Ö¥¸¥§¥¯¥È¤Ø¤Î¥¢¥¯¥»¥¹¤ÈƱ¤¸¤è¤¦¤Ë¤Ç¤­¤ë. ÄÌ¿®Áê¼ê¤¬Æ°¤¤¤Æ¤¤¤ë¥Þ¥·¥ó¤Î OS Åù¤¬°Û¤Ê¤Ã¤Æ¤âÌäÂê¤Ê¤¤. ...¤Ê¤É¤È¸À¤ï¤ì¤Æ¤â, ¤É¤¦Ìò¤ËΩ¤Ä¤Î¤«¥Ô¥ó¤ÈÍè¤Ê¤¤¤«¤â¤·¤ì¤Ê¤¤¤Î¤Ç, Îã¤Ç¼¨¤¹.


°Ê²¼¤Ï¤´¤¯´Êñ¤Ê¥µ¡¼¥Ð¡¼¥×¥í¥°¥é¥à¤Ç¤¢¤ë. ¤³¤ì¤Þ¤Ç»È¤Ã¤Æ¤­¤¿ T.jan.nc Ãæ¤Îµ¤²¹¥Ç¡¼¥¿¤ò¥ê¥â¡¼¥È¥×¥í¥»¥¹¤ËÄ󶡤¹¤ë. ¤â¤·¤â¼ÂÍÑŪ¤Ê¥µ¡¼¥Ð¡¼¤òºî¤ë¤Ê¤é, Ê£¿ô¤Î¥Ç¡¼¥¿¤òÄ󶡤·, ¤Þ¤º¤É¤ì¤ò»È¤¦¤«¤òÁª¤Ð¤»¤ë¤Ç¤¢¤í¤¦¤¬, ¤³¤³¤Ç¤Ï dRuby ¤Î²ÄǽÀ­¤ò¼¨¤¹¤³¤È¤ò¼ç´ã¤Ë, ¥Ç¡¼¥¿·è¤áÂǤÁ¤Î´Êñ¤ÊÎã¤È¤¹¤ë.

druby_serv1.rb
1: require "drb/drb"
2: require "numru/gphys"
3: include NumRu
4: gp = GPhys::IO.open("T.jan.nc","T")
5: DRb.start_service(nil, gp)
6: puts 'URI: '+DRb.uri
7: puts '[return] to exit'
8: gets

1¹ÔÌÜ¤Ï dRuby ¤Î¥í¡¼¥É¤Ç¤¢¤ë. 2¡Á4¹ÔÌܤϤªÆëÀ÷. ¤³¤³¤Ç¤Ï, ¥Õ¥¡¥¤¥ë T.jan.nc Ãæ¤ÎÊÑ¿