import { SteelDiameter } from "./steel.ts";
import { checkPoints, isSafe, Param, V_c, V_s } from "./mod.ts";
/** かぶり (mm)
*
* 固定値とする
*/
const c = 52;
/** 初期パラメタ */
const param0: Omit = {
b2: 0.45,
b4: 0.30,
c,
phi: 19.1,
hs: 2,
m: 8,
n: 4,
};
let minVs = V_s(param0);
let minVc = V_c(param0);
/** [0][0]が両方最小、[0][1]がコンクリート最小、[1][0]が鉄筋最小 [1][1]が初期パラメタ */
const minParams: Omit[][] = [[param0, param0], [param0, param0]];
// 主鉄筋にD13は採用しない
for (const phi of ([15.9, 19.1, 22.2] as SteelDiameter[])) {
// 1cm刻みで増やす
for (let bm = Math.ceil((2 * c + phi) / 10) / 100; bm < 0.7; bm += 0.01) {
// 1cm刻みで増やす
for (let bs = 0; bs < bm - (2 * c + phi) / 1000; bs += 0.01) {
// 1cm刻みで増やす
for (let hs = 0.5; hs <= 4.0; hs += 0.01) {
for (const n of [3, 4, 5, 6]) {
// 主鉄筋の制約条件
// 主鉄筋間隔と配力鉄筋量で決まる
for (
let m = Math.max(n, 3);
m <= (phi === 15.9 ? 15 : phi === 19.1 ? 10 : 7);
m++
) {
if (m % n !== 0) continue;
const param: Omit = {
phi,
hs,
b2: bm + bs,
b4: bm - bs,
c,
m,
n,
};
// 一番短いところで確定する
if (!checkPoints(param).every((x) => isSafe({ x, ...param }))) {
continue;
}
// 最小値だったら更新する
const vs = V_s(param);
const vc = V_c(param);
if (minVc > vc) {
minVc = vc;
minParams[0][1] = param;
if (minVs > vs) {
minVs = vs;
minParams[1][1] = param;
minParams[1][0] = param;
}
} else if (minVs > vs) {
minVs = vs;
minParams[1][0] = param;
}
break;
}
}
}
}
}
}
const view = (p: Omit) => [
p.b2.toPrecision(3),
p.b4.toPrecision(3),
p.hs.toPrecision(3),
p.phi,
p.m,
p.n,
V_c(p),
V_s(p),
];
console.table({
head: ["b2", "b4", "hs", "phi", "m", "n", "V_c", "V_s"],
default: view(minParams[0][0]),
minVc: view(minParams[0][1]),
minVs: view(minParams[1][0]),
min: view(minParams[1][1]),
});