tkTransport.py 技術ドキュメント
tkTransport.py は、熱電材料や半導体におけるキャリア輸送特性、フェルミ積分、状態密度などの物理量を計算・解析するためのPythonライブラリです。
ライブラリの機能や目的
tkTransport.py は、熱電材料や半導体の物理的特性、特に電荷キャリアの輸送現象に関連する複雑な計算を支援することを目的としています。具体的には、以下の主要な機能を提供します。
数値積分: リーマン和やシンプソン法による基本的な数値積分、およびSciPyライブラリを活用した高精度な数値積分。
フェルミ・ディラック統計: フェルミ・ディラック分布関数の計算、および各種近似式や数値積分を用いたフェルミ積分の計算。非縮退、縮退、および高速計算のためのアルゴリズムを含みます。
状態密度と有効質量: 有効質量と有効状態密度、または状態密度のプレファクターとの相互変換。
キャリア輸送モデル: 2種類キャリアモデル(電子と正孔)におけるホール抵抗率、ホール係数、磁気抵抗の計算。単一キャリアモデルや、移動度が等しい場合の特殊なケースにも対応します。
物理定数: 物理学で頻繁に使用される基本的な物理定数(プランク定数、電子電荷、ボルツマン定数など)へのアクセス。
データ入出力: CSVファイルやExcelファイルからのデータ読み込み、およびCSVファイルへのデータ書き出し機能。
金属および半導体統計計算: 金属におけるフェルミ準位やキャリア密度の計算、および半導体におけるキャリア統計と輸送特性の計算(ただし、一部機能はクラスメソッドとして設計されており、完全な動作には追加のコードが必要です)。
このライブラリは、材料科学、固体物理学、半導体デバイス物理学などの分野における研究者やエンジニアが、材料の電気的・熱的特性をシミュレーションし、解析するための強力なツールとなります。
importする方法
tkTransport.py ライブラリは、標準的なPythonモジュールと同様に import 文を使用して他のPythonプログラムから利用できます。
import tkTransport
# ライブラリの関数や変数にアクセス
print(tkTransport.LorentzNumber_FEA)
result = tkTransport.FermiIntegral_fast(1.0, 0.5)
特定の関数や変数のみをインポートする場合は、以下のように記述します。
from tkTransport import FermiIntegral_fast, LorentzNumber_FEA
print(LorentzNumber_FEA)
result = FermiIntegral_fast(1.0, 0.5)
必要な非標準ライブラリとインストール方法
tkTransport.py を完全に機能させるためには、いくつかの非標準ライブラリが必要です。pip コマンドを使用してインストールできます。
scipy: 数値計算、特に積分機能に使用されます。pip install scipy
openpyxl: Excel (xlsx) ファイルの読み込みに使用されます。pip install openpyxl
tklib: このライブラリのコードは、tklibという別のカスタムライブラリからのインポートに依存しています。具体的にはtklib.tkfile,tklib.tkvariousdata,tklib.tksci.tksciが使われています。インストール方法:
tklibは標準的なpipインストールパッケージとしては公開されていない可能性があります。このライブラリと同じ開発者によって提供される、または同等の機能を持つライブラリを別途入手し、Pythonのパスが通っている場所に配置する必要があります。詳細なインストール方法は提供されていませんが、一般的にはソースコードを直接プロジェクトにコピーするか、ローカルパッケージとしてインストールすることが考えられます。
また、CSVファイルの読み書き関数内で csv モジュールが使用されていますが、トップレベルでの import csv がありません。これらの関数を使用する場合は、利用側で import csv を追加するか、tkTransport.py のソースコードに追記する必要があります。
importできる変数と関数
グローバル変数
LorentzNumber_FEA説明: フェルミ・ディラック統計における標準的なローレンツ数(Sommerfeld理論に基づく)。単位は \(W \Omega / K^2\)。
pi,h,hbar,c,e,kB,me説明:
tklib.tksci.tksciからインポートされる物理定数。pi: 円周率 \(\pi\)h: プランク定数hbar: ディラック定数(換算プランク定数)c: 光速e: 素電荷kB: ボルツマン定数me: 電子質量
関数
rieman(x0, dx, y, xmin, xmax)動作: リスト
yに格納されたデータに対して、リーマン和を用いて積分を計算します。積分範囲 (xminからxmax) 内のデータのみを対象とします。引数:
x0(float): \(x\) 軸の開始点。dx(float): \(x\) 軸の刻み幅。y(list): 積分対象の \(y\) 値のリスト。xmin(float): 積分範囲の最小値。xmax(float): 積分範囲の最大値。
戻り値: (float) 計算されたリーマン和による積分の値。
integrate_Simpson(func, E0, E1, h, nmin = 8)動作: シンプソン法を用いて関数
funcの定積分を計算します。積分区間 \([E_0, E_1]\) をhのステップで分割します。最小分割数nminを保証します。引数:
func(function): 積分対象の関数。引数として \(E\) を取ります。E0(float): 積分区間の下限。E1(float): 積分区間の上限。h(float): 分割幅。nmin(int, optional): 積分区間の最小分割数。デフォルトは 8。
戻り値: (float) 計算されたシンプソン法による積分の値。
integrate_Simpson_list(xlist, ylist)動作: \(x\) と \(y\) のリストで与えられたデータに対して、シンプソン法を用いて累積積分を計算します。
引数:
xlist(list): \(x\) 座標のリスト。ylist(list): \(y\) 座標のリスト。
戻り値: (list) 各点までの累積積分のリスト。
fe(E, T, EF)動作: 電子に対するフェルミ・ディラック分布関数 \(f_e(E)\) を計算します。 $\( f_e(E) = \frac{1}{\exp\left(\frac{(E - E_F)e}{k_B T}\right) + 1} \)$
引数:
E(float): エネルギー。T(float): 温度 (K)。EF(float): フェルミ準位。
戻り値: (float) フェルミ・ディラック分布関数の値。
fh(E, T, EF)動作: 正孔に対するフェルミ・ディラック分布関数 \(f_h(E)\) を計算します。 $\( f_h(E) = 1 - f_e(E) = \frac{1}{\exp\left(\frac{E_F - E}{k_B T}\right) + 1} \)$
引数:
E(float): エネルギー。T(float): 温度 (K)。EF(float): フェルミ準位。
戻り値: (float) フェルミ・ディラック分布関数の値。
DiffFermiDiracDistribution(w, w0, x)動作: フェルミ・ディラック分布関数の微分を計算します。 $\(\frac{d}{dx} \left( \frac{1}{e^{(x-x_0)/w} + 1} \right) = -\frac{1}{w} \frac{e^{(x-x_0)/w}}{(e^{(x-x_0)/w} + 1)^2}\)$ ただし、コード内では
x0が未定義のローカル変数であるため、この関数はNameErrorを発生させる可能性があります。w0がx0の意図である可能性があります。引数:
w(float): 分布の幅に関連するパラメータ。w0(float): 使用されていない引数。x(float): 変数。
戻り値: (float) フェルミ・ディラック分布関数の微分の値。
func_Fr(x, eta, r)動作: フェルミ積分の被積分関数 \(F_r(\eta)\) の一部を計算します。 $\( \frac{x^r}{\exp(x - \eta) + 1} \)$
引数:
x(float): 積分変数。eta(float): 換算フェルミ準位 \(\eta = (E_F - E_C)/(k_B T)\)。r(float): フェルミ積分の次数。
戻り値: (float) 被積分関数の値。
FermiIntegral_simple(eta, r, eps = 1.0e-7)動作:
scipy.integrate.quadを用いてフェルミ積分を直接計算します。非縮退領域 (eta < -13.0) ではガンマ関数近似を使用します。引数:
eta(float): 換算フェルミ準位。r(float): フェルミ積分の次数。eps(float, optional): 積分精度を指定する許容誤差。デフォルトは \(1.0 \times 10^{-7}\)。
戻り値: (float) 計算されたフェルミ積分の値。
func_Fr_x2(x, eta, r)動作: 変数変換 \(z = x^2\) を行った後のフェルミ積分の被積分関数を計算します。 $\( \frac{2x^{2r+1}}{\exp(x^2 - \eta) + 1} \)\( これは、積分 \)\int_0^\infty \frac{z^r}{e^{z-\eta}+1} dz\( において \)z=x^2\( と置換した際の被積分関数 \)f(x) dx\( の \)f(x)$ に相当します。
引数:
x(float): 積分変数。eta(float): 換算フェルミ準位。r(float): フェルミ積分の次数。
戻り値: (float) 変換された被積分関数の値。
FermiIntegral_x2(eta, r, eps = 1.0e-7)動作: 変数変換 \(z=x^2\) を用いて積分範囲を短縮し、
scipy.integrate.quadでフェルミ積分を計算します。非縮退領域 (eta < -13.0) ではガンマ関数近似を使用します。引数:
eta(float): 換算フェルミ準位。r(float): フェルミ積分の次数。eps(float, optional): 積分精度を指定する許容誤差。デフォルトは \(1.0 \times 10^{-7}\)。
戻り値: (float) 計算されたフェルミ積分の値。
FermiIntegral_Simpson(eta, r, dx = 0.01, eps = 1.0e-7)動作:
scipy.integrate.simpsを用いて、シンプソン法によりフェルミ積分を計算します。非縮退領域 (eta < -13.0) ではガンマ関数近似を使用します。積分範囲はetaとrに基づいて決定されます。引数:
eta(float): 換算フェルミ準位。r(float): フェルミ積分の次数。dx(float, optional): 積分時のステップサイズ。デフォルトは \(0.01\) (ただし、コード内で \(0.03\) に上書きされます)。eps(float, optional): 積分精度を指定する許容誤差。デフォルトは \(1.0 \times 10^{-7}\)。
戻り値: (float) 計算されたフェルミ積分の値。
DegenerateFermiDirac(eta, r, eps = 1.0e-7)動作: 縮退領域 (\(\eta \gg 0\)) におけるフェルミ積分を Sommerfeld 展開を用いて近似計算します。
引数:
eta(float): 換算フェルミ準位。r(float): フェルミ積分の次数。eps(float, optional): 使用されていない引数。デフォルトは \(1.0 \times 10^{-7}\)。
戻り値: (float) 近似計算されたフェルミ積分の値。
NonDegenerateFermiDirac(eta, r, eps = 1.0e-7)動作: 非縮退領域 (\(\eta \ll 0\)) におけるフェルミ積分を級数展開を用いて近似計算します。
引数:
eta(float): 換算フェルミ準位。r(float): フェルミ積分の次数。eps(float, optional): 使用されていない引数。デフォルトは \(1.0 \times 10^{-7}\)。
戻り値: (float) 近似計算されたフェルミ積分の値。
FermiIntegral_fast(eta, r, eps = 1.0e-7)動作: 換算フェルミ準位
etaの値に応じて、高速にフェルミ積分を計算します。縮退領域 (eta >= 20.0) ではDegenerateFermiDiracを、非縮退領域 (eta < -0.1) ではNonDegenerateFermiDiracを使用し、中間領域ではscipy.integrate.quadを分割して用います。引数:
eta(float): 換算フェルミ準位。r(float): フェルミ積分の次数。eps(float, optional): 使用されていない引数。デフォルトは \(1.0 \times 10^{-7}\)。
戻り値: (float) 計算されたフェルミ積分の値。
meff2NC_FEA(meff, T)動作: 有効質量
meff(電子質量 \(m_e\) に対する比) から有効状態密度 \(N_C\) (単位: \(cm^{-3}\)) を計算します。 $\( N_C = 2 \left( \frac{2 \pi m_e m_{eff} k_B T}{h^2} \right)^{3/2} \)$引数:
meff(float): 有効質量 (\(m_e\) で規格化)。T(float): 温度 (K)。
戻り値: (float) 有効状態密度 (\(cm^{-3}\))。
NC2meff_FEA(NC, T)動作: 有効状態密度 \(N_C\) (単位: \(cm^{-3}\)) から有効質量
meff(電子質量 \(m_e\) に対する比) を計算します。引数:
NC(float): 有効状態密度 (\(cm^{-3}\))。T(float): 温度 (K)。
戻り値: (float) 有効質量 (\(m_e\) で規格化)。
meff2DC0_FEA(meff, T)動作: 有効質量
meff(電子質量 \(m_e\) に対する比) から状態密度のプレファクター \(D_0\) (単位: \(cm^{-3}eV^{-1.5}\)) を計算します。 $\( D_0 = \frac{\sqrt{2}}{\pi^2} \frac{(m_e m_{eff})^{3/2}}{\hbar^3} \)$引数:
meff(float): 有効質量 (\(m_e\) で規格化)。T(float): 温度 (K)。
戻り値: (float) 状態密度のプレファクター (\(cm^{-3}eV^{-1.5}\))。
DC02meff_FEA(DC0, T)動作: 状態密度のプレファクター \(D_0\) (単位: \(cm^{-3}eV^{-1.5}\)) から有効質量
meff(電子質量 \(m_e\) に対する比) を計算します。引数:
DC0(float): 状態密度のプレファクター (\(cm^{-3}eV^{-1.5}\))。T(float): 温度 (K)。
戻り値: (float) 有効質量 (\(m_e\) で規格化)。
CalEF_metal(N, T, EF0, dE)動作: 金属におけるフェルミ準位 \(E_F\) を計算します。
scipy.optimize.newtonを用いて、電子密度 \(N\) を与える \(E_F\) を探します。ただし、optimizeモジュールのインポート、D0,Ne,Deなどの変数が未定義であるため、この関数は現状では完全には動作しません。引数:
N(float): 電子密度。T(float): 温度 (K)。EF0(float): フェルミ準位の初期推定値。dE(float): 使用されていない引数。
戻り値: (float) 計算されたフェルミ準位 (eV)。
CalNe_metal(T, EF)動作: 金属における電子密度を計算します。さまざまな積分範囲と数値積分手法 (
scipy.integrate.quad,scipy.integrate.romberg) を比較して出力します。ただし、D0,De,Defe,eps,ncycle,maxorder,timeモジュールが未定義であるため、この関数は現状では完全には動作しません。引数:
T(float): 温度 (K)。EF(float): フェルミ準位 (eV)。
戻り値: なし (計算結果を標準出力に表示)。
BMShift_FEA(Ne, D0)動作: ボルツマンシフトに関連するフェルミ準位 \(E_F\) を計算します。
D0は状態密度のプレファクターと想定されます。 $\( E_F = \left( \frac{1.5 N_e}{D_0} \right)^{2/3} \)$引数:
Ne(float): 電子密度。D0(float): 状態密度のプレファクター。
戻り値: (float) 計算された \(E_F\) の値。
RichardsonDushman_FEA(meff = 1.0)動作: リチャードソン・ダッシュマン電流のプレファクター \(A_{RD}\) を計算します。 $\( A_{RD} = \frac{4 \pi m_e e k_B^2}{h^3} \cdot \frac{m_{eff}}{m_e} \)$
引数:
meff(float, optional): 有効質量 (\(m_e\) で規格化)。デフォルトは \(1.0\)。
戻り値: (float) リチャードソン・ダッシュマン電流の有効プレファクター。
CalPlasmaFrequency(Ne, meff)動作: プラズマ周波数 \(\omega_p\) を計算します。
e0が未定義の変数です。 $\( \omega_p = \sqrt{\frac{N_e e^2}{m_e m_{eff} \epsilon_0}} \)$引数:
Ne(float): 電子密度。meff(float): 有効質量 (\(m_e\) で規格化)。
戻り値: (float) プラズマ周波数。
cal_twocarriers(mue, ne, muh, nh)動作: 2種類のキャリア(電子と正孔)が存在する場合のホール抵抗率 \(\rho_{xx}\)、ホール係数 \(R_H\)、およびホールキャリア密度 \(N_S\) を計算します。 $\( \rho_{xx} = \frac{1}{e (n_h \mu_h + n_e \mu_e)} \)\( \)\( R_H = \frac{1}{e} \frac{n_h \mu_h^2 - n_e \mu_e^2}{(n_h \mu_h + n_e \mu_e)^2} \)\( \)\( N_S = \frac{1}{e R_H} \)$
引数:
mue(float): 電子の移動度。ne(float): 電子のキャリア密度。muh(float): 正孔の移動度。nh(float): 正孔のキャリア密度。
戻り値:
rhoxx(float): ホール抵抗率。RH(float): ホール係数。Ns(float): ホールキャリア密度。
cal_statistics(self, T)動作: 半導体におけるキャリア統計量を計算します。具体的には、フェルミ準位 \(E_F\)、電子密度 \(N_e\)、正孔密度 \(N_h\)、ドナーイオン密度 \(N_{D+}\)、アクセプタイオン密度 \(N_{A-}\) を二分法を用いて計算します。この関数は
selfを引数にとるため、通常はクラスのメソッドとして使用されることを想定しています。selfオブジェクトにはEv,Ec,Ne,NAm,Nh,NDp,mue,muh,nmaxiter,epsなどの属性が含まれている必要があります。引数:
self(object):Ev,Ec(価電子帯上端、伝導帯下端エネルギー),Ne,NAm,Nh,NDp(キャリア/イオン密度計算関数),nmaxiter,eps(収束条件) などの属性を持つオブジェクト。T(float): 温度 (K)。
戻り値:
EFhalf(float): 計算されたフェルミ準位。Neh(float): 電子密度。Nhh(float): 正孔密度。NDph(float): イオン化されたドナー密度。NAmh(float): イオン化されたアクセプター密度。Ns(float): ホールキャリア密度 (2種類のキャリアモデルに基づく)。計算に失敗した場合は
(None, None, None, None, None, None)を返します。
cal_transport(self, T)動作: 半導体における輸送特性(導電率 \(\sigma\)、移動度 \(\mu_e, \mu_h\))を計算します。この関数は
selfを引数にとるため、通常はクラスのメソッドとして使用されることを想定しています。selfオブジェクトにはcal_statistics,cal_muh,cal_mueなどのメソッドと、mue,muhなどの属性が含まれている必要があります。引数:
self(object):cal_statisticsなどのメソッドを持つオブジェクト。T(float): 温度 (K)。
戻り値:
EF(float): フェルミ準位。Ne(float): 電子密度。Nh(float): 正孔密度。NDph(float): イオン化されたドナー密度。NAm(float): イオン化されたアクセプター密度。Ns(float): ホールキャリア密度。mue(float): 電子の移動度。muh(float): 正孔の移動度。sigma(float): 導電率。
MR_twocarrier(nh, muh, ne, mue, B)動作: 2種類のキャリア(正孔と電子)が存在する場合の磁気抵抗 (MR) を計算します。具体的には、磁場中の抵抗率 \(\rho_{xx}\)、ゼロ磁場抵抗率 \(\rho_{xx0}\)、磁気抵抗変化 \(\Delta \rho_{xx} = \rho_{xx} - \rho_{xx0}\)、およびホール抵抗率 \(\rho_{xy}\) を計算します。
引数:
nh(float): 正孔のキャリア密度。muh(float): 正孔の移動度。ne(float): 電子のキャリア密度。mue(float): 電子の移動度。B(float): 磁場強度。
戻り値:
rhoxx(float): 磁場中の抵抗率。rhoxx0(float): ゼロ磁場抵抗率。MRxx(float): 磁気抵抗変化。MRxy(float): ホール抵抗率。
MR_singlecarrier(n, mu, B)動作: 単一キャリア(電子または正孔)が存在する場合の磁気抵抗 (MR) を計算します。磁場中の抵抗率 \(\rho_{xx}\)、ゼロ磁場抵抗率 \(\rho_{xx0}\)、磁気抵抗変化 \(\Delta \rho_{xx} = \rho_{xx} - \rho_{xx0}\)、およびホール抵抗率 \(\rho_{xy}\) を計算します。
引数:
n(float): キャリア密度。mu(float): キャリア移動度。B(float): 磁場強度。
戻り値:
rhoxx(float): 磁場中の抵抗率。rhoxx0(float): ゼロ磁場抵抗率。MRxx(float): 磁気抵抗変化。MRxy(float): ホール抵抗率。
MR_samemu(nh, mu, ne, B)動作: 2種類のキャリア(正孔と電子)が存在し、それらの移動度が等しい場合の磁気抵抗 (MR) を計算します。
MR_twocarrierを内部で呼び出します。引数:
nh(float): 正孔のキャリア密度。mu(float): 正孔と電子に共通の移動度。ne(float): 電子のキャリア密度。B(float): 磁場強度。
戻り値:
rhoxx(float): 磁場中の抵抗率。rhoxx0(float): ゼロ磁場抵抗率。MRxx(float): 磁気抵抗変化。MRxy(float): ホール抵抗率。
MR(model, nh, muh, ne, mue, B)動作: 指定された
modelに基づいて磁気抵抗を計算します。'two':MR_twocarrierを呼び出します。'single':MR_singlecarrierを呼び出します(nh,muhを使用し、ne,mueは無視)。'same_mu':MR_samemuを呼び出します。
引数:
model(str): 使用するモデル ('two', 'single', 'same_mu')。nh(float): 正孔のキャリア密度。muh(float): 正孔の移動度 (または'single'および'same_mu'モデルでの共通移動度)。ne(float): 電子のキャリア密度。mue(float): 電子の移動度。B(float): 磁場強度。
戻り値: (tuple)
MR_twocarrierまたはMR_singlecarrier関数と同じ戻り値。
read_datafile(infile, usage = None)動作:
tklib.tkvariousdata.tkVariousDataクラスを用いて、汎用的なデータファイルからデータを読み込みます。データファイルから主要なラベル(温度、ゼーベック係数、導電率、キャリア密度、移動度など)とそれに対応する数値データを抽出します。引数:
infile(str): 読み込むデータファイルのパス。usage(str, optional):tkVariousDataに渡される使用目的を示す文字列。デフォルトはNone。
戻り値: (tuple)
label_sample(str): サンプルデータに関するラベル。xsample(list): サンプルデータ (\(x\) 軸データ)。label_S(str): ゼーベック係数に関するラベル。yS(list): ゼーベック係数のデータ。label_sigma(str): 導電率に関するラベル。ysigma(list): 導電率のデータ。label_N(str): キャリア密度に関するラベル。yN(list): キャリア密度のデータ。label_mu(str): 移動度に関するラベル。ymu(list): 移動度のデータ。
read_Hall_excel(infile)動作: Excelファイル (
.xlsx) からホール測定データを読み込みます。ファイルは1行目にラベル(温度、キャリア密度、移動度、導電率など)、2行目以降にデータを持つ形式を想定しています。引数:
infile(str): 読み込むExcelファイルのパス。
戻り値: (tuple)
[Tlabel, Nlabel, mulabel, slabel](list): 各列のラベルのリスト。xT(list): 温度データのリスト。yN(list): キャリア密度データのリスト。ymu(list): 移動度データのリスト。ys(list): 導電率データのリスト。
注意:
terminate()関数が未定義であるため、ファイル読み込みエラー時にはプログラムが異常終了する可能性があります。
savecsv(outfile, header, datalist)動作: 指定されたデータをCSVファイルに書き込みます。
headerは列名、datalistは各列のデータを含むリストのリストです。この関数が意図通りに動作するためには、import csvが必要です。引数:
outfile(str): 出力するCSVファイルのパス。header(list): 列名の文字列リスト。datalist(list of lists): 各要素が1つの列に対応するデータのリスト。
戻り値: なし。
read_csv(infile, xmin = None, xmax = None, delimiter = ',')動作: CSVファイルを読み込み、指定された \(x\) 範囲内のデータ (
x,yの2列のみを想定) を抽出します。この関数が意図通りに動作するためには、import csvが必要です。また、pfloat()関数が未定義です。引数:
infile(str): 読み込むCSVファイルのパス。xmin(float, optional): \(x\) データの最小値。デフォルトはNone(範囲指定なし)。xmax(float, optional): \(x\) データの最大値。デフォルトはNone(範囲指定なし)。delimiter(str, optional): CSVの区切り文字。デフォルトは,。
戻り値: (tuple)
header(list): CSVファイルのヘッダー行のリスト。data[0](list): 抽出された \(x\) データ。data[1](list): 抽出された \(y\) データ。
read_excel(infile)動作: Excelファイル (
.xlsx) から温度、キャリア密度、ゼーベック係数のデータを読み込みます。ファイルは1行目にラベル(温度、キャリア密度、ゼーベック係数)、2行目以降にデータを持つ形式を想定しています。引数:
infile(str): 読み込むExcelファイルのパス。
戻り値: (tuple)
[Tlabel, Nlabel](list): 温度とキャリア密度のラベルのリスト。xT(list): 温度データのリスト。yN(list): キャリア密度データのリスト。yS(list): ゼーベック係数データのリスト。
注意:
terminate()関数が未定義であるため、ファイル読み込みエラー時にはプログラムが異常終了する可能性があります。
main scriptとして実行したときの動作
tkTransport.py がPythonスクリプトとして直接実行された場合 (python tkTransport.py)、if __name__ == "__main__": ブロック内の main() 関数が呼び出されます。
main() 関数は以下のメッセージを標準出力に出力し、特に計算処理は行いません。
This is a library, not runnable
これは、このファイルがスタンドアロンの実行可能プログラムではなく、他のスクリプトやアプリケーションからインポートされて使用されることを意図したライブラリであることを示しています。