示例#1
0
def fit_elastic():
    from ase.db import connect
    atoms = bulk("Al") * (2, 2, 2)
    elastic = ElasticConstants(atoms, DB_NAME)
    db = connect(DB_NAME)

    stresses = []
    strains = []
    for row in db.select('id>=25'):
        stress = np.array(row["stress"])
        stresses.append(stress)
        strain = np.array(db.get(id=row.init_struct).data["strain"])
        strains.append(strain)

    from ase.spacegroup import Spacegroup
    spg = Spacegroup(123)
    print(spg.get_rotations())
    C = elastic.get(stresses=stresses, strains=strains, spg=225, perm="zxy")
    print("Bulk:")
    print("Voigt: {}".format(elastic.bulk_modulus(mode="V") / GPa))
    print("Reuss: {}".format(elastic.bulk_modulus(mode="R") / GPa))
    print("VRH: {}".format(elastic.bulk_modulus(mode="VRH") / GPa))
    print("Shear:")
    print("Voigt: {}".format(elastic.shear_modulus(mode="V") / GPa))
    print("Reuss: {}".format(elastic.shear_modulus(mode="R") / GPa))
    print("VRH: {}".format(elastic.shear_modulus(mode="VRH") / GPa))
    print("Shear: {}".format(elastic.shear_modulus(mode="VRH")))
    print("Poisson: {}".format(elastic.poisson_ratio))
    #np.set_printoptions(precision=2)
    print(C)
    np.savetxt("data/C_MgSi100_225.csv", C, delimiter=",")
 def _symmetrize_elastic_tensor(self, spg=1, perm="xyz"):
     if spg == 1:
         return
     permut_lut = {"xyz": 0, "zxy": -1, "yzx": -2}
     from ase.spacegroup import Spacegroup
     spg = Spacegroup(spg)
     sym_op = spg.get_rotations()
     full = self._to_full_rank4(self.elastic_tensor)
     new_tensor = np.zeros((3, 3, 3, 3))
     for op in sym_op:
         op = np.roll(op, permut_lut[perm], (0, 1))
         avg_tensor = np.zeros((3, 3, 3, 3))
         avg_tensor = np.einsum("pl,ijkl->ijkp", op, full)
         avg_tensor = np.einsum("ok,ijkp->ijop", op, avg_tensor)
         avg_tensor = np.einsum("nj,ijop->inop", op, avg_tensor)
         avg_tensor = np.einsum("mi,inop->mnop", op, avg_tensor)
         new_tensor += avg_tensor
     new_tensor /= len(sym_op)
     self.elastic_tensor = self._to_mandel_rank4(new_tensor)