JSFiddle - React, Tailwind, and code Playground

by fxi

JavaScript

var data = {
  "power": 100,
  "rweight": 70,
  "bweight": 8,
  "tire": .005,
  "aero": .4,
  "cvinput": .9,
  "grade": 0,
  "headwind": 0,
  "distance": 0.1,
  "temperature": 25,
  "elevation": 100,
  "trans": 95
}


function newton(aero, hw, tr, tran, p) { /* Newton's method */

  var vel = 20; // Initial guess
  var MAX = 10; // maximum iterations
  var TOL = 0.05; // tolerance

  for (var i = 1; i < MAX; i++) {
    var tv = vel + hw;
    var f = vel * (aero * tv * tv + tr) - tran * p; // the function
    var fp = aero * (3.0 * vel + hw) * tv + tr; // the derivative
    var vNew = vel - f / fp;
    if (Math.abs(vNew - vel) < TOL) return vNew; // success
    vel = vNew;
  }
  return 0.0; // failed to converge
}


function update(d) {

  /* Left panel */
  powerv = d.power;
  rweightv = d.rweight;
  bweightv = d.bweight;

  rollingRes = d.tire;
  frontalArea = d.aero;
  cv = d.cvinput;
  gradev = d.grade * 0.01;
  headwindv = d.headwind / 3.6; // converted to m/s
  distancev = d.distance;
  temperaturev = d.temperature;
  elevationv = d.elevation;
  transv = d.trans * 0.01;


  /* Left Calculation */
  density = (1.293 - 0.00426 * temperaturev) * Math.exp(-elevationv / 7000.0);
  twt = 9.8 * (rweightv + bweightv); // total weight in newtons
  A2 = 0.5 * frontalArea * cv * density; // full air resistance parameter
  tres = twt * (gradev + rollingRes); // gravity and rolling resistance

  v = newton(A2, headwindv, tres, transv, powerv) * 3.6; // convert to km/h
  if (v > 0.0) t = 60.0 * distancev / v;
  else t = 0.0; // don't want any div by zero errors
  c = t / 60.0 * (powerv * 4.0) / 1.163;
  /* 1.163 is for converting watt-hours to kilocalories */
  /* energy conversion eff = 0.25 */
  wl = c / 7716;

  console.log("speed kmh: "+v);
  console.log("time m:" + t);
  console.log("calories " + c);
  console.log("weigtloss" + wl);
  console.log("---")

}

update(data);