Coverage for examples/analyze_structure.py: 89%
46 statements
« prev ^ index » next coverage.py v7.9.1, created at 2025-06-14 15:55 +0200
« prev ^ index » next coverage.py v7.9.1, created at 2025-06-14 15:55 +0200
1""" Minimal example for calculing rdf from existing data
3 Usage:
5 analyze_structure filename
6"""
8import gamdpy as gp
9import numpy as np
10import numba
11import matplotlib.pyplot as plt
12import sys
13import pickle
15gp.select_gpu()
17argv = sys.argv.copy()
18argv.pop(0) # remove scriptname
19if __name__ == "__main__":
20 if argv:
21 filename = argv.pop(0) # get filename (.h5 added by script)
22 else:
23 filename = 'Data/LJ_r0.973_T0.70_toread' # Used in testing
24else:
25 filename = 'Data/LJ_r0.973_T0.70_toread' # Used in testing
27# Load existing data
28output = gp.tools.TrajectoryIO(filename+'.h5').get_h5()
29# Read number of particles N and dimensions from data
30nblocks, nconfs, N, D = output['trajectory_saver/positions'].shape
32# Create configuration object
33configuration = gp.Configuration(D=D, N=N)
34configuration.simbox = gp.Orthorhombic(D, output['initial_configuration'].attrs['simbox_data'])
35configuration.ptype = output['initial_configuration/ptype']
36configuration.copy_to_device()
37# Call the rdf calculator
38calc_rdf = gp.CalculatorRadialDistribution(configuration, bins=300)
40# NOTE: the structure of the block is (outer_block, inner_steps, pos&img, npart, dimensions)
41# the zero is to select the position array and discard images
42positions = output['trajectory_saver/positions'][:,:,:,:]
43positions = positions.reshape(nblocks*nconfs,N,D)
44# Loop over saved configurations
45for pos in positions[nconfs-1::nconfs]:
46 configuration['r'] = pos
47 configuration.copy_to_device()
48 calc_rdf.update()
50rdf_data = calc_rdf.read()
51with open(filename+'_rdf.pkl', 'wb') as f:
52 pickle.dump(rdf_data, f)
53print(f"Wrote: {filename+'_rdf.pkl'}")
55num_types = rdf_data['rdf_ptype'].shape[1]
56plt.figure(figsize=(8, 4))
57for i in range(num_types):
58 for j in range(i, num_types):
59 rdf_ij = np.mean(rdf_data['rdf_ptype'][:,i,j,:], axis=0)
60 plt.plot(rdf_data['distances'], rdf_ij, label=f'{i}-{j}')
61if num_types > 1:
62 plt.legend()
63plt.title(filename)
64plt.xlabel('Distance')
65plt.ylabel('Radial Distribution Function')
66plt.savefig(filename+'_rdf.pdf')
67print(f"Wrote: {filename+'_rdf.pdf'}")
68if __name__ == "__main__":
69 plt.show()