/** * Returns the fundamental dimension for the one specified. If the specified dimension is a dimensional product, the dimensional product of its * fundamental dimensions is returned. Physical quantities are considered commensurate only if their fundamental dimensions are equals using the * current physics model. * * @param dimension * the dimension for which the fundamental dimension is returned. * @return <code>this</code> or a rational product of fundamental dimension. */ public Dimension getFundamentalDimension(Dimension dimension) { Map<? extends Dimension, Integer> dimensions = dimension.getBaseDimensions(); if (dimensions == null) return dimension; // Fundamental dimension. // Dimensional Product. Dimension fundamentalProduct = QuantityDimension.NONE; for (Map.Entry<? extends Dimension, Integer> e : dimensions.entrySet()) { fundamentalProduct = fundamentalProduct.multiply(this.getFundamentalDimension(e.getKey())).pow(e.getValue()); } return fundamentalProduct; }
@Override public Dimension getDimension() { Dimension dimension = QuantityDimension.NONE; for (int i = 0; i < this.getUnitCount(); i++) { Unit<?> unit = this.getUnit(i); if (this.elements != null && unit.getDimension() != null) { Dimension d = unit.getDimension().pow(this.getUnitPow(i)).root(this.getUnitRoot(i)); dimension = dimension.multiply(d); } } return dimension; }
/** * Returns {@code true} if the given dimension has no components. */ static boolean isDimensionless(final Dimension dim) { if (dim instanceof UnitDimension) { return ((UnitDimension) dim).isDimensionless(); } else if (dim != null) { // Fallback for foreigner implementations. final Map<? extends Dimension, Integer> bases = dim.getBaseDimensions(); if (bases != null) return bases.isEmpty(); } return false; // Unit is a base unit (not a product of existing units). }
/** * Tests {@link UnitDimension#multiply(Dimension)}. */ @Test @DependsOnMethod("testEqualsAndHashCode") public void testMultiply() { assertSame(LENGTH, LENGTH.multiply(DIMENSIONLESS)); assertSame(AREA, LENGTH.multiply(LENGTH)); assertSame(VOLUME, LENGTH.multiply(AREA)); assertSame(VOLUME, AREA .multiply(LENGTH)); final Map<Dimension,Integer> expected = new HashMap<>(4); assertNull(expected.put(LENGTH, 1)); assertNull(expected.put(TIME, 1)); assertMapEquals(expected, LENGTH.multiply(TIME).getBaseDimensions()); }
/** * Returns the quotient of this dimension with the one specified. * * @param that * the dimension divisor. * @return <code>this.multiply(that.pow(-1))</code> * @since 1.0 */ public Dimension divide(Dimension that) { return this.multiply(that.pow(-1)); }
/** * Tests {@link UnitDimension#divide(Dimension)}. */ @Test @DependsOnMethod("testEqualsAndHashCode") public void testDivide() { assertSame(LENGTH, LENGTH.divide(DIMENSIONLESS)); assertSame(LENGTH, AREA .divide(LENGTH)); assertSame(LENGTH, VOLUME.divide(AREA)); assertSame(AREA, VOLUME.divide(LENGTH)); assertSame(SPEED, LENGTH.divide(TIME)); }
/** * Returns the base dimensions and their exponents whose product make the given dimension. * If the given dimension is a base dimension, then this method returns {@code this} raised * to power 1. This method never returns {@code null}. */ @SuppressWarnings("ReturnOfCollectionOrArrayField") // Safe because the map is unmodifiable. private static Map<? extends Dimension, Fraction> getBaseDimensions(final Dimension dimension) { if (dimension instanceof UnitDimension) { return ((UnitDimension) dimension).components; } /* * Fallback for non-SIS implementations. The cast from <? extends Dimension> to <Dimension> * is safe if we use the 'components' map as a read-only map (no put operation allowed). */ @SuppressWarnings("unchecked") Map<Dimension,Integer> components = (Map<Dimension,Integer>) dimension.getBaseDimensions(); if (components == null) { return Collections.singletonMap(dimension, new Fraction(1,1)); } return ObjectConverters.derivedValues(components, Dimension.class, FractionConverter.FromInteger.INSTANCE); }
/** * Returns the quotient of this dimension with the one specified. * * @param that * the dimension divisor. * @return <code>this.multiply(that.pow(-1))</code> * @since 1.0 */ public Dimension divide(Dimension that) { return this.multiply(that.pow(-1)); }
/** * Returns the fundamental dimension for the one specified. If the specified dimension is a dimensional product, the dimensional product of its * fundamental dimensions is returned. Physical quantities are considered commensurate only if their fundamental dimensions are equals using the * current physics model. * * @param dimension * the dimension for which the fundamental dimension is returned. * @return <code>this</code> or a rational product of fundamental dimension. */ public Dimension getFundamentalDimension(Dimension dimension) { Map<? extends Dimension, Integer> dimensions = dimension.getBaseDimensions(); if (dimensions == null) return dimension; // Fundamental dimension. // Dimensional Product. Dimension fundamentalProduct = QuantityDimension.NONE; for (Map.Entry<? extends Dimension, Integer> e : dimensions.entrySet()) { fundamentalProduct = fundamentalProduct.multiply(this.getFundamentalDimension(e.getKey())).pow(e.getValue()); } return fundamentalProduct; }
@Override public Dimension getDimension() { Dimension dimension = QuantityDimension.NONE; for (int i = 0; i < this.getUnitCount(); i++) { Unit<?> unit = this.getUnit(i); if (this.elements != null && unit.getDimension() != null) { Dimension d = unit.getDimension().pow(this.getUnitPow(i)).root(this.getUnitRoot(i)); dimension = dimension.multiply(d); } } return dimension; }
/** * Returns the base dimensions and their exponents whose product make the given dimension. * If the given dimension is a base dimension, then this method returns {@code this} raised * to power 1. This method never returns {@code null}. */ @SuppressWarnings("ReturnOfCollectionOrArrayField") // Safe because the map is unmodifiable. private static Map<? extends Dimension, Fraction> getBaseDimensions(final Dimension dimension) { if (dimension instanceof UnitDimension) { return ((UnitDimension) dimension).components; } /* * Fallback for non-SIS implementations. The cast from <? extends Dimension> to <Dimension> * is safe if we use the 'components' map as a read-only map (no put operation allowed). */ @SuppressWarnings("unchecked") Map<Dimension,Integer> components = (Map<Dimension,Integer>) dimension.getBaseDimensions(); if (components == null) { return Collections.singletonMap(dimension, new Fraction(1,1)); } return ObjectConverters.derivedValues(components, Dimension.class, FractionConverter.FromInteger.INSTANCE); }
/** * Returns the quotient of this dimension with the one specified. * * @param that * the dimension divisor. * @return <code>this.multiply(that.pow(-1))</code> * @since 1.0 */ public Dimension divide(Dimension that) { return this.multiply(that.pow(-1)); }
/** * Returns the fundamental dimension for the one specified. If the specified dimension is a dimensional product, the dimensional product of its * fundamental dimensions is returned. Physical quantities are considered commensurate only if their fundamental dimensions are equals using the * current physics model. * * @param dimension * the dimension for which the fundamental dimension is returned. * @return <code>this</code> or a rational product of fundamental dimension. */ public Dimension getFundamentalDimension(Dimension dimension) { Map<? extends Dimension, Integer> dimensions = dimension.getBaseDimensions(); if (dimensions == null) return dimension; // Fundamental dimension. // Dimensional Product. Dimension fundamentalProduct = QuantityDimension.NONE; for (Map.Entry<? extends Dimension, Integer> e : dimensions.entrySet()) { fundamentalProduct = fundamentalProduct.multiply(this.getFundamentalDimension(e.getKey())).pow(e.getValue()); } return fundamentalProduct; }
@Override public Dimension getDimension() { Dimension dimension = QuantityDimension.NONE; for (int i = 0; i < this.getUnitCount(); i++) { Unit<?> unit = this.getUnit(i); if (this.elements != null && unit.getDimension() != null) { Dimension d = unit.getDimension().pow(this.getUnitPow(i)).root(this.getUnitRoot(i)); if (dimension != null) { dimension = dimension.multiply(d); } else { dimension = d; // XXX hackaround } } } return dimension; }
Map<? extends Dimension, Integer> dimensions = dimension.getBaseDimensions(); if (dimensions == null) return AbstractConverter.IDENTITY; // Fundamental dimension.
Map<? extends Dimension, Integer> dimensions = dimension.getBaseDimensions(); if (dimensions == null) return AbstractConverter.IDENTITY; // Fundamental dimension.
Map<? extends Dimension, Integer> dimensions = dimension.getBaseDimensions(); if (dimensions == null) return AbstractConverter.IDENTITY; // Fundamental dimension.