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
         }
     };
 }
Beispiel #4
0
        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);
 }
Beispiel #6
0
 public CellParamsForm(ArraySimulationStepInput input)
 {
     this.input = input;
     InitializeComponent();
     ResetTextBoxes();
 }