我错过了什么吗? RDF径向分布脚本无法捕获正确的 .xyz

问题描述

我正在尝试了解 RDF 的工作原理。为了了解 RDF 在实践中是如何工作的,我正在通过使用这个 .xyz 文件示例打印所有变量来测试脚本(如下):

我正确传递了笛卡尔坐标数据,边界条件和打印的变量是正确的,我通过手动计算进行了检查。

然而,结果图仅在 y = 0显示一条平线。 可能我错过了一些小东西,但我无法抓住它。 我在这里错过了什么吗?

      16
Energy           -200.0
A            1.977502779         1.825612486        -1.078815994
A            0.073484389        -2.915354734        -1.169129839
A           -1.682844787        -1.543503043        -2.245494959
A            0.226989000         0.103121000        -0.417822000
B            -0.693058883         0.156772052         1.151824239
B            -1.448474661        -3.517890885        -2.298992143
B            -1.458396055        -1.997135497        -0.344566446
B             0.985126104        -4.427396897        -0.775735938
B            -3.121800014        -1.219516661        -3.292662828
B             2.017385825         0.679529254         0.430803534
B             0.212637914        -1.726148783        -2.725852021
B             3.217540502         3.061671270        -1.526834132
B             1.456477430         0.338098844        -2.124519369
B            -1.187423538         0.191670365        -1.675742064
B             0.143729055         2.143022931        -0.717464213
B             1.083320805        -1.581985916        -0.284118283

打印的变量是

edges: [-12.    -11.999 -11.998 ...   1.199   1.2     1.201]
num_increments: 13201
x is [ 0.648635 -0.712093  1.175089  2.536351  0.431639  0.68227   1.776624
2.48202  -2.049614  2.48957  -1.061626  0.443473  0.890669 -0.407062
1.391732  3.873991]
len(x) is 16
S is 12
numberDensity is 0.009259259259259259
d is [4.16134966 5.64980835 4.16167321 1.64793118 5.16051574 4.84601737
2.79507052 3.09205521 7.29774691 2.7948553  5.45595986 5.45590615
3.0918364  4.84603638 5.16043525 2.4       ]
g[p,:]: [0. 0. 0. ... 0. 0. 0.]
result is [0 0 0 ... 0 0 0]
numberDensity is 0.009259259259259259

enter image description here

def pairCorrelationFunction_3D(x,y,z,S,rMax,dr):
"""Compute the three-dimensional pair correlation function for a set of
spherical particles contained in a cube with side length S.  This simple
function finds reference particles such that a sphere of radius rMax drawn
around the particle will fit entirely within the cube,eliminating the need
to compensate for edge effects.  If no such particles exist,an error is
returned.  Try a smaller rMax...or write some code to handle edge effects! ;)
Arguments:
    x               an array of x positions of centers of particles
    y               an array of y positions of centers of particles
    z               an array of z positions of centers of particles
    S               length of each side of the cube in space
    rMax            outer diameter of largest spherical shell
    dr              increment for increasing radius of spherical shell
Returns a tuple: (g,radii,interior_indices)
    g(r)            a numpy array containing the correlation function g(r)
    radii           a numpy array containing the radii of the
                    spherical shells used to compute g(r)
    reference_indices   indices of reference particles
"""
from numpy import zeros,sqrt,where,pi,mean,arange,histogram

# Find particles which are close enough to the cube center that a sphere of radius
# rMax will not cross any face of the cube
bools1 = x > rMax
bools2 = x < (S - rMax)
bools3 = y > rMax
bools4 = y < (S - rMax)
bools5 = z > rMax
bools6 = z < (S - rMax)

interior_indices,= where(bools1 * bools2 * bools3 * bools4 * bools5 * bools6)
num_interior_particles = len(interior_indices)

if num_interior_particles < 1:
    raise  RuntimeError ("No particles found for which a sphere of radius rMax\
            will lie entirely within a cube of side length S.  Decrease rMax\
            or increase the size of the cube.")

edges = arange(-S,rMax + 1.1 * dr,dr)
num_increments = len(edges) - 1
g = zeros([num_interior_particles,num_increments])
radii = zeros(num_increments)
numberDensity = len(x) / S**3

# Compute pairwise correlation for each interior particle
for p in range(num_interior_particles):
    index = interior_indices[p]
    d = sqrt((x[index] - x)**2 + (y[index] - y)**2 + (z[index] - z)**2)
    d[index] = 2 * rMax

    (result,bins) = histogram(d,bins=edges,normed=False)
    g[p,:] = result / numberDensity

# Average g(r) for all interior particles and compute radii
g_average = zeros(num_increments)
for i in range(num_increments):
    radii[i] = (edges[i] + edges[i+1]) / 2.
    rOuter = edges[i + 1]
    rInner = edges[i]
    g_average[i] = mean(g[:,i]) / (4.0 / 3.0 * pi * (rOuter**3 - rInner**3))

return (g_average,interior_indices)
# Number of particles in shell/total number of particles/volume of shell/number density
# shell volume = 4/3*pi(r_outer**3-r_inner**3)



# preprocess the structure file (struc)
a_file = open(struc)
lines = a_file.readlines()
a_file.close()

# del first two lines
del lines[0]
del lines[0]

df = pd.read_fwf(struc)
df.to_csv('struc_file.csv')

df.dropna(inplace = True)

column_label = ["ID","type","b","c"]
df = pd.read_csv('struc_file.csv',names=column_label)

df = df.drop([0,1])    # first and second row
df = df.drop(columns = ["ID"])
new = df["b"].str.split(" ",n = 1,expand = True)

df["x"] = new[0]
df["y"] = new[1]
df["z"] = df["c"]
df = df.drop(columns = ["b","c"])
df = df.reset_index(drop=True)


# Calculation setup
domain_size = 12
num_particles = 10

dr = 0.001
particle_radius = 0.1
rMax = domain_size / 10

g_r,r,reference_indeces = pairCorrelationFunction_3D(x_particle,y_particle,z_particle,domain_size,dr)

plt.figure()
plt.plot(r,g_r,color='black')
plt.xlabel('r')
plt.ylabel('g(r)')
plt.xlim( (-rMax,rMax) )
plt.ylim( (0,1.05 * g_r.max()) )
plt.show()
#The script is from https://github.com/cfinch/Shocksolution_Examples/blob/master/PairCorrelation/example_3D.py

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)