def anaget_phmodes_at_qpoint(self, qpoint=None, asr=2, chneut=1, dipdip=1, workdir=None, manager=None, verbose=0): """ Execute anaddb to compute phonon modes at the given q-point. Args: qpoint: Reduced coordinates of the qpoint where phonon modes are computed. asr, chneut, dipdp: Anaddb input variable. See official documentation. workdir: Working directory. If None, a temporary directory is created. manager: :class:`TaskManager` object. If None, the object is initialized from the configuration file verbose: verbosity level. Set it to a value > 0 to get more information Return: :class:`PhononBands` object. """ if qpoint is None: qpoint = self.qpoints[0] if len(self.qpoints) != 1: raise ValueError("%s contains %s qpoints and the choice is ambiguous.\n" "Please specify the qpoint." % (self, len(self.qpoints))) # Check if qpoint is in the DDB. try: self.qindex(qpoint) except: raise ValueError("input qpoint %s not in ddb.qpoints:%s\n" % (qpoint, self.qpoints)) inp = AnaddbInput.modes_at_qpoint(self.structure, qpoint, asr=asr, chneut=chneut, dipdip=dipdip) task = AnaddbTask.temp_shell_task(inp, ddb_node=self.filepath, workdir=workdir, manager=manager) if verbose: print("ANADDB INPUT:\n", inp) print("workdir:", task.workdir) # Run the task here task.start_and_wait(autoparal=False) report = task.get_event_report() if not report.run_completed: raise self.AnaddbError(task=task, report=report) with task.open_phbst() as ncfile: return ncfile.phbands
def anaget_phmodes_at_qpoint(self, qpoint=None, asr=2, chneut=1, dipdip=1, workdir=None, manager=None, verbose=0, lo_to_splitting=False, directions=None, anaddb_kwargs=None): """ Execute anaddb to compute phonon modes at the given q-point. Args: qpoint: Reduced coordinates of the qpoint where phonon modes are computed. asr, chneut, dipdp: Anaddb input variable. See official documentation. workdir: Working directory. If None, a temporary directory is created. manager: :class:`TaskManager` object. If None, the object is initialized from the configuration file verbose: verbosity level. Set it to a value > 0 to get more information lo_to_splitting: if True the LO-TO splitting will be calculated if qpoint==Gamma and the non_anal_directions non_anal_phfreqs attributes will be added to the returned object directions: list of 3D directions along which the LO-TO splitting will be calculated. If None the three cartesian direction will be used anaddb_kwargs: additional kwargs for anaddb Return: :class:`PhononBands` object. """ if qpoint is None: qpoint = self.qpoints[0] if len(self.qpoints) != 1: raise ValueError( "%s contains %s qpoints and the choice is ambiguous.\n" "Please specify the qpoint." % (self, len(self.qpoints))) # Check if qpoint is in the DDB. try: self.qindex(qpoint) except: raise ValueError("input qpoint %s not in ddb.qpoints:%s\n" % (qpoint, self.qpoints)) inp = AnaddbInput.modes_at_qpoint(self.structure, qpoint, asr=asr, chneut=chneut, dipdip=dipdip, lo_to_splitting=lo_to_splitting, directions=directions, anaddb_kwargs=anaddb_kwargs) task = AnaddbTask.temp_shell_task(inp, ddb_node=self.filepath, workdir=workdir, manager=manager) if verbose: print("ANADDB INPUT:\n", inp) print("workdir:", task.workdir) # Run the task here task.start_and_wait(autoparal=False) report = task.get_event_report() if not report.run_completed: raise self.AnaddbError(task=task, report=report) with task.open_phbst() as ncfile: if lo_to_splitting and np.allclose(qpoint, [0, 0, 0]): ncfile.phbands.read_non_anal_from_file( os.path.join(task.workdir, "anaddb.nc")) return ncfile.phbands