Skip to content

Commit 623513b

Browse files
authored
Memory units (#293)
* Updated the e-ph plotting script * Make use of decorators for band structures * Modified EventReport.stat to allow for paths that are not found on the local machine. * Clean up of old stuff. * Update of memory units. Tests fixing. * Making it possible to use older versions of pymatgen as well. * Typo.
1 parent b0405a9 commit 623513b

32 files changed

+178
-78
lines changed

abipy/abilab.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -544,7 +544,7 @@ def install_config_files(workdir: Optional[str] = None, force_reinstall: Optiona
544544
num_nodes: 1
545545
sockets_per_node: 1
546546
cores_per_socket: 2
547-
mem_per_node: 4 Gb
547+
mem_per_node: 4 GB
548548
"""
549549

550550
# Write configuration files.

abipy/core/mixins.py

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -575,12 +575,12 @@ def dump(self, filepath: str) -> str:
575575

576576

577577
_ABBREVS = [
578-
(1 << 50, 'Pb'),
579-
(1 << 40, 'Tb'),
580-
(1 << 30, 'Gb'),
581-
(1 << 20, 'Mb'),
582-
(1 << 10, 'kb'),
583-
(1, 'b'),
578+
(1 << 50, 'PB'),
579+
(1 << 40, 'TB'),
580+
(1 << 30, 'GB'),
581+
(1 << 20, 'MB'),
582+
(1 << 10, 'kB'),
583+
(1, 'B'),
584584
]
585585

586586

abipy/data/managers/dragon1_manager.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ hardware: &hardware
33
num_nodes: 26
44
sockets_per_node: 2
55
cores_per_socket: 8
6-
mem_per_node: 112Gb
6+
mem_per_node: 112GB
77

88
job: &job
99
mpi_runner: mpirun

abipy/data/managers/gmac_manager.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ qadapters:
1616
num_nodes: 1
1717
sockets_per_node: 1
1818
cores_per_socket: 2
19-
mem_per_node: 4 Gb
19+
mem_per_node: 4 GB
2020
# Optional
2121
#condition: {"$eq": {omp_threads: 2}}
2222

abipy/data/managers/hercules_manager.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ hardware: &hardware
33
num_nodes: 65
44
sockets_per_node: 2
55
cores_per_socket: 8
6-
mem_per_node: 54Gb
6+
mem_per_node: 54GB
77

88
job: &job
99
mpi_runner: mpirun

abipy/data/managers/hmem_manager.yml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,19 +4,19 @@ high: &high
44
num_nodes: 2
55
sockets_per_node: 4
66
cores_per_socket: 12
7-
mem_per_node: 512Gb
7+
mem_per_node: 512GB
88

99
middle: &middle
1010
num_nodes: 7
1111
sockets_per_node: 4
1212
cores_per_socket: 12
13-
mem_per_node: 256Gb
13+
mem_per_node: 256GB
1414

1515
low: &low
1616
num_nodes: 7
1717
sockets_per_node: 4
1818
cores_per_socket: 12
19-
mem_per_node: 128Gb
19+
mem_per_node: 128GB
2020

2121
job: &job
2222
mpi_runner: mpirun

abipy/data/managers/juqueen_manager.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ batch: &batch
22
num_nodes: 128
33
sockets_per_node: 1
44
cores_per_socket: 16
5-
mem_per_node: 128Gb
5+
mem_per_node: 128GB
66

77
job: &job
88
mpi_runner: runjob
@@ -48,7 +48,7 @@ qadapters:
4848
num_nodes: 1
4949
sockets_per_node: 1
5050
cores_per_socket: 1
51-
mem_per_node: 12Gb
51+
mem_per_node: 12GB
5252
job:
5353
#mpi_runner: runjob
5454
shell_env:

abipy/data/managers/jureca_manager.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,13 @@ devel: &devel
55
num_nodes: 8
66
sockets_per_node: 2
77
cores_per_socket: 12
8-
mem_per_node: 128Gb
8+
mem_per_node: 128GB
99

1010
batch: &batch
1111
num_nodes: 128
1212
sockets_per_node: 2
1313
cores_per_socket: 12
14-
mem_per_node: 128Gb
14+
mem_per_node: 128GB
1515

1616
job: &job
1717
# mpirun is not available on jureca.

abipy/data/managers/lemaitre2_manager.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ hardware: &hardware
33
num_nodes: 112
44
sockets_per_node: 2
55
cores_per_socket: 6
6-
mem_per_node: 48Gb
6+
mem_per_node: 48GB
77

88
job: &job
99
mpi_runner: mpirun

abipy/data/managers/lemaitre3_manager.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ hardware: &hardware
55
num_nodes: 80
66
sockets_per_node: 2
77
cores_per_socket: 12
8-
mem_per_node: 95Gb
8+
mem_per_node: 95GB
99

1010
job: &job
1111
mpi_runner: mpirun

abipy/data/managers/lumi_manager.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ hardware: &hardware
55
num_nodes: 1376
66
sockets_per_node: 2
77
cores_per_socket: 64
8-
mem_per_node: 256Gb
8+
mem_per_node: 256GB
99

1010
job: &job
1111
mpi_runner: srun

abipy/data/managers/manneback_manager.yml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,19 +3,19 @@ Def: &Def
33
num_nodes: 672
44
sockets_per_node: 2
55
cores_per_socket: 4
6-
mem_per_node: 24 Gb
6+
mem_per_node: 24 GB
77

88
ObanAMD: &ObanAMD
99
num_nodes: 6
1010
sockets_per_node: 4
1111
cores_per_socket: 8
12-
mem_per_node: 128 Gb
12+
mem_per_node: 128 GB
1313

1414
ObanIntel: &ObanIntel
1515
num_nodes: 3
1616
sockets_per_node: 4
1717
cores_per_socket: 8
18-
mem_per_node: 256 Gb
18+
mem_per_node: 256 GB
1919

2020
# Environment, modules, and parameters used to launch jobs.
2121
job: &job

abipy/data/managers/nic4_manager.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ hardware: &hardware
33
num_nodes: 120
44
sockets_per_node: 2
55
cores_per_socket: 8
6-
mem_per_node: 64Gb
6+
mem_per_node: 64GB
77

88
job: &job
99
mpi_runner: "mpirun"

abipy/data/managers/shell_manager.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,4 +15,4 @@ qadapters:
1515
num_nodes: 1
1616
sockets_per_node: 1
1717
cores_per_socket: 2
18-
mem_per_node: 4 Gb
18+
mem_per_node: 4 GB

abipy/data/managers/shell_nompi_manager.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,4 +15,4 @@ qadapters:
1515
num_nodes: 1
1616
sockets_per_node: 1
1717
cores_per_socket: 2
18-
mem_per_node: 4 Gb
18+
mem_per_node: 4 GB

abipy/data/managers/travis_manager.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,4 +16,4 @@ qadapters:
1616
num_nodes: 1
1717
sockets_per_node: 1
1818
cores_per_socket: 2
19-
mem_per_node: 4 Gb
19+
mem_per_node: 4 GB

abipy/data/managers/ubu_manager.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,4 +17,4 @@ qadapters:
1717
num_nodes: 1
1818
sockets_per_node: 1
1919
cores_per_socket: 24
20-
mem_per_node: 4 Gb
20+
mem_per_node: 4 GB

abipy/data/managers/vega_manager.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ hardware: &hardware
33
num_nodes: 44
44
sockets_per_node: 4
55
cores_per_socket: 16
6-
mem_per_node: 256Gb
6+
mem_per_node: 256GB
77

88
job: &job
99
mpi_runner: mpirun

abipy/data/managers/viper_manager.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ hardware: &hardware
22
num_nodes: 1
33
sockets_per_node: 2
44
cores_per_socket: 4
5-
mem_per_node: 32Gb
5+
mem_per_node: 32GB
66

77
job: &job
88
mpi_runner: ~/bin/mpirun.openmpi

abipy/data/managers/zenobe_manager.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,13 @@ westmere: &westmere
33
num_nodes: 274
44
sockets_per_node: 2
55
cores_per_socket: 6
6-
mem_per_node: 24 Gb
6+
mem_per_node: 24 GB
77

88
ivybridge: &ivybridge
99
num_nodes: 342
1010
sockets_per_node: 2
1111
cores_per_socket: 12
12-
mem_per_node: 64 Gb
12+
mem_per_node: 64 GB
1313

1414
# Environment, modules, and parameters used to launch jobs.
1515
job: &job

abipy/electrons/arpes.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ def model_from_ebands(cls, ebands, tmesh=(0, 300, 600), poorman_polaron=False):
3636
#aw: [nwr, ntemp, max_nbcalc, nkcalc, nsppol] array
3737
#aw_meshes: [max_nbcalc, nkcalc, nsppol] array with energy mesh in eV
3838
from abipy.tools.numtools import lorentzian
39-
try :
39+
try:
4040
from scipy.integrate import cumulative_trapezoid as cumtrapz
4141
except ImportError:
4242
from scipy.integrate import cumtrapz

abipy/electrons/lobster.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -771,7 +771,9 @@ def plot(self, ax=None, **kwargs) -> Figure:
771771
"""Barplot with average values."""
772772
ax, fig, plt = get_ax_fig_plt(ax=ax)
773773
import seaborn as sns
774-
sns.barplot(x="average", y="pair", hue="spin", data=self.dataframe, ax=ax)
774+
df = self.dataframe.copy()
775+
df["pair"] = df["type0"] + "-" + df["type1"]
776+
sns.barplot(x="average", y="pair", hue="spin", data=df, ax=ax)
775777
return fig
776778

777779
def yield_figs(self, **kwargs): # pragma: no cover

abipy/flowtk/flows.py

Lines changed: 95 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
from monty.termcolor import cprint, colored, cprint_map, get_terminal_size
3131
from monty.inspect import find_top_pyfile
3232
from monty.json import MSONable
33+
from pymatgen.core.units import Memory, UnitError
3334
from abipy.tools.iotools import AtomicFile
3435
from abipy.tools.serialization import pmg_pickle_load, pmg_pickle_dump, pmg_serialize
3536
from abipy.tools.typing import Figure, TYPE_CHECKING
@@ -1290,8 +1291,12 @@ def show_status(self, return_df=False, **kwargs):
12901291
if report is not None:
12911292
events = '{:>4}|{:>3}'.format(*map(str, (report.num_warnings, report.num_comments)))
12921293

1293-
para_info = '{:>4}|{:>3}|{:>3}'.format(*map(str, (
1294-
task.mpi_procs, task.omp_threads, "%.1f" % task.mem_per_proc.to("Gb"))))
1294+
try:
1295+
para_info = '{:>4}|{:>3}|{:>3}'.format(*map(str, (
1296+
task.mpi_procs, task.omp_threads, "%.1f" % task.mem_per_proc.to("GB"))))
1297+
except (KeyError, UnitError):
1298+
para_info = '{:>4}|{:>3}|{:>3}'.format(*map(str, (
1299+
task.mpi_procs, task.omp_threads, "%.1f" % task.mem_per_proc.to("Gb"))))
12951300

12961301
task_info = list(map(str, [task.__class__.__name__,
12971302
(task.num_launches, task.num_restarts, task.num_corrections), stime, task.node_id]))
@@ -2478,6 +2483,94 @@ def make_light_tarfile(self, name=None):
24782483
name = os.path.basename(self.workdir) + "-light.tar.gz" if name is None else name
24792484
return self.make_tarfile(name=name, exclude_dirs=["outdata", "indata", "tmpdata"])
24802485

2486+
def make_tarfile(self, name=None, max_filesize=None, exclude_exts=None, exclude_dirs=None, verbose=0, **kwargs):
2487+
"""
2488+
Create a tarball file.
2489+
2490+
Args:
2491+
name: Name of the tarball file. Set to os.path.basename(`flow.workdir`) + "tar.gz"` if name is None.
2492+
max_filesize (int or string with unit): a file is included in the tar file if its size <= max_filesize
2493+
Can be specified in bytes e.g. `max_files=1024` or with a string with unit e.g. `max_filesize="1 MB"`.
2494+
No check is done if max_filesize is None.
2495+
exclude_exts: List of file extensions to be excluded from the tar file.
2496+
exclude_dirs: List of directory basenames to be excluded.
2497+
verbose (int): Verbosity level.
2498+
kwargs: keyword arguments passed to the :class:`TarFile` constructor.
2499+
2500+
Returns: The name of the tarfile.
2501+
"""
2502+
def any2bytes(s):
2503+
"""Convert string or number to memory in bytes."""
2504+
if is_string(s):
2505+
try:
2506+
# latest pymatgen version (as of july 2024)
2507+
mem = int(Memory.from_str(s.upper()).to("B"))
2508+
except (KeyError, UnitError): # For backward compatibility with older pymatgen versions
2509+
try:
2510+
mem = int(Memory.from_str(s.replace("B", "b")).to("b"))
2511+
except AttributeError: # For even older pymatgen versions
2512+
mem = int(Memory.from_string(s.replace("B", "b")).to("b"))
2513+
return mem
2514+
else:
2515+
return int(s)
2516+
2517+
if max_filesize is not None:
2518+
max_filesize = any2bytes(max_filesize)
2519+
2520+
if exclude_exts:
2521+
# Add/remove ".nc" so that we can simply pass "GSR" instead of "GSR.nc"
2522+
# Moreover this trick allows one to treat WFK.nc and WFK file on the same footing.
2523+
exts = []
2524+
for e in list_strings(exclude_exts):
2525+
exts.append(e)
2526+
if e.endswith(".nc"):
2527+
exts.append(e.replace(".nc", ""))
2528+
else:
2529+
exts.append(e + ".nc")
2530+
exclude_exts = exts
2531+
2532+
def filter(tarinfo):
2533+
"""
2534+
Function that takes a TarInfo object argument and returns the changed TarInfo object.
2535+
If it instead returns None the TarInfo object will be excluded from the archive.
2536+
"""
2537+
# Skip links.
2538+
if tarinfo.issym() or tarinfo.islnk():
2539+
if verbose: print("Excluding link: %s" % tarinfo.name)
2540+
return None
2541+
2542+
# Check size in bytes
2543+
if max_filesize is not None and tarinfo.size > max_filesize:
2544+
if verbose: print("Excluding %s due to max_filesize" % tarinfo.name)
2545+
return None
2546+
2547+
# Filter filenames.
2548+
if exclude_exts and any(tarinfo.name.endswith(ext) for ext in exclude_exts):
2549+
if verbose: print("Excluding %s due to extension" % tarinfo.name)
2550+
return None
2551+
2552+
# Exlude directories (use dir basenames).
2553+
if exclude_dirs and any(dir_name in exclude_dirs for dir_name in tarinfo.name.split(os.path.sep)):
2554+
if verbose: print("Excluding %s due to exclude_dirs" % tarinfo.name)
2555+
return None
2556+
2557+
return tarinfo
2558+
2559+
back = os.getcwd()
2560+
os.chdir(os.path.join(self.workdir, ".."))
2561+
2562+
import tarfile
2563+
name = os.path.basename(self.workdir) + ".tar.gz" if name is None else name
2564+
with tarfile.open(name=name, mode='w:gz', **kwargs) as tar:
2565+
tar.add(os.path.basename(self.workdir), arcname=None, recursive=True, filter=filter)
2566+
2567+
# Add the script used to generate the flow.
2568+
if self.pyfile is not None and os.path.exists(self.pyfile):
2569+
tar.add(self.pyfile)
2570+
2571+
os.chdir(back)
2572+
return name
2573+
24812574
def explain(self, what="all", nids=None, verbose=0) -> str:
24822575
"""
24832576
Return string with the docstrings of the works/tasks in the Flow grouped by class.

0 commit comments

Comments
 (0)