ヘリウム混合浮上成功!2015年10月03日 22:42

ヘリウム混合浮上成功!
ヘリウム混合浮上成功!


各パラメーターは、コードの中にベタ書きだが、とうとう、ヘリウム混合(トライミックス20/30)での計算に成功した。

「<html lang="ja">
<head>
<meta charset="utf-8">
<title>JavaScript</title>
</head>
<body>
<!DOCTYPE html>
<script>
function print(str){
document.write(str + "<br />");
}
/*
<<<<潜降>>>>
*/
var pa = 100;
var pb = 0;
//var nn2 = 0.79;
var nn2 = 0.5;
var nhe=0.30;

var r0;//潜降速度(m/分)
r0=10;//r0=prompt("senkou_sokudo(m/min) ? ","");
//if ( (r0 == "") || (r0 == null) ) r0 = "0";
r0 = 10*r0;
var d;//作業深度(m)
d=40;//d=prompt("sagyou_sindo(m) ? ","");
//if ( (d == "") || (d == null) ) d = "0";
var t = 10*d/r0;
var qn2 = 74.5207;
var qhe=0
var half_time_n2=[5,8,12.5,18.5,27,38.3,54.3,77,109,146,187,239,305,390,498,635];
var half_time_he=[1.887,3.019,4.717,6.981,10.189,14.453,20.491,29.057,41.132,55.094,70.566,90.189,115.094,147.170,187.925,239.623]

var kn2=new Array(15);
var bunatu_n2=new Array(15);
for (var i = 0; i < 16;i++){
kn2[i] = Math.log(2)/half_time_n2[i];
bunatu_n2[i] = (pa+pb)*nn2+r0*nn2*(t-1/kn2[i])-((pa+pb)*nn2-qn2-r0*nn2/kn2[i])*Math.exp(-kn2[i]*t);
}

var khe=new Array(15);
var bunatu_he=new Array(15);


for (var i = 0; i < 16;i++){
khe[i] = Math.log(2)/half_time_he[i];



bunatu_he[i] = (pa+pb)*nhe+r0*nhe*(t-1/khe[i])-((pa+pb)*nhe-qhe-r0*nhe/khe[i])*Math.exp(-khe[i]*t);
}



/*
<<<<作業>>>>
*/
var pb = 10*d;
var qn2=new Array(15);
var qhe=new Array(15);
var t1;//作業時間(分)
t1=60;//t=prompt("sagyou_jikan(min) ? ","");
//if ( (t1 == "") || (t1 == null) ) t1 = "0";
for (var i = 0; i < 16;i++){
qn2[i] = bunatu_n2[i];
bunatu_n2[i] = (pa+pb)*nn2-((pa+pb)*nn2-qn2[i])*Math.exp(-kn2[i]*t1);
qhe[i] = bunatu_he[i];
bunatu_he[i] = (pa+pb)*nhe-((pa+pb)*nhe-qhe[i])*Math.exp(-khe[i]*t1);
}




/*
<<<<浮上開始時の分圧>>>>
*/
var btm_bunatu_n2=new Array(15);
for (var i = 0; i < 16;i++){
btm_bunatu_n2[i] = bunatu_n2[i]
}
var btm_bunatu_he=new Array(15);
for (var i = 0; i < 16;i++){
btm_bunatu_he[i] = bunatu_he[i]
}

/*
<<<<M値>>>>
*/
var mvn2a=[126.885,109.185,94.381,82.446,73.918,63.153,56.483,51.133,48.246,43.709,40.774,38.68,34.463,33.161,30.765,29.284];
var mvn2b=[0.5578,0.6514,0.7222,0.7825,0.8126,0.8434,0.8693,0.891,0.9092,0.9222,0.9319,0.9403,0.9477,0.9544,0.9602,0.9653];
var mvhea=[174.247,147.866,127.477,112.400,99.588,89.446,80.059,71.709,66.285,62.049,59.152,58.029,57.586,58.143,57.652,57.208]
var mvheb=[0.4770,0.5747,0.6527,0.7223,0.7582,0.7957,0.8279,0.8553,0.8757,0.8903,0.8997,0.9073,0.9122,0.9171,0.9217,0.9267]

/*
<<<<初回減圧停止深度の決定>>>>
*/
var r;//浮上速度(m/分)
r=10;//r=prompt("fujyou_sokudo(m/min) ? ","");
//if ( (r == "") || (r == null) ) r = "0";
r = -10*r;
var hantei=new Array(15);
var mv=new Array(15);
var j = 0;
while (j < 20){
var t = Math.abs((d-3*j)*10/r);
var pc = 3*j*10;
for (var i = 0; i < 16;i++){

//窒素の計算
qn2[i] = btm_bunatu_n2[i];
bunatu_n2[i] = (pa+pb)*nn2+r*nn2*(t-1/kn2[i])-((pa+pb)*nn2-qn2[i]-r*nn2/kn2[i])*Math.exp(-kn2[i]*t);

//ヘリウムの計算
qhe[i] = btm_bunatu_he[i];
bunatu_he[i] = (pa+pb)*nhe+r*nhe*(t-1/khe[i])-((pa+pb)*nhe-qhe[i]-r*nhe/khe[i])*Math.exp(-khe[i]*t);

// mv[i] = (pa+pc)/mvn2b[i]+mvn2a[i];//窒素だけの時

//ヘリウム混合の時のM値
mv[i]=(pa+pc)/((mvn2b[i]*bunatu_n2[i]+mvheb[i]*bunatu_he[i])/(bunatu_n2[i]+bunatu_he[i]))+((mvn2a[i]*bunatu_n2[i]+mvhea[i]*bunatu_he[i])/(bunatu_n2[i]+bunatu_he[i]));

// mv[i] = mv[i]/1.4//安全率

//浮上できるかどうかの判定
if (bunatu_n2[i]+bunatu_he[i] > mv[i]){
hantei[i] = 1;
} else {
hantei[i] = 0;
}
}//for閉じ
var hanteiti = 0;
for (var i = 0; i < 16;i++){
hanteiti = hanteiti+hantei[i];
}//for閉じ
if (hanteiti === 0){
break;
}
j++;
}//while閉じ

/*
<<<<停止+浮上>>>>
*/

if (j === 0){
print("end");
}

while (j > 0){
var teisi = j;
var teisi_bunatu_n2=new Array(15);
var teisi_bunatu_he=new Array(15);

//停止分圧を変数に格納して保持
for (var i = 0; i < 16;i++){
teisi_bunatu_n2[i] = bunatu_n2[i];
teisi_bunatu_he[i] = bunatu_he[i];
}//for抜け

var pb = 3*teisi*10;
var pc = 3*(teisi-1)*10;
var l = 1;
while (l < 300){

//停止の計算
var t = l;//1分毎に計算

for (var i = 0; i < 16;i++){

//窒素の計算
qn2[i] = teisi_bunatu_n2[i];
bunatu_n2[i] = (pa+pb)*nn2-((pa+pb)*nn2-qn2[i])*Math.exp(-kn2[i]*t);
qn2[i] = bunatu_n2[i];

//ヘリウムの計算
qhe[i] = teisi_bunatu_he[i];
bunatu_he[i] = (pa+pb)*nhe-((pa+pb)*nhe-qhe[i])*Math.exp(-khe[i]*t);
qhe[i] = bunatu_he[i];

}//for抜け

//浮上の計算
var t = Math.abs(3*10/r);//3m浮上する時間

for (var i = 0; i < 16;i++){

//窒素の計算
bunatu_n2[i] = (pa+pb)*nn2+r*nn2*(t-1/kn2[i])-((pa+pb)*nn2-qn2[i]-r*nn2/kn2[i])*Math.exp(-kn2[i]*t);

//ヘリウムの計算
bunatu_he[i] = (pa+pb)*nhe+r*nhe*(t-1/khe[i])-((pa+pb)*nhe-qhe[i]-r*nhe/khe[i])*Math.exp(-khe[i]*t);

//M値の計算

//ヘリウム混合の時のM値
mv[i]=(pa+pc)/((mvn2b[i]*bunatu_n2[i]+mvheb[i]*bunatu_he[i])/(bunatu_n2[i]+bunatu_he[i]))+((mvn2a[i]*bunatu_n2[i]+mvhea[i]*bunatu_he[i])/(bunatu_n2[i]+bunatu_he[i]));

// mv[i] = mv[i]/1.1//安全率

//浮上できるかどうかの判定
if (bunatu_n2[i]+bunatu_he[i] > mv[i]){
hantei[i] = 1;
} else {//if抜け
hantei[i] = 0;
}//else抜け
}//for抜け

//判定配列の配列変数の合計
var hanteiti = 0;
for (var i = 0; i < 16;i++){
hanteiti = hanteiti+hantei[i];
}//for抜け

//浮上OKなら抜ける
if (hanteiti === 0){
break;
}//if抜け

l++;//変数「l」のインクリメント

}//内側のwhile抜け

//プリント表示
print(3*j+"m,"+ l +"min");

j--;//変数「j」のデクリメント

}//外側のwhile抜け

</script>
</body>
</html>」

このコードをコピペして、たとえば「index.html」とかいうテキストファイル(拡張子は、「html」)を作って、適当なフォルダー(デスクトップとか)に置いてダブルクリックすると、以下のように表示されるはずである。

「12m,6min
9m,12min
6m,23min
3m,49min」

とにかく計算は合っているようだ(表計算で出した値とは一致:画像参照)。

酸素減圧とか、安全率とか、何より、パラメーターを与える部分はこれからだが、計算のコアの部分は動いた!。

しかも、コーディングして、1発でクリアした!。

奇跡だ・・・。

注意深く、コメントを入れながらプロセスを確認していったのが良かったな。

浮上については、初回停止深度の算出のプロセスと似ている。

停止については、作業における分圧の算定が参考になる。

それらの動作を、昨日確認していたので、コーディングの誤りがなければ(最大の難関だな)、動くはずだと自信を持っていた。

今日、愚弟に話を聞いたら、100行や200行のコードは、新たに作ったライブラリが動くかどうかをテストするためのサンプル程度の規模だという。

通常、アプリケーションというのは、短くて1000行とか2000行、普通には数万行だという。

昨日ダウンロードしたDDプランのコードを覗いてみたんだが、文字化けして読めなかった。

しかし、1568行もあった(エグゼファイルのみ)。

やれやれ・・・。

そんな体力は、浮沈子にはない。

データの出し入れの部分を作るのが精一杯だろう。

ここまで来られたのも、巷の減圧ソフトを書き上げた先達の存在があったからだ。

ソースを見たことはないが、同じような苦労をしてきた人々がいるということが、どれ程励みになったことか。

(DIY DECOMPRESSION:研究報告書の51ページの文献Aの元ネタ)
http://www.lizardland.co.uk/DIYDeco.html

「The first deco software I wrote had about 150 lines of instructions and took two hours to write.」

「Programming with fancy graphics for Windows takes considerably longer and the original version of XS took around three months to complete.」

専門家は、2時間で書き上げるとある。

コードの規模は、浮沈子の場合と同じ程度だな。

この論文の中には、XSというソフト(スチュアート・モリソンが書いたもの)の紹介(宣伝?)も出ている。

(XS for Windows)
http://www.lizardland.co.uk/xs.html

例によって、ZHL16を選択し、最ユルで海水、空気潜水で40m、作業時間60分、潜降・浮上速度毎分10mをはじくと、以下になった。

「XS(ZHL16最ユル):
12m:6分
9m:13分
6m:22分
3m:41分」

厚労省の場合は、こうだったな。

「「厚労省(安全率「1」)
12m,5min
9m,13min
6m,21min
3m,42min」

M値の算出に、どんなパラメーターを使用しているかは不明だが、ほぼ同じ値をはじいている。

このXSというソフトには、「M11F6」というアルゴリズムも仕込まれている。

「Incorporting model based on Hamilton Research's M11F6 algorithm」

これで計算すると、最ユルでこうなる。

「XS(M11F6最ユル):
15m:3分
12m:8分
9m:20分
6m:32分
3m:60分」

うーん、相当保守的だな。

これも、一応無料で使えてしまうようだ(スチュアートに、ビールを奢りたい方は寄付をどうぞ!)。

まあ、本来なら、浮沈子もヘリウム混合が動いたので、祝杯を上げたいところではあるな。

今日は、久々に、気持ちよく眠れそうな気がする。

コメント

コメントをどうぞ

※メールアドレスとURLの入力は必須ではありません。 入力されたメールアドレスは記事に反映されず、ブログの管理者のみが参照できます。

※なお、送られたコメントはブログの管理者が確認するまで公開されません。

※投稿には管理者が設定した質問に答える必要があります。

名前:
メールアドレス:
URL:
次の質問に答えてください:
kfujitoの徒然の筆者のペンネームは、
「○○子」です。
○○を記入してください。

コメント:

トラックバック