photoelastic op• Data kinds: image2d → image2d
• Call: import fullseye as fs; fs.ledger.polariscope_intensity(delta_rad, axis_deg=45.0, setup='plane_dark', polarizer_deg=0.0, intensity=1.0) (implementation को सीधे call करना हो तो import photoelastic; photoelastic.polariscope_intensity(delta_rad, axis_deg=45.0, setup='plane_dark', polarizer_deg=0.0, intensity=1.0), registry से लेना हो तो opsoptics.get("polariscope_intensity"))
• GPU: हाँ (allow-list का mechanical GPU path, CuPy)। device="auto" मापे गए आकार (4,194,304 pixel) और उससे बड़े पर GPU चुनता है
समतल और वृत्तीय पोलारिस्कोप के अंधकार और उज्ज्वल क्षेत्र की तीव्रता (आइसोक्रोमैटिक और आइसोक्लिनिक) का बंद रूप।
> नीचे का विस्तृत विवरण मूल text में है — सारांश और headings का अनुवाद हो चुका है।
intensity is the intensity of the polarised beam leaving the first polariser. With retardance δ and principal (isoclinic) direction θ:
• circular_dark I sin²(δ/2) — isochromatics only (dark at N = 0, 1, 2 …)
• circular_bright I cos²(δ/2) — dark at N = ½, 3/2 …
• plane_dark (crossed, polariser at β) I sin²(2(θ−β)) sin²(δ/2) — isochromatics × isoclinics (dark where θ = β or β+90°)
• plane_bright (parallel) I [1 − sin²(2(θ−β)) sin²(δ/2)]
The default is the crossed plane polariscope (the basic setup, where both the axis and the polariser angle matter); when only δ is given the principal axes are taken at 45 deg to the polariser, where the plane polariscope shows the isochromatics at full contrast (at 0 deg the field is dark everywhere — that is an isoclinic, not "no stress"). These equal the Mueller chain built from optics.mueller_element (the tests compare them). Returns an array of the broadcast shape.
Raises ValueError: an unknown setup, non-finite inputs, a negative intensity, or |δ| beyond 200 fringes (a retardation in nm passed as rad).
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। घोषित अपवाद: bottle_fit_from_pattern का u_map न मापे जा सके पिक्सेल को NaN के रूप में लेता है (अनंत अब भी अस्वीकार)।
• शून्य से भाग और उससे जुड़े मामलों को नाम लेकर अस्वीकार किया जाता है: 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 हुआ" और "उत्तर अनंत है" अलग-अलग दावे हैं, इसलिए पहले को दूसरे का चेहरा पहनाकर नहीं लौटाया जाता। घोषित अपवाद: bottle_background_map जिन पिक्सेल की किरण अनुपयोगी है (पूर्ण आंतरिक परावर्तन आदि) उनके लिए u_mm में NaN लौटाता है, साथ में valid मास्क और गिनती भी।
• 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
• poc_photoelasticity — py -3.11 examples/poc_photoelasticity.py
image2d को input के रूप में लेते हैं)fraunhofer_pattern · pupil_psf · pupil_blur · psf_to_mtf · encircled_energy · ensquared_energy · energy_radii · mtf_tangential_sagittal
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.