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

v440hwme  于 2021-09-29  发布在  Java
关注(0)|答案(0)|浏览(203)

我正在努力学习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

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, radii, 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, rMax, 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

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题