Physical quantities and units¶
Units are a key concept in QuantumATK. All parameters that correspond to physical quantities, such as lengths, energies, voltages, etc., should be specified with an explicit unit. Similarly, all physical results returned from QuantumATK calculations also contain an explicit unit. PhysicalQuantity objects are created by multiplying the scalar, list, or array, containing the quantity’s value(s), with the desired unit:
>>> a = [[1.0, 2.0], [3.0, 4.0]]*Angstrom >>> t = 0.5*femtoSecond**-1
See below for physical units available in QuantumATK.
All PhysicalQuantity objects have two query methods:
inUnitsOf(Unit): Returns the numerical value in the specified unit as a numpy-array, respectively numpy-float object for scalar values.
convertTo(Unit): Returns the value of the PhysicalQuantity as a new PhysicalQuantity object in the specified unit.
Moreover, since the PhysicalQuantity class derives from numpy.array, PhysicalQuantity objects can be used, in most respects, as a numpy array. This means that many class methods of numpy arrays, such as sum(), max(), or reshape() can be used with PhysicalQuantity objects.
Element-wise operations between two PhysicalQuantity objects work as in numpy, e.g.:
>>> a = [[1.0, 2.0], [3.0, 4.0]]*Ang >>> b = [[2.0, 2.0], [4.0, 4.0]]*nanoMeter >>> c = a + b >>> print(c) [[ 21. 22.] [ 43. 44.]] Ang
Note, that addition and multiplication require compatible units for all operands.
Note, however, that most other numpy and python functions, e.g. numpy.arange, are not supported for PhysicalQuantity.
In order to use them, the units have to be removed, via
inUnitsOf() before the function is invoked:
>>> a = 5.0*Ang >>> b = 1.0*nanoMeter >>> delta = 0.5*Ang >>> distances = numpy.arange(a.inUnitsOf(Ang), b.inUnitsOf(Ang), delta.inUnitsOf(Ang))
If the result of a PhysicalQuantity-operation is unitless, e.g:
>>> a = [[1.0, 2.0], [3.0, 4.0]]*Ang >>> b = [[2.0, 2.0], [4.0, 4.0]]*Ang**-1 >>> c = a*b >>> print(c) [[ 21. 22.] [ 43. 44.]]
the result is directly returned as a numpy array, respectively as numpy float for scalar values.
Getting a float value:
>>> a = 5*Angstrom >>> print(a.inUnitsOf(nanoMeter)) 0.5
Getting a PhysicalQuantity object:
>>> print(a.convertTo(nanoMeter)) 0.5 nm
Physical quantities can be transformed with an exponent:
>>> a = 2. * Meter * Second**-2 >>> v = (2 * a * (1*Meter))**0.5 >>> print(v) 2.0 m/s
Inverse units are specified by using the exponent operator
>>> f = 2.2/Second >>> print(f.inUnitsOf(Second**-1)) 2.2
Units are attached to values by multiplication. Thus, to specify a length of 5 Bohr:
>>> a = 5*Bohr
By printing the value of the variable
a, the unit will automatically be displayed:
>>> print(a) 5.0 Bohr
Units can also be composite. The unit for force is Newton, which is Joule per Meter. This is a rather awkward unit for nano-scale calculations, where something like electron volt per nm makes more sense. Any energy divided by a length is, however, a valid force unit, so to specify a force, write:
>>> F = 5*eV/Bohr
Next, multiply this by a length again and the result will be an energy:
>>> b = F*5*Bohr >>> print(b) 25*eV
Some unit abbreviations are only available with the
>>> b = 5.1*Units.Ry >>> print(b) 5.1 Rydberg
Units that by default are specified without a prefix, can also be given with a prefix:
>>> b = 5.1*Rydberg >>> c = 5.1*Units.Rydberg
Units available in QuantumATK¶
The following units are made available when importing QuantumATK:
|Conductivity related units||Ampere|