2017-01-31 1 views
1

Je ne suis pas sûr où exactement pour poser cette question - je ne peux pas sembler trouver la bonne plate-forme où je sens que je peux correctement demander cela ... il m'a embêté pendant si longtemps et je ne peux pas sembler saisir l'image conceptuelle. Je suis novice en Python et j'apprends donc très lentement. Mes excuses si je dis quelque chose qui est jugé stupide ou inapte. J'apprendsFonction de distribution radiale utilisant le code Python

Ma question concerne le calcul de la fonction de distribution radiale.

Je trouve ce code sur GitHub qui calcule RDF d'un système 3D:

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(0., 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) 

Il semble être un code très simple, mais je suis extrêmement confus d'une part:

bools1 = x > rMax 
bools2 = x < (S - rMax) 
bools3 = y > rMax 
bools4 = y < (S - rMax) 
bools5 = z > rMax 
bools6 = z < (S - rMax) 

Je peux comprendre bools1 = x > rMax ce qui signifie les coordonnées des particules dont les coordonnées x sont supérieures à la valeur rMax. Dans RDF, nous recherchons des particules qui se trouvent dans la sphère/le rayon donné.

Le prochain, cependant, est celui qui m'attrape et pour la vie de moi je ne peux pas sembler comprendre sa signification correctement: bools2 = x < (S - rMax).

Est-ce que bools2 fait référence aux particules intérieures à rMax? Si oui, pourquoi ne peux-il pas spécifier x < rMax? Quelle est l'importance de soustraire rMax de la longueur du bord, S, du cube? Je ne peux pas sembler comprendre la signification conceptuelle de soustraire rMax de S ...

+0

peut-être? 'trouve des particules de référence telles qu'une sphère de rayon rMax dessinée autour de la particule s'insère entièrement dans le cube,' – f5r5e5d

Répondre

0

Je pense que c'est parce que rmax est le rayon de la coque (pas le diamètre comme indiqué dans l'explication de la variable). Disons que nous avons une boîte cubique 30x30x30 (x, y, z) donc S = 30, d'où le centre de la boîte = 15x15x15, et l'entrée rmax de 10.

Si vous considérez une particule à (19,15,15) alors vous êtes à l'intérieur de la limite dans la direction x, donc évaluer bool1 x > rmax (19> 10) est vrai.

Si vous considérez votre suggestion pour bool2 x < rmax au même point (19 < 10) alors bool2 échouerait, malgré le fait que la particule soit valide. Mais, si vous considérez x < (S - rmax) (19 < (30 - 10) = Vrai), le bool est vrai. Le point de la condition est de dire que la particule est à l'intérieur du diamètre de la sphère englobante.

Si vous choisissez une particule dans la direction opposée:

Une particule à (14,15,15), vous êtes à l'intérieur de la frontière dans la direction x, donc évaluer bool1 x > rmax (14> 10) est vrai .

Encore une fois, votre suggestion pour bool2 x < rmax au même point (14 < 10) alors bool2 échouerait. Maintenant considérons x < (S - rmax) (14 < (30 - 10) = True), le bool est vrai.

Si nous avons pris une particule à (26,15,15): bool1 = x> rmax: (26> 10) true bool2 = x < (S - Rmax): (26 < (30 - 10)) false L'inclusion de cette particule est empêchée dans le NP.où la multiplication évaluera à 0

Si nous avons pris une particule à (9,15,15): bool1 = x> rmax: (9> 10) faux bool2 = x < (s - Rmax): (9 < (30 - 10)) true L'inclusion de cette particule est empêchée dans le np où la multiplication évaluera à 0

Je pense que c'est le raisonnement derrière cette ligne, j'espère que cela aide.