// Obtaining and Setting efficiency curve values from .CSYX file public void ConfigEffCurves(int ArrayNum, bool threeCurves) { // Configuration begins with a check if the Inverter has three efficiency curves or just one // Once determined, relevant values are collected from the .CSYX file if (threeCurves) { // Initiating an Array to hold Interpolated Values and the three voltage levels itsPresentEfficiencies[0] = new double[3]; // To hold the three voltage levels [Array, V] itsPresentEfficiencies[1] = new double[3]; // To hold the three efficiencies from interpolation [Array, %, Computed in Calculate Method] // Getting the Low, Medium and High Voltage Values used in the Curve itsLowVoltage = double.Parse(ReadFarmSettings.GetAttribute("Inverter", "Voltage", _Adder: "/Efficiency/Low", _ArrayNum: ArrayNum)); itsPresentEfficiencies[0][0] = itsLowVoltage; itsMedVoltage = double.Parse(ReadFarmSettings.GetAttribute("Inverter", "Voltage", _Adder: "/Efficiency/Med", _ArrayNum: ArrayNum)); itsPresentEfficiencies[0][1] = itsMedVoltage; itsHighVoltage = double.Parse(ReadFarmSettings.GetAttribute("Inverter", "Voltage", _Adder: "/Efficiency/High", _ArrayNum: ArrayNum)); itsPresentEfficiencies[0][2] = itsHighVoltage; // Setting the lowest efficiency (i.e. at Threshold Power) List <double> lowEffIn = new List <double>(); List <double> lowEffFrac = new List <double>(); List <double> medEffIn = new List <double>(); List <double> medEffFrac = new List <double>(); List <double> highEffIn = new List <double>(); List <double> highEffFrac = new List <double>(); double effInPlaceholder; double effFracPlaceholder; lowEffIn.Add(itsThresholdPwr * itsNumInverters); lowEffFrac.Add(0); medEffIn.Add(itsThresholdPwr * itsNumInverters); medEffFrac.Add(0); highEffIn.Add(itsThresholdPwr * itsNumInverters); highEffFrac.Add(0); // Get Low Voltage Efficiency Curve for (int eff = 1; eff < 8; eff++) { effIn = double.TryParse(ReadFarmSettings.GetInnerText("Inverter", "Efficiency/Low/IN" + (eff + 1).ToString(), _ArrayNum: ArrayNum, _default: null), out effInPlaceholder); effFrac = double.TryParse(ReadFarmSettings.GetInnerText("Inverter", "Efficiency/Low/Effic" + (eff + 1).ToString(), _ArrayNum: ArrayNum, _default: null), out effFracPlaceholder); if (effIn && effFrac) { ErrorLogger.Assert("The Inverter Efficiency Curve is Incorrectly defined. Check Inverter in Sub-Array " + ArrayNum + ".", double.Parse(ReadFarmSettings.GetInnerText("Inverter", "Efficiency/Low/Effic" + (eff + 1).ToString(), _ArrayNum: ArrayNum)) < 100, ErrLevel.FATAL); lowEffIn.Add(effInPlaceholder * itsNumInverters * 1000); lowEffFrac.Add(effInPlaceholder * effFracPlaceholder * itsNumInverters * 10); } } itsLowEff[0] = lowEffIn.ToArray(); itsLowEff[1] = lowEffFrac.ToArray(); // Get Med Voltage Efficiency Curve for (int eff = 1; eff < 8; eff++) { effIn = double.TryParse(ReadFarmSettings.GetInnerText("Inverter", "Efficiency/Med/IN" + (eff + 1).ToString(), _ArrayNum: ArrayNum, _default: null), out effInPlaceholder); effFrac = double.TryParse(ReadFarmSettings.GetInnerText("Inverter", "Efficiency/Med/Effic" + (eff + 1).ToString(), _ArrayNum: ArrayNum, _default: null), out effFracPlaceholder); if (effIn && effFrac) { ErrorLogger.Assert("The Inverter Efficiency Curve is Incorrectly defined. Check Inverter in Sub-Array " + ArrayNum + ".", double.Parse(ReadFarmSettings.GetInnerText("Inverter", "Efficiency/Med/Effic" + (eff + 1).ToString(), _ArrayNum: ArrayNum)) < 100, ErrLevel.FATAL); medEffIn.Add(effInPlaceholder * itsNumInverters * 1000); medEffFrac.Add(effInPlaceholder * effFracPlaceholder * itsNumInverters * 10); } } itsMedEff[0] = medEffIn.ToArray(); itsMedEff[1] = medEffFrac.ToArray(); // Get High Voltage Efficiency Curve for (int eff = 1; eff < 8; eff++) { effIn = double.TryParse(ReadFarmSettings.GetInnerText("Inverter", "Efficiency/High/IN" + (eff + 1).ToString(), _ArrayNum: ArrayNum, _default: null), out effInPlaceholder); effFrac = double.TryParse(ReadFarmSettings.GetInnerText("Inverter", "Efficiency/High/Effic" + (eff + 1).ToString(), _ArrayNum: ArrayNum, _default: null), out effFracPlaceholder); if (effIn && effFrac) { ErrorLogger.Assert("The Inverter Efficiency Curve is Incorrectly defined. Check Inverter in Sub-Array " + ArrayNum + ".", double.Parse(ReadFarmSettings.GetInnerText("Inverter", "Efficiency/High/Effic" + (eff + 1).ToString(), _ArrayNum: ArrayNum)) < 100, ErrLevel.FATAL); highEffIn.Add(effInPlaceholder * itsNumInverters * 1000); highEffFrac.Add(effInPlaceholder * effFracPlaceholder * itsNumInverters * 10); } } itsHighEff[0] = highEffIn.ToArray(); itsHighEff[1] = highEffFrac.ToArray(); } else { // The Inverter only has one Efficiency Curve // Setting the lowest efficiency (i.e. at Threshold Power) itsOnlyEff[0][0] = itsThresholdPwr * itsNumInverters; itsOnlyEff[1][0] = 0; // Go through all .CSYX Nodes with Efficiency values and assign them into Array for (int eff = 1; eff < itsOnlyEff[0].Length; eff++) { ErrorLogger.Assert("The Inverter Efficiency Curve is Incorrectly defined. Check Inverter in Sub-Array " + ArrayNum + ".", double.Parse(ReadFarmSettings.GetInnerText("Inverter", "Efficiency/EffCurve/Effic." + (eff + 1).ToString(), _ArrayNum: ArrayNum)) < 100, ErrLevel.FATAL); itsOnlyEff[0][eff] = double.Parse(ReadFarmSettings.GetInnerText("Inverter", "Efficiency/EffCurve/IN" + (eff + 1).ToString(), _ArrayNum: ArrayNum, _default: itsNomOutputPwr.ToString())) * itsNumInverters * 1000; itsOnlyEff[1][eff] = itsOnlyEff[0][eff] * double.Parse(ReadFarmSettings.GetInnerText("Inverter", "Efficiency/EffCurve/Effic." + (eff + 1).ToString(), _ArrayNum: ArrayNum, _Error: ErrLevel.FATAL)) / 100; } } }