Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
24 commits
Select commit Hold shift + click to select a range
cabe36b
Added cirrus-ex tests for lammps(ethanol),pytorch(deepcam) and castep
lucaparisi91 Nov 11, 2025
3c6210b
Enabling porting openfoam to cirrus-ex
lucaparisi91 Nov 11, 2025
d077c9d
Adapted openfoam-org tutorial for version 12
lucaparisi91 Jan 8, 2026
357231b
Added regression tests for cp2k
lucaparisi91 Jan 9, 2026
44bcdf6
Adapted OpenFoam to run v12 on cirrus-ex and v10 on Archer2
lucaparisi91 Jan 9, 2026
fd5510d
Fetch only for one programming environment
lucaparisi91 Jan 9, 2026
b2cc72c
Restrict openfaom tests to module tests only
lucaparisi91 Jan 9, 2026
2f980e6
Updated reference to cirrus-ex for deepcam
lucaparisi91 Jan 9, 2026
85b1ab9
Fixed broken openfoam test on Archer2, following work to adapt on cirrus
lucaparisi91 Jan 12, 2026
bdd26f8
Fixed pytorch bug on A2 , following migration to cirrus-ex
lucaparisi91 Jan 12, 2026
5493601
Styling changes
lucaparisi91 Jan 12, 2026
f8b9089
Reduce max line length
lucaparisi91 Jan 12, 2026
70c5242
falke8 fixes
lucaparisi91 Jan 12, 2026
a8f9856
Lint fixes
lucaparisi91 Jan 12, 2026
aac9607
Linting fix
lucaparisi91 Jan 12, 2026
149a945
Merged with archer2 fixes
lucaparisi91 Jan 12, 2026
8b5957c
Fixed mergingh mishaps
lucaparisi91 Jan 12, 2026
bd25e0e
update data directory for deepcam test in cirrus-ex
Mar 16, 2026
87d4137
black fix
lucaparisi91 Jun 9, 2026
4cacbfb
Merge pull request #113 from lucaparisi91/apps-cirrus-ex
aturner-epcc Jun 9, 2026
c20c1da
Added gromacs and exaalt tests
lucaparisi91 Jul 13, 2026
3d44005
Added openfoam benchmark
lucaparisi91 Jul 13, 2026
3cb66a4
Added vasp package
lucaparisi91 Jul 13, 2026
46ac155
Added input files for the vasp CdTe benchmark
lucaparisi91 Jul 14, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 10 additions & 2 deletions tests/apps/castep/castep_check.py
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,7 @@ def extract_calctime(self):
class CASTEPCPUCheck(CASTEPBaseCheck):
"""CASTEP Check for CPU"""

valid_systems = ["archer2:compute", "cirrus:compute"]
valid_systems = ["archer2:compute", "cirrus:compute", "cirrus-ex:compute"]
descr = "CASTEP corrctness and performance test"
executable_opts = ["al3x3"]

Expand All @@ -64,10 +64,13 @@ class CASTEPCPUCheck(CASTEPBaseCheck):
reference["archer2:compute"]["runtime"] = (132, -0.1, 0.1, "s")

reference["cirrus:compute"] = {}

reference["cirrus:compute"]["calctime"] = (325.9, -0.1, 0.1, "s")
reference["cirrus:compute"]["runtime"] = (328.2, -0.1, 0.1, "s")

reference["cirrus-ex:compute"] = {}
reference["cirrus-ex:compute"]["runtime"] = (82, -0.1, 0.1, "s")
reference["cirrus-ex:compute"]["calctime"] = (74, -0.1, 0.1, "s")

@run_after("init")
def setup_environment(self):
"""Setup environment"""
Expand All @@ -76,6 +79,11 @@ def setup_environment(self):
self.num_tasks = 512
self.num_tasks_per_node = 128

if self.current_system.name in ["cirrus-ex"]:
self.modules = ["castep"]
self.num_tasks = 288 * 2
self.num_tasks_per_node = 288

if self.current_system.name in ["cirrus"]:
self.modules = ["castep/22.1.1"]
self.num_tasks = 216
Expand Down
192 changes: 124 additions & 68 deletions tests/apps/cp2k/cp2k_check.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
#!/usr/bin/env python3

"""ReFrame test for cp2k"""
"""ReFrame tests for cp2k"""

import reframe as rfm
import reframe.utility.sanity as sn
Expand All @@ -15,62 +15,20 @@ class CP2KBaseCheck(rfm.RunOnlyRegressionTest):
executable = "cp2k.psmp"
# Additional Slurm parameters. Requires adding to config file first.
extra_resources = {"qos": {"qos": "standard"}}
# Output files to be retained
keep_files = ["cp2k.out"]

# Set time limit

time_limit = "20m"

maintainers = ["j.richings@epcc.ed.ac.uk"]
use_multithreading = False
tags = {"applications", "performance"}

# Reference value to validate run with
energy_reference = -870.934788

reference = {
"*": {"energy": (energy_reference, -0.01, 0.01, "a.u.")},
"cirrus:compute": {"performance": (1300, -0.05, 0.05, "seconds")},
}

reference_performance = {
"2000000": (350, -0.1, 0.1, "seconds"),
"2250000": (250, -0.1, 0.1, "seconds"),
}

@sanity_function
def assert_finished(self):
"""Sanity check that simulation finished successfully"""
return sn.assert_found("CP2K ", self.keep_files[0])

@performance_function("a.u.", perf_key="energy")
def extract_energy(self):
"""Extract value of system energy for performance check"""
return sn.extractsingle(
r"ENERGY\| Total FORCE_EVAL \( QS \) energy \[a.u.\]:\s+(?P<energy>\S+)",
self.keep_files[0],
"energy",
float,
)

@performance_function("seconds", perf_key="performance")
def extract_perf(self):
"""Extract performance value to compare with reference value"""
return sn.extractsingle(
r"\s+CP2K(?:\s+\d+\.?\d*){5}\s+(?P<perf>\S+)",
self.keep_files[0],
"perf",
float,
)
tags = {"applications"}


@rfm.simple_test
class CP2KARCHER2(CP2KBaseCheck):
"""CP2K test"""
class CP2KARCHER2HFX(CP2KBaseCheck):
"""CP2K performance test"""

# Select system to use
valid_systems = ["archer2:compute"]
# Output files to be retained
keep_files = ["cp2k.out"]
# Set Programming Environment
valid_prog_environs = ["PrgEnv-gnu", "PrgEnv-gnu-hf"]
# Description of test
Expand All @@ -84,22 +42,26 @@ class CP2KARCHER2(CP2KBaseCheck):
num_tasks_per_node = 16
num_cpus_per_task = 8
time_limit = "10m"

# Reference value to validate run with
energy_reference = -870.934788
tags = CP2KBaseCheck.tags.union({"performance"})
reference_performance = {
"2000000": (350, -0.1, 0.1, "seconds"),
"2250000": (250, -0.1, 0.1, "seconds"),
}

@sanity_function
def assert_finished(self):
"""Sanity check that simulation finished successfully"""
return sn.assert_found("CP2K ", self.keep_files[0])

@run_after("init")
def setup_params(self):
"""sets up extra parameters"""
# self.descr += self.freq
if self.current_system.name in ["archer2"]:
self.env_vars = {"OMP_NUM_THREADS": str(self.num_cpus_per_task), "OMP_PLACES": "cores"}

# "SLURM_CPU_FREQ_REQ": self.freq,
# }

@run_before("performance")
def set_reference(self):
"""Changes reference values"""
Expand All @@ -109,26 +71,120 @@ def set_reference(self):
"2250000" if self.current_environ.name[-3:] == "-hf" else "2000000"
]

reference = {"*": {"energy": (energy_reference, -0.01, 0.01, "a.u.")}}

reference_performance = {
"2000000": (350, -0.1, 0.1, "seconds"),
"2250000": (250, -0.1, 0.1, "seconds"),
}

@performance_function("a.u.", perf_key="energy")
def extract_energy(self):
"""Extract value of system energy for performance check"""
return sn.extractsingle(
r"ENERGY\| Total FORCE_EVAL \( QS \) energy \[a.u.\]:\s+(?P<energy>\S+)",
self.keep_files[0],
"energy",
float,
)

@performance_function("seconds", perf_key="performance")
def extract_perf(self):
"""Extract performance value to compare with reference value"""
return sn.extractsingle(
r"\s+CP2K(?:\s+\d+\.?\d*){5}\s+(?P<perf>\S+)",
self.keep_files[0],
"perf",
float,
)


@rfm.simple_test
class FetchCP2K(rfm.RunOnlyRegressionTest):
"""
Fetch CP2K source code, which contains the regression tests and benchmarks.
"""

descr = "Fetch cp2k code"
version = variable(str, value="2025.2")
executable = "wget"
executable_opts = [f"https://github.com/cp2k/cp2k/archive/refs/tags/v{version}.tar.gz"]
local = True
valid_systems = ["cirrus-ex:login"]
valid_prog_environs = ["PgEnv-gnu"]

@sanity_function
def validate_download(self):
"""Validate the download was successful"""
return sn.assert_eq(self.job.exitcode, 0)


@rfm.simple_test
class CP2KCPUCirrus(CP2KBaseCheck):
"""CP2K test for Cirrus"""
class CP2KCPUCirrusExRegressionTests(CP2KBaseCheck):
"""
CP2K regression tests for cirrus-ex

This runs the CP2K tests from the CP2K regression test suite.
They are good functionality tests but not very useful for performance.

"""

# Select system to use
valid_systems = ["cirrus:compute"]
valid_systems = ["cirrus-ex:compute"]
# Set Programming Environment
valid_prog_environs = ["gcc"]
valid_prog_environs = ["PrgEnv-gnu"]
# Description of test
descr = "CP2K test"
descr = "CP2K regression tests"
launcher = "cp2k_reg_tests"

# Command line options for executable
executable_opts = ("-i input_bulk_HFX_3.inp -o cp2k.out ").split()
# slurm parameters
num_tasks = 360
num_tasks_per_node = 18
num_cpus_per_task = 2
time_limit = "1h"

env_vars = {
"OMP_NUM_THREADS": str(num_cpus_per_task),
"OMP_PLACES": "cores",
}

executable = "cp2k.psmp"

executable_opts = ["-v"]

cp2k_src = fixture(FetchCP2K, scope="environment")

env_vars = {"OMP_PLACES": "cores", "CP2K_APP": "$(which cp2k.psmp)", "CP2K_DIR": "${CP2K_APP::-10}"}

@sanity_function
def assert_all_tests_completed(self):
"""Sanity check that simulation finished successfully"""
return sn.assert_found("Status: OK", self.stdout)

@run_before("run")
def set_resources(self):
"""Sets up slurm parameters"""
# slurm parameters
self.num_tasks = self.current_partition.processor.num_cpus // 2
self.num_tasks_per_node = self.current_partition.processor.num_cpus // 2
self.num_cpus_per_task = 2
self.time_limit = "20m"
self.env_vars["OMP_NUM_THREADS"] = str(self.num_cpus_per_task)

@run_before("run")
def launch_reg_tests(self):
"""
The command to launch the regression tests is a python script executed serially ( not in parallel).

In this implementation we use pre-run commands.
An alternative is to use a custom launcher.
However this needs to be specified in the config,
in a custom programming environment.
I think that solution is worse , because it pollutes a configuration file with test specific logic.

"""

source_tar_file = f"v{self.cp2k_src.version}.tar.gz"

self.prerun_cmds = [
f"cp {self.cp2k_src.stagedir}/{source_tar_file} .",
f"tar -zxf {source_tar_file}",
f'cp2k-{self.cp2k_src.version}/tests/do_regtest.py \
--workbasedir=$(pwd) \
--maxtasks=72 \
--mpiranks=2 \
--ompthreads=${{OMP_NUM_THREADS}} \
--mpiexec="srun --ntasks=2 --cpus-per-task=${{OMP_NUM_THREADS}}" \
$CP2K_DIR psmp',
]
11 changes: 7 additions & 4 deletions tests/apps/gromacs/gmx_1400k_atoms.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ class Gromacs1400kAtomsBase(GromacsBaseCheck):
"archer2-tds:compute": 128,
"cirrus:compute": 36,
"cirrus:compute-gpu": 40,
"cirrus-ex:compute": 288,
},
)

Expand All @@ -47,12 +48,12 @@ class Gromacs1400kAtomsBase(GromacsBaseCheck):
class GromacsCPUCheck(Gromacs1400kAtomsBase):
"""Gromacs CPU checks"""

valid_systems = ["archer2:compute", "cirrus:compute"]
valid_systems = ["archer2:compute", "cirrus:compute","cirrus-ex:compute"]
modules = ["gromacs"]
descr = Gromacs1400kAtomsBase.descr + " -- CPU"

n_nodes = 4
num_tasks = 128

num_cpus_per_task = 1
env_vars = {"OMP_NUM_THREADS": str(num_cpus_per_task)}
reference["archer2:compute"] = {}
Expand All @@ -62,11 +63,13 @@ class GromacsCPUCheck(Gromacs1400kAtomsBase):
reference["archer2:compute"]["performance"] = (24.0, -0.1, None, "ns/day")
reference["archer2-tds:compute"]["performance"] = (22.4, -0.1, None, "ns/day")
reference["cirrus:compute"]["performance"] = (5.50, -0.1, None, "ns/day")
tags = {"applications", "performance", "small"}


@run_before("run")
def setup_resources(self):
"""sets up number of tasks"""
self.num_tasks_per_node = self.cores.get(self.current_partition.fullname, 1)
self.num_tasks_per_node = self.current_partition.processor.num_cpus
self.num_tasks = self.n_nodes * self.num_tasks_per_node


Expand All @@ -91,7 +94,7 @@ class GromacsGPUCheck(Gromacs1400kAtomsBase):
num_cpus_per_tasks = None
reference["cirrus:compute-gpu"] = {}
reference["cirrus:compute-gpu"]["performance"] = (11.5, -0.05, None, "ns/day")

@run_after("setup")
def setup_gpu_options(self):
"""sets up different resources for gpu systems"""
Expand Down
1 change: 1 addition & 0 deletions tests/apps/lammps/dipole_large.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
#!/usr/bin/env python3
"""ReFrame script for lammps dipole test"""

import reframe as rfm

from lammps_base import LAMMPSBase
Expand Down
Loading
Loading