Preliminary#
Vectors#
fib-o-mat ships a Vector
class which represent a 2-dim mathematical vector or point in euclidean space. A vector can be constructed in
various ways:
Vector()
creates a null-vector
Vector(x=1, y=2) = Vector(1, 2)
creates a cartesian vector with (1, 2) as components
Vector(np.array([1, 2]))
creates the same vector as above from a numpy array
Vector([1, 2])
creates the same vector as above from a list
Vector((1, 2))
creates the same vector as above from a tuple
Vector(r=1, phi=np.pi)
creates a vector from polar coordinates
Vector(Vector(1, 2))
copies the passed vector object
Vector
support the usual mathematical operations
u = Vector(1, 2)
v = Vector(3, 4)
print(u + v) # result in Vector(4, 6)
print(u - v) # result in Vector(-2, -2)
print(4 * u) # result in Vector(4, 8)
print(u / 2) # result in Vector(0.5, 1)
print(u + (1, 2)) # results also in Vector(4, 6)
print(u + [1, 2]) # results also in Vector(4, 6)
print(u + np.array((1, 2))) # results also in Vector(4, 6)
print(u.dot(v)) # prints the dot product between u and v, in this case 9
Vectors can be accessed component-wise
print(u.x, u.y) # prints "1, 2"
print(u[0], u[1]) # prints "1, 2", too. u[0] = u.x, u[1] = u.y
w = Vector(r=1, phi=np.pi)
print(u.r, u.phi) # prints 1, 3.14159
Warning
Vector values cannot be changed by accessing its elements. E.g. u.x = 5
is not working.
To change a component, a new Vector
must be constructed
new_u = Vector(x=5, y=u.y)
Further, some other properties of the vector can be accessed
print(v.length) # prints out the norm (length) of the vector
print(v.angle_about_x_axis) # prints the angle of the vector and the positive x-axis. the result will be in [0, 2pi]
print(u.close_to(v)) # returns True, if u is nearly v and otherwise False.
print(angle_between(u, v)) # prints the angle between u and v
Some other operations which can be applied to vectors
u_rot = u.rotated(np.pi/2) # rotated the vector counterclockwise by np.pi/2 around the origin.
u_mir = u.mirrored([1, 0]) # mirrors the vector at the positive x-axis
u_norm = u.normalized() # returns a vector pointing in the same direction as `u` but with length = 1
Vector
can be converted to a numpy array with
np_array = np.asarray(u)
To describe dimensioned vectors, the DimVector
class exist.
This class supports the same function and methods as given above for the Vector
class.
Todo
Add example here.
All the code snippets above are combined here: viggge/fib-o-mat/-/blob/master/examples/vectors.py.
Note
Not all methods on and with vectors are introduced above. Please consult the module reference for all available functions and methods.
Physical units#
fibomat uses the pint library to represent physical units. All functionality is encapsulated in the units
submodule.
A unit can be constructed with
length_unit = U_('µm')
dose_unit = U_('ions / nm**2')
Quantities can be defined nearly identical
length = Q_('1 nm')
dose = Q_('10 ions / nm**2')
another_length = 10 * length_unit # equal to 10 * U_('µm')
# three version to create a dimensioned vector
dim_vector = (3, 4) * U_('µm')
dim_vector2 = Vector(3, 4) * U_('µm')
dim_vector3 = DimVector(3 * U_('µm'), 4 * U_('µm'))
Quantities can be scaled and scale factors can be calculated
length_in_um = scale_to(U_('µm'), length) # NOTE: length_in_um is a float now and NOT a quantity anymore
scale_factor = scale_factor(U_('µm'), U_('nm')) # scale factor (float) to scale from nm to µm
Alternatively, all functions and methods defined in the pint module itself can be used
length_in_um = length.m_as('µm') # identical to scale_to(U_('µm'), length)
# ...
Examples given in: viggge/fib-o-mat/-/blob/master/examples/units.py.
Immutability#
All classes besides the Sample
, Site
and the lattice builder classes are immutable.
This means, once an object is constructed, it cannot be changed or altered anymore.
For example, the x component of Vector
can be read but not set or the
rotated()
method returns a
rotated Vector
but will not change the original one.