brazilian_disc_stress — OPTICS photoelastic op

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

• Call: import fullseye as fs; fs.ledger.brazilian_disc_stress(radius_m=0.025, thickness_m=0.006, load_n=500.0, size=129, x=None, y=None) (implementation को सीधे call करना हो तो import photoelastic; photoelastic.brazilian_disc_stress(radius_m=0.025, thickness_m=0.006, load_n=500.0, size=129, x=None, y=None), registry से लेना हो तो opsoptics.get("brazilian_disc_stress"))

• GPU: नहीं (केवल CPU reference implementation)

उपयोग

व्यास की दिशा में दबाई गई डिस्क (ब्राज़ीलियन डिस्क) के समतल प्रतिबल σx, σy, τxy का बंद रूप → dict।

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

Diametrically compressed disc, point loads load_n [N] at (0, ±R) acting along the y axis, plane stress (Hondros / Frocht)::

r1² = x² + (R−y)², r2² = x² + (R+y)², k = 2P/(π t)

σx = −k [ x²(R−y)/r1⁴ + x²(R+y)/r2⁴ − 1/(2R) ]

σy = −k [ (R−y)³/r1⁴ + (R+y)³/r2⁴ − 1/(2R) ]

τxy = k [ x(R−y)²/r1⁴ − x(R+y)²/r2⁴ ]

Stresses are in Pa (tension positive). At the centre σx = 2P/(πDt) and σy = −6P/(πDt). The free rim carries no traction except at the two load points, where the point-load solution is singular.

Parameters

radius_m, thickness_m : disc radius and thickness [m].

load_n : the compressive load P [N] (positive = compression).

size : grid size (odd puts the centre on a pixel) when x/y are not given.

x, y : optional evaluation points [m] (arrays that broadcast). Points

outside the disc or exactly on a load point are refused.

Returns

dict with sxx, syy, txy [Pa], x, y [m], inside (bool; on the grid, the rim pixel ring and the pixels next to the load points are False and their stresses are 0 — the point-load singularity is not a measurement), pixel_m (grid spacing, or 0 for explicit points).

Raises ValueError: non-finite or non-positive radius / thickness / load, a thickness that looks like millimetres, only one of x/y, points outside the disc or on a load point.

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

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।

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

• optics_imaging 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 करते हैं)

• photoelastic_roundtrip — py -3.11 examples/photoelastic_roundtrip.py

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

abcd_matrix · wavefront_stats · sfr_from_edge · paraxial_trace · seidel_coefficients · spot_stats · tolerance_analysis · wavefront_from_opd

इसी category के (photoelastic)

kirsch_plate_stress · principal_stress · retardation_from_birefringence · photoelastic_retardation · retardation_convert · cubic_photoelastic_birefringence · silicon_piezo_optic_coefficients · polariscope_intensity


*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.