Exemplo n.º 1
0
class DP_fparam(Calculator):
    """
    modify from DP class of deepmd
    the vanilla one does not support fparam 
    """
    name = "DP"
    implemented_properties = ["energy", "forces", "stress"]

    def __init__(self, model, label="DP", fparam=0, **kwargs):
        Calculator.__init__(self, label=label, **kwargs)
        self.dp = DeepPot(model)
        self.type_dict = dict(
            zip(self.dp.get_type_map(), range(self.dp.get_ntypes())))
        self.fparam = [fparam]

    def calculate(self,
                  atoms=None,
                  properties=["energy", "forces", "stress"],
                  system_changes=all_changes):
        coord = atoms.get_positions().reshape([1, -1])
        cell = atoms.get_cell().reshape([1, -1])
        symbols = atoms.get_chemical_symbols()
        atype = [self.type_dict[k] for k in symbols]
        e, f, v = self.dp.eval(coord, cell, atype, fparam=self.fparam)
        self.results['energy'] = e[0]
        self.results['forces'] = f[0]
        self.results['stress'] = v[0]
Exemplo n.º 2
0
class DP(Calculator):
    name = "DP"
    implemented_properties = ["energy", "forces", "stress"]

    def __init__(self, model, label="DP", type_dict=None, **kwargs):
        Calculator.__init__(self, label=label, **kwargs)
        self.dp = DeepPot(model)
        if type_dict:
            self.type_dict = type_dict
        else:
            self.type_dict = dict(
                zip(self.dp.get_type_map(), range(self.dp.get_ntypes())))

    def calculate(self,
                  atoms=None,
                  properties=["energy", "forces", "stress"],
                  system_changes=all_changes):
        coord = atoms.get_positions().reshape([1, -1])
        cell = atoms.get_cell().reshape([1, -1])
        symbols = atoms.get_chemical_symbols()
        atype = [self.type_dict[k] for k in symbols]
        e, f, v = self.dp.eval(coord, cell, atype)
        self.results['energy'] = e[0]
        self.results['forces'] = f[0]
        self.results['stress'] = v[0]
Exemplo n.º 3
0
    def predict(self, dp):
        """
        Predict energies and forces by deepmd-kit.

        Parameters
        ----------
        dp : deepmd.DeepPot or str
            The deepmd-kit potential class or the filename of the model.

        Returns
        -------
        labeled_sys : LabeledSystem
            The labeled system.
        """
        try:
            # DP 1.x
            import deepmd.DeepPot as DeepPot
        except ModuleNotFoundError:
            # DP 2.x
            from deepmd.infer import DeepPot
        if not isinstance(dp, DeepPot):
            dp = DeepPot(dp)
        type_map = dp.get_type_map()
        ori_sys = self.copy()
        ori_sys.sort_atom_names(type_map=type_map)
        atype = ori_sys['atom_types']

        labeled_sys = LabeledSystem()

        if 'auto_batch_size' not in DeepPot.__init__.__code__.co_varnames:
            for ss in self:
                coord = ss['coords'].reshape((1, ss.get_natoms()*3))
                if not ss.nopbc:
                    cell = ss['cells'].reshape((1, 9))
                else:
                    cell = None
                e, f, v = dp.eval(coord, cell, atype)
                data = ss.data
                data['energies'] = e.reshape((1, 1))
                data['forces'] = f.reshape((1, ss.get_natoms(), 3))
                data['virials'] = v.reshape((1, 3, 3))
                this_sys = LabeledSystem.from_dict({'data': data})
                labeled_sys.append(this_sys)
        else:
            # since v2.0.2, auto batch size is supported
            coord = self.data['coords'].reshape((self.get_nframes(), self.get_natoms()*3))
            if not self.nopbc:
                cell = self.data['cells'].reshape((self.get_nframes(), 9))
            else:
                cell = None
            e, f, v = dp.eval(coord, cell, atype)
            data = self.data.copy()
            data['energies'] = e.reshape((self.get_nframes(), 1))
            data['forces'] = f.reshape((self.get_nframes(), self.get_natoms(), 3))
            data['virials'] = v.reshape((self.get_nframes(), 3, 3))
            labeled_sys = LabeledSystem.from_dict({'data': data})
        return labeled_sys
Exemplo n.º 4
0
class DP(Calculator):
    name = "DP"
    implemented_properties = ["energy", "forces", "virial", "stress"]

    def __init__(self, model, label="DP", type_dict=None, **kwargs):
        Calculator.__init__(self, label=label, **kwargs)
        self.dp = DeepPot(model)
        if type_dict:
            self.type_dict = type_dict
        else:
            self.type_dict = dict(
                zip(self.dp.get_type_map(), range(self.dp.get_ntypes())))

    def calculate(self,
                  atoms=None,
                  properties=["energy", "forces", "virial"],
                  system_changes=all_changes):
        coord = atoms.get_positions().reshape([1, -1])
        if sum(atoms.get_pbc()) > 0:
            cell = atoms.get_cell().reshape([1, -1])
        else:
            cell = None
        symbols = atoms.get_chemical_symbols()
        atype = [self.type_dict[k] for k in symbols]
        e, f, v = self.dp.eval(coords=coord, cells=cell, atom_types=atype)
        self.results['energy'] = e[0][0]
        self.results['forces'] = f[0]
        self.results['virial'] = v[0].reshape(3, 3)

        # convert virial into stress for lattice relaxation
        if "stress" in properties:
            if sum(atoms.get_pbc()) > 0:
                # the usual convention (tensile stress is positive)
                # stress = -virial / volume
                stress = -0.5 * (v[0].copy() +
                                 v[0].copy().T) / atoms.get_volume()
                # Voigt notation
                self.results['stress'] = stress.flat[[0, 4, 8, 5, 2, 1]]
            else:
                raise PropertyNotImplementedError
Exemplo n.º 5
0
def test_ener(args):
    if args.rand_seed is not None:
        np.random.seed(args.rand_seed % (2**32))

    dp = DeepPot(args.model)
    data = DeepmdData(args.system,
                      args.set_prefix,
                      shuffle_test=args.shuffle_test,
                      type_map=dp.get_type_map())
    data.add('energy', 1, atomic=False, must=False, high_prec=True)
    data.add('force', 3, atomic=True, must=False, high_prec=False)
    data.add('virial', 9, atomic=False, must=False, high_prec=False)
    if dp.get_dim_fparam() > 0:
        data.add('fparam',
                 dp.get_dim_fparam(),
                 atomic=False,
                 must=True,
                 high_prec=False)
    if dp.get_dim_aparam() > 0:
        data.add('aparam',
                 dp.get_dim_aparam(),
                 atomic=True,
                 must=True,
                 high_prec=False)

    test_data = data.get_test()
    natoms = len(test_data["type"][0])
    nframes = test_data["box"].shape[0]
    numb_test = args.numb_test
    numb_test = min(nframes, numb_test)
    coord = test_data["coord"][:numb_test].reshape([numb_test, -1])
    box = test_data["box"][:numb_test]
    atype = test_data["type"][0]
    if dp.get_dim_fparam() > 0:
        fparam = test_data["fparam"][:numb_test]
    else:
        fparam = None
    if dp.get_dim_aparam() > 0:
        aparam = test_data["aparam"][:numb_test]
    else:
        aparam = None

    energy, force, virial, ae, av = dp.eval(coord,
                                            box,
                                            atype,
                                            fparam=fparam,
                                            aparam=aparam,
                                            atomic=True)
    energy = energy.reshape([numb_test, 1])
    force = force.reshape([numb_test, -1])
    virial = virial.reshape([numb_test, 9])
    ae = ae.reshape([numb_test, -1])
    av = av.reshape([numb_test, -1])

    l2e = (l2err(energy - test_data["energy"][:numb_test].reshape([-1, 1])))
    l2f = (l2err(force - test_data["force"][:numb_test]))
    l2v = (l2err(virial - test_data["virial"][:numb_test]))
    l2ea = l2e / natoms
    l2va = l2v / natoms

    # print ("# energies: %s" % energy)
    print("# number of test data : %d " % numb_test)
    print("Energy L2err        : %e eV" % l2e)
    print("Energy L2err/Natoms : %e eV" % l2ea)
    print("Force  L2err        : %e eV/A" % l2f)
    print("Virial L2err        : %e eV" % l2v)
    print("Virial L2err/Natoms : %e eV" % l2va)

    detail_file = args.detail_file
    if detail_file is not None:
        pe = np.concatenate((np.reshape(test_data["energy"][:numb_test],
                                        [-1, 1]), np.reshape(energy, [-1, 1])),
                            axis=1)
        np.savetxt(detail_file + ".e.out", pe, header='data_e pred_e')
        pf = np.concatenate((np.reshape(test_data["force"][:numb_test],
                                        [-1, 3]), np.reshape(force, [-1, 3])),
                            axis=1)
        np.savetxt(detail_file + ".f.out",
                   pf,
                   header='data_fx data_fy data_fz pred_fx pred_fy pred_fz')
        pv = np.concatenate((np.reshape(test_data["virial"][:numb_test],
                                        [-1, 9]), np.reshape(virial, [-1, 9])),
                            axis=1)
        np.savetxt(
            detail_file + ".v.out",
            pv,
            header=
            'data_vxx data_vxy data_vxz data_vyx data_vyy data_vyz data_vzx data_vzy data_vzz pred_vxx pred_vxy pred_vxz pred_vyx pred_vyy pred_vyz pred_vzx pred_vzy pred_vzz'
        )
Exemplo n.º 6
0
            sum_err[ii] += ee * ee * ss
            sum_siz[ii] += ss
    for ii in range(nitems):
        sum_err[ii] = np.sqrt(sum_err[ii] / sum_siz[ii])
    return sum_err


def test_ener (dp, args) :
    if args.rand_seed is not None :
        np.random.seed(args.rand_seed % (2**32))

<<<<<<< HEAD
    dp = DeepPot(args.model)
=======
>>>>>>> 93aa90768089e265465f93fb3d9f99b494d56b09
    data = DeepmdData(args.system, args.set_prefix, shuffle_test = args.shuffle_test, type_map = dp.get_type_map())
    data.add('energy', 1, atomic=False, must=False, high_prec=True)
    data.add('force',  3, atomic=True,  must=False, high_prec=False)
    data.add('virial', 9, atomic=False, must=False, high_prec=False)
    if dp.get_dim_fparam() > 0:
        data.add('fparam', dp.get_dim_fparam(), atomic=False, must=True, high_prec=False)
    if dp.get_dim_aparam() > 0:
        data.add('aparam', dp.get_dim_aparam(), atomic=True,  must=True, high_prec=False)

    test_data = data.get_test ()
    natoms = len(test_data["type"][0])
    nframes = test_data["box"].shape[0]
    numb_test = args.numb_test
    numb_test = min(nframes, numb_test)
<<<<<<< HEAD
=======