zhang0209's picture
Update app.py
ed99d8a
raw
history blame contribute delete
No virus
3.8 kB
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
需要注意的是:这里clear不能用,请不要点,否则需要刷新页面。如果多输入了一行,则把那一行全部置为0即可
"""
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)