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.
- checksums.yaml +5 -5
- data/ChangeLog +0 -7595
- data/LICENSE.txt +1 -1
- data/bin/gpcut +12 -0
- data/bin/gpvect +88 -77
- data/bin/gpview +200 -103
- data/ext/numru/ganalysis/ext_init.c +9 -0
- data/ext/numru/ganalysis/extconf.rb +43 -0
- data/ext/numru/ganalysis/narray_ext_dfloat.c +84 -0
- data/ext/numru/ganalysis/pde_ext.c +130 -0
- data/ext/numru/gphys/dim_op.c +336 -44
- data/ext/numru/gphys/ext_init.c +6 -0
- data/ext/numru/gphys/interpo.c +326 -3
- data/gphys.gemspec +1 -0
- data/lib/numru/dclext.rb +78 -16
- data/lib/numru/ganalysis/beta_plane.rb +6 -4
- data/lib/numru/ganalysis/eof.rb +63 -41
- data/lib/numru/ganalysis/fitting.rb +109 -30
- data/lib/numru/ganalysis/histogram.rb +3 -3
- data/lib/numru/ganalysis/log_p.rb +20 -0
- data/lib/numru/ganalysis/lomb_scargle.rb +205 -0
- data/lib/numru/ganalysis/met_z.rb +132 -3
- data/lib/numru/ganalysis/narray_ext.rb +13 -0
- data/lib/numru/ganalysis/pde.rb +109 -0
- data/lib/numru/ganalysis/planet.rb +136 -1
- data/lib/numru/ganalysis/qg.rb +224 -3
- data/lib/numru/ggraph.rb +95 -23
- data/lib/numru/gphys/axis.rb +4 -2
- data/lib/numru/gphys/gphys.rb +6 -5
- data/lib/numru/gphys/gphys_dim_op.rb +69 -6
- data/lib/numru/gphys/gphys_fft.rb +30 -0
- data/lib/numru/gphys/gphys_io_common.rb +2 -0
- data/lib/numru/gphys/grads_gridded.rb +77 -29
- data/lib/numru/gphys/grib.rb +2 -2
- data/lib/numru/gphys/grib_params.rb +3 -3
- data/lib/numru/gphys/interpolate.rb +153 -1
- data/lib/numru/gphys/varraycomposite.rb +7 -4
- data/lib/numru/gphys/version.rb +1 -1
- data/lib/numru/gphys.rb +1 -0
- data/testdata/pres.jan.nc +0 -0
- metadata +13 -4
@@ -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
|
+
}
|