Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Test compiled Lennard Jones potential. #78

Merged
merged 15 commits into from
Feb 21, 2024
2 changes: 1 addition & 1 deletion .github/workflows/requirements-test.txt
Original file line number Diff line number Diff line change
Expand Up @@ -2,5 +2,5 @@ h5py==3.10.0
gsd==3.2.1
numpy==1.26.4
PyYAML==6.0.1
signac==2.1.0
signac==2.2.0
signac-flow==0.27.0
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ validation test workflows in this repository are organized into signac projects.
* gsd >= 2.8.0
* numpy
* PyYAML
* signac >= 2.0.0
* signac >= 2.2.0
* signac-flow >= 0.25.1
* signac-dashboard [optional]
* Simulation workflow steps require either the [glotzerlab-software container]
Expand Down
47 changes: 28 additions & 19 deletions dashboard.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,44 +20,53 @@ class ValidationDashboard(Dashboard):

def job_title(self, job):
"""Name jobs."""
if job.statepoint.subproject == 'lj_fluid':
if job.cached_statepoint['subproject'] == 'lj_fluid':
return (
f'lj_fluid: kT={job.statepoint.kT}, '
f'rho={job.statepoint.density}, '
f'N={job.statepoint.num_particles}'
f'lj_fluid: kT={job.cached_statepoint["kT"]}, '
f'rho={job.cached_statepoint["density"]}, '
f'N={job.cached_statepoint["num_particles"]}'
)

if job.statepoint.subproject == 'lj_union':
return f'lj_union: kT={job.statepoint.kT}, rho={job.statepoint.density}'
if job.cached_statepoint['subproject'] == 'lj_union':
return (
f'lj_union: kT={job.cached_statepoint["kT"]}, '
f'rho={job.cached_statepoint["density"]}'
)

if job.statepoint.subproject == 'alj_2d':
return f'alj_2d: kT={job.statepoint.kT}, rho={job.statepoint.density}'
if job.cached_statepoint['subproject'] == 'alj_2d':
return (
f'alj_2d: kT={job.cached_statepoint["kT"]}, '
f'rho={job.cached_statepoint["density"]}'
)

if job.statepoint.subproject in (
if job.cached_statepoint['subproject'] in (
'hard_disk',
'hard_sphere',
'simple_polygon',
'patchy_particle_pressure',
):
return f'{job.statepoint.subproject}: rho={job.statepoint.density}'
return (
f'{job.cached_statepoint["subproject"]}: '
f'rho={job.cached_statepoint["density"]}'
)

raise RuntimeError('Unexpected job')

def job_sorter(self, job):
"""Sort jobs."""
if job.statepoint.subproject == 'patchy_particle_pressure':
if job.cached_statepoint['subproject'] == 'patchy_particle_pressure':
return (
job.statepoint.subproject,
job.statepoint.density,
job.statepoint.pressure,
job.statepoint.temperature,
job.statepoint.chi,
job.statepoint.replicate_idx,
job.cached_statepoint['subproject'],
job.cached_statepoint['density'],
job.cached_statepoint['pressure'],
job.cached_statepoint['temperature'],
job.cached_statepoint['chi'],
job.cached_statepoint['replicate_idx'],
)

return (
job.statepoint.subproject,
job.statepoint.num_particles,
job.cached_statepoint['subproject'],
job.cached_statepoint['num_particles'],
)


Expand Down
27 changes: 15 additions & 12 deletions hoomd_validation/alj_2d.py
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,7 @@ def job_statepoints():

def is_alj_2d(job):
"""Test if a given job is part of the alj_2d subproject."""
return job.statepoint['subproject'] == 'alj_2d'
return job.cached_statepoint['subproject'] == 'alj_2d'


partition_jobs_cpu = aggregator.groupsof(
Expand Down Expand Up @@ -104,8 +104,8 @@ def alj_2d_create_initial_state(*jobs):
message_filename=util.get_message_filename(job, 'create_initial_state.log'),
)

num_particles = job.statepoint['num_particles']
density = job.statepoint['density']
num_particles = job.cached_statepoint['num_particles']
density = job.cached_statepoint['density']

box_volume = num_particles / density
L = box_volume ** (1 / 2.0)
Expand Down Expand Up @@ -231,7 +231,9 @@ def make_md_simulation(
sim.operations.add(thermo)

# thermalize momenta
sim.state.thermalize_particle_momenta(hoomd.filter.All(), job.sp.kT)
sim.state.thermalize_particle_momenta(
hoomd.filter.All(), job.cached_statepoint['kT']
)

return sim

Expand Down Expand Up @@ -405,12 +407,12 @@ def alj_2d_conservation_analyze(*jobs):
)
job_energies[sim_mode] = (
job_energies[sim_mode] - job_energies[sim_mode][0]
) / job.statepoint['num_particles']
) / job.cached_statepoint['num_particles']

momentum_vector = log_traj['hoomd-data/md/Integrator/linear_momentum']
job_linear_momentum[sim_mode] = [
math.sqrt(v[0] ** 2 + v[1] ** 2 + v[2] ** 2)
/ job.statepoint['num_particles']
/ job.cached_statepoint['num_particles']
for v in momentum_vector
]

Expand All @@ -425,7 +427,7 @@ def plot(*, ax, data, quantity_name, legend=False):
ax.plot(
timesteps[i][mode],
data[i][mode],
label=f'{mode}_{job.statepoint.replicate_idx}',
label=f'{mode}_{job.cached_statepoint["replicate_idx"]}',
)
ax.set_xlabel('time step')
ax.set_ylabel(quantity_name)
Expand All @@ -442,13 +444,14 @@ def plot(*, ax, data, quantity_name, legend=False):

fig.suptitle(
'ALJ 2D conservation tests: '
f'$kT={job.statepoint.kT}$, $\\rho={job.statepoint.density}$, '
f'$N={job.statepoint.num_particles}$'
f'$kT={job.cached_statepoint["kT"]}$, '
f'$\\rho={job.cached_statepoint["density"]}$, '
f'$N={job.cached_statepoint["num_particles"]}$'
)
filename = (
f'alj_2d_conservation_kT{job.statepoint.kT}_'
f'density{round(job.statepoint.density, 2)}_'
f'N{job.statepoint.num_particles}.svg'
f'alj_2d_conservation_kT{job.cached_statepoint["kT"]}_'
f'density{round(job.cached_statepoint["density"], 2)}_'
f'N{job.cached_statepoint["num_particles"]}.svg'
)

fig.savefig(os.path.join(jobs[0]._project.path, filename), bbox_inches='tight')
Expand Down
18 changes: 9 additions & 9 deletions hoomd_validation/hard_disk.py
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@ def job_statepoints():

def is_hard_disk(job):
"""Test if a given job is part of the hard_disk subproject."""
return job.statepoint['subproject'] == 'hard_disk'
return job.cached_statepoint['subproject'] == 'hard_disk'


partition_jobs_cpu_serial = aggregator.groupsof(
Expand Down Expand Up @@ -93,8 +93,8 @@ def hard_disk_create_initial_state(*jobs):
if communicator.rank == 0:
print('starting hard_disk_create_initial_state:', job)

num_particles = job.statepoint['num_particles']
density = job.statepoint['density']
num_particles = job.cached_statepoint['num_particles']
density = job.cached_statepoint['density']

box_volume = num_particles / density
L = box_volume ** (1 / 2.0)
Expand Down Expand Up @@ -303,7 +303,7 @@ def run_npt_sim(job, device, complete_filename):

# box updates
boxmc = hoomd.hpmc.update.BoxMC(
betaP=job.statepoint.pressure, trigger=hoomd.trigger.Periodic(1)
betaP=job.cached_statepoint['pressure'], trigger=hoomd.trigger.Periodic(1)
)
boxmc.volume = dict(weight=1.0, mode='ln', delta=1e-6)

Expand Down Expand Up @@ -681,7 +681,7 @@ def hard_disk_analyze(job):
timesteps=timesteps,
data=densities,
ylabel=r'$\rho$',
expected=job.sp.density,
expected=job.cached_statepoint['density'],
max_points=500,
)
ax.legend()
Expand All @@ -692,14 +692,14 @@ def hard_disk_analyze(job):
timesteps=timesteps,
data=pressures,
ylabel=r'$\beta P$',
expected=job.sp.pressure,
expected=job.cached_statepoint['pressure'],
max_points=500,
)

fig.suptitle(
f'$\\rho={job.statepoint.density}$, '
f'$N={job.statepoint.num_particles}$, '
f'replicate={job.statepoint.replicate_idx}'
f'$\\rho={job.cached_statepoint["density"]}$, '
f'$N={job.cached_statepoint["num_particles"]}$, '
f'replicate={job.cached_statepoint["replicate_idx"]}'
)
fig.savefig(job.fn('nvt_npt_plots.svg'), bbox_inches='tight')

Expand Down
18 changes: 9 additions & 9 deletions hoomd_validation/hard_sphere.py
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ def job_statepoints():

def is_hard_sphere(job):
"""Test if a given job is part of the hard_sphere subproject."""
return job.statepoint['subproject'] == 'hard_sphere'
return job.cached_statepoint['subproject'] == 'hard_sphere'


partition_jobs_cpu_serial = aggregator.groupsof(
Expand Down Expand Up @@ -88,8 +88,8 @@ def hard_sphere_create_initial_state(*jobs):
if communicator.rank == 0:
print('starting hard_sphere_create_initial_state:', job)

num_particles = job.statepoint['num_particles']
density = job.statepoint['density']
num_particles = job.cached_statepoint['num_particles']
density = job.cached_statepoint['density']

box_volume = num_particles / density
L = box_volume ** (1 / 3.0)
Expand Down Expand Up @@ -254,7 +254,7 @@ def run_npt_sim(job, device, complete_filename):

# box updates
boxmc = hoomd.hpmc.update.BoxMC(
betaP=job.statepoint.pressure, trigger=hoomd.trigger.Periodic(1)
betaP=job.cached_statepoint['pressure'], trigger=hoomd.trigger.Periodic(1)
)
boxmc.volume = dict(weight=1.0, mode='ln', delta=1e-6)

Expand Down Expand Up @@ -544,7 +544,7 @@ def hard_sphere_analyze(job):
timesteps=timesteps,
data=densities,
ylabel=r'$\rho$',
expected=job.sp.density,
expected=job.cached_statepoint['density'],
max_points=500,
)
ax.legend()
Expand All @@ -555,14 +555,14 @@ def hard_sphere_analyze(job):
timesteps=timesteps,
data=pressures,
ylabel=r'$\beta P$',
expected=job.sp.pressure,
expected=job.cached_statepoint['pressure'],
max_points=500,
)

fig.suptitle(
f'$\\rho={job.statepoint.density}$, '
f'$N={job.statepoint.num_particles}$, '
f'replicate={job.statepoint.replicate_idx}'
f'$\\rho={job.cached_statepoint["density"]}$, '
f'$N={job.cached_statepoint["num_particles"]}$, '
f'replicate={job.cached_statepoint["replicate_idx"]}'
)
fig.savefig(job.fn('nvt_npt_plots.svg'), bbox_inches='tight')

Expand Down
Loading