270 lines
5.8 KiB
Plaintext
270 lines
5.8 KiB
Plaintext
|
|
declare function WaitForEngineStart{
|
|
wait until AnyEngineActive().
|
|
}
|
|
|
|
declare function GetDrag{
|
|
parameter lg.
|
|
return ship:sensors:acc:mag + lg.
|
|
}
|
|
|
|
declare function GetDragDir{
|
|
parameter lg, dir.
|
|
return vDot(ship:sensors:acc, dir) + lg.
|
|
}
|
|
|
|
declare function AnyEngineActive{
|
|
list engines in egs.
|
|
for eng in egs{
|
|
if eng:ignition {
|
|
return true.
|
|
}
|
|
}
|
|
return false.
|
|
}
|
|
|
|
declare function GetIsp{
|
|
LIST ENGINES IN egs.
|
|
declare local totalThrust is ship:maxThrust.
|
|
local sum is 0.
|
|
local weights is 0.
|
|
for eng in egs{
|
|
if eng:IGNITION and not eng:flameout{
|
|
local w is eng:AVAILABLETHRUST / totalThrust.
|
|
local ispW is eng:isp * w.
|
|
set sum to sum + ispW.
|
|
set weights to weights + w.
|
|
}
|
|
}
|
|
return sum / weights.
|
|
}
|
|
|
|
declare function GetIspForStage{
|
|
parameter eS, p is 0.
|
|
LIST ENGINES IN egs.
|
|
local totalThrust is GetThrustOfStage(eS, p).
|
|
if totalThrust = 0{
|
|
return 0.
|
|
}
|
|
local sum is 0.
|
|
local weights is 0.
|
|
for eng in egs{
|
|
if eng:stage = eS {
|
|
local w is eng:POSSIBLETHRUSTAT(p) / totalThrust.
|
|
local ispW is eng:ispat(p) * w.
|
|
set sum to sum + ispW.
|
|
set weights to weights + w.
|
|
}
|
|
}
|
|
return sum / weights.
|
|
}
|
|
|
|
declare function GetMaxMassFlow{
|
|
LIST ENGINES IN egs.
|
|
local sum is 0.
|
|
for eng in egs{
|
|
if eng:IGNITION and not eng:flameout{
|
|
set sum to sum + eng:maxmassflow.
|
|
}
|
|
}
|
|
return sum.
|
|
}
|
|
|
|
declare function GetMaxMassFlowForStage{
|
|
parameter eS.
|
|
LIST ENGINES IN egs.
|
|
local sum is 0.
|
|
for eng in egs{
|
|
if eng:stage = eS {
|
|
set sum to sum + eng:maxmassflow.
|
|
}
|
|
}
|
|
return sum.
|
|
}
|
|
|
|
declare function CalculateSuicideBurnDuration{
|
|
parameter isp.
|
|
return CalculateBurnDuration(verticalSpeed, isp, ship:mass, GetMaxMassFlow() * 1000).
|
|
}
|
|
|
|
declare function CalculateBurnDuration{
|
|
parameter dv, burnIsp, iM, mF.
|
|
|
|
if burnIsp = 0 {
|
|
return 0.
|
|
}
|
|
set dv to abs(dv).
|
|
local exp is -dv / (burnIsp * constant:g0).
|
|
local mR is constant:e ^ (-exp).
|
|
local fM is iM / mR.
|
|
local f is iM - fM.
|
|
|
|
if mF <= 0{
|
|
return 0.
|
|
}
|
|
|
|
return f / mF.
|
|
}
|
|
|
|
declare function CalculateSuicideBurnAltitude
|
|
{
|
|
parameter vS, lg, cAlt is 0.0, drag is 0.0.
|
|
|
|
local vertAcc is CalculateAverageDecceleration(lg, drag).
|
|
local burnAltitude is ((vS^2) / (2 * (vertAcc))).
|
|
return burnAltitude + cAlt.
|
|
}
|
|
|
|
declare function CalculateAverageDecceleration{
|
|
parameter lg.
|
|
parameter d is 0.
|
|
local maxVertAcc is (ship:availablethrust / ship:mass) - lg.
|
|
|
|
return maxVertAcc + d.
|
|
}
|
|
|
|
declare function GetLocalGravity{
|
|
parameter curAltitude is -1.
|
|
|
|
if curAltitude = -1 {
|
|
set curAltitude to altitude.
|
|
}
|
|
return body:mu / (curAltitude + body:radius)^2.
|
|
}
|
|
|
|
declare function CalculateTimeToImpact{
|
|
parameter vS, cAlt, cG, tAlt is 0.0.
|
|
|
|
if cG <= 0 or cAlt <= 0{
|
|
return 0.0.
|
|
}
|
|
|
|
set vS to abs(vS).
|
|
local g is cG.
|
|
local hRel is cAlt - tAlt.
|
|
local disc is ((vS^2) + (2 * g * hRel)).
|
|
return (vS + sqrt(disc)) / g.
|
|
}
|
|
|
|
function CalculateMultiStageBurnDuration{
|
|
parameter dv.
|
|
if ship:STAGEDELTAV(ship:stagenum):current >= dv {
|
|
return CalculateBurnDuration(dv, GetIsp(), ship:mass, GetMaxMassFlow()).
|
|
}else{
|
|
local bT is 0.
|
|
local remDv is dv.
|
|
from {local s is ship:stagenum. } until s = -1 step { set s to s-1.} do {
|
|
if remDv <= 0 {
|
|
return bT.
|
|
}
|
|
local cdv is ship:stagedeltav(s):current.
|
|
local cmass is GetMassOfStage(s).
|
|
local cflow is GetMaxMassFlowForStage(s).
|
|
local cisp is GetIspForStage(s).
|
|
local sdv is 0.
|
|
if cdv >= remDv {
|
|
set sdv to remDv.
|
|
}else{
|
|
set sdv to cdv.
|
|
}
|
|
set bT to bT + CalculateBurnDuration(sdv, cisp, cmass, cflow).
|
|
set remDv to remDv - cdv.
|
|
}
|
|
return bT.
|
|
}
|
|
}
|
|
|
|
function CalculateMultiStageBurnDurationV2{
|
|
parameter dv.
|
|
if ship:STAGEDELTAV(ship:stagenum):current >= dv {
|
|
return CalculateBurnDuration(dv, GetIsp(), ship:mass, GetMaxMassFlow()).
|
|
}else{
|
|
local bT is 0.
|
|
local remDv is dv.
|
|
from {local s is ship:stagenum. } until s = -1 step { set s to s-1.} do {
|
|
if remDv <= 0 {
|
|
return bT.
|
|
}
|
|
local cdv is ship:stagedeltav(s):current.
|
|
local cmass is GetMassOfStage(s).
|
|
local cflow is GetMaxMassFlowForStage(s).
|
|
local cisp is GetIspForStage(s).
|
|
local sdv is 0.
|
|
if cdv >= remDv {
|
|
set sdv to remDv.
|
|
}else{
|
|
set sdv to cdv.
|
|
}
|
|
set bT to bT + CalculateBurnDuration(sdv, cisp, cmass, cflow).
|
|
set remDv to remDv - cdv.
|
|
}
|
|
return bT.
|
|
}
|
|
}
|
|
|
|
function GetPerStageBurnData{
|
|
parameter pressure is 0.
|
|
local data is list().
|
|
local i is 0.
|
|
until i >= ship:stagenum {
|
|
data:add(lex()).
|
|
set data[i]["dv"] to ship:stagedeltav(i):current.
|
|
set i to i + 1.
|
|
}
|
|
LIST PARTS IN allP.
|
|
for p in allP {
|
|
IF p:ISTYPE("Engine")
|
|
{
|
|
local t is p:POSSIBLETHRUSTAT(pressure).
|
|
if data[p:stage]:haskey("thrust") {
|
|
set t to t + data[p:stage]["thrust"].
|
|
}
|
|
set data[p:stage]["thrust"] to t.
|
|
}
|
|
if p:DECOUPLEDIN < p:stage or p:DECOUPLEDIN = p:stage {
|
|
local m is p:mass.
|
|
print "s: " + p:stage + " d: " + p:DECOUPLEDIN + " n: " + p:name.
|
|
local s is max(0, p:stage).
|
|
if data[s]:haskey("mass") {
|
|
set m to m + data[s]["mass"].
|
|
}
|
|
set data[s]["mass"] to m.
|
|
}
|
|
}
|
|
set i to 0.
|
|
until i >= ship:stagenum {
|
|
if i = 0 {
|
|
set data[i]["totalMass"] to data[i]["mass"].
|
|
} else {
|
|
set data[i]["totalMass"] to data[i]["mass"] + data[i - 1]["totalMass"].
|
|
}
|
|
set i to i+1.
|
|
}
|
|
return data.
|
|
}
|
|
|
|
function GetThrustOfStage {
|
|
parameter st, p is 0.
|
|
|
|
local tTh is 0.
|
|
LIST ENGINES IN egs.
|
|
for eng in egs{
|
|
if eng:stage = st {
|
|
set tTh to tTh + eng:POSSIBLETHRUSTAT(p).
|
|
}
|
|
}
|
|
return tTh.
|
|
}
|
|
|
|
function GetMassOfStage {
|
|
parameter st.
|
|
|
|
local sum is 0.
|
|
LIST PARTS IN allP.
|
|
for p in allP {
|
|
if p:stage <= st and p:DECOUPLEDIN < st {
|
|
set sum to sum + p:mass.
|
|
}
|
|
}
|
|
return sum.
|
|
} |