1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

HITRANデータベースのAPIであるHAPIを使用した放射スペクトルの計算

Last updated at Posted at 2022-03-11

HAPIとは

HITRANonline: HAPI
HITRANという大気中の光の透過と放射をシミュレーションに必要な分光学的パラメータのデータベースを取り扱うためのAPIです.Pythonで記述されているスクリプトをダウンロードもしくはpipでインストールすることによりローカル環境で使用することができます.
HAPIの主な機能は以下の通りです.

  1. line-by-lineデータをオンラインのHITRANデータベースからダウンロード
  2. 圧力,温度,光学的な経路の長さを考慮した高分解能のスペクトルのシミュレーション
  3. 実験装置の分解能を考慮したスペクトルへの補正

以下の種類のスペクトルについて計算可能です.

  1. 吸収係数
  2. 吸収スペクトル
  3. 遷移スペクトル
  4. 放射スペクトル

@alphya さんにより吸収係数の計算についての記事を書かれています.この記事では,HAPIを用いて放射スペクトルの計算および実験データの再現についてまとめます.

データのダウンロード

HAPIの公式サイトのリンクより,Pythonスクリプトをダウンロードして,計算を実行するフォルダに置いておきます.スクリプトを実行できる環境で以下のコードでinportします.コードではついでに以下で使用するモジュールをinportしています.

from hapi import *

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

以下のコードでHITRANからデータを取得します.詳細はHAPIのマニュアルを参考にしていただくことにして,今回は水のデータを取得しています.fetchの4番目と3番目の引数は取得するデータの波数の範囲を指定しています.今回は200 nmから1000 nmまでの波長のスペクトルのデータを取得したいので,10000 cm-1から50000 cm-1の波数の範囲を与えています.

db_begin('data')
fetch('H2O', 1, 1, 10000, 50000)

放射スペクトルの計算

以下のabsorptionCoefficient_Lorentzで吸収係数の計算を行い,その計算結果をもとにradianceSpectrumで放射スペクトルの計算を行っています.radianceSpectrumではパラメーターとして温度と光路の長さを与えることができます.nuが波数,coefが吸収係数,radiが放射スペクトルのndarrayを返しています.

nu, coef = absorptionCoefficient_Lorentz(SourceTables='H2O', HITRAN_units=False)
nu, radi = radianceSpectrum(nu, coef, Environment={'T': 1500.0, 'l': 100.0})
plt.plot(nu, radi)

プロットされた結果は以下の通りです.波数の小さい=波長の長い光ほど高い強度で発行していることがわかります.

radi_nu.png

波長への変換

得られた結果は波数[cm-1]に対するスペクトルのデータであるので,これを波長[nm]に対するデータに変換します.

wave_length = np.divide(1.0, nu*1e2)*1e9
plt.plot(wave_length, radi)

以下のプロットより,高い波長になるほど発光強度が増加している確からしい結果が得られました.

radi_wave_length.png

実験結果への合わせこみ

分光器などを用いた実験結果との比較を行う際には,装置の分解能を考慮する必要があります.HAPIではconvolveSpectrumという関数を用いてこれを行う事が出来ます.詳しいオプションについてはHAPIのマニュアルを確認してみてください.ここではスリットファンクションにガウシアンを,分解能を0.5として設定しています.注意点としては,convovleSpectrumを行うと波数nuのサンプルが引数に与えたものから変化するので,wave_lengthもそれをもとにもう一度変換する必要があります.

nu_, radi_, i1, i2, slit = convolveSpectrum(nu, radi, SlitFunction=SLIT_GAUSSIAN, Resolution=0.5)
wave_length_ = np.divide(1.0, nu_*1e2)*1e9
plt.plot(wave_length_, radi_, label='convolved')

以下が実行後のプロットですが,ピークの現れ方が変化したことがわかります.ここからは自分の実験データと見比べながら各パラメータを合わせこんでみてください.

radi_wave_length_convovled.png

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?