photoelastic op• Data kinds: images → table
• Call: import fullseye as fs; fs.ledger.retardation_unwrap_multiwavelength(deltas_rad, wavelengths_nm, max_retardation_nm, folded=True) (implementation को सीधे call करना हो तो import photoelastic; photoelastic.retardation_unwrap_multiwavelength(deltas_rad, wavelengths_nm, max_retardation_nm, folded=True), registry से लेना हो तो opsoptics.get("retardation_unwrap_multiwavelength"))
• GPU: नहीं (केवल CPU reference implementation)
कई तरंगदैर्घ्यों पर लिपटे मंदन से निरपेक्ष मंदन (nm) निर्धारित करता है (वर्ण-विक्षेपण नहीं माना) → dict।
> नीचे का विस्तृत विवरण मूल text में है — सारांश और headings का अनुवाद हो चुका है।
The retardation R = t·Δn [nm] is assumed independent of wavelength (no dispersion of C). For each pixel, every candidate from the first wavelength, R = (k + f)λ1 (and (k + 1 − f)λ1 when folded, f = δ1/2π), up to max_retardation_nm, is scored by how well it predicts the measured phase at every other wavelength (residual in nm); the best candidate wins.
folded=True is for phases in [0, π] that cannot tell δ from 2π − δ (photoelastic_phase_estimate with stokes6); folded=False is for phases wrapped into [0, 2π).
Returns retardation_nm, delta_rad (the unwrapped phase at the first wavelength), residual_nm (best score), margin_nm (second best − best, among candidates more than λ_min/4 away from the answer: when it is small another order fits almost as well — add a wavelength or reduce max_retardation_nm) and valid: False where no candidate up to max_retardation_nm exists for that pixel (its first-wavelength phase alone already needs more), and the four numbers are NaN there.
Raises ValueError: fewer than 2 wavelengths, mismatched counts or shapes, wavelengths outside [10, 20000] nm or repeated, phases outside [0, π] (folded) / [0, 2π) (unfolded), a range over 1000 waves, or a max_retardation_nm below the smallest candidate of every pixel.
optics के सभी ops गणना से पहले input की जाँच करते हैं (कुछ भी चुपचाप पास नहीं होता):
• Unit argument के नाम में ही लिखी होती है — _mm / _um / _deg / _mrad। mm और µm की गड़बड़ी crash नहीं करती, बल्कि "सही दिखने वाला पर गलत उत्तर" देती है, इसलिए नाम से इसे रोका जाता है। मान के आकार से unit का अनुमान बिल्कुल नहीं लगाया जाता।
• String से ValueError — float('50') सफल हो जाता है, इसलिए बिना parse किया config value length के रूप में निकल जाता (मापा गया: thin_lens('50', '200') सही दिखने वाला 66.667 mm लौटा रहा था)। bool को भी True == 1 वाले implicit promotion के रूप में अस्वीकार किया जाता है।
• complex / masked array से ValueError (केवल real-valued slots; imaginary part को चुपचाप छोड़ना या mask हटाना अस्वीकार)। हर input पर NaN/Inf से ValueError।
• शून्य से भाग और उससे जुड़े मामलों को नाम लेकर अस्वीकार किया जाता है: focal length 0, radius of curvature 0, refractive index <= 0, पूरी तरह opaque aperture (सब 0, इसलिए normalisation 0/0), ऐसा PSF जिसका योग <= 0 हो, S0 = 0 वाला Stokes vector, और front focal point पर रखा object (image अनंत पर)।
• केवल 2 ops non-finite value लौटाते हैं, और वह भी contract के रूप में लिखा हुआ: depth_of_field hyperfocal distance से आगे far_mm = inf (hyperfocal distance की परिभाषा यही है) और gaussian_beam waist पर wavefront_radius_mm = inf (plane wavefront की radius of curvature)। दोनों साथ में एक finite साथी (far_is_infinite / curvature_per_mm) भी लौटाते हैं। इसके अलावा कोई भी चुपचाप आया NaN/Inf अंदर ही पकड़ा जाता है और ValueError देता है — "float64 overflow हुआ" और "उत्तर अनंत है" अलग-अलग दावे हैं, इसलिए पहले को दूसरे का चेहरा पहनाकर नहीं लौटाया जाता।
• Size की सीमा: generate होने वाले grid के लिए optics.MAX_GRID (4096), दिए गए field/PSF/aperture के लिए optics.MAX_FIELD_ELEMENTS (2^24), ABCD element chain के लिए optics.MAX_SYSTEM_ELEMENTS (1024), Zernike के लिए MAX_ZERNIKE_TERMS (512) / MAX_ZERNIKE_ORDER (40) / MAX_ZERNIKE_BASIS (2^25)। छोटे argument से बहुत बड़ा internal allocation होने वाले रास्तों (मापा गया: n_max=40 × 4096² पर 108 GB) को fail-closed ढंग से बंद किया गया है।
• भौतिक रूप से असंभव states भी अस्वीकार: degree of polarisation > 1 वाला Stokes vector, ऋणात्मक transmittance, ऋणात्मक intensity, और n-|m| odd जैसे अमान्य Zernike indices।
• 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 में दिए गए हैं।
• photoelastic_roundtrip — py -3.11 examples/photoelastic_roundtrip.py
table को input के रूप में लेते हैं)abcd_matrix · wavefront_stats · sfr_from_edge · paraxial_trace · seidel_coefficients · spot_stats · tolerance_analysis · wavefront_from_opd
photoelastic)brazilian_disc_stress · kirsch_plate_stress · principal_stress · retardation_from_birefringence · photoelastic_retardation · retardation_convert · cubic_photoelastic_birefringence · silicon_piezo_optic_coefficients
*Provenance: photoelastic.py — OPTICS operator registry. यह per-op note tools/opdocs.py md से अपने-आप generate होता है (हाथ से edit न करें)।*
© 2026 Kazufumi Furuse — Fullseye operator documentation. Licensed under Apache-2.0.