gphys 1.5.5 → 1.5.6
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 +4 -4
- data/ChangeLog +77 -0
- data/LICENSE.txt +1 -1
- 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/gphys.gemspec +1 -0
- data/lib/numru/ganalysis/eof.rb +3 -1
- data/lib/numru/ganalysis/fitting.rb +24 -8
- data/lib/numru/ganalysis/narray_ext.rb +13 -0
- data/lib/numru/ganalysis/pde.rb +90 -0
- data/lib/numru/ggraph.rb +6 -5
- data/lib/numru/gphys.rb +1 -0
- data/lib/numru/gphys/gphys.rb +6 -5
- data/lib/numru/gphys/version.rb +1 -1
- metadata +9 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 96baf70ba208aa464245d2d24de0c08a6f3af3d4
|
4
|
+
data.tar.gz: 10fd31971847395f74e6bcc34eaaf850a54b2dcf
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 9547009e1b3be0d64a542154c289f535886d7a5323f6055e5d762f57bcf7682be651938153ebacf6497751c746ce62e600abb8f26ed11e147db752cef64fc03b
|
7
|
+
data.tar.gz: 48172e1d51e732f92ab7e29b64fcd2ed5f7e73cde1f379261713fbff2adea8f4de2af2e92562917023b8a9d9cf5c5c46dba62ec57a655cb47db7c34bca431ff5
|
data/ChangeLog
CHANGED
@@ -1,3 +1,80 @@
|
|
1
|
+
2019-03-19 Takeshi Horinouchi
|
2
|
+
To release version 1.5.6 (git tag v1.5.6)
|
3
|
+
|
4
|
+
M lib/numru/gphys/version.rb
|
5
|
+
|
6
|
+
2019-03-19 Takeshi Horinouchi
|
7
|
+
Update the years (to -2019)
|
8
|
+
|
9
|
+
M LICENSE.txt
|
10
|
+
|
11
|
+
2019-03-19 Takeshi Horinouchi
|
12
|
+
to require 'numru/gphys/derivative' from the begining
|
13
|
+
|
14
|
+
M lib/numru/gphys.rb
|
15
|
+
|
16
|
+
2019-02-28 Takeshi Horinouchi
|
17
|
+
Fitting::least_square_fit: bug fix of best fit when with_offset==false
|
18
|
+
|
19
|
+
M lib/numru/ganalysis/fitting.rb
|
20
|
+
|
21
|
+
2019-01-13 Takeshi Horinouchi
|
22
|
+
GAnalysis::PDE::SOR_2D_2ndorder : added an option "ignore_non_eliptic". Changed optional arguments to keyword arguments.
|
23
|
+
|
24
|
+
M ext/numru/ganalysis/pde_ext.c
|
25
|
+
M lib/numru/ganalysis/pde.rb
|
26
|
+
|
27
|
+
2018-12-09 Takeshi Horinouchi
|
28
|
+
bug fix
|
29
|
+
|
30
|
+
M lib/numru/ganalysis/narray_ext.rb
|
31
|
+
|
32
|
+
2018-12-09 Takeshi Horinouchi
|
33
|
+
Update and bug fix
|
34
|
+
|
35
|
+
M ext/numru/ganalysis/pde_ext.c
|
36
|
+
M lib/numru/ganalysis/pde.rb
|
37
|
+
|
38
|
+
2018-12-06 Takeshi Horinouchi
|
39
|
+
Created NArray#cum_sum which accepts multi-D NArray unlike NArray#cumsum
|
40
|
+
|
41
|
+
M ext/numru/ganalysis/ext_init.c
|
42
|
+
A ext/numru/ganalysis/narray_ext_dfloat.c
|
43
|
+
A lib/numru/ganalysis/narray_ext.rb
|
44
|
+
|
45
|
+
2018-12-04 Takeshi Horinouchi
|
46
|
+
Added ext/numru/ganalysis/extconf.rb
|
47
|
+
|
48
|
+
M gphys.gemspec
|
49
|
+
|
50
|
+
2018-12-04 Takeshi Horinouchi
|
51
|
+
Created GAnalysis::PDE and its method SOR_2D_2ndorder (to solve 2D 2nd order PDE by SOR)
|
52
|
+
|
53
|
+
A ext/numru/ganalysis/ext_init.c
|
54
|
+
A ext/numru/ganalysis/extconf.rb
|
55
|
+
A ext/numru/ganalysis/pde_ext.c
|
56
|
+
A lib/numru/ganalysis/pde.rb
|
57
|
+
|
58
|
+
2018-11-29 Takeshi Horinouchi
|
59
|
+
least_square_fit: added an option with_offset
|
60
|
+
|
61
|
+
M lib/numru/ganalysis/fitting.rb
|
62
|
+
|
63
|
+
2018-11-29 Takeshi Horinouchi
|
64
|
+
tone: Improved treatment of fullcolor
|
65
|
+
|
66
|
+
M lib/numru/ggraph.rb
|
67
|
+
|
68
|
+
2018-11-29 Takeshi Horinouchi
|
69
|
+
Added no_sort option to join_md.
|
70
|
+
|
71
|
+
M lib/numru/gphys/gphys.rb
|
72
|
+
|
73
|
+
2018-04-09 Takeshi Horinouchi
|
74
|
+
completed the change in b86d44ca18fca98bb
|
75
|
+
|
76
|
+
M lib/numru/ganalysis/eof.rb
|
77
|
+
|
1
78
|
2018-03-20 Takeshi Horinouchi
|
2
79
|
To release version 1.5.5 (git tag v1.5.5)
|
3
80
|
|
data/LICENSE.txt
CHANGED
@@ -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-
|
4
|
+
Copyright 2003-2019 (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
|
@@ -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
|
+
}
|
data/gphys.gemspec
CHANGED
@@ -25,6 +25,7 @@ Gem::Specification.new do |spec|
|
|
25
25
|
spec.require_paths = ["ext","lib"]
|
26
26
|
spec.test_files = spec.files.grep(%r{^(test|test_old|sample|testdata)/})
|
27
27
|
spec.extensions << "ext/numru/gphys/extconf.rb"
|
28
|
+
spec.extensions << "ext/numru/ganalysis/extconf.rb"
|
28
29
|
|
29
30
|
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
31
|
|
data/lib/numru/ganalysis/eof.rb
CHANGED
@@ -92,7 +92,7 @@ module NumRu
|
|
92
92
|
end
|
93
93
|
w /= w.mean
|
94
94
|
w.reshape!(n)
|
95
|
-
|
95
|
+
elsif new_grid.rank >= 2
|
96
96
|
nc0 = new_grid.coord(0)
|
97
97
|
nc1 = new_grid.coord(1)
|
98
98
|
if !(opts[:disable_weight]||opts["disable_weight"]) &&
|
@@ -107,6 +107,8 @@ module NumRu
|
|
107
107
|
else
|
108
108
|
w = nil
|
109
109
|
end
|
110
|
+
else
|
111
|
+
w = nil
|
110
112
|
end
|
111
113
|
|
112
114
|
ary = NArrayMiss.new(gphys.typecode, n_lost, n)
|
@@ -215,14 +215,16 @@ module NumRu
|
|
215
215
|
# number of functions (also unsolvable).
|
216
216
|
#
|
217
217
|
def least_square_fit(data, grid_locs, functions, ensemble_dims=nil,
|
218
|
-
indep_dims=nil)
|
218
|
+
indep_dims=nil, with_offset=true)
|
219
219
|
|
220
220
|
#< argument check >
|
221
221
|
|
222
222
|
grid_locs.each_with_index{|x,i| self.ensure_1D_NArray(x, i)}
|
223
223
|
functions.each{|f| raise("Found non-Proc arg") if !f.is_a?(Proc)}
|
224
224
|
|
225
|
-
|
225
|
+
if with_offset
|
226
|
+
functions = functions + [@@unity] # constanf offset
|
227
|
+
end
|
226
228
|
|
227
229
|
ng = grid_locs.length
|
228
230
|
rank = data.rank
|
@@ -336,9 +338,16 @@ module NumRu
|
|
336
338
|
c = na
|
337
339
|
|
338
340
|
# best fit
|
339
|
-
|
340
|
-
|
341
|
-
|
341
|
+
if with_offset
|
342
|
+
bf = c[-1] # the constant offset
|
343
|
+
for i in 0...ms-1
|
344
|
+
bf += c[i]*fv[i]
|
345
|
+
end
|
346
|
+
else
|
347
|
+
bf = 0.0
|
348
|
+
for i in 0...ms
|
349
|
+
bf += c[i]*fv[i]
|
350
|
+
end
|
342
351
|
end
|
343
352
|
|
344
353
|
else # fitting multiple times
|
@@ -381,9 +390,16 @@ module NumRu
|
|
381
390
|
end
|
382
391
|
end
|
383
392
|
cs = c.reshape(ms, *idshp_full)
|
384
|
-
|
385
|
-
|
386
|
-
|
393
|
+
if with_offset
|
394
|
+
bf = cs[-1,false]
|
395
|
+
for i in 0...ms-1
|
396
|
+
bf += cs[i,false]*fv[i]
|
397
|
+
end
|
398
|
+
else
|
399
|
+
bf = cs[-1,false] * 0
|
400
|
+
for i in 0...ms
|
401
|
+
bf += cs[i,false]*fv[i]
|
402
|
+
end
|
387
403
|
end
|
388
404
|
|
389
405
|
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
require "narray"
|
2
|
+
require "numru/ganalysis/ganalysis_ext"
|
3
|
+
|
4
|
+
class NArray
|
5
|
+
def cum_sum(dim)
|
6
|
+
case self.typecode
|
7
|
+
when DFLOAT
|
8
|
+
NumRu::NArrayExt.cum_sum_dfloat(self,dim)
|
9
|
+
else
|
10
|
+
raise "Sorry, this narray type #{self.typecode} is not supported."
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
@@ -0,0 +1,90 @@
|
|
1
|
+
require "numru/gphys"
|
2
|
+
require "numru/ganalysis/ganalysis_ext"
|
3
|
+
|
4
|
+
module NumRu
|
5
|
+
module GAnalysis
|
6
|
+
module PDE
|
7
|
+
module_function
|
8
|
+
#
|
9
|
+
# = Solve 2-dim 2nd order PDE by the succesive over-relaxation method
|
10
|
+
#
|
11
|
+
# ARGUMENTS.
|
12
|
+
# * z [in-out, 2D dfloat NArray] : When in, initial values. When out,
|
13
|
+
# the result. Boundary values are not changed (Dirichlet problem)
|
14
|
+
# (developper's memo: Neuman cond can be supported as an option)
|
15
|
+
# * a, b, c, d, e, f [in, 2D dfloat NArray with the same shape as z] :
|
16
|
+
# Specifies the PDF as
|
17
|
+
# a z_xx + 2*b z_xy + c z_yy + d z_x + e z_y = f
|
18
|
+
# ^^^
|
19
|
+
# Please note that 2*b is the coefficient of z_xy.
|
20
|
+
# x is the first (0th) NArray dimension.
|
21
|
+
# * dx, dy [Float] : grid spacings
|
22
|
+
# * ome [Float] : the over-relaxation parameter 1<=ome<2.
|
23
|
+
# For a large-scale poisson equation, should be ~ 2 (e.g. 1.9).
|
24
|
+
# * eps [optional, Float] : conversion threshold (e.g. 1e-5).
|
25
|
+
# Compared with |increment|/|F| (| | is the L2 norm).
|
26
|
+
# When |f| == 0 (homogenous), compared simply with |increment|.
|
27
|
+
# * maxi [optional, Integer]: max iteration times(default, 5*[nx,ny].max).
|
28
|
+
# Since SOR (or the Gauss-Seidel method) acts like a stepwise diffusion,
|
29
|
+
# it must be greater than the along-x and along-y grid sizes.
|
30
|
+
# * ignore_non_eliptic : if true (non-nil,non-false), do not raise
|
31
|
+
# error when the coeeficients are not entirely eliptic.
|
32
|
+
#
|
33
|
+
# RETURN VALUE
|
34
|
+
# * |last increment|/|F| of |last increment| (to be compared with eps)
|
35
|
+
#
|
36
|
+
def SOR_2D_2ndorder(z, a, b, c, d, e, f, dx, dy, ome, eps: nil, maxi: nil,
|
37
|
+
ignore_non_eliptic: false)
|
38
|
+
lf = Math.sqrt( (f**2).sum ) # L2 norm of f
|
39
|
+
lf = 1.0 if lf==0 # when |f|==0 (homogeneous), no-division by |f|.
|
40
|
+
res = nil
|
41
|
+
if !maxi
|
42
|
+
maxi = [ z.shape[0], z.shape[1] ].max * 5 # default max itr times
|
43
|
+
end
|
44
|
+
convd = false
|
45
|
+
for i in 0...maxi
|
46
|
+
res = SOR_2D_2ndorder_1step(z, a, b, c, d, e, f, dx, dy, ome,
|
47
|
+
ignore_non_eliptic)
|
48
|
+
#p res/lf, z
|
49
|
+
if (eps && res/lf < eps)
|
50
|
+
convd = true
|
51
|
+
break
|
52
|
+
end
|
53
|
+
end
|
54
|
+
if (eps && !convd)
|
55
|
+
raise("Max iteration times (#{maxi}) reached before convergence" +
|
56
|
+
" (#{res/lf} > #{eps}). Change ome (#{ome}) or specify maxi.")
|
57
|
+
end
|
58
|
+
#p i,res/lf #, z
|
59
|
+
res/lf
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
################################################
|
66
|
+
##### test part ######
|
67
|
+
if $0 == __FILE__
|
68
|
+
require "numru/ggraph"
|
69
|
+
include NumRu
|
70
|
+
|
71
|
+
#nx = ny = 9
|
72
|
+
nx = ny = 91
|
73
|
+
z = NArray.float(nx,ny)
|
74
|
+
a = c = NArray.float(nx,ny).fill!(1.0)
|
75
|
+
b = d = e = NArray.float(nx,ny)
|
76
|
+
f = NArray.float(nx,ny)
|
77
|
+
f[nx/2,ny/2] = 1.0
|
78
|
+
dx = dy = 1.0
|
79
|
+
#ome = 1.9
|
80
|
+
#GAnalysis::PDE.SOR_2D_2ndorder(z, a, b, c, d, e, f, dx, dy, ome)
|
81
|
+
=begin
|
82
|
+
(1.0..1.91).step(0.1){|ome|
|
83
|
+
puts "ome = #{ome}"
|
84
|
+
GAnalysis::PDE.SOR_2D_2ndorder(z, a, b, c, d, e, f, dx, dy, ome)
|
85
|
+
}
|
86
|
+
=end
|
87
|
+
eps = 1e-6
|
88
|
+
ome = 1.95
|
89
|
+
GAnalysis::PDE.SOR_2D_2ndorder(z, a, b, c, d, e, f, dx, dy, ome, eps: eps)
|
90
|
+
end
|
data/lib/numru/ggraph.rb
CHANGED
@@ -2839,11 +2839,7 @@ module NumRu
|
|
2839
2839
|
|
2840
2840
|
@@used_fullcolor_tone = false
|
2841
2841
|
val = gp.data.val
|
2842
|
-
if
|
2843
|
-
( opts['tonf'] || opts['auto'] && !opts['tonb'] && !opts['tonc'] &&
|
2844
|
-
( val.length >= TONE_TONF_THRES_SIZE || val.shape.min >= TONE_TONF_THRES_LEN ) ) )
|
2845
|
-
DCL.uetonf(val)
|
2846
|
-
elsif opts['fullcolor']
|
2842
|
+
if opts['fullcolor']
|
2847
2843
|
@@used_fullcolor_tone = true
|
2848
2844
|
sopt = opts.dup.delete_if{|k,v| !DCLExt.shade_1_option_keys.include?(k)}
|
2849
2845
|
DCLExt.ui_shade_1(val, sopt)
|
@@ -2851,6 +2847,11 @@ module NumRu
|
|
2851
2847
|
DCL.uetonb(val)
|
2852
2848
|
elsif opts['tonc'] && opts['ltone']
|
2853
2849
|
DCL.uetonc(val)
|
2850
|
+
elsif ( opts['ltone'] &&
|
2851
|
+
( opts['tonf'] ||
|
2852
|
+
opts['auto'] && ( val.length >= TONE_TONF_THRES_SIZE ||
|
2853
|
+
val.shape.min >= TONE_TONF_THRES_LEN ) ) )
|
2854
|
+
DCL.uetonf(val)
|
2854
2855
|
else
|
2855
2856
|
DCL.uetone(val)
|
2856
2857
|
end
|
data/lib/numru/gphys.rb
CHANGED
data/lib/numru/gphys/gphys.rb
CHANGED
@@ -1210,7 +1210,8 @@ module NumRu
|
|
1210
1210
|
grid = Grid.new(*axes)
|
1211
1211
|
if gp0.assoc_coords
|
1212
1212
|
assoc_coords = gp0.assoccoordnames.collect do |aname|
|
1213
|
-
GPhys.join( gpnary.collect{|gp| gp.assoc_coord_gphys(aname)}, true
|
1213
|
+
GPhys.join( gpnary.collect{|gp| gp.assoc_coord_gphys(aname)}, true,
|
1214
|
+
true )
|
1214
1215
|
end
|
1215
1216
|
grid.set_assoc_coords(assoc_coords)
|
1216
1217
|
end
|
@@ -1222,7 +1223,7 @@ module NumRu
|
|
1222
1223
|
GPhys.new(grid, data)
|
1223
1224
|
end
|
1224
1225
|
|
1225
|
-
def GPhys.join_md(gpnary)
|
1226
|
+
def GPhys.join_md(gpnary, no_sort=false)
|
1226
1227
|
#< Check >
|
1227
1228
|
|
1228
1229
|
if !gpnary.is_a?(NArray)
|
@@ -1283,7 +1284,7 @@ module NumRu
|
|
1283
1284
|
end
|
1284
1285
|
|
1285
1286
|
#< Sort along dimensions to join >
|
1286
|
-
gpnary = __sort_gpnary(gpnary)
|
1287
|
+
gpnary = __sort_gpnary(gpnary) unless no_sort
|
1287
1288
|
|
1288
1289
|
#< Join! >
|
1289
1290
|
self.join_md_nocheck(gpnary)
|
@@ -1294,7 +1295,7 @@ module NumRu
|
|
1294
1295
|
# ARGUMENT
|
1295
1296
|
# * gpnarray [Array (or 1D NArray) of GPhys]
|
1296
1297
|
#
|
1297
|
-
def GPhys.join(gpary, ignore_overlap=false)
|
1298
|
+
def GPhys.join(gpary, ignore_overlap=false, no_sort=false)
|
1298
1299
|
|
1299
1300
|
#< initialization with the first GPhys object >
|
1300
1301
|
|
@@ -1332,7 +1333,7 @@ module NumRu
|
|
1332
1333
|
gpnary = gpstore.to_na
|
1333
1334
|
|
1334
1335
|
#< Sort along dimensions to join >
|
1335
|
-
gpnary = __sort_gpnary(gpnary)
|
1336
|
+
gpnary = __sort_gpnary(gpnary) unless no_sort
|
1336
1337
|
|
1337
1338
|
#< Join! >
|
1338
1339
|
self.join_md_nocheck(gpnary)
|
data/lib/numru/gphys/version.rb
CHANGED
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.
|
4
|
+
version: 1.5.6
|
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:
|
15
|
+
date: 2019-03-19 00:00:00.000000000 Z
|
16
16
|
dependencies:
|
17
17
|
- !ruby/object:Gem::Dependency
|
18
18
|
name: narray
|
@@ -132,6 +132,7 @@ executables:
|
|
132
132
|
- grads2nc_with_gphys
|
133
133
|
extensions:
|
134
134
|
- ext/numru/gphys/extconf.rb
|
135
|
+
- ext/numru/ganalysis/extconf.rb
|
135
136
|
extra_rdoc_files: []
|
136
137
|
files:
|
137
138
|
- ".ChangeLog.until201303"
|
@@ -539,6 +540,10 @@ files:
|
|
539
540
|
- doc/update_rdoc
|
540
541
|
- doc/varray.html
|
541
542
|
- doc/varraycomposite.html
|
543
|
+
- ext/numru/ganalysis/ext_init.c
|
544
|
+
- ext/numru/ganalysis/extconf.rb
|
545
|
+
- ext/numru/ganalysis/narray_ext_dfloat.c
|
546
|
+
- ext/numru/ganalysis/pde_ext.c
|
542
547
|
- ext/numru/gphys/dim_op.c
|
543
548
|
- ext/numru/gphys/ext_coord.c
|
544
549
|
- ext/numru/gphys/ext_init.c
|
@@ -559,6 +564,8 @@ files:
|
|
559
564
|
- lib/numru/ganalysis/log_p.rb
|
560
565
|
- lib/numru/ganalysis/met.rb
|
561
566
|
- lib/numru/ganalysis/met_z.rb
|
567
|
+
- lib/numru/ganalysis/narray_ext.rb
|
568
|
+
- lib/numru/ganalysis/pde.rb
|
562
569
|
- lib/numru/ganalysis/planet.rb
|
563
570
|
- lib/numru/ganalysis/qg.rb
|
564
571
|
- lib/numru/ganalysis/sigma_coord.rb
|