Studio Life~2023 New Year’s Eve
年末年始は鎌倉の本宅で年越しです。小松駅から夜行バスに乗り翌朝新宿で私鉄に乗り換え最寄り駅片瀬江ノ島駅で降車。改札口に出て太陽の光に輝く海の景色を目にする瞬間、仄かな懐かしさを覚え、関東の天候の良さを思い出して鎌倉へ戻ってきた感激に浸る。今年の年末は晴天に恵まれて寒さ知らず。生憎大晦日は天気は崩れたが正月三ヶ日も好天に恵まれる予報。I am spending the New Year’s holiday at my main residence in Kamakura. I take an overnight bus from Komatsu Station, change to a local train at Shinjuku Station next morning, and get off at Katase Enoshima Station. As soon as I step out of the exit gate and see the sea shining in the sunlight, I feel a faint sense of nostalgia and recall the excellent weather in the Kanto area. I am filled with the emotion of returning to Kamakura. At the end of this year, it is warm with clear skies, but the weather is broken on New Year’s Eve. The forecast for the three days of the New Year would be blessed with good weather.
今年一年を振り返るとはクルマ弄りは殆どなく、ゴジラの軽微なメンテをディーラーに依頼したのみで、山行とLife WorkのProgrammingに注力した一年だった。
歩行は自然知能の泉
他人の目を気にせず好きなことやって穏やかで平凡な暮らしを送ることを信条としている。
頭のスッキリとした早朝4時半Programming作業で一日を始める。5時45分モーサテで経済情報を聞き息抜き。6時半散歩に出かける。コースは決まっていて服部神社へ詣、足湯で一服、メール・ネットを渉猟後帰宅するのが定番である。所要時間は1時間。朝食を取りながらNHKの朝ドラを鑑賞。天気が良ければ図書館へ赴き蔵書を雑読する。午後は九谷広場でProgrammingを再開する。酒のつまみの人参と納豆等を買って5時頃帰宅。5時半頃から一日を振り返りながら晩酌を始める。7時半には床につき一日を終える。
「歩くことは、体によいだけではない。頭をよくしてくれる。
中略
モノゴトを深く考えるには、沈思黙考ではなく、歩きながら頭を働かせたほうがよい、ということにもっとも早く気づいたのは古代ギリシャ人であったらしい。歩きながら哲学を論じた。のちになって、その故智にならって、散歩によって思考を伸ばす哲学者があらわれた。
しかし、一般の人は、歩くことを認めなかった。運動不足を知的生活のあかしのように考える知識人は、ついこの間まで多数であった。
そこで、医学が散歩の効用を説いた。頭をよくしたいという人は少ないが、病気になりたくないという人はおびただしいらしい。散歩ブームを起こした。
歩くのは、健康のためばかりでなく、思考力を高めるのに、もっとも有効であるということをよく解しないのが現代である。
歩くのは、自然知能による思考能力の強化にとって、かけがいのないものであるということを認めてもよいのである。
歩行は、自然知能の泉であると言ってよいであろう。」自然知能 外山滋比古著
当初早朝散歩を始めた発端は、昨年の白馬岳雪渓での失態を経験した反省から、脚・膝の増強を目指したものであった。
Programmingが日課の要となるに従い、4時半頃から始めた2時間作業の過程で問題に突き当たることが多い。そんなとき、歩きながらこれまでの作業をレビューして対応策(修正)を講ずることが非常に効果的になっている。
そのような変化を覚え始める頃、図書館で出会った本が外山滋比古著の新書「自然知能」であった。正に我が意を得たりという出会いであった。
iSMART Programming
現在、自動微分の組込みに苦慮している。
解析微分との比較検証作業を余儀なくされ、その検証作業の中で解析微分を概ね導出してしまう展開となったことは愛嬌とも言えようが、自動微分モジュールに些細なバグがあることを見つけるのに、「PVT・Relative Permeability」の解析微分導出の末1ヶ月程掛かったことは情けない限り。なお、PVTに関しては解析微分値と自動微分算定値は完全に合致するが、Relative Permeabilityについては両者微妙に異なる。その理由については未だに解明できていない。
いつ何時組込みに成就しても不思議ない佳境にある。
ライフワークの貯留層シミュレータiSMARTの講義を昨年初から開始している。講義を続けながら、ソースコードの開示に向けて既存コードの見直しも併せて進めている。
ソースコードを作成する上で、一定のルールを自ら課している。
- シンプルなロジックに限定したPrimitiveなモデルとする。PVT/Relative Permeabilityに関わる入力データ形式は初期のIMEXに準じた簡素なものである。坑井モデルは独立変数を坑底圧力のみに限定した簡易モデルである。
- 一読しただけで数式が判明するような平易なコーディングに努める。それにはFortranが一番適している。C++はボケが始まったら訳が分からなくなる恐れが生じやすい
- コーディング上の約束事を定めておく。例えば、Global変数は大文字、Zの頭文字とする一方、Local変数を小文字とする(見た目だけの効果であるが)等、Readabilityの区別化を図る
- Technical Background を出来るだけ記載し理解の促進を促す
一例として、最も単純化したPVTのPressure Relativeに関するソースコードを引用しておく。
subroutine DEFPRS(ig)
!*********************************************************************************
!* *
!* Define the Pressure Relative Properties *
!* *
!*********************************************************************************
use ismart_mod_dim
implicit none
!---------------------------------------------------------------------------------
integer,intent(in)::ig
integer::ip, ipm, jp, jpm
real(8)::dp, pb, dpb, px, dpx, rog
!=================================================================================
!Rs/Rv | |
! | ST US |
! | __________Rs | Rv
! | / | +
! | / | +
! | / | +
! | / | +
! | / | +
! | / | +
! |______________________________ |______________________________
! |pressure Pb |pressure Pd
!
! Bog | |
! | ST US |
! | - | -
! | / - | -
! | / - | -
! | / - Bo | -
! | / | -
! | / | -
! | / | - Bg
! !________________________________ |_____________________________
! |pressure Pb |pressure Pd
!
! μog | ST US |
! | v | μg
! | v μo | v
! | v v | v
! | v v | v
! | v v | v
! | v | v
! | | v
! |________________________________ |_____________________________
! |pressure Pb |pressure Pd
!
! Bw | μw |
! | |
! | - |
! | - |
! | - |
! | - | μw
! | - | v
! | - Bw | v
! | | v
! |________________________________ |___________________________
! |pressure |pressure
!=================================================================================
!Porosity
! ZPHK(ig) = ZPHT(ig) * ( 1.0 + ZCPH * (ZPXK(ig) - ZRPH) )
dp = ZPXK(ig) - ZRPH
ZPHK(ig) = ZPHT(ig) * ( 1.0 + dp * ZCPH )
!Wat
! ZBWK(ig) = ZBWT * ( 1.0 - ZCBW * (ZPXK(ig) - ZRPW) )
dp = ZPXK(ig) - ZRPW
ZBWK(ig) = ZBWT * ( 1.0 - dp * ZCBW )
ZVWK(ig) = ZVWT + dp * ZCVW
ZRWK(ig) = ZRWT / ZBWK(ig)
if (QANADF) then
ZPHKZPX(ig) = ZPHT(ig) * ZCPH
ZBWKZPX(ig) = - ZBWT * ZCBW
ZVWKZPX(ig) = ZCVW
ZRWKZPX(ig) = - ZRWT * ZBWKZPX(ig) / ZBWK(ig)**2
endif
!Oil and Gas
if (IFGK(ig).eq.1) then !YFG: saturated region
ZPBK(ig) = ZPXK(ig)
px = ZPXK(ig)
call interpL(NPVT,ZPXT,px,ipm)
dpx = px - ZPXT(ipm)
!PX relative
ZRSK(ig) = ZRST(ipm) + dpx * ZRSZPX(ipm)
ZBOK(ig) = ZBOT(ipm) + dpx * ZBOZPX(ipm)
ZBGK(ig) = ZBGT(ipm) + dpx * ZBGZPX(ipm)
ZVOK(ig) = ZVOT(ipm) + dpx * ZVOZPX(ipm)
ZVGK(ig) = ZVGT(ipm) + dpx * ZVGZPX(ipm)
rog = ZROT + ZRSK(ig) * ZRGT
ZROK(ig) = rog / ZBOK(ig)
ZRGK(ig) = ZRGT / ZBGK(ig)
if (QANADF) then
ZRSZPXK(ig) = ZRSZPX(ipm)
ZBOZPXK(ig) = ZBOZPX(ipm)
ZBGZPXK(ig) = ZBGZPX(ipm)
ZVOZPXK(ig) = ZVOZPX(ipm)
ZVGZPXK(ig) = ZVGZPX(ipm)
ZROZPXK(ig) = ZRSZPXK(ig) * ZRGT / ZBOK(ig) - rog * ZBOZPXK(ig) / ZBOK(ig)**2
ZRGZPXK(ig) = - ZRGT * ZBGZPXK(ig) / ZBGK(ig)**2
!due to no PB relative
ZRSZPBK(ig) = 0.0
ZBOZPBK(ig) = 0.0
ZVOZPBK(ig) = 0.0
ZBGZPBK(ig) = 0.0
ZVGZPBK(ig) = 0.0
ZROZPBK(ig) = 0.0
ZRGZPBK(ig) = 0.0
endif
else if (IFGK(ig).eq.0) then !NFG: undersaturated region
pb = ZPBK(ig)
call interpL(NPVT,ZPXT,pb,ipm)
dpb = pb - ZPXT(ipm)
!PB relative
ZRSK(ig) = ZRST(ipm) + dpb * ZRSZPX(ipm)
ZBOK(ig) = ZBOT(ipm) + dpb * ZBOZPX(ipm) - ZCBO * (ZPXK(ig) - pb)
ZVOK(ig) = ZVOT(ipm) + dpb * ZVOZPX(ipm) + ZCVO * (ZPXK(ig) - pb)
rog = ZROT + ZRSK(ig) * ZRGT
ZROK(ig) = rog / ZBOK(ig)
if (QANADF) then
ZRSZPBK(ig) = ZRSZPX(ipm)
ZBOZPBK(ig) = ZBOZPX(ipm) + ZCBO
ZVOZPBK(ig) = ZVOZPX(ipm) - ZCVO
ZROZPBK = ZRGT * ZRSZPBK(ig) / ZBOK(ig) - rog * ZBOZPBK(ig) / ZBOK(ig)**2
ZRSZPXK(ig) = 0.0 !not PX relative
ZBOZPXK(ig) = -ZCBO
ZVOZPXK(ig) = ZCVO
ZROZPXK(ig) = ZRGT * ZRSZPXK(ig) / ZBOK(ig) - rog * ZBOZPXK(ig) / ZBOK(ig)**2
endif
!saturated region
px = ZPXK(ig)
call interpL(NPVT,ZPXT,px,jpm)
dpx = px - ZPXT(jpm)
!PX relative
ZBGK(ig) = ZBGT(jpm) + dpx * ZBGZPX(jpm)
ZVGK(ig) = ZVGT(jpm) + dpx * ZVGZPX(jpm)
ZRGK(ig) = ZRGT / ZBGK(ig)
if (QANADF) then
ZBGZPXK(ig) = ZBGZPX(jpm)
ZVGZPXK(ig) = ZVGZPX(jpm)
ZRGZPXK(ig) = - ZRGT * ZBGZPXK(ig) / ZBGK(ig)**2
ZBGZPBK(ig) = 0.0
ZVGZPBK(ig) = 0.0
ZRGZPBK(ig) = 0.0
endif
endif
!=================================================================================
end subroutine
因みに、解析微分を組み込んだSMART貯留層シミュレータでは、徹底的に高速化を志向する中、除算より乗算の方が演算負荷が低いことから、Formation Volume Factor\(B_\ell\)、及びViscosity\(V_\ell\)との積算値を其々\(1/B_\ell\)、\(1/BV_\ell\)に変換の上乗算化している。
”心の欲する所に従いて矩を踰えず”を目指して
来年の目標も山行とライフワークのProgrammingになろうが、Programmingについては一定のケリをつけたい。山行のメインターゲットは後立山連峰鹿島槍ヶ岳にチャレンジする予定。登山ルートは急登の赤岩尾根経由にするか、柏原新道経由にするかで迷っている処。
毎日午後、九谷広場でProgrammingに専念しているが、常連のオバサン連中(70歳以上)の会話が否応なしに耳に入る。専らな話題は、金、男、それに他人の悪口。とりわけ、恨み(うらみ)、辛み(つらみ)、ねたみ(妬み)、嫉み(そねみ)、嫌味(いやみ)、僻み(ひがみ)、やっかみに代表される人生の七味唐辛子に例えられる7つの「み」のオンパレードにはげんなりするばかりだ。まだまだ煩悩が健在だ。まだまだ煩悩が健在だ。更に、これに過去の自慢話をくけ加えたい。過去の自慢話をする人間は終わっている。過去失敗した人であろうと成功した人であろうと現時点の存在が肝要である。
寂れた温泉場故か生活保護を受けている独り者の女性が多いことも関係あるかもしれない。彼女達は金と暇があればパチンコに興じている。支給されたばかりの7万円の政府からの支給金はもう使い切ったと宣う。かれら老人保護を目的としたら不要な支援だったと痛感する次第。
俺は他にもやりたいことは沢山あるから生き甲斐を失ったりしないだろう。もともと落ちて生きてきたから落差もないし、今後とことん落ちても必要なものだけをビルドして生き甲斐を見つけたらよい。
良いお年をお向かえ下さい。
以上
大晦日14時、朝から降り続いた雨も止み薄日がさしてきたものの曇天の空とスラムダンク踏切のショット。
〆