tuscan 0.0.3 → 0.0.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/README.md +1 -1
- data/lib/tuscan/iec60584/type_b.rb +38 -0
- data/lib/tuscan/iec60584/type_c.rb +17 -0
- data/lib/tuscan/iec60584/type_e.rb +42 -0
- data/lib/tuscan/iec60584/type_j.rb +45 -0
- data/lib/tuscan/iec60584/type_k.rb +50 -0
- data/lib/tuscan/iec60584/type_n.rb +46 -0
- data/lib/tuscan/iec60584/type_r.rb +55 -0
- data/lib/tuscan/iec60584/type_s.rb +54 -0
- data/lib/tuscan/iec60584/type_t.rb +41 -0
- data/lib/tuscan/iec60584.rb +24 -369
- data/lib/tuscan/iec60751.rb +18 -13
- data/lib/tuscan/its90.rb +2 -2
- data/lib/tuscan/polynomial.rb +11 -0
- data/lib/tuscan/version.rb +1 -1
- data/lib/tuscan.rb +10 -0
- data/spec/tuscan/iec60584_spec.rb +51 -4
- data/spec/tuscan/iec60751_spec.rb +10 -4
- metadata +12 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3728f465a1aabd2f4b350998fa2eedaf9c9ef59c
|
4
|
+
data.tar.gz: d62b8f0be3a3c579dca8b8ca7d8c2200860d5e28
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 61a0dc1c6b9e651948ce5f8e68cc3c58f00177e57fd04c0cb8cc5da762f0ef6fc6a8c5c94c2e11cfc8ff50c253eba5a441592278da044c0a26d2d77c03e2bb21
|
7
|
+
data.tar.gz: 69299ceb7829cf0bb2ac30fe5285358901e5ecf7135f568c8e11012d5d54aa92d3fcab513872c7b8410a361372c25cdfe7fd830844e327435391578ac9da0b79
|
data/README.md
CHANGED
@@ -55,7 +55,7 @@ Tuscan.res(:iec60751, t: 10, r0: 99.876, a:3.9083e-03, b:-5.7750e-07, c:-4.1830e
|
|
55
55
|
**IEC 60584**
|
56
56
|
```ruby
|
57
57
|
Tuscan.t90r(:iec60584, emf: 1.234, type: :k) # emf im mV
|
58
|
-
Tuscan.
|
58
|
+
Tuscan.emfr(:iec60584, t: 10.123, type: :k) # t90 in ºC
|
59
59
|
```
|
60
60
|
|
61
61
|
|
@@ -0,0 +1,38 @@
|
|
1
|
+
module Tuscan
|
2
|
+
module Iec60584
|
3
|
+
module TypeB
|
4
|
+
T90_RANGE = 60.0..1820.00
|
5
|
+
EMF_RANGE = 0.290..13.821
|
6
|
+
extend self
|
7
|
+
|
8
|
+
def emfr_unbound t90
|
9
|
+
if t90 < 630.615
|
10
|
+
Polynomial.new(
|
11
|
+
0.000000000000e+00, -0.246508183460e-03, 0.590404211710e-05, -0.132579316360e-08,
|
12
|
+
0.156682919010e-11, -0.169445292400e-14, 0.629903470940e-18
|
13
|
+
).solve_for t90
|
14
|
+
else
|
15
|
+
Polynomial.new(
|
16
|
+
-0.389381686210e+01, 0.285717474700e-01, -0.848851047850e-04, 0.157852801640e-06,
|
17
|
+
-0.168353448640e-09, 0.111097940130e-12, -0.445154310330e-16, 0.989756408210e-20,
|
18
|
+
-0.937913302890e-24
|
19
|
+
).solve_for t90
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
def t90r_guess emf
|
24
|
+
if emf < 2.431
|
25
|
+
Polynomial.new(
|
26
|
+
9.8423321e+01, 6.9971500e+02, -8.4765304e+02, 1.0052644e+03, -8.3345952e+02,
|
27
|
+
4.5508542e+02, -1.5523037e+02, 2.9886750e+01, -2.4742860e+00
|
28
|
+
).solve_for emf
|
29
|
+
else
|
30
|
+
Polynomial.new(
|
31
|
+
2.1315071e+02, 2.8510504e+02, -5.2742887e+01, 9.9160804e+00, -1.2965303e+00,
|
32
|
+
1.1195870e-01, -6.0625199e-03, 1.8661696e-04, -2.4878585e-06
|
33
|
+
).solve_for emf
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module Tuscan
|
2
|
+
module Iec60584
|
3
|
+
module TypeC
|
4
|
+
T90_RANGE = 0.0..2320.0
|
5
|
+
EMF_RANGE = nil
|
6
|
+
|
7
|
+
extend self
|
8
|
+
|
9
|
+
def emfr_unbound t90
|
10
|
+
Polynomial.new(
|
11
|
+
-3.109077870000e-04, 1.338547130000e-02, 1.226236040000e-05, -1.050537530000e-08,
|
12
|
+
3.613274640000e-12, -4.990804550000e-16, 6.434651840000e-22
|
13
|
+
).solve_for t90
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
module Tuscan
|
2
|
+
module Iec60584
|
3
|
+
module TypeE
|
4
|
+
T90_RANGE = -270.0..1000.0
|
5
|
+
EMF_RANGE = -8.825..76.373
|
6
|
+
|
7
|
+
extend self
|
8
|
+
|
9
|
+
def emfr_unbound t90
|
10
|
+
if t90 < 0.0
|
11
|
+
Polynomial.new(
|
12
|
+
0.000000000000e+00, 0.586655087080e-01, 0.454109771240e-04, -0.779980486860e-06,
|
13
|
+
-0.258001608430e-07, -0.594525830570e-09, -0.932140586670e-11, -0.102876055340e-12,
|
14
|
+
-0.803701236210e-15, -0.439794973910e-17, -0.164147763550e-19, -0.396736195160e-22,
|
15
|
+
-0.558273287210e-25, -0.346578420130e-28
|
16
|
+
).solve_for t90
|
17
|
+
else
|
18
|
+
Polynomial.new(
|
19
|
+
0.000000000000e+00, 0.586655087100e-01, 0.450322755820e-04, 0.289084072120e-07,
|
20
|
+
-0.330568966520e-09, 0.650244032700e-12, -0.191974955040e-15, -0.125366004970e-17,
|
21
|
+
0.214892175690e-20, -0.143880417820e-23, 0.359608994810e-27
|
22
|
+
).solve_for t90
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
def t90r_guess emf
|
27
|
+
if emf < 0.0
|
28
|
+
Polynomial.new(
|
29
|
+
0.0000000e+00, 1.6977288e+01, -4.3514970e-01, -1.5859697e-01, -9.2502871e-02,
|
30
|
+
-2.6084314e-02, -4.1360199e-03, -3.4034030e-04, -1.1564890e-05, 0.0000000e+00
|
31
|
+
).solve_for emf
|
32
|
+
else
|
33
|
+
Polynomial.new(
|
34
|
+
0.0000000e+00, 1.7057035e+01, -2.3301759e-01, 6.5435585e-03, -7.3562749e-05,
|
35
|
+
-1.7896001e-06, 8.4036165e-08, -1.3735879e-09, 1.0629823e-11, -3.2447087e-14
|
36
|
+
).solve_for emf
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
@@ -0,0 +1,45 @@
|
|
1
|
+
module Tuscan
|
2
|
+
module Iec60584
|
3
|
+
module TypeJ
|
4
|
+
T90_RANGE = -210.0..1200.0
|
5
|
+
EMF_RANGE = -8.096..69.554
|
6
|
+
|
7
|
+
extend self
|
8
|
+
|
9
|
+
def emfr_unbound t90
|
10
|
+
if t90 < 760.0
|
11
|
+
Polynomial.new(
|
12
|
+
0.000000000000e+00, 0.503811878150e-01, 0.304758369300e-04, -0.856810657200e-07,
|
13
|
+
0.132281952950e-09, -0.170529583370e-12, 0.209480906970e-15, -0.125383953360e-18,
|
14
|
+
0.156317256970e-22
|
15
|
+
).solve_for t90
|
16
|
+
else
|
17
|
+
Polynomial.new(
|
18
|
+
0.296456256810e+03, -0.149761277860e+01, 0.317871039240e-02, -0.318476867010e-05,
|
19
|
+
0.157208190040e-08, -0.306913690560e-12
|
20
|
+
).solve_for t90
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
def t90r_guess emf
|
25
|
+
if emf < 0.0
|
26
|
+
Polynomial.new(
|
27
|
+
0.0000000e+00, 1.9528268e+01, -1.2286185e+00, -1.0752178e+00, -5.9086933e-01,
|
28
|
+
-1.7256713e-01, -2.8131513e-02, -2.3963370e-03, -8.3823321e-05
|
29
|
+
).solve_for emf
|
30
|
+
elsif emf < 42.919
|
31
|
+
Polynomial.new(
|
32
|
+
0.000000e+00, 1.978425e+01, -2.001204e-01, 1.036969e-02, -2.549687e-04,
|
33
|
+
3.585153e-06, -5.344285e-08, 5.099890e-10
|
34
|
+
).solve_for emf
|
35
|
+
else
|
36
|
+
Polynomial.new(
|
37
|
+
-3.11358187e+03, 3.00543684e+02, -9.94773230e+00, 1.70276630e-01, -1.43033468e-03,
|
38
|
+
4.73886084e-06
|
39
|
+
).solve_for emf
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
@@ -0,0 +1,50 @@
|
|
1
|
+
module Tuscan
|
2
|
+
module Iec60584
|
3
|
+
module TypeK
|
4
|
+
T90_RANGE = -270.0..1372.0
|
5
|
+
EMF_RANGE = -5.892..54.887
|
6
|
+
|
7
|
+
include Math
|
8
|
+
|
9
|
+
extend self
|
10
|
+
|
11
|
+
def emfr_unbound t90
|
12
|
+
if t90 < 0.0
|
13
|
+
Polynomial.new(
|
14
|
+
0.000000000000e+00, 0.394501280250e-01, 0.236223735980e-04, -0.328589067840e-06,
|
15
|
+
-0.499048287770e-08, -0.675090591730e-10, -0.574103274280e-12, -0.310888728940e-14,
|
16
|
+
-0.104516093650e-16, -0.198892668780e-19, -0.163226974860e-22
|
17
|
+
).solve_for t90
|
18
|
+
else
|
19
|
+
Polynomial.new(
|
20
|
+
-0.176004136860e-01, 0.389212049750e-01, 0.185587700320e-04, -0.994575928740e-07,
|
21
|
+
0.318409457190e-09, -0.560728448890e-12, 0.560750590590e-15, -0.320207200030e-18,
|
22
|
+
0.971511471520e-22, -0.121047212750e-25
|
23
|
+
).solve_for(t90) +
|
24
|
+
0.1185976e+00 * exp(-0.1183432e-03 * (t90 - 0.1269686e+03)**2)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
def t90r_guess emf
|
29
|
+
if emf < 0.0
|
30
|
+
Polynomial.new(
|
31
|
+
0.0000000e+00, 2.5173462e+01, -1.1662878e+00, -1.0833638e+00, -8.9773540e-01,
|
32
|
+
-3.7342377e-01, -8.6632643e-02, -1.0450598e-02, -5.1920577e-04
|
33
|
+
).solve_for emf
|
34
|
+
elsif emf < 20.644
|
35
|
+
Polynomial.new(
|
36
|
+
0.000000e+00, 2.508355e+01, 7.860106e-02, -2.503131e-01, 8.315270e-02,
|
37
|
+
-1.228034e-02, 9.804036e-04, -4.413030e-05,
|
38
|
+
1.057734e-06, -1.052755e-08
|
39
|
+
).solve_for emf
|
40
|
+
else
|
41
|
+
Polynomial.new(
|
42
|
+
-1.318058e+02, 4.830222e+01, -1.646031e+00, 5.464731e-02, -9.650715e-04,
|
43
|
+
8.802193e-06, -3.110810e-08
|
44
|
+
).solve_for emf
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
@@ -0,0 +1,46 @@
|
|
1
|
+
module Tuscan
|
2
|
+
module Iec60584
|
3
|
+
module TypeN
|
4
|
+
T90_RANGE = -270.0..1300.0
|
5
|
+
EMF_RANGE = -3.991..47.513
|
6
|
+
|
7
|
+
extend self
|
8
|
+
|
9
|
+
def emfr_unbound t90
|
10
|
+
if t90 < 0.0
|
11
|
+
Polynomial.new(
|
12
|
+
0.000000000000e+00, 0.261591059620e-01, 0.109574842280e-04, -0.938411115540e-07,
|
13
|
+
-0.464120397590e-10, -0.263033577160e-11, -0.226534380030e-13, -0.760893007910e-16,
|
14
|
+
-0.934196678350e-19
|
15
|
+
).solve_for t90
|
16
|
+
else
|
17
|
+
Polynomial.new(
|
18
|
+
0.000000000000e+00, 0.259293946010e-01, 0.157101418800e-04, 0.438256272370e-07,
|
19
|
+
-0.252611697940e-09, 0.643118193390e-12, -0.100634715190e-14, 0.997453389920e-18,
|
20
|
+
-0.608632456070e-21, 0.208492293390e-24, -0.306821961510e-28
|
21
|
+
).solve_for t90
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
def t90r_guess emf
|
26
|
+
if emf < 0.0
|
27
|
+
Polynomial.new(
|
28
|
+
0.0000000e+00, 3.8436847e+01, 1.1010485e+00, 5.2229312e+00, 7.2060525e+00,
|
29
|
+
5.8488586e+00, 2.7754916e+00, 7.7075166e-01, 1.1582665e-01, 7.3138868e-03
|
30
|
+
).solve_for emf
|
31
|
+
elsif emf < 20.613
|
32
|
+
Polynomial.new(
|
33
|
+
0.00000e+00, 3.86896e+01, -1.08267e+00, 4.70205e-02, -2.12169e-06,
|
34
|
+
-1.17272e-04, 5.39280e-06, -7.98156e-08
|
35
|
+
).solve_for emf
|
36
|
+
else
|
37
|
+
Polynomial.new(
|
38
|
+
1.972485e+01, 3.300943e+01, -3.915159e-01, 9.855391e-03, -1.274371e-04,
|
39
|
+
7.767022e-07
|
40
|
+
).solve_for emf
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
@@ -0,0 +1,55 @@
|
|
1
|
+
module Tuscan
|
2
|
+
module Iec60584
|
3
|
+
module TypeR
|
4
|
+
T90_RANGE = -50.00..1768.10
|
5
|
+
EMF_RANGE = -0.227..21.103
|
6
|
+
|
7
|
+
extend self
|
8
|
+
|
9
|
+
def emfr_unbound t90
|
10
|
+
if t90 < 1064.18
|
11
|
+
Polynomial.new(
|
12
|
+
0.000000000000e+00, 0.528961729765e-02, 0.139166589782e-04, -0.238855693017e-07,
|
13
|
+
0.356916001063e-10, -0.462347666298e-13 , 0.500777441034e-16, -0.373105886191e-19,
|
14
|
+
0.157716482367e-22, -0.281038625251e-26
|
15
|
+
).solve_for t90
|
16
|
+
elsif t90 < 1664.50
|
17
|
+
Polynomial.new(
|
18
|
+
0.295157925316e+01, -0.252061251332e-02, 0.159564501865e-04, -0.764085947576e-08,
|
19
|
+
0.205305291024e-11, -0.293359668173e-15
|
20
|
+
).solve_for t90
|
21
|
+
else
|
22
|
+
Polynomial.new(
|
23
|
+
0.152232118209e+03, -0.268819888545e+00, 0.171280280471e-03, -0.345895706453e-07,
|
24
|
+
-0.934633971046e-14
|
25
|
+
).solve_for t90
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
def t90r_guess emf
|
30
|
+
if emf < 1.923
|
31
|
+
Polynomial.new(
|
32
|
+
0.0000000e+00, 1.8891380e+02, -9.3835290e+01, 1.3068619e+02, -2.2703580e+02,
|
33
|
+
3.5145659e+02, -3.8953900e+02, 2.8239471e+02, -1.2607281e+02, 3.1353611e+01,
|
34
|
+
-3.3187769e+00
|
35
|
+
).solve_for emf
|
36
|
+
elsif emf < 13.228
|
37
|
+
Polynomial.new(
|
38
|
+
1.334584505e+01, 1.472644573e+02, -1.844024844e+01, 4.031129726e+00, -6.249428360e-01,
|
39
|
+
6.468412046e-02, -4.458750426e-03, 1.994710149e-04, -5.313401790e-06, 6.481976217e-08
|
40
|
+
).solve_for emf
|
41
|
+
elsif emf < 19.739
|
42
|
+
Polynomial.new(
|
43
|
+
-8.199599416e+01, 1.553962042e+02, -8.342197663e+00, 4.279433549e-01, -1.191577910e-02,
|
44
|
+
1.492290091e-04
|
45
|
+
).solve_for emf
|
46
|
+
else
|
47
|
+
Polynomial.new(
|
48
|
+
3.406177836e+04, -7.023729171e+03, 5.582903813e+02, -1.952394635e+01, 2.560740231e-01
|
49
|
+
).solve_for emf
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
@@ -0,0 +1,54 @@
|
|
1
|
+
module Tuscan
|
2
|
+
module Iec60584
|
3
|
+
module TypeS
|
4
|
+
T90_RANGE = -50.00..1768.10
|
5
|
+
EMF_RANGE = -0.236..18.693
|
6
|
+
|
7
|
+
extend self
|
8
|
+
|
9
|
+
def emfr_unbound t90
|
10
|
+
if t90 < 1064.18
|
11
|
+
Polynomial.new(
|
12
|
+
0.000000000000e+00, 0.540313308631e-02, 0.125934289740e-04, -0.232477968689e-07,
|
13
|
+
0.322028823036e-10, -0.331465196389e-13, 0.255744251786e-16, -0.125068871393e-19,
|
14
|
+
0.271443176145e-23
|
15
|
+
).solve_for t90
|
16
|
+
elsif t90 < 1664.50
|
17
|
+
Polynomial.new(
|
18
|
+
0.132900444085e+01, 0.334509311344e-02, 0.654805192818e-05, -0.164856259209e-08,
|
19
|
+
0.129989605174e-13
|
20
|
+
).solve_for t90
|
21
|
+
else
|
22
|
+
Polynomial.new(
|
23
|
+
0.146628232636e+03, -0.258430516752e+00, 0.163693574641e-03, -0.330439046987e-07,
|
24
|
+
-0.943223690612e-14
|
25
|
+
).solve_for t90
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
def t90r_guess emf
|
30
|
+
if emf < 1.874
|
31
|
+
Polynomial.new(
|
32
|
+
0.00000000e+00, 1.84949460e+02, -8.00504062e+01, 1.02237430e+02, -1.52248592e+02,
|
33
|
+
1.88821343e+02, -1.59085941e+02, 8.23027880e+01, -2.34181944e+01, 2.79786260e+00
|
34
|
+
).solve_for emf
|
35
|
+
elsif emf < 11.950
|
36
|
+
Polynomial.new(
|
37
|
+
1.291507177e+01, 1.466298863e+02, -1.534713402e+01, 3.145945973e+00, -4.163257839e-01,
|
38
|
+
3.187963771e-02, -1.291637500e-03, 2.183475087e-05, -1.447379511e-07, 8.211272125e-09
|
39
|
+
).solve_for emf
|
40
|
+
elsif emf < 17.536
|
41
|
+
Polynomial.new(
|
42
|
+
-8.087801117e+01, 1.621573104e+02, -8.536869453e+00, 4.719686976e-01, -1.441693666e-02,
|
43
|
+
2.081618890e-04
|
44
|
+
).solve_for emf
|
45
|
+
else
|
46
|
+
Polynomial.new(
|
47
|
+
5.333875126e+04, -1.235892298e+04, 1.092657613e+03, -4.265693686e+01, 6.247205420e-01
|
48
|
+
).solve_for emf
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
@@ -0,0 +1,41 @@
|
|
1
|
+
module Tuscan
|
2
|
+
module Iec60584
|
3
|
+
module TypeT
|
4
|
+
T90_RANGE = -270.0..400.0
|
5
|
+
EMF_RANGE = -5.603..20.872
|
6
|
+
|
7
|
+
extend self
|
8
|
+
|
9
|
+
def emfr_unbound t90
|
10
|
+
if t90 < 0.0
|
11
|
+
Polynomial.new(
|
12
|
+
0.000000000000e+00, 0.387481063640e-01, 0.441944343470e-04, 0.118443231050e-06,
|
13
|
+
0.200329735540e-07, 0.901380195590e-09, 0.226511565930e-10, 0.360711542050e-12,
|
14
|
+
0.384939398830e-14, 0.282135219250e-16, 0.142515947790e-18, 0.487686622860e-21,
|
15
|
+
0.107955392700e-23, 0.139450270620e-26, 0.797951539270e-30
|
16
|
+
).solve_for t90
|
17
|
+
else
|
18
|
+
Polynomial.new(
|
19
|
+
0.000000000000e+00, 0.387481063640e-01, 0.332922278800e-04, 0.206182434040e-06,
|
20
|
+
-0.218822568460e-08, 0.109968809280e-10, -0.308157587720e-13, 0.454791352900e-16,
|
21
|
+
-0.275129016730e-19
|
22
|
+
).solve_for t90
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
def t90r_guess emf
|
27
|
+
if emf < 0.0
|
28
|
+
Polynomial.new(
|
29
|
+
0.0000000e+00, 2.5949192e+01, -2.1316967e-01, 7.9018692e-01, 4.2527777e-01,
|
30
|
+
1.3304473e-01, 2.0241446e-02, 1.2668171e-03
|
31
|
+
).solve_for emf
|
32
|
+
else
|
33
|
+
Polynomial.new(
|
34
|
+
0.000000e+00, 2.592800e+01, -7.602961e-01, 4.637791e-02, -2.165394e-03,
|
35
|
+
6.048144e-05, -7.293422e-07
|
36
|
+
).solve_for emf
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
data/lib/tuscan/iec60584.rb
CHANGED
@@ -1,391 +1,46 @@
|
|
1
|
+
require 'byebug'
|
2
|
+
|
1
3
|
module Tuscan
|
2
4
|
module Iec60584
|
3
|
-
include Math
|
4
5
|
extend self
|
5
6
|
|
7
|
+
def t90 emf, type:, a: 0.0, b: 0.0, c: 0.0, d: 0.0, err: 1e-3, num: 10
|
8
|
+
emfc = emf - emfdev(t90r(emf, type, err, num), a, b, c, d)
|
9
|
+
t90r emfc, type, err, num
|
10
|
+
end
|
11
|
+
alias_method :t, :t90
|
12
|
+
alias_method :temperature, :t90
|
6
13
|
|
7
|
-
def emfr t90, type
|
8
|
-
|
9
|
-
|
10
|
-
result += a[0] * exp(a[1] * (t90 - a[2])**2)
|
14
|
+
def emfr t90, type
|
15
|
+
raise RangeError, 't90 is outside the valid range' if out_of_range? t90, type
|
16
|
+
emfr_unbound t90, type
|
11
17
|
end
|
12
18
|
|
13
|
-
def t90r emf, type, err
|
19
|
+
def t90r emf, type, err, num
|
14
20
|
guess = t90r_guess emf, type
|
15
|
-
Rical.inverse_for f: method(:
|
16
|
-
|
17
|
-
y: emf, method: :secant,
|
18
|
-
num: num, err: err * 1e-3
|
21
|
+
Rical.inverse_for f: method(:emfr_unbound), fargs: type, x0: guess - 0.5, x1: guess + 0.5,
|
22
|
+
y: emf, method: :secant, num: num, err: err * 1e-3
|
19
23
|
end
|
20
24
|
|
25
|
+
def emfdev t90, a, b, c, d
|
26
|
+
Polynomial.new(a, b, c, d).solve_for t90
|
27
|
+
end
|
21
28
|
|
22
29
|
private
|
23
30
|
def t90r_guess emf, type
|
24
|
-
|
25
|
-
end
|
26
|
-
|
27
|
-
def emf_c_coeffs t90, type
|
28
|
-
case type
|
29
|
-
when :b then emf_c_coeffs_b t90
|
30
|
-
when :c then emf_c_coeffs_c t90
|
31
|
-
when :e then emf_c_coeffs_e t90
|
32
|
-
when :j then emf_c_coeffs_j t90
|
33
|
-
when :k then emf_c_coeffs_k t90
|
34
|
-
when :n then emf_c_coeffs_n t90
|
35
|
-
when :r then emf_c_coeffs_r t90
|
36
|
-
when :s then emf_c_coeffs_s t90
|
37
|
-
when :t then emf_c_coeffs_t t90
|
38
|
-
end
|
39
|
-
end
|
40
|
-
|
41
|
-
def emf_c_coeffs_b t90
|
42
|
-
# 0.000..630.615
|
43
|
-
# 630.615..1820.00
|
44
|
-
if t90 < 630.615
|
45
|
-
[ 0.000000000000e+00, -0.246508183460e-03, 0.590404211710e-05,
|
46
|
-
-0.132579316360e-08, 0.156682919010e-11, -0.169445292400e-14,
|
47
|
-
0.629903470940e-18 ]
|
48
|
-
else
|
49
|
-
[ -0.389381686210e+01, 0.285717474700e-01, -0.848851047850e-04,
|
50
|
-
0.157852801640e-06, -0.168353448640e-09, 0.111097940130e-12,
|
51
|
-
-0.445154310330e-16, 0.989756408210e-20, -0.937913302890e-24 ]
|
52
|
-
end
|
53
|
-
end
|
54
|
-
|
55
|
-
def emf_c_coeffs_c t90
|
56
|
-
# 0.0..2320.0
|
57
|
-
[ -3.109077870000e-04, 1.338547130000e-02, 1.226236040000e-05,
|
58
|
-
-1.050537530000e-08, 3.613274640000e-12, -4.990804550000e-16,
|
59
|
-
6.434651840000e-22 ]
|
60
|
-
end
|
61
|
-
|
62
|
-
def emf_c_coeffs_e t90
|
63
|
-
# -270.0..0.0
|
64
|
-
# 0.0..1000.0
|
65
|
-
if t90 < 0.0
|
66
|
-
[ 0.000000000000e+00, 0.586655087080e-01, 0.454109771240e-04,
|
67
|
-
-0.779980486860e-06, -0.258001608430e-07, -0.594525830570e-09,
|
68
|
-
-0.932140586670e-11, -0.102876055340e-12, -0.803701236210e-15,
|
69
|
-
-0.439794973910e-17, -0.164147763550e-19, -0.396736195160e-22,
|
70
|
-
-0.558273287210e-25, -0.346578420130e-28 ]
|
71
|
-
else
|
72
|
-
[ 0.000000000000e+00, 0.586655087100e-01, 0.450322755820e-04,
|
73
|
-
0.289084072120e-07, -0.330568966520e-09, 0.650244032700e-12,
|
74
|
-
-0.191974955040e-15, -0.125366004970e-17, 0.214892175690e-20,
|
75
|
-
-0.143880417820e-23, 0.359608994810e-27 ]
|
76
|
-
end
|
77
|
-
end
|
78
|
-
|
79
|
-
def emf_c_coeffs_j t90
|
80
|
-
# -210.0..760.0
|
81
|
-
# 760.0..1200.0
|
82
|
-
if t90 < 760.0
|
83
|
-
[ 0.000000000000e+00, 0.503811878150e-01, 0.304758369300e-04,
|
84
|
-
-0.856810657200e-07, 0.132281952950e-09, -0.170529583370e-12,
|
85
|
-
0.209480906970e-15, -0.125383953360e-18, 0.156317256970e-22 ]
|
86
|
-
else
|
87
|
-
[ 0.296456256810e+03, -0.149761277860e+01, 0.317871039240e-02,
|
88
|
-
-0.318476867010e-05, 0.157208190040e-08, -0.306913690560e-12 ]
|
89
|
-
end
|
90
|
-
end
|
91
|
-
|
92
|
-
def emf_c_coeffs_k t90
|
93
|
-
# -270.0..0.0
|
94
|
-
# 0.0..1372.0
|
95
|
-
if t90 < 0.0
|
96
|
-
[ 0.000000000000e+00, 0.394501280250e-01, 0.236223735980e-04,
|
97
|
-
-0.328589067840e-06, -0.499048287770e-08, -0.675090591730e-10,
|
98
|
-
-0.574103274280e-12, -0.310888728940e-14, -0.104516093650e-16,
|
99
|
-
-0.198892668780e-19, -0.163226974860e-22 ]
|
100
|
-
else
|
101
|
-
[ -0.176004136860e-01, 0.389212049750e-01, 0.185587700320e-04,
|
102
|
-
-0.994575928740e-07, 0.318409457190e-09, -0.560728448890e-12,
|
103
|
-
0.560750590590e-15, -0.320207200030e-18, 0.971511471520e-22,
|
104
|
-
-0.121047212750e-25 ]
|
105
|
-
end
|
106
|
-
end
|
107
|
-
|
108
|
-
def emf_c_coeffs_n t90
|
109
|
-
# -270.0..0.0
|
110
|
-
# 0.0..1300.0
|
111
|
-
if t90 < 0.0
|
112
|
-
[ 0.000000000000e+00, 0.261591059620e-01, 0.109574842280e-04,
|
113
|
-
-0.938411115540e-07, -0.464120397590e-10, -0.263033577160e-11,
|
114
|
-
-0.226534380030e-13, -0.760893007910e-16, -0.934196678350e-19 ]
|
115
|
-
else
|
116
|
-
[ 0.000000000000e+00, 0.259293946010e-01, 0.157101418800e-04,
|
117
|
-
0.438256272370e-07, -0.252611697940e-09, 0.643118193390e-12,
|
118
|
-
-0.100634715190e-14, 0.997453389920e-18, -0.608632456070e-21,
|
119
|
-
0.208492293390e-24, -0.306821961510e-28 ]
|
120
|
-
end
|
121
|
-
end
|
122
|
-
|
123
|
-
def emf_c_coeffs_r t90
|
124
|
-
# -50.00..1064.18
|
125
|
-
# 1064.18..1664.50
|
126
|
-
# 1664.50..1768.10
|
127
|
-
if t90 < 1064.18
|
128
|
-
[ 0.000000000000e+00, 0.528961729765e-02, 0.139166589782e-04,
|
129
|
-
-0.238855693017e-07, 0.356916001063e-10, -0.462347666298e-13,
|
130
|
-
0.500777441034e-16, -0.373105886191e-19, 0.157716482367e-22,
|
131
|
-
-0.281038625251e-26 ]
|
132
|
-
elsif t90 < 1664.50
|
133
|
-
[ 0.295157925316e+01, -0.252061251332e-02, 0.159564501865e-04,
|
134
|
-
-0.764085947576e-08, 0.205305291024e-11, -0.293359668173e-15 ]
|
135
|
-
else
|
136
|
-
[ 0.152232118209e+03, -0.268819888545e+00, 0.171280280471e-03,
|
137
|
-
-0.345895706453e-07, -0.934633971046e-14 ]
|
138
|
-
end
|
139
|
-
end
|
140
|
-
|
141
|
-
def emf_c_coeffs_s t90
|
142
|
-
# -50.00..1064.18
|
143
|
-
# 1064.18..1664.50
|
144
|
-
# 1664.50..1768.10
|
145
|
-
if t90 < 1064.18
|
146
|
-
[ 0.000000000000e+00, 0.540313308631e-02, 0.125934289740e-04,
|
147
|
-
-0.232477968689e-07, 0.322028823036e-10, -0.331465196389e-13,
|
148
|
-
0.255744251786e-16, -0.125068871393e-19, 0.271443176145e-23 ]
|
149
|
-
elsif t90 < 1664.50
|
150
|
-
[ 0.132900444085e+01, 0.334509311344e-02, 0.654805192818e-05,
|
151
|
-
-0.164856259209e-08, 0.129989605174e-13 ]
|
152
|
-
else
|
153
|
-
[ 0.146628232636e+03, -0.258430516752e+00, 0.163693574641e-03,
|
154
|
-
-0.330439046987e-07, -0.943223690612e-14 ]
|
155
|
-
end
|
156
|
-
end
|
157
|
-
|
158
|
-
def emf_c_coeffs_t t90
|
159
|
-
# -270.0..0.0
|
160
|
-
# 0.0..400.0
|
161
|
-
if t90 < 0.0
|
162
|
-
[ 0.000000000000e+00, 0.387481063640e-01, 0.441944343470e-04,
|
163
|
-
0.118443231050e-06, 0.200329735540e-07, 0.901380195590e-09,
|
164
|
-
0.226511565930e-10, 0.360711542050e-12, 0.384939398830e-14,
|
165
|
-
0.282135219250e-16, 0.142515947790e-18, 0.487686622860e-21,
|
166
|
-
0.107955392700e-23, 0.139450270620e-26, 0.797951539270e-30 ]
|
167
|
-
else
|
168
|
-
[ 0.000000000000e+00, 0.387481063640e-01, 0.332922278800e-04,
|
169
|
-
0.206182434040e-06, -0.218822568460e-08, 0.109968809280e-10,
|
170
|
-
-0.308157587720e-13, 0.454791352900e-16, -0.275129016730e-19 ]
|
171
|
-
end
|
172
|
-
end
|
173
|
-
|
174
|
-
def emf_a_coeffs t90, type
|
175
|
-
case type
|
176
|
-
when :b then emf_a_coeffs_b t90
|
177
|
-
when :c then emf_a_coeffs_c t90
|
178
|
-
when :e then emf_a_coeffs_e t90
|
179
|
-
when :j then emf_a_coeffs_j t90
|
180
|
-
when :k then emf_a_coeffs_k t90
|
181
|
-
when :n then emf_a_coeffs_n t90
|
182
|
-
when :r then emf_a_coeffs_r t90
|
183
|
-
when :s then emf_a_coeffs_s t90
|
184
|
-
when :t then emf_a_coeffs_t t90
|
185
|
-
end
|
186
|
-
end
|
187
|
-
|
188
|
-
def emf_a_coeffs_b t90
|
189
|
-
[ 0.0000000e+00, 0.0000000e+00, 0.0000000e+00 ]
|
190
|
-
end
|
191
|
-
|
192
|
-
def emf_a_coeffs_c t90
|
193
|
-
[ 0.0000000e+00, 0.0000000e+00, 0.0000000e+00 ]
|
194
|
-
end
|
195
|
-
|
196
|
-
def emf_a_coeffs_e t90
|
197
|
-
[ 0.0000000e+00, 0.0000000e+00, 0.0000000e+00 ]
|
198
|
-
end
|
199
|
-
|
200
|
-
def emf_a_coeffs_j t90
|
201
|
-
[ 0.0000000e+00, 0.0000000e+00, 0.0000000e+00 ]
|
202
|
-
end
|
203
|
-
|
204
|
-
def emf_a_coeffs_k t90
|
205
|
-
if t90 < 0.0
|
206
|
-
[ 0.0000000e+00, 0.0000000e+00, 0.0000000e+00 ]
|
207
|
-
else
|
208
|
-
[ 0.1185976e+00, -0.1183432e-03, 0.1269686e+03 ]
|
209
|
-
end
|
210
|
-
end
|
211
|
-
|
212
|
-
def emf_a_coeffs_n t90
|
213
|
-
[ 0.0000000e+00, 0.0000000e+00, 0.0000000e+00 ]
|
214
|
-
end
|
215
|
-
|
216
|
-
def emf_a_coeffs_r t90
|
217
|
-
[ 0.0000000e+00, 0.0000000e+00, 0.0000000e+00 ]
|
218
|
-
end
|
219
|
-
|
220
|
-
def emf_a_coeffs_s t90
|
221
|
-
[ 0.0000000e+00, 0.0000000e+00, 0.0000000e+00 ]
|
222
|
-
end
|
223
|
-
|
224
|
-
def emf_a_coeffs_t t90
|
225
|
-
[ 0.0000000e+00, 0.0000000e+00, 0.0000000e+00 ]
|
226
|
-
end
|
227
|
-
|
228
|
-
|
229
|
-
def t90_coeffs emf, type
|
230
|
-
case type
|
231
|
-
when :b then t90_coeffs_b emf
|
232
|
-
when :e then t90_coeffs_e emf
|
233
|
-
when :j then t90_coeffs_j emf
|
234
|
-
when :k then t90_coeffs_k emf
|
235
|
-
when :n then t90_coeffs_n emf
|
236
|
-
when :r then t90_coeffs_r emf
|
237
|
-
when :s then t90_coeffs_s emf
|
238
|
-
when :t then t90_coeffs_t emf
|
239
|
-
end
|
240
|
-
end
|
241
|
-
|
242
|
-
def t90_coeffs_b emf
|
243
|
-
# 0.290..2.431
|
244
|
-
# 2.431..13.821
|
245
|
-
if emf < 2.431
|
246
|
-
[ 9.8423321e+01, 6.9971500e+02, -8.4765304e+02,
|
247
|
-
1.0052644e+03, -8.3345952e+02, 4.5508542e+02,
|
248
|
-
-1.5523037e+02, 2.9886750e+01, -2.4742860e+00 ]
|
249
|
-
else
|
250
|
-
[ 2.1315071e+02, 2.8510504e+02, -5.2742887e+01,
|
251
|
-
9.9160804e+00, -1.2965303e+00, 1.1195870e-01,
|
252
|
-
-6.0625199e-03, 1.8661696e-04, -2.4878585e-06 ]
|
253
|
-
end
|
254
|
-
end
|
255
|
-
|
256
|
-
def t90_coeffs_e emf
|
257
|
-
# -8.825..0.000
|
258
|
-
# 0.000..76.373
|
259
|
-
if emf < 0.0
|
260
|
-
[ 0.0000000e+00, 1.6977288e+01, -4.3514970e-01,
|
261
|
-
-1.5859697e-01, -9.2502871e-02, -2.6084314e-02,
|
262
|
-
-4.1360199e-03, -3.4034030e-04, -1.1564890e-05,
|
263
|
-
0.0000000e+00 ]
|
264
|
-
else
|
265
|
-
[ 0.0000000e+00, 1.7057035e+01, -2.3301759e-01,
|
266
|
-
6.5435585e-03, -7.3562749e-05, -1.7896001e-06,
|
267
|
-
8.4036165e-08, -1.3735879e-09, 1.0629823e-11,
|
268
|
-
-3.2447087e-14 ]
|
269
|
-
end
|
270
|
-
end
|
271
|
-
|
272
|
-
def t90_coeffs_j emf
|
273
|
-
# -8.096..0.000
|
274
|
-
# 0.000..42.919
|
275
|
-
# 42.919..69.554
|
276
|
-
if emf < 0.0
|
277
|
-
[ 0.0000000e+00, 1.9528268e+01, -1.2286185e+00,
|
278
|
-
-1.0752178e+00, -5.9086933e-01, -1.7256713e-01,
|
279
|
-
-2.8131513e-02, -2.3963370e-03, -8.3823321e-05 ]
|
280
|
-
elsif emf < 42.919
|
281
|
-
[ 0.000000e+00, 1.978425e+01, -2.001204e-01,
|
282
|
-
1.036969e-02, -2.549687e-04, 3.585153e-06,
|
283
|
-
-5.344285e-08, 5.099890e-10 ]
|
284
|
-
else
|
285
|
-
[ -3.11358187e+03, 3.00543684e+02, -9.94773230e+00,
|
286
|
-
1.70276630e-01, -1.43033468e-03, 4.73886084e-06 ]
|
287
|
-
end
|
288
|
-
end
|
289
|
-
|
290
|
-
def t90_coeffs_k emf
|
291
|
-
# -5.892..0.000
|
292
|
-
# 0.000..20.644
|
293
|
-
# 20.644..54.887
|
294
|
-
if emf < 0.0
|
295
|
-
[ 0.0000000e+00, 2.5173462e+01, -1.1662878e+00,
|
296
|
-
-1.0833638e+00, -8.9773540e-01, -3.7342377e-01,
|
297
|
-
-8.6632643e-02, -1.0450598e-02, -5.1920577e-04 ]
|
298
|
-
elsif emf < 20.644
|
299
|
-
[ 0.000000e+00, 2.508355e+01, 7.860106e-02,
|
300
|
-
-2.503131e-01, 8.315270e-02, -1.228034e-02,
|
301
|
-
9.804036e-04, -4.413030e-05, 1.057734e-06,
|
302
|
-
-1.052755e-08 ]
|
303
|
-
else
|
304
|
-
[ -1.318058e+02, 4.830222e+01, -1.646031e+00,
|
305
|
-
5.464731e-02, -9.650715e-04, 8.802193e-06,
|
306
|
-
-3.110810e-08 ]
|
307
|
-
end
|
308
|
-
end
|
309
|
-
|
310
|
-
def t90_coeffs_n emf
|
311
|
-
# -3.991..0.000
|
312
|
-
# 0.000..20.613
|
313
|
-
# 20.613..47.513
|
314
|
-
if emf < 0.0
|
315
|
-
[ 0.0000000e+00, 3.8436847e+01, 1.1010485e+00,
|
316
|
-
5.2229312e+00, 7.2060525e+00, 5.8488586e+00,
|
317
|
-
2.7754916e+00, 7.7075166e-01, 1.1582665e-01,
|
318
|
-
7.3138868e-03 ]
|
319
|
-
elsif emf < 20.613
|
320
|
-
[ 0.00000e+00, 3.86896e+01, -1.08267e+00,
|
321
|
-
4.70205e-02, -2.12169e-06, -1.17272e-04,
|
322
|
-
5.39280e-06, -7.98156e-08 ]
|
323
|
-
else
|
324
|
-
[ 1.972485e+01, 3.300943e+01, -3.915159e-01,
|
325
|
-
9.855391e-03, -1.274371e-04, 7.767022e-07 ]
|
326
|
-
end
|
31
|
+
tc(type).t90r_guess emf
|
327
32
|
end
|
328
33
|
|
329
|
-
def
|
330
|
-
|
331
|
-
# 1.923..13.228
|
332
|
-
# 11.361..19.739
|
333
|
-
# 19.739..21.103
|
334
|
-
if emf < 1.923
|
335
|
-
[ 0.0000000E+00, 1.8891380E+02, -9.3835290E+01,
|
336
|
-
1.3068619E+02, -2.2703580E+02, 3.5145659E+02,
|
337
|
-
-3.8953900E+02, 2.8239471E+02, -1.2607281E+02,
|
338
|
-
3.1353611E+01, -3.3187769E+00 ]
|
339
|
-
elsif emf < 13.228
|
340
|
-
[ 1.334584505E+01, 1.472644573E+02, -1.844024844E+01,
|
341
|
-
4.031129726E+00, -6.249428360E-01, 6.468412046E-02,
|
342
|
-
-4.458750426E-03, 1.994710149E-04, -5.313401790E-06,
|
343
|
-
6.481976217E-08 ]
|
344
|
-
elsif emf < 19.739
|
345
|
-
[ -8.199599416E+01, 1.553962042E+02, -8.342197663E+00,
|
346
|
-
4.279433549E-01, -1.191577910E-02, 1.492290091E-04 ]
|
347
|
-
else
|
348
|
-
[ 3.406177836E+04, -7.023729171E+03, 5.582903813E+02,
|
349
|
-
-1.952394635E+01, 2.560740231E-01 ]
|
350
|
-
end
|
34
|
+
def emfr_unbound t90, type
|
35
|
+
tc(type).emfr_unbound t90
|
351
36
|
end
|
352
37
|
|
353
|
-
def
|
354
|
-
|
355
|
-
# 1.874..11.950
|
356
|
-
# 10.332..17.536
|
357
|
-
# 17.536..18.693
|
358
|
-
if emf < 1.874
|
359
|
-
[ 0.00000000E+00, 1.84949460E+02, -8.00504062E+01,
|
360
|
-
1.02237430E+02, -1.52248592E+02, 1.88821343E+02,
|
361
|
-
-1.59085941E+02, 8.23027880E+01, -2.34181944E+01,
|
362
|
-
2.79786260E+00 ]
|
363
|
-
elsif emf < 11.950
|
364
|
-
[ 1.291507177E+01, 1.466298863E+02, -1.534713402E+01,
|
365
|
-
3.145945973E+00, -4.163257839E-01, 3.187963771E-02,
|
366
|
-
-1.291637500E-03, 2.183475087E-05, -1.447379511E-07,
|
367
|
-
8.211272125E-09 ]
|
368
|
-
elsif emf < 17.536
|
369
|
-
[ -8.087801117E+01, 1.621573104E+02, -8.536869453E+00,
|
370
|
-
4.719686976E-01, -1.441693666E-02, 2.081618890E-04 ]
|
371
|
-
else
|
372
|
-
[ 5.333875126E+04, -1.235892298E+04, 1.092657613E+03,
|
373
|
-
-4.265693686E+01, 6.247205420E-01 ]
|
374
|
-
end
|
38
|
+
def out_of_range? t90, type
|
39
|
+
!tc(type)::T90_RANGE.include? t90
|
375
40
|
end
|
376
41
|
|
377
|
-
def
|
378
|
-
#
|
379
|
-
# 0.000..20.872
|
380
|
-
if emf < 0.0
|
381
|
-
[ 0.0000000E+00, 2.5949192E+01, -2.1316967E-01,
|
382
|
-
7.9018692E-01, 4.2527777E-01, 1.3304473E-01,
|
383
|
-
2.0241446E-02, 1.2668171E-03 ]
|
384
|
-
else
|
385
|
-
[ 0.000000E+00, 2.592800E+01, -7.602961E-01,
|
386
|
-
4.637791E-02, -2.165394E-03, 6.048144E-05,
|
387
|
-
-7.293422E-07 ]
|
388
|
-
end
|
42
|
+
def tc type
|
43
|
+
self.const_get "Type#{type.upcase}"
|
389
44
|
end
|
390
45
|
end
|
391
46
|
end
|
data/lib/tuscan/iec60751.rb
CHANGED
@@ -7,38 +7,43 @@ module Tuscan
|
|
7
7
|
B = -5.7750e-07
|
8
8
|
C = -4.1830e-12
|
9
9
|
|
10
|
+
R_RANGE = 18.5201..390.4811
|
11
|
+
T90_RANGE = -200.000..850.000
|
12
|
+
|
10
13
|
extend self
|
11
14
|
|
12
15
|
def r t90, r0: R0, a: A, b: B, c: C
|
13
|
-
t90
|
14
|
-
|
15
|
-
r0*(1 + a*t90 + b*t90**2 - 100*c*t90**3 + c*t90**4)
|
16
|
+
raise RangeError, 't90 is outside the valid range' unless T90_RANGE.include? t90
|
17
|
+
r_unbound t90, r0, a, b, c
|
16
18
|
end
|
17
19
|
alias_method :res, :r
|
18
20
|
alias_method :resistance, :r
|
19
21
|
|
20
22
|
def t90 r, r0: R0, a: A, b: B, c: C, num: 10, err: 1e-4
|
23
|
+
raise RangeError, 'r is outside the valid range' unless R_RANGE.include? r
|
21
24
|
if r >= r0
|
22
25
|
(-a + (a**2 - 4 * b * (1 - r / r0))**(0.5)) / (2 * b)
|
23
26
|
else
|
24
|
-
args =
|
25
|
-
Rical.inverse_for f: method(:
|
26
|
-
|
27
|
-
|
28
|
-
method: :n, num: num, err: err
|
29
|
-
end.to_f
|
30
|
-
rescue RangeError
|
31
|
-
Float::NAN
|
27
|
+
args = [r0, a, b, c]
|
28
|
+
Rical.inverse_for f: method(:r_unbound), fargs: args, df: method(:dr), dfargs: args,
|
29
|
+
x0: t90_guess(r, *args), y: r, method: :newton, num: num, err: err
|
30
|
+
end
|
32
31
|
end
|
33
32
|
alias_method :t, :t90
|
34
33
|
alias_method :temperature, :t90
|
35
34
|
|
36
35
|
private
|
37
|
-
def
|
36
|
+
def r_unbound t90, r0, a, b, c
|
37
|
+
t90 >= 0 ?
|
38
|
+
r0*(1 + a*t90 + b*t90**2) :
|
39
|
+
r0*(1 + a*t90 + b*t90**2 - 100*c*t90**3 + c*t90**4)
|
40
|
+
end
|
41
|
+
|
42
|
+
def t90_guess r, r0, a, b, c
|
38
43
|
((r / r0) - 1) / (a + 100 * b) # valid for r < r0
|
39
44
|
end
|
40
45
|
|
41
|
-
def dr t90, r0
|
46
|
+
def dr t90, r0, a, b, c
|
42
47
|
r0 * (a + 2*b*t90 - 300*c*t90**2 + 4*c*t90**3) # valid for t90 < 0
|
43
48
|
end
|
44
49
|
end
|
data/lib/tuscan/its90.rb
CHANGED
@@ -28,7 +28,7 @@ module Tuscan
|
|
28
28
|
|
29
29
|
def t90 r, rtpw:, **args
|
30
30
|
w = r / rtpw
|
31
|
-
|
31
|
+
t90r w - wdev(t90r(w), args)
|
32
32
|
end
|
33
33
|
alias_method :t, :t90
|
34
34
|
alias_method :temperature, :t90
|
@@ -87,7 +87,7 @@ module Tuscan
|
|
87
87
|
c1: 0.0, c2: 0.0, c3: 0.0, c4: 0.0, c5: 0.0
|
88
88
|
equation = WDEV_EQUATIONS[subrange - 1]
|
89
89
|
# return nil unless equation[:valid].include? t90
|
90
|
-
wr_t90 =
|
90
|
+
wr_t90 = wr t90
|
91
91
|
case subrange
|
92
92
|
when 1..4
|
93
93
|
wdev = a * (wr_t90 - 1)
|
data/lib/tuscan/version.rb
CHANGED
data/lib/tuscan.rb
CHANGED
@@ -1,7 +1,17 @@
|
|
1
1
|
require 'tuscan/version'
|
2
|
+
require 'tuscan/polynomial'
|
2
3
|
require 'tuscan/its90'
|
3
4
|
require 'tuscan/iec60751'
|
4
5
|
require 'tuscan/iec60584'
|
6
|
+
require 'tuscan/iec60584/type_b'
|
7
|
+
require 'tuscan/iec60584/type_c'
|
8
|
+
require 'tuscan/iec60584/type_e'
|
9
|
+
require 'tuscan/iec60584/type_j'
|
10
|
+
require 'tuscan/iec60584/type_k'
|
11
|
+
require 'tuscan/iec60584/type_n'
|
12
|
+
require 'tuscan/iec60584/type_r'
|
13
|
+
require 'tuscan/iec60584/type_s'
|
14
|
+
require 'tuscan/iec60584/type_t'
|
5
15
|
|
6
16
|
module Tuscan
|
7
17
|
extend self
|
@@ -2,15 +2,17 @@ require 'spec_helper'
|
|
2
2
|
|
3
3
|
#
|
4
4
|
# TODO:
|
5
|
-
# 1. implement
|
6
|
-
# 2.
|
5
|
+
# 1. implement emf(t90, ...) as an inverse of t90(emf, ...)
|
6
|
+
# 2. compute better t90_guess for 50..250 ºC to allow extension of T90_RANGE down to 50ºC
|
7
7
|
#
|
8
8
|
module Tuscan
|
9
9
|
describe Iec60584 do
|
10
10
|
context 'reference functions' do
|
11
|
+
err = 1e-3
|
12
|
+
num = 10
|
11
13
|
examples = {
|
12
14
|
b: [
|
13
|
-
|
15
|
+
{ emf: 0.006197, t90: 60.0 },
|
14
16
|
{ emf: 0.291279, t90: 250.0 },
|
15
17
|
{ emf: 1.974546, t90: 630.0 },
|
16
18
|
{ emf: 1.980771, t90: 631.0 },
|
@@ -104,12 +106,57 @@ module Tuscan
|
|
104
106
|
context "on a type #{type.upcase} thermocouple" do
|
105
107
|
examples[type].each do |example|
|
106
108
|
it "yields #{example[:t90]} ºC when emf equals #{example[:emf]} mV" do
|
107
|
-
expect(Iec60584.t90r(example[:emf], type)).to be_within(1e-3).of(example[:t90])
|
109
|
+
expect(Iec60584.t90r(example[:emf], type, err, num)).to be_within(1e-3).of(example[:t90])
|
108
110
|
end
|
109
111
|
end
|
110
112
|
end
|
111
113
|
end
|
112
114
|
end
|
115
|
+
|
116
|
+
context 'deviation functions' do
|
117
|
+
context 'emfdev computation' do
|
118
|
+
it 'delegates to Polynomial' do
|
119
|
+
expect(Polynomial).to receive(:new).with(1, 2, 3, 4).and_call_original
|
120
|
+
Iec60584.emfdev 0, 1, 2, 3, 4
|
121
|
+
end
|
122
|
+
|
123
|
+
it 'calls Polynomial#solve_for' do
|
124
|
+
expect_any_instance_of(Polynomial).to receive(:solve_for).with(0)
|
125
|
+
Iec60584.emfdev 0, 1, 2, 3, 4
|
126
|
+
end
|
127
|
+
end
|
128
|
+
end
|
129
|
+
|
130
|
+
context 'range validation' do
|
131
|
+
%i{ b c e j k n r s t }.each do |type|
|
132
|
+
context "on a type #{type.upcase} thermocouple" do
|
133
|
+
t90lo = examples[type].first[:t90] - 1.0
|
134
|
+
it "raises RangeError when t90 is #{t90lo} ºC" do
|
135
|
+
expect{ Iec60584.emfr t90lo, type }.to raise_error RangeError
|
136
|
+
end
|
137
|
+
|
138
|
+
t90hi = examples[type].last[:t90] + 1.0
|
139
|
+
it "raises RangeError when t90 is #{t90hi} ºC" do
|
140
|
+
expect{ Iec60584.emfr t90hi, type }.to raise_error RangeError
|
141
|
+
end
|
142
|
+
end
|
143
|
+
end
|
144
|
+
end
|
145
|
+
|
146
|
+
context 't90 function' do
|
147
|
+
tc = { type: :r, a: 0, b: -1.39363e-05, c: 3.75578e-08, d: -2.17624e-11 }
|
148
|
+
examples = [
|
149
|
+
{ emf: 3.6105, t90: 419.527 },
|
150
|
+
{ emf: 10.0054, t90: 961.78 },
|
151
|
+
{ emf: 11.6417, t90: 1084.62 }
|
152
|
+
]
|
153
|
+
|
154
|
+
examples.each do |example|
|
155
|
+
it "complies with NPL cert. 2014040275/1/PM03, #{example[:emf]} mV => #{example[:t90]} ºC" do
|
156
|
+
expect(Iec60584.t90 example[:emf], tc).to be_within(0.01).of(example[:t90])
|
157
|
+
end
|
158
|
+
end
|
159
|
+
end
|
113
160
|
end
|
114
161
|
end
|
115
162
|
end
|
@@ -22,13 +22,14 @@ module Tuscan
|
|
22
22
|
expect(Iec60751.r 0, r0: 101.0).to be_within(1e-4).of(101)
|
23
23
|
end
|
24
24
|
end
|
25
|
-
end
|
26
25
|
|
27
|
-
|
28
|
-
|
29
|
-
expect
|
26
|
+
it 'raises RangeError when t90 is out of range' do
|
27
|
+
expect{ Iec60751.r -201.0 }.to raise_error RangeError
|
28
|
+
expect{ Iec60751.r 851.0 }.to raise_error RangeError
|
30
29
|
end
|
30
|
+
end
|
31
31
|
|
32
|
+
context 'temperature computation' do
|
32
33
|
context 'standard coefficients' do
|
33
34
|
examples.each do |example|
|
34
35
|
it "yields #{example[:t90]} Celius when resistance equals #{example[:r]} Ohm" do
|
@@ -42,6 +43,11 @@ module Tuscan
|
|
42
43
|
expect(Iec60751.t90 101, r0: 101.0).to be_within(1e-4).of(0)
|
43
44
|
end
|
44
45
|
end
|
46
|
+
|
47
|
+
it 'raises RangeError when r is out of range' do
|
48
|
+
expect{ Iec60751.t90 18.0 }.to raise_error RangeError
|
49
|
+
expect{ Iec60751.t90 391.0 }.to raise_error RangeError
|
50
|
+
end
|
45
51
|
end
|
46
52
|
end
|
47
53
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: tuscan
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.6
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Luis Bacelar
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-01-
|
11
|
+
date: 2015-01-19 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rical
|
@@ -83,8 +83,18 @@ files:
|
|
83
83
|
- Rakefile
|
84
84
|
- lib/tuscan.rb
|
85
85
|
- lib/tuscan/iec60584.rb
|
86
|
+
- lib/tuscan/iec60584/type_b.rb
|
87
|
+
- lib/tuscan/iec60584/type_c.rb
|
88
|
+
- lib/tuscan/iec60584/type_e.rb
|
89
|
+
- lib/tuscan/iec60584/type_j.rb
|
90
|
+
- lib/tuscan/iec60584/type_k.rb
|
91
|
+
- lib/tuscan/iec60584/type_n.rb
|
92
|
+
- lib/tuscan/iec60584/type_r.rb
|
93
|
+
- lib/tuscan/iec60584/type_s.rb
|
94
|
+
- lib/tuscan/iec60584/type_t.rb
|
86
95
|
- lib/tuscan/iec60751.rb
|
87
96
|
- lib/tuscan/its90.rb
|
97
|
+
- lib/tuscan/polynomial.rb
|
88
98
|
- lib/tuscan/version.rb
|
89
99
|
- spec/spec_helper.rb
|
90
100
|
- spec/tuscan/iec60584_spec.rb
|