Add customized ipython shell (scripts.abilab)

This commit is contained in:
gmatteo 2013-09-21 01:39:11 +02:00
parent dd717f480a
commit 4e9ec395d7
8 changed files with 150 additions and 56 deletions

View File

@ -58,16 +58,30 @@ Otherwise, these packages should be available on `PyPI <http://pypi.python.org>`
6. netCDF4 6. netCDF4
7. pyyaml 3.1.0+
Optional dependencies Optional dependencies
--------------------- ---------------------
Optional libraries that are required if you need certain features: Optional libraries that are required if you need certain features:
1. nose - For complete unittesting. 1. wxPython - For the GUI
2. wxPython - For the GUI 2. wxmplot
3. nose - For complete unittesting.
Installing wxPython
-------------------
Mac users can download the
Linux users:
TODO
The directory `abipy.gui.demos` contains demos that can be used to test the installation
(run the script `runall.py` to have an overview of the different graphical interfaces).
3. wxmplot
Using abipy Using abipy
=========== ===========

View File

@ -72,7 +72,7 @@ def abifile_subclass_from_filename(filename):
def abiopen(filepath): def abiopen(filepath):
""" """
Factory function that returns the appropriate object Factory function that opens any file supported by abipy.
Args: Args:
filepath: filepath:

View File

@ -3,6 +3,7 @@ from pymatgen.io.abinitio.task import TaskManager
from pymatgen.io.abinitio import qadapters as qadapters from pymatgen.io.abinitio import qadapters as qadapters
import abipy.core.constants as constants import abipy.core.constants as constants
from abipy import abiopen
from abipy.core.structure import Structure, StructureModifier from abipy.core.structure import Structure, StructureModifier
from abipy.htc.input import AbiInput from abipy.htc.input import AbiInput
from abipy.htc.workflows import Workflow from abipy.htc.workflows import Workflow

View File

@ -1,4 +1,4 @@
"""This module defines the structure object that store information on the crystalline structure and its symmetries.""" """This module defines basic objects representing the crystalline structure."""
from __future__ import division, print_function from __future__ import division, print_function
import collections import collections
@ -10,7 +10,6 @@ from .symmetries import SpaceGroup
from abipy.iotools import as_etsfreader, Visualizer from abipy.iotools import as_etsfreader, Visualizer
from abipy.iotools import xsf from abipy.iotools import xsf
__all__ = [ __all__ = [
"Lattice", "Lattice",
"Structure", "Structure",
@ -19,15 +18,14 @@ __all__ = [
class Lattice(pymatgen.Lattice): class Lattice(pymatgen.Lattice):
""" """
Extends the pymatgen Lattice with methods that allows one to construct Extends pymatgen.Lattice with methods that allows one
the object from ABINIT variables or to produce the set of input variables to construct a Lattice object from ABINIT variables.
from a structure
""" """
@classmethod @classmethod
def from_abivars(cls, d): def from_abivars(cls, d):
""" """
Returns a new instance from a dictionary with the ABINIT variable that Returns a new instance from a dictionary with the variables
define the unit cell. used in ABINIT to define the unit cell.
""" """
rprim = d.get("rprim", None) rprim = d.get("rprim", None)
angdeg = d.get("angdeg", None) angdeg = d.get("angdeg", None)
@ -61,12 +59,12 @@ class Structure(pymatgen.Structure):
@classmethod @classmethod
def from_file(cls, filepath): def from_file(cls, filepath):
""" """
Return a new instance from a NetCDF file containing Return a new Structure instance from a NetCDF file
crystallographic data in the ETSF-IO format.
Args: Args:
ncdata: filename:
filename or NetcdfReader instance. netcdf file with crystallographic data in the ETSF-IO format.
or any other file format supported by `pymatgen.io.smartio`.
""" """
if filepath.endswith(".nc"): if filepath.endswith(".nc"):
file, closeit = as_etsfreader(filepath) file, closeit = as_etsfreader(filepath)
@ -102,7 +100,7 @@ class Structure(pymatgen.Structure):
@property @property
def has_spacegroup(self): def has_spacegroup(self):
"""True is self contains info on the spacegroup.""" """True is the structure contains info on the spacegroup."""
return self.spacegroup is not None return self.spacegroup is not None
@property @property
@ -161,7 +159,7 @@ class Structure(pymatgen.Structure):
@property @property
def hsym_stars(self): def hsym_stars(self):
""" """
List of `Star` objects. Each start is associated to one of the special k-points List of `Star` objects. Each star is associated to one of the special k-points
present in the pymatgen database. present in the pymatgen database.
""" """
try: try:
@ -274,6 +272,7 @@ class Structure(pymatgen.Structure):
@classmethod @classmethod
def from_abivars(cls, d): def from_abivars(cls, d):
"""Build a `Structure` object from a dictionary containing ABINIT variables."""
lattice = Lattice.from_abivars(d) lattice = Lattice.from_abivars(d)
coords, coords_are_cartesian = d.get("xred", None), False coords, coords_are_cartesian = d.get("xred", None), False
@ -309,8 +308,13 @@ class Structure(pymatgen.Structure):
def write_structure(self, filename): def write_structure(self, filename):
"""See `pymatgen.io.smartio.write_structure`""" """See `pymatgen.io.smartio.write_structure`"""
from pymatgen.io.smartio import write_structure
write_structure(self, filename) if filepath.endswith(".nc"):
raise NotImplementedError("Cannot write a structure to a netcdfile file yet")
else:
from pymatgen.io.smartio import write_structure
write_structure(self, filename)
def displace(self, displ, eta, frac_coords=True): def displace(self, displ, eta, frac_coords=True):
""" """

View File

@ -12,5 +12,20 @@ advantages:
In order to facilitate the automatic execution and validation, the python scripts In order to facilitate the automatic execution and validation, the python scripts
must satisfy some basic rules and conventions. must satisfy some basic rules and conventions.
1) The name of the script must match the regular expression: #. The name of the script must match the regular expression run_[*].py so that
run_[*].py we can run all the tests easily with run_all.py
#. The execution of the test should be managed by a `Tester` object
The `Tester` is responsible for the definition of the working directory (constructed
from the name of the script by just removing the prefix `run_`), the submission
of the calculation (tester.set_work_and_run) and the analysis of the final results
(tester.finalize).
#. The script should remove all the output files produced by the run that are not needed
for the automatic tests and/or the tutorials. Each file should have a unique (meanigfull) name
so that we can easily access it with the syntax:
import abipy.data as data
path_to_reference_file = data.ref_file("basename_of_the_file")
An exception is raised if this rule is not respected.

View File

@ -106,6 +106,8 @@ def raman_workflow(workdir, structure, pseudos, shiftk):
) )
# Initialize the workflow. # Initialize the workflow.
policy=dict(autoparal=1, max_ncpus=2)
manager = abilab.TaskManager(qtype="slurm", manager = abilab.TaskManager(qtype="slurm",
qparams=dict( qparams=dict(
ntasks=2, ntasks=2,
@ -123,10 +125,10 @@ def raman_workflow(workdir, structure, pseudos, shiftk):
LD_LIBRARY_PATH="/home/naps/ygillet/NAPS/intel13/lib:$LD_LIBRARY_PATH", LD_LIBRARY_PATH="/home/naps/ygillet/NAPS/intel13/lib:$LD_LIBRARY_PATH",
), ),
mpi_runner="mpirun", mpi_runner="mpirun",
policy=dict(autoparal=1, max_ncpus=2), policy=policy
) )
#manager = abilab.TaskManager.simple_mpi(mpi_ncpus=1) manager = abilab.TaskManager.simple_mpi(mpi_ncpus=1, policy=policy)
work = abilab.Workflow(workdir, manager) work = abilab.Workflow(workdir, manager)

View File

@ -62,6 +62,7 @@ class KSState(collections.namedtuple("KSState", "spin kpoint band eig occ")):
return tuple(fields) return tuple(fields)
def asdict(self): def asdict(self):
"""Convert self into a dict."""
return super(KSState, self)._asdict() return super(KSState, self)._asdict()
def to_strdict(self, fmt=None): def to_strdict(self, fmt=None):
@ -242,10 +243,13 @@ class ElectronBands(object):
assert new.__class__ == cls assert new.__class__ == cls
return new return new
def __str__(self): def __repr__(self):
return self.tostring() return self.to_string()
def tostring(self, prtvol=0): def __str__(self):
return self.to_string()
def to_string(self, prtvol=0):
"""String representation.""" """String representation."""
lines = [] lines = []
app = lines.append app = lines.append
@ -419,7 +423,6 @@ class ElectronBands(object):
def enemin(self, spin=None, band=None): def enemin(self, spin=None, band=None):
"""Compute the minimum of the eigenvalues.""" """Compute the minimum of the eigenvalues."""
spin_range = self.spins spin_range = self.spins
if spin is not None: if spin is not None:
assert isinstance(spin, int) assert isinstance(spin, int)
@ -1231,35 +1234,6 @@ class ElectronBands(object):
return 1.0/ders2 return 1.0/ders2
#class NestingFactor(object):
#
# def __init__(self, bands):
#
# self.bands = bands
#
# # Check whether k-points form a homogeneous sampling.
# if not self.bands.has_bzmesh:
# msg = "The computation of the nesting factor requires a homogeneous k-point sampling"
# raise ValueError(msg)
#
# @classmethod
# def from_file(cls, filepath):
# """
# Initialize the object from a netcdf file containing an electronic band structure.
# """
# return cls(ElectronBands.from_file(filepath))
#
# def compute_nesting(self, qpath):
# mesh, values = None, None
# return Function1D(mesh, values)
#
# def plot(self, qpath):
# nesting = self.compute_nesting(qpath)
# nesting.plot()
#########################################################################################
class ElectronBandsPlotter(object): class ElectronBandsPlotter(object):
""" """
Class for plotting electronic bands structure and DOSes. Class for plotting electronic bands structure and DOSes.
@ -1592,3 +1566,32 @@ class ElectronsReader(ETSF_Reader, KpointsReaderMixin):
#def read_xc_parameters(self): #def read_xc_parameters(self):
# """Returns a dictionary with info on the XC functional.""" # """Returns a dictionary with info on the XC functional."""
# return XC_Parameters.from_ixc(self.read_value("ixc")) # return XC_Parameters.from_ixc(self.read_value("ixc"))
#class NestingFactor(object):
#
# def __init__(self, bands):
#
# self.bands = bands
#
# # Check whether k-points form a homogeneous sampling.
# if not self.bands.has_bzmesh:
# msg = "The computation of the nesting factor requires a homogeneous k-point sampling"
# raise ValueError(msg)
#
# @classmethod
# def from_file(cls, filepath):
# """
# Initialize the object from a netcdf file containing an electronic band structure.
# """
# return cls(ElectronBands.from_file(filepath))
#
# def compute_nesting(self, qpath):
# mesh, values = None, None
# return Function1D(mesh, values)
#
# def plot(self, qpath):
# nesting = self.compute_nesting(qpath)
# nesting.plot()
#########################################################################################

55
abipy/scripts/abilab Executable file
View File

@ -0,0 +1,55 @@
#!/usr/bin/env python
from IPython.config.loader import Config
try:
get_ipython
except NameError:
nested = 0
cfg = Config()
prompt_config = cfg.PromptManager
prompt_config.in_template = 'In [\\#]: '
prompt_config.in2_template = ' .\\D.: '
prompt_config.out_template = 'Out[\\#]: '
else:
print("Running nested copies of IPython.")
print("The prompts for the nested copy have been modified")
cfg = Config()
nested = 1
# First import the embeddable shell class
from IPython.frontend.terminal.embed import InteractiveShellEmbed
# Now create an instance of the embeddable shell. The first argument is a
# string with options exactly as you would type them if you were starting
# IPython at the system command line. Any parameters you want to define for
# configuration can thus be specified here.
import pymatgen as pymatgen
import abipy.abilab as abilab
#from pymatgen import *
from abipy.abilab import *
abi_builtins = [n for n in dir(abilab) if not n.startswith("_")]
#[n for n in dir(pymatgen) if not n.startswith("_")] + \
del abilab #, pymatgen
abi_builtins = sorted(set(abi_builtins))
import textwrap
banner = textwrap.fill(str(abi_builtins), width=70)
del textwrap
banner = ("Custom ipython environment for abipy. Useful aliases such as:\n" +
banner + "\n" +
"have been loaded.\n" +
"Type abi_builtins to get the complete list."
)
ipshell = InteractiveShellEmbed(
config=cfg,
banner1=banner,
exit_msg='Leaving abipy interpreter, back to program.')
ipshell()