static void Main(string[] args)
    {
        //Create everything
        Data            data          = new Data();
        InputStage      inputControl  = new InputStage();
        SimulationStage simControl    = new SimulationStage();
        OutputStage     outputControl = new OutputStage();

        //Perform initialization
        data.Initialize();

        //Input Program
        inputControl.Initialize(data);
        do
        {
            data.PreUpdate();
            if (data.Input.EscapeKeyPressed)
            {
                return;
            }
            inputControl.PreUpdate(data);
            inputControl.Update();
            data.PostUpdate();
        } while (!inputControl.transitionToNextStage());
        inputControl.Finalize(data);

        //Simulation Program
        simControl.Initialize(data);
        do
        {
            data.PreUpdate();
            if (data.Input.EscapeKeyPressed)
            {
                return;
            }
            simControl.PreUpdate(data);
            simControl.Update();
            data.PostUpdate();
        } while (!simControl.transitionToNextStage());
        simControl.Finalize(data);

        //Output Program
        outputControl.Initialize(data);
        do
        {
            data.PreUpdate();
            if (data.Input.EscapeKeyPressed)
            {
                return;
            }
            outputControl.PreUpdate(data);
            outputControl.Update();
            data.PostUpdate();
        } while (!simControl.transitionToNextStage());
        outputControl.Finalize(data);
    }