function [Params, Transf, psi,V,VDk] = run(this)
    % --- Obtain simulation parameters --- 
    [Params]                  = this.setupParameters();
    this.SimulationParameters = Params;
    
    % --- Set up spatial grids and transforms --- 
    [Transf]                  = this.setupSpace(Params);
    [TransfRad]               = this.setupSpaceRadial(Params);

    % --- Initialize --- 
    mkdir(sprintf(this.SaveDirectory))
    [psi,V,VDk]               = this.initialize(Params,Transf,TransfRad);
    
    Observ.EVec = []; Observ.NormVec = []; Observ.PCVec = []; Observ.tVecPlot = []; Observ.mucVec = [];
    t_idx                     = 1; % Start at t = 0;
    Observ.res_idx            = 1;

    % --- Run Simulation --- 
    if this.DoSave
        mkdir(sprintf(strcat(this.SaveDirectory, '/Run_%03i'),Params.njob))
    end
    if strcmp(this.SimulationMode, 'EnergyMinimization')
        [psi] = this.runGradientDescent(psi,Params,Transf,VDk,V,Observ);
    else
        if strcmp(this.SimulationMode, 'RealTimeEvolution')
            this.QuenchSettings   = this.setupQuenchSettings(Params);
        end
        [psi] = this.propagateWavefunction(psi,Params,Transf,TransfRad,VDk,V,t_idx,Observ);
    end
end