public void CalcWS_DeficitEddyViscosityGrid_Test() { WakeCollection wakeModelList = new WakeCollection(); TurbineCollection turbineList = new TurbineCollection(); double[] power = new double[23]; string Power_file = testingFolder + "\\CalcWS_DeficitEddyViscosityGrid\\Power.txt"; StreamReader sr = new StreamReader(Power_file); for (int i = 0; i <= 22; i++) { power[i] = Convert.ToSingle(sr.ReadLine()); } double[] Thrust = new double[23]; string Thrust_file = testingFolder + "\\CalcWS_DeficitEddyViscosityGrid\\Thrust.txt"; sr = new StreamReader(Thrust_file); for (int i = 0; i <= 22; i++) { Thrust[i] = Convert.ToSingle(sr.ReadLine()); } turbineList.AddPowerCurve("GW 1500/87", 3, 22, 1500, power, Thrust, 87, 16, 10, 1, 0); wakeModelList.AddWakeModel(0, 5, 10, turbineList.powerCurves[0], 10, 3.5f, 0.03f, "Linear"); MetCollection metList = new MetCollection(); metList.metItem = new Met[1]; metList.metItem[0] = new Met(); double[,] Vel_Def = wakeModelList.CalcWS_DeficitEddyViscosityGrid(2, 30, 0.1f, 0.025f, 8, wakeModelList.wakeModels[0], metList); Assert.AreEqual(Vel_Def[16, 2], 0.450777, 0.01, "Wrong Vel Def Test 1 r = 0.05"); Assert.AreEqual(Vel_Def[16, 10], 0.196172, 0.01, "Wrong Vel Def Test 1 r = 0.25"); Assert.AreEqual(Vel_Def[16, 17], 0.03166, 0.01, "Wrong Vel Def Test 1 r = 0.425"); Assert.AreEqual(Vel_Def[40, 0], 0.255068, 0.01, "Wrong Vel Def Test 2 r = 0.05"); Assert.AreEqual(Vel_Def[40, 7], 0.194434, 0.01, "Wrong Vel Def Test 2 r = 0.25"); Assert.AreEqual(Vel_Def[40, 18], 0.02328, 0.01, "Wrong Vel Def Test 2 r = 0.425"); wakeModelList.AddWakeModel(0, 10, 14, turbineList.powerCurves[0], 10, 3.5f, 0.03f, "Linear"); Vel_Def = wakeModelList.CalcWS_DeficitEddyViscosityGrid(2, 30, 0.1f, 0.025f, 6, wakeModelList.wakeModels[1], metList); Assert.AreEqual(Vel_Def[4, 2], 0.513121, 0.01, "Wrong Vel Def Test 3 r = 0.05"); Assert.AreEqual(Vel_Def[4, 10], 0.20352, 0.01, "Wrong Vel Def Test 3 r = 0.25"); Assert.AreEqual(Vel_Def[4, 16], 0.04366, 0.01, "Wrong Vel Def Test 3 r = 0.4"); Assert.AreEqual(Vel_Def[42, 4], 0.18052, 0.01, "Wrong Vel Def Test 4 r = 0.05"); Assert.AreEqual(Vel_Def[42, 19], 0.01031, 0.01, "Wrong Vel Def Test 4 r = 0.25"); }
public void CalcWakeLosses_Test() { WakeCollection WakeModList = new WakeCollection(); TurbineCollection turbineList = new TurbineCollection(); double[] power = new double[31]; string Power_file = testingFolder + "\\CalcWakeLosses\\power.txt"; StreamReader sr = new StreamReader(Power_file); for (int i = 0; i <= 22; i++) { power[i] = Convert.ToSingle(sr.ReadLine()); } double[] Thrust = new double[31]; string Thrust_file = testingFolder + "\\CalcWakeLosses\\Thrust.txt"; sr = new StreamReader(Thrust_file); for (int i = 0; i <= 22; i++) { Thrust[i] = Convert.ToSingle(sr.ReadLine()); } turbineList.AddPowerCurve("GW 1500/87", 3, 22, 1500, power, Thrust, 87, 16, 10, 1, 0); WakeModList.AddWakeModel(0, 5, 10, turbineList.powerCurves[0], 10, 3.5f, 0.03f, "Linear"); MetCollection metList = new MetCollection(); metList.metItem = new Met[1]; metList.metItem[0] = new Met(); // Load sectorwise wind speed distribution string Sect_WS_file = testingFolder + "\\CalcWakeLosses\\Sect_WS.txt"; sr = new StreamReader(Sect_WS_file); double[,] sectorWS = new double[16, 31]; for (int i = 0; i <= 15; i++) { string This_WS_Array = sr.ReadLine(); string[] This_Array_Split = This_WS_Array.Split('\t'); for (int j = 0; j <= 30; j++) { sectorWS[i, j] = Convert.ToSingle(This_Array_Split[j]); } } string WR_file = testingFolder + "\\CalcWakeLosses\\Wind_Rose.txt"; sr = new StreamReader(WR_file); double[] windRose = new double[16]; for (int i = 0; i <= 15; i++) { windRose[i] = Convert.ToSingle(sr.ReadLine()) / 100; } string Sect_AEP_file = testingFolder + "\\CalcWakeLosses\\Sect_AEP.txt"; sr = new StreamReader(Sect_AEP_file); double[] Sect_AEP = new double[16]; for (int i = 0; i <= 15; i++) { Sect_AEP[i] = Convert.ToSingle(sr.ReadLine()); } double[] R_RD = new double[21]; for (int i = 0; i <= 20; i++) { R_RD[i] = i * 0.025f; } WakeCollection.WakeLossCoeffs[] These_Coeffs = new WakeCollection.WakeLossCoeffs[140]; // 5 (DW_RDs) x 28 (WS > 3) int Ind_Count = 0; for (double DW_RD = 5.5f; DW_RD <= 5.9; DW_RD = DW_RD + 0.1f) { int DW_ind = (int)Math.Round((DW_RD - 2) / 0.1, 0); for (int i = 3; i <= 30; i++) { double[] Vel_Def_Rad = new double[21]; // Velocity Deficit profile at X_Length_RD double[,] WS_Def_EV_Grid = WakeModList.CalcWS_DeficitEddyViscosityGrid(2f, 6f, 0.1f, 0.025f, i, WakeModList.wakeModels[0], metList); for (int radiusInd = 0; radiusInd <= 19; radiusInd++) { Vel_Def_Rad[radiusInd] = WS_Def_EV_Grid[DW_ind, radiusInd]; // index = 37 corresponds to DW dist = 5.7 (i.e. 2 + 0.1 * 37 = 5.7) } Vel_Def_Rad[20] = 0; double[] Coeffs = WakeModList.CalcWakeProfileFit(Vel_Def_Rad, R_RD); These_Coeffs[Ind_Count].freeStream = i; These_Coeffs[Ind_Count].X_LengthRD = DW_RD; These_Coeffs[Ind_Count].linRegInt = Coeffs[0]; These_Coeffs[Ind_Count].linCoeff4 = Coeffs[1]; These_Coeffs[Ind_Count].linCoeff3 = Coeffs[2]; These_Coeffs[Ind_Count].linCoeff2 = Coeffs[3]; These_Coeffs[Ind_Count].linCoeff1 = Coeffs[4]; Ind_Count++; } } turbineList.AddTurbine("Target Site", 280050, 4552500, 1); turbineList.AddTurbine("UW Site", 280000, 4553000, 1); Continuum thisInst = new Continuum(""); thisInst.turbineList = turbineList; thisInst.metList.WS_FirstInt = 0.5; thisInst.metList.WS_IntSize = 1; thisInst.metList.numWS = 30; thisInst.metList.AddMetTAB("dummy", 0, 0, 0, windRose, sectorWS, 0.5, 1, thisInst); // Need to define exceed model thisInst.turbineList.exceed = new Exceedance(); thisInst.turbineList.exceed.compositeLoss = new Exceedance.Monte_Carlo(); thisInst.turbineList.exceed.compositeLoss.pVals1yr = new double[100]; for (int i = 0; i < 100; i++) { thisInst.turbineList.exceed.compositeLoss.pVals1yr[i] = 1.0; } WakeCollection.WakeCalcResults WakeResults = WakeModList.CalcWakeLosses(These_Coeffs, 280050, 4552500, sectorWS, 4130, Sect_AEP, thisInst, WakeModList.wakeModels[0], windRose); Assert.AreEqual(WakeResults.sectorNetEnergy[0], 79.1604, 0.1, "Wrong net AEP"); Assert.AreEqual(WakeResults.sectorWakedWS[0], 4.2851, 0.1, "Wrong waked wind speed"); Assert.AreEqual(WakeResults.sectorWakeLoss[0], 0.2278, 0.1, "Wrong wake loss"); }