wave_grating_orders — MATH wave op

• Data kinds: कोई नहीं → table (केवल arguments से तय होने वाला op — यह कोई image या data input नहीं लेता)

• Call: import fullseye as fs; fs.ledger.wave_grating_orders(pitch_um=1.6, wavelength_nm=550.0, sin_in=0.0, orders=(-2, -1, 1, 2)) (implementation को सीधे call करना हो तो import mathops; mathops.wave_grating_orders(pitch_um=1.6, wavelength_nm=550.0, sin_in=0.0, orders=(-2, -1, 1, 2)), registry से लेना हो तो opsmath.get("wave_grating_orders"))

उपयोग

grating हर order को कहाँ भेजता है: d (sin_out - sin_in) = m lambda को angle के लिए हल किया गया।

> नीचे का विस्तृत विवरण मूल text में है — सारांश और headings का अनुवाद हो चुका है।

The companion to the existing grating_wavelengths (which solves the same identity for *lambda*): given the pitch and the wavelength, this returns the outgoing direction of each order, and marks the orders that are evanescent — |sin_out| > 1 means that order does not propagate, which is why a CD shows fewer colours at grazing incidence.

★Why this earns its place: the two ops invert one another, so a round trip must return the wavelength it started from; and the angles can be compared against the peak positions of a *simulated* far field (the existing fraunhofer_pattern of a real grating aperture), which knows nothing about the grating equation.

Returns a table: order, sin_out, angle_deg (NaN when evanescent), propagates.

Raises ValueError: non-positive pitch or wavelength; |sin_in| > 1; order 0 alone with no others (it is always the specular direction — allowed, but a caller asking only for it probably meant something else); non-finite input.

पूरी family का input contract (fail-closed)

mathops के सभी ops गणना से पहले input की जाँच करते हैं (कुछ भी चुपचाप पास नहीं होता):

• complex input से ValueError — float64 में ज़बरदस्ती बदलने पर imaginary part चुपचाप छूट जाता है (numpy केवल ComplexWarning देता है और "सही दिखने वाला पर गलत" real number लौटाता है)। .real/.imag/abs() स्पष्ट रूप से लिखें, या complex data संभालने वाले complexops का उपयोग करें।

• masked array (masked elements वाला) से ValueError — mask हटाकर नीचे के raw values इस्तेमाल करने वाला implicit conversion अस्वीकार है। भरना है या हटाना है, यह स्पष्ट रूप से बताएँ।

• हर input पर NaN/Inf से ValueError (गिनती बताकर अस्वीकार — क्योंकि यह पूरे परिणाम में फैल जाता है)।

• Shape सख़्त है: 1-D और 2-D को implicit रूप से promote या broadcast नहीं किया जाता (vector slot में matrix या matrix slot में vector देने पर ValueError; reshape स्पष्ट रूप से करें)।

• Size की सीमा: matrix लेने वाले ops और stat_histogram के bins, mathops.MAX_ELEMENTS (2^26 ≈ 6.7 करोड़ elements) से अधिक होने पर ValueError देते हैं।

उपयोग की विस्तृत guide

• math_metrology family guide

संदर्भ (sample data, साहित्य)

• Sample data catalog (DL URL / license) — 2-D के लिए skimage.data (BSD/public) + synthetic, 3-D के लिए real data sources (Stanford/PDS आदि) के DL URL।

• Operators का स्रोत और संदर्भ — इस op family के मूल research/methods के स्रोत।

• Algorithm का मानक स्रोत (लेखक, वर्ष) और उपयोग ऊपर की family usage guide में दिए गए हैं।

चलाए जा सकने वाले उदाहरण (verified samples जो सच में यह op call करते हैं)

• poc_beats_fringes_and_screens — py -3.11 examples/poc_beats_fringes_and_screens.py

वे अगले ops जिनसे type जुड़ता है (table को input के रूप में लेते हैं)

dynsys_poincare_section · dwt_inverse · chebyshev_eval_nd

इसी category के (wave)

wave_membrane_mode · wave_mode_frequencies · wave_nodal_lines · wave_two_slit · wave_fringe_period


*Provenance: mathops.py — MATH operator registry. यह per-op note tools/opdocs.py md से अपने-आप generate होता है (हाथ से edit न करें)।*

© 2026 Kazufumi Furuse — Fullseye operator documentation. Licensed under Apache-2.0.