tuscan 0.0.6 → 1.0.0

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 3728f465a1aabd2f4b350998fa2eedaf9c9ef59c
4
- data.tar.gz: d62b8f0be3a3c579dca8b8ca7d8c2200860d5e28
3
+ metadata.gz: b7f3655a632e932accfc506be0da201162f2d335
4
+ data.tar.gz: 86eef0d6a857ffa7da7ee88cfac9db49f59c3c59
5
5
  SHA512:
6
- metadata.gz: 61a0dc1c6b9e651948ce5f8e68cc3c58f00177e57fd04c0cb8cc5da762f0ef6fc6a8c5c94c2e11cfc8ff50c253eba5a441592278da044c0a26d2d77c03e2bb21
7
- data.tar.gz: 69299ceb7829cf0bb2ac30fe5285358901e5ecf7135f568c8e11012d5d54aa92d3fcab513872c7b8410a361372c25cdfe7fd830844e327435391578ac9da0b79
6
+ metadata.gz: 9e1dc40bdd539f80a0abe660fef874882d1a38a96e3bfed9d4a5835e766462758f273b553f2e467c6b13cd81edd00018539aede201b99ec8f6aa15c169c0ca32
7
+ data.tar.gz: 5762ef1a39944a570871b38aecd74a3d3c7d8c42d52a49e6df7828214d9fe32f846fb24b9768e10e489f08770c8fc8303f98f8aadf2817c47dd702ace8cc6939
data/README.md CHANGED
@@ -4,18 +4,23 @@
4
4
  Makes available functions for:
5
5
 
6
6
  * ITS-90 compatible temperature sensors (Standard Platinum Resistance Thermometers), allowing:
7
- * Retrieval of reference resistance ratio _Wr_ from _t90r_ reference temperature
8
- * Retrieval of reference temperature _t90r_ from _Wr_ reference resistance ratio
9
- * Given sensor coefficient's: _sub-range_, _Rtpw_, _a_, _b_, _c_, _d_, _W660_, _c1_, _c2_, _c3_, _c4_, _c5_
10
- * Retrieval of resistance ratio deviation _Wdev_ from _t90_, for each of the 11 sub-ranges of ITS-90
11
- * Retrieval of _t90_ temperature from sensor's resistance _r_.
7
+ * Retrieval of reference resistance ratio _W<sub>R</sub>_ from _t<sub>90R</sub>_ reference temperature
8
+ * Retrieval of reference temperature _t<sub>90R</sub>_ from _W<sub>R</sub>_ reference resistance ratio
9
+ * Given sensor coefficient's: _sub-range_, _R<sub>tpw</sub>_, _a_, _b_, _c_, _d_, _W<sub>660</sub>_, _c<sub>1</sub>_, _c<sub>2</sub>_, _c<sub>3</sub>_, _c<sub>4</sub>_, _c<sub>5</sub>_
10
+ * Retrieval of _t<sub>90</sub>_ temperature from sensor's resistance _res_
11
+ * Retrieval of _res_ resistance from sensor's _t<sub>90</sub>_ temperature.
12
12
  * IEC 60751 compatible temperature sensors (Platinum Resistance Thermometers), allowing:
13
- * Given sensor coefficient's: _R0_, _A_, _B_, _C_
14
- * Retrieval of sensor's resistance _r_ from _t90_ temperature
15
- * Retrieval of temperature _t90_ from sensor's resistance _r_
13
+ * Retrieval of reference resistance _res<sub>R</sub>_ from _t<sub>90R</sub>_ reference temperature
14
+ * Retrieval of reference temperature _t<sub>90R</sub>_ from _res<sub>R</sub>_ reference resistance
15
+ * Given sensor coefficient's: _R<sub>0</sub>_, _A_, _B_, _C_
16
+ * Retrieval of sensor's resistance _res_ from _t<sub>90</sub>_ temperature
17
+ * Retrieval of temperature _t<sub>90</sub>_ from sensor's resistance _res_
16
18
  * IEC 60584 compatible temperature sensors (Thermocouples), allowing, for a given _type_:
17
- * Retrieval of reference voltage _emfr_ from _t90r_ reference temperature
18
- * Retrieval of reference temperature _t90r_ from reference voltage _emfr_
19
+ * Retrieval of reference voltage _emf<sub>R</sub>_ from _t<sub>90R</sub>_ reference temperature
20
+ * Retrieval of reference temperature _t<sub>90R</sub>_ from reference voltage _emf<sub>R</sub>_
21
+ * Given sensor coefficient's: _a_, _b_, _c_, _d_
22
+ * Retrieval of sensor's voltage _emf_ from _t<sub>90</sub>_ temperature
23
+ * Retrieval of temperature _t<sub>90</sub>_ from sensor's voltage _emf_
19
24
 
20
25
 
21
26
  ## Installation
@@ -38,24 +43,35 @@ Or install it yourself as:
38
43
 
39
44
  **ITS-90**
40
45
  ```ruby
41
- Tuscan.wr(:its90, 23.456) # t90 in ºC
42
- Tuscan.t90r(:its90, 1.15) # wr in Ohm / Ohm
46
+ # Reference functions (ºC vs Ohm/Ohm)
47
+ Tuscan.wr(:its90, 23.456)
48
+ Tuscan.t90r(:its90, 1.15)
43
49
 
44
- Tuscan.wdev(:its90, 23.456, subrange: 4, a: -1.2579994e-04, b: 1.0678395e-05)
45
-
46
- Tuscan.t90(:its90, r: 28.3433, rtpw: 25.319871, subrange: 7, a: -1.2134e-04, b: -9.9190e-06)
50
+ # Corrected for specific sensor (ºC vs Ohm)
51
+ Tuscan.t90(:its90, 25.319871, rtpw: 25.319871, subrange: 7, a: -1.2134e-04, b: -9.9190e-06)
52
+ Tuscan.res(:its90, 0.01, rtpw: 25.319871, subrange: 7, a: -1.2134e-04, b: -9.9190e-06)
47
53
  ```
48
54
 
49
55
  **IEC 60751**
50
56
  ```ruby
51
- Tuscan.t90(:iec60751, r: 110) # t90 in ºC, r in Ohm
52
- Tuscan.res(:iec60751, t: 10, r0: 99.876, a:3.9083e-03, b:-5.7750e-07, c:-4.1830e-12)
57
+ # Reference functions (ºC vs Ohm)
58
+ Tuscan.t90r(:iec60751, 110)
59
+ Tuscan.resr(:iec60751, 10)
60
+
61
+ # Corrected for specific sensor
62
+ Tuscan.t90(:iec60751, 110, r0: 99.876, a:3.9083e-03, b:-5.7750e-07, c:-4.1830e-12)
63
+ Tuscan.res(:iec60751, 10, r0: 99.876, a:3.9083e-03, b:-5.7750e-07, c:-4.1830e-12)
53
64
  ```
54
65
 
55
66
  **IEC 60584**
56
67
  ```ruby
57
- Tuscan.t90r(:iec60584, emf: 1.234, type: :k) # emf im mV
58
- Tuscan.emfr(:iec60584, t: 10.123, type: :k) # t90 in ºC
68
+ # Reference functions (ºC vs mV)
69
+ Tuscan.t90r(:iec60584, 1.234, type: :k)
70
+ Tuscan.emfr(:iec60584, 10.123, type: :k)
71
+
72
+ # Corrected for specific sensor
73
+ Tuscan.t90(:iec60584, 3.6105, type: :k, a: 0, b: -1.39363e-05, c: 3.75578e-08, d: -2.17624e-11)
74
+ Tuscan.emf(:iec60584, 419.527, type: :k, a: 0, b: -1.39363e-05, c: 3.75578e-08, d: -2.17624e-11)
59
75
  ```
60
76
 
61
77
 
@@ -1,5 +1,3 @@
1
- require 'byebug'
2
-
3
1
  module Tuscan
4
2
  module Iec60584
5
3
  extend self
@@ -11,6 +9,16 @@ module Tuscan
11
9
  alias_method :t, :t90
12
10
  alias_method :temperature, :t90
13
11
 
12
+ def emf t90, type:, a: 0.0, b: 0.0, c: 0.0, d: 0.0, err: 1e-3, num: 10
13
+ guess = emfr t90, type
14
+ delta = 1e-2
15
+ args = { type: type, a: a, b: b, c: c, d: d, err: err, num: num }
16
+ Rical.inverse_for f: method(:t90), fargs: args, x0: guess - delta, x1: guess + delta,
17
+ y: t90, method: :secant, num: num, err: err
18
+ end
19
+ alias_method :v, :emf
20
+ alias_method :voltage, :emf
21
+
14
22
  def emfr t90, type
15
23
  raise RangeError, 't90 is outside the valid range' if out_of_range? t90, type
16
24
  emfr_unbound t90, type
@@ -12,6 +12,14 @@ module Tuscan
12
12
 
13
13
  extend self
14
14
 
15
+ def resr t90
16
+ r t90
17
+ end
18
+
19
+ def t90r r
20
+ t90 r
21
+ end
22
+
15
23
  def r t90, r0: R0, a: A, b: B, c: C
16
24
  raise RangeError, 't90 is outside the valid range' unless T90_RANGE.include? t90
17
25
  r_unbound t90, r0, a, b, c
data/lib/tuscan/its90.rb CHANGED
@@ -3,28 +3,8 @@ module Tuscan
3
3
  include Math
4
4
  extend self
5
5
 
6
- A = [ -2.13534729, 3.1832472, -1.80143597,
7
- 0.71727204, 0.50344027, -0.61899395,
8
- -0.05332322, 0.28021362, 0.10715224,
9
- -0.29302865, 0.04459872, 0.11868632,
10
- -0.05248134 ]
11
-
12
- B = [ 0.183324722, 0.240975303, 0.209108771,
13
- 0.190439972, 0.142648498, 0.077993465,
14
- 0.012475611, -0.032267127, -0.075291522,
15
- -0.05647067, 0.076201285, 0.123893204,
16
- -0.029201193, -0.091173542, 0.001317696,
17
- 0.026025526 ]
18
-
19
- C = [ 2.78157254, 1.64650916, -0.1371439,
20
- -0.00649767, -0.00234444, 0.00511868,
21
- 0.00187982, -0.00204472, -0.00046122,
22
- 0.00045724 ]
23
-
24
- D = [ 439.932854, 472.41802, 37.684494,
25
- 7.472018, 2.920828, 0.005184,
26
- -0.963864, -0.188732, 0.191203,
27
- 0.049025 ]
6
+ T90_RANGE = -273.16..961.78
7
+ WR_RANGE = 0.00..4.28642053
28
8
 
29
9
  def t90 r, rtpw:, **args
30
10
  w = r / rtpw
@@ -33,60 +13,60 @@ module Tuscan
33
13
  alias_method :t, :t90
34
14
  alias_method :temperature, :t90
35
15
 
36
- # SUBRANGES = 1..11
37
-
38
- # T90_RANGE = -259.4467..961.88
39
- # WR_RANGE = 0.00119007..4.28642053
40
-
41
- #
42
- # VALID TEMPERATURE RANGES
43
- #
44
- # def range
45
- # WDEV_EQUATIONS[subrange - 1][:valid]
46
- # end
47
-
16
+ def r t90, rtpw:, num: 100, err: 1e-6, **args
17
+ guess = wr t90
18
+ delta = 1e-2
19
+ Rical.inverse_for f: method(:t90_unbound), fargs: { rtpw: rtpw, **args },
20
+ x0: guess - delta, x1: guess + delta,
21
+ y: t90, method: :secant, num: num, err: err * 1e-1
22
+ end
23
+ alias_method :res, :r
24
+ alias_method :resistance, :r
48
25
 
49
- #
50
- # ITS-90 REFERENCE FUNCTIONS
51
- #
52
- def self.wr t90
53
- # return nil unless T90_RANGE.include? t90
26
+ def wr t90
27
+ raise RangeError, 't90 is outside the valid range' unless T90_RANGE.include? t90
54
28
  if t90< 0.01
55
- exp(A.each_with_index.collect{ |a, i| a*( (log((t90+273.15)/273.16) + 1.5)/1.5 )**i }.reduce(:+))
29
+ a = [ -2.13534729, 3.1832472, -1.80143597, 0.71727204, 0.50344027, -0.61899395, -0.05332322,
30
+ 0.28021362, 0.10715224, -0.29302865, 0.04459872, 0.11868632, -0.05248134 ]
31
+ exp(a.each_with_index.collect{ |ai, i| ai*( (log((t90+273.15)/273.16) + 1.5)/1.5 )**i }.reduce(:+))
56
32
  else
57
- C.each_with_index.collect{ |c, i| c*((t90-481)/481)**i }.reduce(:+)
33
+ c = [ 2.78157254, 1.64650916, -0.1371439, -0.00649767, -0.00234444, 0.00511868, 0.00187982,
34
+ -0.00204472, -0.00046122, 0.00045724 ]
35
+ c.each_with_index.collect{ |ci, i| ci*((t90-481)/481)**i }.reduce(:+)
58
36
  end
59
37
  end
60
38
 
61
- def self.t90r wr
62
- # return nil unless WR_RANGE.include? wr
39
+ def t90r wr
40
+ raise RangeError, 'wr is outside the valid range' unless WR_RANGE.include? wr
63
41
  if wr < 1.0
64
- B.each_with_index.collect{ |b, i| b*(((wr)**(1.0/6)-0.65)/0.35)**i }.reduce(:+) * 273.16 - 273.15
42
+ b = [ 0.183324722, 0.240975303, 0.209108771, 0.190439972, 0.142648498, 0.077993465,
43
+ 0.012475611, -0.032267127, -0.075291522, -0.05647067, 0.076201285, 0.123893204,
44
+ -0.029201193, -0.091173542, 0.001317696, 0.026025526 ]
45
+ b.each_with_index.collect{ |bi, i| bi*(((wr)**(1.0/6)-0.65)/0.35)**i }.reduce(:+) * 273.16 - 273.15
65
46
  else
66
- D.each_with_index.collect{ |d, i| d*((wr-2.64)/1.64)**i }.reduce(:+)
47
+ d = [ 439.932854, 472.41802, 37.684494, 7.472018, 2.920828, 0.005184, -0.963864,
48
+ -0.188732, 0.191203, 0.049025 ]
49
+ d.each_with_index.collect{ |di, i| di*((wr-2.64)/1.64)**i }.reduce(:+)
67
50
  end
68
51
  end
69
52
 
70
- #
71
- # ITS-90 DEVIATION FUNCTIONS
72
- #
73
- WDEV_EQUATIONS = [ { valid: (-259.4467..0.01), k: %w(c1 c2 c3 c4 c5), n: 2 },
74
- { valid: (-248.5939..0.01), k: %w(c1 c2 c3 ), n: 0 },
75
- { valid: (-218.7916..0.01), k: %w(c1 ), n: 1 },
76
- { valid: (-189.3442..0.01), k: %w( ) },
77
- { valid: (0.0..961.78), k: %w(a b c d ) },
78
- { valid: (0.0..660.323), k: %w(a b c ) },
79
- { valid: (0.0..419.527), k: %w(a b ) },
80
- { valid: (0.0..231.928), k: %w(a b ) },
81
- { valid: (0.0..156.5985), k: %w(a ) },
82
- { valid: (0.0..29.7646), k: %w(a ) },
83
- { valid: (-38.8344..29.7646), k: %w(a b ) } ]
84
-
85
53
  def wdev t90, subrange: ,
86
54
  a: 0.0, b: 0.0, c: 0.0, d: 0.0, w660: 0.0,
87
55
  c1: 0.0, c2: 0.0, c3: 0.0, c4: 0.0, c5: 0.0
88
- equation = WDEV_EQUATIONS[subrange - 1]
89
- # return nil unless equation[:valid].include? t90
56
+ raise RangeError, 't90 is outside the valid range' if out_of_range? t90, subrange
57
+ wdev_unbound t90, subrange: subrange, a: a, b: b, c: c, d: d, w660: w660, c1: c1, c2: c2, c3: c3, c4: c4, c5: c5
58
+ end
59
+
60
+ private
61
+ def t90_unbound r, rtpw:, **args
62
+ w = r / rtpw
63
+ t90r w - wdev_unbound(t90r(w), args)
64
+ end
65
+
66
+ def wdev_unbound t90, subrange: ,
67
+ a: 0.0, b: 0.0, c: 0.0, d: 0.0, w660: 0.0,
68
+ c1: 0.0, c2: 0.0, c3: 0.0, c4: 0.0, c5: 0.0
69
+ equation = wdev_equation subrange
90
70
  wr_t90 = wr t90
91
71
  case subrange
92
72
  when 1..4
@@ -95,7 +75,7 @@ module Tuscan
95
75
  wdev += b * (wr_t90 - 1) * log(wr_t90) :
96
76
  wdev += b * (wr_t90 - 1)**2
97
77
  wdev += equation[:k].each_with_index.
98
- collect{ |k, i| eval("#{k}") * log(wr_t90)**(i + equation[:n]) }.reduce(:+) || 0
78
+ collect{ |k, i| call(k) * log(wr_t90)**(i + equation[:n]) }.reduce(:+) || 0
99
79
  when 5..11
100
80
  wdev = d * (wr_t90 - w660)**2 if equation[:k].delete('d')
101
81
  wdev ||= 0
@@ -103,5 +83,37 @@ module Tuscan
103
83
  collect{ |k, i| eval("#{k}") * (wr_t90 - 1)**(i+1) }.reduce(:+)
104
84
  end
105
85
  end
86
+
87
+ def wdev_equation subrange
88
+ case subrange
89
+ when 1 then { k: %w(c1 c2 c3 c4 c5), n: 2 }
90
+ when 2 then { k: %w(c1 c2 c3 ), n: 0 }
91
+ when 3 then { k: %w(c1 ), n: 1 }
92
+ when 4 then { k: %w( ) }
93
+ when 5 then { k: %w(a b c d ) }
94
+ when 6 then { k: %w(a b c ) }
95
+ when 7 then { k: %w(a b ) }
96
+ when 8 then { k: %w(a b ) }
97
+ when 9 then { k: %w(a ) }
98
+ when 10 then { k: %w(a ) }
99
+ when 11 then { k: %w(a b ) }
100
+ end
101
+ end
102
+
103
+ def out_of_range? t90, subrange
104
+ case subrange
105
+ when 1 then !(-259.4467..0.01 ).include? t90
106
+ when 2 then !(-248.5939..0.01 ).include? t90
107
+ when 3 then !(-218.7916..0.01 ).include? t90
108
+ when 4 then !(-189.3442..0.01 ).include? t90
109
+ when 5 then !( 0.0..961.78 ).include? t90
110
+ when 6 then !( 0.0..660.323 ).include? t90
111
+ when 7 then !( 0.0..419.527 ).include? t90
112
+ when 8 then !( 0.0..231.928 ).include? t90
113
+ when 9 then !( 0.0..156.5985).include? t90
114
+ when 10 then !( 0.0..29.7646 ).include? t90
115
+ when 11 then !( -38.8344..29.7646 ).include? t90
116
+ end
117
+ end
106
118
  end
107
119
  end
@@ -1,3 +1,3 @@
1
1
  module Tuscan
2
- VERSION = '0.0.6'
2
+ VERSION = '1.0.0'
3
3
  end
@@ -2,8 +2,7 @@ require 'spec_helper'
2
2
 
3
3
  #
4
4
  # TODO:
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
5
+ # 1. compute better t90_guess for 50..250 ºC to allow extension of T90_RANGE down to 50ºC
7
6
  #
8
7
  module Tuscan
9
8
  describe Iec60584 do
@@ -113,20 +112,6 @@ module Tuscan
113
112
  end
114
113
  end
115
114
 
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
115
  context 'range validation' do
131
116
  %i{ b c e j k n r s t }.each do |type|
132
117
  context "on a type #{type.upcase} thermocouple" do
@@ -142,21 +127,45 @@ module Tuscan
142
127
  end
143
128
  end
144
129
  end
130
+ end
145
131
 
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
- ]
132
+ context 'deviation functions' do
133
+ context 'emfdev computation' do
134
+ it 'delegates to Polynomial' do
135
+ expect(Polynomial).to receive(:new).with(1, 2, 3, 4).and_call_original
136
+ Iec60584.emfdev 0, 1, 2, 3, 4
137
+ end
153
138
 
139
+ it 'calls Polynomial#solve_for' do
140
+ expect_any_instance_of(Polynomial).to receive(:solve_for).with(0)
141
+ Iec60584.emfdev 0, 1, 2, 3, 4
142
+ end
143
+ end
144
+ end
145
+
146
+ context 'non-standard coefficients' 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
+ context 't90 function' do
154
155
  examples.each do |example|
155
156
  it "complies with NPL cert. 2014040275/1/PM03, #{example[:emf]} mV => #{example[:t90]} ºC" do
156
157
  expect(Iec60584.t90 example[:emf], tc).to be_within(0.01).of(example[:t90])
157
158
  end
158
159
  end
159
160
  end
161
+
162
+ context 'emf function' do
163
+ examples.each do |example|
164
+ it "complies with NPL cert. 2014040275/1/PM03, #{example[:t90]} ºC => #{example[:emf]} mV" do
165
+ expect(Iec60584.emf example[:t90], tc).to be_within(0.0001).of(example[:emf])
166
+ end
167
+ end
168
+ end
160
169
  end
161
170
  end
162
171
  end
@@ -24,6 +24,18 @@ module Tuscan
24
24
  expect(Its90.wr example[:t90]).to be_within(1e-8).of(example[:wr])
25
25
  end
26
26
  end
27
+
28
+ context 'range validation' do
29
+ t90lo = -274.0
30
+ it "raises RangeError when t90r is #{t90lo} ºC" do
31
+ expect{ Its90.wr t90lo }.to raise_error RangeError
32
+ end
33
+
34
+ t90hi = 962.0
35
+ it "raises RangeError when t90r is #{t90hi} ºC" do
36
+ expect{ Its90.wr t90hi }.to raise_error RangeError
37
+ end
38
+ end
27
39
  end
28
40
 
29
41
  context 't90r computation' do
@@ -32,7 +44,21 @@ module Tuscan
32
44
  expect(Its90.t90r example[:wr]).to be_within(0.00013).of(example[:t90])
33
45
  end
34
46
  end
47
+
48
+ context 'range validation' do
49
+ wrlo = -0.1
50
+ it "raises RangeError when wr is #{wrlo}" do
51
+ expect{ Its90.t90r wrlo }.to raise_error RangeError
52
+ end
53
+
54
+ wrhi = 4.3
55
+ it "raises RangeError when wr is #{wrhi}" do
56
+ expect{ Its90.t90r wrhi }.to raise_error RangeError
57
+ end
58
+ end
35
59
  end
60
+
61
+
36
62
  end
37
63
 
38
64
  context 'deviation functions' do
@@ -52,6 +78,7 @@ module Tuscan
52
78
  expect(Its90.wdev example[:t90], sprt).to be_within(1e-8).of(example[:wdev])
53
79
  end
54
80
  end
81
+
55
82
  end
56
83
 
57
84
  context 'range 6' do
@@ -70,10 +97,32 @@ module Tuscan
70
97
  end
71
98
  end
72
99
  end
100
+
101
+ context 'range validation' do
102
+ examples =
103
+ [ -259.4467..0.01, -248.5939..0.01, -218.7916..0.01,
104
+ -189.3442..0.01, 0.0..961.78, 0.0..660.323 ,
105
+ 0.0..419.527 , 0.0..231.928 , 0.0..156.5985,
106
+ 0.0..29.7646 , -38.8344..29.7646 ]
107
+
108
+ (1..11).each do |subrange|
109
+ context "on a sub-range #{subrange} SPRT" do
110
+ t90lo = examples[subrange-1].min - 1.0
111
+ it "raises RangeError when t90 is #{t90lo} ºC" do
112
+ expect{ Its90.wdev t90lo, subrange: subrange }.to raise_error RangeError
113
+ end
114
+
115
+ t90hi = examples[subrange-1].max + 1.0
116
+ it "raises RangeError when t90 is #{t90hi} ºC" do
117
+ expect{ Its90.wdev t90hi, subrange: subrange }.to raise_error RangeError
118
+ end
119
+ end
120
+ end
121
+ end
73
122
  end
74
123
  end
75
124
 
76
- context 't90 function' do
125
+ context 'non-standard coefficients' do
77
126
  sprt = { rtpw: 25.319871, subrange: 7, a: -1.2134e-04, b: -9.9190e-06 }
78
127
  examples = [
79
128
  { r: 25.319871, t90: 0.010 },
@@ -81,9 +130,19 @@ module Tuscan
81
130
  { r: 65.039218, t90: 419.527 }
82
131
  ]
83
132
 
84
- examples.each do |example|
85
- it "complies with IPQ cert. 501.20/1241312 range 7, #{example[:t90]} Celsius" do
86
- expect(Its90.t90 example[:r], sprt).to be_within(0.0001).of(example[:t90])
133
+ context 't90 function' do
134
+ examples.each do |example|
135
+ it "complies with IPQ cert. 501.20/1241312 range 7, #{example[:t90]} Celsius" do
136
+ expect(Its90.t90 example[:r], sprt).to be_within(0.0001).of(example[:t90])
137
+ end
138
+ end
139
+ end
140
+
141
+ context 'res function' do
142
+ examples.each do |example|
143
+ it "complies with IPQ cert. 501.20/1241312 range 7, #{example[:r]} Ohm" do
144
+ expect(Its90.res example[:t90], sprt).to be_within(1e-5).of(example[:r])
145
+ end
87
146
  end
88
147
  end
89
148
  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.6
4
+ version: 1.0.0
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-19 00:00:00.000000000 Z
11
+ date: 2015-01-23 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rical