1 package org.djunits.quantity;
2
3 import org.djunits.quantity.def.Quantity;
4 import org.djunits.unit.AbstractUnit;
5 import org.djunits.unit.UnitInterface;
6 import org.djunits.unit.UnitRuntimeException;
7 import org.djunits.unit.Unitless;
8 import org.djunits.unit.scale.LinearScale;
9 import org.djunits.unit.scale.Scale;
10 import org.djunits.unit.si.SIPrefix;
11 import org.djunits.unit.si.SIUnit;
12 import org.djunits.unit.system.UnitSystem;
13
14
15
16
17
18
19
20
21
22 public class Volume extends Quantity<Volume>
23 {
24
25 public static final Volume ZERO = ofSi(0.0);
26
27
28 public static final Volume ONE = ofSi(1.0);
29
30
31 @SuppressWarnings("checkstyle:constantname")
32 public static final Volume NaN = ofSi(Double.NaN);
33
34
35 public static final Volume POSITIVE_INFINITY = ofSi(Double.POSITIVE_INFINITY);
36
37
38 public static final Volume NEGATIVE_INFINITY = ofSi(Double.NEGATIVE_INFINITY);
39
40
41 public static final Volume POS_MAXVALUE = ofSi(Double.MAX_VALUE);
42
43
44 public static final Volume NEG_MAXVALUE = ofSi(-Double.MAX_VALUE);
45
46
47 private static final long serialVersionUID = 600L;
48
49
50
51
52
53
54
55 public Volume(final double value, final Volume.Unit displayUnit, final boolean useSi)
56 {
57 super(value, displayUnit, useSi);
58 }
59
60
61
62
63
64
65 public Volume(final double valueInUnit, final Volume.Unit unit)
66 {
67 this(valueInUnit, unit, false);
68 }
69
70
71
72
73
74
75 public static Volume ofSi(final double si)
76 {
77 return new Volume(si, Volume.Unit.SI, true);
78 }
79
80
81
82
83
84
85
86 public static Volume ofSi(final double siValue, final Volume.Unit displayUnit)
87 {
88 return new Volume(siValue, displayUnit, true);
89 }
90
91 @Override
92 public Volume instantiateSi(final double siValue, final UnitInterface<Volume> displayUnit)
93 {
94 return new Volume(siValue, (Volume.Unit) displayUnit, true);
95 }
96
97
98
99
100
101
102
103
104
105
106 public static Volume valueOf(final String text)
107 {
108 return Quantity.valueOf(text, ZERO);
109 }
110
111
112
113
114
115
116
117 public static Volume of(final double valueInUnit, final Volume.Unit unit)
118 {
119 return new Volume(valueInUnit, unit);
120 }
121
122
123
124
125
126
127
128
129
130 public static Volume of(final double valueInUnit, final String unitString)
131 {
132 return Quantity.of(valueInUnit, unitString, ZERO);
133 }
134
135 @Override
136 public Volume.Unit getDisplayUnit()
137 {
138 return (Volume.Unit) super.getDisplayUnit();
139 }
140
141
142
143
144
145
146 public Dimensionless divide(final Volume v)
147 {
148 return new Dimensionless(this.si() / v.si(), Unitless.BASE);
149 }
150
151
152
153
154
155
156 public Mass multiply(final Density v)
157 {
158 return new Mass(this.si() * v.si(), Mass.Unit.SI);
159 }
160
161
162
163
164
165
166 public Energy multiply(final Pressure v)
167 {
168 return new Energy(this.si() * v.si(), Energy.Unit.SI);
169 }
170
171
172
173
174
175
176 public Area divide(final Length v)
177 {
178 return new Area(this.si() / v.si(), Area.Unit.SI);
179 }
180
181
182
183
184
185
186 public Length divide(final Area v)
187 {
188 return new Length(this.si() / v.si(), Length.Unit.SI);
189 }
190
191
192
193
194
195
196 public Area multiply(final LinearObjectDensity v)
197 {
198 return new Area(this.si() * v.si(), Area.Unit.SI);
199 }
200
201
202
203
204
205
206 public FlowVolume divide(final Duration v)
207 {
208 return new FlowVolume(this.si() / v.si(), FlowVolume.Unit.SI);
209 }
210
211
212
213
214
215
216 public Duration divide(final FlowVolume v)
217 {
218 return new Duration(this.si() / v.si(), Duration.Unit.SI);
219 }
220
221 @Override
222 public VolumetricObjectDensity reciprocal()
223 {
224 return VolumetricObjectDensity.ofSi(1.0 / this.si());
225 }
226
227
228
229
230
231
232
233
234
235
236
237
238
239 @SuppressWarnings("checkstyle:constantname")
240 public static class Unit extends AbstractUnit<Volume>
241 {
242
243 public static final double CONST_CUBIC_INCH = cubed(Length.Unit.CONST_IN);
244
245
246 public static final double CONST_CUBIC_FOOT = cubed(Length.Unit.CONST_FT);
247
248
249 public static final double CONST_CUBIC_YARD = cubed(Length.Unit.CONST_YD);
250
251
252 public static final double CONST_GALLON_IMP = 4.54609E-3;
253
254
255 public static final double CONST_OZ_IMP = CONST_GALLON_IMP / 160.0;
256
257
258 public static final double CONST_GALLON_US = 231.0 * CONST_CUBIC_INCH;
259
260
261 public static final double CONST_OZ_US = CONST_GALLON_US / 128.0;
262
263
264 public static final SIUnit SI_UNIT = SIUnit.of("m3");
265
266
267 public static final Volume.Unit m3 = new Volume.Unit("m3", "cubic meter", 1.0, UnitSystem.SI_BASE);
268
269
270 public static final Volume.Unit SI = m3;
271
272
273 public static final Volume.Unit mm3 = m3.deriveUnit("mm3", "cubic millimeter", 1.0E-9, UnitSystem.SI_BASE);
274
275
276 public static final Volume.Unit cm3 = m3.deriveUnit("cm3", "cubic centimeter", 1.0E-6, UnitSystem.SI_BASE);
277
278
279 public static final Volume.Unit dm3 = m3.deriveUnit("dm3", "cubic decimeter", 1.0E-3, UnitSystem.SI_BASE);
280
281
282 public static final Volume.Unit dam3 = m3.deriveUnit("dam3", "cubic decameter", 1.0E3, UnitSystem.SI_BASE);
283
284
285 public static final Volume.Unit hm3 = m3.deriveUnit("hm3", "cubic hectometer", 1.0E6, UnitSystem.SI_BASE);
286
287
288 public static final Volume.Unit km3 = m3.deriveUnit("km3", "cubic kilometer", 1.0E9, UnitSystem.SI_BASE);
289
290
291 public static final Volume.Unit in3 = m3.deriveUnit("in3", "cubic inch", CONST_CUBIC_INCH, UnitSystem.IMPERIAL);
292
293
294 public static final Volume.Unit ft3 = m3.deriveUnit("ft3", "cubic foot", CONST_CUBIC_FOOT, UnitSystem.IMPERIAL);
295
296
297 public static final Volume.Unit yd3 = m3.deriveUnit("yd3", "cubic yard", CONST_CUBIC_YARD, UnitSystem.IMPERIAL);
298
299
300 public static final Volume.Unit mi3 =
301 m3.deriveUnit("mi3", "cubic mile", cubed(Length.Unit.CONST_MI), UnitSystem.IMPERIAL);
302
303
304 public static final Volume.Unit NM3 =
305 m3.deriveUnit("NM3", "cubic Nautical Mile", cubed(Length.Unit.CONST_NM), UnitSystem.OTHER);
306
307
308 public static final Volume.Unit L = dm3.deriveUnit("L", "liter", 1.0, UnitSystem.SI_ACCEPTED);
309
310
311 public static final Volume.Unit gal_US =
312 m3.deriveUnit("gal(US)", "gallon (US)", CONST_GALLON_US, UnitSystem.US_CUSTOMARY);
313
314
315 public static final Volume.Unit gal_imp =
316 m3.deriveUnit("gal(imp)", "gallon (imp)", CONST_GALLON_IMP, UnitSystem.IMPERIAL);
317
318
319 public static final Volume.Unit qt_US = gal_US.deriveUnit("qt(US)", "quart (US)", 0.25, UnitSystem.US_CUSTOMARY);
320
321
322 public static final Volume.Unit qt_imp = gal_imp.deriveUnit("qt(imp)", "quart (imp)", 0.25, UnitSystem.IMPERIAL);
323
324
325 public static final Volume.Unit pt_US = qt_US.deriveUnit("pt(US)", "pint (US)", 0.5, UnitSystem.US_CUSTOMARY);
326
327
328 public static final Volume.Unit pt_imp = qt_imp.deriveUnit("pt(imp)", "pint (imp)", 0.5, UnitSystem.IMPERIAL);
329
330
331 public static final Volume.Unit fl_oz_US =
332 m3.deriveUnit("fl.oz(US)", "fluid ounce (US)", CONST_OZ_US, UnitSystem.US_CUSTOMARY);
333
334
335 public static final Volume.Unit fl_oz_imp =
336 m3.deriveUnit("fl.oz(imp)", "fluid ounce (imp)", CONST_OZ_IMP, UnitSystem.IMPERIAL);
337
338
339 public static final Volume.Unit ly3 =
340 m3.deriveUnit("ly3", "cubic lightyear", cubed(Length.Unit.CONST_LY), UnitSystem.OTHER);
341
342
343 public static final Volume.Unit pc3 =
344 m3.deriveUnit("pc3", "cubic Parsec", cubed(Length.Unit.CONST_PC), UnitSystem.OTHER);
345
346
347
348
349
350
351
352
353 public Unit(final String id, final String name, final double scaleFactorToBaseUnit, final UnitSystem unitSystem)
354 {
355 super(id, name, scaleFactorToBaseUnit, unitSystem);
356 }
357
358
359
360
361
362
363
364
365
366
367 public Unit(final String textualAbbreviation, final String displayAbbreviation, final String name, final Scale scale,
368 final UnitSystem unitSystem, final SIPrefix siPrefix)
369 {
370 super(textualAbbreviation, displayAbbreviation, name, scale, unitSystem, siPrefix);
371 }
372
373 @Override
374 public SIUnit siUnit()
375 {
376 return SI_UNIT;
377 }
378
379 @Override
380 public Unit getBaseUnit()
381 {
382 return SI;
383 }
384
385 @Override
386 public Volume ofSi(final double si, final UnitInterface<Volume> displayUnit)
387 {
388 return new Volume(si, (Unit) displayUnit, true);
389 }
390
391 @Override
392 public Volume.Unit deriveUnit(final String textualAbbreviation, final String displayAbbreviation, final String name,
393 final double scaleFactor, final UnitSystem unitSystem, final SIPrefix siPrefix)
394 {
395 if (getScale() instanceof LinearScale ls)
396 {
397 return new Volume.Unit(textualAbbreviation, displayAbbreviation, name,
398 new LinearScale(ls.getScaleFactorToBaseUnit() * scaleFactor), unitSystem, siPrefix);
399 }
400 throw new UnitRuntimeException("Only possible to derive a unit from a unit with a linear scale");
401 }
402
403 @Override
404 public Volume.Unit deriveUnit(final String abbreviation, final String name, final double scaleFactor,
405 final UnitSystem unitSystem)
406 {
407 return (Unit) super.deriveUnit(abbreviation, name, scaleFactor, unitSystem);
408 }
409
410
411
412
413
414
415 private static double cubed(final double x)
416 {
417 return x * x * x;
418 }
419 }
420 }