示例#1
0
        public Exogenous(Exogenous toCopy)
        {
            _solarElevation            = new double[24];
            _incidentDirectIrradiance  = new double[24];
            _incidentDiffuseIrradiance = new double[24];

            _incidentDirectIrradianceNIR  = new double[24];
            _incidentDiffuseIrradianceNIR = new double[24];

            _incidentDirectIrradiancePAR  = new double[24];
            _incidentDiffuseIrradiancePAR = new double[24];

            for (int i = 0; i < 24; i++)
            {
                _solarElevation[i]            = toCopy._solarElevation[i];
                _incidentDirectIrradiance[i]  = toCopy._incidentDirectIrradiance[i];
                _incidentDiffuseIrradiance[i] = toCopy._incidentDiffuseIrradiance[i];

                _incidentDirectIrradianceNIR[i]  = toCopy._incidentDirectIrradianceNIR[i];
                _incidentDiffuseIrradianceNIR[i] = toCopy._incidentDiffuseIrradianceNIR[i];

                _incidentDirectIrradiancePAR[i]  = toCopy._incidentDirectIrradiancePAR[i];
                _incidentDiffuseIrradiancePAR[i] = toCopy._incidentDiffuseIrradiancePAR[i];
            }
        }
示例#2
0
        public IrradianceBiomaWrapper(IrradianceBiomaWrapper toCopy)
        {
            irradianceState     = (toCopy.irradianceState != null) ? new INRA.SiriusQualityIrradiance.Interfaces.States(toCopy.irradianceState) : null;
            irradianceRate      = (toCopy.irradianceRate != null) ? new INRA.SiriusQualityIrradiance.Interfaces.Rates(toCopy.irradianceRate) : null;
            irradianceExogenous = (toCopy.irradianceExogenous != null) ? new INRA.SiriusQualityIrradiance.Interfaces.Exogenous(toCopy.irradianceExogenous) : null;

            absorbedIrradiance = (toCopy.absorbedIrradiance != null) ? new INRA.SiriusQualityIrradiance.Strategies.Irradiance(toCopy.absorbedIrradiance) : null;
        }
示例#3
0
        /// <summary>
        /// Calculate method for the component with test of preconditions
        /// </summary>
        /// <param name=r>Rates Domain class contains the accessors to values</param>
        /// <param name=e>Exogenous Domain class contains the accessors to values</param>
        /// <param name=s>States Domain class contains the accessors to values</param>
        /// <param name=ae>AgroManagement objects of impact parameters</param>
        /// <param name="saveLog">Save log via a writer or show on screen</param>
        /// <param name="callID">Context description for violations</param>
        public void Estimate
            (IStrategySiriusQualityIrradiance st, Rates r, Exogenous e, States s, ActEvents ae, bool saveLog, string callID)
        {
            _resultPreConditions  = String.Empty;
            _resultPostConditions = String.Empty;
            _resultPreConditions  = st.TestPreConditions(r, e, s, callID);
            st.Estimate
                (r, e, s, ae);
            _resultPostConditions = st.TestPostConditions(r, e, s, callID);

            if (_resultPreConditions != String.Empty || _resultPostConditions != String.Empty)
            {
                p.TestsOut(_resultPreConditions + _resultPostConditions, saveLog, callID);
            }
        }
示例#4
0
        public IrradianceBiomaWrapper()
        {
            irradianceState     = new INRA.SiriusQualityIrradiance.Interfaces.States();
            irradianceRate      = new INRA.SiriusQualityIrradiance.Interfaces.Rates();
            irradianceExogenous = new INRA.SiriusQualityIrradiance.Interfaces.Exogenous();

            absorbedIrradiance = new INRA.SiriusQualityIrradiance.Strategies.Irradiance();

            IsSunShadeUsed   = true;
            IsHourlyUsed     = true;
            IsCanopyUsed     = true;
            IsSphereDistUsed = true;


            loadParameters();
        }
示例#5
0
        /// <summary>
        /// Run the strategy to calculate the outputs. In case of error during the execution, the preconditions tests are executed.
        /// </summary>
        public void Estimate(INRA.SiriusQualityIrradiance.Interfaces.Rates rates, INRA.SiriusQualityIrradiance.Interfaces.Exogenous exogenous, INRA.SiriusQualityIrradiance.Interfaces.States states, CRA.AgroManagement.ActEvents actevents)
        {
            try
            {
                CalculateModel(rates, exogenous, states, actevents);

                //Uncomment the next line to use the trace
                //TraceStrategies.TraceEvent(System.Diagnostics.TraceEventType.Verbose, 1005,"Strategy: " + this.GetType().Name + " - Model executed");
            }
            catch (Exception exception)
            {
                //Uncomment the next line to use the trace
                //TraceStrategies.TraceEvent(System.Diagnostics.TraceEventType.Error, 1003,		"Strategy: " + this.GetType().Name + " - Unhandled exception running model");

                string msg = "Error in component INRA.SiriusQualityIrradiance.Strategies, strategy: " + this.GetType().Name + ": Unhandled exception running model. " + exception.GetType().FullName + " - " + exception.Message;
                throw new Exception(msg, exception);
            }
        }
        private void CalculateModel(INRA.SiriusQualityIrradiance.Interfaces.Rates rates, INRA.SiriusQualityIrradiance.Interfaces.Exogenous exogenous, INRA.SiriusQualityIrradiance.Interfaces.States states, CRA.AgroManagement.ActEvents actevents)
        {
            //GENERATED CODE END - PLACE YOUR CUSTOM CODE BELOW - Section1
            //Code written below will not be overwritten by a future code generation

            //Input

            Dictionary <int, double> k1_dirDict = states.k1_dir;

            Dictionary <int, Tuple <double, double> > gaiDict = states.layersGAI;

            // Output
            Dictionary <int, Dictionary <int, double> > I_sun_absDict   = new Dictionary <int, Dictionary <int, double> >();
            Dictionary <int, Dictionary <int, double> > I_shade_absDict = new Dictionary <int, Dictionary <int, double> >();

            // Auxiliary
            Tuple <Dictionary <int, double>, Dictionary <int, double> > absDicts;

            IEnumerable <int> layers;

            layers = gaiDict.Keys;


            // initialization
            foreach (int hour in Enumerable.Range(0, 24))
            {
                I_sun_absDict.Add(hour, new Dictionary <int, double>());
                I_shade_absDict.Add(hour, new Dictionary <int, double>());

                foreach (int layerIndex in layers)
                {
                    I_sun_absDict[hour].Add(layerIndex, 0.0);
                    I_shade_absDict[hour].Add(layerIndex, 0.0);
                }
            }


            // Hourly calculations
            foreach (int hour in Enumerable.Range(0, 24))
            {
                double k1_dir = k1_dirDict[hour];


                absDicts = HourlyAbsorbedIrradiance(k1_dir, gaiDict);

                I_sun_absDict[hour]   = absDicts.Item1;
                I_shade_absDict[hour] = absDicts.Item2;
            }

            states.sunlitFraction = I_sun_absDict;         // absorbedSunlitIrradiance;
            states.shadeFraction  = I_shade_absDict;       // absorbedShadedIrradiance;



            //End of custom code. Do not place your custom code below. It will be overwritten by a future code generation.
            //PLACE YOUR CUSTOM CODE ABOVE - GENERATED CODE START - Section1
        }
        private void CalculateModel(INRA.SiriusQualityIrradiance.Interfaces.Rates rates, INRA.SiriusQualityIrradiance.Interfaces.Exogenous exogenous, INRA.SiriusQualityIrradiance.Interfaces.States states, CRA.AgroManagement.ActEvents actevents)
        {
            //GENERATED CODE END - PLACE YOUR CUSTOM CODE BELOW - Section1
            //Code written below will not be overwritten by a future code generation

            //Input
            double[] I_dir_incDict = exogenous.incidentDirectIrradiance;
            double[] I_dif_incDict = exogenous.incidentDiffuseIrradiance;
            Dictionary <int, Tuple <double, double> > gaiDict = states.layersGAI;
            //int useHourly = irradiancestate.useHourly;
            //int useLayered = irradiancestate.useLayered;


            Dictionary <int, double> result;
            Dictionary <int, Dictionary <int, double> > I_tot_absDict = new Dictionary <int, Dictionary <int, double> >();

            rates.absorbedGlobalIrradianceLayeredHourly = new Dictionary <int, Dictionary <int, double> >();


            // Calculate incident and absorbed irradiance for each leaf layer hourly.
            foreach (int hour in Enumerable.Range(0, 24))
            {
                double I_dir = I_dir_incDict[hour];
                double I_dif = I_dif_incDict[hour];

                result = CalculateLayerHourly(I_dir, I_dif, Kl, gaiDict);

                Dictionary <int, double> absDict = result;
                //Dictionary<int, double> incDict = result.Item2;

                I_tot_absDict.Add(hour, absDict);
            }

            rates.absorbedGlobalIrradianceLayeredHourly = rates.absorbedGlobalIrradiance = I_tot_absDict;
            //irradiancestate.interceptedTotalIrradiance = I_tot_incDict;

            //End of custom code. Do not place your custom code below. It will be overwritten by a future code generation.
            //PLACE YOUR CUSTOM CODE ABOVE - GENERATED CODE START - Section1
        }
示例#8
0
        private void CalculateModel(INRA.SiriusQualityIrradiance.Interfaces.Rates rates, INRA.SiriusQualityIrradiance.Interfaces.Exogenous exogenous, INRA.SiriusQualityIrradiance.Interfaces.States states, CRA.AgroManagement.ActEvents actevents)
        {
            //GENERATED CODE END - PLACE YOUR CUSTOM CODE BELOW - Section1
            //Code written below will not be overwritten by a future code generation

            //Inputs

            double[] I_dir_inc = exogenous.incidentDirectIrradiance;
            double[] I_dif_inc = exogenous.incidentDiffuseIrradiance;
            double   rhodiff   = states.rhoCanopyDiff;
            Dictionary <int, double> rhodir = states.rhoCanopyDir;
            double kd = states.k_dif;
            Dictionary <int, double> kb = states.k_dir;
            Dictionary <int, Tuple <double, double> > gai = states.layersGAI;
            double gaiTotal = gai.Sum(x => x.Value.Item1 + x.Value.Item2);

            Dictionary <int, Dictionary <int, double> > IAbsDiff = new Dictionary <int, Dictionary <int, double> >();
            Dictionary <int, Dictionary <int, double> > IAbsDir  = new Dictionary <int, Dictionary <int, double> >();



            for (int ih = 0; ih < 24; ih++)
            {
                IAbsDir.Add(ih, new Dictionary <int, double>());
                IAbsDiff.Add(ih, new Dictionary <int, double>());

                double Iabs_b = (1 - rhodir[ih]) * I_dir_inc[ih] * (1 - Math.Exp(-kb[ih] * gaiTotal));
                IAbsDir[ih].Add(99, Iabs_b);

                double Iabs_d = (1 - rhodiff) * I_dif_inc[ih] * (1 - Math.Exp(-kd * gaiTotal));
                IAbsDiff[ih].Add(99, Iabs_d);
            }


            //Outputs
            rates.absorbedDiffIrradiance = IAbsDiff;
            rates.absorbedDirIrradiance  = IAbsDir;



            //End of custom code. Do not place your custom code below. It will be overwritten by a future code generation.
            //PLACE YOUR CUSTOM CODE ABOVE - GENERATED CODE START - Section1
        }
示例#9
0
        //Parameters static VarInfo list


        //Parameters static VarInfo list of the composite class


        #endregion

        #region pre/post conditions management

        /// <summary>
        /// Test to verify the postconditions
        /// </summary>
        public string TestPostConditions(INRA.SiriusQualityIrradiance.Interfaces.Rates rates, INRA.SiriusQualityIrradiance.Interfaces.Exogenous exogenous, INRA.SiriusQualityIrradiance.Interfaces.States states, string callID)
        {
            try
            {
                //Set current values of the outputs to the static VarInfo representing the output properties of the domain classes

                INRA.SiriusQualityIrradiance.Interfaces.RatesVarInfo.absorbedDirIrradiance.CurrentValue  = rates.absorbedDirIrradiance;
                INRA.SiriusQualityIrradiance.Interfaces.RatesVarInfo.absorbedDiffIrradiance.CurrentValue = rates.absorbedDiffIrradiance;

                //Create the collection of the conditions to test
                ConditionsCollection prc = new ConditionsCollection();
                Preconditions        pre = new Preconditions();


                RangeBasedCondition r8 = new RangeBasedCondition(INRA.SiriusQualityIrradiance.Interfaces.RatesVarInfo.absorbedDirIrradiance);
                if (r8.ApplicableVarInfoValueTypes.Contains(INRA.SiriusQualityIrradiance.Interfaces.RatesVarInfo.absorbedDirIrradiance.ValueType))
                {
                    prc.AddCondition(r8);
                }
                RangeBasedCondition r9 = new RangeBasedCondition(INRA.SiriusQualityIrradiance.Interfaces.RatesVarInfo.absorbedDiffIrradiance);
                if (r9.ApplicableVarInfoValueTypes.Contains(INRA.SiriusQualityIrradiance.Interfaces.RatesVarInfo.absorbedDiffIrradiance.ValueType))
                {
                    prc.AddCondition(r9);
                }



                //GENERATED CODE END - PLACE YOUR CUSTOM CODE BELOW - Section4
                //Code written below will not be overwritten by a future code generation



                //End of custom code. Do not place your custom code below. It will be overwritten by a future code generation.
                //PLACE YOUR CUSTOM CODE ABOVE - GENERATED CODE START - Section4

                //Get the evaluation of postconditions
                string postConditionsResult = pre.VerifyPostconditions(prc, callID);
                //if we have errors, send it to the configured output
                if (!string.IsNullOrEmpty(postConditionsResult))
                {
                    pre.TestsOut(postConditionsResult, true, "PostConditions errors in component INRA.SiriusQualityIrradiance.Strategies, strategy " + this.GetType().Name);
                }
                return(postConditionsResult);
            }
            catch (Exception exception)
            {
                //Uncomment the next line to use the trace
                //TraceStrategies.TraceEvent(System.Diagnostics.TraceEventType.Error, 1001,	"Strategy: " + this.GetType().Name + " - Unhandled exception running post-conditions");

                string msg = "Component INRA.SiriusQualityIrradiance.Strategies, " + this.GetType().Name + ": Unhandled exception running post-condition test. ";
                throw new Exception(msg, exception);
            }
        }
        private void CalculateModel(INRA.SiriusQualityIrradiance.Interfaces.Rates rates, INRA.SiriusQualityIrradiance.Interfaces.Exogenous exogenous, INRA.SiriusQualityIrradiance.Interfaces.States states, CRA.AgroManagement.ActEvents actevents)
        {
            //GENERATED CODE END - PLACE YOUR CUSTOM CODE BELOW - Section1
            //Code written below will not be overwritten by a future code generation
            // Inputs
            double rho = states.rhoLeaf;
            double tau = states.tauLeaf;
            Dictionary <int, double> k1_dir = states.k1_dir;

            // Outputs
            Dictionary <int, double> rhoDict = new Dictionary <int, double>();

            double sigma = rho + tau;

            // Reflectance coefficient of a canopy having horizontal leaves
            double rho_h = (1.0 - Math.Sqrt(1.0 - sigma)) / (1.0 + Math.Sqrt(1.0 - sigma));

            // Modification for canopy having non horizontal leaves
            foreach (KeyValuePair <int, double> entry in k1_dir)
            {
                double rho_dir = 1.0 - Math.Exp(-(2.0 * rho_h * entry.Value) / (1.0 + entry.Value));
                rhoDict.Add(entry.Key, rho_dir);
            }


            states.rhoCanopyDir = rhoDict;


            //End of custom code. Do not place your custom code below. It will be overwritten by a future code generation.
            //PLACE YOUR CUSTOM CODE ABOVE - GENERATED CODE START - Section1
        }
示例#11
0
        private void CalculateModel(INRA.SiriusQualityIrradiance.Interfaces.Rates rates, INRA.SiriusQualityIrradiance.Interfaces.Exogenous exogenous, INRA.SiriusQualityIrradiance.Interfaces.States states, CRA.AgroManagement.ActEvents actevents)
        {
            //GENERATED CODE END - PLACE YOUR CUSTOM CODE BELOW - Section1
            //Code written below will not be overwritten by a future code generation

            double[] beta_sun = exogenous.solarElevation;

            //Outpus
            Dictionary <int, double> K1_dirDict = new Dictionary <int, double>();

            // Extinction coefficient for direct irradiances (beam and scattered)
            foreach (int hour in Enumerable.Range(0, 24))
            {
                double beta_sun_Hourly = Math.Max(0.00174533, beta_sun[hour]); // Minium allowed angle is 0.1 � to avoid numerical instability
                double k1_dir          = CI * 0.5 / Math.Sin(beta_sun_Hourly); // beam coef
                K1_dirDict.Add(hour, Math.Min(k1_dir, 999));
            }

            states.k1_dir = K1_dirDict;

            //End of custom code. Do not place your custom code below. It will be overwritten by a future code generation.
            //PLACE YOUR CUSTOM CODE ABOVE - GENERATED CODE START - Section1
        }
示例#12
0
 /// <summary>
 /// Calculate method for the component
 /// </summary>
 /// <param name=r>Rates Domain class contains the accessors to values</param>
 /// <param name=e>Exogenous Domain class contains the accessors to values</param>
 /// <param name=s>States Domain class contains the accessors to values</param>
 /// <param name=ae>AgroManagement objects of impact parameters</param>
 public void Estimate
     (IStrategySiriusQualityIrradiance st, Rates r, Exogenous e, States s, ActEvents ae)
 {
     st.Estimate
         (r, e, s, ae);
 }
        private void CalculateModel(INRA.SiriusQualityIrradiance.Interfaces.Rates rates, INRA.SiriusQualityIrradiance.Interfaces.Exogenous exogenous, INRA.SiriusQualityIrradiance.Interfaces.States states, CRA.AgroManagement.ActEvents actevents)
        {
            //GENERATED CODE END - PLACE YOUR CUSTOM CODE BELOW - Section1
            //Code written below will not be overwritten by a future code generation

            #region Inputs

            double TT     = states.cumulTT;
            double TTGS30 = states.termSpikletTT;
            double TTGS39 = states.flagLeafLiguleTT;
            double hs     = states.HS;
            double fln    = states.FLN;
            double P      = states.Phyll;

            #endregion

            double a = 0.0;


            if (TT <= TTGS30 || TTGS30 == -999)
            {
                a    = alaJuv;
                hs30 = hs;
                tt30 = TT;
            }
            else if ((TT > TTGS30 && TTGS39 == -999) || (TT > TTGS30 && TT < TTGS39))
            {
                a = alaJuv + (TT - tt30) * ((alaMat - alaJuv) / (P * (fln - hs30)));
                a = Math.Min(alaMat, Math.Max(alaJuv, a));
            }
            else if (TT >= TTGS39)
            {
                a = alaMat;
            }



            #region Output

            states.ala = Math.Min(80.0 * (Math.PI / 180), a);

            #endregion



            //End of custom code. Do not place your custom code below. It will be overwritten by a future code generation.
            //PLACE YOUR CUSTOM CODE ABOVE - GENERATED CODE START - Section1
        }
        /// <summary>
        /// Test to verify the preconditions
        /// </summary>
        public string TestPreConditions(INRA.SiriusQualityIrradiance.Interfaces.Rates rates, INRA.SiriusQualityIrradiance.Interfaces.Exogenous exogenous, INRA.SiriusQualityIrradiance.Interfaces.States states, string callID)
        {
            try
            {
                //Set current values of the inputs to the static VarInfo representing the input properties of the domain classes

                INRA.SiriusQualityIrradiance.Interfaces.StatesVarInfo.cumulTT.CurrentValue          = states.cumulTT;
                INRA.SiriusQualityIrradiance.Interfaces.StatesVarInfo.flagLeafLiguleTT.CurrentValue = states.flagLeafLiguleTT;
                INRA.SiriusQualityIrradiance.Interfaces.StatesVarInfo.FLN.CurrentValue           = states.FLN;
                INRA.SiriusQualityIrradiance.Interfaces.StatesVarInfo.HS.CurrentValue            = states.HS;
                INRA.SiriusQualityIrradiance.Interfaces.StatesVarInfo.Phyll.CurrentValue         = states.Phyll;
                INRA.SiriusQualityIrradiance.Interfaces.StatesVarInfo.termSpikletTT.CurrentValue = states.termSpikletTT;

                //Create the collection of the conditions to test
                ConditionsCollection prc = new ConditionsCollection();
                Preconditions        pre = new Preconditions();


                RangeBasedCondition r1 = new RangeBasedCondition(INRA.SiriusQualityIrradiance.Interfaces.StatesVarInfo.cumulTT);
                if (r1.ApplicableVarInfoValueTypes.Contains(INRA.SiriusQualityIrradiance.Interfaces.StatesVarInfo.cumulTT.ValueType))
                {
                    prc.AddCondition(r1);
                }
                RangeBasedCondition r2 = new RangeBasedCondition(INRA.SiriusQualityIrradiance.Interfaces.StatesVarInfo.flagLeafLiguleTT);
                if (r2.ApplicableVarInfoValueTypes.Contains(INRA.SiriusQualityIrradiance.Interfaces.StatesVarInfo.flagLeafLiguleTT.ValueType))
                {
                    prc.AddCondition(r2);
                }
                RangeBasedCondition r3 = new RangeBasedCondition(INRA.SiriusQualityIrradiance.Interfaces.StatesVarInfo.FLN);
                if (r3.ApplicableVarInfoValueTypes.Contains(INRA.SiriusQualityIrradiance.Interfaces.StatesVarInfo.FLN.ValueType))
                {
                    prc.AddCondition(r3);
                }
                RangeBasedCondition r4 = new RangeBasedCondition(INRA.SiriusQualityIrradiance.Interfaces.StatesVarInfo.HS);
                if (r4.ApplicableVarInfoValueTypes.Contains(INRA.SiriusQualityIrradiance.Interfaces.StatesVarInfo.HS.ValueType))
                {
                    prc.AddCondition(r4);
                }
                RangeBasedCondition r5 = new RangeBasedCondition(INRA.SiriusQualityIrradiance.Interfaces.StatesVarInfo.Phyll);
                if (r5.ApplicableVarInfoValueTypes.Contains(INRA.SiriusQualityIrradiance.Interfaces.StatesVarInfo.Phyll.ValueType))
                {
                    prc.AddCondition(r5);
                }
                RangeBasedCondition r6 = new RangeBasedCondition(INRA.SiriusQualityIrradiance.Interfaces.StatesVarInfo.termSpikletTT);
                if (r6.ApplicableVarInfoValueTypes.Contains(INRA.SiriusQualityIrradiance.Interfaces.StatesVarInfo.termSpikletTT.ValueType))
                {
                    prc.AddCondition(r6);
                }
                prc.AddCondition(new RangeBasedCondition(_modellingOptionsManager.GetParameterByName("alaJuv")));
                prc.AddCondition(new RangeBasedCondition(_modellingOptionsManager.GetParameterByName("alaMat")));



                //GENERATED CODE END - PLACE YOUR CUSTOM CODE BELOW - Section3
                //Code written below will not be overwritten by a future code generation



                //End of custom code. Do not place your custom code below. It will be overwritten by a future code generation.
                //PLACE YOUR CUSTOM CODE ABOVE - GENERATED CODE START - Section3

                //Get the evaluation of preconditions;
                string preConditionsResult = pre.VerifyPreconditions(prc, callID);
                //if we have errors, send it to the configured output
                if (!string.IsNullOrEmpty(preConditionsResult))
                {
                    pre.TestsOut(preConditionsResult, true, "PreConditions errors in component INRA.SiriusQualityIrradiance.Strategies, strategy " + this.GetType().Name);
                }
                return(preConditionsResult);
            }
            catch (Exception exception)
            {
                //Uncomment the next line to use the trace
                //	TraceStrategies.TraceEvent(System.Diagnostics.TraceEventType.Error, 1002,"Strategy: " + this.GetType().Name + " - Unhandled exception running pre-conditions");

                string msg = "Component INRA.SiriusQualityIrradiance.Strategies, " + this.GetType().Name + ": Unhandled exception running pre-condition test. ";
                throw new Exception(msg, exception);
            }
        }
        private void CalculateModel(INRA.SiriusQualityIrradiance.Interfaces.Rates rates, INRA.SiriusQualityIrradiance.Interfaces.Exogenous exogenous, INRA.SiriusQualityIrradiance.Interfaces.States states, CRA.AgroManagement.ActEvents actevents)
        {
            //GENERATED CODE END - PLACE YOUR CUSTOM CODE BELOW - Section1
            //Code written below will not be overwritten by a future code generation
            //Input
            double[] beta_sun  = exogenous.solarElevation;
            double   alphaMean = states.ala;

            //Outpus
            Dictionary <int, double> K1_dirDict = new Dictionary <int, double>();


            for (int hour = 0; hour < 24; hour++)
            {
                double k1_dir = 0.0;
                double Chi    = Math.Pow(alphaMean / 9.65, -0.6061) - 3;

                k1_dir = CI * (Math.Sqrt(Math.Pow(Chi, 2) + (1 / Math.Pow(Math.Tan(beta_sun[hour]), 2)))) / (Chi + 1.774 * Math.Pow(Chi + 1.182, -0.733));

                K1_dirDict.Add(hour, Math.Min(k1_dir, 999));
            }


            states.k1_dir = K1_dirDict;

            //End of custom code. Do not place your custom code below. It will be overwritten by a future code generation.
            //PLACE YOUR CUSTOM CODE ABOVE - GENERATED CODE START - Section1
        }
示例#16
0
        private void CalculateModel(INRA.SiriusQualityIrradiance.Interfaces.Rates rates, INRA.SiriusQualityIrradiance.Interfaces.Exogenous exogenous, INRA.SiriusQualityIrradiance.Interfaces.States states, CRA.AgroManagement.ActEvents actevents)
        {
            //GENERATED CODE END - PLACE YOUR CUSTOM CODE BELOW - Section1
            //Code written below will not be overwritten by a future code generation

            //Inputs
            double rho       = states.rhoLeaf;
            double tau       = states.tauLeaf;
            double alphaMean = states.ala;
            double sigma     = rho + tau;

            Func <double, double> f = null;

            double rhoh = (1 - Math.Sqrt(1 - sigma)) / (1 + Math.Sqrt(1 - sigma));

            if (useSphericalLeafDistrib == 1)
            {
                f = x => (1 - Math.Exp(-((2.0 * rhoh * CI * 0.5 / Math.Sin(Math.Max(0.00174533, x))) / (1 + CI * 0.5 / Math.Sin(Math.Max(0.00174533, x)))))) * Math.Cos(x) * Math.Sin(x);
            }
            else
            {
                double Chi = Math.Pow(alphaMean / 9.65, -0.6061) - 3;

                f = x => (1 - Math.Exp(-((2.0 * rhoh * (CI * (Math.Sqrt(Math.Pow(Chi, 2) + (1 / Math.Pow(Math.Tan(x), 2)))) / (Chi + 1.774 * Math.Pow(Chi + 1.182, -0.733)))) / (1 + (CI * (Math.Sqrt(Math.Pow(Chi, 2) + (1 / Math.Pow(Math.Tan(x), 2)))) / (Chi + 1.774 * Math.Pow(Chi + 1.182, -0.733))))))) * Math.Cos(x) * Math.Sin(x);
            }


            states.rhoCanopyDiff = 2.0 * GaussLegendreRule.Integrate(f, 0.0, Math.PI / 2.0, 30);


            //End of custom code. Do not place your custom code below. It will be overwritten by a future code generation.
            //PLACE YOUR CUSTOM CODE ABOVE - GENERATED CODE START - Section1
        }
示例#17
0
        private void CalculateModel(INRA.SiriusQualityIrradiance.Interfaces.Rates rates, INRA.SiriusQualityIrradiance.Interfaces.Exogenous exogenous, INRA.SiriusQualityIrradiance.Interfaces.States states, CRA.AgroManagement.ActEvents actevents)
        {
            //GENERATED CODE END - PLACE YOUR CUSTOM CODE BELOW - Section1
            //Code written below will not be overwritten by a future code generation

            #region Inputs

            double GAITot = states.layersGAI.Sum(x => x.Value.Item1 + x.Value.Item2);

            //Ellipse
            double alphaMean = states.ala;
            double rho       = states.rhoLeaf;
            double tau       = states.tauLeaf;
            double sigma     = rho + tau;

            #endregion

            Dictionary <int, double> K_dirDict = new Dictionary <int, double>();

            double[] angles = new double[6] {
                15.0, 30.0, 45.0, 60.0, 75.0, 90.0
            };
            double[] anglesRad = new double[6];
            for (int ia = 0; ia < 6; ia++)
            {
                anglesRad[ia] = angles[ia] * Math.PI / 180;
            }

            if (useSphericalLeafDistrib == 0)
            {
                for (int ia = 0; ia < 6; ia++)
                {
                    double k1_dir = 0.0;
                    double Chi    = Math.Pow(alphaMean / 9.65, -0.6061) - 3;

                    k1_dir = CI * (Math.Sqrt(Math.Pow(Chi, 2) + (Math.Pow(1 / Math.Tan(anglesRad[ia]), 2)))) / (Chi + 1.774 * Math.Pow(Chi + 1.182, -0.733));

                    K_dirDict.Add(ia, Math.Min(k1_dir * Math.Sqrt(1.0 - sigma), 999));
                }
            }
            else
            {
                // Extinction coefficient for direct irradiances (beam and scattered)
                // Note: a spherical distribution for leaf inclination angle is assumed.
                for (int ia = 0; ia < 6; ia++)
                {
                    double beta_sun_Hourly = Math.Max(0.00174533, anglesRad[ia]);  // Minium allowed angle is 0.1 � to avoid numerical instability
                    double k1_dir          = CI * 0.5 / Math.Sin(beta_sun_Hourly); // beam coef
                    K_dirDict.Add(ia, Math.Min(k1_dir * Math.Sqrt(1.0 - sigma), 999));
                }
            }

            Dictionary <double, double> fipb = new Dictionary <double, double>();


            for (int iangle = 0; iangle < 6; iangle++)
            {
                fipb.Add(angles[iangle], 1.0 - Math.Exp(-K_dirDict[iangle] * GAITot));
            }

            #region Output

            states.fiPARb = new Dictionary <double, double>(fipb);

            #endregion

            //End of custom code. Do not place your custom code below. It will be overwritten by a future code generation.
            //PLACE YOUR CUSTOM CODE ABOVE - GENERATED CODE START - Section1
        }
示例#18
0
        private void CalculateModel(INRA.SiriusQualityIrradiance.Interfaces.Rates rates, INRA.SiriusQualityIrradiance.Interfaces.Exogenous exogenous, INRA.SiriusQualityIrradiance.Interfaces.States states, CRA.AgroManagement.ActEvents actevents)
        {
            //GENERATED CODE END - PLACE YOUR CUSTOM CODE BELOW - Section1
            //Code written below will not be overwritten by a future code generation

            //Input
            double[] I_dir_inc = exogenous.incidentDirectIrradiance;
            double[] I_dif_inc = exogenous.incidentDiffuseIrradiance;
            double   rho       = states.rhoLeaf;
            double   tau       = states.tauLeaf;
            Dictionary <int, double> k1_dirDict = states.k1_dir;
            Dictionary <int, double> k_dirDict  = states.k_dir;
            double k_dif = states.k_dif;
            Dictionary <int, double> rho_dirDict = states.rhoCanopyDir;
            double rho_dif = states.rhoCanopyDiff;
            Dictionary <int, Dictionary <int, double> > Idiff = rates.absorbedDiffIrradiance;
            Dictionary <int, Dictionary <int, double> > Idir  = rates.absorbedDirIrradiance;

            Dictionary <int, Tuple <double, double> > gaiDict = states.layersGAI;

            // Output
            Dictionary <int, Dictionary <int, double> > I_sun_absDict   = new Dictionary <int, Dictionary <int, double> >();
            Dictionary <int, Dictionary <int, double> > I_shade_absDict = new Dictionary <int, Dictionary <int, double> >();

            // Auxiliary
            Tuple <Dictionary <int, double>, Dictionary <int, double> > absDicts;

            IEnumerable <int> layers;

            layers = gaiDict.Keys;

            double sigma = rho + tau;


            // initialization
            foreach (int hour in Enumerable.Range(0, 24))
            {
                I_sun_absDict.Add(hour, new Dictionary <int, double>());
                I_shade_absDict.Add(hour, new Dictionary <int, double>());

                foreach (int layerIndex in layers)
                {
                    I_sun_absDict[hour].Add(layerIndex, 0.0);
                    I_shade_absDict[hour].Add(layerIndex, 0.0);
                }
            }


            // Hourly calculations
            foreach (int hour in Enumerable.Range(0, 24))
            {
                double I_dir   = I_dir_inc[hour];
                double I_dif   = I_dif_inc[hour];
                double k1_dir  = k1_dirDict[hour];
                double k_dir   = k_dirDict[hour];
                double rho_dir = rho_dirDict[hour];
                Dictionary <int, double> Ig = new Dictionary <int, double>();


                foreach (int il in Idiff[hour].Keys)
                {
                    Ig.Add(il, Idiff[hour][il] + Idir[hour][il]);
                }

                absDicts = HourlyAbsorbedIrradiance(I_dir, I_dif, k1_dir, k_dir, rho_dir, gaiDict, sigma, rho_dif, k_dif, Ig);

                I_sun_absDict[hour]   = absDicts.Item1;
                I_shade_absDict[hour] = absDicts.Item2;
            }

            rates.absorbedSunlitIrradiance = I_sun_absDict;     // absorbedSunlitIrradiance;
            rates.absorbedShadedIrradiance = I_shade_absDict;   // absorbedShadedIrradiance;


            //End of custom code. Do not place your custom code below. It will be overwritten by a future code generation.
            //PLACE YOUR CUSTOM CODE ABOVE - GENERATED CODE START - Section1
        }
示例#19
0
        private void CalculateModel(INRA.SiriusQualityIrradiance.Interfaces.Rates rates, INRA.SiriusQualityIrradiance.Interfaces.Exogenous exogenous, INRA.SiriusQualityIrradiance.Interfaces.States states, CRA.AgroManagement.ActEvents actevents)
        {
            //GENERATED CODE END - PLACE YOUR CUSTOM CODE BELOW - Section1
            //Code written below will not be overwritten by a future code generation
            //Inputs
            double rho       = states.rhoLeaf;
            double tau       = states.tauLeaf;
            double alphaMean = states.ala;
            Dictionary <int, Tuple <double, double> > gai = states.layersGAI;
            double L_tot  = gai.Sum(x => x.Value.Item1 + x.Value.Item2);
            double sigma  = rho + tau;
            double Sum_kd = 0.0;

            Func <double, double> f = null;

            if (useSphericalLeafDistrib == 1)
            {
                f = x => (1 - Math.Exp(-(CI * Math.Sqrt(1.0 - sigma) * 0.5 / Math.Sin(Math.Max(0.00174533, x))) * L_tot)) * Math.Cos(x) * Math.Sin(x);
            }
            else
            {
                double Chi = Math.Pow(alphaMean / 9.65, -0.6061) - 3;
                f = x => (1 - Math.Exp(-(CI * Math.Sqrt(1.0 - sigma) * (Math.Sqrt(Math.Pow(Chi, 2) + (1 / Math.Pow(Math.Tan(x), 2)))) / (Chi + 1.774 * Math.Pow(Chi + 1.182, -0.733))) * L_tot)) * Math.Cos(x) * Math.Sin(x);
            }


            Sum_kd = Math.Max(1E-06, GaussLegendreRule.Integrate(f, 0.0, Math.PI / 2.0, 30));

            //Outputs
            states.k_dif = Math.Min(1.0, -(1 / L_tot) * Math.Log(1.0 - 2.0 * Sum_kd));


            double Sum_kdBlack = 0.0;

            Func <double, double> fBlack = null;

            if (useSphericalLeafDistrib == 1)
            {
                fBlack = x => (1 - Math.Exp(-(CI * 0.5 / Math.Sin(Math.Max(0.00174533, x))) * L_tot)) * Math.Cos(x) * Math.Sin(x);
            }
            else
            {
                double Chi = Math.Pow(alphaMean / 9.65, -0.6061) - 3;
                fBlack = x => (1 - Math.Exp(-(CI * (Math.Sqrt(Math.Pow(Chi, 2) + (1 / Math.Pow(Math.Tan(x), 2)))) / (Chi + 1.774 * Math.Pow(Chi + 1.182, -0.733))) * L_tot)) * Math.Cos(x) * Math.Sin(x);
            }


            Sum_kdBlack = Math.Max(1E-06, GaussLegendreRule.Integrate(fBlack, 0.0, Math.PI / 2.0, 30));

            //Outputs
            states.k_difBlack = Math.Min(1.0, -(1 / L_tot) * Math.Log(1.0 - 2.0 * Sum_kdBlack));


            //End of custom code. Do not place your custom code below. It will be overwritten by a future code generation.
            //PLACE YOUR CUSTOM CODE ABOVE - GENERATED CODE START - Section1
        }
示例#20
0
        /// <summary>
        /// Test to verify the preconditions
        /// </summary>
        public string TestPreConditions(INRA.SiriusQualityIrradiance.Interfaces.Rates rates, INRA.SiriusQualityIrradiance.Interfaces.Exogenous exogenous, INRA.SiriusQualityIrradiance.Interfaces.States states, string callID)
        {
            try
            {
                //Set current values of the inputs to the static VarInfo representing the input properties of the domain classes

                INRA.SiriusQualityIrradiance.Interfaces.StatesVarInfo.k_dif.CurrentValue         = states.k_dif;
                INRA.SiriusQualityIrradiance.Interfaces.StatesVarInfo.k_dir.CurrentValue         = states.k_dir;
                INRA.SiriusQualityIrradiance.Interfaces.StatesVarInfo.rhoCanopyDiff.CurrentValue = states.rhoCanopyDiff;
                INRA.SiriusQualityIrradiance.Interfaces.StatesVarInfo.rhoCanopyDir.CurrentValue  = states.rhoCanopyDir;
                INRA.SiriusQualityIrradiance.Interfaces.StatesVarInfo.layersGAI.CurrentValue     = states.layersGAI;
                INRA.SiriusQualityIrradiance.Interfaces.ExogenousVarInfo.incidentDiffuseIrradiance.CurrentValue = exogenous.incidentDiffuseIrradiance;
                INRA.SiriusQualityIrradiance.Interfaces.ExogenousVarInfo.incidentDirectIrradiance.CurrentValue  = exogenous.incidentDirectIrradiance;

                //Create the collection of the conditions to test
                ConditionsCollection prc = new ConditionsCollection();
                Preconditions        pre = new Preconditions();


                RangeBasedCondition r1 = new RangeBasedCondition(INRA.SiriusQualityIrradiance.Interfaces.StatesVarInfo.k_dif);
                if (r1.ApplicableVarInfoValueTypes.Contains(INRA.SiriusQualityIrradiance.Interfaces.StatesVarInfo.k_dif.ValueType))
                {
                    prc.AddCondition(r1);
                }
                RangeBasedCondition r2 = new RangeBasedCondition(INRA.SiriusQualityIrradiance.Interfaces.StatesVarInfo.k_dir);
                if (r2.ApplicableVarInfoValueTypes.Contains(INRA.SiriusQualityIrradiance.Interfaces.StatesVarInfo.k_dir.ValueType))
                {
                    prc.AddCondition(r2);
                }
                RangeBasedCondition r3 = new RangeBasedCondition(INRA.SiriusQualityIrradiance.Interfaces.StatesVarInfo.rhoCanopyDiff);
                if (r3.ApplicableVarInfoValueTypes.Contains(INRA.SiriusQualityIrradiance.Interfaces.StatesVarInfo.rhoCanopyDiff.ValueType))
                {
                    prc.AddCondition(r3);
                }
                RangeBasedCondition r4 = new RangeBasedCondition(INRA.SiriusQualityIrradiance.Interfaces.StatesVarInfo.rhoCanopyDir);
                if (r4.ApplicableVarInfoValueTypes.Contains(INRA.SiriusQualityIrradiance.Interfaces.StatesVarInfo.rhoCanopyDir.ValueType))
                {
                    prc.AddCondition(r4);
                }
                RangeBasedCondition r5 = new RangeBasedCondition(INRA.SiriusQualityIrradiance.Interfaces.StatesVarInfo.layersGAI);
                if (r5.ApplicableVarInfoValueTypes.Contains(INRA.SiriusQualityIrradiance.Interfaces.StatesVarInfo.layersGAI.ValueType))
                {
                    prc.AddCondition(r5);
                }
                RangeBasedCondition r6 = new RangeBasedCondition(INRA.SiriusQualityIrradiance.Interfaces.ExogenousVarInfo.incidentDiffuseIrradiance);
                if (r6.ApplicableVarInfoValueTypes.Contains(INRA.SiriusQualityIrradiance.Interfaces.ExogenousVarInfo.incidentDiffuseIrradiance.ValueType))
                {
                    prc.AddCondition(r6);
                }
                RangeBasedCondition r7 = new RangeBasedCondition(INRA.SiriusQualityIrradiance.Interfaces.ExogenousVarInfo.incidentDirectIrradiance);
                if (r7.ApplicableVarInfoValueTypes.Contains(INRA.SiriusQualityIrradiance.Interfaces.ExogenousVarInfo.incidentDirectIrradiance.ValueType))
                {
                    prc.AddCondition(r7);
                }



                //GENERATED CODE END - PLACE YOUR CUSTOM CODE BELOW - Section3
                //Code written below will not be overwritten by a future code generation



                //End of custom code. Do not place your custom code below. It will be overwritten by a future code generation.
                //PLACE YOUR CUSTOM CODE ABOVE - GENERATED CODE START - Section3

                //Get the evaluation of preconditions;
                string preConditionsResult = pre.VerifyPreconditions(prc, callID);
                //if we have errors, send it to the configured output
                if (!string.IsNullOrEmpty(preConditionsResult))
                {
                    pre.TestsOut(preConditionsResult, true, "PreConditions errors in component INRA.SiriusQualityIrradiance.Strategies, strategy " + this.GetType().Name);
                }
                return(preConditionsResult);
            }
            catch (Exception exception)
            {
                //Uncomment the next line to use the trace
                //	TraceStrategies.TraceEvent(System.Diagnostics.TraceEventType.Error, 1002,"Strategy: " + this.GetType().Name + " - Unhandled exception running pre-conditions");

                string msg = "Component INRA.SiriusQualityIrradiance.Strategies, " + this.GetType().Name + ": Unhandled exception running pre-condition test. ";
                throw new Exception(msg, exception);
            }
        }
示例#21
0
        private void CalculateModel(INRA.SiriusQualityIrradiance.Interfaces.Rates rates, INRA.SiriusQualityIrradiance.Interfaces.Exogenous exogenous, INRA.SiriusQualityIrradiance.Interfaces.States states, CRA.AgroManagement.ActEvents actevents)
        {
            //GENERATED CODE END - PLACE YOUR CUSTOM CODE BELOW - Section1
            //Code written below will not be overwritten by a future code generation

            //Inpput
            Dictionary <int, Dictionary <int, double> > I_tot_absDict = rates.absorbedGlobalIrradianceLayeredHourly;

            // Return daily abs and inc irradiance values if needed
            Dictionary <int, Dictionary <int, double> > tempo = new Dictionary <int, Dictionary <int, double> >();

            tempo.Add(99, new Dictionary <int, double>());        // 99 indicates a daily value (one timeStep key only)
            // Create an intial dictionary of 0 absorbed irradiance per layer.
            foreach (int layerIndex in I_tot_absDict[0].Keys)
            {
                tempo[99].Add(layerIndex, 0);
            }

            // Sum up aborbed irradiance over the day hours
            foreach (int hour in Enumerable.Range(0, 24))
            {
                foreach (int layerIndex in I_tot_absDict[hour].Keys)
                {
                    tempo[99][layerIndex] += I_tot_absDict[hour][layerIndex];
                }
            }
            I_tot_absDict = SiriusQuality_IrradianceStrategies.Utilities.CloneDictionary.CloneDict(tempo);


            rates.absorbedGlobalIrradiance = I_tot_absDict;


            //End of custom code. Do not place your custom code below. It will be overwritten by a future code generation.
            //PLACE YOUR CUSTOM CODE ABOVE - GENERATED CODE START - Section1
        }
示例#22
0
        private void CalculateModel(INRA.SiriusQualityIrradiance.Interfaces.Rates rates, INRA.SiriusQualityIrradiance.Interfaces.Exogenous exogenous, INRA.SiriusQualityIrradiance.Interfaces.States states, CRA.AgroManagement.ActEvents actevents)
        {
            //GENERATED CODE END - PLACE YOUR CUSTOM CODE BELOW - Section1
            //Code written below will not be overwritten by a future code generation

            //Inputs

            double[] I_dir_inc = exogenous.incidentDirectIrradiance;
            double[] I_dif_inc = exogenous.incidentDiffuseIrradiance;
            double   rhodiff   = states.rhoCanopyDiff;
            Dictionary <int, double> rhodir = states.rhoCanopyDir;
            double kd = states.k_dif;
            Dictionary <int, double> kb = states.k_dir;
            Dictionary <int, Tuple <double, double> > gai = states.layersGAI;

            Dictionary <int, Dictionary <int, double> > IAbsDiff = new Dictionary <int, Dictionary <int, double> >();
            Dictionary <int, Dictionary <int, double> > IAbsDir  = new Dictionary <int, Dictionary <int, double> >();



            for (int ih = 0; ih < 24; ih++)
            {
                IAbsDir.Add(ih, new Dictionary <int, double>());
                IAbsDiff.Add(ih, new Dictionary <int, double>());

                double upperCumGAI = new double();
                double lowerCumGAI = 0.0;
                double layerGAI    = new double();

                for (int layerIndex = gai.Count - 1; layerIndex >= 0; --layerIndex)
                {
                    layerGAI = Math.Max(0.000001, gai[layerIndex].Item1 + gai[layerIndex].Item2);

                    upperCumGAI  = lowerCumGAI;
                    lowerCumGAI += layerGAI;

                    double Iabs_b = (1 - rhodir[ih]) * I_dir_inc[ih] * (Math.Exp(-kb[ih] * upperCumGAI) - Math.Exp(-kb[ih] * lowerCumGAI));
                    IAbsDir[ih].Add(layerIndex, Iabs_b);

                    double Iabs_d = (1 - rhodiff) * I_dif_inc[ih] * (Math.Exp(-kd * upperCumGAI) - Math.Exp(-kd * lowerCumGAI));
                    IAbsDiff[ih].Add(layerIndex, Iabs_d);
                }
            }


            //Outputs
            rates.absorbedDiffIrradiance = IAbsDiff;
            rates.absorbedDirIrradiance  = IAbsDir;

            //End of custom code. Do not place your custom code below. It will be overwritten by a future code generation.
            //PLACE YOUR CUSTOM CODE ABOVE - GENERATED CODE START - Section1
        }
示例#23
0
        private void CalculateModel(INRA.SiriusQualityIrradiance.Interfaces.Rates rates, INRA.SiriusQualityIrradiance.Interfaces.Exogenous exogenous, INRA.SiriusQualityIrradiance.Interfaces.States states, CRA.AgroManagement.ActEvents actevents)
        {
            //GENERATED CODE END - PLACE YOUR CUSTOM CODE BELOW - Section1
            //Code written below will not be overwritten by a future code generation
            //Inputs
            double rho = states.rhoLeaf;
            double tau = states.tauLeaf;
            Dictionary <int, double> K1_dirDict = states.k1_dir;
            double sigma = rho + tau;

            //Outpus
            Dictionary <int, double> K_dirDict = new Dictionary <int, double>();


            // Extinction coefficient for direct irradiances (beam and scattered)
            // Note: a spherical distribution for leaf inclination angle is assumed.
            foreach (int hour in Enumerable.Range(0, 24))
            {
                double k_dir = K1_dirDict[hour] * Math.Sqrt(1.0 - sigma);     // beam and scattered coef

                K_dirDict[hour] = k_dir;
            }

            states.k_dir = K_dirDict;


            //End of custom code. Do not place your custom code below. It will be overwritten by a future code generation.
            //PLACE YOUR CUSTOM CODE ABOVE - GENERATED CODE START - Section1
        }