matprop op• 데이터 종류: 없음 → pairs(인자만으로 정해지는 연산자 —— 이미지나 데이터 입력을 받지 않습니다)
• 호출: import fullseye as fs; fs.ledger.material_transmittance(material='SI', thickness_mm: 'float' = 0.7, wl_min_nm: 'float' = 900.0, wl_max_nm: 'float' = 1400.0, n_points: 'int' = 101, include_fresnel: 'bool' = True, extra_absorption=None, doping_cm3=None, carrier: 'str' = 'n') -> 'np.ndarray'(구현을 직접 호출하려면 import materials; materials.material_transmittance(material='SI', thickness_mm: 'float' = 0.7, wl_min_nm: 'float' = 900.0, wl_max_nm: 'float' = 1400.0, n_points: 'int' = 101, include_fresnel: 'bool' = True, extra_absorption=None, doping_cm3=None, carrier: 'str' = 'n') -> 'np.ndarray', 원장에서 가져오려면 opsoptics.get("material_transmittance"))
• GPU: 없음(CPU 참조 구현만)
두께 thickness_mm의 평행 평판 투과율 T(λ)을 pairs(λ [nm], T)로 반환.
T = (1 − R)² e^{−αt} / (1 − R² e^{−2αt}) (양쪽 면의 다중 반사를 합산한 비간섭식이며, R은 수직 입사에서 |(m − 1)/(m + 1)|², α = 4πk/λ). include_fresnel=False이면 내부 투과율 e^{−αt}만 반환한다(유리 카탈로그의 ‘내부 투과율’과 같은 양). 두께 0에서는 include_fresnel=True이면 T=(1-R)/(1+R), False이면 1이며, 음수 또는 비유한 두께는 ValueError를 일으킨다.
extra_absorption: 재료표에 없는 흡수를 더하는 pairs(λ [nm], α [1/cm]). 예를 들어 도핑된 Si의 자유 운반자 흡수에는 silicon_free_carrier_absorption(1e19, "n", ...)을 그대로 전달한다. 격자의 모든 파장을 포함해야 하며(외삽하지 않음), 음의 α도 ValueError를 일으킨다. 표면 반사 R은 재료표의 n,k를 그대로 쓴다(자유 운반자에 의한 작은 n 변화는 무시).
doping_cm3 / carrier: None(기본값)이면 도핑되지 않은 재료표를 그대로 쓴다. 값을 지정하면 silicon_free_carrier_absorption을 통해 carrier("n" 또는 "p")의 자유 운반자 흡수를 더한다. 현재는 SI만 지원하며 다른 재료는 재료명이 포함된 ValueError를 일으킨다. 도핑 농도가 음수나 비유한 값이거나 carrier가 선택지 밖이면 ValueError를 일으킨다. 자유 운반자 흡수를 먼저 더하고 extra_absorption을 나중에 더하며, 표면 반사에는 도핑되지 않은 재료표의 n,k를 쓴다.
optics 의 모든 연산자는 입력을 검증한 뒤에 계산합니다(조용히 통과시키지 않습니다):
• 단위는 인자 이름에 넣습니다 — _mm / _um / _deg / _mrad. mm 와 µm 를 혼동하면 crash 가 아니라 「그럴듯하게 틀린 답」이 나오므로 이름으로 막습니다. 크기로 단위를 추측하는 처리는 일절 하지 않습니다.
• 문자열은 ValueError —— float('50') 은 성공하므로 파싱되지 않은 설정값이 길이로 통과해 버립니다(실측: thin_lens('50', '200') 이 그럴듯한 66.667 mm 를 돌려주고 있었습니다). bool 도 True == 1 의 암묵 승격으로 보고 거부합니다.
• complex / masked array 는 ValueError(실수 슬롯만. 허수부의 무언 절삭·마스크 벗기기를 거부).NaN/Inf 는 모든 입력에서 ValueError.단, 선언된 결측은 예외: bottle_fit_from_pattern 의 u_map 은 측정하지 못한 픽셀을 NaN 으로 받습니다(∞ 는 여전히 거부).
• 0 나눗셈과 그 친척들을 이름을 들어 거부: 초점거리 0, 곡률반경 0, 굴절률 <= 0, 불투명한 조리개(전부 0 이라 정규화가 0/0), 총합 <= 0 인 PSF, S0 = 0 인 스토크스 벡터, 물체가 앞쪽 초점에 있는 경우(상이 무한대).
• 비유한 값을 돌려주는 것은 2 개 연산자뿐이며, 둘 다 계약으로 명시: depth_of_field 의 과초점거리 너머 far_mm = inf(그것이 과초점거리의 정의)와 gaussian_beam 의 허리에서의 wavefront_radius_mm = inf(평면 파면의 곡률반경). 둘 다 유한한 짝(far_is_infinite / curvature_per_mm)을 함께 돌려줍니다. 그 밖의 무언 NaN/Inf 는 내부에서 검출해 ValueError —— 「float64 가 넘쳤다」와 「답이 무한대다」는 다른 주장이므로, 후자의 얼굴로 전자를 돌려주지 않습니다.단, 선언된 결측은 예외: bottle_background_map 은 광선을 쓸 수 없는 픽셀(전반사 등)의 u_mm 을 NaN 으로 돌려주며, valid 마스크와 개수를 함께 돌려줍니다.
• 크기 상한: 생성 격자는 optics.MAX_GRID(4096), 넘겨받은 필드/PSF/조리개는 optics.MAX_FIELD_ELEMENTS(2^24), ABCD 소자열은 optics.MAX_SYSTEM_ELEMENTS(1024), Zernike 는 MAX_ZERNIKE_TERMS(512)/ MAX_ZERNIKE_ORDER(40)/ MAX_ZERNIKE_BASIS(2^25). 작은 인자에서 거대한 내부 할당이 일어나는 경로(실측: n_max=40 × 4096² 로 108 GB)를 fail-closed 로 막습니다.
• 물리적으로 불가능한 상태도 거부: 편광도 > 1 인 스토크스 벡터, 음의 투과율, 음의 강도, n-|m| 이 홀수인 잘못된 Zernike 첨자 등.
• 샘플 데이터 카탈로그(DL URL / 라이선스) —— 2-D 는 skimage.data(BSD/public)+ 합성, 3-D 는 실데이터 소스(Stanford/PDS 등)의 DL URL.
• 연산자의 내력·참고문헌 —— 이 연산자 족의 바탕이 된 연구/기법의 출처.
• 알고리즘의 정전(저자·연도)과 용도는 위의 패밀리 사용 가이드에 적혀 있습니다.
• poc_fiber_light_guide — py -3.11 examples/poc_fiber_light_guide.py
• poc_material_optical_library — py -3.11 examples/poc_material_optical_library.py
• poc_nir_silicon_transmission — py -3.11 examples/poc_nir_silicon_transmission.py
pairs 를 입력으로 받는 것)mtf50 · energy_to_photons · spectral_product · spectral_integral · spectral_integral_table · spectral_stats · kubelka_munk_reflectance · hyperspectral_capture
matprop)material_table · material_record · material_acoustic · acoustic_impedance_mismatch · material_optical_constants · material_dispersion · material_extinction · material_absorption
*Provenance: materials.py — OPTICS 연산자 레지스트리. 이 op 노트는 tools/opdocs.py md 가 자동 생성합니다(직접 편집하지 마세요).*
© 2026 Kazufumi Furuse — Fullseye operator documentation. Licensed under Apache-2.0.