Example #1
0
    def evaluate_ga_vasp_and_update(self, childname=""):
        """Evaluate the Genetic Algorithm VASP ingredient.
        """
        raise NotImplementedError
        childpath = os.path.join(os.path.dirname(self.keywords['name']), childname)
        from mastlib.amy_ga_code import fitness_evaluation
        from MAST.ingredients.checker import VaspChecker
        from MAST.utility import MASTFile
        dircontents = os.listdir(self.keywords['name'])
        subfolders = list()
        for diritem in dircontents:
            fulldir = os.path.join(self.keywords['name'],diritem)
            if os.path.isdir(fulldir) and diritem.isdigit():
                subfolders.append(fulldir)
        
        energylist = list()
        structurelist = list()
        for subfolder in subfolders:
            mychecker = VaspChecker(subfolder, self.keywords['program_keys'], self.keywords['structure'])
            mystructure = mychecker.get_final_structure_from_directory()
            structurelist.append(mystructure)
            myenergy = mychecker.get_energy_from_energy_file()
            energylist.append(myenergy)

        [fitoutput, fitstructure] = fitness_evaluation.evaluate(structurelist, energylist)
        #If output is a structure or xyz file, could just write it directly.
        fitfile = MASTFile()
        fitfile.data = fitoutput
        import time
        timestamp = time.strftime("%Y%m%d_%H%M%S")
        outputname = "my_output_%s" % timestamp
        outputstrname = "my_structure_%s" % timestamp
        fitfile.to_file(os.path.join(childpath, outputname)) 
        fitstructure.write_file(os.path.join(childpath, outputstrname))
        return " %s and %s written in %s" % (outputname, outputstrname, childpath)
Example #2
0
def main(ingname=""):
    """Get the energy from an ingredient.
        Args:
            ingname <str>: Ingredient name, full path
        Returns:
            <string>: "energy (eV);<energy as a string>", ex:
                "energy (eV); 3.0"
                Returns last E0 energy for a VASP run.
                Returns last E0 energy for all images for a VASP neb.
                Returns "N/A" otherwise.
    """
    trymeta = "%s/metadata.txt" % ingname
    if os.path.isfile(trymeta):
        mymeta = Metadata(metafile=trymeta)
        myprogram = mymeta.read_data("program")
    else:
        myprogram = "None"
    if 'induce' in ingname: #skip inducedefect ingredients
        myprogram = "None"
    if 'vasp' in myprogram:
        if os.path.isdir("%s/01" % ingname):
            estr = "energies (eV)"
            for subdir in dirutil.immediate_subdirs(ingname):
                mychecker = VaspChecker(name="%s/%s" % (ingname, subdir))
                estr = estr + ";%3.3f" % mychecker.get_energy_from_energy_file()
            return estr
        else:
            mychecker = VaspChecker(name=ingname)
            return "energy (eV);%3.3f" % mychecker.get_energy_from_energy_file()
    else:
        return "energy (eV);N/A"
Example #3
0
    def _nosd_my_dynmat(self):
        """Creates fake blocks in DYNMAT for filling back in the atoms and 
            directions skipped through selective dynamics.
        """
        name=self.keywords['name']
        if not os.path.isfile(name + "/DYNMAT_mod_1"):
            raise MASTError("checker/phon_checker", "No DYNMAT_mod_1 found in %s." % name)
        myvc = VaspChecker(name=self.keywords['name'],program_keys = self.keywords['program_keys'], structure = self.keywords['structure'])
        myforces=myvc.read_my_dynamical_matrix_file(name,"DYNMAT_mod_1")
        numatoms = myforces['numatoms']
        myforces['numdisp'] = numatoms * 3 #full set of all blocks
        for atom in range(1, numatoms+1):
            if not atom in myforces['atoms'].keys():
                myforces['atoms'][atom]=dict()
            for dispct in range(1, 4):
                if not dispct in myforces['atoms'][atom].keys():
                    myforces['atoms'][atom][dispct]=dict()
                    if dispct == 1:
                        displine = "0.0001 0 0"
                    elif dispct == 2:
                        displine = "0 0.0001 0"
                    else:
                        displine = "0 0 0.0001"
                    myforces['atoms'][atom][dispct]['displine']=displine
                    myforces['atoms'][atom][dispct]['dynmat']=list()
                    for act in range(0, numatoms):
                        myforces['atoms'][atom][dispct]['dynmat'].append("0.000 0.000 0.000\n")
        myvc = VaspChecker(name=self.keywords['name'],program_keys = self.keywords['program_keys'], structure = self.keywords['structure'])

        myvc.write_my_dynamical_matrix_file(myforces, name, "DYNMAT_mod_2")
Example #4
0
 def is_complete(self):
     """Check if all images in a VASP NEB calculation are complete.
     """
     dirname = self.keywords['name']
     numim = int(self.keywords['program_keys']['mast_neb_settings']['images'])
     imct=1
     while imct <= numim:
         num_str = str(imct).zfill(2)
         impath = os.path.join(dirname, num_str)
         singlechecker=VaspChecker(name=impath,program_keys=self.keywords['program_keys'],structure=self.keywords['structure'])
         if not singlechecker.is_complete():
             return False
         imct = imct + 1
     return True
Example #5
0
 def _phon_forces_setup(self):
     """Set up the FORCES file. This is like the DYNMAT but with the mass
         line stripped out and no direction indicators. Also, a block must
         be present for every atom, with a displacement, even if all entries
         are zero (e.g. fake block for selective dynamics). First line contains
         only the number of total displacements.
     """
     self._replace_my_displacements()
     self._nosd_my_dynmat()
     name=self.keywords['name']
     if not os.path.isfile(name + "/DYNMAT_mod_2"):
         raise MASTError("checker/phon_checker", "No DYNMAT_mod_2 found in %s." % name)
     myvc = VaspChecker(name=self.keywords['name'],program_keys = self.keywords['program_keys'], structure = self.keywords['structure'])
     mydyn=myvc.read_my_dynamical_matrix_file(name, "DYNMAT_mod_2")
     myvc.write_my_dynmat_without_disp_or_mass(mydyn, name, "FORCES")
Example #6
0
 def _replace_my_displacements(self):
     """
         In VASP, 0.01 0 0 in DYNMAT from phonons is 1/Angstroms in the 
         x-direction (XDATCAR shows that it makes fractional coord 
         displacements for all 3 lattice vectors in a non-cubic system to get 
         this strictly-x-direction) 
         In PHON, 0.01 0 0 means 0.01 multiplied by lattice vector a.
         Back out the fractional displacements used by VASP from the XDATCAR, 
         match them up, and use them.
         Konfig =1 is the un-displaced cell.
         Now for NFREE=2,
         there are two Konfigs for each displacment; the first is positive
         POTIM in the x-direction (for example, POTIM = 0.01), then negative
         POTIM in the x-direction, then y, then z.
         So one unfrozen atom has seven Konfigs.
         DYNMAT, however, reports the AVERAGE force from each Konfig pair.
         So we only want Konfigs 2, 4, and 6, corresponding to POTIM 0 0, 
         0 POTIM 0, and 0 0 POTIM
     """
     name=self.keywords['name']
     if not os.path.isfile(name + "/XDATCAR"):
         raise MASTError("checker/phon_checker", "No XDATCAR found in %s." % name)
     myvc = VaspChecker(name=self.keywords['name'],program_keys = self.keywords['program_keys'], structure = self.keywords['structure'])
     myxdat=myvc.read_my_displacement_file(name)
     if not os.path.isfile(name + "/DYNMAT"):
         raise MASTError("checker/phon_checker", "No DYNMAT found in %s." % name)
     myforces=myvc.read_my_dynamical_matrix_file(name)
     atomlist = myforces['atoms'].keys()
     atomlist.sort()
     #first disp needs kfg 2
     #second disp needs kfg 4
     #third disp needs kfg 6...
     dispct=0
     for atom in atomlist:
         displist = myforces['atoms'][atom].keys()
         displist.sort()
         for disp in displist:
             dispct = dispct + 1
             kfgidx = dispct * 2
             atomline = myxdat['configs'][kfgidx][atom-1] #indexing of atoms starts at config list entry 0 for atom 1
             baseline = myxdat['configs'][1][atom-1]
             atomcoords = np.array(atomline.strip().split(), float)
             basecoords = np.array(baseline.strip().split(), float)
             dispcoords = atomcoords - basecoords
             displine = str(dispcoords[0]) + " " + str(dispcoords[1]) + " " + str(dispcoords[2])
             myforces['atoms'][atom][disp]['displine'] = displine
     myvc.write_my_dynamical_matrix_file(myforces, name, "DYNMAT_mod_1")
Example #7
0
 def is_complete(self):
     """Check if all images in a VASP NEB calculation are complete.
     """
     dirname = self.keywords['name']
     numim = int(
         self.keywords['program_keys']['mast_neb_settings']['images'])
     imct = 1
     while imct <= numim:
         num_str = str(imct).zfill(2)
         impath = os.path.join(dirname, num_str)
         singlechecker = VaspChecker(
             name=impath,
             program_keys=self.keywords['program_keys'],
             structure=self.keywords['structure'])
         if not singlechecker.is_complete():
             return False
         imct = imct + 1
     return True
Example #8
0
 def _phon_forces_setup(self):
     """Set up the FORCES file. This is like the DYNMAT but with the mass
         line stripped out and no direction indicators. Also, a block must
         be present for every atom, with a displacement, even if all entries
         are zero (e.g. fake block for selective dynamics). First line contains
         only the number of total displacements.
     """
     self._replace_my_displacements()
     self._nosd_my_dynmat()
     name = self.keywords['name']
     if not os.path.isfile(name + "/DYNMAT_mod_2"):
         raise MASTError("checker/phon_checker",
                         "No DYNMAT_mod_2 found in %s." % name)
     myvc = VaspChecker(name=self.keywords['name'],
                        program_keys=self.keywords['program_keys'],
                        structure=self.keywords['structure'])
     mydyn = myvc.read_my_dynamical_matrix_file(name, "DYNMAT_mod_2")
     myvc.write_my_dynmat_without_disp_or_mass(mydyn, name, "FORCES")
Example #9
0
def main(ingname=""):
    """Get the energy from an ingredient.
        Args:
            ingname <str>: Ingredient name, full path
        Returns:
            <string>: "energy (eV);<energy as a string>", ex:
                "energy (eV); 3.0"
                Returns last E0 energy for a VASP run.
                Returns last E0 energy for all images for a VASP neb.
                Returns "N/A" otherwise.
    """
    trymeta = "%s/metadata.txt" % ingname
    if os.path.isfile(trymeta):
        mymeta = Metadata(metafile=trymeta)
        myprogram = mymeta.read_data("program")
    else:
        myprogram = "None"
    if 'induce' in ingname:  #skip inducedefect ingredients
        myprogram = "None"
    if 'vasp' in myprogram:
        if os.path.isdir("%s/01" % ingname):
            estr = "energies (eV)"
            for subdir in dirutil.immediate_subdirs(ingname):
                mychecker = VaspChecker(name="%s/%s" % (ingname, subdir))
                estr = estr + ";%3.3f" % mychecker.get_energy_from_energy_file(
                )
            return estr
        else:
            mychecker = VaspChecker(name=ingname)
            return "energy (eV);%3.3f" % mychecker.get_energy_from_energy_file(
            )
    else:
        return "energy (eV);N/A"
Example #10
0
    def evaluate_ga_vasp_and_update(self, childname=""):
        """Evaluate the Genetic Algorithm VASP ingredient.
        """
        raise NotImplementedError
        childpath = os.path.join(os.path.dirname(self.keywords['name']),
                                 childname)
        from mastlib.amy_ga_code import fitness_evaluation
        from MAST.ingredients.checker import VaspChecker
        from MAST.utility import MASTFile
        dircontents = os.listdir(self.keywords['name'])
        subfolders = list()
        for diritem in dircontents:
            fulldir = os.path.join(self.keywords['name'], diritem)
            if os.path.isdir(fulldir) and diritem.isdigit():
                subfolders.append(fulldir)

        energylist = list()
        structurelist = list()
        for subfolder in subfolders:
            mychecker = VaspChecker(subfolder, self.keywords['program_keys'],
                                    self.keywords['structure'])
            mystructure = mychecker.get_final_structure_from_directory()
            structurelist.append(mystructure)
            myenergy = mychecker.get_energy_from_energy_file()
            energylist.append(myenergy)

        [fitoutput,
         fitstructure] = fitness_evaluation.evaluate(structurelist, energylist)
        #If output is a structure or xyz file, could just write it directly.
        fitfile = MASTFile()
        fitfile.data = fitoutput
        import time
        timestamp = time.strftime("%Y%m%d_%H%M%S")
        outputname = "my_output_%s" % timestamp
        outputstrname = "my_structure_%s" % timestamp
        fitfile.to_file(os.path.join(childpath, outputname))
        fitstructure.write_file(os.path.join(childpath, outputstrname))
        return " %s and %s written in %s" % (outputname, outputstrname,
                                             childpath)
Example #11
0
 def _replace_my_displacements(self):
     """
         In VASP, 0.01 0 0 in DYNMAT from phonons is 1/Angstroms in the 
         x-direction (XDATCAR shows that it makes fractional coord 
         displacements for all 3 lattice vectors in a non-cubic system to get 
         this strictly-x-direction) 
         In PHON, 0.01 0 0 means 0.01 multiplied by lattice vector a.
         Back out the fractional displacements used by VASP from the XDATCAR, 
         match them up, and use them.
         Konfig =1 is the un-displaced cell.
         Now for NFREE=2,
         there are two Konfigs for each displacment; the first is positive
         POTIM in the x-direction (for example, POTIM = 0.01), then negative
         POTIM in the x-direction, then y, then z.
         So one unfrozen atom has seven Konfigs.
         DYNMAT, however, reports the AVERAGE force from each Konfig pair.
         So we only want Konfigs 2, 4, and 6, corresponding to POTIM 0 0, 
         0 POTIM 0, and 0 0 POTIM
     """
     name = self.keywords['name']
     if not os.path.isfile(name + "/XDATCAR"):
         raise MASTError("checker/phon_checker",
                         "No XDATCAR found in %s." % name)
     myvc = VaspChecker(name=self.keywords['name'],
                        program_keys=self.keywords['program_keys'],
                        structure=self.keywords['structure'])
     myxdat = myvc.read_my_displacement_file(name)
     if not os.path.isfile(name + "/DYNMAT"):
         raise MASTError("checker/phon_checker",
                         "No DYNMAT found in %s." % name)
     myforces = myvc.read_my_dynamical_matrix_file(name)
     atomlist = myforces['atoms'].keys()
     atomlist.sort()
     #first disp needs kfg 2
     #second disp needs kfg 4
     #third disp needs kfg 6...
     dispct = 0
     for atom in atomlist:
         displist = myforces['atoms'][atom].keys()
         displist.sort()
         for disp in displist:
             dispct = dispct + 1
             kfgidx = dispct * 2
             atomline = myxdat['configs'][kfgidx][
                 atom -
                 1]  #indexing of atoms starts at config list entry 0 for atom 1
             baseline = myxdat['configs'][1][atom - 1]
             atomcoords = np.array(atomline.strip().split(), float)
             basecoords = np.array(baseline.strip().split(), float)
             dispcoords = atomcoords - basecoords
             displine = str(dispcoords[0]) + " " + str(
                 dispcoords[1]) + " " + str(dispcoords[2])
             myforces['atoms'][atom][disp]['displine'] = displine
     myvc.write_my_dynamical_matrix_file(myforces, name, "DYNMAT_mod_1")
Example #12
0
    def _nosd_my_dynmat(self):
        """Creates fake blocks in DYNMAT for filling back in the atoms and 
            directions skipped through selective dynamics.
        """
        name = self.keywords['name']
        if not os.path.isfile(name + "/DYNMAT_mod_1"):
            raise MASTError("checker/phon_checker",
                            "No DYNMAT_mod_1 found in %s." % name)
        myvc = VaspChecker(name=self.keywords['name'],
                           program_keys=self.keywords['program_keys'],
                           structure=self.keywords['structure'])
        myforces = myvc.read_my_dynamical_matrix_file(name, "DYNMAT_mod_1")
        numatoms = myforces['numatoms']
        myforces['numdisp'] = numatoms * 3  #full set of all blocks
        for atom in range(1, numatoms + 1):
            if not atom in myforces['atoms'].keys():
                myforces['atoms'][atom] = dict()
            for dispct in range(1, 4):
                if not dispct in myforces['atoms'][atom].keys():
                    myforces['atoms'][atom][dispct] = dict()
                    if dispct == 1:
                        displine = "0.0001 0 0"
                    elif dispct == 2:
                        displine = "0 0.0001 0"
                    else:
                        displine = "0 0 0.0001"
                    myforces['atoms'][atom][dispct]['displine'] = displine
                    myforces['atoms'][atom][dispct]['dynmat'] = list()
                    for act in range(0, numatoms):
                        myforces['atoms'][atom][dispct]['dynmat'].append(
                            "0.000 0.000 0.000\n")
        myvc = VaspChecker(name=self.keywords['name'],
                           program_keys=self.keywords['program_keys'],
                           structure=self.keywords['structure'])

        myvc.write_my_dynamical_matrix_file(myforces, name, "DYNMAT_mod_2")
Example #13
0
    def __init__(self, allowed_keys, **kwargs):
        allowed_keys_base = dict()
        allowed_keys_base.update(allowed_keys)
        MASTObj.__init__(self, allowed_keys_base, **kwargs)

        work_dir = '/'.join(self.keywords['name'].split('/')[:-1])
        topmeta = Metadata(metafile='%s/metadata.txt' % work_dir)
        data = topmeta.read_data(self.keywords['name'].split('/')[-1])

        self.meta_dict = dict()
        if data:
            for datum in data.split(';'):
                self.meta_dict[datum.split(':')[0]] = datum.split(
                    ':')[1].strip()

        self.metafile = Metadata(metafile='%s/metadata.txt' %
                                 self.keywords['name'])

        self.program = self.keywords['program_keys']['mast_program'].lower()

        self.logger = loggerutils.get_mast_logger(self.keywords['name'])

        sdir = os.path.join(os.path.dirname(self.keywords['name']),
                            "structure_index_files")
        if os.path.exists(sdir):
            self.atomindex = AtomIndex(structure_index_directory=sdir)
        else:
            self.atomindex = None

        if self.program == 'vasp':
            self.checker = VaspChecker(
                name=self.keywords['name'],
                program_keys=self.keywords['program_keys'],
                structure=self.keywords['structure'])
            self.errhandler = VaspError(
                name=self.keywords['name'],
                program_keys=self.keywords['program_keys'],
                structure=self.keywords['structure'])
        elif self.program == 'vasp_neb':
            self.checker = VaspNEBChecker(
                name=self.keywords['name'],
                program_keys=self.keywords['program_keys'],
                structure=self.keywords['structure'])
            self.errhandler = VaspNEBError(
                name=self.keywords['name'],
                program_keys=self.keywords['program_keys'],
                structure=self.keywords['structure'])
        elif self.program == 'phon':
            self.checker = PhonChecker(
                name=self.keywords['name'],
                program_keys=self.keywords['program_keys'],
                structure=self.keywords['structure'])
            self.errhandler = PhonError(
                name=self.keywords['name'],
                program_keys=self.keywords['program_keys'],
                structure=self.keywords['structure'])
        elif self.program == 'lammps':
            self.checker = LammpsChecker(
                name=self.keywords['name'],
                program_keys=self.keywords['program_keys'],
                structure=self.keywords['structure'])
            self.errhandler = GenericError(
                name=self.keywords['name'],
                program_keys=self.keywords['program_keys'],
                structure=self.keywords['structure'])
        elif self.program == 'structopt':
            self.checker = StructoptChecker(
                name=self.keywords['name'],
                program_keys=self.keywords['program_keys'],
                structure=self.keywords['structure'])
            self.errhandler = GenericError(
                name=self.keywords['name'],
                program_keys=self.keywords['program_keys'],
                structure=self.keywords['structure'])
        else:
            allowed_keys = {'name', 'program_keys', 'structure'}
            self.checker = GenericChecker(
                name=self.keywords['name'],
                program_keys=self.keywords['program_keys'],
                structure=self.keywords['structure'])
            self.errhandler = GenericError(
                name=self.keywords['name'],
                program_keys=self.keywords['program_keys'],
                structure=self.keywords['structure'])
Example #14
0
    def get_total_energy(self, directory):
        """Returns the total energy from a directory"""

        abspath = '%s/%s/' % (self.recdir, directory)
        mychecker = VaspChecker(name=abspath)
        return mychecker.get_energy_from_energy_file()
Example #15
0
    def get_total_energy(self, directory):
        """Returns the total energy from a directory"""

        abspath = '%s/%s/' % (self.recdir, directory)
        mychecker = VaspChecker(name=abspath)
        return mychecker.get_energy_from_energy_file()