Exemple #1
0
    def from_ncreader(cls, r, inord="F"):
        """
        Builds the object from a netcdf reader
        """
        kptopt = int(r.read_value("kptopt", default=1))
        symrel = r.read_value("reduced_symmetry_matrices")

        return cls(spgid=r.read_value("space_group"),
                   symrel=symrel,
                   tnons=r.read_value("reduced_symmetry_translations"),
                   symafm=r.read_value("symafm"),
                   has_timerev=has_timrev_from_kptopt(kptopt),
                   inord=inord)
Exemple #2
0
    def from_file(cls, ncfile, inord="F"):
        """Initialize the object from a Netcdf file."""
        r, closeit = as_etsfreader(ncfile)

        kptopt = int(r.read_value("kptopt", default=1))

        new = cls(spgid=r.read_value("space_group"),
                  symrel=r.read_value("reduced_symmetry_matrices"),
                  tnons=r.read_value("reduced_symmetry_translations"),
                  symafm=r.read_value("symafm"),
                  has_timerev=has_timrev_from_kptopt(kptopt),
                  inord=inord)

        if closeit:
            file.close()

        return new
Exemple #3
0
    def from_file(cls, ncfile, inord="F"):
        """Initialize the object from a Netcdf file."""
        r, closeit = as_etsfreader(ncfile)

        kptopt = int(r.read_value("kptopt", default=1))

        new = cls(spgid=r.read_value("space_group"),
                  symrel=r.read_value("reduced_symmetry_matrices"),
                  tnons=r.read_value("reduced_symmetry_translations"),
                  symafm=r.read_value("symafm"),
                  has_timerev=has_timrev_from_kptopt(kptopt),
                  inord=inord)

        if closeit:
            file.close()

        return new
Exemple #4
0
 def test_has_timrev_from_kptopt(self):
     """Testing has_timrev_from_kptopt."""
     assert has_timrev_from_kptopt(1)
     assert not has_timrev_from_kptopt(4)
     assert has_timrev_from_kptopt(-7)
Exemple #5
0
 def test_has_timrev_from_kptopt(self):
     """Testing has_timrev_from_kptopt."""
     assert has_timrev_from_kptopt(1)
     assert not has_timrev_from_kptopt(4)
     assert has_timrev_from_kptopt(-7)
Exemple #6
0
    def _get_structures(self, what):
        if what == "header":
            vars_global, vars_dataset = self.initial_vars_global, self.initial_vars_dataset
        elif what == "footer":
            vars_global, vars_dataset = self.final_vars_global, self.final_vars_dataset
        else:
            raise ValueError("Invalid value for what: `%s`" % str(what))

        #print("global", vars_global["acell"])
        from abipy.abio.abivars import is_abiunit
        inigeo = {k: vars_global[k] for k in GEOVARS if k in vars_global}

        spgvars = ("spgroup", "symrel", "tnons", "symafm")
        spgd_global = {k: vars_global[k] for k in spgvars if k in vars_global}
        global_kptopt = vars_global.get("kptopt", 1)

        structures = []
        for i in self.datasets:
            # This code breaks down if there are conflicting GEOVARS in globals and dataset.
            d = inigeo.copy()
            d.update({
                k: vars_dataset[i][k]
                for k in GEOVARS if k in vars_dataset[i]
            })

            for key, value in d.items():
                # Must handle possible unit.
                fact = 1.0
                tokens = [t.lower() for t in value.split()]
                if is_abiunit(tokens[-1]):
                    tokens, unit = tokens[:-1], tokens[-1]
                    if unit in ("angstr", "angstrom", "angstroms"):
                        fact = 1.0 / bohr_to_ang
                    elif unit in ("bohr", "bohrs", "au"):
                        fact = 1.0
                    else:
                        raise ValueError("Don't know how to handle unit: %s" %
                                         unit)

                s = " ".join(tokens)
                dtype = np.float if key not in ("ntypat", "typat",
                                                "natom") else np.int
                try:
                    #print(key, s)
                    value = np.fromstring(s, sep=" ", dtype=dtype)
                    #print(key, value)
                    if fact != 1.0:
                        value *= fact  # Do not change integer arrays e.g typat!
                    d[key] = value
                except ValueError as exc:
                    print(key, s)
                    raise exc

            if "rprim" not in d and "angdeg" not in d: d["rprim"] = np.eye(3)
            if "natom" in d and d["natom"] == 1 and all(
                    k not in d for k in ("xred", "xcart", "xangst")):
                d["xred"] = np.zeros(3)
            #print(d)
            abistr = Structure.from_abivars(d)

            # Extract Abinit spacegroup.
            spgd = spgd_global.copy()
            spgd.update({
                k: vars_dataset[i][k]
                for k in spgvars if k in vars_dataset[i]
            })

            spgid = int(spgd.get("spgroup", 0))
            if "symrel" not in spgd:
                symrel = np.reshape(np.eye(3, 3, dtype=np.int), (1, 3, 3))
                spgd["symrel"] = " ".join((str(i) for i in symrel.flatten()))
            else:
                symrel = np.reshape(
                    np.array([int(n) for n in spgd["symrel"].split()],
                             dtype=np.int), (-1, 3, 3))
            nsym = len(symrel)
            assert nsym == spgd.get("nsym", nsym)  #; print(symrel.shape)

            if "tnons" in spgd:
                tnons = np.reshape(
                    np.array([float(t) for t in spgd["tnons"].split()],
                             dtype=np.float), (nsym, 3))
            else:
                tnons = np.zeros((nsym, 3))

            if "symafm" in spgd:
                symafm = np.array([int(n) for n in spgd["symafm"].split()],
                                  dtype=np.int)
                symafm.shape = (nsym, )
            else:
                symafm = np.ones(nsym, dtype=np.int)

            try:
                has_timerev = has_timrev_from_kptopt(vars_dataset[i].get(
                    "kptopt", global_kptopt))
                abi_spacegroup = AbinitSpaceGroup(spgid,
                                                  symrel,
                                                  tnons,
                                                  symafm,
                                                  has_timerev,
                                                  inord="C")
                abistr.set_abi_spacegroup(abi_spacegroup)
            except Exception as exc:
                print(
                    "Cannot build AbinitSpaceGroup from the variables reported in file!\n",
                    str(exc))

            structures.append(abistr)

        return structures
Exemple #7
0
    def _get_structures(self, what):
        if what == "header":
            vars_global, vars_dataset = self.initial_vars_global, self.initial_vars_dataset
        elif what == "footer":
            vars_global, vars_dataset = self.final_vars_global, self.final_vars_dataset
        else:
            raise ValueError("Invalid value for what: `%s`" % str(what))

        #print("global", vars_global["acell"])
        from abipy.abio.abivars import is_abiunit
        inigeo = {k: vars_global[k] for k in GEOVARS if k in vars_global}

        spgvars = ("spgroup", "symrel", "tnons", "symafm")
        spgd_global = {k: vars_global[k] for k in spgvars if k in vars_global}
        global_kptopt = vars_global.get("kptopt", 1)

        structures = []
        for i in self.datasets:
            # This code breaks down if there are conflicting GEOVARS in globals and dataset.
            d = inigeo.copy()
            d.update({k: vars_dataset[i][k] for k in GEOVARS if k in vars_dataset[i]})

            for key, value in d.items():
                # Must handle possible unit.
                fact = 1.0
                tokens = [t.lower() for t in value.split()]
                if is_abiunit(tokens[-1]):
                    tokens, unit = tokens[:-1], tokens[-1]
                    if unit in ("angstr", "angstrom", "angstroms"):
                        fact = 1.0 / bohr_to_ang
                    elif unit in ("bohr", "bohrs", "au"):
                        fact = 1.0
                    else:
                        raise ValueError("Don't know how to handle unit: %s" % unit)

                s = " ".join(tokens)
                dtype = np.float if key not in ("ntypat", "typat", "natom") else np.int
                try:
                    #print(key, s)
                    value = np.fromstring(s, sep=" ", dtype=dtype)
                    #print(key, value)
                    if fact != 1.0: value *= fact # Do not change integer arrays e.g typat!
                    d[key] = value
                except ValueError as exc:
                    print(key, s)
                    raise exc

            if "rprim" not in d and "angdeg" not in d: d["rprim"] = np.eye(3)
            if "natom" in d and d["natom"] == 1 and all(k not in d for k in ("xred", "xcart", "xangst")):
                d["xred"] = np.zeros(3)
            #print(d)
            abistr = Structure.from_abivars(d)

            # Extract Abinit spacegroup.
            spgd = spgd_global.copy()
            spgd.update({k: vars_dataset[i][k] for k in spgvars if k in vars_dataset[i]})

            spgid = int(spgd.get("spgroup", 0))
            if "symrel" not in spgd:
                symrel = np.reshape(np.eye(3, 3, dtype=np.int), (1, 3, 3))
                spgd["symrel"] = " ".join((str(i) for i in symrel.flatten()))
            else:
                symrel = np.reshape(np.array([int(n) for n in spgd["symrel"].split()], dtype=np.int), (-1, 3, 3))
            nsym = len(symrel)
            assert nsym == spgd.get("nsym", nsym) #; print(symrel.shape)

            if "tnons" in spgd:
                tnons = np.reshape(np.array([float(t) for t in spgd["tnons"].split()], dtype=np.float), (nsym, 3))
            else:
                tnons = np.zeros((nsym, 3))

            if "symafm" in spgd:
                symafm = np.array([int(n) for n in spgd["symafm"].split()], dtype=np.int)
                symafm.shape = (nsym,)
            else:
                symafm = np.ones(nsym, dtype=np.int)

            try:
                has_timerev = has_timrev_from_kptopt(vars_dataset[i].get("kptopt", global_kptopt))
                abi_spacegroup = AbinitSpaceGroup(spgid, symrel, tnons, symafm, has_timerev, inord="C")
                abistr.set_abi_spacegroup(abi_spacegroup)
            except Exception as exc:
                print("Cannot build AbinitSpaceGroup from the variables reported in file!\n", str(exc))

            structures.append(abistr)

        return structures