0

I am trying to calculate the pair correlation function from a given FDF file. It computes the three-dimensional pair correlation function for a set of spherical particles in the LatticeVectors. 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.

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

My code is:

def pair_correlation_function(label=None, path="i*", dr=0.1, plot_=True):
    fdfpath = glob.glob(f"{path}{os.sep}{label}.fdf")[0]
    x, y, z = coords(fdfpath)
    x = np.array(x)
    y = np.array(y)
    z = np.array(z)
    sx, sy, sz = lattice_vectors_mag(fdfpath)
    _, _, species_ = species(fdfpath)
    rmax = max(element_diameter(specie) for specie in species_)
    bools1 = x > rmax
    bools2 = x < sx - rmax
    bools3 = y > rmax
    bools4 = y < sy - rmax
    bools5 = z > rmax
    bools6 = z < sz - rmax
    (interior_indices,) = np.where(bools1 * bools2 * bools3 * bools4 * bools5 * bools6)
    num_interior_particles = len(interior_indices)
    if num_interior_particles < 1:
        raise RuntimeError("No particles found. Increase the LatticeVectors.")
    edges = np.arange(0.0, rmax + 1.1 * dr, dr)
    num_increments = len(edges) - 1
    g = np.zeros([num_interior_particles, num_increments])
    radii = np.zeros(num_increments)
    numberdensity = len(x) / sx * sy * sz
    for p in range(num_interior_particles):
        index = interior_indices[p]
        d = np.sqrt((x[index] - x)**2 + (y[index] - y)**2 + (z[index] - z)**2)
        d[index] = 2 * rmax
        result, bins = np.histogram(d, bins=edges, density=False)
        g[p, :] = result / numberdensity
    g_average = np.zeros(num_increments)
    for i in range(num_increments):
        radii[i] = (edges[i] + edges[i + 1]) / 2.0
        router = edges[i + 1]
        rinner = edges[i]
        g_average[i] = np.mean(g[:, i]) / (4.0 / 3.0 * np.pi * (router**3 - rinner**3))
    return g_average, radii, interior_indices

I am getting TypeError: '>' not supported between instances of 'numpy.ndarray' and 'float' error for the line bools1 = x > rmax.

1
  • well, as the error suggests, you are trying to compare a numpy.ndarray with a float. What are you trying to achieve with rmax = max(element_diameter(specie) for specie in species_)? This returns one single value. Commented Sep 28, 2022 at 9:23

2 Answers 2

3

Check the elements in numpy.ndarray,maybe they are 'str' or other types instead of 'int' or 'float'.

Sign up to request clarification or add additional context in comments.

Comments

0

You have to test the condition for every element of the list. Try smtg like:

a = [1,0,3,5,6,0]

b = [i>0 for i in a]

Output:

[True, False, True, True, True, False]

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.