pvanalyze プログラム仕様

PV特性評価ツールスクリプト。

概要:

太陽電池の電気的・光学的特性を評価するツールです。

詳細説明:

mode=alpha または mode=make_alpha では、反射率と透過率のスペクトルから 吸収スペクトルを計算し、プロットおよびExcelへの保存を行います。 mode=analyze では、I-Vデータからパラメータ推定、発電特性解析、量子効率計算、 および結果のプロットを行います。

主な機能:
  • 反射率/透過率から吸収スペクトルの計算と保存

  • I-Vデータからの太陽電池パラメータ(I0, ndiode, IPV, Rs, Rsh)推定

  • 発電特性(Voc, Jsc, FF, Pmaxなど)の解析

  • 量子効率(EQE, IQE)の計算

  • 解析結果のプロットとExcelファイルへの保存

関連リンク:

pvanalyze_usage

electrical.pvanalyze.absorptance_from_alpha(alpha_cm, d_nm)
概要:

吸収係数と膜厚から吸収率を計算します。

詳細説明:

A = 1 - exp(-alpha * d) の式を用いて計算します。

引数:
param alpha_cm:

吸収係数 (cm^-1)。

type alpha_cm:

float or None

param d_nm:

PV層の膜厚 (nm)。

type d_nm:

float

戻り値:
returns:

計算された吸収率。

rtype:

float

例外:
raises ValueError:

alpha_cmがNoneまたは無効な値の場合。

electrical.pvanalyze.alpha_at_energy(optical, E_eV)
概要:

指定されたフォトンエネルギーにおける吸収係数(α)を光学スペクトルデータから補間して取得します。

引数:
param optical:

analyze_opticalまたはread_alpha_from_excelから返された光学データ辞書。

type optical:

dict or None

param E_eV:

取得したいフォトンエネルギー (eV)。

type E_eV:

float

戻り値:
returns:

指定されたエネルギーにおける吸収係数 (cm^-1)。データがない場合はNaN。

rtype:

float

例外:
raises ValueError:

補間された吸収係数がNaNの場合。

electrical.pvanalyze.analyze_optical(wl_R_nm, R_percent, wl_T_nm, T_percent, d_nm)
概要:

反射率(R)と透過率(T)のスペクトルデータから吸収率(A)と吸収係数(α)を計算します。

詳細説明:

異なる波長スケールのRとTを共通の波長スケールに補間し、 RとTのデータに基づいてAとαを計算します。

引数:
param wl_R_nm:

反射率スペクトルの波長データ (nm)。

type wl_R_nm:

numpy.ndarray

param R_percent:

反射率データ (%)。

type R_percent:

numpy.ndarray

param wl_T_nm:

透過率スペクトルの波長データ (nm)。

type wl_T_nm:

numpy.ndarray

param T_percent:

透過率データ (%)。

type T_percent:

numpy.ndarray

param d_nm:

PV層の膜厚 (nm)。

type d_nm:

float

戻り値:
returns:

計算された光学特性値を含む辞書。

rtype:

dict - wl_nm (numpy.ndarray): 共通波長データ (nm)。 - R (numpy.ndarray): 反射率 (0-1)。 - Tr (numpy.ndarray): 透過率 (0-1)。 - A (numpy.ndarray): 吸収率 (0-1)。 - alpha_cm^-1 (numpy.ndarray): 吸収係数 (cm^-1)。

electrical.pvanalyze.choose_sweep(xs_list, ys_list, sweep_index=0)
概要:

複数のスイープデータから指定されたインデックスの単一スイープを選択します。

引数:
param xs_list:

各スイープのX軸(電圧)データのリスト。

type xs_list:

list[numpy.ndarray]

param ys_list:

各スイープのY軸(電流)データのリスト。

type ys_list:

list[numpy.ndarray]

param sweep_index:

選択するスイープのインデックス。

type sweep_index:

int

戻り値:
returns:

選択されたスイープのX軸データとY軸データ。

rtype:

tuple[numpy.ndarray, numpy.ndarray]

例外:
raises ValueError:

スイープデータが利用できない場合。

raises IndexError:

sweep_indexが範囲外の場合。

electrical.pvanalyze.compute_p0(F0, P0, E_eV, lambda_nm)
概要:

入射フォトンエネルギー密度(P0)を計算します。

詳細説明:

入射フォトンフラックス(F0)が与えられている場合はそれから計算し、 そうでない場合は直接指定されたP0を使用します。

引数:
param F0:

入射フォトンフラックス (cm^-2 s^-1)。Noneの場合はP0を使用。

type F0:

float or None

param P0:

入射フォトンエネルギー密度 (W/cm^2)。Noneの場合はF0から計算。

type P0:

float or None

param E_eV:

フォトンエネルギー (eV)。F0からP0を計算する場合に使用。

type E_eV:

float

param lambda_nm:

フォトン波長 (nm)。F0からP0を計算する場合に使用。

type lambda_nm:

float

戻り値:
returns:

計算された入射フォトンエネルギー密度 (W/cm^2)。

rtype:

float or None

electrical.pvanalyze.compute_photon_energy_eV(E_eV, lambda_nm)
概要:

フォトンエネルギー(eV)を計算します。

詳細説明:

フォトンエネルギーが直接与えられている場合はそれを使用し、 そうでない場合は波長から計算します。

引数:
param E_eV:

フォトンエネルギー (eV)。0より大きい場合はこれを使用。

type E_eV:

float

param lambda_nm:

フォトン波長 (nm)。E_eVが0の場合にこれを使用。

type lambda_nm:

float

戻り値:
returns:

計算されたフォトンエネルギー (eV)。

rtype:

float

electrical.pvanalyze.consolidate_duplicate_x(x, y)
概要:

X軸に重複する値がある場合、Y軸の対応する値を平均して重複を解消します。

引数:
param x:

X軸データ。

type x:

numpy.ndarray

param y:

Y軸データ。

type y:

numpy.ndarray

戻り値:
returns:

重複が解消されたX軸データと、重複が解消され平均化されたY軸データ。

rtype:

tuple[numpy.ndarray, numpy.ndarray]

electrical.pvanalyze.dual_print(*args, **kwargs)
概要:

標準出力とログファイルの両方にメッセージを出力します。

詳細説明:

通常のprint関数の動作を模倣し、標準出力に加えて、 _redirect_fpに設定されたファイルオブジェクトにも出力します。

引数:
param args:

printに渡される位置引数。

type args:

tuple

param kwargs:

printに渡されるキーワード引数。

type kwargs:

dict

戻り値:

なし

electrical.pvanalyze.estimate_initial_params(V, I_meas, T=300.0)
概要:

I-Vデータから単一ダイオードモデルの初期パラメータ(I0, ndiode, IPV, Rs, Rsh)を推定します。

詳細説明:

estimate_rs_tangent_point、estimate_rsh_tangent_point、 estimate_ndiode_representative_pointなどの補助関数を用いて、 各パラメータの初期値を経験的に決定します。

引数:
param V:

電圧データ (V)。

type V:

numpy.ndarray

param I_meas:

測定電流データ (A)。

type I_meas:

numpy.ndarray

param T:

温度 (K)。

type T:

float

戻り値:
returns:

推定された初期パラメータを含む辞書。

rtype:

dict - I0 (float): 逆方向飽和電流 (A)。 - ndiode (float): ダイオード因子。 - IPV (float): 光電流 (A)。 - Rs (float): 直列抵抗 (Ω)。 - Rsh (float): 並列抵抗 (Ω)。 - Ish (float): 並列抵抗に流れる電流 (A)。 - Vsh (float): Rsh推定における代表点電圧 (V)。 - Vnd (float): ndiode推定における代表点電圧 (V)。

electrical.pvanalyze.estimate_ndiode_curve(V, I, T=300.0)
概要:

I-Vデータから電圧に対するダイオード因子(ndiode)の曲線を推定します。

詳細説明:

log(abs(I))の一次微分を計算し、それに基づいて各電圧点におけるダイオード因子を導出します。

引数:
param V:

電圧データ (V)。

type V:

numpy.ndarray

param I:

電流データ (A)。

type I:

numpy.ndarray

param T:

温度 (K)。

type T:

float

戻り値:
returns:

ダイオード因子が計算された電圧データと、各電圧に対応する推定されたダイオード因子。

rtype:

tuple[numpy.ndarray, numpy.ndarray]

electrical.pvanalyze.estimate_ndiode_representative_point(V, I, T=300.0, Ish=None)
概要:

I-V曲線からダイオード因子(ndiode)を推定するための代表点と値を計算します。

詳細説明:

順方向バイアス領域でlog(abs(I))の二階微分が最小となる点を特定し、 その点での一次微分からダイオード因子を計算します。

引数:
param V:

電圧データ (V)。

type V:

numpy.ndarray

param I:

電流データ (A)。

type I:

numpy.ndarray

param T:

温度 (K)。

type T:

float

param Ish:

並列抵抗に流れる電流の推定値。これを考慮してIを調整します。

type Ish:

float or None

戻り値:
returns:

ダイオード因子推定に関する情報を含む辞書。計算できなかった場合はNone。

rtype:

dict or None - v_rep (float): 代表点電圧 (V)。 - ndiode (float): 推定されたダイオード因子。 - slope_logI (float): 代表点でのlog(abs(I))の傾き (1/V)。 - curvature_logI (float): 代表点でのlog(abs(I))の二階微分 (1/V^2)。

electrical.pvanalyze.estimate_rs_tangent_point(V, I)
概要:

I-V曲線から直列抵抗(Rs)を推定するための接点と抵抗値を計算します。

詳細説明:

順方向バイアス領域でdI/dVが最大となる点を特定し、その点での接線からRsを計算します。

引数:
param V:

電圧データ (V)。

type V:

numpy.ndarray

param I:

電流データ (A)。

type I:

numpy.ndarray

戻り値:
returns:

直列抵抗推定に関する情報を含む辞書。

rtype:

dict - v_rep (float): 接点電圧 (V)。 - i_rep (float): 接点電流 (A)。 - Is (float): 接点電流 (A) (互換性のため)。 - Rs (float): 推定された直列抵抗 (Ω)。 - slope (float): 接線の傾き (A/V)。 - intercept (float): 接線のY切片 (A)。 - xx (numpy.ndarray): 接線フィッティングに使用されたXデータ。 - yy (numpy.ndarray): 接線フィッティングに使用されたYデータ。 - idx (int): 接点のインデックス。

electrical.pvanalyze.estimate_rsh_tangent_point(V, I)
概要:

I-V曲線から並列抵抗(Rsh)を推定するための接点と抵抗値を計算します。

詳細説明:

逆方向バイアス領域でdI/dVが最小となる点(絶対値)を特定し、 その点での接線からRshを計算します。

引数:
param V:

電圧データ (V)。

type V:

numpy.ndarray

param I:

電流データ (A)。

type I:

numpy.ndarray

戻り値:
returns:

並列抵抗推定に関する情報を含む辞書。

rtype:

dict - v_rep (float): 接点電圧 (V)。 - i_rep (float): 接点電流 (A)。 - Ish (float): 接点電流 (A) (互換性のため)。 - Rsh (float): 推定された並列抵抗 (Ω)。 - slope (float): 接線の傾きの絶対値 (A/V)。 - intercept (float): 接線のY切片 (A)。 - slope_fit_raw (float): フィットされた直線の元の傾き (A/V)。 - intercept_fit_raw (float): フィットされた直線の元のY切片 (A)。 - xx (numpy.ndarray): 接線フィッティングに使用されたXデータ。 - yy (numpy.ndarray): 接線フィッティングに使用されたYデータ。 - idx (int): 接点のインデックス。

electrical.pvanalyze.exec_alpha(args)
概要:

alphaまたはmake_alphaモードでプログラムを実行するメイン関数。

詳細説明:

光学スペクトルファイル(RとT)を読み込み、吸収率と吸収係数を計算し、 結果をプロットしてExcelファイルに保存します。

引数:
param args:

コマンドライン引数。

type args:

argparse.Namespace

戻り値:

なし

electrical.pvanalyze.exec_analyze(args)
概要:

analyzeモードでプログラムを実行するメイン関数。

詳細説明:

暗電流および光照射I-Vファイルを読み込み、初期パラメータと光起電力性能指標を推定し、 量子効率を計算します。光学データが利用可能な場合はそれも考慮に入れます。 結果を標準出力に表示し、比較プロットを作成します。

引数:
param args:

コマンドライン引数。

type args:

argparse.Namespace

戻り値:

なし

electrical.pvanalyze.fit_local_line(x, y, center_idx, npts=7)
概要:

指定された中心インデックスの周囲のデータポイントを用いて局所的な線形フィッティングを行います。

引数:
param x:

X軸データ。

type x:

numpy.ndarray

param y:

Y軸データ。

type y:

numpy.ndarray

param center_idx:

フィッティングの中心となるデータポイントのインデックス。

type center_idx:

int

param npts:

フィッティングに使用するデータポイント数。

type npts:

int

戻り値:
returns:

フィットされた直線の傾き、Y切片、フィッティングに使用されたXデータ、 Yデータ、開始インデックス、終了インデックス(排他的)のタプル。

rtype:

tuple[float, float, numpy.ndarray, numpy.ndarray, int, int]

electrical.pvanalyze.initialize()
概要:

コマンドライン引数を解析し、プログラムの初期設定を行います。

詳細説明:

argparseモジュールを使用して、実行モード、ファイルパス、温度、膜厚などの パラメータを定義し、ユーザー入力から値をパースします。

引数:

なし

戻り値:
returns:

解析された引数オブジェクトと引数パーサーオブジェクトのタプル。

rtype:

tuple[argparse.Namespace, argparse.ArgumentParser]

electrical.pvanalyze.interpolate_to_common_wavelength(wl_ref, y_ref, wl_target)
概要:

参照波長スケール上のデータをターゲット波長スケールに線形補間します。

引数:
param wl_ref:

参照波長データ (nm)。

type wl_ref:

numpy.ndarray

param y_ref:

参照Y軸データ。

type y_ref:

numpy.ndarray

param wl_target:

補間対象のターゲット波長データ (nm)。

type wl_target:

numpy.ndarray

戻り値:
returns:

ターゲット波長スケールに補間されたY軸データ。

rtype:

numpy.ndarray

electrical.pvanalyze.local_poly_value(x, y, x0, npts=7, order=3)
概要:

指定されたX座標の周囲のデータポイントを使用して、局所的な多項式フィッティングを行い、 x0におけるY値を推定します。

引数:
param x:

X軸データ。

type x:

numpy.ndarray

param y:

Y軸データ。

type y:

numpy.ndarray

param x0:

Y値を推定するX座標。

type x0:

float

param npts:

フィッティングに使用するデータポイント数。

type npts:

int

param order:

多項式フィッティングの次数。

type order:

int

戻り値:
returns:

x0における推定されたY値。

rtype:

float

electrical.pvanalyze.main()
概要:

プログラムのエントリーポイント。

詳細説明:

コマンドライン引数を初期化し、指定されたモードに基づいて 対応する実行関数を呼び出します。 実行ログは自動的にファイルにリダイレクトされます。

引数:

なし

戻り値:

なし

electrical.pvanalyze.plot_alpha(optical, outfile=None, pause=False)
概要:

吸収係数スペクトル(α vs フォトンエネルギー)をプロットします。

引数:
param optical:

analyze_optical関数から返された光学データ辞書。

type optical:

dict

param outfile:

プロットを保存するファイルパス。Noneの場合、画面に表示します。

type outfile:

str or None

param pause:

プロットを閉じるまで一時停止するかどうか。Trueの場合、plt.show()を呼び出します。

type pause:

bool

戻り値:
returns:

作成されたMatplotlib Figureオブジェクト。

rtype:

matplotlib.figure.Figure

electrical.pvanalyze.plot_iv_comparison(dark_sweeps, light_sweeps, S, light_metrics, dark_params=None, light_params=None, outfile=None, T=300.0, pause=False)
概要:

暗電流I-Vおよび光照射I-Vデータと、関連する推定値や解析結果を比較プロットします。

詳細説明:

以下の4つのサブプロットを作成します。 - log(abs(I))-V曲線(暗電流と光電流)。 - 線形J-V曲線(順方向と逆方向)。RsとRshの接線、Ish(0)点を表示。 - ndiode-V曲線と代表点。 - 光起電力出力(-J vs V)。MPP, Voc, Jsc点を表示。

引数:
param dark_sweeps:

暗電流測定のI-Vスイープデータのリスト。

type dark_sweeps:

list[tuple[numpy.ndarray, numpy.ndarray]]

param light_sweeps:

光照射測定のI-Vスイープデータのリスト。

type light_sweeps:

list[tuple[numpy.ndarray, numpy.ndarray]]

param S:

デバイスの面積 (cm^2)。

type S:

float

param light_metrics:

光照射下のI-Vデータから計算された光起電力性能指標。

type light_metrics:

dict

param dark_params:

暗電流I-Vデータから推定された初期パラメータ。Rs/Rshの接線表示に使用。

type dark_params:

dict or None

param light_params:

光照射I-Vデータから推定された初期パラメータ。I0/IPVの表示に使用。

type light_params:

dict or None

param outfile:

プロットを保存するファイルパス。Noneの場合、画面に表示します。

type outfile:

str or None

param T:

温度 (K)。ndiode曲線の計算に使用。

type T:

float

param pause:

プロットを閉じるまで一時停止するかどうか。Trueの場合、plt.show()を呼び出します。

type pause:

bool

戻り値:
returns:

作成されたMatplotlib Figureオブジェクト。

rtype:

matplotlib.figure.Figure

electrical.pvanalyze.print_args_and_derived(args, E_use=None, P0_use=None)
概要:

解析されたコマンドライン引数と派生値を標準出力に表示します。

引数:
param args:

解析された引数オブジェクト。

type args:

argparse.Namespace

param E_use:

使用されるフォトンエネルギー (eV)。

type E_use:

float or None

param P0_use:

使用される入射光パワー密度 (W/cm^2)。

type P0_use:

float or None

戻り値:

なし

electrical.pvanalyze.pv_metrics_from_iv(V, I, S)
概要:

I-Vデータから太陽電池の主要な性能指標(Voc, Jsc, FF, Pmaxなど)を計算します。

引数:
param V:

電圧データ (V)。

type V:

numpy.ndarray

param I:

電流データ (A)。

type I:

numpy.ndarray

param S:

電極面積 (cm^2)。

type S:

float

戻り値:
returns:

以下の主要な太陽電池性能指標を含む辞書。

rtype:

dict - Voc_V (float): 開放電圧 (V)。 - Jsc_A_cm2 (float): 短絡電流密度 (A/cm^2)。 - Jsc_mA_cm2 (float): 短絡電流密度 (mA/cm^2)。 - Vop_V (float): 最大出力動作電圧 (V)。 - Jop_A_cm2 (float): 最大出力動作電流密度 (A/cm^2)。 - Jop_mA_cm2 (float): 最大出力動作電流密度 (mA/cm^2)。 - Pmax_W_cm2 (float): 最大出力電力密度 (W/cm^2)。 - Pmax_mW_cm2 (float): 最大出力電力密度 (mW/cm^2)。 - FF (float): 曲線因子。

electrical.pvanalyze.quantum_efficiencies(F0, A_abs, JPV_A_cm2, Jsc_A_cm2)
概要:

量子効率(EQEとIQE)を計算します。

詳細説明:

入射フォトンフラックス、吸収率、光電流(JPV)、短絡電流密度(Jsc)に基づいて、 生成効率と収集効率を評価します。

引数:
param F0:

入射フォトンフラックス (cm^-2 s^-1)。Noneまたは0の場合はNaNを返します。

type F0:

float or None

param A_abs:

特定のエネルギーにおける吸収率。NoneまたはNaNの場合はIQEをNaNとします。

type A_abs:

float or None

param JPV_A_cm2:

光電流密度 (A/cm^2)。

type JPV_A_cm2:

float

param Jsc_A_cm2:

短絡電流密度 (A/cm^2)。

type Jsc_A_cm2:

float

戻り値:
returns:

計算された量子効率を含む辞書。

rtype:

dict - EQE_gen (float): 生成外部量子効率。 - IQE_gen (float): 生成内部量子効率。 - EQE (float): 外部量子効率。 - IQE (float): 内部量子効率。

electrical.pvanalyze.read_alpha_from_excel(infile)
概要:

Excelファイルから吸収スペクトル(alpha)データを読み込みます。

詳細説明:

save_alpha_to_excel関数によって保存された形式のExcelファイルを想定しています。 alpha_spectrumシートから波長、R、Tr、A、alphaのデータを抽出します。

引数:
param infile:

読み込むExcelファイルのパス。

type infile:

str

戻り値:
returns:

波長、反射率、透過率、吸収率、吸収係数を含む辞書。

rtype:

dict

例外:
raises ValueError:

指定されたExcelファイルに'alpha_spectrum'シートが見つからない場合。

raises ValueError:

ファイルから数値の吸収スペクトルデータが見つからない場合。

electrical.pvanalyze.read_data(infile, xmin=None, xmax=None, ndataskip=0)
概要:

指定されたCSVファイルからI-Vデータを読み込みます。

詳細説明:

ファイル内のメタデータ(記録時間、データ名)を抽出し、電圧と電流のデータポイントをパースします。 複数のスイープを検出し、それぞれをリストに分割します。

引数:
param infile:

読み込むCSVファイルのパス。

type infile:

str

param xmin:

X軸(電圧)の最小値。これより小さい値はスキップされます。

type xmin:

float or None

param xmax:

X軸(電圧)の最大値。これより大きい値はスキップされます。

type xmax:

float or None

param ndataskip:

データポイントをスキップする間隔。0の場合、スキップしません。

type ndataskip:

int

戻り値:
returns:

各スイープのX軸(電圧)データのリスト、各スイープのY軸(電流)データのリスト、ファイルから抽出されたメタデータのタプル。

rtype:

tuple[list[numpy.ndarray], list[numpy.ndarray], dict]

例外:
raises ValueError:

ファイルから有効なI-Vデータが見つからない場合。

electrical.pvanalyze.read_optical_spectrum(infile)
概要:

指定されたテキストファイルから光学スペクトルデータ(反射率Rまたは透過率T)を読み込みます。

詳細説明:

ファイル内のタブ区切りまたはスペース区切りのデータをパースし、 波長とスペクトル値のペアを抽出します。 重複する波長を処理し、波長順にソートします。

引数:
param infile:

読み込む光学スペクトルファイルのパス。

type infile:

str

戻り値:
returns:

波長 (nm)のnumpy.ndarray、スペクトル値 (RまたはTのパーセンテージ)のnumpy.ndarray、 ファイルから抽出されたメタデータを含む辞書のタプル。

rtype:

tuple[numpy.ndarray, numpy.ndarray, dict]

例外:
raises RuntimeError:

ファイルの読み込みに失敗した場合。

raises ValueError:

ファイルから数値のスペクトルデータが見つからない場合。

electrical.pvanalyze.save_alpha_to_excel(optical, outfile_xlsx, meta=None)
概要:

吸収スペクトルデータをExcelファイルに保存します。

詳細説明:

alpha_spectrumというシートにフォトンエネルギー、波長、R、Tr、A、alphaのデータを書き込みます。 summaryシートには膜厚やファイル名、平均値などのメタデータを保存します。

引数:
param optical:

analyze_optical関数から返された光学データ辞書。

type optical:

dict

param outfile_xlsx:

保存するExcelファイルのパス。

type outfile_xlsx:

str

param meta:

保存する追加のメタデータ。

type meta:

dict or None

戻り値:

なし

electrical.pvanalyze.smooth_polyfit(y, window_points=5, poly_order=3)
概要:

多項式フィッティングを用いたSavitzky-Golay風の平滑化をデータに適用します。

詳細説明:

各データポイントを中心に指定されたウィンドウ内のデータに対して多項式フィッティングを行い、 中心点の値を予測することで平滑化を行います。

引数:
param y:

平滑化するY軸データ。

type y:

numpy.ndarray

param window_points:

フィッティングに使用するウィンドウ内のデータポイント数。奇数である必要があります。

type window_points:

int

param poly_order:

多項式フィッティングの次数。

type poly_order:

int

戻り値:
returns:

平滑化されたY軸データ。

rtype:

numpy.ndarray

electrical.pvanalyze.zero_crossing_x(x, y)
概要:

Y値がゼロを横切るX座標を線形補間によって見つけます。

詳細説明:

2つの連続するデータポイントの間でY値の符号が変わる点、 またはY値が最もゼロに近い点のX座標を返します。

引数:
param x:

X軸データ。

type x:

numpy.ndarray

param y:

Y軸データ。

type y:

numpy.ndarray

戻り値:
returns:

Y値がゼロを横切るX座標。

rtype:

float