Remove phonon_flow

This commit is contained in:
gmatteo 2019-10-15 01:24:28 +02:00
parent 78ed33ea32
commit c8e1efe8d9
6 changed files with 181 additions and 184 deletions

View File

@ -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",

View File

@ -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"""

View File

@ -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

View File

@ -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

View File

@ -1,3 +1,4 @@
monty
tabulate tabulate
apscheduler==2.1.0 apscheduler==2.1.0
pydispatcher>=2.0.5 pydispatcher>=2.0.5

View File

@ -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",