View Javadoc
1   package org.djunits.value.vdouble.scalar;
2   
3   import java.util.Locale;
4   
5   import org.djunits.unit.DensityUnit;
6   import org.djunits.unit.DimensionlessUnit;
7   import org.djunits.unit.FlowMassUnit;
8   import org.djunits.unit.FlowVolumeUnit;
9   import org.djunits.unit.ForceUnit;
10  import org.djunits.unit.FrequencyUnit;
11  import org.djunits.unit.MassUnit;
12  import org.djunits.unit.MomentumUnit;
13  import org.djunits.value.vdouble.scalar.base.DoubleScalarRel;
14  import org.djutils.base.NumberParser;
15  import org.djutils.exceptions.Throw;
16  
17  import jakarta.annotation.Generated;
18  
19  /**
20   * Easy access methods for the FlowMass DoubleScalar, which is relative by definition.
21   * <p>
22   * Copyright (c) 2013-2025 Delft University of Technology, PO Box 5, 2600 AA, Delft, the Netherlands. All rights reserved. <br>
23   * BSD-style license. See <a href="https://djunits.org/docs/license.html">DJUNITS License</a>.
24   * </p>
25   * @author <a href="https://www.tudelft.nl/averbraeck">Alexander Verbraeck</a>
26   * @author <a href="https://www.tudelft.nl/staff/p.knoppers/">Peter Knoppers</a>
27   */
28  @Generated(value = "org.djunits.generator.GenerateDJUNIT", date = "2025-09-06T15:16:28.380798Z")
29  public class FlowMass extends DoubleScalarRel<FlowMassUnit, FlowMass>
30  {
31      /** */
32      private static final long serialVersionUID = 20150905L;
33  
34      /** Constant with value zero. */
35      public static final FlowMass ZERO = new FlowMass(0.0, FlowMassUnit.SI);
36  
37      /** Constant with value one. */
38      public static final FlowMass ONE = new FlowMass(1.0, FlowMassUnit.SI);
39  
40      /** Constant with value NaN. */
41      @SuppressWarnings("checkstyle:constantname")
42      public static final FlowMass NaN = new FlowMass(Double.NaN, FlowMassUnit.SI);
43  
44      /** Constant with value POSITIVE_INFINITY. */
45      public static final FlowMass POSITIVE_INFINITY = new FlowMass(Double.POSITIVE_INFINITY, FlowMassUnit.SI);
46  
47      /** Constant with value NEGATIVE_INFINITY. */
48      public static final FlowMass NEGATIVE_INFINITY = new FlowMass(Double.NEGATIVE_INFINITY, FlowMassUnit.SI);
49  
50      /** Constant with value MAX_VALUE. */
51      public static final FlowMass POS_MAXVALUE = new FlowMass(Double.MAX_VALUE, FlowMassUnit.SI);
52  
53      /** Constant with value -MAX_VALUE. */
54      public static final FlowMass NEG_MAXVALUE = new FlowMass(-Double.MAX_VALUE, FlowMassUnit.SI);
55  
56      /**
57       * Construct FlowMass scalar with a unit.
58       * @param value the double value, expressed in the given unit
59       * @param unit unit for the double value
60       */
61      public FlowMass(final double value, final FlowMassUnit unit)
62      {
63          super(value, unit);
64      }
65  
66      /**
67       * Construct FlowMass scalar.
68       * @param value Scalar from which to construct this instance
69       */
70      public FlowMass(final FlowMass value)
71      {
72          super(value);
73      }
74  
75      @Override
76      public final FlowMass instantiateRel(final double value, final FlowMassUnit unit)
77      {
78          return new FlowMass(value, unit);
79      }
80  
81      /**
82       * Construct FlowMass scalar based on an SI value.
83       * @param value the double value in SI units
84       * @return the new scalar with the SI value
85       */
86      public static final FlowMass ofSI(final double value)
87      {
88          return new FlowMass(value, FlowMassUnit.SI);
89      }
90  
91      /**
92       * Interpolate between two values. Note that the first value does not have to be smaller than the second.
93       * @param zero the value at a ratio of zero
94       * @param one the value at a ratio of one
95       * @param ratio the ratio between 0 and 1, inclusive
96       * @return a FlowMass at the given ratio between 0 and 1
97       */
98      public static FlowMass interpolate(final FlowMass zero, final FlowMass one, final double ratio)
99      {
100         Throw.when(ratio < 0.0 || ratio > 1.0, IllegalArgumentException.class,
101                 "ratio for interpolation should be between 0 and 1, but is %f", ratio);
102         return new FlowMass(zero.getInUnit() * (1 - ratio) + one.getInUnit(zero.getDisplayUnit()) * ratio,
103                 zero.getDisplayUnit());
104     }
105 
106     /**
107      * Return the maximum value of two relative scalars.
108      * @param r1 the first scalar
109      * @param r2 the second scalar
110      * @return the maximum value of two relative scalars
111      */
112     public static FlowMass max(final FlowMass r1, final FlowMass r2)
113     {
114         return r1.gt(r2) ? r1 : r2;
115     }
116 
117     /**
118      * Return the maximum value of more than two relative scalars.
119      * @param r1 the first scalar
120      * @param r2 the second scalar
121      * @param rn the other scalars
122      * @return the maximum value of more than two relative scalars
123      */
124     public static FlowMass max(final FlowMass r1, final FlowMass r2, final FlowMass... rn)
125     {
126         FlowMass maxr = r1.gt(r2) ? r1 : r2;
127         for (FlowMass r : rn)
128         {
129             if (r.gt(maxr))
130             {
131                 maxr = r;
132             }
133         }
134         return maxr;
135     }
136 
137     /**
138      * Return the minimum value of two relative scalars.
139      * @param r1 the first scalar
140      * @param r2 the second scalar
141      * @return the minimum value of two relative scalars
142      */
143     public static FlowMass min(final FlowMass r1, final FlowMass r2)
144     {
145         return r1.lt(r2) ? r1 : r2;
146     }
147 
148     /**
149      * Return the minimum value of more than two relative scalars.
150      * @param r1 the first scalar
151      * @param r2 the second scalar
152      * @param rn the other scalars
153      * @return the minimum value of more than two relative scalars
154      */
155     public static FlowMass min(final FlowMass r1, final FlowMass r2, final FlowMass... rn)
156     {
157         FlowMass minr = r1.lt(r2) ? r1 : r2;
158         for (FlowMass r : rn)
159         {
160             if (r.lt(minr))
161             {
162                 minr = r;
163             }
164         }
165         return minr;
166     }
167 
168     /**
169      * Returns a FlowMass representation of a textual representation of a value with a unit. The String representation that can
170      * be parsed is the double value in the unit, followed by a localized or English abbreviation of the unit. Spaces are
171      * allowed, but not required, between the value and the unit.
172      * @param text the textual representation to parse into a FlowMass
173      * @return the Scalar representation of the value in its unit
174      * @throws IllegalArgumentException when the text cannot be parsed
175      * @throws NullPointerException when the text argument is null
176      */
177     public static FlowMass valueOf(final String text)
178     {
179         Throw.whenNull(text, "Error parsing FlowMass: text to parse is null");
180         Throw.when(text.length() == 0, IllegalArgumentException.class, "Error parsing FlowMass: empty text to parse");
181         try
182         {
183             NumberParser numberParser = new NumberParser().lenient().trailing();
184             double d = numberParser.parseDouble(text);
185             String unitString = text.substring(numberParser.getTrailingPosition()).trim();
186             FlowMassUnit unit = FlowMassUnit.BASE.getUnitByAbbreviation(unitString);
187             Throw.when(unit == null, IllegalArgumentException.class, "Unit %s not found for quantity FlowMass", unitString);
188             return new FlowMass(d, unit);
189         }
190         catch (Exception exception)
191         {
192             throw new IllegalArgumentException(
193                     "Error parsing FlowMass from " + text + " using Locale " + Locale.getDefault(Locale.Category.FORMAT),
194                     exception);
195         }
196     }
197 
198     /**
199      * Returns a FlowMass based on a value and the textual representation of the unit, which can be localized.
200      * @param value the value to use
201      * @param unitString the textual representation of the unit
202      * @return the Scalar representation of the value in its unit
203      * @throws IllegalArgumentException when the unit cannot be parsed or is incorrect
204      * @throws NullPointerException when the unitString argument is null
205      */
206     public static FlowMass of(final double value, final String unitString)
207     {
208         Throw.whenNull(unitString, "Error parsing FlowMass: unitString is null");
209         Throw.when(unitString.length() == 0, IllegalArgumentException.class, "Error parsing FlowMass: empty unitString");
210         FlowMassUnit unit = FlowMassUnit.BASE.getUnitByAbbreviation(unitString);
211         Throw.when(unit == null, IllegalArgumentException.class, "Error parsing FlowMass with unit %s", unitString);
212         return new FlowMass(value, unit);
213     }
214 
215     /**
216      * Calculate the division of FlowMass and FlowMass, which results in a Dimensionless scalar.
217      * @param v scalar
218      * @return scalar as a division of FlowMass and FlowMass
219      */
220     public final Dimensionless divide(final FlowMass v)
221     {
222         return new Dimensionless(this.si / v.si, DimensionlessUnit.SI);
223     }
224 
225     /**
226      * Calculate the multiplication of FlowMass and Duration, which results in a Mass scalar.
227      * @param v scalar
228      * @return scalar as a multiplication of FlowMass and Duration
229      */
230     public final Mass times(final Duration v)
231     {
232         return new Mass(this.si * v.si, MassUnit.SI);
233     }
234 
235     /**
236      * Calculate the division of FlowMass and Frequency, which results in a Mass scalar.
237      * @param v scalar
238      * @return scalar as a division of FlowMass and Frequency
239      */
240     public final Mass divide(final Frequency v)
241     {
242         return new Mass(this.si / v.si, MassUnit.SI);
243     }
244 
245     /**
246      * Calculate the division of FlowMass and Mass, which results in a Frequency scalar.
247      * @param v scalar
248      * @return scalar as a division of FlowMass and Mass
249      */
250     public final Frequency divide(final Mass v)
251     {
252         return new Frequency(this.si / v.si, FrequencyUnit.SI);
253     }
254 
255     /**
256      * Calculate the multiplication of FlowMass and Speed, which results in a Force scalar.
257      * @param v scalar
258      * @return scalar as a multiplication of FlowMass and Speed
259      */
260     public final Force times(final Speed v)
261     {
262         return new Force(this.si * v.si, ForceUnit.SI);
263     }
264 
265     /**
266      * Calculate the division of FlowMass and FlowVolume, which results in a Density scalar.
267      * @param v scalar
268      * @return scalar as a division of FlowMass and FlowVolume
269      */
270     public final Density divide(final FlowVolume v)
271     {
272         return new Density(this.si / v.si, DensityUnit.SI);
273     }
274 
275     /**
276      * Calculate the division of FlowMass and Density, which results in a FlowVolume scalar.
277      * @param v scalar
278      * @return scalar as a division of FlowMass and Density
279      */
280     public final FlowVolume divide(final Density v)
281     {
282         return new FlowVolume(this.si / v.si, FlowVolumeUnit.SI);
283     }
284 
285     /**
286      * Calculate the multiplication of FlowMass and Length, which results in a Momentum scalar.
287      * @param v scalar
288      * @return scalar as a multiplication of FlowMass and Length
289      */
290     public final Momentum times(final Length v)
291     {
292         return new Momentum(this.si * v.si, MomentumUnit.SI);
293     }
294 
295     @Override
296     public SIScalar reciprocal()
297     {
298         return SIScalar.divide(Dimensionless.ONE, this);
299     }
300 
301     /**
302      * Multiply two scalars that result in a scalar of type FlowMass.
303      * @param scalar1 the first scalar
304      * @param scalar2 the second scalar
305      * @return the multiplication of both scalars as an instance of FlowMass
306      */
307     public static FlowMass multiply(final DoubleScalarRel<?, ?> scalar1, final DoubleScalarRel<?, ?> scalar2)
308     {
309         Throw.whenNull(scalar1, "scalar1 cannot be null");
310         Throw.whenNull(scalar2, "scalar2 cannot be null");
311         Throw.when(!scalar1.getDisplayUnit().getQuantity().getSiDimensions()
312                 .plus(scalar2.getDisplayUnit().getQuantity().getSiDimensions()).equals(FlowMassUnit.BASE.getSiDimensions()),
313                 IllegalArgumentException.class, "Multiplying %s by %s does not result in instance of type FlowMass",
314                 scalar1.toDisplayString(), scalar2.toDisplayString());
315         return new FlowMass(scalar1.si * scalar2.si, FlowMassUnit.SI);
316     }
317 
318     /**
319      * Divide two scalars that result in a scalar of type FlowMass.
320      * @param scalar1 the first scalar
321      * @param scalar2 the second scalar
322      * @return the division of scalar1 by scalar2 as an instance of FlowMass
323      */
324     public static FlowMass divide(final DoubleScalarRel<?, ?> scalar1, final DoubleScalarRel<?, ?> scalar2)
325     {
326         Throw.whenNull(scalar1, "scalar1 cannot be null");
327         Throw.whenNull(scalar2, "scalar2 cannot be null");
328         Throw.when(!scalar1.getDisplayUnit().getQuantity().getSiDimensions()
329                 .minus(scalar2.getDisplayUnit().getQuantity().getSiDimensions()).equals(FlowMassUnit.BASE.getSiDimensions()),
330                 IllegalArgumentException.class, "Dividing %s by %s does not result in an instance of type FlowMass",
331                 scalar1.toDisplayString(), scalar2.toDisplayString());
332         return new FlowMass(scalar1.si / scalar2.si, FlowMassUnit.SI);
333     }
334 
335 }