nano_exit

基礎的なことこそ、簡単な例が必要だと思うのです。

ASEでバンド図のフェルミエネルギーを設定する話。

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」と書けば良い、ということであった。