gphys 1.5.2 → 1.5.3

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 1921300d74726704bca4bba00ebaa9b46081ae24
4
- data.tar.gz: 4c9344000f180c1405877496eb6492304d74b73d
3
+ metadata.gz: 13c32ab65077429fc0f5c4799d6986e2cb672dfa
4
+ data.tar.gz: b6cd30441caba1b246ae90b6ae9b8f090364cbce
5
5
  SHA512:
6
- metadata.gz: 386eca1431a75db9af349d1739b661b2a59b24df4f8b4f38df8ac9cbb87f27f2960dc944bce3bdb3c88a16d9ba7750cefa5913e363cb576d5ae9f4699e49b1d4
7
- data.tar.gz: 4d0a3d04f2312aefd778e68241ee5a0ad323a0488bdfbfd136f0651755c2233a1693ddc2e141e8949bb5e5bd4a679f7ed8197273015207dfc105352bd0174b82
6
+ metadata.gz: cc75b8a323b972ace9a8b0beb53fbedf8165409d9613f655bfaf08090c751fa8c4b594f09d51c53b8592a4c9b3be85e32447792cb78bf3ab7f94772aea3d78b2
7
+ data.tar.gz: c25b9805785e96f88ecf47e37855169cc4efecc29520d3df74da9385d57c811bd5de44c8f684fdcdc9cf5657972e69338c6699e906a90099f040d517ba5b9725
data/ChangeLog CHANGED
@@ -1,3 +1,113 @@
1
+ 2018-01-26 Takeshi Horinouchi
2
+ updated the years
3
+
4
+ M LICENSE.txt
5
+
6
+ 2018-01-26 Takeshi Horinouchi
7
+ To release ver.1.5.3
8
+
9
+ M lib/numru/gphys/version.rb
10
+
11
+ 2018-01-26 Takeshi Horinouchi
12
+ regression_line : added options annot_cor and annot_r2
13
+
14
+ M lib/numru/ggraph.rb
15
+
16
+ 2018-01-26 Takeshi Horinouchi
17
+ Changed to use first2Dreally & first1Dreally where appropriate
18
+
19
+ M lib/numru/ggraph.rb
20
+
21
+ 2018-01-26 Takeshi Horinouchi
22
+ Added new mehotds: firstNDreally, first1Dreally, first2Dreally etc
23
+
24
+ M lib/numru/gphys/gphys.rb
25
+
26
+ 2018-01-26 Takeshi Horinouchi
27
+ Made the following methods class methods of GPhys (in addition to being private methods as before): c_running_mean, c_running_mean_2D, c_bin_mean, c_bin_sum
28
+
29
+ M ext/numru/gphys/dim_op.c
30
+
31
+ 2017-12-25 Takeshi Horinouchi
32
+ bug fix
33
+
34
+ M lib/numru/gphys/gphys_dim_op.rb
35
+
36
+ 2017-12-23 Takeshi Horinouchi
37
+ write_grid: To handle (avoid) multiple output of associated coordinates
38
+
39
+ M lib/numru/gphys/gphys_netcdf_io.rb
40
+
41
+ 2017-12-23 Takeshi Horinouchi
42
+ modified: lib/numru/gphys/gphys_netcdf_io.rb
43
+ runnin_mean : Changed the default boundary condition to nil (automatic selection among BC_SIMPLE & BC_CYCLIC)
44
+
45
+ M lib/numru/gphys/gphys_dim_op.rb
46
+
47
+ 2017-12-14 Takeshi Horinouchi
48
+ Merge branch 'master' of dennou-k.gfd-dennou.org:/GFD_Dennou_Club/ftp/arch/ruby/products/gphys/git_repos/gphys
49
+
50
+ 2017-12-14 Takeshi Horinouchi
51
+ added a new method GPhys#running_mean_2D, which is good for data with missing.
52
+
53
+ M ext/numru/gphys/dim_op.c
54
+ M lib/numru/gphys/gphys_dim_op.rb
55
+
56
+ 2017-12-14 Takeshi Horinouchi
57
+ bug fix
58
+
59
+ M lib/numru/gphys/axis.rb
60
+
61
+ 2017-12-14 Takeshi Horinouchi
62
+ updated gemspec file
63
+
64
+ M gphys.gemspec
65
+
66
+ 2017-07-15 Satoki Tsujino
67
+ bug fix (bi and bj in lib/numru/gphys/grads_gridded.rb).
68
+
69
+ M lib/numru/gphys/grads_gridded.rb
70
+
71
+ 2017-07-14 Takeshi Horinouchi
72
+ bug fix (thanks to dvdvlop emails from Tsujino&Otobe san on 2017-0714)
73
+
74
+ M lib/numru/gphys/grads_gridded.rb
75
+
76
+ 2017-07-07 Takeshi Horinouchi
77
+ Merge remote-tracking branch 'origin/master'
78
+
79
+ 2017-07-07 Takeshi Horinouchi
80
+ bug fix
81
+
82
+ M lib/numru/dclext.rb
83
+
84
+ 2017-06-07 takepiro
85
+ * bin/gpview: int option bug fixed.
86
+ * bin/gpprint: options added.
87
+
88
+ M bin/gpprint
89
+ M bin/gpview
90
+
91
+ 2017-05-20 Takeshi Horinouchi
92
+ further update
93
+
94
+ M lib/numru/dclext.rb
95
+
96
+ 2017-05-16 Takeshi Horinouchi
97
+ Added a new method Axis#nearest_index
98
+
99
+ M lib/numru/gphys/axis.rb
100
+
101
+ 2017-05-16 Takeshi Horinouchi
102
+ complement to the previous commit
103
+
104
+ M lib/numru/dclext.rb
105
+
106
+ 2017-05-07 Takeshi Horinouchi
107
+ DCLExt::ue_linear_levels : added handling of NaN
108
+
109
+ M lib/numru/dclext.rb
110
+
1
111
  2017-04-17 Takeshi Horinouchi
2
112
  1.5.1 --> 1.5.2
3
113
 
@@ -137,8 +247,7 @@ M ext/numru/gphys/ext_init.c
137
247
  2016-06-08 Takeshi Horinouchi
138
248
  file renamed (git mv)
139
249
 
140
- D ext/numru/gphys/mesh_resample.c
141
- A ext/numru/gphys/quad_mesh_sample.c
250
+ R100 ext/numru/gphys/mesh_resample.c ext/numru/gphys/quad_mesh_sample.c
142
251
 
143
252
  2016-06-08 Takeshi Horinouchi
144
253
  created an efficient quadrilateral mesh resampler
@@ -403,18 +512,12 @@ move extension files to ext/numru/gphys/
403
512
 
404
513
  extension files should be located in "ext/" directory.
405
514
 
406
- D dim_op.c
407
- A ext/numru/gphys/dim_op.c
408
- A ext/numru/gphys/ext_coord.c
409
- A ext/numru/gphys/ext_init.c
410
- A ext/numru/gphys/extconf.rb
411
- A ext/numru/gphys/interpo.c
412
- A ext/numru/gphys/multibitIO.c
413
- D ext_coord.c
414
- D ext_init.c
415
- D extconf.rb
416
- D interpo.c
417
- D multibitIO.c
515
+ R100 dim_op.c ext/numru/gphys/dim_op.c
516
+ R100 ext_coord.c ext/numru/gphys/ext_coord.c
517
+ R100 ext_init.c ext/numru/gphys/ext_init.c
518
+ R100 extconf.rb ext/numru/gphys/extconf.rb
519
+ R100 interpo.c ext/numru/gphys/interpo.c
520
+ R100 multibitIO.c ext/numru/gphys/multibitIO.c
418
521
 
419
522
  2015-03-10 Shin-ichi Takehiro
420
523
  bin/gpview: History removes from the output of --help
@@ -920,14 +1023,10 @@ M lib/numru/gphys/grid.rb
920
1023
  2014-05-06 Takeshi Horinouchi
921
1024
  Moved old tests (which do not use unit test) from test/ to test_old/
922
1025
 
923
- D test/eof_slp.rb
924
- D test/mltbit.dat
925
- D test/test_ep_flux.rb
926
- D test/test_multibitIO.rb
927
- A test_old/eof_slp.rb
928
- A test_old/mltbit.dat
929
- A test_old/test_ep_flux.rb
930
- A test_old/test_multibitIO.rb
1026
+ R100 test/eof_slp.rb test_old/eof_slp.rb
1027
+ R100 test/mltbit.dat test_old/mltbit.dat
1028
+ R100 test/test_ep_flux.rb test_old/test_ep_flux.rb
1029
+ R100 test/test_multibitIO.rb test_old/test_multibitIO.rb
931
1030
 
932
1031
  2014-05-06 Takeshi Horinouchi
933
1032
  Unit test for Axis class
@@ -1042,16 +1141,11 @@ Revert "the extention library is moved into ext/"
1042
1141
 
1043
1142
  This reverts commit 9c59f9b4131150bfbc3d7a3087af8c8f1df90c47.
1044
1143
 
1045
- D ext/ext_coord.c
1046
- D ext/ext_init.c
1047
- D ext/extconf.rb
1048
- D ext/interpo.c
1049
- D ext/multibitIO.c
1050
- A ext_coord.c
1051
- A ext_init.c
1052
- A extconf.rb
1053
- A interpo.c
1054
- A multibitIO.c
1144
+ R100 ext/ext_coord.c ext_coord.c
1145
+ R100 ext/ext_init.c ext_init.c
1146
+ R100 ext/extconf.rb extconf.rb
1147
+ R100 ext/interpo.c interpo.c
1148
+ R100 ext/multibitIO.c multibitIO.c
1055
1149
 
1056
1150
  2013-04-15 Takeshi Horinouchi
1057
1151
  Revert "Updated extconf.rb; added $vendorarchdir to the search path etc."
@@ -1076,16 +1170,11 @@ M .gitignore
1076
1170
  2013-03-28 Takeshi Horinouchi
1077
1171
  the extention library is moved into ext/
1078
1172
 
1079
- A ext/ext_coord.c
1080
- A ext/ext_init.c
1081
- A ext/extconf.rb
1082
- A ext/interpo.c
1083
- A ext/multibitIO.c
1084
- D ext_coord.c
1085
- D ext_init.c
1086
- D extconf.rb
1087
- D interpo.c
1088
- D multibitIO.c
1173
+ R100 ext_coord.c ext/ext_coord.c
1174
+ R100 ext_init.c ext/ext_init.c
1175
+ R100 extconf.rb ext/extconf.rb
1176
+ R100 interpo.c ext/interpo.c
1177
+ R100 multibitIO.c ext/multibitIO.c
1089
1178
 
1090
1179
  2013-03-27 Takeshi Horinouchi
1091
1180
  (test) deleted the dummy file
@@ -1100,8 +1189,7 @@ A tmp.txt
1100
1189
  2013-03-27 Takeshi Horinouchi
1101
1190
  Renamed the current ChangeLog to back up.
1102
1191
 
1103
- A .ChangeLog.until201303
1104
- D ChangeLog
1192
+ R100 ChangeLog .ChangeLog.until201303
1105
1193
 
1106
1194
  2013-03-27 Takeshi Horinouchi
1107
1195
  Registered files (patterns) to ignore in the repository
@@ -4001,8 +4089,7 @@ M lib/numru/vizshot.rb
4001
4089
  2006-08-31 horinout
4002
4090
  * lib/numru/vizshot.rb <-- lib/numru/easyviz.rb : renamed
4003
4091
 
4004
- D lib/numru/easyviz.rb
4005
- A lib/numru/vizshot.rb
4092
+ R096 lib/numru/easyviz.rb lib/numru/vizshot.rb
4006
4093
 
4007
4094
  2006-08-31 horinout
4008
4095
  * support dump_code_and_data
@@ -6179,8 +6266,7 @@ Mon Jan 10 2005 T Horinouchi (partly < D Tsukahara)
6179
6266
  M ChangeLog
6180
6267
  A bin/gpprint
6181
6268
  A bin/gpview
6182
- D bin/grads2nc.rb
6183
- A bin/grads2nc_with_gphys
6269
+ R084 bin/grads2nc.rb bin/grads2nc_with_gphys
6184
6270
  D bin/install.rb
6185
6271
  M install.rb
6186
6272
 
@@ -1,7 +1,7 @@
1
1
  GPhys is copyrighted free software by Takeshi Horinouchi and
2
2
  GFD Dennou Club (http://www.gfd-dennou.org/).
3
3
 
4
- Copyright 2003-2017 (C) Takeshi Horinouchi and GFD Dennou Club
4
+ Copyright 2003-2018 (C) Takeshi Horinouchi and GFD Dennou Club
5
5
  (http://www.gfd-dennou.org/) All rights reserved.
6
6
 
7
7
  Redistribution and use in source and binary forms, with or without
@@ -14,18 +14,29 @@ texts with line feeding to avoid long lines and are made to stdout.
14
14
 
15
15
  = USAGE
16
16
 
17
- % gpprint url
17
+ % gpprint [options] url
18
18
 
19
19
  where the format of the url is
20
20
 
21
21
  path[@|/]varname[,dimname=pos1[:pos2[:thinning_intv]][,dimname=...]]
22
22
 
23
+ = OPTIONS
24
+
25
+ :-h, --help
26
+ print this message.
27
+ :-l, --long
28
+ print with "%f".
29
+ :-e, --exp
30
+ print with "%e".
31
+ :-f format, --fmt format
32
+ set print format.
33
+
23
34
  = EXAMPLES
24
35
 
25
36
  % gpprint data.nc@temp
26
- % gpprint data.nc@temp,lon=135.0
27
- % gpprint data.nc@temp,lon=130:150,lat=0
28
- % gpprint data.nc@temp,lon=130:150,lat=0:90:2
37
+ % gpprint -l data.nc@temp,lon=135.0
38
+ % gpprint -e data.nc@temp,lon=130:150,lat=0
39
+ % gpprint -f " %10.3f," data.nc@temp,lon=130:150,lat=0:90:2
29
40
 
30
41
  = HISTORY
31
42
 
@@ -36,6 +47,7 @@ where the format of the url is
36
47
  2005/08/23 S Takehiro (common methods to gp* command moved to gpcommon.rb)
37
48
  2010/03/10 Y SASAKI (change help block into RD format)
38
49
  2012/02/19 S Takehiro (description for gturl format updated)
50
+ 2017/04/02 S Takehiro (options added)
39
51
 
40
52
  =end
41
53
  ##################################################
@@ -44,15 +56,56 @@ require "numru/gphys"
44
56
  require "numru/gphys/gpcommon"
45
57
  include NumRu
46
58
 
47
- #------------------------ print help message ------------------------
59
+ require "getoptlong"
60
+
61
+ #---------------------- Option Configuration ----------------------
62
+ parser = GetoptLong.new(
63
+ ["--exp", "-e", GetoptLong::NO_ARGUMENT ],
64
+ ["--long", "-l", GetoptLong::NO_ARGUMENT ],
65
+ ["--fmt", "-f", GetoptLong::REQUIRED_ARGUMENT],
66
+ ["--help", "-h", GetoptLong::NO_ARGUMENT ])
67
+ begin
68
+ parser.each{|opt, arg|
69
+ case opt
70
+ when "--exp" then eval "$OPT_exp=true"
71
+ when "--long" then eval "$OPT_long=true"
72
+ when "--fmt" then eval "$OPT_fmt='#{arg}'"
73
+ when "--help" then eval "$OPT_help=true"
74
+ else
75
+ raise "must not happen"
76
+ end
77
+ }
78
+ rescue GetoptLong::AmbigousOption, GetoptLong::InvalidOption,
79
+ GetoptLong::MissingArgument,
80
+ GetoptLong::NeedlessArgument => err
81
+ help
82
+ $srderr.puts err.message
83
+ exit 1
84
+ end
85
+
86
+ #------------------------ Help message ------------------------
87
+ if $OPT_help then
88
+ help
89
+ exit(0)
90
+ end
48
91
 
49
- help if ARGV.length != 1 or /^-+h/ =~ ARGV[0]
92
+ #------------------------ Help message ------------------------
50
93
  gturl = ARGV[0]
51
94
  gp = GPhys::IO.open_gturl(gturl)
52
95
 
53
- new_line_int = 6
96
+ new_line_int = 5
97
+
54
98
  first_dim_len = (gp.shape[0]||1)
55
- fmt = " %g,"
99
+ if $OPT_fmt then
100
+ fmt=$OPT_fmt
101
+ elsif $OPT_exp then
102
+ fmt=" %e,"
103
+ elsif $OPT_long then
104
+ fmt=" %f,"
105
+ else
106
+ fmt=" %g,"
107
+ end
108
+
56
109
  i = 1
57
110
  gp.val.each do |v|
58
111
  printf(fmt,v)
data/bin/gpview CHANGED
@@ -317,6 +317,7 @@ For multiple GPhys variables,
317
317
  # 2015/03/10 S Takehiro (History removes from the output of --help option)
318
318
  # 2015/09/05 Y O Takahashi && S Takehiro (add option --delay)
319
319
  # 2015/09/06 Y O Takahashi && S Takehiro (defalt wsn number changed)
320
+ # 2017/06/07 S Takehiro (int option bug fix)
320
321
  #
321
322
  #################################################
322
323
  require "getoptlong" # for option_parse
@@ -397,13 +398,23 @@ def draw_setup
397
398
  min_range, max_range = __split_range($OPT_range)
398
399
  min_crange, max_crange = __split_range($OPT_crange)
399
400
  min_srange, max_srange = __split_range($OPT_srange)
401
+ if ( $OPT_cint || $OPT_interval || $OPT_int )
402
+ cont_interval = ( $OPT_cint || $OPT_interval || $OPT_int ).to_f
403
+ else
404
+ cont_interval = nil
405
+ end
406
+ if ( $OPT_sint || $OPT_interval || $OPT_int )
407
+ tone_interval = ( $OPT_sint || $OPT_interval || $OPT_int ).to_f
408
+ else
409
+ tone_interval = nil
410
+ end
400
411
  GGraph.set_linear_contour_options(
401
- 'int' => ( $OPT_cint || $OPT_interval || $OPT_int ),
412
+ 'int' => cont_interval,
402
413
  'min' => ( min_crange || min_range ),
403
414
  'max' => ( max_crange || max_range )
404
415
  )
405
416
  GGraph.set_linear_tone_options(
406
- 'int' => ( $OPT_sint || $OPT_interval || $OPT_int ),
417
+ 'int' => tone_interval,
407
418
  'min' => ( min_srange || min_range ),
408
419
  'max' => ( max_srange || max_range )
409
420
  )
@@ -31,6 +31,9 @@ enum bc_type {
31
31
  #define ID3z(i,j,k) ((i) + (j)*n0 + (k)*n0*nz)
32
32
  #define ID3c(i,j,k) ((i) + (j)*n0 + (k)*n0*nc)
33
33
  #define ID2(i,j) ((i) + (j)*n0)
34
+ #define ID5(i,j,k,l,m) ((i) + (j)*ni + (k)*ni*nd1 + (l)*ni*nd1*no1 + (m)*ni*nd1*no1*nd2)
35
+ #define NMax(i,j) ( (i) >= (j) ? (i) : (j) )
36
+ #define NMin(i,j) ( (i) <= (j) ? (i) : (j) )
34
37
 
35
38
  static int
36
39
  convol_result_length(na_shape_t n1, na_shape_t wlen, int ibc)
@@ -410,6 +413,215 @@ running_mean(int argc, VALUE *argv, VALUE self)
410
413
  return vo;
411
414
  }
412
415
 
416
+ /* Running tile (2D) mean for data with missing.
417
+ (if no missing, you can just run the 1D running mean twice.)
418
+ */
419
+ static void
420
+ running_mean_2D_miss(zi, ni,nd1,no1,nd2,no2,
421
+ with_w1, w1, wlen1, ibc1, with_w2, w2, wlen2, ibc2,
422
+ zmiss, nminvalid, zo)
423
+ // IN
424
+ double *zi;
425
+ na_shape_t ni,nd1,no1,nd2,no2; /* treated as 5D array (inner => outer) */
426
+ int with_w1, with_w2;
427
+ double *w1, *w2;
428
+ na_shape_t wlen1, wlen2;
429
+ int ibc1, ibc2;
430
+ double zmiss;
431
+ int nminvalid;
432
+ // OUT
433
+ double *zo; // must have been set to 0 everywhere
434
+ {
435
+ na_shape_t i,j1,k1,j2,k2,m1,m2, jj1, jj2;
436
+ na_shape_t mstr1, mend1, mstr2, mend2;
437
+ na_shape_t wlhs1, wlhs2;
438
+ double wsum, wv;
439
+ int nm;
440
+
441
+ wlhs1 = (wlen1 - 1)/2; // e.g. 7->3, 6->2
442
+ wlhs2 = (wlen2 - 1)/2; // e.g. 7->3, 6->2
443
+
444
+ // < weighted running mean >
445
+
446
+ if ( !( ibc1 == BC_SIMPLE || ibc1 == BC_CYCLIC ) ) {
447
+ rb_raise(rb_eArgError,"Undefined boundary condision(1st D) (%d)", ibc1);
448
+ }
449
+ if ( !( ibc2 == BC_SIMPLE || ibc2 == BC_CYCLIC ) ) {
450
+ rb_raise(rb_eArgError,"Undefined boundary condision(2nd D) (%d)", ibc2);
451
+ }
452
+
453
+ for (k2=0; k2<no2; k2++) {
454
+ for (j2=0; j2<nd2; j2++) {
455
+ for (k1=0; k1<no1; k1++) {
456
+ for (j1=0; j1<nd1; j1++) {
457
+ for (i=0; i<ni; i++) {
458
+ wsum = 0.0;
459
+ nm = 0;
460
+ if (ibc1==BC_SIMPLE) {
461
+ mstr1 = NMax(0,wlhs1-j1);
462
+ mend1 = NMin(wlen1,nd1+wlhs1-j1);
463
+ } else { /* BC_CYCLIC */
464
+ mstr1 = 0;
465
+ mend1 = wlen1;
466
+ }
467
+ if (ibc2==BC_SIMPLE) {
468
+ mstr2 = NMax(0,wlhs2-j2);
469
+ mend2 = NMin(wlen2,nd2+wlhs2-j2);
470
+ } else { /* BC_CYCLIC */
471
+ mstr2 = 0;
472
+ mend2 = wlen2;
473
+ }
474
+ for (m2=mstr2; m2<mend2; m2++) {
475
+ for (m1=mstr1; m1<mend1; m1++) {
476
+ jj2 = j2-wlhs2+m2;
477
+ jj1 = j1-wlhs1+m1;
478
+ if (ibc1==BC_CYCLIC) {
479
+ if ( jj1 < 0 ) {
480
+ jj1 += nd1;
481
+ } else {
482
+ jj1 %= nd1;
483
+ }
484
+ }
485
+ if (ibc2==BC_CYCLIC) {
486
+ if ( jj2 < 0 ) {
487
+ jj2 += nd2;
488
+ } else {
489
+ jj2 %= nd2;
490
+ }
491
+ }
492
+ if ( zi[ID5(i,jj1,k1,jj2,k2)] != zmiss ) {
493
+ wv = 1.0;
494
+ if(with_w1){ wv *= w1[m1]; }
495
+ if(with_w2){ wv *= w2[m2]; }
496
+ zo[ID5(i,j1,k1,j2,k2)] +=
497
+ wv*zi[ID5(i,jj1,k1,jj2,k2)];
498
+ wsum += wv;
499
+ nm++;
500
+ }
501
+ }
502
+ }
503
+ if (nm >= nminvalid) {
504
+ zo[ID5(i,j1,k1,j2,k2)] /= wsum;
505
+ } else {
506
+ zo[ID5(i,j1,k1,j2,k2)] = zmiss;
507
+ }
508
+ }
509
+ }
510
+ }
511
+ }
512
+ }
513
+ }
514
+
515
+ // driver of running_mean_2D_miss
516
+ // (no-missing version is not needed)
517
+ //
518
+ static VALUE
519
+ running_mean_2D(obj, vi, dim1, len_or_wgt1, bc1, dim2, len_or_wgt2, bc2,
520
+ missv, nminvalid)
521
+ VALUE obj;
522
+ VALUE vi; // input NArray
523
+ VALUE dim1; // Integer
524
+ VALUE len_or_wgt1; // weight 1D NArray or Integer (length of uniform wgt)
525
+ VALUE bc1 ; // boundary condition (Integer)
526
+ VALUE dim2; // Integer
527
+ VALUE len_or_wgt2; // weight 1D NArray or Integer (length of uniform wgt)
528
+ VALUE bc2 ; // boundary condition (Integer)
529
+ VALUE missv; // missing value in vi
530
+ VALUE nminvalid; // miminum count of non-missing vales
531
+ {
532
+ struct NARRAY *na;
533
+ VALUE wgt;
534
+ na_shape_t *shi, wlen1, wlen2;
535
+ int with_w1, with_w2;
536
+ na_shape_t ni,nd1,no1,nd2,no2;
537
+ double *zi, *w1, *w2, zmiss;
538
+ int d1, d2, i, rank, ibc1, ibc2;
539
+ VALUE vo;
540
+ na_shape_t *sho, n1o;
541
+ int nminvalid_; // miminum count of non-missing vales
542
+ double *zo;
543
+
544
+ // < process arguments >
545
+
546
+ if (!IsNArray(vi)) { rb_raise(rb_eArgError,"1st arg must be a NArray"); }
547
+ vi = na_cast_object(vi, NA_DFLOAT);
548
+ rank = NA_RANK(vi);
549
+ if (rank < 2) { rb_raise(rb_eArgError,"rank 1st arg must be >= 2"); }
550
+ zi = NA_PTR_TYPE(vi, double *);
551
+ GetNArray(vi, na);
552
+ shi = na->shape;
553
+
554
+ d1 = NUM2INT( dim1 );
555
+ d2 = NUM2INT( dim2 );
556
+ nminvalid_ = NUM2INT( nminvalid );
557
+
558
+ if (d1 >= d2) { rb_raise(rb_eArgError,"d1 < d2 is required"); }
559
+ if (d2 >= rank) { rb_raise(rb_eArgError,"d2 must be < rank"); }
560
+
561
+ with_w1 = IsNArray(len_or_wgt1);
562
+ if (with_w1) {
563
+ wgt = len_or_wgt1;
564
+ if (NA_RANK(wgt)!=1){rb_raise(rb_eArgError,"wgt1 must be a 1D NArray");}
565
+ wgt = na_cast_object(wgt, NA_DFLOAT);
566
+ wlen1 = NA_TOTAL(wgt);
567
+ w1 = NA_PTR_TYPE(wgt, double *);
568
+ } else {
569
+ wlen1 = NUM2INT( len_or_wgt1 );
570
+ w1 == NULL; /* will not be used */
571
+ }
572
+
573
+ with_w2 = IsNArray(len_or_wgt2);
574
+ if (with_w2) {
575
+ wgt = len_or_wgt2;
576
+ if (NA_RANK(wgt)!=1){rb_raise(rb_eArgError,"wgt2 must be a 1D NArray");}
577
+ wgt = na_cast_object(wgt, NA_DFLOAT);
578
+ wlen2 = NA_TOTAL(wgt);
579
+ w2 = NA_PTR_TYPE(wgt, double *);
580
+ } else {
581
+ wlen2 = NUM2INT( len_or_wgt2 );
582
+ w2 == NULL; /* will not be used */
583
+ }
584
+
585
+ ibc1 = NUM2INT( bc1 );
586
+ ibc2 = NUM2INT( bc2 );
587
+
588
+ zmiss = NUM2DBL(missv);
589
+
590
+
591
+ // < shape as 5D >
592
+
593
+ nd1 = shi[d1]; // length of the dim to filter
594
+ if (wlen1 >= nd1) {rb_raise(rb_eArgError,"filter len >= len of the dim1");}
595
+ nd2 = shi[d2]; // length of the dim to filter
596
+ if (wlen2 >= nd1) {rb_raise(rb_eArgError,"filter len >= len of the dim2");}
597
+
598
+ ni = no1 = no2 = 1;
599
+ for (i=0; i<d1; i++) {
600
+ ni *= shi[i]; // total lengths of dims before d
601
+ }
602
+ for (i=d1+1; i<d2; i++) {
603
+ no1 *= shi[i]; // total lengths of dims after d
604
+ }
605
+ for (i=d2+1; i<rank; i++) {
606
+ no2 *= shi[i]; // total lengths of dims after d
607
+ }
608
+
609
+ // < initialize the NArray to ruturn >
610
+
611
+ sho = shi; // Limited to shape conserved cases
612
+ vo = na_make_object(NA_DFLOAT, rank, sho, cNArray);
613
+ GetNArray(vo, na);
614
+ na_clear_data(na);
615
+ zo = NA_PTR_TYPE(vo, double *);
616
+
617
+ // < do the job >
618
+ running_mean_2D_miss(zi, ni,nd1,no1,nd2,no2,
619
+ with_w1, w1, wlen1, ibc1, with_w2, w2, wlen2, ibc2,
620
+ zmiss, nminvalid_, zo);
621
+
622
+ return vo;
623
+ }
624
+
413
625
  static void
414
626
  bin_mean_nomiss(zi,n0,n1,n2, len, zo)
415
627
  // IN
@@ -1209,10 +1421,15 @@ init_gphys_dim_op()
1209
1421
 
1210
1422
  cGPhys = rb_define_class_under(mNumRu, "GPhys", rb_cObject);
1211
1423
  rb_define_private_method(cGPhys, "c_running_mean", running_mean, -1);
1424
+ rb_define_private_method(cGPhys, "c_running_mean_2D", running_mean_2D, 9);
1425
+ rb_define_singleton_method(cGPhys, "c_running_mean", running_mean, -1);
1426
+ rb_define_singleton_method(cGPhys, "c_running_mean_2D", running_mean_2D, 9);
1212
1427
 
1213
1428
  cVArray = rb_define_class_under(mNumRu, "VArray", rb_cObject);
1214
1429
  rb_define_private_method(cVArray, "c_bin_mean", bin_mean, -1);
1215
1430
  rb_define_private_method(cVArray, "c_bin_sum", bin_sum, -1);
1431
+ rb_define_singleton_method(cGPhys, "c_bin_mean", bin_mean, -1);
1432
+ rb_define_singleton_method(cGPhys, "c_bin_sum", bin_sum, -1);
1216
1433
 
1217
1434
  rb_define_private_method(cVArray, "c_cum_sum", cum_sum, 2);
1218
1435
  rb_define_singleton_method(cGPhys, "c_cell_integ_irreg",
@@ -26,7 +26,7 @@ Gem::Specification.new do |spec|
26
26
  spec.test_files = spec.files.grep(%r{^(test|test_old|sample|testdata)/})
27
27
  spec.extensions << "ext/numru/gphys/extconf.rb"
28
28
 
29
- spec.post_install_message = "Thanks for installing! You can add extra libraries (i.e., ruby-lapack, rb-grib) to enjoy powerful calculating and handling datasets."
29
+ spec.post_install_message = "Thanks for installing! You can add extra libraries (i.e., ruby-lapack, rb-gsl) to enjoy powerful calculating and handling datasets."
30
30
 
31
31
  spec.required_ruby_version = Gem::Requirement.new(">= 1.8")
32
32
 
@@ -37,8 +37,7 @@ Gem::Specification.new do |spec|
37
37
  spec.add_runtime_dependency(%q<ruby-netcdf>, [">= 0.6.6"])
38
38
  spec.add_runtime_dependency(%q<ruby-dcl>, [">= 1.6.1"])
39
39
  spec.add_runtime_dependency(%q<ruby-fftw3>, [">= 0.3"])
40
- #spec.add_runtime_dependency(%q<gsl>, [">= 1.14"])
41
- spec.add_runtime_dependency(%q<rb-gsl>, [">= 1.14"])
40
+ #spec.add_runtime_dependency(%q<rb-gsl>, [">= 1.14"])
42
41
  #spec.add_runtime_dependency(%q<ruby-lapack>, [">= 1.5"])
43
42
  #spec.add_development_dependency(%q<rb-grib>, [">= 0.2.0"])
44
43
  end
@@ -927,6 +927,11 @@ module NumRu
927
927
  # * inf_max false: no extension, true: extend to +infty, nil: same
928
928
  # but for max is replaced by +infty, rather than extending
929
929
  def ue_linear_levels(min, max, dx, lbound=false, inf_min=false, inf_max=false)
930
+
931
+ if !min || ( min.is_a?(Float) && min.nan? )|| !max || ( max.is_a?(Float) && max.nan? )
932
+ return [0.0]
933
+ end
934
+
930
935
  if dx > 0
931
936
  dz = dx.to_f
932
937
  else
@@ -1219,7 +1224,8 @@ module NumRu
1219
1224
  # draw frame, tick lines, and labels
1220
1225
  if fmt
1221
1226
  cfmt_bk = DCL::uyqfmt
1222
- DCL::uysfmt(fmt)
1227
+ #DCL::uysfmt(fmt)
1228
+ DCL::uspset('cyfmt',fmt)
1223
1229
  end
1224
1230
 
1225
1231
  DCL::usyaxs(axside)
@@ -1232,14 +1238,16 @@ module NumRu
1232
1238
  DCL::uxaxdv("b",1,index) if !inf0
1233
1239
  DCL::uxaxdv("t",1,index) if !inf1
1234
1240
 
1235
- DCL::uysfmt(cfmt_bk) if fmt
1241
+ #DCL::uysfmt(cfmt_bk) if fmt
1242
+ DCL::uspset('cyfmt',cfmt_bk) if fmt
1236
1243
 
1237
1244
  else ## landscape ##
1238
1245
 
1239
1246
  # draw frame, tick lines, and labels
1240
1247
  if fmt
1241
1248
  cfmt_bk = DCL::uxqfmt
1242
- DCL::uxsfmt(fmt)
1249
+ #DCL::uxsfmt(fmt)
1250
+ DCL::uspset('cxfmt',fmt)
1243
1251
  end
1244
1252
 
1245
1253
  DCL::usxaxs(axside)
@@ -1252,7 +1260,8 @@ module NumRu
1252
1260
  DCL::uyaxdv("l",1,index) if !inf0
1253
1261
  DCL::uyaxdv("r",1,index) if !inf1
1254
1262
 
1255
- DCL::uxsfmt(cfmt_bk) if fmt
1263
+ #DCL::uxsfmt(cfmt_bk) if fmt
1264
+ DCL::uspset('cxfmt',cfmt_bk) if fmt
1256
1265
  end
1257
1266
 
1258
1267
  DCLExt.color_bar_title_units(vxmin, vxmax, vymin, vymax, portrait, voff,
@@ -47,7 +47,7 @@ require "numru/dclext"
47
47
  * ((<next_map>))
48
48
  Set the option values effective only in the next call of ((<map>))
49
49
  * ((<line>))
50
- Plot a poly-line by selecting the first dimension (with GPhys#first1D)
50
+ Plot a poly-line by selecting the first dimension
51
51
  if (({gphys})) is more than 2D.
52
52
  * ((<set_line>))
53
53
  Change the default option values for ((<line>)).
@@ -66,7 +66,7 @@ require "numru/dclext"
66
66
  * ((<tone_and_contour>))
67
67
  Calls ((<tone>)) and ((<contour>)) successively.
68
68
  * ((<contour>))
69
- Contour plot by selecting the first 2 dimensions (with GPhys#first2D)
69
+ Contour plot by selecting the first 2 dimensions
70
70
  if (({gphys})) is more than 3D.
71
71
  * ((<set_contour>))
72
72
  Set options for contour in general.
@@ -84,7 +84,7 @@ require "numru/dclext"
84
84
  is effective only for the next call of ((<contour>)).
85
85
  * ((<tone>))
86
86
  Color tone or shading by selecting the first 2 dimensions
87
- (with GPhys#first2D) if (({gphys})) is more than 3D.
87
+ if (({gphys})) is more than 3D.
88
88
  * ((<color_bar >)) Color bar
89
89
  * ((<set_tone_levels>))
90
90
  Set tone levels for ((<tone>)) explicitly by values.
@@ -511,7 +511,7 @@ library if you like.
511
511
  * see ((<map>)).
512
512
 
513
513
  ---line(gphys, newframe=true, options=nil)
514
- Plot a poly-line by selecting the first dimension (with GPhys#first1D)
514
+ Plot a poly-line by selecting the first dimension
515
515
  if (({gphys})) is more than 2D.
516
516
 
517
517
  ARGUMENTS
@@ -742,7 +742,7 @@ library if you like.
742
742
  * Requires numru-misc-0.0.6 or later.
743
743
 
744
744
  ---contour(gphys, newframe=true, options=nil)
745
- Contour plot by selecting the first 2 dimensions (with GPhys#first2D)
745
+ Contour plot by selecting the first 2 dimensions
746
746
  if (({gphys})) is more than 3D.
747
747
 
748
748
  Contour levels are determined as follows:
@@ -858,7 +858,7 @@ library if you like.
858
858
 
859
859
  ---tone(gphys, newframe=true, options=nil)
860
860
  Color tone or shading by selecting the first 2 dimensions
861
- (with GPhys#first2D) if (({gphys})) is more than 3D.
861
+ if (({gphys})) is more than 3D.
862
862
 
863
863
  Tone levels are determined as follows:
864
864
  * Tone levels are set in this method if not set by
@@ -1905,7 +1905,7 @@ module NumRu
1905
1905
  ['mean', nil, 'An Array to be pathed to the GPhys#mean method to take mean of the data before plotting (order applied: slice -> cut -> mean)']
1906
1906
  )
1907
1907
 
1908
- def data_prep_2D(gps, newframe, opts)
1908
+ def data_prep_2D(gps, newframe, opts, len1ok: false)
1909
1909
  opend_here = []
1910
1910
  gps.collect!{|gp|
1911
1911
  if gp.is_a?(String)
@@ -1921,7 +1921,11 @@ module NumRu
1921
1921
  end
1922
1922
  end
1923
1923
  gp = gp.mean(*opts['mean']) if opts['mean']
1924
- gp = gp.first2D
1924
+ if len1ok
1925
+ gp = gp.first2D
1926
+ else
1927
+ gp = gp.first2Dreally
1928
+ end
1925
1929
  gp = gp.transpose(1,0) if opts['transpose'] || opts['exchange']
1926
1930
  if opts['xintv'] || opts['yintv']
1927
1931
  gp = gp.copy
@@ -1981,7 +1985,7 @@ module NumRu
1981
1985
  [xd, yd, closer, *gps]
1982
1986
  end
1983
1987
 
1984
- def data_prep_1D(gphys, opts)
1988
+ def data_prep_1D(gphys, opts, len1ok: false)
1985
1989
  gp = gphys
1986
1990
  if gp.is_a?(String)
1987
1991
  gp = GPhys::IO.str2gphys(gp)
@@ -1998,7 +2002,11 @@ module NumRu
1998
2002
  end
1999
2003
  end
2000
2004
  gp = gp.mean(*opts['mean']) if opts['mean']
2001
- gp = gp.first1D
2005
+ if len1ok
2006
+ gp = gp.first1D
2007
+ else
2008
+ gp = gp.first1Dreally
2009
+ end
2002
2010
  window = ( @@next_fig['window'] if @@next_fig ) || @@fig['window']
2003
2011
  window = ( window ? window.dup : [nil, nil, nil, nil])
2004
2012
  max = opts['max']; min = opts['min']
@@ -2016,7 +2024,7 @@ module NumRu
2016
2024
  [xd, yd, closer, gp, window]
2017
2025
  end
2018
2026
 
2019
- def data_prep_1D2(fx, fy, opts)
2027
+ def data_prep_1D2(fx, fy, opts, len1ok: false)
2020
2028
  gpx = fx
2021
2029
  gpy = fy
2022
2030
  to_close = Array.new
@@ -2043,18 +2051,26 @@ module NumRu
2043
2051
  end
2044
2052
  end
2045
2053
  gpx = gpx.mean(*opts['mean']) if opts['mean']
2046
- gpx = gpx.first1D
2054
+ if len1ok
2055
+ gpx = gpx.first1D
2056
+ else
2057
+ gpx = gpx.first1Dreally
2058
+ end
2047
2059
 
2048
2060
  gpy = gpy[*opts['slice']] if opts['slice']
2049
2061
  if (cut = opts['cut']) # substitution, not ==
2050
2062
  if cut.is_a?(Array)
2051
2063
  gpy = gpy.cut(*cut)
2052
2064
  else
2053
- gpy = gpy.cut(cut)
2065
+ gpy = gpy.cut(cut)
2054
2066
  end
2055
2067
  end
2056
2068
  gpy = gpy.mean(*opts['mean']) if opts['mean']
2057
- gpy = gpy.first1D
2069
+ if len1ok
2070
+ gpy = gpy.first1D
2071
+ else
2072
+ gpy = gpy.first1Dreally
2073
+ end
2058
2074
 
2059
2075
  [gpx, gpy, closer]
2060
2076
  end
@@ -2256,7 +2272,7 @@ module NumRu
2256
2272
  @@next_mark = nil
2257
2273
  end
2258
2274
  opts = @@mark_options.interpret(options)
2259
- x, y, closer, gp, window = data_prep_1D(gphys, opts)
2275
+ x, y, closer, gp, window = data_prep_1D(gphys, opts, len1ok: true)
2260
2276
  if newframe
2261
2277
  fig(x, y, {'window'=>window})
2262
2278
  axes_or_map_and_ttl(gp, opts, x, y)
@@ -3230,6 +3246,8 @@ module NumRu
3230
3246
  ['x_given_y', false, 'If false (default), regress y for given x. If true, x given y.'],
3231
3247
  ['annot_slope', nil, 'Whether to show the slope on the right margin. nil: show when itr=1,4, do not show when itr=2,3; true: show; false: not show'],
3232
3248
  ['annot_intercept', false, '[Meaningful only when itr=1 (linear scaling plot)] if true, show the intercept on the right margin'],
3249
+ ['annot_cor', false, 'Whether to show correlation coefficient on the right margin.'],
3250
+ ['annot_r2', false, 'Whether to show squared correlation coefficient on the right margin.'],
3233
3251
  ['limit', false, 'If true, regression line is shown only over the range between max and min of the independent variable. If false, regression line is written over the whole range of the independent variable'],
3234
3252
  ['clip', true, "If true, use DCL's clipping not to show the line outside the viewport"],
3235
3253
  ['index', 1, 'line index'],
@@ -3289,7 +3307,7 @@ module NumRu
3289
3307
  xr = NArray.sfloat(2) # --> x ends of the regression line
3290
3308
  yr = NArray.sfloat(2) # --> y ends of the regression line
3291
3309
  if y_given_x
3292
- a,b = linear_regression(xs,ys)
3310
+ a,b,r2 = linear_regression(xs,ys)
3293
3311
  if opts["limit"]
3294
3312
  xr[0] = x.min
3295
3313
  xr[1] = x.max
@@ -3300,7 +3318,7 @@ module NumRu
3300
3318
  yrs = a + b*xrs
3301
3319
  yr = !ylog ? yrs : NMath::exp(yrs)
3302
3320
  else
3303
- a,b = linear_regression(ys,xs)
3321
+ a,b,r2 = linear_regression(ys,xs)
3304
3322
  if opts["limit"]
3305
3323
  yr[0] = y.min
3306
3324
  yr[1] = y.max
@@ -3318,6 +3336,8 @@ module NumRu
3318
3336
 
3319
3337
  ai = opts['annot_intercept'] || opts['annot_intercept'].nil? && itr==1
3320
3338
  as = opts['annot_slope'] || opts['annot_slope'].nil? && (itr==1 or itr==4)
3339
+ ac = opts['annot_cor']
3340
+ ar2 = opts['annot_r2']
3321
3341
  if as && ai
3322
3342
  if y_given_x
3323
3343
  annot = ["regr y=a+bx:",
@@ -3326,6 +3346,8 @@ module NumRu
3326
3346
  annot = ["regr x=a+by:",
3327
3347
  " a=#{DCL.chval('A',a)}", " b=#{DCL.chval('A',b)}"]
3328
3348
  end
3349
+ annot.push(sprintf("r=%-.3g",Math.sqrt(r2))) if ac
3350
+ annot.push(sprintf("r2=%-.3g",r2)) if ar2
3329
3351
  annotate(annot, @@nannot)
3330
3352
  elsif as
3331
3353
  if y_given_x
@@ -3333,10 +3355,12 @@ module NumRu
3333
3355
  else
3334
3356
  annot = ["regress x given y:", " x(y) slope: #{DCL.chval('A',b)}"]
3335
3357
  end
3358
+ annot.push(sprintf("r=%-.3g",Math.sqrt(r2))) if ac
3359
+ annot.push(sprintf("r2=%-.3g",r2)) if ar2
3336
3360
  annotate(annot, @@nannot)
3337
3361
  end
3338
3362
 
3339
- [a,b]
3363
+ [a,b,r2]
3340
3364
  end
3341
3365
  end
3342
3366
 
@@ -3347,7 +3371,9 @@ module NumRu
3347
3371
  my = y.mean
3348
3372
  b = cxy/cxx
3349
3373
  a = my - b*mx
3350
- [a,b]
3374
+ cyy, ndiv = NMMath.covariance(y,y)
3375
+ r2 = cxy/Math.sqrt(cxx*cyy)
3376
+ [a,b,r2]
3351
3377
  end
3352
3378
 
3353
3379
  def linear_reg_slope_error(x,y,a,b)
@@ -600,7 +600,7 @@ module NumRu
600
600
  self
601
601
  end
602
602
  def get_aux(name)
603
- @aux[name]
603
+ @aux && @aux[name]
604
604
  end
605
605
  def aux_names
606
606
  @aux ? @aux.keys : []
@@ -890,7 +890,25 @@ module NumRu
890
890
  end
891
891
  private :_cut_
892
892
 
893
- def _minloc_(a) # private to be used in _cut_
893
+ # Find index nearest to loc
894
+ #
895
+ # * loc (Numeric, Date, DateTime)
896
+ #
897
+ # Return value: the index (Integer)
898
+ def nearest_index(loc)
899
+ if loc.class <= Date
900
+ loc = UNumeric.from_date(loc,pos.units,self.pos.get_att('calendar')).val
901
+ end
902
+ ax = self.pos.val
903
+ if cyclic_extendible?
904
+ dx, base = _cyclic_dx(ax-loc, modulo)
905
+ else
906
+ dx = (ax-loc).abs
907
+ end
908
+ idx = _minloc_(dx)
909
+ end
910
+
911
+ def _minloc_(a) # private to be used in nearest_index (for cut etc)
894
912
  # Developper's MEMO: Such a method should be supported in NArray
895
913
  minloc = 0 # initialization
896
914
  for i in 0...(a.length-1) # here, do not assume monotonic
@@ -1158,7 +1176,16 @@ if $0 == __FILE__
1158
1176
 
1159
1177
  p "## test join (cell)"
1160
1178
  axcel_c2 = Axis.new(true).set_cell(xc+10,xb+10)
1179
+ axcel_c2.set_aux('aux1',xc*10)
1161
1180
  axcel_c2.set_pos_to_center
1162
1181
  jax = Axis.join([axcel_c,axcel_c2])
1163
1182
  p jax, jax.name, jax.pos.val.to_a, jax.cell_bounds.val.to_a
1183
+
1184
+ p "## test neaest index"
1185
+ loc = 1.1
1186
+ p axpt, loc, axpt.nearest_index(loc)
1187
+ xc.put_att("modulo",[10.0])
1188
+ axpt_cyc = Axis.new().set_pos(xc)
1189
+ loc = -8.5
1190
+ p axpt_cyc, axpt_cyc.modulo, loc, axpt.nearest_index(loc)
1164
1191
  end
@@ -805,7 +805,7 @@ module NumRu
805
805
  ## For graphics -->
806
806
  def first3D
807
807
  raise "rank less than 3" if rank < 3
808
- self[true,true,*([0]*(rank-3))]
808
+ self[true,true,true,*([0]*(rank-3))]
809
809
  end
810
810
  def first2D
811
811
  raise "rank less than 2" if rank < 2
@@ -815,6 +815,31 @@ module NumRu
815
815
  raise "rank less than 1" if rank < 1
816
816
  self[true,*([0]*(rank-1))]
817
817
  end
818
+ def firstNDreally(nd)
819
+ sh = shape_current
820
+ n = 0
821
+ sel = sh.map do |len|
822
+ if len > 1 && n < nd
823
+ n += 1
824
+ true
825
+ else
826
+ 0
827
+ end
828
+ end
829
+ if n<nd
830
+ raise "Invalid shape #{sh} (not really #{nd}D or greater): # of dims with len>1 is fewer than #{nd}"
831
+ end
832
+ self[*sel]
833
+ end
834
+ def first3Dreally
835
+ firstNDreally(3)
836
+ end
837
+ def first2Dreally
838
+ firstNDreally(2)
839
+ end
840
+ def first1Dreally
841
+ firstNDreally(1)
842
+ end
818
843
  ## <-- For graphics
819
844
 
820
845
  def coerce(other)
@@ -20,15 +20,16 @@ module NumRu
20
20
  # * len_or_wgt : If Integer, specifies the length; if 1D NArray,
21
21
  # specifies the weight (e.g., NArray[1.0, 2.0, 1.0] for
22
22
  # the 1-2-1 smooting)
23
- # * bc (Integer; optional) : Speficy one of the folloing:
24
- # * GPhys::BC_SIMPLE (default) : Averaging is trucated at the boundaries
23
+ # * bc (Integer; optional) : Specify one of the following:
24
+ # * nil (default) : choose BC_SIMPLE or BC_CYCLIC automatically
25
+ # * GPhys::BC_SIMPLE : Averaging is truncated at the boundaries
25
26
  # (the number of grid points used is reduced near the boundaries).
26
27
  # The shape of the object is conserved.
27
28
  # * GPhys::BC_CYCLIC : Cyclic boundary condition. Shape conserved.
28
29
  # * GPhys::BC_TRIM : Grids near the boundaries are trimmed to
29
30
  # secure the number of grid points to average.
30
31
  # Shape not conserved; length along the dim is reduced by (len-1).
31
- # * nminvalid (Integer; optional; defualt=1):
32
+ # * nminvalid (Integer; optional; default=1):
32
33
  # This parameter is used only when the data have missing.
33
34
  # Minimum number of grid points needed for averaging.
34
35
  # Must be from 1 to len.
@@ -40,15 +41,23 @@ module NumRu
40
41
  # * If the length of the running mean is even number, fewer
41
42
  # grid points are used from the "left" side; e.g.,
42
43
  # If len is 6, result[2] is a mean over self[0]..self[5].
43
- # * Regardless the na_type of self, double is used for avaraging, so:
44
+ # * Regardless the na_type of self, double is used for averaging, so:
44
45
  # * This method does not support complex numbers.
45
46
  #
46
- def running_mean(dim, len_or_wgt=nil, bc=BC_SIMPLE, nminvalid=1)
47
+ def running_mean(dim, len_or_wgt=nil, bc=nil, nminvalid=1)
47
48
 
48
49
  #< process arguments >
49
50
 
50
51
  dim = dim_index(dim) # to handle String or negative specification
51
52
 
53
+ if bc.nil?
54
+ if axis(dim).cyclic_extendible?
55
+ bc=BC_CYCLIC
56
+ else
57
+ bc=BC_SIMPLE
58
+ end
59
+ end
60
+
52
61
  case len_or_wgt
53
62
  when nil
54
63
  raise ArgumentError, "You need to specify the length (Integer) or the weight (1D NArray) as the 2nd argument"
@@ -95,6 +104,78 @@ module NumRu
95
104
 
96
105
  end
97
106
 
107
+ # Running mean along two dimensions (with optional weight specification).
108
+ #
109
+ # This method would be needed for data with missing. If the data
110
+ # has no missing, you should apply running_mean consecutively
111
+ # along the two dimensions you want, which will be faster and efficient.
112
+ #
113
+ # However, if the data have missing, the results are not the same.
114
+ # That's why this method is needed.
115
+ #
116
+ # ARGUMENTS
117
+ # * dim1 (Integer or String) : a dimension to apply the running mean
118
+ # * dim2 (Integer or String) : another dimension to apply the running mean
119
+ # (dim1 must be smaller than dim2)
120
+ # * len_or_wgt1 : If Integer, specifies the length of running mean for dim1.
121
+ # If 1D NArray, it specifies the weight (e.g., NArray[1.0, 2.0, 1.0] for
122
+ # the 1-2-1 smoothing)
123
+ # * len_or_wgt2 : as len_or_wgt1 but for dim2.
124
+ # * bc1 (Integer or nil; optional) : Specify one of the following for dim1:
125
+ # * nil : choose BC_SIMPLE or BC_CYCLIC automatically
126
+ # * GPhys::BC_SIMPLE : Averaging is truncated at the boundaries
127
+ # (the number of grid points used is reduced near the boundaries).
128
+ # The shape of the object is conserved.
129
+ # * GPhys::BC_CYCLIC : Cyclic boundary condition. Shape conserved.
130
+ # * bc2 : as bc1 but for dim2.
131
+ # * nminvalid (Integer; optional; default=1):
132
+ # Minimum number of grid points needed to define the running mean
133
+ # (it is the number of valid data in the 2-dimensional tile).
134
+ #
135
+ def running_mean_2D(dim1, dim2, len_or_wgt1, len_or_wgt2,
136
+ bc1=nil, bc2=nil,
137
+ nminvalid=1)
138
+
139
+ dim1 = dim_index(dim1) # to handle String or negative specification
140
+ dim2 = dim_index(dim2) # to handle String or negative specification
141
+
142
+ if bc1.nil?
143
+ if axis(dim1).cyclic_extendible?
144
+ bc1=BC_CYCLIC
145
+ else
146
+ bc1=BC_SIMPLE
147
+ end
148
+ end
149
+ if bc2.nil?
150
+ if axis(dim2).cyclic_extendible?
151
+ bc2=BC_CYCLIC
152
+ else
153
+ bc2=BC_SIMPLE
154
+ end
155
+ end
156
+
157
+ vi = self.val
158
+ if vi.is_a?(NArray)
159
+ # Just for convenience.
160
+ self.running_mean(dim1, len_or_wgt1, bc1, nminvalid).running_mean(dim2, len_or_wgt2, bc2, nminvalid)
161
+ end
162
+
163
+ if (vi.typecode > NArray::DFLOAT)
164
+ raise("This method supports only real or integer data")
165
+ end
166
+ if vi.is_a?(NArrayMiss)
167
+ vi, missval = nam2na_missval(vi)
168
+ vo = c_running_mean_2D(vi, dim1,len_or_wgt1,bc1, dim2,len_or_wgt2,bc2,
169
+ missval, nminvalid)
170
+ vo = NArrayMiss.to_nam(vo, vo.ne(missval) )
171
+ else
172
+ raise("This method accepts only data with missing. If not, you should apply running_mean twice for dim1 & dim2, respectively")
173
+ end
174
+
175
+ vvo = VArray.new( vo, self.data, self.name ) # Inherit name & attrs
176
+ GPhys.new( self.grid, vvo )
177
+ end
178
+
98
179
  # Binning along a dimension (mean)
99
180
  #
100
181
  # The values are averaged every "len" grids; unlike running_mean
@@ -199,7 +280,7 @@ module NumRu
199
280
  acs = Array.new
200
281
  assoccoordnames.each do |nm|
201
282
  ac = assoc_coord_gphys(nm)
202
- acs.push(ac) if !ac.dimnames.include?(dimname)
283
+ acs.push(ac) if !ac.axnames.include?(dimname)
203
284
  end
204
285
  newgrid.set_assoc_coords(acs) if acs.length > 0
205
286
  end
@@ -428,6 +428,7 @@ module NumRu
428
428
  newaxes.push( newax )
429
429
  }
430
430
  if acnms = grid_or_gphys.assoccoordnames
431
+ (nms = file.var_names) and acnms -= nms
431
432
  acnms.each{|nm|
432
433
  acgp = grid_or_gphys.assoc_coord_gphys(nm)
433
434
  VArrayNetCDF.write(file, acgp.data, nil, acgp.axnames)
@@ -919,7 +919,7 @@ EOS
919
919
 
920
920
  imax, jmax = isize.to_i, jsize.to_i
921
921
  dx, dy = dx.to_f, dy.to_f
922
- bi, bj = (iref.to_i)-1, (jref.to_i)-1
922
+ bi, bj = iref.to_f-1.0, jref.to_f-1.0
923
923
  by, bx = latref.to_f, lonref.to_f
924
924
  sy,sx = struelat.to_f, slon.to_f
925
925
  sy2, = ntruelat.to_f
@@ -932,8 +932,11 @@ EOS
932
932
  unless sx.abs < 180
933
933
  raise "parameter for standard is invalid"
934
934
  end
935
- unless 0 < sy.abs && sy.abs < sy2.abs && sy2.abs < 90 && sy*sy2>0
936
- raise "parameter for standard is invalid"
935
+ if sy.abs > 90
936
+ raise "Invalid PDEF (in control file): |struelat|>90"
937
+ end
938
+ if sy2.abs > 90
939
+ raise "Invalid PDEF (in control file): |ntruelat|>90"
937
940
  end
938
941
  bx = bx*PI/180
939
942
  by = by*PI/180
@@ -1,6 +1,6 @@
1
1
  module NumRu
2
2
  class GPhys
3
3
  # Add subsubminor version while under development; remove it and advance version to release
4
- VERSION = "1.5.2"
4
+ VERSION = "1.5.3"
5
5
  end
6
6
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: gphys
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.5.2
4
+ version: 1.5.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Takeshi Horinouchi
@@ -12,7 +12,7 @@ authors:
12
12
  autorequire:
13
13
  bindir: bin
14
14
  cert_chain: []
15
- date: 2017-04-17 00:00:00.000000000 Z
15
+ date: 2018-01-26 00:00:00.000000000 Z
16
16
  dependencies:
17
17
  - !ruby/object:Gem::Dependency
18
18
  name: narray
@@ -112,20 +112,6 @@ dependencies:
112
112
  - - ">="
113
113
  - !ruby/object:Gem::Version
114
114
  version: '0.3'
115
- - !ruby/object:Gem::Dependency
116
- name: rb-gsl
117
- requirement: !ruby/object:Gem::Requirement
118
- requirements:
119
- - - ">="
120
- - !ruby/object:Gem::Version
121
- version: '1.14'
122
- type: :runtime
123
- prerelease: false
124
- version_requirements: !ruby/object:Gem::Requirement
125
- requirements:
126
- - - ">="
127
- - !ruby/object:Gem::Version
128
- version: '1.14'
129
115
  description: Comprehensive library for self-descriptive gridded physical data (in
130
116
  NetCDF, GrADS, or on memory) with graphics. This version works with Ruby 2.0.
131
117
  email:
@@ -642,7 +628,7 @@ licenses:
642
628
  - BSD-2-Clause
643
629
  metadata: {}
644
630
  post_install_message: Thanks for installing! You can add extra libraries (i.e., ruby-lapack,
645
- rb-grib) to enjoy powerful calculating and handling datasets.
631
+ rb-gsl) to enjoy powerful calculating and handling datasets.
646
632
  rdoc_options: []
647
633
  require_paths:
648
634
  - ext
@@ -659,7 +645,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
659
645
  version: '0'
660
646
  requirements: []
661
647
  rubyforge_project:
662
- rubygems_version: 2.2.2
648
+ rubygems_version: 2.5.2.1
663
649
  signing_key:
664
650
  specification_version: 4
665
651
  summary: A multi-purpose class to handle Gridded Physical quantities