Source code for llg3d.solvers.math_utils

"""Mathematical utility functions for solvers."""

import numpy as np


[docs] def cross_product(a: np.ndarray, b: np.ndarray) -> np.ndarray: r""" Compute cross product :math:`a \times b`. This implementation is faster than np.cross for large arrays. Args: a: First vector (shape (3, nx, ny, nz)) b: Second vector (shape (3, nx, ny, nz)) Returns: Cross product :math:`a \times b` (shape (3, nx, ny, nz)) """ return np.stack( [ a[1] * b[2] - a[2] * b[1], # x-component a[2] * b[0] - a[0] * b[2], # y-component a[0] * b[1] - a[1] * b[0], # z-component ], axis=0, )
[docs] def normalize(m_n: np.ndarray): r""" Normalize the magnetization array (in place). .. math:: \mathbf{m}_n = \frac{\mathbf{m}_n}{|\mathbf{m}_n|} Args: m_n: Magnetization array at time step n (shape (3, nx, ny, nz)). """ norm = np.sqrt(m_n[0] ** 2 + m_n[1] ** 2 + m_n[2] ** 2) m_n /= norm