def test_array_equal(a, b, rtol, atol):
    assert a is not b
    assert equal(a, b, rtol=rtol, atol=atol)
    assert equal({'size': a, 'gamma': True},
                 {'size': b, 'gamma': True}, rtol=rtol, atol=atol)
    assert not equal({'size': a, 'gamma': True},
                     {'size': b, 'gamma': False}, rtol=rtol, atol=atol)
    assert not equal({'size': a}, b, rtol=rtol, atol=atol)
    assert not equal(a, {'size': b}, rtol=rtol, atol=atol)
Exemple #2
0
    def check_state(self, atoms, tol=1e-15):
        """Check for system changes since last calculation."""
        from ase.calculators.calculator import all_changes, equal
        if self.atoms is None:
            system_changes = all_changes[:]
        else:
            system_changes = []
            if not equal(self.atoms.positions, atoms.positions, atol=tol):
                system_changes.append('positions')
            if not equal(self.atoms.numbers, atoms.numbers):
                system_changes.append('numbers')
            if not equal(self.atoms.cell, atoms.cell, atol=tol):
                system_changes.append('cell')
            if not equal(self.atoms.pbc, atoms.pbc):
                system_changes.append('pbc')
            if not equal(self.atoms.get_initial_magnetic_moments(),
                         atoms.get_initial_magnetic_moments(),
                         atol=tol):
                system_changes.append('initial_magmoms')
            if not equal(self.atoms.get_initial_charges(),
                         atoms.get_initial_charges(),
                         atol=tol):
                system_changes.append('initial_charges')

        return system_changes
Exemple #3
0
    def set(self, **kwargs):
        """Set all parameters.

            Parameters:
                -kwargs  : Dictionary containing the keywords defined in
                           OpenMXParameters.
        """

        for key, value in kwargs.items():
            if key not in self.default_parameters.keys():
                raise KeyError('Unkown keyword "%s" and value "%s".' %
                               (key, value))
            if key == 'xc' and value not in self.default_parameters.allowed_xc:
                raise KeyError('Given xc "%s" is not allowed' % value)
            if key in ['dat_arguments'] and isinstance(value, dict):
                # For values that are dictionaries, verify subkeys, too.
                default_dict = self.default_parameters[key]
                for subkey in kwargs[key]:
                    if subkey not in default_dict:
                        allowed = ', '.join(list(default_dict.keys()))
                        raise TypeError('Unknown subkeyword "{0}" of keyword '
                                        '"{1}".  Must be one of: {2}'.format(
                                            subkey, key, allowed))

        # Find out what parameter has been changed
        changed_parameters = {}
        for key, value in kwargs.items():
            oldvalue = self.parameters.get(key)
            if key not in self.parameters or not equal(value, oldvalue):
                changed_parameters[key] = value
                self.parameters[key] = value

        # Set the parameters
        for key, value in kwargs.items():
            # print(' Setting the %s as %s'%(key, value))
            self.parameters[key] = value

        # If Changed Parameter is Critical, we have to reset the results
        for key, value in changed_parameters.items():
            if key in ['xc', 'kpts', 'energy_cutoff']:
                self.results = {}

        value = kwargs.get('energy_cutoff')
        if value is not None and not (isinstance(value,
                                                 (float, int)) and value > 0):
            mess = "'%s' must be a positive number(in eV), \
                got '%s'" % ('energy_cutoff', value)
            raise ValueError(mess)

        atoms = kwargs.get('atoms')
        if atoms is not None and self.atoms is None:
            self.atoms = atoms.copy()
Exemple #4
0
    def my_set(self, **kwargs):
        """Set parameters like set(key1=value1, key2=value2, ...).

        A dictionary containing the parameters that have been changed
        is returned.

        Subclasses must implement a set() method that will look at the
        chaneged parameters and decide if a call to reset() is needed.
        If the changed parameters are harmless, like a change in
        verbosity, then there is no need to call reset().

        The special keyword 'parameters' can be used to read
        parameters from a file."""

        from ase.calculators.calculator import equal

        with open('ts_data_EPB.txt', 'a') as tempText:
            tempText.write('\n Entering my Vasp.set() method. - EPB')

        if 'parameters' in kwargs:
            filename = kwargs.pop('parameters')
            parameters = Parameters.read(filename)
            parameters.update(kwargs)
            kwargs = parameters

        changed_parameters = {}

        for key, value in kwargs.items():
            oldvalue = self.parameters.get(key)
            with open('ts_data_EPB.txt', 'a') as tempText:
                tempText.write(
                    f" self.parameters['{key}'] = {oldvalue}; new value = {value}\n"
                )
            if key not in self.parameters or not equal(value, oldvalue):
                changed_parameters[key] = value
                self.parameters[key] = value

        if self.discard_results_on_any_change and changed_parameters:
            self.reset()

        with open('ts_data_EPB.txt', 'a') as tempText:
            tempText.write('\n Exiting my Vasp.set() method. - EPB')

        return changed_parameters
Exemple #5
0
 def get_terminations(self, slab, layers):
     '''
     determine how many terminations for a surface index
     for a slab with SrO, TiO2, SrO, TiO2 ... ordering, there will be two terminations
     'SrO' and 'TiO2' 
     Search from the top to the bottom
     '''
     from ase.build import minimize_rotation_and_translation
     from ase.calculators.calculator import compare_atoms, equal
     import pprint
     nlayer = max(layers) + 1
     terminations = {}
     natoms = len(slab)
     for i in range(nlayer - 2, 0, -1):
         atoms = slab[layers == i]
         formula = atoms.get_chemical_formula(mode='hill')
         print(formula)
         inds = [
             j for j in range(natoms)
             if layers[j] in range(i, i - self.nlayer, -1)
         ]
         atoms = slab[inds]
         atoms.wrap()
         if not terminations:
             terminations['%s-%s' % (formula, i)] = atoms.copy()
         else:
             flag = True
             atoms1 = atoms.copy()
             for ter, atoms2 in terminations.items():
                 if len(atoms1) != len(atoms2):
                     flag = False
                 else:
                     minimize_rotation_and_translation(atoms2, atoms1)
                     if equal(atoms1.arrays, atoms2.arrays, tol=0.1):
                         flag = False
             if flag:
                 terminations['%s-%s' % (formula, i)] = atoms.copy()
                 print(formula, ter)
                 # view([atoms1, atoms2])
     pprint.pprint(terminations)
     # view(terminations.values())
     return terminations
Exemple #6
0
    def set(self, **kwargs):
        """Set all parameters.

        Parameters:
            kwargs  : Dictionary containing the keywords for deMon
        """
        # Put in the default arguments.
        kwargs = self.default_parameters.__class__(**kwargs)

        if 'parameters' in kwargs:
            filename = kwargs.pop('parameters')
            parameters = Parameters.read(filename)
            parameters.update(kwargs)
            kwargs = parameters

        changed_parameters = {}

        for key, value in kwargs.items():
            oldvalue = self.parameters.get(key)
            if key not in self.parameters or not equal(value, oldvalue):
                changed_parameters[key] = value
                self.parameters[key] = value

        return changed_parameters
Exemple #7
0
    def set(self, **kwargs):
        """Set all parameters.

        Parameters:
            kwargs  : Dictionary containing the keywords for deMon
        """
        # Put in the default arguments.
        kwargs = self.default_parameters.__class__(**kwargs)

        if 'parameters' in kwargs:
            filename = kwargs.pop('parameters')
            parameters = Parameters.read(filename)
            parameters.update(kwargs)
            kwargs = parameters

        changed_parameters = {}

        for key, value in kwargs.items():
            oldvalue = self.parameters.get(key)
            if key not in self.parameters or not equal(value, oldvalue):
                changed_parameters[key] = value
                self.parameters[key] = value

        return changed_parameters
Exemple #8
0
    def set(self, **kwargs):
        """Sets parameters list and determines if calculation needs to be reset

        *for now it is reset if any parameters change*
        """
        # Read parameters from file
        if 'parameters' in kwargs:
            filename = kwargs.pop('parameters')
            parameters = Parameters.read(filename)
            parameters.update(kwargs)
            kwargs = parameters

        changed_parameters = {}

        for key, value in kwargs.items():
            oldvalue = self.parameters.get(key)
            if key not in self.parameters or not equal(value, oldvalue):
                changed_parameters[key] = value
                self.parameters[key] = value

        if changed_parameters:
            self.reset()

        return changed_parameters
Exemple #9
0
    def check_state(self, atoms, tol=1e-15):
        """Check for system changes since last calculation."""
        from ase.calculators.calculator import all_changes, equal
        if self.atoms is None:
            system_changes = all_changes[:]
        else:
            system_changes = []
            if not equal(self.atoms.positions, atoms.positions, tol):
                system_changes.append('positions')
            if not equal(self.atoms.numbers, atoms.numbers):
                system_changes.append('numbers')
            if not equal(self.atoms.cell, atoms.cell, tol):
                system_changes.append('cell')
            if not equal(self.atoms.pbc, atoms.pbc):
                system_changes.append('pbc')
            if not equal(self.atoms.get_initial_magnetic_moments(),
                         atoms.get_initial_magnetic_moments(), tol):
                system_changes.append('initial_magmoms')
            if not equal(self.atoms.get_initial_charges(),
                         atoms.get_initial_charges(), tol):
                system_changes.append('initial_charges')

        return system_changes
def test_array_almost_equal(a, b, rtol, atol):
    assert a is not b
    assert equal(a, b, rtol=rtol, atol=atol)
    assert equal({'size': a, 'gamma': True},
                 {'size': b, 'gamma': True}, rtol=rtol, atol=atol)
def test_single_value(a, b, rtol, atol):
    assert equal(a, b, rtol=rtol, atol=atol)