mirror of https://github.com/abinit/abipy.git
Remove phonon_flow
This commit is contained in:
parent
78ed33ea32
commit
c8e1efe8d9
|
@ -38,6 +38,8 @@ ab-initio calculations and typical convergence studies.
|
||||||
AbiPy is interfaced with `Pymatgen <http://www.pymatgen.org>`_ allowing users to
|
AbiPy is interfaced with `Pymatgen <http://www.pymatgen.org>`_ allowing users to
|
||||||
benefit from the different tools and python objects available in the pymatgen ecosystem.
|
benefit from the different tools and python objects available in the pymatgen ecosystem.
|
||||||
|
|
||||||
|
The official documentation is hosted on `github pages <http://abinit.github.io/abipy>`_.
|
||||||
|
|
||||||
AbiPy can be used in conjunction with `matplotlib <http://matplotlib.org>`_, `pandas <http://pandas.pydata.org>`_,
|
AbiPy can be used in conjunction with `matplotlib <http://matplotlib.org>`_, `pandas <http://pandas.pydata.org>`_,
|
||||||
`ipython <https://ipython.org/index.html>`_ and `jupyter <http://jupyter.org/>`_
|
`ipython <https://ipython.org/index.html>`_ and `jupyter <http://jupyter.org/>`_
|
||||||
thus providing a powerful and user-friendly environment for data analysis and visualization.
|
thus providing a powerful and user-friendly environment for data analysis and visualization.
|
||||||
|
@ -46,6 +48,9 @@ To learn more about the integration between jupyter and AbiPy, visit our collect
|
||||||
<http://nbviewer.ipython.org/github/abinit/abipy/blob/master/abipy/examples/notebooks/index.ipynb>`_ and the
|
<http://nbviewer.ipython.org/github/abinit/abipy/blob/master/abipy/examples/notebooks/index.ipynb>`_ and the
|
||||||
`AbiPy lessons <http://nbviewer.ipython.org/github/abinit/abipy/blob/master/abipy/examples/notebooks/lessons/index.ipynb>`_.
|
`AbiPy lessons <http://nbviewer.ipython.org/github/abinit/abipy/blob/master/abipy/examples/notebooks/lessons/index.ipynb>`_.
|
||||||
|
|
||||||
|
To learn more about the integration between jupyter and AbiPy, visit `our collection of notebooks
|
||||||
|
<https://nbviewer.jupyter.org/github/abinit/abitutorials/blob/master/abitutorials/index.ipynb>`_
|
||||||
|
|
||||||
The latest development version is always available from <https://github.com/abinit/abipy>
|
The latest development version is always available from <https://github.com/abinit/abipy>
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
@ -67,8 +72,6 @@ download_url = "https://github.com/abinit/abipy"
|
||||||
platforms = ['Linux', 'darwin']
|
platforms = ['Linux', 'darwin']
|
||||||
keywords = ["ABINIT", "ab-initio", "density-function-theory", "first-principles", "electronic-structure", "pymatgen"]
|
keywords = ["ABINIT", "ab-initio", "density-function-theory", "first-principles", "electronic-structure", "pymatgen"]
|
||||||
classifiers = [
|
classifiers = [
|
||||||
"Programming Language :: Python :: 2",
|
|
||||||
"Programming Language :: Python :: 2.7",
|
|
||||||
"Programming Language :: Python :: 3",
|
"Programming Language :: Python :: 3",
|
||||||
"Programming Language :: Python :: 3.6",
|
"Programming Language :: Python :: 3.6",
|
||||||
"Programming Language :: Python :: 3.7",
|
"Programming Language :: Python :: 3.7",
|
||||||
|
|
|
@ -1029,7 +1029,6 @@ def _from_cart_to_red(cartesian_tensor,lattice):
|
||||||
|
|
||||||
|
|
||||||
# TODO Remove
|
# TODO Remove
|
||||||
#@deprecated(message="abipy.core.Tensor is deprecated and will be replaced by pymatgen tensor in v0.4")
|
|
||||||
class _Tensor(object):
|
class _Tensor(object):
|
||||||
"""Representation of a 3x3 tensor"""
|
"""Representation of a 3x3 tensor"""
|
||||||
|
|
||||||
|
|
|
@ -13,7 +13,7 @@ from .tasks import *
|
||||||
from .tasks import EphTask, ElasticTask
|
from .tasks import EphTask, ElasticTask
|
||||||
from .works import *
|
from .works import *
|
||||||
from .flows import (Flow, G0W0WithQptdmFlow, bandstructure_flow, PhononFlow,
|
from .flows import (Flow, G0W0WithQptdmFlow, bandstructure_flow, PhononFlow,
|
||||||
g0w0_flow, phonon_flow, phonon_conv_flow, NonLinearCoeffFlow)
|
g0w0_flow, NonLinearCoeffFlow)
|
||||||
from .abitimer import AbinitTimerParser, AbinitTimerSection
|
from .abitimer import AbinitTimerParser, AbinitTimerSection
|
||||||
from pymatgen.io.abinit.abiinspect import GroundStateScfCycle, D2DEScfCycle
|
from pymatgen.io.abinit.abiinspect import GroundStateScfCycle, D2DEScfCycle
|
||||||
|
|
||||||
|
|
|
@ -25,7 +25,6 @@ from monty.io import FileLock
|
||||||
from monty.pprint import draw_tree
|
from monty.pprint import draw_tree
|
||||||
from monty.termcolor import cprint, colored, cprint_map, get_terminal_size
|
from monty.termcolor import cprint, colored, cprint_map, get_terminal_size
|
||||||
from monty.inspect import find_top_pyfile
|
from monty.inspect import find_top_pyfile
|
||||||
from monty.dev import deprecated
|
|
||||||
from monty.json import MSONable
|
from monty.json import MSONable
|
||||||
from pymatgen.util.serialization import pmg_pickle_load, pmg_pickle_dump, pmg_serialize
|
from pymatgen.util.serialization import pmg_pickle_load, pmg_pickle_dump, pmg_serialize
|
||||||
from pymatgen.core.units import Memory
|
from pymatgen.core.units import Memory
|
||||||
|
@ -55,7 +54,7 @@ __all__ = [
|
||||||
"G0W0WithQptdmFlow",
|
"G0W0WithQptdmFlow",
|
||||||
"bandstructure_flow",
|
"bandstructure_flow",
|
||||||
"g0w0_flow",
|
"g0w0_flow",
|
||||||
"phonon_flow",
|
#"phonon_flow",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|
||||||
|
@ -2886,175 +2885,175 @@ class NonLinearCoeffFlow(Flow):
|
||||||
return retcode
|
return retcode
|
||||||
|
|
||||||
|
|
||||||
def phonon_flow(workdir, scf_input, ph_inputs, with_nscf=False, with_ddk=False, with_dde=False,
|
#def phonon_flow(workdir, scf_input, ph_inputs, with_nscf=False, with_ddk=False, with_dde=False,
|
||||||
manager=None, flow_class=PhononFlow, allocate=True):
|
# manager=None, flow_class=PhononFlow, allocate=True):
|
||||||
"""
|
# """
|
||||||
Build a :class:`PhononFlow` for phonon calculations.
|
# Build a :class:`PhononFlow` for phonon calculations.
|
||||||
|
#
|
||||||
Args:
|
# Args:
|
||||||
workdir: Working directory.
|
# workdir: Working directory.
|
||||||
scf_input: Input for the GS SCF run.
|
# scf_input: Input for the GS SCF run.
|
||||||
ph_inputs: List of Inputs for the phonon runs.
|
# ph_inputs: List of Inputs for the phonon runs.
|
||||||
with_nscf: add an nscf task in front of al phonon tasks to make sure the q point is covered
|
# with_nscf: add an nscf task in front of al phonon tasks to make sure the q point is covered
|
||||||
with_ddk: add the ddk step
|
# with_ddk: add the ddk step
|
||||||
with_dde: add the dde step it the dde is set ddk is switched on automatically
|
# with_dde: add the dde step it the dde is set ddk is switched on automatically
|
||||||
manager: :class:`TaskManager` used to submit the jobs
|
# manager: :class:`TaskManager` used to submit the jobs
|
||||||
Initialized from manager.yml if manager is None.
|
# Initialized from manager.yml if manager is None.
|
||||||
flow_class: Flow class
|
# flow_class: Flow class
|
||||||
|
#
|
||||||
Returns:
|
# Returns:
|
||||||
:class:`Flow` object
|
# :class:`Flow` object
|
||||||
"""
|
# """
|
||||||
logger.critical("phonon_flow is deprecated and could give wrong results")
|
# logger.critical("phonon_flow is deprecated and could give wrong results")
|
||||||
if with_dde:
|
# if with_dde:
|
||||||
with_ddk = True
|
# with_ddk = True
|
||||||
|
#
|
||||||
natom = len(scf_input.structure)
|
# natom = len(scf_input.structure)
|
||||||
|
#
|
||||||
# Create the container that will manage the different works.
|
# # Create the container that will manage the different works.
|
||||||
flow = flow_class(workdir, manager=manager)
|
# flow = flow_class(workdir, manager=manager)
|
||||||
|
#
|
||||||
# Register the first work (GS calculation)
|
# # Register the first work (GS calculation)
|
||||||
# register_task creates a work for the task, registers it to the flow and returns the work
|
# # register_task creates a work for the task, registers it to the flow and returns the work
|
||||||
# the 0the element of the work is the task
|
# # the 0the element of the work is the task
|
||||||
scf_task = flow.register_task(scf_input, task_class=ScfTask)[0]
|
# scf_task = flow.register_task(scf_input, task_class=ScfTask)[0]
|
||||||
|
#
|
||||||
# Build a temporary work with a shell manager just to run
|
# # Build a temporary work with a shell manager just to run
|
||||||
# ABINIT to get the list of irreducible pertubations for this q-point.
|
# # ABINIT to get the list of irreducible pertubations for this q-point.
|
||||||
shell_manager = flow.manager.to_shell_manager(mpi_procs=1)
|
# shell_manager = flow.manager.to_shell_manager(mpi_procs=1)
|
||||||
|
#
|
||||||
if with_ddk:
|
# if with_ddk:
|
||||||
logger.info('add ddk')
|
# logger.info('add ddk')
|
||||||
# TODO
|
# # TODO
|
||||||
# MG Warning: be careful here because one should use tolde or tolwfr (tolvrs shall not be used!)
|
# # MG Warning: be careful here because one should use tolde or tolwfr (tolvrs shall not be used!)
|
||||||
ddk_input = ph_inputs[0].deepcopy()
|
# ddk_input = ph_inputs[0].deepcopy()
|
||||||
ddk_input.set_vars(qpt=[0, 0, 0], rfddk=1, rfelfd=2, rfdir=[1, 1, 1])
|
# ddk_input.set_vars(qpt=[0, 0, 0], rfddk=1, rfelfd=2, rfdir=[1, 1, 1])
|
||||||
ddk_task = flow.register_task(ddk_input, deps={scf_task: 'WFK'}, task_class=DdkTask)[0]
|
# ddk_task = flow.register_task(ddk_input, deps={scf_task: 'WFK'}, task_class=DdkTask)[0]
|
||||||
|
#
|
||||||
if with_dde:
|
# if with_dde:
|
||||||
logger.info('add dde')
|
# logger.info('add dde')
|
||||||
dde_input = ph_inputs[0].deepcopy()
|
# dde_input = ph_inputs[0].deepcopy()
|
||||||
dde_input.set_vars(qpt=[0, 0, 0], rfddk=1, rfelfd=2)
|
# dde_input.set_vars(qpt=[0, 0, 0], rfddk=1, rfelfd=2)
|
||||||
dde_input_idir = dde_input.deepcopy()
|
# dde_input_idir = dde_input.deepcopy()
|
||||||
dde_input_idir.set_vars(rfdir=[1, 1, 1])
|
# dde_input_idir.set_vars(rfdir=[1, 1, 1])
|
||||||
dde_task = flow.register_task(dde_input, deps={scf_task: 'WFK', ddk_task: 'DDK'}, task_class=DdeTask)[0]
|
# dde_task = flow.register_task(dde_input, deps={scf_task: 'WFK', ddk_task: 'DDK'}, task_class=DdeTask)[0]
|
||||||
|
#
|
||||||
if not isinstance(ph_inputs, (list, tuple)):
|
# if not isinstance(ph_inputs, (list, tuple)):
|
||||||
ph_inputs = [ph_inputs]
|
# ph_inputs = [ph_inputs]
|
||||||
|
#
|
||||||
for i, ph_input in enumerate(ph_inputs):
|
# for i, ph_input in enumerate(ph_inputs):
|
||||||
fake_input = ph_input.deepcopy()
|
# fake_input = ph_input.deepcopy()
|
||||||
|
#
|
||||||
# Run abinit on the front-end to get the list of irreducible pertubations.
|
# # Run abinit on the front-end to get the list of irreducible pertubations.
|
||||||
tmp_dir = os.path.join(workdir, "__ph_run" + str(i) + "__")
|
# tmp_dir = os.path.join(workdir, "__ph_run" + str(i) + "__")
|
||||||
w = PhononWork(workdir=tmp_dir, manager=shell_manager)
|
# w = PhononWork(workdir=tmp_dir, manager=shell_manager)
|
||||||
fake_task = w.register(fake_input)
|
# fake_task = w.register(fake_input)
|
||||||
|
#
|
||||||
# Use the magic value paral_rf = -1 to get the list of irreducible perturbations for this q-point.
|
# # Use the magic value paral_rf = -1 to get the list of irreducible perturbations for this q-point.
|
||||||
abivars = dict(
|
# abivars = dict(
|
||||||
paral_rf=-1,
|
# paral_rf=-1,
|
||||||
rfatpol=[1, natom], # Set of atoms to displace.
|
# rfatpol=[1, natom], # Set of atoms to displace.
|
||||||
rfdir=[1, 1, 1], # Along this set of reduced coordinate axis.
|
# rfdir=[1, 1, 1], # Along this set of reduced coordinate axis.
|
||||||
)
|
# )
|
||||||
|
#
|
||||||
fake_task.set_vars(abivars)
|
# fake_task.set_vars(abivars)
|
||||||
w.allocate()
|
# w.allocate()
|
||||||
w.start(wait=True)
|
# w.start(wait=True)
|
||||||
|
#
|
||||||
# Parse the file to get the perturbations.
|
# # Parse the file to get the perturbations.
|
||||||
try:
|
# try:
|
||||||
irred_perts = yaml_read_irred_perts(fake_task.log_file.path)
|
# irred_perts = yaml_read_irred_perts(fake_task.log_file.path)
|
||||||
except Exception:
|
# except Exception:
|
||||||
print("Error in %s" % fake_task.log_file.path)
|
# print("Error in %s" % fake_task.log_file.path)
|
||||||
raise
|
# raise
|
||||||
|
#
|
||||||
logger.info(irred_perts)
|
# logger.info(irred_perts)
|
||||||
|
#
|
||||||
w.rmtree()
|
# w.rmtree()
|
||||||
|
#
|
||||||
# Now we can build the final list of works:
|
# # Now we can build the final list of works:
|
||||||
# One work per q-point, each work computes all
|
# # One work per q-point, each work computes all
|
||||||
# the irreducible perturbations for a singe q-point.
|
# # the irreducible perturbations for a singe q-point.
|
||||||
|
#
|
||||||
work_qpt = PhononWork()
|
# work_qpt = PhononWork()
|
||||||
|
#
|
||||||
if with_nscf:
|
# if with_nscf:
|
||||||
# MG: Warning this code assume 0 is Gamma!
|
# # MG: Warning this code assume 0 is Gamma!
|
||||||
nscf_input = copy.deepcopy(scf_input)
|
# nscf_input = copy.deepcopy(scf_input)
|
||||||
nscf_input.set_vars(kptopt=3, iscf=-3, qpt=irred_perts[0]['qpt'], nqpt=1)
|
# nscf_input.set_vars(kptopt=3, iscf=-3, qpt=irred_perts[0]['qpt'], nqpt=1)
|
||||||
nscf_task = work_qpt.register_nscf_task(nscf_input, deps={scf_task: "DEN"})
|
# nscf_task = work_qpt.register_nscf_task(nscf_input, deps={scf_task: "DEN"})
|
||||||
deps = {nscf_task: "WFQ", scf_task: "WFK"}
|
# deps = {nscf_task: "WFQ", scf_task: "WFK"}
|
||||||
else:
|
# else:
|
||||||
deps = {scf_task: "WFK"}
|
# deps = {scf_task: "WFK"}
|
||||||
|
#
|
||||||
if with_ddk:
|
# if with_ddk:
|
||||||
deps[ddk_task] = 'DDK'
|
# deps[ddk_task] = 'DDK'
|
||||||
|
#
|
||||||
logger.info(irred_perts[0]['qpt'])
|
# logger.info(irred_perts[0]['qpt'])
|
||||||
|
#
|
||||||
for irred_pert in irred_perts:
|
# for irred_pert in irred_perts:
|
||||||
#print(irred_pert)
|
# #print(irred_pert)
|
||||||
new_input = ph_input.deepcopy()
|
# new_input = ph_input.deepcopy()
|
||||||
|
#
|
||||||
#rfatpol 1 1 # Only the first atom is displaced
|
# #rfatpol 1 1 # Only the first atom is displaced
|
||||||
#rfdir 1 0 0 # Along the first reduced coordinate axis
|
# #rfdir 1 0 0 # Along the first reduced coordinate axis
|
||||||
qpt = irred_pert["qpt"]
|
# qpt = irred_pert["qpt"]
|
||||||
idir = irred_pert["idir"]
|
# idir = irred_pert["idir"]
|
||||||
ipert = irred_pert["ipert"]
|
# ipert = irred_pert["ipert"]
|
||||||
|
#
|
||||||
# TODO this will work for phonons, but not for the other types of perturbations.
|
# # TODO this will work for phonons, but not for the other types of perturbations.
|
||||||
rfdir = 3 * [0]
|
# rfdir = 3 * [0]
|
||||||
rfdir[idir - 1] = 1
|
# rfdir[idir - 1] = 1
|
||||||
rfatpol = [ipert, ipert]
|
# rfatpol = [ipert, ipert]
|
||||||
|
#
|
||||||
new_input.set_vars(
|
# new_input.set_vars(
|
||||||
#rfpert=1,
|
# #rfpert=1,
|
||||||
qpt=qpt,
|
# qpt=qpt,
|
||||||
rfdir=rfdir,
|
# rfdir=rfdir,
|
||||||
rfatpol=rfatpol,
|
# rfatpol=rfatpol,
|
||||||
)
|
# )
|
||||||
|
#
|
||||||
if with_ddk:
|
# if with_ddk:
|
||||||
new_input.set_vars(rfelfd=3)
|
# new_input.set_vars(rfelfd=3)
|
||||||
|
#
|
||||||
work_qpt.register_phonon_task(new_input, deps=deps)
|
# work_qpt.register_phonon_task(new_input, deps=deps)
|
||||||
|
#
|
||||||
flow.register_work(work_qpt)
|
# flow.register_work(work_qpt)
|
||||||
|
#
|
||||||
if allocate: flow.allocate()
|
# if allocate: flow.allocate()
|
||||||
|
#
|
||||||
return flow
|
# return flow
|
||||||
|
#
|
||||||
|
#
|
||||||
def phonon_conv_flow(workdir, scf_input, qpoints, params, manager=None, allocate=True):
|
#def phonon_conv_flow(workdir, scf_input, qpoints, params, manager=None, allocate=True):
|
||||||
"""
|
# """
|
||||||
Create a :class:`Flow` to perform convergence studies for phonon calculations.
|
# Create a :class:`Flow` to perform convergence studies for phonon calculations.
|
||||||
|
#
|
||||||
Args:
|
# Args:
|
||||||
workdir: Working directory of the flow.
|
# workdir: Working directory of the flow.
|
||||||
scf_input: :class:`AbinitInput` object defining a GS-SCF calculation.
|
# scf_input: :class:`AbinitInput` object defining a GS-SCF calculation.
|
||||||
qpoints: List of list of lists with the reduced coordinates of the q-point(s).
|
# qpoints: List of list of lists with the reduced coordinates of the q-point(s).
|
||||||
params:
|
# params:
|
||||||
To perform a converge study wrt ecut: params=["ecut", [2, 4, 6]]
|
# To perform a converge study wrt ecut: params=["ecut", [2, 4, 6]]
|
||||||
manager: :class:`TaskManager` object responsible for the submission of the jobs.
|
# manager: :class:`TaskManager` object responsible for the submission of the jobs.
|
||||||
If manager is None, the object is initialized from the yaml file
|
# If manager is None, the object is initialized from the yaml file
|
||||||
located either in the working directory or in the user configuration dir.
|
# located either in the working directory or in the user configuration dir.
|
||||||
allocate: True if the flow should be allocated before returning.
|
# allocate: True if the flow should be allocated before returning.
|
||||||
|
#
|
||||||
Return:
|
# Return:
|
||||||
:class:`Flow` object.
|
# :class:`Flow` object.
|
||||||
"""
|
# """
|
||||||
qpoints = np.reshape(qpoints, (-1, 3))
|
# qpoints = np.reshape(qpoints, (-1, 3))
|
||||||
|
#
|
||||||
flow = Flow(workdir=workdir, manager=manager)
|
# flow = Flow(workdir=workdir, manager=manager)
|
||||||
|
#
|
||||||
for qpt in qpoints:
|
# for qpt in qpoints:
|
||||||
for gs_inp in scf_input.product(*params):
|
# for gs_inp in scf_input.product(*params):
|
||||||
# Register the SCF task
|
# # Register the SCF task
|
||||||
work = flow.register_scf_task(gs_inp)
|
# work = flow.register_scf_task(gs_inp)
|
||||||
|
#
|
||||||
# Add the PhononWork connected to this scf_task.
|
# # Add the PhononWork connected to this scf_task.
|
||||||
flow.register_work(PhononWork.from_scf_task(work[0], qpoints=qpt))
|
# flow.register_work(PhononWork.from_scf_task(work[0], qpoints=qpt))
|
||||||
|
#
|
||||||
if allocate: flow.allocate()
|
# if allocate: flow.allocate()
|
||||||
return flow
|
# return flow
|
||||||
|
|
|
@ -1,3 +1,4 @@
|
||||||
|
monty
|
||||||
tabulate
|
tabulate
|
||||||
apscheduler==2.1.0
|
apscheduler==2.1.0
|
||||||
pydispatcher>=2.0.5
|
pydispatcher>=2.0.5
|
||||||
|
|
7
setup.py
7
setup.py
|
@ -9,12 +9,6 @@ import shutil
|
||||||
from glob import glob
|
from glob import glob
|
||||||
from setuptools import find_packages, setup, Extension
|
from setuptools import find_packages, setup, Extension
|
||||||
|
|
||||||
# This check is also made in abipy/__init__, don't forget to update both when
|
|
||||||
# changing Python version requirements.
|
|
||||||
#if sys.version[0:3] < '2.7':
|
|
||||||
# sys.stderr.write("abipy requires Python version 2.7 or above. Exiting.")
|
|
||||||
# sys.exit(1)
|
|
||||||
|
|
||||||
ext_modules = []
|
ext_modules = []
|
||||||
|
|
||||||
#-------------------------------------------------------------------------------
|
#-------------------------------------------------------------------------------
|
||||||
|
@ -145,6 +139,7 @@ def cleanup():
|
||||||
# install_requires = [s.strip() for s in fh]
|
# install_requires = [s.strip() for s in fh]
|
||||||
|
|
||||||
install_requires = [
|
install_requires = [
|
||||||
|
"monty",
|
||||||
"tabulate",
|
"tabulate",
|
||||||
"apscheduler==2.1.0",
|
"apscheduler==2.1.0",
|
||||||
"pydispatcher>=2.0.5",
|
"pydispatcher>=2.0.5",
|
||||||
|
|
Loading…
Reference in New Issue