public static ArraySimulationStepInput FromJson(JsonSpec spec, Mesh mesh, Bitmap texture) { ArraySimulationStepInput input = new ArraySimulationStepInput(); input.Heading = DegToRad(spec.Environment.HeadingDeg); input.IndirectIrradiance = spec.Environment.IndirectIrradianceWM2; input.Irradiance = spec.Environment.IrradianceWM2; input.Latitude = spec.Environment.LatitudeDeg; input.Longitude = spec.Environment.LongitudeDeg; input.Temperature = spec.Environment.TemperatureC; input.Tilt = DegToRad(spec.Environment.TiltDeg); input.TimezoneOffsetHours = spec.Environment.TimezoneOffsetHours; input.Utc = spec.Environment.Utc; input.Array = new ArraySpec(); input.Array.BypassDiodeSpec.VoltageDrop = spec.Array.BypassDiode.VoltageDrop; input.Array.CellSpec.Area = spec.Array.Cell.AreaM2; input.Array.CellSpec.DIscDT = spec.Array.Cell.DIscDT; input.Array.CellSpec.DVocDT = spec.Array.Cell.DVocDT; input.Array.CellSpec.IscStc = spec.Array.Cell.IscStc; input.Array.CellSpec.NIdeal = spec.Array.Cell.NIdeal; input.Array.CellSpec.SeriesR = spec.Array.Cell.SeriesR; input.Array.CellSpec.VocStc = spec.Array.Cell.VocStc; input.Array.EncapsulationLoss = spec.Array.EncapsulationLoss; input.Array.LayoutBounds = FromJson(spec.Array.LayoutBounds); input.Array.Mesh = mesh; input.Array.LayoutTexture = texture; input.Array.ReadStringsFromColors(); return input; }
//TODO: move to a utility class public static Vector3 GetSunDir(ArraySimulationStepInput simInput) { // update the astronomy model var utc_time = simInput.Utc; var sidereal = Astro.sidereal_time( utc_time, simInput.Longitude); var solarAzimuth = Astro.solar_azimuth( (int)sidereal.TimeOfDay.TotalSeconds, sidereal.DayOfYear, simInput.Latitude); var solarElevation = Astro.solar_elevation( (int)sidereal.TimeOfDay.TotalSeconds, sidereal.DayOfYear, simInput.Latitude); // correct for the car's heading and tilt var phi = solarAzimuth - simInput.Heading; var x = Math.Cos(solarElevation) * Math.Cos(phi); // phi 0 = forward = +X var y = Math.Cos(solarElevation) * Math.Sin(phi); // phi 90deg = left = +Y var z = Math.Sin(solarElevation); // up = +Z z = Math.Cos(simInput.Tilt) * z + Math.Sin(simInput.Tilt) * y; // +tilt = tilt right y = Math.Cos(simInput.Tilt) * y - Math.Sin(simInput.Tilt) * z; //recalculate the shadows return new Vector3((float)x, (float)z, (float)y); }
public static JsonSpec ToJson(ArraySimulationStepInput input, string layoutFile, string meshFile, string relativeDir) { return new JsonSpec() { Array = ToJson(input.Array, layoutFile, meshFile, relativeDir), Environment = new EnvironmentJsonSpec() { HeadingDeg = RadToDeg(input.Heading), IndirectIrradianceWM2 = input.IndirectIrradiance, IrradianceWM2 = input.Irradiance, LatitudeDeg = input.Latitude, LongitudeDeg = input.Longitude, TemperatureC = input.Temperature, TiltDeg = RadToDeg(input.Tilt), TimezoneOffsetHours = input.TimezoneOffsetHours, Utc = input.Utc } }; }
private void openParametersToolStripMenuItem_Click(object sender, EventArgs args) { if (openFileDialogParameters.ShowDialog() != System.Windows.Forms.DialogResult.OK) { return; } try { string filename = openFileDialogParameters.FileName; string dir = Path.GetDirectoryName(filename); JsonSpec spec = JsonSpecConverter.Read(filename); string meshFname = dir + "/" + spec.Array.MeshFilename; Mesh mesh = LoadMesh(meshFname); Bitmap texture = LoadTexture(dir + "/" + spec.Array.LayoutFilename); simInput = JsonSpecConverter.FromJson(spec, mesh, texture); SetModel(simInput.Array.Mesh); meshFilename = meshFname; Console.WriteLine("Read spec " + spec); } catch (Exception e) { MessageBox.Show(e.Message, "Error loading model", MessageBoxButtons.OK); } CalculateSimStepGui(); InitInputView(); InitOutputView(); }
/// <summary> /// (TODO) Calculates an array simulation /// for a single array, single set of parameters, single moment in time. /// /// Returns array output in watts, along with some other data. /// </summary> public ArraySimulationStepOutput Simulate(ArraySimulationStepInput simInput) { // validate that we're gtg if (simInput == null) throw new InvalidOperationException("No input specified."); Vector3 sunDir = GetSunDir(simInput); return Simulate(simInput.Array, sunDir, simInput.Irradiance, simInput.IndirectIrradiance, simInput.EncapuslationLoss, simInput.Temperature); }
public CellParamsForm(ArraySimulationStepInput input) { this.input = input; InitializeComponent(); ResetTextBoxes(); }