37 lines
1.6 KiB
JavaScript
37 lines
1.6 KiB
JavaScript
var bhutaniCache = null;
|
|
|
|
export function loadBhutaniZones() {
|
|
if (bhutaniCache) return Promise.resolve(bhutaniCache);
|
|
return fetch('/data/calculators/bhutani-zones.json', { credentials: 'same-origin' })
|
|
.then(function(response) {
|
|
if (!response.ok) throw new Error('Failed to load Bhutani zone data');
|
|
return response.json();
|
|
})
|
|
.then(function(data) {
|
|
bhutaniCache = data.zones || {};
|
|
return bhutaniCache;
|
|
});
|
|
}
|
|
|
|
export function interpolateThreshold(table, hours) {
|
|
var keys = Object.keys(table).map(Number).sort(function(a,b){return a-b;});
|
|
if (hours <= keys[0]) return table[keys[0]];
|
|
if (hours >= keys[keys.length-1]) return table[keys[keys.length-1]];
|
|
for (var i = 0; i < keys.length-1; i++) {
|
|
if (hours >= keys[i] && hours <= keys[i+1]) {
|
|
var t = (hours - keys[i]) / (keys[i+1] - keys[i]);
|
|
return table[keys[i]] + t * (table[keys[i+1]] - table[keys[i]]);
|
|
}
|
|
}
|
|
return table[keys[0]];
|
|
}
|
|
|
|
export function classifyBhutaniRisk(zones, hours, tsb) {
|
|
var p95 = interpolateThreshold(zones.p95, hours);
|
|
var p75 = interpolateThreshold(zones.p75, hours);
|
|
var p40 = interpolateThreshold(zones.p40, hours);
|
|
if (tsb >= p95) return { zone: 'High-Risk Zone', color: '#ef4444', bg: '#fee2e2', p95: p95, p75: p75, p40: p40 };
|
|
if (tsb >= p75) return { zone: 'High-Intermediate Zone', color: '#f97316', bg: '#ffedd5', p95: p95, p75: p75, p40: p40 };
|
|
if (tsb >= p40) return { zone: 'Low-Intermediate Zone', color: '#f59e0b', bg: '#fef3c7', p95: p95, p75: p75, p40: p40 };
|
|
return { zone: 'Low-Risk Zone', color: '#10b981', bg: '#d1fae5', p95: p95, p75: p75, p40: p40 };
|
|
}
|