ヘリウム中間報告2015年10月03日 01:40

ヘリウム中間報告
ヘリウム中間報告


コーディングをサボって、巷の減圧ソフト探しに現を抜かしているこの頃だが、全く何もしていないわけではない。

まあ、それに近いものはあるんだがな。

一応、出来たところまで公開する。

「<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];//窒素だけの時
//ヘリウム混合の時
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閉じ
print(j);
for (var i = 0; i < 16;i++){
print(mv[i]);
}
/*
<<<<停止+浮上>>>>
*/

if (j === 0){
print("end");
}
/*
while (j > 0){
var teisi = j;
var teisi_bunatu=new Array(15);

for (var i = 0; i < 16;i++){
teisi_bunatu[i] = bunatu[i];
}//for抜け
var pb = 3*teisi*10;
var pc = 3*(teisi-1)*10;
var l = 1;
while (l < 300){
var t = l;
for (var i = 0; i < 16;i++){
qn2[i] = teisi_bunatu[i];
bunatu[i] = (pa+pb)*nn2-((pa+pb)*nn2-qn2[i])*Math.exp(-k[i]*t);
qn2[i] = bunatu[i];
}//for抜け
var t = Math.abs(3*10/r);
for (var i = 0; i < 16;i++){
bunatu[i] = (pa+pb)*nn2+r*nn2*(t-1/k[i])-((pa+pb)*nn2-qn2[i]-r*nn2/k[i])*Math.exp(-k[i]*t);
mv[i] = (pa+pc)/mvn2b[i]+mvn2a[i];

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

if (bunatu[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抜け
if (hanteiti === 0){
break;
}//if抜け
l++
}//内側のwhile抜け
//プリント表示
print(3*j+"m,"+ l +"min");
j--
}//外側のwhile抜け
*/

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

作業途中なので、見にくさ100倍なんだが、最後の<<<<停止+浮上>>>>については、全く手を付けていない(コメントアウトしてます)。

その前の所にある以下のプリント文は、ここまでの処理が正常に行われているかどうかを確認するためのものである。

「print(j);
for (var i = 0; i < 16;i++){
print(mv[i]);
}」

これをこのままの状態で実行すると、ヘリウム混合で潜った時の、初回停止深度の係数「j」(3m掛けると、初回停止深度になります:12m)と、その深度におけるM値が出てくる。

「4
558.2588050578379
475.2908259535448
422.1654567449188
383.42910024361345
362.3437278997782
341.32148400388013
325.05516818853266
311.37882693669485
301.748512769794
293.1553202554894
287.12974317366206
282.5825964063619
277.1005665073798
273.7517288580578
269.3430163673012
265.64898410370944」

画像は、表計算ソフトで行った結果と比較している。

各パラメーターの値は、コードに直書きしているが、海水、トライミックス20/30で水深40m、作業時間60分、潜降・浮上速度10m/分といういつものパターンである。

変数名をユニークにしたり(後々、パラメーターを一括で入力できるようにしたいので)、計算式を見直したり、いろいろ弄っている。

傑作なバグもやらかして、時間を食っているが、自分がどういうミスをしがちかということが分かってきて、リカバリーも要領がよくなった(「half」を「herf」にしたり、式の中の「-」符号を外し忘れたり・・・)。

プログラミング以前の問題が多いな。

まあ、どうでもいいんですが。

ロジック的には、書き換えたところまでは、問題なく(?)動いている。

少なくとも、計算の値は確かだ。

最後のところは、少し頭が冴えてる時でないと書き換えができない(んじゃあ、いつまでたってもダメじゃん!?)。

じっくり、考えながら、取り組むことにしよう。

while文の入れ子になっているところなので、ベーシックで書いたときのように、外側のロジックが動いているかどうかを確認してから、内側の値を小さくして、チェックしていくのがいいだろう。

何言ってるか、自分でも良く分かってないんだがな。

とりあえず、今日はこれで保存して寝る。

表計算ソフトでは、この設定時の減圧スケジュールは、以下になるはずである。

「トライミックス20/30:
12m:6分
9m:12分
6m:23分
3m:49分」

そう、空気の時より、長くなっている。

窒素酔いのことを考えなければ、ヘリウム使うというのは、かえってリスクが高くなる面もある。

「空気:
12m,5min (1分)
9m,13min (1分)
6m,21min (2分)
3m,42min(7分)」

まあ、トータルでも11分の差である。

30mからヤバイといわれる、窒素の麻酔効果をどう評価するかだな。

厚労省は、金に糸目を付けずに、30mからトライミックスにせい!、といっているが、背に腹は代えられないだろう。

歩留まりも悪くなるしな。

もちろん、法的には、40mまで空気で潜らせても問題はない。

酸素減圧と組み合わせて、トライミックス使用時でも、短時間の減圧で済むようにするのが王道というわけだ。

プログラム上で、酸素減圧をどうするかについては、いろいろ考えている。

NSK減圧表のように、最終減圧を9mで済ませたりするパターンも実現できるといいな(というか、最終停止深度を3m以外に設定できるようにすべきだろう)。

こんなことや、あんなことも、いろいろ構想はあるんだが、それは、動いてからのお楽しみだ。

とりあえず、ヘリウム混合ガスで、初回停止深度の割り出しまでは漕ぎつけた。

これで、とりあえずは良しとしよう・・・。

アキバ・デー2015年10月03日 20:44

アキバ・デー
アキバ・デー


画像は、ロータス・エスプリ。

サイドウインドウにはS4のシールが貼ってあった。

(ロータス・エスプリ:S4)
https://ja.wikipedia.org/wiki/%E3%83%AD%E3%83%BC%E3%82%BF%E3%82%B9%E3%83%BB%E3%82%A8%E3%82%B9%E3%83%97%E3%83%AA#S4

アキバの路上でゲット!(盗んだり、してません!)。

今日は、帰りにウラカンも見たし、スーパーカー・デーだな。

秋葉原に久しぶりに行って、東芝の2世代(3世代?)前のタブレット(AT500/36F)をゲット(たぶん、新古品?)。

(タブレット REGZA Tablet AT500(2012年5月):仕様)
http://dynabook.com/pc/catalog/regza_t/120514at500/spec.htm

「・プラットフォーム Android™ 4.0
・CPU  NVIDIA® Tegra® 3 モバイルプロセッサ
・・動作周波数 1.30GHz
・・コア数 NVIDIA®4-PLUS-1™ モバイル用クアッドコア
・キャッシュメモリ 1MB
・メモリ 容量 1GB(オンボード)
・表示機能
・・ディスプレイ
・・・タッチパネル付き 10.1型ワイド WXGA TFTカラー IPS液晶(広視野角/省電力LEDバックライト)1,280×800ドット
・・・外部ディスプレイと同時表示(HDMI接続)(オプション) 最大1,280×800ドット)/1,677万色
・入力装置
・・ポインティングデバイス:静電容量式タッチパネル
・・ワンタッチ操作ボタン:マルチファンクションスイッチ、音量ボタン 他
・補助記憶装置 内蔵フラッシュメモリ
・・32GB フラッシュメモリ(eMMC対応)
・・ソフトウェア占有量:約3GB
・通信機能
・・無線LAN IEEE802.11b/g/n準拠(Wi-Fi準拠、WPA/WPA2対応、WEP対応、AES対応、TKIP対応)
・・Bluetooth:Bluetooth® Specification Ver.3.0
・サウンド機能
・・ステレオスピーカー、モノラルマイク
・メディアスロット:SDカードスロット×1
・インターフェース
●USB2.0(micro-AB)×1
●ヘッドセット/ヘッドホン端子(3.5mmΦミニジャック)×1
●micro HDMI出力端子×1
・センサー
・・GPS、電子コンパス、加速度センサー、ジャイロセンサー、照度センサー
・Webカメラ
・・本体前面(有効画素数 約200万画素)×1
・・本体背面(有効画素数 約500万画素)×1
・電源
・・バッテリー リチウムイオンポリマー
:駆動時間 約10.0時間
:充電時間 約5.0時間(電源OFF時)
:約8.0時間(電源ON時)
・・ACアダプター:AC100V~240V、50/60Hz
・標準消費電力:(最大)約4W(10W)
・環境条件:温度5~35℃、湿度20~80%(ただし、結露しないこと)
・外形寸法(突起部含まず) 約260.6(幅)×178.9(奥行)×9.0(高さ)mm
・質量:約590g
・主な付属品
●ACアダプター
●電源コード
●取扱説明書(今回は付属せず)
●保証書 他(今回は付属せず)
・保証:あり(引き取り修理1年)」

ちなみに、既に保証はない・・・。

取説もなければ、保証書もない。

本体と、電源コード(特殊です!)、ACアダプター(汎用品?)のみ(ああ、箱も付いてます)。

お値段、9980円(税込み)。

イオシスの、秋月の傍の店で見つけた。

ジャンクとかではなかったので、一応、お店の保証は1週間付いている。

(REGZA Tablet AT500/36F PA50036FNAS:商品ランクB:売れてしまったら、たぶん見られません)
http://iosys.co.jp/cgi-bin/zaiko_list/item.php?GN=80772

なんか、2000円安いの(商品ランクC)もあったみたいだな。

でも、まあ、程度がいい方がいいしな。

OSは、既に4.1.1が入っていた(アップグレードは、ここまでだそうです)。

アプリをアップグレードしたり、ネットに繋げたりして、ユーチューブの動画も、問題なく再生できている。

テグレ3でも、十分な処理能力を持っている。

バッテリーの持ちも、話半分としても十分だ。

大人の買い物なので、文句は言わないが、3年落ちのアンドロイドというのは、何というか、もう、博物館行きのシロモノであるな。

まあ、安い買い物であることには変わりないが、満足感は薄い。

ネットに接続して、世界中の情報に接続したり、ゲームしたり(浮沈子はしませんが)、そういう機械だ。

もう、何台目のアンドロイドになるだろう。

それでも、こんなデカいのは初めてだな。

逆さまにしても、画面が回転してくれるので、スタンドに立てる時にも、電源が邪魔になることはない。

これは、本来は専用のスタンドに立てて、充電しながら使うものだろう。

先日上海問屋で買った、キューブ型スピーカーを付けてみる。

(キューブ形 スピーカー)
http://www.donya.jp/item/24108.html

「USB給電式のステレオミニピン入力、アクリル製キューブ形スピーカーです。」

「サイズが4.5立方cm程度ですが、両サイドの振動板が音を増幅し、このサイズではありえない音を響かせてくれます。」

減圧ソフトのコーディングを放っぽり出して、こんなもんで遊んでたのかあ?(その通りです・・・)。

まあいい。

気分転換が終わったら、さっそくコードと格闘するとしよう・・・。

ヘリウム混合浮上成功!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分」

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

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

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

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