001package com.pi4j.temperature;
002
003/*
004 * #%L
005 * **********************************************************************
006 * ORGANIZATION  :  Pi4J
007 * PROJECT       :  Pi4J :: Java Library (Core)
008 * FILENAME      :  TemperatureConversion.java
009 *
010 * This file is part of the Pi4J project. More information about
011 * this project can be found here:  https://www.pi4j.com/
012 * **********************************************************************
013 * %%
014 * Copyright (C) 2012 - 2021 Pi4J
015 * %%
016 * This program is free software: you can redistribute it and/or modify
017 * it under the terms of the GNU Lesser General Public License as
018 * published by the Free Software Foundation, either version 3 of the
019 * License, or (at your option) any later version.
020 *
021 * This program is distributed in the hope that it will be useful,
022 * but WITHOUT ANY WARRANTY; without even the implied warranty of
023 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
024 * GNU General Lesser Public License for more details.
025 *
026 * You should have received a copy of the GNU General Lesser Public
027 * License along with this program.  If not, see
028 * <http://www.gnu.org/licenses/lgpl-3.0.html>.
029 * #L%
030 */
031
032
033public class TemperatureConversion
034{
035    public static final double ABSOLUTE_ZERO_CELSIUS = -273.15;
036    public static final double ABSOLUTE_ZERO_FARENHEIT = -459.67;
037    public static final double ABSOLUTE_ZERO_KELVIN = 0;
038    public static final double ABSOLUTE_ZERO_RANKINE = 0;
039
040    /**
041     * Convert a temperature value from one temperature scale to another.
042     *
043     * @param from TemperatureScale
044     * @param to TemperatureScale
045     * @param temperature value
046     * @return converted temperature value in the requested to scale
047     */
048    public static double convert(TemperatureScale from, TemperatureScale to, double temperature) {
049
050        switch(from) {
051
052            case FARENHEIT:
053                return convertFromFarenheit(to, temperature);
054            case CELSIUS:
055                return convertFromCelsius(to, temperature);
056            case KELVIN:
057                return convertFromKelvin(to, temperature);
058            case RANKINE:
059                return convertFromRankine(to, temperature);
060            default:
061                throw(new RuntimeException("Invalid termpature conversion"));
062        }
063    }
064
065
066    /**
067     * Convert a temperature value from the Farenheit temperature scale to another.
068     *
069     * @param to TemperatureScale
070     * @param temperature value in degrees Farenheit
071     * @return converted temperature value in the requested to scale
072     */
073    public static double convertFromFarenheit (TemperatureScale to, double temperature) {
074
075        switch(to) {
076
077            case FARENHEIT:
078                return temperature;
079            case CELSIUS:
080                return convertFarenheitToCelsius(temperature);
081            case KELVIN:
082                return convertFarenheitToKelvin(temperature);
083            case RANKINE:
084                return convertFarenheitToRankine(temperature);
085            default:
086                throw(new RuntimeException("Invalid termpature conversion"));
087        }
088    }
089
090    /**
091     * Convert a temperature value from another temperature scale into the Farenheit temperature scale.
092     *
093     * @param from TemperatureScale
094     * @param temperature value from other scale
095     * @return converted temperature value in degrees Farenheit
096     */
097    public static double convertToFarenheit (TemperatureScale from, double temperature) {
098
099        switch(from) {
100
101            case FARENHEIT:
102                return temperature;
103            case CELSIUS:
104                return convertCelsiusToFarenheit(temperature);
105            case KELVIN:
106                return convertKelvinToFarenheit(temperature);
107            case RANKINE:
108                return convertRankineToFarenheit(temperature);
109            default:
110                throw(new RuntimeException("Invalid termpature conversion"));
111        }
112    }
113
114    /**
115     * Convert a temperature value from the Celsius temperature scale to another.
116     *
117     * @param to TemperatureScale
118     * @param temperature value in degrees centigrade
119     * @return converted temperature value in the requested to scale
120     */
121    public static double convertFromCelsius(TemperatureScale to, double temperature) {
122
123        switch(to) {
124
125            case FARENHEIT:
126                return convertCelsiusToFarenheit(temperature);
127            case CELSIUS:
128                return temperature;
129            case KELVIN:
130                return convertCelsiusToKelvin(temperature);
131            case RANKINE:
132                return convertCelsiusToRankine(temperature);
133            default:
134                throw(new RuntimeException("Invalid termpature conversion"));
135        }
136    }
137
138    /**
139     * Convert a temperature value from another temperature scale into the Celsius temperature scale.
140     *
141     * @param from TemperatureScale
142     * @param temperature value from other scale
143     * @return converted temperature value in degrees centigrade
144     */
145    public static double convertToCelsius (TemperatureScale from, double temperature) {
146
147        switch(from) {
148
149            case FARENHEIT:
150                return convertFarenheitToCelsius(temperature);
151            case CELSIUS:
152                return temperature;
153            case KELVIN:
154                return convertKelvinToCelsius(temperature);
155            case RANKINE:
156                return convertRankineToCelsius(temperature);
157            default:
158                throw(new RuntimeException("Invalid termpature conversion"));
159        }
160    }
161
162    /**
163     * Convert a temperature value from the Kelvin temperature scale to another.
164     *
165     * @param to TemperatureScale
166     * @param temperature value in Kelvin
167     * @return converted temperature value in the requested to scale
168     */
169    public static double convertFromKelvin(TemperatureScale to, double temperature) {
170
171        switch(to) {
172
173            case FARENHEIT:
174                return convertKelvinToFarenheit(temperature);
175            case CELSIUS:
176                return convertKelvinToCelsius(temperature);
177            case KELVIN:
178                return temperature;
179            case RANKINE:
180                return convertKelvinToRankine(temperature);
181            default:
182                throw(new RuntimeException("Invalid termpature conversion"));
183        }
184    }
185
186    /**
187     * Convert a temperature value from another temperature scale into the Kelvin temperature scale.
188     *
189     * @param from TemperatureScale
190     * @param temperature value from other scale
191     * @return converted temperature value in Kelvin
192     */
193    public static double convertToKelvin(TemperatureScale from, double temperature) {
194
195        switch(from) {
196
197            case FARENHEIT:
198                return convertFarenheitToKelvin(temperature);
199            case CELSIUS:
200                return convertCelsiusToKelvin(temperature);
201            case KELVIN:
202                return temperature;
203            case RANKINE:
204                return convertRankineToKelvin(temperature);
205            default:
206                throw(new RuntimeException("Invalid termpature conversion"));
207        }
208    }
209
210    /**
211     * Convert a temperature value from the Rankine temperature scale to another.
212     *
213     * @param to TemperatureScale
214     * @param temperature value in degrees Rankine
215     * @return converted temperature value in the requested to scale
216     */
217    public static double convertFromRankine(TemperatureScale to, double temperature) {
218
219        switch(to) {
220
221            case FARENHEIT:
222                return convertRankineToFarenheit(temperature);
223            case CELSIUS:
224                return convertRankineToCelsius(temperature);
225            case KELVIN:
226                return convertRankineToKelvin(temperature);
227            case RANKINE:
228                return temperature;
229            default:
230                throw(new RuntimeException("Invalid termpature conversion"));
231        }
232    }
233
234    /**
235     * Convert a temperature value from another temperature scale into the Rankine temperature scale.
236     *
237     * @param from TemperatureScale
238     * @param temperature value from other scale
239     * @return converted temperature value in degrees Rankine
240     */
241    public static double convertToRankine(TemperatureScale from, double temperature) {
242
243        switch(from) {
244
245            case FARENHEIT:
246                return convertFarenheitToRankine(temperature);
247            case CELSIUS:
248                return convertCelsiusToRankine(temperature);
249            case KELVIN:
250                return convertKelvinToRankine(temperature);
251            case RANKINE:
252                return temperature;
253            default:
254                throw(new RuntimeException("Invalid termpature conversion"));
255        }
256    }
257
258    /**
259     * Convert temperature from Farenheit to Celsius temperature scale
260     *
261     * FORMULA = [°C] = ([°F] − 32) × 5/9
262     *
263     * @param temperature value in degrees Farenheit
264     * @return converted temperature value in degrees Celsius
265     */
266    public static double convertFarenheitToCelsius(double temperature) {
267        return ((temperature - 32) * 5/9);
268    }
269
270    /**
271     * Convert temperature from Farenheit to Kelvin temperature scale
272     *
273     * FORMULA = [K] = ([°F] + 459.67) × 5/9
274     *
275     * @param temperature value in degrees Farenheit
276     * @return converted temperature value in degrees Kelvin
277     */
278    public static double convertFarenheitToKelvin(double temperature) {
279        return (((temperature + 459.67) * 5) / 9);
280    }
281
282    /**
283     * Convert temperature from Farenheit to Rankine temperature scale
284     *
285     * FORMULA = [°R] = [°F] + 459.67
286     *
287     * @param temperature value in degrees Farenheit
288     * @return converted temperature value in degrees Rankine
289     */
290    public static double convertFarenheitToRankine(double temperature) {
291        return temperature + 459.67;
292    }
293
294    /**
295     * Convert temperature from Celsius to Farenheit temperature scale
296     *
297     * FORMULA = [°F] = [°C] × 9/5 + 32
298     *
299     * @param temperature value in degrees Celsius
300     * @return converted temperature value in degrees Farenheit
301     */
302    public static double convertCelsiusToFarenheit(double temperature) {
303        return (((temperature * 9) / 5) + 32);
304    }
305
306    /**
307     * Convert temperature from Celsius to Kelvin temperature scale
308     *
309     * FORMULA = [K] = [°C] + 273.15
310     *
311     * @param temperature value in degrees Celsius
312     * @return converted temperature value in degrees Kelvin
313     */
314    public static double convertCelsiusToKelvin(double temperature) {
315        return (temperature - ABSOLUTE_ZERO_CELSIUS);
316    }
317
318    /**
319     * Convert temperature from Celsius to Rankine temperature scale
320     *
321     * FORMULA = [°R] = ([°C] + 273.15) × 9/5
322     *
323     * @param temperature value in degrees Celsius
324     * @return converted temperature value in degrees Rankine
325     */
326    public static double convertCelsiusToRankine(double temperature) {
327        return (((temperature-ABSOLUTE_ZERO_CELSIUS) * 9) / 5);
328    }
329
330    /**
331     * Convert temperature from Kelvin to Celsius temperature scale
332     *
333     * FORMULA = [°C] = [K] − 273.15
334     *
335     * @param temperature value in degrees Kelvin
336     * @return converted temperature value in degrees Celsius
337     */
338    public static double convertKelvinToCelsius(double temperature) {
339        return (temperature + ABSOLUTE_ZERO_CELSIUS);
340    }
341
342    /**
343     * Convert temperature from Kelvin to Farenheit temperature scale
344     *
345     * FORMULA = [°F] = [K] × 9/5 − 459.67
346     *
347     * @param temperature value in degrees Kelvin
348     * @return converted temperature value in degrees Farenheit
349     */
350    public static double convertKelvinToFarenheit(double temperature) {
351        return (((temperature * 9) / 5) - 459.67);
352    }
353
354    /**
355     * Convert temperature from Kelvin to Rankine temperature scale
356     *
357     * FORMULA = [°R] = [K] × 9/5
358     *
359     * @param temperature value in degrees Kelvin
360     * @return converted temperature value in degrees Rankine
361     */
362    public static double convertKelvinToRankine(double temperature) {
363        return ((temperature * 9) / 5);
364    }
365
366    /**
367     * Convert temperature from Rankine to Farenheit temperature scale
368     *
369     * FORMULA = [°F] = [°R] − 459.67
370     *
371     * @param temperature value in degrees Rankine
372     * @return converted temperature value in degrees Farenheit
373     */
374    public static double convertRankineToFarenheit(double temperature) {
375        return (temperature-(459.67));
376    }
377
378    /**
379     * Convert temperature from Rankine to Celsius temperature scale
380     *
381     * FORMULA = [°C] = ([°R] − 491.67) × 5/9
382     *
383     * @param temperature value in degrees Rankine
384     * @return converted temperature value in degrees Celsius
385     */
386    public static double convertRankineToCelsius(double temperature) {
387        return (((temperature-491.67)* 5) / 9);
388    }
389
390    /**
391     * Convert temperature from Rankine to Kelvin temperature scale
392     *
393     * FORMULA = [K] = [°R] × 5/9
394     *
395     * @param temperature value in degrees Rankine
396     * @return converted temperature value in degrees Kelvin
397     */
398    public static double convertRankineToKelvin(double temperature) {
399        return ((temperature * 5) / 9);
400    }
401}