/// <summary> /// Runs the simulation on the current thread and waits for the simulation /// to complete before returning to caller. Simulation is NOT cloned before /// running. Use instance of Runner to get more options for running a /// simulation or groups of simulations. /// </summary> /// <param name="cancelToken">Is cancellation pending?</param> public void Run(CancellationTokenSource cancelToken = null) { IsRunning = true; Exception simulationError = null; // If the cancelToken is null then give it a default one. This can happen // when called from the unit tests. if (cancelToken == null) { cancelToken = new CancellationTokenSource(); } try { // Invoke our commencing event to let all models know we're about to start. Commencing?.Invoke(this, new EventArgs()); // Begin running the simulation. DoCommence?.Invoke(this, new CommenceArgs() { CancelToken = cancelToken }); } catch (Exception err) { // Exception occurred. Write error to summary. simulationError = new SimulationException("", err, Name, FileName); summary?.WriteError(this, simulationError.ToString()); // Rethrow exception throw simulationError; } finally { try { // Signal that the simulation is complete. Completed?.Invoke(this, new EventArgs()); IsRunning = false; } catch (Exception error) { // If an exception was thrown at this point Exception cleanupError = new SimulationException($"Error while performing simulation cleanup", error, Name, FileName); if (simulationError == null) { throw cleanupError; } throw new AggregateException(simulationError, cleanupError); } } }
/// <summary>Startup the run.</summary> public void StartRun() { timer = new Stopwatch(); timer.Start(); ConnectLinksAndEvents(); _IsRunning = true; Locater.Clear(); if (Commencing != null) { Commencing.Invoke(this, new EventArgs()); } }
/// <summary>Startup the run.</summary> public void StartRun() { timer = new Stopwatch(); timer.Start(); Apsim.ConnectEvents(this); Apsim.ResolveLinks(this); foreach (Model child in Apsim.ChildrenRecursively(this)) { Apsim.ConnectEvents(child); Apsim.ResolveLinks(child); } _IsRunning = true; Locater.Clear(); if (Commencing != null) { Commencing.Invoke(this, new EventArgs()); } }
/// <summary>Startup the run.</summary> public void StartRun() { timer = new Stopwatch(); timer.Start(); Apsim.ConnectEvents(this); Apsim.ResolveLinks(this); foreach (Model child in Apsim.ChildrenRecursively(this)) { Apsim.ConnectEvents(child); Apsim.ResolveLinks(child); } _IsRunning = true; Locater.Clear(); Console.WriteLine("Running: " + Path.GetFileNameWithoutExtension(FileName) + " - " + Name); if (Commencing != null) { Commencing.Invoke(this, new EventArgs()); } }
/// <summary> /// Runs the simulation on the current thread and waits for the simulation /// to complete before returning to caller. Simulation is NOT cloned before /// running. Use instance of Runner to get more options for running a /// simulation or groups of simulations. /// </summary> /// <param name="cancelToken">Is cancellation pending?</param> public void Run(CancellationTokenSource cancelToken = null) { // If the cancelToken is null then give it a default one. This can happen // when called from the unit tests. if (cancelToken == null) { cancelToken = new CancellationTokenSource(); } // Remove disabled models. RemoveDisabledModels(this); // If this simulation was not created from deserialisation then we need // to parent all child models correctly and call OnCreated for each model. bool hasBeenDeserialised = Children.Count > 0 && Children[0].Parent == this; if (!hasBeenDeserialised) { // Parent all models. Apsim.ParentAllChildren(this); // Call OnCreated in all models. Apsim.ChildrenRecursively(this).ForEach(m => m.OnCreated()); } if (Services == null || Services.Count < 1) { Services = new List <object>(); IDataStore storage = Apsim.Find(this, typeof(IDataStore)) as IDataStore; if (storage != null) { Services.Add(Apsim.Find(this, typeof(IDataStore))); } } var links = new Links(Services); var events = new Events(this); try { // Connect all events. events.ConnectEvents(); // Resolve all links links.Resolve(this, true); // Invoke our commencing event to let all models know we're about to start. Commencing?.Invoke(this, new EventArgs()); // Begin running the simulation. DoCommence?.Invoke(this, new CommenceArgs() { CancelToken = cancelToken }); } catch (Exception err) { // Exception occurred. Write error to summary. string errorMessage = "ERROR in file: " + FileName + Environment.NewLine + "Simulation name: " + Name + Environment.NewLine; errorMessage += err.ToString(); summary?.WriteError(this, errorMessage); // Rethrow exception throw new Exception(errorMessage, err); } finally { // Signal that the simulation is complete. Completed?.Invoke(this, new EventArgs()); // Disconnect our events. events.DisconnectEvents(); // Unresolve all links. links.Unresolve(this, true); } }
/// <summary> /// Runs the simulation on the current thread and waits for the simulation /// to complete before returning to caller. Simulation is NOT cloned before /// running. Use instance of Runner to get more options for running a /// simulation or groups of simulations. /// </summary> /// <param name="cancelToken">Is cancellation pending?</param> public void Run(CancellationTokenSource cancelToken = null) { // If the cancelToken is null then give it a default one. This can happen // when called from the unit tests. if (cancelToken == null) { cancelToken = new CancellationTokenSource(); } // Remove disabled models. RemoveDisabledModels(this); // If this simulation was not created from deserialisation then we need // to parent all child models correctly and call OnCreated for each model. bool hasBeenDeserialised = Children.Count > 0 && Children[0].Parent == this; if (!hasBeenDeserialised) { // Parent all models. this.ParentAllDescendants(); // Call OnCreated in all models. foreach (IModel model in FindAllDescendants().ToList()) { model.OnCreated(); } } // Call OnPreLink in all models. // Note the ToList(). This is important because some models can // add/remove models from the simulations tree in their OnPreLink() // method, and FindAllDescendants() is lazy. FindAllDescendants().ToList().ForEach(model => model.OnPreLink()); if (Services == null || Services.Count < 1) { var simulations = FindAncestor <Simulations>(); if (simulations != null) { Services = simulations.GetServices(); } else { Services = new List <object>(); IDataStore storage = this.FindInScope <IDataStore>(); if (storage != null) { Services.Add(this.FindInScope <IDataStore>()); } Services.Add(new ScriptCompiler()); } } var links = new Links(Services); var events = new Events(this); try { // Connect all events. events.ConnectEvents(); // Resolve all links links.Resolve(this, true); IsRunning = true; // Invoke our commencing event to let all models know we're about to start. Commencing?.Invoke(this, new EventArgs()); // Begin running the simulation. DoCommence?.Invoke(this, new CommenceArgs() { CancelToken = cancelToken }); } catch (Exception err) { // Exception occurred. Write error to summary. string errorMessage = "ERROR in file: " + FileName + Environment.NewLine + "Simulation name: " + Name + Environment.NewLine; errorMessage += err.ToString(); summary?.WriteError(this, errorMessage); // Rethrow exception throw new Exception(errorMessage, err); } finally { // Signal that the simulation is complete. Completed?.Invoke(this, new EventArgs()); // Disconnect our events. events.DisconnectEvents(); // Unresolve all links. links.Unresolve(this, true); IsRunning = false; } }