Source code for abipy.scripts.abips

#!/usr/bin/env python
"""
Script to download and install pseudopotential tables from the web.
"""
from __future__ import annotations

import sys
#import os
import argparse
import abipy.tools.cli_parsers as cli

from monty.termcolor import cprint
from pymatgen.core.periodic_table import Element
from abipy.core.release import __version__
#from abipy.tools import duck
from abipy.flowtk.pseudos import PseudoTable
from abipy.flowtk.psrepos import (tabulate_repos, repos_from_names,
                                  get_all_registered_repos, get_installed_repos_and_root)


[docs] def abips_list(options) -> list: """ List installed pseudopotential repos. """ repos, repos_root = get_installed_repos_and_root() if not repos: print("Could not find any pseudopotential repository installed in:", repos_root) return 0 print(f"The following pseudopotential repositories are installed in {repos_root}:\n") print(tabulate_repos(repos, exclude=["installed"], verbose=options.verbose)) if not options.checksums: print("\nUse -c to validate the md5 checksum") return 0 exc_list = [] for repo in repos: try: repo.validate_checksums(options.verbose) except Exception as exc: exc_list.append(exc) if exc_list: print("\nList of exceptions raised by validate_checksums:") for exc in exc_list: print(exc) return len(exc_list)
[docs] def abips_avail(options) -> int: """ Show available pseudopotential repos. """ print("List of available pseudopotential repositories:\n") all_repos = get_all_registered_repos() print(tabulate_repos(all_repos, with_citations=True, verbose=options.verbose)) return 0
#def abips_nc_install(options) -> int: # """ # Get all NC repos for a given version, # Can choose among three formats: psp8, upf2 and psml. By default we fetch all formats. # """ # repos_root = get_repos_root(options) # all_repos = get_all_registered_repos() # repos = [repo for repo in all_repos if repo.isnc and not repo.is_installed(repos_root)] # if not repos: # print(f"All registered NC repositories are already installed in {repos_root}. Returning") # return 0 # # print("The following NC repositories will be installed:\n") # pprint_repos(repos, repos_root=repos_root) # if not options.yes and cli.user_wants_to_abort(): # return 2 # # print("Fetching NC repositories. It may take some time ...") # for repo in repos: # repo.install(repos_root, options.verbose) # # if options.verbose: abips_list(options) # return 0 # # #def abips_paw_install(options): # """ # Get all JTH PAW repositories in PAWXML format for the given version. # """ # repos_root = get_repos_root(options) # all_repos = get_all_registered_repos() # repos = [repo for repo in ALL_REPOS if repo.ispaw and not repo.is_installed(repos_root)] # if not repos: # print(f"All registered PAW repositories are already installed in {repos_root}. Returning") # return 0 # # print("The following PAW repositories will be installed:") # pprint_repos(repos, repos_root=repos_root) # if not options.yes and cli.user_wants_to_abort(): # return 2 # # print("Fetching PAW repositories. It may take some time ...") # for repo in repos: # repo.install(repos_root, options.verbose) # # if options.verbose: abips_list(options) # return 0
[docs] def abips_install(options) -> int: """ Install pseudopotential repositories by name(s). Use `avail` command to get repo names. """ repos = repos_from_names(options.repo_names) repos = [repo for repo in repos if not repo.is_installed()] if not repos: print("Table(s) are already installed! Nothing to do. Returning") return 0 print("The following pseudopotential repositories will be installed:") print(tabulate_repos(repos, verbose=options.verbose), "\n") #if not options.yes and cli.user_wants_to_abort(): return 2 for repo in repos: repo.install(verbose=options.verbose) if options.verbose: abips_list(options) return 0
[docs] def abips_show(options) -> int: """ Show info on pseudopotential table(s). """ repos = repos_from_names(options.repo_names) repos = [repo for repo in repos if repo.is_installed()] if not repos: print(f"There's no installed repository with name in: {options.repo_names}") return 1 for repo in repos: print(repo) for table_name in repo.table_names: pseudos = repo.get_pseudos(table_name=table_name) print(f"For table_name: {table_name}:\n") if options.symbol is not None: print("Selecting pseudos with symbol:", options.symbol) pseudos = pseudos.pseudo_with_symbol(options.symbol, allow_multi=False) print(pseudos) return 0
[docs] def abips_element(options) -> int: """ Find all pseudos in the installed tables for the given element (symbol or znucl). """ # Accept symbol string or Z symbol = options.element if symbol.isnumeric(): symbol = Element.from_Z(int(symbol)).symbol repos, repos_root = get_installed_repos_and_root() if not repos: print("Could not find any pseudopotential repository installed in:", repos_root) return 1 pseudo_list = [] for repo in repos: for table_name in repo.table_names: try: pseudos = repo.get_pseudos(table_name=table_name) pseudo = pseudos.pseudo_with_symbol(symbol, allow_multi=False) except Exception as exc: cprint(f"{str(exc)}", "red") continue if pseudo not in pseudo_list: pseudo_list.append(pseudo) pseudos = PseudoTable(pseudo_list) pseudos.print_table() return 0
[docs] def abips_mkff(options) -> int: """ Call Abinit to compute PSPS.nc files from a list of pseudos and show results. """ from abipy.electrons.psps import PspsFile, PspsRobot ecut = options.ecut if len(options.pseudo_paths) == 1: if options.vloc_rcut_list is None: with PspsFile.from_abinit_run(options.pseudo_paths[0], ecut) as abifile: if options.verbose: print(abifile) abifile.expose(use_web=options.expose_web, slide_mode=options.slide_mode, slide_timeout=options.slide_timeout, verbose=options.verbose ) else: robot = PspsRobot.from_vloc_rcut_list(options.pseudo_paths[0], options.vloc_rcut_list, ecut) if options.verbose: print(robot) robot.expose(use_web=options.expose_web, slide_mode=options.slide_mode, slide_timeout=options.slide_timeout, verbose=options.verbose ) else: if options.vloc_rcut_list is not None: raise ValueError("vloc_rcut_list does not support more than one pseudo!") robot = PspsRobot.from_abinit_run(options.pseudo_paths, ecut) if options.verbose: print(robot) robot.expose(use_web=options.expose_web, slide_mode=options.slide_mode, slide_timeout=options.slide_timeout, verbose=options.verbose ) return 0
[docs] def get_epilog() -> str: return """\ Usage example: abips.py avail --> Show all registered pseudopotential repositories. abips.py list --> List repositories installed on this machine. abips.py install ONCVPSP-PBEsol-SR-PDv0.4 --> Install repository by name (requires internet connection). abips.py show ONCVPSP-PBEsol-SR-PDv0.4 --> Show info on pseudos in repository. abips.py element O --> Show all installed pseudos for element. abips.py mkff PSEUDO1 [PSEUDO2 ...] --> Compute form factors for pseudos and show them. """
#abips.py onc_install --> Get all NC repositories (most recent version) #abips.py onc_install -xc PBE -fr -sr -v 0.4 #abips.py jth_install --> Get all JTH PAW repositories (most recent version)
[docs] def get_parser(with_epilog=False): # Parent parser for common options. copts_parser = argparse.ArgumentParser(add_help=False) copts_parser.add_argument('-v', '--verbose', default=0, action='count', # -vv --> verbose=2 help='verbose, can be supplied multiple times to increase verbosity.') copts_parser.add_argument('--loglevel', default="ERROR", type=str, help="Set the loglevel. Possible values: CRITICAL, ERROR (default), WARNING, INFO, DEBUG") #copts_parser.add_argument('--repos-root', "-r", type=str, # default=os.path.expanduser(os.path.join("~", ".abinit", "pseudos")), # help='Installation directory. Default: $HOME/.abinit/pseudos') #copts_parser.add_argument('-y', "--yes", action="store_true", default=False, # help="Do not ask for confirmation when installing repositories.") # Build the main parser. parser = argparse.ArgumentParser(epilog=get_epilog() if with_epilog else "", formatter_class=argparse.RawDescriptionHelpFormatter) parser.add_argument('-V', '--version', action='version', version=__version__) # Create the parsers for the sub-commands subparsers = parser.add_subparsers(dest='command', help='sub-command help', description="Valid subcommands") # Subparser for avail command. subparsers.add_parser("avail", parents=[copts_parser], help=abips_avail.__doc__) # Subparser for list command. p_list = subparsers.add_parser("list", parents=[copts_parser], help=abips_list.__doc__) p_list.add_argument("-c", "--checksums", action="store_true", default=False, help="Validate md5 checksums.") # Subparser for install command. p_install = subparsers.add_parser("install", parents=[copts_parser], help=abips_install.__doc__) p_install.add_argument("repo_names", type=str, nargs="+", help="List of repositories to download.") p_install.add_argument("-c", "--checksums", action="store_true", default=False, help="Validate md5 checksums.") # Subparser for onc_install command. #p_onc_install = subparsers.add_parser("onc_install", parents=[copts_parser], help=abips_onc_install.__doc__) #p_onc_install.add_argument("-v", type=str, default=None, help="Table version. Default: latest one ") # Subparser for jth_install command. #p_jth_install = subparsers.add_parser("jth_install", parents=[copts_parser], help=abips_paw_install.__doc__) #p_jth_install.add_argument("-v", type=str, default=None, help="Table version. Default: latest one ") # Subparser for show command. p_show = subparsers.add_parser("show", parents=[copts_parser], help=abips_show.__doc__) p_show.add_argument("repo_names", type=str, nargs="+", help="List of repo names.") p_show.add_argument("-s", "--symbol", type=str, default=None, help="Select pseudo by element symbol.") # Subparser for list command. p_element = subparsers.add_parser("element", parents=[copts_parser], help=abips_element.__doc__) p_element.add_argument("element", type=str, help="Element symbol or atomic number.") # Subparser for mkff command. p_mkff = subparsers.add_parser("mkff", parents=[copts_parser], help=abips_mkff.__doc__) p_mkff.add_argument("pseudo_paths", nargs="+", type=str, help="Pseudopotential path.") p_mkff.add_argument("--ecut", type=float, required=True, help="Cutoff energy in Ha.") p_mkff.add_argument("-rc", "--vloc-rcut-list", nargs="+", default=None, type=float, help="List of cutoff radii for vloc in Bohr.") cli.add_expose_options_to_parser(p_mkff) return parser
[docs] def main(): def show_examples_and_exit(err_msg=None, error_code=1): """Display the usage of the script.""" sys.stderr.write(get_epilog()) if err_msg: sys.stderr.write("Fatal Error\n" + err_msg + "\n") sys.exit(error_code) parser = get_parser(with_epilog=True) # Parse command line. try: options = parser.parse_args() except Exception as exc: print(exc) show_examples_and_exit(error_code=1) #cli.set_loglevel(options.loglevel) # Use seaborn settings. if hasattr(options, "seaborn") and options.seaborn: import seaborn as sns sns.set(context=options.seaborn, style='darkgrid', palette='deep', font='sans-serif', font_scale=1, color_codes=False, rc=None) return globals()[f"abips_{options.command}"](options)
if __name__ == "__main__": sys.exit(main())