pvanalyze プログラム仕様

PV特性評価ツール pvanalyze.py 技術ドキュメント

PV特性評価ツール

mode=alpha

反射率/透過率ファイルと膜厚から吸収スペクトルを計算し、 プロットとExcel保存を行います。

mode=analyze

I-Vデータからパラメータ推定、発電特性解析、量子効率計算、プロットを行います。

pvanalyze.absorptance_from_alpha(alpha_cm, d_nm)[ソース]

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

詳細説明:

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

パラメータ:
  • alpha_cm -- (float or None): 吸収係数 (cm^-1)。

  • d_nm -- (float): PV層の膜厚 (nm)。

戻り値:

float: 計算された吸収率。

pvanalyze.alpha_at_energy(optical, E_eV)[ソース]

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

パラメータ:
  • optical -- (dict or None): `analyze_optical`または`read_alpha_from_excel`から返された光学データ辞書。

  • E_eV -- (float): 取得したいフォトンエネルギー (eV)。

戻り値:

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

pvanalyze.analyze_optical(wl_R_nm, R_percent, wl_T_nm, T_percent, d_nm)[ソース]

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

詳細説明:

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

パラメータ:
  • wl_R_nm -- (numpy.ndarray): 反射率スペクトルの波長データ (nm)。

  • R_percent -- (numpy.ndarray): 反射率データ (%)。

  • wl_T_nm -- (numpy.ndarray): 透過率スペクトルの波長データ (nm)。

  • T_percent -- (numpy.ndarray): 透過率データ (%)。

  • d_nm -- (float): PV層の膜厚 (nm)。

戻り値:

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)。

pvanalyze.choose_sweep(xs_list, ys_list, sweep_index=0)[ソース]

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

パラメータ:
  • xs_list -- (list[numpy.ndarray]): 各スイープのX軸(電圧)データのリスト。

  • ys_list -- (list[numpy.ndarray]): 各スイープのY軸(電流)データのリスト。

  • sweep_index -- (int, optional): 選択するスイープのインデックス。デフォルトは0。

戻り値:

x (numpy.ndarray): 選択されたスイープのX軸データ。 y (numpy.ndarray): 選択されたスイープのY軸データ。

pvanalyze.compute_p0(F0, P0, E_eV, lambda_nm)[ソース]

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

詳細説明:

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

パラメータ:
  • F0 -- (float or None): 入射フォトンフラックス (cm^-2 s^-1)。Noneの場合はP0を使用。

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

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

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

戻り値:

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

pvanalyze.compute_photon_energy_eV(E_eV, lambda_nm)[ソース]

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

詳細説明:

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

パラメータ:
  • E_eV -- (float): フォトンエネルギー (eV)。0より大きい場合はこれを使用。

  • lambda_nm -- (float): フォトン波長 (nm)。`E_eV`が0の場合にこれを使用。

戻り値:

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

pvanalyze.consolidate_duplicate_x(x, y)[ソース]

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

パラメータ:
  • x -- (numpy.ndarray): X軸データ。

  • y -- (numpy.ndarray): Y軸データ。

戻り値:

ux (numpy.ndarray): 重複が解消されたX軸データ。 uy (numpy.ndarray): 重複が解消され、平均化されたY軸データ。

pvanalyze.dual_print(*args, **kwargs)[ソース]
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`などの補助関数を用いて、 各パラメータの初期値を経験的に決定します。

パラメータ:
  • V -- (numpy.ndarray): 電圧データ (V)。

  • I_meas -- (numpy.ndarray): 測定電流データ (A)。

  • T -- (float, optional): 温度 (K)。デフォルトは300.0。

戻り値:

dict: 推定された初期パラメータ。
  • "I0" (float): 逆方向飽和電流 (A)。

  • "ndiode" (float): ダイオード因子。

  • "IPV" (float): 光電流 (A)。

  • "Rs" (float): 直列抵抗 (Ω)。

  • "Rsh" (float): 並列抵抗 (Ω)。

  • "Ish" (float): 並列抵抗に流れる電流 (A)。

  • "Vsh" (float): Rsh推定における代表点電圧 (V)。

  • "Vnd" (float): ndiode推定における代表点電圧 (V)。

pvanalyze.estimate_ndiode_curve(V, I, T=300.0)[ソース]

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

詳細説明:

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

パラメータ:
  • V -- (numpy.ndarray): 電圧データ (V)。

  • I -- (numpy.ndarray): 電流データ (A)。

  • T -- (float, optional): 温度 (K)。デフォルトは300.0。

戻り値:

Vn (numpy.ndarray): ダイオード因子が計算された電圧データ。 nn (numpy.ndarray): 各電圧に対応する推定されたダイオード因子。

pvanalyze.estimate_ndiode_representative_point(V, I, T=300.0, Ish=None)[ソース]

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

詳細説明:

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

パラメータ:
  • V -- (numpy.ndarray): 電圧データ (V)。

  • I -- (numpy.ndarray): 電流データ (A)。

  • T -- (float, optional): 温度 (K)。デフォルトは300.0。

  • Ish -- (float, optional): 並列抵抗に流れる電流の推定値。これを考慮してIを調整します。デフォルトはNone。

戻り値:

dict or None: ダイオード因子推定に関する情報。計算できなかった場合はNone。
  • "v_rep" (float): 代表点電圧 (V)。

  • "ndiode" (float): 推定されたダイオード因子。

  • "slope_logI" (float): 代表点でのlog(I)の傾き (1/V)。

  • "curvature_logI" (float): 代表点でのlog(I)の二階微分 (1/V^2)。

pvanalyze.estimate_rs_tangent_point(V, I)[ソース]

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

詳細説明:

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

パラメータ:
  • V -- (numpy.ndarray): 電圧データ (V)。

  • I -- (numpy.ndarray): 電流データ (A)。

戻り値:

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): 接点のインデックス。

pvanalyze.estimate_rsh_tangent_point(V, I)[ソース]

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

詳細説明:

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

パラメータ:
  • V -- (numpy.ndarray): 電圧データ (V)。

  • I -- (numpy.ndarray): 電流データ (A)。

戻り値:

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): 接点のインデックス。

pvanalyze.exec_alpha(args)[ソース]

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

詳細説明:

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

パラメータ:

args -- (argparse.Namespace): コマンドライン引数。

戻り値:

なし

pvanalyze.exec_analyze(args)[ソース]

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

詳細説明:

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

パラメータ:

args -- (argparse.Namespace): コマンドライン引数。

戻り値:

なし

pvanalyze.fit_local_line(x, y, center_idx, npts=7)[ソース]

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

パラメータ:
  • x -- (numpy.ndarray): X軸データ。

  • y -- (numpy.ndarray): Y軸データ。

  • center_idx -- (int): フィッティングの中心となるデータポイントのインデックス。

  • npts -- (int, optional): フィッティングに使用するデータポイント数。デフォルトは7。

戻り値:

a (float): フィットされた直線の傾き。 b (float): フィットされた直線のY切片。 xx (numpy.ndarray): フィッティングに使用されたXデータ。 yy (numpy.ndarray): フィッティングに使用されたYデータ。 i0 (int): フィッティングに使用されたデータの開始インデックス。 i1 (int): フィッティングに使用されたデータの終了インデックス(排他的)。

pvanalyze.initialize()[ソース]

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

詳細説明:

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

戻り値:

args (argparse.Namespace): 解析された引数オブジェクト。 parser (argparse.ArgumentParser): 引数パーサーオブジェクト。

pvanalyze.interpolate_to_common_wavelength(wl_ref, y_ref, wl_target)[ソース]

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

パラメータ:
  • wl_ref -- (numpy.ndarray): 参照波長データ (nm)。

  • y_ref -- (numpy.ndarray): 参照Y軸データ。

  • wl_target -- (numpy.ndarray): 補間対象のターゲット波長データ (nm)。

戻り値:

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

pvanalyze.local_poly_value(x, y, x0, npts=7, order=3)[ソース]

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

パラメータ:
  • x -- (numpy.ndarray): X軸データ。

  • y -- (numpy.ndarray): Y軸データ。

  • x0 -- (float): Y値を推定するX座標。

  • npts -- (int, optional): フィッティングに使用するデータポイント数。デフォルトは7。

  • order -- (int, optional): 多項式フィッティングの次数。デフォルトは3。

戻り値:

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

pvanalyze.main()[ソース]

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

詳細説明:

コマンドライン引数を初期化し、指定されたモードに基づいて 対応する実行関数を呼び出します。

戻り値:

なし

pvanalyze.plot_alpha(optical, outfile=None, pause=False)[ソース]

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

パラメータ:
  • optical -- (dict): `analyze_optical`関数から返された光学データ辞書。

  • outfile -- (str, optional): プロットを保存するファイルパス。Noneの場合、画面に表示します。デフォルトはNone。

戻り値:

matplotlib.figure.Figure: 作成されたMatplotlib Figureオブジェクト。

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(|I|)-V曲線(暗電流と光電流)。 - 線形J-V曲線(順方向と逆方向)。RsとRshの接線、Ish(0)点を表示。 - ndiode-V曲線と代表点。 - 光起電力出力(-J vs V)。MPP, Voc, Jsc点を表示。

パラメータ:
  • dark_sweeps -- (list[tuple[numpy.ndarray, numpy.ndarray]]): 暗電流測定のI-Vスイープデータのリスト。

  • light_sweeps -- (list[tuple[numpy.ndarray, numpy.ndarray]]): 光照射測定のI-Vスイープデータのリスト。

  • S -- (float): デバイスの面積 (cm^2)。

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

  • dark_params -- (dict, optional): 暗電流I-Vデータから推定された初期パラメータ。Rs/Rshの接線表示に使用。デフォルトはNone。

  • light_params -- (dict, optional): 光照射I-Vデータから推定された初期パラメータ。I0/IPVの表示に使用。デフォルトはNone。

  • outfile -- (str, optional): プロットを保存するファイルパス。Noneの場合、画面に表示します。デフォルトはNone。

  • T -- (float, optional): 温度 (K)。ndiode曲線の計算に使用。デフォルトは300.0。

戻り値:

matplotlib.figure.Figure: 作成されたMatplotlib Figureオブジェクト。

pvanalyze.print_args_and_derived(args, E_use=None, P0_use=None)[ソース]

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

パラメータ:
  • args -- (argparse.Namespace): 解析された引数オブジェクト。

  • E_use -- (float): 使用されるフォトンエネルギー (eV)。

  • P0_use -- (float or None): 使用される入射光パワー密度 (W/cm^2)。

戻り値:

なし

pvanalyze.pv_metrics_from_iv(V, I, S)[ソース]

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

パラメータ:
  • V -- (numpy.ndarray): 電圧データ (V)。

  • I -- (numpy.ndarray): 電流データ (A)。

  • S -- (float): 電極面積 (cm^2)。

戻り値:

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): 曲線因子。

pvanalyze.quantum_efficiencies(F0, A_abs, JPV_A_cm2, Jsc_A_cm2)[ソース]

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

詳細説明:

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

パラメータ:
  • F0 -- (float or None): 入射フォトンフラックス (cm^-2 s^-1)。Noneまたは0の場合はNaNを返します。

  • A_abs -- (float or None): 特定のエネルギーにおける吸収率。NoneまたはNaNの場合はIQEをNaNとします。

  • JPV_A_cm2 -- (float): 光電流密度 (A/cm^2)。

  • Jsc_A_cm2 -- (float): 短絡電流密度 (A/cm^2)。

戻り値:

dict: 計算された量子効率。
  • "EQE_gen" (float): 生成外部量子効率。

  • "IQE_gen" (float): 生成内部量子効率。

  • "EQE" (float): 外部量子効率。

  • "IQE" (float): 内部量子効率。

pvanalyze.read_alpha_from_excel(infile)[ソース]

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

詳細説明:

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

パラメータ:

infile -- (str): 読み込むExcelファイルのパス。

戻り値:

dict: 波長、反射率、透過率、吸収率、吸収係数を含む辞書。
  • "wl_nm" (numpy.ndarray): 波長 (nm)。

  • "R" (numpy.ndarray): 反射率。

  • "Tr" (numpy.ndarray): 透過率。

  • "A" (numpy.ndarray): 吸収率。

  • "alpha_cm^-1" (numpy.ndarray): 吸収係数 (cm^-1)。

pvanalyze.read_data(infile, xmin=None, xmax=None, ndataskip=0)[ソース]

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

詳細説明:

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

パラメータ:
  • infile -- (str): 読み込むCSVファイルのパス。

  • xmin -- (float, optional): X軸(電圧)の最小値。これより小さい値はスキップされます。デフォルトはNone。

  • xmax -- (float, optional): X軸(電圧)の最大値。これより大きい値はスキップされます。デフォルトはNone。

  • ndataskip -- (int, optional): データポイントをスキップする間隔。0の場合、スキップしません。デフォルトは0。

戻り値:

xs_list (list[numpy.ndarray]): 各スイープのX軸(電圧)データのリスト。 ys_list (list[numpy.ndarray]): 各スイープのY軸(電流)データのリスト。 inf (dict): ファイルから抽出されたメタデータ。

pvanalyze.read_optical_spectrum(infile)[ソース]

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

詳細説明:

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

パラメータ:

infile -- (str): 読み込む光学スペクトルファイルのパス。

戻り値:

wl (numpy.ndarray): 波長 (nm)。 val (numpy.ndarray): スペクトル値 (RまたはTのパーセンテージ)。 info (dict): ファイルから抽出されたメタデータ(ファイル名、ラベル、Y軸単位など)。

pvanalyze.save_alpha_to_excel(optical, outfile_xlsx, meta=None)[ソース]

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

詳細説明:

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

パラメータ:
  • optical -- (dict): `analyze_optical`関数から返された光学データ辞書。

  • outfile_xlsx -- (str): 保存するExcelファイルのパス。

  • meta -- (dict, optional): 保存する追加のメタデータ。デフォルトはNone。

戻り値:

なし

pvanalyze.smooth_polyfit(y, window_points=5, poly_order=3)[ソース]

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

詳細説明:

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

パラメータ:
  • y -- (numpy.ndarray): 平滑化するY軸データ。

  • window_points -- (int, optional): フィッティングに使用するウィンドウ内のデータポイント数。奇数である必要があります。デフォルトは5。

  • poly_order -- (int, optional): 多項式フィッティングの次数。デフォルトは3。

戻り値:

ys (numpy.ndarray): 平滑化されたY軸データ。

pvanalyze.zero_crossing_x(x, y)[ソース]

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

詳細説明:

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

パラメータ:
  • x -- (numpy.ndarray): X軸データ。

  • y -- (numpy.ndarray): Y軸データ。

戻り値:

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