Пример #1
0
        /// <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;
        }
Пример #2
0
 /// <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;
 }
Пример #3
0
        /// <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;
        }