watermedia op• Data kinds: कोई नहीं → table (केवल arguments से तय होने वाला op — यह कोई image या data input नहीं लेता)
• Call: import fullseye as fs; fs.ledger.cylinder_lens_caustic(radius_mm, n_glass, n_fill=1.0, thickness_wall_mm=0.0, n_rays=41) -> 'dict' (implementation को सीधे call करना हो तो import watermedia; watermedia.cylinder_lens_caustic(radius_mm, n_glass, n_fill=1.0, thickness_wall_mm=0.0, n_rays=41) -> 'dict', registry से लेना हो तो opsoptics.get("cylinder_lens_caustic"))
समानांतर किरण-पुंज में बेलन (छड़ या बोतल) का पैराएक्सियल फोकस और वास्तविक किरणों की caustic -> dict।
> नीचे का विस्तृत विवरण मूल text में है — सारांश और headings का अनुवाद हो चुका है।
thickness_wall_mm = 0 is a solid rod of index n_glass and outer radius radius_mm; thickness_wall_mm > 0 is a hollow tube of that wall thickness filled with a medium of index n_fill (1.0 = empty, 1.333 = water). The light travels along +z across the axis (at the origin) and is bent in the plane of the section. The paraxial focus comes from the 2x2 ray-transfer matrix of the surfaces (efl = -1/C, back focal distance -A/C); for a solid rod it is the closed form f = n R / (2 (n - 1)) measured from the axis, and for a thin-walled tube filled with n_fill the two-interface limit n_fill R / (2 (n_fill - 1)). The real rays are traced surface by surface with the exact vector form of Snell's law at parallel heights from the axis up to 95 % of the clear aperture (the rod, or the fill); focus_z_mm is where each leaves the cylinder and crosses the axis (distance from the axis, NaN if it does not cross), caustic_z_mm / caustic_y_mm the envelope of neighbouring exit rays. The marginal focus (the highest ray that leaves the cylinder before it crosses the axis) is shorter than the paraxial one (positive spherical aberration). The table also has paraxial_focus_mm (from the axis), efl_mm, power_per_mm (C; an empty thin tube has almost none), efl_closed_form_mm, marginal_focus_mm, longitudinal_aberration_mm, heights_mm, paths_z_mm / paths_y_mm (the ray points from the start to the exit) and exit_dir_z / exit_dir_y. n_glass <= 1, n_fill < 1 and a wall as thick as the radius are refused.
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 में दिए गए हैं।
• poc_water_transparent_media — py -3.11 examples/poc_water_transparent_media.py
table को input के रूप में लेते हैं)abcd_matrix · wavefront_stats · sfr_from_edge · paraxial_trace · seidel_coefficients · spot_stats · tolerance_analysis · wavefront_from_opd
watermedia)ocean_spectrum · ocean_height_field · fresnel_water_air · snell_window · refracted_view · water_attenuation · underwater_image · phase_function_hg
*Provenance: watermedia.py — OPTICS operator registry. यह per-op note tools/opdocs.py md से अपने-आप generate होता है (हाथ से edit न करें)।*
© 2026 Kazufumi Furuse — Fullseye operator documentation. Licensed under Apache-2.0.