The following section contains advanced tutorials, aimed at improving your Valispace skills.
Contrary to the beginner's tutorial no step-by-step instructions are given, but rather a rough guide through the main steps.

Saturn V Rocket

In this tutorial we are going to build a rough model of the Saturn V Rocket which brought mankind to the moon.
Saturn V

This tutorial aims at improving your skills of:
-> ValiTypes usage
-> usage of this()
-> Component Modelling incl. connected copies
-> Mode Management to handle mass differences along the mission timeline

And it might also teach you a thing or two about actual Rocket Science ;)

(1) Setup your Valitypes

  • Setup the following ValiTypes:
    • Mass, unit: kg , default: soc() -> set as: to be added by default to new components
    • Propellant, unit: l (litres), default: 0
    • PropellantDensity, unit kg/l, default: 0
    • PropellantMass, unit kg, default: this().Propellant * this().PropellantDensity
    • Isp (specific impulse), unit: s, default: 0
    • DeltaV, unit: m/s, default: 0

PowerUserTip: this() is a shortcut to define access to Valis in the same component. I.e. if you add PropellantMass as a Vali to Component C, then its formula will be by default translated to: $C.PropellantMass = $C.Propellant * $C.PropellantDensity when you save the vali. You will see this taking effect in step (3) of this tutorial.

(2) Build the component structure

This is a schematic of the Saturn V rocket: Saturn V schematic

Let's start building!

  • Create a new Project: Saturn_V
  • Create the top Component: Rocket
  • Add stages/components to the Rocket:
    • S_IC (first stage)
    • S_II (second stage)
    • S_IVB (third stage)
    • ApolloSpacecraft (last stage / payload)

Technically the Apollo Spacecraft is the payload and therefore not part of the Saturn V rocket, but then again what would be the fun to model the rocket without it ;)

Create Sub-Components for each stage:



To the S_IC stage, add the Structure, a FuelTank, an OxidizerTank and one F1_Engine1. Then create four additional connected copies of the engine (F1_Engine2,F1_Engine3,F1_Engine4,F1_Engine5).



To the S_II stage, add the Structure, a FuelTank, an OxidizerTank and one J2_Engine1. Create the connected copies J2_Engine2, J2_Engine3, J2_Engine4, J2_Engine5.

J-2 Engine


Create another copy of one of the J2-Engines, drag-and-drop it into the S_IVB Stage and rename it J2_Engine



To S_IVB add also the Structure, a FuelTank and an OxidizerTank, as well as the InstrumentUnit

Apollo Spacecraft

Apollo Spacecraft

Create the following Subsystems: LunarModule, CommandModule, ServiceModule and LaunchEscapeSystem


Your Valispace component-tree should look like this by now:
Saturn V - Component Tree

(3) Mass is not a simple single value for a rocket!

Since your rocket will burn fuel on its way up, its mass is not a simple constant. There are different mission phases, during which the mass is going to be different.

3.1 First Populate the simple masses

Stage 1

  • F1_EngineX.Mass = 8400 kg
    (X in F1_EngineX refers here to any of the F1_Engines, since they are connected copies)
  • S_IC.FuelTank.Mass = 12000 kg
  • S_IC.OxidizerTank.Mass = 18000 kg
  • S_IC.Structure.Mass = 57000 kg

Stage 2

  • J2_EngineX.Mass = 1788 kg
  • S_II.FuelTank.Mass = 18000 kg
  • S_II.OxidizerTank.Mass = 5800 kg
  • S_II.Structure.Mass = 10200kg

Stage 3

  • S_IVB.FuelTank.Mass = 4000 kg
  • S_IVB.OxidizerTank.Mass = 1170 kg
  • S_IVB.Structure.Mass = 6200 kg
  • InstrumentUnit.Mass = 2000 kg

Apollo Spacecraft

  • CommandModule.Mass = 5560 kg
  • ServiceModule.Mass = 24520 kg
  • LunarModule.Mass = 15200 kg
  • LaunchEscapeSystem.Mass = 3630kg

3.2 Add information about the used propellant to an Analysis

  • Create a new Analysis called Propellants
  • Create simple tables add the following info. Instead of writing the value for the density as text, create a Vali for each of the entries (RP1_density, LOX_density, LH2_density) similar to this:
    Propellant Analysis

3.3 Distinguish between "dry" and "wet" mass

While drymass refers to the mass of an object without its fuel, wetmass is the common term to describe its mass including fuel.

  • Navigate to your S_IC stage and add a Vali: Fuel2OxidizerRatio = 0.418

  • Go to your S_IC.OxidizerTank and add the following Valis:

    • Propellant = 1.3111 * 10^6 l
    • PropellantDensity = $Propellants.LOX_density
    • PropellantMass: default formula

For the last entry, the auto-completed default-formula will be this().Propellant * this().PropellantDensity. Click save and you will see that the formula will be automatically converted to $S_IC.OxidizerTank.Propellant \* $S_IC.OxidizerTank.PropellantDensity

  • Repeat the previous step for S_IC.FuelTank with the following valis:

    • Propellant = $S_IC.OxidizerTank.Propellant * $S_IC.Fuel2OxidizerRatio
    • PropellantDensity = $Propellants.RP1_density
    • PropellantMass: default formula
  • Navigate to your first stage (S_IC) and add the modes dry_wet with 3 mode-entries.

  • Open the Details of the dry_wet modes and replace the a,b and c names with:
    • DRY
    • WET
  • Now make the Mass of this stage mode-dependent on the newly created S_IC.dry_wetmode.
  • Implement the following values for the mode-dependent Mass:
    • DRY: soc()
    • WET: $S_IC.Mass.DRY + $S_IC.FuelTank.PropellantMass + $S_IC.OxidizerTank.PropellantMass

The result should like this:

3.4 Repeat the process for the other stages

Next we will repeat the steps of 3.3 for the other stages with the values stated below:

For the S-II stage use:

  • S_II.Fuel2OxidizerRatio = 3.021
  • S_II.OxidizerTank.Propellant = 0.331 * 10^6 l
  • S_II.OxidizerTank.PropellantDensity = $Propellants.LOX_density
  • S_II.OxidizerTank.PropellantMass: default formula
  • S_II.FuelTank.Propellant = $S_II.OxidizerTank.Propellant * $S_II.Fuel2OxidizerRatio
  • S_II.FuelTank.PropellantDensity = $Propellants.LH2_density
  • S_II.FuelTank.PropellantMass: default formula
  • dry_wet Modes for S_II: DRY, WET, STAGE_REMOVED
  • Mode-dependent S_II.Mass (careful to make it mode-dependent on the S_II.dry_wet and not on the S_IC.dry_wet):
    • DRY: soc()
    • WET: $S_II.Mass.DRY + $S_II.FuelTank.PropellantMass + $S_II.OxidizerTank.PropellantMass

For the S-IVB stage use:

  • S_IVB.Fuel2OxidizerRatio = 2.742
  • S_IVB.OxidizerTank.Propellant = 92350 l
  • S_IVB.OxidizerTank.PropellantDensity = $Propellants.LOX_density
  • S_IVB.OxidizerTank.PropellantMass: default formula
  • S_IVB.FuelTank.Propellant = $S_IVB.OxidizerTank.Propellant * $S_IVB.Fuel2OxidizerRatio
  • S_IVB.FuelTank.PropellantDensity = $Propellants.LH2_density
  • S_IVB.FuelTank.PropellantMass: default formula
  • dry_wet Modes for S_IVB: DRY, WET, STAGE_REMOVED
  • Mode-dependent S_IVB.Mass (again be careful to make it mode-dependent on the S_IVB.dry_wet):
    • DRY: soc()
    • WET: $S_IVB.Mass.DRY + $S_IVB.FuelTank.PropellantMass + $S_IVB.OxidizerTank.PropellantMass

3.5 Define your relevant mission phases for the rocket

Navigate to the Rocket component. You will now find an warning message (Warning 4010) next to its mass. This is because all masses of your different stages are mode-dependent (dry/wet), so Valispace cannot calculate the sum.
However we are not interested only in the dry- and wet-mass of the complete rocket, but actually in the mass during different launch phases.

The rocket separates on its way to the moon

S-IC Stage Separation

At launch the rocket is complete and all tanks are full. Just before the first separation, the tanks of the first stage are empty. Then this stage is separated from the rocket (and burns up in the atmosphere). Same happens for the second stage and third stage.
By getting rid of the empty parts of the rocket, it becomes lighter and only this enables to actually reach the moon.

Let's model these phases

  • In your Rocket component, create the Modes launch_phases and select 7 for the number of modes.
  • Open the details of these Modes and rename them as following
    • LAUNCH
  • Reload the page, to see the new names and then link the modes as follows: Mode Links
  • Make your Rocket.Mass mode dependent on the Rocket.launch_phases
    Now your Rocket.Mass should look like this over the different mission phases:
    Rocket Mass

Congratulations! You now have an overview over the mass during the mission phases. Go ahead and create an Analysis MassBudget with some nice overviews, such as a complete mass-budget and some charts. To create the right mass budget, select any of the Rocket Mass Valis such as $Rocket.Mass.LAUNCH as a basis and create it dependent on the mode Rocket.launch_phases.

Here is some inspiration:
Saturn V Mass Budget Saturn V Mass Budget Chart

Now that really gives a feeling of how much propellant is needed, to put some humans on the moon :)

(4) How to get to the moon?

Taking one step back, let's look at the big picture of how to get from Earth to the moon.

This is a (very simplified!) sequence of events:

  1. Ignition
  2. Accelerate with first stage
  3. Separate first stage from rocket
  4. Accelerate withs second stage
  5. Separate second stage from rocket
  6. Insert into Lunar Transfer Orbit with third stage burn
  7. Separate third stage from Apollo module
  8. Insert into moon-orbit with Apollo module
  9. Land on moon (!)
  10. Come back safely

A nice illustration by Mark Koeppen via

We will focus for now on steps 1-7 (which is everything up to step 23 in the infographic):

To actually reach the moon you will have to make some calculations to whether you will be able to reach it. In rocket-science we use Δv (speak "delta-vee") to calculate how much thrust a rocket has to generate in comparison to its mass, to reach celestial bodies. Let's find out how much delta-v our rocket produces, using the Ziolkowski Rocket Equation, which is defined as:
Tsiolkowski Equation

What do these variables mean?

  • delta_v is calculated per stage and then added up. If you have enough, you can reach the moon.
  • g_earth is earth's gravity constant
  • I_sp is the specific impulse of an engine
  • m_0 is the total mass of the vehicle at the beginning of the burn (including its propellant)
  • m_f is the final mass of the vehicle at the end of the burn (excluding the propellant that was fired; before the stage is discarded)

How much Δv is necessary?

Sparing you the details of orbital dynamics, we can roughly say that a Δv of at least 12.7 km/s = 12700 m/s is needed to escape the earth on an orbit that reaches the moon. Let's find out if we can reach it with our rocket.

Let's get to it:

  • Create a new Analysis called Constants
  • Write in the Analysis: g_earth = and then add a Vali (g_earth,9.81 m/s^2) to this analysis. Constants

  • Navigate to your one of the F1 engines (you can just start typing F1 in the search box above the component-tree) and add a Isp of 304 s

  • Repeat this for a J2 engine by adding a Isp of 421 s
  • Navigate to your first stage S_IC and add a vali DeltaV with the following formula:
    $Constants.g_earth * $F1_Engine1.Isp * ln($Rocket.Mass.LAUNCH / $Rocket.Mass.PRE_SEPARATION_1)
  • Repeat for your second stage S_II's DeltaV:
    $Constants.g_earth * $J2_Engine1.Isp * ln($Rocket.Mass.POST_SEPARATION_1 / $Rocket.Mass.PRE_SEPARATION_2)
  • Repeat for your third stage S_IVB's DeltaV:
    $Constants.g_earth * $J2_Engine.Isp * ln($Rocket.Mass.POST_SEPARATION_2 / $Rocket.Mass.PRE_SEPARATION_3)
  • Navigate to your Rocket and add a Vali DeltaV with the formula soc()

Oh, no. Did you also end up with a value just below the necessary 12700 m/s?
Now that I remember well, actually I had the wrong fuel-mix ratio in mind for our first stage. Luckily in Valispace everything is connected. So just go ahead and correct the S_IC.Fuel2OxidizerRatio from 0.418 to 0.618 and check again your Rocket.DeltaV!

So you say 12843 m/s?

I'd say: That's one small step for a man, one giant leap for mankind. Mission accomplished.