Skip to content

Commit df56da7

Browse files
authored
Merge pull request #408 from calbaker/thermal-conductance
Thermal conductance
2 parents 0ff00e3 + 0f73157 commit df56da7

File tree

2 files changed

+241
-0
lines changed

2 files changed

+241
-0
lines changed

src/si/mod.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -138,6 +138,7 @@ system! {
138138
temperature_coefficient::TemperatureCoefficient,
139139
temperature_gradient::TemperatureGradient,
140140
temperature_interval::TemperatureInterval,
141+
thermal_conductance::ThermalConductance,
141142
thermal_conductivity::ThermalConductivity,
142143
thermodynamic_temperature::ThermodynamicTemperature,
143144
time::Time,

src/si/thermal_conductance.rs

Lines changed: 240 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,240 @@
1+
//! Thermal conductance (base unit watt per kelvin, kg · m² · s⁻³ · K⁻¹).
2+
//!
3+
//! Thermal conductance has the same kind as [temperature interval][ti], as this quantity relates
4+
//! to change of temperature. Not of kind `TemperatureKind`, used by [thermodynamic
5+
//! temperature][tt]. See [thermodynamic temperature][tt] for a full explanation.
6+
//!
7+
//! [ti]: ../temperature_interval/index.html
8+
//! [tt]: ../thermodynamic_temperature/index.html
9+
10+
quantity! {
11+
/// Thermal conductance (base unit watt per kelvin, kg · m² · s⁻³ · K⁻¹).
12+
quantity: ThermalConductance; "thermal conductance";
13+
/// Dimension of thermal conductance, LM²T⁻³Th⁻¹ (base unit watt per kelvin, kg · m² · s⁻³
14+
/// · K⁻¹).
15+
dimension: ISQ<
16+
P2, // length
17+
P1, // mass
18+
N3, // time
19+
Z0, // electric current
20+
N1, // thermodynamic temperature
21+
Z0, // amount of substance
22+
Z0>; // luminous intensity
23+
units {
24+
@yottagram_meter_per_second_cubed_kelvin: prefix!(yotta) / prefix!(kilo);
25+
"Yg · m²/(s³ · K)", "yottagram meter squared per second cubed kelvin",
26+
"yottagrams meter squared per second cubed kelvin";
27+
@zettagram_meter_per_second_cubed_kelvin: prefix!(zetta) / prefix!(kilo);
28+
"Zg · m²/(s³ · K)", "zettagram meter squared per second cubed kelvin",
29+
"zettagrams meter squared per second cubed kelvin";
30+
@exagram_meter_per_second_cubed_kelvin: prefix!(exa) / prefix!(kilo); "Eg · m²/(s³ · K)",
31+
"exagram meter squared per second cubed kelvin",
32+
"exagrams meter squared per second cubed kelvin";
33+
@petagram_meter_per_second_cubed_kelvin: prefix!(peta) / prefix!(kilo); "Pg · m²/(s³ · K)",
34+
"petagram meter squared per second cubed kelvin",
35+
"petagrams meter squared per second cubed kelvin";
36+
@teragram_meter_per_second_cubed_kelvin: prefix!(tera) / prefix!(kilo); "Tg · m²/(s³ · K)",
37+
"teragram meter squared per second cubed kelvin",
38+
"teragrams meter squared per second cubed kelvin";
39+
@gigagram_meter_per_second_cubed_kelvin: prefix!(giga) / prefix!(kilo); "Gg · m²/(s³ · K)",
40+
"gigagram meter squared per second cubed kelvin",
41+
"gigagrams meter squared per second cubed kelvin";
42+
@megagram_meter_per_second_cubed_kelvin: prefix!(mega) / prefix!(kilo); "Mg · m²/(s³ · K)",
43+
"megagram meter squared per second cubed kelvin",
44+
"megagrams meter squared per second cubed kelvin";
45+
/// Derived unit of thermal conductance in base units. Equivalent to W/K.
46+
@kilogram_meter_per_second_cubed_kelvin: prefix!(kilo) / prefix!(kilo); "kg · m²/(s³ · K)",
47+
"kilogram meter squared per second cubed kelvin",
48+
"kilograms meter squared per second cubed kelvin";
49+
@hectogram_meter_per_second_cubed_kelvin: prefix!(hecto) / prefix!(kilo);
50+
"hg · m²/(s³ · K)", "hectogram meter squared per second cubed kelvin",
51+
"hectograms meter squared per second cubed kelvin";
52+
@decagram_meter_per_second_cubed_kelvin: prefix!(deca) / prefix!(kilo); "dag · m²/(s³ · K)",
53+
"decagram meter squared per second cubed kelvin",
54+
"decagrams meter squared per second cubed kelvin";
55+
@gram_meter_per_second_cubed_kelvin: prefix!(none) / prefix!(kilo); "g · m/(s³ · K)",
56+
"gram meter per second cubed kelvin", "grams meter per second cubed kelvin";
57+
@decigram_meter_per_second_cubed_kelvin: prefix!(deci) / prefix!(kilo); "dg · m²/(s³ · K)",
58+
"decigram meter squared per second cubed kelvin",
59+
"decigrams meter squared per second cubed kelvin";
60+
@centigram_meter_per_second_cubed_kelvin: prefix!(centi) / prefix!(kilo);
61+
"cg · m²/(s³ · K)", "centigram meter squared per second cubed kelvin",
62+
"centigrams meter squared per second cubed kelvin";
63+
@milligram_meter_per_second_cubed_kelvin: prefix!(milli) / prefix!(kilo);
64+
"mg · m²/(s³ · K)", "milligram meter squared per second cubed kelvin",
65+
"milligrams meter squared per second cubed kelvin";
66+
@microgram_meter_per_second_cubed_kelvin: prefix!(micro) / prefix!(kilo); "µg · m/(s³ · K)",
67+
"microgram meter squared per second cubed kelvin",
68+
"micrograms meter squared per second cubed kelvin";
69+
@nanogram_meter_per_second_cubed_kelvin: prefix!(nano) / prefix!(kilo); "ng · m²/(s³ · K)",
70+
"nanogram meter squared per second cubed kelvin",
71+
"nanograms meter squared per second cubed kelvin";
72+
@picogram_meter_per_second_cubed_kelvin: prefix!(pico) / prefix!(kilo); "pg · m²/(s³ · K)",
73+
"picogram meter squared per second cubed kelvin",
74+
"picograms meter squared per second cubed kelvin";
75+
@femtogram_meter_per_second_cubed_kelvin: prefix!(femto) / prefix!(kilo);
76+
"fg · m²/(s³ · K)", "femtogram meter squared per second cubed kelvin",
77+
"femtograms meter squared per second cubed kelvin";
78+
@attogram_meter_per_second_cubed_kelvin: prefix!(atto) / prefix!(kilo); "ag · m²/(s³ · K)",
79+
"attogram meter squared per second cubed kelvin",
80+
"attograms meter squared per second cubed kelvin";
81+
@zeptogram_meter_per_second_cubed_kelvin: prefix!(zepto) / prefix!(kilo);
82+
"zg · m²/(s³ · K)", "zeptogram meter squared per second cubed kelvin",
83+
"zeptograms meter squared per second cubed kelvin";
84+
@yoctogram_meter_per_second_cubed_kelvin: prefix!(yocto) / prefix!(kilo);
85+
"yg · m²/(s³ · K)", "yoctogram meter squared per second cubed kelvin",
86+
"yoctograms meter squared per second cubed kelvin";
87+
88+
// Thermal conductance is much more commonly expressed in terms of power / temperature.
89+
@yottawatt_per_kelvin: prefix!(yotta); "YW/K", "yottawatt per kelvin",
90+
"yottawatts per kelvin";
91+
@zettawatt_per_kelvin: prefix!(zetta); "ZW/K", "zettawatt per kelvin",
92+
"zettawatts per kelvin";
93+
@exawatt_per_kelvin: prefix!(exa); "EW/K", "exawatt per kelvin", "exawatts per kelvin";
94+
@petawatt_per_kelvin: prefix!(peta); "PW/K", "petawatt per kelvin", "petawatts per kelvin";
95+
@terawatt_per_kelvin: prefix!(tera); "TW/K", "terawatt per kelvin", "terawatts per kelvin";
96+
@gigawatt_per_kelvin: prefix!(giga); "GW/K", "gigawatt per kelvin", "gigawatts per kelvin";
97+
@megawatt_per_kelvin: prefix!(mega); "MW/K", "megawatt per kelvin", "megawatts per kelvin";
98+
@kilowatt_per_kelvin: prefix!(kilo); "kW/K", "kilowatt per kelvin", "kilowatts per kelvin";
99+
@hectowatt_per_kelvin: prefix!(hecto); "hW/K", "hectowatt per kelvin",
100+
"hectowatts per kelvin";
101+
@decawatt_per_kelvin: prefix!(deca); "daW/K", "decawatt per kelvin", "decawatts per kelvin";
102+
/// Derived unit of thermal conductance in derived units. Equivalent to kg · m²/(s³ · K).
103+
@watt_per_kelvin: prefix!(none); "W/K", "watt per kelvin", "watts per kelvin";
104+
@deciwatt_per_kelvin: prefix!(deci); "dW/K", "deciwatt per kelvin", "deciwatts per kelvin";
105+
@centiwatt_per_kelvin: prefix!(centi); "cW/K", "centiwatt per kelvin",
106+
"centiwatts per kelvin";
107+
@milliwatt_per_kelvin: prefix!(milli); "mW/K", "milliwatt per kelvin",
108+
"milliwatts per kelvin";
109+
@microwatt_per_kelvin: prefix!(micro); "µW/K", "microwatt per kelvin",
110+
"microwatts per kelvin";
111+
@nanowatt_per_kelvin: prefix!(nano); "nW/K", "nanowatt per kelvin", "nanowatts per kelvin";
112+
@picowatt_per_kelvin: prefix!(pico); "pW/K", "picowatt per kelvin", "picowatts per kelvin";
113+
@femtowatt_per_kelvin: prefix!(femto); "fW/K", "femtowatt per kelvin",
114+
"femtowatts per kelvin";
115+
@attowatt_per_kelvin: prefix!(atto); "aW/K", "attowatt per kelvin", "attowatts per kelvin";
116+
@zeptowatt_per_kelvin: prefix!(zepto); "zW/K", "zeptowatt per kelvin",
117+
"zeptowatts per kelvin";
118+
@yoctowatt_per_kelvin: prefix!(yocto); "yW/K", "yoctowatt per kelvin",
119+
"yoctowatts per kelvin";
120+
121+
// Celsius for convenience.
122+
@kilogram_meter_squared_per_second_cubed_degree_celsius: prefix!(kilo) / prefix!(kilo);
123+
"kg · m²/(s³ · °C)", "kilogram meter squared per second cubed degree Celsius",
124+
"kilograms meter squared per second cubed degree Celsius";
125+
@kilowatt_per_degree_celsius: prefix!(kilo); "kW/°C", "kilowatt per degree Celsius",
126+
"kilowatts per degree Celsius";
127+
/// Derived unit of thermal conductance in derived units. Equivalent to kg · m²/(s³ · K).
128+
@watt_per_meter_degree_celsius: prefix!(none); "W/°C", "watt per degree Celsius",
129+
"watts per degree Celsius";
130+
@milliwatt_per_degree_celsius: prefix!(milli); "mW/°C", "milliwatt per degree Celsius",
131+
"milliwatts per degree Celsius";
132+
}
133+
}
134+
135+
#[cfg(test)]
136+
mod tests {
137+
storage_types! {
138+
use crate::num::One;
139+
use crate::si::length as l;
140+
use crate::si::mass as m;
141+
use crate::si::power as p;
142+
use crate::si::quantities::*;
143+
use crate::si::temperature_interval as ti;
144+
use crate::si::thermal_conductance as tc;
145+
use crate::si::time as t;
146+
use crate::tests::Test;
147+
148+
#[test]
149+
fn check_dimension() {
150+
let _: ThermalConductance<V> = Mass::new::<m::kilogram>(V::one())
151+
* Length::new::<l::meter>(V::one()) * Length::new::<l::meter>(V::one())
152+
/ (Time::new::<t::second>(V::one())
153+
* Time::new::<t::second>(V::one())
154+
* Time::new::<t::second>(V::one())
155+
* TemperatureInterval::new::<ti::kelvin>(V::one()));
156+
}
157+
158+
#[test]
159+
fn check_base_units() {
160+
test::<m::yottagram, ti::kelvin, tc::yottagram_meter_per_second_cubed_kelvin>();
161+
test::<m::zettagram, ti::kelvin, tc::zettagram_meter_per_second_cubed_kelvin>();
162+
test::<m::exagram, ti::kelvin, tc::exagram_meter_per_second_cubed_kelvin>();
163+
test::<m::petagram, ti::kelvin, tc::petagram_meter_per_second_cubed_kelvin>();
164+
test::<m::teragram, ti::kelvin, tc::teragram_meter_per_second_cubed_kelvin>();
165+
test::<m::gigagram, ti::kelvin, tc::gigagram_meter_per_second_cubed_kelvin>();
166+
test::<m::megagram, ti::kelvin, tc::megagram_meter_per_second_cubed_kelvin>();
167+
test::<m::kilogram, ti::kelvin, tc::kilogram_meter_per_second_cubed_kelvin>();
168+
test::<m::hectogram, ti::kelvin, tc::hectogram_meter_per_second_cubed_kelvin>();
169+
test::<m::decagram, ti::kelvin, tc::decagram_meter_per_second_cubed_kelvin>();
170+
test::<m::gram, ti::kelvin, tc::gram_meter_per_second_cubed_kelvin>();
171+
test::<m::decigram, ti::kelvin, tc::decigram_meter_per_second_cubed_kelvin>();
172+
test::<m::centigram, ti::kelvin, tc::centigram_meter_per_second_cubed_kelvin>();
173+
test::<m::milligram, ti::kelvin, tc::milligram_meter_per_second_cubed_kelvin>();
174+
test::<m::microgram, ti::kelvin, tc::microgram_meter_per_second_cubed_kelvin>();
175+
test::<m::nanogram, ti::kelvin, tc::nanogram_meter_per_second_cubed_kelvin>();
176+
test::<m::picogram, ti::kelvin, tc::picogram_meter_per_second_cubed_kelvin>();
177+
test::<m::femtogram, ti::kelvin, tc::femtogram_meter_per_second_cubed_kelvin>();
178+
test::<m::attogram, ti::kelvin, tc::attogram_meter_per_second_cubed_kelvin>();
179+
test::<m::zeptogram, ti::kelvin, tc::zeptogram_meter_per_second_cubed_kelvin>();
180+
test::<m::yoctogram, ti::kelvin, tc::yoctogram_meter_per_second_cubed_kelvin>();
181+
182+
test::<m::kilogram, ti::degree_celsius,
183+
tc::kilogram_meter_squared_per_second_cubed_degree_celsius>();
184+
185+
fn test<
186+
M: m::Conversion<V>,
187+
TI: ti::Conversion<V>,
188+
TC: tc::Conversion<V>>()
189+
{
190+
Test::assert_approx_eq(&ThermalConductance::new::<TC>(V::one()),
191+
&(Mass::new::<M>(V::one())
192+
* Length::new::<l::meter>(V::one()) * Length::new::<l::meter>(V::one())
193+
/ (Time::new::<t::second>(V::one())
194+
* Time::new::<t::second>(V::one())
195+
* Time::new::<t::second>(V::one())
196+
* TemperatureInterval::new::<TI>(V::one()))));
197+
}
198+
}
199+
200+
#[test]
201+
fn check_power_per_length_ti_units() {
202+
test::<p::yottawatt, l::meter, ti::kelvin, tc::yottawatt_per_kelvin>();
203+
test::<p::zettawatt, l::meter, ti::kelvin, tc::zettawatt_per_kelvin>();
204+
test::<p::exawatt, l::meter, ti::kelvin, tc::exawatt_per_kelvin>();
205+
test::<p::petawatt, l::meter, ti::kelvin, tc::petawatt_per_kelvin>();
206+
test::<p::terawatt, l::meter, ti::kelvin, tc::terawatt_per_kelvin>();
207+
test::<p::gigawatt, l::meter, ti::kelvin, tc::gigawatt_per_kelvin>();
208+
test::<p::megawatt, l::meter, ti::kelvin, tc::megawatt_per_kelvin>();
209+
test::<p::kilowatt, l::meter, ti::kelvin, tc::kilowatt_per_kelvin>();
210+
test::<p::hectowatt, l::meter, ti::kelvin, tc::hectowatt_per_kelvin>();
211+
test::<p::decawatt, l::meter, ti::kelvin, tc::decawatt_per_kelvin>();
212+
test::<p::watt, l::meter, ti::kelvin, tc::watt_per_kelvin>();
213+
test::<p::deciwatt, l::meter, ti::kelvin, tc::deciwatt_per_kelvin>();
214+
test::<p::centiwatt, l::meter, ti::kelvin, tc::centiwatt_per_kelvin>();
215+
test::<p::milliwatt, l::meter, ti::kelvin, tc::milliwatt_per_kelvin>();
216+
test::<p::microwatt, l::meter, ti::kelvin, tc::microwatt_per_kelvin>();
217+
test::<p::nanowatt, l::meter, ti::kelvin, tc::nanowatt_per_kelvin>();
218+
test::<p::picowatt, l::meter, ti::kelvin, tc::picowatt_per_kelvin>();
219+
test::<p::femtowatt, l::meter, ti::kelvin, tc::femtowatt_per_kelvin>();
220+
test::<p::attowatt, l::meter, ti::kelvin, tc::attowatt_per_kelvin>();
221+
test::<p::zeptowatt, l::meter, ti::kelvin, tc::zeptowatt_per_kelvin>();
222+
test::<p::yoctowatt, l::meter, ti::kelvin, tc::yoctowatt_per_kelvin>();
223+
224+
test::<p::kilowatt, l::meter, ti::degree_celsius, tc::kilowatt_per_degree_celsius>();
225+
test::<p::watt, l::meter, ti::degree_celsius, tc::watt_per_meter_degree_celsius>();
226+
test::<p::milliwatt, l::meter, ti::degree_celsius, tc::milliwatt_per_degree_celsius>();
227+
228+
fn test<
229+
P: p::Conversion<V>,
230+
L: l::Conversion<V>,
231+
TI: ti::Conversion<V>,
232+
TC: tc::Conversion<V>>()
233+
{
234+
Test::assert_approx_eq(&ThermalConductance::new::<TC>(V::one()),
235+
&(Power::new::<P>(V::one())
236+
/ TemperatureInterval::new::<TI>(V::one())));
237+
}
238+
}
239+
}
240+
}

0 commit comments

Comments
 (0)