/// <summary> /// Override of the canExtend method for the power subsystem /// </summary> /// <param name="newState"></param> /// <param name="universe"></param> /// <param name="evalToTime"></param> /// <returns></returns> public override bool CanExtend(Event proposedEvent, Universe universe, double evalToTime) { double ee = proposedEvent.GetEventEnd(Asset); if (ee > SimParameters.SimEndSeconds) return false; Sun sun = universe.Sun; double te = proposedEvent.State.GetLastValue(DOD_KEY).Key; if (proposedEvent.GetEventEnd(Asset) < evalToTime) proposedEvent.SetEventEnd(Asset, evalToTime); // get the dod initial conditions double olddod = proposedEvent.State.GetValueAtTime(DOD_KEY, te).Value; // collect power profile out Delegate DepCollector; SubsystemDependencyFunctions.TryGetValue("DepCollector", out DepCollector); HSFProfile<double> powerOut = (HSFProfile<double>)DepCollector.DynamicInvoke(proposedEvent); // deps->callDoubleDependency("POWERSUB_getPowerProfile"); // collect power profile in DynamicState position = Asset.AssetDynamicState; HSFProfile<double> powerIn = CalcSolarPanelPowerProfile(te, ee, proposedEvent.State, position, universe); // calculate dod rate HSFProfile<double> dodrateofchange = ((powerOut - powerIn) / _batterySize); bool exceeded_lower = false, exceeded_upper = false; double freq = 1.0; HSFProfile<double> dodProf = dodrateofchange.limitIntegrateToProf(te, ee, freq, 0.0, 1.0, ref exceeded_lower, ref exceeded_upper, 0, olddod); if (exceeded_upper) return false; if(dodProf.LastTime() != ee && ee == SimParameters.SimEndSeconds) { dodProf[ee] = dodProf.LastValue(); } proposedEvent.State.AddValue(DOD_KEY, dodProf); return true; }
/// <summary> /// The default canExtend function. May be over written for additional functionality. /// </summary> /// <param name="newState"></param> /// <param name="position"></param> /// <param name="environment"></param> /// <param name="evalToTime"></param> /// <returns></returns> public virtual bool CanExtend(Event proposedEvent, Universe environment, double evalToTime) { if (proposedEvent.GetEventEnd(Asset) < evalToTime) proposedEvent.SetEventEnd(Asset, evalToTime); return true; }
/// <summary> /// Override of the canPerform method for the power subsystem /// </summary> /// <param name="oldState"></param> /// <param name="newState"></param> /// <param name="tasks"></param> /// <param name="universe"></param> /// <returns></returns> public override bool CanPerform(Event proposedEvent, Universe universe) { //Make sure all dependent subsystems have been evaluated if (!base.CanPerform(proposedEvent, universe)) return false; double es = proposedEvent.GetEventStart(Asset); double te = proposedEvent.GetTaskEnd(Asset); double ee = proposedEvent.GetEventEnd(Asset); double powerSubPowerOut = 10; if (ee > SimParameters.SimEndSeconds) { Console.WriteLine("Simulation ended"); return false; } // get the old DOD double olddod = _newState.GetLastValue(Dkeys.First()).Value; // collect power profile out Delegate DepCollector; SubsystemDependencyFunctions.TryGetValue("DepCollector", out DepCollector); HSFProfile<double> powerOut = (HSFProfile<double>)DepCollector.DynamicInvoke(proposedEvent); // deps->callDoubleDependency("POWERSUB_getPowerProfile"); powerOut = powerOut + powerSubPowerOut; // collect power profile in DynamicState position = Asset.AssetDynamicState; HSFProfile<double> powerIn = CalcSolarPanelPowerProfile(es, te, _newState, position, universe); // calculate dod rate HSFProfile<double> dodrateofchange = ((powerOut - powerIn) / _batterySize); bool exceeded= false ; double freq = 1.0; HSFProfile<double> dodProf = dodrateofchange.lowerLimitIntegrateToProf(es, te, freq, 0.0, ref exceeded, 0, olddod); _newState.AddValue(DOD_KEY, dodProf); return true; }