Add few functions and scaffold for Δv/T calculus
This commit is contained in:
parent
c72061107b
commit
3cf5382362
1 changed files with 114 additions and 0 deletions
114
ksp_toolbox/const.py
Normal file
114
ksp_toolbox/const.py
Normal file
|
@ -0,0 +1,114 @@
|
||||||
|
import typing as t
|
||||||
|
from math import pi, sqrt
|
||||||
|
|
||||||
|
|
||||||
|
G = 6.67430e-11
|
||||||
|
|
||||||
|
|
||||||
|
class Height(t.NamedTuple):
|
||||||
|
apoapsis: float
|
||||||
|
periapsis: float
|
||||||
|
|
||||||
|
@property
|
||||||
|
def a(self) -> float:
|
||||||
|
return 0.5 * (self.apoapsis + self.periapsis)
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def circ(cls, h: float) -> "Height":
|
||||||
|
return cls(apoapsis=h, periapsis=h)
|
||||||
|
|
||||||
|
|
||||||
|
class Body(t.NamedTuple):
|
||||||
|
name: str
|
||||||
|
radius: float
|
||||||
|
parent: t.Optional["Body"]
|
||||||
|
mass: float
|
||||||
|
apoapsis: float
|
||||||
|
periapsis: float
|
||||||
|
inclination: float
|
||||||
|
|
||||||
|
@property
|
||||||
|
def μ(self) -> float:
|
||||||
|
"""Standard grav. parameter"""
|
||||||
|
return self.mass * G
|
||||||
|
|
||||||
|
@property
|
||||||
|
def a(self) -> float:
|
||||||
|
"""Semi-major axis"""
|
||||||
|
return 0.5 * (self.apoapsis + self.periapsis)
|
||||||
|
|
||||||
|
def period_at(self, height: Height) -> float:
|
||||||
|
return 2 * pi * sqrt(height.a**3 / self.μ)
|
||||||
|
|
||||||
|
def circ_height_for_period(self, period: float) -> float:
|
||||||
|
return (self.μ * period**2 / (4 * pi**2)) ** (1 / 3)
|
||||||
|
|
||||||
|
def height_for_period(self, period: float, fixed_height: float) -> float:
|
||||||
|
return 2 * self.circ_height_for_period(period) - fixed_height
|
||||||
|
|
||||||
|
def v_circ(self, r: float) -> float:
|
||||||
|
return sqrt(self.μ / r)
|
||||||
|
|
||||||
|
def dv_transfer_ellipse(self, r1: float, r2: float) -> float:
|
||||||
|
"""Δv to transfer from circular of radius r1 to elliptical with 2a=r1+r2"""
|
||||||
|
return self.v_circ(r1) * abs(sqrt(2 * r2 / (r1 + r2)) - 1)
|
||||||
|
|
||||||
|
def dv_transfer(self, r1: float, r2: float) -> float:
|
||||||
|
"""Δv to transfer from circular of radius r1 to circular of radius r2"""
|
||||||
|
return self.dv_transfer_ellipse(r1, r2) + self.dv_transfer_ellipse(r2, r1)
|
||||||
|
|
||||||
|
|
||||||
|
kerbol = Body(
|
||||||
|
name="kerbol",
|
||||||
|
radius=261.6e6,
|
||||||
|
parent=None,
|
||||||
|
mass=1.7565459e28,
|
||||||
|
apoapsis=0,
|
||||||
|
periapsis=0,
|
||||||
|
inclination=0,
|
||||||
|
)
|
||||||
|
kerbin = Body(
|
||||||
|
name="kerbin",
|
||||||
|
radius=600e3,
|
||||||
|
parent=kerbol,
|
||||||
|
mass=5.2915158e22,
|
||||||
|
apoapsis=13599840256,
|
||||||
|
periapsis=13599840256,
|
||||||
|
inclination=0,
|
||||||
|
)
|
||||||
|
mun = Body(
|
||||||
|
name="mun",
|
||||||
|
radius=200e3,
|
||||||
|
parent=kerbin,
|
||||||
|
mass=9.7599066e20,
|
||||||
|
apoapsis=12e6,
|
||||||
|
periapsis=12e6,
|
||||||
|
inclination=0,
|
||||||
|
)
|
||||||
|
minmus = Body(
|
||||||
|
name="minmus",
|
||||||
|
radius=60e3,
|
||||||
|
parent=kerbin,
|
||||||
|
mass=2.6457580e19,
|
||||||
|
apoapsis=47e6,
|
||||||
|
periapsis=47e6,
|
||||||
|
inclination=6,
|
||||||
|
)
|
||||||
|
eve = Body(
|
||||||
|
name="eve",
|
||||||
|
radius=700e3,
|
||||||
|
parent=kerbol,
|
||||||
|
mass=1.2243980e23,
|
||||||
|
apoapsis=9931011387,
|
||||||
|
periapsis=9734357701,
|
||||||
|
inclination=2.1,
|
||||||
|
)
|
||||||
|
gilly = Body(
|
||||||
|
name="gilly",
|
||||||
|
radius=13e3,
|
||||||
|
parent=eve,
|
||||||
|
mass=1.2420363e17,
|
||||||
|
apoapsis=48825000,
|
||||||
|
periapsis=14175000,
|
||||||
|
inclination=12,
|
||||||
|
)
|
Loading…
Reference in a new issue