Source code for pyleecan.Methods.Simulation.ForceTensor.comp_magnetrosctrictive_tensor

import numpy as np


def comp_magnetrosctrictive_tensor(
    self,
    mu,
    M,
    Nt_tot,
    polynomial_coeffs=[[0.719, -0.078, -0.042], [-0.391, 0.114, 0.004]],
):
    """compute magnetostrictive tensor.

    from publications: IEEETranMagn2004

    Parameters
    ----------
    mu : array
        Permeability in the elements, field, material, ...

    M : array
        Magnetization vector in the elements, field, material, ...

    Nt_tot: scalar
        Number of time steps

    polynomial_coeffs : 2x3 List, optional
        alpha(i,j) coeffs for polynomal expression of alpha1 and alpha2


    Return
    ----------
    magnetostric_tensor : dim * dim * Nt_tot array
        magnetrostictive tensor in the current element for differents time steps


    """
    # Coeffs from a reference material in IEEETranMagn2004
    a10 = polynomial_coeffs[0][0]
    a12 = polynomial_coeffs[0][1]
    a14 = polynomial_coeffs[0][2]
    a20 = polynomial_coeffs[1][0]
    a22 = polynomial_coeffs[1][1]
    a24 = polynomial_coeffs[1][2]

    M_norm = np.linalg.norm(M, axis=(0, 1))  # M matrices are in the first two axes
    mu_times_Mnorm_squared = np.multiply(mu, M_norm) ** 2

    alpha1 = a10 + a12 * mu_times_Mnorm_squared + a14 * mu * mu_times_Mnorm_squared ** 2
    alpha2 = a20 + a22 * mu_times_Mnorm_squared + a24 * mu * mu_times_Mnorm_squared ** 2

    magnetostric_tensor = np.zeros((2, 2, Nt_tot))

    # Iteration over time step
    for ti in range(Nt_tot):
        mu_ti = mu[ti]

        M_times_M = np.dot(M[:, :, ti], np.transpose(M[:, :, ti]))

        M_norm_squared = np.linalg.norm(M[:, :, ti]) ** 2
        I = np.eye(2, 2)

        first_member = -alpha1[ti] * mu_ti * M_times_M
        second_member = -alpha2[ti] * mu_ti * M_norm_squared * I

        magnetostric_tensor[:, :, ti] = first_member + second_member

    return magnetostric_tensor