def anaget_emacro_and_becs(self, chneut=1, workdir=None, manager=None, verbose=0): """ Call anaddb to compute the macroscopic dielectric tensor and the Born effective charges. Args: chneut: Anaddb input variable. See official documentation. 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: emacro, becs """ inp = AnaddbInput(self.structure, anaddb_kwargs={"chneut": chneut}) 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) # Read data from the netcdf output file produced by anaddb. with ETSF_Reader(os.path.join(task.workdir, "anaddb.nc")) as r: structure = r.read_structure() emacro = Tensor.from_cartesian_tensor(r.read_value("emacro_cart"), structure.lattice, space="r"), becs = Becs(r.read_value("becs_cart"), structure, chneut=inp["chneut"], order="f") return emacro, becs
def anaget_ifc(self, ifcout=None, asr=2, chneut=1, dipdip=1, ngqpt=None, workdir=None, manager=None, verbose=0, anaddb_kwargs=None): """ Execute anaddb to compute the interatomic forces. Args: ifcout: Number of neighbouring atoms for which the ifc's will be output. If None all the atoms in the big box. asr, chneut, dipdip: Anaddb input variable. See official documentation. ngqpt: Number of divisions for the q-mesh in the DDB file. Auto-detected if None (default) 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 anaddb_kwargs: additional kwargs for anaddb Returns: :class:`InteratomicForceConstants` with the calculated ifc. """ if ngqpt is None: ngqpt = self.guessed_ngqpt inp = AnaddbInput.ifc(self.structure, ngqpt=ngqpt, ifcout=ifcout, q1shft=(0, 0, 0), asr=asr, chneut=chneut, dipdip=dipdip, 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) return InteratomicForceConstants.from_file( os.path.join(task.workdir, 'anaddb.nc'))
def anaget_phbst_and_phdos_files(self, nqsmall=10, ndivsm=20, asr=2, chneut=1, dipdip=1, dos_method="tetra", ngqpt=None, workdir=None, manager=None, verbose=0, lo_to_splitting=False): """ Execute anaddb to compute the phonon band structure and the phonon DOS Args: nqsmall: Defines the homogeneous q-mesh used for the DOS. Gives the number of divisions used to sample the smallest lattice vector. ndivsm: Number of division used for the smallest segment of the q-path asr, chneut, dipdp: Anaddb input variable. See official documentation. dos_method: Technique for DOS computation in Possible choices: "tetra", "gaussian" or "gaussian:0.001 eV". In the later case, the value 0.001 eV is used as gaussian broadening ngqpt: Number of divisions for the q-mesh in the DDB file. Auto-detected if None (default) 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 calculation of the LO-TO splitting will be calculated and included in the band structure Returns: :class:`PhbstFile` with the phonon band structure. :class:`PhdosFile` with the the phonon DOS. """ if ngqpt is None: ngqpt = self.guessed_ngqpt inp = AnaddbInput.phbands_and_dos( self.structure, ngqpt=ngqpt, ndivsm=ndivsm, nqsmall=nqsmall, q1shft=(0,0,0), qptbounds=None, asr=asr, chneut=chneut, dipdip=dipdip, dos_method=dos_method, lo_to_splitting=lo_to_splitting) 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) phbst = task.open_phbst() if lo_to_splitting: with ETSF_Reader(os.path.join(task.workdir, "anaddb.nc")) as r: directions = r.read_value("non_analytical_directions") non_anal_phfreq = r.read_value("non_analytical_phonon_modes") phbst.phbands.non_anal_directions = directions phbst.phbands.non_anal_phfreqs = non_anal_phfreq return phbst, task.open_phdos()
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_phbst_and_phdos_files(self, nqsmall=10, ndivsm=20, asr=2, chneut=1, dipdip=1, dos_method="tetra", ngqpt=None, workdir=None, manager=None, verbose=0, lo_to_splitting=False, qptbounds=None, anaddb_kwargs=None): """ Execute anaddb to compute the phonon band structure and the phonon DOS Args: nqsmall: Defines the homogeneous q-mesh used for the DOS. Gives the number of divisions used to sample the smallest lattice vector. ndivsm: Number of division used for the smallest segment of the q-path asr, chneut, dipdip: Anaddb input variable. See official documentation. dos_method: Technique for DOS computation in Possible choices: "tetra", "gaussian" or "gaussian:0.001 eV". In the later case, the value 0.001 eV is used as gaussian broadening ngqpt: Number of divisions for the q-mesh in the DDB file. Auto-detected if None (default) 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 and included in the band structure qptbounds: Boundaries of the path. If None, the path is generated from an internal database depending on the input structure. anaddb_kwargs: additional kwargs for anaddb Returns: :class:`PhbstFile` with the phonon band structure. :class:`PhdosFile` with the the phonon DOS. """ if ngqpt is None: ngqpt = self.guessed_ngqpt inp = AnaddbInput.phbands_and_dos(self.structure, ngqpt=ngqpt, ndivsm=ndivsm, nqsmall=nqsmall, q1shft=(0, 0, 0), qptbounds=qptbounds, asr=asr, chneut=chneut, dipdip=dipdip, dos_method=dos_method, lo_to_splitting=lo_to_splitting, 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) phbst = task.open_phbst() if lo_to_splitting: phbst.phbands.read_non_anal_from_file( os.path.join(task.workdir, "anaddb.nc")) return phbst, task.open_phdos()
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