def on_all_ok(self): """ This method is called once the `Work` is completed i.e. when all the tasks have reached status S_OK. Here we get the forces from the output files, and we call phonopy to compute the inter-atomic force constants. """ phonon = self.phonon # Write POSCAR with initial unit cell. structure = structure_from_atoms(phonon.get_primitive()) structure.to(filename=self.outdir.path_in("POSCAR")) # Write yaml file with displacements. supercell = phonon.get_supercell() displacements = phonon.get_displacements() #directions = phonon.get_displacement_directions() file_IO.write_disp_yaml(displacements, supercell, # directions=directions, filename=self.outdir.path_in('disp.yaml')) # Extract forces from the main Abinit output files. forces_filenames = [task.output_file.path for task in self.phonopy_tasks] num_atoms = supercell.get_number_of_atoms() force_sets = parse_set_of_forces(num_atoms, forces_filenames) # Write FORCE_SETS file. displacements = file_IO.parse_disp_yaml(filename=self.outdir.path_in('disp.yaml')) num_atoms = displacements['natom'] for forces, disp in zip(force_sets, displacements['first_atoms']): disp['forces'] = forces file_IO.write_FORCE_SETS(displacements, filename=self.outdir.path_in('FORCE_SETS')) # Write README and configuration files. examples_url = "http://atztogo.github.io/phonopy/examples.html" doctags_url = "http://atztogo.github.io/phonopy/setting-tags.html#setting-tags" kptbounds = np.array([k.frac_coords for k in structure.hsym_kpoints]) path_coords = " ".join(str(rc) for rc in kptbounds.flat) path_labels = " ".join(k.name for k in structure.hsym_kpoints) ngqpt = structure.calc_ngkpt(nksmall=30) with open(self.outdir.path_in("band.conf"), "wt") as fh: fh.write("#" + doctags_url + "\n") fh.write("DIM = %d %d %d\n" % tuple(self.scdims)) fh.write("BAND = %s\n" % path_coords) fh.write("BAND_LABELS = %s\n" % path_labels) fh.write("BAND_POINTS = 101\n") fh.write("#BAND_CONNECTION = .TRUE.\n") with open(self.outdir.path_in("dos.conf"), "wt") as fh: fh.write("#" + doctags_url + "\n") fh.write("DIM = %d %d %d\n" % tuple(self.scdims)) fh.write("MP = %d %d %d\n" % tuple(ngqpt)) fh.write("#GAMMA_CENTER = .TRUE.\n") with open(self.outdir.path_in("band-dos.conf"), "wt") as fh: fh.write("#" + doctags_url + "\n") fh.write("DIM = %d %d %d\n" % tuple(self.scdims)) fh.write("BAND = %s\n" % path_coords) fh.write("BAND_LABELS = %s\n" % path_labels) fh.write("BAND_POINTS = 101\n") fh.write("#BAND_CONNECTION = .TRUE.\n") fh.write("MP = %d %d %d\n" % tuple(ngqpt)) fh.write("#GAMMA_CENTER = .TRUE.\n") with open(self.outdir.path_in("README.md"), "wt") as fh: fh.write("To plot bands, use:\n\tphonopy -p band.conf\n\n") fh.write("To plot phonon dos, use:\n\tphonopy -p dos.conf\n\n") fh.write("To plot bands and dos, use:\n\tphonopy -p band-dos.conf\n\n") fh.write("See also:\n") fh.write("\t" + examples_url + "\n") fh.write("\t" + doctags_url + "\n") if self.cpdata2dst: self.outdir.copy_r(self.cpdata2dst) return super(PhonopyWork, self).on_all_ok()
def on_all_ok(self): """ This method is called once the `Work` is completed i.e. when all the tasks have reached status S_OK. Here we get the forces from the output files, and we call phonopy to compute the inter-atomic force constants. """ phonon = self.phonon # Write POSCAR with initial unit cell. structure = structure_from_atoms(phonon.get_primitive()) structure.to(filename=self.outdir.path_in("POSCAR")) # Write yaml file with displacements. supercell = phonon.get_supercell() displacements = phonon.get_displacements() #directions = phonon.get_displacement_directions() file_IO.write_disp_yaml( displacements, supercell, # directions=directions, filename=self.outdir.path_in('disp.yaml')) # Extract forces from the main Abinit output files. forces_filenames = [ task.output_file.path for task in self.phonopy_tasks ] num_atoms = supercell.get_number_of_atoms() force_sets = parse_set_of_forces(num_atoms, forces_filenames) # Write FORCE_SETS file. displacements = file_IO.parse_disp_yaml( filename=self.outdir.path_in('disp.yaml')) num_atoms = displacements['natom'] for forces, disp in zip(force_sets, displacements['first_atoms']): disp['forces'] = forces file_IO.write_FORCE_SETS(displacements, filename=self.outdir.path_in('FORCE_SETS')) # Write README and configuration files. examples_url = "http://atztogo.github.io/phonopy/examples.html" doctags_url = "http://atztogo.github.io/phonopy/setting-tags.html#setting-tags" kptbounds = np.array([k.frac_coords for k in structure.hsym_kpoints]) path_coords = " ".join(str(rc) for rc in kptbounds.flat) path_labels = " ".join(k.name for k in structure.hsym_kpoints) ngqpt = structure.calc_ngkpt(nksmall=30) with open(self.outdir.path_in("band.conf"), "wt") as fh: fh.write("#" + doctags_url + "\n") fh.write("DIM = %d %d %d\n" % tuple(self.scdims)) fh.write("BAND = %s\n" % path_coords) fh.write("BAND_LABELS = %s\n" % path_labels) fh.write("BAND_POINTS = 101\n") fh.write("#BAND_CONNECTION = .TRUE.\n") with open(self.outdir.path_in("dos.conf"), "wt") as fh: fh.write("#" + doctags_url + "\n") fh.write("DIM = %d %d %d\n" % tuple(self.scdims)) fh.write("MP = %d %d %d\n" % tuple(ngqpt)) fh.write("#GAMMA_CENTER = .TRUE.\n") with open(self.outdir.path_in("band-dos.conf"), "wt") as fh: fh.write("#" + doctags_url + "\n") fh.write("DIM = %d %d %d\n" % tuple(self.scdims)) fh.write("BAND = %s\n" % path_coords) fh.write("BAND_LABELS = %s\n" % path_labels) fh.write("BAND_POINTS = 101\n") fh.write("#BAND_CONNECTION = .TRUE.\n") fh.write("MP = %d %d %d\n" % tuple(ngqpt)) fh.write("#GAMMA_CENTER = .TRUE.\n") with open(self.outdir.path_in("README.md"), "wt") as fh: fh.write("To plot bands, use:\n\tphonopy -p band.conf\n\n") fh.write("To plot phonon dos, use:\n\tphonopy -p dos.conf\n\n") fh.write( "To plot bands and dos, use:\n\tphonopy -p band-dos.conf\n\n") fh.write("See also:\n") fh.write("\t" + examples_url + "\n") fh.write("\t" + doctags_url + "\n") if self.cpdata2dst: self.outdir.copy_r(self.cpdata2dst) return super(PhonopyWork, self).on_all_ok()