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)