/** * */ package org.lemsml.jlems.api; import java.util.Collection; import org.lemsml.jlems.api.interfaces.ILEMSResultsContainer; import org.lemsml.jlems.api.interfaces.ILEMSRunConfiguration; import org.lemsml.jlems.api.interfaces.ILEMSSimulator; import org.lemsml.jlems.api.interfaces.ILEMSStateInstance; import org.lemsml.jlems.api.interfaces.IStateIdentifier; import org.lemsml.jlems.api.interfaces.IStateRecord; import org.lemsml.jlems.core.logging.E; import org.lemsml.jlems.core.run.ConnectionError; import org.lemsml.jlems.core.run.EventManager; import org.lemsml.jlems.core.run.RuntimeError; import org.lemsml.jlems.core.run.StateInstance; import org.lemsml.jlems.core.run.StateWrapper; import org.lemsml.jlems.core.sim.ContentError; import org.lemsml.jlems.core.sim.RunnableAccessor; /** * @author matteocantarelli * */ public class LEMSSimulator implements ILEMSSimulator { private EventManager _eventManager; private StateInstance _rootState; private RunnableAccessor _runnableAccessor; private ILEMSRunConfiguration _config; private int _step=0; @Override public void run(ILEMSResultsContainer results) throws LEMSExecutionException { E.info("Simulation start"); for(double t = 0; t < _config.getRuntime(); t += _config.getTimestep()) { if(t > 0) { advance(results); } } E.info("Simulation end, " + _step + " steps simulated!"); } @Override public void advance(ILEMSResultsContainer results) throws LEMSExecutionException { try { _eventManager.advance(_step); _rootState.advance(null, _step*_config.getTimestep(), _config.getTimestep()); if(_config.getRecordedStates() != null) { for(IStateRecord stateToRecord : _config.getRecordedStates()) { if(stateToRecord.record(_step)) { StateWrapper sw = _runnableAccessor.getStateWrapper(stateToRecord.getState().getStatePath()); double value = sw.getValue(); if(!results.hasState(stateToRecord.getState())) { results.addState(stateToRecord.getState(), sw.getDimensionString()); } results.addStateValue(stateToRecord.getState(), new LEMSDoubleValue(value)); } } } _step++; } catch(RuntimeError e) { throw new LEMSExecutionException(e); } catch(ContentError e) { throw new LEMSExecutionException(e); } catch(ConnectionError e) { throw new LEMSExecutionException(e); } } @Override public void initialize(ILEMSStateInstance instance, ILEMSRunConfiguration config) throws LEMSExecutionException { _eventManager = EventManager.getInstance(); _rootState = (StateInstance) instance; _runnableAccessor = new RunnableAccessor(_rootState); _config = config; try { _rootState.initialize(null); } catch(RuntimeError e) { throw new LEMSExecutionException(e); } catch(ContentError e) { throw new LEMSExecutionException(e); } } @Override public Collection<IStateIdentifier> getAvailableStates() { // _runnableAccessor.getStateWrapper(path) return null; } }