-
Notifications
You must be signed in to change notification settings - Fork 73
Principia configuration files
string is any text that can be stored in a value of a KSP configuration node and retrieved by GetValue.
fixed_step_size_integrator is the name of a fixed step size integrator supported by Principia.
[Note that this is case-sensitive.]
See also the comments on the declarations of the symplectic partitioned Runge-Kutta integrators, symplectic Runge-Kutta-Nyström integrators, and symmetric linear multistep integrators and the references cited therein for more on these integrators.
fixed_step_size_integrator ⩴ BLANES_MOAN_2002_SRKN_6B
| BLANES_MOAN_2002_SRKN_11B
| BLANES_MOAN_2002_SRKN_14A
| MCLACHLAN_1995_SB3A_4
| MCLACHLAN_1995_SB3A_5
| MCLACHLAN_ATELA_1992_ORDER_4_OPTIMAL
| MCLACHLAN_ATELA_1992_ORDER_5_OPTIMAL
| OKUNBOR_SKEEL_1994_ORDER_6_METHOD_13
| QUINLAN_1999_ORDER_8A
| QUINLAN_1999_ORDER_8B
| QUINLAN_TREMAINE_1990_ORDER_8
| QUINLAN_TREMAINE_1990_ORDER_10
| QUINLAN_TREMAINE_1990_ORDER_12
| QUINLAN_TREMAINE_1990_ORDER_14
floating_point_number is a floating point number as accepted by
std::strtod.
signed_integer is a signed integer as accepted by std::strtol in base 10.
unit is one of the following units, as defined
in quantities/parser_body.hpp:
length_unit ⩴ μm | mm | cm | m | km | au
time_unit ⩴ ms | s | min | h | d
power_unit ⩴ W
angle_unit ⩴ deg | ° | rad
solid_angle_unit ⩴ sr
unit ⩴ length_unit | time_unit | power_unit | angle_unit | solid_angle_unit
quantity is defined by the following grammar from
quantities/parser.hpp:
quantity ⩴ floating_point_number quotient_unit quotient_unit ⩴ quotient_unit / exponentiation_unit | / exponentiation_unit | product_unit product_unit ⩴ exponentiation_unit [product_unit] exponentiation_unit ⩴ unit [^ exponent] exponent ⩴ signed_integer
We will use quantity(length), quantity(length / time^2), etc. to refer to quantities that are required
to have the dimensions given in parentheses.
Example:
-1.5e+09 km/sis aquantity(length / time).
instant is a date either given as a Julian Date or a Modified Julian Date (where the decimal mark must be a full stop "."), or as an ISO 8601 complete representation of date and time, where Principia requires that the comma "," be used as a decimal sign if a decimal fraction of seconds is used.
It is interpreted as TT (Temps Terrestre, terrestrial time).
Example:
JD2451545.0,MJD51544.5,2000-01-01T12:00:00,1999-W52-6T12:00:00,000,2000001T120000all represent the standard epoch J2000.
colour is an HTML style colour code in RGB order.
Example:
#aaff32
style is one of the following styles, as defined
in ksp_plugin_adapter/gl_lines.cs:
style ⩴ solid | dashed | faded
Principia supports four top-level configuration nodes.
There may be at most one of each node [for instance, having two principia_gravity_model nodes will result in a crash].
These are principia_gravity_model which defines the physical properties of the celestial bodies,
principia_initial_state which defines their initial positions and velocities,
principia_numerics_blueprint which defines the numerical methods used to compute the evolution of the system,
and principia_draw_styles which defines drawing styles for trajectories.
If principia_initial_state is provided, it must define the initial positions and velocities for all celestial bodies,
and principia_gravity_model must be sufficient for all celestial bodies.
If principia_initial_state is not provided, the initial state is obtained by interpreting KSP's orbital elements
as osculating elements for Jacobi coordinates.
In that case, principia_gravity_model need not cover all celestial bodies. It must be nominal for the bodies it covers.
The principia_gravity_model configuration consists of a sequence of body configuration nodes.
A body configuration node contains the following values:
-
This is the
nameof the celestial body whose gravity model is being defined. -
gravitational_parameter: an optionalquantity(length^3 / time^2).The gravitational parameter μ. Corresponds to the stock
gravParameter. -
reference_instant: an optionalinstant.This is the instant t0 at which the rotation W of the body is W0.
Defaults to JD2451545.0 (2000-01-01T12:00:00).
-
axis_right_ascension: an optionalquantity(angle).The angle α0.
Defaults to -90°.
-
axis_declination: an optionalquantity(angle).The angle δ0.
Defaults to 90°.
-
reference_angle: an optionalquantity(angle).The angle W0.
Defaults to the stock
initialRotation. -
angular_frequency: an optionalquantity(angle / time).The time derivative Ẇ of the angle W.
Defaults to the stock
angularV, which is indirectly configurable in Kopernicus, as it is |2π rad /rotationPeriod|.TODO(eggrobin): we don't handle retrograde rotation correctly when configured with Kopernicus (with a negative period), since
angularVis an absolute value... -
reference_radius: an optionalquantity(length).The reference radius ae used to make the spherical harmonics dimensionless.
Defaults to the stock
radius. -
j2: an optionalfloating_point_number.The unnormalized zonal harmonic J2.
Defaults to 0.
-
geopotential_row: an optional sequence ofgeopotential_rowconfiguration nodes describing the spherical harmonics of the geopotential of the body. Ageopotential_rowcontains the following values:-
degree: a requiredsigned_integer.The degree of the geopotential row.
-
geopotential_column: an optional sequence ofgeopotential_columnconfiguration nodes describing the spherical harmonics for the given degree. Ageopotential_columncontains the following values:-
order: a requiredsigned_integer.The order of the geopotential column.
-
j: an optionalfloating_point_number.The unnormalized coefficient of the zonal spherical harmonic of the given degree. For degree n, this is traditionally known as Jn.
-
cos: an optionalfloating_point_number.The normalized coefficient of the cosine spherical harmonic of the given degree and order. For degree n and order m this is traditionally known as Cnm.
-
sin: a requiredfloating_point_number.The normalized coefficient of the sine spherical harmonic of the given degree and order. For degree n and order m this is traditionally known as Snm.
-
-
A body configuration node is nominal if:
-
j2andgeopotential_rows are not present at the same time; - either
reference_radiusis absent, or one ofj2andgeopotential_rowis present; - no two
geopotential_rows share the samedegree; - within each
geopotential_row, no twogeopotential_columnsshare the sameorder; - each
geopotential_columncontains exactly one ofcosandj; - each
geopotential_columnwhosedegreeis not 0 contains acos.
A sufficient body configuration node is a nominal body configuration node where:
-
gravitational_parameter,reference_instant,axis_right_ascension,axis_declination,reference_angle, andangular_frequencyare present; -
reference_radiusis present if and only ifj2orgeopotential_rows are present.
Example: All
bodynodes in sol_gravity_model.cfg, provided with Principia, are sufficient. The Sun has aj2. The giant planets havegeopotential_rows that usej. The Earth, the Moon, Mars, and some other planets havegeopotential_rows that usecos.
The quantities W = W0 + Ẇ (t - t0), α0, and δ0 are Euler angles defining the orientation of the celestial body, as shown on figure 1 of the 2009 report of the IAU Working Group on Cartographic Coordinates and Rotational Elements, where t is terrestrial time.
The gravitational potential used is the one given in equation 6.1 of IERS technical note 36 (IERS conventions 2010), where:
μ = GM and J2 = -C̄20 √5.
Note: A dynamically oblate body has a positive J2. The values for the planets of the solar system can be found, with references, in sol_gravity_model.proto.txt.
The principia_initial_state configuration consists of:
- a
game_epochvalue; - a
solar_system_epochvalue; - a sequence of
bodyconfiguration nodes.
The game_epoch is a required instant, which is the instant at which the game starts.
The solar_system_epoch is a required instant, which is the instant at which the initial state is given.
It is required that solar_system_epoch≤game_epoch.
The body nodes must contain the following values:
-
name: a requiredstring. This is thenameof the celestial body whose initial state is being defined. -
x: a requiredquantity(length). The x coordinate of the position. -
y: a requiredquantity(length). The y coordinate of the position. -
z: a requiredquantity(length). The z coordinate of the position. -
vx: a requiredquantity(length / time). The x coordinate of the velocity. -
vy: a requiredquantity(length / time). The y coordinate of the velocity. -
vz: a requiredquantity(length / time). The z coordinate of the velocity.
Example: The sol_initial_state_jd_2433282_500000000.cfg configuration file, provided with Principia, is a valid
principia_initial_statenode.
The principia_numerics_blueprint configuration consists of:
- an optional
ephemerisnode; - an optional
historynode; - an optional
psychohistorynode.
The ephemeris node contains the following values:
-
fixed_step_size_integrator, a requiredfixed_step_size_integrator; -
integration_step_size, a requiredquantity(time). -
fitting_tolerance, a requiredquantity(length). -
geopotential_tolerance, a requiredfloating_point_number.
The integration of the motion of the celestial bodies is performed by the ephemeris with the
given fixed_step_size_integrator at the given integration_step_size. The result of the integration is approximated by a polynomial with a maximum error given by fitting_tolerance. Any geopotential effects are ignored if their relative magnitude with respect to the central force is less than geopotential_tolerance.
Example: The following
principia_numerics_blueprintnode describes the default numerics blueprint used by Principia.principia_numerics_blueprint { ephemeris { fixed_step_size_integrator = QUINLAN_TREMAINE_1990_ORDER_12 integration_step_size = 10 min fitting_tolerance = 1 mm geopotential_tolerance = 0x1.0p-24 } }
☡ The history and psychohistory nodes are reserved for internal use.
Modders should not define these nodes.
The history node contains the following values:
-
fixed_step_size_integrator, a requiredfixed_step_size_integrator; -
integration_step_size, a requiredquantity(time).
The psychohistory node contains the following values:
-
adaptive_step_size_integrator, a requiredadaptive_step_size_integrator; -
length_integration_tolerance, a requiredquantity(length); -
speed_integration_tolerance, a requiredquantity(length / time).
The principia_draw_styles configuration consists of:
- an optional
historynode; - an optional
predictionnode; - an optional
flight_plannode; - an optional
burnnode; - an optional
target_historynode; - an optional
target_predictionnode.
Each of these nodes contain the same set of values:
-
colour, a requiredcolour; -
style, a requiredstyle.
Example: The following
principia_draw_stylesnode describes the default draw styles used by Principia.principia_draw_styles { history { colour = #aaff32 // Lime style = faded } prediction { colour = #ed0dd9 // Fuchsia style = solid } flight_plan { colour = #8f99fb // Periwinkle Blue style = dashed } burn { colour = #ff81c0 // Pink style = solid } target_history { colour = #fac205 // Goldenrod style = faded } target_prediction { colour = #c292a1 // LightMauve style = solid } }
Principia performs a strict check of the KSP version in use. This means that, for instance, a version of Principia built for KSP 1.11.2 refuses to start in a KSP 1.11.3 or 1.12.0 installation. We realize that users might want to try newer versions of KSP that are not yet supported by Principia, or that KSP installations might be automatically updated by Steam. Therefore, we provide an escape hatch that makes it possible to override the version check. Note however that there will be no support whatsoever if the version check is overridden.
The principia_override_version_check configuration consists of a list of version values indicating for which versions of KSP the check should be overridden.
Example: The following
principia_override_version_checknode overrides the version check when using Principia with KSP versions 0.24.2, 1.11.3 and 2.0.666 (if that ever exists). Obviously, while 1.11.3 is a reasonable version to try to use, there is not a chance in hell of Principia working with KSP 0.24 or with KSP 2.principia_override_version_check { version = 0.24.2 version = 1.11.3 version = 2.0.666 }
The symmetric linear multistep integrators tend to be faster when they have converged to small errors, but they can fail catastrophically if they are not yet converged.
The single-step methods (symplectic partitioned Runge-Kutta, symplectic Runge-Kutta-Nyström) produce physically credible behaviour even when they have errors resulting from an overly large time step.
Solar system designers should test the actual stability of their system with a symplectic Runge-Kutta-Nyström method and a small time step, and then try increasing the step size and switching to a linear multistep integrator to reduce computational cost for their users.
The constraint that there may be at most one of each top-level configuration applies after ModuleManager has run.
In the absence of other mods, none of the configurations are present.
With RealSolarSystem, the principia_gravity_model and principia_initial_state nodes are both present, since they
use a :NEEDS[RealSolarSystem] clause.
Modders should make careful use the @ operator (modify an existing node) and :NEEDS[] clause (condition on the presence of a mod) to ensure the requirement is met.
Example: a modder creating a mod AdditionalRealBodies which adds bodies to RealSolarSystem should append their initial states to
principia_initial_stateand their sufficient gravity models toprincipia_gravity_modelwith@principia_initial_state:FOR[AdditionalRealBodies]:NEEDS[RealSolarSystem]and@principia_gravity_model:FOR[AdditionalRealBodies]:NEEDS[RealSolarSystem].
A modder creating a new solar system mod NeuesSonnensystem should create nominal gravity models in a node without any ModuleManager predicates,
principia_gravity_model. Alternatively, they can create sufficient gravity models in that node and provide an initial state inprincipia_initial_state.
If the author of NeuesSonnensystem wishes some aspect of the system to be conditioned on the presence or absence of Principia, they can do so in a patch
@Kopernicus:FOR[NeuesSonnensystem]:NEEDS[Principia]or@Kopernicus:FOR[NeuesSonnensystem]:NEEDS[!Principia].
Note that the mathematical operators of ModuleManager will not work on the quantity values of Principia
configuration nodes. Since ModuleManager is Turing-complete, we
leave it as an exercise to the reader to perform arithmetic on these values.
Modders should refer to the ModuleManager thread for documentation.
Principia for Kerbal Space Program. For support, join the IRC, or go to the KSP-RO discord server and go to the respective channel.
- Laplace
- Landau
- Lánczos
- Lamé
- Lambert
- Laguerre
- Lagrange
- Lagny
- خیام
- خوارزمی
- Kuratowski
- Kummer
- Крылов
- Kronecker
- Колмогоров
- von Koch
- Klein
- Kleene
- 𒁹𒆠𒁷𒉡
- کاشانی
- Καραθεοδωρή
- Канторович
- 掛谷
- Julia
- Jordan
- 賈憲
- 𓇹𓄟𓋴𓏲
- Jensen
- Jacobi
- 岩澤
- 伊藤
- ابن الهيثم
- Ὑπατία
- Hurwitz
- Householder
- Horner
- l’Hôpital
- Ἱπποκράτης
- Ἱππίας
- Ἵππασος
- Ἵππαρχος
- Hilbert
- Hesse
- Ἥρων
- Hermite
- Heine
- Hausdorff
- हरीश चंद्र
- Hardy
- Hamilton
- Halley
- Hadamard
- Haar
- Grothendieck
- Grossmann
- Gröbner
- Green
- Grassmann
- Goldbach
- Gödel
- Germain
- Гельфонд
- Гельфанд
- Gauss
- Gateaux
- Galois
- Gallai
- Galileo
- Fuchs
- Fubini
- Frobenius
- Frenet
- Frege
- Fréchet
- פרנקל
- Fourier
- Fibonacci
- del Ferro
- Ferrari
- Fermat
- Fatou
- Fáry
- Fano
- Euler
- Εὐκλείδης
- Εὔδοξος
- Erdős
- Ἐρατοσθένης
- Διόφαντος
- Descartes
- Desargues
- Δημόκριτος
- Dedekind
- Darboux
- Cramer
- Coxeter
- Cohen
- Clifford
- Christoffel
- 陈景润
- Chasles
- Cesàro
- Чебышёв
- Cayley
- Cauchy
- Catalan
- Cartan
- Cardano
- Cantor
- بوژگانی
- Burnside
- Буняковский
- Buffon
- Brouwer
- Bourbaki
- Borel
- Bolzano
- Bessel
- Бернштейн
- Bernoulli
- Banach
- Agnesi
- Ackermann
- Abel