Public
Edited
Dec 20, 2022
Paused
2 forks
Comments locked
7 stars
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
waveVolume = (waveHeightFeet * waveLengthFeet / 2) * wallWidthFeet
Insert cell
Insert cell
seawaterMassPounds = kgM3TolbsF3(1025)
Insert cell
waveMassPounds = waveVolume * seawaterMassPounds
Insert cell
Insert cell
Insert cell
Insert cell
waveSpeedFPS = mphToFPS(stormVelMPH)
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
crashTime = waveLengthFeet / (waveSpeedFPS / 2)
Insert cell
Insert cell
waveLBSForce = waveSpeedFPS * waveMassPounds / crashTime
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
function waterLevelTimeCurve(isoStart, isoEnd) {
let scale = d3.scaleTime().domain([isoStart, isoEnd]).range([0, 1])
return function curve(t) {
let d = scale.invert(t); // get date from time value
let results = waterLevel.filter(x => fmtDt(x.datetime) === fmtDt(d)) // filter for exact match
// If we get a single result we have an exact match
if (results.length === 1) {
return results[0].waterLvlPct
}

// Otherwise grab all results insert our time
results = waterLevel.concat([{datetime: d}])
// Sort them and then find the index of the one we inserted
results = results.sort((a, b) => d3.ascending(a.datetime, b.datetime))
let idx = results.findIndex(x => fmtDt(x.datetime) === fmtDt(d))
// Return the average of the element before and after
return (results[idx - 1].waterLvlPct + results[idx + 1].waterLvlPct) / 2
}
}
Insert cell
Insert cell
Insert cell
periods = d3.range(.01, 1, .01).concat([1])
Insert cell
Insert cell
cumulativeForceLBS = {
let isoStart = d3.min(waterLevel.map(x => x.datetime));
let isoEnd = d3.max(waterLevel.map(x => x.datetime));
let curve = waterLevelTimeCurve(isoStart, isoEnd);
let momentumOfT = (t) => curve(t) * wallAreaForce;
let milliElapsed = (isoEnd.getTime() - isoStart.getTime())
let seconds = milliElapsed / 1000;
let stepTime = seconds / 100;

// Integrate!
return periods.reduce((a, t) => {
return momentumOfT(t) * (stepTime) + a
}, 0)
}
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
hydroAreaForce = seawaterMassPounds * 9.8 * ((wallHeightFeet * waterDepthFactor) / 2) * ((wallHeightFeet * waterDepthFactor) * wallWidthFeet2)
Insert cell
Insert cell
Insert cell
Insert cell
totalCumulativeForce = {
let isoStart = d3.min(waterLevel.map(x => x.datetime));
let isoEnd = d3.max(waterLevel.map(x => x.datetime));
let curve = waterLevelTimeCurve(isoStart, isoEnd);
let momentumOfT = (t) => curve(t) * wallAreaForce;
let hydroOfT = (t) => curve(t) * hydroAreaForce;
let milliElapsed = (isoEnd.getTime() - isoStart.getTime())
let seconds = milliElapsed / 1000;
let stepTime = seconds / 100;
return periods.reduce((a, t) => {
return momentumOfT(t) * (stepTime) + hydroOfT(t) * (stepTime) + a
}, 0)
}
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
scaled = numericalModelData.map(x => ({...x, "scaledAvgForce": x["avgForce"] * Math.pow(scaleFactor, 2)}))
Insert cell
Insert cell
Insert cell
Insert cell
timeStep = 1
Insert cell
steps = d3.range(0, 61, timeStep)
Insert cell
timeStepData = scaled.filter(x => steps.includes(x.flowTime))
Insert cell
scaledForceOfT = (t) => timeStepData.filter(x => x.flowTime === t)[0].scaledAvgForce
Insert cell
minuteForce = steps.reduce((a, t) => scaledForceOfT(t) * timeStep + a)
Insert cell
hourForce = minuteForce * 60
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
checkWallWidth = .328
Insert cell
checkWallHeight = scaleFactor * checkWallWidth
Insert cell
Insert cell
checkWaterDepth = scaleFactor * .196
Insert cell
checkHighWaterMark = checkWaterDepth + scaleFactor * 0.066
Insert cell
checkSurfaceArea = checkHighWaterMark * checkWallWidth
Insert cell
Insert cell
Insert cell
checkDragForce = 63.99 * Math.sqrt(32.17 * checkWaterDepth) * checkSurfaceArea
Insert cell
Insert cell
checkHydroForce = 63.99 * 32.17 * (checkWaterDepth/2) * (checkWaterDepth * checkWallWidth)
Insert cell
Insert cell
Insert cell
Insert cell
pctAtTime = (t) => scaled.filter(x => x.flowTime === t)[0].pct
Insert cell
Insert cell
dragForceAtT = (t) => checkDragForce * pctAtTime(t)
Insert cell
hydroForceAtT = (t) => checkHydroForce * pctAtTime(t)
Insert cell
checkMinForce = steps.reduce((a, t) => dragForceAtT(t) * timeStep + hydroForceAtT(t) * timeStep + a)
Insert cell
checkHourForce = checkMinForce * 60
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
veaForceLBS = veaStats.speedFPS * veaStats.weightLBS / (veaStats.armLengthFeet / (veaStats.speedFPS / 2))
Insert cell
numVeas = waveLBSForce / veaForceLBS
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
trainHourVelocityFPS = Math.sqrt(hourForce / (train.density * (train.widthFeet * train.heightFeet)))
Insert cell
trainMinuteVelocityFPS = Math.sqrt(minuteForce / (train.density * (train.widthFeet * train.heightFeet)))
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
function kgM3TolbsF3(v) {
return v / 16.018;
}
Insert cell
function mphToFPS(v) {
return v * 1.466;
}
Insert cell
function fpsToMPH(v) {
return v / 1.466;
}
Insert cell
function hoursBetween(d1, d2) {
// https://stackoverflow.com/questions/19225414/how-to-get-the-hours-difference-between-two-date-objects
return Math.abs(d1 - d2) / 36e5;
}
Insert cell
fmtFloat = d3.format(",.2f")
Insert cell
function roundDown(places) {
return function(v) {
return Math.floor(v / Math.pow(10, places)) * Math.pow(10, places)
}
}
Insert cell
waveMassPoundsRounded = d3.format(",")(roundDown(2)(waveMassPounds))
Insert cell
wavePoundForceRounded = d3.format(",")(roundDown(2)(waveLBSForce))
Insert cell
numVeasRounded = roundDown(0)(numVeas)
Insert cell
viewWaveHeightFeet = waveHeightFeet
Insert cell
viewWaveLengthFeet = waveLengthFeet
Insert cell
viewWallWidthFeet = wallWidthFeet
Insert cell
Insert cell
fmtDt = d3.timeFormat("%Y-%m-%dT%H:%M:%s")
Insert cell
fmtInt = d3.format(",d")
Insert cell
viewHourlyTrainSpeedMPH = fmtInt(fpsToMPH(trainHourVelocityFPS))
Insert cell
viewMinuteTrainSpeedMPH = fmtInt(fpsToMPH(trainMinuteVelocityFPS))
Insert cell
viewFEAwaveHeight = fmtInt(scaleFactor * 0.066)
Insert cell
viewFEAwaveLength = fmtInt(scaleFactor * 1.312)
Insert cell
viewHourForce = fmtInt(hourForce)
Insert cell
viewMinuteForce = fmtInt(minuteForce)
Insert cell
Insert cell

Purpose-built for displays of data

Observable is your go-to platform for exploring data and creating expressive data visualizations. Use reactive JavaScript notebooks for prototyping and a collaborative canvas for visual data exploration and dashboard creation.
Learn more