2016年3月29日火曜日

気象学における状態方程式


気象学の単位系は空気1kgが基本になっています

一方、高校化学(物理?)で習う理想気体の状態方程式は

PV=nRT

ですね。

R気体定数R:8.3144598(J/K/mol)です。
nモル個の理想気体粒子には圧力Pと体積Vと温度Tにはこのような関係があります

気象学では空気1kgの粒子を用いますのが状態方程式はどのような形になるのでしょう?
これを、考えてみたいと思います

気象でも乾燥空気は理想気体として取り扱っています
一般気象学をみますと(惑星の大気 P13)地表付近の大気組成は

  成分     分子量 存在比(%)
窒素    N2  28.01 78.088 
酸素    O2  32.00    20.949
アルゴン   Ar   39.94      0.93 
二酸化炭素    Co        2 44.01   0.03

分子量ですが、例えば窒素N2NA6.022140857×1023)個あると28.01gになるってことです。
NA 個の理想気体を1モル個=1モル の理想気体と言います。
1モルの窒素N2があると質量は28.01gになります。
4つの成分の存在比を足すと99.997%ですので100%としてよいでしょう。

表から空気1モル中に
N20.78088モル=21.8724488g
O220.949モル =6.70368g
Ar0.93モル     =0.371442g
Co2 0.03モル  =0.013203g

であることがわかります、「分子量×存在比=質量」ってことです。
乾燥空気1モルの質量は28.96gってところでしょうか?
これが、乾燥空気の平均分子量です。
一般気象学(P23)では高度80Kmまで28.964とされています
オゾン層の影響はないようですね?

さて本題です
Kg1000gの乾燥空気をXモルとすると・・
X= 1000g28.964g34.5256モル

気体の状態方程式は

PV=RT=34.5256×RT

となります
V34.5256モル(空気1kg)の体積って意味ですね
これを憶えておいて下さい

気象ではRRと書き直しPV=34.5256RT
R34.5256R34.5256× 8.3144598=287.06JK/kg

と再定義します(信じられませんが・・バカじゃない?)
すると
PVRT
になってしまいます ・; ・;

これではn=1モルの理想気体の状態方程式と区別できませんね

ところで、V34.5256モル(空気1kg)の体積って意味でした
ですからVαと書き
RT
として空気1kgの状態方程式を定義します
αは比容と言うみたいです・・・

なにか良いことがあるのでしょうか??
無い!
私には奇妙な方程式を定義して、その後は複雑怪奇な議論が進行しているとしか思えません。

例えば1モル当たりのN2とO2の定圧比熱cpや定積比熱cvは同じなのですが・・
当然1kg当たりのN2O2の定圧比熱Cpや定積比熱Cvの値は違います

温位を定義する時に重要な役割をするマイヤーの関係式があります
R=cpーcv
Rは8.3144598(J/K/mol)です。

熱力学を勉強してこの関係が納得できないと温位は納得できません。


確かに
A:空気1kgの
定圧比熱Cpや定積比熱Cv、ガス定数R=287.06JK/kg
でも
CpCvR
は成り立ちます。

B:窒素(N2)1kgでも
定圧比熱Cpや定積比熱Cv、ガス定数R

C:酸素(O2)1kgでも
定圧比熱Cpや定積比熱Cv、ガス定数R

CpCvR
は成り立ちます・・;

しかし
A:空気、B:窒素、C:酸素のCpの値はそれぞれ違い、CvRも違っています
それなのに
CpCvR
は成り立っているのです

理工系の学生サンなら、マイヤーの関係式を不思議に思うわけで
熱力学と気体分子運動論を勉強して納得します
しかし納得するのは
R=cpーcv
です
??cが小文字になっていますね・・
cp、cvは理想気体1モルの定圧、定積比熱です。
理想気体とみなせば窒素と酸素のcpとcvの値は同じ値になります

興味があれば
R=cpーcvが正しいとして、CpCvRを確かめてみて下さい。

雑感
リハビリで書いてみました。
C++で気象関数を書き始め
cp、cvの値を確かめようと「一般気象学」を開いて、
「ヤッパリひどいよなあ〜」と思いました。

大気に熱が加わり等温位(等エントロピー)になるのですが、ここで、何が起こるのか理解する人は少ないと思います。

「雲は上昇流が無いとデキない」は気象学の常識ですが、誰も確かめてはいません。

等エントロピーになれば、高さによらずe/Pは一定になるはずです。
eは水蒸気圧、Pは大気圧です。
eは温度依存性が高く、気温が低くければ相対湿度が100%になるのはたやすく想像できます。
気象は温位を使いながらエントロピーを何処かに置き忘れています。

Puを作ろうとする邪悪なゾンビが隠しているってところでしょうか?

**;
マイヤーの関係式を理解するには
気体分子運動論は必要なかったかも知れません。

付録

現代熱力学(イリヤ・プリゴジン 朝倉書店)P33

T=298.15K p=1atm

化合物          Cp(Jmol) Cv(Jmol)
理想気体単原子気体     (52)R   (32)R
理想気体2原子分子気体    (72)R   (52)R
N2(g)              29.12   20.74
O2(g)              29.36   20.95
CO2(g)              37.11   28.46
H2(g)                                                    28.82         20.44
H2O(g)                                                 75.29

(g)はガスをあらわすみたいです・・;

R:8.3144598(J/K/mol)を基準にすれば
(32)R12.4716897
(52)R=20.7861495
(72)R=29.1006093
(92)R=37.4150691

CO2の自由度は9のようですね
H2OCv値は記述されていませんでした
理想気体ではないってことなんでしょうね・・
理想気体に近かったらCO2に近い値になるはずです
昔、実験でPV=nRTの関係は確認されたそうですが・・;
実験する毎にR?の値が違ってしまったなんて話を読んだ記憶があります


空気を
N278.088
O220.949
から計算すると空気のcp、cvは
cp=29.17→理論値 29.10
cv20.78→理論値 20.79
理論値を採用すしても問題なさそうです
cp=29.10
cv=20.79
R=29.10−20.79=8.31

2015年8月26日水曜日

GMTで等高度線を描いてみました


なんとかubuntuGMTがインストールができた(ホントかな?)ので等高度線を描いてみることにしました
難しいことはわかりませんが、かえってGMTで予想図を描く手順がわかるかもしれません
わかる人が見れば、グチャグチャな手順なんだろうと思います
つまり グチャグチャなのは覚悟してください


GPVデータはターミナル(windowsDOS窓みたいなやつ)でwgrib2などを使って,データが切り出します

GPVデータのバイナリファイルは
Z__C_RJTD_20150824000000_GSM_GPV_Rgl_FD0000_grib2.bin
を使いました
2015824日00Zイニシャルみたいです


1.バイナリファイルからデータを得る

早崎先生の

によると


1.変数名,日付などの基本情報だけを知りたいとき
wgrib2 ifile.grb2
上記に加え,グリッド数,データの単位,データの範囲(最大・最小値など)を知りたいとき
wgrib2 -V ifile.grb2
さっそく端末(ターミナル)で打ってみる
$ wgrib2 Z__C_RJTD_20150824000000_GSM_GPV_Rgl_FD0000_grib2.bin
結果
1.1:0:d=2015082400:PRMSL:mean
sea level:anl:
1.2:0:d=2015082400:PRES:surface:anl:
1.3:0:d=2015082400:UGRD:10m above ground:anl:
1.4:0:d=2015082400:VGRD:10m above ground:anl:
1.5:0:d=2015082400:TMP:2m above ground:anl:
・・・・
・・・・
1.14:0:d=2015082400:TMP:1000mb:anl:
1.15:0:d=2015082400:VVEL:1000mb:anl:
再びwgrib2使用法によると
2.wgrib2 ifile.grb2 -match ":HGT:" -grib ofile.grb2
  ifile.grb2からジオポテンシャル高度だけ切り出して、GRIB-2形式でofile.grb2
に出力.
Z__C_RJTD_20150824000000_GSM_GPV_Rgl_FD0000_grib2.binはうっとうしいので
GPVファイルと書きます
端末で次のように打ち込むと
 $ wgrib2 GPVファイル -match":HGT:1000 mb:" -grib 1000HGT.grb2
 1000HGT.grb2ができました
さらに1000HGT.grb2の情報をみるため
$ wgrib2 -V 1000HGT.grb2
と入力した結果
1:0:vt=2015082400:1000mb:anl:HGT Geopotential Height [gpm]:
   
ndata=259920:undef=0:mean=93.4211:min=-403.51:max=441.99
    grid_template=0:
 lat-lon grid:(720 x 361) units 1e-06 input WE:NS output WE:SN res 48
 lat 90.000000 to -90.000000 by 0.500000
 lon 0.000000 to 359.500000 by 0.500000 #points=259920
無事できたようですが困りました.
なんとgrb2GMTでは使えないし変換するソフトもなさそう.
大元のサイト
http://www.cpc.ncep.noaa.gov/products/wesley/wgrib2/netcdf.html
によるとncファイルに変換できそうです.
勿論,私は英語なんてわからいですが運が良かったんですね.
  wgrib2 ../example/eta.t00z.awphys18.grb2 -netcdf eta.nc
なんて一文がありました

$ wgrib2 1000HGT.grb2 -netcdf 1000HGT.nc 
 としてみる 無事にできたが・;
 
ncはまだGMTでは使えない
grbgrb2ncに変換してくれるソフトはいくつかあるみたいですが・・
grb2ncgrbに変換してくれるソフトは見つかりませんでした
hoge.ncGrADSとか言うもので使う形式らしいFORTORUNの世界?
 
気象屋さんはGMTを使わないのか?
 
試行錯誤?偶然?で
いちからはじめるGMT その17にあったncdumpを試してみた
$ ncdump 1000HGT.nc
としてみる.なんと幸いダンプしてくれた.
 
$ ncdump 1000HGT.nc>1000HGT.txt
 
1000HGT.txtができた
緯度軽度も入っている0.5刻みのようですが余計(?)なので手作業でカット
面倒ですがtxtファイルでGMTで使えるファイル
(とりあえずやっつけ仕事でmyline2.pyを作成しました)
を作ってGMTgrdファイルをつくることにする
参考に後で付録してpythonで作ったmyline2.pyを示します




2.GMTで等高度線を描いてみる
予想された等高度線は見ることはできなかったので
いちいち館野や輪島の高層実況を確認していたなあ
どの位の高さに0度線があるかも知らないで雪予想なんてできる訳ないのになあと思っていた

1000HGT.txtをとりあえず手作業で修正して1000HGTg.txtをつくり
myline2.pyで 1000HGTg.txtGMTで扱える1000HGTgm.txtへ変換した
 
次に1000HGTgm.txt1000HGT.grd(バイナリファイル)に変換します
 
いちからはじめるGMTその74をみると
 
surface signal.txt -Gsignal.grd -R-6/6/-6/6 -I0.125
 
-Gオプションはgrdファイル名,-Iオプションはグリッド間隔,-Rオプションは緯度経度
 

元データのグリッドは0.5だからIは半分の0.25にしました領域は日本が入るようにします
 
$ surface 1000HGTgm.txt -G1000HGT.grd -R120/150/20/50 -I0.25
 
1000HGT.grd無事作成されました 
それではGMTで書いてみます 
図はファイル名1000H.epsにしました
$ pscoast -Jm1:5000000 -R135/145/32/38 -W -Bg5 -Gtan -K > 1000H.eps 
続けて
$ grdcontour 1000HGT.grd -R135/145/32/38 -J -A10 -O >>1000H.eps
( >>1000H.epsであることに注意 >1000H.epsではありません) 
オプション−Aはコンターの間隔みたいです
無事にできたので
gimppngに変換(エクスポートして保存)1000H.pngにしました
90度傾いていたので直した図がこれ
 
バンザイ
 
北高タイプかなついでだから北東気流について少し考えてみよう
850hPaの等高度線がこれ




















850hPaは関東の沿岸で弱い気圧の谷になってますね
やっぱり風が必要か 
まだ気象関数は作っていないので味美測候所からお借りします
 
1000hPaはないので925hPa
925hPa 温度と風























たしかに宮城県沖に寒気があって流れこんでいるように見えるな
 850hPa 相当温位と風























850hPaの前線状のものが関東の925hPa寒期に乗り上げるような形かな?
しっかりみてないのであまりコメントしないほうが・・よいかな? 
さらについで
1000hPaの温度線を描いてみる絶対温度になっているようで273度引いて考えてください
 
 
 
 
 
 
 
 
 
 
 
 
 
本州付近は温度のメリハリがないな
宮城県沖に寒気があって流れこんでくるって説明はどうなんだろう?
100m位上空の寒気が地上付近に落ちてきたってことになりそうだが・・どうして?
1000hPa925hPaに対して不安定?
でも,それは1000hPa温位のほうが高いってことだな?
まあ、カラクリは追々と考えるとして・・ 
今まで見ることがなかった湿球温度線を見るのが楽しみだな
気象関数はこれから作るので時間がかかります・・
雪が話題になる頃にはできるかな?




付録
pythonで作ったmyline2.py 
 参考にしてください
はずかしいけど・・実力がないことがバレバレ 
#!/usr/bin/env python
#-*- coding: utf-8 -*-
 
#データを整える関数
def myline(arg): 
  
  mylist= arg.split(',')#,でリストに変換
 
  a=[]#新しいリストの初期化  

 
  kizami=0.5
 
  latitude=-90
 
  longitude=0
 
  

 
  #データ作成のループ
 
  for i in mylist:
 
      i=i.strip()#空白や改行をなくしている
 
      #データの作成
 
      #x座標値 y座標値 1000hPaの高さ 
 
      a.append(str(longitude)+' '+str(latitude) +' '+i)
      
      #print(str(longitude)+' '+str(latitude))
 
      if longitude >359.5:
 
          longitude=0
 
          latitude=latitude+kizami
 
          if latitude>89.5:
 
              latitude=-90
 
      else:
 
          longitude=longitude+kizami
  
  #ループは終わり,ここから先は結果をみながら調整してください
  
  #リストの最後を表示
 
  print a[-1]
 
  #変数のタイプを調べる
  print type(a)        

 
  #リストの最後を切る
 
  a.pop()
 
  #a.strip()


 
  #リストから最終的なデータを作る
 
  mydata='\n'.join(a)   

 
  return mydata
 
#関数終わり
 
#1000HGTg.txteを読んで関数mylinede1000HGTgm.txtを作ります
f=open('1000TMP.txt','r')
s=f.read()
f.close()
s=myline(s)
f=open('1000TMPgm.txt','w')
f.write(s)
f.close()