Spaces:
Running
Running
import gradio as gr | |
import numpy as np | |
title="计算X射线在材料中的穿透深度" | |
description=""" | |
此程序计算的X射线为Cu Ka,波长为1.5406 埃,对应的能量为8.04 keV (查元素质量衰减系数时用) \n | |
角度的单位为:° \n | |
密度的单位为:g/cm\u00b3 \n | |
packing: 表示粉体压实的程度,压的越实值越大,最大为1。块材默认为1 \n | |
HighScore:可计算大入射角,一般用于XRD计算 \n | |
临界角全反射模型:可计算小入射角,一般用于GIXRD计算 \n | |
元素的相对原子质量和质量衰减系数可在页面底部链接查询 \n | |
""" | |
article = "<p style='text-align: center'><a href='https://physics.nist.gov/PhysRefData/XrayMassCoef/tab3.html' target='_blank'>元素质量衰减系数</a></p><p style='text-align: center'><a href='https://baike.baidu.com/item/%E7%9B%B8%E5%AF%B9%E5%8E%9F%E5%AD%90%E8%B4%A8%E9%87%8F%E8%A1%A8/9731404' target='_blank'>相对原子质量表</a></p></center><center><img src='https://visitor-badge.glitch.me/badge?page_id=kingabzpro/Rick_and_Morty_Bot' alt='visitor badge'></center></p>" | |
def calc_X_ray_penetration(incident_angle,density, packing, calc_equation, chemical_formula): | |
n=len(chemical_formula['元素']) | |
t_atom_number=chemical_formula['原子个数'] | |
t_relative_atomic_mass=chemical_formula['相对原子质量'] | |
t_um=chemical_formula['质量衰减系数'] | |
t_a_m=0 | |
for i in range(n): | |
t_a_m+=float(t_atom_number[i])*float(t_relative_atomic_mass[i]) | |
um=0 | |
for i in range(n): | |
um+=float(t_um[i])*(float(t_atom_number[i])*float(t_relative_atomic_mass[i])/t_a_m) | |
u=um*density | |
if calc_equation=="HighScore": | |
# # np.sin 需要把计算时需要把°换成弧度 | |
d=0.5*np.log(100)/u*np.sin(incident_angle/180.*np.pi) | |
d=d*1e4 | |
return f" 材料的质量衰减系数为:{um:.2f} cm\u00b2/g\n 材料的线衰减系数为:{u:.2f} cm\u207B\u00b9\n X射线在材料中的穿透深度为:{d:.4f} um" | |
# return np.array([d,u]) | |
if calc_equation=="临界角全反射模型": | |
ac=1.6e-3*np.sqrt(density)*1.5406 | |
a=incident_angle/180*np.pi | |
if a<ac: | |
d=1.5406/(2*np.pi*(ac**2-np.sin(a)**2)**0.5) | |
d=d/10 | |
return f" 材料的质量衰减系数为:{um:.2f} cm\u00b2/g\n 材料的线衰减系数为:{u:.2f} cm\u207B\u00b9\n X射线在材料中的穿透深度为:{d:.4f} nm" | |
else: | |
d=2*a/u | |
d=d*1e4 | |
return f" 材料的质量衰减系数为:{um:.2f} cm\u00b2/g\n 材料的线衰减系数为:{u:.2f} cm\u207B\u00b9\n X射线在材料中的穿透深度为:{d:.4f} um" | |
demo=gr.Interface( | |
fn=calc_X_ray_penetration, | |
inputs=[ | |
gr.Number(value=1,label='入射角 (°)'), | |
gr.Number(value=5.6, label="密度 (g/cm\u00b3)"), | |
gr.Number(value=1,label='packing'), | |
gr.Radio(["HighScore","临界角全反射模型"]), | |
gr.Dataframe( | |
headers=["元素","原子个数","相对原子质量","质量衰减系数"], | |
datatype=['str','number','number','number'], | |
row_count=1, | |
col_count=(4, "fixed"), | |
label="请输入材料化学式及相应原子信息", | |
), | |
], | |
outputs=["text"], | |
examples=[ | |
[30,5.98,1, "HighScore", [["Zr", 1, 91, 135.6], ["O", 2, 16, 11.63]]], | |
[1,3.97,1, "临界角全反射模型", [["Al",2, 27,50.33], ["O",3, 16, 11.63]]], | |
], | |
title = title, | |
description = description, | |
article = article | |
) | |
demo.launch(enable_queue=True) |