public SimulationRunResults RunSimulation() { try { updateParameterValues(); _simModelSimulation.RunSimulation(); return(new SimulationRunResults(success: true, warnings: WarningsFrom(_simModelSimulation.SolverWarnings), results: getResults())); } catch (Exception e) { return(new SimulationRunResults(success: false, warnings: WarningsFrom(_simModelSimulation.SolverWarnings), results: new DataRepository(), error: e.FullMessage())); } finally { _parameterValueCache.Clear(); } }
/// <summary> /// Perform single simulation run /// </summary> /// <param name="simulation">SimModel simulation (loaded and finalized)</param> /// <param name="coreIndex">0..NumberOfCores-1</param> /// <param name="cancellationToken">Token used to cancel the action if required</param> private void simulate(SimModelNET.ISimulation simulation, int coreIndex, CancellationToken cancellationToken) { var allIndividuals = _populationDataSplitter.GetIndividualIdsFor(coreIndex); var variableParameters = simulation.VariableParameters; var initialValues = simulation.VariableSpecies; foreach (var individualId in allIndividuals) { cancellationToken.ThrowIfCancellationRequested(); //get row indices for the simulations on current core _populationDataSplitter.UpdateParametersAndInitialValuesForIndividual(individualId, variableParameters, initialValues); //set new parameter values into SimModel simulation.SetParameterValues(variableParameters); //set new initial values into SimModel simulation.SetSpeciesProperties(initialValues); try { simulation.RunSimulation(); _populationRunResults.Add(individualResultsFrom(simulation, individualId)); } catch (Exception ex) { _populationRunResults.AddFailure(individualId, ex.FullMessage()); } finally { var warnings = simulation.SolverWarnings; _populationRunResults.AddWarnings(individualId, warnings); //Could lead to a wrong progress if two threads are accessing the value at the same time SimulationProgress(this, new PopulationSimulationProgressEventArgs(++_numberOfProcessedSimulations, _numberOfSimulationsToRun)); } } }