HITRANから吸収スペクトルを計算

Python

はじめに

HITRANは、high-resolution transmission molecular absorption databaseの頭文字をとったもの。大気中の光の透過や吸収をシミュレーションするために使用する分光学的パラメータをまとめたものです。以下HITRANから

HITRAN is an acronym forhigh-resolutiontransmission molecular absorption database. HITRAN is a compilation of spectroscopic parameters that a variety of computer codes use to predict and simulate the transmission and emission of light in the atmosphere.

今回はこのHITRANを用いて、大気下における水の吸収スペクトルを計算を行ったのでそれをまとめます。また、今回はデータから値を求めたがhapi.pyを用いて簡単に求めることもできるのでこちらのサイトで解説が行われています。

内容としては基本的な内容であり、専門的なものではないのでご容赦ください。

また、データ解析はPythonを用いて行いました。

 

HITRAN上でのデータの取得

分子振動のよるスペクトルデータをHITRANで求めたいのであればDateAccess>>Line by line searchから求めている分子を選択して進めていけばいいです。調べたい波数の選択後、データの選択ができます。

データの詳しい解説は公式のDefinitions and Unitsにて、確認できるので今回は簡単な解説でとどめておきます。

  • Sij…iからjへの遷移の吸収/発光強度(ここではドップラーなどによるスペクトル広がりは考えられていない)
  • Aij…iからjへのアインシュタインのA係数
  • νair…空気拡散の半値半幅(HWHM)
  • νself…自己拡散(ドップラー広がり)の半値半幅(HWHM)
  • E”…下準位のエネルギー
  • nair…空気拡散の半値幅の温度依存性の係数
  • δair…空気拡散の半値幅の圧力依存性の係数
  • g’,g”…下準位、上準位の統計的重み

この中で広がりを考えない場合でまずはデータを選択します。

この画面のCreate New Output Formatを選択し、

Available Parameterから波数νと吸収発光強度のSを選択し、Save and Retrun to Date Searchを選択します。このときpythonでデータ整理するためにField separatorに[comma]を選択しています。(ほかの区分けでもデータ整理はもちろん行えます)このあとStart Date Srarchをクリックすると下記のように実際にデータが描写されます。

ここでOutput transitions dateのview in browserを選択すると

以上のようにデータが見れます。データの意味は一番左から波数ν、吸収発光強度S、参考文献…と並んでいます。

これを適当なテキストファイル(今回はH2O.txtという名前で保存しました)で保存します。

データの描写

データの描写自体はそこまで難しくありません。

import matplotlib.pyplot as plt
​
#フォント
plt.rcParams['font.family'] = 'Times New Roman' #フォント一括
plt.rcParams["font.size"] = 20
plt.rcParams['ytick.direction'] = 'in'
plt.rcParams['xtick.direction'] = 'in'
plt.rcParams["xtick.top"] = True # 上部に目盛り線を描くかどうか
plt.rcParams["ytick.right"] = True # 右部に目盛り線を描くかどうか

f = open("H2O.txt")
datalist = f.readlines()

​nu = []
S = []

for parameter in datalist:
    para = parameter.split(",")
    nu.append(float(para[0]))
    S.append(float(para[1]))

plt.plot(nu,S)
plt.xlabel("Wavenumber (cm-1)")
plt.ylabel("Absorption Cross Section")

以上で画像がプロットされます。

ちょっとしたメモ

このあと個人的にローレンツ広がり(通常の実験室環境はドップラー広がりのみの考慮でいいらしい by HITRAN)を含めて計算したので、そのコードだけ書いておきます。

本当はhapi.pyでやったほうが正確な解析はできますが、自分の勉強も兼ねて行いました。

プログラム思想はある一定の値以上のみ(愚直に全部足し合わせると計算量がO(n^2)となるので1000以上のデータ数から重くなる)でローレンツ関数を適用させて全部足し合わせるといったものです。logスケールで見るときなどはあまり正確ではないのでメモ書きです。(使用目的には線形グラフで十分だったので)

このとき所得したデータは次のようになっています。

コードは次のようになっています。

import math
import matplotlib.pyplot as plt
import numpy as np
​
#フォント
plt.rcParams['font.family'] = 'Times New Roman' #フォント一括
plt.rcParams["font.size"] = 20
plt.rcParams['ytick.direction'] = 'in'
plt.rcParams['xtick.direction'] = 'in'
plt.rcParams["xtick.top"] = True # 上部に目盛り線を描くかどうか
plt.rcParams["ytick.right"] = True # 右部に目盛り線を描くかどうか
​
​#wavenumber to wavelength
def wn_wl(x):
    return 1/x*10**7
​
#lolentz spread
def lorentz(loc):
    lolentz = []
    for i in range(len(nu)):
        fl = 1/np.pi*ga[loc]/(ga[loc]**2+(nu[i]-nu[loc]-da[loc])**2)
        lolentz.append(fl*S[i])
    return lolentz
​
#sum list
def sumlis(lis1,lis2):
    lis = []
    for i in range(len(lis1)):
        lis.append(lis1[i]+lis2[i])
    return lis
​
f = open("lorentz.txt")
datalist = f.readlines()
​
datalist = datalist[1::]
nu = []
S = []
ga = []
da = []
​
for parameter in datalist:
    para = parameter.split(",")
    nu.append(float(para[0]))
    S.append(float(para[1]))
    ga.append(float(para[2]))
    da.append(float(para[3]))
​
#plt.plot(nu,S)
Sma = max(S)
nuij_loc = []
​
for i in range(len(nu)):
    if S[i] > 0.05*10**-21:
        nuij_loc.append(i)
​
abso = [0 for i in range(len(nu))]
​
for i in nuij_loc:
    abso = sumlis(abso,lorentz(i))
​
absoma = max(abso)
abso2 = [i*Sma/absoma for i in abso]
wave = [wn_wl(i) for i in nu]
​
plt.plot(wave,abso2)
print(wave[-1])
plt.xlim(wave[-1],2500)
plt.ylim(0)
plt.xlabel("Wavelength (nm)")
plt.ylabel("absorption")
plt.show()

コメント

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