Coverage for examples/LJ.py: 84%
49 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
1import sys
3import numba
4import numpy as np
5import pandas as pd
7import gamdpy as gp
9integrator_name = 'NVE'
10if 'NVT' in sys.argv:
11 integrator_name = 'NVT'
12if 'NVT_Langevin' in sys.argv:
13 integrator_name = 'NVT_Langevin'
14if 'NPT_Langevin' in sys.argv: # use with NoRDF since box size is varying
15 integrator_name = 'NPT_Langevin'
17# Generate configuration with a FCC lattice
18configuration = gp.Configuration(D=3, compute_flags={'Fsq':True, 'lapU':True, 'Vol':True})
19configuration.make_lattice(gp.unit_cells.FCC, cells=[8, 8, 8], rho=0.8442)
20configuration['m'] = 1.0
21configuration.randomize_velocities(temperature=1.44)
23# Make pair potential
24pair_func = gp.apply_shifted_force_cutoff(gp.LJ_12_6_sigma_epsilon)
25sig, eps, cut = 1.0, 1.0, 2.5
26pair_pot = gp.PairPotential(pair_func, params=[sig, eps, cut], max_num_nbs=1000)
28# Make integrator
29dt = 0.005 # timestep
30num_blocks = 64 # Do simulation in this many 'blocks'
31steps_per_block = 2*1024 # ... each of this many steps
32running_time = dt*num_blocks*steps_per_block
33temperature = 0.7 # Not used for NVE
34pressure = 1.2 # Not used for NV*
36# Parameters, temperature and pressure, can be functions of time:
37#temperature = gp.make_function_ramp(value0=0.7, x0=0.5*running_time, value1=1.7, x1=0.8*running_time)
38#pressure = gp.make_function_ramp(value0=1.2, x0=0.3*running_time, value1=3.2, x1=0.6*running_time)
40if integrator_name=='NVE':
41 integrator = gp.integrators.NVE(dt=dt)
42if integrator_name=='NVT':
43 integrator = gp.integrators.NVT(temperature=temperature, tau=0.2, dt=dt)
44if integrator_name=='NVT_Langevin':
45 integrator = gp.integrators.NVT_Langevin(temperature=temperature, alpha=0.2, dt=dt, seed=2023)
46if integrator_name=='NPT_Langevin':
47 integrator = gp.integrators.NPT_Langevin(temperature=temperature, pressure=pressure,
48 alpha=0.1, alpha_baro=0.0001, mass_baro=0.0001,
49 volume_velocity=0.0, barostatModeISO = True , boxFlucCoord = 2,
50 dt=dt, seed=2023)
52# Setup Simulation. Total number of timesteps: num_blocks * steps_per_block
53compute_plan = gp.get_default_compute_plan(configuration)
54print(compute_plan)
56runtime_actions = [gp.MomentumReset(100),
57 gp.TrajectorySaver(),
58 gp.ScalarSaver(32, {'Fsq':True, 'lapU':True}), ]
61sim = gp.Simulation(configuration, pair_pot, integrator, runtime_actions,
62 num_timeblocks=num_blocks, steps_per_timeblock=steps_per_block,
63 compute_plan=compute_plan, storage='memory')
65for block in sim.run_timeblocks():
66 print(sim.status(per_particle=True))
67print(sim.summary())
69columns = ['U', 'W', 'K', 'Fsq','lapU', 'Vol']
70data = np.array(gp.extract_scalars(sim.output, columns, first_block=1))
71df = pd.DataFrame(data.T, columns=columns)
72df['t'] = np.arange(len(df['U']))* dt * sim.output['scalar_saver'].attrs["steps_between_output"]
73if integrator_name!='NVE' and callable(temperature):
74 df['Ttarget'] = numba.vectorize(temperature)(np.array(df['t']))
75if integrator_name=='NPT_Langevin' and callable(pressure):
76 df['Ptarget'] = numba.vectorize(pressure)(np.array(df['t']))
78gp.plot_scalars(df, configuration.N, configuration.D, figsize=(10,8), block=True)