外延薄膜峰位拟合(动力学)

晶格构建

衬底晶格

1
2
3
LaSrAlO4 = predefined_materials.LaSrAlO4

layer_LaSrAlO4 = xu.simpack.Layer(LaSrAlO4, inf)

薄膜晶格

对于没有预定义弹性张量cij的需要在material中自己定义。举例如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
def TetragonalElasticTensor(c11, c12, c13, c33, c44, c66):
"""
Assemble the 6x6 matrix of elastic constants for a Tetragonal material from the
six independent components of a Tetragonal crystal

Parameters
----------
c11, c12, c13, c33, c44, c66 : float
independent components of the elastic tensor of cubic materials

Returns
-------
cij : ndarray
6x6 matrix with elastic constants
"""
m = numpy.zeros((6, 6), dtype=numpy.double)
m[0, 0] = c11
m[1, 1] = c11
m[2, 2] = c33
m[3, 3] = c44
m[4, 4] = c44
m[5, 5] = c66
m[0, 1] = m[1, 0] = c12
m[0, 2] = m[2, 0] = c13
m[1, 2] = m[2, 1] = c13

return m

然后在自己的代码中输入对应的值(文献中或第一性原理计算的结果),此处我采用的第一性原理计算出的结果(感谢帮我计算的师弟)。

1
2
3
4
5
from xrayutilities.materials import predefined_materials, material

cij_LaSrCuO4_x15 = material.TetragonalElasticTensor(292.6724, 78.577,
109.0409, 273.2590,
45.8345, 52.4724)

检查一下输出的矩阵是否文献中或第一性原理计算的结果一致。

现在开始构建薄膜的晶体结构,同样在predefined_materials.py定义(注意导入定义的cij函数)。

1
2
3
4
5
6
7
8
9
10
11
LaSrCuO4 = Crystal("LaSrCuO4", SGLattice(139, 3.7793, 13.20000,    #x =0.15
atoms=[e.La, e.Sr, e.Al, e.O, e.O],
pos=[('4e',0.3609),
('4e',0.3609),
'2a',
'4c',
('4e',0.18400)],
occ=[0.925, 0.075, 1, 1, 1]),
TetragonalElasticTensor(292.6724, 78.577,
109.0409, 273.2590,
45.8345, 52.4724))

样品的构建与模拟参量的设置

1
pstack = xu.simpack.PseudomorphicStack001('list', layer_LaSrAlO4, layer_LaSrCuO4)

正如函数名称所示,PseudomorphicStack 目前仅适用于 (001) 表面和立方材料。模块作者计划实现其他表面方向,但目前还没有太多进展。

下面进行模拟参量的构建

1
2
3
4
5
6
7
8
9
10
11
12
13
thetaMono = arcsin(wavelength/(2 * xu.materials.Ge.planeDistance(2, 2, 0)))
Cmono = cos(2 * thetaMono)
dyn = xu.simpack.DynamicalModel(pstack, I0=15e6, background=0,
resolution_width=2e-3, polarization='both',
Cmono=Cmono)
fitmdyn = xu.simpack.FitModel(dyn)
fitmdyn.set_param_hint('LaSrCuO4_c', vary=True, min=13.1, max=13.3)
fitmdyn.set_param_hint('LaSrCuO4_a', vary=True, min=3.6, max=3.9)


fitmdyn.set_param_hint('LaSrAlO4_a', vary=True)
fitmdyn.set_param_hint('resolution_width', vary=True)
params = fitmdyn.make_params()

执行模拟并绘图

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
f = figure(figsize=(7, 5))
semilogy(x1, y1, 'o-', ms=3, label='data')

# perform fit and plot the result
fitmdyn.lmodel.set_hkl((0, 0, 6))
ai = (x1)/2
fitr = fitmdyn.fit(y1, params, ai)
print(fitr.fit_report())

simdyn = fitmdyn.eval(fitr.params, x=x1/2)
plot(x1, simdyn, label='sim')

# label the plot
ylabel('Intensity (counts)')
xlabel('2Theta (deg)')
legend()
#ylim(2e1, 1e9)
xlim(36, 47)
tight_layout()
show()