public static OpaqueConstruction MixConstructions(string newName, OpaqueConstruction c1, OpaqueConstruction c2, double areaFractionC2) { //find layer with lowest conductivity in C1 double minLamdaC1 = double.MaxValue; double thicknessMinLamdaC1 = 0; int minLamdaC1Index = -1; double thicknessC1 = 0; for (int i = 0; i < c1.Layers.Count; i++) { var layer = c1.Layers[i]; thicknessC1 += layer.Thickness; if (layer.Material.Conductivity < minLamdaC1) { minLamdaC1 = layer.Material.Conductivity; thicknessMinLamdaC1 = layer.Thickness; minLamdaC1Index = i; } } double rLayer = thicknessMinLamdaC1 / minLamdaC1; // claculate target R-value double r1 = c1.GetRvalueLayers(); double r2 = c2.GetRvalueLayers(); double rTarget = r1 * (1.0 - areaFractionC2) + r2 * areaFractionC2; double r1_2 = r1 - rLayer; double newThickness = (rTarget - r1_2) * minLamdaC1; List <Layer <OpaqueMaterial> > newLayerset = new List <Layer <OpaqueMaterial> >(); for (int i = 0; i < c1.Layers.Count; i++) { if (i == minLamdaC1Index) { newLayerset.Add(new Layer <OpaqueMaterial>(newThickness, c1.Layers[i].Material)); } else { newLayerset.Add(new Layer <OpaqueMaterial>(c1.Layers[i].Thickness, c1.Layers[i].Material)); } } OpaqueConstruction c = new OpaqueConstruction() { Name = newName, Type = c1.Type, EmbodiedCarbon = c1.EmbodiedCarbon * (1.0 - areaFractionC2) + c2.EmbodiedCarbon * areaFractionC2, Cost = c1.Cost * (1.0 - areaFractionC2) + c2.Cost * areaFractionC2, EmbodiedEnergy = c1.EmbodiedEnergy * (1.0 - areaFractionC2) + c2.EmbodiedEnergy * areaFractionC2, Life = c1.Life, Comment = c1.Comment, Category = c1.Category, DataSource = c1.DataSource, Layers = newLayerset }; return(c); }
public OpaqueConstruction Add(OpaqueConstruction obj) { if (obj == null) { return(null); } if (OpaqueConstructions == null) { OpaqueConstructions = new List <OpaqueConstruction>(); } foreach (var m in obj.Layers) { this.Add(m.Material); } if (!OpaqueConstructions.Any(i => i.Name == obj.Name)) { OpaqueConstructions.Add(obj); return(obj); } else { var oc = OpaqueConstructions.Single(o => o.Name == obj.Name); CopyObjectData(obj, oc, "", BindingFlags.Public | BindingFlags.Instance); return(oc); } }
public static OpaqueConstruction QuickConstruction(string name, ConstructionCategory type, string[] layers, double[] thickness, string category, string source, ref Library Library) { OpaqueConstruction oc = new OpaqueConstruction(); for (int i = 0; i < layers.Length; i++) { try { if (thickness.Length != layers.Length) { continue; } if (!(thickness[i] > 0)) { continue; } if (Library.OpaqueMaterials.Any(x => x.Name == layers[i])) { var mat = Library.OpaqueMaterials.First(o => o.Name == layers[i]); Layer <OpaqueMaterial> layer = new Layer <OpaqueMaterial>(thickness[i], mat); oc.Layers.Add(layer); } else { Debug.WriteLine("ERROR: " + "Could not find " + layers[i]); Logger.WriteLine("ERROR: " + "Could not find " + layers[i]); return(null); } } catch (Exception e) { Debug.WriteLine(e.Message); } } oc.Name = name; oc.Type = type; oc.Category = category; oc.DataSource = source; Library.Add(oc); return(oc); }