Source code for ultrasphere_harmonics._core._concat

from collections.abc import Mapping

from array_api._2024_12 import Array
from array_api_compat import array_namespace
from ultrasphere import SphericalCoordinates


[docs] def concat_harmonics[TSpherical, TCartesian]( c: SphericalCoordinates[TSpherical, TCartesian], harmonics: Mapping[TSpherical, Array], ) -> Array: """ Concatenate the mapping of expanded harmonics. Parameters ---------- c : SphericalCoordinates[TSpherical, TCartesian] The spherical coordinates. harmonics : Mapping[TSpherical, Array] The expanded harmonics. Returns ------- Array The concatenated harmonics. Example ------- >>> from array_api_compat import numpy as np >>> from ultrasphere import create_spherical >>> from ultrasphere_harmonics import harmonics >>> c = create_spherical() >>> harm = harmonics( ... c, ... {"theta": np.asarray(0.5), "phi": np.asarray(1.0)}, ... n_end=2, ... phase=0, ... concat=False, ... ) >>> {k: np.round(harm[k], 2) for k in c.s_nodes} {'theta': array([[0.71, 0. , 0. ], [1.07, 0.42, 0.42]]), 'phi': array([[0.4 +0.j , 0.22+0.34j, 0.22-0.34j]])} >>> np.round(concat_harmonics(c, harm), 2) array([[0.28+0.j , 0. +0.j , 0. +0.j ], [0.43+0.j , 0.09+0.14j, 0.09-0.14j]]) """ xp = array_namespace(*[harmonics[k] for k in c.s_nodes]) try: if c.s_ndim == 0: return xp.asarray(1) return xp.prod( xp.stack(xp.broadcast_arrays(*[harmonics[k] for k in c.s_nodes]), axis=0), axis=0, ) except Exception as e: shapes = {k: v.shape for k, v in harmonics.items()} e.add_note(f"Harmonics shapes: {shapes}") raise