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; }
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(); }
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 }
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 }
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 }
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 }
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 //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 }
/// <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 //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 }
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 }
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 }
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 }
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); } }
//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); } }
/// <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); } }
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 }
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 }
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 }