Monologue-ひとりごと

日々の考えたこと

ブログのテーマを変えました

ブログのデザインテーマを変えました。

これまで、はてなブログの公式のテンプレートを使用していましたが、 折角なら自分好みにアレンジしたいということで、CSSから編集してみました。

といっても、いちから作成するのは私の技術じゃかなわない。 なので「Boilerplate」という、はてなが提供するサンプルテーマを利用しました。 実質、作成というよりアレンジに近い感じ。

staff.hatenablog.com

目指したもの

目標にするフィーリングは、2000年代中盤のブログテーマ。

私がまだ小学生のころ。パソコンくんだった私の日課は「お気に入り」に入れたブログの更新チェック。

当時、特に心酔していた技術系ブログで使用されていたテンプレートが現在でも忘れられず。 20年ほど経った今でも、ブログといえばこのデザインという認識で成長してきました。

たまたま見つけたテンプレートのスクショ

青いヘッダー、黒いナビゲーション、白い本文、右サイドバー。 これを満たすテンプレートを色々と探したのですが、いまいちしっくり来るものがない。

ネットを探せば、テンプレート自体は手に入りそうなので、それを利用できそう。 ただ、ディスプレイの解像度、レスポンシブ対応などなど、現代的な仕様を満たしていないため、色々と面倒くさそうだ。

だったら、自分で作成するしかない。

完成

help.hatenablog.com

上のページを見ながら、生成AIを利用し、色々編集してできたものがこれ。

どんぴしゃではないものの、フィーリングはあっているかなという感じ。 個人的には、シンプルな見た目で結構気に入っています。 自分好みに編集するという過程を経たこともあって、かなり愛着が湧いています。

これを機に、もっと更新頻度を増やそう。 もっと日常のこととかを書いて、数年後、数十年後に見返すことができると良いな。

メーラーをThunderbirdに移行したよ

20年前の話でなく、2026年の話です……

メーラーをThunderbirdに移行した。

いまどきメーラーを使う人も少ないと思うけど、複数のアカウントを管理するのに便利なので私は愛用している。

これまでは、Microsoft 365付属のOutlookを使用していたが、プライベートでのExcelやPowerPointの使用頻度がめっきり減ったのでサブスクを打ち切った。 ゆえに、代替のメーラーを探す必要性が出てきた。

ヘビーに使用することはなく、受信だけできれば何でもOKだったので、Windows 11標準の"Outlook for Windows"に移行したのだけど……

広告が入るOutlook for Windows(無償版)

Outlook for Windowsの無償版は、広告が入る。

受信トレイの上部に、未読メールのような形式で広告が入り、クリックするとサイトに飛ぶ。

広告に耐えられない。という話ではない。無償でソフトウェアを使用させてもらっているし、仕方のないことだと理解している。 けれども、広告内容がかなり気になってしまった。

一見、普通の広告に見えるけれども

普通ならアクセスすることもなくスルーするような、ありふれた広告に見える。 たまたま子供がめちゃくちゃにキーボード操作をして、上の広告のリンクにアクセスしたのだけれども、リンク先がこれ。

思いっきり詐欺サイト

広告の審査にMicrosoftが関与してはいないと思うのだけれども、純正アプリなんだし、もうちょっとちゃんとしてよ。。。

ターゲティング広告の可能性もある。ろくでなしの僕に向け、ろくでもない広告を表示してくれたのかもしれない。じゃあ仕方ないね。

けれども、毎回メールを確認するたびに、僕のろくでもなさを指摘してくるメーラーも御免だ。

という訳でThunderbirdに乗り換えた

最終的に、MozillaのThunderbirdに乗り換えた。

過去に使っていたことがある。 小学生時代のとき、Chromeがまだ正式リリースされておらず、IEのバージョンが6でタブ機能さえなかったとき、Firefoxを使用し、Thunderbirdも使用していた。

当時のことはほぼ覚えていないけど、20年ぶりぐらいの再会になる。学校のPCに入っていないソフトを使っている自分に酔っていた記憶は多少ある。

Arduino Uno R4で簡単に作る、ダイオードのI-V特性評価装置

前回の記事で、ESP32を使用したI-V特性簡易測定装置を作成しました。

tamurata435.hatenablog.com

今回は、Arduino Uno R4で同様の装置を作成したので記録に残します。

なぜ、Uno R4なのか

前回の記事で、ESP32を用いてそれっぽい測定ができることが分かりましたが、なぜUno R4で焼き直しするのか。

ESP32は8bitのDAC, 12bitのADCを搭載した安価で有名なボードです。 一方、Arduino Uno R4は若干値段が張るものの、ボード単体で12bitのDAC, 14bitのADCが使用でき、また最大出力電圧5VとESP32の3.3Vより大きいのが魅力的です。

ちょうどUno R4が発売されたあたりで、ルネサスのオンラインセミナーに参加したことがあり、 その際にArduino Uno R4 Minimaをプレゼント頂きました(なんて太っ腹な優良企業なのでしょう!)。

私の怠惰でタンスの肥やしになってしまっていたので、今回の装置作製にあたり引っ張り出してきました。

回路図

回路図と言っても、やっていることはESP32の時と変わりません。

DACの出力が、A0ピン(ANALOG INのピン)だったのが盲点でしたが、それ以外は特に難なく使用できました。

ESP32での作例と同様に、DACの出力電圧とダイオードの電圧を測定し、抵抗に印加される電位差を求めます。 オームの法則より、抵抗とダイオードに流れる電流を求めた後、シリアルに出力していきます。

スケッチ例

以下のスケッチをボードに書き込みました。

12bitのDACからは5Vを4095段階に分けた電圧(1ステップあたりおおよそ1mV)が出力されますが、 点数がかなり多くなるため、4ステップごとにインクリメントして実行しています。

Uno R4は動作が早いのか、リセット直後はシリアルモニタからデータが出力されなかったため、 setup()においてシリアルポートが開かれたのを確認した後、2秒待機する仕様としました。

const int DAC_PIN = A0;
const int ADC_OUTPUT_VOLTAGE = A1;
const int ADC_DIODE_VOLTAGE = A2;

const float VREF = 4.735;
const float R_SHUNT = 1000.0;  // Ω

void setup() {
  // put your setup code here, to run once:
  Serial.begin(115200);

  pinMode(LED_BUILTIN, OUTPUT);

  analogWriteResolution(12);
  analogReadResolution(14);

  while(!Serial)
  {
  }

  delay(2000);

  Serial.println("DAC[V],DAC output[V],Diode voltage[V],Current[mA]");
}

float readADC(int pin)
{
  // average ADC read values
  long sum = 0;

  for(int i=0; i < 16; i++)
  {
    sum += analogRead(pin);
  }

  return sum / 16.0;
}

void loop() {
  // put your main code here, to run repeatedly:

  // Turn on LED during measurement
  digitalWrite(LED_BUILTIN, HIGH);

  for(int dac=0; dac<=4095; dac+=4)
  {
    // Output Analog Voltage
    analogWrite(DAC_PIN, dac);
    delay(2);

    // Output Voltage[V]
    float dacVoltage = (VREF / 4095.0) * dac;

    // Read Voltage[V]
    float adcOutputVoltage = readADC(ADC_OUTPUT_VOLTAGE);
    float adcDiodeVoltage = readADC(ADC_DIODE_VOLTAGE);

    float outputVoltage = adcOutputVoltage * VREF / 16383.0;
    float diodeVoltage = adcDiodeVoltage * VREF / 16383.0;

    // Calculate Current[mA]
    float current = (outputVoltage - diodeVoltage) / R_SHUNT * 1000;

    if (current < 0){
      current = 0;
    }

    // Display Values
    Serial.print(dacVoltage, 3);
    Serial.print(",");

    Serial.print(outputVoltage, 3);
    Serial.print(",");

    Serial.print(diodeVoltage, 3);
    Serial.print(",");

    Serial.println(current, 6);

  }

  Serial.println("END");
  digitalWrite(LED_BUILTIN, LOW);
  while(true);
}

測定結果

下に各種ダイオードの測定結果を示します。 ESP32のときは若干おかしなVFとなっていたのですが、Uno R4ではそれらしい値になっています。

なお、Uno R4のADCの入力インピーダンスは著しく小さいらしく、バッファを設けて使用することが多いそうなのですが、今回の実験ではバッファ有無での結果の差異は確認されませんでした。

参考までに、内蔵OPアンプでボルテージフォロワを構成し、ダイオード電圧を測定したスケッチ例も以下に示します。

#include <OPAMP.h>

const int DAC_PIN = A0;
const int ADC_DIODE_VOLTAGE = A3;
const int ADC_OUTPUT_VOLTAGE = A4;

const float VREF = 4.735;
const float R_SHUNT = 1000.0;  // Ω

void setup() {
  // put your setup code here, to run once:
  Serial.begin(115200);

  pinMode(LED_BUILTIN, OUTPUT);

  analogWriteResolution(12);
  analogReadResolution(14);

  OPAMP.begin(OPAMP_SPEED_HIGHSPEED);

  while(!Serial) 
  {
  }

  delay(2000);
  
  Serial.println("DAC[V],DAC output[V],Diode voltage[V],Current[mA]");
}

float readADC(int pin)
{
  // average ADC read values
  long sum = 0;

  for(int i=0; i < 16; i++)
  {
    sum += analogRead(pin);
  }

  return sum / 16.0;
}

void loop() {
  // put your main code here, to run repeatedly:
  
  // Turn on LED during measurement
  digitalWrite(LED_BUILTIN, HIGH);

  for(int dac=0; dac<=4095; dac+=4)
  {
    // Output Analog Voltage
    analogWrite(DAC_PIN, dac);
    delay(2);

    // Output Voltage[V]
    float dacVoltage = (VREF / 4095.0) * dac;

    // Read Voltage[V]
    float adcOutputVoltage = readADC(ADC_OUTPUT_VOLTAGE);
    float adcDiodeVoltage = readADC(ADC_DIODE_VOLTAGE);

    float outputVoltage = adcOutputVoltage * VREF / 16383.0;
    float diodeVoltage = adcDiodeVoltage * VREF / 16383.0;

    // Calculate Current[mA]
    float current = (outputVoltage - diodeVoltage) / R_SHUNT * 1000;
    
    if (current < 0){
      current = 0;
    }

    // Display Values
    Serial.print(dacVoltage, 3);
    Serial.print(",");

    Serial.print(outputVoltage, 3);
    Serial.print(",");

    Serial.print(diodeVoltage, 3);
    Serial.print(",");

    Serial.println(current, 6);

  }

  Serial.println("END");
  digitalWrite(LED_BUILTIN, LOW);
  while(true);
}

ESP32で簡単に作る、ダイオードのI-V特性評価装置

酷暑、電気代上昇、AIサーバーによる大量の電力消費など、太陽電池への注目は日に日に増しているように感じます。 最近は、ペロブスカイト太陽電池が実用間近というニュースも聞くようになりました。

学生時代に太陽電池の研究をしていたため、このようなニュースは非常に興味があります。 最近は以下の本を読んで、研究室時代の記憶を思い出しています。

太陽電池の評価では、光学的な物性の評価に加えて、電気特性の測定も行います。中でも重要なのはI-V特性(実際には電流を受光面積で割ったJ-V特性)の評価です。 疑似太陽光照射時のI-V特性を測定することで、光電変換効率と呼ばれる太陽電池の重要な指標を取得することができます。

この評価には、ソースメーターと呼ばれる電圧を印加・電流を供給しながら、その応答を測定できる装置が用いられています。 Keithley(現在はテクトロニクス)の2400シリーズと聞くとピンとくる方も多いかもしれません。

ソースメーターは研究用の設備であることもあり、100万円以上もするため個人で所有するのは現実的ではありません。 そこまで高い測定精度は求めないので、素人でも家庭で太陽電池の評価が行えないかと色々調べていたところ、マイコンボードでの工作例を見つけました。

太陽電池の特性を測定するのは一工夫要りそうですが、通常のダイオードの特性ぐらいはマイコンボードのDAC, ADCを用いれば簡単に測定できそうだ。 太陽電池特性評価を最終的なゴールとしつつ、その前段階として、通常のダイオード特性の測定を行うシステムを試作してみました。

 原理

大体のマイコンボードにはアナログ電圧出力機能としてPWM出力を備えています。

LPFを用いて脈動を除去することでPWMを疑似的なアナログ電圧源として利用することもできます。 一方、一部ボードではDAC機能を有するものもあり、アナログ電圧を直接出力することができます。 今回使用するESP32も、8bitの分解能ですが2チャンネルのDACを装備しています。

このDACを用いて、ダイオードにバイアスを印加し、流れた電流をADCで測定することI-V特性を取得しようという目算です。

回路図

以下に回路図を示します。 マイコンボードとして、ESP32-DevKitC-32Eを使用しました。

測定対象となるダイオードに抵抗を直列に接続し、DACを通して電圧を印加します。 DACの出力電圧とダイオードの印加電圧をADCで測定し、その差から抵抗の両端の電位差を求めます。この電圧を抵抗値で割ることで、ダイオードに流れる電流値を求めることができます。

最終的に、ダイオードの印加電圧と流れた電流値をプロットしてI-Vプロットを取得することができるはずです。

DACの出力電圧は計算で求められますが、ChatGPTによると実測した方がよいとのことなので今回はこのような回路にしてみました。

プログラム

以下に、書き込んだスケッチを示します。

シリアルにヘッダ行を出力した後、以下のデータを1行ずつシリアルに出力する仕様です。

  1. DAC[V]: DACの電圧出力値(設定値)
  2. DAC output[V]: DACの電圧出力値(ADCでの読み取り値)
  3. Diode voltage[V]: ダイオードに印加した電圧(ADCでの読み取り値)
  4. Current[mA]: 2と3の電圧を差し引き、抵抗の両端の電位差を求めた後、抵抗値で割って算出
const int DAC_PIN = 25;
const int ADC_OUTPUT_VOLTAGE = 34;
const int ADC_DIODE_VOLTAGE = 35;

const float VREF = 3.30;
const float R_SHUNT = 1000.0;  // Ω

void setup() {
  // put your setup code here, to run once:
  Serial.begin(115200);

  analogReadResolution(12);
  analogSetAttenuation(ADC_11db);

  Serial.println("DAC[V],DAC output[V],Diode voltage[V],Current[mA]");
}

float readADC(int pin)
{
  // average ADC read values
  long sum = 0;

  for(int i=0; i < 16; i++)
  {
    sum += analogRead(pin);
  }

  return sum / 16.0;
}

void loop() {
  // put your main code here, to run repeatedly:

  for(int dac=0; dac<=255; dac++)
  {
    // Output Analog Voltage
    dacWrite(DAC_PIN, dac);
    delay(10);

    // Output Voltage[V]
    float dacVoltage = (VREF / 255.0) * dac;

    // Read Voltage[V]
    float adcOutputVoltage = readADC(ADC_OUTPUT_VOLTAGE);
    float adcDiodeVoltage = readADC(ADC_DIODE_VOLTAGE);

    float outputVoltage = adcOutputVoltage * VREF / 4095.0;
    float diodeVoltage = adcDiodeVoltage * VREF / 4095.0;

    // Calculate Current[mA]
    float current = (outputVoltage - diodeVoltage) / R_SHUNT * 1000;

    // Display Values
    Serial.print(dacVoltage, 3);
    Serial.print(",");

    Serial.print(outputVoltage, 3);
    Serial.print(",");

    Serial.print(diodeVoltage, 3);
    Serial.print(",");

    Serial.println(current, 6);

  }

  Serial.println("END");
  while(true);
}

測定・データ処理

スケッチとは別で以下のPythonスクリプトを作成し、シリアルの出力をCSVファイルとして出力するようにしました。

スクリプトを走らせた後、ESP32をリセットし測定を開始、測定が完了したら"END"の文字列を受け取り終了する仕様となっています。

import serial
import csv
from pathlib import Path
from datetime import datetime

PORT = "COM11"
BAUDRATE = 115200

filename = datetime.now().strftime("IV_%Y%m%d_%H%M%S.csv")
filepath = Path(f"./data/{filename}")

ser = serial.Serial(PORT, BAUDRATE)
write_flag = False

with open(filepath, "w", newline="") as f:
    writer = csv.writer(f)
    
    while True:
        readline = ser.readline().decode().strip()
        print(readline)
        
        if not write_flag:
            if readline.startswith("DAC[V]"):
                writer.writerow(readline.split(","))
                write_flag = True
        
        else:
            if readline == "END":
                break
            else:
                writer.writerow(readline.split(","))
            
ser.close()
print(f"Saved as {filename}") 

結果

得られた測定結果をMatplotlibを用いてプロットしてみました。

測定したのは、通常のSiダイオード(1N4148), 赤色のダイオードと白色ダイオード(品番などは不明)。

マイコン内蔵のDAC機能では流せる電流量が小さいため、立ち上がり初期しか測定できていませんが、順方向電圧の違いが明確に確認できます。

一方で、Siダイオードの順方向電圧の値が少し小さすぎる印象も受けるため、DACとADCの精度について検証する必要がありそうです。 ESP32のDAC・ADCにはオフセット誤差や非線形性があることが知られているため、それが原因なのかもしれません。

まとめ

ESP32に搭載されているDACとADCだけでも、簡易的なダイオードのI-V特性測定システムを構築できました。 測定可能な電流には制約がありますが、ダイオードごとの順方向電圧の違いは十分に確認できます。

今後はDAC出力をオペアンプでバッファし、より大きな電流を流せるよう改良した上で、最終目標である太陽電池のI-V特性測定にも挑戦したいと思います。

Quantum Espressoで第一原理計算#5 スーパーセルの計算-2

前回の記事では、Siのスーパーセルを作成し、DOSの計算を行いました。 今回は不純物(B, P)でスーパーセル内の原子を置換し、計算結果がどう変化するかを確認しました。

入力ファイルは全てB置換時のものを示しますが、Pの入力ファイルも同様の方法で作成したので、ほとんど違いはありません。

原子の置換

pymatgenを用いて、置換を行いました。 前回のスクリプトを流用、一部追記し、以下のようにしました。

import pymatgen
from pymatgen.core import Structure

# read cif file
structure =  Structure.from_file("Si.cif")
structure.remove_oxidation_states()
print(f"This Structure is consisted of {len(structure)} atoms")

# make supercell 
supercell = structure.copy()
supercell.make_supercell([2, 2, 2])

# substitute atom
supercell[0].species = "B"
print(f"Supercell is consisted of {len(supercell)} atoms")
supercell.to("Si_B_supercell.cif", "cif")

# print parameters
print("CELL_PARAMETERS")
lattice = supercell.lattice.matrix
for vec in lattice:
    print(f"{vec[0]:12.8f} {vec[1]:12.8f} {vec[2]:12.8f}")

print("ATOMIC_POSITIONS")
for site in supercell:
    element = site.species_string
    x, y, z = site.frac_coords
    print(f"{element} {x:.8f} {y:.8f} {z:.8f}")

cifファイルを読み込んだ後、スーパーセルに展開し、最初の原子をBに置換しています。 やっていることとしては、"ATOMIC_POSITIONS"の最初の元素をSiからBに置き換えるだけなので、エディタで編集するだけでも問題ないと思います。

SCF計算

出力された原子位置を元に以下の入力ファイルを作成し、SCF計算を行いました。 前回計算した純粋なSiと異なり、フェルミ準位が一部占有された状態(完全な絶縁体ではない状態)となるため、smearingを指定する必要がある点に注意します。 計算時間は、1時間20分程度掛かりました。

入力ファイル(クリックで展開)

&CONTROL
    calculation = 'scf',
    prefix = 'Si_B',
    outdir = './tmp',
    pseudo_dir = './pseudo'
/

&SYSTEM
    ibrav = 0,
    nat = 64,
    ntyp = 2,
    ecutwfc = 40.0,
    ecutrho = 320.0,
    occupations = 'smearing',
    smearing = 'mp',
    degauss = 0.02
/

&ELECTRONS
    conv_thr = 1.0d-6
/

CELL_PARAMETERS {angstrom}
    10.88740474   0.00000000   0.00000000
    0.00000000  10.88740474   0.00000000
    0.00000000   0.00000000  10.88740474
ATOMIC_SPECIES
    B 10.811 B.pbe-n-kjpaw_psl.1.0.0.UPF
    Si 28.08500 Si.pbe-n-kjpaw_psl.1.0.0.UPF
ATOMIC_POSITIONS {crystal}
    B 0.37500000 0.37500000 0.12500000
    Si 0.37500000 0.37500000 0.62500000
    Si 0.37500000 0.87500000 0.12500000
    Si 0.37500000 0.87500000 0.62500000
    Si 0.87500000 0.37500000 0.12500000
    Si 0.87500000 0.37500000 0.62500000
    Si 0.87500000 0.87500000 0.12500000
    Si 0.87500000 0.87500000 0.62500000
    Si 0.00000000 0.25000000 0.25000000
    Si 0.00000000 0.25000000 0.75000000
    Si 0.00000000 0.75000000 0.25000000
    Si 0.00000000 0.75000000 0.75000000
    Si 0.50000000 0.25000000 0.25000000
    Si 0.50000000 0.25000000 0.75000000
    Si 0.50000000 0.75000000 0.25000000
    Si 0.50000000 0.75000000 0.75000000
    Si 0.37500000 0.12500000 0.37500000
    Si 0.37500000 0.12500000 0.87500000
    Si 0.37500000 0.62500000 0.37500000
    Si 0.37500000 0.62500000 0.87500000
    Si 0.87500000 0.12500000 0.37500000
    Si 0.87500000 0.12500000 0.87500000
    Si 0.87500000 0.62500000 0.37500000
    Si 0.87500000 0.62500000 0.87500000
    Si 0.00000000 0.00000000 0.00000000
    Si 0.00000000 0.00000000 0.50000000
    Si 0.00000000 0.50000000 0.00000000
    Si 0.00000000 0.50000000 0.50000000
    Si 0.50000000 0.00000000 0.00000000
    Si 0.50000000 0.00000000 0.50000000
    Si 0.50000000 0.50000000 0.00000000
    Si 0.50000000 0.50000000 0.50000000
    Si 0.12500000 0.37500000 0.37500000
    Si 0.12500000 0.37500000 0.87500000
    Si 0.12500000 0.87500000 0.37500000
    Si 0.12500000 0.87500000 0.87500000
    Si 0.62500000 0.37500000 0.37500000
    Si 0.62500000 0.37500000 0.87500000
    Si 0.62500000 0.87500000 0.37500000
    Si 0.62500000 0.87500000 0.87500000
    Si 0.25000000 0.25000000 0.00000000
    Si 0.25000000 0.25000000 0.50000000
    Si 0.25000000 0.75000000 0.00000000
    Si 0.25000000 0.75000000 0.50000000
    Si 0.75000000 0.25000000 0.00000000
    Si 0.75000000 0.25000000 0.50000000
    Si 0.75000000 0.75000000 0.00000000
    Si 0.75000000 0.75000000 0.50000000
    Si 0.12500000 0.12500000 0.12500000
    Si 0.12500000 0.12500000 0.62500000
    Si 0.12500000 0.62500000 0.12500000
    Si 0.12500000 0.62500000 0.62500000
    Si 0.62500000 0.12500000 0.12500000
    Si 0.62500000 0.12500000 0.62500000
    Si 0.62500000 0.62500000 0.12500000
    Si 0.62500000 0.62500000 0.62500000
    Si 0.25000000 0.00000000 0.25000000
    Si 0.25000000 0.00000000 0.75000000
    Si 0.25000000 0.50000000 0.25000000
    Si 0.25000000 0.50000000 0.75000000
    Si 0.75000000 0.00000000 0.25000000
    Si 0.75000000 0.00000000 0.75000000
    Si 0.75000000 0.50000000 0.25000000
    Si 0.75000000 0.50000000 0.75000000
K_POINTS {automatic}
    4 4 4 0 0 0

NSCF計算

純粋なSiと同様に計算を行います。 DOSの計算結果において、不純物準位が確認できることを期待し、k点の分割数を多めにしています。 その結果、計算完了まで4時間半近くかかりました。。。

入力ファイル(クリックで展開)

&CONTROL
    calculation = 'nscf',
    prefix = 'Si_B',
    outdir = './tmp',
    pseudo_dir = './pseudo'
/

&SYSTEM
    ibrav = 0,
    nat = 64,
    ntyp = 2,
    ecutwfc = 40.0,
    ecutrho = 320.0,
    occupations = 'smearing',
    smearing = 'mp',
    degauss = 0.005,
    nbnd = 160
/

&ELECTRONS
    conv_thr = 1.0d-6
/

CELL_PARAMETERS {angstrom}
    10.88740474   0.00000000   0.00000000
    0.00000000  10.88740474   0.00000000
    0.00000000   0.00000000  10.88740474
ATOMIC_SPECIES
    B 10.811 B.pbe-n-kjpaw_psl.1.0.0.UPF
    Si 28.08500 Si.pbe-n-kjpaw_psl.1.0.0.UPF
ATOMIC_POSITIONS {crystal}
    B 0.37500000 0.37500000 0.12500000
    Si 0.37500000 0.37500000 0.62500000
    Si 0.37500000 0.87500000 0.12500000
    Si 0.37500000 0.87500000 0.62500000
    Si 0.87500000 0.37500000 0.12500000
    Si 0.87500000 0.37500000 0.62500000
    Si 0.87500000 0.87500000 0.12500000
    Si 0.87500000 0.87500000 0.62500000
    Si 0.00000000 0.25000000 0.25000000
    Si 0.00000000 0.25000000 0.75000000
    Si 0.00000000 0.75000000 0.25000000
    Si 0.00000000 0.75000000 0.75000000
    Si 0.50000000 0.25000000 0.25000000
    Si 0.50000000 0.25000000 0.75000000
    Si 0.50000000 0.75000000 0.25000000
    Si 0.50000000 0.75000000 0.75000000
    Si 0.37500000 0.12500000 0.37500000
    Si 0.37500000 0.12500000 0.87500000
    Si 0.37500000 0.62500000 0.37500000
    Si 0.37500000 0.62500000 0.87500000
    Si 0.87500000 0.12500000 0.37500000
    Si 0.87500000 0.12500000 0.87500000
    Si 0.87500000 0.62500000 0.37500000
    Si 0.87500000 0.62500000 0.87500000
    Si 0.00000000 0.00000000 0.00000000
    Si 0.00000000 0.00000000 0.50000000
    Si 0.00000000 0.50000000 0.00000000
    Si 0.00000000 0.50000000 0.50000000
    Si 0.50000000 0.00000000 0.00000000
    Si 0.50000000 0.00000000 0.50000000
    Si 0.50000000 0.50000000 0.00000000
    Si 0.50000000 0.50000000 0.50000000
    Si 0.12500000 0.37500000 0.37500000
    Si 0.12500000 0.37500000 0.87500000
    Si 0.12500000 0.87500000 0.37500000
    Si 0.12500000 0.87500000 0.87500000
    Si 0.62500000 0.37500000 0.37500000
    Si 0.62500000 0.37500000 0.87500000
    Si 0.62500000 0.87500000 0.37500000
    Si 0.62500000 0.87500000 0.87500000
    Si 0.25000000 0.25000000 0.00000000
    Si 0.25000000 0.25000000 0.50000000
    Si 0.25000000 0.75000000 0.00000000
    Si 0.25000000 0.75000000 0.50000000
    Si 0.75000000 0.25000000 0.00000000
    Si 0.75000000 0.25000000 0.50000000
    Si 0.75000000 0.75000000 0.00000000
    Si 0.75000000 0.75000000 0.50000000
    Si 0.12500000 0.12500000 0.12500000
    Si 0.12500000 0.12500000 0.62500000
    Si 0.12500000 0.62500000 0.12500000
    Si 0.12500000 0.62500000 0.62500000
    Si 0.62500000 0.12500000 0.12500000
    Si 0.62500000 0.12500000 0.62500000
    Si 0.62500000 0.62500000 0.12500000
    Si 0.62500000 0.62500000 0.62500000
    Si 0.25000000 0.00000000 0.25000000
    Si 0.25000000 0.00000000 0.75000000
    Si 0.25000000 0.50000000 0.25000000
    Si 0.25000000 0.50000000 0.75000000
    Si 0.75000000 0.00000000 0.25000000
    Si 0.75000000 0.00000000 0.75000000
    Si 0.75000000 0.50000000 0.25000000
    Si 0.75000000 0.50000000 0.75000000
K_POINTS {automatic}
    8 8 8 0 0 0

DOS計算

以下の入力ファイルでDOSを計算した後、出力ファイルをmatplotlibでプロットしました。

入力ファイル(クリックで展開)

&DOS
    outdir = './tmp',
    prefix = 'si',
    fildos = './dos/Si_B.dos',
    Emin = -10,
    Emax = 15,
    DeltaE = 0.02
/

プロット図を以下に示します。

フェルミ準位がVBM付近に位置していることが分かります。

0Kの基底状態を計算しているはずなので、フェルミ準位より上の状態は電子が占有していない。 従って、フェルミ準位上方のDOSが、Bによるアクセプタ準位という理解で正しい…と思う。

同様に、Pで置換した場合のDOSを示します。

CBM付近にフェルミ準位が位置しています。 こちらも、基底状態では電子は励起されずドナー準位に存在するはず。 従って、フェルミ準位の下方のDOSがPによるアクセプタ準位という理解であっているのかな。