Dave Jarvis' Repositories

git clone https://repo.autonoma.ca/repo/autonoma.ca.git
/* Copyright 2024 White Magic Software, Ltd. -- All rights reserved.
 *
 * SPDX-License-Identifier: MIT
 */
import Earth from './Earth.js';
import FlightRecorder from './FlightRecorder.js';
import Rocket from './Rocket.js';
import $ from './Selector.js';

class Simulation {
  constructor() {
  }

  init() {
    const velocity = $('#initial_velocity').val();
    const latitude = $('#initial_latitude').val();
    const altitude = $('#initial_altitude').val();
    const targetAltitude = $('#target_altitude').val() * 1000.0;

    const diameter = $('#diameter').val();
    const wetMass = $('#wet_mass').val();
    const payloadMass = $('#payload_mass').val();
    const dragCoefficient = $('#drag_coefficient').val();
    const specificImpulse = $('#specific_impulse').val();

    this.planet = new Earth(latitude);
    this.rocket = new Rocket(wetMass, payloadMass);

    $('#orbital_velocity').val(
      this.planet.orbitalSpeed(latitude, targetAltitude).toFixed(2)
    );

    this.rocket.on(this.planet);
    this.rocket.fuselage(diameter, dragCoefficient, specificImpulse);
    this.rocket.translocate(latitude, altitude);
    this.rocket.apogee(targetAltitude);
    this.rocket.launch(velocity);
  }

  run() {
    const blackBox = new FlightRecorder();
    this.rocket.recorder(blackBox);

    let time = 0.0;
    const TIME_STEP = 0.01;

    while (this.rocket.flying()) {
      this.rocket.fly(TIME_STEP);
      this.rocket.record(time);
      time += TIME_STEP;
    }

    const altitude = $('#initial_altitude').val();

    $('#air_density').val(
      this.planet.airDensity(altitude).toFixed(2)
    );
    $('#initial_orbital_velocity').val(
      this.rocket.initialOrbitalVelocity().toFixed(2)
    );
    $('#initial_vertical_velocity').val(
      this.rocket.initialVerticalVelocity().toFixed(2)
    );
    $('#rocket_velocity').val(
      blackBox.maxHorizontalVelocity().toFixed(2)
    );
    $('#rocket_altitude').val(
      (blackBox.maxAltitude() / 1000.0).toFixed(2)
    );
    $('#dry_mass').val(
      this.rocket.emptyMass().toFixed(2)
    );
    $('#final_mass').val(
      blackBox.minMass().toFixed(2)
    );
    $('#payload_delivered').val(
      this.rocket.successfulFlight() ? "😀 Yes" : "😞 No"
    );

    blackBox.plot();
  }

  simulate() {
    this.init();
    this.run();
  }
}

const simulation = new Simulation();

document.querySelectorAll('input').forEach(input => {
  input.addEventListener('change', function () {
    simulation.simulate();
  });
});

document.querySelectorAll('.submit').forEach(button => {
  button.addEventListener('click', function (event) {
    event.preventDefault();
    simulation.simulate();
  });
});