spectrum: Fix element pattern on reversed-direction 3GPP channels
ThreeGppChannelModel generates the cluster angles in canonical node-id order and GetNewChannel swaps the departure/arrival ray angles when the GetChannel query order is reversed (the transmitter node id is greater than the receiver node id). The swap was applied to the array phase terms but the per-element field-pattern angle inputs still read the raw, un-swapped channelParams->m_ray*Radian arrays. With a directional element (e.g. the 3GPP OUTDOOR pattern, ~30 dB front-to-back) the field pattern was then evaluated ~180 degrees off on reversed-direction links, applying the back-null gain to the NLOS clusters and collapsing the channel power by ~30 dB. LOS links masked it because their deterministic LOS ray uses the call-order geometry. This surfaced as a deep, unphysical low tail in the contrib/nr REM CoverageArea map (NLOS pixels ~30 dB too weak).
Read the direction-corrected ray-angle references for the field pattern, matching the phase-term math. Add a regression test (ThreeGppReversedDirectionFieldPatternTest) asserting the channel Frobenius norm is independent of the GetChannel endpoint order when a directional element is used.
Co-Authored-By: Claude Opus 4.8 noreply@anthropic.com
With this, we fix a longstanding issue we spotted earlier but that we didn't manage to track down.
