Source code for CoREMOF.models.cp_app.utils

# -*- coding: utf-8 -*-

"""The utilities for ``cp_app``."""

import numpy as np
import yaml

Kb=1.3806504e-23  # Boltzmann constant in [J/K]
Ph=1.98644586e-23 # Planck constant in [J.cm]
Avo=6.02214076e23 # 1/mol
J2cal=0.2390
th2cm=33.35641

[docs] def read_vibspectrum(filename): frequencies=[] with open(filename) as fi: for line in fi.readlines()[3:-1]: frequencies.append(float(line.strip().split()[2])) return np.array(frequencies)
[docs] def read_frequencies_from_mesh(filename): mesh=yaml.load(open(filename)) w=[fr["frequency"] for fr in mesh["phonon"][0]["band"]] w=np.array(w)*th2cm return w
[docs] def cv_from_pdos(temp, pdos): pdos=pdos[np.where(pdos[:,0]>0)] x = Ph * pdos[:,0] / Kb / temp expVal = np.exp(x) cv_contributions= np.sum(pdos[:,1:],axis=1)* Avo*Kb * x ** 2 * expVal / (expVal - 1.0) ** 2 return np.sum(cv_contributions)
[docs] def cv_from_dos(temp, totaldos): dos=totaldos[np.where(totaldos[:,0]>0)] x = Ph * dos[:,0] / Kb / temp expVal = np.exp(x) cv_contributions= dos[:,1]* Avo*Kb * x ** 2 * expVal / (expVal - 1.0) ** 2 return np.sum(cv_contributions)
[docs] def cv_from_frequencies(temp, freqs): freqs=freqs[freqs>0] x = Ph * freqs / Kb / temp expVal = np.exp(x) cv_contributions=Avo*Kb * x ** 2 * expVal / (expVal - 1.0) ** 2 return np.sum(cv_contributions)
[docs] def read_totaldos(filename): data=np.loadtxt(filename,skiprows=1) data[:,0]*=th2cm return data
[docs] def read_pdos(filename): data=np.loadtxt(filename,skiprows=1) data[:,0]*=th2cm return data
[docs] def add_type_label(mydict,atomtype,name,label): if atomtype in mydict: mydict[atomtype][name]=label else: mydict[atomtype]={name:label} return mydict
[docs] def read_atoms_from_mesh(filename): mesh=yaml.load(open(filename)) w=[fr["frequency"] for fr in mesh["phonon"][0]["band"]] w=np.array(w)*th2cm return w
[docs] def cv_from_pdos_site(temp, pdos,site): pdos=pdos[np.where(pdos[:,0]>0)] x = Ph * pdos[:,0] / Kb / temp expVal = np.exp(x) cv_contributions= pdos[:,site+1]* Avo*Kb * x ** 2 * expVal / (expVal - 1.0) ** 2 return np.sum(cv_contributions)
[docs] def select_structures(nsamples,df): selected=set() for structure_type in df["structure_type"].unique(): selected.add(df.loc[df["structure_type"]==structure_type].index.values[0]) selected.add(df.loc[df["structure_type"]==structure_type].index.values[1]) if len(selected)>nsamples-1: break for atom_type in df["atom_types"].unique(): selected.add(df.loc[df["atom_types"]==atom_type].index.values[0]) if len(selected)>nsamples-1: break while len(selected)< nsamples: selected.add(df.sample(1).index.values[0]) return selected