hapiを使ったHITRANデータベースによる水の吸収スペクトル

Python

はじめに

以前の記事でHITRANの使い方を説明したが、当時はproxyを通さなきゃいけなかったのでいちいちraw dataをダウンロードして解析を行っていた。あちらのやり方のほうが実際のデータが見れてわかりやすいですが、hapiを使ったほうがよりほしいデータに近づくので改めて記事を書き直すことにしました。

本編

最初の使い方

hapiをDLします。以下ipynbで実行する場合

!pip install hitran-api

command promptで実行する場合

pip install hitran-api

ここで基本のmoduleは以下の様にinstallを改めてしておく

import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
from hapi import *

本編のコードは以下の様に書ける。

db_begin()

start_wavenumber = 5000 #λ=2000nm
end_wavenumber = 25000 #λ=400nm

#data load
fetch("H2O",1,1,start_wavenumber,end_wavenumber)

#空気中に圧力比1.88%(=a)存在するとき
#1.88%は25degC,湿度60%
a = 1902 / 101325

H2O_components = [(1,1,a)]
axis_hitran, value_hitran = absorptionCoefficient_Voigt(H2O_components,"H2O",OmegaStep=0.01,HITRAN_units=False,GammaL='gamma_self',Environment={'p':1,'T':296.})
#l's unit is cm
x,y = transmittanceSpectrum(axis_hitran, value_hitran, Environment={'l': 500.0})

def nu2lambda(nu):
    lam = 10**7/nu
    return lam

plt.plot(nu2lambda(x),y)
plt.xlabel("wavelength(nm)")
plt.ylabel("Transmittance (/5m)@25degC,60%")
plt.show()

このコードは25degC,湿度60%,距離5mにおける透過率を表している。
初めからコードを解説すると
db.begin()…データを保存するためのdirectoryを指定している。
ここで何も指定していないので今回は以下の様に実行ファイルと同directoryにファイルが保存される。

fecth()…データをDLする。このとき波長ではなく波数で取得する必要がある。
ちなみに一回fecth()した後はlocalに保存されるので追加で行う必要はない。

a…空気中の圧力比でガスがどの程度あるかを計算。今回は以下のサイトを参考にした
化学(理想気体と実在気体)|技術情報館「SEKIGIN」|気体の状態方程式などの前提となっている理想化された気体と実際の気体との違いを紹介

components…[(M,I,D)]を指定。 Mは分子番号、Iは同位体番号、Dは成分の存在量。分子番号等はHITRANに設定されているのでHITRANのこちらとにらめっこしながら記入してください。

absorptionCoefficient_Voigt…吸収係数を求める。ここでVoigtはvoigt関数広がりでほかにも
> absorptionCoefficient_HT -> absorptionCoefficient_Voigt -> absorptionCoefficient_Lorentz -> absorptionCoefficient_Doppler -> absorptionCoefficient_SDVoigtがサポートされている。

x,y = transmittanceSpectrum(axis_hitran, value_hitran, Environment={‘l’: 500.0})…最後に得た吸収係数から実際の透過率に計算しなおす。

実測データとの比較

db_begin()

start_wavenumber = 5000 #λ=2000nm
end_wavenumber = 25000 #λ=400nm

#data load
fetch("H2O",1,1,start_wavenumber,end_wavenumber)

#空気中に圧力比1.88%(=a)存在するとき
#1.88%は25degC,湿度60%
a = 1902 / 101325

H2O_components = [(1,1,a*11.7/13.8)]
axis_hitran, value_hitran = absorptionCoefficient_Voigt(H2O_components,"H2O",OmegaStep=0.01,HITRAN_units=False,GammaL='gamma_self',Environment={'p':1,'T':296.})
#l's unit is cm
x,y = absorptionSpectrum(axis_hitran, value_hitran, Environment={'l': 16.8})

def nu2lambda(nu):
    lam = 10**7/nu
    return lam

plt.plot(nu2lambda(x),y)
plt.xlabel("wavelength(nm)")
plt.ylabel("Transmittance (/16.8mm)@25degC,60%")
plt.xlim(1300,2000)
plt.show()

上記のコードを実行すると16.8mmの透過率がわかる。実際の論文にある値と比較しても近い値になることがわかる。(Near-infrared imaging of water vapour in air – IOPscience)

コメント

タイトルとURLをコピーしました