race

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import math
import os
import json
import time

DIFF_GEAR_RATIO = 4.00
DISTANCE_METRES = 1609.344 / 4  # Quarter-mile

if __name__ == "__main__":
    dist = 0.0
    elapsed_time = 0.0
    dt = 0.05
    velocity = 0.0
    gear = 1
    vehicle_type = os.getenv("COMP_COLOUR")
    gear_ratios = [float(r) for r in os.getenv("COMP_GEAR_RATIOS").split()]
    mass = float(os.getenv("COMP_MASS_KG"))
    wheel_diameter = float(os.getenv("COMP_WHEEL_DIAMETER_M"))
    max_kw = float(os.getenv("COMP_MAX_POWER_KW"))
    power_frac_vs_1000_rpms = os.getenv("COMP_POWER_FRAC_VS_1000_RPM").split()
    kw_vs_1000_rpms = [float(k) * max_kw for k in power_frac_vs_1000_rpms]
    output_dir = os.getenv("COMP_OUTPUT_DIR")
    output_data = {}
    f = open(os.path.join(output_dir, vehicle_type + ".json"), "w")
    while dist < DISTANCE_METRES:
        curr_rpm = ((velocity / (math.pi * wheel_diameter)) *
                    gear_ratios[gear - 1]) * 60.0 * DIFF_GEAR_RATIO
        curr_rpm_1000 = curr_rpm / 1000.0
        rpm_index = int(curr_rpm_1000)
        if rpm_index > len(kw_vs_1000_rpms) - 2:
            if gear == len(gear_ratios):
                power = kw_vs_1000_rpms[-1] * 1000.0
            else:
                gear += 1
                power = 0.0
        else:
            fraction = (curr_rpm_1000 - rpm_index)
            power = kw_vs_1000_rpms[rpm_index]
            power += fraction * (kw_vs_1000_rpms[rpm_index + 1] -
                                 kw_vs_1000_rpms[rpm_index])
            power *= 1000.0
        velocity = math.sqrt((2.0 * power * dt / mass) + velocity ** 2)
        dist += velocity * dt  # Not elegant or correct, but will work.
        elapsed_time += dt
        time.sleep(dt)
        output_data.update({elapsed_time: dist})
    f.write(json.dumps(output_data))
    f.close()