gphys 1.5.5 → 1.5.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (41) hide show
  1. checksums.yaml +5 -5
  2. data/ChangeLog +0 -7595
  3. data/LICENSE.txt +1 -1
  4. data/bin/gpcut +12 -0
  5. data/bin/gpvect +88 -77
  6. data/bin/gpview +200 -103
  7. data/ext/numru/ganalysis/ext_init.c +9 -0
  8. data/ext/numru/ganalysis/extconf.rb +43 -0
  9. data/ext/numru/ganalysis/narray_ext_dfloat.c +84 -0
  10. data/ext/numru/ganalysis/pde_ext.c +130 -0
  11. data/ext/numru/gphys/dim_op.c +336 -44
  12. data/ext/numru/gphys/ext_init.c +6 -0
  13. data/ext/numru/gphys/interpo.c +326 -3
  14. data/gphys.gemspec +1 -0
  15. data/lib/numru/dclext.rb +78 -16
  16. data/lib/numru/ganalysis/beta_plane.rb +6 -4
  17. data/lib/numru/ganalysis/eof.rb +63 -41
  18. data/lib/numru/ganalysis/fitting.rb +109 -30
  19. data/lib/numru/ganalysis/histogram.rb +3 -3
  20. data/lib/numru/ganalysis/log_p.rb +20 -0
  21. data/lib/numru/ganalysis/lomb_scargle.rb +205 -0
  22. data/lib/numru/ganalysis/met_z.rb +132 -3
  23. data/lib/numru/ganalysis/narray_ext.rb +13 -0
  24. data/lib/numru/ganalysis/pde.rb +109 -0
  25. data/lib/numru/ganalysis/planet.rb +136 -1
  26. data/lib/numru/ganalysis/qg.rb +224 -3
  27. data/lib/numru/ggraph.rb +95 -23
  28. data/lib/numru/gphys/axis.rb +4 -2
  29. data/lib/numru/gphys/gphys.rb +6 -5
  30. data/lib/numru/gphys/gphys_dim_op.rb +69 -6
  31. data/lib/numru/gphys/gphys_fft.rb +30 -0
  32. data/lib/numru/gphys/gphys_io_common.rb +2 -0
  33. data/lib/numru/gphys/grads_gridded.rb +77 -29
  34. data/lib/numru/gphys/grib.rb +2 -2
  35. data/lib/numru/gphys/grib_params.rb +3 -3
  36. data/lib/numru/gphys/interpolate.rb +153 -1
  37. data/lib/numru/gphys/varraycomposite.rb +7 -4
  38. data/lib/numru/gphys/version.rb +1 -1
  39. data/lib/numru/gphys.rb +1 -0
  40. data/testdata/pres.jan.nc +0 -0
  41. metadata +13 -4
@@ -0,0 +1,9 @@
1
+ void init_ganalysis_pde_ext();
2
+ void init_narray_ext_dfloat();
3
+
4
+ void
5
+ Init_ganalysis_ext()
6
+ {
7
+ init_ganalysis_pde_ext();
8
+ init_narray_ext_dfloat();
9
+ }
@@ -0,0 +1,43 @@
1
+ require 'mkmf'
2
+ gem_path = nil
3
+
4
+ if Gem.respond_to?(:find_files) and Gem.find_files("narray.h").length > 0
5
+ require "rbconfig"
6
+ so = RbConfig::CONFIG["DLEXT"]
7
+ narray_include = File.expand_path(File.dirname(Gem.find_files("narray.h")[0]))
8
+ narray_lib = File.expand_path(File.dirname(Gem.find_files("narray." + so)[0]))
9
+ else
10
+ gem_home=(`gem environment GEM_HOME`).chomp
11
+ narray_dir = Dir.glob("#{gem_home}/gems/narray-*/ext/narray").sort[-1]
12
+ if narray_dir
13
+ narray_include = narray_lib = narray_dir
14
+ else
15
+ narray_include = narray_lib = [ $sitearchdir, $vendorarchdir]
16
+ end
17
+ end
18
+ dir_config('narray', narray_include, narray_lib)
19
+
20
+ require "narray"
21
+ if NArray.const_defined?(:SUPPORT_BIGMEM) && NArray::SUPPORT_BIGMEM
22
+
23
+ case RbConfig::CONFIG["CC"]
24
+ when "gcc"
25
+ omp_opt = "-fopenmp"
26
+ else
27
+ omp_opt = nil
28
+ end
29
+ omp_opt = arg_config("--openmp", omp_opt)
30
+
31
+ omp_opt = nil if omp_opt.to_s.empty?
32
+
33
+ if omp_opt
34
+ $CFLAGS << " " << omp_opt
35
+ $DLDFLAGS << " " << omp_opt
36
+ warn "OpenMP support: ON"
37
+ else
38
+ warn "OpenMP support: OFF"
39
+ warn "if you want to enable openmp, set --openmp=compile_option"
40
+ end
41
+ end
42
+
43
+ create_makefile('numru/ganalysis_ext')
@@ -0,0 +1,84 @@
1
+ /* narray_ext_dfloat.c : Extention library of NArray (DFLOAT only)
2
+ */
3
+ #include<stdio.h>
4
+ #include<string.h>
5
+ #include "ruby.h"
6
+ #include "narray.h"
7
+ #ifndef NARRAY_BIGMEM
8
+ typedef int na_shape_t;
9
+ #endif
10
+
11
+ typedef double c_num_t;
12
+ #define NATYPE NA_DFLOAT
13
+
14
+ static VALUE
15
+ cum_sum_dfloat(obj, self, dim)
16
+ VALUE obj;
17
+ VALUE self;
18
+ VALUE dim;
19
+ {
20
+ VALUE res;
21
+ int d, dj, rank;
22
+ struct NARRAY *na;
23
+ na_shape_t i, j, k, ni, nj, nk, nij;
24
+ na_shape_t *sh;
25
+ c_num_t *p, *c;
26
+
27
+ /* check & read arguments */
28
+ dj = NUM2INT(dim);
29
+
30
+ if (NA_TYPE(self) != NATYPE) rb_raise(rb_eArgError,"Unexpected type");
31
+ rank = NA_RANK(self);
32
+ if (dj<-rank || dj>=rank) rb_raise(rb_eArgError,
33
+ "dim (%d) out of range (%d to %d)", dj, -rank, rank-1);
34
+ if (dj<0) dj += rank;
35
+
36
+ /* interpret shape as 3D */
37
+ GetNArray(self, na);
38
+ sh = na->shape;
39
+ p = (c_num_t *) NA_PTR(na, 0);
40
+ ni = 1;
41
+ for(d=0; d<dj; d++) ni *= sh[d];
42
+ nj = sh[dj];
43
+ nij = ni*nj;
44
+ nk = 1;
45
+ for(d=dj+1; d<rank; d++) nk *= sh[d];
46
+
47
+ /* initialize the output object */
48
+ res = na_make_object(NATYPE, rank, sh, cNArray);
49
+ GetNArray(res, na);
50
+ c = (c_num_t *) NA_PTR(na, 0);
51
+
52
+ /* operation */
53
+ for(k=0; k<nk; k++){
54
+ for(i=0; i<ni; i++){
55
+ c[i+nij*k] = p[i+nij*k]; /* copy the first element */
56
+ }
57
+ }
58
+ for(k=0; k<nk; k++){
59
+ for(j=1; j<nj; j++){
60
+ for(i=0; i<ni; i++){
61
+ c[i+ni*j+nij*k] = p[i+ni*j+nij*k] + c[i+ni*(j-1)+nij*k];
62
+ }
63
+ }
64
+ }
65
+
66
+ return(res);
67
+ }
68
+
69
+
70
+ // VALUE cNArray;
71
+
72
+ void
73
+ init_narray_ext_dfloat()
74
+ {
75
+ /* 以下はどうもうまく行かない。(NArrayが拡張ライブラリだからか)
76
+ rb_require("narray");
77
+ // cNArray = rb_define_class("NArray", rb_cObject);
78
+ rb_define_method(cNArray, "cum_sum_dfloat", cum_sum_dfloat, 1);
79
+ */
80
+ static VALUE mNumRu, mNArrayExt;
81
+ mNumRu = rb_define_module("NumRu");
82
+ mNArrayExt = rb_define_module_under(mNumRu, "NArrayExt");
83
+ rb_define_module_function(mNArrayExt, "cum_sum_dfloat", cum_sum_dfloat, 2);
84
+ }
@@ -0,0 +1,130 @@
1
+ /* c_pde.c : Extention library for partial differential equation solvers
2
+ * All in NArray
3
+ */
4
+
5
+ #include<stdio.h>
6
+ #include<string.h>
7
+ #include<math.h>
8
+ #include "ruby.h"
9
+ #include "narray.h"
10
+
11
+ /* for compatibility for NArray and NArray with big memory patch */
12
+ #ifndef NARRAY_BIGMEM
13
+ typedef int na_shape_t;
14
+ #endif
15
+
16
+ #define ID(i,j) ((i)+nx*(j))
17
+
18
+ /* Eq: A z_xx + 2 B z_xy + C z_yy + D z_x + E z_y = F
19
+ * ^^^
20
+ *
21
+ * Assumption: dx and dy are constants (uniform).
22
+ * Boundary values are not changed. --> change afterwords if not Dirichlet.
23
+ *
24
+ * Basic discretization: by central differences:
25
+ * A/dx^2 (z[i-1,j]-2z[i,j]+z[i+1,j])
26
+ * + B/(2dxdy) ((z[i+1,j+1]-z[i-1,j+1]-z[i+1,j-1]+z[i-1,j-1])
27
+ * + C/dy^2 (z[i,j-1]-2z[i,j]+z[i,j+1])
28
+ * + D/(2dx) (z[i+1,j]-z[i-1,j]) + E/(2dy) (z[i,j+1]-z[i,j-1]) - F = 0
29
+ *
30
+ * * Z [2D Float(=DFLOAT) NArray] (inout) -- to be overwritten
31
+ * * A, B, ... [2D Float(=DFLOAT) NArray] coeffitients
32
+ * * OME [Float] constant, which should 1<= OME < 2 (Gauss-Seidel if OME=1)
33
+ * * Return value: res = |H dz| (L2 norm),
34
+ * where H = 2(diag(A)/dx^2+diag(C)/dy^2).
35
+ * Convergence can be judged by res/|F| < eps
36
+ */
37
+ static VALUE
38
+ SOR_2D_2ndorder_1step(obj, Z, A, B, C, D, E, F, DX, DY, OME, Ignore_non_eliptic)
39
+ VALUE obj;
40
+ VALUE Z;
41
+ VALUE A, B, C, D, E, F;
42
+ VALUE DX, DY, OME;
43
+ VALUE Ignore_non_eliptic;
44
+ {
45
+ double *z, *ap, *bp, *cp, *dp, *ep, *fp;
46
+ double a, b, c, d, e, f, g, h, sum=0;
47
+ double dx, dy, ome;
48
+ struct NARRAY *na;
49
+ na_shape_t nx, ny, i, j;
50
+ VALUE res;
51
+
52
+ /* check & read arguments */
53
+
54
+ if (NA_TYPE(Z) != NA_DFLOAT) rb_raise(rb_eArgError, "Z nust be DFLOAT");
55
+ if (NA_TYPE(A) != NA_DFLOAT) rb_raise(rb_eArgError, "A nust be DFLOAT");
56
+ if (NA_TYPE(B) != NA_DFLOAT) rb_raise(rb_eArgError, "B nust be DFLOAT");
57
+ if (NA_TYPE(C) != NA_DFLOAT) rb_raise(rb_eArgError, "C nust be DFLOAT");
58
+ if (NA_TYPE(D) != NA_DFLOAT) rb_raise(rb_eArgError, "D nust be DFLOAT");
59
+ if (NA_TYPE(E) != NA_DFLOAT) rb_raise(rb_eArgError, "E nust be DFLOAT");
60
+ if (NA_TYPE(F) != NA_DFLOAT) rb_raise(rb_eArgError, "F nust be DFLOAT");
61
+
62
+ if (NA_RANK(Z) != 2) rb_raise(rb_eArgError, "Z must be 2-dimensional");
63
+ nx = NA_SHAPE0(Z);
64
+ ny = NA_SHAPE1(Z);
65
+ if (NA_SHAPE0(A)!=nx || NA_SHAPE1(A)!=ny) rb_raise(rb_eArgError,
66
+ "A: invalid shape");
67
+ if (NA_SHAPE0(B)!=nx || NA_SHAPE1(B)!=ny) rb_raise(rb_eArgError,
68
+ "B: invalid shape");
69
+ if (NA_SHAPE0(C)!=nx || NA_SHAPE1(C)!=ny) rb_raise(rb_eArgError,
70
+ "C: invalid shape");
71
+ if (NA_SHAPE0(D)!=nx || NA_SHAPE1(D)!=ny) rb_raise(rb_eArgError,
72
+ "D: invalid shape");
73
+ if (NA_SHAPE0(E)!=nx || NA_SHAPE1(E)!=ny) rb_raise(rb_eArgError,
74
+ "E: invalid shape");
75
+ if (NA_SHAPE0(F)!=nx || NA_SHAPE1(F)!=ny) rb_raise(rb_eArgError,
76
+ "F: invalid shape");
77
+
78
+ GetNArray(Z, na); z = (double *)NA_PTR(na, 0);
79
+ GetNArray(A, na); ap = (double *)NA_PTR(na, 0);
80
+ GetNArray(B, na); bp = (double *)NA_PTR(na, 0);
81
+ GetNArray(C, na); cp = (double *)NA_PTR(na, 0);
82
+ GetNArray(D, na); dp = (double *)NA_PTR(na, 0);
83
+ GetNArray(E, na); ep = (double *)NA_PTR(na, 0);
84
+ GetNArray(F, na); fp = (double *)NA_PTR(na, 0);
85
+
86
+ dx = NUM2DBL(DX);
87
+ dy = NUM2DBL(DY);
88
+ if (dx==0.0) rb_raise(rb_eArgError, "dx == 0");
89
+ if (dy==0.0) rb_raise(rb_eArgError, "dy == 0");
90
+ ome = NUM2DBL(OME);
91
+
92
+ /* solve (1 step) */
93
+ for (j=1; j<ny-1; j++){
94
+ for (i=1; i<nx-1; i++){
95
+ a = ap[ID(i,j)] / (dx*dx);
96
+ b = bp[ID(i,j)] / (dx*dy);
97
+ c = cp[ID(i,j)] / (dy*dy);
98
+ if (Ignore_non_eliptic == Qfalse || Ignore_non_eliptic == Qnil ) {
99
+ if((a*c-b*b)<=0.0)
100
+ rb_raise(rb_eStandardError,"non-eliptic@[%d,%d]",i,j);
101
+ }
102
+ d = dp[ID(i,j)] / dx;
103
+ e = ep[ID(i,j)] / dy;
104
+ f = fp[ID(i,j)];
105
+ h = 2*(a+c);
106
+ g = ome * ( a*( z[ID(i-1,j)]+z[ID(i+1,j)] )
107
+ + b/2*( z[ID(i+1,j+1)] - z[ID(i-1,j+1)] - z[ID(i+1,j-1)]
108
+ +z[ID(i-1,j-1)] )
109
+ + c*( z[ID(i,j-1)]+z[ID(i,j+1)] )
110
+ + d/2*( z[ID(i+1,j)]-z[ID(i-1,j)] )
111
+ + e/2*( z[ID(i,j+1)]-z[ID(i,j-1)] )
112
+ - f - h*z[ID(i,j)]);
113
+ sum += g*g;
114
+ z[ID(i,j)] += g/h;
115
+ }
116
+ }
117
+ res = DBL2NUM( sqrt(sum) );
118
+ return(res);
119
+ }
120
+
121
+ void
122
+ init_ganalysis_pde_ext()
123
+ {
124
+ static VALUE mNumRu, mGA, mPDE;
125
+ mNumRu = rb_define_module("NumRu");
126
+ mGA = rb_define_module_under(mNumRu, "GAnalysis");
127
+ mPDE = rb_define_module_under(mGA, "PDE");
128
+ rb_define_module_function(mPDE, "SOR_2D_2ndorder_1step",
129
+ SOR_2D_2ndorder_1step, 11);
130
+ }