Coverage for examples/evaluator_einstein_crystal.py: 100%
26 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"""
2Simulate Lennard-Jones crystal and evaluate the harmonic potential.
4This script sets up a configuration with a face-centered cubic (FCC) lattice
5and randomizes the velocities. The pair potential is the single component 12-6
6Lennard-Jones potential. The integrator is NVT.
7An evaluator is created to calculate the potential energy of the system
8using a none-interacting potential (eps=0.0) and harmonic springs.
9The simulation is then performed, and the mean potential energy of the reference
10einstein crystal (harmonic springs) is calculated and printed.
11The mean displacement from the ideal lattice, sqrt(2*u_spring), is calculated and printed.
13"""
15import numpy as np
17import gamdpy as gp
19# Setup configuration: FCC Lattice
20configuration = gp.Configuration(D=3)
21configuration.make_lattice(gp.unit_cells.FCC, cells=[8, 8, 8], rho=0.973)
22configuration['m'] = 1.0
23configuration.randomize_velocities(temperature=0.7)
24# anchor_points = np.array(configuration['r']).copy()
26# Setup pair potential: Single component 12-6 Lennard-Jones
27pair_func = gp.apply_shifted_potential_cutoff(gp.LJ_12_6_sigma_epsilon)
28eps, sig, cut = 1.0, 1.0, 2.5
29pair_pot = gp.PairPotential(pair_func, params=[eps, sig, cut], max_num_nbs=1000)
31# Setup integrator: NVT
32integrator = gp.integrators.NVT(temperature=0.7, tau=0.2, dt=0.005)
34# Setup runtime actions, i.e. actions performed during simulation of timeblocks
35runtime_actions = [gp.TrajectorySaver(),
36 gp.ScalarSaver(32),
37 gp.MomentumReset(100)]
39# Setup Simulation.
40sim = gp.Simulation(
41 configuration, pair_pot, integrator, runtime_actions,
42 num_timeblocks=16,
43 steps_per_timeblock=1024,
44 storage='memory'
45)
47# Create evaluator for einstein crystal
48# (replace with your potential of interest)
49none_interacting = pair_pot = gp.PairPotential(pair_func, params=[0.0, 1.0, 2.5], max_num_nbs=1000)
50harmonic_springs = gp.Tether() # U = 0.5*k*(r-r0)^2
51harmonic_springs.set_anchor_points_from_lists(
52 particle_indices=list(range(configuration.N)),
53 spring_constants=[1.0]*configuration.N,
54 configuration=configuration
55)
56evaluator = gp.Evaluator(sim.configuration, [none_interacting, harmonic_springs])
58# Run simulation
59u_spring = []
60displacements = []
61for block in sim.run_timeblocks():
62 evaluator.evaluate(sim.configuration)
63 this_u_spring = evaluator.configuration['U']
64 u_spring.append(np.sum(this_u_spring))
66 # Use the harmonic potential energy to calculate
67 # the displacement relative to the ideal lattice
68 dr = np.sqrt(2*this_u_spring)
69 displacements.append(dr)
71print(f'Mean harmonic potential energy: {np.mean(u_spring)}')
72print(f'Mean displacement from ideal lattice: {np.mean(displacements)}')