ASEを使ってQuantum ESPRESSOを動かすチュートリアルをやってみた。
Espresso — ASE documentation
第一原理計算高速チュートリアル · 物性実験家のための無料でできる第一原理計算入門
すると、計算したフェルミエネルギーをバンド図のプロットで設定しようとするとフェルミエネルギーのところで、「cannot attribute "reference"」的なエラーが出る。
calc = Espresso( ... ) ... bs = calc.band_structure() bs.reference = fermi_level
ソースを見るために、"pip show ase" でインストールした場所を探す。
pipでインストールしたパッケージの場所を調べる - Qiita
ソースを見てみると、calc.band_structure() は クラスase.spectrum.band_structure.BandStructureのインスタンスを作るので、 bs は Espresso にはもはやぶら下がっていない。
それで、BandStructureを見てみると、
class BandStructure: def __init__(self, path, energies, reference=0.0): ... self._reference = reference ... @property def reference(self) -> float: return self._reference
したがって、クラス変数は「_reference」であり、「reference」はクラス関数なのである。
ではなぜ「bs.reference」と変数のように書けたかというと、pythonのデコレーターである@propetyのおかげである。
3.4. プロパティ - ゼロから学ぶ Python
したがって、いくら変数のように見えても、関数であるから代入は出来ない。このため、外から見ると変数の再代入が禁止されているように見える。
つまり、正しくは「bs._reference = fermi_level」と書けば良い、ということであった。