# Bodies in space

The default gravity model in Multibody.jl computes the gravitational acceleration according to

$$$a = g n$$$

where $g$ and $n$ are properties of the world. The default values for these parameters are g = 9.81 and n = [0, -1, 0].

This example demonstrates how to use the point gravity model, in which the gravitational acceleration is always pointing towards the origin, with a magnitude determined by $\mu$ and $r$

$$$-\dfrac{\mu}{r^T r} \dfrac{r}{||r||}$$$

where $\mu$ is the gravity field constant (defaults to 3.986004418e14 for Earth) and $r$ is the distance of a body from the origin.

In this example, we set $\mu = 1$, point_gravity = true and let two masses orbit an invisible attractor at the origin.

using Multibody
using ModelingToolkit
using Plots
using JuliaSimCompiler
using OrdinaryDiffEq

t = Multibody.t
D = Differential(t)
W(;kwargs...) = Multibody.world

@mtkmodel PointGrav begin
@components begin
world = W()
body1 = Body(
m=1,
I_11=0.1,
I_22=0.1,
I_33=0.1,
r_0=[0,0.6,0],
isroot=true,
# quat=true, # Activate to use quaternions as state instead of Euler angles
v_0=[1,0,0])
body2 = Body(
m=1,
I_11=0.1,
I_22=0.1,
I_33=0.1,
r_0=[0.6,0.6,0],
isroot=true,
# quat=true, # Activate to use quaternions as state instead of Euler angles
v_0=[0.6,0,0])
end
end
@named model = PointGrav()
model = complete(model)
ssys = structural_simplify(IRSystem(model))
defs = [
model.world.mu => 1
model.world.point_gravity => true # The gravity model is selected here
collect(model.body1.w_a) .=> 0
collect(model.body2.w_a) .=> 0

]
prob = ODEProblem(ssys, defs, (0, 5))
sol = solve(prob, Rodas4())
plot(sol)
import GLMakie
Multibody.render(model, sol, filename = "space.gif")

## Turning gravity off

To simulate without gravity, or with a gravity corresponding to that of another celestial body, set the value of $g$ or $\mu$ appropriately for the chosen gravity model.