diff --git a/.gitattributes b/.gitattributes index 3171155..7344634 100644 --- a/.gitattributes +++ b/.gitattributes @@ -2,3 +2,7 @@ # output, which is UTF-8 without BOM and uses LF newlines. Pin them to LF so Git's autocrlf # setting cannot rewrite them to CRLF on checkout and break the byte-stability comparison. benchmark/**/*.json text eol=lf + +# S09: the S08 signed-off equivalence fixtures are reused byte for byte (sha256 in Fixtures/SHA256SUMS.txt, CRLF as +# committed in SAM_Tas). Later rules win, so this keeps them out of the LF rule above. +benchmark/SAM.Analytical.OpenStudio.InputReadBack/Fixtures/** -text diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 88f641a..d876d08 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -169,6 +169,51 @@ jobs: if (-not (Test-Path $dll)) { throw "Expected schema DLL missing after build: $dll" } Write-Host "Schema DLL present: $dll" + - name: Clone S08 evaluation core (SAM_Tas, sparse) + shell: pwsh + run: | + $ErrorActionPreference = 'Stop' + + $org = '${{ env.ORG_NAME }}' + $r = 'SAM_Tas' + + # The S09 read-back (benchmark/SAM.Analytical.OpenStudio.InputReadBack) reuses, from SAM_Tas, the COM-free S08 + # evaluation core (project reference) and the SAM-intent builder ReadBackExpected.cs (linked source). Only those + # two folders are checked out; nothing TAS/COM is built. Same branch-candidate order as the other dependencies. + if (-not (Test-Path $r)) { + $headRef = '${{ github.head_ref }}' + $baseRef = '${{ github.base_ref }}' + $refName = '${{ github.ref_name }}' + $candidates = @() + if ($headRef) { $candidates += $headRef } + $sowRef = if ($baseRef -match '^sow/') { $baseRef } elseif ($refName -match '^sow/') { $refName } else { '' } + if ($sowRef -and $sowRef -ne $headRef) { $candidates += $sowRef } + foreach ($branchRef in @($headRef, $baseRef, $refName)) { + if ($branchRef -match '^sow/(\d{4}-Q\d)') { + $quarterRef = "sow/$($Matches[1])" + if ($candidates -notcontains $quarterRef) { $candidates += $quarterRef } + } + } + $cloned = $false + foreach ($cand in $candidates) { + $has = (git ls-remote --heads "https://github.com/$org/$r.git" $cand 2>$null | Out-String).Trim() + if ($has) { + Write-Host "Cloning $org/$r @ $cand (sparse)" + git clone --depth 1 --filter=blob:none --sparse --branch $cand "https://github.com/$org/$r.git" $r + $cloned = $true + break + } + } + if (-not $cloned) { throw "No SAM_Tas branch among: $($candidates -join ', ')" } + git -C $r sparse-checkout set benchmark/SAM.Analytical.InputEquivalence SAM_Tas/SAM.Analytical.Tas.DirectT3D.Validation/ReadBack + if ($LASTEXITCODE -ne 0) { throw "SAM_Tas sparse checkout failed" } + } + + Write-Host ("SAM_Tas at " + (git -C $r rev-parse HEAD) + " (" + (git -C $r rev-parse --abbrev-ref HEAD) + ")") + foreach ($p in @('benchmark/SAM.Analytical.InputEquivalence/SAM.Analytical.InputEquivalence.csproj', 'SAM_Tas/SAM.Analytical.Tas.DirectT3D.Validation/ReadBack/ReadBackExpected.cs')) { + if (-not (Test-Path (Join-Path $r $p))) { throw "Missing from the SAM_Tas checkout: $p" } + } + - name: Restore + Rebuild in order (safe Platform handling) shell: pwsh run: | @@ -271,6 +316,35 @@ jobs: --logger 'console;verbosity=normal' if ($LASTEXITCODE -ne 0) { throw "Benchmark producer tests failed" } + - name: Run S09 OpenStudio native-input read-back tests (offline) + shell: pwsh + run: | + $ErrorActionPreference = 'Stop' + + $repo = '${{ env.REPO_NAME }}' + + # S09: the writer's ventilation policy and the fresh-process OSM/IDF read-back on the S08 signed-off fixtures with + # the SAM#212 Budapest EPW (from the SAM sibling). OpenStudio SDK NuGet only: no CLI, no EnergyPlus run. + $testProject = Join-Path $repo 'benchmark/SAM.Analytical.OpenStudio.InputReadBack.Tests/SAM.Analytical.OpenStudio.InputReadBack.Tests.csproj' + Write-Host "==> Testing: $testProject" + & dotnet test $testProject ` + -c Release ` + '/p:Platform=x64' ` + '/p:SAMVersion=${{ steps.ver.outputs.samversion }}' ` + --logger 'console;verbosity=normal' + if ($LASTEXITCODE -ne 0) { throw "S09 read-back tests failed" } + + - name: Upload S09 failure diagnostics + # Only when a step failed: the bounded text evidence (exit code, stdout/stderr, process identities, file list) the + # S09 tests write for a failed CLI step. No native files. + if: failure() + uses: actions/upload-artifact@v4 + with: + name: ${{ env.REPO_NAME }}-s09-diagnostics + path: ${{ env.REPO_NAME }}/benchmark/SAM.Analytical.OpenStudio.InputReadBack.Tests/bin/**/s09-diagnostics/*.txt + if-no-files-found: ignore + retention-days: 30 + - name: Upload build folders (optional) uses: actions/upload-artifact@v4 with: diff --git a/SAM_OpenStudio.sln b/SAM_OpenStudio.sln index 30ace78..6091aa3 100644 --- a/SAM_OpenStudio.sln +++ b/SAM_OpenStudio.sln @@ -32,6 +32,12 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SAM.Analytical.OpenStudio.B EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SAM.Analytical.OpenStudio.Benchmark.Tests", "benchmark\SAM.Analytical.OpenStudio.Benchmark.Tests\SAM.Analytical.OpenStudio.Benchmark.Tests.csproj", "{A845555D-DDC0-49C9-8BAD-ADEF4F5E7C6F}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SAM.Analytical.OpenStudio.InputReadBack", "benchmark\SAM.Analytical.OpenStudio.InputReadBack\SAM.Analytical.OpenStudio.InputReadBack.csproj", "{EBF33B94-81C3-4D70-BD25-F10C0E119B6F}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SAM.Analytical.OpenStudio.InputReadBack.Cli", "benchmark\SAM.Analytical.OpenStudio.InputReadBack.Cli\SAM.Analytical.OpenStudio.InputReadBack.Cli.csproj", "{850D2D75-52C9-4322-B233-234F72981C39}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SAM.Analytical.OpenStudio.InputReadBack.Tests", "benchmark\SAM.Analytical.OpenStudio.InputReadBack.Tests\SAM.Analytical.OpenStudio.InputReadBack.Tests.csproj", "{3F2CC081-C850-4FE7-BEF7-E7BFC5699603}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -138,6 +144,42 @@ Global {A845555D-DDC0-49C9-8BAD-ADEF4F5E7C6F}.Release|x64.Build.0 = Release|x64 {A845555D-DDC0-49C9-8BAD-ADEF4F5E7C6F}.Release|x86.ActiveCfg = Release|x64 {A845555D-DDC0-49C9-8BAD-ADEF4F5E7C6F}.Release|x86.Build.0 = Release|x64 + {EBF33B94-81C3-4D70-BD25-F10C0E119B6F}.Debug|Any CPU.ActiveCfg = Debug|x64 + {EBF33B94-81C3-4D70-BD25-F10C0E119B6F}.Debug|Any CPU.Build.0 = Debug|x64 + {EBF33B94-81C3-4D70-BD25-F10C0E119B6F}.Debug|x64.ActiveCfg = Debug|x64 + {EBF33B94-81C3-4D70-BD25-F10C0E119B6F}.Debug|x64.Build.0 = Debug|x64 + {EBF33B94-81C3-4D70-BD25-F10C0E119B6F}.Debug|x86.ActiveCfg = Debug|x64 + {EBF33B94-81C3-4D70-BD25-F10C0E119B6F}.Debug|x86.Build.0 = Debug|x64 + {EBF33B94-81C3-4D70-BD25-F10C0E119B6F}.Release|Any CPU.ActiveCfg = Release|x64 + {EBF33B94-81C3-4D70-BD25-F10C0E119B6F}.Release|Any CPU.Build.0 = Release|x64 + {EBF33B94-81C3-4D70-BD25-F10C0E119B6F}.Release|x64.ActiveCfg = Release|x64 + {EBF33B94-81C3-4D70-BD25-F10C0E119B6F}.Release|x64.Build.0 = Release|x64 + {EBF33B94-81C3-4D70-BD25-F10C0E119B6F}.Release|x86.ActiveCfg = Release|x64 + {EBF33B94-81C3-4D70-BD25-F10C0E119B6F}.Release|x86.Build.0 = Release|x64 + {850D2D75-52C9-4322-B233-234F72981C39}.Debug|Any CPU.ActiveCfg = Debug|x64 + {850D2D75-52C9-4322-B233-234F72981C39}.Debug|Any CPU.Build.0 = Debug|x64 + {850D2D75-52C9-4322-B233-234F72981C39}.Debug|x64.ActiveCfg = Debug|x64 + {850D2D75-52C9-4322-B233-234F72981C39}.Debug|x64.Build.0 = Debug|x64 + {850D2D75-52C9-4322-B233-234F72981C39}.Debug|x86.ActiveCfg = Debug|x64 + {850D2D75-52C9-4322-B233-234F72981C39}.Debug|x86.Build.0 = Debug|x64 + {850D2D75-52C9-4322-B233-234F72981C39}.Release|Any CPU.ActiveCfg = Release|x64 + {850D2D75-52C9-4322-B233-234F72981C39}.Release|Any CPU.Build.0 = Release|x64 + {850D2D75-52C9-4322-B233-234F72981C39}.Release|x64.ActiveCfg = Release|x64 + {850D2D75-52C9-4322-B233-234F72981C39}.Release|x64.Build.0 = Release|x64 + {850D2D75-52C9-4322-B233-234F72981C39}.Release|x86.ActiveCfg = Release|x64 + {850D2D75-52C9-4322-B233-234F72981C39}.Release|x86.Build.0 = Release|x64 + {3F2CC081-C850-4FE7-BEF7-E7BFC5699603}.Debug|Any CPU.ActiveCfg = Debug|x64 + {3F2CC081-C850-4FE7-BEF7-E7BFC5699603}.Debug|Any CPU.Build.0 = Debug|x64 + {3F2CC081-C850-4FE7-BEF7-E7BFC5699603}.Debug|x64.ActiveCfg = Debug|x64 + {3F2CC081-C850-4FE7-BEF7-E7BFC5699603}.Debug|x64.Build.0 = Debug|x64 + {3F2CC081-C850-4FE7-BEF7-E7BFC5699603}.Debug|x86.ActiveCfg = Debug|x64 + {3F2CC081-C850-4FE7-BEF7-E7BFC5699603}.Debug|x86.Build.0 = Debug|x64 + {3F2CC081-C850-4FE7-BEF7-E7BFC5699603}.Release|Any CPU.ActiveCfg = Release|x64 + {3F2CC081-C850-4FE7-BEF7-E7BFC5699603}.Release|Any CPU.Build.0 = Release|x64 + {3F2CC081-C850-4FE7-BEF7-E7BFC5699603}.Release|x64.ActiveCfg = Release|x64 + {3F2CC081-C850-4FE7-BEF7-E7BFC5699603}.Release|x64.Build.0 = Release|x64 + {3F2CC081-C850-4FE7-BEF7-E7BFC5699603}.Release|x86.ActiveCfg = Release|x64 + {3F2CC081-C850-4FE7-BEF7-E7BFC5699603}.Release|x86.Build.0 = Release|x64 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -151,6 +193,9 @@ Global {45966997-BBBF-4272-B77F-86B401A1CE45} = {0AB3BF05-4346-4AA6-1389-037BE0695223} {E21DBAA0-8078-43F7-8A49-D9535DFD63D0} = {09EED85C-BE3C-7566-DC0E-2E8E43466740} {A845555D-DDC0-49C9-8BAD-ADEF4F5E7C6F} = {09EED85C-BE3C-7566-DC0E-2E8E43466740} + {EBF33B94-81C3-4D70-BD25-F10C0E119B6F} = {09EED85C-BE3C-7566-DC0E-2E8E43466740} + {850D2D75-52C9-4322-B233-234F72981C39} = {09EED85C-BE3C-7566-DC0E-2E8E43466740} + {3F2CC081-C850-4FE7-BEF7-E7BFC5699603} = {09EED85C-BE3C-7566-DC0E-2E8E43466740} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {4E0308FF-C8D5-4700-951A-859CB9D4FD09} diff --git a/SAM_OpenStudio/SAM.Analytical.OpenStudio/Classes/LightingSplit.cs b/SAM_OpenStudio/SAM.Analytical.OpenStudio/Classes/LightingSplit.cs new file mode 100644 index 0000000..94a7549 --- /dev/null +++ b/SAM_OpenStudio/SAM.Analytical.OpenStudio/Classes/LightingSplit.cs @@ -0,0 +1,34 @@ +// SPDX-License-Identifier: LGPL-3.0-or-later +// Copyright (c) 2020–2026 Michal Dengusiak & Jakub Ziolkowski and contributors + +namespace SAM.Analytical.OpenStudio +{ + /// + /// The lighting energy split of SAM S07 §5.1 (amendment L1, T-LIGHT-SPLIT). SAM + /// LightingRadiantProportion p is the total radiant share (long-wave plus short-wave) of the lighting gain + /// entering the room; SAM and Tas have no luminaire-return allocation. For EnergyPlus Lights: + /// Return Air Fraction 0, Fraction Visible p·s, Fraction Radiant p·(1 − s), convective 1 − p. + /// + /// s is a declared contract assumption, not SAM data: the short-wave share of the emitter's radiant output for the + /// reference category, suspended (pendant) LED office lighting with the whole fitting in the conditioned room. It is + /// a midpoint-derived reference from cited historical ranges (IEA SHC Task 61 / EBC Annex 77 Technical Report D1, + /// Table 6; ASHRAE Handbook—Fundamentals 2017, Ch. 18, Table 3), kept at full precision. + /// + /// The view coefficient (LightingViewCoefficient) is a comfort coefficient, never an energy fraction, and is + /// not part of this split. + /// + public static class LightingSplit + { + /// The reference total radiant share p₀ (S07 §5.1 baseline), applied only when SAM states no p. + public const double ReferenceRadiantProportion = 0.576; + + /// The short-wave share s of the radiant output, 0.2415 / 0.576, never rounded. + public const double ShortWaveShare = 0.2415 / 0.576; + + /// EnergyPlus Fraction Visible for a total radiant share p: p·s. + public static double FractionVisible(double radiantProportion) => radiantProportion * ShortWaveShare; + + /// EnergyPlus Fraction Radiant (long-wave) for a total radiant share p: p·(1 − s). + public static double FractionRadiant(double radiantProportion) => radiantProportion * (1 - ShortWaveShare); + } +} diff --git a/SAM_OpenStudio/SAM.Analytical.OpenStudio/Classes/OpenStudioImportContext.cs b/SAM_OpenStudio/SAM.Analytical.OpenStudio/Classes/OpenStudioImportContext.cs index f2f2899..da07a03 100644 --- a/SAM_OpenStudio/SAM.Analytical.OpenStudio/Classes/OpenStudioImportContext.cs +++ b/SAM_OpenStudio/SAM.Analytical.OpenStudio/Classes/OpenStudioImportContext.cs @@ -41,9 +41,26 @@ public sealed class OpenStudioImportContext /// OpenStudio material name → SAM material created for it. public IDictionary MaterialMap { get; } = new Dictionary(); + /// + /// Source SAM material Guid → the one SAM material its SAM-written face and thickness objects were merged + /// into with the OpenStudio handles of its validated members, or a null material when they are imported one by + /// one (fewer than two, or a conflict). Only a listed member resolves to the merged material. + /// + internal IDictionary Members)> OpaqueMaterialGroups { get; } = new Dictionary Members)>(); + /// OpenStudio construction name → SAM opaque Construction created for it. public IDictionary ConstructionMap { get; } = new Dictionary(); + /// + /// OpenStudio construction name → the innermost-first SAM Construction for the planar surfaces using it, when the + /// same OpenStudio construction is also used by a subsurface or shading surface (which keep the OpenStudio order + /// through ). Surfaces resolve here first. + /// + internal IDictionary SurfaceConstructionMap { get; } = new Dictionary(); + + /// OpenStudio construction handle → whether planar surfaces, and whether subsurfaces or shading surfaces, use it; read once from . + internal IDictionary ConstructionUses { get; set; } + /// OpenStudio construction name → SAM ApertureConstruction created for it. public IDictionary ApertureConstructionMap { get; } = new Dictionary(); diff --git a/SAM_OpenStudio/SAM.Analytical.OpenStudio/Convert/ToOpenStudio/AnalyticalModel.cs b/SAM_OpenStudio/SAM.Analytical.OpenStudio/Convert/ToOpenStudio/AnalyticalModel.cs index 6a39612..2146518 100644 --- a/SAM_OpenStudio/SAM.Analytical.OpenStudio/Convert/ToOpenStudio/AnalyticalModel.cs +++ b/SAM_OpenStudio/SAM.Analytical.OpenStudio/Convert/ToOpenStudio/AnalyticalModel.cs @@ -3,6 +3,7 @@ using System; using System.Collections.Generic; +using System.Linq; namespace SAM.Analytical.OpenStudio { @@ -221,11 +222,21 @@ private static OpenStudioConversionContext ToOpenStudio_Context(AnalyticalModel } Dictionary> surfacesByPanel = new Dictionary>(); + Dictionary> surfaceSpacesByPanel = new Dictionary>(); Dictionary panelByGuid = new Dictionary(); Dictionary> subSurfacesByAperture = new Dictionary>(); HashSet spacesWithSurfaces = new HashSet(); List spaces = adjacencyCluster.GetSpaces(); + Dictionary spaceIndexes = new Dictionary(); + for (int i = 0; spaces != null && i < spaces.Count; i++) + { + if (spaces[i] != null && !spaceIndexes.ContainsKey(spaces[i].Guid)) + { + spaceIndexes[spaces[i].Guid] = i; + } + } + context.Statistics.SourceObjects = (spaces?.Count ?? 0) + (sourcePanels?.Count ?? 0) + sourceApertureCount; if (spaces == null || spaces.Count == 0) { @@ -289,11 +300,21 @@ private static OpenStudioConversionContext ToOpenStudio_Context(AnalyticalModel } } + // Per-space outdoor-air override: replaces the SpaceType DSOA in EnergyPlus. It is the + // space's requirement, so it is delivered by the same rule as the SpaceType one (S07 + // D-F2): only through the selected Ventilation profile, otherwise not at all. Every + // rate field is written explicitly so no OpenStudio default (Flow/Person, 0.00944 + // m3/s per person) can add air SAM never stated. if (space.TryGetValue(SpaceParameter.OutsideSupplyAirFlow, out double outsideSupplyAirFlow) && !double.IsNaN(outsideSupplyAirFlow) && outsideSupplyAirFlow > 0) { global::OpenStudio.DesignSpecificationOutdoorAir designSpecificationOutdoorAir = new global::OpenStudio.DesignSpecificationOutdoorAir(context.Target); designSpecificationOutdoorAir.setName(Core.OpenStudio.Query.OpenStudioName("DesignSpecificationOutdoorAir", space.Name, space.Guid)); + designSpecificationOutdoorAir.setOutdoorAirMethod("Sum"); + designSpecificationOutdoorAir.setOutdoorAirFlowperPerson(0); + designSpecificationOutdoorAir.setOutdoorAirFlowperFloorArea(0); + designSpecificationOutdoorAir.setOutdoorAirFlowAirChangesperHour(0); designSpecificationOutdoorAir.setOutdoorAirFlowRate(outsideSupplyAirFlow); + designSpecificationOutdoorAir.setOutdoorAirFlowRateFractionSchedule(internalCondition.ToOpenStudio_VentilationDeliverySchedule(context, designSpecificationOutdoorAir.nameString())); openStudioSpace.setDesignSpecificationOutdoorAir(designSpecificationOutdoorAir); } @@ -357,6 +378,13 @@ private static OpenStudioConversionContext ToOpenStudio_Context(AnalyticalModel } surfaces.Add(surface); + if (!surfaceSpacesByPanel.TryGetValue(panel.Guid, out List surfaceSpaces)) + { + surfaceSpaces = new List(); + surfaceSpacesByPanel[panel.Guid] = surfaceSpaces; + } + + surfaceSpaces.Add(space.Guid); panelByGuid[panel.Guid] = panel; spacesWithSurfaces.Add(space.Guid); } @@ -495,6 +523,32 @@ private static OpenStudioConversionContext ToOpenStudio_Context(AnalyticalModel continue; } + // Orientation: SAM lists layers inside → outside from the panel's first space in + // GetSpaces() order (S07 section 1), so the forward construction belongs to that space's + // side. When that side produced no surface, the remaining one is never given it instead. + surfaceSpacesByPanel.TryGetValue(panel.Guid, out List sides); + string orientationProblem = ForwardSideProblem(FirstSpace(adjacencyCluster, panel, spaceIndexes), sides); + if (orientationProblem != null) + { + context.AddDiagnostic(Core.OpenStudio.OpenStudioDiagnosticCodes.AdjacencyMissingSurface, Core.OpenStudio.OpenStudioDiagnosticSeverity.Error, orientationProblem, panel); + context.RegisterSkip(); + continue; + } + + // Single-layer face optics, checked for this use before any cached construction is + // reused: on the ground or an adiabatic boundary only the zone face is used (internal + // values); on an outdoor or interzone surface both faces are, and one single-sided + // EnergyPlus material cannot carry two different value sets. Two sides (even demoted to + // adiabatic after a failed pairing) are two zone faces, one per value set. + List divergentFaceOptics = SingleLayerDivergentFaceOptics(construction, context.Source?.MaterialLibrary); + string outsideBoundaryCondition = surfaces[0].outsideBoundaryCondition(); + if (divergentFaceOptics.Count > 0 && (surfaces.Count >= 2 || !IsZoneFaceOnlyBoundary(outsideBoundaryCondition))) + { + context.AddDiagnostic(Core.OpenStudio.OpenStudioDiagnosticCodes.MaterialFaceOpticsUnrepresentable, Core.OpenStudio.OpenStudioDiagnosticSeverity.Error, string.Format("Single-layer construction '{0}' on a surface with outside boundary {1} needs different optical values on its two faces ({2}); EnergyPlus opaque materials are single-sided, so no construction was assigned — no external, averaged or split-layer substitute", construction.Name, outsideBoundaryCondition, string.Join(", ", divergentFaceOptics)), panel); + context.RegisterSkip(); + continue; + } + global::OpenStudio.Construction forwardConstruction = construction.ToOpenStudio(true, context); if (forwardConstruction == null) { @@ -628,6 +682,44 @@ private static OpenStudioConversionContext ToOpenStudio_Context(AnalyticalModel /// PolygonClipping, and flag the surface anyway. Best-effort: a geometry-kernel /// failure skips the advisory, never the surface. /// + /// + /// The panel's first related space in order: the space SAM's + /// inside → outside layer order starts from (S07 section 1). Null when the panel has no related space + /// in the list. + /// + private static Space FirstSpace(AdjacencyCluster adjacencyCluster, Panel panel, Dictionary spaceIndexes) + { + List relatedSpaces = adjacencyCluster.GetRelatedObjects(panel); + return relatedSpaces?.Where(x => x != null && spaceIndexes.ContainsKey(x.Guid)).OrderBy(x => spaceIndexes[x.Guid]).FirstOrDefault(); + } + + /// + /// The error when the panel's first surface (which receives the forward construction) is not on its first + /// space's side: that side produced no surface, and giving the forward construction to the other side would + /// swap SAM's inside and outside. Null when the first side is present or the panel has no ordered space. + /// + /// The panel's first related space in GetSpaces() order. + /// The space of each converted surface of the panel, in conversion order. + internal static string ForwardSideProblem(Space firstSpace, IReadOnlyList surfaceSpaces) + { + if (firstSpace == null || surfaceSpaces == null || surfaceSpaces.Count == 0 || surfaceSpaces[0] == firstSpace.Guid) + { + return null; + } + + return string.Format("The side of the panel facing its first space ('{0}') produced no surface; SAM orients the construction inside → outside from that space, so no construction was assigned — the sides are never swapped", firstSpace.Name); + } + + /// + /// True for an outside boundary whose face receives no solar or long-wave exchange (ground and + /// adiabatic), so only the zone face's optics are used. + /// + private static bool IsZoneFaceOnlyBoundary(string outsideBoundaryCondition) + { + return outsideBoundaryCondition == "Adiabatic" || outsideBoundaryCondition == "Foundation" + || (outsideBoundaryCondition != null && outsideBoundaryCondition.StartsWith("Ground", StringComparison.Ordinal)); + } + private static void EmitNonConvexCastingDiagnostic(Panel panel, string openStudioObjectName, OpenStudioConversionContext openStudioConversionContext) { Geometry.Spatial.Face3D face3D = panel?.GetFace3D(); diff --git a/SAM_OpenStudio/SAM.Analytical.OpenStudio/Convert/ToOpenStudio/Construction.cs b/SAM_OpenStudio/SAM.Analytical.OpenStudio/Convert/ToOpenStudio/Construction.cs index 4088eb4..fe0a060 100644 --- a/SAM_OpenStudio/SAM.Analytical.OpenStudio/Convert/ToOpenStudio/Construction.cs +++ b/SAM_OpenStudio/SAM.Analytical.OpenStudio/Convert/ToOpenStudio/Construction.cs @@ -171,6 +171,24 @@ private static double PerformanceParameter(Aperture aperture, ApertureConstructi return double.NaN; } + /// + /// The opaque optical properties whose SAM faces differ on a single-layer construction. Its one + /// material is then both the zone face (internal values) and the outer face (external values), which + /// a single-sided EnergyPlus material cannot hold. Empty for multi-layer constructions, non-opaque + /// layers and agreeing faces. + /// + internal static List SingleLayerDivergentFaceOptics(Construction construction, MaterialLibrary materialLibrary) + { + List constructionLayers = construction?.ConstructionLayers?.FindAll(x => x != null); + if (constructionLayers == null || constructionLayers.Count != 1 || materialLibrary == null) + { + return new List(); + } + + OpaqueMaterial opaqueMaterial = materialLibrary.GetMaterial(constructionLayers[0].Name) as OpaqueMaterial; + return opaqueMaterial == null ? new List() : DivergentInternalOptics(opaqueMaterial); + } + private static global::OpenStudio.Construction ToOpenStudio_Construction(SAMObject sAMObject, List constructionLayers, bool forward, string variant, OpenStudioMaterialUsage openStudioMaterialUsage, OpenStudioConversionContext openStudioConversionContext) { string direction = forward ? "Forward" : "Reverse"; @@ -197,6 +215,10 @@ private static double PerformanceParameter(Aperture aperture, ApertureConstructi return null; } + // The face role follows SAM's own layer order, never the EnergyPlus position: SAM's first + // (innermost) layer faces the first space, so it carries the internal-face optics in both the + // forward and the reverse construction, which therefore share the same material objects. + ConstructionLayer firstLayer = constructionLayers.Find(x => x != null); List orderedLayers = new List(constructionLayers); if (forward) { @@ -211,6 +233,8 @@ private static double PerformanceParameter(Aperture aperture, ApertureConstructi continue; } + bool internalFace = openStudioMaterialUsage == OpenStudioMaterialUsage.OpaqueConstruction && ReferenceEquals(constructionLayer, firstLayer); + IMaterial material = materialLibrary.GetMaterial(constructionLayer.Name); if (material == null) { @@ -235,7 +259,7 @@ private static double PerformanceParameter(Aperture aperture, ApertureConstructi } } - global::OpenStudio.Material openStudioMaterial = material.ToOpenStudio(thickness, openStudioConversionContext, openStudioMaterialUsage); + global::OpenStudio.Material openStudioMaterial = ToOpenStudio_Layer(material, thickness, openStudioConversionContext, openStudioMaterialUsage, internalFace); if (openStudioMaterial == null) { return null; diff --git a/SAM_OpenStudio/SAM.Analytical.OpenStudio/Convert/ToOpenStudio/IdealLoads.cs b/SAM_OpenStudio/SAM.Analytical.OpenStudio/Convert/ToOpenStudio/IdealLoads.cs index b13265c..cf113bc 100644 --- a/SAM_OpenStudio/SAM.Analytical.OpenStudio/Convert/ToOpenStudio/IdealLoads.cs +++ b/SAM_OpenStudio/SAM.Analytical.OpenStudio/Convert/ToOpenStudio/IdealLoads.cs @@ -42,6 +42,22 @@ public static partial class Convert } } + // Outdoor-air controls (S07 D-F2, T-OA-SYS): stated explicitly rather than left to defaults, so the delivered + // outdoor air is exactly the space's effective DSOA (its per-space override, else the inherited SpaceType one) + // times its fraction schedule, at the design occupancy: no demand-controlled ventilation, no economizer and + // no heat recovery. A space without a DSOA (no requirement, V0) leaves the link empty: no outdoor air. + result.setDemandControlledVentilationType("None"); + result.setOutdoorAirEconomizerType("NoEconomizer"); + result.setHeatRecoveryType("None"); + if (openStudioConversionContext.TryGetModelObject(space.Guid, out global::OpenStudio.Space openStudioSpace)) + { + global::OpenStudio.OptionalDesignSpecificationOutdoorAir designSpecificationOutdoorAir = openStudioSpace.designSpecificationOutdoorAir(); + if (designSpecificationOutdoorAir != null && !designSpecificationOutdoorAir.isNull()) + { + result.setDesignSpecificationOutdoorAirObject(designSpecificationOutdoorAir.get()); + } + } + if (!result.addToThermalZone(thermalZone)) { openStudioConversionContext.AddDiagnostic(Core.OpenStudio.OpenStudioDiagnosticCodes.HvacMissingSetpoints, Core.OpenStudio.OpenStudioDiagnosticSeverity.Error, "Ideal Loads air system could not be attached to the thermal zone", space, thermalZone.nameString()); diff --git a/SAM_OpenStudio/SAM.Analytical.OpenStudio/Convert/ToOpenStudio/InternalCondition.cs b/SAM_OpenStudio/SAM.Analytical.OpenStudio/Convert/ToOpenStudio/InternalCondition.cs index 93c4e88..45efd4b 100644 --- a/SAM_OpenStudio/SAM.Analytical.OpenStudio/Convert/ToOpenStudio/InternalCondition.cs +++ b/SAM_OpenStudio/SAM.Analytical.OpenStudio/Convert/ToOpenStudio/InternalCondition.cs @@ -2,6 +2,7 @@ // Copyright (c) 2020–2026 Michal Dengusiak & Jakub Ziolkowski and contributors using System.Collections.Generic; +using System.Globalization; using System.Security.Cryptography; using System.Text; using System.Text.Json.Nodes; @@ -122,18 +123,19 @@ public static partial class Convert lightsDefinition.setName(name + "_LightsDefinition"); lightsDefinition.setWattsperSpaceFloorArea(lightingGain / area); - if (!internalCondition.TryGetValue(InternalConditionParameter.LightingRadiantProportion, out double lightingRadiantProportion) || double.IsNaN(lightingRadiantProportion)) + // S07 §5.1 (T-LIGHT-SPLIT): p is the total radiant share; it is split by the declared short-wave + // share s, Return Air Fraction stays unset (0) and the view coefficient is never read here. + // An authored p, including 0, is preserved (SAM keeps it within [0, 1]); an absent or NaN p takes + // the common default p₀. + bool lightingRadiantProportionStated = internalCondition.TryGetValue(InternalConditionParameter.LightingRadiantProportion, out double lightingRadiantProportion) && !double.IsNaN(lightingRadiantProportion); + if (!lightingRadiantProportionStated) { - lightingRadiantProportion = 0.32; + lightingRadiantProportion = LightingSplit.ReferenceRadiantProportion; } - if (!internalCondition.TryGetValue(InternalConditionParameter.LightingViewCoefficient, out double lightingViewCoefficient) || double.IsNaN(lightingViewCoefficient)) - { - lightingViewCoefficient = 0.25; - } - - lightsDefinition.setFractionRadiant(lightingRadiantProportion); - lightsDefinition.setFractionVisible(lightingViewCoefficient); + lightsDefinition.setFractionRadiant(LightingSplit.FractionRadiant(lightingRadiantProportion)); + lightsDefinition.setFractionVisible(LightingSplit.FractionVisible(lightingRadiantProportion)); + openStudioConversionContext.AddDiagnostic(Core.OpenStudio.OpenStudioDiagnosticCodes.InternalConditionAssumption, Core.OpenStudio.OpenStudioDiagnosticSeverity.Information, LightingSplitMessage(lightingRadiantProportion, lightingRadiantProportionStated), internalCondition, name); global::OpenStudio.Lights lights = new global::OpenStudio.Lights(lightsDefinition); lights.setName(name + "_Lights"); @@ -262,8 +264,10 @@ public static partial class Convert // Sum, from the condition's supply parameters (per person / per area / ACH / // absolute). SpaceParameter.OutsideSupplyAirFlow still takes precedence — the // orchestrator assigns a per-space DSOA which overrides the SpaceType one in - // EnergyPlus. A named-but-unresolved ventilation profile is an error; without a - // named profile the rates are unscheduled (fraction 1). + // EnergyPlus. The supply parameters are the requirement; the selected Ventilation + // profile is the delivery (S07 D-F2). Without a selection, or with a selection that + // does not resolve, the requirement is kept and an all-zero fraction schedule + // delivers no outdoor air (never unscheduled). double supplyAirFlowPerPerson = ParameterValue(internalCondition, InternalConditionParameter.SupplyAirFlowPerPerson); double supplyAirFlowPerArea = ParameterValue(internalCondition, InternalConditionParameter.SupplyAirFlowPerArea); double supplyAirChangesPerHour = ParameterValue(internalCondition, InternalConditionParameter.SupplyAirChangesPerHour); @@ -278,16 +282,7 @@ public static partial class Convert designSpecificationOutdoorAir.setOutdoorAirFlowperFloorArea(supplyAirFlowPerArea > 0 ? supplyAirFlowPerArea : 0); designSpecificationOutdoorAir.setOutdoorAirFlowAirChangesperHour(supplyAirChangesPerHour > 0 ? supplyAirChangesPerHour : 0); designSpecificationOutdoorAir.setOutdoorAirFlowRate(supplyAirFlow > 0 ? supplyAirFlow : 0); - - string ventilationProfileName = internalCondition.GetProfileName(ProfileType.Ventilation); - if (ventilationProfileName != null) - { - global::OpenStudio.Schedule ventilationSchedule = RequiredSchedule(internalCondition, profileDictionary, ProfileType.Ventilation, name, openStudioConversionContext); - if (ventilationSchedule != null) - { - designSpecificationOutdoorAir.setOutdoorAirFlowRateFractionSchedule(ventilationSchedule); - } - } + designSpecificationOutdoorAir.setOutdoorAirFlowRateFractionSchedule(VentilationDeliverySchedule(internalCondition, profileDictionary, designSpecificationOutdoorAir.nameString(), openStudioConversionContext)); result.setDesignSpecificationOutdoorAir(designSpecificationOutdoorAir); } @@ -312,18 +307,26 @@ public static partial class Convert } // TAS view coefficients and the lighting control function (coverage manifest, - // Unsupported SAM-OS-IC-001 info; review P1-01): OS:People and OS:ElectricEquipment - // have no visible-fraction field, and the TAS control expression has no - // deterministic daylighting-control mapping. Reported per SpaceType. + // Unsupported SAM-OS-IC-001 info; review P1-01; S07 §5.1): a view coefficient weights + // the emitter's radiation in the TAS mean radiant and resultant temperatures. It is a + // comfort coefficient, not an energy fraction, and EnergyPlus has no input for it. The + // TAS control expression has no deterministic daylighting-control mapping. Reported per + // SpaceType. if (!double.IsNaN(ParameterValue(internalCondition, InternalConditionParameter.OccupancyViewCoefficient))) { - openStudioConversionContext.AddDiagnostic(Core.OpenStudio.OpenStudioDiagnosticCodes.InternalConditionUnsupportedParameter, Core.OpenStudio.OpenStudioDiagnosticSeverity.Information, "Occupancy view coefficient is not converted — OS:People has no visible-fraction field", internalCondition, name); + openStudioConversionContext.AddDiagnostic(Core.OpenStudio.OpenStudioDiagnosticCodes.InternalConditionUnsupportedParameter, Core.OpenStudio.OpenStudioDiagnosticSeverity.Information, "Occupancy view coefficient is not converted — it is a TAS comfort (mean radiant and resultant temperature) coefficient, not an energy fraction; OS:People has no input for it", internalCondition, name); openStudioConversionContext.RegisterSkip(); } if (!double.IsNaN(ParameterValue(internalCondition, InternalConditionParameter.EquipmentViewCoefficient))) { - openStudioConversionContext.AddDiagnostic(Core.OpenStudio.OpenStudioDiagnosticCodes.InternalConditionUnsupportedParameter, Core.OpenStudio.OpenStudioDiagnosticSeverity.Information, "Equipment view coefficient is not converted — OS:ElectricEquipment has no visible-fraction field", internalCondition, name); + openStudioConversionContext.AddDiagnostic(Core.OpenStudio.OpenStudioDiagnosticCodes.InternalConditionUnsupportedParameter, Core.OpenStudio.OpenStudioDiagnosticSeverity.Information, "Equipment view coefficient is not converted — it is a TAS comfort (mean radiant and resultant temperature) coefficient, not an energy fraction; OS:ElectricEquipment has no input for it", internalCondition, name); + openStudioConversionContext.RegisterSkip(); + } + + if (!double.IsNaN(ParameterValue(internalCondition, InternalConditionParameter.LightingViewCoefficient))) + { + openStudioConversionContext.AddDiagnostic(Core.OpenStudio.OpenStudioDiagnosticCodes.InternalConditionUnsupportedParameter, Core.OpenStudio.OpenStudioDiagnosticSeverity.Information, "Lighting view coefficient is not converted — it is a TAS comfort (mean radiant and resultant temperature) coefficient, not an energy fraction; OS:Lights has no input for it, and its Fraction Visible comes from the lighting radiant proportion (S07 §5.1)", internalCondition, name); openStudioConversionContext.RegisterSkip(); } @@ -382,6 +385,79 @@ private static double ParameterValue(InternalCondition internalCondition, Intern return internalCondition.TryGetValue(internalConditionParameter, out value) ? value : double.NaN; } + /// + /// The S07 §5.1 lighting-split note (Information, Summary): the values written, s and its reference category and + /// limits, and, for an absent p, that the common default p₀ was applied and that its suitability outside the + /// category is the open owner decision OD-L1. + /// + private static string LightingSplitMessage(double radiantProportion, bool stated) + { + string values = string.Format(CultureInfo.InvariantCulture, + "Fraction Radiant = p·(1 − s) = {0:0.######}, Fraction Visible = p·s = {1:0.######}, Return Air Fraction 0, convective 1 − p = {2:0.######}; s = 0.2415 / 0.576 = {3:0.#######} (short-wave share of the radiant output)", + LightingSplit.FractionRadiant(radiantProportion), LightingSplit.FractionVisible(radiantProportion), 1 - radiantProportion, LightingSplit.ShortWaveShare); + const string category = "Reference category: suspended (pendant) LED office lighting with the entire fitting in the conditioned room; a midpoint-derived reference from cited historical ranges (IEA SHC Task 61 / EBC Annex 77 D1, Table 6; ASHRAE Fundamentals 2017, Ch. 18, Table 3), not manufacturer-certified. Not applicable to recessed troffers, downlights, retrofit kits, high-bays or non-LED lamps"; + + if (stated) + { + return string.Format(CultureInfo.InvariantCulture, "Lighting radiant proportion p = {0:R} (authored) is split under S07 §5.1 T-LIGHT-SPLIT: {1}. s is a declared assumption, not SAM data. {2}.", radiantProportion, values, category); + } + + return string.Format(CultureInfo.InvariantCulture, "Lighting radiant proportion is not stated; the S07 §5.1 common default p₀ = {0:R} was applied: {1}. {2}. p₀ is not a regulatory, NCM, TM59 or dwelling value, and its suitability outside the reference category is unresolved (owner decision OD-L1); author LightingRadiantProportion where a method or template prescribes it.", radiantProportion, values, category); + } + + /// + /// The outdoor-air delivery schedule of a space's ventilation requirement (S07 D-F2): the selected Ventilation + /// profile when it resolves (V2); otherwise , an all-zero fraction + /// schedule, so the requirement stays in the model and no outdoor air is delivered. No selection (V1) is reported + /// as information; a selection that does not resolve to a Ventilation profile (missing, or another type) is an + /// invalid input and an error. Used for the SpaceType DSOA and for the per-space OutsideSupplyAirFlow DSOA. + /// + /// The space's internal condition; null means no selection. + /// Conversion context. + /// The DSOA the schedule is for (diagnostics). + /// The delivery schedule; never null. + public static global::OpenStudio.Schedule ToOpenStudio_VentilationDeliverySchedule(this InternalCondition internalCondition, OpenStudioConversionContext openStudioConversionContext, string openStudioObjectName) + { + ProfileLibrary profileLibrary = openStudioConversionContext.Source?.ProfileLibrary; + Dictionary profileDictionary = internalCondition == null || profileLibrary == null ? new Dictionary() : internalCondition.GetProfileDictionary(profileLibrary); + return VentilationDeliverySchedule(internalCondition, profileDictionary, openStudioObjectName, openStudioConversionContext); + } + + /// The name of the all-zero fraction schedule that delivers no outdoor air (V1, or an invalid selection). + public const string VentilationNotDeliveredScheduleName = "SAM_Schedule_VentilationNotDelivered"; + + private static global::OpenStudio.Schedule VentilationDeliverySchedule(InternalCondition internalCondition, Dictionary profileDictionary, string openStudioObjectName, OpenStudioConversionContext openStudioConversionContext) + { + string selection = internalCondition?.GetProfileName(ProfileType.Ventilation); + if (string.IsNullOrWhiteSpace(selection)) + { + openStudioConversionContext.AddDiagnostic(Core.OpenStudio.OpenStudioDiagnosticCodes.HvacMissingSetpoints, Core.OpenStudio.OpenStudioDiagnosticSeverity.Information, "No Ventilation profile is selected: the outdoor-air requirement is kept and no outdoor air is delivered (S07 D-F2 V1)", internalCondition, openStudioObjectName); + return openStudioConversionContext.ToOpenStudio_ConstantSchedule(VentilationNotDeliveredScheduleName, 0, "Fractional"); + } + + global::OpenStudio.Schedule result = null; + if (profileDictionary != null && profileDictionary.TryGetValue(ProfileType.Ventilation, out Profile profile) && profile != null) + { + result = profile.ToOpenStudio(ProfileType.Ventilation, openStudioConversionContext); + if (result == null) + { + openStudioConversionContext.AddDiagnostic(Core.OpenStudio.OpenStudioDiagnosticCodes.ScheduleMissingProfile, Core.OpenStudio.OpenStudioDiagnosticSeverity.Error, string.Format("The selected Ventilation profile '{0}' could not be converted; no outdoor air is delivered (never unscheduled)", selection), internalCondition, openStudioObjectName); + } + } + else + { + openStudioConversionContext.AddDiagnostic(Core.OpenStudio.OpenStudioDiagnosticCodes.ScheduleMissingProfile, Core.OpenStudio.OpenStudioDiagnosticSeverity.Error, string.Format("The selected Ventilation profile '{0}' was not found as a Ventilation profile (missing, or of another type): an invalid input; no outdoor air is delivered (never unscheduled)", selection), internalCondition, openStudioObjectName); + } + + if (result == null) + { + openStudioConversionContext.RegisterSkip(); + return openStudioConversionContext.ToOpenStudio_ConstantSchedule(VentilationNotDeliveredScheduleName, 0, "Fractional"); + } + + return result; + } + private static global::OpenStudio.Schedule RequiredSchedule(InternalCondition internalCondition, Dictionary profileDictionary, ProfileType profileType, string openStudioObjectName, OpenStudioConversionContext openStudioConversionContext) { Profile profile; diff --git a/SAM_OpenStudio/SAM.Analytical.OpenStudio/Convert/ToOpenStudio/Material.cs b/SAM_OpenStudio/SAM.Analytical.OpenStudio/Convert/ToOpenStudio/Material.cs index 9b2cbb9..68a7265 100644 --- a/SAM_OpenStudio/SAM.Analytical.OpenStudio/Convert/ToOpenStudio/Material.cs +++ b/SAM_OpenStudio/SAM.Analytical.OpenStudio/Convert/ToOpenStudio/Material.cs @@ -27,6 +27,24 @@ public static partial class Convert /// Construction-usage context (opaque or fenestration). /// OpenStudio material, or null when unsupported/invalid (diagnostic raised). public static global::OpenStudio.Material ToOpenStudio(this IMaterial material, double thickness, OpenStudioConversionContext openStudioConversionContext, OpenStudioMaterialUsage openStudioMaterialUsage = OpenStudioMaterialUsage.OpaqueConstruction) + { + return ToOpenStudio_Layer(material, thickness, openStudioConversionContext, openStudioMaterialUsage, false); + } + + /// + /// Face-aware material conversion for a construction layer. EnergyPlus opaque materials carry one + /// absorptance set for both faces, and only the outermost layer's outside face and the innermost + /// layer's zone face are used. SAM stores layers inside → outside, so SAM's first layer is the zone + /// face of the first space (and of every single-sided surface) and its last layer the outdoor face or + /// the second space's zone face. is therefore true for SAM's first + /// opaque-construction layer only: when that material's Internal* optics differ from its External* + /// ones, an Internal face variant (own cache key, name suffix _Internal) carries the internal + /// values. Every other layer, and every material whose faces agree, uses the external-face object. + /// Forward and reverse constructions share the same objects, so interzone constructions stay exact + /// mirrors. Every opaque object carries the source material Guid, its face and all authored face + /// optics (), so an import recovers both faces. + /// + internal static global::OpenStudio.Material ToOpenStudio_Layer(IMaterial material, double thickness, OpenStudioConversionContext openStudioConversionContext, OpenStudioMaterialUsage openStudioMaterialUsage, bool internalFace) { if (material == null || openStudioConversionContext == null) { @@ -57,7 +75,19 @@ public static partial class Convert : ToOpenStudio_AirGap(gasMaterial, sAMObject, openStudioConversionContext); } - string cacheKey = string.Format(CultureInfo.InvariantCulture, "{0:N}:{1:R}", sAMObject.Guid, thickness); + bool zoneFace = internalFace && material is OpaqueMaterial && openStudioMaterialUsage == OpenStudioMaterialUsage.OpaqueConstruction; + bool internalVariant = zoneFace && DivergentInternalOptics(sAMObject).Count > 0; + + // Inheritance on a zone face, reported once per material at Summary: an Internal* value SAM does not state + // (absent or NaN) takes the stated External* value. The written value is not SAM data, so it is not stamped + // as authored and an import keeps the internal value unspecified. + List inheritedInternalOptics = zoneFace ? InheritedInternalOptics(sAMObject) : new List(); + if (inheritedInternalOptics.Count > 0 && openStudioConversionContext.RegisterOnce("SAM-OS-MAT-004:Inherited:" + sAMObject.Guid.ToString("N"))) + { + openStudioConversionContext.AddDiagnostic(Core.OpenStudio.OpenStudioDiagnosticCodes.MaterialFaceAssumption, Core.OpenStudio.OpenStudioDiagnosticSeverity.Information, string.Format("Zone face: {0} not stated (absent or NaN); the external-side value is written on the zone face and the internal value stays unspecified", string.Join(", ", inheritedInternalOptics)), sAMObject); + } + + string cacheKey = string.Format(CultureInfo.InvariantCulture, "{0:N}:{1:R}{2}", sAMObject.Guid, thickness, internalVariant ? ":Internal" : string.Empty); global::OpenStudio.Material cached; if (openStudioConversionContext.MaterialMap.TryGetValue(cacheKey, out cached)) { @@ -70,7 +100,7 @@ public static partial class Convert return null; } - string name = Core.OpenStudio.Query.OpenStudioName(sAMObject.GetType().Name, string.Format(CultureInfo.InvariantCulture, "{0}_{1:0.###}mm", sAMObject.Name, thickness * 1000), sAMObject.Guid); + string name = Core.OpenStudio.Query.OpenStudioName(sAMObject.GetType().Name, string.Format(CultureInfo.InvariantCulture, "{0}_{1:0.###}mm{2}", sAMObject.Name, thickness * 1000, internalVariant ? "_Internal" : string.Empty), sAMObject.Guid); global::OpenStudio.Material result = null; @@ -89,32 +119,35 @@ public static partial class Convert standardOpaqueMaterial.setDensity(opaqueMaterial.Density); standardOpaqueMaterial.setSpecificHeat(opaqueMaterial.SpecificHeatCapacity); - if (TryGetFraction(openStudioConversionContext, sAMObject, OpaqueMaterialParameter.ExternalEmissivity, name, out double externalEmissivity)) + // The internal variant carries each Internal* value SAM states; a property whose + // Internal* value is not stated keeps its External* value, as on every other layer. + if (TryGetFaceFraction(openStudioConversionContext, sAMObject, OpaqueMaterialParameter.InternalEmissivity, OpaqueMaterialParameter.ExternalEmissivity, internalVariant, name, out double emissivity)) { - standardOpaqueMaterial.setThermalAbsorptance(externalEmissivity); + standardOpaqueMaterial.setThermalAbsorptance(emissivity); } - if (TryGetFraction(openStudioConversionContext, sAMObject, OpaqueMaterialParameter.ExternalSolarReflectance, name, out double externalSolarReflectance)) + if (TryGetFaceFraction(openStudioConversionContext, sAMObject, OpaqueMaterialParameter.InternalSolarReflectance, OpaqueMaterialParameter.ExternalSolarReflectance, internalVariant, name, out double solarReflectance)) { - standardOpaqueMaterial.setSolarAbsorptance(1 - externalSolarReflectance); + standardOpaqueMaterial.setSolarAbsorptance(1 - solarReflectance); } - if (TryGetFraction(openStudioConversionContext, sAMObject, OpaqueMaterialParameter.ExternalLightReflectance, name, out double externalLightReflectance)) + if (TryGetFaceFraction(openStudioConversionContext, sAMObject, OpaqueMaterialParameter.InternalLightReflectance, OpaqueMaterialParameter.ExternalLightReflectance, internalVariant, name, out double lightReflectance)) { - standardOpaqueMaterial.setVisibleAbsorptance(1 - externalLightReflectance); + standardOpaqueMaterial.setVisibleAbsorptance(1 - lightReflectance); } // Single-sided approximation (coverage manifest OpaqueMaterialParameter - // .Internal*, Approximated SAM-OS-MAT-002 info when Internal differs from - // External; review P1-01): EnergyPlus opaque materials carry one absorptance - // set — the external-side values govern both sides. Reported once per material. + // .Internal*; review P1-01): only an opaque pane of a fenestration construction (a + // solid door) still takes the external values on both faces. Opaque constructions + // place an internal variant on the zone face instead (ToOpenStudio_Layer). List divergentInternalOptics = DivergentInternalOptics(sAMObject); - if (divergentInternalOptics.Count > 0 + if (openStudioMaterialUsage == OpenStudioMaterialUsage.FenestrationConstruction && divergentInternalOptics.Count > 0 && openStudioConversionContext.RegisterOnce("SAM-OS-MAT-002:InternalOptics:" + sAMObject.Guid.ToString("N"))) { openStudioConversionContext.AddDiagnostic(Core.OpenStudio.OpenStudioDiagnosticCodes.MaterialUnsupportedParameter, Core.OpenStudio.OpenStudioDiagnosticSeverity.Information, string.Format("Internal-side optical properties ({0}) differ from the external-side values — EnergyPlus opaque materials are single-sided; the external values govern both sides", string.Join(", ", divergentInternalOptics)), sAMObject, name); } + StampOpaqueFaces(standardOpaqueMaterial, sAMObject, internalVariant); result = standardOpaqueMaterial; } else if (material is TransparentMaterial transparentMaterial) @@ -306,7 +339,32 @@ public static partial class Convert /// from its External* counterpart (or has no external counterpart to govern it) — the /// cases where the single-sided EnergyPlus approximation loses information. /// - private static List DivergentInternalOptics(SAMObject sAMObject) + /// + /// The opaque Internal* optical parameters SAM does not state (absent or NaN) while their External* counterpart is + /// stated: on a zone face the external value is written in their place. + /// + internal static List InheritedInternalOptics(SAMObject sAMObject) + { + List result = new List(); + foreach ((OpaqueMaterialParameter internalParameter, OpaqueMaterialParameter externalParameter) in new[] + { + (OpaqueMaterialParameter.InternalEmissivity, OpaqueMaterialParameter.ExternalEmissivity), + (OpaqueMaterialParameter.InternalSolarReflectance, OpaqueMaterialParameter.ExternalSolarReflectance), + (OpaqueMaterialParameter.InternalLightReflectance, OpaqueMaterialParameter.ExternalLightReflectance), + }) + { + bool internalStated = sAMObject.TryGetValue(internalParameter, out double internalValue) && !double.IsNaN(internalValue); + bool externalStated = sAMObject.TryGetValue(externalParameter, out double externalValue) && !double.IsNaN(externalValue); + if (!internalStated && externalStated) + { + result.Add(internalParameter.ToString()); + } + } + + return result; + } + + internal static List DivergentInternalOptics(SAMObject sAMObject) { List result = new List(); AddDivergentInternalOptic(sAMObject, OpaqueMaterialParameter.InternalEmissivity, OpaqueMaterialParameter.ExternalEmissivity, result); @@ -328,6 +386,57 @@ private static void AddDivergentInternalOptic(SAMObject sAMObject, OpaqueMateria } } + /// + /// The face value of one opaque optical property: the Internal* value for an internal variant when SAM + /// states it, otherwise the External* value, validated as a fraction by . + /// + private static bool TryGetFaceFraction(OpenStudioConversionContext openStudioConversionContext, SAMObject sAMObject, OpaqueMaterialParameter internalParameter, OpaqueMaterialParameter externalParameter, bool internalVariant, string openStudioObjectName, out double value) + { + if (internalVariant && sAMObject.TryGetValue(internalParameter, out double internalValue) && !double.IsNaN(internalValue)) + { + return TryGetFraction(openStudioConversionContext, sAMObject, internalParameter, openStudioObjectName, out value); + } + + return TryGetFraction(openStudioConversionContext, sAMObject, externalParameter, openStudioObjectName, out value); + } + + private static readonly OpaqueMaterialParameter[] opaqueOptics = + { + OpaqueMaterialParameter.ExternalEmissivity, OpaqueMaterialParameter.InternalEmissivity, + OpaqueMaterialParameter.ExternalSolarReflectance, OpaqueMaterialParameter.InternalSolarReflectance, + OpaqueMaterialParameter.ExternalLightReflectance, OpaqueMaterialParameter.InternalLightReflectance, + }; + + /// + /// Stamps the source material Guid, the face this object's absorptances carry and every authored face + /// optic SAM states onto the object's AdditionalProperties. Additive metadata: no EnergyPlus input + /// changes. A value SAM does not state is not written, so an import never receives an invented one. + /// + private static void StampOpaqueFaces(global::OpenStudio.StandardOpaqueMaterial standardOpaqueMaterial, SAMObject sAMObject, bool internalVariant) + { + global::OpenStudio.AdditionalProperties additionalProperties = standardOpaqueMaterial.additionalProperties(); + if (additionalProperties == null) + { + return; + } + + additionalProperties.setFeature(Core.OpenStudio.OpenStudioIdentityKeys.MaterialGuid, sAMObject.Guid.ToString("D")); + additionalProperties.setFeature(Core.OpenStudio.OpenStudioIdentityKeys.MaterialFace, internalVariant ? Core.OpenStudio.OpenStudioIdentityKeys.MaterialFaceInternal : Core.OpenStudio.OpenStudioIdentityKeys.MaterialFaceExternal); + foreach (OpaqueMaterialParameter opaqueMaterialParameter in opaqueOptics) + { + if (sAMObject.TryGetValue(opaqueMaterialParameter, out double value) && !double.IsNaN(value)) + { + additionalProperties.setFeature(Core.OpenStudio.OpenStudioIdentityKeys.OpticPrefix + opaqueMaterialParameter, value.ToString("R", CultureInfo.InvariantCulture)); + } + } + + // What was actually written, including inherited values and OpenStudio defaults, so a later edit of the object + // can be told apart from an unchanged default. + additionalProperties.setFeature(Core.OpenStudio.OpenStudioIdentityKeys.WrittenPrefix + "ThermalAbsorptance", standardOpaqueMaterial.thermalAbsorptance().ToString("R", CultureInfo.InvariantCulture)); + additionalProperties.setFeature(Core.OpenStudio.OpenStudioIdentityKeys.WrittenPrefix + "SolarAbsorptance", standardOpaqueMaterial.solarAbsorptance().ToString("R", CultureInfo.InvariantCulture)); + additionalProperties.setFeature(Core.OpenStudio.OpenStudioIdentityKeys.WrittenPrefix + "VisibleAbsorptance", standardOpaqueMaterial.visibleAbsorptance().ToString("R", CultureInfo.InvariantCulture)); + } + private static bool IsValidPositive(double value) { return !double.IsNaN(value) && !double.IsInfinity(value) && value > 0; diff --git a/SAM_OpenStudio/SAM.Analytical.OpenStudio/Convert/ToSAM/AnalyticalModel.cs b/SAM_OpenStudio/SAM.Analytical.OpenStudio/Convert/ToSAM/AnalyticalModel.cs index 66ebd57..0092eaa 100644 --- a/SAM_OpenStudio/SAM.Analytical.OpenStudio/Convert/ToSAM/AnalyticalModel.cs +++ b/SAM_OpenStudio/SAM.Analytical.OpenStudio/Convert/ToSAM/AnalyticalModel.cs @@ -3,6 +3,7 @@ using System; using System.Collections.Generic; +using System.Linq; using SAM.Geometry.Spatial; namespace SAM.Analytical.OpenStudio @@ -82,6 +83,10 @@ internal static AnalyticalModel ToSAM_AnalyticalModel(OpenStudioImportContext op List>> spacePanels = new List>>(); List unpairedInterzoneSurfaces = new List(); + // Which surface each panel was built from: its construction is read innermost layer first from that + // surface's zone (Convert/ToSAM/Construction.cs), so that surface's space must be the panel's first space. + PanelSides panelSides = new PanelSides(); + if (spaceVector != null) { foreach (global::OpenStudio.Space openStudioSpace in spaceVector) @@ -108,7 +113,7 @@ internal static AnalyticalModel ToSAM_AnalyticalModel(OpenStudioImportContext op continue; } - Panel panel = ResolvePanel(surface, transformation, panelBySurfaceName, unpairedInterzoneSurfaces, openStudioImportContext); + Panel panel = ResolvePanel(surface, transformation, panelBySurfaceName, unpairedInterzoneSurfaces, panelSides, openStudioImportContext); if (panel == null) { continue; @@ -145,15 +150,30 @@ internal static AnalyticalModel ToSAM_AnalyticalModel(OpenStudioImportContext op // supersedes the second surface's panel with the first; those supersessions are // recorded so the captured spacePanels lists can be remapped before topology. Dictionary supersededPanels = new Dictionary(); - ResolveUnpairedInterzoneSurfaces(unpairedInterzoneSurfaces, panelBySurfaceName, supersededPanels, openStudioImportContext); + ResolveUnpairedInterzoneSurfaces(unpairedInterzoneSurfaces, panelBySurfaceName, supersededPanels, panelSides, openStudioImportContext); // Pass D: topology. A shared internal panel is added once and related to BOTH spaces — // that relation, not a second coincident panel, is how SAM represents one physical - // partition between two rooms. - foreach (KeyValuePair> keyValuePair in spacePanels) + // partition between two rooms. SAM's first space of a panel is the earlier of its spaces + // in the cluster's space order (the writer's forward side), so the spaces are added in an + // order that puts each panel's building side first (OrderSpaces). + List>> orderedSpacePanels = OrderSpaces(spacePanels, supersededPanels, panelSides, openStudioImportContext); + + // Fail closed: a successful import keeps every opaque surface's native layer order and the absorptances of + // every face EnergyPlus uses. When an edited or mixed model's orientation or face roles cannot reproduce them, + // the import is unsuccessful (SAM-OSI-CON-002) instead of silently changing a used face. + if (!VerifySurfaceFaces(orderedSpacePanels, supersededPanels, panelSides, materialLibrary, openStudioImportContext)) + { + return null; + } + + foreach (KeyValuePair> keyValuePair in orderedSpacePanels) { adjacencyCluster.AddObject(keyValuePair.Key); + } + foreach (KeyValuePair> keyValuePair in orderedSpacePanels) + { // A geometric-fallback pairing replaced the second panel with the first after // this list was captured, so resolve each panel through the supersession map // (and dedupe) or the cluster would keep two coincident panels for one partition. @@ -213,6 +233,536 @@ internal static AnalyticalModel ToSAM_AnalyticalModel(OpenStudioImportContext op } } + /// The side each panel was built from (see and ). + private sealed class PanelSides + { + /// OpenStudio name of the space of the surface the panel was built from. + public Dictionary SpaceName { get; } = new Dictionary(); + + /// Panels built from a surface carrying the SAM-written forward construction. + public HashSet Forward { get; } = new HashSet(); + + /// For a two-sided panel: the SAM construction read from the partner surface (innermost first from the partner's zone), or null. + public Dictionary Partner { get; } = new Dictionary(); + + /// The native layers and used-face absorptances of the surfaces of each panel (its building surface and partner). + public Dictionary> Faces { get; } = new Dictionary>(); + + public void AddFaces(Panel panel, SurfaceFaces surfaceFaces) + { + if (surfaceFaces == null) + { + return; + } + + if (!Faces.TryGetValue(panel, out List list)) + { + list = new List(); + Faces[panel] = list; + } + + list.Add(surfaceFaces); + } + } + + /// + /// Managed snapshot of an OpenStudio surface's construction, taken during the model walk (no SWIG wrapper is kept): + /// its space, boundary, layer names outside first, each layer's physical signature, and the thermal, solar and visible + /// absorptances of its first (outside) and last (zone) layers; null absorptances for a layer that is neither a + /// standard nor a massless opaque material, NaN for a value OpenStudio does not state. + /// + private sealed class SurfaceFaces + { + public string Space { get; set; } + + public string Boundary { get; set; } + + public List Layers { get; set; } = new List(); + + /// + /// Per layer, outside first: thickness, conductivity, density and specific heat of a StandardOpaqueMaterial (the + /// values a SAM-written face or thickness object of a merged source material keeps on its own), null for any other + /// layer kind (massless, air gap: imported at a documented nominal thickness, compared by material only). + /// + public List Physical { get; set; } = new List(); + + public double[] Outside { get; set; } + + public double[] Zone { get; set; } + } + + private static SurfaceFaces Snapshot(global::OpenStudio.Surface surface) + { + try + { + global::OpenStudio.OptionalSpace optionalSpace = surface.space(); + SurfaceFaces result = new SurfaceFaces { Space = optionalSpace == null || optionalSpace.isNull() ? null : optionalSpace.get().nameString(), Boundary = surface.outsideBoundaryCondition() }; + global::OpenStudio.OptionalConstructionBase optionalConstructionBase = surface.construction(); + if (optionalConstructionBase == null || optionalConstructionBase.isNull()) + { + return result; + } + + global::OpenStudio.OptionalConstruction optionalConstruction = optionalConstructionBase.get().to_Construction(); + if (optionalConstruction == null || optionalConstruction.isNull()) + { + return result; + } + + List layers = optionalConstruction.get().layers().ToList(); + result.Layers = layers.Select(x => x.nameString()).ToList(); + result.Physical = layers.Select(Physical).ToList(); + if (layers.Count > 0) + { + result.Outside = Absorptances(layers[0]); + result.Zone = Absorptances(layers[layers.Count - 1]); + } + + return result; + } + catch (Exception) + { + return null; + } + } + + private static double[] Physical(global::OpenStudio.Material material) + { + global::OpenStudio.OptionalStandardOpaqueMaterial optionalStandardOpaqueMaterial = material.to_StandardOpaqueMaterial(); + if (optionalStandardOpaqueMaterial == null || optionalStandardOpaqueMaterial.isNull()) + { + return null; + } + + global::OpenStudio.StandardOpaqueMaterial standardOpaqueMaterial = optionalStandardOpaqueMaterial.get(); + return new[] { standardOpaqueMaterial.thickness(), standardOpaqueMaterial.thermalConductivity(), standardOpaqueMaterial.density(), standardOpaqueMaterial.specificHeat() }; + } + + private static double[] Absorptances(global::OpenStudio.Material material) + { + global::OpenStudio.OptionalStandardOpaqueMaterial optionalStandardOpaqueMaterial = material.to_StandardOpaqueMaterial(); + if (optionalStandardOpaqueMaterial != null && !optionalStandardOpaqueMaterial.isNull()) + { + global::OpenStudio.StandardOpaqueMaterial standardOpaqueMaterial = optionalStandardOpaqueMaterial.get(); + return new[] { standardOpaqueMaterial.thermalAbsorptance(), standardOpaqueMaterial.solarAbsorptance(), standardOpaqueMaterial.visibleAbsorptance() }; + } + + global::OpenStudio.OptionalMasslessOpaqueMaterial optionalMasslessOpaqueMaterial = material.to_MasslessOpaqueMaterial(); + if (optionalMasslessOpaqueMaterial != null && !optionalMasslessOpaqueMaterial.isNull()) + { + global::OpenStudio.MasslessOpaqueMaterial masslessOpaqueMaterial = optionalMasslessOpaqueMaterial.get(); + return new[] { Value(masslessOpaqueMaterial.thermalAbsorptance()), Value(masslessOpaqueMaterial.solarAbsorptance()), Value(masslessOpaqueMaterial.visibleAbsorptance()) }; + } + + return null; + } + + private static double Value(double value) + { + return value; + } + + private static double Value(global::OpenStudio.OptionalDouble optionalDouble) + { + return optionalDouble == null || optionalDouble.isNull() ? double.NaN : optionalDouble.get(); + } + + /// OpenStudio's StandardOpaqueMaterial thermal, solar and visible absorptance defaults: what the writer leaves for an optic SAM does not state. + private static readonly double[] openStudioDefaultAbsorptances = { 0.9, 0.7, 0.7 }; + + /// + /// The thermal, solar and visible absorptances the writer puts on a face from SAM material + /// (Convert/ToOpenStudio/Material.cs): in the zone-face role of SAM's first layer the Internal* value where stated, + /// otherwise, and in every other role, the External* value; OpenStudio's default where neither is stated. Null for a + /// material that is not opaque. + /// + private static double[] WrittenAbsorptances(Core.IMaterial material, bool zoneFaceRole) + { + Core.OpaqueMaterial opaqueMaterial = material as Core.OpaqueMaterial; + if (opaqueMaterial == null) + { + return null; + } + + (OpaqueMaterialParameter Internal, OpaqueMaterialParameter External, bool Direct)[] properties = + { + (OpaqueMaterialParameter.InternalEmissivity, OpaqueMaterialParameter.ExternalEmissivity, true), + (OpaqueMaterialParameter.InternalSolarReflectance, OpaqueMaterialParameter.ExternalSolarReflectance, false), + (OpaqueMaterialParameter.InternalLightReflectance, OpaqueMaterialParameter.ExternalLightReflectance, false), + }; + + double[] result = new double[properties.Length]; + for (int i = 0; i < properties.Length; i++) + { + double value = double.NaN; + bool stated = zoneFaceRole && opaqueMaterial.TryGetValue(properties[i].Internal, out value) && !double.IsNaN(value); + if (!stated) + { + stated = opaqueMaterial.TryGetValue(properties[i].External, out value) && !double.IsNaN(value); + } + + result[i] = !stated ? openStudioDefaultAbsorptances[i] : properties[i].Direct ? value : 1.0 - value; + } + + return result; + } + + /// + /// Compares one side's native layers, already in SAM order, with the panel's SAM layers: each StandardOpaqueMaterial + /// layer's thickness with the SAM layer thickness, and its conductivity, density and specific heat with the SAM + /// material's. Other layer kinds (massless, air gap) keep their documented nominal-thickness import and are matched + /// by material only. A count mismatch is left to the layer-name check. + /// + private static void ComparePhysical(List problems, string space, List nativeNames, List native, List layers, Core.MaterialLibrary materialLibrary) + { + if (native == null || native.Count != layers.Count) + { + return; + } + + string[] names = { "conductivity", "density", "specific heat" }; + for (int i = 0; i < layers.Count; i++) + { + double[] signature = native[i]; + if (signature == null) + { + continue; + } + + if (!Same(signature[0], layers[i].Thickness)) + { + problems.Add(string.Format(System.Globalization.CultureInfo.InvariantCulture, "layer {0} ('{1}') of the surface in space '{2}' is {3:R} m thick but the SAM layer is {4:R} m", i + 1, nativeNames[i], space, signature[0], layers[i].Thickness)); + } + + Core.OpaqueMaterial opaqueMaterial = materialLibrary?.GetMaterial(layers[i].Name) as Core.OpaqueMaterial; + if (opaqueMaterial == null) + { + continue; + } + + double[] sam = { opaqueMaterial.ThermalConductivity, opaqueMaterial.Density, opaqueMaterial.SpecificHeatCapacity }; + for (int j = 0; j < sam.Length; j++) + { + if (!Same(signature[j + 1], sam[j])) + { + problems.Add(string.Format(System.Globalization.CultureInfo.InvariantCulture, "layer {0} ('{1}') of the surface in space '{2}' has {3} {4:R} but the SAM material {5:R}", i + 1, nativeNames[i], space, names[j], signature[j + 1], sam[j])); + } + } + } + } + + private static void CompareFace(List problems, string face, double[] native, double[] written) + { + if (native == null || written == null) + { + return; + } + + string[] names = { "thermal", "solar", "visible" }; + for (int i = 0; i < native.Length; i++) + { + if (!double.IsNaN(native[i]) && Math.Abs(native[i] - written[i]) > 1e-9) + { + problems.Add(string.Format(System.Globalization.CultureInfo.InvariantCulture, "{0} {1} absorptance would be {2:R} instead of the native {3:R}", face, names[i], written[i], native[i])); + } + } + } + + /// + /// Checks every imported opaque surface panel against the native surfaces it was read from: the layers of its first + /// space's surface must be its SAM layers innermost first, those of a second side their mirror, each native + /// StandardOpaqueMaterial layer's own thickness and thermal properties on both sides must be those of the SAM layer + /// it became (merged source names alone would hide a different-thickness object on one side), and the absorptances + /// the writer would put on each face EnergyPlus uses (both zone faces of an interzone panel; the zone face, and the + /// outdoor face of an outdoor surface) must equal the native ones. A mismatch, which only an edited or mixed model + /// whose orientation or face roles cannot be established produces, is error SAM-OSI-CON-002 naming the panel and + /// faces, and the import returns no model. Layers whose native material is neither a standard nor a massless opaque + /// material carry their own diagnostics and are not compared. + /// + private static bool VerifySurfaceFaces(List>> orderedSpacePanels, Dictionary supersededPanels, PanelSides panelSides, Core.MaterialLibrary materialLibrary, OpenStudioImportContext openStudioImportContext) + { + Dictionary spaceNames = new Dictionary(); + foreach (KeyValuePair keyValuePair in openStudioImportContext.SpaceMap) + { + if (keyValuePair.Value != null) + { + spaceNames[keyValuePair.Value] = keyValuePair.Key; + } + } + + Dictionary> panelSpaceNames = new Dictionary>(); + List panels = new List(); + foreach (KeyValuePair> keyValuePair in orderedSpacePanels) + { + if (keyValuePair.Key == null || !spaceNames.TryGetValue(keyValuePair.Key, out string spaceName)) + { + continue; + } + + foreach (Panel panel in keyValuePair.Value) + { + Panel resolvedPanel = ResolveSupersededPanel(panel, supersededPanels); + if (resolvedPanel == null) + { + continue; + } + + if (!panelSpaceNames.TryGetValue(resolvedPanel, out List names)) + { + names = new List(); + panelSpaceNames[resolvedPanel] = names; + panels.Add(resolvedPanel); + } + + if (!names.Contains(spaceName)) + { + names.Add(spaceName); + } + } + } + + string SamName(string openStudioName) + { + return openStudioName != null && openStudioImportContext.MaterialMap.TryGetValue(openStudioName, out Core.IMaterial iMaterial) ? iMaterial?.Name : null; + } + + bool result = true; + foreach (Panel panel in panels) + { + List layers = panel.PanelType == PanelType.Air ? null : panel.Construction?.ConstructionLayers?.FindAll(x => x != null); + if (layers == null || layers.Count == 0 || !panelSides.Faces.TryGetValue(panel, out List faces)) + { + continue; + } + + List spaces = panelSpaceNames[panel]; + SurfaceFaces first = faces.FirstOrDefault(x => x.Space == spaces[0]); + if (first == null || first.Layers.Count == 0) + { + continue; + } + + SurfaceFaces second = spaces.Count > 1 ? faces.FirstOrDefault(x => x.Space == spaces[1]) : null; + List samLayers = layers.Select(x => x.Name).ToList(); + List problems = new List(); + + List firstAsSam = first.Layers.Select(SamName).ToList(); + firstAsSam.Reverse(); + if (!firstAsSam.SequenceEqual(samLayers)) + { + problems.Add(string.Format("the layers of the surface in space '{0}' are not the SAM layers innermost first", spaces[0])); + } + + if (second != null && second.Layers.Count > 0 && !second.Layers.Select(SamName).SequenceEqual(samLayers)) + { + problems.Add(string.Format("the layers of the surface in space '{0}' are not the mirror of the first side", spaces[1])); + } + + // Names alone are not enough: face and thickness objects of one source material merge into one SAM material, + // so each native layer's own thickness and thermal properties are compared with the SAM layer it became, on + // both sides and in each side's direction (innermost first for the first space, as stored for the second). + List firstNames = new List(first.Layers); + firstNames.Reverse(); + List firstPhysical = new List(first.Physical); + firstPhysical.Reverse(); + ComparePhysical(problems, spaces[0], firstNames, firstPhysical, layers, materialLibrary); + if (second != null && second.Layers.Count > 0) + { + ComparePhysical(problems, spaces[1], second.Layers, second.Physical, layers, materialLibrary); + } + + CompareFace(problems, string.Format("the zone face in space '{0}':", spaces[0]), first.Zone, WrittenAbsorptances(materialLibrary?.GetMaterial(samLayers[0]), true)); + bool lastIsFirst = samLayers.Count == 1; + Core.IMaterial last = materialLibrary?.GetMaterial(samLayers[samLayers.Count - 1]); + if (second != null) + { + CompareFace(problems, string.Format("the zone face in space '{0}':", spaces[1]), second.Zone, WrittenAbsorptances(last, lastIsFirst)); + } + else if (string.Equals(first.Boundary, "Outdoors", StringComparison.OrdinalIgnoreCase)) + { + CompareFace(problems, "the outdoor face:", first.Outside, WrittenAbsorptances(last, lastIsFirst)); + } + + if (problems.Count > 0) + { + result = false; + openStudioImportContext.AddDiagnostic(Core.OpenStudio.OpenStudioImportDiagnosticCodes.ConstructionFacesUnresolved, Core.OpenStudio.OpenStudioDiagnosticSeverity.Error, string.Format("Panel '{0}' with construction '{1}' cannot reproduce its native surfaces: {2}. One SAM panel cannot represent these surfaces of this (edited or mixed) model, so the import is unsuccessful rather than changing a layer or a face EnergyPlus uses", panel.Name, panel.Construction.Name, string.Join("; ", problems)), (string)null, panel); + } + } + + return result; + } + + /// The SAM construction a planar surface resolves to (innermost first), or null when it has none or it was not imported. + private static Construction SurfaceConstruction(global::OpenStudio.Surface surface, OpenStudioImportContext openStudioImportContext) + { + try + { + global::OpenStudio.OptionalConstructionBase optionalConstructionBase = surface?.construction(); + if (optionalConstructionBase == null || optionalConstructionBase.isNull()) + { + return null; + } + + string name = optionalConstructionBase.get().nameString(); + return openStudioImportContext.SurfaceConstructionMap.TryGetValue(name, out Construction result) || openStudioImportContext.ConstructionMap.TryGetValue(name, out result) ? result : null; + } + catch (Exception) + { + return null; + } + } + + /// + /// The order the spaces are added to the cluster in. SAM's first space of a two-sided panel is the earlier of its two + /// spaces in that order (the writer gives it the forward construction), and the panel's layers are read innermost + /// first from the side it was built from, so that side's space must come first. + /// + /// The visit order is kept wherever it allows this; a panel built from a SAM-written forward side moves its space + /// before the other one (a stable topological order). Should those requirements contradict each other (only an + /// edited model can), the remaining spaces keep their visit order and a warning names it. A panel whose building + /// side is then not first (an unstamped panel of a mixed model, or a forward side lost to such a contradiction) is + /// re-read from its partner surface's construction (information, SAM-OSI-APX-001). Whether that keeps the native + /// layers and used faces is not assumed: checks it and fails the import otherwise. + /// Replacement panels are recorded in . + /// + /// + private static List>> OrderSpaces(List>> spacePanels, Dictionary supersededPanels, PanelSides panelSides, OpenStudioImportContext openStudioImportContext) + { + int count = spacePanels.Count; + Dictionary> panelSpaces = new Dictionary>(); + for (int i = 0; i < count; i++) + { + foreach (Panel panel in spacePanels[i].Value) + { + Panel resolvedPanel = ResolveSupersededPanel(panel, supersededPanels); + if (resolvedPanel == null) + { + continue; + } + + if (!panelSpaces.TryGetValue(resolvedPanel, out List indexes)) + { + indexes = new List(); + panelSpaces[resolvedPanel] = indexes; + } + + if (!indexes.Contains(i)) + { + indexes.Add(i); + } + } + } + + int SideIndex(Panel panel, List indexes) + { + if (panelSides.SpaceName.TryGetValue(panel, out string name) && openStudioImportContext.SpaceMap.TryGetValue(name, out Space space) && space != null) + { + foreach (int index in indexes) + { + if (ReferenceEquals(space, spacePanels[index].Key)) + { + return index; + } + } + } + + return -1; + } + + List> before = Enumerable.Range(0, count).Select(x => new HashSet()).ToList(); + foreach (KeyValuePair> keyValuePair in panelSpaces) + { + int side = SideIndex(keyValuePair.Key, keyValuePair.Value); + if (keyValuePair.Value.Count == 2 && side >= 0 && panelSides.Forward.Contains(keyValuePair.Key)) + { + before[keyValuePair.Value.Single(x => x != side)].Add(side); + } + } + + List order = new List(); + HashSet placed = new HashSet(); + while (order.Count < count) + { + int next = Enumerable.Range(0, count).Where(x => !placed.Contains(x) && before[x].All(placed.Contains)).DefaultIfEmpty(-1).First(); + if (next < 0) + { + List remaining = Enumerable.Range(0, count).Where(x => !placed.Contains(x)).ToList(); + openStudioImportContext.AddDiagnostic(Core.OpenStudio.OpenStudioImportDiagnosticCodes.ApproximationApplied, Core.OpenStudio.OpenStudioDiagnosticSeverity.Warning, string.Format("The SAM-written forward sides of the interzone panels between spaces {0} cannot all come first in one space order; these spaces keep the OpenStudio order, a panel whose forward side is then second is read from its other side, and the import goes on only if that keeps the native layers and used faces (otherwise SAM-OSI-CON-002)",string.Join(", ", remaining.Select(x => "'" + spacePanels[x].Key?.Name + "'"))), (string)null); + order.AddRange(remaining); + break; + } + + order.Add(next); + placed.Add(next); + } + + Dictionary position = new Dictionary(); + for (int i = 0; i < order.Count; i++) + { + position[order[i]] = i; + } + + foreach (KeyValuePair> keyValuePair in panelSpaces.ToList()) + { + Panel panel = keyValuePair.Key; + int side = SideIndex(panel, keyValuePair.Value); + if (keyValuePair.Value.Count != 2 || side < 0 || keyValuePair.Value.All(x => position[side] <= position[x])) + { + continue; + } + + // Left as built when the partner construction is unknown: VerifySurfaceFaces then fails the import. + if (!panelSides.Partner.TryGetValue(panel, out Construction partner) || partner == null) + { + continue; + } + + Panel reoriented = Analytical.Create.Panel(panel, partner); + if (reoriented == null) + { + continue; + } + + int other = keyValuePair.Value.Single(x => x != side); + supersededPanels[panel] = reoriented; + if (panelSides.Faces.TryGetValue(panel, out List faces)) + { + panelSides.Faces[reoriented] = faces; + } + + openStudioImportContext.AddDiagnostic(Core.OpenStudio.OpenStudioImportDiagnosticCodes.ApproximationApplied, Core.OpenStudio.OpenStudioDiagnosticSeverity.Information, string.Format("Interzone panel built from the side of space '{0}' has space '{1}' first in the imported space order; its construction '{2}' is read from that space's surface instead, and the import goes on only if this keeps the native layers and used faces (otherwise SAM-OSI-CON-002)", spacePanels[side].Key?.Name, spacePanels[other].Key?.Name, partner.Name), (string)null, reoriented); + } + + return order.Select(x => spacePanels[x]).ToList(); + } + + /// + /// True when the surface's construction is the SAM-written forward one: an OS:Construction stamped with + /// SAM type Construction and a SAM Guid. The writer gives it to the panel's first space only, and the + /// reverse construction of the other side carries no stamp. + /// + private static bool IsSamForwardSide(global::OpenStudio.Surface surface) + { + try + { + global::OpenStudio.OptionalConstructionBase optionalConstructionBase = surface?.construction(); + if (optionalConstructionBase == null || optionalConstructionBase.isNull()) + { + return false; + } + + global::OpenStudio.ConstructionBase constructionBase = optionalConstructionBase.get(); + return Core.OpenStudio.Query.TryGetSAMType(constructionBase, out string type) + && string.Equals(type, typeof(Construction).Name, StringComparison.Ordinal) + && Core.OpenStudio.Query.TryGetSAMGuid(constructionBase, out Guid _); + } + catch (Exception) + { + return false; + } + } + /// /// Returns the SAM panel for an OpenStudio surface, creating it only once per physical /// element. @@ -223,8 +773,15 @@ internal static AnalyticalModel ToSAM_AnalyticalModel(OpenStudioImportContext op /// own adjacency handles are authoritative and are always tried first; geometry is only /// consulted later, for surfaces that claim a "Surface" boundary but carry no handle. /// + /// + /// Side: a pair is built from the surface whose construction is the SAM-written forward one + /// () when exactly that partner carries it, so SAM's first + /// space, layer order and face roles come back as they were written; otherwise from the + /// first surface visited, as before. The building side is recorded in + /// . + /// /// - private static Panel ResolvePanel(global::OpenStudio.Surface surface, global::OpenStudio.Transformation transformation, Dictionary panelBySurfaceName, List unpairedInterzoneSurfaces, OpenStudioImportContext openStudioImportContext) + private static Panel ResolvePanel(global::OpenStudio.Surface surface, global::OpenStudio.Transformation transformation, Dictionary panelBySurfaceName, List unpairedInterzoneSurfaces, PanelSides panelSides, OpenStudioImportContext openStudioImportContext) { string surfaceName = surface.nameString(); @@ -257,12 +814,43 @@ private static Panel ResolvePanel(global::OpenStudio.Surface surface, global::Op } } - Panel panel = surface.ToSAM(openStudioImportContext, transformation); + global::OpenStudio.Surface side = surface; + global::OpenStudio.Transformation sideTransformation = transformation; + if (hasAdjacentHandle && !IsSamForwardSide(surface) && IsSamForwardSide(optionalAdjacentSurface.get())) + { + global::OpenStudio.OptionalSpace optionalSpace = optionalAdjacentSurface.get().space(); + if (optionalSpace != null && !optionalSpace.isNull()) + { + side = optionalAdjacentSurface.get(); + sideTransformation = SpaceTransformation(optionalSpace.get()); + } + } + + Panel panel = side.ToSAM(openStudioImportContext, sideTransformation); if (panel == null) { return null; } + global::OpenStudio.OptionalSpace sideSpace = side.space(); + if (sideSpace != null && !sideSpace.isNull()) + { + panelSides.SpaceName[panel] = sideSpace.get().nameString(); + } + + if (IsSamForwardSide(side)) + { + panelSides.Forward.Add(panel); + } + + panelSides.AddFaces(panel, Snapshot(side)); + if (hasAdjacentHandle) + { + global::OpenStudio.Surface partner = ReferenceEquals(side, surface) ? optionalAdjacentSurface.get() : surface; + panelSides.Partner[panel] = SurfaceConstruction(partner, openStudioImportContext); + panelSides.AddFaces(panel, Snapshot(partner)); + } + panelBySurfaceName[surfaceName] = panel; if (hasAdjacentHandle) @@ -276,7 +864,7 @@ private static Panel ResolvePanel(global::OpenStudio.Surface surface, global::Op // and dereferenced after the model walk: doing so aborts the process with an // unmanaged AccessViolationException. The name is the key back into // panelBySurfaceName; the label is all the diagnostics need. - unpairedInterzoneSurfaces.Add(new UnpairedInterzoneSurface(surfaceName, OpenStudioImportContext.OpenStudioObjectLabel(surface))); + unpairedInterzoneSurfaces.Add(new UnpairedInterzoneSurface(surfaceName, OpenStudioImportContext.OpenStudioObjectLabel(surface), IsSamForwardSide(surface))); } return panel; @@ -298,7 +886,7 @@ private static Panel ResolvePanel(global::OpenStudio.Surface surface, global::Op /// exactly what the forward direction does with the mirror-image case. /// /// - private static void ResolveUnpairedInterzoneSurfaces(List surfaces, Dictionary panelBySurfaceName, Dictionary supersededPanels, OpenStudioImportContext openStudioImportContext) + private static void ResolveUnpairedInterzoneSurfaces(List surfaces, Dictionary panelBySurfaceName, Dictionary supersededPanels, PanelSides panelSides, OpenStudioImportContext openStudioImportContext) { if (surfaces == null || surfaces.Count == 0) { @@ -343,15 +931,26 @@ private static void ResolveUnpairedInterzoneSurfaces(List supersededFaces)) + { + supersededFaces.ForEach(x => panelSides.AddFaces(kept, x)); + } paired.Add(nameI); paired.Add(nameJ); - openStudioImportContext.AddDiagnostic(Core.OpenStudio.OpenStudioImportDiagnosticCodes.AdjacencyGeometricFallback, Core.OpenStudio.OpenStudioDiagnosticSeverity.Warning, string.Format("Surfaces '{0}' and '{1}' declare an interzone boundary but carry no OpenStudio adjacency handle; they were paired into one SAM panel by validated geometric matching (coincident centroids, comparable areas, opposed normals) - verify the source model's adjacency", nameI, nameJ), surfaces[i].Label, panelI); + openStudioImportContext.AddDiagnostic(Core.OpenStudio.OpenStudioImportDiagnosticCodes.AdjacencyGeometricFallback, Core.OpenStudio.OpenStudioDiagnosticSeverity.Warning, string.Format("Surfaces '{0}' and '{1}' declare an interzone boundary but carry no OpenStudio adjacency handle; they were paired into one SAM panel by validated geometric matching (coincident centroids, comparable areas, opposed normals) - verify the source model's adjacency", nameI, nameJ), surfaces[i].Label, kept); break; } } @@ -403,12 +1002,16 @@ private static Panel ResolveSupersededPanel(Panel panel, Dictionary private struct UnpairedInterzoneSurface { - public UnpairedInterzoneSurface(string name, string label) + public UnpairedInterzoneSurface(string name, string label, bool samForwardSide) { Name = name; Label = label; + SamForwardSide = samForwardSide; } + /// True when the surface's construction is the SAM-written forward one (see IsSamForwardSide). + public bool SamForwardSide { get; } + /// OpenStudio surface name; the key into panelBySurfaceName. public string Name { get; } diff --git a/SAM_OpenStudio/SAM.Analytical.OpenStudio/Convert/ToSAM/Construction.cs b/SAM_OpenStudio/SAM.Analytical.OpenStudio/Convert/ToSAM/Construction.cs index 894ccc1..265d607 100644 --- a/SAM_OpenStudio/SAM.Analytical.OpenStudio/Convert/ToSAM/Construction.cs +++ b/SAM_OpenStudio/SAM.Analytical.OpenStudio/Convert/ToSAM/Construction.cs @@ -22,9 +22,16 @@ public static partial class Convert /// stable regardless of import order. /// /// - /// Layer order is preserved exactly as OpenStudio stores it — outside first — which is - /// the order the forward converter writes, so a construction survives a round trip - /// without being reversed. + /// Layer order: OpenStudio stores layers outside first, SAM inside → outside from the + /// panel's first space (the forward converter reverses SAM's order). An opaque layered + /// construction used by a planar surface is therefore read innermost layer first, so the + /// layer facing the surface's zone is SAM's first layer and an export, import and export + /// keeps every layer, thickness and exposed face in place. Fenestration constructions + /// (glazing, gas and opaque door panes), air boundaries, non-layered constructions and + /// constructions no planar surface uses keep OpenStudio's order. A construction that is + /// used by planar surfaces and also by a subsurface or shading surface is split: the + /// surfaces get the innermost-first SAM construction, the other uses a separate one in + /// OpenStudio's order (reported). /// /// /// Import context. @@ -179,6 +186,29 @@ private static object ToSAM_Construction(global::OpenStudio.ConstructionBase con return apertureConstruction; } + (bool surfaceUse, bool otherUse) = ConstructionUse(constructionBase, openStudioImportContext); + if (surfaceUse) + { + List innermostFirst = new List(constructionLayers); + innermostFirst.Reverse(); + if (otherUse) + { + Construction surfaceConstruction = new Construction(openStudioImportContext.ResolveGuid(constructionBase, typeof(Construction).Name), name, innermostFirst); + Modify.SetOpenStudioSource(surfaceConstruction, constructionBase); + openStudioImportContext.SurfaceConstructionMap[name] = surfaceConstruction; + openStudioImportContext.RegisterCreated(); + + Construction openStudioOrder = new Construction(openStudioImportContext.ResolveGuid(null), name, constructionLayers); + Modify.SetOpenStudioSource(openStudioOrder, constructionBase); + openStudioImportContext.ConstructionMap[name] = openStudioOrder; + openStudioImportContext.RegisterCreated(); + openStudioImportContext.AddDiagnostic(Core.OpenStudio.OpenStudioImportDiagnosticCodes.ApproximationApplied, Core.OpenStudio.OpenStudioDiagnosticSeverity.Information, "Opaque construction is used by planar surfaces and by a subsurface or shading surface: the surfaces receive a SAM construction read innermost layer first (SAM inside -> outside), the other uses a separate SAM construction in OpenStudio's layer order with its own Guid", label); + return surfaceConstruction; + } + + constructionLayers = innermostFirst; + } + Construction result = new Construction(openStudioImportContext.ResolveGuid(constructionBase, typeof(Construction).Name), name, constructionLayers); Modify.SetOpenStudioSource(result, constructionBase); openStudioImportContext.ConstructionMap[name] = result; @@ -186,6 +216,60 @@ private static object ToSAM_Construction(global::OpenStudio.ConstructionBase con return result; } + /// + /// Whether planar surfaces, and whether subsurfaces or shading surfaces, of the source model use + /// (directly or through a default construction set), read once per import. + /// + private static (bool Surface, bool Other) ConstructionUse(global::OpenStudio.ConstructionBase constructionBase, OpenStudioImportContext openStudioImportContext) + { + if (openStudioImportContext.ConstructionUses == null) + { + Dictionary uses = new Dictionary(StringComparer.Ordinal); + void Use(global::OpenStudio.OptionalConstructionBase optionalConstructionBase, bool surface) + { + if (optionalConstructionBase == null || optionalConstructionBase.isNull()) + { + return; + } + + string key = optionalConstructionBase.get().handle().__str__(); + uses.TryGetValue(key, out (bool Surface, bool Other) use); + uses[key] = surface ? (true, use.Other) : (use.Surface, true); + } + + try + { + foreach (global::OpenStudio.Surface surface in openStudioImportContext.Source.getSurfaces()) + { + Use(surface.construction(), true); + } + + foreach (global::OpenStudio.SubSurface subSurface in openStudioImportContext.Source.getSubSurfaces()) + { + Use(subSurface.construction(), false); + } + + foreach (global::OpenStudio.ShadingSurface shadingSurface in openStudioImportContext.Source.getShadingSurfaces()) + { + Use(shadingSurface.construction(), false); + } + + foreach (global::OpenStudio.InteriorPartitionSurface interiorPartitionSurface in openStudioImportContext.Source.getInteriorPartitionSurfaces()) + { + Use(interiorPartitionSurface.construction(), false); + } + } + catch (Exception) + { + // an unreadable use leaves the construction in OpenStudio's order, as before + } + + openStudioImportContext.ConstructionUses = uses; + } + + return openStudioImportContext.ConstructionUses.TryGetValue(constructionBase.handle().__str__(), out (bool Surface, bool Other) result) ? result : (false, false); + } + /// /// Thickness [m] of a construction layer. OpenStudio reports 0 for layers defined by /// resistance rather than geometry (massless, air gap, simple glazing); the nominal diff --git a/SAM_OpenStudio/SAM.Analytical.OpenStudio/Convert/ToSAM/InternalCondition.cs b/SAM_OpenStudio/SAM.Analytical.OpenStudio/Convert/ToSAM/InternalCondition.cs index c47eccb..49e9bab 100644 --- a/SAM_OpenStudio/SAM.Analytical.OpenStudio/Convert/ToSAM/InternalCondition.cs +++ b/SAM_OpenStudio/SAM.Analytical.OpenStudio/Convert/ToSAM/InternalCondition.cs @@ -233,12 +233,48 @@ private static void ToSAM_Lights(global::OpenStudio.SpaceType spaceType, Interna } } - internalCondition.SetValue(InternalConditionParameter.LightingRadiantProportion, lightsDefinition.fractionRadiant()); - internalCondition.SetValue(InternalConditionParameter.LightingViewCoefficient, lightsDefinition.fractionVisible()); + ToSAM_LightingRadiantProportion(lightsDefinition, internalCondition, openStudioImportContext, label); AssignProfile(internalCondition, InternalConditionParameter.LightingProfileName, lights.schedule(), ProfileType.Lighting, openStudioImportContext, profileLibrary); } + /// + /// Lights radiant and visible fractions → SAM's total radiant share (S07 §5.1, default resolution item 5): + /// p = Fraction Radiant + Fraction Visible. The view coefficient is a comfort coefficient, not an energy fraction, + /// and is not set. A return-air share has no SAM allocation and becomes part of the convective room gain + /// (warning); a short-wave share of the radiant output other than s is reported (information). A sum above 1 is + /// an EnergyPlus input error and is not imported. + /// + private static void ToSAM_LightingRadiantProportion(global::OpenStudio.LightsDefinition lightsDefinition, InternalCondition internalCondition, OpenStudioImportContext openStudioImportContext, string label) + { + double fractionRadiant = lightsDefinition.fractionRadiant(); + double fractionVisible = lightsDefinition.fractionVisible(); + double fractionReturnAir = lightsDefinition.returnAirFraction(); + if (double.IsNaN(fractionRadiant) || double.IsNaN(fractionVisible)) + { + return; + } + + double radiantProportion = fractionRadiant + fractionVisible; + if (radiantProportion > 1 + 1e-9 || (!double.IsNaN(fractionReturnAir) && fractionReturnAir + radiantProportion > 1 + 1e-9)) + { + openStudioImportContext.AddDiagnostic(Core.OpenStudio.OpenStudioImportDiagnosticCodes.ApproximationApplied, Core.OpenStudio.OpenStudioDiagnosticSeverity.Warning, string.Format(CultureInfo.InvariantCulture, "The Lights fractions sum above 1 (Return Air {0:G6}, Radiant {1:G6}, Visible {2:G6}), an EnergyPlus input error; no lighting radiant proportion was imported", fractionReturnAir, fractionRadiant, fractionVisible), label, internalCondition); + return; + } + + internalCondition.SetValue(InternalConditionParameter.LightingRadiantProportion, radiantProportion); + + if (!double.IsNaN(fractionReturnAir) && fractionReturnAir > 0) + { + openStudioImportContext.AddDiagnostic(Core.OpenStudio.OpenStudioImportDiagnosticCodes.ApproximationApplied, Core.OpenStudio.OpenStudioDiagnosticSeverity.Warning, string.Format(CultureInfo.InvariantCulture, "The Lights Return Air Fraction {0:G6} has no SAM allocation; that share becomes part of the convective room gain (SAM convective share 1 − p = {1:G6}, S07 §5.1)", fractionReturnAir, 1 - radiantProportion), label, internalCondition); + } + + if (radiantProportion > 0 && Math.Abs(fractionVisible / radiantProportion - LightingSplit.ShortWaveShare) > 1e-6) + { + openStudioImportContext.AddDiagnostic(Core.OpenStudio.OpenStudioImportDiagnosticCodes.ApproximationApplied, Core.OpenStudio.OpenStudioDiagnosticSeverity.Information, string.Format(CultureInfo.InvariantCulture, "The Lights short-wave share of the radiant output, Fraction Visible / (Fraction Radiant + Fraction Visible) = {0:G6}, differs from the S07 §5.1 declared s = {1:G6}; SAM keeps only the total radiant share p = {2:G6}, so an export re-splits it by s", fractionVisible / radiantProportion, LightingSplit.ShortWaveShare, radiantProportion), label, internalCondition); + } + } + /// /// ElectricEquipment → sensible and latent equipment gains. /// diff --git a/SAM_OpenStudio/SAM.Analytical.OpenStudio/Convert/ToSAM/MaterialLibrary.cs b/SAM_OpenStudio/SAM.Analytical.OpenStudio/Convert/ToSAM/MaterialLibrary.cs index 7688cc3..a4d1d0f 100644 --- a/SAM_OpenStudio/SAM.Analytical.OpenStudio/Convert/ToSAM/MaterialLibrary.cs +++ b/SAM_OpenStudio/SAM.Analytical.OpenStudio/Convert/ToSAM/MaterialLibrary.cs @@ -4,6 +4,7 @@ using System; using System.Collections.Generic; using System.Globalization; +using System.Linq; using SAM.Core; namespace SAM.Analytical.OpenStudio @@ -108,11 +109,32 @@ public static IMaterial ToSAM(this global::OpenStudio.Material material, OpenStu } string label = OpenStudioImportContext.OpenStudioObjectLabel(material); + global::OpenStudio.OptionalStandardOpaqueMaterial optionalStandardOpaqueMaterial = global::OpenStudio.OpenStudioModelResources.toStandardOpaqueMaterial(material); + + // SAM-written face and thickness objects of one source material become one SAM material, matched by the + // explicit source Guid only (never by name). Null when there is nothing to merge or they conflict. The object + // itself is validated first and must be a member of the group: a malformed one carrying the same source Guid + // is imported as its own material with its own properties, reported, never aliased to a valid group. + if (optionalStandardOpaqueMaterial != null && !optionalStandardOpaqueMaterial.isNull() && TryGetSourceMaterialGuid(optionalStandardOpaqueMaterial.get(), out Guid sourceGuid) + && ReadFaceObject(optionalStandardOpaqueMaterial.get(), openStudioImportContext, label, false) != null) + { + if (!openStudioImportContext.OpaqueMaterialGroups.TryGetValue(sourceGuid, out (IMaterial Material, ISet Members) group)) + { + group = MergedOpaqueMaterial(sourceGuid, openStudioImportContext); + openStudioImportContext.OpaqueMaterialGroups[sourceGuid] = group; + } + + if (group.Material != null && group.Members.Contains(Handle(material))) + { + openStudioImportContext.MaterialMap[name] = group.Material; + return group.Material; + } + } + Guid guid = openStudioImportContext.ResolveGuid(material); IMaterial result = null; - global::OpenStudio.OptionalStandardOpaqueMaterial optionalStandardOpaqueMaterial = global::OpenStudio.OpenStudioModelResources.toStandardOpaqueMaterial(material); if (optionalStandardOpaqueMaterial != null && !optionalStandardOpaqueMaterial.isNull()) { result = ToSAM_OpaqueMaterial(optionalStandardOpaqueMaterial.get(), guid, name, openStudioImportContext, label); @@ -197,25 +219,435 @@ private static IMaterial ToSAM_OpaqueMaterial(global::OpenStudio.StandardOpaqueM result.SetValue(Core.MaterialParameter.DefaultThickness, standardOpaqueMaterial.thickness()); - // EnergyPlus opaque materials are single-sided: one absorptance set governs both - // faces. Both SAM sides therefore receive the same value - recorded here so the - // asymmetry the forward converter warns about is not silently invented on the way - // back. double thermalAbsorptance = standardOpaqueMaterial.thermalAbsorptance(); + double solarReflectance = 1.0 - standardOpaqueMaterial.solarAbsorptance(); + double visibleReflectance = 1.0 - standardOpaqueMaterial.visibleAbsorptance(); + + // A SAM-written object carries both authored face sets explicitly (the forward converter + // writes an internal-face variant for a zone face). When that metadata is usable, exactly the + // authored values are restored - nothing unstated is filled in - and an edit made to the object + // after it was written is kept on the face it carries, reported. + FaceObject faceObject = ReadFaceObject(standardOpaqueMaterial, openStudioImportContext, label, true); + if (faceObject != null) + { + foreach (KeyValuePair keyValuePair in faceObject.Authored) + { + result.SetValue(keyValuePair.Key, keyValuePair.Value); + } + + ApplyEdits(result, new[] { faceObject }, faceObject.Edits, openStudioImportContext); + return result; + } + + // EnergyPlus opaque materials are single-sided: one absorptance set governs both + // faces. Without usable SAM face metadata both SAM sides therefore receive the same + // value - recorded here so no asymmetry is invented on the way back. result.SetValue(OpaqueMaterialParameter.ExternalEmissivity, thermalAbsorptance); result.SetValue(OpaqueMaterialParameter.InternalEmissivity, thermalAbsorptance); - - double solarReflectance = 1.0 - standardOpaqueMaterial.solarAbsorptance(); result.SetValue(OpaqueMaterialParameter.ExternalSolarReflectance, solarReflectance); result.SetValue(OpaqueMaterialParameter.InternalSolarReflectance, solarReflectance); - - double visibleReflectance = 1.0 - standardOpaqueMaterial.visibleAbsorptance(); result.SetValue(OpaqueMaterialParameter.ExternalLightReflectance, visibleReflectance); result.SetValue(OpaqueMaterialParameter.InternalLightReflectance, visibleReflectance); return result; } + private static readonly OpaqueMaterialParameter[] stampedOptics = + { + OpaqueMaterialParameter.ExternalEmissivity, OpaqueMaterialParameter.InternalEmissivity, + OpaqueMaterialParameter.ExternalSolarReflectance, OpaqueMaterialParameter.InternalSolarReflectance, + OpaqueMaterialParameter.ExternalLightReflectance, OpaqueMaterialParameter.InternalLightReflectance, + }; + + /// One SAM-written opaque face object, read from its explicit metadata. + private sealed class FaceObject + { + public global::OpenStudio.StandardOpaqueMaterial Material { get; set; } + public string Name { get; set; } + public string Label { get; set; } + public Guid MaterialGuid { get; set; } + public bool Internal { get; set; } + public bool CarriesIdentity { get; set; } + + /// The authored SAM face optics the writer stamped (unstated ones absent). + public Dictionary Authored { get; } = new Dictionary(); + + /// Values changed since the object was written, as SAM values on the face the object carries. + public Dictionary Edits { get; } = new Dictionary(); + + /// Per edited parameter: what was written and what is there now. + public Dictionary EditNotes { get; } = new Dictionary(); + + public string Signature => string.Join(";", Authored.OrderBy(x => x.Key.ToString(), StringComparer.Ordinal).Select(x => x.Key + "=" + x.Value.ToString("R", CultureInfo.InvariantCulture))); + + private (bool Internal, bool External, bool Exposed, string Note)? faces; + + /// + /// The SAM faces whose values this object's single absorptance set supplies, so an edit is kept on each of + /// them. The writer's contract decides it where it can: an internal variant is placed only on its material's + /// zone face, and an external-face object of a material whose authored faces differ never is (the variant + /// is). An external-face object of a material whose faces agree is shared by every layer position, so its + /// faces are read from the constructions that use it (). When it supplies no exposed + /// face nothing distinguishes the faces: its single value is kept on the external face and on each stated + /// internal one, so no asymmetry is invented and an unstated internal value still takes the external one. + /// + public (bool Internal, bool External, bool Exposed, string Note) Faces + { + get + { + if (faces == null) + { + if (Internal) + { + faces = (true, false, true, string.Empty); + } + else if (DivergentAuthoredOptics(Authored)) + { + faces = (false, true, true, string.Empty); + } + else + { + (bool servesInternal, bool servesExternal) = ServedFaces(Material); + faces = !servesInternal && !servesExternal + ? (true, true, false, "; its material's faces agree and it supplies no exposed face, so the value is kept on both faces") + : (servesInternal, servesExternal, true, servesInternal ? "; its material's faces agree and this shared object supplies the zone face" + (servesExternal ? " and the outer face" : string.Empty) : string.Empty); + } + } + + return faces.Value; + } + } + + /// True when this object supplies the face of (see ). + public bool Carries(OpaqueMaterialParameter opaqueMaterialParameter) + { + if (!opaqueMaterialParameter.ToString().StartsWith("Internal", StringComparison.Ordinal)) + { + return Faces.External; + } + + return Faces.Internal && (Faces.Exposed || Authored.ContainsKey(opaqueMaterialParameter)); + } + } + + /// True when an authored Internal* optic differs from its External* counterpart or has none: the writer then places an internal variant on the zone face (mirrors the writer's DivergentInternalOptics). + private static bool DivergentAuthoredOptics(Dictionary authored) + { + foreach ((OpaqueMaterialParameter internalParameter, OpaqueMaterialParameter externalParameter) in new[] + { + (OpaqueMaterialParameter.InternalEmissivity, OpaqueMaterialParameter.ExternalEmissivity), + (OpaqueMaterialParameter.InternalSolarReflectance, OpaqueMaterialParameter.ExternalSolarReflectance), + (OpaqueMaterialParameter.InternalLightReflectance, OpaqueMaterialParameter.ExternalLightReflectance), + }) + { + if (authored.TryGetValue(internalParameter, out double internalValue) && (!authored.TryGetValue(externalParameter, out double externalValue) || Math.Abs(internalValue - externalValue) > 1e-9)) + { + return true; + } + } + + return false; + } + + /// + /// The SAM faces an opaque object supplies through the constructions that use it as their outermost or innermost + /// layer. A SAM-written opaque construction (SAM type Construction) is the forward, outside-first one: its last + /// layer is the SAM first layer's zone face (internal) and its first layer the SAM last layer's outer face + /// (external). A SAM-written fenestration construction (an opaque door pane) takes the external values on both + /// faces. A construction without SAM identity that mirrors a SAM-written one is its reverse and shares its + /// objects; any other construction's direction is unknown, so an exposed position supplies both faces. + /// + private static (bool Internal, bool External) ServedFaces(global::OpenStudio.StandardOpaqueMaterial standardOpaqueMaterial) + { + bool servesInternal = false; + bool servesExternal = false; + string handle = Handle(standardOpaqueMaterial); + + List<(global::OpenStudio.Construction Construction, List Layers)> constructions = standardOpaqueMaterial.model().getConstructions() + .Select(x => (x, x.layers().Select(Handle).ToList())).ToList(); + HashSet written = new HashSet(constructions.Where(x => Core.OpenStudio.Query.TryGetSAMType(x.Construction, out string _)).Select(x => string.Join("|", x.Layers)), StringComparer.Ordinal); + + foreach ((global::OpenStudio.Construction construction, List layers) in constructions) + { + bool outermost = layers.Count > 0 && layers[0] == handle; + bool innermost = layers.Count > 0 && layers[layers.Count - 1] == handle; + if (!outermost && !innermost) + { + continue; + } + + if (Core.OpenStudio.Query.TryGetSAMType(construction, out string type)) + { + if (string.Equals(type, typeof(Construction).Name, StringComparison.Ordinal)) + { + servesInternal |= innermost; + servesExternal |= outermost; + } + else + { + servesExternal = true; + } + + continue; + } + + List reversed = new List(layers); + reversed.Reverse(); + if (written.Contains(string.Join("|", reversed))) + { + continue; + } + + servesInternal = true; + servesExternal = true; + } + + return (servesInternal, servesExternal); + } + + private static string Handle(global::OpenStudio.ModelObject modelObject) + { + return modelObject?.handle()?.__str__() ?? string.Empty; + } + + private const string singleValueOnBothFaces = "; the object is imported as its own material, never merged with others of its source, and its single EnergyPlus value is imported on both faces"; + + /// The source SAM material Guid stamped on a SAM-written opaque object, if well formed. + private static bool TryGetSourceMaterialGuid(global::OpenStudio.StandardOpaqueMaterial standardOpaqueMaterial, out Guid materialGuid) + { + materialGuid = Guid.Empty; + return Core.OpenStudio.Query.TryGetSAMFeature(standardOpaqueMaterial, Core.OpenStudio.OpenStudioIdentityKeys.MaterialFace, out string _) + && Core.OpenStudio.Query.TryGetSAMFeature(standardOpaqueMaterial, Core.OpenStudio.OpenStudioIdentityKeys.MaterialGuid, out string raw) + && Guid.TryParse(raw, out materialGuid) && materialGuid != Guid.Empty; + } + + /// + /// Reads the SAM face metadata of an opaque object (see ). + /// Null when the object has none (a third-party or older OSM: silent) or it cannot be trusted (reported when + /// ): the source Guid and face must be well formed, any SAM.Guid must name the + /// same material, every stamped value must be a fraction, and the written values must agree with the authored + /// face they came from. + /// + /// Each absorptance is compared with the value the writer put there (SAM.Written.*, or the authored face it + /// came from): an unchanged object keeps exactly the authored values, so an OpenStudio default written for an + /// unstated value is never imported as SAM data, while a changed value is an edit, kept on every face the object + /// supplies (). Without either record the value's provenance is unknown and it is + /// kept as an edit too. + /// + /// + private static FaceObject ReadFaceObject(global::OpenStudio.StandardOpaqueMaterial standardOpaqueMaterial, OpenStudioImportContext openStudioImportContext, string label, bool report) + { + if (!Core.OpenStudio.Query.TryGetSAMFeature(standardOpaqueMaterial, Core.OpenStudio.OpenStudioIdentityKeys.MaterialFace, out string face)) + { + return null; + } + + if (!Core.OpenStudio.Query.TryGetSAMFeature(standardOpaqueMaterial, Core.OpenStudio.OpenStudioIdentityKeys.MaterialGuid, out string rawGuid) || !Guid.TryParse(rawGuid, out Guid materialGuid) || materialGuid == Guid.Empty + || (face != Core.OpenStudio.OpenStudioIdentityKeys.MaterialFaceExternal && face != Core.OpenStudio.OpenStudioIdentityKeys.MaterialFaceInternal)) + { + Report(report, openStudioImportContext, Core.OpenStudio.OpenStudioImportDiagnosticCodes.IdentityCollision, string.Format("SAM face metadata is malformed (source material '{0}', face '{1}')" + singleValueOnBothFaces, rawGuid, face), label); + return null; + } + + bool carriesIdentity = Core.OpenStudio.Query.TryGetSAMGuid(standardOpaqueMaterial, out Guid ownGuid); + if (carriesIdentity && ownGuid != materialGuid) + { + Report(report, openStudioImportContext, Core.OpenStudio.OpenStudioImportDiagnosticCodes.IdentityCollision, string.Format("SAM identity {0} and source material {1} of this face object disagree" + singleValueOnBothFaces, ownGuid, materialGuid), label); + return null; + } + + FaceObject result = new FaceObject { Material = standardOpaqueMaterial, Name = standardOpaqueMaterial.nameString(), Label = label, MaterialGuid = materialGuid, Internal = face == Core.OpenStudio.OpenStudioIdentityKeys.MaterialFaceInternal, CarriesIdentity = carriesIdentity }; + foreach (OpaqueMaterialParameter opaqueMaterialParameter in stampedOptics) + { + if (!Core.OpenStudio.Query.TryGetSAMFeature(standardOpaqueMaterial, Core.OpenStudio.OpenStudioIdentityKeys.OpticPrefix + opaqueMaterialParameter, out string raw)) + { + continue; + } + + if (!double.TryParse(raw, NumberStyles.Float, CultureInfo.InvariantCulture, out double value) || double.IsNaN(value) || value < 0 || value > 1) + { + Report(report, openStudioImportContext, Core.OpenStudio.OpenStudioImportDiagnosticCodes.MaterialUnsupported, string.Format("Stamped SAM {0} '{1}' is not a fraction" + singleValueOnBothFaces, opaqueMaterialParameter, raw), label); + return null; + } + + result.Authored[opaqueMaterialParameter] = value; + } + + // (internal, external, written key, native absorptance, absorptance is the SAM value itself) + (OpaqueMaterialParameter Internal, OpaqueMaterialParameter External, string Written, double Native, bool Direct)[] properties = + { + (OpaqueMaterialParameter.InternalEmissivity, OpaqueMaterialParameter.ExternalEmissivity, "ThermalAbsorptance", standardOpaqueMaterial.thermalAbsorptance(), true), + (OpaqueMaterialParameter.InternalSolarReflectance, OpaqueMaterialParameter.ExternalSolarReflectance, "SolarAbsorptance", standardOpaqueMaterial.solarAbsorptance(), false), + (OpaqueMaterialParameter.InternalLightReflectance, OpaqueMaterialParameter.ExternalLightReflectance, "VisibleAbsorptance", standardOpaqueMaterial.visibleAbsorptance(), false), + }; + + foreach ((OpaqueMaterialParameter internalParameter, OpaqueMaterialParameter externalParameter, string writtenKey, double native, bool direct) in properties) + { + double? written = null; + if (Core.OpenStudio.Query.TryGetSAMFeature(standardOpaqueMaterial, Core.OpenStudio.OpenStudioIdentityKeys.WrittenPrefix + writtenKey, out string rawWritten)) + { + if (!double.TryParse(rawWritten, NumberStyles.Float, CultureInfo.InvariantCulture, out double parsed) || double.IsNaN(parsed)) + { + Report(report, openStudioImportContext, Core.OpenStudio.OpenStudioImportDiagnosticCodes.MaterialUnsupported, string.Format("Stamped written {0} '{1}' is not a number" + singleValueOnBothFaces, writtenKey, rawWritten), label); + return null; + } + + written = parsed; + } + + // The authored face the writer used: the internal value on an internal-face object when stated, else the external one. + OpaqueMaterialParameter source = result.Internal && result.Authored.ContainsKey(internalParameter) ? internalParameter : externalParameter; + if (result.Authored.TryGetValue(source, out double authored)) + { + double expected = direct ? authored : 1.0 - authored; + if (written.HasValue && Math.Abs(written.Value - expected) > 1e-9) + { + Report(report, openStudioImportContext, Core.OpenStudio.OpenStudioImportDiagnosticCodes.MaterialUnsupported, string.Format(CultureInfo.InvariantCulture, "Stamped written {0} {1:R} disagrees with the stamped SAM {2} {3:R}" + singleValueOnBothFaces, writtenKey, written.Value, source, authored), label); + return null; + } + + written = written ?? expected; + } + + if (written.HasValue && Math.Abs(written.Value - native) <= 1e-9) + { + continue; + } + + // Kept on every SAM face the object supplies (FaceObject.Faces), never only on the face it is stamped with. + foreach (OpaqueMaterialParameter onFace in new[] { internalParameter, externalParameter }.Where(result.Carries)) + { + result.Edits[onFace] = direct ? native : 1.0 - native; + result.EditNotes[onFace] = (written.HasValue + ? string.Format(CultureInfo.InvariantCulture, "{0} written {1:R}, now {2:R}", writtenKey, written.Value, native) + : string.Format(CultureInfo.InvariantCulture, "{0} {1:R} with no record of what was written", writtenKey, native)) + result.Faces.Note; + } + } + + return result; + } + + private static void Report(bool report, OpenStudioImportContext openStudioImportContext, string code, string message, string label) + { + if (report) + { + openStudioImportContext.AddDiagnostic(code, Core.OpenStudio.OpenStudioDiagnosticSeverity.Warning, message, label); + } + } + + /// Sets each edited value on its face and reports it: an edit made after export is kept, never silently replaced by an authored value or a default. + private static void ApplyEdits(OpaqueMaterial opaqueMaterial, IEnumerable faceObjects, Dictionary edits, OpenStudioImportContext openStudioImportContext) + { + foreach (KeyValuePair keyValuePair in edits) + { + opaqueMaterial.SetValue(keyValuePair.Key, keyValuePair.Value); + } + + foreach (FaceObject faceObject in faceObjects) + { + foreach (KeyValuePair note in faceObject.EditNotes) + { + openStudioImportContext.AddDiagnostic(Core.OpenStudio.OpenStudioImportDiagnosticCodes.MaterialUnsupported, Core.OpenStudio.OpenStudioDiagnosticSeverity.Warning, string.Format(CultureInfo.InvariantCulture, "The {0}-face object was changed after it was written ({1}); the changed value is imported as SAM {2} = {3:R}", faceObject.Internal ? "internal" : "external", note.Value, note.Key, faceObject.Edits[note.Key]), faceObject.Label); + } + } + } + + /// + /// One SAM material for all SAM-written face and thickness objects of source material , + /// with the handles of the objects merged into it, or a null material when fewer than two usable objects exist or + /// they conflict (each is then imported on its own). + /// + /// Matching is by the explicit SAM.MaterialGuid only, never by name. An object whose face metadata cannot be + /// trusted is not a member and never resolves to the merged material. The objects merge when their thermal + /// properties and authored face optics agree and, per face, every object that supplies it resolves each optic to + /// the same value (its edit, else the authored value). Layer thicknesses stay on the construction layers. The SAM + /// Guid is restored from the object that carries it. + /// + /// + private static (IMaterial Material, ISet Members) MergedOpaqueMaterial(Guid materialGuid, OpenStudioImportContext openStudioImportContext) + { + List faceObjects = new List(); + foreach (global::OpenStudio.StandardOpaqueMaterial standardOpaqueMaterial in openStudioImportContext.Source.getStandardOpaqueMaterials()) + { + if (TryGetSourceMaterialGuid(standardOpaqueMaterial, out Guid guid) && guid == materialGuid) + { + FaceObject faceObject = ReadFaceObject(standardOpaqueMaterial, openStudioImportContext, OpenStudioImportContext.OpenStudioObjectLabel(standardOpaqueMaterial), false); + if (faceObject != null) + { + faceObjects.Add(faceObject); + } + } + } + + if (faceObjects.Count < 2) + { + return (null, null); + } + + faceObjects = faceObjects.OrderBy(x => x.Name, StringComparer.Ordinal).ToList(); + FaceObject first = faceObjects[0]; + string conflict = null; + if (faceObjects.Any(x => !Same(x.Material.thermalConductivity(), first.Material.thermalConductivity()) || !Same(x.Material.density(), first.Material.density()) || !Same(x.Material.specificHeat(), first.Material.specificHeat()))) + { + conflict = "their thermal properties differ"; + } + else if (faceObjects.Any(x => x.Signature != first.Signature)) + { + conflict = "their authored face optics differ"; + } + + Dictionary edits = new Dictionary(); + foreach (OpaqueMaterialParameter opaqueMaterialParameter in stampedOptics) + { + if (conflict != null) + { + break; + } + + // Unedited objects resolve every face to the authored values, which agree (Signature); only edits can differ. + if (faceObjects.All(x => x.Edits.Count == 0)) + { + break; + } + + bool internalParameter = opaqueMaterialParameter.ToString().StartsWith("Internal", StringComparison.Ordinal); + List onFace = faceObjects.Where(x => x.Carries(opaqueMaterialParameter)).ToList(); + List values = onFace.Select(x => x.Edits.TryGetValue(opaqueMaterialParameter, out double edit) ? edit : x.Authored.TryGetValue(opaqueMaterialParameter, out double authored) ? authored : (double?)null).ToList(); + if (values.Any(x => x.HasValue != values[0].HasValue || (x.HasValue && !Same(x.Value, values[0].Value)))) + { + conflict = opaqueMaterialParameter + " differs between the " + (internalParameter ? "internal" : "external") + "-face objects"; + } + else if (onFace.Any(x => x.Edits.ContainsKey(opaqueMaterialParameter))) + { + edits[opaqueMaterialParameter] = values[0].Value; + } + } + + if (conflict != null) + { + openStudioImportContext.AddDiagnostic(Core.OpenStudio.OpenStudioImportDiagnosticCodes.IdentityCollision, Core.OpenStudio.OpenStudioDiagnosticSeverity.Warning, string.Format("The face and thickness objects of source material {0} ({1}) are not merged: {2}; each is imported as its own material", materialGuid, string.Join(", ", faceObjects.Select(x => x.Name)), conflict), first.Label); + return (null, null); + } + + // The identity carrier, else an external-face object, else the first by name; ties by thickness then name. + FaceObject primary = faceObjects.OrderByDescending(x => x.CarriesIdentity).ThenBy(x => x.Internal).ThenBy(x => x.Material.thickness()).ThenBy(x => x.Name, StringComparer.Ordinal).First(); + OpaqueMaterial result = new OpaqueMaterial(openStudioImportContext.ResolveGuid(primary.Material), primary.Name, primary.Name, string.Empty, primary.Material.thermalConductivity(), primary.Material.density(), primary.Material.specificHeat()); + result.SetValue(Core.MaterialParameter.DefaultThickness, primary.Material.thickness()); + foreach (KeyValuePair keyValuePair in first.Authored) + { + result.SetValue(keyValuePair.Key, keyValuePair.Value); + } + + ApplyEdits(result, faceObjects, edits, openStudioImportContext); + openStudioImportContext.RegisterCreated(); + return (result, new HashSet(faceObjects.Select(x => Handle(x.Material)), StringComparer.Ordinal)); + } + + private static bool Same(double a, double b) + { + return Math.Abs(a - b) <= 1e-9 * Math.Max(1.0, Math.Max(Math.Abs(a), Math.Abs(b))); + } + /// /// MasslessOpaqueMaterial → SAM OpaqueMaterial. SAM has no massless material, so the /// layer is reconstructed at a nominal thickness with conductivity = thickness / R: the diff --git a/SAM_OpenStudio/SAM.Analytical.OpenStudio/Convert/ToSAM/Panel.cs b/SAM_OpenStudio/SAM.Analytical.OpenStudio/Convert/ToSAM/Panel.cs index 3bf8fb2..5319605 100644 --- a/SAM_OpenStudio/SAM.Analytical.OpenStudio/Convert/ToSAM/Panel.cs +++ b/SAM_OpenStudio/SAM.Analytical.OpenStudio/Convert/ToSAM/Panel.cs @@ -171,8 +171,9 @@ private static Construction ResolveConstruction(global::OpenStudio.Surface surfa } } + // A construction shared with subsurfaces or shading surfaces has its innermost-first surface version here. Construction result; - if (openStudioImportContext.ConstructionMap.TryGetValue(constructionName, out result)) + if (openStudioImportContext.SurfaceConstructionMap.TryGetValue(constructionName, out result) || openStudioImportContext.ConstructionMap.TryGetValue(constructionName, out result)) { return result; } diff --git a/SAM_OpenStudio/SAM.Core.OpenStudio/Query/GetDiagnosticDetail.cs b/SAM_OpenStudio/SAM.Core.OpenStudio/Query/GetDiagnosticDetail.cs index 69b4936..13b7615 100644 --- a/SAM_OpenStudio/SAM.Core.OpenStudio/Query/GetDiagnosticDetail.cs +++ b/SAM_OpenStudio/SAM.Core.OpenStudio/Query/GetDiagnosticDetail.cs @@ -34,7 +34,7 @@ private static readonly (string Code, string MessagePrefix, DiagnosticDetail Det /// /// /// Summary: run and workflow outcomes and basis (RUN-001, SET-001, weather and design-day source and site - /// overrides RUN-002), fallbacks and approximations (CON-001 simple-glazing fallback, SCH-001 leap-year profile, import + /// overrides RUN-002), fallbacks and approximations (CON-001 simple-glazing fallback, SCH-001 leap-year profile, IC-002 lighting split and default, MAT-004 inherited zone-face optics, import /// APX-001), data that is not converted (MAT-002, CON-002, IC-001, HVAC-001, import LOAD-001, /// WEA-001) and import translation / workflow notes. /// Standard: advisories with no effect on results (GEO-003 non-convex casting under PixelCounting, ADJ-001 @@ -61,6 +61,8 @@ public static DiagnosticDetail GetDiagnosticDetail(this OpenStudioDiagnostic ope case OpenStudioDiagnosticCodes.MaterialUnsupportedParameter: case OpenStudioDiagnosticCodes.ConstructionUnsupportedParameter: case OpenStudioDiagnosticCodes.InternalConditionUnsupportedParameter: + case OpenStudioDiagnosticCodes.InternalConditionAssumption: + case OpenStudioDiagnosticCodes.MaterialFaceAssumption: case OpenStudioDiagnosticCodes.HvacMissingSetpoints: case OpenStudioImportDiagnosticCodes.OsmVersionTranslationFailed: case OpenStudioImportDiagnosticCodes.OswEnergyPlusMeasureNotRepresentable: diff --git a/SAM_OpenStudio/SAM.Core.OpenStudio/Variables/OpenStudioDiagnosticCodes.cs b/SAM_OpenStudio/SAM.Core.OpenStudio/Variables/OpenStudioDiagnosticCodes.cs index 84cb861..0d74c1b 100644 --- a/SAM_OpenStudio/SAM.Core.OpenStudio/Variables/OpenStudioDiagnosticCodes.cs +++ b/SAM_OpenStudio/SAM.Core.OpenStudio/Variables/OpenStudioDiagnosticCodes.cs @@ -27,6 +27,12 @@ public static class OpenStudioDiagnosticCodes /// Unsupported material parameter (e.g. blind flag without slat geometry). public const string MaterialUnsupportedParameter = "SAM-OS-MAT-002"; + /// Opaque face optics a construction use cannot represent: a single-layer construction on an outdoor or interzone surface whose two faces need different optical values (EnergyPlus materials are single-sided). + public const string MaterialFaceOpticsUnrepresentable = "SAM-OS-MAT-003"; + + /// Declared opaque face assumption: an internal-face optical value SAM does not state (absent or NaN) on a zone face takes the external value; its unspecified provenance is kept. + public const string MaterialFaceAssumption = "SAM-OS-MAT-004"; + /// Missing construction layer. public const string ConstructionMissingLayer = "SAM-OS-CON-001"; @@ -39,6 +45,9 @@ public static class OpenStudioDiagnosticCodes /// Unsupported internal-condition parameter. public const string InternalConditionUnsupportedParameter = "SAM-OS-IC-001"; + /// Declared internal-condition conversion assumption or contract default applied (S07 §5.1 lighting split and its common default). + public const string InternalConditionAssumption = "SAM-OS-IC-002"; + /// Conditioned zone missing setpoints, or HVAC-dependent data (emitter characteristics, exhaust flows) deferred to the detailed-HVAC programme. public const string HvacMissingSetpoints = "SAM-OS-HVAC-001"; diff --git a/SAM_OpenStudio/SAM.Core.OpenStudio/Variables/OpenStudioIdentityKeys.cs b/SAM_OpenStudio/SAM.Core.OpenStudio/Variables/OpenStudioIdentityKeys.cs index c3116ef..c102748 100644 --- a/SAM_OpenStudio/SAM.Core.OpenStudio/Variables/OpenStudioIdentityKeys.cs +++ b/SAM_OpenStudio/SAM.Core.OpenStudio/Variables/OpenStudioIdentityKeys.cs @@ -29,5 +29,40 @@ public static class OpenStudioIdentityKeys /// Original, unsanitised SAM object name. public const string Name = "SAM.Name"; + + /// + /// On every opaque material written from a SAM opaque material: the source SAM material Guid, + /// Guid.ToString("D"). Unlike it is written on every face object of the + /// material, so it never claims the object's own identity. + /// + public const string MaterialGuid = "SAM.MaterialGuid"; + + /// + /// On every opaque material written from a SAM opaque material: the SAM face whose optical values + /// the object's single EnergyPlus absorptance set carries, or + /// . + /// + public const string MaterialFace = "SAM.MaterialFace"; + + /// value: the external-face values. + public const string MaterialFaceExternal = "External"; + + /// value: the internal-face values. + public const string MaterialFaceInternal = "Internal"; + + /// + /// Prefix of the authored SAM opaque optical values carried on every face object of a material + /// (for example SAM.Optic.InternalEmissivity), invariant round-trip text. A value SAM does + /// not state is not written. + /// + public const string OpticPrefix = "SAM.Optic."; + + /// + /// Prefix of the absorptances the writer actually put on an opaque face object (SAM.Written.ThermalAbsorptance, + /// .SolarAbsorptance, .VisibleAbsorptance), invariant round-trip text, including an inherited value + /// or an OpenStudio default. An import compares them with the object's current values, so an unchanged default is + /// told apart from a later edit. + /// + public const string WrittenPrefix = "SAM.Written."; } } diff --git a/SAM_OpenStudio/SAM.Core.OpenStudio/Variables/OpenStudioImportDiagnosticCodes.cs b/SAM_OpenStudio/SAM.Core.OpenStudio/Variables/OpenStudioImportDiagnosticCodes.cs index 885ec04..e994a5c 100644 --- a/SAM_OpenStudio/SAM.Core.OpenStudio/Variables/OpenStudioImportDiagnosticCodes.cs +++ b/SAM_OpenStudio/SAM.Core.OpenStudio/Variables/OpenStudioImportDiagnosticCodes.cs @@ -91,6 +91,13 @@ public static class OpenStudioImportDiagnosticCodes /// Unsupported construction kind. public const string ConstructionUnsupported = "SAM-OSI-CON-001"; + /// + /// Error: an imported opaque surface construction cannot reproduce the native layer order or the absorptances of a + /// face EnergyPlus uses (an edited or mixed model whose orientation or face roles cannot be established); the import + /// is unsuccessful rather than silently changing those faces. + /// + public const string ConstructionFacesUnresolved = "SAM-OSI-CON-002"; + /// Unsupported schedule kind, or a schedule that could not be expanded to hourly values. public const string ScheduleUnsupported = "SAM-OSI-SCH-001"; diff --git a/benchmark/SAM.Analytical.OpenStudio.InputReadBack.Cli/Export.cs b/benchmark/SAM.Analytical.OpenStudio.InputReadBack.Cli/Export.cs new file mode 100644 index 0000000..748d989 --- /dev/null +++ b/benchmark/SAM.Analytical.OpenStudio.InputReadBack.Cli/Export.cs @@ -0,0 +1,120 @@ +// SPDX-License-Identifier: LGPL-3.0-or-later +// Copyright (c) 2020–2026 Michal Dengusiak & Jakub Ziolkowski and contributors + +using SAM.Analytical.OpenStudio.InputReadBack; +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; + +namespace SAM.Analytical.OpenStudio.InputReadBack.Cli +{ + /// + /// The export step (writer side). It converts the frozen SAM model with the production writer and the explicit EPW, + /// saves the OSM without running the CLI, reloads the saved OSM and translates it to IDF with the OpenStudio SDK's + /// ForwardTranslator (the step the CLI performs before EnergyPlus). Nothing is simulated. It records hashes and + /// diagnostics; it never reads values back. + /// + internal static class Export + { + public const string ModelFile = "frozen-model.json"; + public const string EpwFile = "weather.epw"; + public const string OsmFile = "model.osm"; + public const string IdfFile = "in.idf"; + public const string ManifestFile = "export.json"; + + public static int Run(string modelPath, string epwPath, string outputDirectory, string label) + { + if (!File.Exists(modelPath) || !File.Exists(epwPath)) + { + throw new FileNotFoundException("The frozen model and the EPW must exist", File.Exists(modelPath) ? epwPath : modelPath); + } + + if (Directory.Exists(outputDirectory) && Directory.EnumerateFileSystemEntries(outputDirectory).Any()) + { + throw new IOException("The export directory must be new or empty: " + outputDirectory); + } + + Directory.CreateDirectory(outputDirectory); + + // The run's inputs are byte copies of the frozen inputs, so the compare step can prove what was converted. + string modelCopy = Path.Combine(outputDirectory, ModelFile); + string epwCopy = Path.Combine(outputDirectory, EpwFile); + File.Copy(modelPath, modelCopy); + File.Copy(epwPath, epwCopy); + + ExportManifest manifest = new ExportManifest + { + Label = label, + ModelSha256 = Hashing.Sha256(modelCopy), + EpwSha256 = Hashing.Sha256(epwCopy), + SourceModelPath = Path.GetFullPath(modelPath), + SourceEpwPath = Path.GetFullPath(epwPath), + ProcessId = Environment.ProcessId, + ProcessStartedUtc = ProcessIdentity.CurrentStartedUtc(), + StartedUtc = DateTime.UtcNow, + OpenStudioSdkVersion = global::OpenStudio.OpenStudioUtilitiesCore.openStudioLongVersion(), + WriterAssembly = typeof(Convert).Assembly.Location, + WriterAssemblySha256 = Hashing.Sha256(typeof(Convert).Assembly.Location) + }; + + AnalyticalModel analyticalModel = Core.Convert.ToSAM(modelCopy)?.FirstOrDefault(); + if (analyticalModel == null) + { + throw new InvalidDataException("The frozen model could not be read: " + modelCopy); + } + + string conversionDirectory = Path.Combine(outputDirectory, "conversion"); + Core.OpenStudio.OpenStudioRunOptions runOptions = new Core.OpenStudio.OpenStudioRunOptions { UseUniqueRunDirectory = false }; + using (OpenStudioConversionResult result = analyticalModel.ToOpenStudio(epwCopy, conversionDirectory, null, runOptions, run: false)) + { + if (result?.OsmPath == null || !File.Exists(result.OsmPath)) + { + throw new InvalidOperationException("The writer saved no OSM"); + } + + manifest.ConversionValid = result.IsValid; + foreach (Core.OpenStudio.OpenStudioDiagnostic diagnostic in result.Diagnostics) + { + manifest.Diagnostics.Add(string.Format("{0} {1} {2}", diagnostic.Severity, diagnostic.Code, diagnostic.Message)); + } + + File.Copy(result.OsmPath, Path.Combine(outputDirectory, OsmFile)); + } + + // The CLI route: load the saved OSM (not the in-memory model) and forward-translate it. + string osmPath = Path.Combine(outputDirectory, OsmFile); + global::OpenStudio.OptionalModel loaded = global::OpenStudio.Model.load(global::OpenStudio.OpenStudioUtilitiesCore.toPath(osmPath)); + if (loaded == null || loaded.isNull()) + { + throw new InvalidDataException("The saved OSM could not be loaded by the SDK"); + } + + global::OpenStudio.EnergyPlusForwardTranslator forwardTranslator = new global::OpenStudio.EnergyPlusForwardTranslator(); + global::OpenStudio.Workspace workspace = forwardTranslator.translateModel(loaded.get()); + foreach (global::OpenStudio.LogMessage message in forwardTranslator.errors()) + { + manifest.TranslatorMessages.Add("Error " + message.logMessage()); + } + + foreach (global::OpenStudio.LogMessage message in forwardTranslator.warnings()) + { + manifest.TranslatorMessages.Add("Warning " + message.logMessage()); + } + + string idfPath = Path.Combine(outputDirectory, IdfFile); + if (!workspace.toIdfFile().save(global::OpenStudio.OpenStudioUtilitiesCore.toPath(idfPath), true)) + { + throw new IOException("The IDF could not be saved"); + } + + manifest.OsmSha256 = Hashing.Sha256(osmPath); + manifest.IdfSha256 = Hashing.Sha256(idfPath); + manifest.FinishedUtc = DateTime.UtcNow; + manifest.Save(Path.Combine(outputDirectory, ManifestFile)); + + Console.WriteLine("export: {0} (valid {1}, {2} diagnostics, {3} translator messages)", outputDirectory, manifest.ConversionValid, manifest.Diagnostics.Count, manifest.TranslatorMessages.Count); + return 0; + } + } +} diff --git a/benchmark/SAM.Analytical.OpenStudio.InputReadBack.Cli/Negative.cs b/benchmark/SAM.Analytical.OpenStudio.InputReadBack.Cli/Negative.cs new file mode 100644 index 0000000..f9e938b --- /dev/null +++ b/benchmark/SAM.Analytical.OpenStudio.InputReadBack.Cli/Negative.cs @@ -0,0 +1,429 @@ +// SPDX-License-Identifier: LGPL-3.0-or-later +// Copyright (c) 2020–2026 Michal Dengusiak & Jakub Ziolkowski and contributors + +using System; +using System.Collections.Generic; +using System.Globalization; +using System.IO; +using System.Linq; +using System.Text.RegularExpressions; + +namespace SAM.Analytical.OpenStudio.InputReadBack.Cli +{ + /// + /// Disposable negative checks: a copy of an export with one targeted mutation of the native files, so the read and + /// compare steps can be shown to refuse it. The original run is never touched. The copy's export.json records the + /// mutation and the mutated hashes (the comparison judges the mutated files, not a hash mismatch). + /// + internal static class Negative + { + public static readonly string[] Cases = + { + "neg-identity-swap-names", + "neg-schedule-swap", + "neg-v1-unscheduled", + "neg-missing-dsoa-link", + "neg-missing-schedule-object", + "neg-people-density", + "neg-layer-conductivity", + "neg-osm-dsoa-schedule", + "neg-zone-multiplier", + "neg-window-multiplier", + "neg-north-axis", + "neg-zone-multiplier-both", + "neg-window-multiplier-both", + "neg-north-axis-both", + "neg-osm-missing-thermal-zone", + "neg-osm-missing-subsurfaces", + "neg-lighting-previous-mapping", + "neg-lighting-visible-zero", + "neg-lighting-radiant-is-p", + "neg-lighting-return-air", + "neg-lighting-swapped", + "neg-lighting-sum-above-one", + "neg-lighting-radiant-to-visible", + "neg-lighting-plenum-yes", + "neg-lighting-plenum-unknown", + "neg-lighting-plenum-relabelled", + "ctl-lighting-plenum-no" + }; + + public static int Run(string runDirectory, string caseId, string outputDirectory) + { + if (!Cases.Contains(caseId)) + { + throw new ArgumentException("unknown case '" + caseId + "'; cases: " + string.Join(", ", Cases)); + } + + if (Directory.Exists(outputDirectory) && Directory.EnumerateFileSystemEntries(outputDirectory).Any()) + { + throw new IOException("The negative directory must be new or empty: " + outputDirectory); + } + + Directory.CreateDirectory(outputDirectory); + foreach (string file in new[] { Export.ModelFile, Export.EpwFile, Export.OsmFile, Export.IdfFile, Export.ManifestFile }) + { + File.Copy(Path.Combine(runDirectory, file), Path.Combine(outputDirectory, file)); + } + + string idfPath = Path.Combine(outputDirectory, Export.IdfFile); + string osmPath = Path.Combine(outputDirectory, Export.OsmFile); + string idf = File.ReadAllText(idfPath); + string osm = File.ReadAllText(osmPath); + string description = Apply(caseId, ref idf, ref osm); + File.WriteAllText(idfPath, idf); + File.WriteAllText(osmPath, osm); + + ExportManifest manifest = ExportManifest.Load(Path.Combine(outputDirectory, Export.ManifestFile)); + manifest.Label = (manifest.Label ?? string.Empty) + " / " + caseId; + manifest.Mutation = caseId + ": " + description; + manifest.OsmSha256 = Hashing.Sha256(osmPath); + manifest.IdfSha256 = Hashing.Sha256(idfPath); + manifest.Save(Path.Combine(outputDirectory, Export.ManifestFile)); + Console.WriteLine("negative {0}: {1}", caseId, description); + return 0; + } + + internal static string Apply(string caseId, ref string idf, ref string osm) + { + List idfObjects = IdfText.Parse(idf); + switch (caseId) + { + case "neg-identity-swap-names": + { + // Two plain external walls of one space trade names (every reference follows): the geometry stays, the + // writer's GUID carrier now contradicts it. + HashSet hosts = new HashSet(idfObjects.Where(x => x.Type == "FenestrationSurface:Detailed").Select(x => x.Value(3)), StringComparer.OrdinalIgnoreCase); + IGrouping space = idfObjects.Where(x => x.Type == "BuildingSurface:Detailed" && x.Value(1) == "Wall" && x.Value(5) == "Outdoors" && !hosts.Contains(x.Name)).GroupBy(x => x.Value(4)).First(x => x.Count() >= 2); + string a = space.ElementAt(0).Name, b = space.ElementAt(1).Name; + idf = Regex.Replace(idf, Regex.Escape(a) + "|" + Regex.Escape(b), m => m.Value == a ? b : a); + return "IDF surfaces '" + a + "' and '" + b + "' trade names"; + } + + case "neg-schedule-swap": + { + IdfObject dsoa = idfObjects.First(x => x.Type == "DesignSpecification:OutdoorAir"); + string occupancy = idfObjects.First(x => x.Type == "People").Value(2); + idf = SetField(idf, "DesignSpecification:OutdoorAir", dsoa.Name, "Outdoor Air Schedule Name", occupancy); + return "IDF DSOA '" + dsoa.Name + "' schedule -> the occupancy schedule '" + occupancy + "'"; + } + + case "neg-v1-unscheduled": + { + // The pre-S09 behaviour: the requirement delivered unscheduled (fraction 1), in both native views. + foreach (IdfObject dsoa in idfObjects.Where(x => x.Type == "DesignSpecification:OutdoorAir")) + { + idf = SetField(idf, "DesignSpecification:OutdoorAir", dsoa.Name, "Outdoor Air Schedule Name", string.Empty); + } + + foreach (IdfObject dsoa in IdfText.Parse(osm).Where(x => x.Type == "OS:DesignSpecification:OutdoorAir")) + { + osm = SetField(osm, "OS:DesignSpecification:OutdoorAir", dsoa.Value(1), "Outdoor Air Flow Rate Fraction Schedule Name", string.Empty, true); + } + + return "every DSOA fraction schedule removed in the IDF and the OSM (unscheduled delivery)"; + } + + case "neg-missing-dsoa-link": + { + IdfObject idealLoads = idfObjects.First(x => x.Type == "ZoneHVAC:IdealLoadsAirSystem"); + idf = SetField(idf, "ZoneHVAC:IdealLoadsAirSystem", idealLoads.Name, "Design Specification Outdoor Air Object Name", string.Empty); + return "IDF Ideal Loads '" + idealLoads.Name + "' names no DSOA"; + } + + case "neg-missing-schedule-object": + { + string schedule = idfObjects.First(x => x.Type == "DesignSpecification:OutdoorAir").Value(6); + idf = SetField(idf, "Schedule:Compact", schedule, "Name", schedule + "_MISSING"); + return "IDF schedule '" + schedule + "' renamed: the DSOA names an undefined schedule"; + } + + case "neg-people-density": + { + IdfObject people = idfObjects.First(x => x.Type == "People"); + double value = double.Parse(people.Value(5), CultureInfo.InvariantCulture) * 1.01; + idf = SetField(idf, "People", people.Name, "People per Floor Area", value.ToString("R", CultureInfo.InvariantCulture)); + return "IDF People '" + people.Name + "' density x 1.01"; + } + + case "neg-layer-conductivity": + { + IdfObject material = idfObjects.First(x => x.Type == "Material"); + double value = double.Parse(material.Value(3), CultureInfo.InvariantCulture) * 1.001; + idf = SetField(idf, "Material", material.Name, "Conductivity", value.ToString("R", CultureInfo.InvariantCulture)); + return "IDF Material '" + material.Name + "' conductivity x 1.001"; + } + + case "neg-osm-dsoa-schedule": + { + // OSM only: the SpaceType DSOA loses its schedule; the IDF is unchanged, so the two native views disagree. + IdfObject dsoa = IdfText.Parse(osm).First(x => x.Type == "OS:DesignSpecification:OutdoorAir"); + osm = SetField(osm, "OS:DesignSpecification:OutdoorAir", dsoa.Value(1), "Outdoor Air Flow Rate Fraction Schedule Name", string.Empty, true); + return "OSM DSOA '" + dsoa.Value(1) + "' fraction schedule removed (IDF unchanged)"; + } + + // Multiplicity and orientation (independent review of d6d1cc5b). The plain cases are the reviewer's IDF-only + // mutations; the "-both" cases make the OSM agree, so only the check against SAM intent can refuse them. + case "neg-zone-multiplier": + case "neg-zone-multiplier-both": + { + IdfObject zone = idfObjects.First(x => x.Type == "Zone"); + idf = SetField(idf, "Zone", zone.Name, "Multiplier", "2"); + if (caseId.EndsWith("-both", StringComparison.Ordinal)) + { + osm = SetField(osm, "OS:ThermalZone", zone.Name, "Multiplier", "2", true); + } + + return "IDF Zone '" + zone.Name + "' Multiplier 1 -> 2" + (caseId.EndsWith("-both", StringComparison.Ordinal) ? " and OSM OS:ThermalZone Multiplier blank -> 2" : " (OSM unchanged)"); + } + + case "neg-window-multiplier": + case "neg-window-multiplier-both": + { + List names = idfObjects.Where(x => x.Type == "FenestrationSurface:Detailed").Select(x => x.Name).ToList(); + foreach (string name in names) + { + idf = SetField(idf, "FenestrationSurface:Detailed", name, "Multiplier", "2"); + if (caseId.EndsWith("-both", StringComparison.Ordinal)) + { + osm = SetField(osm, "OS:SubSurface", name, "Multiplier", "2", true); + } + } + + return "IDF FenestrationSurface:Detailed Multiplier blank -> 2 on " + names.Count + " subsurface(s)" + (caseId.EndsWith("-both", StringComparison.Ordinal) ? " and OSM OS:SubSurface Multiplier blank -> 2" : " (OSM unchanged)"); + } + + case "neg-north-axis": + case "neg-north-axis-both": + { + IdfObject building = idfObjects.First(x => x.Type == "Building"); + idf = SetField(idf, "Building", building.Name, "North Axis", "90"); + if (caseId.EndsWith("-both", StringComparison.Ordinal)) + { + osm = SetField(osm, "OS:Building", IdfText.Parse(osm).First(x => x.Type == "OS:Building").Value(1), "North Axis", "90", true); + } + + return "IDF Building '" + building.Name + "' North Axis blank -> 90" + (caseId.EndsWith("-both", StringComparison.Ordinal) ? " and OSM OS:Building North Axis blank -> 90" : " (OSM unchanged)"); + } + + // Missing OSM counterparts (independent review of 6f7e6b7d): the IDF is unchanged, so the IDF object has no + // OSM object to be consistent with. The reviewed head skipped the check and kept its verdict. + case "neg-osm-missing-thermal-zone": + { + string zone = idfObjects.First(x => x.Type == "Zone").Name; + osm = RemoveObject(osm, "OS:ThermalZone", zone, true); + return "OSM OS:ThermalZone '" + zone + "' removed (IDF unchanged)"; + } + + case "neg-osm-missing-subsurfaces": + { + List names = idfObjects.Where(x => x.Type == "FenestrationSurface:Detailed").Select(x => x.Name).ToList(); + foreach (string name in names) + { + osm = RemoveObject(osm, "OS:SubSurface", name, true); + } + + return "OSM OS:SubSurface removed for " + names.Count + " subsurface(s) (IDF unchanged)"; + } + + // S07 §5.1 T-LIGHT-SPLIT (amendment L1): the first IDF Lights object, whose written p = Fraction Radiant + + // Fraction Visible is positive on both fixtures. The OSM is unchanged; the lighting rows must refuse it. + case "neg-lighting-previous-mapping": + case "neg-lighting-visible-zero": + case "neg-lighting-radiant-is-p": + case "neg-lighting-return-air": + case "neg-lighting-swapped": + { + IdfObject lights = idfObjects.First(x => x.Type == "Lights"); + string radiant = lights.Value(8), visible = lights.Value(9); + string p = (double.Parse(radiant, CultureInfo.InvariantCulture) + double.Parse(visible, CultureInfo.InvariantCulture)).ToString("R", CultureInfo.InvariantCulture); + switch (caseId) + { + case "neg-lighting-previous-mapping": + // The pre-L1 writer: Fraction Radiant = p and the view-coefficient default 0.25 as Fraction Visible. + idf = SetField(idf, "Lights", lights.Name, "Fraction Radiant", p); + idf = SetField(idf, "Lights", lights.Name, "Fraction Visible", "0.25"); + return "IDF Lights '" + lights.Name + "' Fraction Radiant -> p = " + p + ", Fraction Visible -> 0.25 (the previous mapping)"; + case "neg-lighting-visible-zero": + idf = SetField(idf, "Lights", lights.Name, "Fraction Visible", "0"); + return "IDF Lights '" + lights.Name + "' Fraction Visible " + visible + " -> 0 with a positive authored p"; + case "neg-lighting-radiant-is-p": + idf = SetField(idf, "Lights", lights.Name, "Fraction Radiant", p); + return "IDF Lights '" + lights.Name + "' Fraction Radiant -> p = " + p + " with Fraction Visible " + visible + " kept"; + case "neg-lighting-return-air": + idf = SetField(idf, "Lights", lights.Name, "Return Air Fraction", "0.1"); + return "IDF Lights '" + lights.Name + "' Return Air Fraction blank -> 0.1"; + default: + idf = SetField(idf, "Lights", lights.Name, "Fraction Radiant", visible); + idf = SetField(idf, "Lights", lights.Name, "Fraction Visible", radiant); + return "IDF Lights '" + lights.Name + "' Fraction Radiant " + radiant + " and Fraction Visible " + visible + " swapped"; + } + } + + // Native-domain guards of T-LIGHT-SPLIT (independent review of 31af6022). Each shift is within the 0.001 + // tolerance of every row, so only the domain guard can refuse it. They are invalid on the export they are + // meant for: sum-above-one on an authored p = 1 (sum 1.0008), radiant-to-visible on an authored p = 0 + // (Fraction Radiant -0.0004). On the fixtures (p 0.34-0.41) both stay valid and are not refused. + case "neg-lighting-sum-above-one": + case "neg-lighting-radiant-to-visible": + { + IdfObject lights = idfObjects.First(x => x.Type == "Lights"); + double radiant = double.Parse(lights.Value(8), CultureInfo.InvariantCulture), visible = double.Parse(lights.Value(9), CultureInfo.InvariantCulture); + double newRadiant = caseId == "neg-lighting-sum-above-one" ? radiant + 0.0004 : radiant - 0.0004; + double newVisible = visible + 0.0004; + idf = SetField(idf, "Lights", lights.Name, "Fraction Radiant", newRadiant.ToString("R", CultureInfo.InvariantCulture)); + idf = SetField(idf, "Lights", lights.Name, "Fraction Visible", newVisible.ToString("R", CultureInfo.InvariantCulture)); + return "IDF Lights '" + lights.Name + "' Fraction Radiant " + lights.Value(8) + " -> " + newRadiant.ToString("R", CultureInfo.InvariantCulture) + ", Fraction Visible " + lights.Value(9) + " -> " + newVisible.ToString("R", CultureInfo.InvariantCulture); + } + + // The plenum-calculated return-air setting (index 12, after End-Use Subcategory), which the writer leaves blank (No). Yes, an unknown value + // and a relabelled field must block; an explicit No with coefficients is the valid control. + case "neg-lighting-plenum-yes": + case "neg-lighting-plenum-unknown": + case "neg-lighting-plenum-relabelled": + case "ctl-lighting-plenum-no": + { + IdfObject lights = idfObjects.First(x => x.Type == "Lights"); + string setting = caseId == "neg-lighting-plenum-yes" ? "Yes" : caseId == "neg-lighting-plenum-unknown" ? "Maybe" : "No"; + string label = caseId == "neg-lighting-plenum-relabelled" ? "Return Air Plenum Mode" : "Return Air Fraction Calculated from Plenum Temperature"; + idf = AppendFields(idf, "Lights", lights.Name, (setting, label), ("0.2", "Return Air Fraction Function of Plenum Temperature Coefficient 1"), ("0", "Return Air Fraction Function of Plenum Temperature Coefficient 2")); + return "IDF Lights '" + lights.Name + "' gains '" + label + "' = " + setting + " with coefficients 0.2, 0"; + } + } + + throw new ArgumentException(caseId); + } + + /// + /// Removes the object of named (located as in ), + /// from its class line through the line that ends it, with the blank line after it. Line-based: the rest of the + /// file is kept byte for byte. + /// + internal static string RemoveObject(string text, string type, string name, bool osm = false) + { + string newline = text.Contains("\r\n") ? "\r\n" : "\n"; + List lines = text.Split(new[] { newline }, StringSplitOptions.None).ToList(); + for (int i = 0; i < lines.Count; i++) + { + int nameLine = i + (osm ? 2 : 1); + if (!string.Equals(lines[i].Trim(), type + ",", StringComparison.OrdinalIgnoreCase) || nameLine >= lines.Count || !string.Equals(Data(lines[nameLine]), name, StringComparison.OrdinalIgnoreCase)) + { + continue; + } + + int end = i + 1; + while (end < lines.Count && !Code(lines[end]).TrimEnd().EndsWith(";", StringComparison.Ordinal)) + { + end++; + } + + if (end >= lines.Count) + { + break; + } + + if (end + 1 < lines.Count && lines[end + 1].Trim().Length == 0) + { + end++; + } + + lines.RemoveRange(i, end - i + 1); + return string.Join(newline, lines); + } + + throw new InvalidOperationException(type + " '" + name + "' not found"); + } + + /// + /// Appends labelled fields after the last field of the object of named + /// (located as in ): its terminator becomes a comma and the new last + /// field ends the object. Line-based: the rest of the file is kept byte for byte. + /// + internal static string AppendFields(string text, string type, string name, params (string Value, string Label)[] fields) + { + string newline = text.Contains("\r\n") ? "\r\n" : "\n"; + List lines = text.Split(new[] { newline }, StringSplitOptions.None).ToList(); + for (int i = 0; i < lines.Count; i++) + { + if (!string.Equals(lines[i].Trim(), type + ",", StringComparison.OrdinalIgnoreCase) || i + 1 >= lines.Count || !string.Equals(Data(lines[i + 1]), name, StringComparison.OrdinalIgnoreCase)) + { + continue; + } + + int end = i + 1; + while (end < lines.Count && !Code(lines[end]).TrimEnd().EndsWith(";", StringComparison.Ordinal)) + { + end++; + } + + if (end >= lines.Count) + { + break; + } + + int semicolon = Code(lines[end]).LastIndexOf(';'); + lines[end] = lines[end].Substring(0, semicolon) + "," + lines[end].Substring(semicolon + 1); + lines.InsertRange(end + 1, fields.Select((x, k) => " " + x.Value + (k == fields.Length - 1 ? ";" : ",") + " !- " + x.Label)); + return string.Join(newline, lines); + } + + throw new InvalidOperationException(type + " '" + name + "' not found"); + } + + private static string Code(string line) + { + int bang = line.IndexOf('!'); + return bang >= 0 ? line.Substring(0, bang) : line; + } + + /// + /// Replaces the value of the field labelled in the object of named + /// (the first field, or the second in an OSM where the handle comes first). Line-based: + /// the file's formatting is kept. + /// + internal static string SetField(string text, string type, string name, string label, string value, bool osm = false) + { + string newline = text.Contains("\r\n") ? "\r\n" : "\n"; + List lines = text.Split(new[] { newline }, StringSplitOptions.None).ToList(); + for (int i = 0; i < lines.Count; i++) + { + if (!string.Equals(lines[i].Trim(), type + ",", StringComparison.OrdinalIgnoreCase)) + { + continue; + } + + int nameLine = i + (osm ? 2 : 1); + if (nameLine >= lines.Count || !string.Equals(Data(lines[nameLine]), name, StringComparison.OrdinalIgnoreCase)) + { + continue; + } + + for (int j = i + 1; j < lines.Count; j++) + { + int bang = lines[j].IndexOf("!-", StringComparison.Ordinal); + if (bang >= 0 && lines[j].Substring(bang + 2).Trim().StartsWith(label, StringComparison.OrdinalIgnoreCase)) + { + string data = lines[j].Substring(0, bang).TrimEnd(); + char terminator = data[data.Length - 1]; + string indent = lines[j].Substring(0, lines[j].Length - lines[j].TrimStart().Length); + lines[j] = (indent + value + terminator).PadRight(bang) + lines[j].Substring(bang); + return string.Join(newline, lines); + } + + if (lines[j].Contains(";")) + { + break; + } + } + } + + throw new InvalidOperationException("field '" + label + "' of " + type + " '" + name + "' not found"); + } + + private static string Data(string line) + { + int bang = line.IndexOf('!'); + return (bang >= 0 ? line.Substring(0, bang) : line).Trim().TrimEnd(',', ';').Trim(); + } + } +} diff --git a/benchmark/SAM.Analytical.OpenStudio.InputReadBack.Cli/Program.cs b/benchmark/SAM.Analytical.OpenStudio.InputReadBack.Cli/Program.cs new file mode 100644 index 0000000..c30b636 --- /dev/null +++ b/benchmark/SAM.Analytical.OpenStudio.InputReadBack.Cli/Program.cs @@ -0,0 +1,98 @@ +// SPDX-License-Identifier: LGPL-3.0-or-later +// Copyright (c) 2020–2026 Michal Dengusiak & Jakub Ziolkowski and contributors + +using System; +using System.Collections.Generic; + +namespace SAM.Analytical.OpenStudio.InputReadBack.Cli +{ + /// + /// os-input-readback: the S09 OpenStudio native-input read-back harness. + /// + /// export --model <frozen.json> --epw <file.epw> --out <new dir> [--label x] + /// read --run <export dir> (a separate process: reads model.osm and in.idf as text into native.json) + /// compare --run <export dir> --fixture-id <id> [--rule-set interim|provisional|approved] [--out dir] + /// + /// Exit codes follow S08: 0 PASS, 10 FAIL, 11 BLOCKED technical, 12 BLOCKED owner, 13 NOT RUN, 14 accepted + /// limitation, 64 usage, 70 infrastructure. + /// + public static class Program + { + public static int Main(string[] args) + { + if (args == null || args.Length == 0) + { + return Usage(); + } + + Dictionary options = new Dictionary(StringComparer.OrdinalIgnoreCase); + for (int i = 1; i + 1 < args.Length; i += 2) + { + if (!args[i].StartsWith("--", StringComparison.Ordinal)) + { + return Usage(); + } + + options[args[i].Substring(2)] = args[i + 1]; + } + + try + { + switch (args[0].ToLowerInvariant()) + { + case "export": + return Export.Run(Required(options, "model"), Required(options, "epw"), Required(options, "out"), Optional(options, "label")); + case "read": + return ReadBackRead.Run(Required(options, "run")); + case "negative": + return Negative.Run(Required(options, "run"), Required(options, "case"), Required(options, "out")); + case "compare": + return ReadBackCompare.Run(Required(options, "run"), Required(options, "fixture-id"), Optional(options, "rule-set") ?? "approved", Optional(options, "out")); + default: + return Usage(); + } + } + catch (UsageException exception) + { + Console.Error.WriteLine(exception.Message); + return Usage(); + } + catch (Exception exception) + { + Console.Error.WriteLine("infrastructure: " + exception); + return ReadBackExit.Infrastructure; + } + } + + private static string Required(Dictionary options, string name) + { + if (!options.TryGetValue(name, out string value) || string.IsNullOrWhiteSpace(value)) + { + throw new UsageException("missing --" + name); + } + + return value; + } + + private static string Optional(Dictionary options, string name) + { + return options.TryGetValue(name, out string value) ? value : null; + } + + private static int Usage() + { + Console.Error.WriteLine("usage: os-input-readback export --model --epw --out [--label x]"); + Console.Error.WriteLine(" os-input-readback read --run "); + Console.Error.WriteLine(" os-input-readback compare --run --fixture-id [--rule-set interim|provisional|approved] [--out dir]"); + Console.Error.WriteLine(" os-input-readback negative --run --case <" + string.Join("|", Negative.Cases) + "> --out "); + return ReadBackExit.Usage; + } + + private sealed class UsageException : Exception + { + public UsageException(string message) : base(message) + { + } + } + } +} diff --git a/benchmark/SAM.Analytical.OpenStudio.InputReadBack.Cli/ReadBackRead.cs b/benchmark/SAM.Analytical.OpenStudio.InputReadBack.Cli/ReadBackRead.cs new file mode 100644 index 0000000..76bbb16 --- /dev/null +++ b/benchmark/SAM.Analytical.OpenStudio.InputReadBack.Cli/ReadBackRead.cs @@ -0,0 +1,142 @@ +// SPDX-License-Identifier: LGPL-3.0-or-later +// Copyright (c) 2020–2026 Michal Dengusiak & Jakub Ziolkowski and contributors + +using SAM.Analytical.InputEquivalence; +using System; +using System.Collections.Generic; +using System.Globalization; +using System.IO; +using System.Linq; + +namespace SAM.Analytical.OpenStudio.InputReadBack.Cli +{ + /// The read step: a separate process that reads model.osm and in.idf as text into native.json. + internal static class ReadBackRead + { + public const string SnapshotFile = "native.json"; + + public static int Run(string runDirectory) + { + string osm = Path.Combine(runDirectory, Export.OsmFile); + string idf = Path.Combine(runDirectory, Export.IdfFile); + NativeSnapshot snapshot = NativeReader.Read(osm, idf); + snapshot.Save(Path.Combine(runDirectory, SnapshotFile)); + Console.WriteLine("read: {0} IDF objects, {1} OSM objects, {2} IDF schedules ({3} unreadable), {4} OSM schedules; pid {5}", snapshot.Idf.Count, snapshot.Osm.Count, snapshot.IdfSchedules.Count, snapshot.IdfSchedules.Count(x => x.Values == null), snapshot.OsmSchedules.Count, snapshot.ProcessId); + return 0; + } + } + + /// The compare step: SAM intent from the frozen model against native.json, gated by the S08 core. + internal static class ReadBackCompare + { + public static int Run(string runDirectory, string fixtureId, string ruleSetName, string outputDirectory) + { + GateRuleSet ruleSet; + switch ((ruleSetName ?? "approved").ToLowerInvariant()) + { + case "approved": + ruleSet = GateRuleSet.Approved; + break; + case "provisional": + ruleSet = GateRuleSet.ProvisionalProposed; + break; + case "interim": + ruleSet = GateRuleSet.Interim; + break; + default: + Console.Error.WriteLine("unknown rule set: " + ruleSetName); + return ReadBackExit.Usage; + } + + ExportManifest manifest = ExportManifest.Load(Path.Combine(runDirectory, Export.ManifestFile)); + NativeSnapshot snapshot = NativeSnapshot.Load(Path.Combine(runDirectory, ReadBackRead.SnapshotFile)); + string modelPath = Path.Combine(runDirectory, Export.ModelFile); + string epwPath = Path.Combine(runDirectory, Export.EpwFile); + + List problems = Infrastructure(manifest, snapshot, runDirectory, modelPath, epwPath); + if (problems.Count > 0) + { + foreach (string problem in problems) + { + Console.Error.WriteLine("infrastructure: " + problem); + } + + return ReadBackExit.Infrastructure; + } + + AnalyticalModel model = Core.Convert.ToSAM(modelPath)?.FirstOrDefault(); + OsComparison comparison = OsComparison.Run(model, snapshot, epwPath, fixtureId, ruleSet); + Dictionary inputs = new Dictionary + { + ["label"] = manifest.Label, + ["modelSha256"] = manifest.ModelSha256, + ["epwSha256"] = manifest.EpwSha256, + ["osmSha256"] = manifest.OsmSha256, + ["idfSha256"] = manifest.IdfSha256, + ["openStudioSdk"] = manifest.OpenStudioSdkVersion, + ["writerSha256"] = manifest.WriterAssemblySha256, + ["readerSha256"] = snapshot.ReaderAssemblySha256, + ["exportPid"] = manifest.ProcessId.ToString(), + ["readerPid"] = snapshot.ProcessId.ToString(), + ["comparePid"] = Environment.ProcessId.ToString(), + ["exportProcessStartedUtc"] = manifest.ProcessStartedUtc.ToString("O", CultureInfo.InvariantCulture), + ["readerProcessStartedUtc"] = snapshot.ProcessStartedUtc.ToString("O", CultureInfo.InvariantCulture), + ["compareProcessStartedUtc"] = ProcessIdentity.CurrentStartedUtc().ToString("O", CultureInfo.InvariantCulture), + ["mutation"] = manifest.Mutation, + ["writerDiagnostics"] = string.Join(" | ", manifest.Diagnostics.Where(x => !x.StartsWith("Information SAM-OS-MAT-002 Vapour", StringComparison.Ordinal))), + ["translatorMessages"] = manifest.TranslatorMessages.Count.ToString() + }; + + OsReport report = OsReport.From(comparison, inputs); + report.Save(outputDirectory ?? Path.Combine(runDirectory, "compare-" + ruleSetName)); + Console.Write(report.Text()); + return report.ExitCode; + } + + /// + /// The run is what it claims (as S08): the reader ran in its own process after the export finished; the OSM and IDF + /// it read are the exported ones and were not changed while it read; the frozen model and EPW are the exported bytes. + /// + private static List Infrastructure(ExportManifest manifest, NativeSnapshot snapshot, string runDirectory, string modelPath, string epwPath) + { + List result = new List(); + if (snapshot.Schema != "s09-native/2" || manifest.Schema != "s09-export/2") + { + result.Add("unknown export or snapshot schema"); + } + + // A process is its id and its creation time: Windows reuses the id of an exited process, so a fresh reader can + // carry the export's id, and a fresh comparison the reader's (ProcessIdentity). + if (!ProcessIdentity.IsRecorded(manifest.ProcessId, manifest.ProcessStartedUtc) || !ProcessIdentity.IsRecorded(snapshot.ProcessId, snapshot.ProcessStartedUtc)) + { + result.Add("the export or reader process identity is not recorded: a fresh read is not proven"); + } + else if (ProcessIdentity.Same(snapshot.ProcessId, snapshot.ProcessStartedUtc, manifest.ProcessId, manifest.ProcessStartedUtc) || snapshot.StartedUtc <= manifest.FinishedUtc) + { + result.Add("the reader did not run in a fresh process after the export"); + } + + if (ProcessIdentity.Same(snapshot.ProcessId, snapshot.ProcessStartedUtc, Environment.ProcessId, ProcessIdentity.CurrentStartedUtc())) + { + result.Add("the comparison runs in the reader's process"); + } + + if (snapshot.OsmSha256Before != manifest.OsmSha256 || snapshot.OsmSha256After != manifest.OsmSha256 || Hashing.Sha256(Path.Combine(runDirectory, Export.OsmFile)) != manifest.OsmSha256) + { + result.Add("the OSM read is not the exported OSM, or it changed"); + } + + if (snapshot.IdfSha256Before != manifest.IdfSha256 || snapshot.IdfSha256After != manifest.IdfSha256 || Hashing.Sha256(Path.Combine(runDirectory, Export.IdfFile)) != manifest.IdfSha256) + { + result.Add("the IDF read is not the exported IDF, or it changed"); + } + + if (Hashing.Sha256(modelPath) != manifest.ModelSha256 || Hashing.Sha256(epwPath) != manifest.EpwSha256) + { + result.Add("the frozen model or EPW is not the exported one"); + } + + return result; + } + } +} diff --git a/benchmark/SAM.Analytical.OpenStudio.InputReadBack.Cli/SAM.Analytical.OpenStudio.InputReadBack.Cli.csproj b/benchmark/SAM.Analytical.OpenStudio.InputReadBack.Cli/SAM.Analytical.OpenStudio.InputReadBack.Cli.csproj new file mode 100644 index 0000000..da95c77 --- /dev/null +++ b/benchmark/SAM.Analytical.OpenStudio.InputReadBack.Cli/SAM.Analytical.OpenStudio.InputReadBack.Cli.csproj @@ -0,0 +1,56 @@ + + + + Exe + net8.0 + SAM.Analytical.OpenStudio.InputReadBack.Cli + os-input-readback + false + x64 + x64 + x64 + latest + disable + disable + + + + + + + + + + + + + + + + + + + + + + ..\..\..\SAM\build\SAM.Core.dll + + + ..\..\..\SAM\build\SAM.Geometry.dll + + + ..\..\..\SAM\build\SAM.Analytical.dll + + + ..\..\..\SAM\build\SAM.Architectural.dll + + + ..\..\..\SAM\build\SAM.Weather.dll + + + + diff --git a/benchmark/SAM.Analytical.OpenStudio.InputReadBack.Tests/NativeReaderTests.cs b/benchmark/SAM.Analytical.OpenStudio.InputReadBack.Tests/NativeReaderTests.cs new file mode 100644 index 0000000..dfa290e --- /dev/null +++ b/benchmark/SAM.Analytical.OpenStudio.InputReadBack.Tests/NativeReaderTests.cs @@ -0,0 +1,70 @@ +// SPDX-License-Identifier: LGPL-3.0-or-later +// Copyright (c) 2020–2026 Michal Dengusiak & Jakub Ziolkowski and contributors + +using NUnit.Framework; +using System.Linq; + +namespace SAM.Analytical.OpenStudio.InputReadBack.Tests +{ + /// The text reader and the schedule expansion: unknown layouts and forms are unreadable, never guessed. + [TestFixture] + public class NativeReaderTests + { + private const string Idf = + "Zone,\n Z1, !- Name\n , !- Direction of Relative North {deg}\n 1, 2, 3; !- Z Origin {m}\n\n" + + "BuildingSurface:Detailed,\n S1, !- Name\n Wall, !- Surface Type\n 0, 0, 0, !- X,Y,Z Vertex 1 {m}\n 1, 0, 0; !- X,Y,Z Vertex 2 {m}\n"; + + [Test] + public void Parse_KeepsFieldsAndTheFileLabels() + { + IdfObject zone = IdfText.Parse(Idf).First(); + Assert.That(zone.Type, Is.EqualTo("Zone")); + Assert.That(zone.Name, Is.EqualTo("Z1")); + Assert.That(zone.Fields.Select(x => x.Value), Is.EqualTo(new[] { "Z1", string.Empty, "1", "2", "3" })); + Assert.That(zone.Fields[4].Label, Is.EqualTo("Z Origin {m}"), "a label describes the last field on its line"); + Assert.That(zone.Value(1, "Direction of Relative North", out string problem), Is.EqualTo(string.Empty)); + Assert.That(problem, Is.Null); + } + + [Test] + public void AFieldWhoseLabelDisagrees_IsUnreadable() + { + IdfObject zone = IdfText.Parse(Idf).First(); + Assert.That(zone.Value(1, "Multiplier", out string problem), Is.Null); + Assert.That(problem, Does.Contain("labelled 'Direction of Relative North")); + Assert.That(NativeModel.Number(zone, 1, "Multiplier").Kind, Is.EqualTo(SAM.Analytical.InputEquivalence.ReaderKind.Unreadable)); + Assert.That(NativeModel.Number(zone, 1, "Direction of Relative North").Kind, Is.EqualTo(SAM.Analytical.InputEquivalence.ReaderKind.Absent), "blank is absent (EnergyPlus default), not zero"); + } + + private static NativeSchedule Compact(string body) + { + return ScheduleReader.Read(IdfText.Parse("Schedule:Compact,\n S, !- Name\n F, !- Schedule Type Limits Name\n" + body).Single(), 365, "idf"); + } + + [Test] + public void Compact_UntilLabelsEndTheirHour_AndCoverTheYear() + { + NativeSchedule schedule = Compact(" Through: 06/30, For: AllDays, Until: 07:00, 0.1, Until: 24:00, 0.9,\n Through: 12/31, For: AllDays, Until: 24:00, 0.5;\n"); + Assert.That(schedule.Problem, Is.Null); + Assert.That(schedule.Values.Length, Is.EqualTo(8760)); + Assert.That(schedule.Values[6], Is.EqualTo(0.1), "hour index 6 = 06:00-07:00, ended by 'Until: 07:00'"); + Assert.That(schedule.Values[7], Is.EqualTo(0.9)); + Assert.That(schedule.Values[181 * 24], Is.EqualTo(0.5), "1 July (day index 181)"); + Assert.That(schedule.Values[181 * 24 - 1], Is.EqualTo(0.9), "30 June 23:00"); + Assert.That(schedule.AlignmentVerified, Is.True); + } + + [TestCase(" Through: 12/31, For: Weekdays, Until: 24:00, 1;\n", "For: AllDays")] + [TestCase(" Through: 12/31, For: AllDays, Until: 07:30, 1, Until: 24:00, 0;\n", "whole hour")] + [TestCase(" Through: 12/30, For: AllDays, Until: 24:00, 1;\n", "covers 364 of 365")] + [TestCase(" Through: 12/31, For: AllDays, Until: 12:00, 1;\n", "not 24:00")] + [TestCase(" Through: 12/31, For: AllDays, Until: 24:00, x;\n", "not a finite number")] + public void Compact_AnyOtherForm_IsUnreadable(string body, string reason) + { + NativeSchedule schedule = Compact(body); + Assert.That(schedule.Values, Is.Null); + Assert.That(schedule.AlignmentVerified, Is.False); + Assert.That(schedule.Problem, Does.Contain(reason)); + } + } +} diff --git a/benchmark/SAM.Analytical.OpenStudio.InputReadBack.Tests/OpaqueFaceScopeTests.cs b/benchmark/SAM.Analytical.OpenStudio.InputReadBack.Tests/OpaqueFaceScopeTests.cs new file mode 100644 index 0000000..d63c0cf --- /dev/null +++ b/benchmark/SAM.Analytical.OpenStudio.InputReadBack.Tests/OpaqueFaceScopeTests.cs @@ -0,0 +1,490 @@ +// SPDX-License-Identifier: LGPL-3.0-or-later +// Copyright (c) 2020–2026 Michal Dengusiak & Jakub Ziolkowski and contributors + +using NUnit.Framework; +using SAM.Analytical.InputEquivalence; +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using EQ = SAM.Analytical.InputEquivalence.Query; + +namespace SAM.Analytical.OpenStudio.InputReadBack.Tests +{ + /// + /// S07 §5.2 (amendment U1, SAM#218 b06dbe8c): row-3a opaque optics on faces EnergyPlus 25.1 does not use are + /// OUT-OF-ENGINE-SCOPE, informational and not gated, but only when the face's role is established independently and + /// both values are valid and comparable. Every used face, every thermal layer property and every invalid, unreadable + /// or undeterminable row stays gated, and an informational row never hides a defect elsewhere. Each case runs the CLI + /// (export, fresh-process read and compare) and checks its report and exit code. + /// + public partial class ReadBackTests + { + private static readonly string[] OpticalProperties = { "externalSolarReflectance", "internalSolarReflectance", "externalLightReflectance", "internalLightReflectance", "externalEmissivity", "internalEmissivity" }; + + /// + /// Every row-3a optical key on a face EnergyPlus does not use, with its scope, derived here from the frozen fixture + /// alone (GetSpaces() order, adjacency, the adiabatic flag and the panel type), never from the writer or from S09. + /// SAM lists a construction inside → outside from its first space; EnergyPlus lists it outside first. + /// + private static Dictionary UnusedFaces(AnalyticalModel model) + { + AdjacencyCluster cluster = model.AdjacencyCluster; + List spaces = cluster.GetSpaces(); + Dictionary result = new Dictionary(StringComparer.Ordinal); + foreach (Panel panel in cluster.GetPanels()) + { + List related = cluster.GetRelatedObjects(panel).OrderBy(x => spaces.FindIndex(s => s.Guid == x.Guid)).ToList(); + bool adiabatic = panel.TryGetValue(PanelParameter.Adiabatic, out bool flag) && flag; + bool ground = panel.PanelType == PanelType.SlabOnGrade || panel.PanelType == PanelType.UndergroundSlab || panel.PanelType == PanelType.UndergroundWall || panel.PanelType == PanelType.UndergroundCeiling; + bool interzone = related.Count == 2; + int count = panel.Construction.ConstructionLayers.Count; + for (int i = 0; i < related.Count; i++) + { + string side = "panel:" + panel.Guid.ToString("D") + "@space:" + related[i].Guid.ToString("D"); + for (int k = 1; k <= count; k++) + { + foreach (string face in new[] { "internal", "external" }) + { + bool towardsZone = (face == "internal") == (i == 0); + bool zoneFace = k == count && towardsZone; + bool outerFace = k == 1 && !towardsZone; + if (zoneFace || (outerFace && !interzone && !adiabatic && !ground)) + { + continue; + } + + string scope = !outerFace ? "buried layer face" : interzone ? "interzone surface outer face" : adiabatic ? "adiabatic surface outer face" : "ground surface outer face"; + foreach (string optic in Optics) + { + result.Add(side + "#layer" + k + "." + face + optic, scope); + } + } + } + } + } + + return result; + } + + /// A SAM opaque material's authored face value, from the frozen model. + private static double SamFace(AnalyticalModel model, string materialName, string property) + { + Core.OpaqueMaterial material = model.MaterialLibrary.GetMaterials().OfType().Single(x => x.Name == materialName); + OpaqueMaterialParameter parameter = (OpaqueMaterialParameter)Enum.Parse(typeof(OpaqueMaterialParameter), char.ToUpperInvariant(property[0]) + property.Substring(1)); + Assert.That(material.TryGetValue(parameter, out double value), Is.True, materialName + " " + property); + return value; + } + + private static string OtherFace(string property) + { + return property.StartsWith("internal", StringComparison.Ordinal) ? "external" + property.Substring("internal".Length) : "internal" + property.Substring("external".Length); + } + + private static string SideKey(Panel panel, Space space) => "panel:" + panel.Guid.ToString("D") + "@space:" + space.Guid.ToString("D"); + + private static AnalyticalModel WithMaterial(string fixtureId, string materialName, Action change) + { + AnalyticalModel model = TestSupport.Load(fixtureId); + Core.MaterialLibrary materialLibrary = model.MaterialLibrary; + Core.OpaqueMaterial material = materialLibrary.GetMaterials().OfType().Single(x => x.Name == materialName); + change(material); + materialLibrary.Add(material); + return new AnalyticalModel(model, model.AdjacencyCluster, materialLibrary, model.ProfileLibrary); + } + + private static AnalyticalModel WithAdiabaticPanel(string fixtureId, Func select, out Panel selected) + { + AnalyticalModel model = TestSupport.Load(fixtureId); + AdjacencyCluster cluster = model.AdjacencyCluster; + Panel panel = Analytical.Create.Panel(select(cluster)); + Assert.That(panel.SetValue(PanelParameter.Adiabatic, true), Is.True); + Assert.That(cluster.AddObject(panel), Is.True); + selected = panel; + return new AnalyticalModel(model, cluster); + } + + private static string Text(string run) => File.ReadAllText(Path.Combine(run, "compare-approved", "report.txt")); + + // ---- both fixtures ------------------------------------------------------------------------------------------------ + + /// + /// Every unused-face row, and only those, is OUT-OF-ENGINE-SCOPE, with its authored value, its native value, the + /// difference, side, layer, scope and the amendment. The rows that differ are exactly the single-sided difference + /// of revisions 8-11 (the SAM face differs from its other face and the native holds that other face): 69 / 138, + /// still visible. Equal-valued unused rows qualify too, so the total is larger and is not forced to 69 / 138. + /// + [TestCase(TestSupport.Box, 69)] + [TestCase(TestSupport.Two, 138)] + public void EveryUnusedFaceRow_IsOutOfEngineScope_WithBothValuesAndItsReason(string fixtureId, int historicalDiffering) + { + OsReport report = fixtureId == TestSupport.Box ? box : two; + string run = fixtureId == TestSupport.Box ? boxRun : twoRun; + AnalyticalModel model = TestSupport.Load(fixtureId); + Dictionary unused = UnusedFaces(model); + Dictionary rows = report.OutOfEngineScope.Rows.ToDictionary(x => x.Key, StringComparer.Ordinal); + Assert.That(rows.Keys.OrderBy(x => x, StringComparer.Ordinal), Is.EqualTo(unused.Keys.OrderBy(x => x, StringComparer.Ordinal)), "exactly the independently derived unused faces"); + Assert.That(report.OutOfEngineScope.Count, Is.EqualTo(unused.Count)); + Assert.That(report.OutOfEngineScope.Amendment, Is.EqualTo(OsComparison.OpaqueFaceScope)); + Assert.That(report.OutOfEngineScope.CountByScope, Is.EquivalentTo(unused.GroupBy(x => x.Value).ToDictionary(x => x.Key, x => x.Count()))); + Assert.That(report.OutOfEngineScope.CountByScope.Keys, Has.Member(fixtureId == TestSupport.Two ? "interzone surface outer face" : "ground surface outer face")); + + ToleranceRule tolerance = QuantityCatalog.Get("3a").Tolerance; + Dictionary results = LayerResults(run, fixtureId); + List singleSided = new List(); + foreach (OutOfEngineScopeRow row in rows.Values) + { + Assert.That(row.Quantity, Is.EqualTo("3a")); + Assert.That(row.Amendment, Is.EqualTo(OsComparison.OpaqueFaceScope)); + Assert.That(row.Key, Is.EqualTo(row.Side + "#layer" + row.Layer + "." + row.Property)); + Assert.That(row.Property, Does.StartWith(row.SamFace)); + Assert.That(row.ScopeReason, Does.StartWith(unused[row.Key]), row.Key); + Assert.That(row.SamValue, Is.EqualTo(SamFace(model, row.SamMaterial, row.Property)), row.Key + ": the authored value, as the frozen model states it"); + Assert.That(row.Delta, Is.EqualTo(Math.Abs(row.NativeValue - row.SamValue)), row.Key); + Assert.That(row.Differs, Is.EqualTo(!EQ.Compare(row.SamValue, row.NativeValue, tolerance).IsWithin), row.Key); + Assert.That(row.NativeObject, Does.Contain(row.SamMaterial), row.Key); + + QuantityResult result = results[row.Key]; + Assert.That(result.GatesFixture, Is.False, row.Key + ": informational"); + Assert.That(result.Input.Native.Value, Is.EqualTo(row.NativeValue), row.Key); + Assert.That(result.Reason, Does.StartWith("OUT-OF-ENGINE-SCOPE (" + OsComparison.OpaqueFaceScope + ")"), row.Key); + + double other = SamFace(model, row.SamMaterial, OtherFace(row.Property)); + if (!EQ.Compare(other, row.SamValue, tolerance).IsWithin && EQ.Compare(other, row.NativeValue, tolerance).IsWithin) + { + singleSided.Add(row.Key); + } + } + + Assert.That(rows.Values.Where(x => x.Differs).Select(x => x.Key).OrderBy(x => x, StringComparer.Ordinal), Is.EqualTo(singleSided.OrderBy(x => x, StringComparer.Ordinal)), "every differing row is the single-sided difference"); + Assert.That(report.OutOfEngineScope.Differing, Is.EqualTo(historicalDiffering), "the rows MAPPING-DIFFERENCE named in revisions 8-11 stay visible"); + Assert.That(report.OutOfEngineScope.Equal, Is.EqualTo(report.OutOfEngineScope.Count - historicalDiffering)); + Assert.That(report.OutOfEngineScope.Equal, Is.GreaterThan(0), "equal-valued unused faces are valid and comparable, so they are in scope too"); + Assert.That(report.NonPass.Select(x => x.Key).Intersect(rows.Keys), Is.Empty); + + string text = Text(run); + Assert.That(text, Does.Contain("; gated non-PASS 0; out-of-engine-scope " + report.OutOfEngineScope.Count + " (informational, not gated)")); + Assert.That(text, Does.Contain("OUT-OF-ENGINE-SCOPE (informational, not gated; " + OsComparison.OpaqueFaceScope + "): " + report.OutOfEngineScope.Count + " row(s), " + historicalDiffering + " differing, " + report.OutOfEngineScope.Equal + " equal")); + Assert.That(text, Does.Contain(OsComparison.OutOfEngineScopeOutcome + " " + report.OutOfEngineScope.Count)); + Assert.That(text, Does.Not.Contain("NOT PASS")); + } + + // ---- used faces stay gated ----------------------------------------------------------------------------------------- + + /// + /// The outdoor face: the outermost layer's absorptance changed natively. Exactly the outdoor-face rows of the sides + /// with that layer outermost FAIL; the same object's buried face stays OUT-OF-ENGINE-SCOPE with the new value + /// (U1 does not require it to equal the other face), and it cannot mask the failure. + /// + [Test] + public void AWrongOutdoorFaceValue_Fails_WhileTheSameLayersBuriedFaceStaysInformational() + { + // An outdoor side: its outermost layer's outer face is used, so only the inner face of that layer is in scope. + HashSet keys = new HashSet(box.OutOfEngineScope.Rows.Select(x => x.Key), StringComparer.Ordinal); + bool Outdoor(OutOfEngineScopeRow x) => x.Layer == 1 && x.Property == "internalSolarReflectance" && !keys.Contains(x.Side + "#layer1.externalSolarReflectance"); + OutOfEngineScopeRow buried = box.OutOfEngineScope.Rows.First(Outdoor); + List sides = box.OutOfEngineScope.Rows.Where(x => Outdoor(x) && x.NativeObject == buried.NativeObject).Select(x => x.Side).ToList(); + OsReport report = MutatedIdf(boxRun, TestSupport.Box, "u1-outdoor-face", (idf, model) => Cli.Negative.SetField(idf, "Material", buried.NativeObject, "Solar Absorptance", "0.5")); + + Assert.That(report.ExitCode, Is.EqualTo(ReadBackExit.Fail), report.Status); + List failed = report.NonPass.Where(x => x.Status == "Fail").Select(x => x.Key).OrderBy(x => x, StringComparer.Ordinal).ToList(); + Assert.That(failed, Is.EqualTo(sides.Select(x => x + "#layer1.externalSolarReflectance").OrderBy(x => x, StringComparer.Ordinal)), "exactly the outdoor faces of that layer"); + foreach (string side in sides) + { + OutOfEngineScopeRow row = report.OutOfEngineScope.Rows.Single(x => x.Key == side + "#layer1.internalSolarReflectance"); + Assert.That(row.NativeValue, Is.EqualTo(0.5)); + Assert.That(row.Differs, Is.True); + } + + Assert.That(report.OutOfEngineScope.Count, Is.EqualTo(box.OutOfEngineScope.Count), "no row moves in or out of scope"); + } + + /// + /// Interzone, both directions: the object that is one side's zone face is the other side's outer face. Changing it + /// FAILs the zone face (and every other zone face that object holds); the partner side's outer-face row stays + /// OUT-OF-ENGINE-SCOPE ("interzone surface outer face") with the new native value. + /// + [TestCase(true)] + [TestCase(false)] + public void AnInterzoneZoneFaceError_Fails_WhileThePartnersOuterFaceStaysInformational(bool firstSpaceZoneFace) + { + AnalyticalModel model = TestSupport.Load(TestSupport.Two); + AdjacencyCluster cluster = model.AdjacencyCluster; + List spaces = cluster.GetSpaces(); + Panel partition = cluster.GetPanels().Single(x => cluster.GetRelatedObjects(x).Count == 2); + List related = cluster.GetRelatedObjects(partition).OrderBy(x => spaces.FindIndex(s => s.Guid == x.Guid)).ToList(); + int count = partition.Construction.ConstructionLayers.Count; + string first = SideKey(partition, related[0]), second = SideKey(partition, related[1]); + string zoneKey = firstSpaceZoneFace ? first + "#layer" + count + ".internalSolarReflectance" : second + "#layer" + count + ".externalSolarReflectance"; + string outerKey = firstSpaceZoneFace ? second + "#layer1.internalSolarReflectance" : first + "#layer1.externalSolarReflectance"; + OutOfEngineScopeRow outer = two.OutOfEngineScope.Rows.Single(x => x.Key == outerKey); + Assert.That(outer.ScopeReason, Does.StartWith("interzone surface outer face")); + + OsReport report = MutatedIdf(twoRun, TestSupport.Two, "u1-interzone-" + (firstSpaceZoneFace ? "first" : "second"), (idf, m) => Cli.Negative.SetField(idf, "Material", outer.NativeObject, "Solar Absorptance", "0.5")); + Assert.That(report.ExitCode, Is.EqualTo(ReadBackExit.Fail), report.Status); + List failed = report.NonPass.Where(x => x.Status == "Fail").ToList(); + List zoneFaces = ZoneFaceKeys(TestSupport.Two); + Assert.That(failed.Select(x => x.Key), Has.Member(zoneKey)); + Assert.That(failed.All(x => zoneFaces.Contains(x.Key) && x.Key.EndsWith("SolarReflectance", StringComparison.Ordinal)), Is.True, string.Join(" | ", failed.Select(x => x.Key))); + + OutOfEngineScopeRow after = report.OutOfEngineScope.Rows.Single(x => x.Key == outerKey); + Assert.That(after.NativeValue, Is.EqualTo(0.5)); + Assert.That(report.NonPass.Select(x => x.Key), Has.No.Member(outerKey)); + Assert.That(report.OutOfEngineScope.Count, Is.EqualTo(two.OutOfEngineScope.Count)); + } + + /// A wrong thickness on a buried layer FAILs its thickness rows (and the derived U); its faces stay informational and mask nothing. + [Test] + public void AWrongBuriedLayerThickness_Fails_AndTheInformationalRowsMaskNothing() + { + OutOfEngineScopeRow buried = box.OutOfEngineScope.Rows.First(x => x.Layer > 1 && x.Layer < x.LayerCount); + List thickness = box.OutOfEngineScope.Rows.Where(x => x.NativeObject == buried.NativeObject).Select(x => x.Side + "#layer" + x.Layer + ".thickness").Distinct().ToList(); + OsReport report = MutatedIdf(boxRun, TestSupport.Box, "u1-buried-thickness", (idf, model) => + { + IdfObject material = IdfText.Parse(idf).Single(x => x.Type == "Material" && x.Name == buried.NativeObject); + double value = double.Parse(material.Value(2), System.Globalization.CultureInfo.InvariantCulture) * 1.1; + return Cli.Negative.SetField(idf, "Material", buried.NativeObject, "Thickness", value.ToString("R", System.Globalization.CultureInfo.InvariantCulture)); + }); + + Assert.That(report.ExitCode, Is.EqualTo(ReadBackExit.Fail), report.Status); + List failed = report.NonPass.Where(x => x.Status == "Fail").ToList(); + Assert.That(failed.Where(x => x.Quantity == "3a").Select(x => x.Key).OrderBy(x => x, StringComparer.Ordinal), Is.EqualTo(thickness.OrderBy(x => x, StringComparer.Ordinal))); + Assert.That(failed.All(x => (x.Quantity == "3a" && x.Key.EndsWith(".thickness", StringComparison.Ordinal)) || x.Quantity == "3b"), Is.True, string.Join(" | ", failed.Select(x => x.Key))); + Assert.That(report.OutOfEngineScope.Count, Is.EqualTo(box.OutOfEngineScope.Count)); + Assert.That(report.NonPass.Select(x => x.Key).Intersect(report.OutOfEngineScope.Rows.Select(x => x.Key)), Is.Empty); + } + + /// An informational row coexists with a genuine blocker elsewhere: the blocker decides, both stay visible, and the counts are unchanged. + [TestCase("neg-layer-conductivity", TestSupport.Two)] + [TestCase("neg-lighting-return-air", TestSupport.Box)] + public void AnInformationalRow_NeverMasksAGatedDefect(string caseId, string fixture) + { + OsReport original = fixture == TestSupport.Box ? box : two; + string run = TestSupport.NewDirectory("u1-" + caseId + "-" + fixture); + Assert.That(TestSupport.Cli(out string output, "negative", "--run", fixture == TestSupport.Box ? boxRun : twoRun, "--case", caseId, "--out", run), Is.EqualTo(0), output); + OsReport report = TestSupport.ReadAndCompare(run, fixture); + Assert.That(report.ExitCode, Is.EqualTo(ReadBackExit.Fail), report.Status); + Assert.That(report.GatedNonPass, Is.EqualTo(report.NonPass.Count).And.GreaterThan(0)); + Assert.That(report.OutOfEngineScope.Count, Is.EqualTo(original.OutOfEngineScope.Count)); + Assert.That(report.OutOfEngineScope.Differing, Is.EqualTo(original.OutOfEngineScope.Differing)); + Assert.That(report.CountByOutcome[OsComparison.OutOfEngineScopeOutcome], Is.EqualTo(original.OutOfEngineScope.Count)); + Assert.That(report.NonPass.Select(x => x.Key).Intersect(report.OutOfEngineScope.Rows.Select(x => x.Key)), Is.Empty); + string text = Text(run); + Assert.That(text, Does.Contain("NOT PASS ").And.Contain("OUT-OF-ENGINE-SCOPE (informational, not gated;")); + } + + // ---- authored zero and equal values -------------------------------------------------------------------------------- + + /// + /// An authored zero is a value (S-ZERO), not absence. On the box floor's buried EPS layer: internal emissivity 0 + /// against the native external value (differing), and both light reflectances 0 against a native 0 (equal). All + /// three are OUT-OF-ENGINE-SCOPE and the fixture still PASSes. + /// + [Test] + public void AnAuthoredZeroOnAnUnusedFace_IsAValue_AndOutOfEngineScope() + { + AnalyticalModel model = WithMaterial(TestSupport.Box, "FIX_EPS", material => + { + material.SetValue(OpaqueMaterialParameter.InternalEmissivity, 0.0); + material.SetValue(OpaqueMaterialParameter.InternalLightReflectance, 0.0); + material.SetValue(OpaqueMaterialParameter.ExternalLightReflectance, 0.0); + }); + + OsReport report = TestSupport.Pipeline(TestSupport.Write(model, "u1-zero"), TestSupport.Box, "u1-zero", out string run); + Assert.That(report.NonPass, Is.Empty, string.Join(" | ", report.NonPass.Select(x => x.Key + " " + x.Reason))); + Assert.That(report.ExitCode, Is.EqualTo(ReadBackExit.Pass), report.Status); + + Dictionary eps = report.OutOfEngineScope.Rows.Where(x => x.SamMaterial == "FIX_EPS").ToDictionary(x => x.Property); + Assert.That(eps.Count, Is.EqualTo(6), "both faces of a buried layer"); + Assert.That(eps["internalEmissivity"].SamValue, Is.EqualTo(0.0)); + Assert.That(eps["internalEmissivity"].Differs, Is.True); + foreach (string property in new[] { "internalLightReflectance", "externalLightReflectance" }) + { + Assert.That(eps[property].SamValue, Is.EqualTo(0.0), property); + Assert.That(eps[property].NativeValue, Is.EqualTo(0.0), property); + Assert.That(eps[property].Differs, Is.False, property); + Assert.That(eps[property].NumericVerdict, Is.EqualTo("Identical"), property); + } + + Dictionary results = LayerResults(run, TestSupport.Box); + Assert.That(results[eps["internalEmissivity"].Key].Input.Expected.State, Is.EqualTo(SamInputState.Zero)); + Assert.That(report.OutOfEngineScope.Count, Is.EqualTo(box.OutOfEngineScope.Count)); + } + + // ---- not valid and comparable: never excluded -------------------------------------------------------------------- + + /// A native value on an unused face that is NaN, blank (absent), unreadable or outside [0, 1] keeps its gated result and is never informational. + [TestCase("NaN", "ExportDefect", "Fail", ReadBackExit.Fail, "not a read value")] + [TestCase("", "ExportDefect", "Fail", ReadBackExit.Fail, "not a read value")] + [TestCase("abc", "UnverifiedUnreadable", "BlockedTechnical", ReadBackExit.BlockedTechnical, "not a read value")] + [TestCase("1.25", "ExportDefect", "Fail", ReadBackExit.Fail, "is outside [0, 1]")] + public void AnInvalidNativeValueOnAnUnusedFace_IsNeverExcluded(string value, string outcome, string status, int exit, string fragment) + { + List eps = box.OutOfEngineScope.Rows.Where(x => x.SamMaterial == "FIX_EPS" && x.Property.EndsWith("SolarReflectance", StringComparison.Ordinal)).ToList(); + Assert.That(eps.Count, Is.EqualTo(2), "the buried EPS layer's two solar faces"); + OsReport report = MutatedIdf(boxRun, TestSupport.Box, "u1-native-" + (value.Length == 0 ? "blank" : value), (idf, model) => Cli.Negative.SetField(idf, "Material", eps[0].NativeObject, "Solar Absorptance", value)); + + Assert.That(report.ExitCode, Is.EqualTo(exit), report.Status); + Assert.That(report.NonPass.Select(x => x.Key).OrderBy(x => x, StringComparer.Ordinal), Is.EqualTo(eps.Select(x => x.Key).OrderBy(x => x, StringComparer.Ordinal)), "exactly the two rows, gated"); + Assert.That(report.NonPass.All(x => x.Outcome == outcome && x.Status == status && x.Reason.Contains(fragment) && x.Reason.Contains("Not OUT-OF-ENGINE-SCOPE")), Is.True, string.Join(" | ", report.NonPass.Select(x => x.Outcome + " " + x.Status + " " + x.Reason))); + Assert.That(report.OutOfEngineScope.Rows.Select(x => x.Key).Intersect(eps.Select(x => x.Key)), Is.Empty); + Assert.That(report.OutOfEngineScope.Count, Is.EqualTo(box.OutOfEngineScope.Count - 2)); + Assert.That(report.Coverage, Is.EqualTo("Complete")); + Assert.That(report.Required, Is.EqualTo(box.Required)); + } + + /// A SAM value on an unused face that is absent or NaN (S-UNSPEC) or outside [0, 1] (S-INVALID) keeps its gated result and is never informational. + [TestCase("absent", "ExportDefect", "Fail", ReadBackExit.Fail)] + [TestCase("nan", "ExportDefect", "Fail", ReadBackExit.Fail)] + [TestCase("out-of-domain", "InputInvalid", "BlockedTechnical", ReadBackExit.BlockedTechnical)] + public void AnInvalidSamValueOnAnUnusedFace_IsNeverExcluded(string what, string outcome, string status, int exit) + { + string key = box.OutOfEngineScope.Rows.Single(x => x.SamMaterial == "FIX_EPS" && x.Property == "internalSolarReflectance").Key; + AnalyticalModel model = WithMaterial(TestSupport.Box, "FIX_EPS", material => + { + switch (what) + { + case "absent": + material.RemoveValue(OpaqueMaterialParameter.InternalSolarReflectance); + break; + case "nan": + material.SetValue(OpaqueMaterialParameter.InternalSolarReflectance, double.NaN); + break; + default: + material.SetValue(OpaqueMaterialParameter.InternalSolarReflectance, 1.4); + break; + } + }); + + OsReport report = TestSupport.Pipeline(TestSupport.Write(model, "u1-sam-" + what), TestSupport.Box, "u1-sam-" + what, out string run); + Assert.That(report.ExitCode, Is.EqualTo(exit), report.Status); + ReportItem item = report.NonPass.Single(); + Assert.That(item.Key, Is.EqualTo(key)); + Assert.That(item.Outcome, Is.EqualTo(outcome), item.Reason); + Assert.That(item.Status, Is.EqualTo(status), item.Reason); + Assert.That(item.Reason, Does.Contain("Not OUT-OF-ENGINE-SCOPE")); + Assert.That(report.OutOfEngineScope.Rows.Select(x => x.Key), Has.No.Member(key)); + Assert.That(report.OutOfEngineScope.Count, Is.EqualTo(box.OutOfEngineScope.Count - 1)); + } + + // ---- face roles ---------------------------------------------------------------------------------------------------- + + /// + /// The control: a box wall made adiabatic in SAM. Its outermost layer's outer face is now unused ("adiabatic surface + /// outer face"); the role is established from the SAM flag and the native Adiabatic boundary, and the fixture passes. + /// + [Test] + public void AnAdiabaticWall_HasItsOuterFaceOutOfEngineScope() + { + AnalyticalModel model = WithAdiabaticPanel(TestSupport.Box, cluster => cluster.GetPanels().First(x => x.PanelType == PanelType.WallExternal && (x.Apertures == null || x.Apertures.Count == 0)), out Panel wall); + OsReport report = TestSupport.Pipeline(TestSupport.Write(model, "u1-adiabatic"), TestSupport.Box, "u1-adiabatic", out string run); + Assert.That(report.Unsupported, Is.Empty, string.Join(" | ", report.Unsupported)); + Assert.That(report.Consistency, Is.Empty, string.Join(" | ", report.Consistency)); + Assert.That(report.NonPass, Is.Empty, string.Join(" | ", report.NonPass.Select(x => x.Key + " " + x.Reason))); + Assert.That(report.ExitCode, Is.EqualTo(ReadBackExit.Pass), report.Status); + string side = SideKey(wall, model.AdjacencyCluster.GetRelatedObjects(wall).Single()); + List outer = report.OutOfEngineScope.Rows.Where(x => x.Side == side && x.ScopeReason == "adiabatic surface outer face").ToList(); + Assert.That(outer.Select(x => x.Key).OrderBy(x => x, StringComparer.Ordinal), Is.EqualTo(UnusedFaces(model).Where(x => x.Value == "adiabatic surface outer face").Select(x => x.Key).OrderBy(x => x, StringComparer.Ordinal))); + Assert.That(outer.Count, Is.EqualTo(3)); + Assert.That(report.OutOfEngineScope.Count, Is.EqualTo(box.OutOfEngineScope.Count + 3)); + } + + /// + /// A face role that cannot be established is never excluded: an unsupported native ground form, an adiabatic SAM + /// panel written as Ground, an interzone partner that is not this side's mirror or does not name it back, and a SAM + /// panel that bounds two spaces and is adiabatic. Each is named as unsupported (BLOCKED technical at least), none of + /// the side's rows is OUT-OF-ENGINE-SCOPE, and the fixture never passes. + /// + [TestCase("ground-preprocessor")] + [TestCase("adiabatic-written-as-ground")] + [TestCase("interzone-not-mirrored")] + [TestCase("interzone-partner-missing")] + [TestCase("interzone-adiabatic")] + public void AFaceRoleThatCannotBeEstablished_IsNeverExcluded(string what) + { + OsReport report; + List sides; + string fragment; + switch (what) + { + case "ground-preprocessor": + { + AnalyticalModel model = TestSupport.Load(TestSupport.Box); + Panel floor = model.AdjacencyCluster.GetPanels().Single(x => x.PanelType == PanelType.SlabOnGrade); + sides = new List { SideKey(floor, model.AdjacencyCluster.GetRelatedObjects(floor).Single()) }; + report = MutatedIdf(boxRun, TestSupport.Box, "u1-ground-preprocessor", (idf, m) => + { + IdfObject surface = IdfText.Parse(idf).Single(x => x.Type == "BuildingSurface:Detailed" && string.Equals(x.Value(5), "Ground", StringComparison.OrdinalIgnoreCase)); + return Cli.Negative.SetField(idf, "BuildingSurface:Detailed", surface.Name, "Outside Boundary Condition", "GroundFCfactorMethod"); + }); + fragment = "the native outside boundary 'GroundFCfactorMethod' is not the SAM boundary 'Ground'"; + Assert.That(report.Consistency, Is.Not.Empty, "the boundary itself also disagrees with SAM"); + break; + } + + case "adiabatic-written-as-ground": + { + AnalyticalModel model = WithAdiabaticPanel(TestSupport.Box, cluster => cluster.GetPanels().First(x => x.PanelType == PanelType.WallExternal && (x.Apertures == null || x.Apertures.Count == 0)), out Panel wall); + TestSupport.Pipeline(TestSupport.Write(model, "u1-adiabatic-source"), TestSupport.Box, "u1-adiabatic-source", out string source); + sides = new List { SideKey(wall, model.AdjacencyCluster.GetRelatedObjects(wall).Single()) }; + report = MutatedIdf(source, TestSupport.Box, "u1-adiabatic-as-ground", (idf, m) => + { + IdfObject surface = IdfText.Parse(idf).Single(x => x.Type == "BuildingSurface:Detailed" && string.Equals(x.Value(5), "Adiabatic", StringComparison.OrdinalIgnoreCase)); + return Cli.Negative.SetField(idf, "BuildingSurface:Detailed", surface.Name, "Outside Boundary Condition", "Ground"); + }); + fragment = "the native outside boundary 'Ground' is not the SAM boundary 'Adiabatic'"; + break; + } + + case "interzone-not-mirrored": + case "interzone-partner-missing": + { + AnalyticalModel model = TestSupport.Load(TestSupport.Two); + Panel partition = model.AdjacencyCluster.GetPanels().Single(x => model.AdjacencyCluster.GetRelatedObjects(x).Count == 2); + sides = model.AdjacencyCluster.GetRelatedObjects(partition).Select(x => SideKey(partition, x)).ToList(); + if (what == "interzone-not-mirrored") + { + report = MutatedIdf(twoRun, TestSupport.Two, "u1-interzone-not-mirrored", (idf, m) => + { + IdfObject reverse = IdfText.Parse(idf).Single(x => x.Type == "Construction" && x.Name.Contains("PARTITION_Reverse")); + idf = Cli.Negative.SetField(idf, "Construction", reverse.Name, "Layer 2", reverse.Value(3)); + return Cli.Negative.SetField(idf, "Construction", reverse.Name, "Layer 3", reverse.Value(2)); + }); + fragment = "the interzone partner's construction is not this side's construction reversed"; + } + else + { + report = MutatedIdf(twoRun, TestSupport.Two, "u1-interzone-partner-missing", (idf, m) => + { + IdfObject surface = IdfText.Parse(idf).First(x => x.Type == "BuildingSurface:Detailed" && string.Equals(x.Value(5), "Surface", StringComparison.OrdinalIgnoreCase)); + return Cli.Negative.SetField(idf, "BuildingSurface:Detailed", surface.Name, "Outside Boundary Condition Object", "S09_NoSuchSurface"); + }); + fragment = "the interzone partner"; + } + + break; + } + + default: + { + AnalyticalModel model = WithAdiabaticPanel(TestSupport.Two, cluster => cluster.GetPanels().Single(x => cluster.GetRelatedObjects(x).Count == 2), out Panel partition); + sides = model.AdjacencyCluster.GetRelatedObjects(partition).Select(x => SideKey(partition, x)).ToList(); + report = TestSupport.Pipeline(TestSupport.Write(model, "u1-interzone-adiabatic"), TestSupport.Two, "u1-interzone-adiabatic", out string _); + fragment = "contradictory SAM boundary: the panel bounds two spaces and is adiabatic"; + break; + } + } + + Assert.That(report.ExitCode, Is.AnyOf(ReadBackExit.Fail, ReadBackExit.BlockedTechnical), what + ": " + report.Status); + Assert.That(report.Status, Is.Not.EqualTo(GateStatus.Pass.ToString())); + foreach (string side in sides) + { + Assert.That(report.Unsupported.Count(x => x.StartsWith("optics role: " + side + ": ", StringComparison.Ordinal) && x.Contains(fragment) && x.EndsWith("no optical face of this side is OUT-OF-ENGINE-SCOPE (" + OsComparison.OpaqueFaceScope + ")", StringComparison.Ordinal)), Is.EqualTo(1), side + ": " + string.Join(" | ", report.Unsupported)); + Assert.That(report.OutOfEngineScope.Rows.Where(x => x.Side == side), Is.Empty, side); + } + + Assert.That(report.NonPass.Where(x => sides.Any(s => x.Key.StartsWith(s + "#", StringComparison.Ordinal)) && OpticalProperties.Any(p => x.Key.EndsWith("." + p, StringComparison.Ordinal))).All(x => x.Reason.Contains("Not OUT-OF-ENGINE-SCOPE") || x.Status == "Fail"), Is.True); + Assert.That(report.Coverage, Is.EqualTo("Complete")); + } + } +} diff --git a/benchmark/SAM.Analytical.OpenStudio.InputReadBack.Tests/ReadBackTests.cs b/benchmark/SAM.Analytical.OpenStudio.InputReadBack.Tests/ReadBackTests.cs new file mode 100644 index 0000000..d15ad5a --- /dev/null +++ b/benchmark/SAM.Analytical.OpenStudio.InputReadBack.Tests/ReadBackTests.cs @@ -0,0 +1,834 @@ +// SPDX-License-Identifier: LGPL-3.0-or-later +// Copyright (c) 2020–2026 Michal Dengusiak & Jakub Ziolkowski and contributors + +using NUnit.Framework; +using SAM.Analytical.InputEquivalence; +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text.RegularExpressions; + +namespace SAM.Analytical.OpenStudio.InputReadBack.Tests +{ + /// + /// The S09 read-back end to end, offline: export, fresh-process read and compare on the S08 signed-off fixtures with the + /// Budapest EPW. Each fixture has complete S07 coverage. Opaque optics on faces EnergyPlus does not use are + /// OUT-OF-ENGINE-SCOPE (S07 §5.2, amendment U1): informational, not gated, never MATCH. Every gated quantity passes, so + /// both fixtures PASS scoped native-input conformance (exit 0); this is not simulation equivalence. The lighting split + /// is the S07 §5.1 T-LIGHT-SPLIT of the authored p. The ventilation policy holds hour by hour, and every targeted + /// mutation is refused. + /// + [TestFixture] + public partial class ReadBackTests + { + private string boxRun; + private string twoRun; + private OsReport box; + private OsReport two; + + [OneTimeSetUp] + public void ExportBothFixtures() + { + Assert.That(Hashing.Sha256(TestSupport.Fixture(TestSupport.Box)), Is.EqualTo(TestSupport.BoxSha256), "the S08 signed-off box fixture, byte for byte"); + Assert.That(Hashing.Sha256(TestSupport.Fixture(TestSupport.Two)), Is.EqualTo(TestSupport.TwoSha256), "the S08 signed-off two-zone fixture, byte for byte"); + box = TestSupport.Pipeline(TestSupport.Fixture(TestSupport.Box), TestSupport.Box, "box", out boxRun); + two = TestSupport.Pipeline(TestSupport.Fixture(TestSupport.Two), TestSupport.Two, "two", out twoRun); + } + + private static string Ic(Guid space, string what) => "space:" + space.ToString("D") + ".ic." + what; + + /// + /// The gating non-PASS items of a fixture; must be empty. Since S07 §5.2 (amendment U1) no gated item is excepted: + /// the unused-face optics rows are OUT-OF-ENGINE-SCOPE and never in . The lighting rows + /// have no exception (S07 §5.1 removed the view-coefficient comparison and its DOCUMENTED-DEFAULT). + /// + private static List Unexplained(OsReport report) + { + return report.NonPass.ToList(); + } + + private static readonly string[] LightingRows = { "lighting.returnAir", "lighting.radiantTotal", "lighting.visible", "lighting.radiant", "lighting.convective" }; + + /// + /// Every T-LIGHT-SPLIT row of a space, recomputed in this process from the run's frozen model and the snapshot the + /// fresh-process reader wrote (the report lists only the non-PASS rows). The verdict itself is the CLI's. + /// + private static Dictionary LightingResults(string run, string fixtureId, Guid space) + { + AnalyticalModel model = Core.Convert.ToSAM(Path.Combine(run, "frozen-model.json")).Single(); + NativeSnapshot snapshot = NativeSnapshot.Load(Path.Combine(run, "native.json")); + OsComparison comparison = OsComparison.Run(model, snapshot, Path.Combine(run, "weather.epw"), fixtureId, GateRuleSet.Approved); + return LightingRows.ToDictionary(x => x, x => comparison.Results.Single(r => r.Input.ObjectKey == Ic(space, x))); + } + + [TestCase(TestSupport.Box, "5080c000-0000-0000-0000-00000000c001", 0.37)] + [TestCase(TestSupport.Two, "5080c000-0000-0000-0000-00000000c0a1", 0.34)] + [TestCase(TestSupport.Two, "5080c000-0000-0000-0000-00000000c0b1", 0.41)] + public void TheAuthoredP_IsWrittenAsTheAcceptedLightingSplit(string fixtureId, string spaceId, double p) + { + // S07 §5.1 expected vectors (tolerance 0.001): F_V, F_R, F_C. + Dictionary vectors = new Dictionary + { + [0.37] = new[] { 0.155130, 0.214870, 0.63 }, + [0.34] = new[] { 0.142552, 0.197448, 0.66 }, + [0.41] = new[] { 0.171901, 0.238099, 0.59 }, + }; + + Dictionary rows = LightingResults(fixtureId == TestSupport.Box ? boxRun : twoRun, fixtureId, Guid.Parse(spaceId)); + Assert.That(rows["lighting.returnAir"].Outcome, Is.EqualTo(EquivalenceOutcome.Match), rows["lighting.returnAir"].Reason); + Assert.That(rows["lighting.returnAir"].Input.Native.Kind, Is.EqualTo(ReaderKind.Zero), "blank reads as 0"); + foreach (string row in new[] { "lighting.radiantTotal", "lighting.visible", "lighting.radiant", "lighting.convective" }) + { + Assert.That(rows[row].Outcome, Is.EqualTo(EquivalenceOutcome.AcceptedTransformation), row + ": " + rows[row].Reason); + Assert.That(rows[row].Input.TransformationId, Is.EqualTo(OsComparison.LightSplit)); + } + + Assert.That(rows["lighting.radiantTotal"].Input.Expected.Value, Is.EqualTo(p)); + Assert.That(rows["lighting.visible"].Input.Expected.Value, Is.EqualTo(vectors[p][0]).Within(1e-6)); + Assert.That(rows["lighting.radiant"].Input.Expected.Value, Is.EqualTo(vectors[p][1]).Within(1e-6)); + Assert.That(rows["lighting.convective"].Input.Expected.Value, Is.EqualTo(vectors[p][2]).Within(1e-12)); + Assert.That(rows["lighting.visible"].Input.Native.Value, Is.EqualTo(vectors[p][0]).Within(0.001)); + Assert.That(rows["lighting.radiant"].Input.Native.Value, Is.EqualTo(vectors[p][1]).Within(0.001)); + } + + [Test] + public void AnAuthoredZero_IsPreserved_AndReadsBackAllConvective() + { + AnalyticalModel model = TestSupport.Load(TestSupport.Box); + TestSupport.ChangeCondition(model, TestSupport.BoxSpace, ic => ic.SetValue(InternalConditionParameter.LightingRadiantProportion, 0.0)); + OsReport report = TestSupport.Pipeline(TestSupport.Write(model, "box-p0-zero"), TestSupport.Box, "box-p-zero", out string run); + Assert.That(Unexplained(report), Is.Empty, string.Join(" | ", Unexplained(report).Select(x => x.Key + " " + x.Outcome + " " + x.Reason))); + Assert.That(report.ExitCode, Is.EqualTo(ReadBackExit.Pass), "every gated row passes; the unused-face optics are informational (S07 §5.2)"); + + Dictionary rows = LightingResults(run, TestSupport.Box, TestSupport.BoxSpace); + foreach (string row in new[] { "lighting.returnAir", "lighting.radiantTotal", "lighting.visible", "lighting.radiant" }) + { + Assert.That(rows[row].Input.Expected.State, Is.EqualTo(SamInputState.Zero), row); + Assert.That(rows[row].Input.Native.Kind, Is.EqualTo(ReaderKind.Zero), row); + Assert.That(rows[row].Outcome, Is.EqualTo(EquivalenceOutcome.Match), row); + } + + Assert.That(rows["lighting.convective"].Input.Expected.Value, Is.EqualTo(1.0)); + Assert.That(rows["lighting.convective"].Outcome, Is.EqualTo(EquivalenceOutcome.AcceptedTransformation)); + } + + [TestCase(0.49)] + [TestCase(0.0)] + public void TheComfortCoefficient_LeavesEveryLightingRowUnchanged(double coefficient) + { + AnalyticalModel model = TestSupport.Load(TestSupport.Box); + TestSupport.ChangeCondition(model, TestSupport.BoxSpace, ic => ic.SetValue(InternalConditionParameter.LightingViewCoefficient, coefficient)); + string label = "box-c-" + coefficient.ToString("0.00", System.Globalization.CultureInfo.InvariantCulture); + OsReport report = TestSupport.Pipeline(TestSupport.Write(model, label), TestSupport.Box, label, out string run); + Assert.That(Unexplained(report), Is.Empty, string.Join(" | ", Unexplained(report).Select(x => x.Key + " " + x.Outcome + " " + x.Reason))); + Assert.That(report.Required, Is.EqualTo(box.Required), "the view coefficient adds no compared row"); + Assert.That(report.CountByOutcome, Is.EqualTo(box.CountByOutcome)); + + Dictionary baseline = LightingResults(boxRun, TestSupport.Box, TestSupport.BoxSpace); + Dictionary rows = LightingResults(run, TestSupport.Box, TestSupport.BoxSpace); + foreach (string row in LightingRows) + { + Assert.That(rows[row].Outcome, Is.EqualTo(baseline[row].Outcome), row); + Assert.That(rows[row].Input.Expected.ToString(), Is.EqualTo(baseline[row].Input.Expected.ToString()), row); + Assert.That(rows[row].Input.Native.Value, Is.EqualTo(baseline[row].Input.Native.Value), row); + } + } + + /// An unstated (absent or NaN) p keeps S-UNSPEC on every lighting row: the p₀ split is DOCUMENTED-DEFAULT, never PASS. + [TestCase("absent")] + [TestCase("nan")] + public void AnUnstatedP_IsADocumentedDefault_NeverPass(string what) + { + AnalyticalModel model = TestSupport.Load(TestSupport.Box); + TestSupport.ChangeCondition(model, TestSupport.BoxSpace, ic => + { + if (what == "nan") + { + ic.SetValue(InternalConditionParameter.LightingRadiantProportion, double.NaN); + } + else + { + ic.RemoveValue(InternalConditionParameter.LightingRadiantProportion); + } + }); + + string label = "box-p-" + what; + OsReport report = TestSupport.Pipeline(TestSupport.Write(model, label), TestSupport.Box, label, out string run); + Assert.That(report.ExitCode, Is.EqualTo(ReadBackExit.BlockedOwner), report.Status); + Assert.That(report.OutOfEngineScope.Count, Is.EqualTo(box.OutOfEngineScope.Count), "the informational rows coexist and stay visible; they neither hide nor add a blocker"); + List lighting = Unexplained(report); + Assert.That(lighting.Select(x => x.Key).OrderBy(x => x), Is.EqualTo(LightingRows.Select(x => Ic(TestSupport.BoxSpace, x)).OrderBy(x => x)), string.Join(" | ", lighting.Select(x => x.Key + " " + x.Outcome))); + Assert.That(lighting.All(x => x.Outcome == "DocumentedDefault" && x.Status == "BlockedOwnerDecision"), Is.True, string.Join(" | ", lighting.Select(x => x.Key + " " + x.Outcome + " " + x.Status))); + + Dictionary rows = LightingResults(run, TestSupport.Box, TestSupport.BoxSpace); + Assert.That(rows.Values.All(x => x.Input.Expected.State == SamInputState.Unspecified), Is.True, "no expected value is computed from p0 as if SAM had stated it"); + Assert.That(rows["lighting.radiantTotal"].Input.ListedDefault, Is.EqualTo(0.576)); + Assert.That(rows["lighting.visible"].Input.Native.Value, Is.EqualTo(0.2415).Within(1e-9)); + Assert.That(rows["lighting.radiant"].Input.Native.Value, Is.EqualTo(0.3345).Within(1e-9)); + } + + [TestCase("neg-lighting-previous-mapping", TestSupport.Box, "lighting.visible")] + [TestCase("neg-lighting-previous-mapping", TestSupport.Two, "lighting.visible")] + [TestCase("neg-lighting-visible-zero", TestSupport.Box, "lighting.visible")] + [TestCase("neg-lighting-visible-zero", TestSupport.Two, "lighting.visible")] + [TestCase("neg-lighting-radiant-is-p", TestSupport.Box, "lighting.radiant")] + [TestCase("neg-lighting-radiant-is-p", TestSupport.Two, "lighting.radiant")] + [TestCase("neg-lighting-return-air", TestSupport.Box, "lighting.returnAir")] + [TestCase("neg-lighting-return-air", TestSupport.Two, "lighting.returnAir")] + [TestCase("neg-lighting-swapped", TestSupport.Box, "lighting.visible")] + [TestCase("neg-lighting-swapped", TestSupport.Two, "lighting.visible")] + public void AnIncorrectLightingPartition_Fails_OnTheLightingRows(string caseId, string fixture, string failingRow) + { + OsReport original = fixture == TestSupport.Box ? box : two; + string run = TestSupport.NewDirectory(caseId + "-" + fixture); + Assert.That(TestSupport.Cli(out string output, "negative", "--run", fixture == TestSupport.Box ? boxRun : twoRun, "--case", caseId, "--out", run), Is.EqualTo(0), output); + OsReport report = TestSupport.ReadAndCompare(run, fixture); + Assert.That(report.ExitCode, Is.EqualTo(ReadBackExit.Fail), caseId + ": " + report.Status); + List failed = report.NonPass.Where(x => x.Status == "Fail").ToList(); + Assert.That(failed, Is.Not.Empty); + Assert.That(failed.All(x => x.Key.Contains(".ic.lighting.")), Is.True, string.Join(" | ", failed.Select(x => x.Key + " " + x.Reason))); + Assert.That(failed.Any(x => x.Key.EndsWith(".ic." + failingRow, StringComparison.Ordinal)), Is.True, string.Join(" | ", failed.Select(x => x.Key))); + Assert.That(report.Consistency, Is.Empty, "the OSM is not compared for the split; the lighting rows refuse it"); + Assert.That(report.Required, Is.EqualTo(original.Required)); + } + + /// A box export with an authored p (fresh-process read and compare). + private static OsReport BoxWithP(double p, out string run) + { + AnalyticalModel model = TestSupport.Load(TestSupport.Box); + TestSupport.ChangeCondition(model, TestSupport.BoxSpace, ic => ic.SetValue(InternalConditionParameter.LightingRadiantProportion, p)); + string label = "box-p-" + p.ToString("0.###", System.Globalization.CultureInfo.InvariantCulture); + return TestSupport.Pipeline(TestSupport.Write(model, label), TestSupport.Box, label, out run); + } + + /// A CLI negative (or control) case applied to a copy of , read and compared fresh. + private static OsReport Mutated(string source, string caseId, out string run) + { + run = TestSupport.NewDirectory(caseId); + Assert.That(TestSupport.Cli(out string output, "negative", "--run", source, "--case", caseId, "--out", run), Is.EqualTo(0), output); + return TestSupport.ReadAndCompare(run, TestSupport.Box); + } + + /// The boundaries p = 1 and p = 0 written by the writer are valid splits: every lighting row passes. + [TestCase(1.0)] + [TestCase(0.0)] + public void TheBoundarySplits_PEqualOneAndZero_AreValid(double p) + { + OsReport report = BoxWithP(p, out string run); + Assert.That(report.ExitCode, Is.EqualTo(ReadBackExit.Pass), report.Status); + Assert.That(Unexplained(report), Is.Empty, string.Join(" | ", Unexplained(report).Select(x => x.Key + " " + x.Outcome + " " + x.Reason))); + Assert.That(report.Unsupported, Is.Empty, string.Join(" | ", report.Unsupported)); + + Dictionary rows = LightingResults(run, TestSupport.Box, TestSupport.BoxSpace); + Assert.That(rows.Values.All(x => x.IsPass), Is.True, string.Join(" | ", rows.Select(x => x.Key + " " + x.Value.Outcome + " " + x.Value.Reason))); + Assert.That(rows["lighting.radiantTotal"].Input.Native.Value, Is.EqualTo(p).Within(OsQuantities.LightingFractionBoundary), "the writer's split sums to p within the floating-point boundary"); + } + + /// + /// Independent review of 31af6022: a native split shifted by 0.0004 per field is within the 0.001 tolerance of every + /// row, and the reviewed head accepted it (exit 12). On p = 1 it sums to 1.0008; on p = 0 Fraction Radiant is + /// -0.0004. The domain guard now fails every lighting row, named, before any tolerance is applied. + /// + [TestCase(1.0, "neg-lighting-sum-above-one", "exceeds 1")] + [TestCase(0.0, "neg-lighting-radiant-to-visible", "Fraction Radiant -0.0004 is outside [0, 1]")] + public void AnInvalidNativeSplit_FailsBeforeAnyTolerance(double p, string caseId, string fragment) + { + BoxWithP(p, out string source); + OsReport report = Mutated(source, caseId, out string run); + Assert.That(report.ExitCode, Is.EqualTo(ReadBackExit.Fail), report.Status); + + List lighting = report.NonPass.Where(x => x.Key.Contains(".ic.lighting.")).ToList(); + Assert.That(lighting.Select(x => x.Key).OrderBy(x => x), Is.EqualTo(LightingRows.Select(x => Ic(TestSupport.BoxSpace, x)).OrderBy(x => x))); + Assert.That(lighting.All(x => x.Outcome == "ExportDefect" && x.Status == "Fail" && x.Reason.Contains(fragment)), Is.True, string.Join(" | ", lighting.Select(x => x.Outcome + " " + x.Reason))); + Assert.That(report.NonPass.Where(x => x.Status == "Fail").All(x => x.Key.Contains(".ic.lighting.")), Is.True, "only the lighting rows fail"); + + Dictionary rows = LightingResults(run, TestSupport.Box, TestSupport.BoxSpace); + Assert.That(rows.Values.Any(x => x.IsPass), Is.False, "no lighting row is accepted"); + Assert.That(rows.Values.All(x => x.Comparison == null), Is.True, "no tolerance was applied"); + } + + /// + /// Independent review of 31af6022: with Return Air Fraction Calculated from Plenum Temperature = Yes the reviewed + /// head still accepted the static split (exit 12). Yes, an uninterpretable value and an unreadable field now block + /// technically (exit 11), named, with no lighting row accepted. + /// + [TestCase("neg-lighting-plenum-yes", "= Yes: the return-air share follows the plenum temperature at run time")] + [TestCase("neg-lighting-plenum-unknown", "= 'Maybe' is neither Yes nor No (uninterpretable)")] + [TestCase("neg-lighting-plenum-relabelled", "is unreadable")] + public void APlenumCalculatedOrUninterpretableReturnAir_BlocksTechnically(string caseId, string fragment) + { + OsReport report = Mutated(boxRun, caseId, out string run); + Assert.That(report.ExitCode, Is.EqualTo(ReadBackExit.BlockedTechnical), report.Status); + Assert.That(report.Consistency, Is.Empty, string.Join(" | ", report.Consistency)); + Assert.That(report.Unsupported.Single(), Does.StartWith("lighting: " + "space:" + TestSupport.BoxSpace.ToString("D") + ": Lights '").And.Contain(fragment)); + Assert.That(report.Required, Is.EqualTo(box.Required)); + + List lighting = report.NonPass.Where(x => x.Key.Contains(".ic.lighting.")).ToList(); + Assert.That(lighting.Select(x => x.Key).OrderBy(x => x), Is.EqualTo(LightingRows.Select(x => Ic(TestSupport.BoxSpace, x)).OrderBy(x => x))); + Assert.That(lighting.All(x => x.Outcome == "UnverifiedUnreadable" && x.Status == "BlockedTechnical" && x.Reason.Contains(fragment)), Is.True, string.Join(" | ", lighting.Select(x => x.Outcome + " " + x.Reason))); + Assert.That(LightingResults(run, TestSupport.Box, TestSupport.BoxSpace).Values.Any(x => x.IsPass), Is.False, "no lighting row is accepted"); + } + + /// The valid control: an explicit No (with coefficients, which EnergyPlus ignores under No) changes nothing. + [Test] + public void AnExplicitNoPlenumSetting_IsTheUnchangedControl() + { + OsReport report = Mutated(boxRun, "ctl-lighting-plenum-no", out string run); + Assert.That(report.Inputs["mutation"], Does.StartWith("ctl-lighting-plenum-no")); + Assert.That(report.ExitCode, Is.EqualTo(box.ExitCode)); + Assert.That(report.Unsupported, Is.Empty, string.Join(" | ", report.Unsupported)); + Assert.That(report.CountByOutcome, Is.EqualTo(box.CountByOutcome)); + Assert.That(Unexplained(report), Is.Empty); + + Dictionary baseline = LightingResults(boxRun, TestSupport.Box, TestSupport.BoxSpace); + Dictionary rows = LightingResults(run, TestSupport.Box, TestSupport.BoxSpace); + foreach (string row in LightingRows) + { + Assert.That(rows[row].Outcome, Is.EqualTo(baseline[row].Outcome), row); + } + } + + /// + /// S07 §5.2 (amendment U1): with the unused-face optics OUT-OF-ENGINE-SCOPE, every gated row of both fixtures is in + /// the PASS allow-list, so both PASS (exit 0) with complete coverage. This is scoped native-input conformance, not + /// simulation equivalence and not Phase B. + /// + [TestCase(TestSupport.Box, 319)] + [TestCase(TestSupport.Two, 592)] + public void BothFixtures_HaveCompleteCoverage_AndPassWithTheUnusedFaceRowsInformational(string fixtureId, int required) + { + OsReport report = fixtureId == TestSupport.Box ? box : two; + Assert.That(report.Schema, Is.EqualTo("s09-readback-report/3")); + Assert.That(report.Coverage, Is.EqualTo("Complete"), report.FixtureId); + Assert.That(report.Required, Is.EqualTo(required)); + Assert.That(report.Results, Is.EqualTo(required)); + Assert.That(report.MissingComparisons, Is.Empty, report.FixtureId); + Assert.That(report.Consistency, Is.Empty, report.FixtureId + ": " + string.Join(" | ", report.Consistency)); + Assert.That(report.FixtureCriteria, Is.Empty, report.FixtureId); + Assert.That(report.Unsupported, Is.Empty, report.FixtureId); + Assert.That(Unexplained(report), Is.Empty, report.FixtureId + ": " + string.Join(" | ", Unexplained(report).Select(x => x.Key + " " + x.Outcome + " " + x.Reason))); + Assert.That(report.GatedNonPass, Is.EqualTo(0)); + Assert.That(report.Status, Is.EqualTo(GateStatus.Pass.ToString()), report.FixtureId); + Assert.That(report.GateStatus, Is.EqualTo(GateStatus.Pass.ToString())); + Assert.That(report.ExitCode, Is.EqualTo(ReadBackExit.Pass)); + Assert.That(report.CountByOutcome.Keys, Has.No.Member("MappingDifference"), "the S09-only OS-MAT-SINGLE-SIDED listing is replaced by S07 §5.2"); + Assert.That(report.CountByOutcome.Values.Sum(), Is.EqualTo(report.Results), "every result is counted once"); + Assert.That(report.CountByOutcome[OsComparison.OutOfEngineScopeOutcome], Is.EqualTo(report.OutOfEngineScope.Count)); + Assert.That(report.Supporting.Single(x => x.StartsWith(OsComparison.OpaqueFaceScope + ":", StringComparison.Ordinal)), Does.Contain("OUT-OF-ENGINE-SCOPE (informational, not gated)").And.Contain("Every used face")); + Assert.That(report.Series.All(x => x.Count == 8760), Is.True, "every hourly series covers the year"); + } + + // ---- opaque face optics (revision 8) ------------------------------------------------------------------------- + + private static readonly string[] Optics = { "SolarReflectance", "LightReflectance", "Emissivity" }; + + /// + /// Each panel side's zone-face rows, derived here from the frozen fixture alone: SAM lists a construction inside → + /// outside from its first space in GetSpaces() order, so a side's innermost layer is SAM's first layer on the + /// first space's side (its internal face) and SAM's last layer on the other side (its external face). + /// + private static List ZoneFaceKeys(string fixtureId) + { + AnalyticalModel model = TestSupport.Load(fixtureId); + AdjacencyCluster cluster = model.AdjacencyCluster; + List spaces = cluster.GetSpaces(); + List result = new List(); + foreach (Panel panel in cluster.GetPanels()) + { + List related = cluster.GetRelatedObjects(panel).OrderBy(x => spaces.FindIndex(s => s.Guid == x.Guid)).ToList(); + int count = panel.Construction.ConstructionLayers.Count; + for (int i = 0; i < related.Count; i++) + { + string face = i == 0 ? "internal" : "external"; + result.AddRange(Optics.Select(x => "panel:" + panel.Guid.ToString("D") + "@space:" + related[i].Guid.ToString("D") + "#layer" + count + "." + face + x)); + } + } + + return result; + } + + /// Every 3a result of a run, recomputed in this process from the run's frozen model and the fresh-process snapshot. + private static Dictionary LayerResults(string run, string fixtureId) + { + AnalyticalModel model = Core.Convert.ToSAM(Path.Combine(run, "frozen-model.json")).Single(); + NativeSnapshot snapshot = NativeSnapshot.Load(Path.Combine(run, "native.json")); + OsComparison comparison = OsComparison.Run(model, snapshot, Path.Combine(run, "weather.epw"), fixtureId, GateRuleSet.Approved); + return comparison.Results.Where(x => x.Definition?.Id == "3a").ToDictionary(x => x.Input.ObjectKey, x => x); + } + + /// + /// Revision 8: every face whose optics EnergyPlus uses is now the authored one. Box: 6 zone faces; two-zone: 12 (zone + /// A sees SAM's internal faces, zone B the partition's external Timber face). The rows the writer could not write + /// before (18 / 33) all pass, and every remaining non-PASS row is on a face EnergyPlus does not use. + /// + [TestCase(TestSupport.Box, 18)] + [TestCase(TestSupport.Two, 36)] + public void EveryUsedZoneFace_HoldsTheAuthoredFace(string fixtureId, int rows) + { + List keys = ZoneFaceKeys(fixtureId); + Assert.That(keys.Count, Is.EqualTo(rows)); + Dictionary results = LayerResults(fixtureId == TestSupport.Box ? boxRun : twoRun, fixtureId); + foreach (string key in keys) + { + Assert.That(results.ContainsKey(key), Is.True, key); + Assert.That(results[key].IsPass, Is.True, key + ": " + results[key].Outcome + " " + results[key].Reason); + Assert.That(results[key].Input.Listing, Is.EqualTo(ContractListing.None), key + ": a used face is never a listed difference"); + Assert.That(results[key].GatesFixture, Is.True, key + ": a used face is never informational"); + } + + OsReport report = fixtureId == TestSupport.Box ? box : two; + Assert.That(report.NonPass.Select(x => x.Key).Intersect(keys), Is.Empty); + } + + /// + /// Review of 901e592a: Plasterboard's internal light reflectance unstated, absent or NaN. The writer writes the + /// external value on the zone face and reports it (SAM-OS-MAT-004); S09 keeps S-UNSPEC on exactly those zone-face + /// rows, never a match. S07 lists no default for an internal face, so a native value where SAM states none is an + /// EXPORT-DEFECT (FAIL) on exactly those rows: the inheritance is declared by the writer, not accepted by S07. + /// + [TestCase("absent")] + [TestCase("nan")] + public void AnUnstatedZoneFaceValue_KeepsItsUnspecifiedProvenance(string what) + { + AnalyticalModel model = TestSupport.Load(TestSupport.Box); + Core.MaterialLibrary materialLibrary = model.MaterialLibrary; + Core.OpaqueMaterial plasterboard = materialLibrary.GetMaterials().OfType().Single(x => x.Name == "FIX_Plasterboard"); + if (what == "nan") + { + plasterboard.SetValue(OpaqueMaterialParameter.InternalLightReflectance, double.NaN); + } + else + { + plasterboard.RemoveValue(OpaqueMaterialParameter.InternalLightReflectance); + } + + materialLibrary.Add(plasterboard); + model = new AnalyticalModel(model, model.AdjacencyCluster, materialLibrary, model.ProfileLibrary); + string label = "box-unstated-light-" + what; + OsReport report = TestSupport.Pipeline(TestSupport.Write(model, label), TestSupport.Box, label, out string run); + + Assert.That(report.Inputs["writerDiagnostics"], Does.Contain("Information SAM-OS-MAT-004 Zone face: InternalLightReflectance not stated")); + Dictionary results = LayerResults(run, TestSupport.Box); + List zoneLight = ZoneFaceKeys(TestSupport.Box).Where(x => x.EndsWith(".internalLightReflectance", StringComparison.Ordinal)).Select(x => results[x]).ToList(); + List unstated = zoneLight.Where(x => x.Input.Expected.State == SamInputState.Unspecified).ToList(); + Assert.That(unstated.Count, Is.EqualTo(5), "the four walls and the roof have Plasterboard on the zone face; the floor has Screed"); + Assert.That(unstated.All(x => !x.IsPass && x.Outcome == EquivalenceOutcome.ExportDefect), Is.True, string.Join(" | ", unstated.Select(x => x.Input.ObjectKey + " " + x.Outcome))); + Assert.That(zoneLight.Except(unstated).All(x => x.IsPass), Is.True, "the Screed zone face is unaffected"); + + Assert.That(report.ExitCode, Is.EqualTo(ReadBackExit.Fail), report.Status); + List failed = report.NonPass.Where(x => x.Status == GateStatus.Fail.ToString()).ToList(); + Assert.That(failed.Select(x => x.Key).OrderBy(x => x), Is.EqualTo(unstated.Select(x => x.Input.ObjectKey).OrderBy(x => x)), "exactly the unstated zone-face rows fail"); + Assert.That(failed.All(x => x.Reason.Contains("S-UNSPEC")), Is.True); + } + + /// A copy of a fixture run whose IDF is changed by , read and compared fresh. + private static OsReport MutatedIdf(string source, string fixtureId, string label, Func mutate) + { + string run = TestSupport.NewDirectory(label); + Directory.CreateDirectory(run); + foreach (string file in new[] { "frozen-model.json", "weather.epw", "model.osm", "in.idf", "export.json" }) + { + File.Copy(Path.Combine(source, file), Path.Combine(run, file)); + } + + string idfPath = Path.Combine(run, "in.idf"); + string idf = File.ReadAllText(idfPath); + string mutated = mutate(idf, TestSupport.Load(fixtureId)); + Assert.That(mutated, Is.Not.EqualTo(idf), "the mutation applied"); + File.WriteAllText(idfPath, mutated); + ExportManifest manifest = ExportManifest.Load(Path.Combine(run, "export.json")); + manifest.Mutation = "test: " + label; + manifest.IdfSha256 = Hashing.Sha256(idfPath); + manifest.Save(Path.Combine(run, "export.json")); + return TestSupport.ReadAndCompare(run, fixtureId); + } + + /// + /// Swapped-face regression: each zone-face variant given its material's external-face optics, which is what the + /// writer wrote before revision 8 (and what a selector choosing the wrong face would write). The external values + /// come from the frozen model, never from the writer. Exactly the zone-face rows SAM needs internal FAIL. + /// + [TestCase(TestSupport.Box, 18)] + [TestCase(TestSupport.Two, 33)] + public void ASwappedZoneFace_Fails_OnExactlyTheZoneFaceRows(string fixtureId, int failingRows) + { + OsReport report = MutatedIdf(fixtureId == TestSupport.Box ? boxRun : twoRun, fixtureId, "swapped-zone-face-" + fixtureId, (idf, model) => + { + foreach (IdfObject variant in IdfText.Parse(idf).Where(x => x.Type == "Material" && x.Name.Contains("_Internal"))) + { + Core.OpaqueMaterial material = model.MaterialLibrary.GetMaterials().OfType().Single(x => variant.Name.Contains("_" + x.Name + "_")); + material.TryGetValue(OpaqueMaterialParameter.ExternalEmissivity, out double emissivity); + material.TryGetValue(OpaqueMaterialParameter.ExternalSolarReflectance, out double solar); + material.TryGetValue(OpaqueMaterialParameter.ExternalLightReflectance, out double light); + idf = Cli.Negative.SetField(idf, "Material", variant.Name, "Thermal Absorptance", emissivity.ToString("R", System.Globalization.CultureInfo.InvariantCulture)); + idf = Cli.Negative.SetField(idf, "Material", variant.Name, "Solar Absorptance", (1 - solar).ToString("R", System.Globalization.CultureInfo.InvariantCulture)); + idf = Cli.Negative.SetField(idf, "Material", variant.Name, "Visible Absorptance", (1 - light).ToString("R", System.Globalization.CultureInfo.InvariantCulture)); + } + + return idf; + }); + + Assert.That(report.ExitCode, Is.EqualTo(ReadBackExit.Fail), report.Status); + List failed = report.NonPass.Where(x => x.Status == GateStatus.Fail.ToString()).ToList(); + List zoneFaces = ZoneFaceKeys(fixtureId); + Assert.That(failed.Count, Is.EqualTo(failingRows), string.Join(" | ", failed.Select(x => x.Key))); + Assert.That(failed.All(x => x.Quantity == "3a" && zoneFaces.Contains(x.Key) && x.Key.Contains(".internal")), Is.True, string.Join(" | ", failed.Select(x => x.Key + " " + x.Reason))); + Assert.That(report.Consistency, Is.Empty); + } + + /// A wrong opaque optical value that is neither authored face is never explained as the single-sided difference. + [Test] + public void AWrongOpaqueOpticalValue_Fails() + { + OsReport report = MutatedIdf(boxRun, TestSupport.Box, "box-plasterboard-absorptance", (idf, model) => + { + IdfObject plasterboard = IdfText.Parse(idf).First(x => x.Type == "Material" && x.Name.Contains("Plasterboard")); + return Cli.Negative.SetField(idf, "Material", plasterboard.Name, "Solar Absorptance", "0.5"); + }); + + Assert.That(report.ExitCode, Is.EqualTo(ReadBackExit.Fail), report.Status); + List failed = report.NonPass.Where(x => x.Status == GateStatus.Fail.ToString()).ToList(); + Assert.That(failed, Is.Not.Empty); + Assert.That(failed.All(x => x.Quantity == "3a" && x.Key.Contains("SolarReflectance")), Is.True, string.Join(" | ", failed.Select(x => x.Key + " " + x.Reason))); + } + + /// + /// The box with its ground floor built as one Screed layer (faces differ): only the zone face is used, so the writer + /// uses the internal face and S09 compares it exactly; its outer face is the ground surface outer face (S07 §5.2). + /// + [Test] + public void ASingleLayerGroundFloor_UsesItsZoneFace() + { + OsReport report = BoxWithSingleLayer(PanelType.SlabOnGrade, "FIX_Screed", 0.065, "box-single-floor", out string run); + Assert.That(report.Inputs["writerDiagnostics"], Does.Not.Contain("SAM-OS-MAT-003")); + Assert.That(report.Unsupported, Is.Empty, string.Join(" | ", report.Unsupported)); + Assert.That(report.NonPass, Is.Empty, string.Join(" | ", report.NonPass.Select(x => x.Key + " " + x.Reason))); + Assert.That(report.ExitCode, Is.EqualTo(ReadBackExit.Pass), report.Status); + List floor = report.OutOfEngineScope.Rows.Where(x => x.LayerCount == 1).ToList(); + Assert.That(floor.Select(x => x.Property).OrderBy(x => x), Is.EqualTo(new[] { "externalEmissivity", "externalLightReflectance", "externalSolarReflectance" }), "the single layer's outer face only"); + Assert.That(floor.All(x => x.ScopeReason == "ground surface outer face" && x.SamMaterial == "FIX_Screed" && x.Differs), Is.True, string.Join(" | ", floor.Select(x => x.Key + " " + x.ScopeReason))); + } + + /// The box with its roof built as one Plasterboard layer (faces differ): the writer refuses it (SAM-OS-MAT-003) and S09 names it as unsupported; never PASS. + [Test] + public void ASingleLayerOutdoorRoof_IsRefused_AndNamedUnsupported() + { + OsReport report = BoxWithSingleLayer(PanelType.Roof, "FIX_Plasterboard", 0.015, "box-single-roof", out string run); + Assert.That(report.Inputs["writerDiagnostics"], Does.Contain("Error SAM-OS-MAT-003")); + Assert.That(report.Unsupported.Count(x => x.StartsWith("optics: ", StringComparison.Ordinal) && x.Contains("single-layer construction")), Is.EqualTo(1), string.Join(" | ", report.Unsupported)); + Assert.That(report.ExitCode, Is.AnyOf(ReadBackExit.Fail, ReadBackExit.BlockedTechnical), report.Status); + } + + private static OsReport BoxWithSingleLayer(PanelType panelType, string materialName, double thickness, string label, out string run) + { + AnalyticalModel model = TestSupport.Load(TestSupport.Box); + Construction construction = new Construction(Guid.NewGuid(), "S09_SINGLE_" + materialName, new List { new ConstructionLayer(materialName, thickness) }); + AdjacencyCluster cluster = model.AdjacencyCluster; + Panel panel = cluster.GetPanels().Single(x => x.PanelType == panelType); + Assert.That(cluster.AddObject(Analytical.Create.Panel(panel, construction)), Is.True); + model = new AnalyticalModel(model, cluster); + Assert.That(model.AdjacencyCluster.GetPanels().Single(x => x.Guid == panel.Guid).Construction.Name, Is.EqualTo(construction.Name), "the panel carries the single-layer construction"); + return TestSupport.Pipeline(TestSupport.Write(model, label), TestSupport.Box, label, out run); + } + + [Test] + public void V2Box_DeliversTheRequirementTimesTheProfile_EveryHour() + { + Assert.That(box.VentilationStates.Values.Single(), Is.EqualTo("V2")); + SeriesSummary delivered = box.Series.Single(x => x.Key == Ic(TestSupport.BoxSpace, "ventilation.delivered")); + Assert.That(delivered.NotPass, Is.EqualTo(0), delivered.FirstNotPass); + Assert.That(delivered.Outcome, Is.AnyOf("Match", "WithinTolerance")); + Assert.That(box.NonPass.Any(x => x.Quantity == "8a" || x.Quantity == "8b" || x.Key.Contains("schedule.ventilation")), Is.False); + } + + [Test] + public void V1TwoZones_KeepTheirRequirement_AndDeliverNothing_UnderTheVerifiedInactiveTransformation() + { + foreach (Guid space in new[] { TestSupport.SpaceA, TestSupport.SpaceB }) + { + Assert.That(two.VentilationStates["space:" + space.ToString("D")], Is.EqualTo("V1")); + Assert.That(two.Supporting.Single(x => x.StartsWith("space:" + space.ToString("D") + ": " + OsComparison.InactiveVentilation, StringComparison.Ordinal)), Does.Contain(" applied")); + Assert.That(two.Series.Single(x => x.Key == Ic(space, "ventilation.delivered")).Outcome, Is.EqualTo("AcceptedTransformation")); + } + + Assert.That(two.CountByOutcome["AcceptedTransformation"], Is.EqualTo(14), "8b, 6.hourly and 6.eflh of the two V1 zones (6), and the four T-LIGHT-SPLIT rows of each zone (8)"); + Assert.That(two.NonPass.Any(x => x.Quantity == "8a"), Is.False, "the requirement is read back and matches"); + } + + [Test] + public void V2ChangedBackToV1_ReadsBackAsNoDelivery() + { + AnalyticalModel model = TestSupport.Load(TestSupport.Box); + TestSupport.ChangeCondition(model, TestSupport.BoxSpace, ic => ic.RemoveValue(InternalConditionParameter.VentilationProfileName)); + OsReport report = TestSupport.Pipeline(TestSupport.Write(model, "box-v1"), "box-v1", "box-v1", out string _); + Assert.That(report.VentilationStates.Values.Single(), Is.EqualTo("V1")); + Assert.That(report.Series.Single(x => x.Key == Ic(TestSupport.BoxSpace, "ventilation.delivered")).Outcome, Is.EqualTo("AcceptedTransformation")); + Assert.That(Unexplained(report), Is.Empty, string.Join(" | ", Unexplained(report).Select(x => x.Key + " " + x.Reason))); + } + + [TestCase("missing")] + [TestCase("wrong-type")] + public void ASelectionThatDoesNotResolve_IsAnInvalidInput_NeverInactive(string what) + { + AnalyticalModel model = TestSupport.Load(TestSupport.Box); + TestSupport.ChangeCondition(model, TestSupport.BoxSpace, ic => ic.SetProfileName(ProfileType.Ventilation, what == "missing" ? "s09-missing" : ic.GetProfileName(ProfileType.Occupancy))); + OsReport report = TestSupport.Pipeline(TestSupport.Write(model, "box-" + what), "box-" + what, "box-" + what, out string _); + Assert.That(report.ExitCode, Is.EqualTo(ReadBackExit.BlockedTechnical), what + ": " + report.Status); + ReportItem delivered = report.NonPass.Single(x => x.Key == Ic(TestSupport.BoxSpace, "ventilation.delivered")); + Assert.That(delivered.Outcome, Is.EqualTo("InputInvalid"), delivered.Reason); + Assert.That(report.Supporting.Any(x => x.Contains(OsComparison.InactiveVentilation + " applied")), Is.False, "a selection is never exempted as inactive"); + Assert.That(report.VentilationStates.Values.Single(), Does.EndWith("INVALID selection")); + } + + [Test] + public void TheSpaceOverride_IsTheRequirement_AndIsDeliveredByTheSelectedProfile() + { + AnalyticalModel model = TestSupport.Load(TestSupport.Box); + TestSupport.ChangeSpace(model, TestSupport.BoxSpace, space => space.SetValue(SpaceParameter.OutsideSupplyAirFlow, 0.05)); + OsReport report = TestSupport.Pipeline(TestSupport.Write(model, "box-override"), "box-override", "box-override", out string _); + Assert.That(report.VentilationStates.Values.Single(), Does.StartWith("V2 (per-space OutsideSupplyAirFlow 0.05")); + Assert.That(report.Supporting.Any(x => x.Contains("set on the space (per-space override)")), Is.True); + Assert.That(report.Series.Single(x => x.Key == Ic(TestSupport.BoxSpace, "ventilation.delivered")).NotPass, Is.EqualTo(0)); + Assert.That(Unexplained(report), Is.Empty, string.Join(" | ", Unexplained(report).Select(x => x.Key + " " + x.Reason))); + } + + [TestCase("neg-identity-swap-names", TestSupport.Two)] + [TestCase("neg-schedule-swap", TestSupport.Box)] + [TestCase("neg-v1-unscheduled", TestSupport.Two)] + [TestCase("neg-missing-dsoa-link", TestSupport.Box)] + [TestCase("neg-missing-schedule-object", TestSupport.Box)] + [TestCase("neg-people-density", TestSupport.Box)] + [TestCase("neg-layer-conductivity", TestSupport.Two)] + [TestCase("neg-osm-dsoa-schedule", TestSupport.Box)] + [TestCase("neg-zone-multiplier", TestSupport.Box)] + [TestCase("neg-window-multiplier", TestSupport.Box)] + [TestCase("neg-north-axis", TestSupport.Box)] + [TestCase("neg-zone-multiplier-both", TestSupport.Box)] + [TestCase("neg-window-multiplier-both", TestSupport.Box)] + [TestCase("neg-north-axis-both", TestSupport.Box)] + [TestCase("neg-zone-multiplier", TestSupport.Two)] + [TestCase("neg-window-multiplier", TestSupport.Two)] + [TestCase("neg-north-axis", TestSupport.Two)] + public void EveryTargetedMutation_Fails(string caseId, string fixture) + { + string source = fixture == TestSupport.Box ? boxRun : twoRun; + string run = TestSupport.NewDirectory(caseId); + Assert.That(TestSupport.Cli(out string output, "negative", "--run", source, "--case", caseId, "--out", run), Is.EqualTo(0), output); + OsReport report = TestSupport.ReadAndCompare(run, fixture); + Assert.That(report.ExitCode, Is.EqualTo(ReadBackExit.Fail), caseId + ": " + report.Status + " " + string.Join(" | ", report.NonPass.Where(x => x.Status != "BlockedOwnerDecision").Take(3).Select(x => x.Key + " " + x.Reason))); + Assert.That(report.Inputs["mutation"], Does.StartWith(caseId)); + } + + /// + /// The reviewed head (d6d1cc5b) left these reports unchanged (BLOCKED owner, exit 12). With the OSM made to agree, + /// no OSM/IDF disagreement is left to catch them: the refusal must come from the check against SAM intent. + /// + [TestCase("neg-zone-multiplier-both", "multiplicity: IDF Zone '", "Multiplier 2")] + [TestCase("neg-window-multiplier-both", "multiplicity: IDF FenestrationSurface:Detailed '", "Multiplier 2")] + [TestCase("neg-north-axis-both", "orientation: Zone '", "is rotated by 90 deg")] + public void MultiplicityAndOrientation_AreRefusedAgainstSamIntent(string caseId, string prefix, string fragment) + { + string run = TestSupport.NewDirectory(caseId); + Assert.That(TestSupport.Cli(out string output, "negative", "--run", boxRun, "--case", caseId, "--out", run), Is.EqualTo(0), output); + OsReport report = TestSupport.ReadAndCompare(run, TestSupport.Box); + Assert.That(report.ExitCode, Is.EqualTo(ReadBackExit.Fail), report.Status); + Assert.That(report.Consistency, Is.Not.Empty); + Assert.That(report.Consistency.All(x => x.StartsWith(prefix, StringComparison.Ordinal) && x.Contains(fragment) && x.Contains("SAM states")), Is.True, string.Join(" | ", report.Consistency)); + Assert.That(report.Required, Is.EqualTo(box.Required), "coverage is unchanged; the verdict changes"); + } + + /// + /// The reviewed head (6f7e6b7d) skipped the OSM/IDF multiplier check when the IDF object had no OSM object of its + /// name, and kept BLOCKED owner, exit 12, with complete coverage. A proven missing counterpart is now an OSM/IDF + /// disagreement (FAIL), on both fixtures; coverage is unchanged and nothing else is reported. + /// + [TestCase("neg-osm-missing-thermal-zone", TestSupport.Box, "multiplicity: IDF Zone '", "has no OS:ThermalZone in the OSM")] + [TestCase("neg-osm-missing-thermal-zone", TestSupport.Two, "multiplicity: IDF Zone '", "has no OS:ThermalZone in the OSM")] + [TestCase("neg-osm-missing-subsurfaces", TestSupport.Box, "multiplicity: IDF FenestrationSurface:Detailed '", "has no OS:SubSurface in the OSM")] + [TestCase("neg-osm-missing-subsurfaces", TestSupport.Two, "multiplicity: IDF FenestrationSurface:Detailed '", "has no OS:SubSurface in the OSM")] + public void AMissingOsmCounterpart_FailsAsAnOsmIdfDisagreement(string caseId, string fixture, string prefix, string fragment) + { + OsReport original = fixture == TestSupport.Box ? box : two; + string run = TestSupport.NewDirectory(caseId); + Assert.That(TestSupport.Cli(out string output, "negative", "--run", fixture == TestSupport.Box ? boxRun : twoRun, "--case", caseId, "--out", run), Is.EqualTo(0), output); + OsReport report = TestSupport.ReadAndCompare(run, fixture); + Assert.That(report.ExitCode, Is.EqualTo(ReadBackExit.Fail), report.Status + " " + string.Join(" | ", report.Consistency.Concat(report.Unsupported))); + Assert.That(report.Consistency, Is.Not.Empty); + Assert.That(report.Consistency.All(x => x.StartsWith(prefix, StringComparison.Ordinal) && x.Contains(fragment)), Is.True, string.Join(" | ", report.Consistency)); + Assert.That(report.Unsupported, Is.Empty, string.Join(" | ", report.Unsupported)); + Assert.That(report.Coverage, Is.EqualTo("Complete")); + Assert.That(report.Required, Is.EqualTo(original.Required), "coverage is unchanged; the verdict changes"); + Assert.That(report.Supporting.Single(x => x.StartsWith("multiplicity:", StringComparison.Ordinal)), Does.Not.Contain("as SAM states")); + } + + /// Both fixtures: every IDF zone and subsurface has exactly one OSM object of its name, whose blank Multiplier is the documented default 1. + [Test] + public void BothFixtures_MatchEachIdfZoneAndSubsurfaceToOneOsmObject() + { + Assert.That(box.Supporting.Single(x => x.StartsWith("multiplicity:", StringComparison.Ordinal)), Does.StartWith("multiplicity: 1 IDF zone(s) (1 with their OS:ThermalZone), 0 ZoneGroup(s), 2 IDF subsurface(s) (2 with their OS:SubSurface) read")); + Assert.That(two.Supporting.Single(x => x.StartsWith("multiplicity:", StringComparison.Ordinal)), Does.StartWith("multiplicity: 2 IDF zone(s) (2 with their OS:ThermalZone), 0 ZoneGroup(s), 1 IDF subsurface(s) (1 with their OS:SubSurface) read")); + } + + /// + /// Multiplicity or orientation the reader cannot interpret blocks the fixture (BLOCKED technical, exit 11), never + /// PASS and never assumed. This includes an OSM counterpart whose identity is ambiguous or unreadable, and an OSM + /// Multiplier field the file labels otherwise (an unknown layout, never read as the default). + /// + [TestCase("zone-multiplier-1.5")] + [TestCase("north-axis-text")] + [TestCase("coordinate-system-unknown")] + [TestCase("world-with-north-axis")] + [TestCase("osm-thermal-zone-duplicated")] + [TestCase("osm-thermal-zone-name-unlabelled")] + [TestCase("osm-subsurface-multiplier-relabelled")] + public void UninterpretableMultiplicityOrOrientation_BlocksTechnical(string what) + { + string run = TestSupport.NewDirectory("unsupported-" + what); + Directory.CreateDirectory(run); + foreach (string file in new[] { "frozen-model.json", "weather.epw", "model.osm", "in.idf", "export.json" }) + { + File.Copy(Path.Combine(boxRun, file), Path.Combine(run, file)); + } + + string idfPath = Path.Combine(run, "in.idf"), osmPath = Path.Combine(run, "model.osm"); + string idf = File.ReadAllText(idfPath), osm = File.ReadAllText(osmPath); + List objects = IdfText.Parse(idf); + string zone = objects.First(x => x.Type == "Zone").Name; + string building = objects.First(x => x.Type == "Building").Name; + const string coordinateSystem = @"Relative(,\s*!- Coordinate System)"; + switch (what) + { + case "zone-multiplier-1.5": + idf = Cli.Negative.SetField(idf, "Zone", zone, "Multiplier", "1.5"); + break; + case "north-axis-text": + idf = Cli.Negative.SetField(idf, "Building", building, "North Axis", "east"); + break; + case "coordinate-system-unknown": + idf = Regex.Replace(idf, coordinateSystem, "Sideways$1"); + break; + case "world-with-north-axis": + idf = Regex.Replace(idf, coordinateSystem, "World$1"); + idf = Cli.Negative.SetField(idf, "Building", building, "North Axis", "90"); + osm = Cli.Negative.SetField(osm, "OS:Building", IdfText.Parse(osm).First(x => x.Type == "OS:Building").Value(1), "North Axis", "90", true); + break; + case "osm-thermal-zone-duplicated": + { + // A second OS:ThermalZone of the same name (a new handle): the counterpart is ambiguous. + int start = osm.IndexOf("OS:ThermalZone,", StringComparison.Ordinal); + int end = osm.IndexOf('\n', osm.IndexOf(';', start)) + 1; + string copy = new Regex(@"\{[0-9a-f-]{36}\}").Replace(osm.Substring(start, end - start), "{00000000-0000-0000-0000-0000000000a1}", 1); + osm = osm.Insert(start, copy + (osm.Contains("\r\n") ? "\r\n" : "\n")); + break; + } + case "osm-thermal-zone-name-unlabelled": + osm = new Regex(@"(OS:ThermalZone,\r?\n[^\r\n]*\r?\n[^!\r\n]*)!- Name").Replace(osm, "$1!- Zone Label", 1); + break; + case "osm-subsurface-multiplier-relabelled": + osm = new Regex(@"(OS:SubSurface,[^;]*?)!- Multiplier").Replace(osm, "$1!- Copies", 1); + break; + } + + Assert.That(idf + osm, Is.Not.EqualTo(File.ReadAllText(idfPath) + File.ReadAllText(osmPath)), "the mutation applied"); + File.WriteAllText(idfPath, idf); + File.WriteAllText(osmPath, osm); + ExportManifest manifest = ExportManifest.Load(Path.Combine(run, "export.json")); + manifest.Mutation = "test: " + what; + manifest.IdfSha256 = Hashing.Sha256(idfPath); + manifest.OsmSha256 = Hashing.Sha256(osmPath); + manifest.Save(Path.Combine(run, "export.json")); + + OsReport report = TestSupport.ReadAndCompare(run, TestSupport.Box); + Assert.That(report.ExitCode, Is.EqualTo(ReadBackExit.BlockedTechnical), what + ": " + report.Status + " " + string.Join(" | ", report.Consistency.Concat(report.Unsupported))); + Assert.That(report.Consistency, Is.Empty, string.Join(" | ", report.Consistency)); + Assert.That(report.Unsupported, Is.Not.Empty); + } + + [Test] + public void BothFixtures_AreUnrotatedAndSingleCopy_AsSamStates() + { + foreach (OsReport report in new[] { box, two }) + { + Assert.That(report.Unsupported, Is.Empty, report.FixtureId + ": " + string.Join(" | ", report.Unsupported)); + Assert.That(report.Supporting.Single(x => x.StartsWith("orientation:", StringComparison.Ordinal)), Does.EndWith("the native building is unrotated, as SAM states")); + Assert.That(report.Supporting.Single(x => x.StartsWith("multiplicity:", StringComparison.Ordinal)), Does.EndWith("every effective multiplier is 1, as SAM states")); + } + } + + /// A negative copy of the box run, read in a fresh process; the copy keeps the original export's identity. + private string ReadNegative(string caseId, out ExportManifest manifest, out NativeSnapshot snapshot) + { + string run = TestSupport.NewDirectory(caseId); + Assert.That(TestSupport.Cli(out string output, "negative", "--run", boxRun, "--case", caseId, "--out", run), Is.EqualTo(0), output); + Assert.That(TestSupport.Cli(out string read, "read", "--run", run), Is.EqualTo(0), read); + manifest = ExportManifest.Load(Path.Combine(run, "export.json")); + snapshot = NativeSnapshot.Load(Path.Combine(run, "native.json")); + Assert.That(ProcessIdentity.IsRecorded(manifest.ProcessId, manifest.ProcessStartedUtc) && ProcessIdentity.IsRecorded(snapshot.ProcessId, snapshot.ProcessStartedUtc), Is.True, "both identities are recorded"); + return run; + } + + /// + /// Build 39603021836 (head e0a6ea19): compare wrote no report for one negative. Windows reuses the id of an exited + /// process, and a negative copy keeps the id of an export that exited long before, so a fresh reader can carry it; + /// the reviewed head refused that (exit 70, no report). Reproduced by giving the copy's export the reader's id: the + /// reader is still a different process (another creation time, started after the export finished) and is judged. + /// + [Test] + public void AReusedProcessId_IsNotTheExportProcess() + { + string run = ReadNegative("neg-people-density", out ExportManifest manifest, out NativeSnapshot snapshot); + manifest.ProcessId = snapshot.ProcessId; + manifest.Save(Path.Combine(run, "export.json")); + + int exit = TestSupport.Compare(run, TestSupport.Box, out string output); + Assert.That(exit, Is.EqualTo(ReadBackExit.Fail), () => TestSupport.Evidence(run, "compare", exit, output)); + OsReport report = OsReport.Load(Path.Combine(run, "compare-approved", "report.json")); + Assert.That(report.Inputs["exportPid"], Is.EqualTo(report.Inputs["readerPid"]), "the id is shared"); + Assert.That(report.Inputs["exportProcessStartedUtc"], Is.Not.EqualTo(report.Inputs["readerProcessStartedUtc"]), "the processes are not"); + Assert.That(report.Inputs["mutation"], Does.StartWith("neg-people-density")); + } + + /// A read not proven to be a fresh process after the export is still an infrastructure failure (exit 70, no report). + [TestCase("same-process")] + [TestCase("identity-not-recorded")] + [TestCase("read-before-the-export-finished")] + public void AReadNotProvenFresh_IsAnInfrastructureFailure(string what) + { + string run = ReadNegative("neg-people-density", out ExportManifest manifest, out NativeSnapshot snapshot); + string expected = "the reader did not run in a fresh process after the export"; + switch (what) + { + case "same-process": + manifest.ProcessId = snapshot.ProcessId; + manifest.ProcessStartedUtc = snapshot.ProcessStartedUtc; + break; + case "identity-not-recorded": + manifest.ProcessStartedUtc = default; + expected = "the export or reader process identity is not recorded"; + break; + case "read-before-the-export-finished": + manifest.FinishedUtc = snapshot.StartedUtc; + break; + } + + manifest.Save(Path.Combine(run, "export.json")); + int exit = TestSupport.Compare(run, TestSupport.Box, out string output); + Assert.That(exit, Is.EqualTo(ReadBackExit.Infrastructure), what + ": " + output); + Assert.That(output, Does.Contain("infrastructure: " + expected), what); + Assert.That(Directory.Exists(Path.Combine(run, "compare-approved")), Is.False, "no report"); + } + + [Test] + public void TheOriginalRuns_AreUnchangedByTheNegatives() + { + foreach (string run in new[] { boxRun, twoRun }) + { + ExportManifest manifest = ExportManifest.Load(Path.Combine(run, "export.json")); + Assert.That(Hashing.Sha256(Path.Combine(run, "in.idf")), Is.EqualTo(manifest.IdfSha256)); + Assert.That(Hashing.Sha256(Path.Combine(run, "model.osm")), Is.EqualTo(manifest.OsmSha256)); + Assert.That(manifest.Mutation, Is.Null); + } + } + } +} diff --git a/benchmark/SAM.Analytical.OpenStudio.InputReadBack.Tests/SAM.Analytical.OpenStudio.InputReadBack.Tests.csproj b/benchmark/SAM.Analytical.OpenStudio.InputReadBack.Tests/SAM.Analytical.OpenStudio.InputReadBack.Tests.csproj new file mode 100644 index 0000000..9080740 --- /dev/null +++ b/benchmark/SAM.Analytical.OpenStudio.InputReadBack.Tests/SAM.Analytical.OpenStudio.InputReadBack.Tests.csproj @@ -0,0 +1,54 @@ + + + + net8.0 + Library + false + x64 + x64 + x64 + latest + disable + disable + + + + + + + + + + + + + + + + + + + + + + ..\..\..\SAM\build\SAM.Core.dll + + + ..\..\..\SAM\build\SAM.Geometry.dll + + + ..\..\..\SAM\build\SAM.Analytical.dll + + + ..\..\..\SAM\build\SAM.Architectural.dll + + + ..\..\..\SAM\build\SAM.Weather.dll + + + + diff --git a/benchmark/SAM.Analytical.OpenStudio.InputReadBack.Tests/TestSupport.cs b/benchmark/SAM.Analytical.OpenStudio.InputReadBack.Tests/TestSupport.cs new file mode 100644 index 0000000..eef7821 --- /dev/null +++ b/benchmark/SAM.Analytical.OpenStudio.InputReadBack.Tests/TestSupport.cs @@ -0,0 +1,198 @@ +// SPDX-License-Identifier: LGPL-3.0-or-later +// Copyright (c) 2020–2026 Michal Dengusiak & Jakub Ziolkowski and contributors + +using NUnit.Framework; +using System; +using System.Diagnostics; +using System.Globalization; +using System.IO; +using System.IO.Compression; +using System.Linq; +using System.Text; + +namespace SAM.Analytical.OpenStudio.InputReadBack.Tests +{ + internal static class TestSupport + { + public const string Box = "s08-fix-box"; + public const string Two = "s08-fix-two"; + public const string BoxSha256 = "45524172b32f85df89511dd344141023de999faa9552a199e6b49062612acd08"; + public const string TwoSha256 = "20da9b586345e9fc67dc6308e6da1578b9bc41b3c694dbdab37e9c677959baa0"; + public const string BudapestSha256 = "472ffb4e2f10867600949a392ce46891fc1bd05f2fc8d8917a99bca7d26209c3"; + + public static readonly Guid BoxSpace = Guid.Parse("5080c000-0000-0000-0000-00000000c001"); + public static readonly Guid SpaceA = Guid.Parse("5080c000-0000-0000-0000-00000000c0a1"); + public static readonly Guid SpaceB = Guid.Parse("5080c000-0000-0000-0000-00000000c0b1"); + + public static string Fixture(string id) + { + string path = Path.Combine(TestContext.CurrentContext.TestDirectory, "Fixtures", id + ".json"); + Assert.That(File.Exists(path), Is.True, "fixture missing: " + path); + return path; + } + + public static AnalyticalModel Load(string id) + { + return Core.Convert.ToSAM(Fixture(id)).Single(); + } + + /// The SAM#212 Budapest TMYx EPW from the sibling SAM checkout, decompressed once and checked against the S05/S08 hash. + public static string Budapest() + { + string target = Path.Combine(TestContext.CurrentContext.WorkDirectory, "s09-weather", "budapest.epw"); + if (!File.Exists(target)) + { + DirectoryInfo directory = new DirectoryInfo(TestContext.CurrentContext.TestDirectory); + string source = null; + while (directory != null && source == null) + { + string candidate = Path.Combine(directory.FullName, "SAM", "SAM", "SAM.Tests", "Resources", "Weather", "HUN_BU_Budapest.Met.Center.128400_TMYx.epw.gz"); + source = File.Exists(candidate) ? candidate : null; + directory = directory.Parent; + } + + Assert.That(source, Is.Not.Null, "the sibling SAM checkout with the SAM#212 weather files was not found"); + Directory.CreateDirectory(Path.GetDirectoryName(target)); + using (FileStream input = File.OpenRead(source)) + using (GZipStream gzip = new GZipStream(input, CompressionMode.Decompress)) + using (FileStream output = File.Create(target)) + { + gzip.CopyTo(output); + } + } + + Assert.That(Hashing.Sha256(target), Is.EqualTo(BudapestSha256), "the Budapest EPW is not the S05/S08 file"); + return target; + } + + public static string NewDirectory(string name) + { + string path = Path.Combine(TestContext.CurrentContext.WorkDirectory, "s09-runs", name + "-" + Guid.NewGuid().ToString("N").Substring(0, 6)); + return path; + } + + /// Runs os-input-readback in its own process; returns the exit code, with its labelled stdout and stderr in output. + public static int Cli(out string output, params string[] arguments) + { + string exe = Path.Combine(TestContext.CurrentContext.TestDirectory, "os-input-readback.exe"); + Assert.That(File.Exists(exe), Is.True, exe); + ProcessStartInfo info = new ProcessStartInfo(exe) + { + UseShellExecute = false, + RedirectStandardOutput = true, + RedirectStandardError = true, + WorkingDirectory = TestContext.CurrentContext.TestDirectory + }; + + foreach (string argument in arguments) + { + info.ArgumentList.Add(argument); + } + + using (Process process = Process.Start(info)) + { + System.Threading.Tasks.Task error = process.StandardError.ReadToEndAsync(); + output = process.StandardOutput.ReadToEnd(); + process.WaitForExit(); + output = "[stdout]" + Environment.NewLine + output + "[stderr]" + Environment.NewLine + error.Result; + return process.ExitCode; + } + } + + /// export, read and compare (approved rules), each in a fresh process. Returns the report. + public static OsReport Pipeline(string modelPath, string fixtureId, string label, out string run) + { + run = NewDirectory(label); + Assert.That(Cli(out string export, "export", "--model", modelPath, "--epw", Budapest(), "--out", run, "--label", label), Is.EqualTo(0), export); + return ReadAndCompare(run, fixtureId); + } + + public static OsReport ReadAndCompare(string run, string fixtureId) + { + int read = Cli(out string readOutput, "read", "--run", run); + Assert.That(read, Is.EqualTo(0), () => Evidence(run, "read", read, readOutput)); + int exit = Compare(run, fixtureId, out string compare); + string reportPath = Path.Combine(run, "compare-approved", "report.json"); + Assert.That(File.Exists(reportPath), Is.True, () => Evidence(run, "compare", exit, compare) + Environment.NewLine + "no report was written: " + reportPath); + OsReport report = OsReport.Load(reportPath); + Assert.That(exit, Is.EqualTo(report.ExitCode), () => Evidence(run, "compare", exit, compare)); + return report; + } + + /// compare (approved rules) in a fresh process, writing to compare-approved; returns the exit code. + public static int Compare(string run, string fixtureId, out string output) + { + return Cli(out output, "compare", "--run", run, "--fixture-id", fixtureId, "--rule-set", "approved", "--out", Path.Combine(run, "compare-approved")); + } + + /// + /// A failed CLI step: its exit code and output, the process identities and times of the run, and the run's files. + /// Also written to s09-diagnostics (bounded), which CI keeps when the step fails. + /// + public static string Evidence(string run, string step, int exit, string output) + { + const int limit = 16000; + StringBuilder text = new StringBuilder(); + text.AppendLine(step + " exit " + exit + " (" + run + ")"); + text.AppendLine("output:"); + text.AppendLine(output == null || output.Length <= limit ? output : output.Substring(0, limit) + "... (" + output.Length + " characters)"); + try + { + string manifestPath = Path.Combine(run, "export.json"); + if (File.Exists(manifestPath)) + { + ExportManifest manifest = ExportManifest.Load(manifestPath); + text.AppendLine(string.Format(CultureInfo.InvariantCulture, "export: schema {0}, pid {1}, process started {2:O}, started {3:O}, finished {4:O}, mutation {5}", manifest.Schema, manifest.ProcessId, manifest.ProcessStartedUtc, manifest.StartedUtc, manifest.FinishedUtc, manifest.Mutation)); + } + + string snapshotPath = Path.Combine(run, "native.json"); + if (File.Exists(snapshotPath)) + { + NativeSnapshot snapshot = NativeSnapshot.Load(snapshotPath); + text.AppendLine(string.Format(CultureInfo.InvariantCulture, "reader: schema {0}, pid {1}, process started {2:O}, started {3:O}, finished {4:O}", snapshot.Schema, snapshot.ProcessId, snapshot.ProcessStartedUtc, snapshot.StartedUtc, snapshot.FinishedUtc)); + } + + foreach (string file in Directory.Exists(run) ? Directory.GetFiles(run, "*", SearchOption.AllDirectories) : new string[0]) + { + text.AppendLine(string.Format(CultureInfo.InvariantCulture, "file {0} {1} bytes, written {2:O}", Path.GetRelativePath(run, file), new FileInfo(file).Length, File.GetLastWriteTimeUtc(file))); + } + } + catch (Exception exception) + { + text.AppendLine("run evidence unreadable: " + exception.Message); + } + + string diagnostics = Path.Combine(TestContext.CurrentContext.WorkDirectory, "s09-diagnostics"); + Directory.CreateDirectory(diagnostics); + File.WriteAllText(Path.Combine(diagnostics, Path.GetFileName(run) + "-" + step + ".txt"), text.ToString()); + return text.ToString(); + } + + public static string Write(AnalyticalModel model, string name) + { + string path = Path.Combine(TestContext.CurrentContext.WorkDirectory, "s09-models", name + "-" + Guid.NewGuid().ToString("N").Substring(0, 6) + ".json"); + Directory.CreateDirectory(Path.GetDirectoryName(path)); + Core.Convert.ToFile(model, path, Core.SAMFileType.Json); + return path; + } + + /// Changes one space's internal condition and stores it back (the setter clones the condition). + public static void ChangeCondition(AnalyticalModel model, Guid spaceGuid, Action change) + { + AdjacencyCluster cluster = model.AdjacencyCluster; + Space space = cluster.GetSpaces().Single(x => x.Guid == spaceGuid); + InternalCondition internalCondition = space.InternalCondition; + change(internalCondition); + space.InternalCondition = internalCondition; + cluster.AddObject(space); + } + + public static void ChangeSpace(AnalyticalModel model, Guid spaceGuid, Action change) + { + AdjacencyCluster cluster = model.AdjacencyCluster; + Space space = cluster.GetSpaces().Single(x => x.Guid == spaceGuid); + change(space); + cluster.AddObject(space); + } + } +} diff --git a/benchmark/SAM.Analytical.OpenStudio.InputReadBack.Tests/VentilationPolicyTests.cs b/benchmark/SAM.Analytical.OpenStudio.InputReadBack.Tests/VentilationPolicyTests.cs new file mode 100644 index 0000000..133e1c1 --- /dev/null +++ b/benchmark/SAM.Analytical.OpenStudio.InputReadBack.Tests/VentilationPolicyTests.cs @@ -0,0 +1,197 @@ +// SPDX-License-Identifier: LGPL-3.0-or-later +// Copyright (c) 2020–2026 Michal Dengusiak & Jakub Ziolkowski and contributors + +using NUnit.Framework; +using System; +using System.Collections.Generic; +using System.Linq; + +namespace SAM.Analytical.OpenStudio.InputReadBack.Tests +{ + /// + /// The writer side of the S09 owner ventilation policy (S07 D-F2), on the signed-off fixtures and on single changes of + /// them: no selected Ventilation profile delivers no outdoor air and keeps the requirement (V0/V1); a valid selection + /// is the delivery schedule (V2); a selection that does not resolve is an invalid input; the per-space + /// OutsideSupplyAirFlow override and the Ideal Loads controls follow the same rule. + /// + [TestFixture] + public class VentilationPolicyTests + { + private const string NotDelivered = Convert.VentilationNotDeliveredScheduleName; + + private static OpenStudioConversionResult Convert_(AnalyticalModel model) + { + return model.ToOpenStudio(); + } + + private static global::OpenStudio.DesignSpecificationOutdoorAir SpaceTypeDsoa(OpenStudioConversionResult result, Guid space) + { + global::OpenStudio.Space openStudioSpace = result.Model.getSpaces().Single(x => NamedFor(x.nameString(), space)); + return openStudioSpace.spaceType.get().designSpecificationOutdoorAir().get(); + } + + private static global::OpenStudio.ZoneHVACIdealLoadsAirSystem IdealLoads(OpenStudioConversionResult result, Guid space) + { + return result.Model.getZoneHVACIdealLoadsAirSystems().Single(x => NamedFor(x.nameString(), space)); + } + + // The fixture space GUIDs share their first 8 hex digits, so the deterministic name is told apart by the SAM name. + private static bool NamedFor(string openStudioName, Guid space) + { + string token = space == TestSupport.BoxSpace ? "FixBox" : space == TestSupport.SpaceA ? "FixA" : "FixB"; + return openStudioName.Contains("_" + token + "_", StringComparison.Ordinal); + } + + private static string Schedule(global::OpenStudio.DesignSpecificationOutdoorAir dsoa) + { + global::OpenStudio.OptionalSchedule schedule = dsoa.outdoorAirFlowRateFractionSchedule(); + return schedule == null || schedule.isNull() ? null : schedule.get().nameString(); + } + + private static double[] Values(OpenStudioConversionResult result, string scheduleName) + { + global::OpenStudio.ScheduleFixedInterval schedule = result.Model.getScheduleFixedIntervalByName(scheduleName).get(); + global::OpenStudio.Vector values = schedule.timeSeries().values(); + return Enumerable.Range(0, (int)values.size()).Select(i => values.__getitem__((uint)i)).ToArray(); + } + + [Test] + public void V1_TheTwoZoneFixture_KeepsEachRequirement_AndDeliversNothing() + { + using (OpenStudioConversionResult result = Convert_(TestSupport.Load(TestSupport.Two))) + { + Assert.That(result.IsValid, Is.True); + global::OpenStudio.DesignSpecificationOutdoorAir a = SpaceTypeDsoa(result, TestSupport.SpaceA); + global::OpenStudio.DesignSpecificationOutdoorAir b = SpaceTypeDsoa(result, TestSupport.SpaceB); + Assert.That(a.outdoorAirFlowperPerson(), Is.EqualTo(0.008), "requirement kept"); + Assert.That(a.outdoorAirFlowperFloorArea(), Is.EqualTo(0.0006), "requirement kept"); + Assert.That(b.outdoorAirFlowAirChangesperHour(), Is.EqualTo(0.75), "requirement kept"); + Assert.That(Schedule(a), Is.EqualTo(NotDelivered)); + Assert.That(Schedule(b), Is.EqualTo(NotDelivered)); + double[] values = Values(result, NotDelivered); + Assert.That(values.Length, Is.EqualTo(8760)); + Assert.That(values.All(x => x == 0), Is.True, "no outdoor air in any hour"); + Assert.That(result.Diagnostics.Count(x => x.Message.Contains("no outdoor air is delivered (S07 D-F2 V1)")), Is.EqualTo(2)); + } + } + + [Test] + public void V2_TheBoxFixture_DeliversThroughItsSelectedProfile() + { + using (OpenStudioConversionResult result = Convert_(TestSupport.Load(TestSupport.Box))) + { + Assert.That(result.IsValid, Is.True); + global::OpenStudio.DesignSpecificationOutdoorAir dsoa = SpaceTypeDsoa(result, TestSupport.BoxSpace); + Assert.That(dsoa.outdoorAirFlowperPerson(), Is.EqualTo(0.01)); + Assert.That(Schedule(dsoa), Does.Contain("Ventilation")); + Assert.That(Values(result, Schedule(dsoa)).Any(x => x > 0), Is.True); + } + } + + [Test] + public void V2ChangedBackToV1_TheSameSpace_DeliversNothing_AndKeepsItsRequirement() + { + AnalyticalModel model = TestSupport.Load(TestSupport.Box); + using (OpenStudioConversionResult v2 = Convert_(model)) + { + Assert.That(Schedule(SpaceTypeDsoa(v2, TestSupport.BoxSpace)), Does.Contain("Ventilation"), "V2 first"); + } + + TestSupport.ChangeCondition(model, TestSupport.BoxSpace, ic => ic.RemoveValue(InternalConditionParameter.VentilationProfileName)); + using (OpenStudioConversionResult v1 = Convert_(model)) + { + Assert.That(v1.IsValid, Is.True); + global::OpenStudio.DesignSpecificationOutdoorAir dsoa = SpaceTypeDsoa(v1, TestSupport.BoxSpace); + Assert.That(dsoa.outdoorAirFlowperPerson(), Is.EqualTo(0.01), "the requirement is kept"); + Assert.That(Schedule(dsoa), Is.EqualTo(NotDelivered), "no stale V2 delivery"); + Assert.That(Values(v1, NotDelivered).All(x => x == 0), Is.True); + Assert.That(IdealLoads(v1, TestSupport.BoxSpace).designSpecificationOutdoorAirObject().get().nameString(), Is.EqualTo(dsoa.nameString())); + } + } + + private static readonly object[] Invalid = + { + new object[] { "missing", (Func)(ic => "s09-missing-ventilation-profile") }, + new object[] { "wrong-type", (Func)(ic => ic.GetProfileName(ProfileType.Occupancy)) } + }; + + [TestCaseSource(nameof(Invalid))] + public void ASelectionThatDoesNotResolve_IsAnInvalidInput_AndNeverDeliversUnscheduled(string what, Func name) + { + AnalyticalModel model = TestSupport.Load(TestSupport.Box); + TestSupport.ChangeCondition(model, TestSupport.BoxSpace, ic => ic.SetProfileName(ProfileType.Ventilation, name(ic))); + using (OpenStudioConversionResult result = Convert_(model)) + { + Assert.That(result.IsValid, Is.False, what + ": an invalid input is an error"); + Assert.That(result.Diagnostics.Any(x => x.Code == "SAM-OS-SCH-001" && x.Message.Contains("not found as a Ventilation profile")), Is.True, what); + global::OpenStudio.DesignSpecificationOutdoorAir dsoa = SpaceTypeDsoa(result, TestSupport.BoxSpace); + Assert.That(Schedule(dsoa), Is.EqualTo(NotDelivered), what + ": never unscheduled"); + Assert.That(Values(result, NotDelivered).All(x => x == 0), Is.True); + } + } + + [Test] + public void TheSpaceOverride_InV2_IsSumOfItsFlowOnly_ScheduledByTheSelectedProfile_AndLinkedToIdealLoads() + { + AnalyticalModel model = TestSupport.Load(TestSupport.Box); + TestSupport.ChangeSpace(model, TestSupport.BoxSpace, space => space.SetValue(SpaceParameter.OutsideSupplyAirFlow, 0.05)); + using (OpenStudioConversionResult result = Convert_(model)) + { + Assert.That(result.IsValid, Is.True); + global::OpenStudio.Space openStudioSpace = result.Model.getSpaces().Single(); + Assert.That(openStudioSpace.isDesignSpecificationOutdoorAirDefaulted(), Is.False, "the override is set on the space"); + global::OpenStudio.DesignSpecificationOutdoorAir own = openStudioSpace.designSpecificationOutdoorAir().get(); + Assert.That(own.outdoorAirMethod(), Is.EqualTo("Sum")); + Assert.That(own.outdoorAirFlowRate(), Is.EqualTo(0.05)); + Assert.That(own.outdoorAirFlowperPerson(), Is.EqualTo(0), "no OpenStudio Flow/Person default"); + Assert.That(own.outdoorAirFlowperFloorArea(), Is.EqualTo(0)); + Assert.That(own.outdoorAirFlowAirChangesperHour(), Is.EqualTo(0)); + Assert.That(Schedule(own), Is.EqualTo(Schedule(SpaceTypeDsoa(result, TestSupport.BoxSpace))), "the same selected profile as the SpaceType delivery"); + Assert.That(IdealLoads(result, TestSupport.BoxSpace).designSpecificationOutdoorAirObject().get().nameString(), Is.EqualTo(own.nameString()), "Ideal Loads delivers the effective (override) DSOA"); + } + } + + [Test] + public void TheSpaceOverride_InV1_DeliversNothing() + { + AnalyticalModel model = TestSupport.Load(TestSupport.Two); + TestSupport.ChangeSpace(model, TestSupport.SpaceA, space => space.SetValue(SpaceParameter.OutsideSupplyAirFlow, 0.04)); + using (OpenStudioConversionResult result = Convert_(model)) + { + global::OpenStudio.Space a = result.Model.getSpaces().Single(x => NamedFor(x.nameString(), TestSupport.SpaceA)); + global::OpenStudio.DesignSpecificationOutdoorAir own = a.designSpecificationOutdoorAir().get(); + Assert.That(own.outdoorAirFlowRate(), Is.EqualTo(0.04)); + Assert.That(Schedule(own), Is.EqualTo(NotDelivered)); + } + } + + [Test] + public void IdealLoads_StatesItsOutdoorAirControls_AndLinksTheInheritedSpaceTypeDsoa() + { + using (OpenStudioConversionResult result = Convert_(TestSupport.Load(TestSupport.Two))) + { + foreach (Guid space in new[] { TestSupport.SpaceA, TestSupport.SpaceB }) + { + global::OpenStudio.ZoneHVACIdealLoadsAirSystem idealLoads = IdealLoads(result, space); + Assert.That(idealLoads.demandControlledVentilationType(), Is.EqualTo("None")); + Assert.That(idealLoads.outdoorAirEconomizerType(), Is.EqualTo("NoEconomizer")); + Assert.That(idealLoads.heatRecoveryType(), Is.EqualTo("None")); + Assert.That(idealLoads.designSpecificationOutdoorAirObject().get().nameString(), Is.EqualTo(SpaceTypeDsoa(result, space).nameString()), "the inherited SpaceType DSOA"); + } + } + } + + [Test] + public void V0_NoRequirement_WritesNoDsoa_AndIdealLoadsDeliversNoOutdoorAir() + { + AnalyticalModel model = TestSupport.Load(TestSupport.Two); + TestSupport.ChangeCondition(model, TestSupport.SpaceB, ic => ic.RemoveValue(InternalConditionParameter.SupplyAirChangesPerHour)); + using (OpenStudioConversionResult result = Convert_(model)) + { + global::OpenStudio.Space b = result.Model.getSpaces().Single(x => NamedFor(x.nameString(), TestSupport.SpaceB)); + Assert.That(b.designSpecificationOutdoorAir().isNull(), Is.True); + Assert.That(IdealLoads(result, TestSupport.SpaceB).designSpecificationOutdoorAirObject().isNull(), Is.True); + } + } + } +} diff --git a/benchmark/SAM.Analytical.OpenStudio.InputReadBack/Classes/ExportManifest.cs b/benchmark/SAM.Analytical.OpenStudio.InputReadBack/Classes/ExportManifest.cs new file mode 100644 index 0000000..05a7ce7 --- /dev/null +++ b/benchmark/SAM.Analytical.OpenStudio.InputReadBack/Classes/ExportManifest.cs @@ -0,0 +1,104 @@ +// SPDX-License-Identifier: LGPL-3.0-or-later +// Copyright (c) 2020–2026 Michal Dengusiak & Jakub Ziolkowski and contributors + +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.IO; +using System.Security.Cryptography; +using System.Text.Json; + +namespace SAM.Analytical.OpenStudio.InputReadBack +{ + /// What the export step converted and wrote (export.json). Writer-side facts only: hashes, versions, diagnostics. + public sealed class ExportManifest + { + public string Schema { get; set; } = "s09-export/2"; + public string Label { get; set; } + + /// Set only on a disposable negative copy: the targeted mutation applied to the exported files. + public string Mutation { get; set; } + public string SourceModelPath { get; set; } + public string SourceEpwPath { get; set; } + public string ModelSha256 { get; set; } + public string EpwSha256 { get; set; } + public string OsmSha256 { get; set; } + public string IdfSha256 { get; set; } + public string OpenStudioSdkVersion { get; set; } + public string WriterAssembly { get; set; } + public string WriterAssemblySha256 { get; set; } + public int ProcessId { get; set; } + + /// The export process's OS creation time; with it identifies the process (). + public DateTime ProcessStartedUtc { get; set; } + public DateTime StartedUtc { get; set; } + public DateTime FinishedUtc { get; set; } + public bool ConversionValid { get; set; } + public List Diagnostics { get; set; } = new List(); + public List TranslatorMessages { get; set; } = new List(); + + public void Save(string path) + { + File.WriteAllText(path, JsonSerializer.Serialize(this, Json.Options)); + } + + public static ExportManifest Load(string path) + { + return JsonSerializer.Deserialize(File.ReadAllText(path), Json.Options); + } + } + + /// + /// A process is its id and its OS creation time. Windows reuses a process id once its process has exited, so a later + /// process can carry the id of an earlier one; an equal id alone does not prove the same process. + /// + public static class ProcessIdentity + { + public static DateTime CurrentStartedUtc() + { + using (Process process = Process.GetCurrentProcess()) + { + return process.StartTime.ToUniversalTime(); + } + } + + public static bool IsRecorded(int processId, DateTime processStartedUtc) + { + return processId > 0 && processStartedUtc != default; + } + + public static bool Same(int processId, DateTime processStartedUtc, int otherProcessId, DateTime otherProcessStartedUtc) + { + return processId == otherProcessId && processStartedUtc == otherProcessStartedUtc; + } + } + + public static class Hashing + { + public static string Sha256(string path) + { + using (FileStream stream = File.OpenRead(path)) + using (SHA256 sha256 = SHA256.Create()) + { + return System.Convert.ToHexString(sha256.ComputeHash(stream)).ToLowerInvariant(); + } + } + + public static string Sha256(byte[] bytes) + { + using (SHA256 sha256 = SHA256.Create()) + { + return System.Convert.ToHexString(sha256.ComputeHash(bytes)).ToLowerInvariant(); + } + } + } + + internal static class Json + { + public static readonly JsonSerializerOptions Options = new JsonSerializerOptions + { + WriteIndented = true, + NumberHandling = System.Text.Json.Serialization.JsonNumberHandling.AllowNamedFloatingPointLiterals + }; + } +} diff --git a/benchmark/SAM.Analytical.OpenStudio.InputReadBack/Classes/ReadBackExit.cs b/benchmark/SAM.Analytical.OpenStudio.InputReadBack/Classes/ReadBackExit.cs new file mode 100644 index 0000000..0f716d7 --- /dev/null +++ b/benchmark/SAM.Analytical.OpenStudio.InputReadBack/Classes/ReadBackExit.cs @@ -0,0 +1,39 @@ +// SPDX-License-Identifier: LGPL-3.0-or-later +// Copyright (c) 2020–2026 Michal Dengusiak & Jakub Ziolkowski and contributors + +using SAM.Analytical.InputEquivalence; + +namespace SAM.Analytical.OpenStudio.InputReadBack +{ + /// Process exit codes, the same as the S08 Tas harness so both engines' runs read alike. + public static class ReadBackExit + { + public const int Pass = 0; + public const int Fail = 10; + public const int BlockedTechnical = 11; + public const int BlockedOwner = 12; + public const int NotRun = 13; + public const int AcceptedLimitation = 14; + public const int Usage = 64; + public const int Infrastructure = 70; + + public static int Of(GateStatus status) + { + switch (status) + { + case GateStatus.Pass: + return Pass; + case GateStatus.Fail: + return Fail; + case GateStatus.BlockedTechnical: + return BlockedTechnical; + case GateStatus.BlockedOwnerDecision: + return BlockedOwner; + case GateStatus.NotPassAcceptedLimitation: + return AcceptedLimitation; + default: + return NotRun; + } + } + } +} diff --git a/benchmark/SAM.Analytical.OpenStudio.InputReadBack/Compare/NativeModel.cs b/benchmark/SAM.Analytical.OpenStudio.InputReadBack/Compare/NativeModel.cs new file mode 100644 index 0000000..cc18b35 --- /dev/null +++ b/benchmark/SAM.Analytical.OpenStudio.InputReadBack/Compare/NativeModel.cs @@ -0,0 +1,191 @@ +// SPDX-License-Identifier: LGPL-3.0-or-later +// Copyright (c) 2020–2026 Michal Dengusiak & Jakub Ziolkowski and contributors + +using SAM.Analytical.InputEquivalence; +using System; +using System.Collections.Generic; +using System.Globalization; +using System.Linq; + +namespace SAM.Analytical.OpenStudio.InputReadBack +{ + /// + /// A typed index over a : native objects by EnergyPlus name (case-insensitive, as EnergyPlus + /// resolves them) and the native field readings the comparison needs. Every reading keeps the reader states of the + /// evaluation core: absent (blank or missing), unreadable (layout or text not understood), NaN, zero, finite. + /// + public sealed class NativeModel + { + private static readonly CultureInfo ci = CultureInfo.InvariantCulture; + private readonly Dictionary idfSchedules; + private readonly Dictionary osmSchedules; + private readonly Dictionary osmHandles; + + public NativeModel(NativeSnapshot snapshot) + { + Snapshot = snapshot; + idfSchedules = new Dictionary(StringComparer.OrdinalIgnoreCase); + foreach (NativeSchedule schedule in snapshot.IdfSchedules.Where(x => x.Name != null)) + { + idfSchedules[schedule.Name] = schedule; + } + + osmSchedules = new Dictionary(StringComparer.OrdinalIgnoreCase); + foreach (NativeSchedule schedule in snapshot.OsmSchedules.Where(x => x.Name != null)) + { + osmSchedules[schedule.Name] = schedule; + } + + osmHandles = new Dictionary(StringComparer.OrdinalIgnoreCase); + foreach (IdfObject o in snapshot.Osm) + { + // Every OSM object (and the reader's schedule handle records) starts with handle, name. + string handle = o.Value(0); + string name = o.Value(1); + if (!string.IsNullOrWhiteSpace(handle) && handle.StartsWith("{", StringComparison.Ordinal) && name != null) + { + osmHandles[handle] = name; + } + } + + string coordinateSystem = snapshot.IdfOf("GlobalGeometryRules").FirstOrDefault()?.Value(2, "Coordinate System", out string _); + RelativeCoordinates = coordinateSystem == null || string.Equals(coordinateSystem, "Relative", StringComparison.OrdinalIgnoreCase); + } + + public NativeSnapshot Snapshot { get; } + + public bool RelativeCoordinates { get; } + + public IEnumerable Idf(string type) => Snapshot.IdfOf(type); + + public IdfObject IdfByName(string type, string name) + { + return string.IsNullOrWhiteSpace(name) ? null : Snapshot.IdfOf(type).FirstOrDefault(x => string.Equals(x.Name, name, StringComparison.OrdinalIgnoreCase)); + } + + /// An OSM object of by its Name field (field 1, after the handle). + public IdfObject OsmByName(string type, string name) + { + return string.IsNullOrWhiteSpace(name) ? null : Snapshot.OsmOf(type).FirstOrDefault(x => string.Equals(x.Value(1), name, StringComparison.OrdinalIgnoreCase)); + } + + public IdfObject OsmByHandle(string type, string handle) + { + return string.IsNullOrWhiteSpace(handle) ? null : Snapshot.OsmOf(type).FirstOrDefault(x => string.Equals(x.Value(0), handle, StringComparison.OrdinalIgnoreCase)); + } + + /// The name an OSM handle reference points to, or null. + public string OsmName(string handle) + { + return handle != null && osmHandles.TryGetValue(handle, out string name) ? name : null; + } + + public NativeSchedule IdfSchedule(string name) + { + return name != null && idfSchedules.TryGetValue(name, out NativeSchedule schedule) ? schedule : null; + } + + public NativeSchedule OsmSchedule(string name) + { + return name != null && osmSchedules.TryGetValue(name, out NativeSchedule schedule) ? schedule : null; + } + + /// A numeric field as a reader result: blank is absent (EnergyPlus would apply its default), text that is not a number is unreadable. + public static ReaderResult Number(IdfObject o, int index, string label) + { + if (o == null) + { + return ReaderResult.Absent("no native object"); + } + + string text = o.Value(index, label, out string problem); + if (problem != null) + { + return ReaderResult.Unreadable(problem); + } + + if (string.IsNullOrWhiteSpace(text)) + { + return ReaderResult.Absent(o.Type + " '" + o.Name + "' " + label + " is blank"); + } + + if (string.Equals(text, "NaN", StringComparison.OrdinalIgnoreCase)) + { + return ReaderResult.NotANumber(o.Type + " '" + o.Name + "' " + label + " is NaN"); + } + + return double.TryParse(text, NumberStyles.Float, ci, out double value) + ? ReaderResult.FromValue(value) + : ReaderResult.Unreadable(o.Type + " '" + o.Name + "' " + label + " is not a number: '" + text + "'"); + } + + public static string Text(IdfObject o, int index, string label, out string problem) + { + problem = null; + if (o == null) + { + problem = "no native object"; + return null; + } + + return o.Value(index, label, out problem); + } + + /// + /// The vertices of a surface (from , three numbers each) in building coordinates: + /// relative coordinates are moved by the zone origin. Null with a reason when unreadable or rotated. + /// + public List Vertices(IdfObject surface, int firstVertexField, IdfObject zone, out string problem) + { + problem = null; + double[] origin = { 0, 0, 0 }; + if (RelativeCoordinates && zone != null) + { + string north = zone.Value(1, "Direction of Relative North", out problem); + if (problem != null) + { + return null; + } + + if (!string.IsNullOrWhiteSpace(north) && (!double.TryParse(north, NumberStyles.Float, ci, out double degrees) || degrees != 0)) + { + problem = "zone '" + zone.Name + "' is rotated (" + north + " deg): not read by the S09 reader"; + return null; + } + + for (int k = 0; k < 3; k++) + { + string text = zone.Value(2 + k); + origin[k] = string.IsNullOrWhiteSpace(text) ? 0 : double.Parse(text, NumberStyles.Float, ci); + } + } + + List result = new List(); + int count = surface.Fields.Count - firstVertexField; + if (count < 9 || count % 3 != 0) + { + problem = surface.Type + " '" + surface.Name + "' has " + count + " vertex fields"; + return null; + } + + for (int i = firstVertexField; i + 2 < surface.Fields.Count; i += 3) + { + double[] p = new double[3]; + for (int k = 0; k < 3; k++) + { + if (!double.TryParse(surface.Value(i + k), NumberStyles.Float, ci, out p[k])) + { + problem = surface.Type + " '" + surface.Name + "' vertex field " + (i + k) + " is not a number"; + return null; + } + + p[k] += origin[k]; + } + + result.Add(p); + } + + return result; + } + } +} diff --git a/benchmark/SAM.Analytical.OpenStudio.InputReadBack/Compare/OsComparison.cs b/benchmark/SAM.Analytical.OpenStudio.InputReadBack/Compare/OsComparison.cs new file mode 100644 index 0000000..05edc73 --- /dev/null +++ b/benchmark/SAM.Analytical.OpenStudio.InputReadBack/Compare/OsComparison.cs @@ -0,0 +1,2410 @@ +// SPDX-License-Identifier: LGPL-3.0-or-later +// Copyright (c) 2020–2026 Michal Dengusiak & Jakub Ziolkowski and contributors + +using SAM.Analytical.InputEquivalence; +using SAM.Analytical.Tas.DirectT3D.Validation.ReadBack; +using SAM.Core; +using SAM.Geometry.Spatial; +using System; +using System.Collections.Generic; +using System.Globalization; +using System.IO; +using System.Linq; +using EQ = SAM.Analytical.InputEquivalence.Query; + +namespace SAM.Analytical.OpenStudio.InputReadBack +{ + using HeatFlowDirection = SAM.Analytical.InputEquivalence.HeatFlowDirection; + + /// One hourly series in the report: its size and the first element that does not pass. + public sealed class SeriesSummary + { + public string Key { get; set; } + public string QuantityId { get; set; } + public int Count { get; set; } + public int NotPass { get; set; } + public string Status { get; set; } + public string Outcome { get; set; } + public string FirstNotPass { get; set; } + } + + /// + /// One row-3a opaque optical row on a face EnergyPlus does not use (S07 §5.2, amendment U1): OUT-OF-ENGINE-SCOPE, + /// informational and not gated. Both values, their difference, the side and layer, and the scope reason are kept. + /// + public sealed class OutOfEngineScopeRow + { + public string Quantity { get; set; } + public string Key { get; set; } + public string Side { get; set; } + + /// The layer's EnergyPlus position on this side, outside first (as in the key), of . + public int Layer { get; set; } + public int LayerCount { get; set; } + public string Property { get; set; } + + /// The SAM face the row holds: internal or external. + public string SamFace { get; set; } + public string SamMaterial { get; set; } + public string NativeObject { get; set; } + public double SamValue { get; set; } + public double NativeValue { get; set; } + + /// |native − SAM|. + public double Delta { get; set; } + + /// The shared S07 numeric verdict of the two values (Identical, WithinTolerance, OutsideTolerance), for information. + public string NumericVerdict { get; set; } + + /// True when the two values are outside the row-3a tolerance (the pre-U1 single-sided difference). + public bool Differs { get; set; } + public string ScopeReason { get; set; } + public string Amendment { get; set; } + } + + /// + /// The S09 comparison of one fixture: SAM intent (ReadBackExpected and the core formulas, S07 section 3) against the + /// native OSM/IDF read-back, quantity by quantity and hour by hour, gated by the S08 evaluation core. + /// + public sealed class OsComparison + { + private static readonly CultureInfo ci = CultureInfo.InvariantCulture; + + /// The verified inactive-delivery transformation of the S08 owner decision 3, applied with the same preconditions (S09 owner ventilation policy, V0/V1). + public const string InactiveVentilation = "T-VENT-INACTIVE"; + + /// The S07 §5.1 lighting energy split (amendment L1), verified for an authored p. + public const string LightSplit = "T-LIGHT-SPLIT"; + + /// + /// S07 §5.2, amendment U1 (approved by the merge of SAM#218, b06dbe8c): row-3a opaque absorptance and emissivity are + /// gated on the faces EnergyPlus 25.1 uses; a valid, comparable authored value on any other face is + /// OUT-OF-ENGINE-SCOPE. It replaces the S09-only OS-MAT-SINGLE-SIDED listing (MAPPING-DIFFERENCE) of revisions 2-11. + /// + public const string OpaqueFaceScope = "S07 §5.2 amendment U1 (SAM#218 b06dbe8c)"; + + /// The report's outcome name for an OUT-OF-ENGINE-SCOPE row (the shared core has no such outcome; it is OpenStudio-local). + public const string OutOfEngineScopeOutcome = "OutOfEngineScope"; + + public string FixtureId { get; private set; } + public GateRuleSet RuleSet { get; private set; } + public GateConfiguration Configuration { get; private set; } + public List Required { get; private set; } = new List(); + public List Results { get; } = new List(); + public List Series { get; } = new List(); + public List Supporting { get; } = new List(); + + /// Contradictions between the two native views (OSM, IDF) or with the run's own files. Any one fails the fixture. + public List Consistency { get; } = new List(); + + /// + /// Native configurations the S09 reader does not interpret (an unreadable or unrecognised field, or a form S07 gives + /// no rule for). Any one blocks the fixture as BLOCKED technical; never PASS. + /// + public List Unsupported { get; } = new List(); + + public List FixtureCriteria { get; } = new List(); + public Dictionary VentilationStates { get; } = new Dictionary(StringComparer.Ordinal); + + /// + /// The OUT-OF-ENGINE-SCOPE rows (S07 §5.2), in result order. Each one's result stays in for + /// coverage, marked informational, so the gate does not count it; every other result gates as before. + /// + public List OutOfEngineScope { get; } = new List(); + + public GateReport Gate { get; private set; } + public GateStatus Status { get; private set; } + + private readonly HashSet outOfEngineScope = new HashSet(); + private NativeModel native; + private AnalyticalModel model; + private bool calendarVerified; + + public static OsComparison Run(AnalyticalModel model, NativeSnapshot snapshot, string epwPath, string fixtureId, GateRuleSet ruleSet) + { + OsComparison result = new OsComparison { FixtureId = fixtureId, RuleSet = ruleSet, model = model, native = new NativeModel(snapshot) }; + ExpectedModel expected = ReadBackExpected.Build(model, null, fixtureId); + result.FixtureCriteria.AddRange(expected.FixtureCriteria); + result.Required = RequiredFromModel(expected); + result.Configuration = new GateConfiguration { RuleSet = ruleSet, RequiredComparisons = result.Required }; + + result.Calendar(epwPath); + result.Orientation(); + result.Multiplicity(); + List matchedSurfaces = new List(); + List matchedSubSurfaces = new List(); + List matchedSpaces = new List(); + foreach (ExpectedSpace space in expected.Spaces) + { + result.CompareSpace(space, matchedSpaces, matchedSurfaces, matchedSubSurfaces); + } + + result.Extras(matchedSpaces, matchedSurfaces, matchedSubSurfaces); + result.CompareWeather(epwPath, snapshot); + result.CompareDesignDays(expected); + + if (result.OutOfEngineScope.Count > 0) + { + int differing = result.OutOfEngineScope.Count(x => x.Differs); + result.Supporting.Add(OpaqueFaceScope + ": " + result.OutOfEngineScope.Count + " row-3a opaque optical row(s) on faces EnergyPlus 25.1 does not use are OUT-OF-ENGINE-SCOPE (informational, not gated): " + differing + " differ from the native value, " + (result.OutOfEngineScope.Count - differing) + " equal it. Each holds a valid authored value and a valid native value on a face whose role S09 derived from SAM, the side and the native boundary. Every used face (each innermost layer's zone face, each outdoor outermost face), every thickness, conductivity, density and specific heat, and every row that is not valid and comparable is gated."); + } + + result.Gate = EQ.Gate(result.Results, result.Configuration); + GateStatus status = result.Gate.Status; + if (result.Consistency.Count > 0) + { + status = GateStatus.Fail; + } + else if (result.Unsupported.Count > 0 && (int)status > (int)GateStatus.BlockedTechnical) + { + status = GateStatus.BlockedTechnical; + } + else if (result.FixtureCriteria.Count > 0 && (int)status > (int)GateStatus.BlockedOwnerDecision) + { + status = GateStatus.BlockedOwnerDecision; + } + + result.Status = status; + return result; + } + + /// True for a result reported as OUT-OF-ENGINE-SCOPE (S07 §5.2); it is informational and never gates. + public bool IsOutOfEngineScope(QuantityResult result) + { + return result != null && outOfEngineScope.Contains(result); + } + + /// A result's reported outcome: for an S07 §5.2 row, otherwise the shared outcome. + public string ReportedOutcome(QuantityResult result) + { + return IsOutOfEngineScope(result) ? OutOfEngineScopeOutcome : result.Outcome.ToString(); + } + + // ---- coverage --------------------------------------------------------------------------------------------------- + + /// + /// Every quantity-on-object comparison the verdict needs, from the frozen model only (never from the native files): + /// each space, each panel side and its layers, each aperture side, each internal-condition row, the weather and the + /// design days. + /// + public static List RequiredFromModel(ExpectedModel expected) + { + List result = new List(); + void Add(string id, string key) => result.Add(new RequiredComparison(id, key)); + + foreach (ExpectedSpace space in expected.Spaces) + { + Add("1a", Keys.Space(space.Guid)); + Add("2", Keys.Space(space.Guid)); + foreach (ExpectedPanel panel in space.Panels) + { + string side = Keys.Side(panel.Guid, space.Guid); + Add("1b", side); + for (int k = 1; k <= panel.Layers.Count; k++) + { + foreach (string property in LayerProperties.Opaque) + { + Add("3a", Keys.Layer(side, k, property)); + } + } + + Add(ElementKindOf(panel) == ElementKind.GroundOrAdiabatic ? "3b.ground" : "3b", side + ".U"); + foreach (ExpectedAperture aperture in panel.Apertures) + { + string key = Keys.Aperture(aperture.Guid, space.Guid); + Add("1b", key + ".pane"); + Add("1b", key + ".frame"); + if (aperture.FrameLayers.Count > 0) + { + Add("T-FRAME.conductance", key + ".frameConductance"); + } + + for (int k = 1; k <= aperture.PaneLayers.Count; k++) + { + foreach (string property in LayerProperties.Transparent) + { + Add("3c.layer", Keys.Layer(key, k, property)); + } + } + + Add("3c.U", key + ".U"); + } + } + + if (!space.HasInternalCondition) + { + continue; + } + + Add("4a.people", Keys.Ic(space.Guid, "people")); + foreach (string gain in LayerProperties.Gains) + { + Add("4a.density", Keys.Ic(space.Guid, gain)); + Add("4b", Keys.Ic(space.Guid, gain + ".total")); + } + + foreach (string fraction in LayerProperties.Fractions) + { + Add("4c", Keys.Ic(space.Guid, fraction)); + } + + Add(OsQuantities.LightingReturnAir.Id, Keys.Ic(space.Guid, LayerProperties.LightingReturnAir)); + + Add("5.temperature", Keys.Ic(space.Guid, "heating")); + Add("5.temperature", Keys.Ic(space.Guid, "cooling")); + Add("5.humidity", Keys.Ic(space.Guid, "humidification")); + Add("5.humidity", Keys.Ic(space.Guid, "dehumidification")); + foreach (string schedule in LayerProperties.Schedules) + { + Add("6.hourly", Keys.Ic(space.Guid, "schedule." + schedule)); + Add("6.eflh", Keys.Ic(space.Guid, "schedule." + schedule)); + } + + Add("7a", Keys.Ic(space.Guid, "infiltration")); + Add("7b", Keys.Ic(space.Guid, "infiltration")); + foreach (string basis in LayerProperties.VentilationBases) + { + Add("8a", Keys.Ic(space.Guid, "ventilation.requirement." + basis)); + } + + Add("8a", Keys.Ic(space.Guid, "ventilation.requirement.total")); + Add("8b", Keys.Ic(space.Guid, "ventilation.delivered")); + } + + foreach (string what in new[] { "epw", "latitude", "longitude", "elevation", "timezone" }) + { + Add("9.os." + what, Keys.Weather(what)); + } + + Add("10.os.count", Keys.DesignDays); + return result; + } + + // ---- calendar -------------------------------------------------------------------------------------------------- + + private void Calendar(string epwPath) + { + IdfObject runPeriod = native.Idf("RunPeriod").SingleOrDefault(); + List problems = new List(); + if (runPeriod == null) + { + problems.Add("the IDF has no single RunPeriod"); + } + else + { + string[] labels = { "Begin Month", "Begin Day of Month", "Begin Year", "End Month", "End Day of Month", "End Year" }; + double[] values = new double[labels.Length]; + for (int i = 0; i < labels.Length; i++) + { + ReaderResult r = NativeModel.Number(runPeriod, 1 + i, labels[i]); + values[i] = r.HasNumber ? r.Value : double.NaN; + } + + if (values[0] != 1 || values[1] != 1 || values[3] != 12 || values[4] != 31 || values[2] != values[5]) + { + problems.Add(string.Format(ci, "RunPeriod is {0}/{1}/{2} to {3}/{4}/{5}, not one calendar year", values[0], values[1], values[2], values[3], values[4], values[5])); + } + } + + if (native.Snapshot.DayCount != 365) + { + problems.Add("the run year has " + native.Snapshot.DayCount + " days (leap-year handling is not verified, S07 section 7)"); + } + + int epwRows = File.Exists(epwPath) ? File.ReadLines(epwPath).Skip(8).Count(x => !string.IsNullOrWhiteSpace(x)) : -1; + if (epwRows != 8760) + { + problems.Add("the EPW has " + epwRows + " data rows, not 8760"); + } + + calendarVerified = problems.Count == 0; + Supporting.Add(calendarVerified + ? "calendar: one non-leap run year 1/1-12/31 (" + native.Snapshot.DayCountEvidence + "), EPW 8760 rows; hour index 0 = 1 January 00:00-01:00. Each schedule's own hour labels are checked separately." + : "calendar NOT verified: " + string.Join("; ", problems)); + } + + private AlignmentStatus Alignment(params NativeSchedule[] schedules) + { + return calendarVerified && schedules.All(x => x != null && x.Values != null && x.AlignmentVerified) ? AlignmentStatus.Verified : AlignmentStatus.Unverified; + } + + // ---- spaces, surfaces, apertures -------------------------------------------------------------------------------- + + private sealed class NativeSurface + { + public IdfObject Object; + public List Vertices; + public string Problem; + } + + private List SurfacesOf(string spaceName) + { + List result = new List(); + foreach (IdfObject surface in native.Idf("BuildingSurface:Detailed")) + { + if (!string.Equals(surface.Value(4, "Space Name", out string _), spaceName, StringComparison.OrdinalIgnoreCase)) + { + continue; + } + + IdfObject zone = native.IdfByName("Zone", surface.Value(3)); + List vertices = native.Vertices(surface, 11, zone, out string problem); + result.Add(new NativeSurface { Object = surface, Vertices = vertices, Problem = problem }); + } + + return result; + } + + private void CompareSpace(ExpectedSpace space, List matchedSpaces, List matchedSurfaces, List matchedSubSurfaces) + { + string key = Keys.Space(space.Guid); + string carrier = "_" + space.Guid.ToString("N").Substring(0, 8); + List expectedPolygons = space.Panels.Select(x => x.Outer).ToList(); + + // Identity: the native space whose surfaces are, one to one, the space's panel polygons (geometry alone). The + // name suffix the writer mints from the SAM GUID may only contradict that match, never make it. + string nativeSpace = null; + GeometryMatchResult match = null; + List surfaces = null; + foreach (IdfObject candidate in native.Idf("Space")) + { + List candidateSurfaces = SurfacesOf(candidate.Name); + if (candidateSurfaces.Any(x => x.Vertices == null)) + { + continue; + } + + GeometryMatchResult candidateMatch = EQ.MatchPolygons(expectedPolygons, candidateSurfaces.Select(x => OsGeometry.ToPolygon3D(x.Vertices)).ToList()); + if (candidateMatch.IsBijection) + { + if (nativeSpace != null) + { + nativeSpace = null; + Supporting.Add(key + ": more than one native space matches its geometry"); + break; + } + + nativeSpace = candidate.Name; + match = candidateMatch; + surfaces = candidateSurfaces; + } + } + + IdentityStatus identity; + if (nativeSpace == null) + { + identity = IdentityStatus.Mismatch; + Supporting.Add(key + " '" + space.Name + "': no native space has exactly its panel polygons"); + } + else + { + identity = nativeSpace.EndsWith(carrier, StringComparison.OrdinalIgnoreCase) ? IdentityStatus.Verified : IdentityStatus.Mismatch; + matchedSpaces.Add(nativeSpace); + Supporting.Add(key + " '" + space.Name + "' = native space '" + nativeSpace + "' by geometry (" + match.Pairs.Count + " surfaces one to one); name carrier " + (identity == IdentityStatus.Verified ? "agrees" : "CONTRADICTS")); + } + + IdfObject nativeSpaceObject = native.IdfByName("Space", nativeSpace); + IdfObject zone = native.IdfByName("Zone", nativeSpaceObject?.Value(1, "Zone Name", out string _)); + + // 1a, 2: floor area and volume from the native polygons (EnergyPlus autocalculates both from them). + ReaderResult floorArea = ReaderResult.Absent("no native space"); + ReaderResult volume = ReaderResult.Absent("no native space"); + if (surfaces != null) + { + List floors = surfaces.Where(x => string.Equals(x.Object.Value(1, "Surface Type", out string _), "Floor", StringComparison.OrdinalIgnoreCase)).ToList(); + floorArea = floors.Count == 0 ? ReaderResult.Absent("no native floor surface") : ReaderResult.FromValue(floors.Sum(x => OsGeometry.Area(x.Vertices))); + double v = OsGeometry.ShellVolume(surfaces.Select(x => (IReadOnlyList)x.Vertices), out double signed); + volume = ReaderResult.FromValue(v); + Supporting.Add(key + ": native signed shell volume " + signed.ToString("R", ci) + " m3 (positive = outward-facing surfaces)"); + foreach (string field in new[] { "Volume", "Floor Area", "Ceiling Height" }) + { + ReaderResult stated = NativeModel.Number(zone, field == "Volume" ? 8 : field == "Floor Area" ? 9 : 7, field); + if (stated.Kind != ReaderKind.Absent) + { + Consistency.Add(key + ": the IDF Zone states " + field + " (" + stated.Value.ToString("R", ci) + ") instead of autocalculating it from the surfaces"); + } + } + } + + Add("1a", key, space.FloorArea, floorArea, identity); + Add("2", key, space.ShellVolume, volume, identity); + + ModelInterpretation interpretation = VolumeInterpretation(space, key); + + // Panel sides. + if (match != null) + { + for (int i = 0; i < space.Panels.Count; i++) + { + ExpectedPanel panel = space.Panels[i]; + GeometryPair pair = match.PairForExpected(i); + NativeSurface surface = pair == null ? null : surfaces[pair.NativeIndex]; + bool? carrierAgrees = surface == null ? (bool?)null : surface.Object.Name.EndsWith("_" + panel.Guid.ToString("N").Substring(0, 8), StringComparison.OrdinalIgnoreCase); + IdentityStatus sideIdentity = identity == IdentityStatus.Verified ? EQ.AssessIdentity(match, i, carrierAgrees) : identity; + if (surface != null) + { + matchedSurfaces.Add(surface.Object); + } + + CompareSide(space, panel, surface, sideIdentity, matchedSubSurfaces); + } + } + else + { + foreach (ExpectedPanel panel in space.Panels) + { + CompareSide(space, panel, null, IdentityStatus.Mismatch, matchedSubSurfaces); + } + } + + if (space.HasInternalCondition) + { + CompareInternalCondition(space, nativeSpace, zone, floorArea, volume, identity, interpretation); + } + } + + private ModelInterpretation VolumeInterpretation(ExpectedSpace space, string key) + { + // D-F9 C: stored and geometric volume agree within row 2's tolerance, or the interpretation must be recorded. + if (space.ShellVolume == null || space.ShellVolume.State != SamInputState.Value || double.IsNaN(space.StoredVolume)) + { + Supporting.Add(key + ": D-F9 stored volume " + space.StoredVolume.ToString("R", ci) + " vs geometric " + space.ShellVolume); + return ModelInterpretation.NotRequired; + } + + NumericComparison comparison = EQ.Compare(space.ShellVolume.Value, space.StoredVolume, QuantityCatalog.Get("2").Tolerance); + Supporting.Add(key + ": D-F9 stored volume " + space.StoredVolume.ToString("R", ci) + " m3 vs geometric " + space.ShellVolume.Value.ToString("R", ci) + " m3: " + comparison.Verdict); + return comparison.IsWithin ? ModelInterpretation.NotRequired : ModelInterpretation.RequiredNotRecorded; + } + + private static ElementKind ElementKindOf(ExpectedPanel panel) + { + if (panel.Adiabatic || IsGround(panel.PanelType)) + { + return ElementKind.GroundOrAdiabatic; + } + + return panel.SpaceOrder.Count > 1 ? ElementKind.Internal : ElementKind.External; + } + + private static bool IsGround(PanelType panelType) + { + return panelType == PanelType.SlabOnGrade || panelType == PanelType.UndergroundSlab || panelType == PanelType.UndergroundWall || panelType == PanelType.UndergroundCeiling; + } + + private static HeatFlowDirection DirectionOf(ExpectedPanel panel, bool firstSide) + { + switch (panel.PanelGroup) + { + case PanelGroup.Roof: + return HeatFlowDirection.Upward; + case PanelGroup.Floor: + // A floor seen from the space above conducts downwards; from the space below it is a ceiling. + return firstSide || panel.SpaceOrder.Count < 2 ? HeatFlowDirection.Downward : HeatFlowDirection.Upward; + default: + return HeatFlowDirection.Horizontal; + } + } + + private void CompareSide(ExpectedSpace space, ExpectedPanel panel, NativeSurface surface, IdentityStatus identity, List matchedSubSurfaces) + { + string side = Keys.Side(panel.Guid, space.Guid); + Add("1b", side, ExpectedValue.FromValue(panel.Outer == null ? double.NaN : EQ.GrossArea(panel.Outer)), surface == null ? ReaderResult.Absent("no native surface") : ReaderResult.FromValue(OsGeometry.Area(surface.Vertices)), identity); + + // Boundary: the native outside boundary must be the one SAM states for the panel. + ElementKind kind = ElementKindOf(panel); + if (surface != null) + { + string boundary = surface.Object.Value(5, "Outside Boundary Condition", out string _); + string expectedBoundary = kind == ElementKind.Internal ? "Surface" : kind == ElementKind.External ? "Outdoors" : panel.Adiabatic ? "Adiabatic" : "Ground"; + if (!string.Equals(boundary, expectedBoundary, StringComparison.OrdinalIgnoreCase) && !(kind == ElementKind.GroundOrAdiabatic && string.Equals(boundary, "Ground", StringComparison.OrdinalIgnoreCase))) + { + Consistency.Add(side + ": native outside boundary '" + boundary + "', SAM states '" + expectedBoundary + "'"); + } + } + + // Layers, outside first as EnergyPlus lists them: SAM lists a construction from its first space inside to + // outside (S07 section 1, UpdateReversed convention), so the first space sees the SAM list reversed. + bool firstSide = panel.SpaceOrder.Count == 0 || panel.SpaceOrder[0] == space.Guid; + List expectedLayers = firstSide ? Enumerable.Reverse(panel.Layers).ToList() : panel.Layers.ToList(); + List nativeLayers = LayersOf(surface?.Object.Value(2, "Construction Name", out string _), side, surface != null); + OpaqueSideRole role = OpaqueRole(space, panel, surface, identity, expectedLayers, nativeLayers, kind); + if (!role.Established && role.Named) + { + Unsupported.Add("optics role: " + side + ": " + role.Problem + "; no optical face of this side is OUT-OF-ENGINE-SCOPE (" + OpaqueFaceScope + ")"); + } + + CompareLayers(side, expectedLayers, nativeLayers, identity, false, firstSide, kind, role); + SingleLayerFaces(side, expectedLayers, kind); + + HeatFlowDirection direction = DirectionOf(panel, firstSide); + string uId = kind == ElementKind.GroundOrAdiabatic ? "3b.ground" : "3b"; + Add(uId, side + ".U", EQ.ExpectedOpaqueU(expectedLayers.Select(x => LayerResistance.Solid(x.Thickness, (x.Material as Core.Material)?.ThermalConductivity ?? double.NaN)), direction, kind), NativeU(nativeLayers, direction, kind), identity); + + foreach (ExpectedAperture aperture in panel.Apertures) + { + CompareAperture(space, aperture, surface, identity, firstSide, matchedSubSurfaces); + } + } + + private List LayersOf(string constructionName, string key, bool required) + { + IdfObject construction = native.IdfByName("Construction", constructionName); + if (construction == null) + { + if (required) + { + Supporting.Add(key + ": native construction '" + constructionName + "' not found"); + } + + return null; + } + + List result = new List(); + for (int i = 1; i < construction.Fields.Count; i++) + { + string name = construction.Value(i); + if (string.IsNullOrWhiteSpace(name)) + { + continue; + } + + IdfObject layer = new[] { "Material", "Material:NoMass", "Material:AirGap", "WindowMaterial:Glazing", "WindowMaterial:Gas", "WindowMaterial:SimpleGlazingSystem" } + .Select(t => native.IdfByName(t, name)).FirstOrDefault(x => x != null); + result.Add(layer ?? new IdfObject { Type = "missing", Fields = new List { new IdfField { Value = name } } }); + } + + return result; + } + + private void CompareLayers(string key, List expected, List nativeLayers, IdentityStatus identity, bool transparent, bool frontIsExternal, ElementKind kind, OpaqueSideRole role = null) + { + int count = Math.Max(expected.Count, nativeLayers?.Count ?? 0); + for (int k = 0; k < count; k++) + { + ExpectedLayer layer = k < expected.Count ? expected[k] : null; + IdfObject nativeLayer = nativeLayers != null && k < nativeLayers.Count ? nativeLayers[k] : null; + foreach (string property in transparent ? LayerProperties.Transparent : LayerProperties.Opaque) + { + string layerKey = Keys.Layer(key, k + 1, property); + ExpectedValue e = layer == null ? ExpectedValue.Unspecified("SAM states no layer " + (k + 1)) : ExpectedLayerValue(layer, property); + ReaderResult n = NativeLayerValue(nativeLayer, property, frontIsExternal); + QuantityResult result = EQ.Evaluate(Input(transparent ? "3c.layer" : "3a", layerKey, e, n, identity, AlignmentStatus.Unverified), Configuration); + + // S07 §5.2: EnergyPlus opaque materials hold one value per property for both faces, and only the + // outermost layer's outside face (outdoors) and the innermost layer's zone face are used. Every + // other face's row is OUT-OF-ENGINE-SCOPE when it is valid and comparable; otherwise it gates. + if (!transparent && layer != null && TryGetOpaqueFace(property, out bool internalFace, out string _) + && !IsExposedOpaqueFace(k, expected.Count, internalFace, frontIsExternal, kind)) + { + result = UnusedOpaqueFace(result, role, key, layer, nativeLayer, k, expected.Count, property, internalFace, frontIsExternal, kind); + } + + Results.Add(result); + } + } + } + + /// + /// The optical face roles of one opaque panel side (S07 §5.2), or why they are not established. Established only + /// from evidence that does not come from the writer's face selector: the raw SAM panel (its spaces in GetSpaces() + /// order, adiabatic flag, type and layers) and the native surface it was matched to by geometry (its outside + /// boundary and, for an interzone side, the partner surface and construction). + /// + private sealed class OpaqueSideRole + { + public string Problem; + + /// + /// True when the problem is an uninterpretable or contradictory configuration, named as unsupported (BLOCKED + /// technical). False when it is a missing native object or an unverified identity, which gate on their own rows. + /// + public bool Named; + + public bool Adiabatic; + + public bool Established => Problem == null; + } + + private OpaqueSideRole OpaqueRole(ExpectedSpace space, ExpectedPanel panel, NativeSurface surface, IdentityStatus identity, List expectedLayers, List nativeLayers, ElementKind kind) + { + OpaqueSideRole Problem(string problem, bool named) => new OpaqueSideRole { Problem = problem, Named = named }; + + if (surface == null) + { + return Problem("no native surface", false); + } + + if (identity != IdentityStatus.Verified) + { + return Problem("the side's identity is not verified (" + identity + ")", false); + } + + if (nativeLayers == null) + { + return Problem("no native construction", false); + } + + // SAM: the panel's spaces, its type and its boundary flags must state one boundary. + if (panel.SpaceOrder.Count == 0 || !panel.SpaceOrder.Contains(space.Guid)) + { + return Problem("the panel's SAM spaces (" + panel.SpaceOrder.Count + ") do not include this space", true); + } + + if (panel.SpaceOrder.Count > 2 || panel.SpaceOrder.Distinct().Count() != panel.SpaceOrder.Count) + { + return Problem("the panel's SAM space list is malformed (" + panel.SpaceOrder.Count + " entries, " + panel.SpaceOrder.Distinct().Count() + " distinct)", true); + } + + if (panel.PanelType == PanelType.Undefined || panel.PanelType == PanelType.Shade || panel.PanelType == PanelType.SolarPanel || panel.PanelType == PanelType.Air) + { + return Problem("SAM panel type " + panel.PanelType + " has no supported opaque boundary", true); + } + + if (panel.SpaceOrder.Count == 2 && (panel.Adiabatic || IsGround(panel.PanelType))) + { + return Problem("contradictory SAM boundary: the panel bounds two spaces and is " + (panel.Adiabatic ? "adiabatic" : "a ground type (" + panel.PanelType + ")"), true); + } + + // Native: the outside boundary must be exactly the SAM one; any other form (a ground preprocessor, other side + // coefficients, a Foundation, an adiabatic panel written as Ground) is not read as one of the four. + string expectedBoundary = kind == ElementKind.Internal ? "Surface" : kind == ElementKind.External ? "Outdoors" : panel.Adiabatic ? "Adiabatic" : "Ground"; + string boundary = NativeModel.Text(surface.Object, 5, "Outside Boundary Condition", out string boundaryProblem); + if (boundaryProblem != null) + { + return Problem("the native outside boundary is unreadable: " + boundaryProblem, true); + } + + if (!string.Equals(boundary?.Trim(), expectedBoundary, StringComparison.OrdinalIgnoreCase)) + { + return Problem("the native outside boundary '" + boundary + "' is not the SAM boundary '" + expectedBoundary + "'", true); + } + + // Layers: one native layer per SAM layer, so each position has one SAM layer. + if (expectedLayers.Count == 0 || nativeLayers.Count != expectedLayers.Count) + { + return Problem("the native construction has " + nativeLayers.Count + " layer(s) and SAM " + expectedLayers.Count, true); + } + + // Interzone: the outside face is the partner's zone face only when the partner names this surface back and + // its construction is this one reversed. + if (kind == ElementKind.Internal) + { + string partnerName = NativeModel.Text(surface.Object, 6, "Outside Boundary Condition Object", out string partnerProblem); + IdfObject partner = partnerProblem == null ? native.IdfByName("BuildingSurface:Detailed", partnerName) : null; + if (partner == null) + { + return Problem("the interzone partner surface '" + partnerName + "' is " + (partnerProblem != null ? "unreadable: " + partnerProblem : "not in the IDF"), true); + } + + string partnerBoundary = NativeModel.Text(partner, 5, "Outside Boundary Condition", out string _); + string partnerObject = NativeModel.Text(partner, 6, "Outside Boundary Condition Object", out string _); + if (!string.Equals(partnerBoundary?.Trim(), "Surface", StringComparison.OrdinalIgnoreCase) || !string.Equals(partnerObject?.Trim(), surface.Object.Name, StringComparison.OrdinalIgnoreCase)) + { + return Problem("the interzone partner '" + partner.Name + "' does not name this surface back (" + partnerBoundary + " '" + partnerObject + "')", true); + } + + List partnerLayers = LayersOf(partner.Value(2, "Construction Name", out string _), null, false); + List mirror = nativeLayers.Select(x => x.Name).Reverse().ToList(); + if (partnerLayers == null || !partnerLayers.Select(x => x.Name).SequenceEqual(mirror, StringComparer.OrdinalIgnoreCase)) + { + return Problem("the interzone partner's construction is not this side's construction reversed", true); + } + } + + return new OpaqueSideRole { Adiabatic = panel.Adiabatic }; + } + + /// + /// A row-3a optical row on a face EnergyPlus does not use (S07 §5.2). It is OUT-OF-ENGINE-SCOPE, informational, only + /// when the side's role is established, the layer is an opaque SAM material written as an opaque Material, the SAM + /// value is authored (S-VALUE, or S-ZERO: an authored zero is a value) and the native value is read, both in + /// [0, 1], and the shared evaluation is a numeric comparison of the two (MATCH, WITHIN-TOLERANCE or + /// OUT-OF-TOLERANCE, without any other trigger). Anything else keeps its shared, gated result, with the reason it + /// was not excluded; a value outside [0, 1] is INPUT-INVALID (SAM) or EXPORT-DEFECT (native), never compared. + /// + private QuantityResult UnusedOpaqueFace(QuantityResult result, OpaqueSideRole role, string side, ExpectedLayer layer, IdfObject nativeLayer, int index, int count, string property, bool internalFace, bool firstSide, ElementKind kind) + { + QuantityInput input = result.Input; + ExpectedValue e = input.Expected; + ReaderResult n = input.Native; + bool samAuthored = e.State == SamInputState.Value || e.State == SamInputState.Zero; + + string refused = null; + if (role == null || !role.Established) + { + refused = "the side's face role is not established: " + (role?.Problem ?? "not assessed"); + } + else if (!(layer.Material is OpaqueMaterial)) + { + refused = "SAM layer '" + layer.Name + "' is not an opaque material of the frozen library"; + } + else if (nativeLayer == null || !string.Equals(nativeLayer.Type, "Material", StringComparison.OrdinalIgnoreCase)) + { + refused = "the native layer is " + (nativeLayer == null ? "absent" : nativeLayer.Type + " '" + nativeLayer.Name + "'") + ", not an opaque Material"; + } + else if (!samAuthored) + { + refused = "the SAM value is " + e + ", not an authored value"; + } + else if (!n.HasNumber) + { + refused = "the native value is " + n + ", not a read value"; + } + + if (refused == null && !InUnitInterval(e.Value)) + { + QuantityResult invalid = EQ.Evaluate(new QuantityInput + { + Definition = input.Definition, + FixtureId = input.FixtureId, + ObjectKey = input.ObjectKey, + Expected = ExpectedValue.Invalid("authored " + property + " " + e.Value.ToString("R", ci) + " of '" + layer.Name + "' is outside [0, 1]"), + Native = n, + Identity = input.Identity, + Alignment = input.Alignment + }, Configuration); + return Annotated(invalid, "the SAM value is outside [0, 1]"); + } + + if (refused == null && !InUnitInterval(n.Value)) + { + return new QuantityResult(input, EquivalenceOutcome.ExportDefect, GateStatus.Fail, "The native " + property + " " + n.Value.ToString("R", ci) + " of " + nativeLayer.Type + " '" + nativeLayer.Name + "' is outside [0, 1]; it is not a comparable optical value (SAM " + e + "). Not OUT-OF-ENGINE-SCOPE (" + OpaqueFaceScope + ").", null, null, null, null, null); + } + + if (refused == null && result.Outcome != EquivalenceOutcome.Match && result.Outcome != EquivalenceOutcome.WithinTolerance && result.Outcome != EquivalenceOutcome.OutOfTolerance) + { + refused = "the shared evaluation is " + result.Outcome + ", not a numeric comparison of two valid values"; + } + + if (refused != null) + { + return Annotated(result, refused); + } + + NumericComparison comparison = EQ.Compare(e.Value, n.Value, input.Definition.Tolerance); + string reason = UnusedFaceReason(index, count, internalFace, firstSide, kind, role.Adiabatic); + OutOfEngineScopeRow row = new OutOfEngineScopeRow + { + Quantity = input.Definition.Id, + Key = input.ObjectKey, + Side = side, + Layer = index + 1, + LayerCount = count, + Property = property, + SamFace = internalFace ? "internal" : "external", + SamMaterial = layer.Name, + NativeObject = nativeLayer.Name, + SamValue = e.Value, + NativeValue = n.Value, + Delta = Math.Abs(n.Value - e.Value), + NumericVerdict = comparison.Verdict.ToString(), + Differs = !comparison.IsWithin, + ScopeReason = reason, + Amendment = OpaqueFaceScope + }; + + QuantityResult scoped = new QuantityResult(input, result.Outcome, result.Status, + "OUT-OF-ENGINE-SCOPE (" + OpaqueFaceScope + "): " + reason + "; SAM " + row.SamValue.ToString("R", ci) + ", native " + row.NativeValue.ToString("R", ci) + ", |d| " + row.Delta.ToString("R", ci) + " (" + row.NumericVerdict + "). Informational: EnergyPlus 25.1 does not use this face's optics, so it is not gated; it is not a MATCH and not an accepted limitation.", + result.Comparison, null, null, null, null, true); + OutOfEngineScope.Add(row); + outOfEngineScope.Add(scoped); + return scoped; + } + + private static bool InUnitInterval(double value) + { + return value >= 0 && value <= 1; + } + + private static QuantityResult Annotated(QuantityResult result, string refused) + { + return new QuantityResult(result.Input, result.Outcome, result.Status, result.Reason + " Not OUT-OF-ENGINE-SCOPE (" + OpaqueFaceScope + "): " + refused + ".", result.Comparison, result.Proposed, result.OwnerDecisionNamed, result.TechnicalBlockerNamed, result.AcceptedBy, result.IsInformational, result.InformationalElements); + } + + /// Why EnergyPlus does not use a face (S07 §5.2): the outside face of the outermost layer on an interzone, ground or adiabatic side, or a buried layer face. + private static string UnusedFaceReason(int index, int count, bool internalFace, bool firstSide, ElementKind kind, bool adiabatic) + { + if (index == 0 && internalFace != firstSide) + { + if (kind == ElementKind.Internal) + { + return "interzone surface outer face (the partner side's zone face, gated on that side)"; + } + + if (kind == ElementKind.GroundOrAdiabatic) + { + return adiabatic ? "adiabatic surface outer face" : "ground surface outer face"; + } + } + + return "buried layer face (layer " + (index + 1) + " of " + count + ", SAM " + (internalFace ? "internal" : "external") + " face)"; + } + + /// The SAM face of an opaque optical layer property (internal* / external*) and the same property's other face. + private static bool TryGetOpaqueFace(string property, out bool internalFace, out string otherFace) + { + internalFace = property.StartsWith("internal", StringComparison.Ordinal); + if (internalFace) + { + otherFace = "external" + property.Substring("internal".Length); + return true; + } + + if (property.StartsWith("external", StringComparison.Ordinal)) + { + otherFace = "internal" + property.Substring("external".Length); + return true; + } + + otherFace = null; + return false; + } + + /// + /// Whether SAM face of the layer at EnergyPlus position + /// (outside first, of ) is a face whose optics EnergyPlus uses on this side, derived + /// from SAM and the side alone (S07 section 1; EnergyPlus 25.1 I/O Reference, Material, Construction): + /// - the innermost layer's zone face. SAM lists layers inside → outside from its first space, so on the first + /// space's side the zone face is SAM's internal face, and on the second space's side SAM's external face; + /// - the outermost layer's outside face, only on an outdoor surface (an interzone outside face is the other + /// side's zone face, compared there; ground and adiabatic outside faces have no optics), which on the first + /// (only) side of an outdoor surface is SAM's external face. + /// + private static bool IsExposedOpaqueFace(int index, int count, bool internalFace, bool firstSide, ElementKind kind) + { + bool zoneFace = index == count - 1 && internalFace == firstSide; + bool outdoorFace = index == 0 && kind == ElementKind.External && internalFace != firstSide; + return zoneFace || outdoorFace; + } + + /// + /// A single-layer opaque construction whose SAM faces differ on an outdoor or interzone side: both faces are + /// used and one single-sided EnergyPlus material cannot hold both value sets. Named as unsupported (BLOCKED + /// technical, never PASS); ground and adiabatic sides use only the zone face and are compared as usual. + /// + private void SingleLayerFaces(string side, List expected, ElementKind kind) + { + if (expected.Count != 1 || kind == ElementKind.GroundOrAdiabatic || !(expected[0].Material is OpaqueMaterial)) + { + return; + } + + List differing = new List(); + foreach (string property in new[] { "SolarReflectance", "LightReflectance", "Emissivity" }) + { + ExpectedValue external = ExpectedLayerValue(expected[0], "external" + property); + ExpectedValue internalValue = ExpectedLayerValue(expected[0], "internal" + property); + if (external.State == SamInputState.Value && internalValue.State == SamInputState.Value && external.Value != internalValue.Value) + { + differing.Add(property); + } + } + + if (differing.Count > 0) + { + Unsupported.Add("optics: " + side + ": single-layer construction '" + expected[0].Name + "' needs different " + string.Join(", ", differing) + " on its two used faces; one single-sided EnergyPlus material cannot hold both"); + } + } + + private static ExpectedValue ExpectedLayerValue(ExpectedLayer layer, string property) + { + if (property == "thickness") + { + return ExpectedValue.FromValue(layer.Thickness); + } + + if (!(layer.Material is Core.Material material)) + { + return ExpectedValue.Invalid("material '" + layer.Name + "' is not in the frozen material library"); + } + + switch (property) + { + case "conductivity": return ExpectedValue.FromValue(material.ThermalConductivity); + case "density": return ExpectedValue.FromValue(material.Density); + case "specificHeat": return ExpectedValue.FromValue(material.SpecificHeatCapacity); + } + + Enum parameter = null; + if (material is TransparentMaterial) + { + switch (property) + { + case "solarTransmittance": parameter = TransparentMaterialParameter.SolarTransmittance; break; + case "lightTransmittance": parameter = TransparentMaterialParameter.LightTransmittance; break; + case "externalSolarReflectance": parameter = TransparentMaterialParameter.ExternalSolarReflectance; break; + case "internalSolarReflectance": parameter = TransparentMaterialParameter.InternalSolarReflectance; break; + case "externalLightReflectance": parameter = TransparentMaterialParameter.ExternalLightReflectance; break; + case "internalLightReflectance": parameter = TransparentMaterialParameter.InternalLightReflectance; break; + case "externalEmissivity": parameter = TransparentMaterialParameter.ExternalEmissivity; break; + case "internalEmissivity": parameter = TransparentMaterialParameter.InternalEmissivity; break; + } + } + else + { + switch (property) + { + case "externalSolarReflectance": parameter = OpaqueMaterialParameter.ExternalSolarReflectance; break; + case "internalSolarReflectance": parameter = OpaqueMaterialParameter.InternalSolarReflectance; break; + case "externalLightReflectance": parameter = OpaqueMaterialParameter.ExternalLightReflectance; break; + case "internalLightReflectance": parameter = OpaqueMaterialParameter.InternalLightReflectance; break; + case "externalEmissivity": parameter = OpaqueMaterialParameter.ExternalEmissivity; break; + case "internalEmissivity": parameter = OpaqueMaterialParameter.InternalEmissivity; break; + } + } + + if (parameter == null) + { + return ExpectedValue.Invalid("no SAM source for layer property " + property); + } + + // NaN is an unstated value (as for the lighting p): never compared as data, its provenance stays S-UNSPEC. + if (!material.TryGetValue(parameter, out double value)) + { + return ExpectedValue.Unspecified("not stated"); + } + + return double.IsNaN(value) ? ExpectedValue.Unspecified("NaN (not stated)") : ExpectedValue.FromValue(value); + } + + /// + /// A native layer property in SAM's terms. Opaque: reflectance = 1 - absorptance (no transmittance), emissivity = + /// thermal absorptance, one value for both faces. Glazing: front is the face towards the outside of the side's + /// construction, so it is SAM's external face on the first space's side and its internal face on the other. + /// + private static ReaderResult NativeLayerValue(IdfObject layer, string property, bool frontIsExternal) + { + if (layer == null) + { + return ReaderResult.Absent("no native layer"); + } + + if (layer.Type == "missing") + { + return ReaderResult.Absent("the construction names material '" + layer.Name + "', which the IDF does not define"); + } + + if (string.Equals(layer.Type, "Material", StringComparison.OrdinalIgnoreCase)) + { + switch (property) + { + case "thickness": return NativeModel.Number(layer, 2, "Thickness"); + case "conductivity": return NativeModel.Number(layer, 3, "Conductivity"); + case "density": return NativeModel.Number(layer, 4, "Density"); + case "specificHeat": return NativeModel.Number(layer, 5, "Specific Heat"); + case "externalSolarReflectance": + case "internalSolarReflectance": return OneMinus(NativeModel.Number(layer, 7, "Solar Absorptance")); + case "externalLightReflectance": + case "internalLightReflectance": return OneMinus(NativeModel.Number(layer, 8, "Visible Absorptance")); + case "externalEmissivity": + case "internalEmissivity": return NativeModel.Number(layer, 6, "Thermal Absorptance"); + } + } + + if (string.Equals(layer.Type, "WindowMaterial:Glazing", StringComparison.OrdinalIgnoreCase)) + { + bool external = property.StartsWith("external", StringComparison.Ordinal); + bool front = external == frontIsExternal; + switch (property) + { + case "thickness": return NativeModel.Number(layer, 3, "Thickness"); + case "conductivity": return NativeModel.Number(layer, 13, "Conductivity"); + case "solarTransmittance": return NativeModel.Number(layer, 4, "Solar Transmittance"); + case "lightTransmittance": return NativeModel.Number(layer, 7, "Visible Transmittance"); + case "externalSolarReflectance": + case "internalSolarReflectance": return front ? NativeModel.Number(layer, 5, "Front Side Solar Reflectance") : NativeModel.Number(layer, 6, "Back Side Solar Reflectance"); + case "externalLightReflectance": + case "internalLightReflectance": return front ? NativeModel.Number(layer, 8, "Front Side Visible Reflectance") : NativeModel.Number(layer, 9, "Back Side Visible Reflectance"); + case "externalEmissivity": + case "internalEmissivity": return front ? NativeModel.Number(layer, 11, "Front Side Infrared Hemispherical Emissivity") : NativeModel.Number(layer, 12, "Back Side Infrared Hemispherical Emissivity"); + } + } + + return ReaderResult.Unreadable("native layer " + layer.Type + " '" + layer.Name + "': property " + property + " is not read by the S09 reader"); + } + + private static ReaderResult OneMinus(ReaderResult absorptance) + { + return absorptance.HasNumber ? ReaderResult.FromValue(1 - absorptance.Value) : absorptance; + } + + private static ReaderResult NativeU(List layers, HeatFlowDirection direction, ElementKind kind) + { + if (layers == null || layers.Count == 0) + { + return ReaderResult.Absent("no native construction"); + } + + List resistances = new List(); + foreach (IdfObject layer in layers) + { + ReaderResult t = NativeLayerValue(layer, "thickness", true); + ReaderResult k = NativeLayerValue(layer, "conductivity", true); + if (!t.HasNumber || !k.HasNumber) + { + return t.HasNumber ? k : t; + } + + resistances.Add(LayerResistance.Solid(t.Value, k.Value)); + } + + ExpectedValue u = layers.Any(x => string.Equals(x.Type, "WindowMaterial:Glazing", StringComparison.OrdinalIgnoreCase)) ? EQ.ExpectedGlazingU(resistances) : EQ.ExpectedOpaqueU(resistances, direction, kind); + return u.State == SamInputState.Value ? ReaderResult.FromValue(u.Value) : ReaderResult.Unreadable("native U not derivable: " + u); + } + + private void CompareAperture(ExpectedSpace space, ExpectedAperture aperture, NativeSurface host, IdentityStatus hostIdentity, bool firstSide, List matchedSubSurfaces) + { + string key = Keys.Aperture(aperture.Guid, space.Guid); + IdfObject sub = null; + List pane = null; + List outline = null; + IdfObject frame = null; + IdentityStatus identity = IdentityStatus.Mismatch; + if (host != null) + { + List candidates = native.Idf("FenestrationSurface:Detailed").Where(x => string.Equals(x.Value(3, "Building Surface Name", out string _), host.Object.Name, StringComparison.OrdinalIgnoreCase)).ToList(); + List> outlines = new List>(); + List> panes = new List>(); + foreach (IdfObject candidate in candidates) + { + List vertices = native.Vertices(candidate, 9, native.IdfByName("Zone", host.Object.Value(3)), out string _); + IdfObject candidateFrame = native.IdfByName("WindowProperty:FrameAndDivider", candidate.Value(6, "Frame and Divider Name", out string _)); + ReaderResult width = NativeModel.Number(candidateFrame, 1, "Frame Width"); + panes.Add(vertices); + outlines.Add(vertices == null ? null : candidateFrame == null ? vertices : width.HasNumber ? OsGeometry.OffsetOutwards(vertices, width.Value) : null); + } + + // Identity by geometry: the native opening outline (the pane grown by the native frame width, as EnergyPlus + // builds the frame) is the SAM aperture outline. The name suffix may only contradict it. + GeometryMatchResult match = EQ.MatchPolygons(new List { aperture.Outer }, outlines.Select(x => OsGeometry.ToPolygon3D(x)).ToList()); + GeometryPair pair = match.PairForExpected(0); + if (pair != null) + { + sub = candidates[pair.NativeIndex]; + pane = panes[pair.NativeIndex]; + outline = outlines[pair.NativeIndex]; + frame = native.IdfByName("WindowProperty:FrameAndDivider", sub.Value(6, "Frame and Divider Name", out string _)); + matchedSubSurfaces.Add(sub); + bool carrierAgrees = sub.Name.EndsWith("_" + aperture.Guid.ToString("N").Substring(0, 8), StringComparison.OrdinalIgnoreCase); + identity = hostIdentity == IdentityStatus.Verified && carrierAgrees ? IdentityStatus.Verified : IdentityStatus.Mismatch; + } + + Supporting.Add(key + ": " + (sub == null ? "no native subsurface outline matches the SAM aperture" : "native subsurface '" + sub.Name + "' " + (frame == null ? "(no frame)" : "with frame '" + frame.Name + "'") + ", identity " + identity)); + } + + double paneArea = pane == null ? double.NaN : OsGeometry.Area(pane); + Add("1b", key + ".pane", aperture.PaneArea, sub == null ? ReaderResult.Absent("no native subsurface") : ReaderResult.FromValue(paneArea), identity); + + // EnergyPlus has no frame without a WindowProperty:FrameAndDivider: its frame area is then 0. + ReaderResult frameArea = sub == null ? ReaderResult.Absent("no native subsurface") : frame == null ? ReaderResult.FromValue(0) : outline == null ? ReaderResult.Unreadable("the frame outline could not be built") : ReaderResult.FromValue(OsGeometry.Area(outline) - paneArea); + Add("1b", key + ".frame", aperture.FrameArea, frameArea, identity); + + if (aperture.FrameLayers.Count > 0) + { + double resistance = 0; + foreach (ExpectedLayer layer in aperture.FrameLayers) + { + double conductivity = (layer.Material as Core.Material)?.ThermalConductivity ?? double.NaN; + resistance += layer.Thickness / conductivity; + } + + ExpectedValue conductance = double.IsNaN(resistance) || resistance <= 0 ? ExpectedValue.Invalid("frame layers give no resistance") : ExpectedValue.FromValue(1 / resistance); + Add("T-FRAME.conductance", key + ".frameConductance", conductance, NativeModel.Number(frame, 4, "Frame Conductance"), identity); + Supporting.Add(key + ": native frame width " + NativeModel.Number(frame, 1, "Frame Width").Value.ToString("R", ci) + " m; SAM T-FRAME OpenStudio rule: DefaultFrameWidth, else the frame layer thickness (" + aperture.FrameRule + ")"); + } + + List expectedLayers = firstSide ? Enumerable.Reverse(aperture.PaneLayers).ToList() : aperture.PaneLayers.ToList(); + List nativeLayers = LayersOf(sub?.Value(2, "Construction Name", out string _), key, sub != null); + CompareLayers(key, expectedLayers, nativeLayers, identity, true, firstSide, ElementKind.External); + Add("3c.U", key + ".U", EQ.ExpectedGlazingU(expectedLayers.Select(x => LayerResistance.Solid(x.Thickness, (x.Material as Core.Material)?.ThermalConductivity ?? double.NaN))), NativeU(nativeLayers, HeatFlowDirection.Horizontal, ElementKind.External), identity); + } + + private void Extras(List matchedSpaces, List matchedSurfaces, List matchedSubSurfaces) + { + foreach (IdfObject space in native.Idf("Space").Where(x => !matchedSpaces.Contains(x.Name, StringComparer.OrdinalIgnoreCase))) + { + Add("1a", "native:space:" + space.Name, ExpectedValue.Unspecified("no SAM space"), ReaderResult.Unreadable("native space with no SAM space"), IdentityStatus.Mismatch); + } + + foreach (IdfObject surface in native.Idf("BuildingSurface:Detailed").Where(x => !matchedSurfaces.Contains(x))) + { + Add("1b", "native:surface:" + surface.Name, ExpectedValue.Unspecified("no SAM panel"), ReaderResult.Unreadable("native surface with no SAM panel"), IdentityStatus.Mismatch); + } + + foreach (IdfObject sub in native.Idf("FenestrationSurface:Detailed").Where(x => !matchedSubSurfaces.Contains(x))) + { + Add("1b", "native:subsurface:" + sub.Name, ExpectedValue.Unspecified("no SAM aperture"), ReaderResult.Unreadable("native subsurface with no SAM aperture"), IdentityStatus.Mismatch); + } + + // Objects that add air, heat or geometry SAM never stated for these fixtures. + foreach (string type in new[] { "ZoneVentilation:DesignFlowRate", "ZoneVentilation:WindandStackOpenArea", "ZoneMixing", "ZoneCrossMixing", "AirflowNetwork:SimulationControl", "AirLoopHVAC", "GasEquipment", "HotWaterEquipment", "SteamEquipment", "OtherEquipment", "ZoneInfiltration:EffectiveLeakageArea", "ZoneInfiltration:FlowCoefficient", "InternalMass", "Wall:Detailed", "RoofCeiling:Detailed", "Floor:Detailed", "Window", "Door", "GlazedDoor", "Window:Interzone", "Door:Interzone", "GlazedDoor:Interzone", "Construction:AirBoundary" }) + { + foreach (IdfObject o in native.Idf(type)) + { + Consistency.Add("native extra: " + type + " '" + o.Name + "' (SAM states no such object)"); + } + } + + foreach (string type in new[] { "Sizing:Zone", "Shading:Building:Detailed", "Shading:Site:Detailed", "Shading:Zone:Detailed" }) + { + int count = native.Idf(type).Count(); + if (count > 0) + { + Supporting.Add("native " + type + ": " + count + " object(s)"); + } + } + } + + // ---- orientation and multiplicity ------------------------------------------------------------------------------- + + /// + /// The native building orientation against SAM intent. SAM states the building rotation only as + /// AnalyticalModelParameter.NorthAngle (radians, clockwise from true North); unstated, the writer leaves the + /// OpenStudio/EnergyPlus default 0. EnergyPlus 25.1 (GlobalGeometryRules, Zone): with Relative coordinates the + /// vertices are rotated by the Building North Axis and each Zone's Direction of Relative North (and moved by the + /// zone origin); with World coordinates neither north axis is used. S07 has no orientation row or tolerance, so only + /// the unrotated configuration is supported: SAM 0 or unstated, and a native effective rotation of exactly 0. A + /// native rotation SAM does not state FAILs; anything the reader cannot interpret blocks (BLOCKED technical). + /// + private void Orientation() + { + List facts = new List(); + double samDegrees = double.NaN; + if (model.TryGetValue(AnalyticalModelParameter.NorthAngle, out double radians) && !double.IsNaN(radians)) + { + samDegrees = radians * 180.0 / Math.PI; + } + + facts.Add("SAM North Angle " + (double.IsNaN(samDegrees) ? "unstated (writer default 0)" : samDegrees.ToString("R", ci) + " deg")); + if (!double.IsNaN(samDegrees) && samDegrees != 0) + { + Unsupported.Add("orientation: SAM states a North Angle of " + samDegrees.ToString("R", ci) + " deg; S07 has no orientation row or tolerance, so S09 supports only an unrotated model"); + } + + List rules = native.Idf("GlobalGeometryRules").ToList(); + string problem = null; + string system = rules.Count == 1 ? rules[0].Value(2, "Coordinate System", out problem) : null; + bool relative = string.Equals(system, "Relative", StringComparison.OrdinalIgnoreCase); + bool world = string.Equals(system, "World", StringComparison.OrdinalIgnoreCase) || string.Equals(system, "Absolute", StringComparison.OrdinalIgnoreCase); + if (!relative && !world) + { + Unsupported.Add("orientation: " + (rules.Count != 1 ? "the IDF has " + rules.Count + " GlobalGeometryRules objects" : "GlobalGeometryRules Coordinate System '" + system + "' is not Relative or World" + (problem == null ? string.Empty : " (" + problem + ")"))); + } + + facts.Add("Coordinate System " + (system ?? "(none)")); + + List buildings = native.Idf("Building").ToList(); + ReaderResult north = buildings.Count == 1 ? NativeModel.Number(buildings[0], 1, "North Axis") : ReaderResult.Unreadable("the IDF has " + buildings.Count + " Building objects"); + double northDegrees = Degrees(north, "IDF Building North Axis", facts); + + // The OSM must state the same building rotation as the IDF it was translated to. + IdfObject osmBuilding = native.Snapshot.OsmOf("OS:Building").SingleOrDefault(); + string osmNorth = osmBuilding?.ValueByLabel("North Axis", out bool _); + double osmDegrees = string.IsNullOrWhiteSpace(osmNorth) ? 0 : double.TryParse(osmNorth, NumberStyles.Float, ci, out double parsed) ? parsed : double.NaN; + if (osmBuilding == null || double.IsNaN(osmDegrees)) + { + Unsupported.Add("orientation: the OSM " + (osmBuilding == null ? "has no single OS:Building" : "OS:Building North Axis '" + osmNorth + "' is not a number")); + } + else if (!double.IsNaN(northDegrees) && osmDegrees != northDegrees) + { + Consistency.Add("orientation: OS:Building North Axis " + osmDegrees.ToString("R", ci) + " deg in the OSM, Building North Axis " + northDegrees.ToString("R", ci) + " deg in the IDF"); + } + + foreach (IdfObject osmSpace in native.Snapshot.OsmOf("OS:Space")) + { + foreach (string label in new[] { "Direction of Relative North", "X Origin", "Y Origin", "Z Origin" }) + { + string text = osmSpace.ValueByLabel(label, out bool _); + if (!string.IsNullOrWhiteSpace(text) && (!double.TryParse(text, NumberStyles.Float, ci, out double v) || v != 0)) + { + Unsupported.Add("orientation: OSM OS:Space '" + osmSpace.Value(1) + "' " + label + " is '" + text + "' (a space transformation is not verified by S09)"); + } + } + } + + double expected = double.IsNaN(samDegrees) ? 0 : samDegrees; + foreach (IdfObject zone in native.Idf("Zone")) + { + double zoneDegrees = Degrees(NativeModel.Number(zone, 1, "Direction of Relative North"), "Zone '" + zone.Name + "' Direction of Relative North", null); + if (world && !double.IsNaN(zoneDegrees) && zoneDegrees != 0) + { + Unsupported.Add("orientation: Zone '" + zone.Name + "' states Direction of Relative North " + zoneDegrees.ToString("R", ci) + " deg under World coordinates, where EnergyPlus does not use it"); + } + else if (relative && !double.IsNaN(zoneDegrees) && !double.IsNaN(northDegrees) && expected == 0 && northDegrees + zoneDegrees != 0) + { + Consistency.Add("orientation: Zone '" + zone.Name + "' is rotated by " + (northDegrees + zoneDegrees).ToString("R", ci) + " deg (Building North Axis " + northDegrees.ToString("R", ci) + " + Direction of Relative North " + zoneDegrees.ToString("R", ci) + "; Relative coordinates); SAM states no rotation"); + } + } + + if (world && !double.IsNaN(northDegrees) && northDegrees != 0) + { + Unsupported.Add("orientation: Building North Axis " + northDegrees.ToString("R", ci) + " deg under World coordinates, where EnergyPlus does not use it for the geometry"); + } + else if (relative && !double.IsNaN(northDegrees) && expected == 0 && northDegrees != 0 && !native.Idf("Zone").Any()) + { + Consistency.Add("orientation: Building North Axis " + northDegrees.ToString("R", ci) + " deg; SAM states no rotation"); + } + + Supporting.Add("orientation: " + string.Join("; ", facts) + (Unsupported.Any(x => x.StartsWith("orientation", StringComparison.Ordinal)) || Consistency.Any(x => x.StartsWith("orientation", StringComparison.Ordinal)) ? string.Empty : ": the native building is unrotated, as SAM states")); + } + + /// A rotation field in degrees: blank is the EnergyPlus default 0; unreadable, NaN or non-finite blocks the fixture. + private double Degrees(ReaderResult field, string what, List facts) + { + facts?.Add(what + (field.Kind == ReaderKind.Absent ? " blank (EnergyPlus default 0)" : field.HasNumber ? " " + field.Value.ToString("R", ci) + " deg" : " " + field.Kind)); + if (field.Kind == ReaderKind.Absent) + { + return 0; + } + + if (!field.HasNumber || double.IsInfinity(field.Value)) + { + Unsupported.Add("orientation: " + what + " is " + field.Kind + (field.Detail == null ? string.Empty : " (" + field.Detail + ")")); + return double.NaN; + } + + return field.Value; + } + + /// + /// Native multiplicity against SAM intent. SAM has no zone, zone-list or aperture multiplier: each SAM space and + /// aperture is one physical object, and every S07 row compares that one object. EnergyPlus 25.1: a Zone Multiplier + /// multiplies the zone's floor area, loads and internal-gain energy (default 1); a ZoneGroup multiplies a zone list + /// on top of it; a subsurface Multiplier multiplies the window area, frame and divider included (default 1, + /// non-integers truncated). Blank is read as that documented default, never assumed. Any effective multiplier other + /// than 1 contradicts SAM and FAILs; a field the reader cannot interpret blocks (BLOCKED technical). The OSM and IDF + /// multipliers are compared only through each IDF object's one OSM counterpart (). + /// + private void Multiplicity() + { + int zones = 0, subSurfaces = 0, matchedZones = 0, matchedSubSurfaces = 0; + foreach (IdfObject zone in native.Idf("Zone")) + { + zones++; + double multiplier = Multiplier(NativeModel.Number(zone, 6, "Multiplier"), "IDF Zone '" + zone.Name + "' Multiplier"); + if (multiplier != 1 && !double.IsNaN(multiplier)) + { + Consistency.Add("multiplicity: IDF Zone '" + zone.Name + "' Multiplier " + multiplier.ToString("R", ci) + ": EnergyPlus multiplies the zone's floor area, loads and internal gains; SAM states one space and no multiplier"); + } + + IdfObject osmZone = OsmCounterpart("OS:ThermalZone", "IDF Zone", zone.Name); + double osmMultiplier = osmZone == null ? double.NaN : OsmMultiplier(osmZone, 2, "OSM OS:ThermalZone '" + zone.Name + "' Multiplier"); + if (osmZone != null && !double.IsNaN(osmMultiplier) && !double.IsNaN(multiplier) && osmMultiplier != multiplier) + { + Consistency.Add("multiplicity: zone '" + zone.Name + "' Multiplier " + osmMultiplier.ToString("R", ci) + " in the OSM, " + multiplier.ToString("R", ci) + " in the IDF"); + } + + matchedZones += osmZone == null ? 0 : 1; + } + + foreach (IdfObject group in native.Idf("ZoneGroup")) + { + double multiplier = Multiplier(NativeModel.Number(group, 2, "Zone List Multiplier"), "IDF ZoneGroup '" + group.Name + "' Zone List Multiplier"); + if (multiplier != 1 && !double.IsNaN(multiplier)) + { + Consistency.Add("multiplicity: IDF ZoneGroup '" + group.Name + "' multiplies zone list '" + group.Value(1) + "' by " + multiplier.ToString("R", ci) + "; SAM states no multiplier"); + } + } + + foreach (IdfObject sub in native.Idf("FenestrationSurface:Detailed")) + { + subSurfaces++; + double multiplier = Multiplier(NativeModel.Number(sub, 7, "Multiplier"), "IDF FenestrationSurface:Detailed '" + sub.Name + "' Multiplier"); + if (multiplier != 1 && !double.IsNaN(multiplier)) + { + Consistency.Add("multiplicity: IDF FenestrationSurface:Detailed '" + sub.Name + "' Multiplier " + multiplier.ToString("R", ci) + ": EnergyPlus multiplies its area (frame and divider included); SAM states one aperture and no multiplier"); + } + + IdfObject osmSub = OsmCounterpart("OS:SubSurface", "IDF FenestrationSurface:Detailed", sub.Name); + double osmMultiplier = osmSub == null ? double.NaN : OsmMultiplier(osmSub, 8, "OSM OS:SubSurface '" + sub.Name + "' Multiplier"); + if (osmSub != null && !double.IsNaN(osmMultiplier) && !double.IsNaN(multiplier) && osmMultiplier != multiplier) + { + Consistency.Add("multiplicity: subsurface '" + sub.Name + "' Multiplier " + osmMultiplier.ToString("R", ci) + " in the OSM, " + multiplier.ToString("R", ci) + " in the IDF"); + } + + matchedSubSurfaces += osmSub == null ? 0 : 1; + } + + Supporting.Add("multiplicity: " + zones + " IDF zone(s) (" + matchedZones + " with their OS:ThermalZone), " + native.Idf("ZoneGroup").Count() + " ZoneGroup(s), " + subSurfaces + " IDF subsurface(s) (" + matchedSubSurfaces + " with their OS:SubSurface) read; blank multipliers are the EnergyPlus default 1" + (Consistency.Any(x => x.StartsWith("multiplicity", StringComparison.Ordinal)) || Unsupported.Any(x => x.StartsWith("multiplicity", StringComparison.Ordinal)) ? string.Empty : "; every effective multiplier is 1, as SAM states")); + } + + /// + /// The one OSM object of the IDF object was translated from (the + /// translator keeps the name). Consistency is claimed only against that unambiguous counterpart; a missing object is + /// never read as a present one with default fields. When every OSM object of the type has a readable Name and none + /// is , the counterpart is proven missing: Consistency (FAIL). A duplicate name, or an + /// object whose Name the reader cannot read, leaves the identity unproven: Unsupported (BLOCKED technical). Null + /// unless exactly one counterpart is identified. + /// + private IdfObject OsmCounterpart(string type, string idfWhat, string name) + { + List matches = new List(); + List unreadable = new List(); + int count = 0; + foreach (IdfObject o in native.Snapshot.OsmOf(type)) + { + count++; + string osmName = o.Value(1, "Name", out string problem); + if (problem != null || string.IsNullOrWhiteSpace(osmName)) + { + unreadable.Add(problem ?? type + " " + o.Value(0) + " has no Name"); + } + else if (string.Equals(osmName, name, StringComparison.OrdinalIgnoreCase)) + { + matches.Add(o); + } + } + + if (unreadable.Count > 0) + { + Unsupported.Add("multiplicity: the OSM counterpart of " + idfWhat + " '" + name + "' cannot be identified: " + string.Join("; ", unreadable)); + return null; + } + + if (matches.Count > 1) + { + Unsupported.Add("multiplicity: the OSM counterpart of " + idfWhat + " '" + name + "' is ambiguous: " + matches.Count + " " + type + " objects carry that name"); + return null; + } + + if (matches.Count == 0) + { + Consistency.Add("multiplicity: " + idfWhat + " '" + name + "' has no " + type + " in the OSM (none of its " + count + " " + type + " object(s) has that name); the OSM and IDF disagree"); + return null; + } + + return matches[0]; + } + + /// A multiplier field: blank is the documented default 1; a non-integer, non-positive or unreadable value blocks the fixture. + private double Multiplier(ReaderResult field, string what) + { + if (field.Kind == ReaderKind.Absent) + { + return 1; + } + + if (!field.HasNumber || field.Value <= 0 || field.Value != Math.Floor(field.Value) || double.IsInfinity(field.Value)) + { + Unsupported.Add("multiplicity: " + what + " is " + field.Kind + (field.HasNumber ? " " + field.Value.ToString("R", ci) : field.Detail == null ? string.Empty : " (" + field.Detail + ")") + ": not a positive integer"); + return double.NaN; + } + + return field.Value; + } + + /// + /// The Multiplier of an OSM counterpart, read at its known position (, after the handle) + /// under the file's own label. Blank is the documented default 1; a field the object does not have, or one labelled + /// otherwise, is an unknown layout and blocks the fixture (never read as the default). + /// + private double OsmMultiplier(IdfObject o, int index, string what) + { + if (index >= o.Fields.Count) + { + Unsupported.Add("multiplicity: " + what + " is missing: " + o.Type + " '" + o.Value(1) + "' has " + o.Fields.Count + " fields, so the layout is not the one S09 reads"); + return double.NaN; + } + + return Multiplier(NativeModel.Number(o, index, "Multiplier"), what); + } + + // ---- internal condition ----------------------------------------------------------------------------------------- + + /// The native spaces a load object applies to (its target may be a Space, SpaceList, Zone or ZoneList). + private HashSet Targets(string target) + { + HashSet result = new HashSet(StringComparer.OrdinalIgnoreCase); + if (string.IsNullOrWhiteSpace(target)) + { + return result; + } + + IdfObject spaceList = native.IdfByName("SpaceList", target); + if (spaceList != null) + { + foreach (IdfField field in spaceList.Fields.Skip(1)) + { + result.Add(field.Value); + } + + return result; + } + + if (native.IdfByName("Space", target) != null) + { + result.Add(target); + return result; + } + + List zones = new List(); + IdfObject zoneList = native.IdfByName("ZoneList", target); + if (zoneList != null) + { + zones.AddRange(zoneList.Fields.Skip(1).Select(x => x.Value)); + } + else if (native.IdfByName("Zone", target) != null) + { + zones.Add(target); + } + + foreach (IdfObject space in native.Idf("Space").Where(x => zones.Contains(x.Value(1), StringComparer.OrdinalIgnoreCase))) + { + result.Add(space.Name); + } + + return result; + } + + private List LoadsOf(string type, string nativeSpace) + { + return nativeSpace == null ? new List() : native.Idf(type).Where(x => Targets(x.Value(1)).Contains(nativeSpace)).ToList(); + } + + private static double Parameter(ExpectedSpace space, string name) + { + return space.Parameters.TryGetValue(name, out double value) ? value : double.NaN; + } + + private static double People(ExpectedSpace space) + { + if (!double.IsNaN(space.Occupancy)) + { + return space.Occupancy; + } + + double areaPerPerson = Parameter(space, "AreaPerPerson"); + return double.IsNaN(areaPerPerson) || areaPerPerson <= 0 || double.IsNaN(space.StoredArea) ? double.NaN : space.StoredArea / areaPerPerson; + } + + /// A SAM gain total in W: perArea x stored Area + absolute + perPerson x people (S07 row 4b, as S08). + private static double GainTotal(ExpectedSpace space, string perArea, string absolute, string perPerson) + { + double[] terms = + { + perArea == null ? double.NaN : Parameter(space, perArea) * space.StoredArea, + absolute == null ? double.NaN : Parameter(space, absolute), + perPerson == null ? double.NaN : Parameter(space, perPerson) * People(space) + }; + + return terms.All(double.IsNaN) ? double.NaN : terms.Where(x => !double.IsNaN(x)).Sum(); + } + + private void CompareInternalCondition(ExpectedSpace space, string nativeSpace, IdfObject zone, ReaderResult floorArea, ReaderResult volume, IdentityStatus identity, ModelInterpretation interpretation) + { + Guid g = space.Guid; + double people = People(space); + + // --- occupancy --- + List peopleObjects = LoadsOf("People", nativeSpace); + IdfObject peopleObject = peopleObjects.Count == 1 ? peopleObjects[0] : null; + ReaderResult peopleDensity = peopleObjects.Count > 1 ? ReaderResult.Unreadable(peopleObjects.Count + " People objects apply to the space") : PeopleDensity(peopleObject, floorArea); + Add("4a.people", Keys.Ic(g, "people"), EQ.ExpectedPeopleDensity(space.Occupancy, Parameter(space, "AreaPerPerson"), space.StoredArea), peopleDensity, identity); + + NativeSchedule activity = native.IdfSchedule(peopleObject?.Value(9, "Activity Level Schedule Name", out string _)); + ReaderResult activityLevel = Constant(activity, "activity level"); + ReaderResult shf = NativeModel.Number(peopleObject, 8, "Sensible Heat Fraction"); + ReaderResult perPersonTotal = EQ.Multiply(peopleDensity, activityLevel); + ReaderResult sensibleDensity = EQ.Multiply(perPersonTotal, shf); + ReaderResult latentDensity = shf.HasNumber ? EQ.Multiply(perPersonTotal, ReaderResult.FromValue(1 - shf.Value)) : EQ.Multiply(perPersonTotal, shf); + Gain("occupancySensible", g, GainTotal(space, null, null, "OccupancySensibleGainPerPerson"), space.StoredArea, sensibleDensity, floorArea, identity, peopleObject != null); + Gain("occupancyLatent", g, GainTotal(space, null, null, "OccupancyLatentGainPerPerson"), space.StoredArea, latentDensity, floorArea, identity, peopleObject != null); + Fraction("occupancy.radiant", g, Parameter(space, "OccupancyRadiantProportion"), 0.3, NativeModel.Number(peopleObject, 7, "Fraction Radiant"), identity); + Schedule("occupancy", g, space, "ticOSG", peopleObject == null ? null : peopleObject.Value(2, "Number of People Schedule Name", out string _), identity, null); + + // --- lighting --- + List lights = LoadsOf("Lights", nativeSpace); + IdfObject light = lights.Count == 1 ? lights[0] : null; + ReaderResult lightDensity = lights.Count > 1 ? ReaderResult.Unreadable(lights.Count + " Lights objects apply to the space") : DesignDensity(light, floorArea, peopleDensity, 4, 5, 6, "Lighting Level", "Watts per Floor Area", "Watts per Person", 1); + Gain("lighting", g, GainTotal(space, "LightingGainPerArea", "LightingGain", "LightingGainPerPerson"), space.StoredArea, lightDensity, floorArea, identity, light != null); + LightingSplit(g, Parameter(space, "LightingRadiantProportion"), light, identity); + Schedule("lighting", g, space, "ticLG", light?.Value(2, "Schedule Name", out string _), identity, null); + + // --- equipment: the sensible instance (no latent fraction) and the latent one (Fraction Latent = 1) --- + List equipment = LoadsOf("ElectricEquipment", nativeSpace); + List sensible = equipment.Where(x => { ReaderResult fl = NativeModel.Number(x, 7, "Fraction Latent"); return fl.Kind == ReaderKind.Absent || fl.Kind == ReaderKind.Zero; }).ToList(); + List latent = equipment.Where(x => { ReaderResult fl = NativeModel.Number(x, 7, "Fraction Latent"); return fl.HasNumber && fl.Value == 1; }).ToList(); + foreach (IdfObject other in equipment.Except(sensible).Except(latent)) + { + Consistency.Add(Keys.Space(g) + ": ElectricEquipment '" + other.Name + "' mixes sensible and latent gain (not a SAM writer form)"); + } + + IdfObject sensibleObject = sensible.Count == 1 ? sensible[0] : null; + IdfObject latentObject = latent.Count == 1 ? latent[0] : null; + ReaderResult sensibleEquipment = sensible.Count > 1 ? ReaderResult.Unreadable(sensible.Count + " sensible ElectricEquipment objects apply") : EQ.Multiply(DesignDensity(sensibleObject, floorArea, peopleDensity, 4, 5, 6, "Design Level", "Watts per Floor Area", "Watts per Person", 1), OneMinusLost(sensibleObject)); + ReaderResult latentEquipment = latent.Count > 1 ? ReaderResult.Unreadable(latent.Count + " latent ElectricEquipment objects apply") : DesignDensity(latentObject, floorArea, peopleDensity, 4, 5, 6, "Design Level", "Watts per Floor Area", "Watts per Person", 1); + Gain("equipmentSensible", g, GainTotal(space, "EquipmentSensibleGainPerArea", "EquipmentSensibleGain", "EquipmentSensibleGainPerPerson"), space.StoredArea, sensibleEquipment, floorArea, identity, sensibleObject != null); + Gain("equipmentLatent", g, GainTotal(space, "EquipmentLatentGainPerArea", "EquipmentLatentGain", null), space.StoredArea, latentEquipment, floorArea, identity, latentObject != null); + Fraction("equipment.radiant", g, Parameter(space, "EquipmentRadiantProportion"), 0, NativeModel.Number(sensibleObject, 8, "Fraction Radiant"), identity); + Schedule("equipmentSensible", g, space, "ticESG", sensibleObject?.Value(2, "Schedule Name", out string _), identity, null); + Schedule("equipmentLatent", g, space, "ticELG", latentObject?.Value(2, "Schedule Name", out string _), identity, null); + + // --- infiltration (7a, 7b) --- + List infiltrations = LoadsOf("ZoneInfiltration:DesignFlowRate", nativeSpace); + IdfObject infiltration = infiltrations.Count == 1 ? infiltrations[0] : null; + ReaderResult ach = infiltrations.Count > 1 ? ReaderResult.Unreadable(infiltrations.Count + " infiltration objects apply") : Infiltration(infiltration, g); + double expectedAch = Parameter(space, "InfiltrationAirChangesPerHour"); + Add("7a", Keys.Ic(g, "infiltration"), ExpectedValue.FromValue(expectedAch), ach, identity); + Add("7b", Keys.Ic(g, "infiltration"), EQ.ExpectedInfiltrationFlow(expectedAch, space.ShellVolume?.State == SamInputState.Value ? space.ShellVolume.Value : double.NaN), EQ.Multiply(ach, volume, 1 / 3600.0), identity, interpretation); + Schedule("infiltration", g, space, "ticI", infiltration?.Value(2, "Schedule Name", out string _), identity, null); + + // --- setpoints (5) --- + IdfObject dual = null; + IdfObject thermostat = native.Idf("ZoneControl:Thermostat").FirstOrDefault(x => string.Equals(x.Value(1, "Zone or ZoneList Name", out string _), zone?.Name, StringComparison.OrdinalIgnoreCase)); + if (thermostat != null) + { + ReaderResult controlType = Constant(native.IdfSchedule(thermostat.Value(2, "Control Type Schedule Name", out string _)), "thermostat control type"); + for (int i = 3; i + 1 < thermostat.Fields.Count; i += 2) + { + if (string.Equals(thermostat.Value(i), "ThermostatSetpoint:DualSetpoint", StringComparison.OrdinalIgnoreCase)) + { + dual = native.IdfByName("ThermostatSetpoint:DualSetpoint", thermostat.Value(i + 1)); + } + } + + if (!controlType.HasNumber || controlType.Value != 4) + { + Consistency.Add(Keys.Space(g) + ": thermostat control type is not constant 4 (dual setpoint): " + controlType.Kind + " " + controlType.Value.ToString("R", ci)); + } + } + + Setpoint("heating", "5.temperature", g, space, "ticLL", dual?.Value(1, "Heating Setpoint Temperature Schedule Name", out string _), identity); + Setpoint("cooling", "5.temperature", g, space, "ticUL", dual?.Value(2, "Cooling Setpoint Temperature Schedule Name", out string _), identity); + + IdfObject humidistat = native.Idf("ZoneControl:Humidistat").FirstOrDefault(x => string.Equals(x.Value(1, "Zone Name", out string _), zone?.Name, StringComparison.OrdinalIgnoreCase)); + Setpoint("humidification", "5.humidity", g, space, "ticHLL", humidistat?.Value(2, "Humidifying Relative Humidity Setpoint Schedule Name", out string _), identity); + Setpoint("dehumidification", "5.humidity", g, space, "ticHUL", humidistat?.Value(3, "Dehumidifying Relative Humidity Setpoint Schedule Name", out string _), identity); + + // --- ventilation (6 ventilation, 8a, 8b) --- + CompareVentilation(space, nativeSpace, zone, floorArea, volume, peopleDensity, identity, interpretation); + } + + private ReaderResult PeopleDensity(IdfObject peopleObject, ReaderResult floorArea) + { + if (peopleObject == null) + { + return ReaderResult.Absent("no People object applies to the space"); + } + + string method = peopleObject.Value(3, "Number of People Calculation Method", out string problem); + if (problem != null) + { + return ReaderResult.Unreadable(problem); + } + + switch ((method ?? string.Empty).ToLowerInvariant()) + { + case "people/area": + return NativeModel.Number(peopleObject, 5, "People per Floor Area"); + case "area/person": + ReaderResult areaPerPerson = NativeModel.Number(peopleObject, 6, "Floor Area per Person"); + return areaPerPerson.HasNumber && areaPerPerson.Value > 0 ? ReaderResult.FromValue(1 / areaPerPerson.Value) : areaPerPerson; + case "people": + ReaderResult count = NativeModel.Number(peopleObject, 4, "Number of People"); + return count.HasNumber && floorArea.HasNumber && floorArea.Value > 0 ? ReaderResult.FromValue(count.Value / floorArea.Value) : ReaderResult.Unreadable("People count without a native floor area"); + default: + return ReaderResult.Unreadable("People calculation method '" + method + "' is not read"); + } + } + + /// A design level in W/m2 by the object's calculation method (field 3). + private static ReaderResult DesignDensity(IdfObject o, ReaderResult floorArea, ReaderResult peopleDensity, int levelField, int perAreaField, int perPersonField, string levelLabel, string perAreaLabel, string perPersonLabel, double scale) + { + if (o == null) + { + return ReaderResult.Absent("no native object applies to the space"); + } + + string method = o.Value(3, "Design Level Calculation Method", out string problem); + if (problem != null) + { + return ReaderResult.Unreadable(problem); + } + + switch ((method ?? string.Empty).ToLowerInvariant()) + { + case "watts/area": + return NativeModel.Number(o, perAreaField, perAreaLabel); + case "watts/person": + return EQ.Multiply(NativeModel.Number(o, perPersonField, perPersonLabel), peopleDensity, scale); + case "lightinglevel": + case "equipmentlevel": + ReaderResult level = NativeModel.Number(o, levelField, levelLabel); + return level.HasNumber && floorArea.HasNumber && floorArea.Value > 0 ? ReaderResult.FromValue(level.Value / floorArea.Value) : ReaderResult.Unreadable("design level without a native floor area"); + default: + return ReaderResult.Unreadable("calculation method '" + method + "' is not read"); + } + } + + private static ReaderResult OneMinusLost(IdfObject o) + { + if (o == null) + { + return ReaderResult.Absent("no native object"); + } + + ReaderResult lost = NativeModel.Number(o, 9, "Fraction Lost"); + return lost.Kind == ReaderKind.Absent ? ReaderResult.FromValue(1) : lost.HasNumber ? ReaderResult.FromValue(1 - lost.Value) : lost; + } + + private static ReaderResult Constant(NativeSchedule schedule, string what) + { + if (schedule == null) + { + return ReaderResult.Absent("no " + what + " schedule"); + } + + if (schedule.Values == null) + { + return ReaderResult.Unreadable(what + " schedule: " + schedule.Problem); + } + + double first = schedule.Values[0]; + return schedule.Values.All(x => x == first) ? ReaderResult.FromValue(first) : ReaderResult.Unreadable(what + " schedule '" + schedule.Name + "' is not constant"); + } + + private void Gain(string what, Guid space, double total, double storedArea, ReaderResult density, ReaderResult floorArea, IdentityStatus identity, bool nativePresent) + { + ExpectedValue expectedDensity = EQ.ExpectedGainDensity(total, storedArea); + ExpectedValue expectedTotal = ExpectedValue.FromValue(total); + + // T-OMIT0: the writer omits a gain whose SAM total is <= 0; verified only when no such object exists. + string omitted = !nativePresent && expectedTotal.State == SamInputState.Zero ? "T-OMIT0" : null; + Add("4a.density", Keys.Ic(space, what), expectedDensity, density, identity, ModelInterpretation.NotRequired, omitted); + Add("4b", Keys.Ic(space, what + ".total"), expectedTotal, EQ.Multiply(density, floorArea), identity, ModelInterpretation.NotRequired, omitted); + } + + private void Fraction(string what, Guid space, double authored, double listedDefault, ReaderResult nativeValue, IdentityStatus identity) + { + QuantityInput input = new QuantityInput + { + Definition = QuantityCatalog.Get("4c"), + FixtureId = FixtureId, + ObjectKey = Keys.Ic(space, what), + Expected = double.IsNaN(authored) ? ExpectedValue.Unspecified("not authored; the writer default is " + listedDefault.ToString("R", ci)) : ExpectedValue.FromValue(authored), + Native = nativeValue, + Identity = identity, + ListedDefault = listedDefault + }; + + Results.Add(EQ.Evaluate(input, Configuration)); + } + + /// + /// S07 §5.1 T-LIGHT-SPLIT on the IDF Lights object: Return Air Fraction (blank reads as 0) against 0, exact; + /// Fraction Radiant + Fraction Visible against p; Fraction Visible against p·s; Fraction Radiant against p·(1 − s); the + /// convective remainder 1 − F_RA − F_R − F_V against 1 − p. Expectations come from the raw SAM p and the §5.1 + /// constants only (), never from the writer or the view coefficient. + /// An authored p (including 0) is verified as an accepted transformation. An absent or NaN p stays S-UNSPEC on every + /// row, with the contract-listed default (p₀ split) as the listed default: DOCUMENTED-DEFAULT at best, never PASS. + /// A p outside [0, 1] is S-INVALID. + /// + /// Two guards run before any S07 tolerance is applied, so a tolerance can never accept an invalid or dynamic split: + /// + /// + /// Native domain and energy conservation (): each of + /// Return Air, Radiant and Visible within [0, 1] and their sum at most 1 (S07 §5.1: "A sum above 1 is an input + /// error"). A violation is an EXPORT-DEFECT on all five rows, with the violation named; nothing is compared. + /// Plenum-calculated return air (): blank or No, the + /// EnergyPlus default, is the static split S07 describes. Yes makes the return-air share follow the plenum + /// temperature at run time, so no static T-LIGHT-SPLIT can be verified; any other or unreadable setting is + /// uninterpretable. Either way every lighting row is UNVERIFIED (unreadable, BLOCKED technical) and the space is + /// named in . + /// + /// + private void LightingSplit(Guid space, double p, IdfObject light, IdentityStatus identity) + { + double s = OsQuantities.LightingShortWaveShare; + double p0 = OsQuantities.LightingReferenceRadiantProportion; + + // A blank field of a present Lights object is its EnergyPlus IDD default, 0 for all three (S07: "blank reads as + // 0"). Read as 0, a blank cannot pass as native absence (NOT-APPLICABLE) for an unstated p. + ReaderResult Field(int index, string label) + { + ReaderResult value = NativeModel.Number(light, index, label); + return light != null && value.Kind == ReaderKind.Absent ? ReaderResult.FromValue(0) : value; + } + + ReaderResult returnAir = Field(7, "Return Air Fraction"); + ReaderResult radiant = Field(8, "Fraction Radiant"); + ReaderResult visible = Field(9, "Fraction Visible"); + ReaderResult total = Combine(new[] { radiant, visible }, x => x[0] + x[1]); + ReaderResult convective = Combine(new[] { returnAir, radiant, visible }, x => 1 - x[0] - x[1] - x[2]); + + string domain = LightsDomainProblem(light, returnAir, radiant, visible); + string plenum = LightsPlenumProblem(light); + if (plenum != null) + { + Unsupported.Add("lighting: " + Keys.Space(space) + ": " + plenum); + ReaderResult dynamic = ReaderResult.Unreadable(plenum); + returnAir = radiant = visible = total = convective = dynamic; + } + + void Row(string what, QuantityDefinition definition, Func expected, ReaderResult nativeValue) + { + ExpectedValue value; + if (double.IsNaN(p)) + { + value = ExpectedValue.Unspecified("LightingRadiantProportion not authored; the S07 §5.1 listed default is p0 = " + p0.ToString("R", ci)); + } + else if (p < 0 || p > 1) + { + value = ExpectedValue.Invalid("LightingRadiantProportion " + p.ToString("R", ci) + " is not a fraction between 0 and 1"); + } + else + { + value = ExpectedValue.FromValue(expected(p)); + } + + QuantityInput input = new QuantityInput + { + Definition = definition, + FixtureId = FixtureId, + ObjectKey = Keys.Ic(space, what), + Expected = value, + Native = nativeValue, + Identity = identity, + ListedDefault = expected(p0), + TransformationId = LightSplit, + TransformationVerified = plenum == null + }; + + // An invalid native split is decided before, and instead of, the numeric comparison. + Results.Add(domain != null + ? new QuantityResult(input, EquivalenceOutcome.ExportDefect, GateStatus.Fail, "The native Lights split is invalid (" + domain + "); it is not compared, and no tolerance applies.", null, null, null, null, null) + : EQ.Evaluate(input, Configuration)); + } + + Row(LayerProperties.LightingReturnAir, OsQuantities.LightingReturnAir, x => 0, returnAir); + Row("lighting.radiantTotal", QuantityCatalog.Get("4c"), x => x, total); + Row("lighting.visible", QuantityCatalog.Get("4c"), x => x * s, visible); + Row("lighting.radiant", QuantityCatalog.Get("4c"), x => x * (1 - s), radiant); + Row("lighting.convective", QuantityCatalog.Get("4c"), x => 1 - x, convective); + } + + /// + /// The native-domain guard of T-LIGHT-SPLIT: null when every readable fraction of the Lights object lies in [0, 1] and + /// Return Air + Radiant + Visible is at most 1; otherwise the violation, named. Unreadable and NaN fields are left to + /// the row evaluation. absorbs only the rounding of decimal IDF + /// text to double at the bounds 0 and 1; it is no S07 tolerance and never widens one. + /// + private static string LightsDomainProblem(IdfObject light, ReaderResult returnAir, ReaderResult radiant, ReaderResult visible) + { + if (light == null) + { + return null; + } + + double e = OsQuantities.LightingFractionBoundary; + List problems = new List(); + foreach ((string label, ReaderResult value) in new[] { ("Return Air Fraction", returnAir), ("Fraction Radiant", radiant), ("Fraction Visible", visible) }) + { + if (value.HasNumber && (value.Value < -e || value.Value > 1 + e)) + { + problems.Add("Lights '" + light.Name + "' " + label + " " + value.Value.ToString("R", ci) + " is outside [0, 1]"); + } + } + + if (returnAir.HasNumber && radiant.HasNumber && visible.HasNumber) + { + double sum = returnAir.Value + radiant.Value + visible.Value; + if (sum > 1 + e) + { + problems.Add("Lights '" + light.Name + "' Return Air + Radiant + Visible = " + sum.ToString("R", ci) + " exceeds 1, a negative convective share (S07 §5.1: a sum above 1 is an input error)"); + } + } + + return problems.Count == 0 ? null : string.Join("; ", problems); + } + + /// + /// The Lights "Return Air Fraction Calculated from Plenum Temperature" setting (index 12, counting Name as 0): null for blank, absent or + /// No (the EnergyPlus default, a static return-air share); otherwise why no static T-LIGHT-SPLIT can be verified. + /// + private static string LightsPlenumProblem(IdfObject light) + { + if (light == null) + { + return null; + } + + const string label = "Return Air Fraction Calculated from Plenum Temperature"; + string text = light.Value(12, label, out string problem); + if (problem != null) + { + return "Lights '" + light.Name + "' " + label + " is unreadable (" + problem + "); the return-air setting cannot be interpreted, so T-LIGHT-SPLIT is not verified"; + } + + if (string.IsNullOrWhiteSpace(text) || string.Equals(text.Trim(), "No", StringComparison.OrdinalIgnoreCase)) + { + return null; + } + + return string.Equals(text.Trim(), "Yes", StringComparison.OrdinalIgnoreCase) + ? "Lights '" + light.Name + "' " + label + " = Yes: the return-air share follows the plenum temperature at run time, so a static T-LIGHT-SPLIT cannot be verified (unsupported by S09)" + : "Lights '" + light.Name + "' " + label + " = '" + text + "' is neither Yes nor No (uninterpretable), so T-LIGHT-SPLIT is not verified"; + } + + /// A quantity derived from native fields: absent, unreadable or NaN when any input is; otherwise the value. + private static ReaderResult Combine(ReaderResult[] inputs, Func combine) + { + ReaderResult problem = inputs.FirstOrDefault(x => x.Kind == ReaderKind.Unreadable) ?? inputs.FirstOrDefault(x => x.Kind == ReaderKind.NaN) ?? inputs.FirstOrDefault(x => x.Kind == ReaderKind.Absent); + return problem ?? ReaderResult.FromValue(combine(inputs.Select(x => x.Value).ToArray())); + } + + private ReaderResult Infiltration(IdfObject infiltration, Guid space) + { + if (infiltration == null) + { + return ReaderResult.Absent("no infiltration object applies to the space"); + } + + string method = infiltration.Value(3, "Design Flow Rate Calculation Method", out string problem); + if (problem != null || !string.Equals(method, "AirChanges/Hour", StringComparison.OrdinalIgnoreCase)) + { + return ReaderResult.Unreadable(problem ?? "infiltration method '" + method + "' is not AirChanges/Hour"); + } + + // EnergyPlus defaults (blank) are A = 1, B = C = D = 0: a constant design flow. Anything else changes the flow. + string[] labels = { "Constant Term Coefficient", "Temperature Term Coefficient", "Velocity Term Coefficient", "Velocity Squared Term Coefficient" }; + double[] neutral = { 1, 0, 0, 0 }; + for (int i = 0; i < 4; i++) + { + ReaderResult coefficient = NativeModel.Number(infiltration, 8 + i, labels[i]); + if (coefficient.Kind != ReaderKind.Absent && (!coefficient.HasNumber || coefficient.Value != neutral[i])) + { + Consistency.Add(Keys.Space(space) + ": infiltration " + labels[i] + " is " + coefficient.Kind + " " + coefficient.Value.ToString("R", ci) + ", not the constant-flow value " + neutral[i]); + } + } + + return NativeModel.Number(infiltration, 7, "Air Changes per Hour"); + } + + // ---- schedules and setpoints ------------------------------------------------------------------------------------ + + private NativeSchedule CheckedSchedule(string name, string key) + { + if (string.IsNullOrWhiteSpace(name)) + { + return null; + } + + NativeSchedule idf = native.IdfSchedule(name); + NativeSchedule osm = native.OsmSchedule(name); + if (idf == null) + { + // A reference to an undefined object is a broken export (EnergyPlus would stop), not an unreadable field. + Consistency.Add(key + ": names schedule '" + name + "', which the IDF does not define"); + return new NativeSchedule { Name = name, Problem = "the IDF does not define schedule '" + name + "'" }; + } + + // The OSM holds the same schedule as an OS:Schedule:FixedInterval: both native views must agree hour by hour. + if (osm != null && osm.Values != null && idf.Values != null && !osm.Values.SequenceEqual(idf.Values)) + { + int first = Enumerable.Range(0, Math.Min(osm.Values.Length, idf.Values.Length)).FirstOrDefault(i => osm.Values[i] != idf.Values[i]); + Consistency.Add(key + ": schedule '" + name + "' differs between the OSM and the IDF (first at hour " + first + ")"); + } + + return idf; + } + + private void Schedule(string what, Guid space, ExpectedSpace expectedSpace, string slot, string nativeName, IdentityStatus identity, string inactive) + { + string key = Keys.Ic(space, "schedule." + what); + expectedSpace.Profiles.TryGetValue(slot, out ExpectedProfile profile); + NativeSchedule schedule = CheckedSchedule(nativeName, key); + ScheduleRows(key, profile, schedule, identity, inactive, 1, "6.hourly", "6.eflh"); + } + + private void Setpoint(string what, string quantityId, Guid space, ExpectedSpace expectedSpace, string slot, string nativeName, IdentityStatus identity) + { + string key = Keys.Ic(space, what); + expectedSpace.Profiles.TryGetValue(slot, out ExpectedProfile profile); + NativeSchedule schedule = CheckedSchedule(nativeName, key); + ScheduleRows(key, profile, schedule, identity, null, 1, quantityId, null); + } + + private void ScheduleRows(string key, ExpectedProfile profile, NativeSchedule schedule, IdentityStatus identity, string inactive, double scale, string hourlyId, string eflhId) + { + AlignmentStatus alignment = Alignment(schedule); + if (profile == null && schedule == null) + { + Add(hourlyId, key, ExpectedValue.Unspecified("SAM selects no profile"), ReaderResult.Absent("no native schedule"), identity); + if (eflhId != null) + { + Add(eflhId, key, ExpectedValue.Unspecified("SAM selects no profile"), ReaderResult.Absent("no native schedule"), identity); + } + + return; + } + + if (profile != null && !profile.Expanded.IsOk) + { + Add(hourlyId, key, ExpectedValue.Invalid("SAM profile '" + profile.Name + "' cannot be expanded: " + profile.Expanded.Status), Native(schedule, 0), identity); + if (eflhId != null) + { + Add(eflhId, key, ExpectedValue.Invalid("SAM profile '" + profile.Name + "' cannot be expanded"), Native(schedule, 0), identity); + } + + return; + } + + IReadOnlyList expected = profile == null ? Enumerable.Repeat(ExpectedValue.Unspecified("SAM selects no profile"), 8760).ToList() : EQ.ExpectedHourlySeries(profile.Expanded, scale); + List nativeSeries = schedule == null + ? Enumerable.Repeat(ReaderResult.Absent("no native schedule"), expected.Count).ToList() + : schedule.Values == null + ? Enumerable.Repeat(ReaderResult.Unreadable(schedule.Problem), expected.Count).ToList() + : schedule.Values.Select(x => ReaderResult.FromValue(x * scale)).ToList(); + + AddSeries(hourlyId, key, expected, nativeSeries, identity, alignment, inactive, ModelInterpretation.NotRequired); + if (eflhId != null) + { + ExpectedValue eflh = profile == null ? ExpectedValue.Unspecified("SAM selects no profile") : EQ.ExpectedEquivalentFullLoadHours(profile.Expanded); + ReaderResult nativeEflh = schedule == null ? ReaderResult.Absent("no native schedule") : schedule.Values == null ? ReaderResult.Unreadable(schedule.Problem) : ReaderResult.FromValue(schedule.Values.Sum()); + Add(eflhId, key, eflh, nativeEflh, identity, ModelInterpretation.NotRequired, null, inactive); + } + } + + private static ReaderResult Native(NativeSchedule schedule, int hour) + { + return schedule == null ? ReaderResult.Absent("no native schedule") : schedule.Values == null ? ReaderResult.Unreadable(schedule.Problem) : ReaderResult.FromValue(schedule.Values[hour]); + } + + // ---- ventilation (S07 D-F2, 8a, 8b; the S09 owner policy) ------------------------------------------------------- + + private void CompareVentilation(ExpectedSpace space, string nativeSpace, IdfObject zone, ReaderResult floorArea, ReaderResult volume, ReaderResult peopleDensity, IdentityStatus identity, ModelInterpretation interpretation) + { + Guid g = space.Guid; + string key = Keys.Space(g); + Space samSpace = model.AdjacencyCluster.GetObject(g); + double outsideSupplyAirFlow = samSpace != null && samSpace.TryGetValue(SpaceParameter.OutsideSupplyAirFlow, out double value) ? value : double.NaN; + bool overrideActive = !double.IsNaN(outsideSupplyAirFlow) && outsideSupplyAirFlow > 0; + + // S07 section 3, OS outdoor air: the per-space OutsideSupplyAirFlow wins over the SpaceType (condition) bases. + VentilationRequirement requirement = overrideActive + ? new VentilationRequirement { Flow = outsideSupplyAirFlow } + : new VentilationRequirement { Flow = Parameter(space, "SupplyAirFlow"), FlowPerArea = Parameter(space, "SupplyAirFlowPerArea"), FlowPerPerson = Parameter(space, "SupplyAirFlowPerPerson"), AirChangesPerHour = Parameter(space, "SupplyAirChangesPerHour") }; + bool selected = space.VentilationProfileSelection != null; + space.Profiles.TryGetValue("ticV", out ExpectedProfile profile); + VentilationState state = EQ.ClassifyVentilation(requirement, selected); + double people = People(space); + ExpectedValue required = EQ.ExpectedRequiredSupplyFlow(requirement, space.StoredArea, people, space.ShellVolume?.State == SamInputState.Value ? space.ShellVolume.Value : double.NaN); + string unresolved = selected && profile == null ? "SAM selects the Ventilation profile '" + space.VentilationProfileSelection + "', which does not resolve to a Ventilation profile (missing, or of another type): an invalid input" : null; + VentilationStates[key] = state + (overrideActive ? " (per-space OutsideSupplyAirFlow " + outsideSupplyAirFlow.ToString("R", ci) + " m3/s)" : string.Empty) + (unresolved != null ? " INVALID selection" : string.Empty); + Supporting.Add(key + ": D-F2 " + VentilationStates[key] + "; selection " + (space.VentilationProfileSelection ?? "none") + "; requirement " + required); + + // The native delivery path: the zone's Ideal Loads, the DSOA it names and that DSOA's fraction schedule. + IdfObject idealLoads = IdealLoadsOf(zone); + IdfObject dsoa = native.IdfByName("DesignSpecification:OutdoorAir", idealLoads?.Value(20, "Design Specification Outdoor Air Object Name", out string _)); + string controls = DeliveryControls(idealLoads); + InheritedDsoa(key, nativeSpace, dsoa); + + if (dsoa != null) + { + string method = dsoa.Value(1, "Outdoor Air Method", out string _); + if (!string.Equals(method, "Sum", StringComparison.OrdinalIgnoreCase)) + { + Consistency.Add(key + ": DSOA '" + dsoa.Name + "' method is '" + method + "', not Sum"); + } + } + + // 8a: each basis; an unstated basis contributes 0 to SAM's summed requirement (S07 8a; core + // ExpectedRequiredSupplyFlow), so it is S-ZERO once any basis is stated, and S-UNSPEC in V0. + bool anyStated = state != VentilationState.V0 && state != VentilationState.Indeterminate; + ReaderResult[] nativeBases = + { + NativeModel.Number(dsoa, 4, "Outdoor Air Flow per Zone"), + NativeModel.Number(dsoa, 3, "Outdoor Air Flow per Zone Floor Area"), + NativeModel.Number(dsoa, 2, "Outdoor Air Flow per Person"), + NativeModel.Number(dsoa, 5, "Outdoor Air Flow Air Changes per Hour") + }; + double[] expectedBases = { requirement.Flow, requirement.FlowPerArea, requirement.FlowPerPerson, requirement.AirChangesPerHour }; + for (int i = 0; i < 4; i++) + { + ExpectedValue e = !double.IsNaN(expectedBases[i]) ? ExpectedValue.FromValue(expectedBases[i]) : anyStated ? ExpectedValue.Zero() : ExpectedValue.Unspecified("no requirement is stated (V0)"); + Add("8a", Keys.Ic(g, "ventilation.requirement." + LayerProperties.VentilationBases[i]), e, nativeBases[i], identity); + } + + // The native summed requirement, from native rates and native geometry (EnergyPlus "Sum" at design occupancy). + ReaderResult nativeRequired = dsoa == null ? ReaderResult.Absent("no DSOA is linked to the zone's Ideal Loads") : NativeRequired(nativeBases, peopleDensity, floorArea, volume); + Add("8a", Keys.Ic(g, "ventilation.requirement.total"), required, nativeRequired, identity, interpretation); + + // 8b and the ventilation schedule (6): hour by hour. + string scheduleName = dsoa?.Value(6, "Outdoor Air Schedule Name", out string _); + NativeSchedule schedule = CheckedSchedule(scheduleName, key + ".ic.schedule.ventilation"); + if (dsoa != null && string.IsNullOrWhiteSpace(scheduleName)) + { + schedule = null; + Supporting.Add(key + ": the linked DSOA has no fraction schedule: EnergyPlus delivers it unscheduled (fraction 1)"); + } + + List delivered = new List(8760); + for (int h = 0; h < 8760; h++) + { + if (dsoa == null) + { + delivered.Add(ReaderResult.Absent(idealLoads == null ? "the zone has no Ideal Loads" : "the zone's Ideal Loads names no DSOA")); + } + else if (controls != null) + { + delivered.Add(ReaderResult.Unreadable(controls)); + } + else if (string.IsNullOrWhiteSpace(scheduleName)) + { + delivered.Add(nativeRequired); + } + else + { + delivered.Add(EQ.Multiply(nativeRequired, Native(schedule, h))); + } + } + + string inactive = null; + if (state == VentilationState.V0 || state == VentilationState.V1) + { + inactive = InactiveDelivery(key, selected, dsoa, schedule, scheduleName, nativeRequired, delivered); + } + + AlignmentStatus alignment = Alignment(schedule); + IReadOnlyList expected; + if (unresolved != null) + { + expected = Enumerable.Repeat(ExpectedValue.Invalid(unresolved), 8760).ToList(); + } + else if (state == VentilationState.V2) + { + expected = required.State != SamInputState.Value && required.State != SamInputState.Zero + ? Enumerable.Repeat(required, 8760).ToList() + : profile.Expanded.IsOk ? EQ.ExpectedHourlySeries(profile.Expanded, required.Value) : Enumerable.Repeat(ExpectedValue.Invalid("the Ventilation profile cannot be expanded: " + profile.Expanded.Status), 8760).ToList(); + } + else + { + expected = Enumerable.Repeat(EQ.ExpectedDeliveredOutdoorAir(state, required), 8760).ToList(); + } + + AddSeries("8b", Keys.Ic(g, "ventilation.delivered"), expected, delivered, identity, alignment, inactive, interpretation); + + // The ventilation schedule itself (6): SAM's selected profile against the DSOA fraction schedule. + string scheduleKey = Keys.Ic(g, "schedule.ventilation"); + if (unresolved != null) + { + Add("6.hourly", scheduleKey, ExpectedValue.Invalid(unresolved), Native(schedule, 0), identity); + Add("6.eflh", scheduleKey, ExpectedValue.Invalid(unresolved), schedule?.Values == null ? Native(schedule, 0) : ReaderResult.FromValue(schedule.Values.Sum()), identity); + } + else + { + ScheduleRows(scheduleKey, profile, schedule, identity, inactive, 1, "6.hourly", "6.eflh"); + } + } + + private IdfObject IdealLoadsOf(IdfObject zone) + { + if (zone == null) + { + return null; + } + + IdfObject connections = native.Idf("ZoneHVAC:EquipmentConnections").FirstOrDefault(x => string.Equals(x.Value(0, "Zone Name", out string _), zone.Name, StringComparison.OrdinalIgnoreCase)); + IdfObject list = native.IdfByName("ZoneHVAC:EquipmentList", connections?.Value(1, "Zone Conditioning Equipment List Name", out string _)); + if (list == null) + { + return null; + } + + List idealLoads = new List(); + for (int i = 1; i + 1 < list.Fields.Count; i++) + { + if (string.Equals(list.Value(i), "ZoneHVAC:IdealLoadsAirSystem", StringComparison.OrdinalIgnoreCase)) + { + IdfObject o = native.IdfByName("ZoneHVAC:IdealLoadsAirSystem", list.Value(i + 1)); + if (o != null) + { + idealLoads.Add(o); + } + } + } + + if (idealLoads.Count > 1) + { + Consistency.Add("zone '" + zone.Name + "' has " + idealLoads.Count + " Ideal Loads systems"); + } + + return idealLoads.FirstOrDefault(); + } + + /// + /// Null when the Ideal Loads delivers exactly DSOA x schedule at design occupancy: always available, no + /// demand-controlled ventilation, no economizer, no heat recovery (blank = the EnergyPlus default of each). + /// Otherwise the reason the delivered flow cannot be derived from the DSOA alone. + /// + private string DeliveryControls(IdfObject idealLoads) + { + if (idealLoads == null) + { + return null; + } + + List problems = new List(); + string availability = idealLoads.Value(1, "Availability Schedule Name", out string p1); + if (p1 != null) + { + problems.Add(p1); + } + else if (!string.IsNullOrWhiteSpace(availability)) + { + ReaderResult on = Constant(native.IdfSchedule(availability), "availability"); + if (!on.HasNumber || on.Value != 1) + { + problems.Add("availability schedule '" + availability + "' is not always 1"); + } + } + + foreach ((int index, string label, string neutral) in new[] { (22, "Demand Controlled Ventilation Type", "None"), (23, "Outdoor Air Economizer Type", "NoEconomizer"), (24, "Heat Recovery Type", "None") }) + { + string text = idealLoads.Value(index, label, out string problem); + if (problem != null) + { + problems.Add(problem); + } + else if (!string.IsNullOrWhiteSpace(text) && !string.Equals(text, neutral, StringComparison.OrdinalIgnoreCase)) + { + problems.Add(label + " is '" + text + "', not " + neutral); + } + } + + Supporting.Add("Ideal Loads '" + idealLoads.Name + "': DCV '" + idealLoads.Value(22) + "', economizer '" + idealLoads.Value(23) + "', heat recovery '" + idealLoads.Value(24) + "', availability '" + availability + "'"); + return problems.Count == 0 ? null : "Ideal Loads controls change the delivered outdoor air: " + string.Join("; ", problems); + } + + /// + /// The OSM view of the same delivery path: the space's own DSOA, else the one its SpaceType carries (inheritance), + /// must be the DSOA the IDF Ideal Loads names, with the same rates and schedule. + /// + private void InheritedDsoa(string key, string nativeSpace, IdfObject idfDsoa) + { + IdfObject osmSpace = native.OsmByName("OS:Space", nativeSpace); + if (osmSpace == null) + { + Consistency.Add(key + ": the OSM has no OS:Space '" + nativeSpace + "'"); + return; + } + + string own = osmSpace.ValueByLabel("Design Specification Outdoor Air Object Name", out bool _); + IdfObject spaceType = native.OsmByHandle("OS:SpaceType", osmSpace.Value(2, "Space Type Name", out string _)); + string inherited = spaceType?.ValueByLabel("Design Specification Outdoor Air Object Name", out bool _); + string effectiveHandle = !string.IsNullOrWhiteSpace(own) ? own : inherited; + IdfObject osmDsoa = native.OsmByHandle("OS:DesignSpecification:OutdoorAir", effectiveHandle); + Supporting.Add(key + ": OSM DSOA " + (osmDsoa == null ? "none" : "'" + osmDsoa.Value(1) + "'") + (string.IsNullOrWhiteSpace(own) ? " inherited from SpaceType '" + spaceType?.Value(1) + "'" : " set on the space (per-space override)") + "; IDF Ideal Loads names " + (idfDsoa == null ? "none" : "'" + idfDsoa.Name + "'")); + + if ((osmDsoa == null) != (idfDsoa == null) || osmDsoa != null && !string.Equals(osmDsoa.Value(1), idfDsoa.Name, StringComparison.OrdinalIgnoreCase)) + { + Consistency.Add(key + ": the OSM effective DSOA (" + (osmDsoa?.Value(1) ?? "none") + ") is not the one the IDF Ideal Loads delivers (" + (idfDsoa?.Name ?? "none") + ")"); + return; + } + + if (osmDsoa == null) + { + return; + } + + IdfObject osmIdealLoads = native.Snapshot.OsmOf("OS:ZoneHVAC:IdealLoadsAirSystem").FirstOrDefault(x => string.Equals(native.OsmName(x.ValueByLabel("Design Specification Outdoor Air Object Name", out bool _)), osmDsoa.Value(1), StringComparison.OrdinalIgnoreCase)); + if (osmIdealLoads == null) + { + Supporting.Add(key + ": no OSM Ideal Loads names the DSOA itself (the translator would link it from the space)"); + } + + string[] labels = { "Outdoor Air Method", "Outdoor Air Flow per Person", "Outdoor Air Flow per Floor Area", "Outdoor Air Flow Rate", "Outdoor Air Flow Air Changes per Hour" }; + int[] idfFields = { 1, 2, 3, 4, 5 }; + for (int i = 0; i < labels.Length; i++) + { + string osmValue = osmDsoa.ValueByLabel(labels[i], out bool _); + string idfValue = idfDsoa.Value(idfFields[i]); + bool equal = i == 0 ? string.Equals(osmValue, idfValue, StringComparison.OrdinalIgnoreCase) : double.TryParse(osmValue, NumberStyles.Float, ci, out double a) && double.TryParse(idfValue, NumberStyles.Float, ci, out double b) && a == b; + if (!equal) + { + Consistency.Add(key + ": DSOA " + labels[i] + " is '" + osmValue + "' in the OSM and '" + idfValue + "' in the IDF"); + } + } + + string osmSchedule = native.OsmName(osmDsoa.ValueByLabel("Outdoor Air Flow Rate Fraction Schedule Name", out bool _)); + string idfSchedule = idfDsoa.Value(6); + if (!string.Equals(osmSchedule ?? string.Empty, idfSchedule ?? string.Empty, StringComparison.OrdinalIgnoreCase)) + { + Consistency.Add(key + ": DSOA fraction schedule is '" + osmSchedule + "' in the OSM and '" + idfSchedule + "' in the IDF"); + } + } + + private static ReaderResult NativeRequired(ReaderResult[] bases, ReaderResult peopleDensity, ReaderResult floorArea, ReaderResult volume) + { + // bases: flow per zone, per floor area, per person, ACH. Blank rates are absent (EnergyPlus would default + // per person to 0.00944 m3/s), so the sum needs every rate stated. + if (bases.Any(x => !x.HasNumber)) + { + return bases.First(x => !x.HasNumber).Kind == ReaderKind.Absent ? ReaderResult.Unreadable("a DSOA rate is blank: EnergyPlus would apply its default") : bases.First(x => !x.HasNumber); + } + + ReaderResult people = EQ.Multiply(peopleDensity.Kind == ReaderKind.Absent ? ReaderResult.FromValue(0) : peopleDensity, floorArea); + ReaderResult perPerson = bases[2].Value == 0 ? ReaderResult.FromValue(0) : EQ.Multiply(bases[2], people); + ReaderResult perArea = bases[1].Value == 0 ? ReaderResult.FromValue(0) : EQ.Multiply(bases[1], floorArea); + ReaderResult ach = bases[3].Value == 0 ? ReaderResult.FromValue(0) : EQ.Multiply(bases[3], volume, 1 / 3600.0); + foreach (ReaderResult term in new[] { perPerson, perArea, ach }) + { + if (!term.HasNumber) + { + return term; + } + } + + return ReaderResult.FromValue(bases[0].Value + perPerson.Value + perArea.Value + ach.Value); + } + + /// + /// T-VENT-INACTIVE for OpenStudio (S08 owner decision 3, applied under the S09 owner ventilation policy): SAM selects + /// no delivery profile; the native DSOA stays present with its requirement; its fraction schedule is read in both + /// native views, hour-labelled, finite and exactly 0 in all 8760 hours; and every delivered flow is exactly 0. + /// Anything else gets no exemption. Returns the transformation id, or null; the reason is recorded either way. + /// + private string InactiveDelivery(string key, bool selected, IdfObject dsoa, NativeSchedule schedule, string scheduleName, ReaderResult nativeRequired, List delivered) + { + List refused = new List(); + if (RuleSet != GateRuleSet.Approved) + { + refused.Add("not the approved rule set"); + } + + if (selected) + { + refused.Add("SAM selects a Ventilation profile"); + } + + if (dsoa == null) + { + refused.Add("no native DSOA is delivered (nothing to exempt)"); + } + + NativeSchedule osm = native.OsmSchedule(scheduleName); + if (schedule == null || schedule.Values == null || osm == null || osm.Values == null) + { + refused.Add("the fraction schedule is not read in both the IDF and the OSM"); + } + else + { + if (!schedule.AlignmentVerified || !osm.AlignmentVerified || !calendarVerified) + { + refused.Add("the hour labels or the calendar are not verified"); + } + + if (schedule.Values.Length != 8760 || osm.Values.Length != 8760 || schedule.Values.Any(x => x != 0 || double.IsNaN(x)) || osm.Values.Any(x => x != 0 || double.IsNaN(x))) + { + refused.Add("the fraction schedule is not exactly 0 in all 8760 hours of both views"); + } + } + + if (!nativeRequired.HasNumber) + { + refused.Add("the native requirement is not a finite number (" + nativeRequired.Kind + ")"); + } + + if (delivered.Count != 8760 || delivered.Any(x => x.Kind != ReaderKind.Zero)) + { + refused.Add("not every delivered flow is read as exactly 0"); + } + + Supporting.Add(key + ": " + InactiveVentilation + (refused.Count == 0 ? " applied (requirement kept, all 8760 schedule values and delivered flows exactly 0 in both views)" : " not applied: " + string.Join("; ", refused))); + return refused.Count == 0 ? InactiveVentilation : null; + } + + // ---- weather and design days ------------------------------------------------------------------------------------ + + private void CompareWeather(string epwPath, NativeSnapshot snapshot) + { + string[] location = File.Exists(epwPath) ? File.ReadLines(epwPath).First().Split(',') : new string[0]; + double Header(int i) => location.Length > i && double.TryParse(location[i], NumberStyles.Float, ci, out double v) ? v : double.NaN; + + string expectedHash = File.Exists(epwPath) ? Hashing.Sha256(epwPath) : null; + ReaderResult nativeHash = snapshot.WeatherFileSha256 == null ? ReaderResult.Absent(snapshot.WeatherFileProblem) : ReaderResult.FromValue(string.Equals(snapshot.WeatherFileSha256, expectedHash, StringComparison.OrdinalIgnoreCase) ? 1 : 0); + Add("9.os.epw", Keys.Weather("epw"), expectedHash == null ? ExpectedValue.Invalid("the run's EPW is missing") : ExpectedValue.FromValue(1), nativeHash, IdentityStatus.Verified); + Supporting.Add("weather: run EPW sha256 " + expectedHash + "; the OSM references a file with sha256 " + (snapshot.WeatherFileSha256 ?? "(none: " + snapshot.WeatherFileProblem + ")")); + + IdfObject site = native.Idf("Site:Location").SingleOrDefault(); + IdfObject weatherFile = native.Snapshot.OsmOf("OS:WeatherFile").SingleOrDefault(); + (string what, int epw, int idf, string idfLabel, int osm, string osmLabel)[] fields = + { + ("latitude", 6, 1, "Latitude", 6, "Latitude"), + ("longitude", 7, 2, "Longitude", 7, "Longitude"), + ("timezone", 8, 3, "Time Zone", 8, "Time Zone"), + ("elevation", 9, 4, "Elevation", 9, "Elevation") + }; + + foreach ((string what, int epw, int idf, string idfLabel, int osm, string osmLabel) in fields) + { + ReaderResult idfValue = NativeModel.Number(site, idf, idfLabel); + ReaderResult osmValue = NativeModel.Number(weatherFile, osm, osmLabel); + if (idfValue.Kind != osmValue.Kind || idfValue.HasNumber && idfValue.Value != osmValue.Value) + { + Consistency.Add("weather " + what + ": IDF Site:Location " + idfValue.Kind + " " + idfValue.Value.ToString("R", ci) + " vs OSM OS:WeatherFile " + osmValue.Kind + " " + osmValue.Value.ToString("R", ci)); + } + + Add("9.os." + what, Keys.Weather(what), ExpectedValue.FromValue(Header(epw)), idfValue, IdentityStatus.Verified); + } + + IdfObject ground = native.Idf("Site:GroundTemperature:BuildingSurface").FirstOrDefault(); + Supporting.Add("weather: Site:GroundTemperature:BuildingSurface " + (ground == null ? "absent" : string.Join(", ", ground.Fields.Select(x => x.Value))) + " (9.ground, not gated)"); + } + + private void CompareDesignDays(ExpectedModel expected) + { + // S07 section 3, OS design days: an explicit DDY (the harness passes none) -> the model's lists. Never merged. + int stated = expected.CoolingDesignDays.Count + expected.HeatingDesignDays.Count; + int written = native.Idf("SizingPeriod:DesignDay").Count() + native.Idf("SizingPeriod:WeatherFileDays").Count() + native.Idf("SizingPeriod:WeatherFileConditionType").Count(); + Supporting.Add("design days: SAM states " + stated + " (" + expected.DesignDayRole + "); the IDF has " + written + " sizing period(s)"); + ExpectedValue e = stated == 0 ? ExpectedValue.Unspecified("no DDY and no design day in the model") : ExpectedValue.FromValue(stated); + ReaderResult n = written == 0 ? ReaderResult.Absent("no sizing period") : stated == 0 ? ReaderResult.FromValue(written) : ReaderResult.Unreadable("T-DD parametric comparison is not implemented in S09 (the fixtures state no design day)"); + Add("10.os.count", Keys.DesignDays, e, n, IdentityStatus.Verified); + } + + // ---- result plumbing -------------------------------------------------------------------------------------------- + + private QuantityInput Input(string quantityId, string key, ExpectedValue expected, ReaderResult nativeValue, IdentityStatus identity, AlignmentStatus alignment, ContractListing listing = ContractListing.None, ModelInterpretation interpretation = ModelInterpretation.NotRequired, string transformation = null, string inactive = null) + { + return new QuantityInput + { + Definition = OsQuantities.Get(quantityId), + FixtureId = FixtureId, + ObjectKey = key, + Expected = expected, + Native = nativeValue, + Identity = identity, + Alignment = alignment, + Listing = listing, + TransformationId = transformation, + TransformationVerified = transformation != null, + Interpretation = interpretation, + InactiveNativeTransformation = inactive + }; + } + + private void Add(string quantityId, string key, ExpectedValue expected, ReaderResult nativeValue, IdentityStatus identity, ModelInterpretation interpretation = ModelInterpretation.NotRequired, string transformation = null, string inactive = null) + { + Results.Add(EQ.Evaluate(Input(quantityId, key, expected ?? ExpectedValue.Invalid("no expected value"), nativeValue, identity, AlignmentStatus.Unverified, ContractListing.None, interpretation, transformation, inactive), Configuration)); + } + + private void AddSeries(string quantityId, string key, IReadOnlyList expected, IReadOnlyList nativeValues, IdentityStatus identity, AlignmentStatus alignment, string inactive, ModelInterpretation interpretation) + { + SeriesResult series = EQ.EvaluateSeries(Input(quantityId, key, null, null, identity, alignment, ContractListing.None, interpretation, null, inactive), expected, nativeValues, Configuration); + Results.Add(series.GateResult); + QuantityResult first = series.Elements.FirstOrDefault(x => !x.IsPass); + Series.Add(new SeriesSummary + { + Key = key, + QuantityId = quantityId, + Count = series.Elements.Count, + NotPass = series.NotPassCount, + Status = series.GateResult.Status.ToString(), + Outcome = series.GateResult.Outcome.ToString(), + FirstNotPass = first == null ? null : first.Input.ObjectKey + ": " + first.Outcome + " (expected " + first.Input.Expected + ", native " + first.Input.Native?.Kind + " " + (first.Input.Native?.HasNumber == true ? first.Input.Native.Value.ToString("R", ci) : first.Input.Native?.Detail) + ")" + }); + } + } +} diff --git a/benchmark/SAM.Analytical.OpenStudio.InputReadBack/Compare/OsGeometry.cs b/benchmark/SAM.Analytical.OpenStudio.InputReadBack/Compare/OsGeometry.cs new file mode 100644 index 0000000..7d82980 --- /dev/null +++ b/benchmark/SAM.Analytical.OpenStudio.InputReadBack/Compare/OsGeometry.cs @@ -0,0 +1,147 @@ +// SPDX-License-Identifier: LGPL-3.0-or-later +// Copyright (c) 2020–2026 Michal Dengusiak & Jakub Ziolkowski and contributors + +using System; +using System.Collections.Generic; +using System.Linq; + +namespace SAM.Analytical.OpenStudio.InputReadBack +{ + /// + /// Plain vector geometry on native vertex lists (no SAM or OpenStudio geometry kernel): polygon area, shell volume and + /// the frame outline EnergyPlus grows around a pane. Used for the native side only; SAM's expected geometry comes from + /// ReadBackExpected and the evaluation core. + /// + public static class OsGeometry + { + /// The vector area (Newell) of a planar polygon: its length is the area, its direction the normal by winding. + public static double[] VectorArea(IReadOnlyList points) + { + double x = 0, y = 0, z = 0; + for (int i = 0; i < points.Count; i++) + { + double[] a = points[i], b = points[(i + 1) % points.Count]; + x += (a[1] - b[1]) * (a[2] + b[2]); + y += (a[2] - b[2]) * (a[0] + b[0]); + z += (a[0] - b[0]) * (a[1] + b[1]); + } + + return new[] { x / 2, y / 2, z / 2 }; + } + + public static double Area(IReadOnlyList points) + { + if (points == null || points.Count < 3) + { + return double.NaN; + } + + double[] v = VectorArea(points); + return Math.Sqrt(v[0] * v[0] + v[1] * v[1] + v[2] * v[2]); + } + + /// + /// The volume enclosed by a closed set of polygons (divergence theorem, sum of signed pyramid volumes). EnergyPlus + /// requires outward-facing (counter-clockwise from outside) surfaces, so a consistent shell gives a positive sum; the + /// magnitude is returned and reports the sign for the record. + /// + public static double ShellVolume(IEnumerable> polygons, out double signed) + { + signed = 0; + foreach (IReadOnlyList polygon in polygons) + { + if (polygon == null || polygon.Count < 3) + { + signed = double.NaN; + return double.NaN; + } + + double[] v = VectorArea(polygon); + double[] p = polygon[0]; + signed += (p[0] * v[0] + p[1] * v[1] + p[2] * v[2]) / 3.0; + } + + return Math.Abs(signed); + } + + /// + /// A convex planar polygon moved outwards in its own plane by : the outline of an EnergyPlus + /// frame of that width around the pane. Null when the polygon is not convex or degenerate (never approximated). + /// + public static List OffsetOutwards(IReadOnlyList points, double width) + { + if (points == null || points.Count < 3 || double.IsNaN(width)) + { + return null; + } + + double[] normal = Unit(VectorArea(points)); + double[] u = Unit(Sub(points[1], points[0])); + if (normal == null || u == null) + { + return null; + } + + double[] v = Cross(normal, u); + List p2 = points.Select(p => new[] { Dot(Sub(p, points[0]), u), Dot(Sub(p, points[0]), v) }).ToList(); + int n = p2.Count; + + // In (u, v) with v = normal x u the polygon winds counter-clockwise; the outward normal of edge (dx, dy) is (dy, -dx). + for (int i = 0; i < n; i++) + { + double[] a = p2[i], b = p2[(i + 1) % n], c = p2[(i + 2) % n]; + if ((b[0] - a[0]) * (c[1] - b[1]) - (b[1] - a[1]) * (c[0] - b[0]) < -1e-12) + { + return null; + } + } + + List lines = new List(); + for (int i = 0; i < n; i++) + { + double[] a = p2[i], b = p2[(i + 1) % n]; + double dx = b[0] - a[0], dy = b[1] - a[1], length = Math.Sqrt(dx * dx + dy * dy); + if (length < 1e-12) + { + return null; + } + + lines.Add(new[] { a[0] + dy / length * width, a[1] - dx / length * width, dx, dy }); + } + + List result = new List(); + for (int i = 0; i < n; i++) + { + double[] l1 = lines[(i + n - 1) % n], l2 = lines[i]; + double det = l1[2] * l2[3] - l1[3] * l2[2]; + if (Math.Abs(det) < 1e-12) + { + return null; + } + + double t = ((l2[0] - l1[0]) * l2[3] - (l2[1] - l1[1]) * l2[2]) / det; + double x = l1[0] + t * l1[2], y = l1[1] + t * l1[3]; + result.Add(new[] { points[0][0] + x * u[0] + y * v[0], points[0][1] + x * u[1] + y * v[1], points[0][2] + x * u[2] + y * v[2] }); + } + + return result; + } + + public static Geometry.Spatial.Polygon3D ToPolygon3D(IReadOnlyList points) + { + return points == null || points.Count < 3 ? null : new Geometry.Spatial.Polygon3D(points.Select(p => new Geometry.Spatial.Point3D(p[0], p[1], p[2])).ToList()); + } + + private static double[] Sub(double[] a, double[] b) => new[] { a[0] - b[0], a[1] - b[1], a[2] - b[2] }; + + private static double Dot(double[] a, double[] b) => a[0] * b[0] + a[1] * b[1] + a[2] * b[2]; + + private static double[] Cross(double[] a, double[] b) => new[] { a[1] * b[2] - a[2] * b[1], a[2] * b[0] - a[0] * b[2], a[0] * b[1] - a[1] * b[0] }; + + private static double[] Unit(double[] a) + { + double length = Math.Sqrt(Dot(a, a)); + return length < 1e-12 ? null : new[] { a[0] / length, a[1] / length, a[2] / length }; + } + } +} diff --git a/benchmark/SAM.Analytical.OpenStudio.InputReadBack/Compare/OsQuantities.cs b/benchmark/SAM.Analytical.OpenStudio.InputReadBack/Compare/OsQuantities.cs new file mode 100644 index 0000000..00f332d --- /dev/null +++ b/benchmark/SAM.Analytical.OpenStudio.InputReadBack/Compare/OsQuantities.cs @@ -0,0 +1,105 @@ +// SPDX-License-Identifier: LGPL-3.0-or-later +// Copyright (c) 2020–2026 Michal Dengusiak & Jakub Ziolkowski and contributors + +using SAM.Analytical.InputEquivalence; +using System; +using System.Collections.Generic; + +namespace SAM.Analytical.OpenStudio.InputReadBack +{ + /// + /// The S07 section 5 rows whose OpenStudio column differs from the Tas one held by the core catalogue. Each tolerance is + /// the one S07 states for OpenStudio; none is new. Every other row uses unchanged. + /// + public static class OsQuantities + { + /// Row 9, OpenStudio: the EPW the OSM references is the effective weather file, by SHA-256 identity (1 = identical). + public static readonly QuantityDefinition WeatherFile = new QuantityDefinition("9.os.epw", "Weather file identity (EPW SHA-256)", "-", ToleranceRule.Exact("-"), true); + + /// Row 9, OpenStudio: latitude and longitude at EPW precision, 1e-4 degrees. + public static readonly QuantityDefinition Latitude = new QuantityDefinition("9.os.latitude", "Site latitude", "deg", ToleranceRule.Create(null, 1e-4, "deg"), true); + + public static readonly QuantityDefinition Longitude = new QuantityDefinition("9.os.longitude", "Site longitude", "deg", ToleranceRule.Create(null, 1e-4, "deg"), true); + + /// Row 9, OpenStudio: elevation, 0.5 m. + public static readonly QuantityDefinition Elevation = new QuantityDefinition("9.os.elevation", "Site elevation", "m", ToleranceRule.Create(null, 0.5, "m"), true); + + /// Row 9: time zone. S07 states no OpenStudio tolerance for it, so it is exact. + public static readonly QuantityDefinition TimeZone = new QuantityDefinition("9.os.timezone", "Site time zone", "h", ToleranceRule.Exact("h"), true); + + /// Row 10, OpenStudio: the number of native design days against the effective design-day source (T-DD needs one per stated day). + public static readonly QuantityDefinition DesignDayCount = new QuantityDefinition("10.os.count", "Design days written", "-", ToleranceRule.Exact("-"), true); + + /// T-FRAME, OpenStudio: frame conductance 1/sum(t/lambda), 1e-5 W/m2K. + public static readonly QuantityDefinition FrameConductance = new QuantityDefinition("T-FRAME.conductance", "Frame conductance (T-FRAME)", "W/m2K", ToleranceRule.Create(null, 1e-5, "W/m2K"), true); + + /// + /// S07 §5.1 T-LIGHT-SPLIT, OpenStudio: Return Air Fraction against 0, exact. The other split rows use row 4c (0.001), + /// as the T-LIGHT-SPLIT table states. + /// + public static readonly QuantityDefinition LightingReturnAir = new QuantityDefinition("4c.os.returnAir", "Lighting return-air fraction (T-LIGHT-SPLIT)", "-", ToleranceRule.Exact("-"), true); + + /// S07 §5.1: s, the short-wave share of the radiant output, 0.2415 / 0.576 at full precision (a declared contract constant). + public const double LightingShortWaveShare = 0.2415 / 0.576; + + /// S07 §5.1: p₀, the contract-listed default total radiant share for an unstated p (listed default only, never an expected value). + public const double LightingReferenceRadiantProportion = 0.576; + + /// + /// The floating-point boundary of the T-LIGHT-SPLIT native-domain guard (not an S07 tolerance): a Lights fraction is + /// in its domain when −1e-12 ≤ value ≤ 1 + 1e-12, and the fractions sum to at most 1 + 1e-12. It absorbs only the + /// rounding of the decimal IDF text to double (under 1e-15 for three values in [0, 1]); a writer-made p = 1 split + /// sums to 1 within that. It is 1e9 times smaller than the 4c tolerance and is applied before, never instead of, the + /// S07 comparison. + /// + public const double LightingFractionBoundary = 1e-12; + + public static QuantityDefinition Get(string id) + { + switch (id) + { + case "4c.os.returnAir": return LightingReturnAir; + case "9.os.epw": return WeatherFile; + case "9.os.latitude": return Latitude; + case "9.os.longitude": return Longitude; + case "9.os.elevation": return Elevation; + case "9.os.timezone": return TimeZone; + case "10.os.count": return DesignDayCount; + case "T-FRAME.conductance": return FrameConductance; + default: return QuantityCatalog.Get(id); + } + } + } + + /// The object keys of the S09 comparison, shaped like the S08 ones so the two engines' reports line up. + public static class Keys + { + public static string Space(Guid space) => "space:" + space.ToString("D"); + + public static string Side(Guid panel, Guid space) => "panel:" + panel.ToString("D") + "@space:" + space.ToString("D"); + + public static string Layer(string side, int k, string property) => side + "#layer" + k.ToString(System.Globalization.CultureInfo.InvariantCulture) + "." + property; + + public static string Aperture(Guid aperture, Guid space) => "aperture:" + aperture.ToString("D") + "@space:" + space.ToString("D"); + + public static string Ic(Guid space, string what) => Space(space) + ".ic." + what; + + public static string Weather(string what) => "weather." + what; + + public const string DesignDays = "designday.count"; + } + + /// The S07 layer properties compared per layer (names as in S08). + public static class LayerProperties + { + public static readonly string[] Opaque = { "thickness", "conductivity", "density", "specificHeat", "externalSolarReflectance", "internalSolarReflectance", "externalLightReflectance", "internalLightReflectance", "externalEmissivity", "internalEmissivity" }; + public static readonly string[] Transparent = { "thickness", "conductivity", "solarTransmittance", "lightTransmittance", "externalSolarReflectance", "internalSolarReflectance", "externalLightReflectance", "internalLightReflectance", "externalEmissivity", "internalEmissivity" }; + public static readonly string[] VentilationBases = { "flow", "flowPerArea", "flowPerPerson", "airChangesPerHour" }; + public static readonly string[] Gains = { "occupancySensible", "occupancyLatent", "lighting", "equipmentSensible", "equipmentLatent" }; + public static readonly string[] Schedules = { "occupancy", "lighting", "equipmentSensible", "equipmentLatent", "infiltration", "ventilation" }; + /// Row 4c keys. The lighting rows are T-LIGHT-SPLIT (S07 §5.1); its return-air row is . + public static readonly string[] Fractions = { "occupancy.radiant", "lighting.radiantTotal", "lighting.visible", "lighting.radiant", "lighting.convective", "equipment.radiant" }; + + public const string LightingReturnAir = "lighting.returnAir"; + } +} diff --git a/benchmark/SAM.Analytical.OpenStudio.InputReadBack/Fixtures/README.md b/benchmark/SAM.Analytical.OpenStudio.InputReadBack/Fixtures/README.md new file mode 100644 index 0000000..cbdbf09 --- /dev/null +++ b/benchmark/SAM.Analytical.OpenStudio.InputReadBack/Fixtures/README.md @@ -0,0 +1,20 @@ +# S09 fixtures: the S08 signed-off equivalence fixtures, reused byte for byte + +These are the two Phase B equivalence fixtures the owner signed off for S08 on 2026-10-21. They are copied unchanged from +SAM_Tas `SAM_Tas/SAM.Analytical.Tas.DirectT3D.Validation/ReadBack/Fixtures/` (added in `05edbdde`, merged in +SAM_Tas#106 `61eb0d37`). They were not regenerated: SAM mints new GUIDs on every factory call. + +| File | sha256 | Bytes | +|---|---|---| +| `s08-fix-box.json` | `45524172b32f85df89511dd344141023de999faa9552a199e6b49062612acd08` | 723,176 | +| `s08-fix-two.json` | `20da9b586345e9fc67dc6308e6da1578b9bc41b3c694dbdab37e9c677959baa0` | 760,086 | + +- `SHA256SUMS.txt` is the S08 file, byte for byte. +- `.gitattributes` marks this folder `-text`, so the CRLF bytes are kept. +- `Run-S09-ReadBack.ps1` and the tests check both hashes before using the files. + +Provenance, declared conventions (centre-line panels with PhysicalThickness, box V2, two-zone V1/V1, closed single-pane +windows, no exhaust, systems or IZAM data) and the owner decisions are in the SAM_Tas README beside the originals. + +Weather: the SAM#212 Budapest TMYx EPW from SAM `SAM/SAM/SAM.Tests/Resources/Weather/` (decompressed sha256 +`472ffb4e2f10867600949a392ce46891fc1bd05f2fc8d8917a99bca7d26209c3`), the same file S08 used. diff --git a/benchmark/SAM.Analytical.OpenStudio.InputReadBack/Fixtures/SHA256SUMS.txt b/benchmark/SAM.Analytical.OpenStudio.InputReadBack/Fixtures/SHA256SUMS.txt new file mode 100644 index 0000000..c8a4974 --- /dev/null +++ b/benchmark/SAM.Analytical.OpenStudio.InputReadBack/Fixtures/SHA256SUMS.txt @@ -0,0 +1,2 @@ +45524172b32f85df89511dd344141023de999faa9552a199e6b49062612acd08 s08-fix-box.json +20da9b586345e9fc67dc6308e6da1578b9bc41b3c694dbdab37e9c677959baa0 s08-fix-two.json diff --git a/benchmark/SAM.Analytical.OpenStudio.InputReadBack/Fixtures/s08-fix-box.json b/benchmark/SAM.Analytical.OpenStudio.InputReadBack/Fixtures/s08-fix-box.json new file mode 100644 index 0000000..3a5949e --- /dev/null +++ b/benchmark/SAM.Analytical.OpenStudio.InputReadBack/Fixtures/s08-fix-box.json @@ -0,0 +1,37728 @@ +[ + { + "_type": "SAM.Analytical.AnalyticalModel,SAM.Analytical", + "Name": "s08-fix-box", + "Guid": "eeebda3b-1bee-4dc1-b916-9cf176adc1b2", + "Description": "S08 PR-C equivalence fixture: box, V2, centre-line (mid-surface) panels with PhysicalThickness = construction layer total", + "AdjacencyCluster": { + "_type": "SAM.Analytical.AdjacencyCluster,SAM.Analytical", + "Guid": "732306bb-3d62-4372-a501-bee2ff9cebbe", + "Objects": [ + { + "Key": "SAM.Analytical.Space", + "Value": [ + { + "Key": "5080c000-0000-0000-0000-00000000c001", + "Value": { + "_type": "SAM.Analytical.Space,SAM.Analytical", + "ParameterSets": [ + { + "_type": "SAM.Core.ParameterSet", + "Name": "SAM.Analytical", + "Guid": "364a2db8-8af5-4624-a75e-66391df5307d", + "Parameters": [ + { + "Name": "Area", + "Value": 26.880000000000003 + }, + { + "Name": "Volume", + "Value": 76.608 + }, + { + "Name": "Occupancy", + "Value": 3.0 + } + ] + } + ], + "Name": "FixBox", + "Guid": "5080c000-0000-0000-0000-00000000c001", + "Location": { + "_type": "SAM.Geometry.Spatial.Point3D,SAM.Geometry", + "X": 3.2, + "Y": 2.1, + "Z": 1.2 + }, + "InternalCondition": { + "_type": "SAM.Analytical.InternalCondition,SAM.Analytical", + "ParameterSets": [ + { + "_type": "SAM.Core.ParameterSet", + "Name": "SAM.Analytical", + "Guid": "364a2db8-8af5-4624-a75e-66391df5307d", + "Parameters": [ + { + "Name": "Occupancy Sensible Gain Per Person", + "Value": 75.0 + }, + { + "Name": "Occupancy Latent Gain Per Person", + "Value": 55.0 + }, + { + "Name": "Lighting Gain Per Area", + "Value": 7.4 + }, + { + "Name": "Equipment Sensible Gain Per Area", + "Value": 12.6 + }, + { + "Name": "Equipment Latent Gain Per Area", + "Value": 0.8 + }, + { + "Name": "Infiltration Air Changes Per Hour", + "Value": 0.3 + }, + { + "Name": "Lighting Radiant Proportion", + "Value": 0.37 + }, + { + "Name": "Occupancy Radiant Proportion", + "Value": 0.21 + }, + { + "Name": "Equipment Radiant Proportion", + "Value": 0.24 + }, + { + "Name": "Supply Air Flow Per Person", + "Value": 0.01 + }, + { + "Name": "Occupancy Profile Name", + "Value": "FIX_IC_BOX_OCC" + }, + { + "Name": "Lighting Profile Name", + "Value": "FIX_IC_BOX_LGT" + }, + { + "Name": "Equipment Sensible Profile Name", + "Value": "FIX_IC_BOX_EQS" + }, + { + "Name": "Equipment Latent Profile Name", + "Value": "FIX_IC_BOX_EQL" + }, + { + "Name": "Infiltration Profile Name", + "Value": "FIX_IC_BOX_INF" + }, + { + "Name": "Heating Profile Name", + "Value": "FIX_IC_BOX_HTG" + }, + { + "Name": "Cooling Profile Name", + "Value": "FIX_IC_BOX_CLG" + }, + { + "Name": "Humidification Profile Name", + "Value": "FIX_IC_BOX_HUM" + }, + { + "Name": "Dehumidification Profile Name", + "Value": "FIX_IC_BOX_DHU" + }, + { + "Name": "Ventilation Profile Name", + "Value": "FIX_IC_BOX_VNT" + } + ] + } + ], + "Name": "FIX_IC_BOX", + "Guid": "404563e6-17d6-4172-bbbf-0ed0d011256c" + } + } + } + ] + }, + { + "Key": "SAM.Analytical.Panel", + "Value": [ + { + "Key": "b07106b3-da42-40de-a8de-b1284bc3d785", + "Value": { + "_type": "SAM.Analytical.Panel,SAM.Analytical", + "ParameterSets": [ + { + "_type": "SAM.Core.ParameterSet", + "Name": "SAM.Analytical", + "Guid": "364a2db8-8af5-4624-a75e-66391df5307d", + "Parameters": [ + { + "Name": "Physical Thickness", + "Value": 0.33499999999999996 + } + ] + } + ], + "Name": "FIX_GRD_FLOOR", + "Guid": "b07106b3-da42-40de-a8de-b1284bc3d785", + "Type": { + "_type": "SAM.Analytical.Construction,SAM.Analytical", + "Name": "FIX_GRD_FLOOR", + "Guid": "5080c000-0000-0000-0000-0000000000a3", + "ConstructionLayers": [ + { + "_type": "SAM.Analytical.ConstructionLayer,SAM.Analytical", + "Name": "FIX_Screed", + "Thickness": 0.065 + }, + { + "_type": "SAM.Analytical.ConstructionLayer,SAM.Analytical", + "Name": "FIX_EPS", + "Thickness": 0.12 + }, + { + "_type": "SAM.Analytical.ConstructionLayer,SAM.Analytical", + "Name": "FIX_Concrete", + "Thickness": 0.15 + } + ] + }, + "PanelType": "SlabOnGrade", + "PlanarBoundary3D": { + "_type": "SAM.Analytical.PlanarBoundary3D,SAM.Analytical", + "Guid": "bad1d96b-41d4-4d53-a9ec-344d16bbf845", + "Plane": { + "_type": "SAM.Geometry.Spatial.Plane,SAM.Geometry", + "Origin": { + "_type": "SAM.Geometry.Spatial.Point3D,SAM.Geometry", + "X": 3.2, + "Y": 2.1, + "Z": 0 + }, + "Normal": { + "_type": "SAM.Geometry.Spatial.Vector3D,SAM.Geometry", + "X": 0, + "Y": 0, + "Z": -1 + }, + "AxisY": { + "_type": "SAM.Geometry.Spatial.Vector3D,SAM.Geometry", + "X": 0, + "Y": -1, + "Z": 0 + } + }, + "Edge2DLoop": { + "_type": "SAM.Analytical.BoundaryEdge2DLoop,SAM.Analytical", + "Guid": "a6f1b4a4-adf9-4638-b881-d99900a72ff1", + "BoundaryEdge2Ds": [ + { + "_type": "SAM.Analytical.BoundaryEdge2D,SAM.Analytical", + "Guid": "4be0bea5-5265-43eb-a1f5-c8bcf9ecf1b4", + "Curve2D": { + "_type": "SAM.Geometry.Planar.Segment2D,SAM.Geometry", + "Origin": { + "_type": "SAM.Geometry.Planar.Point2D,SAM.Geometry", + "X": -3.2, + "Y": 2.1 + }, + "Vector": { + "_type": "SAM.Geometry.Planar.Vector2D,SAM.Geometry", + "X": 0, + "Y": -4.2 + } + } + }, + { + "_type": "SAM.Analytical.BoundaryEdge2D,SAM.Analytical", + "Guid": "9df9a0ee-a68e-4bfd-a970-d4ee25a8567b", + "Curve2D": { + "_type": "SAM.Geometry.Planar.Segment2D,SAM.Geometry", + "Origin": { + "_type": "SAM.Geometry.Planar.Point2D,SAM.Geometry", + "X": -3.2, + "Y": -2.1 + }, + "Vector": { + "_type": "SAM.Geometry.Planar.Vector2D,SAM.Geometry", + "X": 6.4, + "Y": 0 + } + } + }, + { + "_type": "SAM.Analytical.BoundaryEdge2D,SAM.Analytical", + "Guid": "32e5ec52-b68c-4e50-a5ec-9e1cc4ec3191", + "Curve2D": { + "_type": "SAM.Geometry.Planar.Segment2D,SAM.Geometry", + "Origin": { + "_type": "SAM.Geometry.Planar.Point2D,SAM.Geometry", + "X": 3.2, + "Y": -2.1 + }, + "Vector": { + "_type": "SAM.Geometry.Planar.Vector2D,SAM.Geometry", + "X": 0, + "Y": 4.2 + } + } + }, + { + "_type": "SAM.Analytical.BoundaryEdge2D,SAM.Analytical", + "Guid": "89f57696-43aa-48b5-bc74-824c27676821", + "Curve2D": { + "_type": "SAM.Geometry.Planar.Segment2D,SAM.Geometry", + "Origin": { + "_type": "SAM.Geometry.Planar.Point2D,SAM.Geometry", + "X": 3.2, + "Y": 2.1 + }, + "Vector": { + "_type": "SAM.Geometry.Planar.Vector2D,SAM.Geometry", + "X": -6.4, + "Y": 0 + } + } + } + ] + } + } + } + }, + { + "Key": "285a1884-d494-47a6-9541-942946ea00a7", + "Value": { + "_type": "SAM.Analytical.Panel,SAM.Analytical", + "ParameterSets": [ + { + "_type": "SAM.Core.ParameterSet", + "Name": "SAM.Analytical", + "Guid": "364a2db8-8af5-4624-a75e-66391df5307d", + "Parameters": [ + { + "Name": "Physical Thickness", + "Value": 0.19699999999999998 + } + ] + } + ], + "Name": "FIX_ROOF", + "Guid": "285a1884-d494-47a6-9541-942946ea00a7", + "Type": { + "_type": "SAM.Analytical.Construction,SAM.Analytical", + "Name": "FIX_ROOF", + "Guid": "5080c000-0000-0000-0000-0000000000a2", + "ConstructionLayers": [ + { + "_type": "SAM.Analytical.ConstructionLayer,SAM.Analytical", + "Name": "FIX_Plasterboard", + "Thickness": 0.015 + }, + { + "_type": "SAM.Analytical.ConstructionLayer,SAM.Analytical", + "Name": "FIX_PIR", + "Thickness": 0.16 + }, + { + "_type": "SAM.Analytical.ConstructionLayer,SAM.Analytical", + "Name": "FIX_OSB", + "Thickness": 0.018 + }, + { + "_type": "SAM.Analytical.ConstructionLayer,SAM.Analytical", + "Name": "FIX_Membrane", + "Thickness": 0.004 + } + ] + }, + "PanelType": "Roof", + "PlanarBoundary3D": { + "_type": "SAM.Analytical.PlanarBoundary3D,SAM.Analytical", + "Guid": "ec0a5cb4-a362-410f-9130-e1b9a9c1eb83", + "Plane": { + "_type": "SAM.Geometry.Spatial.Plane,SAM.Geometry", + "Origin": { + "_type": "SAM.Geometry.Spatial.Point3D,SAM.Geometry", + "X": 3.2, + "Y": 2.1, + "Z": 2.85 + }, + "Normal": { + "_type": "SAM.Geometry.Spatial.Vector3D,SAM.Geometry", + "X": 0, + "Y": 0, + "Z": 1 + }, + "AxisY": { + "_type": "SAM.Geometry.Spatial.Vector3D,SAM.Geometry", + "X": 0, + "Y": 1, + "Z": 0 + } + }, + "Edge2DLoop": { + "_type": "SAM.Analytical.BoundaryEdge2DLoop,SAM.Analytical", + "Guid": "108f7e19-a437-4e86-a2dc-dd6b3453bc1d", + "BoundaryEdge2Ds": [ + { + "_type": "SAM.Analytical.BoundaryEdge2D,SAM.Analytical", + "Guid": "139bd2a5-98c6-4a34-8d7b-4ba6cbc9152d", + "Curve2D": { + "_type": "SAM.Geometry.Planar.Segment2D,SAM.Geometry", + "Origin": { + "_type": "SAM.Geometry.Planar.Point2D,SAM.Geometry", + "X": -3.2, + "Y": -2.1 + }, + "Vector": { + "_type": "SAM.Geometry.Planar.Vector2D,SAM.Geometry", + "X": 6.4, + "Y": 0 + } + } + }, + { + "_type": "SAM.Analytical.BoundaryEdge2D,SAM.Analytical", + "Guid": "f376ae18-42a9-4e7c-a910-87c627f41a36", + "Curve2D": { + "_type": "SAM.Geometry.Planar.Segment2D,SAM.Geometry", + "Origin": { + "_type": "SAM.Geometry.Planar.Point2D,SAM.Geometry", + "X": 3.2, + "Y": -2.1 + }, + "Vector": { + "_type": "SAM.Geometry.Planar.Vector2D,SAM.Geometry", + "X": 0, + "Y": 4.2 + } + } + }, + { + "_type": "SAM.Analytical.BoundaryEdge2D,SAM.Analytical", + "Guid": "238e4b55-5487-4d70-b7dd-c844bcb6d243", + "Curve2D": { + "_type": "SAM.Geometry.Planar.Segment2D,SAM.Geometry", + "Origin": { + "_type": "SAM.Geometry.Planar.Point2D,SAM.Geometry", + "X": 3.2, + "Y": 2.1 + }, + "Vector": { + "_type": "SAM.Geometry.Planar.Vector2D,SAM.Geometry", + "X": -6.4, + "Y": 0 + } + } + }, + { + "_type": "SAM.Analytical.BoundaryEdge2D,SAM.Analytical", + "Guid": "5ee85a0b-c47c-4b46-9a3f-d01d159ba248", + "Curve2D": { + "_type": "SAM.Geometry.Planar.Segment2D,SAM.Geometry", + "Origin": { + "_type": "SAM.Geometry.Planar.Point2D,SAM.Geometry", + "X": -3.2, + "Y": 2.1 + }, + "Vector": { + "_type": "SAM.Geometry.Planar.Vector2D,SAM.Geometry", + "X": 0, + "Y": -4.2 + } + } + } + ] + } + } + } + }, + { + "Key": "5e4a7125-c77a-4911-9084-7cbfa9b0786c", + "Value": { + "_type": "SAM.Analytical.Panel,SAM.Analytical", + "ParameterSets": [ + { + "_type": "SAM.Core.ParameterSet", + "Name": "SAM.Analytical", + "Guid": "364a2db8-8af5-4624-a75e-66391df5307d", + "Parameters": [ + { + "Name": "Physical Thickness", + "Value": 0.26750000000000007 + } + ] + } + ], + "Name": "FIX_EXT_WALL", + "Guid": "5e4a7125-c77a-4911-9084-7cbfa9b0786c", + "Type": { + "_type": "SAM.Analytical.Construction,SAM.Analytical", + "Name": "FIX_EXT_WALL", + "Guid": "5080c000-0000-0000-0000-0000000000a1", + "ConstructionLayers": [ + { + "_type": "SAM.Analytical.ConstructionLayer,SAM.Analytical", + "Name": "FIX_Plasterboard", + "Thickness": 0.0125 + }, + { + "_type": "SAM.Analytical.ConstructionLayer,SAM.Analytical", + "Name": "FIX_MineralWool", + "Thickness": 0.14 + }, + { + "_type": "SAM.Analytical.ConstructionLayer,SAM.Analytical", + "Name": "FIX_Blockwork", + "Thickness": 0.1 + }, + { + "_type": "SAM.Analytical.ConstructionLayer,SAM.Analytical", + "Name": "FIX_Render", + "Thickness": 0.015 + } + ] + }, + "PanelType": "WallExternal", + "PlanarBoundary3D": { + "_type": "SAM.Analytical.PlanarBoundary3D,SAM.Analytical", + "Guid": "df87e3b8-8be1-48fc-b1e5-d3d1891eacba", + "Plane": { + "_type": "SAM.Geometry.Spatial.Plane,SAM.Geometry", + "Origin": { + "_type": "SAM.Geometry.Spatial.Point3D,SAM.Geometry", + "X": 3.2, + "Y": 0, + "Z": 1.425 + }, + "Normal": { + "_type": "SAM.Geometry.Spatial.Vector3D,SAM.Geometry", + "X": 0, + "Y": -1, + "Z": 0 + }, + "AxisY": { + "_type": "SAM.Geometry.Spatial.Vector3D,SAM.Geometry", + "X": 0, + "Y": -0, + "Z": -1 + } + }, + "Edge2DLoop": { + "_type": "SAM.Analytical.BoundaryEdge2DLoop,SAM.Analytical", + "Guid": "e3f0ce06-f329-4f26-b461-6d491db05436", + "BoundaryEdge2Ds": [ + { + "_type": "SAM.Analytical.BoundaryEdge2D,SAM.Analytical", + "Guid": "a3673b62-ae34-4785-92c9-3c47423522ae", + "Curve2D": { + "_type": "SAM.Geometry.Planar.Segment2D,SAM.Geometry", + "Origin": { + "_type": "SAM.Geometry.Planar.Point2D,SAM.Geometry", + "X": 3.2, + "Y": 1.425 + }, + "Vector": { + "_type": "SAM.Geometry.Planar.Vector2D,SAM.Geometry", + "X": -6.4, + "Y": 0 + } + } + }, + { + "_type": "SAM.Analytical.BoundaryEdge2D,SAM.Analytical", + "Guid": "5e2cc596-3d01-49d4-8346-27fc22f560a0", + "Curve2D": { + "_type": "SAM.Geometry.Planar.Segment2D,SAM.Geometry", + "Origin": { + "_type": "SAM.Geometry.Planar.Point2D,SAM.Geometry", + "X": -3.2, + "Y": 1.425 + }, + "Vector": { + "_type": "SAM.Geometry.Planar.Vector2D,SAM.Geometry", + "X": 0, + "Y": -2.85 + } + } + }, + { + "_type": "SAM.Analytical.BoundaryEdge2D,SAM.Analytical", + "Guid": "d839a14d-4271-4413-84dc-a2ad2ebcaaab", + "Curve2D": { + "_type": "SAM.Geometry.Planar.Segment2D,SAM.Geometry", + "Origin": { + "_type": "SAM.Geometry.Planar.Point2D,SAM.Geometry", + "X": -3.2, + "Y": -1.425 + }, + "Vector": { + "_type": "SAM.Geometry.Planar.Vector2D,SAM.Geometry", + "X": 6.4, + "Y": 0 + } + } + }, + { + "_type": "SAM.Analytical.BoundaryEdge2D,SAM.Analytical", + "Guid": "10c98739-265e-4944-820f-a1c0ea1a56ab", + "Curve2D": { + "_type": "SAM.Geometry.Planar.Segment2D,SAM.Geometry", + "Origin": { + "_type": "SAM.Geometry.Planar.Point2D,SAM.Geometry", + "X": 3.2, + "Y": -1.425 + }, + "Vector": { + "_type": "SAM.Geometry.Planar.Vector2D,SAM.Geometry", + "X": 0, + "Y": 2.85 + } + } + } + ] + } + }, + "Apertures": [ + { + "_type": "SAM.Analytical.Aperture,SAM.Analytical", + "Name": "FIX_WIN_FRAMED", + "Guid": "95717805-e6c7-4051-9c99-937da3d94f15", + "Type": { + "_type": "SAM.Analytical.ApertureConstruction,SAM.Analytical", + "ParameterSets": [ + { + "_type": "SAM.Core.ParameterSet", + "Name": "SAM.Analytical", + "Guid": "364a2db8-8af5-4624-a75e-66391df5307d", + "Parameters": [ + { + "Name": "Transparent", + "Value": true + }, + { + "Name": "Default Frame Width", + "Value": 0.065 + } + ] + } + ], + "Name": "FIX_WIN_FRAMED", + "Guid": "5080c000-0000-0000-0000-0000000000b1", + "PaneConstructionLayers": [ + { + "_type": "SAM.Analytical.ConstructionLayer,SAM.Analytical", + "Name": "FIX_LaminatedGlass", + "Thickness": 0.0088 + } + ], + "FrameConstructionLayers": [ + { + "_type": "SAM.Analytical.ConstructionLayer,SAM.Analytical", + "Name": "FIX_Timber", + "Thickness": 0.075 + } + ], + "ApertureType": "Window" + }, + "PlanarBoundary3D": { + "_type": "SAM.Analytical.PlanarBoundary3D,SAM.Analytical", + "Guid": "c8937034-43c5-4924-84ff-9a722aff161f", + "Plane": { + "_type": "SAM.Geometry.Spatial.Plane,SAM.Geometry", + "Origin": { + "_type": "SAM.Geometry.Spatial.Point3D,SAM.Geometry", + "X": 2.8, + "Y": 0, + "Z": 1.5250000000000001 + }, + "Normal": { + "_type": "SAM.Geometry.Spatial.Vector3D,SAM.Geometry", + "X": 0, + "Y": -1, + "Z": 0 + }, + "AxisY": { + "_type": "SAM.Geometry.Spatial.Vector3D,SAM.Geometry", + "X": 0, + "Y": -0, + "Z": -1 + } + }, + "Edge2DLoop": { + "_type": "SAM.Analytical.BoundaryEdge2DLoop,SAM.Analytical", + "Guid": "7202bc06-85ba-44d3-b2a7-1c6fcf3edd54", + "BoundaryEdge2Ds": [ + { + "_type": "SAM.Analytical.BoundaryEdge2D,SAM.Analytical", + "Guid": "837187ed-7f8b-4aa6-bdcc-8883d9c0bbf8", + "Curve2D": { + "_type": "SAM.Geometry.Planar.Segment2D,SAM.Geometry", + "Origin": { + "_type": "SAM.Geometry.Planar.Point2D,SAM.Geometry", + "X": 1.1999999999999997, + "Y": 0.6750000000000002 + }, + "Vector": { + "_type": "SAM.Geometry.Planar.Vector2D,SAM.Geometry", + "X": -2.4, + "Y": 0 + } + } + }, + { + "_type": "SAM.Analytical.BoundaryEdge2D,SAM.Analytical", + "Guid": "68891275-dc75-4858-bab6-a3d9df920f18", + "Curve2D": { + "_type": "SAM.Geometry.Planar.Segment2D,SAM.Geometry", + "Origin": { + "_type": "SAM.Geometry.Planar.Point2D,SAM.Geometry", + "X": -1.2000000000000002, + "Y": 0.6750000000000002 + }, + "Vector": { + "_type": "SAM.Geometry.Planar.Vector2D,SAM.Geometry", + "X": 0, + "Y": -1.35 + } + } + }, + { + "_type": "SAM.Analytical.BoundaryEdge2D,SAM.Analytical", + "Guid": "1a2617d9-5ba7-48be-95e3-764cb4600351", + "Curve2D": { + "_type": "SAM.Geometry.Planar.Segment2D,SAM.Geometry", + "Origin": { + "_type": "SAM.Geometry.Planar.Point2D,SAM.Geometry", + "X": -1.2000000000000002, + "Y": -0.675 + }, + "Vector": { + "_type": "SAM.Geometry.Planar.Vector2D,SAM.Geometry", + "X": 2.4, + "Y": 0 + } + } + }, + { + "_type": "SAM.Analytical.BoundaryEdge2D,SAM.Analytical", + "Guid": "41908730-25a3-4eaf-8a47-5d06f2252c57", + "Curve2D": { + "_type": "SAM.Geometry.Planar.Segment2D,SAM.Geometry", + "Origin": { + "_type": "SAM.Geometry.Planar.Point2D,SAM.Geometry", + "X": 1.1999999999999997, + "Y": -0.675 + }, + "Vector": { + "_type": "SAM.Geometry.Planar.Vector2D,SAM.Geometry", + "X": 0, + "Y": 1.35 + } + } + } + ] + } + } + } + ] + } + }, + { + "Key": "78af8769-1ba0-43bc-844e-f1ca72fa447e", + "Value": { + "_type": "SAM.Analytical.Panel,SAM.Analytical", + "ParameterSets": [ + { + "_type": "SAM.Core.ParameterSet", + "Name": "SAM.Analytical", + "Guid": "364a2db8-8af5-4624-a75e-66391df5307d", + "Parameters": [ + { + "Name": "Physical Thickness", + "Value": 0.26750000000000007 + } + ] + } + ], + "Name": "FIX_EXT_WALL", + "Guid": "78af8769-1ba0-43bc-844e-f1ca72fa447e", + "Type": { + "_type": "SAM.Analytical.Construction,SAM.Analytical", + "Name": "FIX_EXT_WALL", + "Guid": "5080c000-0000-0000-0000-0000000000a1", + "ConstructionLayers": [ + { + "_type": "SAM.Analytical.ConstructionLayer,SAM.Analytical", + "Name": "FIX_Plasterboard", + "Thickness": 0.0125 + }, + { + "_type": "SAM.Analytical.ConstructionLayer,SAM.Analytical", + "Name": "FIX_MineralWool", + "Thickness": 0.14 + }, + { + "_type": "SAM.Analytical.ConstructionLayer,SAM.Analytical", + "Name": "FIX_Blockwork", + "Thickness": 0.1 + }, + { + "_type": "SAM.Analytical.ConstructionLayer,SAM.Analytical", + "Name": "FIX_Render", + "Thickness": 0.015 + } + ] + }, + "PanelType": "WallExternal", + "PlanarBoundary3D": { + "_type": "SAM.Analytical.PlanarBoundary3D,SAM.Analytical", + "Guid": "e8181017-24da-4ea1-b757-dd239e280255", + "Plane": { + "_type": "SAM.Geometry.Spatial.Plane,SAM.Geometry", + "Origin": { + "_type": "SAM.Geometry.Spatial.Point3D,SAM.Geometry", + "X": 6.4, + "Y": 2.1, + "Z": 1.425 + }, + "Normal": { + "_type": "SAM.Geometry.Spatial.Vector3D,SAM.Geometry", + "X": 1, + "Y": 0, + "Z": 0 + }, + "AxisY": { + "_type": "SAM.Geometry.Spatial.Vector3D,SAM.Geometry", + "X": 0, + "Y": 0, + "Z": -1 + } + }, + "Edge2DLoop": { + "_type": "SAM.Analytical.BoundaryEdge2DLoop,SAM.Analytical", + "Guid": "96f6d8de-a326-4f6c-996b-363555718ce1", + "BoundaryEdge2Ds": [ + { + "_type": "SAM.Analytical.BoundaryEdge2D,SAM.Analytical", + "Guid": "dc7baa8c-1182-4cb7-9118-b241747ca37a", + "Curve2D": { + "_type": "SAM.Geometry.Planar.Segment2D,SAM.Geometry", + "Origin": { + "_type": "SAM.Geometry.Planar.Point2D,SAM.Geometry", + "X": 2.1, + "Y": 1.425 + }, + "Vector": { + "_type": "SAM.Geometry.Planar.Vector2D,SAM.Geometry", + "X": -4.2, + "Y": 0 + } + } + }, + { + "_type": "SAM.Analytical.BoundaryEdge2D,SAM.Analytical", + "Guid": "637e2806-d0a7-43e9-bce1-97276c7011bc", + "Curve2D": { + "_type": "SAM.Geometry.Planar.Segment2D,SAM.Geometry", + "Origin": { + "_type": "SAM.Geometry.Planar.Point2D,SAM.Geometry", + "X": -2.1, + "Y": 1.425 + }, + "Vector": { + "_type": "SAM.Geometry.Planar.Vector2D,SAM.Geometry", + "X": 0, + "Y": -2.85 + } + } + }, + { + "_type": "SAM.Analytical.BoundaryEdge2D,SAM.Analytical", + "Guid": "44c92472-1c39-45c8-9669-c74d3618f00a", + "Curve2D": { + "_type": "SAM.Geometry.Planar.Segment2D,SAM.Geometry", + "Origin": { + "_type": "SAM.Geometry.Planar.Point2D,SAM.Geometry", + "X": -2.1, + "Y": -1.425 + }, + "Vector": { + "_type": "SAM.Geometry.Planar.Vector2D,SAM.Geometry", + "X": 4.2, + "Y": 0 + } + } + }, + { + "_type": "SAM.Analytical.BoundaryEdge2D,SAM.Analytical", + "Guid": "33123cae-79d1-48b1-b79f-aabcce47afb5", + "Curve2D": { + "_type": "SAM.Geometry.Planar.Segment2D,SAM.Geometry", + "Origin": { + "_type": "SAM.Geometry.Planar.Point2D,SAM.Geometry", + "X": 2.1, + "Y": -1.425 + }, + "Vector": { + "_type": "SAM.Geometry.Planar.Vector2D,SAM.Geometry", + "X": 0, + "Y": 2.85 + } + } + } + ] + } + } + } + }, + { + "Key": "0a4398eb-cdab-43d8-bcba-736116a2a029", + "Value": { + "_type": "SAM.Analytical.Panel,SAM.Analytical", + "ParameterSets": [ + { + "_type": "SAM.Core.ParameterSet", + "Name": "SAM.Analytical", + "Guid": "364a2db8-8af5-4624-a75e-66391df5307d", + "Parameters": [ + { + "Name": "Physical Thickness", + "Value": 0.26750000000000007 + } + ] + } + ], + "Name": "FIX_EXT_WALL", + "Guid": "0a4398eb-cdab-43d8-bcba-736116a2a029", + "Type": { + "_type": "SAM.Analytical.Construction,SAM.Analytical", + "Name": "FIX_EXT_WALL", + "Guid": "5080c000-0000-0000-0000-0000000000a1", + "ConstructionLayers": [ + { + "_type": "SAM.Analytical.ConstructionLayer,SAM.Analytical", + "Name": "FIX_Plasterboard", + "Thickness": 0.0125 + }, + { + "_type": "SAM.Analytical.ConstructionLayer,SAM.Analytical", + "Name": "FIX_MineralWool", + "Thickness": 0.14 + }, + { + "_type": "SAM.Analytical.ConstructionLayer,SAM.Analytical", + "Name": "FIX_Blockwork", + "Thickness": 0.1 + }, + { + "_type": "SAM.Analytical.ConstructionLayer,SAM.Analytical", + "Name": "FIX_Render", + "Thickness": 0.015 + } + ] + }, + "PanelType": "WallExternal", + "PlanarBoundary3D": { + "_type": "SAM.Analytical.PlanarBoundary3D,SAM.Analytical", + "Guid": "c0758f72-915b-4d96-baea-59100733983b", + "Plane": { + "_type": "SAM.Geometry.Spatial.Plane,SAM.Geometry", + "Origin": { + "_type": "SAM.Geometry.Spatial.Point3D,SAM.Geometry", + "X": 3.2, + "Y": 4.2, + "Z": 1.425 + }, + "Normal": { + "_type": "SAM.Geometry.Spatial.Vector3D,SAM.Geometry", + "X": 0, + "Y": 1, + "Z": 0 + }, + "AxisY": { + "_type": "SAM.Geometry.Spatial.Vector3D,SAM.Geometry", + "X": 0, + "Y": 0, + "Z": -1 + } + }, + "Edge2DLoop": { + "_type": "SAM.Analytical.BoundaryEdge2DLoop,SAM.Analytical", + "Guid": "cdfceb94-053f-47ed-a3a7-8b377d88a9f4", + "BoundaryEdge2Ds": [ + { + "_type": "SAM.Analytical.BoundaryEdge2D,SAM.Analytical", + "Guid": "cad6f82a-6dea-4c30-a40d-967405c870a9", + "Curve2D": { + "_type": "SAM.Geometry.Planar.Segment2D,SAM.Geometry", + "Origin": { + "_type": "SAM.Geometry.Planar.Point2D,SAM.Geometry", + "X": 3.2, + "Y": 1.425 + }, + "Vector": { + "_type": "SAM.Geometry.Planar.Vector2D,SAM.Geometry", + "X": -6.4, + "Y": 0 + } + } + }, + { + "_type": "SAM.Analytical.BoundaryEdge2D,SAM.Analytical", + "Guid": "7872c0a6-aca8-42aa-b70b-672676adc073", + "Curve2D": { + "_type": "SAM.Geometry.Planar.Segment2D,SAM.Geometry", + "Origin": { + "_type": "SAM.Geometry.Planar.Point2D,SAM.Geometry", + "X": -3.2, + "Y": 1.425 + }, + "Vector": { + "_type": "SAM.Geometry.Planar.Vector2D,SAM.Geometry", + "X": 0, + "Y": -2.85 + } + } + }, + { + "_type": "SAM.Analytical.BoundaryEdge2D,SAM.Analytical", + "Guid": "a9697314-9324-479e-8894-1fd504a58915", + "Curve2D": { + "_type": "SAM.Geometry.Planar.Segment2D,SAM.Geometry", + "Origin": { + "_type": "SAM.Geometry.Planar.Point2D,SAM.Geometry", + "X": -3.2, + "Y": -1.425 + }, + "Vector": { + "_type": "SAM.Geometry.Planar.Vector2D,SAM.Geometry", + "X": 6.4, + "Y": 0 + } + } + }, + { + "_type": "SAM.Analytical.BoundaryEdge2D,SAM.Analytical", + "Guid": "a1bfcdee-6843-4df1-8c22-8d5d80406c84", + "Curve2D": { + "_type": "SAM.Geometry.Planar.Segment2D,SAM.Geometry", + "Origin": { + "_type": "SAM.Geometry.Planar.Point2D,SAM.Geometry", + "X": 3.2, + "Y": -1.425 + }, + "Vector": { + "_type": "SAM.Geometry.Planar.Vector2D,SAM.Geometry", + "X": 0, + "Y": 2.85 + } + } + } + ] + } + } + } + }, + { + "Key": "18cb687b-53ce-4282-be8e-6ba267a6ae2b", + "Value": { + "_type": "SAM.Analytical.Panel,SAM.Analytical", + "ParameterSets": [ + { + "_type": "SAM.Core.ParameterSet", + "Name": "SAM.Analytical", + "Guid": "364a2db8-8af5-4624-a75e-66391df5307d", + "Parameters": [ + { + "Name": "Physical Thickness", + "Value": 0.26750000000000007 + } + ] + } + ], + "Name": "FIX_EXT_WALL", + "Guid": "18cb687b-53ce-4282-be8e-6ba267a6ae2b", + "Type": { + "_type": "SAM.Analytical.Construction,SAM.Analytical", + "Name": "FIX_EXT_WALL", + "Guid": "5080c000-0000-0000-0000-0000000000a1", + "ConstructionLayers": [ + { + "_type": "SAM.Analytical.ConstructionLayer,SAM.Analytical", + "Name": "FIX_Plasterboard", + "Thickness": 0.0125 + }, + { + "_type": "SAM.Analytical.ConstructionLayer,SAM.Analytical", + "Name": "FIX_MineralWool", + "Thickness": 0.14 + }, + { + "_type": "SAM.Analytical.ConstructionLayer,SAM.Analytical", + "Name": "FIX_Blockwork", + "Thickness": 0.1 + }, + { + "_type": "SAM.Analytical.ConstructionLayer,SAM.Analytical", + "Name": "FIX_Render", + "Thickness": 0.015 + } + ] + }, + "PanelType": "WallExternal", + "PlanarBoundary3D": { + "_type": "SAM.Analytical.PlanarBoundary3D,SAM.Analytical", + "Guid": "780dc3c5-18b7-4ccc-8ae3-e1d9a1683dce", + "Plane": { + "_type": "SAM.Geometry.Spatial.Plane,SAM.Geometry", + "Origin": { + "_type": "SAM.Geometry.Spatial.Point3D,SAM.Geometry", + "X": 0, + "Y": 2.1, + "Z": 1.425 + }, + "Normal": { + "_type": "SAM.Geometry.Spatial.Vector3D,SAM.Geometry", + "X": -1, + "Y": 0, + "Z": 0 + }, + "AxisY": { + "_type": "SAM.Geometry.Spatial.Vector3D,SAM.Geometry", + "X": 0, + "Y": 0, + "Z": -1 + } + }, + "Edge2DLoop": { + "_type": "SAM.Analytical.BoundaryEdge2DLoop,SAM.Analytical", + "Guid": "54b87ee6-c47e-4f79-8b87-2ca02db0b66b", + "BoundaryEdge2Ds": [ + { + "_type": "SAM.Analytical.BoundaryEdge2D,SAM.Analytical", + "Guid": "62b1c169-5549-4d60-b59b-9343c3b128c7", + "Curve2D": { + "_type": "SAM.Geometry.Planar.Segment2D,SAM.Geometry", + "Origin": { + "_type": "SAM.Geometry.Planar.Point2D,SAM.Geometry", + "X": 2.1, + "Y": 1.425 + }, + "Vector": { + "_type": "SAM.Geometry.Planar.Vector2D,SAM.Geometry", + "X": -4.2, + "Y": 0 + } + } + }, + { + "_type": "SAM.Analytical.BoundaryEdge2D,SAM.Analytical", + "Guid": "3d5b9fc3-9f78-46e8-a382-3e14c368082a", + "Curve2D": { + "_type": "SAM.Geometry.Planar.Segment2D,SAM.Geometry", + "Origin": { + "_type": "SAM.Geometry.Planar.Point2D,SAM.Geometry", + "X": -2.1, + "Y": 1.425 + }, + "Vector": { + "_type": "SAM.Geometry.Planar.Vector2D,SAM.Geometry", + "X": 0, + "Y": -2.85 + } + } + }, + { + "_type": "SAM.Analytical.BoundaryEdge2D,SAM.Analytical", + "Guid": "0b49fdfd-e5c2-40d6-92ac-45ddd199b46e", + "Curve2D": { + "_type": "SAM.Geometry.Planar.Segment2D,SAM.Geometry", + "Origin": { + "_type": "SAM.Geometry.Planar.Point2D,SAM.Geometry", + "X": -2.1, + "Y": -1.425 + }, + "Vector": { + "_type": "SAM.Geometry.Planar.Vector2D,SAM.Geometry", + "X": 4.2, + "Y": 0 + } + } + }, + { + "_type": "SAM.Analytical.BoundaryEdge2D,SAM.Analytical", + "Guid": "62fddc7a-912f-45fc-8667-884986919fbc", + "Curve2D": { + "_type": "SAM.Geometry.Planar.Segment2D,SAM.Geometry", + "Origin": { + "_type": "SAM.Geometry.Planar.Point2D,SAM.Geometry", + "X": 2.1, + "Y": -1.425 + }, + "Vector": { + "_type": "SAM.Geometry.Planar.Vector2D,SAM.Geometry", + "X": 0, + "Y": 2.85 + } + } + } + ] + } + }, + "Apertures": [ + { + "_type": "SAM.Analytical.Aperture,SAM.Analytical", + "Name": "FIX_WIN_UNFRAMED", + "Guid": "6adea09c-1557-4dfd-bfab-75f66600343f", + "Type": { + "_type": "SAM.Analytical.ApertureConstruction,SAM.Analytical", + "ParameterSets": [ + { + "_type": "SAM.Core.ParameterSet", + "Name": "SAM.Analytical", + "Guid": "364a2db8-8af5-4624-a75e-66391df5307d", + "Parameters": [ + { + "Name": "Transparent", + "Value": true + } + ] + } + ], + "Name": "FIX_WIN_UNFRAMED", + "Guid": "5080c000-0000-0000-0000-0000000000b2", + "PaneConstructionLayers": [ + { + "_type": "SAM.Analytical.ConstructionLayer,SAM.Analytical", + "Name": "FIX_LaminatedGlass", + "Thickness": 0.0088 + } + ], + "ApertureType": "Window" + }, + "PlanarBoundary3D": { + "_type": "SAM.Analytical.PlanarBoundary3D,SAM.Analytical", + "Guid": "4cac7ede-c97d-4be8-8081-65bb1aa7c06e", + "Plane": { + "_type": "SAM.Geometry.Spatial.Plane,SAM.Geometry", + "Origin": { + "_type": "SAM.Geometry.Spatial.Point3D,SAM.Geometry", + "X": 0, + "Y": 2.45, + "Z": 1.5 + }, + "Normal": { + "_type": "SAM.Geometry.Spatial.Vector3D,SAM.Geometry", + "X": -1, + "Y": 0, + "Z": 0 + }, + "AxisY": { + "_type": "SAM.Geometry.Spatial.Vector3D,SAM.Geometry", + "X": 0, + "Y": 0, + "Z": -1 + } + }, + "Edge2DLoop": { + "_type": "SAM.Analytical.BoundaryEdge2DLoop,SAM.Analytical", + "Guid": "7dcc0aeb-f23c-473d-af95-a7b81243d42f", + "BoundaryEdge2Ds": [ + { + "_type": "SAM.Analytical.BoundaryEdge2D,SAM.Analytical", + "Guid": "1912c170-6d9e-401c-a114-df1f3dcd9832", + "Curve2D": { + "_type": "SAM.Geometry.Planar.Segment2D,SAM.Geometry", + "Origin": { + "_type": "SAM.Geometry.Planar.Point2D,SAM.Geometry", + "X": 0.44999999999999973, + "Y": 0.6 + }, + "Vector": { + "_type": "SAM.Geometry.Planar.Vector2D,SAM.Geometry", + "X": -0.8999999999999999, + "Y": 0 + } + } + }, + { + "_type": "SAM.Analytical.BoundaryEdge2D,SAM.Analytical", + "Guid": "a15746ff-f3bc-4170-b69f-79539abeab80", + "Curve2D": { + "_type": "SAM.Geometry.Planar.Segment2D,SAM.Geometry", + "Origin": { + "_type": "SAM.Geometry.Planar.Point2D,SAM.Geometry", + "X": -0.4500000000000002, + "Y": 0.6 + }, + "Vector": { + "_type": "SAM.Geometry.Planar.Vector2D,SAM.Geometry", + "X": 0, + "Y": -1.2000000000000002 + } + } + }, + { + "_type": "SAM.Analytical.BoundaryEdge2D,SAM.Analytical", + "Guid": "42e26b26-f962-48da-996f-e2ed93e2f80b", + "Curve2D": { + "_type": "SAM.Geometry.Planar.Segment2D,SAM.Geometry", + "Origin": { + "_type": "SAM.Geometry.Planar.Point2D,SAM.Geometry", + "X": -0.4500000000000002, + "Y": -0.6000000000000001 + }, + "Vector": { + "_type": "SAM.Geometry.Planar.Vector2D,SAM.Geometry", + "X": 0.8999999999999999, + "Y": 0 + } + } + }, + { + "_type": "SAM.Analytical.BoundaryEdge2D,SAM.Analytical", + "Guid": "3c1efbf4-908b-4093-a4e2-a4283394f1df", + "Curve2D": { + "_type": "SAM.Geometry.Planar.Segment2D,SAM.Geometry", + "Origin": { + "_type": "SAM.Geometry.Planar.Point2D,SAM.Geometry", + "X": 0.44999999999999973, + "Y": -0.6000000000000001 + }, + "Vector": { + "_type": "SAM.Geometry.Planar.Vector2D,SAM.Geometry", + "X": 0, + "Y": 1.2000000000000002 + } + } + } + ] + } + } + } + ] + } + } + ] + } + ], + "Relations": [ + { + "Key": "SAM.Analytical.Space", + "Value": [ + { + "Key": "5080c000-0000-0000-0000-00000000c001", + "Value": [ + "b07106b3-da42-40de-a8de-b1284bc3d785", + "285a1884-d494-47a6-9541-942946ea00a7", + "5e4a7125-c77a-4911-9084-7cbfa9b0786c", + "78af8769-1ba0-43bc-844e-f1ca72fa447e", + "0a4398eb-cdab-43d8-bcba-736116a2a029", + "18cb687b-53ce-4282-be8e-6ba267a6ae2b" + ] + } + ] + }, + { + "Key": "SAM.Analytical.Panel", + "Value": [ + { + "Key": "b07106b3-da42-40de-a8de-b1284bc3d785", + "Value": [ + "5080c000-0000-0000-0000-00000000c001" + ] + }, + { + "Key": "285a1884-d494-47a6-9541-942946ea00a7", + "Value": [ + "5080c000-0000-0000-0000-00000000c001" + ] + }, + { + "Key": "5e4a7125-c77a-4911-9084-7cbfa9b0786c", + "Value": [ + "5080c000-0000-0000-0000-00000000c001" + ] + }, + { + "Key": "78af8769-1ba0-43bc-844e-f1ca72fa447e", + "Value": [ + "5080c000-0000-0000-0000-00000000c001" + ] + }, + { + "Key": "0a4398eb-cdab-43d8-bcba-736116a2a029", + "Value": [ + "5080c000-0000-0000-0000-00000000c001" + ] + }, + { + "Key": "18cb687b-53ce-4282-be8e-6ba267a6ae2b", + "Value": [ + "5080c000-0000-0000-0000-00000000c001" + ] + } + ] + } + ] + }, + "MaterialLibrary": { + "_type": "SAM.Core.MaterialLibrary,SAM.Core", + "Name": "S08 PR-C fixture materials", + "Guid": "84ce1287-92a3-447a-a32c-db7b929d1b83", + "Objects": [ + { + "_type": "SAM.Core.OpaqueMaterial,SAM.Core", + "ParameterSets": [ + { + "_type": "SAM.Core.ParameterSet", + "Name": "SAM.Analytical", + "Guid": "364a2db8-8af5-4624-a75e-66391df5307d", + "Parameters": [ + { + "Name": "External Solar Reflectance", + "Value": 0.62 + }, + { + "Name": "Internal Solar Reflectance", + "Value": 0.68 + }, + { + "Name": "External Light Reflectance", + "Value": 0.64 + }, + { + "Name": "Internal Light Reflectance", + "Value": 0.7 + }, + { + "Name": "External Emissivity", + "Value": 0.9 + }, + { + "Name": "Internal Emissivity", + "Value": 0.91 + }, + { + "Name": "Vapour Diffusion Factor", + "Value": 8.0 + } + ] + } + ], + "Name": "FIX_Plasterboard", + "Guid": "5abe47a0-54a3-48c5-9c65-a2230a1c7ff2", + "Group": "S08 PR-C fixture", + "DisplayName": "FIX_Plasterboard", + "Description": "FIX_Plasterboard", + "ThermalConductivity": 0.21, + "SpecificHeatCapacity": 1090, + "Density": 700 + }, + { + "_type": "SAM.Core.OpaqueMaterial,SAM.Core", + "ParameterSets": [ + { + "_type": "SAM.Core.ParameterSet", + "Name": "SAM.Analytical", + "Guid": "364a2db8-8af5-4624-a75e-66391df5307d", + "Parameters": [ + { + "Name": "External Solar Reflectance", + "Value": 0.48 + }, + { + "Name": "Internal Solar Reflectance", + "Value": 0.51 + }, + { + "Name": "External Light Reflectance", + "Value": 0.49 + }, + { + "Name": "Internal Light Reflectance", + "Value": 0.53 + }, + { + "Name": "External Emissivity", + "Value": 0.89 + }, + { + "Name": "Internal Emissivity", + "Value": 0.92 + }, + { + "Name": "Vapour Diffusion Factor", + "Value": 1.2 + } + ] + } + ], + "Name": "FIX_MineralWool", + "Guid": "251d5e01-a5e9-4d38-aa2b-013eb16f2691", + "Group": "S08 PR-C fixture", + "DisplayName": "FIX_MineralWool", + "Description": "FIX_MineralWool", + "ThermalConductivity": 0.037, + "SpecificHeatCapacity": 1030, + "Density": 45 + }, + { + "_type": "SAM.Core.OpaqueMaterial,SAM.Core", + "ParameterSets": [ + { + "_type": "SAM.Core.ParameterSet", + "Name": "SAM.Analytical", + "Guid": "364a2db8-8af5-4624-a75e-66391df5307d", + "Parameters": [ + { + "Name": "External Solar Reflectance", + "Value": 0.38 + }, + { + "Name": "Internal Solar Reflectance", + "Value": 0.44 + }, + { + "Name": "External Light Reflectance", + "Value": 0.39 + }, + { + "Name": "Internal Light Reflectance", + "Value": 0.46 + }, + { + "Name": "External Emissivity", + "Value": 0.93 + }, + { + "Name": "Internal Emissivity", + "Value": 0.94 + }, + { + "Name": "Vapour Diffusion Factor", + "Value": 10.0 + } + ] + } + ], + "Name": "FIX_Blockwork", + "Guid": "6998e0fb-c981-4595-bade-0703a69c0724", + "Group": "S08 PR-C fixture", + "DisplayName": "FIX_Blockwork", + "Description": "FIX_Blockwork", + "ThermalConductivity": 0.19, + "SpecificHeatCapacity": 1000, + "Density": 1400 + }, + { + "_type": "SAM.Core.OpaqueMaterial,SAM.Core", + "ParameterSets": [ + { + "_type": "SAM.Core.ParameterSet", + "Name": "SAM.Analytical", + "Guid": "364a2db8-8af5-4624-a75e-66391df5307d", + "Parameters": [ + { + "Name": "External Solar Reflectance", + "Value": 0.57 + }, + { + "Name": "Internal Solar Reflectance", + "Value": 0.36 + }, + { + "Name": "External Light Reflectance", + "Value": 0.58 + }, + { + "Name": "Internal Light Reflectance", + "Value": 0.37 + }, + { + "Name": "External Emissivity", + "Value": 0.88 + }, + { + "Name": "Internal Emissivity", + "Value": 0.93 + }, + { + "Name": "Vapour Diffusion Factor", + "Value": 25.0 + } + ] + } + ], + "Name": "FIX_Render", + "Guid": "f7af24b1-8c9c-4d86-8070-8145cf5ed367", + "Group": "S08 PR-C fixture", + "DisplayName": "FIX_Render", + "Description": "FIX_Render", + "ThermalConductivity": 0.87, + "SpecificHeatCapacity": 920, + "Density": 1750 + }, + { + "_type": "SAM.Core.OpaqueMaterial,SAM.Core", + "ParameterSets": [ + { + "_type": "SAM.Core.ParameterSet", + "Name": "SAM.Analytical", + "Guid": "364a2db8-8af5-4624-a75e-66391df5307d", + "Parameters": [ + { + "Name": "External Solar Reflectance", + "Value": 0.53 + }, + { + "Name": "Internal Solar Reflectance", + "Value": 0.55 + }, + { + "Name": "External Light Reflectance", + "Value": 0.54 + }, + { + "Name": "Internal Light Reflectance", + "Value": 0.56 + }, + { + "Name": "External Emissivity", + "Value": 0.87 + }, + { + "Name": "Internal Emissivity", + "Value": 0.95 + }, + { + "Name": "Vapour Diffusion Factor", + "Value": 60.0 + } + ] + } + ], + "Name": "FIX_PIR", + "Guid": "afdb47df-b259-4559-9a9d-87ab5c05c7ae", + "Group": "S08 PR-C fixture", + "DisplayName": "FIX_PIR", + "Description": "FIX_PIR", + "ThermalConductivity": 0.022, + "SpecificHeatCapacity": 1400, + "Density": 32 + }, + { + "_type": "SAM.Core.OpaqueMaterial,SAM.Core", + "ParameterSets": [ + { + "_type": "SAM.Core.ParameterSet", + "Name": "SAM.Analytical", + "Guid": "364a2db8-8af5-4624-a75e-66391df5307d", + "Parameters": [ + { + "Name": "External Solar Reflectance", + "Value": 0.43 + }, + { + "Name": "Internal Solar Reflectance", + "Value": 0.47 + }, + { + "Name": "External Light Reflectance", + "Value": 0.42 + }, + { + "Name": "Internal Light Reflectance", + "Value": 0.48 + }, + { + "Name": "External Emissivity", + "Value": 0.91 + }, + { + "Name": "Internal Emissivity", + "Value": 0.89 + }, + { + "Name": "Vapour Diffusion Factor", + "Value": 165.0 + } + ] + } + ], + "Name": "FIX_OSB", + "Guid": "b65fc732-21ba-4502-9c56-2bd02730cc97", + "Group": "S08 PR-C fixture", + "DisplayName": "FIX_OSB", + "Description": "FIX_OSB", + "ThermalConductivity": 0.13, + "SpecificHeatCapacity": 1700, + "Density": 600 + }, + { + "_type": "SAM.Core.OpaqueMaterial,SAM.Core", + "ParameterSets": [ + { + "_type": "SAM.Core.ParameterSet", + "Name": "SAM.Analytical", + "Guid": "364a2db8-8af5-4624-a75e-66391df5307d", + "Parameters": [ + { + "Name": "External Solar Reflectance", + "Value": 0.14 + }, + { + "Name": "Internal Solar Reflectance", + "Value": 0.24 + }, + { + "Name": "External Light Reflectance", + "Value": 0.15 + }, + { + "Name": "Internal Light Reflectance", + "Value": 0.25 + }, + { + "Name": "External Emissivity", + "Value": 0.92 + }, + { + "Name": "Internal Emissivity", + "Value": 0.86 + }, + { + "Name": "Vapour Diffusion Factor", + "Value": 50000.0 + } + ] + } + ], + "Name": "FIX_Membrane", + "Guid": "379ce52b-58de-4840-bd6e-dbf0756aab03", + "Group": "S08 PR-C fixture", + "DisplayName": "FIX_Membrane", + "Description": "FIX_Membrane", + "ThermalConductivity": 0.17, + "SpecificHeatCapacity": 1460, + "Density": 1180 + }, + { + "_type": "SAM.Core.OpaqueMaterial,SAM.Core", + "ParameterSets": [ + { + "_type": "SAM.Core.ParameterSet", + "Name": "SAM.Analytical", + "Guid": "364a2db8-8af5-4624-a75e-66391df5307d", + "Parameters": [ + { + "Name": "External Solar Reflectance", + "Value": 0.27 + }, + { + "Name": "Internal Solar Reflectance", + "Value": 0.33 + }, + { + "Name": "External Light Reflectance", + "Value": 0.28 + }, + { + "Name": "Internal Light Reflectance", + "Value": 0.34 + }, + { + "Name": "External Emissivity", + "Value": 0.94 + }, + { + "Name": "Internal Emissivity", + "Value": 0.9 + }, + { + "Name": "Vapour Diffusion Factor", + "Value": 15.0 + } + ] + } + ], + "Name": "FIX_Screed", + "Guid": "47d4de1a-35b0-4267-9e66-9f2db75464d9", + "Group": "S08 PR-C fixture", + "DisplayName": "FIX_Screed", + "Description": "FIX_Screed", + "ThermalConductivity": 1.28, + "SpecificHeatCapacity": 840, + "Density": 2050 + }, + { + "_type": "SAM.Core.OpaqueMaterial,SAM.Core", + "ParameterSets": [ + { + "_type": "SAM.Core.ParameterSet", + "Name": "SAM.Analytical", + "Guid": "364a2db8-8af5-4624-a75e-66391df5307d", + "Parameters": [ + { + "Name": "External Solar Reflectance", + "Value": 0.58 + }, + { + "Name": "Internal Solar Reflectance", + "Value": 0.61 + }, + { + "Name": "External Light Reflectance", + "Value": 0.59 + }, + { + "Name": "Internal Light Reflectance", + "Value": 0.63 + }, + { + "Name": "External Emissivity", + "Value": 0.85 + }, + { + "Name": "Internal Emissivity", + "Value": 0.96 + }, + { + "Name": "Vapour Diffusion Factor", + "Value": 40.0 + } + ] + } + ], + "Name": "FIX_EPS", + "Guid": "23500162-6427-47ba-baa6-bc889cc8315f", + "Group": "S08 PR-C fixture", + "DisplayName": "FIX_EPS", + "Description": "FIX_EPS", + "ThermalConductivity": 0.034, + "SpecificHeatCapacity": 1450, + "Density": 22 + }, + { + "_type": "SAM.Core.OpaqueMaterial,SAM.Core", + "ParameterSets": [ + { + "_type": "SAM.Core.ParameterSet", + "Name": "SAM.Analytical", + "Guid": "364a2db8-8af5-4624-a75e-66391df5307d", + "Parameters": [ + { + "Name": "External Solar Reflectance", + "Value": 0.31 + }, + { + "Name": "Internal Solar Reflectance", + "Value": 0.29 + }, + { + "Name": "External Light Reflectance", + "Value": 0.32 + }, + { + "Name": "Internal Light Reflectance", + "Value": 0.3 + }, + { + "Name": "External Emissivity", + "Value": 0.95 + }, + { + "Name": "Internal Emissivity", + "Value": 0.87 + }, + { + "Name": "Vapour Diffusion Factor", + "Value": 110.0 + } + ] + } + ], + "Name": "FIX_Concrete", + "Guid": "9d3a3ab2-fa4a-4f2a-ac00-cb1542eec142", + "Group": "S08 PR-C fixture", + "DisplayName": "FIX_Concrete", + "Description": "FIX_Concrete", + "ThermalConductivity": 1.95, + "SpecificHeatCapacity": 880, + "Density": 2300 + }, + { + "_type": "SAM.Core.OpaqueMaterial,SAM.Core", + "ParameterSets": [ + { + "_type": "SAM.Core.ParameterSet", + "Name": "SAM.Analytical", + "Guid": "364a2db8-8af5-4624-a75e-66391df5307d", + "Parameters": [ + { + "Name": "External Solar Reflectance", + "Value": 0.41 + }, + { + "Name": "Internal Solar Reflectance", + "Value": 0.39 + }, + { + "Name": "External Light Reflectance", + "Value": 0.4 + }, + { + "Name": "Internal Light Reflectance", + "Value": 0.38 + }, + { + "Name": "External Emissivity", + "Value": 0.86 + }, + { + "Name": "Internal Emissivity", + "Value": 0.88 + }, + { + "Name": "Vapour Diffusion Factor", + "Value": 50.0 + } + ] + } + ], + "Name": "FIX_Timber", + "Guid": "8a3b8b68-33ba-422b-a8bc-ffed41417d85", + "Group": "S08 PR-C fixture", + "DisplayName": "FIX_Timber", + "Description": "FIX_Timber", + "ThermalConductivity": 0.14, + "SpecificHeatCapacity": 1600, + "Density": 520 + }, + { + "_type": "SAM.Core.OpaqueMaterial,SAM.Core", + "ParameterSets": [ + { + "_type": "SAM.Core.ParameterSet", + "Name": "SAM.Analytical", + "Guid": "364a2db8-8af5-4624-a75e-66391df5307d", + "Parameters": [ + { + "Name": "External Solar Reflectance", + "Value": 0.66 + }, + { + "Name": "Internal Solar Reflectance", + "Value": 0.64 + }, + { + "Name": "External Light Reflectance", + "Value": 0.67 + }, + { + "Name": "Internal Light Reflectance", + "Value": 0.65 + }, + { + "Name": "External Emissivity", + "Value": 0.84 + }, + { + "Name": "Internal Emissivity", + "Value": 0.83 + }, + { + "Name": "Vapour Diffusion Factor", + "Value": 45.0 + } + ] + } + ], + "Name": "FIX_Stud", + "Guid": "ec476450-232d-417d-bff7-94d9a0ad1d9b", + "Group": "S08 PR-C fixture", + "DisplayName": "FIX_Stud", + "Description": "FIX_Stud", + "ThermalConductivity": 0.12, + "SpecificHeatCapacity": 1880, + "Density": 480 + }, + { + "_type": "SAM.Core.TransparentMaterial,SAM.Core", + "ParameterSets": [ + { + "_type": "SAM.Core.ParameterSet", + "Name": "SAM.Analytical", + "Guid": "364a2db8-8af5-4624-a75e-66391df5307d", + "Parameters": [ + { + "Name": "Solar Transmittance", + "Value": 0.746 + }, + { + "Name": "Light Transmittance", + "Value": 0.861 + }, + { + "Name": "External Solar Reflectance", + "Value": 0.069 + }, + { + "Name": "Internal Solar Reflectance", + "Value": 0.067 + }, + { + "Name": "External Light Reflectance", + "Value": 0.079 + }, + { + "Name": "Internal Light Reflectance", + "Value": 0.077 + }, + { + "Name": "External Emissivity", + "Value": 0.84 + }, + { + "Name": "Internal Emissivity", + "Value": 0.837 + }, + { + "Name": "Vapour Diffusion Factor", + "Value": 99999.0 + }, + { + "Name": "Is Blind", + "Value": false + } + ] + } + ], + "Name": "FIX_LaminatedGlass", + "Guid": "f0a09e97-9ff6-4d0d-9578-2ebd999b323d", + "Group": "S08 PR-C fixture", + "DisplayName": "FIX_LaminatedGlass", + "Description": "FIX_LaminatedGlass", + "ThermalConductivity": 0.96, + "SpecificHeatCapacity": 840, + "Density": 2500 + } + ] + }, + "ProfileLibrary": { + "_type": "SAM.Analytical.ProfileLibrary,SAM.Analytical", + "Name": "S08 PR-C fixture profiles", + "Guid": "690dfa6c-c30c-4b17-9dce-a77325defe42", + "Objects": [ + { + "_type": "SAM.Analytical.Profile,SAM.Analytical", + "Name": "FIX_IC_BOX_OCC", + "Guid": "98cc45ae-b227-43eb-a51f-9317c0338014", + "Category": "Occupancy", + "Values": [ + [ + 0, + 0.0 + ], + [ + 1, + 0.0 + ], + [ + 2, + 0.0 + ], + [ + 3, + 0.0 + ], + [ + 4, + 0.0 + ], + [ + 5, + 0.0 + ], + [ + 6, + 0.0 + ], + [ + 7, + 0.0 + ], + [ + 8, + 0.35 + ], + [ + 9, + 0.9 + ], + [ + 10, + 0.9 + ], + [ + 11, + 0.9 + ], + [ + 12, + 0.55 + ], + [ + 13, + 0.9 + ], + [ + 14, + 0.9 + ], + [ + 15, + 0.9 + ], + [ + 16, + 0.9 + ], + [ + 17, + 0.4 + ], + [ + 18, + 0.0 + ], + [ + 19, + 0.0 + ], + [ + 20, + 0.0 + ], + [ + 21, + 0.0 + ], + [ + 22, + 0.0 + ], + [ + 23, + 0.0 + ] + ] + }, + { + "_type": "SAM.Analytical.Profile,SAM.Analytical", + "Name": "FIX_IC_BOX_LGT", + "Guid": "80860497-a7ba-4b52-92db-854196938041", + "Category": "Lighting", + "Values": [ + [ + 0, + 0.05 + ], + [ + 1, + 0.05 + ], + [ + 2, + 0.05 + ], + [ + 3, + 0.05 + ], + [ + 4, + 0.05 + ], + [ + 5, + 0.05 + ], + [ + 6, + 0.05 + ], + [ + 7, + 0.6 + ], + [ + 8, + 0.85 + ], + [ + 9, + 0.85 + ], + [ + 10, + 0.85 + ], + [ + 11, + 0.85 + ], + [ + 12, + 0.75 + ], + [ + 13, + 0.85 + ], + [ + 14, + 0.85 + ], + [ + 15, + 0.85 + ], + [ + 16, + 0.85 + ], + [ + 17, + 0.85 + ], + [ + 18, + 0.5 + ], + [ + 19, + 0.05 + ], + [ + 20, + 0.05 + ], + [ + 21, + 0.05 + ], + [ + 22, + 0.05 + ], + [ + 23, + 0.05 + ] + ] + }, + { + "_type": "SAM.Analytical.Profile,SAM.Analytical", + "Name": "FIX_IC_BOX_EQS", + "Guid": "7173befb-097b-486f-b722-b375d28de0cc", + "Category": "Equipment Sensible", + "Values": [ + [ + 0, + 0.15 + ], + [ + 1, + 0.15 + ], + [ + 2, + 0.15 + ], + [ + 3, + 0.15 + ], + [ + 4, + 0.15 + ], + [ + 5, + 0.15 + ], + [ + 6, + 0.15 + ], + [ + 7, + 0.15 + ], + [ + 8, + 0.55 + ], + [ + 9, + 0.95 + ], + [ + 10, + 0.95 + ], + [ + 11, + 0.95 + ], + [ + 12, + 0.7 + ], + [ + 13, + 0.95 + ], + [ + 14, + 0.95 + ], + [ + 15, + 0.95 + ], + [ + 16, + 0.95 + ], + [ + 17, + 0.45 + ], + [ + 18, + 0.15 + ], + [ + 19, + 0.15 + ], + [ + 20, + 0.15 + ], + [ + 21, + 0.15 + ], + [ + 22, + 0.15 + ], + [ + 23, + 0.15 + ], + [ + 24, + 0.15 + ], + [ + 25, + 0.15 + ], + [ + 26, + 0.15 + ], + [ + 27, + 0.15 + ], + [ + 28, + 0.15 + ], + [ + 29, + 0.15 + ], + [ + 30, + 0.15 + ], + [ + 31, + 0.15 + ], + [ + 32, + 0.55 + ], + [ + 33, + 0.95 + ], + [ + 34, + 0.95 + ], + [ + 35, + 0.95 + ], + [ + 36, + 0.7 + ], + [ + 37, + 0.95 + ], + [ + 38, + 0.95 + ], + [ + 39, + 0.95 + ], + [ + 40, + 0.95 + ], + [ + 41, + 0.45 + ], + [ + 42, + 0.15 + ], + [ + 43, + 0.15 + ], + [ + 44, + 0.15 + ], + [ + 45, + 0.15 + ], + [ + 46, + 0.15 + ], + [ + 47, + 0.15 + ], + [ + 48, + 0.15 + ], + [ + 49, + 0.15 + ], + [ + 50, + 0.15 + ], + [ + 51, + 0.15 + ], + [ + 52, + 0.15 + ], + [ + 53, + 0.15 + ], + [ + 54, + 0.15 + ], + [ + 55, + 0.15 + ], + [ + 56, + 0.55 + ], + [ + 57, + 0.95 + ], + [ + 58, + 0.95 + ], + [ + 59, + 0.95 + ], + [ + 60, + 0.7 + ], + [ + 61, + 0.95 + ], + [ + 62, + 0.95 + ], + [ + 63, + 0.95 + ], + [ + 64, + 0.95 + ], + [ + 65, + 0.45 + ], + [ + 66, + 0.15 + ], + [ + 67, + 0.15 + ], + [ + 68, + 0.15 + ], + [ + 69, + 0.15 + ], + [ + 70, + 0.15 + ], + [ + 71, + 0.15 + ], + [ + 72, + 0.15 + ], + [ + 73, + 0.15 + ], + [ + 74, + 0.15 + ], + [ + 75, + 0.15 + ], + [ + 76, + 0.15 + ], + [ + 77, + 0.15 + ], + [ + 78, + 0.15 + ], + [ + 79, + 0.15 + ], + [ + 80, + 0.55 + ], + [ + 81, + 0.95 + ], + [ + 82, + 0.95 + ], + [ + 83, + 0.95 + ], + [ + 84, + 0.7 + ], + [ + 85, + 0.95 + ], + [ + 86, + 0.95 + ], + [ + 87, + 0.95 + ], + [ + 88, + 0.95 + ], + [ + 89, + 0.45 + ], + [ + 90, + 0.15 + ], + [ + 91, + 0.15 + ], + [ + 92, + 0.15 + ], + [ + 93, + 0.15 + ], + [ + 94, + 0.15 + ], + [ + 95, + 0.15 + ], + [ + 96, + 0.15 + ], + [ + 97, + 0.15 + ], + [ + 98, + 0.15 + ], + [ + 99, + 0.15 + ], + [ + 100, + 0.15 + ], + [ + 101, + 0.15 + ], + [ + 102, + 0.15 + ], + [ + 103, + 0.15 + ], + [ + 104, + 0.55 + ], + [ + 105, + 0.95 + ], + [ + 106, + 0.95 + ], + [ + 107, + 0.95 + ], + [ + 108, + 0.7 + ], + [ + 109, + 0.95 + ], + [ + 110, + 0.95 + ], + [ + 111, + 0.95 + ], + [ + 112, + 0.95 + ], + [ + 113, + 0.45 + ], + [ + 114, + 0.15 + ], + [ + 115, + 0.15 + ], + [ + 116, + 0.15 + ], + [ + 117, + 0.15 + ], + [ + 118, + 0.15 + ], + [ + 119, + 0.15 + ], + [ + 120, + 0.12 + ], + [ + 121, + 0.12 + ], + [ + 122, + 0.12 + ], + [ + 123, + 0.12 + ], + [ + 124, + 0.12 + ], + [ + 125, + 0.12 + ], + [ + 126, + 0.12 + ], + [ + 127, + 0.12 + ], + [ + 128, + 0.12 + ], + [ + 129, + 0.12 + ], + [ + 130, + 0.2 + ], + [ + 131, + 0.2 + ], + [ + 132, + 0.18 + ], + [ + 133, + 0.12 + ], + [ + 134, + 0.12 + ], + [ + 135, + 0.12 + ], + [ + 136, + 0.12 + ], + [ + 137, + 0.12 + ], + [ + 138, + 0.12 + ], + [ + 139, + 0.12 + ], + [ + 140, + 0.12 + ], + [ + 141, + 0.12 + ], + [ + 142, + 0.12 + ], + [ + 143, + 0.12 + ], + [ + 144, + 0.12 + ], + [ + 145, + 0.12 + ], + [ + 146, + 0.12 + ], + [ + 147, + 0.12 + ], + [ + 148, + 0.12 + ], + [ + 149, + 0.12 + ], + [ + 150, + 0.12 + ], + [ + 151, + 0.12 + ], + [ + 152, + 0.12 + ], + [ + 153, + 0.12 + ], + [ + 154, + 0.2 + ], + [ + 155, + 0.2 + ], + [ + 156, + 0.18 + ], + [ + 157, + 0.12 + ], + [ + 158, + 0.12 + ], + [ + 159, + 0.12 + ], + [ + 160, + 0.12 + ], + [ + 161, + 0.12 + ], + [ + 162, + 0.12 + ], + [ + 163, + 0.12 + ], + [ + 164, + 0.12 + ], + [ + 165, + 0.12 + ], + [ + 166, + 0.12 + ], + [ + 167, + 0.12 + ], + [ + 168, + 0.15 + ], + [ + 169, + 0.15 + ], + [ + 170, + 0.15 + ], + [ + 171, + 0.15 + ], + [ + 172, + 0.15 + ], + [ + 173, + 0.15 + ], + [ + 174, + 0.15 + ], + [ + 175, + 0.15 + ], + [ + 176, + 0.55 + ], + [ + 177, + 0.95 + ], + [ + 178, + 0.95 + ], + [ + 179, + 0.95 + ], + [ + 180, + 0.7 + ], + [ + 181, + 0.95 + ], + [ + 182, + 0.95 + ], + [ + 183, + 0.95 + ], + [ + 184, + 0.95 + ], + [ + 185, + 0.45 + ], + [ + 186, + 0.15 + ], + [ + 187, + 0.15 + ], + [ + 188, + 0.15 + ], + [ + 189, + 0.15 + ], + [ + 190, + 0.15 + ], + [ + 191, + 0.15 + ], + [ + 192, + 0.15 + ], + [ + 193, + 0.15 + ], + [ + 194, + 0.15 + ], + [ + 195, + 0.15 + ], + [ + 196, + 0.15 + ], + [ + 197, + 0.15 + ], + [ + 198, + 0.15 + ], + [ + 199, + 0.15 + ], + [ + 200, + 0.55 + ], + [ + 201, + 0.95 + ], + [ + 202, + 0.95 + ], + [ + 203, + 0.95 + ], + [ + 204, + 0.7 + ], + [ + 205, + 0.95 + ], + [ + 206, + 0.95 + ], + [ + 207, + 0.95 + ], + [ + 208, + 0.95 + ], + [ + 209, + 0.45 + ], + [ + 210, + 0.15 + ], + [ + 211, + 0.15 + ], + [ + 212, + 0.15 + ], + [ + 213, + 0.15 + ], + [ + 214, + 0.15 + ], + [ + 215, + 0.15 + ], + [ + 216, + 0.15 + ], + [ + 217, + 0.15 + ], + [ + 218, + 0.15 + ], + [ + 219, + 0.15 + ], + [ + 220, + 0.15 + ], + [ + 221, + 0.15 + ], + [ + 222, + 0.15 + ], + [ + 223, + 0.15 + ], + [ + 224, + 0.55 + ], + [ + 225, + 0.95 + ], + [ + 226, + 0.95 + ], + [ + 227, + 0.95 + ], + [ + 228, + 0.7 + ], + [ + 229, + 0.95 + ], + [ + 230, + 0.95 + ], + [ + 231, + 0.95 + ], + [ + 232, + 0.95 + ], + [ + 233, + 0.45 + ], + [ + 234, + 0.15 + ], + [ + 235, + 0.15 + ], + [ + 236, + 0.15 + ], + [ + 237, + 0.15 + ], + [ + 238, + 0.15 + ], + [ + 239, + 0.15 + ], + [ + 240, + 0.15 + ], + [ + 241, + 0.15 + ], + [ + 242, + 0.15 + ], + [ + 243, + 0.15 + ], + [ + 244, + 0.15 + ], + [ + 245, + 0.15 + ], + [ + 246, + 0.15 + ], + [ + 247, + 0.15 + ], + [ + 248, + 0.55 + ], + [ + 249, + 0.95 + ], + [ + 250, + 0.95 + ], + [ + 251, + 0.95 + ], + [ + 252, + 0.7 + ], + [ + 253, + 0.95 + ], + [ + 254, + 0.95 + ], + [ + 255, + 0.95 + ], + [ + 256, + 0.95 + ], + [ + 257, + 0.45 + ], + [ + 258, + 0.15 + ], + [ + 259, + 0.15 + ], + [ + 260, + 0.15 + ], + [ + 261, + 0.15 + ], + [ + 262, + 0.15 + ], + [ + 263, + 0.15 + ], + [ + 264, + 0.15 + ], + [ + 265, + 0.15 + ], + [ + 266, + 0.15 + ], + [ + 267, + 0.15 + ], + [ + 268, + 0.15 + ], + [ + 269, + 0.15 + ], + [ + 270, + 0.15 + ], + [ + 271, + 0.15 + ], + [ + 272, + 0.55 + ], + [ + 273, + 0.95 + ], + [ + 274, + 0.95 + ], + [ + 275, + 0.95 + ], + [ + 276, + 0.7 + ], + [ + 277, + 0.95 + ], + [ + 278, + 0.95 + ], + [ + 279, + 0.95 + ], + [ + 280, + 0.95 + ], + [ + 281, + 0.45 + ], + [ + 282, + 0.15 + ], + [ + 283, + 0.15 + ], + [ + 284, + 0.15 + ], + [ + 285, + 0.15 + ], + [ + 286, + 0.15 + ], + [ + 287, + 0.15 + ], + [ + 288, + 0.12 + ], + [ + 289, + 0.12 + ], + [ + 290, + 0.12 + ], + [ + 291, + 0.12 + ], + [ + 292, + 0.12 + ], + [ + 293, + 0.12 + ], + [ + 294, + 0.12 + ], + [ + 295, + 0.12 + ], + [ + 296, + 0.12 + ], + [ + 297, + 0.12 + ], + [ + 298, + 0.2 + ], + [ + 299, + 0.2 + ], + [ + 300, + 0.18 + ], + [ + 301, + 0.12 + ], + [ + 302, + 0.12 + ], + [ + 303, + 0.12 + ], + [ + 304, + 0.12 + ], + [ + 305, + 0.12 + ], + [ + 306, + 0.12 + ], + [ + 307, + 0.12 + ], + [ + 308, + 0.12 + ], + [ + 309, + 0.12 + ], + [ + 310, + 0.12 + ], + [ + 311, + 0.12 + ], + [ + 312, + 0.12 + ], + [ + 313, + 0.12 + ], + [ + 314, + 0.12 + ], + [ + 315, + 0.12 + ], + [ + 316, + 0.12 + ], + [ + 317, + 0.12 + ], + [ + 318, + 0.12 + ], + [ + 319, + 0.12 + ], + [ + 320, + 0.12 + ], + [ + 321, + 0.12 + ], + [ + 322, + 0.2 + ], + [ + 323, + 0.2 + ], + [ + 324, + 0.18 + ], + [ + 325, + 0.12 + ], + [ + 326, + 0.12 + ], + [ + 327, + 0.12 + ], + [ + 328, + 0.12 + ], + [ + 329, + 0.12 + ], + [ + 330, + 0.12 + ], + [ + 331, + 0.12 + ], + [ + 332, + 0.12 + ], + [ + 333, + 0.12 + ], + [ + 334, + 0.12 + ], + [ + 335, + 0.12 + ], + [ + 336, + 0.15 + ], + [ + 337, + 0.15 + ], + [ + 338, + 0.15 + ], + [ + 339, + 0.15 + ], + [ + 340, + 0.15 + ], + [ + 341, + 0.15 + ], + [ + 342, + 0.15 + ], + [ + 343, + 0.15 + ], + [ + 344, + 0.55 + ], + [ + 345, + 0.95 + ], + [ + 346, + 0.95 + ], + [ + 347, + 0.95 + ], + [ + 348, + 0.7 + ], + [ + 349, + 0.95 + ], + [ + 350, + 0.95 + ], + [ + 351, + 0.95 + ], + [ + 352, + 0.95 + ], + [ + 353, + 0.45 + ], + [ + 354, + 0.15 + ], + [ + 355, + 0.15 + ], + [ + 356, + 0.15 + ], + [ + 357, + 0.15 + ], + [ + 358, + 0.15 + ], + [ + 359, + 0.15 + ], + [ + 360, + 0.15 + ], + [ + 361, + 0.15 + ], + [ + 362, + 0.15 + ], + [ + 363, + 0.15 + ], + [ + 364, + 0.15 + ], + [ + 365, + 0.15 + ], + [ + 366, + 0.15 + ], + [ + 367, + 0.15 + ], + [ + 368, + 0.55 + ], + [ + 369, + 0.95 + ], + [ + 370, + 0.95 + ], + [ + 371, + 0.95 + ], + [ + 372, + 0.7 + ], + [ + 373, + 0.95 + ], + [ + 374, + 0.95 + ], + [ + 375, + 0.95 + ], + [ + 376, + 0.95 + ], + [ + 377, + 0.45 + ], + [ + 378, + 0.15 + ], + [ + 379, + 0.15 + ], + [ + 380, + 0.15 + ], + [ + 381, + 0.15 + ], + [ + 382, + 0.15 + ], + [ + 383, + 0.15 + ], + [ + 384, + 0.15 + ], + [ + 385, + 0.15 + ], + [ + 386, + 0.15 + ], + [ + 387, + 0.15 + ], + [ + 388, + 0.15 + ], + [ + 389, + 0.15 + ], + [ + 390, + 0.15 + ], + [ + 391, + 0.15 + ], + [ + 392, + 0.55 + ], + [ + 393, + 0.95 + ], + [ + 394, + 0.95 + ], + [ + 395, + 0.95 + ], + [ + 396, + 0.7 + ], + [ + 397, + 0.95 + ], + [ + 398, + 0.95 + ], + [ + 399, + 0.95 + ], + [ + 400, + 0.95 + ], + [ + 401, + 0.45 + ], + [ + 402, + 0.15 + ], + [ + 403, + 0.15 + ], + [ + 404, + 0.15 + ], + [ + 405, + 0.15 + ], + [ + 406, + 0.15 + ], + [ + 407, + 0.15 + ], + [ + 408, + 0.15 + ], + [ + 409, + 0.15 + ], + [ + 410, + 0.15 + ], + [ + 411, + 0.15 + ], + [ + 412, + 0.15 + ], + [ + 413, + 0.15 + ], + [ + 414, + 0.15 + ], + [ + 415, + 0.15 + ], + [ + 416, + 0.55 + ], + [ + 417, + 0.95 + ], + [ + 418, + 0.95 + ], + [ + 419, + 0.95 + ], + [ + 420, + 0.7 + ], + [ + 421, + 0.95 + ], + [ + 422, + 0.95 + ], + [ + 423, + 0.95 + ], + [ + 424, + 0.95 + ], + [ + 425, + 0.45 + ], + [ + 426, + 0.15 + ], + [ + 427, + 0.15 + ], + [ + 428, + 0.15 + ], + [ + 429, + 0.15 + ], + [ + 430, + 0.15 + ], + [ + 431, + 0.15 + ], + [ + 432, + 0.15 + ], + [ + 433, + 0.15 + ], + [ + 434, + 0.15 + ], + [ + 435, + 0.15 + ], + [ + 436, + 0.15 + ], + [ + 437, + 0.15 + ], + [ + 438, + 0.15 + ], + [ + 439, + 0.15 + ], + [ + 440, + 0.55 + ], + [ + 441, + 0.95 + ], + [ + 442, + 0.95 + ], + [ + 443, + 0.95 + ], + [ + 444, + 0.7 + ], + [ + 445, + 0.95 + ], + [ + 446, + 0.95 + ], + [ + 447, + 0.95 + ], + [ + 448, + 0.95 + ], + [ + 449, + 0.45 + ], + [ + 450, + 0.15 + ], + [ + 451, + 0.15 + ], + [ + 452, + 0.15 + ], + [ + 453, + 0.15 + ], + [ + 454, + 0.15 + ], + [ + 455, + 0.15 + ], + [ + 456, + 0.12 + ], + [ + 457, + 0.12 + ], + [ + 458, + 0.12 + ], + [ + 459, + 0.12 + ], + [ + 460, + 0.12 + ], + [ + 461, + 0.12 + ], + [ + 462, + 0.12 + ], + [ + 463, + 0.12 + ], + [ + 464, + 0.12 + ], + [ + 465, + 0.12 + ], + [ + 466, + 0.2 + ], + [ + 467, + 0.2 + ], + [ + 468, + 0.18 + ], + [ + 469, + 0.12 + ], + [ + 470, + 0.12 + ], + [ + 471, + 0.12 + ], + [ + 472, + 0.12 + ], + [ + 473, + 0.12 + ], + [ + 474, + 0.12 + ], + [ + 475, + 0.12 + ], + [ + 476, + 0.12 + ], + [ + 477, + 0.12 + ], + [ + 478, + 0.12 + ], + [ + 479, + 0.12 + ], + [ + 480, + 0.12 + ], + [ + 481, + 0.12 + ], + [ + 482, + 0.12 + ], + [ + 483, + 0.12 + ], + [ + 484, + 0.12 + ], + [ + 485, + 0.12 + ], + [ + 486, + 0.12 + ], + [ + 487, + 0.12 + ], + [ + 488, + 0.12 + ], + [ + 489, + 0.12 + ], + [ + 490, + 0.2 + ], + [ + 491, + 0.2 + ], + [ + 492, + 0.18 + ], + [ + 493, + 0.12 + ], + [ + 494, + 0.12 + ], + [ + 495, + 0.12 + ], + [ + 496, + 0.12 + ], + [ + 497, + 0.12 + ], + [ + 498, + 0.12 + ], + [ + 499, + 0.12 + ], + [ + 500, + 0.12 + ], + [ + 501, + 0.12 + ], + [ + 502, + 0.12 + ], + [ + 503, + 0.12 + ], + [ + 504, + 0.15 + ], + [ + 505, + 0.15 + ], + [ + 506, + 0.15 + ], + [ + 507, + 0.15 + ], + [ + 508, + 0.15 + ], + [ + 509, + 0.15 + ], + [ + 510, + 0.15 + ], + [ + 511, + 0.15 + ], + [ + 512, + 0.55 + ], + [ + 513, + 0.95 + ], + [ + 514, + 0.95 + ], + [ + 515, + 0.95 + ], + [ + 516, + 0.7 + ], + [ + 517, + 0.95 + ], + [ + 518, + 0.95 + ], + [ + 519, + 0.95 + ], + [ + 520, + 0.95 + ], + [ + 521, + 0.45 + ], + [ + 522, + 0.15 + ], + [ + 523, + 0.15 + ], + [ + 524, + 0.15 + ], + [ + 525, + 0.15 + ], + [ + 526, + 0.15 + ], + [ + 527, + 0.15 + ], + [ + 528, + 0.15 + ], + [ + 529, + 0.15 + ], + [ + 530, + 0.15 + ], + [ + 531, + 0.15 + ], + [ + 532, + 0.15 + ], + [ + 533, + 0.15 + ], + [ + 534, + 0.15 + ], + [ + 535, + 0.15 + ], + [ + 536, + 0.55 + ], + [ + 537, + 0.95 + ], + [ + 538, + 0.95 + ], + [ + 539, + 0.95 + ], + [ + 540, + 0.7 + ], + [ + 541, + 0.95 + ], + [ + 542, + 0.95 + ], + [ + 543, + 0.95 + ], + [ + 544, + 0.95 + ], + [ + 545, + 0.45 + ], + [ + 546, + 0.15 + ], + [ + 547, + 0.15 + ], + [ + 548, + 0.15 + ], + [ + 549, + 0.15 + ], + [ + 550, + 0.15 + ], + [ + 551, + 0.15 + ], + [ + 552, + 0.15 + ], + [ + 553, + 0.15 + ], + [ + 554, + 0.15 + ], + [ + 555, + 0.15 + ], + [ + 556, + 0.15 + ], + [ + 557, + 0.15 + ], + [ + 558, + 0.15 + ], + [ + 559, + 0.15 + ], + [ + 560, + 0.55 + ], + [ + 561, + 0.95 + ], + [ + 562, + 0.95 + ], + [ + 563, + 0.95 + ], + [ + 564, + 0.7 + ], + [ + 565, + 0.95 + ], + [ + 566, + 0.95 + ], + [ + 567, + 0.95 + ], + [ + 568, + 0.95 + ], + [ + 569, + 0.45 + ], + [ + 570, + 0.15 + ], + [ + 571, + 0.15 + ], + [ + 572, + 0.15 + ], + [ + 573, + 0.15 + ], + [ + 574, + 0.15 + ], + [ + 575, + 0.15 + ], + [ + 576, + 0.15 + ], + [ + 577, + 0.15 + ], + [ + 578, + 0.15 + ], + [ + 579, + 0.15 + ], + [ + 580, + 0.15 + ], + [ + 581, + 0.15 + ], + [ + 582, + 0.15 + ], + [ + 583, + 0.15 + ], + [ + 584, + 0.55 + ], + [ + 585, + 0.95 + ], + [ + 586, + 0.95 + ], + [ + 587, + 0.95 + ], + [ + 588, + 0.7 + ], + [ + 589, + 0.95 + ], + [ + 590, + 0.95 + ], + [ + 591, + 0.95 + ], + [ + 592, + 0.95 + ], + [ + 593, + 0.45 + ], + [ + 594, + 0.15 + ], + [ + 595, + 0.15 + ], + [ + 596, + 0.15 + ], + [ + 597, + 0.15 + ], + [ + 598, + 0.15 + ], + [ + 599, + 0.15 + ], + [ + 600, + 0.15 + ], + [ + 601, + 0.15 + ], + [ + 602, + 0.15 + ], + [ + 603, + 0.15 + ], + [ + 604, + 0.15 + ], + [ + 605, + 0.15 + ], + [ + 606, + 0.15 + ], + [ + 607, + 0.15 + ], + [ + 608, + 0.55 + ], + [ + 609, + 0.95 + ], + [ + 610, + 0.95 + ], + [ + 611, + 0.95 + ], + [ + 612, + 0.7 + ], + [ + 613, + 0.95 + ], + [ + 614, + 0.95 + ], + [ + 615, + 0.95 + ], + [ + 616, + 0.95 + ], + [ + 617, + 0.45 + ], + [ + 618, + 0.15 + ], + [ + 619, + 0.15 + ], + [ + 620, + 0.15 + ], + [ + 621, + 0.15 + ], + [ + 622, + 0.15 + ], + [ + 623, + 0.15 + ], + [ + 624, + 0.12 + ], + [ + 625, + 0.12 + ], + [ + 626, + 0.12 + ], + [ + 627, + 0.12 + ], + [ + 628, + 0.12 + ], + [ + 629, + 0.12 + ], + [ + 630, + 0.12 + ], + [ + 631, + 0.12 + ], + [ + 632, + 0.12 + ], + [ + 633, + 0.12 + ], + [ + 634, + 0.2 + ], + [ + 635, + 0.2 + ], + [ + 636, + 0.18 + ], + [ + 637, + 0.12 + ], + [ + 638, + 0.12 + ], + [ + 639, + 0.12 + ], + [ + 640, + 0.12 + ], + [ + 641, + 0.12 + ], + [ + 642, + 0.12 + ], + [ + 643, + 0.12 + ], + [ + 644, + 0.12 + ], + [ + 645, + 0.12 + ], + [ + 646, + 0.12 + ], + [ + 647, + 0.12 + ], + [ + 648, + 0.12 + ], + [ + 649, + 0.12 + ], + [ + 650, + 0.12 + ], + [ + 651, + 0.12 + ], + [ + 652, + 0.12 + ], + [ + 653, + 0.12 + ], + [ + 654, + 0.12 + ], + [ + 655, + 0.12 + ], + [ + 656, + 0.12 + ], + [ + 657, + 0.12 + ], + [ + 658, + 0.2 + ], + [ + 659, + 0.2 + ], + [ + 660, + 0.18 + ], + [ + 661, + 0.12 + ], + [ + 662, + 0.12 + ], + [ + 663, + 0.12 + ], + [ + 664, + 0.12 + ], + [ + 665, + 0.12 + ], + [ + 666, + 0.12 + ], + [ + 667, + 0.12 + ], + [ + 668, + 0.12 + ], + [ + 669, + 0.12 + ], + [ + 670, + 0.12 + ], + [ + 671, + 0.12 + ], + [ + 672, + 0.15 + ], + [ + 673, + 0.15 + ], + [ + 674, + 0.15 + ], + [ + 675, + 0.15 + ], + [ + 676, + 0.15 + ], + [ + 677, + 0.15 + ], + [ + 678, + 0.15 + ], + [ + 679, + 0.15 + ], + [ + 680, + 0.55 + ], + [ + 681, + 0.95 + ], + [ + 682, + 0.95 + ], + [ + 683, + 0.95 + ], + [ + 684, + 0.7 + ], + [ + 685, + 0.95 + ], + [ + 686, + 0.95 + ], + [ + 687, + 0.95 + ], + [ + 688, + 0.95 + ], + [ + 689, + 0.45 + ], + [ + 690, + 0.15 + ], + [ + 691, + 0.15 + ], + [ + 692, + 0.15 + ], + [ + 693, + 0.15 + ], + [ + 694, + 0.15 + ], + [ + 695, + 0.15 + ], + [ + 696, + 0.15 + ], + [ + 697, + 0.15 + ], + [ + 698, + 0.15 + ], + [ + 699, + 0.15 + ], + [ + 700, + 0.15 + ], + [ + 701, + 0.15 + ], + [ + 702, + 0.15 + ], + [ + 703, + 0.15 + ], + [ + 704, + 0.55 + ], + [ + 705, + 0.95 + ], + [ + 706, + 0.95 + ], + [ + 707, + 0.95 + ], + [ + 708, + 0.7 + ], + [ + 709, + 0.95 + ], + [ + 710, + 0.95 + ], + [ + 711, + 0.95 + ], + [ + 712, + 0.95 + ], + [ + 713, + 0.45 + ], + [ + 714, + 0.15 + ], + [ + 715, + 0.15 + ], + [ + 716, + 0.15 + ], + [ + 717, + 0.15 + ], + [ + 718, + 0.15 + ], + [ + 719, + 0.15 + ], + [ + 720, + 0.15 + ], + [ + 721, + 0.15 + ], + [ + 722, + 0.15 + ], + [ + 723, + 0.15 + ], + [ + 724, + 0.15 + ], + [ + 725, + 0.15 + ], + [ + 726, + 0.15 + ], + [ + 727, + 0.15 + ], + [ + 728, + 0.55 + ], + [ + 729, + 0.95 + ], + [ + 730, + 0.95 + ], + [ + 731, + 0.95 + ], + [ + 732, + 0.7 + ], + [ + 733, + 0.95 + ], + [ + 734, + 0.95 + ], + [ + 735, + 0.95 + ], + [ + 736, + 0.95 + ], + [ + 737, + 0.45 + ], + [ + 738, + 0.15 + ], + [ + 739, + 0.15 + ], + [ + 740, + 0.15 + ], + [ + 741, + 0.15 + ], + [ + 742, + 0.15 + ], + [ + 743, + 0.15 + ], + [ + 744, + 0.15 + ], + [ + 745, + 0.15 + ], + [ + 746, + 0.15 + ], + [ + 747, + 0.15 + ], + [ + 748, + 0.15 + ], + [ + 749, + 0.15 + ], + [ + 750, + 0.15 + ], + [ + 751, + 0.15 + ], + [ + 752, + 0.55 + ], + [ + 753, + 0.95 + ], + [ + 754, + 0.95 + ], + [ + 755, + 0.95 + ], + [ + 756, + 0.7 + ], + [ + 757, + 0.95 + ], + [ + 758, + 0.95 + ], + [ + 759, + 0.95 + ], + [ + 760, + 0.95 + ], + [ + 761, + 0.45 + ], + [ + 762, + 0.15 + ], + [ + 763, + 0.15 + ], + [ + 764, + 0.15 + ], + [ + 765, + 0.15 + ], + [ + 766, + 0.15 + ], + [ + 767, + 0.15 + ], + [ + 768, + 0.15 + ], + [ + 769, + 0.15 + ], + [ + 770, + 0.15 + ], + [ + 771, + 0.15 + ], + [ + 772, + 0.15 + ], + [ + 773, + 0.15 + ], + [ + 774, + 0.15 + ], + [ + 775, + 0.15 + ], + [ + 776, + 0.55 + ], + [ + 777, + 0.95 + ], + [ + 778, + 0.95 + ], + [ + 779, + 0.95 + ], + [ + 780, + 0.7 + ], + [ + 781, + 0.95 + ], + [ + 782, + 0.95 + ], + [ + 783, + 0.95 + ], + [ + 784, + 0.95 + ], + [ + 785, + 0.45 + ], + [ + 786, + 0.15 + ], + [ + 787, + 0.15 + ], + [ + 788, + 0.15 + ], + [ + 789, + 0.15 + ], + [ + 790, + 0.15 + ], + [ + 791, + 0.15 + ], + [ + 792, + 0.12 + ], + [ + 793, + 0.12 + ], + [ + 794, + 0.12 + ], + [ + 795, + 0.12 + ], + [ + 796, + 0.12 + ], + [ + 797, + 0.12 + ], + [ + 798, + 0.12 + ], + [ + 799, + 0.12 + ], + [ + 800, + 0.12 + ], + [ + 801, + 0.12 + ], + [ + 802, + 0.2 + ], + [ + 803, + 0.2 + ], + [ + 804, + 0.18 + ], + [ + 805, + 0.12 + ], + [ + 806, + 0.12 + ], + [ + 807, + 0.12 + ], + [ + 808, + 0.12 + ], + [ + 809, + 0.12 + ], + [ + 810, + 0.12 + ], + [ + 811, + 0.12 + ], + [ + 812, + 0.12 + ], + [ + 813, + 0.12 + ], + [ + 814, + 0.12 + ], + [ + 815, + 0.12 + ], + [ + 816, + 0.12 + ], + [ + 817, + 0.12 + ], + [ + 818, + 0.12 + ], + [ + 819, + 0.12 + ], + [ + 820, + 0.12 + ], + [ + 821, + 0.12 + ], + [ + 822, + 0.12 + ], + [ + 823, + 0.12 + ], + [ + 824, + 0.12 + ], + [ + 825, + 0.12 + ], + [ + 826, + 0.2 + ], + [ + 827, + 0.2 + ], + [ + 828, + 0.18 + ], + [ + 829, + 0.12 + ], + [ + 830, + 0.12 + ], + [ + 831, + 0.12 + ], + [ + 832, + 0.12 + ], + [ + 833, + 0.12 + ], + [ + 834, + 0.12 + ], + [ + 835, + 0.12 + ], + [ + 836, + 0.12 + ], + [ + 837, + 0.12 + ], + [ + 838, + 0.12 + ], + [ + 839, + 0.12 + ], + [ + 840, + 0.15 + ], + [ + 841, + 0.15 + ], + [ + 842, + 0.15 + ], + [ + 843, + 0.15 + ], + [ + 844, + 0.15 + ], + [ + 845, + 0.15 + ], + [ + 846, + 0.15 + ], + [ + 847, + 0.15 + ], + [ + 848, + 0.55 + ], + [ + 849, + 0.95 + ], + [ + 850, + 0.95 + ], + [ + 851, + 0.95 + ], + [ + 852, + 0.7 + ], + [ + 853, + 0.95 + ], + [ + 854, + 0.95 + ], + [ + 855, + 0.95 + ], + [ + 856, + 0.95 + ], + [ + 857, + 0.45 + ], + [ + 858, + 0.15 + ], + [ + 859, + 0.15 + ], + [ + 860, + 0.15 + ], + [ + 861, + 0.15 + ], + [ + 862, + 0.15 + ], + [ + 863, + 0.15 + ], + [ + 864, + 0.15 + ], + [ + 865, + 0.15 + ], + [ + 866, + 0.15 + ], + [ + 867, + 0.15 + ], + [ + 868, + 0.15 + ], + [ + 869, + 0.15 + ], + [ + 870, + 0.15 + ], + [ + 871, + 0.15 + ], + [ + 872, + 0.55 + ], + [ + 873, + 0.95 + ], + [ + 874, + 0.95 + ], + [ + 875, + 0.95 + ], + [ + 876, + 0.7 + ], + [ + 877, + 0.95 + ], + [ + 878, + 0.95 + ], + [ + 879, + 0.95 + ], + [ + 880, + 0.95 + ], + [ + 881, + 0.45 + ], + [ + 882, + 0.15 + ], + [ + 883, + 0.15 + ], + [ + 884, + 0.15 + ], + [ + 885, + 0.15 + ], + [ + 886, + 0.15 + ], + [ + 887, + 0.15 + ], + [ + 888, + 0.15 + ], + [ + 889, + 0.15 + ], + [ + 890, + 0.15 + ], + [ + 891, + 0.15 + ], + [ + 892, + 0.15 + ], + [ + 893, + 0.15 + ], + [ + 894, + 0.15 + ], + [ + 895, + 0.15 + ], + [ + 896, + 0.55 + ], + [ + 897, + 0.95 + ], + [ + 898, + 0.95 + ], + [ + 899, + 0.95 + ], + [ + 900, + 0.7 + ], + [ + 901, + 0.95 + ], + [ + 902, + 0.95 + ], + [ + 903, + 0.95 + ], + [ + 904, + 0.95 + ], + [ + 905, + 0.45 + ], + [ + 906, + 0.15 + ], + [ + 907, + 0.15 + ], + [ + 908, + 0.15 + ], + [ + 909, + 0.15 + ], + [ + 910, + 0.15 + ], + [ + 911, + 0.15 + ], + [ + 912, + 0.15 + ], + [ + 913, + 0.15 + ], + [ + 914, + 0.15 + ], + [ + 915, + 0.15 + ], + [ + 916, + 0.15 + ], + [ + 917, + 0.15 + ], + [ + 918, + 0.15 + ], + [ + 919, + 0.15 + ], + [ + 920, + 0.55 + ], + [ + 921, + 0.95 + ], + [ + 922, + 0.95 + ], + [ + 923, + 0.95 + ], + [ + 924, + 0.7 + ], + [ + 925, + 0.95 + ], + [ + 926, + 0.95 + ], + [ + 927, + 0.95 + ], + [ + 928, + 0.95 + ], + [ + 929, + 0.45 + ], + [ + 930, + 0.15 + ], + [ + 931, + 0.15 + ], + [ + 932, + 0.15 + ], + [ + 933, + 0.15 + ], + [ + 934, + 0.15 + ], + [ + 935, + 0.15 + ], + [ + 936, + 0.15 + ], + [ + 937, + 0.15 + ], + [ + 938, + 0.15 + ], + [ + 939, + 0.15 + ], + [ + 940, + 0.15 + ], + [ + 941, + 0.15 + ], + [ + 942, + 0.15 + ], + [ + 943, + 0.15 + ], + [ + 944, + 0.55 + ], + [ + 945, + 0.95 + ], + [ + 946, + 0.95 + ], + [ + 947, + 0.95 + ], + [ + 948, + 0.7 + ], + [ + 949, + 0.95 + ], + [ + 950, + 0.95 + ], + [ + 951, + 0.95 + ], + [ + 952, + 0.95 + ], + [ + 953, + 0.45 + ], + [ + 954, + 0.15 + ], + [ + 955, + 0.15 + ], + [ + 956, + 0.15 + ], + [ + 957, + 0.15 + ], + [ + 958, + 0.15 + ], + [ + 959, + 0.15 + ], + [ + 960, + 0.12 + ], + [ + 961, + 0.12 + ], + [ + 962, + 0.12 + ], + [ + 963, + 0.12 + ], + [ + 964, + 0.12 + ], + [ + 965, + 0.12 + ], + [ + 966, + 0.12 + ], + [ + 967, + 0.12 + ], + [ + 968, + 0.12 + ], + [ + 969, + 0.12 + ], + [ + 970, + 0.2 + ], + [ + 971, + 0.2 + ], + [ + 972, + 0.18 + ], + [ + 973, + 0.12 + ], + [ + 974, + 0.12 + ], + [ + 975, + 0.12 + ], + [ + 976, + 0.12 + ], + [ + 977, + 0.12 + ], + [ + 978, + 0.12 + ], + [ + 979, + 0.12 + ], + [ + 980, + 0.12 + ], + [ + 981, + 0.12 + ], + [ + 982, + 0.12 + ], + [ + 983, + 0.12 + ], + [ + 984, + 0.12 + ], + [ + 985, + 0.12 + ], + [ + 986, + 0.12 + ], + [ + 987, + 0.12 + ], + [ + 988, + 0.12 + ], + [ + 989, + 0.12 + ], + [ + 990, + 0.12 + ], + [ + 991, + 0.12 + ], + [ + 992, + 0.12 + ], + [ + 993, + 0.12 + ], + [ + 994, + 0.2 + ], + [ + 995, + 0.2 + ], + [ + 996, + 0.18 + ], + [ + 997, + 0.12 + ], + [ + 998, + 0.12 + ], + [ + 999, + 0.12 + ], + [ + 1000, + 0.12 + ], + [ + 1001, + 0.12 + ], + [ + 1002, + 0.12 + ], + [ + 1003, + 0.12 + ], + [ + 1004, + 0.12 + ], + [ + 1005, + 0.12 + ], + [ + 1006, + 0.12 + ], + [ + 1007, + 0.12 + ], + [ + 1008, + 0.15 + ], + [ + 1009, + 0.15 + ], + [ + 1010, + 0.15 + ], + [ + 1011, + 0.15 + ], + [ + 1012, + 0.15 + ], + [ + 1013, + 0.15 + ], + [ + 1014, + 0.15 + ], + [ + 1015, + 0.15 + ], + [ + 1016, + 0.55 + ], + [ + 1017, + 0.95 + ], + [ + 1018, + 0.95 + ], + [ + 1019, + 0.95 + ], + [ + 1020, + 0.7 + ], + [ + 1021, + 0.95 + ], + [ + 1022, + 0.95 + ], + [ + 1023, + 0.95 + ], + [ + 1024, + 0.95 + ], + [ + 1025, + 0.45 + ], + [ + 1026, + 0.15 + ], + [ + 1027, + 0.15 + ], + [ + 1028, + 0.15 + ], + [ + 1029, + 0.15 + ], + [ + 1030, + 0.15 + ], + [ + 1031, + 0.15 + ], + [ + 1032, + 0.15 + ], + [ + 1033, + 0.15 + ], + [ + 1034, + 0.15 + ], + [ + 1035, + 0.15 + ], + [ + 1036, + 0.15 + ], + [ + 1037, + 0.15 + ], + [ + 1038, + 0.15 + ], + [ + 1039, + 0.15 + ], + [ + 1040, + 0.55 + ], + [ + 1041, + 0.95 + ], + [ + 1042, + 0.95 + ], + [ + 1043, + 0.95 + ], + [ + 1044, + 0.7 + ], + [ + 1045, + 0.95 + ], + [ + 1046, + 0.95 + ], + [ + 1047, + 0.95 + ], + [ + 1048, + 0.95 + ], + [ + 1049, + 0.45 + ], + [ + 1050, + 0.15 + ], + [ + 1051, + 0.15 + ], + [ + 1052, + 0.15 + ], + [ + 1053, + 0.15 + ], + [ + 1054, + 0.15 + ], + [ + 1055, + 0.15 + ], + [ + 1056, + 0.15 + ], + [ + 1057, + 0.15 + ], + [ + 1058, + 0.15 + ], + [ + 1059, + 0.15 + ], + [ + 1060, + 0.15 + ], + [ + 1061, + 0.15 + ], + [ + 1062, + 0.15 + ], + [ + 1063, + 0.15 + ], + [ + 1064, + 0.55 + ], + [ + 1065, + 0.95 + ], + [ + 1066, + 0.95 + ], + [ + 1067, + 0.95 + ], + [ + 1068, + 0.7 + ], + [ + 1069, + 0.95 + ], + [ + 1070, + 0.95 + ], + [ + 1071, + 0.95 + ], + [ + 1072, + 0.95 + ], + [ + 1073, + 0.45 + ], + [ + 1074, + 0.15 + ], + [ + 1075, + 0.15 + ], + [ + 1076, + 0.15 + ], + [ + 1077, + 0.15 + ], + [ + 1078, + 0.15 + ], + [ + 1079, + 0.15 + ], + [ + 1080, + 0.15 + ], + [ + 1081, + 0.15 + ], + [ + 1082, + 0.15 + ], + [ + 1083, + 0.15 + ], + [ + 1084, + 0.15 + ], + [ + 1085, + 0.15 + ], + [ + 1086, + 0.15 + ], + [ + 1087, + 0.15 + ], + [ + 1088, + 0.55 + ], + [ + 1089, + 0.95 + ], + [ + 1090, + 0.95 + ], + [ + 1091, + 0.95 + ], + [ + 1092, + 0.7 + ], + [ + 1093, + 0.95 + ], + [ + 1094, + 0.95 + ], + [ + 1095, + 0.95 + ], + [ + 1096, + 0.95 + ], + [ + 1097, + 0.45 + ], + [ + 1098, + 0.15 + ], + [ + 1099, + 0.15 + ], + [ + 1100, + 0.15 + ], + [ + 1101, + 0.15 + ], + [ + 1102, + 0.15 + ], + [ + 1103, + 0.15 + ], + [ + 1104, + 0.15 + ], + [ + 1105, + 0.15 + ], + [ + 1106, + 0.15 + ], + [ + 1107, + 0.15 + ], + [ + 1108, + 0.15 + ], + [ + 1109, + 0.15 + ], + [ + 1110, + 0.15 + ], + [ + 1111, + 0.15 + ], + [ + 1112, + 0.55 + ], + [ + 1113, + 0.95 + ], + [ + 1114, + 0.95 + ], + [ + 1115, + 0.95 + ], + [ + 1116, + 0.7 + ], + [ + 1117, + 0.95 + ], + [ + 1118, + 0.95 + ], + [ + 1119, + 0.95 + ], + [ + 1120, + 0.95 + ], + [ + 1121, + 0.45 + ], + [ + 1122, + 0.15 + ], + [ + 1123, + 0.15 + ], + [ + 1124, + 0.15 + ], + [ + 1125, + 0.15 + ], + [ + 1126, + 0.15 + ], + [ + 1127, + 0.15 + ], + [ + 1128, + 0.12 + ], + [ + 1129, + 0.12 + ], + [ + 1130, + 0.12 + ], + [ + 1131, + 0.12 + ], + [ + 1132, + 0.12 + ], + [ + 1133, + 0.12 + ], + [ + 1134, + 0.12 + ], + [ + 1135, + 0.12 + ], + [ + 1136, + 0.12 + ], + [ + 1137, + 0.12 + ], + [ + 1138, + 0.2 + ], + [ + 1139, + 0.2 + ], + [ + 1140, + 0.18 + ], + [ + 1141, + 0.12 + ], + [ + 1142, + 0.12 + ], + [ + 1143, + 0.12 + ], + [ + 1144, + 0.12 + ], + [ + 1145, + 0.12 + ], + [ + 1146, + 0.12 + ], + [ + 1147, + 0.12 + ], + [ + 1148, + 0.12 + ], + [ + 1149, + 0.12 + ], + [ + 1150, + 0.12 + ], + [ + 1151, + 0.12 + ], + [ + 1152, + 0.12 + ], + [ + 1153, + 0.12 + ], + [ + 1154, + 0.12 + ], + [ + 1155, + 0.12 + ], + [ + 1156, + 0.12 + ], + [ + 1157, + 0.12 + ], + [ + 1158, + 0.12 + ], + [ + 1159, + 0.12 + ], + [ + 1160, + 0.12 + ], + [ + 1161, + 0.12 + ], + [ + 1162, + 0.2 + ], + [ + 1163, + 0.2 + ], + [ + 1164, + 0.18 + ], + [ + 1165, + 0.12 + ], + [ + 1166, + 0.12 + ], + [ + 1167, + 0.12 + ], + [ + 1168, + 0.12 + ], + [ + 1169, + 0.12 + ], + [ + 1170, + 0.12 + ], + [ + 1171, + 0.12 + ], + [ + 1172, + 0.12 + ], + [ + 1173, + 0.12 + ], + [ + 1174, + 0.12 + ], + [ + 1175, + 0.12 + ], + [ + 1176, + 0.15 + ], + [ + 1177, + 0.15 + ], + [ + 1178, + 0.15 + ], + [ + 1179, + 0.15 + ], + [ + 1180, + 0.15 + ], + [ + 1181, + 0.15 + ], + [ + 1182, + 0.15 + ], + [ + 1183, + 0.15 + ], + [ + 1184, + 0.55 + ], + [ + 1185, + 0.95 + ], + [ + 1186, + 0.95 + ], + [ + 1187, + 0.95 + ], + [ + 1188, + 0.7 + ], + [ + 1189, + 0.95 + ], + [ + 1190, + 0.95 + ], + [ + 1191, + 0.95 + ], + [ + 1192, + 0.95 + ], + [ + 1193, + 0.45 + ], + [ + 1194, + 0.15 + ], + [ + 1195, + 0.15 + ], + [ + 1196, + 0.15 + ], + [ + 1197, + 0.15 + ], + [ + 1198, + 0.15 + ], + [ + 1199, + 0.15 + ], + [ + 1200, + 0.15 + ], + [ + 1201, + 0.15 + ], + [ + 1202, + 0.15 + ], + [ + 1203, + 0.15 + ], + [ + 1204, + 0.15 + ], + [ + 1205, + 0.15 + ], + [ + 1206, + 0.15 + ], + [ + 1207, + 0.15 + ], + [ + 1208, + 0.55 + ], + [ + 1209, + 0.95 + ], + [ + 1210, + 0.95 + ], + [ + 1211, + 0.95 + ], + [ + 1212, + 0.7 + ], + [ + 1213, + 0.95 + ], + [ + 1214, + 0.95 + ], + [ + 1215, + 0.95 + ], + [ + 1216, + 0.95 + ], + [ + 1217, + 0.45 + ], + [ + 1218, + 0.15 + ], + [ + 1219, + 0.15 + ], + [ + 1220, + 0.15 + ], + [ + 1221, + 0.15 + ], + [ + 1222, + 0.15 + ], + [ + 1223, + 0.15 + ], + [ + 1224, + 0.15 + ], + [ + 1225, + 0.15 + ], + [ + 1226, + 0.15 + ], + [ + 1227, + 0.15 + ], + [ + 1228, + 0.15 + ], + [ + 1229, + 0.15 + ], + [ + 1230, + 0.15 + ], + [ + 1231, + 0.15 + ], + [ + 1232, + 0.55 + ], + [ + 1233, + 0.95 + ], + [ + 1234, + 0.95 + ], + [ + 1235, + 0.95 + ], + [ + 1236, + 0.7 + ], + [ + 1237, + 0.95 + ], + [ + 1238, + 0.95 + ], + [ + 1239, + 0.95 + ], + [ + 1240, + 0.95 + ], + [ + 1241, + 0.45 + ], + [ + 1242, + 0.15 + ], + [ + 1243, + 0.15 + ], + [ + 1244, + 0.15 + ], + [ + 1245, + 0.15 + ], + [ + 1246, + 0.15 + ], + [ + 1247, + 0.15 + ], + [ + 1248, + 0.15 + ], + [ + 1249, + 0.15 + ], + [ + 1250, + 0.15 + ], + [ + 1251, + 0.15 + ], + [ + 1252, + 0.15 + ], + [ + 1253, + 0.15 + ], + [ + 1254, + 0.15 + ], + [ + 1255, + 0.15 + ], + [ + 1256, + 0.55 + ], + [ + 1257, + 0.95 + ], + [ + 1258, + 0.95 + ], + [ + 1259, + 0.95 + ], + [ + 1260, + 0.7 + ], + [ + 1261, + 0.95 + ], + [ + 1262, + 0.95 + ], + [ + 1263, + 0.95 + ], + [ + 1264, + 0.95 + ], + [ + 1265, + 0.45 + ], + [ + 1266, + 0.15 + ], + [ + 1267, + 0.15 + ], + [ + 1268, + 0.15 + ], + [ + 1269, + 0.15 + ], + [ + 1270, + 0.15 + ], + [ + 1271, + 0.15 + ], + [ + 1272, + 0.15 + ], + [ + 1273, + 0.15 + ], + [ + 1274, + 0.15 + ], + [ + 1275, + 0.15 + ], + [ + 1276, + 0.15 + ], + [ + 1277, + 0.15 + ], + [ + 1278, + 0.15 + ], + [ + 1279, + 0.15 + ], + [ + 1280, + 0.55 + ], + [ + 1281, + 0.95 + ], + [ + 1282, + 0.95 + ], + [ + 1283, + 0.95 + ], + [ + 1284, + 0.7 + ], + [ + 1285, + 0.95 + ], + [ + 1286, + 0.95 + ], + [ + 1287, + 0.95 + ], + [ + 1288, + 0.95 + ], + [ + 1289, + 0.45 + ], + [ + 1290, + 0.15 + ], + [ + 1291, + 0.15 + ], + [ + 1292, + 0.15 + ], + [ + 1293, + 0.15 + ], + [ + 1294, + 0.15 + ], + [ + 1295, + 0.15 + ], + [ + 1296, + 0.12 + ], + [ + 1297, + 0.12 + ], + [ + 1298, + 0.12 + ], + [ + 1299, + 0.12 + ], + [ + 1300, + 0.12 + ], + [ + 1301, + 0.12 + ], + [ + 1302, + 0.12 + ], + [ + 1303, + 0.12 + ], + [ + 1304, + 0.12 + ], + [ + 1305, + 0.12 + ], + [ + 1306, + 0.2 + ], + [ + 1307, + 0.2 + ], + [ + 1308, + 0.18 + ], + [ + 1309, + 0.12 + ], + [ + 1310, + 0.12 + ], + [ + 1311, + 0.12 + ], + [ + 1312, + 0.12 + ], + [ + 1313, + 0.12 + ], + [ + 1314, + 0.12 + ], + [ + 1315, + 0.12 + ], + [ + 1316, + 0.12 + ], + [ + 1317, + 0.12 + ], + [ + 1318, + 0.12 + ], + [ + 1319, + 0.12 + ], + [ + 1320, + 0.12 + ], + [ + 1321, + 0.12 + ], + [ + 1322, + 0.12 + ], + [ + 1323, + 0.12 + ], + [ + 1324, + 0.12 + ], + [ + 1325, + 0.12 + ], + [ + 1326, + 0.12 + ], + [ + 1327, + 0.12 + ], + [ + 1328, + 0.12 + ], + [ + 1329, + 0.12 + ], + [ + 1330, + 0.2 + ], + [ + 1331, + 0.2 + ], + [ + 1332, + 0.18 + ], + [ + 1333, + 0.12 + ], + [ + 1334, + 0.12 + ], + [ + 1335, + 0.12 + ], + [ + 1336, + 0.12 + ], + [ + 1337, + 0.12 + ], + [ + 1338, + 0.12 + ], + [ + 1339, + 0.12 + ], + [ + 1340, + 0.12 + ], + [ + 1341, + 0.12 + ], + [ + 1342, + 0.12 + ], + [ + 1343, + 0.12 + ], + [ + 1344, + 0.15 + ], + [ + 1345, + 0.15 + ], + [ + 1346, + 0.15 + ], + [ + 1347, + 0.15 + ], + [ + 1348, + 0.15 + ], + [ + 1349, + 0.15 + ], + [ + 1350, + 0.15 + ], + [ + 1351, + 0.15 + ], + [ + 1352, + 0.55 + ], + [ + 1353, + 0.95 + ], + [ + 1354, + 0.95 + ], + [ + 1355, + 0.95 + ], + [ + 1356, + 0.7 + ], + [ + 1357, + 0.95 + ], + [ + 1358, + 0.95 + ], + [ + 1359, + 0.95 + ], + [ + 1360, + 0.95 + ], + [ + 1361, + 0.45 + ], + [ + 1362, + 0.15 + ], + [ + 1363, + 0.15 + ], + [ + 1364, + 0.15 + ], + [ + 1365, + 0.15 + ], + [ + 1366, + 0.15 + ], + [ + 1367, + 0.15 + ], + [ + 1368, + 0.15 + ], + [ + 1369, + 0.15 + ], + [ + 1370, + 0.15 + ], + [ + 1371, + 0.15 + ], + [ + 1372, + 0.15 + ], + [ + 1373, + 0.15 + ], + [ + 1374, + 0.15 + ], + [ + 1375, + 0.15 + ], + [ + 1376, + 0.55 + ], + [ + 1377, + 0.95 + ], + [ + 1378, + 0.95 + ], + [ + 1379, + 0.95 + ], + [ + 1380, + 0.7 + ], + [ + 1381, + 0.95 + ], + [ + 1382, + 0.95 + ], + [ + 1383, + 0.95 + ], + [ + 1384, + 0.95 + ], + [ + 1385, + 0.45 + ], + [ + 1386, + 0.15 + ], + [ + 1387, + 0.15 + ], + [ + 1388, + 0.15 + ], + [ + 1389, + 0.15 + ], + [ + 1390, + 0.15 + ], + [ + 1391, + 0.15 + ], + [ + 1392, + 0.15 + ], + [ + 1393, + 0.15 + ], + [ + 1394, + 0.15 + ], + [ + 1395, + 0.15 + ], + [ + 1396, + 0.15 + ], + [ + 1397, + 0.15 + ], + [ + 1398, + 0.15 + ], + [ + 1399, + 0.15 + ], + [ + 1400, + 0.55 + ], + [ + 1401, + 0.95 + ], + [ + 1402, + 0.95 + ], + [ + 1403, + 0.95 + ], + [ + 1404, + 0.7 + ], + [ + 1405, + 0.95 + ], + [ + 1406, + 0.95 + ], + [ + 1407, + 0.95 + ], + [ + 1408, + 0.95 + ], + [ + 1409, + 0.45 + ], + [ + 1410, + 0.15 + ], + [ + 1411, + 0.15 + ], + [ + 1412, + 0.15 + ], + [ + 1413, + 0.15 + ], + [ + 1414, + 0.15 + ], + [ + 1415, + 0.15 + ], + [ + 1416, + 0.15 + ], + [ + 1417, + 0.15 + ], + [ + 1418, + 0.15 + ], + [ + 1419, + 0.15 + ], + [ + 1420, + 0.15 + ], + [ + 1421, + 0.15 + ], + [ + 1422, + 0.15 + ], + [ + 1423, + 0.15 + ], + [ + 1424, + 0.55 + ], + [ + 1425, + 0.95 + ], + [ + 1426, + 0.95 + ], + [ + 1427, + 0.95 + ], + [ + 1428, + 0.7 + ], + [ + 1429, + 0.95 + ], + [ + 1430, + 0.95 + ], + [ + 1431, + 0.95 + ], + [ + 1432, + 0.95 + ], + [ + 1433, + 0.45 + ], + [ + 1434, + 0.15 + ], + [ + 1435, + 0.15 + ], + [ + 1436, + 0.15 + ], + [ + 1437, + 0.15 + ], + [ + 1438, + 0.15 + ], + [ + 1439, + 0.15 + ], + [ + 1440, + 0.15 + ], + [ + 1441, + 0.15 + ], + [ + 1442, + 0.15 + ], + [ + 1443, + 0.15 + ], + [ + 1444, + 0.15 + ], + [ + 1445, + 0.15 + ], + [ + 1446, + 0.15 + ], + [ + 1447, + 0.15 + ], + [ + 1448, + 0.55 + ], + [ + 1449, + 0.95 + ], + [ + 1450, + 0.95 + ], + [ + 1451, + 0.95 + ], + [ + 1452, + 0.7 + ], + [ + 1453, + 0.95 + ], + [ + 1454, + 0.95 + ], + [ + 1455, + 0.95 + ], + [ + 1456, + 0.95 + ], + [ + 1457, + 0.45 + ], + [ + 1458, + 0.15 + ], + [ + 1459, + 0.15 + ], + [ + 1460, + 0.15 + ], + [ + 1461, + 0.15 + ], + [ + 1462, + 0.15 + ], + [ + 1463, + 0.15 + ], + [ + 1464, + 0.12 + ], + [ + 1465, + 0.12 + ], + [ + 1466, + 0.12 + ], + [ + 1467, + 0.12 + ], + [ + 1468, + 0.12 + ], + [ + 1469, + 0.12 + ], + [ + 1470, + 0.12 + ], + [ + 1471, + 0.12 + ], + [ + 1472, + 0.12 + ], + [ + 1473, + 0.12 + ], + [ + 1474, + 0.2 + ], + [ + 1475, + 0.2 + ], + [ + 1476, + 0.18 + ], + [ + 1477, + 0.12 + ], + [ + 1478, + 0.12 + ], + [ + 1479, + 0.12 + ], + [ + 1480, + 0.12 + ], + [ + 1481, + 0.12 + ], + [ + 1482, + 0.12 + ], + [ + 1483, + 0.12 + ], + [ + 1484, + 0.12 + ], + [ + 1485, + 0.12 + ], + [ + 1486, + 0.12 + ], + [ + 1487, + 0.12 + ], + [ + 1488, + 0.12 + ], + [ + 1489, + 0.12 + ], + [ + 1490, + 0.12 + ], + [ + 1491, + 0.12 + ], + [ + 1492, + 0.12 + ], + [ + 1493, + 0.12 + ], + [ + 1494, + 0.12 + ], + [ + 1495, + 0.12 + ], + [ + 1496, + 0.12 + ], + [ + 1497, + 0.12 + ], + [ + 1498, + 0.2 + ], + [ + 1499, + 0.2 + ], + [ + 1500, + 0.18 + ], + [ + 1501, + 0.12 + ], + [ + 1502, + 0.12 + ], + [ + 1503, + 0.12 + ], + [ + 1504, + 0.12 + ], + [ + 1505, + 0.12 + ], + [ + 1506, + 0.12 + ], + [ + 1507, + 0.12 + ], + [ + 1508, + 0.12 + ], + [ + 1509, + 0.12 + ], + [ + 1510, + 0.12 + ], + [ + 1511, + 0.12 + ], + [ + 1512, + 0.15 + ], + [ + 1513, + 0.15 + ], + [ + 1514, + 0.15 + ], + [ + 1515, + 0.15 + ], + [ + 1516, + 0.15 + ], + [ + 1517, + 0.15 + ], + [ + 1518, + 0.15 + ], + [ + 1519, + 0.15 + ], + [ + 1520, + 0.55 + ], + [ + 1521, + 0.95 + ], + [ + 1522, + 0.95 + ], + [ + 1523, + 0.95 + ], + [ + 1524, + 0.7 + ], + [ + 1525, + 0.95 + ], + [ + 1526, + 0.95 + ], + [ + 1527, + 0.95 + ], + [ + 1528, + 0.95 + ], + [ + 1529, + 0.45 + ], + [ + 1530, + 0.15 + ], + [ + 1531, + 0.15 + ], + [ + 1532, + 0.15 + ], + [ + 1533, + 0.15 + ], + [ + 1534, + 0.15 + ], + [ + 1535, + 0.15 + ], + [ + 1536, + 0.15 + ], + [ + 1537, + 0.15 + ], + [ + 1538, + 0.15 + ], + [ + 1539, + 0.15 + ], + [ + 1540, + 0.15 + ], + [ + 1541, + 0.15 + ], + [ + 1542, + 0.15 + ], + [ + 1543, + 0.15 + ], + [ + 1544, + 0.55 + ], + [ + 1545, + 0.95 + ], + [ + 1546, + 0.95 + ], + [ + 1547, + 0.95 + ], + [ + 1548, + 0.7 + ], + [ + 1549, + 0.95 + ], + [ + 1550, + 0.95 + ], + [ + 1551, + 0.95 + ], + [ + 1552, + 0.95 + ], + [ + 1553, + 0.45 + ], + [ + 1554, + 0.15 + ], + [ + 1555, + 0.15 + ], + [ + 1556, + 0.15 + ], + [ + 1557, + 0.15 + ], + [ + 1558, + 0.15 + ], + [ + 1559, + 0.15 + ], + [ + 1560, + 0.15 + ], + [ + 1561, + 0.15 + ], + [ + 1562, + 0.15 + ], + [ + 1563, + 0.15 + ], + [ + 1564, + 0.15 + ], + [ + 1565, + 0.15 + ], + [ + 1566, + 0.15 + ], + [ + 1567, + 0.15 + ], + [ + 1568, + 0.55 + ], + [ + 1569, + 0.95 + ], + [ + 1570, + 0.95 + ], + [ + 1571, + 0.95 + ], + [ + 1572, + 0.7 + ], + [ + 1573, + 0.95 + ], + [ + 1574, + 0.95 + ], + [ + 1575, + 0.95 + ], + [ + 1576, + 0.95 + ], + [ + 1577, + 0.45 + ], + [ + 1578, + 0.15 + ], + [ + 1579, + 0.15 + ], + [ + 1580, + 0.15 + ], + [ + 1581, + 0.15 + ], + [ + 1582, + 0.15 + ], + [ + 1583, + 0.15 + ], + [ + 1584, + 0.15 + ], + [ + 1585, + 0.15 + ], + [ + 1586, + 0.15 + ], + [ + 1587, + 0.15 + ], + [ + 1588, + 0.15 + ], + [ + 1589, + 0.15 + ], + [ + 1590, + 0.15 + ], + [ + 1591, + 0.15 + ], + [ + 1592, + 0.55 + ], + [ + 1593, + 0.95 + ], + [ + 1594, + 0.95 + ], + [ + 1595, + 0.95 + ], + [ + 1596, + 0.7 + ], + [ + 1597, + 0.95 + ], + [ + 1598, + 0.95 + ], + [ + 1599, + 0.95 + ], + [ + 1600, + 0.95 + ], + [ + 1601, + 0.45 + ], + [ + 1602, + 0.15 + ], + [ + 1603, + 0.15 + ], + [ + 1604, + 0.15 + ], + [ + 1605, + 0.15 + ], + [ + 1606, + 0.15 + ], + [ + 1607, + 0.15 + ], + [ + 1608, + 0.15 + ], + [ + 1609, + 0.15 + ], + [ + 1610, + 0.15 + ], + [ + 1611, + 0.15 + ], + [ + 1612, + 0.15 + ], + [ + 1613, + 0.15 + ], + [ + 1614, + 0.15 + ], + [ + 1615, + 0.15 + ], + [ + 1616, + 0.55 + ], + [ + 1617, + 0.95 + ], + [ + 1618, + 0.95 + ], + [ + 1619, + 0.95 + ], + [ + 1620, + 0.7 + ], + [ + 1621, + 0.95 + ], + [ + 1622, + 0.95 + ], + [ + 1623, + 0.95 + ], + [ + 1624, + 0.95 + ], + [ + 1625, + 0.45 + ], + [ + 1626, + 0.15 + ], + [ + 1627, + 0.15 + ], + [ + 1628, + 0.15 + ], + [ + 1629, + 0.15 + ], + [ + 1630, + 0.15 + ], + [ + 1631, + 0.15 + ], + [ + 1632, + 0.12 + ], + [ + 1633, + 0.12 + ], + [ + 1634, + 0.12 + ], + [ + 1635, + 0.12 + ], + [ + 1636, + 0.12 + ], + [ + 1637, + 0.12 + ], + [ + 1638, + 0.12 + ], + [ + 1639, + 0.12 + ], + [ + 1640, + 0.12 + ], + [ + 1641, + 0.12 + ], + [ + 1642, + 0.2 + ], + [ + 1643, + 0.2 + ], + [ + 1644, + 0.18 + ], + [ + 1645, + 0.12 + ], + [ + 1646, + 0.12 + ], + [ + 1647, + 0.12 + ], + [ + 1648, + 0.12 + ], + [ + 1649, + 0.12 + ], + [ + 1650, + 0.12 + ], + [ + 1651, + 0.12 + ], + [ + 1652, + 0.12 + ], + [ + 1653, + 0.12 + ], + [ + 1654, + 0.12 + ], + [ + 1655, + 0.12 + ], + [ + 1656, + 0.12 + ], + [ + 1657, + 0.12 + ], + [ + 1658, + 0.12 + ], + [ + 1659, + 0.12 + ], + [ + 1660, + 0.12 + ], + [ + 1661, + 0.12 + ], + [ + 1662, + 0.12 + ], + [ + 1663, + 0.12 + ], + [ + 1664, + 0.12 + ], + [ + 1665, + 0.12 + ], + [ + 1666, + 0.2 + ], + [ + 1667, + 0.2 + ], + [ + 1668, + 0.18 + ], + [ + 1669, + 0.12 + ], + [ + 1670, + 0.12 + ], + [ + 1671, + 0.12 + ], + [ + 1672, + 0.12 + ], + [ + 1673, + 0.12 + ], + [ + 1674, + 0.12 + ], + [ + 1675, + 0.12 + ], + [ + 1676, + 0.12 + ], + [ + 1677, + 0.12 + ], + [ + 1678, + 0.12 + ], + [ + 1679, + 0.12 + ], + [ + 1680, + 0.15 + ], + [ + 1681, + 0.15 + ], + [ + 1682, + 0.15 + ], + [ + 1683, + 0.15 + ], + [ + 1684, + 0.15 + ], + [ + 1685, + 0.15 + ], + [ + 1686, + 0.15 + ], + [ + 1687, + 0.15 + ], + [ + 1688, + 0.55 + ], + [ + 1689, + 0.95 + ], + [ + 1690, + 0.95 + ], + [ + 1691, + 0.95 + ], + [ + 1692, + 0.7 + ], + [ + 1693, + 0.95 + ], + [ + 1694, + 0.95 + ], + [ + 1695, + 0.95 + ], + [ + 1696, + 0.95 + ], + [ + 1697, + 0.45 + ], + [ + 1698, + 0.15 + ], + [ + 1699, + 0.15 + ], + [ + 1700, + 0.15 + ], + [ + 1701, + 0.15 + ], + [ + 1702, + 0.15 + ], + [ + 1703, + 0.15 + ], + [ + 1704, + 0.15 + ], + [ + 1705, + 0.15 + ], + [ + 1706, + 0.15 + ], + [ + 1707, + 0.15 + ], + [ + 1708, + 0.15 + ], + [ + 1709, + 0.15 + ], + [ + 1710, + 0.15 + ], + [ + 1711, + 0.15 + ], + [ + 1712, + 0.55 + ], + [ + 1713, + 0.95 + ], + [ + 1714, + 0.95 + ], + [ + 1715, + 0.95 + ], + [ + 1716, + 0.7 + ], + [ + 1717, + 0.95 + ], + [ + 1718, + 0.95 + ], + [ + 1719, + 0.95 + ], + [ + 1720, + 0.95 + ], + [ + 1721, + 0.45 + ], + [ + 1722, + 0.15 + ], + [ + 1723, + 0.15 + ], + [ + 1724, + 0.15 + ], + [ + 1725, + 0.15 + ], + [ + 1726, + 0.15 + ], + [ + 1727, + 0.15 + ], + [ + 1728, + 0.15 + ], + [ + 1729, + 0.15 + ], + [ + 1730, + 0.15 + ], + [ + 1731, + 0.15 + ], + [ + 1732, + 0.15 + ], + [ + 1733, + 0.15 + ], + [ + 1734, + 0.15 + ], + [ + 1735, + 0.15 + ], + [ + 1736, + 0.55 + ], + [ + 1737, + 0.95 + ], + [ + 1738, + 0.95 + ], + [ + 1739, + 0.95 + ], + [ + 1740, + 0.7 + ], + [ + 1741, + 0.95 + ], + [ + 1742, + 0.95 + ], + [ + 1743, + 0.95 + ], + [ + 1744, + 0.95 + ], + [ + 1745, + 0.45 + ], + [ + 1746, + 0.15 + ], + [ + 1747, + 0.15 + ], + [ + 1748, + 0.15 + ], + [ + 1749, + 0.15 + ], + [ + 1750, + 0.15 + ], + [ + 1751, + 0.15 + ], + [ + 1752, + 0.15 + ], + [ + 1753, + 0.15 + ], + [ + 1754, + 0.15 + ], + [ + 1755, + 0.15 + ], + [ + 1756, + 0.15 + ], + [ + 1757, + 0.15 + ], + [ + 1758, + 0.15 + ], + [ + 1759, + 0.15 + ], + [ + 1760, + 0.55 + ], + [ + 1761, + 0.95 + ], + [ + 1762, + 0.95 + ], + [ + 1763, + 0.95 + ], + [ + 1764, + 0.7 + ], + [ + 1765, + 0.95 + ], + [ + 1766, + 0.95 + ], + [ + 1767, + 0.95 + ], + [ + 1768, + 0.95 + ], + [ + 1769, + 0.45 + ], + [ + 1770, + 0.15 + ], + [ + 1771, + 0.15 + ], + [ + 1772, + 0.15 + ], + [ + 1773, + 0.15 + ], + [ + 1774, + 0.15 + ], + [ + 1775, + 0.15 + ], + [ + 1776, + 0.15 + ], + [ + 1777, + 0.15 + ], + [ + 1778, + 0.15 + ], + [ + 1779, + 0.15 + ], + [ + 1780, + 0.15 + ], + [ + 1781, + 0.15 + ], + [ + 1782, + 0.15 + ], + [ + 1783, + 0.15 + ], + [ + 1784, + 0.55 + ], + [ + 1785, + 0.95 + ], + [ + 1786, + 0.95 + ], + [ + 1787, + 0.95 + ], + [ + 1788, + 0.7 + ], + [ + 1789, + 0.95 + ], + [ + 1790, + 0.95 + ], + [ + 1791, + 0.95 + ], + [ + 1792, + 0.95 + ], + [ + 1793, + 0.45 + ], + [ + 1794, + 0.15 + ], + [ + 1795, + 0.15 + ], + [ + 1796, + 0.15 + ], + [ + 1797, + 0.15 + ], + [ + 1798, + 0.15 + ], + [ + 1799, + 0.15 + ], + [ + 1800, + 0.12 + ], + [ + 1801, + 0.12 + ], + [ + 1802, + 0.12 + ], + [ + 1803, + 0.12 + ], + [ + 1804, + 0.12 + ], + [ + 1805, + 0.12 + ], + [ + 1806, + 0.12 + ], + [ + 1807, + 0.12 + ], + [ + 1808, + 0.12 + ], + [ + 1809, + 0.12 + ], + [ + 1810, + 0.2 + ], + [ + 1811, + 0.2 + ], + [ + 1812, + 0.18 + ], + [ + 1813, + 0.12 + ], + [ + 1814, + 0.12 + ], + [ + 1815, + 0.12 + ], + [ + 1816, + 0.12 + ], + [ + 1817, + 0.12 + ], + [ + 1818, + 0.12 + ], + [ + 1819, + 0.12 + ], + [ + 1820, + 0.12 + ], + [ + 1821, + 0.12 + ], + [ + 1822, + 0.12 + ], + [ + 1823, + 0.12 + ], + [ + 1824, + 0.12 + ], + [ + 1825, + 0.12 + ], + [ + 1826, + 0.12 + ], + [ + 1827, + 0.12 + ], + [ + 1828, + 0.12 + ], + [ + 1829, + 0.12 + ], + [ + 1830, + 0.12 + ], + [ + 1831, + 0.12 + ], + [ + 1832, + 0.12 + ], + [ + 1833, + 0.12 + ], + [ + 1834, + 0.2 + ], + [ + 1835, + 0.2 + ], + [ + 1836, + 0.18 + ], + [ + 1837, + 0.12 + ], + [ + 1838, + 0.12 + ], + [ + 1839, + 0.12 + ], + [ + 1840, + 0.12 + ], + [ + 1841, + 0.12 + ], + [ + 1842, + 0.12 + ], + [ + 1843, + 0.12 + ], + [ + 1844, + 0.12 + ], + [ + 1845, + 0.12 + ], + [ + 1846, + 0.12 + ], + [ + 1847, + 0.12 + ], + [ + 1848, + 0.15 + ], + [ + 1849, + 0.15 + ], + [ + 1850, + 0.15 + ], + [ + 1851, + 0.15 + ], + [ + 1852, + 0.15 + ], + [ + 1853, + 0.15 + ], + [ + 1854, + 0.15 + ], + [ + 1855, + 0.15 + ], + [ + 1856, + 0.55 + ], + [ + 1857, + 0.95 + ], + [ + 1858, + 0.95 + ], + [ + 1859, + 0.95 + ], + [ + 1860, + 0.7 + ], + [ + 1861, + 0.95 + ], + [ + 1862, + 0.95 + ], + [ + 1863, + 0.95 + ], + [ + 1864, + 0.95 + ], + [ + 1865, + 0.45 + ], + [ + 1866, + 0.15 + ], + [ + 1867, + 0.15 + ], + [ + 1868, + 0.15 + ], + [ + 1869, + 0.15 + ], + [ + 1870, + 0.15 + ], + [ + 1871, + 0.15 + ], + [ + 1872, + 0.15 + ], + [ + 1873, + 0.15 + ], + [ + 1874, + 0.15 + ], + [ + 1875, + 0.15 + ], + [ + 1876, + 0.15 + ], + [ + 1877, + 0.15 + ], + [ + 1878, + 0.15 + ], + [ + 1879, + 0.15 + ], + [ + 1880, + 0.55 + ], + [ + 1881, + 0.95 + ], + [ + 1882, + 0.95 + ], + [ + 1883, + 0.95 + ], + [ + 1884, + 0.7 + ], + [ + 1885, + 0.95 + ], + [ + 1886, + 0.95 + ], + [ + 1887, + 0.95 + ], + [ + 1888, + 0.95 + ], + [ + 1889, + 0.45 + ], + [ + 1890, + 0.15 + ], + [ + 1891, + 0.15 + ], + [ + 1892, + 0.15 + ], + [ + 1893, + 0.15 + ], + [ + 1894, + 0.15 + ], + [ + 1895, + 0.15 + ], + [ + 1896, + 0.15 + ], + [ + 1897, + 0.15 + ], + [ + 1898, + 0.15 + ], + [ + 1899, + 0.15 + ], + [ + 1900, + 0.15 + ], + [ + 1901, + 0.15 + ], + [ + 1902, + 0.15 + ], + [ + 1903, + 0.15 + ], + [ + 1904, + 0.55 + ], + [ + 1905, + 0.95 + ], + [ + 1906, + 0.95 + ], + [ + 1907, + 0.95 + ], + [ + 1908, + 0.7 + ], + [ + 1909, + 0.95 + ], + [ + 1910, + 0.95 + ], + [ + 1911, + 0.95 + ], + [ + 1912, + 0.95 + ], + [ + 1913, + 0.45 + ], + [ + 1914, + 0.15 + ], + [ + 1915, + 0.15 + ], + [ + 1916, + 0.15 + ], + [ + 1917, + 0.15 + ], + [ + 1918, + 0.15 + ], + [ + 1919, + 0.15 + ], + [ + 1920, + 0.15 + ], + [ + 1921, + 0.15 + ], + [ + 1922, + 0.15 + ], + [ + 1923, + 0.15 + ], + [ + 1924, + 0.15 + ], + [ + 1925, + 0.15 + ], + [ + 1926, + 0.15 + ], + [ + 1927, + 0.15 + ], + [ + 1928, + 0.55 + ], + [ + 1929, + 0.95 + ], + [ + 1930, + 0.95 + ], + [ + 1931, + 0.95 + ], + [ + 1932, + 0.7 + ], + [ + 1933, + 0.95 + ], + [ + 1934, + 0.95 + ], + [ + 1935, + 0.95 + ], + [ + 1936, + 0.95 + ], + [ + 1937, + 0.45 + ], + [ + 1938, + 0.15 + ], + [ + 1939, + 0.15 + ], + [ + 1940, + 0.15 + ], + [ + 1941, + 0.15 + ], + [ + 1942, + 0.15 + ], + [ + 1943, + 0.15 + ], + [ + 1944, + 0.15 + ], + [ + 1945, + 0.15 + ], + [ + 1946, + 0.15 + ], + [ + 1947, + 0.15 + ], + [ + 1948, + 0.15 + ], + [ + 1949, + 0.15 + ], + [ + 1950, + 0.15 + ], + [ + 1951, + 0.15 + ], + [ + 1952, + 0.55 + ], + [ + 1953, + 0.95 + ], + [ + 1954, + 0.95 + ], + [ + 1955, + 0.95 + ], + [ + 1956, + 0.7 + ], + [ + 1957, + 0.95 + ], + [ + 1958, + 0.95 + ], + [ + 1959, + 0.95 + ], + [ + 1960, + 0.95 + ], + [ + 1961, + 0.45 + ], + [ + 1962, + 0.15 + ], + [ + 1963, + 0.15 + ], + [ + 1964, + 0.15 + ], + [ + 1965, + 0.15 + ], + [ + 1966, + 0.15 + ], + [ + 1967, + 0.15 + ], + [ + 1968, + 0.12 + ], + [ + 1969, + 0.12 + ], + [ + 1970, + 0.12 + ], + [ + 1971, + 0.12 + ], + [ + 1972, + 0.12 + ], + [ + 1973, + 0.12 + ], + [ + 1974, + 0.12 + ], + [ + 1975, + 0.12 + ], + [ + 1976, + 0.12 + ], + [ + 1977, + 0.12 + ], + [ + 1978, + 0.2 + ], + [ + 1979, + 0.2 + ], + [ + 1980, + 0.18 + ], + [ + 1981, + 0.12 + ], + [ + 1982, + 0.12 + ], + [ + 1983, + 0.12 + ], + [ + 1984, + 0.12 + ], + [ + 1985, + 0.12 + ], + [ + 1986, + 0.12 + ], + [ + 1987, + 0.12 + ], + [ + 1988, + 0.12 + ], + [ + 1989, + 0.12 + ], + [ + 1990, + 0.12 + ], + [ + 1991, + 0.12 + ], + [ + 1992, + 0.12 + ], + [ + 1993, + 0.12 + ], + [ + 1994, + 0.12 + ], + [ + 1995, + 0.12 + ], + [ + 1996, + 0.12 + ], + [ + 1997, + 0.12 + ], + [ + 1998, + 0.12 + ], + [ + 1999, + 0.12 + ], + [ + 2000, + 0.12 + ], + [ + 2001, + 0.12 + ], + [ + 2002, + 0.2 + ], + [ + 2003, + 0.2 + ], + [ + 2004, + 0.18 + ], + [ + 2005, + 0.12 + ], + [ + 2006, + 0.12 + ], + [ + 2007, + 0.12 + ], + [ + 2008, + 0.12 + ], + [ + 2009, + 0.12 + ], + [ + 2010, + 0.12 + ], + [ + 2011, + 0.12 + ], + [ + 2012, + 0.12 + ], + [ + 2013, + 0.12 + ], + [ + 2014, + 0.12 + ], + [ + 2015, + 0.12 + ], + [ + 2016, + 0.15 + ], + [ + 2017, + 0.15 + ], + [ + 2018, + 0.15 + ], + [ + 2019, + 0.15 + ], + [ + 2020, + 0.15 + ], + [ + 2021, + 0.15 + ], + [ + 2022, + 0.15 + ], + [ + 2023, + 0.15 + ], + [ + 2024, + 0.55 + ], + [ + 2025, + 0.95 + ], + [ + 2026, + 0.95 + ], + [ + 2027, + 0.95 + ], + [ + 2028, + 0.7 + ], + [ + 2029, + 0.95 + ], + [ + 2030, + 0.95 + ], + [ + 2031, + 0.95 + ], + [ + 2032, + 0.95 + ], + [ + 2033, + 0.45 + ], + [ + 2034, + 0.15 + ], + [ + 2035, + 0.15 + ], + [ + 2036, + 0.15 + ], + [ + 2037, + 0.15 + ], + [ + 2038, + 0.15 + ], + [ + 2039, + 0.15 + ], + [ + 2040, + 0.15 + ], + [ + 2041, + 0.15 + ], + [ + 2042, + 0.15 + ], + [ + 2043, + 0.15 + ], + [ + 2044, + 0.15 + ], + [ + 2045, + 0.15 + ], + [ + 2046, + 0.15 + ], + [ + 2047, + 0.15 + ], + [ + 2048, + 0.55 + ], + [ + 2049, + 0.95 + ], + [ + 2050, + 0.95 + ], + [ + 2051, + 0.95 + ], + [ + 2052, + 0.7 + ], + [ + 2053, + 0.95 + ], + [ + 2054, + 0.95 + ], + [ + 2055, + 0.95 + ], + [ + 2056, + 0.95 + ], + [ + 2057, + 0.45 + ], + [ + 2058, + 0.15 + ], + [ + 2059, + 0.15 + ], + [ + 2060, + 0.15 + ], + [ + 2061, + 0.15 + ], + [ + 2062, + 0.15 + ], + [ + 2063, + 0.15 + ], + [ + 2064, + 0.15 + ], + [ + 2065, + 0.15 + ], + [ + 2066, + 0.15 + ], + [ + 2067, + 0.15 + ], + [ + 2068, + 0.15 + ], + [ + 2069, + 0.15 + ], + [ + 2070, + 0.15 + ], + [ + 2071, + 0.15 + ], + [ + 2072, + 0.55 + ], + [ + 2073, + 0.95 + ], + [ + 2074, + 0.95 + ], + [ + 2075, + 0.95 + ], + [ + 2076, + 0.7 + ], + [ + 2077, + 0.95 + ], + [ + 2078, + 0.95 + ], + [ + 2079, + 0.95 + ], + [ + 2080, + 0.95 + ], + [ + 2081, + 0.45 + ], + [ + 2082, + 0.15 + ], + [ + 2083, + 0.15 + ], + [ + 2084, + 0.15 + ], + [ + 2085, + 0.15 + ], + [ + 2086, + 0.15 + ], + [ + 2087, + 0.15 + ], + [ + 2088, + 0.15 + ], + [ + 2089, + 0.15 + ], + [ + 2090, + 0.15 + ], + [ + 2091, + 0.15 + ], + [ + 2092, + 0.15 + ], + [ + 2093, + 0.15 + ], + [ + 2094, + 0.15 + ], + [ + 2095, + 0.15 + ], + [ + 2096, + 0.55 + ], + [ + 2097, + 0.95 + ], + [ + 2098, + 0.95 + ], + [ + 2099, + 0.95 + ], + [ + 2100, + 0.7 + ], + [ + 2101, + 0.95 + ], + [ + 2102, + 0.95 + ], + [ + 2103, + 0.95 + ], + [ + 2104, + 0.95 + ], + [ + 2105, + 0.45 + ], + [ + 2106, + 0.15 + ], + [ + 2107, + 0.15 + ], + [ + 2108, + 0.15 + ], + [ + 2109, + 0.15 + ], + [ + 2110, + 0.15 + ], + [ + 2111, + 0.15 + ], + [ + 2112, + 0.15 + ], + [ + 2113, + 0.15 + ], + [ + 2114, + 0.15 + ], + [ + 2115, + 0.15 + ], + [ + 2116, + 0.15 + ], + [ + 2117, + 0.15 + ], + [ + 2118, + 0.15 + ], + [ + 2119, + 0.15 + ], + [ + 2120, + 0.55 + ], + [ + 2121, + 0.95 + ], + [ + 2122, + 0.95 + ], + [ + 2123, + 0.95 + ], + [ + 2124, + 0.7 + ], + [ + 2125, + 0.95 + ], + [ + 2126, + 0.95 + ], + [ + 2127, + 0.95 + ], + [ + 2128, + 0.95 + ], + [ + 2129, + 0.45 + ], + [ + 2130, + 0.15 + ], + [ + 2131, + 0.15 + ], + [ + 2132, + 0.15 + ], + [ + 2133, + 0.15 + ], + [ + 2134, + 0.15 + ], + [ + 2135, + 0.15 + ], + [ + 2136, + 0.12 + ], + [ + 2137, + 0.12 + ], + [ + 2138, + 0.12 + ], + [ + 2139, + 0.12 + ], + [ + 2140, + 0.12 + ], + [ + 2141, + 0.12 + ], + [ + 2142, + 0.12 + ], + [ + 2143, + 0.12 + ], + [ + 2144, + 0.12 + ], + [ + 2145, + 0.12 + ], + [ + 2146, + 0.2 + ], + [ + 2147, + 0.2 + ], + [ + 2148, + 0.18 + ], + [ + 2149, + 0.12 + ], + [ + 2150, + 0.12 + ], + [ + 2151, + 0.12 + ], + [ + 2152, + 0.12 + ], + [ + 2153, + 0.12 + ], + [ + 2154, + 0.12 + ], + [ + 2155, + 0.12 + ], + [ + 2156, + 0.12 + ], + [ + 2157, + 0.12 + ], + [ + 2158, + 0.12 + ], + [ + 2159, + 0.12 + ], + [ + 2160, + 0.12 + ], + [ + 2161, + 0.12 + ], + [ + 2162, + 0.12 + ], + [ + 2163, + 0.12 + ], + [ + 2164, + 0.12 + ], + [ + 2165, + 0.12 + ], + [ + 2166, + 0.12 + ], + [ + 2167, + 0.12 + ], + [ + 2168, + 0.12 + ], + [ + 2169, + 0.12 + ], + [ + 2170, + 0.2 + ], + [ + 2171, + 0.2 + ], + [ + 2172, + 0.18 + ], + [ + 2173, + 0.12 + ], + [ + 2174, + 0.12 + ], + [ + 2175, + 0.12 + ], + [ + 2176, + 0.12 + ], + [ + 2177, + 0.12 + ], + [ + 2178, + 0.12 + ], + [ + 2179, + 0.12 + ], + [ + 2180, + 0.12 + ], + [ + 2181, + 0.12 + ], + [ + 2182, + 0.12 + ], + [ + 2183, + 0.12 + ], + [ + 2184, + 0.15 + ], + [ + 2185, + 0.15 + ], + [ + 2186, + 0.15 + ], + [ + 2187, + 0.15 + ], + [ + 2188, + 0.15 + ], + [ + 2189, + 0.15 + ], + [ + 2190, + 0.15 + ], + [ + 2191, + 0.15 + ], + [ + 2192, + 0.55 + ], + [ + 2193, + 0.95 + ], + [ + 2194, + 0.95 + ], + [ + 2195, + 0.95 + ], + [ + 2196, + 0.7 + ], + [ + 2197, + 0.95 + ], + [ + 2198, + 0.95 + ], + [ + 2199, + 0.95 + ], + [ + 2200, + 0.95 + ], + [ + 2201, + 0.45 + ], + [ + 2202, + 0.15 + ], + [ + 2203, + 0.15 + ], + [ + 2204, + 0.15 + ], + [ + 2205, + 0.15 + ], + [ + 2206, + 0.15 + ], + [ + 2207, + 0.15 + ], + [ + 2208, + 0.15 + ], + [ + 2209, + 0.15 + ], + [ + 2210, + 0.15 + ], + [ + 2211, + 0.15 + ], + [ + 2212, + 0.15 + ], + [ + 2213, + 0.15 + ], + [ + 2214, + 0.15 + ], + [ + 2215, + 0.15 + ], + [ + 2216, + 0.55 + ], + [ + 2217, + 0.95 + ], + [ + 2218, + 0.95 + ], + [ + 2219, + 0.95 + ], + [ + 2220, + 0.7 + ], + [ + 2221, + 0.95 + ], + [ + 2222, + 0.95 + ], + [ + 2223, + 0.95 + ], + [ + 2224, + 0.95 + ], + [ + 2225, + 0.45 + ], + [ + 2226, + 0.15 + ], + [ + 2227, + 0.15 + ], + [ + 2228, + 0.15 + ], + [ + 2229, + 0.15 + ], + [ + 2230, + 0.15 + ], + [ + 2231, + 0.15 + ], + [ + 2232, + 0.15 + ], + [ + 2233, + 0.15 + ], + [ + 2234, + 0.15 + ], + [ + 2235, + 0.15 + ], + [ + 2236, + 0.15 + ], + [ + 2237, + 0.15 + ], + [ + 2238, + 0.15 + ], + [ + 2239, + 0.15 + ], + [ + 2240, + 0.55 + ], + [ + 2241, + 0.95 + ], + [ + 2242, + 0.95 + ], + [ + 2243, + 0.95 + ], + [ + 2244, + 0.7 + ], + [ + 2245, + 0.95 + ], + [ + 2246, + 0.95 + ], + [ + 2247, + 0.95 + ], + [ + 2248, + 0.95 + ], + [ + 2249, + 0.45 + ], + [ + 2250, + 0.15 + ], + [ + 2251, + 0.15 + ], + [ + 2252, + 0.15 + ], + [ + 2253, + 0.15 + ], + [ + 2254, + 0.15 + ], + [ + 2255, + 0.15 + ], + [ + 2256, + 0.15 + ], + [ + 2257, + 0.15 + ], + [ + 2258, + 0.15 + ], + [ + 2259, + 0.15 + ], + [ + 2260, + 0.15 + ], + [ + 2261, + 0.15 + ], + [ + 2262, + 0.15 + ], + [ + 2263, + 0.15 + ], + [ + 2264, + 0.55 + ], + [ + 2265, + 0.95 + ], + [ + 2266, + 0.95 + ], + [ + 2267, + 0.95 + ], + [ + 2268, + 0.7 + ], + [ + 2269, + 0.95 + ], + [ + 2270, + 0.95 + ], + [ + 2271, + 0.95 + ], + [ + 2272, + 0.95 + ], + [ + 2273, + 0.45 + ], + [ + 2274, + 0.15 + ], + [ + 2275, + 0.15 + ], + [ + 2276, + 0.15 + ], + [ + 2277, + 0.15 + ], + [ + 2278, + 0.15 + ], + [ + 2279, + 0.15 + ], + [ + 2280, + 0.15 + ], + [ + 2281, + 0.15 + ], + [ + 2282, + 0.15 + ], + [ + 2283, + 0.15 + ], + [ + 2284, + 0.15 + ], + [ + 2285, + 0.15 + ], + [ + 2286, + 0.15 + ], + [ + 2287, + 0.15 + ], + [ + 2288, + 0.55 + ], + [ + 2289, + 0.95 + ], + [ + 2290, + 0.95 + ], + [ + 2291, + 0.95 + ], + [ + 2292, + 0.7 + ], + [ + 2293, + 0.95 + ], + [ + 2294, + 0.95 + ], + [ + 2295, + 0.95 + ], + [ + 2296, + 0.95 + ], + [ + 2297, + 0.45 + ], + [ + 2298, + 0.15 + ], + [ + 2299, + 0.15 + ], + [ + 2300, + 0.15 + ], + [ + 2301, + 0.15 + ], + [ + 2302, + 0.15 + ], + [ + 2303, + 0.15 + ], + [ + 2304, + 0.12 + ], + [ + 2305, + 0.12 + ], + [ + 2306, + 0.12 + ], + [ + 2307, + 0.12 + ], + [ + 2308, + 0.12 + ], + [ + 2309, + 0.12 + ], + [ + 2310, + 0.12 + ], + [ + 2311, + 0.12 + ], + [ + 2312, + 0.12 + ], + [ + 2313, + 0.12 + ], + [ + 2314, + 0.2 + ], + [ + 2315, + 0.2 + ], + [ + 2316, + 0.18 + ], + [ + 2317, + 0.12 + ], + [ + 2318, + 0.12 + ], + [ + 2319, + 0.12 + ], + [ + 2320, + 0.12 + ], + [ + 2321, + 0.12 + ], + [ + 2322, + 0.12 + ], + [ + 2323, + 0.12 + ], + [ + 2324, + 0.12 + ], + [ + 2325, + 0.12 + ], + [ + 2326, + 0.12 + ], + [ + 2327, + 0.12 + ], + [ + 2328, + 0.12 + ], + [ + 2329, + 0.12 + ], + [ + 2330, + 0.12 + ], + [ + 2331, + 0.12 + ], + [ + 2332, + 0.12 + ], + [ + 2333, + 0.12 + ], + [ + 2334, + 0.12 + ], + [ + 2335, + 0.12 + ], + [ + 2336, + 0.12 + ], + [ + 2337, + 0.12 + ], + [ + 2338, + 0.2 + ], + [ + 2339, + 0.2 + ], + [ + 2340, + 0.18 + ], + [ + 2341, + 0.12 + ], + [ + 2342, + 0.12 + ], + [ + 2343, + 0.12 + ], + [ + 2344, + 0.12 + ], + [ + 2345, + 0.12 + ], + [ + 2346, + 0.12 + ], + [ + 2347, + 0.12 + ], + [ + 2348, + 0.12 + ], + [ + 2349, + 0.12 + ], + [ + 2350, + 0.12 + ], + [ + 2351, + 0.12 + ], + [ + 2352, + 0.15 + ], + [ + 2353, + 0.15 + ], + [ + 2354, + 0.15 + ], + [ + 2355, + 0.15 + ], + [ + 2356, + 0.15 + ], + [ + 2357, + 0.15 + ], + [ + 2358, + 0.15 + ], + [ + 2359, + 0.15 + ], + [ + 2360, + 0.55 + ], + [ + 2361, + 0.95 + ], + [ + 2362, + 0.95 + ], + [ + 2363, + 0.95 + ], + [ + 2364, + 0.7 + ], + [ + 2365, + 0.95 + ], + [ + 2366, + 0.95 + ], + [ + 2367, + 0.95 + ], + [ + 2368, + 0.95 + ], + [ + 2369, + 0.45 + ], + [ + 2370, + 0.15 + ], + [ + 2371, + 0.15 + ], + [ + 2372, + 0.15 + ], + [ + 2373, + 0.15 + ], + [ + 2374, + 0.15 + ], + [ + 2375, + 0.15 + ], + [ + 2376, + 0.15 + ], + [ + 2377, + 0.15 + ], + [ + 2378, + 0.15 + ], + [ + 2379, + 0.15 + ], + [ + 2380, + 0.15 + ], + [ + 2381, + 0.15 + ], + [ + 2382, + 0.15 + ], + [ + 2383, + 0.15 + ], + [ + 2384, + 0.55 + ], + [ + 2385, + 0.95 + ], + [ + 2386, + 0.95 + ], + [ + 2387, + 0.95 + ], + [ + 2388, + 0.7 + ], + [ + 2389, + 0.95 + ], + [ + 2390, + 0.95 + ], + [ + 2391, + 0.95 + ], + [ + 2392, + 0.95 + ], + [ + 2393, + 0.45 + ], + [ + 2394, + 0.15 + ], + [ + 2395, + 0.15 + ], + [ + 2396, + 0.15 + ], + [ + 2397, + 0.15 + ], + [ + 2398, + 0.15 + ], + [ + 2399, + 0.15 + ], + [ + 2400, + 0.15 + ], + [ + 2401, + 0.15 + ], + [ + 2402, + 0.15 + ], + [ + 2403, + 0.15 + ], + [ + 2404, + 0.15 + ], + [ + 2405, + 0.15 + ], + [ + 2406, + 0.15 + ], + [ + 2407, + 0.15 + ], + [ + 2408, + 0.55 + ], + [ + 2409, + 0.95 + ], + [ + 2410, + 0.95 + ], + [ + 2411, + 0.95 + ], + [ + 2412, + 0.7 + ], + [ + 2413, + 0.95 + ], + [ + 2414, + 0.95 + ], + [ + 2415, + 0.95 + ], + [ + 2416, + 0.95 + ], + [ + 2417, + 0.45 + ], + [ + 2418, + 0.15 + ], + [ + 2419, + 0.15 + ], + [ + 2420, + 0.15 + ], + [ + 2421, + 0.15 + ], + [ + 2422, + 0.15 + ], + [ + 2423, + 0.15 + ], + [ + 2424, + 0.15 + ], + [ + 2425, + 0.15 + ], + [ + 2426, + 0.15 + ], + [ + 2427, + 0.15 + ], + [ + 2428, + 0.15 + ], + [ + 2429, + 0.15 + ], + [ + 2430, + 0.15 + ], + [ + 2431, + 0.15 + ], + [ + 2432, + 0.55 + ], + [ + 2433, + 0.95 + ], + [ + 2434, + 0.95 + ], + [ + 2435, + 0.95 + ], + [ + 2436, + 0.7 + ], + [ + 2437, + 0.95 + ], + [ + 2438, + 0.95 + ], + [ + 2439, + 0.95 + ], + [ + 2440, + 0.95 + ], + [ + 2441, + 0.45 + ], + [ + 2442, + 0.15 + ], + [ + 2443, + 0.15 + ], + [ + 2444, + 0.15 + ], + [ + 2445, + 0.15 + ], + [ + 2446, + 0.15 + ], + [ + 2447, + 0.15 + ], + [ + 2448, + 0.15 + ], + [ + 2449, + 0.15 + ], + [ + 2450, + 0.15 + ], + [ + 2451, + 0.15 + ], + [ + 2452, + 0.15 + ], + [ + 2453, + 0.15 + ], + [ + 2454, + 0.15 + ], + [ + 2455, + 0.15 + ], + [ + 2456, + 0.55 + ], + [ + 2457, + 0.95 + ], + [ + 2458, + 0.95 + ], + [ + 2459, + 0.95 + ], + [ + 2460, + 0.7 + ], + [ + 2461, + 0.95 + ], + [ + 2462, + 0.95 + ], + [ + 2463, + 0.95 + ], + [ + 2464, + 0.95 + ], + [ + 2465, + 0.45 + ], + [ + 2466, + 0.15 + ], + [ + 2467, + 0.15 + ], + [ + 2468, + 0.15 + ], + [ + 2469, + 0.15 + ], + [ + 2470, + 0.15 + ], + [ + 2471, + 0.15 + ], + [ + 2472, + 0.12 + ], + [ + 2473, + 0.12 + ], + [ + 2474, + 0.12 + ], + [ + 2475, + 0.12 + ], + [ + 2476, + 0.12 + ], + [ + 2477, + 0.12 + ], + [ + 2478, + 0.12 + ], + [ + 2479, + 0.12 + ], + [ + 2480, + 0.12 + ], + [ + 2481, + 0.12 + ], + [ + 2482, + 0.2 + ], + [ + 2483, + 0.2 + ], + [ + 2484, + 0.18 + ], + [ + 2485, + 0.12 + ], + [ + 2486, + 0.12 + ], + [ + 2487, + 0.12 + ], + [ + 2488, + 0.12 + ], + [ + 2489, + 0.12 + ], + [ + 2490, + 0.12 + ], + [ + 2491, + 0.12 + ], + [ + 2492, + 0.12 + ], + [ + 2493, + 0.12 + ], + [ + 2494, + 0.12 + ], + [ + 2495, + 0.12 + ], + [ + 2496, + 0.12 + ], + [ + 2497, + 0.12 + ], + [ + 2498, + 0.12 + ], + [ + 2499, + 0.12 + ], + [ + 2500, + 0.12 + ], + [ + 2501, + 0.12 + ], + [ + 2502, + 0.12 + ], + [ + 2503, + 0.12 + ], + [ + 2504, + 0.12 + ], + [ + 2505, + 0.12 + ], + [ + 2506, + 0.2 + ], + [ + 2507, + 0.2 + ], + [ + 2508, + 0.18 + ], + [ + 2509, + 0.12 + ], + [ + 2510, + 0.12 + ], + [ + 2511, + 0.12 + ], + [ + 2512, + 0.12 + ], + [ + 2513, + 0.12 + ], + [ + 2514, + 0.12 + ], + [ + 2515, + 0.12 + ], + [ + 2516, + 0.12 + ], + [ + 2517, + 0.12 + ], + [ + 2518, + 0.12 + ], + [ + 2519, + 0.12 + ], + [ + 2520, + 0.15 + ], + [ + 2521, + 0.15 + ], + [ + 2522, + 0.15 + ], + [ + 2523, + 0.15 + ], + [ + 2524, + 0.15 + ], + [ + 2525, + 0.15 + ], + [ + 2526, + 0.15 + ], + [ + 2527, + 0.15 + ], + [ + 2528, + 0.55 + ], + [ + 2529, + 0.95 + ], + [ + 2530, + 0.95 + ], + [ + 2531, + 0.95 + ], + [ + 2532, + 0.7 + ], + [ + 2533, + 0.95 + ], + [ + 2534, + 0.95 + ], + [ + 2535, + 0.95 + ], + [ + 2536, + 0.95 + ], + [ + 2537, + 0.45 + ], + [ + 2538, + 0.15 + ], + [ + 2539, + 0.15 + ], + [ + 2540, + 0.15 + ], + [ + 2541, + 0.15 + ], + [ + 2542, + 0.15 + ], + [ + 2543, + 0.15 + ], + [ + 2544, + 0.15 + ], + [ + 2545, + 0.15 + ], + [ + 2546, + 0.15 + ], + [ + 2547, + 0.15 + ], + [ + 2548, + 0.15 + ], + [ + 2549, + 0.15 + ], + [ + 2550, + 0.15 + ], + [ + 2551, + 0.15 + ], + [ + 2552, + 0.55 + ], + [ + 2553, + 0.95 + ], + [ + 2554, + 0.95 + ], + [ + 2555, + 0.95 + ], + [ + 2556, + 0.7 + ], + [ + 2557, + 0.95 + ], + [ + 2558, + 0.95 + ], + [ + 2559, + 0.95 + ], + [ + 2560, + 0.95 + ], + [ + 2561, + 0.45 + ], + [ + 2562, + 0.15 + ], + [ + 2563, + 0.15 + ], + [ + 2564, + 0.15 + ], + [ + 2565, + 0.15 + ], + [ + 2566, + 0.15 + ], + [ + 2567, + 0.15 + ], + [ + 2568, + 0.15 + ], + [ + 2569, + 0.15 + ], + [ + 2570, + 0.15 + ], + [ + 2571, + 0.15 + ], + [ + 2572, + 0.15 + ], + [ + 2573, + 0.15 + ], + [ + 2574, + 0.15 + ], + [ + 2575, + 0.15 + ], + [ + 2576, + 0.55 + ], + [ + 2577, + 0.95 + ], + [ + 2578, + 0.95 + ], + [ + 2579, + 0.95 + ], + [ + 2580, + 0.7 + ], + [ + 2581, + 0.95 + ], + [ + 2582, + 0.95 + ], + [ + 2583, + 0.95 + ], + [ + 2584, + 0.95 + ], + [ + 2585, + 0.45 + ], + [ + 2586, + 0.15 + ], + [ + 2587, + 0.15 + ], + [ + 2588, + 0.15 + ], + [ + 2589, + 0.15 + ], + [ + 2590, + 0.15 + ], + [ + 2591, + 0.15 + ], + [ + 2592, + 0.15 + ], + [ + 2593, + 0.15 + ], + [ + 2594, + 0.15 + ], + [ + 2595, + 0.15 + ], + [ + 2596, + 0.15 + ], + [ + 2597, + 0.15 + ], + [ + 2598, + 0.15 + ], + [ + 2599, + 0.15 + ], + [ + 2600, + 0.55 + ], + [ + 2601, + 0.95 + ], + [ + 2602, + 0.95 + ], + [ + 2603, + 0.95 + ], + [ + 2604, + 0.7 + ], + [ + 2605, + 0.95 + ], + [ + 2606, + 0.95 + ], + [ + 2607, + 0.95 + ], + [ + 2608, + 0.95 + ], + [ + 2609, + 0.45 + ], + [ + 2610, + 0.15 + ], + [ + 2611, + 0.15 + ], + [ + 2612, + 0.15 + ], + [ + 2613, + 0.15 + ], + [ + 2614, + 0.15 + ], + [ + 2615, + 0.15 + ], + [ + 2616, + 0.15 + ], + [ + 2617, + 0.15 + ], + [ + 2618, + 0.15 + ], + [ + 2619, + 0.15 + ], + [ + 2620, + 0.15 + ], + [ + 2621, + 0.15 + ], + [ + 2622, + 0.15 + ], + [ + 2623, + 0.15 + ], + [ + 2624, + 0.55 + ], + [ + 2625, + 0.95 + ], + [ + 2626, + 0.95 + ], + [ + 2627, + 0.95 + ], + [ + 2628, + 0.7 + ], + [ + 2629, + 0.95 + ], + [ + 2630, + 0.95 + ], + [ + 2631, + 0.95 + ], + [ + 2632, + 0.95 + ], + [ + 2633, + 0.45 + ], + [ + 2634, + 0.15 + ], + [ + 2635, + 0.15 + ], + [ + 2636, + 0.15 + ], + [ + 2637, + 0.15 + ], + [ + 2638, + 0.15 + ], + [ + 2639, + 0.15 + ], + [ + 2640, + 0.12 + ], + [ + 2641, + 0.12 + ], + [ + 2642, + 0.12 + ], + [ + 2643, + 0.12 + ], + [ + 2644, + 0.12 + ], + [ + 2645, + 0.12 + ], + [ + 2646, + 0.12 + ], + [ + 2647, + 0.12 + ], + [ + 2648, + 0.12 + ], + [ + 2649, + 0.12 + ], + [ + 2650, + 0.2 + ], + [ + 2651, + 0.2 + ], + [ + 2652, + 0.18 + ], + [ + 2653, + 0.12 + ], + [ + 2654, + 0.12 + ], + [ + 2655, + 0.12 + ], + [ + 2656, + 0.12 + ], + [ + 2657, + 0.12 + ], + [ + 2658, + 0.12 + ], + [ + 2659, + 0.12 + ], + [ + 2660, + 0.12 + ], + [ + 2661, + 0.12 + ], + [ + 2662, + 0.12 + ], + [ + 2663, + 0.12 + ], + [ + 2664, + 0.12 + ], + [ + 2665, + 0.12 + ], + [ + 2666, + 0.12 + ], + [ + 2667, + 0.12 + ], + [ + 2668, + 0.12 + ], + [ + 2669, + 0.12 + ], + [ + 2670, + 0.12 + ], + [ + 2671, + 0.12 + ], + [ + 2672, + 0.12 + ], + [ + 2673, + 0.12 + ], + [ + 2674, + 0.2 + ], + [ + 2675, + 0.2 + ], + [ + 2676, + 0.18 + ], + [ + 2677, + 0.12 + ], + [ + 2678, + 0.12 + ], + [ + 2679, + 0.12 + ], + [ + 2680, + 0.12 + ], + [ + 2681, + 0.12 + ], + [ + 2682, + 0.12 + ], + [ + 2683, + 0.12 + ], + [ + 2684, + 0.12 + ], + [ + 2685, + 0.12 + ], + [ + 2686, + 0.12 + ], + [ + 2687, + 0.12 + ], + [ + 2688, + 0.15 + ], + [ + 2689, + 0.15 + ], + [ + 2690, + 0.15 + ], + [ + 2691, + 0.15 + ], + [ + 2692, + 0.15 + ], + [ + 2693, + 0.15 + ], + [ + 2694, + 0.15 + ], + [ + 2695, + 0.15 + ], + [ + 2696, + 0.55 + ], + [ + 2697, + 0.95 + ], + [ + 2698, + 0.95 + ], + [ + 2699, + 0.95 + ], + [ + 2700, + 0.7 + ], + [ + 2701, + 0.95 + ], + [ + 2702, + 0.95 + ], + [ + 2703, + 0.95 + ], + [ + 2704, + 0.95 + ], + [ + 2705, + 0.45 + ], + [ + 2706, + 0.15 + ], + [ + 2707, + 0.15 + ], + [ + 2708, + 0.15 + ], + [ + 2709, + 0.15 + ], + [ + 2710, + 0.15 + ], + [ + 2711, + 0.15 + ], + [ + 2712, + 0.15 + ], + [ + 2713, + 0.15 + ], + [ + 2714, + 0.15 + ], + [ + 2715, + 0.15 + ], + [ + 2716, + 0.15 + ], + [ + 2717, + 0.15 + ], + [ + 2718, + 0.15 + ], + [ + 2719, + 0.15 + ], + [ + 2720, + 0.55 + ], + [ + 2721, + 0.95 + ], + [ + 2722, + 0.95 + ], + [ + 2723, + 0.95 + ], + [ + 2724, + 0.7 + ], + [ + 2725, + 0.95 + ], + [ + 2726, + 0.95 + ], + [ + 2727, + 0.95 + ], + [ + 2728, + 0.95 + ], + [ + 2729, + 0.45 + ], + [ + 2730, + 0.15 + ], + [ + 2731, + 0.15 + ], + [ + 2732, + 0.15 + ], + [ + 2733, + 0.15 + ], + [ + 2734, + 0.15 + ], + [ + 2735, + 0.15 + ], + [ + 2736, + 0.15 + ], + [ + 2737, + 0.15 + ], + [ + 2738, + 0.15 + ], + [ + 2739, + 0.15 + ], + [ + 2740, + 0.15 + ], + [ + 2741, + 0.15 + ], + [ + 2742, + 0.15 + ], + [ + 2743, + 0.15 + ], + [ + 2744, + 0.55 + ], + [ + 2745, + 0.95 + ], + [ + 2746, + 0.95 + ], + [ + 2747, + 0.95 + ], + [ + 2748, + 0.7 + ], + [ + 2749, + 0.95 + ], + [ + 2750, + 0.95 + ], + [ + 2751, + 0.95 + ], + [ + 2752, + 0.95 + ], + [ + 2753, + 0.45 + ], + [ + 2754, + 0.15 + ], + [ + 2755, + 0.15 + ], + [ + 2756, + 0.15 + ], + [ + 2757, + 0.15 + ], + [ + 2758, + 0.15 + ], + [ + 2759, + 0.15 + ], + [ + 2760, + 0.15 + ], + [ + 2761, + 0.15 + ], + [ + 2762, + 0.15 + ], + [ + 2763, + 0.15 + ], + [ + 2764, + 0.15 + ], + [ + 2765, + 0.15 + ], + [ + 2766, + 0.15 + ], + [ + 2767, + 0.15 + ], + [ + 2768, + 0.55 + ], + [ + 2769, + 0.95 + ], + [ + 2770, + 0.95 + ], + [ + 2771, + 0.95 + ], + [ + 2772, + 0.7 + ], + [ + 2773, + 0.95 + ], + [ + 2774, + 0.95 + ], + [ + 2775, + 0.95 + ], + [ + 2776, + 0.95 + ], + [ + 2777, + 0.45 + ], + [ + 2778, + 0.15 + ], + [ + 2779, + 0.15 + ], + [ + 2780, + 0.15 + ], + [ + 2781, + 0.15 + ], + [ + 2782, + 0.15 + ], + [ + 2783, + 0.15 + ], + [ + 2784, + 0.15 + ], + [ + 2785, + 0.15 + ], + [ + 2786, + 0.15 + ], + [ + 2787, + 0.15 + ], + [ + 2788, + 0.15 + ], + [ + 2789, + 0.15 + ], + [ + 2790, + 0.15 + ], + [ + 2791, + 0.15 + ], + [ + 2792, + 0.55 + ], + [ + 2793, + 0.95 + ], + [ + 2794, + 0.95 + ], + [ + 2795, + 0.95 + ], + [ + 2796, + 0.7 + ], + [ + 2797, + 0.95 + ], + [ + 2798, + 0.95 + ], + [ + 2799, + 0.95 + ], + [ + 2800, + 0.95 + ], + [ + 2801, + 0.45 + ], + [ + 2802, + 0.15 + ], + [ + 2803, + 0.15 + ], + [ + 2804, + 0.15 + ], + [ + 2805, + 0.15 + ], + [ + 2806, + 0.15 + ], + [ + 2807, + 0.15 + ], + [ + 2808, + 0.12 + ], + [ + 2809, + 0.12 + ], + [ + 2810, + 0.12 + ], + [ + 2811, + 0.12 + ], + [ + 2812, + 0.12 + ], + [ + 2813, + 0.12 + ], + [ + 2814, + 0.12 + ], + [ + 2815, + 0.12 + ], + [ + 2816, + 0.12 + ], + [ + 2817, + 0.12 + ], + [ + 2818, + 0.2 + ], + [ + 2819, + 0.2 + ], + [ + 2820, + 0.18 + ], + [ + 2821, + 0.12 + ], + [ + 2822, + 0.12 + ], + [ + 2823, + 0.12 + ], + [ + 2824, + 0.12 + ], + [ + 2825, + 0.12 + ], + [ + 2826, + 0.12 + ], + [ + 2827, + 0.12 + ], + [ + 2828, + 0.12 + ], + [ + 2829, + 0.12 + ], + [ + 2830, + 0.12 + ], + [ + 2831, + 0.12 + ], + [ + 2832, + 0.12 + ], + [ + 2833, + 0.12 + ], + [ + 2834, + 0.12 + ], + [ + 2835, + 0.12 + ], + [ + 2836, + 0.12 + ], + [ + 2837, + 0.12 + ], + [ + 2838, + 0.12 + ], + [ + 2839, + 0.12 + ], + [ + 2840, + 0.12 + ], + [ + 2841, + 0.12 + ], + [ + 2842, + 0.2 + ], + [ + 2843, + 0.2 + ], + [ + 2844, + 0.18 + ], + [ + 2845, + 0.12 + ], + [ + 2846, + 0.12 + ], + [ + 2847, + 0.12 + ], + [ + 2848, + 0.12 + ], + [ + 2849, + 0.12 + ], + [ + 2850, + 0.12 + ], + [ + 2851, + 0.12 + ], + [ + 2852, + 0.12 + ], + [ + 2853, + 0.12 + ], + [ + 2854, + 0.12 + ], + [ + 2855, + 0.12 + ], + [ + 2856, + 0.15 + ], + [ + 2857, + 0.15 + ], + [ + 2858, + 0.15 + ], + [ + 2859, + 0.15 + ], + [ + 2860, + 0.15 + ], + [ + 2861, + 0.15 + ], + [ + 2862, + 0.15 + ], + [ + 2863, + 0.15 + ], + [ + 2864, + 0.55 + ], + [ + 2865, + 0.95 + ], + [ + 2866, + 0.95 + ], + [ + 2867, + 0.95 + ], + [ + 2868, + 0.7 + ], + [ + 2869, + 0.95 + ], + [ + 2870, + 0.95 + ], + [ + 2871, + 0.95 + ], + [ + 2872, + 0.95 + ], + [ + 2873, + 0.45 + ], + [ + 2874, + 0.15 + ], + [ + 2875, + 0.15 + ], + [ + 2876, + 0.15 + ], + [ + 2877, + 0.15 + ], + [ + 2878, + 0.15 + ], + [ + 2879, + 0.15 + ], + [ + 2880, + 0.15 + ], + [ + 2881, + 0.15 + ], + [ + 2882, + 0.15 + ], + [ + 2883, + 0.15 + ], + [ + 2884, + 0.15 + ], + [ + 2885, + 0.15 + ], + [ + 2886, + 0.15 + ], + [ + 2887, + 0.15 + ], + [ + 2888, + 0.55 + ], + [ + 2889, + 0.95 + ], + [ + 2890, + 0.95 + ], + [ + 2891, + 0.95 + ], + [ + 2892, + 0.7 + ], + [ + 2893, + 0.95 + ], + [ + 2894, + 0.95 + ], + [ + 2895, + 0.95 + ], + [ + 2896, + 0.95 + ], + [ + 2897, + 0.45 + ], + [ + 2898, + 0.15 + ], + [ + 2899, + 0.15 + ], + [ + 2900, + 0.15 + ], + [ + 2901, + 0.15 + ], + [ + 2902, + 0.15 + ], + [ + 2903, + 0.15 + ], + [ + 2904, + 0.15 + ], + [ + 2905, + 0.15 + ], + [ + 2906, + 0.15 + ], + [ + 2907, + 0.15 + ], + [ + 2908, + 0.15 + ], + [ + 2909, + 0.15 + ], + [ + 2910, + 0.15 + ], + [ + 2911, + 0.15 + ], + [ + 2912, + 0.55 + ], + [ + 2913, + 0.95 + ], + [ + 2914, + 0.95 + ], + [ + 2915, + 0.95 + ], + [ + 2916, + 0.7 + ], + [ + 2917, + 0.95 + ], + [ + 2918, + 0.95 + ], + [ + 2919, + 0.95 + ], + [ + 2920, + 0.95 + ], + [ + 2921, + 0.45 + ], + [ + 2922, + 0.15 + ], + [ + 2923, + 0.15 + ], + [ + 2924, + 0.15 + ], + [ + 2925, + 0.15 + ], + [ + 2926, + 0.15 + ], + [ + 2927, + 0.15 + ], + [ + 2928, + 0.15 + ], + [ + 2929, + 0.15 + ], + [ + 2930, + 0.15 + ], + [ + 2931, + 0.15 + ], + [ + 2932, + 0.15 + ], + [ + 2933, + 0.15 + ], + [ + 2934, + 0.15 + ], + [ + 2935, + 0.15 + ], + [ + 2936, + 0.55 + ], + [ + 2937, + 0.95 + ], + [ + 2938, + 0.95 + ], + [ + 2939, + 0.95 + ], + [ + 2940, + 0.7 + ], + [ + 2941, + 0.95 + ], + [ + 2942, + 0.95 + ], + [ + 2943, + 0.95 + ], + [ + 2944, + 0.95 + ], + [ + 2945, + 0.45 + ], + [ + 2946, + 0.15 + ], + [ + 2947, + 0.15 + ], + [ + 2948, + 0.15 + ], + [ + 2949, + 0.15 + ], + [ + 2950, + 0.15 + ], + [ + 2951, + 0.15 + ], + [ + 2952, + 0.15 + ], + [ + 2953, + 0.15 + ], + [ + 2954, + 0.15 + ], + [ + 2955, + 0.15 + ], + [ + 2956, + 0.15 + ], + [ + 2957, + 0.15 + ], + [ + 2958, + 0.15 + ], + [ + 2959, + 0.15 + ], + [ + 2960, + 0.55 + ], + [ + 2961, + 0.95 + ], + [ + 2962, + 0.95 + ], + [ + 2963, + 0.95 + ], + [ + 2964, + 0.7 + ], + [ + 2965, + 0.95 + ], + [ + 2966, + 0.95 + ], + [ + 2967, + 0.95 + ], + [ + 2968, + 0.95 + ], + [ + 2969, + 0.45 + ], + [ + 2970, + 0.15 + ], + [ + 2971, + 0.15 + ], + [ + 2972, + 0.15 + ], + [ + 2973, + 0.15 + ], + [ + 2974, + 0.15 + ], + [ + 2975, + 0.15 + ], + [ + 2976, + 0.12 + ], + [ + 2977, + 0.12 + ], + [ + 2978, + 0.12 + ], + [ + 2979, + 0.12 + ], + [ + 2980, + 0.12 + ], + [ + 2981, + 0.12 + ], + [ + 2982, + 0.12 + ], + [ + 2983, + 0.12 + ], + [ + 2984, + 0.12 + ], + [ + 2985, + 0.12 + ], + [ + 2986, + 0.2 + ], + [ + 2987, + 0.2 + ], + [ + 2988, + 0.18 + ], + [ + 2989, + 0.12 + ], + [ + 2990, + 0.12 + ], + [ + 2991, + 0.12 + ], + [ + 2992, + 0.12 + ], + [ + 2993, + 0.12 + ], + [ + 2994, + 0.12 + ], + [ + 2995, + 0.12 + ], + [ + 2996, + 0.12 + ], + [ + 2997, + 0.12 + ], + [ + 2998, + 0.12 + ], + [ + 2999, + 0.12 + ], + [ + 3000, + 0.12 + ], + [ + 3001, + 0.12 + ], + [ + 3002, + 0.12 + ], + [ + 3003, + 0.12 + ], + [ + 3004, + 0.12 + ], + [ + 3005, + 0.12 + ], + [ + 3006, + 0.12 + ], + [ + 3007, + 0.12 + ], + [ + 3008, + 0.12 + ], + [ + 3009, + 0.12 + ], + [ + 3010, + 0.2 + ], + [ + 3011, + 0.2 + ], + [ + 3012, + 0.18 + ], + [ + 3013, + 0.12 + ], + [ + 3014, + 0.12 + ], + [ + 3015, + 0.12 + ], + [ + 3016, + 0.12 + ], + [ + 3017, + 0.12 + ], + [ + 3018, + 0.12 + ], + [ + 3019, + 0.12 + ], + [ + 3020, + 0.12 + ], + [ + 3021, + 0.12 + ], + [ + 3022, + 0.12 + ], + [ + 3023, + 0.12 + ], + [ + 3024, + 0.15 + ], + [ + 3025, + 0.15 + ], + [ + 3026, + 0.15 + ], + [ + 3027, + 0.15 + ], + [ + 3028, + 0.15 + ], + [ + 3029, + 0.15 + ], + [ + 3030, + 0.15 + ], + [ + 3031, + 0.15 + ], + [ + 3032, + 0.55 + ], + [ + 3033, + 0.95 + ], + [ + 3034, + 0.95 + ], + [ + 3035, + 0.95 + ], + [ + 3036, + 0.7 + ], + [ + 3037, + 0.95 + ], + [ + 3038, + 0.95 + ], + [ + 3039, + 0.95 + ], + [ + 3040, + 0.95 + ], + [ + 3041, + 0.45 + ], + [ + 3042, + 0.15 + ], + [ + 3043, + 0.15 + ], + [ + 3044, + 0.15 + ], + [ + 3045, + 0.15 + ], + [ + 3046, + 0.15 + ], + [ + 3047, + 0.15 + ], + [ + 3048, + 0.15 + ], + [ + 3049, + 0.15 + ], + [ + 3050, + 0.15 + ], + [ + 3051, + 0.15 + ], + [ + 3052, + 0.15 + ], + [ + 3053, + 0.15 + ], + [ + 3054, + 0.15 + ], + [ + 3055, + 0.15 + ], + [ + 3056, + 0.55 + ], + [ + 3057, + 0.95 + ], + [ + 3058, + 0.95 + ], + [ + 3059, + 0.95 + ], + [ + 3060, + 0.7 + ], + [ + 3061, + 0.95 + ], + [ + 3062, + 0.95 + ], + [ + 3063, + 0.95 + ], + [ + 3064, + 0.95 + ], + [ + 3065, + 0.45 + ], + [ + 3066, + 0.15 + ], + [ + 3067, + 0.15 + ], + [ + 3068, + 0.15 + ], + [ + 3069, + 0.15 + ], + [ + 3070, + 0.15 + ], + [ + 3071, + 0.15 + ], + [ + 3072, + 0.15 + ], + [ + 3073, + 0.15 + ], + [ + 3074, + 0.15 + ], + [ + 3075, + 0.15 + ], + [ + 3076, + 0.15 + ], + [ + 3077, + 0.15 + ], + [ + 3078, + 0.15 + ], + [ + 3079, + 0.15 + ], + [ + 3080, + 0.55 + ], + [ + 3081, + 0.95 + ], + [ + 3082, + 0.95 + ], + [ + 3083, + 0.95 + ], + [ + 3084, + 0.7 + ], + [ + 3085, + 0.95 + ], + [ + 3086, + 0.95 + ], + [ + 3087, + 0.95 + ], + [ + 3088, + 0.95 + ], + [ + 3089, + 0.45 + ], + [ + 3090, + 0.15 + ], + [ + 3091, + 0.15 + ], + [ + 3092, + 0.15 + ], + [ + 3093, + 0.15 + ], + [ + 3094, + 0.15 + ], + [ + 3095, + 0.15 + ], + [ + 3096, + 0.15 + ], + [ + 3097, + 0.15 + ], + [ + 3098, + 0.15 + ], + [ + 3099, + 0.15 + ], + [ + 3100, + 0.15 + ], + [ + 3101, + 0.15 + ], + [ + 3102, + 0.15 + ], + [ + 3103, + 0.15 + ], + [ + 3104, + 0.55 + ], + [ + 3105, + 0.95 + ], + [ + 3106, + 0.95 + ], + [ + 3107, + 0.95 + ], + [ + 3108, + 0.7 + ], + [ + 3109, + 0.95 + ], + [ + 3110, + 0.95 + ], + [ + 3111, + 0.95 + ], + [ + 3112, + 0.95 + ], + [ + 3113, + 0.45 + ], + [ + 3114, + 0.15 + ], + [ + 3115, + 0.15 + ], + [ + 3116, + 0.15 + ], + [ + 3117, + 0.15 + ], + [ + 3118, + 0.15 + ], + [ + 3119, + 0.15 + ], + [ + 3120, + 0.15 + ], + [ + 3121, + 0.15 + ], + [ + 3122, + 0.15 + ], + [ + 3123, + 0.15 + ], + [ + 3124, + 0.15 + ], + [ + 3125, + 0.15 + ], + [ + 3126, + 0.15 + ], + [ + 3127, + 0.15 + ], + [ + 3128, + 0.55 + ], + [ + 3129, + 0.95 + ], + [ + 3130, + 0.95 + ], + [ + 3131, + 0.95 + ], + [ + 3132, + 0.7 + ], + [ + 3133, + 0.95 + ], + [ + 3134, + 0.95 + ], + [ + 3135, + 0.95 + ], + [ + 3136, + 0.95 + ], + [ + 3137, + 0.45 + ], + [ + 3138, + 0.15 + ], + [ + 3139, + 0.15 + ], + [ + 3140, + 0.15 + ], + [ + 3141, + 0.15 + ], + [ + 3142, + 0.15 + ], + [ + 3143, + 0.15 + ], + [ + 3144, + 0.12 + ], + [ + 3145, + 0.12 + ], + [ + 3146, + 0.12 + ], + [ + 3147, + 0.12 + ], + [ + 3148, + 0.12 + ], + [ + 3149, + 0.12 + ], + [ + 3150, + 0.12 + ], + [ + 3151, + 0.12 + ], + [ + 3152, + 0.12 + ], + [ + 3153, + 0.12 + ], + [ + 3154, + 0.2 + ], + [ + 3155, + 0.2 + ], + [ + 3156, + 0.18 + ], + [ + 3157, + 0.12 + ], + [ + 3158, + 0.12 + ], + [ + 3159, + 0.12 + ], + [ + 3160, + 0.12 + ], + [ + 3161, + 0.12 + ], + [ + 3162, + 0.12 + ], + [ + 3163, + 0.12 + ], + [ + 3164, + 0.12 + ], + [ + 3165, + 0.12 + ], + [ + 3166, + 0.12 + ], + [ + 3167, + 0.12 + ], + [ + 3168, + 0.12 + ], + [ + 3169, + 0.12 + ], + [ + 3170, + 0.12 + ], + [ + 3171, + 0.12 + ], + [ + 3172, + 0.12 + ], + [ + 3173, + 0.12 + ], + [ + 3174, + 0.12 + ], + [ + 3175, + 0.12 + ], + [ + 3176, + 0.12 + ], + [ + 3177, + 0.12 + ], + [ + 3178, + 0.2 + ], + [ + 3179, + 0.2 + ], + [ + 3180, + 0.18 + ], + [ + 3181, + 0.12 + ], + [ + 3182, + 0.12 + ], + [ + 3183, + 0.12 + ], + [ + 3184, + 0.12 + ], + [ + 3185, + 0.12 + ], + [ + 3186, + 0.12 + ], + [ + 3187, + 0.12 + ], + [ + 3188, + 0.12 + ], + [ + 3189, + 0.12 + ], + [ + 3190, + 0.12 + ], + [ + 3191, + 0.12 + ], + [ + 3192, + 0.15 + ], + [ + 3193, + 0.15 + ], + [ + 3194, + 0.15 + ], + [ + 3195, + 0.15 + ], + [ + 3196, + 0.15 + ], + [ + 3197, + 0.15 + ], + [ + 3198, + 0.15 + ], + [ + 3199, + 0.15 + ], + [ + 3200, + 0.55 + ], + [ + 3201, + 0.95 + ], + [ + 3202, + 0.95 + ], + [ + 3203, + 0.95 + ], + [ + 3204, + 0.7 + ], + [ + 3205, + 0.95 + ], + [ + 3206, + 0.95 + ], + [ + 3207, + 0.95 + ], + [ + 3208, + 0.95 + ], + [ + 3209, + 0.45 + ], + [ + 3210, + 0.15 + ], + [ + 3211, + 0.15 + ], + [ + 3212, + 0.15 + ], + [ + 3213, + 0.15 + ], + [ + 3214, + 0.15 + ], + [ + 3215, + 0.15 + ], + [ + 3216, + 0.15 + ], + [ + 3217, + 0.15 + ], + [ + 3218, + 0.15 + ], + [ + 3219, + 0.15 + ], + [ + 3220, + 0.15 + ], + [ + 3221, + 0.15 + ], + [ + 3222, + 0.15 + ], + [ + 3223, + 0.15 + ], + [ + 3224, + 0.55 + ], + [ + 3225, + 0.95 + ], + [ + 3226, + 0.95 + ], + [ + 3227, + 0.95 + ], + [ + 3228, + 0.7 + ], + [ + 3229, + 0.95 + ], + [ + 3230, + 0.95 + ], + [ + 3231, + 0.95 + ], + [ + 3232, + 0.95 + ], + [ + 3233, + 0.45 + ], + [ + 3234, + 0.15 + ], + [ + 3235, + 0.15 + ], + [ + 3236, + 0.15 + ], + [ + 3237, + 0.15 + ], + [ + 3238, + 0.15 + ], + [ + 3239, + 0.15 + ], + [ + 3240, + 0.15 + ], + [ + 3241, + 0.15 + ], + [ + 3242, + 0.15 + ], + [ + 3243, + 0.15 + ], + [ + 3244, + 0.15 + ], + [ + 3245, + 0.15 + ], + [ + 3246, + 0.15 + ], + [ + 3247, + 0.15 + ], + [ + 3248, + 0.55 + ], + [ + 3249, + 0.95 + ], + [ + 3250, + 0.95 + ], + [ + 3251, + 0.95 + ], + [ + 3252, + 0.7 + ], + [ + 3253, + 0.95 + ], + [ + 3254, + 0.95 + ], + [ + 3255, + 0.95 + ], + [ + 3256, + 0.95 + ], + [ + 3257, + 0.45 + ], + [ + 3258, + 0.15 + ], + [ + 3259, + 0.15 + ], + [ + 3260, + 0.15 + ], + [ + 3261, + 0.15 + ], + [ + 3262, + 0.15 + ], + [ + 3263, + 0.15 + ], + [ + 3264, + 0.15 + ], + [ + 3265, + 0.15 + ], + [ + 3266, + 0.15 + ], + [ + 3267, + 0.15 + ], + [ + 3268, + 0.15 + ], + [ + 3269, + 0.15 + ], + [ + 3270, + 0.15 + ], + [ + 3271, + 0.15 + ], + [ + 3272, + 0.55 + ], + [ + 3273, + 0.95 + ], + [ + 3274, + 0.95 + ], + [ + 3275, + 0.95 + ], + [ + 3276, + 0.7 + ], + [ + 3277, + 0.95 + ], + [ + 3278, + 0.95 + ], + [ + 3279, + 0.95 + ], + [ + 3280, + 0.95 + ], + [ + 3281, + 0.45 + ], + [ + 3282, + 0.15 + ], + [ + 3283, + 0.15 + ], + [ + 3284, + 0.15 + ], + [ + 3285, + 0.15 + ], + [ + 3286, + 0.15 + ], + [ + 3287, + 0.15 + ], + [ + 3288, + 0.15 + ], + [ + 3289, + 0.15 + ], + [ + 3290, + 0.15 + ], + [ + 3291, + 0.15 + ], + [ + 3292, + 0.15 + ], + [ + 3293, + 0.15 + ], + [ + 3294, + 0.15 + ], + [ + 3295, + 0.15 + ], + [ + 3296, + 0.55 + ], + [ + 3297, + 0.95 + ], + [ + 3298, + 0.95 + ], + [ + 3299, + 0.95 + ], + [ + 3300, + 0.7 + ], + [ + 3301, + 0.95 + ], + [ + 3302, + 0.95 + ], + [ + 3303, + 0.95 + ], + [ + 3304, + 0.95 + ], + [ + 3305, + 0.45 + ], + [ + 3306, + 0.15 + ], + [ + 3307, + 0.15 + ], + [ + 3308, + 0.15 + ], + [ + 3309, + 0.15 + ], + [ + 3310, + 0.15 + ], + [ + 3311, + 0.15 + ], + [ + 3312, + 0.12 + ], + [ + 3313, + 0.12 + ], + [ + 3314, + 0.12 + ], + [ + 3315, + 0.12 + ], + [ + 3316, + 0.12 + ], + [ + 3317, + 0.12 + ], + [ + 3318, + 0.12 + ], + [ + 3319, + 0.12 + ], + [ + 3320, + 0.12 + ], + [ + 3321, + 0.12 + ], + [ + 3322, + 0.2 + ], + [ + 3323, + 0.2 + ], + [ + 3324, + 0.18 + ], + [ + 3325, + 0.12 + ], + [ + 3326, + 0.12 + ], + [ + 3327, + 0.12 + ], + [ + 3328, + 0.12 + ], + [ + 3329, + 0.12 + ], + [ + 3330, + 0.12 + ], + [ + 3331, + 0.12 + ], + [ + 3332, + 0.12 + ], + [ + 3333, + 0.12 + ], + [ + 3334, + 0.12 + ], + [ + 3335, + 0.12 + ], + [ + 3336, + 0.12 + ], + [ + 3337, + 0.12 + ], + [ + 3338, + 0.12 + ], + [ + 3339, + 0.12 + ], + [ + 3340, + 0.12 + ], + [ + 3341, + 0.12 + ], + [ + 3342, + 0.12 + ], + [ + 3343, + 0.12 + ], + [ + 3344, + 0.12 + ], + [ + 3345, + 0.12 + ], + [ + 3346, + 0.2 + ], + [ + 3347, + 0.2 + ], + [ + 3348, + 0.18 + ], + [ + 3349, + 0.12 + ], + [ + 3350, + 0.12 + ], + [ + 3351, + 0.12 + ], + [ + 3352, + 0.12 + ], + [ + 3353, + 0.12 + ], + [ + 3354, + 0.12 + ], + [ + 3355, + 0.12 + ], + [ + 3356, + 0.12 + ], + [ + 3357, + 0.12 + ], + [ + 3358, + 0.12 + ], + [ + 3359, + 0.12 + ], + [ + 3360, + 0.15 + ], + [ + 3361, + 0.15 + ], + [ + 3362, + 0.15 + ], + [ + 3363, + 0.15 + ], + [ + 3364, + 0.15 + ], + [ + 3365, + 0.15 + ], + [ + 3366, + 0.15 + ], + [ + 3367, + 0.15 + ], + [ + 3368, + 0.55 + ], + [ + 3369, + 0.95 + ], + [ + 3370, + 0.95 + ], + [ + 3371, + 0.95 + ], + [ + 3372, + 0.7 + ], + [ + 3373, + 0.95 + ], + [ + 3374, + 0.95 + ], + [ + 3375, + 0.95 + ], + [ + 3376, + 0.95 + ], + [ + 3377, + 0.45 + ], + [ + 3378, + 0.15 + ], + [ + 3379, + 0.15 + ], + [ + 3380, + 0.15 + ], + [ + 3381, + 0.15 + ], + [ + 3382, + 0.15 + ], + [ + 3383, + 0.15 + ], + [ + 3384, + 0.15 + ], + [ + 3385, + 0.15 + ], + [ + 3386, + 0.15 + ], + [ + 3387, + 0.15 + ], + [ + 3388, + 0.15 + ], + [ + 3389, + 0.15 + ], + [ + 3390, + 0.15 + ], + [ + 3391, + 0.15 + ], + [ + 3392, + 0.55 + ], + [ + 3393, + 0.95 + ], + [ + 3394, + 0.95 + ], + [ + 3395, + 0.95 + ], + [ + 3396, + 0.7 + ], + [ + 3397, + 0.95 + ], + [ + 3398, + 0.95 + ], + [ + 3399, + 0.95 + ], + [ + 3400, + 0.95 + ], + [ + 3401, + 0.45 + ], + [ + 3402, + 0.15 + ], + [ + 3403, + 0.15 + ], + [ + 3404, + 0.15 + ], + [ + 3405, + 0.15 + ], + [ + 3406, + 0.15 + ], + [ + 3407, + 0.15 + ], + [ + 3408, + 0.15 + ], + [ + 3409, + 0.15 + ], + [ + 3410, + 0.15 + ], + [ + 3411, + 0.15 + ], + [ + 3412, + 0.15 + ], + [ + 3413, + 0.15 + ], + [ + 3414, + 0.15 + ], + [ + 3415, + 0.15 + ], + [ + 3416, + 0.55 + ], + [ + 3417, + 0.95 + ], + [ + 3418, + 0.95 + ], + [ + 3419, + 0.95 + ], + [ + 3420, + 0.7 + ], + [ + 3421, + 0.95 + ], + [ + 3422, + 0.95 + ], + [ + 3423, + 0.95 + ], + [ + 3424, + 0.95 + ], + [ + 3425, + 0.45 + ], + [ + 3426, + 0.15 + ], + [ + 3427, + 0.15 + ], + [ + 3428, + 0.15 + ], + [ + 3429, + 0.15 + ], + [ + 3430, + 0.15 + ], + [ + 3431, + 0.15 + ], + [ + 3432, + 0.15 + ], + [ + 3433, + 0.15 + ], + [ + 3434, + 0.15 + ], + [ + 3435, + 0.15 + ], + [ + 3436, + 0.15 + ], + [ + 3437, + 0.15 + ], + [ + 3438, + 0.15 + ], + [ + 3439, + 0.15 + ], + [ + 3440, + 0.55 + ], + [ + 3441, + 0.95 + ], + [ + 3442, + 0.95 + ], + [ + 3443, + 0.95 + ], + [ + 3444, + 0.7 + ], + [ + 3445, + 0.95 + ], + [ + 3446, + 0.95 + ], + [ + 3447, + 0.95 + ], + [ + 3448, + 0.95 + ], + [ + 3449, + 0.45 + ], + [ + 3450, + 0.15 + ], + [ + 3451, + 0.15 + ], + [ + 3452, + 0.15 + ], + [ + 3453, + 0.15 + ], + [ + 3454, + 0.15 + ], + [ + 3455, + 0.15 + ], + [ + 3456, + 0.15 + ], + [ + 3457, + 0.15 + ], + [ + 3458, + 0.15 + ], + [ + 3459, + 0.15 + ], + [ + 3460, + 0.15 + ], + [ + 3461, + 0.15 + ], + [ + 3462, + 0.15 + ], + [ + 3463, + 0.15 + ], + [ + 3464, + 0.55 + ], + [ + 3465, + 0.95 + ], + [ + 3466, + 0.95 + ], + [ + 3467, + 0.95 + ], + [ + 3468, + 0.7 + ], + [ + 3469, + 0.95 + ], + [ + 3470, + 0.95 + ], + [ + 3471, + 0.95 + ], + [ + 3472, + 0.95 + ], + [ + 3473, + 0.45 + ], + [ + 3474, + 0.15 + ], + [ + 3475, + 0.15 + ], + [ + 3476, + 0.15 + ], + [ + 3477, + 0.15 + ], + [ + 3478, + 0.15 + ], + [ + 3479, + 0.15 + ], + [ + 3480, + 0.12 + ], + [ + 3481, + 0.12 + ], + [ + 3482, + 0.12 + ], + [ + 3483, + 0.12 + ], + [ + 3484, + 0.12 + ], + [ + 3485, + 0.12 + ], + [ + 3486, + 0.12 + ], + [ + 3487, + 0.12 + ], + [ + 3488, + 0.12 + ], + [ + 3489, + 0.12 + ], + [ + 3490, + 0.2 + ], + [ + 3491, + 0.2 + ], + [ + 3492, + 0.18 + ], + [ + 3493, + 0.12 + ], + [ + 3494, + 0.12 + ], + [ + 3495, + 0.12 + ], + [ + 3496, + 0.12 + ], + [ + 3497, + 0.12 + ], + [ + 3498, + 0.12 + ], + [ + 3499, + 0.12 + ], + [ + 3500, + 0.12 + ], + [ + 3501, + 0.12 + ], + [ + 3502, + 0.12 + ], + [ + 3503, + 0.12 + ], + [ + 3504, + 0.12 + ], + [ + 3505, + 0.12 + ], + [ + 3506, + 0.12 + ], + [ + 3507, + 0.12 + ], + [ + 3508, + 0.12 + ], + [ + 3509, + 0.12 + ], + [ + 3510, + 0.12 + ], + [ + 3511, + 0.12 + ], + [ + 3512, + 0.12 + ], + [ + 3513, + 0.12 + ], + [ + 3514, + 0.2 + ], + [ + 3515, + 0.2 + ], + [ + 3516, + 0.18 + ], + [ + 3517, + 0.12 + ], + [ + 3518, + 0.12 + ], + [ + 3519, + 0.12 + ], + [ + 3520, + 0.12 + ], + [ + 3521, + 0.12 + ], + [ + 3522, + 0.12 + ], + [ + 3523, + 0.12 + ], + [ + 3524, + 0.12 + ], + [ + 3525, + 0.12 + ], + [ + 3526, + 0.12 + ], + [ + 3527, + 0.12 + ], + [ + 3528, + 0.15 + ], + [ + 3529, + 0.15 + ], + [ + 3530, + 0.15 + ], + [ + 3531, + 0.15 + ], + [ + 3532, + 0.15 + ], + [ + 3533, + 0.15 + ], + [ + 3534, + 0.15 + ], + [ + 3535, + 0.15 + ], + [ + 3536, + 0.55 + ], + [ + 3537, + 0.95 + ], + [ + 3538, + 0.95 + ], + [ + 3539, + 0.95 + ], + [ + 3540, + 0.7 + ], + [ + 3541, + 0.95 + ], + [ + 3542, + 0.95 + ], + [ + 3543, + 0.95 + ], + [ + 3544, + 0.95 + ], + [ + 3545, + 0.45 + ], + [ + 3546, + 0.15 + ], + [ + 3547, + 0.15 + ], + [ + 3548, + 0.15 + ], + [ + 3549, + 0.15 + ], + [ + 3550, + 0.15 + ], + [ + 3551, + 0.15 + ], + [ + 3552, + 0.15 + ], + [ + 3553, + 0.15 + ], + [ + 3554, + 0.15 + ], + [ + 3555, + 0.15 + ], + [ + 3556, + 0.15 + ], + [ + 3557, + 0.15 + ], + [ + 3558, + 0.15 + ], + [ + 3559, + 0.15 + ], + [ + 3560, + 0.55 + ], + [ + 3561, + 0.95 + ], + [ + 3562, + 0.95 + ], + [ + 3563, + 0.95 + ], + [ + 3564, + 0.7 + ], + [ + 3565, + 0.95 + ], + [ + 3566, + 0.95 + ], + [ + 3567, + 0.95 + ], + [ + 3568, + 0.95 + ], + [ + 3569, + 0.45 + ], + [ + 3570, + 0.15 + ], + [ + 3571, + 0.15 + ], + [ + 3572, + 0.15 + ], + [ + 3573, + 0.15 + ], + [ + 3574, + 0.15 + ], + [ + 3575, + 0.15 + ], + [ + 3576, + 0.15 + ], + [ + 3577, + 0.15 + ], + [ + 3578, + 0.15 + ], + [ + 3579, + 0.15 + ], + [ + 3580, + 0.15 + ], + [ + 3581, + 0.15 + ], + [ + 3582, + 0.15 + ], + [ + 3583, + 0.15 + ], + [ + 3584, + 0.55 + ], + [ + 3585, + 0.95 + ], + [ + 3586, + 0.95 + ], + [ + 3587, + 0.95 + ], + [ + 3588, + 0.7 + ], + [ + 3589, + 0.95 + ], + [ + 3590, + 0.95 + ], + [ + 3591, + 0.95 + ], + [ + 3592, + 0.95 + ], + [ + 3593, + 0.45 + ], + [ + 3594, + 0.15 + ], + [ + 3595, + 0.15 + ], + [ + 3596, + 0.15 + ], + [ + 3597, + 0.15 + ], + [ + 3598, + 0.15 + ], + [ + 3599, + 0.15 + ], + [ + 3600, + 0.15 + ], + [ + 3601, + 0.15 + ], + [ + 3602, + 0.15 + ], + [ + 3603, + 0.15 + ], + [ + 3604, + 0.15 + ], + [ + 3605, + 0.15 + ], + [ + 3606, + 0.15 + ], + [ + 3607, + 0.15 + ], + [ + 3608, + 0.55 + ], + [ + 3609, + 0.95 + ], + [ + 3610, + 0.95 + ], + [ + 3611, + 0.95 + ], + [ + 3612, + 0.7 + ], + [ + 3613, + 0.95 + ], + [ + 3614, + 0.95 + ], + [ + 3615, + 0.95 + ], + [ + 3616, + 0.95 + ], + [ + 3617, + 0.45 + ], + [ + 3618, + 0.15 + ], + [ + 3619, + 0.15 + ], + [ + 3620, + 0.15 + ], + [ + 3621, + 0.15 + ], + [ + 3622, + 0.15 + ], + [ + 3623, + 0.15 + ], + [ + 3624, + 0.15 + ], + [ + 3625, + 0.15 + ], + [ + 3626, + 0.15 + ], + [ + 3627, + 0.15 + ], + [ + 3628, + 0.15 + ], + [ + 3629, + 0.15 + ], + [ + 3630, + 0.15 + ], + [ + 3631, + 0.15 + ], + [ + 3632, + 0.55 + ], + [ + 3633, + 0.95 + ], + [ + 3634, + 0.95 + ], + [ + 3635, + 0.95 + ], + [ + 3636, + 0.7 + ], + [ + 3637, + 0.95 + ], + [ + 3638, + 0.95 + ], + [ + 3639, + 0.95 + ], + [ + 3640, + 0.95 + ], + [ + 3641, + 0.45 + ], + [ + 3642, + 0.15 + ], + [ + 3643, + 0.15 + ], + [ + 3644, + 0.15 + ], + [ + 3645, + 0.15 + ], + [ + 3646, + 0.15 + ], + [ + 3647, + 0.15 + ], + [ + 3648, + 0.12 + ], + [ + 3649, + 0.12 + ], + [ + 3650, + 0.12 + ], + [ + 3651, + 0.12 + ], + [ + 3652, + 0.12 + ], + [ + 3653, + 0.12 + ], + [ + 3654, + 0.12 + ], + [ + 3655, + 0.12 + ], + [ + 3656, + 0.12 + ], + [ + 3657, + 0.12 + ], + [ + 3658, + 0.2 + ], + [ + 3659, + 0.2 + ], + [ + 3660, + 0.18 + ], + [ + 3661, + 0.12 + ], + [ + 3662, + 0.12 + ], + [ + 3663, + 0.12 + ], + [ + 3664, + 0.12 + ], + [ + 3665, + 0.12 + ], + [ + 3666, + 0.12 + ], + [ + 3667, + 0.12 + ], + [ + 3668, + 0.12 + ], + [ + 3669, + 0.12 + ], + [ + 3670, + 0.12 + ], + [ + 3671, + 0.12 + ], + [ + 3672, + 0.12 + ], + [ + 3673, + 0.12 + ], + [ + 3674, + 0.12 + ], + [ + 3675, + 0.12 + ], + [ + 3676, + 0.12 + ], + [ + 3677, + 0.12 + ], + [ + 3678, + 0.12 + ], + [ + 3679, + 0.12 + ], + [ + 3680, + 0.12 + ], + [ + 3681, + 0.12 + ], + [ + 3682, + 0.2 + ], + [ + 3683, + 0.2 + ], + [ + 3684, + 0.18 + ], + [ + 3685, + 0.12 + ], + [ + 3686, + 0.12 + ], + [ + 3687, + 0.12 + ], + [ + 3688, + 0.12 + ], + [ + 3689, + 0.12 + ], + [ + 3690, + 0.12 + ], + [ + 3691, + 0.12 + ], + [ + 3692, + 0.12 + ], + [ + 3693, + 0.12 + ], + [ + 3694, + 0.12 + ], + [ + 3695, + 0.12 + ], + [ + 3696, + 0.15 + ], + [ + 3697, + 0.15 + ], + [ + 3698, + 0.15 + ], + [ + 3699, + 0.15 + ], + [ + 3700, + 0.15 + ], + [ + 3701, + 0.15 + ], + [ + 3702, + 0.15 + ], + [ + 3703, + 0.15 + ], + [ + 3704, + 0.55 + ], + [ + 3705, + 0.95 + ], + [ + 3706, + 0.95 + ], + [ + 3707, + 0.95 + ], + [ + 3708, + 0.7 + ], + [ + 3709, + 0.95 + ], + [ + 3710, + 0.95 + ], + [ + 3711, + 0.95 + ], + [ + 3712, + 0.95 + ], + [ + 3713, + 0.45 + ], + [ + 3714, + 0.15 + ], + [ + 3715, + 0.15 + ], + [ + 3716, + 0.15 + ], + [ + 3717, + 0.15 + ], + [ + 3718, + 0.15 + ], + [ + 3719, + 0.15 + ], + [ + 3720, + 0.15 + ], + [ + 3721, + 0.15 + ], + [ + 3722, + 0.15 + ], + [ + 3723, + 0.15 + ], + [ + 3724, + 0.15 + ], + [ + 3725, + 0.15 + ], + [ + 3726, + 0.15 + ], + [ + 3727, + 0.15 + ], + [ + 3728, + 0.55 + ], + [ + 3729, + 0.95 + ], + [ + 3730, + 0.95 + ], + [ + 3731, + 0.95 + ], + [ + 3732, + 0.7 + ], + [ + 3733, + 0.95 + ], + [ + 3734, + 0.95 + ], + [ + 3735, + 0.95 + ], + [ + 3736, + 0.95 + ], + [ + 3737, + 0.45 + ], + [ + 3738, + 0.15 + ], + [ + 3739, + 0.15 + ], + [ + 3740, + 0.15 + ], + [ + 3741, + 0.15 + ], + [ + 3742, + 0.15 + ], + [ + 3743, + 0.15 + ], + [ + 3744, + 0.15 + ], + [ + 3745, + 0.15 + ], + [ + 3746, + 0.15 + ], + [ + 3747, + 0.15 + ], + [ + 3748, + 0.15 + ], + [ + 3749, + 0.15 + ], + [ + 3750, + 0.15 + ], + [ + 3751, + 0.15 + ], + [ + 3752, + 0.55 + ], + [ + 3753, + 0.95 + ], + [ + 3754, + 0.95 + ], + [ + 3755, + 0.95 + ], + [ + 3756, + 0.7 + ], + [ + 3757, + 0.95 + ], + [ + 3758, + 0.95 + ], + [ + 3759, + 0.95 + ], + [ + 3760, + 0.95 + ], + [ + 3761, + 0.45 + ], + [ + 3762, + 0.15 + ], + [ + 3763, + 0.15 + ], + [ + 3764, + 0.15 + ], + [ + 3765, + 0.15 + ], + [ + 3766, + 0.15 + ], + [ + 3767, + 0.15 + ], + [ + 3768, + 0.15 + ], + [ + 3769, + 0.15 + ], + [ + 3770, + 0.15 + ], + [ + 3771, + 0.15 + ], + [ + 3772, + 0.15 + ], + [ + 3773, + 0.15 + ], + [ + 3774, + 0.15 + ], + [ + 3775, + 0.15 + ], + [ + 3776, + 0.55 + ], + [ + 3777, + 0.95 + ], + [ + 3778, + 0.95 + ], + [ + 3779, + 0.95 + ], + [ + 3780, + 0.7 + ], + [ + 3781, + 0.95 + ], + [ + 3782, + 0.95 + ], + [ + 3783, + 0.95 + ], + [ + 3784, + 0.95 + ], + [ + 3785, + 0.45 + ], + [ + 3786, + 0.15 + ], + [ + 3787, + 0.15 + ], + [ + 3788, + 0.15 + ], + [ + 3789, + 0.15 + ], + [ + 3790, + 0.15 + ], + [ + 3791, + 0.15 + ], + [ + 3792, + 0.15 + ], + [ + 3793, + 0.15 + ], + [ + 3794, + 0.15 + ], + [ + 3795, + 0.15 + ], + [ + 3796, + 0.15 + ], + [ + 3797, + 0.15 + ], + [ + 3798, + 0.15 + ], + [ + 3799, + 0.15 + ], + [ + 3800, + 0.55 + ], + [ + 3801, + 0.95 + ], + [ + 3802, + 0.95 + ], + [ + 3803, + 0.95 + ], + [ + 3804, + 0.7 + ], + [ + 3805, + 0.95 + ], + [ + 3806, + 0.95 + ], + [ + 3807, + 0.95 + ], + [ + 3808, + 0.95 + ], + [ + 3809, + 0.45 + ], + [ + 3810, + 0.15 + ], + [ + 3811, + 0.15 + ], + [ + 3812, + 0.15 + ], + [ + 3813, + 0.15 + ], + [ + 3814, + 0.15 + ], + [ + 3815, + 0.15 + ], + [ + 3816, + 0.12 + ], + [ + 3817, + 0.12 + ], + [ + 3818, + 0.12 + ], + [ + 3819, + 0.12 + ], + [ + 3820, + 0.12 + ], + [ + 3821, + 0.12 + ], + [ + 3822, + 0.12 + ], + [ + 3823, + 0.12 + ], + [ + 3824, + 0.12 + ], + [ + 3825, + 0.12 + ], + [ + 3826, + 0.2 + ], + [ + 3827, + 0.2 + ], + [ + 3828, + 0.18 + ], + [ + 3829, + 0.12 + ], + [ + 3830, + 0.12 + ], + [ + 3831, + 0.12 + ], + [ + 3832, + 0.12 + ], + [ + 3833, + 0.12 + ], + [ + 3834, + 0.12 + ], + [ + 3835, + 0.12 + ], + [ + 3836, + 0.12 + ], + [ + 3837, + 0.12 + ], + [ + 3838, + 0.12 + ], + [ + 3839, + 0.12 + ], + [ + 3840, + 0.12 + ], + [ + 3841, + 0.12 + ], + [ + 3842, + 0.12 + ], + [ + 3843, + 0.12 + ], + [ + 3844, + 0.12 + ], + [ + 3845, + 0.12 + ], + [ + 3846, + 0.12 + ], + [ + 3847, + 0.12 + ], + [ + 3848, + 0.12 + ], + [ + 3849, + 0.12 + ], + [ + 3850, + 0.2 + ], + [ + 3851, + 0.2 + ], + [ + 3852, + 0.18 + ], + [ + 3853, + 0.12 + ], + [ + 3854, + 0.12 + ], + [ + 3855, + 0.12 + ], + [ + 3856, + 0.12 + ], + [ + 3857, + 0.12 + ], + [ + 3858, + 0.12 + ], + [ + 3859, + 0.12 + ], + [ + 3860, + 0.12 + ], + [ + 3861, + 0.12 + ], + [ + 3862, + 0.12 + ], + [ + 3863, + 0.12 + ], + [ + 3864, + 0.15 + ], + [ + 3865, + 0.15 + ], + [ + 3866, + 0.15 + ], + [ + 3867, + 0.15 + ], + [ + 3868, + 0.15 + ], + [ + 3869, + 0.15 + ], + [ + 3870, + 0.15 + ], + [ + 3871, + 0.15 + ], + [ + 3872, + 0.55 + ], + [ + 3873, + 0.95 + ], + [ + 3874, + 0.95 + ], + [ + 3875, + 0.95 + ], + [ + 3876, + 0.7 + ], + [ + 3877, + 0.95 + ], + [ + 3878, + 0.95 + ], + [ + 3879, + 0.95 + ], + [ + 3880, + 0.95 + ], + [ + 3881, + 0.45 + ], + [ + 3882, + 0.15 + ], + [ + 3883, + 0.15 + ], + [ + 3884, + 0.15 + ], + [ + 3885, + 0.15 + ], + [ + 3886, + 0.15 + ], + [ + 3887, + 0.15 + ], + [ + 3888, + 0.15 + ], + [ + 3889, + 0.15 + ], + [ + 3890, + 0.15 + ], + [ + 3891, + 0.15 + ], + [ + 3892, + 0.15 + ], + [ + 3893, + 0.15 + ], + [ + 3894, + 0.15 + ], + [ + 3895, + 0.15 + ], + [ + 3896, + 0.55 + ], + [ + 3897, + 0.95 + ], + [ + 3898, + 0.95 + ], + [ + 3899, + 0.95 + ], + [ + 3900, + 0.7 + ], + [ + 3901, + 0.95 + ], + [ + 3902, + 0.95 + ], + [ + 3903, + 0.95 + ], + [ + 3904, + 0.95 + ], + [ + 3905, + 0.45 + ], + [ + 3906, + 0.15 + ], + [ + 3907, + 0.15 + ], + [ + 3908, + 0.15 + ], + [ + 3909, + 0.15 + ], + [ + 3910, + 0.15 + ], + [ + 3911, + 0.15 + ], + [ + 3912, + 0.15 + ], + [ + 3913, + 0.15 + ], + [ + 3914, + 0.15 + ], + [ + 3915, + 0.15 + ], + [ + 3916, + 0.15 + ], + [ + 3917, + 0.15 + ], + [ + 3918, + 0.15 + ], + [ + 3919, + 0.15 + ], + [ + 3920, + 0.55 + ], + [ + 3921, + 0.95 + ], + [ + 3922, + 0.95 + ], + [ + 3923, + 0.95 + ], + [ + 3924, + 0.7 + ], + [ + 3925, + 0.95 + ], + [ + 3926, + 0.95 + ], + [ + 3927, + 0.95 + ], + [ + 3928, + 0.95 + ], + [ + 3929, + 0.45 + ], + [ + 3930, + 0.15 + ], + [ + 3931, + 0.15 + ], + [ + 3932, + 0.15 + ], + [ + 3933, + 0.15 + ], + [ + 3934, + 0.15 + ], + [ + 3935, + 0.15 + ], + [ + 3936, + 0.15 + ], + [ + 3937, + 0.15 + ], + [ + 3938, + 0.15 + ], + [ + 3939, + 0.15 + ], + [ + 3940, + 0.15 + ], + [ + 3941, + 0.15 + ], + [ + 3942, + 0.15 + ], + [ + 3943, + 0.15 + ], + [ + 3944, + 0.55 + ], + [ + 3945, + 0.95 + ], + [ + 3946, + 0.95 + ], + [ + 3947, + 0.95 + ], + [ + 3948, + 0.7 + ], + [ + 3949, + 0.95 + ], + [ + 3950, + 0.95 + ], + [ + 3951, + 0.95 + ], + [ + 3952, + 0.95 + ], + [ + 3953, + 0.45 + ], + [ + 3954, + 0.15 + ], + [ + 3955, + 0.15 + ], + [ + 3956, + 0.15 + ], + [ + 3957, + 0.15 + ], + [ + 3958, + 0.15 + ], + [ + 3959, + 0.15 + ], + [ + 3960, + 0.15 + ], + [ + 3961, + 0.15 + ], + [ + 3962, + 0.15 + ], + [ + 3963, + 0.15 + ], + [ + 3964, + 0.15 + ], + [ + 3965, + 0.15 + ], + [ + 3966, + 0.15 + ], + [ + 3967, + 0.15 + ], + [ + 3968, + 0.55 + ], + [ + 3969, + 0.95 + ], + [ + 3970, + 0.95 + ], + [ + 3971, + 0.95 + ], + [ + 3972, + 0.7 + ], + [ + 3973, + 0.95 + ], + [ + 3974, + 0.95 + ], + [ + 3975, + 0.95 + ], + [ + 3976, + 0.95 + ], + [ + 3977, + 0.45 + ], + [ + 3978, + 0.15 + ], + [ + 3979, + 0.15 + ], + [ + 3980, + 0.15 + ], + [ + 3981, + 0.15 + ], + [ + 3982, + 0.15 + ], + [ + 3983, + 0.15 + ], + [ + 3984, + 0.12 + ], + [ + 3985, + 0.12 + ], + [ + 3986, + 0.12 + ], + [ + 3987, + 0.12 + ], + [ + 3988, + 0.12 + ], + [ + 3989, + 0.12 + ], + [ + 3990, + 0.12 + ], + [ + 3991, + 0.12 + ], + [ + 3992, + 0.12 + ], + [ + 3993, + 0.12 + ], + [ + 3994, + 0.2 + ], + [ + 3995, + 0.2 + ], + [ + 3996, + 0.18 + ], + [ + 3997, + 0.12 + ], + [ + 3998, + 0.12 + ], + [ + 3999, + 0.12 + ], + [ + 4000, + 0.12 + ], + [ + 4001, + 0.12 + ], + [ + 4002, + 0.12 + ], + [ + 4003, + 0.12 + ], + [ + 4004, + 0.12 + ], + [ + 4005, + 0.12 + ], + [ + 4006, + 0.12 + ], + [ + 4007, + 0.12 + ], + [ + 4008, + 0.12 + ], + [ + 4009, + 0.12 + ], + [ + 4010, + 0.12 + ], + [ + 4011, + 0.12 + ], + [ + 4012, + 0.12 + ], + [ + 4013, + 0.12 + ], + [ + 4014, + 0.12 + ], + [ + 4015, + 0.12 + ], + [ + 4016, + 0.12 + ], + [ + 4017, + 0.12 + ], + [ + 4018, + 0.2 + ], + [ + 4019, + 0.2 + ], + [ + 4020, + 0.18 + ], + [ + 4021, + 0.12 + ], + [ + 4022, + 0.12 + ], + [ + 4023, + 0.12 + ], + [ + 4024, + 0.12 + ], + [ + 4025, + 0.12 + ], + [ + 4026, + 0.12 + ], + [ + 4027, + 0.12 + ], + [ + 4028, + 0.12 + ], + [ + 4029, + 0.12 + ], + [ + 4030, + 0.12 + ], + [ + 4031, + 0.12 + ], + [ + 4032, + 0.15 + ], + [ + 4033, + 0.15 + ], + [ + 4034, + 0.15 + ], + [ + 4035, + 0.15 + ], + [ + 4036, + 0.15 + ], + [ + 4037, + 0.15 + ], + [ + 4038, + 0.15 + ], + [ + 4039, + 0.15 + ], + [ + 4040, + 0.55 + ], + [ + 4041, + 0.95 + ], + [ + 4042, + 0.95 + ], + [ + 4043, + 0.95 + ], + [ + 4044, + 0.7 + ], + [ + 4045, + 0.95 + ], + [ + 4046, + 0.95 + ], + [ + 4047, + 0.95 + ], + [ + 4048, + 0.95 + ], + [ + 4049, + 0.45 + ], + [ + 4050, + 0.15 + ], + [ + 4051, + 0.15 + ], + [ + 4052, + 0.15 + ], + [ + 4053, + 0.15 + ], + [ + 4054, + 0.15 + ], + [ + 4055, + 0.15 + ], + [ + 4056, + 0.15 + ], + [ + 4057, + 0.15 + ], + [ + 4058, + 0.15 + ], + [ + 4059, + 0.15 + ], + [ + 4060, + 0.15 + ], + [ + 4061, + 0.15 + ], + [ + 4062, + 0.15 + ], + [ + 4063, + 0.15 + ], + [ + 4064, + 0.55 + ], + [ + 4065, + 0.95 + ], + [ + 4066, + 0.95 + ], + [ + 4067, + 0.95 + ], + [ + 4068, + 0.7 + ], + [ + 4069, + 0.95 + ], + [ + 4070, + 0.95 + ], + [ + 4071, + 0.95 + ], + [ + 4072, + 0.95 + ], + [ + 4073, + 0.45 + ], + [ + 4074, + 0.15 + ], + [ + 4075, + 0.15 + ], + [ + 4076, + 0.15 + ], + [ + 4077, + 0.15 + ], + [ + 4078, + 0.15 + ], + [ + 4079, + 0.15 + ], + [ + 4080, + 0.15 + ], + [ + 4081, + 0.15 + ], + [ + 4082, + 0.15 + ], + [ + 4083, + 0.15 + ], + [ + 4084, + 0.15 + ], + [ + 4085, + 0.15 + ], + [ + 4086, + 0.15 + ], + [ + 4087, + 0.15 + ], + [ + 4088, + 0.55 + ], + [ + 4089, + 0.95 + ], + [ + 4090, + 0.95 + ], + [ + 4091, + 0.95 + ], + [ + 4092, + 0.7 + ], + [ + 4093, + 0.95 + ], + [ + 4094, + 0.95 + ], + [ + 4095, + 0.95 + ], + [ + 4096, + 0.95 + ], + [ + 4097, + 0.45 + ], + [ + 4098, + 0.15 + ], + [ + 4099, + 0.15 + ], + [ + 4100, + 0.15 + ], + [ + 4101, + 0.15 + ], + [ + 4102, + 0.15 + ], + [ + 4103, + 0.15 + ], + [ + 4104, + 0.15 + ], + [ + 4105, + 0.15 + ], + [ + 4106, + 0.15 + ], + [ + 4107, + 0.15 + ], + [ + 4108, + 0.15 + ], + [ + 4109, + 0.15 + ], + [ + 4110, + 0.15 + ], + [ + 4111, + 0.15 + ], + [ + 4112, + 0.55 + ], + [ + 4113, + 0.95 + ], + [ + 4114, + 0.95 + ], + [ + 4115, + 0.95 + ], + [ + 4116, + 0.7 + ], + [ + 4117, + 0.95 + ], + [ + 4118, + 0.95 + ], + [ + 4119, + 0.95 + ], + [ + 4120, + 0.95 + ], + [ + 4121, + 0.45 + ], + [ + 4122, + 0.15 + ], + [ + 4123, + 0.15 + ], + [ + 4124, + 0.15 + ], + [ + 4125, + 0.15 + ], + [ + 4126, + 0.15 + ], + [ + 4127, + 0.15 + ], + [ + 4128, + 0.15 + ], + [ + 4129, + 0.15 + ], + [ + 4130, + 0.15 + ], + [ + 4131, + 0.15 + ], + [ + 4132, + 0.15 + ], + [ + 4133, + 0.15 + ], + [ + 4134, + 0.15 + ], + [ + 4135, + 0.15 + ], + [ + 4136, + 0.55 + ], + [ + 4137, + 0.95 + ], + [ + 4138, + 0.95 + ], + [ + 4139, + 0.95 + ], + [ + 4140, + 0.7 + ], + [ + 4141, + 0.95 + ], + [ + 4142, + 0.95 + ], + [ + 4143, + 0.95 + ], + [ + 4144, + 0.95 + ], + [ + 4145, + 0.45 + ], + [ + 4146, + 0.15 + ], + [ + 4147, + 0.15 + ], + [ + 4148, + 0.15 + ], + [ + 4149, + 0.15 + ], + [ + 4150, + 0.15 + ], + [ + 4151, + 0.15 + ], + [ + 4152, + 0.12 + ], + [ + 4153, + 0.12 + ], + [ + 4154, + 0.12 + ], + [ + 4155, + 0.12 + ], + [ + 4156, + 0.12 + ], + [ + 4157, + 0.12 + ], + [ + 4158, + 0.12 + ], + [ + 4159, + 0.12 + ], + [ + 4160, + 0.12 + ], + [ + 4161, + 0.12 + ], + [ + 4162, + 0.2 + ], + [ + 4163, + 0.2 + ], + [ + 4164, + 0.18 + ], + [ + 4165, + 0.12 + ], + [ + 4166, + 0.12 + ], + [ + 4167, + 0.12 + ], + [ + 4168, + 0.12 + ], + [ + 4169, + 0.12 + ], + [ + 4170, + 0.12 + ], + [ + 4171, + 0.12 + ], + [ + 4172, + 0.12 + ], + [ + 4173, + 0.12 + ], + [ + 4174, + 0.12 + ], + [ + 4175, + 0.12 + ], + [ + 4176, + 0.12 + ], + [ + 4177, + 0.12 + ], + [ + 4178, + 0.12 + ], + [ + 4179, + 0.12 + ], + [ + 4180, + 0.12 + ], + [ + 4181, + 0.12 + ], + [ + 4182, + 0.12 + ], + [ + 4183, + 0.12 + ], + [ + 4184, + 0.12 + ], + [ + 4185, + 0.12 + ], + [ + 4186, + 0.2 + ], + [ + 4187, + 0.2 + ], + [ + 4188, + 0.18 + ], + [ + 4189, + 0.12 + ], + [ + 4190, + 0.12 + ], + [ + 4191, + 0.12 + ], + [ + 4192, + 0.12 + ], + [ + 4193, + 0.12 + ], + [ + 4194, + 0.12 + ], + [ + 4195, + 0.12 + ], + [ + 4196, + 0.12 + ], + [ + 4197, + 0.12 + ], + [ + 4198, + 0.12 + ], + [ + 4199, + 0.12 + ], + [ + 4200, + 0.15 + ], + [ + 4201, + 0.15 + ], + [ + 4202, + 0.15 + ], + [ + 4203, + 0.15 + ], + [ + 4204, + 0.15 + ], + [ + 4205, + 0.15 + ], + [ + 4206, + 0.15 + ], + [ + 4207, + 0.15 + ], + [ + 4208, + 0.55 + ], + [ + 4209, + 0.95 + ], + [ + 4210, + 0.95 + ], + [ + 4211, + 0.95 + ], + [ + 4212, + 0.7 + ], + [ + 4213, + 0.95 + ], + [ + 4214, + 0.95 + ], + [ + 4215, + 0.95 + ], + [ + 4216, + 0.95 + ], + [ + 4217, + 0.45 + ], + [ + 4218, + 0.15 + ], + [ + 4219, + 0.15 + ], + [ + 4220, + 0.15 + ], + [ + 4221, + 0.15 + ], + [ + 4222, + 0.15 + ], + [ + 4223, + 0.15 + ], + [ + 4224, + 0.15 + ], + [ + 4225, + 0.15 + ], + [ + 4226, + 0.15 + ], + [ + 4227, + 0.15 + ], + [ + 4228, + 0.15 + ], + [ + 4229, + 0.15 + ], + [ + 4230, + 0.15 + ], + [ + 4231, + 0.15 + ], + [ + 4232, + 0.55 + ], + [ + 4233, + 0.95 + ], + [ + 4234, + 0.95 + ], + [ + 4235, + 0.95 + ], + [ + 4236, + 0.7 + ], + [ + 4237, + 0.95 + ], + [ + 4238, + 0.95 + ], + [ + 4239, + 0.95 + ], + [ + 4240, + 0.95 + ], + [ + 4241, + 0.45 + ], + [ + 4242, + 0.15 + ], + [ + 4243, + 0.15 + ], + [ + 4244, + 0.15 + ], + [ + 4245, + 0.15 + ], + [ + 4246, + 0.15 + ], + [ + 4247, + 0.15 + ], + [ + 4248, + 0.15 + ], + [ + 4249, + 0.15 + ], + [ + 4250, + 0.15 + ], + [ + 4251, + 0.15 + ], + [ + 4252, + 0.15 + ], + [ + 4253, + 0.15 + ], + [ + 4254, + 0.15 + ], + [ + 4255, + 0.15 + ], + [ + 4256, + 0.55 + ], + [ + 4257, + 0.95 + ], + [ + 4258, + 0.95 + ], + [ + 4259, + 0.95 + ], + [ + 4260, + 0.7 + ], + [ + 4261, + 0.95 + ], + [ + 4262, + 0.95 + ], + [ + 4263, + 0.95 + ], + [ + 4264, + 0.95 + ], + [ + 4265, + 0.45 + ], + [ + 4266, + 0.15 + ], + [ + 4267, + 0.15 + ], + [ + 4268, + 0.15 + ], + [ + 4269, + 0.15 + ], + [ + 4270, + 0.15 + ], + [ + 4271, + 0.15 + ], + [ + 4272, + 0.15 + ], + [ + 4273, + 0.15 + ], + [ + 4274, + 0.15 + ], + [ + 4275, + 0.15 + ], + [ + 4276, + 0.15 + ], + [ + 4277, + 0.15 + ], + [ + 4278, + 0.15 + ], + [ + 4279, + 0.15 + ], + [ + 4280, + 0.55 + ], + [ + 4281, + 0.95 + ], + [ + 4282, + 0.95 + ], + [ + 4283, + 0.95 + ], + [ + 4284, + 0.7 + ], + [ + 4285, + 0.95 + ], + [ + 4286, + 0.95 + ], + [ + 4287, + 0.95 + ], + [ + 4288, + 0.95 + ], + [ + 4289, + 0.45 + ], + [ + 4290, + 0.15 + ], + [ + 4291, + 0.15 + ], + [ + 4292, + 0.15 + ], + [ + 4293, + 0.15 + ], + [ + 4294, + 0.15 + ], + [ + 4295, + 0.15 + ], + [ + 4296, + 0.15 + ], + [ + 4297, + 0.15 + ], + [ + 4298, + 0.15 + ], + [ + 4299, + 0.15 + ], + [ + 4300, + 0.15 + ], + [ + 4301, + 0.15 + ], + [ + 4302, + 0.15 + ], + [ + 4303, + 0.15 + ], + [ + 4304, + 0.55 + ], + [ + 4305, + 0.95 + ], + [ + 4306, + 0.95 + ], + [ + 4307, + 0.95 + ], + [ + 4308, + 0.7 + ], + [ + 4309, + 0.95 + ], + [ + 4310, + 0.95 + ], + [ + 4311, + 0.95 + ], + [ + 4312, + 0.95 + ], + [ + 4313, + 0.45 + ], + [ + 4314, + 0.15 + ], + [ + 4315, + 0.15 + ], + [ + 4316, + 0.15 + ], + [ + 4317, + 0.15 + ], + [ + 4318, + 0.15 + ], + [ + 4319, + 0.15 + ], + [ + 4320, + 0.12 + ], + [ + 4321, + 0.12 + ], + [ + 4322, + 0.12 + ], + [ + 4323, + 0.12 + ], + [ + 4324, + 0.12 + ], + [ + 4325, + 0.12 + ], + [ + 4326, + 0.12 + ], + [ + 4327, + 0.12 + ], + [ + 4328, + 0.12 + ], + [ + 4329, + 0.12 + ], + [ + 4330, + 0.2 + ], + [ + 4331, + 0.2 + ], + [ + 4332, + 0.18 + ], + [ + 4333, + 0.12 + ], + [ + 4334, + 0.12 + ], + [ + 4335, + 0.12 + ], + [ + 4336, + 0.12 + ], + [ + 4337, + 0.12 + ], + [ + 4338, + 0.12 + ], + [ + 4339, + 0.12 + ], + [ + 4340, + 0.12 + ], + [ + 4341, + 0.12 + ], + [ + 4342, + 0.12 + ], + [ + 4343, + 0.12 + ], + [ + 4344, + 0.12 + ], + [ + 4345, + 0.12 + ], + [ + 4346, + 0.12 + ], + [ + 4347, + 0.12 + ], + [ + 4348, + 0.12 + ], + [ + 4349, + 0.12 + ], + [ + 4350, + 0.12 + ], + [ + 4351, + 0.12 + ], + [ + 4352, + 0.12 + ], + [ + 4353, + 0.12 + ], + [ + 4354, + 0.2 + ], + [ + 4355, + 0.2 + ], + [ + 4356, + 0.18 + ], + [ + 4357, + 0.12 + ], + [ + 4358, + 0.12 + ], + [ + 4359, + 0.12 + ], + [ + 4360, + 0.12 + ], + [ + 4361, + 0.12 + ], + [ + 4362, + 0.12 + ], + [ + 4363, + 0.12 + ], + [ + 4364, + 0.12 + ], + [ + 4365, + 0.12 + ], + [ + 4366, + 0.12 + ], + [ + 4367, + 0.12 + ], + [ + 4368, + 0.15 + ], + [ + 4369, + 0.15 + ], + [ + 4370, + 0.15 + ], + [ + 4371, + 0.15 + ], + [ + 4372, + 0.15 + ], + [ + 4373, + 0.15 + ], + [ + 4374, + 0.15 + ], + [ + 4375, + 0.15 + ], + [ + 4376, + 0.55 + ], + [ + 4377, + 0.95 + ], + [ + 4378, + 0.95 + ], + [ + 4379, + 0.95 + ], + [ + 4380, + 0.7 + ], + [ + 4381, + 0.95 + ], + [ + 4382, + 0.95 + ], + [ + 4383, + 0.95 + ], + [ + 4384, + 0.95 + ], + [ + 4385, + 0.45 + ], + [ + 4386, + 0.15 + ], + [ + 4387, + 0.15 + ], + [ + 4388, + 0.15 + ], + [ + 4389, + 0.15 + ], + [ + 4390, + 0.15 + ], + [ + 4391, + 0.15 + ], + [ + 4392, + 0.15 + ], + [ + 4393, + 0.15 + ], + [ + 4394, + 0.15 + ], + [ + 4395, + 0.15 + ], + [ + 4396, + 0.15 + ], + [ + 4397, + 0.15 + ], + [ + 4398, + 0.15 + ], + [ + 4399, + 0.15 + ], + [ + 4400, + 0.55 + ], + [ + 4401, + 0.95 + ], + [ + 4402, + 0.95 + ], + [ + 4403, + 0.95 + ], + [ + 4404, + 0.7 + ], + [ + 4405, + 0.95 + ], + [ + 4406, + 0.95 + ], + [ + 4407, + 0.95 + ], + [ + 4408, + 0.95 + ], + [ + 4409, + 0.45 + ], + [ + 4410, + 0.15 + ], + [ + 4411, + 0.15 + ], + [ + 4412, + 0.15 + ], + [ + 4413, + 0.15 + ], + [ + 4414, + 0.15 + ], + [ + 4415, + 0.15 + ], + [ + 4416, + 0.15 + ], + [ + 4417, + 0.15 + ], + [ + 4418, + 0.15 + ], + [ + 4419, + 0.15 + ], + [ + 4420, + 0.15 + ], + [ + 4421, + 0.15 + ], + [ + 4422, + 0.15 + ], + [ + 4423, + 0.15 + ], + [ + 4424, + 0.55 + ], + [ + 4425, + 0.95 + ], + [ + 4426, + 0.95 + ], + [ + 4427, + 0.95 + ], + [ + 4428, + 0.7 + ], + [ + 4429, + 0.95 + ], + [ + 4430, + 0.95 + ], + [ + 4431, + 0.95 + ], + [ + 4432, + 0.95 + ], + [ + 4433, + 0.45 + ], + [ + 4434, + 0.15 + ], + [ + 4435, + 0.15 + ], + [ + 4436, + 0.15 + ], + [ + 4437, + 0.15 + ], + [ + 4438, + 0.15 + ], + [ + 4439, + 0.15 + ], + [ + 4440, + 0.15 + ], + [ + 4441, + 0.15 + ], + [ + 4442, + 0.15 + ], + [ + 4443, + 0.15 + ], + [ + 4444, + 0.15 + ], + [ + 4445, + 0.15 + ], + [ + 4446, + 0.15 + ], + [ + 4447, + 0.15 + ], + [ + 4448, + 0.55 + ], + [ + 4449, + 0.95 + ], + [ + 4450, + 0.95 + ], + [ + 4451, + 0.95 + ], + [ + 4452, + 0.7 + ], + [ + 4453, + 0.95 + ], + [ + 4454, + 0.95 + ], + [ + 4455, + 0.95 + ], + [ + 4456, + 0.95 + ], + [ + 4457, + 0.45 + ], + [ + 4458, + 0.15 + ], + [ + 4459, + 0.15 + ], + [ + 4460, + 0.15 + ], + [ + 4461, + 0.15 + ], + [ + 4462, + 0.15 + ], + [ + 4463, + 0.15 + ], + [ + 4464, + 0.15 + ], + [ + 4465, + 0.15 + ], + [ + 4466, + 0.15 + ], + [ + 4467, + 0.15 + ], + [ + 4468, + 0.15 + ], + [ + 4469, + 0.15 + ], + [ + 4470, + 0.15 + ], + [ + 4471, + 0.15 + ], + [ + 4472, + 0.55 + ], + [ + 4473, + 0.95 + ], + [ + 4474, + 0.95 + ], + [ + 4475, + 0.95 + ], + [ + 4476, + 0.7 + ], + [ + 4477, + 0.95 + ], + [ + 4478, + 0.95 + ], + [ + 4479, + 0.95 + ], + [ + 4480, + 0.95 + ], + [ + 4481, + 0.45 + ], + [ + 4482, + 0.15 + ], + [ + 4483, + 0.15 + ], + [ + 4484, + 0.15 + ], + [ + 4485, + 0.15 + ], + [ + 4486, + 0.15 + ], + [ + 4487, + 0.15 + ], + [ + 4488, + 0.12 + ], + [ + 4489, + 0.12 + ], + [ + 4490, + 0.12 + ], + [ + 4491, + 0.12 + ], + [ + 4492, + 0.12 + ], + [ + 4493, + 0.12 + ], + [ + 4494, + 0.12 + ], + [ + 4495, + 0.12 + ], + [ + 4496, + 0.12 + ], + [ + 4497, + 0.12 + ], + [ + 4498, + 0.2 + ], + [ + 4499, + 0.2 + ], + [ + 4500, + 0.18 + ], + [ + 4501, + 0.12 + ], + [ + 4502, + 0.12 + ], + [ + 4503, + 0.12 + ], + [ + 4504, + 0.12 + ], + [ + 4505, + 0.12 + ], + [ + 4506, + 0.12 + ], + [ + 4507, + 0.12 + ], + [ + 4508, + 0.12 + ], + [ + 4509, + 0.12 + ], + [ + 4510, + 0.12 + ], + [ + 4511, + 0.12 + ], + [ + 4512, + 0.12 + ], + [ + 4513, + 0.12 + ], + [ + 4514, + 0.12 + ], + [ + 4515, + 0.12 + ], + [ + 4516, + 0.12 + ], + [ + 4517, + 0.12 + ], + [ + 4518, + 0.12 + ], + [ + 4519, + 0.12 + ], + [ + 4520, + 0.12 + ], + [ + 4521, + 0.12 + ], + [ + 4522, + 0.2 + ], + [ + 4523, + 0.2 + ], + [ + 4524, + 0.18 + ], + [ + 4525, + 0.12 + ], + [ + 4526, + 0.12 + ], + [ + 4527, + 0.12 + ], + [ + 4528, + 0.12 + ], + [ + 4529, + 0.12 + ], + [ + 4530, + 0.12 + ], + [ + 4531, + 0.12 + ], + [ + 4532, + 0.12 + ], + [ + 4533, + 0.12 + ], + [ + 4534, + 0.12 + ], + [ + 4535, + 0.12 + ], + [ + 4536, + 0.15 + ], + [ + 4537, + 0.15 + ], + [ + 4538, + 0.15 + ], + [ + 4539, + 0.15 + ], + [ + 4540, + 0.15 + ], + [ + 4541, + 0.15 + ], + [ + 4542, + 0.15 + ], + [ + 4543, + 0.15 + ], + [ + 4544, + 0.55 + ], + [ + 4545, + 0.95 + ], + [ + 4546, + 0.95 + ], + [ + 4547, + 0.95 + ], + [ + 4548, + 0.7 + ], + [ + 4549, + 0.95 + ], + [ + 4550, + 0.95 + ], + [ + 4551, + 0.95 + ], + [ + 4552, + 0.95 + ], + [ + 4553, + 0.45 + ], + [ + 4554, + 0.15 + ], + [ + 4555, + 0.15 + ], + [ + 4556, + 0.15 + ], + [ + 4557, + 0.15 + ], + [ + 4558, + 0.15 + ], + [ + 4559, + 0.15 + ], + [ + 4560, + 0.15 + ], + [ + 4561, + 0.15 + ], + [ + 4562, + 0.15 + ], + [ + 4563, + 0.15 + ], + [ + 4564, + 0.15 + ], + [ + 4565, + 0.15 + ], + [ + 4566, + 0.15 + ], + [ + 4567, + 0.15 + ], + [ + 4568, + 0.55 + ], + [ + 4569, + 0.95 + ], + [ + 4570, + 0.95 + ], + [ + 4571, + 0.95 + ], + [ + 4572, + 0.7 + ], + [ + 4573, + 0.95 + ], + [ + 4574, + 0.95 + ], + [ + 4575, + 0.95 + ], + [ + 4576, + 0.95 + ], + [ + 4577, + 0.45 + ], + [ + 4578, + 0.15 + ], + [ + 4579, + 0.15 + ], + [ + 4580, + 0.15 + ], + [ + 4581, + 0.15 + ], + [ + 4582, + 0.15 + ], + [ + 4583, + 0.15 + ], + [ + 4584, + 0.15 + ], + [ + 4585, + 0.15 + ], + [ + 4586, + 0.15 + ], + [ + 4587, + 0.15 + ], + [ + 4588, + 0.15 + ], + [ + 4589, + 0.15 + ], + [ + 4590, + 0.15 + ], + [ + 4591, + 0.15 + ], + [ + 4592, + 0.55 + ], + [ + 4593, + 0.95 + ], + [ + 4594, + 0.95 + ], + [ + 4595, + 0.95 + ], + [ + 4596, + 0.7 + ], + [ + 4597, + 0.95 + ], + [ + 4598, + 0.95 + ], + [ + 4599, + 0.95 + ], + [ + 4600, + 0.95 + ], + [ + 4601, + 0.45 + ], + [ + 4602, + 0.15 + ], + [ + 4603, + 0.15 + ], + [ + 4604, + 0.15 + ], + [ + 4605, + 0.15 + ], + [ + 4606, + 0.15 + ], + [ + 4607, + 0.15 + ], + [ + 4608, + 0.15 + ], + [ + 4609, + 0.15 + ], + [ + 4610, + 0.15 + ], + [ + 4611, + 0.15 + ], + [ + 4612, + 0.15 + ], + [ + 4613, + 0.15 + ], + [ + 4614, + 0.15 + ], + [ + 4615, + 0.15 + ], + [ + 4616, + 0.55 + ], + [ + 4617, + 0.95 + ], + [ + 4618, + 0.95 + ], + [ + 4619, + 0.95 + ], + [ + 4620, + 0.7 + ], + [ + 4621, + 0.95 + ], + [ + 4622, + 0.95 + ], + [ + 4623, + 0.95 + ], + [ + 4624, + 0.95 + ], + [ + 4625, + 0.45 + ], + [ + 4626, + 0.15 + ], + [ + 4627, + 0.15 + ], + [ + 4628, + 0.15 + ], + [ + 4629, + 0.15 + ], + [ + 4630, + 0.15 + ], + [ + 4631, + 0.15 + ], + [ + 4632, + 0.15 + ], + [ + 4633, + 0.15 + ], + [ + 4634, + 0.15 + ], + [ + 4635, + 0.15 + ], + [ + 4636, + 0.15 + ], + [ + 4637, + 0.15 + ], + [ + 4638, + 0.15 + ], + [ + 4639, + 0.15 + ], + [ + 4640, + 0.55 + ], + [ + 4641, + 0.95 + ], + [ + 4642, + 0.95 + ], + [ + 4643, + 0.95 + ], + [ + 4644, + 0.7 + ], + [ + 4645, + 0.95 + ], + [ + 4646, + 0.95 + ], + [ + 4647, + 0.95 + ], + [ + 4648, + 0.95 + ], + [ + 4649, + 0.45 + ], + [ + 4650, + 0.15 + ], + [ + 4651, + 0.15 + ], + [ + 4652, + 0.15 + ], + [ + 4653, + 0.15 + ], + [ + 4654, + 0.15 + ], + [ + 4655, + 0.15 + ], + [ + 4656, + 0.12 + ], + [ + 4657, + 0.12 + ], + [ + 4658, + 0.12 + ], + [ + 4659, + 0.12 + ], + [ + 4660, + 0.12 + ], + [ + 4661, + 0.12 + ], + [ + 4662, + 0.12 + ], + [ + 4663, + 0.12 + ], + [ + 4664, + 0.12 + ], + [ + 4665, + 0.12 + ], + [ + 4666, + 0.2 + ], + [ + 4667, + 0.2 + ], + [ + 4668, + 0.18 + ], + [ + 4669, + 0.12 + ], + [ + 4670, + 0.12 + ], + [ + 4671, + 0.12 + ], + [ + 4672, + 0.12 + ], + [ + 4673, + 0.12 + ], + [ + 4674, + 0.12 + ], + [ + 4675, + 0.12 + ], + [ + 4676, + 0.12 + ], + [ + 4677, + 0.12 + ], + [ + 4678, + 0.12 + ], + [ + 4679, + 0.12 + ], + [ + 4680, + 0.12 + ], + [ + 4681, + 0.12 + ], + [ + 4682, + 0.12 + ], + [ + 4683, + 0.12 + ], + [ + 4684, + 0.12 + ], + [ + 4685, + 0.12 + ], + [ + 4686, + 0.12 + ], + [ + 4687, + 0.12 + ], + [ + 4688, + 0.12 + ], + [ + 4689, + 0.12 + ], + [ + 4690, + 0.2 + ], + [ + 4691, + 0.2 + ], + [ + 4692, + 0.18 + ], + [ + 4693, + 0.12 + ], + [ + 4694, + 0.12 + ], + [ + 4695, + 0.12 + ], + [ + 4696, + 0.12 + ], + [ + 4697, + 0.12 + ], + [ + 4698, + 0.12 + ], + [ + 4699, + 0.12 + ], + [ + 4700, + 0.12 + ], + [ + 4701, + 0.12 + ], + [ + 4702, + 0.12 + ], + [ + 4703, + 0.12 + ], + [ + 4704, + 0.15 + ], + [ + 4705, + 0.15 + ], + [ + 4706, + 0.15 + ], + [ + 4707, + 0.15 + ], + [ + 4708, + 0.15 + ], + [ + 4709, + 0.15 + ], + [ + 4710, + 0.15 + ], + [ + 4711, + 0.15 + ], + [ + 4712, + 0.55 + ], + [ + 4713, + 0.95 + ], + [ + 4714, + 0.95 + ], + [ + 4715, + 0.95 + ], + [ + 4716, + 0.7 + ], + [ + 4717, + 0.95 + ], + [ + 4718, + 0.95 + ], + [ + 4719, + 0.95 + ], + [ + 4720, + 0.95 + ], + [ + 4721, + 0.45 + ], + [ + 4722, + 0.15 + ], + [ + 4723, + 0.15 + ], + [ + 4724, + 0.15 + ], + [ + 4725, + 0.15 + ], + [ + 4726, + 0.15 + ], + [ + 4727, + 0.15 + ], + [ + 4728, + 0.15 + ], + [ + 4729, + 0.15 + ], + [ + 4730, + 0.15 + ], + [ + 4731, + 0.15 + ], + [ + 4732, + 0.15 + ], + [ + 4733, + 0.15 + ], + [ + 4734, + 0.15 + ], + [ + 4735, + 0.15 + ], + [ + 4736, + 0.55 + ], + [ + 4737, + 0.95 + ], + [ + 4738, + 0.95 + ], + [ + 4739, + 0.95 + ], + [ + 4740, + 0.7 + ], + [ + 4741, + 0.95 + ], + [ + 4742, + 0.95 + ], + [ + 4743, + 0.95 + ], + [ + 4744, + 0.95 + ], + [ + 4745, + 0.45 + ], + [ + 4746, + 0.15 + ], + [ + 4747, + 0.15 + ], + [ + 4748, + 0.15 + ], + [ + 4749, + 0.15 + ], + [ + 4750, + 0.15 + ], + [ + 4751, + 0.15 + ], + [ + 4752, + 0.15 + ], + [ + 4753, + 0.15 + ], + [ + 4754, + 0.15 + ], + [ + 4755, + 0.15 + ], + [ + 4756, + 0.15 + ], + [ + 4757, + 0.15 + ], + [ + 4758, + 0.15 + ], + [ + 4759, + 0.15 + ], + [ + 4760, + 0.55 + ], + [ + 4761, + 0.95 + ], + [ + 4762, + 0.95 + ], + [ + 4763, + 0.95 + ], + [ + 4764, + 0.7 + ], + [ + 4765, + 0.95 + ], + [ + 4766, + 0.95 + ], + [ + 4767, + 0.95 + ], + [ + 4768, + 0.95 + ], + [ + 4769, + 0.45 + ], + [ + 4770, + 0.15 + ], + [ + 4771, + 0.15 + ], + [ + 4772, + 0.15 + ], + [ + 4773, + 0.15 + ], + [ + 4774, + 0.15 + ], + [ + 4775, + 0.15 + ], + [ + 4776, + 0.15 + ], + [ + 4777, + 0.15 + ], + [ + 4778, + 0.15 + ], + [ + 4779, + 0.15 + ], + [ + 4780, + 0.15 + ], + [ + 4781, + 0.15 + ], + [ + 4782, + 0.15 + ], + [ + 4783, + 0.15 + ], + [ + 4784, + 0.55 + ], + [ + 4785, + 0.95 + ], + [ + 4786, + 0.95 + ], + [ + 4787, + 0.95 + ], + [ + 4788, + 0.7 + ], + [ + 4789, + 0.95 + ], + [ + 4790, + 0.95 + ], + [ + 4791, + 0.95 + ], + [ + 4792, + 0.95 + ], + [ + 4793, + 0.45 + ], + [ + 4794, + 0.15 + ], + [ + 4795, + 0.15 + ], + [ + 4796, + 0.15 + ], + [ + 4797, + 0.15 + ], + [ + 4798, + 0.15 + ], + [ + 4799, + 0.15 + ], + [ + 4800, + 0.15 + ], + [ + 4801, + 0.15 + ], + [ + 4802, + 0.15 + ], + [ + 4803, + 0.15 + ], + [ + 4804, + 0.15 + ], + [ + 4805, + 0.15 + ], + [ + 4806, + 0.15 + ], + [ + 4807, + 0.15 + ], + [ + 4808, + 0.55 + ], + [ + 4809, + 0.95 + ], + [ + 4810, + 0.95 + ], + [ + 4811, + 0.95 + ], + [ + 4812, + 0.7 + ], + [ + 4813, + 0.95 + ], + [ + 4814, + 0.95 + ], + [ + 4815, + 0.95 + ], + [ + 4816, + 0.95 + ], + [ + 4817, + 0.45 + ], + [ + 4818, + 0.15 + ], + [ + 4819, + 0.15 + ], + [ + 4820, + 0.15 + ], + [ + 4821, + 0.15 + ], + [ + 4822, + 0.15 + ], + [ + 4823, + 0.15 + ], + [ + 4824, + 0.12 + ], + [ + 4825, + 0.12 + ], + [ + 4826, + 0.12 + ], + [ + 4827, + 0.12 + ], + [ + 4828, + 0.12 + ], + [ + 4829, + 0.12 + ], + [ + 4830, + 0.12 + ], + [ + 4831, + 0.12 + ], + [ + 4832, + 0.12 + ], + [ + 4833, + 0.12 + ], + [ + 4834, + 0.2 + ], + [ + 4835, + 0.2 + ], + [ + 4836, + 0.18 + ], + [ + 4837, + 0.12 + ], + [ + 4838, + 0.12 + ], + [ + 4839, + 0.12 + ], + [ + 4840, + 0.12 + ], + [ + 4841, + 0.12 + ], + [ + 4842, + 0.12 + ], + [ + 4843, + 0.12 + ], + [ + 4844, + 0.12 + ], + [ + 4845, + 0.12 + ], + [ + 4846, + 0.12 + ], + [ + 4847, + 0.12 + ], + [ + 4848, + 0.12 + ], + [ + 4849, + 0.12 + ], + [ + 4850, + 0.12 + ], + [ + 4851, + 0.12 + ], + [ + 4852, + 0.12 + ], + [ + 4853, + 0.12 + ], + [ + 4854, + 0.12 + ], + [ + 4855, + 0.12 + ], + [ + 4856, + 0.12 + ], + [ + 4857, + 0.12 + ], + [ + 4858, + 0.2 + ], + [ + 4859, + 0.2 + ], + [ + 4860, + 0.18 + ], + [ + 4861, + 0.12 + ], + [ + 4862, + 0.12 + ], + [ + 4863, + 0.12 + ], + [ + 4864, + 0.12 + ], + [ + 4865, + 0.12 + ], + [ + 4866, + 0.12 + ], + [ + 4867, + 0.12 + ], + [ + 4868, + 0.12 + ], + [ + 4869, + 0.12 + ], + [ + 4870, + 0.12 + ], + [ + 4871, + 0.12 + ], + [ + 4872, + 0.15 + ], + [ + 4873, + 0.15 + ], + [ + 4874, + 0.15 + ], + [ + 4875, + 0.15 + ], + [ + 4876, + 0.15 + ], + [ + 4877, + 0.15 + ], + [ + 4878, + 0.15 + ], + [ + 4879, + 0.15 + ], + [ + 4880, + 0.55 + ], + [ + 4881, + 0.95 + ], + [ + 4882, + 0.95 + ], + [ + 4883, + 0.95 + ], + [ + 4884, + 0.7 + ], + [ + 4885, + 0.95 + ], + [ + 4886, + 0.95 + ], + [ + 4887, + 0.95 + ], + [ + 4888, + 0.95 + ], + [ + 4889, + 0.45 + ], + [ + 4890, + 0.15 + ], + [ + 4891, + 0.15 + ], + [ + 4892, + 0.15 + ], + [ + 4893, + 0.15 + ], + [ + 4894, + 0.15 + ], + [ + 4895, + 0.15 + ], + [ + 4896, + 0.15 + ], + [ + 4897, + 0.15 + ], + [ + 4898, + 0.15 + ], + [ + 4899, + 0.15 + ], + [ + 4900, + 0.15 + ], + [ + 4901, + 0.15 + ], + [ + 4902, + 0.15 + ], + [ + 4903, + 0.15 + ], + [ + 4904, + 0.55 + ], + [ + 4905, + 0.95 + ], + [ + 4906, + 0.95 + ], + [ + 4907, + 0.95 + ], + [ + 4908, + 0.7 + ], + [ + 4909, + 0.95 + ], + [ + 4910, + 0.95 + ], + [ + 4911, + 0.95 + ], + [ + 4912, + 0.95 + ], + [ + 4913, + 0.45 + ], + [ + 4914, + 0.15 + ], + [ + 4915, + 0.15 + ], + [ + 4916, + 0.15 + ], + [ + 4917, + 0.15 + ], + [ + 4918, + 0.15 + ], + [ + 4919, + 0.15 + ], + [ + 4920, + 0.15 + ], + [ + 4921, + 0.15 + ], + [ + 4922, + 0.15 + ], + [ + 4923, + 0.15 + ], + [ + 4924, + 0.15 + ], + [ + 4925, + 0.15 + ], + [ + 4926, + 0.15 + ], + [ + 4927, + 0.15 + ], + [ + 4928, + 0.55 + ], + [ + 4929, + 0.95 + ], + [ + 4930, + 0.95 + ], + [ + 4931, + 0.95 + ], + [ + 4932, + 0.7 + ], + [ + 4933, + 0.95 + ], + [ + 4934, + 0.95 + ], + [ + 4935, + 0.95 + ], + [ + 4936, + 0.95 + ], + [ + 4937, + 0.45 + ], + [ + 4938, + 0.15 + ], + [ + 4939, + 0.15 + ], + [ + 4940, + 0.15 + ], + [ + 4941, + 0.15 + ], + [ + 4942, + 0.15 + ], + [ + 4943, + 0.15 + ], + [ + 4944, + 0.15 + ], + [ + 4945, + 0.15 + ], + [ + 4946, + 0.15 + ], + [ + 4947, + 0.15 + ], + [ + 4948, + 0.15 + ], + [ + 4949, + 0.15 + ], + [ + 4950, + 0.15 + ], + [ + 4951, + 0.15 + ], + [ + 4952, + 0.55 + ], + [ + 4953, + 0.95 + ], + [ + 4954, + 0.95 + ], + [ + 4955, + 0.95 + ], + [ + 4956, + 0.7 + ], + [ + 4957, + 0.95 + ], + [ + 4958, + 0.95 + ], + [ + 4959, + 0.95 + ], + [ + 4960, + 0.95 + ], + [ + 4961, + 0.45 + ], + [ + 4962, + 0.15 + ], + [ + 4963, + 0.15 + ], + [ + 4964, + 0.15 + ], + [ + 4965, + 0.15 + ], + [ + 4966, + 0.15 + ], + [ + 4967, + 0.15 + ], + [ + 4968, + 0.15 + ], + [ + 4969, + 0.15 + ], + [ + 4970, + 0.15 + ], + [ + 4971, + 0.15 + ], + [ + 4972, + 0.15 + ], + [ + 4973, + 0.15 + ], + [ + 4974, + 0.15 + ], + [ + 4975, + 0.15 + ], + [ + 4976, + 0.55 + ], + [ + 4977, + 0.95 + ], + [ + 4978, + 0.95 + ], + [ + 4979, + 0.95 + ], + [ + 4980, + 0.7 + ], + [ + 4981, + 0.95 + ], + [ + 4982, + 0.95 + ], + [ + 4983, + 0.95 + ], + [ + 4984, + 0.95 + ], + [ + 4985, + 0.45 + ], + [ + 4986, + 0.15 + ], + [ + 4987, + 0.15 + ], + [ + 4988, + 0.15 + ], + [ + 4989, + 0.15 + ], + [ + 4990, + 0.15 + ], + [ + 4991, + 0.15 + ], + [ + 4992, + 0.12 + ], + [ + 4993, + 0.12 + ], + [ + 4994, + 0.12 + ], + [ + 4995, + 0.12 + ], + [ + 4996, + 0.12 + ], + [ + 4997, + 0.12 + ], + [ + 4998, + 0.12 + ], + [ + 4999, + 0.12 + ], + [ + 5000, + 0.12 + ], + [ + 5001, + 0.12 + ], + [ + 5002, + 0.2 + ], + [ + 5003, + 0.2 + ], + [ + 5004, + 0.18 + ], + [ + 5005, + 0.12 + ], + [ + 5006, + 0.12 + ], + [ + 5007, + 0.12 + ], + [ + 5008, + 0.12 + ], + [ + 5009, + 0.12 + ], + [ + 5010, + 0.12 + ], + [ + 5011, + 0.12 + ], + [ + 5012, + 0.12 + ], + [ + 5013, + 0.12 + ], + [ + 5014, + 0.12 + ], + [ + 5015, + 0.12 + ], + [ + 5016, + 0.12 + ], + [ + 5017, + 0.12 + ], + [ + 5018, + 0.12 + ], + [ + 5019, + 0.12 + ], + [ + 5020, + 0.12 + ], + [ + 5021, + 0.12 + ], + [ + 5022, + 0.12 + ], + [ + 5023, + 0.12 + ], + [ + 5024, + 0.12 + ], + [ + 5025, + 0.12 + ], + [ + 5026, + 0.2 + ], + [ + 5027, + 0.2 + ], + [ + 5028, + 0.18 + ], + [ + 5029, + 0.12 + ], + [ + 5030, + 0.12 + ], + [ + 5031, + 0.12 + ], + [ + 5032, + 0.12 + ], + [ + 5033, + 0.12 + ], + [ + 5034, + 0.12 + ], + [ + 5035, + 0.12 + ], + [ + 5036, + 0.12 + ], + [ + 5037, + 0.12 + ], + [ + 5038, + 0.12 + ], + [ + 5039, + 0.12 + ], + [ + 5040, + 0.15 + ], + [ + 5041, + 0.15 + ], + [ + 5042, + 0.15 + ], + [ + 5043, + 0.15 + ], + [ + 5044, + 0.15 + ], + [ + 5045, + 0.15 + ], + [ + 5046, + 0.15 + ], + [ + 5047, + 0.15 + ], + [ + 5048, + 0.55 + ], + [ + 5049, + 0.95 + ], + [ + 5050, + 0.95 + ], + [ + 5051, + 0.95 + ], + [ + 5052, + 0.7 + ], + [ + 5053, + 0.95 + ], + [ + 5054, + 0.95 + ], + [ + 5055, + 0.95 + ], + [ + 5056, + 0.95 + ], + [ + 5057, + 0.45 + ], + [ + 5058, + 0.15 + ], + [ + 5059, + 0.15 + ], + [ + 5060, + 0.15 + ], + [ + 5061, + 0.15 + ], + [ + 5062, + 0.15 + ], + [ + 5063, + 0.15 + ], + [ + 5064, + 0.15 + ], + [ + 5065, + 0.15 + ], + [ + 5066, + 0.15 + ], + [ + 5067, + 0.15 + ], + [ + 5068, + 0.15 + ], + [ + 5069, + 0.15 + ], + [ + 5070, + 0.15 + ], + [ + 5071, + 0.15 + ], + [ + 5072, + 0.55 + ], + [ + 5073, + 0.95 + ], + [ + 5074, + 0.95 + ], + [ + 5075, + 0.95 + ], + [ + 5076, + 0.7 + ], + [ + 5077, + 0.95 + ], + [ + 5078, + 0.95 + ], + [ + 5079, + 0.95 + ], + [ + 5080, + 0.95 + ], + [ + 5081, + 0.45 + ], + [ + 5082, + 0.15 + ], + [ + 5083, + 0.15 + ], + [ + 5084, + 0.15 + ], + [ + 5085, + 0.15 + ], + [ + 5086, + 0.15 + ], + [ + 5087, + 0.15 + ], + [ + 5088, + 0.15 + ], + [ + 5089, + 0.15 + ], + [ + 5090, + 0.15 + ], + [ + 5091, + 0.15 + ], + [ + 5092, + 0.15 + ], + [ + 5093, + 0.15 + ], + [ + 5094, + 0.15 + ], + [ + 5095, + 0.15 + ], + [ + 5096, + 0.55 + ], + [ + 5097, + 0.95 + ], + [ + 5098, + 0.95 + ], + [ + 5099, + 0.95 + ], + [ + 5100, + 0.7 + ], + [ + 5101, + 0.95 + ], + [ + 5102, + 0.95 + ], + [ + 5103, + 0.95 + ], + [ + 5104, + 0.95 + ], + [ + 5105, + 0.45 + ], + [ + 5106, + 0.15 + ], + [ + 5107, + 0.15 + ], + [ + 5108, + 0.15 + ], + [ + 5109, + 0.15 + ], + [ + 5110, + 0.15 + ], + [ + 5111, + 0.15 + ], + [ + 5112, + 0.15 + ], + [ + 5113, + 0.15 + ], + [ + 5114, + 0.15 + ], + [ + 5115, + 0.15 + ], + [ + 5116, + 0.15 + ], + [ + 5117, + 0.15 + ], + [ + 5118, + 0.15 + ], + [ + 5119, + 0.15 + ], + [ + 5120, + 0.55 + ], + [ + 5121, + 0.95 + ], + [ + 5122, + 0.95 + ], + [ + 5123, + 0.95 + ], + [ + 5124, + 0.7 + ], + [ + 5125, + 0.95 + ], + [ + 5126, + 0.95 + ], + [ + 5127, + 0.95 + ], + [ + 5128, + 0.95 + ], + [ + 5129, + 0.45 + ], + [ + 5130, + 0.15 + ], + [ + 5131, + 0.15 + ], + [ + 5132, + 0.15 + ], + [ + 5133, + 0.15 + ], + [ + 5134, + 0.15 + ], + [ + 5135, + 0.15 + ], + [ + 5136, + 0.15 + ], + [ + 5137, + 0.15 + ], + [ + 5138, + 0.15 + ], + [ + 5139, + 0.15 + ], + [ + 5140, + 0.15 + ], + [ + 5141, + 0.15 + ], + [ + 5142, + 0.15 + ], + [ + 5143, + 0.15 + ], + [ + 5144, + 0.55 + ], + [ + 5145, + 0.95 + ], + [ + 5146, + 0.95 + ], + [ + 5147, + 0.95 + ], + [ + 5148, + 0.7 + ], + [ + 5149, + 0.95 + ], + [ + 5150, + 0.95 + ], + [ + 5151, + 0.95 + ], + [ + 5152, + 0.95 + ], + [ + 5153, + 0.45 + ], + [ + 5154, + 0.15 + ], + [ + 5155, + 0.15 + ], + [ + 5156, + 0.15 + ], + [ + 5157, + 0.15 + ], + [ + 5158, + 0.15 + ], + [ + 5159, + 0.15 + ], + [ + 5160, + 0.12 + ], + [ + 5161, + 0.12 + ], + [ + 5162, + 0.12 + ], + [ + 5163, + 0.12 + ], + [ + 5164, + 0.12 + ], + [ + 5165, + 0.12 + ], + [ + 5166, + 0.12 + ], + [ + 5167, + 0.12 + ], + [ + 5168, + 0.12 + ], + [ + 5169, + 0.12 + ], + [ + 5170, + 0.2 + ], + [ + 5171, + 0.2 + ], + [ + 5172, + 0.18 + ], + [ + 5173, + 0.12 + ], + [ + 5174, + 0.12 + ], + [ + 5175, + 0.12 + ], + [ + 5176, + 0.12 + ], + [ + 5177, + 0.12 + ], + [ + 5178, + 0.12 + ], + [ + 5179, + 0.12 + ], + [ + 5180, + 0.12 + ], + [ + 5181, + 0.12 + ], + [ + 5182, + 0.12 + ], + [ + 5183, + 0.12 + ], + [ + 5184, + 0.12 + ], + [ + 5185, + 0.12 + ], + [ + 5186, + 0.12 + ], + [ + 5187, + 0.12 + ], + [ + 5188, + 0.12 + ], + [ + 5189, + 0.12 + ], + [ + 5190, + 0.12 + ], + [ + 5191, + 0.12 + ], + [ + 5192, + 0.12 + ], + [ + 5193, + 0.12 + ], + [ + 5194, + 0.2 + ], + [ + 5195, + 0.2 + ], + [ + 5196, + 0.18 + ], + [ + 5197, + 0.12 + ], + [ + 5198, + 0.12 + ], + [ + 5199, + 0.12 + ], + [ + 5200, + 0.12 + ], + [ + 5201, + 0.12 + ], + [ + 5202, + 0.12 + ], + [ + 5203, + 0.12 + ], + [ + 5204, + 0.12 + ], + [ + 5205, + 0.12 + ], + [ + 5206, + 0.12 + ], + [ + 5207, + 0.12 + ], + [ + 5208, + 0.15 + ], + [ + 5209, + 0.15 + ], + [ + 5210, + 0.15 + ], + [ + 5211, + 0.15 + ], + [ + 5212, + 0.15 + ], + [ + 5213, + 0.15 + ], + [ + 5214, + 0.15 + ], + [ + 5215, + 0.15 + ], + [ + 5216, + 0.55 + ], + [ + 5217, + 0.95 + ], + [ + 5218, + 0.95 + ], + [ + 5219, + 0.95 + ], + [ + 5220, + 0.7 + ], + [ + 5221, + 0.95 + ], + [ + 5222, + 0.95 + ], + [ + 5223, + 0.95 + ], + [ + 5224, + 0.95 + ], + [ + 5225, + 0.45 + ], + [ + 5226, + 0.15 + ], + [ + 5227, + 0.15 + ], + [ + 5228, + 0.15 + ], + [ + 5229, + 0.15 + ], + [ + 5230, + 0.15 + ], + [ + 5231, + 0.15 + ], + [ + 5232, + 0.15 + ], + [ + 5233, + 0.15 + ], + [ + 5234, + 0.15 + ], + [ + 5235, + 0.15 + ], + [ + 5236, + 0.15 + ], + [ + 5237, + 0.15 + ], + [ + 5238, + 0.15 + ], + [ + 5239, + 0.15 + ], + [ + 5240, + 0.55 + ], + [ + 5241, + 0.95 + ], + [ + 5242, + 0.95 + ], + [ + 5243, + 0.95 + ], + [ + 5244, + 0.7 + ], + [ + 5245, + 0.95 + ], + [ + 5246, + 0.95 + ], + [ + 5247, + 0.95 + ], + [ + 5248, + 0.95 + ], + [ + 5249, + 0.45 + ], + [ + 5250, + 0.15 + ], + [ + 5251, + 0.15 + ], + [ + 5252, + 0.15 + ], + [ + 5253, + 0.15 + ], + [ + 5254, + 0.15 + ], + [ + 5255, + 0.15 + ], + [ + 5256, + 0.15 + ], + [ + 5257, + 0.15 + ], + [ + 5258, + 0.15 + ], + [ + 5259, + 0.15 + ], + [ + 5260, + 0.15 + ], + [ + 5261, + 0.15 + ], + [ + 5262, + 0.15 + ], + [ + 5263, + 0.15 + ], + [ + 5264, + 0.55 + ], + [ + 5265, + 0.95 + ], + [ + 5266, + 0.95 + ], + [ + 5267, + 0.95 + ], + [ + 5268, + 0.7 + ], + [ + 5269, + 0.95 + ], + [ + 5270, + 0.95 + ], + [ + 5271, + 0.95 + ], + [ + 5272, + 0.95 + ], + [ + 5273, + 0.45 + ], + [ + 5274, + 0.15 + ], + [ + 5275, + 0.15 + ], + [ + 5276, + 0.15 + ], + [ + 5277, + 0.15 + ], + [ + 5278, + 0.15 + ], + [ + 5279, + 0.15 + ], + [ + 5280, + 0.15 + ], + [ + 5281, + 0.15 + ], + [ + 5282, + 0.15 + ], + [ + 5283, + 0.15 + ], + [ + 5284, + 0.15 + ], + [ + 5285, + 0.15 + ], + [ + 5286, + 0.15 + ], + [ + 5287, + 0.15 + ], + [ + 5288, + 0.55 + ], + [ + 5289, + 0.95 + ], + [ + 5290, + 0.95 + ], + [ + 5291, + 0.95 + ], + [ + 5292, + 0.7 + ], + [ + 5293, + 0.95 + ], + [ + 5294, + 0.95 + ], + [ + 5295, + 0.95 + ], + [ + 5296, + 0.95 + ], + [ + 5297, + 0.45 + ], + [ + 5298, + 0.15 + ], + [ + 5299, + 0.15 + ], + [ + 5300, + 0.15 + ], + [ + 5301, + 0.15 + ], + [ + 5302, + 0.15 + ], + [ + 5303, + 0.15 + ], + [ + 5304, + 0.15 + ], + [ + 5305, + 0.15 + ], + [ + 5306, + 0.15 + ], + [ + 5307, + 0.15 + ], + [ + 5308, + 0.15 + ], + [ + 5309, + 0.15 + ], + [ + 5310, + 0.15 + ], + [ + 5311, + 0.15 + ], + [ + 5312, + 0.55 + ], + [ + 5313, + 0.95 + ], + [ + 5314, + 0.95 + ], + [ + 5315, + 0.95 + ], + [ + 5316, + 0.7 + ], + [ + 5317, + 0.95 + ], + [ + 5318, + 0.95 + ], + [ + 5319, + 0.95 + ], + [ + 5320, + 0.95 + ], + [ + 5321, + 0.45 + ], + [ + 5322, + 0.15 + ], + [ + 5323, + 0.15 + ], + [ + 5324, + 0.15 + ], + [ + 5325, + 0.15 + ], + [ + 5326, + 0.15 + ], + [ + 5327, + 0.15 + ], + [ + 5328, + 0.12 + ], + [ + 5329, + 0.12 + ], + [ + 5330, + 0.12 + ], + [ + 5331, + 0.12 + ], + [ + 5332, + 0.12 + ], + [ + 5333, + 0.12 + ], + [ + 5334, + 0.12 + ], + [ + 5335, + 0.12 + ], + [ + 5336, + 0.12 + ], + [ + 5337, + 0.12 + ], + [ + 5338, + 0.2 + ], + [ + 5339, + 0.2 + ], + [ + 5340, + 0.18 + ], + [ + 5341, + 0.12 + ], + [ + 5342, + 0.12 + ], + [ + 5343, + 0.12 + ], + [ + 5344, + 0.12 + ], + [ + 5345, + 0.12 + ], + [ + 5346, + 0.12 + ], + [ + 5347, + 0.12 + ], + [ + 5348, + 0.12 + ], + [ + 5349, + 0.12 + ], + [ + 5350, + 0.12 + ], + [ + 5351, + 0.12 + ], + [ + 5352, + 0.12 + ], + [ + 5353, + 0.12 + ], + [ + 5354, + 0.12 + ], + [ + 5355, + 0.12 + ], + [ + 5356, + 0.12 + ], + [ + 5357, + 0.12 + ], + [ + 5358, + 0.12 + ], + [ + 5359, + 0.12 + ], + [ + 5360, + 0.12 + ], + [ + 5361, + 0.12 + ], + [ + 5362, + 0.2 + ], + [ + 5363, + 0.2 + ], + [ + 5364, + 0.18 + ], + [ + 5365, + 0.12 + ], + [ + 5366, + 0.12 + ], + [ + 5367, + 0.12 + ], + [ + 5368, + 0.12 + ], + [ + 5369, + 0.12 + ], + [ + 5370, + 0.12 + ], + [ + 5371, + 0.12 + ], + [ + 5372, + 0.12 + ], + [ + 5373, + 0.12 + ], + [ + 5374, + 0.12 + ], + [ + 5375, + 0.12 + ], + [ + 5376, + 0.15 + ], + [ + 5377, + 0.15 + ], + [ + 5378, + 0.15 + ], + [ + 5379, + 0.15 + ], + [ + 5380, + 0.15 + ], + [ + 5381, + 0.15 + ], + [ + 5382, + 0.15 + ], + [ + 5383, + 0.15 + ], + [ + 5384, + 0.55 + ], + [ + 5385, + 0.95 + ], + [ + 5386, + 0.95 + ], + [ + 5387, + 0.95 + ], + [ + 5388, + 0.7 + ], + [ + 5389, + 0.95 + ], + [ + 5390, + 0.95 + ], + [ + 5391, + 0.95 + ], + [ + 5392, + 0.95 + ], + [ + 5393, + 0.45 + ], + [ + 5394, + 0.15 + ], + [ + 5395, + 0.15 + ], + [ + 5396, + 0.15 + ], + [ + 5397, + 0.15 + ], + [ + 5398, + 0.15 + ], + [ + 5399, + 0.15 + ], + [ + 5400, + 0.15 + ], + [ + 5401, + 0.15 + ], + [ + 5402, + 0.15 + ], + [ + 5403, + 0.15 + ], + [ + 5404, + 0.15 + ], + [ + 5405, + 0.15 + ], + [ + 5406, + 0.15 + ], + [ + 5407, + 0.15 + ], + [ + 5408, + 0.55 + ], + [ + 5409, + 0.95 + ], + [ + 5410, + 0.95 + ], + [ + 5411, + 0.95 + ], + [ + 5412, + 0.7 + ], + [ + 5413, + 0.95 + ], + [ + 5414, + 0.95 + ], + [ + 5415, + 0.95 + ], + [ + 5416, + 0.95 + ], + [ + 5417, + 0.45 + ], + [ + 5418, + 0.15 + ], + [ + 5419, + 0.15 + ], + [ + 5420, + 0.15 + ], + [ + 5421, + 0.15 + ], + [ + 5422, + 0.15 + ], + [ + 5423, + 0.15 + ], + [ + 5424, + 0.15 + ], + [ + 5425, + 0.15 + ], + [ + 5426, + 0.15 + ], + [ + 5427, + 0.15 + ], + [ + 5428, + 0.15 + ], + [ + 5429, + 0.15 + ], + [ + 5430, + 0.15 + ], + [ + 5431, + 0.15 + ], + [ + 5432, + 0.55 + ], + [ + 5433, + 0.95 + ], + [ + 5434, + 0.95 + ], + [ + 5435, + 0.95 + ], + [ + 5436, + 0.7 + ], + [ + 5437, + 0.95 + ], + [ + 5438, + 0.95 + ], + [ + 5439, + 0.95 + ], + [ + 5440, + 0.95 + ], + [ + 5441, + 0.45 + ], + [ + 5442, + 0.15 + ], + [ + 5443, + 0.15 + ], + [ + 5444, + 0.15 + ], + [ + 5445, + 0.15 + ], + [ + 5446, + 0.15 + ], + [ + 5447, + 0.15 + ], + [ + 5448, + 0.15 + ], + [ + 5449, + 0.15 + ], + [ + 5450, + 0.15 + ], + [ + 5451, + 0.15 + ], + [ + 5452, + 0.15 + ], + [ + 5453, + 0.15 + ], + [ + 5454, + 0.15 + ], + [ + 5455, + 0.15 + ], + [ + 5456, + 0.55 + ], + [ + 5457, + 0.95 + ], + [ + 5458, + 0.95 + ], + [ + 5459, + 0.95 + ], + [ + 5460, + 0.7 + ], + [ + 5461, + 0.95 + ], + [ + 5462, + 0.95 + ], + [ + 5463, + 0.95 + ], + [ + 5464, + 0.95 + ], + [ + 5465, + 0.45 + ], + [ + 5466, + 0.15 + ], + [ + 5467, + 0.15 + ], + [ + 5468, + 0.15 + ], + [ + 5469, + 0.15 + ], + [ + 5470, + 0.15 + ], + [ + 5471, + 0.15 + ], + [ + 5472, + 0.15 + ], + [ + 5473, + 0.15 + ], + [ + 5474, + 0.15 + ], + [ + 5475, + 0.15 + ], + [ + 5476, + 0.15 + ], + [ + 5477, + 0.15 + ], + [ + 5478, + 0.15 + ], + [ + 5479, + 0.15 + ], + [ + 5480, + 0.55 + ], + [ + 5481, + 0.95 + ], + [ + 5482, + 0.95 + ], + [ + 5483, + 0.95 + ], + [ + 5484, + 0.7 + ], + [ + 5485, + 0.95 + ], + [ + 5486, + 0.95 + ], + [ + 5487, + 0.95 + ], + [ + 5488, + 0.95 + ], + [ + 5489, + 0.45 + ], + [ + 5490, + 0.15 + ], + [ + 5491, + 0.15 + ], + [ + 5492, + 0.15 + ], + [ + 5493, + 0.15 + ], + [ + 5494, + 0.15 + ], + [ + 5495, + 0.15 + ], + [ + 5496, + 0.12 + ], + [ + 5497, + 0.12 + ], + [ + 5498, + 0.12 + ], + [ + 5499, + 0.12 + ], + [ + 5500, + 0.12 + ], + [ + 5501, + 0.12 + ], + [ + 5502, + 0.12 + ], + [ + 5503, + 0.12 + ], + [ + 5504, + 0.12 + ], + [ + 5505, + 0.12 + ], + [ + 5506, + 0.2 + ], + [ + 5507, + 0.2 + ], + [ + 5508, + 0.18 + ], + [ + 5509, + 0.12 + ], + [ + 5510, + 0.12 + ], + [ + 5511, + 0.12 + ], + [ + 5512, + 0.12 + ], + [ + 5513, + 0.12 + ], + [ + 5514, + 0.12 + ], + [ + 5515, + 0.12 + ], + [ + 5516, + 0.12 + ], + [ + 5517, + 0.12 + ], + [ + 5518, + 0.12 + ], + [ + 5519, + 0.12 + ], + [ + 5520, + 0.12 + ], + [ + 5521, + 0.12 + ], + [ + 5522, + 0.12 + ], + [ + 5523, + 0.12 + ], + [ + 5524, + 0.12 + ], + [ + 5525, + 0.12 + ], + [ + 5526, + 0.12 + ], + [ + 5527, + 0.12 + ], + [ + 5528, + 0.12 + ], + [ + 5529, + 0.12 + ], + [ + 5530, + 0.2 + ], + [ + 5531, + 0.2 + ], + [ + 5532, + 0.18 + ], + [ + 5533, + 0.12 + ], + [ + 5534, + 0.12 + ], + [ + 5535, + 0.12 + ], + [ + 5536, + 0.12 + ], + [ + 5537, + 0.12 + ], + [ + 5538, + 0.12 + ], + [ + 5539, + 0.12 + ], + [ + 5540, + 0.12 + ], + [ + 5541, + 0.12 + ], + [ + 5542, + 0.12 + ], + [ + 5543, + 0.12 + ], + [ + 5544, + 0.15 + ], + [ + 5545, + 0.15 + ], + [ + 5546, + 0.15 + ], + [ + 5547, + 0.15 + ], + [ + 5548, + 0.15 + ], + [ + 5549, + 0.15 + ], + [ + 5550, + 0.15 + ], + [ + 5551, + 0.15 + ], + [ + 5552, + 0.55 + ], + [ + 5553, + 0.95 + ], + [ + 5554, + 0.95 + ], + [ + 5555, + 0.95 + ], + [ + 5556, + 0.7 + ], + [ + 5557, + 0.95 + ], + [ + 5558, + 0.95 + ], + [ + 5559, + 0.95 + ], + [ + 5560, + 0.95 + ], + [ + 5561, + 0.45 + ], + [ + 5562, + 0.15 + ], + [ + 5563, + 0.15 + ], + [ + 5564, + 0.15 + ], + [ + 5565, + 0.15 + ], + [ + 5566, + 0.15 + ], + [ + 5567, + 0.15 + ], + [ + 5568, + 0.15 + ], + [ + 5569, + 0.15 + ], + [ + 5570, + 0.15 + ], + [ + 5571, + 0.15 + ], + [ + 5572, + 0.15 + ], + [ + 5573, + 0.15 + ], + [ + 5574, + 0.15 + ], + [ + 5575, + 0.15 + ], + [ + 5576, + 0.55 + ], + [ + 5577, + 0.95 + ], + [ + 5578, + 0.95 + ], + [ + 5579, + 0.95 + ], + [ + 5580, + 0.7 + ], + [ + 5581, + 0.95 + ], + [ + 5582, + 0.95 + ], + [ + 5583, + 0.95 + ], + [ + 5584, + 0.95 + ], + [ + 5585, + 0.45 + ], + [ + 5586, + 0.15 + ], + [ + 5587, + 0.15 + ], + [ + 5588, + 0.15 + ], + [ + 5589, + 0.15 + ], + [ + 5590, + 0.15 + ], + [ + 5591, + 0.15 + ], + [ + 5592, + 0.15 + ], + [ + 5593, + 0.15 + ], + [ + 5594, + 0.15 + ], + [ + 5595, + 0.15 + ], + [ + 5596, + 0.15 + ], + [ + 5597, + 0.15 + ], + [ + 5598, + 0.15 + ], + [ + 5599, + 0.15 + ], + [ + 5600, + 0.55 + ], + [ + 5601, + 0.95 + ], + [ + 5602, + 0.95 + ], + [ + 5603, + 0.95 + ], + [ + 5604, + 0.7 + ], + [ + 5605, + 0.95 + ], + [ + 5606, + 0.95 + ], + [ + 5607, + 0.95 + ], + [ + 5608, + 0.95 + ], + [ + 5609, + 0.45 + ], + [ + 5610, + 0.15 + ], + [ + 5611, + 0.15 + ], + [ + 5612, + 0.15 + ], + [ + 5613, + 0.15 + ], + [ + 5614, + 0.15 + ], + [ + 5615, + 0.15 + ], + [ + 5616, + 0.15 + ], + [ + 5617, + 0.15 + ], + [ + 5618, + 0.15 + ], + [ + 5619, + 0.15 + ], + [ + 5620, + 0.15 + ], + [ + 5621, + 0.15 + ], + [ + 5622, + 0.15 + ], + [ + 5623, + 0.15 + ], + [ + 5624, + 0.55 + ], + [ + 5625, + 0.95 + ], + [ + 5626, + 0.95 + ], + [ + 5627, + 0.95 + ], + [ + 5628, + 0.7 + ], + [ + 5629, + 0.95 + ], + [ + 5630, + 0.95 + ], + [ + 5631, + 0.95 + ], + [ + 5632, + 0.95 + ], + [ + 5633, + 0.45 + ], + [ + 5634, + 0.15 + ], + [ + 5635, + 0.15 + ], + [ + 5636, + 0.15 + ], + [ + 5637, + 0.15 + ], + [ + 5638, + 0.15 + ], + [ + 5639, + 0.15 + ], + [ + 5640, + 0.15 + ], + [ + 5641, + 0.15 + ], + [ + 5642, + 0.15 + ], + [ + 5643, + 0.15 + ], + [ + 5644, + 0.15 + ], + [ + 5645, + 0.15 + ], + [ + 5646, + 0.15 + ], + [ + 5647, + 0.15 + ], + [ + 5648, + 0.55 + ], + [ + 5649, + 0.95 + ], + [ + 5650, + 0.95 + ], + [ + 5651, + 0.95 + ], + [ + 5652, + 0.7 + ], + [ + 5653, + 0.95 + ], + [ + 5654, + 0.95 + ], + [ + 5655, + 0.95 + ], + [ + 5656, + 0.95 + ], + [ + 5657, + 0.45 + ], + [ + 5658, + 0.15 + ], + [ + 5659, + 0.15 + ], + [ + 5660, + 0.15 + ], + [ + 5661, + 0.15 + ], + [ + 5662, + 0.15 + ], + [ + 5663, + 0.15 + ], + [ + 5664, + 0.12 + ], + [ + 5665, + 0.12 + ], + [ + 5666, + 0.12 + ], + [ + 5667, + 0.12 + ], + [ + 5668, + 0.12 + ], + [ + 5669, + 0.12 + ], + [ + 5670, + 0.12 + ], + [ + 5671, + 0.12 + ], + [ + 5672, + 0.12 + ], + [ + 5673, + 0.12 + ], + [ + 5674, + 0.2 + ], + [ + 5675, + 0.2 + ], + [ + 5676, + 0.18 + ], + [ + 5677, + 0.12 + ], + [ + 5678, + 0.12 + ], + [ + 5679, + 0.12 + ], + [ + 5680, + 0.12 + ], + [ + 5681, + 0.12 + ], + [ + 5682, + 0.12 + ], + [ + 5683, + 0.12 + ], + [ + 5684, + 0.12 + ], + [ + 5685, + 0.12 + ], + [ + 5686, + 0.12 + ], + [ + 5687, + 0.12 + ], + [ + 5688, + 0.12 + ], + [ + 5689, + 0.12 + ], + [ + 5690, + 0.12 + ], + [ + 5691, + 0.12 + ], + [ + 5692, + 0.12 + ], + [ + 5693, + 0.12 + ], + [ + 5694, + 0.12 + ], + [ + 5695, + 0.12 + ], + [ + 5696, + 0.12 + ], + [ + 5697, + 0.12 + ], + [ + 5698, + 0.2 + ], + [ + 5699, + 0.2 + ], + [ + 5700, + 0.18 + ], + [ + 5701, + 0.12 + ], + [ + 5702, + 0.12 + ], + [ + 5703, + 0.12 + ], + [ + 5704, + 0.12 + ], + [ + 5705, + 0.12 + ], + [ + 5706, + 0.12 + ], + [ + 5707, + 0.12 + ], + [ + 5708, + 0.12 + ], + [ + 5709, + 0.12 + ], + [ + 5710, + 0.12 + ], + [ + 5711, + 0.12 + ], + [ + 5712, + 0.15 + ], + [ + 5713, + 0.15 + ], + [ + 5714, + 0.15 + ], + [ + 5715, + 0.15 + ], + [ + 5716, + 0.15 + ], + [ + 5717, + 0.15 + ], + [ + 5718, + 0.15 + ], + [ + 5719, + 0.15 + ], + [ + 5720, + 0.55 + ], + [ + 5721, + 0.95 + ], + [ + 5722, + 0.95 + ], + [ + 5723, + 0.95 + ], + [ + 5724, + 0.7 + ], + [ + 5725, + 0.95 + ], + [ + 5726, + 0.95 + ], + [ + 5727, + 0.95 + ], + [ + 5728, + 0.95 + ], + [ + 5729, + 0.45 + ], + [ + 5730, + 0.15 + ], + [ + 5731, + 0.15 + ], + [ + 5732, + 0.15 + ], + [ + 5733, + 0.15 + ], + [ + 5734, + 0.15 + ], + [ + 5735, + 0.15 + ], + [ + 5736, + 0.15 + ], + [ + 5737, + 0.15 + ], + [ + 5738, + 0.15 + ], + [ + 5739, + 0.15 + ], + [ + 5740, + 0.15 + ], + [ + 5741, + 0.15 + ], + [ + 5742, + 0.15 + ], + [ + 5743, + 0.15 + ], + [ + 5744, + 0.55 + ], + [ + 5745, + 0.95 + ], + [ + 5746, + 0.95 + ], + [ + 5747, + 0.95 + ], + [ + 5748, + 0.7 + ], + [ + 5749, + 0.95 + ], + [ + 5750, + 0.95 + ], + [ + 5751, + 0.95 + ], + [ + 5752, + 0.95 + ], + [ + 5753, + 0.45 + ], + [ + 5754, + 0.15 + ], + [ + 5755, + 0.15 + ], + [ + 5756, + 0.15 + ], + [ + 5757, + 0.15 + ], + [ + 5758, + 0.15 + ], + [ + 5759, + 0.15 + ], + [ + 5760, + 0.15 + ], + [ + 5761, + 0.15 + ], + [ + 5762, + 0.15 + ], + [ + 5763, + 0.15 + ], + [ + 5764, + 0.15 + ], + [ + 5765, + 0.15 + ], + [ + 5766, + 0.15 + ], + [ + 5767, + 0.15 + ], + [ + 5768, + 0.55 + ], + [ + 5769, + 0.95 + ], + [ + 5770, + 0.95 + ], + [ + 5771, + 0.95 + ], + [ + 5772, + 0.7 + ], + [ + 5773, + 0.95 + ], + [ + 5774, + 0.95 + ], + [ + 5775, + 0.95 + ], + [ + 5776, + 0.95 + ], + [ + 5777, + 0.45 + ], + [ + 5778, + 0.15 + ], + [ + 5779, + 0.15 + ], + [ + 5780, + 0.15 + ], + [ + 5781, + 0.15 + ], + [ + 5782, + 0.15 + ], + [ + 5783, + 0.15 + ], + [ + 5784, + 0.15 + ], + [ + 5785, + 0.15 + ], + [ + 5786, + 0.15 + ], + [ + 5787, + 0.15 + ], + [ + 5788, + 0.15 + ], + [ + 5789, + 0.15 + ], + [ + 5790, + 0.15 + ], + [ + 5791, + 0.15 + ], + [ + 5792, + 0.55 + ], + [ + 5793, + 0.95 + ], + [ + 5794, + 0.95 + ], + [ + 5795, + 0.95 + ], + [ + 5796, + 0.7 + ], + [ + 5797, + 0.95 + ], + [ + 5798, + 0.95 + ], + [ + 5799, + 0.95 + ], + [ + 5800, + 0.95 + ], + [ + 5801, + 0.45 + ], + [ + 5802, + 0.15 + ], + [ + 5803, + 0.15 + ], + [ + 5804, + 0.15 + ], + [ + 5805, + 0.15 + ], + [ + 5806, + 0.15 + ], + [ + 5807, + 0.15 + ], + [ + 5808, + 0.15 + ], + [ + 5809, + 0.15 + ], + [ + 5810, + 0.15 + ], + [ + 5811, + 0.15 + ], + [ + 5812, + 0.15 + ], + [ + 5813, + 0.15 + ], + [ + 5814, + 0.15 + ], + [ + 5815, + 0.15 + ], + [ + 5816, + 0.55 + ], + [ + 5817, + 0.95 + ], + [ + 5818, + 0.95 + ], + [ + 5819, + 0.95 + ], + [ + 5820, + 0.7 + ], + [ + 5821, + 0.95 + ], + [ + 5822, + 0.95 + ], + [ + 5823, + 0.95 + ], + [ + 5824, + 0.95 + ], + [ + 5825, + 0.45 + ], + [ + 5826, + 0.15 + ], + [ + 5827, + 0.15 + ], + [ + 5828, + 0.15 + ], + [ + 5829, + 0.15 + ], + [ + 5830, + 0.15 + ], + [ + 5831, + 0.15 + ], + [ + 5832, + 0.12 + ], + [ + 5833, + 0.12 + ], + [ + 5834, + 0.12 + ], + [ + 5835, + 0.12 + ], + [ + 5836, + 0.12 + ], + [ + 5837, + 0.12 + ], + [ + 5838, + 0.12 + ], + [ + 5839, + 0.12 + ], + [ + 5840, + 0.12 + ], + [ + 5841, + 0.12 + ], + [ + 5842, + 0.2 + ], + [ + 5843, + 0.2 + ], + [ + 5844, + 0.18 + ], + [ + 5845, + 0.12 + ], + [ + 5846, + 0.12 + ], + [ + 5847, + 0.12 + ], + [ + 5848, + 0.12 + ], + [ + 5849, + 0.12 + ], + [ + 5850, + 0.12 + ], + [ + 5851, + 0.12 + ], + [ + 5852, + 0.12 + ], + [ + 5853, + 0.12 + ], + [ + 5854, + 0.12 + ], + [ + 5855, + 0.12 + ], + [ + 5856, + 0.12 + ], + [ + 5857, + 0.12 + ], + [ + 5858, + 0.12 + ], + [ + 5859, + 0.12 + ], + [ + 5860, + 0.12 + ], + [ + 5861, + 0.12 + ], + [ + 5862, + 0.12 + ], + [ + 5863, + 0.12 + ], + [ + 5864, + 0.12 + ], + [ + 5865, + 0.12 + ], + [ + 5866, + 0.2 + ], + [ + 5867, + 0.2 + ], + [ + 5868, + 0.18 + ], + [ + 5869, + 0.12 + ], + [ + 5870, + 0.12 + ], + [ + 5871, + 0.12 + ], + [ + 5872, + 0.12 + ], + [ + 5873, + 0.12 + ], + [ + 5874, + 0.12 + ], + [ + 5875, + 0.12 + ], + [ + 5876, + 0.12 + ], + [ + 5877, + 0.12 + ], + [ + 5878, + 0.12 + ], + [ + 5879, + 0.12 + ], + [ + 5880, + 0.15 + ], + [ + 5881, + 0.15 + ], + [ + 5882, + 0.15 + ], + [ + 5883, + 0.15 + ], + [ + 5884, + 0.15 + ], + [ + 5885, + 0.15 + ], + [ + 5886, + 0.15 + ], + [ + 5887, + 0.15 + ], + [ + 5888, + 0.55 + ], + [ + 5889, + 0.95 + ], + [ + 5890, + 0.95 + ], + [ + 5891, + 0.95 + ], + [ + 5892, + 0.7 + ], + [ + 5893, + 0.95 + ], + [ + 5894, + 0.95 + ], + [ + 5895, + 0.95 + ], + [ + 5896, + 0.95 + ], + [ + 5897, + 0.45 + ], + [ + 5898, + 0.15 + ], + [ + 5899, + 0.15 + ], + [ + 5900, + 0.15 + ], + [ + 5901, + 0.15 + ], + [ + 5902, + 0.15 + ], + [ + 5903, + 0.15 + ], + [ + 5904, + 0.15 + ], + [ + 5905, + 0.15 + ], + [ + 5906, + 0.15 + ], + [ + 5907, + 0.15 + ], + [ + 5908, + 0.15 + ], + [ + 5909, + 0.15 + ], + [ + 5910, + 0.15 + ], + [ + 5911, + 0.15 + ], + [ + 5912, + 0.55 + ], + [ + 5913, + 0.95 + ], + [ + 5914, + 0.95 + ], + [ + 5915, + 0.95 + ], + [ + 5916, + 0.7 + ], + [ + 5917, + 0.95 + ], + [ + 5918, + 0.95 + ], + [ + 5919, + 0.95 + ], + [ + 5920, + 0.95 + ], + [ + 5921, + 0.45 + ], + [ + 5922, + 0.15 + ], + [ + 5923, + 0.15 + ], + [ + 5924, + 0.15 + ], + [ + 5925, + 0.15 + ], + [ + 5926, + 0.15 + ], + [ + 5927, + 0.15 + ], + [ + 5928, + 0.15 + ], + [ + 5929, + 0.15 + ], + [ + 5930, + 0.15 + ], + [ + 5931, + 0.15 + ], + [ + 5932, + 0.15 + ], + [ + 5933, + 0.15 + ], + [ + 5934, + 0.15 + ], + [ + 5935, + 0.15 + ], + [ + 5936, + 0.55 + ], + [ + 5937, + 0.95 + ], + [ + 5938, + 0.95 + ], + [ + 5939, + 0.95 + ], + [ + 5940, + 0.7 + ], + [ + 5941, + 0.95 + ], + [ + 5942, + 0.95 + ], + [ + 5943, + 0.95 + ], + [ + 5944, + 0.95 + ], + [ + 5945, + 0.45 + ], + [ + 5946, + 0.15 + ], + [ + 5947, + 0.15 + ], + [ + 5948, + 0.15 + ], + [ + 5949, + 0.15 + ], + [ + 5950, + 0.15 + ], + [ + 5951, + 0.15 + ], + [ + 5952, + 0.15 + ], + [ + 5953, + 0.15 + ], + [ + 5954, + 0.15 + ], + [ + 5955, + 0.15 + ], + [ + 5956, + 0.15 + ], + [ + 5957, + 0.15 + ], + [ + 5958, + 0.15 + ], + [ + 5959, + 0.15 + ], + [ + 5960, + 0.55 + ], + [ + 5961, + 0.95 + ], + [ + 5962, + 0.95 + ], + [ + 5963, + 0.95 + ], + [ + 5964, + 0.7 + ], + [ + 5965, + 0.95 + ], + [ + 5966, + 0.95 + ], + [ + 5967, + 0.95 + ], + [ + 5968, + 0.95 + ], + [ + 5969, + 0.45 + ], + [ + 5970, + 0.15 + ], + [ + 5971, + 0.15 + ], + [ + 5972, + 0.15 + ], + [ + 5973, + 0.15 + ], + [ + 5974, + 0.15 + ], + [ + 5975, + 0.15 + ], + [ + 5976, + 0.15 + ], + [ + 5977, + 0.15 + ], + [ + 5978, + 0.15 + ], + [ + 5979, + 0.15 + ], + [ + 5980, + 0.15 + ], + [ + 5981, + 0.15 + ], + [ + 5982, + 0.15 + ], + [ + 5983, + 0.15 + ], + [ + 5984, + 0.55 + ], + [ + 5985, + 0.95 + ], + [ + 5986, + 0.95 + ], + [ + 5987, + 0.95 + ], + [ + 5988, + 0.7 + ], + [ + 5989, + 0.95 + ], + [ + 5990, + 0.95 + ], + [ + 5991, + 0.95 + ], + [ + 5992, + 0.95 + ], + [ + 5993, + 0.45 + ], + [ + 5994, + 0.15 + ], + [ + 5995, + 0.15 + ], + [ + 5996, + 0.15 + ], + [ + 5997, + 0.15 + ], + [ + 5998, + 0.15 + ], + [ + 5999, + 0.15 + ], + [ + 6000, + 0.12 + ], + [ + 6001, + 0.12 + ], + [ + 6002, + 0.12 + ], + [ + 6003, + 0.12 + ], + [ + 6004, + 0.12 + ], + [ + 6005, + 0.12 + ], + [ + 6006, + 0.12 + ], + [ + 6007, + 0.12 + ], + [ + 6008, + 0.12 + ], + [ + 6009, + 0.12 + ], + [ + 6010, + 0.2 + ], + [ + 6011, + 0.2 + ], + [ + 6012, + 0.18 + ], + [ + 6013, + 0.12 + ], + [ + 6014, + 0.12 + ], + [ + 6015, + 0.12 + ], + [ + 6016, + 0.12 + ], + [ + 6017, + 0.12 + ], + [ + 6018, + 0.12 + ], + [ + 6019, + 0.12 + ], + [ + 6020, + 0.12 + ], + [ + 6021, + 0.12 + ], + [ + 6022, + 0.12 + ], + [ + 6023, + 0.12 + ], + [ + 6024, + 0.12 + ], + [ + 6025, + 0.12 + ], + [ + 6026, + 0.12 + ], + [ + 6027, + 0.12 + ], + [ + 6028, + 0.12 + ], + [ + 6029, + 0.12 + ], + [ + 6030, + 0.12 + ], + [ + 6031, + 0.12 + ], + [ + 6032, + 0.12 + ], + [ + 6033, + 0.12 + ], + [ + 6034, + 0.2 + ], + [ + 6035, + 0.2 + ], + [ + 6036, + 0.18 + ], + [ + 6037, + 0.12 + ], + [ + 6038, + 0.12 + ], + [ + 6039, + 0.12 + ], + [ + 6040, + 0.12 + ], + [ + 6041, + 0.12 + ], + [ + 6042, + 0.12 + ], + [ + 6043, + 0.12 + ], + [ + 6044, + 0.12 + ], + [ + 6045, + 0.12 + ], + [ + 6046, + 0.12 + ], + [ + 6047, + 0.12 + ], + [ + 6048, + 0.15 + ], + [ + 6049, + 0.15 + ], + [ + 6050, + 0.15 + ], + [ + 6051, + 0.15 + ], + [ + 6052, + 0.15 + ], + [ + 6053, + 0.15 + ], + [ + 6054, + 0.15 + ], + [ + 6055, + 0.15 + ], + [ + 6056, + 0.55 + ], + [ + 6057, + 0.95 + ], + [ + 6058, + 0.95 + ], + [ + 6059, + 0.95 + ], + [ + 6060, + 0.7 + ], + [ + 6061, + 0.95 + ], + [ + 6062, + 0.95 + ], + [ + 6063, + 0.95 + ], + [ + 6064, + 0.95 + ], + [ + 6065, + 0.45 + ], + [ + 6066, + 0.15 + ], + [ + 6067, + 0.15 + ], + [ + 6068, + 0.15 + ], + [ + 6069, + 0.15 + ], + [ + 6070, + 0.15 + ], + [ + 6071, + 0.15 + ], + [ + 6072, + 0.15 + ], + [ + 6073, + 0.15 + ], + [ + 6074, + 0.15 + ], + [ + 6075, + 0.15 + ], + [ + 6076, + 0.15 + ], + [ + 6077, + 0.15 + ], + [ + 6078, + 0.15 + ], + [ + 6079, + 0.15 + ], + [ + 6080, + 0.55 + ], + [ + 6081, + 0.95 + ], + [ + 6082, + 0.95 + ], + [ + 6083, + 0.95 + ], + [ + 6084, + 0.7 + ], + [ + 6085, + 0.95 + ], + [ + 6086, + 0.95 + ], + [ + 6087, + 0.95 + ], + [ + 6088, + 0.95 + ], + [ + 6089, + 0.45 + ], + [ + 6090, + 0.15 + ], + [ + 6091, + 0.15 + ], + [ + 6092, + 0.15 + ], + [ + 6093, + 0.15 + ], + [ + 6094, + 0.15 + ], + [ + 6095, + 0.15 + ], + [ + 6096, + 0.15 + ], + [ + 6097, + 0.15 + ], + [ + 6098, + 0.15 + ], + [ + 6099, + 0.15 + ], + [ + 6100, + 0.15 + ], + [ + 6101, + 0.15 + ], + [ + 6102, + 0.15 + ], + [ + 6103, + 0.15 + ], + [ + 6104, + 0.55 + ], + [ + 6105, + 0.95 + ], + [ + 6106, + 0.95 + ], + [ + 6107, + 0.95 + ], + [ + 6108, + 0.7 + ], + [ + 6109, + 0.95 + ], + [ + 6110, + 0.95 + ], + [ + 6111, + 0.95 + ], + [ + 6112, + 0.95 + ], + [ + 6113, + 0.45 + ], + [ + 6114, + 0.15 + ], + [ + 6115, + 0.15 + ], + [ + 6116, + 0.15 + ], + [ + 6117, + 0.15 + ], + [ + 6118, + 0.15 + ], + [ + 6119, + 0.15 + ], + [ + 6120, + 0.15 + ], + [ + 6121, + 0.15 + ], + [ + 6122, + 0.15 + ], + [ + 6123, + 0.15 + ], + [ + 6124, + 0.15 + ], + [ + 6125, + 0.15 + ], + [ + 6126, + 0.15 + ], + [ + 6127, + 0.15 + ], + [ + 6128, + 0.55 + ], + [ + 6129, + 0.95 + ], + [ + 6130, + 0.95 + ], + [ + 6131, + 0.95 + ], + [ + 6132, + 0.7 + ], + [ + 6133, + 0.95 + ], + [ + 6134, + 0.95 + ], + [ + 6135, + 0.95 + ], + [ + 6136, + 0.95 + ], + [ + 6137, + 0.45 + ], + [ + 6138, + 0.15 + ], + [ + 6139, + 0.15 + ], + [ + 6140, + 0.15 + ], + [ + 6141, + 0.15 + ], + [ + 6142, + 0.15 + ], + [ + 6143, + 0.15 + ], + [ + 6144, + 0.15 + ], + [ + 6145, + 0.15 + ], + [ + 6146, + 0.15 + ], + [ + 6147, + 0.15 + ], + [ + 6148, + 0.15 + ], + [ + 6149, + 0.15 + ], + [ + 6150, + 0.15 + ], + [ + 6151, + 0.15 + ], + [ + 6152, + 0.55 + ], + [ + 6153, + 0.95 + ], + [ + 6154, + 0.95 + ], + [ + 6155, + 0.95 + ], + [ + 6156, + 0.7 + ], + [ + 6157, + 0.95 + ], + [ + 6158, + 0.95 + ], + [ + 6159, + 0.95 + ], + [ + 6160, + 0.95 + ], + [ + 6161, + 0.45 + ], + [ + 6162, + 0.15 + ], + [ + 6163, + 0.15 + ], + [ + 6164, + 0.15 + ], + [ + 6165, + 0.15 + ], + [ + 6166, + 0.15 + ], + [ + 6167, + 0.15 + ], + [ + 6168, + 0.12 + ], + [ + 6169, + 0.12 + ], + [ + 6170, + 0.12 + ], + [ + 6171, + 0.12 + ], + [ + 6172, + 0.12 + ], + [ + 6173, + 0.12 + ], + [ + 6174, + 0.12 + ], + [ + 6175, + 0.12 + ], + [ + 6176, + 0.12 + ], + [ + 6177, + 0.12 + ], + [ + 6178, + 0.2 + ], + [ + 6179, + 0.2 + ], + [ + 6180, + 0.18 + ], + [ + 6181, + 0.12 + ], + [ + 6182, + 0.12 + ], + [ + 6183, + 0.12 + ], + [ + 6184, + 0.12 + ], + [ + 6185, + 0.12 + ], + [ + 6186, + 0.12 + ], + [ + 6187, + 0.12 + ], + [ + 6188, + 0.12 + ], + [ + 6189, + 0.12 + ], + [ + 6190, + 0.12 + ], + [ + 6191, + 0.12 + ], + [ + 6192, + 0.12 + ], + [ + 6193, + 0.12 + ], + [ + 6194, + 0.12 + ], + [ + 6195, + 0.12 + ], + [ + 6196, + 0.12 + ], + [ + 6197, + 0.12 + ], + [ + 6198, + 0.12 + ], + [ + 6199, + 0.12 + ], + [ + 6200, + 0.12 + ], + [ + 6201, + 0.12 + ], + [ + 6202, + 0.2 + ], + [ + 6203, + 0.2 + ], + [ + 6204, + 0.18 + ], + [ + 6205, + 0.12 + ], + [ + 6206, + 0.12 + ], + [ + 6207, + 0.12 + ], + [ + 6208, + 0.12 + ], + [ + 6209, + 0.12 + ], + [ + 6210, + 0.12 + ], + [ + 6211, + 0.12 + ], + [ + 6212, + 0.12 + ], + [ + 6213, + 0.12 + ], + [ + 6214, + 0.12 + ], + [ + 6215, + 0.12 + ], + [ + 6216, + 0.15 + ], + [ + 6217, + 0.15 + ], + [ + 6218, + 0.15 + ], + [ + 6219, + 0.15 + ], + [ + 6220, + 0.15 + ], + [ + 6221, + 0.15 + ], + [ + 6222, + 0.15 + ], + [ + 6223, + 0.15 + ], + [ + 6224, + 0.55 + ], + [ + 6225, + 0.95 + ], + [ + 6226, + 0.95 + ], + [ + 6227, + 0.95 + ], + [ + 6228, + 0.7 + ], + [ + 6229, + 0.95 + ], + [ + 6230, + 0.95 + ], + [ + 6231, + 0.95 + ], + [ + 6232, + 0.95 + ], + [ + 6233, + 0.45 + ], + [ + 6234, + 0.15 + ], + [ + 6235, + 0.15 + ], + [ + 6236, + 0.15 + ], + [ + 6237, + 0.15 + ], + [ + 6238, + 0.15 + ], + [ + 6239, + 0.15 + ], + [ + 6240, + 0.15 + ], + [ + 6241, + 0.15 + ], + [ + 6242, + 0.15 + ], + [ + 6243, + 0.15 + ], + [ + 6244, + 0.15 + ], + [ + 6245, + 0.15 + ], + [ + 6246, + 0.15 + ], + [ + 6247, + 0.15 + ], + [ + 6248, + 0.55 + ], + [ + 6249, + 0.95 + ], + [ + 6250, + 0.95 + ], + [ + 6251, + 0.95 + ], + [ + 6252, + 0.7 + ], + [ + 6253, + 0.95 + ], + [ + 6254, + 0.95 + ], + [ + 6255, + 0.95 + ], + [ + 6256, + 0.95 + ], + [ + 6257, + 0.45 + ], + [ + 6258, + 0.15 + ], + [ + 6259, + 0.15 + ], + [ + 6260, + 0.15 + ], + [ + 6261, + 0.15 + ], + [ + 6262, + 0.15 + ], + [ + 6263, + 0.15 + ], + [ + 6264, + 0.15 + ], + [ + 6265, + 0.15 + ], + [ + 6266, + 0.15 + ], + [ + 6267, + 0.15 + ], + [ + 6268, + 0.15 + ], + [ + 6269, + 0.15 + ], + [ + 6270, + 0.15 + ], + [ + 6271, + 0.15 + ], + [ + 6272, + 0.55 + ], + [ + 6273, + 0.95 + ], + [ + 6274, + 0.95 + ], + [ + 6275, + 0.95 + ], + [ + 6276, + 0.7 + ], + [ + 6277, + 0.95 + ], + [ + 6278, + 0.95 + ], + [ + 6279, + 0.95 + ], + [ + 6280, + 0.95 + ], + [ + 6281, + 0.45 + ], + [ + 6282, + 0.15 + ], + [ + 6283, + 0.15 + ], + [ + 6284, + 0.15 + ], + [ + 6285, + 0.15 + ], + [ + 6286, + 0.15 + ], + [ + 6287, + 0.15 + ], + [ + 6288, + 0.15 + ], + [ + 6289, + 0.15 + ], + [ + 6290, + 0.15 + ], + [ + 6291, + 0.15 + ], + [ + 6292, + 0.15 + ], + [ + 6293, + 0.15 + ], + [ + 6294, + 0.15 + ], + [ + 6295, + 0.15 + ], + [ + 6296, + 0.55 + ], + [ + 6297, + 0.95 + ], + [ + 6298, + 0.95 + ], + [ + 6299, + 0.95 + ], + [ + 6300, + 0.7 + ], + [ + 6301, + 0.95 + ], + [ + 6302, + 0.95 + ], + [ + 6303, + 0.95 + ], + [ + 6304, + 0.95 + ], + [ + 6305, + 0.45 + ], + [ + 6306, + 0.15 + ], + [ + 6307, + 0.15 + ], + [ + 6308, + 0.15 + ], + [ + 6309, + 0.15 + ], + [ + 6310, + 0.15 + ], + [ + 6311, + 0.15 + ], + [ + 6312, + 0.15 + ], + [ + 6313, + 0.15 + ], + [ + 6314, + 0.15 + ], + [ + 6315, + 0.15 + ], + [ + 6316, + 0.15 + ], + [ + 6317, + 0.15 + ], + [ + 6318, + 0.15 + ], + [ + 6319, + 0.15 + ], + [ + 6320, + 0.55 + ], + [ + 6321, + 0.95 + ], + [ + 6322, + 0.95 + ], + [ + 6323, + 0.95 + ], + [ + 6324, + 0.7 + ], + [ + 6325, + 0.95 + ], + [ + 6326, + 0.95 + ], + [ + 6327, + 0.95 + ], + [ + 6328, + 0.95 + ], + [ + 6329, + 0.45 + ], + [ + 6330, + 0.15 + ], + [ + 6331, + 0.15 + ], + [ + 6332, + 0.15 + ], + [ + 6333, + 0.15 + ], + [ + 6334, + 0.15 + ], + [ + 6335, + 0.15 + ], + [ + 6336, + 0.12 + ], + [ + 6337, + 0.12 + ], + [ + 6338, + 0.12 + ], + [ + 6339, + 0.12 + ], + [ + 6340, + 0.12 + ], + [ + 6341, + 0.12 + ], + [ + 6342, + 0.12 + ], + [ + 6343, + 0.12 + ], + [ + 6344, + 0.12 + ], + [ + 6345, + 0.12 + ], + [ + 6346, + 0.2 + ], + [ + 6347, + 0.2 + ], + [ + 6348, + 0.18 + ], + [ + 6349, + 0.12 + ], + [ + 6350, + 0.12 + ], + [ + 6351, + 0.12 + ], + [ + 6352, + 0.12 + ], + [ + 6353, + 0.12 + ], + [ + 6354, + 0.12 + ], + [ + 6355, + 0.12 + ], + [ + 6356, + 0.12 + ], + [ + 6357, + 0.12 + ], + [ + 6358, + 0.12 + ], + [ + 6359, + 0.12 + ], + [ + 6360, + 0.12 + ], + [ + 6361, + 0.12 + ], + [ + 6362, + 0.12 + ], + [ + 6363, + 0.12 + ], + [ + 6364, + 0.12 + ], + [ + 6365, + 0.12 + ], + [ + 6366, + 0.12 + ], + [ + 6367, + 0.12 + ], + [ + 6368, + 0.12 + ], + [ + 6369, + 0.12 + ], + [ + 6370, + 0.2 + ], + [ + 6371, + 0.2 + ], + [ + 6372, + 0.18 + ], + [ + 6373, + 0.12 + ], + [ + 6374, + 0.12 + ], + [ + 6375, + 0.12 + ], + [ + 6376, + 0.12 + ], + [ + 6377, + 0.12 + ], + [ + 6378, + 0.12 + ], + [ + 6379, + 0.12 + ], + [ + 6380, + 0.12 + ], + [ + 6381, + 0.12 + ], + [ + 6382, + 0.12 + ], + [ + 6383, + 0.12 + ], + [ + 6384, + 0.15 + ], + [ + 6385, + 0.15 + ], + [ + 6386, + 0.15 + ], + [ + 6387, + 0.15 + ], + [ + 6388, + 0.15 + ], + [ + 6389, + 0.15 + ], + [ + 6390, + 0.15 + ], + [ + 6391, + 0.15 + ], + [ + 6392, + 0.55 + ], + [ + 6393, + 0.95 + ], + [ + 6394, + 0.95 + ], + [ + 6395, + 0.95 + ], + [ + 6396, + 0.7 + ], + [ + 6397, + 0.95 + ], + [ + 6398, + 0.95 + ], + [ + 6399, + 0.95 + ], + [ + 6400, + 0.95 + ], + [ + 6401, + 0.45 + ], + [ + 6402, + 0.15 + ], + [ + 6403, + 0.15 + ], + [ + 6404, + 0.15 + ], + [ + 6405, + 0.15 + ], + [ + 6406, + 0.15 + ], + [ + 6407, + 0.15 + ], + [ + 6408, + 0.15 + ], + [ + 6409, + 0.15 + ], + [ + 6410, + 0.15 + ], + [ + 6411, + 0.15 + ], + [ + 6412, + 0.15 + ], + [ + 6413, + 0.15 + ], + [ + 6414, + 0.15 + ], + [ + 6415, + 0.15 + ], + [ + 6416, + 0.55 + ], + [ + 6417, + 0.95 + ], + [ + 6418, + 0.95 + ], + [ + 6419, + 0.95 + ], + [ + 6420, + 0.7 + ], + [ + 6421, + 0.95 + ], + [ + 6422, + 0.95 + ], + [ + 6423, + 0.95 + ], + [ + 6424, + 0.95 + ], + [ + 6425, + 0.45 + ], + [ + 6426, + 0.15 + ], + [ + 6427, + 0.15 + ], + [ + 6428, + 0.15 + ], + [ + 6429, + 0.15 + ], + [ + 6430, + 0.15 + ], + [ + 6431, + 0.15 + ], + [ + 6432, + 0.15 + ], + [ + 6433, + 0.15 + ], + [ + 6434, + 0.15 + ], + [ + 6435, + 0.15 + ], + [ + 6436, + 0.15 + ], + [ + 6437, + 0.15 + ], + [ + 6438, + 0.15 + ], + [ + 6439, + 0.15 + ], + [ + 6440, + 0.55 + ], + [ + 6441, + 0.95 + ], + [ + 6442, + 0.95 + ], + [ + 6443, + 0.95 + ], + [ + 6444, + 0.7 + ], + [ + 6445, + 0.95 + ], + [ + 6446, + 0.95 + ], + [ + 6447, + 0.95 + ], + [ + 6448, + 0.95 + ], + [ + 6449, + 0.45 + ], + [ + 6450, + 0.15 + ], + [ + 6451, + 0.15 + ], + [ + 6452, + 0.15 + ], + [ + 6453, + 0.15 + ], + [ + 6454, + 0.15 + ], + [ + 6455, + 0.15 + ], + [ + 6456, + 0.15 + ], + [ + 6457, + 0.15 + ], + [ + 6458, + 0.15 + ], + [ + 6459, + 0.15 + ], + [ + 6460, + 0.15 + ], + [ + 6461, + 0.15 + ], + [ + 6462, + 0.15 + ], + [ + 6463, + 0.15 + ], + [ + 6464, + 0.55 + ], + [ + 6465, + 0.95 + ], + [ + 6466, + 0.95 + ], + [ + 6467, + 0.95 + ], + [ + 6468, + 0.7 + ], + [ + 6469, + 0.95 + ], + [ + 6470, + 0.95 + ], + [ + 6471, + 0.95 + ], + [ + 6472, + 0.95 + ], + [ + 6473, + 0.45 + ], + [ + 6474, + 0.15 + ], + [ + 6475, + 0.15 + ], + [ + 6476, + 0.15 + ], + [ + 6477, + 0.15 + ], + [ + 6478, + 0.15 + ], + [ + 6479, + 0.15 + ], + [ + 6480, + 0.15 + ], + [ + 6481, + 0.15 + ], + [ + 6482, + 0.15 + ], + [ + 6483, + 0.15 + ], + [ + 6484, + 0.15 + ], + [ + 6485, + 0.15 + ], + [ + 6486, + 0.15 + ], + [ + 6487, + 0.15 + ], + [ + 6488, + 0.55 + ], + [ + 6489, + 0.95 + ], + [ + 6490, + 0.95 + ], + [ + 6491, + 0.95 + ], + [ + 6492, + 0.7 + ], + [ + 6493, + 0.95 + ], + [ + 6494, + 0.95 + ], + [ + 6495, + 0.95 + ], + [ + 6496, + 0.95 + ], + [ + 6497, + 0.45 + ], + [ + 6498, + 0.15 + ], + [ + 6499, + 0.15 + ], + [ + 6500, + 0.15 + ], + [ + 6501, + 0.15 + ], + [ + 6502, + 0.15 + ], + [ + 6503, + 0.15 + ], + [ + 6504, + 0.12 + ], + [ + 6505, + 0.12 + ], + [ + 6506, + 0.12 + ], + [ + 6507, + 0.12 + ], + [ + 6508, + 0.12 + ], + [ + 6509, + 0.12 + ], + [ + 6510, + 0.12 + ], + [ + 6511, + 0.12 + ], + [ + 6512, + 0.12 + ], + [ + 6513, + 0.12 + ], + [ + 6514, + 0.2 + ], + [ + 6515, + 0.2 + ], + [ + 6516, + 0.18 + ], + [ + 6517, + 0.12 + ], + [ + 6518, + 0.12 + ], + [ + 6519, + 0.12 + ], + [ + 6520, + 0.12 + ], + [ + 6521, + 0.12 + ], + [ + 6522, + 0.12 + ], + [ + 6523, + 0.12 + ], + [ + 6524, + 0.12 + ], + [ + 6525, + 0.12 + ], + [ + 6526, + 0.12 + ], + [ + 6527, + 0.12 + ], + [ + 6528, + 0.12 + ], + [ + 6529, + 0.12 + ], + [ + 6530, + 0.12 + ], + [ + 6531, + 0.12 + ], + [ + 6532, + 0.12 + ], + [ + 6533, + 0.12 + ], + [ + 6534, + 0.12 + ], + [ + 6535, + 0.12 + ], + [ + 6536, + 0.12 + ], + [ + 6537, + 0.12 + ], + [ + 6538, + 0.2 + ], + [ + 6539, + 0.2 + ], + [ + 6540, + 0.18 + ], + [ + 6541, + 0.12 + ], + [ + 6542, + 0.12 + ], + [ + 6543, + 0.12 + ], + [ + 6544, + 0.12 + ], + [ + 6545, + 0.12 + ], + [ + 6546, + 0.12 + ], + [ + 6547, + 0.12 + ], + [ + 6548, + 0.12 + ], + [ + 6549, + 0.12 + ], + [ + 6550, + 0.12 + ], + [ + 6551, + 0.12 + ], + [ + 6552, + 0.15 + ], + [ + 6553, + 0.15 + ], + [ + 6554, + 0.15 + ], + [ + 6555, + 0.15 + ], + [ + 6556, + 0.15 + ], + [ + 6557, + 0.15 + ], + [ + 6558, + 0.15 + ], + [ + 6559, + 0.15 + ], + [ + 6560, + 0.55 + ], + [ + 6561, + 0.95 + ], + [ + 6562, + 0.95 + ], + [ + 6563, + 0.95 + ], + [ + 6564, + 0.7 + ], + [ + 6565, + 0.95 + ], + [ + 6566, + 0.95 + ], + [ + 6567, + 0.95 + ], + [ + 6568, + 0.95 + ], + [ + 6569, + 0.45 + ], + [ + 6570, + 0.15 + ], + [ + 6571, + 0.15 + ], + [ + 6572, + 0.15 + ], + [ + 6573, + 0.15 + ], + [ + 6574, + 0.15 + ], + [ + 6575, + 0.15 + ], + [ + 6576, + 0.15 + ], + [ + 6577, + 0.15 + ], + [ + 6578, + 0.15 + ], + [ + 6579, + 0.15 + ], + [ + 6580, + 0.15 + ], + [ + 6581, + 0.15 + ], + [ + 6582, + 0.15 + ], + [ + 6583, + 0.15 + ], + [ + 6584, + 0.55 + ], + [ + 6585, + 0.95 + ], + [ + 6586, + 0.95 + ], + [ + 6587, + 0.95 + ], + [ + 6588, + 0.7 + ], + [ + 6589, + 0.95 + ], + [ + 6590, + 0.95 + ], + [ + 6591, + 0.95 + ], + [ + 6592, + 0.95 + ], + [ + 6593, + 0.45 + ], + [ + 6594, + 0.15 + ], + [ + 6595, + 0.15 + ], + [ + 6596, + 0.15 + ], + [ + 6597, + 0.15 + ], + [ + 6598, + 0.15 + ], + [ + 6599, + 0.15 + ], + [ + 6600, + 0.15 + ], + [ + 6601, + 0.15 + ], + [ + 6602, + 0.15 + ], + [ + 6603, + 0.15 + ], + [ + 6604, + 0.15 + ], + [ + 6605, + 0.15 + ], + [ + 6606, + 0.15 + ], + [ + 6607, + 0.15 + ], + [ + 6608, + 0.55 + ], + [ + 6609, + 0.95 + ], + [ + 6610, + 0.95 + ], + [ + 6611, + 0.95 + ], + [ + 6612, + 0.7 + ], + [ + 6613, + 0.95 + ], + [ + 6614, + 0.95 + ], + [ + 6615, + 0.95 + ], + [ + 6616, + 0.95 + ], + [ + 6617, + 0.45 + ], + [ + 6618, + 0.15 + ], + [ + 6619, + 0.15 + ], + [ + 6620, + 0.15 + ], + [ + 6621, + 0.15 + ], + [ + 6622, + 0.15 + ], + [ + 6623, + 0.15 + ], + [ + 6624, + 0.15 + ], + [ + 6625, + 0.15 + ], + [ + 6626, + 0.15 + ], + [ + 6627, + 0.15 + ], + [ + 6628, + 0.15 + ], + [ + 6629, + 0.15 + ], + [ + 6630, + 0.15 + ], + [ + 6631, + 0.15 + ], + [ + 6632, + 0.55 + ], + [ + 6633, + 0.95 + ], + [ + 6634, + 0.95 + ], + [ + 6635, + 0.95 + ], + [ + 6636, + 0.7 + ], + [ + 6637, + 0.95 + ], + [ + 6638, + 0.95 + ], + [ + 6639, + 0.95 + ], + [ + 6640, + 0.95 + ], + [ + 6641, + 0.45 + ], + [ + 6642, + 0.15 + ], + [ + 6643, + 0.15 + ], + [ + 6644, + 0.15 + ], + [ + 6645, + 0.15 + ], + [ + 6646, + 0.15 + ], + [ + 6647, + 0.15 + ], + [ + 6648, + 0.15 + ], + [ + 6649, + 0.15 + ], + [ + 6650, + 0.15 + ], + [ + 6651, + 0.15 + ], + [ + 6652, + 0.15 + ], + [ + 6653, + 0.15 + ], + [ + 6654, + 0.15 + ], + [ + 6655, + 0.15 + ], + [ + 6656, + 0.55 + ], + [ + 6657, + 0.95 + ], + [ + 6658, + 0.95 + ], + [ + 6659, + 0.95 + ], + [ + 6660, + 0.7 + ], + [ + 6661, + 0.95 + ], + [ + 6662, + 0.95 + ], + [ + 6663, + 0.95 + ], + [ + 6664, + 0.95 + ], + [ + 6665, + 0.45 + ], + [ + 6666, + 0.15 + ], + [ + 6667, + 0.15 + ], + [ + 6668, + 0.15 + ], + [ + 6669, + 0.15 + ], + [ + 6670, + 0.15 + ], + [ + 6671, + 0.15 + ], + [ + 6672, + 0.12 + ], + [ + 6673, + 0.12 + ], + [ + 6674, + 0.12 + ], + [ + 6675, + 0.12 + ], + [ + 6676, + 0.12 + ], + [ + 6677, + 0.12 + ], + [ + 6678, + 0.12 + ], + [ + 6679, + 0.12 + ], + [ + 6680, + 0.12 + ], + [ + 6681, + 0.12 + ], + [ + 6682, + 0.2 + ], + [ + 6683, + 0.2 + ], + [ + 6684, + 0.18 + ], + [ + 6685, + 0.12 + ], + [ + 6686, + 0.12 + ], + [ + 6687, + 0.12 + ], + [ + 6688, + 0.12 + ], + [ + 6689, + 0.12 + ], + [ + 6690, + 0.12 + ], + [ + 6691, + 0.12 + ], + [ + 6692, + 0.12 + ], + [ + 6693, + 0.12 + ], + [ + 6694, + 0.12 + ], + [ + 6695, + 0.12 + ], + [ + 6696, + 0.12 + ], + [ + 6697, + 0.12 + ], + [ + 6698, + 0.12 + ], + [ + 6699, + 0.12 + ], + [ + 6700, + 0.12 + ], + [ + 6701, + 0.12 + ], + [ + 6702, + 0.12 + ], + [ + 6703, + 0.12 + ], + [ + 6704, + 0.12 + ], + [ + 6705, + 0.12 + ], + [ + 6706, + 0.2 + ], + [ + 6707, + 0.2 + ], + [ + 6708, + 0.18 + ], + [ + 6709, + 0.12 + ], + [ + 6710, + 0.12 + ], + [ + 6711, + 0.12 + ], + [ + 6712, + 0.12 + ], + [ + 6713, + 0.12 + ], + [ + 6714, + 0.12 + ], + [ + 6715, + 0.12 + ], + [ + 6716, + 0.12 + ], + [ + 6717, + 0.12 + ], + [ + 6718, + 0.12 + ], + [ + 6719, + 0.12 + ], + [ + 6720, + 0.15 + ], + [ + 6721, + 0.15 + ], + [ + 6722, + 0.15 + ], + [ + 6723, + 0.15 + ], + [ + 6724, + 0.15 + ], + [ + 6725, + 0.15 + ], + [ + 6726, + 0.15 + ], + [ + 6727, + 0.15 + ], + [ + 6728, + 0.55 + ], + [ + 6729, + 0.95 + ], + [ + 6730, + 0.95 + ], + [ + 6731, + 0.95 + ], + [ + 6732, + 0.7 + ], + [ + 6733, + 0.95 + ], + [ + 6734, + 0.95 + ], + [ + 6735, + 0.95 + ], + [ + 6736, + 0.95 + ], + [ + 6737, + 0.45 + ], + [ + 6738, + 0.15 + ], + [ + 6739, + 0.15 + ], + [ + 6740, + 0.15 + ], + [ + 6741, + 0.15 + ], + [ + 6742, + 0.15 + ], + [ + 6743, + 0.15 + ], + [ + 6744, + 0.15 + ], + [ + 6745, + 0.15 + ], + [ + 6746, + 0.15 + ], + [ + 6747, + 0.15 + ], + [ + 6748, + 0.15 + ], + [ + 6749, + 0.15 + ], + [ + 6750, + 0.15 + ], + [ + 6751, + 0.15 + ], + [ + 6752, + 0.55 + ], + [ + 6753, + 0.95 + ], + [ + 6754, + 0.95 + ], + [ + 6755, + 0.95 + ], + [ + 6756, + 0.7 + ], + [ + 6757, + 0.95 + ], + [ + 6758, + 0.95 + ], + [ + 6759, + 0.95 + ], + [ + 6760, + 0.95 + ], + [ + 6761, + 0.45 + ], + [ + 6762, + 0.15 + ], + [ + 6763, + 0.15 + ], + [ + 6764, + 0.15 + ], + [ + 6765, + 0.15 + ], + [ + 6766, + 0.15 + ], + [ + 6767, + 0.15 + ], + [ + 6768, + 0.15 + ], + [ + 6769, + 0.15 + ], + [ + 6770, + 0.15 + ], + [ + 6771, + 0.15 + ], + [ + 6772, + 0.15 + ], + [ + 6773, + 0.15 + ], + [ + 6774, + 0.15 + ], + [ + 6775, + 0.15 + ], + [ + 6776, + 0.55 + ], + [ + 6777, + 0.95 + ], + [ + 6778, + 0.95 + ], + [ + 6779, + 0.95 + ], + [ + 6780, + 0.7 + ], + [ + 6781, + 0.95 + ], + [ + 6782, + 0.95 + ], + [ + 6783, + 0.95 + ], + [ + 6784, + 0.95 + ], + [ + 6785, + 0.45 + ], + [ + 6786, + 0.15 + ], + [ + 6787, + 0.15 + ], + [ + 6788, + 0.15 + ], + [ + 6789, + 0.15 + ], + [ + 6790, + 0.15 + ], + [ + 6791, + 0.15 + ], + [ + 6792, + 0.15 + ], + [ + 6793, + 0.15 + ], + [ + 6794, + 0.15 + ], + [ + 6795, + 0.15 + ], + [ + 6796, + 0.15 + ], + [ + 6797, + 0.15 + ], + [ + 6798, + 0.15 + ], + [ + 6799, + 0.15 + ], + [ + 6800, + 0.55 + ], + [ + 6801, + 0.95 + ], + [ + 6802, + 0.95 + ], + [ + 6803, + 0.95 + ], + [ + 6804, + 0.7 + ], + [ + 6805, + 0.95 + ], + [ + 6806, + 0.95 + ], + [ + 6807, + 0.95 + ], + [ + 6808, + 0.95 + ], + [ + 6809, + 0.45 + ], + [ + 6810, + 0.15 + ], + [ + 6811, + 0.15 + ], + [ + 6812, + 0.15 + ], + [ + 6813, + 0.15 + ], + [ + 6814, + 0.15 + ], + [ + 6815, + 0.15 + ], + [ + 6816, + 0.15 + ], + [ + 6817, + 0.15 + ], + [ + 6818, + 0.15 + ], + [ + 6819, + 0.15 + ], + [ + 6820, + 0.15 + ], + [ + 6821, + 0.15 + ], + [ + 6822, + 0.15 + ], + [ + 6823, + 0.15 + ], + [ + 6824, + 0.55 + ], + [ + 6825, + 0.95 + ], + [ + 6826, + 0.95 + ], + [ + 6827, + 0.95 + ], + [ + 6828, + 0.7 + ], + [ + 6829, + 0.95 + ], + [ + 6830, + 0.95 + ], + [ + 6831, + 0.95 + ], + [ + 6832, + 0.95 + ], + [ + 6833, + 0.45 + ], + [ + 6834, + 0.15 + ], + [ + 6835, + 0.15 + ], + [ + 6836, + 0.15 + ], + [ + 6837, + 0.15 + ], + [ + 6838, + 0.15 + ], + [ + 6839, + 0.15 + ], + [ + 6840, + 0.12 + ], + [ + 6841, + 0.12 + ], + [ + 6842, + 0.12 + ], + [ + 6843, + 0.12 + ], + [ + 6844, + 0.12 + ], + [ + 6845, + 0.12 + ], + [ + 6846, + 0.12 + ], + [ + 6847, + 0.12 + ], + [ + 6848, + 0.12 + ], + [ + 6849, + 0.12 + ], + [ + 6850, + 0.2 + ], + [ + 6851, + 0.2 + ], + [ + 6852, + 0.18 + ], + [ + 6853, + 0.12 + ], + [ + 6854, + 0.12 + ], + [ + 6855, + 0.12 + ], + [ + 6856, + 0.12 + ], + [ + 6857, + 0.12 + ], + [ + 6858, + 0.12 + ], + [ + 6859, + 0.12 + ], + [ + 6860, + 0.12 + ], + [ + 6861, + 0.12 + ], + [ + 6862, + 0.12 + ], + [ + 6863, + 0.12 + ], + [ + 6864, + 0.12 + ], + [ + 6865, + 0.12 + ], + [ + 6866, + 0.12 + ], + [ + 6867, + 0.12 + ], + [ + 6868, + 0.12 + ], + [ + 6869, + 0.12 + ], + [ + 6870, + 0.12 + ], + [ + 6871, + 0.12 + ], + [ + 6872, + 0.12 + ], + [ + 6873, + 0.12 + ], + [ + 6874, + 0.2 + ], + [ + 6875, + 0.2 + ], + [ + 6876, + 0.18 + ], + [ + 6877, + 0.12 + ], + [ + 6878, + 0.12 + ], + [ + 6879, + 0.12 + ], + [ + 6880, + 0.12 + ], + [ + 6881, + 0.12 + ], + [ + 6882, + 0.12 + ], + [ + 6883, + 0.12 + ], + [ + 6884, + 0.12 + ], + [ + 6885, + 0.12 + ], + [ + 6886, + 0.12 + ], + [ + 6887, + 0.12 + ], + [ + 6888, + 0.15 + ], + [ + 6889, + 0.15 + ], + [ + 6890, + 0.15 + ], + [ + 6891, + 0.15 + ], + [ + 6892, + 0.15 + ], + [ + 6893, + 0.15 + ], + [ + 6894, + 0.15 + ], + [ + 6895, + 0.15 + ], + [ + 6896, + 0.55 + ], + [ + 6897, + 0.95 + ], + [ + 6898, + 0.95 + ], + [ + 6899, + 0.95 + ], + [ + 6900, + 0.7 + ], + [ + 6901, + 0.95 + ], + [ + 6902, + 0.95 + ], + [ + 6903, + 0.95 + ], + [ + 6904, + 0.95 + ], + [ + 6905, + 0.45 + ], + [ + 6906, + 0.15 + ], + [ + 6907, + 0.15 + ], + [ + 6908, + 0.15 + ], + [ + 6909, + 0.15 + ], + [ + 6910, + 0.15 + ], + [ + 6911, + 0.15 + ], + [ + 6912, + 0.15 + ], + [ + 6913, + 0.15 + ], + [ + 6914, + 0.15 + ], + [ + 6915, + 0.15 + ], + [ + 6916, + 0.15 + ], + [ + 6917, + 0.15 + ], + [ + 6918, + 0.15 + ], + [ + 6919, + 0.15 + ], + [ + 6920, + 0.55 + ], + [ + 6921, + 0.95 + ], + [ + 6922, + 0.95 + ], + [ + 6923, + 0.95 + ], + [ + 6924, + 0.7 + ], + [ + 6925, + 0.95 + ], + [ + 6926, + 0.95 + ], + [ + 6927, + 0.95 + ], + [ + 6928, + 0.95 + ], + [ + 6929, + 0.45 + ], + [ + 6930, + 0.15 + ], + [ + 6931, + 0.15 + ], + [ + 6932, + 0.15 + ], + [ + 6933, + 0.15 + ], + [ + 6934, + 0.15 + ], + [ + 6935, + 0.15 + ], + [ + 6936, + 0.15 + ], + [ + 6937, + 0.15 + ], + [ + 6938, + 0.15 + ], + [ + 6939, + 0.15 + ], + [ + 6940, + 0.15 + ], + [ + 6941, + 0.15 + ], + [ + 6942, + 0.15 + ], + [ + 6943, + 0.15 + ], + [ + 6944, + 0.55 + ], + [ + 6945, + 0.95 + ], + [ + 6946, + 0.95 + ], + [ + 6947, + 0.95 + ], + [ + 6948, + 0.7 + ], + [ + 6949, + 0.95 + ], + [ + 6950, + 0.95 + ], + [ + 6951, + 0.95 + ], + [ + 6952, + 0.95 + ], + [ + 6953, + 0.45 + ], + [ + 6954, + 0.15 + ], + [ + 6955, + 0.15 + ], + [ + 6956, + 0.15 + ], + [ + 6957, + 0.15 + ], + [ + 6958, + 0.15 + ], + [ + 6959, + 0.15 + ], + [ + 6960, + 0.15 + ], + [ + 6961, + 0.15 + ], + [ + 6962, + 0.15 + ], + [ + 6963, + 0.15 + ], + [ + 6964, + 0.15 + ], + [ + 6965, + 0.15 + ], + [ + 6966, + 0.15 + ], + [ + 6967, + 0.15 + ], + [ + 6968, + 0.55 + ], + [ + 6969, + 0.95 + ], + [ + 6970, + 0.95 + ], + [ + 6971, + 0.95 + ], + [ + 6972, + 0.7 + ], + [ + 6973, + 0.95 + ], + [ + 6974, + 0.95 + ], + [ + 6975, + 0.95 + ], + [ + 6976, + 0.95 + ], + [ + 6977, + 0.45 + ], + [ + 6978, + 0.15 + ], + [ + 6979, + 0.15 + ], + [ + 6980, + 0.15 + ], + [ + 6981, + 0.15 + ], + [ + 6982, + 0.15 + ], + [ + 6983, + 0.15 + ], + [ + 6984, + 0.15 + ], + [ + 6985, + 0.15 + ], + [ + 6986, + 0.15 + ], + [ + 6987, + 0.15 + ], + [ + 6988, + 0.15 + ], + [ + 6989, + 0.15 + ], + [ + 6990, + 0.15 + ], + [ + 6991, + 0.15 + ], + [ + 6992, + 0.55 + ], + [ + 6993, + 0.95 + ], + [ + 6994, + 0.95 + ], + [ + 6995, + 0.95 + ], + [ + 6996, + 0.7 + ], + [ + 6997, + 0.95 + ], + [ + 6998, + 0.95 + ], + [ + 6999, + 0.95 + ], + [ + 7000, + 0.95 + ], + [ + 7001, + 0.45 + ], + [ + 7002, + 0.15 + ], + [ + 7003, + 0.15 + ], + [ + 7004, + 0.15 + ], + [ + 7005, + 0.15 + ], + [ + 7006, + 0.15 + ], + [ + 7007, + 0.15 + ], + [ + 7008, + 0.12 + ], + [ + 7009, + 0.12 + ], + [ + 7010, + 0.12 + ], + [ + 7011, + 0.12 + ], + [ + 7012, + 0.12 + ], + [ + 7013, + 0.12 + ], + [ + 7014, + 0.12 + ], + [ + 7015, + 0.12 + ], + [ + 7016, + 0.12 + ], + [ + 7017, + 0.12 + ], + [ + 7018, + 0.2 + ], + [ + 7019, + 0.2 + ], + [ + 7020, + 0.18 + ], + [ + 7021, + 0.12 + ], + [ + 7022, + 0.12 + ], + [ + 7023, + 0.12 + ], + [ + 7024, + 0.12 + ], + [ + 7025, + 0.12 + ], + [ + 7026, + 0.12 + ], + [ + 7027, + 0.12 + ], + [ + 7028, + 0.12 + ], + [ + 7029, + 0.12 + ], + [ + 7030, + 0.12 + ], + [ + 7031, + 0.12 + ], + [ + 7032, + 0.12 + ], + [ + 7033, + 0.12 + ], + [ + 7034, + 0.12 + ], + [ + 7035, + 0.12 + ], + [ + 7036, + 0.12 + ], + [ + 7037, + 0.12 + ], + [ + 7038, + 0.12 + ], + [ + 7039, + 0.12 + ], + [ + 7040, + 0.12 + ], + [ + 7041, + 0.12 + ], + [ + 7042, + 0.2 + ], + [ + 7043, + 0.2 + ], + [ + 7044, + 0.18 + ], + [ + 7045, + 0.12 + ], + [ + 7046, + 0.12 + ], + [ + 7047, + 0.12 + ], + [ + 7048, + 0.12 + ], + [ + 7049, + 0.12 + ], + [ + 7050, + 0.12 + ], + [ + 7051, + 0.12 + ], + [ + 7052, + 0.12 + ], + [ + 7053, + 0.12 + ], + [ + 7054, + 0.12 + ], + [ + 7055, + 0.12 + ], + [ + 7056, + 0.15 + ], + [ + 7057, + 0.15 + ], + [ + 7058, + 0.15 + ], + [ + 7059, + 0.15 + ], + [ + 7060, + 0.15 + ], + [ + 7061, + 0.15 + ], + [ + 7062, + 0.15 + ], + [ + 7063, + 0.15 + ], + [ + 7064, + 0.55 + ], + [ + 7065, + 0.95 + ], + [ + 7066, + 0.95 + ], + [ + 7067, + 0.95 + ], + [ + 7068, + 0.7 + ], + [ + 7069, + 0.95 + ], + [ + 7070, + 0.95 + ], + [ + 7071, + 0.95 + ], + [ + 7072, + 0.95 + ], + [ + 7073, + 0.45 + ], + [ + 7074, + 0.15 + ], + [ + 7075, + 0.15 + ], + [ + 7076, + 0.15 + ], + [ + 7077, + 0.15 + ], + [ + 7078, + 0.15 + ], + [ + 7079, + 0.15 + ], + [ + 7080, + 0.15 + ], + [ + 7081, + 0.15 + ], + [ + 7082, + 0.15 + ], + [ + 7083, + 0.15 + ], + [ + 7084, + 0.15 + ], + [ + 7085, + 0.15 + ], + [ + 7086, + 0.15 + ], + [ + 7087, + 0.15 + ], + [ + 7088, + 0.55 + ], + [ + 7089, + 0.95 + ], + [ + 7090, + 0.95 + ], + [ + 7091, + 0.95 + ], + [ + 7092, + 0.7 + ], + [ + 7093, + 0.95 + ], + [ + 7094, + 0.95 + ], + [ + 7095, + 0.95 + ], + [ + 7096, + 0.95 + ], + [ + 7097, + 0.45 + ], + [ + 7098, + 0.15 + ], + [ + 7099, + 0.15 + ], + [ + 7100, + 0.15 + ], + [ + 7101, + 0.15 + ], + [ + 7102, + 0.15 + ], + [ + 7103, + 0.15 + ], + [ + 7104, + 0.15 + ], + [ + 7105, + 0.15 + ], + [ + 7106, + 0.15 + ], + [ + 7107, + 0.15 + ], + [ + 7108, + 0.15 + ], + [ + 7109, + 0.15 + ], + [ + 7110, + 0.15 + ], + [ + 7111, + 0.15 + ], + [ + 7112, + 0.55 + ], + [ + 7113, + 0.95 + ], + [ + 7114, + 0.95 + ], + [ + 7115, + 0.95 + ], + [ + 7116, + 0.7 + ], + [ + 7117, + 0.95 + ], + [ + 7118, + 0.95 + ], + [ + 7119, + 0.95 + ], + [ + 7120, + 0.95 + ], + [ + 7121, + 0.45 + ], + [ + 7122, + 0.15 + ], + [ + 7123, + 0.15 + ], + [ + 7124, + 0.15 + ], + [ + 7125, + 0.15 + ], + [ + 7126, + 0.15 + ], + [ + 7127, + 0.15 + ], + [ + 7128, + 0.15 + ], + [ + 7129, + 0.15 + ], + [ + 7130, + 0.15 + ], + [ + 7131, + 0.15 + ], + [ + 7132, + 0.15 + ], + [ + 7133, + 0.15 + ], + [ + 7134, + 0.15 + ], + [ + 7135, + 0.15 + ], + [ + 7136, + 0.55 + ], + [ + 7137, + 0.95 + ], + [ + 7138, + 0.95 + ], + [ + 7139, + 0.95 + ], + [ + 7140, + 0.7 + ], + [ + 7141, + 0.95 + ], + [ + 7142, + 0.95 + ], + [ + 7143, + 0.95 + ], + [ + 7144, + 0.95 + ], + [ + 7145, + 0.45 + ], + [ + 7146, + 0.15 + ], + [ + 7147, + 0.15 + ], + [ + 7148, + 0.15 + ], + [ + 7149, + 0.15 + ], + [ + 7150, + 0.15 + ], + [ + 7151, + 0.15 + ], + [ + 7152, + 0.15 + ], + [ + 7153, + 0.15 + ], + [ + 7154, + 0.15 + ], + [ + 7155, + 0.15 + ], + [ + 7156, + 0.15 + ], + [ + 7157, + 0.15 + ], + [ + 7158, + 0.15 + ], + [ + 7159, + 0.15 + ], + [ + 7160, + 0.55 + ], + [ + 7161, + 0.95 + ], + [ + 7162, + 0.95 + ], + [ + 7163, + 0.95 + ], + [ + 7164, + 0.7 + ], + [ + 7165, + 0.95 + ], + [ + 7166, + 0.95 + ], + [ + 7167, + 0.95 + ], + [ + 7168, + 0.95 + ], + [ + 7169, + 0.45 + ], + [ + 7170, + 0.15 + ], + [ + 7171, + 0.15 + ], + [ + 7172, + 0.15 + ], + [ + 7173, + 0.15 + ], + [ + 7174, + 0.15 + ], + [ + 7175, + 0.15 + ], + [ + 7176, + 0.12 + ], + [ + 7177, + 0.12 + ], + [ + 7178, + 0.12 + ], + [ + 7179, + 0.12 + ], + [ + 7180, + 0.12 + ], + [ + 7181, + 0.12 + ], + [ + 7182, + 0.12 + ], + [ + 7183, + 0.12 + ], + [ + 7184, + 0.12 + ], + [ + 7185, + 0.12 + ], + [ + 7186, + 0.2 + ], + [ + 7187, + 0.2 + ], + [ + 7188, + 0.18 + ], + [ + 7189, + 0.12 + ], + [ + 7190, + 0.12 + ], + [ + 7191, + 0.12 + ], + [ + 7192, + 0.12 + ], + [ + 7193, + 0.12 + ], + [ + 7194, + 0.12 + ], + [ + 7195, + 0.12 + ], + [ + 7196, + 0.12 + ], + [ + 7197, + 0.12 + ], + [ + 7198, + 0.12 + ], + [ + 7199, + 0.12 + ], + [ + 7200, + 0.12 + ], + [ + 7201, + 0.12 + ], + [ + 7202, + 0.12 + ], + [ + 7203, + 0.12 + ], + [ + 7204, + 0.12 + ], + [ + 7205, + 0.12 + ], + [ + 7206, + 0.12 + ], + [ + 7207, + 0.12 + ], + [ + 7208, + 0.12 + ], + [ + 7209, + 0.12 + ], + [ + 7210, + 0.2 + ], + [ + 7211, + 0.2 + ], + [ + 7212, + 0.18 + ], + [ + 7213, + 0.12 + ], + [ + 7214, + 0.12 + ], + [ + 7215, + 0.12 + ], + [ + 7216, + 0.12 + ], + [ + 7217, + 0.12 + ], + [ + 7218, + 0.12 + ], + [ + 7219, + 0.12 + ], + [ + 7220, + 0.12 + ], + [ + 7221, + 0.12 + ], + [ + 7222, + 0.12 + ], + [ + 7223, + 0.12 + ], + [ + 7224, + 0.15 + ], + [ + 7225, + 0.15 + ], + [ + 7226, + 0.15 + ], + [ + 7227, + 0.15 + ], + [ + 7228, + 0.15 + ], + [ + 7229, + 0.15 + ], + [ + 7230, + 0.15 + ], + [ + 7231, + 0.15 + ], + [ + 7232, + 0.55 + ], + [ + 7233, + 0.95 + ], + [ + 7234, + 0.95 + ], + [ + 7235, + 0.95 + ], + [ + 7236, + 0.7 + ], + [ + 7237, + 0.95 + ], + [ + 7238, + 0.95 + ], + [ + 7239, + 0.95 + ], + [ + 7240, + 0.95 + ], + [ + 7241, + 0.45 + ], + [ + 7242, + 0.15 + ], + [ + 7243, + 0.15 + ], + [ + 7244, + 0.15 + ], + [ + 7245, + 0.15 + ], + [ + 7246, + 0.15 + ], + [ + 7247, + 0.15 + ], + [ + 7248, + 0.15 + ], + [ + 7249, + 0.15 + ], + [ + 7250, + 0.15 + ], + [ + 7251, + 0.15 + ], + [ + 7252, + 0.15 + ], + [ + 7253, + 0.15 + ], + [ + 7254, + 0.15 + ], + [ + 7255, + 0.15 + ], + [ + 7256, + 0.55 + ], + [ + 7257, + 0.95 + ], + [ + 7258, + 0.95 + ], + [ + 7259, + 0.95 + ], + [ + 7260, + 0.7 + ], + [ + 7261, + 0.95 + ], + [ + 7262, + 0.95 + ], + [ + 7263, + 0.95 + ], + [ + 7264, + 0.95 + ], + [ + 7265, + 0.45 + ], + [ + 7266, + 0.15 + ], + [ + 7267, + 0.15 + ], + [ + 7268, + 0.15 + ], + [ + 7269, + 0.15 + ], + [ + 7270, + 0.15 + ], + [ + 7271, + 0.15 + ], + [ + 7272, + 0.15 + ], + [ + 7273, + 0.15 + ], + [ + 7274, + 0.15 + ], + [ + 7275, + 0.15 + ], + [ + 7276, + 0.15 + ], + [ + 7277, + 0.15 + ], + [ + 7278, + 0.15 + ], + [ + 7279, + 0.15 + ], + [ + 7280, + 0.55 + ], + [ + 7281, + 0.95 + ], + [ + 7282, + 0.95 + ], + [ + 7283, + 0.95 + ], + [ + 7284, + 0.7 + ], + [ + 7285, + 0.95 + ], + [ + 7286, + 0.95 + ], + [ + 7287, + 0.95 + ], + [ + 7288, + 0.95 + ], + [ + 7289, + 0.45 + ], + [ + 7290, + 0.15 + ], + [ + 7291, + 0.15 + ], + [ + 7292, + 0.15 + ], + [ + 7293, + 0.15 + ], + [ + 7294, + 0.15 + ], + [ + 7295, + 0.15 + ], + [ + 7296, + 0.15 + ], + [ + 7297, + 0.15 + ], + [ + 7298, + 0.15 + ], + [ + 7299, + 0.15 + ], + [ + 7300, + 0.15 + ], + [ + 7301, + 0.15 + ], + [ + 7302, + 0.15 + ], + [ + 7303, + 0.15 + ], + [ + 7304, + 0.55 + ], + [ + 7305, + 0.95 + ], + [ + 7306, + 0.95 + ], + [ + 7307, + 0.95 + ], + [ + 7308, + 0.7 + ], + [ + 7309, + 0.95 + ], + [ + 7310, + 0.95 + ], + [ + 7311, + 0.95 + ], + [ + 7312, + 0.95 + ], + [ + 7313, + 0.45 + ], + [ + 7314, + 0.15 + ], + [ + 7315, + 0.15 + ], + [ + 7316, + 0.15 + ], + [ + 7317, + 0.15 + ], + [ + 7318, + 0.15 + ], + [ + 7319, + 0.15 + ], + [ + 7320, + 0.15 + ], + [ + 7321, + 0.15 + ], + [ + 7322, + 0.15 + ], + [ + 7323, + 0.15 + ], + [ + 7324, + 0.15 + ], + [ + 7325, + 0.15 + ], + [ + 7326, + 0.15 + ], + [ + 7327, + 0.15 + ], + [ + 7328, + 0.55 + ], + [ + 7329, + 0.95 + ], + [ + 7330, + 0.95 + ], + [ + 7331, + 0.95 + ], + [ + 7332, + 0.7 + ], + [ + 7333, + 0.95 + ], + [ + 7334, + 0.95 + ], + [ + 7335, + 0.95 + ], + [ + 7336, + 0.95 + ], + [ + 7337, + 0.45 + ], + [ + 7338, + 0.15 + ], + [ + 7339, + 0.15 + ], + [ + 7340, + 0.15 + ], + [ + 7341, + 0.15 + ], + [ + 7342, + 0.15 + ], + [ + 7343, + 0.15 + ], + [ + 7344, + 0.12 + ], + [ + 7345, + 0.12 + ], + [ + 7346, + 0.12 + ], + [ + 7347, + 0.12 + ], + [ + 7348, + 0.12 + ], + [ + 7349, + 0.12 + ], + [ + 7350, + 0.12 + ], + [ + 7351, + 0.12 + ], + [ + 7352, + 0.12 + ], + [ + 7353, + 0.12 + ], + [ + 7354, + 0.2 + ], + [ + 7355, + 0.2 + ], + [ + 7356, + 0.18 + ], + [ + 7357, + 0.12 + ], + [ + 7358, + 0.12 + ], + [ + 7359, + 0.12 + ], + [ + 7360, + 0.12 + ], + [ + 7361, + 0.12 + ], + [ + 7362, + 0.12 + ], + [ + 7363, + 0.12 + ], + [ + 7364, + 0.12 + ], + [ + 7365, + 0.12 + ], + [ + 7366, + 0.12 + ], + [ + 7367, + 0.12 + ], + [ + 7368, + 0.12 + ], + [ + 7369, + 0.12 + ], + [ + 7370, + 0.12 + ], + [ + 7371, + 0.12 + ], + [ + 7372, + 0.12 + ], + [ + 7373, + 0.12 + ], + [ + 7374, + 0.12 + ], + [ + 7375, + 0.12 + ], + [ + 7376, + 0.12 + ], + [ + 7377, + 0.12 + ], + [ + 7378, + 0.2 + ], + [ + 7379, + 0.2 + ], + [ + 7380, + 0.18 + ], + [ + 7381, + 0.12 + ], + [ + 7382, + 0.12 + ], + [ + 7383, + 0.12 + ], + [ + 7384, + 0.12 + ], + [ + 7385, + 0.12 + ], + [ + 7386, + 0.12 + ], + [ + 7387, + 0.12 + ], + [ + 7388, + 0.12 + ], + [ + 7389, + 0.12 + ], + [ + 7390, + 0.12 + ], + [ + 7391, + 0.12 + ], + [ + 7392, + 0.15 + ], + [ + 7393, + 0.15 + ], + [ + 7394, + 0.15 + ], + [ + 7395, + 0.15 + ], + [ + 7396, + 0.15 + ], + [ + 7397, + 0.15 + ], + [ + 7398, + 0.15 + ], + [ + 7399, + 0.15 + ], + [ + 7400, + 0.55 + ], + [ + 7401, + 0.95 + ], + [ + 7402, + 0.95 + ], + [ + 7403, + 0.95 + ], + [ + 7404, + 0.7 + ], + [ + 7405, + 0.95 + ], + [ + 7406, + 0.95 + ], + [ + 7407, + 0.95 + ], + [ + 7408, + 0.95 + ], + [ + 7409, + 0.45 + ], + [ + 7410, + 0.15 + ], + [ + 7411, + 0.15 + ], + [ + 7412, + 0.15 + ], + [ + 7413, + 0.15 + ], + [ + 7414, + 0.15 + ], + [ + 7415, + 0.15 + ], + [ + 7416, + 0.15 + ], + [ + 7417, + 0.15 + ], + [ + 7418, + 0.15 + ], + [ + 7419, + 0.15 + ], + [ + 7420, + 0.15 + ], + [ + 7421, + 0.15 + ], + [ + 7422, + 0.15 + ], + [ + 7423, + 0.15 + ], + [ + 7424, + 0.55 + ], + [ + 7425, + 0.95 + ], + [ + 7426, + 0.95 + ], + [ + 7427, + 0.95 + ], + [ + 7428, + 0.7 + ], + [ + 7429, + 0.95 + ], + [ + 7430, + 0.95 + ], + [ + 7431, + 0.95 + ], + [ + 7432, + 0.95 + ], + [ + 7433, + 0.45 + ], + [ + 7434, + 0.15 + ], + [ + 7435, + 0.15 + ], + [ + 7436, + 0.15 + ], + [ + 7437, + 0.15 + ], + [ + 7438, + 0.15 + ], + [ + 7439, + 0.15 + ], + [ + 7440, + 0.15 + ], + [ + 7441, + 0.15 + ], + [ + 7442, + 0.15 + ], + [ + 7443, + 0.15 + ], + [ + 7444, + 0.15 + ], + [ + 7445, + 0.15 + ], + [ + 7446, + 0.15 + ], + [ + 7447, + 0.15 + ], + [ + 7448, + 0.55 + ], + [ + 7449, + 0.95 + ], + [ + 7450, + 0.95 + ], + [ + 7451, + 0.95 + ], + [ + 7452, + 0.7 + ], + [ + 7453, + 0.95 + ], + [ + 7454, + 0.95 + ], + [ + 7455, + 0.95 + ], + [ + 7456, + 0.95 + ], + [ + 7457, + 0.45 + ], + [ + 7458, + 0.15 + ], + [ + 7459, + 0.15 + ], + [ + 7460, + 0.15 + ], + [ + 7461, + 0.15 + ], + [ + 7462, + 0.15 + ], + [ + 7463, + 0.15 + ], + [ + 7464, + 0.15 + ], + [ + 7465, + 0.15 + ], + [ + 7466, + 0.15 + ], + [ + 7467, + 0.15 + ], + [ + 7468, + 0.15 + ], + [ + 7469, + 0.15 + ], + [ + 7470, + 0.15 + ], + [ + 7471, + 0.15 + ], + [ + 7472, + 0.55 + ], + [ + 7473, + 0.95 + ], + [ + 7474, + 0.95 + ], + [ + 7475, + 0.95 + ], + [ + 7476, + 0.7 + ], + [ + 7477, + 0.95 + ], + [ + 7478, + 0.95 + ], + [ + 7479, + 0.95 + ], + [ + 7480, + 0.95 + ], + [ + 7481, + 0.45 + ], + [ + 7482, + 0.15 + ], + [ + 7483, + 0.15 + ], + [ + 7484, + 0.15 + ], + [ + 7485, + 0.15 + ], + [ + 7486, + 0.15 + ], + [ + 7487, + 0.15 + ], + [ + 7488, + 0.15 + ], + [ + 7489, + 0.15 + ], + [ + 7490, + 0.15 + ], + [ + 7491, + 0.15 + ], + [ + 7492, + 0.15 + ], + [ + 7493, + 0.15 + ], + [ + 7494, + 0.15 + ], + [ + 7495, + 0.15 + ], + [ + 7496, + 0.55 + ], + [ + 7497, + 0.95 + ], + [ + 7498, + 0.95 + ], + [ + 7499, + 0.95 + ], + [ + 7500, + 0.7 + ], + [ + 7501, + 0.95 + ], + [ + 7502, + 0.95 + ], + [ + 7503, + 0.95 + ], + [ + 7504, + 0.95 + ], + [ + 7505, + 0.45 + ], + [ + 7506, + 0.15 + ], + [ + 7507, + 0.15 + ], + [ + 7508, + 0.15 + ], + [ + 7509, + 0.15 + ], + [ + 7510, + 0.15 + ], + [ + 7511, + 0.15 + ], + [ + 7512, + 0.12 + ], + [ + 7513, + 0.12 + ], + [ + 7514, + 0.12 + ], + [ + 7515, + 0.12 + ], + [ + 7516, + 0.12 + ], + [ + 7517, + 0.12 + ], + [ + 7518, + 0.12 + ], + [ + 7519, + 0.12 + ], + [ + 7520, + 0.12 + ], + [ + 7521, + 0.12 + ], + [ + 7522, + 0.2 + ], + [ + 7523, + 0.2 + ], + [ + 7524, + 0.18 + ], + [ + 7525, + 0.12 + ], + [ + 7526, + 0.12 + ], + [ + 7527, + 0.12 + ], + [ + 7528, + 0.12 + ], + [ + 7529, + 0.12 + ], + [ + 7530, + 0.12 + ], + [ + 7531, + 0.12 + ], + [ + 7532, + 0.12 + ], + [ + 7533, + 0.12 + ], + [ + 7534, + 0.12 + ], + [ + 7535, + 0.12 + ], + [ + 7536, + 0.12 + ], + [ + 7537, + 0.12 + ], + [ + 7538, + 0.12 + ], + [ + 7539, + 0.12 + ], + [ + 7540, + 0.12 + ], + [ + 7541, + 0.12 + ], + [ + 7542, + 0.12 + ], + [ + 7543, + 0.12 + ], + [ + 7544, + 0.12 + ], + [ + 7545, + 0.12 + ], + [ + 7546, + 0.2 + ], + [ + 7547, + 0.2 + ], + [ + 7548, + 0.18 + ], + [ + 7549, + 0.12 + ], + [ + 7550, + 0.12 + ], + [ + 7551, + 0.12 + ], + [ + 7552, + 0.12 + ], + [ + 7553, + 0.12 + ], + [ + 7554, + 0.12 + ], + [ + 7555, + 0.12 + ], + [ + 7556, + 0.12 + ], + [ + 7557, + 0.12 + ], + [ + 7558, + 0.12 + ], + [ + 7559, + 0.12 + ], + [ + 7560, + 0.15 + ], + [ + 7561, + 0.15 + ], + [ + 7562, + 0.15 + ], + [ + 7563, + 0.15 + ], + [ + 7564, + 0.15 + ], + [ + 7565, + 0.15 + ], + [ + 7566, + 0.15 + ], + [ + 7567, + 0.15 + ], + [ + 7568, + 0.55 + ], + [ + 7569, + 0.95 + ], + [ + 7570, + 0.95 + ], + [ + 7571, + 0.95 + ], + [ + 7572, + 0.7 + ], + [ + 7573, + 0.95 + ], + [ + 7574, + 0.95 + ], + [ + 7575, + 0.95 + ], + [ + 7576, + 0.95 + ], + [ + 7577, + 0.45 + ], + [ + 7578, + 0.15 + ], + [ + 7579, + 0.15 + ], + [ + 7580, + 0.15 + ], + [ + 7581, + 0.15 + ], + [ + 7582, + 0.15 + ], + [ + 7583, + 0.15 + ], + [ + 7584, + 0.15 + ], + [ + 7585, + 0.15 + ], + [ + 7586, + 0.15 + ], + [ + 7587, + 0.15 + ], + [ + 7588, + 0.15 + ], + [ + 7589, + 0.15 + ], + [ + 7590, + 0.15 + ], + [ + 7591, + 0.15 + ], + [ + 7592, + 0.55 + ], + [ + 7593, + 0.95 + ], + [ + 7594, + 0.95 + ], + [ + 7595, + 0.95 + ], + [ + 7596, + 0.7 + ], + [ + 7597, + 0.95 + ], + [ + 7598, + 0.95 + ], + [ + 7599, + 0.95 + ], + [ + 7600, + 0.95 + ], + [ + 7601, + 0.45 + ], + [ + 7602, + 0.15 + ], + [ + 7603, + 0.15 + ], + [ + 7604, + 0.15 + ], + [ + 7605, + 0.15 + ], + [ + 7606, + 0.15 + ], + [ + 7607, + 0.15 + ], + [ + 7608, + 0.15 + ], + [ + 7609, + 0.15 + ], + [ + 7610, + 0.15 + ], + [ + 7611, + 0.15 + ], + [ + 7612, + 0.15 + ], + [ + 7613, + 0.15 + ], + [ + 7614, + 0.15 + ], + [ + 7615, + 0.15 + ], + [ + 7616, + 0.55 + ], + [ + 7617, + 0.95 + ], + [ + 7618, + 0.95 + ], + [ + 7619, + 0.95 + ], + [ + 7620, + 0.7 + ], + [ + 7621, + 0.95 + ], + [ + 7622, + 0.95 + ], + [ + 7623, + 0.95 + ], + [ + 7624, + 0.95 + ], + [ + 7625, + 0.45 + ], + [ + 7626, + 0.15 + ], + [ + 7627, + 0.15 + ], + [ + 7628, + 0.15 + ], + [ + 7629, + 0.15 + ], + [ + 7630, + 0.15 + ], + [ + 7631, + 0.15 + ], + [ + 7632, + 0.15 + ], + [ + 7633, + 0.15 + ], + [ + 7634, + 0.15 + ], + [ + 7635, + 0.15 + ], + [ + 7636, + 0.15 + ], + [ + 7637, + 0.15 + ], + [ + 7638, + 0.15 + ], + [ + 7639, + 0.15 + ], + [ + 7640, + 0.55 + ], + [ + 7641, + 0.95 + ], + [ + 7642, + 0.95 + ], + [ + 7643, + 0.95 + ], + [ + 7644, + 0.7 + ], + [ + 7645, + 0.95 + ], + [ + 7646, + 0.95 + ], + [ + 7647, + 0.95 + ], + [ + 7648, + 0.95 + ], + [ + 7649, + 0.45 + ], + [ + 7650, + 0.15 + ], + [ + 7651, + 0.15 + ], + [ + 7652, + 0.15 + ], + [ + 7653, + 0.15 + ], + [ + 7654, + 0.15 + ], + [ + 7655, + 0.15 + ], + [ + 7656, + 0.15 + ], + [ + 7657, + 0.15 + ], + [ + 7658, + 0.15 + ], + [ + 7659, + 0.15 + ], + [ + 7660, + 0.15 + ], + [ + 7661, + 0.15 + ], + [ + 7662, + 0.15 + ], + [ + 7663, + 0.15 + ], + [ + 7664, + 0.55 + ], + [ + 7665, + 0.95 + ], + [ + 7666, + 0.95 + ], + [ + 7667, + 0.95 + ], + [ + 7668, + 0.7 + ], + [ + 7669, + 0.95 + ], + [ + 7670, + 0.95 + ], + [ + 7671, + 0.95 + ], + [ + 7672, + 0.95 + ], + [ + 7673, + 0.45 + ], + [ + 7674, + 0.15 + ], + [ + 7675, + 0.15 + ], + [ + 7676, + 0.15 + ], + [ + 7677, + 0.15 + ], + [ + 7678, + 0.15 + ], + [ + 7679, + 0.15 + ], + [ + 7680, + 0.12 + ], + [ + 7681, + 0.12 + ], + [ + 7682, + 0.12 + ], + [ + 7683, + 0.12 + ], + [ + 7684, + 0.12 + ], + [ + 7685, + 0.12 + ], + [ + 7686, + 0.12 + ], + [ + 7687, + 0.12 + ], + [ + 7688, + 0.12 + ], + [ + 7689, + 0.12 + ], + [ + 7690, + 0.2 + ], + [ + 7691, + 0.2 + ], + [ + 7692, + 0.18 + ], + [ + 7693, + 0.12 + ], + [ + 7694, + 0.12 + ], + [ + 7695, + 0.12 + ], + [ + 7696, + 0.12 + ], + [ + 7697, + 0.12 + ], + [ + 7698, + 0.12 + ], + [ + 7699, + 0.12 + ], + [ + 7700, + 0.12 + ], + [ + 7701, + 0.12 + ], + [ + 7702, + 0.12 + ], + [ + 7703, + 0.12 + ], + [ + 7704, + 0.12 + ], + [ + 7705, + 0.12 + ], + [ + 7706, + 0.12 + ], + [ + 7707, + 0.12 + ], + [ + 7708, + 0.12 + ], + [ + 7709, + 0.12 + ], + [ + 7710, + 0.12 + ], + [ + 7711, + 0.12 + ], + [ + 7712, + 0.12 + ], + [ + 7713, + 0.12 + ], + [ + 7714, + 0.2 + ], + [ + 7715, + 0.2 + ], + [ + 7716, + 0.18 + ], + [ + 7717, + 0.12 + ], + [ + 7718, + 0.12 + ], + [ + 7719, + 0.12 + ], + [ + 7720, + 0.12 + ], + [ + 7721, + 0.12 + ], + [ + 7722, + 0.12 + ], + [ + 7723, + 0.12 + ], + [ + 7724, + 0.12 + ], + [ + 7725, + 0.12 + ], + [ + 7726, + 0.12 + ], + [ + 7727, + 0.12 + ], + [ + 7728, + 0.15 + ], + [ + 7729, + 0.15 + ], + [ + 7730, + 0.15 + ], + [ + 7731, + 0.15 + ], + [ + 7732, + 0.15 + ], + [ + 7733, + 0.15 + ], + [ + 7734, + 0.15 + ], + [ + 7735, + 0.15 + ], + [ + 7736, + 0.55 + ], + [ + 7737, + 0.95 + ], + [ + 7738, + 0.95 + ], + [ + 7739, + 0.95 + ], + [ + 7740, + 0.7 + ], + [ + 7741, + 0.95 + ], + [ + 7742, + 0.95 + ], + [ + 7743, + 0.95 + ], + [ + 7744, + 0.95 + ], + [ + 7745, + 0.45 + ], + [ + 7746, + 0.15 + ], + [ + 7747, + 0.15 + ], + [ + 7748, + 0.15 + ], + [ + 7749, + 0.15 + ], + [ + 7750, + 0.15 + ], + [ + 7751, + 0.15 + ], + [ + 7752, + 0.15 + ], + [ + 7753, + 0.15 + ], + [ + 7754, + 0.15 + ], + [ + 7755, + 0.15 + ], + [ + 7756, + 0.15 + ], + [ + 7757, + 0.15 + ], + [ + 7758, + 0.15 + ], + [ + 7759, + 0.15 + ], + [ + 7760, + 0.55 + ], + [ + 7761, + 0.95 + ], + [ + 7762, + 0.95 + ], + [ + 7763, + 0.95 + ], + [ + 7764, + 0.7 + ], + [ + 7765, + 0.95 + ], + [ + 7766, + 0.95 + ], + [ + 7767, + 0.95 + ], + [ + 7768, + 0.95 + ], + [ + 7769, + 0.45 + ], + [ + 7770, + 0.15 + ], + [ + 7771, + 0.15 + ], + [ + 7772, + 0.15 + ], + [ + 7773, + 0.15 + ], + [ + 7774, + 0.15 + ], + [ + 7775, + 0.15 + ], + [ + 7776, + 0.15 + ], + [ + 7777, + 0.15 + ], + [ + 7778, + 0.15 + ], + [ + 7779, + 0.15 + ], + [ + 7780, + 0.15 + ], + [ + 7781, + 0.15 + ], + [ + 7782, + 0.15 + ], + [ + 7783, + 0.15 + ], + [ + 7784, + 0.55 + ], + [ + 7785, + 0.95 + ], + [ + 7786, + 0.95 + ], + [ + 7787, + 0.95 + ], + [ + 7788, + 0.7 + ], + [ + 7789, + 0.95 + ], + [ + 7790, + 0.95 + ], + [ + 7791, + 0.95 + ], + [ + 7792, + 0.95 + ], + [ + 7793, + 0.45 + ], + [ + 7794, + 0.15 + ], + [ + 7795, + 0.15 + ], + [ + 7796, + 0.15 + ], + [ + 7797, + 0.15 + ], + [ + 7798, + 0.15 + ], + [ + 7799, + 0.15 + ], + [ + 7800, + 0.15 + ], + [ + 7801, + 0.15 + ], + [ + 7802, + 0.15 + ], + [ + 7803, + 0.15 + ], + [ + 7804, + 0.15 + ], + [ + 7805, + 0.15 + ], + [ + 7806, + 0.15 + ], + [ + 7807, + 0.15 + ], + [ + 7808, + 0.55 + ], + [ + 7809, + 0.95 + ], + [ + 7810, + 0.95 + ], + [ + 7811, + 0.95 + ], + [ + 7812, + 0.7 + ], + [ + 7813, + 0.95 + ], + [ + 7814, + 0.95 + ], + [ + 7815, + 0.95 + ], + [ + 7816, + 0.95 + ], + [ + 7817, + 0.45 + ], + [ + 7818, + 0.15 + ], + [ + 7819, + 0.15 + ], + [ + 7820, + 0.15 + ], + [ + 7821, + 0.15 + ], + [ + 7822, + 0.15 + ], + [ + 7823, + 0.15 + ], + [ + 7824, + 0.15 + ], + [ + 7825, + 0.15 + ], + [ + 7826, + 0.15 + ], + [ + 7827, + 0.15 + ], + [ + 7828, + 0.15 + ], + [ + 7829, + 0.15 + ], + [ + 7830, + 0.15 + ], + [ + 7831, + 0.15 + ], + [ + 7832, + 0.55 + ], + [ + 7833, + 0.95 + ], + [ + 7834, + 0.95 + ], + [ + 7835, + 0.95 + ], + [ + 7836, + 0.7 + ], + [ + 7837, + 0.95 + ], + [ + 7838, + 0.95 + ], + [ + 7839, + 0.95 + ], + [ + 7840, + 0.95 + ], + [ + 7841, + 0.45 + ], + [ + 7842, + 0.15 + ], + [ + 7843, + 0.15 + ], + [ + 7844, + 0.15 + ], + [ + 7845, + 0.15 + ], + [ + 7846, + 0.15 + ], + [ + 7847, + 0.15 + ], + [ + 7848, + 0.12 + ], + [ + 7849, + 0.12 + ], + [ + 7850, + 0.12 + ], + [ + 7851, + 0.12 + ], + [ + 7852, + 0.12 + ], + [ + 7853, + 0.12 + ], + [ + 7854, + 0.12 + ], + [ + 7855, + 0.12 + ], + [ + 7856, + 0.12 + ], + [ + 7857, + 0.12 + ], + [ + 7858, + 0.2 + ], + [ + 7859, + 0.2 + ], + [ + 7860, + 0.18 + ], + [ + 7861, + 0.12 + ], + [ + 7862, + 0.12 + ], + [ + 7863, + 0.12 + ], + [ + 7864, + 0.12 + ], + [ + 7865, + 0.12 + ], + [ + 7866, + 0.12 + ], + [ + 7867, + 0.12 + ], + [ + 7868, + 0.12 + ], + [ + 7869, + 0.12 + ], + [ + 7870, + 0.12 + ], + [ + 7871, + 0.12 + ], + [ + 7872, + 0.12 + ], + [ + 7873, + 0.12 + ], + [ + 7874, + 0.12 + ], + [ + 7875, + 0.12 + ], + [ + 7876, + 0.12 + ], + [ + 7877, + 0.12 + ], + [ + 7878, + 0.12 + ], + [ + 7879, + 0.12 + ], + [ + 7880, + 0.12 + ], + [ + 7881, + 0.12 + ], + [ + 7882, + 0.2 + ], + [ + 7883, + 0.2 + ], + [ + 7884, + 0.18 + ], + [ + 7885, + 0.12 + ], + [ + 7886, + 0.12 + ], + [ + 7887, + 0.12 + ], + [ + 7888, + 0.12 + ], + [ + 7889, + 0.12 + ], + [ + 7890, + 0.12 + ], + [ + 7891, + 0.12 + ], + [ + 7892, + 0.12 + ], + [ + 7893, + 0.12 + ], + [ + 7894, + 0.12 + ], + [ + 7895, + 0.12 + ], + [ + 7896, + 0.15 + ], + [ + 7897, + 0.15 + ], + [ + 7898, + 0.15 + ], + [ + 7899, + 0.15 + ], + [ + 7900, + 0.15 + ], + [ + 7901, + 0.15 + ], + [ + 7902, + 0.15 + ], + [ + 7903, + 0.15 + ], + [ + 7904, + 0.55 + ], + [ + 7905, + 0.95 + ], + [ + 7906, + 0.95 + ], + [ + 7907, + 0.95 + ], + [ + 7908, + 0.7 + ], + [ + 7909, + 0.95 + ], + [ + 7910, + 0.95 + ], + [ + 7911, + 0.95 + ], + [ + 7912, + 0.95 + ], + [ + 7913, + 0.45 + ], + [ + 7914, + 0.15 + ], + [ + 7915, + 0.15 + ], + [ + 7916, + 0.15 + ], + [ + 7917, + 0.15 + ], + [ + 7918, + 0.15 + ], + [ + 7919, + 0.15 + ], + [ + 7920, + 0.15 + ], + [ + 7921, + 0.15 + ], + [ + 7922, + 0.15 + ], + [ + 7923, + 0.15 + ], + [ + 7924, + 0.15 + ], + [ + 7925, + 0.15 + ], + [ + 7926, + 0.15 + ], + [ + 7927, + 0.15 + ], + [ + 7928, + 0.55 + ], + [ + 7929, + 0.95 + ], + [ + 7930, + 0.95 + ], + [ + 7931, + 0.95 + ], + [ + 7932, + 0.7 + ], + [ + 7933, + 0.95 + ], + [ + 7934, + 0.95 + ], + [ + 7935, + 0.95 + ], + [ + 7936, + 0.95 + ], + [ + 7937, + 0.45 + ], + [ + 7938, + 0.15 + ], + [ + 7939, + 0.15 + ], + [ + 7940, + 0.15 + ], + [ + 7941, + 0.15 + ], + [ + 7942, + 0.15 + ], + [ + 7943, + 0.15 + ], + [ + 7944, + 0.15 + ], + [ + 7945, + 0.15 + ], + [ + 7946, + 0.15 + ], + [ + 7947, + 0.15 + ], + [ + 7948, + 0.15 + ], + [ + 7949, + 0.15 + ], + [ + 7950, + 0.15 + ], + [ + 7951, + 0.15 + ], + [ + 7952, + 0.55 + ], + [ + 7953, + 0.95 + ], + [ + 7954, + 0.95 + ], + [ + 7955, + 0.95 + ], + [ + 7956, + 0.7 + ], + [ + 7957, + 0.95 + ], + [ + 7958, + 0.95 + ], + [ + 7959, + 0.95 + ], + [ + 7960, + 0.95 + ], + [ + 7961, + 0.45 + ], + [ + 7962, + 0.15 + ], + [ + 7963, + 0.15 + ], + [ + 7964, + 0.15 + ], + [ + 7965, + 0.15 + ], + [ + 7966, + 0.15 + ], + [ + 7967, + 0.15 + ], + [ + 7968, + 0.15 + ], + [ + 7969, + 0.15 + ], + [ + 7970, + 0.15 + ], + [ + 7971, + 0.15 + ], + [ + 7972, + 0.15 + ], + [ + 7973, + 0.15 + ], + [ + 7974, + 0.15 + ], + [ + 7975, + 0.15 + ], + [ + 7976, + 0.55 + ], + [ + 7977, + 0.95 + ], + [ + 7978, + 0.95 + ], + [ + 7979, + 0.95 + ], + [ + 7980, + 0.7 + ], + [ + 7981, + 0.95 + ], + [ + 7982, + 0.95 + ], + [ + 7983, + 0.95 + ], + [ + 7984, + 0.95 + ], + [ + 7985, + 0.45 + ], + [ + 7986, + 0.15 + ], + [ + 7987, + 0.15 + ], + [ + 7988, + 0.15 + ], + [ + 7989, + 0.15 + ], + [ + 7990, + 0.15 + ], + [ + 7991, + 0.15 + ], + [ + 7992, + 0.15 + ], + [ + 7993, + 0.15 + ], + [ + 7994, + 0.15 + ], + [ + 7995, + 0.15 + ], + [ + 7996, + 0.15 + ], + [ + 7997, + 0.15 + ], + [ + 7998, + 0.15 + ], + [ + 7999, + 0.15 + ], + [ + 8000, + 0.55 + ], + [ + 8001, + 0.95 + ], + [ + 8002, + 0.95 + ], + [ + 8003, + 0.95 + ], + [ + 8004, + 0.7 + ], + [ + 8005, + 0.95 + ], + [ + 8006, + 0.95 + ], + [ + 8007, + 0.95 + ], + [ + 8008, + 0.95 + ], + [ + 8009, + 0.45 + ], + [ + 8010, + 0.15 + ], + [ + 8011, + 0.15 + ], + [ + 8012, + 0.15 + ], + [ + 8013, + 0.15 + ], + [ + 8014, + 0.15 + ], + [ + 8015, + 0.15 + ], + [ + 8016, + 0.12 + ], + [ + 8017, + 0.12 + ], + [ + 8018, + 0.12 + ], + [ + 8019, + 0.12 + ], + [ + 8020, + 0.12 + ], + [ + 8021, + 0.12 + ], + [ + 8022, + 0.12 + ], + [ + 8023, + 0.12 + ], + [ + 8024, + 0.12 + ], + [ + 8025, + 0.12 + ], + [ + 8026, + 0.2 + ], + [ + 8027, + 0.2 + ], + [ + 8028, + 0.18 + ], + [ + 8029, + 0.12 + ], + [ + 8030, + 0.12 + ], + [ + 8031, + 0.12 + ], + [ + 8032, + 0.12 + ], + [ + 8033, + 0.12 + ], + [ + 8034, + 0.12 + ], + [ + 8035, + 0.12 + ], + [ + 8036, + 0.12 + ], + [ + 8037, + 0.12 + ], + [ + 8038, + 0.12 + ], + [ + 8039, + 0.12 + ], + [ + 8040, + 0.12 + ], + [ + 8041, + 0.12 + ], + [ + 8042, + 0.12 + ], + [ + 8043, + 0.12 + ], + [ + 8044, + 0.12 + ], + [ + 8045, + 0.12 + ], + [ + 8046, + 0.12 + ], + [ + 8047, + 0.12 + ], + [ + 8048, + 0.12 + ], + [ + 8049, + 0.12 + ], + [ + 8050, + 0.2 + ], + [ + 8051, + 0.2 + ], + [ + 8052, + 0.18 + ], + [ + 8053, + 0.12 + ], + [ + 8054, + 0.12 + ], + [ + 8055, + 0.12 + ], + [ + 8056, + 0.12 + ], + [ + 8057, + 0.12 + ], + [ + 8058, + 0.12 + ], + [ + 8059, + 0.12 + ], + [ + 8060, + 0.12 + ], + [ + 8061, + 0.12 + ], + [ + 8062, + 0.12 + ], + [ + 8063, + 0.12 + ], + [ + 8064, + 0.15 + ], + [ + 8065, + 0.15 + ], + [ + 8066, + 0.15 + ], + [ + 8067, + 0.15 + ], + [ + 8068, + 0.15 + ], + [ + 8069, + 0.15 + ], + [ + 8070, + 0.15 + ], + [ + 8071, + 0.15 + ], + [ + 8072, + 0.55 + ], + [ + 8073, + 0.95 + ], + [ + 8074, + 0.95 + ], + [ + 8075, + 0.95 + ], + [ + 8076, + 0.7 + ], + [ + 8077, + 0.95 + ], + [ + 8078, + 0.95 + ], + [ + 8079, + 0.95 + ], + [ + 8080, + 0.95 + ], + [ + 8081, + 0.45 + ], + [ + 8082, + 0.15 + ], + [ + 8083, + 0.15 + ], + [ + 8084, + 0.15 + ], + [ + 8085, + 0.15 + ], + [ + 8086, + 0.15 + ], + [ + 8087, + 0.15 + ], + [ + 8088, + 0.15 + ], + [ + 8089, + 0.15 + ], + [ + 8090, + 0.15 + ], + [ + 8091, + 0.15 + ], + [ + 8092, + 0.15 + ], + [ + 8093, + 0.15 + ], + [ + 8094, + 0.15 + ], + [ + 8095, + 0.15 + ], + [ + 8096, + 0.55 + ], + [ + 8097, + 0.95 + ], + [ + 8098, + 0.95 + ], + [ + 8099, + 0.95 + ], + [ + 8100, + 0.7 + ], + [ + 8101, + 0.95 + ], + [ + 8102, + 0.95 + ], + [ + 8103, + 0.95 + ], + [ + 8104, + 0.95 + ], + [ + 8105, + 0.45 + ], + [ + 8106, + 0.15 + ], + [ + 8107, + 0.15 + ], + [ + 8108, + 0.15 + ], + [ + 8109, + 0.15 + ], + [ + 8110, + 0.15 + ], + [ + 8111, + 0.15 + ], + [ + 8112, + 0.15 + ], + [ + 8113, + 0.15 + ], + [ + 8114, + 0.15 + ], + [ + 8115, + 0.15 + ], + [ + 8116, + 0.15 + ], + [ + 8117, + 0.15 + ], + [ + 8118, + 0.15 + ], + [ + 8119, + 0.15 + ], + [ + 8120, + 0.55 + ], + [ + 8121, + 0.95 + ], + [ + 8122, + 0.95 + ], + [ + 8123, + 0.95 + ], + [ + 8124, + 0.7 + ], + [ + 8125, + 0.95 + ], + [ + 8126, + 0.95 + ], + [ + 8127, + 0.95 + ], + [ + 8128, + 0.95 + ], + [ + 8129, + 0.45 + ], + [ + 8130, + 0.15 + ], + [ + 8131, + 0.15 + ], + [ + 8132, + 0.15 + ], + [ + 8133, + 0.15 + ], + [ + 8134, + 0.15 + ], + [ + 8135, + 0.15 + ], + [ + 8136, + 0.15 + ], + [ + 8137, + 0.15 + ], + [ + 8138, + 0.15 + ], + [ + 8139, + 0.15 + ], + [ + 8140, + 0.15 + ], + [ + 8141, + 0.15 + ], + [ + 8142, + 0.15 + ], + [ + 8143, + 0.15 + ], + [ + 8144, + 0.55 + ], + [ + 8145, + 0.95 + ], + [ + 8146, + 0.95 + ], + [ + 8147, + 0.95 + ], + [ + 8148, + 0.7 + ], + [ + 8149, + 0.95 + ], + [ + 8150, + 0.95 + ], + [ + 8151, + 0.95 + ], + [ + 8152, + 0.95 + ], + [ + 8153, + 0.45 + ], + [ + 8154, + 0.15 + ], + [ + 8155, + 0.15 + ], + [ + 8156, + 0.15 + ], + [ + 8157, + 0.15 + ], + [ + 8158, + 0.15 + ], + [ + 8159, + 0.15 + ], + [ + 8160, + 0.15 + ], + [ + 8161, + 0.15 + ], + [ + 8162, + 0.15 + ], + [ + 8163, + 0.15 + ], + [ + 8164, + 0.15 + ], + [ + 8165, + 0.15 + ], + [ + 8166, + 0.15 + ], + [ + 8167, + 0.15 + ], + [ + 8168, + 0.55 + ], + [ + 8169, + 0.95 + ], + [ + 8170, + 0.95 + ], + [ + 8171, + 0.95 + ], + [ + 8172, + 0.7 + ], + [ + 8173, + 0.95 + ], + [ + 8174, + 0.95 + ], + [ + 8175, + 0.95 + ], + [ + 8176, + 0.95 + ], + [ + 8177, + 0.45 + ], + [ + 8178, + 0.15 + ], + [ + 8179, + 0.15 + ], + [ + 8180, + 0.15 + ], + [ + 8181, + 0.15 + ], + [ + 8182, + 0.15 + ], + [ + 8183, + 0.15 + ], + [ + 8184, + 0.12 + ], + [ + 8185, + 0.12 + ], + [ + 8186, + 0.12 + ], + [ + 8187, + 0.12 + ], + [ + 8188, + 0.12 + ], + [ + 8189, + 0.12 + ], + [ + 8190, + 0.12 + ], + [ + 8191, + 0.12 + ], + [ + 8192, + 0.12 + ], + [ + 8193, + 0.12 + ], + [ + 8194, + 0.2 + ], + [ + 8195, + 0.2 + ], + [ + 8196, + 0.18 + ], + [ + 8197, + 0.12 + ], + [ + 8198, + 0.12 + ], + [ + 8199, + 0.12 + ], + [ + 8200, + 0.12 + ], + [ + 8201, + 0.12 + ], + [ + 8202, + 0.12 + ], + [ + 8203, + 0.12 + ], + [ + 8204, + 0.12 + ], + [ + 8205, + 0.12 + ], + [ + 8206, + 0.12 + ], + [ + 8207, + 0.12 + ], + [ + 8208, + 0.12 + ], + [ + 8209, + 0.12 + ], + [ + 8210, + 0.12 + ], + [ + 8211, + 0.12 + ], + [ + 8212, + 0.12 + ], + [ + 8213, + 0.12 + ], + [ + 8214, + 0.12 + ], + [ + 8215, + 0.12 + ], + [ + 8216, + 0.12 + ], + [ + 8217, + 0.12 + ], + [ + 8218, + 0.2 + ], + [ + 8219, + 0.2 + ], + [ + 8220, + 0.18 + ], + [ + 8221, + 0.12 + ], + [ + 8222, + 0.12 + ], + [ + 8223, + 0.12 + ], + [ + 8224, + 0.12 + ], + [ + 8225, + 0.12 + ], + [ + 8226, + 0.12 + ], + [ + 8227, + 0.12 + ], + [ + 8228, + 0.12 + ], + [ + 8229, + 0.12 + ], + [ + 8230, + 0.12 + ], + [ + 8231, + 0.12 + ], + [ + 8232, + 0.15 + ], + [ + 8233, + 0.15 + ], + [ + 8234, + 0.15 + ], + [ + 8235, + 0.15 + ], + [ + 8236, + 0.15 + ], + [ + 8237, + 0.15 + ], + [ + 8238, + 0.15 + ], + [ + 8239, + 0.15 + ], + [ + 8240, + 0.55 + ], + [ + 8241, + 0.95 + ], + [ + 8242, + 0.95 + ], + [ + 8243, + 0.95 + ], + [ + 8244, + 0.7 + ], + [ + 8245, + 0.95 + ], + [ + 8246, + 0.95 + ], + [ + 8247, + 0.95 + ], + [ + 8248, + 0.95 + ], + [ + 8249, + 0.45 + ], + [ + 8250, + 0.15 + ], + [ + 8251, + 0.15 + ], + [ + 8252, + 0.15 + ], + [ + 8253, + 0.15 + ], + [ + 8254, + 0.15 + ], + [ + 8255, + 0.15 + ], + [ + 8256, + 0.15 + ], + [ + 8257, + 0.15 + ], + [ + 8258, + 0.15 + ], + [ + 8259, + 0.15 + ], + [ + 8260, + 0.15 + ], + [ + 8261, + 0.15 + ], + [ + 8262, + 0.15 + ], + [ + 8263, + 0.15 + ], + [ + 8264, + 0.55 + ], + [ + 8265, + 0.95 + ], + [ + 8266, + 0.95 + ], + [ + 8267, + 0.95 + ], + [ + 8268, + 0.7 + ], + [ + 8269, + 0.95 + ], + [ + 8270, + 0.95 + ], + [ + 8271, + 0.95 + ], + [ + 8272, + 0.95 + ], + [ + 8273, + 0.45 + ], + [ + 8274, + 0.15 + ], + [ + 8275, + 0.15 + ], + [ + 8276, + 0.15 + ], + [ + 8277, + 0.15 + ], + [ + 8278, + 0.15 + ], + [ + 8279, + 0.15 + ], + [ + 8280, + 0.15 + ], + [ + 8281, + 0.15 + ], + [ + 8282, + 0.15 + ], + [ + 8283, + 0.15 + ], + [ + 8284, + 0.15 + ], + [ + 8285, + 0.15 + ], + [ + 8286, + 0.15 + ], + [ + 8287, + 0.15 + ], + [ + 8288, + 0.55 + ], + [ + 8289, + 0.95 + ], + [ + 8290, + 0.95 + ], + [ + 8291, + 0.95 + ], + [ + 8292, + 0.7 + ], + [ + 8293, + 0.95 + ], + [ + 8294, + 0.95 + ], + [ + 8295, + 0.95 + ], + [ + 8296, + 0.95 + ], + [ + 8297, + 0.45 + ], + [ + 8298, + 0.15 + ], + [ + 8299, + 0.15 + ], + [ + 8300, + 0.15 + ], + [ + 8301, + 0.15 + ], + [ + 8302, + 0.15 + ], + [ + 8303, + 0.15 + ], + [ + 8304, + 0.15 + ], + [ + 8305, + 0.15 + ], + [ + 8306, + 0.15 + ], + [ + 8307, + 0.15 + ], + [ + 8308, + 0.15 + ], + [ + 8309, + 0.15 + ], + [ + 8310, + 0.15 + ], + [ + 8311, + 0.15 + ], + [ + 8312, + 0.55 + ], + [ + 8313, + 0.95 + ], + [ + 8314, + 0.95 + ], + [ + 8315, + 0.95 + ], + [ + 8316, + 0.7 + ], + [ + 8317, + 0.95 + ], + [ + 8318, + 0.95 + ], + [ + 8319, + 0.95 + ], + [ + 8320, + 0.95 + ], + [ + 8321, + 0.45 + ], + [ + 8322, + 0.15 + ], + [ + 8323, + 0.15 + ], + [ + 8324, + 0.15 + ], + [ + 8325, + 0.15 + ], + [ + 8326, + 0.15 + ], + [ + 8327, + 0.15 + ], + [ + 8328, + 0.15 + ], + [ + 8329, + 0.15 + ], + [ + 8330, + 0.15 + ], + [ + 8331, + 0.15 + ], + [ + 8332, + 0.15 + ], + [ + 8333, + 0.15 + ], + [ + 8334, + 0.15 + ], + [ + 8335, + 0.15 + ], + [ + 8336, + 0.55 + ], + [ + 8337, + 0.95 + ], + [ + 8338, + 0.95 + ], + [ + 8339, + 0.95 + ], + [ + 8340, + 0.7 + ], + [ + 8341, + 0.95 + ], + [ + 8342, + 0.95 + ], + [ + 8343, + 0.95 + ], + [ + 8344, + 0.95 + ], + [ + 8345, + 0.45 + ], + [ + 8346, + 0.15 + ], + [ + 8347, + 0.15 + ], + [ + 8348, + 0.15 + ], + [ + 8349, + 0.15 + ], + [ + 8350, + 0.15 + ], + [ + 8351, + 0.15 + ], + [ + 8352, + 0.12 + ], + [ + 8353, + 0.12 + ], + [ + 8354, + 0.12 + ], + [ + 8355, + 0.12 + ], + [ + 8356, + 0.12 + ], + [ + 8357, + 0.12 + ], + [ + 8358, + 0.12 + ], + [ + 8359, + 0.12 + ], + [ + 8360, + 0.12 + ], + [ + 8361, + 0.12 + ], + [ + 8362, + 0.2 + ], + [ + 8363, + 0.2 + ], + [ + 8364, + 0.18 + ], + [ + 8365, + 0.12 + ], + [ + 8366, + 0.12 + ], + [ + 8367, + 0.12 + ], + [ + 8368, + 0.12 + ], + [ + 8369, + 0.12 + ], + [ + 8370, + 0.12 + ], + [ + 8371, + 0.12 + ], + [ + 8372, + 0.12 + ], + [ + 8373, + 0.12 + ], + [ + 8374, + 0.12 + ], + [ + 8375, + 0.12 + ], + [ + 8376, + 0.12 + ], + [ + 8377, + 0.12 + ], + [ + 8378, + 0.12 + ], + [ + 8379, + 0.12 + ], + [ + 8380, + 0.12 + ], + [ + 8381, + 0.12 + ], + [ + 8382, + 0.12 + ], + [ + 8383, + 0.12 + ], + [ + 8384, + 0.12 + ], + [ + 8385, + 0.12 + ], + [ + 8386, + 0.2 + ], + [ + 8387, + 0.2 + ], + [ + 8388, + 0.18 + ], + [ + 8389, + 0.12 + ], + [ + 8390, + 0.12 + ], + [ + 8391, + 0.12 + ], + [ + 8392, + 0.12 + ], + [ + 8393, + 0.12 + ], + [ + 8394, + 0.12 + ], + [ + 8395, + 0.12 + ], + [ + 8396, + 0.12 + ], + [ + 8397, + 0.12 + ], + [ + 8398, + 0.12 + ], + [ + 8399, + 0.12 + ], + [ + 8400, + 0.15 + ], + [ + 8401, + 0.15 + ], + [ + 8402, + 0.15 + ], + [ + 8403, + 0.15 + ], + [ + 8404, + 0.15 + ], + [ + 8405, + 0.15 + ], + [ + 8406, + 0.15 + ], + [ + 8407, + 0.15 + ], + [ + 8408, + 0.55 + ], + [ + 8409, + 0.95 + ], + [ + 8410, + 0.95 + ], + [ + 8411, + 0.95 + ], + [ + 8412, + 0.7 + ], + [ + 8413, + 0.95 + ], + [ + 8414, + 0.95 + ], + [ + 8415, + 0.95 + ], + [ + 8416, + 0.95 + ], + [ + 8417, + 0.45 + ], + [ + 8418, + 0.15 + ], + [ + 8419, + 0.15 + ], + [ + 8420, + 0.15 + ], + [ + 8421, + 0.15 + ], + [ + 8422, + 0.15 + ], + [ + 8423, + 0.15 + ], + [ + 8424, + 0.15 + ], + [ + 8425, + 0.15 + ], + [ + 8426, + 0.15 + ], + [ + 8427, + 0.15 + ], + [ + 8428, + 0.15 + ], + [ + 8429, + 0.15 + ], + [ + 8430, + 0.15 + ], + [ + 8431, + 0.15 + ], + [ + 8432, + 0.55 + ], + [ + 8433, + 0.95 + ], + [ + 8434, + 0.95 + ], + [ + 8435, + 0.95 + ], + [ + 8436, + 0.7 + ], + [ + 8437, + 0.95 + ], + [ + 8438, + 0.95 + ], + [ + 8439, + 0.95 + ], + [ + 8440, + 0.95 + ], + [ + 8441, + 0.45 + ], + [ + 8442, + 0.15 + ], + [ + 8443, + 0.15 + ], + [ + 8444, + 0.15 + ], + [ + 8445, + 0.15 + ], + [ + 8446, + 0.15 + ], + [ + 8447, + 0.15 + ], + [ + 8448, + 0.15 + ], + [ + 8449, + 0.15 + ], + [ + 8450, + 0.15 + ], + [ + 8451, + 0.15 + ], + [ + 8452, + 0.15 + ], + [ + 8453, + 0.15 + ], + [ + 8454, + 0.15 + ], + [ + 8455, + 0.15 + ], + [ + 8456, + 0.55 + ], + [ + 8457, + 0.95 + ], + [ + 8458, + 0.95 + ], + [ + 8459, + 0.95 + ], + [ + 8460, + 0.7 + ], + [ + 8461, + 0.95 + ], + [ + 8462, + 0.95 + ], + [ + 8463, + 0.95 + ], + [ + 8464, + 0.95 + ], + [ + 8465, + 0.45 + ], + [ + 8466, + 0.15 + ], + [ + 8467, + 0.15 + ], + [ + 8468, + 0.15 + ], + [ + 8469, + 0.15 + ], + [ + 8470, + 0.15 + ], + [ + 8471, + 0.15 + ], + [ + 8472, + 0.15 + ], + [ + 8473, + 0.15 + ], + [ + 8474, + 0.15 + ], + [ + 8475, + 0.15 + ], + [ + 8476, + 0.15 + ], + [ + 8477, + 0.15 + ], + [ + 8478, + 0.15 + ], + [ + 8479, + 0.15 + ], + [ + 8480, + 0.55 + ], + [ + 8481, + 0.95 + ], + [ + 8482, + 0.95 + ], + [ + 8483, + 0.95 + ], + [ + 8484, + 0.7 + ], + [ + 8485, + 0.95 + ], + [ + 8486, + 0.95 + ], + [ + 8487, + 0.95 + ], + [ + 8488, + 0.95 + ], + [ + 8489, + 0.45 + ], + [ + 8490, + 0.15 + ], + [ + 8491, + 0.15 + ], + [ + 8492, + 0.15 + ], + [ + 8493, + 0.15 + ], + [ + 8494, + 0.15 + ], + [ + 8495, + 0.15 + ], + [ + 8496, + 0.15 + ], + [ + 8497, + 0.15 + ], + [ + 8498, + 0.15 + ], + [ + 8499, + 0.15 + ], + [ + 8500, + 0.15 + ], + [ + 8501, + 0.15 + ], + [ + 8502, + 0.15 + ], + [ + 8503, + 0.15 + ], + [ + 8504, + 0.55 + ], + [ + 8505, + 0.95 + ], + [ + 8506, + 0.95 + ], + [ + 8507, + 0.95 + ], + [ + 8508, + 0.7 + ], + [ + 8509, + 0.95 + ], + [ + 8510, + 0.95 + ], + [ + 8511, + 0.95 + ], + [ + 8512, + 0.95 + ], + [ + 8513, + 0.45 + ], + [ + 8514, + 0.15 + ], + [ + 8515, + 0.15 + ], + [ + 8516, + 0.15 + ], + [ + 8517, + 0.15 + ], + [ + 8518, + 0.15 + ], + [ + 8519, + 0.15 + ], + [ + 8520, + 0.12 + ], + [ + 8521, + 0.12 + ], + [ + 8522, + 0.12 + ], + [ + 8523, + 0.12 + ], + [ + 8524, + 0.12 + ], + [ + 8525, + 0.12 + ], + [ + 8526, + 0.12 + ], + [ + 8527, + 0.12 + ], + [ + 8528, + 0.12 + ], + [ + 8529, + 0.12 + ], + [ + 8530, + 0.2 + ], + [ + 8531, + 0.2 + ], + [ + 8532, + 0.18 + ], + [ + 8533, + 0.12 + ], + [ + 8534, + 0.12 + ], + [ + 8535, + 0.12 + ], + [ + 8536, + 0.12 + ], + [ + 8537, + 0.12 + ], + [ + 8538, + 0.12 + ], + [ + 8539, + 0.12 + ], + [ + 8540, + 0.12 + ], + [ + 8541, + 0.12 + ], + [ + 8542, + 0.12 + ], + [ + 8543, + 0.12 + ], + [ + 8544, + 0.12 + ], + [ + 8545, + 0.12 + ], + [ + 8546, + 0.12 + ], + [ + 8547, + 0.12 + ], + [ + 8548, + 0.12 + ], + [ + 8549, + 0.12 + ], + [ + 8550, + 0.12 + ], + [ + 8551, + 0.12 + ], + [ + 8552, + 0.12 + ], + [ + 8553, + 0.12 + ], + [ + 8554, + 0.2 + ], + [ + 8555, + 0.2 + ], + [ + 8556, + 0.18 + ], + [ + 8557, + 0.12 + ], + [ + 8558, + 0.12 + ], + [ + 8559, + 0.12 + ], + [ + 8560, + 0.12 + ], + [ + 8561, + 0.12 + ], + [ + 8562, + 0.12 + ], + [ + 8563, + 0.12 + ], + [ + 8564, + 0.12 + ], + [ + 8565, + 0.12 + ], + [ + 8566, + 0.12 + ], + [ + 8567, + 0.12 + ], + [ + 8568, + 0.15 + ], + [ + 8569, + 0.15 + ], + [ + 8570, + 0.15 + ], + [ + 8571, + 0.15 + ], + [ + 8572, + 0.15 + ], + [ + 8573, + 0.15 + ], + [ + 8574, + 0.15 + ], + [ + 8575, + 0.15 + ], + [ + 8576, + 0.55 + ], + [ + 8577, + 0.95 + ], + [ + 8578, + 0.95 + ], + [ + 8579, + 0.95 + ], + [ + 8580, + 0.7 + ], + [ + 8581, + 0.95 + ], + [ + 8582, + 0.95 + ], + [ + 8583, + 0.95 + ], + [ + 8584, + 0.95 + ], + [ + 8585, + 0.45 + ], + [ + 8586, + 0.15 + ], + [ + 8587, + 0.15 + ], + [ + 8588, + 0.15 + ], + [ + 8589, + 0.15 + ], + [ + 8590, + 0.15 + ], + [ + 8591, + 0.15 + ], + [ + 8592, + 0.15 + ], + [ + 8593, + 0.15 + ], + [ + 8594, + 0.15 + ], + [ + 8595, + 0.15 + ], + [ + 8596, + 0.15 + ], + [ + 8597, + 0.15 + ], + [ + 8598, + 0.15 + ], + [ + 8599, + 0.15 + ], + [ + 8600, + 0.55 + ], + [ + 8601, + 0.95 + ], + [ + 8602, + 0.95 + ], + [ + 8603, + 0.95 + ], + [ + 8604, + 0.7 + ], + [ + 8605, + 0.95 + ], + [ + 8606, + 0.95 + ], + [ + 8607, + 0.95 + ], + [ + 8608, + 0.95 + ], + [ + 8609, + 0.45 + ], + [ + 8610, + 0.15 + ], + [ + 8611, + 0.15 + ], + [ + 8612, + 0.15 + ], + [ + 8613, + 0.15 + ], + [ + 8614, + 0.15 + ], + [ + 8615, + 0.15 + ], + [ + 8616, + 0.15 + ], + [ + 8617, + 0.15 + ], + [ + 8618, + 0.15 + ], + [ + 8619, + 0.15 + ], + [ + 8620, + 0.15 + ], + [ + 8621, + 0.15 + ], + [ + 8622, + 0.15 + ], + [ + 8623, + 0.15 + ], + [ + 8624, + 0.55 + ], + [ + 8625, + 0.95 + ], + [ + 8626, + 0.95 + ], + [ + 8627, + 0.95 + ], + [ + 8628, + 0.7 + ], + [ + 8629, + 0.95 + ], + [ + 8630, + 0.95 + ], + [ + 8631, + 0.95 + ], + [ + 8632, + 0.95 + ], + [ + 8633, + 0.45 + ], + [ + 8634, + 0.15 + ], + [ + 8635, + 0.15 + ], + [ + 8636, + 0.15 + ], + [ + 8637, + 0.15 + ], + [ + 8638, + 0.15 + ], + [ + 8639, + 0.15 + ], + [ + 8640, + 0.15 + ], + [ + 8641, + 0.15 + ], + [ + 8642, + 0.15 + ], + [ + 8643, + 0.15 + ], + [ + 8644, + 0.15 + ], + [ + 8645, + 0.15 + ], + [ + 8646, + 0.15 + ], + [ + 8647, + 0.15 + ], + [ + 8648, + 0.55 + ], + [ + 8649, + 0.95 + ], + [ + 8650, + 0.95 + ], + [ + 8651, + 0.95 + ], + [ + 8652, + 0.7 + ], + [ + 8653, + 0.95 + ], + [ + 8654, + 0.95 + ], + [ + 8655, + 0.95 + ], + [ + 8656, + 0.95 + ], + [ + 8657, + 0.45 + ], + [ + 8658, + 0.15 + ], + [ + 8659, + 0.15 + ], + [ + 8660, + 0.15 + ], + [ + 8661, + 0.15 + ], + [ + 8662, + 0.15 + ], + [ + 8663, + 0.15 + ], + [ + 8664, + 0.15 + ], + [ + 8665, + 0.15 + ], + [ + 8666, + 0.15 + ], + [ + 8667, + 0.15 + ], + [ + 8668, + 0.15 + ], + [ + 8669, + 0.15 + ], + [ + 8670, + 0.15 + ], + [ + 8671, + 0.15 + ], + [ + 8672, + 0.55 + ], + [ + 8673, + 0.95 + ], + [ + 8674, + 0.95 + ], + [ + 8675, + 0.95 + ], + [ + 8676, + 0.7 + ], + [ + 8677, + 0.95 + ], + [ + 8678, + 0.95 + ], + [ + 8679, + 0.95 + ], + [ + 8680, + 0.95 + ], + [ + 8681, + 0.45 + ], + [ + 8682, + 0.15 + ], + [ + 8683, + 0.15 + ], + [ + 8684, + 0.15 + ], + [ + 8685, + 0.15 + ], + [ + 8686, + 0.15 + ], + [ + 8687, + 0.15 + ], + [ + 8688, + 0.12 + ], + [ + 8689, + 0.12 + ], + [ + 8690, + 0.12 + ], + [ + 8691, + 0.12 + ], + [ + 8692, + 0.12 + ], + [ + 8693, + 0.12 + ], + [ + 8694, + 0.12 + ], + [ + 8695, + 0.12 + ], + [ + 8696, + 0.12 + ], + [ + 8697, + 0.12 + ], + [ + 8698, + 0.2 + ], + [ + 8699, + 0.2 + ], + [ + 8700, + 0.18 + ], + [ + 8701, + 0.12 + ], + [ + 8702, + 0.12 + ], + [ + 8703, + 0.12 + ], + [ + 8704, + 0.12 + ], + [ + 8705, + 0.12 + ], + [ + 8706, + 0.12 + ], + [ + 8707, + 0.12 + ], + [ + 8708, + 0.12 + ], + [ + 8709, + 0.12 + ], + [ + 8710, + 0.12 + ], + [ + 8711, + 0.12 + ], + [ + 8712, + 0.12 + ], + [ + 8713, + 0.12 + ], + [ + 8714, + 0.12 + ], + [ + 8715, + 0.12 + ], + [ + 8716, + 0.12 + ], + [ + 8717, + 0.12 + ], + [ + 8718, + 0.12 + ], + [ + 8719, + 0.12 + ], + [ + 8720, + 0.12 + ], + [ + 8721, + 0.12 + ], + [ + 8722, + 0.2 + ], + [ + 8723, + 0.2 + ], + [ + 8724, + 0.18 + ], + [ + 8725, + 0.12 + ], + [ + 8726, + 0.12 + ], + [ + 8727, + 0.12 + ], + [ + 8728, + 0.12 + ], + [ + 8729, + 0.12 + ], + [ + 8730, + 0.12 + ], + [ + 8731, + 0.12 + ], + [ + 8732, + 0.12 + ], + [ + 8733, + 0.12 + ], + [ + 8734, + 0.12 + ], + [ + 8735, + 0.12 + ], + [ + 8736, + 0.15 + ], + [ + 8737, + 0.15 + ], + [ + 8738, + 0.15 + ], + [ + 8739, + 0.15 + ], + [ + 8740, + 0.15 + ], + [ + 8741, + 0.15 + ], + [ + 8742, + 0.15 + ], + [ + 8743, + 0.15 + ], + [ + 8744, + 0.55 + ], + [ + 8745, + 0.95 + ], + [ + 8746, + 0.95 + ], + [ + 8747, + 0.95 + ], + [ + 8748, + 0.7 + ], + [ + 8749, + 0.95 + ], + [ + 8750, + 0.95 + ], + [ + 8751, + 0.95 + ], + [ + 8752, + 0.95 + ], + [ + 8753, + 0.45 + ], + [ + 8754, + 0.15 + ], + [ + 8755, + 0.15 + ], + [ + 8756, + 0.15 + ], + [ + 8757, + 0.15 + ], + [ + 8758, + 0.15 + ], + [ + 8759, + 0.15 + ] + ] + }, + { + "_type": "SAM.Analytical.Profile,SAM.Analytical", + "Name": "FIX_IC_BOX_EQL", + "Guid": "4ddaf533-f5c1-451e-87a6-3847b45c70c3", + "Category": "Equipment Latent", + "Values": [ + [ + 0, + 0.4 + ] + ] + }, + { + "_type": "SAM.Analytical.Profile,SAM.Analytical", + "Name": "FIX_IC_BOX_INF", + "Guid": "de7a4014-9d2a-4dd4-88b5-be6a8007b6b3", + "Category": "Infiltration", + "Values": [ + [ + 0, + 1.0 + ], + [ + 1, + 1.0 + ], + [ + 2, + 1.0 + ], + [ + 3, + 1.0 + ], + [ + 4, + 1.0 + ], + [ + 5, + 1.0 + ], + [ + 6, + 1.0 + ], + [ + 7, + 0.8 + ], + [ + 8, + 0.65 + ], + [ + 9, + 0.65 + ], + [ + 10, + 0.65 + ], + [ + 11, + 0.65 + ], + [ + 12, + 0.7 + ], + [ + 13, + 0.65 + ], + [ + 14, + 0.65 + ], + [ + 15, + 0.65 + ], + [ + 16, + 0.65 + ], + [ + 17, + 0.65 + ], + [ + 18, + 0.85 + ], + [ + 19, + 1.0 + ], + [ + 20, + 1.0 + ], + [ + 21, + 1.0 + ], + [ + 22, + 1.0 + ], + [ + 23, + 1.0 + ] + ] + }, + { + "_type": "SAM.Analytical.Profile,SAM.Analytical", + "Name": "FIX_IC_BOX_HTG", + "Guid": "2ff0051c-28d6-407e-a223-2dc866c4c0ed", + "Category": "Heating", + "Values": [ + [ + 0, + 16.0 + ], + [ + 1, + 16.0 + ], + [ + 2, + 16.0 + ], + [ + 3, + 16.0 + ], + [ + 4, + 16.0 + ], + [ + 5, + 16.0 + ], + [ + 6, + 16.0 + ], + [ + 7, + 21.0 + ], + [ + 8, + 21.0 + ], + [ + 9, + 21.0 + ], + [ + 10, + 21.0 + ], + [ + 11, + 21.0 + ], + [ + 12, + 21.0 + ], + [ + 13, + 21.0 + ], + [ + 14, + 21.0 + ], + [ + 15, + 21.0 + ], + [ + 16, + 21.0 + ], + [ + 17, + 21.0 + ], + [ + 18, + 21.0 + ], + [ + 19, + 16.0 + ], + [ + 20, + 16.0 + ], + [ + 21, + 16.0 + ], + [ + 22, + 16.0 + ], + [ + 23, + 16.0 + ] + ] + }, + { + "_type": "SAM.Analytical.Profile,SAM.Analytical", + "Name": "FIX_IC_BOX_CLG", + "Guid": "1913712f-f50a-41ea-8124-1c11256c6800", + "Category": "Cooling", + "Values": [ + [ + 0, + 28.0 + ], + [ + 1, + 28.0 + ], + [ + 2, + 28.0 + ], + [ + 3, + 28.0 + ], + [ + 4, + 28.0 + ], + [ + 5, + 28.0 + ], + [ + 6, + 28.0 + ], + [ + 7, + 24.0 + ], + [ + 8, + 24.0 + ], + [ + 9, + 24.0 + ], + [ + 10, + 24.0 + ], + [ + 11, + 24.0 + ], + [ + 12, + 24.0 + ], + [ + 13, + 24.0 + ], + [ + 14, + 24.0 + ], + [ + 15, + 24.0 + ], + [ + 16, + 24.0 + ], + [ + 17, + 24.0 + ], + [ + 18, + 24.0 + ], + [ + 19, + 28.0 + ], + [ + 20, + 28.0 + ], + [ + 21, + 28.0 + ], + [ + 22, + 28.0 + ], + [ + 23, + 28.0 + ] + ] + }, + { + "_type": "SAM.Analytical.Profile,SAM.Analytical", + "Name": "FIX_IC_BOX_HUM", + "Guid": "a113404d-fe01-4642-8831-03ccc7885400", + "Category": "Humidification", + "Values": [ + [ + 0, + 35.0 + ] + ] + }, + { + "_type": "SAM.Analytical.Profile,SAM.Analytical", + "Name": "FIX_IC_BOX_DHU", + "Guid": "3d009e5c-bac9-46b2-af9d-84806297bc31", + "Category": "Dehumidification", + "Values": [ + [ + 0, + 65.0 + ] + ] + }, + { + "_type": "SAM.Analytical.Profile,SAM.Analytical", + "Name": "FIX_IC_BOX_VNT", + "Guid": "970842a3-f72a-4985-a7c5-54048b2b037c", + "Category": "Ventilation", + "Values": [ + [ + 0, + 0.0 + ], + [ + 1, + 0.0 + ], + [ + 2, + 0.0 + ], + [ + 3, + 0.0 + ], + [ + 4, + 0.0 + ], + [ + 5, + 0.0 + ], + [ + 6, + 0.0 + ], + [ + 7, + 1.0 + ], + [ + 8, + 1.0 + ], + [ + 9, + 1.0 + ], + [ + 10, + 1.0 + ], + [ + 11, + 1.0 + ], + [ + 12, + 0.8 + ], + [ + 13, + 1.0 + ], + [ + 14, + 1.0 + ], + [ + 15, + 1.0 + ], + [ + 16, + 1.0 + ], + [ + 17, + 1.0 + ], + [ + 18, + 0.6 + ], + [ + 19, + 0.0 + ], + [ + 20, + 0.0 + ], + [ + 21, + 0.0 + ], + [ + 22, + 0.0 + ], + [ + 23, + 0.0 + ] + ] + } + ] + } + } +] \ No newline at end of file diff --git a/benchmark/SAM.Analytical.OpenStudio.InputReadBack/Fixtures/s08-fix-two.json b/benchmark/SAM.Analytical.OpenStudio.InputReadBack/Fixtures/s08-fix-two.json new file mode 100644 index 0000000..2112de5 --- /dev/null +++ b/benchmark/SAM.Analytical.OpenStudio.InputReadBack/Fixtures/s08-fix-two.json @@ -0,0 +1,38962 @@ +[ + { + "_type": "SAM.Analytical.AnalyticalModel,SAM.Analytical", + "Name": "s08-fix-two", + "Guid": "cf75fa35-6bcf-4418-b060-a342d99b533f", + "Description": "S08 PR-C equivalence fixture: two zones, V1, centre-line (mid-surface) panels with PhysicalThickness = construction layer total", + "AdjacencyCluster": { + "_type": "SAM.Analytical.AdjacencyCluster,SAM.Analytical", + "Guid": "f8f2eead-23df-4d66-863a-16911a100969", + "Objects": [ + { + "Key": "SAM.Analytical.Space", + "Value": [ + { + "Key": "5080c000-0000-0000-0000-00000000c0a1", + "Value": { + "_type": "SAM.Analytical.Space,SAM.Analytical", + "ParameterSets": [ + { + "_type": "SAM.Core.ParameterSet", + "Name": "SAM.Analytical", + "Guid": "364a2db8-8af5-4624-a75e-66391df5307d", + "Parameters": [ + { + "Name": "Area", + "Value": 24.3 + }, + { + "Name": "Volume", + "Value": 74.115 + }, + { + "Name": "Occupancy", + "Value": 2.0 + } + ] + } + ], + "Name": "FixA", + "Guid": "5080c000-0000-0000-0000-00000000c0a1", + "Location": { + "_type": "SAM.Geometry.Spatial.Point3D,SAM.Geometry", + "X": 2.25, + "Y": 2.7, + "Z": 1.2 + }, + "InternalCondition": { + "_type": "SAM.Analytical.InternalCondition,SAM.Analytical", + "ParameterSets": [ + { + "_type": "SAM.Core.ParameterSet", + "Name": "SAM.Analytical", + "Guid": "364a2db8-8af5-4624-a75e-66391df5307d", + "Parameters": [ + { + "Name": "Occupancy Sensible Gain Per Person", + "Value": 70.0 + }, + { + "Name": "Occupancy Latent Gain Per Person", + "Value": 45.0 + }, + { + "Name": "Lighting Gain Per Area", + "Value": 6.2 + }, + { + "Name": "Equipment Sensible Gain Per Area", + "Value": 9.4 + }, + { + "Name": "Equipment Latent Gain Per Area", + "Value": 0.6 + }, + { + "Name": "Infiltration Air Changes Per Hour", + "Value": 0.22 + }, + { + "Name": "Lighting Radiant Proportion", + "Value": 0.34 + }, + { + "Name": "Occupancy Radiant Proportion", + "Value": 0.26 + }, + { + "Name": "Equipment Radiant Proportion", + "Value": 0.19 + }, + { + "Name": "Supply Air Flow Per Person", + "Value": 0.008 + }, + { + "Name": "Supply Air Flow Per Area", + "Value": 0.0006 + }, + { + "Name": "Occupancy Profile Name", + "Value": "FIX_IC_A_OCC" + }, + { + "Name": "Lighting Profile Name", + "Value": "FIX_IC_A_LGT" + }, + { + "Name": "Equipment Sensible Profile Name", + "Value": "FIX_IC_A_EQS" + }, + { + "Name": "Equipment Latent Profile Name", + "Value": "FIX_IC_A_EQL" + }, + { + "Name": "Infiltration Profile Name", + "Value": "FIX_IC_A_INF" + }, + { + "Name": "Heating Profile Name", + "Value": "FIX_IC_A_HTG" + }, + { + "Name": "Cooling Profile Name", + "Value": "FIX_IC_A_CLG" + }, + { + "Name": "Humidification Profile Name", + "Value": "FIX_IC_A_HUM" + }, + { + "Name": "Dehumidification Profile Name", + "Value": "FIX_IC_A_DHU" + } + ] + } + ], + "Name": "FIX_IC_A", + "Guid": "ddb63c70-3a94-4ace-bde4-1f687d0e9934" + } + } + }, + { + "Key": "5080c000-0000-0000-0000-00000000c0b1", + "Value": { + "_type": "SAM.Analytical.Space,SAM.Analytical", + "ParameterSets": [ + { + "_type": "SAM.Core.ParameterSet", + "Name": "SAM.Analytical", + "Guid": "364a2db8-8af5-4624-a75e-66391df5307d", + "Parameters": [ + { + "Name": "Area", + "Value": 19.439999999999998 + }, + { + "Name": "Volume", + "Value": 59.29199999999999 + }, + { + "Name": "Occupancy", + "Value": 1.0 + } + ] + } + ], + "Name": "FixB", + "Guid": "5080c000-0000-0000-0000-00000000c0b1", + "Location": { + "_type": "SAM.Geometry.Spatial.Point3D,SAM.Geometry", + "X": 6.3, + "Y": 2.7, + "Z": 1.2 + }, + "InternalCondition": { + "_type": "SAM.Analytical.InternalCondition,SAM.Analytical", + "ParameterSets": [ + { + "_type": "SAM.Core.ParameterSet", + "Name": "SAM.Analytical", + "Guid": "364a2db8-8af5-4624-a75e-66391df5307d", + "Parameters": [ + { + "Name": "Occupancy Sensible Gain Per Person", + "Value": 65.0 + }, + { + "Name": "Occupancy Latent Gain Per Person", + "Value": 40.0 + }, + { + "Name": "Lighting Gain Per Area", + "Value": 4.8 + }, + { + "Name": "Equipment Sensible Gain Per Area", + "Value": 5.5 + }, + { + "Name": "Equipment Latent Gain Per Area", + "Value": 0.4 + }, + { + "Name": "Infiltration Air Changes Per Hour", + "Value": 0.4 + }, + { + "Name": "Lighting Radiant Proportion", + "Value": 0.41 + }, + { + "Name": "Occupancy Radiant Proportion", + "Value": 0.18 + }, + { + "Name": "Equipment Radiant Proportion", + "Value": 0.28 + }, + { + "Name": "Supply Air Changes Per Hour", + "Value": 0.75 + }, + { + "Name": "Occupancy Profile Name", + "Value": "FIX_IC_B_OCC" + }, + { + "Name": "Lighting Profile Name", + "Value": "FIX_IC_B_LGT" + }, + { + "Name": "Equipment Sensible Profile Name", + "Value": "FIX_IC_B_EQS" + }, + { + "Name": "Equipment Latent Profile Name", + "Value": "FIX_IC_B_EQL" + }, + { + "Name": "Infiltration Profile Name", + "Value": "FIX_IC_B_INF" + }, + { + "Name": "Heating Profile Name", + "Value": "FIX_IC_B_HTG" + }, + { + "Name": "Cooling Profile Name", + "Value": "FIX_IC_B_CLG" + }, + { + "Name": "Humidification Profile Name", + "Value": "FIX_IC_B_HUM" + }, + { + "Name": "Dehumidification Profile Name", + "Value": "FIX_IC_B_DHU" + } + ] + } + ], + "Name": "FIX_IC_B", + "Guid": "8340b906-e1c2-461c-ac4d-1069e5e67e40" + } + } + } + ] + }, + { + "Key": "SAM.Analytical.Panel", + "Value": [ + { + "Key": "26780260-a110-447e-b7ec-9e52919fb23d", + "Value": { + "_type": "SAM.Analytical.Panel,SAM.Analytical", + "ParameterSets": [ + { + "_type": "SAM.Core.ParameterSet", + "Name": "SAM.Analytical", + "Guid": "364a2db8-8af5-4624-a75e-66391df5307d", + "Parameters": [ + { + "Name": "Physical Thickness", + "Value": 0.33499999999999996 + } + ] + } + ], + "Name": "FIX_GRD_FLOOR", + "Guid": "26780260-a110-447e-b7ec-9e52919fb23d", + "Type": { + "_type": "SAM.Analytical.Construction,SAM.Analytical", + "Name": "FIX_GRD_FLOOR", + "Guid": "5080c000-0000-0000-0000-0000000000a3", + "ConstructionLayers": [ + { + "_type": "SAM.Analytical.ConstructionLayer,SAM.Analytical", + "Name": "FIX_Screed", + "Thickness": 0.065 + }, + { + "_type": "SAM.Analytical.ConstructionLayer,SAM.Analytical", + "Name": "FIX_EPS", + "Thickness": 0.12 + }, + { + "_type": "SAM.Analytical.ConstructionLayer,SAM.Analytical", + "Name": "FIX_Concrete", + "Thickness": 0.15 + } + ] + }, + "PanelType": "SlabOnGrade", + "PlanarBoundary3D": { + "_type": "SAM.Analytical.PlanarBoundary3D,SAM.Analytical", + "Guid": "5c8d365d-5601-4ed9-a665-1ed1a3cf848c", + "Plane": { + "_type": "SAM.Geometry.Spatial.Plane,SAM.Geometry", + "Origin": { + "_type": "SAM.Geometry.Spatial.Point3D,SAM.Geometry", + "X": 2.25, + "Y": 2.7, + "Z": 0 + }, + "Normal": { + "_type": "SAM.Geometry.Spatial.Vector3D,SAM.Geometry", + "X": 0, + "Y": 0, + "Z": -1 + }, + "AxisY": { + "_type": "SAM.Geometry.Spatial.Vector3D,SAM.Geometry", + "X": 0, + "Y": -1, + "Z": 0 + } + }, + "Edge2DLoop": { + "_type": "SAM.Analytical.BoundaryEdge2DLoop,SAM.Analytical", + "Guid": "dd7e9bcf-9a60-4b0f-b4be-2f0f89540928", + "BoundaryEdge2Ds": [ + { + "_type": "SAM.Analytical.BoundaryEdge2D,SAM.Analytical", + "Guid": "e2c7e993-1979-444f-8dfe-a033c50006f1", + "Curve2D": { + "_type": "SAM.Geometry.Planar.Segment2D,SAM.Geometry", + "Origin": { + "_type": "SAM.Geometry.Planar.Point2D,SAM.Geometry", + "X": -2.25, + "Y": 2.7 + }, + "Vector": { + "_type": "SAM.Geometry.Planar.Vector2D,SAM.Geometry", + "X": 0, + "Y": -5.4 + } + } + }, + { + "_type": "SAM.Analytical.BoundaryEdge2D,SAM.Analytical", + "Guid": "edb18ddd-7f2b-45b0-8416-27d94bf3cc05", + "Curve2D": { + "_type": "SAM.Geometry.Planar.Segment2D,SAM.Geometry", + "Origin": { + "_type": "SAM.Geometry.Planar.Point2D,SAM.Geometry", + "X": -2.25, + "Y": -2.7 + }, + "Vector": { + "_type": "SAM.Geometry.Planar.Vector2D,SAM.Geometry", + "X": 4.5, + "Y": 0 + } + } + }, + { + "_type": "SAM.Analytical.BoundaryEdge2D,SAM.Analytical", + "Guid": "a400c8be-cab7-469f-b984-ad3b0082ecf8", + "Curve2D": { + "_type": "SAM.Geometry.Planar.Segment2D,SAM.Geometry", + "Origin": { + "_type": "SAM.Geometry.Planar.Point2D,SAM.Geometry", + "X": 2.25, + "Y": -2.7 + }, + "Vector": { + "_type": "SAM.Geometry.Planar.Vector2D,SAM.Geometry", + "X": 0, + "Y": 5.4 + } + } + }, + { + "_type": "SAM.Analytical.BoundaryEdge2D,SAM.Analytical", + "Guid": "ba088f45-28d4-4950-b770-41d819d2441b", + "Curve2D": { + "_type": "SAM.Geometry.Planar.Segment2D,SAM.Geometry", + "Origin": { + "_type": "SAM.Geometry.Planar.Point2D,SAM.Geometry", + "X": 2.25, + "Y": 2.7 + }, + "Vector": { + "_type": "SAM.Geometry.Planar.Vector2D,SAM.Geometry", + "X": -4.5, + "Y": 0 + } + } + } + ] + } + } + } + }, + { + "Key": "fe8a6b43-ec73-4201-91e8-0dedf413b25c", + "Value": { + "_type": "SAM.Analytical.Panel,SAM.Analytical", + "ParameterSets": [ + { + "_type": "SAM.Core.ParameterSet", + "Name": "SAM.Analytical", + "Guid": "364a2db8-8af5-4624-a75e-66391df5307d", + "Parameters": [ + { + "Name": "Physical Thickness", + "Value": 0.19699999999999998 + } + ] + } + ], + "Name": "FIX_ROOF", + "Guid": "fe8a6b43-ec73-4201-91e8-0dedf413b25c", + "Type": { + "_type": "SAM.Analytical.Construction,SAM.Analytical", + "Name": "FIX_ROOF", + "Guid": "5080c000-0000-0000-0000-0000000000a2", + "ConstructionLayers": [ + { + "_type": "SAM.Analytical.ConstructionLayer,SAM.Analytical", + "Name": "FIX_Plasterboard", + "Thickness": 0.015 + }, + { + "_type": "SAM.Analytical.ConstructionLayer,SAM.Analytical", + "Name": "FIX_PIR", + "Thickness": 0.16 + }, + { + "_type": "SAM.Analytical.ConstructionLayer,SAM.Analytical", + "Name": "FIX_OSB", + "Thickness": 0.018 + }, + { + "_type": "SAM.Analytical.ConstructionLayer,SAM.Analytical", + "Name": "FIX_Membrane", + "Thickness": 0.004 + } + ] + }, + "PanelType": "Roof", + "PlanarBoundary3D": { + "_type": "SAM.Analytical.PlanarBoundary3D,SAM.Analytical", + "Guid": "878d82ef-d222-441f-bbaa-0427a773fc71", + "Plane": { + "_type": "SAM.Geometry.Spatial.Plane,SAM.Geometry", + "Origin": { + "_type": "SAM.Geometry.Spatial.Point3D,SAM.Geometry", + "X": 2.25, + "Y": 2.7, + "Z": 3.05 + }, + "Normal": { + "_type": "SAM.Geometry.Spatial.Vector3D,SAM.Geometry", + "X": 0, + "Y": 0, + "Z": 1 + }, + "AxisY": { + "_type": "SAM.Geometry.Spatial.Vector3D,SAM.Geometry", + "X": 0, + "Y": 1, + "Z": 0 + } + }, + "Edge2DLoop": { + "_type": "SAM.Analytical.BoundaryEdge2DLoop,SAM.Analytical", + "Guid": "ef7797af-2a38-400f-b917-cb7a44bb2dd4", + "BoundaryEdge2Ds": [ + { + "_type": "SAM.Analytical.BoundaryEdge2D,SAM.Analytical", + "Guid": "17c50fee-d935-4f0d-99d2-ab877917309f", + "Curve2D": { + "_type": "SAM.Geometry.Planar.Segment2D,SAM.Geometry", + "Origin": { + "_type": "SAM.Geometry.Planar.Point2D,SAM.Geometry", + "X": -2.25, + "Y": -2.7 + }, + "Vector": { + "_type": "SAM.Geometry.Planar.Vector2D,SAM.Geometry", + "X": 4.5, + "Y": 0 + } + } + }, + { + "_type": "SAM.Analytical.BoundaryEdge2D,SAM.Analytical", + "Guid": "bd38ddca-6311-4f4c-a7f7-931e012847dd", + "Curve2D": { + "_type": "SAM.Geometry.Planar.Segment2D,SAM.Geometry", + "Origin": { + "_type": "SAM.Geometry.Planar.Point2D,SAM.Geometry", + "X": 2.25, + "Y": -2.7 + }, + "Vector": { + "_type": "SAM.Geometry.Planar.Vector2D,SAM.Geometry", + "X": 0, + "Y": 5.4 + } + } + }, + { + "_type": "SAM.Analytical.BoundaryEdge2D,SAM.Analytical", + "Guid": "949c39a9-bfc5-45a4-a04f-79fcf1fe87a3", + "Curve2D": { + "_type": "SAM.Geometry.Planar.Segment2D,SAM.Geometry", + "Origin": { + "_type": "SAM.Geometry.Planar.Point2D,SAM.Geometry", + "X": 2.25, + "Y": 2.7 + }, + "Vector": { + "_type": "SAM.Geometry.Planar.Vector2D,SAM.Geometry", + "X": -4.5, + "Y": 0 + } + } + }, + { + "_type": "SAM.Analytical.BoundaryEdge2D,SAM.Analytical", + "Guid": "b1f29b69-33eb-441f-85a2-36fd311eda22", + "Curve2D": { + "_type": "SAM.Geometry.Planar.Segment2D,SAM.Geometry", + "Origin": { + "_type": "SAM.Geometry.Planar.Point2D,SAM.Geometry", + "X": -2.25, + "Y": 2.7 + }, + "Vector": { + "_type": "SAM.Geometry.Planar.Vector2D,SAM.Geometry", + "X": 0, + "Y": -5.4 + } + } + } + ] + } + } + } + }, + { + "Key": "1c080d98-e160-4254-8bac-f3902936a621", + "Value": { + "_type": "SAM.Analytical.Panel,SAM.Analytical", + "ParameterSets": [ + { + "_type": "SAM.Core.ParameterSet", + "Name": "SAM.Analytical", + "Guid": "364a2db8-8af5-4624-a75e-66391df5307d", + "Parameters": [ + { + "Name": "Physical Thickness", + "Value": 0.26750000000000007 + } + ] + } + ], + "Name": "FIX_EXT_WALL", + "Guid": "1c080d98-e160-4254-8bac-f3902936a621", + "Type": { + "_type": "SAM.Analytical.Construction,SAM.Analytical", + "Name": "FIX_EXT_WALL", + "Guid": "5080c000-0000-0000-0000-0000000000a1", + "ConstructionLayers": [ + { + "_type": "SAM.Analytical.ConstructionLayer,SAM.Analytical", + "Name": "FIX_Plasterboard", + "Thickness": 0.0125 + }, + { + "_type": "SAM.Analytical.ConstructionLayer,SAM.Analytical", + "Name": "FIX_MineralWool", + "Thickness": 0.14 + }, + { + "_type": "SAM.Analytical.ConstructionLayer,SAM.Analytical", + "Name": "FIX_Blockwork", + "Thickness": 0.1 + }, + { + "_type": "SAM.Analytical.ConstructionLayer,SAM.Analytical", + "Name": "FIX_Render", + "Thickness": 0.015 + } + ] + }, + "PanelType": "WallExternal", + "PlanarBoundary3D": { + "_type": "SAM.Analytical.PlanarBoundary3D,SAM.Analytical", + "Guid": "75ed242b-84e6-4d24-a388-aeccdfa68948", + "Plane": { + "_type": "SAM.Geometry.Spatial.Plane,SAM.Geometry", + "Origin": { + "_type": "SAM.Geometry.Spatial.Point3D,SAM.Geometry", + "X": 2.25, + "Y": 0, + "Z": 1.525 + }, + "Normal": { + "_type": "SAM.Geometry.Spatial.Vector3D,SAM.Geometry", + "X": 0, + "Y": -1, + "Z": 0 + }, + "AxisY": { + "_type": "SAM.Geometry.Spatial.Vector3D,SAM.Geometry", + "X": 0, + "Y": -0, + "Z": -1 + } + }, + "Edge2DLoop": { + "_type": "SAM.Analytical.BoundaryEdge2DLoop,SAM.Analytical", + "Guid": "59247fd2-554c-4b82-a3ef-1e0f1f125162", + "BoundaryEdge2Ds": [ + { + "_type": "SAM.Analytical.BoundaryEdge2D,SAM.Analytical", + "Guid": "f55ff054-980a-4d2e-a9a5-71058ec69541", + "Curve2D": { + "_type": "SAM.Geometry.Planar.Segment2D,SAM.Geometry", + "Origin": { + "_type": "SAM.Geometry.Planar.Point2D,SAM.Geometry", + "X": 2.25, + "Y": 1.525 + }, + "Vector": { + "_type": "SAM.Geometry.Planar.Vector2D,SAM.Geometry", + "X": -4.5, + "Y": 0 + } + } + }, + { + "_type": "SAM.Analytical.BoundaryEdge2D,SAM.Analytical", + "Guid": "5399367b-0b2b-4ff9-9dfb-9fd0e8465c46", + "Curve2D": { + "_type": "SAM.Geometry.Planar.Segment2D,SAM.Geometry", + "Origin": { + "_type": "SAM.Geometry.Planar.Point2D,SAM.Geometry", + "X": -2.25, + "Y": 1.525 + }, + "Vector": { + "_type": "SAM.Geometry.Planar.Vector2D,SAM.Geometry", + "X": 0, + "Y": -3.05 + } + } + }, + { + "_type": "SAM.Analytical.BoundaryEdge2D,SAM.Analytical", + "Guid": "7fc694ea-97d4-4f9d-a221-7bc7ef91aee8", + "Curve2D": { + "_type": "SAM.Geometry.Planar.Segment2D,SAM.Geometry", + "Origin": { + "_type": "SAM.Geometry.Planar.Point2D,SAM.Geometry", + "X": -2.25, + "Y": -1.525 + }, + "Vector": { + "_type": "SAM.Geometry.Planar.Vector2D,SAM.Geometry", + "X": 4.5, + "Y": 0 + } + } + }, + { + "_type": "SAM.Analytical.BoundaryEdge2D,SAM.Analytical", + "Guid": "e7eb9195-0127-47e1-8f68-97fdef3ae329", + "Curve2D": { + "_type": "SAM.Geometry.Planar.Segment2D,SAM.Geometry", + "Origin": { + "_type": "SAM.Geometry.Planar.Point2D,SAM.Geometry", + "X": 2.25, + "Y": -1.525 + }, + "Vector": { + "_type": "SAM.Geometry.Planar.Vector2D,SAM.Geometry", + "X": 0, + "Y": 3.05 + } + } + } + ] + } + }, + "Apertures": [ + { + "_type": "SAM.Analytical.Aperture,SAM.Analytical", + "Name": "FIX_WIN_FRAMED", + "Guid": "d4b4d4bb-4372-4191-abc6-ecf6a78db87b", + "Type": { + "_type": "SAM.Analytical.ApertureConstruction,SAM.Analytical", + "ParameterSets": [ + { + "_type": "SAM.Core.ParameterSet", + "Name": "SAM.Analytical", + "Guid": "364a2db8-8af5-4624-a75e-66391df5307d", + "Parameters": [ + { + "Name": "Transparent", + "Value": true + }, + { + "Name": "Default Frame Width", + "Value": 0.065 + } + ] + } + ], + "Name": "FIX_WIN_FRAMED", + "Guid": "5080c000-0000-0000-0000-0000000000b1", + "PaneConstructionLayers": [ + { + "_type": "SAM.Analytical.ConstructionLayer,SAM.Analytical", + "Name": "FIX_LaminatedGlass", + "Thickness": 0.0088 + } + ], + "FrameConstructionLayers": [ + { + "_type": "SAM.Analytical.ConstructionLayer,SAM.Analytical", + "Name": "FIX_Timber", + "Thickness": 0.075 + } + ], + "ApertureType": "Window" + }, + "PlanarBoundary3D": { + "_type": "SAM.Analytical.PlanarBoundary3D,SAM.Analytical", + "Guid": "82b7f2cb-2144-4057-b178-79ff1e2fd467", + "Plane": { + "_type": "SAM.Geometry.Spatial.Plane,SAM.Geometry", + "Origin": { + "_type": "SAM.Geometry.Spatial.Point3D,SAM.Geometry", + "X": 2.05, + "Y": 0, + "Z": 1.65 + }, + "Normal": { + "_type": "SAM.Geometry.Spatial.Vector3D,SAM.Geometry", + "X": 0, + "Y": -1, + "Z": 0 + }, + "AxisY": { + "_type": "SAM.Geometry.Spatial.Vector3D,SAM.Geometry", + "X": 0, + "Y": -0, + "Z": -1 + } + }, + "Edge2DLoop": { + "_type": "SAM.Analytical.BoundaryEdge2DLoop,SAM.Analytical", + "Guid": "8e8ebaa2-4063-493b-b4c0-7e0d563efd0b", + "BoundaryEdge2Ds": [ + { + "_type": "SAM.Analytical.BoundaryEdge2D,SAM.Analytical", + "Guid": "9781fee7-5c72-44e2-b288-262ba14a2ac2", + "Curve2D": { + "_type": "SAM.Geometry.Planar.Segment2D,SAM.Geometry", + "Origin": { + "_type": "SAM.Geometry.Planar.Point2D,SAM.Geometry", + "X": 1.2499999999999998, + "Y": 0.7 + }, + "Vector": { + "_type": "SAM.Geometry.Planar.Vector2D,SAM.Geometry", + "X": -2.5, + "Y": 0 + } + } + }, + { + "_type": "SAM.Analytical.BoundaryEdge2D,SAM.Analytical", + "Guid": "42e32881-71af-4777-a189-2495328239a6", + "Curve2D": { + "_type": "SAM.Geometry.Planar.Segment2D,SAM.Geometry", + "Origin": { + "_type": "SAM.Geometry.Planar.Point2D,SAM.Geometry", + "X": -1.25, + "Y": 0.7 + }, + "Vector": { + "_type": "SAM.Geometry.Planar.Vector2D,SAM.Geometry", + "X": 0, + "Y": -1.4000000000000001 + } + } + }, + { + "_type": "SAM.Analytical.BoundaryEdge2D,SAM.Analytical", + "Guid": "77be44ab-4bf7-4e24-ad3a-49a1e48e12b1", + "Curve2D": { + "_type": "SAM.Geometry.Planar.Segment2D,SAM.Geometry", + "Origin": { + "_type": "SAM.Geometry.Planar.Point2D,SAM.Geometry", + "X": -1.25, + "Y": -0.7000000000000002 + }, + "Vector": { + "_type": "SAM.Geometry.Planar.Vector2D,SAM.Geometry", + "X": 2.5, + "Y": 0 + } + } + }, + { + "_type": "SAM.Analytical.BoundaryEdge2D,SAM.Analytical", + "Guid": "cdd81848-19fe-4516-9ac6-b011ef34b165", + "Curve2D": { + "_type": "SAM.Geometry.Planar.Segment2D,SAM.Geometry", + "Origin": { + "_type": "SAM.Geometry.Planar.Point2D,SAM.Geometry", + "X": 1.2499999999999998, + "Y": -0.7000000000000002 + }, + "Vector": { + "_type": "SAM.Geometry.Planar.Vector2D,SAM.Geometry", + "X": 0, + "Y": 1.4000000000000001 + } + } + } + ] + } + } + } + ] + } + }, + { + "Key": "4224250c-fb3c-4d91-a9bd-7b0de82b0ab7", + "Value": { + "_type": "SAM.Analytical.Panel,SAM.Analytical", + "ParameterSets": [ + { + "_type": "SAM.Core.ParameterSet", + "Name": "SAM.Analytical", + "Guid": "364a2db8-8af5-4624-a75e-66391df5307d", + "Parameters": [ + { + "Name": "Physical Thickness", + "Value": 0.26750000000000007 + } + ] + } + ], + "Name": "FIX_EXT_WALL", + "Guid": "4224250c-fb3c-4d91-a9bd-7b0de82b0ab7", + "Type": { + "_type": "SAM.Analytical.Construction,SAM.Analytical", + "Name": "FIX_EXT_WALL", + "Guid": "5080c000-0000-0000-0000-0000000000a1", + "ConstructionLayers": [ + { + "_type": "SAM.Analytical.ConstructionLayer,SAM.Analytical", + "Name": "FIX_Plasterboard", + "Thickness": 0.0125 + }, + { + "_type": "SAM.Analytical.ConstructionLayer,SAM.Analytical", + "Name": "FIX_MineralWool", + "Thickness": 0.14 + }, + { + "_type": "SAM.Analytical.ConstructionLayer,SAM.Analytical", + "Name": "FIX_Blockwork", + "Thickness": 0.1 + }, + { + "_type": "SAM.Analytical.ConstructionLayer,SAM.Analytical", + "Name": "FIX_Render", + "Thickness": 0.015 + } + ] + }, + "PanelType": "WallExternal", + "PlanarBoundary3D": { + "_type": "SAM.Analytical.PlanarBoundary3D,SAM.Analytical", + "Guid": "089c5f39-ffd8-433c-be66-a422f700a332", + "Plane": { + "_type": "SAM.Geometry.Spatial.Plane,SAM.Geometry", + "Origin": { + "_type": "SAM.Geometry.Spatial.Point3D,SAM.Geometry", + "X": 2.25, + "Y": 5.4, + "Z": 1.525 + }, + "Normal": { + "_type": "SAM.Geometry.Spatial.Vector3D,SAM.Geometry", + "X": 0, + "Y": 1, + "Z": 0 + }, + "AxisY": { + "_type": "SAM.Geometry.Spatial.Vector3D,SAM.Geometry", + "X": 0, + "Y": 0, + "Z": -1 + } + }, + "Edge2DLoop": { + "_type": "SAM.Analytical.BoundaryEdge2DLoop,SAM.Analytical", + "Guid": "9fbcb43f-2686-4003-b44f-804d3e8f4b9c", + "BoundaryEdge2Ds": [ + { + "_type": "SAM.Analytical.BoundaryEdge2D,SAM.Analytical", + "Guid": "76afa90e-3bd0-4855-803a-bc16aaacbf66", + "Curve2D": { + "_type": "SAM.Geometry.Planar.Segment2D,SAM.Geometry", + "Origin": { + "_type": "SAM.Geometry.Planar.Point2D,SAM.Geometry", + "X": 2.25, + "Y": 1.525 + }, + "Vector": { + "_type": "SAM.Geometry.Planar.Vector2D,SAM.Geometry", + "X": -4.5, + "Y": 0 + } + } + }, + { + "_type": "SAM.Analytical.BoundaryEdge2D,SAM.Analytical", + "Guid": "5ac10989-163c-4d24-aee2-b390a81c6dd1", + "Curve2D": { + "_type": "SAM.Geometry.Planar.Segment2D,SAM.Geometry", + "Origin": { + "_type": "SAM.Geometry.Planar.Point2D,SAM.Geometry", + "X": -2.25, + "Y": 1.525 + }, + "Vector": { + "_type": "SAM.Geometry.Planar.Vector2D,SAM.Geometry", + "X": 0, + "Y": -3.05 + } + } + }, + { + "_type": "SAM.Analytical.BoundaryEdge2D,SAM.Analytical", + "Guid": "63a66d09-69de-4b4d-b8b8-c322d9da0526", + "Curve2D": { + "_type": "SAM.Geometry.Planar.Segment2D,SAM.Geometry", + "Origin": { + "_type": "SAM.Geometry.Planar.Point2D,SAM.Geometry", + "X": -2.25, + "Y": -1.525 + }, + "Vector": { + "_type": "SAM.Geometry.Planar.Vector2D,SAM.Geometry", + "X": 4.5, + "Y": 0 + } + } + }, + { + "_type": "SAM.Analytical.BoundaryEdge2D,SAM.Analytical", + "Guid": "cc8d07e6-08c5-4b9d-aa3d-953f9e9213d1", + "Curve2D": { + "_type": "SAM.Geometry.Planar.Segment2D,SAM.Geometry", + "Origin": { + "_type": "SAM.Geometry.Planar.Point2D,SAM.Geometry", + "X": 2.25, + "Y": -1.525 + }, + "Vector": { + "_type": "SAM.Geometry.Planar.Vector2D,SAM.Geometry", + "X": 0, + "Y": 3.05 + } + } + } + ] + } + } + } + }, + { + "Key": "2b2d8a7f-fbc6-4663-9608-3f054b4a10d8", + "Value": { + "_type": "SAM.Analytical.Panel,SAM.Analytical", + "ParameterSets": [ + { + "_type": "SAM.Core.ParameterSet", + "Name": "SAM.Analytical", + "Guid": "364a2db8-8af5-4624-a75e-66391df5307d", + "Parameters": [ + { + "Name": "Physical Thickness", + "Value": 0.26750000000000007 + } + ] + } + ], + "Name": "FIX_EXT_WALL", + "Guid": "2b2d8a7f-fbc6-4663-9608-3f054b4a10d8", + "Type": { + "_type": "SAM.Analytical.Construction,SAM.Analytical", + "Name": "FIX_EXT_WALL", + "Guid": "5080c000-0000-0000-0000-0000000000a1", + "ConstructionLayers": [ + { + "_type": "SAM.Analytical.ConstructionLayer,SAM.Analytical", + "Name": "FIX_Plasterboard", + "Thickness": 0.0125 + }, + { + "_type": "SAM.Analytical.ConstructionLayer,SAM.Analytical", + "Name": "FIX_MineralWool", + "Thickness": 0.14 + }, + { + "_type": "SAM.Analytical.ConstructionLayer,SAM.Analytical", + "Name": "FIX_Blockwork", + "Thickness": 0.1 + }, + { + "_type": "SAM.Analytical.ConstructionLayer,SAM.Analytical", + "Name": "FIX_Render", + "Thickness": 0.015 + } + ] + }, + "PanelType": "WallExternal", + "PlanarBoundary3D": { + "_type": "SAM.Analytical.PlanarBoundary3D,SAM.Analytical", + "Guid": "770d1d7d-e3cc-46af-8756-d70dd46e7591", + "Plane": { + "_type": "SAM.Geometry.Spatial.Plane,SAM.Geometry", + "Origin": { + "_type": "SAM.Geometry.Spatial.Point3D,SAM.Geometry", + "X": 0, + "Y": 2.7, + "Z": 1.525 + }, + "Normal": { + "_type": "SAM.Geometry.Spatial.Vector3D,SAM.Geometry", + "X": -1, + "Y": 0, + "Z": 0 + }, + "AxisY": { + "_type": "SAM.Geometry.Spatial.Vector3D,SAM.Geometry", + "X": 0, + "Y": 0, + "Z": -1 + } + }, + "Edge2DLoop": { + "_type": "SAM.Analytical.BoundaryEdge2DLoop,SAM.Analytical", + "Guid": "106bb3c9-f4d3-4fcb-899d-dcf189af4e35", + "BoundaryEdge2Ds": [ + { + "_type": "SAM.Analytical.BoundaryEdge2D,SAM.Analytical", + "Guid": "14fbf404-3c54-475f-8f30-87f1561d5f82", + "Curve2D": { + "_type": "SAM.Geometry.Planar.Segment2D,SAM.Geometry", + "Origin": { + "_type": "SAM.Geometry.Planar.Point2D,SAM.Geometry", + "X": 2.7, + "Y": 1.525 + }, + "Vector": { + "_type": "SAM.Geometry.Planar.Vector2D,SAM.Geometry", + "X": -5.4, + "Y": 0 + } + } + }, + { + "_type": "SAM.Analytical.BoundaryEdge2D,SAM.Analytical", + "Guid": "ac79d6d0-11e2-4dd1-90ab-94680d92d6a6", + "Curve2D": { + "_type": "SAM.Geometry.Planar.Segment2D,SAM.Geometry", + "Origin": { + "_type": "SAM.Geometry.Planar.Point2D,SAM.Geometry", + "X": -2.7, + "Y": 1.525 + }, + "Vector": { + "_type": "SAM.Geometry.Planar.Vector2D,SAM.Geometry", + "X": 0, + "Y": -3.05 + } + } + }, + { + "_type": "SAM.Analytical.BoundaryEdge2D,SAM.Analytical", + "Guid": "ca94d80b-39ca-443c-bf4d-172fe57b9e2a", + "Curve2D": { + "_type": "SAM.Geometry.Planar.Segment2D,SAM.Geometry", + "Origin": { + "_type": "SAM.Geometry.Planar.Point2D,SAM.Geometry", + "X": -2.7, + "Y": -1.525 + }, + "Vector": { + "_type": "SAM.Geometry.Planar.Vector2D,SAM.Geometry", + "X": 5.4, + "Y": 0 + } + } + }, + { + "_type": "SAM.Analytical.BoundaryEdge2D,SAM.Analytical", + "Guid": "799b1120-c19e-482c-b14a-e2e3a7665de1", + "Curve2D": { + "_type": "SAM.Geometry.Planar.Segment2D,SAM.Geometry", + "Origin": { + "_type": "SAM.Geometry.Planar.Point2D,SAM.Geometry", + "X": 2.7, + "Y": -1.525 + }, + "Vector": { + "_type": "SAM.Geometry.Planar.Vector2D,SAM.Geometry", + "X": 0, + "Y": 3.05 + } + } + } + ] + } + } + } + }, + { + "Key": "f5273d30-2ac9-43bc-b916-1759aea67323", + "Value": { + "_type": "SAM.Analytical.Panel,SAM.Analytical", + "ParameterSets": [ + { + "_type": "SAM.Core.ParameterSet", + "Name": "SAM.Analytical", + "Guid": "364a2db8-8af5-4624-a75e-66391df5307d", + "Parameters": [ + { + "Name": "Physical Thickness", + "Value": 0.33499999999999996 + } + ] + } + ], + "Name": "FIX_GRD_FLOOR", + "Guid": "f5273d30-2ac9-43bc-b916-1759aea67323", + "Type": { + "_type": "SAM.Analytical.Construction,SAM.Analytical", + "Name": "FIX_GRD_FLOOR", + "Guid": "5080c000-0000-0000-0000-0000000000a3", + "ConstructionLayers": [ + { + "_type": "SAM.Analytical.ConstructionLayer,SAM.Analytical", + "Name": "FIX_Screed", + "Thickness": 0.065 + }, + { + "_type": "SAM.Analytical.ConstructionLayer,SAM.Analytical", + "Name": "FIX_EPS", + "Thickness": 0.12 + }, + { + "_type": "SAM.Analytical.ConstructionLayer,SAM.Analytical", + "Name": "FIX_Concrete", + "Thickness": 0.15 + } + ] + }, + "PanelType": "SlabOnGrade", + "PlanarBoundary3D": { + "_type": "SAM.Analytical.PlanarBoundary3D,SAM.Analytical", + "Guid": "5ba3e0c2-35ab-41d9-94d3-62fc06cb02c7", + "Plane": { + "_type": "SAM.Geometry.Spatial.Plane,SAM.Geometry", + "Origin": { + "_type": "SAM.Geometry.Spatial.Point3D,SAM.Geometry", + "X": 6.300000000000001, + "Y": 2.7, + "Z": 0 + }, + "Normal": { + "_type": "SAM.Geometry.Spatial.Vector3D,SAM.Geometry", + "X": 0, + "Y": 0, + "Z": -1 + }, + "AxisY": { + "_type": "SAM.Geometry.Spatial.Vector3D,SAM.Geometry", + "X": 0, + "Y": -1, + "Z": 0 + } + }, + "Edge2DLoop": { + "_type": "SAM.Analytical.BoundaryEdge2DLoop,SAM.Analytical", + "Guid": "a8fc832f-bf8a-48e3-bc04-361695988f63", + "BoundaryEdge2Ds": [ + { + "_type": "SAM.Analytical.BoundaryEdge2D,SAM.Analytical", + "Guid": "865ca74c-5cfb-4122-8e14-1b006afb131d", + "Curve2D": { + "_type": "SAM.Geometry.Planar.Segment2D,SAM.Geometry", + "Origin": { + "_type": "SAM.Geometry.Planar.Point2D,SAM.Geometry", + "X": -1.8000000000000007, + "Y": 2.7 + }, + "Vector": { + "_type": "SAM.Geometry.Planar.Vector2D,SAM.Geometry", + "X": 0, + "Y": -5.4 + } + } + }, + { + "_type": "SAM.Analytical.BoundaryEdge2D,SAM.Analytical", + "Guid": "415072d2-5b30-42e2-8fe1-4d3c946538b3", + "Curve2D": { + "_type": "SAM.Geometry.Planar.Segment2D,SAM.Geometry", + "Origin": { + "_type": "SAM.Geometry.Planar.Point2D,SAM.Geometry", + "X": -1.8000000000000007, + "Y": -2.7 + }, + "Vector": { + "_type": "SAM.Geometry.Planar.Vector2D,SAM.Geometry", + "X": 3.5999999999999996, + "Y": 0 + } + } + }, + { + "_type": "SAM.Analytical.BoundaryEdge2D,SAM.Analytical", + "Guid": "e07cb80f-0447-42d0-adbd-6d445d5d51da", + "Curve2D": { + "_type": "SAM.Geometry.Planar.Segment2D,SAM.Geometry", + "Origin": { + "_type": "SAM.Geometry.Planar.Point2D,SAM.Geometry", + "X": 1.799999999999999, + "Y": -2.7 + }, + "Vector": { + "_type": "SAM.Geometry.Planar.Vector2D,SAM.Geometry", + "X": 0, + "Y": 5.4 + } + } + }, + { + "_type": "SAM.Analytical.BoundaryEdge2D,SAM.Analytical", + "Guid": "70368c39-9f40-4041-a404-763bff326f7d", + "Curve2D": { + "_type": "SAM.Geometry.Planar.Segment2D,SAM.Geometry", + "Origin": { + "_type": "SAM.Geometry.Planar.Point2D,SAM.Geometry", + "X": 1.799999999999999, + "Y": 2.7 + }, + "Vector": { + "_type": "SAM.Geometry.Planar.Vector2D,SAM.Geometry", + "X": -3.5999999999999996, + "Y": 0 + } + } + } + ] + } + } + } + }, + { + "Key": "9c39d26c-3a91-43fc-adac-414e0794be54", + "Value": { + "_type": "SAM.Analytical.Panel,SAM.Analytical", + "ParameterSets": [ + { + "_type": "SAM.Core.ParameterSet", + "Name": "SAM.Analytical", + "Guid": "364a2db8-8af5-4624-a75e-66391df5307d", + "Parameters": [ + { + "Name": "Physical Thickness", + "Value": 0.19699999999999998 + } + ] + } + ], + "Name": "FIX_ROOF", + "Guid": "9c39d26c-3a91-43fc-adac-414e0794be54", + "Type": { + "_type": "SAM.Analytical.Construction,SAM.Analytical", + "Name": "FIX_ROOF", + "Guid": "5080c000-0000-0000-0000-0000000000a2", + "ConstructionLayers": [ + { + "_type": "SAM.Analytical.ConstructionLayer,SAM.Analytical", + "Name": "FIX_Plasterboard", + "Thickness": 0.015 + }, + { + "_type": "SAM.Analytical.ConstructionLayer,SAM.Analytical", + "Name": "FIX_PIR", + "Thickness": 0.16 + }, + { + "_type": "SAM.Analytical.ConstructionLayer,SAM.Analytical", + "Name": "FIX_OSB", + "Thickness": 0.018 + }, + { + "_type": "SAM.Analytical.ConstructionLayer,SAM.Analytical", + "Name": "FIX_Membrane", + "Thickness": 0.004 + } + ] + }, + "PanelType": "Roof", + "PlanarBoundary3D": { + "_type": "SAM.Analytical.PlanarBoundary3D,SAM.Analytical", + "Guid": "5d84134e-678a-475b-a658-338f98859dcf", + "Plane": { + "_type": "SAM.Geometry.Spatial.Plane,SAM.Geometry", + "Origin": { + "_type": "SAM.Geometry.Spatial.Point3D,SAM.Geometry", + "X": 6.3, + "Y": 2.7, + "Z": 3.05 + }, + "Normal": { + "_type": "SAM.Geometry.Spatial.Vector3D,SAM.Geometry", + "X": 0, + "Y": 0, + "Z": 1 + }, + "AxisY": { + "_type": "SAM.Geometry.Spatial.Vector3D,SAM.Geometry", + "X": 0, + "Y": 1, + "Z": 0 + } + }, + "Edge2DLoop": { + "_type": "SAM.Analytical.BoundaryEdge2DLoop,SAM.Analytical", + "Guid": "250c45de-34ef-4b74-93d3-e86bfd0c0856", + "BoundaryEdge2Ds": [ + { + "_type": "SAM.Analytical.BoundaryEdge2D,SAM.Analytical", + "Guid": "484d148e-e992-42fb-9590-1d8f68472e3a", + "Curve2D": { + "_type": "SAM.Geometry.Planar.Segment2D,SAM.Geometry", + "Origin": { + "_type": "SAM.Geometry.Planar.Point2D,SAM.Geometry", + "X": -1.7999999999999998, + "Y": -2.7 + }, + "Vector": { + "_type": "SAM.Geometry.Planar.Vector2D,SAM.Geometry", + "X": 3.5999999999999996, + "Y": 0 + } + } + }, + { + "_type": "SAM.Analytical.BoundaryEdge2D,SAM.Analytical", + "Guid": "c3f3e77c-2dd2-4005-b9f1-cd062b874349", + "Curve2D": { + "_type": "SAM.Geometry.Planar.Segment2D,SAM.Geometry", + "Origin": { + "_type": "SAM.Geometry.Planar.Point2D,SAM.Geometry", + "X": 1.7999999999999998, + "Y": -2.7 + }, + "Vector": { + "_type": "SAM.Geometry.Planar.Vector2D,SAM.Geometry", + "X": 0, + "Y": 5.4 + } + } + }, + { + "_type": "SAM.Analytical.BoundaryEdge2D,SAM.Analytical", + "Guid": "1209b3e3-7883-443c-9dd4-fc9afb15a9f5", + "Curve2D": { + "_type": "SAM.Geometry.Planar.Segment2D,SAM.Geometry", + "Origin": { + "_type": "SAM.Geometry.Planar.Point2D,SAM.Geometry", + "X": 1.7999999999999998, + "Y": 2.7 + }, + "Vector": { + "_type": "SAM.Geometry.Planar.Vector2D,SAM.Geometry", + "X": -3.5999999999999996, + "Y": 0 + } + } + }, + { + "_type": "SAM.Analytical.BoundaryEdge2D,SAM.Analytical", + "Guid": "e3709a28-cb37-4fe8-ad85-5a9c46f29e99", + "Curve2D": { + "_type": "SAM.Geometry.Planar.Segment2D,SAM.Geometry", + "Origin": { + "_type": "SAM.Geometry.Planar.Point2D,SAM.Geometry", + "X": -1.7999999999999998, + "Y": 2.7 + }, + "Vector": { + "_type": "SAM.Geometry.Planar.Vector2D,SAM.Geometry", + "X": 0, + "Y": -5.4 + } + } + } + ] + } + } + } + }, + { + "Key": "d1aaf21e-5613-42e2-ba3c-a6632d2237fd", + "Value": { + "_type": "SAM.Analytical.Panel,SAM.Analytical", + "ParameterSets": [ + { + "_type": "SAM.Core.ParameterSet", + "Name": "SAM.Analytical", + "Guid": "364a2db8-8af5-4624-a75e-66391df5307d", + "Parameters": [ + { + "Name": "Physical Thickness", + "Value": 0.26750000000000007 + } + ] + } + ], + "Name": "FIX_EXT_WALL", + "Guid": "d1aaf21e-5613-42e2-ba3c-a6632d2237fd", + "Type": { + "_type": "SAM.Analytical.Construction,SAM.Analytical", + "Name": "FIX_EXT_WALL", + "Guid": "5080c000-0000-0000-0000-0000000000a1", + "ConstructionLayers": [ + { + "_type": "SAM.Analytical.ConstructionLayer,SAM.Analytical", + "Name": "FIX_Plasterboard", + "Thickness": 0.0125 + }, + { + "_type": "SAM.Analytical.ConstructionLayer,SAM.Analytical", + "Name": "FIX_MineralWool", + "Thickness": 0.14 + }, + { + "_type": "SAM.Analytical.ConstructionLayer,SAM.Analytical", + "Name": "FIX_Blockwork", + "Thickness": 0.1 + }, + { + "_type": "SAM.Analytical.ConstructionLayer,SAM.Analytical", + "Name": "FIX_Render", + "Thickness": 0.015 + } + ] + }, + "PanelType": "WallExternal", + "PlanarBoundary3D": { + "_type": "SAM.Analytical.PlanarBoundary3D,SAM.Analytical", + "Guid": "c8cf7313-d3a5-4805-8b2b-2e6ea71e5bde", + "Plane": { + "_type": "SAM.Geometry.Spatial.Plane,SAM.Geometry", + "Origin": { + "_type": "SAM.Geometry.Spatial.Point3D,SAM.Geometry", + "X": 6.3, + "Y": 0, + "Z": 1.525 + }, + "Normal": { + "_type": "SAM.Geometry.Spatial.Vector3D,SAM.Geometry", + "X": 0, + "Y": -1, + "Z": 0 + }, + "AxisY": { + "_type": "SAM.Geometry.Spatial.Vector3D,SAM.Geometry", + "X": 0, + "Y": -0, + "Z": -1 + } + }, + "Edge2DLoop": { + "_type": "SAM.Analytical.BoundaryEdge2DLoop,SAM.Analytical", + "Guid": "3ebe12e0-86c4-4b8b-bc4e-ed1b151d5e66", + "BoundaryEdge2Ds": [ + { + "_type": "SAM.Analytical.BoundaryEdge2D,SAM.Analytical", + "Guid": "01993917-dca3-463b-b79e-ac23fa7f52c0", + "Curve2D": { + "_type": "SAM.Geometry.Planar.Segment2D,SAM.Geometry", + "Origin": { + "_type": "SAM.Geometry.Planar.Point2D,SAM.Geometry", + "X": 1.7999999999999998, + "Y": 1.525 + }, + "Vector": { + "_type": "SAM.Geometry.Planar.Vector2D,SAM.Geometry", + "X": -3.5999999999999996, + "Y": 0 + } + } + }, + { + "_type": "SAM.Analytical.BoundaryEdge2D,SAM.Analytical", + "Guid": "46c86c35-0cf7-47f9-b735-384c8bcb9c6e", + "Curve2D": { + "_type": "SAM.Geometry.Planar.Segment2D,SAM.Geometry", + "Origin": { + "_type": "SAM.Geometry.Planar.Point2D,SAM.Geometry", + "X": -1.7999999999999998, + "Y": 1.525 + }, + "Vector": { + "_type": "SAM.Geometry.Planar.Vector2D,SAM.Geometry", + "X": 0, + "Y": -3.05 + } + } + }, + { + "_type": "SAM.Analytical.BoundaryEdge2D,SAM.Analytical", + "Guid": "61101d9f-7105-4b90-bc2d-7062f91fda6b", + "Curve2D": { + "_type": "SAM.Geometry.Planar.Segment2D,SAM.Geometry", + "Origin": { + "_type": "SAM.Geometry.Planar.Point2D,SAM.Geometry", + "X": -1.7999999999999998, + "Y": -1.525 + }, + "Vector": { + "_type": "SAM.Geometry.Planar.Vector2D,SAM.Geometry", + "X": 3.5999999999999996, + "Y": 0 + } + } + }, + { + "_type": "SAM.Analytical.BoundaryEdge2D,SAM.Analytical", + "Guid": "6df34a63-ee33-43b0-8063-5b11679ffa69", + "Curve2D": { + "_type": "SAM.Geometry.Planar.Segment2D,SAM.Geometry", + "Origin": { + "_type": "SAM.Geometry.Planar.Point2D,SAM.Geometry", + "X": 1.7999999999999998, + "Y": -1.525 + }, + "Vector": { + "_type": "SAM.Geometry.Planar.Vector2D,SAM.Geometry", + "X": 0, + "Y": 3.05 + } + } + } + ] + } + } + } + }, + { + "Key": "965af5b3-f250-4492-9467-f988d7831eae", + "Value": { + "_type": "SAM.Analytical.Panel,SAM.Analytical", + "ParameterSets": [ + { + "_type": "SAM.Core.ParameterSet", + "Name": "SAM.Analytical", + "Guid": "364a2db8-8af5-4624-a75e-66391df5307d", + "Parameters": [ + { + "Name": "Physical Thickness", + "Value": 0.26750000000000007 + } + ] + } + ], + "Name": "FIX_EXT_WALL", + "Guid": "965af5b3-f250-4492-9467-f988d7831eae", + "Type": { + "_type": "SAM.Analytical.Construction,SAM.Analytical", + "Name": "FIX_EXT_WALL", + "Guid": "5080c000-0000-0000-0000-0000000000a1", + "ConstructionLayers": [ + { + "_type": "SAM.Analytical.ConstructionLayer,SAM.Analytical", + "Name": "FIX_Plasterboard", + "Thickness": 0.0125 + }, + { + "_type": "SAM.Analytical.ConstructionLayer,SAM.Analytical", + "Name": "FIX_MineralWool", + "Thickness": 0.14 + }, + { + "_type": "SAM.Analytical.ConstructionLayer,SAM.Analytical", + "Name": "FIX_Blockwork", + "Thickness": 0.1 + }, + { + "_type": "SAM.Analytical.ConstructionLayer,SAM.Analytical", + "Name": "FIX_Render", + "Thickness": 0.015 + } + ] + }, + "PanelType": "WallExternal", + "PlanarBoundary3D": { + "_type": "SAM.Analytical.PlanarBoundary3D,SAM.Analytical", + "Guid": "902035be-2908-4924-b743-51dfc20ab160", + "Plane": { + "_type": "SAM.Geometry.Spatial.Plane,SAM.Geometry", + "Origin": { + "_type": "SAM.Geometry.Spatial.Point3D,SAM.Geometry", + "X": 8.1, + "Y": 2.7, + "Z": 1.525 + }, + "Normal": { + "_type": "SAM.Geometry.Spatial.Vector3D,SAM.Geometry", + "X": 1, + "Y": 0, + "Z": 0 + }, + "AxisY": { + "_type": "SAM.Geometry.Spatial.Vector3D,SAM.Geometry", + "X": 0, + "Y": 0, + "Z": -1 + } + }, + "Edge2DLoop": { + "_type": "SAM.Analytical.BoundaryEdge2DLoop,SAM.Analytical", + "Guid": "428c457d-3518-46f5-8c1d-746779df9a13", + "BoundaryEdge2Ds": [ + { + "_type": "SAM.Analytical.BoundaryEdge2D,SAM.Analytical", + "Guid": "998ad57e-74e2-4270-ad64-787a2340fd0f", + "Curve2D": { + "_type": "SAM.Geometry.Planar.Segment2D,SAM.Geometry", + "Origin": { + "_type": "SAM.Geometry.Planar.Point2D,SAM.Geometry", + "X": 2.7, + "Y": 1.525 + }, + "Vector": { + "_type": "SAM.Geometry.Planar.Vector2D,SAM.Geometry", + "X": -5.4, + "Y": 0 + } + } + }, + { + "_type": "SAM.Analytical.BoundaryEdge2D,SAM.Analytical", + "Guid": "6758c7b6-449d-496e-89a7-da9711466d2e", + "Curve2D": { + "_type": "SAM.Geometry.Planar.Segment2D,SAM.Geometry", + "Origin": { + "_type": "SAM.Geometry.Planar.Point2D,SAM.Geometry", + "X": -2.7, + "Y": 1.525 + }, + "Vector": { + "_type": "SAM.Geometry.Planar.Vector2D,SAM.Geometry", + "X": 0, + "Y": -3.05 + } + } + }, + { + "_type": "SAM.Analytical.BoundaryEdge2D,SAM.Analytical", + "Guid": "91c1230e-4baa-4e14-993d-0a51c857e793", + "Curve2D": { + "_type": "SAM.Geometry.Planar.Segment2D,SAM.Geometry", + "Origin": { + "_type": "SAM.Geometry.Planar.Point2D,SAM.Geometry", + "X": -2.7, + "Y": -1.525 + }, + "Vector": { + "_type": "SAM.Geometry.Planar.Vector2D,SAM.Geometry", + "X": 5.4, + "Y": 0 + } + } + }, + { + "_type": "SAM.Analytical.BoundaryEdge2D,SAM.Analytical", + "Guid": "2a3cb703-cd93-4d22-b59f-0dafd20c055d", + "Curve2D": { + "_type": "SAM.Geometry.Planar.Segment2D,SAM.Geometry", + "Origin": { + "_type": "SAM.Geometry.Planar.Point2D,SAM.Geometry", + "X": 2.7, + "Y": -1.525 + }, + "Vector": { + "_type": "SAM.Geometry.Planar.Vector2D,SAM.Geometry", + "X": 0, + "Y": 3.05 + } + } + } + ] + } + } + } + }, + { + "Key": "d3ef56c6-b1bb-4509-9d4c-ce6aa738f318", + "Value": { + "_type": "SAM.Analytical.Panel,SAM.Analytical", + "ParameterSets": [ + { + "_type": "SAM.Core.ParameterSet", + "Name": "SAM.Analytical", + "Guid": "364a2db8-8af5-4624-a75e-66391df5307d", + "Parameters": [ + { + "Name": "Physical Thickness", + "Value": 0.26750000000000007 + } + ] + } + ], + "Name": "FIX_EXT_WALL", + "Guid": "d3ef56c6-b1bb-4509-9d4c-ce6aa738f318", + "Type": { + "_type": "SAM.Analytical.Construction,SAM.Analytical", + "Name": "FIX_EXT_WALL", + "Guid": "5080c000-0000-0000-0000-0000000000a1", + "ConstructionLayers": [ + { + "_type": "SAM.Analytical.ConstructionLayer,SAM.Analytical", + "Name": "FIX_Plasterboard", + "Thickness": 0.0125 + }, + { + "_type": "SAM.Analytical.ConstructionLayer,SAM.Analytical", + "Name": "FIX_MineralWool", + "Thickness": 0.14 + }, + { + "_type": "SAM.Analytical.ConstructionLayer,SAM.Analytical", + "Name": "FIX_Blockwork", + "Thickness": 0.1 + }, + { + "_type": "SAM.Analytical.ConstructionLayer,SAM.Analytical", + "Name": "FIX_Render", + "Thickness": 0.015 + } + ] + }, + "PanelType": "WallExternal", + "PlanarBoundary3D": { + "_type": "SAM.Analytical.PlanarBoundary3D,SAM.Analytical", + "Guid": "adb23941-6c4d-4be5-bd11-b0e5e3c17c8a", + "Plane": { + "_type": "SAM.Geometry.Spatial.Plane,SAM.Geometry", + "Origin": { + "_type": "SAM.Geometry.Spatial.Point3D,SAM.Geometry", + "X": 6.300000000000001, + "Y": 5.4, + "Z": 1.525 + }, + "Normal": { + "_type": "SAM.Geometry.Spatial.Vector3D,SAM.Geometry", + "X": 0, + "Y": 1, + "Z": 0 + }, + "AxisY": { + "_type": "SAM.Geometry.Spatial.Vector3D,SAM.Geometry", + "X": 0, + "Y": 0, + "Z": -1 + } + }, + "Edge2DLoop": { + "_type": "SAM.Analytical.BoundaryEdge2DLoop,SAM.Analytical", + "Guid": "82f936ed-5d30-4bcc-ba0d-16601f21ebda", + "BoundaryEdge2Ds": [ + { + "_type": "SAM.Analytical.BoundaryEdge2D,SAM.Analytical", + "Guid": "067bc68d-19c3-4480-a053-3c0b7ac0d755", + "Curve2D": { + "_type": "SAM.Geometry.Planar.Segment2D,SAM.Geometry", + "Origin": { + "_type": "SAM.Geometry.Planar.Point2D,SAM.Geometry", + "X": 1.799999999999999, + "Y": 1.525 + }, + "Vector": { + "_type": "SAM.Geometry.Planar.Vector2D,SAM.Geometry", + "X": -3.5999999999999996, + "Y": 0 + } + } + }, + { + "_type": "SAM.Analytical.BoundaryEdge2D,SAM.Analytical", + "Guid": "17719060-3fdd-4bd9-be44-ff8aaa928ffc", + "Curve2D": { + "_type": "SAM.Geometry.Planar.Segment2D,SAM.Geometry", + "Origin": { + "_type": "SAM.Geometry.Planar.Point2D,SAM.Geometry", + "X": -1.8000000000000007, + "Y": 1.525 + }, + "Vector": { + "_type": "SAM.Geometry.Planar.Vector2D,SAM.Geometry", + "X": 0, + "Y": -3.05 + } + } + }, + { + "_type": "SAM.Analytical.BoundaryEdge2D,SAM.Analytical", + "Guid": "45e10aea-c0c3-4c44-b634-5f4023f70043", + "Curve2D": { + "_type": "SAM.Geometry.Planar.Segment2D,SAM.Geometry", + "Origin": { + "_type": "SAM.Geometry.Planar.Point2D,SAM.Geometry", + "X": -1.8000000000000007, + "Y": -1.525 + }, + "Vector": { + "_type": "SAM.Geometry.Planar.Vector2D,SAM.Geometry", + "X": 3.5999999999999996, + "Y": 0 + } + } + }, + { + "_type": "SAM.Analytical.BoundaryEdge2D,SAM.Analytical", + "Guid": "eb288c54-9bd5-4ef2-954a-af30accfcdca", + "Curve2D": { + "_type": "SAM.Geometry.Planar.Segment2D,SAM.Geometry", + "Origin": { + "_type": "SAM.Geometry.Planar.Point2D,SAM.Geometry", + "X": 1.799999999999999, + "Y": -1.525 + }, + "Vector": { + "_type": "SAM.Geometry.Planar.Vector2D,SAM.Geometry", + "X": 0, + "Y": 3.05 + } + } + } + ] + } + } + } + }, + { + "Key": "3134390a-195b-4e61-86bd-6abf63ce6459", + "Value": { + "_type": "SAM.Analytical.Panel,SAM.Analytical", + "ParameterSets": [ + { + "_type": "SAM.Core.ParameterSet", + "Name": "SAM.Analytical", + "Guid": "364a2db8-8af5-4624-a75e-66391df5307d", + "Parameters": [ + { + "Name": "Physical Thickness", + "Value": 0.09949999999999999 + } + ] + } + ], + "Name": "FIX_PARTITION", + "Guid": "3134390a-195b-4e61-86bd-6abf63ce6459", + "Type": { + "_type": "SAM.Analytical.Construction,SAM.Analytical", + "Name": "FIX_PARTITION", + "Guid": "5080c000-0000-0000-0000-0000000000a4", + "ConstructionLayers": [ + { + "_type": "SAM.Analytical.ConstructionLayer,SAM.Analytical", + "Name": "FIX_Plasterboard", + "Thickness": 0.0125 + }, + { + "_type": "SAM.Analytical.ConstructionLayer,SAM.Analytical", + "Name": "FIX_MineralWool", + "Thickness": 0.05 + }, + { + "_type": "SAM.Analytical.ConstructionLayer,SAM.Analytical", + "Name": "FIX_Stud", + "Thickness": 0.022 + }, + { + "_type": "SAM.Analytical.ConstructionLayer,SAM.Analytical", + "Name": "FIX_Timber", + "Thickness": 0.015 + } + ] + }, + "PanelType": "WallInternal", + "PlanarBoundary3D": { + "_type": "SAM.Analytical.PlanarBoundary3D,SAM.Analytical", + "Guid": "5b6ea8bc-72b8-437b-b48c-9eafc8431f54", + "Plane": { + "_type": "SAM.Geometry.Spatial.Plane,SAM.Geometry", + "Origin": { + "_type": "SAM.Geometry.Spatial.Point3D,SAM.Geometry", + "X": 4.5, + "Y": 2.7, + "Z": 1.525 + }, + "Normal": { + "_type": "SAM.Geometry.Spatial.Vector3D,SAM.Geometry", + "X": 1, + "Y": 0, + "Z": 0 + }, + "AxisY": { + "_type": "SAM.Geometry.Spatial.Vector3D,SAM.Geometry", + "X": 0, + "Y": 0, + "Z": -1 + } + }, + "Edge2DLoop": { + "_type": "SAM.Analytical.BoundaryEdge2DLoop,SAM.Analytical", + "Guid": "c6c70970-53f4-40db-8c8b-49bd252dfdb4", + "BoundaryEdge2Ds": [ + { + "_type": "SAM.Analytical.BoundaryEdge2D,SAM.Analytical", + "Guid": "0632d86b-574d-464b-872f-eca74ada65a2", + "Curve2D": { + "_type": "SAM.Geometry.Planar.Segment2D,SAM.Geometry", + "Origin": { + "_type": "SAM.Geometry.Planar.Point2D,SAM.Geometry", + "X": 2.7, + "Y": 1.525 + }, + "Vector": { + "_type": "SAM.Geometry.Planar.Vector2D,SAM.Geometry", + "X": -5.4, + "Y": 0 + } + } + }, + { + "_type": "SAM.Analytical.BoundaryEdge2D,SAM.Analytical", + "Guid": "48752f02-f0be-4a57-b254-9b3171220b73", + "Curve2D": { + "_type": "SAM.Geometry.Planar.Segment2D,SAM.Geometry", + "Origin": { + "_type": "SAM.Geometry.Planar.Point2D,SAM.Geometry", + "X": -2.7, + "Y": 1.525 + }, + "Vector": { + "_type": "SAM.Geometry.Planar.Vector2D,SAM.Geometry", + "X": 0, + "Y": -3.05 + } + } + }, + { + "_type": "SAM.Analytical.BoundaryEdge2D,SAM.Analytical", + "Guid": "73c1cb44-387b-459f-8fba-bc8de3163dd7", + "Curve2D": { + "_type": "SAM.Geometry.Planar.Segment2D,SAM.Geometry", + "Origin": { + "_type": "SAM.Geometry.Planar.Point2D,SAM.Geometry", + "X": -2.7, + "Y": -1.525 + }, + "Vector": { + "_type": "SAM.Geometry.Planar.Vector2D,SAM.Geometry", + "X": 5.4, + "Y": 0 + } + } + }, + { + "_type": "SAM.Analytical.BoundaryEdge2D,SAM.Analytical", + "Guid": "8f3c0267-804b-4760-84cd-2244e0b52eb0", + "Curve2D": { + "_type": "SAM.Geometry.Planar.Segment2D,SAM.Geometry", + "Origin": { + "_type": "SAM.Geometry.Planar.Point2D,SAM.Geometry", + "X": 2.7, + "Y": -1.525 + }, + "Vector": { + "_type": "SAM.Geometry.Planar.Vector2D,SAM.Geometry", + "X": 0, + "Y": 3.05 + } + } + } + ] + } + } + } + } + ] + } + ], + "Relations": [ + { + "Key": "SAM.Analytical.Space", + "Value": [ + { + "Key": "5080c000-0000-0000-0000-00000000c0a1", + "Value": [ + "26780260-a110-447e-b7ec-9e52919fb23d", + "fe8a6b43-ec73-4201-91e8-0dedf413b25c", + "1c080d98-e160-4254-8bac-f3902936a621", + "4224250c-fb3c-4d91-a9bd-7b0de82b0ab7", + "2b2d8a7f-fbc6-4663-9608-3f054b4a10d8", + "3134390a-195b-4e61-86bd-6abf63ce6459" + ] + }, + { + "Key": "5080c000-0000-0000-0000-00000000c0b1", + "Value": [ + "f5273d30-2ac9-43bc-b916-1759aea67323", + "9c39d26c-3a91-43fc-adac-414e0794be54", + "d1aaf21e-5613-42e2-ba3c-a6632d2237fd", + "965af5b3-f250-4492-9467-f988d7831eae", + "d3ef56c6-b1bb-4509-9d4c-ce6aa738f318", + "3134390a-195b-4e61-86bd-6abf63ce6459" + ] + } + ] + }, + { + "Key": "SAM.Analytical.Panel", + "Value": [ + { + "Key": "26780260-a110-447e-b7ec-9e52919fb23d", + "Value": [ + "5080c000-0000-0000-0000-00000000c0a1" + ] + }, + { + "Key": "fe8a6b43-ec73-4201-91e8-0dedf413b25c", + "Value": [ + "5080c000-0000-0000-0000-00000000c0a1" + ] + }, + { + "Key": "1c080d98-e160-4254-8bac-f3902936a621", + "Value": [ + "5080c000-0000-0000-0000-00000000c0a1" + ] + }, + { + "Key": "4224250c-fb3c-4d91-a9bd-7b0de82b0ab7", + "Value": [ + "5080c000-0000-0000-0000-00000000c0a1" + ] + }, + { + "Key": "2b2d8a7f-fbc6-4663-9608-3f054b4a10d8", + "Value": [ + "5080c000-0000-0000-0000-00000000c0a1" + ] + }, + { + "Key": "f5273d30-2ac9-43bc-b916-1759aea67323", + "Value": [ + "5080c000-0000-0000-0000-00000000c0b1" + ] + }, + { + "Key": "9c39d26c-3a91-43fc-adac-414e0794be54", + "Value": [ + "5080c000-0000-0000-0000-00000000c0b1" + ] + }, + { + "Key": "d1aaf21e-5613-42e2-ba3c-a6632d2237fd", + "Value": [ + "5080c000-0000-0000-0000-00000000c0b1" + ] + }, + { + "Key": "965af5b3-f250-4492-9467-f988d7831eae", + "Value": [ + "5080c000-0000-0000-0000-00000000c0b1" + ] + }, + { + "Key": "d3ef56c6-b1bb-4509-9d4c-ce6aa738f318", + "Value": [ + "5080c000-0000-0000-0000-00000000c0b1" + ] + }, + { + "Key": "3134390a-195b-4e61-86bd-6abf63ce6459", + "Value": [ + "5080c000-0000-0000-0000-00000000c0a1", + "5080c000-0000-0000-0000-00000000c0b1" + ] + } + ] + } + ] + }, + "MaterialLibrary": { + "_type": "SAM.Core.MaterialLibrary,SAM.Core", + "Name": "S08 PR-C fixture materials", + "Guid": "88f44111-8b0f-4b79-99c1-4b1b6d6c0459", + "Objects": [ + { + "_type": "SAM.Core.OpaqueMaterial,SAM.Core", + "ParameterSets": [ + { + "_type": "SAM.Core.ParameterSet", + "Name": "SAM.Analytical", + "Guid": "364a2db8-8af5-4624-a75e-66391df5307d", + "Parameters": [ + { + "Name": "External Solar Reflectance", + "Value": 0.62 + }, + { + "Name": "Internal Solar Reflectance", + "Value": 0.68 + }, + { + "Name": "External Light Reflectance", + "Value": 0.64 + }, + { + "Name": "Internal Light Reflectance", + "Value": 0.7 + }, + { + "Name": "External Emissivity", + "Value": 0.9 + }, + { + "Name": "Internal Emissivity", + "Value": 0.91 + }, + { + "Name": "Vapour Diffusion Factor", + "Value": 8.0 + } + ] + } + ], + "Name": "FIX_Plasterboard", + "Guid": "37d096dc-3366-4119-925a-61a6d28a8c80", + "Group": "S08 PR-C fixture", + "DisplayName": "FIX_Plasterboard", + "Description": "FIX_Plasterboard", + "ThermalConductivity": 0.21, + "SpecificHeatCapacity": 1090, + "Density": 700 + }, + { + "_type": "SAM.Core.OpaqueMaterial,SAM.Core", + "ParameterSets": [ + { + "_type": "SAM.Core.ParameterSet", + "Name": "SAM.Analytical", + "Guid": "364a2db8-8af5-4624-a75e-66391df5307d", + "Parameters": [ + { + "Name": "External Solar Reflectance", + "Value": 0.48 + }, + { + "Name": "Internal Solar Reflectance", + "Value": 0.51 + }, + { + "Name": "External Light Reflectance", + "Value": 0.49 + }, + { + "Name": "Internal Light Reflectance", + "Value": 0.53 + }, + { + "Name": "External Emissivity", + "Value": 0.89 + }, + { + "Name": "Internal Emissivity", + "Value": 0.92 + }, + { + "Name": "Vapour Diffusion Factor", + "Value": 1.2 + } + ] + } + ], + "Name": "FIX_MineralWool", + "Guid": "340c952a-1459-4793-8016-be747c69e725", + "Group": "S08 PR-C fixture", + "DisplayName": "FIX_MineralWool", + "Description": "FIX_MineralWool", + "ThermalConductivity": 0.037, + "SpecificHeatCapacity": 1030, + "Density": 45 + }, + { + "_type": "SAM.Core.OpaqueMaterial,SAM.Core", + "ParameterSets": [ + { + "_type": "SAM.Core.ParameterSet", + "Name": "SAM.Analytical", + "Guid": "364a2db8-8af5-4624-a75e-66391df5307d", + "Parameters": [ + { + "Name": "External Solar Reflectance", + "Value": 0.38 + }, + { + "Name": "Internal Solar Reflectance", + "Value": 0.44 + }, + { + "Name": "External Light Reflectance", + "Value": 0.39 + }, + { + "Name": "Internal Light Reflectance", + "Value": 0.46 + }, + { + "Name": "External Emissivity", + "Value": 0.93 + }, + { + "Name": "Internal Emissivity", + "Value": 0.94 + }, + { + "Name": "Vapour Diffusion Factor", + "Value": 10.0 + } + ] + } + ], + "Name": "FIX_Blockwork", + "Guid": "422b4f0d-1621-43d0-af3c-07ceea0b1886", + "Group": "S08 PR-C fixture", + "DisplayName": "FIX_Blockwork", + "Description": "FIX_Blockwork", + "ThermalConductivity": 0.19, + "SpecificHeatCapacity": 1000, + "Density": 1400 + }, + { + "_type": "SAM.Core.OpaqueMaterial,SAM.Core", + "ParameterSets": [ + { + "_type": "SAM.Core.ParameterSet", + "Name": "SAM.Analytical", + "Guid": "364a2db8-8af5-4624-a75e-66391df5307d", + "Parameters": [ + { + "Name": "External Solar Reflectance", + "Value": 0.57 + }, + { + "Name": "Internal Solar Reflectance", + "Value": 0.36 + }, + { + "Name": "External Light Reflectance", + "Value": 0.58 + }, + { + "Name": "Internal Light Reflectance", + "Value": 0.37 + }, + { + "Name": "External Emissivity", + "Value": 0.88 + }, + { + "Name": "Internal Emissivity", + "Value": 0.93 + }, + { + "Name": "Vapour Diffusion Factor", + "Value": 25.0 + } + ] + } + ], + "Name": "FIX_Render", + "Guid": "cf8a5937-42a1-4d6b-bd06-37d297f94197", + "Group": "S08 PR-C fixture", + "DisplayName": "FIX_Render", + "Description": "FIX_Render", + "ThermalConductivity": 0.87, + "SpecificHeatCapacity": 920, + "Density": 1750 + }, + { + "_type": "SAM.Core.OpaqueMaterial,SAM.Core", + "ParameterSets": [ + { + "_type": "SAM.Core.ParameterSet", + "Name": "SAM.Analytical", + "Guid": "364a2db8-8af5-4624-a75e-66391df5307d", + "Parameters": [ + { + "Name": "External Solar Reflectance", + "Value": 0.53 + }, + { + "Name": "Internal Solar Reflectance", + "Value": 0.55 + }, + { + "Name": "External Light Reflectance", + "Value": 0.54 + }, + { + "Name": "Internal Light Reflectance", + "Value": 0.56 + }, + { + "Name": "External Emissivity", + "Value": 0.87 + }, + { + "Name": "Internal Emissivity", + "Value": 0.95 + }, + { + "Name": "Vapour Diffusion Factor", + "Value": 60.0 + } + ] + } + ], + "Name": "FIX_PIR", + "Guid": "06224e1b-75cc-4398-94d1-9893831789f9", + "Group": "S08 PR-C fixture", + "DisplayName": "FIX_PIR", + "Description": "FIX_PIR", + "ThermalConductivity": 0.022, + "SpecificHeatCapacity": 1400, + "Density": 32 + }, + { + "_type": "SAM.Core.OpaqueMaterial,SAM.Core", + "ParameterSets": [ + { + "_type": "SAM.Core.ParameterSet", + "Name": "SAM.Analytical", + "Guid": "364a2db8-8af5-4624-a75e-66391df5307d", + "Parameters": [ + { + "Name": "External Solar Reflectance", + "Value": 0.43 + }, + { + "Name": "Internal Solar Reflectance", + "Value": 0.47 + }, + { + "Name": "External Light Reflectance", + "Value": 0.42 + }, + { + "Name": "Internal Light Reflectance", + "Value": 0.48 + }, + { + "Name": "External Emissivity", + "Value": 0.91 + }, + { + "Name": "Internal Emissivity", + "Value": 0.89 + }, + { + "Name": "Vapour Diffusion Factor", + "Value": 165.0 + } + ] + } + ], + "Name": "FIX_OSB", + "Guid": "9487bdd1-2774-4543-abae-aa75867008e0", + "Group": "S08 PR-C fixture", + "DisplayName": "FIX_OSB", + "Description": "FIX_OSB", + "ThermalConductivity": 0.13, + "SpecificHeatCapacity": 1700, + "Density": 600 + }, + { + "_type": "SAM.Core.OpaqueMaterial,SAM.Core", + "ParameterSets": [ + { + "_type": "SAM.Core.ParameterSet", + "Name": "SAM.Analytical", + "Guid": "364a2db8-8af5-4624-a75e-66391df5307d", + "Parameters": [ + { + "Name": "External Solar Reflectance", + "Value": 0.14 + }, + { + "Name": "Internal Solar Reflectance", + "Value": 0.24 + }, + { + "Name": "External Light Reflectance", + "Value": 0.15 + }, + { + "Name": "Internal Light Reflectance", + "Value": 0.25 + }, + { + "Name": "External Emissivity", + "Value": 0.92 + }, + { + "Name": "Internal Emissivity", + "Value": 0.86 + }, + { + "Name": "Vapour Diffusion Factor", + "Value": 50000.0 + } + ] + } + ], + "Name": "FIX_Membrane", + "Guid": "720b0f60-1763-45b4-97bc-6ae3e7a47a3e", + "Group": "S08 PR-C fixture", + "DisplayName": "FIX_Membrane", + "Description": "FIX_Membrane", + "ThermalConductivity": 0.17, + "SpecificHeatCapacity": 1460, + "Density": 1180 + }, + { + "_type": "SAM.Core.OpaqueMaterial,SAM.Core", + "ParameterSets": [ + { + "_type": "SAM.Core.ParameterSet", + "Name": "SAM.Analytical", + "Guid": "364a2db8-8af5-4624-a75e-66391df5307d", + "Parameters": [ + { + "Name": "External Solar Reflectance", + "Value": 0.27 + }, + { + "Name": "Internal Solar Reflectance", + "Value": 0.33 + }, + { + "Name": "External Light Reflectance", + "Value": 0.28 + }, + { + "Name": "Internal Light Reflectance", + "Value": 0.34 + }, + { + "Name": "External Emissivity", + "Value": 0.94 + }, + { + "Name": "Internal Emissivity", + "Value": 0.9 + }, + { + "Name": "Vapour Diffusion Factor", + "Value": 15.0 + } + ] + } + ], + "Name": "FIX_Screed", + "Guid": "ba808960-0453-430b-b40d-68fab2e57083", + "Group": "S08 PR-C fixture", + "DisplayName": "FIX_Screed", + "Description": "FIX_Screed", + "ThermalConductivity": 1.28, + "SpecificHeatCapacity": 840, + "Density": 2050 + }, + { + "_type": "SAM.Core.OpaqueMaterial,SAM.Core", + "ParameterSets": [ + { + "_type": "SAM.Core.ParameterSet", + "Name": "SAM.Analytical", + "Guid": "364a2db8-8af5-4624-a75e-66391df5307d", + "Parameters": [ + { + "Name": "External Solar Reflectance", + "Value": 0.58 + }, + { + "Name": "Internal Solar Reflectance", + "Value": 0.61 + }, + { + "Name": "External Light Reflectance", + "Value": 0.59 + }, + { + "Name": "Internal Light Reflectance", + "Value": 0.63 + }, + { + "Name": "External Emissivity", + "Value": 0.85 + }, + { + "Name": "Internal Emissivity", + "Value": 0.96 + }, + { + "Name": "Vapour Diffusion Factor", + "Value": 40.0 + } + ] + } + ], + "Name": "FIX_EPS", + "Guid": "c3cb21c2-0590-445a-9300-55f2fde2a7ba", + "Group": "S08 PR-C fixture", + "DisplayName": "FIX_EPS", + "Description": "FIX_EPS", + "ThermalConductivity": 0.034, + "SpecificHeatCapacity": 1450, + "Density": 22 + }, + { + "_type": "SAM.Core.OpaqueMaterial,SAM.Core", + "ParameterSets": [ + { + "_type": "SAM.Core.ParameterSet", + "Name": "SAM.Analytical", + "Guid": "364a2db8-8af5-4624-a75e-66391df5307d", + "Parameters": [ + { + "Name": "External Solar Reflectance", + "Value": 0.31 + }, + { + "Name": "Internal Solar Reflectance", + "Value": 0.29 + }, + { + "Name": "External Light Reflectance", + "Value": 0.32 + }, + { + "Name": "Internal Light Reflectance", + "Value": 0.3 + }, + { + "Name": "External Emissivity", + "Value": 0.95 + }, + { + "Name": "Internal Emissivity", + "Value": 0.87 + }, + { + "Name": "Vapour Diffusion Factor", + "Value": 110.0 + } + ] + } + ], + "Name": "FIX_Concrete", + "Guid": "b313ccd6-f0f5-43f2-958e-60359b6b9dec", + "Group": "S08 PR-C fixture", + "DisplayName": "FIX_Concrete", + "Description": "FIX_Concrete", + "ThermalConductivity": 1.95, + "SpecificHeatCapacity": 880, + "Density": 2300 + }, + { + "_type": "SAM.Core.OpaqueMaterial,SAM.Core", + "ParameterSets": [ + { + "_type": "SAM.Core.ParameterSet", + "Name": "SAM.Analytical", + "Guid": "364a2db8-8af5-4624-a75e-66391df5307d", + "Parameters": [ + { + "Name": "External Solar Reflectance", + "Value": 0.41 + }, + { + "Name": "Internal Solar Reflectance", + "Value": 0.39 + }, + { + "Name": "External Light Reflectance", + "Value": 0.4 + }, + { + "Name": "Internal Light Reflectance", + "Value": 0.38 + }, + { + "Name": "External Emissivity", + "Value": 0.86 + }, + { + "Name": "Internal Emissivity", + "Value": 0.88 + }, + { + "Name": "Vapour Diffusion Factor", + "Value": 50.0 + } + ] + } + ], + "Name": "FIX_Timber", + "Guid": "d773dfae-df2c-46fc-abf5-3a495b0f6bdd", + "Group": "S08 PR-C fixture", + "DisplayName": "FIX_Timber", + "Description": "FIX_Timber", + "ThermalConductivity": 0.14, + "SpecificHeatCapacity": 1600, + "Density": 520 + }, + { + "_type": "SAM.Core.OpaqueMaterial,SAM.Core", + "ParameterSets": [ + { + "_type": "SAM.Core.ParameterSet", + "Name": "SAM.Analytical", + "Guid": "364a2db8-8af5-4624-a75e-66391df5307d", + "Parameters": [ + { + "Name": "External Solar Reflectance", + "Value": 0.66 + }, + { + "Name": "Internal Solar Reflectance", + "Value": 0.64 + }, + { + "Name": "External Light Reflectance", + "Value": 0.67 + }, + { + "Name": "Internal Light Reflectance", + "Value": 0.65 + }, + { + "Name": "External Emissivity", + "Value": 0.84 + }, + { + "Name": "Internal Emissivity", + "Value": 0.83 + }, + { + "Name": "Vapour Diffusion Factor", + "Value": 45.0 + } + ] + } + ], + "Name": "FIX_Stud", + "Guid": "8642cc5f-c649-463e-bf1c-590826ccde53", + "Group": "S08 PR-C fixture", + "DisplayName": "FIX_Stud", + "Description": "FIX_Stud", + "ThermalConductivity": 0.12, + "SpecificHeatCapacity": 1880, + "Density": 480 + }, + { + "_type": "SAM.Core.TransparentMaterial,SAM.Core", + "ParameterSets": [ + { + "_type": "SAM.Core.ParameterSet", + "Name": "SAM.Analytical", + "Guid": "364a2db8-8af5-4624-a75e-66391df5307d", + "Parameters": [ + { + "Name": "Solar Transmittance", + "Value": 0.746 + }, + { + "Name": "Light Transmittance", + "Value": 0.861 + }, + { + "Name": "External Solar Reflectance", + "Value": 0.069 + }, + { + "Name": "Internal Solar Reflectance", + "Value": 0.067 + }, + { + "Name": "External Light Reflectance", + "Value": 0.079 + }, + { + "Name": "Internal Light Reflectance", + "Value": 0.077 + }, + { + "Name": "External Emissivity", + "Value": 0.84 + }, + { + "Name": "Internal Emissivity", + "Value": 0.837 + }, + { + "Name": "Vapour Diffusion Factor", + "Value": 99999.0 + }, + { + "Name": "Is Blind", + "Value": false + } + ] + } + ], + "Name": "FIX_LaminatedGlass", + "Guid": "9d6d0030-4060-4e49-8651-27c176053d7a", + "Group": "S08 PR-C fixture", + "DisplayName": "FIX_LaminatedGlass", + "Description": "FIX_LaminatedGlass", + "ThermalConductivity": 0.96, + "SpecificHeatCapacity": 840, + "Density": 2500 + } + ] + }, + "ProfileLibrary": { + "_type": "SAM.Analytical.ProfileLibrary,SAM.Analytical", + "Name": "S08 PR-C fixture profiles", + "Guid": "081a5843-e80d-4fa1-bfc0-412d758bf592", + "Objects": [ + { + "_type": "SAM.Analytical.Profile,SAM.Analytical", + "Name": "FIX_IC_A_OCC", + "Guid": "d9617393-31de-4f2e-af9d-818805a9b6ac", + "Category": "Occupancy", + "Values": [ + [ + 0, + 0.1 + ], + [ + 1, + 0.1 + ], + [ + 2, + 0.1 + ], + [ + 3, + 0.1 + ], + [ + 4, + 0.1 + ], + [ + 5, + 0.1 + ], + [ + 6, + 0.1 + ], + [ + 7, + 0.1 + ], + [ + 8, + 0.4 + ], + [ + 9, + 0.85 + ], + [ + 10, + 0.85 + ], + [ + 11, + 0.85 + ], + [ + 12, + 0.6 + ], + [ + 13, + 0.85 + ], + [ + 14, + 0.85 + ], + [ + 15, + 0.85 + ], + [ + 16, + 0.5 + ], + [ + 17, + 0.1 + ], + [ + 18, + 0.1 + ], + [ + 19, + 0.1 + ], + [ + 20, + 0.1 + ], + [ + 21, + 0.1 + ], + [ + 22, + 0.1 + ], + [ + 23, + 0.1 + ] + ] + }, + { + "_type": "SAM.Analytical.Profile,SAM.Analytical", + "Name": "FIX_IC_A_LGT", + "Guid": "20fc7bae-e069-4463-99e3-dda3aeb02115", + "Category": "Lighting", + "Values": [ + [ + 0, + 0.0 + ], + [ + 1, + 0.0 + ], + [ + 2, + 0.0 + ], + [ + 3, + 0.0 + ], + [ + 4, + 0.0 + ], + [ + 5, + 0.0 + ], + [ + 6, + 0.0 + ], + [ + 7, + 0.5 + ], + [ + 8, + 0.8 + ], + [ + 9, + 0.8 + ], + [ + 10, + 0.8 + ], + [ + 11, + 0.8 + ], + [ + 12, + 0.7 + ], + [ + 13, + 0.8 + ], + [ + 14, + 0.8 + ], + [ + 15, + 0.8 + ], + [ + 16, + 0.8 + ], + [ + 17, + 0.45 + ], + [ + 18, + 0.0 + ], + [ + 19, + 0.0 + ], + [ + 20, + 0.0 + ], + [ + 21, + 0.0 + ], + [ + 22, + 0.0 + ], + [ + 23, + 0.0 + ] + ] + }, + { + "_type": "SAM.Analytical.Profile,SAM.Analytical", + "Name": "FIX_IC_A_EQS", + "Guid": "d5a9d27a-6e55-418f-9c62-7a747d81350c", + "Category": "Equipment Sensible", + "Values": [ + [ + 0, + 0.2 + ], + [ + 1, + 0.2 + ], + [ + 2, + 0.2 + ], + [ + 3, + 0.2 + ], + [ + 4, + 0.2 + ], + [ + 5, + 0.2 + ], + [ + 6, + 0.2 + ], + [ + 7, + 0.2 + ], + [ + 8, + 0.5 + ], + [ + 9, + 0.9 + ], + [ + 10, + 0.9 + ], + [ + 11, + 0.9 + ], + [ + 12, + 0.65 + ], + [ + 13, + 0.9 + ], + [ + 14, + 0.9 + ], + [ + 15, + 0.9 + ], + [ + 16, + 0.35 + ], + [ + 17, + 0.2 + ], + [ + 18, + 0.2 + ], + [ + 19, + 0.2 + ], + [ + 20, + 0.2 + ], + [ + 21, + 0.2 + ], + [ + 22, + 0.2 + ], + [ + 23, + 0.2 + ] + ] + }, + { + "_type": "SAM.Analytical.Profile,SAM.Analytical", + "Name": "FIX_IC_A_EQL", + "Guid": "b3d22275-4bac-46a1-8cbc-747beaccb305", + "Category": "Equipment Latent", + "Values": [ + [ + 0, + 0.3 + ] + ] + }, + { + "_type": "SAM.Analytical.Profile,SAM.Analytical", + "Name": "FIX_IC_A_INF", + "Guid": "4d9a9bb1-fef0-48f5-a3c1-1b7a4a4ecc16", + "Category": "Infiltration", + "Values": [ + [ + 0, + 1.0 + ] + ] + }, + { + "_type": "SAM.Analytical.Profile,SAM.Analytical", + "Name": "FIX_IC_A_HTG", + "Guid": "48761b13-bebc-46ab-90b9-9959d4492578", + "Category": "Heating", + "Values": [ + [ + 0, + 15.0 + ], + [ + 1, + 15.0 + ], + [ + 2, + 15.0 + ], + [ + 3, + 15.0 + ], + [ + 4, + 15.0 + ], + [ + 5, + 15.0 + ], + [ + 6, + 15.0 + ], + [ + 7, + 20.0 + ], + [ + 8, + 20.0 + ], + [ + 9, + 20.0 + ], + [ + 10, + 20.0 + ], + [ + 11, + 20.0 + ], + [ + 12, + 20.0 + ], + [ + 13, + 20.0 + ], + [ + 14, + 20.0 + ], + [ + 15, + 20.0 + ], + [ + 16, + 20.0 + ], + [ + 17, + 20.0 + ], + [ + 18, + 15.0 + ], + [ + 19, + 15.0 + ], + [ + 20, + 15.0 + ], + [ + 21, + 15.0 + ], + [ + 22, + 15.0 + ], + [ + 23, + 15.0 + ] + ] + }, + { + "_type": "SAM.Analytical.Profile,SAM.Analytical", + "Name": "FIX_IC_A_CLG", + "Guid": "b98363d5-7310-45bb-b923-9220908aebde", + "Category": "Cooling", + "Values": [ + [ + 0, + 29.0 + ], + [ + 1, + 29.0 + ], + [ + 2, + 29.0 + ], + [ + 3, + 29.0 + ], + [ + 4, + 29.0 + ], + [ + 5, + 29.0 + ], + [ + 6, + 29.0 + ], + [ + 7, + 25.0 + ], + [ + 8, + 25.0 + ], + [ + 9, + 25.0 + ], + [ + 10, + 25.0 + ], + [ + 11, + 25.0 + ], + [ + 12, + 25.0 + ], + [ + 13, + 25.0 + ], + [ + 14, + 25.0 + ], + [ + 15, + 25.0 + ], + [ + 16, + 25.0 + ], + [ + 17, + 25.0 + ], + [ + 18, + 29.0 + ], + [ + 19, + 29.0 + ], + [ + 20, + 29.0 + ], + [ + 21, + 29.0 + ], + [ + 22, + 29.0 + ], + [ + 23, + 29.0 + ] + ] + }, + { + "_type": "SAM.Analytical.Profile,SAM.Analytical", + "Name": "FIX_IC_A_HUM", + "Guid": "cfc741aa-7d9b-431e-854c-465097840705", + "Category": "Humidification", + "Values": [ + [ + 0, + 30.0 + ] + ] + }, + { + "_type": "SAM.Analytical.Profile,SAM.Analytical", + "Name": "FIX_IC_A_DHU", + "Guid": "b61ea26e-7d24-4b7d-a7c9-6f2fd1f719b3", + "Category": "Dehumidification", + "Values": [ + [ + 0, + 70.0 + ] + ] + }, + { + "_type": "SAM.Analytical.Profile,SAM.Analytical", + "Name": "FIX_IC_B_OCC", + "Guid": "b458fd88-4676-4fa0-a1b1-a872628d1c14", + "Category": "Occupancy", + "Values": [ + [ + 0, + 0.9 + ], + [ + 1, + 0.9 + ], + [ + 2, + 0.9 + ], + [ + 3, + 0.9 + ], + [ + 4, + 0.9 + ], + [ + 5, + 0.9 + ], + [ + 6, + 0.9 + ], + [ + 7, + 0.9 + ], + [ + 8, + 0.9 + ], + [ + 9, + 0.6 + ], + [ + 10, + 0.2 + ], + [ + 11, + 0.2 + ], + [ + 12, + 0.3 + ], + [ + 13, + 0.2 + ], + [ + 14, + 0.2 + ], + [ + 15, + 0.2 + ], + [ + 16, + 0.2 + ], + [ + 17, + 0.7 + ], + [ + 18, + 0.9 + ], + [ + 19, + 0.9 + ], + [ + 20, + 0.9 + ], + [ + 21, + 0.9 + ], + [ + 22, + 0.9 + ], + [ + 23, + 0.9 + ] + ] + }, + { + "_type": "SAM.Analytical.Profile,SAM.Analytical", + "Name": "FIX_IC_B_LGT", + "Guid": "6a74576d-a0c1-48d1-8d80-960da5be7131", + "Category": "Lighting", + "Values": [ + [ + 0, + 0.1 + ], + [ + 1, + 0.1 + ], + [ + 2, + 0.1 + ], + [ + 3, + 0.1 + ], + [ + 4, + 0.1 + ], + [ + 5, + 0.1 + ], + [ + 6, + 0.65 + ], + [ + 7, + 0.3 + ], + [ + 8, + 0.3 + ], + [ + 9, + 0.3 + ], + [ + 10, + 0.3 + ], + [ + 11, + 0.3 + ], + [ + 12, + 0.35 + ], + [ + 13, + 0.3 + ], + [ + 14, + 0.3 + ], + [ + 15, + 0.3 + ], + [ + 16, + 0.3 + ], + [ + 17, + 0.3 + ], + [ + 18, + 0.3 + ], + [ + 19, + 0.3 + ], + [ + 20, + 0.3 + ], + [ + 21, + 0.3 + ], + [ + 22, + 0.9 + ], + [ + 23, + 0.1 + ] + ] + }, + { + "_type": "SAM.Analytical.Profile,SAM.Analytical", + "Name": "FIX_IC_B_EQS", + "Guid": "28acfa92-800f-476d-a985-6cd8bbef4ae1", + "Category": "Equipment Sensible", + "Values": [ + [ + 0, + 0.25 + ], + [ + 1, + 0.25 + ], + [ + 2, + 0.25 + ], + [ + 3, + 0.25 + ], + [ + 4, + 0.25 + ], + [ + 5, + 0.25 + ], + [ + 6, + 0.4 + ], + [ + 7, + 0.3 + ], + [ + 8, + 0.3 + ], + [ + 9, + 0.3 + ], + [ + 10, + 0.3 + ], + [ + 11, + 0.3 + ], + [ + 12, + 0.5 + ], + [ + 13, + 0.3 + ], + [ + 14, + 0.3 + ], + [ + 15, + 0.3 + ], + [ + 16, + 0.3 + ], + [ + 17, + 0.3 + ], + [ + 18, + 0.3 + ], + [ + 19, + 0.3 + ], + [ + 20, + 0.3 + ], + [ + 21, + 0.6 + ], + [ + 22, + 0.25 + ], + [ + 23, + 0.25 + ], + [ + 24, + 0.25 + ], + [ + 25, + 0.25 + ], + [ + 26, + 0.25 + ], + [ + 27, + 0.25 + ], + [ + 28, + 0.25 + ], + [ + 29, + 0.25 + ], + [ + 30, + 0.4 + ], + [ + 31, + 0.3 + ], + [ + 32, + 0.3 + ], + [ + 33, + 0.3 + ], + [ + 34, + 0.3 + ], + [ + 35, + 0.3 + ], + [ + 36, + 0.5 + ], + [ + 37, + 0.3 + ], + [ + 38, + 0.3 + ], + [ + 39, + 0.3 + ], + [ + 40, + 0.3 + ], + [ + 41, + 0.3 + ], + [ + 42, + 0.3 + ], + [ + 43, + 0.3 + ], + [ + 44, + 0.3 + ], + [ + 45, + 0.6 + ], + [ + 46, + 0.25 + ], + [ + 47, + 0.25 + ], + [ + 48, + 0.25 + ], + [ + 49, + 0.25 + ], + [ + 50, + 0.25 + ], + [ + 51, + 0.25 + ], + [ + 52, + 0.25 + ], + [ + 53, + 0.25 + ], + [ + 54, + 0.4 + ], + [ + 55, + 0.3 + ], + [ + 56, + 0.3 + ], + [ + 57, + 0.3 + ], + [ + 58, + 0.3 + ], + [ + 59, + 0.3 + ], + [ + 60, + 0.5 + ], + [ + 61, + 0.3 + ], + [ + 62, + 0.3 + ], + [ + 63, + 0.3 + ], + [ + 64, + 0.3 + ], + [ + 65, + 0.3 + ], + [ + 66, + 0.3 + ], + [ + 67, + 0.3 + ], + [ + 68, + 0.3 + ], + [ + 69, + 0.6 + ], + [ + 70, + 0.25 + ], + [ + 71, + 0.25 + ], + [ + 72, + 0.25 + ], + [ + 73, + 0.25 + ], + [ + 74, + 0.25 + ], + [ + 75, + 0.25 + ], + [ + 76, + 0.25 + ], + [ + 77, + 0.25 + ], + [ + 78, + 0.4 + ], + [ + 79, + 0.3 + ], + [ + 80, + 0.3 + ], + [ + 81, + 0.3 + ], + [ + 82, + 0.3 + ], + [ + 83, + 0.3 + ], + [ + 84, + 0.5 + ], + [ + 85, + 0.3 + ], + [ + 86, + 0.3 + ], + [ + 87, + 0.3 + ], + [ + 88, + 0.3 + ], + [ + 89, + 0.3 + ], + [ + 90, + 0.3 + ], + [ + 91, + 0.3 + ], + [ + 92, + 0.3 + ], + [ + 93, + 0.6 + ], + [ + 94, + 0.25 + ], + [ + 95, + 0.25 + ], + [ + 96, + 0.25 + ], + [ + 97, + 0.25 + ], + [ + 98, + 0.25 + ], + [ + 99, + 0.25 + ], + [ + 100, + 0.25 + ], + [ + 101, + 0.25 + ], + [ + 102, + 0.4 + ], + [ + 103, + 0.3 + ], + [ + 104, + 0.3 + ], + [ + 105, + 0.3 + ], + [ + 106, + 0.3 + ], + [ + 107, + 0.3 + ], + [ + 108, + 0.5 + ], + [ + 109, + 0.3 + ], + [ + 110, + 0.3 + ], + [ + 111, + 0.3 + ], + [ + 112, + 0.3 + ], + [ + 113, + 0.3 + ], + [ + 114, + 0.3 + ], + [ + 115, + 0.3 + ], + [ + 116, + 0.3 + ], + [ + 117, + 0.6 + ], + [ + 118, + 0.25 + ], + [ + 119, + 0.25 + ], + [ + 120, + 0.3 + ], + [ + 121, + 0.3 + ], + [ + 122, + 0.3 + ], + [ + 123, + 0.3 + ], + [ + 124, + 0.3 + ], + [ + 125, + 0.3 + ], + [ + 126, + 0.3 + ], + [ + 127, + 0.5 + ], + [ + 128, + 0.55 + ], + [ + 129, + 0.55 + ], + [ + 130, + 0.55 + ], + [ + 131, + 0.55 + ], + [ + 132, + 0.65 + ], + [ + 133, + 0.55 + ], + [ + 134, + 0.55 + ], + [ + 135, + 0.55 + ], + [ + 136, + 0.55 + ], + [ + 137, + 0.55 + ], + [ + 138, + 0.55 + ], + [ + 139, + 0.55 + ], + [ + 140, + 0.55 + ], + [ + 141, + 0.55 + ], + [ + 142, + 0.7 + ], + [ + 143, + 0.3 + ], + [ + 144, + 0.3 + ], + [ + 145, + 0.3 + ], + [ + 146, + 0.3 + ], + [ + 147, + 0.3 + ], + [ + 148, + 0.3 + ], + [ + 149, + 0.3 + ], + [ + 150, + 0.3 + ], + [ + 151, + 0.5 + ], + [ + 152, + 0.55 + ], + [ + 153, + 0.55 + ], + [ + 154, + 0.55 + ], + [ + 155, + 0.55 + ], + [ + 156, + 0.65 + ], + [ + 157, + 0.55 + ], + [ + 158, + 0.55 + ], + [ + 159, + 0.55 + ], + [ + 160, + 0.55 + ], + [ + 161, + 0.55 + ], + [ + 162, + 0.55 + ], + [ + 163, + 0.55 + ], + [ + 164, + 0.55 + ], + [ + 165, + 0.55 + ], + [ + 166, + 0.7 + ], + [ + 167, + 0.3 + ], + [ + 168, + 0.25 + ], + [ + 169, + 0.25 + ], + [ + 170, + 0.25 + ], + [ + 171, + 0.25 + ], + [ + 172, + 0.25 + ], + [ + 173, + 0.25 + ], + [ + 174, + 0.4 + ], + [ + 175, + 0.3 + ], + [ + 176, + 0.3 + ], + [ + 177, + 0.3 + ], + [ + 178, + 0.3 + ], + [ + 179, + 0.3 + ], + [ + 180, + 0.5 + ], + [ + 181, + 0.3 + ], + [ + 182, + 0.3 + ], + [ + 183, + 0.3 + ], + [ + 184, + 0.3 + ], + [ + 185, + 0.3 + ], + [ + 186, + 0.3 + ], + [ + 187, + 0.3 + ], + [ + 188, + 0.3 + ], + [ + 189, + 0.6 + ], + [ + 190, + 0.25 + ], + [ + 191, + 0.25 + ], + [ + 192, + 0.25 + ], + [ + 193, + 0.25 + ], + [ + 194, + 0.25 + ], + [ + 195, + 0.25 + ], + [ + 196, + 0.25 + ], + [ + 197, + 0.25 + ], + [ + 198, + 0.4 + ], + [ + 199, + 0.3 + ], + [ + 200, + 0.3 + ], + [ + 201, + 0.3 + ], + [ + 202, + 0.3 + ], + [ + 203, + 0.3 + ], + [ + 204, + 0.5 + ], + [ + 205, + 0.3 + ], + [ + 206, + 0.3 + ], + [ + 207, + 0.3 + ], + [ + 208, + 0.3 + ], + [ + 209, + 0.3 + ], + [ + 210, + 0.3 + ], + [ + 211, + 0.3 + ], + [ + 212, + 0.3 + ], + [ + 213, + 0.6 + ], + [ + 214, + 0.25 + ], + [ + 215, + 0.25 + ], + [ + 216, + 0.25 + ], + [ + 217, + 0.25 + ], + [ + 218, + 0.25 + ], + [ + 219, + 0.25 + ], + [ + 220, + 0.25 + ], + [ + 221, + 0.25 + ], + [ + 222, + 0.4 + ], + [ + 223, + 0.3 + ], + [ + 224, + 0.3 + ], + [ + 225, + 0.3 + ], + [ + 226, + 0.3 + ], + [ + 227, + 0.3 + ], + [ + 228, + 0.5 + ], + [ + 229, + 0.3 + ], + [ + 230, + 0.3 + ], + [ + 231, + 0.3 + ], + [ + 232, + 0.3 + ], + [ + 233, + 0.3 + ], + [ + 234, + 0.3 + ], + [ + 235, + 0.3 + ], + [ + 236, + 0.3 + ], + [ + 237, + 0.6 + ], + [ + 238, + 0.25 + ], + [ + 239, + 0.25 + ], + [ + 240, + 0.25 + ], + [ + 241, + 0.25 + ], + [ + 242, + 0.25 + ], + [ + 243, + 0.25 + ], + [ + 244, + 0.25 + ], + [ + 245, + 0.25 + ], + [ + 246, + 0.4 + ], + [ + 247, + 0.3 + ], + [ + 248, + 0.3 + ], + [ + 249, + 0.3 + ], + [ + 250, + 0.3 + ], + [ + 251, + 0.3 + ], + [ + 252, + 0.5 + ], + [ + 253, + 0.3 + ], + [ + 254, + 0.3 + ], + [ + 255, + 0.3 + ], + [ + 256, + 0.3 + ], + [ + 257, + 0.3 + ], + [ + 258, + 0.3 + ], + [ + 259, + 0.3 + ], + [ + 260, + 0.3 + ], + [ + 261, + 0.6 + ], + [ + 262, + 0.25 + ], + [ + 263, + 0.25 + ], + [ + 264, + 0.25 + ], + [ + 265, + 0.25 + ], + [ + 266, + 0.25 + ], + [ + 267, + 0.25 + ], + [ + 268, + 0.25 + ], + [ + 269, + 0.25 + ], + [ + 270, + 0.4 + ], + [ + 271, + 0.3 + ], + [ + 272, + 0.3 + ], + [ + 273, + 0.3 + ], + [ + 274, + 0.3 + ], + [ + 275, + 0.3 + ], + [ + 276, + 0.5 + ], + [ + 277, + 0.3 + ], + [ + 278, + 0.3 + ], + [ + 279, + 0.3 + ], + [ + 280, + 0.3 + ], + [ + 281, + 0.3 + ], + [ + 282, + 0.3 + ], + [ + 283, + 0.3 + ], + [ + 284, + 0.3 + ], + [ + 285, + 0.6 + ], + [ + 286, + 0.25 + ], + [ + 287, + 0.25 + ], + [ + 288, + 0.3 + ], + [ + 289, + 0.3 + ], + [ + 290, + 0.3 + ], + [ + 291, + 0.3 + ], + [ + 292, + 0.3 + ], + [ + 293, + 0.3 + ], + [ + 294, + 0.3 + ], + [ + 295, + 0.5 + ], + [ + 296, + 0.55 + ], + [ + 297, + 0.55 + ], + [ + 298, + 0.55 + ], + [ + 299, + 0.55 + ], + [ + 300, + 0.65 + ], + [ + 301, + 0.55 + ], + [ + 302, + 0.55 + ], + [ + 303, + 0.55 + ], + [ + 304, + 0.55 + ], + [ + 305, + 0.55 + ], + [ + 306, + 0.55 + ], + [ + 307, + 0.55 + ], + [ + 308, + 0.55 + ], + [ + 309, + 0.55 + ], + [ + 310, + 0.7 + ], + [ + 311, + 0.3 + ], + [ + 312, + 0.3 + ], + [ + 313, + 0.3 + ], + [ + 314, + 0.3 + ], + [ + 315, + 0.3 + ], + [ + 316, + 0.3 + ], + [ + 317, + 0.3 + ], + [ + 318, + 0.3 + ], + [ + 319, + 0.5 + ], + [ + 320, + 0.55 + ], + [ + 321, + 0.55 + ], + [ + 322, + 0.55 + ], + [ + 323, + 0.55 + ], + [ + 324, + 0.65 + ], + [ + 325, + 0.55 + ], + [ + 326, + 0.55 + ], + [ + 327, + 0.55 + ], + [ + 328, + 0.55 + ], + [ + 329, + 0.55 + ], + [ + 330, + 0.55 + ], + [ + 331, + 0.55 + ], + [ + 332, + 0.55 + ], + [ + 333, + 0.55 + ], + [ + 334, + 0.7 + ], + [ + 335, + 0.3 + ], + [ + 336, + 0.25 + ], + [ + 337, + 0.25 + ], + [ + 338, + 0.25 + ], + [ + 339, + 0.25 + ], + [ + 340, + 0.25 + ], + [ + 341, + 0.25 + ], + [ + 342, + 0.4 + ], + [ + 343, + 0.3 + ], + [ + 344, + 0.3 + ], + [ + 345, + 0.3 + ], + [ + 346, + 0.3 + ], + [ + 347, + 0.3 + ], + [ + 348, + 0.5 + ], + [ + 349, + 0.3 + ], + [ + 350, + 0.3 + ], + [ + 351, + 0.3 + ], + [ + 352, + 0.3 + ], + [ + 353, + 0.3 + ], + [ + 354, + 0.3 + ], + [ + 355, + 0.3 + ], + [ + 356, + 0.3 + ], + [ + 357, + 0.6 + ], + [ + 358, + 0.25 + ], + [ + 359, + 0.25 + ], + [ + 360, + 0.25 + ], + [ + 361, + 0.25 + ], + [ + 362, + 0.25 + ], + [ + 363, + 0.25 + ], + [ + 364, + 0.25 + ], + [ + 365, + 0.25 + ], + [ + 366, + 0.4 + ], + [ + 367, + 0.3 + ], + [ + 368, + 0.3 + ], + [ + 369, + 0.3 + ], + [ + 370, + 0.3 + ], + [ + 371, + 0.3 + ], + [ + 372, + 0.5 + ], + [ + 373, + 0.3 + ], + [ + 374, + 0.3 + ], + [ + 375, + 0.3 + ], + [ + 376, + 0.3 + ], + [ + 377, + 0.3 + ], + [ + 378, + 0.3 + ], + [ + 379, + 0.3 + ], + [ + 380, + 0.3 + ], + [ + 381, + 0.6 + ], + [ + 382, + 0.25 + ], + [ + 383, + 0.25 + ], + [ + 384, + 0.25 + ], + [ + 385, + 0.25 + ], + [ + 386, + 0.25 + ], + [ + 387, + 0.25 + ], + [ + 388, + 0.25 + ], + [ + 389, + 0.25 + ], + [ + 390, + 0.4 + ], + [ + 391, + 0.3 + ], + [ + 392, + 0.3 + ], + [ + 393, + 0.3 + ], + [ + 394, + 0.3 + ], + [ + 395, + 0.3 + ], + [ + 396, + 0.5 + ], + [ + 397, + 0.3 + ], + [ + 398, + 0.3 + ], + [ + 399, + 0.3 + ], + [ + 400, + 0.3 + ], + [ + 401, + 0.3 + ], + [ + 402, + 0.3 + ], + [ + 403, + 0.3 + ], + [ + 404, + 0.3 + ], + [ + 405, + 0.6 + ], + [ + 406, + 0.25 + ], + [ + 407, + 0.25 + ], + [ + 408, + 0.25 + ], + [ + 409, + 0.25 + ], + [ + 410, + 0.25 + ], + [ + 411, + 0.25 + ], + [ + 412, + 0.25 + ], + [ + 413, + 0.25 + ], + [ + 414, + 0.4 + ], + [ + 415, + 0.3 + ], + [ + 416, + 0.3 + ], + [ + 417, + 0.3 + ], + [ + 418, + 0.3 + ], + [ + 419, + 0.3 + ], + [ + 420, + 0.5 + ], + [ + 421, + 0.3 + ], + [ + 422, + 0.3 + ], + [ + 423, + 0.3 + ], + [ + 424, + 0.3 + ], + [ + 425, + 0.3 + ], + [ + 426, + 0.3 + ], + [ + 427, + 0.3 + ], + [ + 428, + 0.3 + ], + [ + 429, + 0.6 + ], + [ + 430, + 0.25 + ], + [ + 431, + 0.25 + ], + [ + 432, + 0.25 + ], + [ + 433, + 0.25 + ], + [ + 434, + 0.25 + ], + [ + 435, + 0.25 + ], + [ + 436, + 0.25 + ], + [ + 437, + 0.25 + ], + [ + 438, + 0.4 + ], + [ + 439, + 0.3 + ], + [ + 440, + 0.3 + ], + [ + 441, + 0.3 + ], + [ + 442, + 0.3 + ], + [ + 443, + 0.3 + ], + [ + 444, + 0.5 + ], + [ + 445, + 0.3 + ], + [ + 446, + 0.3 + ], + [ + 447, + 0.3 + ], + [ + 448, + 0.3 + ], + [ + 449, + 0.3 + ], + [ + 450, + 0.3 + ], + [ + 451, + 0.3 + ], + [ + 452, + 0.3 + ], + [ + 453, + 0.6 + ], + [ + 454, + 0.25 + ], + [ + 455, + 0.25 + ], + [ + 456, + 0.3 + ], + [ + 457, + 0.3 + ], + [ + 458, + 0.3 + ], + [ + 459, + 0.3 + ], + [ + 460, + 0.3 + ], + [ + 461, + 0.3 + ], + [ + 462, + 0.3 + ], + [ + 463, + 0.5 + ], + [ + 464, + 0.55 + ], + [ + 465, + 0.55 + ], + [ + 466, + 0.55 + ], + [ + 467, + 0.55 + ], + [ + 468, + 0.65 + ], + [ + 469, + 0.55 + ], + [ + 470, + 0.55 + ], + [ + 471, + 0.55 + ], + [ + 472, + 0.55 + ], + [ + 473, + 0.55 + ], + [ + 474, + 0.55 + ], + [ + 475, + 0.55 + ], + [ + 476, + 0.55 + ], + [ + 477, + 0.55 + ], + [ + 478, + 0.7 + ], + [ + 479, + 0.3 + ], + [ + 480, + 0.3 + ], + [ + 481, + 0.3 + ], + [ + 482, + 0.3 + ], + [ + 483, + 0.3 + ], + [ + 484, + 0.3 + ], + [ + 485, + 0.3 + ], + [ + 486, + 0.3 + ], + [ + 487, + 0.5 + ], + [ + 488, + 0.55 + ], + [ + 489, + 0.55 + ], + [ + 490, + 0.55 + ], + [ + 491, + 0.55 + ], + [ + 492, + 0.65 + ], + [ + 493, + 0.55 + ], + [ + 494, + 0.55 + ], + [ + 495, + 0.55 + ], + [ + 496, + 0.55 + ], + [ + 497, + 0.55 + ], + [ + 498, + 0.55 + ], + [ + 499, + 0.55 + ], + [ + 500, + 0.55 + ], + [ + 501, + 0.55 + ], + [ + 502, + 0.7 + ], + [ + 503, + 0.3 + ], + [ + 504, + 0.25 + ], + [ + 505, + 0.25 + ], + [ + 506, + 0.25 + ], + [ + 507, + 0.25 + ], + [ + 508, + 0.25 + ], + [ + 509, + 0.25 + ], + [ + 510, + 0.4 + ], + [ + 511, + 0.3 + ], + [ + 512, + 0.3 + ], + [ + 513, + 0.3 + ], + [ + 514, + 0.3 + ], + [ + 515, + 0.3 + ], + [ + 516, + 0.5 + ], + [ + 517, + 0.3 + ], + [ + 518, + 0.3 + ], + [ + 519, + 0.3 + ], + [ + 520, + 0.3 + ], + [ + 521, + 0.3 + ], + [ + 522, + 0.3 + ], + [ + 523, + 0.3 + ], + [ + 524, + 0.3 + ], + [ + 525, + 0.6 + ], + [ + 526, + 0.25 + ], + [ + 527, + 0.25 + ], + [ + 528, + 0.25 + ], + [ + 529, + 0.25 + ], + [ + 530, + 0.25 + ], + [ + 531, + 0.25 + ], + [ + 532, + 0.25 + ], + [ + 533, + 0.25 + ], + [ + 534, + 0.4 + ], + [ + 535, + 0.3 + ], + [ + 536, + 0.3 + ], + [ + 537, + 0.3 + ], + [ + 538, + 0.3 + ], + [ + 539, + 0.3 + ], + [ + 540, + 0.5 + ], + [ + 541, + 0.3 + ], + [ + 542, + 0.3 + ], + [ + 543, + 0.3 + ], + [ + 544, + 0.3 + ], + [ + 545, + 0.3 + ], + [ + 546, + 0.3 + ], + [ + 547, + 0.3 + ], + [ + 548, + 0.3 + ], + [ + 549, + 0.6 + ], + [ + 550, + 0.25 + ], + [ + 551, + 0.25 + ], + [ + 552, + 0.25 + ], + [ + 553, + 0.25 + ], + [ + 554, + 0.25 + ], + [ + 555, + 0.25 + ], + [ + 556, + 0.25 + ], + [ + 557, + 0.25 + ], + [ + 558, + 0.4 + ], + [ + 559, + 0.3 + ], + [ + 560, + 0.3 + ], + [ + 561, + 0.3 + ], + [ + 562, + 0.3 + ], + [ + 563, + 0.3 + ], + [ + 564, + 0.5 + ], + [ + 565, + 0.3 + ], + [ + 566, + 0.3 + ], + [ + 567, + 0.3 + ], + [ + 568, + 0.3 + ], + [ + 569, + 0.3 + ], + [ + 570, + 0.3 + ], + [ + 571, + 0.3 + ], + [ + 572, + 0.3 + ], + [ + 573, + 0.6 + ], + [ + 574, + 0.25 + ], + [ + 575, + 0.25 + ], + [ + 576, + 0.25 + ], + [ + 577, + 0.25 + ], + [ + 578, + 0.25 + ], + [ + 579, + 0.25 + ], + [ + 580, + 0.25 + ], + [ + 581, + 0.25 + ], + [ + 582, + 0.4 + ], + [ + 583, + 0.3 + ], + [ + 584, + 0.3 + ], + [ + 585, + 0.3 + ], + [ + 586, + 0.3 + ], + [ + 587, + 0.3 + ], + [ + 588, + 0.5 + ], + [ + 589, + 0.3 + ], + [ + 590, + 0.3 + ], + [ + 591, + 0.3 + ], + [ + 592, + 0.3 + ], + [ + 593, + 0.3 + ], + [ + 594, + 0.3 + ], + [ + 595, + 0.3 + ], + [ + 596, + 0.3 + ], + [ + 597, + 0.6 + ], + [ + 598, + 0.25 + ], + [ + 599, + 0.25 + ], + [ + 600, + 0.25 + ], + [ + 601, + 0.25 + ], + [ + 602, + 0.25 + ], + [ + 603, + 0.25 + ], + [ + 604, + 0.25 + ], + [ + 605, + 0.25 + ], + [ + 606, + 0.4 + ], + [ + 607, + 0.3 + ], + [ + 608, + 0.3 + ], + [ + 609, + 0.3 + ], + [ + 610, + 0.3 + ], + [ + 611, + 0.3 + ], + [ + 612, + 0.5 + ], + [ + 613, + 0.3 + ], + [ + 614, + 0.3 + ], + [ + 615, + 0.3 + ], + [ + 616, + 0.3 + ], + [ + 617, + 0.3 + ], + [ + 618, + 0.3 + ], + [ + 619, + 0.3 + ], + [ + 620, + 0.3 + ], + [ + 621, + 0.6 + ], + [ + 622, + 0.25 + ], + [ + 623, + 0.25 + ], + [ + 624, + 0.3 + ], + [ + 625, + 0.3 + ], + [ + 626, + 0.3 + ], + [ + 627, + 0.3 + ], + [ + 628, + 0.3 + ], + [ + 629, + 0.3 + ], + [ + 630, + 0.3 + ], + [ + 631, + 0.5 + ], + [ + 632, + 0.55 + ], + [ + 633, + 0.55 + ], + [ + 634, + 0.55 + ], + [ + 635, + 0.55 + ], + [ + 636, + 0.65 + ], + [ + 637, + 0.55 + ], + [ + 638, + 0.55 + ], + [ + 639, + 0.55 + ], + [ + 640, + 0.55 + ], + [ + 641, + 0.55 + ], + [ + 642, + 0.55 + ], + [ + 643, + 0.55 + ], + [ + 644, + 0.55 + ], + [ + 645, + 0.55 + ], + [ + 646, + 0.7 + ], + [ + 647, + 0.3 + ], + [ + 648, + 0.3 + ], + [ + 649, + 0.3 + ], + [ + 650, + 0.3 + ], + [ + 651, + 0.3 + ], + [ + 652, + 0.3 + ], + [ + 653, + 0.3 + ], + [ + 654, + 0.3 + ], + [ + 655, + 0.5 + ], + [ + 656, + 0.55 + ], + [ + 657, + 0.55 + ], + [ + 658, + 0.55 + ], + [ + 659, + 0.55 + ], + [ + 660, + 0.65 + ], + [ + 661, + 0.55 + ], + [ + 662, + 0.55 + ], + [ + 663, + 0.55 + ], + [ + 664, + 0.55 + ], + [ + 665, + 0.55 + ], + [ + 666, + 0.55 + ], + [ + 667, + 0.55 + ], + [ + 668, + 0.55 + ], + [ + 669, + 0.55 + ], + [ + 670, + 0.7 + ], + [ + 671, + 0.3 + ], + [ + 672, + 0.25 + ], + [ + 673, + 0.25 + ], + [ + 674, + 0.25 + ], + [ + 675, + 0.25 + ], + [ + 676, + 0.25 + ], + [ + 677, + 0.25 + ], + [ + 678, + 0.4 + ], + [ + 679, + 0.3 + ], + [ + 680, + 0.3 + ], + [ + 681, + 0.3 + ], + [ + 682, + 0.3 + ], + [ + 683, + 0.3 + ], + [ + 684, + 0.5 + ], + [ + 685, + 0.3 + ], + [ + 686, + 0.3 + ], + [ + 687, + 0.3 + ], + [ + 688, + 0.3 + ], + [ + 689, + 0.3 + ], + [ + 690, + 0.3 + ], + [ + 691, + 0.3 + ], + [ + 692, + 0.3 + ], + [ + 693, + 0.6 + ], + [ + 694, + 0.25 + ], + [ + 695, + 0.25 + ], + [ + 696, + 0.25 + ], + [ + 697, + 0.25 + ], + [ + 698, + 0.25 + ], + [ + 699, + 0.25 + ], + [ + 700, + 0.25 + ], + [ + 701, + 0.25 + ], + [ + 702, + 0.4 + ], + [ + 703, + 0.3 + ], + [ + 704, + 0.3 + ], + [ + 705, + 0.3 + ], + [ + 706, + 0.3 + ], + [ + 707, + 0.3 + ], + [ + 708, + 0.5 + ], + [ + 709, + 0.3 + ], + [ + 710, + 0.3 + ], + [ + 711, + 0.3 + ], + [ + 712, + 0.3 + ], + [ + 713, + 0.3 + ], + [ + 714, + 0.3 + ], + [ + 715, + 0.3 + ], + [ + 716, + 0.3 + ], + [ + 717, + 0.6 + ], + [ + 718, + 0.25 + ], + [ + 719, + 0.25 + ], + [ + 720, + 0.25 + ], + [ + 721, + 0.25 + ], + [ + 722, + 0.25 + ], + [ + 723, + 0.25 + ], + [ + 724, + 0.25 + ], + [ + 725, + 0.25 + ], + [ + 726, + 0.4 + ], + [ + 727, + 0.3 + ], + [ + 728, + 0.3 + ], + [ + 729, + 0.3 + ], + [ + 730, + 0.3 + ], + [ + 731, + 0.3 + ], + [ + 732, + 0.5 + ], + [ + 733, + 0.3 + ], + [ + 734, + 0.3 + ], + [ + 735, + 0.3 + ], + [ + 736, + 0.3 + ], + [ + 737, + 0.3 + ], + [ + 738, + 0.3 + ], + [ + 739, + 0.3 + ], + [ + 740, + 0.3 + ], + [ + 741, + 0.6 + ], + [ + 742, + 0.25 + ], + [ + 743, + 0.25 + ], + [ + 744, + 0.25 + ], + [ + 745, + 0.25 + ], + [ + 746, + 0.25 + ], + [ + 747, + 0.25 + ], + [ + 748, + 0.25 + ], + [ + 749, + 0.25 + ], + [ + 750, + 0.4 + ], + [ + 751, + 0.3 + ], + [ + 752, + 0.3 + ], + [ + 753, + 0.3 + ], + [ + 754, + 0.3 + ], + [ + 755, + 0.3 + ], + [ + 756, + 0.5 + ], + [ + 757, + 0.3 + ], + [ + 758, + 0.3 + ], + [ + 759, + 0.3 + ], + [ + 760, + 0.3 + ], + [ + 761, + 0.3 + ], + [ + 762, + 0.3 + ], + [ + 763, + 0.3 + ], + [ + 764, + 0.3 + ], + [ + 765, + 0.6 + ], + [ + 766, + 0.25 + ], + [ + 767, + 0.25 + ], + [ + 768, + 0.25 + ], + [ + 769, + 0.25 + ], + [ + 770, + 0.25 + ], + [ + 771, + 0.25 + ], + [ + 772, + 0.25 + ], + [ + 773, + 0.25 + ], + [ + 774, + 0.4 + ], + [ + 775, + 0.3 + ], + [ + 776, + 0.3 + ], + [ + 777, + 0.3 + ], + [ + 778, + 0.3 + ], + [ + 779, + 0.3 + ], + [ + 780, + 0.5 + ], + [ + 781, + 0.3 + ], + [ + 782, + 0.3 + ], + [ + 783, + 0.3 + ], + [ + 784, + 0.3 + ], + [ + 785, + 0.3 + ], + [ + 786, + 0.3 + ], + [ + 787, + 0.3 + ], + [ + 788, + 0.3 + ], + [ + 789, + 0.6 + ], + [ + 790, + 0.25 + ], + [ + 791, + 0.25 + ], + [ + 792, + 0.3 + ], + [ + 793, + 0.3 + ], + [ + 794, + 0.3 + ], + [ + 795, + 0.3 + ], + [ + 796, + 0.3 + ], + [ + 797, + 0.3 + ], + [ + 798, + 0.3 + ], + [ + 799, + 0.5 + ], + [ + 800, + 0.55 + ], + [ + 801, + 0.55 + ], + [ + 802, + 0.55 + ], + [ + 803, + 0.55 + ], + [ + 804, + 0.65 + ], + [ + 805, + 0.55 + ], + [ + 806, + 0.55 + ], + [ + 807, + 0.55 + ], + [ + 808, + 0.55 + ], + [ + 809, + 0.55 + ], + [ + 810, + 0.55 + ], + [ + 811, + 0.55 + ], + [ + 812, + 0.55 + ], + [ + 813, + 0.55 + ], + [ + 814, + 0.7 + ], + [ + 815, + 0.3 + ], + [ + 816, + 0.3 + ], + [ + 817, + 0.3 + ], + [ + 818, + 0.3 + ], + [ + 819, + 0.3 + ], + [ + 820, + 0.3 + ], + [ + 821, + 0.3 + ], + [ + 822, + 0.3 + ], + [ + 823, + 0.5 + ], + [ + 824, + 0.55 + ], + [ + 825, + 0.55 + ], + [ + 826, + 0.55 + ], + [ + 827, + 0.55 + ], + [ + 828, + 0.65 + ], + [ + 829, + 0.55 + ], + [ + 830, + 0.55 + ], + [ + 831, + 0.55 + ], + [ + 832, + 0.55 + ], + [ + 833, + 0.55 + ], + [ + 834, + 0.55 + ], + [ + 835, + 0.55 + ], + [ + 836, + 0.55 + ], + [ + 837, + 0.55 + ], + [ + 838, + 0.7 + ], + [ + 839, + 0.3 + ], + [ + 840, + 0.25 + ], + [ + 841, + 0.25 + ], + [ + 842, + 0.25 + ], + [ + 843, + 0.25 + ], + [ + 844, + 0.25 + ], + [ + 845, + 0.25 + ], + [ + 846, + 0.4 + ], + [ + 847, + 0.3 + ], + [ + 848, + 0.3 + ], + [ + 849, + 0.3 + ], + [ + 850, + 0.3 + ], + [ + 851, + 0.3 + ], + [ + 852, + 0.5 + ], + [ + 853, + 0.3 + ], + [ + 854, + 0.3 + ], + [ + 855, + 0.3 + ], + [ + 856, + 0.3 + ], + [ + 857, + 0.3 + ], + [ + 858, + 0.3 + ], + [ + 859, + 0.3 + ], + [ + 860, + 0.3 + ], + [ + 861, + 0.6 + ], + [ + 862, + 0.25 + ], + [ + 863, + 0.25 + ], + [ + 864, + 0.25 + ], + [ + 865, + 0.25 + ], + [ + 866, + 0.25 + ], + [ + 867, + 0.25 + ], + [ + 868, + 0.25 + ], + [ + 869, + 0.25 + ], + [ + 870, + 0.4 + ], + [ + 871, + 0.3 + ], + [ + 872, + 0.3 + ], + [ + 873, + 0.3 + ], + [ + 874, + 0.3 + ], + [ + 875, + 0.3 + ], + [ + 876, + 0.5 + ], + [ + 877, + 0.3 + ], + [ + 878, + 0.3 + ], + [ + 879, + 0.3 + ], + [ + 880, + 0.3 + ], + [ + 881, + 0.3 + ], + [ + 882, + 0.3 + ], + [ + 883, + 0.3 + ], + [ + 884, + 0.3 + ], + [ + 885, + 0.6 + ], + [ + 886, + 0.25 + ], + [ + 887, + 0.25 + ], + [ + 888, + 0.25 + ], + [ + 889, + 0.25 + ], + [ + 890, + 0.25 + ], + [ + 891, + 0.25 + ], + [ + 892, + 0.25 + ], + [ + 893, + 0.25 + ], + [ + 894, + 0.4 + ], + [ + 895, + 0.3 + ], + [ + 896, + 0.3 + ], + [ + 897, + 0.3 + ], + [ + 898, + 0.3 + ], + [ + 899, + 0.3 + ], + [ + 900, + 0.5 + ], + [ + 901, + 0.3 + ], + [ + 902, + 0.3 + ], + [ + 903, + 0.3 + ], + [ + 904, + 0.3 + ], + [ + 905, + 0.3 + ], + [ + 906, + 0.3 + ], + [ + 907, + 0.3 + ], + [ + 908, + 0.3 + ], + [ + 909, + 0.6 + ], + [ + 910, + 0.25 + ], + [ + 911, + 0.25 + ], + [ + 912, + 0.25 + ], + [ + 913, + 0.25 + ], + [ + 914, + 0.25 + ], + [ + 915, + 0.25 + ], + [ + 916, + 0.25 + ], + [ + 917, + 0.25 + ], + [ + 918, + 0.4 + ], + [ + 919, + 0.3 + ], + [ + 920, + 0.3 + ], + [ + 921, + 0.3 + ], + [ + 922, + 0.3 + ], + [ + 923, + 0.3 + ], + [ + 924, + 0.5 + ], + [ + 925, + 0.3 + ], + [ + 926, + 0.3 + ], + [ + 927, + 0.3 + ], + [ + 928, + 0.3 + ], + [ + 929, + 0.3 + ], + [ + 930, + 0.3 + ], + [ + 931, + 0.3 + ], + [ + 932, + 0.3 + ], + [ + 933, + 0.6 + ], + [ + 934, + 0.25 + ], + [ + 935, + 0.25 + ], + [ + 936, + 0.25 + ], + [ + 937, + 0.25 + ], + [ + 938, + 0.25 + ], + [ + 939, + 0.25 + ], + [ + 940, + 0.25 + ], + [ + 941, + 0.25 + ], + [ + 942, + 0.4 + ], + [ + 943, + 0.3 + ], + [ + 944, + 0.3 + ], + [ + 945, + 0.3 + ], + [ + 946, + 0.3 + ], + [ + 947, + 0.3 + ], + [ + 948, + 0.5 + ], + [ + 949, + 0.3 + ], + [ + 950, + 0.3 + ], + [ + 951, + 0.3 + ], + [ + 952, + 0.3 + ], + [ + 953, + 0.3 + ], + [ + 954, + 0.3 + ], + [ + 955, + 0.3 + ], + [ + 956, + 0.3 + ], + [ + 957, + 0.6 + ], + [ + 958, + 0.25 + ], + [ + 959, + 0.25 + ], + [ + 960, + 0.3 + ], + [ + 961, + 0.3 + ], + [ + 962, + 0.3 + ], + [ + 963, + 0.3 + ], + [ + 964, + 0.3 + ], + [ + 965, + 0.3 + ], + [ + 966, + 0.3 + ], + [ + 967, + 0.5 + ], + [ + 968, + 0.55 + ], + [ + 969, + 0.55 + ], + [ + 970, + 0.55 + ], + [ + 971, + 0.55 + ], + [ + 972, + 0.65 + ], + [ + 973, + 0.55 + ], + [ + 974, + 0.55 + ], + [ + 975, + 0.55 + ], + [ + 976, + 0.55 + ], + [ + 977, + 0.55 + ], + [ + 978, + 0.55 + ], + [ + 979, + 0.55 + ], + [ + 980, + 0.55 + ], + [ + 981, + 0.55 + ], + [ + 982, + 0.7 + ], + [ + 983, + 0.3 + ], + [ + 984, + 0.3 + ], + [ + 985, + 0.3 + ], + [ + 986, + 0.3 + ], + [ + 987, + 0.3 + ], + [ + 988, + 0.3 + ], + [ + 989, + 0.3 + ], + [ + 990, + 0.3 + ], + [ + 991, + 0.5 + ], + [ + 992, + 0.55 + ], + [ + 993, + 0.55 + ], + [ + 994, + 0.55 + ], + [ + 995, + 0.55 + ], + [ + 996, + 0.65 + ], + [ + 997, + 0.55 + ], + [ + 998, + 0.55 + ], + [ + 999, + 0.55 + ], + [ + 1000, + 0.55 + ], + [ + 1001, + 0.55 + ], + [ + 1002, + 0.55 + ], + [ + 1003, + 0.55 + ], + [ + 1004, + 0.55 + ], + [ + 1005, + 0.55 + ], + [ + 1006, + 0.7 + ], + [ + 1007, + 0.3 + ], + [ + 1008, + 0.25 + ], + [ + 1009, + 0.25 + ], + [ + 1010, + 0.25 + ], + [ + 1011, + 0.25 + ], + [ + 1012, + 0.25 + ], + [ + 1013, + 0.25 + ], + [ + 1014, + 0.4 + ], + [ + 1015, + 0.3 + ], + [ + 1016, + 0.3 + ], + [ + 1017, + 0.3 + ], + [ + 1018, + 0.3 + ], + [ + 1019, + 0.3 + ], + [ + 1020, + 0.5 + ], + [ + 1021, + 0.3 + ], + [ + 1022, + 0.3 + ], + [ + 1023, + 0.3 + ], + [ + 1024, + 0.3 + ], + [ + 1025, + 0.3 + ], + [ + 1026, + 0.3 + ], + [ + 1027, + 0.3 + ], + [ + 1028, + 0.3 + ], + [ + 1029, + 0.6 + ], + [ + 1030, + 0.25 + ], + [ + 1031, + 0.25 + ], + [ + 1032, + 0.25 + ], + [ + 1033, + 0.25 + ], + [ + 1034, + 0.25 + ], + [ + 1035, + 0.25 + ], + [ + 1036, + 0.25 + ], + [ + 1037, + 0.25 + ], + [ + 1038, + 0.4 + ], + [ + 1039, + 0.3 + ], + [ + 1040, + 0.3 + ], + [ + 1041, + 0.3 + ], + [ + 1042, + 0.3 + ], + [ + 1043, + 0.3 + ], + [ + 1044, + 0.5 + ], + [ + 1045, + 0.3 + ], + [ + 1046, + 0.3 + ], + [ + 1047, + 0.3 + ], + [ + 1048, + 0.3 + ], + [ + 1049, + 0.3 + ], + [ + 1050, + 0.3 + ], + [ + 1051, + 0.3 + ], + [ + 1052, + 0.3 + ], + [ + 1053, + 0.6 + ], + [ + 1054, + 0.25 + ], + [ + 1055, + 0.25 + ], + [ + 1056, + 0.25 + ], + [ + 1057, + 0.25 + ], + [ + 1058, + 0.25 + ], + [ + 1059, + 0.25 + ], + [ + 1060, + 0.25 + ], + [ + 1061, + 0.25 + ], + [ + 1062, + 0.4 + ], + [ + 1063, + 0.3 + ], + [ + 1064, + 0.3 + ], + [ + 1065, + 0.3 + ], + [ + 1066, + 0.3 + ], + [ + 1067, + 0.3 + ], + [ + 1068, + 0.5 + ], + [ + 1069, + 0.3 + ], + [ + 1070, + 0.3 + ], + [ + 1071, + 0.3 + ], + [ + 1072, + 0.3 + ], + [ + 1073, + 0.3 + ], + [ + 1074, + 0.3 + ], + [ + 1075, + 0.3 + ], + [ + 1076, + 0.3 + ], + [ + 1077, + 0.6 + ], + [ + 1078, + 0.25 + ], + [ + 1079, + 0.25 + ], + [ + 1080, + 0.25 + ], + [ + 1081, + 0.25 + ], + [ + 1082, + 0.25 + ], + [ + 1083, + 0.25 + ], + [ + 1084, + 0.25 + ], + [ + 1085, + 0.25 + ], + [ + 1086, + 0.4 + ], + [ + 1087, + 0.3 + ], + [ + 1088, + 0.3 + ], + [ + 1089, + 0.3 + ], + [ + 1090, + 0.3 + ], + [ + 1091, + 0.3 + ], + [ + 1092, + 0.5 + ], + [ + 1093, + 0.3 + ], + [ + 1094, + 0.3 + ], + [ + 1095, + 0.3 + ], + [ + 1096, + 0.3 + ], + [ + 1097, + 0.3 + ], + [ + 1098, + 0.3 + ], + [ + 1099, + 0.3 + ], + [ + 1100, + 0.3 + ], + [ + 1101, + 0.6 + ], + [ + 1102, + 0.25 + ], + [ + 1103, + 0.25 + ], + [ + 1104, + 0.25 + ], + [ + 1105, + 0.25 + ], + [ + 1106, + 0.25 + ], + [ + 1107, + 0.25 + ], + [ + 1108, + 0.25 + ], + [ + 1109, + 0.25 + ], + [ + 1110, + 0.4 + ], + [ + 1111, + 0.3 + ], + [ + 1112, + 0.3 + ], + [ + 1113, + 0.3 + ], + [ + 1114, + 0.3 + ], + [ + 1115, + 0.3 + ], + [ + 1116, + 0.5 + ], + [ + 1117, + 0.3 + ], + [ + 1118, + 0.3 + ], + [ + 1119, + 0.3 + ], + [ + 1120, + 0.3 + ], + [ + 1121, + 0.3 + ], + [ + 1122, + 0.3 + ], + [ + 1123, + 0.3 + ], + [ + 1124, + 0.3 + ], + [ + 1125, + 0.6 + ], + [ + 1126, + 0.25 + ], + [ + 1127, + 0.25 + ], + [ + 1128, + 0.3 + ], + [ + 1129, + 0.3 + ], + [ + 1130, + 0.3 + ], + [ + 1131, + 0.3 + ], + [ + 1132, + 0.3 + ], + [ + 1133, + 0.3 + ], + [ + 1134, + 0.3 + ], + [ + 1135, + 0.5 + ], + [ + 1136, + 0.55 + ], + [ + 1137, + 0.55 + ], + [ + 1138, + 0.55 + ], + [ + 1139, + 0.55 + ], + [ + 1140, + 0.65 + ], + [ + 1141, + 0.55 + ], + [ + 1142, + 0.55 + ], + [ + 1143, + 0.55 + ], + [ + 1144, + 0.55 + ], + [ + 1145, + 0.55 + ], + [ + 1146, + 0.55 + ], + [ + 1147, + 0.55 + ], + [ + 1148, + 0.55 + ], + [ + 1149, + 0.55 + ], + [ + 1150, + 0.7 + ], + [ + 1151, + 0.3 + ], + [ + 1152, + 0.3 + ], + [ + 1153, + 0.3 + ], + [ + 1154, + 0.3 + ], + [ + 1155, + 0.3 + ], + [ + 1156, + 0.3 + ], + [ + 1157, + 0.3 + ], + [ + 1158, + 0.3 + ], + [ + 1159, + 0.5 + ], + [ + 1160, + 0.55 + ], + [ + 1161, + 0.55 + ], + [ + 1162, + 0.55 + ], + [ + 1163, + 0.55 + ], + [ + 1164, + 0.65 + ], + [ + 1165, + 0.55 + ], + [ + 1166, + 0.55 + ], + [ + 1167, + 0.55 + ], + [ + 1168, + 0.55 + ], + [ + 1169, + 0.55 + ], + [ + 1170, + 0.55 + ], + [ + 1171, + 0.55 + ], + [ + 1172, + 0.55 + ], + [ + 1173, + 0.55 + ], + [ + 1174, + 0.7 + ], + [ + 1175, + 0.3 + ], + [ + 1176, + 0.25 + ], + [ + 1177, + 0.25 + ], + [ + 1178, + 0.25 + ], + [ + 1179, + 0.25 + ], + [ + 1180, + 0.25 + ], + [ + 1181, + 0.25 + ], + [ + 1182, + 0.4 + ], + [ + 1183, + 0.3 + ], + [ + 1184, + 0.3 + ], + [ + 1185, + 0.3 + ], + [ + 1186, + 0.3 + ], + [ + 1187, + 0.3 + ], + [ + 1188, + 0.5 + ], + [ + 1189, + 0.3 + ], + [ + 1190, + 0.3 + ], + [ + 1191, + 0.3 + ], + [ + 1192, + 0.3 + ], + [ + 1193, + 0.3 + ], + [ + 1194, + 0.3 + ], + [ + 1195, + 0.3 + ], + [ + 1196, + 0.3 + ], + [ + 1197, + 0.6 + ], + [ + 1198, + 0.25 + ], + [ + 1199, + 0.25 + ], + [ + 1200, + 0.25 + ], + [ + 1201, + 0.25 + ], + [ + 1202, + 0.25 + ], + [ + 1203, + 0.25 + ], + [ + 1204, + 0.25 + ], + [ + 1205, + 0.25 + ], + [ + 1206, + 0.4 + ], + [ + 1207, + 0.3 + ], + [ + 1208, + 0.3 + ], + [ + 1209, + 0.3 + ], + [ + 1210, + 0.3 + ], + [ + 1211, + 0.3 + ], + [ + 1212, + 0.5 + ], + [ + 1213, + 0.3 + ], + [ + 1214, + 0.3 + ], + [ + 1215, + 0.3 + ], + [ + 1216, + 0.3 + ], + [ + 1217, + 0.3 + ], + [ + 1218, + 0.3 + ], + [ + 1219, + 0.3 + ], + [ + 1220, + 0.3 + ], + [ + 1221, + 0.6 + ], + [ + 1222, + 0.25 + ], + [ + 1223, + 0.25 + ], + [ + 1224, + 0.25 + ], + [ + 1225, + 0.25 + ], + [ + 1226, + 0.25 + ], + [ + 1227, + 0.25 + ], + [ + 1228, + 0.25 + ], + [ + 1229, + 0.25 + ], + [ + 1230, + 0.4 + ], + [ + 1231, + 0.3 + ], + [ + 1232, + 0.3 + ], + [ + 1233, + 0.3 + ], + [ + 1234, + 0.3 + ], + [ + 1235, + 0.3 + ], + [ + 1236, + 0.5 + ], + [ + 1237, + 0.3 + ], + [ + 1238, + 0.3 + ], + [ + 1239, + 0.3 + ], + [ + 1240, + 0.3 + ], + [ + 1241, + 0.3 + ], + [ + 1242, + 0.3 + ], + [ + 1243, + 0.3 + ], + [ + 1244, + 0.3 + ], + [ + 1245, + 0.6 + ], + [ + 1246, + 0.25 + ], + [ + 1247, + 0.25 + ], + [ + 1248, + 0.25 + ], + [ + 1249, + 0.25 + ], + [ + 1250, + 0.25 + ], + [ + 1251, + 0.25 + ], + [ + 1252, + 0.25 + ], + [ + 1253, + 0.25 + ], + [ + 1254, + 0.4 + ], + [ + 1255, + 0.3 + ], + [ + 1256, + 0.3 + ], + [ + 1257, + 0.3 + ], + [ + 1258, + 0.3 + ], + [ + 1259, + 0.3 + ], + [ + 1260, + 0.5 + ], + [ + 1261, + 0.3 + ], + [ + 1262, + 0.3 + ], + [ + 1263, + 0.3 + ], + [ + 1264, + 0.3 + ], + [ + 1265, + 0.3 + ], + [ + 1266, + 0.3 + ], + [ + 1267, + 0.3 + ], + [ + 1268, + 0.3 + ], + [ + 1269, + 0.6 + ], + [ + 1270, + 0.25 + ], + [ + 1271, + 0.25 + ], + [ + 1272, + 0.25 + ], + [ + 1273, + 0.25 + ], + [ + 1274, + 0.25 + ], + [ + 1275, + 0.25 + ], + [ + 1276, + 0.25 + ], + [ + 1277, + 0.25 + ], + [ + 1278, + 0.4 + ], + [ + 1279, + 0.3 + ], + [ + 1280, + 0.3 + ], + [ + 1281, + 0.3 + ], + [ + 1282, + 0.3 + ], + [ + 1283, + 0.3 + ], + [ + 1284, + 0.5 + ], + [ + 1285, + 0.3 + ], + [ + 1286, + 0.3 + ], + [ + 1287, + 0.3 + ], + [ + 1288, + 0.3 + ], + [ + 1289, + 0.3 + ], + [ + 1290, + 0.3 + ], + [ + 1291, + 0.3 + ], + [ + 1292, + 0.3 + ], + [ + 1293, + 0.6 + ], + [ + 1294, + 0.25 + ], + [ + 1295, + 0.25 + ], + [ + 1296, + 0.3 + ], + [ + 1297, + 0.3 + ], + [ + 1298, + 0.3 + ], + [ + 1299, + 0.3 + ], + [ + 1300, + 0.3 + ], + [ + 1301, + 0.3 + ], + [ + 1302, + 0.3 + ], + [ + 1303, + 0.5 + ], + [ + 1304, + 0.55 + ], + [ + 1305, + 0.55 + ], + [ + 1306, + 0.55 + ], + [ + 1307, + 0.55 + ], + [ + 1308, + 0.65 + ], + [ + 1309, + 0.55 + ], + [ + 1310, + 0.55 + ], + [ + 1311, + 0.55 + ], + [ + 1312, + 0.55 + ], + [ + 1313, + 0.55 + ], + [ + 1314, + 0.55 + ], + [ + 1315, + 0.55 + ], + [ + 1316, + 0.55 + ], + [ + 1317, + 0.55 + ], + [ + 1318, + 0.7 + ], + [ + 1319, + 0.3 + ], + [ + 1320, + 0.3 + ], + [ + 1321, + 0.3 + ], + [ + 1322, + 0.3 + ], + [ + 1323, + 0.3 + ], + [ + 1324, + 0.3 + ], + [ + 1325, + 0.3 + ], + [ + 1326, + 0.3 + ], + [ + 1327, + 0.5 + ], + [ + 1328, + 0.55 + ], + [ + 1329, + 0.55 + ], + [ + 1330, + 0.55 + ], + [ + 1331, + 0.55 + ], + [ + 1332, + 0.65 + ], + [ + 1333, + 0.55 + ], + [ + 1334, + 0.55 + ], + [ + 1335, + 0.55 + ], + [ + 1336, + 0.55 + ], + [ + 1337, + 0.55 + ], + [ + 1338, + 0.55 + ], + [ + 1339, + 0.55 + ], + [ + 1340, + 0.55 + ], + [ + 1341, + 0.55 + ], + [ + 1342, + 0.7 + ], + [ + 1343, + 0.3 + ], + [ + 1344, + 0.25 + ], + [ + 1345, + 0.25 + ], + [ + 1346, + 0.25 + ], + [ + 1347, + 0.25 + ], + [ + 1348, + 0.25 + ], + [ + 1349, + 0.25 + ], + [ + 1350, + 0.4 + ], + [ + 1351, + 0.3 + ], + [ + 1352, + 0.3 + ], + [ + 1353, + 0.3 + ], + [ + 1354, + 0.3 + ], + [ + 1355, + 0.3 + ], + [ + 1356, + 0.5 + ], + [ + 1357, + 0.3 + ], + [ + 1358, + 0.3 + ], + [ + 1359, + 0.3 + ], + [ + 1360, + 0.3 + ], + [ + 1361, + 0.3 + ], + [ + 1362, + 0.3 + ], + [ + 1363, + 0.3 + ], + [ + 1364, + 0.3 + ], + [ + 1365, + 0.6 + ], + [ + 1366, + 0.25 + ], + [ + 1367, + 0.25 + ], + [ + 1368, + 0.25 + ], + [ + 1369, + 0.25 + ], + [ + 1370, + 0.25 + ], + [ + 1371, + 0.25 + ], + [ + 1372, + 0.25 + ], + [ + 1373, + 0.25 + ], + [ + 1374, + 0.4 + ], + [ + 1375, + 0.3 + ], + [ + 1376, + 0.3 + ], + [ + 1377, + 0.3 + ], + [ + 1378, + 0.3 + ], + [ + 1379, + 0.3 + ], + [ + 1380, + 0.5 + ], + [ + 1381, + 0.3 + ], + [ + 1382, + 0.3 + ], + [ + 1383, + 0.3 + ], + [ + 1384, + 0.3 + ], + [ + 1385, + 0.3 + ], + [ + 1386, + 0.3 + ], + [ + 1387, + 0.3 + ], + [ + 1388, + 0.3 + ], + [ + 1389, + 0.6 + ], + [ + 1390, + 0.25 + ], + [ + 1391, + 0.25 + ], + [ + 1392, + 0.25 + ], + [ + 1393, + 0.25 + ], + [ + 1394, + 0.25 + ], + [ + 1395, + 0.25 + ], + [ + 1396, + 0.25 + ], + [ + 1397, + 0.25 + ], + [ + 1398, + 0.4 + ], + [ + 1399, + 0.3 + ], + [ + 1400, + 0.3 + ], + [ + 1401, + 0.3 + ], + [ + 1402, + 0.3 + ], + [ + 1403, + 0.3 + ], + [ + 1404, + 0.5 + ], + [ + 1405, + 0.3 + ], + [ + 1406, + 0.3 + ], + [ + 1407, + 0.3 + ], + [ + 1408, + 0.3 + ], + [ + 1409, + 0.3 + ], + [ + 1410, + 0.3 + ], + [ + 1411, + 0.3 + ], + [ + 1412, + 0.3 + ], + [ + 1413, + 0.6 + ], + [ + 1414, + 0.25 + ], + [ + 1415, + 0.25 + ], + [ + 1416, + 0.25 + ], + [ + 1417, + 0.25 + ], + [ + 1418, + 0.25 + ], + [ + 1419, + 0.25 + ], + [ + 1420, + 0.25 + ], + [ + 1421, + 0.25 + ], + [ + 1422, + 0.4 + ], + [ + 1423, + 0.3 + ], + [ + 1424, + 0.3 + ], + [ + 1425, + 0.3 + ], + [ + 1426, + 0.3 + ], + [ + 1427, + 0.3 + ], + [ + 1428, + 0.5 + ], + [ + 1429, + 0.3 + ], + [ + 1430, + 0.3 + ], + [ + 1431, + 0.3 + ], + [ + 1432, + 0.3 + ], + [ + 1433, + 0.3 + ], + [ + 1434, + 0.3 + ], + [ + 1435, + 0.3 + ], + [ + 1436, + 0.3 + ], + [ + 1437, + 0.6 + ], + [ + 1438, + 0.25 + ], + [ + 1439, + 0.25 + ], + [ + 1440, + 0.25 + ], + [ + 1441, + 0.25 + ], + [ + 1442, + 0.25 + ], + [ + 1443, + 0.25 + ], + [ + 1444, + 0.25 + ], + [ + 1445, + 0.25 + ], + [ + 1446, + 0.4 + ], + [ + 1447, + 0.3 + ], + [ + 1448, + 0.3 + ], + [ + 1449, + 0.3 + ], + [ + 1450, + 0.3 + ], + [ + 1451, + 0.3 + ], + [ + 1452, + 0.5 + ], + [ + 1453, + 0.3 + ], + [ + 1454, + 0.3 + ], + [ + 1455, + 0.3 + ], + [ + 1456, + 0.3 + ], + [ + 1457, + 0.3 + ], + [ + 1458, + 0.3 + ], + [ + 1459, + 0.3 + ], + [ + 1460, + 0.3 + ], + [ + 1461, + 0.6 + ], + [ + 1462, + 0.25 + ], + [ + 1463, + 0.25 + ], + [ + 1464, + 0.3 + ], + [ + 1465, + 0.3 + ], + [ + 1466, + 0.3 + ], + [ + 1467, + 0.3 + ], + [ + 1468, + 0.3 + ], + [ + 1469, + 0.3 + ], + [ + 1470, + 0.3 + ], + [ + 1471, + 0.5 + ], + [ + 1472, + 0.55 + ], + [ + 1473, + 0.55 + ], + [ + 1474, + 0.55 + ], + [ + 1475, + 0.55 + ], + [ + 1476, + 0.65 + ], + [ + 1477, + 0.55 + ], + [ + 1478, + 0.55 + ], + [ + 1479, + 0.55 + ], + [ + 1480, + 0.55 + ], + [ + 1481, + 0.55 + ], + [ + 1482, + 0.55 + ], + [ + 1483, + 0.55 + ], + [ + 1484, + 0.55 + ], + [ + 1485, + 0.55 + ], + [ + 1486, + 0.7 + ], + [ + 1487, + 0.3 + ], + [ + 1488, + 0.3 + ], + [ + 1489, + 0.3 + ], + [ + 1490, + 0.3 + ], + [ + 1491, + 0.3 + ], + [ + 1492, + 0.3 + ], + [ + 1493, + 0.3 + ], + [ + 1494, + 0.3 + ], + [ + 1495, + 0.5 + ], + [ + 1496, + 0.55 + ], + [ + 1497, + 0.55 + ], + [ + 1498, + 0.55 + ], + [ + 1499, + 0.55 + ], + [ + 1500, + 0.65 + ], + [ + 1501, + 0.55 + ], + [ + 1502, + 0.55 + ], + [ + 1503, + 0.55 + ], + [ + 1504, + 0.55 + ], + [ + 1505, + 0.55 + ], + [ + 1506, + 0.55 + ], + [ + 1507, + 0.55 + ], + [ + 1508, + 0.55 + ], + [ + 1509, + 0.55 + ], + [ + 1510, + 0.7 + ], + [ + 1511, + 0.3 + ], + [ + 1512, + 0.25 + ], + [ + 1513, + 0.25 + ], + [ + 1514, + 0.25 + ], + [ + 1515, + 0.25 + ], + [ + 1516, + 0.25 + ], + [ + 1517, + 0.25 + ], + [ + 1518, + 0.4 + ], + [ + 1519, + 0.3 + ], + [ + 1520, + 0.3 + ], + [ + 1521, + 0.3 + ], + [ + 1522, + 0.3 + ], + [ + 1523, + 0.3 + ], + [ + 1524, + 0.5 + ], + [ + 1525, + 0.3 + ], + [ + 1526, + 0.3 + ], + [ + 1527, + 0.3 + ], + [ + 1528, + 0.3 + ], + [ + 1529, + 0.3 + ], + [ + 1530, + 0.3 + ], + [ + 1531, + 0.3 + ], + [ + 1532, + 0.3 + ], + [ + 1533, + 0.6 + ], + [ + 1534, + 0.25 + ], + [ + 1535, + 0.25 + ], + [ + 1536, + 0.25 + ], + [ + 1537, + 0.25 + ], + [ + 1538, + 0.25 + ], + [ + 1539, + 0.25 + ], + [ + 1540, + 0.25 + ], + [ + 1541, + 0.25 + ], + [ + 1542, + 0.4 + ], + [ + 1543, + 0.3 + ], + [ + 1544, + 0.3 + ], + [ + 1545, + 0.3 + ], + [ + 1546, + 0.3 + ], + [ + 1547, + 0.3 + ], + [ + 1548, + 0.5 + ], + [ + 1549, + 0.3 + ], + [ + 1550, + 0.3 + ], + [ + 1551, + 0.3 + ], + [ + 1552, + 0.3 + ], + [ + 1553, + 0.3 + ], + [ + 1554, + 0.3 + ], + [ + 1555, + 0.3 + ], + [ + 1556, + 0.3 + ], + [ + 1557, + 0.6 + ], + [ + 1558, + 0.25 + ], + [ + 1559, + 0.25 + ], + [ + 1560, + 0.25 + ], + [ + 1561, + 0.25 + ], + [ + 1562, + 0.25 + ], + [ + 1563, + 0.25 + ], + [ + 1564, + 0.25 + ], + [ + 1565, + 0.25 + ], + [ + 1566, + 0.4 + ], + [ + 1567, + 0.3 + ], + [ + 1568, + 0.3 + ], + [ + 1569, + 0.3 + ], + [ + 1570, + 0.3 + ], + [ + 1571, + 0.3 + ], + [ + 1572, + 0.5 + ], + [ + 1573, + 0.3 + ], + [ + 1574, + 0.3 + ], + [ + 1575, + 0.3 + ], + [ + 1576, + 0.3 + ], + [ + 1577, + 0.3 + ], + [ + 1578, + 0.3 + ], + [ + 1579, + 0.3 + ], + [ + 1580, + 0.3 + ], + [ + 1581, + 0.6 + ], + [ + 1582, + 0.25 + ], + [ + 1583, + 0.25 + ], + [ + 1584, + 0.25 + ], + [ + 1585, + 0.25 + ], + [ + 1586, + 0.25 + ], + [ + 1587, + 0.25 + ], + [ + 1588, + 0.25 + ], + [ + 1589, + 0.25 + ], + [ + 1590, + 0.4 + ], + [ + 1591, + 0.3 + ], + [ + 1592, + 0.3 + ], + [ + 1593, + 0.3 + ], + [ + 1594, + 0.3 + ], + [ + 1595, + 0.3 + ], + [ + 1596, + 0.5 + ], + [ + 1597, + 0.3 + ], + [ + 1598, + 0.3 + ], + [ + 1599, + 0.3 + ], + [ + 1600, + 0.3 + ], + [ + 1601, + 0.3 + ], + [ + 1602, + 0.3 + ], + [ + 1603, + 0.3 + ], + [ + 1604, + 0.3 + ], + [ + 1605, + 0.6 + ], + [ + 1606, + 0.25 + ], + [ + 1607, + 0.25 + ], + [ + 1608, + 0.25 + ], + [ + 1609, + 0.25 + ], + [ + 1610, + 0.25 + ], + [ + 1611, + 0.25 + ], + [ + 1612, + 0.25 + ], + [ + 1613, + 0.25 + ], + [ + 1614, + 0.4 + ], + [ + 1615, + 0.3 + ], + [ + 1616, + 0.3 + ], + [ + 1617, + 0.3 + ], + [ + 1618, + 0.3 + ], + [ + 1619, + 0.3 + ], + [ + 1620, + 0.5 + ], + [ + 1621, + 0.3 + ], + [ + 1622, + 0.3 + ], + [ + 1623, + 0.3 + ], + [ + 1624, + 0.3 + ], + [ + 1625, + 0.3 + ], + [ + 1626, + 0.3 + ], + [ + 1627, + 0.3 + ], + [ + 1628, + 0.3 + ], + [ + 1629, + 0.6 + ], + [ + 1630, + 0.25 + ], + [ + 1631, + 0.25 + ], + [ + 1632, + 0.3 + ], + [ + 1633, + 0.3 + ], + [ + 1634, + 0.3 + ], + [ + 1635, + 0.3 + ], + [ + 1636, + 0.3 + ], + [ + 1637, + 0.3 + ], + [ + 1638, + 0.3 + ], + [ + 1639, + 0.5 + ], + [ + 1640, + 0.55 + ], + [ + 1641, + 0.55 + ], + [ + 1642, + 0.55 + ], + [ + 1643, + 0.55 + ], + [ + 1644, + 0.65 + ], + [ + 1645, + 0.55 + ], + [ + 1646, + 0.55 + ], + [ + 1647, + 0.55 + ], + [ + 1648, + 0.55 + ], + [ + 1649, + 0.55 + ], + [ + 1650, + 0.55 + ], + [ + 1651, + 0.55 + ], + [ + 1652, + 0.55 + ], + [ + 1653, + 0.55 + ], + [ + 1654, + 0.7 + ], + [ + 1655, + 0.3 + ], + [ + 1656, + 0.3 + ], + [ + 1657, + 0.3 + ], + [ + 1658, + 0.3 + ], + [ + 1659, + 0.3 + ], + [ + 1660, + 0.3 + ], + [ + 1661, + 0.3 + ], + [ + 1662, + 0.3 + ], + [ + 1663, + 0.5 + ], + [ + 1664, + 0.55 + ], + [ + 1665, + 0.55 + ], + [ + 1666, + 0.55 + ], + [ + 1667, + 0.55 + ], + [ + 1668, + 0.65 + ], + [ + 1669, + 0.55 + ], + [ + 1670, + 0.55 + ], + [ + 1671, + 0.55 + ], + [ + 1672, + 0.55 + ], + [ + 1673, + 0.55 + ], + [ + 1674, + 0.55 + ], + [ + 1675, + 0.55 + ], + [ + 1676, + 0.55 + ], + [ + 1677, + 0.55 + ], + [ + 1678, + 0.7 + ], + [ + 1679, + 0.3 + ], + [ + 1680, + 0.25 + ], + [ + 1681, + 0.25 + ], + [ + 1682, + 0.25 + ], + [ + 1683, + 0.25 + ], + [ + 1684, + 0.25 + ], + [ + 1685, + 0.25 + ], + [ + 1686, + 0.4 + ], + [ + 1687, + 0.3 + ], + [ + 1688, + 0.3 + ], + [ + 1689, + 0.3 + ], + [ + 1690, + 0.3 + ], + [ + 1691, + 0.3 + ], + [ + 1692, + 0.5 + ], + [ + 1693, + 0.3 + ], + [ + 1694, + 0.3 + ], + [ + 1695, + 0.3 + ], + [ + 1696, + 0.3 + ], + [ + 1697, + 0.3 + ], + [ + 1698, + 0.3 + ], + [ + 1699, + 0.3 + ], + [ + 1700, + 0.3 + ], + [ + 1701, + 0.6 + ], + [ + 1702, + 0.25 + ], + [ + 1703, + 0.25 + ], + [ + 1704, + 0.25 + ], + [ + 1705, + 0.25 + ], + [ + 1706, + 0.25 + ], + [ + 1707, + 0.25 + ], + [ + 1708, + 0.25 + ], + [ + 1709, + 0.25 + ], + [ + 1710, + 0.4 + ], + [ + 1711, + 0.3 + ], + [ + 1712, + 0.3 + ], + [ + 1713, + 0.3 + ], + [ + 1714, + 0.3 + ], + [ + 1715, + 0.3 + ], + [ + 1716, + 0.5 + ], + [ + 1717, + 0.3 + ], + [ + 1718, + 0.3 + ], + [ + 1719, + 0.3 + ], + [ + 1720, + 0.3 + ], + [ + 1721, + 0.3 + ], + [ + 1722, + 0.3 + ], + [ + 1723, + 0.3 + ], + [ + 1724, + 0.3 + ], + [ + 1725, + 0.6 + ], + [ + 1726, + 0.25 + ], + [ + 1727, + 0.25 + ], + [ + 1728, + 0.25 + ], + [ + 1729, + 0.25 + ], + [ + 1730, + 0.25 + ], + [ + 1731, + 0.25 + ], + [ + 1732, + 0.25 + ], + [ + 1733, + 0.25 + ], + [ + 1734, + 0.4 + ], + [ + 1735, + 0.3 + ], + [ + 1736, + 0.3 + ], + [ + 1737, + 0.3 + ], + [ + 1738, + 0.3 + ], + [ + 1739, + 0.3 + ], + [ + 1740, + 0.5 + ], + [ + 1741, + 0.3 + ], + [ + 1742, + 0.3 + ], + [ + 1743, + 0.3 + ], + [ + 1744, + 0.3 + ], + [ + 1745, + 0.3 + ], + [ + 1746, + 0.3 + ], + [ + 1747, + 0.3 + ], + [ + 1748, + 0.3 + ], + [ + 1749, + 0.6 + ], + [ + 1750, + 0.25 + ], + [ + 1751, + 0.25 + ], + [ + 1752, + 0.25 + ], + [ + 1753, + 0.25 + ], + [ + 1754, + 0.25 + ], + [ + 1755, + 0.25 + ], + [ + 1756, + 0.25 + ], + [ + 1757, + 0.25 + ], + [ + 1758, + 0.4 + ], + [ + 1759, + 0.3 + ], + [ + 1760, + 0.3 + ], + [ + 1761, + 0.3 + ], + [ + 1762, + 0.3 + ], + [ + 1763, + 0.3 + ], + [ + 1764, + 0.5 + ], + [ + 1765, + 0.3 + ], + [ + 1766, + 0.3 + ], + [ + 1767, + 0.3 + ], + [ + 1768, + 0.3 + ], + [ + 1769, + 0.3 + ], + [ + 1770, + 0.3 + ], + [ + 1771, + 0.3 + ], + [ + 1772, + 0.3 + ], + [ + 1773, + 0.6 + ], + [ + 1774, + 0.25 + ], + [ + 1775, + 0.25 + ], + [ + 1776, + 0.25 + ], + [ + 1777, + 0.25 + ], + [ + 1778, + 0.25 + ], + [ + 1779, + 0.25 + ], + [ + 1780, + 0.25 + ], + [ + 1781, + 0.25 + ], + [ + 1782, + 0.4 + ], + [ + 1783, + 0.3 + ], + [ + 1784, + 0.3 + ], + [ + 1785, + 0.3 + ], + [ + 1786, + 0.3 + ], + [ + 1787, + 0.3 + ], + [ + 1788, + 0.5 + ], + [ + 1789, + 0.3 + ], + [ + 1790, + 0.3 + ], + [ + 1791, + 0.3 + ], + [ + 1792, + 0.3 + ], + [ + 1793, + 0.3 + ], + [ + 1794, + 0.3 + ], + [ + 1795, + 0.3 + ], + [ + 1796, + 0.3 + ], + [ + 1797, + 0.6 + ], + [ + 1798, + 0.25 + ], + [ + 1799, + 0.25 + ], + [ + 1800, + 0.3 + ], + [ + 1801, + 0.3 + ], + [ + 1802, + 0.3 + ], + [ + 1803, + 0.3 + ], + [ + 1804, + 0.3 + ], + [ + 1805, + 0.3 + ], + [ + 1806, + 0.3 + ], + [ + 1807, + 0.5 + ], + [ + 1808, + 0.55 + ], + [ + 1809, + 0.55 + ], + [ + 1810, + 0.55 + ], + [ + 1811, + 0.55 + ], + [ + 1812, + 0.65 + ], + [ + 1813, + 0.55 + ], + [ + 1814, + 0.55 + ], + [ + 1815, + 0.55 + ], + [ + 1816, + 0.55 + ], + [ + 1817, + 0.55 + ], + [ + 1818, + 0.55 + ], + [ + 1819, + 0.55 + ], + [ + 1820, + 0.55 + ], + [ + 1821, + 0.55 + ], + [ + 1822, + 0.7 + ], + [ + 1823, + 0.3 + ], + [ + 1824, + 0.3 + ], + [ + 1825, + 0.3 + ], + [ + 1826, + 0.3 + ], + [ + 1827, + 0.3 + ], + [ + 1828, + 0.3 + ], + [ + 1829, + 0.3 + ], + [ + 1830, + 0.3 + ], + [ + 1831, + 0.5 + ], + [ + 1832, + 0.55 + ], + [ + 1833, + 0.55 + ], + [ + 1834, + 0.55 + ], + [ + 1835, + 0.55 + ], + [ + 1836, + 0.65 + ], + [ + 1837, + 0.55 + ], + [ + 1838, + 0.55 + ], + [ + 1839, + 0.55 + ], + [ + 1840, + 0.55 + ], + [ + 1841, + 0.55 + ], + [ + 1842, + 0.55 + ], + [ + 1843, + 0.55 + ], + [ + 1844, + 0.55 + ], + [ + 1845, + 0.55 + ], + [ + 1846, + 0.7 + ], + [ + 1847, + 0.3 + ], + [ + 1848, + 0.25 + ], + [ + 1849, + 0.25 + ], + [ + 1850, + 0.25 + ], + [ + 1851, + 0.25 + ], + [ + 1852, + 0.25 + ], + [ + 1853, + 0.25 + ], + [ + 1854, + 0.4 + ], + [ + 1855, + 0.3 + ], + [ + 1856, + 0.3 + ], + [ + 1857, + 0.3 + ], + [ + 1858, + 0.3 + ], + [ + 1859, + 0.3 + ], + [ + 1860, + 0.5 + ], + [ + 1861, + 0.3 + ], + [ + 1862, + 0.3 + ], + [ + 1863, + 0.3 + ], + [ + 1864, + 0.3 + ], + [ + 1865, + 0.3 + ], + [ + 1866, + 0.3 + ], + [ + 1867, + 0.3 + ], + [ + 1868, + 0.3 + ], + [ + 1869, + 0.6 + ], + [ + 1870, + 0.25 + ], + [ + 1871, + 0.25 + ], + [ + 1872, + 0.25 + ], + [ + 1873, + 0.25 + ], + [ + 1874, + 0.25 + ], + [ + 1875, + 0.25 + ], + [ + 1876, + 0.25 + ], + [ + 1877, + 0.25 + ], + [ + 1878, + 0.4 + ], + [ + 1879, + 0.3 + ], + [ + 1880, + 0.3 + ], + [ + 1881, + 0.3 + ], + [ + 1882, + 0.3 + ], + [ + 1883, + 0.3 + ], + [ + 1884, + 0.5 + ], + [ + 1885, + 0.3 + ], + [ + 1886, + 0.3 + ], + [ + 1887, + 0.3 + ], + [ + 1888, + 0.3 + ], + [ + 1889, + 0.3 + ], + [ + 1890, + 0.3 + ], + [ + 1891, + 0.3 + ], + [ + 1892, + 0.3 + ], + [ + 1893, + 0.6 + ], + [ + 1894, + 0.25 + ], + [ + 1895, + 0.25 + ], + [ + 1896, + 0.25 + ], + [ + 1897, + 0.25 + ], + [ + 1898, + 0.25 + ], + [ + 1899, + 0.25 + ], + [ + 1900, + 0.25 + ], + [ + 1901, + 0.25 + ], + [ + 1902, + 0.4 + ], + [ + 1903, + 0.3 + ], + [ + 1904, + 0.3 + ], + [ + 1905, + 0.3 + ], + [ + 1906, + 0.3 + ], + [ + 1907, + 0.3 + ], + [ + 1908, + 0.5 + ], + [ + 1909, + 0.3 + ], + [ + 1910, + 0.3 + ], + [ + 1911, + 0.3 + ], + [ + 1912, + 0.3 + ], + [ + 1913, + 0.3 + ], + [ + 1914, + 0.3 + ], + [ + 1915, + 0.3 + ], + [ + 1916, + 0.3 + ], + [ + 1917, + 0.6 + ], + [ + 1918, + 0.25 + ], + [ + 1919, + 0.25 + ], + [ + 1920, + 0.25 + ], + [ + 1921, + 0.25 + ], + [ + 1922, + 0.25 + ], + [ + 1923, + 0.25 + ], + [ + 1924, + 0.25 + ], + [ + 1925, + 0.25 + ], + [ + 1926, + 0.4 + ], + [ + 1927, + 0.3 + ], + [ + 1928, + 0.3 + ], + [ + 1929, + 0.3 + ], + [ + 1930, + 0.3 + ], + [ + 1931, + 0.3 + ], + [ + 1932, + 0.5 + ], + [ + 1933, + 0.3 + ], + [ + 1934, + 0.3 + ], + [ + 1935, + 0.3 + ], + [ + 1936, + 0.3 + ], + [ + 1937, + 0.3 + ], + [ + 1938, + 0.3 + ], + [ + 1939, + 0.3 + ], + [ + 1940, + 0.3 + ], + [ + 1941, + 0.6 + ], + [ + 1942, + 0.25 + ], + [ + 1943, + 0.25 + ], + [ + 1944, + 0.25 + ], + [ + 1945, + 0.25 + ], + [ + 1946, + 0.25 + ], + [ + 1947, + 0.25 + ], + [ + 1948, + 0.25 + ], + [ + 1949, + 0.25 + ], + [ + 1950, + 0.4 + ], + [ + 1951, + 0.3 + ], + [ + 1952, + 0.3 + ], + [ + 1953, + 0.3 + ], + [ + 1954, + 0.3 + ], + [ + 1955, + 0.3 + ], + [ + 1956, + 0.5 + ], + [ + 1957, + 0.3 + ], + [ + 1958, + 0.3 + ], + [ + 1959, + 0.3 + ], + [ + 1960, + 0.3 + ], + [ + 1961, + 0.3 + ], + [ + 1962, + 0.3 + ], + [ + 1963, + 0.3 + ], + [ + 1964, + 0.3 + ], + [ + 1965, + 0.6 + ], + [ + 1966, + 0.25 + ], + [ + 1967, + 0.25 + ], + [ + 1968, + 0.3 + ], + [ + 1969, + 0.3 + ], + [ + 1970, + 0.3 + ], + [ + 1971, + 0.3 + ], + [ + 1972, + 0.3 + ], + [ + 1973, + 0.3 + ], + [ + 1974, + 0.3 + ], + [ + 1975, + 0.5 + ], + [ + 1976, + 0.55 + ], + [ + 1977, + 0.55 + ], + [ + 1978, + 0.55 + ], + [ + 1979, + 0.55 + ], + [ + 1980, + 0.65 + ], + [ + 1981, + 0.55 + ], + [ + 1982, + 0.55 + ], + [ + 1983, + 0.55 + ], + [ + 1984, + 0.55 + ], + [ + 1985, + 0.55 + ], + [ + 1986, + 0.55 + ], + [ + 1987, + 0.55 + ], + [ + 1988, + 0.55 + ], + [ + 1989, + 0.55 + ], + [ + 1990, + 0.7 + ], + [ + 1991, + 0.3 + ], + [ + 1992, + 0.3 + ], + [ + 1993, + 0.3 + ], + [ + 1994, + 0.3 + ], + [ + 1995, + 0.3 + ], + [ + 1996, + 0.3 + ], + [ + 1997, + 0.3 + ], + [ + 1998, + 0.3 + ], + [ + 1999, + 0.5 + ], + [ + 2000, + 0.55 + ], + [ + 2001, + 0.55 + ], + [ + 2002, + 0.55 + ], + [ + 2003, + 0.55 + ], + [ + 2004, + 0.65 + ], + [ + 2005, + 0.55 + ], + [ + 2006, + 0.55 + ], + [ + 2007, + 0.55 + ], + [ + 2008, + 0.55 + ], + [ + 2009, + 0.55 + ], + [ + 2010, + 0.55 + ], + [ + 2011, + 0.55 + ], + [ + 2012, + 0.55 + ], + [ + 2013, + 0.55 + ], + [ + 2014, + 0.7 + ], + [ + 2015, + 0.3 + ], + [ + 2016, + 0.25 + ], + [ + 2017, + 0.25 + ], + [ + 2018, + 0.25 + ], + [ + 2019, + 0.25 + ], + [ + 2020, + 0.25 + ], + [ + 2021, + 0.25 + ], + [ + 2022, + 0.4 + ], + [ + 2023, + 0.3 + ], + [ + 2024, + 0.3 + ], + [ + 2025, + 0.3 + ], + [ + 2026, + 0.3 + ], + [ + 2027, + 0.3 + ], + [ + 2028, + 0.5 + ], + [ + 2029, + 0.3 + ], + [ + 2030, + 0.3 + ], + [ + 2031, + 0.3 + ], + [ + 2032, + 0.3 + ], + [ + 2033, + 0.3 + ], + [ + 2034, + 0.3 + ], + [ + 2035, + 0.3 + ], + [ + 2036, + 0.3 + ], + [ + 2037, + 0.6 + ], + [ + 2038, + 0.25 + ], + [ + 2039, + 0.25 + ], + [ + 2040, + 0.25 + ], + [ + 2041, + 0.25 + ], + [ + 2042, + 0.25 + ], + [ + 2043, + 0.25 + ], + [ + 2044, + 0.25 + ], + [ + 2045, + 0.25 + ], + [ + 2046, + 0.4 + ], + [ + 2047, + 0.3 + ], + [ + 2048, + 0.3 + ], + [ + 2049, + 0.3 + ], + [ + 2050, + 0.3 + ], + [ + 2051, + 0.3 + ], + [ + 2052, + 0.5 + ], + [ + 2053, + 0.3 + ], + [ + 2054, + 0.3 + ], + [ + 2055, + 0.3 + ], + [ + 2056, + 0.3 + ], + [ + 2057, + 0.3 + ], + [ + 2058, + 0.3 + ], + [ + 2059, + 0.3 + ], + [ + 2060, + 0.3 + ], + [ + 2061, + 0.6 + ], + [ + 2062, + 0.25 + ], + [ + 2063, + 0.25 + ], + [ + 2064, + 0.25 + ], + [ + 2065, + 0.25 + ], + [ + 2066, + 0.25 + ], + [ + 2067, + 0.25 + ], + [ + 2068, + 0.25 + ], + [ + 2069, + 0.25 + ], + [ + 2070, + 0.4 + ], + [ + 2071, + 0.3 + ], + [ + 2072, + 0.3 + ], + [ + 2073, + 0.3 + ], + [ + 2074, + 0.3 + ], + [ + 2075, + 0.3 + ], + [ + 2076, + 0.5 + ], + [ + 2077, + 0.3 + ], + [ + 2078, + 0.3 + ], + [ + 2079, + 0.3 + ], + [ + 2080, + 0.3 + ], + [ + 2081, + 0.3 + ], + [ + 2082, + 0.3 + ], + [ + 2083, + 0.3 + ], + [ + 2084, + 0.3 + ], + [ + 2085, + 0.6 + ], + [ + 2086, + 0.25 + ], + [ + 2087, + 0.25 + ], + [ + 2088, + 0.25 + ], + [ + 2089, + 0.25 + ], + [ + 2090, + 0.25 + ], + [ + 2091, + 0.25 + ], + [ + 2092, + 0.25 + ], + [ + 2093, + 0.25 + ], + [ + 2094, + 0.4 + ], + [ + 2095, + 0.3 + ], + [ + 2096, + 0.3 + ], + [ + 2097, + 0.3 + ], + [ + 2098, + 0.3 + ], + [ + 2099, + 0.3 + ], + [ + 2100, + 0.5 + ], + [ + 2101, + 0.3 + ], + [ + 2102, + 0.3 + ], + [ + 2103, + 0.3 + ], + [ + 2104, + 0.3 + ], + [ + 2105, + 0.3 + ], + [ + 2106, + 0.3 + ], + [ + 2107, + 0.3 + ], + [ + 2108, + 0.3 + ], + [ + 2109, + 0.6 + ], + [ + 2110, + 0.25 + ], + [ + 2111, + 0.25 + ], + [ + 2112, + 0.25 + ], + [ + 2113, + 0.25 + ], + [ + 2114, + 0.25 + ], + [ + 2115, + 0.25 + ], + [ + 2116, + 0.25 + ], + [ + 2117, + 0.25 + ], + [ + 2118, + 0.4 + ], + [ + 2119, + 0.3 + ], + [ + 2120, + 0.3 + ], + [ + 2121, + 0.3 + ], + [ + 2122, + 0.3 + ], + [ + 2123, + 0.3 + ], + [ + 2124, + 0.5 + ], + [ + 2125, + 0.3 + ], + [ + 2126, + 0.3 + ], + [ + 2127, + 0.3 + ], + [ + 2128, + 0.3 + ], + [ + 2129, + 0.3 + ], + [ + 2130, + 0.3 + ], + [ + 2131, + 0.3 + ], + [ + 2132, + 0.3 + ], + [ + 2133, + 0.6 + ], + [ + 2134, + 0.25 + ], + [ + 2135, + 0.25 + ], + [ + 2136, + 0.3 + ], + [ + 2137, + 0.3 + ], + [ + 2138, + 0.3 + ], + [ + 2139, + 0.3 + ], + [ + 2140, + 0.3 + ], + [ + 2141, + 0.3 + ], + [ + 2142, + 0.3 + ], + [ + 2143, + 0.5 + ], + [ + 2144, + 0.55 + ], + [ + 2145, + 0.55 + ], + [ + 2146, + 0.55 + ], + [ + 2147, + 0.55 + ], + [ + 2148, + 0.65 + ], + [ + 2149, + 0.55 + ], + [ + 2150, + 0.55 + ], + [ + 2151, + 0.55 + ], + [ + 2152, + 0.55 + ], + [ + 2153, + 0.55 + ], + [ + 2154, + 0.55 + ], + [ + 2155, + 0.55 + ], + [ + 2156, + 0.55 + ], + [ + 2157, + 0.55 + ], + [ + 2158, + 0.7 + ], + [ + 2159, + 0.3 + ], + [ + 2160, + 0.3 + ], + [ + 2161, + 0.3 + ], + [ + 2162, + 0.3 + ], + [ + 2163, + 0.3 + ], + [ + 2164, + 0.3 + ], + [ + 2165, + 0.3 + ], + [ + 2166, + 0.3 + ], + [ + 2167, + 0.5 + ], + [ + 2168, + 0.55 + ], + [ + 2169, + 0.55 + ], + [ + 2170, + 0.55 + ], + [ + 2171, + 0.55 + ], + [ + 2172, + 0.65 + ], + [ + 2173, + 0.55 + ], + [ + 2174, + 0.55 + ], + [ + 2175, + 0.55 + ], + [ + 2176, + 0.55 + ], + [ + 2177, + 0.55 + ], + [ + 2178, + 0.55 + ], + [ + 2179, + 0.55 + ], + [ + 2180, + 0.55 + ], + [ + 2181, + 0.55 + ], + [ + 2182, + 0.7 + ], + [ + 2183, + 0.3 + ], + [ + 2184, + 0.25 + ], + [ + 2185, + 0.25 + ], + [ + 2186, + 0.25 + ], + [ + 2187, + 0.25 + ], + [ + 2188, + 0.25 + ], + [ + 2189, + 0.25 + ], + [ + 2190, + 0.4 + ], + [ + 2191, + 0.3 + ], + [ + 2192, + 0.3 + ], + [ + 2193, + 0.3 + ], + [ + 2194, + 0.3 + ], + [ + 2195, + 0.3 + ], + [ + 2196, + 0.5 + ], + [ + 2197, + 0.3 + ], + [ + 2198, + 0.3 + ], + [ + 2199, + 0.3 + ], + [ + 2200, + 0.3 + ], + [ + 2201, + 0.3 + ], + [ + 2202, + 0.3 + ], + [ + 2203, + 0.3 + ], + [ + 2204, + 0.3 + ], + [ + 2205, + 0.6 + ], + [ + 2206, + 0.25 + ], + [ + 2207, + 0.25 + ], + [ + 2208, + 0.25 + ], + [ + 2209, + 0.25 + ], + [ + 2210, + 0.25 + ], + [ + 2211, + 0.25 + ], + [ + 2212, + 0.25 + ], + [ + 2213, + 0.25 + ], + [ + 2214, + 0.4 + ], + [ + 2215, + 0.3 + ], + [ + 2216, + 0.3 + ], + [ + 2217, + 0.3 + ], + [ + 2218, + 0.3 + ], + [ + 2219, + 0.3 + ], + [ + 2220, + 0.5 + ], + [ + 2221, + 0.3 + ], + [ + 2222, + 0.3 + ], + [ + 2223, + 0.3 + ], + [ + 2224, + 0.3 + ], + [ + 2225, + 0.3 + ], + [ + 2226, + 0.3 + ], + [ + 2227, + 0.3 + ], + [ + 2228, + 0.3 + ], + [ + 2229, + 0.6 + ], + [ + 2230, + 0.25 + ], + [ + 2231, + 0.25 + ], + [ + 2232, + 0.25 + ], + [ + 2233, + 0.25 + ], + [ + 2234, + 0.25 + ], + [ + 2235, + 0.25 + ], + [ + 2236, + 0.25 + ], + [ + 2237, + 0.25 + ], + [ + 2238, + 0.4 + ], + [ + 2239, + 0.3 + ], + [ + 2240, + 0.3 + ], + [ + 2241, + 0.3 + ], + [ + 2242, + 0.3 + ], + [ + 2243, + 0.3 + ], + [ + 2244, + 0.5 + ], + [ + 2245, + 0.3 + ], + [ + 2246, + 0.3 + ], + [ + 2247, + 0.3 + ], + [ + 2248, + 0.3 + ], + [ + 2249, + 0.3 + ], + [ + 2250, + 0.3 + ], + [ + 2251, + 0.3 + ], + [ + 2252, + 0.3 + ], + [ + 2253, + 0.6 + ], + [ + 2254, + 0.25 + ], + [ + 2255, + 0.25 + ], + [ + 2256, + 0.25 + ], + [ + 2257, + 0.25 + ], + [ + 2258, + 0.25 + ], + [ + 2259, + 0.25 + ], + [ + 2260, + 0.25 + ], + [ + 2261, + 0.25 + ], + [ + 2262, + 0.4 + ], + [ + 2263, + 0.3 + ], + [ + 2264, + 0.3 + ], + [ + 2265, + 0.3 + ], + [ + 2266, + 0.3 + ], + [ + 2267, + 0.3 + ], + [ + 2268, + 0.5 + ], + [ + 2269, + 0.3 + ], + [ + 2270, + 0.3 + ], + [ + 2271, + 0.3 + ], + [ + 2272, + 0.3 + ], + [ + 2273, + 0.3 + ], + [ + 2274, + 0.3 + ], + [ + 2275, + 0.3 + ], + [ + 2276, + 0.3 + ], + [ + 2277, + 0.6 + ], + [ + 2278, + 0.25 + ], + [ + 2279, + 0.25 + ], + [ + 2280, + 0.25 + ], + [ + 2281, + 0.25 + ], + [ + 2282, + 0.25 + ], + [ + 2283, + 0.25 + ], + [ + 2284, + 0.25 + ], + [ + 2285, + 0.25 + ], + [ + 2286, + 0.4 + ], + [ + 2287, + 0.3 + ], + [ + 2288, + 0.3 + ], + [ + 2289, + 0.3 + ], + [ + 2290, + 0.3 + ], + [ + 2291, + 0.3 + ], + [ + 2292, + 0.5 + ], + [ + 2293, + 0.3 + ], + [ + 2294, + 0.3 + ], + [ + 2295, + 0.3 + ], + [ + 2296, + 0.3 + ], + [ + 2297, + 0.3 + ], + [ + 2298, + 0.3 + ], + [ + 2299, + 0.3 + ], + [ + 2300, + 0.3 + ], + [ + 2301, + 0.6 + ], + [ + 2302, + 0.25 + ], + [ + 2303, + 0.25 + ], + [ + 2304, + 0.3 + ], + [ + 2305, + 0.3 + ], + [ + 2306, + 0.3 + ], + [ + 2307, + 0.3 + ], + [ + 2308, + 0.3 + ], + [ + 2309, + 0.3 + ], + [ + 2310, + 0.3 + ], + [ + 2311, + 0.5 + ], + [ + 2312, + 0.55 + ], + [ + 2313, + 0.55 + ], + [ + 2314, + 0.55 + ], + [ + 2315, + 0.55 + ], + [ + 2316, + 0.65 + ], + [ + 2317, + 0.55 + ], + [ + 2318, + 0.55 + ], + [ + 2319, + 0.55 + ], + [ + 2320, + 0.55 + ], + [ + 2321, + 0.55 + ], + [ + 2322, + 0.55 + ], + [ + 2323, + 0.55 + ], + [ + 2324, + 0.55 + ], + [ + 2325, + 0.55 + ], + [ + 2326, + 0.7 + ], + [ + 2327, + 0.3 + ], + [ + 2328, + 0.3 + ], + [ + 2329, + 0.3 + ], + [ + 2330, + 0.3 + ], + [ + 2331, + 0.3 + ], + [ + 2332, + 0.3 + ], + [ + 2333, + 0.3 + ], + [ + 2334, + 0.3 + ], + [ + 2335, + 0.5 + ], + [ + 2336, + 0.55 + ], + [ + 2337, + 0.55 + ], + [ + 2338, + 0.55 + ], + [ + 2339, + 0.55 + ], + [ + 2340, + 0.65 + ], + [ + 2341, + 0.55 + ], + [ + 2342, + 0.55 + ], + [ + 2343, + 0.55 + ], + [ + 2344, + 0.55 + ], + [ + 2345, + 0.55 + ], + [ + 2346, + 0.55 + ], + [ + 2347, + 0.55 + ], + [ + 2348, + 0.55 + ], + [ + 2349, + 0.55 + ], + [ + 2350, + 0.7 + ], + [ + 2351, + 0.3 + ], + [ + 2352, + 0.25 + ], + [ + 2353, + 0.25 + ], + [ + 2354, + 0.25 + ], + [ + 2355, + 0.25 + ], + [ + 2356, + 0.25 + ], + [ + 2357, + 0.25 + ], + [ + 2358, + 0.4 + ], + [ + 2359, + 0.3 + ], + [ + 2360, + 0.3 + ], + [ + 2361, + 0.3 + ], + [ + 2362, + 0.3 + ], + [ + 2363, + 0.3 + ], + [ + 2364, + 0.5 + ], + [ + 2365, + 0.3 + ], + [ + 2366, + 0.3 + ], + [ + 2367, + 0.3 + ], + [ + 2368, + 0.3 + ], + [ + 2369, + 0.3 + ], + [ + 2370, + 0.3 + ], + [ + 2371, + 0.3 + ], + [ + 2372, + 0.3 + ], + [ + 2373, + 0.6 + ], + [ + 2374, + 0.25 + ], + [ + 2375, + 0.25 + ], + [ + 2376, + 0.25 + ], + [ + 2377, + 0.25 + ], + [ + 2378, + 0.25 + ], + [ + 2379, + 0.25 + ], + [ + 2380, + 0.25 + ], + [ + 2381, + 0.25 + ], + [ + 2382, + 0.4 + ], + [ + 2383, + 0.3 + ], + [ + 2384, + 0.3 + ], + [ + 2385, + 0.3 + ], + [ + 2386, + 0.3 + ], + [ + 2387, + 0.3 + ], + [ + 2388, + 0.5 + ], + [ + 2389, + 0.3 + ], + [ + 2390, + 0.3 + ], + [ + 2391, + 0.3 + ], + [ + 2392, + 0.3 + ], + [ + 2393, + 0.3 + ], + [ + 2394, + 0.3 + ], + [ + 2395, + 0.3 + ], + [ + 2396, + 0.3 + ], + [ + 2397, + 0.6 + ], + [ + 2398, + 0.25 + ], + [ + 2399, + 0.25 + ], + [ + 2400, + 0.25 + ], + [ + 2401, + 0.25 + ], + [ + 2402, + 0.25 + ], + [ + 2403, + 0.25 + ], + [ + 2404, + 0.25 + ], + [ + 2405, + 0.25 + ], + [ + 2406, + 0.4 + ], + [ + 2407, + 0.3 + ], + [ + 2408, + 0.3 + ], + [ + 2409, + 0.3 + ], + [ + 2410, + 0.3 + ], + [ + 2411, + 0.3 + ], + [ + 2412, + 0.5 + ], + [ + 2413, + 0.3 + ], + [ + 2414, + 0.3 + ], + [ + 2415, + 0.3 + ], + [ + 2416, + 0.3 + ], + [ + 2417, + 0.3 + ], + [ + 2418, + 0.3 + ], + [ + 2419, + 0.3 + ], + [ + 2420, + 0.3 + ], + [ + 2421, + 0.6 + ], + [ + 2422, + 0.25 + ], + [ + 2423, + 0.25 + ], + [ + 2424, + 0.25 + ], + [ + 2425, + 0.25 + ], + [ + 2426, + 0.25 + ], + [ + 2427, + 0.25 + ], + [ + 2428, + 0.25 + ], + [ + 2429, + 0.25 + ], + [ + 2430, + 0.4 + ], + [ + 2431, + 0.3 + ], + [ + 2432, + 0.3 + ], + [ + 2433, + 0.3 + ], + [ + 2434, + 0.3 + ], + [ + 2435, + 0.3 + ], + [ + 2436, + 0.5 + ], + [ + 2437, + 0.3 + ], + [ + 2438, + 0.3 + ], + [ + 2439, + 0.3 + ], + [ + 2440, + 0.3 + ], + [ + 2441, + 0.3 + ], + [ + 2442, + 0.3 + ], + [ + 2443, + 0.3 + ], + [ + 2444, + 0.3 + ], + [ + 2445, + 0.6 + ], + [ + 2446, + 0.25 + ], + [ + 2447, + 0.25 + ], + [ + 2448, + 0.25 + ], + [ + 2449, + 0.25 + ], + [ + 2450, + 0.25 + ], + [ + 2451, + 0.25 + ], + [ + 2452, + 0.25 + ], + [ + 2453, + 0.25 + ], + [ + 2454, + 0.4 + ], + [ + 2455, + 0.3 + ], + [ + 2456, + 0.3 + ], + [ + 2457, + 0.3 + ], + [ + 2458, + 0.3 + ], + [ + 2459, + 0.3 + ], + [ + 2460, + 0.5 + ], + [ + 2461, + 0.3 + ], + [ + 2462, + 0.3 + ], + [ + 2463, + 0.3 + ], + [ + 2464, + 0.3 + ], + [ + 2465, + 0.3 + ], + [ + 2466, + 0.3 + ], + [ + 2467, + 0.3 + ], + [ + 2468, + 0.3 + ], + [ + 2469, + 0.6 + ], + [ + 2470, + 0.25 + ], + [ + 2471, + 0.25 + ], + [ + 2472, + 0.3 + ], + [ + 2473, + 0.3 + ], + [ + 2474, + 0.3 + ], + [ + 2475, + 0.3 + ], + [ + 2476, + 0.3 + ], + [ + 2477, + 0.3 + ], + [ + 2478, + 0.3 + ], + [ + 2479, + 0.5 + ], + [ + 2480, + 0.55 + ], + [ + 2481, + 0.55 + ], + [ + 2482, + 0.55 + ], + [ + 2483, + 0.55 + ], + [ + 2484, + 0.65 + ], + [ + 2485, + 0.55 + ], + [ + 2486, + 0.55 + ], + [ + 2487, + 0.55 + ], + [ + 2488, + 0.55 + ], + [ + 2489, + 0.55 + ], + [ + 2490, + 0.55 + ], + [ + 2491, + 0.55 + ], + [ + 2492, + 0.55 + ], + [ + 2493, + 0.55 + ], + [ + 2494, + 0.7 + ], + [ + 2495, + 0.3 + ], + [ + 2496, + 0.3 + ], + [ + 2497, + 0.3 + ], + [ + 2498, + 0.3 + ], + [ + 2499, + 0.3 + ], + [ + 2500, + 0.3 + ], + [ + 2501, + 0.3 + ], + [ + 2502, + 0.3 + ], + [ + 2503, + 0.5 + ], + [ + 2504, + 0.55 + ], + [ + 2505, + 0.55 + ], + [ + 2506, + 0.55 + ], + [ + 2507, + 0.55 + ], + [ + 2508, + 0.65 + ], + [ + 2509, + 0.55 + ], + [ + 2510, + 0.55 + ], + [ + 2511, + 0.55 + ], + [ + 2512, + 0.55 + ], + [ + 2513, + 0.55 + ], + [ + 2514, + 0.55 + ], + [ + 2515, + 0.55 + ], + [ + 2516, + 0.55 + ], + [ + 2517, + 0.55 + ], + [ + 2518, + 0.7 + ], + [ + 2519, + 0.3 + ], + [ + 2520, + 0.25 + ], + [ + 2521, + 0.25 + ], + [ + 2522, + 0.25 + ], + [ + 2523, + 0.25 + ], + [ + 2524, + 0.25 + ], + [ + 2525, + 0.25 + ], + [ + 2526, + 0.4 + ], + [ + 2527, + 0.3 + ], + [ + 2528, + 0.3 + ], + [ + 2529, + 0.3 + ], + [ + 2530, + 0.3 + ], + [ + 2531, + 0.3 + ], + [ + 2532, + 0.5 + ], + [ + 2533, + 0.3 + ], + [ + 2534, + 0.3 + ], + [ + 2535, + 0.3 + ], + [ + 2536, + 0.3 + ], + [ + 2537, + 0.3 + ], + [ + 2538, + 0.3 + ], + [ + 2539, + 0.3 + ], + [ + 2540, + 0.3 + ], + [ + 2541, + 0.6 + ], + [ + 2542, + 0.25 + ], + [ + 2543, + 0.25 + ], + [ + 2544, + 0.25 + ], + [ + 2545, + 0.25 + ], + [ + 2546, + 0.25 + ], + [ + 2547, + 0.25 + ], + [ + 2548, + 0.25 + ], + [ + 2549, + 0.25 + ], + [ + 2550, + 0.4 + ], + [ + 2551, + 0.3 + ], + [ + 2552, + 0.3 + ], + [ + 2553, + 0.3 + ], + [ + 2554, + 0.3 + ], + [ + 2555, + 0.3 + ], + [ + 2556, + 0.5 + ], + [ + 2557, + 0.3 + ], + [ + 2558, + 0.3 + ], + [ + 2559, + 0.3 + ], + [ + 2560, + 0.3 + ], + [ + 2561, + 0.3 + ], + [ + 2562, + 0.3 + ], + [ + 2563, + 0.3 + ], + [ + 2564, + 0.3 + ], + [ + 2565, + 0.6 + ], + [ + 2566, + 0.25 + ], + [ + 2567, + 0.25 + ], + [ + 2568, + 0.25 + ], + [ + 2569, + 0.25 + ], + [ + 2570, + 0.25 + ], + [ + 2571, + 0.25 + ], + [ + 2572, + 0.25 + ], + [ + 2573, + 0.25 + ], + [ + 2574, + 0.4 + ], + [ + 2575, + 0.3 + ], + [ + 2576, + 0.3 + ], + [ + 2577, + 0.3 + ], + [ + 2578, + 0.3 + ], + [ + 2579, + 0.3 + ], + [ + 2580, + 0.5 + ], + [ + 2581, + 0.3 + ], + [ + 2582, + 0.3 + ], + [ + 2583, + 0.3 + ], + [ + 2584, + 0.3 + ], + [ + 2585, + 0.3 + ], + [ + 2586, + 0.3 + ], + [ + 2587, + 0.3 + ], + [ + 2588, + 0.3 + ], + [ + 2589, + 0.6 + ], + [ + 2590, + 0.25 + ], + [ + 2591, + 0.25 + ], + [ + 2592, + 0.25 + ], + [ + 2593, + 0.25 + ], + [ + 2594, + 0.25 + ], + [ + 2595, + 0.25 + ], + [ + 2596, + 0.25 + ], + [ + 2597, + 0.25 + ], + [ + 2598, + 0.4 + ], + [ + 2599, + 0.3 + ], + [ + 2600, + 0.3 + ], + [ + 2601, + 0.3 + ], + [ + 2602, + 0.3 + ], + [ + 2603, + 0.3 + ], + [ + 2604, + 0.5 + ], + [ + 2605, + 0.3 + ], + [ + 2606, + 0.3 + ], + [ + 2607, + 0.3 + ], + [ + 2608, + 0.3 + ], + [ + 2609, + 0.3 + ], + [ + 2610, + 0.3 + ], + [ + 2611, + 0.3 + ], + [ + 2612, + 0.3 + ], + [ + 2613, + 0.6 + ], + [ + 2614, + 0.25 + ], + [ + 2615, + 0.25 + ], + [ + 2616, + 0.25 + ], + [ + 2617, + 0.25 + ], + [ + 2618, + 0.25 + ], + [ + 2619, + 0.25 + ], + [ + 2620, + 0.25 + ], + [ + 2621, + 0.25 + ], + [ + 2622, + 0.4 + ], + [ + 2623, + 0.3 + ], + [ + 2624, + 0.3 + ], + [ + 2625, + 0.3 + ], + [ + 2626, + 0.3 + ], + [ + 2627, + 0.3 + ], + [ + 2628, + 0.5 + ], + [ + 2629, + 0.3 + ], + [ + 2630, + 0.3 + ], + [ + 2631, + 0.3 + ], + [ + 2632, + 0.3 + ], + [ + 2633, + 0.3 + ], + [ + 2634, + 0.3 + ], + [ + 2635, + 0.3 + ], + [ + 2636, + 0.3 + ], + [ + 2637, + 0.6 + ], + [ + 2638, + 0.25 + ], + [ + 2639, + 0.25 + ], + [ + 2640, + 0.3 + ], + [ + 2641, + 0.3 + ], + [ + 2642, + 0.3 + ], + [ + 2643, + 0.3 + ], + [ + 2644, + 0.3 + ], + [ + 2645, + 0.3 + ], + [ + 2646, + 0.3 + ], + [ + 2647, + 0.5 + ], + [ + 2648, + 0.55 + ], + [ + 2649, + 0.55 + ], + [ + 2650, + 0.55 + ], + [ + 2651, + 0.55 + ], + [ + 2652, + 0.65 + ], + [ + 2653, + 0.55 + ], + [ + 2654, + 0.55 + ], + [ + 2655, + 0.55 + ], + [ + 2656, + 0.55 + ], + [ + 2657, + 0.55 + ], + [ + 2658, + 0.55 + ], + [ + 2659, + 0.55 + ], + [ + 2660, + 0.55 + ], + [ + 2661, + 0.55 + ], + [ + 2662, + 0.7 + ], + [ + 2663, + 0.3 + ], + [ + 2664, + 0.3 + ], + [ + 2665, + 0.3 + ], + [ + 2666, + 0.3 + ], + [ + 2667, + 0.3 + ], + [ + 2668, + 0.3 + ], + [ + 2669, + 0.3 + ], + [ + 2670, + 0.3 + ], + [ + 2671, + 0.5 + ], + [ + 2672, + 0.55 + ], + [ + 2673, + 0.55 + ], + [ + 2674, + 0.55 + ], + [ + 2675, + 0.55 + ], + [ + 2676, + 0.65 + ], + [ + 2677, + 0.55 + ], + [ + 2678, + 0.55 + ], + [ + 2679, + 0.55 + ], + [ + 2680, + 0.55 + ], + [ + 2681, + 0.55 + ], + [ + 2682, + 0.55 + ], + [ + 2683, + 0.55 + ], + [ + 2684, + 0.55 + ], + [ + 2685, + 0.55 + ], + [ + 2686, + 0.7 + ], + [ + 2687, + 0.3 + ], + [ + 2688, + 0.25 + ], + [ + 2689, + 0.25 + ], + [ + 2690, + 0.25 + ], + [ + 2691, + 0.25 + ], + [ + 2692, + 0.25 + ], + [ + 2693, + 0.25 + ], + [ + 2694, + 0.4 + ], + [ + 2695, + 0.3 + ], + [ + 2696, + 0.3 + ], + [ + 2697, + 0.3 + ], + [ + 2698, + 0.3 + ], + [ + 2699, + 0.3 + ], + [ + 2700, + 0.5 + ], + [ + 2701, + 0.3 + ], + [ + 2702, + 0.3 + ], + [ + 2703, + 0.3 + ], + [ + 2704, + 0.3 + ], + [ + 2705, + 0.3 + ], + [ + 2706, + 0.3 + ], + [ + 2707, + 0.3 + ], + [ + 2708, + 0.3 + ], + [ + 2709, + 0.6 + ], + [ + 2710, + 0.25 + ], + [ + 2711, + 0.25 + ], + [ + 2712, + 0.25 + ], + [ + 2713, + 0.25 + ], + [ + 2714, + 0.25 + ], + [ + 2715, + 0.25 + ], + [ + 2716, + 0.25 + ], + [ + 2717, + 0.25 + ], + [ + 2718, + 0.4 + ], + [ + 2719, + 0.3 + ], + [ + 2720, + 0.3 + ], + [ + 2721, + 0.3 + ], + [ + 2722, + 0.3 + ], + [ + 2723, + 0.3 + ], + [ + 2724, + 0.5 + ], + [ + 2725, + 0.3 + ], + [ + 2726, + 0.3 + ], + [ + 2727, + 0.3 + ], + [ + 2728, + 0.3 + ], + [ + 2729, + 0.3 + ], + [ + 2730, + 0.3 + ], + [ + 2731, + 0.3 + ], + [ + 2732, + 0.3 + ], + [ + 2733, + 0.6 + ], + [ + 2734, + 0.25 + ], + [ + 2735, + 0.25 + ], + [ + 2736, + 0.25 + ], + [ + 2737, + 0.25 + ], + [ + 2738, + 0.25 + ], + [ + 2739, + 0.25 + ], + [ + 2740, + 0.25 + ], + [ + 2741, + 0.25 + ], + [ + 2742, + 0.4 + ], + [ + 2743, + 0.3 + ], + [ + 2744, + 0.3 + ], + [ + 2745, + 0.3 + ], + [ + 2746, + 0.3 + ], + [ + 2747, + 0.3 + ], + [ + 2748, + 0.5 + ], + [ + 2749, + 0.3 + ], + [ + 2750, + 0.3 + ], + [ + 2751, + 0.3 + ], + [ + 2752, + 0.3 + ], + [ + 2753, + 0.3 + ], + [ + 2754, + 0.3 + ], + [ + 2755, + 0.3 + ], + [ + 2756, + 0.3 + ], + [ + 2757, + 0.6 + ], + [ + 2758, + 0.25 + ], + [ + 2759, + 0.25 + ], + [ + 2760, + 0.25 + ], + [ + 2761, + 0.25 + ], + [ + 2762, + 0.25 + ], + [ + 2763, + 0.25 + ], + [ + 2764, + 0.25 + ], + [ + 2765, + 0.25 + ], + [ + 2766, + 0.4 + ], + [ + 2767, + 0.3 + ], + [ + 2768, + 0.3 + ], + [ + 2769, + 0.3 + ], + [ + 2770, + 0.3 + ], + [ + 2771, + 0.3 + ], + [ + 2772, + 0.5 + ], + [ + 2773, + 0.3 + ], + [ + 2774, + 0.3 + ], + [ + 2775, + 0.3 + ], + [ + 2776, + 0.3 + ], + [ + 2777, + 0.3 + ], + [ + 2778, + 0.3 + ], + [ + 2779, + 0.3 + ], + [ + 2780, + 0.3 + ], + [ + 2781, + 0.6 + ], + [ + 2782, + 0.25 + ], + [ + 2783, + 0.25 + ], + [ + 2784, + 0.25 + ], + [ + 2785, + 0.25 + ], + [ + 2786, + 0.25 + ], + [ + 2787, + 0.25 + ], + [ + 2788, + 0.25 + ], + [ + 2789, + 0.25 + ], + [ + 2790, + 0.4 + ], + [ + 2791, + 0.3 + ], + [ + 2792, + 0.3 + ], + [ + 2793, + 0.3 + ], + [ + 2794, + 0.3 + ], + [ + 2795, + 0.3 + ], + [ + 2796, + 0.5 + ], + [ + 2797, + 0.3 + ], + [ + 2798, + 0.3 + ], + [ + 2799, + 0.3 + ], + [ + 2800, + 0.3 + ], + [ + 2801, + 0.3 + ], + [ + 2802, + 0.3 + ], + [ + 2803, + 0.3 + ], + [ + 2804, + 0.3 + ], + [ + 2805, + 0.6 + ], + [ + 2806, + 0.25 + ], + [ + 2807, + 0.25 + ], + [ + 2808, + 0.3 + ], + [ + 2809, + 0.3 + ], + [ + 2810, + 0.3 + ], + [ + 2811, + 0.3 + ], + [ + 2812, + 0.3 + ], + [ + 2813, + 0.3 + ], + [ + 2814, + 0.3 + ], + [ + 2815, + 0.5 + ], + [ + 2816, + 0.55 + ], + [ + 2817, + 0.55 + ], + [ + 2818, + 0.55 + ], + [ + 2819, + 0.55 + ], + [ + 2820, + 0.65 + ], + [ + 2821, + 0.55 + ], + [ + 2822, + 0.55 + ], + [ + 2823, + 0.55 + ], + [ + 2824, + 0.55 + ], + [ + 2825, + 0.55 + ], + [ + 2826, + 0.55 + ], + [ + 2827, + 0.55 + ], + [ + 2828, + 0.55 + ], + [ + 2829, + 0.55 + ], + [ + 2830, + 0.7 + ], + [ + 2831, + 0.3 + ], + [ + 2832, + 0.3 + ], + [ + 2833, + 0.3 + ], + [ + 2834, + 0.3 + ], + [ + 2835, + 0.3 + ], + [ + 2836, + 0.3 + ], + [ + 2837, + 0.3 + ], + [ + 2838, + 0.3 + ], + [ + 2839, + 0.5 + ], + [ + 2840, + 0.55 + ], + [ + 2841, + 0.55 + ], + [ + 2842, + 0.55 + ], + [ + 2843, + 0.55 + ], + [ + 2844, + 0.65 + ], + [ + 2845, + 0.55 + ], + [ + 2846, + 0.55 + ], + [ + 2847, + 0.55 + ], + [ + 2848, + 0.55 + ], + [ + 2849, + 0.55 + ], + [ + 2850, + 0.55 + ], + [ + 2851, + 0.55 + ], + [ + 2852, + 0.55 + ], + [ + 2853, + 0.55 + ], + [ + 2854, + 0.7 + ], + [ + 2855, + 0.3 + ], + [ + 2856, + 0.25 + ], + [ + 2857, + 0.25 + ], + [ + 2858, + 0.25 + ], + [ + 2859, + 0.25 + ], + [ + 2860, + 0.25 + ], + [ + 2861, + 0.25 + ], + [ + 2862, + 0.4 + ], + [ + 2863, + 0.3 + ], + [ + 2864, + 0.3 + ], + [ + 2865, + 0.3 + ], + [ + 2866, + 0.3 + ], + [ + 2867, + 0.3 + ], + [ + 2868, + 0.5 + ], + [ + 2869, + 0.3 + ], + [ + 2870, + 0.3 + ], + [ + 2871, + 0.3 + ], + [ + 2872, + 0.3 + ], + [ + 2873, + 0.3 + ], + [ + 2874, + 0.3 + ], + [ + 2875, + 0.3 + ], + [ + 2876, + 0.3 + ], + [ + 2877, + 0.6 + ], + [ + 2878, + 0.25 + ], + [ + 2879, + 0.25 + ], + [ + 2880, + 0.25 + ], + [ + 2881, + 0.25 + ], + [ + 2882, + 0.25 + ], + [ + 2883, + 0.25 + ], + [ + 2884, + 0.25 + ], + [ + 2885, + 0.25 + ], + [ + 2886, + 0.4 + ], + [ + 2887, + 0.3 + ], + [ + 2888, + 0.3 + ], + [ + 2889, + 0.3 + ], + [ + 2890, + 0.3 + ], + [ + 2891, + 0.3 + ], + [ + 2892, + 0.5 + ], + [ + 2893, + 0.3 + ], + [ + 2894, + 0.3 + ], + [ + 2895, + 0.3 + ], + [ + 2896, + 0.3 + ], + [ + 2897, + 0.3 + ], + [ + 2898, + 0.3 + ], + [ + 2899, + 0.3 + ], + [ + 2900, + 0.3 + ], + [ + 2901, + 0.6 + ], + [ + 2902, + 0.25 + ], + [ + 2903, + 0.25 + ], + [ + 2904, + 0.25 + ], + [ + 2905, + 0.25 + ], + [ + 2906, + 0.25 + ], + [ + 2907, + 0.25 + ], + [ + 2908, + 0.25 + ], + [ + 2909, + 0.25 + ], + [ + 2910, + 0.4 + ], + [ + 2911, + 0.3 + ], + [ + 2912, + 0.3 + ], + [ + 2913, + 0.3 + ], + [ + 2914, + 0.3 + ], + [ + 2915, + 0.3 + ], + [ + 2916, + 0.5 + ], + [ + 2917, + 0.3 + ], + [ + 2918, + 0.3 + ], + [ + 2919, + 0.3 + ], + [ + 2920, + 0.3 + ], + [ + 2921, + 0.3 + ], + [ + 2922, + 0.3 + ], + [ + 2923, + 0.3 + ], + [ + 2924, + 0.3 + ], + [ + 2925, + 0.6 + ], + [ + 2926, + 0.25 + ], + [ + 2927, + 0.25 + ], + [ + 2928, + 0.25 + ], + [ + 2929, + 0.25 + ], + [ + 2930, + 0.25 + ], + [ + 2931, + 0.25 + ], + [ + 2932, + 0.25 + ], + [ + 2933, + 0.25 + ], + [ + 2934, + 0.4 + ], + [ + 2935, + 0.3 + ], + [ + 2936, + 0.3 + ], + [ + 2937, + 0.3 + ], + [ + 2938, + 0.3 + ], + [ + 2939, + 0.3 + ], + [ + 2940, + 0.5 + ], + [ + 2941, + 0.3 + ], + [ + 2942, + 0.3 + ], + [ + 2943, + 0.3 + ], + [ + 2944, + 0.3 + ], + [ + 2945, + 0.3 + ], + [ + 2946, + 0.3 + ], + [ + 2947, + 0.3 + ], + [ + 2948, + 0.3 + ], + [ + 2949, + 0.6 + ], + [ + 2950, + 0.25 + ], + [ + 2951, + 0.25 + ], + [ + 2952, + 0.25 + ], + [ + 2953, + 0.25 + ], + [ + 2954, + 0.25 + ], + [ + 2955, + 0.25 + ], + [ + 2956, + 0.25 + ], + [ + 2957, + 0.25 + ], + [ + 2958, + 0.4 + ], + [ + 2959, + 0.3 + ], + [ + 2960, + 0.3 + ], + [ + 2961, + 0.3 + ], + [ + 2962, + 0.3 + ], + [ + 2963, + 0.3 + ], + [ + 2964, + 0.5 + ], + [ + 2965, + 0.3 + ], + [ + 2966, + 0.3 + ], + [ + 2967, + 0.3 + ], + [ + 2968, + 0.3 + ], + [ + 2969, + 0.3 + ], + [ + 2970, + 0.3 + ], + [ + 2971, + 0.3 + ], + [ + 2972, + 0.3 + ], + [ + 2973, + 0.6 + ], + [ + 2974, + 0.25 + ], + [ + 2975, + 0.25 + ], + [ + 2976, + 0.3 + ], + [ + 2977, + 0.3 + ], + [ + 2978, + 0.3 + ], + [ + 2979, + 0.3 + ], + [ + 2980, + 0.3 + ], + [ + 2981, + 0.3 + ], + [ + 2982, + 0.3 + ], + [ + 2983, + 0.5 + ], + [ + 2984, + 0.55 + ], + [ + 2985, + 0.55 + ], + [ + 2986, + 0.55 + ], + [ + 2987, + 0.55 + ], + [ + 2988, + 0.65 + ], + [ + 2989, + 0.55 + ], + [ + 2990, + 0.55 + ], + [ + 2991, + 0.55 + ], + [ + 2992, + 0.55 + ], + [ + 2993, + 0.55 + ], + [ + 2994, + 0.55 + ], + [ + 2995, + 0.55 + ], + [ + 2996, + 0.55 + ], + [ + 2997, + 0.55 + ], + [ + 2998, + 0.7 + ], + [ + 2999, + 0.3 + ], + [ + 3000, + 0.3 + ], + [ + 3001, + 0.3 + ], + [ + 3002, + 0.3 + ], + [ + 3003, + 0.3 + ], + [ + 3004, + 0.3 + ], + [ + 3005, + 0.3 + ], + [ + 3006, + 0.3 + ], + [ + 3007, + 0.5 + ], + [ + 3008, + 0.55 + ], + [ + 3009, + 0.55 + ], + [ + 3010, + 0.55 + ], + [ + 3011, + 0.55 + ], + [ + 3012, + 0.65 + ], + [ + 3013, + 0.55 + ], + [ + 3014, + 0.55 + ], + [ + 3015, + 0.55 + ], + [ + 3016, + 0.55 + ], + [ + 3017, + 0.55 + ], + [ + 3018, + 0.55 + ], + [ + 3019, + 0.55 + ], + [ + 3020, + 0.55 + ], + [ + 3021, + 0.55 + ], + [ + 3022, + 0.7 + ], + [ + 3023, + 0.3 + ], + [ + 3024, + 0.25 + ], + [ + 3025, + 0.25 + ], + [ + 3026, + 0.25 + ], + [ + 3027, + 0.25 + ], + [ + 3028, + 0.25 + ], + [ + 3029, + 0.25 + ], + [ + 3030, + 0.4 + ], + [ + 3031, + 0.3 + ], + [ + 3032, + 0.3 + ], + [ + 3033, + 0.3 + ], + [ + 3034, + 0.3 + ], + [ + 3035, + 0.3 + ], + [ + 3036, + 0.5 + ], + [ + 3037, + 0.3 + ], + [ + 3038, + 0.3 + ], + [ + 3039, + 0.3 + ], + [ + 3040, + 0.3 + ], + [ + 3041, + 0.3 + ], + [ + 3042, + 0.3 + ], + [ + 3043, + 0.3 + ], + [ + 3044, + 0.3 + ], + [ + 3045, + 0.6 + ], + [ + 3046, + 0.25 + ], + [ + 3047, + 0.25 + ], + [ + 3048, + 0.25 + ], + [ + 3049, + 0.25 + ], + [ + 3050, + 0.25 + ], + [ + 3051, + 0.25 + ], + [ + 3052, + 0.25 + ], + [ + 3053, + 0.25 + ], + [ + 3054, + 0.4 + ], + [ + 3055, + 0.3 + ], + [ + 3056, + 0.3 + ], + [ + 3057, + 0.3 + ], + [ + 3058, + 0.3 + ], + [ + 3059, + 0.3 + ], + [ + 3060, + 0.5 + ], + [ + 3061, + 0.3 + ], + [ + 3062, + 0.3 + ], + [ + 3063, + 0.3 + ], + [ + 3064, + 0.3 + ], + [ + 3065, + 0.3 + ], + [ + 3066, + 0.3 + ], + [ + 3067, + 0.3 + ], + [ + 3068, + 0.3 + ], + [ + 3069, + 0.6 + ], + [ + 3070, + 0.25 + ], + [ + 3071, + 0.25 + ], + [ + 3072, + 0.25 + ], + [ + 3073, + 0.25 + ], + [ + 3074, + 0.25 + ], + [ + 3075, + 0.25 + ], + [ + 3076, + 0.25 + ], + [ + 3077, + 0.25 + ], + [ + 3078, + 0.4 + ], + [ + 3079, + 0.3 + ], + [ + 3080, + 0.3 + ], + [ + 3081, + 0.3 + ], + [ + 3082, + 0.3 + ], + [ + 3083, + 0.3 + ], + [ + 3084, + 0.5 + ], + [ + 3085, + 0.3 + ], + [ + 3086, + 0.3 + ], + [ + 3087, + 0.3 + ], + [ + 3088, + 0.3 + ], + [ + 3089, + 0.3 + ], + [ + 3090, + 0.3 + ], + [ + 3091, + 0.3 + ], + [ + 3092, + 0.3 + ], + [ + 3093, + 0.6 + ], + [ + 3094, + 0.25 + ], + [ + 3095, + 0.25 + ], + [ + 3096, + 0.25 + ], + [ + 3097, + 0.25 + ], + [ + 3098, + 0.25 + ], + [ + 3099, + 0.25 + ], + [ + 3100, + 0.25 + ], + [ + 3101, + 0.25 + ], + [ + 3102, + 0.4 + ], + [ + 3103, + 0.3 + ], + [ + 3104, + 0.3 + ], + [ + 3105, + 0.3 + ], + [ + 3106, + 0.3 + ], + [ + 3107, + 0.3 + ], + [ + 3108, + 0.5 + ], + [ + 3109, + 0.3 + ], + [ + 3110, + 0.3 + ], + [ + 3111, + 0.3 + ], + [ + 3112, + 0.3 + ], + [ + 3113, + 0.3 + ], + [ + 3114, + 0.3 + ], + [ + 3115, + 0.3 + ], + [ + 3116, + 0.3 + ], + [ + 3117, + 0.6 + ], + [ + 3118, + 0.25 + ], + [ + 3119, + 0.25 + ], + [ + 3120, + 0.25 + ], + [ + 3121, + 0.25 + ], + [ + 3122, + 0.25 + ], + [ + 3123, + 0.25 + ], + [ + 3124, + 0.25 + ], + [ + 3125, + 0.25 + ], + [ + 3126, + 0.4 + ], + [ + 3127, + 0.3 + ], + [ + 3128, + 0.3 + ], + [ + 3129, + 0.3 + ], + [ + 3130, + 0.3 + ], + [ + 3131, + 0.3 + ], + [ + 3132, + 0.5 + ], + [ + 3133, + 0.3 + ], + [ + 3134, + 0.3 + ], + [ + 3135, + 0.3 + ], + [ + 3136, + 0.3 + ], + [ + 3137, + 0.3 + ], + [ + 3138, + 0.3 + ], + [ + 3139, + 0.3 + ], + [ + 3140, + 0.3 + ], + [ + 3141, + 0.6 + ], + [ + 3142, + 0.25 + ], + [ + 3143, + 0.25 + ], + [ + 3144, + 0.3 + ], + [ + 3145, + 0.3 + ], + [ + 3146, + 0.3 + ], + [ + 3147, + 0.3 + ], + [ + 3148, + 0.3 + ], + [ + 3149, + 0.3 + ], + [ + 3150, + 0.3 + ], + [ + 3151, + 0.5 + ], + [ + 3152, + 0.55 + ], + [ + 3153, + 0.55 + ], + [ + 3154, + 0.55 + ], + [ + 3155, + 0.55 + ], + [ + 3156, + 0.65 + ], + [ + 3157, + 0.55 + ], + [ + 3158, + 0.55 + ], + [ + 3159, + 0.55 + ], + [ + 3160, + 0.55 + ], + [ + 3161, + 0.55 + ], + [ + 3162, + 0.55 + ], + [ + 3163, + 0.55 + ], + [ + 3164, + 0.55 + ], + [ + 3165, + 0.55 + ], + [ + 3166, + 0.7 + ], + [ + 3167, + 0.3 + ], + [ + 3168, + 0.3 + ], + [ + 3169, + 0.3 + ], + [ + 3170, + 0.3 + ], + [ + 3171, + 0.3 + ], + [ + 3172, + 0.3 + ], + [ + 3173, + 0.3 + ], + [ + 3174, + 0.3 + ], + [ + 3175, + 0.5 + ], + [ + 3176, + 0.55 + ], + [ + 3177, + 0.55 + ], + [ + 3178, + 0.55 + ], + [ + 3179, + 0.55 + ], + [ + 3180, + 0.65 + ], + [ + 3181, + 0.55 + ], + [ + 3182, + 0.55 + ], + [ + 3183, + 0.55 + ], + [ + 3184, + 0.55 + ], + [ + 3185, + 0.55 + ], + [ + 3186, + 0.55 + ], + [ + 3187, + 0.55 + ], + [ + 3188, + 0.55 + ], + [ + 3189, + 0.55 + ], + [ + 3190, + 0.7 + ], + [ + 3191, + 0.3 + ], + [ + 3192, + 0.25 + ], + [ + 3193, + 0.25 + ], + [ + 3194, + 0.25 + ], + [ + 3195, + 0.25 + ], + [ + 3196, + 0.25 + ], + [ + 3197, + 0.25 + ], + [ + 3198, + 0.4 + ], + [ + 3199, + 0.3 + ], + [ + 3200, + 0.3 + ], + [ + 3201, + 0.3 + ], + [ + 3202, + 0.3 + ], + [ + 3203, + 0.3 + ], + [ + 3204, + 0.5 + ], + [ + 3205, + 0.3 + ], + [ + 3206, + 0.3 + ], + [ + 3207, + 0.3 + ], + [ + 3208, + 0.3 + ], + [ + 3209, + 0.3 + ], + [ + 3210, + 0.3 + ], + [ + 3211, + 0.3 + ], + [ + 3212, + 0.3 + ], + [ + 3213, + 0.6 + ], + [ + 3214, + 0.25 + ], + [ + 3215, + 0.25 + ], + [ + 3216, + 0.25 + ], + [ + 3217, + 0.25 + ], + [ + 3218, + 0.25 + ], + [ + 3219, + 0.25 + ], + [ + 3220, + 0.25 + ], + [ + 3221, + 0.25 + ], + [ + 3222, + 0.4 + ], + [ + 3223, + 0.3 + ], + [ + 3224, + 0.3 + ], + [ + 3225, + 0.3 + ], + [ + 3226, + 0.3 + ], + [ + 3227, + 0.3 + ], + [ + 3228, + 0.5 + ], + [ + 3229, + 0.3 + ], + [ + 3230, + 0.3 + ], + [ + 3231, + 0.3 + ], + [ + 3232, + 0.3 + ], + [ + 3233, + 0.3 + ], + [ + 3234, + 0.3 + ], + [ + 3235, + 0.3 + ], + [ + 3236, + 0.3 + ], + [ + 3237, + 0.6 + ], + [ + 3238, + 0.25 + ], + [ + 3239, + 0.25 + ], + [ + 3240, + 0.25 + ], + [ + 3241, + 0.25 + ], + [ + 3242, + 0.25 + ], + [ + 3243, + 0.25 + ], + [ + 3244, + 0.25 + ], + [ + 3245, + 0.25 + ], + [ + 3246, + 0.4 + ], + [ + 3247, + 0.3 + ], + [ + 3248, + 0.3 + ], + [ + 3249, + 0.3 + ], + [ + 3250, + 0.3 + ], + [ + 3251, + 0.3 + ], + [ + 3252, + 0.5 + ], + [ + 3253, + 0.3 + ], + [ + 3254, + 0.3 + ], + [ + 3255, + 0.3 + ], + [ + 3256, + 0.3 + ], + [ + 3257, + 0.3 + ], + [ + 3258, + 0.3 + ], + [ + 3259, + 0.3 + ], + [ + 3260, + 0.3 + ], + [ + 3261, + 0.6 + ], + [ + 3262, + 0.25 + ], + [ + 3263, + 0.25 + ], + [ + 3264, + 0.25 + ], + [ + 3265, + 0.25 + ], + [ + 3266, + 0.25 + ], + [ + 3267, + 0.25 + ], + [ + 3268, + 0.25 + ], + [ + 3269, + 0.25 + ], + [ + 3270, + 0.4 + ], + [ + 3271, + 0.3 + ], + [ + 3272, + 0.3 + ], + [ + 3273, + 0.3 + ], + [ + 3274, + 0.3 + ], + [ + 3275, + 0.3 + ], + [ + 3276, + 0.5 + ], + [ + 3277, + 0.3 + ], + [ + 3278, + 0.3 + ], + [ + 3279, + 0.3 + ], + [ + 3280, + 0.3 + ], + [ + 3281, + 0.3 + ], + [ + 3282, + 0.3 + ], + [ + 3283, + 0.3 + ], + [ + 3284, + 0.3 + ], + [ + 3285, + 0.6 + ], + [ + 3286, + 0.25 + ], + [ + 3287, + 0.25 + ], + [ + 3288, + 0.25 + ], + [ + 3289, + 0.25 + ], + [ + 3290, + 0.25 + ], + [ + 3291, + 0.25 + ], + [ + 3292, + 0.25 + ], + [ + 3293, + 0.25 + ], + [ + 3294, + 0.4 + ], + [ + 3295, + 0.3 + ], + [ + 3296, + 0.3 + ], + [ + 3297, + 0.3 + ], + [ + 3298, + 0.3 + ], + [ + 3299, + 0.3 + ], + [ + 3300, + 0.5 + ], + [ + 3301, + 0.3 + ], + [ + 3302, + 0.3 + ], + [ + 3303, + 0.3 + ], + [ + 3304, + 0.3 + ], + [ + 3305, + 0.3 + ], + [ + 3306, + 0.3 + ], + [ + 3307, + 0.3 + ], + [ + 3308, + 0.3 + ], + [ + 3309, + 0.6 + ], + [ + 3310, + 0.25 + ], + [ + 3311, + 0.25 + ], + [ + 3312, + 0.3 + ], + [ + 3313, + 0.3 + ], + [ + 3314, + 0.3 + ], + [ + 3315, + 0.3 + ], + [ + 3316, + 0.3 + ], + [ + 3317, + 0.3 + ], + [ + 3318, + 0.3 + ], + [ + 3319, + 0.5 + ], + [ + 3320, + 0.55 + ], + [ + 3321, + 0.55 + ], + [ + 3322, + 0.55 + ], + [ + 3323, + 0.55 + ], + [ + 3324, + 0.65 + ], + [ + 3325, + 0.55 + ], + [ + 3326, + 0.55 + ], + [ + 3327, + 0.55 + ], + [ + 3328, + 0.55 + ], + [ + 3329, + 0.55 + ], + [ + 3330, + 0.55 + ], + [ + 3331, + 0.55 + ], + [ + 3332, + 0.55 + ], + [ + 3333, + 0.55 + ], + [ + 3334, + 0.7 + ], + [ + 3335, + 0.3 + ], + [ + 3336, + 0.3 + ], + [ + 3337, + 0.3 + ], + [ + 3338, + 0.3 + ], + [ + 3339, + 0.3 + ], + [ + 3340, + 0.3 + ], + [ + 3341, + 0.3 + ], + [ + 3342, + 0.3 + ], + [ + 3343, + 0.5 + ], + [ + 3344, + 0.55 + ], + [ + 3345, + 0.55 + ], + [ + 3346, + 0.55 + ], + [ + 3347, + 0.55 + ], + [ + 3348, + 0.65 + ], + [ + 3349, + 0.55 + ], + [ + 3350, + 0.55 + ], + [ + 3351, + 0.55 + ], + [ + 3352, + 0.55 + ], + [ + 3353, + 0.55 + ], + [ + 3354, + 0.55 + ], + [ + 3355, + 0.55 + ], + [ + 3356, + 0.55 + ], + [ + 3357, + 0.55 + ], + [ + 3358, + 0.7 + ], + [ + 3359, + 0.3 + ], + [ + 3360, + 0.25 + ], + [ + 3361, + 0.25 + ], + [ + 3362, + 0.25 + ], + [ + 3363, + 0.25 + ], + [ + 3364, + 0.25 + ], + [ + 3365, + 0.25 + ], + [ + 3366, + 0.4 + ], + [ + 3367, + 0.3 + ], + [ + 3368, + 0.3 + ], + [ + 3369, + 0.3 + ], + [ + 3370, + 0.3 + ], + [ + 3371, + 0.3 + ], + [ + 3372, + 0.5 + ], + [ + 3373, + 0.3 + ], + [ + 3374, + 0.3 + ], + [ + 3375, + 0.3 + ], + [ + 3376, + 0.3 + ], + [ + 3377, + 0.3 + ], + [ + 3378, + 0.3 + ], + [ + 3379, + 0.3 + ], + [ + 3380, + 0.3 + ], + [ + 3381, + 0.6 + ], + [ + 3382, + 0.25 + ], + [ + 3383, + 0.25 + ], + [ + 3384, + 0.25 + ], + [ + 3385, + 0.25 + ], + [ + 3386, + 0.25 + ], + [ + 3387, + 0.25 + ], + [ + 3388, + 0.25 + ], + [ + 3389, + 0.25 + ], + [ + 3390, + 0.4 + ], + [ + 3391, + 0.3 + ], + [ + 3392, + 0.3 + ], + [ + 3393, + 0.3 + ], + [ + 3394, + 0.3 + ], + [ + 3395, + 0.3 + ], + [ + 3396, + 0.5 + ], + [ + 3397, + 0.3 + ], + [ + 3398, + 0.3 + ], + [ + 3399, + 0.3 + ], + [ + 3400, + 0.3 + ], + [ + 3401, + 0.3 + ], + [ + 3402, + 0.3 + ], + [ + 3403, + 0.3 + ], + [ + 3404, + 0.3 + ], + [ + 3405, + 0.6 + ], + [ + 3406, + 0.25 + ], + [ + 3407, + 0.25 + ], + [ + 3408, + 0.25 + ], + [ + 3409, + 0.25 + ], + [ + 3410, + 0.25 + ], + [ + 3411, + 0.25 + ], + [ + 3412, + 0.25 + ], + [ + 3413, + 0.25 + ], + [ + 3414, + 0.4 + ], + [ + 3415, + 0.3 + ], + [ + 3416, + 0.3 + ], + [ + 3417, + 0.3 + ], + [ + 3418, + 0.3 + ], + [ + 3419, + 0.3 + ], + [ + 3420, + 0.5 + ], + [ + 3421, + 0.3 + ], + [ + 3422, + 0.3 + ], + [ + 3423, + 0.3 + ], + [ + 3424, + 0.3 + ], + [ + 3425, + 0.3 + ], + [ + 3426, + 0.3 + ], + [ + 3427, + 0.3 + ], + [ + 3428, + 0.3 + ], + [ + 3429, + 0.6 + ], + [ + 3430, + 0.25 + ], + [ + 3431, + 0.25 + ], + [ + 3432, + 0.25 + ], + [ + 3433, + 0.25 + ], + [ + 3434, + 0.25 + ], + [ + 3435, + 0.25 + ], + [ + 3436, + 0.25 + ], + [ + 3437, + 0.25 + ], + [ + 3438, + 0.4 + ], + [ + 3439, + 0.3 + ], + [ + 3440, + 0.3 + ], + [ + 3441, + 0.3 + ], + [ + 3442, + 0.3 + ], + [ + 3443, + 0.3 + ], + [ + 3444, + 0.5 + ], + [ + 3445, + 0.3 + ], + [ + 3446, + 0.3 + ], + [ + 3447, + 0.3 + ], + [ + 3448, + 0.3 + ], + [ + 3449, + 0.3 + ], + [ + 3450, + 0.3 + ], + [ + 3451, + 0.3 + ], + [ + 3452, + 0.3 + ], + [ + 3453, + 0.6 + ], + [ + 3454, + 0.25 + ], + [ + 3455, + 0.25 + ], + [ + 3456, + 0.25 + ], + [ + 3457, + 0.25 + ], + [ + 3458, + 0.25 + ], + [ + 3459, + 0.25 + ], + [ + 3460, + 0.25 + ], + [ + 3461, + 0.25 + ], + [ + 3462, + 0.4 + ], + [ + 3463, + 0.3 + ], + [ + 3464, + 0.3 + ], + [ + 3465, + 0.3 + ], + [ + 3466, + 0.3 + ], + [ + 3467, + 0.3 + ], + [ + 3468, + 0.5 + ], + [ + 3469, + 0.3 + ], + [ + 3470, + 0.3 + ], + [ + 3471, + 0.3 + ], + [ + 3472, + 0.3 + ], + [ + 3473, + 0.3 + ], + [ + 3474, + 0.3 + ], + [ + 3475, + 0.3 + ], + [ + 3476, + 0.3 + ], + [ + 3477, + 0.6 + ], + [ + 3478, + 0.25 + ], + [ + 3479, + 0.25 + ], + [ + 3480, + 0.3 + ], + [ + 3481, + 0.3 + ], + [ + 3482, + 0.3 + ], + [ + 3483, + 0.3 + ], + [ + 3484, + 0.3 + ], + [ + 3485, + 0.3 + ], + [ + 3486, + 0.3 + ], + [ + 3487, + 0.5 + ], + [ + 3488, + 0.55 + ], + [ + 3489, + 0.55 + ], + [ + 3490, + 0.55 + ], + [ + 3491, + 0.55 + ], + [ + 3492, + 0.65 + ], + [ + 3493, + 0.55 + ], + [ + 3494, + 0.55 + ], + [ + 3495, + 0.55 + ], + [ + 3496, + 0.55 + ], + [ + 3497, + 0.55 + ], + [ + 3498, + 0.55 + ], + [ + 3499, + 0.55 + ], + [ + 3500, + 0.55 + ], + [ + 3501, + 0.55 + ], + [ + 3502, + 0.7 + ], + [ + 3503, + 0.3 + ], + [ + 3504, + 0.3 + ], + [ + 3505, + 0.3 + ], + [ + 3506, + 0.3 + ], + [ + 3507, + 0.3 + ], + [ + 3508, + 0.3 + ], + [ + 3509, + 0.3 + ], + [ + 3510, + 0.3 + ], + [ + 3511, + 0.5 + ], + [ + 3512, + 0.55 + ], + [ + 3513, + 0.55 + ], + [ + 3514, + 0.55 + ], + [ + 3515, + 0.55 + ], + [ + 3516, + 0.65 + ], + [ + 3517, + 0.55 + ], + [ + 3518, + 0.55 + ], + [ + 3519, + 0.55 + ], + [ + 3520, + 0.55 + ], + [ + 3521, + 0.55 + ], + [ + 3522, + 0.55 + ], + [ + 3523, + 0.55 + ], + [ + 3524, + 0.55 + ], + [ + 3525, + 0.55 + ], + [ + 3526, + 0.7 + ], + [ + 3527, + 0.3 + ], + [ + 3528, + 0.25 + ], + [ + 3529, + 0.25 + ], + [ + 3530, + 0.25 + ], + [ + 3531, + 0.25 + ], + [ + 3532, + 0.25 + ], + [ + 3533, + 0.25 + ], + [ + 3534, + 0.4 + ], + [ + 3535, + 0.3 + ], + [ + 3536, + 0.3 + ], + [ + 3537, + 0.3 + ], + [ + 3538, + 0.3 + ], + [ + 3539, + 0.3 + ], + [ + 3540, + 0.5 + ], + [ + 3541, + 0.3 + ], + [ + 3542, + 0.3 + ], + [ + 3543, + 0.3 + ], + [ + 3544, + 0.3 + ], + [ + 3545, + 0.3 + ], + [ + 3546, + 0.3 + ], + [ + 3547, + 0.3 + ], + [ + 3548, + 0.3 + ], + [ + 3549, + 0.6 + ], + [ + 3550, + 0.25 + ], + [ + 3551, + 0.25 + ], + [ + 3552, + 0.25 + ], + [ + 3553, + 0.25 + ], + [ + 3554, + 0.25 + ], + [ + 3555, + 0.25 + ], + [ + 3556, + 0.25 + ], + [ + 3557, + 0.25 + ], + [ + 3558, + 0.4 + ], + [ + 3559, + 0.3 + ], + [ + 3560, + 0.3 + ], + [ + 3561, + 0.3 + ], + [ + 3562, + 0.3 + ], + [ + 3563, + 0.3 + ], + [ + 3564, + 0.5 + ], + [ + 3565, + 0.3 + ], + [ + 3566, + 0.3 + ], + [ + 3567, + 0.3 + ], + [ + 3568, + 0.3 + ], + [ + 3569, + 0.3 + ], + [ + 3570, + 0.3 + ], + [ + 3571, + 0.3 + ], + [ + 3572, + 0.3 + ], + [ + 3573, + 0.6 + ], + [ + 3574, + 0.25 + ], + [ + 3575, + 0.25 + ], + [ + 3576, + 0.25 + ], + [ + 3577, + 0.25 + ], + [ + 3578, + 0.25 + ], + [ + 3579, + 0.25 + ], + [ + 3580, + 0.25 + ], + [ + 3581, + 0.25 + ], + [ + 3582, + 0.4 + ], + [ + 3583, + 0.3 + ], + [ + 3584, + 0.3 + ], + [ + 3585, + 0.3 + ], + [ + 3586, + 0.3 + ], + [ + 3587, + 0.3 + ], + [ + 3588, + 0.5 + ], + [ + 3589, + 0.3 + ], + [ + 3590, + 0.3 + ], + [ + 3591, + 0.3 + ], + [ + 3592, + 0.3 + ], + [ + 3593, + 0.3 + ], + [ + 3594, + 0.3 + ], + [ + 3595, + 0.3 + ], + [ + 3596, + 0.3 + ], + [ + 3597, + 0.6 + ], + [ + 3598, + 0.25 + ], + [ + 3599, + 0.25 + ], + [ + 3600, + 0.25 + ], + [ + 3601, + 0.25 + ], + [ + 3602, + 0.25 + ], + [ + 3603, + 0.25 + ], + [ + 3604, + 0.25 + ], + [ + 3605, + 0.25 + ], + [ + 3606, + 0.4 + ], + [ + 3607, + 0.3 + ], + [ + 3608, + 0.3 + ], + [ + 3609, + 0.3 + ], + [ + 3610, + 0.3 + ], + [ + 3611, + 0.3 + ], + [ + 3612, + 0.5 + ], + [ + 3613, + 0.3 + ], + [ + 3614, + 0.3 + ], + [ + 3615, + 0.3 + ], + [ + 3616, + 0.3 + ], + [ + 3617, + 0.3 + ], + [ + 3618, + 0.3 + ], + [ + 3619, + 0.3 + ], + [ + 3620, + 0.3 + ], + [ + 3621, + 0.6 + ], + [ + 3622, + 0.25 + ], + [ + 3623, + 0.25 + ], + [ + 3624, + 0.25 + ], + [ + 3625, + 0.25 + ], + [ + 3626, + 0.25 + ], + [ + 3627, + 0.25 + ], + [ + 3628, + 0.25 + ], + [ + 3629, + 0.25 + ], + [ + 3630, + 0.4 + ], + [ + 3631, + 0.3 + ], + [ + 3632, + 0.3 + ], + [ + 3633, + 0.3 + ], + [ + 3634, + 0.3 + ], + [ + 3635, + 0.3 + ], + [ + 3636, + 0.5 + ], + [ + 3637, + 0.3 + ], + [ + 3638, + 0.3 + ], + [ + 3639, + 0.3 + ], + [ + 3640, + 0.3 + ], + [ + 3641, + 0.3 + ], + [ + 3642, + 0.3 + ], + [ + 3643, + 0.3 + ], + [ + 3644, + 0.3 + ], + [ + 3645, + 0.6 + ], + [ + 3646, + 0.25 + ], + [ + 3647, + 0.25 + ], + [ + 3648, + 0.3 + ], + [ + 3649, + 0.3 + ], + [ + 3650, + 0.3 + ], + [ + 3651, + 0.3 + ], + [ + 3652, + 0.3 + ], + [ + 3653, + 0.3 + ], + [ + 3654, + 0.3 + ], + [ + 3655, + 0.5 + ], + [ + 3656, + 0.55 + ], + [ + 3657, + 0.55 + ], + [ + 3658, + 0.55 + ], + [ + 3659, + 0.55 + ], + [ + 3660, + 0.65 + ], + [ + 3661, + 0.55 + ], + [ + 3662, + 0.55 + ], + [ + 3663, + 0.55 + ], + [ + 3664, + 0.55 + ], + [ + 3665, + 0.55 + ], + [ + 3666, + 0.55 + ], + [ + 3667, + 0.55 + ], + [ + 3668, + 0.55 + ], + [ + 3669, + 0.55 + ], + [ + 3670, + 0.7 + ], + [ + 3671, + 0.3 + ], + [ + 3672, + 0.3 + ], + [ + 3673, + 0.3 + ], + [ + 3674, + 0.3 + ], + [ + 3675, + 0.3 + ], + [ + 3676, + 0.3 + ], + [ + 3677, + 0.3 + ], + [ + 3678, + 0.3 + ], + [ + 3679, + 0.5 + ], + [ + 3680, + 0.55 + ], + [ + 3681, + 0.55 + ], + [ + 3682, + 0.55 + ], + [ + 3683, + 0.55 + ], + [ + 3684, + 0.65 + ], + [ + 3685, + 0.55 + ], + [ + 3686, + 0.55 + ], + [ + 3687, + 0.55 + ], + [ + 3688, + 0.55 + ], + [ + 3689, + 0.55 + ], + [ + 3690, + 0.55 + ], + [ + 3691, + 0.55 + ], + [ + 3692, + 0.55 + ], + [ + 3693, + 0.55 + ], + [ + 3694, + 0.7 + ], + [ + 3695, + 0.3 + ], + [ + 3696, + 0.25 + ], + [ + 3697, + 0.25 + ], + [ + 3698, + 0.25 + ], + [ + 3699, + 0.25 + ], + [ + 3700, + 0.25 + ], + [ + 3701, + 0.25 + ], + [ + 3702, + 0.4 + ], + [ + 3703, + 0.3 + ], + [ + 3704, + 0.3 + ], + [ + 3705, + 0.3 + ], + [ + 3706, + 0.3 + ], + [ + 3707, + 0.3 + ], + [ + 3708, + 0.5 + ], + [ + 3709, + 0.3 + ], + [ + 3710, + 0.3 + ], + [ + 3711, + 0.3 + ], + [ + 3712, + 0.3 + ], + [ + 3713, + 0.3 + ], + [ + 3714, + 0.3 + ], + [ + 3715, + 0.3 + ], + [ + 3716, + 0.3 + ], + [ + 3717, + 0.6 + ], + [ + 3718, + 0.25 + ], + [ + 3719, + 0.25 + ], + [ + 3720, + 0.25 + ], + [ + 3721, + 0.25 + ], + [ + 3722, + 0.25 + ], + [ + 3723, + 0.25 + ], + [ + 3724, + 0.25 + ], + [ + 3725, + 0.25 + ], + [ + 3726, + 0.4 + ], + [ + 3727, + 0.3 + ], + [ + 3728, + 0.3 + ], + [ + 3729, + 0.3 + ], + [ + 3730, + 0.3 + ], + [ + 3731, + 0.3 + ], + [ + 3732, + 0.5 + ], + [ + 3733, + 0.3 + ], + [ + 3734, + 0.3 + ], + [ + 3735, + 0.3 + ], + [ + 3736, + 0.3 + ], + [ + 3737, + 0.3 + ], + [ + 3738, + 0.3 + ], + [ + 3739, + 0.3 + ], + [ + 3740, + 0.3 + ], + [ + 3741, + 0.6 + ], + [ + 3742, + 0.25 + ], + [ + 3743, + 0.25 + ], + [ + 3744, + 0.25 + ], + [ + 3745, + 0.25 + ], + [ + 3746, + 0.25 + ], + [ + 3747, + 0.25 + ], + [ + 3748, + 0.25 + ], + [ + 3749, + 0.25 + ], + [ + 3750, + 0.4 + ], + [ + 3751, + 0.3 + ], + [ + 3752, + 0.3 + ], + [ + 3753, + 0.3 + ], + [ + 3754, + 0.3 + ], + [ + 3755, + 0.3 + ], + [ + 3756, + 0.5 + ], + [ + 3757, + 0.3 + ], + [ + 3758, + 0.3 + ], + [ + 3759, + 0.3 + ], + [ + 3760, + 0.3 + ], + [ + 3761, + 0.3 + ], + [ + 3762, + 0.3 + ], + [ + 3763, + 0.3 + ], + [ + 3764, + 0.3 + ], + [ + 3765, + 0.6 + ], + [ + 3766, + 0.25 + ], + [ + 3767, + 0.25 + ], + [ + 3768, + 0.25 + ], + [ + 3769, + 0.25 + ], + [ + 3770, + 0.25 + ], + [ + 3771, + 0.25 + ], + [ + 3772, + 0.25 + ], + [ + 3773, + 0.25 + ], + [ + 3774, + 0.4 + ], + [ + 3775, + 0.3 + ], + [ + 3776, + 0.3 + ], + [ + 3777, + 0.3 + ], + [ + 3778, + 0.3 + ], + [ + 3779, + 0.3 + ], + [ + 3780, + 0.5 + ], + [ + 3781, + 0.3 + ], + [ + 3782, + 0.3 + ], + [ + 3783, + 0.3 + ], + [ + 3784, + 0.3 + ], + [ + 3785, + 0.3 + ], + [ + 3786, + 0.3 + ], + [ + 3787, + 0.3 + ], + [ + 3788, + 0.3 + ], + [ + 3789, + 0.6 + ], + [ + 3790, + 0.25 + ], + [ + 3791, + 0.25 + ], + [ + 3792, + 0.25 + ], + [ + 3793, + 0.25 + ], + [ + 3794, + 0.25 + ], + [ + 3795, + 0.25 + ], + [ + 3796, + 0.25 + ], + [ + 3797, + 0.25 + ], + [ + 3798, + 0.4 + ], + [ + 3799, + 0.3 + ], + [ + 3800, + 0.3 + ], + [ + 3801, + 0.3 + ], + [ + 3802, + 0.3 + ], + [ + 3803, + 0.3 + ], + [ + 3804, + 0.5 + ], + [ + 3805, + 0.3 + ], + [ + 3806, + 0.3 + ], + [ + 3807, + 0.3 + ], + [ + 3808, + 0.3 + ], + [ + 3809, + 0.3 + ], + [ + 3810, + 0.3 + ], + [ + 3811, + 0.3 + ], + [ + 3812, + 0.3 + ], + [ + 3813, + 0.6 + ], + [ + 3814, + 0.25 + ], + [ + 3815, + 0.25 + ], + [ + 3816, + 0.3 + ], + [ + 3817, + 0.3 + ], + [ + 3818, + 0.3 + ], + [ + 3819, + 0.3 + ], + [ + 3820, + 0.3 + ], + [ + 3821, + 0.3 + ], + [ + 3822, + 0.3 + ], + [ + 3823, + 0.5 + ], + [ + 3824, + 0.55 + ], + [ + 3825, + 0.55 + ], + [ + 3826, + 0.55 + ], + [ + 3827, + 0.55 + ], + [ + 3828, + 0.65 + ], + [ + 3829, + 0.55 + ], + [ + 3830, + 0.55 + ], + [ + 3831, + 0.55 + ], + [ + 3832, + 0.55 + ], + [ + 3833, + 0.55 + ], + [ + 3834, + 0.55 + ], + [ + 3835, + 0.55 + ], + [ + 3836, + 0.55 + ], + [ + 3837, + 0.55 + ], + [ + 3838, + 0.7 + ], + [ + 3839, + 0.3 + ], + [ + 3840, + 0.3 + ], + [ + 3841, + 0.3 + ], + [ + 3842, + 0.3 + ], + [ + 3843, + 0.3 + ], + [ + 3844, + 0.3 + ], + [ + 3845, + 0.3 + ], + [ + 3846, + 0.3 + ], + [ + 3847, + 0.5 + ], + [ + 3848, + 0.55 + ], + [ + 3849, + 0.55 + ], + [ + 3850, + 0.55 + ], + [ + 3851, + 0.55 + ], + [ + 3852, + 0.65 + ], + [ + 3853, + 0.55 + ], + [ + 3854, + 0.55 + ], + [ + 3855, + 0.55 + ], + [ + 3856, + 0.55 + ], + [ + 3857, + 0.55 + ], + [ + 3858, + 0.55 + ], + [ + 3859, + 0.55 + ], + [ + 3860, + 0.55 + ], + [ + 3861, + 0.55 + ], + [ + 3862, + 0.7 + ], + [ + 3863, + 0.3 + ], + [ + 3864, + 0.25 + ], + [ + 3865, + 0.25 + ], + [ + 3866, + 0.25 + ], + [ + 3867, + 0.25 + ], + [ + 3868, + 0.25 + ], + [ + 3869, + 0.25 + ], + [ + 3870, + 0.4 + ], + [ + 3871, + 0.3 + ], + [ + 3872, + 0.3 + ], + [ + 3873, + 0.3 + ], + [ + 3874, + 0.3 + ], + [ + 3875, + 0.3 + ], + [ + 3876, + 0.5 + ], + [ + 3877, + 0.3 + ], + [ + 3878, + 0.3 + ], + [ + 3879, + 0.3 + ], + [ + 3880, + 0.3 + ], + [ + 3881, + 0.3 + ], + [ + 3882, + 0.3 + ], + [ + 3883, + 0.3 + ], + [ + 3884, + 0.3 + ], + [ + 3885, + 0.6 + ], + [ + 3886, + 0.25 + ], + [ + 3887, + 0.25 + ], + [ + 3888, + 0.25 + ], + [ + 3889, + 0.25 + ], + [ + 3890, + 0.25 + ], + [ + 3891, + 0.25 + ], + [ + 3892, + 0.25 + ], + [ + 3893, + 0.25 + ], + [ + 3894, + 0.4 + ], + [ + 3895, + 0.3 + ], + [ + 3896, + 0.3 + ], + [ + 3897, + 0.3 + ], + [ + 3898, + 0.3 + ], + [ + 3899, + 0.3 + ], + [ + 3900, + 0.5 + ], + [ + 3901, + 0.3 + ], + [ + 3902, + 0.3 + ], + [ + 3903, + 0.3 + ], + [ + 3904, + 0.3 + ], + [ + 3905, + 0.3 + ], + [ + 3906, + 0.3 + ], + [ + 3907, + 0.3 + ], + [ + 3908, + 0.3 + ], + [ + 3909, + 0.6 + ], + [ + 3910, + 0.25 + ], + [ + 3911, + 0.25 + ], + [ + 3912, + 0.25 + ], + [ + 3913, + 0.25 + ], + [ + 3914, + 0.25 + ], + [ + 3915, + 0.25 + ], + [ + 3916, + 0.25 + ], + [ + 3917, + 0.25 + ], + [ + 3918, + 0.4 + ], + [ + 3919, + 0.3 + ], + [ + 3920, + 0.3 + ], + [ + 3921, + 0.3 + ], + [ + 3922, + 0.3 + ], + [ + 3923, + 0.3 + ], + [ + 3924, + 0.5 + ], + [ + 3925, + 0.3 + ], + [ + 3926, + 0.3 + ], + [ + 3927, + 0.3 + ], + [ + 3928, + 0.3 + ], + [ + 3929, + 0.3 + ], + [ + 3930, + 0.3 + ], + [ + 3931, + 0.3 + ], + [ + 3932, + 0.3 + ], + [ + 3933, + 0.6 + ], + [ + 3934, + 0.25 + ], + [ + 3935, + 0.25 + ], + [ + 3936, + 0.25 + ], + [ + 3937, + 0.25 + ], + [ + 3938, + 0.25 + ], + [ + 3939, + 0.25 + ], + [ + 3940, + 0.25 + ], + [ + 3941, + 0.25 + ], + [ + 3942, + 0.4 + ], + [ + 3943, + 0.3 + ], + [ + 3944, + 0.3 + ], + [ + 3945, + 0.3 + ], + [ + 3946, + 0.3 + ], + [ + 3947, + 0.3 + ], + [ + 3948, + 0.5 + ], + [ + 3949, + 0.3 + ], + [ + 3950, + 0.3 + ], + [ + 3951, + 0.3 + ], + [ + 3952, + 0.3 + ], + [ + 3953, + 0.3 + ], + [ + 3954, + 0.3 + ], + [ + 3955, + 0.3 + ], + [ + 3956, + 0.3 + ], + [ + 3957, + 0.6 + ], + [ + 3958, + 0.25 + ], + [ + 3959, + 0.25 + ], + [ + 3960, + 0.25 + ], + [ + 3961, + 0.25 + ], + [ + 3962, + 0.25 + ], + [ + 3963, + 0.25 + ], + [ + 3964, + 0.25 + ], + [ + 3965, + 0.25 + ], + [ + 3966, + 0.4 + ], + [ + 3967, + 0.3 + ], + [ + 3968, + 0.3 + ], + [ + 3969, + 0.3 + ], + [ + 3970, + 0.3 + ], + [ + 3971, + 0.3 + ], + [ + 3972, + 0.5 + ], + [ + 3973, + 0.3 + ], + [ + 3974, + 0.3 + ], + [ + 3975, + 0.3 + ], + [ + 3976, + 0.3 + ], + [ + 3977, + 0.3 + ], + [ + 3978, + 0.3 + ], + [ + 3979, + 0.3 + ], + [ + 3980, + 0.3 + ], + [ + 3981, + 0.6 + ], + [ + 3982, + 0.25 + ], + [ + 3983, + 0.25 + ], + [ + 3984, + 0.3 + ], + [ + 3985, + 0.3 + ], + [ + 3986, + 0.3 + ], + [ + 3987, + 0.3 + ], + [ + 3988, + 0.3 + ], + [ + 3989, + 0.3 + ], + [ + 3990, + 0.3 + ], + [ + 3991, + 0.5 + ], + [ + 3992, + 0.55 + ], + [ + 3993, + 0.55 + ], + [ + 3994, + 0.55 + ], + [ + 3995, + 0.55 + ], + [ + 3996, + 0.65 + ], + [ + 3997, + 0.55 + ], + [ + 3998, + 0.55 + ], + [ + 3999, + 0.55 + ], + [ + 4000, + 0.55 + ], + [ + 4001, + 0.55 + ], + [ + 4002, + 0.55 + ], + [ + 4003, + 0.55 + ], + [ + 4004, + 0.55 + ], + [ + 4005, + 0.55 + ], + [ + 4006, + 0.7 + ], + [ + 4007, + 0.3 + ], + [ + 4008, + 0.3 + ], + [ + 4009, + 0.3 + ], + [ + 4010, + 0.3 + ], + [ + 4011, + 0.3 + ], + [ + 4012, + 0.3 + ], + [ + 4013, + 0.3 + ], + [ + 4014, + 0.3 + ], + [ + 4015, + 0.5 + ], + [ + 4016, + 0.55 + ], + [ + 4017, + 0.55 + ], + [ + 4018, + 0.55 + ], + [ + 4019, + 0.55 + ], + [ + 4020, + 0.65 + ], + [ + 4021, + 0.55 + ], + [ + 4022, + 0.55 + ], + [ + 4023, + 0.55 + ], + [ + 4024, + 0.55 + ], + [ + 4025, + 0.55 + ], + [ + 4026, + 0.55 + ], + [ + 4027, + 0.55 + ], + [ + 4028, + 0.55 + ], + [ + 4029, + 0.55 + ], + [ + 4030, + 0.7 + ], + [ + 4031, + 0.3 + ], + [ + 4032, + 0.25 + ], + [ + 4033, + 0.25 + ], + [ + 4034, + 0.25 + ], + [ + 4035, + 0.25 + ], + [ + 4036, + 0.25 + ], + [ + 4037, + 0.25 + ], + [ + 4038, + 0.4 + ], + [ + 4039, + 0.3 + ], + [ + 4040, + 0.3 + ], + [ + 4041, + 0.3 + ], + [ + 4042, + 0.3 + ], + [ + 4043, + 0.3 + ], + [ + 4044, + 0.5 + ], + [ + 4045, + 0.3 + ], + [ + 4046, + 0.3 + ], + [ + 4047, + 0.3 + ], + [ + 4048, + 0.3 + ], + [ + 4049, + 0.3 + ], + [ + 4050, + 0.3 + ], + [ + 4051, + 0.3 + ], + [ + 4052, + 0.3 + ], + [ + 4053, + 0.6 + ], + [ + 4054, + 0.25 + ], + [ + 4055, + 0.25 + ], + [ + 4056, + 0.25 + ], + [ + 4057, + 0.25 + ], + [ + 4058, + 0.25 + ], + [ + 4059, + 0.25 + ], + [ + 4060, + 0.25 + ], + [ + 4061, + 0.25 + ], + [ + 4062, + 0.4 + ], + [ + 4063, + 0.3 + ], + [ + 4064, + 0.3 + ], + [ + 4065, + 0.3 + ], + [ + 4066, + 0.3 + ], + [ + 4067, + 0.3 + ], + [ + 4068, + 0.5 + ], + [ + 4069, + 0.3 + ], + [ + 4070, + 0.3 + ], + [ + 4071, + 0.3 + ], + [ + 4072, + 0.3 + ], + [ + 4073, + 0.3 + ], + [ + 4074, + 0.3 + ], + [ + 4075, + 0.3 + ], + [ + 4076, + 0.3 + ], + [ + 4077, + 0.6 + ], + [ + 4078, + 0.25 + ], + [ + 4079, + 0.25 + ], + [ + 4080, + 0.25 + ], + [ + 4081, + 0.25 + ], + [ + 4082, + 0.25 + ], + [ + 4083, + 0.25 + ], + [ + 4084, + 0.25 + ], + [ + 4085, + 0.25 + ], + [ + 4086, + 0.4 + ], + [ + 4087, + 0.3 + ], + [ + 4088, + 0.3 + ], + [ + 4089, + 0.3 + ], + [ + 4090, + 0.3 + ], + [ + 4091, + 0.3 + ], + [ + 4092, + 0.5 + ], + [ + 4093, + 0.3 + ], + [ + 4094, + 0.3 + ], + [ + 4095, + 0.3 + ], + [ + 4096, + 0.3 + ], + [ + 4097, + 0.3 + ], + [ + 4098, + 0.3 + ], + [ + 4099, + 0.3 + ], + [ + 4100, + 0.3 + ], + [ + 4101, + 0.6 + ], + [ + 4102, + 0.25 + ], + [ + 4103, + 0.25 + ], + [ + 4104, + 0.25 + ], + [ + 4105, + 0.25 + ], + [ + 4106, + 0.25 + ], + [ + 4107, + 0.25 + ], + [ + 4108, + 0.25 + ], + [ + 4109, + 0.25 + ], + [ + 4110, + 0.4 + ], + [ + 4111, + 0.3 + ], + [ + 4112, + 0.3 + ], + [ + 4113, + 0.3 + ], + [ + 4114, + 0.3 + ], + [ + 4115, + 0.3 + ], + [ + 4116, + 0.5 + ], + [ + 4117, + 0.3 + ], + [ + 4118, + 0.3 + ], + [ + 4119, + 0.3 + ], + [ + 4120, + 0.3 + ], + [ + 4121, + 0.3 + ], + [ + 4122, + 0.3 + ], + [ + 4123, + 0.3 + ], + [ + 4124, + 0.3 + ], + [ + 4125, + 0.6 + ], + [ + 4126, + 0.25 + ], + [ + 4127, + 0.25 + ], + [ + 4128, + 0.25 + ], + [ + 4129, + 0.25 + ], + [ + 4130, + 0.25 + ], + [ + 4131, + 0.25 + ], + [ + 4132, + 0.25 + ], + [ + 4133, + 0.25 + ], + [ + 4134, + 0.4 + ], + [ + 4135, + 0.3 + ], + [ + 4136, + 0.3 + ], + [ + 4137, + 0.3 + ], + [ + 4138, + 0.3 + ], + [ + 4139, + 0.3 + ], + [ + 4140, + 0.5 + ], + [ + 4141, + 0.3 + ], + [ + 4142, + 0.3 + ], + [ + 4143, + 0.3 + ], + [ + 4144, + 0.3 + ], + [ + 4145, + 0.3 + ], + [ + 4146, + 0.3 + ], + [ + 4147, + 0.3 + ], + [ + 4148, + 0.3 + ], + [ + 4149, + 0.6 + ], + [ + 4150, + 0.25 + ], + [ + 4151, + 0.25 + ], + [ + 4152, + 0.3 + ], + [ + 4153, + 0.3 + ], + [ + 4154, + 0.3 + ], + [ + 4155, + 0.3 + ], + [ + 4156, + 0.3 + ], + [ + 4157, + 0.3 + ], + [ + 4158, + 0.3 + ], + [ + 4159, + 0.5 + ], + [ + 4160, + 0.55 + ], + [ + 4161, + 0.55 + ], + [ + 4162, + 0.55 + ], + [ + 4163, + 0.55 + ], + [ + 4164, + 0.65 + ], + [ + 4165, + 0.55 + ], + [ + 4166, + 0.55 + ], + [ + 4167, + 0.55 + ], + [ + 4168, + 0.55 + ], + [ + 4169, + 0.55 + ], + [ + 4170, + 0.55 + ], + [ + 4171, + 0.55 + ], + [ + 4172, + 0.55 + ], + [ + 4173, + 0.55 + ], + [ + 4174, + 0.7 + ], + [ + 4175, + 0.3 + ], + [ + 4176, + 0.3 + ], + [ + 4177, + 0.3 + ], + [ + 4178, + 0.3 + ], + [ + 4179, + 0.3 + ], + [ + 4180, + 0.3 + ], + [ + 4181, + 0.3 + ], + [ + 4182, + 0.3 + ], + [ + 4183, + 0.5 + ], + [ + 4184, + 0.55 + ], + [ + 4185, + 0.55 + ], + [ + 4186, + 0.55 + ], + [ + 4187, + 0.55 + ], + [ + 4188, + 0.65 + ], + [ + 4189, + 0.55 + ], + [ + 4190, + 0.55 + ], + [ + 4191, + 0.55 + ], + [ + 4192, + 0.55 + ], + [ + 4193, + 0.55 + ], + [ + 4194, + 0.55 + ], + [ + 4195, + 0.55 + ], + [ + 4196, + 0.55 + ], + [ + 4197, + 0.55 + ], + [ + 4198, + 0.7 + ], + [ + 4199, + 0.3 + ], + [ + 4200, + 0.25 + ], + [ + 4201, + 0.25 + ], + [ + 4202, + 0.25 + ], + [ + 4203, + 0.25 + ], + [ + 4204, + 0.25 + ], + [ + 4205, + 0.25 + ], + [ + 4206, + 0.4 + ], + [ + 4207, + 0.3 + ], + [ + 4208, + 0.3 + ], + [ + 4209, + 0.3 + ], + [ + 4210, + 0.3 + ], + [ + 4211, + 0.3 + ], + [ + 4212, + 0.5 + ], + [ + 4213, + 0.3 + ], + [ + 4214, + 0.3 + ], + [ + 4215, + 0.3 + ], + [ + 4216, + 0.3 + ], + [ + 4217, + 0.3 + ], + [ + 4218, + 0.3 + ], + [ + 4219, + 0.3 + ], + [ + 4220, + 0.3 + ], + [ + 4221, + 0.6 + ], + [ + 4222, + 0.25 + ], + [ + 4223, + 0.25 + ], + [ + 4224, + 0.25 + ], + [ + 4225, + 0.25 + ], + [ + 4226, + 0.25 + ], + [ + 4227, + 0.25 + ], + [ + 4228, + 0.25 + ], + [ + 4229, + 0.25 + ], + [ + 4230, + 0.4 + ], + [ + 4231, + 0.3 + ], + [ + 4232, + 0.3 + ], + [ + 4233, + 0.3 + ], + [ + 4234, + 0.3 + ], + [ + 4235, + 0.3 + ], + [ + 4236, + 0.5 + ], + [ + 4237, + 0.3 + ], + [ + 4238, + 0.3 + ], + [ + 4239, + 0.3 + ], + [ + 4240, + 0.3 + ], + [ + 4241, + 0.3 + ], + [ + 4242, + 0.3 + ], + [ + 4243, + 0.3 + ], + [ + 4244, + 0.3 + ], + [ + 4245, + 0.6 + ], + [ + 4246, + 0.25 + ], + [ + 4247, + 0.25 + ], + [ + 4248, + 0.25 + ], + [ + 4249, + 0.25 + ], + [ + 4250, + 0.25 + ], + [ + 4251, + 0.25 + ], + [ + 4252, + 0.25 + ], + [ + 4253, + 0.25 + ], + [ + 4254, + 0.4 + ], + [ + 4255, + 0.3 + ], + [ + 4256, + 0.3 + ], + [ + 4257, + 0.3 + ], + [ + 4258, + 0.3 + ], + [ + 4259, + 0.3 + ], + [ + 4260, + 0.5 + ], + [ + 4261, + 0.3 + ], + [ + 4262, + 0.3 + ], + [ + 4263, + 0.3 + ], + [ + 4264, + 0.3 + ], + [ + 4265, + 0.3 + ], + [ + 4266, + 0.3 + ], + [ + 4267, + 0.3 + ], + [ + 4268, + 0.3 + ], + [ + 4269, + 0.6 + ], + [ + 4270, + 0.25 + ], + [ + 4271, + 0.25 + ], + [ + 4272, + 0.25 + ], + [ + 4273, + 0.25 + ], + [ + 4274, + 0.25 + ], + [ + 4275, + 0.25 + ], + [ + 4276, + 0.25 + ], + [ + 4277, + 0.25 + ], + [ + 4278, + 0.4 + ], + [ + 4279, + 0.3 + ], + [ + 4280, + 0.3 + ], + [ + 4281, + 0.3 + ], + [ + 4282, + 0.3 + ], + [ + 4283, + 0.3 + ], + [ + 4284, + 0.5 + ], + [ + 4285, + 0.3 + ], + [ + 4286, + 0.3 + ], + [ + 4287, + 0.3 + ], + [ + 4288, + 0.3 + ], + [ + 4289, + 0.3 + ], + [ + 4290, + 0.3 + ], + [ + 4291, + 0.3 + ], + [ + 4292, + 0.3 + ], + [ + 4293, + 0.6 + ], + [ + 4294, + 0.25 + ], + [ + 4295, + 0.25 + ], + [ + 4296, + 0.25 + ], + [ + 4297, + 0.25 + ], + [ + 4298, + 0.25 + ], + [ + 4299, + 0.25 + ], + [ + 4300, + 0.25 + ], + [ + 4301, + 0.25 + ], + [ + 4302, + 0.4 + ], + [ + 4303, + 0.3 + ], + [ + 4304, + 0.3 + ], + [ + 4305, + 0.3 + ], + [ + 4306, + 0.3 + ], + [ + 4307, + 0.3 + ], + [ + 4308, + 0.5 + ], + [ + 4309, + 0.3 + ], + [ + 4310, + 0.3 + ], + [ + 4311, + 0.3 + ], + [ + 4312, + 0.3 + ], + [ + 4313, + 0.3 + ], + [ + 4314, + 0.3 + ], + [ + 4315, + 0.3 + ], + [ + 4316, + 0.3 + ], + [ + 4317, + 0.6 + ], + [ + 4318, + 0.25 + ], + [ + 4319, + 0.25 + ], + [ + 4320, + 0.3 + ], + [ + 4321, + 0.3 + ], + [ + 4322, + 0.3 + ], + [ + 4323, + 0.3 + ], + [ + 4324, + 0.3 + ], + [ + 4325, + 0.3 + ], + [ + 4326, + 0.3 + ], + [ + 4327, + 0.5 + ], + [ + 4328, + 0.55 + ], + [ + 4329, + 0.55 + ], + [ + 4330, + 0.55 + ], + [ + 4331, + 0.55 + ], + [ + 4332, + 0.65 + ], + [ + 4333, + 0.55 + ], + [ + 4334, + 0.55 + ], + [ + 4335, + 0.55 + ], + [ + 4336, + 0.55 + ], + [ + 4337, + 0.55 + ], + [ + 4338, + 0.55 + ], + [ + 4339, + 0.55 + ], + [ + 4340, + 0.55 + ], + [ + 4341, + 0.55 + ], + [ + 4342, + 0.7 + ], + [ + 4343, + 0.3 + ], + [ + 4344, + 0.3 + ], + [ + 4345, + 0.3 + ], + [ + 4346, + 0.3 + ], + [ + 4347, + 0.3 + ], + [ + 4348, + 0.3 + ], + [ + 4349, + 0.3 + ], + [ + 4350, + 0.3 + ], + [ + 4351, + 0.5 + ], + [ + 4352, + 0.55 + ], + [ + 4353, + 0.55 + ], + [ + 4354, + 0.55 + ], + [ + 4355, + 0.55 + ], + [ + 4356, + 0.65 + ], + [ + 4357, + 0.55 + ], + [ + 4358, + 0.55 + ], + [ + 4359, + 0.55 + ], + [ + 4360, + 0.55 + ], + [ + 4361, + 0.55 + ], + [ + 4362, + 0.55 + ], + [ + 4363, + 0.55 + ], + [ + 4364, + 0.55 + ], + [ + 4365, + 0.55 + ], + [ + 4366, + 0.7 + ], + [ + 4367, + 0.3 + ], + [ + 4368, + 0.25 + ], + [ + 4369, + 0.25 + ], + [ + 4370, + 0.25 + ], + [ + 4371, + 0.25 + ], + [ + 4372, + 0.25 + ], + [ + 4373, + 0.25 + ], + [ + 4374, + 0.4 + ], + [ + 4375, + 0.3 + ], + [ + 4376, + 0.3 + ], + [ + 4377, + 0.3 + ], + [ + 4378, + 0.3 + ], + [ + 4379, + 0.3 + ], + [ + 4380, + 0.5 + ], + [ + 4381, + 0.3 + ], + [ + 4382, + 0.3 + ], + [ + 4383, + 0.3 + ], + [ + 4384, + 0.3 + ], + [ + 4385, + 0.3 + ], + [ + 4386, + 0.3 + ], + [ + 4387, + 0.3 + ], + [ + 4388, + 0.3 + ], + [ + 4389, + 0.6 + ], + [ + 4390, + 0.25 + ], + [ + 4391, + 0.25 + ], + [ + 4392, + 0.25 + ], + [ + 4393, + 0.25 + ], + [ + 4394, + 0.25 + ], + [ + 4395, + 0.25 + ], + [ + 4396, + 0.25 + ], + [ + 4397, + 0.25 + ], + [ + 4398, + 0.4 + ], + [ + 4399, + 0.3 + ], + [ + 4400, + 0.3 + ], + [ + 4401, + 0.3 + ], + [ + 4402, + 0.3 + ], + [ + 4403, + 0.3 + ], + [ + 4404, + 0.5 + ], + [ + 4405, + 0.3 + ], + [ + 4406, + 0.3 + ], + [ + 4407, + 0.3 + ], + [ + 4408, + 0.3 + ], + [ + 4409, + 0.3 + ], + [ + 4410, + 0.3 + ], + [ + 4411, + 0.3 + ], + [ + 4412, + 0.3 + ], + [ + 4413, + 0.6 + ], + [ + 4414, + 0.25 + ], + [ + 4415, + 0.25 + ], + [ + 4416, + 0.25 + ], + [ + 4417, + 0.25 + ], + [ + 4418, + 0.25 + ], + [ + 4419, + 0.25 + ], + [ + 4420, + 0.25 + ], + [ + 4421, + 0.25 + ], + [ + 4422, + 0.4 + ], + [ + 4423, + 0.3 + ], + [ + 4424, + 0.3 + ], + [ + 4425, + 0.3 + ], + [ + 4426, + 0.3 + ], + [ + 4427, + 0.3 + ], + [ + 4428, + 0.5 + ], + [ + 4429, + 0.3 + ], + [ + 4430, + 0.3 + ], + [ + 4431, + 0.3 + ], + [ + 4432, + 0.3 + ], + [ + 4433, + 0.3 + ], + [ + 4434, + 0.3 + ], + [ + 4435, + 0.3 + ], + [ + 4436, + 0.3 + ], + [ + 4437, + 0.6 + ], + [ + 4438, + 0.25 + ], + [ + 4439, + 0.25 + ], + [ + 4440, + 0.25 + ], + [ + 4441, + 0.25 + ], + [ + 4442, + 0.25 + ], + [ + 4443, + 0.25 + ], + [ + 4444, + 0.25 + ], + [ + 4445, + 0.25 + ], + [ + 4446, + 0.4 + ], + [ + 4447, + 0.3 + ], + [ + 4448, + 0.3 + ], + [ + 4449, + 0.3 + ], + [ + 4450, + 0.3 + ], + [ + 4451, + 0.3 + ], + [ + 4452, + 0.5 + ], + [ + 4453, + 0.3 + ], + [ + 4454, + 0.3 + ], + [ + 4455, + 0.3 + ], + [ + 4456, + 0.3 + ], + [ + 4457, + 0.3 + ], + [ + 4458, + 0.3 + ], + [ + 4459, + 0.3 + ], + [ + 4460, + 0.3 + ], + [ + 4461, + 0.6 + ], + [ + 4462, + 0.25 + ], + [ + 4463, + 0.25 + ], + [ + 4464, + 0.25 + ], + [ + 4465, + 0.25 + ], + [ + 4466, + 0.25 + ], + [ + 4467, + 0.25 + ], + [ + 4468, + 0.25 + ], + [ + 4469, + 0.25 + ], + [ + 4470, + 0.4 + ], + [ + 4471, + 0.3 + ], + [ + 4472, + 0.3 + ], + [ + 4473, + 0.3 + ], + [ + 4474, + 0.3 + ], + [ + 4475, + 0.3 + ], + [ + 4476, + 0.5 + ], + [ + 4477, + 0.3 + ], + [ + 4478, + 0.3 + ], + [ + 4479, + 0.3 + ], + [ + 4480, + 0.3 + ], + [ + 4481, + 0.3 + ], + [ + 4482, + 0.3 + ], + [ + 4483, + 0.3 + ], + [ + 4484, + 0.3 + ], + [ + 4485, + 0.6 + ], + [ + 4486, + 0.25 + ], + [ + 4487, + 0.25 + ], + [ + 4488, + 0.3 + ], + [ + 4489, + 0.3 + ], + [ + 4490, + 0.3 + ], + [ + 4491, + 0.3 + ], + [ + 4492, + 0.3 + ], + [ + 4493, + 0.3 + ], + [ + 4494, + 0.3 + ], + [ + 4495, + 0.5 + ], + [ + 4496, + 0.55 + ], + [ + 4497, + 0.55 + ], + [ + 4498, + 0.55 + ], + [ + 4499, + 0.55 + ], + [ + 4500, + 0.65 + ], + [ + 4501, + 0.55 + ], + [ + 4502, + 0.55 + ], + [ + 4503, + 0.55 + ], + [ + 4504, + 0.55 + ], + [ + 4505, + 0.55 + ], + [ + 4506, + 0.55 + ], + [ + 4507, + 0.55 + ], + [ + 4508, + 0.55 + ], + [ + 4509, + 0.55 + ], + [ + 4510, + 0.7 + ], + [ + 4511, + 0.3 + ], + [ + 4512, + 0.3 + ], + [ + 4513, + 0.3 + ], + [ + 4514, + 0.3 + ], + [ + 4515, + 0.3 + ], + [ + 4516, + 0.3 + ], + [ + 4517, + 0.3 + ], + [ + 4518, + 0.3 + ], + [ + 4519, + 0.5 + ], + [ + 4520, + 0.55 + ], + [ + 4521, + 0.55 + ], + [ + 4522, + 0.55 + ], + [ + 4523, + 0.55 + ], + [ + 4524, + 0.65 + ], + [ + 4525, + 0.55 + ], + [ + 4526, + 0.55 + ], + [ + 4527, + 0.55 + ], + [ + 4528, + 0.55 + ], + [ + 4529, + 0.55 + ], + [ + 4530, + 0.55 + ], + [ + 4531, + 0.55 + ], + [ + 4532, + 0.55 + ], + [ + 4533, + 0.55 + ], + [ + 4534, + 0.7 + ], + [ + 4535, + 0.3 + ], + [ + 4536, + 0.25 + ], + [ + 4537, + 0.25 + ], + [ + 4538, + 0.25 + ], + [ + 4539, + 0.25 + ], + [ + 4540, + 0.25 + ], + [ + 4541, + 0.25 + ], + [ + 4542, + 0.4 + ], + [ + 4543, + 0.3 + ], + [ + 4544, + 0.3 + ], + [ + 4545, + 0.3 + ], + [ + 4546, + 0.3 + ], + [ + 4547, + 0.3 + ], + [ + 4548, + 0.5 + ], + [ + 4549, + 0.3 + ], + [ + 4550, + 0.3 + ], + [ + 4551, + 0.3 + ], + [ + 4552, + 0.3 + ], + [ + 4553, + 0.3 + ], + [ + 4554, + 0.3 + ], + [ + 4555, + 0.3 + ], + [ + 4556, + 0.3 + ], + [ + 4557, + 0.6 + ], + [ + 4558, + 0.25 + ], + [ + 4559, + 0.25 + ], + [ + 4560, + 0.25 + ], + [ + 4561, + 0.25 + ], + [ + 4562, + 0.25 + ], + [ + 4563, + 0.25 + ], + [ + 4564, + 0.25 + ], + [ + 4565, + 0.25 + ], + [ + 4566, + 0.4 + ], + [ + 4567, + 0.3 + ], + [ + 4568, + 0.3 + ], + [ + 4569, + 0.3 + ], + [ + 4570, + 0.3 + ], + [ + 4571, + 0.3 + ], + [ + 4572, + 0.5 + ], + [ + 4573, + 0.3 + ], + [ + 4574, + 0.3 + ], + [ + 4575, + 0.3 + ], + [ + 4576, + 0.3 + ], + [ + 4577, + 0.3 + ], + [ + 4578, + 0.3 + ], + [ + 4579, + 0.3 + ], + [ + 4580, + 0.3 + ], + [ + 4581, + 0.6 + ], + [ + 4582, + 0.25 + ], + [ + 4583, + 0.25 + ], + [ + 4584, + 0.25 + ], + [ + 4585, + 0.25 + ], + [ + 4586, + 0.25 + ], + [ + 4587, + 0.25 + ], + [ + 4588, + 0.25 + ], + [ + 4589, + 0.25 + ], + [ + 4590, + 0.4 + ], + [ + 4591, + 0.3 + ], + [ + 4592, + 0.3 + ], + [ + 4593, + 0.3 + ], + [ + 4594, + 0.3 + ], + [ + 4595, + 0.3 + ], + [ + 4596, + 0.5 + ], + [ + 4597, + 0.3 + ], + [ + 4598, + 0.3 + ], + [ + 4599, + 0.3 + ], + [ + 4600, + 0.3 + ], + [ + 4601, + 0.3 + ], + [ + 4602, + 0.3 + ], + [ + 4603, + 0.3 + ], + [ + 4604, + 0.3 + ], + [ + 4605, + 0.6 + ], + [ + 4606, + 0.25 + ], + [ + 4607, + 0.25 + ], + [ + 4608, + 0.25 + ], + [ + 4609, + 0.25 + ], + [ + 4610, + 0.25 + ], + [ + 4611, + 0.25 + ], + [ + 4612, + 0.25 + ], + [ + 4613, + 0.25 + ], + [ + 4614, + 0.4 + ], + [ + 4615, + 0.3 + ], + [ + 4616, + 0.3 + ], + [ + 4617, + 0.3 + ], + [ + 4618, + 0.3 + ], + [ + 4619, + 0.3 + ], + [ + 4620, + 0.5 + ], + [ + 4621, + 0.3 + ], + [ + 4622, + 0.3 + ], + [ + 4623, + 0.3 + ], + [ + 4624, + 0.3 + ], + [ + 4625, + 0.3 + ], + [ + 4626, + 0.3 + ], + [ + 4627, + 0.3 + ], + [ + 4628, + 0.3 + ], + [ + 4629, + 0.6 + ], + [ + 4630, + 0.25 + ], + [ + 4631, + 0.25 + ], + [ + 4632, + 0.25 + ], + [ + 4633, + 0.25 + ], + [ + 4634, + 0.25 + ], + [ + 4635, + 0.25 + ], + [ + 4636, + 0.25 + ], + [ + 4637, + 0.25 + ], + [ + 4638, + 0.4 + ], + [ + 4639, + 0.3 + ], + [ + 4640, + 0.3 + ], + [ + 4641, + 0.3 + ], + [ + 4642, + 0.3 + ], + [ + 4643, + 0.3 + ], + [ + 4644, + 0.5 + ], + [ + 4645, + 0.3 + ], + [ + 4646, + 0.3 + ], + [ + 4647, + 0.3 + ], + [ + 4648, + 0.3 + ], + [ + 4649, + 0.3 + ], + [ + 4650, + 0.3 + ], + [ + 4651, + 0.3 + ], + [ + 4652, + 0.3 + ], + [ + 4653, + 0.6 + ], + [ + 4654, + 0.25 + ], + [ + 4655, + 0.25 + ], + [ + 4656, + 0.3 + ], + [ + 4657, + 0.3 + ], + [ + 4658, + 0.3 + ], + [ + 4659, + 0.3 + ], + [ + 4660, + 0.3 + ], + [ + 4661, + 0.3 + ], + [ + 4662, + 0.3 + ], + [ + 4663, + 0.5 + ], + [ + 4664, + 0.55 + ], + [ + 4665, + 0.55 + ], + [ + 4666, + 0.55 + ], + [ + 4667, + 0.55 + ], + [ + 4668, + 0.65 + ], + [ + 4669, + 0.55 + ], + [ + 4670, + 0.55 + ], + [ + 4671, + 0.55 + ], + [ + 4672, + 0.55 + ], + [ + 4673, + 0.55 + ], + [ + 4674, + 0.55 + ], + [ + 4675, + 0.55 + ], + [ + 4676, + 0.55 + ], + [ + 4677, + 0.55 + ], + [ + 4678, + 0.7 + ], + [ + 4679, + 0.3 + ], + [ + 4680, + 0.3 + ], + [ + 4681, + 0.3 + ], + [ + 4682, + 0.3 + ], + [ + 4683, + 0.3 + ], + [ + 4684, + 0.3 + ], + [ + 4685, + 0.3 + ], + [ + 4686, + 0.3 + ], + [ + 4687, + 0.5 + ], + [ + 4688, + 0.55 + ], + [ + 4689, + 0.55 + ], + [ + 4690, + 0.55 + ], + [ + 4691, + 0.55 + ], + [ + 4692, + 0.65 + ], + [ + 4693, + 0.55 + ], + [ + 4694, + 0.55 + ], + [ + 4695, + 0.55 + ], + [ + 4696, + 0.55 + ], + [ + 4697, + 0.55 + ], + [ + 4698, + 0.55 + ], + [ + 4699, + 0.55 + ], + [ + 4700, + 0.55 + ], + [ + 4701, + 0.55 + ], + [ + 4702, + 0.7 + ], + [ + 4703, + 0.3 + ], + [ + 4704, + 0.25 + ], + [ + 4705, + 0.25 + ], + [ + 4706, + 0.25 + ], + [ + 4707, + 0.25 + ], + [ + 4708, + 0.25 + ], + [ + 4709, + 0.25 + ], + [ + 4710, + 0.4 + ], + [ + 4711, + 0.3 + ], + [ + 4712, + 0.3 + ], + [ + 4713, + 0.3 + ], + [ + 4714, + 0.3 + ], + [ + 4715, + 0.3 + ], + [ + 4716, + 0.5 + ], + [ + 4717, + 0.3 + ], + [ + 4718, + 0.3 + ], + [ + 4719, + 0.3 + ], + [ + 4720, + 0.3 + ], + [ + 4721, + 0.3 + ], + [ + 4722, + 0.3 + ], + [ + 4723, + 0.3 + ], + [ + 4724, + 0.3 + ], + [ + 4725, + 0.6 + ], + [ + 4726, + 0.25 + ], + [ + 4727, + 0.25 + ], + [ + 4728, + 0.25 + ], + [ + 4729, + 0.25 + ], + [ + 4730, + 0.25 + ], + [ + 4731, + 0.25 + ], + [ + 4732, + 0.25 + ], + [ + 4733, + 0.25 + ], + [ + 4734, + 0.4 + ], + [ + 4735, + 0.3 + ], + [ + 4736, + 0.3 + ], + [ + 4737, + 0.3 + ], + [ + 4738, + 0.3 + ], + [ + 4739, + 0.3 + ], + [ + 4740, + 0.5 + ], + [ + 4741, + 0.3 + ], + [ + 4742, + 0.3 + ], + [ + 4743, + 0.3 + ], + [ + 4744, + 0.3 + ], + [ + 4745, + 0.3 + ], + [ + 4746, + 0.3 + ], + [ + 4747, + 0.3 + ], + [ + 4748, + 0.3 + ], + [ + 4749, + 0.6 + ], + [ + 4750, + 0.25 + ], + [ + 4751, + 0.25 + ], + [ + 4752, + 0.25 + ], + [ + 4753, + 0.25 + ], + [ + 4754, + 0.25 + ], + [ + 4755, + 0.25 + ], + [ + 4756, + 0.25 + ], + [ + 4757, + 0.25 + ], + [ + 4758, + 0.4 + ], + [ + 4759, + 0.3 + ], + [ + 4760, + 0.3 + ], + [ + 4761, + 0.3 + ], + [ + 4762, + 0.3 + ], + [ + 4763, + 0.3 + ], + [ + 4764, + 0.5 + ], + [ + 4765, + 0.3 + ], + [ + 4766, + 0.3 + ], + [ + 4767, + 0.3 + ], + [ + 4768, + 0.3 + ], + [ + 4769, + 0.3 + ], + [ + 4770, + 0.3 + ], + [ + 4771, + 0.3 + ], + [ + 4772, + 0.3 + ], + [ + 4773, + 0.6 + ], + [ + 4774, + 0.25 + ], + [ + 4775, + 0.25 + ], + [ + 4776, + 0.25 + ], + [ + 4777, + 0.25 + ], + [ + 4778, + 0.25 + ], + [ + 4779, + 0.25 + ], + [ + 4780, + 0.25 + ], + [ + 4781, + 0.25 + ], + [ + 4782, + 0.4 + ], + [ + 4783, + 0.3 + ], + [ + 4784, + 0.3 + ], + [ + 4785, + 0.3 + ], + [ + 4786, + 0.3 + ], + [ + 4787, + 0.3 + ], + [ + 4788, + 0.5 + ], + [ + 4789, + 0.3 + ], + [ + 4790, + 0.3 + ], + [ + 4791, + 0.3 + ], + [ + 4792, + 0.3 + ], + [ + 4793, + 0.3 + ], + [ + 4794, + 0.3 + ], + [ + 4795, + 0.3 + ], + [ + 4796, + 0.3 + ], + [ + 4797, + 0.6 + ], + [ + 4798, + 0.25 + ], + [ + 4799, + 0.25 + ], + [ + 4800, + 0.25 + ], + [ + 4801, + 0.25 + ], + [ + 4802, + 0.25 + ], + [ + 4803, + 0.25 + ], + [ + 4804, + 0.25 + ], + [ + 4805, + 0.25 + ], + [ + 4806, + 0.4 + ], + [ + 4807, + 0.3 + ], + [ + 4808, + 0.3 + ], + [ + 4809, + 0.3 + ], + [ + 4810, + 0.3 + ], + [ + 4811, + 0.3 + ], + [ + 4812, + 0.5 + ], + [ + 4813, + 0.3 + ], + [ + 4814, + 0.3 + ], + [ + 4815, + 0.3 + ], + [ + 4816, + 0.3 + ], + [ + 4817, + 0.3 + ], + [ + 4818, + 0.3 + ], + [ + 4819, + 0.3 + ], + [ + 4820, + 0.3 + ], + [ + 4821, + 0.6 + ], + [ + 4822, + 0.25 + ], + [ + 4823, + 0.25 + ], + [ + 4824, + 0.3 + ], + [ + 4825, + 0.3 + ], + [ + 4826, + 0.3 + ], + [ + 4827, + 0.3 + ], + [ + 4828, + 0.3 + ], + [ + 4829, + 0.3 + ], + [ + 4830, + 0.3 + ], + [ + 4831, + 0.5 + ], + [ + 4832, + 0.55 + ], + [ + 4833, + 0.55 + ], + [ + 4834, + 0.55 + ], + [ + 4835, + 0.55 + ], + [ + 4836, + 0.65 + ], + [ + 4837, + 0.55 + ], + [ + 4838, + 0.55 + ], + [ + 4839, + 0.55 + ], + [ + 4840, + 0.55 + ], + [ + 4841, + 0.55 + ], + [ + 4842, + 0.55 + ], + [ + 4843, + 0.55 + ], + [ + 4844, + 0.55 + ], + [ + 4845, + 0.55 + ], + [ + 4846, + 0.7 + ], + [ + 4847, + 0.3 + ], + [ + 4848, + 0.3 + ], + [ + 4849, + 0.3 + ], + [ + 4850, + 0.3 + ], + [ + 4851, + 0.3 + ], + [ + 4852, + 0.3 + ], + [ + 4853, + 0.3 + ], + [ + 4854, + 0.3 + ], + [ + 4855, + 0.5 + ], + [ + 4856, + 0.55 + ], + [ + 4857, + 0.55 + ], + [ + 4858, + 0.55 + ], + [ + 4859, + 0.55 + ], + [ + 4860, + 0.65 + ], + [ + 4861, + 0.55 + ], + [ + 4862, + 0.55 + ], + [ + 4863, + 0.55 + ], + [ + 4864, + 0.55 + ], + [ + 4865, + 0.55 + ], + [ + 4866, + 0.55 + ], + [ + 4867, + 0.55 + ], + [ + 4868, + 0.55 + ], + [ + 4869, + 0.55 + ], + [ + 4870, + 0.7 + ], + [ + 4871, + 0.3 + ], + [ + 4872, + 0.25 + ], + [ + 4873, + 0.25 + ], + [ + 4874, + 0.25 + ], + [ + 4875, + 0.25 + ], + [ + 4876, + 0.25 + ], + [ + 4877, + 0.25 + ], + [ + 4878, + 0.4 + ], + [ + 4879, + 0.3 + ], + [ + 4880, + 0.3 + ], + [ + 4881, + 0.3 + ], + [ + 4882, + 0.3 + ], + [ + 4883, + 0.3 + ], + [ + 4884, + 0.5 + ], + [ + 4885, + 0.3 + ], + [ + 4886, + 0.3 + ], + [ + 4887, + 0.3 + ], + [ + 4888, + 0.3 + ], + [ + 4889, + 0.3 + ], + [ + 4890, + 0.3 + ], + [ + 4891, + 0.3 + ], + [ + 4892, + 0.3 + ], + [ + 4893, + 0.6 + ], + [ + 4894, + 0.25 + ], + [ + 4895, + 0.25 + ], + [ + 4896, + 0.25 + ], + [ + 4897, + 0.25 + ], + [ + 4898, + 0.25 + ], + [ + 4899, + 0.25 + ], + [ + 4900, + 0.25 + ], + [ + 4901, + 0.25 + ], + [ + 4902, + 0.4 + ], + [ + 4903, + 0.3 + ], + [ + 4904, + 0.3 + ], + [ + 4905, + 0.3 + ], + [ + 4906, + 0.3 + ], + [ + 4907, + 0.3 + ], + [ + 4908, + 0.5 + ], + [ + 4909, + 0.3 + ], + [ + 4910, + 0.3 + ], + [ + 4911, + 0.3 + ], + [ + 4912, + 0.3 + ], + [ + 4913, + 0.3 + ], + [ + 4914, + 0.3 + ], + [ + 4915, + 0.3 + ], + [ + 4916, + 0.3 + ], + [ + 4917, + 0.6 + ], + [ + 4918, + 0.25 + ], + [ + 4919, + 0.25 + ], + [ + 4920, + 0.25 + ], + [ + 4921, + 0.25 + ], + [ + 4922, + 0.25 + ], + [ + 4923, + 0.25 + ], + [ + 4924, + 0.25 + ], + [ + 4925, + 0.25 + ], + [ + 4926, + 0.4 + ], + [ + 4927, + 0.3 + ], + [ + 4928, + 0.3 + ], + [ + 4929, + 0.3 + ], + [ + 4930, + 0.3 + ], + [ + 4931, + 0.3 + ], + [ + 4932, + 0.5 + ], + [ + 4933, + 0.3 + ], + [ + 4934, + 0.3 + ], + [ + 4935, + 0.3 + ], + [ + 4936, + 0.3 + ], + [ + 4937, + 0.3 + ], + [ + 4938, + 0.3 + ], + [ + 4939, + 0.3 + ], + [ + 4940, + 0.3 + ], + [ + 4941, + 0.6 + ], + [ + 4942, + 0.25 + ], + [ + 4943, + 0.25 + ], + [ + 4944, + 0.25 + ], + [ + 4945, + 0.25 + ], + [ + 4946, + 0.25 + ], + [ + 4947, + 0.25 + ], + [ + 4948, + 0.25 + ], + [ + 4949, + 0.25 + ], + [ + 4950, + 0.4 + ], + [ + 4951, + 0.3 + ], + [ + 4952, + 0.3 + ], + [ + 4953, + 0.3 + ], + [ + 4954, + 0.3 + ], + [ + 4955, + 0.3 + ], + [ + 4956, + 0.5 + ], + [ + 4957, + 0.3 + ], + [ + 4958, + 0.3 + ], + [ + 4959, + 0.3 + ], + [ + 4960, + 0.3 + ], + [ + 4961, + 0.3 + ], + [ + 4962, + 0.3 + ], + [ + 4963, + 0.3 + ], + [ + 4964, + 0.3 + ], + [ + 4965, + 0.6 + ], + [ + 4966, + 0.25 + ], + [ + 4967, + 0.25 + ], + [ + 4968, + 0.25 + ], + [ + 4969, + 0.25 + ], + [ + 4970, + 0.25 + ], + [ + 4971, + 0.25 + ], + [ + 4972, + 0.25 + ], + [ + 4973, + 0.25 + ], + [ + 4974, + 0.4 + ], + [ + 4975, + 0.3 + ], + [ + 4976, + 0.3 + ], + [ + 4977, + 0.3 + ], + [ + 4978, + 0.3 + ], + [ + 4979, + 0.3 + ], + [ + 4980, + 0.5 + ], + [ + 4981, + 0.3 + ], + [ + 4982, + 0.3 + ], + [ + 4983, + 0.3 + ], + [ + 4984, + 0.3 + ], + [ + 4985, + 0.3 + ], + [ + 4986, + 0.3 + ], + [ + 4987, + 0.3 + ], + [ + 4988, + 0.3 + ], + [ + 4989, + 0.6 + ], + [ + 4990, + 0.25 + ], + [ + 4991, + 0.25 + ], + [ + 4992, + 0.3 + ], + [ + 4993, + 0.3 + ], + [ + 4994, + 0.3 + ], + [ + 4995, + 0.3 + ], + [ + 4996, + 0.3 + ], + [ + 4997, + 0.3 + ], + [ + 4998, + 0.3 + ], + [ + 4999, + 0.5 + ], + [ + 5000, + 0.55 + ], + [ + 5001, + 0.55 + ], + [ + 5002, + 0.55 + ], + [ + 5003, + 0.55 + ], + [ + 5004, + 0.65 + ], + [ + 5005, + 0.55 + ], + [ + 5006, + 0.55 + ], + [ + 5007, + 0.55 + ], + [ + 5008, + 0.55 + ], + [ + 5009, + 0.55 + ], + [ + 5010, + 0.55 + ], + [ + 5011, + 0.55 + ], + [ + 5012, + 0.55 + ], + [ + 5013, + 0.55 + ], + [ + 5014, + 0.7 + ], + [ + 5015, + 0.3 + ], + [ + 5016, + 0.3 + ], + [ + 5017, + 0.3 + ], + [ + 5018, + 0.3 + ], + [ + 5019, + 0.3 + ], + [ + 5020, + 0.3 + ], + [ + 5021, + 0.3 + ], + [ + 5022, + 0.3 + ], + [ + 5023, + 0.5 + ], + [ + 5024, + 0.55 + ], + [ + 5025, + 0.55 + ], + [ + 5026, + 0.55 + ], + [ + 5027, + 0.55 + ], + [ + 5028, + 0.65 + ], + [ + 5029, + 0.55 + ], + [ + 5030, + 0.55 + ], + [ + 5031, + 0.55 + ], + [ + 5032, + 0.55 + ], + [ + 5033, + 0.55 + ], + [ + 5034, + 0.55 + ], + [ + 5035, + 0.55 + ], + [ + 5036, + 0.55 + ], + [ + 5037, + 0.55 + ], + [ + 5038, + 0.7 + ], + [ + 5039, + 0.3 + ], + [ + 5040, + 0.25 + ], + [ + 5041, + 0.25 + ], + [ + 5042, + 0.25 + ], + [ + 5043, + 0.25 + ], + [ + 5044, + 0.25 + ], + [ + 5045, + 0.25 + ], + [ + 5046, + 0.4 + ], + [ + 5047, + 0.3 + ], + [ + 5048, + 0.3 + ], + [ + 5049, + 0.3 + ], + [ + 5050, + 0.3 + ], + [ + 5051, + 0.3 + ], + [ + 5052, + 0.5 + ], + [ + 5053, + 0.3 + ], + [ + 5054, + 0.3 + ], + [ + 5055, + 0.3 + ], + [ + 5056, + 0.3 + ], + [ + 5057, + 0.3 + ], + [ + 5058, + 0.3 + ], + [ + 5059, + 0.3 + ], + [ + 5060, + 0.3 + ], + [ + 5061, + 0.6 + ], + [ + 5062, + 0.25 + ], + [ + 5063, + 0.25 + ], + [ + 5064, + 0.25 + ], + [ + 5065, + 0.25 + ], + [ + 5066, + 0.25 + ], + [ + 5067, + 0.25 + ], + [ + 5068, + 0.25 + ], + [ + 5069, + 0.25 + ], + [ + 5070, + 0.4 + ], + [ + 5071, + 0.3 + ], + [ + 5072, + 0.3 + ], + [ + 5073, + 0.3 + ], + [ + 5074, + 0.3 + ], + [ + 5075, + 0.3 + ], + [ + 5076, + 0.5 + ], + [ + 5077, + 0.3 + ], + [ + 5078, + 0.3 + ], + [ + 5079, + 0.3 + ], + [ + 5080, + 0.3 + ], + [ + 5081, + 0.3 + ], + [ + 5082, + 0.3 + ], + [ + 5083, + 0.3 + ], + [ + 5084, + 0.3 + ], + [ + 5085, + 0.6 + ], + [ + 5086, + 0.25 + ], + [ + 5087, + 0.25 + ], + [ + 5088, + 0.25 + ], + [ + 5089, + 0.25 + ], + [ + 5090, + 0.25 + ], + [ + 5091, + 0.25 + ], + [ + 5092, + 0.25 + ], + [ + 5093, + 0.25 + ], + [ + 5094, + 0.4 + ], + [ + 5095, + 0.3 + ], + [ + 5096, + 0.3 + ], + [ + 5097, + 0.3 + ], + [ + 5098, + 0.3 + ], + [ + 5099, + 0.3 + ], + [ + 5100, + 0.5 + ], + [ + 5101, + 0.3 + ], + [ + 5102, + 0.3 + ], + [ + 5103, + 0.3 + ], + [ + 5104, + 0.3 + ], + [ + 5105, + 0.3 + ], + [ + 5106, + 0.3 + ], + [ + 5107, + 0.3 + ], + [ + 5108, + 0.3 + ], + [ + 5109, + 0.6 + ], + [ + 5110, + 0.25 + ], + [ + 5111, + 0.25 + ], + [ + 5112, + 0.25 + ], + [ + 5113, + 0.25 + ], + [ + 5114, + 0.25 + ], + [ + 5115, + 0.25 + ], + [ + 5116, + 0.25 + ], + [ + 5117, + 0.25 + ], + [ + 5118, + 0.4 + ], + [ + 5119, + 0.3 + ], + [ + 5120, + 0.3 + ], + [ + 5121, + 0.3 + ], + [ + 5122, + 0.3 + ], + [ + 5123, + 0.3 + ], + [ + 5124, + 0.5 + ], + [ + 5125, + 0.3 + ], + [ + 5126, + 0.3 + ], + [ + 5127, + 0.3 + ], + [ + 5128, + 0.3 + ], + [ + 5129, + 0.3 + ], + [ + 5130, + 0.3 + ], + [ + 5131, + 0.3 + ], + [ + 5132, + 0.3 + ], + [ + 5133, + 0.6 + ], + [ + 5134, + 0.25 + ], + [ + 5135, + 0.25 + ], + [ + 5136, + 0.25 + ], + [ + 5137, + 0.25 + ], + [ + 5138, + 0.25 + ], + [ + 5139, + 0.25 + ], + [ + 5140, + 0.25 + ], + [ + 5141, + 0.25 + ], + [ + 5142, + 0.4 + ], + [ + 5143, + 0.3 + ], + [ + 5144, + 0.3 + ], + [ + 5145, + 0.3 + ], + [ + 5146, + 0.3 + ], + [ + 5147, + 0.3 + ], + [ + 5148, + 0.5 + ], + [ + 5149, + 0.3 + ], + [ + 5150, + 0.3 + ], + [ + 5151, + 0.3 + ], + [ + 5152, + 0.3 + ], + [ + 5153, + 0.3 + ], + [ + 5154, + 0.3 + ], + [ + 5155, + 0.3 + ], + [ + 5156, + 0.3 + ], + [ + 5157, + 0.6 + ], + [ + 5158, + 0.25 + ], + [ + 5159, + 0.25 + ], + [ + 5160, + 0.3 + ], + [ + 5161, + 0.3 + ], + [ + 5162, + 0.3 + ], + [ + 5163, + 0.3 + ], + [ + 5164, + 0.3 + ], + [ + 5165, + 0.3 + ], + [ + 5166, + 0.3 + ], + [ + 5167, + 0.5 + ], + [ + 5168, + 0.55 + ], + [ + 5169, + 0.55 + ], + [ + 5170, + 0.55 + ], + [ + 5171, + 0.55 + ], + [ + 5172, + 0.65 + ], + [ + 5173, + 0.55 + ], + [ + 5174, + 0.55 + ], + [ + 5175, + 0.55 + ], + [ + 5176, + 0.55 + ], + [ + 5177, + 0.55 + ], + [ + 5178, + 0.55 + ], + [ + 5179, + 0.55 + ], + [ + 5180, + 0.55 + ], + [ + 5181, + 0.55 + ], + [ + 5182, + 0.7 + ], + [ + 5183, + 0.3 + ], + [ + 5184, + 0.3 + ], + [ + 5185, + 0.3 + ], + [ + 5186, + 0.3 + ], + [ + 5187, + 0.3 + ], + [ + 5188, + 0.3 + ], + [ + 5189, + 0.3 + ], + [ + 5190, + 0.3 + ], + [ + 5191, + 0.5 + ], + [ + 5192, + 0.55 + ], + [ + 5193, + 0.55 + ], + [ + 5194, + 0.55 + ], + [ + 5195, + 0.55 + ], + [ + 5196, + 0.65 + ], + [ + 5197, + 0.55 + ], + [ + 5198, + 0.55 + ], + [ + 5199, + 0.55 + ], + [ + 5200, + 0.55 + ], + [ + 5201, + 0.55 + ], + [ + 5202, + 0.55 + ], + [ + 5203, + 0.55 + ], + [ + 5204, + 0.55 + ], + [ + 5205, + 0.55 + ], + [ + 5206, + 0.7 + ], + [ + 5207, + 0.3 + ], + [ + 5208, + 0.25 + ], + [ + 5209, + 0.25 + ], + [ + 5210, + 0.25 + ], + [ + 5211, + 0.25 + ], + [ + 5212, + 0.25 + ], + [ + 5213, + 0.25 + ], + [ + 5214, + 0.4 + ], + [ + 5215, + 0.3 + ], + [ + 5216, + 0.3 + ], + [ + 5217, + 0.3 + ], + [ + 5218, + 0.3 + ], + [ + 5219, + 0.3 + ], + [ + 5220, + 0.5 + ], + [ + 5221, + 0.3 + ], + [ + 5222, + 0.3 + ], + [ + 5223, + 0.3 + ], + [ + 5224, + 0.3 + ], + [ + 5225, + 0.3 + ], + [ + 5226, + 0.3 + ], + [ + 5227, + 0.3 + ], + [ + 5228, + 0.3 + ], + [ + 5229, + 0.6 + ], + [ + 5230, + 0.25 + ], + [ + 5231, + 0.25 + ], + [ + 5232, + 0.25 + ], + [ + 5233, + 0.25 + ], + [ + 5234, + 0.25 + ], + [ + 5235, + 0.25 + ], + [ + 5236, + 0.25 + ], + [ + 5237, + 0.25 + ], + [ + 5238, + 0.4 + ], + [ + 5239, + 0.3 + ], + [ + 5240, + 0.3 + ], + [ + 5241, + 0.3 + ], + [ + 5242, + 0.3 + ], + [ + 5243, + 0.3 + ], + [ + 5244, + 0.5 + ], + [ + 5245, + 0.3 + ], + [ + 5246, + 0.3 + ], + [ + 5247, + 0.3 + ], + [ + 5248, + 0.3 + ], + [ + 5249, + 0.3 + ], + [ + 5250, + 0.3 + ], + [ + 5251, + 0.3 + ], + [ + 5252, + 0.3 + ], + [ + 5253, + 0.6 + ], + [ + 5254, + 0.25 + ], + [ + 5255, + 0.25 + ], + [ + 5256, + 0.25 + ], + [ + 5257, + 0.25 + ], + [ + 5258, + 0.25 + ], + [ + 5259, + 0.25 + ], + [ + 5260, + 0.25 + ], + [ + 5261, + 0.25 + ], + [ + 5262, + 0.4 + ], + [ + 5263, + 0.3 + ], + [ + 5264, + 0.3 + ], + [ + 5265, + 0.3 + ], + [ + 5266, + 0.3 + ], + [ + 5267, + 0.3 + ], + [ + 5268, + 0.5 + ], + [ + 5269, + 0.3 + ], + [ + 5270, + 0.3 + ], + [ + 5271, + 0.3 + ], + [ + 5272, + 0.3 + ], + [ + 5273, + 0.3 + ], + [ + 5274, + 0.3 + ], + [ + 5275, + 0.3 + ], + [ + 5276, + 0.3 + ], + [ + 5277, + 0.6 + ], + [ + 5278, + 0.25 + ], + [ + 5279, + 0.25 + ], + [ + 5280, + 0.25 + ], + [ + 5281, + 0.25 + ], + [ + 5282, + 0.25 + ], + [ + 5283, + 0.25 + ], + [ + 5284, + 0.25 + ], + [ + 5285, + 0.25 + ], + [ + 5286, + 0.4 + ], + [ + 5287, + 0.3 + ], + [ + 5288, + 0.3 + ], + [ + 5289, + 0.3 + ], + [ + 5290, + 0.3 + ], + [ + 5291, + 0.3 + ], + [ + 5292, + 0.5 + ], + [ + 5293, + 0.3 + ], + [ + 5294, + 0.3 + ], + [ + 5295, + 0.3 + ], + [ + 5296, + 0.3 + ], + [ + 5297, + 0.3 + ], + [ + 5298, + 0.3 + ], + [ + 5299, + 0.3 + ], + [ + 5300, + 0.3 + ], + [ + 5301, + 0.6 + ], + [ + 5302, + 0.25 + ], + [ + 5303, + 0.25 + ], + [ + 5304, + 0.25 + ], + [ + 5305, + 0.25 + ], + [ + 5306, + 0.25 + ], + [ + 5307, + 0.25 + ], + [ + 5308, + 0.25 + ], + [ + 5309, + 0.25 + ], + [ + 5310, + 0.4 + ], + [ + 5311, + 0.3 + ], + [ + 5312, + 0.3 + ], + [ + 5313, + 0.3 + ], + [ + 5314, + 0.3 + ], + [ + 5315, + 0.3 + ], + [ + 5316, + 0.5 + ], + [ + 5317, + 0.3 + ], + [ + 5318, + 0.3 + ], + [ + 5319, + 0.3 + ], + [ + 5320, + 0.3 + ], + [ + 5321, + 0.3 + ], + [ + 5322, + 0.3 + ], + [ + 5323, + 0.3 + ], + [ + 5324, + 0.3 + ], + [ + 5325, + 0.6 + ], + [ + 5326, + 0.25 + ], + [ + 5327, + 0.25 + ], + [ + 5328, + 0.3 + ], + [ + 5329, + 0.3 + ], + [ + 5330, + 0.3 + ], + [ + 5331, + 0.3 + ], + [ + 5332, + 0.3 + ], + [ + 5333, + 0.3 + ], + [ + 5334, + 0.3 + ], + [ + 5335, + 0.5 + ], + [ + 5336, + 0.55 + ], + [ + 5337, + 0.55 + ], + [ + 5338, + 0.55 + ], + [ + 5339, + 0.55 + ], + [ + 5340, + 0.65 + ], + [ + 5341, + 0.55 + ], + [ + 5342, + 0.55 + ], + [ + 5343, + 0.55 + ], + [ + 5344, + 0.55 + ], + [ + 5345, + 0.55 + ], + [ + 5346, + 0.55 + ], + [ + 5347, + 0.55 + ], + [ + 5348, + 0.55 + ], + [ + 5349, + 0.55 + ], + [ + 5350, + 0.7 + ], + [ + 5351, + 0.3 + ], + [ + 5352, + 0.3 + ], + [ + 5353, + 0.3 + ], + [ + 5354, + 0.3 + ], + [ + 5355, + 0.3 + ], + [ + 5356, + 0.3 + ], + [ + 5357, + 0.3 + ], + [ + 5358, + 0.3 + ], + [ + 5359, + 0.5 + ], + [ + 5360, + 0.55 + ], + [ + 5361, + 0.55 + ], + [ + 5362, + 0.55 + ], + [ + 5363, + 0.55 + ], + [ + 5364, + 0.65 + ], + [ + 5365, + 0.55 + ], + [ + 5366, + 0.55 + ], + [ + 5367, + 0.55 + ], + [ + 5368, + 0.55 + ], + [ + 5369, + 0.55 + ], + [ + 5370, + 0.55 + ], + [ + 5371, + 0.55 + ], + [ + 5372, + 0.55 + ], + [ + 5373, + 0.55 + ], + [ + 5374, + 0.7 + ], + [ + 5375, + 0.3 + ], + [ + 5376, + 0.25 + ], + [ + 5377, + 0.25 + ], + [ + 5378, + 0.25 + ], + [ + 5379, + 0.25 + ], + [ + 5380, + 0.25 + ], + [ + 5381, + 0.25 + ], + [ + 5382, + 0.4 + ], + [ + 5383, + 0.3 + ], + [ + 5384, + 0.3 + ], + [ + 5385, + 0.3 + ], + [ + 5386, + 0.3 + ], + [ + 5387, + 0.3 + ], + [ + 5388, + 0.5 + ], + [ + 5389, + 0.3 + ], + [ + 5390, + 0.3 + ], + [ + 5391, + 0.3 + ], + [ + 5392, + 0.3 + ], + [ + 5393, + 0.3 + ], + [ + 5394, + 0.3 + ], + [ + 5395, + 0.3 + ], + [ + 5396, + 0.3 + ], + [ + 5397, + 0.6 + ], + [ + 5398, + 0.25 + ], + [ + 5399, + 0.25 + ], + [ + 5400, + 0.25 + ], + [ + 5401, + 0.25 + ], + [ + 5402, + 0.25 + ], + [ + 5403, + 0.25 + ], + [ + 5404, + 0.25 + ], + [ + 5405, + 0.25 + ], + [ + 5406, + 0.4 + ], + [ + 5407, + 0.3 + ], + [ + 5408, + 0.3 + ], + [ + 5409, + 0.3 + ], + [ + 5410, + 0.3 + ], + [ + 5411, + 0.3 + ], + [ + 5412, + 0.5 + ], + [ + 5413, + 0.3 + ], + [ + 5414, + 0.3 + ], + [ + 5415, + 0.3 + ], + [ + 5416, + 0.3 + ], + [ + 5417, + 0.3 + ], + [ + 5418, + 0.3 + ], + [ + 5419, + 0.3 + ], + [ + 5420, + 0.3 + ], + [ + 5421, + 0.6 + ], + [ + 5422, + 0.25 + ], + [ + 5423, + 0.25 + ], + [ + 5424, + 0.25 + ], + [ + 5425, + 0.25 + ], + [ + 5426, + 0.25 + ], + [ + 5427, + 0.25 + ], + [ + 5428, + 0.25 + ], + [ + 5429, + 0.25 + ], + [ + 5430, + 0.4 + ], + [ + 5431, + 0.3 + ], + [ + 5432, + 0.3 + ], + [ + 5433, + 0.3 + ], + [ + 5434, + 0.3 + ], + [ + 5435, + 0.3 + ], + [ + 5436, + 0.5 + ], + [ + 5437, + 0.3 + ], + [ + 5438, + 0.3 + ], + [ + 5439, + 0.3 + ], + [ + 5440, + 0.3 + ], + [ + 5441, + 0.3 + ], + [ + 5442, + 0.3 + ], + [ + 5443, + 0.3 + ], + [ + 5444, + 0.3 + ], + [ + 5445, + 0.6 + ], + [ + 5446, + 0.25 + ], + [ + 5447, + 0.25 + ], + [ + 5448, + 0.25 + ], + [ + 5449, + 0.25 + ], + [ + 5450, + 0.25 + ], + [ + 5451, + 0.25 + ], + [ + 5452, + 0.25 + ], + [ + 5453, + 0.25 + ], + [ + 5454, + 0.4 + ], + [ + 5455, + 0.3 + ], + [ + 5456, + 0.3 + ], + [ + 5457, + 0.3 + ], + [ + 5458, + 0.3 + ], + [ + 5459, + 0.3 + ], + [ + 5460, + 0.5 + ], + [ + 5461, + 0.3 + ], + [ + 5462, + 0.3 + ], + [ + 5463, + 0.3 + ], + [ + 5464, + 0.3 + ], + [ + 5465, + 0.3 + ], + [ + 5466, + 0.3 + ], + [ + 5467, + 0.3 + ], + [ + 5468, + 0.3 + ], + [ + 5469, + 0.6 + ], + [ + 5470, + 0.25 + ], + [ + 5471, + 0.25 + ], + [ + 5472, + 0.25 + ], + [ + 5473, + 0.25 + ], + [ + 5474, + 0.25 + ], + [ + 5475, + 0.25 + ], + [ + 5476, + 0.25 + ], + [ + 5477, + 0.25 + ], + [ + 5478, + 0.4 + ], + [ + 5479, + 0.3 + ], + [ + 5480, + 0.3 + ], + [ + 5481, + 0.3 + ], + [ + 5482, + 0.3 + ], + [ + 5483, + 0.3 + ], + [ + 5484, + 0.5 + ], + [ + 5485, + 0.3 + ], + [ + 5486, + 0.3 + ], + [ + 5487, + 0.3 + ], + [ + 5488, + 0.3 + ], + [ + 5489, + 0.3 + ], + [ + 5490, + 0.3 + ], + [ + 5491, + 0.3 + ], + [ + 5492, + 0.3 + ], + [ + 5493, + 0.6 + ], + [ + 5494, + 0.25 + ], + [ + 5495, + 0.25 + ], + [ + 5496, + 0.3 + ], + [ + 5497, + 0.3 + ], + [ + 5498, + 0.3 + ], + [ + 5499, + 0.3 + ], + [ + 5500, + 0.3 + ], + [ + 5501, + 0.3 + ], + [ + 5502, + 0.3 + ], + [ + 5503, + 0.5 + ], + [ + 5504, + 0.55 + ], + [ + 5505, + 0.55 + ], + [ + 5506, + 0.55 + ], + [ + 5507, + 0.55 + ], + [ + 5508, + 0.65 + ], + [ + 5509, + 0.55 + ], + [ + 5510, + 0.55 + ], + [ + 5511, + 0.55 + ], + [ + 5512, + 0.55 + ], + [ + 5513, + 0.55 + ], + [ + 5514, + 0.55 + ], + [ + 5515, + 0.55 + ], + [ + 5516, + 0.55 + ], + [ + 5517, + 0.55 + ], + [ + 5518, + 0.7 + ], + [ + 5519, + 0.3 + ], + [ + 5520, + 0.3 + ], + [ + 5521, + 0.3 + ], + [ + 5522, + 0.3 + ], + [ + 5523, + 0.3 + ], + [ + 5524, + 0.3 + ], + [ + 5525, + 0.3 + ], + [ + 5526, + 0.3 + ], + [ + 5527, + 0.5 + ], + [ + 5528, + 0.55 + ], + [ + 5529, + 0.55 + ], + [ + 5530, + 0.55 + ], + [ + 5531, + 0.55 + ], + [ + 5532, + 0.65 + ], + [ + 5533, + 0.55 + ], + [ + 5534, + 0.55 + ], + [ + 5535, + 0.55 + ], + [ + 5536, + 0.55 + ], + [ + 5537, + 0.55 + ], + [ + 5538, + 0.55 + ], + [ + 5539, + 0.55 + ], + [ + 5540, + 0.55 + ], + [ + 5541, + 0.55 + ], + [ + 5542, + 0.7 + ], + [ + 5543, + 0.3 + ], + [ + 5544, + 0.25 + ], + [ + 5545, + 0.25 + ], + [ + 5546, + 0.25 + ], + [ + 5547, + 0.25 + ], + [ + 5548, + 0.25 + ], + [ + 5549, + 0.25 + ], + [ + 5550, + 0.4 + ], + [ + 5551, + 0.3 + ], + [ + 5552, + 0.3 + ], + [ + 5553, + 0.3 + ], + [ + 5554, + 0.3 + ], + [ + 5555, + 0.3 + ], + [ + 5556, + 0.5 + ], + [ + 5557, + 0.3 + ], + [ + 5558, + 0.3 + ], + [ + 5559, + 0.3 + ], + [ + 5560, + 0.3 + ], + [ + 5561, + 0.3 + ], + [ + 5562, + 0.3 + ], + [ + 5563, + 0.3 + ], + [ + 5564, + 0.3 + ], + [ + 5565, + 0.6 + ], + [ + 5566, + 0.25 + ], + [ + 5567, + 0.25 + ], + [ + 5568, + 0.25 + ], + [ + 5569, + 0.25 + ], + [ + 5570, + 0.25 + ], + [ + 5571, + 0.25 + ], + [ + 5572, + 0.25 + ], + [ + 5573, + 0.25 + ], + [ + 5574, + 0.4 + ], + [ + 5575, + 0.3 + ], + [ + 5576, + 0.3 + ], + [ + 5577, + 0.3 + ], + [ + 5578, + 0.3 + ], + [ + 5579, + 0.3 + ], + [ + 5580, + 0.5 + ], + [ + 5581, + 0.3 + ], + [ + 5582, + 0.3 + ], + [ + 5583, + 0.3 + ], + [ + 5584, + 0.3 + ], + [ + 5585, + 0.3 + ], + [ + 5586, + 0.3 + ], + [ + 5587, + 0.3 + ], + [ + 5588, + 0.3 + ], + [ + 5589, + 0.6 + ], + [ + 5590, + 0.25 + ], + [ + 5591, + 0.25 + ], + [ + 5592, + 0.25 + ], + [ + 5593, + 0.25 + ], + [ + 5594, + 0.25 + ], + [ + 5595, + 0.25 + ], + [ + 5596, + 0.25 + ], + [ + 5597, + 0.25 + ], + [ + 5598, + 0.4 + ], + [ + 5599, + 0.3 + ], + [ + 5600, + 0.3 + ], + [ + 5601, + 0.3 + ], + [ + 5602, + 0.3 + ], + [ + 5603, + 0.3 + ], + [ + 5604, + 0.5 + ], + [ + 5605, + 0.3 + ], + [ + 5606, + 0.3 + ], + [ + 5607, + 0.3 + ], + [ + 5608, + 0.3 + ], + [ + 5609, + 0.3 + ], + [ + 5610, + 0.3 + ], + [ + 5611, + 0.3 + ], + [ + 5612, + 0.3 + ], + [ + 5613, + 0.6 + ], + [ + 5614, + 0.25 + ], + [ + 5615, + 0.25 + ], + [ + 5616, + 0.25 + ], + [ + 5617, + 0.25 + ], + [ + 5618, + 0.25 + ], + [ + 5619, + 0.25 + ], + [ + 5620, + 0.25 + ], + [ + 5621, + 0.25 + ], + [ + 5622, + 0.4 + ], + [ + 5623, + 0.3 + ], + [ + 5624, + 0.3 + ], + [ + 5625, + 0.3 + ], + [ + 5626, + 0.3 + ], + [ + 5627, + 0.3 + ], + [ + 5628, + 0.5 + ], + [ + 5629, + 0.3 + ], + [ + 5630, + 0.3 + ], + [ + 5631, + 0.3 + ], + [ + 5632, + 0.3 + ], + [ + 5633, + 0.3 + ], + [ + 5634, + 0.3 + ], + [ + 5635, + 0.3 + ], + [ + 5636, + 0.3 + ], + [ + 5637, + 0.6 + ], + [ + 5638, + 0.25 + ], + [ + 5639, + 0.25 + ], + [ + 5640, + 0.25 + ], + [ + 5641, + 0.25 + ], + [ + 5642, + 0.25 + ], + [ + 5643, + 0.25 + ], + [ + 5644, + 0.25 + ], + [ + 5645, + 0.25 + ], + [ + 5646, + 0.4 + ], + [ + 5647, + 0.3 + ], + [ + 5648, + 0.3 + ], + [ + 5649, + 0.3 + ], + [ + 5650, + 0.3 + ], + [ + 5651, + 0.3 + ], + [ + 5652, + 0.5 + ], + [ + 5653, + 0.3 + ], + [ + 5654, + 0.3 + ], + [ + 5655, + 0.3 + ], + [ + 5656, + 0.3 + ], + [ + 5657, + 0.3 + ], + [ + 5658, + 0.3 + ], + [ + 5659, + 0.3 + ], + [ + 5660, + 0.3 + ], + [ + 5661, + 0.6 + ], + [ + 5662, + 0.25 + ], + [ + 5663, + 0.25 + ], + [ + 5664, + 0.3 + ], + [ + 5665, + 0.3 + ], + [ + 5666, + 0.3 + ], + [ + 5667, + 0.3 + ], + [ + 5668, + 0.3 + ], + [ + 5669, + 0.3 + ], + [ + 5670, + 0.3 + ], + [ + 5671, + 0.5 + ], + [ + 5672, + 0.55 + ], + [ + 5673, + 0.55 + ], + [ + 5674, + 0.55 + ], + [ + 5675, + 0.55 + ], + [ + 5676, + 0.65 + ], + [ + 5677, + 0.55 + ], + [ + 5678, + 0.55 + ], + [ + 5679, + 0.55 + ], + [ + 5680, + 0.55 + ], + [ + 5681, + 0.55 + ], + [ + 5682, + 0.55 + ], + [ + 5683, + 0.55 + ], + [ + 5684, + 0.55 + ], + [ + 5685, + 0.55 + ], + [ + 5686, + 0.7 + ], + [ + 5687, + 0.3 + ], + [ + 5688, + 0.3 + ], + [ + 5689, + 0.3 + ], + [ + 5690, + 0.3 + ], + [ + 5691, + 0.3 + ], + [ + 5692, + 0.3 + ], + [ + 5693, + 0.3 + ], + [ + 5694, + 0.3 + ], + [ + 5695, + 0.5 + ], + [ + 5696, + 0.55 + ], + [ + 5697, + 0.55 + ], + [ + 5698, + 0.55 + ], + [ + 5699, + 0.55 + ], + [ + 5700, + 0.65 + ], + [ + 5701, + 0.55 + ], + [ + 5702, + 0.55 + ], + [ + 5703, + 0.55 + ], + [ + 5704, + 0.55 + ], + [ + 5705, + 0.55 + ], + [ + 5706, + 0.55 + ], + [ + 5707, + 0.55 + ], + [ + 5708, + 0.55 + ], + [ + 5709, + 0.55 + ], + [ + 5710, + 0.7 + ], + [ + 5711, + 0.3 + ], + [ + 5712, + 0.25 + ], + [ + 5713, + 0.25 + ], + [ + 5714, + 0.25 + ], + [ + 5715, + 0.25 + ], + [ + 5716, + 0.25 + ], + [ + 5717, + 0.25 + ], + [ + 5718, + 0.4 + ], + [ + 5719, + 0.3 + ], + [ + 5720, + 0.3 + ], + [ + 5721, + 0.3 + ], + [ + 5722, + 0.3 + ], + [ + 5723, + 0.3 + ], + [ + 5724, + 0.5 + ], + [ + 5725, + 0.3 + ], + [ + 5726, + 0.3 + ], + [ + 5727, + 0.3 + ], + [ + 5728, + 0.3 + ], + [ + 5729, + 0.3 + ], + [ + 5730, + 0.3 + ], + [ + 5731, + 0.3 + ], + [ + 5732, + 0.3 + ], + [ + 5733, + 0.6 + ], + [ + 5734, + 0.25 + ], + [ + 5735, + 0.25 + ], + [ + 5736, + 0.25 + ], + [ + 5737, + 0.25 + ], + [ + 5738, + 0.25 + ], + [ + 5739, + 0.25 + ], + [ + 5740, + 0.25 + ], + [ + 5741, + 0.25 + ], + [ + 5742, + 0.4 + ], + [ + 5743, + 0.3 + ], + [ + 5744, + 0.3 + ], + [ + 5745, + 0.3 + ], + [ + 5746, + 0.3 + ], + [ + 5747, + 0.3 + ], + [ + 5748, + 0.5 + ], + [ + 5749, + 0.3 + ], + [ + 5750, + 0.3 + ], + [ + 5751, + 0.3 + ], + [ + 5752, + 0.3 + ], + [ + 5753, + 0.3 + ], + [ + 5754, + 0.3 + ], + [ + 5755, + 0.3 + ], + [ + 5756, + 0.3 + ], + [ + 5757, + 0.6 + ], + [ + 5758, + 0.25 + ], + [ + 5759, + 0.25 + ], + [ + 5760, + 0.25 + ], + [ + 5761, + 0.25 + ], + [ + 5762, + 0.25 + ], + [ + 5763, + 0.25 + ], + [ + 5764, + 0.25 + ], + [ + 5765, + 0.25 + ], + [ + 5766, + 0.4 + ], + [ + 5767, + 0.3 + ], + [ + 5768, + 0.3 + ], + [ + 5769, + 0.3 + ], + [ + 5770, + 0.3 + ], + [ + 5771, + 0.3 + ], + [ + 5772, + 0.5 + ], + [ + 5773, + 0.3 + ], + [ + 5774, + 0.3 + ], + [ + 5775, + 0.3 + ], + [ + 5776, + 0.3 + ], + [ + 5777, + 0.3 + ], + [ + 5778, + 0.3 + ], + [ + 5779, + 0.3 + ], + [ + 5780, + 0.3 + ], + [ + 5781, + 0.6 + ], + [ + 5782, + 0.25 + ], + [ + 5783, + 0.25 + ], + [ + 5784, + 0.25 + ], + [ + 5785, + 0.25 + ], + [ + 5786, + 0.25 + ], + [ + 5787, + 0.25 + ], + [ + 5788, + 0.25 + ], + [ + 5789, + 0.25 + ], + [ + 5790, + 0.4 + ], + [ + 5791, + 0.3 + ], + [ + 5792, + 0.3 + ], + [ + 5793, + 0.3 + ], + [ + 5794, + 0.3 + ], + [ + 5795, + 0.3 + ], + [ + 5796, + 0.5 + ], + [ + 5797, + 0.3 + ], + [ + 5798, + 0.3 + ], + [ + 5799, + 0.3 + ], + [ + 5800, + 0.3 + ], + [ + 5801, + 0.3 + ], + [ + 5802, + 0.3 + ], + [ + 5803, + 0.3 + ], + [ + 5804, + 0.3 + ], + [ + 5805, + 0.6 + ], + [ + 5806, + 0.25 + ], + [ + 5807, + 0.25 + ], + [ + 5808, + 0.25 + ], + [ + 5809, + 0.25 + ], + [ + 5810, + 0.25 + ], + [ + 5811, + 0.25 + ], + [ + 5812, + 0.25 + ], + [ + 5813, + 0.25 + ], + [ + 5814, + 0.4 + ], + [ + 5815, + 0.3 + ], + [ + 5816, + 0.3 + ], + [ + 5817, + 0.3 + ], + [ + 5818, + 0.3 + ], + [ + 5819, + 0.3 + ], + [ + 5820, + 0.5 + ], + [ + 5821, + 0.3 + ], + [ + 5822, + 0.3 + ], + [ + 5823, + 0.3 + ], + [ + 5824, + 0.3 + ], + [ + 5825, + 0.3 + ], + [ + 5826, + 0.3 + ], + [ + 5827, + 0.3 + ], + [ + 5828, + 0.3 + ], + [ + 5829, + 0.6 + ], + [ + 5830, + 0.25 + ], + [ + 5831, + 0.25 + ], + [ + 5832, + 0.3 + ], + [ + 5833, + 0.3 + ], + [ + 5834, + 0.3 + ], + [ + 5835, + 0.3 + ], + [ + 5836, + 0.3 + ], + [ + 5837, + 0.3 + ], + [ + 5838, + 0.3 + ], + [ + 5839, + 0.5 + ], + [ + 5840, + 0.55 + ], + [ + 5841, + 0.55 + ], + [ + 5842, + 0.55 + ], + [ + 5843, + 0.55 + ], + [ + 5844, + 0.65 + ], + [ + 5845, + 0.55 + ], + [ + 5846, + 0.55 + ], + [ + 5847, + 0.55 + ], + [ + 5848, + 0.55 + ], + [ + 5849, + 0.55 + ], + [ + 5850, + 0.55 + ], + [ + 5851, + 0.55 + ], + [ + 5852, + 0.55 + ], + [ + 5853, + 0.55 + ], + [ + 5854, + 0.7 + ], + [ + 5855, + 0.3 + ], + [ + 5856, + 0.3 + ], + [ + 5857, + 0.3 + ], + [ + 5858, + 0.3 + ], + [ + 5859, + 0.3 + ], + [ + 5860, + 0.3 + ], + [ + 5861, + 0.3 + ], + [ + 5862, + 0.3 + ], + [ + 5863, + 0.5 + ], + [ + 5864, + 0.55 + ], + [ + 5865, + 0.55 + ], + [ + 5866, + 0.55 + ], + [ + 5867, + 0.55 + ], + [ + 5868, + 0.65 + ], + [ + 5869, + 0.55 + ], + [ + 5870, + 0.55 + ], + [ + 5871, + 0.55 + ], + [ + 5872, + 0.55 + ], + [ + 5873, + 0.55 + ], + [ + 5874, + 0.55 + ], + [ + 5875, + 0.55 + ], + [ + 5876, + 0.55 + ], + [ + 5877, + 0.55 + ], + [ + 5878, + 0.7 + ], + [ + 5879, + 0.3 + ], + [ + 5880, + 0.25 + ], + [ + 5881, + 0.25 + ], + [ + 5882, + 0.25 + ], + [ + 5883, + 0.25 + ], + [ + 5884, + 0.25 + ], + [ + 5885, + 0.25 + ], + [ + 5886, + 0.4 + ], + [ + 5887, + 0.3 + ], + [ + 5888, + 0.3 + ], + [ + 5889, + 0.3 + ], + [ + 5890, + 0.3 + ], + [ + 5891, + 0.3 + ], + [ + 5892, + 0.5 + ], + [ + 5893, + 0.3 + ], + [ + 5894, + 0.3 + ], + [ + 5895, + 0.3 + ], + [ + 5896, + 0.3 + ], + [ + 5897, + 0.3 + ], + [ + 5898, + 0.3 + ], + [ + 5899, + 0.3 + ], + [ + 5900, + 0.3 + ], + [ + 5901, + 0.6 + ], + [ + 5902, + 0.25 + ], + [ + 5903, + 0.25 + ], + [ + 5904, + 0.25 + ], + [ + 5905, + 0.25 + ], + [ + 5906, + 0.25 + ], + [ + 5907, + 0.25 + ], + [ + 5908, + 0.25 + ], + [ + 5909, + 0.25 + ], + [ + 5910, + 0.4 + ], + [ + 5911, + 0.3 + ], + [ + 5912, + 0.3 + ], + [ + 5913, + 0.3 + ], + [ + 5914, + 0.3 + ], + [ + 5915, + 0.3 + ], + [ + 5916, + 0.5 + ], + [ + 5917, + 0.3 + ], + [ + 5918, + 0.3 + ], + [ + 5919, + 0.3 + ], + [ + 5920, + 0.3 + ], + [ + 5921, + 0.3 + ], + [ + 5922, + 0.3 + ], + [ + 5923, + 0.3 + ], + [ + 5924, + 0.3 + ], + [ + 5925, + 0.6 + ], + [ + 5926, + 0.25 + ], + [ + 5927, + 0.25 + ], + [ + 5928, + 0.25 + ], + [ + 5929, + 0.25 + ], + [ + 5930, + 0.25 + ], + [ + 5931, + 0.25 + ], + [ + 5932, + 0.25 + ], + [ + 5933, + 0.25 + ], + [ + 5934, + 0.4 + ], + [ + 5935, + 0.3 + ], + [ + 5936, + 0.3 + ], + [ + 5937, + 0.3 + ], + [ + 5938, + 0.3 + ], + [ + 5939, + 0.3 + ], + [ + 5940, + 0.5 + ], + [ + 5941, + 0.3 + ], + [ + 5942, + 0.3 + ], + [ + 5943, + 0.3 + ], + [ + 5944, + 0.3 + ], + [ + 5945, + 0.3 + ], + [ + 5946, + 0.3 + ], + [ + 5947, + 0.3 + ], + [ + 5948, + 0.3 + ], + [ + 5949, + 0.6 + ], + [ + 5950, + 0.25 + ], + [ + 5951, + 0.25 + ], + [ + 5952, + 0.25 + ], + [ + 5953, + 0.25 + ], + [ + 5954, + 0.25 + ], + [ + 5955, + 0.25 + ], + [ + 5956, + 0.25 + ], + [ + 5957, + 0.25 + ], + [ + 5958, + 0.4 + ], + [ + 5959, + 0.3 + ], + [ + 5960, + 0.3 + ], + [ + 5961, + 0.3 + ], + [ + 5962, + 0.3 + ], + [ + 5963, + 0.3 + ], + [ + 5964, + 0.5 + ], + [ + 5965, + 0.3 + ], + [ + 5966, + 0.3 + ], + [ + 5967, + 0.3 + ], + [ + 5968, + 0.3 + ], + [ + 5969, + 0.3 + ], + [ + 5970, + 0.3 + ], + [ + 5971, + 0.3 + ], + [ + 5972, + 0.3 + ], + [ + 5973, + 0.6 + ], + [ + 5974, + 0.25 + ], + [ + 5975, + 0.25 + ], + [ + 5976, + 0.25 + ], + [ + 5977, + 0.25 + ], + [ + 5978, + 0.25 + ], + [ + 5979, + 0.25 + ], + [ + 5980, + 0.25 + ], + [ + 5981, + 0.25 + ], + [ + 5982, + 0.4 + ], + [ + 5983, + 0.3 + ], + [ + 5984, + 0.3 + ], + [ + 5985, + 0.3 + ], + [ + 5986, + 0.3 + ], + [ + 5987, + 0.3 + ], + [ + 5988, + 0.5 + ], + [ + 5989, + 0.3 + ], + [ + 5990, + 0.3 + ], + [ + 5991, + 0.3 + ], + [ + 5992, + 0.3 + ], + [ + 5993, + 0.3 + ], + [ + 5994, + 0.3 + ], + [ + 5995, + 0.3 + ], + [ + 5996, + 0.3 + ], + [ + 5997, + 0.6 + ], + [ + 5998, + 0.25 + ], + [ + 5999, + 0.25 + ], + [ + 6000, + 0.3 + ], + [ + 6001, + 0.3 + ], + [ + 6002, + 0.3 + ], + [ + 6003, + 0.3 + ], + [ + 6004, + 0.3 + ], + [ + 6005, + 0.3 + ], + [ + 6006, + 0.3 + ], + [ + 6007, + 0.5 + ], + [ + 6008, + 0.55 + ], + [ + 6009, + 0.55 + ], + [ + 6010, + 0.55 + ], + [ + 6011, + 0.55 + ], + [ + 6012, + 0.65 + ], + [ + 6013, + 0.55 + ], + [ + 6014, + 0.55 + ], + [ + 6015, + 0.55 + ], + [ + 6016, + 0.55 + ], + [ + 6017, + 0.55 + ], + [ + 6018, + 0.55 + ], + [ + 6019, + 0.55 + ], + [ + 6020, + 0.55 + ], + [ + 6021, + 0.55 + ], + [ + 6022, + 0.7 + ], + [ + 6023, + 0.3 + ], + [ + 6024, + 0.3 + ], + [ + 6025, + 0.3 + ], + [ + 6026, + 0.3 + ], + [ + 6027, + 0.3 + ], + [ + 6028, + 0.3 + ], + [ + 6029, + 0.3 + ], + [ + 6030, + 0.3 + ], + [ + 6031, + 0.5 + ], + [ + 6032, + 0.55 + ], + [ + 6033, + 0.55 + ], + [ + 6034, + 0.55 + ], + [ + 6035, + 0.55 + ], + [ + 6036, + 0.65 + ], + [ + 6037, + 0.55 + ], + [ + 6038, + 0.55 + ], + [ + 6039, + 0.55 + ], + [ + 6040, + 0.55 + ], + [ + 6041, + 0.55 + ], + [ + 6042, + 0.55 + ], + [ + 6043, + 0.55 + ], + [ + 6044, + 0.55 + ], + [ + 6045, + 0.55 + ], + [ + 6046, + 0.7 + ], + [ + 6047, + 0.3 + ], + [ + 6048, + 0.25 + ], + [ + 6049, + 0.25 + ], + [ + 6050, + 0.25 + ], + [ + 6051, + 0.25 + ], + [ + 6052, + 0.25 + ], + [ + 6053, + 0.25 + ], + [ + 6054, + 0.4 + ], + [ + 6055, + 0.3 + ], + [ + 6056, + 0.3 + ], + [ + 6057, + 0.3 + ], + [ + 6058, + 0.3 + ], + [ + 6059, + 0.3 + ], + [ + 6060, + 0.5 + ], + [ + 6061, + 0.3 + ], + [ + 6062, + 0.3 + ], + [ + 6063, + 0.3 + ], + [ + 6064, + 0.3 + ], + [ + 6065, + 0.3 + ], + [ + 6066, + 0.3 + ], + [ + 6067, + 0.3 + ], + [ + 6068, + 0.3 + ], + [ + 6069, + 0.6 + ], + [ + 6070, + 0.25 + ], + [ + 6071, + 0.25 + ], + [ + 6072, + 0.25 + ], + [ + 6073, + 0.25 + ], + [ + 6074, + 0.25 + ], + [ + 6075, + 0.25 + ], + [ + 6076, + 0.25 + ], + [ + 6077, + 0.25 + ], + [ + 6078, + 0.4 + ], + [ + 6079, + 0.3 + ], + [ + 6080, + 0.3 + ], + [ + 6081, + 0.3 + ], + [ + 6082, + 0.3 + ], + [ + 6083, + 0.3 + ], + [ + 6084, + 0.5 + ], + [ + 6085, + 0.3 + ], + [ + 6086, + 0.3 + ], + [ + 6087, + 0.3 + ], + [ + 6088, + 0.3 + ], + [ + 6089, + 0.3 + ], + [ + 6090, + 0.3 + ], + [ + 6091, + 0.3 + ], + [ + 6092, + 0.3 + ], + [ + 6093, + 0.6 + ], + [ + 6094, + 0.25 + ], + [ + 6095, + 0.25 + ], + [ + 6096, + 0.25 + ], + [ + 6097, + 0.25 + ], + [ + 6098, + 0.25 + ], + [ + 6099, + 0.25 + ], + [ + 6100, + 0.25 + ], + [ + 6101, + 0.25 + ], + [ + 6102, + 0.4 + ], + [ + 6103, + 0.3 + ], + [ + 6104, + 0.3 + ], + [ + 6105, + 0.3 + ], + [ + 6106, + 0.3 + ], + [ + 6107, + 0.3 + ], + [ + 6108, + 0.5 + ], + [ + 6109, + 0.3 + ], + [ + 6110, + 0.3 + ], + [ + 6111, + 0.3 + ], + [ + 6112, + 0.3 + ], + [ + 6113, + 0.3 + ], + [ + 6114, + 0.3 + ], + [ + 6115, + 0.3 + ], + [ + 6116, + 0.3 + ], + [ + 6117, + 0.6 + ], + [ + 6118, + 0.25 + ], + [ + 6119, + 0.25 + ], + [ + 6120, + 0.25 + ], + [ + 6121, + 0.25 + ], + [ + 6122, + 0.25 + ], + [ + 6123, + 0.25 + ], + [ + 6124, + 0.25 + ], + [ + 6125, + 0.25 + ], + [ + 6126, + 0.4 + ], + [ + 6127, + 0.3 + ], + [ + 6128, + 0.3 + ], + [ + 6129, + 0.3 + ], + [ + 6130, + 0.3 + ], + [ + 6131, + 0.3 + ], + [ + 6132, + 0.5 + ], + [ + 6133, + 0.3 + ], + [ + 6134, + 0.3 + ], + [ + 6135, + 0.3 + ], + [ + 6136, + 0.3 + ], + [ + 6137, + 0.3 + ], + [ + 6138, + 0.3 + ], + [ + 6139, + 0.3 + ], + [ + 6140, + 0.3 + ], + [ + 6141, + 0.6 + ], + [ + 6142, + 0.25 + ], + [ + 6143, + 0.25 + ], + [ + 6144, + 0.25 + ], + [ + 6145, + 0.25 + ], + [ + 6146, + 0.25 + ], + [ + 6147, + 0.25 + ], + [ + 6148, + 0.25 + ], + [ + 6149, + 0.25 + ], + [ + 6150, + 0.4 + ], + [ + 6151, + 0.3 + ], + [ + 6152, + 0.3 + ], + [ + 6153, + 0.3 + ], + [ + 6154, + 0.3 + ], + [ + 6155, + 0.3 + ], + [ + 6156, + 0.5 + ], + [ + 6157, + 0.3 + ], + [ + 6158, + 0.3 + ], + [ + 6159, + 0.3 + ], + [ + 6160, + 0.3 + ], + [ + 6161, + 0.3 + ], + [ + 6162, + 0.3 + ], + [ + 6163, + 0.3 + ], + [ + 6164, + 0.3 + ], + [ + 6165, + 0.6 + ], + [ + 6166, + 0.25 + ], + [ + 6167, + 0.25 + ], + [ + 6168, + 0.3 + ], + [ + 6169, + 0.3 + ], + [ + 6170, + 0.3 + ], + [ + 6171, + 0.3 + ], + [ + 6172, + 0.3 + ], + [ + 6173, + 0.3 + ], + [ + 6174, + 0.3 + ], + [ + 6175, + 0.5 + ], + [ + 6176, + 0.55 + ], + [ + 6177, + 0.55 + ], + [ + 6178, + 0.55 + ], + [ + 6179, + 0.55 + ], + [ + 6180, + 0.65 + ], + [ + 6181, + 0.55 + ], + [ + 6182, + 0.55 + ], + [ + 6183, + 0.55 + ], + [ + 6184, + 0.55 + ], + [ + 6185, + 0.55 + ], + [ + 6186, + 0.55 + ], + [ + 6187, + 0.55 + ], + [ + 6188, + 0.55 + ], + [ + 6189, + 0.55 + ], + [ + 6190, + 0.7 + ], + [ + 6191, + 0.3 + ], + [ + 6192, + 0.3 + ], + [ + 6193, + 0.3 + ], + [ + 6194, + 0.3 + ], + [ + 6195, + 0.3 + ], + [ + 6196, + 0.3 + ], + [ + 6197, + 0.3 + ], + [ + 6198, + 0.3 + ], + [ + 6199, + 0.5 + ], + [ + 6200, + 0.55 + ], + [ + 6201, + 0.55 + ], + [ + 6202, + 0.55 + ], + [ + 6203, + 0.55 + ], + [ + 6204, + 0.65 + ], + [ + 6205, + 0.55 + ], + [ + 6206, + 0.55 + ], + [ + 6207, + 0.55 + ], + [ + 6208, + 0.55 + ], + [ + 6209, + 0.55 + ], + [ + 6210, + 0.55 + ], + [ + 6211, + 0.55 + ], + [ + 6212, + 0.55 + ], + [ + 6213, + 0.55 + ], + [ + 6214, + 0.7 + ], + [ + 6215, + 0.3 + ], + [ + 6216, + 0.25 + ], + [ + 6217, + 0.25 + ], + [ + 6218, + 0.25 + ], + [ + 6219, + 0.25 + ], + [ + 6220, + 0.25 + ], + [ + 6221, + 0.25 + ], + [ + 6222, + 0.4 + ], + [ + 6223, + 0.3 + ], + [ + 6224, + 0.3 + ], + [ + 6225, + 0.3 + ], + [ + 6226, + 0.3 + ], + [ + 6227, + 0.3 + ], + [ + 6228, + 0.5 + ], + [ + 6229, + 0.3 + ], + [ + 6230, + 0.3 + ], + [ + 6231, + 0.3 + ], + [ + 6232, + 0.3 + ], + [ + 6233, + 0.3 + ], + [ + 6234, + 0.3 + ], + [ + 6235, + 0.3 + ], + [ + 6236, + 0.3 + ], + [ + 6237, + 0.6 + ], + [ + 6238, + 0.25 + ], + [ + 6239, + 0.25 + ], + [ + 6240, + 0.25 + ], + [ + 6241, + 0.25 + ], + [ + 6242, + 0.25 + ], + [ + 6243, + 0.25 + ], + [ + 6244, + 0.25 + ], + [ + 6245, + 0.25 + ], + [ + 6246, + 0.4 + ], + [ + 6247, + 0.3 + ], + [ + 6248, + 0.3 + ], + [ + 6249, + 0.3 + ], + [ + 6250, + 0.3 + ], + [ + 6251, + 0.3 + ], + [ + 6252, + 0.5 + ], + [ + 6253, + 0.3 + ], + [ + 6254, + 0.3 + ], + [ + 6255, + 0.3 + ], + [ + 6256, + 0.3 + ], + [ + 6257, + 0.3 + ], + [ + 6258, + 0.3 + ], + [ + 6259, + 0.3 + ], + [ + 6260, + 0.3 + ], + [ + 6261, + 0.6 + ], + [ + 6262, + 0.25 + ], + [ + 6263, + 0.25 + ], + [ + 6264, + 0.25 + ], + [ + 6265, + 0.25 + ], + [ + 6266, + 0.25 + ], + [ + 6267, + 0.25 + ], + [ + 6268, + 0.25 + ], + [ + 6269, + 0.25 + ], + [ + 6270, + 0.4 + ], + [ + 6271, + 0.3 + ], + [ + 6272, + 0.3 + ], + [ + 6273, + 0.3 + ], + [ + 6274, + 0.3 + ], + [ + 6275, + 0.3 + ], + [ + 6276, + 0.5 + ], + [ + 6277, + 0.3 + ], + [ + 6278, + 0.3 + ], + [ + 6279, + 0.3 + ], + [ + 6280, + 0.3 + ], + [ + 6281, + 0.3 + ], + [ + 6282, + 0.3 + ], + [ + 6283, + 0.3 + ], + [ + 6284, + 0.3 + ], + [ + 6285, + 0.6 + ], + [ + 6286, + 0.25 + ], + [ + 6287, + 0.25 + ], + [ + 6288, + 0.25 + ], + [ + 6289, + 0.25 + ], + [ + 6290, + 0.25 + ], + [ + 6291, + 0.25 + ], + [ + 6292, + 0.25 + ], + [ + 6293, + 0.25 + ], + [ + 6294, + 0.4 + ], + [ + 6295, + 0.3 + ], + [ + 6296, + 0.3 + ], + [ + 6297, + 0.3 + ], + [ + 6298, + 0.3 + ], + [ + 6299, + 0.3 + ], + [ + 6300, + 0.5 + ], + [ + 6301, + 0.3 + ], + [ + 6302, + 0.3 + ], + [ + 6303, + 0.3 + ], + [ + 6304, + 0.3 + ], + [ + 6305, + 0.3 + ], + [ + 6306, + 0.3 + ], + [ + 6307, + 0.3 + ], + [ + 6308, + 0.3 + ], + [ + 6309, + 0.6 + ], + [ + 6310, + 0.25 + ], + [ + 6311, + 0.25 + ], + [ + 6312, + 0.25 + ], + [ + 6313, + 0.25 + ], + [ + 6314, + 0.25 + ], + [ + 6315, + 0.25 + ], + [ + 6316, + 0.25 + ], + [ + 6317, + 0.25 + ], + [ + 6318, + 0.4 + ], + [ + 6319, + 0.3 + ], + [ + 6320, + 0.3 + ], + [ + 6321, + 0.3 + ], + [ + 6322, + 0.3 + ], + [ + 6323, + 0.3 + ], + [ + 6324, + 0.5 + ], + [ + 6325, + 0.3 + ], + [ + 6326, + 0.3 + ], + [ + 6327, + 0.3 + ], + [ + 6328, + 0.3 + ], + [ + 6329, + 0.3 + ], + [ + 6330, + 0.3 + ], + [ + 6331, + 0.3 + ], + [ + 6332, + 0.3 + ], + [ + 6333, + 0.6 + ], + [ + 6334, + 0.25 + ], + [ + 6335, + 0.25 + ], + [ + 6336, + 0.3 + ], + [ + 6337, + 0.3 + ], + [ + 6338, + 0.3 + ], + [ + 6339, + 0.3 + ], + [ + 6340, + 0.3 + ], + [ + 6341, + 0.3 + ], + [ + 6342, + 0.3 + ], + [ + 6343, + 0.5 + ], + [ + 6344, + 0.55 + ], + [ + 6345, + 0.55 + ], + [ + 6346, + 0.55 + ], + [ + 6347, + 0.55 + ], + [ + 6348, + 0.65 + ], + [ + 6349, + 0.55 + ], + [ + 6350, + 0.55 + ], + [ + 6351, + 0.55 + ], + [ + 6352, + 0.55 + ], + [ + 6353, + 0.55 + ], + [ + 6354, + 0.55 + ], + [ + 6355, + 0.55 + ], + [ + 6356, + 0.55 + ], + [ + 6357, + 0.55 + ], + [ + 6358, + 0.7 + ], + [ + 6359, + 0.3 + ], + [ + 6360, + 0.3 + ], + [ + 6361, + 0.3 + ], + [ + 6362, + 0.3 + ], + [ + 6363, + 0.3 + ], + [ + 6364, + 0.3 + ], + [ + 6365, + 0.3 + ], + [ + 6366, + 0.3 + ], + [ + 6367, + 0.5 + ], + [ + 6368, + 0.55 + ], + [ + 6369, + 0.55 + ], + [ + 6370, + 0.55 + ], + [ + 6371, + 0.55 + ], + [ + 6372, + 0.65 + ], + [ + 6373, + 0.55 + ], + [ + 6374, + 0.55 + ], + [ + 6375, + 0.55 + ], + [ + 6376, + 0.55 + ], + [ + 6377, + 0.55 + ], + [ + 6378, + 0.55 + ], + [ + 6379, + 0.55 + ], + [ + 6380, + 0.55 + ], + [ + 6381, + 0.55 + ], + [ + 6382, + 0.7 + ], + [ + 6383, + 0.3 + ], + [ + 6384, + 0.25 + ], + [ + 6385, + 0.25 + ], + [ + 6386, + 0.25 + ], + [ + 6387, + 0.25 + ], + [ + 6388, + 0.25 + ], + [ + 6389, + 0.25 + ], + [ + 6390, + 0.4 + ], + [ + 6391, + 0.3 + ], + [ + 6392, + 0.3 + ], + [ + 6393, + 0.3 + ], + [ + 6394, + 0.3 + ], + [ + 6395, + 0.3 + ], + [ + 6396, + 0.5 + ], + [ + 6397, + 0.3 + ], + [ + 6398, + 0.3 + ], + [ + 6399, + 0.3 + ], + [ + 6400, + 0.3 + ], + [ + 6401, + 0.3 + ], + [ + 6402, + 0.3 + ], + [ + 6403, + 0.3 + ], + [ + 6404, + 0.3 + ], + [ + 6405, + 0.6 + ], + [ + 6406, + 0.25 + ], + [ + 6407, + 0.25 + ], + [ + 6408, + 0.25 + ], + [ + 6409, + 0.25 + ], + [ + 6410, + 0.25 + ], + [ + 6411, + 0.25 + ], + [ + 6412, + 0.25 + ], + [ + 6413, + 0.25 + ], + [ + 6414, + 0.4 + ], + [ + 6415, + 0.3 + ], + [ + 6416, + 0.3 + ], + [ + 6417, + 0.3 + ], + [ + 6418, + 0.3 + ], + [ + 6419, + 0.3 + ], + [ + 6420, + 0.5 + ], + [ + 6421, + 0.3 + ], + [ + 6422, + 0.3 + ], + [ + 6423, + 0.3 + ], + [ + 6424, + 0.3 + ], + [ + 6425, + 0.3 + ], + [ + 6426, + 0.3 + ], + [ + 6427, + 0.3 + ], + [ + 6428, + 0.3 + ], + [ + 6429, + 0.6 + ], + [ + 6430, + 0.25 + ], + [ + 6431, + 0.25 + ], + [ + 6432, + 0.25 + ], + [ + 6433, + 0.25 + ], + [ + 6434, + 0.25 + ], + [ + 6435, + 0.25 + ], + [ + 6436, + 0.25 + ], + [ + 6437, + 0.25 + ], + [ + 6438, + 0.4 + ], + [ + 6439, + 0.3 + ], + [ + 6440, + 0.3 + ], + [ + 6441, + 0.3 + ], + [ + 6442, + 0.3 + ], + [ + 6443, + 0.3 + ], + [ + 6444, + 0.5 + ], + [ + 6445, + 0.3 + ], + [ + 6446, + 0.3 + ], + [ + 6447, + 0.3 + ], + [ + 6448, + 0.3 + ], + [ + 6449, + 0.3 + ], + [ + 6450, + 0.3 + ], + [ + 6451, + 0.3 + ], + [ + 6452, + 0.3 + ], + [ + 6453, + 0.6 + ], + [ + 6454, + 0.25 + ], + [ + 6455, + 0.25 + ], + [ + 6456, + 0.25 + ], + [ + 6457, + 0.25 + ], + [ + 6458, + 0.25 + ], + [ + 6459, + 0.25 + ], + [ + 6460, + 0.25 + ], + [ + 6461, + 0.25 + ], + [ + 6462, + 0.4 + ], + [ + 6463, + 0.3 + ], + [ + 6464, + 0.3 + ], + [ + 6465, + 0.3 + ], + [ + 6466, + 0.3 + ], + [ + 6467, + 0.3 + ], + [ + 6468, + 0.5 + ], + [ + 6469, + 0.3 + ], + [ + 6470, + 0.3 + ], + [ + 6471, + 0.3 + ], + [ + 6472, + 0.3 + ], + [ + 6473, + 0.3 + ], + [ + 6474, + 0.3 + ], + [ + 6475, + 0.3 + ], + [ + 6476, + 0.3 + ], + [ + 6477, + 0.6 + ], + [ + 6478, + 0.25 + ], + [ + 6479, + 0.25 + ], + [ + 6480, + 0.25 + ], + [ + 6481, + 0.25 + ], + [ + 6482, + 0.25 + ], + [ + 6483, + 0.25 + ], + [ + 6484, + 0.25 + ], + [ + 6485, + 0.25 + ], + [ + 6486, + 0.4 + ], + [ + 6487, + 0.3 + ], + [ + 6488, + 0.3 + ], + [ + 6489, + 0.3 + ], + [ + 6490, + 0.3 + ], + [ + 6491, + 0.3 + ], + [ + 6492, + 0.5 + ], + [ + 6493, + 0.3 + ], + [ + 6494, + 0.3 + ], + [ + 6495, + 0.3 + ], + [ + 6496, + 0.3 + ], + [ + 6497, + 0.3 + ], + [ + 6498, + 0.3 + ], + [ + 6499, + 0.3 + ], + [ + 6500, + 0.3 + ], + [ + 6501, + 0.6 + ], + [ + 6502, + 0.25 + ], + [ + 6503, + 0.25 + ], + [ + 6504, + 0.3 + ], + [ + 6505, + 0.3 + ], + [ + 6506, + 0.3 + ], + [ + 6507, + 0.3 + ], + [ + 6508, + 0.3 + ], + [ + 6509, + 0.3 + ], + [ + 6510, + 0.3 + ], + [ + 6511, + 0.5 + ], + [ + 6512, + 0.55 + ], + [ + 6513, + 0.55 + ], + [ + 6514, + 0.55 + ], + [ + 6515, + 0.55 + ], + [ + 6516, + 0.65 + ], + [ + 6517, + 0.55 + ], + [ + 6518, + 0.55 + ], + [ + 6519, + 0.55 + ], + [ + 6520, + 0.55 + ], + [ + 6521, + 0.55 + ], + [ + 6522, + 0.55 + ], + [ + 6523, + 0.55 + ], + [ + 6524, + 0.55 + ], + [ + 6525, + 0.55 + ], + [ + 6526, + 0.7 + ], + [ + 6527, + 0.3 + ], + [ + 6528, + 0.3 + ], + [ + 6529, + 0.3 + ], + [ + 6530, + 0.3 + ], + [ + 6531, + 0.3 + ], + [ + 6532, + 0.3 + ], + [ + 6533, + 0.3 + ], + [ + 6534, + 0.3 + ], + [ + 6535, + 0.5 + ], + [ + 6536, + 0.55 + ], + [ + 6537, + 0.55 + ], + [ + 6538, + 0.55 + ], + [ + 6539, + 0.55 + ], + [ + 6540, + 0.65 + ], + [ + 6541, + 0.55 + ], + [ + 6542, + 0.55 + ], + [ + 6543, + 0.55 + ], + [ + 6544, + 0.55 + ], + [ + 6545, + 0.55 + ], + [ + 6546, + 0.55 + ], + [ + 6547, + 0.55 + ], + [ + 6548, + 0.55 + ], + [ + 6549, + 0.55 + ], + [ + 6550, + 0.7 + ], + [ + 6551, + 0.3 + ], + [ + 6552, + 0.25 + ], + [ + 6553, + 0.25 + ], + [ + 6554, + 0.25 + ], + [ + 6555, + 0.25 + ], + [ + 6556, + 0.25 + ], + [ + 6557, + 0.25 + ], + [ + 6558, + 0.4 + ], + [ + 6559, + 0.3 + ], + [ + 6560, + 0.3 + ], + [ + 6561, + 0.3 + ], + [ + 6562, + 0.3 + ], + [ + 6563, + 0.3 + ], + [ + 6564, + 0.5 + ], + [ + 6565, + 0.3 + ], + [ + 6566, + 0.3 + ], + [ + 6567, + 0.3 + ], + [ + 6568, + 0.3 + ], + [ + 6569, + 0.3 + ], + [ + 6570, + 0.3 + ], + [ + 6571, + 0.3 + ], + [ + 6572, + 0.3 + ], + [ + 6573, + 0.6 + ], + [ + 6574, + 0.25 + ], + [ + 6575, + 0.25 + ], + [ + 6576, + 0.25 + ], + [ + 6577, + 0.25 + ], + [ + 6578, + 0.25 + ], + [ + 6579, + 0.25 + ], + [ + 6580, + 0.25 + ], + [ + 6581, + 0.25 + ], + [ + 6582, + 0.4 + ], + [ + 6583, + 0.3 + ], + [ + 6584, + 0.3 + ], + [ + 6585, + 0.3 + ], + [ + 6586, + 0.3 + ], + [ + 6587, + 0.3 + ], + [ + 6588, + 0.5 + ], + [ + 6589, + 0.3 + ], + [ + 6590, + 0.3 + ], + [ + 6591, + 0.3 + ], + [ + 6592, + 0.3 + ], + [ + 6593, + 0.3 + ], + [ + 6594, + 0.3 + ], + [ + 6595, + 0.3 + ], + [ + 6596, + 0.3 + ], + [ + 6597, + 0.6 + ], + [ + 6598, + 0.25 + ], + [ + 6599, + 0.25 + ], + [ + 6600, + 0.25 + ], + [ + 6601, + 0.25 + ], + [ + 6602, + 0.25 + ], + [ + 6603, + 0.25 + ], + [ + 6604, + 0.25 + ], + [ + 6605, + 0.25 + ], + [ + 6606, + 0.4 + ], + [ + 6607, + 0.3 + ], + [ + 6608, + 0.3 + ], + [ + 6609, + 0.3 + ], + [ + 6610, + 0.3 + ], + [ + 6611, + 0.3 + ], + [ + 6612, + 0.5 + ], + [ + 6613, + 0.3 + ], + [ + 6614, + 0.3 + ], + [ + 6615, + 0.3 + ], + [ + 6616, + 0.3 + ], + [ + 6617, + 0.3 + ], + [ + 6618, + 0.3 + ], + [ + 6619, + 0.3 + ], + [ + 6620, + 0.3 + ], + [ + 6621, + 0.6 + ], + [ + 6622, + 0.25 + ], + [ + 6623, + 0.25 + ], + [ + 6624, + 0.25 + ], + [ + 6625, + 0.25 + ], + [ + 6626, + 0.25 + ], + [ + 6627, + 0.25 + ], + [ + 6628, + 0.25 + ], + [ + 6629, + 0.25 + ], + [ + 6630, + 0.4 + ], + [ + 6631, + 0.3 + ], + [ + 6632, + 0.3 + ], + [ + 6633, + 0.3 + ], + [ + 6634, + 0.3 + ], + [ + 6635, + 0.3 + ], + [ + 6636, + 0.5 + ], + [ + 6637, + 0.3 + ], + [ + 6638, + 0.3 + ], + [ + 6639, + 0.3 + ], + [ + 6640, + 0.3 + ], + [ + 6641, + 0.3 + ], + [ + 6642, + 0.3 + ], + [ + 6643, + 0.3 + ], + [ + 6644, + 0.3 + ], + [ + 6645, + 0.6 + ], + [ + 6646, + 0.25 + ], + [ + 6647, + 0.25 + ], + [ + 6648, + 0.25 + ], + [ + 6649, + 0.25 + ], + [ + 6650, + 0.25 + ], + [ + 6651, + 0.25 + ], + [ + 6652, + 0.25 + ], + [ + 6653, + 0.25 + ], + [ + 6654, + 0.4 + ], + [ + 6655, + 0.3 + ], + [ + 6656, + 0.3 + ], + [ + 6657, + 0.3 + ], + [ + 6658, + 0.3 + ], + [ + 6659, + 0.3 + ], + [ + 6660, + 0.5 + ], + [ + 6661, + 0.3 + ], + [ + 6662, + 0.3 + ], + [ + 6663, + 0.3 + ], + [ + 6664, + 0.3 + ], + [ + 6665, + 0.3 + ], + [ + 6666, + 0.3 + ], + [ + 6667, + 0.3 + ], + [ + 6668, + 0.3 + ], + [ + 6669, + 0.6 + ], + [ + 6670, + 0.25 + ], + [ + 6671, + 0.25 + ], + [ + 6672, + 0.3 + ], + [ + 6673, + 0.3 + ], + [ + 6674, + 0.3 + ], + [ + 6675, + 0.3 + ], + [ + 6676, + 0.3 + ], + [ + 6677, + 0.3 + ], + [ + 6678, + 0.3 + ], + [ + 6679, + 0.5 + ], + [ + 6680, + 0.55 + ], + [ + 6681, + 0.55 + ], + [ + 6682, + 0.55 + ], + [ + 6683, + 0.55 + ], + [ + 6684, + 0.65 + ], + [ + 6685, + 0.55 + ], + [ + 6686, + 0.55 + ], + [ + 6687, + 0.55 + ], + [ + 6688, + 0.55 + ], + [ + 6689, + 0.55 + ], + [ + 6690, + 0.55 + ], + [ + 6691, + 0.55 + ], + [ + 6692, + 0.55 + ], + [ + 6693, + 0.55 + ], + [ + 6694, + 0.7 + ], + [ + 6695, + 0.3 + ], + [ + 6696, + 0.3 + ], + [ + 6697, + 0.3 + ], + [ + 6698, + 0.3 + ], + [ + 6699, + 0.3 + ], + [ + 6700, + 0.3 + ], + [ + 6701, + 0.3 + ], + [ + 6702, + 0.3 + ], + [ + 6703, + 0.5 + ], + [ + 6704, + 0.55 + ], + [ + 6705, + 0.55 + ], + [ + 6706, + 0.55 + ], + [ + 6707, + 0.55 + ], + [ + 6708, + 0.65 + ], + [ + 6709, + 0.55 + ], + [ + 6710, + 0.55 + ], + [ + 6711, + 0.55 + ], + [ + 6712, + 0.55 + ], + [ + 6713, + 0.55 + ], + [ + 6714, + 0.55 + ], + [ + 6715, + 0.55 + ], + [ + 6716, + 0.55 + ], + [ + 6717, + 0.55 + ], + [ + 6718, + 0.7 + ], + [ + 6719, + 0.3 + ], + [ + 6720, + 0.25 + ], + [ + 6721, + 0.25 + ], + [ + 6722, + 0.25 + ], + [ + 6723, + 0.25 + ], + [ + 6724, + 0.25 + ], + [ + 6725, + 0.25 + ], + [ + 6726, + 0.4 + ], + [ + 6727, + 0.3 + ], + [ + 6728, + 0.3 + ], + [ + 6729, + 0.3 + ], + [ + 6730, + 0.3 + ], + [ + 6731, + 0.3 + ], + [ + 6732, + 0.5 + ], + [ + 6733, + 0.3 + ], + [ + 6734, + 0.3 + ], + [ + 6735, + 0.3 + ], + [ + 6736, + 0.3 + ], + [ + 6737, + 0.3 + ], + [ + 6738, + 0.3 + ], + [ + 6739, + 0.3 + ], + [ + 6740, + 0.3 + ], + [ + 6741, + 0.6 + ], + [ + 6742, + 0.25 + ], + [ + 6743, + 0.25 + ], + [ + 6744, + 0.25 + ], + [ + 6745, + 0.25 + ], + [ + 6746, + 0.25 + ], + [ + 6747, + 0.25 + ], + [ + 6748, + 0.25 + ], + [ + 6749, + 0.25 + ], + [ + 6750, + 0.4 + ], + [ + 6751, + 0.3 + ], + [ + 6752, + 0.3 + ], + [ + 6753, + 0.3 + ], + [ + 6754, + 0.3 + ], + [ + 6755, + 0.3 + ], + [ + 6756, + 0.5 + ], + [ + 6757, + 0.3 + ], + [ + 6758, + 0.3 + ], + [ + 6759, + 0.3 + ], + [ + 6760, + 0.3 + ], + [ + 6761, + 0.3 + ], + [ + 6762, + 0.3 + ], + [ + 6763, + 0.3 + ], + [ + 6764, + 0.3 + ], + [ + 6765, + 0.6 + ], + [ + 6766, + 0.25 + ], + [ + 6767, + 0.25 + ], + [ + 6768, + 0.25 + ], + [ + 6769, + 0.25 + ], + [ + 6770, + 0.25 + ], + [ + 6771, + 0.25 + ], + [ + 6772, + 0.25 + ], + [ + 6773, + 0.25 + ], + [ + 6774, + 0.4 + ], + [ + 6775, + 0.3 + ], + [ + 6776, + 0.3 + ], + [ + 6777, + 0.3 + ], + [ + 6778, + 0.3 + ], + [ + 6779, + 0.3 + ], + [ + 6780, + 0.5 + ], + [ + 6781, + 0.3 + ], + [ + 6782, + 0.3 + ], + [ + 6783, + 0.3 + ], + [ + 6784, + 0.3 + ], + [ + 6785, + 0.3 + ], + [ + 6786, + 0.3 + ], + [ + 6787, + 0.3 + ], + [ + 6788, + 0.3 + ], + [ + 6789, + 0.6 + ], + [ + 6790, + 0.25 + ], + [ + 6791, + 0.25 + ], + [ + 6792, + 0.25 + ], + [ + 6793, + 0.25 + ], + [ + 6794, + 0.25 + ], + [ + 6795, + 0.25 + ], + [ + 6796, + 0.25 + ], + [ + 6797, + 0.25 + ], + [ + 6798, + 0.4 + ], + [ + 6799, + 0.3 + ], + [ + 6800, + 0.3 + ], + [ + 6801, + 0.3 + ], + [ + 6802, + 0.3 + ], + [ + 6803, + 0.3 + ], + [ + 6804, + 0.5 + ], + [ + 6805, + 0.3 + ], + [ + 6806, + 0.3 + ], + [ + 6807, + 0.3 + ], + [ + 6808, + 0.3 + ], + [ + 6809, + 0.3 + ], + [ + 6810, + 0.3 + ], + [ + 6811, + 0.3 + ], + [ + 6812, + 0.3 + ], + [ + 6813, + 0.6 + ], + [ + 6814, + 0.25 + ], + [ + 6815, + 0.25 + ], + [ + 6816, + 0.25 + ], + [ + 6817, + 0.25 + ], + [ + 6818, + 0.25 + ], + [ + 6819, + 0.25 + ], + [ + 6820, + 0.25 + ], + [ + 6821, + 0.25 + ], + [ + 6822, + 0.4 + ], + [ + 6823, + 0.3 + ], + [ + 6824, + 0.3 + ], + [ + 6825, + 0.3 + ], + [ + 6826, + 0.3 + ], + [ + 6827, + 0.3 + ], + [ + 6828, + 0.5 + ], + [ + 6829, + 0.3 + ], + [ + 6830, + 0.3 + ], + [ + 6831, + 0.3 + ], + [ + 6832, + 0.3 + ], + [ + 6833, + 0.3 + ], + [ + 6834, + 0.3 + ], + [ + 6835, + 0.3 + ], + [ + 6836, + 0.3 + ], + [ + 6837, + 0.6 + ], + [ + 6838, + 0.25 + ], + [ + 6839, + 0.25 + ], + [ + 6840, + 0.3 + ], + [ + 6841, + 0.3 + ], + [ + 6842, + 0.3 + ], + [ + 6843, + 0.3 + ], + [ + 6844, + 0.3 + ], + [ + 6845, + 0.3 + ], + [ + 6846, + 0.3 + ], + [ + 6847, + 0.5 + ], + [ + 6848, + 0.55 + ], + [ + 6849, + 0.55 + ], + [ + 6850, + 0.55 + ], + [ + 6851, + 0.55 + ], + [ + 6852, + 0.65 + ], + [ + 6853, + 0.55 + ], + [ + 6854, + 0.55 + ], + [ + 6855, + 0.55 + ], + [ + 6856, + 0.55 + ], + [ + 6857, + 0.55 + ], + [ + 6858, + 0.55 + ], + [ + 6859, + 0.55 + ], + [ + 6860, + 0.55 + ], + [ + 6861, + 0.55 + ], + [ + 6862, + 0.7 + ], + [ + 6863, + 0.3 + ], + [ + 6864, + 0.3 + ], + [ + 6865, + 0.3 + ], + [ + 6866, + 0.3 + ], + [ + 6867, + 0.3 + ], + [ + 6868, + 0.3 + ], + [ + 6869, + 0.3 + ], + [ + 6870, + 0.3 + ], + [ + 6871, + 0.5 + ], + [ + 6872, + 0.55 + ], + [ + 6873, + 0.55 + ], + [ + 6874, + 0.55 + ], + [ + 6875, + 0.55 + ], + [ + 6876, + 0.65 + ], + [ + 6877, + 0.55 + ], + [ + 6878, + 0.55 + ], + [ + 6879, + 0.55 + ], + [ + 6880, + 0.55 + ], + [ + 6881, + 0.55 + ], + [ + 6882, + 0.55 + ], + [ + 6883, + 0.55 + ], + [ + 6884, + 0.55 + ], + [ + 6885, + 0.55 + ], + [ + 6886, + 0.7 + ], + [ + 6887, + 0.3 + ], + [ + 6888, + 0.25 + ], + [ + 6889, + 0.25 + ], + [ + 6890, + 0.25 + ], + [ + 6891, + 0.25 + ], + [ + 6892, + 0.25 + ], + [ + 6893, + 0.25 + ], + [ + 6894, + 0.4 + ], + [ + 6895, + 0.3 + ], + [ + 6896, + 0.3 + ], + [ + 6897, + 0.3 + ], + [ + 6898, + 0.3 + ], + [ + 6899, + 0.3 + ], + [ + 6900, + 0.5 + ], + [ + 6901, + 0.3 + ], + [ + 6902, + 0.3 + ], + [ + 6903, + 0.3 + ], + [ + 6904, + 0.3 + ], + [ + 6905, + 0.3 + ], + [ + 6906, + 0.3 + ], + [ + 6907, + 0.3 + ], + [ + 6908, + 0.3 + ], + [ + 6909, + 0.6 + ], + [ + 6910, + 0.25 + ], + [ + 6911, + 0.25 + ], + [ + 6912, + 0.25 + ], + [ + 6913, + 0.25 + ], + [ + 6914, + 0.25 + ], + [ + 6915, + 0.25 + ], + [ + 6916, + 0.25 + ], + [ + 6917, + 0.25 + ], + [ + 6918, + 0.4 + ], + [ + 6919, + 0.3 + ], + [ + 6920, + 0.3 + ], + [ + 6921, + 0.3 + ], + [ + 6922, + 0.3 + ], + [ + 6923, + 0.3 + ], + [ + 6924, + 0.5 + ], + [ + 6925, + 0.3 + ], + [ + 6926, + 0.3 + ], + [ + 6927, + 0.3 + ], + [ + 6928, + 0.3 + ], + [ + 6929, + 0.3 + ], + [ + 6930, + 0.3 + ], + [ + 6931, + 0.3 + ], + [ + 6932, + 0.3 + ], + [ + 6933, + 0.6 + ], + [ + 6934, + 0.25 + ], + [ + 6935, + 0.25 + ], + [ + 6936, + 0.25 + ], + [ + 6937, + 0.25 + ], + [ + 6938, + 0.25 + ], + [ + 6939, + 0.25 + ], + [ + 6940, + 0.25 + ], + [ + 6941, + 0.25 + ], + [ + 6942, + 0.4 + ], + [ + 6943, + 0.3 + ], + [ + 6944, + 0.3 + ], + [ + 6945, + 0.3 + ], + [ + 6946, + 0.3 + ], + [ + 6947, + 0.3 + ], + [ + 6948, + 0.5 + ], + [ + 6949, + 0.3 + ], + [ + 6950, + 0.3 + ], + [ + 6951, + 0.3 + ], + [ + 6952, + 0.3 + ], + [ + 6953, + 0.3 + ], + [ + 6954, + 0.3 + ], + [ + 6955, + 0.3 + ], + [ + 6956, + 0.3 + ], + [ + 6957, + 0.6 + ], + [ + 6958, + 0.25 + ], + [ + 6959, + 0.25 + ], + [ + 6960, + 0.25 + ], + [ + 6961, + 0.25 + ], + [ + 6962, + 0.25 + ], + [ + 6963, + 0.25 + ], + [ + 6964, + 0.25 + ], + [ + 6965, + 0.25 + ], + [ + 6966, + 0.4 + ], + [ + 6967, + 0.3 + ], + [ + 6968, + 0.3 + ], + [ + 6969, + 0.3 + ], + [ + 6970, + 0.3 + ], + [ + 6971, + 0.3 + ], + [ + 6972, + 0.5 + ], + [ + 6973, + 0.3 + ], + [ + 6974, + 0.3 + ], + [ + 6975, + 0.3 + ], + [ + 6976, + 0.3 + ], + [ + 6977, + 0.3 + ], + [ + 6978, + 0.3 + ], + [ + 6979, + 0.3 + ], + [ + 6980, + 0.3 + ], + [ + 6981, + 0.6 + ], + [ + 6982, + 0.25 + ], + [ + 6983, + 0.25 + ], + [ + 6984, + 0.25 + ], + [ + 6985, + 0.25 + ], + [ + 6986, + 0.25 + ], + [ + 6987, + 0.25 + ], + [ + 6988, + 0.25 + ], + [ + 6989, + 0.25 + ], + [ + 6990, + 0.4 + ], + [ + 6991, + 0.3 + ], + [ + 6992, + 0.3 + ], + [ + 6993, + 0.3 + ], + [ + 6994, + 0.3 + ], + [ + 6995, + 0.3 + ], + [ + 6996, + 0.5 + ], + [ + 6997, + 0.3 + ], + [ + 6998, + 0.3 + ], + [ + 6999, + 0.3 + ], + [ + 7000, + 0.3 + ], + [ + 7001, + 0.3 + ], + [ + 7002, + 0.3 + ], + [ + 7003, + 0.3 + ], + [ + 7004, + 0.3 + ], + [ + 7005, + 0.6 + ], + [ + 7006, + 0.25 + ], + [ + 7007, + 0.25 + ], + [ + 7008, + 0.3 + ], + [ + 7009, + 0.3 + ], + [ + 7010, + 0.3 + ], + [ + 7011, + 0.3 + ], + [ + 7012, + 0.3 + ], + [ + 7013, + 0.3 + ], + [ + 7014, + 0.3 + ], + [ + 7015, + 0.5 + ], + [ + 7016, + 0.55 + ], + [ + 7017, + 0.55 + ], + [ + 7018, + 0.55 + ], + [ + 7019, + 0.55 + ], + [ + 7020, + 0.65 + ], + [ + 7021, + 0.55 + ], + [ + 7022, + 0.55 + ], + [ + 7023, + 0.55 + ], + [ + 7024, + 0.55 + ], + [ + 7025, + 0.55 + ], + [ + 7026, + 0.55 + ], + [ + 7027, + 0.55 + ], + [ + 7028, + 0.55 + ], + [ + 7029, + 0.55 + ], + [ + 7030, + 0.7 + ], + [ + 7031, + 0.3 + ], + [ + 7032, + 0.3 + ], + [ + 7033, + 0.3 + ], + [ + 7034, + 0.3 + ], + [ + 7035, + 0.3 + ], + [ + 7036, + 0.3 + ], + [ + 7037, + 0.3 + ], + [ + 7038, + 0.3 + ], + [ + 7039, + 0.5 + ], + [ + 7040, + 0.55 + ], + [ + 7041, + 0.55 + ], + [ + 7042, + 0.55 + ], + [ + 7043, + 0.55 + ], + [ + 7044, + 0.65 + ], + [ + 7045, + 0.55 + ], + [ + 7046, + 0.55 + ], + [ + 7047, + 0.55 + ], + [ + 7048, + 0.55 + ], + [ + 7049, + 0.55 + ], + [ + 7050, + 0.55 + ], + [ + 7051, + 0.55 + ], + [ + 7052, + 0.55 + ], + [ + 7053, + 0.55 + ], + [ + 7054, + 0.7 + ], + [ + 7055, + 0.3 + ], + [ + 7056, + 0.25 + ], + [ + 7057, + 0.25 + ], + [ + 7058, + 0.25 + ], + [ + 7059, + 0.25 + ], + [ + 7060, + 0.25 + ], + [ + 7061, + 0.25 + ], + [ + 7062, + 0.4 + ], + [ + 7063, + 0.3 + ], + [ + 7064, + 0.3 + ], + [ + 7065, + 0.3 + ], + [ + 7066, + 0.3 + ], + [ + 7067, + 0.3 + ], + [ + 7068, + 0.5 + ], + [ + 7069, + 0.3 + ], + [ + 7070, + 0.3 + ], + [ + 7071, + 0.3 + ], + [ + 7072, + 0.3 + ], + [ + 7073, + 0.3 + ], + [ + 7074, + 0.3 + ], + [ + 7075, + 0.3 + ], + [ + 7076, + 0.3 + ], + [ + 7077, + 0.6 + ], + [ + 7078, + 0.25 + ], + [ + 7079, + 0.25 + ], + [ + 7080, + 0.25 + ], + [ + 7081, + 0.25 + ], + [ + 7082, + 0.25 + ], + [ + 7083, + 0.25 + ], + [ + 7084, + 0.25 + ], + [ + 7085, + 0.25 + ], + [ + 7086, + 0.4 + ], + [ + 7087, + 0.3 + ], + [ + 7088, + 0.3 + ], + [ + 7089, + 0.3 + ], + [ + 7090, + 0.3 + ], + [ + 7091, + 0.3 + ], + [ + 7092, + 0.5 + ], + [ + 7093, + 0.3 + ], + [ + 7094, + 0.3 + ], + [ + 7095, + 0.3 + ], + [ + 7096, + 0.3 + ], + [ + 7097, + 0.3 + ], + [ + 7098, + 0.3 + ], + [ + 7099, + 0.3 + ], + [ + 7100, + 0.3 + ], + [ + 7101, + 0.6 + ], + [ + 7102, + 0.25 + ], + [ + 7103, + 0.25 + ], + [ + 7104, + 0.25 + ], + [ + 7105, + 0.25 + ], + [ + 7106, + 0.25 + ], + [ + 7107, + 0.25 + ], + [ + 7108, + 0.25 + ], + [ + 7109, + 0.25 + ], + [ + 7110, + 0.4 + ], + [ + 7111, + 0.3 + ], + [ + 7112, + 0.3 + ], + [ + 7113, + 0.3 + ], + [ + 7114, + 0.3 + ], + [ + 7115, + 0.3 + ], + [ + 7116, + 0.5 + ], + [ + 7117, + 0.3 + ], + [ + 7118, + 0.3 + ], + [ + 7119, + 0.3 + ], + [ + 7120, + 0.3 + ], + [ + 7121, + 0.3 + ], + [ + 7122, + 0.3 + ], + [ + 7123, + 0.3 + ], + [ + 7124, + 0.3 + ], + [ + 7125, + 0.6 + ], + [ + 7126, + 0.25 + ], + [ + 7127, + 0.25 + ], + [ + 7128, + 0.25 + ], + [ + 7129, + 0.25 + ], + [ + 7130, + 0.25 + ], + [ + 7131, + 0.25 + ], + [ + 7132, + 0.25 + ], + [ + 7133, + 0.25 + ], + [ + 7134, + 0.4 + ], + [ + 7135, + 0.3 + ], + [ + 7136, + 0.3 + ], + [ + 7137, + 0.3 + ], + [ + 7138, + 0.3 + ], + [ + 7139, + 0.3 + ], + [ + 7140, + 0.5 + ], + [ + 7141, + 0.3 + ], + [ + 7142, + 0.3 + ], + [ + 7143, + 0.3 + ], + [ + 7144, + 0.3 + ], + [ + 7145, + 0.3 + ], + [ + 7146, + 0.3 + ], + [ + 7147, + 0.3 + ], + [ + 7148, + 0.3 + ], + [ + 7149, + 0.6 + ], + [ + 7150, + 0.25 + ], + [ + 7151, + 0.25 + ], + [ + 7152, + 0.25 + ], + [ + 7153, + 0.25 + ], + [ + 7154, + 0.25 + ], + [ + 7155, + 0.25 + ], + [ + 7156, + 0.25 + ], + [ + 7157, + 0.25 + ], + [ + 7158, + 0.4 + ], + [ + 7159, + 0.3 + ], + [ + 7160, + 0.3 + ], + [ + 7161, + 0.3 + ], + [ + 7162, + 0.3 + ], + [ + 7163, + 0.3 + ], + [ + 7164, + 0.5 + ], + [ + 7165, + 0.3 + ], + [ + 7166, + 0.3 + ], + [ + 7167, + 0.3 + ], + [ + 7168, + 0.3 + ], + [ + 7169, + 0.3 + ], + [ + 7170, + 0.3 + ], + [ + 7171, + 0.3 + ], + [ + 7172, + 0.3 + ], + [ + 7173, + 0.6 + ], + [ + 7174, + 0.25 + ], + [ + 7175, + 0.25 + ], + [ + 7176, + 0.3 + ], + [ + 7177, + 0.3 + ], + [ + 7178, + 0.3 + ], + [ + 7179, + 0.3 + ], + [ + 7180, + 0.3 + ], + [ + 7181, + 0.3 + ], + [ + 7182, + 0.3 + ], + [ + 7183, + 0.5 + ], + [ + 7184, + 0.55 + ], + [ + 7185, + 0.55 + ], + [ + 7186, + 0.55 + ], + [ + 7187, + 0.55 + ], + [ + 7188, + 0.65 + ], + [ + 7189, + 0.55 + ], + [ + 7190, + 0.55 + ], + [ + 7191, + 0.55 + ], + [ + 7192, + 0.55 + ], + [ + 7193, + 0.55 + ], + [ + 7194, + 0.55 + ], + [ + 7195, + 0.55 + ], + [ + 7196, + 0.55 + ], + [ + 7197, + 0.55 + ], + [ + 7198, + 0.7 + ], + [ + 7199, + 0.3 + ], + [ + 7200, + 0.3 + ], + [ + 7201, + 0.3 + ], + [ + 7202, + 0.3 + ], + [ + 7203, + 0.3 + ], + [ + 7204, + 0.3 + ], + [ + 7205, + 0.3 + ], + [ + 7206, + 0.3 + ], + [ + 7207, + 0.5 + ], + [ + 7208, + 0.55 + ], + [ + 7209, + 0.55 + ], + [ + 7210, + 0.55 + ], + [ + 7211, + 0.55 + ], + [ + 7212, + 0.65 + ], + [ + 7213, + 0.55 + ], + [ + 7214, + 0.55 + ], + [ + 7215, + 0.55 + ], + [ + 7216, + 0.55 + ], + [ + 7217, + 0.55 + ], + [ + 7218, + 0.55 + ], + [ + 7219, + 0.55 + ], + [ + 7220, + 0.55 + ], + [ + 7221, + 0.55 + ], + [ + 7222, + 0.7 + ], + [ + 7223, + 0.3 + ], + [ + 7224, + 0.25 + ], + [ + 7225, + 0.25 + ], + [ + 7226, + 0.25 + ], + [ + 7227, + 0.25 + ], + [ + 7228, + 0.25 + ], + [ + 7229, + 0.25 + ], + [ + 7230, + 0.4 + ], + [ + 7231, + 0.3 + ], + [ + 7232, + 0.3 + ], + [ + 7233, + 0.3 + ], + [ + 7234, + 0.3 + ], + [ + 7235, + 0.3 + ], + [ + 7236, + 0.5 + ], + [ + 7237, + 0.3 + ], + [ + 7238, + 0.3 + ], + [ + 7239, + 0.3 + ], + [ + 7240, + 0.3 + ], + [ + 7241, + 0.3 + ], + [ + 7242, + 0.3 + ], + [ + 7243, + 0.3 + ], + [ + 7244, + 0.3 + ], + [ + 7245, + 0.6 + ], + [ + 7246, + 0.25 + ], + [ + 7247, + 0.25 + ], + [ + 7248, + 0.25 + ], + [ + 7249, + 0.25 + ], + [ + 7250, + 0.25 + ], + [ + 7251, + 0.25 + ], + [ + 7252, + 0.25 + ], + [ + 7253, + 0.25 + ], + [ + 7254, + 0.4 + ], + [ + 7255, + 0.3 + ], + [ + 7256, + 0.3 + ], + [ + 7257, + 0.3 + ], + [ + 7258, + 0.3 + ], + [ + 7259, + 0.3 + ], + [ + 7260, + 0.5 + ], + [ + 7261, + 0.3 + ], + [ + 7262, + 0.3 + ], + [ + 7263, + 0.3 + ], + [ + 7264, + 0.3 + ], + [ + 7265, + 0.3 + ], + [ + 7266, + 0.3 + ], + [ + 7267, + 0.3 + ], + [ + 7268, + 0.3 + ], + [ + 7269, + 0.6 + ], + [ + 7270, + 0.25 + ], + [ + 7271, + 0.25 + ], + [ + 7272, + 0.25 + ], + [ + 7273, + 0.25 + ], + [ + 7274, + 0.25 + ], + [ + 7275, + 0.25 + ], + [ + 7276, + 0.25 + ], + [ + 7277, + 0.25 + ], + [ + 7278, + 0.4 + ], + [ + 7279, + 0.3 + ], + [ + 7280, + 0.3 + ], + [ + 7281, + 0.3 + ], + [ + 7282, + 0.3 + ], + [ + 7283, + 0.3 + ], + [ + 7284, + 0.5 + ], + [ + 7285, + 0.3 + ], + [ + 7286, + 0.3 + ], + [ + 7287, + 0.3 + ], + [ + 7288, + 0.3 + ], + [ + 7289, + 0.3 + ], + [ + 7290, + 0.3 + ], + [ + 7291, + 0.3 + ], + [ + 7292, + 0.3 + ], + [ + 7293, + 0.6 + ], + [ + 7294, + 0.25 + ], + [ + 7295, + 0.25 + ], + [ + 7296, + 0.25 + ], + [ + 7297, + 0.25 + ], + [ + 7298, + 0.25 + ], + [ + 7299, + 0.25 + ], + [ + 7300, + 0.25 + ], + [ + 7301, + 0.25 + ], + [ + 7302, + 0.4 + ], + [ + 7303, + 0.3 + ], + [ + 7304, + 0.3 + ], + [ + 7305, + 0.3 + ], + [ + 7306, + 0.3 + ], + [ + 7307, + 0.3 + ], + [ + 7308, + 0.5 + ], + [ + 7309, + 0.3 + ], + [ + 7310, + 0.3 + ], + [ + 7311, + 0.3 + ], + [ + 7312, + 0.3 + ], + [ + 7313, + 0.3 + ], + [ + 7314, + 0.3 + ], + [ + 7315, + 0.3 + ], + [ + 7316, + 0.3 + ], + [ + 7317, + 0.6 + ], + [ + 7318, + 0.25 + ], + [ + 7319, + 0.25 + ], + [ + 7320, + 0.25 + ], + [ + 7321, + 0.25 + ], + [ + 7322, + 0.25 + ], + [ + 7323, + 0.25 + ], + [ + 7324, + 0.25 + ], + [ + 7325, + 0.25 + ], + [ + 7326, + 0.4 + ], + [ + 7327, + 0.3 + ], + [ + 7328, + 0.3 + ], + [ + 7329, + 0.3 + ], + [ + 7330, + 0.3 + ], + [ + 7331, + 0.3 + ], + [ + 7332, + 0.5 + ], + [ + 7333, + 0.3 + ], + [ + 7334, + 0.3 + ], + [ + 7335, + 0.3 + ], + [ + 7336, + 0.3 + ], + [ + 7337, + 0.3 + ], + [ + 7338, + 0.3 + ], + [ + 7339, + 0.3 + ], + [ + 7340, + 0.3 + ], + [ + 7341, + 0.6 + ], + [ + 7342, + 0.25 + ], + [ + 7343, + 0.25 + ], + [ + 7344, + 0.3 + ], + [ + 7345, + 0.3 + ], + [ + 7346, + 0.3 + ], + [ + 7347, + 0.3 + ], + [ + 7348, + 0.3 + ], + [ + 7349, + 0.3 + ], + [ + 7350, + 0.3 + ], + [ + 7351, + 0.5 + ], + [ + 7352, + 0.55 + ], + [ + 7353, + 0.55 + ], + [ + 7354, + 0.55 + ], + [ + 7355, + 0.55 + ], + [ + 7356, + 0.65 + ], + [ + 7357, + 0.55 + ], + [ + 7358, + 0.55 + ], + [ + 7359, + 0.55 + ], + [ + 7360, + 0.55 + ], + [ + 7361, + 0.55 + ], + [ + 7362, + 0.55 + ], + [ + 7363, + 0.55 + ], + [ + 7364, + 0.55 + ], + [ + 7365, + 0.55 + ], + [ + 7366, + 0.7 + ], + [ + 7367, + 0.3 + ], + [ + 7368, + 0.3 + ], + [ + 7369, + 0.3 + ], + [ + 7370, + 0.3 + ], + [ + 7371, + 0.3 + ], + [ + 7372, + 0.3 + ], + [ + 7373, + 0.3 + ], + [ + 7374, + 0.3 + ], + [ + 7375, + 0.5 + ], + [ + 7376, + 0.55 + ], + [ + 7377, + 0.55 + ], + [ + 7378, + 0.55 + ], + [ + 7379, + 0.55 + ], + [ + 7380, + 0.65 + ], + [ + 7381, + 0.55 + ], + [ + 7382, + 0.55 + ], + [ + 7383, + 0.55 + ], + [ + 7384, + 0.55 + ], + [ + 7385, + 0.55 + ], + [ + 7386, + 0.55 + ], + [ + 7387, + 0.55 + ], + [ + 7388, + 0.55 + ], + [ + 7389, + 0.55 + ], + [ + 7390, + 0.7 + ], + [ + 7391, + 0.3 + ], + [ + 7392, + 0.25 + ], + [ + 7393, + 0.25 + ], + [ + 7394, + 0.25 + ], + [ + 7395, + 0.25 + ], + [ + 7396, + 0.25 + ], + [ + 7397, + 0.25 + ], + [ + 7398, + 0.4 + ], + [ + 7399, + 0.3 + ], + [ + 7400, + 0.3 + ], + [ + 7401, + 0.3 + ], + [ + 7402, + 0.3 + ], + [ + 7403, + 0.3 + ], + [ + 7404, + 0.5 + ], + [ + 7405, + 0.3 + ], + [ + 7406, + 0.3 + ], + [ + 7407, + 0.3 + ], + [ + 7408, + 0.3 + ], + [ + 7409, + 0.3 + ], + [ + 7410, + 0.3 + ], + [ + 7411, + 0.3 + ], + [ + 7412, + 0.3 + ], + [ + 7413, + 0.6 + ], + [ + 7414, + 0.25 + ], + [ + 7415, + 0.25 + ], + [ + 7416, + 0.25 + ], + [ + 7417, + 0.25 + ], + [ + 7418, + 0.25 + ], + [ + 7419, + 0.25 + ], + [ + 7420, + 0.25 + ], + [ + 7421, + 0.25 + ], + [ + 7422, + 0.4 + ], + [ + 7423, + 0.3 + ], + [ + 7424, + 0.3 + ], + [ + 7425, + 0.3 + ], + [ + 7426, + 0.3 + ], + [ + 7427, + 0.3 + ], + [ + 7428, + 0.5 + ], + [ + 7429, + 0.3 + ], + [ + 7430, + 0.3 + ], + [ + 7431, + 0.3 + ], + [ + 7432, + 0.3 + ], + [ + 7433, + 0.3 + ], + [ + 7434, + 0.3 + ], + [ + 7435, + 0.3 + ], + [ + 7436, + 0.3 + ], + [ + 7437, + 0.6 + ], + [ + 7438, + 0.25 + ], + [ + 7439, + 0.25 + ], + [ + 7440, + 0.25 + ], + [ + 7441, + 0.25 + ], + [ + 7442, + 0.25 + ], + [ + 7443, + 0.25 + ], + [ + 7444, + 0.25 + ], + [ + 7445, + 0.25 + ], + [ + 7446, + 0.4 + ], + [ + 7447, + 0.3 + ], + [ + 7448, + 0.3 + ], + [ + 7449, + 0.3 + ], + [ + 7450, + 0.3 + ], + [ + 7451, + 0.3 + ], + [ + 7452, + 0.5 + ], + [ + 7453, + 0.3 + ], + [ + 7454, + 0.3 + ], + [ + 7455, + 0.3 + ], + [ + 7456, + 0.3 + ], + [ + 7457, + 0.3 + ], + [ + 7458, + 0.3 + ], + [ + 7459, + 0.3 + ], + [ + 7460, + 0.3 + ], + [ + 7461, + 0.6 + ], + [ + 7462, + 0.25 + ], + [ + 7463, + 0.25 + ], + [ + 7464, + 0.25 + ], + [ + 7465, + 0.25 + ], + [ + 7466, + 0.25 + ], + [ + 7467, + 0.25 + ], + [ + 7468, + 0.25 + ], + [ + 7469, + 0.25 + ], + [ + 7470, + 0.4 + ], + [ + 7471, + 0.3 + ], + [ + 7472, + 0.3 + ], + [ + 7473, + 0.3 + ], + [ + 7474, + 0.3 + ], + [ + 7475, + 0.3 + ], + [ + 7476, + 0.5 + ], + [ + 7477, + 0.3 + ], + [ + 7478, + 0.3 + ], + [ + 7479, + 0.3 + ], + [ + 7480, + 0.3 + ], + [ + 7481, + 0.3 + ], + [ + 7482, + 0.3 + ], + [ + 7483, + 0.3 + ], + [ + 7484, + 0.3 + ], + [ + 7485, + 0.6 + ], + [ + 7486, + 0.25 + ], + [ + 7487, + 0.25 + ], + [ + 7488, + 0.25 + ], + [ + 7489, + 0.25 + ], + [ + 7490, + 0.25 + ], + [ + 7491, + 0.25 + ], + [ + 7492, + 0.25 + ], + [ + 7493, + 0.25 + ], + [ + 7494, + 0.4 + ], + [ + 7495, + 0.3 + ], + [ + 7496, + 0.3 + ], + [ + 7497, + 0.3 + ], + [ + 7498, + 0.3 + ], + [ + 7499, + 0.3 + ], + [ + 7500, + 0.5 + ], + [ + 7501, + 0.3 + ], + [ + 7502, + 0.3 + ], + [ + 7503, + 0.3 + ], + [ + 7504, + 0.3 + ], + [ + 7505, + 0.3 + ], + [ + 7506, + 0.3 + ], + [ + 7507, + 0.3 + ], + [ + 7508, + 0.3 + ], + [ + 7509, + 0.6 + ], + [ + 7510, + 0.25 + ], + [ + 7511, + 0.25 + ], + [ + 7512, + 0.3 + ], + [ + 7513, + 0.3 + ], + [ + 7514, + 0.3 + ], + [ + 7515, + 0.3 + ], + [ + 7516, + 0.3 + ], + [ + 7517, + 0.3 + ], + [ + 7518, + 0.3 + ], + [ + 7519, + 0.5 + ], + [ + 7520, + 0.55 + ], + [ + 7521, + 0.55 + ], + [ + 7522, + 0.55 + ], + [ + 7523, + 0.55 + ], + [ + 7524, + 0.65 + ], + [ + 7525, + 0.55 + ], + [ + 7526, + 0.55 + ], + [ + 7527, + 0.55 + ], + [ + 7528, + 0.55 + ], + [ + 7529, + 0.55 + ], + [ + 7530, + 0.55 + ], + [ + 7531, + 0.55 + ], + [ + 7532, + 0.55 + ], + [ + 7533, + 0.55 + ], + [ + 7534, + 0.7 + ], + [ + 7535, + 0.3 + ], + [ + 7536, + 0.3 + ], + [ + 7537, + 0.3 + ], + [ + 7538, + 0.3 + ], + [ + 7539, + 0.3 + ], + [ + 7540, + 0.3 + ], + [ + 7541, + 0.3 + ], + [ + 7542, + 0.3 + ], + [ + 7543, + 0.5 + ], + [ + 7544, + 0.55 + ], + [ + 7545, + 0.55 + ], + [ + 7546, + 0.55 + ], + [ + 7547, + 0.55 + ], + [ + 7548, + 0.65 + ], + [ + 7549, + 0.55 + ], + [ + 7550, + 0.55 + ], + [ + 7551, + 0.55 + ], + [ + 7552, + 0.55 + ], + [ + 7553, + 0.55 + ], + [ + 7554, + 0.55 + ], + [ + 7555, + 0.55 + ], + [ + 7556, + 0.55 + ], + [ + 7557, + 0.55 + ], + [ + 7558, + 0.7 + ], + [ + 7559, + 0.3 + ], + [ + 7560, + 0.25 + ], + [ + 7561, + 0.25 + ], + [ + 7562, + 0.25 + ], + [ + 7563, + 0.25 + ], + [ + 7564, + 0.25 + ], + [ + 7565, + 0.25 + ], + [ + 7566, + 0.4 + ], + [ + 7567, + 0.3 + ], + [ + 7568, + 0.3 + ], + [ + 7569, + 0.3 + ], + [ + 7570, + 0.3 + ], + [ + 7571, + 0.3 + ], + [ + 7572, + 0.5 + ], + [ + 7573, + 0.3 + ], + [ + 7574, + 0.3 + ], + [ + 7575, + 0.3 + ], + [ + 7576, + 0.3 + ], + [ + 7577, + 0.3 + ], + [ + 7578, + 0.3 + ], + [ + 7579, + 0.3 + ], + [ + 7580, + 0.3 + ], + [ + 7581, + 0.6 + ], + [ + 7582, + 0.25 + ], + [ + 7583, + 0.25 + ], + [ + 7584, + 0.25 + ], + [ + 7585, + 0.25 + ], + [ + 7586, + 0.25 + ], + [ + 7587, + 0.25 + ], + [ + 7588, + 0.25 + ], + [ + 7589, + 0.25 + ], + [ + 7590, + 0.4 + ], + [ + 7591, + 0.3 + ], + [ + 7592, + 0.3 + ], + [ + 7593, + 0.3 + ], + [ + 7594, + 0.3 + ], + [ + 7595, + 0.3 + ], + [ + 7596, + 0.5 + ], + [ + 7597, + 0.3 + ], + [ + 7598, + 0.3 + ], + [ + 7599, + 0.3 + ], + [ + 7600, + 0.3 + ], + [ + 7601, + 0.3 + ], + [ + 7602, + 0.3 + ], + [ + 7603, + 0.3 + ], + [ + 7604, + 0.3 + ], + [ + 7605, + 0.6 + ], + [ + 7606, + 0.25 + ], + [ + 7607, + 0.25 + ], + [ + 7608, + 0.25 + ], + [ + 7609, + 0.25 + ], + [ + 7610, + 0.25 + ], + [ + 7611, + 0.25 + ], + [ + 7612, + 0.25 + ], + [ + 7613, + 0.25 + ], + [ + 7614, + 0.4 + ], + [ + 7615, + 0.3 + ], + [ + 7616, + 0.3 + ], + [ + 7617, + 0.3 + ], + [ + 7618, + 0.3 + ], + [ + 7619, + 0.3 + ], + [ + 7620, + 0.5 + ], + [ + 7621, + 0.3 + ], + [ + 7622, + 0.3 + ], + [ + 7623, + 0.3 + ], + [ + 7624, + 0.3 + ], + [ + 7625, + 0.3 + ], + [ + 7626, + 0.3 + ], + [ + 7627, + 0.3 + ], + [ + 7628, + 0.3 + ], + [ + 7629, + 0.6 + ], + [ + 7630, + 0.25 + ], + [ + 7631, + 0.25 + ], + [ + 7632, + 0.25 + ], + [ + 7633, + 0.25 + ], + [ + 7634, + 0.25 + ], + [ + 7635, + 0.25 + ], + [ + 7636, + 0.25 + ], + [ + 7637, + 0.25 + ], + [ + 7638, + 0.4 + ], + [ + 7639, + 0.3 + ], + [ + 7640, + 0.3 + ], + [ + 7641, + 0.3 + ], + [ + 7642, + 0.3 + ], + [ + 7643, + 0.3 + ], + [ + 7644, + 0.5 + ], + [ + 7645, + 0.3 + ], + [ + 7646, + 0.3 + ], + [ + 7647, + 0.3 + ], + [ + 7648, + 0.3 + ], + [ + 7649, + 0.3 + ], + [ + 7650, + 0.3 + ], + [ + 7651, + 0.3 + ], + [ + 7652, + 0.3 + ], + [ + 7653, + 0.6 + ], + [ + 7654, + 0.25 + ], + [ + 7655, + 0.25 + ], + [ + 7656, + 0.25 + ], + [ + 7657, + 0.25 + ], + [ + 7658, + 0.25 + ], + [ + 7659, + 0.25 + ], + [ + 7660, + 0.25 + ], + [ + 7661, + 0.25 + ], + [ + 7662, + 0.4 + ], + [ + 7663, + 0.3 + ], + [ + 7664, + 0.3 + ], + [ + 7665, + 0.3 + ], + [ + 7666, + 0.3 + ], + [ + 7667, + 0.3 + ], + [ + 7668, + 0.5 + ], + [ + 7669, + 0.3 + ], + [ + 7670, + 0.3 + ], + [ + 7671, + 0.3 + ], + [ + 7672, + 0.3 + ], + [ + 7673, + 0.3 + ], + [ + 7674, + 0.3 + ], + [ + 7675, + 0.3 + ], + [ + 7676, + 0.3 + ], + [ + 7677, + 0.6 + ], + [ + 7678, + 0.25 + ], + [ + 7679, + 0.25 + ], + [ + 7680, + 0.3 + ], + [ + 7681, + 0.3 + ], + [ + 7682, + 0.3 + ], + [ + 7683, + 0.3 + ], + [ + 7684, + 0.3 + ], + [ + 7685, + 0.3 + ], + [ + 7686, + 0.3 + ], + [ + 7687, + 0.5 + ], + [ + 7688, + 0.55 + ], + [ + 7689, + 0.55 + ], + [ + 7690, + 0.55 + ], + [ + 7691, + 0.55 + ], + [ + 7692, + 0.65 + ], + [ + 7693, + 0.55 + ], + [ + 7694, + 0.55 + ], + [ + 7695, + 0.55 + ], + [ + 7696, + 0.55 + ], + [ + 7697, + 0.55 + ], + [ + 7698, + 0.55 + ], + [ + 7699, + 0.55 + ], + [ + 7700, + 0.55 + ], + [ + 7701, + 0.55 + ], + [ + 7702, + 0.7 + ], + [ + 7703, + 0.3 + ], + [ + 7704, + 0.3 + ], + [ + 7705, + 0.3 + ], + [ + 7706, + 0.3 + ], + [ + 7707, + 0.3 + ], + [ + 7708, + 0.3 + ], + [ + 7709, + 0.3 + ], + [ + 7710, + 0.3 + ], + [ + 7711, + 0.5 + ], + [ + 7712, + 0.55 + ], + [ + 7713, + 0.55 + ], + [ + 7714, + 0.55 + ], + [ + 7715, + 0.55 + ], + [ + 7716, + 0.65 + ], + [ + 7717, + 0.55 + ], + [ + 7718, + 0.55 + ], + [ + 7719, + 0.55 + ], + [ + 7720, + 0.55 + ], + [ + 7721, + 0.55 + ], + [ + 7722, + 0.55 + ], + [ + 7723, + 0.55 + ], + [ + 7724, + 0.55 + ], + [ + 7725, + 0.55 + ], + [ + 7726, + 0.7 + ], + [ + 7727, + 0.3 + ], + [ + 7728, + 0.25 + ], + [ + 7729, + 0.25 + ], + [ + 7730, + 0.25 + ], + [ + 7731, + 0.25 + ], + [ + 7732, + 0.25 + ], + [ + 7733, + 0.25 + ], + [ + 7734, + 0.4 + ], + [ + 7735, + 0.3 + ], + [ + 7736, + 0.3 + ], + [ + 7737, + 0.3 + ], + [ + 7738, + 0.3 + ], + [ + 7739, + 0.3 + ], + [ + 7740, + 0.5 + ], + [ + 7741, + 0.3 + ], + [ + 7742, + 0.3 + ], + [ + 7743, + 0.3 + ], + [ + 7744, + 0.3 + ], + [ + 7745, + 0.3 + ], + [ + 7746, + 0.3 + ], + [ + 7747, + 0.3 + ], + [ + 7748, + 0.3 + ], + [ + 7749, + 0.6 + ], + [ + 7750, + 0.25 + ], + [ + 7751, + 0.25 + ], + [ + 7752, + 0.25 + ], + [ + 7753, + 0.25 + ], + [ + 7754, + 0.25 + ], + [ + 7755, + 0.25 + ], + [ + 7756, + 0.25 + ], + [ + 7757, + 0.25 + ], + [ + 7758, + 0.4 + ], + [ + 7759, + 0.3 + ], + [ + 7760, + 0.3 + ], + [ + 7761, + 0.3 + ], + [ + 7762, + 0.3 + ], + [ + 7763, + 0.3 + ], + [ + 7764, + 0.5 + ], + [ + 7765, + 0.3 + ], + [ + 7766, + 0.3 + ], + [ + 7767, + 0.3 + ], + [ + 7768, + 0.3 + ], + [ + 7769, + 0.3 + ], + [ + 7770, + 0.3 + ], + [ + 7771, + 0.3 + ], + [ + 7772, + 0.3 + ], + [ + 7773, + 0.6 + ], + [ + 7774, + 0.25 + ], + [ + 7775, + 0.25 + ], + [ + 7776, + 0.25 + ], + [ + 7777, + 0.25 + ], + [ + 7778, + 0.25 + ], + [ + 7779, + 0.25 + ], + [ + 7780, + 0.25 + ], + [ + 7781, + 0.25 + ], + [ + 7782, + 0.4 + ], + [ + 7783, + 0.3 + ], + [ + 7784, + 0.3 + ], + [ + 7785, + 0.3 + ], + [ + 7786, + 0.3 + ], + [ + 7787, + 0.3 + ], + [ + 7788, + 0.5 + ], + [ + 7789, + 0.3 + ], + [ + 7790, + 0.3 + ], + [ + 7791, + 0.3 + ], + [ + 7792, + 0.3 + ], + [ + 7793, + 0.3 + ], + [ + 7794, + 0.3 + ], + [ + 7795, + 0.3 + ], + [ + 7796, + 0.3 + ], + [ + 7797, + 0.6 + ], + [ + 7798, + 0.25 + ], + [ + 7799, + 0.25 + ], + [ + 7800, + 0.25 + ], + [ + 7801, + 0.25 + ], + [ + 7802, + 0.25 + ], + [ + 7803, + 0.25 + ], + [ + 7804, + 0.25 + ], + [ + 7805, + 0.25 + ], + [ + 7806, + 0.4 + ], + [ + 7807, + 0.3 + ], + [ + 7808, + 0.3 + ], + [ + 7809, + 0.3 + ], + [ + 7810, + 0.3 + ], + [ + 7811, + 0.3 + ], + [ + 7812, + 0.5 + ], + [ + 7813, + 0.3 + ], + [ + 7814, + 0.3 + ], + [ + 7815, + 0.3 + ], + [ + 7816, + 0.3 + ], + [ + 7817, + 0.3 + ], + [ + 7818, + 0.3 + ], + [ + 7819, + 0.3 + ], + [ + 7820, + 0.3 + ], + [ + 7821, + 0.6 + ], + [ + 7822, + 0.25 + ], + [ + 7823, + 0.25 + ], + [ + 7824, + 0.25 + ], + [ + 7825, + 0.25 + ], + [ + 7826, + 0.25 + ], + [ + 7827, + 0.25 + ], + [ + 7828, + 0.25 + ], + [ + 7829, + 0.25 + ], + [ + 7830, + 0.4 + ], + [ + 7831, + 0.3 + ], + [ + 7832, + 0.3 + ], + [ + 7833, + 0.3 + ], + [ + 7834, + 0.3 + ], + [ + 7835, + 0.3 + ], + [ + 7836, + 0.5 + ], + [ + 7837, + 0.3 + ], + [ + 7838, + 0.3 + ], + [ + 7839, + 0.3 + ], + [ + 7840, + 0.3 + ], + [ + 7841, + 0.3 + ], + [ + 7842, + 0.3 + ], + [ + 7843, + 0.3 + ], + [ + 7844, + 0.3 + ], + [ + 7845, + 0.6 + ], + [ + 7846, + 0.25 + ], + [ + 7847, + 0.25 + ], + [ + 7848, + 0.3 + ], + [ + 7849, + 0.3 + ], + [ + 7850, + 0.3 + ], + [ + 7851, + 0.3 + ], + [ + 7852, + 0.3 + ], + [ + 7853, + 0.3 + ], + [ + 7854, + 0.3 + ], + [ + 7855, + 0.5 + ], + [ + 7856, + 0.55 + ], + [ + 7857, + 0.55 + ], + [ + 7858, + 0.55 + ], + [ + 7859, + 0.55 + ], + [ + 7860, + 0.65 + ], + [ + 7861, + 0.55 + ], + [ + 7862, + 0.55 + ], + [ + 7863, + 0.55 + ], + [ + 7864, + 0.55 + ], + [ + 7865, + 0.55 + ], + [ + 7866, + 0.55 + ], + [ + 7867, + 0.55 + ], + [ + 7868, + 0.55 + ], + [ + 7869, + 0.55 + ], + [ + 7870, + 0.7 + ], + [ + 7871, + 0.3 + ], + [ + 7872, + 0.3 + ], + [ + 7873, + 0.3 + ], + [ + 7874, + 0.3 + ], + [ + 7875, + 0.3 + ], + [ + 7876, + 0.3 + ], + [ + 7877, + 0.3 + ], + [ + 7878, + 0.3 + ], + [ + 7879, + 0.5 + ], + [ + 7880, + 0.55 + ], + [ + 7881, + 0.55 + ], + [ + 7882, + 0.55 + ], + [ + 7883, + 0.55 + ], + [ + 7884, + 0.65 + ], + [ + 7885, + 0.55 + ], + [ + 7886, + 0.55 + ], + [ + 7887, + 0.55 + ], + [ + 7888, + 0.55 + ], + [ + 7889, + 0.55 + ], + [ + 7890, + 0.55 + ], + [ + 7891, + 0.55 + ], + [ + 7892, + 0.55 + ], + [ + 7893, + 0.55 + ], + [ + 7894, + 0.7 + ], + [ + 7895, + 0.3 + ], + [ + 7896, + 0.25 + ], + [ + 7897, + 0.25 + ], + [ + 7898, + 0.25 + ], + [ + 7899, + 0.25 + ], + [ + 7900, + 0.25 + ], + [ + 7901, + 0.25 + ], + [ + 7902, + 0.4 + ], + [ + 7903, + 0.3 + ], + [ + 7904, + 0.3 + ], + [ + 7905, + 0.3 + ], + [ + 7906, + 0.3 + ], + [ + 7907, + 0.3 + ], + [ + 7908, + 0.5 + ], + [ + 7909, + 0.3 + ], + [ + 7910, + 0.3 + ], + [ + 7911, + 0.3 + ], + [ + 7912, + 0.3 + ], + [ + 7913, + 0.3 + ], + [ + 7914, + 0.3 + ], + [ + 7915, + 0.3 + ], + [ + 7916, + 0.3 + ], + [ + 7917, + 0.6 + ], + [ + 7918, + 0.25 + ], + [ + 7919, + 0.25 + ], + [ + 7920, + 0.25 + ], + [ + 7921, + 0.25 + ], + [ + 7922, + 0.25 + ], + [ + 7923, + 0.25 + ], + [ + 7924, + 0.25 + ], + [ + 7925, + 0.25 + ], + [ + 7926, + 0.4 + ], + [ + 7927, + 0.3 + ], + [ + 7928, + 0.3 + ], + [ + 7929, + 0.3 + ], + [ + 7930, + 0.3 + ], + [ + 7931, + 0.3 + ], + [ + 7932, + 0.5 + ], + [ + 7933, + 0.3 + ], + [ + 7934, + 0.3 + ], + [ + 7935, + 0.3 + ], + [ + 7936, + 0.3 + ], + [ + 7937, + 0.3 + ], + [ + 7938, + 0.3 + ], + [ + 7939, + 0.3 + ], + [ + 7940, + 0.3 + ], + [ + 7941, + 0.6 + ], + [ + 7942, + 0.25 + ], + [ + 7943, + 0.25 + ], + [ + 7944, + 0.25 + ], + [ + 7945, + 0.25 + ], + [ + 7946, + 0.25 + ], + [ + 7947, + 0.25 + ], + [ + 7948, + 0.25 + ], + [ + 7949, + 0.25 + ], + [ + 7950, + 0.4 + ], + [ + 7951, + 0.3 + ], + [ + 7952, + 0.3 + ], + [ + 7953, + 0.3 + ], + [ + 7954, + 0.3 + ], + [ + 7955, + 0.3 + ], + [ + 7956, + 0.5 + ], + [ + 7957, + 0.3 + ], + [ + 7958, + 0.3 + ], + [ + 7959, + 0.3 + ], + [ + 7960, + 0.3 + ], + [ + 7961, + 0.3 + ], + [ + 7962, + 0.3 + ], + [ + 7963, + 0.3 + ], + [ + 7964, + 0.3 + ], + [ + 7965, + 0.6 + ], + [ + 7966, + 0.25 + ], + [ + 7967, + 0.25 + ], + [ + 7968, + 0.25 + ], + [ + 7969, + 0.25 + ], + [ + 7970, + 0.25 + ], + [ + 7971, + 0.25 + ], + [ + 7972, + 0.25 + ], + [ + 7973, + 0.25 + ], + [ + 7974, + 0.4 + ], + [ + 7975, + 0.3 + ], + [ + 7976, + 0.3 + ], + [ + 7977, + 0.3 + ], + [ + 7978, + 0.3 + ], + [ + 7979, + 0.3 + ], + [ + 7980, + 0.5 + ], + [ + 7981, + 0.3 + ], + [ + 7982, + 0.3 + ], + [ + 7983, + 0.3 + ], + [ + 7984, + 0.3 + ], + [ + 7985, + 0.3 + ], + [ + 7986, + 0.3 + ], + [ + 7987, + 0.3 + ], + [ + 7988, + 0.3 + ], + [ + 7989, + 0.6 + ], + [ + 7990, + 0.25 + ], + [ + 7991, + 0.25 + ], + [ + 7992, + 0.25 + ], + [ + 7993, + 0.25 + ], + [ + 7994, + 0.25 + ], + [ + 7995, + 0.25 + ], + [ + 7996, + 0.25 + ], + [ + 7997, + 0.25 + ], + [ + 7998, + 0.4 + ], + [ + 7999, + 0.3 + ], + [ + 8000, + 0.3 + ], + [ + 8001, + 0.3 + ], + [ + 8002, + 0.3 + ], + [ + 8003, + 0.3 + ], + [ + 8004, + 0.5 + ], + [ + 8005, + 0.3 + ], + [ + 8006, + 0.3 + ], + [ + 8007, + 0.3 + ], + [ + 8008, + 0.3 + ], + [ + 8009, + 0.3 + ], + [ + 8010, + 0.3 + ], + [ + 8011, + 0.3 + ], + [ + 8012, + 0.3 + ], + [ + 8013, + 0.6 + ], + [ + 8014, + 0.25 + ], + [ + 8015, + 0.25 + ], + [ + 8016, + 0.3 + ], + [ + 8017, + 0.3 + ], + [ + 8018, + 0.3 + ], + [ + 8019, + 0.3 + ], + [ + 8020, + 0.3 + ], + [ + 8021, + 0.3 + ], + [ + 8022, + 0.3 + ], + [ + 8023, + 0.5 + ], + [ + 8024, + 0.55 + ], + [ + 8025, + 0.55 + ], + [ + 8026, + 0.55 + ], + [ + 8027, + 0.55 + ], + [ + 8028, + 0.65 + ], + [ + 8029, + 0.55 + ], + [ + 8030, + 0.55 + ], + [ + 8031, + 0.55 + ], + [ + 8032, + 0.55 + ], + [ + 8033, + 0.55 + ], + [ + 8034, + 0.55 + ], + [ + 8035, + 0.55 + ], + [ + 8036, + 0.55 + ], + [ + 8037, + 0.55 + ], + [ + 8038, + 0.7 + ], + [ + 8039, + 0.3 + ], + [ + 8040, + 0.3 + ], + [ + 8041, + 0.3 + ], + [ + 8042, + 0.3 + ], + [ + 8043, + 0.3 + ], + [ + 8044, + 0.3 + ], + [ + 8045, + 0.3 + ], + [ + 8046, + 0.3 + ], + [ + 8047, + 0.5 + ], + [ + 8048, + 0.55 + ], + [ + 8049, + 0.55 + ], + [ + 8050, + 0.55 + ], + [ + 8051, + 0.55 + ], + [ + 8052, + 0.65 + ], + [ + 8053, + 0.55 + ], + [ + 8054, + 0.55 + ], + [ + 8055, + 0.55 + ], + [ + 8056, + 0.55 + ], + [ + 8057, + 0.55 + ], + [ + 8058, + 0.55 + ], + [ + 8059, + 0.55 + ], + [ + 8060, + 0.55 + ], + [ + 8061, + 0.55 + ], + [ + 8062, + 0.7 + ], + [ + 8063, + 0.3 + ], + [ + 8064, + 0.25 + ], + [ + 8065, + 0.25 + ], + [ + 8066, + 0.25 + ], + [ + 8067, + 0.25 + ], + [ + 8068, + 0.25 + ], + [ + 8069, + 0.25 + ], + [ + 8070, + 0.4 + ], + [ + 8071, + 0.3 + ], + [ + 8072, + 0.3 + ], + [ + 8073, + 0.3 + ], + [ + 8074, + 0.3 + ], + [ + 8075, + 0.3 + ], + [ + 8076, + 0.5 + ], + [ + 8077, + 0.3 + ], + [ + 8078, + 0.3 + ], + [ + 8079, + 0.3 + ], + [ + 8080, + 0.3 + ], + [ + 8081, + 0.3 + ], + [ + 8082, + 0.3 + ], + [ + 8083, + 0.3 + ], + [ + 8084, + 0.3 + ], + [ + 8085, + 0.6 + ], + [ + 8086, + 0.25 + ], + [ + 8087, + 0.25 + ], + [ + 8088, + 0.25 + ], + [ + 8089, + 0.25 + ], + [ + 8090, + 0.25 + ], + [ + 8091, + 0.25 + ], + [ + 8092, + 0.25 + ], + [ + 8093, + 0.25 + ], + [ + 8094, + 0.4 + ], + [ + 8095, + 0.3 + ], + [ + 8096, + 0.3 + ], + [ + 8097, + 0.3 + ], + [ + 8098, + 0.3 + ], + [ + 8099, + 0.3 + ], + [ + 8100, + 0.5 + ], + [ + 8101, + 0.3 + ], + [ + 8102, + 0.3 + ], + [ + 8103, + 0.3 + ], + [ + 8104, + 0.3 + ], + [ + 8105, + 0.3 + ], + [ + 8106, + 0.3 + ], + [ + 8107, + 0.3 + ], + [ + 8108, + 0.3 + ], + [ + 8109, + 0.6 + ], + [ + 8110, + 0.25 + ], + [ + 8111, + 0.25 + ], + [ + 8112, + 0.25 + ], + [ + 8113, + 0.25 + ], + [ + 8114, + 0.25 + ], + [ + 8115, + 0.25 + ], + [ + 8116, + 0.25 + ], + [ + 8117, + 0.25 + ], + [ + 8118, + 0.4 + ], + [ + 8119, + 0.3 + ], + [ + 8120, + 0.3 + ], + [ + 8121, + 0.3 + ], + [ + 8122, + 0.3 + ], + [ + 8123, + 0.3 + ], + [ + 8124, + 0.5 + ], + [ + 8125, + 0.3 + ], + [ + 8126, + 0.3 + ], + [ + 8127, + 0.3 + ], + [ + 8128, + 0.3 + ], + [ + 8129, + 0.3 + ], + [ + 8130, + 0.3 + ], + [ + 8131, + 0.3 + ], + [ + 8132, + 0.3 + ], + [ + 8133, + 0.6 + ], + [ + 8134, + 0.25 + ], + [ + 8135, + 0.25 + ], + [ + 8136, + 0.25 + ], + [ + 8137, + 0.25 + ], + [ + 8138, + 0.25 + ], + [ + 8139, + 0.25 + ], + [ + 8140, + 0.25 + ], + [ + 8141, + 0.25 + ], + [ + 8142, + 0.4 + ], + [ + 8143, + 0.3 + ], + [ + 8144, + 0.3 + ], + [ + 8145, + 0.3 + ], + [ + 8146, + 0.3 + ], + [ + 8147, + 0.3 + ], + [ + 8148, + 0.5 + ], + [ + 8149, + 0.3 + ], + [ + 8150, + 0.3 + ], + [ + 8151, + 0.3 + ], + [ + 8152, + 0.3 + ], + [ + 8153, + 0.3 + ], + [ + 8154, + 0.3 + ], + [ + 8155, + 0.3 + ], + [ + 8156, + 0.3 + ], + [ + 8157, + 0.6 + ], + [ + 8158, + 0.25 + ], + [ + 8159, + 0.25 + ], + [ + 8160, + 0.25 + ], + [ + 8161, + 0.25 + ], + [ + 8162, + 0.25 + ], + [ + 8163, + 0.25 + ], + [ + 8164, + 0.25 + ], + [ + 8165, + 0.25 + ], + [ + 8166, + 0.4 + ], + [ + 8167, + 0.3 + ], + [ + 8168, + 0.3 + ], + [ + 8169, + 0.3 + ], + [ + 8170, + 0.3 + ], + [ + 8171, + 0.3 + ], + [ + 8172, + 0.5 + ], + [ + 8173, + 0.3 + ], + [ + 8174, + 0.3 + ], + [ + 8175, + 0.3 + ], + [ + 8176, + 0.3 + ], + [ + 8177, + 0.3 + ], + [ + 8178, + 0.3 + ], + [ + 8179, + 0.3 + ], + [ + 8180, + 0.3 + ], + [ + 8181, + 0.6 + ], + [ + 8182, + 0.25 + ], + [ + 8183, + 0.25 + ], + [ + 8184, + 0.3 + ], + [ + 8185, + 0.3 + ], + [ + 8186, + 0.3 + ], + [ + 8187, + 0.3 + ], + [ + 8188, + 0.3 + ], + [ + 8189, + 0.3 + ], + [ + 8190, + 0.3 + ], + [ + 8191, + 0.5 + ], + [ + 8192, + 0.55 + ], + [ + 8193, + 0.55 + ], + [ + 8194, + 0.55 + ], + [ + 8195, + 0.55 + ], + [ + 8196, + 0.65 + ], + [ + 8197, + 0.55 + ], + [ + 8198, + 0.55 + ], + [ + 8199, + 0.55 + ], + [ + 8200, + 0.55 + ], + [ + 8201, + 0.55 + ], + [ + 8202, + 0.55 + ], + [ + 8203, + 0.55 + ], + [ + 8204, + 0.55 + ], + [ + 8205, + 0.55 + ], + [ + 8206, + 0.7 + ], + [ + 8207, + 0.3 + ], + [ + 8208, + 0.3 + ], + [ + 8209, + 0.3 + ], + [ + 8210, + 0.3 + ], + [ + 8211, + 0.3 + ], + [ + 8212, + 0.3 + ], + [ + 8213, + 0.3 + ], + [ + 8214, + 0.3 + ], + [ + 8215, + 0.5 + ], + [ + 8216, + 0.55 + ], + [ + 8217, + 0.55 + ], + [ + 8218, + 0.55 + ], + [ + 8219, + 0.55 + ], + [ + 8220, + 0.65 + ], + [ + 8221, + 0.55 + ], + [ + 8222, + 0.55 + ], + [ + 8223, + 0.55 + ], + [ + 8224, + 0.55 + ], + [ + 8225, + 0.55 + ], + [ + 8226, + 0.55 + ], + [ + 8227, + 0.55 + ], + [ + 8228, + 0.55 + ], + [ + 8229, + 0.55 + ], + [ + 8230, + 0.7 + ], + [ + 8231, + 0.3 + ], + [ + 8232, + 0.25 + ], + [ + 8233, + 0.25 + ], + [ + 8234, + 0.25 + ], + [ + 8235, + 0.25 + ], + [ + 8236, + 0.25 + ], + [ + 8237, + 0.25 + ], + [ + 8238, + 0.4 + ], + [ + 8239, + 0.3 + ], + [ + 8240, + 0.3 + ], + [ + 8241, + 0.3 + ], + [ + 8242, + 0.3 + ], + [ + 8243, + 0.3 + ], + [ + 8244, + 0.5 + ], + [ + 8245, + 0.3 + ], + [ + 8246, + 0.3 + ], + [ + 8247, + 0.3 + ], + [ + 8248, + 0.3 + ], + [ + 8249, + 0.3 + ], + [ + 8250, + 0.3 + ], + [ + 8251, + 0.3 + ], + [ + 8252, + 0.3 + ], + [ + 8253, + 0.6 + ], + [ + 8254, + 0.25 + ], + [ + 8255, + 0.25 + ], + [ + 8256, + 0.25 + ], + [ + 8257, + 0.25 + ], + [ + 8258, + 0.25 + ], + [ + 8259, + 0.25 + ], + [ + 8260, + 0.25 + ], + [ + 8261, + 0.25 + ], + [ + 8262, + 0.4 + ], + [ + 8263, + 0.3 + ], + [ + 8264, + 0.3 + ], + [ + 8265, + 0.3 + ], + [ + 8266, + 0.3 + ], + [ + 8267, + 0.3 + ], + [ + 8268, + 0.5 + ], + [ + 8269, + 0.3 + ], + [ + 8270, + 0.3 + ], + [ + 8271, + 0.3 + ], + [ + 8272, + 0.3 + ], + [ + 8273, + 0.3 + ], + [ + 8274, + 0.3 + ], + [ + 8275, + 0.3 + ], + [ + 8276, + 0.3 + ], + [ + 8277, + 0.6 + ], + [ + 8278, + 0.25 + ], + [ + 8279, + 0.25 + ], + [ + 8280, + 0.25 + ], + [ + 8281, + 0.25 + ], + [ + 8282, + 0.25 + ], + [ + 8283, + 0.25 + ], + [ + 8284, + 0.25 + ], + [ + 8285, + 0.25 + ], + [ + 8286, + 0.4 + ], + [ + 8287, + 0.3 + ], + [ + 8288, + 0.3 + ], + [ + 8289, + 0.3 + ], + [ + 8290, + 0.3 + ], + [ + 8291, + 0.3 + ], + [ + 8292, + 0.5 + ], + [ + 8293, + 0.3 + ], + [ + 8294, + 0.3 + ], + [ + 8295, + 0.3 + ], + [ + 8296, + 0.3 + ], + [ + 8297, + 0.3 + ], + [ + 8298, + 0.3 + ], + [ + 8299, + 0.3 + ], + [ + 8300, + 0.3 + ], + [ + 8301, + 0.6 + ], + [ + 8302, + 0.25 + ], + [ + 8303, + 0.25 + ], + [ + 8304, + 0.25 + ], + [ + 8305, + 0.25 + ], + [ + 8306, + 0.25 + ], + [ + 8307, + 0.25 + ], + [ + 8308, + 0.25 + ], + [ + 8309, + 0.25 + ], + [ + 8310, + 0.4 + ], + [ + 8311, + 0.3 + ], + [ + 8312, + 0.3 + ], + [ + 8313, + 0.3 + ], + [ + 8314, + 0.3 + ], + [ + 8315, + 0.3 + ], + [ + 8316, + 0.5 + ], + [ + 8317, + 0.3 + ], + [ + 8318, + 0.3 + ], + [ + 8319, + 0.3 + ], + [ + 8320, + 0.3 + ], + [ + 8321, + 0.3 + ], + [ + 8322, + 0.3 + ], + [ + 8323, + 0.3 + ], + [ + 8324, + 0.3 + ], + [ + 8325, + 0.6 + ], + [ + 8326, + 0.25 + ], + [ + 8327, + 0.25 + ], + [ + 8328, + 0.25 + ], + [ + 8329, + 0.25 + ], + [ + 8330, + 0.25 + ], + [ + 8331, + 0.25 + ], + [ + 8332, + 0.25 + ], + [ + 8333, + 0.25 + ], + [ + 8334, + 0.4 + ], + [ + 8335, + 0.3 + ], + [ + 8336, + 0.3 + ], + [ + 8337, + 0.3 + ], + [ + 8338, + 0.3 + ], + [ + 8339, + 0.3 + ], + [ + 8340, + 0.5 + ], + [ + 8341, + 0.3 + ], + [ + 8342, + 0.3 + ], + [ + 8343, + 0.3 + ], + [ + 8344, + 0.3 + ], + [ + 8345, + 0.3 + ], + [ + 8346, + 0.3 + ], + [ + 8347, + 0.3 + ], + [ + 8348, + 0.3 + ], + [ + 8349, + 0.6 + ], + [ + 8350, + 0.25 + ], + [ + 8351, + 0.25 + ], + [ + 8352, + 0.3 + ], + [ + 8353, + 0.3 + ], + [ + 8354, + 0.3 + ], + [ + 8355, + 0.3 + ], + [ + 8356, + 0.3 + ], + [ + 8357, + 0.3 + ], + [ + 8358, + 0.3 + ], + [ + 8359, + 0.5 + ], + [ + 8360, + 0.55 + ], + [ + 8361, + 0.55 + ], + [ + 8362, + 0.55 + ], + [ + 8363, + 0.55 + ], + [ + 8364, + 0.65 + ], + [ + 8365, + 0.55 + ], + [ + 8366, + 0.55 + ], + [ + 8367, + 0.55 + ], + [ + 8368, + 0.55 + ], + [ + 8369, + 0.55 + ], + [ + 8370, + 0.55 + ], + [ + 8371, + 0.55 + ], + [ + 8372, + 0.55 + ], + [ + 8373, + 0.55 + ], + [ + 8374, + 0.7 + ], + [ + 8375, + 0.3 + ], + [ + 8376, + 0.3 + ], + [ + 8377, + 0.3 + ], + [ + 8378, + 0.3 + ], + [ + 8379, + 0.3 + ], + [ + 8380, + 0.3 + ], + [ + 8381, + 0.3 + ], + [ + 8382, + 0.3 + ], + [ + 8383, + 0.5 + ], + [ + 8384, + 0.55 + ], + [ + 8385, + 0.55 + ], + [ + 8386, + 0.55 + ], + [ + 8387, + 0.55 + ], + [ + 8388, + 0.65 + ], + [ + 8389, + 0.55 + ], + [ + 8390, + 0.55 + ], + [ + 8391, + 0.55 + ], + [ + 8392, + 0.55 + ], + [ + 8393, + 0.55 + ], + [ + 8394, + 0.55 + ], + [ + 8395, + 0.55 + ], + [ + 8396, + 0.55 + ], + [ + 8397, + 0.55 + ], + [ + 8398, + 0.7 + ], + [ + 8399, + 0.3 + ], + [ + 8400, + 0.25 + ], + [ + 8401, + 0.25 + ], + [ + 8402, + 0.25 + ], + [ + 8403, + 0.25 + ], + [ + 8404, + 0.25 + ], + [ + 8405, + 0.25 + ], + [ + 8406, + 0.4 + ], + [ + 8407, + 0.3 + ], + [ + 8408, + 0.3 + ], + [ + 8409, + 0.3 + ], + [ + 8410, + 0.3 + ], + [ + 8411, + 0.3 + ], + [ + 8412, + 0.5 + ], + [ + 8413, + 0.3 + ], + [ + 8414, + 0.3 + ], + [ + 8415, + 0.3 + ], + [ + 8416, + 0.3 + ], + [ + 8417, + 0.3 + ], + [ + 8418, + 0.3 + ], + [ + 8419, + 0.3 + ], + [ + 8420, + 0.3 + ], + [ + 8421, + 0.6 + ], + [ + 8422, + 0.25 + ], + [ + 8423, + 0.25 + ], + [ + 8424, + 0.25 + ], + [ + 8425, + 0.25 + ], + [ + 8426, + 0.25 + ], + [ + 8427, + 0.25 + ], + [ + 8428, + 0.25 + ], + [ + 8429, + 0.25 + ], + [ + 8430, + 0.4 + ], + [ + 8431, + 0.3 + ], + [ + 8432, + 0.3 + ], + [ + 8433, + 0.3 + ], + [ + 8434, + 0.3 + ], + [ + 8435, + 0.3 + ], + [ + 8436, + 0.5 + ], + [ + 8437, + 0.3 + ], + [ + 8438, + 0.3 + ], + [ + 8439, + 0.3 + ], + [ + 8440, + 0.3 + ], + [ + 8441, + 0.3 + ], + [ + 8442, + 0.3 + ], + [ + 8443, + 0.3 + ], + [ + 8444, + 0.3 + ], + [ + 8445, + 0.6 + ], + [ + 8446, + 0.25 + ], + [ + 8447, + 0.25 + ], + [ + 8448, + 0.25 + ], + [ + 8449, + 0.25 + ], + [ + 8450, + 0.25 + ], + [ + 8451, + 0.25 + ], + [ + 8452, + 0.25 + ], + [ + 8453, + 0.25 + ], + [ + 8454, + 0.4 + ], + [ + 8455, + 0.3 + ], + [ + 8456, + 0.3 + ], + [ + 8457, + 0.3 + ], + [ + 8458, + 0.3 + ], + [ + 8459, + 0.3 + ], + [ + 8460, + 0.5 + ], + [ + 8461, + 0.3 + ], + [ + 8462, + 0.3 + ], + [ + 8463, + 0.3 + ], + [ + 8464, + 0.3 + ], + [ + 8465, + 0.3 + ], + [ + 8466, + 0.3 + ], + [ + 8467, + 0.3 + ], + [ + 8468, + 0.3 + ], + [ + 8469, + 0.6 + ], + [ + 8470, + 0.25 + ], + [ + 8471, + 0.25 + ], + [ + 8472, + 0.25 + ], + [ + 8473, + 0.25 + ], + [ + 8474, + 0.25 + ], + [ + 8475, + 0.25 + ], + [ + 8476, + 0.25 + ], + [ + 8477, + 0.25 + ], + [ + 8478, + 0.4 + ], + [ + 8479, + 0.3 + ], + [ + 8480, + 0.3 + ], + [ + 8481, + 0.3 + ], + [ + 8482, + 0.3 + ], + [ + 8483, + 0.3 + ], + [ + 8484, + 0.5 + ], + [ + 8485, + 0.3 + ], + [ + 8486, + 0.3 + ], + [ + 8487, + 0.3 + ], + [ + 8488, + 0.3 + ], + [ + 8489, + 0.3 + ], + [ + 8490, + 0.3 + ], + [ + 8491, + 0.3 + ], + [ + 8492, + 0.3 + ], + [ + 8493, + 0.6 + ], + [ + 8494, + 0.25 + ], + [ + 8495, + 0.25 + ], + [ + 8496, + 0.25 + ], + [ + 8497, + 0.25 + ], + [ + 8498, + 0.25 + ], + [ + 8499, + 0.25 + ], + [ + 8500, + 0.25 + ], + [ + 8501, + 0.25 + ], + [ + 8502, + 0.4 + ], + [ + 8503, + 0.3 + ], + [ + 8504, + 0.3 + ], + [ + 8505, + 0.3 + ], + [ + 8506, + 0.3 + ], + [ + 8507, + 0.3 + ], + [ + 8508, + 0.5 + ], + [ + 8509, + 0.3 + ], + [ + 8510, + 0.3 + ], + [ + 8511, + 0.3 + ], + [ + 8512, + 0.3 + ], + [ + 8513, + 0.3 + ], + [ + 8514, + 0.3 + ], + [ + 8515, + 0.3 + ], + [ + 8516, + 0.3 + ], + [ + 8517, + 0.6 + ], + [ + 8518, + 0.25 + ], + [ + 8519, + 0.25 + ], + [ + 8520, + 0.3 + ], + [ + 8521, + 0.3 + ], + [ + 8522, + 0.3 + ], + [ + 8523, + 0.3 + ], + [ + 8524, + 0.3 + ], + [ + 8525, + 0.3 + ], + [ + 8526, + 0.3 + ], + [ + 8527, + 0.5 + ], + [ + 8528, + 0.55 + ], + [ + 8529, + 0.55 + ], + [ + 8530, + 0.55 + ], + [ + 8531, + 0.55 + ], + [ + 8532, + 0.65 + ], + [ + 8533, + 0.55 + ], + [ + 8534, + 0.55 + ], + [ + 8535, + 0.55 + ], + [ + 8536, + 0.55 + ], + [ + 8537, + 0.55 + ], + [ + 8538, + 0.55 + ], + [ + 8539, + 0.55 + ], + [ + 8540, + 0.55 + ], + [ + 8541, + 0.55 + ], + [ + 8542, + 0.7 + ], + [ + 8543, + 0.3 + ], + [ + 8544, + 0.3 + ], + [ + 8545, + 0.3 + ], + [ + 8546, + 0.3 + ], + [ + 8547, + 0.3 + ], + [ + 8548, + 0.3 + ], + [ + 8549, + 0.3 + ], + [ + 8550, + 0.3 + ], + [ + 8551, + 0.5 + ], + [ + 8552, + 0.55 + ], + [ + 8553, + 0.55 + ], + [ + 8554, + 0.55 + ], + [ + 8555, + 0.55 + ], + [ + 8556, + 0.65 + ], + [ + 8557, + 0.55 + ], + [ + 8558, + 0.55 + ], + [ + 8559, + 0.55 + ], + [ + 8560, + 0.55 + ], + [ + 8561, + 0.55 + ], + [ + 8562, + 0.55 + ], + [ + 8563, + 0.55 + ], + [ + 8564, + 0.55 + ], + [ + 8565, + 0.55 + ], + [ + 8566, + 0.7 + ], + [ + 8567, + 0.3 + ], + [ + 8568, + 0.25 + ], + [ + 8569, + 0.25 + ], + [ + 8570, + 0.25 + ], + [ + 8571, + 0.25 + ], + [ + 8572, + 0.25 + ], + [ + 8573, + 0.25 + ], + [ + 8574, + 0.4 + ], + [ + 8575, + 0.3 + ], + [ + 8576, + 0.3 + ], + [ + 8577, + 0.3 + ], + [ + 8578, + 0.3 + ], + [ + 8579, + 0.3 + ], + [ + 8580, + 0.5 + ], + [ + 8581, + 0.3 + ], + [ + 8582, + 0.3 + ], + [ + 8583, + 0.3 + ], + [ + 8584, + 0.3 + ], + [ + 8585, + 0.3 + ], + [ + 8586, + 0.3 + ], + [ + 8587, + 0.3 + ], + [ + 8588, + 0.3 + ], + [ + 8589, + 0.6 + ], + [ + 8590, + 0.25 + ], + [ + 8591, + 0.25 + ], + [ + 8592, + 0.25 + ], + [ + 8593, + 0.25 + ], + [ + 8594, + 0.25 + ], + [ + 8595, + 0.25 + ], + [ + 8596, + 0.25 + ], + [ + 8597, + 0.25 + ], + [ + 8598, + 0.4 + ], + [ + 8599, + 0.3 + ], + [ + 8600, + 0.3 + ], + [ + 8601, + 0.3 + ], + [ + 8602, + 0.3 + ], + [ + 8603, + 0.3 + ], + [ + 8604, + 0.5 + ], + [ + 8605, + 0.3 + ], + [ + 8606, + 0.3 + ], + [ + 8607, + 0.3 + ], + [ + 8608, + 0.3 + ], + [ + 8609, + 0.3 + ], + [ + 8610, + 0.3 + ], + [ + 8611, + 0.3 + ], + [ + 8612, + 0.3 + ], + [ + 8613, + 0.6 + ], + [ + 8614, + 0.25 + ], + [ + 8615, + 0.25 + ], + [ + 8616, + 0.25 + ], + [ + 8617, + 0.25 + ], + [ + 8618, + 0.25 + ], + [ + 8619, + 0.25 + ], + [ + 8620, + 0.25 + ], + [ + 8621, + 0.25 + ], + [ + 8622, + 0.4 + ], + [ + 8623, + 0.3 + ], + [ + 8624, + 0.3 + ], + [ + 8625, + 0.3 + ], + [ + 8626, + 0.3 + ], + [ + 8627, + 0.3 + ], + [ + 8628, + 0.5 + ], + [ + 8629, + 0.3 + ], + [ + 8630, + 0.3 + ], + [ + 8631, + 0.3 + ], + [ + 8632, + 0.3 + ], + [ + 8633, + 0.3 + ], + [ + 8634, + 0.3 + ], + [ + 8635, + 0.3 + ], + [ + 8636, + 0.3 + ], + [ + 8637, + 0.6 + ], + [ + 8638, + 0.25 + ], + [ + 8639, + 0.25 + ], + [ + 8640, + 0.25 + ], + [ + 8641, + 0.25 + ], + [ + 8642, + 0.25 + ], + [ + 8643, + 0.25 + ], + [ + 8644, + 0.25 + ], + [ + 8645, + 0.25 + ], + [ + 8646, + 0.4 + ], + [ + 8647, + 0.3 + ], + [ + 8648, + 0.3 + ], + [ + 8649, + 0.3 + ], + [ + 8650, + 0.3 + ], + [ + 8651, + 0.3 + ], + [ + 8652, + 0.5 + ], + [ + 8653, + 0.3 + ], + [ + 8654, + 0.3 + ], + [ + 8655, + 0.3 + ], + [ + 8656, + 0.3 + ], + [ + 8657, + 0.3 + ], + [ + 8658, + 0.3 + ], + [ + 8659, + 0.3 + ], + [ + 8660, + 0.3 + ], + [ + 8661, + 0.6 + ], + [ + 8662, + 0.25 + ], + [ + 8663, + 0.25 + ], + [ + 8664, + 0.25 + ], + [ + 8665, + 0.25 + ], + [ + 8666, + 0.25 + ], + [ + 8667, + 0.25 + ], + [ + 8668, + 0.25 + ], + [ + 8669, + 0.25 + ], + [ + 8670, + 0.4 + ], + [ + 8671, + 0.3 + ], + [ + 8672, + 0.3 + ], + [ + 8673, + 0.3 + ], + [ + 8674, + 0.3 + ], + [ + 8675, + 0.3 + ], + [ + 8676, + 0.5 + ], + [ + 8677, + 0.3 + ], + [ + 8678, + 0.3 + ], + [ + 8679, + 0.3 + ], + [ + 8680, + 0.3 + ], + [ + 8681, + 0.3 + ], + [ + 8682, + 0.3 + ], + [ + 8683, + 0.3 + ], + [ + 8684, + 0.3 + ], + [ + 8685, + 0.6 + ], + [ + 8686, + 0.25 + ], + [ + 8687, + 0.25 + ], + [ + 8688, + 0.3 + ], + [ + 8689, + 0.3 + ], + [ + 8690, + 0.3 + ], + [ + 8691, + 0.3 + ], + [ + 8692, + 0.3 + ], + [ + 8693, + 0.3 + ], + [ + 8694, + 0.3 + ], + [ + 8695, + 0.5 + ], + [ + 8696, + 0.55 + ], + [ + 8697, + 0.55 + ], + [ + 8698, + 0.55 + ], + [ + 8699, + 0.55 + ], + [ + 8700, + 0.65 + ], + [ + 8701, + 0.55 + ], + [ + 8702, + 0.55 + ], + [ + 8703, + 0.55 + ], + [ + 8704, + 0.55 + ], + [ + 8705, + 0.55 + ], + [ + 8706, + 0.55 + ], + [ + 8707, + 0.55 + ], + [ + 8708, + 0.55 + ], + [ + 8709, + 0.55 + ], + [ + 8710, + 0.7 + ], + [ + 8711, + 0.3 + ], + [ + 8712, + 0.3 + ], + [ + 8713, + 0.3 + ], + [ + 8714, + 0.3 + ], + [ + 8715, + 0.3 + ], + [ + 8716, + 0.3 + ], + [ + 8717, + 0.3 + ], + [ + 8718, + 0.3 + ], + [ + 8719, + 0.5 + ], + [ + 8720, + 0.55 + ], + [ + 8721, + 0.55 + ], + [ + 8722, + 0.55 + ], + [ + 8723, + 0.55 + ], + [ + 8724, + 0.65 + ], + [ + 8725, + 0.55 + ], + [ + 8726, + 0.55 + ], + [ + 8727, + 0.55 + ], + [ + 8728, + 0.55 + ], + [ + 8729, + 0.55 + ], + [ + 8730, + 0.55 + ], + [ + 8731, + 0.55 + ], + [ + 8732, + 0.55 + ], + [ + 8733, + 0.55 + ], + [ + 8734, + 0.7 + ], + [ + 8735, + 0.3 + ], + [ + 8736, + 0.25 + ], + [ + 8737, + 0.25 + ], + [ + 8738, + 0.25 + ], + [ + 8739, + 0.25 + ], + [ + 8740, + 0.25 + ], + [ + 8741, + 0.25 + ], + [ + 8742, + 0.4 + ], + [ + 8743, + 0.3 + ], + [ + 8744, + 0.3 + ], + [ + 8745, + 0.3 + ], + [ + 8746, + 0.3 + ], + [ + 8747, + 0.3 + ], + [ + 8748, + 0.5 + ], + [ + 8749, + 0.3 + ], + [ + 8750, + 0.3 + ], + [ + 8751, + 0.3 + ], + [ + 8752, + 0.3 + ], + [ + 8753, + 0.3 + ], + [ + 8754, + 0.3 + ], + [ + 8755, + 0.3 + ], + [ + 8756, + 0.3 + ], + [ + 8757, + 0.6 + ], + [ + 8758, + 0.25 + ], + [ + 8759, + 0.25 + ] + ] + }, + { + "_type": "SAM.Analytical.Profile,SAM.Analytical", + "Name": "FIX_IC_B_EQL", + "Guid": "e8fcb44c-fc7d-44e1-950e-969d3a28edc4", + "Category": "Equipment Latent", + "Values": [ + [ + 0, + 0.5 + ] + ] + }, + { + "_type": "SAM.Analytical.Profile,SAM.Analytical", + "Name": "FIX_IC_B_INF", + "Guid": "e058a148-3137-4281-9e5b-299b5d90f5bf", + "Category": "Infiltration", + "Values": [ + [ + 0, + 0.9 + ], + [ + 1, + 0.9 + ], + [ + 2, + 0.9 + ], + [ + 3, + 0.9 + ], + [ + 4, + 0.9 + ], + [ + 5, + 0.9 + ], + [ + 6, + 1.0 + ], + [ + 7, + 1.0 + ], + [ + 8, + 1.0 + ], + [ + 9, + 1.0 + ], + [ + 10, + 1.0 + ], + [ + 11, + 1.0 + ], + [ + 12, + 1.0 + ], + [ + 13, + 1.0 + ], + [ + 14, + 1.0 + ], + [ + 15, + 1.0 + ], + [ + 16, + 1.0 + ], + [ + 17, + 1.0 + ], + [ + 18, + 1.0 + ], + [ + 19, + 1.0 + ], + [ + 20, + 1.0 + ], + [ + 21, + 0.95 + ], + [ + 22, + 0.9 + ], + [ + 23, + 0.9 + ] + ] + }, + { + "_type": "SAM.Analytical.Profile,SAM.Analytical", + "Name": "FIX_IC_B_HTG", + "Guid": "b2d17732-0e58-419d-864d-564fb43fdd4b", + "Category": "Heating", + "Values": [ + [ + 0, + 17.0 + ], + [ + 1, + 17.0 + ], + [ + 2, + 17.0 + ], + [ + 3, + 17.0 + ], + [ + 4, + 17.0 + ], + [ + 5, + 17.0 + ], + [ + 6, + 19.5 + ], + [ + 7, + 19.5 + ], + [ + 8, + 19.5 + ], + [ + 9, + 19.5 + ], + [ + 10, + 19.5 + ], + [ + 11, + 19.5 + ], + [ + 12, + 19.5 + ], + [ + 13, + 19.5 + ], + [ + 14, + 19.5 + ], + [ + 15, + 19.5 + ], + [ + 16, + 19.5 + ], + [ + 17, + 19.5 + ], + [ + 18, + 19.5 + ], + [ + 19, + 19.5 + ], + [ + 20, + 19.5 + ], + [ + 21, + 19.5 + ], + [ + 22, + 19.5 + ], + [ + 23, + 17.0 + ] + ] + }, + { + "_type": "SAM.Analytical.Profile,SAM.Analytical", + "Name": "FIX_IC_B_CLG", + "Guid": "af43b16c-d74b-48cc-be05-9fba5ca7a543", + "Category": "Cooling", + "Values": [ + [ + 0, + 27.0 + ], + [ + 1, + 27.0 + ], + [ + 2, + 27.0 + ], + [ + 3, + 27.0 + ], + [ + 4, + 27.0 + ], + [ + 5, + 27.0 + ], + [ + 6, + 26.0 + ], + [ + 7, + 26.0 + ], + [ + 8, + 26.0 + ], + [ + 9, + 26.0 + ], + [ + 10, + 26.0 + ], + [ + 11, + 26.0 + ], + [ + 12, + 26.0 + ], + [ + 13, + 26.0 + ], + [ + 14, + 26.0 + ], + [ + 15, + 26.0 + ], + [ + 16, + 26.0 + ], + [ + 17, + 26.0 + ], + [ + 18, + 26.0 + ], + [ + 19, + 26.0 + ], + [ + 20, + 26.0 + ], + [ + 21, + 26.0 + ], + [ + 22, + 26.0 + ], + [ + 23, + 27.0 + ] + ] + }, + { + "_type": "SAM.Analytical.Profile,SAM.Analytical", + "Name": "FIX_IC_B_HUM", + "Guid": "7cad27df-3647-4d99-b07b-4887276c4d09", + "Category": "Humidification", + "Values": [ + [ + 0, + 40.0 + ] + ] + }, + { + "_type": "SAM.Analytical.Profile,SAM.Analytical", + "Name": "FIX_IC_B_DHU", + "Guid": "59199c7b-d592-4a1f-93fe-16d51b7f54d0", + "Category": "Dehumidification", + "Values": [ + [ + 0, + 60.0 + ] + ] + } + ] + } + } +] \ No newline at end of file diff --git a/benchmark/SAM.Analytical.OpenStudio.InputReadBack/Native/IdfText.cs b/benchmark/SAM.Analytical.OpenStudio.InputReadBack/Native/IdfText.cs new file mode 100644 index 0000000..56ca5f7 --- /dev/null +++ b/benchmark/SAM.Analytical.OpenStudio.InputReadBack/Native/IdfText.cs @@ -0,0 +1,150 @@ +// SPDX-License-Identifier: LGPL-3.0-or-later +// Copyright (c) 2020–2026 Michal Dengusiak & Jakub Ziolkowski and contributors + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace SAM.Analytical.OpenStudio.InputReadBack +{ + /// One field of an IDF or OSM object: its raw text and the "!- label" the file writes beside it (null when none). + public sealed class IdfField + { + public string Value { get; set; } + public string Label { get; set; } + } + + /// One IDF or OSM object: its class name and its fields in file order (index 0 is the field after the class name). + public sealed class IdfObject + { + public string Type { get; set; } + public List Fields { get; set; } = new List(); + + public string Name => Fields.Count > 0 ? Fields[0].Value : null; + + /// The raw value of field , or null when the object is shorter (EnergyPlus treats a missing trailing field as blank). + public string Value(int index) + { + return index >= 0 && index < Fields.Count ? Fields[index].Value : null; + } + + /// + /// Field after checking the file's own label for it: when the file labels the field and the + /// label does not start with , the layout is not the one this reader knows and the field is + /// unreadable ( says why), never silently read from another position. + /// + public string Value(int index, string label, out string problem) + { + problem = null; + if (index < 0 || index >= Fields.Count) + { + return null; + } + + IdfField field = Fields[index]; + if (label != null && field.Label != null && !field.Label.StartsWith(label, StringComparison.OrdinalIgnoreCase)) + { + problem = string.Format("{0} '{1}' field {2} is labelled '{3}', expected '{4}'", Type, Name, index, field.Label, label); + return null; + } + + return field.Value; + } + + /// + /// The value of the first field the file labels (prefix, case-insensitive), for OSM objects + /// whose trailing blank fields may be omitted. is false when no field carries the label. + /// + public string ValueByLabel(string label, out bool found) + { + IdfField field = Fields.FirstOrDefault(x => x.Label != null && x.Label.StartsWith(label, StringComparison.OrdinalIgnoreCase)); + found = field != null; + return field?.Value; + } + } + + /// + /// A minimal, IDD-free reader of the IDF/OSM text syntax: objects end with ';', fields are separated by ',', and '!' + /// starts a comment. It is deliberately independent of the OpenStudio SDK that wrote the files (S07 section 3: native + /// values come from read-back, not from the writer). + /// + public static class IdfText + { + public static List Parse(string text) + { + List result = new List(); + if (string.IsNullOrEmpty(text)) + { + return result; + } + + List current = new List(); + StringBuilder token = new StringBuilder(); + foreach (string rawLine in text.Split('\n')) + { + string line = rawLine.TrimEnd('\r'); + string label = null; + int bang = line.IndexOf('!'); + if (bang >= 0) + { + string comment = line.Substring(bang + 1); + if (comment.StartsWith("-", StringComparison.Ordinal)) + { + label = comment.Substring(1).Trim(); + } + + line = line.Substring(0, bang); + } + + List lineFields = new List(); + foreach (char c in line) + { + if (c == ',' || c == ';') + { + IdfField field = new IdfField { Value = token.ToString().Trim() }; + token.Clear(); + current.Add(field); + lineFields.Add(field); + if (c == ';') + { + Finish(current, result); + current = new List(); + } + } + else + { + token.Append(c); + } + } + + // A label describes the last field completed on its line ("0, 0, 3.05, !- X,Y,Z Vertex 3" labels the z). + if (label != null && lineFields.Count > 0) + { + lineFields[lineFields.Count - 1].Label = label; + } + + if (token.Length > 0 && !string.IsNullOrWhiteSpace(token.ToString())) + { + token.Append(' '); + } + else + { + token.Clear(); + } + } + + return result; + } + + private static void Finish(List fields, List result) + { + if (fields.Count == 0 || string.IsNullOrWhiteSpace(fields[0].Value)) + { + return; + } + + result.Add(new IdfObject { Type = fields[0].Value, Fields = fields.Skip(1).ToList() }); + } + } +} diff --git a/benchmark/SAM.Analytical.OpenStudio.InputReadBack/Native/NativeReader.cs b/benchmark/SAM.Analytical.OpenStudio.InputReadBack/Native/NativeReader.cs new file mode 100644 index 0000000..952f865 --- /dev/null +++ b/benchmark/SAM.Analytical.OpenStudio.InputReadBack/Native/NativeReader.cs @@ -0,0 +1,181 @@ +// SPDX-License-Identifier: LGPL-3.0-or-later +// Copyright (c) 2020–2026 Michal Dengusiak & Jakub Ziolkowski and contributors + +using System; +using System.Collections.Generic; +using System.Globalization; +using System.IO; +using System.Linq; +using System.Text.Json; + +namespace SAM.Analytical.OpenStudio.InputReadBack +{ + /// + /// What the fresh-process reader found in the saved OSM and the translated IDF (native.json). Objects are kept as raw + /// field text with the file's own labels; schedules are expanded to hourly values. No SAM object, writer cache or + /// OpenStudio SDK call is involved. + /// + public sealed class NativeSnapshot + { + public string Schema { get; set; } = "s09-native/2"; + public int ProcessId { get; set; } + + /// The reader process's OS creation time; with it identifies the process (). + public DateTime ProcessStartedUtc { get; set; } + public DateTime StartedUtc { get; set; } + public DateTime FinishedUtc { get; set; } + public string ReaderAssemblySha256 { get; set; } + public string OsmSha256Before { get; set; } + public string OsmSha256After { get; set; } + public string IdfSha256Before { get; set; } + public string IdfSha256After { get; set; } + + /// The run year length from the IDF RunPeriod (365 unless its begin year is a leap year). + public int DayCount { get; set; } + public string DayCountEvidence { get; set; } + + /// The EPW the OSM references (OS:WeatherFile Url), hashed by this reader; null when absent or missing. + public string WeatherFileSha256 { get; set; } + public string WeatherFileProblem { get; set; } + + public List Idf { get; set; } = new List(); + public List Osm { get; set; } = new List(); + public List IdfSchedules { get; set; } = new List(); + public List OsmSchedules { get; set; } = new List(); + + public void Save(string path) + { + File.WriteAllText(path, JsonSerializer.Serialize(this, Json.Options)); + } + + public static NativeSnapshot Load(string path) + { + return JsonSerializer.Deserialize(File.ReadAllText(path), Json.Options); + } + + public IEnumerable IdfOf(string type) + { + return Idf.Where(x => string.Equals(x.Type, type, StringComparison.OrdinalIgnoreCase)); + } + + public IEnumerable OsmOf(string type) + { + return Osm.Where(x => string.Equals(x.Type, type, StringComparison.OrdinalIgnoreCase)); + } + } + + public static class NativeReader + { + /// + /// IDF classes the comparison reads, plus every class that could add air, heat or geometry SAM never stated (kept so + /// the comparison can refuse them as native extras). + /// + public static readonly string[] IdfTypes = + { + "Building", "GlobalGeometryRules", "Zone", "Space", "SpaceList", "ZoneList", "ZoneGroup", + "BuildingSurface:Detailed", "FenestrationSurface:Detailed", "Wall:Detailed", "RoofCeiling:Detailed", "Floor:Detailed", + "Window", "Door", "GlazedDoor", "Window:Interzone", "Door:Interzone", "GlazedDoor:Interzone", + "Shading:Building:Detailed", "Shading:Site:Detailed", "Shading:Zone:Detailed", "InternalMass", + "Construction", "Construction:AirBoundary", "Material", "Material:NoMass", "Material:AirGap", + "WindowMaterial:Glazing", "WindowMaterial:Gas", "WindowMaterial:SimpleGlazingSystem", "WindowProperty:FrameAndDivider", + "People", "Lights", "ElectricEquipment", "GasEquipment", "HotWaterEquipment", "SteamEquipment", "OtherEquipment", + "ZoneInfiltration:DesignFlowRate", "ZoneInfiltration:EffectiveLeakageArea", "ZoneInfiltration:FlowCoefficient", + "ZoneVentilation:DesignFlowRate", "ZoneVentilation:WindandStackOpenArea", "ZoneMixing", "ZoneCrossMixing", + "AirflowNetwork:SimulationControl", "AirLoopHVAC", "ZoneHVAC:EquipmentConnections", "ZoneHVAC:EquipmentList", + "DesignSpecification:OutdoorAir", "DesignSpecification:OutdoorAir:SpaceList", "ZoneHVAC:IdealLoadsAirSystem", + "ZoneControl:Thermostat", "ThermostatSetpoint:DualSetpoint", "ThermostatSetpoint:SingleHeating", + "ThermostatSetpoint:SingleCooling", "ThermostatSetpoint:SingleHeatingOrCooling", "ZoneControl:Humidistat", + "Sizing:Zone", "RunPeriod", "Site:Location", "SizingPeriod:DesignDay", "SizingPeriod:WeatherFileDays", + "SizingPeriod:WeatherFileConditionType", "Site:GroundTemperature:BuildingSurface", "Timestep" + }; + + public static readonly string[] OsmTypes = + { + "OS:Space", "OS:SpaceType", "OS:ThermalZone", "OS:DesignSpecification:OutdoorAir", "OS:ZoneHVAC:IdealLoadsAirSystem", + "OS:WeatherFile", "OS:Site", "OS:RunPeriod", "OS:YearDescription", "OS:Building", "OS:SubSurface" + }; + + private static readonly string[] scheduleTypes = { "Schedule:Compact", "Schedule:Constant", "Schedule:File", "Schedule:Year", "Schedule:Day:Interval", "Schedule:FixedInterval" }; + + public static NativeSnapshot Read(string osmPath, string idfPath) + { + NativeSnapshot result = new NativeSnapshot + { + ProcessId = Environment.ProcessId, + ProcessStartedUtc = ProcessIdentity.CurrentStartedUtc(), + StartedUtc = DateTime.UtcNow, + ReaderAssemblySha256 = Hashing.Sha256(typeof(NativeReader).Assembly.Location), + OsmSha256Before = Hashing.Sha256(osmPath), + IdfSha256Before = Hashing.Sha256(idfPath) + }; + + List idf = IdfText.Parse(File.ReadAllText(idfPath)); + List osm = IdfText.Parse(File.ReadAllText(osmPath)); + + result.Idf = idf.Where(x => IdfTypes.Contains(x.Type, StringComparer.OrdinalIgnoreCase)).ToList(); + result.Osm = osm.Where(x => OsmTypes.Contains(x.Type, StringComparer.OrdinalIgnoreCase)).ToList(); + + result.DayCount = 365; + result.DayCountEvidence = "no RunPeriod: 365 days assumed"; + IdfObject runPeriod = result.IdfOf("RunPeriod").FirstOrDefault(); + if (runPeriod != null) + { + string year = runPeriod.Value(3, "Begin Year", out string problem); + if (problem == null && int.TryParse(year, NumberStyles.Integer, CultureInfo.InvariantCulture, out int beginYear)) + { + result.DayCount = DateTime.IsLeapYear(beginYear) ? 366 : 365; + result.DayCountEvidence = "IDF RunPeriod begin year " + beginYear; + } + else + { + result.DayCountEvidence = "IDF RunPeriod begin year unreadable ('" + year + "'" + (problem == null ? string.Empty : "; " + problem) + "): 365 days assumed"; + } + } + + foreach (IdfObject schedule in idf.Where(x => scheduleTypes.Contains(x.Type, StringComparer.OrdinalIgnoreCase))) + { + result.IdfSchedules.Add(ScheduleReader.Read(schedule, result.DayCount, "idf")); + } + + foreach (IdfObject schedule in osm.Where(x => string.Equals(x.Type, "OS:Schedule:FixedInterval", StringComparison.OrdinalIgnoreCase))) + { + result.OsmSchedules.Add(ScheduleReader.Read(schedule, result.DayCount, "osm")); + } + + // Schedule references in the OSM are handles; keep each schedule's handle beside its name. + foreach (IdfObject schedule in osm.Where(x => string.Equals(x.Type, "OS:Schedule:FixedInterval", StringComparison.OrdinalIgnoreCase) || string.Equals(x.Type, "OS:Schedule:Constant", StringComparison.OrdinalIgnoreCase))) + { + result.Osm.Add(new IdfObject { Type = "SAM:OsmScheduleHandle", Fields = new List { new IdfField { Value = schedule.Value(0) }, new IdfField { Value = schedule.Value(1) }, new IdfField { Value = schedule.Type } } }); + } + + IdfObject weatherFile = result.OsmOf("OS:WeatherFile").FirstOrDefault(); + string url = weatherFile?.Value(10, "Url", out string _); + if (string.IsNullOrWhiteSpace(url)) + { + result.WeatherFileProblem = "the OSM references no weather file"; + } + else + { + string path = url.StartsWith("file:///", StringComparison.OrdinalIgnoreCase) ? url.Substring(8) : url; + if (!Path.IsPathRooted(path)) + { + path = Path.Combine(Path.GetDirectoryName(Path.GetFullPath(osmPath)), path); + } + + if (File.Exists(path)) + { + result.WeatherFileSha256 = Hashing.Sha256(path); + } + else + { + result.WeatherFileProblem = "the referenced weather file does not exist"; + } + } + + result.OsmSha256After = Hashing.Sha256(osmPath); + result.IdfSha256After = Hashing.Sha256(idfPath); + result.FinishedUtc = DateTime.UtcNow; + return result; + } + } +} diff --git a/benchmark/SAM.Analytical.OpenStudio.InputReadBack/Native/ScheduleReader.cs b/benchmark/SAM.Analytical.OpenStudio.InputReadBack/Native/ScheduleReader.cs new file mode 100644 index 0000000..f463ce4 --- /dev/null +++ b/benchmark/SAM.Analytical.OpenStudio.InputReadBack/Native/ScheduleReader.cs @@ -0,0 +1,237 @@ +// SPDX-License-Identifier: LGPL-3.0-or-later +// Copyright (c) 2020–2026 Michal Dengusiak & Jakub Ziolkowski and contributors + +using System; +using System.Collections.Generic; +using System.Globalization; + +namespace SAM.Analytical.OpenStudio.InputReadBack +{ + /// + /// One native schedule expanded to hourly values of the run year. is null when the schedule cannot + /// be read ( says why); a value that does not parse is never turned into a number. + /// + public sealed class NativeSchedule + { + public string Source { get; set; } + public string Type { get; set; } + public string Name { get; set; } + public double[] Values { get; set; } + public string Problem { get; set; } + + /// True when the file itself labels every hour (S07 section 7): see . + public bool AlignmentVerified { get; set; } + public string AlignmentEvidence { get; set; } + } + + /// + /// Expands native schedules to hourly values. Hour index 0 is 1 January 00:00-01:00 of the run year. The supported forms + /// are the ones the OpenStudio route writes: IDF Schedule:Compact with "For: AllDays" and whole-hour "Until:" labels, + /// Schedule:Constant, and OSM OS:Schedule:FixedInterval. Anything else is unreadable, never approximated. + /// + public static class ScheduleReader + { + private static readonly CultureInfo ci = CultureInfo.InvariantCulture; + + public static NativeSchedule Read(IdfObject idfObject, int dayCount, string source) + { + NativeSchedule result = new NativeSchedule { Source = source, Type = idfObject.Type, Name = idfObject.Type.StartsWith("OS:", StringComparison.Ordinal) ? idfObject.Value(1) : idfObject.Name }; + try + { + switch (idfObject.Type.ToLowerInvariant()) + { + case "schedule:compact": + Compact(idfObject, dayCount, result); + break; + case "schedule:constant": + Constant(idfObject, dayCount, result); + break; + case "os:schedule:fixedinterval": + FixedInterval(idfObject, dayCount, result); + break; + default: + result.Problem = "schedule type " + idfObject.Type + " is not read by the S09 reader"; + break; + } + } + catch (FormatException exception) + { + result.Values = null; + result.AlignmentVerified = false; + result.Problem = exception.Message; + } + + return result; + } + + private static void Constant(IdfObject idfObject, int dayCount, NativeSchedule result) + { + double value = Number(idfObject.Value(2), "Schedule:Constant hourly value"); + result.Values = Fill(dayCount * 24, value); + result.AlignmentVerified = true; + result.AlignmentEvidence = "constant: every hour has the same value"; + } + + private static void Compact(IdfObject idfObject, int dayCount, NativeSchedule result) + { + double[] values = new double[dayCount * 24]; + bool[] set = new bool[values.Length]; + int day = 0; + int i = 2; + int throughCount = 0; + while (i < idfObject.Fields.Count) + { + string through = idfObject.Value(i); + if (string.IsNullOrWhiteSpace(through)) + { + i++; + continue; + } + + if (!through.StartsWith("Through:", StringComparison.OrdinalIgnoreCase)) + { + throw new FormatException("Schedule:Compact '" + result.Name + "': expected 'Through:' at field " + i + ", found '" + through + "'"); + } + + int lastDay = DayOfYear(through.Substring(8).Trim(), dayCount, result.Name); + if (lastDay < day) + { + throw new FormatException("Schedule:Compact '" + result.Name + "': 'Through:' dates go backwards at field " + i); + } + + throughCount++; + i++; + string forDays = idfObject.Value(i); + if (forDays == null || !string.Equals(forDays.Replace(" ", string.Empty), "For:AllDays", StringComparison.OrdinalIgnoreCase)) + { + throw new FormatException("Schedule:Compact '" + result.Name + "': only 'For: AllDays' is read, found '" + forDays + "'"); + } + + i++; + double[] dayValues = new double[24]; + int hour = 0; + while (i + 1 < idfObject.Fields.Count && idfObject.Value(i) != null && idfObject.Value(i).StartsWith("Until:", StringComparison.OrdinalIgnoreCase)) + { + int until = Hour(idfObject.Value(i).Substring(6).Trim(), result.Name); + double value = Number(idfObject.Value(i + 1), "Schedule:Compact '" + result.Name + "' value"); + if (until <= hour) + { + throw new FormatException("Schedule:Compact '" + result.Name + "': 'Until:' hours do not increase at field " + i); + } + + for (int h = hour; h < until; h++) + { + dayValues[h] = value; + } + + hour = until; + i += 2; + } + + if (hour != 24) + { + throw new FormatException("Schedule:Compact '" + result.Name + "': a day ends at hour " + hour + ", not 24:00"); + } + + for (int d = day; d <= lastDay; d++) + { + Array.Copy(dayValues, 0, values, d * 24, 24); + for (int h = 0; h < 24; h++) + { + set[d * 24 + h] = true; + } + } + + day = lastDay + 1; + } + + if (day != dayCount || Array.IndexOf(set, false) >= 0) + { + throw new FormatException("Schedule:Compact '" + result.Name + "' covers " + day + " of " + dayCount + " days"); + } + + result.Values = values; + result.AlignmentVerified = true; + result.AlignmentEvidence = string.Format(ci, "Schedule:Compact: {0} 'Through:' blocks from 01/01 to 12/31, each 'For: AllDays' with whole-hour 'Until:' labels ending 24:00 (EnergyPlus: 'Until: hh:00' ends the interval [previous, hh))", throughCount); + } + + private static void FixedInterval(IdfObject idfObject, int dayCount, NativeSchedule result) + { + string interpolate = idfObject.Value(4); + double interval = Number(idfObject.Value(5), "OS:Schedule:FixedInterval interval length"); + double month = Number(idfObject.Value(7), "OS:Schedule:FixedInterval start month"); + double startDay = Number(idfObject.Value(8), "OS:Schedule:FixedInterval start day"); + if (interval != 60 || month != 1 || startDay != 1 || !string.Equals(interpolate, "No", StringComparison.OrdinalIgnoreCase)) + { + throw new FormatException(string.Format(ci, "OS:Schedule:FixedInterval '{0}' is not hourly from 1 January without interpolation (interval {1}, start {2}/{3}, interpolate '{4}')", result.Name, interval, month, startDay, interpolate)); + } + + int count = idfObject.Fields.Count - 9; + if (count != dayCount * 24) + { + throw new FormatException("OS:Schedule:FixedInterval '" + result.Name + "' has " + count + " values for a " + dayCount + "-day year"); + } + + double[] values = new double[count]; + for (int i = 0; i < count; i++) + { + values[i] = Number(idfObject.Value(9 + i), "OS:Schedule:FixedInterval '" + result.Name + "' value " + (i + 1)); + } + + result.Values = values; + result.AlignmentVerified = true; + result.AlignmentEvidence = "OS:Schedule:FixedInterval: 60-minute values from 1 January, interpolation off (value k covers hour k-1)"; + } + + private static int DayOfYear(string date, int dayCount, string name) + { + string[] parts = date.Split('/'); + if (parts.Length != 2 || !int.TryParse(parts[0], NumberStyles.Integer, ci, out int month) || !int.TryParse(parts[1], NumberStyles.Integer, ci, out int day)) + { + throw new FormatException("Schedule:Compact '" + name + "': unreadable date '" + date + "'"); + } + + DateTime start = new DateTime(dayCount == 366 ? 2004 : 2006, 1, 1); + try + { + return (new DateTime(start.Year, month, day) - start).Days; + } + catch (ArgumentOutOfRangeException) + { + throw new FormatException("Schedule:Compact '" + name + "': invalid date '" + date + "'"); + } + } + + private static int Hour(string time, string name) + { + string[] parts = time.Split(':'); + if (parts.Length != 2 || !int.TryParse(parts[0], NumberStyles.Integer, ci, out int hour) || parts[1] != "00" || hour < 1 || hour > 24) + { + throw new FormatException("Schedule:Compact '" + name + "': 'Until: " + time + "' is not a whole hour"); + } + + return hour; + } + + private static double Number(string text, string what) + { + if (string.IsNullOrWhiteSpace(text) || !double.TryParse(text, NumberStyles.Float, ci, out double value) || double.IsNaN(value) || double.IsInfinity(value)) + { + throw new FormatException(what + " is not a finite number: '" + text + "'"); + } + + return value; + } + + private static double[] Fill(int count, double value) + { + double[] result = new double[count]; + for (int i = 0; i < count; i++) + { + result[i] = value; + } + + return result; + } + } +} diff --git a/benchmark/SAM.Analytical.OpenStudio.InputReadBack/Pack-S09-Evidence.ps1 b/benchmark/SAM.Analytical.OpenStudio.InputReadBack/Pack-S09-Evidence.ps1 new file mode 100644 index 0000000..5fa758e --- /dev/null +++ b/benchmark/SAM.Analytical.OpenStudio.InputReadBack/Pack-S09-Evidence.ps1 @@ -0,0 +1,53 @@ +# SPDX-License-Identifier: LGPL-3.0-or-later +# Copyright (c) 2020-2026 Michal Dengusiak & Jakub Ziolkowski and contributors + +<# +.SYNOPSIS + Copies the minimal, sanitized S09 acceptance evidence from a machine-local run root into the repository. + +.DESCRIPTION + Per run: export.json (paths reduced to file names), compare-approved\report.json and report.txt, and + compare-provisional\report.txt. Per negative: report.txt (its report.json stays machine-local). Plus the summary + files. Native files (OSM, IDF, native.json) and console logs stay machine-local; their hashes are in export.json and + report.json. +#> +param( + [string]$Root = 'C:\TasOut\s09\acc1', + [string]$Target = (Join-Path $PSScriptRoot '..\..\documentation\S09-OpenStudio-InputReadBack-evidence') +) + +$ErrorActionPreference = 'Stop' +$rootFull = (Resolve-Path $Root).Path.TrimEnd('\') +$Target = [System.IO.Path]::GetFullPath($Target) +New-Item -ItemType Directory -Force -Path $Target | Out-Null + +function Copy-Sanitized([string]$Source, [string]$Destination) { + if (-not (Test-Path $Source)) { return } + New-Item -ItemType Directory -Force -Path (Split-Path $Destination) | Out-Null + $text = Get-Content -LiteralPath $Source -Raw + foreach ($form in @($rootFull, $rootFull.Replace('\', '/'), $rootFull.Replace('\', '\\'))) { $text = $text.Replace($form, '') } + $text = [regex]::Replace($text, '[A-Za-z]:(\\\\|\\|/)[^"\r\n]*?(\\\\|\\|/)(?=[^\\/"\r\n]+")', '/') + [System.IO.File]::WriteAllText($Destination, $text, (New-Object System.Text.UTF8Encoding($false))) +} + +foreach ($run in Get-ChildItem -Directory $rootFull | Where-Object { Test-Path (Join-Path $_.FullName 'export.json') }) { + $out = Join-Path $Target "runs\$($run.Name)" + Copy-Sanitized (Join-Path $run.FullName 'export.json') (Join-Path $out 'export.json') + Copy-Sanitized (Join-Path $run.FullName 'compare-approved\report.json') (Join-Path $out 'report-approved.json') + Copy-Sanitized (Join-Path $run.FullName 'compare-approved\report.txt') (Join-Path $out 'report-approved.txt') + Copy-Sanitized (Join-Path $run.FullName 'compare-provisional\report.txt') (Join-Path $out 'report-provisional.txt') +} + +$negatives = Join-Path $rootFull 'negatives' +if (Test-Path $negatives) { + foreach ($case in Get-ChildItem -Directory $negatives) { + $out = Join-Path $Target "negatives\$($case.Name)" + Copy-Sanitized (Join-Path $case.FullName 'compare-approved\report.txt') (Join-Path $out 'report-approved.txt') + } +} + +foreach ($summary in Get-ChildItem -File $rootFull -Filter 'summary-*.json') { + Copy-Sanitized $summary.FullName (Join-Path $Target $summary.Name) +} + +Write-Host "evidence packed into $Target" diff --git a/benchmark/SAM.Analytical.OpenStudio.InputReadBack/Report/OsReport.cs b/benchmark/SAM.Analytical.OpenStudio.InputReadBack/Report/OsReport.cs new file mode 100644 index 0000000..4a23360 --- /dev/null +++ b/benchmark/SAM.Analytical.OpenStudio.InputReadBack/Report/OsReport.cs @@ -0,0 +1,195 @@ +// SPDX-License-Identifier: LGPL-3.0-or-later +// Copyright (c) 2020–2026 Michal Dengusiak & Jakub Ziolkowski and contributors + +using SAM.Analytical.InputEquivalence; +using System; +using System.Collections.Generic; +using System.Globalization; +using System.IO; +using System.Linq; +using System.Text; +using System.Text.Json; + +namespace SAM.Analytical.OpenStudio.InputReadBack +{ + /// One gating result that is not PASS, as reported. + public sealed class ReportItem + { + public string Quantity { get; set; } + public string Key { get; set; } + public string Outcome { get; set; } + public string Status { get; set; } + public string Reason { get; set; } + } + + /// + /// The S07 §5.2 (amendment U1) OUT-OF-ENGINE-SCOPE rows of a fixture: informational, never gating, each with both values, + /// the difference and the scope reason. counts the rows outside the row-3a tolerance (the pre-U1 + /// single-sided differences), the rows whose values agree. + /// + public sealed class OutOfEngineScopeSummary + { + public string Amendment { get; set; } + public int Count { get; set; } + public int Differing { get; set; } + public int Equal { get; set; } + public Dictionary CountByScope { get; set; } + public Dictionary CountByProperty { get; set; } + public List Rows { get; set; } + } + + /// + /// report.json (schema s09-readback-report/3; /2 added Unsupported, /3 adds OUT-OF-ENGINE-SCOPE): the fixture verdict and + /// everything that decided it. counts every result once, an S07 §5.2 row as OutOfEngineScope + /// (never as its numeric MATCH or OUT-OF-TOLERANCE); holds only gating results. + /// + public sealed class OsReport + { + public string Schema { get; set; } = "s09-readback-report/3"; + public string FixtureId { get; set; } + public string RuleSet { get; set; } + public string Status { get; set; } + public int ExitCode { get; set; } + public string GateStatus { get; set; } + public string Coverage { get; set; } + public int Required { get; set; } + public int Results { get; set; } + public List MissingComparisons { get; set; } + public Dictionary CountByOutcome { get; set; } + public List NonPass { get; set; } + + /// The gating results that are not PASS (the count of ). An informational row is never one. + public int GatedNonPass { get; set; } + + public OutOfEngineScopeSummary OutOfEngineScope { get; set; } + public List OwnerDecisionsNamed { get; set; } + public List TechnicalBlockersNamed { get; set; } + public List Consistency { get; set; } + public List Unsupported { get; set; } + public List FixtureCriteria { get; set; } + public Dictionary VentilationStates { get; set; } + public List Series { get; set; } + public List Supporting { get; set; } + public Dictionary Inputs { get; set; } + + public static OsReport From(OsComparison comparison, Dictionary inputs) + { + GateReport gate = comparison.Gate; + return new OsReport + { + FixtureId = comparison.FixtureId, + RuleSet = comparison.RuleSet.ToString(), + Status = comparison.Status.ToString(), + ExitCode = ReadBackExit.Of(comparison.Status), + GateStatus = gate.Status.ToString(), + Coverage = gate.Coverage.ToString(), + Required = comparison.Required.Count, + Results = comparison.Results.Count, + MissingComparisons = gate.MissingComparisons.Select(x => x.ToString()).ToList(), + CountByOutcome = comparison.Results.GroupBy(comparison.ReportedOutcome).OrderBy(x => x.Key, StringComparer.Ordinal).ToDictionary(x => x.Key, x => x.Count()), + NonPass = gate.NonPass.Select(x => new ReportItem { Quantity = x.Definition?.Id, Key = x.Input.ObjectKey, Outcome = x.Outcome.ToString(), Status = x.Status.ToString(), Reason = x.Reason }).ToList(), + GatedNonPass = gate.NonPass.Count, + OutOfEngineScope = new OutOfEngineScopeSummary + { + Amendment = OsComparison.OpaqueFaceScope, + Count = comparison.OutOfEngineScope.Count, + Differing = comparison.OutOfEngineScope.Count(x => x.Differs), + Equal = comparison.OutOfEngineScope.Count(x => !x.Differs), + CountByScope = comparison.OutOfEngineScope.GroupBy(x => Scope(x.ScopeReason)).OrderBy(x => x.Key, StringComparer.Ordinal).ToDictionary(x => x.Key, x => x.Count()), + CountByProperty = comparison.OutOfEngineScope.GroupBy(x => x.Property).OrderBy(x => x.Key, StringComparer.Ordinal).ToDictionary(x => x.Key, x => x.Count()), + Rows = comparison.OutOfEngineScope.ToList() + }, + OwnerDecisionsNamed = gate.OwnerDecisionsNamed.ToList(), + TechnicalBlockersNamed = gate.TechnicalBlockersNamed.ToList(), + Consistency = comparison.Consistency, + Unsupported = comparison.Unsupported, + FixtureCriteria = comparison.FixtureCriteria, + VentilationStates = comparison.VentilationStates, + Series = comparison.Series, + Supporting = comparison.Supporting, + Inputs = inputs + }; + } + + /// The scope of a reason: its text before the parenthesised detail. + private static string Scope(string reason) + { + int detail = reason?.IndexOf(" (", StringComparison.Ordinal) ?? -1; + return detail > 0 ? reason.Substring(0, detail) : reason; + } + + public void Save(string directory) + { + Directory.CreateDirectory(directory); + File.WriteAllText(Path.Combine(directory, "report.json"), JsonSerializer.Serialize(this, Json.Options)); + File.WriteAllText(Path.Combine(directory, "report.txt"), Text()); + } + + public static OsReport Load(string path) + { + return JsonSerializer.Deserialize(File.ReadAllText(path), Json.Options); + } + + public string Text() + { + StringBuilder text = new StringBuilder(); + text.AppendLine(string.Format(CultureInfo.InvariantCulture, "S09 OpenStudio read-back: {0} -> {1} (exit {2}); rule set {3}; gate {4}; coverage {5} ({6} required, {7} results); gated non-PASS {8}; out-of-engine-scope {9} (informational, not gated)", FixtureId, Status, ExitCode, RuleSet, GateStatus, Coverage, Required, Results, GatedNonPass, OutOfEngineScope?.Count ?? 0)); + text.AppendLine("outcomes: " + string.Join(", ", CountByOutcome.Select(x => x.Key + " " + x.Value))); + foreach (KeyValuePair state in VentilationStates) + { + text.AppendLine("D-F2 " + state.Key + ": " + state.Value); + } + + foreach (string item in Consistency) + { + text.AppendLine("CONSISTENCY FAIL: " + item); + } + + foreach (string item in Unsupported ?? new List()) + { + text.AppendLine("UNSUPPORTED (blocked technical): " + item); + } + + foreach (string item in FixtureCriteria) + { + text.AppendLine("D-FIX: " + item); + } + + foreach (IGrouping group in NonPass.GroupBy(x => x.Outcome + " / " + x.Status).OrderBy(x => x.Key)) + { + text.AppendLine("NOT PASS " + group.Key + ": " + group.Count()); + foreach (ReportItem item in group.Take(12)) + { + text.AppendLine(" " + item.Quantity + " " + item.Key + ": " + item.Reason); + } + + if (group.Count() > 12) + { + text.AppendLine(" ... " + (group.Count() - 12) + " more in report.json"); + } + } + + if (OutOfEngineScope != null && OutOfEngineScope.Count > 0) + { + text.AppendLine(string.Format(CultureInfo.InvariantCulture, "OUT-OF-ENGINE-SCOPE (informational, not gated; {0}): {1} row(s), {2} differing, {3} equal; by scope: {4}; by property: {5}", OutOfEngineScope.Amendment, OutOfEngineScope.Count, OutOfEngineScope.Differing, OutOfEngineScope.Equal, + string.Join(", ", OutOfEngineScope.CountByScope.Select(x => x.Key + " " + x.Value)), string.Join(", ", OutOfEngineScope.CountByProperty.Select(x => x.Key + " " + x.Value)))); + foreach (OutOfEngineScopeRow row in OutOfEngineScope.Rows.Take(12)) + { + text.AppendLine(string.Format(CultureInfo.InvariantCulture, " {0} {1}: SAM {2:R}, native {3:R}, |d| {4:R} ({5}); {6}; SAM '{7}', native '{8}'", row.Quantity, row.Key, row.SamValue, row.NativeValue, row.Delta, row.NumericVerdict, row.ScopeReason, row.SamMaterial, row.NativeObject)); + } + + if (OutOfEngineScope.Rows.Count > 12) + { + text.AppendLine(" ... " + (OutOfEngineScope.Rows.Count - 12) + " more in report.json"); + } + } + + foreach (string missing in MissingComparisons) + { + text.AppendLine("MISSING: " + missing); + } + + return text.ToString(); + } + } +} diff --git a/benchmark/SAM.Analytical.OpenStudio.InputReadBack/Run-S09-ReadBack.ps1 b/benchmark/SAM.Analytical.OpenStudio.InputReadBack/Run-S09-ReadBack.ps1 new file mode 100644 index 0000000..1b35b91 --- /dev/null +++ b/benchmark/SAM.Analytical.OpenStudio.InputReadBack/Run-S09-ReadBack.ps1 @@ -0,0 +1,126 @@ +# SPDX-License-Identifier: LGPL-3.0-or-later +# Copyright (c) 2020-2026 Michal Dengusiak & Jakub Ziolkowski and contributors + +<# +.SYNOPSIS + S09 OpenStudio native-input read-back acceptance (no simulation, no CLI, no Tas). + +.DESCRIPTION + -Phase acceptance: checks the S08 signed-off fixture hashes (Fixtures\SHA256SUMS.txt) and the Budapest EPW hash first, + then for s08-fix-box, s08-fix-two and a repeat of s08-fix-box: export (writer + SDK translation), read (a fresh + process), compare under the approved rules (the verdict) and the provisional rules (baseline). + -Phase acceptance-negative: every targeted mutation on a disposable copy of an acceptance run; each must FAIL (exit 10). + Writes summary.json under -Root. Raw files stay under -Root (machine-local). +#> +param( + [ValidateSet('acceptance', 'acceptance-negative')] + [string]$Phase = 'acceptance', + [string]$Root = 'C:\TasOut\s09\acc1', + [Parameter(Mandatory = $true)][string]$WeatherEpw, + [string]$WeatherEpwSha256 = '472ffb4e2f10867600949a392ce46891fc1bd05f2fc8d8917a99bca7d26209c3', + [string]$Exe = (Join-Path $PSScriptRoot '..\SAM.Analytical.OpenStudio.InputReadBack.Cli\bin\x64\Release\net8.0\os-input-readback.exe') +) + +$ErrorActionPreference = 'Stop' +$Exe = (Resolve-Path $Exe).Path +$fixtures = Join-Path $PSScriptRoot 'Fixtures' + +function Invoke-Step([string[]]$Arguments, [string]$Log) { + & $Exe @Arguments *>> $Log + return $LASTEXITCODE +} + +function Get-Sha256([string]$Path) { (Get-FileHash -Algorithm SHA256 -LiteralPath $Path).Hash.ToLowerInvariant() } + +$summary = [ordered]@{ + phase = $Phase + started = (Get-Date).ToUniversalTime().ToString('o') + harnessDll = Get-Sha256 ($Exe -replace '\.exe$', '.dll') + runs = @() +} + +if ($Phase -eq 'acceptance') { + if (Test-Path $Root) { throw "Root must be new: $Root" } + New-Item -ItemType Directory -Path $Root | Out-Null + + foreach ($line in Get-Content (Join-Path $fixtures 'SHA256SUMS.txt')) { + if ([string]::IsNullOrWhiteSpace($line)) { continue } + $hash, $name = $line -split '\s+', 2 + $actual = Get-Sha256 (Join-Path $fixtures $name.Trim()) + if ($actual -ne $hash.ToLowerInvariant()) { throw "Fixture $name hash $actual is not the signed-off $hash" } + $summary["fixture:$($name.Trim())"] = $actual + } + + $epwHash = Get-Sha256 $WeatherEpw + if ($epwHash -ne $WeatherEpwSha256) { throw "EPW hash $epwHash is not $WeatherEpwSha256" } + $summary.epw = $epwHash + + foreach ($run in @(@('s08-fix-box', 'box'), @('s08-fix-two', 'two'), @('s08-fix-box', 'box-repeat'))) { + $fixtureId, $label = $run + $dir = Join-Path $Root $label + $log = Join-Path $Root "$label.console.txt" + $export = Invoke-Step @('export', '--model', (Join-Path $fixtures "$fixtureId.json"), '--epw', $WeatherEpw, '--out', $dir, '--label', $label) $log + if ($export -ne 0) { throw "export $label exit $export" } + $read = Invoke-Step @('read', '--run', $dir) $log + if ($read -ne 0) { throw "read $label exit $read" } + $approved = Invoke-Step @('compare', '--run', $dir, '--fixture-id', $fixtureId, '--rule-set', 'approved', '--out', (Join-Path $dir 'compare-approved')) $log + $provisional = Invoke-Step @('compare', '--run', $dir, '--fixture-id', $fixtureId, '--rule-set', 'provisional', '--out', (Join-Path $dir 'compare-provisional')) $log + $report = Get-Content (Join-Path $dir 'compare-approved\report.json') -Raw | ConvertFrom-Json + $summary.runs += [ordered]@{ label = $label; fixture = $fixtureId; approvedExit = $approved; provisionalExit = $provisional; status = $report.Status; coverage = $report.Coverage; required = $report.Required; results = $report.Results } + Write-Host ("{0,-12} approved exit {1} ({2}, coverage {3}, {4}/{5}); provisional exit {6}" -f $label, $approved, $report.Status, $report.Coverage, $report.Results, $report.Required, $provisional) + } + + # Control: the repeat export of the box must give byte-identical native files. + foreach ($file in @('model.osm', 'in.idf')) { + $a = Get-Sha256 (Join-Path $Root "box\$file") + $b = Get-Sha256 (Join-Path $Root "box-repeat\$file") + $summary["repeat:$file"] = if ($a -eq $b) { 'identical' } else { "DIFFERENT $a $b" } + } +} +else { + $cases = @( + @('neg-identity-swap-names', 'two', 's08-fix-two'), + @('neg-schedule-swap', 'box', 's08-fix-box'), + @('neg-v1-unscheduled', 'two', 's08-fix-two'), + @('neg-missing-dsoa-link', 'box', 's08-fix-box'), + @('neg-missing-schedule-object', 'box', 's08-fix-box'), + @('neg-people-density', 'box', 's08-fix-box'), + @('neg-layer-conductivity', 'two', 's08-fix-two'), + @('neg-osm-dsoa-schedule', 'box', 's08-fix-box'), + @('neg-zone-multiplier', 'box', 's08-fix-box'), + @('neg-window-multiplier', 'box', 's08-fix-box'), + @('neg-north-axis', 'box', 's08-fix-box'), + @('neg-zone-multiplier-both', 'box', 's08-fix-box'), + @('neg-window-multiplier-both', 'box', 's08-fix-box'), + @('neg-north-axis-both', 'box', 's08-fix-box'), + @('neg-osm-missing-thermal-zone', 'two', 's08-fix-two'), + @('neg-osm-missing-subsurfaces', 'box', 's08-fix-box'), + @('neg-lighting-previous-mapping', 'box', 's08-fix-box'), + @('neg-lighting-visible-zero', 'box', 's08-fix-box'), + @('neg-lighting-radiant-is-p', 'two', 's08-fix-two'), + @('neg-lighting-return-air', 'box', 's08-fix-box'), + @('neg-lighting-swapped', 'two', 's08-fix-two') + ) + $before = @{} + foreach ($source in @('box', 'two')) { $before[$source] = Get-Sha256 (Join-Path $Root "$source\in.idf") } + + foreach ($case in $cases) { + $caseId, $source, $fixtureId = $case + $dir = Join-Path $Root "negatives\$caseId" + $log = Join-Path $Root "negatives\$caseId.console.txt" + New-Item -ItemType Directory -Force -Path (Split-Path $dir) | Out-Null + if ((Invoke-Step @('negative', '--run', (Join-Path $Root $source), '--case', $caseId, '--out', $dir) $log) -ne 0) { throw "negative $caseId" } + if ((Invoke-Step @('read', '--run', $dir) $log) -ne 0) { throw "read $caseId" } + $exit = Invoke-Step @('compare', '--run', $dir, '--fixture-id', $fixtureId, '--rule-set', 'approved', '--out', (Join-Path $dir 'compare-approved')) $log + $report = Get-Content (Join-Path $dir 'compare-approved\report.json') -Raw | ConvertFrom-Json + $summary.runs += [ordered]@{ label = $caseId; fixture = $fixtureId; approvedExit = $exit; status = $report.Status; mutation = $report.Inputs.mutation; required = 10 } + Write-Host ("{0,-28} exit {1} ({2}) {3}" -f $caseId, $exit, $report.Status, ($(if ($exit -eq 10) { 'FAIL as required' } else { 'NOT REFUSED' }))) + } + + foreach ($source in @('box', 'two')) { + $summary["original-unchanged:$source"] = (Get-Sha256 (Join-Path $Root "$source\in.idf")) -eq $before[$source] + } +} + +$summary.finished = (Get-Date).ToUniversalTime().ToString('o') +$summary | ConvertTo-Json -Depth 5 | Set-Content -Encoding utf8 (Join-Path $Root "summary-$Phase.json") diff --git a/benchmark/SAM.Analytical.OpenStudio.InputReadBack/SAM.Analytical.OpenStudio.InputReadBack.csproj b/benchmark/SAM.Analytical.OpenStudio.InputReadBack/SAM.Analytical.OpenStudio.InputReadBack.csproj new file mode 100644 index 0000000..54bb45b --- /dev/null +++ b/benchmark/SAM.Analytical.OpenStudio.InputReadBack/SAM.Analytical.OpenStudio.InputReadBack.csproj @@ -0,0 +1,59 @@ + + + + Library + net8.0 + SAM.Analytical.OpenStudio.InputReadBack + false + x64 + x64 + x64 + latest + disable + disable + + + + + + + + + + + + + + + ..\..\..\SAM\build\SAM.Core.dll + + + ..\..\..\SAM\build\SAM.Geometry.dll + + + ..\..\..\SAM\build\SAM.Analytical.dll + + + ..\..\..\SAM\build\SAM.Architectural.dll + + + ..\..\..\SAM\build\SAM.Weather.dll + + + + + + + + diff --git a/docs/SAM_OPENSTUDIO_ANALYTICAL_COVERAGE.md b/docs/SAM_OPENSTUDIO_ANALYTICAL_COVERAGE.md index b35580a..10522cb 100644 --- a/docs/SAM_OPENSTUDIO_ANALYTICAL_COVERAGE.md +++ b/docs/SAM_OPENSTUDIO_ANALYTICAL_COVERAGE.md @@ -102,12 +102,12 @@ diagnostic code and/or note recorded in the manifest. | `InternalConditionParameter.SupplyAirFlow` | m3/s | OS:DesignSpecification:OutdoorAir Outdoor Air Flow Rate (method Sum) | Native | C2 | SpaceParameter.OutsideSupplyAirFlow takes precedence when present (space override). | | `InternalConditionParameter.ExhaustAirFlow` | m3/s | - | Deferred | C2 | SAM-OS-HVAC-001 info | | `InternalConditionParameter.VentilationProfileName` | - | OS:DesignSpecification:OutdoorAir Outdoor Air Schedule | Native | C2 | SAM-OS-SCH-001 error when named but unresolved | -| `InternalConditionParameter.LightingRadiantProportion` | 0-1 | OS:Lights:Definition Fraction Radiant | Native | MVP | Documented default 0.32 when absent. | +| `InternalConditionParameter.LightingRadiantProportion` | 0-1 | OS:Lights:Definition Fraction Radiant + Fraction Visible (Return Air Fraction 0) | Derived | MVP | SAM S07 §5.1 T-LIGHT-SPLIT: p is the total radiant share; Fraction Visible = p·s, Fraction Radiant = p·(1 − s), convective 1 − p, s = 0.2415 / 0.576. Authored p, including 0, is preserved. Absent or NaN p → common default p₀ = 0.576 (suspended LED office reference category; suitability outside it is owner decision OD-L1). SAM-OS-IC-002 info (Summary) states the values, s, the category and its limits. | | `InternalConditionParameter.OccupancyRadiantProportion` | 0-1 | OS:People:Definition Fraction Radiant | Native | MVP | Documented default 0.3 when absent. | | `InternalConditionParameter.EquipmentRadiantProportion` | 0-1 | OS:ElectricEquipment:Definition Fraction Radiant | Native | MVP | Documented default 0 when absent. | -| `InternalConditionParameter.LightingViewCoefficient` | 0-1 | OS:Lights:Definition Fraction Visible | Approximated | MVP | TAS view coefficient mapped to EnergyPlus visible fraction; documented default 0.25 when absent. | -| `InternalConditionParameter.OccupancyViewCoefficient` | 0-1 | - | Unsupported | C2 | SAM-OS-IC-001 info; OS:People has no visible-fraction field | -| `InternalConditionParameter.EquipmentViewCoefficient` | 0-1 | - | Unsupported | C2 | SAM-OS-IC-001 info; OS:ElectricEquipment has no visible-fraction field | +| `InternalConditionParameter.LightingViewCoefficient` | 0-1 | - | Unsupported | C2 | SAM-OS-IC-001 info; a TAS comfort (mean radiant and resultant temperature) coefficient, not an energy fraction; OS:Lights has no input for it (SAM S07 §5.1). It no longer sets Fraction Visible. | +| `InternalConditionParameter.OccupancyViewCoefficient` | 0-1 | - | Unsupported | C2 | SAM-OS-IC-001 info; a TAS comfort coefficient, not an energy fraction; OS:People has no input for it | +| `InternalConditionParameter.EquipmentViewCoefficient` | 0-1 | - | Unsupported | C2 | SAM-OS-IC-001 info; a TAS comfort coefficient, not an energy fraction; OS:ElectricEquipment has no input for it | | `InternalConditionParameter.LightingControlFunction` | - | - | Unsupported | C2 | SAM-OS-IC-001 info; TAS control function string has no deterministic daylighting-control mapping | | `InternalConditionParameter.VentilationFunction` | - | - | Unsupported | C2 | SAM-OS-IC-001 info; TAS function expression | | `InternalConditionParameter.VentilationFunctionFactor` | - | - | Unsupported | C2 | SAM-OS-IC-001 info | @@ -338,9 +338,9 @@ diagnostic code and/or note recorded in the manifest. | `OpaqueMaterialParameter.ExternalLightReflectance` | 0-1 | OS:Material Visible Absorptance = 1 - reflectance | Native | MVP | - | | `OpaqueMaterialParameter.ExternalSolarReflectance` | 0-1 | OS:Material Solar Absorptance = 1 - reflectance | Native | MVP | - | | `OpaqueMaterialParameter.IgnoreThermalTransmittanceCalculations` | - | - | NA | C0 | TAS calculation flag. | -| `OpaqueMaterialParameter.InternalEmissivity` | 0-1 | same single-sided OS:Material fields as External* | Approximated | C3 | SAM-OS-MAT-002 info when Internal differs from External; EnergyPlus opaque materials are single-sided | -| `OpaqueMaterialParameter.InternalLightReflectance` | 0-1 | single-sided OS:Material | Approximated | C3 | - | -| `OpaqueMaterialParameter.InternalSolarReflectance` | 0-1 | single-sided OS:Material | Approximated | C3 | - | +| `OpaqueMaterialParameter.InternalEmissivity` | 0-1 | OS:Material Thermal Absorptance of the zone-face (_Internal) variant of SAM's first layer | Derived | C3 | SAM's first (innermost) opaque layer is the zone face of the first space and of every single-sided surface; when its Internal* optics differ from External*, an internal-face variant carries them in both construction directions. SAM-OS-MAT-003 error for a single-layer outdoor or interzone construction whose faces differ; SAM-OS-MAT-004 info (Summary) when an unstated Internal* takes the External* value on a zone face; SAM-OS-MAT-002 info for an opaque door pane (external values govern both faces) | +| `OpaqueMaterialParameter.InternalLightReflectance` | 0-1 | OS:Material Visible Absorptance = 1 - reflectance of the zone-face (_Internal) variant | Derived | C3 | as InternalEmissivity; unstated (absent or NaN) Internal* takes the External* value on a zone face: SAM-OS-MAT-004 info at Summary | +| `OpaqueMaterialParameter.InternalSolarReflectance` | 0-1 | OS:Material Solar Absorptance = 1 - reflectance of the zone-face (_Internal) variant | Derived | C3 | as InternalEmissivity; unstated (absent or NaN) Internal* takes the External* value on a zone face: SAM-OS-MAT-004 info at Summary | ### Transparent material parameters (`SAM.Analytical.TransparentMaterialParameter`) @@ -511,7 +511,7 @@ that behavioural semantics — not just parameter slots — are classified. ## Counts at C0 (before implementation) -Generated from the manifest: 293 entries — Native 135, Derived 28, Approximated 21, +Generated from the manifest: 293 entries — Native 135, Derived 31, Approximated 18, Unsupported 24, Deferred 20, NA 65. Milestones: MVP 90, C1 3, C2 37, C3 23, C4 26, C5 36, classification-only (C0) 78. diff --git a/docs/SAM_OPENSTUDIO_INTERNAL_CONDITION_MAPPING.md b/docs/SAM_OPENSTUDIO_INTERNAL_CONDITION_MAPPING.md index d76cab7..463ab80 100644 --- a/docs/SAM_OPENSTUDIO_INTERNAL_CONDITION_MAPPING.md +++ b/docs/SAM_OPENSTUDIO_INTERNAL_CONDITION_MAPPING.md @@ -34,8 +34,8 @@ by assigning loads directly to spaces in later work. | People sensible fraction | `OccupancySensibleGainPerPerson` and `OccupancyLatentGainPerPerson` [W/person] | `PeopleDefinition.SensibleHeatFraction` | sensible/(sensible+latent) | either missing → EnergyPlus autocalculate | | Lighting density | `Analytical.Query.CalculatedLightingGain(space)` [W] ÷ `SpaceParameter.Area` [m²] | `LightsDefinition.WattsperSpaceFloorArea` | direct [W/m²] | ≤ 0/NaN → no Lights objects | | Lighting schedule | `LightingProfileName` | `Lights.Schedule` | fraction schedule | gains without profile → **error** SAM-OS-SCH-001 | -| Lighting radiant fraction | `LightingRadiantProportion` | `LightsDefinition.FractionRadiant` | direct | missing → 0.32 (LadybugTools parity) | -| Lighting visible fraction | `LightingViewCoefficient` | `LightsDefinition.FractionVisible` | direct | missing → 0.25 (LadybugTools parity) | +| Lighting radiant split (SAM S07 §5.1, T-LIGHT-SPLIT) | `LightingRadiantProportion` p: the total radiant share (long-wave plus short-wave) of the lighting gain entering the room | `LightsDefinition.FractionRadiant` = p·(1 − s), `LightsDefinition.FractionVisible` = p·s, `ReturnAirFraction` unset (0); convective 1 − p, as Tas | s = 0.2415 / 0.576 at full precision: a declared short-wave share for suspended (pendant) LED office lighting, not SAM data; information SAM-OS-IC-002 (Summary) states the values, s, the category and its limits | authored p, including 0, preserved; missing or NaN → p₀ = 0.576 (Fraction Radiant 0.3345, Fraction Visible 0.2415), information SAM-OS-IC-002 naming the reference category, its limits and the open owner decision OD-L1 | +| Lighting view coefficient | `LightingViewCoefficient` | — | **not converted**: a TAS comfort (mean radiant and resultant temperature) coefficient, not an energy fraction; never used for `FractionVisible` | information SAM-OS-IC-001 when present | | Equipment density | `Analytical.Query.CalculatedEquipmentSensibleGain(space)` [W] ÷ area | `ElectricEquipmentDefinition.WattsperSpaceFloorArea` | direct [W/m²] | ≤ 0/NaN → no equipment objects | | Equipment schedule | `EquipmentSensibleProfileName` | `ElectricEquipment.Schedule` | fraction schedule | gains without profile → **error** SAM-OS-SCH-001 | | Equipment radiant fraction | `EquipmentRadiantProportion` | `ElectricEquipmentDefinition.FractionRadiant` | direct | missing → 0 (LadybugTools parity) | @@ -43,9 +43,10 @@ by assigning loads directly to spaces in later work. | Infiltration (ACH, C2) | `InternalConditionParameter.InfiltrationAirChangesPerHour` [1/h] | `SpaceInfiltrationDesignFlowRate.AirChangesperHour` | direct | ACH present → native basis; ≤ 0/NaN → fallback below | | Infiltration (fallback) | `Analytical.Query.CalculatedInfiltrationAirFlow(space)` [m³/s] ÷ Σ areas of sun-exposed panels (`AdjacencyCluster.ExposedToSun`) | `SpaceInfiltrationDesignFlowRate.FlowperExteriorSurfaceArea` [m³/s·m²] | LadybugTools formula parity | ≤ 0/NaN → no infiltration object | | Infiltration schedule | `InfiltrationProfileName` | `SpaceInfiltrationDesignFlowRate.Schedule` | fraction schedule | flow without profile → **error** SAM-OS-SCH-001 | -| Outdoor air (C2) | `SupplyAirFlowPerPerson` [m³/s·p], `SupplyAirFlowPerArea` [m³/s·m²], `SupplyAirChangesPerHour` [1/h], `SupplyAirFlow` [m³/s] | SpaceType `DesignSpecificationOutdoorAir`, method **Sum** | direct | all ≤ 0/NaN → no SpaceType DSOA | -| Outdoor-air schedule (C2) | `VentilationProfileName` | `DesignSpecificationOutdoorAir.OutdoorAirFlowRateFractionSchedule` | fraction schedule | named but unresolved → **error** SAM-OS-SCH-001; unnamed → unscheduled (fraction 1) | -| Outdoor air (space override) | `SpaceParameter.OutsideSupplyAirFlow` [m³/s] (absolute) | per-space `DesignSpecificationOutdoorAir.OutdoorAirFlowRate` | direct; takes precedence over the SpaceType DSOA (EnergyPlus space-over-type rule) | missing/≤0 → SpaceType DSOA governs | +| Outdoor air (C2) | `SupplyAirFlowPerPerson` [m³/s·p], `SupplyAirFlowPerArea` [m³/s·m²], `SupplyAirChangesPerHour` [1/h], `SupplyAirFlow` [m³/s] | SpaceType `DesignSpecificationOutdoorAir`, method **Sum** | direct: the **requirement** (S07 D-F2) | all ≤ 0/NaN → no SpaceType DSOA (V0) | +| Outdoor-air delivery (S09) | `VentilationProfileName` | `DesignSpecificationOutdoorAir.OutdoorAirFlowRateFractionSchedule` | the selected Ventilation profile is the **delivery** (V2) | not selected (V1) → `SAM_Schedule_VentilationNotDelivered`, all 0: requirement kept, no outdoor air delivered (information); selected but not a resolvable Ventilation profile (missing or another type) → **error** SAM-OS-SCH-001 and the same all-zero schedule. Never unscheduled. | +| Outdoor air (space override) | `SpaceParameter.OutsideSupplyAirFlow` [m³/s] (absolute) | per-space `DesignSpecificationOutdoorAir`: method Sum, `OutdoorAirFlowRate` only (other rates 0), fraction schedule by the delivery rule above | direct; takes precedence over the SpaceType DSOA (EnergyPlus space-over-type rule) | missing/≤0 → SpaceType DSOA governs | +| Ideal Loads outdoor-air controls (S09) | — | `ZoneHVACIdealLoadsAirSystem`: the space's effective DSOA (override, else inherited SpaceType), DCV `None`, `NoEconomizer`, heat recovery `None` | delivered outdoor air = DSOA (design occupancy) × fraction schedule | no DSOA → no outdoor air | | Humidity control (C2) | `HumidificationProfileName` / `DehumidificationProfileName` [%RH] | `ZoneControlHumidistat` humidifying/dehumidifying schedules (Percent limits 0–100) + Ideal Loads `Humidification/DehumidificationControlType = Humidistat` when the matching schedule exists | profile → schedule; SAM carries setpoint *profiles*, not numeric setpoints | named but unresolved → **error** SAM-OS-SCH-001; absent → no humidity control (EnergyPlus defaults) | | Pollutants | `PollutantGenerationPerPerson/PerArea`, `PollutantProfileName` | — | **unsupported** (generic contaminant modelling out of scope) | warning SAM-OS-IC-001 when present | | Heating/Cooling setpoints | `HeatingProfileName` / `CoolingProfileName` [°C] | thermostat schedules (M6); single-mode when only one profile exists (C2 — EnergyPlus SingleHeating/SingleCooling, no invented setpoints) | temperature schedules | both missing on a conditioned zone → **error** SAM-OS-HVAC-001 | diff --git a/docs/SAM_OPENSTUDIO_MATERIAL_MAPPING.md b/docs/SAM_OPENSTUDIO_MATERIAL_MAPPING.md index 2500e30..b4474dd 100644 --- a/docs/SAM_OPENSTUDIO_MATERIAL_MAPPING.md +++ b/docs/SAM_OPENSTUDIO_MATERIAL_MAPPING.md @@ -46,6 +46,108 @@ created per **(SAM material Guid, thickness)** pair. Validation ranges: conductivity > 0; density > 0; specific heat > 0; thickness > 0; absorptances within [0, 1] (out-of-range → error, no clamping). +### Opaque face optics (SAM_OpenStudio#33 revision 8) + +EnergyPlus opaque materials hold **one** absorptance set for both faces, and the heat balance +uses only the outermost layer's outside face (outdoor surfaces) and the innermost layer's +zone face. SAM stores layers inside → outside from the panel's first space in +`AdjacencyCluster.GetSpaces()` order (S07 section 1), so: + +| Face EnergyPlus uses | SAM layer | SAM face | +| --- | --- | --- | +| zone face, first space (and every single-sided surface) | first | `Internal*` | +| zone face, second space of an internal panel | last | `External*` | +| outside face of an outdoor surface | last | `External*` | + +- **Rule.** SAM's first layer of an opaque construction takes its `Internal*` optics; every + other layer takes its `External*` optics. Where a material's `Internal*` values differ + from `External*`, the first layer uses an internal-face variant: its own cache key + `(Guid, thickness, Internal)` and name suffix `_Internal`, thermally identical to the + external-face object. The face is chosen by SAM layer position, never by EnergyPlus position, so + forward and reverse constructions share the same objects and stay exact mirrors. +- **Inherited zone-face values.** An `Internal*` value SAM does not state (absent or NaN) on a + zone face takes the stated `External*` value. This is reported once per material as + **information SAM-OS-MAT-004 at Summary**; the written value is not stamped as authored, so + an import keeps the internal value unspecified. S07 lists no default for an internal face, + so S09 reports those zone-face rows as S-UNSPEC EXPORT-DEFECT, never as a match. +- **What S09 gates (S07 §5.2, amendment U1, from #33 revision 12).** S09 compares the faces in + the table above exactly. Every other face of an opaque layer (buried faces, and the outer + face of an interzone, ground or adiabatic side) holds a value EnergyPlus 25.1 does not use: + when both values are valid and the face's role is established independently of this + writer, the row is reported as OUT-OF-ENGINE-SCOPE (informational, not gated) with both + values. The writer itself is unchanged by this. +- **Single-layer constructions** (one layer is both faces): agreeing faces are written + normally; on the ground or an adiabatic boundary only the zone face is used, so the + internal values are written. On an outdoor or interzone surface (including a two-sided + panel whose pairing failed) differing faces are **error SAM-OS-MAT-003**: no construction + is assigned and the conversion is unsuccessful — no external, averaged or split-layer + substitute. The check runs per panel use, before any cached construction is reused. +- **Orientation.** The forward construction goes to the first space's side only. If that + side produced no surface the panel gets **error SAM-OS-ADJ-001** and no construction; the + sides are never swapped. +- **Opaque door panes** (opaque layers of a fenestration construction) are unchanged: the + external values govern both faces, SAM-OS-MAT-002 information when they differ. +- **Import identity.** Every opaque object written from a SAM opaque material carries, in + `OS:AdditionalProperties`, `SAM.MaterialGuid` (source material), `SAM.MaterialFace` + (`External`/`Internal`), each authored `SAM.Optic.` SAM states, and + `SAM.Written.ThermalAbsorptance` / `.SolarAbsorptance` / `.VisibleAbsorptance` (what was + actually written, including inherited values and OpenStudio defaults). + - **Unchanged objects** restore exactly the authored values on both faces; an unstated value + stays unstated (an unchanged OpenStudio default is not imported as SAM data). + - **Edited objects** (an absorptance differing from its written value) keep the edited value + on every SAM face the object supplies and report it (warning SAM-OSI-MAT-001), so an edit + of an unstated value is not lost on re-export. An `Internal` variant supplies the zone face; + an `External` object of a material whose authored faces differ supplies the external face + (the variant supplies the zone face). An `External` object of a material whose faces agree + is shared by every layer position, so its faces come from the constructions using it as an + outermost or innermost layer: in a SAM-written (forward) opaque construction the last layer + is the zone face and the first the outer face; the unstamped reverse construction mirrors + it; any other construction's exposed position supplies both faces. A single-layer use + therefore keeps the edit on both faces (no differing faces are invented); an object in no + exposed position keeps it on the external face and each stated internal one. + - **Merging.** All usable face and thickness objects of one source Guid become one SAM + material (its Guid restored from the object carrying `SAM.Guid`); construction layers keep + their own thicknesses. They merge only when thermal properties, authored optics and, per + face, each resolved value of the objects supplying it agree; otherwise a warning + (SAM-OSI-ID-001) names the conflict and each object is imported on its own. Matching is by + the explicit Guid, never by name. Each object is validated before a merged material is + returned for it: only a validated member of the group resolves to it. + - Malformed or inconsistent metadata is warned (SAM-OSI-ID-001 identity, SAM-OSI-MAT-001 + values) and the object is imported as its own material with its own thermal properties — + never merged with, or aliased to, a valid group of the same source Guid — and its single + native value on both faces. An object without the metadata (a third-party or older OSM) + imports silently as before. +- **Import layer order (since SAM_OpenStudio#33 revision 11).** An opaque layered construction + used by a planar surface is read innermost layer first (`ToSAM/Construction.cs`), so SAM's + first layer is the one facing the surface's zone. An interzone panel is built from, and first + related to, the side carrying the SAM-written forward construction (SAM type `Construction` + with a SAM Guid), also after a geometric-fallback pairing; without that stamp, from the first + surface visited. Spaces are added in an order that puts each forward side's space first, because the + writer takes a panel's first space from the cluster's space order. Export → import → export therefore + keeps every layer, thickness and used face. A panel whose building side is then second (a mixed or edited + model) is re-read from its partner surface (information SAM-OSI-APX-001). + - **Fail closed (error SAM-OSI-CON-002).** Every imported opaque surface panel is checked against its + native surfaces. The checks: + - its first space's surface holds the SAM layers innermost first and a second side their mirror; + - each native StandardOpaqueMaterial layer, on both sides and in each side's direction, has the + thickness, conductivity, density and specific heat of the SAM layer it became (merged source names + alone would hide, for example, a 20 mm object on one side of a 12.5 mm wall); + - the absorptances the writer would put on every face EnergyPlus uses equal the native ones. + + When one SAM panel cannot keep them, the import is unsuccessful (no model) instead of changing a layer + or a used face. Massless and air-gap layers keep their nominal-thickness import and are matched by + material only. + Fenestration (glazing, gas, opaque door panes), air boundaries, non-layered constructions and + constructions no planar surface uses keep OpenStudio's order. A construction also used by a + subsurface or shading surface is split into an innermost-first SAM construction for the + surfaces (SAM Guid restored) and one in OpenStudio's order for the other uses (own Guid; + SAM-OSI-APX-001 information). + - **Compatibility.** Every multi-layer opaque import now has the opposite SAM layer order to + imports made before revision 11 (U-value unchanged; layer positions, thermal-mass position + and exposed faces change, which is the correction). SAM models imported earlier keep their + reversed constructions; nothing identifies them, and no automatic migration is made. Re-import + the source OSM to correct such a model. + ## TransparentMaterial → OS:WindowMaterial:Glazing (StandardGlazing) EnergyPlus defines the glazing **Front side as "the side of the layer opposite the zone"** diff --git a/docs/SAM_OPENSTUDIO_TO_SAM_COVERAGE.md b/docs/SAM_OPENSTUDIO_TO_SAM_COVERAGE.md index 8b4320b..1cc22c3 100644 --- a/docs/SAM_OPENSTUDIO_TO_SAM_COVERAGE.md +++ b/docs/SAM_OPENSTUDIO_TO_SAM_COVERAGE.md @@ -27,13 +27,13 @@ independent: a concept can be Native one way and Unsupported the other. | Status | Entries | |---|---| -| Native | 57 | -| Derived | 11 | +| Native | 56 | +| Derived | 12 | | Approximated | 16 | -| Unsupported | 45 | +| Unsupported | 46 | | Deferred | 9 | | NotApplicable | 6 | -| **Total** | **144** | +| **Total** | **145** | ## Explicitly deferred domains @@ -138,7 +138,7 @@ EnergyManagementSystem; output requests and reporting configuration. | OpenStudio concept | SAM target | Status | Diagnostic | Conversion / policy | |---|---|---|---|---| -| `OS:Material.StandardOpaqueMaterial` | `Core.OpaqueMaterial` | **Native** | - | | +| `OS:Material.StandardOpaqueMaterial` | `Core.OpaqueMaterial` | **Native** | - | SAM-written face and thickness objects of one source Guid merge into one SAM material with both authored faces; an edit made after export is kept on its face (SAM-OSI-MAT-001); conflicts are not merged (SAM-OSI-ID-001); never matched by name. | | `OS:Material.MasslessOpaqueMaterial` | `Core.OpaqueMaterial` | **Approximated** | `SAM-OSI-APX-001` | conductivity = 0.025 m / R; resistance preserved exactly, near-zero thermal mass assigned | | `OS:Material.AirGap` | `Core.GasMaterial` | **Derived** | - | HeatTransferCoefficient = 1 / thermalResistance (exact inverse of the forward R = 1/h) | | `OS:WindowMaterial.Glazing` | `Core.TransparentMaterial` | **Native** | - | EnergyPlus Front/Back map to SAM External/Internal, matching the forward direction. | @@ -155,7 +155,7 @@ EnergyManagementSystem; output requests and reporting configuration. | OpenStudio concept | SAM target | Status | Diagnostic | Conversion / policy | |---|---|---|---|---| -| `OS:Construction.Opaque` | `Construction` | **Native** | - | Layer order preserved outside-first. | +| `OS:Construction.Opaque` | `Construction` | **Native** | - | Opaque constructions used by planar surfaces are read innermost layer first (SAM inside to outside from the side the panel is built from, the SAM-written forward side when stamped); fenestration, door-pane, shading-only and unused constructions keep the outside-first order; a construction shared with a subsurface or shading surface is split (SAM-OSI-APX-001). | | `OS:Construction.Fenestration` | `ApertureConstruction` | **Native** | - | Pane layers only; frame layers are never fabricated. | | `OS:Construction.AirBoundary` | `PanelType.Air` | **Native** | - | A layer-free SAM construction; the air behaviour is carried by the panel type. | | `OS:Construction.InternalSource` | - | **Unsupported** | `SAM-OSI-CON-001` | | @@ -163,6 +163,7 @@ EnergyManagementSystem; output requests and reporting configuration. | `OS:Construction.FfactorGroundFloor` | - | **Unsupported** | `SAM-OSI-CON-001` | | | `OS:Construction.WindowDataFile` | - | **Unsupported** | `SAM-OSI-CON-001` | | | `OS:Construction.Missing` | - | **Unsupported** | `SAM-OSI-CON-001` | A surface with no construction gets a named, layer-free placeholder - never a default build-up. | +| `OS:Construction.FacesUnresolved` | - | **Unsupported** | `SAM-OSI-CON-002` | An opaque surface construction that cannot reproduce its native layer order or the absorptances of a face EnergyPlus uses (an edited or mixed model whose orientation or face roles cannot be established) is an error, and the import is unsuccessful. | | `OS:Construction.UnreferencedPruning` | - | **Native** | - | Materials and profiles the imported topology does not reference are removed. | ### Loads and controls @@ -173,7 +174,7 @@ EnergyManagementSystem; output requests and reporting configuration. | `OS:People.AutocalculatedSensibleFraction` | - | **Approximated** | `SAM-OSI-APX-001` | No fixed split exists; the whole metabolic rate is imported as sensible. | | `OS:People.NumberOfPeopleMethod` | - | **Unsupported** | `SAM-OSI-LOAD-001` | An absolute count cannot become a density on a shared space type without inventing an area. | | `OS:Lights` | `InternalConditionParameter.LightingGainPerArea + LightingProfileName` | **Native** | - | | -| `OS:Lights.RadiantVisibleFractions` | `InternalConditionParameter.LightingRadiantProportion / LightingViewCoefficient` | **Native** | - | | +| `OS:Lights.RadiantVisibleFractions` | `InternalConditionParameter.LightingRadiantProportion` | **Derived** | `SAM-OSI-APX-001` | p = Fraction Radiant + Fraction Visible (SAM S07 §5.1); `LightingViewCoefficient` is a comfort coefficient and is not set. Warning when Return Air Fraction > 0 (that share becomes convective room gain) or the fractions sum above 1 (not imported); information when Fraction Visible / (Fraction Radiant + Fraction Visible) differs from s = 0.2415 / 0.576. Files imported under the previous mapping hold Fraction Radiant in p and Fraction Visible in the view coefficient; they cannot be identified and are not migrated. | | `OS:ElectricEquipment` | `InternalConditionParameter.EquipmentSensibleGainPerArea / EquipmentLatentGainPerArea` | **Native** | - | | | `OS:ElectricEquipment.PartLatent` | - | **Approximated** | `SAM-OSI-APX-001` | A single part-latent instance is apportioned; the two halves then share one schedule. | | `OS:GasEquipment` | - | **Unsupported** | `SAM-OSI-LOAD-001` | | diff --git a/docs/openstudio-to-sam-import-audit.md b/docs/openstudio-to-sam-import-audit.md index 81fbaf0..36ae5ee 100644 --- a/docs/openstudio-to-sam-import-audit.md +++ b/docs/openstudio-to-sam-import-audit.md @@ -250,6 +250,7 @@ All reverse-only codes live in `SAM.Core.OpenStudio.OpenStudioImportDiagnosticCo | `SAM-OSI-SUB-001` | Unsupported subsurface type | | `SAM-OSI-MAT-001` | Unsupported material | | `SAM-OSI-CON-001` | Unsupported construction | +| `SAM-OSI-CON-002` | Opaque surface construction cannot reproduce its native layers or used faces (error; unsuccessful import) | | `SAM-OSI-SCH-001` | Unsupported schedule | | `SAM-OSI-LOAD-001` | Unsupported load or control | | `SAM-OSI-LOAD-002` | Conflicting space-type / space-level load assignment | diff --git a/documentation/S09-OpenStudio-InputReadBack-PR.md b/documentation/S09-OpenStudio-InputReadBack-PR.md new file mode 100644 index 0000000..1af5e6c --- /dev/null +++ b/documentation/S09-OpenStudio-InputReadBack-PR.md @@ -0,0 +1,1993 @@ +# S09: OpenStudio independent native-input read-back and ventilation alignment + +Task S09 of the SAM simulation roadmap (SAM `documentation/SIMULATION_ROADMAP_Q4_2026.md`). The contract is SAM +`documentation/SIMULATION_INPUT_MAPPING_S07.md`. It follows S08, which completed in SAM_Tas#106 (merge `61eb0d37`, +closeout `c50e9169`; post-merge Build 39580480516 succeeded on `61eb0d37`). + +Branch `feature/s09-openstudio-input-readback`, base `sow/2026-Q4` (`7f216657`). **Draft, for independent review. Not +merged.** +- **Tested content (revision 12, S07 §5.2 amendment U1, OUT-OF-ENGINE-SCOPE):** `8edf793a63b274cafe5e55b9e85fa597d6307a10`. S09 comparator, + report and tests only; the writer and importer are unchanged. +- **Acceptance (2026-10-23):** run at head `d26665bd2e397d011cd1dda382c3e93004e1c231` (code `8edf793`), packed in + `documentation/S09-OpenStudio-InputReadBack-evidence/acceptance-2026-10-23/`. Revision 12 passed independent code + review before it. +- **Revision 11 (the owner-approved opaque multi-layer import order, fail closed, per-layer consistency):** tested + content `4ea2e6c2ac5805426ed1b39bdd5d88b39b1c723f` (after `37841ea`, `5241bdd` and `f5f207b`), head + `adcad2f4383ab3763839e4a7e0a87c84d1468e4c` (Build 39838540508 and SPDX 39838540363 succeeded). **The per-layer fix + `4ea2e6c` was independently accepted** (owner statement in the revision-12 brief, 2026-10-23); this corrects the + revision-11 text, which listed it as pending review. +- **Revision 11 reviewed state:** code `f5f207b456a3e7e2429ead4054c779031615e2b7`, head + `89a2216da8acbde8abfd25430d0b0cf15f9f9730` (Build 39824715351 and SPDX 39824715431 succeeded). The independent review + of that head confirmed the corrections and found one P1, the per-layer interzone consistency gap that `4ea2e6c` + closes. +- **Revision 10 (group membership, shared equal-face edits):** tested content `78f10146481dbd4fe46af8761813fa4f9d58d357`, + head `93ec3151f30cdb0de398cf7eac189bbceb8b72fd` (Build 39766696575 and SPDX 39766696573 succeeded). **It passed + independent review**: the review of revision 10 accepted its two bounded fixes before revision 11 was approved. This + corrects the earlier revision-11 record text, which said it was not independently reviewed. +- **Revision 9 (native edits, merging, inherited faces):** tested content `354e5322fa3a4c31a984de911c48534e768c40e4`, + reviewed head `806d5449ef02bafa2dada3283a1aa00808ce5fad` (Build 39761623252 and SPDX 39761623127 succeeded). +- **Revision 8 (the opaque face-optics correction):** tested content `fc83a6df1f843f82a043353616a2b4e42a94e6d6`, reviewed head + `901e592ada5728db9f413f6cd96665f5210cf5a7` (Build 39755063548 and SPDX 39755063557 succeeded). +- **Revision 7 (the owner decisions and acceptance reporting; its optics acceptance is removed by revision 8):** tested + content `614a7a8d70b6a70c5628a0ef3b57eaec0c5ec794`, head `7fccdccb2420bfcc4ad79761d1eee7f547c54d57` (Build + 39744024838 and SPDX 39744024866 succeeded). +- **Revision 6 (the lighting read-back guards):** tested content `225881f00971c7cab3596e94867924a11866e147`, reviewed head + `8fd0ffc2e7a4d0c1e8463305d74f476e198e4ea7` (Build 39726520323 succeeded). It passed independent technical review + (owner statement, 2026-10-22). +- **Revision 5 (the S07 §5.1 lighting split):** tested content `20f8fb65`, reviewed head + `31af6022095b8367cf333da0d790dc258955acb0` (Build 39672548198 succeeded). +- **Revision 4:** tested content `0c232875c8b872e393cd1ddb883e61f63eed30a6`; record head `6a36afb0` (Build 39622605892 + succeeded). +- **Revision 3:** tested content `c1e53328`, reviewed head `e0a6ea1950455e04dbf086d164500fd8829867ec` (its hosted + Build failed; see "Revision 4"). +- **Revision 2:** tested content `cfe097f4`, reviewed head `6f7e6b7dcce37a8db82c997bc718e0b17d5e28e0`. +- **Revision 1:** tested content `ebd9c4e4`, reviewed head `d6d1cc5b6573ddb3453355e7468ccc83d3ee2419`. +- The final head and its hosted checks are in the PR description. + +## Status + +- **Revision 12 implements S07 §5.2, amendment U1** (approved by the merge of SAM#218, `b06dbe8c`; closeout `0168d03f`; + see "Revision 12"). S09 only. **It passed independent code review** (owner statement, 2026-10-23, at head + `d26665b`). + - **Acceptance run at head `d26665b`** (owner-authorised, 2026-10-23; `acceptance-2026-10-23/`): box, two-zone + and the box repeat PASS, exit 0, coverage 319/319 and 592/592; out-of-engine-scope 105 / 216 (differing 69 / + 138); all 21 negatives FAIL (exit 10) by their intended mechanism; the repeat IDF and every `report.txt` are + byte-identical (and identical to the revision-12 test session). Local only: hosted CI does not run it. + - Row-3a opaque absorptance and emissivity on a face EnergyPlus 25.1 does not use are **OUT-OF-ENGINE-SCOPE**: + informational, not gated, never MATCH, NOT-APPLICABLE or an accepted limitation. Each row keeps the SAM and native + values, the difference, side, layer, property, scope reason and the amendment, in JSON and text, with counts. + - Only when the face's role is established from raw SAM, the side and the native boundary (never the writer's + selector), and both values are valid and comparable. Used faces, every thickness/λ/ρ/c row, and missing, NaN, + unreadable, out-of-domain or undeterminable rows stay gated; an undeterminable role is named (BLOCKED technical). + - The S09-only OS-MAT-SINGLE-SIDED listing (MAPPING-DIFFERENCE, revisions 2-11) is removed. + - **Both fixtures: PASS, exit 0**, coverage 319/319 and 592/592. Out-of-engine-scope: box 105 (69 differing, 36 + equal), two-zone 216 (138 differing, 78 equal). This is **scoped native-input conformance** of the OpenStudio + export to S07, not simulation equivalence, not a Phase B PASS (which needs S08-S11) and not an owner acceptance of + anything else. + - Tests: S09 120/120 (97 retained, 23 new), writer/importer and benchmark below. A/B: the pre-U1 comparator gives + BLOCKED owner (12) or FAIL (10) where U1 gives PASS, and hides the undeterminable-role and out-of-domain cases. +- **Revision 11 implements the owner-approved opaque multi-layer layer-order correction** (see "Revision 11"). Importer + only. **Independently accepted** (the review of `89a2216` and then of the per-layer fix `4ea2e6c`); optics acceptance + is not renewed and Phase B is not claimed. + - Opaque layered constructions used by planar surfaces are read innermost first; interzone panels are built from the + SAM-written forward side and the spaces are ordered so that side is the writer's first space (a deviation from the + proposal's "no space-order change", explained in "Revision 11"). + - The reviewer's multi-layer reproduction now re-exports Brick → Insulation → Plasterboard_Internal with the edited 0.42 + zone face. Interzone (both space orders), geometric-fallback and unstamped native models round-trip every surface's + layers, thicknesses and used-face absorptances. + - **Fail closed** (owner instruction after the first draft, which reported an ambiguous re-read as a warning only): + every imported opaque surface panel must reproduce its native layer order and every used face's absorptances. If it + cannot, the import raises the new error SAM-OSI-CON-002 and is unsuccessful (no model). This covers an edited or mixed + model whose re-read would move a differing face, and contradictory forward sides. Equivalent re-reads and + equal-face edited models still succeed. + - **Per-layer consistency** (the review of `89a2216`, one P1): the check also compares each native layer's thickness, + conductivity, density and specific heat, on both sides in each side's direction, with the SAM panel's layers. Before + this, merged source names hid the reviewer's 12.5 mm / 20 mm interzone reproduction, which imported successfully + and re-exported 12.5 mm on both sides. It now fails with SAM-OSI-CON-002 and returns no model. Valid mirrors, one + material twice at two thicknesses, and reuse of one material at other thicknesses in unrelated constructions still + import; massless and air-gap handling is unchanged. + - Glazing, opaque door panes, shading, air boundaries and non-layered constructions are unchanged (controls). A + construction shared by surfaces and a door or shade is split, reported. + - Compatibility: earlier imports keep their reversed constructions; no automatic migration. +- **Revision 10 addresses the independent review of `806d5449`** (see "Revision 10"). Importer only. **It passed + independent review** (corrected; the earlier revision-11 text said otherwise). Optics acceptance is not renewed and + Phase B is not claimed. + - Every face object is validated before a merged material is returned for it, and only a validated group member + resolves to it. The reviewer's malformed third object now keeps its own conductivity 9 and is named in a warning; + the valid pair still merges. Order-independent. + - A native edit is kept on every SAM face the object supplies. The reviewer's equal-face single-layer edit now + imports on both faces and re-exports valid (no SAM-OS-MAT-003). Distinct variants keep genuine asymmetry; the + single-layer differing-face refusal is unchanged. + - Tests: see "Tests and validation". A/B: revision 9 fails the 16 new regressions; the 7 new controls pass under both. + - The confirmed pre-existing multi-layer layer-order defect was left open by revision 10 and is corrected by + revision 11. +- **Revision 9 addresses the independent review of `901e592a`** (see "Revision 9"). Its review confirmed the three + corrections and found the two importer defects revision 10 fixes. + - Import keeps a native optical edit made after export, on the face its object carries, with a warning; an unchanged + OpenStudio default stays unstated. The review's reproduction (light reflectance unstated, visible absorptance + 0.7 → 0.42) now re-exports 0.42; revision 8 lost the edit. + - SAM-written face and thickness objects of one explicit source Guid merge into one SAM material, its Guid restored + and each layer's thickness kept; conflicts are reported and not merged; never merged by name. + - An unstated (absent or NaN) internal value on a zone face that takes the external value is reported at Summary + (new SAM-OS-MAT-004); its provenance stays unspecified on import and in S09. + - Fixture reports are byte-identical to revision 8: BLOCKED owner, exit 12. Tests: S09 97/97, writer/importer 409 + passed / 2 skipped, benchmark 51/51 (Simulation excluded). A/B: revision 8 fails the 9 + 2 new regressions. + - Found, not fixed (pre-existing, outside the review): the importer keeps OpenStudio's outside-first layer order, so a + multi-layer construction comes back reversed on round trip. +- **Revision 8 corrects the opaque-material mismatch instead of accepting it** (owner, 2026-10-22; see "Revision 8"). + - Writer: SAM's first layer carries its internal-face optics (an `_Internal` variant where its faces differ), every + other layer its external ones, so every face EnergyPlus uses holds the authored value. Forward and reverse + constructions stay exact mirrors. + - A single-layer outdoor or interzone construction whose faces differ is a named error, SAM-OS-MAT-003, with no + construction and an unsuccessful conversion. Ground and adiabatic single layers use the zone face. + - The forward construction follows the panel's first space; a missing first side is a named error, never a swap. + - Import recovers both authored face sets from explicit per-object metadata and diagnoses inconsistent metadata. + - S09 derives the used faces itself and compares them exactly; a swapped zone face FAILs. + - **Revision 7's optics acceptance is removed.** Both fixtures are **BLOCKED owner, exit 12**, complete (319/319, + 592/592). Every remaining non-PASS row (69 / 138) is on a face EnergyPlus does not use. + - Tests: S09 95/95, writer/importer 400 passed / 2 skipped (Simulation excluded), benchmark 51/51. Not yet independently + reviewed. +- **Still recorded from 2026-10-22:** ventilation A (T-VENT-INACTIVE extended, Decision 1) and lighting B1 (the + Decision 5 reading; **OD-L1 stays open**, the Tas side needs separate approval). The optics option-1 acceptance is + superseded by the owner's instruction to investigate and correct. +- **Revision 7 reported the optics acceptance (superseded by revision 8).** Both fixtures are now **NOT PASS, accepted limitation (rank 5), exit 14**, + with complete coverage (319/319, 592/592) and unchanged outcome counts. They are never PASS. + - The acceptance applies only under the approved rules, to a fixture whose id and frozen-model SHA-256 are both a + reviewed fixture's, and only to the 3a MAPPING-DIFFERENCE rows. Any other model, fixture id or rule set stays + BLOCKED owner, exit 12. + - Every failure check is kept: a wrong opaque optical value still FAILs (exit 10) under the acceptance, and all + existing negatives still FAIL. + - S09 93/93 (5 new). Its final-head CI succeeded; it was not independently reviewed before revision 8 replaced it. +- **Not a Phase B PASS.** The roadmap Phase B gate needs S08-S11 PASS. Exit 12 is not PASS, and neither would an + accepted limitation be; no roadmap exception is requested or made here. +- Revision 6 (below) passed independent technical review. It had left S09 BLOCKED on the optics and T-VENT-INACTIVE + decisions; the lighting visible-fraction item was withdrawn by S07 amendment L1 (SAM#217), which revision 5 implements. +- **Revision 6 closes the two gaps the independent review of `31af6022` reproduced in the lighting read-back** (see + "Revision 6"). The writer and importer are unchanged. + - Native domain and energy conservation are checked before any S07 tolerance. An invalid split (a fraction outside + [0, 1], or a sum above 1) is a named EXPORT-DEFECT on all five lighting rows: FAIL, exit 10. The reviewed head + accepted p = 1 with a sum of 1.0008, and p = 0 with Fraction Radiant −0.0004 (exit 12). + - The plenum-calculated return-air setting is read. Blank or No stays the static split. Yes, an uninterpretable value + or an unreadable field blocks technically (exit 11), named, with no lighting row accepted. + - S09 88/88 (8 new: 5 regressions, which fail against the reviewed comparator, and 3 valid controls). The fixture + reports are byte-identical to revision 5. +- **Revision 5 implements S07 §5.1 (amendment L1, SAM#217 `113873a0`)** (see "Revision 5"). + - Writer: Fraction Radiant = p·(1 − s), Fraction Visible = p·s, s = 0.2415 / 0.576, Return Air Fraction unset (0); + the view coefficient is never read. An authored p, including 0, is preserved. An absent or NaN p takes p₀ = 0.576. + Both cases are stated at Summary (new `SAM-OS-IC-002`). + - Importer: p = Fraction Radiant + Fraction Visible; the view coefficient is not set. + - S09: five T-LIGHT-SPLIT rows per space from the raw SAM p and the §5.1 constants. The view-coefficient comparison + and its DOCUMENTED-DEFAULT exception are removed. An unstated p stays S-UNSPEC (DOCUMENTED-DEFAULT, never PASS). + - Both fixtures: complete coverage (319/319, 592/592), BLOCKED owner, exit 12, on the optics rows only. 80/80 S09 + tests, 5 new negatives FAIL on both fixtures. + - Not run under this scope: the acceptance scripts, so the committed `acc3` pack predates L1. +- The independent review of `59036783` accepted the revision-4 code technically. The review of `31af6022` (revision 5) + found the two gaps revision 6 closes. Revision 6 then passed independent technical review (owner statement, + 2026-10-22). +- **Record correction after that review (documentation only):** the writer-test reproduction command now excludes + `TestCategory=Simulation`, and the historical 388 passed / 2 skipped results are separated from the reviewer's filtered + 363 passed / 2 skipped (see "Writer-test scope correction"). +- **Revision 4 responds to the failed final-head Build 39603021836 at `e0a6ea19`** (see "Revision 4"). + - One negative's `compare` wrote no report, and the test lost its exit code and stderr. + - A defect that produces exactly this failure is fixed: process freshness was judged by process id alone, and Windows + reuses ids. A process is now its id and OS creation time. + - A failed CLI step now reports its exit code, stdout/stderr and process identities before any report is parsed. CI + keeps that text when a step fails. + - That id reuse *was* the CI cause is likely but unproven, because the CI run kept no output. + - Verdicts, coverage, outcome counts and every `report.txt` are unchanged (acc6 = acc3). +- **Revision 3 closes the finding the independent review of `6f7e6b7d` reproduced** (see "Revision 3"). + - `OsComparison.Multiplicity` skipped the OSM/IDF multiplier check when the IDF zone or subsurface had no + `OS:ThermalZone` / `OS:SubSurface` of its name. Such a model kept BLOCKED owner, exit 12, with complete coverage. + - Consistency is now claimed only against one identified OSM counterpart. A proven missing counterpart FAILs + (exit 10); an ambiguous or unreadable identity, or an unknown Multiplier layout, is BLOCKED technical (exit 11). + - The new negatives FAIL on both fixtures; the reviewed head reported every one as BLOCKED owner, exit 12. + - Both unchanged fixtures keep complete coverage, their outcome counts and BLOCKED owner, exit 12. + - The assessment wording is corrected (see "Construction-performance calculation methods"). +- **Revision 2 closed the two gaps the independent review of `d6d1cc5b` reproduced.** + - Native multiplicity (Zone, ZoneGroup and window multipliers) and building orientation (coordinate system, Building + North Axis, zone relative north) are now checked against SAM intent. + - A contradiction FAILs; an uninterpretable configuration is BLOCKED technical (see "Revision 2"). + - All six new negatives, and the reviewer's three copies, FAIL (exit 10). The reviewed head reported all nine as + BLOCKED owner, exit 12. +- **Ventilation policy implemented and verified natively.** + - V0/V1: no delivered outdoor air. The requirement is kept. + - V2: hourly delivery = the SAM requirement × the selected profile. + - A selection that does not resolve is an invalid input. + - Changing V2 back to V1 is covered by tests. +- **Revisions 1–4 (before L1; revision 5 above supersedes the counts): both fixtures: complete S07 coverage, BLOCKED + (owner decision named), exit 12**, unchanged by revisions 2 and 3: + - `s08-fix-box`: 316/316 required comparisons. + - `s08-fix-two`: 586/586 required comparisons. + - Every other quantity matches within the S07 tolerance, or is a verified transformation or not applicable. Two named + items remain; both are owner decisions, not defects (see "Fixture verdicts"). + - The box repeat gives the same verdict and a byte-identical IDF. +- **All 16 targeted negatives FAIL** (exit 10): the original 8, the 6 of revision 2 and the 2 of revision 3. Revision 5 + adds 5 lighting negatives, which FAIL on both fixtures in the S09 tests. +- **The optics decision table for OS-MAT-SINGLE-SIDED is below.** It separates exposed-face differences (18 box rows / + 33 two-zone rows) from buried-layer metadata (51 / 105). Revision 7 recorded option 1 (acceptance); revision 8 replaces + it with option 2 (construction-aware variants), so every exposed face now matches. +- **Construction-performance calculation methods are assessed below.** This is an assessment only; nothing is + implemented. Revision 3 corrects its wording only. +- On this evidence every S07 quantity matches except the rows on faces EnergyPlus does not use (69 / 138), which keep + both fixtures BLOCKED owner, exit 12, subject to the independent review of revision 8. Clearing them needs an owner + decision: accept those unused-face rows, or an S07 3a scope decision (compare only used faces). (Revision 8 text; the + scope decision was taken by S07 amendment U1, SAM#218, and revision 12 implements it: both fixtures PASS, exit 0.) + +## Owner instructions applied + +**S09 start (2026-10-21, in substance).** +- **Fixtures and weather:** the S08 signed-off fixtures, byte for byte, and the S08 Budapest weather. +- **Method:** + - Do not regenerate fixtures, tune or invent tolerances. + - Read OSM and IDF native fields in a fresh process, deriving the expectations independently from SAM and S07. + - Corroborate identity with geometry. + - Reuse the S08 COM-free logic. +- **Ventilation policy:** + - V0/V1: no delivered outdoor air in either engine; the requirements are kept. + - V2: a valid selected profile controls the hourly delivery. + - A selected but missing or wrong-type profile is an invalid input. + - No Tas profile is added to copy an OpenStudio default. + - Correct OpenStudio's unscheduled delivery, covering the SpaceType DSOA, the per-space override, inheritance and the + Ideal Loads controls. +- **Authorised:** native generation, translation, fresh-process reads and disposable negatives. +- **Not authorised:** Tas execution, simulation, sizing or recalibration. + +**Revision 2 (2026-10-21, in substance).** +- Close the reproduced gaps: multiplicity and orientation inconsistent with the frozen fixtures must be detected, + either by accounting for effective quantities or by explicit rejection, never assuming unity. Add fresh-process + negatives for each case. +- Prepare the optics decision table for both fixtures. Keep OS-MAT-SINGLE-SIDED proposed and owner-unaccepted. +- Assess construction-performance calculation methods without implementing a calculator or changing the UI. +- Keep the fixtures, weather and tolerances. +- Excluded: a material-writer fix, fixture regeneration, tolerance changes, shared-core redesign, Tas execution, + simulation, sizing, merge, issue closure and the broader issue #30. + +**Revision 3 (2026-10-21, in substance).** +- Fix one finding: the OSM/IDF consistency checks in `OsComparison.Multiplicity` are skipped when the matching + `OS:ThermalZone` or `OS:SubSurface` is absent. +- Claim consistency only against an unambiguous OSM counterpart. A proven missing counterpart is a consistency failure; + an unreadable identity or layout blocks technically. A missing object is never read as a present one with a default + field. Keep legitimate blank-field defaults. +- Add fresh-process regressions on both fixtures; keep the fix local (no reader redesign) and every existing test. +- Correct the assessment wording: scope the Tas-backed U/g/LT claims to the traced WPF workflows; keep the short-array + guard defect apart from the unproven cause of the Ug display issue; describe World coordinates as the code handles + them; update the stale hosted-CI wording. +- Excluded: material-writer changes, calculator/UI work, shared-core changes, fixture, weather or tolerance changes, + Tas calculations, EnergyPlus execution, simulation, sizing, installation, owner decisions, merge and next-stage work. + +**Revision 4 (2026-10-21, in substance).** +- Diagnose the final-head Build 39603021836 failure without widening S09 scope. +- A failure must expose the CLI exit code, stdout/stderr and run evidence before the report is parsed. Keep bounded CI + diagnostics on failure if needed. +- Reproduce under relevant conditions, investigate from evidence, and do not call it flaky because local tests pass. +- Make only evidence-supported fixes. Keep fresh-process independence, hash checks, fixture bytes, tolerances and every + negative. No retries or relaxed assertions. +- Excluded as in revision 3. + +**Revision 5 (2026-10-21, in substance).** +- Source of truth: SAM S07 §5.1, merged by SAM#217 as `113873a0`. Check its post-merge Test first. +- Preserve the authored total radiant proportion p, including 0. s = 0.2415 / 0.576 at full precision; visible p·s, + long-wave p·(1 − s), convective 1 − p, return air 0. Never use the view coefficient as an energy fraction. +- Importer: p from radiant + visible, without the comfort coefficient, with the §5.1 diagnostics. +- Update mapping and coverage documents, the S09 read-back rows, independent expectations and targeted negatives. Test + an authored 0, independence from the comfort coefficient, incorrect partitions and a nonzero return air. +- A missing or NaN p keeps its unspecified provenance; DOCUMENTED-DEFAULT never becomes PASS. +- OD-L1 stays open: do not settle fallback applicability or claim suitability for excluded cases. If OD-L1 blocks a + production fallback change, continue the authored-input corrections and report the decision. Do not keep the old + mapping and present it as corrected. +- Run S09, non-Simulation benchmark and writer tests; no acceptance scripts that export or execute engines. +- Excluded: opaque optics, reversed glazing, Ladybug mapping, duplicate SAM defaults, SAM_Tas edits, broad refactoring, + simulation, sizing, Tas/EnergyPlus execution, S10, merge. Keep the PR draft. + +**Revision 6 (2026-10-22, in substance).** Correct only two reproduced fail-closed gaps; keep the writer and importer +split. +- In `OsComparison.LightingSplit`, validate native fraction domains and energy conservation before applying the S07 + tolerances. Regressions: p = 1 with radiant (1 − s) + 0.0004 and visible s + 0.0004; p = 0 with radiant −0.0004 and + visible 0.0004. Neither may produce accepted lighting rows without a named failure. Keep valid p = 0 and p = 1, document + the floating-point boundary, and do not loosen S07 tolerances. +- Read the Lights plenum-calculated return-air setting. Its blank/No default stays supported. Yes cannot receive a + verified static T-LIGHT-SPLIT: report a named unsupported, BLOCKED technical result. Uninterpretable settings fail + closed. Add CLI/report regressions, including a valid unchanged control. +- Show that the new regressions expose the reviewed behaviour. Keep fixtures, original evidence and the OD-L1, optics + and ventilation decisions open. No other repository edits, simulations, sizing, engine execution or merge. + +**Revision 9 (2026-10-22, in substance).** Address the independent review of `901e592a`: +1. Preserve native optical edits when the SAM property was absent (reproduction: both Plasterboard light reflectances + removed, export, native visible absorptance 0.7 → 0.42, import and re-export returned 0.7). Distinguish unchanged + defaults from edits; keep edits with diagnostics or reject them explicitly. +2. Merge compatible face variants by explicit source identity into one SAM material, construction references restored + and layer thicknesses kept. Diagnose conflicts; never merge by name. +3. Report internal-to-external inheritance at Summary; keep unspecified provenance; test absent and NaN. +- Add focused regressions and unchanged controls; run S09, writer/importer and benchmark (Simulation excluded); update + evidence; final-head CI; return for independent review. +- Keep the corrected exposed faces, the single-layer refusal, lighting and zero-delivery ventilation. Excluded: engines, + acceptance scripts, Tas changes, a renewed optics acceptance, merge, S10. + +**Revision 8 (2026-10-22, in substance).** Approved in this PR with conditions. +- Preserve revision 7 in history; do not merge or close S09. Investigate, then correct, the opaque-material mismatch + before accepting it. +- Single-layer outdoor or interzone constructions needing different face optics: a named error and an unsuccessful + conversion, never External values as a substitute. Ground and adiabatic cases use the zone-face properties. Check per + construction use, before cache reuse. No averaging or artificial layer splitting. +- Preserve enough explicit source information to recover both authored face sets on import, even when only an Internal + variant is referenced. Do not merge by name or invent missing values. Diagnose inconsistent identity or properties. +- S09 derives the expected exposed-face properties from raw SAM data and orientation, without the writer's selector, + with a swapped-face regression. +- Implement the orientation checks, remove revision 7's optics acceptance and keep its history. +- Run S09, writer/importer and benchmark tests, excluding `TestCategory=Simulation` from the writer and benchmark + suites. Obtain final-head CI and return for independent review. +- Excluded: engines, acceptance scripts, Tas or roadmap changes, merge, S10. Keep zero-delivery ventilation and the + reviewed lighting corrections; no glazing work. + +**Owner decisions and revision 7 (2026-10-22, in substance).** +- Revision 6 at `8fd0ffc2` passed independent technical review. +- The owner approved the three recommendations of the advisory note: optics option 1, ventilation A, lighting B1. +- Accept optics only for the two reviewed fixtures, with result effects unmeasured. +- Authorised: the bounded #33 record and acceptance-reporting update. Preserve all failure checks and the pending OD-L1 + limits. Return for independent review after final-head CI. +- Excluded: merge, engines, Tas changes, a roadmap exception and S10. + +**Revision 12 (2026-10-23, in substance).** Implement the approved S07 amendment U1 (SAM#218 merge `b06dbe8c`, closeout +`0168d03f`) in this PR only; keep the writer/importer fixes. +- OUT-OF-ENGINE-SCOPE only for valid, comparable authored row-3a optics on demonstrably unused faces (§5.2). Authored + zero is a value. Roles derived independently from raw SAM, orientation and a supported boundary, never the writer's + selector; a mismatch need not equal the other face. Validate states, domains, readability, object presence and + face-role consistency first; missing, invalid, NaN, unreadable values and malformed, unknown or contradictory roles + never become informational; unsupported boundaries are not read as Ground. +- Keep values, delta, side/layer, reason, amendment and per-outcome counts in JSON and text; keep every required row and + the coverage; separate informational rows from blockers in gate, report, summary and exit code. An informational row + masks nothing; PASS needs every gated quantity in the allow-list. +- Smallest OpenStudio-local adaptation: no SAM_Tas, linked-source or shared-gate change, no copied evaluator, no fake + outcome. Coverage 319/319 and 592/592; the 69 / 138 rows stay visible; do not force totals. +- Regressions and controls as listed in "Revision 12"; A/B against the pre-U1 behaviour; the three suites built Release + x64 and run `--no-build`; no engines, simulations, acceptance or packing scripts. +- Excluded: writer/importer changes, optics re-acceptance, single-layer refusal, Tas/S08, lighting/ventilation, OD-L1, + fallback, fixtures, roadmap, `PROJECT_PROGRESS.md`, merge, S09 closeout, S10. Correct the stale pending-review item + (the per-layer fix was accepted). Keep #33 draft; obtain final-head CI and stop for independent principal-architect + review. + +## Work completed + +| Commit | Change | +|---|---| +| `814dba1` | Writer: the delivery rule for the SpaceType DSOA and the per-space override; explicit Ideal Loads outdoor-air controls and DSOA link (see "Writer change") | +| `2099572` | `benchmark/SAM.Analytical.OpenStudio.InputReadBack` (reader, comparator, report) and `.Cli` (`os-input-readback` export / read / compare); fixtures copied with their S08 hashes | +| `7d6507c` | `negative` mode (8 cases), `Run-S09-ReadBack.ps1`, `Pack-S09-Evidence.ps1`, 33 tests, CI step and SAM_Tas sparse clone, `.sln`, mapping doc, D1 test narrowed | +| `ebd9c4e` | The OS-MAT-SINGLE-SIDED proposal named in each report; acceptance evidence | +| `d6d1cc5` | Revision 1 record | +| `cfe097f` | **Revision 2:** `OsComparison.Orientation` / `.Multiplicity`, the `Unsupported` (BLOCKED technical) list, report schema `/2`, reader classes, 6 negatives, 17 tests, acceptance script | +| `6f7e6b7` | Revision 2 evidence (acc2, A/B, optics table program and output) and this record | +| `c1e5332` | **Revision 3:** `OsComparison.OsmCounterpart`, `OsmMultiplier` read by position and label, the counterpart counts in the multiplicity Supporting line; 2 CLI negatives (and the acceptance script); 8 tests | +| `e0a6ea1` | Revision 3 evidence (acc3, A/B), the assessment wording corrections and this record | +| `0c23287` | **Revision 4:** `ProcessIdentity` (id + creation time) in the export/reader/compare checks, schemas `s09-export/2` and `s09-native/2`; `TestSupport` failure evidence and `s09-diagnostics`; 4 tests; CI diagnostics upload on failure | +| `5903678`, `6a36afb` | Revision 4 evidence (`revision-4/`: CI excerpt, A/B, id-reuse measurement), this record and its writer-test scope correction | +| `20f8fb6` | **Revision 5:** the S07 §5.1 lighting split in the writer (`LightingSplit`, `SAM-OS-IC-002`) and the importer; the S09 T-LIGHT-SPLIT rows; 5 negatives; 18 S09 and 16 writer/importer tests; manifests and mapping documents | +| `31af602` | Revision 5 evidence (`revision-5/`) and this record | +| `225881f` | **Revision 6:** the native-domain and plenum guards in `OsComparison.LightingSplit`, `OsQuantities.LightingFractionBoundary`, 6 CLI cases, 8 S09 tests | +| `8fd0ffc` | Revision 6 evidence (`revision-6/`) and this record | +| `614a7a8` | **Revision 7:** `Compare/OwnerDecisions.cs` (new), the acceptance in `OsComparison.Run` and its Supporting line, the model hash passed by `compare`; 5 S09 tests | +| `7fccdcc` | Revision 7 evidence (`revision-7/`) and this record | +| `fc83a6d` | **Revision 8:** face-specific opaque variants, the single-layer error SAM-OS-MAT-003, the forward-side check, face metadata and its import; S09 used-face comparison; revision 7's `OwnerDecisions` removed; writer/importer and S09 tests; docs | +| `901e592` | Revision 8 evidence (`revision-8/`) and this record | +| `354e532` | **Revision 9:** written-value stamps and SAM-OS-MAT-004 in the writer; edit detection and merging by source Guid in the importer; NaN as unstated in S09; 11 writer/importer and 2 S09 tests; docs | +| `806d544` | Revision 9 evidence (`revision-9/`) and this record | +| `78f1014` | **Revision 10:** importer only: each face object validated before a merged result and only group members resolve to it; edits kept on every face the object supplies; 23 writer/importer test cases; mapping doc | +| `e04ff90`, `93ec315` | Revision 10 evidence (`revision-10/`), the layer-order proposal and this record | +| `37841ea`, `5241bdd`, `f5f207b`, `4ea2e6c` | **Revision 11:** importer: innermost-first opaque surface constructions, the shared-use split, forward-side panels, the space order and the re-read; then the fail-closed face check SAM-OSI-CON-002 replacing the warning-only re-read, and (review of `89a2216`) the per-layer thickness and thermal comparison of both sides; 39 layer-order test cases; mapping, to-SAM coverage and audit docs | +| `adcad2f` | Revision 11 evidence (`revision-11/`) and this record | +| `8edf793` | **Revision 12:** S07 §5.2 (amendment U1) in `Compare/OsComparison.cs` (`OpaqueRole`, `UnusedOpaqueFace`, `OutOfEngineScopeRow`), report schema `/3` in `Report/OsReport.cs`; 23 S09 test cases (`OpaqueFaceScopeTests.cs`) and the updated fixture expectations; material-mapping doc note | +| (record commit) | Revision 12 evidence (`revision-12/`) and this record | + +## Revision 12: S07 §5.2 opaque optical face scope (amendment U1) + +Tested content `8edf793a63b274cafe5e55b9e85fa597d6307a10`. S09 only: `Compare/OsComparison.cs`, `Report/OsReport.cs`, the S09 tests and one +material-mapping doc note. The writer, importer, CLI, shared core (SAM_Tas `c50e9169`, unchanged), linked +`ReadBackExpected.cs`, fixtures and tolerances are unchanged. Evidence: `revision-12/`. + +**Design (OpenStudio-local, on top of the shared evaluation):** +- Every row-3a row is first evaluated by the shared core exactly as before, with no listing. Only an opaque optical row + on a face that `IsExposedOpaqueFace` (revision 8, from SAM and the side) does not name as used is then considered. +- **Face role** (`OpaqueRole`, per panel side). Established only when: the native surface exists and its identity is + verified; the SAM panel's spaces include this space, number one or two and are distinct; its type has an opaque + boundary (not Undefined, Shade, SolarPanel, Air); it is not both two-sided and adiabatic or a ground type; the native + Outside Boundary Condition is exactly the SAM boundary (Outdoors, Surface, Ground, Adiabatic: an adiabatic panel + written as Ground, a ground preprocessor, other-side coefficients or a Foundation are not read as one); the native + construction has one layer per SAM layer; and, interzone, the partner surface exists, names this surface back and + holds this construction reversed. A missing surface, construction or unverified identity gates on its own rows; every + other failure is named as `Unsupported` "optics role: : " (BLOCKED technical at least). +- **Row** (`UnusedOpaqueFace`). OUT-OF-ENGINE-SCOPE only when the role is established, the SAM layer is an opaque + material and the native layer an opaque `Material`, the SAM value is authored (S-VALUE, or S-ZERO) and the native value + read, both in [0, 1], and the shared outcome is a numeric comparison (MATCH, WITHIN-TOLERANCE, OUT-OF-TOLERANCE) + without another trigger. A mismatch qualifies whatever the native value is. Otherwise the shared, gated result stays, + with "Not OUT-OF-ENGINE-SCOPE (…): " appended; an out-of-domain SAM value is INPUT-INVALID (S-INVALID, BLOCKED + technical) and an out-of-domain native value EXPORT-DEFECT (FAIL), never compared. +- **Gate.** The OUT-OF-ENGINE-SCOPE result stays in `Results` (coverage is unchanged) marked informational through the + shared `QuantityResult` flag, so the shared gate does not count it. Every other result gates exactly as before; + `Consistency`, `Unsupported` and fixture criteria apply as before; PASS still needs every gating result in the + allow-list and complete coverage. +- **Report** (schema `s09-readback-report/3`). `CountByOutcome` counts each result once, an S07 §5.2 row as + `OutOfEngineScope` (never as its numeric MATCH or OUT-OF-TOLERANCE). `NonPass` and the new `GatedNonPass` hold only + gating results. `OutOfEngineScope` holds the amendment, the count, the differing and equal counts, counts by scope and + by property, and every row (key, side, layer of layer count, property, SAM face, SAM material, native object, SAM + value, native value, |d|, the shared numeric verdict, `Differs`, scope reason, amendment). `report.txt` adds both + counts to its first line and an OUT-OF-ENGINE-SCOPE block (12 rows shown, the rest in JSON), apart from NOT PASS. +- **Decision for review:** the S09-only OS-MAT-SINGLE-SIDED listing is removed, not kept for rows that cannot be + excluded. S07 never listed it, and U1 replaces it; so an unused-face row whose role is undeterminable and whose values + differ is OUT-OF-TOLERANCE (FAIL), beside the named role problem. +- **Decision for review:** a native value of exactly 0 against an authored non-zero value stays the shared EXPORT-DEFECT + ("abs never turns a zeroed native object into a pass"); it does not occur on the fixtures. + +**Fixture results** (S09 test session at `8edf793`; `revision-12/box-report-approved.txt`, `two-report-approved.txt`): + +| Fixture | Revision 11 (exit) | Revision 12 (exit) | Coverage | Outcomes (revision 12) | Out-of-engine-scope | +|---|---|---|---|---|---| +| `s08-fix-box` | BLOCKED owner (12) | **PASS (0)** | 319/319 | Match 183, WithinTolerance 26, AcceptedTransformation 4, NotApplicable 1, OutOfEngineScope 105 | 105: 69 differing, 36 equal; buried 102, ground outer 3 | +| `s08-fix-two` | BLOCKED owner (12) | **PASS (0)** | 592/592 | Match 319, WithinTolerance 42, AcceptedTransformation 14, NotApplicable 1, OutOfEngineScope 216 | 216: 138 differing, 78 equal; buried 204, ground outer 6, interzone outer 6 | + +- Changed distribution: the 69 / 138 MAPPING-DIFFERENCE rows are now the differing OUT-OF-ENGINE-SCOPE rows (the same + keys). The 36 / 78 equal rows (box Match 30 + WithinTolerance 6; two-zone 60 + 18) are unused faces too, so they move + from MATCH/WITHIN-TOLERANCE to OUT-OF-ENGINE-SCOPE. Every other count is unchanged. +- `report.txt` SHA-256 (byte-identical in both test sessions): box `868a5808d4cc1a96513e54b8189e647c8f45f4375b058a940ac1dee719b959fe`, + two-zone `9e3a3f0ed0e2fd6d8703154a0cb71a69ffa10344d1e4e253c29886840a6c466d`. Against `revision-9/` only the first two + lines and the NOT PASS block (replaced by the OUT-OF-ENGINE-SCOPE block) differ. `report.json` differs per run + (process identities, times, OSM handles). +- Example row (box, ground floor): `layer1.internalEmissivity: SAM 0.87, native 0.95, |d| 0.07999999999999996 (OutsideTolerance); + buried layer face (layer 1 of 3, SAM internal face); SAM 'FIX_Concrete'`. + +**Tests** (`OpaqueFaceScopeTests.cs`, 23 cases; each runs the CLI export, fresh-process read and compare): + +| Test | Required | +|---|---| +| `EveryUnusedFaceRow_IsOutOfEngineScope_WithBothValuesAndItsReason` (both fixtures) | the OUT-OF-ENGINE-SCOPE keys are exactly the unused faces derived in the test from raw SAM; values, difference, side/layer, reason, amendment and counts by scope as derived; the differing rows are exactly the single-sided set (69 / 138), equal rows > 0; none in NonPass; `report.txt` lines | +| `BothFixtures_HaveCompleteCoverage_AndPassWithTheUnusedFaceRowsInformational` (changed, both) | 319 / 592 required and results, Complete, PASS exit 0, no MappingDifference, counts sum to results | +| `AWrongOutdoorFaceValue_Fails…` | Render absorptance: exactly the outdoor-face rows FAIL; the same object's buried face stays informational | +| `AnInterzoneZoneFaceError_Fails…` (both directions) | the zone face FAILs; the partner's interzone outer face stays informational with the new value | +| `AWrongBuriedLayerThickness_Fails…` | exactly that layer's thickness rows FAIL (plus 3b at most); scope count unchanged | +| `AnInformationalRow_NeverMasksAGatedDefect` (conductivity two-zone, return air box) | FAIL exit 10, counts unchanged, blockers and informational rows disjoint, both blocks in `report.txt` | +| `AnAuthoredZeroOnAnUnusedFace_IsAValue…` | EPS internal emissivity 0 (differing) and both light reflectances 0 (equal, Identical): OUT-OF-ENGINE-SCOPE, PASS | +| `AnInvalidNativeValueOnAnUnusedFace_IsNeverExcluded` (NaN, blank, `abc`, 1.25) | exactly the two EPS solar rows gated: EXPORT-DEFECT FAIL, or UNVERIFIED BLOCKED technical; named "Not OUT-OF-ENGINE-SCOPE" | +| `AnInvalidSamValueOnAnUnusedFace_IsNeverExcluded` (absent, NaN, 1.4) | the one row gated: EXPORT-DEFECT FAIL, or INPUT-INVALID BLOCKED technical (exit 11) | +| `AnAdiabaticWall_HasItsOuterFaceOutOfEngineScope` (control) | adiabatic outer face rows (3) informational; PASS | +| `AFaceRoleThatCannotBeEstablished_IsNeverExcluded` (ground preprocessor, adiabatic written as Ground, interzone not mirrored, partner missing, adiabatic interzone) | each side named "optics role", none of its rows informational, never PASS | + +Changed existing tests (pre-U1 expectations only): the fixture test above; `Unexplained` is now every gating non-PASS +item; `AnAuthoredZero…`, `TheBoundarySplits…` and the single-layer ground floor now expect PASS; `AnUnstatedP…` +(BLOCKED owner) also checks the unchanged scope count; the used-zone-face test also checks the rows gate. All other +revision 1-11 tests, including every negative, are unchanged. + +**A/B** (`revision-12/ab-pre-u1.txt`): the adcad2f library on the U1 test session's runs, with the same harness. +- Fixtures and valid variants: pre-U1 BLOCKED owner (12) on the MAPPING-DIFFERENCE listing, or FAIL (10) for the authored + zero (S-ZERO was never listed); U1 PASS (0). +- Adiabatic written as Ground, interzone partner missing, adiabatic interzone panel and an out-of-domain SAM value: + pre-U1 BLOCKED owner (12), hidden in the listing; U1 named and gated, FAIL (10) or BLOCKED technical (11). +- Used-face, thickness, conductivity, lighting and invalid-native cases: FAIL or BLOCKED under both, same exit. + +**Not covered:** whether EnergyPlus 25.1 reads only these faces is S07's premise (revision 8 optics table), not +re-verified here (no engine run); Material:NoMass and AirGap layers (their optics are unreadable to S09, so they stay +BLOCKED technical); a model with a native exact-zero reflectance on an unused face; used-face out-of-domain SAM optics +(compared numerically as before; U1 keeps used faces "as today"). + +## Revision 11: opaque multi-layer layer order on import (owner-approved proposal) + +Tested content `f5f207b456a3e7e2429ead4054c779031615e2b7` (commits `37841ea`, `5241bdd`, `f5f207b`). Importer only +(`ToSAM/Construction.cs`, `ToSAM/Panel.cs`, `ToSAM/AnalyticalModel.cs`, `Classes/OpenStudioImportContext.cs`, plus the +import code `SAM-OSI-CON-002`); the writer, S09, revision 10, lighting, ventilation and the single-layer safeguards +(SAM-OS-MAT-003) are unchanged. + +**1. Layer order** (`ToSAM_Construction`, `ConstructionUse`): +- An opaque layered `OS:Construction` that a planar surface uses (directly or through a default construction set) is + read innermost layer first, so SAM's first layer is the one facing that surface's zone; thicknesses and material + references stay with their layers. +- Unchanged, in OpenStudio's order: fenestration constructions (glazing or gas layers, or SAM type + `ApertureConstruction`, which covers SAM-written door panes), constructions used only by subsurfaces (unstamped opaque + door panes, `ResolveApertureConstruction`) or shading/interior-partition surfaces, constructions no surface uses, air + boundaries and non-layered constructions (placeholders). +- A construction used by planar surfaces **and** by a subsurface or shading surface is split: the surfaces get the + innermost-first SAM construction (its SAM Guid restored), the other uses a separate SAM construction in OpenStudio's + order with a new Guid, and information SAM-OSI-APX-001 says so (`SurfaceConstructionMap`, read first by + `Panel.ResolveConstruction`). + +**2. Orientation** (`ResolvePanel`, `IsSamForwardSide`, `ResolveUnpairedInterzoneSurfaces`, `OrderSpaces`): +- SAM's face roles are relative to a panel's first space, so reading the layers is not enough: an interzone panel must + also be built from the side the writer gave the forward construction. A panel is now built from the surface whose + construction is SAM-written forward (SAM type `Construction` with a SAM Guid; the reverse construction carries no + stamp) when only its partner carries it; otherwise from the first surface visited, as before. A geometric-fallback pair + keeps the panel built from the forward side. +- **Deviation from proposal point 2 (space order).** The proposal relied on the importer's visit order. The writer + takes a panel's first space as the earlier of its spaces in the cluster's global space order (`FirstSpace`), and + OpenStudio returns spaces in handle order, so with the authored second space visited first the forward side would be + re-exported on the wrong side (found by the geometric-fallback test, B first). The importer now adds spaces in a + stable topological order of the visit order in which each panel built from a forward side has its space first. In an + unedited SAM-written model such an order always exists (the authored one satisfies it); a contradiction (only an + edited model) keeps the visit order for the spaces involved, with a warning. +- A two-sided panel that is not SAM-written and whose building side is then second (a mixed stamped/unstamped model) + is re-read from its partner surface's construction (innermost first from the earlier space; information + SAM-OSI-APX-001). So is a SAM-written panel whose forward side a contradiction leaves second. Unstamped models have no + forward sides, so their order is the visit order and nothing is re-read. + +**3. Fail closed** (`VerifySurfaceFaces`, `Snapshot`, `WrittenAbsorptances`; new error **SAM-OSI-CON-002**; owner +instruction 2026-10-22 after the first revision-11 draft reported this case as a warning only): +- SAM face roles are relative to a panel's first space. A re-read, or any unstamped construction that places + face-stamped objects in other positions, can therefore make the writer put a material's other authored face on an + exposed side. With divergent Brick, the draft's re-read half re-exported its zone face as 0.5 / 0.4 / 0.4 instead of + the native 0.9 / 0.7 / 0.7. +- Every imported opaque surface panel is now checked against managed snapshots of its native surfaces taken during the + model walk: + - its first space's surface must hold the SAM layers innermost first, and a second side their mirror; + - the absorptances the writer would put on every face EnergyPlus uses must equal the native ones (thermal, solar and + visible, 1e-9). These are both zone faces of an interzone panel, plus the zone face and the outdoor face of an + outdoor surface. The writer's value for the zone-face role is the Internal* value where stated, otherwise the + External* value; every other role takes External*; OpenStudio's default applies where neither is stated. +- A mismatch raises **error SAM-OSI-CON-002**, naming the panel, construction, face and values, and the import returns no + model (`Successful` false). It is never a warning-only success. +- Valid cases still succeed: SAM-written models, unstamped native models (single-valued materials), equal-face edited + and mixed models, and a re-read that provably keeps every face. +- Native layers that are neither standard nor massless opaque materials (unsupported families) are not compared; they + carry their own diagnostics. +- The contradiction warning (spaces kept in visit order) stays. The panels it affects are re-read and pass or fail this + check. + +**4. Per-layer consistency of both sides** (`SurfaceFaces.Physical`, `Physical`, `ComparePhysical`; commit `4ea2e6c`; +the independent review of `89a2216`, P1): +- **Gap.** The snapshot recorded layer names only, and the check compared the native names translated to SAM names. + Face and thickness objects of one source material merge into one SAM material, so their names lose the distinction. +- **The review's reproduction.** On the reverse side only, the sandwich's 12.5 mm Plasterboard was replaced by a 20 mm + copy with the same source and face metadata. The import succeeded, and the re-export had 12.5 mm on both sides. +- **Fix.** + - The snapshot now records, per layer, the thickness, conductivity, density and specific heat of each + StandardOpaqueMaterial. + - Both sides are compared in their own direction with the panel's SAM layers: the first space's surface reversed + (innermost first) and the second as stored. The comparison covers each layer's thickness and the SAM material's + thermal properties, with a relative tolerance of 1e-9. + - A mismatch adds a SAM-OSI-CON-002 problem naming the layer, side and values; the import returns no model. Example: + "layer 2 ('Reviewer_Plasterboard_20mm') of the surface in space B is 0.02 m thick but the SAM layer is 0.0125 m". +- **Unchanged.** + - Source merging (merging still happens; one SAM layer per position, with its own thickness). + - Massless and air-gap layers, which keep their nominal-thickness import and are matched by material only. + - Valid mirrors, one material twice at two thicknesses, and one material at different thicknesses in unrelated + constructions, all of which still import. +- **Observation (pre-existing, not changed by instruction).** An imported AirGap layer has thickness 0: `LayerThickness` + finds no nominal thickness for it, and `ToSAM_AirGap` is unchanged since the base. So a re-export of an imported + cavity wall is refused by the writer (SAM-OS-CON-001 "no usable thickness"). The new cavity control therefore + asserts the import only. + +**Compatibility (no automatic migration).** Every imported multi-layer opaque construction now has the opposite SAM layer +order to an import made before revision 11. The U-value is unchanged; layer positions, the thermal-mass position and the +exposed faces change, which is the correction. Interzone panels of SAM-written models now keep their authored first +space and the space order can differ from earlier imports. SAM models imported before revision 11 keep their reversed +constructions: nothing identifies them afterwards, and no migration is made; re-importing the source OSM corrects them. +A construction shared by surfaces and shading or door uses becomes two SAM constructions (reported). Recorded in +`docs/SAM_OPENSTUDIO_MATERIAL_MAPPING.md` and the to-SAM coverage manifest (`OS:Construction.Opaque`). + +**Tests** (`M4/OpaqueLayerOrderImportTests.cs`, new, 39 cases). Each round trip compares, per surface (keyed by absolute +centroid, normal, type, boundary and area), the layers' thickness, conductivity, density and specific heat outside +first and the thermal, solar and visible absorptances of both used faces, before export-import and after re-export. + +| Test | Required | +|---|---| +| `AMultiLayerRoundTrip_KeepsLayersThicknessesAndBothUsedFaces` (edited 0.42 / unedited; review reproduction) | SAM layers Plasterboard 0.0125, Insulation 0.1, Brick 0.1; wall Guid restored; re-export valid, outside first Brick, Insulation, Plasterboard_Internal, zone face 0.42 / 0.7; every surface signature unchanged | +| `AnInterzoneMultiLayerRoundTrip_KeepsTheFirstSpaceAndBothSides` (both space orders × edited / unedited) | the shared panel's and the cluster's first space is the authored one; Insulation, Plasterboard, Brick; forward Guid; signatures unchanged | +| `AGeometricFallbackPair_KeepsTheForwardSide` (both space orders) | adjacency handles blanked in the OSM; one ADJ-001; authored first space; signatures unchanged | +| `AnUnstampedNativeModel_RoundTripsItsLayersAndUsedFaces` (box; two boxes, both orders) | every SAM AdditionalProperties removed; innermost first; the shared panel faces its first space; signatures unchanged | +| `AMixedModelWhoseUnstampedHalfIsReRead_KeepsItsUsedFaces_OrFailsNamed` (6: both authored orders × {divergent, north reverse on the new first space}, {divergent, north forward there}, {equal faces}) | placed from the exported model's visit order, so deterministic: the stamped south forward on the space visited second, the north unstamped; one APX-001 re-read. Divergent with the reverse there: **one SAM-OSI-CON-002 error naming the north half, `Successful` false, no model**. The other two: success, both halves from that space, signatures unchanged | +| `ContradictoryForwardSides_KeepTheUsedFaces_OrFailNamed` (4: both orders × divergent / equal) | both halves stamped, forward sides on different spaces: one contradiction warning and one re-read; divergent: one CON-002, unsuccessful; equal faces: success, signatures unchanged | +| `AnUnstampedConstructionWithAFaceObjectInTheOtherRole_FailsNamed` / `…WithEqualFaceObjects_Succeeds` | an edited single-sided wall with Brick's external-face object on the zone face: CON-002, unsuccessful; the same edit with equal faces: success, signatures unchanged | +| `AnInterzoneSideWithAnotherLayerThickness_FailsNamed` (review of `89a2216` reproduction, on the reverse or the forward side) | a 20 mm copy of the 12.5 mm Plasterboard with the same source metadata on one side only: one SAM-OSI-CON-002 naming the mismatched layer and both thicknesses, `Successful` false | +| `ARepeatedMaterialAtTwoThicknesses_RoundTrips` (both space orders) / `ARepeatedMaterialWithSwappedThicknessesOnOneSide_FailsNamed` | Plasterboard 12.5 mm, Insulation, Plasterboard 20 mm interzone: valid mirror round-trips; the two Plasterboard objects swapped on one side (names still match in order): CON-002, no model | +| `OneMaterialAtDifferentThicknessesInUnrelatedConstructions_RoundTrips` (box roof, interzone wall) | Plasterboard 12.5 mm in the walls and 15 mm elsewhere: one merged SAM material, each layer its own thickness, round trip unchanged | +| `AnInterzoneCavityWall_KeepsItsAirGapImport`, `AMasslessInterzoneLayer_KeepsItsDocumentedImport` | air gap at its pre-existing 0 thickness, massless at 25 mm nominal with its APX-001 note: imports succeed, no CON-002 | +| `ASingleLayerRoundTrip_IsUnchanged` | single-layer floor unchanged | +| controls: glazing (asymmetric 6/12/4 mm panes), unstamped opaque door pane, shading-only construction, air boundary, F-factor floor | OpenStudio order / layer-free / placeholder exactly as before; the same model's walls innermost first | +| `AConstructionSharedByWallsAndAShade_IsSplit_AndReported` | walls innermost first with the Guid; shade OpenStudio order, other Guid; one APX-001; signatures unchanged | + +All 432 existing writer/importer cases passed with the change before these tests were added: none asserted the old +order. Two comments in `OpaqueFaceOpticsTests` that described the defect as open are updated. + +**A/B** (`revision-11/test-summaries.txt`): see "Tests and validation". + +## Revision 10: group membership and shared equal-face edits (review of `806d5449`) + +Tested content `78f10146481dbd4fe46af8761813fa4f9d58d357`. Importer only (`ToSAM/MaterialLibrary.cs`, +`Classes/OpenStudioImportContext.cs`); the writer, SAM-OS-MAT-003, S09 and glazing are unchanged. The review +(`REVISION-9-REVIEW.md`, machine-local with its `revision-9-probe`) confirmed revision 9's corrections and reproduced two +P1 importer defects. + +**1. A malformed member silently inherited a valid group's material** (`Convert.ToSAM(Material)`, `MergedOpaqueMaterial`): +- Before: an object carrying a group's `SAM.MaterialGuid` and any `SAM.MaterialFace` value was mapped to the group's + merged material without being validated; the group itself had silently dropped it. The reviewer's third object + (face `BROKEN`, conductivity 9) imported with the Plasterboard group's 0.25 and no diagnostic. +- Now the object is validated (`ReadFaceObject`, silent) before any group lookup, and the merged material is returned + only when the object's OpenStudio handle is one of the group's validated members (`OpaqueMaterialGroups` holds + `(Material, Members)`). A malformed or inconsistent object takes the independent path: its own thermal properties, its + single native value on both faces, and its own warning (SAM-OSI-ID-001 identity, SAM-OSI-MAT-001 values), which now says + it "is imported as its own material, never merged with others of its source". The result does not depend on import + order. A well-formed object with other thermal properties is a conflict of the whole group, as in revision 9. + +**2. A shared equal-face edit was kept on one face** (`FaceObject.Faces`, `Carries`, `ServedFaces`, `DivergentAuthoredOptics`): +- Before: an edit was kept only on the face stamped on the object. The writer writes no internal variant for a material + whose faces agree, so one `External` object supplies every layer position, including both faces of a single-layer + construction; the reviewer's edit (visible absorptance 0.6 → 0.42) imported as internal 0.4 / external 0.58 and made + the re-export a SAM-OS-MAT-003 error on five outdoor surfaces. +- Now an edit is kept on every SAM face the object supplies. The writer's contract decides where it can: an `Internal` + variant supplies the zone face; an `External` object of a material whose authored faces differ (an internal variant + exists for its zone faces) supplies the external face. For an `External` object of a material whose faces agree, the + faces come from the constructions using it as outermost or innermost layer: a SAM-written opaque construction (SAM type + `Construction`, the forward one) has the zone face last and the outer face first; an unstamped construction that + mirrors a SAM-written one is its reverse and adds nothing; a SAM-written fenestration construction (door pane) supplies + the external face; any other construction's direction is unknown, so its exposed position supplies both. An object in + no exposed position keeps the edit on the external face and on each internal face SAM states, so no asymmetry is + invented and an unstated internal value keeps inheriting. +- The merge compares, per face, the objects that supply it. The edit warning says why a shared object's edit reaches the + zone face ("its material's faces agree and this shared object supplies the zone face and the outer face"). +- Not changed: the single-layer differing-face refusal, distinct variants of differing faces, unedited imports. + +**Tests** (`M4/OpaqueFaceOpticsTests.cs`, 53 cases, was 30): + +| Test | Required | +|---|---| +| `AMalformedObjectOfAMergedSource_IsImportedOnItsOwn_NeverAliasedToTheGroup` (face / identity / optic / written × both orders; review reproduction) | third object: own name, conductivity 9, density 1000, specific heat 1200; exactly one warning, naming it, "never merged"; the valid pair still one material (0.25, both faces) | +| `AMalformedObjectOfAMergedSource_KeepsItsOwnProperties_InAWholeModelImport` (face, identity) | the third object used as the floor's single layer; whole-model import keeps it separate with its own properties; one Plasterboard | +| `AConsistentlyStampedObjectWithOtherThermalProperties_StopsTheMerge` (both orders) | three materials; one "thermal properties differ" warning naming the third; conductivity 9 kept | +| `TheValidPair_MergesInEitherImportOrder` (control) | one material, both faces, no warning | +| `AnEditOfASharedEqualFaceSingleLayerObject_IsKeptOnBothFaces_AndReexportsValid` (review reproduction) | internal and external light reflectance 0.58; solar unchanged 0.4; two warnings; re-export valid, no SAM-OS-MAT-003, visible absorptance 0.42 | +| `AnUnchangedSharedEqualFaceSingleLayerObject_KeepsItsAuthoredFaces_AndReexportsValid` (control) | no warning; 0.4 / 0.4; re-export valid, 0.6 | +| `AnEditOfASharedEqualFaceInterzoneSingleLayerObject_IsKeptOnBothFaces` (both space orders) | both solar reflectances 0.55; no SAM-OS-MAT-003 on re-export | +| `AnEditOfASharedEqualFaceMultiLayerObject_IsKeptOnTheFacesItsPositionExposes` (Plasterboard zone face, Brick outer face, Insulation middle) | internal only / external only (other face 0.4) / both; one warning per face | +| `AnEditOfASharedEqualFaceInterzoneMultiLayerObject_IsKeptOnItsFirstSpaceFace` | the first space's zone-face layer: internal 0.58, external 0.4 (reverse construction mirrored) | +| `AnEditOfADivergentMaterialsExternalObject_StaysOnTheExternalFace` (asymmetry control) | Brick external 0.58, internal authored 0.6 | + +The multi-layer cases assert the import only: their re-export is affected by the layer-order defect below. + +**A/B** (`revision-10/test-summaries.txt`): with `ToSAM/MaterialLibrary.cs` and `OpenStudioImportContext.cs` of +`806d544` restored, exactly the 16 defect regressions fail and the 7 control cases pass (Brick outer face, valid pair, +thermal conflict, unchanged, divergent). The reviewer's probe, run unchanged against the revision-10 binaries +(`revision-10/probe-output.txt`), gives `MALFORMED importedConductivity=9` with the named warning and +`EQUAL_FACE afterValid=True`; its `ROUNDTRIP` lines are unchanged (the layer-order defect). + +**Still open (confirmed, not changed):** the multi-layer layer order on import (below). The original multi-layer +re-export requirement is **not** closed by the single-layer controls. + +## Opaque multi-layer layer order on import: correction proposal (approved and implemented in revision 11) + +Owner approval (2026-10-22): implement this proposal as revision 11 in this PR. What was built, including one +deviation from point 2 (the space order), is under "Revision 11". The proposal text below is kept as written. + +**Defect (pre-existing, confirmed by the review of `806d5449`).** `ToSAM/Construction.cs:25-27` says outside-first import +preserves a round trip; the loop at `:161` appends the native layers in OpenStudio order. SAM stores layers inside → +outside and the writer reverses them for the forward construction, so an imported multi-layer opaque construction is +reversed. The reviewer's probe: Brick → Insulation → Plasterboard_Internal (outside → zone) re-exports as +Plasterboard → Insulation → Brick_Internal; the edited zone face (visible absorptance 0.42) is lost and Plasterboard is +back to 0.7. Single-layer constructions are unaffected. + +**Proposed change (one revision, opaque only, owner approval needed first):** +1. In `ToSAM_Construction`, for an opaque layered `OS:Construction` only, build the SAM layers from the native layers in + reverse order (innermost first). Fenestration constructions (glazing or gas layers, or SAM type `ApertureConstruction`, + which includes opaque door panes), air boundaries and non-layered constructions keep today's path. Correct the + comment at `:25-27`. +2. Orientation: SAM's first layer faces the panel's first space, and a native construction's last layer faces the zone + of the surface using it. The importer builds a panel and resolves its construction from the first-visited surface, + and relates spaces in visit order (`ToSAM/AnalyticalModel.cs` pass D), so the panel's first space is that surface's + space. The change relies on this; a test pins it. No geometry, normal or space-order change is proposed; the + geometric-fallback pairing keeps the first surface's panel and must be covered by the same test. +3. Both interzone sides: the forward and reverse native constructions already import as two SAM constructions; after + the reversal each reads correctly from its own surface, and the panel uses the one of its constructing surface. For a + SAM-written model the panel is built from the first space's surface (forward construction, SAM Guid restored), so the + re-export writes the same forward/reverse pair. The duplicate reverse SAM construction is pre-existing and not changed. +4. Layer references and face metadata: the zone-face object (`_Internal` variant or shared object, native last) becomes + SAM layer 0 again, so the writer puts it back on the zone face. Material import and revision 10's served faces read + native positions and are unaffected. Layer thicknesses stay per layer. +5. Native third-party models: EnergyPlus layer order is outside-first for every construction, so the reversal is + correct for them too; models without SAM metadata change in the same way. +6. Compatibility: every multi-layer opaque import changes layer order (U-value unchanged; layer position, thermal + mass position and face optics change, which is the fix). SAM models imported before the fix hold reversed + constructions and cannot be identified afterwards; no migration is proposed. Consumers that re-export imported + models (OpenStudio or Tas) change accordingly. A Summary information diagnostic is not proposed. +7. Unchanged exclusions: glazing and pane constructions (StandardGlazing, Gas, SimpleGlazing, door panes) go through the + same layer loop and may share the reversal; their Front/Back mapping and pane order are excluded here and need their + own review and decision. Shading constructions, S09, the writer, Tas and the roadmap are not touched. +8. Tests: the reviewer's multi-layer round trip (layers and the 0.42 zone face survive); two boxes in both space orders + (both sides of the shared multi-layer wall); an unstamped native multi-layer OSM (SAM innermost first, re-export + identical native order); single-layer and fenestration/door unchanged controls; the S09, writer/importer and benchmark + suites (Simulation excluded). No engine is needed. + +Recommended: Opus, high effort, a separate revision or PR after owner approval, Build mode (the design above is bounded; +the risk is in orientation edge cases, which the tests pin). + +## Revision 9: native edits, merging by source identity, inherited faces (review of `901e592a`) + +Tested content `354e5322fa3a4c31a984de911c48534e768c40e4`. + +**1. Native edits** (writer `Material.StampOpaqueFaces`; importer `MaterialLibrary.ReadFaceObject`, `ApplyEdits`): +- Every opaque object now also records what was written: `SAM.Written.ThermalAbsorptance`, `.SolarAbsorptance`, + `.VisibleAbsorptance` (including inherited values and OpenStudio defaults). +- On import each absorptance is compared with its written value (or, for revision-8 objects without the record, with + the authored face it came from). Unchanged: exactly the authored values, so an unchanged default stays unstated. + Changed: an edit, kept as the SAM value of the face the object carries (internal for an `_Internal` object, external + otherwise), with warning SAM-OSI-MAT-001 naming what was written and what is there now. The other face keeps its + authored value. No record at all: the value is kept as an edit of unknown provenance, reported the same way. +- Inconsistent metadata (a written value that disagrees with its authored source) is warned and the single native + value is imported on both faces, as in revision 8. +- Revision 8 treated a changed stated value as untrusted metadata (single native value on both faces) and ignored a + changed unstated one; the reproduction lost the edit (A/B below). + +**2. Merging by source identity** (`MaterialLibrary.MergedOpaqueMaterial`, `OpenStudioImportContext.OpaqueMaterialGroups`): +- All usable objects carrying the same `SAM.MaterialGuid` (face variants and thickness variants) become one SAM material. + Its Guid is restored from the object that carries `SAM.Guid`; its name is that object's; construction layers reference + it at their own OpenStudio thickness. +- They merge only when thermal properties (conductivity, density, specific heat) agree, the authored face optics agree, + and, per face, every object resolves each optic to the same value (its edit, else the authored value). Otherwise + warning SAM-OSI-ID-001 names the conflict and each object is imported on its own (with its own edits). +- An object without `SAM.MaterialFace`/`SAM.MaterialGuid` is never merged, whatever its name. + +**3. Inherited zone-face values** (writer `Material.InheritedInternalOptics`; new code SAM-OS-MAT-004): +- When SAM's first layer lacks an Internal* value (absent or NaN) whose External* is stated, the external value is + written on the zone face (as before) and **information SAM-OS-MAT-004** is raised once per material, Summary detail + (`GetDiagnosticDetail`, pinned in `DiagnosticDetailTableTests` and `DiagnosticsAdapterTests`). +- The inherited value is not stamped as authored, so import keeps the internal value unspecified. +- S09 now reads a NaN SAM layer value as unstated (S-UNSPEC), like an absent one. S07 lists no default for an internal + face, so a native value where SAM states none is an EXPORT-DEFECT (FAIL) on exactly those zone-face rows: the + inheritance is declared by the writer, not accepted by S07. The S09 fixtures state every internal value: no MAT-004 + and byte-identical reports. + +**Tests** (writer/importer `M4/OpaqueFaceOpticsTests.cs` 30, was 21; S09 2 new): + +| Test | Required | +|---|---| +| `ANativeEditOfAnUnstatedValue_IsKeptAndReported_ThroughImportAndReexport` (review reproduction) | internal light reflectance 0.58 imported, external unstated, one MAT-001 warning "written 0.7, now 0.42"; re-export zone face 0.42 | +| `AnUnchangedDefault_StaysUnstated_ThroughImportAndReexport` (control) | no warning; unstated; re-export 0.7 | +| `AnEditOfAStatedValue_IsKeptOnItsFace_AndReported` | internal 0.55, external authored 0.5 | +| `FaceAndThicknessObjectsOfOneSource_MergeIntoOneSamMaterial_KeepingLayerThicknesses` | one material, source Guid, both faces; layers at 0.0125 and 0.015 | +| conflicts: thermal / authored optics / edits on one face | one SAM-OSI-ID-001 naming the conflict; not merged | +| `AnObjectWithoutSourceIdentity_IsNeverMergedByName` (control) | two materials; the unstamped one keeps its single value | +| `AnUnstatedInternalValue_IsReportedAtSummary_AndKeepsItsUnspecifiedProvenance` (absent, NaN) | one MAT-004 at Summary; external value written; not stamped; imported unstated | +| `StatedInternalValues_RaiseNoInheritanceNote` (control), `EveryOpaqueObject_RecordsWhatWasWritten` | no MAT-004; written stamps equal the object | +| S09 `AnUnstatedZoneFaceValue_KeepsItsUnspecifiedProvenance` (absent, NaN) | MAT-004 in the writer diagnostics; exactly the 5 Plasterboard zone-face light rows S-UNSPEC EXPORT-DEFECT; Screed zone face passes | + +The two re-export tests read the single-layer ground floor (one layer, the zone face in either order) because of the +round-trip limit below. + +**A/B** (`revision-9/test-summaries.txt`): with `Material.cs`, `MaterialLibrary.cs`, `OpenStudioImportContext.cs` and +`OsComparison.cs` of `901e592` restored, 9 of the 30 face-optics tests and both S09 provenance cases fail. The +reproduction fails exactly as reviewed (internal light reflectance unstated after import). The controls pass under both. + +**Found, not fixed (pre-existing; outside the review's three items):** `ToSAM/Construction.cs` keeps OpenStudio's +outside-first layer order and says this survives a round trip, but the writer reverses SAM's inside → outside order, so +an imported multi-layer construction is reversed and a re-export puts its outermost layer on the zone face. Fixing it +changes import orientation for every model and needs its own decision and task. + +## Revision 8: the opaque face-optics correction + +Tested content `fc83a6df1f843f82a043353616a2b4e42a94e6d6`. Revision 7's commits and evidence stay in history; its acceptance code is removed. + +**Verified findings (code and the revision-7 IDF; no engine run):** +- SAM stores layers inside → outside. The writer gave every opaque layer the External values, and one material object + per (material, thickness) served every construction and position. +- The forward construction goes to the first space's side of an internal panel (and every single-sided surface), the + reverse to the second; in the IDF they share material objects in mirror order. OpenStudio translation adds nothing. +- The writer and S09 both take "first space" from `AdjacencyCluster.GetSpaces()` order (S07 section 1). +- EnergyPlus uses only the outermost layer's outside face and the innermost layer's zone face; an interzone outside face + is the other zone's inside face, and ground/adiabatic outside faces carry no optics (I/O Reference, as cited in the + optics table; not run). +- Before revision 8, only one opaque object per SAM Guid carried `SAM.Guid`, and import wrote the single value on both + faces. + +**Writer** (`Material.cs`, `Construction.cs`, `AnalyticalModel.cs`; codes and keys in `SAM.Core.OpenStudio`): +- SAM's first opaque-construction layer is built with `internalFace`: when the material's Internal* optics differ, an + internal-face variant (cache key `Guid:thickness:Internal`, name `…_Internal`) carries them; an unstated Internal* + keeps the External* value. Every other layer is the external-face object. The face follows SAM layer position, so + forward and reverse constructions share objects. +- Single layer (checked in pass D for each panel use before any construction is converted or reused): differing faces + on any boundary other than ground/adiabatic, or on a two-sided panel, raise **error SAM-OS-MAT-003** naming the + construction, boundary and properties; no construction is assigned, so `IsValid` is false. No substitute is written. +- Orientation: `ForwardSideProblem` refuses a panel whose first converted surface is not its first space's side (error + SAM-OS-ADJ-001, no construction, never swapped). +- Every opaque object from a SAM opaque material carries `SAM.MaterialGuid`, `SAM.MaterialFace` and each stated + `SAM.Optic.` in `OS:AdditionalProperties` (no EnergyPlus input changes). +- The SAM-OS-MAT-002 "external values govern both sides" line now appears only for opaque door panes. + +**Importer** (`ToSAM/MaterialLibrary.cs`): with face metadata, exactly the stamped authored values are set on both +faces (unstated ones stay unset). The metadata is trusted only if well formed, consistent with any `SAM.Guid` on the +object, matching the object's own absorptances for its declared face, and identical across face objects of the same +source Guid; otherwise a warning (SAM-OSI-ID-001 identity, SAM-OSI-MAT-001 values) and the single native value on both +faces. No metadata: unchanged behaviour, silent. + +**S09** (`OsComparison.CompareLayers`, `IsExposedOpaqueFace`, `SingleLayerFaces`): the used faces are derived from SAM +and the side alone (innermost layer: SAM internal on the first space's side, SAM external on the other; outermost layer +of an outdoor side: SAM external). A used face is never listed, so a wrong value FAILs. Any other face is listed +MAPPING-DIFFERENCE only when SAM's two faces differ **and** the native value is the layer's other authored face. A +single-layer outdoor or interzone side with differing faces adds a named `Unsupported` entry (BLOCKED technical). +`OwnerDecisions` and the model-hash wiring are removed; `Run` and `compare` are as at revision 6. + +**Fixture results (S09 test runs at `fc83a6d`; `revision-8/`):** + +| Fixture | Status (exit) | Coverage | Outcomes | +|---|---|---|---| +| `s08-fix-box` | BLOCKED owner (12) | 319/319 | Match 213, WithinTolerance 32, AcceptedTransformation 4, NotApplicable 1, MappingDifference 69 | +| `s08-fix-two` | BLOCKED owner (12) | 592/592 | Match 379, WithinTolerance 60, AcceptedTransformation 14, NotApplicable 1, MappingDifference 138 | + +- The MAPPING-DIFFERENCE count is unchanged (69 / 138) but every row is now on a face EnergyPlus does not use: the + 18 / 33 exposed rows pass (WithinTolerance where `1 − (1 − ρ)` is not bit-exact), and the zone-face variants' buried + external rows are listed instead. +- The IDFs differ from revision 7 only in the `_Internal` material names and absorptances and the construction layers + that name them (`revision-8/idf-diff-rev7.txt`). + +**Tests** (writer/importer `M4/OpaqueFaceOpticsTests.cs`, 21; S09 9 new/changed): + +| Test | Required | +|---|---| +| zone face / interzone mirror / first-space order | `_Internal` innermost on every single-sided surface; B side = A side reversed with B's zone face external; space B first → B forward | +| missing first side (unit) | `ForwardSideProblem` names the first space and "never swapped"; null when the first side is present | +| reuse / agreeing faces / metadata | two thermally identical Plasterboard objects; no variant when faces agree; every object stamped | +| single layer | ground and adiabatic use internal values; outdoor (4 walls) and interzone raise SAM-OS-MAT-003, invalid, no construction; per use in both conversion orders; agreeing faces written | +| import | both faces from the variant alone (Guid restored); base and variant; unstated value not invented; edited object, disagreeing objects and mismatched identity each warned; no metadata unchanged | +| S09 `EveryUsedZoneFace_HoldsTheAuthoredFace` | box 18 / two-zone 36 zone-face rows pass, unlisted, none non-PASS | +| S09 `ASwappedZoneFace_Fails_OnExactlyTheZoneFaceRows` | external values on each variant (the old writer): FAIL, exactly 18 / 33 internal zone-face rows | +| S09 `AWrongOpaqueOpticalValue_Fails`, single-layer ground / outdoor roof | FAIL; ground exit 12 with only listed rows; roof SAM-OS-MAT-003, named Unsupported, FAIL | + +**A/B** (8 optics tests; `revision-8/test-summaries.txt`): +- Writer files of `7fccdcc` restored: all 8 fail. The fixtures FAIL (exit 10) with the zone faces OUT-OF-TOLERANCE, no + SAM-OS-MAT-003 is raised, and there is no `_Internal` material to swap. The revision-8 comparator rejects the old + writer on its own. +- Comparator of `8fd0ffc` (revision 6) restored with the revision-8 writer: all 8 fail. It lists used zone faces as + MAPPING-DIFFERENCE, a swapped zone face stays BLOCKED owner (exit 12, hidden), and no single-layer entry is named. + +**Untested or unverified:** EnergyPlus acceptance of the variants and of the missing construction left by +SAM-OS-MAT-003 (no engine run); a realistic model that drops only the first space's side (covered at unit level only); +massless and door-pane opaque layers (unchanged path); the effect on results (nothing simulated). + +## Revision 7: the owner decisions and acceptance reporting + +Tested content `614a7a8d70b6a70c5628a0ef3b57eaec0c5ec794`. Revision 6 (`8fd0ffc2`) passed independent technical review; the owner then took the three +decisions of the advisory note on 2026-10-22. + +**Decisions recorded:** + +| Item | Decision | Bounds | +|---|---|---| +| Optics (OS-MAT-SINGLE-SIDED) | Option 1: accepted as a limitation | The two reviewed fixtures only (`s08-fix-box` `45524172…`, `s08-fix-two` `20da9b58…`). Exposed zone faces differ by ρs/ρv −0.06 and ε −0.01 (Plasterboard) / +0.04 (Screed); 18 / 33 rows, the other 51 / 105 on faces EnergyPlus does not use. **Effect on results unmeasured** (nothing simulated). Never PASS. | +| Ventilation (T-VENT-INACTIVE) | A: the extension to OpenStudio confirmed (Decision 1) | Rows 6 and 8b, under the unchanged S08 owner decision 3 preconditions. Exercised by the two-zone V1/V1 fixture only; no V0 case or per-space override among the fixtures. | +| Lighting | B1: the Decision 5 reading confirmed | OpenStudio applies p₀ to an unstated p with `SAM-OS-IC-002`, claiming nothing outside suspended LED office lighting. **OD-L1 stays open.** No fixture uses the fallback; an unstated p stays DOCUMENTED-DEFAULT, never PASS. The Tas side needs a separate, OD-L1-gated SAM_Tas approval. | + +Ventilation A and lighting B1 confirm behaviour revisions 1–6 already implement; neither changes code or a verdict. + +**Acceptance reporting (`Compare/OwnerDecisions.cs`, `OsComparison.Run`, `Cli/ReadBackRead.cs`):** +- The S08 core already supports owner acceptances (`GateConfiguration.Acceptances`, `OwnerAcceptance` per quantity and + per fixture, with a required decision reference; rank 5). S09 previously passed none, so every report was exit 12. +- `OwnerDecisions.For` returns one acceptance, (`3a`, fixture id, MAPPING-DIFFERENCE, the decision reference), only when + the rule set is Approved **and** the fixture id and the frozen-model SHA-256 are a reviewed fixture's. Otherwise none. +- `compare` passes the model hash from the manifest, which its infrastructure check has already verified against the + run's frozen model, so the acceptance is bound to those bytes. `OsComparison.Run` takes it as an optional argument; + without it no acceptance applies. +- Only rows S09 lists as MAPPING-DIFFERENCE are affected: the internal-side opaque optical rows whose SAM value differs + from the external one. A DOCUMENTED-DEFAULT (an unstated p, OD-L1), every FAIL and every BLOCKED result are unchanged. + A single-valued material's external-face rows still compare the same native value with SAM, so a wrong optical value + fails there. +- The OS-MAT-SINGLE-SIDED Supporting line names the acceptance and its reference when it applies, and is unchanged + otherwise. No report schema, exit code, quantity, tolerance, writer, importer or core change. + +**Fixture results (S09 test runs at `614a7a8`; `revision-7/`):** + +| Fixture | Status (exit) | Coverage | Outcomes | +|---|---|---|---| +| `s08-fix-box` | NOT PASS, accepted limitation (14) | 319/319 | as revision 5; the 69 MappingDifference rows rank 5 | +| `s08-fix-two` | NOT PASS, accepted limitation (14) | 592/592 | as revision 5; the 138 MappingDifference rows rank 5 | + +Against `revision-5/`, each `report.txt` differs only in its status line and in the "accepted by the owner (reference); +this is not a pass" reasons of the listed rows. + +**New S09 tests (5):** + +| Test | Required | +|---|---| +| `BothFixtures_HaveCompleteCoverage_AndOnlyTheNamedOwnerDecisionRemains` (changed) | both fixtures exit 14, no owner decision named, every non-PASS row rank 5 with the reference; 69 / 138 rows | +| `TheOpticsAcceptance_NeedsTheReviewedFixtureIdAndApprovedRules` (3) | the unchanged box run compared as `s08-fix-two`, as an unknown id, or under the provisional rules: exit 12, the optics decision named | +| `TheOpticsAcceptance_DoesNotApplyToAChangedModel` | the box re-saved with the same p (other bytes): exit 12, the same outcome counts | +| `AWrongOpaqueOpticalValue_StillFails_UnderTheAcceptance` | Plasterboard Solar Absorptance 0.5 in the IDF: FAIL (exit 10) on 3a external-face rows only; the internal-face rows keep rank 5 | + +Tests that change the model (lighting p, comfort coefficient, ventilation) keep exit 12: their bytes are not reviewed. + +**A/B:** with `Cli/ReadBackRead.cs` of `8fd0ffc2` restored (no model hash passed, so no acceptance), the two acceptance +tests fail and the 4 binding controls and the plenum control pass (`revision-7/test-summaries.txt`). In that A/B the +wrong optical value still fails, exit 10. + +**Not changed or run:** the acceptance and packing scripts (not run; the committed pack is acc3, pre-L1 and +pre-acceptance). Under `Run-S09-ReadBack.ps1 -Phase acceptance` the approved compare would now exit 14 and the +provisional baseline 12, because the acceptance applies under the approved rules only. The writer suite and benchmark +tests were not re-run: revision 7 changes no writer, importer or benchmark file. + +### Writer change (`SAM_OpenStudio/SAM.Analytical.OpenStudio/Convert/ToOpenStudio/`) + +- **`InternalCondition.cs`:** `ToOpenStudio_VentilationDeliverySchedule` chooses the DSOA fraction schedule. + - No selection: `SAM_Schedule_VentilationNotDelivered`, all 0, with information `SAM-OS-HVAC-001`, as the other Ideal + Loads notes use. + - A resolved Ventilation profile: that profile. + - Otherwise: error `SAM-OS-SCH-001` and the all-zero schedule. It is never unscheduled. + - The DSOA keeps every requirement rate. +- **`AnalyticalModel.cs`:** the `OutsideSupplyAirFlow` override states method Sum, its flow and every other rate as 0. + Before, it relied on OpenStudio's Flow/Person defaults. It uses the same delivery schedule. +- **`IdealLoads.cs`:** DCV `None`, `NoEconomizer`, heat recovery `None`, and the space's effective DSOA (its own, else the + inherited SpaceType one) linked explicitly. + +Measured before the fix (local exploration): the two-zone V1 IDF delivered both requirements unscheduled. The S09 +comparator reports this as EXPORT-DEFECT, i.e. FAIL. `neg-v1-unscheduled` reproduces it on the fixed export. + +### Read-back design + +1. **Export:** the production writer converts the frozen fixture with the explicit EPW and saves the OSM without running + the CLI. The saved OSM is reloaded and translated with the SDK's `EnergyPlusForwardTranslator` (default options, as + the CLI). `export.json` records the hashes, the SDK version and the diagnostics. +2. **Read (fresh process):** an IDD-free text parser of the OSM and the IDF. + - Every field is checked against the file's own `!-` label, so an unknown layout is unreadable. + - Schedules are expanded hour by hour: IDF `Schedule:Compact` ("For: AllDays", whole-hour `Until:`) and + `Schedule:Constant`, and OSM `OS:Schedule:FixedInterval`. Anything else is unreadable. + - It records the PID, the start time, the hashes before and after reading, and the hash of the EPW the OSM references. +3. **Compare (fresh process):** + - Infrastructure checks as in S08: a different process, the reader started after the export, the OSM and IDF read + are the exported ones, and the frozen model and EPW are byte-identical. A failed check exits 70. + - Revision 4: a process is its id and OS creation time, both recorded. An unrecorded identity fails. + - Expectations: S08 `ReadBackExpected.cs`, linked, plus the core formulas. + - Gate: the S08 core `SAM.Analytical.InputEquivalence`, by project reference. Neither is copied, and revision 2 + changes neither. + - No SAM `ToSAM`, writer cache or SDK call is used for a native value. +4. **Identity:** each SAM space's native space is the one whose surfaces match its panel polygons one to one + (`MatchPolygons`). + - Apertures match through the native outline: the pane grown by the native frame width. + - Writer name carriers may only contradict a match. The fixture space GUIDs share their first 8 hex digits, so for + spaces the geometry does the work. + - Unmatched native spaces, surfaces and subsurfaces, and objects that add air, heat or geometry (ZoneVentilation, + mixing, AirflowNetwork, other equipment, simple-geometry surfaces and subsurfaces, ...), FAIL. +5. **Placement (revision 2):** the native multiplicity and orientation must be the single, unrotated building SAM + states (see "Revision 2"). +6. **OSM and IDF consistency:** these must agree, or the fixture FAILs: + - the effective DSOA (own, else inherited) against the DSOA the IDF Ideal Loads delivers; + - the DSOA rates and schedule; + - every compared schedule, hour by hour; + - the weather location; + - zone and subsurface multipliers, each against the one OSM object of the IDF object's name (revision 3), and the + building north axis; + - no dangling schedule references. + +## Revision 2: multiplicity and orientation (independent review of `d6d1cc5b`) + +The independent review reproduced three IDF mutations of the box run. Each left the report unchanged at 316/316, +BLOCKED owner, exit 12: +- `Zone` Multiplier 1 → 2; +- `FenestrationSurface:Detailed` Multiplier blank → 2 (both windows); +- `Building` North Axis blank → 90. + +S07 has no multiplicity or orientation row. Revision 2 adds neither a row nor a tolerance, and does not touch the +shared core. It checks both against SAM intent and fails closed. + +**SAM intent.** +- SAM has no zone, zone-list or aperture multiplier: each SAM space and aperture is one physical object, and every S07 + row compares that one object. +- SAM states the building rotation only as `AnalyticalModelParameter.NorthAngle` (radians, clockwise from North). + Unstated, the writer leaves the OpenStudio/EnergyPlus default 0 (`OS/SimulationSettings.cs:33-47`). Neither fixture + states it. + +**EnergyPlus 25.1 semantics.** These are version-matched to the SDK `3.10.0+86d7e215a1` translator (IDF +`Version 25.1`; I/O Reference, Group Thermal Zone Description/Geometry): +- A Zone Multiplier multiplies the zone's floor area, loads and internal-gain energy (default 1). +- A ZoneGroup multiplies a zone list on top of that. +- A subsurface Multiplier multiplies the window area, frame and divider included (default 1). +- Relative coordinates rotate the vertices by the Building North Axis plus each Zone's Direction of Relative North, + and move them by the zone origin. World coordinates use neither north axis. +- The local ladybug IDD is 25.2, not matched; it only corroborates that Coordinate System is required (Relative or + World) and that the fenestration Multiplier defaults to 1, with non-integers truncated. + +**How the S09 code handles the two coordinate systems** (`NativeModel.Vertices`, `OsComparison.Orientation`): +- **Relative:** the reader adds the zone origin to each vertex. A zone with a non-zero Direction of Relative North is + not read; the rotation check below FAILs a non-zero Building North Axis + Direction of Relative North. +- **World** (or its synonym `Absolute`): **supported.** The reader takes the vertices as absolute, with no zone origin + and no rotation, and compares them like Relative ones. Only a non-zero Building North Axis or Zone Direction of + Relative North under World is refused (BLOCKED technical), because EnergyPlus would not apply it to the geometry. +- Any other or missing coordinate system is BLOCKED technical. Both fixtures use Relative, so the World path is + exercised only by the refusal test (`world-with-north-axis`), not by a compared model. + +**Rules.** A blank field is read as its documented default, never assumed. + +| Native finding | Outcome | +|---|---| +| An effective multiplier ≠ 1 (Zone, ZoneGroup, FenestrationSurface:Detailed) | Consistency → **FAIL**: contradicts SAM | +| Relative coordinates with Building North Axis + Zone relative north ≠ 0, where SAM states no rotation | Consistency → **FAIL** | +| The OSM and IDF disagree (OS:ThermalZone / OS:SubSurface Multiplier, OS:Building North Axis) | Consistency → **FAIL** | +| (revision 3) An IDF Zone or FenestrationSurface:Detailed has no OS:ThermalZone / OS:SubSurface of its name, and every OSM object of that class has a readable Name | Consistency → **FAIL**: a proven missing counterpart | +| An unreadable or non-integer multiplier; an unreadable north axis; an unknown or missing coordinate system; World coordinates with a non-zero Building North Axis or Zone Direction of Relative North; a non-identity OS:Space transformation; a non-zero SAM North Angle (S07 has no orientation tolerance) | `Unsupported` → **BLOCKED technical** (exit 11), never PASS | +| (revision 3) An ambiguous OSM counterpart (two objects of the name), or an OSM object of the class whose Name is unreadable; an OSM Multiplier field that is missing or labelled otherwise | `Unsupported` → **BLOCKED technical** (exit 11) | +| Simple-geometry `Window`, `Door`, `GlazedDoor` and their `:Interzone` forms (which carry multipliers) | read, and refused as native extras: **FAIL** | + +The report schema is now `s09-readback-report/2` (it adds `Unsupported`). Each fixture report carries one Supporting +line for orientation ("the native building is unrotated, as SAM states") and one for multiplicity ("every effective +multiplier is 1, as SAM states"). + +**Before and after.** The same disposable inputs were read and compared by each binary in fresh processes +(`documentation/S09-OpenStudio-InputReadBack-evidence/revision-2/`): + +| Input | Reviewed head `d6d1cc5b` | Revision 2 | +|---|---|---| +| s08-fix-box, unchanged | BLOCKED owner, exit 12, 316/316 | the same; outcome counts identical | +| s08-fix-two, unchanged | BLOCKED owner, exit 12, 586/586 | the same; outcome counts identical | +| reviewer's zone-multiplier copy | exit 12 | **FAIL, exit 10** | +| reviewer's window-multiplier copy | exit 12 | **FAIL, exit 10** | +| reviewer's building-north copy | exit 12 | **FAIL, exit 10** | +| `neg-zone-multiplier` / `-both` | exit 12 / 12 | **FAIL 10 / 10** | +| `neg-window-multiplier` / `-both` | exit 12 / 12 | **FAIL 10 / 10** | +| `neg-north-axis` / `-both` | exit 12 / 12 | **FAIL 10 / 10** | + +- **The `-both` variants** also mutate the OSM, so the OSM and IDF agree and only the check against SAM intent refuses + them. Their reports contain only `multiplicity: …SAM states one … and no multiplier` or `orientation: Zone '…' is + rotated by 90 deg …; SAM states no rotation`. +- **The reviewer's copies** differ from the committed box IDF only in the mutated lines. + +## Revision 3: missing OSM counterparts (independent review of `6f7e6b7d`) + +**Finding.** `OsComparison.Multiplicity` looked up each IDF `Zone` and `FenestrationSurface:Detailed` in the OSM by +name and compared the multipliers only when an object was found. When the `OS:ThermalZone` or `OS:SubSurface` was +absent, the check was silently skipped. The review removed the object from a copy of the box `model.osm`, updated the +manifest's OSM hash and ran a fresh read and compare. The report stayed at exit 12, 316/316, with unchanged outcome +counts and no Consistency or Unsupported entry. A second, related gap: the OSM Multiplier was found by label search, +and a missing label was read as the default 1. + +**Change (`Compare/OsComparison.cs`, local to `Multiplicity`; no reader or core change).** +- `OsmCounterpart(type, …, name)` reads the Name of every OSM object of the class at its known position (field 1, + after the handle) under the file's own label: + - exactly one match, and every Name readable: the counterpart, whose multiplier is compared as before; + - no match, and every Name readable: proven missing → Consistency, `multiplicity: IDF Zone '…' has no OS:ThermalZone + in the OSM (none of its N OS:ThermalZone object(s) has that name); the OSM and IDF disagree` (the same for + subsurfaces) → **FAIL**; + - two or more matches, or any Name unreadable (blank, or a field labelled otherwise): the identity is not proven → + `Unsupported` → **BLOCKED technical**. +- `OsmMultiplier` reads the OSM Multiplier at its known position (`OS:ThermalZone` field 2, `OS:SubSurface` field 8) + under its label, with the IDF reader's own `NativeModel.Number`. **Blank stays the documented default 1.** A missing + field, or one labelled otherwise, is an unknown layout → BLOCKED technical; before, it defaulted to 1. +- The multiplicity Supporting line now states the matches: box `1 IDF zone(s) (1 with their OS:ThermalZone) … + 2 IDF subsurface(s) (2 with their OS:SubSurface)`; two-zone `2 (2) … 1 (1)`. It claims "every effective multiplier + is 1, as SAM states" only when no multiplicity Consistency or Unsupported entry exists, as before. +- The translator keeps the names (IDF `SAM_ThermalZone_FixBox_5080c000` = OSM `OS:ThermalZone` Name), so a name match + is the identity. Names compare case-insensitively, as EnergyPlus does. + +**Negatives** (`Cli/Negative.cs`, also in `Run-S09-ReadBack.ps1 -Phase acceptance-negative`; the IDF is unchanged): +- `neg-osm-missing-thermal-zone`: the first IDF zone's `OS:ThermalZone` removed (box: the only zone; two-zone: zone A). +- `neg-osm-missing-subsurfaces`: every IDF subsurface's `OS:SubSurface` removed (box 2, two-zone 1). + +**Before and after** (`documentation/S09-OpenStudio-InputReadBack-evidence/revision-3/`; the same inputs, each binary +in fresh processes; the IDF unchanged in every input): + +| Input | Reviewed head `6f7e6b7d` | Revision 3 `c1e53328` | +|---|---|---| +| s08-fix-box, unchanged | BLOCKED owner, exit 12, 316/316 | the same; outcome counts and `report-approved.txt` identical | +| s08-fix-two, unchanged | BLOCKED owner, exit 12, 586/586 | the same; outcome counts and `report-approved.txt` identical | +| box, every `OS:ThermalZone` removed (the reviewer's method) | exit 12, 316/316, no Consistency or Unsupported | **FAIL, exit 10**, 316/316, 1 Consistency | +| box, every `OS:SubSurface` removed (reviewer's method) | exit 12, the same | **FAIL, exit 10**, 2 Consistency | +| two-zone, every `OS:ThermalZone` removed | exit 12, 586/586, the same | **FAIL, exit 10**, 2 Consistency | +| two-zone, every `OS:SubSurface` removed | exit 12, the same | **FAIL, exit 10**, 1 Consistency | +| `neg-osm-missing-subsurfaces` (box) | exit 12 | **FAIL, exit 10**, 2 Consistency | +| `neg-osm-missing-thermal-zone` (two-zone, zone A) | exit 12 | **FAIL, exit 10**, 1 Consistency | + +In every FAIL the outcome counts and coverage are those of the unchanged fixture, there is no Unsupported entry, and +every Consistency entry is a missing-counterpart entry. + +## Revision 4: final-head CI failure (Build 39603021836 at `e0a6ea19`) + +Evidence: `documentation/S09-OpenStudio-InputReadBack-evidence/revision-4/` (README, CI excerpt, scripts, outputs). + +**The failed run (preserved, not re-run).** Build (Windows) 39603021836, job 119232047962, on `pull/33/merge` of +`e0a6ea19`. Dependencies: SAM, SAM_SQLite and SAM_Validation at `sow/2026-Q4`, SAM_Tas `c50e9169` (`sow/2026-Q4`). +- Benchmark tests: 51/51. S09 tests: 57/58. +- Failed: `EveryTargetedMutation_Fails("neg-people-density","s08-fix-box")` [695 ms], `DirectoryNotFoundException` on + `s09-runs\neg-people-density-b0da74\compare-approved\report.json` (`TestSupport.cs:111`). +- SPDX run 39603021804 passed. No artifact was kept. +- **Disposition:** superseded by revision 4. The cause is diagnosed as likely, not proven (below). + +**What the run shows.** `compare` returned before `OsReport.Save`, which creates `compare-approved` first. That +happens only for exit 64 (usage) or exit 70 (an infrastructure check, or an exception caught in `Program.Main`). The +test loaded `report.json` before checking its exit code, so the exit code and stderr were lost. Which branch ran is +therefore not known from CI. + +**The defect found.** The freshness checks compared process ids only: +- reader id = export id → "the reader did not run in a fresh process after the export"; +- compare id = reader id → "the comparison runs in the reader's process". + +Windows reuses the id of an exited process. A negative copy keeps the id of the one-time export, whose process exited +long before, so a later fresh reader can carry it. Measured here: 141 of 1000 sequential harness launches got an id an +earlier launch already had, at least 164 launches apart (`pid-reuse-1000.txt`). It depends on load: 0 of 200 in +another run. It was not measured on a GitHub runner. + +**Reproduction.** `simulate-pid-reuse.ps1` makes the reused-id state by writing the reader's id into a negative copy's +`export.json`; the reader started after the export finished. +- Reviewed head build (`5041645c…`): 3/3 exit 70 with the message above and no `compare-approved`. This is the CI + signature. +- Revision 4 (`25a35b92…`): 3/3 FAIL, exit 10, with `report.txt` byte-identical to the unmutated controls and to acc3. + +**Conclusion.** The id-only check is a defect, and it is the only mechanism found that produces the CI failure. That it +caused this run is likely but unproven. An exception inside `compare` is not excluded by CI evidence. Locally, none of +319 earlier test runs and no acc3, acc5 or acc6 run lacked a report. + +**Change (`0c232875`).** +- `ProcessIdentity`: a process is its id **and** OS creation time. + - `export.json` `s09-export/2` and `native.json` `s09-native/2` record `ProcessStartedUtc`. + - Same id and creation time = the same process. The reader must still start after the export finished. + - A missing identity fails closed (exit 70), so `/1` and hand-made files are refused. + - `report.json` Inputs gain the three creation times; `report.txt` is unchanged. +- `TestSupport.ReadAndCompare` checks that `report.json` exists before parsing it. A failed `read` or `compare` reports: + - the exit code and labelled stdout/stderr; + - both process identities and times; + - the run's files. + + The same text goes to `s09-diagnostics/*.txt`. The Build workflow uploads those files only on failure (30 days). +- 4 tests: + - `AReusedProcessId_IsNotTheExportProcess`: FAIL, exit 10, with a report. It fails against the reviewed head's check. + - `AReadNotProvenFresh_IsAnInfrastructureFailure`: the same process, an unrecorded identity and a read before the + export finished each give exit 70 and no report. +- Not changed: the hash checks, fixtures, weather, tolerances, the shared core, the writer, and every existing negative + and assertion. No retry was added. + +## Revision 6: fail-closed guards in the lighting read-back (independent review of `31af6022`) + +Tested content `225881f00971c7cab3596e94867924a11866e147` (tree `47600688`). Only `OsComparison.LightingSplit` and its +regressions change; the writer, the importer, the fixtures, the tolerances and the shared core do not. + +**Gap 1: native domain and energy conservation** (`LightsDomainProblem`). +- The reviewed head compared each row within its S07 tolerance only. A split shifted by 0.0004 per field passes every + row (the 4c tolerance is 0.001), although on p = 1 it sums to 1.0008 and on p = 0 Fraction Radiant is −0.0004. Both + reviewer artifacts gave exit 12 with lighting accepted. +- Now, before any comparison: Return Air, Radiant and Visible must each lie in [0, 1], and Return Air + Radiant + Visible + must not exceed 1 (S07 §5.1: "A sum above 1 is an input error"; it is a negative convective share). +- A violation is an EXPORT-DEFECT on all five lighting rows, FAIL (exit 10). The reason names the field or sum and + says that no tolerance applies; the rows carry no numeric comparison. +- **Floating-point boundary:** `OsQuantities.LightingFractionBoundary` = 1e-12. A fraction passes in [−1e-12, 1 + 1e-12] + and a sum at most 1 + 1e-12. This absorbs only the decimal-to-double rounding of the IDF text (under 1e-15 here). It is + 1e9 times smaller than the 4c tolerance, is applied before and never instead of the S07 comparison, and changes no + tolerance. The writer's p = 1 split passes. +- Unreadable or NaN fields are left to the existing row evaluation (UNVERIFIED or EXPORT-DEFECT). + +**Gap 2: plenum-calculated return air** (`LightsPlenumProblem`, IDF `Lights` index 12, after End-Use Subcategory). +- Blank, absent or `No` (the EnergyPlus default, which the writer leaves) is the static split, unchanged. +- `Yes` makes the return-air share follow the plenum temperature at run time, so no static T-LIGHT-SPLIT can be + verified. Any other value is uninterpretable. A field whose own label differs is unreadable. +- In each of those three cases, all five lighting rows read as unreadable with the reason: UNVERIFIED, BLOCKED technical. + The transformation is not marked verified, and `Unsupported` gets `lighting: space:: Lights '' …`. The + result is exit 11, never PASS. +- Precedence: an invalid domain (FAIL) outranks the plenum block; both are named. + +**Regressions** (S09 tests; the native mutations are new CLI `negative` cases): + +| Test | Case | Required | +|---|---|---| +| `TheBoundarySplits_PEqualOneAndZero_AreValid` (p = 1, p = 0) | writer exports, unchanged | exit 12, every lighting row passes, no Unsupported | +| `AnInvalidNativeSplit_FailsBeforeAnyTolerance` | `neg-lighting-sum-above-one` on p = 1; `neg-lighting-radiant-to-visible` on p = 0 | exit 10; exactly the 5 lighting rows EXPORT-DEFECT with the named violation; none passes; no comparison made | +| `APlenumCalculatedOrUninterpretableReturnAir_BlocksTechnically` | `neg-lighting-plenum-yes`, `-unknown` (`Maybe`), `-relabelled` | exit 11; one named Unsupported entry; the 5 lighting rows UNVERIFIED, BLOCKED technical; none passes | +| `AnExplicitNoPlenumSetting_IsTheUnchangedControl` | `ctl-lighting-plenum-no` (No with coefficients) | the box's exit code and outcome counts, no Unsupported, the same lighting outcomes | + +- **A/B:** with the reviewed `OsComparison.cs` (`31af6022`) restored over `225881f0`, the 5 regressions fail (exit 12, + where 10 or 11 is required) and the 3 controls pass (`revision-6/test-summaries.txt`). +- **Reviewer artifacts** (machine-local, copied, read and compared fresh with the revision-6 harness; + `revision-6/review-artifacts-ab.txt`): control and p1-control unchanged (exit 12, identical counts); p1-invalid-sum + and p0-negative-fraction exit 10 with 5 named EXPORT-DEFECT; dynamic-plenum exit 11 with 5 UNVERIFIED and the named + Unsupported entry. +- **Fixtures:** both `report.txt` files are byte-identical to `revision-5/`, and the IDFs keep their hashes. +- The new CLI cases are not added to `Run-S09-ReadBack.ps1 -Phase acceptance-negative`, which requires exit 10 on the + unchanged fixture runs. The plenum cases exit 11, and the two partition shifts are invalid only on p = 1 or p = 0 + exports; on the fixtures they stay valid and within tolerance. + +## Revision 5: the S07 §5.1 lighting split (amendment L1) + +Tested content `20f8fb659a26b69173ebc98c75adf2a037ae7661` (tree `1f4f1844`). Contract: SAM S07 §5.1 and T-LIGHT-SPLIT, +merged by SAM#217 as `113873a0`. Checked first: post-merge Test run 39667707673 (`test (Release)`) and Build (Windows) +run 39667707679 succeeded on `113873a0`; SAM `sow/2026-Q4` is `ba686d24` (the L1 closeout). + +**Writer** (`OS/Convert/ToOpenStudio/InternalCondition.cs`, new `OS/Classes/LightingSplit.cs`): +- p = `LightingRadiantProportion`, the total radiant share. `Fraction Radiant` = p·(1 − s), `Fraction Visible` = p·s, + s = 0.2415 / 0.576 (a C# constant expression, never rounded); `Return Air Fraction` is not set (0). Convective 1 − p. +- **`LightingViewCoefficient` is never read for `Lights`.** When authored it is reported as `SAM-OS-IC-001` information + ("a TAS comfort ... coefficient, not an energy fraction"), next to the occupancy and equipment lines. +- An authored p, including 0, is preserved. SAM rejects values outside [0, 1] at `SetValue` (`DoubleParameterValue(0, 1)`), + so no out-of-range p reaches the writer; no extra branch was kept. +- An absent or NaN p takes p₀ = 0.576 (Fraction Radiant 0.3345, Fraction Visible 0.2415). This replaces the previous + silent defaults 0.32 / 0.25 (the view-coefficient default). See "OD-L1" below. +- **New code `SAM-OS-IC-002`** (`InternalConditionAssumption`), Information at Summary (`GetDiagnosticDetail` Summary + list; pinned in `DiagnosticsAdapterTests` and `DiagnosticDetailTableTests`). One line per SpaceType: + - authored: p, the values written, s and the reference category with its "not applicable to" list; + - unstated: the same, plus that p₀ was applied, that it is not a regulatory, NCM, TM59 or dwelling value, that its + suitability outside the category is owner decision OD-L1, and to author p where a method prescribes it. + - A separate code keeps the clean-fixture check "no `SAM-OS-IC-001`" meaningful: the note is an assumption, not an + unsupported input. +- The occupancy and equipment view-coefficient reasons no longer claim a missing "visible-fraction field" (§5.1). The + message prefixes, and so their Detailed level, are unchanged. The lighting view-coefficient line stays at Summary + (it is not added to the inert table), because until now it reached EnergyPlus as Fraction Visible. + +**Importer** (`OS/Convert/ToSAM/InternalCondition.cs`), §5.1 default-resolution item 5: +- p = Fraction Radiant + Fraction Visible; `LightingViewCoefficient` is never set. +- Warning `SAM-OSI-APX-001` when Return Air Fraction > 0 (that share becomes convective room gain); information + `SAM-OSI-APX-001` when F_V / (F_R + F_V) differs from s by more than 1e-6 (not when p = 0). +- Fractions summing above 1 (an EnergyPlus input error): warning, and no p is imported. +- SAM files imported under the previous mapping (F_R in p, F_V in the view coefficient) cannot be identified and are not + migrated (§5.1). + +**S09 read-back** (`Compare/OsComparison.LightingSplit`, `OsQuantities`): +- Five rows per space, from the raw SAM p (`ReadBackExpected` parameters) and the §5.1 constants in `OsQuantities` + only (no writer reference): + + | Key | Native | Expected | Tolerance | + |---|---|---|---| + | `lighting.returnAir` (`4c.os.returnAir`) | Return Air Fraction | 0 | exact | + | `lighting.radiantTotal` (4c) | F_R + F_V | p | 0.001 | + | `lighting.visible` (4c) | F_V | p·s | 0.001 | + | `lighting.radiant` (4c) | F_R | p·(1 − s) | 0.001 | + | `lighting.convective` (4c) | 1 − F_RA − F_R − F_V | 1 − p | 0.001 | + +- A blank field of a present `Lights` object reads as its IDD default 0 (S07: "blank reads as 0"), so a blank cannot + pass as native absence for an unstated p. +- An authored p is verified T-LIGHT-SPLIT: ACCEPTED-TRANSFORMATION, or MATCH where SAM and native are both 0 (the core + rates S-ZERO with a zero native MATCH; both are PASS). +- An absent or NaN p is S-UNSPEC on every row, with the p₀ split only as the listed default: DOCUMENTED-DEFAULT (rank 3, + BLOCKED owner), never PASS. Return Air reaches it through the approved G1 rule (zero is its listed default). +- A p outside [0, 1] would be S-INVALID (defensive; SAM's validation prevents it). +- Removed: the `lighting.visible` comparison against `LightingViewCoefficient` (listed default 0.25) and the test + exception for its DOCUMENTED-DEFAULT. + +**Fixture results (S09 test runs at `20f8fb6`; `revision-5/`):** + +| Fixture | Status (exit) | Coverage | Outcomes | Non-PASS | +|---|---|---|---|---| +| `s08-fix-box` (p 0.37) | BLOCKED owner (12) | 319/319 | Match 220, WithinTolerance 25, AcceptedTransformation 4, NotApplicable 1, MappingDifference 69 | OS-MAT-SINGLE-SIDED (69) only | +| `s08-fix-two` (p 0.34, 0.41) | BLOCKED owner (12) | 592/592 | Match 393, WithinTolerance 46, AcceptedTransformation 14, NotApplicable 1, MappingDifference 138 | OS-MAT-SINGLE-SIDED (138) only | + +- The IDFs differ from the revision-4 acceptance `acc6` only in the `Lights` Fraction Radiant and Fraction Visible + lines (`revision-5/idf-diff-acc6.txt`). Native F_V / F_R: box 0.155130 / 0.214870; A 0.142552 / 0.197448; B + 0.171901 / 0.238099, the §5.1 expected vectors. + +**New S09 tests (18):** +- the authored p of each fixture space against the §5.1 vectors (3); +- an authored 0: four rows MATCH at 0, convective 1 (1); +- an authored view coefficient (0.49, 0): every lighting row, the coverage and the outcome counts unchanged (2); +- an absent and a NaN p: exactly the five lighting rows are DOCUMENTED-DEFAULT, BLOCKED owner, S-UNSPEC (2); +- 5 negatives × 2 fixtures, each FAIL (exit 10) with only lighting rows failing and no OSM/IDF disagreement (10): + `neg-lighting-previous-mapping` (F_R = p, F_V = 0.25), `neg-lighting-visible-zero` (F_V = 0 with p > 0), + `neg-lighting-radiant-is-p` (F_R = p with F_V > 0), `neg-lighting-return-air` (0.1), `neg-lighting-swapped`. +- Updated: the two-zone ACCEPTED-TRANSFORMATION count 6 → 14. + +**New writer and importer tests** (`tests/.../C2/LightingSplitTests.cs`, 16): the §5.1 vectors; an authored 0; absent +and NaN p → p₀ with the Summary note naming OD-L1; the view coefficient (0.49, 0.25, 0, 1) never changes the fractions +for p 0.37, 0 and absent; import of p₀, of 0, of another short-wave share, of a nonzero return air, of a sum above 1; +round trips of 0.37 and 0 with a view coefficient. Updated: `RadiantProportions_ComeFromSamParameters` (the split), the +D1 detail table, the released-code table and the real-converter detail test. + +**A/B:** the previous writer and importer restored over `20f8fb6`: 18 writer tests and 21 S09 tests fail +(`revision-5/test-summaries.txt`). + +**Not changed:** fixtures, weather, tolerances, the shared core, ventilation, opaque optics, glazing, the occupancy and +equipment radiant defaults (0.3, 0), SAM_Tas, SAM_LadybugTools. One wording change: the note says "the entire fitting" +because `FenestrationTests.Holes_...` takes the first diagnostic containing "hole" ("whole" matched it). + +## Decisions and assumptions (for review) + +1. **T-VENT-INACTIVE for OpenStudio.** + - It applies the S08 owner decision 3 preconditions unchanged, under the S09 owner policy (V0/V1 deliver nothing): + - no selection; + - the DSOA is present with its requirement; + - its fraction schedule is read in both the IDF and the OSM, hour-labelled and exactly 0 for all 8760 hours; + - every delivered flow is exactly 0; + - approved rules only. + - It covers rows 6 (ventilation) and 8b only. + - Without it, V1 would be the G1 UNLISTED-DEFAULT (BLOCKED owner). **Confirmed by the owner on 2026-10-22 + (ventilation A; see "Revision 7").** +2. **8a per basis:** an unstated basis is S-ZERO once any basis is stated. The S07 8a requirement is the sum, and the core's + `ExpectedRequiredSupplyFlow` adds nothing for it. In V0 it stays S-UNSPEC. The summed requirement is also compared + (`ventilation.requirement.total`). +3. **OS outdoor-air precedence (S07 section 3):** the override replaces the condition bases. For an override, SAM's + requirement is its flow and the other bases are S-ZERO. Tas ignores `OutsideSupplyAirFlow`, so a model with an + override diverges between the engines. The fixtures have none. +4. **Single-sided opaque optics (OS-MAT-SINGLE-SIDED):** + - EnergyPlus `Material` has one solar, visible and thermal absorptance for both faces. Until revision 7 the writer + wrote the external value everywhere; revision 8 writes SAM's first layer with its internal face (see "Revision 8"). + - S09 compares every used face exactly and lists a row MAPPING-DIFFERENCE only on a face EnergyPlus does not use, + and only while the native value is the layer's other authored face. Rank 3; listed by S09, not by S07. + - Revision 7 recorded the owner's option-1 acceptance (exit 14); revision 8 removes it on the owner's instruction to + correct the mismatch. The remaining unused-face rows need an owner decision (accept, or an S07 3a scope decision). +5. **Lighting split (revision 5; supersedes the "lighting visible fraction" item of revisions 1–4):** S07 amendment L1 + withdrew the view coefficient ↔ Fraction Visible identity, so that item is no longer an owner decision. The fixtures + author p and pass T-LIGHT-SPLIT. + - **OD-L1 interpretation (confirmed by the owner on 2026-10-22, lighting B1; OD-L1 itself stays open):** §5.1 and §8 gate only the **SAM_Tas** fallback on OD-L1, and + list "absent p → p₀ with the diagnostic" among the required SAM_OpenStudio#33 changes under the approved D-LIGHT. + The OpenStudio writer has no template value to replace; it had silent defaults 0.32 / 0.25. Revision 5 therefore + applies p₀ for an unstated p, states it at Summary with the category, its limits and OD-L1, and claims no + suitability outside the category. If the owner reads OD-L1 as also gating this fallback, the change is the + `!lightingRadiantProportionStated` branch of the writer only; the authored-input corrections stand alone. +6. **Native floor area and volume** are computed from the IDF surface polygons, because the Zone fields are blank + (autocalculated); a stated Zone value would FAIL. Opaque reflectance = 1 − absorptance. +7. **The OS weather row (9) and T-FRAME:** + - Row 9 compares the referenced EPW by SHA-256 and the location fields with the S07 OpenStudio tolerances (1e-4 deg, + 0.5 m). + - Time zone is exact, because S07 states no OpenStudio tolerance for it. + - The T-FRAME frame conductance uses 1e-5 W/m²K. + - These are defined in `OsQuantities.cs`. No new tolerance is introduced. +8. **Design days:** OS precedence (no DDY, none in the model) gives none; native none is NOT-APPLICABLE. +9. **Multiplicity and orientation (revision 2):** + - **Rejected, not accounted for.** S07 compares one SAM object with one native object, and an effective-quantity + scaling would need per-row semantics S07 does not define. + - Contradictions use the existing fail-closed Consistency channel. The new `Unsupported` list floors the status at + BLOCKED technical, never PASS. + - Neither adds a quantity, a tolerance or a core change. +10. **OSM counterpart identity (revision 3):** the IDF object's name is its OSM identity, because the translator keeps + names. Consistency is claimed only against exactly one OSM object of that name, read under the file's labels. "No + such object among readable names" is proven missing (FAIL); anything less certain blocks. Only the IDF → OSM + direction is checked: an OSM zone or subsurface with no IDF object is not looked for (see "Unresolved"). + +## Fixture verdicts (approved rules) + +**Revision 12 supersedes the status and outcomes below:** both fixtures PASS, exit 0, under S07 §5.2 (see "Revision +12"); its acceptance pack is `acceptance-2026-10-23/` (21 negatives, box repeat). Revision 5 superseded the counts and the lighting item (319/319 and 592/592, optics only; see "Revision 5"), and +revision 7 then revision 8 the status. +This section is the revisions 1–4 acceptance (`acc3`/`acc6`), which predates amendment L1 and was not re-run. + +Evidence: `documentation/S09-OpenStudio-InputReadBack-evidence/`, revision-3 acceptance `acc3`. Harness +`os-input-readback.dll` `b7cf9f26…`; library `ce8270dd…` (revision 2 `acc2`: `32090bbf…` / `5f279f12…`). The +revision-4 acceptance `acc6` (`25a35b92…` / `006668df…`) gives the same table, with every `report.txt` and IDF +byte-identical to acc3; the committed pack stays acc3. + +| Run | Status (exit) | Coverage | Outcomes | Non-PASS (all owner decisions) | +|---|---|---|---|---| +| `s08-fix-box` (V2) | BLOCKED owner (12) | 316/316 | Match 220, WithinTolerance 25, NotApplicable 1, MappingDifference 69, DocumentedDefault 1 | OS-MAT-SINGLE-SIDED (69 rows), lighting visible fraction | +| `s08-fix-two` (V1, V1) | BLOCKED owner (12) | 586/586 | Match 393, WithinTolerance 46, AcceptedTransformation 6, NotApplicable 1, MappingDifference 138, DocumentedDefault 2 | OS-MAT-SINGLE-SIDED (138 rows), lighting visible fraction (2 zones) | +| `box-repeat` | BLOCKED owner (12) | 316/316 | identical report | IDF byte-identical | + +- Every `report-approved.txt` is byte-identical to revision 1's and revision 2's. Revision 2 changed only the JSON + (schema `/2`, the orientation and multiplicity Supporting lines). Revision 3 changes only the multiplicity Supporting + line (the counterpart counts), plus fresh OSM hashes, DLL hashes, PIDs and times. The acc3 IDFs are byte-identical to + acc2's; the OSM bytes differ between exports (random handles), as before. +- **Ventilation:** + - Box V2: 8b passes for all 8760 hours, and the 6.hourly ventilation schedule matches. + - Two-zone: both zones are V1, with the requirement read back and matched (8a). 8b and the ventilation schedule pass as + T-VENT-INACTIVE. +- **Hourly series:** all 11 per fixture zone (5, 6, 8b) cover 8760 hours with alignment verified from the native labels. + The calendar is RunPeriod 2006 (non-leap), 1/1-12/31, with an 8760-row EPW. +- **Placement:** both fixtures unrotated (Relative coordinates, Building North Axis blank, no zone rotation, SAM North + Angle unstated). All multipliers are 1: box 1 zone and 2 subsurfaces, two-zone 2 zones and 1 subsurface, no ZoneGroup. + Each IDF zone and subsurface has exactly one OSM object of its name, whose blank Multiplier is the documented + default 1. +- **Provisional rules:** the same exit codes (baseline). + +**Negatives** (`neg-*`; each a disposable copy, read and compared fresh). All 16 FAIL (exit 10), and the originals are +unchanged: + +| Case | Mutation | Result | +|---|---|---| +| identity-swap-names | two plain walls trade names | FAIL (identity mismatch) | +| schedule-swap | box DSOA schedule set to the occupancy schedule | FAIL (8b, 6, OSM/IDF) | +| v1-unscheduled | two-zone DSOA schedules removed in IDF and OSM (the old behaviour) | FAIL (8b EXPORT-DEFECT) | +| missing-dsoa-link | box Ideal Loads names no DSOA | FAIL (8b, inheritance) | +| missing-schedule-object | the DSOA names an undefined schedule | FAIL (dangling reference) | +| people-density | People density × 1.01 | FAIL (4a, 4b, 8a, 8b) | +| layer-conductivity | first Material conductivity × 1.001 | FAIL (3a, 3b) | +| osm-dsoa-schedule | OSM-only: the DSOA schedule removed | FAIL (OSM/IDF consistency) | +| zone-multiplier | IDF Zone Multiplier 1 → 2 (OSM unchanged) | FAIL (multiplicity vs SAM; OSM/IDF) | +| window-multiplier | IDF window Multipliers blank → 2 (OSM unchanged) | FAIL (multiplicity vs SAM; OSM/IDF) | +| north-axis | IDF Building North Axis blank → 90 (OSM unchanged) | FAIL (orientation vs SAM; OSM/IDF) | +| zone-multiplier-both | as zone-multiplier, plus OS:ThermalZone Multiplier → 2 | FAIL (multiplicity vs SAM only) | +| window-multiplier-both | as window-multiplier, plus OS:SubSurface Multipliers → 2 | FAIL (multiplicity vs SAM only) | +| north-axis-both | as north-axis, plus OS:Building North Axis → 90 | FAIL (orientation vs SAM only) | +| osm-missing-thermal-zone (two-zone in acceptance; both fixtures in the tests) | OSM-only: the first IDF zone's OS:ThermalZone removed | FAIL (missing OSM counterpart only) | +| osm-missing-subsurfaces (box in acceptance; both fixtures in the tests) | OSM-only: every IDF subsurface's OS:SubSurface removed | FAIL (missing OSM counterpart only) | + +## OS-MAT-SINGLE-SIDED: optics decision table (option 1 accepted 2026-10-22, the two reviewed fixtures only) + +**Sources:** +- the comparator's own rows on the acc2 runs, printed by the evidence program + `documentation/S09-OpenStudio-InputReadBack-evidence/revision-2/optics-table/` (output `optics-box.txt`, + `optics-two.txt`); +- translator OpenStudio SDK `3.10.0+86d7e215a1`, IDF `Version 25.1`; +- writer `OS/Material.cs:92-116`: `StandardOpaqueMaterial` gets SAM's *external* emissivity and 1 − external + reflectances. + +**EnergyPlus 25.1 semantics:** +- `Material` has one Thermal, Solar and Visible Absorptance (I/O Reference, Material). A construction lists layers + outside to inside (Construction). +- The Opaque Construction Report in `eplusout.eio` gives a construction's Outer/Inner Thermal and Solar Absorptance as + those of its outermost/innermost layer (Output Details, eplusout.eio). So only the outermost layer's outside face and + the innermost layer's zone face carry optics into the heat balance; buried faces carry none. +- An interzone partition's outside face is the other zone's inside face (mirrored construction), so each physical face + is counted once, on the zone it faces. +- Ground and adiabatic outside faces receive no solar or sky long-wave exchange. + +**Reading the table:** +- Layers are listed outside → inside as the IDF lists them for that zone side. +- "Needed" is the SAM face that is physically exposed. SAM lists a construction from its first space inside to outside, + so on the first space's side the zone face is SAM's *internal* face; on the second space's side it is SAM's + *external* face. +- Values are ρs / ρv / ε: native ρ = 1 − absorptance, native ε = Thermal Absorptance. Δ = native − needed. + +| Fixture | Construction (zone sides) | Layers, outside → inside | Outer face | Zone face: SAM needed → native, Δ | +|---|---|---|---|---| +| box | FIX_EXT_WALL (4) | Render, Blockwork, MineralWool, Plasterboard | Render ext 0.57/0.58/0.88 = native | Plasterboard **int** 0.68/0.70/0.91 → 0.62/0.64/0.90, **Δ −0.06/−0.06/−0.01** | +| box | FIX_ROOF (1) | Membrane, OSB, PIR, Plasterboard | Membrane ext 0.14/0.15/0.92 = native | Plasterboard int, **Δ −0.06/−0.06/−0.01** | +| box | FIX_GRD_FLOOR (1) | Concrete, EPS, Screed | to ground: optics unused | Screed **int** 0.33/0.34/0.90 → 0.27/0.28/0.94, **Δ −0.06/−0.06/+0.04** | +| two | FIX_EXT_WALL (A 3, B 3) | as box | Render ext = native | Plasterboard int, **Δ −0.06/−0.06/−0.01** | +| two | FIX_ROOF (A, B) | as box | Membrane ext = native | Plasterboard int, **Δ −0.06/−0.06/−0.01** | +| two | FIX_GRD_FLOOR (A, B) | as box | to ground: unused | Screed int, **Δ −0.06/−0.06/+0.04** | +| two | FIX_PARTITION, A side | Timber, Stud, MineralWool, Plasterboard | interzone: B's zone face governs | Plasterboard int, **Δ −0.06/−0.06/−0.01** | +| two | FIX_PARTITION, B side | Plasterboard, MineralWool, Stud, Timber | interzone: A's zone face governs | Timber **ext** 0.41/0.40/0.86 = native, Δ 0 | + +| Internal-side 3a rows listed MAPPING-DIFFERENCE | box | two | +|---|---|---| +| Total | 69 | 138 | +| At an exposed face where SAM needs the internal value (zone faces × 3 properties) | **18** (6 faces) | **33** (11 faces) | +| On buried faces, ground faces or faces where SAM needs the external value (no EnergyPlus effect) | **51** | **105** | + +- **Exposed, physically different:** two material faces only, the Plasterboard and Screed zone faces. ρs and ρv are + 0.06 low; ε is 0.01 low (Plasterboard) and 0.04 high (Screed). Every outdoor-facing face matches, and so does the + partition's B face. +- **Buried, metadata:** a layer's second set of optics on a face EnergyPlus never uses. S07 row 3a compares absorptance + and emissivity layer by layer on both faces, so a single-valued native material gives three non-matching rows per + layer whose SAM faces differ, *whichever* value the writer chooses. These rows are not a physical limitation; they + come from the comparison scope. So not all 69 / 138 rows are physical limitations. +- **Representable by construction-aware material variants (writer change, not implemented; out of S09 scope):** every + affected construction has 3 or more layers, and its zone-facing layer is a different material from its outside-facing + layer. + - A variant such as `FIX_Plasterboard` written with the internal values and used only where it is the innermost + layer on the first space's side makes all 18 / 33 exposed-face rows match. + - The partition is representable too: A's zone face (Plasterboard, needs internal) and B's (Timber, needs external) + are different materials. +- **What variants do not change:** under the current 3a scope the non-matching rows of a variant layer move from its + internal key to its external key, and the 51 / 105 buried rows stay. Removing them needs a contract decision (compare + only the faces EnergyPlus uses), not a writer change. +- **Single-layer constructions stay constrained.** Neither fixture has one. With one layer both faces are exposed and + one `Material` cannot carry two values. Splitting it into two half-thickness layers would change the layer structure + 3a compares, and the CTF discretisation. The variable-absorptance material property in the 25.1 I/O Reference is + documented to modify only the outside face; it was not assessed. +- **Glazing is not affected:** `WindowMaterial:Glazing` carries front and back reflectance and emissivity, and all 3c + rows match. +- **Owner options.** The owner chose option 1 on 2026-10-22, for the two reviewed fixtures only, with result effects + unmeasured. Options 2 and 3 are not authorised and stay available as separate tasks. + 1. accept OS-MAT-SINGLE-SIDED as a limitation for both fixtures (rank 5, never PASS) — **chosen**; + 2. a separate SAM_OpenStudio writer task for construction-aware variants, which fixes the exposed faces; + single-layer constructions would still need a rule; + 3. a separate S07/S09 contract decision on whether 3a gates optics on faces EnergyPlus does not use. + + Options 2 and 3 are independent. + +## Construction-performance calculation methods (assessment only; nothing implemented) + +**Scope.** Trace and compare only. No calculator, UI, backend, tolerance or owner decision is added. No Tas +calculation, EnergyPlus simulation or sizing was run. + +**Sources.** Code at the checked-out heads (SAM `ee377167`, SAM_UI `45263ff0`, SAM_Tas `c50e9169`, all on +`sow/2026-Q4` with clean trees, and this branch), plus the EnergyPlus 25.1 documentation. + +**Path aliases.** +- `ST/` = SAM_Tas `SAM_Tas/SAM.Analytical.Tas/` +- `UI/` = SAM_UI `WPF/SAM.Analytical.UI.WPF/` +- `SA/` = SAM `SAM/SAM.Analytical/` +- `IE/` = SAM_Tas `benchmark/SAM.Analytical.InputEquivalence/` + +### What exists + +1. **Tas-backed evaluators (SAM_UI WPF).** In the four WPF workflows traced here, the U, g and LT that SAM_UI shows + or stores come from Tas: + - the U-value window (`UI/Windows/SetUValueWindow.xaml.cs` → `TasUValueEvaluator`); + - the glazing window (`UI/Windows/SetGlazingWindow.xaml.cs` → `TasGlazingEvaluator`); + - the thermal edit services (`UI/Classes/Thermal/ThermalEditSession.cs`, `ThermalEditServices`), whose default + factories create all four evaluators; construction alternatives (`ConstructionAlternatives.cs`) evaluate through + `TasConstructionUValueEvaluator`; + - the Glazing Builder (`UI/Classes/GlazingBuilder/GlazingBuilderViewModel.cs` → `DraftGlazingEvaluator`). + + Other routes were not traced, so nothing is claimed for them: Grasshopper components (which use + `SAM.Analytical.Glazing`, item 2, for g and τv), values imported from Tas files, library or user-entered values, and + any other SAM or SAM_UI command. + - **How they call Tas:** `ST/Classes/ThermalTransmittanceCalculator.cs` writes the SAM layers into a temporary TCD + document (`ST/Modify/Run.cs`, `ST/Convert/ToTCD/Construction.cs`, `ST/Modify/UpdateMaterial.cs`). It then reads + Tas `GetUValue()` and `GetGlazingValues()`. + - **What comes back:** `GetUValue()` gives 7 values (external/internal × horizontal/up/down, plus transparent). + `GetGlazingValues()` gives LT, light reflectance, direct solar τ/ρ/α, g and two shading coefficients. + - Films, gap physics and heat-flow handling are Tas's, not SAM's. The Tas opaque film values are UNCONFIRMED. + - **Consumers:** `UI/Classes/UValue/TasUValueEvaluator.cs`, `UI/Classes/Thermal/TasConstructionUValueEvaluator.cs`, + `UI/Classes/Glazing/TasGlazingEvaluator.cs`, `UI/Classes/GlazingBuilder/DraftGlazingEvaluator.cs`. + - **Uw:** `UI/Query/GlazingUw.cs` computes (Ug·Ap + Uf·Af)/(Ap + Af), or 80/20 without geometry, with no Ψ term. +2. **`SA/Classes/Glazing.cs`** is SAM's own normal-incidence calculator, in the EN 410 style. + - Optics: multi-reflection layer optics, band-averaged in practice. The spectral path needs weights, and both callers + pass none. + - Thermal split: qi from a resistance network with he 23 and hi 8. + - Outputs g, τv, ρ and per-pane absorptance. **It has no U output.** + - Callers: the two Grasshopper components only. +3. **Gap coefficient helpers** produce Tas inputs, not results: + - `SA/Query/AirspaceConvectiveHeatTransferCoefficient.cs` (ISO 6946); + - `SA/Query/HeatTransferCoefficient.cs` and `SA/Query/NusseltNumber.cs` (EN 673 A(Gr·Pr)^n); + - `SA/Query/UpdateHeatTransferCoefficients.cs`, whose coefficient Tas then uses as the gap conductance. +4. **The S08/S09 U recomputation** (`IE/Query/ExpectedThermal.cs`; `OsComparison.NativeU`): + - opaque U = 1/(Rsi + Σ t/λ + Rse) with the S07 F-OPQ films; + - glazing U = 1/(1/7.7 + Σ t/λ + 1/25) (F-GLZ-U). + + **It is one shared formula applied to the SAM layers and to the native layers. It shows input-conversion fidelity + (the native thickness and λ reproduce SAM's). It is not an EnergyPlus calculation and validates no physics.** + - It models no gap radiation or convection, no emissivity, no gas properties, no temperature dependence and no + glazing heat-flow direction. + - Gas layers are handled differently on the two sides: the SAM side would treat a `GasMaterial` as conduction only, + while the native side returns Unreadable for `WindowMaterial:Gas` and `Material:AirGap`. Neither fixture has one. +5. **EnergyPlus 25.1** is the engine of the OpenStudio route. + - **Opaque:** the `.eio` Opaque Construction Report gives Thermal Conductance **without** films. The simulation uses + dynamic films, so no fixed-film U is part of it. + - **Window heat balance:** a layer-by-layer nonlinear balance solved iteratively each timestep (Engineering Reference, + Window Heat Balance Calculation), with: + - glass layers as conductances with front/back emissivity; + - absorbed solar per layer, split between its faces; + - gap conduction and convection from the gas properties; + - linearized gap radiation from the facing emissivities; + - ISO 15099 room-side convection. + - **Window reports:** the `.eio` Window Construction Report gives: + - centre-of-glass Conductance with films at winter conditions (21 °C in, −18 °C out, 5.5 m/s); + - SHGC at summer conditions (24 / 32 °C, 2.8 m/s, 783 W/m² normal beam); + - normal-incidence solar and visible transmittance. + - **Inputs:** + - `WindowMaterial:Glazing` optics are SpectralAverage or Spectral; + - `WindowMaterial:Gas` is Air, Argon, Krypton, Xenon or Custom; + - `WindowMaterial:SimpleGlazingSystem` takes a rated U, SHGC and optional VT. + +### Capability comparison + +| Quantity | Tas-backed evaluators (SAM_UI) | `SAM.Analytical.Glazing` | S09 recomputation | EnergyPlus 25.1 (version-matched) | +|---|---|---|---|---| +| Opaque U | Tas `GetUValue`, 6 direction/side slots, Tas films | — | F-OPQ fixed films, Σ t/λ: conversion check only | no fixed-film U; `.eio` conductance without films | +| Centre-of-glass Ug | Tas `GetUValue()[6]`, pane construction | — (no U) | F-GLZ-U fixed films, solid layers only | `.eio` winter centre-of-glass conductance with films | +| Whole-window Uw | UI area-weighted Ug/Uf (80/20 fallback), no Ψ | — | — | frame via `WindowProperty:FrameAndDivider`; whole-window reporting not traced (UNVERIFIED) | +| g / SHGC | Tas `GetGlazingValues()[5]` | g = τe + Σ qi·αi | not computed (3c derived g informational) | `.eio` summer centre-of-glass SHGC | +| Solar / visible τ, ρ | Tas τe, ρe, LT, light ρ | yes, external and internal incidence | layer inputs compared only | normal-incidence τ in `.eio`; angular in the simulation | +| Per-layer absorption | no (total direct solar α only) | yes (external incidence) | — | yes, in the heat balance (not in `.eio`) | +| Emissivity | written to Tas; used inside Tas | only through an optional gap radiative term | compared as an input (3a/3c), not used | glazing front/back; opaque one value per material | +| Gas gaps | SAM HTC → Tas conductance; gas type not written | one caller-supplied conductance per gap | not handled (native Unreadable) | from gas type and properties, convection and radiation | +| Spectral vs averaged | band-averaged inputs | band-averaged (spectral path unused) | — | SpectralAverage or Spectral | + +### Reusable code, validation gaps and recorded issues + +- **Reusable:** the OS writer already maps pane layers to `StandardGlazing`/`Gas`, frames to `FrameAndDivider` and simple + glazing to `SimpleGlazingSystem`. The S09 export already produces a translated IDF, and the S09 reader parses + EnergyPlus text without the IDD. +- **Validation gap:** no independent reference test exists for any of these. There is no EN 410 / EN 673 / ISO 6946 + worked example, and no WINDOW or EnergyPlus comparison, in SAM, SAM_UI, SAM_Tas or SAM_OpenStudio. The SAM_UI tests + use fakes; the InputEquivalence tests restate the formula. +- **Recorded issues (verified by reading the code; not reproduced, which would need Tas):** + - **Short-array guard defect (a code defect, proven by reading).** `ST/Classes/ThermalTransmittanceCalculator.cs:466-468` + (and `:508-510`) guards `values.Length >= 6` and then reads `values[6]`. A 6-element array therefore throws + `IndexOutOfRangeException` instead of being refused; the guard needs `>= 7`. `ST/Modify/Run.cs` catches every + exception, so the evaluation ends without a Ug, and the UI shows Ug ≤ 0 as "Not calculated". + - **The reported Ug display issue (cause not established).** SAM_UI `documentation/Thermal-StageE0-1.md:123` records + Ug left at 0. Tas `GetUValue()` normally returns 7 values, and the guard defect above can produce this only if Tas + returns exactly 6. Whether it ever does, or whether another exception swallowed by `Run.cs` is the cause, is + unknown. Establishing the cause needs a licensed Tas reproduction, which S09 does not authorise. Fixing the guard is + worthwhile on its own but is not shown to fix the display issue. + - **Swapped interpolation in `SA/Query/NusseltNumber.cs:54-81`.** The 0–45° branch interpolates from the 90° (wall) + coefficients and the 45–90° branch reaches the 0° (horizontal) coefficients at 90°. The coefficient therefore jumps + at the exact angles. Found by reading; not run. + - **Pane-only Ug stored as the aperture U.** `ApertureParameter.ThermalTransmittance` stores the pane-only Ug, not Uw + (SAM_UI `WPF/SAM.Analytical.UI.WPF/Modify/SetGlazing.cs:230-251`, from the `-pane` construction found at + `ST/Classes/ThermalTransmittanceCalculator.cs:370-371`). + - **Different gap physics in the two engines.** The gas type is not written to Tas, and the OS writer sends + EnergyPlus only the gas type and thickness (`OS/Material.cs:266-302`, `ToOpenStudio_WindowGas`), dropping SAM's + λ and HTC. + +### Standalone EnergyPlus route (from source and documentation only) + +- **Route:** reuse the S09 export (writer → OSM → SDK 3.10.0 translation) on a minimal model that holds the + constructions under test. EnergyPlus 25.1 initialisation writes the `.eio` construction reports quoted above. +- **Dependencies:** an EnergyPlus 25.1 executable that matches the SDK. This workstation's CLI is ladybug + OpenStudio 3.11 (IDD 25.2, not matched). The NuGet SDK has no EnergyPlus. +- **UNVERIFIED:** + - whether the reports are written without a sizing or weather period (SimulationControl all No); + - whether the tabular Envelope Summary is a usable alternative. + + Both need a bounded, separately authorised run. + +### Smallest later scope (a recommendation only; not started) + +1. **A read-only harness mode** that runs EnergyPlus 25.1 initialisation on a minimal IDF per construction set and parses + the `.eio` Opaque and Window Construction Reports. No UI change and no backend adoption. +2. **Acceptance evidence**, each item reported per quantity with its boundary conditions stated, and no tolerance until + the owner sets one: + - the constructions of both S08 fixtures plus one gas-filled double glazing; + - EnergyPlus conductance, SHGC and τ against the S09 shared-formula values (opaque conductance without films should + agree to rounding); + - the same against Tas `GetUValue`/`GetGlazingValues`; + - against one independent published reference (an EN 673/EN 410 worked example or a WINDOW export). +3. **Separately**, the two code defects above, each in its own repository with a regression test. + +## Files changed + +- `SAM_OpenStudio/SAM.Analytical.OpenStudio/Convert/ToOpenStudio/InternalCondition.cs`, `AnalyticalModel.cs`, + `IdealLoads.cs` +- `benchmark/SAM.Analytical.OpenStudio.InputReadBack/**` (new): + - `Native/`, `Compare/`, `Report/`, `Classes/`; + - `Fixtures/` (S08 bytes, `SHA256SUMS.txt`, README); + - `Run-S09-ReadBack.ps1`, `Pack-S09-Evidence.ps1`. +- `benchmark/SAM.Analytical.OpenStudio.InputReadBack.Cli/**`, `benchmark/SAM.Analytical.OpenStudio.InputReadBack.Tests/**` + (new) +- `SAM_OpenStudio.sln`, `.gitattributes` (fixtures `-text`), `.github/workflows/build.yml` +- `docs/SAM_OPENSTUDIO_INTERNAL_CONDITION_MAPPING.md`, `tests/SAM.Analytical.OpenStudio.Tests/D1/DiagnosticDetailTableTests.cs` +- `documentation/S09-OpenStudio-InputReadBack-PR.md` (this record), `documentation/S09-OpenStudio-InputReadBack-evidence/**` +- Revision 12 changed: + - `benchmark/SAM.Analytical.OpenStudio.InputReadBack/Compare/OsComparison.cs`: `OutOfEngineScopeRow`, the U1 + constants, `OutOfEngineScope`, `IsOutOfEngineScope` / `ReportedOutcome`, `OpaqueRole`, `UnusedOpaqueFace`; the + MAPPING-DIFFERENCE listing and its Supporting line replaced; + - `Report/OsReport.cs`: schema `/3`, `OutOfEngineScopeSummary`, `GatedNonPass`, local `CountByOutcome`, text block; + - `benchmark/SAM.Analytical.OpenStudio.InputReadBack.Tests/OpaqueFaceScopeTests.cs` (new, 23 cases) and + `ReadBackTests.cs` (partial; pre-U1 expectations updated); + - `docs/SAM_OPENSTUDIO_MATERIAL_MAPPING.md` (what S09 gates); + - the evidence `revision-12/` and this record; + - the acceptance pack `documentation/S09-OpenStudio-InputReadBack-evidence/acceptance-2026-10-23/` (new, after the + review; the earlier `runs/`, `negatives/` and `summary-*.json` are kept as history). + + No writer, importer, CLI, shared-core, linked-source, fixture, weather, tolerance, script or workflow change. +- Revision 2 changed: + - `Compare/OsComparison.cs`, `Native/NativeReader.cs`, `Report/OsReport.cs`, `Run-S09-ReadBack.ps1`; + - `Cli/Negative.cs`, `Tests/ReadBackTests.cs`; + - the evidence `runs/`, `negatives/` and `summary-*.json` (repacked from acc2), and the new `revision-2/` folder. + + No writer, shared-core, fixture, weather or tolerance change. +- Revision 3 changed: + - `Compare/OsComparison.cs` (`Multiplicity`, the new `OsmCounterpart`, `OsmMultiplier`), `Run-S09-ReadBack.ps1` + (2 negative cases); + - `Cli/Negative.cs` (2 cases, `RemoveObject`), `Tests/ReadBackTests.cs` (8 tests); + - the evidence `runs/` JSON, `summary-*.json` and 2 new `negatives/` folders (repacked from acc3; every existing + `report-*.txt` is unchanged), and the new `revision-3/` folder; + - this record. + + No writer, reader (`Native/`), report schema, shared-core, fixture, weather or tolerance change. +- Revision 4 changed: + - `Classes/ExportManifest.cs` (`ProcessIdentity`, `ProcessStartedUtc`, schema `/2`), `Native/NativeReader.cs` (the + reader's `ProcessStartedUtc`, schema `/2`); + - `Cli/Export.cs`, `Cli/ReadBackRead.cs` (the infrastructure checks, three report inputs); + - `Tests/TestSupport.cs` (failure evidence, `Compare`), `Tests/ReadBackTests.cs` (4 tests); + - `.github/workflows/build.yml` (the diagnostics upload on failure); + - the new `revision-4/` evidence folder and this record. + + No writer, comparison (`Compare/`), report text, shared-core, fixture, weather or tolerance change. The committed + `runs/`, `negatives/` and `summary-*.json` stay the acc3 pack. +- Revision 5 changed: + - writer: `OS/Classes/LightingSplit.cs` (new), `OS/Convert/ToOpenStudio/InternalCondition.cs`; importer: + `OS/Convert/ToSAM/InternalCondition.cs`; `SAM.Core.OpenStudio` `OpenStudioDiagnosticCodes.cs` (`SAM-OS-IC-002`), + `Query/GetDiagnosticDetail.cs`; + - S09: `Compare/OsComparison.cs`, `Compare/OsQuantities.cs`, `Cli/Negative.cs` (5 cases), `Run-S09-ReadBack.ps1` + (the 5 cases listed; not run), `Tests/ReadBackTests.cs`; + - writer tests: `C2/LightingSplitTests.cs` (new), `C2/InternalConditionCompletenessTests.cs`, + `D1/DiagnosticDetailTableTests.cs`, `D1/DiagnosticsAdapterTests.cs`; + - `docs/SAM_OPENSTUDIO_INTERNAL_CONDITION_MAPPING.md`, `docs/SAM_OPENSTUDIO_ANALYTICAL_COVERAGE.md`, + `docs/SAM_OPENSTUDIO_TO_SAM_COVERAGE.md` (totals Native 56, Derived 12), `tests/resources/openstudio-analytical-coverage.json`, + `tests/resources/openstudio-to-sam-coverage.json`; + - the new `revision-5/` evidence folder and this record. + + No fixture, weather, tolerance, shared-core, ventilation or optics change. The committed `runs/`, `negatives/` and + `summary-*.json` stay the acc3 pack (pre-L1). +- Revision 6 changed: + - `Compare/OsComparison.cs` (`LightingSplit`, `LightsDomainProblem`, `LightsPlenumProblem`), `Compare/OsQuantities.cs` + (`LightingFractionBoundary`); + - `Cli/Negative.cs` (6 cases, `AppendFields`), `Tests/ReadBackTests.cs` (8 tests); + - the new `revision-6/` evidence folder and this record. + + No writer, importer, report schema, shared-core, fixture, weather, tolerance, ventilation or optics change. +- Revision 7 changed: + - `Compare/OwnerDecisions.cs` (new), `Compare/OsComparison.cs` (`Run`: the acceptances and the OS-MAT-SINGLE-SIDED + Supporting line), `Cli/ReadBackRead.cs` (the verified model hash passed to `Run`); + - `Tests/ReadBackTests.cs` (1 test changed, 5 added, 1 message filter); + - the new `revision-7/` evidence folder and this record. + + No writer, importer, report schema, exit code, shared-core, SAM_Tas, fixture, weather, tolerance, ventilation or + lighting change. +- Revision 8 changed: + - writer: `OS/Convert/ToOpenStudio/Material.cs` (`ToOpenStudio_Layer`, face variants, metadata), + `Construction.cs` (face by SAM layer position, `SingleLayerDivergentFaceOptics`), `AnalyticalModel.cs` (per-use + single-layer error, `ForwardSideProblem`, `IsZoneFaceOnlyBoundary`); `SAM.Core.OpenStudio` + `OpenStudioDiagnosticCodes.cs` (`SAM-OS-MAT-003`), `OpenStudioIdentityKeys.cs` (face keys); + - importer: `OS/Convert/ToSAM/MaterialLibrary.cs` (`StampedFaceOptics`), `OS/Classes/OpenStudioImportContext.cs`; + - S09: `Compare/OsComparison.cs` (used-face comparison, `SingleLayerFaces`; `Run` as at revision 6), + `Cli/ReadBackRead.cs` (as at revision 6), `Compare/OwnerDecisions.cs` deleted, `Tests/ReadBackTests.cs`; + - writer tests: `M4/OpaqueFaceOpticsTests.cs` (new, 21), `C7/DeclaredDiagnosticsTests.cs`, + `D1/DiagnosticDetailTableTests.cs`, `D1/DiagnosticsAdapterTests.cs`; + - `docs/SAM_OPENSTUDIO_MATERIAL_MAPPING.md`, `docs/SAM_OPENSTUDIO_ANALYTICAL_COVERAGE.md` (Derived 31, Approximated + 18), `tests/resources/openstudio-analytical-coverage.json`; + - the new `revision-8/` evidence folder and this record. + + No fixture, weather, tolerance, report schema, shared-core, SAM_Tas, ventilation, lighting or glazing change. +- Revision 9 changed: + - writer: `OS/Convert/ToOpenStudio/Material.cs` (`InheritedInternalOptics`, SAM-OS-MAT-004, written stamps); + `SAM.Core.OpenStudio` `OpenStudioDiagnosticCodes.cs` (`SAM-OS-MAT-004`), `OpenStudioIdentityKeys.cs` + (`WrittenPrefix`), `Query/GetDiagnosticDetail.cs` (MAT-004 at Summary); + - importer: `OS/Convert/ToSAM/MaterialLibrary.cs` (`ReadFaceObject`, `ApplyEdits`, `MergedOpaqueMaterial`), + `OS/Classes/OpenStudioImportContext.cs` (`OpaqueMaterialGroups`); + - S09: `Compare/OsComparison.cs` (`ExpectedLayerValue`: NaN is unstated), `Tests/ReadBackTests.cs` (2 cases); + - writer tests: `M4/OpaqueFaceOpticsTests.cs`, `D1/DiagnosticDetailTableTests.cs`, `D1/DiagnosticsAdapterTests.cs`; + - `docs/SAM_OPENSTUDIO_MATERIAL_MAPPING.md`, `docs/SAM_OPENSTUDIO_ANALYTICAL_COVERAGE.md`, + `docs/SAM_OPENSTUDIO_TO_SAM_COVERAGE.md`, `tests/resources/openstudio-analytical-coverage.json`, + `tests/resources/openstudio-to-sam-coverage.json`; + - the new `revision-9/` evidence folder and this record. + + No fixture, weather, tolerance, report schema, shared-core, SAM_Tas, ventilation, lighting, glazing, single-layer or + exposed-face change. +- Revision 10 changed: + - importer: `OS/Convert/ToSAM/MaterialLibrary.cs` (`ToSAM` membership check, `FaceObject.Faces`/`Carries`, + `ServedFaces`, `DivergentAuthoredOptics`, `Handle`, `MergedOpaqueMaterial` members and per-face supply, warning + text), `OS/Classes/OpenStudioImportContext.cs` (`OpaqueMaterialGroups` value); + - writer tests: `M4/OpaqueFaceOpticsTests.cs` (23 cases); + - `docs/SAM_OPENSTUDIO_MATERIAL_MAPPING.md` (import identity); + - the new `revision-10/` evidence folder and this record (the layer-order proposal). + + No writer, S09, construction import, fixture, weather, tolerance, report schema, shared-core, SAM_Tas, ventilation, + lighting, glazing or roadmap change. +- Revision 11 changed: + - importer: `OS/Convert/ToSAM/Construction.cs` (innermost-first read, `ConstructionUse`, the split), + `OS/Convert/ToSAM/Panel.cs` (`ResolveConstruction` reads `SurfaceConstructionMap` first), + `OS/Convert/ToSAM/AnalyticalModel.cs` (`PanelSides`, `IsSamForwardSide`, `SurfaceConstruction`, `OrderSpaces`, + `ResolvePanel` side choice, fallback survivor, pass D order, `SurfaceFaces` with `Physical`, `Snapshot`, `Physical`, `WrittenAbsorptances`, `ComparePhysical`, `VerifySurfaceFaces`), `OS/Classes/OpenStudioImportContext.cs` + (`SurfaceConstructionMap`, `ConstructionUses`); + - `SAM.Core.OpenStudio` `OpenStudioImportDiagnosticCodes.cs` (`ConstructionFacesUnresolved`, SAM-OSI-CON-002); + - writer tests: `M4/OpaqueLayerOrderImportTests.cs` (new, 39 cases), `M4/OpaqueFaceOpticsTests.cs` (2 comments), + `D1/DiagnosticsAdapterTests.cs` (CON-002 in the released import codes); + - `docs/openstudio-to-sam-import-audit.md` (CON-002) and the `OS:Construction.FacesUnresolved` coverage entry + (Unsupported 46, total 145); + - `docs/SAM_OPENSTUDIO_MATERIAL_MAPPING.md` (import layer order, fail-closed check including per-layer thickness, compatibility), + `docs/SAM_OPENSTUDIO_TO_SAM_COVERAGE.md` and `tests/resources/openstudio-to-sam-coverage.json` (`OS:Construction.Opaque`); + - the new `revision-11/` evidence folder and this record. + + No writer, S09, material import, fixture, weather, tolerance, report schema, SAM_Tas, ventilation, + lighting, glazing, door-pane, shading or roadmap change. + +## Tests and validation (local, Release x64) + +| Check | At | Result | +|---|---|---| +| Acceptance (`Run-S09-ReadBack.ps1`, both phases; `Pack-S09-Evidence.ps1`) | head `d26665b` (code `8edf793`; harness `8a77b235…`, library `d2368ce8…`, writer `67a2ded7…`), root `C:\TasOut\s09\acc7-u1` (machine-local) | box / two / box-repeat PASS exit 0 (319/319, 592/592); out-of-engine-scope 105 / 216, differing 69 / 138; 21/21 negatives FAIL exit 10; repeat IDF and `report.txt` identical; provisional baseline: box 0, two-zone 12 (no T-VENT-INACTIVE in that rule set). Pack: `acceptance-2026-10-23/` | +| S09 tests | `8edf793` (revision 12, `8edf793a63b274cafe5e55b9e85fa597d6307a10`; harness `bb843152…`, library `46cd8fb6…`, writer `37226c49…`) | **120/120** (97 retained, 6 with updated pre-U1 expectations, + 23 new); both fixtures PASS exit 0; `report.txt` byte-identical in two sessions (`revision-12/`). The first session failed 1 new case (an adiabatic test wall with a window); only the test's wall choice changed | +| Writer/importer, `--filter 'TestCategory!=Simulation'` | `8edf793` | **471 passed, 2 skipped** (the real-SQL fixtures; no writer, importer or writer-test change) | +| Benchmark, `--filter 'TestCategory!=Simulation'` | `8edf793` | 51/51 | +| A/B: the `adcad2f` S09 library on the revision-12 test runs | isolated copy, removed afterwards | fixtures and valid variants 12 or 10 → U1 0; undeterminable roles and out-of-domain SAM hidden as 12 → U1 10 / 11; defect cases unchanged (`revision-12/ab-pre-u1.txt`) | +| S09 tests | `4ea2e6c` (revision 11 final, `4ea2e6c2ac5805426ed1b39bdd5d88b39b1c723f`; harness `4f746d9a…`, library `0bf9fd32…`, writer `331ec187…`) | **97/97**; both fixture `report.txt` byte-identical to `revision-9/` | +| Writer/importer, `--filter 'TestCategory!=Simulation'` | `4ea2e6c` | **471 passed, 2 skipped** (462 + 9 per-layer consistency cases) | +| Benchmark, `--filter TestCategory!=Simulation` | `4ea2e6c` | 51/51 | +| A/B D: `f5f207b` `AnalyticalModel.cs` (names-only check) | working tree, then restored and rebuilt | the 3 regressions fail (each imported with a changed thickness); the 6 controls pass | +| The review's `revision-11-consistency-probe`, unchanged | `4ea2e6c` binaries | `importSuccessful=False`, one SAM-OSI-CON-002: layer 2 ('Reviewer_Plasterboard_20mm') in space B is 0.02 m but the SAM layer 0.0125 m (at `f5f207b`: successful, 12.5 mm on both sides) | +| S09 tests | `f5f207b` (revision 11 reviewed code, `f5f207b456a3e7e2429ead4054c779031615e2b7`; harness `6b4c510d…`, library `c64d8cb5…`, writer `209c519b…`) | **97/97**; both fixture `report.txt` byte-identical to `revision-9/` | +| Writer/importer, `--filter 'TestCategory!=Simulation'` | `f5f207b` | **462 passed, 2 skipped** (432 + 30 layer-order cases) | +| Benchmark, `--filter TestCategory!=Simulation` | `f5f207b` | 51/51 | +| A/B A: revision-10 importer restored (4 files) | working tree, then restored and rebuilt | layer-order cases (20 at `5241bdd`): **18 fail**, 2 pass (shading-only, non-layered); the glazing, door-pane and air-boundary controls fail only on their "walls innermost first" line | +| A/B B: reversal kept, revision-10 `AnalyticalModel.cs` | same | only the 2 mixed cases fail; the stamped interzone and fallback cases passed by space-order chance in that run (the fallback case with B first had failed during development) | +| A/B C: `5241bdd` `AnalyticalModel.cs` (warning-only re-read, no face check) | same | fail-closed cases: **7 of 12 fail** (4 divergent errors and the edited wall imported with changed faces; 2 equal-face contradictions reversed); the 5 equivalent-success controls pass | +| Earlier revision-11 runs | `37841ea`; `5241bdd` | 37841ea: 97/97, 451 + 2 skipped, 51/51. 5241bdd: 97/97, 51/51, writer 451 passed / **1 failed** (`EveryDeclaredDiagnosticCode_Exists`, caused by editing the coverage manifest during that run; passes at `f5f207b`) | +| The review's `revision-9-probe`, unchanged | `f5f207b` binaries | `ROUNDTRIP` Brick → Insulation → Plasterboard_Internal, zone face 0.42, import successful; `MALFORMED` 9; `EQUAL_FACE` valid | +| S09 tests | `78f1014` (revision 10, `78f10146481dbd4fe46af8761813fa4f9d58d357`; harness `3589bc9c…`, library `40ee4c7d…`, writer `5286c4ad…`) | **97/97**; both fixture `report.txt` byte-identical to `revision-9/` (S09 does not use the OpenStudio importer) | +| Writer/importer, `--filter 'TestCategory!=Simulation'` | `78f1014` | **432 passed, 2 skipped** (409 + 23 face-optics cases; face-optics 53) | +| Benchmark, `--filter TestCategory!=Simulation` | `78f1014` | 51/51 | +| A/B: `ToSAM/MaterialLibrary.cs`, `OpenStudioImportContext.cs` of `806d544` restored | working tree, then restored and rebuilt | face-optics **16 of 53 fail** (exactly the new regressions); the 7 new controls and the 30 revision-9 tests pass | +| The review's `revision-9-probe`, unchanged | revision-10 binaries | `MALFORMED importedConductivity=9` with the named warning; `EQUAL_FACE afterValid=True`; `ROUNDTRIP` unchanged (layer order) | +| S09 tests | `354e532` (revision 9; harness `4edf422b…`, library `1c4408f7…`) | **97/97** (95 + 2 provenance cases); both fixture `report.txt` byte-identical to `revision-8/` | +| Writer/importer, `--filter 'TestCategory!=Simulation'` | `354e532` | **409 passed, 2 skipped** (face-optics tests 30, was 21) | +| Benchmark, `--filter TestCategory!=Simulation` | `354e532` | 51/51 | +| A/B: `Material.cs`, `MaterialLibrary.cs`, `OpenStudioImportContext.cs`, `OsComparison.cs` of `901e592` restored | working tree, then restored and rebuilt | face-optics **9 of 30 fail** (the new regressions), S09 provenance **2 of 2 fail**; controls pass | +| S09 tests | `fc83a6d` (revision 8; harness `44cb7177…`, library `1a4a03df…`) | **95/95**: the revision-7 cases minus its 5 acceptance tests and with the fixture test requiring exit 12, plus 7 optics tests | +| Writer/importer `tests/SAM.Analytical.OpenStudio.Tests`, `--filter 'TestCategory!=Simulation'` | `fc83a6d` | **400 passed, 2 skipped** (379 + 21 new; 2 changed) | +| Benchmark `--filter TestCategory!=Simulation` | `fc83a6d` | 51/51 | +| A/B: writer of `7fccdcc` restored | working tree, then restored and rebuilt | 8 optics tests: **8 failed** (fixtures exit 10, zone faces out of tolerance) | +| A/B: comparator of `8fd0ffc` restored | working tree, then restored and rebuilt | 8 optics tests: **8 failed** (used faces listed; swapped face exit 12, hidden) | +| S09 tests | `614a7a8` (revision 7; harness `e41b13ee…`, library `afc9920c…`) | **93/93**: the 88 revision-6 cases (1 changed to require exit 14) plus 5 | +| The new and changed tests with `Cli/ReadBackRead.cs` of `8fd0ffc2` restored | working tree, then restored and rebuilt | **2 failed, 5 passed**: the two acceptance tests fail (exit 12); the binding and plenum controls pass | +| S09 tests | `225881f0` (revision 6; harness `a05202d0…`, library `727c08bc…`) | **88/88**: the 80 revision-5 cases, unchanged, plus 8 (5 regressions, 3 controls) | +| The 8 new tests with the reviewed `OsComparison.cs` (`31af6022`) restored | working tree, then restored (`cmp` identical) and rebuilt | **5 failed, 3 passed**: exactly the 5 regressions fail (exit 12) | +| The reviewer's 5 artifacts, read and compared fresh | `225881f0` harness | 2 controls unchanged (12); 2 invalid splits FAIL (10); dynamic plenum BLOCKED technical (11) | +| `tests/SAM.Analytical.OpenStudio.Tests` with `--filter 'TestCategory!=Simulation'` | `225881f0` | 379 passed, 2 skipped (no writer or test change) | +| Benchmark tests (not Simulation) | `225881f0` | 51/51 | +| S09 tests | `20f8fb65` (revision 5; harness `3549e421…`, library `b4e03d5f…`) | **80/80**: the 62 revision-4 cases (2 adjusted: no lighting exception, two-zone ACCEPTED-TRANSFORMATION 14) plus 18 lighting cases. Run twice; the second run produced `revision-5/` | +| `tests/SAM.Analytical.OpenStudio.Tests` with `--filter 'TestCategory!=Simulation'` | `20f8fb65` | **379 passed, 2 skipped** (381 = the reviewer's 365 + 16 new). An earlier working-tree run had 1 failure, the "hole" substring collision, fixed before the commit | +| Benchmark tests (not Simulation) | `20f8fb65` | 51/51 | +| A/B: the `6a36afb` writer and importer restored over `20f8fb65` | working tree, then restored and rebuilt | writer 18 failed / 361 passed; S09 21 failed / 59 passed | +| Acceptance scripts | not run (out of revision-5 scope) | the committed pack stays acc3 | +| S09 tests | `0c232875` (revision 4; harness `25a35b92…`, library `006668df…`) | **62/62**: the 58 revision-3 cases, unchanged, plus the 4 process-identity tests | +| The 4 new tests with the reviewed head's id-only check restored | working tree, then restored and rebuilt | `AReusedProcessId_IsNotTheExportProcess` fails (exit 70); the 3 refusal cases pass under both | +| Benchmark tests (not Simulation) | `0c232875` | 51/51 | +| Acceptance and negatives, `C:\TasOut\s09\acc6` | revision-4 harness `25a35b92…` | as in "Fixture verdicts"; 16/16 negatives FAIL; originals unchanged; all 19 `report.txt` and the 3 IDFs byte-identical to acc3 | +| Reused-id A/B, `C:\TasOut\s09\rev4-ab` | `e0a6ea19` source vs `0c232875` | see "Revision 4" | +| `tests/SAM.Analytical.OpenStudio.Tests` (writer regressions) | not re-run: revision 4 changes no writer or writer-test file | 388 passed, 2 skipped at revision 3 (unfiltered scope; see "Writer-test scope correction") | +| S09 tests (export in-process; read and compare in fresh processes) | `c1e53328` (revision 3) | **58/58**: the 50 revision-2 cases, unchanged in what they assert (the BLOCKED-technical test's "mutation applied" check now also covers the OSM), plus 8 new cases: 4 missing-counterpart FAILs (both cases × both fixtures), 1 fixture counterpart count, and 3 cases added to the BLOCKED-technical test (duplicated OS:ThermalZone, unlabelled OS:ThermalZone Name, relabelled OS:SubSurface Multiplier) | +| The same 58 tests with the reviewed head's `OsComparison.cs` (`6f7e6b7d`) | working tree, then restored and rebuilt `--no-incremental` | **8 failed, 50 passed**: exactly the 8 new tests fail | +| Acceptance and negatives, `C:\TasOut\s09\acc3` | revision-3 harness | 3 runs as in "Fixture verdicts"; 16/16 negatives FAIL; originals unchanged; acc3 IDFs byte-identical to acc2 | +| Before/after on the same inputs, `C:\TasOut\s09\rev3-ab` | `6f7e6b7d` vs `c1e53328` | see "Revision 3" | +| `tests/SAM.Analytical.OpenStudio.Tests` (writer regressions) | revision-3 working tree (= `c1e53328`; no writer or test change) | 388 passed, 2 skipped (390), as at revision 2 (Total 390 = no category filter; see "Writer-test scope correction") | +| `benchmark/SAM.Analytical.OpenStudio.Benchmark.Tests` (not Simulation) | same | 51/51 | +| S09 tests (revision 2) | `cfe097f4` | **50/50**: the 33 revision-1 tests unchanged, plus 17 new: 9 negatives (6 box, 3 two-zone), 3 SAM-intent-only, 4 BLOCKED-technical, 1 fixture placement | +| (revision 2) The same 50 tests with `Orientation()` and `Multiplicity()` disabled (the reviewed head's behaviour) | working tree, then restored | **17 failed, 33 passed**: exactly the new tests fail | +| (revision 2) `tests/SAM.Analytical.OpenStudio.Tests` (writer regressions) | revision-2 working tree (no writer or test change) | 388 passed, 2 skipped (390 = the `[Test]`/`[TestCase]` count at the base `7f216657` and here; revision 1 recorded 363/2, which is superseded) (historical text kept; 363 + 2 = 365 is the filtered count, so "superseded" is withdrawn: see "Writer-test scope correction") | +| (revision 2) `benchmark/SAM.Analytical.OpenStudio.Benchmark.Tests` (not Simulation) | same | 51/51 | +| (revision 2) Acceptance and negatives, `C:\TasOut\s09\acc2` | revision-2 harness | 3 runs as in "Fixture verdicts"; 14/14 negatives FAIL; originals unchanged | +| Before/after on the same inputs, `C:\TasOut\s09\rev2-ab` | `d6d1cc5b` vs revision 2 | see "Revision 2" | +| Revision 1 mutations M1 (V1 delivers fraction 1), M2 (override unscheduled) | `ebd9c4e4` | 5 and 3 tests fail (not repeated) | + +```text +dotnet test benchmark/SAM.Analytical.OpenStudio.InputReadBack.Tests/SAM.Analytical.OpenStudio.InputReadBack.Tests.csproj -c Release -p:Platform=x64 +dotnet test tests/SAM.Analytical.OpenStudio.Tests/SAM.Analytical.OpenStudio.Tests.csproj -c Release -p:Platform=x64 --filter 'TestCategory!=Simulation' +dotnet test benchmark/SAM.Analytical.OpenStudio.Benchmark.Tests/SAM.Analytical.OpenStudio.Benchmark.Tests.csproj -c Release -p:Platform=x64 --filter TestCategory!=Simulation +benchmark/SAM.Analytical.OpenStudio.InputReadBack/Run-S09-ReadBack.ps1 -Phase acceptance -Root -WeatherEpw +benchmark/SAM.Analytical.OpenStudio.InputReadBack/Run-S09-ReadBack.ps1 -Phase acceptance-negative -Root -WeatherEpw +benchmark/SAM.Analytical.OpenStudio.InputReadBack/Pack-S09-Evidence.ps1 -Root +``` + +Revision 12 built each test project Release x64 first and ran the three `dotnet test` lines with `--no-build` (exact +commands in `revision-12/README.md`); the acceptance and packing scripts were not run. + +### Writer-test scope correction (record only, after the review of `59036783`) + +- **The command was unsafe.** Until this correction the writer-test line above had no category filter. The writer + suite has 25 `[Category("Simulation")]` cases (390 total, 365 without them), so as written it would also select + the Simulation cases. It now passes `--filter 'TestCategory!=Simulation'`. The benchmark line already filtered; the + S09 project has no Simulation category. No other S09 reproduction command in this record or the `revision-2/`, + `revision-3/` or `revision-4/` READMEs runs the writer suite. +- **Historical 388 passed / 2 skipped claims (kept above, not rewritten):** + - Revision 3: a retained machine-local summary, `C:\TasOut\s09\rev3-ab\other-tests.txt` (not committed), reads + `Passed: 388, Skipped: 2, Total: 390, Duration: 5 m 45 s`. Total 390 shows the run had no category filter, so the + 25 Simulation cases were in scope. The summary does not show per-test outcomes or whether EnergyPlus was invoked. + - Revision 2: no log retained. The record's total of 390 indicates the same unfiltered scope; its execution scope is + otherwise unverified. + - Revision 4: not run (as stated above). + - No owner authorisation for a simulation run is recorded for any of these runs, and none is inferred here. + - Revision 1's 363/2 (365 total) matches the filtered count. The revision-2 note calling it superseded is withdrawn; + revision 1's exact command is not recorded, so its scope is likewise unverified. +- **The independent reviewer's results at `59036783` (reviewer-run; not run in this session):** S09 tests 62/62; + benchmark tests excluding Simulation 51/51; writer suite with `--filter 'TestCategory!=Simulation'` 363 passed, + 2 skipped. This filtered writer result is the one that matches the corrected command. + +The before/after commands are in `documentation/S09-OpenStudio-InputReadBack-evidence/revision-3/README.md` +(revision 3) and `revision-2/README.md` (revision 2, with the optics commands). Under Windows PowerShell 5.1, pass +`-Exe ` to `Run-S09-ReadBack.ps1`: its `$PSScriptRoot`-based default is empty there +(it was run with an explicit `-Exe` for acc3). + +- **Prerequisites:** + - sibling checkouts `SAM` (built into `SAM/build`) and `SAM_Tas` at `sow/2026-Q4`; + - the Budapest EPW, decompressed from SAM `SAM/SAM/SAM.Tests/Resources/Weather/HUN_BU_Budapest.Met.Center.128400_TMYx.epw.gz` + (sha256 `472ffb4e…`). +- **Machine-local** (not needed elsewhere): `C:\TasOut\s09\acc1` (revision 1), `C:\TasOut\s09\acc2` and + `C:\TasOut\s09\rev2-ab` (revision 2), `C:\TasOut\s09\acc3` and `C:\TasOut\s09\rev3-ab` (revision 3), + `C:\TasOut\s09\acc6` and `C:\TasOut\s09\rev4-ab` (revision 4). `acc4-discarded-old-check-binary` is not evidence. +- Build first and then run `dotnet test --no-build`: SDK 10.0.401 `dotnet test` rejects `--no-incremental`. +- Building the reference writes ignored `bin/obj` output into the SAM_Tas core folder. The SAM_Tas working tree stays + clean. +- **Hosted CI** (Build (Windows) and SPDX on each PR head): + - The Build workflow clones SAM, SAM_SQLite and SAM_Validation, then SAM_Tas sparsely (the core and `ReadBack/`), + trying the PR head branch name first and then `sow/2026-Q4`. None of them has this branch, so all resolve to + `sow/2026-Q4`. It logs the SAM_Tas SHA, builds, and runs two test projects: the benchmark producer tests (51) and + the S09 tests. **It does not run `tests/SAM.Analytical.OpenStudio.Tests`**; the writer regressions above are local + only. + - At the revision-2 head `6f7e6b7d`: Build (Windows) run 39598434178 succeeded (SAM_Tas `c50e9169`, `sow/2026-Q4`; + benchmark 51/51, S09 50/50); SPDX run 39598434210 succeeded. + - At the revision-3 head `e0a6ea19`: Build (Windows) run 39603021836 **failed** (S09 57/58; see "Revision 4"); SPDX + run 39603021804 succeeded. + - From revision 4, a failed Build uploads `SAM_OpenStudio-s09-diagnostics` (the S09 failure text only). + - The final head and its checks are in the PR description. + +## Unresolved, risks, limits + +- **Owner decisions in force (2026-10-22):** the T-VENT-INACTIVE extension (ventilation A) and the Decision 5 reading + (lighting B1). The optics option-1 acceptance (revision 7) is superseded: revision 8 corrects the writer instead. +- **Revision 12 (S07 §5.2, amendment U1) limits:** + - **Resolved by U1:** the revision-8 owner decision on the 69 / 138 unused-face rows (the S07 3a scope decision was + taken by SAM#218). They are now OUT-OF-ENGINE-SCOPE and both fixtures PASS, exit 0: scoped native-input conformance + only. It is not simulation equivalence, not a Phase B PASS (S08-S11 PASS is needed; no roadmap exception is + requested) and not an owner acceptance of anything else. Passed independent code review; acceptance pack + `acceptance-2026-10-23/`. + - Acceptance tooling under Windows PowerShell 5.1 (observed 2026-10-23, scripts not changed): `$PSScriptRoot` is + empty in the parameter defaults of `Run-S09-ReadBack.ps1` and `Pack-S09-Evidence.ps1` (pass `-Exe` / `-Target`), + and `Pack-S09-Evidence.ps1` reads reports with the ANSI default, turning "§" into "§". The committed pack was + made with `Get-Content` defaulted to UTF-8 and checked byte-identical; the earlier packs have no "§". + - The premise (EnergyPlus 25.1 reads only the outermost outside face and the innermost zone face of an opaque + construction) is S07's, from the revision-8 optics table; it was not re-verified against the EnergyPlus reference + here, and no engine was run. A later engine version or setting that reads other faces needs a new decision (§5.2). + - The S07 contract text keeps its proposal-era labels ("proposed", "owner approval = merge of this PR"); approval is + the merge `b06dbe8c` and closeout `0168d03f`. Tidying those labels is a separate SAM change, not made here. + - The S09-only OS-MAT-SINGLE-SIDED listing is removed; an unused-face row that cannot be excluded and differs is + OUT-OF-TOLERANCE (FAIL). A native exact 0 against an authored non-zero stays EXPORT-DEFECT. Both are review items. + - Used-face optics outside [0, 1] are compared numerically as before (U1 keeps used faces as today); only unused faces + apply the [0, 1] validity check. Material:NoMass and AirGap optics remain unreadable to S09 (BLOCKED technical). + - The writer's construction-aware variants' effect on results stays unmeasured (no engine run; §5.2 adds none). +- **Revision 8 limits and open items:** + - **Owner decision (resolved by U1, revision 12):** the 69 / 138 rows on faces EnergyPlus does not use kept both + fixtures BLOCKED owner (exit 12) until S07 §5.2; see the revision-12 item above. + - **Behaviour change:** every SAM model whose first-layer materials have differing faces now exports `_Internal` + variants with different zone-face absorptances. **The effect on results is unmeasured**; nothing was simulated. + - A single-layer outdoor or interzone construction with differing faces now makes the conversion invalid + (SAM-OS-MAT-003); such models stopped converting cleanly. The S09 test shows the writer still saves the OSM with + that surface unconstructed; whether EnergyPlus accepts such a model is not checked (no engine run). + - The missing-first-side error is verified at unit level only (no realistic model found that drops only that side). + - An unstated Internal* takes the External* value on a zone face; since revision 9 this is reported + (SAM-OS-MAT-004, Summary) and S09 reports those rows as S-UNSPEC EXPORT-DEFECT. Accepting the inheritance would + need an S07 default for internal faces (an S07 decision), not a writer change. + - **Round-trip layer order (pre-existing, found in revision 9, confirmed by the review of `806d5449`):** corrected by + revision 11 for opaque constructions used by planar surfaces. Limits of revision 11: + - Glazing and pane constructions, door panes and shading keep OpenStudio's order by instruction; whether pane order + has the same round-trip issue is not examined here. + - Previously imported SAM models are not migrated (nothing identifies them). + - The space order of an imported SAM-written model can differ from the visit order. A contradiction of forward + sides (edited models only) is warned; the panels it affects are re-read and must pass the fail-closed face check. + - **Fail closed, not repaired:** an edited or mixed model whose orientation or face roles cannot reproduce every + used face (SAM-OSI-CON-002) is now an unsuccessful import. It could be imported faithfully only with per-panel + material variants (a mirrored copy with swapped faces), which is not implemented. Such models stop importing + where earlier revisions imported them with silently changed faces. + - The check compares layer order and used-face absorptances only. Thickness and thermal properties follow from the + same layer objects. Native layers of unsupported families are not compared. + - OpenStudio usually returns spaces in creation order but not always (a scratch probe of 4 exports with space B + authored first returned A first once), so the stamped space-order cases can pass by chance without `OrderSpaces`; + the geometric-fallback case caught it once during development, and the mixed test now forces the contradiction + on every run. + - The reverse native construction is still read as its own SAM construction, which only a panel built from that + side uses (unstamped models, the re-read), as before. + - **Revision 10 served faces:** a construction with no SAM identity that is not the mirror of a SAM-written one is of + unknown direction, so an equal-face object at its exposed position takes an edit on both faces. Construction + positions are read, not whether a surface uses the construction. An opaque door-pane position counts as the + external face only (the writer's door rule). Served faces are computed only for edited objects (a scan of the + model's constructions). + - Import merging uses only `SAM.MaterialGuid`; objects written before revision 9 lack `SAM.Written.*`, so an unstated + value on them is kept as an edit of unknown provenance (reported). + - Opaque door panes keep the external values on both faces (SAM-OS-MAT-002 information), outside this scope. + - Import (revision 9): compatible face and thickness objects of one source Guid merge into one material; conflicting + ones are imported separately with a warning, each with a new Guid except the identity carrier. +- **Still open:** + - **OD-L1 (S07 §8):** suitability of p₀ outside suspended LED office lighting, and whether a writer may replace a + template-prescribed value with it. The confirmed reading lets OpenStudio apply p₀ to an unstated p, stated and + claiming nothing beyond the category. No current fixture uses the fallback. + - The Tas-side lighting change needs a separate, OD-L1-gated SAM_Tas approval. + - The lighting visible-fraction default of revisions 1–4 is withdrawn by L1; it needs no decision. +- **Compatibility risks (revision 5):** + - Every OpenStudio export changes its `Lights` fractions. An authored p keeps its total radiant share, but F_V moves + from the view coefficient (or 0.25) to p·s. An unstated p moves from 0.32 / 0.25 (sum 0.57, convective 0.43) to + 0.3345 / 0.2415 (0.576, 0.424). EnergyPlus results for lighting gains change; nothing was simulated here. + - An authored view coefficient no longer reaches EnergyPlus. + - Importing an OSM sets p = F_R + F_V (previously F_R) and no view coefficient. SAM files imported earlier hold the + old meaning and cannot be identified or migrated (§5.1). + - A new Summary information line per SpaceType (`SAM-OS-IC-002`) appears in every conversion with lights. A consumer + counting Information lines or `SAM-OS-*` codes sees one more code; codes are added, none renamed. + - The Tas side is unchanged until the separate, OD-L1-gated SAM_Tas PR: for an unstated p Tas keeps its TBD value + (S07: EXPORT-DEFECT on the S08 side), so OpenStudio and Tas differ for unstated p until then. +- **Revision 6 limits:** + - A plenum-calculated return air (`Yes`) is refused as unsupported, not verified. A dynamic read-back would need its + own contract row. + - The plenum setting and the domain guard read the IDF, which EnergyPlus runs. The OSM `OS:Lights:Definition` plenum + field is not cross-checked against it, as no Lights field was before. + - The domain boundary 1e-12 is a read-back constant documented in `OsQuantities`, not an S07 tolerance. +- **Not covered by revision 5:** the acceptance and packing scripts (not run; the committed pack is pre-L1); a + `Lights` object written with a blank Fraction Radiant or Visible (the writer always states them; the comparator reads + blank as 0); the LED view-coefficient value (unresolved in §5.1, not used by OpenStudio). +- **Translator version:** the IDF comes from the OpenStudio SDK 3.10.0 translator (it matches the SDK that wrote the + OSM). A production run translates with the CLI. This workstation's CLI is ladybug 3.11.0, and S06 prefers an + SDK-matching CLI. The CLI translation was not exercised. +- **Not exercised by the fixtures:** internal floors and ceilings, internal apertures, gas glazing, `Material:AirGap`, + shading, design days (T-DD), leap years, weekday sub-profiles, multi-space zones, an override in a real model. + - Rotated models (a stated SAM North Angle) are refused as unsupported, not compared. World coordinates are + supported (absolute vertices, no zone origin or rotation), and only World with a non-zero north axis or zone + relative north is refused. No compared model uses World; only that refusal is tested. + - Single-layer opaque constructions are absent from the fixtures; revision 8 tests them on modified copies only. + - The reader reports each of these as unreadable, unsupported or not applicable, never as a match. +- **S08 record discrepancy (record only; SAM_Tas not changed):** SAM_Tas + `Documentation/S08-PRC-FixturesAcceptance-PR.md:78` lists the two-zone openings as "A framed south; B framed north, + unframed east". The signed-off `s08-fix-two.json` (`20da9b58…`) contains one aperture (A, framed south), as its + OSM/IDF do. The fixture bytes are unchanged; the S08 record text needs a separate correction. +- **Space-type reuse:** OpenStudio space types are shared per content hash, so the V1 note and the invalid-selection + error appear once per SpaceType and once per override. +- **OSM counterparts, one direction only (revision 3):** each IDF zone and subsurface must have its one OSM object. An + OSM `OS:ThermalZone` or `OS:SubSurface` with no IDF object of its name is not looked for by `Multiplicity`. Closing + that would be a separate, owner-scoped check, not part of this fix. +- **The Build 39603021836 cause (revision 4):** likely id reuse, but unproven. The run kept no output, id reuse was not + measured on a GitHub runner, and an exception inside `compare` is not excluded by CI evidence. A recurrence now + uploads `SAM_OpenStudio-s09-diagnostics`, which names the branch. +- **S08 has the same id-only check (observation, SAM_Tas not changed):** SAM_Tas + `SAM_Tas/SAM.Analytical.Tas.DirectT3D.Validation/ReadBack/ReadBackCompare.cs:159` (`c50e9169`). Whether id reuse can + reach it was not assessed; any change there is a separate SAM_Tas task. +- **Duplicate `OS:Building` (observation, not changed):** `Orientation` reads it with `SingleOrDefault`. A copy of the + box run with two `OS:Building` objects makes `compare` throw and exit 70 (infrastructure failure). It fails closed, + but not as a named BLOCKED technical entry (`revision-3/README.md`). + +## Next step + +Both fixtures PASS, exit 0, under S07 §5.2 (scoped native-input conformance; not Phase B). Do not start S10. +Revision 12 passed independent code review, and the acceptance pack at head `d26665b` is committed +(`acceptance-2026-10-23/`). +- **Final review of the acceptance evidence** (the record head and its hosted checks in the PR description). +- Then the **owner's merge decision** (the PR is open and was marked ready for review by the owner account on + 2026-10-23; this task did not change its draft state). After merge: the known-SHA `PROJECT_PROGRESS.md` closeout and + guarded branch cleanup. +- Optional, separate: make the two scripts work as written under Windows PowerShell 5.1 (`$PSScriptRoot` in parameter + defaults; `Get-Content` without `-Encoding UTF8` in `Pack-S09-Evidence.ps1`). Not changed here; the workarounds are + in `acceptance-2026-10-23/README.md`. +- The roadmap S09 row, and any Phase B gate exception, change only through a separate SAM PR. +- The construction-performance route needs its own owner start and authorisation for any EnergyPlus run. diff --git a/documentation/S09-OpenStudio-InputReadBack-evidence/acceptance-2026-10-23/README.md b/documentation/S09-OpenStudio-InputReadBack-evidence/acceptance-2026-10-23/README.md new file mode 100644 index 0000000..e8230b9 --- /dev/null +++ b/documentation/S09-OpenStudio-InputReadBack-evidence/acceptance-2026-10-23/README.md @@ -0,0 +1,81 @@ +# S09 acceptance pack, 2026-10-23 (revision 12, S07 §5.2 amendment U1) + +The authorised acceptance run for SAM_OpenStudio#33 at head `d26665bd2e397d011cd1dda382c3e93004e1c231` (tested code +content `8edf793a63b274cafe5e55b9e85fa597d6307a10`), base `7f216657bd03b740644ae12d6ff099396ee997e0`. It replaces +nothing: the earlier pack (`../runs/`, `../negatives/`, `../summary-*.json`, revisions 1-4, `acc3`) is kept as history. +No engine, simulation or sizing was run: the export writes and translates with the OpenStudio SDK only (3.10.0+86d7e215a1). + +## Binaries (Release x64, built from `d26665b`) + +| File | SHA-256 | +|---|---| +| `os-input-readback.dll` (harness) | `8a77b2353fd288f34ce49a52845541c97d94856b96d0ad821980cf1d4046db5c` | +| `SAM.Analytical.OpenStudio.InputReadBack.dll` (reader/comparator) | `d2368ce851b869138b386697e4ef3c9e74b2cb86ef80077133172378517ed4a5` | +| `SAM.Analytical.OpenStudio.dll` (writer) | `67a2ded78a22c9b83f5b536dc7b202314a686fe8c7718119afb676714a84e798` | +| `SAM.Analytical.InputEquivalence.dll` (shared core, SAM_Tas `c50e9169`) | `0c01d8926bb07528eef38c69bf1e54bb9664849a850e8185e56b2e6dac77a7ac` | + +The DLL hashes differ from the revision-12 test session (`revision-12/test-summaries.txt`) because the build stamps the +current commit into each assembly; the source is the same (`d26665b` adds documentation only to `8edf793`). + +Inputs: `s08-fix-box.json` `45524172…acd08`, `s08-fix-two.json` `20da9b58…baa0` (checked by the script against +`Fixtures/SHA256SUMS.txt`); the SAM#212 Budapest EPW `472ffb4e…09c3` (checked by the script). + +## Results (approved rules) + +| Run | Exit | Status | Coverage | Out-of-engine-scope | `report-approved.txt` SHA-256 | +|---|---|---|---|---|---| +| `box` | 0 | PASS | 319/319 | 105 (69 differing, 36 equal) | `868a5808d4cc1a96513e54b8189e647c8f45f4375b058a940ac1dee719b959fe` | +| `two` | 0 | PASS | 592/592 | 216 (138 differing, 78 equal) | `9e3a3f0ed0e2fd6d8703154a0cb71a69ffa10344d1e4e253c29886840a6c466d` | +| `box-repeat` | 0 | PASS | 319/319 | 105 (69, 36) | `868a5808…b959fe` (identical to `box`) | + +- PASS is scoped native-input conformance of the OpenStudio export to S07: not simulation equivalence, not a Phase B + PASS, not an owner acceptance of anything else. Gated non-PASS: 0 on every run. +- Determinism: `box` and `box-repeat` give byte-identical `in.idf` (`46a6ce6f…6baa`) and `report.txt`. The OSM differs + only by OpenStudio's random object handles (`summary-acceptance.json`, as in every pack since revision 2). Both + `report.txt` are byte-identical to the revision-12 test session (`../revision-12/`). +- Provisional rules (baseline, `report-provisional.txt`): box exit 0; two-zone exit 12, because that pre-decision rule set + has no owner-approved T-VENT-INACTIVE, so the two V1 zones' six inactive-ventilation rows stay G1 (UNLISTED-DEFAULT, + proposed). The verdict is the approved rule set. + +## Negatives (approved rules; each a disposable copy of `box` or `two`, read and compared fresh) + +All 21 FAIL (exit 10), each by its intended mechanism, and the originals' IDFs are unchanged +(`summary-acceptance-negative.json`): + +| Case | Mechanism in its report | +|---|---| +| identity-swap-names | identity mismatch: EXPORT-DEFECT 60, OUT-OF-TOLERANCE 24. The two swapped walls lose verified identity, so their 36 unused-face rows are not excluded (out-of-engine-scope 180) | +| schedule-swap | DSOA schedule consistency; 8b / 6 rows | +| v1-unscheduled | 8b EXPORT-DEFECT; inactive transformation not verified (NOT RUN) | +| missing-dsoa-link | OSM/IDF effective DSOA consistency; 8b EXPORT-DEFECT | +| missing-schedule-object | dangling schedule consistency; ventilation rows unreadable | +| people-density | 4a/4b/8a/8b OUT-OF-TOLERANCE | +| layer-conductivity | 3a/3b OUT-OF-TOLERANCE (6) | +| osm-dsoa-schedule | OSM/IDF DSOA schedule consistency | +| zone-multiplier, window-multiplier, north-axis | consistency against SAM intent and OSM/IDF | +| zone-multiplier-both, window-multiplier-both, north-axis-both | consistency against SAM intent only | +| osm-missing-thermal-zone, osm-missing-subsurfaces | missing OSM counterpart | +| lighting-previous-mapping, -visible-zero, -radiant-is-p, -return-air, -swapped | T-LIGHT-SPLIT rows | + +In every negative except identity-swap-names, the out-of-engine-scope count is unchanged (105 / 216) and no +informational row hides the failure. + +## Reproduce + +```text +dotnet build benchmark/SAM.Analytical.OpenStudio.InputReadBack.Cli/SAM.Analytical.OpenStudio.InputReadBack.Cli.csproj -c Release -p:Platform=x64 +powershell -NoProfile -ExecutionPolicy Bypass -File benchmark/SAM.Analytical.OpenStudio.InputReadBack/Run-S09-ReadBack.ps1 -Phase acceptance -Root -WeatherEpw -Exe +powershell -NoProfile -ExecutionPolicy Bypass -File benchmark/SAM.Analytical.OpenStudio.InputReadBack/Run-S09-ReadBack.ps1 -Phase acceptance-negative -Root -WeatherEpw -Exe +powershell -NoProfile -ExecutionPolicy Bypass -Command "$PSDefaultParameterValues['Get-Content:Encoding'] = 'UTF8'; & '' -Root '' -Target ''" +``` + +Under Windows PowerShell 5.1 (no PowerShell 7 here), two script defaults don't work as written; neither script was +changed: +- `$PSScriptRoot` is empty in the parameter defaults, so `-Exe` and `-Target` were passed explicitly. +- `Get-Content` reads the BOM-less UTF-8 reports as ANSI, which turns every "§" into "§". A first pack showed this + in 27 files and was discarded, then repacked with the encoding default above. The packed `report-approved.txt` files + (3 runs, 21 negatives) are byte-identical to the raw run. + +Machine-local (not committed): the raw root `C:\TasOut\s09\acc7-u1` (OSM, IDF, `native.json`, console logs; their +hashes are in each `export.json` and `report-approved.json`). The EPW was the hash-checked copy the S09 tests decompress +from the SAM checkout. diff --git a/documentation/S09-OpenStudio-InputReadBack-evidence/acceptance-2026-10-23/negatives/neg-identity-swap-names/report-approved.txt b/documentation/S09-OpenStudio-InputReadBack-evidence/acceptance-2026-10-23/negatives/neg-identity-swap-names/report-approved.txt new file mode 100644 index 0000000..c48ab18 --- /dev/null +++ b/documentation/S09-OpenStudio-InputReadBack-evidence/acceptance-2026-10-23/negatives/neg-identity-swap-names/report-approved.txt @@ -0,0 +1,46 @@ +S09 OpenStudio read-back: s08-fix-two -> Fail (exit 10); rule set Approved; gate Fail; coverage Complete (592 required, 592 results); gated non-PASS 84; out-of-engine-scope 180 (informational, not gated) +outcomes: AcceptedTransformation 14, ExportDefect 60, Match 277, NotApplicable 1, OutOfEngineScope 180, OutOfTolerance 24, WithinTolerance 36 +D-F2 space:5080c000-0000-0000-0000-00000000c0a1: V1 +D-F2 space:5080c000-0000-0000-0000-00000000c0b1: V1 +NOT PASS ExportDefect / Fail: 60 + 1b panel:4224250c-fb3c-4d91-a9bd-7b0de82b0ab7@space:5080c000-0000-0000-0000-00000000c0a1: Identity mismatch: the native object is unmatched, many to one, or contradicts the SAM object. + 3a panel:4224250c-fb3c-4d91-a9bd-7b0de82b0ab7@space:5080c000-0000-0000-0000-00000000c0a1#layer1.thickness: Identity mismatch: the native object is unmatched, many to one, or contradicts the SAM object. + 3a panel:4224250c-fb3c-4d91-a9bd-7b0de82b0ab7@space:5080c000-0000-0000-0000-00000000c0a1#layer1.conductivity: Identity mismatch: the native object is unmatched, many to one, or contradicts the SAM object. + 3a panel:4224250c-fb3c-4d91-a9bd-7b0de82b0ab7@space:5080c000-0000-0000-0000-00000000c0a1#layer1.density: Identity mismatch: the native object is unmatched, many to one, or contradicts the SAM object. + 3a panel:4224250c-fb3c-4d91-a9bd-7b0de82b0ab7@space:5080c000-0000-0000-0000-00000000c0a1#layer1.specificHeat: Identity mismatch: the native object is unmatched, many to one, or contradicts the SAM object. + 3a panel:4224250c-fb3c-4d91-a9bd-7b0de82b0ab7@space:5080c000-0000-0000-0000-00000000c0a1#layer1.externalSolarReflectance: Identity mismatch: the native object is unmatched, many to one, or contradicts the SAM object. + 3a panel:4224250c-fb3c-4d91-a9bd-7b0de82b0ab7@space:5080c000-0000-0000-0000-00000000c0a1#layer1.externalLightReflectance: Identity mismatch: the native object is unmatched, many to one, or contradicts the SAM object. + 3a panel:4224250c-fb3c-4d91-a9bd-7b0de82b0ab7@space:5080c000-0000-0000-0000-00000000c0a1#layer1.externalEmissivity: Identity mismatch: the native object is unmatched, many to one, or contradicts the SAM object. + 3a panel:4224250c-fb3c-4d91-a9bd-7b0de82b0ab7@space:5080c000-0000-0000-0000-00000000c0a1#layer2.thickness: Identity mismatch: the native object is unmatched, many to one, or contradicts the SAM object. + 3a panel:4224250c-fb3c-4d91-a9bd-7b0de82b0ab7@space:5080c000-0000-0000-0000-00000000c0a1#layer2.conductivity: Identity mismatch: the native object is unmatched, many to one, or contradicts the SAM object. + 3a panel:4224250c-fb3c-4d91-a9bd-7b0de82b0ab7@space:5080c000-0000-0000-0000-00000000c0a1#layer2.density: Identity mismatch: the native object is unmatched, many to one, or contradicts the SAM object. + 3a panel:4224250c-fb3c-4d91-a9bd-7b0de82b0ab7@space:5080c000-0000-0000-0000-00000000c0a1#layer2.specificHeat: Identity mismatch: the native object is unmatched, many to one, or contradicts the SAM object. + ... 48 more in report.json +NOT PASS OutOfTolerance / Fail: 24 + 3a panel:4224250c-fb3c-4d91-a9bd-7b0de82b0ab7@space:5080c000-0000-0000-0000-00000000c0a1#layer1.internalSolarReflectance: The native value is outside the tolerance without a contract explanation. Also: Identity mismatch: the native object is unmatched, many to one, or contradicts the SAM object. Not OUT-OF-ENGINE-SCOPE (S07 §5.2 amendment U1 (SAM#218 b06dbe8c)): the side's face role is not established: the side's identity is not verified (Mismatch). + 3a panel:4224250c-fb3c-4d91-a9bd-7b0de82b0ab7@space:5080c000-0000-0000-0000-00000000c0a1#layer1.internalLightReflectance: The native value is outside the tolerance without a contract explanation. Also: Identity mismatch: the native object is unmatched, many to one, or contradicts the SAM object. Not OUT-OF-ENGINE-SCOPE (S07 §5.2 amendment U1 (SAM#218 b06dbe8c)): the side's face role is not established: the side's identity is not verified (Mismatch). + 3a panel:4224250c-fb3c-4d91-a9bd-7b0de82b0ab7@space:5080c000-0000-0000-0000-00000000c0a1#layer1.internalEmissivity: The native value is outside the tolerance without a contract explanation. Also: Identity mismatch: the native object is unmatched, many to one, or contradicts the SAM object. Not OUT-OF-ENGINE-SCOPE (S07 §5.2 amendment U1 (SAM#218 b06dbe8c)): the side's face role is not established: the side's identity is not verified (Mismatch). + 3a panel:4224250c-fb3c-4d91-a9bd-7b0de82b0ab7@space:5080c000-0000-0000-0000-00000000c0a1#layer2.internalSolarReflectance: The native value is outside the tolerance without a contract explanation. Also: Identity mismatch: the native object is unmatched, many to one, or contradicts the SAM object. Not OUT-OF-ENGINE-SCOPE (S07 §5.2 amendment U1 (SAM#218 b06dbe8c)): the side's face role is not established: the side's identity is not verified (Mismatch). + 3a panel:4224250c-fb3c-4d91-a9bd-7b0de82b0ab7@space:5080c000-0000-0000-0000-00000000c0a1#layer2.internalLightReflectance: The native value is outside the tolerance without a contract explanation. Also: Identity mismatch: the native object is unmatched, many to one, or contradicts the SAM object. Not OUT-OF-ENGINE-SCOPE (S07 §5.2 amendment U1 (SAM#218 b06dbe8c)): the side's face role is not established: the side's identity is not verified (Mismatch). + 3a panel:4224250c-fb3c-4d91-a9bd-7b0de82b0ab7@space:5080c000-0000-0000-0000-00000000c0a1#layer2.internalEmissivity: The native value is outside the tolerance without a contract explanation. Also: Identity mismatch: the native object is unmatched, many to one, or contradicts the SAM object. Not OUT-OF-ENGINE-SCOPE (S07 §5.2 amendment U1 (SAM#218 b06dbe8c)): the side's face role is not established: the side's identity is not verified (Mismatch). + 3a panel:4224250c-fb3c-4d91-a9bd-7b0de82b0ab7@space:5080c000-0000-0000-0000-00000000c0a1#layer3.internalSolarReflectance: The native value is outside the tolerance without a contract explanation. Also: Identity mismatch: the native object is unmatched, many to one, or contradicts the SAM object. Not OUT-OF-ENGINE-SCOPE (S07 §5.2 amendment U1 (SAM#218 b06dbe8c)): the side's face role is not established: the side's identity is not verified (Mismatch). + 3a panel:4224250c-fb3c-4d91-a9bd-7b0de82b0ab7@space:5080c000-0000-0000-0000-00000000c0a1#layer3.internalLightReflectance: The native value is outside the tolerance without a contract explanation. Also: Identity mismatch: the native object is unmatched, many to one, or contradicts the SAM object. Not OUT-OF-ENGINE-SCOPE (S07 §5.2 amendment U1 (SAM#218 b06dbe8c)): the side's face role is not established: the side's identity is not verified (Mismatch). + 3a panel:4224250c-fb3c-4d91-a9bd-7b0de82b0ab7@space:5080c000-0000-0000-0000-00000000c0a1#layer3.internalEmissivity: The native value is outside the tolerance without a contract explanation. Also: Identity mismatch: the native object is unmatched, many to one, or contradicts the SAM object. Not OUT-OF-ENGINE-SCOPE (S07 §5.2 amendment U1 (SAM#218 b06dbe8c)): the side's face role is not established: the side's identity is not verified (Mismatch). + 3a panel:4224250c-fb3c-4d91-a9bd-7b0de82b0ab7@space:5080c000-0000-0000-0000-00000000c0a1#layer4.externalSolarReflectance: The native value is outside the tolerance without a contract explanation. Also: Identity mismatch: the native object is unmatched, many to one, or contradicts the SAM object. Not OUT-OF-ENGINE-SCOPE (S07 §5.2 amendment U1 (SAM#218 b06dbe8c)): the side's face role is not established: the side's identity is not verified (Mismatch). + 3a panel:4224250c-fb3c-4d91-a9bd-7b0de82b0ab7@space:5080c000-0000-0000-0000-00000000c0a1#layer4.externalLightReflectance: The native value is outside the tolerance without a contract explanation. Also: Identity mismatch: the native object is unmatched, many to one, or contradicts the SAM object. Not OUT-OF-ENGINE-SCOPE (S07 §5.2 amendment U1 (SAM#218 b06dbe8c)): the side's face role is not established: the side's identity is not verified (Mismatch). + 3a panel:4224250c-fb3c-4d91-a9bd-7b0de82b0ab7@space:5080c000-0000-0000-0000-00000000c0a1#layer4.externalEmissivity: The native value is outside the tolerance without a contract explanation. Also: Identity mismatch: the native object is unmatched, many to one, or contradicts the SAM object. Not OUT-OF-ENGINE-SCOPE (S07 §5.2 amendment U1 (SAM#218 b06dbe8c)): the side's face role is not established: the side's identity is not verified (Mismatch). + ... 12 more in report.json +OUT-OF-ENGINE-SCOPE (informational, not gated; S07 §5.2 amendment U1 (SAM#218 b06dbe8c)): 180 row(s), 114 differing, 66 equal; by scope: buried layer face 168, ground surface outer face 6, interzone surface outer face 6; by property: externalEmissivity 31, externalLightReflectance 31, externalSolarReflectance 31, internalEmissivity 29, internalLightReflectance 29, internalSolarReflectance 29 + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer1.externalSolarReflectance: SAM 0.31, native 0.31000000000000005, |d| 5.551115123125783E-17 (WithinTolerance); ground surface outer face; SAM 'FIX_Concrete', native 'SAM_OpaqueMaterial_FIX_Concrete_150mm_b313ccd6' + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer1.internalSolarReflectance: SAM 0.29, native 0.31000000000000005, |d| 0.020000000000000073 (OutsideTolerance); buried layer face (layer 1 of 3, SAM internal face); SAM 'FIX_Concrete', native 'SAM_OpaqueMaterial_FIX_Concrete_150mm_b313ccd6' + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer1.externalLightReflectance: SAM 0.32, native 0.31999999999999995, |d| 5.551115123125783E-17 (WithinTolerance); ground surface outer face; SAM 'FIX_Concrete', native 'SAM_OpaqueMaterial_FIX_Concrete_150mm_b313ccd6' + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer1.internalLightReflectance: SAM 0.3, native 0.31999999999999995, |d| 0.019999999999999962 (OutsideTolerance); buried layer face (layer 1 of 3, SAM internal face); SAM 'FIX_Concrete', native 'SAM_OpaqueMaterial_FIX_Concrete_150mm_b313ccd6' + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer1.externalEmissivity: SAM 0.95, native 0.95, |d| 0 (Identical); ground surface outer face; SAM 'FIX_Concrete', native 'SAM_OpaqueMaterial_FIX_Concrete_150mm_b313ccd6' + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer1.internalEmissivity: SAM 0.87, native 0.95, |d| 0.07999999999999996 (OutsideTolerance); buried layer face (layer 1 of 3, SAM internal face); SAM 'FIX_Concrete', native 'SAM_OpaqueMaterial_FIX_Concrete_150mm_b313ccd6' + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer2.externalSolarReflectance: SAM 0.58, native 0.5800000000000001, |d| 1.1102230246251565E-16 (WithinTolerance); buried layer face (layer 2 of 3, SAM external face); SAM 'FIX_EPS', native 'SAM_OpaqueMaterial_FIX_EPS_120mm_c3cb21c2' + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer2.internalSolarReflectance: SAM 0.61, native 0.5800000000000001, |d| 0.029999999999999916 (OutsideTolerance); buried layer face (layer 2 of 3, SAM internal face); SAM 'FIX_EPS', native 'SAM_OpaqueMaterial_FIX_EPS_120mm_c3cb21c2' + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer2.externalLightReflectance: SAM 0.59, native 0.5900000000000001, |d| 1.1102230246251565E-16 (WithinTolerance); buried layer face (layer 2 of 3, SAM external face); SAM 'FIX_EPS', native 'SAM_OpaqueMaterial_FIX_EPS_120mm_c3cb21c2' + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer2.internalLightReflectance: SAM 0.63, native 0.5900000000000001, |d| 0.039999999999999925 (OutsideTolerance); buried layer face (layer 2 of 3, SAM internal face); SAM 'FIX_EPS', native 'SAM_OpaqueMaterial_FIX_EPS_120mm_c3cb21c2' + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer2.externalEmissivity: SAM 0.85, native 0.85, |d| 0 (Identical); buried layer face (layer 2 of 3, SAM external face); SAM 'FIX_EPS', native 'SAM_OpaqueMaterial_FIX_EPS_120mm_c3cb21c2' + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer2.internalEmissivity: SAM 0.96, native 0.85, |d| 0.10999999999999999 (OutsideTolerance); buried layer face (layer 2 of 3, SAM internal face); SAM 'FIX_EPS', native 'SAM_OpaqueMaterial_FIX_EPS_120mm_c3cb21c2' + ... 168 more in report.json diff --git a/documentation/S09-OpenStudio-InputReadBack-evidence/acceptance-2026-10-23/negatives/neg-layer-conductivity/report-approved.txt b/documentation/S09-OpenStudio-InputReadBack-evidence/acceptance-2026-10-23/negatives/neg-layer-conductivity/report-approved.txt new file mode 100644 index 0000000..39c653b --- /dev/null +++ b/documentation/S09-OpenStudio-InputReadBack-evidence/acceptance-2026-10-23/negatives/neg-layer-conductivity/report-approved.txt @@ -0,0 +1,25 @@ +S09 OpenStudio read-back: s08-fix-two -> Fail (exit 10); rule set Approved; gate Fail; coverage Complete (592 required, 592 results); gated non-PASS 6; out-of-engine-scope 216 (informational, not gated) +outcomes: AcceptedTransformation 14, Match 307, NotApplicable 1, OutOfEngineScope 216, OutOfTolerance 6, WithinTolerance 48 +D-F2 space:5080c000-0000-0000-0000-00000000c0a1: V1 +D-F2 space:5080c000-0000-0000-0000-00000000c0b1: V1 +NOT PASS OutOfTolerance / Fail: 6 + 3a panel:1c080d98-e160-4254-8bac-f3902936a621@space:5080c000-0000-0000-0000-00000000c0a1#layer2.conductivity: The native value is outside the tolerance without a contract explanation. + 3a panel:4224250c-fb3c-4d91-a9bd-7b0de82b0ab7@space:5080c000-0000-0000-0000-00000000c0a1#layer2.conductivity: The native value is outside the tolerance without a contract explanation. + 3a panel:2b2d8a7f-fbc6-4663-9608-3f054b4a10d8@space:5080c000-0000-0000-0000-00000000c0a1#layer2.conductivity: The native value is outside the tolerance without a contract explanation. + 3a panel:d1aaf21e-5613-42e2-ba3c-a6632d2237fd@space:5080c000-0000-0000-0000-00000000c0b1#layer2.conductivity: The native value is outside the tolerance without a contract explanation. + 3a panel:965af5b3-f250-4492-9467-f988d7831eae@space:5080c000-0000-0000-0000-00000000c0b1#layer2.conductivity: The native value is outside the tolerance without a contract explanation. + 3a panel:d3ef56c6-b1bb-4509-9d4c-ce6aa738f318@space:5080c000-0000-0000-0000-00000000c0b1#layer2.conductivity: The native value is outside the tolerance without a contract explanation. +OUT-OF-ENGINE-SCOPE (informational, not gated; S07 §5.2 amendment U1 (SAM#218 b06dbe8c)): 216 row(s), 138 differing, 78 equal; by scope: buried layer face 204, ground surface outer face 6, interzone surface outer face 6; by property: externalEmissivity 37, externalLightReflectance 37, externalSolarReflectance 37, internalEmissivity 35, internalLightReflectance 35, internalSolarReflectance 35 + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer1.externalSolarReflectance: SAM 0.31, native 0.31000000000000005, |d| 5.551115123125783E-17 (WithinTolerance); ground surface outer face; SAM 'FIX_Concrete', native 'SAM_OpaqueMaterial_FIX_Concrete_150mm_b313ccd6' + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer1.internalSolarReflectance: SAM 0.29, native 0.31000000000000005, |d| 0.020000000000000073 (OutsideTolerance); buried layer face (layer 1 of 3, SAM internal face); SAM 'FIX_Concrete', native 'SAM_OpaqueMaterial_FIX_Concrete_150mm_b313ccd6' + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer1.externalLightReflectance: SAM 0.32, native 0.31999999999999995, |d| 5.551115123125783E-17 (WithinTolerance); ground surface outer face; SAM 'FIX_Concrete', native 'SAM_OpaqueMaterial_FIX_Concrete_150mm_b313ccd6' + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer1.internalLightReflectance: SAM 0.3, native 0.31999999999999995, |d| 0.019999999999999962 (OutsideTolerance); buried layer face (layer 1 of 3, SAM internal face); SAM 'FIX_Concrete', native 'SAM_OpaqueMaterial_FIX_Concrete_150mm_b313ccd6' + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer1.externalEmissivity: SAM 0.95, native 0.95, |d| 0 (Identical); ground surface outer face; SAM 'FIX_Concrete', native 'SAM_OpaqueMaterial_FIX_Concrete_150mm_b313ccd6' + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer1.internalEmissivity: SAM 0.87, native 0.95, |d| 0.07999999999999996 (OutsideTolerance); buried layer face (layer 1 of 3, SAM internal face); SAM 'FIX_Concrete', native 'SAM_OpaqueMaterial_FIX_Concrete_150mm_b313ccd6' + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer2.externalSolarReflectance: SAM 0.58, native 0.5800000000000001, |d| 1.1102230246251565E-16 (WithinTolerance); buried layer face (layer 2 of 3, SAM external face); SAM 'FIX_EPS', native 'SAM_OpaqueMaterial_FIX_EPS_120mm_c3cb21c2' + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer2.internalSolarReflectance: SAM 0.61, native 0.5800000000000001, |d| 0.029999999999999916 (OutsideTolerance); buried layer face (layer 2 of 3, SAM internal face); SAM 'FIX_EPS', native 'SAM_OpaqueMaterial_FIX_EPS_120mm_c3cb21c2' + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer2.externalLightReflectance: SAM 0.59, native 0.5900000000000001, |d| 1.1102230246251565E-16 (WithinTolerance); buried layer face (layer 2 of 3, SAM external face); SAM 'FIX_EPS', native 'SAM_OpaqueMaterial_FIX_EPS_120mm_c3cb21c2' + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer2.internalLightReflectance: SAM 0.63, native 0.5900000000000001, |d| 0.039999999999999925 (OutsideTolerance); buried layer face (layer 2 of 3, SAM internal face); SAM 'FIX_EPS', native 'SAM_OpaqueMaterial_FIX_EPS_120mm_c3cb21c2' + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer2.externalEmissivity: SAM 0.85, native 0.85, |d| 0 (Identical); buried layer face (layer 2 of 3, SAM external face); SAM 'FIX_EPS', native 'SAM_OpaqueMaterial_FIX_EPS_120mm_c3cb21c2' + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer2.internalEmissivity: SAM 0.96, native 0.85, |d| 0.10999999999999999 (OutsideTolerance); buried layer face (layer 2 of 3, SAM internal face); SAM 'FIX_EPS', native 'SAM_OpaqueMaterial_FIX_EPS_120mm_c3cb21c2' + ... 204 more in report.json diff --git a/documentation/S09-OpenStudio-InputReadBack-evidence/acceptance-2026-10-23/negatives/neg-lighting-previous-mapping/report-approved.txt b/documentation/S09-OpenStudio-InputReadBack-evidence/acceptance-2026-10-23/negatives/neg-lighting-previous-mapping/report-approved.txt new file mode 100644 index 0000000..72739b6 --- /dev/null +++ b/documentation/S09-OpenStudio-InputReadBack-evidence/acceptance-2026-10-23/negatives/neg-lighting-previous-mapping/report-approved.txt @@ -0,0 +1,22 @@ +S09 OpenStudio read-back: s08-fix-box -> Fail (exit 10); rule set Approved; gate Fail; coverage Complete (319 required, 319 results); gated non-PASS 4; out-of-engine-scope 105 (informational, not gated) +outcomes: Match 183, NotApplicable 1, OutOfEngineScope 105, OutOfTolerance 4, WithinTolerance 26 +D-F2 space:5080c000-0000-0000-0000-00000000c001: V2 +NOT PASS OutOfTolerance / Fail: 4 + 4c space:5080c000-0000-0000-0000-00000000c001.ic.lighting.radiantTotal: The native value is outside the tolerance without a contract explanation. + 4c space:5080c000-0000-0000-0000-00000000c001.ic.lighting.visible: The native value is outside the tolerance without a contract explanation. + 4c space:5080c000-0000-0000-0000-00000000c001.ic.lighting.radiant: The native value is outside the tolerance without a contract explanation. + 4c space:5080c000-0000-0000-0000-00000000c001.ic.lighting.convective: The native value is outside the tolerance without a contract explanation. +OUT-OF-ENGINE-SCOPE (informational, not gated; S07 §5.2 amendment U1 (SAM#218 b06dbe8c)): 105 row(s), 69 differing, 36 equal; by scope: buried layer face 102, ground surface outer face 3; by property: externalEmissivity 18, externalLightReflectance 18, externalSolarReflectance 18, internalEmissivity 17, internalLightReflectance 17, internalSolarReflectance 17 + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.externalSolarReflectance: SAM 0.31, native 0.31000000000000005, |d| 5.551115123125783E-17 (WithinTolerance); ground surface outer face; SAM 'FIX_Concrete', native 'SAM_OpaqueMaterial_FIX_Concrete_150mm_9d3a3ab2' + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.internalSolarReflectance: SAM 0.29, native 0.31000000000000005, |d| 0.020000000000000073 (OutsideTolerance); buried layer face (layer 1 of 3, SAM internal face); SAM 'FIX_Concrete', native 'SAM_OpaqueMaterial_FIX_Concrete_150mm_9d3a3ab2' + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.externalLightReflectance: SAM 0.32, native 0.31999999999999995, |d| 5.551115123125783E-17 (WithinTolerance); ground surface outer face; SAM 'FIX_Concrete', native 'SAM_OpaqueMaterial_FIX_Concrete_150mm_9d3a3ab2' + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.internalLightReflectance: SAM 0.3, native 0.31999999999999995, |d| 0.019999999999999962 (OutsideTolerance); buried layer face (layer 1 of 3, SAM internal face); SAM 'FIX_Concrete', native 'SAM_OpaqueMaterial_FIX_Concrete_150mm_9d3a3ab2' + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.externalEmissivity: SAM 0.95, native 0.95, |d| 0 (Identical); ground surface outer face; SAM 'FIX_Concrete', native 'SAM_OpaqueMaterial_FIX_Concrete_150mm_9d3a3ab2' + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.internalEmissivity: SAM 0.87, native 0.95, |d| 0.07999999999999996 (OutsideTolerance); buried layer face (layer 1 of 3, SAM internal face); SAM 'FIX_Concrete', native 'SAM_OpaqueMaterial_FIX_Concrete_150mm_9d3a3ab2' + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.externalSolarReflectance: SAM 0.58, native 0.5800000000000001, |d| 1.1102230246251565E-16 (WithinTolerance); buried layer face (layer 2 of 3, SAM external face); SAM 'FIX_EPS', native 'SAM_OpaqueMaterial_FIX_EPS_120mm_23500162' + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.internalSolarReflectance: SAM 0.61, native 0.5800000000000001, |d| 0.029999999999999916 (OutsideTolerance); buried layer face (layer 2 of 3, SAM internal face); SAM 'FIX_EPS', native 'SAM_OpaqueMaterial_FIX_EPS_120mm_23500162' + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.externalLightReflectance: SAM 0.59, native 0.5900000000000001, |d| 1.1102230246251565E-16 (WithinTolerance); buried layer face (layer 2 of 3, SAM external face); SAM 'FIX_EPS', native 'SAM_OpaqueMaterial_FIX_EPS_120mm_23500162' + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.internalLightReflectance: SAM 0.63, native 0.5900000000000001, |d| 0.039999999999999925 (OutsideTolerance); buried layer face (layer 2 of 3, SAM internal face); SAM 'FIX_EPS', native 'SAM_OpaqueMaterial_FIX_EPS_120mm_23500162' + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.externalEmissivity: SAM 0.85, native 0.85, |d| 0 (Identical); buried layer face (layer 2 of 3, SAM external face); SAM 'FIX_EPS', native 'SAM_OpaqueMaterial_FIX_EPS_120mm_23500162' + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.internalEmissivity: SAM 0.96, native 0.85, |d| 0.10999999999999999 (OutsideTolerance); buried layer face (layer 2 of 3, SAM internal face); SAM 'FIX_EPS', native 'SAM_OpaqueMaterial_FIX_EPS_120mm_23500162' + ... 93 more in report.json diff --git a/documentation/S09-OpenStudio-InputReadBack-evidence/acceptance-2026-10-23/negatives/neg-lighting-radiant-is-p/report-approved.txt b/documentation/S09-OpenStudio-InputReadBack-evidence/acceptance-2026-10-23/negatives/neg-lighting-radiant-is-p/report-approved.txt new file mode 100644 index 0000000..58592bc --- /dev/null +++ b/documentation/S09-OpenStudio-InputReadBack-evidence/acceptance-2026-10-23/negatives/neg-lighting-radiant-is-p/report-approved.txt @@ -0,0 +1,22 @@ +S09 OpenStudio read-back: s08-fix-two -> Fail (exit 10); rule set Approved; gate Fail; coverage Complete (592 required, 592 results); gated non-PASS 3; out-of-engine-scope 216 (informational, not gated) +outcomes: AcceptedTransformation 11, Match 319, NotApplicable 1, OutOfEngineScope 216, OutOfTolerance 3, WithinTolerance 42 +D-F2 space:5080c000-0000-0000-0000-00000000c0a1: V1 +D-F2 space:5080c000-0000-0000-0000-00000000c0b1: V1 +NOT PASS OutOfTolerance / Fail: 3 + 4c space:5080c000-0000-0000-0000-00000000c0a1.ic.lighting.radiantTotal: The native value is outside the tolerance without a contract explanation. + 4c space:5080c000-0000-0000-0000-00000000c0a1.ic.lighting.radiant: The native value is outside the tolerance without a contract explanation. + 4c space:5080c000-0000-0000-0000-00000000c0a1.ic.lighting.convective: The native value is outside the tolerance without a contract explanation. +OUT-OF-ENGINE-SCOPE (informational, not gated; S07 §5.2 amendment U1 (SAM#218 b06dbe8c)): 216 row(s), 138 differing, 78 equal; by scope: buried layer face 204, ground surface outer face 6, interzone surface outer face 6; by property: externalEmissivity 37, externalLightReflectance 37, externalSolarReflectance 37, internalEmissivity 35, internalLightReflectance 35, internalSolarReflectance 35 + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer1.externalSolarReflectance: SAM 0.31, native 0.31000000000000005, |d| 5.551115123125783E-17 (WithinTolerance); ground surface outer face; SAM 'FIX_Concrete', native 'SAM_OpaqueMaterial_FIX_Concrete_150mm_b313ccd6' + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer1.internalSolarReflectance: SAM 0.29, native 0.31000000000000005, |d| 0.020000000000000073 (OutsideTolerance); buried layer face (layer 1 of 3, SAM internal face); SAM 'FIX_Concrete', native 'SAM_OpaqueMaterial_FIX_Concrete_150mm_b313ccd6' + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer1.externalLightReflectance: SAM 0.32, native 0.31999999999999995, |d| 5.551115123125783E-17 (WithinTolerance); ground surface outer face; SAM 'FIX_Concrete', native 'SAM_OpaqueMaterial_FIX_Concrete_150mm_b313ccd6' + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer1.internalLightReflectance: SAM 0.3, native 0.31999999999999995, |d| 0.019999999999999962 (OutsideTolerance); buried layer face (layer 1 of 3, SAM internal face); SAM 'FIX_Concrete', native 'SAM_OpaqueMaterial_FIX_Concrete_150mm_b313ccd6' + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer1.externalEmissivity: SAM 0.95, native 0.95, |d| 0 (Identical); ground surface outer face; SAM 'FIX_Concrete', native 'SAM_OpaqueMaterial_FIX_Concrete_150mm_b313ccd6' + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer1.internalEmissivity: SAM 0.87, native 0.95, |d| 0.07999999999999996 (OutsideTolerance); buried layer face (layer 1 of 3, SAM internal face); SAM 'FIX_Concrete', native 'SAM_OpaqueMaterial_FIX_Concrete_150mm_b313ccd6' + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer2.externalSolarReflectance: SAM 0.58, native 0.5800000000000001, |d| 1.1102230246251565E-16 (WithinTolerance); buried layer face (layer 2 of 3, SAM external face); SAM 'FIX_EPS', native 'SAM_OpaqueMaterial_FIX_EPS_120mm_c3cb21c2' + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer2.internalSolarReflectance: SAM 0.61, native 0.5800000000000001, |d| 0.029999999999999916 (OutsideTolerance); buried layer face (layer 2 of 3, SAM internal face); SAM 'FIX_EPS', native 'SAM_OpaqueMaterial_FIX_EPS_120mm_c3cb21c2' + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer2.externalLightReflectance: SAM 0.59, native 0.5900000000000001, |d| 1.1102230246251565E-16 (WithinTolerance); buried layer face (layer 2 of 3, SAM external face); SAM 'FIX_EPS', native 'SAM_OpaqueMaterial_FIX_EPS_120mm_c3cb21c2' + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer2.internalLightReflectance: SAM 0.63, native 0.5900000000000001, |d| 0.039999999999999925 (OutsideTolerance); buried layer face (layer 2 of 3, SAM internal face); SAM 'FIX_EPS', native 'SAM_OpaqueMaterial_FIX_EPS_120mm_c3cb21c2' + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer2.externalEmissivity: SAM 0.85, native 0.85, |d| 0 (Identical); buried layer face (layer 2 of 3, SAM external face); SAM 'FIX_EPS', native 'SAM_OpaqueMaterial_FIX_EPS_120mm_c3cb21c2' + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer2.internalEmissivity: SAM 0.96, native 0.85, |d| 0.10999999999999999 (OutsideTolerance); buried layer face (layer 2 of 3, SAM internal face); SAM 'FIX_EPS', native 'SAM_OpaqueMaterial_FIX_EPS_120mm_c3cb21c2' + ... 204 more in report.json diff --git a/documentation/S09-OpenStudio-InputReadBack-evidence/acceptance-2026-10-23/negatives/neg-lighting-return-air/report-approved.txt b/documentation/S09-OpenStudio-InputReadBack-evidence/acceptance-2026-10-23/negatives/neg-lighting-return-air/report-approved.txt new file mode 100644 index 0000000..40d69ac --- /dev/null +++ b/documentation/S09-OpenStudio-InputReadBack-evidence/acceptance-2026-10-23/negatives/neg-lighting-return-air/report-approved.txt @@ -0,0 +1,20 @@ +S09 OpenStudio read-back: s08-fix-box -> Fail (exit 10); rule set Approved; gate Fail; coverage Complete (319 required, 319 results); gated non-PASS 2; out-of-engine-scope 105 (informational, not gated) +outcomes: AcceptedTransformation 3, Match 182, NotApplicable 1, OutOfEngineScope 105, OutOfTolerance 2, WithinTolerance 26 +D-F2 space:5080c000-0000-0000-0000-00000000c001: V2 +NOT PASS OutOfTolerance / Fail: 2 + 4c.os.returnAir space:5080c000-0000-0000-0000-00000000c001.ic.lighting.returnAir: SAM is zero and the native holds a non-zero value outside the tolerance. + 4c space:5080c000-0000-0000-0000-00000000c001.ic.lighting.convective: The native value is outside the tolerance without a contract explanation. +OUT-OF-ENGINE-SCOPE (informational, not gated; S07 §5.2 amendment U1 (SAM#218 b06dbe8c)): 105 row(s), 69 differing, 36 equal; by scope: buried layer face 102, ground surface outer face 3; by property: externalEmissivity 18, externalLightReflectance 18, externalSolarReflectance 18, internalEmissivity 17, internalLightReflectance 17, internalSolarReflectance 17 + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.externalSolarReflectance: SAM 0.31, native 0.31000000000000005, |d| 5.551115123125783E-17 (WithinTolerance); ground surface outer face; SAM 'FIX_Concrete', native 'SAM_OpaqueMaterial_FIX_Concrete_150mm_9d3a3ab2' + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.internalSolarReflectance: SAM 0.29, native 0.31000000000000005, |d| 0.020000000000000073 (OutsideTolerance); buried layer face (layer 1 of 3, SAM internal face); SAM 'FIX_Concrete', native 'SAM_OpaqueMaterial_FIX_Concrete_150mm_9d3a3ab2' + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.externalLightReflectance: SAM 0.32, native 0.31999999999999995, |d| 5.551115123125783E-17 (WithinTolerance); ground surface outer face; SAM 'FIX_Concrete', native 'SAM_OpaqueMaterial_FIX_Concrete_150mm_9d3a3ab2' + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.internalLightReflectance: SAM 0.3, native 0.31999999999999995, |d| 0.019999999999999962 (OutsideTolerance); buried layer face (layer 1 of 3, SAM internal face); SAM 'FIX_Concrete', native 'SAM_OpaqueMaterial_FIX_Concrete_150mm_9d3a3ab2' + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.externalEmissivity: SAM 0.95, native 0.95, |d| 0 (Identical); ground surface outer face; SAM 'FIX_Concrete', native 'SAM_OpaqueMaterial_FIX_Concrete_150mm_9d3a3ab2' + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.internalEmissivity: SAM 0.87, native 0.95, |d| 0.07999999999999996 (OutsideTolerance); buried layer face (layer 1 of 3, SAM internal face); SAM 'FIX_Concrete', native 'SAM_OpaqueMaterial_FIX_Concrete_150mm_9d3a3ab2' + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.externalSolarReflectance: SAM 0.58, native 0.5800000000000001, |d| 1.1102230246251565E-16 (WithinTolerance); buried layer face (layer 2 of 3, SAM external face); SAM 'FIX_EPS', native 'SAM_OpaqueMaterial_FIX_EPS_120mm_23500162' + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.internalSolarReflectance: SAM 0.61, native 0.5800000000000001, |d| 0.029999999999999916 (OutsideTolerance); buried layer face (layer 2 of 3, SAM internal face); SAM 'FIX_EPS', native 'SAM_OpaqueMaterial_FIX_EPS_120mm_23500162' + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.externalLightReflectance: SAM 0.59, native 0.5900000000000001, |d| 1.1102230246251565E-16 (WithinTolerance); buried layer face (layer 2 of 3, SAM external face); SAM 'FIX_EPS', native 'SAM_OpaqueMaterial_FIX_EPS_120mm_23500162' + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.internalLightReflectance: SAM 0.63, native 0.5900000000000001, |d| 0.039999999999999925 (OutsideTolerance); buried layer face (layer 2 of 3, SAM internal face); SAM 'FIX_EPS', native 'SAM_OpaqueMaterial_FIX_EPS_120mm_23500162' + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.externalEmissivity: SAM 0.85, native 0.85, |d| 0 (Identical); buried layer face (layer 2 of 3, SAM external face); SAM 'FIX_EPS', native 'SAM_OpaqueMaterial_FIX_EPS_120mm_23500162' + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.internalEmissivity: SAM 0.96, native 0.85, |d| 0.10999999999999999 (OutsideTolerance); buried layer face (layer 2 of 3, SAM internal face); SAM 'FIX_EPS', native 'SAM_OpaqueMaterial_FIX_EPS_120mm_23500162' + ... 93 more in report.json diff --git a/documentation/S09-OpenStudio-InputReadBack-evidence/acceptance-2026-10-23/negatives/neg-lighting-swapped/report-approved.txt b/documentation/S09-OpenStudio-InputReadBack-evidence/acceptance-2026-10-23/negatives/neg-lighting-swapped/report-approved.txt new file mode 100644 index 0000000..c6d9b94 --- /dev/null +++ b/documentation/S09-OpenStudio-InputReadBack-evidence/acceptance-2026-10-23/negatives/neg-lighting-swapped/report-approved.txt @@ -0,0 +1,21 @@ +S09 OpenStudio read-back: s08-fix-two -> Fail (exit 10); rule set Approved; gate Fail; coverage Complete (592 required, 592 results); gated non-PASS 2; out-of-engine-scope 216 (informational, not gated) +outcomes: AcceptedTransformation 12, Match 319, NotApplicable 1, OutOfEngineScope 216, OutOfTolerance 2, WithinTolerance 42 +D-F2 space:5080c000-0000-0000-0000-00000000c0a1: V1 +D-F2 space:5080c000-0000-0000-0000-00000000c0b1: V1 +NOT PASS OutOfTolerance / Fail: 2 + 4c space:5080c000-0000-0000-0000-00000000c0a1.ic.lighting.visible: The native value is outside the tolerance without a contract explanation. + 4c space:5080c000-0000-0000-0000-00000000c0a1.ic.lighting.radiant: The native value is outside the tolerance without a contract explanation. +OUT-OF-ENGINE-SCOPE (informational, not gated; S07 §5.2 amendment U1 (SAM#218 b06dbe8c)): 216 row(s), 138 differing, 78 equal; by scope: buried layer face 204, ground surface outer face 6, interzone surface outer face 6; by property: externalEmissivity 37, externalLightReflectance 37, externalSolarReflectance 37, internalEmissivity 35, internalLightReflectance 35, internalSolarReflectance 35 + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer1.externalSolarReflectance: SAM 0.31, native 0.31000000000000005, |d| 5.551115123125783E-17 (WithinTolerance); ground surface outer face; SAM 'FIX_Concrete', native 'SAM_OpaqueMaterial_FIX_Concrete_150mm_b313ccd6' + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer1.internalSolarReflectance: SAM 0.29, native 0.31000000000000005, |d| 0.020000000000000073 (OutsideTolerance); buried layer face (layer 1 of 3, SAM internal face); SAM 'FIX_Concrete', native 'SAM_OpaqueMaterial_FIX_Concrete_150mm_b313ccd6' + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer1.externalLightReflectance: SAM 0.32, native 0.31999999999999995, |d| 5.551115123125783E-17 (WithinTolerance); ground surface outer face; SAM 'FIX_Concrete', native 'SAM_OpaqueMaterial_FIX_Concrete_150mm_b313ccd6' + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer1.internalLightReflectance: SAM 0.3, native 0.31999999999999995, |d| 0.019999999999999962 (OutsideTolerance); buried layer face (layer 1 of 3, SAM internal face); SAM 'FIX_Concrete', native 'SAM_OpaqueMaterial_FIX_Concrete_150mm_b313ccd6' + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer1.externalEmissivity: SAM 0.95, native 0.95, |d| 0 (Identical); ground surface outer face; SAM 'FIX_Concrete', native 'SAM_OpaqueMaterial_FIX_Concrete_150mm_b313ccd6' + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer1.internalEmissivity: SAM 0.87, native 0.95, |d| 0.07999999999999996 (OutsideTolerance); buried layer face (layer 1 of 3, SAM internal face); SAM 'FIX_Concrete', native 'SAM_OpaqueMaterial_FIX_Concrete_150mm_b313ccd6' + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer2.externalSolarReflectance: SAM 0.58, native 0.5800000000000001, |d| 1.1102230246251565E-16 (WithinTolerance); buried layer face (layer 2 of 3, SAM external face); SAM 'FIX_EPS', native 'SAM_OpaqueMaterial_FIX_EPS_120mm_c3cb21c2' + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer2.internalSolarReflectance: SAM 0.61, native 0.5800000000000001, |d| 0.029999999999999916 (OutsideTolerance); buried layer face (layer 2 of 3, SAM internal face); SAM 'FIX_EPS', native 'SAM_OpaqueMaterial_FIX_EPS_120mm_c3cb21c2' + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer2.externalLightReflectance: SAM 0.59, native 0.5900000000000001, |d| 1.1102230246251565E-16 (WithinTolerance); buried layer face (layer 2 of 3, SAM external face); SAM 'FIX_EPS', native 'SAM_OpaqueMaterial_FIX_EPS_120mm_c3cb21c2' + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer2.internalLightReflectance: SAM 0.63, native 0.5900000000000001, |d| 0.039999999999999925 (OutsideTolerance); buried layer face (layer 2 of 3, SAM internal face); SAM 'FIX_EPS', native 'SAM_OpaqueMaterial_FIX_EPS_120mm_c3cb21c2' + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer2.externalEmissivity: SAM 0.85, native 0.85, |d| 0 (Identical); buried layer face (layer 2 of 3, SAM external face); SAM 'FIX_EPS', native 'SAM_OpaqueMaterial_FIX_EPS_120mm_c3cb21c2' + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer2.internalEmissivity: SAM 0.96, native 0.85, |d| 0.10999999999999999 (OutsideTolerance); buried layer face (layer 2 of 3, SAM internal face); SAM 'FIX_EPS', native 'SAM_OpaqueMaterial_FIX_EPS_120mm_c3cb21c2' + ... 204 more in report.json diff --git a/documentation/S09-OpenStudio-InputReadBack-evidence/acceptance-2026-10-23/negatives/neg-lighting-visible-zero/report-approved.txt b/documentation/S09-OpenStudio-InputReadBack-evidence/acceptance-2026-10-23/negatives/neg-lighting-visible-zero/report-approved.txt new file mode 100644 index 0000000..5d05322 --- /dev/null +++ b/documentation/S09-OpenStudio-InputReadBack-evidence/acceptance-2026-10-23/negatives/neg-lighting-visible-zero/report-approved.txt @@ -0,0 +1,22 @@ +S09 OpenStudio read-back: s08-fix-box -> Fail (exit 10); rule set Approved; gate Fail; coverage Complete (319 required, 319 results); gated non-PASS 3; out-of-engine-scope 105 (informational, not gated) +outcomes: AcceptedTransformation 1, ExportDefect 1, Match 183, NotApplicable 1, OutOfEngineScope 105, OutOfTolerance 2, WithinTolerance 26 +D-F2 space:5080c000-0000-0000-0000-00000000c001: V2 +NOT PASS ExportDefect / Fail: 1 + 4c space:5080c000-0000-0000-0000-00000000c001.ic.lighting.visible: SAM states a non-zero value (S-VALUE) but the native object holds exactly 0; abs never turns a zeroed native object into a pass. No limitation is listed. +NOT PASS OutOfTolerance / Fail: 2 + 4c space:5080c000-0000-0000-0000-00000000c001.ic.lighting.radiantTotal: The native value is outside the tolerance without a contract explanation. + 4c space:5080c000-0000-0000-0000-00000000c001.ic.lighting.convective: The native value is outside the tolerance without a contract explanation. +OUT-OF-ENGINE-SCOPE (informational, not gated; S07 §5.2 amendment U1 (SAM#218 b06dbe8c)): 105 row(s), 69 differing, 36 equal; by scope: buried layer face 102, ground surface outer face 3; by property: externalEmissivity 18, externalLightReflectance 18, externalSolarReflectance 18, internalEmissivity 17, internalLightReflectance 17, internalSolarReflectance 17 + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.externalSolarReflectance: SAM 0.31, native 0.31000000000000005, |d| 5.551115123125783E-17 (WithinTolerance); ground surface outer face; SAM 'FIX_Concrete', native 'SAM_OpaqueMaterial_FIX_Concrete_150mm_9d3a3ab2' + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.internalSolarReflectance: SAM 0.29, native 0.31000000000000005, |d| 0.020000000000000073 (OutsideTolerance); buried layer face (layer 1 of 3, SAM internal face); SAM 'FIX_Concrete', native 'SAM_OpaqueMaterial_FIX_Concrete_150mm_9d3a3ab2' + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.externalLightReflectance: SAM 0.32, native 0.31999999999999995, |d| 5.551115123125783E-17 (WithinTolerance); ground surface outer face; SAM 'FIX_Concrete', native 'SAM_OpaqueMaterial_FIX_Concrete_150mm_9d3a3ab2' + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.internalLightReflectance: SAM 0.3, native 0.31999999999999995, |d| 0.019999999999999962 (OutsideTolerance); buried layer face (layer 1 of 3, SAM internal face); SAM 'FIX_Concrete', native 'SAM_OpaqueMaterial_FIX_Concrete_150mm_9d3a3ab2' + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.externalEmissivity: SAM 0.95, native 0.95, |d| 0 (Identical); ground surface outer face; SAM 'FIX_Concrete', native 'SAM_OpaqueMaterial_FIX_Concrete_150mm_9d3a3ab2' + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.internalEmissivity: SAM 0.87, native 0.95, |d| 0.07999999999999996 (OutsideTolerance); buried layer face (layer 1 of 3, SAM internal face); SAM 'FIX_Concrete', native 'SAM_OpaqueMaterial_FIX_Concrete_150mm_9d3a3ab2' + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.externalSolarReflectance: SAM 0.58, native 0.5800000000000001, |d| 1.1102230246251565E-16 (WithinTolerance); buried layer face (layer 2 of 3, SAM external face); SAM 'FIX_EPS', native 'SAM_OpaqueMaterial_FIX_EPS_120mm_23500162' + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.internalSolarReflectance: SAM 0.61, native 0.5800000000000001, |d| 0.029999999999999916 (OutsideTolerance); buried layer face (layer 2 of 3, SAM internal face); SAM 'FIX_EPS', native 'SAM_OpaqueMaterial_FIX_EPS_120mm_23500162' + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.externalLightReflectance: SAM 0.59, native 0.5900000000000001, |d| 1.1102230246251565E-16 (WithinTolerance); buried layer face (layer 2 of 3, SAM external face); SAM 'FIX_EPS', native 'SAM_OpaqueMaterial_FIX_EPS_120mm_23500162' + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.internalLightReflectance: SAM 0.63, native 0.5900000000000001, |d| 0.039999999999999925 (OutsideTolerance); buried layer face (layer 2 of 3, SAM internal face); SAM 'FIX_EPS', native 'SAM_OpaqueMaterial_FIX_EPS_120mm_23500162' + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.externalEmissivity: SAM 0.85, native 0.85, |d| 0 (Identical); buried layer face (layer 2 of 3, SAM external face); SAM 'FIX_EPS', native 'SAM_OpaqueMaterial_FIX_EPS_120mm_23500162' + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.internalEmissivity: SAM 0.96, native 0.85, |d| 0.10999999999999999 (OutsideTolerance); buried layer face (layer 2 of 3, SAM internal face); SAM 'FIX_EPS', native 'SAM_OpaqueMaterial_FIX_EPS_120mm_23500162' + ... 93 more in report.json diff --git a/documentation/S09-OpenStudio-InputReadBack-evidence/acceptance-2026-10-23/negatives/neg-missing-dsoa-link/report-approved.txt b/documentation/S09-OpenStudio-InputReadBack-evidence/acceptance-2026-10-23/negatives/neg-missing-dsoa-link/report-approved.txt new file mode 100644 index 0000000..8c0cb56 --- /dev/null +++ b/documentation/S09-OpenStudio-InputReadBack-evidence/acceptance-2026-10-23/negatives/neg-missing-dsoa-link/report-approved.txt @@ -0,0 +1,27 @@ +S09 OpenStudio read-back: s08-fix-box -> Fail (exit 10); rule set Approved; gate Fail; coverage Complete (319 required, 319 results); gated non-PASS 8; out-of-engine-scope 105 (informational, not gated) +outcomes: AcceptedTransformation 4, ExportDefect 8, Match 177, NotApplicable 1, OutOfEngineScope 105, WithinTolerance 24 +D-F2 space:5080c000-0000-0000-0000-00000000c001: V2 +CONSISTENCY FAIL: space:5080c000-0000-0000-0000-00000000c001: the OSM effective DSOA (SAM_InternalCondition_FIX_IC_BOX_af50b3dc_DesignSpecificationOutdoorAir) is not the one the IDF Ideal Loads delivers (none) +NOT PASS ExportDefect / Fail: 8 + 8a space:5080c000-0000-0000-0000-00000000c001.ic.ventilation.requirement.flow: SAM is zero (S-ZERO) and the native object is omitted without a listed transformation. + 8a space:5080c000-0000-0000-0000-00000000c001.ic.ventilation.requirement.flowPerArea: SAM is zero (S-ZERO) and the native object is omitted without a listed transformation. + 8a space:5080c000-0000-0000-0000-00000000c001.ic.ventilation.requirement.flowPerPerson: The native object is absent for an S-VALUE input. No limitation is listed. + 8a space:5080c000-0000-0000-0000-00000000c001.ic.ventilation.requirement.airChangesPerHour: SAM is zero (S-ZERO) and the native object is omitted without a listed transformation. + 8a space:5080c000-0000-0000-0000-00000000c001.ic.ventilation.requirement.total: The native object is absent for an S-VALUE input. No limitation is listed. + 8b space:5080c000-0000-0000-0000-00000000c001.ic.ventilation.delivered: SAM is zero (S-ZERO) and the native object is omitted without a listed transformation. Also: Hour/day-type alignment is unverified (S07 section 7); an EFLH agreement is supporting evidence only. [decisive element space:5080c000-0000-0000-0000-00000000c001.ic.ventilation.delivered[0] of 8760] + 6.hourly space:5080c000-0000-0000-0000-00000000c001.ic.schedule.ventilation: SAM is zero (S-ZERO) and the native object is omitted without a listed transformation. Also: Hour/day-type alignment is unverified (S07 section 7); an EFLH agreement is supporting evidence only. [decisive element space:5080c000-0000-0000-0000-00000000c001.ic.schedule.ventilation[0] of 8760] + 6.eflh space:5080c000-0000-0000-0000-00000000c001.ic.schedule.ventilation: The native object is absent for an S-VALUE input. No limitation is listed. +OUT-OF-ENGINE-SCOPE (informational, not gated; S07 §5.2 amendment U1 (SAM#218 b06dbe8c)): 105 row(s), 69 differing, 36 equal; by scope: buried layer face 102, ground surface outer face 3; by property: externalEmissivity 18, externalLightReflectance 18, externalSolarReflectance 18, internalEmissivity 17, internalLightReflectance 17, internalSolarReflectance 17 + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.externalSolarReflectance: SAM 0.31, native 0.31000000000000005, |d| 5.551115123125783E-17 (WithinTolerance); ground surface outer face; SAM 'FIX_Concrete', native 'SAM_OpaqueMaterial_FIX_Concrete_150mm_9d3a3ab2' + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.internalSolarReflectance: SAM 0.29, native 0.31000000000000005, |d| 0.020000000000000073 (OutsideTolerance); buried layer face (layer 1 of 3, SAM internal face); SAM 'FIX_Concrete', native 'SAM_OpaqueMaterial_FIX_Concrete_150mm_9d3a3ab2' + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.externalLightReflectance: SAM 0.32, native 0.31999999999999995, |d| 5.551115123125783E-17 (WithinTolerance); ground surface outer face; SAM 'FIX_Concrete', native 'SAM_OpaqueMaterial_FIX_Concrete_150mm_9d3a3ab2' + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.internalLightReflectance: SAM 0.3, native 0.31999999999999995, |d| 0.019999999999999962 (OutsideTolerance); buried layer face (layer 1 of 3, SAM internal face); SAM 'FIX_Concrete', native 'SAM_OpaqueMaterial_FIX_Concrete_150mm_9d3a3ab2' + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.externalEmissivity: SAM 0.95, native 0.95, |d| 0 (Identical); ground surface outer face; SAM 'FIX_Concrete', native 'SAM_OpaqueMaterial_FIX_Concrete_150mm_9d3a3ab2' + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.internalEmissivity: SAM 0.87, native 0.95, |d| 0.07999999999999996 (OutsideTolerance); buried layer face (layer 1 of 3, SAM internal face); SAM 'FIX_Concrete', native 'SAM_OpaqueMaterial_FIX_Concrete_150mm_9d3a3ab2' + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.externalSolarReflectance: SAM 0.58, native 0.5800000000000001, |d| 1.1102230246251565E-16 (WithinTolerance); buried layer face (layer 2 of 3, SAM external face); SAM 'FIX_EPS', native 'SAM_OpaqueMaterial_FIX_EPS_120mm_23500162' + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.internalSolarReflectance: SAM 0.61, native 0.5800000000000001, |d| 0.029999999999999916 (OutsideTolerance); buried layer face (layer 2 of 3, SAM internal face); SAM 'FIX_EPS', native 'SAM_OpaqueMaterial_FIX_EPS_120mm_23500162' + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.externalLightReflectance: SAM 0.59, native 0.5900000000000001, |d| 1.1102230246251565E-16 (WithinTolerance); buried layer face (layer 2 of 3, SAM external face); SAM 'FIX_EPS', native 'SAM_OpaqueMaterial_FIX_EPS_120mm_23500162' + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.internalLightReflectance: SAM 0.63, native 0.5900000000000001, |d| 0.039999999999999925 (OutsideTolerance); buried layer face (layer 2 of 3, SAM internal face); SAM 'FIX_EPS', native 'SAM_OpaqueMaterial_FIX_EPS_120mm_23500162' + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.externalEmissivity: SAM 0.85, native 0.85, |d| 0 (Identical); buried layer face (layer 2 of 3, SAM external face); SAM 'FIX_EPS', native 'SAM_OpaqueMaterial_FIX_EPS_120mm_23500162' + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.internalEmissivity: SAM 0.96, native 0.85, |d| 0.10999999999999999 (OutsideTolerance); buried layer face (layer 2 of 3, SAM internal face); SAM 'FIX_EPS', native 'SAM_OpaqueMaterial_FIX_EPS_120mm_23500162' + ... 93 more in report.json diff --git a/documentation/S09-OpenStudio-InputReadBack-evidence/acceptance-2026-10-23/negatives/neg-missing-schedule-object/report-approved.txt b/documentation/S09-OpenStudio-InputReadBack-evidence/acceptance-2026-10-23/negatives/neg-missing-schedule-object/report-approved.txt new file mode 100644 index 0000000..2e40d4a --- /dev/null +++ b/documentation/S09-OpenStudio-InputReadBack-evidence/acceptance-2026-10-23/negatives/neg-missing-schedule-object/report-approved.txt @@ -0,0 +1,22 @@ +S09 OpenStudio read-back: s08-fix-box -> Fail (exit 10); rule set Approved; gate BlockedTechnical; coverage Complete (319 required, 319 results); gated non-PASS 3; out-of-engine-scope 105 (informational, not gated) +outcomes: AcceptedTransformation 4, Match 181, NotApplicable 1, OutOfEngineScope 105, UnverifiedUnreadable 3, WithinTolerance 25 +D-F2 space:5080c000-0000-0000-0000-00000000c001: V2 +CONSISTENCY FAIL: space:5080c000-0000-0000-0000-00000000c001.ic.schedule.ventilation: names schedule 'SAM_Schedule_FIX_IC_BOX_VNT_Ventilation_970842a3', which the IDF does not define +NOT PASS UnverifiedUnreadable / BlockedTechnical: 3 + 8b space:5080c000-0000-0000-0000-00000000c001.ic.ventilation.delivered: The native field could not be read: the IDF does not define schedule 'SAM_Schedule_FIX_IC_BOX_VNT_Ventilation_970842a3'. Also: Hour/day-type alignment is unverified (S07 section 7); an EFLH agreement is supporting evidence only. [decisive element space:5080c000-0000-0000-0000-00000000c001.ic.ventilation.delivered[0] of 8760] + 6.hourly space:5080c000-0000-0000-0000-00000000c001.ic.schedule.ventilation: The native field could not be read: the IDF does not define schedule 'SAM_Schedule_FIX_IC_BOX_VNT_Ventilation_970842a3'. Also: Hour/day-type alignment is unverified (S07 section 7); an EFLH agreement is supporting evidence only. [decisive element space:5080c000-0000-0000-0000-00000000c001.ic.schedule.ventilation[0] of 8760] + 6.eflh space:5080c000-0000-0000-0000-00000000c001.ic.schedule.ventilation: The native field could not be read: the IDF does not define schedule 'SAM_Schedule_FIX_IC_BOX_VNT_Ventilation_970842a3'. +OUT-OF-ENGINE-SCOPE (informational, not gated; S07 §5.2 amendment U1 (SAM#218 b06dbe8c)): 105 row(s), 69 differing, 36 equal; by scope: buried layer face 102, ground surface outer face 3; by property: externalEmissivity 18, externalLightReflectance 18, externalSolarReflectance 18, internalEmissivity 17, internalLightReflectance 17, internalSolarReflectance 17 + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.externalSolarReflectance: SAM 0.31, native 0.31000000000000005, |d| 5.551115123125783E-17 (WithinTolerance); ground surface outer face; SAM 'FIX_Concrete', native 'SAM_OpaqueMaterial_FIX_Concrete_150mm_9d3a3ab2' + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.internalSolarReflectance: SAM 0.29, native 0.31000000000000005, |d| 0.020000000000000073 (OutsideTolerance); buried layer face (layer 1 of 3, SAM internal face); SAM 'FIX_Concrete', native 'SAM_OpaqueMaterial_FIX_Concrete_150mm_9d3a3ab2' + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.externalLightReflectance: SAM 0.32, native 0.31999999999999995, |d| 5.551115123125783E-17 (WithinTolerance); ground surface outer face; SAM 'FIX_Concrete', native 'SAM_OpaqueMaterial_FIX_Concrete_150mm_9d3a3ab2' + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.internalLightReflectance: SAM 0.3, native 0.31999999999999995, |d| 0.019999999999999962 (OutsideTolerance); buried layer face (layer 1 of 3, SAM internal face); SAM 'FIX_Concrete', native 'SAM_OpaqueMaterial_FIX_Concrete_150mm_9d3a3ab2' + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.externalEmissivity: SAM 0.95, native 0.95, |d| 0 (Identical); ground surface outer face; SAM 'FIX_Concrete', native 'SAM_OpaqueMaterial_FIX_Concrete_150mm_9d3a3ab2' + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.internalEmissivity: SAM 0.87, native 0.95, |d| 0.07999999999999996 (OutsideTolerance); buried layer face (layer 1 of 3, SAM internal face); SAM 'FIX_Concrete', native 'SAM_OpaqueMaterial_FIX_Concrete_150mm_9d3a3ab2' + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.externalSolarReflectance: SAM 0.58, native 0.5800000000000001, |d| 1.1102230246251565E-16 (WithinTolerance); buried layer face (layer 2 of 3, SAM external face); SAM 'FIX_EPS', native 'SAM_OpaqueMaterial_FIX_EPS_120mm_23500162' + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.internalSolarReflectance: SAM 0.61, native 0.5800000000000001, |d| 0.029999999999999916 (OutsideTolerance); buried layer face (layer 2 of 3, SAM internal face); SAM 'FIX_EPS', native 'SAM_OpaqueMaterial_FIX_EPS_120mm_23500162' + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.externalLightReflectance: SAM 0.59, native 0.5900000000000001, |d| 1.1102230246251565E-16 (WithinTolerance); buried layer face (layer 2 of 3, SAM external face); SAM 'FIX_EPS', native 'SAM_OpaqueMaterial_FIX_EPS_120mm_23500162' + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.internalLightReflectance: SAM 0.63, native 0.5900000000000001, |d| 0.039999999999999925 (OutsideTolerance); buried layer face (layer 2 of 3, SAM internal face); SAM 'FIX_EPS', native 'SAM_OpaqueMaterial_FIX_EPS_120mm_23500162' + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.externalEmissivity: SAM 0.85, native 0.85, |d| 0 (Identical); buried layer face (layer 2 of 3, SAM external face); SAM 'FIX_EPS', native 'SAM_OpaqueMaterial_FIX_EPS_120mm_23500162' + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.internalEmissivity: SAM 0.96, native 0.85, |d| 0.10999999999999999 (OutsideTolerance); buried layer face (layer 2 of 3, SAM internal face); SAM 'FIX_EPS', native 'SAM_OpaqueMaterial_FIX_EPS_120mm_23500162' + ... 93 more in report.json diff --git a/documentation/S09-OpenStudio-InputReadBack-evidence/acceptance-2026-10-23/negatives/neg-north-axis-both/report-approved.txt b/documentation/S09-OpenStudio-InputReadBack-evidence/acceptance-2026-10-23/negatives/neg-north-axis-both/report-approved.txt new file mode 100644 index 0000000..b5001fb --- /dev/null +++ b/documentation/S09-OpenStudio-InputReadBack-evidence/acceptance-2026-10-23/negatives/neg-north-axis-both/report-approved.txt @@ -0,0 +1,18 @@ +S09 OpenStudio read-back: s08-fix-box -> Fail (exit 10); rule set Approved; gate Pass; coverage Complete (319 required, 319 results); gated non-PASS 0; out-of-engine-scope 105 (informational, not gated) +outcomes: AcceptedTransformation 4, Match 183, NotApplicable 1, OutOfEngineScope 105, WithinTolerance 26 +D-F2 space:5080c000-0000-0000-0000-00000000c001: V2 +CONSISTENCY FAIL: orientation: Zone 'SAM_ThermalZone_FixBox_5080c000' is rotated by 90 deg (Building North Axis 90 + Direction of Relative North 0; Relative coordinates); SAM states no rotation +OUT-OF-ENGINE-SCOPE (informational, not gated; S07 §5.2 amendment U1 (SAM#218 b06dbe8c)): 105 row(s), 69 differing, 36 equal; by scope: buried layer face 102, ground surface outer face 3; by property: externalEmissivity 18, externalLightReflectance 18, externalSolarReflectance 18, internalEmissivity 17, internalLightReflectance 17, internalSolarReflectance 17 + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.externalSolarReflectance: SAM 0.31, native 0.31000000000000005, |d| 5.551115123125783E-17 (WithinTolerance); ground surface outer face; SAM 'FIX_Concrete', native 'SAM_OpaqueMaterial_FIX_Concrete_150mm_9d3a3ab2' + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.internalSolarReflectance: SAM 0.29, native 0.31000000000000005, |d| 0.020000000000000073 (OutsideTolerance); buried layer face (layer 1 of 3, SAM internal face); SAM 'FIX_Concrete', native 'SAM_OpaqueMaterial_FIX_Concrete_150mm_9d3a3ab2' + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.externalLightReflectance: SAM 0.32, native 0.31999999999999995, |d| 5.551115123125783E-17 (WithinTolerance); ground surface outer face; SAM 'FIX_Concrete', native 'SAM_OpaqueMaterial_FIX_Concrete_150mm_9d3a3ab2' + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.internalLightReflectance: SAM 0.3, native 0.31999999999999995, |d| 0.019999999999999962 (OutsideTolerance); buried layer face (layer 1 of 3, SAM internal face); SAM 'FIX_Concrete', native 'SAM_OpaqueMaterial_FIX_Concrete_150mm_9d3a3ab2' + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.externalEmissivity: SAM 0.95, native 0.95, |d| 0 (Identical); ground surface outer face; SAM 'FIX_Concrete', native 'SAM_OpaqueMaterial_FIX_Concrete_150mm_9d3a3ab2' + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.internalEmissivity: SAM 0.87, native 0.95, |d| 0.07999999999999996 (OutsideTolerance); buried layer face (layer 1 of 3, SAM internal face); SAM 'FIX_Concrete', native 'SAM_OpaqueMaterial_FIX_Concrete_150mm_9d3a3ab2' + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.externalSolarReflectance: SAM 0.58, native 0.5800000000000001, |d| 1.1102230246251565E-16 (WithinTolerance); buried layer face (layer 2 of 3, SAM external face); SAM 'FIX_EPS', native 'SAM_OpaqueMaterial_FIX_EPS_120mm_23500162' + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.internalSolarReflectance: SAM 0.61, native 0.5800000000000001, |d| 0.029999999999999916 (OutsideTolerance); buried layer face (layer 2 of 3, SAM internal face); SAM 'FIX_EPS', native 'SAM_OpaqueMaterial_FIX_EPS_120mm_23500162' + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.externalLightReflectance: SAM 0.59, native 0.5900000000000001, |d| 1.1102230246251565E-16 (WithinTolerance); buried layer face (layer 2 of 3, SAM external face); SAM 'FIX_EPS', native 'SAM_OpaqueMaterial_FIX_EPS_120mm_23500162' + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.internalLightReflectance: SAM 0.63, native 0.5900000000000001, |d| 0.039999999999999925 (OutsideTolerance); buried layer face (layer 2 of 3, SAM internal face); SAM 'FIX_EPS', native 'SAM_OpaqueMaterial_FIX_EPS_120mm_23500162' + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.externalEmissivity: SAM 0.85, native 0.85, |d| 0 (Identical); buried layer face (layer 2 of 3, SAM external face); SAM 'FIX_EPS', native 'SAM_OpaqueMaterial_FIX_EPS_120mm_23500162' + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.internalEmissivity: SAM 0.96, native 0.85, |d| 0.10999999999999999 (OutsideTolerance); buried layer face (layer 2 of 3, SAM internal face); SAM 'FIX_EPS', native 'SAM_OpaqueMaterial_FIX_EPS_120mm_23500162' + ... 93 more in report.json diff --git a/documentation/S09-OpenStudio-InputReadBack-evidence/acceptance-2026-10-23/negatives/neg-north-axis/report-approved.txt b/documentation/S09-OpenStudio-InputReadBack-evidence/acceptance-2026-10-23/negatives/neg-north-axis/report-approved.txt new file mode 100644 index 0000000..214bdd2 --- /dev/null +++ b/documentation/S09-OpenStudio-InputReadBack-evidence/acceptance-2026-10-23/negatives/neg-north-axis/report-approved.txt @@ -0,0 +1,19 @@ +S09 OpenStudio read-back: s08-fix-box -> Fail (exit 10); rule set Approved; gate Pass; coverage Complete (319 required, 319 results); gated non-PASS 0; out-of-engine-scope 105 (informational, not gated) +outcomes: AcceptedTransformation 4, Match 183, NotApplicable 1, OutOfEngineScope 105, WithinTolerance 26 +D-F2 space:5080c000-0000-0000-0000-00000000c001: V2 +CONSISTENCY FAIL: orientation: OS:Building North Axis 0 deg in the OSM, Building North Axis 90 deg in the IDF +CONSISTENCY FAIL: orientation: Zone 'SAM_ThermalZone_FixBox_5080c000' is rotated by 90 deg (Building North Axis 90 + Direction of Relative North 0; Relative coordinates); SAM states no rotation +OUT-OF-ENGINE-SCOPE (informational, not gated; S07 §5.2 amendment U1 (SAM#218 b06dbe8c)): 105 row(s), 69 differing, 36 equal; by scope: buried layer face 102, ground surface outer face 3; by property: externalEmissivity 18, externalLightReflectance 18, externalSolarReflectance 18, internalEmissivity 17, internalLightReflectance 17, internalSolarReflectance 17 + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.externalSolarReflectance: SAM 0.31, native 0.31000000000000005, |d| 5.551115123125783E-17 (WithinTolerance); ground surface outer face; SAM 'FIX_Concrete', native 'SAM_OpaqueMaterial_FIX_Concrete_150mm_9d3a3ab2' + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.internalSolarReflectance: SAM 0.29, native 0.31000000000000005, |d| 0.020000000000000073 (OutsideTolerance); buried layer face (layer 1 of 3, SAM internal face); SAM 'FIX_Concrete', native 'SAM_OpaqueMaterial_FIX_Concrete_150mm_9d3a3ab2' + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.externalLightReflectance: SAM 0.32, native 0.31999999999999995, |d| 5.551115123125783E-17 (WithinTolerance); ground surface outer face; SAM 'FIX_Concrete', native 'SAM_OpaqueMaterial_FIX_Concrete_150mm_9d3a3ab2' + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.internalLightReflectance: SAM 0.3, native 0.31999999999999995, |d| 0.019999999999999962 (OutsideTolerance); buried layer face (layer 1 of 3, SAM internal face); SAM 'FIX_Concrete', native 'SAM_OpaqueMaterial_FIX_Concrete_150mm_9d3a3ab2' + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.externalEmissivity: SAM 0.95, native 0.95, |d| 0 (Identical); ground surface outer face; SAM 'FIX_Concrete', native 'SAM_OpaqueMaterial_FIX_Concrete_150mm_9d3a3ab2' + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.internalEmissivity: SAM 0.87, native 0.95, |d| 0.07999999999999996 (OutsideTolerance); buried layer face (layer 1 of 3, SAM internal face); SAM 'FIX_Concrete', native 'SAM_OpaqueMaterial_FIX_Concrete_150mm_9d3a3ab2' + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.externalSolarReflectance: SAM 0.58, native 0.5800000000000001, |d| 1.1102230246251565E-16 (WithinTolerance); buried layer face (layer 2 of 3, SAM external face); SAM 'FIX_EPS', native 'SAM_OpaqueMaterial_FIX_EPS_120mm_23500162' + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.internalSolarReflectance: SAM 0.61, native 0.5800000000000001, |d| 0.029999999999999916 (OutsideTolerance); buried layer face (layer 2 of 3, SAM internal face); SAM 'FIX_EPS', native 'SAM_OpaqueMaterial_FIX_EPS_120mm_23500162' + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.externalLightReflectance: SAM 0.59, native 0.5900000000000001, |d| 1.1102230246251565E-16 (WithinTolerance); buried layer face (layer 2 of 3, SAM external face); SAM 'FIX_EPS', native 'SAM_OpaqueMaterial_FIX_EPS_120mm_23500162' + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.internalLightReflectance: SAM 0.63, native 0.5900000000000001, |d| 0.039999999999999925 (OutsideTolerance); buried layer face (layer 2 of 3, SAM internal face); SAM 'FIX_EPS', native 'SAM_OpaqueMaterial_FIX_EPS_120mm_23500162' + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.externalEmissivity: SAM 0.85, native 0.85, |d| 0 (Identical); buried layer face (layer 2 of 3, SAM external face); SAM 'FIX_EPS', native 'SAM_OpaqueMaterial_FIX_EPS_120mm_23500162' + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.internalEmissivity: SAM 0.96, native 0.85, |d| 0.10999999999999999 (OutsideTolerance); buried layer face (layer 2 of 3, SAM internal face); SAM 'FIX_EPS', native 'SAM_OpaqueMaterial_FIX_EPS_120mm_23500162' + ... 93 more in report.json diff --git a/documentation/S09-OpenStudio-InputReadBack-evidence/acceptance-2026-10-23/negatives/neg-osm-dsoa-schedule/report-approved.txt b/documentation/S09-OpenStudio-InputReadBack-evidence/acceptance-2026-10-23/negatives/neg-osm-dsoa-schedule/report-approved.txt new file mode 100644 index 0000000..b91191c --- /dev/null +++ b/documentation/S09-OpenStudio-InputReadBack-evidence/acceptance-2026-10-23/negatives/neg-osm-dsoa-schedule/report-approved.txt @@ -0,0 +1,18 @@ +S09 OpenStudio read-back: s08-fix-box -> Fail (exit 10); rule set Approved; gate Pass; coverage Complete (319 required, 319 results); gated non-PASS 0; out-of-engine-scope 105 (informational, not gated) +outcomes: AcceptedTransformation 4, Match 183, NotApplicable 1, OutOfEngineScope 105, WithinTolerance 26 +D-F2 space:5080c000-0000-0000-0000-00000000c001: V2 +CONSISTENCY FAIL: space:5080c000-0000-0000-0000-00000000c001: DSOA fraction schedule is '' in the OSM and 'SAM_Schedule_FIX_IC_BOX_VNT_Ventilation_970842a3' in the IDF +OUT-OF-ENGINE-SCOPE (informational, not gated; S07 §5.2 amendment U1 (SAM#218 b06dbe8c)): 105 row(s), 69 differing, 36 equal; by scope: buried layer face 102, ground surface outer face 3; by property: externalEmissivity 18, externalLightReflectance 18, externalSolarReflectance 18, internalEmissivity 17, internalLightReflectance 17, internalSolarReflectance 17 + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.externalSolarReflectance: SAM 0.31, native 0.31000000000000005, |d| 5.551115123125783E-17 (WithinTolerance); ground surface outer face; SAM 'FIX_Concrete', native 'SAM_OpaqueMaterial_FIX_Concrete_150mm_9d3a3ab2' + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.internalSolarReflectance: SAM 0.29, native 0.31000000000000005, |d| 0.020000000000000073 (OutsideTolerance); buried layer face (layer 1 of 3, SAM internal face); SAM 'FIX_Concrete', native 'SAM_OpaqueMaterial_FIX_Concrete_150mm_9d3a3ab2' + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.externalLightReflectance: SAM 0.32, native 0.31999999999999995, |d| 5.551115123125783E-17 (WithinTolerance); ground surface outer face; SAM 'FIX_Concrete', native 'SAM_OpaqueMaterial_FIX_Concrete_150mm_9d3a3ab2' + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.internalLightReflectance: SAM 0.3, native 0.31999999999999995, |d| 0.019999999999999962 (OutsideTolerance); buried layer face (layer 1 of 3, SAM internal face); SAM 'FIX_Concrete', native 'SAM_OpaqueMaterial_FIX_Concrete_150mm_9d3a3ab2' + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.externalEmissivity: SAM 0.95, native 0.95, |d| 0 (Identical); ground surface outer face; SAM 'FIX_Concrete', native 'SAM_OpaqueMaterial_FIX_Concrete_150mm_9d3a3ab2' + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.internalEmissivity: SAM 0.87, native 0.95, |d| 0.07999999999999996 (OutsideTolerance); buried layer face (layer 1 of 3, SAM internal face); SAM 'FIX_Concrete', native 'SAM_OpaqueMaterial_FIX_Concrete_150mm_9d3a3ab2' + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.externalSolarReflectance: SAM 0.58, native 0.5800000000000001, |d| 1.1102230246251565E-16 (WithinTolerance); buried layer face (layer 2 of 3, SAM external face); SAM 'FIX_EPS', native 'SAM_OpaqueMaterial_FIX_EPS_120mm_23500162' + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.internalSolarReflectance: SAM 0.61, native 0.5800000000000001, |d| 0.029999999999999916 (OutsideTolerance); buried layer face (layer 2 of 3, SAM internal face); SAM 'FIX_EPS', native 'SAM_OpaqueMaterial_FIX_EPS_120mm_23500162' + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.externalLightReflectance: SAM 0.59, native 0.5900000000000001, |d| 1.1102230246251565E-16 (WithinTolerance); buried layer face (layer 2 of 3, SAM external face); SAM 'FIX_EPS', native 'SAM_OpaqueMaterial_FIX_EPS_120mm_23500162' + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.internalLightReflectance: SAM 0.63, native 0.5900000000000001, |d| 0.039999999999999925 (OutsideTolerance); buried layer face (layer 2 of 3, SAM internal face); SAM 'FIX_EPS', native 'SAM_OpaqueMaterial_FIX_EPS_120mm_23500162' + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.externalEmissivity: SAM 0.85, native 0.85, |d| 0 (Identical); buried layer face (layer 2 of 3, SAM external face); SAM 'FIX_EPS', native 'SAM_OpaqueMaterial_FIX_EPS_120mm_23500162' + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.internalEmissivity: SAM 0.96, native 0.85, |d| 0.10999999999999999 (OutsideTolerance); buried layer face (layer 2 of 3, SAM internal face); SAM 'FIX_EPS', native 'SAM_OpaqueMaterial_FIX_EPS_120mm_23500162' + ... 93 more in report.json diff --git a/documentation/S09-OpenStudio-InputReadBack-evidence/acceptance-2026-10-23/negatives/neg-osm-missing-subsurfaces/report-approved.txt b/documentation/S09-OpenStudio-InputReadBack-evidence/acceptance-2026-10-23/negatives/neg-osm-missing-subsurfaces/report-approved.txt new file mode 100644 index 0000000..5505d4a --- /dev/null +++ b/documentation/S09-OpenStudio-InputReadBack-evidence/acceptance-2026-10-23/negatives/neg-osm-missing-subsurfaces/report-approved.txt @@ -0,0 +1,19 @@ +S09 OpenStudio read-back: s08-fix-box -> Fail (exit 10); rule set Approved; gate Pass; coverage Complete (319 required, 319 results); gated non-PASS 0; out-of-engine-scope 105 (informational, not gated) +outcomes: AcceptedTransformation 4, Match 183, NotApplicable 1, OutOfEngineScope 105, WithinTolerance 26 +D-F2 space:5080c000-0000-0000-0000-00000000c001: V2 +CONSISTENCY FAIL: multiplicity: IDF FenestrationSurface:Detailed 'SAM_SubSurface_FIX_WIN_UNFRAMED_0_6adea09c' has no OS:SubSurface in the OSM (none of its 0 OS:SubSurface object(s) has that name); the OSM and IDF disagree +CONSISTENCY FAIL: multiplicity: IDF FenestrationSurface:Detailed 'SAM_SubSurface_FIX_WIN_FRAMED_0_95717805' has no OS:SubSurface in the OSM (none of its 0 OS:SubSurface object(s) has that name); the OSM and IDF disagree +OUT-OF-ENGINE-SCOPE (informational, not gated; S07 §5.2 amendment U1 (SAM#218 b06dbe8c)): 105 row(s), 69 differing, 36 equal; by scope: buried layer face 102, ground surface outer face 3; by property: externalEmissivity 18, externalLightReflectance 18, externalSolarReflectance 18, internalEmissivity 17, internalLightReflectance 17, internalSolarReflectance 17 + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.externalSolarReflectance: SAM 0.31, native 0.31000000000000005, |d| 5.551115123125783E-17 (WithinTolerance); ground surface outer face; SAM 'FIX_Concrete', native 'SAM_OpaqueMaterial_FIX_Concrete_150mm_9d3a3ab2' + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.internalSolarReflectance: SAM 0.29, native 0.31000000000000005, |d| 0.020000000000000073 (OutsideTolerance); buried layer face (layer 1 of 3, SAM internal face); SAM 'FIX_Concrete', native 'SAM_OpaqueMaterial_FIX_Concrete_150mm_9d3a3ab2' + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.externalLightReflectance: SAM 0.32, native 0.31999999999999995, |d| 5.551115123125783E-17 (WithinTolerance); ground surface outer face; SAM 'FIX_Concrete', native 'SAM_OpaqueMaterial_FIX_Concrete_150mm_9d3a3ab2' + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.internalLightReflectance: SAM 0.3, native 0.31999999999999995, |d| 0.019999999999999962 (OutsideTolerance); buried layer face (layer 1 of 3, SAM internal face); SAM 'FIX_Concrete', native 'SAM_OpaqueMaterial_FIX_Concrete_150mm_9d3a3ab2' + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.externalEmissivity: SAM 0.95, native 0.95, |d| 0 (Identical); ground surface outer face; SAM 'FIX_Concrete', native 'SAM_OpaqueMaterial_FIX_Concrete_150mm_9d3a3ab2' + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.internalEmissivity: SAM 0.87, native 0.95, |d| 0.07999999999999996 (OutsideTolerance); buried layer face (layer 1 of 3, SAM internal face); SAM 'FIX_Concrete', native 'SAM_OpaqueMaterial_FIX_Concrete_150mm_9d3a3ab2' + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.externalSolarReflectance: SAM 0.58, native 0.5800000000000001, |d| 1.1102230246251565E-16 (WithinTolerance); buried layer face (layer 2 of 3, SAM external face); SAM 'FIX_EPS', native 'SAM_OpaqueMaterial_FIX_EPS_120mm_23500162' + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.internalSolarReflectance: SAM 0.61, native 0.5800000000000001, |d| 0.029999999999999916 (OutsideTolerance); buried layer face (layer 2 of 3, SAM internal face); SAM 'FIX_EPS', native 'SAM_OpaqueMaterial_FIX_EPS_120mm_23500162' + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.externalLightReflectance: SAM 0.59, native 0.5900000000000001, |d| 1.1102230246251565E-16 (WithinTolerance); buried layer face (layer 2 of 3, SAM external face); SAM 'FIX_EPS', native 'SAM_OpaqueMaterial_FIX_EPS_120mm_23500162' + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.internalLightReflectance: SAM 0.63, native 0.5900000000000001, |d| 0.039999999999999925 (OutsideTolerance); buried layer face (layer 2 of 3, SAM internal face); SAM 'FIX_EPS', native 'SAM_OpaqueMaterial_FIX_EPS_120mm_23500162' + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.externalEmissivity: SAM 0.85, native 0.85, |d| 0 (Identical); buried layer face (layer 2 of 3, SAM external face); SAM 'FIX_EPS', native 'SAM_OpaqueMaterial_FIX_EPS_120mm_23500162' + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.internalEmissivity: SAM 0.96, native 0.85, |d| 0.10999999999999999 (OutsideTolerance); buried layer face (layer 2 of 3, SAM internal face); SAM 'FIX_EPS', native 'SAM_OpaqueMaterial_FIX_EPS_120mm_23500162' + ... 93 more in report.json diff --git a/documentation/S09-OpenStudio-InputReadBack-evidence/acceptance-2026-10-23/negatives/neg-osm-missing-thermal-zone/report-approved.txt b/documentation/S09-OpenStudio-InputReadBack-evidence/acceptance-2026-10-23/negatives/neg-osm-missing-thermal-zone/report-approved.txt new file mode 100644 index 0000000..7e716b6 --- /dev/null +++ b/documentation/S09-OpenStudio-InputReadBack-evidence/acceptance-2026-10-23/negatives/neg-osm-missing-thermal-zone/report-approved.txt @@ -0,0 +1,19 @@ +S09 OpenStudio read-back: s08-fix-two -> Fail (exit 10); rule set Approved; gate Pass; coverage Complete (592 required, 592 results); gated non-PASS 0; out-of-engine-scope 216 (informational, not gated) +outcomes: AcceptedTransformation 14, Match 319, NotApplicable 1, OutOfEngineScope 216, WithinTolerance 42 +D-F2 space:5080c000-0000-0000-0000-00000000c0a1: V1 +D-F2 space:5080c000-0000-0000-0000-00000000c0b1: V1 +CONSISTENCY FAIL: multiplicity: IDF Zone 'SAM_ThermalZone_FixA_5080c000' has no OS:ThermalZone in the OSM (none of its 1 OS:ThermalZone object(s) has that name); the OSM and IDF disagree +OUT-OF-ENGINE-SCOPE (informational, not gated; S07 §5.2 amendment U1 (SAM#218 b06dbe8c)): 216 row(s), 138 differing, 78 equal; by scope: buried layer face 204, ground surface outer face 6, interzone surface outer face 6; by property: externalEmissivity 37, externalLightReflectance 37, externalSolarReflectance 37, internalEmissivity 35, internalLightReflectance 35, internalSolarReflectance 35 + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer1.externalSolarReflectance: SAM 0.31, native 0.31000000000000005, |d| 5.551115123125783E-17 (WithinTolerance); ground surface outer face; SAM 'FIX_Concrete', native 'SAM_OpaqueMaterial_FIX_Concrete_150mm_b313ccd6' + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer1.internalSolarReflectance: SAM 0.29, native 0.31000000000000005, |d| 0.020000000000000073 (OutsideTolerance); buried layer face (layer 1 of 3, SAM internal face); SAM 'FIX_Concrete', native 'SAM_OpaqueMaterial_FIX_Concrete_150mm_b313ccd6' + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer1.externalLightReflectance: SAM 0.32, native 0.31999999999999995, |d| 5.551115123125783E-17 (WithinTolerance); ground surface outer face; SAM 'FIX_Concrete', native 'SAM_OpaqueMaterial_FIX_Concrete_150mm_b313ccd6' + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer1.internalLightReflectance: SAM 0.3, native 0.31999999999999995, |d| 0.019999999999999962 (OutsideTolerance); buried layer face (layer 1 of 3, SAM internal face); SAM 'FIX_Concrete', native 'SAM_OpaqueMaterial_FIX_Concrete_150mm_b313ccd6' + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer1.externalEmissivity: SAM 0.95, native 0.95, |d| 0 (Identical); ground surface outer face; SAM 'FIX_Concrete', native 'SAM_OpaqueMaterial_FIX_Concrete_150mm_b313ccd6' + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer1.internalEmissivity: SAM 0.87, native 0.95, |d| 0.07999999999999996 (OutsideTolerance); buried layer face (layer 1 of 3, SAM internal face); SAM 'FIX_Concrete', native 'SAM_OpaqueMaterial_FIX_Concrete_150mm_b313ccd6' + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer2.externalSolarReflectance: SAM 0.58, native 0.5800000000000001, |d| 1.1102230246251565E-16 (WithinTolerance); buried layer face (layer 2 of 3, SAM external face); SAM 'FIX_EPS', native 'SAM_OpaqueMaterial_FIX_EPS_120mm_c3cb21c2' + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer2.internalSolarReflectance: SAM 0.61, native 0.5800000000000001, |d| 0.029999999999999916 (OutsideTolerance); buried layer face (layer 2 of 3, SAM internal face); SAM 'FIX_EPS', native 'SAM_OpaqueMaterial_FIX_EPS_120mm_c3cb21c2' + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer2.externalLightReflectance: SAM 0.59, native 0.5900000000000001, |d| 1.1102230246251565E-16 (WithinTolerance); buried layer face (layer 2 of 3, SAM external face); SAM 'FIX_EPS', native 'SAM_OpaqueMaterial_FIX_EPS_120mm_c3cb21c2' + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer2.internalLightReflectance: SAM 0.63, native 0.5900000000000001, |d| 0.039999999999999925 (OutsideTolerance); buried layer face (layer 2 of 3, SAM internal face); SAM 'FIX_EPS', native 'SAM_OpaqueMaterial_FIX_EPS_120mm_c3cb21c2' + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer2.externalEmissivity: SAM 0.85, native 0.85, |d| 0 (Identical); buried layer face (layer 2 of 3, SAM external face); SAM 'FIX_EPS', native 'SAM_OpaqueMaterial_FIX_EPS_120mm_c3cb21c2' + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer2.internalEmissivity: SAM 0.96, native 0.85, |d| 0.10999999999999999 (OutsideTolerance); buried layer face (layer 2 of 3, SAM internal face); SAM 'FIX_EPS', native 'SAM_OpaqueMaterial_FIX_EPS_120mm_c3cb21c2' + ... 204 more in report.json diff --git a/documentation/S09-OpenStudio-InputReadBack-evidence/acceptance-2026-10-23/negatives/neg-people-density/report-approved.txt b/documentation/S09-OpenStudio-InputReadBack-evidence/acceptance-2026-10-23/negatives/neg-people-density/report-approved.txt new file mode 100644 index 0000000..cc3fa50 --- /dev/null +++ b/documentation/S09-OpenStudio-InputReadBack-evidence/acceptance-2026-10-23/negatives/neg-people-density/report-approved.txt @@ -0,0 +1,25 @@ +S09 OpenStudio read-back: s08-fix-box -> Fail (exit 10); rule set Approved; gate Fail; coverage Complete (319 required, 319 results); gated non-PASS 7; out-of-engine-scope 105 (informational, not gated) +outcomes: AcceptedTransformation 4, Match 183, NotApplicable 1, OutOfEngineScope 105, OutOfTolerance 7, WithinTolerance 19 +D-F2 space:5080c000-0000-0000-0000-00000000c001: V2 +NOT PASS OutOfTolerance / Fail: 7 + 4a.people space:5080c000-0000-0000-0000-00000000c001.ic.people: The native value is outside the tolerance without a contract explanation. + 4a.density space:5080c000-0000-0000-0000-00000000c001.ic.occupancySensible: The native value is outside the tolerance without a contract explanation. + 4b space:5080c000-0000-0000-0000-00000000c001.ic.occupancySensible.total: The native value is outside the tolerance without a contract explanation. + 4a.density space:5080c000-0000-0000-0000-00000000c001.ic.occupancyLatent: The native value is outside the tolerance without a contract explanation. + 4b space:5080c000-0000-0000-0000-00000000c001.ic.occupancyLatent.total: The native value is outside the tolerance without a contract explanation. + 8a space:5080c000-0000-0000-0000-00000000c001.ic.ventilation.requirement.total: The native value is outside the tolerance without a contract explanation. + 8b space:5080c000-0000-0000-0000-00000000c001.ic.ventilation.delivered: The native value is outside the tolerance without a contract explanation. [decisive element space:5080c000-0000-0000-0000-00000000c001.ic.ventilation.delivered[7] of 8760] +OUT-OF-ENGINE-SCOPE (informational, not gated; S07 §5.2 amendment U1 (SAM#218 b06dbe8c)): 105 row(s), 69 differing, 36 equal; by scope: buried layer face 102, ground surface outer face 3; by property: externalEmissivity 18, externalLightReflectance 18, externalSolarReflectance 18, internalEmissivity 17, internalLightReflectance 17, internalSolarReflectance 17 + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.externalSolarReflectance: SAM 0.31, native 0.31000000000000005, |d| 5.551115123125783E-17 (WithinTolerance); ground surface outer face; SAM 'FIX_Concrete', native 'SAM_OpaqueMaterial_FIX_Concrete_150mm_9d3a3ab2' + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.internalSolarReflectance: SAM 0.29, native 0.31000000000000005, |d| 0.020000000000000073 (OutsideTolerance); buried layer face (layer 1 of 3, SAM internal face); SAM 'FIX_Concrete', native 'SAM_OpaqueMaterial_FIX_Concrete_150mm_9d3a3ab2' + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.externalLightReflectance: SAM 0.32, native 0.31999999999999995, |d| 5.551115123125783E-17 (WithinTolerance); ground surface outer face; SAM 'FIX_Concrete', native 'SAM_OpaqueMaterial_FIX_Concrete_150mm_9d3a3ab2' + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.internalLightReflectance: SAM 0.3, native 0.31999999999999995, |d| 0.019999999999999962 (OutsideTolerance); buried layer face (layer 1 of 3, SAM internal face); SAM 'FIX_Concrete', native 'SAM_OpaqueMaterial_FIX_Concrete_150mm_9d3a3ab2' + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.externalEmissivity: SAM 0.95, native 0.95, |d| 0 (Identical); ground surface outer face; SAM 'FIX_Concrete', native 'SAM_OpaqueMaterial_FIX_Concrete_150mm_9d3a3ab2' + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.internalEmissivity: SAM 0.87, native 0.95, |d| 0.07999999999999996 (OutsideTolerance); buried layer face (layer 1 of 3, SAM internal face); SAM 'FIX_Concrete', native 'SAM_OpaqueMaterial_FIX_Concrete_150mm_9d3a3ab2' + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.externalSolarReflectance: SAM 0.58, native 0.5800000000000001, |d| 1.1102230246251565E-16 (WithinTolerance); buried layer face (layer 2 of 3, SAM external face); SAM 'FIX_EPS', native 'SAM_OpaqueMaterial_FIX_EPS_120mm_23500162' + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.internalSolarReflectance: SAM 0.61, native 0.5800000000000001, |d| 0.029999999999999916 (OutsideTolerance); buried layer face (layer 2 of 3, SAM internal face); SAM 'FIX_EPS', native 'SAM_OpaqueMaterial_FIX_EPS_120mm_23500162' + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.externalLightReflectance: SAM 0.59, native 0.5900000000000001, |d| 1.1102230246251565E-16 (WithinTolerance); buried layer face (layer 2 of 3, SAM external face); SAM 'FIX_EPS', native 'SAM_OpaqueMaterial_FIX_EPS_120mm_23500162' + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.internalLightReflectance: SAM 0.63, native 0.5900000000000001, |d| 0.039999999999999925 (OutsideTolerance); buried layer face (layer 2 of 3, SAM internal face); SAM 'FIX_EPS', native 'SAM_OpaqueMaterial_FIX_EPS_120mm_23500162' + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.externalEmissivity: SAM 0.85, native 0.85, |d| 0 (Identical); buried layer face (layer 2 of 3, SAM external face); SAM 'FIX_EPS', native 'SAM_OpaqueMaterial_FIX_EPS_120mm_23500162' + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.internalEmissivity: SAM 0.96, native 0.85, |d| 0.10999999999999999 (OutsideTolerance); buried layer face (layer 2 of 3, SAM internal face); SAM 'FIX_EPS', native 'SAM_OpaqueMaterial_FIX_EPS_120mm_23500162' + ... 93 more in report.json diff --git a/documentation/S09-OpenStudio-InputReadBack-evidence/acceptance-2026-10-23/negatives/neg-schedule-swap/report-approved.txt b/documentation/S09-OpenStudio-InputReadBack-evidence/acceptance-2026-10-23/negatives/neg-schedule-swap/report-approved.txt new file mode 100644 index 0000000..cb9b938 --- /dev/null +++ b/documentation/S09-OpenStudio-InputReadBack-evidence/acceptance-2026-10-23/negatives/neg-schedule-swap/report-approved.txt @@ -0,0 +1,23 @@ +S09 OpenStudio read-back: s08-fix-box -> Fail (exit 10); rule set Approved; gate Fail; coverage Complete (319 required, 319 results); gated non-PASS 3; out-of-engine-scope 105 (informational, not gated) +outcomes: AcceptedTransformation 4, ExportDefect 2, Match 181, NotApplicable 1, OutOfEngineScope 105, OutOfTolerance 1, WithinTolerance 25 +D-F2 space:5080c000-0000-0000-0000-00000000c001: V2 +CONSISTENCY FAIL: space:5080c000-0000-0000-0000-00000000c001: DSOA fraction schedule is 'SAM_Schedule_FIX_IC_BOX_VNT_Ventilation_970842a3' in the OSM and 'SAM_Schedule_FIX_IC_BOX_OCC_Occupancy_98cc45ae' in the IDF +NOT PASS ExportDefect / Fail: 2 + 8b space:5080c000-0000-0000-0000-00000000c001.ic.ventilation.delivered: SAM states a non-zero value (S-VALUE) but the native object holds exactly 0; abs never turns a zeroed native object into a pass. No limitation is listed. [decisive element space:5080c000-0000-0000-0000-00000000c001.ic.ventilation.delivered[7] of 8760] + 6.hourly space:5080c000-0000-0000-0000-00000000c001.ic.schedule.ventilation: SAM states a non-zero value (S-VALUE) but the native object holds exactly 0; abs never turns a zeroed native object into a pass. No limitation is listed. [decisive element space:5080c000-0000-0000-0000-00000000c001.ic.schedule.ventilation[7] of 8760] +NOT PASS OutOfTolerance / Fail: 1 + 6.eflh space:5080c000-0000-0000-0000-00000000c001.ic.schedule.ventilation: The native value is outside the tolerance without a contract explanation. +OUT-OF-ENGINE-SCOPE (informational, not gated; S07 §5.2 amendment U1 (SAM#218 b06dbe8c)): 105 row(s), 69 differing, 36 equal; by scope: buried layer face 102, ground surface outer face 3; by property: externalEmissivity 18, externalLightReflectance 18, externalSolarReflectance 18, internalEmissivity 17, internalLightReflectance 17, internalSolarReflectance 17 + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.externalSolarReflectance: SAM 0.31, native 0.31000000000000005, |d| 5.551115123125783E-17 (WithinTolerance); ground surface outer face; SAM 'FIX_Concrete', native 'SAM_OpaqueMaterial_FIX_Concrete_150mm_9d3a3ab2' + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.internalSolarReflectance: SAM 0.29, native 0.31000000000000005, |d| 0.020000000000000073 (OutsideTolerance); buried layer face (layer 1 of 3, SAM internal face); SAM 'FIX_Concrete', native 'SAM_OpaqueMaterial_FIX_Concrete_150mm_9d3a3ab2' + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.externalLightReflectance: SAM 0.32, native 0.31999999999999995, |d| 5.551115123125783E-17 (WithinTolerance); ground surface outer face; SAM 'FIX_Concrete', native 'SAM_OpaqueMaterial_FIX_Concrete_150mm_9d3a3ab2' + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.internalLightReflectance: SAM 0.3, native 0.31999999999999995, |d| 0.019999999999999962 (OutsideTolerance); buried layer face (layer 1 of 3, SAM internal face); SAM 'FIX_Concrete', native 'SAM_OpaqueMaterial_FIX_Concrete_150mm_9d3a3ab2' + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.externalEmissivity: SAM 0.95, native 0.95, |d| 0 (Identical); ground surface outer face; SAM 'FIX_Concrete', native 'SAM_OpaqueMaterial_FIX_Concrete_150mm_9d3a3ab2' + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.internalEmissivity: SAM 0.87, native 0.95, |d| 0.07999999999999996 (OutsideTolerance); buried layer face (layer 1 of 3, SAM internal face); SAM 'FIX_Concrete', native 'SAM_OpaqueMaterial_FIX_Concrete_150mm_9d3a3ab2' + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.externalSolarReflectance: SAM 0.58, native 0.5800000000000001, |d| 1.1102230246251565E-16 (WithinTolerance); buried layer face (layer 2 of 3, SAM external face); SAM 'FIX_EPS', native 'SAM_OpaqueMaterial_FIX_EPS_120mm_23500162' + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.internalSolarReflectance: SAM 0.61, native 0.5800000000000001, |d| 0.029999999999999916 (OutsideTolerance); buried layer face (layer 2 of 3, SAM internal face); SAM 'FIX_EPS', native 'SAM_OpaqueMaterial_FIX_EPS_120mm_23500162' + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.externalLightReflectance: SAM 0.59, native 0.5900000000000001, |d| 1.1102230246251565E-16 (WithinTolerance); buried layer face (layer 2 of 3, SAM external face); SAM 'FIX_EPS', native 'SAM_OpaqueMaterial_FIX_EPS_120mm_23500162' + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.internalLightReflectance: SAM 0.63, native 0.5900000000000001, |d| 0.039999999999999925 (OutsideTolerance); buried layer face (layer 2 of 3, SAM internal face); SAM 'FIX_EPS', native 'SAM_OpaqueMaterial_FIX_EPS_120mm_23500162' + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.externalEmissivity: SAM 0.85, native 0.85, |d| 0 (Identical); buried layer face (layer 2 of 3, SAM external face); SAM 'FIX_EPS', native 'SAM_OpaqueMaterial_FIX_EPS_120mm_23500162' + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.internalEmissivity: SAM 0.96, native 0.85, |d| 0.10999999999999999 (OutsideTolerance); buried layer face (layer 2 of 3, SAM internal face); SAM 'FIX_EPS', native 'SAM_OpaqueMaterial_FIX_EPS_120mm_23500162' + ... 93 more in report.json diff --git a/documentation/S09-OpenStudio-InputReadBack-evidence/acceptance-2026-10-23/negatives/neg-v1-unscheduled/report-approved.txt b/documentation/S09-OpenStudio-InputReadBack-evidence/acceptance-2026-10-23/negatives/neg-v1-unscheduled/report-approved.txt new file mode 100644 index 0000000..295b104 --- /dev/null +++ b/documentation/S09-OpenStudio-InputReadBack-evidence/acceptance-2026-10-23/negatives/neg-v1-unscheduled/report-approved.txt @@ -0,0 +1,24 @@ +S09 OpenStudio read-back: s08-fix-two -> Fail (exit 10); rule set Approved; gate Fail; coverage Complete (592 required, 592 results); gated non-PASS 4; out-of-engine-scope 216 (informational, not gated) +outcomes: AcceptedTransformation 8, ExportDefect 2, Match 319, NotApplicable 3, OutOfEngineScope 216, UnverifiedUnresolved 2, WithinTolerance 42 +D-F2 space:5080c000-0000-0000-0000-00000000c0a1: V1 +D-F2 space:5080c000-0000-0000-0000-00000000c0b1: V1 +NOT PASS ExportDefect / Fail: 2 + 8b space:5080c000-0000-0000-0000-00000000c0a1.ic.ventilation.delivered: SAM states no value (S-UNSPEC) and the native holds a non-zero value that is not the contract-listed default. Also: Hour/day-type alignment is unverified (S07 section 7); an EFLH agreement is supporting evidence only. [decisive element space:5080c000-0000-0000-0000-00000000c0a1.ic.ventilation.delivered[0] of 8760] + 8b space:5080c000-0000-0000-0000-00000000c0b1.ic.ventilation.delivered: SAM states no value (S-UNSPEC) and the native holds a non-zero value that is not the contract-listed default. Also: Hour/day-type alignment is unverified (S07 section 7); an EFLH agreement is supporting evidence only. [decisive element space:5080c000-0000-0000-0000-00000000c0b1.ic.ventilation.delivered[0] of 8760] +NOT PASS UnverifiedUnresolved / NotRun: 2 + 6.hourly space:5080c000-0000-0000-0000-00000000c0a1.ic.schedule.ventilation: Hour/day-type alignment is unverified (S07 section 7); an EFLH agreement is supporting evidence only. + 6.hourly space:5080c000-0000-0000-0000-00000000c0b1.ic.schedule.ventilation: Hour/day-type alignment is unverified (S07 section 7); an EFLH agreement is supporting evidence only. +OUT-OF-ENGINE-SCOPE (informational, not gated; S07 §5.2 amendment U1 (SAM#218 b06dbe8c)): 216 row(s), 138 differing, 78 equal; by scope: buried layer face 204, ground surface outer face 6, interzone surface outer face 6; by property: externalEmissivity 37, externalLightReflectance 37, externalSolarReflectance 37, internalEmissivity 35, internalLightReflectance 35, internalSolarReflectance 35 + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer1.externalSolarReflectance: SAM 0.31, native 0.31000000000000005, |d| 5.551115123125783E-17 (WithinTolerance); ground surface outer face; SAM 'FIX_Concrete', native 'SAM_OpaqueMaterial_FIX_Concrete_150mm_b313ccd6' + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer1.internalSolarReflectance: SAM 0.29, native 0.31000000000000005, |d| 0.020000000000000073 (OutsideTolerance); buried layer face (layer 1 of 3, SAM internal face); SAM 'FIX_Concrete', native 'SAM_OpaqueMaterial_FIX_Concrete_150mm_b313ccd6' + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer1.externalLightReflectance: SAM 0.32, native 0.31999999999999995, |d| 5.551115123125783E-17 (WithinTolerance); ground surface outer face; SAM 'FIX_Concrete', native 'SAM_OpaqueMaterial_FIX_Concrete_150mm_b313ccd6' + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer1.internalLightReflectance: SAM 0.3, native 0.31999999999999995, |d| 0.019999999999999962 (OutsideTolerance); buried layer face (layer 1 of 3, SAM internal face); SAM 'FIX_Concrete', native 'SAM_OpaqueMaterial_FIX_Concrete_150mm_b313ccd6' + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer1.externalEmissivity: SAM 0.95, native 0.95, |d| 0 (Identical); ground surface outer face; SAM 'FIX_Concrete', native 'SAM_OpaqueMaterial_FIX_Concrete_150mm_b313ccd6' + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer1.internalEmissivity: SAM 0.87, native 0.95, |d| 0.07999999999999996 (OutsideTolerance); buried layer face (layer 1 of 3, SAM internal face); SAM 'FIX_Concrete', native 'SAM_OpaqueMaterial_FIX_Concrete_150mm_b313ccd6' + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer2.externalSolarReflectance: SAM 0.58, native 0.5800000000000001, |d| 1.1102230246251565E-16 (WithinTolerance); buried layer face (layer 2 of 3, SAM external face); SAM 'FIX_EPS', native 'SAM_OpaqueMaterial_FIX_EPS_120mm_c3cb21c2' + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer2.internalSolarReflectance: SAM 0.61, native 0.5800000000000001, |d| 0.029999999999999916 (OutsideTolerance); buried layer face (layer 2 of 3, SAM internal face); SAM 'FIX_EPS', native 'SAM_OpaqueMaterial_FIX_EPS_120mm_c3cb21c2' + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer2.externalLightReflectance: SAM 0.59, native 0.5900000000000001, |d| 1.1102230246251565E-16 (WithinTolerance); buried layer face (layer 2 of 3, SAM external face); SAM 'FIX_EPS', native 'SAM_OpaqueMaterial_FIX_EPS_120mm_c3cb21c2' + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer2.internalLightReflectance: SAM 0.63, native 0.5900000000000001, |d| 0.039999999999999925 (OutsideTolerance); buried layer face (layer 2 of 3, SAM internal face); SAM 'FIX_EPS', native 'SAM_OpaqueMaterial_FIX_EPS_120mm_c3cb21c2' + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer2.externalEmissivity: SAM 0.85, native 0.85, |d| 0 (Identical); buried layer face (layer 2 of 3, SAM external face); SAM 'FIX_EPS', native 'SAM_OpaqueMaterial_FIX_EPS_120mm_c3cb21c2' + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer2.internalEmissivity: SAM 0.96, native 0.85, |d| 0.10999999999999999 (OutsideTolerance); buried layer face (layer 2 of 3, SAM internal face); SAM 'FIX_EPS', native 'SAM_OpaqueMaterial_FIX_EPS_120mm_c3cb21c2' + ... 204 more in report.json diff --git a/documentation/S09-OpenStudio-InputReadBack-evidence/acceptance-2026-10-23/negatives/neg-window-multiplier-both/report-approved.txt b/documentation/S09-OpenStudio-InputReadBack-evidence/acceptance-2026-10-23/negatives/neg-window-multiplier-both/report-approved.txt new file mode 100644 index 0000000..5769660 --- /dev/null +++ b/documentation/S09-OpenStudio-InputReadBack-evidence/acceptance-2026-10-23/negatives/neg-window-multiplier-both/report-approved.txt @@ -0,0 +1,19 @@ +S09 OpenStudio read-back: s08-fix-box -> Fail (exit 10); rule set Approved; gate Pass; coverage Complete (319 required, 319 results); gated non-PASS 0; out-of-engine-scope 105 (informational, not gated) +outcomes: AcceptedTransformation 4, Match 183, NotApplicable 1, OutOfEngineScope 105, WithinTolerance 26 +D-F2 space:5080c000-0000-0000-0000-00000000c001: V2 +CONSISTENCY FAIL: multiplicity: IDF FenestrationSurface:Detailed 'SAM_SubSurface_FIX_WIN_UNFRAMED_0_6adea09c' Multiplier 2: EnergyPlus multiplies its area (frame and divider included); SAM states one aperture and no multiplier +CONSISTENCY FAIL: multiplicity: IDF FenestrationSurface:Detailed 'SAM_SubSurface_FIX_WIN_FRAMED_0_95717805' Multiplier 2: EnergyPlus multiplies its area (frame and divider included); SAM states one aperture and no multiplier +OUT-OF-ENGINE-SCOPE (informational, not gated; S07 §5.2 amendment U1 (SAM#218 b06dbe8c)): 105 row(s), 69 differing, 36 equal; by scope: buried layer face 102, ground surface outer face 3; by property: externalEmissivity 18, externalLightReflectance 18, externalSolarReflectance 18, internalEmissivity 17, internalLightReflectance 17, internalSolarReflectance 17 + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.externalSolarReflectance: SAM 0.31, native 0.31000000000000005, |d| 5.551115123125783E-17 (WithinTolerance); ground surface outer face; SAM 'FIX_Concrete', native 'SAM_OpaqueMaterial_FIX_Concrete_150mm_9d3a3ab2' + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.internalSolarReflectance: SAM 0.29, native 0.31000000000000005, |d| 0.020000000000000073 (OutsideTolerance); buried layer face (layer 1 of 3, SAM internal face); SAM 'FIX_Concrete', native 'SAM_OpaqueMaterial_FIX_Concrete_150mm_9d3a3ab2' + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.externalLightReflectance: SAM 0.32, native 0.31999999999999995, |d| 5.551115123125783E-17 (WithinTolerance); ground surface outer face; SAM 'FIX_Concrete', native 'SAM_OpaqueMaterial_FIX_Concrete_150mm_9d3a3ab2' + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.internalLightReflectance: SAM 0.3, native 0.31999999999999995, |d| 0.019999999999999962 (OutsideTolerance); buried layer face (layer 1 of 3, SAM internal face); SAM 'FIX_Concrete', native 'SAM_OpaqueMaterial_FIX_Concrete_150mm_9d3a3ab2' + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.externalEmissivity: SAM 0.95, native 0.95, |d| 0 (Identical); ground surface outer face; SAM 'FIX_Concrete', native 'SAM_OpaqueMaterial_FIX_Concrete_150mm_9d3a3ab2' + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.internalEmissivity: SAM 0.87, native 0.95, |d| 0.07999999999999996 (OutsideTolerance); buried layer face (layer 1 of 3, SAM internal face); SAM 'FIX_Concrete', native 'SAM_OpaqueMaterial_FIX_Concrete_150mm_9d3a3ab2' + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.externalSolarReflectance: SAM 0.58, native 0.5800000000000001, |d| 1.1102230246251565E-16 (WithinTolerance); buried layer face (layer 2 of 3, SAM external face); SAM 'FIX_EPS', native 'SAM_OpaqueMaterial_FIX_EPS_120mm_23500162' + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.internalSolarReflectance: SAM 0.61, native 0.5800000000000001, |d| 0.029999999999999916 (OutsideTolerance); buried layer face (layer 2 of 3, SAM internal face); SAM 'FIX_EPS', native 'SAM_OpaqueMaterial_FIX_EPS_120mm_23500162' + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.externalLightReflectance: SAM 0.59, native 0.5900000000000001, |d| 1.1102230246251565E-16 (WithinTolerance); buried layer face (layer 2 of 3, SAM external face); SAM 'FIX_EPS', native 'SAM_OpaqueMaterial_FIX_EPS_120mm_23500162' + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.internalLightReflectance: SAM 0.63, native 0.5900000000000001, |d| 0.039999999999999925 (OutsideTolerance); buried layer face (layer 2 of 3, SAM internal face); SAM 'FIX_EPS', native 'SAM_OpaqueMaterial_FIX_EPS_120mm_23500162' + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.externalEmissivity: SAM 0.85, native 0.85, |d| 0 (Identical); buried layer face (layer 2 of 3, SAM external face); SAM 'FIX_EPS', native 'SAM_OpaqueMaterial_FIX_EPS_120mm_23500162' + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.internalEmissivity: SAM 0.96, native 0.85, |d| 0.10999999999999999 (OutsideTolerance); buried layer face (layer 2 of 3, SAM internal face); SAM 'FIX_EPS', native 'SAM_OpaqueMaterial_FIX_EPS_120mm_23500162' + ... 93 more in report.json diff --git a/documentation/S09-OpenStudio-InputReadBack-evidence/acceptance-2026-10-23/negatives/neg-window-multiplier/report-approved.txt b/documentation/S09-OpenStudio-InputReadBack-evidence/acceptance-2026-10-23/negatives/neg-window-multiplier/report-approved.txt new file mode 100644 index 0000000..61d8ef1 --- /dev/null +++ b/documentation/S09-OpenStudio-InputReadBack-evidence/acceptance-2026-10-23/negatives/neg-window-multiplier/report-approved.txt @@ -0,0 +1,21 @@ +S09 OpenStudio read-back: s08-fix-box -> Fail (exit 10); rule set Approved; gate Pass; coverage Complete (319 required, 319 results); gated non-PASS 0; out-of-engine-scope 105 (informational, not gated) +outcomes: AcceptedTransformation 4, Match 183, NotApplicable 1, OutOfEngineScope 105, WithinTolerance 26 +D-F2 space:5080c000-0000-0000-0000-00000000c001: V2 +CONSISTENCY FAIL: multiplicity: IDF FenestrationSurface:Detailed 'SAM_SubSurface_FIX_WIN_UNFRAMED_0_6adea09c' Multiplier 2: EnergyPlus multiplies its area (frame and divider included); SAM states one aperture and no multiplier +CONSISTENCY FAIL: multiplicity: subsurface 'SAM_SubSurface_FIX_WIN_UNFRAMED_0_6adea09c' Multiplier 1 in the OSM, 2 in the IDF +CONSISTENCY FAIL: multiplicity: IDF FenestrationSurface:Detailed 'SAM_SubSurface_FIX_WIN_FRAMED_0_95717805' Multiplier 2: EnergyPlus multiplies its area (frame and divider included); SAM states one aperture and no multiplier +CONSISTENCY FAIL: multiplicity: subsurface 'SAM_SubSurface_FIX_WIN_FRAMED_0_95717805' Multiplier 1 in the OSM, 2 in the IDF +OUT-OF-ENGINE-SCOPE (informational, not gated; S07 §5.2 amendment U1 (SAM#218 b06dbe8c)): 105 row(s), 69 differing, 36 equal; by scope: buried layer face 102, ground surface outer face 3; by property: externalEmissivity 18, externalLightReflectance 18, externalSolarReflectance 18, internalEmissivity 17, internalLightReflectance 17, internalSolarReflectance 17 + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.externalSolarReflectance: SAM 0.31, native 0.31000000000000005, |d| 5.551115123125783E-17 (WithinTolerance); ground surface outer face; SAM 'FIX_Concrete', native 'SAM_OpaqueMaterial_FIX_Concrete_150mm_9d3a3ab2' + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.internalSolarReflectance: SAM 0.29, native 0.31000000000000005, |d| 0.020000000000000073 (OutsideTolerance); buried layer face (layer 1 of 3, SAM internal face); SAM 'FIX_Concrete', native 'SAM_OpaqueMaterial_FIX_Concrete_150mm_9d3a3ab2' + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.externalLightReflectance: SAM 0.32, native 0.31999999999999995, |d| 5.551115123125783E-17 (WithinTolerance); ground surface outer face; SAM 'FIX_Concrete', native 'SAM_OpaqueMaterial_FIX_Concrete_150mm_9d3a3ab2' + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.internalLightReflectance: SAM 0.3, native 0.31999999999999995, |d| 0.019999999999999962 (OutsideTolerance); buried layer face (layer 1 of 3, SAM internal face); SAM 'FIX_Concrete', native 'SAM_OpaqueMaterial_FIX_Concrete_150mm_9d3a3ab2' + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.externalEmissivity: SAM 0.95, native 0.95, |d| 0 (Identical); ground surface outer face; SAM 'FIX_Concrete', native 'SAM_OpaqueMaterial_FIX_Concrete_150mm_9d3a3ab2' + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.internalEmissivity: SAM 0.87, native 0.95, |d| 0.07999999999999996 (OutsideTolerance); buried layer face (layer 1 of 3, SAM internal face); SAM 'FIX_Concrete', native 'SAM_OpaqueMaterial_FIX_Concrete_150mm_9d3a3ab2' + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.externalSolarReflectance: SAM 0.58, native 0.5800000000000001, |d| 1.1102230246251565E-16 (WithinTolerance); buried layer face (layer 2 of 3, SAM external face); SAM 'FIX_EPS', native 'SAM_OpaqueMaterial_FIX_EPS_120mm_23500162' + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.internalSolarReflectance: SAM 0.61, native 0.5800000000000001, |d| 0.029999999999999916 (OutsideTolerance); buried layer face (layer 2 of 3, SAM internal face); SAM 'FIX_EPS', native 'SAM_OpaqueMaterial_FIX_EPS_120mm_23500162' + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.externalLightReflectance: SAM 0.59, native 0.5900000000000001, |d| 1.1102230246251565E-16 (WithinTolerance); buried layer face (layer 2 of 3, SAM external face); SAM 'FIX_EPS', native 'SAM_OpaqueMaterial_FIX_EPS_120mm_23500162' + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.internalLightReflectance: SAM 0.63, native 0.5900000000000001, |d| 0.039999999999999925 (OutsideTolerance); buried layer face (layer 2 of 3, SAM internal face); SAM 'FIX_EPS', native 'SAM_OpaqueMaterial_FIX_EPS_120mm_23500162' + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.externalEmissivity: SAM 0.85, native 0.85, |d| 0 (Identical); buried layer face (layer 2 of 3, SAM external face); SAM 'FIX_EPS', native 'SAM_OpaqueMaterial_FIX_EPS_120mm_23500162' + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.internalEmissivity: SAM 0.96, native 0.85, |d| 0.10999999999999999 (OutsideTolerance); buried layer face (layer 2 of 3, SAM internal face); SAM 'FIX_EPS', native 'SAM_OpaqueMaterial_FIX_EPS_120mm_23500162' + ... 93 more in report.json diff --git a/documentation/S09-OpenStudio-InputReadBack-evidence/acceptance-2026-10-23/negatives/neg-zone-multiplier-both/report-approved.txt b/documentation/S09-OpenStudio-InputReadBack-evidence/acceptance-2026-10-23/negatives/neg-zone-multiplier-both/report-approved.txt new file mode 100644 index 0000000..7716ae5 --- /dev/null +++ b/documentation/S09-OpenStudio-InputReadBack-evidence/acceptance-2026-10-23/negatives/neg-zone-multiplier-both/report-approved.txt @@ -0,0 +1,18 @@ +S09 OpenStudio read-back: s08-fix-box -> Fail (exit 10); rule set Approved; gate Pass; coverage Complete (319 required, 319 results); gated non-PASS 0; out-of-engine-scope 105 (informational, not gated) +outcomes: AcceptedTransformation 4, Match 183, NotApplicable 1, OutOfEngineScope 105, WithinTolerance 26 +D-F2 space:5080c000-0000-0000-0000-00000000c001: V2 +CONSISTENCY FAIL: multiplicity: IDF Zone 'SAM_ThermalZone_FixBox_5080c000' Multiplier 2: EnergyPlus multiplies the zone's floor area, loads and internal gains; SAM states one space and no multiplier +OUT-OF-ENGINE-SCOPE (informational, not gated; S07 §5.2 amendment U1 (SAM#218 b06dbe8c)): 105 row(s), 69 differing, 36 equal; by scope: buried layer face 102, ground surface outer face 3; by property: externalEmissivity 18, externalLightReflectance 18, externalSolarReflectance 18, internalEmissivity 17, internalLightReflectance 17, internalSolarReflectance 17 + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.externalSolarReflectance: SAM 0.31, native 0.31000000000000005, |d| 5.551115123125783E-17 (WithinTolerance); ground surface outer face; SAM 'FIX_Concrete', native 'SAM_OpaqueMaterial_FIX_Concrete_150mm_9d3a3ab2' + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.internalSolarReflectance: SAM 0.29, native 0.31000000000000005, |d| 0.020000000000000073 (OutsideTolerance); buried layer face (layer 1 of 3, SAM internal face); SAM 'FIX_Concrete', native 'SAM_OpaqueMaterial_FIX_Concrete_150mm_9d3a3ab2' + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.externalLightReflectance: SAM 0.32, native 0.31999999999999995, |d| 5.551115123125783E-17 (WithinTolerance); ground surface outer face; SAM 'FIX_Concrete', native 'SAM_OpaqueMaterial_FIX_Concrete_150mm_9d3a3ab2' + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.internalLightReflectance: SAM 0.3, native 0.31999999999999995, |d| 0.019999999999999962 (OutsideTolerance); buried layer face (layer 1 of 3, SAM internal face); SAM 'FIX_Concrete', native 'SAM_OpaqueMaterial_FIX_Concrete_150mm_9d3a3ab2' + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.externalEmissivity: SAM 0.95, native 0.95, |d| 0 (Identical); ground surface outer face; SAM 'FIX_Concrete', native 'SAM_OpaqueMaterial_FIX_Concrete_150mm_9d3a3ab2' + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.internalEmissivity: SAM 0.87, native 0.95, |d| 0.07999999999999996 (OutsideTolerance); buried layer face (layer 1 of 3, SAM internal face); SAM 'FIX_Concrete', native 'SAM_OpaqueMaterial_FIX_Concrete_150mm_9d3a3ab2' + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.externalSolarReflectance: SAM 0.58, native 0.5800000000000001, |d| 1.1102230246251565E-16 (WithinTolerance); buried layer face (layer 2 of 3, SAM external face); SAM 'FIX_EPS', native 'SAM_OpaqueMaterial_FIX_EPS_120mm_23500162' + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.internalSolarReflectance: SAM 0.61, native 0.5800000000000001, |d| 0.029999999999999916 (OutsideTolerance); buried layer face (layer 2 of 3, SAM internal face); SAM 'FIX_EPS', native 'SAM_OpaqueMaterial_FIX_EPS_120mm_23500162' + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.externalLightReflectance: SAM 0.59, native 0.5900000000000001, |d| 1.1102230246251565E-16 (WithinTolerance); buried layer face (layer 2 of 3, SAM external face); SAM 'FIX_EPS', native 'SAM_OpaqueMaterial_FIX_EPS_120mm_23500162' + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.internalLightReflectance: SAM 0.63, native 0.5900000000000001, |d| 0.039999999999999925 (OutsideTolerance); buried layer face (layer 2 of 3, SAM internal face); SAM 'FIX_EPS', native 'SAM_OpaqueMaterial_FIX_EPS_120mm_23500162' + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.externalEmissivity: SAM 0.85, native 0.85, |d| 0 (Identical); buried layer face (layer 2 of 3, SAM external face); SAM 'FIX_EPS', native 'SAM_OpaqueMaterial_FIX_EPS_120mm_23500162' + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.internalEmissivity: SAM 0.96, native 0.85, |d| 0.10999999999999999 (OutsideTolerance); buried layer face (layer 2 of 3, SAM internal face); SAM 'FIX_EPS', native 'SAM_OpaqueMaterial_FIX_EPS_120mm_23500162' + ... 93 more in report.json diff --git a/documentation/S09-OpenStudio-InputReadBack-evidence/acceptance-2026-10-23/negatives/neg-zone-multiplier/report-approved.txt b/documentation/S09-OpenStudio-InputReadBack-evidence/acceptance-2026-10-23/negatives/neg-zone-multiplier/report-approved.txt new file mode 100644 index 0000000..ae53175 --- /dev/null +++ b/documentation/S09-OpenStudio-InputReadBack-evidence/acceptance-2026-10-23/negatives/neg-zone-multiplier/report-approved.txt @@ -0,0 +1,19 @@ +S09 OpenStudio read-back: s08-fix-box -> Fail (exit 10); rule set Approved; gate Pass; coverage Complete (319 required, 319 results); gated non-PASS 0; out-of-engine-scope 105 (informational, not gated) +outcomes: AcceptedTransformation 4, Match 183, NotApplicable 1, OutOfEngineScope 105, WithinTolerance 26 +D-F2 space:5080c000-0000-0000-0000-00000000c001: V2 +CONSISTENCY FAIL: multiplicity: IDF Zone 'SAM_ThermalZone_FixBox_5080c000' Multiplier 2: EnergyPlus multiplies the zone's floor area, loads and internal gains; SAM states one space and no multiplier +CONSISTENCY FAIL: multiplicity: zone 'SAM_ThermalZone_FixBox_5080c000' Multiplier 1 in the OSM, 2 in the IDF +OUT-OF-ENGINE-SCOPE (informational, not gated; S07 §5.2 amendment U1 (SAM#218 b06dbe8c)): 105 row(s), 69 differing, 36 equal; by scope: buried layer face 102, ground surface outer face 3; by property: externalEmissivity 18, externalLightReflectance 18, externalSolarReflectance 18, internalEmissivity 17, internalLightReflectance 17, internalSolarReflectance 17 + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.externalSolarReflectance: SAM 0.31, native 0.31000000000000005, |d| 5.551115123125783E-17 (WithinTolerance); ground surface outer face; SAM 'FIX_Concrete', native 'SAM_OpaqueMaterial_FIX_Concrete_150mm_9d3a3ab2' + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.internalSolarReflectance: SAM 0.29, native 0.31000000000000005, |d| 0.020000000000000073 (OutsideTolerance); buried layer face (layer 1 of 3, SAM internal face); SAM 'FIX_Concrete', native 'SAM_OpaqueMaterial_FIX_Concrete_150mm_9d3a3ab2' + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.externalLightReflectance: SAM 0.32, native 0.31999999999999995, |d| 5.551115123125783E-17 (WithinTolerance); ground surface outer face; SAM 'FIX_Concrete', native 'SAM_OpaqueMaterial_FIX_Concrete_150mm_9d3a3ab2' + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.internalLightReflectance: SAM 0.3, native 0.31999999999999995, |d| 0.019999999999999962 (OutsideTolerance); buried layer face (layer 1 of 3, SAM internal face); SAM 'FIX_Concrete', native 'SAM_OpaqueMaterial_FIX_Concrete_150mm_9d3a3ab2' + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.externalEmissivity: SAM 0.95, native 0.95, |d| 0 (Identical); ground surface outer face; SAM 'FIX_Concrete', native 'SAM_OpaqueMaterial_FIX_Concrete_150mm_9d3a3ab2' + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.internalEmissivity: SAM 0.87, native 0.95, |d| 0.07999999999999996 (OutsideTolerance); buried layer face (layer 1 of 3, SAM internal face); SAM 'FIX_Concrete', native 'SAM_OpaqueMaterial_FIX_Concrete_150mm_9d3a3ab2' + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.externalSolarReflectance: SAM 0.58, native 0.5800000000000001, |d| 1.1102230246251565E-16 (WithinTolerance); buried layer face (layer 2 of 3, SAM external face); SAM 'FIX_EPS', native 'SAM_OpaqueMaterial_FIX_EPS_120mm_23500162' + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.internalSolarReflectance: SAM 0.61, native 0.5800000000000001, |d| 0.029999999999999916 (OutsideTolerance); buried layer face (layer 2 of 3, SAM internal face); SAM 'FIX_EPS', native 'SAM_OpaqueMaterial_FIX_EPS_120mm_23500162' + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.externalLightReflectance: SAM 0.59, native 0.5900000000000001, |d| 1.1102230246251565E-16 (WithinTolerance); buried layer face (layer 2 of 3, SAM external face); SAM 'FIX_EPS', native 'SAM_OpaqueMaterial_FIX_EPS_120mm_23500162' + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.internalLightReflectance: SAM 0.63, native 0.5900000000000001, |d| 0.039999999999999925 (OutsideTolerance); buried layer face (layer 2 of 3, SAM internal face); SAM 'FIX_EPS', native 'SAM_OpaqueMaterial_FIX_EPS_120mm_23500162' + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.externalEmissivity: SAM 0.85, native 0.85, |d| 0 (Identical); buried layer face (layer 2 of 3, SAM external face); SAM 'FIX_EPS', native 'SAM_OpaqueMaterial_FIX_EPS_120mm_23500162' + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.internalEmissivity: SAM 0.96, native 0.85, |d| 0.10999999999999999 (OutsideTolerance); buried layer face (layer 2 of 3, SAM internal face); SAM 'FIX_EPS', native 'SAM_OpaqueMaterial_FIX_EPS_120mm_23500162' + ... 93 more in report.json diff --git a/documentation/S09-OpenStudio-InputReadBack-evidence/acceptance-2026-10-23/runs/box-repeat/export.json b/documentation/S09-OpenStudio-InputReadBack-evidence/acceptance-2026-10-23/runs/box-repeat/export.json new file mode 100644 index 0000000..db2f5d0 --- /dev/null +++ b/documentation/S09-OpenStudio-InputReadBack-evidence/acceptance-2026-10-23/runs/box-repeat/export.json @@ -0,0 +1,37 @@ +{ + "Schema": "s09-export/2", + "Label": "box-repeat", + "Mutation": null, + "SourceModelPath": "/s08-fix-box.json", + "SourceEpwPath": "/budapest.epw", + "ModelSha256": "45524172b32f85df89511dd344141023de999faa9552a199e6b49062612acd08", + "EpwSha256": "472ffb4e2f10867600949a392ce46891fc1bd05f2fc8d8917a99bca7d26209c3", + "OsmSha256": "49cf3342ac161d0fb0e75c852103a50ba713e0be6b58195a076e08500279eb03", + "IdfSha256": "46a6ce6fccc6faf13c4f167cc11c483a64caf47a578490984faa4b942d726baa", + "OpenStudioSdkVersion": "3.10.0\u002B86d7e215a1", + "WriterAssembly": "/SAM.Analytical.OpenStudio.dll", + "WriterAssemblySha256": "67a2ded78a22c9b83f5b536dc7b202314a686fe8c7718119afb676714a84e798", + "ProcessId": 48004, + "ProcessStartedUtc": "2026-10-23T11:27:12.4785361Z", + "StartedUtc": "2026-10-23T11:27:12.5908592Z", + "FinishedUtc": "2026-10-23T11:27:16.0020536Z", + "ConversionValid": true, + "Diagnostics": [ + "Information SAM-OS-IC-002 Lighting radiant proportion p = 0.37 (authored) is split under S07 \u00A75.1 T-LIGHT-SPLIT: Fraction Radiant = p\u00B7(1 \u2212 s) = 0.21487, Fraction Visible = p\u00B7s = 0.15513, Return Air Fraction 0, convective 1 \u2212 p = 0.63; s = 0.2415 / 0.576 = 0.4192708 (short-wave share of the radiant output). s is a declared assumption, not SAM data. Reference category: suspended (pendant) LED office lighting with the entire fitting in the conditioned room; a midpoint-derived reference from cited historical ranges (IEA SHC Task 61 / EBC Annex 77 D1, Table 6; ASHRAE Fundamentals 2017, Ch. 18, Table 3), not manufacturer-certified. Not applicable to recessed troffers, downlights, retrofit kits, high-bays or non-LED lamps.", + "Information SAM-OS-MAT-002 Vapour diffusion factor (110) is not converted \u2014 EnergyPlus moisture modelling (HAMT/EMPD) needs data SAM does not carry", + "Information SAM-OS-MAT-002 Vapour diffusion factor (40) is not converted \u2014 EnergyPlus moisture modelling (HAMT/EMPD) needs data SAM does not carry", + "Information SAM-OS-MAT-002 Vapour diffusion factor (15) is not converted \u2014 EnergyPlus moisture modelling (HAMT/EMPD) needs data SAM does not carry", + "Information SAM-OS-MAT-002 Vapour diffusion factor (5E\u002B04) is not converted \u2014 EnergyPlus moisture modelling (HAMT/EMPD) needs data SAM does not carry", + "Information SAM-OS-MAT-002 Vapour diffusion factor (165) is not converted \u2014 EnergyPlus moisture modelling (HAMT/EMPD) needs data SAM does not carry", + "Information SAM-OS-MAT-002 Vapour diffusion factor (60) is not converted \u2014 EnergyPlus moisture modelling (HAMT/EMPD) needs data SAM does not carry", + "Information SAM-OS-MAT-002 Vapour diffusion factor (8) is not converted \u2014 EnergyPlus moisture modelling (HAMT/EMPD) needs data SAM does not carry", + "Information SAM-OS-MAT-002 Vapour diffusion factor (25) is not converted \u2014 EnergyPlus moisture modelling (HAMT/EMPD) needs data SAM does not carry", + "Information SAM-OS-MAT-002 Vapour diffusion factor (10) is not converted \u2014 EnergyPlus moisture modelling (HAMT/EMPD) needs data SAM does not carry", + "Information SAM-OS-MAT-002 Vapour diffusion factor (1.2) is not converted \u2014 EnergyPlus moisture modelling (HAMT/EMPD) needs data SAM does not carry", + "Information SAM-OS-MAT-002 Vapour diffusion factor (1E\u002B05) is not converted \u2014 EnergyPlus moisture modelling (HAMT/EMPD) needs data SAM does not carry", + "Information SAM-OS-RUN-002 Annual weather source: explicit EPW (weather.epw)", + "Information SAM-OS-RUN-002 Ground temperatures taken from the EPW GROUND TEMPERATURES header (depth 0.5 m set, 12 monthly values)", + "Information SAM-OS-RUN-002 No design-day source supplied; sizing-period runs stay disabled unless OpenStudioConversionOptions.RunSizingPeriods overrides" + ], + "TranslatorMessages": [] +} \ No newline at end of file diff --git a/documentation/S09-OpenStudio-InputReadBack-evidence/acceptance-2026-10-23/runs/box-repeat/report-approved.json b/documentation/S09-OpenStudio-InputReadBack-evidence/acceptance-2026-10-23/runs/box-repeat/report-approved.json new file mode 100644 index 0000000..78f00a7 --- /dev/null +++ b/documentation/S09-OpenStudio-InputReadBack-evidence/acceptance-2026-10-23/runs/box-repeat/report-approved.json @@ -0,0 +1,2077 @@ +{ + "Schema": "s09-readback-report/3", + "FixtureId": "s08-fix-box", + "RuleSet": "Approved", + "Status": "Pass", + "ExitCode": 0, + "GateStatus": "Pass", + "Coverage": "Complete", + "Required": 319, + "Results": 319, + "MissingComparisons": [], + "CountByOutcome": { + "AcceptedTransformation": 4, + "Match": 183, + "NotApplicable": 1, + "OutOfEngineScope": 105, + "WithinTolerance": 26 + }, + "NonPass": [], + "GatedNonPass": 0, + "OutOfEngineScope": { + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)", + "Count": 105, + "Differing": 69, + "Equal": 36, + "CountByScope": { + "buried layer face": 102, + "ground surface outer face": 3 + }, + "CountByProperty": { + "externalEmissivity": 18, + "externalLightReflectance": 18, + "externalSolarReflectance": 18, + "internalEmissivity": 17, + "internalLightReflectance": 17, + "internalSolarReflectance": 17 + }, + "Rows": [ + { + "Quantity": "3a", + "Key": "panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.externalSolarReflectance", + "Side": "panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001", + "Layer": 1, + "LayerCount": 3, + "Property": "externalSolarReflectance", + "SamFace": "external", + "SamMaterial": "FIX_Concrete", + "NativeObject": "SAM_OpaqueMaterial_FIX_Concrete_150mm_9d3a3ab2", + "SamValue": 0.31, + "NativeValue": 0.31000000000000005, + "Delta": 5.551115123125783E-17, + "NumericVerdict": "WithinTolerance", + "Differs": false, + "ScopeReason": "ground surface outer face", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.internalSolarReflectance", + "Side": "panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001", + "Layer": 1, + "LayerCount": 3, + "Property": "internalSolarReflectance", + "SamFace": "internal", + "SamMaterial": "FIX_Concrete", + "NativeObject": "SAM_OpaqueMaterial_FIX_Concrete_150mm_9d3a3ab2", + "SamValue": 0.29, + "NativeValue": 0.31000000000000005, + "Delta": 0.020000000000000073, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 1 of 3, SAM internal face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.externalLightReflectance", + "Side": "panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001", + "Layer": 1, + "LayerCount": 3, + "Property": "externalLightReflectance", + "SamFace": "external", + "SamMaterial": "FIX_Concrete", + "NativeObject": "SAM_OpaqueMaterial_FIX_Concrete_150mm_9d3a3ab2", + "SamValue": 0.32, + "NativeValue": 0.31999999999999995, + "Delta": 5.551115123125783E-17, + "NumericVerdict": "WithinTolerance", + "Differs": false, + "ScopeReason": "ground surface outer face", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.internalLightReflectance", + "Side": "panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001", + "Layer": 1, + "LayerCount": 3, + "Property": "internalLightReflectance", + "SamFace": "internal", + "SamMaterial": "FIX_Concrete", + "NativeObject": "SAM_OpaqueMaterial_FIX_Concrete_150mm_9d3a3ab2", + "SamValue": 0.3, + "NativeValue": 0.31999999999999995, + "Delta": 0.019999999999999962, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 1 of 3, SAM internal face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.externalEmissivity", + "Side": "panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001", + "Layer": 1, + "LayerCount": 3, + "Property": "externalEmissivity", + "SamFace": "external", + "SamMaterial": "FIX_Concrete", + "NativeObject": "SAM_OpaqueMaterial_FIX_Concrete_150mm_9d3a3ab2", + "SamValue": 0.95, + "NativeValue": 0.95, + "Delta": 0, + "NumericVerdict": "Identical", + "Differs": false, + "ScopeReason": "ground surface outer face", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.internalEmissivity", + "Side": "panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001", + "Layer": 1, + "LayerCount": 3, + "Property": "internalEmissivity", + "SamFace": "internal", + "SamMaterial": "FIX_Concrete", + "NativeObject": "SAM_OpaqueMaterial_FIX_Concrete_150mm_9d3a3ab2", + "SamValue": 0.87, + "NativeValue": 0.95, + "Delta": 0.07999999999999996, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 1 of 3, SAM internal face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.externalSolarReflectance", + "Side": "panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001", + "Layer": 2, + "LayerCount": 3, + "Property": "externalSolarReflectance", + "SamFace": "external", + "SamMaterial": "FIX_EPS", + "NativeObject": "SAM_OpaqueMaterial_FIX_EPS_120mm_23500162", + "SamValue": 0.58, + "NativeValue": 0.5800000000000001, + "Delta": 1.1102230246251565E-16, + "NumericVerdict": "WithinTolerance", + "Differs": false, + "ScopeReason": "buried layer face (layer 2 of 3, SAM external face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.internalSolarReflectance", + "Side": "panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001", + "Layer": 2, + "LayerCount": 3, + "Property": "internalSolarReflectance", + "SamFace": "internal", + "SamMaterial": "FIX_EPS", + "NativeObject": "SAM_OpaqueMaterial_FIX_EPS_120mm_23500162", + "SamValue": 0.61, + "NativeValue": 0.5800000000000001, + "Delta": 0.029999999999999916, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 2 of 3, SAM internal face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.externalLightReflectance", + "Side": "panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001", + "Layer": 2, + "LayerCount": 3, + "Property": "externalLightReflectance", + "SamFace": "external", + "SamMaterial": "FIX_EPS", + "NativeObject": "SAM_OpaqueMaterial_FIX_EPS_120mm_23500162", + "SamValue": 0.59, + "NativeValue": 0.5900000000000001, + "Delta": 1.1102230246251565E-16, + "NumericVerdict": "WithinTolerance", + "Differs": false, + "ScopeReason": "buried layer face (layer 2 of 3, SAM external face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.internalLightReflectance", + "Side": "panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001", + "Layer": 2, + "LayerCount": 3, + "Property": "internalLightReflectance", + "SamFace": "internal", + "SamMaterial": "FIX_EPS", + "NativeObject": "SAM_OpaqueMaterial_FIX_EPS_120mm_23500162", + "SamValue": 0.63, + "NativeValue": 0.5900000000000001, + "Delta": 0.039999999999999925, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 2 of 3, SAM internal face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.externalEmissivity", + "Side": "panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001", + "Layer": 2, + "LayerCount": 3, + "Property": "externalEmissivity", + "SamFace": "external", + "SamMaterial": "FIX_EPS", + "NativeObject": "SAM_OpaqueMaterial_FIX_EPS_120mm_23500162", + "SamValue": 0.85, + "NativeValue": 0.85, + "Delta": 0, + "NumericVerdict": "Identical", + "Differs": false, + "ScopeReason": "buried layer face (layer 2 of 3, SAM external face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.internalEmissivity", + "Side": "panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001", + "Layer": 2, + "LayerCount": 3, + "Property": "internalEmissivity", + "SamFace": "internal", + "SamMaterial": "FIX_EPS", + "NativeObject": "SAM_OpaqueMaterial_FIX_EPS_120mm_23500162", + "SamValue": 0.96, + "NativeValue": 0.85, + "Delta": 0.10999999999999999, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 2 of 3, SAM internal face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer3.externalSolarReflectance", + "Side": "panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001", + "Layer": 3, + "LayerCount": 3, + "Property": "externalSolarReflectance", + "SamFace": "external", + "SamMaterial": "FIX_Screed", + "NativeObject": "SAM_OpaqueMaterial_FIX_Screed_65mm_Internal_47d4de1a", + "SamValue": 0.27, + "NativeValue": 0.32999999999999996, + "Delta": 0.05999999999999994, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 3 of 3, SAM external face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer3.externalLightReflectance", + "Side": "panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001", + "Layer": 3, + "LayerCount": 3, + "Property": "externalLightReflectance", + "SamFace": "external", + "SamMaterial": "FIX_Screed", + "NativeObject": "SAM_OpaqueMaterial_FIX_Screed_65mm_Internal_47d4de1a", + "SamValue": 0.28, + "NativeValue": 0.33999999999999997, + "Delta": 0.05999999999999994, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 3 of 3, SAM external face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer3.externalEmissivity", + "Side": "panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001", + "Layer": 3, + "LayerCount": 3, + "Property": "externalEmissivity", + "SamFace": "external", + "SamMaterial": "FIX_Screed", + "NativeObject": "SAM_OpaqueMaterial_FIX_Screed_65mm_Internal_47d4de1a", + "SamValue": 0.94, + "NativeValue": 0.9, + "Delta": 0.039999999999999925, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 3 of 3, SAM external face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:285a1884-d494-47a6-9541-942946ea00a7@space:5080c000-0000-0000-0000-00000000c001#layer1.internalSolarReflectance", + "Side": "panel:285a1884-d494-47a6-9541-942946ea00a7@space:5080c000-0000-0000-0000-00000000c001", + "Layer": 1, + "LayerCount": 4, + "Property": "internalSolarReflectance", + "SamFace": "internal", + "SamMaterial": "FIX_Membrane", + "NativeObject": "SAM_OpaqueMaterial_FIX_Membrane_4mm_379ce52b", + "SamValue": 0.24, + "NativeValue": 0.14, + "Delta": 0.09999999999999998, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 1 of 4, SAM internal face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:285a1884-d494-47a6-9541-942946ea00a7@space:5080c000-0000-0000-0000-00000000c001#layer1.internalLightReflectance", + "Side": "panel:285a1884-d494-47a6-9541-942946ea00a7@space:5080c000-0000-0000-0000-00000000c001", + "Layer": 1, + "LayerCount": 4, + "Property": "internalLightReflectance", + "SamFace": "internal", + "SamMaterial": "FIX_Membrane", + "NativeObject": "SAM_OpaqueMaterial_FIX_Membrane_4mm_379ce52b", + "SamValue": 0.25, + "NativeValue": 0.15000000000000002, + "Delta": 0.09999999999999998, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 1 of 4, SAM internal face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:285a1884-d494-47a6-9541-942946ea00a7@space:5080c000-0000-0000-0000-00000000c001#layer1.internalEmissivity", + "Side": "panel:285a1884-d494-47a6-9541-942946ea00a7@space:5080c000-0000-0000-0000-00000000c001", + "Layer": 1, + "LayerCount": 4, + "Property": "internalEmissivity", + "SamFace": "internal", + "SamMaterial": "FIX_Membrane", + "NativeObject": "SAM_OpaqueMaterial_FIX_Membrane_4mm_379ce52b", + "SamValue": 0.86, + "NativeValue": 0.92, + "Delta": 0.06000000000000005, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 1 of 4, SAM internal face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:285a1884-d494-47a6-9541-942946ea00a7@space:5080c000-0000-0000-0000-00000000c001#layer2.externalSolarReflectance", + "Side": "panel:285a1884-d494-47a6-9541-942946ea00a7@space:5080c000-0000-0000-0000-00000000c001", + "Layer": 2, + "LayerCount": 4, + "Property": "externalSolarReflectance", + "SamFace": "external", + "SamMaterial": "FIX_OSB", + "NativeObject": "SAM_OpaqueMaterial_FIX_OSB_18mm_b65fc732", + "SamValue": 0.43, + "NativeValue": 0.43000000000000005, + "Delta": 5.551115123125783E-17, + "NumericVerdict": "WithinTolerance", + "Differs": false, + "ScopeReason": "buried layer face (layer 2 of 4, SAM external face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:285a1884-d494-47a6-9541-942946ea00a7@space:5080c000-0000-0000-0000-00000000c001#layer2.internalSolarReflectance", + "Side": "panel:285a1884-d494-47a6-9541-942946ea00a7@space:5080c000-0000-0000-0000-00000000c001", + "Layer": 2, + "LayerCount": 4, + "Property": "internalSolarReflectance", + "SamFace": "internal", + "SamMaterial": "FIX_OSB", + "NativeObject": "SAM_OpaqueMaterial_FIX_OSB_18mm_b65fc732", + "SamValue": 0.47, + "NativeValue": 0.43000000000000005, + "Delta": 0.039999999999999925, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 2 of 4, SAM internal face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:285a1884-d494-47a6-9541-942946ea00a7@space:5080c000-0000-0000-0000-00000000c001#layer2.externalLightReflectance", + "Side": "panel:285a1884-d494-47a6-9541-942946ea00a7@space:5080c000-0000-0000-0000-00000000c001", + "Layer": 2, + "LayerCount": 4, + "Property": "externalLightReflectance", + "SamFace": "external", + "SamMaterial": "FIX_OSB", + "NativeObject": "SAM_OpaqueMaterial_FIX_OSB_18mm_b65fc732", + "SamValue": 0.42, + "NativeValue": 0.42000000000000004, + "Delta": 5.551115123125783E-17, + "NumericVerdict": "WithinTolerance", + "Differs": false, + "ScopeReason": "buried layer face (layer 2 of 4, SAM external face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:285a1884-d494-47a6-9541-942946ea00a7@space:5080c000-0000-0000-0000-00000000c001#layer2.internalLightReflectance", + "Side": "panel:285a1884-d494-47a6-9541-942946ea00a7@space:5080c000-0000-0000-0000-00000000c001", + "Layer": 2, + "LayerCount": 4, + "Property": "internalLightReflectance", + "SamFace": "internal", + "SamMaterial": "FIX_OSB", + "NativeObject": "SAM_OpaqueMaterial_FIX_OSB_18mm_b65fc732", + "SamValue": 0.48, + "NativeValue": 0.42000000000000004, + "Delta": 0.05999999999999994, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 2 of 4, SAM internal face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:285a1884-d494-47a6-9541-942946ea00a7@space:5080c000-0000-0000-0000-00000000c001#layer2.externalEmissivity", + "Side": "panel:285a1884-d494-47a6-9541-942946ea00a7@space:5080c000-0000-0000-0000-00000000c001", + "Layer": 2, + "LayerCount": 4, + "Property": "externalEmissivity", + "SamFace": "external", + "SamMaterial": "FIX_OSB", + "NativeObject": "SAM_OpaqueMaterial_FIX_OSB_18mm_b65fc732", + "SamValue": 0.91, + "NativeValue": 0.91, + "Delta": 0, + "NumericVerdict": "Identical", + "Differs": false, + "ScopeReason": "buried layer face (layer 2 of 4, SAM external face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:285a1884-d494-47a6-9541-942946ea00a7@space:5080c000-0000-0000-0000-00000000c001#layer2.internalEmissivity", + "Side": "panel:285a1884-d494-47a6-9541-942946ea00a7@space:5080c000-0000-0000-0000-00000000c001", + "Layer": 2, + "LayerCount": 4, + "Property": "internalEmissivity", + "SamFace": "internal", + "SamMaterial": "FIX_OSB", + "NativeObject": "SAM_OpaqueMaterial_FIX_OSB_18mm_b65fc732", + "SamValue": 0.89, + "NativeValue": 0.91, + "Delta": 0.020000000000000018, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 2 of 4, SAM internal face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:285a1884-d494-47a6-9541-942946ea00a7@space:5080c000-0000-0000-0000-00000000c001#layer3.externalSolarReflectance", + "Side": "panel:285a1884-d494-47a6-9541-942946ea00a7@space:5080c000-0000-0000-0000-00000000c001", + "Layer": 3, + "LayerCount": 4, + "Property": "externalSolarReflectance", + "SamFace": "external", + "SamMaterial": "FIX_PIR", + "NativeObject": "SAM_OpaqueMaterial_FIX_PIR_160mm_afdb47df", + "SamValue": 0.53, + "NativeValue": 0.53, + "Delta": 0, + "NumericVerdict": "Identical", + "Differs": false, + "ScopeReason": "buried layer face (layer 3 of 4, SAM external face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:285a1884-d494-47a6-9541-942946ea00a7@space:5080c000-0000-0000-0000-00000000c001#layer3.internalSolarReflectance", + "Side": "panel:285a1884-d494-47a6-9541-942946ea00a7@space:5080c000-0000-0000-0000-00000000c001", + "Layer": 3, + "LayerCount": 4, + "Property": "internalSolarReflectance", + "SamFace": "internal", + "SamMaterial": "FIX_PIR", + "NativeObject": "SAM_OpaqueMaterial_FIX_PIR_160mm_afdb47df", + "SamValue": 0.55, + "NativeValue": 0.53, + "Delta": 0.020000000000000018, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 3 of 4, SAM internal face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:285a1884-d494-47a6-9541-942946ea00a7@space:5080c000-0000-0000-0000-00000000c001#layer3.externalLightReflectance", + "Side": "panel:285a1884-d494-47a6-9541-942946ea00a7@space:5080c000-0000-0000-0000-00000000c001", + "Layer": 3, + "LayerCount": 4, + "Property": "externalLightReflectance", + "SamFace": "external", + "SamMaterial": "FIX_PIR", + "NativeObject": "SAM_OpaqueMaterial_FIX_PIR_160mm_afdb47df", + "SamValue": 0.54, + "NativeValue": 0.54, + "Delta": 0, + "NumericVerdict": "Identical", + "Differs": false, + "ScopeReason": "buried layer face (layer 3 of 4, SAM external face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:285a1884-d494-47a6-9541-942946ea00a7@space:5080c000-0000-0000-0000-00000000c001#layer3.internalLightReflectance", + "Side": "panel:285a1884-d494-47a6-9541-942946ea00a7@space:5080c000-0000-0000-0000-00000000c001", + "Layer": 3, + "LayerCount": 4, + "Property": "internalLightReflectance", + "SamFace": "internal", + "SamMaterial": "FIX_PIR", + "NativeObject": "SAM_OpaqueMaterial_FIX_PIR_160mm_afdb47df", + "SamValue": 0.56, + "NativeValue": 0.54, + "Delta": 0.020000000000000018, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 3 of 4, SAM internal face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:285a1884-d494-47a6-9541-942946ea00a7@space:5080c000-0000-0000-0000-00000000c001#layer3.externalEmissivity", + "Side": "panel:285a1884-d494-47a6-9541-942946ea00a7@space:5080c000-0000-0000-0000-00000000c001", + "Layer": 3, + "LayerCount": 4, + "Property": "externalEmissivity", + "SamFace": "external", + "SamMaterial": "FIX_PIR", + "NativeObject": "SAM_OpaqueMaterial_FIX_PIR_160mm_afdb47df", + "SamValue": 0.87, + "NativeValue": 0.87, + "Delta": 0, + "NumericVerdict": "Identical", + "Differs": false, + "ScopeReason": "buried layer face (layer 3 of 4, SAM external face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:285a1884-d494-47a6-9541-942946ea00a7@space:5080c000-0000-0000-0000-00000000c001#layer3.internalEmissivity", + "Side": "panel:285a1884-d494-47a6-9541-942946ea00a7@space:5080c000-0000-0000-0000-00000000c001", + "Layer": 3, + "LayerCount": 4, + "Property": "internalEmissivity", + "SamFace": "internal", + "SamMaterial": "FIX_PIR", + "NativeObject": "SAM_OpaqueMaterial_FIX_PIR_160mm_afdb47df", + "SamValue": 0.95, + "NativeValue": 0.87, + "Delta": 0.07999999999999996, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 3 of 4, SAM internal face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:285a1884-d494-47a6-9541-942946ea00a7@space:5080c000-0000-0000-0000-00000000c001#layer4.externalSolarReflectance", + "Side": "panel:285a1884-d494-47a6-9541-942946ea00a7@space:5080c000-0000-0000-0000-00000000c001", + "Layer": 4, + "LayerCount": 4, + "Property": "externalSolarReflectance", + "SamFace": "external", + "SamMaterial": "FIX_Plasterboard", + "NativeObject": "SAM_OpaqueMaterial_FIX_Plasterboard_15mm_Internal_5abe47a0", + "SamValue": 0.62, + "NativeValue": 0.6799999999999999, + "Delta": 0.05999999999999994, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 4 of 4, SAM external face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:285a1884-d494-47a6-9541-942946ea00a7@space:5080c000-0000-0000-0000-00000000c001#layer4.externalLightReflectance", + "Side": "panel:285a1884-d494-47a6-9541-942946ea00a7@space:5080c000-0000-0000-0000-00000000c001", + "Layer": 4, + "LayerCount": 4, + "Property": "externalLightReflectance", + "SamFace": "external", + "SamMaterial": "FIX_Plasterboard", + "NativeObject": "SAM_OpaqueMaterial_FIX_Plasterboard_15mm_Internal_5abe47a0", + "SamValue": 0.64, + "NativeValue": 0.7, + "Delta": 0.05999999999999994, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 4 of 4, SAM external face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:285a1884-d494-47a6-9541-942946ea00a7@space:5080c000-0000-0000-0000-00000000c001#layer4.externalEmissivity", + "Side": "panel:285a1884-d494-47a6-9541-942946ea00a7@space:5080c000-0000-0000-0000-00000000c001", + "Layer": 4, + "LayerCount": 4, + "Property": "externalEmissivity", + "SamFace": "external", + "SamMaterial": "FIX_Plasterboard", + "NativeObject": "SAM_OpaqueMaterial_FIX_Plasterboard_15mm_Internal_5abe47a0", + "SamValue": 0.9, + "NativeValue": 0.91, + "Delta": 0.010000000000000009, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 4 of 4, SAM external face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:5e4a7125-c77a-4911-9084-7cbfa9b0786c@space:5080c000-0000-0000-0000-00000000c001#layer1.internalSolarReflectance", + "Side": "panel:5e4a7125-c77a-4911-9084-7cbfa9b0786c@space:5080c000-0000-0000-0000-00000000c001", + "Layer": 1, + "LayerCount": 4, + "Property": "internalSolarReflectance", + "SamFace": "internal", + "SamMaterial": "FIX_Render", + "NativeObject": "SAM_OpaqueMaterial_FIX_Render_15mm_f7af24b1", + "SamValue": 0.36, + "NativeValue": 0.5700000000000001, + "Delta": 0.21000000000000008, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 1 of 4, SAM internal face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:5e4a7125-c77a-4911-9084-7cbfa9b0786c@space:5080c000-0000-0000-0000-00000000c001#layer1.internalLightReflectance", + "Side": "panel:5e4a7125-c77a-4911-9084-7cbfa9b0786c@space:5080c000-0000-0000-0000-00000000c001", + "Layer": 1, + "LayerCount": 4, + "Property": "internalLightReflectance", + "SamFace": "internal", + "SamMaterial": "FIX_Render", + "NativeObject": "SAM_OpaqueMaterial_FIX_Render_15mm_f7af24b1", + "SamValue": 0.37, + "NativeValue": 0.5800000000000001, + "Delta": 0.21000000000000008, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 1 of 4, SAM internal face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:5e4a7125-c77a-4911-9084-7cbfa9b0786c@space:5080c000-0000-0000-0000-00000000c001#layer1.internalEmissivity", + "Side": "panel:5e4a7125-c77a-4911-9084-7cbfa9b0786c@space:5080c000-0000-0000-0000-00000000c001", + "Layer": 1, + "LayerCount": 4, + "Property": "internalEmissivity", + "SamFace": "internal", + "SamMaterial": "FIX_Render", + "NativeObject": "SAM_OpaqueMaterial_FIX_Render_15mm_f7af24b1", + "SamValue": 0.93, + "NativeValue": 0.88, + "Delta": 0.050000000000000044, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 1 of 4, SAM internal face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:5e4a7125-c77a-4911-9084-7cbfa9b0786c@space:5080c000-0000-0000-0000-00000000c001#layer2.externalSolarReflectance", + "Side": "panel:5e4a7125-c77a-4911-9084-7cbfa9b0786c@space:5080c000-0000-0000-0000-00000000c001", + "Layer": 2, + "LayerCount": 4, + "Property": "externalSolarReflectance", + "SamFace": "external", + "SamMaterial": "FIX_Blockwork", + "NativeObject": "SAM_OpaqueMaterial_FIX_Blockwork_100mm_6998e0fb", + "SamValue": 0.38, + "NativeValue": 0.38, + "Delta": 0, + "NumericVerdict": "Identical", + "Differs": false, + "ScopeReason": "buried layer face (layer 2 of 4, SAM external face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:5e4a7125-c77a-4911-9084-7cbfa9b0786c@space:5080c000-0000-0000-0000-00000000c001#layer2.internalSolarReflectance", + "Side": "panel:5e4a7125-c77a-4911-9084-7cbfa9b0786c@space:5080c000-0000-0000-0000-00000000c001", + "Layer": 2, + "LayerCount": 4, + "Property": "internalSolarReflectance", + "SamFace": "internal", + "SamMaterial": "FIX_Blockwork", + "NativeObject": "SAM_OpaqueMaterial_FIX_Blockwork_100mm_6998e0fb", + "SamValue": 0.44, + "NativeValue": 0.38, + "Delta": 0.06, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 2 of 4, SAM internal face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:5e4a7125-c77a-4911-9084-7cbfa9b0786c@space:5080c000-0000-0000-0000-00000000c001#layer2.externalLightReflectance", + "Side": "panel:5e4a7125-c77a-4911-9084-7cbfa9b0786c@space:5080c000-0000-0000-0000-00000000c001", + "Layer": 2, + "LayerCount": 4, + "Property": "externalLightReflectance", + "SamFace": "external", + "SamMaterial": "FIX_Blockwork", + "NativeObject": "SAM_OpaqueMaterial_FIX_Blockwork_100mm_6998e0fb", + "SamValue": 0.39, + "NativeValue": 0.39, + "Delta": 0, + "NumericVerdict": "Identical", + "Differs": false, + "ScopeReason": "buried layer face (layer 2 of 4, SAM external face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:5e4a7125-c77a-4911-9084-7cbfa9b0786c@space:5080c000-0000-0000-0000-00000000c001#layer2.internalLightReflectance", + "Side": "panel:5e4a7125-c77a-4911-9084-7cbfa9b0786c@space:5080c000-0000-0000-0000-00000000c001", + "Layer": 2, + "LayerCount": 4, + "Property": "internalLightReflectance", + "SamFace": "internal", + "SamMaterial": "FIX_Blockwork", + "NativeObject": "SAM_OpaqueMaterial_FIX_Blockwork_100mm_6998e0fb", + "SamValue": 0.46, + "NativeValue": 0.39, + "Delta": 0.07, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 2 of 4, SAM internal face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:5e4a7125-c77a-4911-9084-7cbfa9b0786c@space:5080c000-0000-0000-0000-00000000c001#layer2.externalEmissivity", + "Side": "panel:5e4a7125-c77a-4911-9084-7cbfa9b0786c@space:5080c000-0000-0000-0000-00000000c001", + "Layer": 2, + "LayerCount": 4, + "Property": "externalEmissivity", + "SamFace": "external", + "SamMaterial": "FIX_Blockwork", + "NativeObject": "SAM_OpaqueMaterial_FIX_Blockwork_100mm_6998e0fb", + "SamValue": 0.93, + "NativeValue": 0.93, + "Delta": 0, + "NumericVerdict": "Identical", + "Differs": false, + "ScopeReason": "buried layer face (layer 2 of 4, SAM external face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:5e4a7125-c77a-4911-9084-7cbfa9b0786c@space:5080c000-0000-0000-0000-00000000c001#layer2.internalEmissivity", + "Side": "panel:5e4a7125-c77a-4911-9084-7cbfa9b0786c@space:5080c000-0000-0000-0000-00000000c001", + "Layer": 2, + "LayerCount": 4, + "Property": "internalEmissivity", + "SamFace": "internal", + "SamMaterial": "FIX_Blockwork", + "NativeObject": "SAM_OpaqueMaterial_FIX_Blockwork_100mm_6998e0fb", + "SamValue": 0.94, + "NativeValue": 0.93, + "Delta": 0.009999999999999898, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 2 of 4, SAM internal face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:5e4a7125-c77a-4911-9084-7cbfa9b0786c@space:5080c000-0000-0000-0000-00000000c001#layer3.externalSolarReflectance", + "Side": "panel:5e4a7125-c77a-4911-9084-7cbfa9b0786c@space:5080c000-0000-0000-0000-00000000c001", + "Layer": 3, + "LayerCount": 4, + "Property": "externalSolarReflectance", + "SamFace": "external", + "SamMaterial": "FIX_MineralWool", + "NativeObject": "SAM_OpaqueMaterial_FIX_MineralWool_140mm_251d5e01", + "SamValue": 0.48, + "NativeValue": 0.48, + "Delta": 0, + "NumericVerdict": "Identical", + "Differs": false, + "ScopeReason": "buried layer face (layer 3 of 4, SAM external face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:5e4a7125-c77a-4911-9084-7cbfa9b0786c@space:5080c000-0000-0000-0000-00000000c001#layer3.internalSolarReflectance", + "Side": "panel:5e4a7125-c77a-4911-9084-7cbfa9b0786c@space:5080c000-0000-0000-0000-00000000c001", + "Layer": 3, + "LayerCount": 4, + "Property": "internalSolarReflectance", + "SamFace": "internal", + "SamMaterial": "FIX_MineralWool", + "NativeObject": "SAM_OpaqueMaterial_FIX_MineralWool_140mm_251d5e01", + "SamValue": 0.51, + "NativeValue": 0.48, + "Delta": 0.030000000000000027, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 3 of 4, SAM internal face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:5e4a7125-c77a-4911-9084-7cbfa9b0786c@space:5080c000-0000-0000-0000-00000000c001#layer3.externalLightReflectance", + "Side": "panel:5e4a7125-c77a-4911-9084-7cbfa9b0786c@space:5080c000-0000-0000-0000-00000000c001", + "Layer": 3, + "LayerCount": 4, + "Property": "externalLightReflectance", + "SamFace": "external", + "SamMaterial": "FIX_MineralWool", + "NativeObject": "SAM_OpaqueMaterial_FIX_MineralWool_140mm_251d5e01", + "SamValue": 0.49, + "NativeValue": 0.49, + "Delta": 0, + "NumericVerdict": "Identical", + "Differs": false, + "ScopeReason": "buried layer face (layer 3 of 4, SAM external face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:5e4a7125-c77a-4911-9084-7cbfa9b0786c@space:5080c000-0000-0000-0000-00000000c001#layer3.internalLightReflectance", + "Side": "panel:5e4a7125-c77a-4911-9084-7cbfa9b0786c@space:5080c000-0000-0000-0000-00000000c001", + "Layer": 3, + "LayerCount": 4, + "Property": "internalLightReflectance", + "SamFace": "internal", + "SamMaterial": "FIX_MineralWool", + "NativeObject": "SAM_OpaqueMaterial_FIX_MineralWool_140mm_251d5e01", + "SamValue": 0.53, + "NativeValue": 0.49, + "Delta": 0.040000000000000036, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 3 of 4, SAM internal face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:5e4a7125-c77a-4911-9084-7cbfa9b0786c@space:5080c000-0000-0000-0000-00000000c001#layer3.externalEmissivity", + "Side": "panel:5e4a7125-c77a-4911-9084-7cbfa9b0786c@space:5080c000-0000-0000-0000-00000000c001", + "Layer": 3, + "LayerCount": 4, + "Property": "externalEmissivity", + "SamFace": "external", + "SamMaterial": "FIX_MineralWool", + "NativeObject": "SAM_OpaqueMaterial_FIX_MineralWool_140mm_251d5e01", + "SamValue": 0.89, + "NativeValue": 0.89, + "Delta": 0, + "NumericVerdict": "Identical", + "Differs": false, + "ScopeReason": "buried layer face (layer 3 of 4, SAM external face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:5e4a7125-c77a-4911-9084-7cbfa9b0786c@space:5080c000-0000-0000-0000-00000000c001#layer3.internalEmissivity", + "Side": "panel:5e4a7125-c77a-4911-9084-7cbfa9b0786c@space:5080c000-0000-0000-0000-00000000c001", + "Layer": 3, + "LayerCount": 4, + "Property": "internalEmissivity", + "SamFace": "internal", + "SamMaterial": "FIX_MineralWool", + "NativeObject": "SAM_OpaqueMaterial_FIX_MineralWool_140mm_251d5e01", + "SamValue": 0.92, + "NativeValue": 0.89, + "Delta": 0.030000000000000027, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 3 of 4, SAM internal face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:5e4a7125-c77a-4911-9084-7cbfa9b0786c@space:5080c000-0000-0000-0000-00000000c001#layer4.externalSolarReflectance", + "Side": "panel:5e4a7125-c77a-4911-9084-7cbfa9b0786c@space:5080c000-0000-0000-0000-00000000c001", + "Layer": 4, + "LayerCount": 4, + "Property": "externalSolarReflectance", + "SamFace": "external", + "SamMaterial": "FIX_Plasterboard", + "NativeObject": "SAM_OpaqueMaterial_FIX_Plasterboard_12.5mm_Internal_5abe47a0", + "SamValue": 0.62, + "NativeValue": 0.6799999999999999, + "Delta": 0.05999999999999994, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 4 of 4, SAM external face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:5e4a7125-c77a-4911-9084-7cbfa9b0786c@space:5080c000-0000-0000-0000-00000000c001#layer4.externalLightReflectance", + "Side": "panel:5e4a7125-c77a-4911-9084-7cbfa9b0786c@space:5080c000-0000-0000-0000-00000000c001", + "Layer": 4, + "LayerCount": 4, + "Property": "externalLightReflectance", + "SamFace": "external", + "SamMaterial": "FIX_Plasterboard", + "NativeObject": "SAM_OpaqueMaterial_FIX_Plasterboard_12.5mm_Internal_5abe47a0", + "SamValue": 0.64, + "NativeValue": 0.7, + "Delta": 0.05999999999999994, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 4 of 4, SAM external face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:5e4a7125-c77a-4911-9084-7cbfa9b0786c@space:5080c000-0000-0000-0000-00000000c001#layer4.externalEmissivity", + "Side": "panel:5e4a7125-c77a-4911-9084-7cbfa9b0786c@space:5080c000-0000-0000-0000-00000000c001", + "Layer": 4, + "LayerCount": 4, + "Property": "externalEmissivity", + "SamFace": "external", + "SamMaterial": "FIX_Plasterboard", + "NativeObject": "SAM_OpaqueMaterial_FIX_Plasterboard_12.5mm_Internal_5abe47a0", + "SamValue": 0.9, + "NativeValue": 0.91, + "Delta": 0.010000000000000009, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 4 of 4, SAM external face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:78af8769-1ba0-43bc-844e-f1ca72fa447e@space:5080c000-0000-0000-0000-00000000c001#layer1.internalSolarReflectance", + "Side": "panel:78af8769-1ba0-43bc-844e-f1ca72fa447e@space:5080c000-0000-0000-0000-00000000c001", + "Layer": 1, + "LayerCount": 4, + "Property": "internalSolarReflectance", + "SamFace": "internal", + "SamMaterial": "FIX_Render", + "NativeObject": "SAM_OpaqueMaterial_FIX_Render_15mm_f7af24b1", + "SamValue": 0.36, + "NativeValue": 0.5700000000000001, + "Delta": 0.21000000000000008, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 1 of 4, SAM internal face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:78af8769-1ba0-43bc-844e-f1ca72fa447e@space:5080c000-0000-0000-0000-00000000c001#layer1.internalLightReflectance", + "Side": "panel:78af8769-1ba0-43bc-844e-f1ca72fa447e@space:5080c000-0000-0000-0000-00000000c001", + "Layer": 1, + "LayerCount": 4, + "Property": "internalLightReflectance", + "SamFace": "internal", + "SamMaterial": "FIX_Render", + "NativeObject": "SAM_OpaqueMaterial_FIX_Render_15mm_f7af24b1", + "SamValue": 0.37, + "NativeValue": 0.5800000000000001, + "Delta": 0.21000000000000008, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 1 of 4, SAM internal face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:78af8769-1ba0-43bc-844e-f1ca72fa447e@space:5080c000-0000-0000-0000-00000000c001#layer1.internalEmissivity", + "Side": "panel:78af8769-1ba0-43bc-844e-f1ca72fa447e@space:5080c000-0000-0000-0000-00000000c001", + "Layer": 1, + "LayerCount": 4, + "Property": "internalEmissivity", + "SamFace": "internal", + "SamMaterial": "FIX_Render", + "NativeObject": "SAM_OpaqueMaterial_FIX_Render_15mm_f7af24b1", + "SamValue": 0.93, + "NativeValue": 0.88, + "Delta": 0.050000000000000044, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 1 of 4, SAM internal face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:78af8769-1ba0-43bc-844e-f1ca72fa447e@space:5080c000-0000-0000-0000-00000000c001#layer2.externalSolarReflectance", + "Side": "panel:78af8769-1ba0-43bc-844e-f1ca72fa447e@space:5080c000-0000-0000-0000-00000000c001", + "Layer": 2, + "LayerCount": 4, + "Property": "externalSolarReflectance", + "SamFace": "external", + "SamMaterial": "FIX_Blockwork", + "NativeObject": "SAM_OpaqueMaterial_FIX_Blockwork_100mm_6998e0fb", + "SamValue": 0.38, + "NativeValue": 0.38, + "Delta": 0, + "NumericVerdict": "Identical", + "Differs": false, + "ScopeReason": "buried layer face (layer 2 of 4, SAM external face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:78af8769-1ba0-43bc-844e-f1ca72fa447e@space:5080c000-0000-0000-0000-00000000c001#layer2.internalSolarReflectance", + "Side": "panel:78af8769-1ba0-43bc-844e-f1ca72fa447e@space:5080c000-0000-0000-0000-00000000c001", + "Layer": 2, + "LayerCount": 4, + "Property": "internalSolarReflectance", + "SamFace": "internal", + "SamMaterial": "FIX_Blockwork", + "NativeObject": "SAM_OpaqueMaterial_FIX_Blockwork_100mm_6998e0fb", + "SamValue": 0.44, + "NativeValue": 0.38, + "Delta": 0.06, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 2 of 4, SAM internal face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:78af8769-1ba0-43bc-844e-f1ca72fa447e@space:5080c000-0000-0000-0000-00000000c001#layer2.externalLightReflectance", + "Side": "panel:78af8769-1ba0-43bc-844e-f1ca72fa447e@space:5080c000-0000-0000-0000-00000000c001", + "Layer": 2, + "LayerCount": 4, + "Property": "externalLightReflectance", + "SamFace": "external", + "SamMaterial": "FIX_Blockwork", + "NativeObject": "SAM_OpaqueMaterial_FIX_Blockwork_100mm_6998e0fb", + "SamValue": 0.39, + "NativeValue": 0.39, + "Delta": 0, + "NumericVerdict": "Identical", + "Differs": false, + "ScopeReason": "buried layer face (layer 2 of 4, SAM external face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:78af8769-1ba0-43bc-844e-f1ca72fa447e@space:5080c000-0000-0000-0000-00000000c001#layer2.internalLightReflectance", + "Side": "panel:78af8769-1ba0-43bc-844e-f1ca72fa447e@space:5080c000-0000-0000-0000-00000000c001", + "Layer": 2, + "LayerCount": 4, + "Property": "internalLightReflectance", + "SamFace": "internal", + "SamMaterial": "FIX_Blockwork", + "NativeObject": "SAM_OpaqueMaterial_FIX_Blockwork_100mm_6998e0fb", + "SamValue": 0.46, + "NativeValue": 0.39, + "Delta": 0.07, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 2 of 4, SAM internal face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:78af8769-1ba0-43bc-844e-f1ca72fa447e@space:5080c000-0000-0000-0000-00000000c001#layer2.externalEmissivity", + "Side": "panel:78af8769-1ba0-43bc-844e-f1ca72fa447e@space:5080c000-0000-0000-0000-00000000c001", + "Layer": 2, + "LayerCount": 4, + "Property": "externalEmissivity", + "SamFace": "external", + "SamMaterial": "FIX_Blockwork", + "NativeObject": "SAM_OpaqueMaterial_FIX_Blockwork_100mm_6998e0fb", + "SamValue": 0.93, + "NativeValue": 0.93, + "Delta": 0, + "NumericVerdict": "Identical", + "Differs": false, + "ScopeReason": "buried layer face (layer 2 of 4, SAM external face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:78af8769-1ba0-43bc-844e-f1ca72fa447e@space:5080c000-0000-0000-0000-00000000c001#layer2.internalEmissivity", + "Side": "panel:78af8769-1ba0-43bc-844e-f1ca72fa447e@space:5080c000-0000-0000-0000-00000000c001", + "Layer": 2, + "LayerCount": 4, + "Property": "internalEmissivity", + "SamFace": "internal", + "SamMaterial": "FIX_Blockwork", + "NativeObject": "SAM_OpaqueMaterial_FIX_Blockwork_100mm_6998e0fb", + "SamValue": 0.94, + "NativeValue": 0.93, + "Delta": 0.009999999999999898, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 2 of 4, SAM internal face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:78af8769-1ba0-43bc-844e-f1ca72fa447e@space:5080c000-0000-0000-0000-00000000c001#layer3.externalSolarReflectance", + "Side": "panel:78af8769-1ba0-43bc-844e-f1ca72fa447e@space:5080c000-0000-0000-0000-00000000c001", + "Layer": 3, + "LayerCount": 4, + "Property": "externalSolarReflectance", + "SamFace": "external", + "SamMaterial": "FIX_MineralWool", + "NativeObject": "SAM_OpaqueMaterial_FIX_MineralWool_140mm_251d5e01", + "SamValue": 0.48, + "NativeValue": 0.48, + "Delta": 0, + "NumericVerdict": "Identical", + "Differs": false, + "ScopeReason": "buried layer face (layer 3 of 4, SAM external face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:78af8769-1ba0-43bc-844e-f1ca72fa447e@space:5080c000-0000-0000-0000-00000000c001#layer3.internalSolarReflectance", + "Side": "panel:78af8769-1ba0-43bc-844e-f1ca72fa447e@space:5080c000-0000-0000-0000-00000000c001", + "Layer": 3, + "LayerCount": 4, + "Property": "internalSolarReflectance", + "SamFace": "internal", + "SamMaterial": "FIX_MineralWool", + "NativeObject": "SAM_OpaqueMaterial_FIX_MineralWool_140mm_251d5e01", + "SamValue": 0.51, + "NativeValue": 0.48, + "Delta": 0.030000000000000027, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 3 of 4, SAM internal face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:78af8769-1ba0-43bc-844e-f1ca72fa447e@space:5080c000-0000-0000-0000-00000000c001#layer3.externalLightReflectance", + "Side": "panel:78af8769-1ba0-43bc-844e-f1ca72fa447e@space:5080c000-0000-0000-0000-00000000c001", + "Layer": 3, + "LayerCount": 4, + "Property": "externalLightReflectance", + "SamFace": "external", + "SamMaterial": "FIX_MineralWool", + "NativeObject": "SAM_OpaqueMaterial_FIX_MineralWool_140mm_251d5e01", + "SamValue": 0.49, + "NativeValue": 0.49, + "Delta": 0, + "NumericVerdict": "Identical", + "Differs": false, + "ScopeReason": "buried layer face (layer 3 of 4, SAM external face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:78af8769-1ba0-43bc-844e-f1ca72fa447e@space:5080c000-0000-0000-0000-00000000c001#layer3.internalLightReflectance", + "Side": "panel:78af8769-1ba0-43bc-844e-f1ca72fa447e@space:5080c000-0000-0000-0000-00000000c001", + "Layer": 3, + "LayerCount": 4, + "Property": "internalLightReflectance", + "SamFace": "internal", + "SamMaterial": "FIX_MineralWool", + "NativeObject": "SAM_OpaqueMaterial_FIX_MineralWool_140mm_251d5e01", + "SamValue": 0.53, + "NativeValue": 0.49, + "Delta": 0.040000000000000036, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 3 of 4, SAM internal face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:78af8769-1ba0-43bc-844e-f1ca72fa447e@space:5080c000-0000-0000-0000-00000000c001#layer3.externalEmissivity", + "Side": "panel:78af8769-1ba0-43bc-844e-f1ca72fa447e@space:5080c000-0000-0000-0000-00000000c001", + "Layer": 3, + "LayerCount": 4, + "Property": "externalEmissivity", + "SamFace": "external", + "SamMaterial": "FIX_MineralWool", + "NativeObject": "SAM_OpaqueMaterial_FIX_MineralWool_140mm_251d5e01", + "SamValue": 0.89, + "NativeValue": 0.89, + "Delta": 0, + "NumericVerdict": "Identical", + "Differs": false, + "ScopeReason": "buried layer face (layer 3 of 4, SAM external face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:78af8769-1ba0-43bc-844e-f1ca72fa447e@space:5080c000-0000-0000-0000-00000000c001#layer3.internalEmissivity", + "Side": "panel:78af8769-1ba0-43bc-844e-f1ca72fa447e@space:5080c000-0000-0000-0000-00000000c001", + "Layer": 3, + "LayerCount": 4, + "Property": "internalEmissivity", + "SamFace": "internal", + "SamMaterial": "FIX_MineralWool", + "NativeObject": "SAM_OpaqueMaterial_FIX_MineralWool_140mm_251d5e01", + "SamValue": 0.92, + "NativeValue": 0.89, + "Delta": 0.030000000000000027, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 3 of 4, SAM internal face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:78af8769-1ba0-43bc-844e-f1ca72fa447e@space:5080c000-0000-0000-0000-00000000c001#layer4.externalSolarReflectance", + "Side": "panel:78af8769-1ba0-43bc-844e-f1ca72fa447e@space:5080c000-0000-0000-0000-00000000c001", + "Layer": 4, + "LayerCount": 4, + "Property": "externalSolarReflectance", + "SamFace": "external", + "SamMaterial": "FIX_Plasterboard", + "NativeObject": "SAM_OpaqueMaterial_FIX_Plasterboard_12.5mm_Internal_5abe47a0", + "SamValue": 0.62, + "NativeValue": 0.6799999999999999, + "Delta": 0.05999999999999994, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 4 of 4, SAM external face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:78af8769-1ba0-43bc-844e-f1ca72fa447e@space:5080c000-0000-0000-0000-00000000c001#layer4.externalLightReflectance", + "Side": "panel:78af8769-1ba0-43bc-844e-f1ca72fa447e@space:5080c000-0000-0000-0000-00000000c001", + "Layer": 4, + "LayerCount": 4, + "Property": "externalLightReflectance", + "SamFace": "external", + "SamMaterial": "FIX_Plasterboard", + "NativeObject": "SAM_OpaqueMaterial_FIX_Plasterboard_12.5mm_Internal_5abe47a0", + "SamValue": 0.64, + "NativeValue": 0.7, + "Delta": 0.05999999999999994, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 4 of 4, SAM external face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:78af8769-1ba0-43bc-844e-f1ca72fa447e@space:5080c000-0000-0000-0000-00000000c001#layer4.externalEmissivity", + "Side": "panel:78af8769-1ba0-43bc-844e-f1ca72fa447e@space:5080c000-0000-0000-0000-00000000c001", + "Layer": 4, + "LayerCount": 4, + "Property": "externalEmissivity", + "SamFace": "external", + "SamMaterial": "FIX_Plasterboard", + "NativeObject": "SAM_OpaqueMaterial_FIX_Plasterboard_12.5mm_Internal_5abe47a0", + "SamValue": 0.9, + "NativeValue": 0.91, + "Delta": 0.010000000000000009, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 4 of 4, SAM external face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:0a4398eb-cdab-43d8-bcba-736116a2a029@space:5080c000-0000-0000-0000-00000000c001#layer1.internalSolarReflectance", + "Side": "panel:0a4398eb-cdab-43d8-bcba-736116a2a029@space:5080c000-0000-0000-0000-00000000c001", + "Layer": 1, + "LayerCount": 4, + "Property": "internalSolarReflectance", + "SamFace": "internal", + "SamMaterial": "FIX_Render", + "NativeObject": "SAM_OpaqueMaterial_FIX_Render_15mm_f7af24b1", + "SamValue": 0.36, + "NativeValue": 0.5700000000000001, + "Delta": 0.21000000000000008, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 1 of 4, SAM internal face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:0a4398eb-cdab-43d8-bcba-736116a2a029@space:5080c000-0000-0000-0000-00000000c001#layer1.internalLightReflectance", + "Side": "panel:0a4398eb-cdab-43d8-bcba-736116a2a029@space:5080c000-0000-0000-0000-00000000c001", + "Layer": 1, + "LayerCount": 4, + "Property": "internalLightReflectance", + "SamFace": "internal", + "SamMaterial": "FIX_Render", + "NativeObject": "SAM_OpaqueMaterial_FIX_Render_15mm_f7af24b1", + "SamValue": 0.37, + "NativeValue": 0.5800000000000001, + "Delta": 0.21000000000000008, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 1 of 4, SAM internal face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:0a4398eb-cdab-43d8-bcba-736116a2a029@space:5080c000-0000-0000-0000-00000000c001#layer1.internalEmissivity", + "Side": "panel:0a4398eb-cdab-43d8-bcba-736116a2a029@space:5080c000-0000-0000-0000-00000000c001", + "Layer": 1, + "LayerCount": 4, + "Property": "internalEmissivity", + "SamFace": "internal", + "SamMaterial": "FIX_Render", + "NativeObject": "SAM_OpaqueMaterial_FIX_Render_15mm_f7af24b1", + "SamValue": 0.93, + "NativeValue": 0.88, + "Delta": 0.050000000000000044, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 1 of 4, SAM internal face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:0a4398eb-cdab-43d8-bcba-736116a2a029@space:5080c000-0000-0000-0000-00000000c001#layer2.externalSolarReflectance", + "Side": "panel:0a4398eb-cdab-43d8-bcba-736116a2a029@space:5080c000-0000-0000-0000-00000000c001", + "Layer": 2, + "LayerCount": 4, + "Property": "externalSolarReflectance", + "SamFace": "external", + "SamMaterial": "FIX_Blockwork", + "NativeObject": "SAM_OpaqueMaterial_FIX_Blockwork_100mm_6998e0fb", + "SamValue": 0.38, + "NativeValue": 0.38, + "Delta": 0, + "NumericVerdict": "Identical", + "Differs": false, + "ScopeReason": "buried layer face (layer 2 of 4, SAM external face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:0a4398eb-cdab-43d8-bcba-736116a2a029@space:5080c000-0000-0000-0000-00000000c001#layer2.internalSolarReflectance", + "Side": "panel:0a4398eb-cdab-43d8-bcba-736116a2a029@space:5080c000-0000-0000-0000-00000000c001", + "Layer": 2, + "LayerCount": 4, + "Property": "internalSolarReflectance", + "SamFace": "internal", + "SamMaterial": "FIX_Blockwork", + "NativeObject": "SAM_OpaqueMaterial_FIX_Blockwork_100mm_6998e0fb", + "SamValue": 0.44, + "NativeValue": 0.38, + "Delta": 0.06, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 2 of 4, SAM internal face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:0a4398eb-cdab-43d8-bcba-736116a2a029@space:5080c000-0000-0000-0000-00000000c001#layer2.externalLightReflectance", + "Side": "panel:0a4398eb-cdab-43d8-bcba-736116a2a029@space:5080c000-0000-0000-0000-00000000c001", + "Layer": 2, + "LayerCount": 4, + "Property": "externalLightReflectance", + "SamFace": "external", + "SamMaterial": "FIX_Blockwork", + "NativeObject": "SAM_OpaqueMaterial_FIX_Blockwork_100mm_6998e0fb", + "SamValue": 0.39, + "NativeValue": 0.39, + "Delta": 0, + "NumericVerdict": "Identical", + "Differs": false, + "ScopeReason": "buried layer face (layer 2 of 4, SAM external face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:0a4398eb-cdab-43d8-bcba-736116a2a029@space:5080c000-0000-0000-0000-00000000c001#layer2.internalLightReflectance", + "Side": "panel:0a4398eb-cdab-43d8-bcba-736116a2a029@space:5080c000-0000-0000-0000-00000000c001", + "Layer": 2, + "LayerCount": 4, + "Property": "internalLightReflectance", + "SamFace": "internal", + "SamMaterial": "FIX_Blockwork", + "NativeObject": "SAM_OpaqueMaterial_FIX_Blockwork_100mm_6998e0fb", + "SamValue": 0.46, + "NativeValue": 0.39, + "Delta": 0.07, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 2 of 4, SAM internal face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:0a4398eb-cdab-43d8-bcba-736116a2a029@space:5080c000-0000-0000-0000-00000000c001#layer2.externalEmissivity", + "Side": "panel:0a4398eb-cdab-43d8-bcba-736116a2a029@space:5080c000-0000-0000-0000-00000000c001", + "Layer": 2, + "LayerCount": 4, + "Property": "externalEmissivity", + "SamFace": "external", + "SamMaterial": "FIX_Blockwork", + "NativeObject": "SAM_OpaqueMaterial_FIX_Blockwork_100mm_6998e0fb", + "SamValue": 0.93, + "NativeValue": 0.93, + "Delta": 0, + "NumericVerdict": "Identical", + "Differs": false, + "ScopeReason": "buried layer face (layer 2 of 4, SAM external face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:0a4398eb-cdab-43d8-bcba-736116a2a029@space:5080c000-0000-0000-0000-00000000c001#layer2.internalEmissivity", + "Side": "panel:0a4398eb-cdab-43d8-bcba-736116a2a029@space:5080c000-0000-0000-0000-00000000c001", + "Layer": 2, + "LayerCount": 4, + "Property": "internalEmissivity", + "SamFace": "internal", + "SamMaterial": "FIX_Blockwork", + "NativeObject": "SAM_OpaqueMaterial_FIX_Blockwork_100mm_6998e0fb", + "SamValue": 0.94, + "NativeValue": 0.93, + "Delta": 0.009999999999999898, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 2 of 4, SAM internal face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:0a4398eb-cdab-43d8-bcba-736116a2a029@space:5080c000-0000-0000-0000-00000000c001#layer3.externalSolarReflectance", + "Side": "panel:0a4398eb-cdab-43d8-bcba-736116a2a029@space:5080c000-0000-0000-0000-00000000c001", + "Layer": 3, + "LayerCount": 4, + "Property": "externalSolarReflectance", + "SamFace": "external", + "SamMaterial": "FIX_MineralWool", + "NativeObject": "SAM_OpaqueMaterial_FIX_MineralWool_140mm_251d5e01", + "SamValue": 0.48, + "NativeValue": 0.48, + "Delta": 0, + "NumericVerdict": "Identical", + "Differs": false, + "ScopeReason": "buried layer face (layer 3 of 4, SAM external face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:0a4398eb-cdab-43d8-bcba-736116a2a029@space:5080c000-0000-0000-0000-00000000c001#layer3.internalSolarReflectance", + "Side": "panel:0a4398eb-cdab-43d8-bcba-736116a2a029@space:5080c000-0000-0000-0000-00000000c001", + "Layer": 3, + "LayerCount": 4, + "Property": "internalSolarReflectance", + "SamFace": "internal", + "SamMaterial": "FIX_MineralWool", + "NativeObject": "SAM_OpaqueMaterial_FIX_MineralWool_140mm_251d5e01", + "SamValue": 0.51, + "NativeValue": 0.48, + "Delta": 0.030000000000000027, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 3 of 4, SAM internal face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:0a4398eb-cdab-43d8-bcba-736116a2a029@space:5080c000-0000-0000-0000-00000000c001#layer3.externalLightReflectance", + "Side": "panel:0a4398eb-cdab-43d8-bcba-736116a2a029@space:5080c000-0000-0000-0000-00000000c001", + "Layer": 3, + "LayerCount": 4, + "Property": "externalLightReflectance", + "SamFace": "external", + "SamMaterial": "FIX_MineralWool", + "NativeObject": "SAM_OpaqueMaterial_FIX_MineralWool_140mm_251d5e01", + "SamValue": 0.49, + "NativeValue": 0.49, + "Delta": 0, + "NumericVerdict": "Identical", + "Differs": false, + "ScopeReason": "buried layer face (layer 3 of 4, SAM external face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:0a4398eb-cdab-43d8-bcba-736116a2a029@space:5080c000-0000-0000-0000-00000000c001#layer3.internalLightReflectance", + "Side": "panel:0a4398eb-cdab-43d8-bcba-736116a2a029@space:5080c000-0000-0000-0000-00000000c001", + "Layer": 3, + "LayerCount": 4, + "Property": "internalLightReflectance", + "SamFace": "internal", + "SamMaterial": "FIX_MineralWool", + "NativeObject": "SAM_OpaqueMaterial_FIX_MineralWool_140mm_251d5e01", + "SamValue": 0.53, + "NativeValue": 0.49, + "Delta": 0.040000000000000036, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 3 of 4, SAM internal face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:0a4398eb-cdab-43d8-bcba-736116a2a029@space:5080c000-0000-0000-0000-00000000c001#layer3.externalEmissivity", + "Side": "panel:0a4398eb-cdab-43d8-bcba-736116a2a029@space:5080c000-0000-0000-0000-00000000c001", + "Layer": 3, + "LayerCount": 4, + "Property": "externalEmissivity", + "SamFace": "external", + "SamMaterial": "FIX_MineralWool", + "NativeObject": "SAM_OpaqueMaterial_FIX_MineralWool_140mm_251d5e01", + "SamValue": 0.89, + "NativeValue": 0.89, + "Delta": 0, + "NumericVerdict": "Identical", + "Differs": false, + "ScopeReason": "buried layer face (layer 3 of 4, SAM external face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:0a4398eb-cdab-43d8-bcba-736116a2a029@space:5080c000-0000-0000-0000-00000000c001#layer3.internalEmissivity", + "Side": "panel:0a4398eb-cdab-43d8-bcba-736116a2a029@space:5080c000-0000-0000-0000-00000000c001", + "Layer": 3, + "LayerCount": 4, + "Property": "internalEmissivity", + "SamFace": "internal", + "SamMaterial": "FIX_MineralWool", + "NativeObject": "SAM_OpaqueMaterial_FIX_MineralWool_140mm_251d5e01", + "SamValue": 0.92, + "NativeValue": 0.89, + "Delta": 0.030000000000000027, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 3 of 4, SAM internal face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:0a4398eb-cdab-43d8-bcba-736116a2a029@space:5080c000-0000-0000-0000-00000000c001#layer4.externalSolarReflectance", + "Side": "panel:0a4398eb-cdab-43d8-bcba-736116a2a029@space:5080c000-0000-0000-0000-00000000c001", + "Layer": 4, + "LayerCount": 4, + "Property": "externalSolarReflectance", + "SamFace": "external", + "SamMaterial": "FIX_Plasterboard", + "NativeObject": "SAM_OpaqueMaterial_FIX_Plasterboard_12.5mm_Internal_5abe47a0", + "SamValue": 0.62, + "NativeValue": 0.6799999999999999, + "Delta": 0.05999999999999994, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 4 of 4, SAM external face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:0a4398eb-cdab-43d8-bcba-736116a2a029@space:5080c000-0000-0000-0000-00000000c001#layer4.externalLightReflectance", + "Side": "panel:0a4398eb-cdab-43d8-bcba-736116a2a029@space:5080c000-0000-0000-0000-00000000c001", + "Layer": 4, + "LayerCount": 4, + "Property": "externalLightReflectance", + "SamFace": "external", + "SamMaterial": "FIX_Plasterboard", + "NativeObject": "SAM_OpaqueMaterial_FIX_Plasterboard_12.5mm_Internal_5abe47a0", + "SamValue": 0.64, + "NativeValue": 0.7, + "Delta": 0.05999999999999994, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 4 of 4, SAM external face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:0a4398eb-cdab-43d8-bcba-736116a2a029@space:5080c000-0000-0000-0000-00000000c001#layer4.externalEmissivity", + "Side": "panel:0a4398eb-cdab-43d8-bcba-736116a2a029@space:5080c000-0000-0000-0000-00000000c001", + "Layer": 4, + "LayerCount": 4, + "Property": "externalEmissivity", + "SamFace": "external", + "SamMaterial": "FIX_Plasterboard", + "NativeObject": "SAM_OpaqueMaterial_FIX_Plasterboard_12.5mm_Internal_5abe47a0", + "SamValue": 0.9, + "NativeValue": 0.91, + "Delta": 0.010000000000000009, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 4 of 4, SAM external face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:18cb687b-53ce-4282-be8e-6ba267a6ae2b@space:5080c000-0000-0000-0000-00000000c001#layer1.internalSolarReflectance", + "Side": "panel:18cb687b-53ce-4282-be8e-6ba267a6ae2b@space:5080c000-0000-0000-0000-00000000c001", + "Layer": 1, + "LayerCount": 4, + "Property": "internalSolarReflectance", + "SamFace": "internal", + "SamMaterial": "FIX_Render", + "NativeObject": "SAM_OpaqueMaterial_FIX_Render_15mm_f7af24b1", + "SamValue": 0.36, + "NativeValue": 0.5700000000000001, + "Delta": 0.21000000000000008, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 1 of 4, SAM internal face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:18cb687b-53ce-4282-be8e-6ba267a6ae2b@space:5080c000-0000-0000-0000-00000000c001#layer1.internalLightReflectance", + "Side": "panel:18cb687b-53ce-4282-be8e-6ba267a6ae2b@space:5080c000-0000-0000-0000-00000000c001", + "Layer": 1, + "LayerCount": 4, + "Property": "internalLightReflectance", + "SamFace": "internal", + "SamMaterial": "FIX_Render", + "NativeObject": "SAM_OpaqueMaterial_FIX_Render_15mm_f7af24b1", + "SamValue": 0.37, + "NativeValue": 0.5800000000000001, + "Delta": 0.21000000000000008, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 1 of 4, SAM internal face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:18cb687b-53ce-4282-be8e-6ba267a6ae2b@space:5080c000-0000-0000-0000-00000000c001#layer1.internalEmissivity", + "Side": "panel:18cb687b-53ce-4282-be8e-6ba267a6ae2b@space:5080c000-0000-0000-0000-00000000c001", + "Layer": 1, + "LayerCount": 4, + "Property": "internalEmissivity", + "SamFace": "internal", + "SamMaterial": "FIX_Render", + "NativeObject": "SAM_OpaqueMaterial_FIX_Render_15mm_f7af24b1", + "SamValue": 0.93, + "NativeValue": 0.88, + "Delta": 0.050000000000000044, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 1 of 4, SAM internal face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:18cb687b-53ce-4282-be8e-6ba267a6ae2b@space:5080c000-0000-0000-0000-00000000c001#layer2.externalSolarReflectance", + "Side": "panel:18cb687b-53ce-4282-be8e-6ba267a6ae2b@space:5080c000-0000-0000-0000-00000000c001", + "Layer": 2, + "LayerCount": 4, + "Property": "externalSolarReflectance", + "SamFace": "external", + "SamMaterial": "FIX_Blockwork", + "NativeObject": "SAM_OpaqueMaterial_FIX_Blockwork_100mm_6998e0fb", + "SamValue": 0.38, + "NativeValue": 0.38, + "Delta": 0, + "NumericVerdict": "Identical", + "Differs": false, + "ScopeReason": "buried layer face (layer 2 of 4, SAM external face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:18cb687b-53ce-4282-be8e-6ba267a6ae2b@space:5080c000-0000-0000-0000-00000000c001#layer2.internalSolarReflectance", + "Side": "panel:18cb687b-53ce-4282-be8e-6ba267a6ae2b@space:5080c000-0000-0000-0000-00000000c001", + "Layer": 2, + "LayerCount": 4, + "Property": "internalSolarReflectance", + "SamFace": "internal", + "SamMaterial": "FIX_Blockwork", + "NativeObject": "SAM_OpaqueMaterial_FIX_Blockwork_100mm_6998e0fb", + "SamValue": 0.44, + "NativeValue": 0.38, + "Delta": 0.06, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 2 of 4, SAM internal face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:18cb687b-53ce-4282-be8e-6ba267a6ae2b@space:5080c000-0000-0000-0000-00000000c001#layer2.externalLightReflectance", + "Side": "panel:18cb687b-53ce-4282-be8e-6ba267a6ae2b@space:5080c000-0000-0000-0000-00000000c001", + "Layer": 2, + "LayerCount": 4, + "Property": "externalLightReflectance", + "SamFace": "external", + "SamMaterial": "FIX_Blockwork", + "NativeObject": "SAM_OpaqueMaterial_FIX_Blockwork_100mm_6998e0fb", + "SamValue": 0.39, + "NativeValue": 0.39, + "Delta": 0, + "NumericVerdict": "Identical", + "Differs": false, + "ScopeReason": "buried layer face (layer 2 of 4, SAM external face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:18cb687b-53ce-4282-be8e-6ba267a6ae2b@space:5080c000-0000-0000-0000-00000000c001#layer2.internalLightReflectance", + "Side": "panel:18cb687b-53ce-4282-be8e-6ba267a6ae2b@space:5080c000-0000-0000-0000-00000000c001", + "Layer": 2, + "LayerCount": 4, + "Property": "internalLightReflectance", + "SamFace": "internal", + "SamMaterial": "FIX_Blockwork", + "NativeObject": "SAM_OpaqueMaterial_FIX_Blockwork_100mm_6998e0fb", + "SamValue": 0.46, + "NativeValue": 0.39, + "Delta": 0.07, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 2 of 4, SAM internal face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:18cb687b-53ce-4282-be8e-6ba267a6ae2b@space:5080c000-0000-0000-0000-00000000c001#layer2.externalEmissivity", + "Side": "panel:18cb687b-53ce-4282-be8e-6ba267a6ae2b@space:5080c000-0000-0000-0000-00000000c001", + "Layer": 2, + "LayerCount": 4, + "Property": "externalEmissivity", + "SamFace": "external", + "SamMaterial": "FIX_Blockwork", + "NativeObject": "SAM_OpaqueMaterial_FIX_Blockwork_100mm_6998e0fb", + "SamValue": 0.93, + "NativeValue": 0.93, + "Delta": 0, + "NumericVerdict": "Identical", + "Differs": false, + "ScopeReason": "buried layer face (layer 2 of 4, SAM external face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:18cb687b-53ce-4282-be8e-6ba267a6ae2b@space:5080c000-0000-0000-0000-00000000c001#layer2.internalEmissivity", + "Side": "panel:18cb687b-53ce-4282-be8e-6ba267a6ae2b@space:5080c000-0000-0000-0000-00000000c001", + "Layer": 2, + "LayerCount": 4, + "Property": "internalEmissivity", + "SamFace": "internal", + "SamMaterial": "FIX_Blockwork", + "NativeObject": "SAM_OpaqueMaterial_FIX_Blockwork_100mm_6998e0fb", + "SamValue": 0.94, + "NativeValue": 0.93, + "Delta": 0.009999999999999898, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 2 of 4, SAM internal face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:18cb687b-53ce-4282-be8e-6ba267a6ae2b@space:5080c000-0000-0000-0000-00000000c001#layer3.externalSolarReflectance", + "Side": "panel:18cb687b-53ce-4282-be8e-6ba267a6ae2b@space:5080c000-0000-0000-0000-00000000c001", + "Layer": 3, + "LayerCount": 4, + "Property": "externalSolarReflectance", + "SamFace": "external", + "SamMaterial": "FIX_MineralWool", + "NativeObject": "SAM_OpaqueMaterial_FIX_MineralWool_140mm_251d5e01", + "SamValue": 0.48, + "NativeValue": 0.48, + "Delta": 0, + "NumericVerdict": "Identical", + "Differs": false, + "ScopeReason": "buried layer face (layer 3 of 4, SAM external face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:18cb687b-53ce-4282-be8e-6ba267a6ae2b@space:5080c000-0000-0000-0000-00000000c001#layer3.internalSolarReflectance", + "Side": "panel:18cb687b-53ce-4282-be8e-6ba267a6ae2b@space:5080c000-0000-0000-0000-00000000c001", + "Layer": 3, + "LayerCount": 4, + "Property": "internalSolarReflectance", + "SamFace": "internal", + "SamMaterial": "FIX_MineralWool", + "NativeObject": "SAM_OpaqueMaterial_FIX_MineralWool_140mm_251d5e01", + "SamValue": 0.51, + "NativeValue": 0.48, + "Delta": 0.030000000000000027, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 3 of 4, SAM internal face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:18cb687b-53ce-4282-be8e-6ba267a6ae2b@space:5080c000-0000-0000-0000-00000000c001#layer3.externalLightReflectance", + "Side": "panel:18cb687b-53ce-4282-be8e-6ba267a6ae2b@space:5080c000-0000-0000-0000-00000000c001", + "Layer": 3, + "LayerCount": 4, + "Property": "externalLightReflectance", + "SamFace": "external", + "SamMaterial": "FIX_MineralWool", + "NativeObject": "SAM_OpaqueMaterial_FIX_MineralWool_140mm_251d5e01", + "SamValue": 0.49, + "NativeValue": 0.49, + "Delta": 0, + "NumericVerdict": "Identical", + "Differs": false, + "ScopeReason": "buried layer face (layer 3 of 4, SAM external face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:18cb687b-53ce-4282-be8e-6ba267a6ae2b@space:5080c000-0000-0000-0000-00000000c001#layer3.internalLightReflectance", + "Side": "panel:18cb687b-53ce-4282-be8e-6ba267a6ae2b@space:5080c000-0000-0000-0000-00000000c001", + "Layer": 3, + "LayerCount": 4, + "Property": "internalLightReflectance", + "SamFace": "internal", + "SamMaterial": "FIX_MineralWool", + "NativeObject": "SAM_OpaqueMaterial_FIX_MineralWool_140mm_251d5e01", + "SamValue": 0.53, + "NativeValue": 0.49, + "Delta": 0.040000000000000036, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 3 of 4, SAM internal face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:18cb687b-53ce-4282-be8e-6ba267a6ae2b@space:5080c000-0000-0000-0000-00000000c001#layer3.externalEmissivity", + "Side": "panel:18cb687b-53ce-4282-be8e-6ba267a6ae2b@space:5080c000-0000-0000-0000-00000000c001", + "Layer": 3, + "LayerCount": 4, + "Property": "externalEmissivity", + "SamFace": "external", + "SamMaterial": "FIX_MineralWool", + "NativeObject": "SAM_OpaqueMaterial_FIX_MineralWool_140mm_251d5e01", + "SamValue": 0.89, + "NativeValue": 0.89, + "Delta": 0, + "NumericVerdict": "Identical", + "Differs": false, + "ScopeReason": "buried layer face (layer 3 of 4, SAM external face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:18cb687b-53ce-4282-be8e-6ba267a6ae2b@space:5080c000-0000-0000-0000-00000000c001#layer3.internalEmissivity", + "Side": "panel:18cb687b-53ce-4282-be8e-6ba267a6ae2b@space:5080c000-0000-0000-0000-00000000c001", + "Layer": 3, + "LayerCount": 4, + "Property": "internalEmissivity", + "SamFace": "internal", + "SamMaterial": "FIX_MineralWool", + "NativeObject": "SAM_OpaqueMaterial_FIX_MineralWool_140mm_251d5e01", + "SamValue": 0.92, + "NativeValue": 0.89, + "Delta": 0.030000000000000027, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 3 of 4, SAM internal face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:18cb687b-53ce-4282-be8e-6ba267a6ae2b@space:5080c000-0000-0000-0000-00000000c001#layer4.externalSolarReflectance", + "Side": "panel:18cb687b-53ce-4282-be8e-6ba267a6ae2b@space:5080c000-0000-0000-0000-00000000c001", + "Layer": 4, + "LayerCount": 4, + "Property": "externalSolarReflectance", + "SamFace": "external", + "SamMaterial": "FIX_Plasterboard", + "NativeObject": "SAM_OpaqueMaterial_FIX_Plasterboard_12.5mm_Internal_5abe47a0", + "SamValue": 0.62, + "NativeValue": 0.6799999999999999, + "Delta": 0.05999999999999994, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 4 of 4, SAM external face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:18cb687b-53ce-4282-be8e-6ba267a6ae2b@space:5080c000-0000-0000-0000-00000000c001#layer4.externalLightReflectance", + "Side": "panel:18cb687b-53ce-4282-be8e-6ba267a6ae2b@space:5080c000-0000-0000-0000-00000000c001", + "Layer": 4, + "LayerCount": 4, + "Property": "externalLightReflectance", + "SamFace": "external", + "SamMaterial": "FIX_Plasterboard", + "NativeObject": "SAM_OpaqueMaterial_FIX_Plasterboard_12.5mm_Internal_5abe47a0", + "SamValue": 0.64, + "NativeValue": 0.7, + "Delta": 0.05999999999999994, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 4 of 4, SAM external face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:18cb687b-53ce-4282-be8e-6ba267a6ae2b@space:5080c000-0000-0000-0000-00000000c001#layer4.externalEmissivity", + "Side": "panel:18cb687b-53ce-4282-be8e-6ba267a6ae2b@space:5080c000-0000-0000-0000-00000000c001", + "Layer": 4, + "LayerCount": 4, + "Property": "externalEmissivity", + "SamFace": "external", + "SamMaterial": "FIX_Plasterboard", + "NativeObject": "SAM_OpaqueMaterial_FIX_Plasterboard_12.5mm_Internal_5abe47a0", + "SamValue": 0.9, + "NativeValue": 0.91, + "Delta": 0.010000000000000009, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 4 of 4, SAM external face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + } + ] + }, + "OwnerDecisionsNamed": [], + "TechnicalBlockersNamed": [], + "Consistency": [], + "Unsupported": [], + "FixtureCriteria": [], + "VentilationStates": { + "space:5080c000-0000-0000-0000-00000000c001": "V2" + }, + "Series": [ + { + "Key": "space:5080c000-0000-0000-0000-00000000c001.ic.schedule.occupancy", + "QuantityId": "6.hourly", + "Count": 8760, + "NotPass": 0, + "Status": "Pass", + "Outcome": "Match", + "FirstNotPass": null + }, + { + "Key": "space:5080c000-0000-0000-0000-00000000c001.ic.schedule.lighting", + "QuantityId": "6.hourly", + "Count": 8760, + "NotPass": 0, + "Status": "Pass", + "Outcome": "Match", + "FirstNotPass": null + }, + { + "Key": "space:5080c000-0000-0000-0000-00000000c001.ic.schedule.equipmentSensible", + "QuantityId": "6.hourly", + "Count": 8760, + "NotPass": 0, + "Status": "Pass", + "Outcome": "Match", + "FirstNotPass": null + }, + { + "Key": "space:5080c000-0000-0000-0000-00000000c001.ic.schedule.equipmentLatent", + "QuantityId": "6.hourly", + "Count": 8760, + "NotPass": 0, + "Status": "Pass", + "Outcome": "Match", + "FirstNotPass": null + }, + { + "Key": "space:5080c000-0000-0000-0000-00000000c001.ic.schedule.infiltration", + "QuantityId": "6.hourly", + "Count": 8760, + "NotPass": 0, + "Status": "Pass", + "Outcome": "Match", + "FirstNotPass": null + }, + { + "Key": "space:5080c000-0000-0000-0000-00000000c001.ic.heating", + "QuantityId": "5.temperature", + "Count": 8760, + "NotPass": 0, + "Status": "Pass", + "Outcome": "Match", + "FirstNotPass": null + }, + { + "Key": "space:5080c000-0000-0000-0000-00000000c001.ic.cooling", + "QuantityId": "5.temperature", + "Count": 8760, + "NotPass": 0, + "Status": "Pass", + "Outcome": "Match", + "FirstNotPass": null + }, + { + "Key": "space:5080c000-0000-0000-0000-00000000c001.ic.humidification", + "QuantityId": "5.humidity", + "Count": 8760, + "NotPass": 0, + "Status": "Pass", + "Outcome": "Match", + "FirstNotPass": null + }, + { + "Key": "space:5080c000-0000-0000-0000-00000000c001.ic.dehumidification", + "QuantityId": "5.humidity", + "Count": 8760, + "NotPass": 0, + "Status": "Pass", + "Outcome": "Match", + "FirstNotPass": null + }, + { + "Key": "space:5080c000-0000-0000-0000-00000000c001.ic.ventilation.delivered", + "QuantityId": "8b", + "Count": 8760, + "NotPass": 0, + "Status": "Pass", + "Outcome": "WithinTolerance", + "FirstNotPass": null + }, + { + "Key": "space:5080c000-0000-0000-0000-00000000c001.ic.schedule.ventilation", + "QuantityId": "6.hourly", + "Count": 8760, + "NotPass": 0, + "Status": "Pass", + "Outcome": "Match", + "FirstNotPass": null + } + ], + "Supporting": [ + "calendar: one non-leap run year 1/1-12/31 (IDF RunPeriod begin year 2006), EPW 8760 rows; hour index 0 = 1 January 00:00-01:00. Each schedule\u0027s own hour labels are checked separately.", + "orientation: SAM North Angle unstated (writer default 0); Coordinate System Relative; IDF Building North Axis blank (EnergyPlus default 0): the native building is unrotated, as SAM states", + "multiplicity: 1 IDF zone(s) (1 with their OS:ThermalZone), 0 ZoneGroup(s), 2 IDF subsurface(s) (2 with their OS:SubSurface) read; blank multipliers are the EnergyPlus default 1; every effective multiplier is 1, as SAM states", + "space:5080c000-0000-0000-0000-00000000c001 \u0027FixBox\u0027 = native space \u0027SAM_Space_FixBox_5080c000\u0027 by geometry (6 surfaces one to one); name carrier agrees", + "space:5080c000-0000-0000-0000-00000000c001: native signed shell volume 76.608 m3 (positive = outward-facing surfaces)", + "space:5080c000-0000-0000-0000-00000000c001: D-F9 stored volume 76.608 m3 vs geometric 76.608 m3: Identical", + "aperture:95717805-e6c7-4051-9c99-937da3d94f15@space:5080c000-0000-0000-0000-00000000c001: native subsurface \u0027SAM_SubSurface_FIX_WIN_FRAMED_0_95717805\u0027 with frame \u0027SAM_SubSurface_FIX_WIN_FRAMED_0_95717805_FrameAndDivider\u0027, identity Verified", + "aperture:95717805-e6c7-4051-9c99-937da3d94f15@space:5080c000-0000-0000-0000-00000000c001: native frame width 0.065 m; SAM T-FRAME OpenStudio rule: DefaultFrameWidth, else the frame layer thickness (pane = face offset inwards by 0.065 m)", + "aperture:6adea09c-1557-4dfd-bfab-75f66600343f@space:5080c000-0000-0000-0000-00000000c001: native subsurface \u0027SAM_SubSurface_FIX_WIN_UNFRAMED_0_6adea09c\u0027 (no frame), identity Verified", + "space:5080c000-0000-0000-0000-00000000c001: D-F2 V2; selection FIX_IC_BOX_VNT; requirement Value(0.03)", + "Ideal Loads \u0027SAM_IdealLoads_FixBox_5080c000\u0027: DCV \u0027None\u0027, economizer \u0027NoEconomizer\u0027, heat recovery \u0027None\u0027, availability \u0027\u0027", + "space:5080c000-0000-0000-0000-00000000c001: OSM DSOA \u0027SAM_InternalCondition_FIX_IC_BOX_af50b3dc_DesignSpecificationOutdoorAir\u0027 inherited from SpaceType \u0027SAM_InternalCondition_FIX_IC_BOX_af50b3dc\u0027; IDF Ideal Loads names \u0027SAM_InternalCondition_FIX_IC_BOX_af50b3dc_DesignSpecificationOutdoorAir\u0027", + "weather: run EPW sha256 472ffb4e2f10867600949a392ce46891fc1bd05f2fc8d8917a99bca7d26209c3; the OSM references a file with sha256 472ffb4e2f10867600949a392ce46891fc1bd05f2fc8d8917a99bca7d26209c3", + "weather: Site:GroundTemperature:BuildingSurface 4.58, 1.15, 0.22, 1.03, 5.66, 10.85, 15.73, 19.27, 20.3, 18.64, 14.64, 9.6 (9.ground, not gated)", + "design days: SAM states 0 (none); the IDF has 0 sizing period(s)", + "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c): 105 row-3a opaque optical row(s) on faces EnergyPlus 25.1 does not use are OUT-OF-ENGINE-SCOPE (informational, not gated): 69 differ from the native value, 36 equal it. Each holds a valid authored value and a valid native value on a face whose role S09 derived from SAM, the side and the native boundary. Every used face (each innermost layer\u0027s zone face, each outdoor outermost face), every thickness, conductivity, density and specific heat, and every row that is not valid and comparable is gated." + ], + "Inputs": { + "label": "box-repeat", + "modelSha256": "45524172b32f85df89511dd344141023de999faa9552a199e6b49062612acd08", + "epwSha256": "472ffb4e2f10867600949a392ce46891fc1bd05f2fc8d8917a99bca7d26209c3", + "osmSha256": "49cf3342ac161d0fb0e75c852103a50ba713e0be6b58195a076e08500279eb03", + "idfSha256": "46a6ce6fccc6faf13c4f167cc11c483a64caf47a578490984faa4b942d726baa", + "openStudioSdk": "3.10.0\u002B86d7e215a1", + "writerSha256": "67a2ded78a22c9b83f5b536dc7b202314a686fe8c7718119afb676714a84e798", + "readerSha256": "d2368ce851b869138b386697e4ef3c9e74b2cb86ef80077133172378517ed4a5", + "exportPid": "48004", + "readerPid": "45468", + "comparePid": "47584", + "exportProcessStartedUtc": "2026-10-23T11:27:12.4785361Z", + "readerProcessStartedUtc": "2026-10-23T11:27:16.0459058Z", + "compareProcessStartedUtc": "2026-10-23T11:27:16.4532415Z", + "mutation": null, + "writerDiagnostics": "Information SAM-OS-IC-002 Lighting radiant proportion p = 0.37 (authored) is split under S07 \u00A75.1 T-LIGHT-SPLIT: Fraction Radiant = p\u00B7(1 \u2212 s) = 0.21487, Fraction Visible = p\u00B7s = 0.15513, Return Air Fraction 0, convective 1 \u2212 p = 0.63; s = 0.2415 / 0.576 = 0.4192708 (short-wave share of the radiant output). s is a declared assumption, not SAM data. Reference category: suspended (pendant) LED office lighting with the entire fitting in the conditioned room; a midpoint-derived reference from cited historical ranges (IEA SHC Task 61 / EBC Annex 77 D1, Table 6; ASHRAE Fundamentals 2017, Ch. 18, Table 3), not manufacturer-certified. Not applicable to recessed troffers, downlights, retrofit kits, high-bays or non-LED lamps. | Information SAM-OS-RUN-002 Annual weather source: explicit EPW (weather.epw) | Information SAM-OS-RUN-002 Ground temperatures taken from the EPW GROUND TEMPERATURES header (depth 0.5 m set, 12 monthly values) | Information SAM-OS-RUN-002 No design-day source supplied; sizing-period runs stay disabled unless OpenStudioConversionOptions.RunSizingPeriods overrides", + "translatorMessages": "0" + } +} \ No newline at end of file diff --git a/documentation/S09-OpenStudio-InputReadBack-evidence/acceptance-2026-10-23/runs/box-repeat/report-approved.txt b/documentation/S09-OpenStudio-InputReadBack-evidence/acceptance-2026-10-23/runs/box-repeat/report-approved.txt new file mode 100644 index 0000000..28008a5 --- /dev/null +++ b/documentation/S09-OpenStudio-InputReadBack-evidence/acceptance-2026-10-23/runs/box-repeat/report-approved.txt @@ -0,0 +1,17 @@ +S09 OpenStudio read-back: s08-fix-box -> Pass (exit 0); rule set Approved; gate Pass; coverage Complete (319 required, 319 results); gated non-PASS 0; out-of-engine-scope 105 (informational, not gated) +outcomes: AcceptedTransformation 4, Match 183, NotApplicable 1, OutOfEngineScope 105, WithinTolerance 26 +D-F2 space:5080c000-0000-0000-0000-00000000c001: V2 +OUT-OF-ENGINE-SCOPE (informational, not gated; S07 §5.2 amendment U1 (SAM#218 b06dbe8c)): 105 row(s), 69 differing, 36 equal; by scope: buried layer face 102, ground surface outer face 3; by property: externalEmissivity 18, externalLightReflectance 18, externalSolarReflectance 18, internalEmissivity 17, internalLightReflectance 17, internalSolarReflectance 17 + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.externalSolarReflectance: SAM 0.31, native 0.31000000000000005, |d| 5.551115123125783E-17 (WithinTolerance); ground surface outer face; SAM 'FIX_Concrete', native 'SAM_OpaqueMaterial_FIX_Concrete_150mm_9d3a3ab2' + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.internalSolarReflectance: SAM 0.29, native 0.31000000000000005, |d| 0.020000000000000073 (OutsideTolerance); buried layer face (layer 1 of 3, SAM internal face); SAM 'FIX_Concrete', native 'SAM_OpaqueMaterial_FIX_Concrete_150mm_9d3a3ab2' + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.externalLightReflectance: SAM 0.32, native 0.31999999999999995, |d| 5.551115123125783E-17 (WithinTolerance); ground surface outer face; SAM 'FIX_Concrete', native 'SAM_OpaqueMaterial_FIX_Concrete_150mm_9d3a3ab2' + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.internalLightReflectance: SAM 0.3, native 0.31999999999999995, |d| 0.019999999999999962 (OutsideTolerance); buried layer face (layer 1 of 3, SAM internal face); SAM 'FIX_Concrete', native 'SAM_OpaqueMaterial_FIX_Concrete_150mm_9d3a3ab2' + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.externalEmissivity: SAM 0.95, native 0.95, |d| 0 (Identical); ground surface outer face; SAM 'FIX_Concrete', native 'SAM_OpaqueMaterial_FIX_Concrete_150mm_9d3a3ab2' + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.internalEmissivity: SAM 0.87, native 0.95, |d| 0.07999999999999996 (OutsideTolerance); buried layer face (layer 1 of 3, SAM internal face); SAM 'FIX_Concrete', native 'SAM_OpaqueMaterial_FIX_Concrete_150mm_9d3a3ab2' + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.externalSolarReflectance: SAM 0.58, native 0.5800000000000001, |d| 1.1102230246251565E-16 (WithinTolerance); buried layer face (layer 2 of 3, SAM external face); SAM 'FIX_EPS', native 'SAM_OpaqueMaterial_FIX_EPS_120mm_23500162' + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.internalSolarReflectance: SAM 0.61, native 0.5800000000000001, |d| 0.029999999999999916 (OutsideTolerance); buried layer face (layer 2 of 3, SAM internal face); SAM 'FIX_EPS', native 'SAM_OpaqueMaterial_FIX_EPS_120mm_23500162' + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.externalLightReflectance: SAM 0.59, native 0.5900000000000001, |d| 1.1102230246251565E-16 (WithinTolerance); buried layer face (layer 2 of 3, SAM external face); SAM 'FIX_EPS', native 'SAM_OpaqueMaterial_FIX_EPS_120mm_23500162' + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.internalLightReflectance: SAM 0.63, native 0.5900000000000001, |d| 0.039999999999999925 (OutsideTolerance); buried layer face (layer 2 of 3, SAM internal face); SAM 'FIX_EPS', native 'SAM_OpaqueMaterial_FIX_EPS_120mm_23500162' + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.externalEmissivity: SAM 0.85, native 0.85, |d| 0 (Identical); buried layer face (layer 2 of 3, SAM external face); SAM 'FIX_EPS', native 'SAM_OpaqueMaterial_FIX_EPS_120mm_23500162' + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.internalEmissivity: SAM 0.96, native 0.85, |d| 0.10999999999999999 (OutsideTolerance); buried layer face (layer 2 of 3, SAM internal face); SAM 'FIX_EPS', native 'SAM_OpaqueMaterial_FIX_EPS_120mm_23500162' + ... 93 more in report.json diff --git a/documentation/S09-OpenStudio-InputReadBack-evidence/acceptance-2026-10-23/runs/box-repeat/report-provisional.txt b/documentation/S09-OpenStudio-InputReadBack-evidence/acceptance-2026-10-23/runs/box-repeat/report-provisional.txt new file mode 100644 index 0000000..2b63ce9 --- /dev/null +++ b/documentation/S09-OpenStudio-InputReadBack-evidence/acceptance-2026-10-23/runs/box-repeat/report-provisional.txt @@ -0,0 +1,17 @@ +S09 OpenStudio read-back: s08-fix-box -> Pass (exit 0); rule set ProvisionalProposed; gate Pass; coverage Complete (319 required, 319 results); gated non-PASS 0; out-of-engine-scope 105 (informational, not gated) +outcomes: AcceptedTransformation 4, Match 183, NotApplicable 1, OutOfEngineScope 105, WithinTolerance 26 +D-F2 space:5080c000-0000-0000-0000-00000000c001: V2 +OUT-OF-ENGINE-SCOPE (informational, not gated; S07 §5.2 amendment U1 (SAM#218 b06dbe8c)): 105 row(s), 69 differing, 36 equal; by scope: buried layer face 102, ground surface outer face 3; by property: externalEmissivity 18, externalLightReflectance 18, externalSolarReflectance 18, internalEmissivity 17, internalLightReflectance 17, internalSolarReflectance 17 + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.externalSolarReflectance: SAM 0.31, native 0.31000000000000005, |d| 5.551115123125783E-17 (WithinTolerance); ground surface outer face; SAM 'FIX_Concrete', native 'SAM_OpaqueMaterial_FIX_Concrete_150mm_9d3a3ab2' + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.internalSolarReflectance: SAM 0.29, native 0.31000000000000005, |d| 0.020000000000000073 (OutsideTolerance); buried layer face (layer 1 of 3, SAM internal face); SAM 'FIX_Concrete', native 'SAM_OpaqueMaterial_FIX_Concrete_150mm_9d3a3ab2' + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.externalLightReflectance: SAM 0.32, native 0.31999999999999995, |d| 5.551115123125783E-17 (WithinTolerance); ground surface outer face; SAM 'FIX_Concrete', native 'SAM_OpaqueMaterial_FIX_Concrete_150mm_9d3a3ab2' + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.internalLightReflectance: SAM 0.3, native 0.31999999999999995, |d| 0.019999999999999962 (OutsideTolerance); buried layer face (layer 1 of 3, SAM internal face); SAM 'FIX_Concrete', native 'SAM_OpaqueMaterial_FIX_Concrete_150mm_9d3a3ab2' + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.externalEmissivity: SAM 0.95, native 0.95, |d| 0 (Identical); ground surface outer face; SAM 'FIX_Concrete', native 'SAM_OpaqueMaterial_FIX_Concrete_150mm_9d3a3ab2' + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.internalEmissivity: SAM 0.87, native 0.95, |d| 0.07999999999999996 (OutsideTolerance); buried layer face (layer 1 of 3, SAM internal face); SAM 'FIX_Concrete', native 'SAM_OpaqueMaterial_FIX_Concrete_150mm_9d3a3ab2' + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.externalSolarReflectance: SAM 0.58, native 0.5800000000000001, |d| 1.1102230246251565E-16 (WithinTolerance); buried layer face (layer 2 of 3, SAM external face); SAM 'FIX_EPS', native 'SAM_OpaqueMaterial_FIX_EPS_120mm_23500162' + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.internalSolarReflectance: SAM 0.61, native 0.5800000000000001, |d| 0.029999999999999916 (OutsideTolerance); buried layer face (layer 2 of 3, SAM internal face); SAM 'FIX_EPS', native 'SAM_OpaqueMaterial_FIX_EPS_120mm_23500162' + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.externalLightReflectance: SAM 0.59, native 0.5900000000000001, |d| 1.1102230246251565E-16 (WithinTolerance); buried layer face (layer 2 of 3, SAM external face); SAM 'FIX_EPS', native 'SAM_OpaqueMaterial_FIX_EPS_120mm_23500162' + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.internalLightReflectance: SAM 0.63, native 0.5900000000000001, |d| 0.039999999999999925 (OutsideTolerance); buried layer face (layer 2 of 3, SAM internal face); SAM 'FIX_EPS', native 'SAM_OpaqueMaterial_FIX_EPS_120mm_23500162' + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.externalEmissivity: SAM 0.85, native 0.85, |d| 0 (Identical); buried layer face (layer 2 of 3, SAM external face); SAM 'FIX_EPS', native 'SAM_OpaqueMaterial_FIX_EPS_120mm_23500162' + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.internalEmissivity: SAM 0.96, native 0.85, |d| 0.10999999999999999 (OutsideTolerance); buried layer face (layer 2 of 3, SAM internal face); SAM 'FIX_EPS', native 'SAM_OpaqueMaterial_FIX_EPS_120mm_23500162' + ... 93 more in report.json diff --git a/documentation/S09-OpenStudio-InputReadBack-evidence/acceptance-2026-10-23/runs/box/export.json b/documentation/S09-OpenStudio-InputReadBack-evidence/acceptance-2026-10-23/runs/box/export.json new file mode 100644 index 0000000..9107664 --- /dev/null +++ b/documentation/S09-OpenStudio-InputReadBack-evidence/acceptance-2026-10-23/runs/box/export.json @@ -0,0 +1,37 @@ +{ + "Schema": "s09-export/2", + "Label": "box", + "Mutation": null, + "SourceModelPath": "/s08-fix-box.json", + "SourceEpwPath": "/budapest.epw", + "ModelSha256": "45524172b32f85df89511dd344141023de999faa9552a199e6b49062612acd08", + "EpwSha256": "472ffb4e2f10867600949a392ce46891fc1bd05f2fc8d8917a99bca7d26209c3", + "OsmSha256": "068dcddfc2dd2424fded429b2f0d42ee3ca1bda30c4ff9b67ae80f7295cd0ecd", + "IdfSha256": "46a6ce6fccc6faf13c4f167cc11c483a64caf47a578490984faa4b942d726baa", + "OpenStudioSdkVersion": "3.10.0\u002B86d7e215a1", + "WriterAssembly": "/SAM.Analytical.OpenStudio.dll", + "WriterAssemblySha256": "67a2ded78a22c9b83f5b536dc7b202314a686fe8c7718119afb676714a84e798", + "ProcessId": 44776, + "ProcessStartedUtc": "2026-10-23T11:27:00.3636738Z", + "StartedUtc": "2026-10-23T11:27:00.4530942Z", + "FinishedUtc": "2026-10-23T11:27:03.7068444Z", + "ConversionValid": true, + "Diagnostics": [ + "Information SAM-OS-IC-002 Lighting radiant proportion p = 0.37 (authored) is split under S07 \u00A75.1 T-LIGHT-SPLIT: Fraction Radiant = p\u00B7(1 \u2212 s) = 0.21487, Fraction Visible = p\u00B7s = 0.15513, Return Air Fraction 0, convective 1 \u2212 p = 0.63; s = 0.2415 / 0.576 = 0.4192708 (short-wave share of the radiant output). s is a declared assumption, not SAM data. Reference category: suspended (pendant) LED office lighting with the entire fitting in the conditioned room; a midpoint-derived reference from cited historical ranges (IEA SHC Task 61 / EBC Annex 77 D1, Table 6; ASHRAE Fundamentals 2017, Ch. 18, Table 3), not manufacturer-certified. Not applicable to recessed troffers, downlights, retrofit kits, high-bays or non-LED lamps.", + "Information SAM-OS-MAT-002 Vapour diffusion factor (110) is not converted \u2014 EnergyPlus moisture modelling (HAMT/EMPD) needs data SAM does not carry", + "Information SAM-OS-MAT-002 Vapour diffusion factor (40) is not converted \u2014 EnergyPlus moisture modelling (HAMT/EMPD) needs data SAM does not carry", + "Information SAM-OS-MAT-002 Vapour diffusion factor (15) is not converted \u2014 EnergyPlus moisture modelling (HAMT/EMPD) needs data SAM does not carry", + "Information SAM-OS-MAT-002 Vapour diffusion factor (5E\u002B04) is not converted \u2014 EnergyPlus moisture modelling (HAMT/EMPD) needs data SAM does not carry", + "Information SAM-OS-MAT-002 Vapour diffusion factor (165) is not converted \u2014 EnergyPlus moisture modelling (HAMT/EMPD) needs data SAM does not carry", + "Information SAM-OS-MAT-002 Vapour diffusion factor (60) is not converted \u2014 EnergyPlus moisture modelling (HAMT/EMPD) needs data SAM does not carry", + "Information SAM-OS-MAT-002 Vapour diffusion factor (8) is not converted \u2014 EnergyPlus moisture modelling (HAMT/EMPD) needs data SAM does not carry", + "Information SAM-OS-MAT-002 Vapour diffusion factor (25) is not converted \u2014 EnergyPlus moisture modelling (HAMT/EMPD) needs data SAM does not carry", + "Information SAM-OS-MAT-002 Vapour diffusion factor (10) is not converted \u2014 EnergyPlus moisture modelling (HAMT/EMPD) needs data SAM does not carry", + "Information SAM-OS-MAT-002 Vapour diffusion factor (1.2) is not converted \u2014 EnergyPlus moisture modelling (HAMT/EMPD) needs data SAM does not carry", + "Information SAM-OS-MAT-002 Vapour diffusion factor (1E\u002B05) is not converted \u2014 EnergyPlus moisture modelling (HAMT/EMPD) needs data SAM does not carry", + "Information SAM-OS-RUN-002 Annual weather source: explicit EPW (weather.epw)", + "Information SAM-OS-RUN-002 Ground temperatures taken from the EPW GROUND TEMPERATURES header (depth 0.5 m set, 12 monthly values)", + "Information SAM-OS-RUN-002 No design-day source supplied; sizing-period runs stay disabled unless OpenStudioConversionOptions.RunSizingPeriods overrides" + ], + "TranslatorMessages": [] +} \ No newline at end of file diff --git a/documentation/S09-OpenStudio-InputReadBack-evidence/acceptance-2026-10-23/runs/box/report-approved.json b/documentation/S09-OpenStudio-InputReadBack-evidence/acceptance-2026-10-23/runs/box/report-approved.json new file mode 100644 index 0000000..74a268e --- /dev/null +++ b/documentation/S09-OpenStudio-InputReadBack-evidence/acceptance-2026-10-23/runs/box/report-approved.json @@ -0,0 +1,2077 @@ +{ + "Schema": "s09-readback-report/3", + "FixtureId": "s08-fix-box", + "RuleSet": "Approved", + "Status": "Pass", + "ExitCode": 0, + "GateStatus": "Pass", + "Coverage": "Complete", + "Required": 319, + "Results": 319, + "MissingComparisons": [], + "CountByOutcome": { + "AcceptedTransformation": 4, + "Match": 183, + "NotApplicable": 1, + "OutOfEngineScope": 105, + "WithinTolerance": 26 + }, + "NonPass": [], + "GatedNonPass": 0, + "OutOfEngineScope": { + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)", + "Count": 105, + "Differing": 69, + "Equal": 36, + "CountByScope": { + "buried layer face": 102, + "ground surface outer face": 3 + }, + "CountByProperty": { + "externalEmissivity": 18, + "externalLightReflectance": 18, + "externalSolarReflectance": 18, + "internalEmissivity": 17, + "internalLightReflectance": 17, + "internalSolarReflectance": 17 + }, + "Rows": [ + { + "Quantity": "3a", + "Key": "panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.externalSolarReflectance", + "Side": "panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001", + "Layer": 1, + "LayerCount": 3, + "Property": "externalSolarReflectance", + "SamFace": "external", + "SamMaterial": "FIX_Concrete", + "NativeObject": "SAM_OpaqueMaterial_FIX_Concrete_150mm_9d3a3ab2", + "SamValue": 0.31, + "NativeValue": 0.31000000000000005, + "Delta": 5.551115123125783E-17, + "NumericVerdict": "WithinTolerance", + "Differs": false, + "ScopeReason": "ground surface outer face", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.internalSolarReflectance", + "Side": "panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001", + "Layer": 1, + "LayerCount": 3, + "Property": "internalSolarReflectance", + "SamFace": "internal", + "SamMaterial": "FIX_Concrete", + "NativeObject": "SAM_OpaqueMaterial_FIX_Concrete_150mm_9d3a3ab2", + "SamValue": 0.29, + "NativeValue": 0.31000000000000005, + "Delta": 0.020000000000000073, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 1 of 3, SAM internal face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.externalLightReflectance", + "Side": "panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001", + "Layer": 1, + "LayerCount": 3, + "Property": "externalLightReflectance", + "SamFace": "external", + "SamMaterial": "FIX_Concrete", + "NativeObject": "SAM_OpaqueMaterial_FIX_Concrete_150mm_9d3a3ab2", + "SamValue": 0.32, + "NativeValue": 0.31999999999999995, + "Delta": 5.551115123125783E-17, + "NumericVerdict": "WithinTolerance", + "Differs": false, + "ScopeReason": "ground surface outer face", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.internalLightReflectance", + "Side": "panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001", + "Layer": 1, + "LayerCount": 3, + "Property": "internalLightReflectance", + "SamFace": "internal", + "SamMaterial": "FIX_Concrete", + "NativeObject": "SAM_OpaqueMaterial_FIX_Concrete_150mm_9d3a3ab2", + "SamValue": 0.3, + "NativeValue": 0.31999999999999995, + "Delta": 0.019999999999999962, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 1 of 3, SAM internal face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.externalEmissivity", + "Side": "panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001", + "Layer": 1, + "LayerCount": 3, + "Property": "externalEmissivity", + "SamFace": "external", + "SamMaterial": "FIX_Concrete", + "NativeObject": "SAM_OpaqueMaterial_FIX_Concrete_150mm_9d3a3ab2", + "SamValue": 0.95, + "NativeValue": 0.95, + "Delta": 0, + "NumericVerdict": "Identical", + "Differs": false, + "ScopeReason": "ground surface outer face", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.internalEmissivity", + "Side": "panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001", + "Layer": 1, + "LayerCount": 3, + "Property": "internalEmissivity", + "SamFace": "internal", + "SamMaterial": "FIX_Concrete", + "NativeObject": "SAM_OpaqueMaterial_FIX_Concrete_150mm_9d3a3ab2", + "SamValue": 0.87, + "NativeValue": 0.95, + "Delta": 0.07999999999999996, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 1 of 3, SAM internal face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.externalSolarReflectance", + "Side": "panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001", + "Layer": 2, + "LayerCount": 3, + "Property": "externalSolarReflectance", + "SamFace": "external", + "SamMaterial": "FIX_EPS", + "NativeObject": "SAM_OpaqueMaterial_FIX_EPS_120mm_23500162", + "SamValue": 0.58, + "NativeValue": 0.5800000000000001, + "Delta": 1.1102230246251565E-16, + "NumericVerdict": "WithinTolerance", + "Differs": false, + "ScopeReason": "buried layer face (layer 2 of 3, SAM external face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.internalSolarReflectance", + "Side": "panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001", + "Layer": 2, + "LayerCount": 3, + "Property": "internalSolarReflectance", + "SamFace": "internal", + "SamMaterial": "FIX_EPS", + "NativeObject": "SAM_OpaqueMaterial_FIX_EPS_120mm_23500162", + "SamValue": 0.61, + "NativeValue": 0.5800000000000001, + "Delta": 0.029999999999999916, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 2 of 3, SAM internal face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.externalLightReflectance", + "Side": "panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001", + "Layer": 2, + "LayerCount": 3, + "Property": "externalLightReflectance", + "SamFace": "external", + "SamMaterial": "FIX_EPS", + "NativeObject": "SAM_OpaqueMaterial_FIX_EPS_120mm_23500162", + "SamValue": 0.59, + "NativeValue": 0.5900000000000001, + "Delta": 1.1102230246251565E-16, + "NumericVerdict": "WithinTolerance", + "Differs": false, + "ScopeReason": "buried layer face (layer 2 of 3, SAM external face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.internalLightReflectance", + "Side": "panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001", + "Layer": 2, + "LayerCount": 3, + "Property": "internalLightReflectance", + "SamFace": "internal", + "SamMaterial": "FIX_EPS", + "NativeObject": "SAM_OpaqueMaterial_FIX_EPS_120mm_23500162", + "SamValue": 0.63, + "NativeValue": 0.5900000000000001, + "Delta": 0.039999999999999925, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 2 of 3, SAM internal face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.externalEmissivity", + "Side": "panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001", + "Layer": 2, + "LayerCount": 3, + "Property": "externalEmissivity", + "SamFace": "external", + "SamMaterial": "FIX_EPS", + "NativeObject": "SAM_OpaqueMaterial_FIX_EPS_120mm_23500162", + "SamValue": 0.85, + "NativeValue": 0.85, + "Delta": 0, + "NumericVerdict": "Identical", + "Differs": false, + "ScopeReason": "buried layer face (layer 2 of 3, SAM external face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.internalEmissivity", + "Side": "panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001", + "Layer": 2, + "LayerCount": 3, + "Property": "internalEmissivity", + "SamFace": "internal", + "SamMaterial": "FIX_EPS", + "NativeObject": "SAM_OpaqueMaterial_FIX_EPS_120mm_23500162", + "SamValue": 0.96, + "NativeValue": 0.85, + "Delta": 0.10999999999999999, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 2 of 3, SAM internal face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer3.externalSolarReflectance", + "Side": "panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001", + "Layer": 3, + "LayerCount": 3, + "Property": "externalSolarReflectance", + "SamFace": "external", + "SamMaterial": "FIX_Screed", + "NativeObject": "SAM_OpaqueMaterial_FIX_Screed_65mm_Internal_47d4de1a", + "SamValue": 0.27, + "NativeValue": 0.32999999999999996, + "Delta": 0.05999999999999994, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 3 of 3, SAM external face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer3.externalLightReflectance", + "Side": "panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001", + "Layer": 3, + "LayerCount": 3, + "Property": "externalLightReflectance", + "SamFace": "external", + "SamMaterial": "FIX_Screed", + "NativeObject": "SAM_OpaqueMaterial_FIX_Screed_65mm_Internal_47d4de1a", + "SamValue": 0.28, + "NativeValue": 0.33999999999999997, + "Delta": 0.05999999999999994, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 3 of 3, SAM external face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer3.externalEmissivity", + "Side": "panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001", + "Layer": 3, + "LayerCount": 3, + "Property": "externalEmissivity", + "SamFace": "external", + "SamMaterial": "FIX_Screed", + "NativeObject": "SAM_OpaqueMaterial_FIX_Screed_65mm_Internal_47d4de1a", + "SamValue": 0.94, + "NativeValue": 0.9, + "Delta": 0.039999999999999925, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 3 of 3, SAM external face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:285a1884-d494-47a6-9541-942946ea00a7@space:5080c000-0000-0000-0000-00000000c001#layer1.internalSolarReflectance", + "Side": "panel:285a1884-d494-47a6-9541-942946ea00a7@space:5080c000-0000-0000-0000-00000000c001", + "Layer": 1, + "LayerCount": 4, + "Property": "internalSolarReflectance", + "SamFace": "internal", + "SamMaterial": "FIX_Membrane", + "NativeObject": "SAM_OpaqueMaterial_FIX_Membrane_4mm_379ce52b", + "SamValue": 0.24, + "NativeValue": 0.14, + "Delta": 0.09999999999999998, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 1 of 4, SAM internal face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:285a1884-d494-47a6-9541-942946ea00a7@space:5080c000-0000-0000-0000-00000000c001#layer1.internalLightReflectance", + "Side": "panel:285a1884-d494-47a6-9541-942946ea00a7@space:5080c000-0000-0000-0000-00000000c001", + "Layer": 1, + "LayerCount": 4, + "Property": "internalLightReflectance", + "SamFace": "internal", + "SamMaterial": "FIX_Membrane", + "NativeObject": "SAM_OpaqueMaterial_FIX_Membrane_4mm_379ce52b", + "SamValue": 0.25, + "NativeValue": 0.15000000000000002, + "Delta": 0.09999999999999998, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 1 of 4, SAM internal face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:285a1884-d494-47a6-9541-942946ea00a7@space:5080c000-0000-0000-0000-00000000c001#layer1.internalEmissivity", + "Side": "panel:285a1884-d494-47a6-9541-942946ea00a7@space:5080c000-0000-0000-0000-00000000c001", + "Layer": 1, + "LayerCount": 4, + "Property": "internalEmissivity", + "SamFace": "internal", + "SamMaterial": "FIX_Membrane", + "NativeObject": "SAM_OpaqueMaterial_FIX_Membrane_4mm_379ce52b", + "SamValue": 0.86, + "NativeValue": 0.92, + "Delta": 0.06000000000000005, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 1 of 4, SAM internal face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:285a1884-d494-47a6-9541-942946ea00a7@space:5080c000-0000-0000-0000-00000000c001#layer2.externalSolarReflectance", + "Side": "panel:285a1884-d494-47a6-9541-942946ea00a7@space:5080c000-0000-0000-0000-00000000c001", + "Layer": 2, + "LayerCount": 4, + "Property": "externalSolarReflectance", + "SamFace": "external", + "SamMaterial": "FIX_OSB", + "NativeObject": "SAM_OpaqueMaterial_FIX_OSB_18mm_b65fc732", + "SamValue": 0.43, + "NativeValue": 0.43000000000000005, + "Delta": 5.551115123125783E-17, + "NumericVerdict": "WithinTolerance", + "Differs": false, + "ScopeReason": "buried layer face (layer 2 of 4, SAM external face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:285a1884-d494-47a6-9541-942946ea00a7@space:5080c000-0000-0000-0000-00000000c001#layer2.internalSolarReflectance", + "Side": "panel:285a1884-d494-47a6-9541-942946ea00a7@space:5080c000-0000-0000-0000-00000000c001", + "Layer": 2, + "LayerCount": 4, + "Property": "internalSolarReflectance", + "SamFace": "internal", + "SamMaterial": "FIX_OSB", + "NativeObject": "SAM_OpaqueMaterial_FIX_OSB_18mm_b65fc732", + "SamValue": 0.47, + "NativeValue": 0.43000000000000005, + "Delta": 0.039999999999999925, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 2 of 4, SAM internal face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:285a1884-d494-47a6-9541-942946ea00a7@space:5080c000-0000-0000-0000-00000000c001#layer2.externalLightReflectance", + "Side": "panel:285a1884-d494-47a6-9541-942946ea00a7@space:5080c000-0000-0000-0000-00000000c001", + "Layer": 2, + "LayerCount": 4, + "Property": "externalLightReflectance", + "SamFace": "external", + "SamMaterial": "FIX_OSB", + "NativeObject": "SAM_OpaqueMaterial_FIX_OSB_18mm_b65fc732", + "SamValue": 0.42, + "NativeValue": 0.42000000000000004, + "Delta": 5.551115123125783E-17, + "NumericVerdict": "WithinTolerance", + "Differs": false, + "ScopeReason": "buried layer face (layer 2 of 4, SAM external face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:285a1884-d494-47a6-9541-942946ea00a7@space:5080c000-0000-0000-0000-00000000c001#layer2.internalLightReflectance", + "Side": "panel:285a1884-d494-47a6-9541-942946ea00a7@space:5080c000-0000-0000-0000-00000000c001", + "Layer": 2, + "LayerCount": 4, + "Property": "internalLightReflectance", + "SamFace": "internal", + "SamMaterial": "FIX_OSB", + "NativeObject": "SAM_OpaqueMaterial_FIX_OSB_18mm_b65fc732", + "SamValue": 0.48, + "NativeValue": 0.42000000000000004, + "Delta": 0.05999999999999994, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 2 of 4, SAM internal face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:285a1884-d494-47a6-9541-942946ea00a7@space:5080c000-0000-0000-0000-00000000c001#layer2.externalEmissivity", + "Side": "panel:285a1884-d494-47a6-9541-942946ea00a7@space:5080c000-0000-0000-0000-00000000c001", + "Layer": 2, + "LayerCount": 4, + "Property": "externalEmissivity", + "SamFace": "external", + "SamMaterial": "FIX_OSB", + "NativeObject": "SAM_OpaqueMaterial_FIX_OSB_18mm_b65fc732", + "SamValue": 0.91, + "NativeValue": 0.91, + "Delta": 0, + "NumericVerdict": "Identical", + "Differs": false, + "ScopeReason": "buried layer face (layer 2 of 4, SAM external face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:285a1884-d494-47a6-9541-942946ea00a7@space:5080c000-0000-0000-0000-00000000c001#layer2.internalEmissivity", + "Side": "panel:285a1884-d494-47a6-9541-942946ea00a7@space:5080c000-0000-0000-0000-00000000c001", + "Layer": 2, + "LayerCount": 4, + "Property": "internalEmissivity", + "SamFace": "internal", + "SamMaterial": "FIX_OSB", + "NativeObject": "SAM_OpaqueMaterial_FIX_OSB_18mm_b65fc732", + "SamValue": 0.89, + "NativeValue": 0.91, + "Delta": 0.020000000000000018, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 2 of 4, SAM internal face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:285a1884-d494-47a6-9541-942946ea00a7@space:5080c000-0000-0000-0000-00000000c001#layer3.externalSolarReflectance", + "Side": "panel:285a1884-d494-47a6-9541-942946ea00a7@space:5080c000-0000-0000-0000-00000000c001", + "Layer": 3, + "LayerCount": 4, + "Property": "externalSolarReflectance", + "SamFace": "external", + "SamMaterial": "FIX_PIR", + "NativeObject": "SAM_OpaqueMaterial_FIX_PIR_160mm_afdb47df", + "SamValue": 0.53, + "NativeValue": 0.53, + "Delta": 0, + "NumericVerdict": "Identical", + "Differs": false, + "ScopeReason": "buried layer face (layer 3 of 4, SAM external face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:285a1884-d494-47a6-9541-942946ea00a7@space:5080c000-0000-0000-0000-00000000c001#layer3.internalSolarReflectance", + "Side": "panel:285a1884-d494-47a6-9541-942946ea00a7@space:5080c000-0000-0000-0000-00000000c001", + "Layer": 3, + "LayerCount": 4, + "Property": "internalSolarReflectance", + "SamFace": "internal", + "SamMaterial": "FIX_PIR", + "NativeObject": "SAM_OpaqueMaterial_FIX_PIR_160mm_afdb47df", + "SamValue": 0.55, + "NativeValue": 0.53, + "Delta": 0.020000000000000018, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 3 of 4, SAM internal face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:285a1884-d494-47a6-9541-942946ea00a7@space:5080c000-0000-0000-0000-00000000c001#layer3.externalLightReflectance", + "Side": "panel:285a1884-d494-47a6-9541-942946ea00a7@space:5080c000-0000-0000-0000-00000000c001", + "Layer": 3, + "LayerCount": 4, + "Property": "externalLightReflectance", + "SamFace": "external", + "SamMaterial": "FIX_PIR", + "NativeObject": "SAM_OpaqueMaterial_FIX_PIR_160mm_afdb47df", + "SamValue": 0.54, + "NativeValue": 0.54, + "Delta": 0, + "NumericVerdict": "Identical", + "Differs": false, + "ScopeReason": "buried layer face (layer 3 of 4, SAM external face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:285a1884-d494-47a6-9541-942946ea00a7@space:5080c000-0000-0000-0000-00000000c001#layer3.internalLightReflectance", + "Side": "panel:285a1884-d494-47a6-9541-942946ea00a7@space:5080c000-0000-0000-0000-00000000c001", + "Layer": 3, + "LayerCount": 4, + "Property": "internalLightReflectance", + "SamFace": "internal", + "SamMaterial": "FIX_PIR", + "NativeObject": "SAM_OpaqueMaterial_FIX_PIR_160mm_afdb47df", + "SamValue": 0.56, + "NativeValue": 0.54, + "Delta": 0.020000000000000018, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 3 of 4, SAM internal face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:285a1884-d494-47a6-9541-942946ea00a7@space:5080c000-0000-0000-0000-00000000c001#layer3.externalEmissivity", + "Side": "panel:285a1884-d494-47a6-9541-942946ea00a7@space:5080c000-0000-0000-0000-00000000c001", + "Layer": 3, + "LayerCount": 4, + "Property": "externalEmissivity", + "SamFace": "external", + "SamMaterial": "FIX_PIR", + "NativeObject": "SAM_OpaqueMaterial_FIX_PIR_160mm_afdb47df", + "SamValue": 0.87, + "NativeValue": 0.87, + "Delta": 0, + "NumericVerdict": "Identical", + "Differs": false, + "ScopeReason": "buried layer face (layer 3 of 4, SAM external face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:285a1884-d494-47a6-9541-942946ea00a7@space:5080c000-0000-0000-0000-00000000c001#layer3.internalEmissivity", + "Side": "panel:285a1884-d494-47a6-9541-942946ea00a7@space:5080c000-0000-0000-0000-00000000c001", + "Layer": 3, + "LayerCount": 4, + "Property": "internalEmissivity", + "SamFace": "internal", + "SamMaterial": "FIX_PIR", + "NativeObject": "SAM_OpaqueMaterial_FIX_PIR_160mm_afdb47df", + "SamValue": 0.95, + "NativeValue": 0.87, + "Delta": 0.07999999999999996, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 3 of 4, SAM internal face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:285a1884-d494-47a6-9541-942946ea00a7@space:5080c000-0000-0000-0000-00000000c001#layer4.externalSolarReflectance", + "Side": "panel:285a1884-d494-47a6-9541-942946ea00a7@space:5080c000-0000-0000-0000-00000000c001", + "Layer": 4, + "LayerCount": 4, + "Property": "externalSolarReflectance", + "SamFace": "external", + "SamMaterial": "FIX_Plasterboard", + "NativeObject": "SAM_OpaqueMaterial_FIX_Plasterboard_15mm_Internal_5abe47a0", + "SamValue": 0.62, + "NativeValue": 0.6799999999999999, + "Delta": 0.05999999999999994, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 4 of 4, SAM external face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:285a1884-d494-47a6-9541-942946ea00a7@space:5080c000-0000-0000-0000-00000000c001#layer4.externalLightReflectance", + "Side": "panel:285a1884-d494-47a6-9541-942946ea00a7@space:5080c000-0000-0000-0000-00000000c001", + "Layer": 4, + "LayerCount": 4, + "Property": "externalLightReflectance", + "SamFace": "external", + "SamMaterial": "FIX_Plasterboard", + "NativeObject": "SAM_OpaqueMaterial_FIX_Plasterboard_15mm_Internal_5abe47a0", + "SamValue": 0.64, + "NativeValue": 0.7, + "Delta": 0.05999999999999994, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 4 of 4, SAM external face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:285a1884-d494-47a6-9541-942946ea00a7@space:5080c000-0000-0000-0000-00000000c001#layer4.externalEmissivity", + "Side": "panel:285a1884-d494-47a6-9541-942946ea00a7@space:5080c000-0000-0000-0000-00000000c001", + "Layer": 4, + "LayerCount": 4, + "Property": "externalEmissivity", + "SamFace": "external", + "SamMaterial": "FIX_Plasterboard", + "NativeObject": "SAM_OpaqueMaterial_FIX_Plasterboard_15mm_Internal_5abe47a0", + "SamValue": 0.9, + "NativeValue": 0.91, + "Delta": 0.010000000000000009, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 4 of 4, SAM external face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:5e4a7125-c77a-4911-9084-7cbfa9b0786c@space:5080c000-0000-0000-0000-00000000c001#layer1.internalSolarReflectance", + "Side": "panel:5e4a7125-c77a-4911-9084-7cbfa9b0786c@space:5080c000-0000-0000-0000-00000000c001", + "Layer": 1, + "LayerCount": 4, + "Property": "internalSolarReflectance", + "SamFace": "internal", + "SamMaterial": "FIX_Render", + "NativeObject": "SAM_OpaqueMaterial_FIX_Render_15mm_f7af24b1", + "SamValue": 0.36, + "NativeValue": 0.5700000000000001, + "Delta": 0.21000000000000008, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 1 of 4, SAM internal face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:5e4a7125-c77a-4911-9084-7cbfa9b0786c@space:5080c000-0000-0000-0000-00000000c001#layer1.internalLightReflectance", + "Side": "panel:5e4a7125-c77a-4911-9084-7cbfa9b0786c@space:5080c000-0000-0000-0000-00000000c001", + "Layer": 1, + "LayerCount": 4, + "Property": "internalLightReflectance", + "SamFace": "internal", + "SamMaterial": "FIX_Render", + "NativeObject": "SAM_OpaqueMaterial_FIX_Render_15mm_f7af24b1", + "SamValue": 0.37, + "NativeValue": 0.5800000000000001, + "Delta": 0.21000000000000008, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 1 of 4, SAM internal face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:5e4a7125-c77a-4911-9084-7cbfa9b0786c@space:5080c000-0000-0000-0000-00000000c001#layer1.internalEmissivity", + "Side": "panel:5e4a7125-c77a-4911-9084-7cbfa9b0786c@space:5080c000-0000-0000-0000-00000000c001", + "Layer": 1, + "LayerCount": 4, + "Property": "internalEmissivity", + "SamFace": "internal", + "SamMaterial": "FIX_Render", + "NativeObject": "SAM_OpaqueMaterial_FIX_Render_15mm_f7af24b1", + "SamValue": 0.93, + "NativeValue": 0.88, + "Delta": 0.050000000000000044, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 1 of 4, SAM internal face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:5e4a7125-c77a-4911-9084-7cbfa9b0786c@space:5080c000-0000-0000-0000-00000000c001#layer2.externalSolarReflectance", + "Side": "panel:5e4a7125-c77a-4911-9084-7cbfa9b0786c@space:5080c000-0000-0000-0000-00000000c001", + "Layer": 2, + "LayerCount": 4, + "Property": "externalSolarReflectance", + "SamFace": "external", + "SamMaterial": "FIX_Blockwork", + "NativeObject": "SAM_OpaqueMaterial_FIX_Blockwork_100mm_6998e0fb", + "SamValue": 0.38, + "NativeValue": 0.38, + "Delta": 0, + "NumericVerdict": "Identical", + "Differs": false, + "ScopeReason": "buried layer face (layer 2 of 4, SAM external face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:5e4a7125-c77a-4911-9084-7cbfa9b0786c@space:5080c000-0000-0000-0000-00000000c001#layer2.internalSolarReflectance", + "Side": "panel:5e4a7125-c77a-4911-9084-7cbfa9b0786c@space:5080c000-0000-0000-0000-00000000c001", + "Layer": 2, + "LayerCount": 4, + "Property": "internalSolarReflectance", + "SamFace": "internal", + "SamMaterial": "FIX_Blockwork", + "NativeObject": "SAM_OpaqueMaterial_FIX_Blockwork_100mm_6998e0fb", + "SamValue": 0.44, + "NativeValue": 0.38, + "Delta": 0.06, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 2 of 4, SAM internal face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:5e4a7125-c77a-4911-9084-7cbfa9b0786c@space:5080c000-0000-0000-0000-00000000c001#layer2.externalLightReflectance", + "Side": "panel:5e4a7125-c77a-4911-9084-7cbfa9b0786c@space:5080c000-0000-0000-0000-00000000c001", + "Layer": 2, + "LayerCount": 4, + "Property": "externalLightReflectance", + "SamFace": "external", + "SamMaterial": "FIX_Blockwork", + "NativeObject": "SAM_OpaqueMaterial_FIX_Blockwork_100mm_6998e0fb", + "SamValue": 0.39, + "NativeValue": 0.39, + "Delta": 0, + "NumericVerdict": "Identical", + "Differs": false, + "ScopeReason": "buried layer face (layer 2 of 4, SAM external face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:5e4a7125-c77a-4911-9084-7cbfa9b0786c@space:5080c000-0000-0000-0000-00000000c001#layer2.internalLightReflectance", + "Side": "panel:5e4a7125-c77a-4911-9084-7cbfa9b0786c@space:5080c000-0000-0000-0000-00000000c001", + "Layer": 2, + "LayerCount": 4, + "Property": "internalLightReflectance", + "SamFace": "internal", + "SamMaterial": "FIX_Blockwork", + "NativeObject": "SAM_OpaqueMaterial_FIX_Blockwork_100mm_6998e0fb", + "SamValue": 0.46, + "NativeValue": 0.39, + "Delta": 0.07, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 2 of 4, SAM internal face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:5e4a7125-c77a-4911-9084-7cbfa9b0786c@space:5080c000-0000-0000-0000-00000000c001#layer2.externalEmissivity", + "Side": "panel:5e4a7125-c77a-4911-9084-7cbfa9b0786c@space:5080c000-0000-0000-0000-00000000c001", + "Layer": 2, + "LayerCount": 4, + "Property": "externalEmissivity", + "SamFace": "external", + "SamMaterial": "FIX_Blockwork", + "NativeObject": "SAM_OpaqueMaterial_FIX_Blockwork_100mm_6998e0fb", + "SamValue": 0.93, + "NativeValue": 0.93, + "Delta": 0, + "NumericVerdict": "Identical", + "Differs": false, + "ScopeReason": "buried layer face (layer 2 of 4, SAM external face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:5e4a7125-c77a-4911-9084-7cbfa9b0786c@space:5080c000-0000-0000-0000-00000000c001#layer2.internalEmissivity", + "Side": "panel:5e4a7125-c77a-4911-9084-7cbfa9b0786c@space:5080c000-0000-0000-0000-00000000c001", + "Layer": 2, + "LayerCount": 4, + "Property": "internalEmissivity", + "SamFace": "internal", + "SamMaterial": "FIX_Blockwork", + "NativeObject": "SAM_OpaqueMaterial_FIX_Blockwork_100mm_6998e0fb", + "SamValue": 0.94, + "NativeValue": 0.93, + "Delta": 0.009999999999999898, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 2 of 4, SAM internal face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:5e4a7125-c77a-4911-9084-7cbfa9b0786c@space:5080c000-0000-0000-0000-00000000c001#layer3.externalSolarReflectance", + "Side": "panel:5e4a7125-c77a-4911-9084-7cbfa9b0786c@space:5080c000-0000-0000-0000-00000000c001", + "Layer": 3, + "LayerCount": 4, + "Property": "externalSolarReflectance", + "SamFace": "external", + "SamMaterial": "FIX_MineralWool", + "NativeObject": "SAM_OpaqueMaterial_FIX_MineralWool_140mm_251d5e01", + "SamValue": 0.48, + "NativeValue": 0.48, + "Delta": 0, + "NumericVerdict": "Identical", + "Differs": false, + "ScopeReason": "buried layer face (layer 3 of 4, SAM external face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:5e4a7125-c77a-4911-9084-7cbfa9b0786c@space:5080c000-0000-0000-0000-00000000c001#layer3.internalSolarReflectance", + "Side": "panel:5e4a7125-c77a-4911-9084-7cbfa9b0786c@space:5080c000-0000-0000-0000-00000000c001", + "Layer": 3, + "LayerCount": 4, + "Property": "internalSolarReflectance", + "SamFace": "internal", + "SamMaterial": "FIX_MineralWool", + "NativeObject": "SAM_OpaqueMaterial_FIX_MineralWool_140mm_251d5e01", + "SamValue": 0.51, + "NativeValue": 0.48, + "Delta": 0.030000000000000027, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 3 of 4, SAM internal face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:5e4a7125-c77a-4911-9084-7cbfa9b0786c@space:5080c000-0000-0000-0000-00000000c001#layer3.externalLightReflectance", + "Side": "panel:5e4a7125-c77a-4911-9084-7cbfa9b0786c@space:5080c000-0000-0000-0000-00000000c001", + "Layer": 3, + "LayerCount": 4, + "Property": "externalLightReflectance", + "SamFace": "external", + "SamMaterial": "FIX_MineralWool", + "NativeObject": "SAM_OpaqueMaterial_FIX_MineralWool_140mm_251d5e01", + "SamValue": 0.49, + "NativeValue": 0.49, + "Delta": 0, + "NumericVerdict": "Identical", + "Differs": false, + "ScopeReason": "buried layer face (layer 3 of 4, SAM external face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:5e4a7125-c77a-4911-9084-7cbfa9b0786c@space:5080c000-0000-0000-0000-00000000c001#layer3.internalLightReflectance", + "Side": "panel:5e4a7125-c77a-4911-9084-7cbfa9b0786c@space:5080c000-0000-0000-0000-00000000c001", + "Layer": 3, + "LayerCount": 4, + "Property": "internalLightReflectance", + "SamFace": "internal", + "SamMaterial": "FIX_MineralWool", + "NativeObject": "SAM_OpaqueMaterial_FIX_MineralWool_140mm_251d5e01", + "SamValue": 0.53, + "NativeValue": 0.49, + "Delta": 0.040000000000000036, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 3 of 4, SAM internal face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:5e4a7125-c77a-4911-9084-7cbfa9b0786c@space:5080c000-0000-0000-0000-00000000c001#layer3.externalEmissivity", + "Side": "panel:5e4a7125-c77a-4911-9084-7cbfa9b0786c@space:5080c000-0000-0000-0000-00000000c001", + "Layer": 3, + "LayerCount": 4, + "Property": "externalEmissivity", + "SamFace": "external", + "SamMaterial": "FIX_MineralWool", + "NativeObject": "SAM_OpaqueMaterial_FIX_MineralWool_140mm_251d5e01", + "SamValue": 0.89, + "NativeValue": 0.89, + "Delta": 0, + "NumericVerdict": "Identical", + "Differs": false, + "ScopeReason": "buried layer face (layer 3 of 4, SAM external face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:5e4a7125-c77a-4911-9084-7cbfa9b0786c@space:5080c000-0000-0000-0000-00000000c001#layer3.internalEmissivity", + "Side": "panel:5e4a7125-c77a-4911-9084-7cbfa9b0786c@space:5080c000-0000-0000-0000-00000000c001", + "Layer": 3, + "LayerCount": 4, + "Property": "internalEmissivity", + "SamFace": "internal", + "SamMaterial": "FIX_MineralWool", + "NativeObject": "SAM_OpaqueMaterial_FIX_MineralWool_140mm_251d5e01", + "SamValue": 0.92, + "NativeValue": 0.89, + "Delta": 0.030000000000000027, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 3 of 4, SAM internal face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:5e4a7125-c77a-4911-9084-7cbfa9b0786c@space:5080c000-0000-0000-0000-00000000c001#layer4.externalSolarReflectance", + "Side": "panel:5e4a7125-c77a-4911-9084-7cbfa9b0786c@space:5080c000-0000-0000-0000-00000000c001", + "Layer": 4, + "LayerCount": 4, + "Property": "externalSolarReflectance", + "SamFace": "external", + "SamMaterial": "FIX_Plasterboard", + "NativeObject": "SAM_OpaqueMaterial_FIX_Plasterboard_12.5mm_Internal_5abe47a0", + "SamValue": 0.62, + "NativeValue": 0.6799999999999999, + "Delta": 0.05999999999999994, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 4 of 4, SAM external face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:5e4a7125-c77a-4911-9084-7cbfa9b0786c@space:5080c000-0000-0000-0000-00000000c001#layer4.externalLightReflectance", + "Side": "panel:5e4a7125-c77a-4911-9084-7cbfa9b0786c@space:5080c000-0000-0000-0000-00000000c001", + "Layer": 4, + "LayerCount": 4, + "Property": "externalLightReflectance", + "SamFace": "external", + "SamMaterial": "FIX_Plasterboard", + "NativeObject": "SAM_OpaqueMaterial_FIX_Plasterboard_12.5mm_Internal_5abe47a0", + "SamValue": 0.64, + "NativeValue": 0.7, + "Delta": 0.05999999999999994, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 4 of 4, SAM external face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:5e4a7125-c77a-4911-9084-7cbfa9b0786c@space:5080c000-0000-0000-0000-00000000c001#layer4.externalEmissivity", + "Side": "panel:5e4a7125-c77a-4911-9084-7cbfa9b0786c@space:5080c000-0000-0000-0000-00000000c001", + "Layer": 4, + "LayerCount": 4, + "Property": "externalEmissivity", + "SamFace": "external", + "SamMaterial": "FIX_Plasterboard", + "NativeObject": "SAM_OpaqueMaterial_FIX_Plasterboard_12.5mm_Internal_5abe47a0", + "SamValue": 0.9, + "NativeValue": 0.91, + "Delta": 0.010000000000000009, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 4 of 4, SAM external face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:78af8769-1ba0-43bc-844e-f1ca72fa447e@space:5080c000-0000-0000-0000-00000000c001#layer1.internalSolarReflectance", + "Side": "panel:78af8769-1ba0-43bc-844e-f1ca72fa447e@space:5080c000-0000-0000-0000-00000000c001", + "Layer": 1, + "LayerCount": 4, + "Property": "internalSolarReflectance", + "SamFace": "internal", + "SamMaterial": "FIX_Render", + "NativeObject": "SAM_OpaqueMaterial_FIX_Render_15mm_f7af24b1", + "SamValue": 0.36, + "NativeValue": 0.5700000000000001, + "Delta": 0.21000000000000008, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 1 of 4, SAM internal face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:78af8769-1ba0-43bc-844e-f1ca72fa447e@space:5080c000-0000-0000-0000-00000000c001#layer1.internalLightReflectance", + "Side": "panel:78af8769-1ba0-43bc-844e-f1ca72fa447e@space:5080c000-0000-0000-0000-00000000c001", + "Layer": 1, + "LayerCount": 4, + "Property": "internalLightReflectance", + "SamFace": "internal", + "SamMaterial": "FIX_Render", + "NativeObject": "SAM_OpaqueMaterial_FIX_Render_15mm_f7af24b1", + "SamValue": 0.37, + "NativeValue": 0.5800000000000001, + "Delta": 0.21000000000000008, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 1 of 4, SAM internal face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:78af8769-1ba0-43bc-844e-f1ca72fa447e@space:5080c000-0000-0000-0000-00000000c001#layer1.internalEmissivity", + "Side": "panel:78af8769-1ba0-43bc-844e-f1ca72fa447e@space:5080c000-0000-0000-0000-00000000c001", + "Layer": 1, + "LayerCount": 4, + "Property": "internalEmissivity", + "SamFace": "internal", + "SamMaterial": "FIX_Render", + "NativeObject": "SAM_OpaqueMaterial_FIX_Render_15mm_f7af24b1", + "SamValue": 0.93, + "NativeValue": 0.88, + "Delta": 0.050000000000000044, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 1 of 4, SAM internal face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:78af8769-1ba0-43bc-844e-f1ca72fa447e@space:5080c000-0000-0000-0000-00000000c001#layer2.externalSolarReflectance", + "Side": "panel:78af8769-1ba0-43bc-844e-f1ca72fa447e@space:5080c000-0000-0000-0000-00000000c001", + "Layer": 2, + "LayerCount": 4, + "Property": "externalSolarReflectance", + "SamFace": "external", + "SamMaterial": "FIX_Blockwork", + "NativeObject": "SAM_OpaqueMaterial_FIX_Blockwork_100mm_6998e0fb", + "SamValue": 0.38, + "NativeValue": 0.38, + "Delta": 0, + "NumericVerdict": "Identical", + "Differs": false, + "ScopeReason": "buried layer face (layer 2 of 4, SAM external face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:78af8769-1ba0-43bc-844e-f1ca72fa447e@space:5080c000-0000-0000-0000-00000000c001#layer2.internalSolarReflectance", + "Side": "panel:78af8769-1ba0-43bc-844e-f1ca72fa447e@space:5080c000-0000-0000-0000-00000000c001", + "Layer": 2, + "LayerCount": 4, + "Property": "internalSolarReflectance", + "SamFace": "internal", + "SamMaterial": "FIX_Blockwork", + "NativeObject": "SAM_OpaqueMaterial_FIX_Blockwork_100mm_6998e0fb", + "SamValue": 0.44, + "NativeValue": 0.38, + "Delta": 0.06, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 2 of 4, SAM internal face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:78af8769-1ba0-43bc-844e-f1ca72fa447e@space:5080c000-0000-0000-0000-00000000c001#layer2.externalLightReflectance", + "Side": "panel:78af8769-1ba0-43bc-844e-f1ca72fa447e@space:5080c000-0000-0000-0000-00000000c001", + "Layer": 2, + "LayerCount": 4, + "Property": "externalLightReflectance", + "SamFace": "external", + "SamMaterial": "FIX_Blockwork", + "NativeObject": "SAM_OpaqueMaterial_FIX_Blockwork_100mm_6998e0fb", + "SamValue": 0.39, + "NativeValue": 0.39, + "Delta": 0, + "NumericVerdict": "Identical", + "Differs": false, + "ScopeReason": "buried layer face (layer 2 of 4, SAM external face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:78af8769-1ba0-43bc-844e-f1ca72fa447e@space:5080c000-0000-0000-0000-00000000c001#layer2.internalLightReflectance", + "Side": "panel:78af8769-1ba0-43bc-844e-f1ca72fa447e@space:5080c000-0000-0000-0000-00000000c001", + "Layer": 2, + "LayerCount": 4, + "Property": "internalLightReflectance", + "SamFace": "internal", + "SamMaterial": "FIX_Blockwork", + "NativeObject": "SAM_OpaqueMaterial_FIX_Blockwork_100mm_6998e0fb", + "SamValue": 0.46, + "NativeValue": 0.39, + "Delta": 0.07, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 2 of 4, SAM internal face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:78af8769-1ba0-43bc-844e-f1ca72fa447e@space:5080c000-0000-0000-0000-00000000c001#layer2.externalEmissivity", + "Side": "panel:78af8769-1ba0-43bc-844e-f1ca72fa447e@space:5080c000-0000-0000-0000-00000000c001", + "Layer": 2, + "LayerCount": 4, + "Property": "externalEmissivity", + "SamFace": "external", + "SamMaterial": "FIX_Blockwork", + "NativeObject": "SAM_OpaqueMaterial_FIX_Blockwork_100mm_6998e0fb", + "SamValue": 0.93, + "NativeValue": 0.93, + "Delta": 0, + "NumericVerdict": "Identical", + "Differs": false, + "ScopeReason": "buried layer face (layer 2 of 4, SAM external face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:78af8769-1ba0-43bc-844e-f1ca72fa447e@space:5080c000-0000-0000-0000-00000000c001#layer2.internalEmissivity", + "Side": "panel:78af8769-1ba0-43bc-844e-f1ca72fa447e@space:5080c000-0000-0000-0000-00000000c001", + "Layer": 2, + "LayerCount": 4, + "Property": "internalEmissivity", + "SamFace": "internal", + "SamMaterial": "FIX_Blockwork", + "NativeObject": "SAM_OpaqueMaterial_FIX_Blockwork_100mm_6998e0fb", + "SamValue": 0.94, + "NativeValue": 0.93, + "Delta": 0.009999999999999898, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 2 of 4, SAM internal face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:78af8769-1ba0-43bc-844e-f1ca72fa447e@space:5080c000-0000-0000-0000-00000000c001#layer3.externalSolarReflectance", + "Side": "panel:78af8769-1ba0-43bc-844e-f1ca72fa447e@space:5080c000-0000-0000-0000-00000000c001", + "Layer": 3, + "LayerCount": 4, + "Property": "externalSolarReflectance", + "SamFace": "external", + "SamMaterial": "FIX_MineralWool", + "NativeObject": "SAM_OpaqueMaterial_FIX_MineralWool_140mm_251d5e01", + "SamValue": 0.48, + "NativeValue": 0.48, + "Delta": 0, + "NumericVerdict": "Identical", + "Differs": false, + "ScopeReason": "buried layer face (layer 3 of 4, SAM external face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:78af8769-1ba0-43bc-844e-f1ca72fa447e@space:5080c000-0000-0000-0000-00000000c001#layer3.internalSolarReflectance", + "Side": "panel:78af8769-1ba0-43bc-844e-f1ca72fa447e@space:5080c000-0000-0000-0000-00000000c001", + "Layer": 3, + "LayerCount": 4, + "Property": "internalSolarReflectance", + "SamFace": "internal", + "SamMaterial": "FIX_MineralWool", + "NativeObject": "SAM_OpaqueMaterial_FIX_MineralWool_140mm_251d5e01", + "SamValue": 0.51, + "NativeValue": 0.48, + "Delta": 0.030000000000000027, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 3 of 4, SAM internal face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:78af8769-1ba0-43bc-844e-f1ca72fa447e@space:5080c000-0000-0000-0000-00000000c001#layer3.externalLightReflectance", + "Side": "panel:78af8769-1ba0-43bc-844e-f1ca72fa447e@space:5080c000-0000-0000-0000-00000000c001", + "Layer": 3, + "LayerCount": 4, + "Property": "externalLightReflectance", + "SamFace": "external", + "SamMaterial": "FIX_MineralWool", + "NativeObject": "SAM_OpaqueMaterial_FIX_MineralWool_140mm_251d5e01", + "SamValue": 0.49, + "NativeValue": 0.49, + "Delta": 0, + "NumericVerdict": "Identical", + "Differs": false, + "ScopeReason": "buried layer face (layer 3 of 4, SAM external face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:78af8769-1ba0-43bc-844e-f1ca72fa447e@space:5080c000-0000-0000-0000-00000000c001#layer3.internalLightReflectance", + "Side": "panel:78af8769-1ba0-43bc-844e-f1ca72fa447e@space:5080c000-0000-0000-0000-00000000c001", + "Layer": 3, + "LayerCount": 4, + "Property": "internalLightReflectance", + "SamFace": "internal", + "SamMaterial": "FIX_MineralWool", + "NativeObject": "SAM_OpaqueMaterial_FIX_MineralWool_140mm_251d5e01", + "SamValue": 0.53, + "NativeValue": 0.49, + "Delta": 0.040000000000000036, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 3 of 4, SAM internal face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:78af8769-1ba0-43bc-844e-f1ca72fa447e@space:5080c000-0000-0000-0000-00000000c001#layer3.externalEmissivity", + "Side": "panel:78af8769-1ba0-43bc-844e-f1ca72fa447e@space:5080c000-0000-0000-0000-00000000c001", + "Layer": 3, + "LayerCount": 4, + "Property": "externalEmissivity", + "SamFace": "external", + "SamMaterial": "FIX_MineralWool", + "NativeObject": "SAM_OpaqueMaterial_FIX_MineralWool_140mm_251d5e01", + "SamValue": 0.89, + "NativeValue": 0.89, + "Delta": 0, + "NumericVerdict": "Identical", + "Differs": false, + "ScopeReason": "buried layer face (layer 3 of 4, SAM external face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:78af8769-1ba0-43bc-844e-f1ca72fa447e@space:5080c000-0000-0000-0000-00000000c001#layer3.internalEmissivity", + "Side": "panel:78af8769-1ba0-43bc-844e-f1ca72fa447e@space:5080c000-0000-0000-0000-00000000c001", + "Layer": 3, + "LayerCount": 4, + "Property": "internalEmissivity", + "SamFace": "internal", + "SamMaterial": "FIX_MineralWool", + "NativeObject": "SAM_OpaqueMaterial_FIX_MineralWool_140mm_251d5e01", + "SamValue": 0.92, + "NativeValue": 0.89, + "Delta": 0.030000000000000027, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 3 of 4, SAM internal face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:78af8769-1ba0-43bc-844e-f1ca72fa447e@space:5080c000-0000-0000-0000-00000000c001#layer4.externalSolarReflectance", + "Side": "panel:78af8769-1ba0-43bc-844e-f1ca72fa447e@space:5080c000-0000-0000-0000-00000000c001", + "Layer": 4, + "LayerCount": 4, + "Property": "externalSolarReflectance", + "SamFace": "external", + "SamMaterial": "FIX_Plasterboard", + "NativeObject": "SAM_OpaqueMaterial_FIX_Plasterboard_12.5mm_Internal_5abe47a0", + "SamValue": 0.62, + "NativeValue": 0.6799999999999999, + "Delta": 0.05999999999999994, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 4 of 4, SAM external face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:78af8769-1ba0-43bc-844e-f1ca72fa447e@space:5080c000-0000-0000-0000-00000000c001#layer4.externalLightReflectance", + "Side": "panel:78af8769-1ba0-43bc-844e-f1ca72fa447e@space:5080c000-0000-0000-0000-00000000c001", + "Layer": 4, + "LayerCount": 4, + "Property": "externalLightReflectance", + "SamFace": "external", + "SamMaterial": "FIX_Plasterboard", + "NativeObject": "SAM_OpaqueMaterial_FIX_Plasterboard_12.5mm_Internal_5abe47a0", + "SamValue": 0.64, + "NativeValue": 0.7, + "Delta": 0.05999999999999994, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 4 of 4, SAM external face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:78af8769-1ba0-43bc-844e-f1ca72fa447e@space:5080c000-0000-0000-0000-00000000c001#layer4.externalEmissivity", + "Side": "panel:78af8769-1ba0-43bc-844e-f1ca72fa447e@space:5080c000-0000-0000-0000-00000000c001", + "Layer": 4, + "LayerCount": 4, + "Property": "externalEmissivity", + "SamFace": "external", + "SamMaterial": "FIX_Plasterboard", + "NativeObject": "SAM_OpaqueMaterial_FIX_Plasterboard_12.5mm_Internal_5abe47a0", + "SamValue": 0.9, + "NativeValue": 0.91, + "Delta": 0.010000000000000009, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 4 of 4, SAM external face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:0a4398eb-cdab-43d8-bcba-736116a2a029@space:5080c000-0000-0000-0000-00000000c001#layer1.internalSolarReflectance", + "Side": "panel:0a4398eb-cdab-43d8-bcba-736116a2a029@space:5080c000-0000-0000-0000-00000000c001", + "Layer": 1, + "LayerCount": 4, + "Property": "internalSolarReflectance", + "SamFace": "internal", + "SamMaterial": "FIX_Render", + "NativeObject": "SAM_OpaqueMaterial_FIX_Render_15mm_f7af24b1", + "SamValue": 0.36, + "NativeValue": 0.5700000000000001, + "Delta": 0.21000000000000008, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 1 of 4, SAM internal face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:0a4398eb-cdab-43d8-bcba-736116a2a029@space:5080c000-0000-0000-0000-00000000c001#layer1.internalLightReflectance", + "Side": "panel:0a4398eb-cdab-43d8-bcba-736116a2a029@space:5080c000-0000-0000-0000-00000000c001", + "Layer": 1, + "LayerCount": 4, + "Property": "internalLightReflectance", + "SamFace": "internal", + "SamMaterial": "FIX_Render", + "NativeObject": "SAM_OpaqueMaterial_FIX_Render_15mm_f7af24b1", + "SamValue": 0.37, + "NativeValue": 0.5800000000000001, + "Delta": 0.21000000000000008, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 1 of 4, SAM internal face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:0a4398eb-cdab-43d8-bcba-736116a2a029@space:5080c000-0000-0000-0000-00000000c001#layer1.internalEmissivity", + "Side": "panel:0a4398eb-cdab-43d8-bcba-736116a2a029@space:5080c000-0000-0000-0000-00000000c001", + "Layer": 1, + "LayerCount": 4, + "Property": "internalEmissivity", + "SamFace": "internal", + "SamMaterial": "FIX_Render", + "NativeObject": "SAM_OpaqueMaterial_FIX_Render_15mm_f7af24b1", + "SamValue": 0.93, + "NativeValue": 0.88, + "Delta": 0.050000000000000044, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 1 of 4, SAM internal face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:0a4398eb-cdab-43d8-bcba-736116a2a029@space:5080c000-0000-0000-0000-00000000c001#layer2.externalSolarReflectance", + "Side": "panel:0a4398eb-cdab-43d8-bcba-736116a2a029@space:5080c000-0000-0000-0000-00000000c001", + "Layer": 2, + "LayerCount": 4, + "Property": "externalSolarReflectance", + "SamFace": "external", + "SamMaterial": "FIX_Blockwork", + "NativeObject": "SAM_OpaqueMaterial_FIX_Blockwork_100mm_6998e0fb", + "SamValue": 0.38, + "NativeValue": 0.38, + "Delta": 0, + "NumericVerdict": "Identical", + "Differs": false, + "ScopeReason": "buried layer face (layer 2 of 4, SAM external face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:0a4398eb-cdab-43d8-bcba-736116a2a029@space:5080c000-0000-0000-0000-00000000c001#layer2.internalSolarReflectance", + "Side": "panel:0a4398eb-cdab-43d8-bcba-736116a2a029@space:5080c000-0000-0000-0000-00000000c001", + "Layer": 2, + "LayerCount": 4, + "Property": "internalSolarReflectance", + "SamFace": "internal", + "SamMaterial": "FIX_Blockwork", + "NativeObject": "SAM_OpaqueMaterial_FIX_Blockwork_100mm_6998e0fb", + "SamValue": 0.44, + "NativeValue": 0.38, + "Delta": 0.06, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 2 of 4, SAM internal face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:0a4398eb-cdab-43d8-bcba-736116a2a029@space:5080c000-0000-0000-0000-00000000c001#layer2.externalLightReflectance", + "Side": "panel:0a4398eb-cdab-43d8-bcba-736116a2a029@space:5080c000-0000-0000-0000-00000000c001", + "Layer": 2, + "LayerCount": 4, + "Property": "externalLightReflectance", + "SamFace": "external", + "SamMaterial": "FIX_Blockwork", + "NativeObject": "SAM_OpaqueMaterial_FIX_Blockwork_100mm_6998e0fb", + "SamValue": 0.39, + "NativeValue": 0.39, + "Delta": 0, + "NumericVerdict": "Identical", + "Differs": false, + "ScopeReason": "buried layer face (layer 2 of 4, SAM external face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:0a4398eb-cdab-43d8-bcba-736116a2a029@space:5080c000-0000-0000-0000-00000000c001#layer2.internalLightReflectance", + "Side": "panel:0a4398eb-cdab-43d8-bcba-736116a2a029@space:5080c000-0000-0000-0000-00000000c001", + "Layer": 2, + "LayerCount": 4, + "Property": "internalLightReflectance", + "SamFace": "internal", + "SamMaterial": "FIX_Blockwork", + "NativeObject": "SAM_OpaqueMaterial_FIX_Blockwork_100mm_6998e0fb", + "SamValue": 0.46, + "NativeValue": 0.39, + "Delta": 0.07, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 2 of 4, SAM internal face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:0a4398eb-cdab-43d8-bcba-736116a2a029@space:5080c000-0000-0000-0000-00000000c001#layer2.externalEmissivity", + "Side": "panel:0a4398eb-cdab-43d8-bcba-736116a2a029@space:5080c000-0000-0000-0000-00000000c001", + "Layer": 2, + "LayerCount": 4, + "Property": "externalEmissivity", + "SamFace": "external", + "SamMaterial": "FIX_Blockwork", + "NativeObject": "SAM_OpaqueMaterial_FIX_Blockwork_100mm_6998e0fb", + "SamValue": 0.93, + "NativeValue": 0.93, + "Delta": 0, + "NumericVerdict": "Identical", + "Differs": false, + "ScopeReason": "buried layer face (layer 2 of 4, SAM external face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:0a4398eb-cdab-43d8-bcba-736116a2a029@space:5080c000-0000-0000-0000-00000000c001#layer2.internalEmissivity", + "Side": "panel:0a4398eb-cdab-43d8-bcba-736116a2a029@space:5080c000-0000-0000-0000-00000000c001", + "Layer": 2, + "LayerCount": 4, + "Property": "internalEmissivity", + "SamFace": "internal", + "SamMaterial": "FIX_Blockwork", + "NativeObject": "SAM_OpaqueMaterial_FIX_Blockwork_100mm_6998e0fb", + "SamValue": 0.94, + "NativeValue": 0.93, + "Delta": 0.009999999999999898, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 2 of 4, SAM internal face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:0a4398eb-cdab-43d8-bcba-736116a2a029@space:5080c000-0000-0000-0000-00000000c001#layer3.externalSolarReflectance", + "Side": "panel:0a4398eb-cdab-43d8-bcba-736116a2a029@space:5080c000-0000-0000-0000-00000000c001", + "Layer": 3, + "LayerCount": 4, + "Property": "externalSolarReflectance", + "SamFace": "external", + "SamMaterial": "FIX_MineralWool", + "NativeObject": "SAM_OpaqueMaterial_FIX_MineralWool_140mm_251d5e01", + "SamValue": 0.48, + "NativeValue": 0.48, + "Delta": 0, + "NumericVerdict": "Identical", + "Differs": false, + "ScopeReason": "buried layer face (layer 3 of 4, SAM external face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:0a4398eb-cdab-43d8-bcba-736116a2a029@space:5080c000-0000-0000-0000-00000000c001#layer3.internalSolarReflectance", + "Side": "panel:0a4398eb-cdab-43d8-bcba-736116a2a029@space:5080c000-0000-0000-0000-00000000c001", + "Layer": 3, + "LayerCount": 4, + "Property": "internalSolarReflectance", + "SamFace": "internal", + "SamMaterial": "FIX_MineralWool", + "NativeObject": "SAM_OpaqueMaterial_FIX_MineralWool_140mm_251d5e01", + "SamValue": 0.51, + "NativeValue": 0.48, + "Delta": 0.030000000000000027, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 3 of 4, SAM internal face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:0a4398eb-cdab-43d8-bcba-736116a2a029@space:5080c000-0000-0000-0000-00000000c001#layer3.externalLightReflectance", + "Side": "panel:0a4398eb-cdab-43d8-bcba-736116a2a029@space:5080c000-0000-0000-0000-00000000c001", + "Layer": 3, + "LayerCount": 4, + "Property": "externalLightReflectance", + "SamFace": "external", + "SamMaterial": "FIX_MineralWool", + "NativeObject": "SAM_OpaqueMaterial_FIX_MineralWool_140mm_251d5e01", + "SamValue": 0.49, + "NativeValue": 0.49, + "Delta": 0, + "NumericVerdict": "Identical", + "Differs": false, + "ScopeReason": "buried layer face (layer 3 of 4, SAM external face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:0a4398eb-cdab-43d8-bcba-736116a2a029@space:5080c000-0000-0000-0000-00000000c001#layer3.internalLightReflectance", + "Side": "panel:0a4398eb-cdab-43d8-bcba-736116a2a029@space:5080c000-0000-0000-0000-00000000c001", + "Layer": 3, + "LayerCount": 4, + "Property": "internalLightReflectance", + "SamFace": "internal", + "SamMaterial": "FIX_MineralWool", + "NativeObject": "SAM_OpaqueMaterial_FIX_MineralWool_140mm_251d5e01", + "SamValue": 0.53, + "NativeValue": 0.49, + "Delta": 0.040000000000000036, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 3 of 4, SAM internal face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:0a4398eb-cdab-43d8-bcba-736116a2a029@space:5080c000-0000-0000-0000-00000000c001#layer3.externalEmissivity", + "Side": "panel:0a4398eb-cdab-43d8-bcba-736116a2a029@space:5080c000-0000-0000-0000-00000000c001", + "Layer": 3, + "LayerCount": 4, + "Property": "externalEmissivity", + "SamFace": "external", + "SamMaterial": "FIX_MineralWool", + "NativeObject": "SAM_OpaqueMaterial_FIX_MineralWool_140mm_251d5e01", + "SamValue": 0.89, + "NativeValue": 0.89, + "Delta": 0, + "NumericVerdict": "Identical", + "Differs": false, + "ScopeReason": "buried layer face (layer 3 of 4, SAM external face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:0a4398eb-cdab-43d8-bcba-736116a2a029@space:5080c000-0000-0000-0000-00000000c001#layer3.internalEmissivity", + "Side": "panel:0a4398eb-cdab-43d8-bcba-736116a2a029@space:5080c000-0000-0000-0000-00000000c001", + "Layer": 3, + "LayerCount": 4, + "Property": "internalEmissivity", + "SamFace": "internal", + "SamMaterial": "FIX_MineralWool", + "NativeObject": "SAM_OpaqueMaterial_FIX_MineralWool_140mm_251d5e01", + "SamValue": 0.92, + "NativeValue": 0.89, + "Delta": 0.030000000000000027, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 3 of 4, SAM internal face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:0a4398eb-cdab-43d8-bcba-736116a2a029@space:5080c000-0000-0000-0000-00000000c001#layer4.externalSolarReflectance", + "Side": "panel:0a4398eb-cdab-43d8-bcba-736116a2a029@space:5080c000-0000-0000-0000-00000000c001", + "Layer": 4, + "LayerCount": 4, + "Property": "externalSolarReflectance", + "SamFace": "external", + "SamMaterial": "FIX_Plasterboard", + "NativeObject": "SAM_OpaqueMaterial_FIX_Plasterboard_12.5mm_Internal_5abe47a0", + "SamValue": 0.62, + "NativeValue": 0.6799999999999999, + "Delta": 0.05999999999999994, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 4 of 4, SAM external face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:0a4398eb-cdab-43d8-bcba-736116a2a029@space:5080c000-0000-0000-0000-00000000c001#layer4.externalLightReflectance", + "Side": "panel:0a4398eb-cdab-43d8-bcba-736116a2a029@space:5080c000-0000-0000-0000-00000000c001", + "Layer": 4, + "LayerCount": 4, + "Property": "externalLightReflectance", + "SamFace": "external", + "SamMaterial": "FIX_Plasterboard", + "NativeObject": "SAM_OpaqueMaterial_FIX_Plasterboard_12.5mm_Internal_5abe47a0", + "SamValue": 0.64, + "NativeValue": 0.7, + "Delta": 0.05999999999999994, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 4 of 4, SAM external face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:0a4398eb-cdab-43d8-bcba-736116a2a029@space:5080c000-0000-0000-0000-00000000c001#layer4.externalEmissivity", + "Side": "panel:0a4398eb-cdab-43d8-bcba-736116a2a029@space:5080c000-0000-0000-0000-00000000c001", + "Layer": 4, + "LayerCount": 4, + "Property": "externalEmissivity", + "SamFace": "external", + "SamMaterial": "FIX_Plasterboard", + "NativeObject": "SAM_OpaqueMaterial_FIX_Plasterboard_12.5mm_Internal_5abe47a0", + "SamValue": 0.9, + "NativeValue": 0.91, + "Delta": 0.010000000000000009, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 4 of 4, SAM external face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:18cb687b-53ce-4282-be8e-6ba267a6ae2b@space:5080c000-0000-0000-0000-00000000c001#layer1.internalSolarReflectance", + "Side": "panel:18cb687b-53ce-4282-be8e-6ba267a6ae2b@space:5080c000-0000-0000-0000-00000000c001", + "Layer": 1, + "LayerCount": 4, + "Property": "internalSolarReflectance", + "SamFace": "internal", + "SamMaterial": "FIX_Render", + "NativeObject": "SAM_OpaqueMaterial_FIX_Render_15mm_f7af24b1", + "SamValue": 0.36, + "NativeValue": 0.5700000000000001, + "Delta": 0.21000000000000008, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 1 of 4, SAM internal face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:18cb687b-53ce-4282-be8e-6ba267a6ae2b@space:5080c000-0000-0000-0000-00000000c001#layer1.internalLightReflectance", + "Side": "panel:18cb687b-53ce-4282-be8e-6ba267a6ae2b@space:5080c000-0000-0000-0000-00000000c001", + "Layer": 1, + "LayerCount": 4, + "Property": "internalLightReflectance", + "SamFace": "internal", + "SamMaterial": "FIX_Render", + "NativeObject": "SAM_OpaqueMaterial_FIX_Render_15mm_f7af24b1", + "SamValue": 0.37, + "NativeValue": 0.5800000000000001, + "Delta": 0.21000000000000008, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 1 of 4, SAM internal face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:18cb687b-53ce-4282-be8e-6ba267a6ae2b@space:5080c000-0000-0000-0000-00000000c001#layer1.internalEmissivity", + "Side": "panel:18cb687b-53ce-4282-be8e-6ba267a6ae2b@space:5080c000-0000-0000-0000-00000000c001", + "Layer": 1, + "LayerCount": 4, + "Property": "internalEmissivity", + "SamFace": "internal", + "SamMaterial": "FIX_Render", + "NativeObject": "SAM_OpaqueMaterial_FIX_Render_15mm_f7af24b1", + "SamValue": 0.93, + "NativeValue": 0.88, + "Delta": 0.050000000000000044, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 1 of 4, SAM internal face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:18cb687b-53ce-4282-be8e-6ba267a6ae2b@space:5080c000-0000-0000-0000-00000000c001#layer2.externalSolarReflectance", + "Side": "panel:18cb687b-53ce-4282-be8e-6ba267a6ae2b@space:5080c000-0000-0000-0000-00000000c001", + "Layer": 2, + "LayerCount": 4, + "Property": "externalSolarReflectance", + "SamFace": "external", + "SamMaterial": "FIX_Blockwork", + "NativeObject": "SAM_OpaqueMaterial_FIX_Blockwork_100mm_6998e0fb", + "SamValue": 0.38, + "NativeValue": 0.38, + "Delta": 0, + "NumericVerdict": "Identical", + "Differs": false, + "ScopeReason": "buried layer face (layer 2 of 4, SAM external face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:18cb687b-53ce-4282-be8e-6ba267a6ae2b@space:5080c000-0000-0000-0000-00000000c001#layer2.internalSolarReflectance", + "Side": "panel:18cb687b-53ce-4282-be8e-6ba267a6ae2b@space:5080c000-0000-0000-0000-00000000c001", + "Layer": 2, + "LayerCount": 4, + "Property": "internalSolarReflectance", + "SamFace": "internal", + "SamMaterial": "FIX_Blockwork", + "NativeObject": "SAM_OpaqueMaterial_FIX_Blockwork_100mm_6998e0fb", + "SamValue": 0.44, + "NativeValue": 0.38, + "Delta": 0.06, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 2 of 4, SAM internal face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:18cb687b-53ce-4282-be8e-6ba267a6ae2b@space:5080c000-0000-0000-0000-00000000c001#layer2.externalLightReflectance", + "Side": "panel:18cb687b-53ce-4282-be8e-6ba267a6ae2b@space:5080c000-0000-0000-0000-00000000c001", + "Layer": 2, + "LayerCount": 4, + "Property": "externalLightReflectance", + "SamFace": "external", + "SamMaterial": "FIX_Blockwork", + "NativeObject": "SAM_OpaqueMaterial_FIX_Blockwork_100mm_6998e0fb", + "SamValue": 0.39, + "NativeValue": 0.39, + "Delta": 0, + "NumericVerdict": "Identical", + "Differs": false, + "ScopeReason": "buried layer face (layer 2 of 4, SAM external face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:18cb687b-53ce-4282-be8e-6ba267a6ae2b@space:5080c000-0000-0000-0000-00000000c001#layer2.internalLightReflectance", + "Side": "panel:18cb687b-53ce-4282-be8e-6ba267a6ae2b@space:5080c000-0000-0000-0000-00000000c001", + "Layer": 2, + "LayerCount": 4, + "Property": "internalLightReflectance", + "SamFace": "internal", + "SamMaterial": "FIX_Blockwork", + "NativeObject": "SAM_OpaqueMaterial_FIX_Blockwork_100mm_6998e0fb", + "SamValue": 0.46, + "NativeValue": 0.39, + "Delta": 0.07, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 2 of 4, SAM internal face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:18cb687b-53ce-4282-be8e-6ba267a6ae2b@space:5080c000-0000-0000-0000-00000000c001#layer2.externalEmissivity", + "Side": "panel:18cb687b-53ce-4282-be8e-6ba267a6ae2b@space:5080c000-0000-0000-0000-00000000c001", + "Layer": 2, + "LayerCount": 4, + "Property": "externalEmissivity", + "SamFace": "external", + "SamMaterial": "FIX_Blockwork", + "NativeObject": "SAM_OpaqueMaterial_FIX_Blockwork_100mm_6998e0fb", + "SamValue": 0.93, + "NativeValue": 0.93, + "Delta": 0, + "NumericVerdict": "Identical", + "Differs": false, + "ScopeReason": "buried layer face (layer 2 of 4, SAM external face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:18cb687b-53ce-4282-be8e-6ba267a6ae2b@space:5080c000-0000-0000-0000-00000000c001#layer2.internalEmissivity", + "Side": "panel:18cb687b-53ce-4282-be8e-6ba267a6ae2b@space:5080c000-0000-0000-0000-00000000c001", + "Layer": 2, + "LayerCount": 4, + "Property": "internalEmissivity", + "SamFace": "internal", + "SamMaterial": "FIX_Blockwork", + "NativeObject": "SAM_OpaqueMaterial_FIX_Blockwork_100mm_6998e0fb", + "SamValue": 0.94, + "NativeValue": 0.93, + "Delta": 0.009999999999999898, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 2 of 4, SAM internal face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:18cb687b-53ce-4282-be8e-6ba267a6ae2b@space:5080c000-0000-0000-0000-00000000c001#layer3.externalSolarReflectance", + "Side": "panel:18cb687b-53ce-4282-be8e-6ba267a6ae2b@space:5080c000-0000-0000-0000-00000000c001", + "Layer": 3, + "LayerCount": 4, + "Property": "externalSolarReflectance", + "SamFace": "external", + "SamMaterial": "FIX_MineralWool", + "NativeObject": "SAM_OpaqueMaterial_FIX_MineralWool_140mm_251d5e01", + "SamValue": 0.48, + "NativeValue": 0.48, + "Delta": 0, + "NumericVerdict": "Identical", + "Differs": false, + "ScopeReason": "buried layer face (layer 3 of 4, SAM external face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:18cb687b-53ce-4282-be8e-6ba267a6ae2b@space:5080c000-0000-0000-0000-00000000c001#layer3.internalSolarReflectance", + "Side": "panel:18cb687b-53ce-4282-be8e-6ba267a6ae2b@space:5080c000-0000-0000-0000-00000000c001", + "Layer": 3, + "LayerCount": 4, + "Property": "internalSolarReflectance", + "SamFace": "internal", + "SamMaterial": "FIX_MineralWool", + "NativeObject": "SAM_OpaqueMaterial_FIX_MineralWool_140mm_251d5e01", + "SamValue": 0.51, + "NativeValue": 0.48, + "Delta": 0.030000000000000027, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 3 of 4, SAM internal face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:18cb687b-53ce-4282-be8e-6ba267a6ae2b@space:5080c000-0000-0000-0000-00000000c001#layer3.externalLightReflectance", + "Side": "panel:18cb687b-53ce-4282-be8e-6ba267a6ae2b@space:5080c000-0000-0000-0000-00000000c001", + "Layer": 3, + "LayerCount": 4, + "Property": "externalLightReflectance", + "SamFace": "external", + "SamMaterial": "FIX_MineralWool", + "NativeObject": "SAM_OpaqueMaterial_FIX_MineralWool_140mm_251d5e01", + "SamValue": 0.49, + "NativeValue": 0.49, + "Delta": 0, + "NumericVerdict": "Identical", + "Differs": false, + "ScopeReason": "buried layer face (layer 3 of 4, SAM external face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:18cb687b-53ce-4282-be8e-6ba267a6ae2b@space:5080c000-0000-0000-0000-00000000c001#layer3.internalLightReflectance", + "Side": "panel:18cb687b-53ce-4282-be8e-6ba267a6ae2b@space:5080c000-0000-0000-0000-00000000c001", + "Layer": 3, + "LayerCount": 4, + "Property": "internalLightReflectance", + "SamFace": "internal", + "SamMaterial": "FIX_MineralWool", + "NativeObject": "SAM_OpaqueMaterial_FIX_MineralWool_140mm_251d5e01", + "SamValue": 0.53, + "NativeValue": 0.49, + "Delta": 0.040000000000000036, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 3 of 4, SAM internal face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:18cb687b-53ce-4282-be8e-6ba267a6ae2b@space:5080c000-0000-0000-0000-00000000c001#layer3.externalEmissivity", + "Side": "panel:18cb687b-53ce-4282-be8e-6ba267a6ae2b@space:5080c000-0000-0000-0000-00000000c001", + "Layer": 3, + "LayerCount": 4, + "Property": "externalEmissivity", + "SamFace": "external", + "SamMaterial": "FIX_MineralWool", + "NativeObject": "SAM_OpaqueMaterial_FIX_MineralWool_140mm_251d5e01", + "SamValue": 0.89, + "NativeValue": 0.89, + "Delta": 0, + "NumericVerdict": "Identical", + "Differs": false, + "ScopeReason": "buried layer face (layer 3 of 4, SAM external face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:18cb687b-53ce-4282-be8e-6ba267a6ae2b@space:5080c000-0000-0000-0000-00000000c001#layer3.internalEmissivity", + "Side": "panel:18cb687b-53ce-4282-be8e-6ba267a6ae2b@space:5080c000-0000-0000-0000-00000000c001", + "Layer": 3, + "LayerCount": 4, + "Property": "internalEmissivity", + "SamFace": "internal", + "SamMaterial": "FIX_MineralWool", + "NativeObject": "SAM_OpaqueMaterial_FIX_MineralWool_140mm_251d5e01", + "SamValue": 0.92, + "NativeValue": 0.89, + "Delta": 0.030000000000000027, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 3 of 4, SAM internal face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:18cb687b-53ce-4282-be8e-6ba267a6ae2b@space:5080c000-0000-0000-0000-00000000c001#layer4.externalSolarReflectance", + "Side": "panel:18cb687b-53ce-4282-be8e-6ba267a6ae2b@space:5080c000-0000-0000-0000-00000000c001", + "Layer": 4, + "LayerCount": 4, + "Property": "externalSolarReflectance", + "SamFace": "external", + "SamMaterial": "FIX_Plasterboard", + "NativeObject": "SAM_OpaqueMaterial_FIX_Plasterboard_12.5mm_Internal_5abe47a0", + "SamValue": 0.62, + "NativeValue": 0.6799999999999999, + "Delta": 0.05999999999999994, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 4 of 4, SAM external face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:18cb687b-53ce-4282-be8e-6ba267a6ae2b@space:5080c000-0000-0000-0000-00000000c001#layer4.externalLightReflectance", + "Side": "panel:18cb687b-53ce-4282-be8e-6ba267a6ae2b@space:5080c000-0000-0000-0000-00000000c001", + "Layer": 4, + "LayerCount": 4, + "Property": "externalLightReflectance", + "SamFace": "external", + "SamMaterial": "FIX_Plasterboard", + "NativeObject": "SAM_OpaqueMaterial_FIX_Plasterboard_12.5mm_Internal_5abe47a0", + "SamValue": 0.64, + "NativeValue": 0.7, + "Delta": 0.05999999999999994, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 4 of 4, SAM external face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:18cb687b-53ce-4282-be8e-6ba267a6ae2b@space:5080c000-0000-0000-0000-00000000c001#layer4.externalEmissivity", + "Side": "panel:18cb687b-53ce-4282-be8e-6ba267a6ae2b@space:5080c000-0000-0000-0000-00000000c001", + "Layer": 4, + "LayerCount": 4, + "Property": "externalEmissivity", + "SamFace": "external", + "SamMaterial": "FIX_Plasterboard", + "NativeObject": "SAM_OpaqueMaterial_FIX_Plasterboard_12.5mm_Internal_5abe47a0", + "SamValue": 0.9, + "NativeValue": 0.91, + "Delta": 0.010000000000000009, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 4 of 4, SAM external face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + } + ] + }, + "OwnerDecisionsNamed": [], + "TechnicalBlockersNamed": [], + "Consistency": [], + "Unsupported": [], + "FixtureCriteria": [], + "VentilationStates": { + "space:5080c000-0000-0000-0000-00000000c001": "V2" + }, + "Series": [ + { + "Key": "space:5080c000-0000-0000-0000-00000000c001.ic.schedule.occupancy", + "QuantityId": "6.hourly", + "Count": 8760, + "NotPass": 0, + "Status": "Pass", + "Outcome": "Match", + "FirstNotPass": null + }, + { + "Key": "space:5080c000-0000-0000-0000-00000000c001.ic.schedule.lighting", + "QuantityId": "6.hourly", + "Count": 8760, + "NotPass": 0, + "Status": "Pass", + "Outcome": "Match", + "FirstNotPass": null + }, + { + "Key": "space:5080c000-0000-0000-0000-00000000c001.ic.schedule.equipmentSensible", + "QuantityId": "6.hourly", + "Count": 8760, + "NotPass": 0, + "Status": "Pass", + "Outcome": "Match", + "FirstNotPass": null + }, + { + "Key": "space:5080c000-0000-0000-0000-00000000c001.ic.schedule.equipmentLatent", + "QuantityId": "6.hourly", + "Count": 8760, + "NotPass": 0, + "Status": "Pass", + "Outcome": "Match", + "FirstNotPass": null + }, + { + "Key": "space:5080c000-0000-0000-0000-00000000c001.ic.schedule.infiltration", + "QuantityId": "6.hourly", + "Count": 8760, + "NotPass": 0, + "Status": "Pass", + "Outcome": "Match", + "FirstNotPass": null + }, + { + "Key": "space:5080c000-0000-0000-0000-00000000c001.ic.heating", + "QuantityId": "5.temperature", + "Count": 8760, + "NotPass": 0, + "Status": "Pass", + "Outcome": "Match", + "FirstNotPass": null + }, + { + "Key": "space:5080c000-0000-0000-0000-00000000c001.ic.cooling", + "QuantityId": "5.temperature", + "Count": 8760, + "NotPass": 0, + "Status": "Pass", + "Outcome": "Match", + "FirstNotPass": null + }, + { + "Key": "space:5080c000-0000-0000-0000-00000000c001.ic.humidification", + "QuantityId": "5.humidity", + "Count": 8760, + "NotPass": 0, + "Status": "Pass", + "Outcome": "Match", + "FirstNotPass": null + }, + { + "Key": "space:5080c000-0000-0000-0000-00000000c001.ic.dehumidification", + "QuantityId": "5.humidity", + "Count": 8760, + "NotPass": 0, + "Status": "Pass", + "Outcome": "Match", + "FirstNotPass": null + }, + { + "Key": "space:5080c000-0000-0000-0000-00000000c001.ic.ventilation.delivered", + "QuantityId": "8b", + "Count": 8760, + "NotPass": 0, + "Status": "Pass", + "Outcome": "WithinTolerance", + "FirstNotPass": null + }, + { + "Key": "space:5080c000-0000-0000-0000-00000000c001.ic.schedule.ventilation", + "QuantityId": "6.hourly", + "Count": 8760, + "NotPass": 0, + "Status": "Pass", + "Outcome": "Match", + "FirstNotPass": null + } + ], + "Supporting": [ + "calendar: one non-leap run year 1/1-12/31 (IDF RunPeriod begin year 2006), EPW 8760 rows; hour index 0 = 1 January 00:00-01:00. Each schedule\u0027s own hour labels are checked separately.", + "orientation: SAM North Angle unstated (writer default 0); Coordinate System Relative; IDF Building North Axis blank (EnergyPlus default 0): the native building is unrotated, as SAM states", + "multiplicity: 1 IDF zone(s) (1 with their OS:ThermalZone), 0 ZoneGroup(s), 2 IDF subsurface(s) (2 with their OS:SubSurface) read; blank multipliers are the EnergyPlus default 1; every effective multiplier is 1, as SAM states", + "space:5080c000-0000-0000-0000-00000000c001 \u0027FixBox\u0027 = native space \u0027SAM_Space_FixBox_5080c000\u0027 by geometry (6 surfaces one to one); name carrier agrees", + "space:5080c000-0000-0000-0000-00000000c001: native signed shell volume 76.608 m3 (positive = outward-facing surfaces)", + "space:5080c000-0000-0000-0000-00000000c001: D-F9 stored volume 76.608 m3 vs geometric 76.608 m3: Identical", + "aperture:95717805-e6c7-4051-9c99-937da3d94f15@space:5080c000-0000-0000-0000-00000000c001: native subsurface \u0027SAM_SubSurface_FIX_WIN_FRAMED_0_95717805\u0027 with frame \u0027SAM_SubSurface_FIX_WIN_FRAMED_0_95717805_FrameAndDivider\u0027, identity Verified", + "aperture:95717805-e6c7-4051-9c99-937da3d94f15@space:5080c000-0000-0000-0000-00000000c001: native frame width 0.065 m; SAM T-FRAME OpenStudio rule: DefaultFrameWidth, else the frame layer thickness (pane = face offset inwards by 0.065 m)", + "aperture:6adea09c-1557-4dfd-bfab-75f66600343f@space:5080c000-0000-0000-0000-00000000c001: native subsurface \u0027SAM_SubSurface_FIX_WIN_UNFRAMED_0_6adea09c\u0027 (no frame), identity Verified", + "space:5080c000-0000-0000-0000-00000000c001: D-F2 V2; selection FIX_IC_BOX_VNT; requirement Value(0.03)", + "Ideal Loads \u0027SAM_IdealLoads_FixBox_5080c000\u0027: DCV \u0027None\u0027, economizer \u0027NoEconomizer\u0027, heat recovery \u0027None\u0027, availability \u0027\u0027", + "space:5080c000-0000-0000-0000-00000000c001: OSM DSOA \u0027SAM_InternalCondition_FIX_IC_BOX_af50b3dc_DesignSpecificationOutdoorAir\u0027 inherited from SpaceType \u0027SAM_InternalCondition_FIX_IC_BOX_af50b3dc\u0027; IDF Ideal Loads names \u0027SAM_InternalCondition_FIX_IC_BOX_af50b3dc_DesignSpecificationOutdoorAir\u0027", + "weather: run EPW sha256 472ffb4e2f10867600949a392ce46891fc1bd05f2fc8d8917a99bca7d26209c3; the OSM references a file with sha256 472ffb4e2f10867600949a392ce46891fc1bd05f2fc8d8917a99bca7d26209c3", + "weather: Site:GroundTemperature:BuildingSurface 4.58, 1.15, 0.22, 1.03, 5.66, 10.85, 15.73, 19.27, 20.3, 18.64, 14.64, 9.6 (9.ground, not gated)", + "design days: SAM states 0 (none); the IDF has 0 sizing period(s)", + "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c): 105 row-3a opaque optical row(s) on faces EnergyPlus 25.1 does not use are OUT-OF-ENGINE-SCOPE (informational, not gated): 69 differ from the native value, 36 equal it. Each holds a valid authored value and a valid native value on a face whose role S09 derived from SAM, the side and the native boundary. Every used face (each innermost layer\u0027s zone face, each outdoor outermost face), every thickness, conductivity, density and specific heat, and every row that is not valid and comparable is gated." + ], + "Inputs": { + "label": "box", + "modelSha256": "45524172b32f85df89511dd344141023de999faa9552a199e6b49062612acd08", + "epwSha256": "472ffb4e2f10867600949a392ce46891fc1bd05f2fc8d8917a99bca7d26209c3", + "osmSha256": "068dcddfc2dd2424fded429b2f0d42ee3ca1bda30c4ff9b67ae80f7295cd0ecd", + "idfSha256": "46a6ce6fccc6faf13c4f167cc11c483a64caf47a578490984faa4b942d726baa", + "openStudioSdk": "3.10.0\u002B86d7e215a1", + "writerSha256": "67a2ded78a22c9b83f5b536dc7b202314a686fe8c7718119afb676714a84e798", + "readerSha256": "d2368ce851b869138b386697e4ef3c9e74b2cb86ef80077133172378517ed4a5", + "exportPid": "44776", + "readerPid": "40056", + "comparePid": "35028", + "exportProcessStartedUtc": "2026-10-23T11:27:00.3636738Z", + "readerProcessStartedUtc": "2026-10-23T11:27:03.7562545Z", + "compareProcessStartedUtc": "2026-10-23T11:27:04.1354615Z", + "mutation": null, + "writerDiagnostics": "Information SAM-OS-IC-002 Lighting radiant proportion p = 0.37 (authored) is split under S07 \u00A75.1 T-LIGHT-SPLIT: Fraction Radiant = p\u00B7(1 \u2212 s) = 0.21487, Fraction Visible = p\u00B7s = 0.15513, Return Air Fraction 0, convective 1 \u2212 p = 0.63; s = 0.2415 / 0.576 = 0.4192708 (short-wave share of the radiant output). s is a declared assumption, not SAM data. Reference category: suspended (pendant) LED office lighting with the entire fitting in the conditioned room; a midpoint-derived reference from cited historical ranges (IEA SHC Task 61 / EBC Annex 77 D1, Table 6; ASHRAE Fundamentals 2017, Ch. 18, Table 3), not manufacturer-certified. Not applicable to recessed troffers, downlights, retrofit kits, high-bays or non-LED lamps. | Information SAM-OS-RUN-002 Annual weather source: explicit EPW (weather.epw) | Information SAM-OS-RUN-002 Ground temperatures taken from the EPW GROUND TEMPERATURES header (depth 0.5 m set, 12 monthly values) | Information SAM-OS-RUN-002 No design-day source supplied; sizing-period runs stay disabled unless OpenStudioConversionOptions.RunSizingPeriods overrides", + "translatorMessages": "0" + } +} \ No newline at end of file diff --git a/documentation/S09-OpenStudio-InputReadBack-evidence/acceptance-2026-10-23/runs/box/report-approved.txt b/documentation/S09-OpenStudio-InputReadBack-evidence/acceptance-2026-10-23/runs/box/report-approved.txt new file mode 100644 index 0000000..28008a5 --- /dev/null +++ b/documentation/S09-OpenStudio-InputReadBack-evidence/acceptance-2026-10-23/runs/box/report-approved.txt @@ -0,0 +1,17 @@ +S09 OpenStudio read-back: s08-fix-box -> Pass (exit 0); rule set Approved; gate Pass; coverage Complete (319 required, 319 results); gated non-PASS 0; out-of-engine-scope 105 (informational, not gated) +outcomes: AcceptedTransformation 4, Match 183, NotApplicable 1, OutOfEngineScope 105, WithinTolerance 26 +D-F2 space:5080c000-0000-0000-0000-00000000c001: V2 +OUT-OF-ENGINE-SCOPE (informational, not gated; S07 §5.2 amendment U1 (SAM#218 b06dbe8c)): 105 row(s), 69 differing, 36 equal; by scope: buried layer face 102, ground surface outer face 3; by property: externalEmissivity 18, externalLightReflectance 18, externalSolarReflectance 18, internalEmissivity 17, internalLightReflectance 17, internalSolarReflectance 17 + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.externalSolarReflectance: SAM 0.31, native 0.31000000000000005, |d| 5.551115123125783E-17 (WithinTolerance); ground surface outer face; SAM 'FIX_Concrete', native 'SAM_OpaqueMaterial_FIX_Concrete_150mm_9d3a3ab2' + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.internalSolarReflectance: SAM 0.29, native 0.31000000000000005, |d| 0.020000000000000073 (OutsideTolerance); buried layer face (layer 1 of 3, SAM internal face); SAM 'FIX_Concrete', native 'SAM_OpaqueMaterial_FIX_Concrete_150mm_9d3a3ab2' + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.externalLightReflectance: SAM 0.32, native 0.31999999999999995, |d| 5.551115123125783E-17 (WithinTolerance); ground surface outer face; SAM 'FIX_Concrete', native 'SAM_OpaqueMaterial_FIX_Concrete_150mm_9d3a3ab2' + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.internalLightReflectance: SAM 0.3, native 0.31999999999999995, |d| 0.019999999999999962 (OutsideTolerance); buried layer face (layer 1 of 3, SAM internal face); SAM 'FIX_Concrete', native 'SAM_OpaqueMaterial_FIX_Concrete_150mm_9d3a3ab2' + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.externalEmissivity: SAM 0.95, native 0.95, |d| 0 (Identical); ground surface outer face; SAM 'FIX_Concrete', native 'SAM_OpaqueMaterial_FIX_Concrete_150mm_9d3a3ab2' + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.internalEmissivity: SAM 0.87, native 0.95, |d| 0.07999999999999996 (OutsideTolerance); buried layer face (layer 1 of 3, SAM internal face); SAM 'FIX_Concrete', native 'SAM_OpaqueMaterial_FIX_Concrete_150mm_9d3a3ab2' + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.externalSolarReflectance: SAM 0.58, native 0.5800000000000001, |d| 1.1102230246251565E-16 (WithinTolerance); buried layer face (layer 2 of 3, SAM external face); SAM 'FIX_EPS', native 'SAM_OpaqueMaterial_FIX_EPS_120mm_23500162' + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.internalSolarReflectance: SAM 0.61, native 0.5800000000000001, |d| 0.029999999999999916 (OutsideTolerance); buried layer face (layer 2 of 3, SAM internal face); SAM 'FIX_EPS', native 'SAM_OpaqueMaterial_FIX_EPS_120mm_23500162' + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.externalLightReflectance: SAM 0.59, native 0.5900000000000001, |d| 1.1102230246251565E-16 (WithinTolerance); buried layer face (layer 2 of 3, SAM external face); SAM 'FIX_EPS', native 'SAM_OpaqueMaterial_FIX_EPS_120mm_23500162' + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.internalLightReflectance: SAM 0.63, native 0.5900000000000001, |d| 0.039999999999999925 (OutsideTolerance); buried layer face (layer 2 of 3, SAM internal face); SAM 'FIX_EPS', native 'SAM_OpaqueMaterial_FIX_EPS_120mm_23500162' + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.externalEmissivity: SAM 0.85, native 0.85, |d| 0 (Identical); buried layer face (layer 2 of 3, SAM external face); SAM 'FIX_EPS', native 'SAM_OpaqueMaterial_FIX_EPS_120mm_23500162' + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.internalEmissivity: SAM 0.96, native 0.85, |d| 0.10999999999999999 (OutsideTolerance); buried layer face (layer 2 of 3, SAM internal face); SAM 'FIX_EPS', native 'SAM_OpaqueMaterial_FIX_EPS_120mm_23500162' + ... 93 more in report.json diff --git a/documentation/S09-OpenStudio-InputReadBack-evidence/acceptance-2026-10-23/runs/box/report-provisional.txt b/documentation/S09-OpenStudio-InputReadBack-evidence/acceptance-2026-10-23/runs/box/report-provisional.txt new file mode 100644 index 0000000..2b63ce9 --- /dev/null +++ b/documentation/S09-OpenStudio-InputReadBack-evidence/acceptance-2026-10-23/runs/box/report-provisional.txt @@ -0,0 +1,17 @@ +S09 OpenStudio read-back: s08-fix-box -> Pass (exit 0); rule set ProvisionalProposed; gate Pass; coverage Complete (319 required, 319 results); gated non-PASS 0; out-of-engine-scope 105 (informational, not gated) +outcomes: AcceptedTransformation 4, Match 183, NotApplicable 1, OutOfEngineScope 105, WithinTolerance 26 +D-F2 space:5080c000-0000-0000-0000-00000000c001: V2 +OUT-OF-ENGINE-SCOPE (informational, not gated; S07 §5.2 amendment U1 (SAM#218 b06dbe8c)): 105 row(s), 69 differing, 36 equal; by scope: buried layer face 102, ground surface outer face 3; by property: externalEmissivity 18, externalLightReflectance 18, externalSolarReflectance 18, internalEmissivity 17, internalLightReflectance 17, internalSolarReflectance 17 + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.externalSolarReflectance: SAM 0.31, native 0.31000000000000005, |d| 5.551115123125783E-17 (WithinTolerance); ground surface outer face; SAM 'FIX_Concrete', native 'SAM_OpaqueMaterial_FIX_Concrete_150mm_9d3a3ab2' + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.internalSolarReflectance: SAM 0.29, native 0.31000000000000005, |d| 0.020000000000000073 (OutsideTolerance); buried layer face (layer 1 of 3, SAM internal face); SAM 'FIX_Concrete', native 'SAM_OpaqueMaterial_FIX_Concrete_150mm_9d3a3ab2' + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.externalLightReflectance: SAM 0.32, native 0.31999999999999995, |d| 5.551115123125783E-17 (WithinTolerance); ground surface outer face; SAM 'FIX_Concrete', native 'SAM_OpaqueMaterial_FIX_Concrete_150mm_9d3a3ab2' + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.internalLightReflectance: SAM 0.3, native 0.31999999999999995, |d| 0.019999999999999962 (OutsideTolerance); buried layer face (layer 1 of 3, SAM internal face); SAM 'FIX_Concrete', native 'SAM_OpaqueMaterial_FIX_Concrete_150mm_9d3a3ab2' + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.externalEmissivity: SAM 0.95, native 0.95, |d| 0 (Identical); ground surface outer face; SAM 'FIX_Concrete', native 'SAM_OpaqueMaterial_FIX_Concrete_150mm_9d3a3ab2' + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.internalEmissivity: SAM 0.87, native 0.95, |d| 0.07999999999999996 (OutsideTolerance); buried layer face (layer 1 of 3, SAM internal face); SAM 'FIX_Concrete', native 'SAM_OpaqueMaterial_FIX_Concrete_150mm_9d3a3ab2' + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.externalSolarReflectance: SAM 0.58, native 0.5800000000000001, |d| 1.1102230246251565E-16 (WithinTolerance); buried layer face (layer 2 of 3, SAM external face); SAM 'FIX_EPS', native 'SAM_OpaqueMaterial_FIX_EPS_120mm_23500162' + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.internalSolarReflectance: SAM 0.61, native 0.5800000000000001, |d| 0.029999999999999916 (OutsideTolerance); buried layer face (layer 2 of 3, SAM internal face); SAM 'FIX_EPS', native 'SAM_OpaqueMaterial_FIX_EPS_120mm_23500162' + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.externalLightReflectance: SAM 0.59, native 0.5900000000000001, |d| 1.1102230246251565E-16 (WithinTolerance); buried layer face (layer 2 of 3, SAM external face); SAM 'FIX_EPS', native 'SAM_OpaqueMaterial_FIX_EPS_120mm_23500162' + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.internalLightReflectance: SAM 0.63, native 0.5900000000000001, |d| 0.039999999999999925 (OutsideTolerance); buried layer face (layer 2 of 3, SAM internal face); SAM 'FIX_EPS', native 'SAM_OpaqueMaterial_FIX_EPS_120mm_23500162' + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.externalEmissivity: SAM 0.85, native 0.85, |d| 0 (Identical); buried layer face (layer 2 of 3, SAM external face); SAM 'FIX_EPS', native 'SAM_OpaqueMaterial_FIX_EPS_120mm_23500162' + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.internalEmissivity: SAM 0.96, native 0.85, |d| 0.10999999999999999 (OutsideTolerance); buried layer face (layer 2 of 3, SAM internal face); SAM 'FIX_EPS', native 'SAM_OpaqueMaterial_FIX_EPS_120mm_23500162' + ... 93 more in report.json diff --git a/documentation/S09-OpenStudio-InputReadBack-evidence/acceptance-2026-10-23/runs/two/export.json b/documentation/S09-OpenStudio-InputReadBack-evidence/acceptance-2026-10-23/runs/two/export.json new file mode 100644 index 0000000..0746ff9 --- /dev/null +++ b/documentation/S09-OpenStudio-InputReadBack-evidence/acceptance-2026-10-23/runs/two/export.json @@ -0,0 +1,42 @@ +{ + "Schema": "s09-export/2", + "Label": "two", + "Mutation": null, + "SourceModelPath": "/s08-fix-two.json", + "SourceEpwPath": "/budapest.epw", + "ModelSha256": "20da9b586345e9fc67dc6308e6da1578b9bc41b3c694dbdab37e9c677959baa0", + "EpwSha256": "472ffb4e2f10867600949a392ce46891fc1bd05f2fc8d8917a99bca7d26209c3", + "OsmSha256": "4e0d970d55848dd2e6f0153335111ca076d238dd25e30cccdc518b2db2aac70a", + "IdfSha256": "010327464aef2237fa2f3220c97415992ab237de2c0c4628c46137e901fef176", + "OpenStudioSdkVersion": "3.10.0\u002B86d7e215a1", + "WriterAssembly": "/SAM.Analytical.OpenStudio.dll", + "WriterAssemblySha256": "67a2ded78a22c9b83f5b536dc7b202314a686fe8c7718119afb676714a84e798", + "ProcessId": 48144, + "ProcessStartedUtc": "2026-10-23T11:27:05.5340609Z", + "StartedUtc": "2026-10-23T11:27:05.5963549Z", + "FinishedUtc": "2026-10-23T11:27:09.7799146Z", + "ConversionValid": true, + "Diagnostics": [ + "Information SAM-OS-IC-002 Lighting radiant proportion p = 0.34 (authored) is split under S07 \u00A75.1 T-LIGHT-SPLIT: Fraction Radiant = p\u00B7(1 \u2212 s) = 0.197448, Fraction Visible = p\u00B7s = 0.142552, Return Air Fraction 0, convective 1 \u2212 p = 0.66; s = 0.2415 / 0.576 = 0.4192708 (short-wave share of the radiant output). s is a declared assumption, not SAM data. Reference category: suspended (pendant) LED office lighting with the entire fitting in the conditioned room; a midpoint-derived reference from cited historical ranges (IEA SHC Task 61 / EBC Annex 77 D1, Table 6; ASHRAE Fundamentals 2017, Ch. 18, Table 3), not manufacturer-certified. Not applicable to recessed troffers, downlights, retrofit kits, high-bays or non-LED lamps.", + "Information SAM-OS-HVAC-001 No Ventilation profile is selected: the outdoor-air requirement is kept and no outdoor air is delivered (S07 D-F2 V1)", + "Information SAM-OS-IC-002 Lighting radiant proportion p = 0.41 (authored) is split under S07 \u00A75.1 T-LIGHT-SPLIT: Fraction Radiant = p\u00B7(1 \u2212 s) = 0.238099, Fraction Visible = p\u00B7s = 0.171901, Return Air Fraction 0, convective 1 \u2212 p = 0.59; s = 0.2415 / 0.576 = 0.4192708 (short-wave share of the radiant output). s is a declared assumption, not SAM data. Reference category: suspended (pendant) LED office lighting with the entire fitting in the conditioned room; a midpoint-derived reference from cited historical ranges (IEA SHC Task 61 / EBC Annex 77 D1, Table 6; ASHRAE Fundamentals 2017, Ch. 18, Table 3), not manufacturer-certified. Not applicable to recessed troffers, downlights, retrofit kits, high-bays or non-LED lamps.", + "Information SAM-OS-HVAC-001 No Ventilation profile is selected: the outdoor-air requirement is kept and no outdoor air is delivered (S07 D-F2 V1)", + "Information SAM-OS-MAT-002 Vapour diffusion factor (110) is not converted \u2014 EnergyPlus moisture modelling (HAMT/EMPD) needs data SAM does not carry", + "Information SAM-OS-MAT-002 Vapour diffusion factor (40) is not converted \u2014 EnergyPlus moisture modelling (HAMT/EMPD) needs data SAM does not carry", + "Information SAM-OS-MAT-002 Vapour diffusion factor (15) is not converted \u2014 EnergyPlus moisture modelling (HAMT/EMPD) needs data SAM does not carry", + "Information SAM-OS-MAT-002 Vapour diffusion factor (5E\u002B04) is not converted \u2014 EnergyPlus moisture modelling (HAMT/EMPD) needs data SAM does not carry", + "Information SAM-OS-MAT-002 Vapour diffusion factor (165) is not converted \u2014 EnergyPlus moisture modelling (HAMT/EMPD) needs data SAM does not carry", + "Information SAM-OS-MAT-002 Vapour diffusion factor (60) is not converted \u2014 EnergyPlus moisture modelling (HAMT/EMPD) needs data SAM does not carry", + "Information SAM-OS-MAT-002 Vapour diffusion factor (8) is not converted \u2014 EnergyPlus moisture modelling (HAMT/EMPD) needs data SAM does not carry", + "Information SAM-OS-MAT-002 Vapour diffusion factor (25) is not converted \u2014 EnergyPlus moisture modelling (HAMT/EMPD) needs data SAM does not carry", + "Information SAM-OS-MAT-002 Vapour diffusion factor (10) is not converted \u2014 EnergyPlus moisture modelling (HAMT/EMPD) needs data SAM does not carry", + "Information SAM-OS-MAT-002 Vapour diffusion factor (1.2) is not converted \u2014 EnergyPlus moisture modelling (HAMT/EMPD) needs data SAM does not carry", + "Information SAM-OS-MAT-002 Vapour diffusion factor (50) is not converted \u2014 EnergyPlus moisture modelling (HAMT/EMPD) needs data SAM does not carry", + "Information SAM-OS-MAT-002 Vapour diffusion factor (45) is not converted \u2014 EnergyPlus moisture modelling (HAMT/EMPD) needs data SAM does not carry", + "Information SAM-OS-MAT-002 Vapour diffusion factor (1E\u002B05) is not converted \u2014 EnergyPlus moisture modelling (HAMT/EMPD) needs data SAM does not carry", + "Information SAM-OS-RUN-002 Annual weather source: explicit EPW (weather.epw)", + "Information SAM-OS-RUN-002 Ground temperatures taken from the EPW GROUND TEMPERATURES header (depth 0.5 m set, 12 monthly values)", + "Information SAM-OS-RUN-002 No design-day source supplied; sizing-period runs stay disabled unless OpenStudioConversionOptions.RunSizingPeriods overrides" + ], + "TranslatorMessages": [] +} \ No newline at end of file diff --git a/documentation/S09-OpenStudio-InputReadBack-evidence/acceptance-2026-10-23/runs/two/report-approved.json b/documentation/S09-OpenStudio-InputReadBack-evidence/acceptance-2026-10-23/runs/two/report-approved.json new file mode 100644 index 0000000..ab6f012 --- /dev/null +++ b/documentation/S09-OpenStudio-InputReadBack-evidence/acceptance-2026-10-23/runs/two/report-approved.json @@ -0,0 +1,4183 @@ +{ + "Schema": "s09-readback-report/3", + "FixtureId": "s08-fix-two", + "RuleSet": "Approved", + "Status": "Pass", + "ExitCode": 0, + "GateStatus": "Pass", + "Coverage": "Complete", + "Required": 592, + "Results": 592, + "MissingComparisons": [], + "CountByOutcome": { + "AcceptedTransformation": 14, + "Match": 319, + "NotApplicable": 1, + "OutOfEngineScope": 216, + "WithinTolerance": 42 + }, + "NonPass": [], + "GatedNonPass": 0, + "OutOfEngineScope": { + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)", + "Count": 216, + "Differing": 138, + "Equal": 78, + "CountByScope": { + "buried layer face": 204, + "ground surface outer face": 6, + "interzone surface outer face": 6 + }, + "CountByProperty": { + "externalEmissivity": 37, + "externalLightReflectance": 37, + "externalSolarReflectance": 37, + "internalEmissivity": 35, + "internalLightReflectance": 35, + "internalSolarReflectance": 35 + }, + "Rows": [ + { + "Quantity": "3a", + "Key": "panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer1.externalSolarReflectance", + "Side": "panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1", + "Layer": 1, + "LayerCount": 3, + "Property": "externalSolarReflectance", + "SamFace": "external", + "SamMaterial": "FIX_Concrete", + "NativeObject": "SAM_OpaqueMaterial_FIX_Concrete_150mm_b313ccd6", + "SamValue": 0.31, + "NativeValue": 0.31000000000000005, + "Delta": 5.551115123125783E-17, + "NumericVerdict": "WithinTolerance", + "Differs": false, + "ScopeReason": "ground surface outer face", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer1.internalSolarReflectance", + "Side": "panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1", + "Layer": 1, + "LayerCount": 3, + "Property": "internalSolarReflectance", + "SamFace": "internal", + "SamMaterial": "FIX_Concrete", + "NativeObject": "SAM_OpaqueMaterial_FIX_Concrete_150mm_b313ccd6", + "SamValue": 0.29, + "NativeValue": 0.31000000000000005, + "Delta": 0.020000000000000073, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 1 of 3, SAM internal face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer1.externalLightReflectance", + "Side": "panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1", + "Layer": 1, + "LayerCount": 3, + "Property": "externalLightReflectance", + "SamFace": "external", + "SamMaterial": "FIX_Concrete", + "NativeObject": "SAM_OpaqueMaterial_FIX_Concrete_150mm_b313ccd6", + "SamValue": 0.32, + "NativeValue": 0.31999999999999995, + "Delta": 5.551115123125783E-17, + "NumericVerdict": "WithinTolerance", + "Differs": false, + "ScopeReason": "ground surface outer face", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer1.internalLightReflectance", + "Side": "panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1", + "Layer": 1, + "LayerCount": 3, + "Property": "internalLightReflectance", + "SamFace": "internal", + "SamMaterial": "FIX_Concrete", + "NativeObject": "SAM_OpaqueMaterial_FIX_Concrete_150mm_b313ccd6", + "SamValue": 0.3, + "NativeValue": 0.31999999999999995, + "Delta": 0.019999999999999962, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 1 of 3, SAM internal face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer1.externalEmissivity", + "Side": "panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1", + "Layer": 1, + "LayerCount": 3, + "Property": "externalEmissivity", + "SamFace": "external", + "SamMaterial": "FIX_Concrete", + "NativeObject": "SAM_OpaqueMaterial_FIX_Concrete_150mm_b313ccd6", + "SamValue": 0.95, + "NativeValue": 0.95, + "Delta": 0, + "NumericVerdict": "Identical", + "Differs": false, + "ScopeReason": "ground surface outer face", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer1.internalEmissivity", + "Side": "panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1", + "Layer": 1, + "LayerCount": 3, + "Property": "internalEmissivity", + "SamFace": "internal", + "SamMaterial": "FIX_Concrete", + "NativeObject": "SAM_OpaqueMaterial_FIX_Concrete_150mm_b313ccd6", + "SamValue": 0.87, + "NativeValue": 0.95, + "Delta": 0.07999999999999996, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 1 of 3, SAM internal face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer2.externalSolarReflectance", + "Side": "panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1", + "Layer": 2, + "LayerCount": 3, + "Property": "externalSolarReflectance", + "SamFace": "external", + "SamMaterial": "FIX_EPS", + "NativeObject": "SAM_OpaqueMaterial_FIX_EPS_120mm_c3cb21c2", + "SamValue": 0.58, + "NativeValue": 0.5800000000000001, + "Delta": 1.1102230246251565E-16, + "NumericVerdict": "WithinTolerance", + "Differs": false, + "ScopeReason": "buried layer face (layer 2 of 3, SAM external face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer2.internalSolarReflectance", + "Side": "panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1", + "Layer": 2, + "LayerCount": 3, + "Property": "internalSolarReflectance", + "SamFace": "internal", + "SamMaterial": "FIX_EPS", + "NativeObject": "SAM_OpaqueMaterial_FIX_EPS_120mm_c3cb21c2", + "SamValue": 0.61, + "NativeValue": 0.5800000000000001, + "Delta": 0.029999999999999916, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 2 of 3, SAM internal face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer2.externalLightReflectance", + "Side": "panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1", + "Layer": 2, + "LayerCount": 3, + "Property": "externalLightReflectance", + "SamFace": "external", + "SamMaterial": "FIX_EPS", + "NativeObject": "SAM_OpaqueMaterial_FIX_EPS_120mm_c3cb21c2", + "SamValue": 0.59, + "NativeValue": 0.5900000000000001, + "Delta": 1.1102230246251565E-16, + "NumericVerdict": "WithinTolerance", + "Differs": false, + "ScopeReason": "buried layer face (layer 2 of 3, SAM external face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer2.internalLightReflectance", + "Side": "panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1", + "Layer": 2, + "LayerCount": 3, + "Property": "internalLightReflectance", + "SamFace": "internal", + "SamMaterial": "FIX_EPS", + "NativeObject": "SAM_OpaqueMaterial_FIX_EPS_120mm_c3cb21c2", + "SamValue": 0.63, + "NativeValue": 0.5900000000000001, + "Delta": 0.039999999999999925, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 2 of 3, SAM internal face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer2.externalEmissivity", + "Side": "panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1", + "Layer": 2, + "LayerCount": 3, + "Property": "externalEmissivity", + "SamFace": "external", + "SamMaterial": "FIX_EPS", + "NativeObject": "SAM_OpaqueMaterial_FIX_EPS_120mm_c3cb21c2", + "SamValue": 0.85, + "NativeValue": 0.85, + "Delta": 0, + "NumericVerdict": "Identical", + "Differs": false, + "ScopeReason": "buried layer face (layer 2 of 3, SAM external face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer2.internalEmissivity", + "Side": "panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1", + "Layer": 2, + "LayerCount": 3, + "Property": "internalEmissivity", + "SamFace": "internal", + "SamMaterial": "FIX_EPS", + "NativeObject": "SAM_OpaqueMaterial_FIX_EPS_120mm_c3cb21c2", + "SamValue": 0.96, + "NativeValue": 0.85, + "Delta": 0.10999999999999999, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 2 of 3, SAM internal face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer3.externalSolarReflectance", + "Side": "panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1", + "Layer": 3, + "LayerCount": 3, + "Property": "externalSolarReflectance", + "SamFace": "external", + "SamMaterial": "FIX_Screed", + "NativeObject": "SAM_OpaqueMaterial_FIX_Screed_65mm_Internal_ba808960", + "SamValue": 0.27, + "NativeValue": 0.32999999999999996, + "Delta": 0.05999999999999994, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 3 of 3, SAM external face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer3.externalLightReflectance", + "Side": "panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1", + "Layer": 3, + "LayerCount": 3, + "Property": "externalLightReflectance", + "SamFace": "external", + "SamMaterial": "FIX_Screed", + "NativeObject": "SAM_OpaqueMaterial_FIX_Screed_65mm_Internal_ba808960", + "SamValue": 0.28, + "NativeValue": 0.33999999999999997, + "Delta": 0.05999999999999994, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 3 of 3, SAM external face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer3.externalEmissivity", + "Side": "panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1", + "Layer": 3, + "LayerCount": 3, + "Property": "externalEmissivity", + "SamFace": "external", + "SamMaterial": "FIX_Screed", + "NativeObject": "SAM_OpaqueMaterial_FIX_Screed_65mm_Internal_ba808960", + "SamValue": 0.94, + "NativeValue": 0.9, + "Delta": 0.039999999999999925, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 3 of 3, SAM external face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:fe8a6b43-ec73-4201-91e8-0dedf413b25c@space:5080c000-0000-0000-0000-00000000c0a1#layer1.internalSolarReflectance", + "Side": "panel:fe8a6b43-ec73-4201-91e8-0dedf413b25c@space:5080c000-0000-0000-0000-00000000c0a1", + "Layer": 1, + "LayerCount": 4, + "Property": "internalSolarReflectance", + "SamFace": "internal", + "SamMaterial": "FIX_Membrane", + "NativeObject": "SAM_OpaqueMaterial_FIX_Membrane_4mm_720b0f60", + "SamValue": 0.24, + "NativeValue": 0.14, + "Delta": 0.09999999999999998, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 1 of 4, SAM internal face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:fe8a6b43-ec73-4201-91e8-0dedf413b25c@space:5080c000-0000-0000-0000-00000000c0a1#layer1.internalLightReflectance", + "Side": "panel:fe8a6b43-ec73-4201-91e8-0dedf413b25c@space:5080c000-0000-0000-0000-00000000c0a1", + "Layer": 1, + "LayerCount": 4, + "Property": "internalLightReflectance", + "SamFace": "internal", + "SamMaterial": "FIX_Membrane", + "NativeObject": "SAM_OpaqueMaterial_FIX_Membrane_4mm_720b0f60", + "SamValue": 0.25, + "NativeValue": 0.15000000000000002, + "Delta": 0.09999999999999998, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 1 of 4, SAM internal face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:fe8a6b43-ec73-4201-91e8-0dedf413b25c@space:5080c000-0000-0000-0000-00000000c0a1#layer1.internalEmissivity", + "Side": "panel:fe8a6b43-ec73-4201-91e8-0dedf413b25c@space:5080c000-0000-0000-0000-00000000c0a1", + "Layer": 1, + "LayerCount": 4, + "Property": "internalEmissivity", + "SamFace": "internal", + "SamMaterial": "FIX_Membrane", + "NativeObject": "SAM_OpaqueMaterial_FIX_Membrane_4mm_720b0f60", + "SamValue": 0.86, + "NativeValue": 0.92, + "Delta": 0.06000000000000005, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 1 of 4, SAM internal face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:fe8a6b43-ec73-4201-91e8-0dedf413b25c@space:5080c000-0000-0000-0000-00000000c0a1#layer2.externalSolarReflectance", + "Side": "panel:fe8a6b43-ec73-4201-91e8-0dedf413b25c@space:5080c000-0000-0000-0000-00000000c0a1", + "Layer": 2, + "LayerCount": 4, + "Property": "externalSolarReflectance", + "SamFace": "external", + "SamMaterial": "FIX_OSB", + "NativeObject": "SAM_OpaqueMaterial_FIX_OSB_18mm_9487bdd1", + "SamValue": 0.43, + "NativeValue": 0.43000000000000005, + "Delta": 5.551115123125783E-17, + "NumericVerdict": "WithinTolerance", + "Differs": false, + "ScopeReason": "buried layer face (layer 2 of 4, SAM external face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:fe8a6b43-ec73-4201-91e8-0dedf413b25c@space:5080c000-0000-0000-0000-00000000c0a1#layer2.internalSolarReflectance", + "Side": "panel:fe8a6b43-ec73-4201-91e8-0dedf413b25c@space:5080c000-0000-0000-0000-00000000c0a1", + "Layer": 2, + "LayerCount": 4, + "Property": "internalSolarReflectance", + "SamFace": "internal", + "SamMaterial": "FIX_OSB", + "NativeObject": "SAM_OpaqueMaterial_FIX_OSB_18mm_9487bdd1", + "SamValue": 0.47, + "NativeValue": 0.43000000000000005, + "Delta": 0.039999999999999925, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 2 of 4, SAM internal face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:fe8a6b43-ec73-4201-91e8-0dedf413b25c@space:5080c000-0000-0000-0000-00000000c0a1#layer2.externalLightReflectance", + "Side": "panel:fe8a6b43-ec73-4201-91e8-0dedf413b25c@space:5080c000-0000-0000-0000-00000000c0a1", + "Layer": 2, + "LayerCount": 4, + "Property": "externalLightReflectance", + "SamFace": "external", + "SamMaterial": "FIX_OSB", + "NativeObject": "SAM_OpaqueMaterial_FIX_OSB_18mm_9487bdd1", + "SamValue": 0.42, + "NativeValue": 0.42000000000000004, + "Delta": 5.551115123125783E-17, + "NumericVerdict": "WithinTolerance", + "Differs": false, + "ScopeReason": "buried layer face (layer 2 of 4, SAM external face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:fe8a6b43-ec73-4201-91e8-0dedf413b25c@space:5080c000-0000-0000-0000-00000000c0a1#layer2.internalLightReflectance", + "Side": "panel:fe8a6b43-ec73-4201-91e8-0dedf413b25c@space:5080c000-0000-0000-0000-00000000c0a1", + "Layer": 2, + "LayerCount": 4, + "Property": "internalLightReflectance", + "SamFace": "internal", + "SamMaterial": "FIX_OSB", + "NativeObject": "SAM_OpaqueMaterial_FIX_OSB_18mm_9487bdd1", + "SamValue": 0.48, + "NativeValue": 0.42000000000000004, + "Delta": 0.05999999999999994, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 2 of 4, SAM internal face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:fe8a6b43-ec73-4201-91e8-0dedf413b25c@space:5080c000-0000-0000-0000-00000000c0a1#layer2.externalEmissivity", + "Side": "panel:fe8a6b43-ec73-4201-91e8-0dedf413b25c@space:5080c000-0000-0000-0000-00000000c0a1", + "Layer": 2, + "LayerCount": 4, + "Property": "externalEmissivity", + "SamFace": "external", + "SamMaterial": "FIX_OSB", + "NativeObject": "SAM_OpaqueMaterial_FIX_OSB_18mm_9487bdd1", + "SamValue": 0.91, + "NativeValue": 0.91, + "Delta": 0, + "NumericVerdict": "Identical", + "Differs": false, + "ScopeReason": "buried layer face (layer 2 of 4, SAM external face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:fe8a6b43-ec73-4201-91e8-0dedf413b25c@space:5080c000-0000-0000-0000-00000000c0a1#layer2.internalEmissivity", + "Side": "panel:fe8a6b43-ec73-4201-91e8-0dedf413b25c@space:5080c000-0000-0000-0000-00000000c0a1", + "Layer": 2, + "LayerCount": 4, + "Property": "internalEmissivity", + "SamFace": "internal", + "SamMaterial": "FIX_OSB", + "NativeObject": "SAM_OpaqueMaterial_FIX_OSB_18mm_9487bdd1", + "SamValue": 0.89, + "NativeValue": 0.91, + "Delta": 0.020000000000000018, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 2 of 4, SAM internal face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:fe8a6b43-ec73-4201-91e8-0dedf413b25c@space:5080c000-0000-0000-0000-00000000c0a1#layer3.externalSolarReflectance", + "Side": "panel:fe8a6b43-ec73-4201-91e8-0dedf413b25c@space:5080c000-0000-0000-0000-00000000c0a1", + "Layer": 3, + "LayerCount": 4, + "Property": "externalSolarReflectance", + "SamFace": "external", + "SamMaterial": "FIX_PIR", + "NativeObject": "SAM_OpaqueMaterial_FIX_PIR_160mm_06224e1b", + "SamValue": 0.53, + "NativeValue": 0.53, + "Delta": 0, + "NumericVerdict": "Identical", + "Differs": false, + "ScopeReason": "buried layer face (layer 3 of 4, SAM external face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:fe8a6b43-ec73-4201-91e8-0dedf413b25c@space:5080c000-0000-0000-0000-00000000c0a1#layer3.internalSolarReflectance", + "Side": "panel:fe8a6b43-ec73-4201-91e8-0dedf413b25c@space:5080c000-0000-0000-0000-00000000c0a1", + "Layer": 3, + "LayerCount": 4, + "Property": "internalSolarReflectance", + "SamFace": "internal", + "SamMaterial": "FIX_PIR", + "NativeObject": "SAM_OpaqueMaterial_FIX_PIR_160mm_06224e1b", + "SamValue": 0.55, + "NativeValue": 0.53, + "Delta": 0.020000000000000018, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 3 of 4, SAM internal face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:fe8a6b43-ec73-4201-91e8-0dedf413b25c@space:5080c000-0000-0000-0000-00000000c0a1#layer3.externalLightReflectance", + "Side": "panel:fe8a6b43-ec73-4201-91e8-0dedf413b25c@space:5080c000-0000-0000-0000-00000000c0a1", + "Layer": 3, + "LayerCount": 4, + "Property": "externalLightReflectance", + "SamFace": "external", + "SamMaterial": "FIX_PIR", + "NativeObject": "SAM_OpaqueMaterial_FIX_PIR_160mm_06224e1b", + "SamValue": 0.54, + "NativeValue": 0.54, + "Delta": 0, + "NumericVerdict": "Identical", + "Differs": false, + "ScopeReason": "buried layer face (layer 3 of 4, SAM external face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:fe8a6b43-ec73-4201-91e8-0dedf413b25c@space:5080c000-0000-0000-0000-00000000c0a1#layer3.internalLightReflectance", + "Side": "panel:fe8a6b43-ec73-4201-91e8-0dedf413b25c@space:5080c000-0000-0000-0000-00000000c0a1", + "Layer": 3, + "LayerCount": 4, + "Property": "internalLightReflectance", + "SamFace": "internal", + "SamMaterial": "FIX_PIR", + "NativeObject": "SAM_OpaqueMaterial_FIX_PIR_160mm_06224e1b", + "SamValue": 0.56, + "NativeValue": 0.54, + "Delta": 0.020000000000000018, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 3 of 4, SAM internal face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:fe8a6b43-ec73-4201-91e8-0dedf413b25c@space:5080c000-0000-0000-0000-00000000c0a1#layer3.externalEmissivity", + "Side": "panel:fe8a6b43-ec73-4201-91e8-0dedf413b25c@space:5080c000-0000-0000-0000-00000000c0a1", + "Layer": 3, + "LayerCount": 4, + "Property": "externalEmissivity", + "SamFace": "external", + "SamMaterial": "FIX_PIR", + "NativeObject": "SAM_OpaqueMaterial_FIX_PIR_160mm_06224e1b", + "SamValue": 0.87, + "NativeValue": 0.87, + "Delta": 0, + "NumericVerdict": "Identical", + "Differs": false, + "ScopeReason": "buried layer face (layer 3 of 4, SAM external face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:fe8a6b43-ec73-4201-91e8-0dedf413b25c@space:5080c000-0000-0000-0000-00000000c0a1#layer3.internalEmissivity", + "Side": "panel:fe8a6b43-ec73-4201-91e8-0dedf413b25c@space:5080c000-0000-0000-0000-00000000c0a1", + "Layer": 3, + "LayerCount": 4, + "Property": "internalEmissivity", + "SamFace": "internal", + "SamMaterial": "FIX_PIR", + "NativeObject": "SAM_OpaqueMaterial_FIX_PIR_160mm_06224e1b", + "SamValue": 0.95, + "NativeValue": 0.87, + "Delta": 0.07999999999999996, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 3 of 4, SAM internal face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:fe8a6b43-ec73-4201-91e8-0dedf413b25c@space:5080c000-0000-0000-0000-00000000c0a1#layer4.externalSolarReflectance", + "Side": "panel:fe8a6b43-ec73-4201-91e8-0dedf413b25c@space:5080c000-0000-0000-0000-00000000c0a1", + "Layer": 4, + "LayerCount": 4, + "Property": "externalSolarReflectance", + "SamFace": "external", + "SamMaterial": "FIX_Plasterboard", + "NativeObject": "SAM_OpaqueMaterial_FIX_Plasterboard_15mm_Internal_37d096dc", + "SamValue": 0.62, + "NativeValue": 0.6799999999999999, + "Delta": 0.05999999999999994, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 4 of 4, SAM external face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:fe8a6b43-ec73-4201-91e8-0dedf413b25c@space:5080c000-0000-0000-0000-00000000c0a1#layer4.externalLightReflectance", + "Side": "panel:fe8a6b43-ec73-4201-91e8-0dedf413b25c@space:5080c000-0000-0000-0000-00000000c0a1", + "Layer": 4, + "LayerCount": 4, + "Property": "externalLightReflectance", + "SamFace": "external", + "SamMaterial": "FIX_Plasterboard", + "NativeObject": "SAM_OpaqueMaterial_FIX_Plasterboard_15mm_Internal_37d096dc", + "SamValue": 0.64, + "NativeValue": 0.7, + "Delta": 0.05999999999999994, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 4 of 4, SAM external face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:fe8a6b43-ec73-4201-91e8-0dedf413b25c@space:5080c000-0000-0000-0000-00000000c0a1#layer4.externalEmissivity", + "Side": "panel:fe8a6b43-ec73-4201-91e8-0dedf413b25c@space:5080c000-0000-0000-0000-00000000c0a1", + "Layer": 4, + "LayerCount": 4, + "Property": "externalEmissivity", + "SamFace": "external", + "SamMaterial": "FIX_Plasterboard", + "NativeObject": "SAM_OpaqueMaterial_FIX_Plasterboard_15mm_Internal_37d096dc", + "SamValue": 0.9, + "NativeValue": 0.91, + "Delta": 0.010000000000000009, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 4 of 4, SAM external face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:1c080d98-e160-4254-8bac-f3902936a621@space:5080c000-0000-0000-0000-00000000c0a1#layer1.internalSolarReflectance", + "Side": "panel:1c080d98-e160-4254-8bac-f3902936a621@space:5080c000-0000-0000-0000-00000000c0a1", + "Layer": 1, + "LayerCount": 4, + "Property": "internalSolarReflectance", + "SamFace": "internal", + "SamMaterial": "FIX_Render", + "NativeObject": "SAM_OpaqueMaterial_FIX_Render_15mm_cf8a5937", + "SamValue": 0.36, + "NativeValue": 0.5700000000000001, + "Delta": 0.21000000000000008, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 1 of 4, SAM internal face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:1c080d98-e160-4254-8bac-f3902936a621@space:5080c000-0000-0000-0000-00000000c0a1#layer1.internalLightReflectance", + "Side": "panel:1c080d98-e160-4254-8bac-f3902936a621@space:5080c000-0000-0000-0000-00000000c0a1", + "Layer": 1, + "LayerCount": 4, + "Property": "internalLightReflectance", + "SamFace": "internal", + "SamMaterial": "FIX_Render", + "NativeObject": "SAM_OpaqueMaterial_FIX_Render_15mm_cf8a5937", + "SamValue": 0.37, + "NativeValue": 0.5800000000000001, + "Delta": 0.21000000000000008, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 1 of 4, SAM internal face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:1c080d98-e160-4254-8bac-f3902936a621@space:5080c000-0000-0000-0000-00000000c0a1#layer1.internalEmissivity", + "Side": "panel:1c080d98-e160-4254-8bac-f3902936a621@space:5080c000-0000-0000-0000-00000000c0a1", + "Layer": 1, + "LayerCount": 4, + "Property": "internalEmissivity", + "SamFace": "internal", + "SamMaterial": "FIX_Render", + "NativeObject": "SAM_OpaqueMaterial_FIX_Render_15mm_cf8a5937", + "SamValue": 0.93, + "NativeValue": 0.88, + "Delta": 0.050000000000000044, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 1 of 4, SAM internal face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:1c080d98-e160-4254-8bac-f3902936a621@space:5080c000-0000-0000-0000-00000000c0a1#layer2.externalSolarReflectance", + "Side": "panel:1c080d98-e160-4254-8bac-f3902936a621@space:5080c000-0000-0000-0000-00000000c0a1", + "Layer": 2, + "LayerCount": 4, + "Property": "externalSolarReflectance", + "SamFace": "external", + "SamMaterial": "FIX_Blockwork", + "NativeObject": "SAM_OpaqueMaterial_FIX_Blockwork_100mm_422b4f0d", + "SamValue": 0.38, + "NativeValue": 0.38, + "Delta": 0, + "NumericVerdict": "Identical", + "Differs": false, + "ScopeReason": "buried layer face (layer 2 of 4, SAM external face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:1c080d98-e160-4254-8bac-f3902936a621@space:5080c000-0000-0000-0000-00000000c0a1#layer2.internalSolarReflectance", + "Side": "panel:1c080d98-e160-4254-8bac-f3902936a621@space:5080c000-0000-0000-0000-00000000c0a1", + "Layer": 2, + "LayerCount": 4, + "Property": "internalSolarReflectance", + "SamFace": "internal", + "SamMaterial": "FIX_Blockwork", + "NativeObject": "SAM_OpaqueMaterial_FIX_Blockwork_100mm_422b4f0d", + "SamValue": 0.44, + "NativeValue": 0.38, + "Delta": 0.06, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 2 of 4, SAM internal face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:1c080d98-e160-4254-8bac-f3902936a621@space:5080c000-0000-0000-0000-00000000c0a1#layer2.externalLightReflectance", + "Side": "panel:1c080d98-e160-4254-8bac-f3902936a621@space:5080c000-0000-0000-0000-00000000c0a1", + "Layer": 2, + "LayerCount": 4, + "Property": "externalLightReflectance", + "SamFace": "external", + "SamMaterial": "FIX_Blockwork", + "NativeObject": "SAM_OpaqueMaterial_FIX_Blockwork_100mm_422b4f0d", + "SamValue": 0.39, + "NativeValue": 0.39, + "Delta": 0, + "NumericVerdict": "Identical", + "Differs": false, + "ScopeReason": "buried layer face (layer 2 of 4, SAM external face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:1c080d98-e160-4254-8bac-f3902936a621@space:5080c000-0000-0000-0000-00000000c0a1#layer2.internalLightReflectance", + "Side": "panel:1c080d98-e160-4254-8bac-f3902936a621@space:5080c000-0000-0000-0000-00000000c0a1", + "Layer": 2, + "LayerCount": 4, + "Property": "internalLightReflectance", + "SamFace": "internal", + "SamMaterial": "FIX_Blockwork", + "NativeObject": "SAM_OpaqueMaterial_FIX_Blockwork_100mm_422b4f0d", + "SamValue": 0.46, + "NativeValue": 0.39, + "Delta": 0.07, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 2 of 4, SAM internal face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:1c080d98-e160-4254-8bac-f3902936a621@space:5080c000-0000-0000-0000-00000000c0a1#layer2.externalEmissivity", + "Side": "panel:1c080d98-e160-4254-8bac-f3902936a621@space:5080c000-0000-0000-0000-00000000c0a1", + "Layer": 2, + "LayerCount": 4, + "Property": "externalEmissivity", + "SamFace": "external", + "SamMaterial": "FIX_Blockwork", + "NativeObject": "SAM_OpaqueMaterial_FIX_Blockwork_100mm_422b4f0d", + "SamValue": 0.93, + "NativeValue": 0.93, + "Delta": 0, + "NumericVerdict": "Identical", + "Differs": false, + "ScopeReason": "buried layer face (layer 2 of 4, SAM external face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:1c080d98-e160-4254-8bac-f3902936a621@space:5080c000-0000-0000-0000-00000000c0a1#layer2.internalEmissivity", + "Side": "panel:1c080d98-e160-4254-8bac-f3902936a621@space:5080c000-0000-0000-0000-00000000c0a1", + "Layer": 2, + "LayerCount": 4, + "Property": "internalEmissivity", + "SamFace": "internal", + "SamMaterial": "FIX_Blockwork", + "NativeObject": "SAM_OpaqueMaterial_FIX_Blockwork_100mm_422b4f0d", + "SamValue": 0.94, + "NativeValue": 0.93, + "Delta": 0.009999999999999898, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 2 of 4, SAM internal face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:1c080d98-e160-4254-8bac-f3902936a621@space:5080c000-0000-0000-0000-00000000c0a1#layer3.externalSolarReflectance", + "Side": "panel:1c080d98-e160-4254-8bac-f3902936a621@space:5080c000-0000-0000-0000-00000000c0a1", + "Layer": 3, + "LayerCount": 4, + "Property": "externalSolarReflectance", + "SamFace": "external", + "SamMaterial": "FIX_MineralWool", + "NativeObject": "SAM_OpaqueMaterial_FIX_MineralWool_140mm_340c952a", + "SamValue": 0.48, + "NativeValue": 0.48, + "Delta": 0, + "NumericVerdict": "Identical", + "Differs": false, + "ScopeReason": "buried layer face (layer 3 of 4, SAM external face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:1c080d98-e160-4254-8bac-f3902936a621@space:5080c000-0000-0000-0000-00000000c0a1#layer3.internalSolarReflectance", + "Side": "panel:1c080d98-e160-4254-8bac-f3902936a621@space:5080c000-0000-0000-0000-00000000c0a1", + "Layer": 3, + "LayerCount": 4, + "Property": "internalSolarReflectance", + "SamFace": "internal", + "SamMaterial": "FIX_MineralWool", + "NativeObject": "SAM_OpaqueMaterial_FIX_MineralWool_140mm_340c952a", + "SamValue": 0.51, + "NativeValue": 0.48, + "Delta": 0.030000000000000027, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 3 of 4, SAM internal face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:1c080d98-e160-4254-8bac-f3902936a621@space:5080c000-0000-0000-0000-00000000c0a1#layer3.externalLightReflectance", + "Side": "panel:1c080d98-e160-4254-8bac-f3902936a621@space:5080c000-0000-0000-0000-00000000c0a1", + "Layer": 3, + "LayerCount": 4, + "Property": "externalLightReflectance", + "SamFace": "external", + "SamMaterial": "FIX_MineralWool", + "NativeObject": "SAM_OpaqueMaterial_FIX_MineralWool_140mm_340c952a", + "SamValue": 0.49, + "NativeValue": 0.49, + "Delta": 0, + "NumericVerdict": "Identical", + "Differs": false, + "ScopeReason": "buried layer face (layer 3 of 4, SAM external face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:1c080d98-e160-4254-8bac-f3902936a621@space:5080c000-0000-0000-0000-00000000c0a1#layer3.internalLightReflectance", + "Side": "panel:1c080d98-e160-4254-8bac-f3902936a621@space:5080c000-0000-0000-0000-00000000c0a1", + "Layer": 3, + "LayerCount": 4, + "Property": "internalLightReflectance", + "SamFace": "internal", + "SamMaterial": "FIX_MineralWool", + "NativeObject": "SAM_OpaqueMaterial_FIX_MineralWool_140mm_340c952a", + "SamValue": 0.53, + "NativeValue": 0.49, + "Delta": 0.040000000000000036, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 3 of 4, SAM internal face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:1c080d98-e160-4254-8bac-f3902936a621@space:5080c000-0000-0000-0000-00000000c0a1#layer3.externalEmissivity", + "Side": "panel:1c080d98-e160-4254-8bac-f3902936a621@space:5080c000-0000-0000-0000-00000000c0a1", + "Layer": 3, + "LayerCount": 4, + "Property": "externalEmissivity", + "SamFace": "external", + "SamMaterial": "FIX_MineralWool", + "NativeObject": "SAM_OpaqueMaterial_FIX_MineralWool_140mm_340c952a", + "SamValue": 0.89, + "NativeValue": 0.89, + "Delta": 0, + "NumericVerdict": "Identical", + "Differs": false, + "ScopeReason": "buried layer face (layer 3 of 4, SAM external face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:1c080d98-e160-4254-8bac-f3902936a621@space:5080c000-0000-0000-0000-00000000c0a1#layer3.internalEmissivity", + "Side": "panel:1c080d98-e160-4254-8bac-f3902936a621@space:5080c000-0000-0000-0000-00000000c0a1", + "Layer": 3, + "LayerCount": 4, + "Property": "internalEmissivity", + "SamFace": "internal", + "SamMaterial": "FIX_MineralWool", + "NativeObject": "SAM_OpaqueMaterial_FIX_MineralWool_140mm_340c952a", + "SamValue": 0.92, + "NativeValue": 0.89, + "Delta": 0.030000000000000027, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 3 of 4, SAM internal face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:1c080d98-e160-4254-8bac-f3902936a621@space:5080c000-0000-0000-0000-00000000c0a1#layer4.externalSolarReflectance", + "Side": "panel:1c080d98-e160-4254-8bac-f3902936a621@space:5080c000-0000-0000-0000-00000000c0a1", + "Layer": 4, + "LayerCount": 4, + "Property": "externalSolarReflectance", + "SamFace": "external", + "SamMaterial": "FIX_Plasterboard", + "NativeObject": "SAM_OpaqueMaterial_FIX_Plasterboard_12.5mm_Internal_37d096dc", + "SamValue": 0.62, + "NativeValue": 0.6799999999999999, + "Delta": 0.05999999999999994, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 4 of 4, SAM external face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:1c080d98-e160-4254-8bac-f3902936a621@space:5080c000-0000-0000-0000-00000000c0a1#layer4.externalLightReflectance", + "Side": "panel:1c080d98-e160-4254-8bac-f3902936a621@space:5080c000-0000-0000-0000-00000000c0a1", + "Layer": 4, + "LayerCount": 4, + "Property": "externalLightReflectance", + "SamFace": "external", + "SamMaterial": "FIX_Plasterboard", + "NativeObject": "SAM_OpaqueMaterial_FIX_Plasterboard_12.5mm_Internal_37d096dc", + "SamValue": 0.64, + "NativeValue": 0.7, + "Delta": 0.05999999999999994, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 4 of 4, SAM external face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:1c080d98-e160-4254-8bac-f3902936a621@space:5080c000-0000-0000-0000-00000000c0a1#layer4.externalEmissivity", + "Side": "panel:1c080d98-e160-4254-8bac-f3902936a621@space:5080c000-0000-0000-0000-00000000c0a1", + "Layer": 4, + "LayerCount": 4, + "Property": "externalEmissivity", + "SamFace": "external", + "SamMaterial": "FIX_Plasterboard", + "NativeObject": "SAM_OpaqueMaterial_FIX_Plasterboard_12.5mm_Internal_37d096dc", + "SamValue": 0.9, + "NativeValue": 0.91, + "Delta": 0.010000000000000009, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 4 of 4, SAM external face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:4224250c-fb3c-4d91-a9bd-7b0de82b0ab7@space:5080c000-0000-0000-0000-00000000c0a1#layer1.internalSolarReflectance", + "Side": "panel:4224250c-fb3c-4d91-a9bd-7b0de82b0ab7@space:5080c000-0000-0000-0000-00000000c0a1", + "Layer": 1, + "LayerCount": 4, + "Property": "internalSolarReflectance", + "SamFace": "internal", + "SamMaterial": "FIX_Render", + "NativeObject": "SAM_OpaqueMaterial_FIX_Render_15mm_cf8a5937", + "SamValue": 0.36, + "NativeValue": 0.5700000000000001, + "Delta": 0.21000000000000008, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 1 of 4, SAM internal face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:4224250c-fb3c-4d91-a9bd-7b0de82b0ab7@space:5080c000-0000-0000-0000-00000000c0a1#layer1.internalLightReflectance", + "Side": "panel:4224250c-fb3c-4d91-a9bd-7b0de82b0ab7@space:5080c000-0000-0000-0000-00000000c0a1", + "Layer": 1, + "LayerCount": 4, + "Property": "internalLightReflectance", + "SamFace": "internal", + "SamMaterial": "FIX_Render", + "NativeObject": "SAM_OpaqueMaterial_FIX_Render_15mm_cf8a5937", + "SamValue": 0.37, + "NativeValue": 0.5800000000000001, + "Delta": 0.21000000000000008, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 1 of 4, SAM internal face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:4224250c-fb3c-4d91-a9bd-7b0de82b0ab7@space:5080c000-0000-0000-0000-00000000c0a1#layer1.internalEmissivity", + "Side": "panel:4224250c-fb3c-4d91-a9bd-7b0de82b0ab7@space:5080c000-0000-0000-0000-00000000c0a1", + "Layer": 1, + "LayerCount": 4, + "Property": "internalEmissivity", + "SamFace": "internal", + "SamMaterial": "FIX_Render", + "NativeObject": "SAM_OpaqueMaterial_FIX_Render_15mm_cf8a5937", + "SamValue": 0.93, + "NativeValue": 0.88, + "Delta": 0.050000000000000044, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 1 of 4, SAM internal face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:4224250c-fb3c-4d91-a9bd-7b0de82b0ab7@space:5080c000-0000-0000-0000-00000000c0a1#layer2.externalSolarReflectance", + "Side": "panel:4224250c-fb3c-4d91-a9bd-7b0de82b0ab7@space:5080c000-0000-0000-0000-00000000c0a1", + "Layer": 2, + "LayerCount": 4, + "Property": "externalSolarReflectance", + "SamFace": "external", + "SamMaterial": "FIX_Blockwork", + "NativeObject": "SAM_OpaqueMaterial_FIX_Blockwork_100mm_422b4f0d", + "SamValue": 0.38, + "NativeValue": 0.38, + "Delta": 0, + "NumericVerdict": "Identical", + "Differs": false, + "ScopeReason": "buried layer face (layer 2 of 4, SAM external face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:4224250c-fb3c-4d91-a9bd-7b0de82b0ab7@space:5080c000-0000-0000-0000-00000000c0a1#layer2.internalSolarReflectance", + "Side": "panel:4224250c-fb3c-4d91-a9bd-7b0de82b0ab7@space:5080c000-0000-0000-0000-00000000c0a1", + "Layer": 2, + "LayerCount": 4, + "Property": "internalSolarReflectance", + "SamFace": "internal", + "SamMaterial": "FIX_Blockwork", + "NativeObject": "SAM_OpaqueMaterial_FIX_Blockwork_100mm_422b4f0d", + "SamValue": 0.44, + "NativeValue": 0.38, + "Delta": 0.06, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 2 of 4, SAM internal face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:4224250c-fb3c-4d91-a9bd-7b0de82b0ab7@space:5080c000-0000-0000-0000-00000000c0a1#layer2.externalLightReflectance", + "Side": "panel:4224250c-fb3c-4d91-a9bd-7b0de82b0ab7@space:5080c000-0000-0000-0000-00000000c0a1", + "Layer": 2, + "LayerCount": 4, + "Property": "externalLightReflectance", + "SamFace": "external", + "SamMaterial": "FIX_Blockwork", + "NativeObject": "SAM_OpaqueMaterial_FIX_Blockwork_100mm_422b4f0d", + "SamValue": 0.39, + "NativeValue": 0.39, + "Delta": 0, + "NumericVerdict": "Identical", + "Differs": false, + "ScopeReason": "buried layer face (layer 2 of 4, SAM external face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:4224250c-fb3c-4d91-a9bd-7b0de82b0ab7@space:5080c000-0000-0000-0000-00000000c0a1#layer2.internalLightReflectance", + "Side": "panel:4224250c-fb3c-4d91-a9bd-7b0de82b0ab7@space:5080c000-0000-0000-0000-00000000c0a1", + "Layer": 2, + "LayerCount": 4, + "Property": "internalLightReflectance", + "SamFace": "internal", + "SamMaterial": "FIX_Blockwork", + "NativeObject": "SAM_OpaqueMaterial_FIX_Blockwork_100mm_422b4f0d", + "SamValue": 0.46, + "NativeValue": 0.39, + "Delta": 0.07, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 2 of 4, SAM internal face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:4224250c-fb3c-4d91-a9bd-7b0de82b0ab7@space:5080c000-0000-0000-0000-00000000c0a1#layer2.externalEmissivity", + "Side": "panel:4224250c-fb3c-4d91-a9bd-7b0de82b0ab7@space:5080c000-0000-0000-0000-00000000c0a1", + "Layer": 2, + "LayerCount": 4, + "Property": "externalEmissivity", + "SamFace": "external", + "SamMaterial": "FIX_Blockwork", + "NativeObject": "SAM_OpaqueMaterial_FIX_Blockwork_100mm_422b4f0d", + "SamValue": 0.93, + "NativeValue": 0.93, + "Delta": 0, + "NumericVerdict": "Identical", + "Differs": false, + "ScopeReason": "buried layer face (layer 2 of 4, SAM external face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:4224250c-fb3c-4d91-a9bd-7b0de82b0ab7@space:5080c000-0000-0000-0000-00000000c0a1#layer2.internalEmissivity", + "Side": "panel:4224250c-fb3c-4d91-a9bd-7b0de82b0ab7@space:5080c000-0000-0000-0000-00000000c0a1", + "Layer": 2, + "LayerCount": 4, + "Property": "internalEmissivity", + "SamFace": "internal", + "SamMaterial": "FIX_Blockwork", + "NativeObject": "SAM_OpaqueMaterial_FIX_Blockwork_100mm_422b4f0d", + "SamValue": 0.94, + "NativeValue": 0.93, + "Delta": 0.009999999999999898, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 2 of 4, SAM internal face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:4224250c-fb3c-4d91-a9bd-7b0de82b0ab7@space:5080c000-0000-0000-0000-00000000c0a1#layer3.externalSolarReflectance", + "Side": "panel:4224250c-fb3c-4d91-a9bd-7b0de82b0ab7@space:5080c000-0000-0000-0000-00000000c0a1", + "Layer": 3, + "LayerCount": 4, + "Property": "externalSolarReflectance", + "SamFace": "external", + "SamMaterial": "FIX_MineralWool", + "NativeObject": "SAM_OpaqueMaterial_FIX_MineralWool_140mm_340c952a", + "SamValue": 0.48, + "NativeValue": 0.48, + "Delta": 0, + "NumericVerdict": "Identical", + "Differs": false, + "ScopeReason": "buried layer face (layer 3 of 4, SAM external face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:4224250c-fb3c-4d91-a9bd-7b0de82b0ab7@space:5080c000-0000-0000-0000-00000000c0a1#layer3.internalSolarReflectance", + "Side": "panel:4224250c-fb3c-4d91-a9bd-7b0de82b0ab7@space:5080c000-0000-0000-0000-00000000c0a1", + "Layer": 3, + "LayerCount": 4, + "Property": "internalSolarReflectance", + "SamFace": "internal", + "SamMaterial": "FIX_MineralWool", + "NativeObject": "SAM_OpaqueMaterial_FIX_MineralWool_140mm_340c952a", + "SamValue": 0.51, + "NativeValue": 0.48, + "Delta": 0.030000000000000027, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 3 of 4, SAM internal face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:4224250c-fb3c-4d91-a9bd-7b0de82b0ab7@space:5080c000-0000-0000-0000-00000000c0a1#layer3.externalLightReflectance", + "Side": "panel:4224250c-fb3c-4d91-a9bd-7b0de82b0ab7@space:5080c000-0000-0000-0000-00000000c0a1", + "Layer": 3, + "LayerCount": 4, + "Property": "externalLightReflectance", + "SamFace": "external", + "SamMaterial": "FIX_MineralWool", + "NativeObject": "SAM_OpaqueMaterial_FIX_MineralWool_140mm_340c952a", + "SamValue": 0.49, + "NativeValue": 0.49, + "Delta": 0, + "NumericVerdict": "Identical", + "Differs": false, + "ScopeReason": "buried layer face (layer 3 of 4, SAM external face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:4224250c-fb3c-4d91-a9bd-7b0de82b0ab7@space:5080c000-0000-0000-0000-00000000c0a1#layer3.internalLightReflectance", + "Side": "panel:4224250c-fb3c-4d91-a9bd-7b0de82b0ab7@space:5080c000-0000-0000-0000-00000000c0a1", + "Layer": 3, + "LayerCount": 4, + "Property": "internalLightReflectance", + "SamFace": "internal", + "SamMaterial": "FIX_MineralWool", + "NativeObject": "SAM_OpaqueMaterial_FIX_MineralWool_140mm_340c952a", + "SamValue": 0.53, + "NativeValue": 0.49, + "Delta": 0.040000000000000036, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 3 of 4, SAM internal face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:4224250c-fb3c-4d91-a9bd-7b0de82b0ab7@space:5080c000-0000-0000-0000-00000000c0a1#layer3.externalEmissivity", + "Side": "panel:4224250c-fb3c-4d91-a9bd-7b0de82b0ab7@space:5080c000-0000-0000-0000-00000000c0a1", + "Layer": 3, + "LayerCount": 4, + "Property": "externalEmissivity", + "SamFace": "external", + "SamMaterial": "FIX_MineralWool", + "NativeObject": "SAM_OpaqueMaterial_FIX_MineralWool_140mm_340c952a", + "SamValue": 0.89, + "NativeValue": 0.89, + "Delta": 0, + "NumericVerdict": "Identical", + "Differs": false, + "ScopeReason": "buried layer face (layer 3 of 4, SAM external face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:4224250c-fb3c-4d91-a9bd-7b0de82b0ab7@space:5080c000-0000-0000-0000-00000000c0a1#layer3.internalEmissivity", + "Side": "panel:4224250c-fb3c-4d91-a9bd-7b0de82b0ab7@space:5080c000-0000-0000-0000-00000000c0a1", + "Layer": 3, + "LayerCount": 4, + "Property": "internalEmissivity", + "SamFace": "internal", + "SamMaterial": "FIX_MineralWool", + "NativeObject": "SAM_OpaqueMaterial_FIX_MineralWool_140mm_340c952a", + "SamValue": 0.92, + "NativeValue": 0.89, + "Delta": 0.030000000000000027, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 3 of 4, SAM internal face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:4224250c-fb3c-4d91-a9bd-7b0de82b0ab7@space:5080c000-0000-0000-0000-00000000c0a1#layer4.externalSolarReflectance", + "Side": "panel:4224250c-fb3c-4d91-a9bd-7b0de82b0ab7@space:5080c000-0000-0000-0000-00000000c0a1", + "Layer": 4, + "LayerCount": 4, + "Property": "externalSolarReflectance", + "SamFace": "external", + "SamMaterial": "FIX_Plasterboard", + "NativeObject": "SAM_OpaqueMaterial_FIX_Plasterboard_12.5mm_Internal_37d096dc", + "SamValue": 0.62, + "NativeValue": 0.6799999999999999, + "Delta": 0.05999999999999994, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 4 of 4, SAM external face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:4224250c-fb3c-4d91-a9bd-7b0de82b0ab7@space:5080c000-0000-0000-0000-00000000c0a1#layer4.externalLightReflectance", + "Side": "panel:4224250c-fb3c-4d91-a9bd-7b0de82b0ab7@space:5080c000-0000-0000-0000-00000000c0a1", + "Layer": 4, + "LayerCount": 4, + "Property": "externalLightReflectance", + "SamFace": "external", + "SamMaterial": "FIX_Plasterboard", + "NativeObject": "SAM_OpaqueMaterial_FIX_Plasterboard_12.5mm_Internal_37d096dc", + "SamValue": 0.64, + "NativeValue": 0.7, + "Delta": 0.05999999999999994, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 4 of 4, SAM external face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:4224250c-fb3c-4d91-a9bd-7b0de82b0ab7@space:5080c000-0000-0000-0000-00000000c0a1#layer4.externalEmissivity", + "Side": "panel:4224250c-fb3c-4d91-a9bd-7b0de82b0ab7@space:5080c000-0000-0000-0000-00000000c0a1", + "Layer": 4, + "LayerCount": 4, + "Property": "externalEmissivity", + "SamFace": "external", + "SamMaterial": "FIX_Plasterboard", + "NativeObject": "SAM_OpaqueMaterial_FIX_Plasterboard_12.5mm_Internal_37d096dc", + "SamValue": 0.9, + "NativeValue": 0.91, + "Delta": 0.010000000000000009, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 4 of 4, SAM external face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:2b2d8a7f-fbc6-4663-9608-3f054b4a10d8@space:5080c000-0000-0000-0000-00000000c0a1#layer1.internalSolarReflectance", + "Side": "panel:2b2d8a7f-fbc6-4663-9608-3f054b4a10d8@space:5080c000-0000-0000-0000-00000000c0a1", + "Layer": 1, + "LayerCount": 4, + "Property": "internalSolarReflectance", + "SamFace": "internal", + "SamMaterial": "FIX_Render", + "NativeObject": "SAM_OpaqueMaterial_FIX_Render_15mm_cf8a5937", + "SamValue": 0.36, + "NativeValue": 0.5700000000000001, + "Delta": 0.21000000000000008, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 1 of 4, SAM internal face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:2b2d8a7f-fbc6-4663-9608-3f054b4a10d8@space:5080c000-0000-0000-0000-00000000c0a1#layer1.internalLightReflectance", + "Side": "panel:2b2d8a7f-fbc6-4663-9608-3f054b4a10d8@space:5080c000-0000-0000-0000-00000000c0a1", + "Layer": 1, + "LayerCount": 4, + "Property": "internalLightReflectance", + "SamFace": "internal", + "SamMaterial": "FIX_Render", + "NativeObject": "SAM_OpaqueMaterial_FIX_Render_15mm_cf8a5937", + "SamValue": 0.37, + "NativeValue": 0.5800000000000001, + "Delta": 0.21000000000000008, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 1 of 4, SAM internal face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:2b2d8a7f-fbc6-4663-9608-3f054b4a10d8@space:5080c000-0000-0000-0000-00000000c0a1#layer1.internalEmissivity", + "Side": "panel:2b2d8a7f-fbc6-4663-9608-3f054b4a10d8@space:5080c000-0000-0000-0000-00000000c0a1", + "Layer": 1, + "LayerCount": 4, + "Property": "internalEmissivity", + "SamFace": "internal", + "SamMaterial": "FIX_Render", + "NativeObject": "SAM_OpaqueMaterial_FIX_Render_15mm_cf8a5937", + "SamValue": 0.93, + "NativeValue": 0.88, + "Delta": 0.050000000000000044, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 1 of 4, SAM internal face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:2b2d8a7f-fbc6-4663-9608-3f054b4a10d8@space:5080c000-0000-0000-0000-00000000c0a1#layer2.externalSolarReflectance", + "Side": "panel:2b2d8a7f-fbc6-4663-9608-3f054b4a10d8@space:5080c000-0000-0000-0000-00000000c0a1", + "Layer": 2, + "LayerCount": 4, + "Property": "externalSolarReflectance", + "SamFace": "external", + "SamMaterial": "FIX_Blockwork", + "NativeObject": "SAM_OpaqueMaterial_FIX_Blockwork_100mm_422b4f0d", + "SamValue": 0.38, + "NativeValue": 0.38, + "Delta": 0, + "NumericVerdict": "Identical", + "Differs": false, + "ScopeReason": "buried layer face (layer 2 of 4, SAM external face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:2b2d8a7f-fbc6-4663-9608-3f054b4a10d8@space:5080c000-0000-0000-0000-00000000c0a1#layer2.internalSolarReflectance", + "Side": "panel:2b2d8a7f-fbc6-4663-9608-3f054b4a10d8@space:5080c000-0000-0000-0000-00000000c0a1", + "Layer": 2, + "LayerCount": 4, + "Property": "internalSolarReflectance", + "SamFace": "internal", + "SamMaterial": "FIX_Blockwork", + "NativeObject": "SAM_OpaqueMaterial_FIX_Blockwork_100mm_422b4f0d", + "SamValue": 0.44, + "NativeValue": 0.38, + "Delta": 0.06, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 2 of 4, SAM internal face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:2b2d8a7f-fbc6-4663-9608-3f054b4a10d8@space:5080c000-0000-0000-0000-00000000c0a1#layer2.externalLightReflectance", + "Side": "panel:2b2d8a7f-fbc6-4663-9608-3f054b4a10d8@space:5080c000-0000-0000-0000-00000000c0a1", + "Layer": 2, + "LayerCount": 4, + "Property": "externalLightReflectance", + "SamFace": "external", + "SamMaterial": "FIX_Blockwork", + "NativeObject": "SAM_OpaqueMaterial_FIX_Blockwork_100mm_422b4f0d", + "SamValue": 0.39, + "NativeValue": 0.39, + "Delta": 0, + "NumericVerdict": "Identical", + "Differs": false, + "ScopeReason": "buried layer face (layer 2 of 4, SAM external face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:2b2d8a7f-fbc6-4663-9608-3f054b4a10d8@space:5080c000-0000-0000-0000-00000000c0a1#layer2.internalLightReflectance", + "Side": "panel:2b2d8a7f-fbc6-4663-9608-3f054b4a10d8@space:5080c000-0000-0000-0000-00000000c0a1", + "Layer": 2, + "LayerCount": 4, + "Property": "internalLightReflectance", + "SamFace": "internal", + "SamMaterial": "FIX_Blockwork", + "NativeObject": "SAM_OpaqueMaterial_FIX_Blockwork_100mm_422b4f0d", + "SamValue": 0.46, + "NativeValue": 0.39, + "Delta": 0.07, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 2 of 4, SAM internal face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:2b2d8a7f-fbc6-4663-9608-3f054b4a10d8@space:5080c000-0000-0000-0000-00000000c0a1#layer2.externalEmissivity", + "Side": "panel:2b2d8a7f-fbc6-4663-9608-3f054b4a10d8@space:5080c000-0000-0000-0000-00000000c0a1", + "Layer": 2, + "LayerCount": 4, + "Property": "externalEmissivity", + "SamFace": "external", + "SamMaterial": "FIX_Blockwork", + "NativeObject": "SAM_OpaqueMaterial_FIX_Blockwork_100mm_422b4f0d", + "SamValue": 0.93, + "NativeValue": 0.93, + "Delta": 0, + "NumericVerdict": "Identical", + "Differs": false, + "ScopeReason": "buried layer face (layer 2 of 4, SAM external face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:2b2d8a7f-fbc6-4663-9608-3f054b4a10d8@space:5080c000-0000-0000-0000-00000000c0a1#layer2.internalEmissivity", + "Side": "panel:2b2d8a7f-fbc6-4663-9608-3f054b4a10d8@space:5080c000-0000-0000-0000-00000000c0a1", + "Layer": 2, + "LayerCount": 4, + "Property": "internalEmissivity", + "SamFace": "internal", + "SamMaterial": "FIX_Blockwork", + "NativeObject": "SAM_OpaqueMaterial_FIX_Blockwork_100mm_422b4f0d", + "SamValue": 0.94, + "NativeValue": 0.93, + "Delta": 0.009999999999999898, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 2 of 4, SAM internal face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:2b2d8a7f-fbc6-4663-9608-3f054b4a10d8@space:5080c000-0000-0000-0000-00000000c0a1#layer3.externalSolarReflectance", + "Side": "panel:2b2d8a7f-fbc6-4663-9608-3f054b4a10d8@space:5080c000-0000-0000-0000-00000000c0a1", + "Layer": 3, + "LayerCount": 4, + "Property": "externalSolarReflectance", + "SamFace": "external", + "SamMaterial": "FIX_MineralWool", + "NativeObject": "SAM_OpaqueMaterial_FIX_MineralWool_140mm_340c952a", + "SamValue": 0.48, + "NativeValue": 0.48, + "Delta": 0, + "NumericVerdict": "Identical", + "Differs": false, + "ScopeReason": "buried layer face (layer 3 of 4, SAM external face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:2b2d8a7f-fbc6-4663-9608-3f054b4a10d8@space:5080c000-0000-0000-0000-00000000c0a1#layer3.internalSolarReflectance", + "Side": "panel:2b2d8a7f-fbc6-4663-9608-3f054b4a10d8@space:5080c000-0000-0000-0000-00000000c0a1", + "Layer": 3, + "LayerCount": 4, + "Property": "internalSolarReflectance", + "SamFace": "internal", + "SamMaterial": "FIX_MineralWool", + "NativeObject": "SAM_OpaqueMaterial_FIX_MineralWool_140mm_340c952a", + "SamValue": 0.51, + "NativeValue": 0.48, + "Delta": 0.030000000000000027, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 3 of 4, SAM internal face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:2b2d8a7f-fbc6-4663-9608-3f054b4a10d8@space:5080c000-0000-0000-0000-00000000c0a1#layer3.externalLightReflectance", + "Side": "panel:2b2d8a7f-fbc6-4663-9608-3f054b4a10d8@space:5080c000-0000-0000-0000-00000000c0a1", + "Layer": 3, + "LayerCount": 4, + "Property": "externalLightReflectance", + "SamFace": "external", + "SamMaterial": "FIX_MineralWool", + "NativeObject": "SAM_OpaqueMaterial_FIX_MineralWool_140mm_340c952a", + "SamValue": 0.49, + "NativeValue": 0.49, + "Delta": 0, + "NumericVerdict": "Identical", + "Differs": false, + "ScopeReason": "buried layer face (layer 3 of 4, SAM external face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:2b2d8a7f-fbc6-4663-9608-3f054b4a10d8@space:5080c000-0000-0000-0000-00000000c0a1#layer3.internalLightReflectance", + "Side": "panel:2b2d8a7f-fbc6-4663-9608-3f054b4a10d8@space:5080c000-0000-0000-0000-00000000c0a1", + "Layer": 3, + "LayerCount": 4, + "Property": "internalLightReflectance", + "SamFace": "internal", + "SamMaterial": "FIX_MineralWool", + "NativeObject": "SAM_OpaqueMaterial_FIX_MineralWool_140mm_340c952a", + "SamValue": 0.53, + "NativeValue": 0.49, + "Delta": 0.040000000000000036, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 3 of 4, SAM internal face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:2b2d8a7f-fbc6-4663-9608-3f054b4a10d8@space:5080c000-0000-0000-0000-00000000c0a1#layer3.externalEmissivity", + "Side": "panel:2b2d8a7f-fbc6-4663-9608-3f054b4a10d8@space:5080c000-0000-0000-0000-00000000c0a1", + "Layer": 3, + "LayerCount": 4, + "Property": "externalEmissivity", + "SamFace": "external", + "SamMaterial": "FIX_MineralWool", + "NativeObject": "SAM_OpaqueMaterial_FIX_MineralWool_140mm_340c952a", + "SamValue": 0.89, + "NativeValue": 0.89, + "Delta": 0, + "NumericVerdict": "Identical", + "Differs": false, + "ScopeReason": "buried layer face (layer 3 of 4, SAM external face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:2b2d8a7f-fbc6-4663-9608-3f054b4a10d8@space:5080c000-0000-0000-0000-00000000c0a1#layer3.internalEmissivity", + "Side": "panel:2b2d8a7f-fbc6-4663-9608-3f054b4a10d8@space:5080c000-0000-0000-0000-00000000c0a1", + "Layer": 3, + "LayerCount": 4, + "Property": "internalEmissivity", + "SamFace": "internal", + "SamMaterial": "FIX_MineralWool", + "NativeObject": "SAM_OpaqueMaterial_FIX_MineralWool_140mm_340c952a", + "SamValue": 0.92, + "NativeValue": 0.89, + "Delta": 0.030000000000000027, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 3 of 4, SAM internal face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:2b2d8a7f-fbc6-4663-9608-3f054b4a10d8@space:5080c000-0000-0000-0000-00000000c0a1#layer4.externalSolarReflectance", + "Side": "panel:2b2d8a7f-fbc6-4663-9608-3f054b4a10d8@space:5080c000-0000-0000-0000-00000000c0a1", + "Layer": 4, + "LayerCount": 4, + "Property": "externalSolarReflectance", + "SamFace": "external", + "SamMaterial": "FIX_Plasterboard", + "NativeObject": "SAM_OpaqueMaterial_FIX_Plasterboard_12.5mm_Internal_37d096dc", + "SamValue": 0.62, + "NativeValue": 0.6799999999999999, + "Delta": 0.05999999999999994, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 4 of 4, SAM external face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:2b2d8a7f-fbc6-4663-9608-3f054b4a10d8@space:5080c000-0000-0000-0000-00000000c0a1#layer4.externalLightReflectance", + "Side": "panel:2b2d8a7f-fbc6-4663-9608-3f054b4a10d8@space:5080c000-0000-0000-0000-00000000c0a1", + "Layer": 4, + "LayerCount": 4, + "Property": "externalLightReflectance", + "SamFace": "external", + "SamMaterial": "FIX_Plasterboard", + "NativeObject": "SAM_OpaqueMaterial_FIX_Plasterboard_12.5mm_Internal_37d096dc", + "SamValue": 0.64, + "NativeValue": 0.7, + "Delta": 0.05999999999999994, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 4 of 4, SAM external face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:2b2d8a7f-fbc6-4663-9608-3f054b4a10d8@space:5080c000-0000-0000-0000-00000000c0a1#layer4.externalEmissivity", + "Side": "panel:2b2d8a7f-fbc6-4663-9608-3f054b4a10d8@space:5080c000-0000-0000-0000-00000000c0a1", + "Layer": 4, + "LayerCount": 4, + "Property": "externalEmissivity", + "SamFace": "external", + "SamMaterial": "FIX_Plasterboard", + "NativeObject": "SAM_OpaqueMaterial_FIX_Plasterboard_12.5mm_Internal_37d096dc", + "SamValue": 0.9, + "NativeValue": 0.91, + "Delta": 0.010000000000000009, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 4 of 4, SAM external face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:3134390a-195b-4e61-86bd-6abf63ce6459@space:5080c000-0000-0000-0000-00000000c0a1#layer1.externalSolarReflectance", + "Side": "panel:3134390a-195b-4e61-86bd-6abf63ce6459@space:5080c000-0000-0000-0000-00000000c0a1", + "Layer": 1, + "LayerCount": 4, + "Property": "externalSolarReflectance", + "SamFace": "external", + "SamMaterial": "FIX_Timber", + "NativeObject": "SAM_OpaqueMaterial_FIX_Timber_15mm_d773dfae", + "SamValue": 0.41, + "NativeValue": 0.41000000000000003, + "Delta": 5.551115123125783E-17, + "NumericVerdict": "WithinTolerance", + "Differs": false, + "ScopeReason": "interzone surface outer face (the partner side\u0027s zone face, gated on that side)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:3134390a-195b-4e61-86bd-6abf63ce6459@space:5080c000-0000-0000-0000-00000000c0a1#layer1.internalSolarReflectance", + "Side": "panel:3134390a-195b-4e61-86bd-6abf63ce6459@space:5080c000-0000-0000-0000-00000000c0a1", + "Layer": 1, + "LayerCount": 4, + "Property": "internalSolarReflectance", + "SamFace": "internal", + "SamMaterial": "FIX_Timber", + "NativeObject": "SAM_OpaqueMaterial_FIX_Timber_15mm_d773dfae", + "SamValue": 0.39, + "NativeValue": 0.41000000000000003, + "Delta": 0.020000000000000018, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 1 of 4, SAM internal face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:3134390a-195b-4e61-86bd-6abf63ce6459@space:5080c000-0000-0000-0000-00000000c0a1#layer1.externalLightReflectance", + "Side": "panel:3134390a-195b-4e61-86bd-6abf63ce6459@space:5080c000-0000-0000-0000-00000000c0a1", + "Layer": 1, + "LayerCount": 4, + "Property": "externalLightReflectance", + "SamFace": "external", + "SamMaterial": "FIX_Timber", + "NativeObject": "SAM_OpaqueMaterial_FIX_Timber_15mm_d773dfae", + "SamValue": 0.4, + "NativeValue": 0.4, + "Delta": 0, + "NumericVerdict": "Identical", + "Differs": false, + "ScopeReason": "interzone surface outer face (the partner side\u0027s zone face, gated on that side)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:3134390a-195b-4e61-86bd-6abf63ce6459@space:5080c000-0000-0000-0000-00000000c0a1#layer1.internalLightReflectance", + "Side": "panel:3134390a-195b-4e61-86bd-6abf63ce6459@space:5080c000-0000-0000-0000-00000000c0a1", + "Layer": 1, + "LayerCount": 4, + "Property": "internalLightReflectance", + "SamFace": "internal", + "SamMaterial": "FIX_Timber", + "NativeObject": "SAM_OpaqueMaterial_FIX_Timber_15mm_d773dfae", + "SamValue": 0.38, + "NativeValue": 0.4, + "Delta": 0.020000000000000018, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 1 of 4, SAM internal face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:3134390a-195b-4e61-86bd-6abf63ce6459@space:5080c000-0000-0000-0000-00000000c0a1#layer1.externalEmissivity", + "Side": "panel:3134390a-195b-4e61-86bd-6abf63ce6459@space:5080c000-0000-0000-0000-00000000c0a1", + "Layer": 1, + "LayerCount": 4, + "Property": "externalEmissivity", + "SamFace": "external", + "SamMaterial": "FIX_Timber", + "NativeObject": "SAM_OpaqueMaterial_FIX_Timber_15mm_d773dfae", + "SamValue": 0.86, + "NativeValue": 0.86, + "Delta": 0, + "NumericVerdict": "Identical", + "Differs": false, + "ScopeReason": "interzone surface outer face (the partner side\u0027s zone face, gated on that side)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:3134390a-195b-4e61-86bd-6abf63ce6459@space:5080c000-0000-0000-0000-00000000c0a1#layer1.internalEmissivity", + "Side": "panel:3134390a-195b-4e61-86bd-6abf63ce6459@space:5080c000-0000-0000-0000-00000000c0a1", + "Layer": 1, + "LayerCount": 4, + "Property": "internalEmissivity", + "SamFace": "internal", + "SamMaterial": "FIX_Timber", + "NativeObject": "SAM_OpaqueMaterial_FIX_Timber_15mm_d773dfae", + "SamValue": 0.88, + "NativeValue": 0.86, + "Delta": 0.020000000000000018, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 1 of 4, SAM internal face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:3134390a-195b-4e61-86bd-6abf63ce6459@space:5080c000-0000-0000-0000-00000000c0a1#layer2.externalSolarReflectance", + "Side": "panel:3134390a-195b-4e61-86bd-6abf63ce6459@space:5080c000-0000-0000-0000-00000000c0a1", + "Layer": 2, + "LayerCount": 4, + "Property": "externalSolarReflectance", + "SamFace": "external", + "SamMaterial": "FIX_Stud", + "NativeObject": "SAM_OpaqueMaterial_FIX_Stud_22mm_8642cc5f", + "SamValue": 0.66, + "NativeValue": 0.6599999999999999, + "Delta": 1.1102230246251565E-16, + "NumericVerdict": "WithinTolerance", + "Differs": false, + "ScopeReason": "buried layer face (layer 2 of 4, SAM external face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:3134390a-195b-4e61-86bd-6abf63ce6459@space:5080c000-0000-0000-0000-00000000c0a1#layer2.internalSolarReflectance", + "Side": "panel:3134390a-195b-4e61-86bd-6abf63ce6459@space:5080c000-0000-0000-0000-00000000c0a1", + "Layer": 2, + "LayerCount": 4, + "Property": "internalSolarReflectance", + "SamFace": "internal", + "SamMaterial": "FIX_Stud", + "NativeObject": "SAM_OpaqueMaterial_FIX_Stud_22mm_8642cc5f", + "SamValue": 0.64, + "NativeValue": 0.6599999999999999, + "Delta": 0.019999999999999907, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 2 of 4, SAM internal face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:3134390a-195b-4e61-86bd-6abf63ce6459@space:5080c000-0000-0000-0000-00000000c0a1#layer2.externalLightReflectance", + "Side": "panel:3134390a-195b-4e61-86bd-6abf63ce6459@space:5080c000-0000-0000-0000-00000000c0a1", + "Layer": 2, + "LayerCount": 4, + "Property": "externalLightReflectance", + "SamFace": "external", + "SamMaterial": "FIX_Stud", + "NativeObject": "SAM_OpaqueMaterial_FIX_Stud_22mm_8642cc5f", + "SamValue": 0.67, + "NativeValue": 0.6699999999999999, + "Delta": 1.1102230246251565E-16, + "NumericVerdict": "WithinTolerance", + "Differs": false, + "ScopeReason": "buried layer face (layer 2 of 4, SAM external face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:3134390a-195b-4e61-86bd-6abf63ce6459@space:5080c000-0000-0000-0000-00000000c0a1#layer2.internalLightReflectance", + "Side": "panel:3134390a-195b-4e61-86bd-6abf63ce6459@space:5080c000-0000-0000-0000-00000000c0a1", + "Layer": 2, + "LayerCount": 4, + "Property": "internalLightReflectance", + "SamFace": "internal", + "SamMaterial": "FIX_Stud", + "NativeObject": "SAM_OpaqueMaterial_FIX_Stud_22mm_8642cc5f", + "SamValue": 0.65, + "NativeValue": 0.6699999999999999, + "Delta": 0.019999999999999907, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 2 of 4, SAM internal face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:3134390a-195b-4e61-86bd-6abf63ce6459@space:5080c000-0000-0000-0000-00000000c0a1#layer2.externalEmissivity", + "Side": "panel:3134390a-195b-4e61-86bd-6abf63ce6459@space:5080c000-0000-0000-0000-00000000c0a1", + "Layer": 2, + "LayerCount": 4, + "Property": "externalEmissivity", + "SamFace": "external", + "SamMaterial": "FIX_Stud", + "NativeObject": "SAM_OpaqueMaterial_FIX_Stud_22mm_8642cc5f", + "SamValue": 0.84, + "NativeValue": 0.84, + "Delta": 0, + "NumericVerdict": "Identical", + "Differs": false, + "ScopeReason": "buried layer face (layer 2 of 4, SAM external face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:3134390a-195b-4e61-86bd-6abf63ce6459@space:5080c000-0000-0000-0000-00000000c0a1#layer2.internalEmissivity", + "Side": "panel:3134390a-195b-4e61-86bd-6abf63ce6459@space:5080c000-0000-0000-0000-00000000c0a1", + "Layer": 2, + "LayerCount": 4, + "Property": "internalEmissivity", + "SamFace": "internal", + "SamMaterial": "FIX_Stud", + "NativeObject": "SAM_OpaqueMaterial_FIX_Stud_22mm_8642cc5f", + "SamValue": 0.83, + "NativeValue": 0.84, + "Delta": 0.010000000000000009, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 2 of 4, SAM internal face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:3134390a-195b-4e61-86bd-6abf63ce6459@space:5080c000-0000-0000-0000-00000000c0a1#layer3.externalSolarReflectance", + "Side": "panel:3134390a-195b-4e61-86bd-6abf63ce6459@space:5080c000-0000-0000-0000-00000000c0a1", + "Layer": 3, + "LayerCount": 4, + "Property": "externalSolarReflectance", + "SamFace": "external", + "SamMaterial": "FIX_MineralWool", + "NativeObject": "SAM_OpaqueMaterial_FIX_MineralWool_50mm_340c952a", + "SamValue": 0.48, + "NativeValue": 0.48, + "Delta": 0, + "NumericVerdict": "Identical", + "Differs": false, + "ScopeReason": "buried layer face (layer 3 of 4, SAM external face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:3134390a-195b-4e61-86bd-6abf63ce6459@space:5080c000-0000-0000-0000-00000000c0a1#layer3.internalSolarReflectance", + "Side": "panel:3134390a-195b-4e61-86bd-6abf63ce6459@space:5080c000-0000-0000-0000-00000000c0a1", + "Layer": 3, + "LayerCount": 4, + "Property": "internalSolarReflectance", + "SamFace": "internal", + "SamMaterial": "FIX_MineralWool", + "NativeObject": "SAM_OpaqueMaterial_FIX_MineralWool_50mm_340c952a", + "SamValue": 0.51, + "NativeValue": 0.48, + "Delta": 0.030000000000000027, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 3 of 4, SAM internal face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:3134390a-195b-4e61-86bd-6abf63ce6459@space:5080c000-0000-0000-0000-00000000c0a1#layer3.externalLightReflectance", + "Side": "panel:3134390a-195b-4e61-86bd-6abf63ce6459@space:5080c000-0000-0000-0000-00000000c0a1", + "Layer": 3, + "LayerCount": 4, + "Property": "externalLightReflectance", + "SamFace": "external", + "SamMaterial": "FIX_MineralWool", + "NativeObject": "SAM_OpaqueMaterial_FIX_MineralWool_50mm_340c952a", + "SamValue": 0.49, + "NativeValue": 0.49, + "Delta": 0, + "NumericVerdict": "Identical", + "Differs": false, + "ScopeReason": "buried layer face (layer 3 of 4, SAM external face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:3134390a-195b-4e61-86bd-6abf63ce6459@space:5080c000-0000-0000-0000-00000000c0a1#layer3.internalLightReflectance", + "Side": "panel:3134390a-195b-4e61-86bd-6abf63ce6459@space:5080c000-0000-0000-0000-00000000c0a1", + "Layer": 3, + "LayerCount": 4, + "Property": "internalLightReflectance", + "SamFace": "internal", + "SamMaterial": "FIX_MineralWool", + "NativeObject": "SAM_OpaqueMaterial_FIX_MineralWool_50mm_340c952a", + "SamValue": 0.53, + "NativeValue": 0.49, + "Delta": 0.040000000000000036, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 3 of 4, SAM internal face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:3134390a-195b-4e61-86bd-6abf63ce6459@space:5080c000-0000-0000-0000-00000000c0a1#layer3.externalEmissivity", + "Side": "panel:3134390a-195b-4e61-86bd-6abf63ce6459@space:5080c000-0000-0000-0000-00000000c0a1", + "Layer": 3, + "LayerCount": 4, + "Property": "externalEmissivity", + "SamFace": "external", + "SamMaterial": "FIX_MineralWool", + "NativeObject": "SAM_OpaqueMaterial_FIX_MineralWool_50mm_340c952a", + "SamValue": 0.89, + "NativeValue": 0.89, + "Delta": 0, + "NumericVerdict": "Identical", + "Differs": false, + "ScopeReason": "buried layer face (layer 3 of 4, SAM external face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:3134390a-195b-4e61-86bd-6abf63ce6459@space:5080c000-0000-0000-0000-00000000c0a1#layer3.internalEmissivity", + "Side": "panel:3134390a-195b-4e61-86bd-6abf63ce6459@space:5080c000-0000-0000-0000-00000000c0a1", + "Layer": 3, + "LayerCount": 4, + "Property": "internalEmissivity", + "SamFace": "internal", + "SamMaterial": "FIX_MineralWool", + "NativeObject": "SAM_OpaqueMaterial_FIX_MineralWool_50mm_340c952a", + "SamValue": 0.92, + "NativeValue": 0.89, + "Delta": 0.030000000000000027, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 3 of 4, SAM internal face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:3134390a-195b-4e61-86bd-6abf63ce6459@space:5080c000-0000-0000-0000-00000000c0a1#layer4.externalSolarReflectance", + "Side": "panel:3134390a-195b-4e61-86bd-6abf63ce6459@space:5080c000-0000-0000-0000-00000000c0a1", + "Layer": 4, + "LayerCount": 4, + "Property": "externalSolarReflectance", + "SamFace": "external", + "SamMaterial": "FIX_Plasterboard", + "NativeObject": "SAM_OpaqueMaterial_FIX_Plasterboard_12.5mm_Internal_37d096dc", + "SamValue": 0.62, + "NativeValue": 0.6799999999999999, + "Delta": 0.05999999999999994, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 4 of 4, SAM external face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:3134390a-195b-4e61-86bd-6abf63ce6459@space:5080c000-0000-0000-0000-00000000c0a1#layer4.externalLightReflectance", + "Side": "panel:3134390a-195b-4e61-86bd-6abf63ce6459@space:5080c000-0000-0000-0000-00000000c0a1", + "Layer": 4, + "LayerCount": 4, + "Property": "externalLightReflectance", + "SamFace": "external", + "SamMaterial": "FIX_Plasterboard", + "NativeObject": "SAM_OpaqueMaterial_FIX_Plasterboard_12.5mm_Internal_37d096dc", + "SamValue": 0.64, + "NativeValue": 0.7, + "Delta": 0.05999999999999994, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 4 of 4, SAM external face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:3134390a-195b-4e61-86bd-6abf63ce6459@space:5080c000-0000-0000-0000-00000000c0a1#layer4.externalEmissivity", + "Side": "panel:3134390a-195b-4e61-86bd-6abf63ce6459@space:5080c000-0000-0000-0000-00000000c0a1", + "Layer": 4, + "LayerCount": 4, + "Property": "externalEmissivity", + "SamFace": "external", + "SamMaterial": "FIX_Plasterboard", + "NativeObject": "SAM_OpaqueMaterial_FIX_Plasterboard_12.5mm_Internal_37d096dc", + "SamValue": 0.9, + "NativeValue": 0.91, + "Delta": 0.010000000000000009, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 4 of 4, SAM external face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:f5273d30-2ac9-43bc-b916-1759aea67323@space:5080c000-0000-0000-0000-00000000c0b1#layer1.externalSolarReflectance", + "Side": "panel:f5273d30-2ac9-43bc-b916-1759aea67323@space:5080c000-0000-0000-0000-00000000c0b1", + "Layer": 1, + "LayerCount": 3, + "Property": "externalSolarReflectance", + "SamFace": "external", + "SamMaterial": "FIX_Concrete", + "NativeObject": "SAM_OpaqueMaterial_FIX_Concrete_150mm_b313ccd6", + "SamValue": 0.31, + "NativeValue": 0.31000000000000005, + "Delta": 5.551115123125783E-17, + "NumericVerdict": "WithinTolerance", + "Differs": false, + "ScopeReason": "ground surface outer face", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:f5273d30-2ac9-43bc-b916-1759aea67323@space:5080c000-0000-0000-0000-00000000c0b1#layer1.internalSolarReflectance", + "Side": "panel:f5273d30-2ac9-43bc-b916-1759aea67323@space:5080c000-0000-0000-0000-00000000c0b1", + "Layer": 1, + "LayerCount": 3, + "Property": "internalSolarReflectance", + "SamFace": "internal", + "SamMaterial": "FIX_Concrete", + "NativeObject": "SAM_OpaqueMaterial_FIX_Concrete_150mm_b313ccd6", + "SamValue": 0.29, + "NativeValue": 0.31000000000000005, + "Delta": 0.020000000000000073, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 1 of 3, SAM internal face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:f5273d30-2ac9-43bc-b916-1759aea67323@space:5080c000-0000-0000-0000-00000000c0b1#layer1.externalLightReflectance", + "Side": "panel:f5273d30-2ac9-43bc-b916-1759aea67323@space:5080c000-0000-0000-0000-00000000c0b1", + "Layer": 1, + "LayerCount": 3, + "Property": "externalLightReflectance", + "SamFace": "external", + "SamMaterial": "FIX_Concrete", + "NativeObject": "SAM_OpaqueMaterial_FIX_Concrete_150mm_b313ccd6", + "SamValue": 0.32, + "NativeValue": 0.31999999999999995, + "Delta": 5.551115123125783E-17, + "NumericVerdict": "WithinTolerance", + "Differs": false, + "ScopeReason": "ground surface outer face", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:f5273d30-2ac9-43bc-b916-1759aea67323@space:5080c000-0000-0000-0000-00000000c0b1#layer1.internalLightReflectance", + "Side": "panel:f5273d30-2ac9-43bc-b916-1759aea67323@space:5080c000-0000-0000-0000-00000000c0b1", + "Layer": 1, + "LayerCount": 3, + "Property": "internalLightReflectance", + "SamFace": "internal", + "SamMaterial": "FIX_Concrete", + "NativeObject": "SAM_OpaqueMaterial_FIX_Concrete_150mm_b313ccd6", + "SamValue": 0.3, + "NativeValue": 0.31999999999999995, + "Delta": 0.019999999999999962, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 1 of 3, SAM internal face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:f5273d30-2ac9-43bc-b916-1759aea67323@space:5080c000-0000-0000-0000-00000000c0b1#layer1.externalEmissivity", + "Side": "panel:f5273d30-2ac9-43bc-b916-1759aea67323@space:5080c000-0000-0000-0000-00000000c0b1", + "Layer": 1, + "LayerCount": 3, + "Property": "externalEmissivity", + "SamFace": "external", + "SamMaterial": "FIX_Concrete", + "NativeObject": "SAM_OpaqueMaterial_FIX_Concrete_150mm_b313ccd6", + "SamValue": 0.95, + "NativeValue": 0.95, + "Delta": 0, + "NumericVerdict": "Identical", + "Differs": false, + "ScopeReason": "ground surface outer face", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:f5273d30-2ac9-43bc-b916-1759aea67323@space:5080c000-0000-0000-0000-00000000c0b1#layer1.internalEmissivity", + "Side": "panel:f5273d30-2ac9-43bc-b916-1759aea67323@space:5080c000-0000-0000-0000-00000000c0b1", + "Layer": 1, + "LayerCount": 3, + "Property": "internalEmissivity", + "SamFace": "internal", + "SamMaterial": "FIX_Concrete", + "NativeObject": "SAM_OpaqueMaterial_FIX_Concrete_150mm_b313ccd6", + "SamValue": 0.87, + "NativeValue": 0.95, + "Delta": 0.07999999999999996, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 1 of 3, SAM internal face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:f5273d30-2ac9-43bc-b916-1759aea67323@space:5080c000-0000-0000-0000-00000000c0b1#layer2.externalSolarReflectance", + "Side": "panel:f5273d30-2ac9-43bc-b916-1759aea67323@space:5080c000-0000-0000-0000-00000000c0b1", + "Layer": 2, + "LayerCount": 3, + "Property": "externalSolarReflectance", + "SamFace": "external", + "SamMaterial": "FIX_EPS", + "NativeObject": "SAM_OpaqueMaterial_FIX_EPS_120mm_c3cb21c2", + "SamValue": 0.58, + "NativeValue": 0.5800000000000001, + "Delta": 1.1102230246251565E-16, + "NumericVerdict": "WithinTolerance", + "Differs": false, + "ScopeReason": "buried layer face (layer 2 of 3, SAM external face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:f5273d30-2ac9-43bc-b916-1759aea67323@space:5080c000-0000-0000-0000-00000000c0b1#layer2.internalSolarReflectance", + "Side": "panel:f5273d30-2ac9-43bc-b916-1759aea67323@space:5080c000-0000-0000-0000-00000000c0b1", + "Layer": 2, + "LayerCount": 3, + "Property": "internalSolarReflectance", + "SamFace": "internal", + "SamMaterial": "FIX_EPS", + "NativeObject": "SAM_OpaqueMaterial_FIX_EPS_120mm_c3cb21c2", + "SamValue": 0.61, + "NativeValue": 0.5800000000000001, + "Delta": 0.029999999999999916, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 2 of 3, SAM internal face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:f5273d30-2ac9-43bc-b916-1759aea67323@space:5080c000-0000-0000-0000-00000000c0b1#layer2.externalLightReflectance", + "Side": "panel:f5273d30-2ac9-43bc-b916-1759aea67323@space:5080c000-0000-0000-0000-00000000c0b1", + "Layer": 2, + "LayerCount": 3, + "Property": "externalLightReflectance", + "SamFace": "external", + "SamMaterial": "FIX_EPS", + "NativeObject": "SAM_OpaqueMaterial_FIX_EPS_120mm_c3cb21c2", + "SamValue": 0.59, + "NativeValue": 0.5900000000000001, + "Delta": 1.1102230246251565E-16, + "NumericVerdict": "WithinTolerance", + "Differs": false, + "ScopeReason": "buried layer face (layer 2 of 3, SAM external face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:f5273d30-2ac9-43bc-b916-1759aea67323@space:5080c000-0000-0000-0000-00000000c0b1#layer2.internalLightReflectance", + "Side": "panel:f5273d30-2ac9-43bc-b916-1759aea67323@space:5080c000-0000-0000-0000-00000000c0b1", + "Layer": 2, + "LayerCount": 3, + "Property": "internalLightReflectance", + "SamFace": "internal", + "SamMaterial": "FIX_EPS", + "NativeObject": "SAM_OpaqueMaterial_FIX_EPS_120mm_c3cb21c2", + "SamValue": 0.63, + "NativeValue": 0.5900000000000001, + "Delta": 0.039999999999999925, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 2 of 3, SAM internal face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:f5273d30-2ac9-43bc-b916-1759aea67323@space:5080c000-0000-0000-0000-00000000c0b1#layer2.externalEmissivity", + "Side": "panel:f5273d30-2ac9-43bc-b916-1759aea67323@space:5080c000-0000-0000-0000-00000000c0b1", + "Layer": 2, + "LayerCount": 3, + "Property": "externalEmissivity", + "SamFace": "external", + "SamMaterial": "FIX_EPS", + "NativeObject": "SAM_OpaqueMaterial_FIX_EPS_120mm_c3cb21c2", + "SamValue": 0.85, + "NativeValue": 0.85, + "Delta": 0, + "NumericVerdict": "Identical", + "Differs": false, + "ScopeReason": "buried layer face (layer 2 of 3, SAM external face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:f5273d30-2ac9-43bc-b916-1759aea67323@space:5080c000-0000-0000-0000-00000000c0b1#layer2.internalEmissivity", + "Side": "panel:f5273d30-2ac9-43bc-b916-1759aea67323@space:5080c000-0000-0000-0000-00000000c0b1", + "Layer": 2, + "LayerCount": 3, + "Property": "internalEmissivity", + "SamFace": "internal", + "SamMaterial": "FIX_EPS", + "NativeObject": "SAM_OpaqueMaterial_FIX_EPS_120mm_c3cb21c2", + "SamValue": 0.96, + "NativeValue": 0.85, + "Delta": 0.10999999999999999, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 2 of 3, SAM internal face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:f5273d30-2ac9-43bc-b916-1759aea67323@space:5080c000-0000-0000-0000-00000000c0b1#layer3.externalSolarReflectance", + "Side": "panel:f5273d30-2ac9-43bc-b916-1759aea67323@space:5080c000-0000-0000-0000-00000000c0b1", + "Layer": 3, + "LayerCount": 3, + "Property": "externalSolarReflectance", + "SamFace": "external", + "SamMaterial": "FIX_Screed", + "NativeObject": "SAM_OpaqueMaterial_FIX_Screed_65mm_Internal_ba808960", + "SamValue": 0.27, + "NativeValue": 0.32999999999999996, + "Delta": 0.05999999999999994, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 3 of 3, SAM external face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:f5273d30-2ac9-43bc-b916-1759aea67323@space:5080c000-0000-0000-0000-00000000c0b1#layer3.externalLightReflectance", + "Side": "panel:f5273d30-2ac9-43bc-b916-1759aea67323@space:5080c000-0000-0000-0000-00000000c0b1", + "Layer": 3, + "LayerCount": 3, + "Property": "externalLightReflectance", + "SamFace": "external", + "SamMaterial": "FIX_Screed", + "NativeObject": "SAM_OpaqueMaterial_FIX_Screed_65mm_Internal_ba808960", + "SamValue": 0.28, + "NativeValue": 0.33999999999999997, + "Delta": 0.05999999999999994, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 3 of 3, SAM external face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:f5273d30-2ac9-43bc-b916-1759aea67323@space:5080c000-0000-0000-0000-00000000c0b1#layer3.externalEmissivity", + "Side": "panel:f5273d30-2ac9-43bc-b916-1759aea67323@space:5080c000-0000-0000-0000-00000000c0b1", + "Layer": 3, + "LayerCount": 3, + "Property": "externalEmissivity", + "SamFace": "external", + "SamMaterial": "FIX_Screed", + "NativeObject": "SAM_OpaqueMaterial_FIX_Screed_65mm_Internal_ba808960", + "SamValue": 0.94, + "NativeValue": 0.9, + "Delta": 0.039999999999999925, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 3 of 3, SAM external face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:9c39d26c-3a91-43fc-adac-414e0794be54@space:5080c000-0000-0000-0000-00000000c0b1#layer1.internalSolarReflectance", + "Side": "panel:9c39d26c-3a91-43fc-adac-414e0794be54@space:5080c000-0000-0000-0000-00000000c0b1", + "Layer": 1, + "LayerCount": 4, + "Property": "internalSolarReflectance", + "SamFace": "internal", + "SamMaterial": "FIX_Membrane", + "NativeObject": "SAM_OpaqueMaterial_FIX_Membrane_4mm_720b0f60", + "SamValue": 0.24, + "NativeValue": 0.14, + "Delta": 0.09999999999999998, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 1 of 4, SAM internal face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:9c39d26c-3a91-43fc-adac-414e0794be54@space:5080c000-0000-0000-0000-00000000c0b1#layer1.internalLightReflectance", + "Side": "panel:9c39d26c-3a91-43fc-adac-414e0794be54@space:5080c000-0000-0000-0000-00000000c0b1", + "Layer": 1, + "LayerCount": 4, + "Property": "internalLightReflectance", + "SamFace": "internal", + "SamMaterial": "FIX_Membrane", + "NativeObject": "SAM_OpaqueMaterial_FIX_Membrane_4mm_720b0f60", + "SamValue": 0.25, + "NativeValue": 0.15000000000000002, + "Delta": 0.09999999999999998, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 1 of 4, SAM internal face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:9c39d26c-3a91-43fc-adac-414e0794be54@space:5080c000-0000-0000-0000-00000000c0b1#layer1.internalEmissivity", + "Side": "panel:9c39d26c-3a91-43fc-adac-414e0794be54@space:5080c000-0000-0000-0000-00000000c0b1", + "Layer": 1, + "LayerCount": 4, + "Property": "internalEmissivity", + "SamFace": "internal", + "SamMaterial": "FIX_Membrane", + "NativeObject": "SAM_OpaqueMaterial_FIX_Membrane_4mm_720b0f60", + "SamValue": 0.86, + "NativeValue": 0.92, + "Delta": 0.06000000000000005, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 1 of 4, SAM internal face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:9c39d26c-3a91-43fc-adac-414e0794be54@space:5080c000-0000-0000-0000-00000000c0b1#layer2.externalSolarReflectance", + "Side": "panel:9c39d26c-3a91-43fc-adac-414e0794be54@space:5080c000-0000-0000-0000-00000000c0b1", + "Layer": 2, + "LayerCount": 4, + "Property": "externalSolarReflectance", + "SamFace": "external", + "SamMaterial": "FIX_OSB", + "NativeObject": "SAM_OpaqueMaterial_FIX_OSB_18mm_9487bdd1", + "SamValue": 0.43, + "NativeValue": 0.43000000000000005, + "Delta": 5.551115123125783E-17, + "NumericVerdict": "WithinTolerance", + "Differs": false, + "ScopeReason": "buried layer face (layer 2 of 4, SAM external face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:9c39d26c-3a91-43fc-adac-414e0794be54@space:5080c000-0000-0000-0000-00000000c0b1#layer2.internalSolarReflectance", + "Side": "panel:9c39d26c-3a91-43fc-adac-414e0794be54@space:5080c000-0000-0000-0000-00000000c0b1", + "Layer": 2, + "LayerCount": 4, + "Property": "internalSolarReflectance", + "SamFace": "internal", + "SamMaterial": "FIX_OSB", + "NativeObject": "SAM_OpaqueMaterial_FIX_OSB_18mm_9487bdd1", + "SamValue": 0.47, + "NativeValue": 0.43000000000000005, + "Delta": 0.039999999999999925, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 2 of 4, SAM internal face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:9c39d26c-3a91-43fc-adac-414e0794be54@space:5080c000-0000-0000-0000-00000000c0b1#layer2.externalLightReflectance", + "Side": "panel:9c39d26c-3a91-43fc-adac-414e0794be54@space:5080c000-0000-0000-0000-00000000c0b1", + "Layer": 2, + "LayerCount": 4, + "Property": "externalLightReflectance", + "SamFace": "external", + "SamMaterial": "FIX_OSB", + "NativeObject": "SAM_OpaqueMaterial_FIX_OSB_18mm_9487bdd1", + "SamValue": 0.42, + "NativeValue": 0.42000000000000004, + "Delta": 5.551115123125783E-17, + "NumericVerdict": "WithinTolerance", + "Differs": false, + "ScopeReason": "buried layer face (layer 2 of 4, SAM external face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:9c39d26c-3a91-43fc-adac-414e0794be54@space:5080c000-0000-0000-0000-00000000c0b1#layer2.internalLightReflectance", + "Side": "panel:9c39d26c-3a91-43fc-adac-414e0794be54@space:5080c000-0000-0000-0000-00000000c0b1", + "Layer": 2, + "LayerCount": 4, + "Property": "internalLightReflectance", + "SamFace": "internal", + "SamMaterial": "FIX_OSB", + "NativeObject": "SAM_OpaqueMaterial_FIX_OSB_18mm_9487bdd1", + "SamValue": 0.48, + "NativeValue": 0.42000000000000004, + "Delta": 0.05999999999999994, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 2 of 4, SAM internal face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:9c39d26c-3a91-43fc-adac-414e0794be54@space:5080c000-0000-0000-0000-00000000c0b1#layer2.externalEmissivity", + "Side": "panel:9c39d26c-3a91-43fc-adac-414e0794be54@space:5080c000-0000-0000-0000-00000000c0b1", + "Layer": 2, + "LayerCount": 4, + "Property": "externalEmissivity", + "SamFace": "external", + "SamMaterial": "FIX_OSB", + "NativeObject": "SAM_OpaqueMaterial_FIX_OSB_18mm_9487bdd1", + "SamValue": 0.91, + "NativeValue": 0.91, + "Delta": 0, + "NumericVerdict": "Identical", + "Differs": false, + "ScopeReason": "buried layer face (layer 2 of 4, SAM external face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:9c39d26c-3a91-43fc-adac-414e0794be54@space:5080c000-0000-0000-0000-00000000c0b1#layer2.internalEmissivity", + "Side": "panel:9c39d26c-3a91-43fc-adac-414e0794be54@space:5080c000-0000-0000-0000-00000000c0b1", + "Layer": 2, + "LayerCount": 4, + "Property": "internalEmissivity", + "SamFace": "internal", + "SamMaterial": "FIX_OSB", + "NativeObject": "SAM_OpaqueMaterial_FIX_OSB_18mm_9487bdd1", + "SamValue": 0.89, + "NativeValue": 0.91, + "Delta": 0.020000000000000018, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 2 of 4, SAM internal face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:9c39d26c-3a91-43fc-adac-414e0794be54@space:5080c000-0000-0000-0000-00000000c0b1#layer3.externalSolarReflectance", + "Side": "panel:9c39d26c-3a91-43fc-adac-414e0794be54@space:5080c000-0000-0000-0000-00000000c0b1", + "Layer": 3, + "LayerCount": 4, + "Property": "externalSolarReflectance", + "SamFace": "external", + "SamMaterial": "FIX_PIR", + "NativeObject": "SAM_OpaqueMaterial_FIX_PIR_160mm_06224e1b", + "SamValue": 0.53, + "NativeValue": 0.53, + "Delta": 0, + "NumericVerdict": "Identical", + "Differs": false, + "ScopeReason": "buried layer face (layer 3 of 4, SAM external face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:9c39d26c-3a91-43fc-adac-414e0794be54@space:5080c000-0000-0000-0000-00000000c0b1#layer3.internalSolarReflectance", + "Side": "panel:9c39d26c-3a91-43fc-adac-414e0794be54@space:5080c000-0000-0000-0000-00000000c0b1", + "Layer": 3, + "LayerCount": 4, + "Property": "internalSolarReflectance", + "SamFace": "internal", + "SamMaterial": "FIX_PIR", + "NativeObject": "SAM_OpaqueMaterial_FIX_PIR_160mm_06224e1b", + "SamValue": 0.55, + "NativeValue": 0.53, + "Delta": 0.020000000000000018, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 3 of 4, SAM internal face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:9c39d26c-3a91-43fc-adac-414e0794be54@space:5080c000-0000-0000-0000-00000000c0b1#layer3.externalLightReflectance", + "Side": "panel:9c39d26c-3a91-43fc-adac-414e0794be54@space:5080c000-0000-0000-0000-00000000c0b1", + "Layer": 3, + "LayerCount": 4, + "Property": "externalLightReflectance", + "SamFace": "external", + "SamMaterial": "FIX_PIR", + "NativeObject": "SAM_OpaqueMaterial_FIX_PIR_160mm_06224e1b", + "SamValue": 0.54, + "NativeValue": 0.54, + "Delta": 0, + "NumericVerdict": "Identical", + "Differs": false, + "ScopeReason": "buried layer face (layer 3 of 4, SAM external face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:9c39d26c-3a91-43fc-adac-414e0794be54@space:5080c000-0000-0000-0000-00000000c0b1#layer3.internalLightReflectance", + "Side": "panel:9c39d26c-3a91-43fc-adac-414e0794be54@space:5080c000-0000-0000-0000-00000000c0b1", + "Layer": 3, + "LayerCount": 4, + "Property": "internalLightReflectance", + "SamFace": "internal", + "SamMaterial": "FIX_PIR", + "NativeObject": "SAM_OpaqueMaterial_FIX_PIR_160mm_06224e1b", + "SamValue": 0.56, + "NativeValue": 0.54, + "Delta": 0.020000000000000018, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 3 of 4, SAM internal face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:9c39d26c-3a91-43fc-adac-414e0794be54@space:5080c000-0000-0000-0000-00000000c0b1#layer3.externalEmissivity", + "Side": "panel:9c39d26c-3a91-43fc-adac-414e0794be54@space:5080c000-0000-0000-0000-00000000c0b1", + "Layer": 3, + "LayerCount": 4, + "Property": "externalEmissivity", + "SamFace": "external", + "SamMaterial": "FIX_PIR", + "NativeObject": "SAM_OpaqueMaterial_FIX_PIR_160mm_06224e1b", + "SamValue": 0.87, + "NativeValue": 0.87, + "Delta": 0, + "NumericVerdict": "Identical", + "Differs": false, + "ScopeReason": "buried layer face (layer 3 of 4, SAM external face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:9c39d26c-3a91-43fc-adac-414e0794be54@space:5080c000-0000-0000-0000-00000000c0b1#layer3.internalEmissivity", + "Side": "panel:9c39d26c-3a91-43fc-adac-414e0794be54@space:5080c000-0000-0000-0000-00000000c0b1", + "Layer": 3, + "LayerCount": 4, + "Property": "internalEmissivity", + "SamFace": "internal", + "SamMaterial": "FIX_PIR", + "NativeObject": "SAM_OpaqueMaterial_FIX_PIR_160mm_06224e1b", + "SamValue": 0.95, + "NativeValue": 0.87, + "Delta": 0.07999999999999996, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 3 of 4, SAM internal face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:9c39d26c-3a91-43fc-adac-414e0794be54@space:5080c000-0000-0000-0000-00000000c0b1#layer4.externalSolarReflectance", + "Side": "panel:9c39d26c-3a91-43fc-adac-414e0794be54@space:5080c000-0000-0000-0000-00000000c0b1", + "Layer": 4, + "LayerCount": 4, + "Property": "externalSolarReflectance", + "SamFace": "external", + "SamMaterial": "FIX_Plasterboard", + "NativeObject": "SAM_OpaqueMaterial_FIX_Plasterboard_15mm_Internal_37d096dc", + "SamValue": 0.62, + "NativeValue": 0.6799999999999999, + "Delta": 0.05999999999999994, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 4 of 4, SAM external face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:9c39d26c-3a91-43fc-adac-414e0794be54@space:5080c000-0000-0000-0000-00000000c0b1#layer4.externalLightReflectance", + "Side": "panel:9c39d26c-3a91-43fc-adac-414e0794be54@space:5080c000-0000-0000-0000-00000000c0b1", + "Layer": 4, + "LayerCount": 4, + "Property": "externalLightReflectance", + "SamFace": "external", + "SamMaterial": "FIX_Plasterboard", + "NativeObject": "SAM_OpaqueMaterial_FIX_Plasterboard_15mm_Internal_37d096dc", + "SamValue": 0.64, + "NativeValue": 0.7, + "Delta": 0.05999999999999994, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 4 of 4, SAM external face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:9c39d26c-3a91-43fc-adac-414e0794be54@space:5080c000-0000-0000-0000-00000000c0b1#layer4.externalEmissivity", + "Side": "panel:9c39d26c-3a91-43fc-adac-414e0794be54@space:5080c000-0000-0000-0000-00000000c0b1", + "Layer": 4, + "LayerCount": 4, + "Property": "externalEmissivity", + "SamFace": "external", + "SamMaterial": "FIX_Plasterboard", + "NativeObject": "SAM_OpaqueMaterial_FIX_Plasterboard_15mm_Internal_37d096dc", + "SamValue": 0.9, + "NativeValue": 0.91, + "Delta": 0.010000000000000009, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 4 of 4, SAM external face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:d1aaf21e-5613-42e2-ba3c-a6632d2237fd@space:5080c000-0000-0000-0000-00000000c0b1#layer1.internalSolarReflectance", + "Side": "panel:d1aaf21e-5613-42e2-ba3c-a6632d2237fd@space:5080c000-0000-0000-0000-00000000c0b1", + "Layer": 1, + "LayerCount": 4, + "Property": "internalSolarReflectance", + "SamFace": "internal", + "SamMaterial": "FIX_Render", + "NativeObject": "SAM_OpaqueMaterial_FIX_Render_15mm_cf8a5937", + "SamValue": 0.36, + "NativeValue": 0.5700000000000001, + "Delta": 0.21000000000000008, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 1 of 4, SAM internal face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:d1aaf21e-5613-42e2-ba3c-a6632d2237fd@space:5080c000-0000-0000-0000-00000000c0b1#layer1.internalLightReflectance", + "Side": "panel:d1aaf21e-5613-42e2-ba3c-a6632d2237fd@space:5080c000-0000-0000-0000-00000000c0b1", + "Layer": 1, + "LayerCount": 4, + "Property": "internalLightReflectance", + "SamFace": "internal", + "SamMaterial": "FIX_Render", + "NativeObject": "SAM_OpaqueMaterial_FIX_Render_15mm_cf8a5937", + "SamValue": 0.37, + "NativeValue": 0.5800000000000001, + "Delta": 0.21000000000000008, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 1 of 4, SAM internal face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:d1aaf21e-5613-42e2-ba3c-a6632d2237fd@space:5080c000-0000-0000-0000-00000000c0b1#layer1.internalEmissivity", + "Side": "panel:d1aaf21e-5613-42e2-ba3c-a6632d2237fd@space:5080c000-0000-0000-0000-00000000c0b1", + "Layer": 1, + "LayerCount": 4, + "Property": "internalEmissivity", + "SamFace": "internal", + "SamMaterial": "FIX_Render", + "NativeObject": "SAM_OpaqueMaterial_FIX_Render_15mm_cf8a5937", + "SamValue": 0.93, + "NativeValue": 0.88, + "Delta": 0.050000000000000044, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 1 of 4, SAM internal face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:d1aaf21e-5613-42e2-ba3c-a6632d2237fd@space:5080c000-0000-0000-0000-00000000c0b1#layer2.externalSolarReflectance", + "Side": "panel:d1aaf21e-5613-42e2-ba3c-a6632d2237fd@space:5080c000-0000-0000-0000-00000000c0b1", + "Layer": 2, + "LayerCount": 4, + "Property": "externalSolarReflectance", + "SamFace": "external", + "SamMaterial": "FIX_Blockwork", + "NativeObject": "SAM_OpaqueMaterial_FIX_Blockwork_100mm_422b4f0d", + "SamValue": 0.38, + "NativeValue": 0.38, + "Delta": 0, + "NumericVerdict": "Identical", + "Differs": false, + "ScopeReason": "buried layer face (layer 2 of 4, SAM external face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:d1aaf21e-5613-42e2-ba3c-a6632d2237fd@space:5080c000-0000-0000-0000-00000000c0b1#layer2.internalSolarReflectance", + "Side": "panel:d1aaf21e-5613-42e2-ba3c-a6632d2237fd@space:5080c000-0000-0000-0000-00000000c0b1", + "Layer": 2, + "LayerCount": 4, + "Property": "internalSolarReflectance", + "SamFace": "internal", + "SamMaterial": "FIX_Blockwork", + "NativeObject": "SAM_OpaqueMaterial_FIX_Blockwork_100mm_422b4f0d", + "SamValue": 0.44, + "NativeValue": 0.38, + "Delta": 0.06, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 2 of 4, SAM internal face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:d1aaf21e-5613-42e2-ba3c-a6632d2237fd@space:5080c000-0000-0000-0000-00000000c0b1#layer2.externalLightReflectance", + "Side": "panel:d1aaf21e-5613-42e2-ba3c-a6632d2237fd@space:5080c000-0000-0000-0000-00000000c0b1", + "Layer": 2, + "LayerCount": 4, + "Property": "externalLightReflectance", + "SamFace": "external", + "SamMaterial": "FIX_Blockwork", + "NativeObject": "SAM_OpaqueMaterial_FIX_Blockwork_100mm_422b4f0d", + "SamValue": 0.39, + "NativeValue": 0.39, + "Delta": 0, + "NumericVerdict": "Identical", + "Differs": false, + "ScopeReason": "buried layer face (layer 2 of 4, SAM external face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:d1aaf21e-5613-42e2-ba3c-a6632d2237fd@space:5080c000-0000-0000-0000-00000000c0b1#layer2.internalLightReflectance", + "Side": "panel:d1aaf21e-5613-42e2-ba3c-a6632d2237fd@space:5080c000-0000-0000-0000-00000000c0b1", + "Layer": 2, + "LayerCount": 4, + "Property": "internalLightReflectance", + "SamFace": "internal", + "SamMaterial": "FIX_Blockwork", + "NativeObject": "SAM_OpaqueMaterial_FIX_Blockwork_100mm_422b4f0d", + "SamValue": 0.46, + "NativeValue": 0.39, + "Delta": 0.07, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 2 of 4, SAM internal face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:d1aaf21e-5613-42e2-ba3c-a6632d2237fd@space:5080c000-0000-0000-0000-00000000c0b1#layer2.externalEmissivity", + "Side": "panel:d1aaf21e-5613-42e2-ba3c-a6632d2237fd@space:5080c000-0000-0000-0000-00000000c0b1", + "Layer": 2, + "LayerCount": 4, + "Property": "externalEmissivity", + "SamFace": "external", + "SamMaterial": "FIX_Blockwork", + "NativeObject": "SAM_OpaqueMaterial_FIX_Blockwork_100mm_422b4f0d", + "SamValue": 0.93, + "NativeValue": 0.93, + "Delta": 0, + "NumericVerdict": "Identical", + "Differs": false, + "ScopeReason": "buried layer face (layer 2 of 4, SAM external face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:d1aaf21e-5613-42e2-ba3c-a6632d2237fd@space:5080c000-0000-0000-0000-00000000c0b1#layer2.internalEmissivity", + "Side": "panel:d1aaf21e-5613-42e2-ba3c-a6632d2237fd@space:5080c000-0000-0000-0000-00000000c0b1", + "Layer": 2, + "LayerCount": 4, + "Property": "internalEmissivity", + "SamFace": "internal", + "SamMaterial": "FIX_Blockwork", + "NativeObject": "SAM_OpaqueMaterial_FIX_Blockwork_100mm_422b4f0d", + "SamValue": 0.94, + "NativeValue": 0.93, + "Delta": 0.009999999999999898, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 2 of 4, SAM internal face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:d1aaf21e-5613-42e2-ba3c-a6632d2237fd@space:5080c000-0000-0000-0000-00000000c0b1#layer3.externalSolarReflectance", + "Side": "panel:d1aaf21e-5613-42e2-ba3c-a6632d2237fd@space:5080c000-0000-0000-0000-00000000c0b1", + "Layer": 3, + "LayerCount": 4, + "Property": "externalSolarReflectance", + "SamFace": "external", + "SamMaterial": "FIX_MineralWool", + "NativeObject": "SAM_OpaqueMaterial_FIX_MineralWool_140mm_340c952a", + "SamValue": 0.48, + "NativeValue": 0.48, + "Delta": 0, + "NumericVerdict": "Identical", + "Differs": false, + "ScopeReason": "buried layer face (layer 3 of 4, SAM external face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:d1aaf21e-5613-42e2-ba3c-a6632d2237fd@space:5080c000-0000-0000-0000-00000000c0b1#layer3.internalSolarReflectance", + "Side": "panel:d1aaf21e-5613-42e2-ba3c-a6632d2237fd@space:5080c000-0000-0000-0000-00000000c0b1", + "Layer": 3, + "LayerCount": 4, + "Property": "internalSolarReflectance", + "SamFace": "internal", + "SamMaterial": "FIX_MineralWool", + "NativeObject": "SAM_OpaqueMaterial_FIX_MineralWool_140mm_340c952a", + "SamValue": 0.51, + "NativeValue": 0.48, + "Delta": 0.030000000000000027, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 3 of 4, SAM internal face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:d1aaf21e-5613-42e2-ba3c-a6632d2237fd@space:5080c000-0000-0000-0000-00000000c0b1#layer3.externalLightReflectance", + "Side": "panel:d1aaf21e-5613-42e2-ba3c-a6632d2237fd@space:5080c000-0000-0000-0000-00000000c0b1", + "Layer": 3, + "LayerCount": 4, + "Property": "externalLightReflectance", + "SamFace": "external", + "SamMaterial": "FIX_MineralWool", + "NativeObject": "SAM_OpaqueMaterial_FIX_MineralWool_140mm_340c952a", + "SamValue": 0.49, + "NativeValue": 0.49, + "Delta": 0, + "NumericVerdict": "Identical", + "Differs": false, + "ScopeReason": "buried layer face (layer 3 of 4, SAM external face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:d1aaf21e-5613-42e2-ba3c-a6632d2237fd@space:5080c000-0000-0000-0000-00000000c0b1#layer3.internalLightReflectance", + "Side": "panel:d1aaf21e-5613-42e2-ba3c-a6632d2237fd@space:5080c000-0000-0000-0000-00000000c0b1", + "Layer": 3, + "LayerCount": 4, + "Property": "internalLightReflectance", + "SamFace": "internal", + "SamMaterial": "FIX_MineralWool", + "NativeObject": "SAM_OpaqueMaterial_FIX_MineralWool_140mm_340c952a", + "SamValue": 0.53, + "NativeValue": 0.49, + "Delta": 0.040000000000000036, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 3 of 4, SAM internal face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:d1aaf21e-5613-42e2-ba3c-a6632d2237fd@space:5080c000-0000-0000-0000-00000000c0b1#layer3.externalEmissivity", + "Side": "panel:d1aaf21e-5613-42e2-ba3c-a6632d2237fd@space:5080c000-0000-0000-0000-00000000c0b1", + "Layer": 3, + "LayerCount": 4, + "Property": "externalEmissivity", + "SamFace": "external", + "SamMaterial": "FIX_MineralWool", + "NativeObject": "SAM_OpaqueMaterial_FIX_MineralWool_140mm_340c952a", + "SamValue": 0.89, + "NativeValue": 0.89, + "Delta": 0, + "NumericVerdict": "Identical", + "Differs": false, + "ScopeReason": "buried layer face (layer 3 of 4, SAM external face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:d1aaf21e-5613-42e2-ba3c-a6632d2237fd@space:5080c000-0000-0000-0000-00000000c0b1#layer3.internalEmissivity", + "Side": "panel:d1aaf21e-5613-42e2-ba3c-a6632d2237fd@space:5080c000-0000-0000-0000-00000000c0b1", + "Layer": 3, + "LayerCount": 4, + "Property": "internalEmissivity", + "SamFace": "internal", + "SamMaterial": "FIX_MineralWool", + "NativeObject": "SAM_OpaqueMaterial_FIX_MineralWool_140mm_340c952a", + "SamValue": 0.92, + "NativeValue": 0.89, + "Delta": 0.030000000000000027, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 3 of 4, SAM internal face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:d1aaf21e-5613-42e2-ba3c-a6632d2237fd@space:5080c000-0000-0000-0000-00000000c0b1#layer4.externalSolarReflectance", + "Side": "panel:d1aaf21e-5613-42e2-ba3c-a6632d2237fd@space:5080c000-0000-0000-0000-00000000c0b1", + "Layer": 4, + "LayerCount": 4, + "Property": "externalSolarReflectance", + "SamFace": "external", + "SamMaterial": "FIX_Plasterboard", + "NativeObject": "SAM_OpaqueMaterial_FIX_Plasterboard_12.5mm_Internal_37d096dc", + "SamValue": 0.62, + "NativeValue": 0.6799999999999999, + "Delta": 0.05999999999999994, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 4 of 4, SAM external face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:d1aaf21e-5613-42e2-ba3c-a6632d2237fd@space:5080c000-0000-0000-0000-00000000c0b1#layer4.externalLightReflectance", + "Side": "panel:d1aaf21e-5613-42e2-ba3c-a6632d2237fd@space:5080c000-0000-0000-0000-00000000c0b1", + "Layer": 4, + "LayerCount": 4, + "Property": "externalLightReflectance", + "SamFace": "external", + "SamMaterial": "FIX_Plasterboard", + "NativeObject": "SAM_OpaqueMaterial_FIX_Plasterboard_12.5mm_Internal_37d096dc", + "SamValue": 0.64, + "NativeValue": 0.7, + "Delta": 0.05999999999999994, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 4 of 4, SAM external face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:d1aaf21e-5613-42e2-ba3c-a6632d2237fd@space:5080c000-0000-0000-0000-00000000c0b1#layer4.externalEmissivity", + "Side": "panel:d1aaf21e-5613-42e2-ba3c-a6632d2237fd@space:5080c000-0000-0000-0000-00000000c0b1", + "Layer": 4, + "LayerCount": 4, + "Property": "externalEmissivity", + "SamFace": "external", + "SamMaterial": "FIX_Plasterboard", + "NativeObject": "SAM_OpaqueMaterial_FIX_Plasterboard_12.5mm_Internal_37d096dc", + "SamValue": 0.9, + "NativeValue": 0.91, + "Delta": 0.010000000000000009, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 4 of 4, SAM external face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:965af5b3-f250-4492-9467-f988d7831eae@space:5080c000-0000-0000-0000-00000000c0b1#layer1.internalSolarReflectance", + "Side": "panel:965af5b3-f250-4492-9467-f988d7831eae@space:5080c000-0000-0000-0000-00000000c0b1", + "Layer": 1, + "LayerCount": 4, + "Property": "internalSolarReflectance", + "SamFace": "internal", + "SamMaterial": "FIX_Render", + "NativeObject": "SAM_OpaqueMaterial_FIX_Render_15mm_cf8a5937", + "SamValue": 0.36, + "NativeValue": 0.5700000000000001, + "Delta": 0.21000000000000008, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 1 of 4, SAM internal face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:965af5b3-f250-4492-9467-f988d7831eae@space:5080c000-0000-0000-0000-00000000c0b1#layer1.internalLightReflectance", + "Side": "panel:965af5b3-f250-4492-9467-f988d7831eae@space:5080c000-0000-0000-0000-00000000c0b1", + "Layer": 1, + "LayerCount": 4, + "Property": "internalLightReflectance", + "SamFace": "internal", + "SamMaterial": "FIX_Render", + "NativeObject": "SAM_OpaqueMaterial_FIX_Render_15mm_cf8a5937", + "SamValue": 0.37, + "NativeValue": 0.5800000000000001, + "Delta": 0.21000000000000008, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 1 of 4, SAM internal face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:965af5b3-f250-4492-9467-f988d7831eae@space:5080c000-0000-0000-0000-00000000c0b1#layer1.internalEmissivity", + "Side": "panel:965af5b3-f250-4492-9467-f988d7831eae@space:5080c000-0000-0000-0000-00000000c0b1", + "Layer": 1, + "LayerCount": 4, + "Property": "internalEmissivity", + "SamFace": "internal", + "SamMaterial": "FIX_Render", + "NativeObject": "SAM_OpaqueMaterial_FIX_Render_15mm_cf8a5937", + "SamValue": 0.93, + "NativeValue": 0.88, + "Delta": 0.050000000000000044, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 1 of 4, SAM internal face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:965af5b3-f250-4492-9467-f988d7831eae@space:5080c000-0000-0000-0000-00000000c0b1#layer2.externalSolarReflectance", + "Side": "panel:965af5b3-f250-4492-9467-f988d7831eae@space:5080c000-0000-0000-0000-00000000c0b1", + "Layer": 2, + "LayerCount": 4, + "Property": "externalSolarReflectance", + "SamFace": "external", + "SamMaterial": "FIX_Blockwork", + "NativeObject": "SAM_OpaqueMaterial_FIX_Blockwork_100mm_422b4f0d", + "SamValue": 0.38, + "NativeValue": 0.38, + "Delta": 0, + "NumericVerdict": "Identical", + "Differs": false, + "ScopeReason": "buried layer face (layer 2 of 4, SAM external face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:965af5b3-f250-4492-9467-f988d7831eae@space:5080c000-0000-0000-0000-00000000c0b1#layer2.internalSolarReflectance", + "Side": "panel:965af5b3-f250-4492-9467-f988d7831eae@space:5080c000-0000-0000-0000-00000000c0b1", + "Layer": 2, + "LayerCount": 4, + "Property": "internalSolarReflectance", + "SamFace": "internal", + "SamMaterial": "FIX_Blockwork", + "NativeObject": "SAM_OpaqueMaterial_FIX_Blockwork_100mm_422b4f0d", + "SamValue": 0.44, + "NativeValue": 0.38, + "Delta": 0.06, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 2 of 4, SAM internal face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:965af5b3-f250-4492-9467-f988d7831eae@space:5080c000-0000-0000-0000-00000000c0b1#layer2.externalLightReflectance", + "Side": "panel:965af5b3-f250-4492-9467-f988d7831eae@space:5080c000-0000-0000-0000-00000000c0b1", + "Layer": 2, + "LayerCount": 4, + "Property": "externalLightReflectance", + "SamFace": "external", + "SamMaterial": "FIX_Blockwork", + "NativeObject": "SAM_OpaqueMaterial_FIX_Blockwork_100mm_422b4f0d", + "SamValue": 0.39, + "NativeValue": 0.39, + "Delta": 0, + "NumericVerdict": "Identical", + "Differs": false, + "ScopeReason": "buried layer face (layer 2 of 4, SAM external face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:965af5b3-f250-4492-9467-f988d7831eae@space:5080c000-0000-0000-0000-00000000c0b1#layer2.internalLightReflectance", + "Side": "panel:965af5b3-f250-4492-9467-f988d7831eae@space:5080c000-0000-0000-0000-00000000c0b1", + "Layer": 2, + "LayerCount": 4, + "Property": "internalLightReflectance", + "SamFace": "internal", + "SamMaterial": "FIX_Blockwork", + "NativeObject": "SAM_OpaqueMaterial_FIX_Blockwork_100mm_422b4f0d", + "SamValue": 0.46, + "NativeValue": 0.39, + "Delta": 0.07, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 2 of 4, SAM internal face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:965af5b3-f250-4492-9467-f988d7831eae@space:5080c000-0000-0000-0000-00000000c0b1#layer2.externalEmissivity", + "Side": "panel:965af5b3-f250-4492-9467-f988d7831eae@space:5080c000-0000-0000-0000-00000000c0b1", + "Layer": 2, + "LayerCount": 4, + "Property": "externalEmissivity", + "SamFace": "external", + "SamMaterial": "FIX_Blockwork", + "NativeObject": "SAM_OpaqueMaterial_FIX_Blockwork_100mm_422b4f0d", + "SamValue": 0.93, + "NativeValue": 0.93, + "Delta": 0, + "NumericVerdict": "Identical", + "Differs": false, + "ScopeReason": "buried layer face (layer 2 of 4, SAM external face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:965af5b3-f250-4492-9467-f988d7831eae@space:5080c000-0000-0000-0000-00000000c0b1#layer2.internalEmissivity", + "Side": "panel:965af5b3-f250-4492-9467-f988d7831eae@space:5080c000-0000-0000-0000-00000000c0b1", + "Layer": 2, + "LayerCount": 4, + "Property": "internalEmissivity", + "SamFace": "internal", + "SamMaterial": "FIX_Blockwork", + "NativeObject": "SAM_OpaqueMaterial_FIX_Blockwork_100mm_422b4f0d", + "SamValue": 0.94, + "NativeValue": 0.93, + "Delta": 0.009999999999999898, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 2 of 4, SAM internal face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:965af5b3-f250-4492-9467-f988d7831eae@space:5080c000-0000-0000-0000-00000000c0b1#layer3.externalSolarReflectance", + "Side": "panel:965af5b3-f250-4492-9467-f988d7831eae@space:5080c000-0000-0000-0000-00000000c0b1", + "Layer": 3, + "LayerCount": 4, + "Property": "externalSolarReflectance", + "SamFace": "external", + "SamMaterial": "FIX_MineralWool", + "NativeObject": "SAM_OpaqueMaterial_FIX_MineralWool_140mm_340c952a", + "SamValue": 0.48, + "NativeValue": 0.48, + "Delta": 0, + "NumericVerdict": "Identical", + "Differs": false, + "ScopeReason": "buried layer face (layer 3 of 4, SAM external face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:965af5b3-f250-4492-9467-f988d7831eae@space:5080c000-0000-0000-0000-00000000c0b1#layer3.internalSolarReflectance", + "Side": "panel:965af5b3-f250-4492-9467-f988d7831eae@space:5080c000-0000-0000-0000-00000000c0b1", + "Layer": 3, + "LayerCount": 4, + "Property": "internalSolarReflectance", + "SamFace": "internal", + "SamMaterial": "FIX_MineralWool", + "NativeObject": "SAM_OpaqueMaterial_FIX_MineralWool_140mm_340c952a", + "SamValue": 0.51, + "NativeValue": 0.48, + "Delta": 0.030000000000000027, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 3 of 4, SAM internal face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:965af5b3-f250-4492-9467-f988d7831eae@space:5080c000-0000-0000-0000-00000000c0b1#layer3.externalLightReflectance", + "Side": "panel:965af5b3-f250-4492-9467-f988d7831eae@space:5080c000-0000-0000-0000-00000000c0b1", + "Layer": 3, + "LayerCount": 4, + "Property": "externalLightReflectance", + "SamFace": "external", + "SamMaterial": "FIX_MineralWool", + "NativeObject": "SAM_OpaqueMaterial_FIX_MineralWool_140mm_340c952a", + "SamValue": 0.49, + "NativeValue": 0.49, + "Delta": 0, + "NumericVerdict": "Identical", + "Differs": false, + "ScopeReason": "buried layer face (layer 3 of 4, SAM external face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:965af5b3-f250-4492-9467-f988d7831eae@space:5080c000-0000-0000-0000-00000000c0b1#layer3.internalLightReflectance", + "Side": "panel:965af5b3-f250-4492-9467-f988d7831eae@space:5080c000-0000-0000-0000-00000000c0b1", + "Layer": 3, + "LayerCount": 4, + "Property": "internalLightReflectance", + "SamFace": "internal", + "SamMaterial": "FIX_MineralWool", + "NativeObject": "SAM_OpaqueMaterial_FIX_MineralWool_140mm_340c952a", + "SamValue": 0.53, + "NativeValue": 0.49, + "Delta": 0.040000000000000036, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 3 of 4, SAM internal face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:965af5b3-f250-4492-9467-f988d7831eae@space:5080c000-0000-0000-0000-00000000c0b1#layer3.externalEmissivity", + "Side": "panel:965af5b3-f250-4492-9467-f988d7831eae@space:5080c000-0000-0000-0000-00000000c0b1", + "Layer": 3, + "LayerCount": 4, + "Property": "externalEmissivity", + "SamFace": "external", + "SamMaterial": "FIX_MineralWool", + "NativeObject": "SAM_OpaqueMaterial_FIX_MineralWool_140mm_340c952a", + "SamValue": 0.89, + "NativeValue": 0.89, + "Delta": 0, + "NumericVerdict": "Identical", + "Differs": false, + "ScopeReason": "buried layer face (layer 3 of 4, SAM external face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:965af5b3-f250-4492-9467-f988d7831eae@space:5080c000-0000-0000-0000-00000000c0b1#layer3.internalEmissivity", + "Side": "panel:965af5b3-f250-4492-9467-f988d7831eae@space:5080c000-0000-0000-0000-00000000c0b1", + "Layer": 3, + "LayerCount": 4, + "Property": "internalEmissivity", + "SamFace": "internal", + "SamMaterial": "FIX_MineralWool", + "NativeObject": "SAM_OpaqueMaterial_FIX_MineralWool_140mm_340c952a", + "SamValue": 0.92, + "NativeValue": 0.89, + "Delta": 0.030000000000000027, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 3 of 4, SAM internal face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:965af5b3-f250-4492-9467-f988d7831eae@space:5080c000-0000-0000-0000-00000000c0b1#layer4.externalSolarReflectance", + "Side": "panel:965af5b3-f250-4492-9467-f988d7831eae@space:5080c000-0000-0000-0000-00000000c0b1", + "Layer": 4, + "LayerCount": 4, + "Property": "externalSolarReflectance", + "SamFace": "external", + "SamMaterial": "FIX_Plasterboard", + "NativeObject": "SAM_OpaqueMaterial_FIX_Plasterboard_12.5mm_Internal_37d096dc", + "SamValue": 0.62, + "NativeValue": 0.6799999999999999, + "Delta": 0.05999999999999994, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 4 of 4, SAM external face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:965af5b3-f250-4492-9467-f988d7831eae@space:5080c000-0000-0000-0000-00000000c0b1#layer4.externalLightReflectance", + "Side": "panel:965af5b3-f250-4492-9467-f988d7831eae@space:5080c000-0000-0000-0000-00000000c0b1", + "Layer": 4, + "LayerCount": 4, + "Property": "externalLightReflectance", + "SamFace": "external", + "SamMaterial": "FIX_Plasterboard", + "NativeObject": "SAM_OpaqueMaterial_FIX_Plasterboard_12.5mm_Internal_37d096dc", + "SamValue": 0.64, + "NativeValue": 0.7, + "Delta": 0.05999999999999994, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 4 of 4, SAM external face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:965af5b3-f250-4492-9467-f988d7831eae@space:5080c000-0000-0000-0000-00000000c0b1#layer4.externalEmissivity", + "Side": "panel:965af5b3-f250-4492-9467-f988d7831eae@space:5080c000-0000-0000-0000-00000000c0b1", + "Layer": 4, + "LayerCount": 4, + "Property": "externalEmissivity", + "SamFace": "external", + "SamMaterial": "FIX_Plasterboard", + "NativeObject": "SAM_OpaqueMaterial_FIX_Plasterboard_12.5mm_Internal_37d096dc", + "SamValue": 0.9, + "NativeValue": 0.91, + "Delta": 0.010000000000000009, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 4 of 4, SAM external face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:d3ef56c6-b1bb-4509-9d4c-ce6aa738f318@space:5080c000-0000-0000-0000-00000000c0b1#layer1.internalSolarReflectance", + "Side": "panel:d3ef56c6-b1bb-4509-9d4c-ce6aa738f318@space:5080c000-0000-0000-0000-00000000c0b1", + "Layer": 1, + "LayerCount": 4, + "Property": "internalSolarReflectance", + "SamFace": "internal", + "SamMaterial": "FIX_Render", + "NativeObject": "SAM_OpaqueMaterial_FIX_Render_15mm_cf8a5937", + "SamValue": 0.36, + "NativeValue": 0.5700000000000001, + "Delta": 0.21000000000000008, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 1 of 4, SAM internal face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:d3ef56c6-b1bb-4509-9d4c-ce6aa738f318@space:5080c000-0000-0000-0000-00000000c0b1#layer1.internalLightReflectance", + "Side": "panel:d3ef56c6-b1bb-4509-9d4c-ce6aa738f318@space:5080c000-0000-0000-0000-00000000c0b1", + "Layer": 1, + "LayerCount": 4, + "Property": "internalLightReflectance", + "SamFace": "internal", + "SamMaterial": "FIX_Render", + "NativeObject": "SAM_OpaqueMaterial_FIX_Render_15mm_cf8a5937", + "SamValue": 0.37, + "NativeValue": 0.5800000000000001, + "Delta": 0.21000000000000008, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 1 of 4, SAM internal face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:d3ef56c6-b1bb-4509-9d4c-ce6aa738f318@space:5080c000-0000-0000-0000-00000000c0b1#layer1.internalEmissivity", + "Side": "panel:d3ef56c6-b1bb-4509-9d4c-ce6aa738f318@space:5080c000-0000-0000-0000-00000000c0b1", + "Layer": 1, + "LayerCount": 4, + "Property": "internalEmissivity", + "SamFace": "internal", + "SamMaterial": "FIX_Render", + "NativeObject": "SAM_OpaqueMaterial_FIX_Render_15mm_cf8a5937", + "SamValue": 0.93, + "NativeValue": 0.88, + "Delta": 0.050000000000000044, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 1 of 4, SAM internal face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:d3ef56c6-b1bb-4509-9d4c-ce6aa738f318@space:5080c000-0000-0000-0000-00000000c0b1#layer2.externalSolarReflectance", + "Side": "panel:d3ef56c6-b1bb-4509-9d4c-ce6aa738f318@space:5080c000-0000-0000-0000-00000000c0b1", + "Layer": 2, + "LayerCount": 4, + "Property": "externalSolarReflectance", + "SamFace": "external", + "SamMaterial": "FIX_Blockwork", + "NativeObject": "SAM_OpaqueMaterial_FIX_Blockwork_100mm_422b4f0d", + "SamValue": 0.38, + "NativeValue": 0.38, + "Delta": 0, + "NumericVerdict": "Identical", + "Differs": false, + "ScopeReason": "buried layer face (layer 2 of 4, SAM external face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:d3ef56c6-b1bb-4509-9d4c-ce6aa738f318@space:5080c000-0000-0000-0000-00000000c0b1#layer2.internalSolarReflectance", + "Side": "panel:d3ef56c6-b1bb-4509-9d4c-ce6aa738f318@space:5080c000-0000-0000-0000-00000000c0b1", + "Layer": 2, + "LayerCount": 4, + "Property": "internalSolarReflectance", + "SamFace": "internal", + "SamMaterial": "FIX_Blockwork", + "NativeObject": "SAM_OpaqueMaterial_FIX_Blockwork_100mm_422b4f0d", + "SamValue": 0.44, + "NativeValue": 0.38, + "Delta": 0.06, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 2 of 4, SAM internal face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:d3ef56c6-b1bb-4509-9d4c-ce6aa738f318@space:5080c000-0000-0000-0000-00000000c0b1#layer2.externalLightReflectance", + "Side": "panel:d3ef56c6-b1bb-4509-9d4c-ce6aa738f318@space:5080c000-0000-0000-0000-00000000c0b1", + "Layer": 2, + "LayerCount": 4, + "Property": "externalLightReflectance", + "SamFace": "external", + "SamMaterial": "FIX_Blockwork", + "NativeObject": "SAM_OpaqueMaterial_FIX_Blockwork_100mm_422b4f0d", + "SamValue": 0.39, + "NativeValue": 0.39, + "Delta": 0, + "NumericVerdict": "Identical", + "Differs": false, + "ScopeReason": "buried layer face (layer 2 of 4, SAM external face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:d3ef56c6-b1bb-4509-9d4c-ce6aa738f318@space:5080c000-0000-0000-0000-00000000c0b1#layer2.internalLightReflectance", + "Side": "panel:d3ef56c6-b1bb-4509-9d4c-ce6aa738f318@space:5080c000-0000-0000-0000-00000000c0b1", + "Layer": 2, + "LayerCount": 4, + "Property": "internalLightReflectance", + "SamFace": "internal", + "SamMaterial": "FIX_Blockwork", + "NativeObject": "SAM_OpaqueMaterial_FIX_Blockwork_100mm_422b4f0d", + "SamValue": 0.46, + "NativeValue": 0.39, + "Delta": 0.07, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 2 of 4, SAM internal face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:d3ef56c6-b1bb-4509-9d4c-ce6aa738f318@space:5080c000-0000-0000-0000-00000000c0b1#layer2.externalEmissivity", + "Side": "panel:d3ef56c6-b1bb-4509-9d4c-ce6aa738f318@space:5080c000-0000-0000-0000-00000000c0b1", + "Layer": 2, + "LayerCount": 4, + "Property": "externalEmissivity", + "SamFace": "external", + "SamMaterial": "FIX_Blockwork", + "NativeObject": "SAM_OpaqueMaterial_FIX_Blockwork_100mm_422b4f0d", + "SamValue": 0.93, + "NativeValue": 0.93, + "Delta": 0, + "NumericVerdict": "Identical", + "Differs": false, + "ScopeReason": "buried layer face (layer 2 of 4, SAM external face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:d3ef56c6-b1bb-4509-9d4c-ce6aa738f318@space:5080c000-0000-0000-0000-00000000c0b1#layer2.internalEmissivity", + "Side": "panel:d3ef56c6-b1bb-4509-9d4c-ce6aa738f318@space:5080c000-0000-0000-0000-00000000c0b1", + "Layer": 2, + "LayerCount": 4, + "Property": "internalEmissivity", + "SamFace": "internal", + "SamMaterial": "FIX_Blockwork", + "NativeObject": "SAM_OpaqueMaterial_FIX_Blockwork_100mm_422b4f0d", + "SamValue": 0.94, + "NativeValue": 0.93, + "Delta": 0.009999999999999898, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 2 of 4, SAM internal face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:d3ef56c6-b1bb-4509-9d4c-ce6aa738f318@space:5080c000-0000-0000-0000-00000000c0b1#layer3.externalSolarReflectance", + "Side": "panel:d3ef56c6-b1bb-4509-9d4c-ce6aa738f318@space:5080c000-0000-0000-0000-00000000c0b1", + "Layer": 3, + "LayerCount": 4, + "Property": "externalSolarReflectance", + "SamFace": "external", + "SamMaterial": "FIX_MineralWool", + "NativeObject": "SAM_OpaqueMaterial_FIX_MineralWool_140mm_340c952a", + "SamValue": 0.48, + "NativeValue": 0.48, + "Delta": 0, + "NumericVerdict": "Identical", + "Differs": false, + "ScopeReason": "buried layer face (layer 3 of 4, SAM external face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:d3ef56c6-b1bb-4509-9d4c-ce6aa738f318@space:5080c000-0000-0000-0000-00000000c0b1#layer3.internalSolarReflectance", + "Side": "panel:d3ef56c6-b1bb-4509-9d4c-ce6aa738f318@space:5080c000-0000-0000-0000-00000000c0b1", + "Layer": 3, + "LayerCount": 4, + "Property": "internalSolarReflectance", + "SamFace": "internal", + "SamMaterial": "FIX_MineralWool", + "NativeObject": "SAM_OpaqueMaterial_FIX_MineralWool_140mm_340c952a", + "SamValue": 0.51, + "NativeValue": 0.48, + "Delta": 0.030000000000000027, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 3 of 4, SAM internal face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:d3ef56c6-b1bb-4509-9d4c-ce6aa738f318@space:5080c000-0000-0000-0000-00000000c0b1#layer3.externalLightReflectance", + "Side": "panel:d3ef56c6-b1bb-4509-9d4c-ce6aa738f318@space:5080c000-0000-0000-0000-00000000c0b1", + "Layer": 3, + "LayerCount": 4, + "Property": "externalLightReflectance", + "SamFace": "external", + "SamMaterial": "FIX_MineralWool", + "NativeObject": "SAM_OpaqueMaterial_FIX_MineralWool_140mm_340c952a", + "SamValue": 0.49, + "NativeValue": 0.49, + "Delta": 0, + "NumericVerdict": "Identical", + "Differs": false, + "ScopeReason": "buried layer face (layer 3 of 4, SAM external face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:d3ef56c6-b1bb-4509-9d4c-ce6aa738f318@space:5080c000-0000-0000-0000-00000000c0b1#layer3.internalLightReflectance", + "Side": "panel:d3ef56c6-b1bb-4509-9d4c-ce6aa738f318@space:5080c000-0000-0000-0000-00000000c0b1", + "Layer": 3, + "LayerCount": 4, + "Property": "internalLightReflectance", + "SamFace": "internal", + "SamMaterial": "FIX_MineralWool", + "NativeObject": "SAM_OpaqueMaterial_FIX_MineralWool_140mm_340c952a", + "SamValue": 0.53, + "NativeValue": 0.49, + "Delta": 0.040000000000000036, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 3 of 4, SAM internal face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:d3ef56c6-b1bb-4509-9d4c-ce6aa738f318@space:5080c000-0000-0000-0000-00000000c0b1#layer3.externalEmissivity", + "Side": "panel:d3ef56c6-b1bb-4509-9d4c-ce6aa738f318@space:5080c000-0000-0000-0000-00000000c0b1", + "Layer": 3, + "LayerCount": 4, + "Property": "externalEmissivity", + "SamFace": "external", + "SamMaterial": "FIX_MineralWool", + "NativeObject": "SAM_OpaqueMaterial_FIX_MineralWool_140mm_340c952a", + "SamValue": 0.89, + "NativeValue": 0.89, + "Delta": 0, + "NumericVerdict": "Identical", + "Differs": false, + "ScopeReason": "buried layer face (layer 3 of 4, SAM external face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:d3ef56c6-b1bb-4509-9d4c-ce6aa738f318@space:5080c000-0000-0000-0000-00000000c0b1#layer3.internalEmissivity", + "Side": "panel:d3ef56c6-b1bb-4509-9d4c-ce6aa738f318@space:5080c000-0000-0000-0000-00000000c0b1", + "Layer": 3, + "LayerCount": 4, + "Property": "internalEmissivity", + "SamFace": "internal", + "SamMaterial": "FIX_MineralWool", + "NativeObject": "SAM_OpaqueMaterial_FIX_MineralWool_140mm_340c952a", + "SamValue": 0.92, + "NativeValue": 0.89, + "Delta": 0.030000000000000027, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 3 of 4, SAM internal face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:d3ef56c6-b1bb-4509-9d4c-ce6aa738f318@space:5080c000-0000-0000-0000-00000000c0b1#layer4.externalSolarReflectance", + "Side": "panel:d3ef56c6-b1bb-4509-9d4c-ce6aa738f318@space:5080c000-0000-0000-0000-00000000c0b1", + "Layer": 4, + "LayerCount": 4, + "Property": "externalSolarReflectance", + "SamFace": "external", + "SamMaterial": "FIX_Plasterboard", + "NativeObject": "SAM_OpaqueMaterial_FIX_Plasterboard_12.5mm_Internal_37d096dc", + "SamValue": 0.62, + "NativeValue": 0.6799999999999999, + "Delta": 0.05999999999999994, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 4 of 4, SAM external face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:d3ef56c6-b1bb-4509-9d4c-ce6aa738f318@space:5080c000-0000-0000-0000-00000000c0b1#layer4.externalLightReflectance", + "Side": "panel:d3ef56c6-b1bb-4509-9d4c-ce6aa738f318@space:5080c000-0000-0000-0000-00000000c0b1", + "Layer": 4, + "LayerCount": 4, + "Property": "externalLightReflectance", + "SamFace": "external", + "SamMaterial": "FIX_Plasterboard", + "NativeObject": "SAM_OpaqueMaterial_FIX_Plasterboard_12.5mm_Internal_37d096dc", + "SamValue": 0.64, + "NativeValue": 0.7, + "Delta": 0.05999999999999994, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 4 of 4, SAM external face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:d3ef56c6-b1bb-4509-9d4c-ce6aa738f318@space:5080c000-0000-0000-0000-00000000c0b1#layer4.externalEmissivity", + "Side": "panel:d3ef56c6-b1bb-4509-9d4c-ce6aa738f318@space:5080c000-0000-0000-0000-00000000c0b1", + "Layer": 4, + "LayerCount": 4, + "Property": "externalEmissivity", + "SamFace": "external", + "SamMaterial": "FIX_Plasterboard", + "NativeObject": "SAM_OpaqueMaterial_FIX_Plasterboard_12.5mm_Internal_37d096dc", + "SamValue": 0.9, + "NativeValue": 0.91, + "Delta": 0.010000000000000009, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 4 of 4, SAM external face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:3134390a-195b-4e61-86bd-6abf63ce6459@space:5080c000-0000-0000-0000-00000000c0b1#layer1.externalSolarReflectance", + "Side": "panel:3134390a-195b-4e61-86bd-6abf63ce6459@space:5080c000-0000-0000-0000-00000000c0b1", + "Layer": 1, + "LayerCount": 4, + "Property": "externalSolarReflectance", + "SamFace": "external", + "SamMaterial": "FIX_Plasterboard", + "NativeObject": "SAM_OpaqueMaterial_FIX_Plasterboard_12.5mm_Internal_37d096dc", + "SamValue": 0.62, + "NativeValue": 0.6799999999999999, + "Delta": 0.05999999999999994, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 1 of 4, SAM external face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:3134390a-195b-4e61-86bd-6abf63ce6459@space:5080c000-0000-0000-0000-00000000c0b1#layer1.internalSolarReflectance", + "Side": "panel:3134390a-195b-4e61-86bd-6abf63ce6459@space:5080c000-0000-0000-0000-00000000c0b1", + "Layer": 1, + "LayerCount": 4, + "Property": "internalSolarReflectance", + "SamFace": "internal", + "SamMaterial": "FIX_Plasterboard", + "NativeObject": "SAM_OpaqueMaterial_FIX_Plasterboard_12.5mm_Internal_37d096dc", + "SamValue": 0.68, + "NativeValue": 0.6799999999999999, + "Delta": 1.1102230246251565E-16, + "NumericVerdict": "WithinTolerance", + "Differs": false, + "ScopeReason": "interzone surface outer face (the partner side\u0027s zone face, gated on that side)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:3134390a-195b-4e61-86bd-6abf63ce6459@space:5080c000-0000-0000-0000-00000000c0b1#layer1.externalLightReflectance", + "Side": "panel:3134390a-195b-4e61-86bd-6abf63ce6459@space:5080c000-0000-0000-0000-00000000c0b1", + "Layer": 1, + "LayerCount": 4, + "Property": "externalLightReflectance", + "SamFace": "external", + "SamMaterial": "FIX_Plasterboard", + "NativeObject": "SAM_OpaqueMaterial_FIX_Plasterboard_12.5mm_Internal_37d096dc", + "SamValue": 0.64, + "NativeValue": 0.7, + "Delta": 0.05999999999999994, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 1 of 4, SAM external face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:3134390a-195b-4e61-86bd-6abf63ce6459@space:5080c000-0000-0000-0000-00000000c0b1#layer1.internalLightReflectance", + "Side": "panel:3134390a-195b-4e61-86bd-6abf63ce6459@space:5080c000-0000-0000-0000-00000000c0b1", + "Layer": 1, + "LayerCount": 4, + "Property": "internalLightReflectance", + "SamFace": "internal", + "SamMaterial": "FIX_Plasterboard", + "NativeObject": "SAM_OpaqueMaterial_FIX_Plasterboard_12.5mm_Internal_37d096dc", + "SamValue": 0.7, + "NativeValue": 0.7, + "Delta": 0, + "NumericVerdict": "Identical", + "Differs": false, + "ScopeReason": "interzone surface outer face (the partner side\u0027s zone face, gated on that side)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:3134390a-195b-4e61-86bd-6abf63ce6459@space:5080c000-0000-0000-0000-00000000c0b1#layer1.externalEmissivity", + "Side": "panel:3134390a-195b-4e61-86bd-6abf63ce6459@space:5080c000-0000-0000-0000-00000000c0b1", + "Layer": 1, + "LayerCount": 4, + "Property": "externalEmissivity", + "SamFace": "external", + "SamMaterial": "FIX_Plasterboard", + "NativeObject": "SAM_OpaqueMaterial_FIX_Plasterboard_12.5mm_Internal_37d096dc", + "SamValue": 0.9, + "NativeValue": 0.91, + "Delta": 0.010000000000000009, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 1 of 4, SAM external face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:3134390a-195b-4e61-86bd-6abf63ce6459@space:5080c000-0000-0000-0000-00000000c0b1#layer1.internalEmissivity", + "Side": "panel:3134390a-195b-4e61-86bd-6abf63ce6459@space:5080c000-0000-0000-0000-00000000c0b1", + "Layer": 1, + "LayerCount": 4, + "Property": "internalEmissivity", + "SamFace": "internal", + "SamMaterial": "FIX_Plasterboard", + "NativeObject": "SAM_OpaqueMaterial_FIX_Plasterboard_12.5mm_Internal_37d096dc", + "SamValue": 0.91, + "NativeValue": 0.91, + "Delta": 0, + "NumericVerdict": "Identical", + "Differs": false, + "ScopeReason": "interzone surface outer face (the partner side\u0027s zone face, gated on that side)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:3134390a-195b-4e61-86bd-6abf63ce6459@space:5080c000-0000-0000-0000-00000000c0b1#layer2.externalSolarReflectance", + "Side": "panel:3134390a-195b-4e61-86bd-6abf63ce6459@space:5080c000-0000-0000-0000-00000000c0b1", + "Layer": 2, + "LayerCount": 4, + "Property": "externalSolarReflectance", + "SamFace": "external", + "SamMaterial": "FIX_MineralWool", + "NativeObject": "SAM_OpaqueMaterial_FIX_MineralWool_50mm_340c952a", + "SamValue": 0.48, + "NativeValue": 0.48, + "Delta": 0, + "NumericVerdict": "Identical", + "Differs": false, + "ScopeReason": "buried layer face (layer 2 of 4, SAM external face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:3134390a-195b-4e61-86bd-6abf63ce6459@space:5080c000-0000-0000-0000-00000000c0b1#layer2.internalSolarReflectance", + "Side": "panel:3134390a-195b-4e61-86bd-6abf63ce6459@space:5080c000-0000-0000-0000-00000000c0b1", + "Layer": 2, + "LayerCount": 4, + "Property": "internalSolarReflectance", + "SamFace": "internal", + "SamMaterial": "FIX_MineralWool", + "NativeObject": "SAM_OpaqueMaterial_FIX_MineralWool_50mm_340c952a", + "SamValue": 0.51, + "NativeValue": 0.48, + "Delta": 0.030000000000000027, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 2 of 4, SAM internal face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:3134390a-195b-4e61-86bd-6abf63ce6459@space:5080c000-0000-0000-0000-00000000c0b1#layer2.externalLightReflectance", + "Side": "panel:3134390a-195b-4e61-86bd-6abf63ce6459@space:5080c000-0000-0000-0000-00000000c0b1", + "Layer": 2, + "LayerCount": 4, + "Property": "externalLightReflectance", + "SamFace": "external", + "SamMaterial": "FIX_MineralWool", + "NativeObject": "SAM_OpaqueMaterial_FIX_MineralWool_50mm_340c952a", + "SamValue": 0.49, + "NativeValue": 0.49, + "Delta": 0, + "NumericVerdict": "Identical", + "Differs": false, + "ScopeReason": "buried layer face (layer 2 of 4, SAM external face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:3134390a-195b-4e61-86bd-6abf63ce6459@space:5080c000-0000-0000-0000-00000000c0b1#layer2.internalLightReflectance", + "Side": "panel:3134390a-195b-4e61-86bd-6abf63ce6459@space:5080c000-0000-0000-0000-00000000c0b1", + "Layer": 2, + "LayerCount": 4, + "Property": "internalLightReflectance", + "SamFace": "internal", + "SamMaterial": "FIX_MineralWool", + "NativeObject": "SAM_OpaqueMaterial_FIX_MineralWool_50mm_340c952a", + "SamValue": 0.53, + "NativeValue": 0.49, + "Delta": 0.040000000000000036, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 2 of 4, SAM internal face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:3134390a-195b-4e61-86bd-6abf63ce6459@space:5080c000-0000-0000-0000-00000000c0b1#layer2.externalEmissivity", + "Side": "panel:3134390a-195b-4e61-86bd-6abf63ce6459@space:5080c000-0000-0000-0000-00000000c0b1", + "Layer": 2, + "LayerCount": 4, + "Property": "externalEmissivity", + "SamFace": "external", + "SamMaterial": "FIX_MineralWool", + "NativeObject": "SAM_OpaqueMaterial_FIX_MineralWool_50mm_340c952a", + "SamValue": 0.89, + "NativeValue": 0.89, + "Delta": 0, + "NumericVerdict": "Identical", + "Differs": false, + "ScopeReason": "buried layer face (layer 2 of 4, SAM external face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:3134390a-195b-4e61-86bd-6abf63ce6459@space:5080c000-0000-0000-0000-00000000c0b1#layer2.internalEmissivity", + "Side": "panel:3134390a-195b-4e61-86bd-6abf63ce6459@space:5080c000-0000-0000-0000-00000000c0b1", + "Layer": 2, + "LayerCount": 4, + "Property": "internalEmissivity", + "SamFace": "internal", + "SamMaterial": "FIX_MineralWool", + "NativeObject": "SAM_OpaqueMaterial_FIX_MineralWool_50mm_340c952a", + "SamValue": 0.92, + "NativeValue": 0.89, + "Delta": 0.030000000000000027, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 2 of 4, SAM internal face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:3134390a-195b-4e61-86bd-6abf63ce6459@space:5080c000-0000-0000-0000-00000000c0b1#layer3.externalSolarReflectance", + "Side": "panel:3134390a-195b-4e61-86bd-6abf63ce6459@space:5080c000-0000-0000-0000-00000000c0b1", + "Layer": 3, + "LayerCount": 4, + "Property": "externalSolarReflectance", + "SamFace": "external", + "SamMaterial": "FIX_Stud", + "NativeObject": "SAM_OpaqueMaterial_FIX_Stud_22mm_8642cc5f", + "SamValue": 0.66, + "NativeValue": 0.6599999999999999, + "Delta": 1.1102230246251565E-16, + "NumericVerdict": "WithinTolerance", + "Differs": false, + "ScopeReason": "buried layer face (layer 3 of 4, SAM external face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:3134390a-195b-4e61-86bd-6abf63ce6459@space:5080c000-0000-0000-0000-00000000c0b1#layer3.internalSolarReflectance", + "Side": "panel:3134390a-195b-4e61-86bd-6abf63ce6459@space:5080c000-0000-0000-0000-00000000c0b1", + "Layer": 3, + "LayerCount": 4, + "Property": "internalSolarReflectance", + "SamFace": "internal", + "SamMaterial": "FIX_Stud", + "NativeObject": "SAM_OpaqueMaterial_FIX_Stud_22mm_8642cc5f", + "SamValue": 0.64, + "NativeValue": 0.6599999999999999, + "Delta": 0.019999999999999907, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 3 of 4, SAM internal face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:3134390a-195b-4e61-86bd-6abf63ce6459@space:5080c000-0000-0000-0000-00000000c0b1#layer3.externalLightReflectance", + "Side": "panel:3134390a-195b-4e61-86bd-6abf63ce6459@space:5080c000-0000-0000-0000-00000000c0b1", + "Layer": 3, + "LayerCount": 4, + "Property": "externalLightReflectance", + "SamFace": "external", + "SamMaterial": "FIX_Stud", + "NativeObject": "SAM_OpaqueMaterial_FIX_Stud_22mm_8642cc5f", + "SamValue": 0.67, + "NativeValue": 0.6699999999999999, + "Delta": 1.1102230246251565E-16, + "NumericVerdict": "WithinTolerance", + "Differs": false, + "ScopeReason": "buried layer face (layer 3 of 4, SAM external face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:3134390a-195b-4e61-86bd-6abf63ce6459@space:5080c000-0000-0000-0000-00000000c0b1#layer3.internalLightReflectance", + "Side": "panel:3134390a-195b-4e61-86bd-6abf63ce6459@space:5080c000-0000-0000-0000-00000000c0b1", + "Layer": 3, + "LayerCount": 4, + "Property": "internalLightReflectance", + "SamFace": "internal", + "SamMaterial": "FIX_Stud", + "NativeObject": "SAM_OpaqueMaterial_FIX_Stud_22mm_8642cc5f", + "SamValue": 0.65, + "NativeValue": 0.6699999999999999, + "Delta": 0.019999999999999907, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 3 of 4, SAM internal face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:3134390a-195b-4e61-86bd-6abf63ce6459@space:5080c000-0000-0000-0000-00000000c0b1#layer3.externalEmissivity", + "Side": "panel:3134390a-195b-4e61-86bd-6abf63ce6459@space:5080c000-0000-0000-0000-00000000c0b1", + "Layer": 3, + "LayerCount": 4, + "Property": "externalEmissivity", + "SamFace": "external", + "SamMaterial": "FIX_Stud", + "NativeObject": "SAM_OpaqueMaterial_FIX_Stud_22mm_8642cc5f", + "SamValue": 0.84, + "NativeValue": 0.84, + "Delta": 0, + "NumericVerdict": "Identical", + "Differs": false, + "ScopeReason": "buried layer face (layer 3 of 4, SAM external face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:3134390a-195b-4e61-86bd-6abf63ce6459@space:5080c000-0000-0000-0000-00000000c0b1#layer3.internalEmissivity", + "Side": "panel:3134390a-195b-4e61-86bd-6abf63ce6459@space:5080c000-0000-0000-0000-00000000c0b1", + "Layer": 3, + "LayerCount": 4, + "Property": "internalEmissivity", + "SamFace": "internal", + "SamMaterial": "FIX_Stud", + "NativeObject": "SAM_OpaqueMaterial_FIX_Stud_22mm_8642cc5f", + "SamValue": 0.83, + "NativeValue": 0.84, + "Delta": 0.010000000000000009, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 3 of 4, SAM internal face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:3134390a-195b-4e61-86bd-6abf63ce6459@space:5080c000-0000-0000-0000-00000000c0b1#layer4.internalSolarReflectance", + "Side": "panel:3134390a-195b-4e61-86bd-6abf63ce6459@space:5080c000-0000-0000-0000-00000000c0b1", + "Layer": 4, + "LayerCount": 4, + "Property": "internalSolarReflectance", + "SamFace": "internal", + "SamMaterial": "FIX_Timber", + "NativeObject": "SAM_OpaqueMaterial_FIX_Timber_15mm_d773dfae", + "SamValue": 0.39, + "NativeValue": 0.41000000000000003, + "Delta": 0.020000000000000018, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 4 of 4, SAM internal face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:3134390a-195b-4e61-86bd-6abf63ce6459@space:5080c000-0000-0000-0000-00000000c0b1#layer4.internalLightReflectance", + "Side": "panel:3134390a-195b-4e61-86bd-6abf63ce6459@space:5080c000-0000-0000-0000-00000000c0b1", + "Layer": 4, + "LayerCount": 4, + "Property": "internalLightReflectance", + "SamFace": "internal", + "SamMaterial": "FIX_Timber", + "NativeObject": "SAM_OpaqueMaterial_FIX_Timber_15mm_d773dfae", + "SamValue": 0.38, + "NativeValue": 0.4, + "Delta": 0.020000000000000018, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 4 of 4, SAM internal face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + }, + { + "Quantity": "3a", + "Key": "panel:3134390a-195b-4e61-86bd-6abf63ce6459@space:5080c000-0000-0000-0000-00000000c0b1#layer4.internalEmissivity", + "Side": "panel:3134390a-195b-4e61-86bd-6abf63ce6459@space:5080c000-0000-0000-0000-00000000c0b1", + "Layer": 4, + "LayerCount": 4, + "Property": "internalEmissivity", + "SamFace": "internal", + "SamMaterial": "FIX_Timber", + "NativeObject": "SAM_OpaqueMaterial_FIX_Timber_15mm_d773dfae", + "SamValue": 0.88, + "NativeValue": 0.86, + "Delta": 0.020000000000000018, + "NumericVerdict": "OutsideTolerance", + "Differs": true, + "ScopeReason": "buried layer face (layer 4 of 4, SAM internal face)", + "Amendment": "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c)" + } + ] + }, + "OwnerDecisionsNamed": [], + "TechnicalBlockersNamed": [], + "Consistency": [], + "Unsupported": [], + "FixtureCriteria": [], + "VentilationStates": { + "space:5080c000-0000-0000-0000-00000000c0a1": "V1", + "space:5080c000-0000-0000-0000-00000000c0b1": "V1" + }, + "Series": [ + { + "Key": "space:5080c000-0000-0000-0000-00000000c0a1.ic.schedule.occupancy", + "QuantityId": "6.hourly", + "Count": 8760, + "NotPass": 0, + "Status": "Pass", + "Outcome": "Match", + "FirstNotPass": null + }, + { + "Key": "space:5080c000-0000-0000-0000-00000000c0a1.ic.schedule.lighting", + "QuantityId": "6.hourly", + "Count": 8760, + "NotPass": 0, + "Status": "Pass", + "Outcome": "Match", + "FirstNotPass": null + }, + { + "Key": "space:5080c000-0000-0000-0000-00000000c0a1.ic.schedule.equipmentSensible", + "QuantityId": "6.hourly", + "Count": 8760, + "NotPass": 0, + "Status": "Pass", + "Outcome": "Match", + "FirstNotPass": null + }, + { + "Key": "space:5080c000-0000-0000-0000-00000000c0a1.ic.schedule.equipmentLatent", + "QuantityId": "6.hourly", + "Count": 8760, + "NotPass": 0, + "Status": "Pass", + "Outcome": "Match", + "FirstNotPass": null + }, + { + "Key": "space:5080c000-0000-0000-0000-00000000c0a1.ic.schedule.infiltration", + "QuantityId": "6.hourly", + "Count": 8760, + "NotPass": 0, + "Status": "Pass", + "Outcome": "Match", + "FirstNotPass": null + }, + { + "Key": "space:5080c000-0000-0000-0000-00000000c0a1.ic.heating", + "QuantityId": "5.temperature", + "Count": 8760, + "NotPass": 0, + "Status": "Pass", + "Outcome": "Match", + "FirstNotPass": null + }, + { + "Key": "space:5080c000-0000-0000-0000-00000000c0a1.ic.cooling", + "QuantityId": "5.temperature", + "Count": 8760, + "NotPass": 0, + "Status": "Pass", + "Outcome": "Match", + "FirstNotPass": null + }, + { + "Key": "space:5080c000-0000-0000-0000-00000000c0a1.ic.humidification", + "QuantityId": "5.humidity", + "Count": 8760, + "NotPass": 0, + "Status": "Pass", + "Outcome": "Match", + "FirstNotPass": null + }, + { + "Key": "space:5080c000-0000-0000-0000-00000000c0a1.ic.dehumidification", + "QuantityId": "5.humidity", + "Count": 8760, + "NotPass": 0, + "Status": "Pass", + "Outcome": "Match", + "FirstNotPass": null + }, + { + "Key": "space:5080c000-0000-0000-0000-00000000c0a1.ic.ventilation.delivered", + "QuantityId": "8b", + "Count": 8760, + "NotPass": 0, + "Status": "Pass", + "Outcome": "AcceptedTransformation", + "FirstNotPass": null + }, + { + "Key": "space:5080c000-0000-0000-0000-00000000c0a1.ic.schedule.ventilation", + "QuantityId": "6.hourly", + "Count": 8760, + "NotPass": 0, + "Status": "Pass", + "Outcome": "AcceptedTransformation", + "FirstNotPass": null + }, + { + "Key": "space:5080c000-0000-0000-0000-00000000c0b1.ic.schedule.occupancy", + "QuantityId": "6.hourly", + "Count": 8760, + "NotPass": 0, + "Status": "Pass", + "Outcome": "Match", + "FirstNotPass": null + }, + { + "Key": "space:5080c000-0000-0000-0000-00000000c0b1.ic.schedule.lighting", + "QuantityId": "6.hourly", + "Count": 8760, + "NotPass": 0, + "Status": "Pass", + "Outcome": "Match", + "FirstNotPass": null + }, + { + "Key": "space:5080c000-0000-0000-0000-00000000c0b1.ic.schedule.equipmentSensible", + "QuantityId": "6.hourly", + "Count": 8760, + "NotPass": 0, + "Status": "Pass", + "Outcome": "Match", + "FirstNotPass": null + }, + { + "Key": "space:5080c000-0000-0000-0000-00000000c0b1.ic.schedule.equipmentLatent", + "QuantityId": "6.hourly", + "Count": 8760, + "NotPass": 0, + "Status": "Pass", + "Outcome": "Match", + "FirstNotPass": null + }, + { + "Key": "space:5080c000-0000-0000-0000-00000000c0b1.ic.schedule.infiltration", + "QuantityId": "6.hourly", + "Count": 8760, + "NotPass": 0, + "Status": "Pass", + "Outcome": "Match", + "FirstNotPass": null + }, + { + "Key": "space:5080c000-0000-0000-0000-00000000c0b1.ic.heating", + "QuantityId": "5.temperature", + "Count": 8760, + "NotPass": 0, + "Status": "Pass", + "Outcome": "Match", + "FirstNotPass": null + }, + { + "Key": "space:5080c000-0000-0000-0000-00000000c0b1.ic.cooling", + "QuantityId": "5.temperature", + "Count": 8760, + "NotPass": 0, + "Status": "Pass", + "Outcome": "Match", + "FirstNotPass": null + }, + { + "Key": "space:5080c000-0000-0000-0000-00000000c0b1.ic.humidification", + "QuantityId": "5.humidity", + "Count": 8760, + "NotPass": 0, + "Status": "Pass", + "Outcome": "Match", + "FirstNotPass": null + }, + { + "Key": "space:5080c000-0000-0000-0000-00000000c0b1.ic.dehumidification", + "QuantityId": "5.humidity", + "Count": 8760, + "NotPass": 0, + "Status": "Pass", + "Outcome": "Match", + "FirstNotPass": null + }, + { + "Key": "space:5080c000-0000-0000-0000-00000000c0b1.ic.ventilation.delivered", + "QuantityId": "8b", + "Count": 8760, + "NotPass": 0, + "Status": "Pass", + "Outcome": "AcceptedTransformation", + "FirstNotPass": null + }, + { + "Key": "space:5080c000-0000-0000-0000-00000000c0b1.ic.schedule.ventilation", + "QuantityId": "6.hourly", + "Count": 8760, + "NotPass": 0, + "Status": "Pass", + "Outcome": "AcceptedTransformation", + "FirstNotPass": null + } + ], + "Supporting": [ + "calendar: one non-leap run year 1/1-12/31 (IDF RunPeriod begin year 2006), EPW 8760 rows; hour index 0 = 1 January 00:00-01:00. Each schedule\u0027s own hour labels are checked separately.", + "orientation: SAM North Angle unstated (writer default 0); Coordinate System Relative; IDF Building North Axis blank (EnergyPlus default 0): the native building is unrotated, as SAM states", + "multiplicity: 2 IDF zone(s) (2 with their OS:ThermalZone), 0 ZoneGroup(s), 1 IDF subsurface(s) (1 with their OS:SubSurface) read; blank multipliers are the EnergyPlus default 1; every effective multiplier is 1, as SAM states", + "space:5080c000-0000-0000-0000-00000000c0a1 \u0027FixA\u0027 = native space \u0027SAM_Space_FixA_5080c000\u0027 by geometry (6 surfaces one to one); name carrier agrees", + "space:5080c000-0000-0000-0000-00000000c0a1: native signed shell volume 74.115 m3 (positive = outward-facing surfaces)", + "space:5080c000-0000-0000-0000-00000000c0a1: D-F9 stored volume 74.115 m3 vs geometric 74.115 m3: Identical", + "aperture:d4b4d4bb-4372-4191-abc6-ecf6a78db87b@space:5080c000-0000-0000-0000-00000000c0a1: native subsurface \u0027SAM_SubSurface_FIX_WIN_FRAMED_0_d4b4d4bb\u0027 with frame \u0027SAM_SubSurface_FIX_WIN_FRAMED_0_d4b4d4bb_FrameAndDivider\u0027, identity Verified", + "aperture:d4b4d4bb-4372-4191-abc6-ecf6a78db87b@space:5080c000-0000-0000-0000-00000000c0a1: native frame width 0.065 m; SAM T-FRAME OpenStudio rule: DefaultFrameWidth, else the frame layer thickness (pane = face offset inwards by 0.065 m)", + "space:5080c000-0000-0000-0000-00000000c0a1: D-F2 V1; selection none; requirement Value(0.03058)", + "Ideal Loads \u0027SAM_IdealLoads_FixA_5080c000\u0027: DCV \u0027None\u0027, economizer \u0027NoEconomizer\u0027, heat recovery \u0027None\u0027, availability \u0027\u0027", + "space:5080c000-0000-0000-0000-00000000c0a1: OSM DSOA \u0027SAM_InternalCondition_FIX_IC_A_6c498580_DesignSpecificationOutdoorAir\u0027 inherited from SpaceType \u0027SAM_InternalCondition_FIX_IC_A_6c498580\u0027; IDF Ideal Loads names \u0027SAM_InternalCondition_FIX_IC_A_6c498580_DesignSpecificationOutdoorAir\u0027", + "space:5080c000-0000-0000-0000-00000000c0a1: T-VENT-INACTIVE applied (requirement kept, all 8760 schedule values and delivered flows exactly 0 in both views)", + "space:5080c000-0000-0000-0000-00000000c0b1 \u0027FixB\u0027 = native space \u0027SAM_Space_FixB_5080c000\u0027 by geometry (6 surfaces one to one); name carrier agrees", + "space:5080c000-0000-0000-0000-00000000c0b1: native signed shell volume 59.29199999999999 m3 (positive = outward-facing surfaces)", + "space:5080c000-0000-0000-0000-00000000c0b1: D-F9 stored volume 59.29199999999999 m3 vs geometric 59.29200000000002 m3: WithinTolerance", + "space:5080c000-0000-0000-0000-00000000c0b1: D-F2 V1; selection none; requirement Value(0.012352500000000004)", + "Ideal Loads \u0027SAM_IdealLoads_FixB_5080c000\u0027: DCV \u0027None\u0027, economizer \u0027NoEconomizer\u0027, heat recovery \u0027None\u0027, availability \u0027\u0027", + "space:5080c000-0000-0000-0000-00000000c0b1: OSM DSOA \u0027SAM_InternalCondition_FIX_IC_B_e9a6ea38_DesignSpecificationOutdoorAir\u0027 inherited from SpaceType \u0027SAM_InternalCondition_FIX_IC_B_e9a6ea38\u0027; IDF Ideal Loads names \u0027SAM_InternalCondition_FIX_IC_B_e9a6ea38_DesignSpecificationOutdoorAir\u0027", + "space:5080c000-0000-0000-0000-00000000c0b1: T-VENT-INACTIVE applied (requirement kept, all 8760 schedule values and delivered flows exactly 0 in both views)", + "weather: run EPW sha256 472ffb4e2f10867600949a392ce46891fc1bd05f2fc8d8917a99bca7d26209c3; the OSM references a file with sha256 472ffb4e2f10867600949a392ce46891fc1bd05f2fc8d8917a99bca7d26209c3", + "weather: Site:GroundTemperature:BuildingSurface 4.58, 1.15, 0.22, 1.03, 5.66, 10.85, 15.73, 19.27, 20.3, 18.64, 14.64, 9.6 (9.ground, not gated)", + "design days: SAM states 0 (none); the IDF has 0 sizing period(s)", + "S07 \u00A75.2 amendment U1 (SAM#218 b06dbe8c): 216 row-3a opaque optical row(s) on faces EnergyPlus 25.1 does not use are OUT-OF-ENGINE-SCOPE (informational, not gated): 138 differ from the native value, 78 equal it. Each holds a valid authored value and a valid native value on a face whose role S09 derived from SAM, the side and the native boundary. Every used face (each innermost layer\u0027s zone face, each outdoor outermost face), every thickness, conductivity, density and specific heat, and every row that is not valid and comparable is gated." + ], + "Inputs": { + "label": "two", + "modelSha256": "20da9b586345e9fc67dc6308e6da1578b9bc41b3c694dbdab37e9c677959baa0", + "epwSha256": "472ffb4e2f10867600949a392ce46891fc1bd05f2fc8d8917a99bca7d26209c3", + "osmSha256": "4e0d970d55848dd2e6f0153335111ca076d238dd25e30cccdc518b2db2aac70a", + "idfSha256": "010327464aef2237fa2f3220c97415992ab237de2c0c4628c46137e901fef176", + "openStudioSdk": "3.10.0\u002B86d7e215a1", + "writerSha256": "67a2ded78a22c9b83f5b536dc7b202314a686fe8c7718119afb676714a84e798", + "readerSha256": "d2368ce851b869138b386697e4ef3c9e74b2cb86ef80077133172378517ed4a5", + "exportPid": "48144", + "readerPid": "24468", + "comparePid": "31756", + "exportProcessStartedUtc": "2026-10-23T11:27:05.5340609Z", + "readerProcessStartedUtc": "2026-10-23T11:27:09.8326135Z", + "compareProcessStartedUtc": "2026-10-23T11:27:10.3770842Z", + "mutation": null, + "writerDiagnostics": "Information SAM-OS-IC-002 Lighting radiant proportion p = 0.34 (authored) is split under S07 \u00A75.1 T-LIGHT-SPLIT: Fraction Radiant = p\u00B7(1 \u2212 s) = 0.197448, Fraction Visible = p\u00B7s = 0.142552, Return Air Fraction 0, convective 1 \u2212 p = 0.66; s = 0.2415 / 0.576 = 0.4192708 (short-wave share of the radiant output). s is a declared assumption, not SAM data. Reference category: suspended (pendant) LED office lighting with the entire fitting in the conditioned room; a midpoint-derived reference from cited historical ranges (IEA SHC Task 61 / EBC Annex 77 D1, Table 6; ASHRAE Fundamentals 2017, Ch. 18, Table 3), not manufacturer-certified. Not applicable to recessed troffers, downlights, retrofit kits, high-bays or non-LED lamps. | Information SAM-OS-HVAC-001 No Ventilation profile is selected: the outdoor-air requirement is kept and no outdoor air is delivered (S07 D-F2 V1) | Information SAM-OS-IC-002 Lighting radiant proportion p = 0.41 (authored) is split under S07 \u00A75.1 T-LIGHT-SPLIT: Fraction Radiant = p\u00B7(1 \u2212 s) = 0.238099, Fraction Visible = p\u00B7s = 0.171901, Return Air Fraction 0, convective 1 \u2212 p = 0.59; s = 0.2415 / 0.576 = 0.4192708 (short-wave share of the radiant output). s is a declared assumption, not SAM data. Reference category: suspended (pendant) LED office lighting with the entire fitting in the conditioned room; a midpoint-derived reference from cited historical ranges (IEA SHC Task 61 / EBC Annex 77 D1, Table 6; ASHRAE Fundamentals 2017, Ch. 18, Table 3), not manufacturer-certified. Not applicable to recessed troffers, downlights, retrofit kits, high-bays or non-LED lamps. | Information SAM-OS-HVAC-001 No Ventilation profile is selected: the outdoor-air requirement is kept and no outdoor air is delivered (S07 D-F2 V1) | Information SAM-OS-RUN-002 Annual weather source: explicit EPW (weather.epw) | Information SAM-OS-RUN-002 Ground temperatures taken from the EPW GROUND TEMPERATURES header (depth 0.5 m set, 12 monthly values) | Information SAM-OS-RUN-002 No design-day source supplied; sizing-period runs stay disabled unless OpenStudioConversionOptions.RunSizingPeriods overrides", + "translatorMessages": "0" + } +} \ No newline at end of file diff --git a/documentation/S09-OpenStudio-InputReadBack-evidence/acceptance-2026-10-23/runs/two/report-approved.txt b/documentation/S09-OpenStudio-InputReadBack-evidence/acceptance-2026-10-23/runs/two/report-approved.txt new file mode 100644 index 0000000..6e84769 --- /dev/null +++ b/documentation/S09-OpenStudio-InputReadBack-evidence/acceptance-2026-10-23/runs/two/report-approved.txt @@ -0,0 +1,18 @@ +S09 OpenStudio read-back: s08-fix-two -> Pass (exit 0); rule set Approved; gate Pass; coverage Complete (592 required, 592 results); gated non-PASS 0; out-of-engine-scope 216 (informational, not gated) +outcomes: AcceptedTransformation 14, Match 319, NotApplicable 1, OutOfEngineScope 216, WithinTolerance 42 +D-F2 space:5080c000-0000-0000-0000-00000000c0a1: V1 +D-F2 space:5080c000-0000-0000-0000-00000000c0b1: V1 +OUT-OF-ENGINE-SCOPE (informational, not gated; S07 §5.2 amendment U1 (SAM#218 b06dbe8c)): 216 row(s), 138 differing, 78 equal; by scope: buried layer face 204, ground surface outer face 6, interzone surface outer face 6; by property: externalEmissivity 37, externalLightReflectance 37, externalSolarReflectance 37, internalEmissivity 35, internalLightReflectance 35, internalSolarReflectance 35 + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer1.externalSolarReflectance: SAM 0.31, native 0.31000000000000005, |d| 5.551115123125783E-17 (WithinTolerance); ground surface outer face; SAM 'FIX_Concrete', native 'SAM_OpaqueMaterial_FIX_Concrete_150mm_b313ccd6' + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer1.internalSolarReflectance: SAM 0.29, native 0.31000000000000005, |d| 0.020000000000000073 (OutsideTolerance); buried layer face (layer 1 of 3, SAM internal face); SAM 'FIX_Concrete', native 'SAM_OpaqueMaterial_FIX_Concrete_150mm_b313ccd6' + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer1.externalLightReflectance: SAM 0.32, native 0.31999999999999995, |d| 5.551115123125783E-17 (WithinTolerance); ground surface outer face; SAM 'FIX_Concrete', native 'SAM_OpaqueMaterial_FIX_Concrete_150mm_b313ccd6' + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer1.internalLightReflectance: SAM 0.3, native 0.31999999999999995, |d| 0.019999999999999962 (OutsideTolerance); buried layer face (layer 1 of 3, SAM internal face); SAM 'FIX_Concrete', native 'SAM_OpaqueMaterial_FIX_Concrete_150mm_b313ccd6' + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer1.externalEmissivity: SAM 0.95, native 0.95, |d| 0 (Identical); ground surface outer face; SAM 'FIX_Concrete', native 'SAM_OpaqueMaterial_FIX_Concrete_150mm_b313ccd6' + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer1.internalEmissivity: SAM 0.87, native 0.95, |d| 0.07999999999999996 (OutsideTolerance); buried layer face (layer 1 of 3, SAM internal face); SAM 'FIX_Concrete', native 'SAM_OpaqueMaterial_FIX_Concrete_150mm_b313ccd6' + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer2.externalSolarReflectance: SAM 0.58, native 0.5800000000000001, |d| 1.1102230246251565E-16 (WithinTolerance); buried layer face (layer 2 of 3, SAM external face); SAM 'FIX_EPS', native 'SAM_OpaqueMaterial_FIX_EPS_120mm_c3cb21c2' + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer2.internalSolarReflectance: SAM 0.61, native 0.5800000000000001, |d| 0.029999999999999916 (OutsideTolerance); buried layer face (layer 2 of 3, SAM internal face); SAM 'FIX_EPS', native 'SAM_OpaqueMaterial_FIX_EPS_120mm_c3cb21c2' + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer2.externalLightReflectance: SAM 0.59, native 0.5900000000000001, |d| 1.1102230246251565E-16 (WithinTolerance); buried layer face (layer 2 of 3, SAM external face); SAM 'FIX_EPS', native 'SAM_OpaqueMaterial_FIX_EPS_120mm_c3cb21c2' + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer2.internalLightReflectance: SAM 0.63, native 0.5900000000000001, |d| 0.039999999999999925 (OutsideTolerance); buried layer face (layer 2 of 3, SAM internal face); SAM 'FIX_EPS', native 'SAM_OpaqueMaterial_FIX_EPS_120mm_c3cb21c2' + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer2.externalEmissivity: SAM 0.85, native 0.85, |d| 0 (Identical); buried layer face (layer 2 of 3, SAM external face); SAM 'FIX_EPS', native 'SAM_OpaqueMaterial_FIX_EPS_120mm_c3cb21c2' + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer2.internalEmissivity: SAM 0.96, native 0.85, |d| 0.10999999999999999 (OutsideTolerance); buried layer face (layer 2 of 3, SAM internal face); SAM 'FIX_EPS', native 'SAM_OpaqueMaterial_FIX_EPS_120mm_c3cb21c2' + ... 204 more in report.json diff --git a/documentation/S09-OpenStudio-InputReadBack-evidence/acceptance-2026-10-23/runs/two/report-provisional.txt b/documentation/S09-OpenStudio-InputReadBack-evidence/acceptance-2026-10-23/runs/two/report-provisional.txt new file mode 100644 index 0000000..14dc7bb --- /dev/null +++ b/documentation/S09-OpenStudio-InputReadBack-evidence/acceptance-2026-10-23/runs/two/report-provisional.txt @@ -0,0 +1,25 @@ +S09 OpenStudio read-back: s08-fix-two -> BlockedOwnerDecision (exit 12); rule set ProvisionalProposed; gate BlockedOwnerDecision; coverage Complete (592 required, 592 results); gated non-PASS 6; out-of-engine-scope 216 (informational, not gated) +outcomes: AcceptedTransformation 8, Match 319, NotApplicable 1, OutOfEngineScope 216, UnlistedDefault 6, WithinTolerance 42 +D-F2 space:5080c000-0000-0000-0000-00000000c0a1: V1 +D-F2 space:5080c000-0000-0000-0000-00000000c0b1: V1 +NOT PASS UnlistedDefault / BlockedOwnerDecision: 6 + 8b space:5080c000-0000-0000-0000-00000000c0a1.ic.ventilation.delivered: SAM states no value and the native object is present with the value 0; zero does not mean absence, and it is not the contract-listed default. Proposed rule G1 (S-UNSPEC, native zero, UNLISTED-DEFAULT); OD-G1 is not approved, so the result is at best BLOCKED. [decisive element space:5080c000-0000-0000-0000-00000000c0a1.ic.ventilation.delivered[0] of 8760] + 6.hourly space:5080c000-0000-0000-0000-00000000c0a1.ic.schedule.ventilation: SAM states no value and the native object is present with the value 0; zero does not mean absence, and it is not the contract-listed default. Proposed rule G1 (S-UNSPEC, native zero, UNLISTED-DEFAULT); OD-G1 is not approved, so the result is at best BLOCKED. [decisive element space:5080c000-0000-0000-0000-00000000c0a1.ic.schedule.ventilation[0] of 8760] + 6.eflh space:5080c000-0000-0000-0000-00000000c0a1.ic.schedule.ventilation: SAM states no value and the native object is present with the value 0; zero does not mean absence, and it is not the contract-listed default. Proposed rule G1 (S-UNSPEC, native zero, UNLISTED-DEFAULT); OD-G1 is not approved, so the result is at best BLOCKED. + 8b space:5080c000-0000-0000-0000-00000000c0b1.ic.ventilation.delivered: SAM states no value and the native object is present with the value 0; zero does not mean absence, and it is not the contract-listed default. Proposed rule G1 (S-UNSPEC, native zero, UNLISTED-DEFAULT); OD-G1 is not approved, so the result is at best BLOCKED. [decisive element space:5080c000-0000-0000-0000-00000000c0b1.ic.ventilation.delivered[0] of 8760] + 6.hourly space:5080c000-0000-0000-0000-00000000c0b1.ic.schedule.ventilation: SAM states no value and the native object is present with the value 0; zero does not mean absence, and it is not the contract-listed default. Proposed rule G1 (S-UNSPEC, native zero, UNLISTED-DEFAULT); OD-G1 is not approved, so the result is at best BLOCKED. [decisive element space:5080c000-0000-0000-0000-00000000c0b1.ic.schedule.ventilation[0] of 8760] + 6.eflh space:5080c000-0000-0000-0000-00000000c0b1.ic.schedule.ventilation: SAM states no value and the native object is present with the value 0; zero does not mean absence, and it is not the contract-listed default. Proposed rule G1 (S-UNSPEC, native zero, UNLISTED-DEFAULT); OD-G1 is not approved, so the result is at best BLOCKED. +OUT-OF-ENGINE-SCOPE (informational, not gated; S07 §5.2 amendment U1 (SAM#218 b06dbe8c)): 216 row(s), 138 differing, 78 equal; by scope: buried layer face 204, ground surface outer face 6, interzone surface outer face 6; by property: externalEmissivity 37, externalLightReflectance 37, externalSolarReflectance 37, internalEmissivity 35, internalLightReflectance 35, internalSolarReflectance 35 + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer1.externalSolarReflectance: SAM 0.31, native 0.31000000000000005, |d| 5.551115123125783E-17 (WithinTolerance); ground surface outer face; SAM 'FIX_Concrete', native 'SAM_OpaqueMaterial_FIX_Concrete_150mm_b313ccd6' + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer1.internalSolarReflectance: SAM 0.29, native 0.31000000000000005, |d| 0.020000000000000073 (OutsideTolerance); buried layer face (layer 1 of 3, SAM internal face); SAM 'FIX_Concrete', native 'SAM_OpaqueMaterial_FIX_Concrete_150mm_b313ccd6' + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer1.externalLightReflectance: SAM 0.32, native 0.31999999999999995, |d| 5.551115123125783E-17 (WithinTolerance); ground surface outer face; SAM 'FIX_Concrete', native 'SAM_OpaqueMaterial_FIX_Concrete_150mm_b313ccd6' + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer1.internalLightReflectance: SAM 0.3, native 0.31999999999999995, |d| 0.019999999999999962 (OutsideTolerance); buried layer face (layer 1 of 3, SAM internal face); SAM 'FIX_Concrete', native 'SAM_OpaqueMaterial_FIX_Concrete_150mm_b313ccd6' + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer1.externalEmissivity: SAM 0.95, native 0.95, |d| 0 (Identical); ground surface outer face; SAM 'FIX_Concrete', native 'SAM_OpaqueMaterial_FIX_Concrete_150mm_b313ccd6' + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer1.internalEmissivity: SAM 0.87, native 0.95, |d| 0.07999999999999996 (OutsideTolerance); buried layer face (layer 1 of 3, SAM internal face); SAM 'FIX_Concrete', native 'SAM_OpaqueMaterial_FIX_Concrete_150mm_b313ccd6' + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer2.externalSolarReflectance: SAM 0.58, native 0.5800000000000001, |d| 1.1102230246251565E-16 (WithinTolerance); buried layer face (layer 2 of 3, SAM external face); SAM 'FIX_EPS', native 'SAM_OpaqueMaterial_FIX_EPS_120mm_c3cb21c2' + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer2.internalSolarReflectance: SAM 0.61, native 0.5800000000000001, |d| 0.029999999999999916 (OutsideTolerance); buried layer face (layer 2 of 3, SAM internal face); SAM 'FIX_EPS', native 'SAM_OpaqueMaterial_FIX_EPS_120mm_c3cb21c2' + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer2.externalLightReflectance: SAM 0.59, native 0.5900000000000001, |d| 1.1102230246251565E-16 (WithinTolerance); buried layer face (layer 2 of 3, SAM external face); SAM 'FIX_EPS', native 'SAM_OpaqueMaterial_FIX_EPS_120mm_c3cb21c2' + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer2.internalLightReflectance: SAM 0.63, native 0.5900000000000001, |d| 0.039999999999999925 (OutsideTolerance); buried layer face (layer 2 of 3, SAM internal face); SAM 'FIX_EPS', native 'SAM_OpaqueMaterial_FIX_EPS_120mm_c3cb21c2' + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer2.externalEmissivity: SAM 0.85, native 0.85, |d| 0 (Identical); buried layer face (layer 2 of 3, SAM external face); SAM 'FIX_EPS', native 'SAM_OpaqueMaterial_FIX_EPS_120mm_c3cb21c2' + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer2.internalEmissivity: SAM 0.96, native 0.85, |d| 0.10999999999999999 (OutsideTolerance); buried layer face (layer 2 of 3, SAM internal face); SAM 'FIX_EPS', native 'SAM_OpaqueMaterial_FIX_EPS_120mm_c3cb21c2' + ... 204 more in report.json diff --git a/documentation/S09-OpenStudio-InputReadBack-evidence/acceptance-2026-10-23/summary-acceptance-negative.json b/documentation/S09-OpenStudio-InputReadBack-evidence/acceptance-2026-10-23/summary-acceptance-negative.json new file mode 100644 index 0000000..69feca1 --- /dev/null +++ b/documentation/S09-OpenStudio-InputReadBack-evidence/acceptance-2026-10-23/summary-acceptance-negative.json @@ -0,0 +1,178 @@ +{ + "phase": "acceptance-negative", + "started": "2026-10-23T11:27:35.1786036Z", + "harnessDll": "8a77b2353fd288f34ce49a52845541c97d94856b96d0ad821980cf1d4046db5c", + "runs": [ + { + "label": "neg-identity-swap-names", + "fixture": "s08-fix-two", + "approvedExit": 10, + "status": "Fail", + "mutation": "neg-identity-swap-names: IDF surfaces \u0027SAM_Surface_FIX_EXT_WALL_0_2b2d8a7f\u0027 and \u0027SAM_Surface_FIX_EXT_WALL_0_4224250c\u0027 trade names", + "required": 10 + }, + { + "label": "neg-schedule-swap", + "fixture": "s08-fix-box", + "approvedExit": 10, + "status": "Fail", + "mutation": "neg-schedule-swap: IDF DSOA \u0027SAM_InternalCondition_FIX_IC_BOX_af50b3dc_DesignSpecificationOutdoorAir\u0027 schedule -\u003e the occupancy schedule \u0027SAM_Schedule_FIX_IC_BOX_OCC_Occupancy_98cc45ae\u0027", + "required": 10 + }, + { + "label": "neg-v1-unscheduled", + "fixture": "s08-fix-two", + "approvedExit": 10, + "status": "Fail", + "mutation": "neg-v1-unscheduled: every DSOA fraction schedule removed in the IDF and the OSM (unscheduled delivery)", + "required": 10 + }, + { + "label": "neg-missing-dsoa-link", + "fixture": "s08-fix-box", + "approvedExit": 10, + "status": "Fail", + "mutation": "neg-missing-dsoa-link: IDF Ideal Loads \u0027SAM_IdealLoads_FixBox_5080c000\u0027 names no DSOA", + "required": 10 + }, + { + "label": "neg-missing-schedule-object", + "fixture": "s08-fix-box", + "approvedExit": 10, + "status": "Fail", + "mutation": "neg-missing-schedule-object: IDF schedule \u0027SAM_Schedule_FIX_IC_BOX_VNT_Ventilation_970842a3\u0027 renamed: the DSOA names an undefined schedule", + "required": 10 + }, + { + "label": "neg-people-density", + "fixture": "s08-fix-box", + "approvedExit": 10, + "status": "Fail", + "mutation": "neg-people-density: IDF People \u0027SAM_InternalCondition_FIX_IC_BOX_af50b3dc_People\u0027 density x 1.01", + "required": 10 + }, + { + "label": "neg-layer-conductivity", + "fixture": "s08-fix-two", + "approvedExit": 10, + "status": "Fail", + "mutation": "neg-layer-conductivity: IDF Material \u0027SAM_OpaqueMaterial_FIX_Blockwork_100mm_422b4f0d\u0027 conductivity x 1.001", + "required": 10 + }, + { + "label": "neg-osm-dsoa-schedule", + "fixture": "s08-fix-box", + "approvedExit": 10, + "status": "Fail", + "mutation": "neg-osm-dsoa-schedule: OSM DSOA \u0027SAM_InternalCondition_FIX_IC_BOX_af50b3dc_DesignSpecificationOutdoorAir\u0027 fraction schedule removed (IDF unchanged)", + "required": 10 + }, + { + "label": "neg-zone-multiplier", + "fixture": "s08-fix-box", + "approvedExit": 10, + "status": "Fail", + "mutation": "neg-zone-multiplier: IDF Zone \u0027SAM_ThermalZone_FixBox_5080c000\u0027 Multiplier 1 -\u003e 2 (OSM unchanged)", + "required": 10 + }, + { + "label": "neg-window-multiplier", + "fixture": "s08-fix-box", + "approvedExit": 10, + "status": "Fail", + "mutation": "neg-window-multiplier: IDF FenestrationSurface:Detailed Multiplier blank -\u003e 2 on 2 subsurface(s) (OSM unchanged)", + "required": 10 + }, + { + "label": "neg-north-axis", + "fixture": "s08-fix-box", + "approvedExit": 10, + "status": "Fail", + "mutation": "neg-north-axis: IDF Building \u0027Building 1\u0027 North Axis blank -\u003e 90 (OSM unchanged)", + "required": 10 + }, + { + "label": "neg-zone-multiplier-both", + "fixture": "s08-fix-box", + "approvedExit": 10, + "status": "Fail", + "mutation": "neg-zone-multiplier-both: IDF Zone \u0027SAM_ThermalZone_FixBox_5080c000\u0027 Multiplier 1 -\u003e 2 and OSM OS:ThermalZone Multiplier blank -\u003e 2", + "required": 10 + }, + { + "label": "neg-window-multiplier-both", + "fixture": "s08-fix-box", + "approvedExit": 10, + "status": "Fail", + "mutation": "neg-window-multiplier-both: IDF FenestrationSurface:Detailed Multiplier blank -\u003e 2 on 2 subsurface(s) and OSM OS:SubSurface Multiplier blank -\u003e 2", + "required": 10 + }, + { + "label": "neg-north-axis-both", + "fixture": "s08-fix-box", + "approvedExit": 10, + "status": "Fail", + "mutation": "neg-north-axis-both: IDF Building \u0027Building 1\u0027 North Axis blank -\u003e 90 and OSM OS:Building North Axis blank -\u003e 90", + "required": 10 + }, + { + "label": "neg-osm-missing-thermal-zone", + "fixture": "s08-fix-two", + "approvedExit": 10, + "status": "Fail", + "mutation": "neg-osm-missing-thermal-zone: OSM OS:ThermalZone \u0027SAM_ThermalZone_FixA_5080c000\u0027 removed (IDF unchanged)", + "required": 10 + }, + { + "label": "neg-osm-missing-subsurfaces", + "fixture": "s08-fix-box", + "approvedExit": 10, + "status": "Fail", + "mutation": "neg-osm-missing-subsurfaces: OSM OS:SubSurface removed for 2 subsurface(s) (IDF unchanged)", + "required": 10 + }, + { + "label": "neg-lighting-previous-mapping", + "fixture": "s08-fix-box", + "approvedExit": 10, + "status": "Fail", + "mutation": "neg-lighting-previous-mapping: IDF Lights \u0027SAM_InternalCondition_FIX_IC_BOX_af50b3dc_Lights\u0027 Fraction Radiant -\u003e p = 0.37, Fraction Visible -\u003e 0.25 (the previous mapping)", + "required": 10 + }, + { + "label": "neg-lighting-visible-zero", + "fixture": "s08-fix-box", + "approvedExit": 10, + "status": "Fail", + "mutation": "neg-lighting-visible-zero: IDF Lights \u0027SAM_InternalCondition_FIX_IC_BOX_af50b3dc_Lights\u0027 Fraction Visible 0.155130208333333 -\u003e 0 with a positive authored p", + "required": 10 + }, + { + "label": "neg-lighting-radiant-is-p", + "fixture": "s08-fix-two", + "approvedExit": 10, + "status": "Fail", + "mutation": "neg-lighting-radiant-is-p: IDF Lights \u0027SAM_InternalCondition_FIX_IC_A_6c498580_Lights\u0027 Fraction Radiant -\u003e p = 0.33999999999999997 with Fraction Visible 0.142552083333333 kept", + "required": 10 + }, + { + "label": "neg-lighting-return-air", + "fixture": "s08-fix-box", + "approvedExit": 10, + "status": "Fail", + "mutation": "neg-lighting-return-air: IDF Lights \u0027SAM_InternalCondition_FIX_IC_BOX_af50b3dc_Lights\u0027 Return Air Fraction blank -\u003e 0.1", + "required": 10 + }, + { + "label": "neg-lighting-swapped", + "fixture": "s08-fix-two", + "approvedExit": 10, + "status": "Fail", + "mutation": "neg-lighting-swapped: IDF Lights \u0027SAM_InternalCondition_FIX_IC_A_6c498580_Lights\u0027 Fraction Radiant 0.197447916666667 and Fraction Visible 0.142552083333333 swapped", + "required": 10 + } + ], + "original-unchanged:box": true, + "original-unchanged:two": true, + "finished": "2026-10-23T11:28:08.6022900Z" +} diff --git a/documentation/S09-OpenStudio-InputReadBack-evidence/acceptance-2026-10-23/summary-acceptance.json b/documentation/S09-OpenStudio-InputReadBack-evidence/acceptance-2026-10-23/summary-acceptance.json new file mode 100644 index 0000000..67aea45 --- /dev/null +++ b/documentation/S09-OpenStudio-InputReadBack-evidence/acceptance-2026-10-23/summary-acceptance.json @@ -0,0 +1,43 @@ +{ + "phase": "acceptance", + "started": "2026-10-23T11:27:00.2916728Z", + "harnessDll": "8a77b2353fd288f34ce49a52845541c97d94856b96d0ad821980cf1d4046db5c", + "runs": [ + { + "label": "box", + "fixture": "s08-fix-box", + "approvedExit": 0, + "provisionalExit": 0, + "status": "Pass", + "coverage": "Complete", + "required": 319, + "results": 319 + }, + { + "label": "two", + "fixture": "s08-fix-two", + "approvedExit": 0, + "provisionalExit": 12, + "status": "Pass", + "coverage": "Complete", + "required": 592, + "results": 592 + }, + { + "label": "box-repeat", + "fixture": "s08-fix-box", + "approvedExit": 0, + "provisionalExit": 0, + "status": "Pass", + "coverage": "Complete", + "required": 319, + "results": 319 + } + ], + "fixture:s08-fix-box.json": "45524172b32f85df89511dd344141023de999faa9552a199e6b49062612acd08", + "fixture:s08-fix-two.json": "20da9b586345e9fc67dc6308e6da1578b9bc41b3c694dbdab37e9c677959baa0", + "epw": "472ffb4e2f10867600949a392ce46891fc1bd05f2fc8d8917a99bca7d26209c3", + "repeat:model.osm": "DIFFERENT 068dcddfc2dd2424fded429b2f0d42ee3ca1bda30c4ff9b67ae80f7295cd0ecd 49cf3342ac161d0fb0e75c852103a50ba713e0be6b58195a076e08500279eb03", + "repeat:in.idf": "identical", + "finished": "2026-10-23T11:27:17.7823821Z" +} diff --git a/documentation/S09-OpenStudio-InputReadBack-evidence/negatives/neg-identity-swap-names/report-approved.txt b/documentation/S09-OpenStudio-InputReadBack-evidence/negatives/neg-identity-swap-names/report-approved.txt new file mode 100644 index 0000000..812c4b3 --- /dev/null +++ b/documentation/S09-OpenStudio-InputReadBack-evidence/negatives/neg-identity-swap-names/report-approved.txt @@ -0,0 +1,35 @@ +S09 OpenStudio read-back: s08-fix-two -> Fail (exit 10); rule set Approved; gate Fail; coverage Complete (586 required, 586 results) +outcomes: AcceptedTransformation 6, DocumentedDefault 2, ExportDefect 84, MappingDifference 114, Match 337, NotApplicable 1, WithinTolerance 42 +D-F2 space:5080c000-0000-0000-0000-00000000c0a1: V1 +D-F2 space:5080c000-0000-0000-0000-00000000c0b1: V1 +NOT PASS DocumentedDefault / BlockedOwnerDecision: 2 + 4c space:5080c000-0000-0000-0000-00000000c0a1.ic.lighting.visible: SAM states no value and the native holds the contract-listed default. Not accepted by the owner. + 4c space:5080c000-0000-0000-0000-00000000c0b1.ic.lighting.visible: SAM states no value and the native holds the contract-listed default. Not accepted by the owner. +NOT PASS ExportDefect / Fail: 84 + 1b panel:4224250c-fb3c-4d91-a9bd-7b0de82b0ab7@space:5080c000-0000-0000-0000-00000000c0a1: Identity mismatch: the native object is unmatched, many to one, or contradicts the SAM object. + 3a panel:4224250c-fb3c-4d91-a9bd-7b0de82b0ab7@space:5080c000-0000-0000-0000-00000000c0a1#layer1.thickness: Identity mismatch: the native object is unmatched, many to one, or contradicts the SAM object. + 3a panel:4224250c-fb3c-4d91-a9bd-7b0de82b0ab7@space:5080c000-0000-0000-0000-00000000c0a1#layer1.conductivity: Identity mismatch: the native object is unmatched, many to one, or contradicts the SAM object. + 3a panel:4224250c-fb3c-4d91-a9bd-7b0de82b0ab7@space:5080c000-0000-0000-0000-00000000c0a1#layer1.density: Identity mismatch: the native object is unmatched, many to one, or contradicts the SAM object. + 3a panel:4224250c-fb3c-4d91-a9bd-7b0de82b0ab7@space:5080c000-0000-0000-0000-00000000c0a1#layer1.specificHeat: Identity mismatch: the native object is unmatched, many to one, or contradicts the SAM object. + 3a panel:4224250c-fb3c-4d91-a9bd-7b0de82b0ab7@space:5080c000-0000-0000-0000-00000000c0a1#layer1.externalSolarReflectance: Identity mismatch: the native object is unmatched, many to one, or contradicts the SAM object. + 3a panel:4224250c-fb3c-4d91-a9bd-7b0de82b0ab7@space:5080c000-0000-0000-0000-00000000c0a1#layer1.internalSolarReflectance: Identity mismatch: the native object is unmatched, many to one, or contradicts the SAM object. Also: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:4224250c-fb3c-4d91-a9bd-7b0de82b0ab7@space:5080c000-0000-0000-0000-00000000c0a1#layer1.externalLightReflectance: Identity mismatch: the native object is unmatched, many to one, or contradicts the SAM object. + 3a panel:4224250c-fb3c-4d91-a9bd-7b0de82b0ab7@space:5080c000-0000-0000-0000-00000000c0a1#layer1.internalLightReflectance: Identity mismatch: the native object is unmatched, many to one, or contradicts the SAM object. Also: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:4224250c-fb3c-4d91-a9bd-7b0de82b0ab7@space:5080c000-0000-0000-0000-00000000c0a1#layer1.externalEmissivity: Identity mismatch: the native object is unmatched, many to one, or contradicts the SAM object. + 3a panel:4224250c-fb3c-4d91-a9bd-7b0de82b0ab7@space:5080c000-0000-0000-0000-00000000c0a1#layer1.internalEmissivity: Identity mismatch: the native object is unmatched, many to one, or contradicts the SAM object. Also: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:4224250c-fb3c-4d91-a9bd-7b0de82b0ab7@space:5080c000-0000-0000-0000-00000000c0a1#layer2.thickness: Identity mismatch: the native object is unmatched, many to one, or contradicts the SAM object. + ... 72 more in report.json +NOT PASS MappingDifference / BlockedOwnerDecision: 114 + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer1.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer1.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer1.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer2.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer2.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer2.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer3.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer3.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer3.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:fe8a6b43-ec73-4201-91e8-0dedf413b25c@space:5080c000-0000-0000-0000-00000000c0a1#layer1.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:fe8a6b43-ec73-4201-91e8-0dedf413b25c@space:5080c000-0000-0000-0000-00000000c0a1#layer1.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:fe8a6b43-ec73-4201-91e8-0dedf413b25c@space:5080c000-0000-0000-0000-00000000c0a1#layer1.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + ... 102 more in report.json diff --git a/documentation/S09-OpenStudio-InputReadBack-evidence/negatives/neg-layer-conductivity/report-approved.txt b/documentation/S09-OpenStudio-InputReadBack-evidence/negatives/neg-layer-conductivity/report-approved.txt new file mode 100644 index 0000000..8375de5 --- /dev/null +++ b/documentation/S09-OpenStudio-InputReadBack-evidence/negatives/neg-layer-conductivity/report-approved.txt @@ -0,0 +1,28 @@ +S09 OpenStudio read-back: s08-fix-two -> Fail (exit 10); rule set Approved; gate Fail; coverage Complete (586 required, 586 results) +outcomes: AcceptedTransformation 6, DocumentedDefault 2, MappingDifference 138, Match 381, NotApplicable 1, OutOfTolerance 6, WithinTolerance 52 +D-F2 space:5080c000-0000-0000-0000-00000000c0a1: V1 +D-F2 space:5080c000-0000-0000-0000-00000000c0b1: V1 +NOT PASS DocumentedDefault / BlockedOwnerDecision: 2 + 4c space:5080c000-0000-0000-0000-00000000c0a1.ic.lighting.visible: SAM states no value and the native holds the contract-listed default. Not accepted by the owner. + 4c space:5080c000-0000-0000-0000-00000000c0b1.ic.lighting.visible: SAM states no value and the native holds the contract-listed default. Not accepted by the owner. +NOT PASS MappingDifference / BlockedOwnerDecision: 138 + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer1.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer1.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer1.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer2.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer2.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer2.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer3.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer3.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer3.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:fe8a6b43-ec73-4201-91e8-0dedf413b25c@space:5080c000-0000-0000-0000-00000000c0a1#layer1.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:fe8a6b43-ec73-4201-91e8-0dedf413b25c@space:5080c000-0000-0000-0000-00000000c0a1#layer1.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:fe8a6b43-ec73-4201-91e8-0dedf413b25c@space:5080c000-0000-0000-0000-00000000c0a1#layer1.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + ... 126 more in report.json +NOT PASS OutOfTolerance / Fail: 6 + 3a panel:1c080d98-e160-4254-8bac-f3902936a621@space:5080c000-0000-0000-0000-00000000c0a1#layer2.conductivity: The native value is outside the tolerance without a contract explanation. + 3a panel:4224250c-fb3c-4d91-a9bd-7b0de82b0ab7@space:5080c000-0000-0000-0000-00000000c0a1#layer2.conductivity: The native value is outside the tolerance without a contract explanation. + 3a panel:2b2d8a7f-fbc6-4663-9608-3f054b4a10d8@space:5080c000-0000-0000-0000-00000000c0a1#layer2.conductivity: The native value is outside the tolerance without a contract explanation. + 3a panel:d1aaf21e-5613-42e2-ba3c-a6632d2237fd@space:5080c000-0000-0000-0000-00000000c0b1#layer2.conductivity: The native value is outside the tolerance without a contract explanation. + 3a panel:965af5b3-f250-4492-9467-f988d7831eae@space:5080c000-0000-0000-0000-00000000c0b1#layer2.conductivity: The native value is outside the tolerance without a contract explanation. + 3a panel:d3ef56c6-b1bb-4509-9d4c-ce6aa738f318@space:5080c000-0000-0000-0000-00000000c0b1#layer2.conductivity: The native value is outside the tolerance without a contract explanation. diff --git a/documentation/S09-OpenStudio-InputReadBack-evidence/negatives/neg-missing-dsoa-link/report-approved.txt b/documentation/S09-OpenStudio-InputReadBack-evidence/negatives/neg-missing-dsoa-link/report-approved.txt new file mode 100644 index 0000000..6bc5f7f --- /dev/null +++ b/documentation/S09-OpenStudio-InputReadBack-evidence/negatives/neg-missing-dsoa-link/report-approved.txt @@ -0,0 +1,29 @@ +S09 OpenStudio read-back: s08-fix-box -> Fail (exit 10); rule set Approved; gate Fail; coverage Complete (316 required, 316 results) +outcomes: DocumentedDefault 1, ExportDefect 8, MappingDifference 69, Match 214, NotApplicable 1, WithinTolerance 23 +D-F2 space:5080c000-0000-0000-0000-00000000c001: V2 +CONSISTENCY FAIL: space:5080c000-0000-0000-0000-00000000c001: the OSM effective DSOA (SAM_InternalCondition_FIX_IC_BOX_af50b3dc_DesignSpecificationOutdoorAir) is not the one the IDF Ideal Loads delivers (none) +NOT PASS DocumentedDefault / BlockedOwnerDecision: 1 + 4c space:5080c000-0000-0000-0000-00000000c001.ic.lighting.visible: SAM states no value and the native holds the contract-listed default. Not accepted by the owner. +NOT PASS ExportDefect / Fail: 8 + 8a space:5080c000-0000-0000-0000-00000000c001.ic.ventilation.requirement.flow: SAM is zero (S-ZERO) and the native object is omitted without a listed transformation. + 8a space:5080c000-0000-0000-0000-00000000c001.ic.ventilation.requirement.flowPerArea: SAM is zero (S-ZERO) and the native object is omitted without a listed transformation. + 8a space:5080c000-0000-0000-0000-00000000c001.ic.ventilation.requirement.flowPerPerson: The native object is absent for an S-VALUE input. No limitation is listed. + 8a space:5080c000-0000-0000-0000-00000000c001.ic.ventilation.requirement.airChangesPerHour: SAM is zero (S-ZERO) and the native object is omitted without a listed transformation. + 8a space:5080c000-0000-0000-0000-00000000c001.ic.ventilation.requirement.total: The native object is absent for an S-VALUE input. No limitation is listed. + 8b space:5080c000-0000-0000-0000-00000000c001.ic.ventilation.delivered: SAM is zero (S-ZERO) and the native object is omitted without a listed transformation. Also: Hour/day-type alignment is unverified (S07 section 7); an EFLH agreement is supporting evidence only. [decisive element space:5080c000-0000-0000-0000-00000000c001.ic.ventilation.delivered[0] of 8760] + 6.hourly space:5080c000-0000-0000-0000-00000000c001.ic.schedule.ventilation: SAM is zero (S-ZERO) and the native object is omitted without a listed transformation. Also: Hour/day-type alignment is unverified (S07 section 7); an EFLH agreement is supporting evidence only. [decisive element space:5080c000-0000-0000-0000-00000000c001.ic.schedule.ventilation[0] of 8760] + 6.eflh space:5080c000-0000-0000-0000-00000000c001.ic.schedule.ventilation: The native object is absent for an S-VALUE input. No limitation is listed. +NOT PASS MappingDifference / BlockedOwnerDecision: 69 + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer3.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer3.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer3.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:285a1884-d494-47a6-9541-942946ea00a7@space:5080c000-0000-0000-0000-00000000c001#layer1.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:285a1884-d494-47a6-9541-942946ea00a7@space:5080c000-0000-0000-0000-00000000c001#layer1.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:285a1884-d494-47a6-9541-942946ea00a7@space:5080c000-0000-0000-0000-00000000c001#layer1.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + ... 57 more in report.json diff --git a/documentation/S09-OpenStudio-InputReadBack-evidence/negatives/neg-missing-schedule-object/report-approved.txt b/documentation/S09-OpenStudio-InputReadBack-evidence/negatives/neg-missing-schedule-object/report-approved.txt new file mode 100644 index 0000000..958fdb5 --- /dev/null +++ b/documentation/S09-OpenStudio-InputReadBack-evidence/negatives/neg-missing-schedule-object/report-approved.txt @@ -0,0 +1,24 @@ +S09 OpenStudio read-back: s08-fix-box -> Fail (exit 10); rule set Approved; gate BlockedTechnical; coverage Complete (316 required, 316 results) +outcomes: DocumentedDefault 1, MappingDifference 69, Match 218, NotApplicable 1, UnverifiedUnreadable 3, WithinTolerance 24 +D-F2 space:5080c000-0000-0000-0000-00000000c001: V2 +CONSISTENCY FAIL: space:5080c000-0000-0000-0000-00000000c001.ic.schedule.ventilation: names schedule 'SAM_Schedule_FIX_IC_BOX_VNT_Ventilation_970842a3', which the IDF does not define +NOT PASS DocumentedDefault / BlockedOwnerDecision: 1 + 4c space:5080c000-0000-0000-0000-00000000c001.ic.lighting.visible: SAM states no value and the native holds the contract-listed default. Not accepted by the owner. +NOT PASS MappingDifference / BlockedOwnerDecision: 69 + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer3.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer3.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer3.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:285a1884-d494-47a6-9541-942946ea00a7@space:5080c000-0000-0000-0000-00000000c001#layer1.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:285a1884-d494-47a6-9541-942946ea00a7@space:5080c000-0000-0000-0000-00000000c001#layer1.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:285a1884-d494-47a6-9541-942946ea00a7@space:5080c000-0000-0000-0000-00000000c001#layer1.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + ... 57 more in report.json +NOT PASS UnverifiedUnreadable / BlockedTechnical: 3 + 8b space:5080c000-0000-0000-0000-00000000c001.ic.ventilation.delivered: The native field could not be read: the IDF does not define schedule 'SAM_Schedule_FIX_IC_BOX_VNT_Ventilation_970842a3'. Also: Hour/day-type alignment is unverified (S07 section 7); an EFLH agreement is supporting evidence only. [decisive element space:5080c000-0000-0000-0000-00000000c001.ic.ventilation.delivered[0] of 8760] + 6.hourly space:5080c000-0000-0000-0000-00000000c001.ic.schedule.ventilation: The native field could not be read: the IDF does not define schedule 'SAM_Schedule_FIX_IC_BOX_VNT_Ventilation_970842a3'. Also: Hour/day-type alignment is unverified (S07 section 7); an EFLH agreement is supporting evidence only. [decisive element space:5080c000-0000-0000-0000-00000000c001.ic.schedule.ventilation[0] of 8760] + 6.eflh space:5080c000-0000-0000-0000-00000000c001.ic.schedule.ventilation: The native field could not be read: the IDF does not define schedule 'SAM_Schedule_FIX_IC_BOX_VNT_Ventilation_970842a3'. diff --git a/documentation/S09-OpenStudio-InputReadBack-evidence/negatives/neg-north-axis-both/report-approved.txt b/documentation/S09-OpenStudio-InputReadBack-evidence/negatives/neg-north-axis-both/report-approved.txt new file mode 100644 index 0000000..5dc9d14 --- /dev/null +++ b/documentation/S09-OpenStudio-InputReadBack-evidence/negatives/neg-north-axis-both/report-approved.txt @@ -0,0 +1,20 @@ +S09 OpenStudio read-back: s08-fix-box -> Fail (exit 10); rule set Approved; gate BlockedOwnerDecision; coverage Complete (316 required, 316 results) +outcomes: DocumentedDefault 1, MappingDifference 69, Match 220, NotApplicable 1, WithinTolerance 25 +D-F2 space:5080c000-0000-0000-0000-00000000c001: V2 +CONSISTENCY FAIL: orientation: Zone 'SAM_ThermalZone_FixBox_5080c000' is rotated by 90 deg (Building North Axis 90 + Direction of Relative North 0; Relative coordinates); SAM states no rotation +NOT PASS DocumentedDefault / BlockedOwnerDecision: 1 + 4c space:5080c000-0000-0000-0000-00000000c001.ic.lighting.visible: SAM states no value and the native holds the contract-listed default. Not accepted by the owner. +NOT PASS MappingDifference / BlockedOwnerDecision: 69 + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer3.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer3.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer3.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:285a1884-d494-47a6-9541-942946ea00a7@space:5080c000-0000-0000-0000-00000000c001#layer1.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:285a1884-d494-47a6-9541-942946ea00a7@space:5080c000-0000-0000-0000-00000000c001#layer1.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:285a1884-d494-47a6-9541-942946ea00a7@space:5080c000-0000-0000-0000-00000000c001#layer1.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + ... 57 more in report.json diff --git a/documentation/S09-OpenStudio-InputReadBack-evidence/negatives/neg-north-axis/report-approved.txt b/documentation/S09-OpenStudio-InputReadBack-evidence/negatives/neg-north-axis/report-approved.txt new file mode 100644 index 0000000..2ec3833 --- /dev/null +++ b/documentation/S09-OpenStudio-InputReadBack-evidence/negatives/neg-north-axis/report-approved.txt @@ -0,0 +1,21 @@ +S09 OpenStudio read-back: s08-fix-box -> Fail (exit 10); rule set Approved; gate BlockedOwnerDecision; coverage Complete (316 required, 316 results) +outcomes: DocumentedDefault 1, MappingDifference 69, Match 220, NotApplicable 1, WithinTolerance 25 +D-F2 space:5080c000-0000-0000-0000-00000000c001: V2 +CONSISTENCY FAIL: orientation: OS:Building North Axis 0 deg in the OSM, Building North Axis 90 deg in the IDF +CONSISTENCY FAIL: orientation: Zone 'SAM_ThermalZone_FixBox_5080c000' is rotated by 90 deg (Building North Axis 90 + Direction of Relative North 0; Relative coordinates); SAM states no rotation +NOT PASS DocumentedDefault / BlockedOwnerDecision: 1 + 4c space:5080c000-0000-0000-0000-00000000c001.ic.lighting.visible: SAM states no value and the native holds the contract-listed default. Not accepted by the owner. +NOT PASS MappingDifference / BlockedOwnerDecision: 69 + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer3.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer3.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer3.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:285a1884-d494-47a6-9541-942946ea00a7@space:5080c000-0000-0000-0000-00000000c001#layer1.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:285a1884-d494-47a6-9541-942946ea00a7@space:5080c000-0000-0000-0000-00000000c001#layer1.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:285a1884-d494-47a6-9541-942946ea00a7@space:5080c000-0000-0000-0000-00000000c001#layer1.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + ... 57 more in report.json diff --git a/documentation/S09-OpenStudio-InputReadBack-evidence/negatives/neg-osm-dsoa-schedule/report-approved.txt b/documentation/S09-OpenStudio-InputReadBack-evidence/negatives/neg-osm-dsoa-schedule/report-approved.txt new file mode 100644 index 0000000..cac85e4 --- /dev/null +++ b/documentation/S09-OpenStudio-InputReadBack-evidence/negatives/neg-osm-dsoa-schedule/report-approved.txt @@ -0,0 +1,20 @@ +S09 OpenStudio read-back: s08-fix-box -> Fail (exit 10); rule set Approved; gate BlockedOwnerDecision; coverage Complete (316 required, 316 results) +outcomes: DocumentedDefault 1, MappingDifference 69, Match 220, NotApplicable 1, WithinTolerance 25 +D-F2 space:5080c000-0000-0000-0000-00000000c001: V2 +CONSISTENCY FAIL: space:5080c000-0000-0000-0000-00000000c001: DSOA fraction schedule is '' in the OSM and 'SAM_Schedule_FIX_IC_BOX_VNT_Ventilation_970842a3' in the IDF +NOT PASS DocumentedDefault / BlockedOwnerDecision: 1 + 4c space:5080c000-0000-0000-0000-00000000c001.ic.lighting.visible: SAM states no value and the native holds the contract-listed default. Not accepted by the owner. +NOT PASS MappingDifference / BlockedOwnerDecision: 69 + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer3.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer3.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer3.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:285a1884-d494-47a6-9541-942946ea00a7@space:5080c000-0000-0000-0000-00000000c001#layer1.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:285a1884-d494-47a6-9541-942946ea00a7@space:5080c000-0000-0000-0000-00000000c001#layer1.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:285a1884-d494-47a6-9541-942946ea00a7@space:5080c000-0000-0000-0000-00000000c001#layer1.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + ... 57 more in report.json diff --git a/documentation/S09-OpenStudio-InputReadBack-evidence/negatives/neg-osm-missing-subsurfaces/report-approved.txt b/documentation/S09-OpenStudio-InputReadBack-evidence/negatives/neg-osm-missing-subsurfaces/report-approved.txt new file mode 100644 index 0000000..74f9e59 --- /dev/null +++ b/documentation/S09-OpenStudio-InputReadBack-evidence/negatives/neg-osm-missing-subsurfaces/report-approved.txt @@ -0,0 +1,21 @@ +S09 OpenStudio read-back: s08-fix-box -> Fail (exit 10); rule set Approved; gate BlockedOwnerDecision; coverage Complete (316 required, 316 results) +outcomes: DocumentedDefault 1, MappingDifference 69, Match 220, NotApplicable 1, WithinTolerance 25 +D-F2 space:5080c000-0000-0000-0000-00000000c001: V2 +CONSISTENCY FAIL: multiplicity: IDF FenestrationSurface:Detailed 'SAM_SubSurface_FIX_WIN_UNFRAMED_0_6adea09c' has no OS:SubSurface in the OSM (none of its 0 OS:SubSurface object(s) has that name); the OSM and IDF disagree +CONSISTENCY FAIL: multiplicity: IDF FenestrationSurface:Detailed 'SAM_SubSurface_FIX_WIN_FRAMED_0_95717805' has no OS:SubSurface in the OSM (none of its 0 OS:SubSurface object(s) has that name); the OSM and IDF disagree +NOT PASS DocumentedDefault / BlockedOwnerDecision: 1 + 4c space:5080c000-0000-0000-0000-00000000c001.ic.lighting.visible: SAM states no value and the native holds the contract-listed default. Not accepted by the owner. +NOT PASS MappingDifference / BlockedOwnerDecision: 69 + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer3.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer3.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer3.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:285a1884-d494-47a6-9541-942946ea00a7@space:5080c000-0000-0000-0000-00000000c001#layer1.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:285a1884-d494-47a6-9541-942946ea00a7@space:5080c000-0000-0000-0000-00000000c001#layer1.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:285a1884-d494-47a6-9541-942946ea00a7@space:5080c000-0000-0000-0000-00000000c001#layer1.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + ... 57 more in report.json diff --git a/documentation/S09-OpenStudio-InputReadBack-evidence/negatives/neg-osm-missing-thermal-zone/report-approved.txt b/documentation/S09-OpenStudio-InputReadBack-evidence/negatives/neg-osm-missing-thermal-zone/report-approved.txt new file mode 100644 index 0000000..4c28824 --- /dev/null +++ b/documentation/S09-OpenStudio-InputReadBack-evidence/negatives/neg-osm-missing-thermal-zone/report-approved.txt @@ -0,0 +1,22 @@ +S09 OpenStudio read-back: s08-fix-two -> Fail (exit 10); rule set Approved; gate BlockedOwnerDecision; coverage Complete (586 required, 586 results) +outcomes: AcceptedTransformation 6, DocumentedDefault 2, MappingDifference 138, Match 393, NotApplicable 1, WithinTolerance 46 +D-F2 space:5080c000-0000-0000-0000-00000000c0a1: V1 +D-F2 space:5080c000-0000-0000-0000-00000000c0b1: V1 +CONSISTENCY FAIL: multiplicity: IDF Zone 'SAM_ThermalZone_FixA_5080c000' has no OS:ThermalZone in the OSM (none of its 1 OS:ThermalZone object(s) has that name); the OSM and IDF disagree +NOT PASS DocumentedDefault / BlockedOwnerDecision: 2 + 4c space:5080c000-0000-0000-0000-00000000c0a1.ic.lighting.visible: SAM states no value and the native holds the contract-listed default. Not accepted by the owner. + 4c space:5080c000-0000-0000-0000-00000000c0b1.ic.lighting.visible: SAM states no value and the native holds the contract-listed default. Not accepted by the owner. +NOT PASS MappingDifference / BlockedOwnerDecision: 138 + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer1.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer1.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer1.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer2.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer2.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer2.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer3.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer3.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer3.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:fe8a6b43-ec73-4201-91e8-0dedf413b25c@space:5080c000-0000-0000-0000-00000000c0a1#layer1.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:fe8a6b43-ec73-4201-91e8-0dedf413b25c@space:5080c000-0000-0000-0000-00000000c0a1#layer1.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:fe8a6b43-ec73-4201-91e8-0dedf413b25c@space:5080c000-0000-0000-0000-00000000c0a1#layer1.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + ... 126 more in report.json diff --git a/documentation/S09-OpenStudio-InputReadBack-evidence/negatives/neg-people-density/report-approved.txt b/documentation/S09-OpenStudio-InputReadBack-evidence/negatives/neg-people-density/report-approved.txt new file mode 100644 index 0000000..30b26b0 --- /dev/null +++ b/documentation/S09-OpenStudio-InputReadBack-evidence/negatives/neg-people-density/report-approved.txt @@ -0,0 +1,27 @@ +S09 OpenStudio read-back: s08-fix-box -> Fail (exit 10); rule set Approved; gate Fail; coverage Complete (316 required, 316 results) +outcomes: DocumentedDefault 1, MappingDifference 69, Match 220, NotApplicable 1, OutOfTolerance 7, WithinTolerance 18 +D-F2 space:5080c000-0000-0000-0000-00000000c001: V2 +NOT PASS DocumentedDefault / BlockedOwnerDecision: 1 + 4c space:5080c000-0000-0000-0000-00000000c001.ic.lighting.visible: SAM states no value and the native holds the contract-listed default. Not accepted by the owner. +NOT PASS MappingDifference / BlockedOwnerDecision: 69 + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer3.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer3.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer3.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:285a1884-d494-47a6-9541-942946ea00a7@space:5080c000-0000-0000-0000-00000000c001#layer1.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:285a1884-d494-47a6-9541-942946ea00a7@space:5080c000-0000-0000-0000-00000000c001#layer1.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:285a1884-d494-47a6-9541-942946ea00a7@space:5080c000-0000-0000-0000-00000000c001#layer1.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + ... 57 more in report.json +NOT PASS OutOfTolerance / Fail: 7 + 4a.people space:5080c000-0000-0000-0000-00000000c001.ic.people: The native value is outside the tolerance without a contract explanation. + 4a.density space:5080c000-0000-0000-0000-00000000c001.ic.occupancySensible: The native value is outside the tolerance without a contract explanation. + 4b space:5080c000-0000-0000-0000-00000000c001.ic.occupancySensible.total: The native value is outside the tolerance without a contract explanation. + 4a.density space:5080c000-0000-0000-0000-00000000c001.ic.occupancyLatent: The native value is outside the tolerance without a contract explanation. + 4b space:5080c000-0000-0000-0000-00000000c001.ic.occupancyLatent.total: The native value is outside the tolerance without a contract explanation. + 8a space:5080c000-0000-0000-0000-00000000c001.ic.ventilation.requirement.total: The native value is outside the tolerance without a contract explanation. + 8b space:5080c000-0000-0000-0000-00000000c001.ic.ventilation.delivered: The native value is outside the tolerance without a contract explanation. [decisive element space:5080c000-0000-0000-0000-00000000c001.ic.ventilation.delivered[7] of 8760] diff --git a/documentation/S09-OpenStudio-InputReadBack-evidence/negatives/neg-schedule-swap/report-approved.txt b/documentation/S09-OpenStudio-InputReadBack-evidence/negatives/neg-schedule-swap/report-approved.txt new file mode 100644 index 0000000..3b01af5 --- /dev/null +++ b/documentation/S09-OpenStudio-InputReadBack-evidence/negatives/neg-schedule-swap/report-approved.txt @@ -0,0 +1,25 @@ +S09 OpenStudio read-back: s08-fix-box -> Fail (exit 10); rule set Approved; gate Fail; coverage Complete (316 required, 316 results) +outcomes: DocumentedDefault 1, ExportDefect 2, MappingDifference 69, Match 218, NotApplicable 1, OutOfTolerance 1, WithinTolerance 24 +D-F2 space:5080c000-0000-0000-0000-00000000c001: V2 +CONSISTENCY FAIL: space:5080c000-0000-0000-0000-00000000c001: DSOA fraction schedule is 'SAM_Schedule_FIX_IC_BOX_VNT_Ventilation_970842a3' in the OSM and 'SAM_Schedule_FIX_IC_BOX_OCC_Occupancy_98cc45ae' in the IDF +NOT PASS DocumentedDefault / BlockedOwnerDecision: 1 + 4c space:5080c000-0000-0000-0000-00000000c001.ic.lighting.visible: SAM states no value and the native holds the contract-listed default. Not accepted by the owner. +NOT PASS ExportDefect / Fail: 2 + 8b space:5080c000-0000-0000-0000-00000000c001.ic.ventilation.delivered: SAM states a non-zero value (S-VALUE) but the native object holds exactly 0; abs never turns a zeroed native object into a pass. No limitation is listed. [decisive element space:5080c000-0000-0000-0000-00000000c001.ic.ventilation.delivered[7] of 8760] + 6.hourly space:5080c000-0000-0000-0000-00000000c001.ic.schedule.ventilation: SAM states a non-zero value (S-VALUE) but the native object holds exactly 0; abs never turns a zeroed native object into a pass. No limitation is listed. [decisive element space:5080c000-0000-0000-0000-00000000c001.ic.schedule.ventilation[7] of 8760] +NOT PASS MappingDifference / BlockedOwnerDecision: 69 + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer3.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer3.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer3.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:285a1884-d494-47a6-9541-942946ea00a7@space:5080c000-0000-0000-0000-00000000c001#layer1.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:285a1884-d494-47a6-9541-942946ea00a7@space:5080c000-0000-0000-0000-00000000c001#layer1.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:285a1884-d494-47a6-9541-942946ea00a7@space:5080c000-0000-0000-0000-00000000c001#layer1.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + ... 57 more in report.json +NOT PASS OutOfTolerance / Fail: 1 + 6.eflh space:5080c000-0000-0000-0000-00000000c001.ic.schedule.ventilation: The native value is outside the tolerance without a contract explanation. diff --git a/documentation/S09-OpenStudio-InputReadBack-evidence/negatives/neg-v1-unscheduled/report-approved.txt b/documentation/S09-OpenStudio-InputReadBack-evidence/negatives/neg-v1-unscheduled/report-approved.txt new file mode 100644 index 0000000..1c05ca5 --- /dev/null +++ b/documentation/S09-OpenStudio-InputReadBack-evidence/negatives/neg-v1-unscheduled/report-approved.txt @@ -0,0 +1,27 @@ +S09 OpenStudio read-back: s08-fix-two -> Fail (exit 10); rule set Approved; gate Fail; coverage Complete (586 required, 586 results) +outcomes: DocumentedDefault 2, ExportDefect 2, MappingDifference 138, Match 393, NotApplicable 3, UnverifiedUnresolved 2, WithinTolerance 46 +D-F2 space:5080c000-0000-0000-0000-00000000c0a1: V1 +D-F2 space:5080c000-0000-0000-0000-00000000c0b1: V1 +NOT PASS DocumentedDefault / BlockedOwnerDecision: 2 + 4c space:5080c000-0000-0000-0000-00000000c0a1.ic.lighting.visible: SAM states no value and the native holds the contract-listed default. Not accepted by the owner. + 4c space:5080c000-0000-0000-0000-00000000c0b1.ic.lighting.visible: SAM states no value and the native holds the contract-listed default. Not accepted by the owner. +NOT PASS ExportDefect / Fail: 2 + 8b space:5080c000-0000-0000-0000-00000000c0a1.ic.ventilation.delivered: SAM states no value (S-UNSPEC) and the native holds a non-zero value that is not the contract-listed default. Also: Hour/day-type alignment is unverified (S07 section 7); an EFLH agreement is supporting evidence only. [decisive element space:5080c000-0000-0000-0000-00000000c0a1.ic.ventilation.delivered[0] of 8760] + 8b space:5080c000-0000-0000-0000-00000000c0b1.ic.ventilation.delivered: SAM states no value (S-UNSPEC) and the native holds a non-zero value that is not the contract-listed default. Also: Hour/day-type alignment is unverified (S07 section 7); an EFLH agreement is supporting evidence only. [decisive element space:5080c000-0000-0000-0000-00000000c0b1.ic.ventilation.delivered[0] of 8760] +NOT PASS MappingDifference / BlockedOwnerDecision: 138 + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer1.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer1.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer1.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer2.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer2.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer2.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer3.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer3.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer3.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:fe8a6b43-ec73-4201-91e8-0dedf413b25c@space:5080c000-0000-0000-0000-00000000c0a1#layer1.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:fe8a6b43-ec73-4201-91e8-0dedf413b25c@space:5080c000-0000-0000-0000-00000000c0a1#layer1.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:fe8a6b43-ec73-4201-91e8-0dedf413b25c@space:5080c000-0000-0000-0000-00000000c0a1#layer1.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + ... 126 more in report.json +NOT PASS UnverifiedUnresolved / NotRun: 2 + 6.hourly space:5080c000-0000-0000-0000-00000000c0a1.ic.schedule.ventilation: Hour/day-type alignment is unverified (S07 section 7); an EFLH agreement is supporting evidence only. + 6.hourly space:5080c000-0000-0000-0000-00000000c0b1.ic.schedule.ventilation: Hour/day-type alignment is unverified (S07 section 7); an EFLH agreement is supporting evidence only. diff --git a/documentation/S09-OpenStudio-InputReadBack-evidence/negatives/neg-window-multiplier-both/report-approved.txt b/documentation/S09-OpenStudio-InputReadBack-evidence/negatives/neg-window-multiplier-both/report-approved.txt new file mode 100644 index 0000000..0e1e8bf --- /dev/null +++ b/documentation/S09-OpenStudio-InputReadBack-evidence/negatives/neg-window-multiplier-both/report-approved.txt @@ -0,0 +1,21 @@ +S09 OpenStudio read-back: s08-fix-box -> Fail (exit 10); rule set Approved; gate BlockedOwnerDecision; coverage Complete (316 required, 316 results) +outcomes: DocumentedDefault 1, MappingDifference 69, Match 220, NotApplicable 1, WithinTolerance 25 +D-F2 space:5080c000-0000-0000-0000-00000000c001: V2 +CONSISTENCY FAIL: multiplicity: IDF FenestrationSurface:Detailed 'SAM_SubSurface_FIX_WIN_UNFRAMED_0_6adea09c' Multiplier 2: EnergyPlus multiplies its area (frame and divider included); SAM states one aperture and no multiplier +CONSISTENCY FAIL: multiplicity: IDF FenestrationSurface:Detailed 'SAM_SubSurface_FIX_WIN_FRAMED_0_95717805' Multiplier 2: EnergyPlus multiplies its area (frame and divider included); SAM states one aperture and no multiplier +NOT PASS DocumentedDefault / BlockedOwnerDecision: 1 + 4c space:5080c000-0000-0000-0000-00000000c001.ic.lighting.visible: SAM states no value and the native holds the contract-listed default. Not accepted by the owner. +NOT PASS MappingDifference / BlockedOwnerDecision: 69 + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer3.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer3.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer3.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:285a1884-d494-47a6-9541-942946ea00a7@space:5080c000-0000-0000-0000-00000000c001#layer1.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:285a1884-d494-47a6-9541-942946ea00a7@space:5080c000-0000-0000-0000-00000000c001#layer1.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:285a1884-d494-47a6-9541-942946ea00a7@space:5080c000-0000-0000-0000-00000000c001#layer1.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + ... 57 more in report.json diff --git a/documentation/S09-OpenStudio-InputReadBack-evidence/negatives/neg-window-multiplier/report-approved.txt b/documentation/S09-OpenStudio-InputReadBack-evidence/negatives/neg-window-multiplier/report-approved.txt new file mode 100644 index 0000000..f7f7d57 --- /dev/null +++ b/documentation/S09-OpenStudio-InputReadBack-evidence/negatives/neg-window-multiplier/report-approved.txt @@ -0,0 +1,23 @@ +S09 OpenStudio read-back: s08-fix-box -> Fail (exit 10); rule set Approved; gate BlockedOwnerDecision; coverage Complete (316 required, 316 results) +outcomes: DocumentedDefault 1, MappingDifference 69, Match 220, NotApplicable 1, WithinTolerance 25 +D-F2 space:5080c000-0000-0000-0000-00000000c001: V2 +CONSISTENCY FAIL: multiplicity: IDF FenestrationSurface:Detailed 'SAM_SubSurface_FIX_WIN_UNFRAMED_0_6adea09c' Multiplier 2: EnergyPlus multiplies its area (frame and divider included); SAM states one aperture and no multiplier +CONSISTENCY FAIL: multiplicity: subsurface 'SAM_SubSurface_FIX_WIN_UNFRAMED_0_6adea09c' Multiplier 1 in the OSM, 2 in the IDF +CONSISTENCY FAIL: multiplicity: IDF FenestrationSurface:Detailed 'SAM_SubSurface_FIX_WIN_FRAMED_0_95717805' Multiplier 2: EnergyPlus multiplies its area (frame and divider included); SAM states one aperture and no multiplier +CONSISTENCY FAIL: multiplicity: subsurface 'SAM_SubSurface_FIX_WIN_FRAMED_0_95717805' Multiplier 1 in the OSM, 2 in the IDF +NOT PASS DocumentedDefault / BlockedOwnerDecision: 1 + 4c space:5080c000-0000-0000-0000-00000000c001.ic.lighting.visible: SAM states no value and the native holds the contract-listed default. Not accepted by the owner. +NOT PASS MappingDifference / BlockedOwnerDecision: 69 + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer3.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer3.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer3.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:285a1884-d494-47a6-9541-942946ea00a7@space:5080c000-0000-0000-0000-00000000c001#layer1.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:285a1884-d494-47a6-9541-942946ea00a7@space:5080c000-0000-0000-0000-00000000c001#layer1.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:285a1884-d494-47a6-9541-942946ea00a7@space:5080c000-0000-0000-0000-00000000c001#layer1.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + ... 57 more in report.json diff --git a/documentation/S09-OpenStudio-InputReadBack-evidence/negatives/neg-zone-multiplier-both/report-approved.txt b/documentation/S09-OpenStudio-InputReadBack-evidence/negatives/neg-zone-multiplier-both/report-approved.txt new file mode 100644 index 0000000..7088564 --- /dev/null +++ b/documentation/S09-OpenStudio-InputReadBack-evidence/negatives/neg-zone-multiplier-both/report-approved.txt @@ -0,0 +1,20 @@ +S09 OpenStudio read-back: s08-fix-box -> Fail (exit 10); rule set Approved; gate BlockedOwnerDecision; coverage Complete (316 required, 316 results) +outcomes: DocumentedDefault 1, MappingDifference 69, Match 220, NotApplicable 1, WithinTolerance 25 +D-F2 space:5080c000-0000-0000-0000-00000000c001: V2 +CONSISTENCY FAIL: multiplicity: IDF Zone 'SAM_ThermalZone_FixBox_5080c000' Multiplier 2: EnergyPlus multiplies the zone's floor area, loads and internal gains; SAM states one space and no multiplier +NOT PASS DocumentedDefault / BlockedOwnerDecision: 1 + 4c space:5080c000-0000-0000-0000-00000000c001.ic.lighting.visible: SAM states no value and the native holds the contract-listed default. Not accepted by the owner. +NOT PASS MappingDifference / BlockedOwnerDecision: 69 + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer3.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer3.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer3.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:285a1884-d494-47a6-9541-942946ea00a7@space:5080c000-0000-0000-0000-00000000c001#layer1.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:285a1884-d494-47a6-9541-942946ea00a7@space:5080c000-0000-0000-0000-00000000c001#layer1.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:285a1884-d494-47a6-9541-942946ea00a7@space:5080c000-0000-0000-0000-00000000c001#layer1.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + ... 57 more in report.json diff --git a/documentation/S09-OpenStudio-InputReadBack-evidence/negatives/neg-zone-multiplier/report-approved.txt b/documentation/S09-OpenStudio-InputReadBack-evidence/negatives/neg-zone-multiplier/report-approved.txt new file mode 100644 index 0000000..be706b0 --- /dev/null +++ b/documentation/S09-OpenStudio-InputReadBack-evidence/negatives/neg-zone-multiplier/report-approved.txt @@ -0,0 +1,21 @@ +S09 OpenStudio read-back: s08-fix-box -> Fail (exit 10); rule set Approved; gate BlockedOwnerDecision; coverage Complete (316 required, 316 results) +outcomes: DocumentedDefault 1, MappingDifference 69, Match 220, NotApplicable 1, WithinTolerance 25 +D-F2 space:5080c000-0000-0000-0000-00000000c001: V2 +CONSISTENCY FAIL: multiplicity: IDF Zone 'SAM_ThermalZone_FixBox_5080c000' Multiplier 2: EnergyPlus multiplies the zone's floor area, loads and internal gains; SAM states one space and no multiplier +CONSISTENCY FAIL: multiplicity: zone 'SAM_ThermalZone_FixBox_5080c000' Multiplier 1 in the OSM, 2 in the IDF +NOT PASS DocumentedDefault / BlockedOwnerDecision: 1 + 4c space:5080c000-0000-0000-0000-00000000c001.ic.lighting.visible: SAM states no value and the native holds the contract-listed default. Not accepted by the owner. +NOT PASS MappingDifference / BlockedOwnerDecision: 69 + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer3.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer3.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer3.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:285a1884-d494-47a6-9541-942946ea00a7@space:5080c000-0000-0000-0000-00000000c001#layer1.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:285a1884-d494-47a6-9541-942946ea00a7@space:5080c000-0000-0000-0000-00000000c001#layer1.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:285a1884-d494-47a6-9541-942946ea00a7@space:5080c000-0000-0000-0000-00000000c001#layer1.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + ... 57 more in report.json diff --git a/documentation/S09-OpenStudio-InputReadBack-evidence/revision-10/README.md b/documentation/S09-OpenStudio-InputReadBack-evidence/revision-10/README.md new file mode 100644 index 0000000..7815e26 --- /dev/null +++ b/documentation/S09-OpenStudio-InputReadBack-evidence/revision-10/README.md @@ -0,0 +1,44 @@ +# S09 revision 10 evidence: review of revision 9 (group membership, shared equal-face edits) + +Revision 10 code: `78f10146481dbd4fe46af8761813fa4f9d58d357`. It addresses the two P1 importer findings of the independent +review of `806d5449` (code `354e5322`). The writer, the single-layer differing-face refusal (SAM-OS-MAT-003), S09, +lighting, ventilation and glazing are unchanged. The pre-existing multi-layer layer-order defect is unchanged and +still reproduces (see `probe-output.txt` and the proposal in the PR record). + +| File | Content | +|---|---| +| `test-summaries.txt` | S09, writer/importer and benchmark summaries at `78f1014`, and the A/B against `806d544` | +| `probe-output.txt` | the reviewer's revision-9 probe (`Program.cs` unchanged, copied outside the repository) run against the revision-10 binaries | + +## Findings and results + +1. **A malformed member was aliased to a valid group.** `Convert.ToSAM(Material)` now validates the object itself + (`ReadFaceObject`) before it looks up its source group, and returns the merged material only to a recorded member + (`OpenStudioImportContext.OpaqueMaterialGroups` keeps the validated members' handles). The reviewer's third object + (face `BROKEN`, conductivity 9) is now imported as its own material with conductivity 9, density 1000 and specific + heat 1200, and SAM-OSI-ID-001 names it; the valid Plasterboard pair still merges (conductivity 0.25). The same holds + for an identity that disagrees, a stamped optic that is not a fraction and a written record that disagrees with its + authored face, in both import orders. A well-formed third object with other thermal properties stops the merge of + the whole group (one conflict warning; each keeps its own properties). +2. **A shared equal-face edit was kept on one face only.** An edit is now kept on every SAM face the object supplies: + an internal variant the zone face; an external object of a material whose authored faces differ the external face; + an external object of a material whose faces agree the faces its construction positions expose (forward SAM + construction: last layer zone face, first layer outer face; the unstamped reverse mirrors it; other constructions' + exposed positions both faces; no exposed position: the external face and each stated internal one). The reviewer's + single-layer reproduction now imports 0.58 on both faces and re-exports valid with visible absorptance 0.42; no + SAM-OS-MAT-003. Genuine asymmetry (distinct variants) is kept. + +## Reproduce + +```text +dotnet build benchmark/SAM.Analytical.OpenStudio.InputReadBack.Tests/SAM.Analytical.OpenStudio.InputReadBack.Tests.csproj -c Release -p:Platform=x64 +dotnet build tests/SAM.Analytical.OpenStudio.Tests/SAM.Analytical.OpenStudio.Tests.csproj -c Release -p:Platform=x64 +dotnet build benchmark/SAM.Analytical.OpenStudio.Benchmark.Tests/SAM.Analytical.OpenStudio.Benchmark.Tests.csproj -c Release -p:Platform=x64 +dotnet test benchmark/SAM.Analytical.OpenStudio.InputReadBack.Tests/SAM.Analytical.OpenStudio.InputReadBack.Tests.csproj -c Release -p:Platform=x64 --no-build +dotnet test tests/SAM.Analytical.OpenStudio.Tests/SAM.Analytical.OpenStudio.Tests.csproj -c Release -p:Platform=x64 --no-build --filter 'TestCategory!=Simulation' +dotnet test benchmark/SAM.Analytical.OpenStudio.Benchmark.Tests/SAM.Analytical.OpenStudio.Benchmark.Tests.csproj -c Release -p:Platform=x64 --no-build --filter TestCategory!=Simulation +``` + +The probe needs the reviewer's `Probe.csproj`/`Program.cs` (machine-local, outside this repository; it references +`tests/SAM.Analytical.OpenStudio.Tests/bin/x64/Release/net8.0/SAM.*.dll` by absolute path and the cached OpenStudio +3.10.0 and NUnit packages): `dotnet run --project Probe.csproj -c Release -p:Platform=x64`. diff --git a/documentation/S09-OpenStudio-InputReadBack-evidence/revision-10/probe-output.txt b/documentation/S09-OpenStudio-InputReadBack-evidence/revision-10/probe-output.txt new file mode 100644 index 0000000..a8effb1 --- /dev/null +++ b/documentation/S09-OpenStudio-InputReadBack-evidence/revision-10/probe-output.txt @@ -0,0 +1,15 @@ +Reviewer revision-9 probe (Program.cs and Probe.csproj byte-identical to the review's revision-9-probe), run against +the revision-10 binaries built from 78f1014 (tests/SAM.Analytical.OpenStudio.Tests/bin/x64/Release/net8.0, SAM.Analytical.OpenStudio.dll sha256 5286c4ad...). +Command: dotnet run --project Probe.csproj -c Release -p:Platform=x64 (exit 0). ROUNDTRIP is the unchanged multi-layer layer-order defect. + +ROUNDTRIP before=SAM_OpaqueMaterial_Brick_100mm_33333333 -> SAM_OpaqueMaterial_Insulation_100mm_33333333 -> SAM_OpaqueMaterial_Plasterboard_12.5mm_Internal_33333333 +ROUNDTRIP importedInternalLight=0.5800000000000001 +ROUNDTRIP exportValid=True after=SAM_OpaqueMaterial_SAM_OpaqueMaterial_Plasterboard_12.5mm_Internal_33333333_12.5mm_33333333 -> SAM_OpaqueMaterial_SAM_OpaqueMaterial_Insulation_100mm_33333333_100mm_33333333 -> SAM_OpaqueMaterial_SAM_OpaqueMaterial_Brick_100mm_33333333_100mm_Internal_33333333 +ROUNDTRIP plasterboardVisibleAbs=0.7 +FALLBACK note=Zone face: InternalLightReflectance not stated (absent or NaN); the external-side value is written on the zone face and the internal value stays unspecified +MERGE plasterboardCount=1 +MALFORMED nativeName=ReviewerMalformedThirdFace nativeConductivity=9 importedName=ReviewerMalformedThirdFace importedConductivity=9 +MALFORMED diagnostics=SAM-OSI-ID-001:SAM face metadata is malformed (source material '33333333-0000-0000-0000-000000000003', face 'BROKEN'); the object is imported as its own material, never merged with others of its source, and its single EnergyPlus value is imported on both faces +EQUAL_FACE beforeValid=True beforeVisibleAbs=0.6 +EQUAL_FACE nativeVisibleAbs=0.42 internalReflectance=0.5800000000000001 externalReflectance=0.5800000000000001 +EQUAL_FACE afterValid=True errors= diff --git a/documentation/S09-OpenStudio-InputReadBack-evidence/revision-10/test-summaries.txt b/documentation/S09-OpenStudio-InputReadBack-evidence/revision-10/test-summaries.txt new file mode 100644 index 0000000..c9fedc1 --- /dev/null +++ b/documentation/S09-OpenStudio-InputReadBack-evidence/revision-10/test-summaries.txt @@ -0,0 +1,44 @@ +S09 revision 10 local test summaries (Release x64, SDK 10.0.401, SAM_Tas sow/2026-Q4 c50e9169) +Tested content 78f10146481dbd4fe46af8761813fa4f9d58d357. No engine, acceptance or packing script was run. +Built with dotnet build ... --no-restore (each project 2 warnings, 0 errors), then dotnet test --no-build. + +== S09 tests at 78f1014 +harness os-input-readback.dll 3589bc9cb86f79a32f81885bac39987e466e7961cbe22ed732092725713e7f22 +library SAM.Analytical.OpenStudio.InputReadBack.dll 40ee4c7d2aebb213b6f359c150d3d983fa956d8cacc548fe3db3a237b5998a40 +writer SAM.Analytical.OpenStudio.dll 5286c4aded80614b0788f3662b7fad6420517272aad7a81b5deb6e5ee7341bf8 +Passed! - Failed: 0, Passed: 97, Skipped: 0, Total: 97, Duration: 3 m 37 s - SAM.Analytical.OpenStudio.InputReadBack.Tests.dll (net8.0) +The box and two-zone fixture report.txt of this run (s09-runs/box-9c1ffd, two-43230f) are byte-identical to +revision-9/box-report-approved.txt and two-report-approved.txt (S09 does not use the OpenStudio importer). + +== Writer/importer tests/SAM.Analytical.OpenStudio.Tests --filter 'TestCategory!=Simulation' at 78f1014 +Passed! - Failed: 0, Passed: 432, Skipped: 2, Total: 434, Duration: 6 m 4 s - SAM.Analytical.OpenStudio.Tests.dll (net8.0) +(409 at revision 9 + 23 new OpaqueFaceOpticsTests cases. Before the commit the face-optics fixture alone ran 51/53: the two +whole-model cases used an unreferenced third object, which an AnalyticalModel library does not keep; the test now uses +it as the floor layer and both passed.) + +== Benchmark --filter TestCategory!=Simulation at 78f1014 +Passed! - Failed: 0, Passed: 51, Skipped: 0, Total: 51, Duration: 203 ms - SAM.Analytical.OpenStudio.Benchmark.Tests.dll (net8.0) + +== A/B: ToSAM/MaterialLibrary.cs and Classes/OpenStudioImportContext.cs of 806d544 restored (new tests kept) +OpaqueFaceOpticsTests: 53 total, 37 passed, 16 failed. Failing (the regressions): + Failed AMalformedObjectOfAMergedSource_IsImportedOnItsOwn_NeverAliasedToTheGroup("face",False) + Failed AMalformedObjectOfAMergedSource_IsImportedOnItsOwn_NeverAliasedToTheGroup("face",True) + Failed AMalformedObjectOfAMergedSource_IsImportedOnItsOwn_NeverAliasedToTheGroup("identity",False) + Failed AMalformedObjectOfAMergedSource_IsImportedOnItsOwn_NeverAliasedToTheGroup("identity",True) + Failed AMalformedObjectOfAMergedSource_IsImportedOnItsOwn_NeverAliasedToTheGroup("optic",False) + Failed AMalformedObjectOfAMergedSource_IsImportedOnItsOwn_NeverAliasedToTheGroup("optic",True) + Failed AMalformedObjectOfAMergedSource_IsImportedOnItsOwn_NeverAliasedToTheGroup("written",False) + Failed AMalformedObjectOfAMergedSource_IsImportedOnItsOwn_NeverAliasedToTheGroup("written",True) + Failed AMalformedObjectOfAMergedSource_KeepsItsOwnProperties_InAWholeModelImport("face") + Failed AMalformedObjectOfAMergedSource_KeepsItsOwnProperties_InAWholeModelImport("identity") + Failed AnEditOfASharedEqualFaceInterzoneMultiLayerObject_IsKeptOnItsFirstSpaceFace + Failed AnEditOfASharedEqualFaceInterzoneSingleLayerObject_IsKeptOnBothFaces(False) + Failed AnEditOfASharedEqualFaceInterzoneSingleLayerObject_IsKeptOnBothFaces(True) + Failed AnEditOfASharedEqualFaceMultiLayerObject_IsKeptOnTheFacesItsPositionExposes("Plasterboard",True,False) + Failed AnEditOfASharedEqualFaceMultiLayerObject_IsKeptOnTheFacesItsPositionExposes("Insulation",True,True) + Failed AnEditOfASharedEqualFaceSingleLayerObject_IsKeptOnBothFaces_AndReexportsValid +Passing under both (the 7 new controls): AConsistentlyStampedObjectWithOtherThermalProperties_StopsTheMerge(False, True), +TheValidPair_MergesInEitherImportOrder(False, True), AnUnchangedSharedEqualFaceSingleLayerObject_..., +AnEditOfASharedEqualFaceMultiLayerObject_...("Brick",False,True), AnEditOfADivergentMaterialsExternalObject_...; +and the 30 revision-9 tests. +The two files were restored from the working copy afterwards, rebuilt, and the final runs above use that build. diff --git a/documentation/S09-OpenStudio-InputReadBack-evidence/revision-11/README.md b/documentation/S09-OpenStudio-InputReadBack-evidence/revision-11/README.md new file mode 100644 index 0000000..bd15da8 --- /dev/null +++ b/documentation/S09-OpenStudio-InputReadBack-evidence/revision-11/README.md @@ -0,0 +1,55 @@ +# S09 revision 11 evidence: opaque multi-layer layer order on import + +Revision 11 code: see `test-summaries.txt` (the tested content SHA). It implements the owner-approved opaque-only +correction proposed in revision 10. Importer only; the writer, S09, revision 10, lighting, ventilation and the +single-layer safeguards are unchanged. + +| File | Content | +|---|---| +| `test-summaries.txt` | S09, writer/importer and benchmark summaries at the tested content, and the two A/B runs | +| `probe-output.txt` | the reviewer's revision-9 probe (unchanged, machine-local) run against the revision-11 binaries | +| `consistency-probe-output.txt` | the review of `89a2216`'s revision-11 consistency probe (unchanged, machine-local) run against `4ea2e6c`: the 12.5 mm / 20 mm interzone reproduction now SAM-OSI-CON-002, no model | + +## What changed + +1. **Layer order.** An opaque layered construction used by planar surfaces is read innermost layer first + (`ToSAM/Construction.cs`). Fenestration (glazing, gas, SAM door panes), subsurface-only (unstamped door panes), + shading-only, unused, air-boundary and non-layered constructions keep OpenStudio's order. A construction shared by + surfaces and a subsurface or shade is split and reported (SAM-OSI-APX-001). +2. **Orientation.** An interzone panel is built from the side carrying the SAM-written forward construction (also for + a geometric-fallback pair), and the spaces are added in a stable topological order that puts that side first, + because the writer reads a panel's first space from the cluster's space order. This is a deviation from the + proposal, which relied on the visit order; the geometric-fallback test with space B first failed without it. A + panel whose building side is then second is re-read from its partner (APX-001). +3. **Fail closed** (owner instruction after the first draft reported the ambiguous re-read as a warning only): every + imported opaque surface panel must reproduce its native layer order and the absorptances of every face EnergyPlus + uses; otherwise error SAM-OSI-CON-002 and no model (`Successful` false). Edited/mixed models whose orientation or face + roles would move a differing face, and contradictory forward sides, now fail named; equivalent cases succeed. +4. **Per-layer consistency** (`4ea2e6c`, the review of `89a2216`): each native StandardOpaqueMaterial layer's thickness, + conductivity, density and specific heat on both sides, in each side's direction, must be the SAM panel layer's. + Merged source names had hidden a 20 mm copy on one side of a 12.5 mm interzone wall; that now fails named. Valid + mirrors, repeated materials at two thicknesses, reuse in unrelated constructions, massless and air-gap layers are + unchanged (an imported air gap keeps its pre-existing 0 thickness, which the writer refuses on re-export). + +## Results + +- The reviewer's multi-layer reproduction: re-export Brick → Insulation → Plasterboard_Internal, Plasterboard zone face + 0.42 (`probe-output.txt`, `ROUNDTRIP` lines; revision 10 re-exported Plasterboard → Insulation → Brick_Internal, 0.7). +- 30 new cases (`M4/OpaqueLayerOrderImportTests.cs`) compare every surface's layer thicknesses and thermal properties and + both used faces' absorptances before and after export → import → export, or require the named CON-002 failure. +- Compatibility: models imported before revision 11 keep reversed constructions and are not migrated + (`docs/SAM_OPENSTUDIO_MATERIAL_MAPPING.md`). + +## Reproduce + +```text +dotnet build tests/SAM.Analytical.OpenStudio.Tests/SAM.Analytical.OpenStudio.Tests.csproj -c Release -p:Platform=x64 +dotnet test tests/SAM.Analytical.OpenStudio.Tests/SAM.Analytical.OpenStudio.Tests.csproj -c Release -p:Platform=x64 --no-build --filter 'TestCategory!=Simulation' +dotnet build benchmark/SAM.Analytical.OpenStudio.InputReadBack.Tests/SAM.Analytical.OpenStudio.InputReadBack.Tests.csproj -c Release -p:Platform=x64 +dotnet test benchmark/SAM.Analytical.OpenStudio.InputReadBack.Tests/SAM.Analytical.OpenStudio.InputReadBack.Tests.csproj -c Release -p:Platform=x64 --no-build +dotnet build benchmark/SAM.Analytical.OpenStudio.Benchmark.Tests/SAM.Analytical.OpenStudio.Benchmark.Tests.csproj -c Release -p:Platform=x64 +dotnet test benchmark/SAM.Analytical.OpenStudio.Benchmark.Tests/SAM.Analytical.OpenStudio.Benchmark.Tests.csproj -c Release -p:Platform=x64 --no-build --filter TestCategory!=Simulation +``` + +The A/B restores the listed files with `git show : > `, rebuilds, runs +`--filter "FullyQualifiedName~OpaqueLayerOrderImportTests"`, then restores the working files and rebuilds. diff --git a/documentation/S09-OpenStudio-InputReadBack-evidence/revision-11/consistency-probe-output.txt b/documentation/S09-OpenStudio-InputReadBack-evidence/revision-11/consistency-probe-output.txt new file mode 100644 index 0000000..427a0c1 --- /dev/null +++ b/documentation/S09-OpenStudio-InputReadBack-evidence/revision-11/consistency-probe-output.txt @@ -0,0 +1,10 @@ +The independent review's revision-11-consistency-probe (Program.cs and Probe.csproj byte-identical, machine-local), run +against the binaries built from 4ea2e6c (SAM.Analytical.OpenStudio.dll sha256 331ec187...). At the reviewed f5f207b it +printed importSuccessful=True with no error and re-exported 12.5 mm on both sides (its committed probe-output.txt). +Command: dotnet run --project Probe.csproj -c Release -p:Platform=x64 (exit 0). + +THICKNESS setLayers=True +THICKNESS native SAM_Space_Space_A_aaaaaaaa: SAM_OpaqueMaterial_Brick_100mm_33333333=0.1 -> SAM_OpaqueMaterial_Plasterboard_12.5mm_33333333=0.0125 -> SAM_OpaqueMaterial_Insulation_100mm_33333333=0.1 +THICKNESS native SAM_Space_Space_B_bbbbbbbb: SAM_OpaqueMaterial_Insulation_100mm_33333333=0.1 -> Reviewer_Plasterboard_20mm=0.02 -> SAM_OpaqueMaterial_Brick_100mm_33333333=0.1 +THICKNESS importSuccessful=False importValid=False +THICKNESS diagnostics=SAM-OSI-CON-002:Panel 'SAM_Construction_Sandwich_Forward_55555555' with construction 'SAM_Construction_Sandwich_Forward_55555555' cannot reproduce its native surfaces: layer 2 ('Reviewer_Plasterboard_20mm') of the surface in space 'SAM_Space_Space_B_bbbbbbbb' is 0.02 m thick but the SAM layer is 0.0125 m. One SAM panel cannot represent these surfaces of this (edited or mixed) model, so the import is unsuccessful rather than changing a layer or a face EnergyPlus uses diff --git a/documentation/S09-OpenStudio-InputReadBack-evidence/revision-11/probe-output.txt b/documentation/S09-OpenStudio-InputReadBack-evidence/revision-11/probe-output.txt new file mode 100644 index 0000000..728587d --- /dev/null +++ b/documentation/S09-OpenStudio-InputReadBack-evidence/revision-11/probe-output.txt @@ -0,0 +1,16 @@ +Reviewer revision-9 probe (unchanged, machine-local), run against the binaries built from 4ea2e6c (SAM.Analytical.OpenStudio.dll +sha256 331ec187...): ROUNDTRIP keeps Brick -> Insulation -> Plasterboard_Internal and the edited 0.42 zone face, and the +import succeeds; MALFORMED and EQUAL_FACE as at revision 10. +Command: dotnet run --project Probe.csproj -c Release -p:Platform=x64 (exit 0). + +ROUNDTRIP before=SAM_OpaqueMaterial_Brick_100mm_33333333 -> SAM_OpaqueMaterial_Insulation_100mm_33333333 -> SAM_OpaqueMaterial_Plasterboard_12.5mm_Internal_33333333 +ROUNDTRIP importedInternalLight=0.5800000000000001 +ROUNDTRIP exportValid=True after=SAM_OpaqueMaterial_SAM_OpaqueMaterial_Brick_100mm_33333333_100mm_33333333 -> SAM_OpaqueMaterial_SAM_OpaqueMaterial_Insulation_100mm_33333333_100mm_33333333 -> SAM_OpaqueMaterial_SAM_OpaqueMaterial_Plasterboard_12.5mm_Internal_33333333_12.5mm_Internal_33333333 +ROUNDTRIP plasterboardVisibleAbs=0.42 +FALLBACK note=Zone face: InternalLightReflectance not stated (absent or NaN); the external-side value is written on the zone face and the internal value stays unspecified +MERGE plasterboardCount=1 +MALFORMED nativeName=ReviewerMalformedThirdFace nativeConductivity=9 importedName=ReviewerMalformedThirdFace importedConductivity=9 +MALFORMED diagnostics=SAM-OSI-ID-001:SAM face metadata is malformed (source material '33333333-0000-0000-0000-000000000003', face 'BROKEN'); the object is imported as its own material, never merged with others of its source, and its single EnergyPlus value is imported on both faces +EQUAL_FACE beforeValid=True beforeVisibleAbs=0.6 +EQUAL_FACE nativeVisibleAbs=0.42 internalReflectance=0.5800000000000001 externalReflectance=0.5800000000000001 +EQUAL_FACE afterValid=True errors= diff --git a/documentation/S09-OpenStudio-InputReadBack-evidence/revision-11/test-summaries.txt b/documentation/S09-OpenStudio-InputReadBack-evidence/revision-11/test-summaries.txt new file mode 100644 index 0000000..8e7e433 --- /dev/null +++ b/documentation/S09-OpenStudio-InputReadBack-evidence/revision-11/test-summaries.txt @@ -0,0 +1,101 @@ +S09 revision 11 local test summaries (Release x64, SDK 10.0.401, SAM_Tas sow/2026-Q4 c50e9169) +Tested content 4ea2e6c2ac5805426ed1b39bdd5d88b39b1c723f (revision 11: 37841ea, 5241bdd, f5f207b, then the per-layer +consistency fix 4ea2e6c for the review of 89a2216). No engine, acceptance or packing script was run. Built with +dotnet build ... --no-restore (each project 2 warnings, 0 errors), then dotnet test --no-build. + +== S09 tests at 4ea2e6c +harness os-input-readback.dll 4f746d9aec6cfdac91773ebd6018b78b2444637fb07df52ad350e2edf476e799 +library SAM.Analytical.OpenStudio.InputReadBack.dll 0bf9fd32a965db4ab65dd45c2e8a27d9abb183f339d1fcbd39eede540f169a03 +writer SAM.Analytical.OpenStudio.dll 331ec187fcc722195868c2cfbb9717a567f7bdc1bbed08ca1ff18bb35e6a7865 +Passed! - Failed: 0, Passed: 97, Skipped: 0, Total: 97, Duration: 3 m 16 s - SAM.Analytical.OpenStudio.InputReadBack.Tests.dll (net8.0) +The box and two-zone fixture report.txt of this run (s09-runs/box-e75504, two-ca5763) are byte-identical to +revision-9/box-report-approved.txt and two-report-approved.txt. + +== Writer/importer --filter 'TestCategory!=Simulation' at 4ea2e6c +Passed! - Failed: 0, Passed: 471, Skipped: 2, Total: 473, Duration: 14 m 42 s - SAM.Analytical.OpenStudio.Tests.dll (net8.0) +(462 at f5f207b + 9 per-layer consistency cases; the 2 skipped are the pre-existing real-SQL fixtures.) + +== Benchmark --filter TestCategory!=Simulation at 4ea2e6c +Passed! - Failed: 0, Passed: 51, Skipped: 0, Total: 51, Duration: 311 ms - SAM.Analytical.OpenStudio.Benchmark.Tests.dll (net8.0) + +== D: f5f207b AnalyticalModel.cs (layer names only, no per-layer thickness) restored; the 9 new cases kept + build: 0 errors + Failed AnInterzoneSideWithAnotherLayerThickness_FailsNamed(False) + Failed AnInterzoneSideWithAnotherLayerThickness_FailsNamed(True) + Failed ARepeatedMaterialWithSwappedThicknessesOnOneSide_FailsNamed +Failed! - Failed: 3, Passed: 6, Skipped: 0, Total: 9, Duration: 1 m 21 s - SAM.Analytical.OpenStudio.Tests.dll (net8.0) +restored (cmp identical) +(D: the three regressions fail under the names-only check: each import succeeded with a changed layer thickness; the +six controls pass under both.) + +== Runs at f5f207b (the reviewed code of 89a2216; kept for continuity) +== S09 tests at f5f207b +harness os-input-readback.dll 6b4c510d87fe3a986cdce30d64d31408dbb733eecd3962463718de8f59d48a01 +library SAM.Analytical.OpenStudio.InputReadBack.dll c64d8cb585c54aa3b3e8d7241c5d947d049d1010e772f399875d7bbb5593a4fd +writer SAM.Analytical.OpenStudio.dll 209c519bce5cb90034d367dbb8cfcb19756b0c187e89ac804eac234055522244 +Passed! - Failed: 0, Passed: 97, Skipped: 0, Total: 97, Duration: 2 m 56 s - SAM.Analytical.OpenStudio.InputReadBack.Tests.dll (net8.0) +The box and two-zone fixture report.txt of this run (s09-runs/box-7a8b22, two-91a8de) are byte-identical to +revision-9/box-report-approved.txt and two-report-approved.txt (S09 does not use the OpenStudio importer). + +== Writer/importer tests/SAM.Analytical.OpenStudio.Tests --filter 'TestCategory!=Simulation' at f5f207b +Passed! - Failed: 0, Passed: 462, Skipped: 2, Total: 464, Duration: 12 m 24 s - SAM.Analytical.OpenStudio.Tests.dll (net8.0) +(432 at revision 10 + 30 OpaqueLayerOrderImportTests cases; the 2 skipped are the pre-existing real-SQL fixtures.) + +== Benchmark --filter TestCategory!=Simulation at f5f207b +Passed! - Failed: 0, Passed: 51, Skipped: 0, Total: 51, Duration: 285 ms - SAM.Analytical.OpenStudio.Benchmark.Tests.dll (net8.0) + +== Earlier revision-11 runs (superseded, recorded for completeness) +37841ea: S09 97/97; writer/importer 451 passed, 2 skipped; benchmark 51/51. The 432 existing writer/importer cases had +also passed with the reversal before the new tests existed: none asserted the old order. +5241bdd: S09 97/97; benchmark 51/51; writer/importer 451 passed, 1 failed, 2 skipped. The failure, +EveryDeclaredDiagnosticCode_Exists, came from editing tests/resources/openstudio-to-sam-coverage.json (declaring +SAM-OSI-CON-002 for the next commit) while that run was in progress: ReverseCoverageTests reads the manifest from the +source tree at run time. It passes at f5f207b, where the code exists. + +== A/B (OpaqueLayerOrderImportTests; `git show : > `, rebuild, run, restore, rebuild) +== A: revision-10 importer (93ec315) restored: Construction.cs, Panel.cs, AnalyticalModel.cs, OpenStudioImportContext.cs; the 20 new cases kept + build: 0 errors + Failed AConstructionSharedByWallsAndAShade_IsSplit_AndReported + Failed AGeometricFallbackPair_KeepsTheForwardSide(False) + Failed AGeometricFallbackPair_KeepsTheForwardSide(True) + Failed AGlazingConstruction_KeepsOpenStudiosPaneOrder + Failed AMultiLayerRoundTrip_KeepsLayersThicknessesAndBothUsedFaces(True) + Failed AMultiLayerRoundTrip_KeepsLayersThicknessesAndBothUsedFaces(False) + Failed AnAirBoundary_IsUnchanged + Failed AnInterzoneMultiLayerRoundTrip_KeepsTheFirstSpaceAndBothSides(False,False) + Failed AnInterzoneMultiLayerRoundTrip_KeepsTheFirstSpaceAndBothSides(True,False) + Failed AnInterzoneMultiLayerRoundTrip_KeepsTheFirstSpaceAndBothSides(False,True) + Failed AnInterzoneMultiLayerRoundTrip_KeepsTheFirstSpaceAndBothSides(True,True) + Failed AnOpaqueDoorPane_KeepsOpenStudiosOrder + Failed AnUnstampedHalfBuiltFromTheSecondSpace_IsReReadFromItsPartner(False) + Failed AnUnstampedHalfBuiltFromTheSecondSpace_IsReReadFromItsPartner(True) + Failed AnUnstampedNativeModel_RoundTripsItsLayersAndUsedFaces("box",False) + Failed AnUnstampedNativeModel_RoundTripsItsLayersAndUsedFaces("two",False) + Failed AnUnstampedNativeModel_RoundTripsItsLayersAndUsedFaces("two",True) + Failed ASingleLayerRoundTrip_IsUnchanged +Failed! - Failed: 18, Passed: 2, Skipped: 0, Total: 20, Duration: 30 s - SAM.Analytical.OpenStudio.Tests.dll (net8.0) +== B: revision-11 reversal kept, revision-10 AnalyticalModel.cs restored (no forward-side choice, space order or re-read) + build: 0 errors + Failed AnUnstampedHalfBuiltFromTheSecondSpace_IsReReadFromItsPartner(False) + Failed AnUnstampedHalfBuiltFromTheSecondSpace_IsReReadFromItsPartner(True) +Failed! - Failed: 2, Passed: 18, Skipped: 0, Total: 20, Duration: 3 m 22 s - SAM.Analytical.OpenStudio.Tests.dll (net8.0) +(A and B ran at 5241bdd's 20 cases. In A the glazing, door-pane and air-boundary controls fail only on their last line, +"the same model's walls are read innermost first" (Brick, not Plasterboard); their unchanged-path checks pass under +both, as do the shading-only and non-layered controls. The single-layer control fails under revision 10 only on the +box's multi-layer walls. In B the stamped interzone and fallback cases passed because OpenStudio's handle-based space +order matched the authored one in that run; during development, before OrderSpaces, the fallback case with B first +failed with both sides of the shared wall reversed.) +== C: 5241bdd AnalyticalModel.cs (warning-only re-read, no face check) restored; fail-closed tests kept + build: 0 errors + Failed AMixedModelWhoseUnstampedHalfIsReRead_KeepsItsUsedFaces_OrFailsNamed(False,True,False,False) + Failed AMixedModelWhoseUnstampedHalfIsReRead_KeepsItsUsedFaces_OrFailsNamed(True,True,False,False) + Failed AnUnstampedConstructionWithAFaceObjectInTheOtherRole_FailsNamed + Failed ContradictoryForwardSides_KeepTheUsedFaces_OrFailNamed(False,True,False) + Failed ContradictoryForwardSides_KeepTheUsedFaces_OrFailNamed(True,True,False) + Failed ContradictoryForwardSides_KeepTheUsedFaces_OrFailNamed(False,False,True) + Failed ContradictoryForwardSides_KeepTheUsedFaces_OrFailNamed(True,False,True) +Failed! - Failed: 7, Passed: 5, Skipped: 0, Total: 12, Duration: 2 m 25 s - SAM.Analytical.OpenStudio.Tests.dll (net8.0) +(C: under 5241bdd's warning-only re-read, the four divergent cases and the edited single-sided wall imported +"successfully" with a changed zone face, and the equal-face contradiction cases came back with reversed layers because +that revision did not re-read a SAM-written panel. The equivalent-success controls pass under both.) +After each A/B the files were restored (cmp identical) and rebuilt; the final runs above use that build. diff --git a/documentation/S09-OpenStudio-InputReadBack-evidence/revision-12/README.md b/documentation/S09-OpenStudio-InputReadBack-evidence/revision-12/README.md new file mode 100644 index 0000000..f6f45c9 --- /dev/null +++ b/documentation/S09-OpenStudio-InputReadBack-evidence/revision-12/README.md @@ -0,0 +1,43 @@ +# S09 revision 12 evidence: S07 §5.2 opaque optical face scope (amendment U1) + +S07 amendment U1 was approved by the merge of SAM#218 (`b06dbe8c6341a810af7bef7b08570a0ddad0c31c`; closeout +`0168d03f7e9e56775868aecaca73d8224a2034c5`). Revision 12 implements it in the S09 comparator and report only. Tested +content: `8edf793a63b274cafe5e55b9e85fa597d6307a10`. The writer, importer, CLI, the shared core (SAM_Tas `c50e9169`) and the fixtures are unchanged. + +| File | Content | +|---|---| +| `box-report-approved.txt`, `two-report-approved.txt` | each fixture's `report.txt` from the revision-12 S09 test session (byte-identical in two sessions) | +| `ab-pre-u1.txt` | the pre-U1 comparator (`adcad2f` library) on the same runs, against the U1 reports, with the method | +| `test-summaries.txt` | the S09, writer/importer and benchmark summaries and the DLL hashes | + +## Results + +| Fixture | Revision 11 | Revision 12 | +|---|---|---| +| `s08-fix-box` | BLOCKED owner, exit 12, 319/319; 69 MAPPING-DIFFERENCE | **PASS, exit 0**, 319/319; OUT-OF-ENGINE-SCOPE 105 (69 differing, 36 equal) | +| `s08-fix-two` | BLOCKED owner, exit 12, 592/592; 138 MAPPING-DIFFERENCE | **PASS, exit 0**, 592/592; OUT-OF-ENGINE-SCOPE 216 (138 differing, 78 equal) | + +- PASS here is scoped native-input conformance of the OpenStudio export to S07. It is not simulation equivalence, not a + Phase B PASS and not an owner acceptance of anything else. +- The differing rows are exactly the former MAPPING-DIFFERENCE rows. The equal rows are unused faces whose values agree; + before U1 they were MATCH or WITHIN-TOLERANCE. +- `report.txt` SHA-256: box `868a5808d4cc1a96513e54b8189e647c8f45f4375b058a940ac1dee719b959fe`, two-zone + `9e3a3f0ed0e2fd6d8703154a0cb71a69ffa10344d1e4e253c29886840a6c466d`. + +## Reproduce + +Build each project Release x64, then test without building: + +```text +dotnet build benchmark/SAM.Analytical.OpenStudio.InputReadBack.Tests/SAM.Analytical.OpenStudio.InputReadBack.Tests.csproj -c Release -p:Platform=x64 +dotnet test benchmark/SAM.Analytical.OpenStudio.InputReadBack.Tests/SAM.Analytical.OpenStudio.InputReadBack.Tests.csproj -c Release -p:Platform=x64 --no-build +dotnet build tests/SAM.Analytical.OpenStudio.Tests/SAM.Analytical.OpenStudio.Tests.csproj -c Release -p:Platform=x64 +dotnet test tests/SAM.Analytical.OpenStudio.Tests/SAM.Analytical.OpenStudio.Tests.csproj -c Release -p:Platform=x64 --no-build --filter 'TestCategory!=Simulation' +dotnet build benchmark/SAM.Analytical.OpenStudio.Benchmark.Tests/SAM.Analytical.OpenStudio.Benchmark.Tests.csproj -c Release -p:Platform=x64 +dotnet test benchmark/SAM.Analytical.OpenStudio.Benchmark.Tests/SAM.Analytical.OpenStudio.Benchmark.Tests.csproj -c Release -p:Platform=x64 --no-build --filter 'TestCategory!=Simulation' +``` + +Prerequisites (sibling checkouts, as in CI): SAM `sow/2026-Q4` built into `SAM/build`, SAM_Tas `sow/2026-Q4` +(`c50e9169`), and the SAM#212 Budapest EPW in the SAM checkout. Machine-local: the runs under +`benchmark/SAM.Analytical.OpenStudio.InputReadBack.Tests/bin/x64/Release/net8.0/s09-runs` (not committed). No engine, +simulation, sizing, acceptance or packing script was run; the tests export and translate with the OpenStudio SDK only. diff --git a/documentation/S09-OpenStudio-InputReadBack-evidence/revision-12/ab-pre-u1.txt b/documentation/S09-OpenStudio-InputReadBack-evidence/revision-12/ab-pre-u1.txt new file mode 100644 index 0000000..897e6a2 --- /dev/null +++ b/documentation/S09-OpenStudio-InputReadBack-evidence/revision-12/ab-pre-u1.txt @@ -0,0 +1,55 @@ +S09 revision 12 (S07 section 5.2, amendment U1) A/B: the pre-U1 comparator on the runs of the U1 S09 test session. + +Method (machine-local; no engine, no export, no simulation): +- pre-U1 library: benchmark/SAM.Analytical.OpenStudio.InputReadBack of adcad2f4383ab3763839e4a7e0a87c84d1468e4c, extracted with + git archive into a temporary sibling folder of the workspace (SAM-BIM/_s09_u1_ab, removed afterwards) and built Release x64 + (SAM.Analytical.OpenStudio.InputReadBack.dll 3f5748464c8710145525d81a9deaf1110d0cf2761123cc75758dbdc2e88c2c8c). +- harness: a copy of the U1 CLI output folder (os-input-readback.dll bb8431523c571d20f0a309a6b5cd88e3ddcdbfd3df74131e96f79dac4c68fb74; + the CLI source is unchanged since adcad2f) with only that library swapped in. +- for the newest run of each listed label under SAM.Analytical.OpenStudio.InputReadBack.Tests/bin/x64/Release/net8.0/s09-runs, + `os-input-readback compare --run --fixture-id --rule-set approved --out ` with the pre-U1 harness; + "U1" is the report.txt the U1 test session wrote for the same run. The runs themselves were not changed. + +Each line: run | pre-U1 exit and verdict (its MAPPING-DIFFERENCE count) | U1 verdict. +box-0740bb | pre-U1 exit 12: s08-fix-box -> BlockedOwnerDecision (exit 12); coverage Complete (319) (MappingDifference 69) | U1: s08-fix-box -> Pass (exit 0); coverage Complete (319); gated non-PASS 0; out-of-engine-scope 105 (informational, not gated) +box-p-0-9aa6a6 | pre-U1 exit 12: s08-fix-box -> BlockedOwnerDecision (exit 12); coverage Complete (319) (MappingDifference 69) | U1: s08-fix-box -> Pass (exit 0); coverage Complete (319); gated non-PASS 0; out-of-engine-scope 105 (informational, not gated) +box-p-1-7878be | pre-U1 exit 12: s08-fix-box -> BlockedOwnerDecision (exit 12); coverage Complete (319) (MappingDifference 69) | U1: s08-fix-box -> Pass (exit 0); coverage Complete (319); gated non-PASS 0; out-of-engine-scope 105 (informational, not gated) +box-p-zero-4c24cb | pre-U1 exit 12: s08-fix-box -> BlockedOwnerDecision (exit 12); coverage Complete (319) (MappingDifference 69) | U1: s08-fix-box -> Pass (exit 0); coverage Complete (319); gated non-PASS 0; out-of-engine-scope 105 (informational, not gated) +box-plasterboard-absorptance-2e66cf | pre-U1 exit 10: s08-fix-box -> Fail (exit 10); coverage Complete (319) (MappingDifference 65) | U1: s08-fix-box -> Fail (exit 10); coverage Complete (319); gated non-PASS 4; out-of-engine-scope 105 (informational, not gated) +box-single-floor-550bbb | pre-U1 exit 12: s08-fix-box -> BlockedOwnerDecision (exit 12); coverage Complete (299) (MappingDifference 63) | U1: s08-fix-box -> Pass (exit 0); coverage Complete (299); gated non-PASS 0; out-of-engine-scope 93 (informational, not gated) +box-unstated-light-absent-835771 | pre-U1 exit 10: s08-fix-box -> Fail (exit 10); coverage Complete (319) (MappingDifference 64) | U1: s08-fix-box -> Fail (exit 10); coverage Complete (319); gated non-PASS 5; out-of-engine-scope 105 (informational, not gated) +ctl-lighting-plenum-no-f97bc9 | pre-U1 exit 12: s08-fix-box -> BlockedOwnerDecision (exit 12); coverage Complete (319) (MappingDifference 69) | U1: s08-fix-box -> Pass (exit 0); coverage Complete (319); gated non-PASS 0; out-of-engine-scope 105 (informational, not gated) +swapped-zone-face-s08-fix-box-13c1c0 | pre-U1 exit 10: s08-fix-box -> Fail (exit 10); coverage Complete (319) (MappingDifference 51) | U1: s08-fix-box -> Fail (exit 10); coverage Complete (319); gated non-PASS 18; out-of-engine-scope 105 (informational, not gated) +swapped-zone-face-s08-fix-two-04ac95 | pre-U1 exit 10: s08-fix-two -> Fail (exit 10); coverage Complete (592) (MappingDifference 105) | U1: s08-fix-two -> Fail (exit 10); coverage Complete (592); gated non-PASS 33; out-of-engine-scope 216 (informational, not gated) +two-7aea83 | pre-U1 exit 12: s08-fix-two -> BlockedOwnerDecision (exit 12); coverage Complete (592) (MappingDifference 138) | U1: s08-fix-two -> Pass (exit 0); coverage Complete (592); gated non-PASS 0; out-of-engine-scope 216 (informational, not gated) +u1-adiabatic-4a57a6 | pre-U1 exit 12: s08-fix-box -> BlockedOwnerDecision (exit 12); coverage Complete (319) (MappingDifference 69) | U1: s08-fix-box -> Pass (exit 0); coverage Complete (319); gated non-PASS 0; out-of-engine-scope 108 (informational, not gated) +u1-adiabatic-as-ground-a0f8cb | pre-U1 exit 12: s08-fix-box -> BlockedOwnerDecision (exit 12); coverage Complete (319) (MappingDifference 69) | U1: s08-fix-box -> Fail (exit 10); coverage Complete (319); gated non-PASS 12; out-of-engine-scope 87 (informational, not gated) +u1-adiabatic-source-b1bd9f | pre-U1 exit 12: s08-fix-box -> BlockedOwnerDecision (exit 12); coverage Complete (319) (MappingDifference 69) | U1: s08-fix-box -> Pass (exit 0); coverage Complete (319); gated non-PASS 0; out-of-engine-scope 108 (informational, not gated) +u1-buried-thickness-99a5a0 | pre-U1 exit 10: s08-fix-box -> Fail (exit 10); coverage Complete (319) (MappingDifference 69) | U1: s08-fix-box -> Fail (exit 10); coverage Complete (319); gated non-PASS 1; out-of-engine-scope 105 (informational, not gated) +u1-ground-preprocessor-ec45b8 | pre-U1 exit 10: s08-fix-box -> Fail (exit 10); coverage Complete (319) (MappingDifference 69) | U1: s08-fix-box -> Fail (exit 10); coverage Complete (319); gated non-PASS 9; out-of-engine-scope 90 (informational, not gated) +u1-interzone-adiabatic-6334ab | pre-U1 exit 12: s08-fix-two -> BlockedOwnerDecision (exit 12); coverage Complete (592) (MappingDifference 138) | U1: s08-fix-two -> Fail (exit 10); coverage Complete (592); gated non-PASS 24; out-of-engine-scope 174 (informational, not gated) +u1-interzone-first-397ead | pre-U1 exit 10: s08-fix-two -> Fail (exit 10); coverage Complete (592) (MappingDifference 130) | U1: s08-fix-two -> Fail (exit 10); coverage Complete (592); gated non-PASS 7; out-of-engine-scope 216 (informational, not gated) +u1-interzone-not-mirrored-2585c1 | pre-U1 exit 10: s08-fix-two -> Fail (exit 10); coverage Complete (592) (MappingDifference 132) | U1: s08-fix-two -> Fail (exit 10); coverage Complete (592); gated non-PASS 38; out-of-engine-scope 174 (informational, not gated) +u1-interzone-partner-missing-1e11fd | pre-U1 exit 12: s08-fix-two -> BlockedOwnerDecision (exit 12); coverage Complete (592) (MappingDifference 138) | U1: s08-fix-two -> Fail (exit 10); coverage Complete (592); gated non-PASS 24; out-of-engine-scope 174 (informational, not gated) +u1-interzone-second-771897 | pre-U1 exit 10: s08-fix-two -> Fail (exit 10); coverage Complete (592) (MappingDifference 136) | U1: s08-fix-two -> Fail (exit 10); coverage Complete (592); gated non-PASS 1; out-of-engine-scope 216 (informational, not gated) +u1-native-1.25-00cc85 | pre-U1 exit 10: s08-fix-box -> Fail (exit 10); coverage Complete (319) (MappingDifference 68) | U1: s08-fix-box -> Fail (exit 10); coverage Complete (319); gated non-PASS 2; out-of-engine-scope 103 (informational, not gated) +u1-native-NaN-4ecaa6 | pre-U1 exit 10: s08-fix-box -> Fail (exit 10); coverage Complete (319) (MappingDifference 68) | U1: s08-fix-box -> Fail (exit 10); coverage Complete (319); gated non-PASS 2; out-of-engine-scope 103 (informational, not gated) +u1-native-abc-256cc0 | pre-U1 exit 11: s08-fix-box -> BlockedTechnical (exit 11); coverage Complete (319) (MappingDifference 68) | U1: s08-fix-box -> BlockedTechnical (exit 11); coverage Complete (319); gated non-PASS 2; out-of-engine-scope 103 (informational, not gated) +u1-native-blank-204083 | pre-U1 exit 10: s08-fix-box -> Fail (exit 10); coverage Complete (319) (MappingDifference 68) | U1: s08-fix-box -> Fail (exit 10); coverage Complete (319); gated non-PASS 2; out-of-engine-scope 103 (informational, not gated) +u1-neg-layer-conductivity-s08-fix-two-2637af | pre-U1 exit 10: s08-fix-two -> Fail (exit 10); coverage Complete (592) (MappingDifference 138) | U1: s08-fix-two -> Fail (exit 10); coverage Complete (592); gated non-PASS 6; out-of-engine-scope 216 (informational, not gated) +u1-neg-lighting-return-air-s08-fix-box-c10c67 | pre-U1 exit 10: s08-fix-box -> Fail (exit 10); coverage Complete (319) (MappingDifference 69) | U1: s08-fix-box -> Fail (exit 10); coverage Complete (319); gated non-PASS 2; out-of-engine-scope 105 (informational, not gated) +u1-outdoor-face-d9979c | pre-U1 exit 10: s08-fix-box -> Fail (exit 10); coverage Complete (319) (MappingDifference 68) | U1: s08-fix-box -> Fail (exit 10); coverage Complete (319); gated non-PASS 1; out-of-engine-scope 105 (informational, not gated) +u1-sam-absent-478aff | pre-U1 exit 10: s08-fix-box -> Fail (exit 10); coverage Complete (319) (MappingDifference 68) | U1: s08-fix-box -> Fail (exit 10); coverage Complete (319); gated non-PASS 1; out-of-engine-scope 104 (informational, not gated) +u1-sam-nan-3942f2 | pre-U1 exit 10: s08-fix-box -> Fail (exit 10); coverage Complete (319) (MappingDifference 68) | U1: s08-fix-box -> Fail (exit 10); coverage Complete (319); gated non-PASS 1; out-of-engine-scope 104 (informational, not gated) +u1-sam-out-of-domain-6ca6fd | pre-U1 exit 12: s08-fix-box -> BlockedOwnerDecision (exit 12); coverage Complete (319) (MappingDifference 69) | U1: s08-fix-box -> BlockedTechnical (exit 11); coverage Complete (319); gated non-PASS 1; out-of-engine-scope 104 (informational, not gated) +u1-zero-9932b9 | pre-U1 exit 10: s08-fix-box -> Fail (exit 10); coverage Complete (319) (MappingDifference 67) | U1: s08-fix-box -> Pass (exit 0); coverage Complete (319); gated non-PASS 0; out-of-engine-scope 105 (informational, not gated) + +Reading: +- Both fixtures and every valid variant (p = 0 / 1, authored p 0, plenum No control, single-layer ground floor, adiabatic + wall, authored-zero unused faces): pre-U1 BLOCKED owner (12) on the S09-only MAPPING-DIFFERENCE listing, or FAIL (10) for the + authored zero (S-ZERO was never listed); U1 PASS (0) with the rows OUT-OF-ENGINE-SCOPE. +- Undeterminable or contradictory face roles (adiabatic written as Ground, interzone partner missing, adiabatic interzone + panel) and an out-of-domain SAM value on an unused face: pre-U1 BLOCKED owner (12), hidden in the listing; U1 named + (Unsupported "optics role" / INPUT-INVALID) and gated: FAIL (10) or BLOCKED technical (11). +- Every used-face, thickness, conductivity, lighting and invalid-native case FAILs or BLOCKs under both; U1 keeps the same + exit and reports the gated rows apart from the informational ones. diff --git a/documentation/S09-OpenStudio-InputReadBack-evidence/revision-12/box-report-approved.txt b/documentation/S09-OpenStudio-InputReadBack-evidence/revision-12/box-report-approved.txt new file mode 100644 index 0000000..28008a5 --- /dev/null +++ b/documentation/S09-OpenStudio-InputReadBack-evidence/revision-12/box-report-approved.txt @@ -0,0 +1,17 @@ +S09 OpenStudio read-back: s08-fix-box -> Pass (exit 0); rule set Approved; gate Pass; coverage Complete (319 required, 319 results); gated non-PASS 0; out-of-engine-scope 105 (informational, not gated) +outcomes: AcceptedTransformation 4, Match 183, NotApplicable 1, OutOfEngineScope 105, WithinTolerance 26 +D-F2 space:5080c000-0000-0000-0000-00000000c001: V2 +OUT-OF-ENGINE-SCOPE (informational, not gated; S07 §5.2 amendment U1 (SAM#218 b06dbe8c)): 105 row(s), 69 differing, 36 equal; by scope: buried layer face 102, ground surface outer face 3; by property: externalEmissivity 18, externalLightReflectance 18, externalSolarReflectance 18, internalEmissivity 17, internalLightReflectance 17, internalSolarReflectance 17 + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.externalSolarReflectance: SAM 0.31, native 0.31000000000000005, |d| 5.551115123125783E-17 (WithinTolerance); ground surface outer face; SAM 'FIX_Concrete', native 'SAM_OpaqueMaterial_FIX_Concrete_150mm_9d3a3ab2' + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.internalSolarReflectance: SAM 0.29, native 0.31000000000000005, |d| 0.020000000000000073 (OutsideTolerance); buried layer face (layer 1 of 3, SAM internal face); SAM 'FIX_Concrete', native 'SAM_OpaqueMaterial_FIX_Concrete_150mm_9d3a3ab2' + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.externalLightReflectance: SAM 0.32, native 0.31999999999999995, |d| 5.551115123125783E-17 (WithinTolerance); ground surface outer face; SAM 'FIX_Concrete', native 'SAM_OpaqueMaterial_FIX_Concrete_150mm_9d3a3ab2' + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.internalLightReflectance: SAM 0.3, native 0.31999999999999995, |d| 0.019999999999999962 (OutsideTolerance); buried layer face (layer 1 of 3, SAM internal face); SAM 'FIX_Concrete', native 'SAM_OpaqueMaterial_FIX_Concrete_150mm_9d3a3ab2' + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.externalEmissivity: SAM 0.95, native 0.95, |d| 0 (Identical); ground surface outer face; SAM 'FIX_Concrete', native 'SAM_OpaqueMaterial_FIX_Concrete_150mm_9d3a3ab2' + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.internalEmissivity: SAM 0.87, native 0.95, |d| 0.07999999999999996 (OutsideTolerance); buried layer face (layer 1 of 3, SAM internal face); SAM 'FIX_Concrete', native 'SAM_OpaqueMaterial_FIX_Concrete_150mm_9d3a3ab2' + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.externalSolarReflectance: SAM 0.58, native 0.5800000000000001, |d| 1.1102230246251565E-16 (WithinTolerance); buried layer face (layer 2 of 3, SAM external face); SAM 'FIX_EPS', native 'SAM_OpaqueMaterial_FIX_EPS_120mm_23500162' + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.internalSolarReflectance: SAM 0.61, native 0.5800000000000001, |d| 0.029999999999999916 (OutsideTolerance); buried layer face (layer 2 of 3, SAM internal face); SAM 'FIX_EPS', native 'SAM_OpaqueMaterial_FIX_EPS_120mm_23500162' + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.externalLightReflectance: SAM 0.59, native 0.5900000000000001, |d| 1.1102230246251565E-16 (WithinTolerance); buried layer face (layer 2 of 3, SAM external face); SAM 'FIX_EPS', native 'SAM_OpaqueMaterial_FIX_EPS_120mm_23500162' + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.internalLightReflectance: SAM 0.63, native 0.5900000000000001, |d| 0.039999999999999925 (OutsideTolerance); buried layer face (layer 2 of 3, SAM internal face); SAM 'FIX_EPS', native 'SAM_OpaqueMaterial_FIX_EPS_120mm_23500162' + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.externalEmissivity: SAM 0.85, native 0.85, |d| 0 (Identical); buried layer face (layer 2 of 3, SAM external face); SAM 'FIX_EPS', native 'SAM_OpaqueMaterial_FIX_EPS_120mm_23500162' + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.internalEmissivity: SAM 0.96, native 0.85, |d| 0.10999999999999999 (OutsideTolerance); buried layer face (layer 2 of 3, SAM internal face); SAM 'FIX_EPS', native 'SAM_OpaqueMaterial_FIX_EPS_120mm_23500162' + ... 93 more in report.json diff --git a/documentation/S09-OpenStudio-InputReadBack-evidence/revision-12/test-summaries.txt b/documentation/S09-OpenStudio-InputReadBack-evidence/revision-12/test-summaries.txt new file mode 100644 index 0000000..e4d20b1 --- /dev/null +++ b/documentation/S09-OpenStudio-InputReadBack-evidence/revision-12/test-summaries.txt @@ -0,0 +1,27 @@ +S09 revision 12 local test summaries (Release x64, SDK 10.0.401, SAM sow/2026-Q4 0168d03f, SAM_Tas sow/2026-Q4 c50e9169) +Tested content 8edf793a63b274cafe5e55b9e85fa597d6307a10 (S07 section 5.2, amendment U1; the working tree that was built and +tested is this commit's content). No engine, simulation, sizing, acceptance or packing script was run. Each project was +built with dotnet build ... -c Release -p:Platform=x64 --no-restore (2 warnings, 0 errors each), then dotnet test --no-build. + +== S09 tests at 8edf793 +harness os-input-readback.dll bb8431523c571d20f0a309a6b5cd88e3ddcdbfd3df74131e96f79dac4c68fb74 +library SAM.Analytical.OpenStudio.InputReadBack.dll 46cd8fb60306e054038546bcc4842d2835a55eb7a5df5b093d7199741920fa3c +core SAM.Analytical.InputEquivalence.dll 0c01d8926bb07528eef38c69bf1e54bb9664849a850e8185e56b2e6dac77a7ac +writer SAM.Analytical.OpenStudio.dll 37226c49c9bc2c8fb80b4e906ce46d6bca7d3e4f2e086cb3883ea6f3df7ffb5d (writer source unchanged since 4ea2e6c) +Passed! - Failed: 0, Passed: 120, Skipped: 0, Total: 120, Duration: 4 m 53 s - SAM.Analytical.OpenStudio.InputReadBack.Tests.dll (net8.0) +(97 revision-11 cases, 6 of them with updated pre-U1 expectations, plus 23 new cases in OpaqueFaceScopeTests.cs.) +An earlier session at the same library failed 1 case, AnAdiabaticWall_HasItsOuterFaceOutOfEngineScope: the test picked a +wall with a window, which an adiabatic surface cannot keep. Only the test's wall selection changed (a wall without +apertures, also in the adiabatic-written-as-Ground case); the run above is the full suite after that change. +The fixture report.txt of both sessions are byte-identical (box 868a5808..., two-zone 9e3a3f0e...): revision-12/*.txt. + +== Writer/importer --filter 'TestCategory!=Simulation' at 8edf793 + Skipped RealSqlFixture_SpaceAndSurfaceResults_NoThrow [23 ms] + Skipped CreateDesignDays_RealSqlReproductionFixture_NoThrow [< 1 ms] +Passed! - Failed: 0, Passed: 471, Skipped: 2, Total: 473, Duration: 12 m 9 s - SAM.Analytical.OpenStudio.Tests.dll (net8.0) +(the 2 skipped are the pre-existing real-SQL fixtures; no writer, importer or writer-test file changed.) + +== Benchmark --filter 'TestCategory!=Simulation' at 8edf793 +Passed! - Failed: 0, Passed: 51, Skipped: 0, Total: 51, Duration: 184 ms - SAM.Analytical.OpenStudio.Benchmark.Tests.dll (net8.0) + +== A/B: see ab-pre-u1.txt diff --git a/documentation/S09-OpenStudio-InputReadBack-evidence/revision-12/two-report-approved.txt b/documentation/S09-OpenStudio-InputReadBack-evidence/revision-12/two-report-approved.txt new file mode 100644 index 0000000..6e84769 --- /dev/null +++ b/documentation/S09-OpenStudio-InputReadBack-evidence/revision-12/two-report-approved.txt @@ -0,0 +1,18 @@ +S09 OpenStudio read-back: s08-fix-two -> Pass (exit 0); rule set Approved; gate Pass; coverage Complete (592 required, 592 results); gated non-PASS 0; out-of-engine-scope 216 (informational, not gated) +outcomes: AcceptedTransformation 14, Match 319, NotApplicable 1, OutOfEngineScope 216, WithinTolerance 42 +D-F2 space:5080c000-0000-0000-0000-00000000c0a1: V1 +D-F2 space:5080c000-0000-0000-0000-00000000c0b1: V1 +OUT-OF-ENGINE-SCOPE (informational, not gated; S07 §5.2 amendment U1 (SAM#218 b06dbe8c)): 216 row(s), 138 differing, 78 equal; by scope: buried layer face 204, ground surface outer face 6, interzone surface outer face 6; by property: externalEmissivity 37, externalLightReflectance 37, externalSolarReflectance 37, internalEmissivity 35, internalLightReflectance 35, internalSolarReflectance 35 + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer1.externalSolarReflectance: SAM 0.31, native 0.31000000000000005, |d| 5.551115123125783E-17 (WithinTolerance); ground surface outer face; SAM 'FIX_Concrete', native 'SAM_OpaqueMaterial_FIX_Concrete_150mm_b313ccd6' + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer1.internalSolarReflectance: SAM 0.29, native 0.31000000000000005, |d| 0.020000000000000073 (OutsideTolerance); buried layer face (layer 1 of 3, SAM internal face); SAM 'FIX_Concrete', native 'SAM_OpaqueMaterial_FIX_Concrete_150mm_b313ccd6' + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer1.externalLightReflectance: SAM 0.32, native 0.31999999999999995, |d| 5.551115123125783E-17 (WithinTolerance); ground surface outer face; SAM 'FIX_Concrete', native 'SAM_OpaqueMaterial_FIX_Concrete_150mm_b313ccd6' + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer1.internalLightReflectance: SAM 0.3, native 0.31999999999999995, |d| 0.019999999999999962 (OutsideTolerance); buried layer face (layer 1 of 3, SAM internal face); SAM 'FIX_Concrete', native 'SAM_OpaqueMaterial_FIX_Concrete_150mm_b313ccd6' + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer1.externalEmissivity: SAM 0.95, native 0.95, |d| 0 (Identical); ground surface outer face; SAM 'FIX_Concrete', native 'SAM_OpaqueMaterial_FIX_Concrete_150mm_b313ccd6' + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer1.internalEmissivity: SAM 0.87, native 0.95, |d| 0.07999999999999996 (OutsideTolerance); buried layer face (layer 1 of 3, SAM internal face); SAM 'FIX_Concrete', native 'SAM_OpaqueMaterial_FIX_Concrete_150mm_b313ccd6' + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer2.externalSolarReflectance: SAM 0.58, native 0.5800000000000001, |d| 1.1102230246251565E-16 (WithinTolerance); buried layer face (layer 2 of 3, SAM external face); SAM 'FIX_EPS', native 'SAM_OpaqueMaterial_FIX_EPS_120mm_c3cb21c2' + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer2.internalSolarReflectance: SAM 0.61, native 0.5800000000000001, |d| 0.029999999999999916 (OutsideTolerance); buried layer face (layer 2 of 3, SAM internal face); SAM 'FIX_EPS', native 'SAM_OpaqueMaterial_FIX_EPS_120mm_c3cb21c2' + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer2.externalLightReflectance: SAM 0.59, native 0.5900000000000001, |d| 1.1102230246251565E-16 (WithinTolerance); buried layer face (layer 2 of 3, SAM external face); SAM 'FIX_EPS', native 'SAM_OpaqueMaterial_FIX_EPS_120mm_c3cb21c2' + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer2.internalLightReflectance: SAM 0.63, native 0.5900000000000001, |d| 0.039999999999999925 (OutsideTolerance); buried layer face (layer 2 of 3, SAM internal face); SAM 'FIX_EPS', native 'SAM_OpaqueMaterial_FIX_EPS_120mm_c3cb21c2' + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer2.externalEmissivity: SAM 0.85, native 0.85, |d| 0 (Identical); buried layer face (layer 2 of 3, SAM external face); SAM 'FIX_EPS', native 'SAM_OpaqueMaterial_FIX_EPS_120mm_c3cb21c2' + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer2.internalEmissivity: SAM 0.96, native 0.85, |d| 0.10999999999999999 (OutsideTolerance); buried layer face (layer 2 of 3, SAM internal face); SAM 'FIX_EPS', native 'SAM_OpaqueMaterial_FIX_EPS_120mm_c3cb21c2' + ... 204 more in report.json diff --git a/documentation/S09-OpenStudio-InputReadBack-evidence/revision-2/README.md b/documentation/S09-OpenStudio-InputReadBack-evidence/revision-2/README.md new file mode 100644 index 0000000..bf37e33 --- /dev/null +++ b/documentation/S09-OpenStudio-InputReadBack-evidence/revision-2/README.md @@ -0,0 +1,67 @@ +# S09 revision 2 evidence: multiplicity, orientation and the optics decision table + +Machine-local roots (not needed elsewhere; copy them before switching machines if they are wanted): +- `C:\TasOut\s09\acc2`: the revision-2 acceptance and negatives, packed into `../runs`, `../negatives` and + `../summary-*.json`. +- `C:\TasOut\s09\rev2-ab`: the before/after runs below. + +| Build | Harness `os-input-readback.dll` | Library `SAM.Analytical.OpenStudio.InputReadBack.dll` (= native.json `ReaderAssemblySha256`) | +|---|---|---| +| Reviewed head `d6d1cc5b` | `177d2b87e99f96dae7d371cbd6719db5cd01149366c80a2bc4a48864741f8b92` | `4c0cea58317ff68dd23e2eb821cc01bef6859989ffc398a02ce50ca5ea47b493` | +| Revision 2 (tested content) | `32090bbf4d7242fb5c9a1d4b176c7880aec1f214215529f66f76c8e114189a5a` | `5f279f12cb2b746850ac1bdb40cb1f9f9125e3b3d639fa195cb8a0a3da468549` | + +These are local Release x64 builds. A .NET DLL hash identifies a build on this machine only. + +## `ab/`: the same inputs, reviewed head against revision 2 + +Each input is a byte copy of a run folder (`frozen-model.json`, `weather.epw`, `model.osm`, `in.idf`, `export.json`). +Each binary runs `read --run ` and then +`compare --run --fixture-id --rule-set approved --out \compare-approved`, each a fresh process. +`ab/base//` and `ab/rev//` hold the two `report-approved.txt` files. + +| Input | Mutation (IDF / OSM sha256 prefix) | Reviewed head | Revision 2 | +|---|---|---|---| +| box | none, acc1 export (`737ea1f4…` / `53eafa9d…`) | BLOCKED owner, exit 12, 316/316 | BLOCKED owner, exit 12, 316/316 | +| two | none, acc1 export (`f0b9ca4b…` / `fc3114a7…`) | BLOCKED owner, exit 12, 586/586 | BLOCKED owner, exit 12, 586/586 | +| reviewer-zone-multiplier | the reviewer's copy: IDF Zone Multiplier 1 → 2 (`3e058814…`) | exit 12 | **FAIL, exit 10** | +| reviewer-window-multiplier | the reviewer's copy: both IDF window Multipliers → 2 (`87ed8ff5…`) | exit 12 | **FAIL, exit 10** | +| reviewer-building-north | the reviewer's copy: IDF Building North Axis → 90 (`ecafa1fb…`) | exit 12 | **FAIL, exit 10** | +| neg-zone-multiplier | IDF Zone Multiplier 1 → 2, OSM unchanged | exit 12 | **FAIL, exit 10** | +| neg-zone-multiplier-both | as above, plus OS:ThermalZone Multiplier → 2 | exit 12 | **FAIL, exit 10** | +| neg-window-multiplier | IDF window Multipliers → 2, OSM unchanged | exit 12 | **FAIL, exit 10** | +| neg-window-multiplier-both | as above, plus OS:SubSurface Multipliers → 2 | exit 12 | **FAIL, exit 10** | +| neg-north-axis | IDF Building North Axis → 90, OSM unchanged | exit 12 | **FAIL, exit 10** | +| neg-north-axis-both | as above, plus OS:Building North Axis → 90 | exit 12 | **FAIL, exit 10** | + +- **The reviewer's copies:** their IDFs differ from the committed box IDF only in the mutated lines. Their + `export.json` carries the reviewer's mutation label. +- **The `-both` cases:** the OSM and IDF agree, so the only consistency entries left are the checks against SAM intent + (`CONSISTENCY FAIL: multiplicity: … SAM states one … and no multiplier` and + `orientation: Zone '…' is rotated by 90 deg …; SAM states no rotation`). +- **The unchanged fixtures:** the outcome counts are identical between the two binaries. + +Reproduce, from the repository root: +1. Build `benchmark/SAM.Analytical.OpenStudio.InputReadBack.Cli` (Release x64) at each commit. +2. Generate each `neg-*` copy with the revision binary: + `os-input-readback negative --run /box --case --out `. +3. Run `read` and `compare` with each binary as above. + +## `optics-table/` and `optics-*.txt`: the OS-MAT-SINGLE-SIDED decision table + +`optics-table/` is a small evidence program. It is not part of the solution or CI. It runs the comparator +(`OsComparison.Run`, approved rules) on a run's `native.json` and prints every opaque layer of every zone side: +- which face is exposed; +- the SAM face that is physically needed there; +- SAM's external and internal values, the native values, and the delta at the exposed face; +- how many of that layer's internal-side rows are listed MAPPING-DIFFERENCE. + +```text +dotnet run -c Release -p:Platform=x64 --project documentation/S09-OpenStudio-InputReadBack-evidence/revision-2/optics-table -- benchmark/SAM.Analytical.OpenStudio.InputReadBack/Fixtures/s08-fix-box.json C:\TasOut\s09\acc2\box\native.json C:\TasOut\s09\acc2\box\weather.epw s08-fix-box +``` + +Results (the same on the acc2 and the A/B revision runs): +- **box:** 69 rows; 18 at an exposed face where SAM needs the internal value, 51 on buried, ground or + SAM-external faces. +- **two:** 138 rows; 33 exposed, 105 buried. + +The record (`../../S09-OpenStudio-InputReadBack-PR.md`) has the compact table and the EnergyPlus 25.1 grounding. diff --git a/documentation/S09-OpenStudio-InputReadBack-evidence/revision-2/ab/base/box/report-approved.txt b/documentation/S09-OpenStudio-InputReadBack-evidence/revision-2/ab/base/box/report-approved.txt new file mode 100644 index 0000000..4106fdc --- /dev/null +++ b/documentation/S09-OpenStudio-InputReadBack-evidence/revision-2/ab/base/box/report-approved.txt @@ -0,0 +1,19 @@ +S09 OpenStudio read-back: s08-fix-box -> BlockedOwnerDecision (exit 12); rule set Approved; gate BlockedOwnerDecision; coverage Complete (316 required, 316 results) +outcomes: DocumentedDefault 1, MappingDifference 69, Match 220, NotApplicable 1, WithinTolerance 25 +D-F2 space:5080c000-0000-0000-0000-00000000c001: V2 +NOT PASS DocumentedDefault / BlockedOwnerDecision: 1 + 4c space:5080c000-0000-0000-0000-00000000c001.ic.lighting.visible: SAM states no value and the native holds the contract-listed default. Not accepted by the owner. +NOT PASS MappingDifference / BlockedOwnerDecision: 69 + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer3.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer3.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer3.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:285a1884-d494-47a6-9541-942946ea00a7@space:5080c000-0000-0000-0000-00000000c001#layer1.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:285a1884-d494-47a6-9541-942946ea00a7@space:5080c000-0000-0000-0000-00000000c001#layer1.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:285a1884-d494-47a6-9541-942946ea00a7@space:5080c000-0000-0000-0000-00000000c001#layer1.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + ... 57 more in report.json diff --git a/documentation/S09-OpenStudio-InputReadBack-evidence/revision-2/ab/base/neg-north-axis-both/report-approved.txt b/documentation/S09-OpenStudio-InputReadBack-evidence/revision-2/ab/base/neg-north-axis-both/report-approved.txt new file mode 100644 index 0000000..4106fdc --- /dev/null +++ b/documentation/S09-OpenStudio-InputReadBack-evidence/revision-2/ab/base/neg-north-axis-both/report-approved.txt @@ -0,0 +1,19 @@ +S09 OpenStudio read-back: s08-fix-box -> BlockedOwnerDecision (exit 12); rule set Approved; gate BlockedOwnerDecision; coverage Complete (316 required, 316 results) +outcomes: DocumentedDefault 1, MappingDifference 69, Match 220, NotApplicable 1, WithinTolerance 25 +D-F2 space:5080c000-0000-0000-0000-00000000c001: V2 +NOT PASS DocumentedDefault / BlockedOwnerDecision: 1 + 4c space:5080c000-0000-0000-0000-00000000c001.ic.lighting.visible: SAM states no value and the native holds the contract-listed default. Not accepted by the owner. +NOT PASS MappingDifference / BlockedOwnerDecision: 69 + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer3.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer3.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer3.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:285a1884-d494-47a6-9541-942946ea00a7@space:5080c000-0000-0000-0000-00000000c001#layer1.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:285a1884-d494-47a6-9541-942946ea00a7@space:5080c000-0000-0000-0000-00000000c001#layer1.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:285a1884-d494-47a6-9541-942946ea00a7@space:5080c000-0000-0000-0000-00000000c001#layer1.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + ... 57 more in report.json diff --git a/documentation/S09-OpenStudio-InputReadBack-evidence/revision-2/ab/base/neg-north-axis/report-approved.txt b/documentation/S09-OpenStudio-InputReadBack-evidence/revision-2/ab/base/neg-north-axis/report-approved.txt new file mode 100644 index 0000000..4106fdc --- /dev/null +++ b/documentation/S09-OpenStudio-InputReadBack-evidence/revision-2/ab/base/neg-north-axis/report-approved.txt @@ -0,0 +1,19 @@ +S09 OpenStudio read-back: s08-fix-box -> BlockedOwnerDecision (exit 12); rule set Approved; gate BlockedOwnerDecision; coverage Complete (316 required, 316 results) +outcomes: DocumentedDefault 1, MappingDifference 69, Match 220, NotApplicable 1, WithinTolerance 25 +D-F2 space:5080c000-0000-0000-0000-00000000c001: V2 +NOT PASS DocumentedDefault / BlockedOwnerDecision: 1 + 4c space:5080c000-0000-0000-0000-00000000c001.ic.lighting.visible: SAM states no value and the native holds the contract-listed default. Not accepted by the owner. +NOT PASS MappingDifference / BlockedOwnerDecision: 69 + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer3.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer3.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer3.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:285a1884-d494-47a6-9541-942946ea00a7@space:5080c000-0000-0000-0000-00000000c001#layer1.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:285a1884-d494-47a6-9541-942946ea00a7@space:5080c000-0000-0000-0000-00000000c001#layer1.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:285a1884-d494-47a6-9541-942946ea00a7@space:5080c000-0000-0000-0000-00000000c001#layer1.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + ... 57 more in report.json diff --git a/documentation/S09-OpenStudio-InputReadBack-evidence/revision-2/ab/base/neg-window-multiplier-both/report-approved.txt b/documentation/S09-OpenStudio-InputReadBack-evidence/revision-2/ab/base/neg-window-multiplier-both/report-approved.txt new file mode 100644 index 0000000..4106fdc --- /dev/null +++ b/documentation/S09-OpenStudio-InputReadBack-evidence/revision-2/ab/base/neg-window-multiplier-both/report-approved.txt @@ -0,0 +1,19 @@ +S09 OpenStudio read-back: s08-fix-box -> BlockedOwnerDecision (exit 12); rule set Approved; gate BlockedOwnerDecision; coverage Complete (316 required, 316 results) +outcomes: DocumentedDefault 1, MappingDifference 69, Match 220, NotApplicable 1, WithinTolerance 25 +D-F2 space:5080c000-0000-0000-0000-00000000c001: V2 +NOT PASS DocumentedDefault / BlockedOwnerDecision: 1 + 4c space:5080c000-0000-0000-0000-00000000c001.ic.lighting.visible: SAM states no value and the native holds the contract-listed default. Not accepted by the owner. +NOT PASS MappingDifference / BlockedOwnerDecision: 69 + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer3.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer3.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer3.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:285a1884-d494-47a6-9541-942946ea00a7@space:5080c000-0000-0000-0000-00000000c001#layer1.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:285a1884-d494-47a6-9541-942946ea00a7@space:5080c000-0000-0000-0000-00000000c001#layer1.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:285a1884-d494-47a6-9541-942946ea00a7@space:5080c000-0000-0000-0000-00000000c001#layer1.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + ... 57 more in report.json diff --git a/documentation/S09-OpenStudio-InputReadBack-evidence/revision-2/ab/base/neg-window-multiplier/report-approved.txt b/documentation/S09-OpenStudio-InputReadBack-evidence/revision-2/ab/base/neg-window-multiplier/report-approved.txt new file mode 100644 index 0000000..4106fdc --- /dev/null +++ b/documentation/S09-OpenStudio-InputReadBack-evidence/revision-2/ab/base/neg-window-multiplier/report-approved.txt @@ -0,0 +1,19 @@ +S09 OpenStudio read-back: s08-fix-box -> BlockedOwnerDecision (exit 12); rule set Approved; gate BlockedOwnerDecision; coverage Complete (316 required, 316 results) +outcomes: DocumentedDefault 1, MappingDifference 69, Match 220, NotApplicable 1, WithinTolerance 25 +D-F2 space:5080c000-0000-0000-0000-00000000c001: V2 +NOT PASS DocumentedDefault / BlockedOwnerDecision: 1 + 4c space:5080c000-0000-0000-0000-00000000c001.ic.lighting.visible: SAM states no value and the native holds the contract-listed default. Not accepted by the owner. +NOT PASS MappingDifference / BlockedOwnerDecision: 69 + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer3.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer3.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer3.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:285a1884-d494-47a6-9541-942946ea00a7@space:5080c000-0000-0000-0000-00000000c001#layer1.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:285a1884-d494-47a6-9541-942946ea00a7@space:5080c000-0000-0000-0000-00000000c001#layer1.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:285a1884-d494-47a6-9541-942946ea00a7@space:5080c000-0000-0000-0000-00000000c001#layer1.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + ... 57 more in report.json diff --git a/documentation/S09-OpenStudio-InputReadBack-evidence/revision-2/ab/base/neg-zone-multiplier-both/report-approved.txt b/documentation/S09-OpenStudio-InputReadBack-evidence/revision-2/ab/base/neg-zone-multiplier-both/report-approved.txt new file mode 100644 index 0000000..4106fdc --- /dev/null +++ b/documentation/S09-OpenStudio-InputReadBack-evidence/revision-2/ab/base/neg-zone-multiplier-both/report-approved.txt @@ -0,0 +1,19 @@ +S09 OpenStudio read-back: s08-fix-box -> BlockedOwnerDecision (exit 12); rule set Approved; gate BlockedOwnerDecision; coverage Complete (316 required, 316 results) +outcomes: DocumentedDefault 1, MappingDifference 69, Match 220, NotApplicable 1, WithinTolerance 25 +D-F2 space:5080c000-0000-0000-0000-00000000c001: V2 +NOT PASS DocumentedDefault / BlockedOwnerDecision: 1 + 4c space:5080c000-0000-0000-0000-00000000c001.ic.lighting.visible: SAM states no value and the native holds the contract-listed default. Not accepted by the owner. +NOT PASS MappingDifference / BlockedOwnerDecision: 69 + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer3.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer3.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer3.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:285a1884-d494-47a6-9541-942946ea00a7@space:5080c000-0000-0000-0000-00000000c001#layer1.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:285a1884-d494-47a6-9541-942946ea00a7@space:5080c000-0000-0000-0000-00000000c001#layer1.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:285a1884-d494-47a6-9541-942946ea00a7@space:5080c000-0000-0000-0000-00000000c001#layer1.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + ... 57 more in report.json diff --git a/documentation/S09-OpenStudio-InputReadBack-evidence/revision-2/ab/base/neg-zone-multiplier/report-approved.txt b/documentation/S09-OpenStudio-InputReadBack-evidence/revision-2/ab/base/neg-zone-multiplier/report-approved.txt new file mode 100644 index 0000000..4106fdc --- /dev/null +++ b/documentation/S09-OpenStudio-InputReadBack-evidence/revision-2/ab/base/neg-zone-multiplier/report-approved.txt @@ -0,0 +1,19 @@ +S09 OpenStudio read-back: s08-fix-box -> BlockedOwnerDecision (exit 12); rule set Approved; gate BlockedOwnerDecision; coverage Complete (316 required, 316 results) +outcomes: DocumentedDefault 1, MappingDifference 69, Match 220, NotApplicable 1, WithinTolerance 25 +D-F2 space:5080c000-0000-0000-0000-00000000c001: V2 +NOT PASS DocumentedDefault / BlockedOwnerDecision: 1 + 4c space:5080c000-0000-0000-0000-00000000c001.ic.lighting.visible: SAM states no value and the native holds the contract-listed default. Not accepted by the owner. +NOT PASS MappingDifference / BlockedOwnerDecision: 69 + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer3.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer3.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer3.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:285a1884-d494-47a6-9541-942946ea00a7@space:5080c000-0000-0000-0000-00000000c001#layer1.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:285a1884-d494-47a6-9541-942946ea00a7@space:5080c000-0000-0000-0000-00000000c001#layer1.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:285a1884-d494-47a6-9541-942946ea00a7@space:5080c000-0000-0000-0000-00000000c001#layer1.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + ... 57 more in report.json diff --git a/documentation/S09-OpenStudio-InputReadBack-evidence/revision-2/ab/base/reviewer-building-north/report-approved.txt b/documentation/S09-OpenStudio-InputReadBack-evidence/revision-2/ab/base/reviewer-building-north/report-approved.txt new file mode 100644 index 0000000..4106fdc --- /dev/null +++ b/documentation/S09-OpenStudio-InputReadBack-evidence/revision-2/ab/base/reviewer-building-north/report-approved.txt @@ -0,0 +1,19 @@ +S09 OpenStudio read-back: s08-fix-box -> BlockedOwnerDecision (exit 12); rule set Approved; gate BlockedOwnerDecision; coverage Complete (316 required, 316 results) +outcomes: DocumentedDefault 1, MappingDifference 69, Match 220, NotApplicable 1, WithinTolerance 25 +D-F2 space:5080c000-0000-0000-0000-00000000c001: V2 +NOT PASS DocumentedDefault / BlockedOwnerDecision: 1 + 4c space:5080c000-0000-0000-0000-00000000c001.ic.lighting.visible: SAM states no value and the native holds the contract-listed default. Not accepted by the owner. +NOT PASS MappingDifference / BlockedOwnerDecision: 69 + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer3.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer3.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer3.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:285a1884-d494-47a6-9541-942946ea00a7@space:5080c000-0000-0000-0000-00000000c001#layer1.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:285a1884-d494-47a6-9541-942946ea00a7@space:5080c000-0000-0000-0000-00000000c001#layer1.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:285a1884-d494-47a6-9541-942946ea00a7@space:5080c000-0000-0000-0000-00000000c001#layer1.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + ... 57 more in report.json diff --git a/documentation/S09-OpenStudio-InputReadBack-evidence/revision-2/ab/base/reviewer-window-multiplier/report-approved.txt b/documentation/S09-OpenStudio-InputReadBack-evidence/revision-2/ab/base/reviewer-window-multiplier/report-approved.txt new file mode 100644 index 0000000..4106fdc --- /dev/null +++ b/documentation/S09-OpenStudio-InputReadBack-evidence/revision-2/ab/base/reviewer-window-multiplier/report-approved.txt @@ -0,0 +1,19 @@ +S09 OpenStudio read-back: s08-fix-box -> BlockedOwnerDecision (exit 12); rule set Approved; gate BlockedOwnerDecision; coverage Complete (316 required, 316 results) +outcomes: DocumentedDefault 1, MappingDifference 69, Match 220, NotApplicable 1, WithinTolerance 25 +D-F2 space:5080c000-0000-0000-0000-00000000c001: V2 +NOT PASS DocumentedDefault / BlockedOwnerDecision: 1 + 4c space:5080c000-0000-0000-0000-00000000c001.ic.lighting.visible: SAM states no value and the native holds the contract-listed default. Not accepted by the owner. +NOT PASS MappingDifference / BlockedOwnerDecision: 69 + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer3.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer3.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer3.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:285a1884-d494-47a6-9541-942946ea00a7@space:5080c000-0000-0000-0000-00000000c001#layer1.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:285a1884-d494-47a6-9541-942946ea00a7@space:5080c000-0000-0000-0000-00000000c001#layer1.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:285a1884-d494-47a6-9541-942946ea00a7@space:5080c000-0000-0000-0000-00000000c001#layer1.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + ... 57 more in report.json diff --git a/documentation/S09-OpenStudio-InputReadBack-evidence/revision-2/ab/base/reviewer-zone-multiplier/report-approved.txt b/documentation/S09-OpenStudio-InputReadBack-evidence/revision-2/ab/base/reviewer-zone-multiplier/report-approved.txt new file mode 100644 index 0000000..4106fdc --- /dev/null +++ b/documentation/S09-OpenStudio-InputReadBack-evidence/revision-2/ab/base/reviewer-zone-multiplier/report-approved.txt @@ -0,0 +1,19 @@ +S09 OpenStudio read-back: s08-fix-box -> BlockedOwnerDecision (exit 12); rule set Approved; gate BlockedOwnerDecision; coverage Complete (316 required, 316 results) +outcomes: DocumentedDefault 1, MappingDifference 69, Match 220, NotApplicable 1, WithinTolerance 25 +D-F2 space:5080c000-0000-0000-0000-00000000c001: V2 +NOT PASS DocumentedDefault / BlockedOwnerDecision: 1 + 4c space:5080c000-0000-0000-0000-00000000c001.ic.lighting.visible: SAM states no value and the native holds the contract-listed default. Not accepted by the owner. +NOT PASS MappingDifference / BlockedOwnerDecision: 69 + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer3.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer3.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer3.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:285a1884-d494-47a6-9541-942946ea00a7@space:5080c000-0000-0000-0000-00000000c001#layer1.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:285a1884-d494-47a6-9541-942946ea00a7@space:5080c000-0000-0000-0000-00000000c001#layer1.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:285a1884-d494-47a6-9541-942946ea00a7@space:5080c000-0000-0000-0000-00000000c001#layer1.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + ... 57 more in report.json diff --git a/documentation/S09-OpenStudio-InputReadBack-evidence/revision-2/ab/base/two/report-approved.txt b/documentation/S09-OpenStudio-InputReadBack-evidence/revision-2/ab/base/two/report-approved.txt new file mode 100644 index 0000000..f2e4848 --- /dev/null +++ b/documentation/S09-OpenStudio-InputReadBack-evidence/revision-2/ab/base/two/report-approved.txt @@ -0,0 +1,21 @@ +S09 OpenStudio read-back: s08-fix-two -> BlockedOwnerDecision (exit 12); rule set Approved; gate BlockedOwnerDecision; coverage Complete (586 required, 586 results) +outcomes: AcceptedTransformation 6, DocumentedDefault 2, MappingDifference 138, Match 393, NotApplicable 1, WithinTolerance 46 +D-F2 space:5080c000-0000-0000-0000-00000000c0a1: V1 +D-F2 space:5080c000-0000-0000-0000-00000000c0b1: V1 +NOT PASS DocumentedDefault / BlockedOwnerDecision: 2 + 4c space:5080c000-0000-0000-0000-00000000c0a1.ic.lighting.visible: SAM states no value and the native holds the contract-listed default. Not accepted by the owner. + 4c space:5080c000-0000-0000-0000-00000000c0b1.ic.lighting.visible: SAM states no value and the native holds the contract-listed default. Not accepted by the owner. +NOT PASS MappingDifference / BlockedOwnerDecision: 138 + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer1.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer1.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer1.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer2.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer2.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer2.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer3.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer3.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer3.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:fe8a6b43-ec73-4201-91e8-0dedf413b25c@space:5080c000-0000-0000-0000-00000000c0a1#layer1.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:fe8a6b43-ec73-4201-91e8-0dedf413b25c@space:5080c000-0000-0000-0000-00000000c0a1#layer1.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:fe8a6b43-ec73-4201-91e8-0dedf413b25c@space:5080c000-0000-0000-0000-00000000c0a1#layer1.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + ... 126 more in report.json diff --git a/documentation/S09-OpenStudio-InputReadBack-evidence/revision-2/ab/rev/box/report-approved.txt b/documentation/S09-OpenStudio-InputReadBack-evidence/revision-2/ab/rev/box/report-approved.txt new file mode 100644 index 0000000..4106fdc --- /dev/null +++ b/documentation/S09-OpenStudio-InputReadBack-evidence/revision-2/ab/rev/box/report-approved.txt @@ -0,0 +1,19 @@ +S09 OpenStudio read-back: s08-fix-box -> BlockedOwnerDecision (exit 12); rule set Approved; gate BlockedOwnerDecision; coverage Complete (316 required, 316 results) +outcomes: DocumentedDefault 1, MappingDifference 69, Match 220, NotApplicable 1, WithinTolerance 25 +D-F2 space:5080c000-0000-0000-0000-00000000c001: V2 +NOT PASS DocumentedDefault / BlockedOwnerDecision: 1 + 4c space:5080c000-0000-0000-0000-00000000c001.ic.lighting.visible: SAM states no value and the native holds the contract-listed default. Not accepted by the owner. +NOT PASS MappingDifference / BlockedOwnerDecision: 69 + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer3.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer3.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer3.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:285a1884-d494-47a6-9541-942946ea00a7@space:5080c000-0000-0000-0000-00000000c001#layer1.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:285a1884-d494-47a6-9541-942946ea00a7@space:5080c000-0000-0000-0000-00000000c001#layer1.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:285a1884-d494-47a6-9541-942946ea00a7@space:5080c000-0000-0000-0000-00000000c001#layer1.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + ... 57 more in report.json diff --git a/documentation/S09-OpenStudio-InputReadBack-evidence/revision-2/ab/rev/neg-north-axis-both/report-approved.txt b/documentation/S09-OpenStudio-InputReadBack-evidence/revision-2/ab/rev/neg-north-axis-both/report-approved.txt new file mode 100644 index 0000000..5dc9d14 --- /dev/null +++ b/documentation/S09-OpenStudio-InputReadBack-evidence/revision-2/ab/rev/neg-north-axis-both/report-approved.txt @@ -0,0 +1,20 @@ +S09 OpenStudio read-back: s08-fix-box -> Fail (exit 10); rule set Approved; gate BlockedOwnerDecision; coverage Complete (316 required, 316 results) +outcomes: DocumentedDefault 1, MappingDifference 69, Match 220, NotApplicable 1, WithinTolerance 25 +D-F2 space:5080c000-0000-0000-0000-00000000c001: V2 +CONSISTENCY FAIL: orientation: Zone 'SAM_ThermalZone_FixBox_5080c000' is rotated by 90 deg (Building North Axis 90 + Direction of Relative North 0; Relative coordinates); SAM states no rotation +NOT PASS DocumentedDefault / BlockedOwnerDecision: 1 + 4c space:5080c000-0000-0000-0000-00000000c001.ic.lighting.visible: SAM states no value and the native holds the contract-listed default. Not accepted by the owner. +NOT PASS MappingDifference / BlockedOwnerDecision: 69 + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer3.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer3.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer3.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:285a1884-d494-47a6-9541-942946ea00a7@space:5080c000-0000-0000-0000-00000000c001#layer1.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:285a1884-d494-47a6-9541-942946ea00a7@space:5080c000-0000-0000-0000-00000000c001#layer1.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:285a1884-d494-47a6-9541-942946ea00a7@space:5080c000-0000-0000-0000-00000000c001#layer1.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + ... 57 more in report.json diff --git a/documentation/S09-OpenStudio-InputReadBack-evidence/revision-2/ab/rev/neg-north-axis/report-approved.txt b/documentation/S09-OpenStudio-InputReadBack-evidence/revision-2/ab/rev/neg-north-axis/report-approved.txt new file mode 100644 index 0000000..2ec3833 --- /dev/null +++ b/documentation/S09-OpenStudio-InputReadBack-evidence/revision-2/ab/rev/neg-north-axis/report-approved.txt @@ -0,0 +1,21 @@ +S09 OpenStudio read-back: s08-fix-box -> Fail (exit 10); rule set Approved; gate BlockedOwnerDecision; coverage Complete (316 required, 316 results) +outcomes: DocumentedDefault 1, MappingDifference 69, Match 220, NotApplicable 1, WithinTolerance 25 +D-F2 space:5080c000-0000-0000-0000-00000000c001: V2 +CONSISTENCY FAIL: orientation: OS:Building North Axis 0 deg in the OSM, Building North Axis 90 deg in the IDF +CONSISTENCY FAIL: orientation: Zone 'SAM_ThermalZone_FixBox_5080c000' is rotated by 90 deg (Building North Axis 90 + Direction of Relative North 0; Relative coordinates); SAM states no rotation +NOT PASS DocumentedDefault / BlockedOwnerDecision: 1 + 4c space:5080c000-0000-0000-0000-00000000c001.ic.lighting.visible: SAM states no value and the native holds the contract-listed default. Not accepted by the owner. +NOT PASS MappingDifference / BlockedOwnerDecision: 69 + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer3.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer3.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer3.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:285a1884-d494-47a6-9541-942946ea00a7@space:5080c000-0000-0000-0000-00000000c001#layer1.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:285a1884-d494-47a6-9541-942946ea00a7@space:5080c000-0000-0000-0000-00000000c001#layer1.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:285a1884-d494-47a6-9541-942946ea00a7@space:5080c000-0000-0000-0000-00000000c001#layer1.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + ... 57 more in report.json diff --git a/documentation/S09-OpenStudio-InputReadBack-evidence/revision-2/ab/rev/neg-window-multiplier-both/report-approved.txt b/documentation/S09-OpenStudio-InputReadBack-evidence/revision-2/ab/rev/neg-window-multiplier-both/report-approved.txt new file mode 100644 index 0000000..0e1e8bf --- /dev/null +++ b/documentation/S09-OpenStudio-InputReadBack-evidence/revision-2/ab/rev/neg-window-multiplier-both/report-approved.txt @@ -0,0 +1,21 @@ +S09 OpenStudio read-back: s08-fix-box -> Fail (exit 10); rule set Approved; gate BlockedOwnerDecision; coverage Complete (316 required, 316 results) +outcomes: DocumentedDefault 1, MappingDifference 69, Match 220, NotApplicable 1, WithinTolerance 25 +D-F2 space:5080c000-0000-0000-0000-00000000c001: V2 +CONSISTENCY FAIL: multiplicity: IDF FenestrationSurface:Detailed 'SAM_SubSurface_FIX_WIN_UNFRAMED_0_6adea09c' Multiplier 2: EnergyPlus multiplies its area (frame and divider included); SAM states one aperture and no multiplier +CONSISTENCY FAIL: multiplicity: IDF FenestrationSurface:Detailed 'SAM_SubSurface_FIX_WIN_FRAMED_0_95717805' Multiplier 2: EnergyPlus multiplies its area (frame and divider included); SAM states one aperture and no multiplier +NOT PASS DocumentedDefault / BlockedOwnerDecision: 1 + 4c space:5080c000-0000-0000-0000-00000000c001.ic.lighting.visible: SAM states no value and the native holds the contract-listed default. Not accepted by the owner. +NOT PASS MappingDifference / BlockedOwnerDecision: 69 + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer3.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer3.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer3.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:285a1884-d494-47a6-9541-942946ea00a7@space:5080c000-0000-0000-0000-00000000c001#layer1.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:285a1884-d494-47a6-9541-942946ea00a7@space:5080c000-0000-0000-0000-00000000c001#layer1.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:285a1884-d494-47a6-9541-942946ea00a7@space:5080c000-0000-0000-0000-00000000c001#layer1.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + ... 57 more in report.json diff --git a/documentation/S09-OpenStudio-InputReadBack-evidence/revision-2/ab/rev/neg-window-multiplier/report-approved.txt b/documentation/S09-OpenStudio-InputReadBack-evidence/revision-2/ab/rev/neg-window-multiplier/report-approved.txt new file mode 100644 index 0000000..f7f7d57 --- /dev/null +++ b/documentation/S09-OpenStudio-InputReadBack-evidence/revision-2/ab/rev/neg-window-multiplier/report-approved.txt @@ -0,0 +1,23 @@ +S09 OpenStudio read-back: s08-fix-box -> Fail (exit 10); rule set Approved; gate BlockedOwnerDecision; coverage Complete (316 required, 316 results) +outcomes: DocumentedDefault 1, MappingDifference 69, Match 220, NotApplicable 1, WithinTolerance 25 +D-F2 space:5080c000-0000-0000-0000-00000000c001: V2 +CONSISTENCY FAIL: multiplicity: IDF FenestrationSurface:Detailed 'SAM_SubSurface_FIX_WIN_UNFRAMED_0_6adea09c' Multiplier 2: EnergyPlus multiplies its area (frame and divider included); SAM states one aperture and no multiplier +CONSISTENCY FAIL: multiplicity: subsurface 'SAM_SubSurface_FIX_WIN_UNFRAMED_0_6adea09c' Multiplier 1 in the OSM, 2 in the IDF +CONSISTENCY FAIL: multiplicity: IDF FenestrationSurface:Detailed 'SAM_SubSurface_FIX_WIN_FRAMED_0_95717805' Multiplier 2: EnergyPlus multiplies its area (frame and divider included); SAM states one aperture and no multiplier +CONSISTENCY FAIL: multiplicity: subsurface 'SAM_SubSurface_FIX_WIN_FRAMED_0_95717805' Multiplier 1 in the OSM, 2 in the IDF +NOT PASS DocumentedDefault / BlockedOwnerDecision: 1 + 4c space:5080c000-0000-0000-0000-00000000c001.ic.lighting.visible: SAM states no value and the native holds the contract-listed default. Not accepted by the owner. +NOT PASS MappingDifference / BlockedOwnerDecision: 69 + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer3.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer3.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer3.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:285a1884-d494-47a6-9541-942946ea00a7@space:5080c000-0000-0000-0000-00000000c001#layer1.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:285a1884-d494-47a6-9541-942946ea00a7@space:5080c000-0000-0000-0000-00000000c001#layer1.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:285a1884-d494-47a6-9541-942946ea00a7@space:5080c000-0000-0000-0000-00000000c001#layer1.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + ... 57 more in report.json diff --git a/documentation/S09-OpenStudio-InputReadBack-evidence/revision-2/ab/rev/neg-zone-multiplier-both/report-approved.txt b/documentation/S09-OpenStudio-InputReadBack-evidence/revision-2/ab/rev/neg-zone-multiplier-both/report-approved.txt new file mode 100644 index 0000000..7088564 --- /dev/null +++ b/documentation/S09-OpenStudio-InputReadBack-evidence/revision-2/ab/rev/neg-zone-multiplier-both/report-approved.txt @@ -0,0 +1,20 @@ +S09 OpenStudio read-back: s08-fix-box -> Fail (exit 10); rule set Approved; gate BlockedOwnerDecision; coverage Complete (316 required, 316 results) +outcomes: DocumentedDefault 1, MappingDifference 69, Match 220, NotApplicable 1, WithinTolerance 25 +D-F2 space:5080c000-0000-0000-0000-00000000c001: V2 +CONSISTENCY FAIL: multiplicity: IDF Zone 'SAM_ThermalZone_FixBox_5080c000' Multiplier 2: EnergyPlus multiplies the zone's floor area, loads and internal gains; SAM states one space and no multiplier +NOT PASS DocumentedDefault / BlockedOwnerDecision: 1 + 4c space:5080c000-0000-0000-0000-00000000c001.ic.lighting.visible: SAM states no value and the native holds the contract-listed default. Not accepted by the owner. +NOT PASS MappingDifference / BlockedOwnerDecision: 69 + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer3.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer3.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer3.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:285a1884-d494-47a6-9541-942946ea00a7@space:5080c000-0000-0000-0000-00000000c001#layer1.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:285a1884-d494-47a6-9541-942946ea00a7@space:5080c000-0000-0000-0000-00000000c001#layer1.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:285a1884-d494-47a6-9541-942946ea00a7@space:5080c000-0000-0000-0000-00000000c001#layer1.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + ... 57 more in report.json diff --git a/documentation/S09-OpenStudio-InputReadBack-evidence/revision-2/ab/rev/neg-zone-multiplier/report-approved.txt b/documentation/S09-OpenStudio-InputReadBack-evidence/revision-2/ab/rev/neg-zone-multiplier/report-approved.txt new file mode 100644 index 0000000..be706b0 --- /dev/null +++ b/documentation/S09-OpenStudio-InputReadBack-evidence/revision-2/ab/rev/neg-zone-multiplier/report-approved.txt @@ -0,0 +1,21 @@ +S09 OpenStudio read-back: s08-fix-box -> Fail (exit 10); rule set Approved; gate BlockedOwnerDecision; coverage Complete (316 required, 316 results) +outcomes: DocumentedDefault 1, MappingDifference 69, Match 220, NotApplicable 1, WithinTolerance 25 +D-F2 space:5080c000-0000-0000-0000-00000000c001: V2 +CONSISTENCY FAIL: multiplicity: IDF Zone 'SAM_ThermalZone_FixBox_5080c000' Multiplier 2: EnergyPlus multiplies the zone's floor area, loads and internal gains; SAM states one space and no multiplier +CONSISTENCY FAIL: multiplicity: zone 'SAM_ThermalZone_FixBox_5080c000' Multiplier 1 in the OSM, 2 in the IDF +NOT PASS DocumentedDefault / BlockedOwnerDecision: 1 + 4c space:5080c000-0000-0000-0000-00000000c001.ic.lighting.visible: SAM states no value and the native holds the contract-listed default. Not accepted by the owner. +NOT PASS MappingDifference / BlockedOwnerDecision: 69 + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer3.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer3.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer3.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:285a1884-d494-47a6-9541-942946ea00a7@space:5080c000-0000-0000-0000-00000000c001#layer1.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:285a1884-d494-47a6-9541-942946ea00a7@space:5080c000-0000-0000-0000-00000000c001#layer1.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:285a1884-d494-47a6-9541-942946ea00a7@space:5080c000-0000-0000-0000-00000000c001#layer1.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + ... 57 more in report.json diff --git a/documentation/S09-OpenStudio-InputReadBack-evidence/revision-2/ab/rev/reviewer-building-north/report-approved.txt b/documentation/S09-OpenStudio-InputReadBack-evidence/revision-2/ab/rev/reviewer-building-north/report-approved.txt new file mode 100644 index 0000000..2ec3833 --- /dev/null +++ b/documentation/S09-OpenStudio-InputReadBack-evidence/revision-2/ab/rev/reviewer-building-north/report-approved.txt @@ -0,0 +1,21 @@ +S09 OpenStudio read-back: s08-fix-box -> Fail (exit 10); rule set Approved; gate BlockedOwnerDecision; coverage Complete (316 required, 316 results) +outcomes: DocumentedDefault 1, MappingDifference 69, Match 220, NotApplicable 1, WithinTolerance 25 +D-F2 space:5080c000-0000-0000-0000-00000000c001: V2 +CONSISTENCY FAIL: orientation: OS:Building North Axis 0 deg in the OSM, Building North Axis 90 deg in the IDF +CONSISTENCY FAIL: orientation: Zone 'SAM_ThermalZone_FixBox_5080c000' is rotated by 90 deg (Building North Axis 90 + Direction of Relative North 0; Relative coordinates); SAM states no rotation +NOT PASS DocumentedDefault / BlockedOwnerDecision: 1 + 4c space:5080c000-0000-0000-0000-00000000c001.ic.lighting.visible: SAM states no value and the native holds the contract-listed default. Not accepted by the owner. +NOT PASS MappingDifference / BlockedOwnerDecision: 69 + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer3.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer3.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer3.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:285a1884-d494-47a6-9541-942946ea00a7@space:5080c000-0000-0000-0000-00000000c001#layer1.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:285a1884-d494-47a6-9541-942946ea00a7@space:5080c000-0000-0000-0000-00000000c001#layer1.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:285a1884-d494-47a6-9541-942946ea00a7@space:5080c000-0000-0000-0000-00000000c001#layer1.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + ... 57 more in report.json diff --git a/documentation/S09-OpenStudio-InputReadBack-evidence/revision-2/ab/rev/reviewer-window-multiplier/report-approved.txt b/documentation/S09-OpenStudio-InputReadBack-evidence/revision-2/ab/rev/reviewer-window-multiplier/report-approved.txt new file mode 100644 index 0000000..f7f7d57 --- /dev/null +++ b/documentation/S09-OpenStudio-InputReadBack-evidence/revision-2/ab/rev/reviewer-window-multiplier/report-approved.txt @@ -0,0 +1,23 @@ +S09 OpenStudio read-back: s08-fix-box -> Fail (exit 10); rule set Approved; gate BlockedOwnerDecision; coverage Complete (316 required, 316 results) +outcomes: DocumentedDefault 1, MappingDifference 69, Match 220, NotApplicable 1, WithinTolerance 25 +D-F2 space:5080c000-0000-0000-0000-00000000c001: V2 +CONSISTENCY FAIL: multiplicity: IDF FenestrationSurface:Detailed 'SAM_SubSurface_FIX_WIN_UNFRAMED_0_6adea09c' Multiplier 2: EnergyPlus multiplies its area (frame and divider included); SAM states one aperture and no multiplier +CONSISTENCY FAIL: multiplicity: subsurface 'SAM_SubSurface_FIX_WIN_UNFRAMED_0_6adea09c' Multiplier 1 in the OSM, 2 in the IDF +CONSISTENCY FAIL: multiplicity: IDF FenestrationSurface:Detailed 'SAM_SubSurface_FIX_WIN_FRAMED_0_95717805' Multiplier 2: EnergyPlus multiplies its area (frame and divider included); SAM states one aperture and no multiplier +CONSISTENCY FAIL: multiplicity: subsurface 'SAM_SubSurface_FIX_WIN_FRAMED_0_95717805' Multiplier 1 in the OSM, 2 in the IDF +NOT PASS DocumentedDefault / BlockedOwnerDecision: 1 + 4c space:5080c000-0000-0000-0000-00000000c001.ic.lighting.visible: SAM states no value and the native holds the contract-listed default. Not accepted by the owner. +NOT PASS MappingDifference / BlockedOwnerDecision: 69 + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer3.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer3.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer3.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:285a1884-d494-47a6-9541-942946ea00a7@space:5080c000-0000-0000-0000-00000000c001#layer1.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:285a1884-d494-47a6-9541-942946ea00a7@space:5080c000-0000-0000-0000-00000000c001#layer1.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:285a1884-d494-47a6-9541-942946ea00a7@space:5080c000-0000-0000-0000-00000000c001#layer1.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + ... 57 more in report.json diff --git a/documentation/S09-OpenStudio-InputReadBack-evidence/revision-2/ab/rev/reviewer-zone-multiplier/report-approved.txt b/documentation/S09-OpenStudio-InputReadBack-evidence/revision-2/ab/rev/reviewer-zone-multiplier/report-approved.txt new file mode 100644 index 0000000..be706b0 --- /dev/null +++ b/documentation/S09-OpenStudio-InputReadBack-evidence/revision-2/ab/rev/reviewer-zone-multiplier/report-approved.txt @@ -0,0 +1,21 @@ +S09 OpenStudio read-back: s08-fix-box -> Fail (exit 10); rule set Approved; gate BlockedOwnerDecision; coverage Complete (316 required, 316 results) +outcomes: DocumentedDefault 1, MappingDifference 69, Match 220, NotApplicable 1, WithinTolerance 25 +D-F2 space:5080c000-0000-0000-0000-00000000c001: V2 +CONSISTENCY FAIL: multiplicity: IDF Zone 'SAM_ThermalZone_FixBox_5080c000' Multiplier 2: EnergyPlus multiplies the zone's floor area, loads and internal gains; SAM states one space and no multiplier +CONSISTENCY FAIL: multiplicity: zone 'SAM_ThermalZone_FixBox_5080c000' Multiplier 1 in the OSM, 2 in the IDF +NOT PASS DocumentedDefault / BlockedOwnerDecision: 1 + 4c space:5080c000-0000-0000-0000-00000000c001.ic.lighting.visible: SAM states no value and the native holds the contract-listed default. Not accepted by the owner. +NOT PASS MappingDifference / BlockedOwnerDecision: 69 + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer3.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer3.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer3.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:285a1884-d494-47a6-9541-942946ea00a7@space:5080c000-0000-0000-0000-00000000c001#layer1.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:285a1884-d494-47a6-9541-942946ea00a7@space:5080c000-0000-0000-0000-00000000c001#layer1.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:285a1884-d494-47a6-9541-942946ea00a7@space:5080c000-0000-0000-0000-00000000c001#layer1.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + ... 57 more in report.json diff --git a/documentation/S09-OpenStudio-InputReadBack-evidence/revision-2/ab/rev/two/report-approved.txt b/documentation/S09-OpenStudio-InputReadBack-evidence/revision-2/ab/rev/two/report-approved.txt new file mode 100644 index 0000000..f2e4848 --- /dev/null +++ b/documentation/S09-OpenStudio-InputReadBack-evidence/revision-2/ab/rev/two/report-approved.txt @@ -0,0 +1,21 @@ +S09 OpenStudio read-back: s08-fix-two -> BlockedOwnerDecision (exit 12); rule set Approved; gate BlockedOwnerDecision; coverage Complete (586 required, 586 results) +outcomes: AcceptedTransformation 6, DocumentedDefault 2, MappingDifference 138, Match 393, NotApplicable 1, WithinTolerance 46 +D-F2 space:5080c000-0000-0000-0000-00000000c0a1: V1 +D-F2 space:5080c000-0000-0000-0000-00000000c0b1: V1 +NOT PASS DocumentedDefault / BlockedOwnerDecision: 2 + 4c space:5080c000-0000-0000-0000-00000000c0a1.ic.lighting.visible: SAM states no value and the native holds the contract-listed default. Not accepted by the owner. + 4c space:5080c000-0000-0000-0000-00000000c0b1.ic.lighting.visible: SAM states no value and the native holds the contract-listed default. Not accepted by the owner. +NOT PASS MappingDifference / BlockedOwnerDecision: 138 + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer1.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer1.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer1.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer2.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer2.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer2.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer3.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer3.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer3.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:fe8a6b43-ec73-4201-91e8-0dedf413b25c@space:5080c000-0000-0000-0000-00000000c0a1#layer1.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:fe8a6b43-ec73-4201-91e8-0dedf413b25c@space:5080c000-0000-0000-0000-00000000c0a1#layer1.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:fe8a6b43-ec73-4201-91e8-0dedf413b25c@space:5080c000-0000-0000-0000-00000000c0a1#layer1.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + ... 126 more in report.json diff --git a/documentation/S09-OpenStudio-InputReadBack-evidence/revision-2/optics-box.txt b/documentation/S09-OpenStudio-InputReadBack-evidence/revision-2/optics-box.txt new file mode 100644 index 0000000..dd67b0c --- /dev/null +++ b/documentation/S09-OpenStudio-InputReadBack-evidence/revision-2/optics-box.txt @@ -0,0 +1,25 @@ +fixture|zone|construction|panelType|kind|side|k/n|material(SAM)|face|needs SAM face|SAM ext rs/rv/e|SAM int rs/rv/e|native rs/rv/e|delta at face rs/rv/e|internal MD rows|exposed? +s08-fix-box|FixBox|FIX_GRD_FLOOR|SlabOnGrade|ground/adiabatic|first|1/3|FIX_Concrete|outer (ground/adiabatic: optics unused)|external|0.31/0.32/0.95|0.29/0.3/0.87|0.31/0.32/0.95|0/-0/0|3|buried +s08-fix-box|FixBox|FIX_GRD_FLOOR|SlabOnGrade|ground/adiabatic|first|2/3|FIX_EPS|buried|-|0.58/0.59/0.85|0.61/0.63/0.96|0.58/0.59/0.85|-|3|buried +s08-fix-box|FixBox|FIX_GRD_FLOOR|SlabOnGrade|ground/adiabatic|first|3/3|FIX_Screed|inner exposed (zone)|internal|0.27/0.28/0.94|0.33/0.34/0.9|0.27/0.28/0.94|-0.06/-0.06/0.04|3|exposed +s08-fix-box|FixBox|FIX_ROOF|Roof|external|first|1/4|FIX_Membrane|outer exposed (outdoors)|external|0.14/0.15/0.92|0.24/0.25/0.86|0.14/0.15/0.92|0/0/0|3|buried +s08-fix-box|FixBox|FIX_ROOF|Roof|external|first|2/4|FIX_OSB|buried|-|0.43/0.42/0.91|0.47/0.48/0.89|0.43/0.42/0.91|-|3|buried +s08-fix-box|FixBox|FIX_ROOF|Roof|external|first|3/4|FIX_PIR|buried|-|0.53/0.54/0.87|0.55/0.56/0.95|0.53/0.54/0.87|-|3|buried +s08-fix-box|FixBox|FIX_ROOF|Roof|external|first|4/4|FIX_Plasterboard|inner exposed (zone)|internal|0.62/0.64/0.9|0.68/0.7/0.91|0.62/0.64/0.9|-0.06/-0.06/-0.01|3|exposed +s08-fix-box|FixBox|FIX_EXT_WALL|WallExternal|external|first|1/4|FIX_Render|outer exposed (outdoors)|external|0.57/0.58/0.88|0.36/0.37/0.93|0.57/0.58/0.88|0/0/0|3|buried +s08-fix-box|FixBox|FIX_EXT_WALL|WallExternal|external|first|2/4|FIX_Blockwork|buried|-|0.38/0.39/0.93|0.44/0.46/0.94|0.38/0.39/0.93|-|3|buried +s08-fix-box|FixBox|FIX_EXT_WALL|WallExternal|external|first|3/4|FIX_MineralWool|buried|-|0.48/0.49/0.89|0.51/0.53/0.92|0.48/0.49/0.89|-|3|buried +s08-fix-box|FixBox|FIX_EXT_WALL|WallExternal|external|first|4/4|FIX_Plasterboard|inner exposed (zone)|internal|0.62/0.64/0.9|0.68/0.7/0.91|0.62/0.64/0.9|-0.06/-0.06/-0.01|3|exposed +s08-fix-box|FixBox|FIX_EXT_WALL|WallExternal|external|first|1/4|FIX_Render|outer exposed (outdoors)|external|0.57/0.58/0.88|0.36/0.37/0.93|0.57/0.58/0.88|0/0/0|3|buried +s08-fix-box|FixBox|FIX_EXT_WALL|WallExternal|external|first|2/4|FIX_Blockwork|buried|-|0.38/0.39/0.93|0.44/0.46/0.94|0.38/0.39/0.93|-|3|buried +s08-fix-box|FixBox|FIX_EXT_WALL|WallExternal|external|first|3/4|FIX_MineralWool|buried|-|0.48/0.49/0.89|0.51/0.53/0.92|0.48/0.49/0.89|-|3|buried +s08-fix-box|FixBox|FIX_EXT_WALL|WallExternal|external|first|4/4|FIX_Plasterboard|inner exposed (zone)|internal|0.62/0.64/0.9|0.68/0.7/0.91|0.62/0.64/0.9|-0.06/-0.06/-0.01|3|exposed +s08-fix-box|FixBox|FIX_EXT_WALL|WallExternal|external|first|1/4|FIX_Render|outer exposed (outdoors)|external|0.57/0.58/0.88|0.36/0.37/0.93|0.57/0.58/0.88|0/0/0|3|buried +s08-fix-box|FixBox|FIX_EXT_WALL|WallExternal|external|first|2/4|FIX_Blockwork|buried|-|0.38/0.39/0.93|0.44/0.46/0.94|0.38/0.39/0.93|-|3|buried +s08-fix-box|FixBox|FIX_EXT_WALL|WallExternal|external|first|3/4|FIX_MineralWool|buried|-|0.48/0.49/0.89|0.51/0.53/0.92|0.48/0.49/0.89|-|3|buried +s08-fix-box|FixBox|FIX_EXT_WALL|WallExternal|external|first|4/4|FIX_Plasterboard|inner exposed (zone)|internal|0.62/0.64/0.9|0.68/0.7/0.91|0.62/0.64/0.9|-0.06/-0.06/-0.01|3|exposed +s08-fix-box|FixBox|FIX_EXT_WALL|WallExternal|external|first|1/4|FIX_Render|outer exposed (outdoors)|external|0.57/0.58/0.88|0.36/0.37/0.93|0.57/0.58/0.88|0/0/0|3|buried +s08-fix-box|FixBox|FIX_EXT_WALL|WallExternal|external|first|2/4|FIX_Blockwork|buried|-|0.38/0.39/0.93|0.44/0.46/0.94|0.38/0.39/0.93|-|3|buried +s08-fix-box|FixBox|FIX_EXT_WALL|WallExternal|external|first|3/4|FIX_MineralWool|buried|-|0.48/0.49/0.89|0.51/0.53/0.92|0.48/0.49/0.89|-|3|buried +s08-fix-box|FixBox|FIX_EXT_WALL|WallExternal|external|first|4/4|FIX_Plasterboard|inner exposed (zone)|internal|0.62/0.64/0.9|0.68/0.7/0.91|0.62/0.64/0.9|-0.06/-0.06/-0.01|3|exposed +TOTAL internal-side MappingDifference rows 69: at an exposed face where SAM wants the internal value 18; buried or SAM-external face 51 diff --git a/documentation/S09-OpenStudio-InputReadBack-evidence/revision-2/optics-table/Program.cs b/documentation/S09-OpenStudio-InputReadBack-evidence/revision-2/optics-table/Program.cs new file mode 100644 index 0000000..afc5f22 --- /dev/null +++ b/documentation/S09-OpenStudio-InputReadBack-evidence/revision-2/optics-table/Program.cs @@ -0,0 +1,83 @@ +// SPDX-License-Identifier: LGPL-3.0-or-later +// Copyright (c) 2020–2026 Michal Dengusiak & Jakub Ziolkowski and contributors + +// S09 revision 2 evidence: the opaque optics decision table from the comparator's own rows. +using SAM.Analytical; +using SAM.Analytical.InputEquivalence; +using SAM.Analytical.OpenStudio.InputReadBack; +using SAM.Analytical.Tas.DirectT3D.Validation.ReadBack; +using System; +using System.Collections.Generic; +using System.Globalization; +using System.Linq; + +class P +{ + static readonly CultureInfo ci = CultureInfo.InvariantCulture; + static string F(double v) => double.IsNaN(v) ? "-" : v.ToString("0.###", ci); + static double Sam(ExpectedLayer l, string prop) + { + var m = l.Material as SAM.Core.Material; + Enum p = null; + switch (prop) + { + case "externalSolarReflectance": p = OpaqueMaterialParameter.ExternalSolarReflectance; break; + case "internalSolarReflectance": p = OpaqueMaterialParameter.InternalSolarReflectance; break; + case "externalLightReflectance": p = OpaqueMaterialParameter.ExternalLightReflectance; break; + case "internalLightReflectance": p = OpaqueMaterialParameter.InternalLightReflectance; break; + case "externalEmissivity": p = OpaqueMaterialParameter.ExternalEmissivity; break; + case "internalEmissivity": p = OpaqueMaterialParameter.InternalEmissivity; break; + } + return m != null && m.TryGetValue(p, out double v) ? v : double.NaN; + } + + static int Main(string[] a) + { + string fixture = a[0], native = a[1], epw = a[2], id = a[3]; + AnalyticalModel model = SAM.Core.Convert.ToSAM(fixture).Single(); + OsComparison cmp = OsComparison.Run(model, NativeSnapshot.Load(native), epw, id, GateRuleSet.Approved); + Dictionary rows = cmp.Results.ToDictionary(x => x.Input.ObjectKey + "|" + x.Definition.Id, x => x); + ExpectedModel e = ReadBackExpected.Build(model, null, id); + string[] props = { "SolarReflectance", "LightReflectance", "Emissivity" }; + int md = 0, mdExposed = 0, mdBuried = 0; + Console.WriteLine("fixture|zone|construction|panelType|kind|side|k/n|material(SAM)|face|needs SAM face|SAM ext rs/rv/e|SAM int rs/rv/e|native rs/rv/e|delta at face rs/rv/e|internal MD rows|exposed?"); + foreach (ExpectedSpace s in e.Spaces) + foreach (ExpectedPanel p in s.Panels) + { + bool first = p.SpaceOrder.Count == 0 || p.SpaceOrder[0] == s.Guid; + bool internalPanel = p.SpaceOrder.Count > 1; + bool ground = p.Adiabatic || p.PanelType == PanelType.SlabOnGrade || p.PanelType == PanelType.UndergroundSlab || p.PanelType == PanelType.UndergroundWall || p.PanelType == PanelType.UndergroundCeiling; + List layers = first ? Enumerable.Reverse(p.Layers).ToList() : p.Layers.ToList(); + string side = "panel:" + p.Guid.ToString("D") + "@space:" + s.Guid.ToString("D"); + int n = layers.Count; + for (int k = 1; k <= n; k++) + { + ExpectedLayer l = layers[k - 1]; + // Native order is outside first. The face towards the E+ outside of this side is SAM's external face on the + // first space's side and SAM's internal face on the other side; the zone-facing face is the opposite one. + string outerSam = first ? "external" : "internal"; + string innerSam = first ? "internal" : "external"; + int mdRows = props.Count(pr => rows.TryGetValue(side + "#layer" + k + ".internal" + pr + "|3a", out var r) && r.Input.Listing == ContractListing.MappingDifference); + md += mdRows; + List<(string face, string need)> faces = new List<(string, string)>(); + if (k == 1) faces.Add((ground ? "outer (ground/adiabatic: optics unused)" : internalPanel ? "outer (interzone: the other side's inner face governs)" : "outer exposed (outdoors)", outerSam)); + if (k == n) faces.Add(("inner exposed (zone)", innerSam)); + if (faces.Count == 0) faces.Add(("buried", "-")); + bool exposedInternal = faces.Any(f => f.face.StartsWith("inner exposed") && f.need == "internal") || faces.Any(f => f.face.StartsWith("outer exposed") && f.need == "internal"); + if (mdRows > 0) { if (exposedInternal) mdExposed += mdRows; else mdBuried += mdRows; } + foreach (var f in faces) + { + double[] ext = props.Select(pr => Sam(l, "external" + pr)).ToArray(); + double[] inn = props.Select(pr => Sam(l, "internal" + pr)).ToArray(); + double[] nat = props.Select(pr => { rows.TryGetValue(side + "#layer" + k + ".external" + pr + "|3a", out var r); return r?.Input.Native != null && r.Input.Native.HasNumber ? r.Input.Native.Value : double.NaN; }).ToArray(); + double[] need = f.need == "internal" ? inn : f.need == "external" ? ext : null; + string delta = need == null ? "-" : string.Join("/", Enumerable.Range(0, 3).Select(i => F(nat[i] - need[i]))); + Console.WriteLine(string.Join("|", id, s.Name, p.ConstructionName, p.PanelType, internalPanel ? "internal" : ground ? "ground/adiabatic" : "external", first ? "first" : "second", k + "/" + n, l.Name, f.face, f.need, + string.Join("/", ext.Select(F)), string.Join("/", inn.Select(F)), string.Join("/", nat.Select(F)), delta, mdRows, exposedInternal ? "exposed" : "buried")); + } + } + } + Console.WriteLine("TOTAL internal-side MappingDifference rows " + md + ": at an exposed face where SAM wants the internal value " + mdExposed + "; buried or SAM-external face " + mdBuried); + return 0; + } +} diff --git a/documentation/S09-OpenStudio-InputReadBack-evidence/revision-2/optics-table/optics-table.csproj b/documentation/S09-OpenStudio-InputReadBack-evidence/revision-2/optics-table/optics-table.csproj new file mode 100644 index 0000000..3b9ef85 --- /dev/null +++ b/documentation/S09-OpenStudio-InputReadBack-evidence/revision-2/optics-table/optics-table.csproj @@ -0,0 +1,27 @@ + + + + + + Exe + net8.0 + x64 + x64 + disable + disable + + + + + + ..\..\..\..\..\SAM\build\SAM.Core.dll + ..\..\..\..\..\SAM\build\SAM.Geometry.dll + ..\..\..\..\..\SAM\build\SAM.Analytical.dll + ..\..\..\..\..\SAM\build\SAM.Architectural.dll + ..\..\..\..\..\SAM\build\SAM.Weather.dll + + diff --git a/documentation/S09-OpenStudio-InputReadBack-evidence/revision-2/optics-two.txt b/documentation/S09-OpenStudio-InputReadBack-evidence/revision-2/optics-two.txt new file mode 100644 index 0000000..6e9152e --- /dev/null +++ b/documentation/S09-OpenStudio-InputReadBack-evidence/revision-2/optics-two.txt @@ -0,0 +1,48 @@ +fixture|zone|construction|panelType|kind|side|k/n|material(SAM)|face|needs SAM face|SAM ext rs/rv/e|SAM int rs/rv/e|native rs/rv/e|delta at face rs/rv/e|internal MD rows|exposed? +s08-fix-two|FixA|FIX_GRD_FLOOR|SlabOnGrade|ground/adiabatic|first|1/3|FIX_Concrete|outer (ground/adiabatic: optics unused)|external|0.31/0.32/0.95|0.29/0.3/0.87|0.31/0.32/0.95|0/-0/0|3|buried +s08-fix-two|FixA|FIX_GRD_FLOOR|SlabOnGrade|ground/adiabatic|first|2/3|FIX_EPS|buried|-|0.58/0.59/0.85|0.61/0.63/0.96|0.58/0.59/0.85|-|3|buried +s08-fix-two|FixA|FIX_GRD_FLOOR|SlabOnGrade|ground/adiabatic|first|3/3|FIX_Screed|inner exposed (zone)|internal|0.27/0.28/0.94|0.33/0.34/0.9|0.27/0.28/0.94|-0.06/-0.06/0.04|3|exposed +s08-fix-two|FixA|FIX_ROOF|Roof|external|first|1/4|FIX_Membrane|outer exposed (outdoors)|external|0.14/0.15/0.92|0.24/0.25/0.86|0.14/0.15/0.92|0/0/0|3|buried +s08-fix-two|FixA|FIX_ROOF|Roof|external|first|2/4|FIX_OSB|buried|-|0.43/0.42/0.91|0.47/0.48/0.89|0.43/0.42/0.91|-|3|buried +s08-fix-two|FixA|FIX_ROOF|Roof|external|first|3/4|FIX_PIR|buried|-|0.53/0.54/0.87|0.55/0.56/0.95|0.53/0.54/0.87|-|3|buried +s08-fix-two|FixA|FIX_ROOF|Roof|external|first|4/4|FIX_Plasterboard|inner exposed (zone)|internal|0.62/0.64/0.9|0.68/0.7/0.91|0.62/0.64/0.9|-0.06/-0.06/-0.01|3|exposed +s08-fix-two|FixA|FIX_EXT_WALL|WallExternal|external|first|1/4|FIX_Render|outer exposed (outdoors)|external|0.57/0.58/0.88|0.36/0.37/0.93|0.57/0.58/0.88|0/0/0|3|buried +s08-fix-two|FixA|FIX_EXT_WALL|WallExternal|external|first|2/4|FIX_Blockwork|buried|-|0.38/0.39/0.93|0.44/0.46/0.94|0.38/0.39/0.93|-|3|buried +s08-fix-two|FixA|FIX_EXT_WALL|WallExternal|external|first|3/4|FIX_MineralWool|buried|-|0.48/0.49/0.89|0.51/0.53/0.92|0.48/0.49/0.89|-|3|buried +s08-fix-two|FixA|FIX_EXT_WALL|WallExternal|external|first|4/4|FIX_Plasterboard|inner exposed (zone)|internal|0.62/0.64/0.9|0.68/0.7/0.91|0.62/0.64/0.9|-0.06/-0.06/-0.01|3|exposed +s08-fix-two|FixA|FIX_EXT_WALL|WallExternal|external|first|1/4|FIX_Render|outer exposed (outdoors)|external|0.57/0.58/0.88|0.36/0.37/0.93|0.57/0.58/0.88|0/0/0|3|buried +s08-fix-two|FixA|FIX_EXT_WALL|WallExternal|external|first|2/4|FIX_Blockwork|buried|-|0.38/0.39/0.93|0.44/0.46/0.94|0.38/0.39/0.93|-|3|buried +s08-fix-two|FixA|FIX_EXT_WALL|WallExternal|external|first|3/4|FIX_MineralWool|buried|-|0.48/0.49/0.89|0.51/0.53/0.92|0.48/0.49/0.89|-|3|buried +s08-fix-two|FixA|FIX_EXT_WALL|WallExternal|external|first|4/4|FIX_Plasterboard|inner exposed (zone)|internal|0.62/0.64/0.9|0.68/0.7/0.91|0.62/0.64/0.9|-0.06/-0.06/-0.01|3|exposed +s08-fix-two|FixA|FIX_EXT_WALL|WallExternal|external|first|1/4|FIX_Render|outer exposed (outdoors)|external|0.57/0.58/0.88|0.36/0.37/0.93|0.57/0.58/0.88|0/0/0|3|buried +s08-fix-two|FixA|FIX_EXT_WALL|WallExternal|external|first|2/4|FIX_Blockwork|buried|-|0.38/0.39/0.93|0.44/0.46/0.94|0.38/0.39/0.93|-|3|buried +s08-fix-two|FixA|FIX_EXT_WALL|WallExternal|external|first|3/4|FIX_MineralWool|buried|-|0.48/0.49/0.89|0.51/0.53/0.92|0.48/0.49/0.89|-|3|buried +s08-fix-two|FixA|FIX_EXT_WALL|WallExternal|external|first|4/4|FIX_Plasterboard|inner exposed (zone)|internal|0.62/0.64/0.9|0.68/0.7/0.91|0.62/0.64/0.9|-0.06/-0.06/-0.01|3|exposed +s08-fix-two|FixA|FIX_PARTITION|WallInternal|internal|first|1/4|FIX_Timber|outer (interzone: the other side's inner face governs)|external|0.41/0.4/0.86|0.39/0.38/0.88|0.41/0.4/0.86|0/0/0|3|buried +s08-fix-two|FixA|FIX_PARTITION|WallInternal|internal|first|2/4|FIX_Stud|buried|-|0.66/0.67/0.84|0.64/0.65/0.83|0.66/0.67/0.84|-|3|buried +s08-fix-two|FixA|FIX_PARTITION|WallInternal|internal|first|3/4|FIX_MineralWool|buried|-|0.48/0.49/0.89|0.51/0.53/0.92|0.48/0.49/0.89|-|3|buried +s08-fix-two|FixA|FIX_PARTITION|WallInternal|internal|first|4/4|FIX_Plasterboard|inner exposed (zone)|internal|0.62/0.64/0.9|0.68/0.7/0.91|0.62/0.64/0.9|-0.06/-0.06/-0.01|3|exposed +s08-fix-two|FixB|FIX_GRD_FLOOR|SlabOnGrade|ground/adiabatic|first|1/3|FIX_Concrete|outer (ground/adiabatic: optics unused)|external|0.31/0.32/0.95|0.29/0.3/0.87|0.31/0.32/0.95|0/-0/0|3|buried +s08-fix-two|FixB|FIX_GRD_FLOOR|SlabOnGrade|ground/adiabatic|first|2/3|FIX_EPS|buried|-|0.58/0.59/0.85|0.61/0.63/0.96|0.58/0.59/0.85|-|3|buried +s08-fix-two|FixB|FIX_GRD_FLOOR|SlabOnGrade|ground/adiabatic|first|3/3|FIX_Screed|inner exposed (zone)|internal|0.27/0.28/0.94|0.33/0.34/0.9|0.27/0.28/0.94|-0.06/-0.06/0.04|3|exposed +s08-fix-two|FixB|FIX_ROOF|Roof|external|first|1/4|FIX_Membrane|outer exposed (outdoors)|external|0.14/0.15/0.92|0.24/0.25/0.86|0.14/0.15/0.92|0/0/0|3|buried +s08-fix-two|FixB|FIX_ROOF|Roof|external|first|2/4|FIX_OSB|buried|-|0.43/0.42/0.91|0.47/0.48/0.89|0.43/0.42/0.91|-|3|buried +s08-fix-two|FixB|FIX_ROOF|Roof|external|first|3/4|FIX_PIR|buried|-|0.53/0.54/0.87|0.55/0.56/0.95|0.53/0.54/0.87|-|3|buried +s08-fix-two|FixB|FIX_ROOF|Roof|external|first|4/4|FIX_Plasterboard|inner exposed (zone)|internal|0.62/0.64/0.9|0.68/0.7/0.91|0.62/0.64/0.9|-0.06/-0.06/-0.01|3|exposed +s08-fix-two|FixB|FIX_EXT_WALL|WallExternal|external|first|1/4|FIX_Render|outer exposed (outdoors)|external|0.57/0.58/0.88|0.36/0.37/0.93|0.57/0.58/0.88|0/0/0|3|buried +s08-fix-two|FixB|FIX_EXT_WALL|WallExternal|external|first|2/4|FIX_Blockwork|buried|-|0.38/0.39/0.93|0.44/0.46/0.94|0.38/0.39/0.93|-|3|buried +s08-fix-two|FixB|FIX_EXT_WALL|WallExternal|external|first|3/4|FIX_MineralWool|buried|-|0.48/0.49/0.89|0.51/0.53/0.92|0.48/0.49/0.89|-|3|buried +s08-fix-two|FixB|FIX_EXT_WALL|WallExternal|external|first|4/4|FIX_Plasterboard|inner exposed (zone)|internal|0.62/0.64/0.9|0.68/0.7/0.91|0.62/0.64/0.9|-0.06/-0.06/-0.01|3|exposed +s08-fix-two|FixB|FIX_EXT_WALL|WallExternal|external|first|1/4|FIX_Render|outer exposed (outdoors)|external|0.57/0.58/0.88|0.36/0.37/0.93|0.57/0.58/0.88|0/0/0|3|buried +s08-fix-two|FixB|FIX_EXT_WALL|WallExternal|external|first|2/4|FIX_Blockwork|buried|-|0.38/0.39/0.93|0.44/0.46/0.94|0.38/0.39/0.93|-|3|buried +s08-fix-two|FixB|FIX_EXT_WALL|WallExternal|external|first|3/4|FIX_MineralWool|buried|-|0.48/0.49/0.89|0.51/0.53/0.92|0.48/0.49/0.89|-|3|buried +s08-fix-two|FixB|FIX_EXT_WALL|WallExternal|external|first|4/4|FIX_Plasterboard|inner exposed (zone)|internal|0.62/0.64/0.9|0.68/0.7/0.91|0.62/0.64/0.9|-0.06/-0.06/-0.01|3|exposed +s08-fix-two|FixB|FIX_EXT_WALL|WallExternal|external|first|1/4|FIX_Render|outer exposed (outdoors)|external|0.57/0.58/0.88|0.36/0.37/0.93|0.57/0.58/0.88|0/0/0|3|buried +s08-fix-two|FixB|FIX_EXT_WALL|WallExternal|external|first|2/4|FIX_Blockwork|buried|-|0.38/0.39/0.93|0.44/0.46/0.94|0.38/0.39/0.93|-|3|buried +s08-fix-two|FixB|FIX_EXT_WALL|WallExternal|external|first|3/4|FIX_MineralWool|buried|-|0.48/0.49/0.89|0.51/0.53/0.92|0.48/0.49/0.89|-|3|buried +s08-fix-two|FixB|FIX_EXT_WALL|WallExternal|external|first|4/4|FIX_Plasterboard|inner exposed (zone)|internal|0.62/0.64/0.9|0.68/0.7/0.91|0.62/0.64/0.9|-0.06/-0.06/-0.01|3|exposed +s08-fix-two|FixB|FIX_PARTITION|WallInternal|internal|second|1/4|FIX_Plasterboard|outer (interzone: the other side's inner face governs)|internal|0.62/0.64/0.9|0.68/0.7/0.91|0.62/0.64/0.9|-0.06/-0.06/-0.01|3|buried +s08-fix-two|FixB|FIX_PARTITION|WallInternal|internal|second|2/4|FIX_MineralWool|buried|-|0.48/0.49/0.89|0.51/0.53/0.92|0.48/0.49/0.89|-|3|buried +s08-fix-two|FixB|FIX_PARTITION|WallInternal|internal|second|3/4|FIX_Stud|buried|-|0.66/0.67/0.84|0.64/0.65/0.83|0.66/0.67/0.84|-|3|buried +s08-fix-two|FixB|FIX_PARTITION|WallInternal|internal|second|4/4|FIX_Timber|inner exposed (zone)|external|0.41/0.4/0.86|0.39/0.38/0.88|0.41/0.4/0.86|0/0/0|3|buried +TOTAL internal-side MappingDifference rows 138: at an exposed face where SAM wants the internal value 33; buried or SAM-external face 105 diff --git a/documentation/S09-OpenStudio-InputReadBack-evidence/revision-3/README.md b/documentation/S09-OpenStudio-InputReadBack-evidence/revision-3/README.md new file mode 100644 index 0000000..88dede7 --- /dev/null +++ b/documentation/S09-OpenStudio-InputReadBack-evidence/revision-3/README.md @@ -0,0 +1,63 @@ +# S09 revision 3 evidence: missing OSM counterparts + +The independent review of `6f7e6b7d` found that `OsComparison.Multiplicity` skipped the OSM/IDF multiplier check +when an IDF `Zone` or `FenestrationSurface:Detailed` had no `OS:ThermalZone` / `OS:SubSurface` of its name. Revision 3 +(tested content `c1e53328`) claims that consistency only against one identified OSM counterpart. + +Machine-local roots (not needed elsewhere; copy them before switching machines if they are wanted): +- `C:\TasOut\s09\acc3`: the revision-3 acceptance (3 runs) and the 16 negatives, packed into `../runs`, `../negatives` + and `../summary-*.json`. +- `C:\TasOut\s09\rev3-ab`: the before/after below, with both binaries (`bin-base`, `bin-rev`), the inputs and every + native, read and compare file. + +| Build | Harness `os-input-readback.dll` | Library `SAM.Analytical.OpenStudio.InputReadBack.dll` (= native.json `ReaderAssemblySha256`) | +|---|---|---| +| Reviewed head `6f7e6b7d` (code = `cfe097f4`) | `9702cecb9b66a9cc1a6cbd515c50e4d11e80c430f019994a2a29f129da36e961` | `0d091ffa77e8880be95224a3249617643041f7f585c74b8af0374bbbbed578e6` | +| Revision 3 (`c1e53328`) | `b7cf9f2684f09ade91d2fdbbae3de1a9b069dde35359893d0b42f1295f3aa11d` | `ce8270dd002e63cb4be574de24c6f5fce090ba3ca0207e3d73c7db2ba358ca70` | + +These are local Release x64 builds (`--no-incremental`). A .NET DLL hash identifies a build on this machine only; the +reviewed-head hashes differ from the revision-2 table because they are a fresh build of the same source. + +## `ab/`: the same inputs, reviewed head against revision 3 + +Each input is a byte copy of a run folder (`frozen-model.json`, `weather.epw`, `model.osm`, `in.idf`, `export.json`). +`run-ab.ps1` copies it again per binary and runs `read` and then `compare` (approved rules), each a fresh process. +`ab/base//` and `ab/rev//` hold the two `report-approved.txt`; `ab/*-summary.txt` hold one line per input. + +| Input | Mutation (IDF unchanged in every case) | Reviewed head | Revision 3 | +|---|---|---|---| +| box | none (acc2 export; IDF `737ea1f4…`, OSM `98bcd7ce…`) | BLOCKED owner, exit 12, 316/316 | the same; identical outcome counts and report text | +| two | none (acc2 export; IDF `f0b9ca4b…`, OSM `db42485a…`) | BLOCKED owner, exit 12, 586/586 | the same; identical outcome counts and report text | +| box-no-thermalzone | reviewer-style: every `OS:ThermalZone` removed (1; OSM `1a53f105…`) | exit 12, 316/316, no Consistency/Unsupported | **FAIL, exit 10**, 316/316; 1 Consistency | +| box-no-subsurfaces | reviewer-style: every `OS:SubSurface` removed (2; OSM `d9dbb1f6…`) | exit 12, 316/316, none | **FAIL, exit 10**, 316/316; 2 Consistency | +| two-no-thermalzone | reviewer-style: every `OS:ThermalZone` removed (2; OSM `33f93224…`) | exit 12, 586/586, none | **FAIL, exit 10**, 586/586; 2 Consistency | +| two-no-subsurfaces | reviewer-style: every `OS:SubSurface` removed (1; OSM `411c0bee…`) | exit 12, 586/586, none | **FAIL, exit 10**, 586/586; 1 Consistency | +| box-neg-osm-missing-subsurfaces | the CLI negative, from the acc3 box run (OSM `1d2821a3…`) | exit 12, 316/316, none | **FAIL, exit 10**, 316/316; 2 Consistency | +| two-neg-osm-missing-thermal-zone | the CLI negative: zone A's `OS:ThermalZone` only, from the acc3 two run (OSM `93bead41…`) | exit 12, 586/586, none | **FAIL, exit 10**, 586/586; 1 Consistency | + +- **Every revision-3 Consistency entry has the form** `multiplicity: IDF Zone '' has no OS:ThermalZone in the + OSM (none of its N OS:ThermalZone object(s) has that name); the OSM and IDF disagree`, or the same for + `FenestrationSurface:Detailed` / `OS:SubSurface`. There are no Unsupported entries, and the outcome counts are those + of the unchanged fixture: only the verdict changes. +- **The unchanged fixtures:** `report-approved.txt` is byte-identical between the two binaries and to the committed + acc2/acc3 reports. In `report.json` only the multiplicity Supporting line differs: it now states + `1 IDF zone(s) (1 with their OS:ThermalZone) … 2 IDF subsurface(s) (2 with their OS:SubSurface)` (box) and + `2 … (2 …) … 1 … (1 …)` (two). +- **The reviewer-style copies** were made with `remove-osm-objects.sh`. It deletes every object of one OSM class and + rewrites `export.json` `OsmSha256` (and its `Mutation` label), as the review describes. The scripts are kept here as + they were run, with a licence header added. + +Reproduce, from the repository root (Git Bash for the `.sh`, Windows PowerShell for the `.ps1`): +1. Build `benchmark/SAM.Analytical.OpenStudio.InputReadBack.Cli` (Release x64, `--no-incremental`) at `6f7e6b7d` and at + `c1e53328`, and copy each `bin/x64/Release/net8.0` folder (`bin-base`, `bin-rev`). +2. Copy an acceptance run's five files into `inputs/[-suffix]` and apply + `remove-osm-objects.sh OS:ThermalZone` or `… OS:SubSurface`. The two CLI negatives come from + `os-input-readback negative --run / --case --out ` with the revision binary. +3. `run-ab.ps1 -Bin bin-base -Out base` and `run-ab.ps1 -Bin bin-rev -Out rev`. The fixture id follows the input + name's `box`/`two` prefix. + +## Observation, not changed here + +A copy of the box run with `OS:Building` duplicated makes `compare` throw in `OsComparison.Orientation` +(`SingleOrDefault`) and exit 70. That is the infrastructure-failure code, so it fails closed, but not as a named BLOCKED +technical entry. It is outside this finding and is left as it is (`C:\TasOut\s09\rev3-ab\probe-osm-building-duplicated`). diff --git a/documentation/S09-OpenStudio-InputReadBack-evidence/revision-3/ab/base-summary.txt b/documentation/S09-OpenStudio-InputReadBack-evidence/revision-3/ab/base-summary.txt new file mode 100644 index 0000000..7d03923 --- /dev/null +++ b/documentation/S09-OpenStudio-InputReadBack-evidence/revision-3/ab/base-summary.txt @@ -0,0 +1,8 @@ +box: read 0; compare exit 12; BlockedOwnerDecision; Complete 316/316; Consistency 0; Unsupported 0; DocumentedDefault 1, MappingDifference 69, Match 220, NotApplicable 1, WithinTolerance 25 +box-neg-osm-missing-subsurfaces: read 0; compare exit 12; BlockedOwnerDecision; Complete 316/316; Consistency 0; Unsupported 0; DocumentedDefault 1, MappingDifference 69, Match 220, NotApplicable 1, WithinTolerance 25 +box-no-subsurfaces: read 0; compare exit 12; BlockedOwnerDecision; Complete 316/316; Consistency 0; Unsupported 0; DocumentedDefault 1, MappingDifference 69, Match 220, NotApplicable 1, WithinTolerance 25 +box-no-thermalzone: read 0; compare exit 12; BlockedOwnerDecision; Complete 316/316; Consistency 0; Unsupported 0; DocumentedDefault 1, MappingDifference 69, Match 220, NotApplicable 1, WithinTolerance 25 +two: read 0; compare exit 12; BlockedOwnerDecision; Complete 586/586; Consistency 0; Unsupported 0; AcceptedTransformation 6, DocumentedDefault 2, MappingDifference 138, Match 393, NotApplicable 1, WithinTolerance 46 +two-neg-osm-missing-thermal-zone: read 0; compare exit 12; BlockedOwnerDecision; Complete 586/586; Consistency 0; Unsupported 0; AcceptedTransformation 6, DocumentedDefault 2, MappingDifference 138, Match 393, NotApplicable 1, WithinTolerance 46 +two-no-subsurfaces: read 0; compare exit 12; BlockedOwnerDecision; Complete 586/586; Consistency 0; Unsupported 0; AcceptedTransformation 6, DocumentedDefault 2, MappingDifference 138, Match 393, NotApplicable 1, WithinTolerance 46 +two-no-thermalzone: read 0; compare exit 12; BlockedOwnerDecision; Complete 586/586; Consistency 0; Unsupported 0; AcceptedTransformation 6, DocumentedDefault 2, MappingDifference 138, Match 393, NotApplicable 1, WithinTolerance 46 diff --git a/documentation/S09-OpenStudio-InputReadBack-evidence/revision-3/ab/base/box-neg-osm-missing-subsurfaces/report-approved.txt b/documentation/S09-OpenStudio-InputReadBack-evidence/revision-3/ab/base/box-neg-osm-missing-subsurfaces/report-approved.txt new file mode 100644 index 0000000..4106fdc --- /dev/null +++ b/documentation/S09-OpenStudio-InputReadBack-evidence/revision-3/ab/base/box-neg-osm-missing-subsurfaces/report-approved.txt @@ -0,0 +1,19 @@ +S09 OpenStudio read-back: s08-fix-box -> BlockedOwnerDecision (exit 12); rule set Approved; gate BlockedOwnerDecision; coverage Complete (316 required, 316 results) +outcomes: DocumentedDefault 1, MappingDifference 69, Match 220, NotApplicable 1, WithinTolerance 25 +D-F2 space:5080c000-0000-0000-0000-00000000c001: V2 +NOT PASS DocumentedDefault / BlockedOwnerDecision: 1 + 4c space:5080c000-0000-0000-0000-00000000c001.ic.lighting.visible: SAM states no value and the native holds the contract-listed default. Not accepted by the owner. +NOT PASS MappingDifference / BlockedOwnerDecision: 69 + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer3.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer3.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer3.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:285a1884-d494-47a6-9541-942946ea00a7@space:5080c000-0000-0000-0000-00000000c001#layer1.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:285a1884-d494-47a6-9541-942946ea00a7@space:5080c000-0000-0000-0000-00000000c001#layer1.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:285a1884-d494-47a6-9541-942946ea00a7@space:5080c000-0000-0000-0000-00000000c001#layer1.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + ... 57 more in report.json diff --git a/documentation/S09-OpenStudio-InputReadBack-evidence/revision-3/ab/base/box-no-subsurfaces/report-approved.txt b/documentation/S09-OpenStudio-InputReadBack-evidence/revision-3/ab/base/box-no-subsurfaces/report-approved.txt new file mode 100644 index 0000000..4106fdc --- /dev/null +++ b/documentation/S09-OpenStudio-InputReadBack-evidence/revision-3/ab/base/box-no-subsurfaces/report-approved.txt @@ -0,0 +1,19 @@ +S09 OpenStudio read-back: s08-fix-box -> BlockedOwnerDecision (exit 12); rule set Approved; gate BlockedOwnerDecision; coverage Complete (316 required, 316 results) +outcomes: DocumentedDefault 1, MappingDifference 69, Match 220, NotApplicable 1, WithinTolerance 25 +D-F2 space:5080c000-0000-0000-0000-00000000c001: V2 +NOT PASS DocumentedDefault / BlockedOwnerDecision: 1 + 4c space:5080c000-0000-0000-0000-00000000c001.ic.lighting.visible: SAM states no value and the native holds the contract-listed default. Not accepted by the owner. +NOT PASS MappingDifference / BlockedOwnerDecision: 69 + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer3.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer3.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer3.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:285a1884-d494-47a6-9541-942946ea00a7@space:5080c000-0000-0000-0000-00000000c001#layer1.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:285a1884-d494-47a6-9541-942946ea00a7@space:5080c000-0000-0000-0000-00000000c001#layer1.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:285a1884-d494-47a6-9541-942946ea00a7@space:5080c000-0000-0000-0000-00000000c001#layer1.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + ... 57 more in report.json diff --git a/documentation/S09-OpenStudio-InputReadBack-evidence/revision-3/ab/base/box-no-thermalzone/report-approved.txt b/documentation/S09-OpenStudio-InputReadBack-evidence/revision-3/ab/base/box-no-thermalzone/report-approved.txt new file mode 100644 index 0000000..4106fdc --- /dev/null +++ b/documentation/S09-OpenStudio-InputReadBack-evidence/revision-3/ab/base/box-no-thermalzone/report-approved.txt @@ -0,0 +1,19 @@ +S09 OpenStudio read-back: s08-fix-box -> BlockedOwnerDecision (exit 12); rule set Approved; gate BlockedOwnerDecision; coverage Complete (316 required, 316 results) +outcomes: DocumentedDefault 1, MappingDifference 69, Match 220, NotApplicable 1, WithinTolerance 25 +D-F2 space:5080c000-0000-0000-0000-00000000c001: V2 +NOT PASS DocumentedDefault / BlockedOwnerDecision: 1 + 4c space:5080c000-0000-0000-0000-00000000c001.ic.lighting.visible: SAM states no value and the native holds the contract-listed default. Not accepted by the owner. +NOT PASS MappingDifference / BlockedOwnerDecision: 69 + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer3.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer3.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer3.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:285a1884-d494-47a6-9541-942946ea00a7@space:5080c000-0000-0000-0000-00000000c001#layer1.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:285a1884-d494-47a6-9541-942946ea00a7@space:5080c000-0000-0000-0000-00000000c001#layer1.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:285a1884-d494-47a6-9541-942946ea00a7@space:5080c000-0000-0000-0000-00000000c001#layer1.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + ... 57 more in report.json diff --git a/documentation/S09-OpenStudio-InputReadBack-evidence/revision-3/ab/base/box/report-approved.txt b/documentation/S09-OpenStudio-InputReadBack-evidence/revision-3/ab/base/box/report-approved.txt new file mode 100644 index 0000000..4106fdc --- /dev/null +++ b/documentation/S09-OpenStudio-InputReadBack-evidence/revision-3/ab/base/box/report-approved.txt @@ -0,0 +1,19 @@ +S09 OpenStudio read-back: s08-fix-box -> BlockedOwnerDecision (exit 12); rule set Approved; gate BlockedOwnerDecision; coverage Complete (316 required, 316 results) +outcomes: DocumentedDefault 1, MappingDifference 69, Match 220, NotApplicable 1, WithinTolerance 25 +D-F2 space:5080c000-0000-0000-0000-00000000c001: V2 +NOT PASS DocumentedDefault / BlockedOwnerDecision: 1 + 4c space:5080c000-0000-0000-0000-00000000c001.ic.lighting.visible: SAM states no value and the native holds the contract-listed default. Not accepted by the owner. +NOT PASS MappingDifference / BlockedOwnerDecision: 69 + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer3.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer3.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer3.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:285a1884-d494-47a6-9541-942946ea00a7@space:5080c000-0000-0000-0000-00000000c001#layer1.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:285a1884-d494-47a6-9541-942946ea00a7@space:5080c000-0000-0000-0000-00000000c001#layer1.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:285a1884-d494-47a6-9541-942946ea00a7@space:5080c000-0000-0000-0000-00000000c001#layer1.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + ... 57 more in report.json diff --git a/documentation/S09-OpenStudio-InputReadBack-evidence/revision-3/ab/base/two-neg-osm-missing-thermal-zone/report-approved.txt b/documentation/S09-OpenStudio-InputReadBack-evidence/revision-3/ab/base/two-neg-osm-missing-thermal-zone/report-approved.txt new file mode 100644 index 0000000..f2e4848 --- /dev/null +++ b/documentation/S09-OpenStudio-InputReadBack-evidence/revision-3/ab/base/two-neg-osm-missing-thermal-zone/report-approved.txt @@ -0,0 +1,21 @@ +S09 OpenStudio read-back: s08-fix-two -> BlockedOwnerDecision (exit 12); rule set Approved; gate BlockedOwnerDecision; coverage Complete (586 required, 586 results) +outcomes: AcceptedTransformation 6, DocumentedDefault 2, MappingDifference 138, Match 393, NotApplicable 1, WithinTolerance 46 +D-F2 space:5080c000-0000-0000-0000-00000000c0a1: V1 +D-F2 space:5080c000-0000-0000-0000-00000000c0b1: V1 +NOT PASS DocumentedDefault / BlockedOwnerDecision: 2 + 4c space:5080c000-0000-0000-0000-00000000c0a1.ic.lighting.visible: SAM states no value and the native holds the contract-listed default. Not accepted by the owner. + 4c space:5080c000-0000-0000-0000-00000000c0b1.ic.lighting.visible: SAM states no value and the native holds the contract-listed default. Not accepted by the owner. +NOT PASS MappingDifference / BlockedOwnerDecision: 138 + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer1.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer1.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer1.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer2.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer2.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer2.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer3.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer3.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer3.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:fe8a6b43-ec73-4201-91e8-0dedf413b25c@space:5080c000-0000-0000-0000-00000000c0a1#layer1.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:fe8a6b43-ec73-4201-91e8-0dedf413b25c@space:5080c000-0000-0000-0000-00000000c0a1#layer1.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:fe8a6b43-ec73-4201-91e8-0dedf413b25c@space:5080c000-0000-0000-0000-00000000c0a1#layer1.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + ... 126 more in report.json diff --git a/documentation/S09-OpenStudio-InputReadBack-evidence/revision-3/ab/base/two-no-subsurfaces/report-approved.txt b/documentation/S09-OpenStudio-InputReadBack-evidence/revision-3/ab/base/two-no-subsurfaces/report-approved.txt new file mode 100644 index 0000000..f2e4848 --- /dev/null +++ b/documentation/S09-OpenStudio-InputReadBack-evidence/revision-3/ab/base/two-no-subsurfaces/report-approved.txt @@ -0,0 +1,21 @@ +S09 OpenStudio read-back: s08-fix-two -> BlockedOwnerDecision (exit 12); rule set Approved; gate BlockedOwnerDecision; coverage Complete (586 required, 586 results) +outcomes: AcceptedTransformation 6, DocumentedDefault 2, MappingDifference 138, Match 393, NotApplicable 1, WithinTolerance 46 +D-F2 space:5080c000-0000-0000-0000-00000000c0a1: V1 +D-F2 space:5080c000-0000-0000-0000-00000000c0b1: V1 +NOT PASS DocumentedDefault / BlockedOwnerDecision: 2 + 4c space:5080c000-0000-0000-0000-00000000c0a1.ic.lighting.visible: SAM states no value and the native holds the contract-listed default. Not accepted by the owner. + 4c space:5080c000-0000-0000-0000-00000000c0b1.ic.lighting.visible: SAM states no value and the native holds the contract-listed default. Not accepted by the owner. +NOT PASS MappingDifference / BlockedOwnerDecision: 138 + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer1.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer1.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer1.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer2.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer2.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer2.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer3.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer3.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer3.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:fe8a6b43-ec73-4201-91e8-0dedf413b25c@space:5080c000-0000-0000-0000-00000000c0a1#layer1.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:fe8a6b43-ec73-4201-91e8-0dedf413b25c@space:5080c000-0000-0000-0000-00000000c0a1#layer1.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:fe8a6b43-ec73-4201-91e8-0dedf413b25c@space:5080c000-0000-0000-0000-00000000c0a1#layer1.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + ... 126 more in report.json diff --git a/documentation/S09-OpenStudio-InputReadBack-evidence/revision-3/ab/base/two-no-thermalzone/report-approved.txt b/documentation/S09-OpenStudio-InputReadBack-evidence/revision-3/ab/base/two-no-thermalzone/report-approved.txt new file mode 100644 index 0000000..f2e4848 --- /dev/null +++ b/documentation/S09-OpenStudio-InputReadBack-evidence/revision-3/ab/base/two-no-thermalzone/report-approved.txt @@ -0,0 +1,21 @@ +S09 OpenStudio read-back: s08-fix-two -> BlockedOwnerDecision (exit 12); rule set Approved; gate BlockedOwnerDecision; coverage Complete (586 required, 586 results) +outcomes: AcceptedTransformation 6, DocumentedDefault 2, MappingDifference 138, Match 393, NotApplicable 1, WithinTolerance 46 +D-F2 space:5080c000-0000-0000-0000-00000000c0a1: V1 +D-F2 space:5080c000-0000-0000-0000-00000000c0b1: V1 +NOT PASS DocumentedDefault / BlockedOwnerDecision: 2 + 4c space:5080c000-0000-0000-0000-00000000c0a1.ic.lighting.visible: SAM states no value and the native holds the contract-listed default. Not accepted by the owner. + 4c space:5080c000-0000-0000-0000-00000000c0b1.ic.lighting.visible: SAM states no value and the native holds the contract-listed default. Not accepted by the owner. +NOT PASS MappingDifference / BlockedOwnerDecision: 138 + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer1.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer1.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer1.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer2.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer2.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer2.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer3.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer3.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer3.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:fe8a6b43-ec73-4201-91e8-0dedf413b25c@space:5080c000-0000-0000-0000-00000000c0a1#layer1.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:fe8a6b43-ec73-4201-91e8-0dedf413b25c@space:5080c000-0000-0000-0000-00000000c0a1#layer1.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:fe8a6b43-ec73-4201-91e8-0dedf413b25c@space:5080c000-0000-0000-0000-00000000c0a1#layer1.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + ... 126 more in report.json diff --git a/documentation/S09-OpenStudio-InputReadBack-evidence/revision-3/ab/base/two/report-approved.txt b/documentation/S09-OpenStudio-InputReadBack-evidence/revision-3/ab/base/two/report-approved.txt new file mode 100644 index 0000000..f2e4848 --- /dev/null +++ b/documentation/S09-OpenStudio-InputReadBack-evidence/revision-3/ab/base/two/report-approved.txt @@ -0,0 +1,21 @@ +S09 OpenStudio read-back: s08-fix-two -> BlockedOwnerDecision (exit 12); rule set Approved; gate BlockedOwnerDecision; coverage Complete (586 required, 586 results) +outcomes: AcceptedTransformation 6, DocumentedDefault 2, MappingDifference 138, Match 393, NotApplicable 1, WithinTolerance 46 +D-F2 space:5080c000-0000-0000-0000-00000000c0a1: V1 +D-F2 space:5080c000-0000-0000-0000-00000000c0b1: V1 +NOT PASS DocumentedDefault / BlockedOwnerDecision: 2 + 4c space:5080c000-0000-0000-0000-00000000c0a1.ic.lighting.visible: SAM states no value and the native holds the contract-listed default. Not accepted by the owner. + 4c space:5080c000-0000-0000-0000-00000000c0b1.ic.lighting.visible: SAM states no value and the native holds the contract-listed default. Not accepted by the owner. +NOT PASS MappingDifference / BlockedOwnerDecision: 138 + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer1.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer1.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer1.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer2.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer2.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer2.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer3.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer3.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer3.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:fe8a6b43-ec73-4201-91e8-0dedf413b25c@space:5080c000-0000-0000-0000-00000000c0a1#layer1.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:fe8a6b43-ec73-4201-91e8-0dedf413b25c@space:5080c000-0000-0000-0000-00000000c0a1#layer1.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:fe8a6b43-ec73-4201-91e8-0dedf413b25c@space:5080c000-0000-0000-0000-00000000c0a1#layer1.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + ... 126 more in report.json diff --git a/documentation/S09-OpenStudio-InputReadBack-evidence/revision-3/ab/rev-summary.txt b/documentation/S09-OpenStudio-InputReadBack-evidence/revision-3/ab/rev-summary.txt new file mode 100644 index 0000000..26574d2 --- /dev/null +++ b/documentation/S09-OpenStudio-InputReadBack-evidence/revision-3/ab/rev-summary.txt @@ -0,0 +1,17 @@ +box: read 0; compare exit 12; BlockedOwnerDecision; Complete 316/316; Consistency 0; Unsupported 0; DocumentedDefault 1, MappingDifference 69, Match 220, NotApplicable 1, WithinTolerance 25 +box-neg-osm-missing-subsurfaces: read 0; compare exit 10; Fail; Complete 316/316; Consistency 2; Unsupported 0; DocumentedDefault 1, MappingDifference 69, Match 220, NotApplicable 1, WithinTolerance 25 + Consistency: multiplicity: IDF FenestrationSurface:Detailed 'SAM_SubSurface_FIX_WIN_UNFRAMED_0_6adea09c' has no OS:SubSurface in the OSM (none of its 0 OS:SubSurface object(s) has that name); the OSM and IDF disagree + Consistency: multiplicity: IDF FenestrationSurface:Detailed 'SAM_SubSurface_FIX_WIN_FRAMED_0_95717805' has no OS:SubSurface in the OSM (none of its 0 OS:SubSurface object(s) has that name); the OSM and IDF disagree +box-no-subsurfaces: read 0; compare exit 10; Fail; Complete 316/316; Consistency 2; Unsupported 0; DocumentedDefault 1, MappingDifference 69, Match 220, NotApplicable 1, WithinTolerance 25 + Consistency: multiplicity: IDF FenestrationSurface:Detailed 'SAM_SubSurface_FIX_WIN_UNFRAMED_0_6adea09c' has no OS:SubSurface in the OSM (none of its 0 OS:SubSurface object(s) has that name); the OSM and IDF disagree + Consistency: multiplicity: IDF FenestrationSurface:Detailed 'SAM_SubSurface_FIX_WIN_FRAMED_0_95717805' has no OS:SubSurface in the OSM (none of its 0 OS:SubSurface object(s) has that name); the OSM and IDF disagree +box-no-thermalzone: read 0; compare exit 10; Fail; Complete 316/316; Consistency 1; Unsupported 0; DocumentedDefault 1, MappingDifference 69, Match 220, NotApplicable 1, WithinTolerance 25 + Consistency: multiplicity: IDF Zone 'SAM_ThermalZone_FixBox_5080c000' has no OS:ThermalZone in the OSM (none of its 0 OS:ThermalZone object(s) has that name); the OSM and IDF disagree +two: read 0; compare exit 12; BlockedOwnerDecision; Complete 586/586; Consistency 0; Unsupported 0; AcceptedTransformation 6, DocumentedDefault 2, MappingDifference 138, Match 393, NotApplicable 1, WithinTolerance 46 +two-neg-osm-missing-thermal-zone: read 0; compare exit 10; Fail; Complete 586/586; Consistency 1; Unsupported 0; AcceptedTransformation 6, DocumentedDefault 2, MappingDifference 138, Match 393, NotApplicable 1, WithinTolerance 46 + Consistency: multiplicity: IDF Zone 'SAM_ThermalZone_FixA_5080c000' has no OS:ThermalZone in the OSM (none of its 1 OS:ThermalZone object(s) has that name); the OSM and IDF disagree +two-no-subsurfaces: read 0; compare exit 10; Fail; Complete 586/586; Consistency 1; Unsupported 0; AcceptedTransformation 6, DocumentedDefault 2, MappingDifference 138, Match 393, NotApplicable 1, WithinTolerance 46 + Consistency: multiplicity: IDF FenestrationSurface:Detailed 'SAM_SubSurface_FIX_WIN_FRAMED_0_d4b4d4bb' has no OS:SubSurface in the OSM (none of its 0 OS:SubSurface object(s) has that name); the OSM and IDF disagree +two-no-thermalzone: read 0; compare exit 10; Fail; Complete 586/586; Consistency 2; Unsupported 0; AcceptedTransformation 6, DocumentedDefault 2, MappingDifference 138, Match 393, NotApplicable 1, WithinTolerance 46 + Consistency: multiplicity: IDF Zone 'SAM_ThermalZone_FixA_5080c000' has no OS:ThermalZone in the OSM (none of its 0 OS:ThermalZone object(s) has that name); the OSM and IDF disagree + Consistency: multiplicity: IDF Zone 'SAM_ThermalZone_FixB_5080c000' has no OS:ThermalZone in the OSM (none of its 0 OS:ThermalZone object(s) has that name); the OSM and IDF disagree diff --git a/documentation/S09-OpenStudio-InputReadBack-evidence/revision-3/ab/rev/box-neg-osm-missing-subsurfaces/report-approved.txt b/documentation/S09-OpenStudio-InputReadBack-evidence/revision-3/ab/rev/box-neg-osm-missing-subsurfaces/report-approved.txt new file mode 100644 index 0000000..74f9e59 --- /dev/null +++ b/documentation/S09-OpenStudio-InputReadBack-evidence/revision-3/ab/rev/box-neg-osm-missing-subsurfaces/report-approved.txt @@ -0,0 +1,21 @@ +S09 OpenStudio read-back: s08-fix-box -> Fail (exit 10); rule set Approved; gate BlockedOwnerDecision; coverage Complete (316 required, 316 results) +outcomes: DocumentedDefault 1, MappingDifference 69, Match 220, NotApplicable 1, WithinTolerance 25 +D-F2 space:5080c000-0000-0000-0000-00000000c001: V2 +CONSISTENCY FAIL: multiplicity: IDF FenestrationSurface:Detailed 'SAM_SubSurface_FIX_WIN_UNFRAMED_0_6adea09c' has no OS:SubSurface in the OSM (none of its 0 OS:SubSurface object(s) has that name); the OSM and IDF disagree +CONSISTENCY FAIL: multiplicity: IDF FenestrationSurface:Detailed 'SAM_SubSurface_FIX_WIN_FRAMED_0_95717805' has no OS:SubSurface in the OSM (none of its 0 OS:SubSurface object(s) has that name); the OSM and IDF disagree +NOT PASS DocumentedDefault / BlockedOwnerDecision: 1 + 4c space:5080c000-0000-0000-0000-00000000c001.ic.lighting.visible: SAM states no value and the native holds the contract-listed default. Not accepted by the owner. +NOT PASS MappingDifference / BlockedOwnerDecision: 69 + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer3.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer3.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer3.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:285a1884-d494-47a6-9541-942946ea00a7@space:5080c000-0000-0000-0000-00000000c001#layer1.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:285a1884-d494-47a6-9541-942946ea00a7@space:5080c000-0000-0000-0000-00000000c001#layer1.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:285a1884-d494-47a6-9541-942946ea00a7@space:5080c000-0000-0000-0000-00000000c001#layer1.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + ... 57 more in report.json diff --git a/documentation/S09-OpenStudio-InputReadBack-evidence/revision-3/ab/rev/box-no-subsurfaces/report-approved.txt b/documentation/S09-OpenStudio-InputReadBack-evidence/revision-3/ab/rev/box-no-subsurfaces/report-approved.txt new file mode 100644 index 0000000..74f9e59 --- /dev/null +++ b/documentation/S09-OpenStudio-InputReadBack-evidence/revision-3/ab/rev/box-no-subsurfaces/report-approved.txt @@ -0,0 +1,21 @@ +S09 OpenStudio read-back: s08-fix-box -> Fail (exit 10); rule set Approved; gate BlockedOwnerDecision; coverage Complete (316 required, 316 results) +outcomes: DocumentedDefault 1, MappingDifference 69, Match 220, NotApplicable 1, WithinTolerance 25 +D-F2 space:5080c000-0000-0000-0000-00000000c001: V2 +CONSISTENCY FAIL: multiplicity: IDF FenestrationSurface:Detailed 'SAM_SubSurface_FIX_WIN_UNFRAMED_0_6adea09c' has no OS:SubSurface in the OSM (none of its 0 OS:SubSurface object(s) has that name); the OSM and IDF disagree +CONSISTENCY FAIL: multiplicity: IDF FenestrationSurface:Detailed 'SAM_SubSurface_FIX_WIN_FRAMED_0_95717805' has no OS:SubSurface in the OSM (none of its 0 OS:SubSurface object(s) has that name); the OSM and IDF disagree +NOT PASS DocumentedDefault / BlockedOwnerDecision: 1 + 4c space:5080c000-0000-0000-0000-00000000c001.ic.lighting.visible: SAM states no value and the native holds the contract-listed default. Not accepted by the owner. +NOT PASS MappingDifference / BlockedOwnerDecision: 69 + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer3.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer3.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer3.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:285a1884-d494-47a6-9541-942946ea00a7@space:5080c000-0000-0000-0000-00000000c001#layer1.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:285a1884-d494-47a6-9541-942946ea00a7@space:5080c000-0000-0000-0000-00000000c001#layer1.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:285a1884-d494-47a6-9541-942946ea00a7@space:5080c000-0000-0000-0000-00000000c001#layer1.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + ... 57 more in report.json diff --git a/documentation/S09-OpenStudio-InputReadBack-evidence/revision-3/ab/rev/box-no-thermalzone/report-approved.txt b/documentation/S09-OpenStudio-InputReadBack-evidence/revision-3/ab/rev/box-no-thermalzone/report-approved.txt new file mode 100644 index 0000000..b263080 --- /dev/null +++ b/documentation/S09-OpenStudio-InputReadBack-evidence/revision-3/ab/rev/box-no-thermalzone/report-approved.txt @@ -0,0 +1,20 @@ +S09 OpenStudio read-back: s08-fix-box -> Fail (exit 10); rule set Approved; gate BlockedOwnerDecision; coverage Complete (316 required, 316 results) +outcomes: DocumentedDefault 1, MappingDifference 69, Match 220, NotApplicable 1, WithinTolerance 25 +D-F2 space:5080c000-0000-0000-0000-00000000c001: V2 +CONSISTENCY FAIL: multiplicity: IDF Zone 'SAM_ThermalZone_FixBox_5080c000' has no OS:ThermalZone in the OSM (none of its 0 OS:ThermalZone object(s) has that name); the OSM and IDF disagree +NOT PASS DocumentedDefault / BlockedOwnerDecision: 1 + 4c space:5080c000-0000-0000-0000-00000000c001.ic.lighting.visible: SAM states no value and the native holds the contract-listed default. Not accepted by the owner. +NOT PASS MappingDifference / BlockedOwnerDecision: 69 + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer3.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer3.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer3.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:285a1884-d494-47a6-9541-942946ea00a7@space:5080c000-0000-0000-0000-00000000c001#layer1.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:285a1884-d494-47a6-9541-942946ea00a7@space:5080c000-0000-0000-0000-00000000c001#layer1.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:285a1884-d494-47a6-9541-942946ea00a7@space:5080c000-0000-0000-0000-00000000c001#layer1.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + ... 57 more in report.json diff --git a/documentation/S09-OpenStudio-InputReadBack-evidence/revision-3/ab/rev/box/report-approved.txt b/documentation/S09-OpenStudio-InputReadBack-evidence/revision-3/ab/rev/box/report-approved.txt new file mode 100644 index 0000000..4106fdc --- /dev/null +++ b/documentation/S09-OpenStudio-InputReadBack-evidence/revision-3/ab/rev/box/report-approved.txt @@ -0,0 +1,19 @@ +S09 OpenStudio read-back: s08-fix-box -> BlockedOwnerDecision (exit 12); rule set Approved; gate BlockedOwnerDecision; coverage Complete (316 required, 316 results) +outcomes: DocumentedDefault 1, MappingDifference 69, Match 220, NotApplicable 1, WithinTolerance 25 +D-F2 space:5080c000-0000-0000-0000-00000000c001: V2 +NOT PASS DocumentedDefault / BlockedOwnerDecision: 1 + 4c space:5080c000-0000-0000-0000-00000000c001.ic.lighting.visible: SAM states no value and the native holds the contract-listed default. Not accepted by the owner. +NOT PASS MappingDifference / BlockedOwnerDecision: 69 + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer3.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer3.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer3.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:285a1884-d494-47a6-9541-942946ea00a7@space:5080c000-0000-0000-0000-00000000c001#layer1.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:285a1884-d494-47a6-9541-942946ea00a7@space:5080c000-0000-0000-0000-00000000c001#layer1.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:285a1884-d494-47a6-9541-942946ea00a7@space:5080c000-0000-0000-0000-00000000c001#layer1.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + ... 57 more in report.json diff --git a/documentation/S09-OpenStudio-InputReadBack-evidence/revision-3/ab/rev/two-neg-osm-missing-thermal-zone/report-approved.txt b/documentation/S09-OpenStudio-InputReadBack-evidence/revision-3/ab/rev/two-neg-osm-missing-thermal-zone/report-approved.txt new file mode 100644 index 0000000..4c28824 --- /dev/null +++ b/documentation/S09-OpenStudio-InputReadBack-evidence/revision-3/ab/rev/two-neg-osm-missing-thermal-zone/report-approved.txt @@ -0,0 +1,22 @@ +S09 OpenStudio read-back: s08-fix-two -> Fail (exit 10); rule set Approved; gate BlockedOwnerDecision; coverage Complete (586 required, 586 results) +outcomes: AcceptedTransformation 6, DocumentedDefault 2, MappingDifference 138, Match 393, NotApplicable 1, WithinTolerance 46 +D-F2 space:5080c000-0000-0000-0000-00000000c0a1: V1 +D-F2 space:5080c000-0000-0000-0000-00000000c0b1: V1 +CONSISTENCY FAIL: multiplicity: IDF Zone 'SAM_ThermalZone_FixA_5080c000' has no OS:ThermalZone in the OSM (none of its 1 OS:ThermalZone object(s) has that name); the OSM and IDF disagree +NOT PASS DocumentedDefault / BlockedOwnerDecision: 2 + 4c space:5080c000-0000-0000-0000-00000000c0a1.ic.lighting.visible: SAM states no value and the native holds the contract-listed default. Not accepted by the owner. + 4c space:5080c000-0000-0000-0000-00000000c0b1.ic.lighting.visible: SAM states no value and the native holds the contract-listed default. Not accepted by the owner. +NOT PASS MappingDifference / BlockedOwnerDecision: 138 + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer1.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer1.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer1.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer2.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer2.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer2.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer3.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer3.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer3.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:fe8a6b43-ec73-4201-91e8-0dedf413b25c@space:5080c000-0000-0000-0000-00000000c0a1#layer1.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:fe8a6b43-ec73-4201-91e8-0dedf413b25c@space:5080c000-0000-0000-0000-00000000c0a1#layer1.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:fe8a6b43-ec73-4201-91e8-0dedf413b25c@space:5080c000-0000-0000-0000-00000000c0a1#layer1.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + ... 126 more in report.json diff --git a/documentation/S09-OpenStudio-InputReadBack-evidence/revision-3/ab/rev/two-no-subsurfaces/report-approved.txt b/documentation/S09-OpenStudio-InputReadBack-evidence/revision-3/ab/rev/two-no-subsurfaces/report-approved.txt new file mode 100644 index 0000000..a6033a7 --- /dev/null +++ b/documentation/S09-OpenStudio-InputReadBack-evidence/revision-3/ab/rev/two-no-subsurfaces/report-approved.txt @@ -0,0 +1,22 @@ +S09 OpenStudio read-back: s08-fix-two -> Fail (exit 10); rule set Approved; gate BlockedOwnerDecision; coverage Complete (586 required, 586 results) +outcomes: AcceptedTransformation 6, DocumentedDefault 2, MappingDifference 138, Match 393, NotApplicable 1, WithinTolerance 46 +D-F2 space:5080c000-0000-0000-0000-00000000c0a1: V1 +D-F2 space:5080c000-0000-0000-0000-00000000c0b1: V1 +CONSISTENCY FAIL: multiplicity: IDF FenestrationSurface:Detailed 'SAM_SubSurface_FIX_WIN_FRAMED_0_d4b4d4bb' has no OS:SubSurface in the OSM (none of its 0 OS:SubSurface object(s) has that name); the OSM and IDF disagree +NOT PASS DocumentedDefault / BlockedOwnerDecision: 2 + 4c space:5080c000-0000-0000-0000-00000000c0a1.ic.lighting.visible: SAM states no value and the native holds the contract-listed default. Not accepted by the owner. + 4c space:5080c000-0000-0000-0000-00000000c0b1.ic.lighting.visible: SAM states no value and the native holds the contract-listed default. Not accepted by the owner. +NOT PASS MappingDifference / BlockedOwnerDecision: 138 + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer1.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer1.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer1.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer2.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer2.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer2.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer3.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer3.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer3.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:fe8a6b43-ec73-4201-91e8-0dedf413b25c@space:5080c000-0000-0000-0000-00000000c0a1#layer1.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:fe8a6b43-ec73-4201-91e8-0dedf413b25c@space:5080c000-0000-0000-0000-00000000c0a1#layer1.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:fe8a6b43-ec73-4201-91e8-0dedf413b25c@space:5080c000-0000-0000-0000-00000000c0a1#layer1.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + ... 126 more in report.json diff --git a/documentation/S09-OpenStudio-InputReadBack-evidence/revision-3/ab/rev/two-no-thermalzone/report-approved.txt b/documentation/S09-OpenStudio-InputReadBack-evidence/revision-3/ab/rev/two-no-thermalzone/report-approved.txt new file mode 100644 index 0000000..970c497 --- /dev/null +++ b/documentation/S09-OpenStudio-InputReadBack-evidence/revision-3/ab/rev/two-no-thermalzone/report-approved.txt @@ -0,0 +1,23 @@ +S09 OpenStudio read-back: s08-fix-two -> Fail (exit 10); rule set Approved; gate BlockedOwnerDecision; coverage Complete (586 required, 586 results) +outcomes: AcceptedTransformation 6, DocumentedDefault 2, MappingDifference 138, Match 393, NotApplicable 1, WithinTolerance 46 +D-F2 space:5080c000-0000-0000-0000-00000000c0a1: V1 +D-F2 space:5080c000-0000-0000-0000-00000000c0b1: V1 +CONSISTENCY FAIL: multiplicity: IDF Zone 'SAM_ThermalZone_FixA_5080c000' has no OS:ThermalZone in the OSM (none of its 0 OS:ThermalZone object(s) has that name); the OSM and IDF disagree +CONSISTENCY FAIL: multiplicity: IDF Zone 'SAM_ThermalZone_FixB_5080c000' has no OS:ThermalZone in the OSM (none of its 0 OS:ThermalZone object(s) has that name); the OSM and IDF disagree +NOT PASS DocumentedDefault / BlockedOwnerDecision: 2 + 4c space:5080c000-0000-0000-0000-00000000c0a1.ic.lighting.visible: SAM states no value and the native holds the contract-listed default. Not accepted by the owner. + 4c space:5080c000-0000-0000-0000-00000000c0b1.ic.lighting.visible: SAM states no value and the native holds the contract-listed default. Not accepted by the owner. +NOT PASS MappingDifference / BlockedOwnerDecision: 138 + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer1.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer1.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer1.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer2.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer2.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer2.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer3.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer3.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer3.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:fe8a6b43-ec73-4201-91e8-0dedf413b25c@space:5080c000-0000-0000-0000-00000000c0a1#layer1.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:fe8a6b43-ec73-4201-91e8-0dedf413b25c@space:5080c000-0000-0000-0000-00000000c0a1#layer1.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:fe8a6b43-ec73-4201-91e8-0dedf413b25c@space:5080c000-0000-0000-0000-00000000c0a1#layer1.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + ... 126 more in report.json diff --git a/documentation/S09-OpenStudio-InputReadBack-evidence/revision-3/ab/rev/two/report-approved.txt b/documentation/S09-OpenStudio-InputReadBack-evidence/revision-3/ab/rev/two/report-approved.txt new file mode 100644 index 0000000..f2e4848 --- /dev/null +++ b/documentation/S09-OpenStudio-InputReadBack-evidence/revision-3/ab/rev/two/report-approved.txt @@ -0,0 +1,21 @@ +S09 OpenStudio read-back: s08-fix-two -> BlockedOwnerDecision (exit 12); rule set Approved; gate BlockedOwnerDecision; coverage Complete (586 required, 586 results) +outcomes: AcceptedTransformation 6, DocumentedDefault 2, MappingDifference 138, Match 393, NotApplicable 1, WithinTolerance 46 +D-F2 space:5080c000-0000-0000-0000-00000000c0a1: V1 +D-F2 space:5080c000-0000-0000-0000-00000000c0b1: V1 +NOT PASS DocumentedDefault / BlockedOwnerDecision: 2 + 4c space:5080c000-0000-0000-0000-00000000c0a1.ic.lighting.visible: SAM states no value and the native holds the contract-listed default. Not accepted by the owner. + 4c space:5080c000-0000-0000-0000-00000000c0b1.ic.lighting.visible: SAM states no value and the native holds the contract-listed default. Not accepted by the owner. +NOT PASS MappingDifference / BlockedOwnerDecision: 138 + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer1.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer1.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer1.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer2.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer2.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer2.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer3.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer3.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer3.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:fe8a6b43-ec73-4201-91e8-0dedf413b25c@space:5080c000-0000-0000-0000-00000000c0a1#layer1.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:fe8a6b43-ec73-4201-91e8-0dedf413b25c@space:5080c000-0000-0000-0000-00000000c0a1#layer1.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:fe8a6b43-ec73-4201-91e8-0dedf413b25c@space:5080c000-0000-0000-0000-00000000c0a1#layer1.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + ... 126 more in report.json diff --git a/documentation/S09-OpenStudio-InputReadBack-evidence/revision-3/remove-osm-objects.sh b/documentation/S09-OpenStudio-InputReadBack-evidence/revision-3/remove-osm-objects.sh new file mode 100644 index 0000000..e0477dd --- /dev/null +++ b/documentation/S09-OpenStudio-InputReadBack-evidence/revision-3/remove-osm-objects.sh @@ -0,0 +1,18 @@ +#!/usr/bin/env bash +# SPDX-License-Identifier: LGPL-3.0-or-later +# Copyright (c) 2020-2026 Michal Dengusiak & Jakub Ziolkowski and contributors +# Usage: remove-osm-objects.sh . Removes every object of that type from model.osm (line-based, the +# object runs from its "," line through the line whose data part ends with ';'), then rewrites export.json OsmSha256. +set -e +dir=$1; type=$2 +awk -v t="$type," ' + BEGIN{skip=0} + { line=$0; sub(/\r$/,"",line); data=line; i=index(data,"!"); if(i>0) data=substr(data,1,i-1) + if(!skip && line ~ "^[ \t]*" && line==t){skip=1; n++; next} + if(skip){ if(data ~ /;[ \t]*$/){skip=0; drop=1}; next } + if(drop && line==""){drop=0; next} drop=0; print } + END{ if(n==0) exit 3; print "removed " n " " t > "/dev/stderr" }' "$dir/model.osm" > "$dir/model.osm.new" +mv "$dir/model.osm.new" "$dir/model.osm" +h=$(sha256sum "$dir/model.osm" | cut -d' ' -f1) +sed -i -E "s/(\"OsmSha256\": \")[0-9a-f]+/\1$h/; s/(\"Mutation\": )null/\1\"reviewer-style: every $type removed from model.osm\"/" "$dir/export.json" +grep -E '"(OsmSha256|Mutation)"' "$dir/export.json" diff --git a/documentation/S09-OpenStudio-InputReadBack-evidence/revision-3/run-ab.ps1 b/documentation/S09-OpenStudio-InputReadBack-evidence/revision-3/run-ab.ps1 new file mode 100644 index 0000000..fe27c0c --- /dev/null +++ b/documentation/S09-OpenStudio-InputReadBack-evidence/revision-3/run-ab.ps1 @@ -0,0 +1,24 @@ +# SPDX-License-Identifier: LGPL-3.0-or-later +# Copyright (c) 2020-2026 Michal Dengusiak & Jakub Ziolkowski and contributors + +# Usage: run-ab.ps1 -Bin -Out . Each input under .\inputs is byte-copied to +# \, then read and compare (approved rules) run as fresh processes. Prints one summary line per input. +param([string]$Bin, [string]$Out) +$ErrorActionPreference = 'Stop' +$exe = Join-Path $Bin 'os-input-readback.exe' +foreach ($in in Get-ChildItem (Join-Path $PSScriptRoot 'inputs') -Directory | Sort-Object Name) { + $dir = Join-Path $Out $in.Name + if (Test-Path $dir) { Remove-Item -Recurse -Force $dir } + New-Item -ItemType Directory $dir | Out-Null + foreach ($f in 'frozen-model.json', 'weather.epw', 'model.osm', 'in.idf', 'export.json') { Copy-Item (Join-Path $in.FullName $f) $dir } + $fixture = if ($in.Name -like 'box*') { 's08-fix-box' } else { 's08-fix-two' } + & $exe read --run $dir > (Join-Path $dir 'read.console.txt') 2>&1 + $readExit = $LASTEXITCODE + & $exe compare --run $dir --fixture-id $fixture --rule-set approved --out (Join-Path $dir 'compare-approved') > (Join-Path $dir 'compare.console.txt') 2>&1 + $exit = $LASTEXITCODE + $r = Get-Content -Raw (Join-Path $dir 'compare-approved\report.json') | ConvertFrom-Json + $counts = ($r.CountByOutcome.PSObject.Properties | ForEach-Object { "$($_.Name) $($_.Value)" }) -join ', ' + "{0}: read {1}; compare exit {2}; {3}; {4} {5}/{6}; Consistency {7}; Unsupported {8}; {9}" -f $in.Name, $readExit, $exit, $r.Status, $r.Coverage, $r.Results, $r.Required, @($r.Consistency).Count, @($r.Unsupported).Count, $counts + foreach ($c in @($r.Consistency)) { " Consistency: $c" } + foreach ($u in @($r.Unsupported)) { " Unsupported: $u" } +} diff --git a/documentation/S09-OpenStudio-InputReadBack-evidence/revision-4/README.md b/documentation/S09-OpenStudio-InputReadBack-evidence/revision-4/README.md new file mode 100644 index 0000000..196d03e --- /dev/null +++ b/documentation/S09-OpenStudio-InputReadBack-evidence/revision-4/README.md @@ -0,0 +1,101 @@ +# S09 revision 4 evidence: the final-head CI failure at `e0a6ea19` + +Build (Windows) run 39603021836 on the revision-3 head `e0a6ea1950455e04dbf086d164500fd8829867ec` failed 1 of the 58 +S09 tests: `EveryTargetedMutation_Fails("neg-people-density","s08-fix-box")`, `DirectoryNotFoundException` loading +`compare-approved/report.json` (`ci-39603021836-excerpt.txt`). The benchmark tests (51/51) and SPDX run 39603021804 +passed. Every dependency resolved to `sow/2026-Q4` (SAM_Tas `c50e9169`). Revision 4 (code `0c232875`) is the response. + +## What the CI run shows, and what it does not + +- `compare` wrote no `compare-approved` directory. `OsReport.Save` creates that directory first, so `compare` returned + before `Save`. In `ReadBackCompare.Run` that happens only for exit 64 (usage), exit 70 from the infrastructure checks, + or exit 70 from an exception caught in `Program.Main`. The preceding `read` step returned 0 (the test asserts it). +- The test captured `compare`'s exit code and output but loaded `report.json` before checking it, so the exit code and + stderr were lost. No diagnostic artifact was kept. **Which of those branches ran in CI is therefore not known.** +- The failed test took 695 ms. The other box negatives in that run took "1 s" each, about 1.5 s apart. This fits a + `compare` that stopped before comparing, but does not prove a branch. + +## The defect found: process freshness was judged by process id alone + +`ReadBackCompare.Infrastructure` (reviewed head) refused a read as infrastructure (exit 70) when the reader's id +equalled the export's id, or the comparison's id equalled the reader's. Windows hands out the id of an exited process +again, so an equal id does not show the same process: +- A negative copy keeps the `export.json` of the original export (the test fixture's one-time set-up), whose process + exited long before. A later reader can be given that id. The same holds between a reader and the next `compare`. +- `pid-reuse.ps1` launches the harness 1000 times in sequence, as `TestSupport.Cli` does. On this workstation it got + **141 ids that an earlier launch already had**, at least 164 launches apart (`pid-reuse-1000.txt`). A 200-launch run + got 0 and an earlier one 4: reuse depends on machine load. It was not measured on a GitHub runner, so how often it + hits the S09 suite there is not known. + +**Reproduced locally** (`simulate-pid-reuse.ps1`, `ab-*-summary.txt`). The state that id reuse produces is a +negative copy whose `export.json` id equals its reader's id, while the reader started after the export finished. The +script makes that state by writing the reader's id into the copy's `export.json`: + +| Binary (local Release x64) | `control` copies (as made) | `reused` copies (reader's id written into export.json) | +|---|---|---| +| reviewed head source `e0a6ea19`, `os-input-readback.dll` `5041645c…` | FAIL, exit 10, report written (3/3) | **exit 70, `infrastructure: the reader did not run in a fresh process after the export`, no `compare-approved` (3/3)**, 175–233 ms | +| revision 4 `0c232875`, `25a35b92…` | FAIL, exit 10 (3/3) | **FAIL, exit 10, report written (3/3)**; `report.txt` byte-identical to the controls, to the base controls and to the acc3 `neg-people-density` report | + +The reviewed head's result is the CI signature: exit before `Save`, no `compare-approved`, and the test's +`DirectoryNotFoundException`. With the revision-4 diagnostics the same state reports the cause directly +(`old-check-diagnostics.txt`). + +**Conclusion.** The id-only check is a defect: it refuses a fresh process whose id was reused, and that state produces +exactly the CI failure. It is the only mechanism found that matches the evidence. That it *was* the CI cause is likely +but unproven, because the CI run kept no output. An exception inside `compare` is not ruled out by CI evidence. Locally, +none of 319 earlier test runs and none of the acc3/acc5/acc6 runs lacked a report. + +## Change (code `0c232875`) + +- `ProcessIdentity` (in `Classes/ExportManifest.cs`): a process is its id **and** its OS creation time. + - `export.json` (schema `s09-export/2`) and `native.json` (schema `s09-native/2`) record `ProcessStartedUtc`. + - Reader and export are the same process only when both match. The reader must still start after the export + finished, as before. + - A missing identity is an infrastructure failure ("the export or reader process identity is not recorded"), so + older (`/1`) files and hand-made ones fail closed. + - The comparison is refused when its own id and creation time are the reader's. + - `report.json` Inputs add `exportProcessStartedUtc`, `readerProcessStartedUtc` and `compareProcessStartedUtc`. + `report.txt` is unchanged. +- `TestSupport.ReadAndCompare` asserts `report.json` exists before parsing it. A failed `read` or `compare` reports: + - the exit code and labelled stdout/stderr (16,000 characters at most); + - both process identities and times; + - the run's file list. + + It writes the same text to `s09-diagnostics/-.txt`. The Build workflow uploads those `.txt` files only + when a step fails (`-s09-diagnostics`, 30 days). No native files are uploaded. +- Not changed: the hash checks, fixture bytes, weather, tolerances, the shared core, the writer, and every existing + negative and assertion. No retry was added. + +## Results + +| Check | At | Result | +|---|---|---| +| S09 tests | `0c232875` (harness `25a35b92…`, library `006668df…`) | **62/62**: the 58 existing, unchanged, plus 4 new: `AReusedProcessId_IsNotTheExportProcess` (FAIL, exit 10, report) and `AReadNotProvenFresh_IsAnInfrastructureFailure` × 3 (same process, identity not recorded, read before the export finished: exit 70, no report) | +| The 4 new tests with the reviewed head's id-only check restored (local edit, then restored and rebuilt) | working tree | `AReusedProcessId_IsNotTheExportProcess` **fails** (exit 70); the 3 refusal cases pass under both | +| Benchmark tests (not Simulation) | `0c232875` | 51/51 | +| Acceptance and negatives, `C:\TasOut\s09\acc6` | harness `25a35b92…` | box and two BLOCKED owner (12), 316/316 and 586/586; box repeat IDF identical; 16/16 negatives FAIL (10); originals unchanged. All 19 `report.txt` and the 3 IDFs byte-identical to acc3 | +| Before/after, `C:\TasOut\s09\rev4-ab` | `5041645c…` vs `25a35b92…` | see the table above | + +- `C:\TasOut\s09\acc5` is the same acceptance with the pre-commit working-tree build (`8601ba19…`, the same source + with LF endings). It gave the same results. +- `C:\TasOut\s09\acc4-discarded-old-check-binary` was run by mistake with the temporary id-only build and is not + evidence. +- The committed `../runs`, `../negatives` and `../summary-*.json` stay the acc3 pack (schema `/1`, harness `b7cf9f26…`). + Their `report.txt` content is what acc6 reproduces. + +Reproduce, from the repository root in Windows PowerShell (the EPW as in the PR record): +1. Build `benchmark/SAM.Analytical.OpenStudio.InputReadBack.Cli` (Release x64, `dotnet build --no-incremental`) at + `e0a6ea19` and at `0c232875`, and copy each `bin/x64/Release/net8.0` folder (`bin-base`, `bin-rev`). + - Only `Export.cs`, `ReadBackRead.cs`, `ExportManifest.cs` and `NativeReader.cs` differ between them + (`git diff --name-only e0a6ea19 0c232875`). + - `dotnet test` does not accept `--no-incremental` with SDK 10.0.401; build first, then `dotnet test --no-build`. +2. `simulate-pid-reuse.ps1 -Exe \os-input-readback.exe -Model benchmark/SAM.Analytical.OpenStudio.InputReadBack/Fixtures/s08-fix-box.json -Epw -Out ` + for each binary. +3. `pid-reuse.ps1 -Exe \os-input-readback.exe -Count 1000`. + +## Observation, not changed here + +SAM_Tas `SAM_Tas/SAM.Analytical.Tas.DirectT3D.Validation/ReadBack/ReadBackCompare.cs:159` (S08, `c50e9169`) also +refuses a read whose reader id equals the export id. Whether id reuse can reach it depends on how S08 runs its steps, +which was not assessed, and the S08 check was not exercised here. SAM_Tas is read-only for S09; any change there is a +separate task. diff --git a/documentation/S09-OpenStudio-InputReadBack-evidence/revision-4/ab-base-summary.txt b/documentation/S09-OpenStudio-InputReadBack-evidence/revision-4/ab-base-summary.txt new file mode 100644 index 0000000..2114d27 --- /dev/null +++ b/documentation/S09-OpenStudio-InputReadBack-evidence/revision-4/ab-base-summary.txt @@ -0,0 +1,25 @@ +export exit 0 3480 ms [openstudio.EpwFile] <0> Appears there are no design condition fields in the EPW file 'C:/TasOut/s09/rev4-ab/base/source/weather.epw' +negative control1 exit 0 233 ms negative neg-people-density: IDF People 'SAM_InternalCondition_FIX_IC_BOX_af50b3dc_People' density x 1.01 +read control1 exit 0 401 ms read: 47 IDF objects, 23 OSM objects, 15 IDF schedules (0 unreadable), 11 OSM schedules; pid 40380 +compare control1 exit 10 703 ms S09 OpenStudio read-back: s08-fix-box -> Fail (exit 10); rule set Approved; gate Fail; coverage Complete (316 required, 316 results) +control1 compare-approved written: True +negative reused1 exit 0 222 ms negative neg-people-density: IDF People 'SAM_InternalCondition_FIX_IC_BOX_af50b3dc_People' density x 1.01 +read reused1 exit 0 435 ms read: 47 IDF objects, 23 OSM objects, 15 IDF schedules (0 unreadable), 11 OSM schedules; pid 41972 +compare reused1 exit 70 175 ms os-input-readback.exe : infrastructure: the reader did not run in a fresh process after the export +reused1 compare-approved written: False +negative control2 exit 0 187 ms negative neg-people-density: IDF People 'SAM_InternalCondition_FIX_IC_BOX_af50b3dc_People' density x 1.01 +read control2 exit 0 341 ms read: 47 IDF objects, 23 OSM objects, 15 IDF schedules (0 unreadable), 11 OSM schedules; pid 43676 +compare control2 exit 10 537 ms S09 OpenStudio read-back: s08-fix-box -> Fail (exit 10); rule set Approved; gate Fail; coverage Complete (316 required, 316 results) +control2 compare-approved written: True +negative reused2 exit 0 221 ms negative neg-people-density: IDF People 'SAM_InternalCondition_FIX_IC_BOX_af50b3dc_People' density x 1.01 +read reused2 exit 0 360 ms read: 47 IDF objects, 23 OSM objects, 15 IDF schedules (0 unreadable), 11 OSM schedules; pid 7340 +compare reused2 exit 70 233 ms os-input-readback.exe : infrastructure: the reader did not run in a fresh process after the export +reused2 compare-approved written: False +negative control3 exit 0 296 ms negative neg-people-density: IDF People 'SAM_InternalCondition_FIX_IC_BOX_af50b3dc_People' density x 1.01 +read control3 exit 0 479 ms read: 47 IDF objects, 23 OSM objects, 15 IDF schedules (0 unreadable), 11 OSM schedules; pid 26144 +compare control3 exit 10 607 ms S09 OpenStudio read-back: s08-fix-box -> Fail (exit 10); rule set Approved; gate Fail; coverage Complete (316 required, 316 results) +control3 compare-approved written: True +negative reused3 exit 0 189 ms negative neg-people-density: IDF People 'SAM_InternalCondition_FIX_IC_BOX_af50b3dc_People' density x 1.01 +read reused3 exit 0 317 ms read: 47 IDF objects, 23 OSM objects, 15 IDF schedules (0 unreadable), 11 OSM schedules; pid 42868 +compare reused3 exit 70 193 ms os-input-readback.exe : infrastructure: the reader did not run in a fresh process after the export +reused3 compare-approved written: False diff --git a/documentation/S09-OpenStudio-InputReadBack-evidence/revision-4/ab-rev-summary.txt b/documentation/S09-OpenStudio-InputReadBack-evidence/revision-4/ab-rev-summary.txt new file mode 100644 index 0000000..c924d40 --- /dev/null +++ b/documentation/S09-OpenStudio-InputReadBack-evidence/revision-4/ab-rev-summary.txt @@ -0,0 +1,25 @@ +export exit 0 10692 ms [openstudio.EpwFile] <0> Appears there are no design condition fields in the EPW file 'C:/TasOut/s09/rev4-ab/rev/source/weather.epw' +negative control1 exit 0 309 ms negative neg-people-density: IDF People 'SAM_InternalCondition_FIX_IC_BOX_af50b3dc_People' density x 1.01 +read control1 exit 0 436 ms read: 47 IDF objects, 23 OSM objects, 15 IDF schedules (0 unreadable), 11 OSM schedules; pid 20164 +compare control1 exit 10 939 ms S09 OpenStudio read-back: s08-fix-box -> Fail (exit 10); rule set Approved; gate Fail; coverage Complete (316 required, 316 results) +control1 compare-approved written: True +negative reused1 exit 0 270 ms negative neg-people-density: IDF People 'SAM_InternalCondition_FIX_IC_BOX_af50b3dc_People' density x 1.01 +read reused1 exit 0 349 ms read: 47 IDF objects, 23 OSM objects, 15 IDF schedules (0 unreadable), 11 OSM schedules; pid 39116 +compare reused1 exit 10 664 ms S09 OpenStudio read-back: s08-fix-box -> Fail (exit 10); rule set Approved; gate Fail; coverage Complete (316 required, 316 results) +reused1 compare-approved written: True +negative control2 exit 0 236 ms negative neg-people-density: IDF People 'SAM_InternalCondition_FIX_IC_BOX_af50b3dc_People' density x 1.01 +read control2 exit 0 286 ms read: 47 IDF objects, 23 OSM objects, 15 IDF schedules (0 unreadable), 11 OSM schedules; pid 10516 +compare control2 exit 10 609 ms S09 OpenStudio read-back: s08-fix-box -> Fail (exit 10); rule set Approved; gate Fail; coverage Complete (316 required, 316 results) +control2 compare-approved written: True +negative reused2 exit 0 213 ms negative neg-people-density: IDF People 'SAM_InternalCondition_FIX_IC_BOX_af50b3dc_People' density x 1.01 +read reused2 exit 0 380 ms read: 47 IDF objects, 23 OSM objects, 15 IDF schedules (0 unreadable), 11 OSM schedules; pid 30732 +compare reused2 exit 10 695 ms S09 OpenStudio read-back: s08-fix-box -> Fail (exit 10); rule set Approved; gate Fail; coverage Complete (316 required, 316 results) +reused2 compare-approved written: True +negative control3 exit 0 229 ms negative neg-people-density: IDF People 'SAM_InternalCondition_FIX_IC_BOX_af50b3dc_People' density x 1.01 +read control3 exit 0 489 ms read: 47 IDF objects, 23 OSM objects, 15 IDF schedules (0 unreadable), 11 OSM schedules; pid 41968 +compare control3 exit 10 657 ms S09 OpenStudio read-back: s08-fix-box -> Fail (exit 10); rule set Approved; gate Fail; coverage Complete (316 required, 316 results) +control3 compare-approved written: True +negative reused3 exit 0 301 ms negative neg-people-density: IDF People 'SAM_InternalCondition_FIX_IC_BOX_af50b3dc_People' density x 1.01 +read reused3 exit 0 452 ms read: 47 IDF objects, 23 OSM objects, 15 IDF schedules (0 unreadable), 11 OSM schedules; pid 45548 +compare reused3 exit 10 781 ms S09 OpenStudio read-back: s08-fix-box -> Fail (exit 10); rule set Approved; gate Fail; coverage Complete (316 required, 316 results) +reused3 compare-approved written: True diff --git a/documentation/S09-OpenStudio-InputReadBack-evidence/revision-4/ci-39603021836-excerpt.txt b/documentation/S09-OpenStudio-InputReadBack-evidence/revision-4/ci-39603021836-excerpt.txt new file mode 100644 index 0000000..6399604 --- /dev/null +++ b/documentation/S09-OpenStudio-InputReadBack-evidence/revision-4/ci-39603021836-excerpt.txt @@ -0,0 +1,49 @@ +# Build (Windows) run 39603021836, job 119232047962, head e0a6ea1950455e04dbf086d164500fd8829867ec (pull/33/merge). +# Excerpt of 'gh run view 39603021836 --repo SAM-BIM/SAM_OpenStudio --log-failed' (column 1-2 prefixes and ANSI codes removed). + +2026-10-21T12:52:18.5165501Z Cloning SAM-BIM/SAM @ sow/2026-Q4 +2026-10-21T12:52:18.5394348Z Cloning into 'SAM'... +2026-10-21T12:52:20.4921931Z Cloning SAM-BIM/SAM_SQLite @ sow/2026-Q4 +2026-10-21T12:52:20.5143429Z Cloning into 'SAM_SQLite'... +... +2026-10-21T12:52:21.3373725Z Cloning SAM-BIM/SAM_Validation @ sow/2026-Q4 +2026-10-21T12:52:21.3598075Z Cloning into 'SAM_Validation'... +... +2026-10-21T12:52:36.8986558Z ##[endgroup] +2026-10-21T12:52:37.5052250Z Cloning SAM-BIM/SAM_Tas @ sow/2026-Q4 (sparse) +2026-10-21T12:52:37.5275493Z Cloning into 'SAM_Tas'... +2026-10-21T12:52:38.3492344Z SAM_Tas at c50e91698e931f98633ac2cb169417e4568da61d (sow/2026-Q4) +... +2026-10-21T12:54:56.7731248Z Total tests: 51 +... +2026-10-21T12:55:36.8122536Z Passed EveryTargetedMutation_Fails("neg-identity-swap-names","s08-fix-two") [1 s] +2026-10-21T12:55:36.8338870Z Passed EveryTargetedMutation_Fails("neg-schedule-swap","s08-fix-box") [1 s] +2026-10-21T12:55:38.8588763Z Passed EveryTargetedMutation_Fails("neg-v1-unscheduled","s08-fix-two") [2 s] +2026-10-21T12:55:40.3571869Z Passed EveryTargetedMutation_Fails("neg-missing-dsoa-link","s08-fix-box") [1 s] +2026-10-21T12:55:41.8574263Z Passed EveryTargetedMutation_Fails("neg-missing-schedule-object","s08-fix-box") [1 s] +2026-10-21T12:55:43.3590741Z Failed EveryTargetedMutation_Fails("neg-people-density","s08-fix-box") [695 ms] +2026-10-21T12:55:43.3591572Z Error Message: +2026-10-21T12:55:43.3593177Z System.IO.DirectoryNotFoundException : Could not find a part of the path 'D:\a\SAM_OpenStudio\SAM_OpenStudio\SAM_OpenStudio\benchmark\SAM.Analytical.OpenStudio.InputReadBack.Tests\bin\x64\Release\net8.0\s09-runs\neg-people-density-b0da74\compare-approved\report.json'. +2026-10-21T12:55:43.3594927Z Stack Trace: +2026-10-21T12:55:43.3595736Z at Microsoft.Win32.SafeHandles.SafeFileHandle.CreateFile(String fullPath, FileMode mode, FileAccess access, FileShare share, FileOptions options) +2026-10-21T12:55:43.3597441Z at Microsoft.Win32.SafeHandles.SafeFileHandle.Open(String fullPath, FileMode mode, FileAccess access, FileShare share, FileOptions options, Int64 preallocationSize, Nullable`1 unixCreateMode) +2026-10-21T12:55:43.3599314Z at System.IO.Strategies.OSFileStreamStrategy..ctor(String path, FileMode mode, FileAccess access, FileShare share, FileOptions options, Int64 preallocationSize, Nullable`1 unixCreateMode) +2026-10-21T12:55:43.3601306Z at System.IO.Strategies.FileStreamHelpers.ChooseStrategyCore(String path, FileMode mode, FileAccess access, FileShare share, FileOptions options, Int64 preallocationSize, Nullable`1 unixCreateMode) +2026-10-21T12:55:43.3602813Z at System.IO.StreamReader.ValidateArgsAndOpenPath(String path, Encoding encoding, Int32 bufferSize) +2026-10-21T12:55:43.3603618Z at System.IO.File.ReadAllText(String path, Encoding encoding) +2026-10-21T12:55:43.3604944Z at SAM.Analytical.OpenStudio.InputReadBack.OsReport.Load(String path) in D:\a\SAM_OpenStudio\SAM_OpenStudio\SAM_OpenStudio\benchmark\SAM.Analytical.OpenStudio.InputReadBack\Report\OsReport.cs:line 86 +2026-10-21T12:55:43.3607179Z at SAM.Analytical.OpenStudio.InputReadBack.Tests.TestSupport.ReadAndCompare(String run, String fixtureId) in D:\a\SAM_OpenStudio\SAM_OpenStudio\SAM_OpenStudio\benchmark\SAM.Analytical.OpenStudio.InputReadBack.Tests\TestSupport.cs:line 111 +2026-10-21T12:55:43.3609787Z at SAM.Analytical.OpenStudio.InputReadBack.Tests.ReadBackTests.EveryTargetedMutation_Fails(String caseId, String fixture) in D:\a\SAM_OpenStudio\SAM_OpenStudio\SAM_OpenStudio\benchmark\SAM.Analytical.OpenStudio.InputReadBack.Tests\ReadBackTests.cs:line 145 +2026-10-21T12:55:43.3611893Z at InvokeStub_ReadBackTests.EveryTargetedMutation_Fails(Object, Span`1) +2026-10-21T12:55:43.3612994Z at System.Reflection.MethodBaseInvoker.InvokeWithFewArgs(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture) +2026-10-21T12:55:43.3613832Z +2026-10-21T12:55:44.8608319Z Passed EveryTargetedMutation_Fails("neg-layer-conductivity","s08-fix-two") [1 s] +... +2026-10-21T12:56:39.0942212Z Test Run Failed. +2026-10-21T12:56:39.0942472Z Total tests: 58 +2026-10-21T12:56:39.0944698Z Passed: 57 +2026-10-21T12:56:39.0944949Z Failed: 1 +2026-10-21T12:56:39.0945177Z Total time: 1.5862 Minutes +... +2026-10-21T12:56:39.3399742Z ##[error]Process completed with exit code 1. +... diff --git a/documentation/S09-OpenStudio-InputReadBack-evidence/revision-4/old-check-diagnostics.txt b/documentation/S09-OpenStudio-InputReadBack-evidence/revision-4/old-check-diagnostics.txt new file mode 100644 index 0000000..2ab504f --- /dev/null +++ b/documentation/S09-OpenStudio-InputReadBack-evidence/revision-4/old-check-diagnostics.txt @@ -0,0 +1,23 @@ +# AReusedProcessId_IsNotTheExportProcess run against the reviewed head's id-only freshness check (a temporary local +# edit of ReadBackRead.cs, then restored), showing the revision-4 TestSupport diagnostics for a compare with no report. + + Failed AReusedProcessId_IsNotTheExportProcess [729 ms] + Error Message: + compare exit 70 (\SAM_OpenStudio\benchmark\SAM.Analytical.OpenStudio.InputReadBack.Tests\bin\x64\Release\net8.0\s09-runs\neg-people-density-6a6bba) +output: +[stdout] +[stderr] +infrastructure: the reader did not run in a fresh process after the export + +export: schema s09-export/2, pid 24524, process started 2026-10-21T14:27:41.8185370Z, started 2026-10-21T14:27:41.8802897Z, finished 2026-10-21T14:27:44.9366905Z, mutation neg-people-density: IDF People 'SAM_InternalCondition_FIX_IC_BOX_af50b3dc_People' density x 1.01 +reader: schema s09-native/2, pid 24524, process started 2026-10-21T14:27:54.1284592Z, started 2026-10-21T14:27:54.1659206Z, finished 2026-10-21T14:27:54.3867906Z +file export.json 6393 bytes, written 2026-10-21T14:27:54.4646825Z +file frozen-model.json 723176 bytes, written 2026-10-21T10:13:28.4709333Z +file in.idf 2297921 bytes, written 2026-10-21T14:27:54.0791971Z +file model.osm 5565770 bytes, written 2026-10-21T14:27:54.0840184Z +file native.json 3113402 bytes, written 2026-10-21T14:27:54.4275682Z +file weather.epw 1582702 bytes, written 2026-10-21T10:38:56.0058835Z + +Assert.That(exit, Is.EqualTo(ReadBackExit.Fail)) + Expected: 10 + But was: 70 diff --git a/documentation/S09-OpenStudio-InputReadBack-evidence/revision-4/pid-reuse-1000.txt b/documentation/S09-OpenStudio-InputReadBack-evidence/revision-4/pid-reuse-1000.txt new file mode 100644 index 0000000..c2a88a2 --- /dev/null +++ b/documentation/S09-OpenStudio-InputReadBack-evidence/revision-4/pid-reuse-1000.txt @@ -0,0 +1,142 @@ +launches 1000; distinct ids 859; reused 141 +pid 41252: launch 1 and 387 (386 apart) +pid 43280: launch 241 and 427 (186 apart) +pid 41432: launch 76 and 428 (352 apart) +pid 45384: launch 175 and 429 (254 apart) +pid 38068: launch 57 and 430 (373 apart) +pid 11792: launch 156 and 431 (275 apart) +pid 38876: launch 237 and 432 (195 apart) +pid 35636: launch 81 and 433 (352 apart) +pid 44340: launch 205 and 434 (229 apart) +pid 40136: launch 118 and 435 (317 apart) +pid 27452: launch 12 and 436 (424 apart) +pid 36200: launch 84 and 437 (353 apart) +pid 35712: launch 64 and 438 (374 apart) +pid 42092: launch 65 and 439 (374 apart) +pid 38312: launch 160 and 440 (280 apart) +pid 44540: launch 149 and 441 (292 apart) +pid 37328: launch 171 and 442 (271 apart) +pid 38116: launch 89 and 443 (354 apart) +pid 41812: launch 138 and 444 (306 apart) +pid 43804: launch 151 and 445 (294 apart) +pid 45868: launch 139 and 446 (307 apart) +pid 38860: launch 152 and 447 (295 apart) +pid 45564: launch 221 and 448 (227 apart) +pid 25420: launch 74 and 449 (375 apart) +pid 11712: launch 198 and 450 (252 apart) +pid 45252: launch 75 and 451 (376 apart) +pid 27020: launch 4 and 562 (558 apart) +pid 38148: launch 183 and 586 (403 apart) +pid 33440: launch 165 and 587 (422 apart) +pid 24316: launch 129 and 588 (459 apart) +pid 5096: launch 6 and 589 (583 apart) +pid 24828: launch 99 and 590 (491 apart) +pid 44064: launch 145 and 591 (446 apart) +pid 30052: launch 168 and 592 (424 apart) +pid 33068: launch 38 and 593 (555 apart) +pid 43624: launch 39 and 594 (555 apart) +pid 43452: launch 169 and 595 (426 apart) +pid 41004: launch 85 and 596 (511 apart) +pid 42900: launch 251 and 597 (346 apart) +pid 45608: launch 44 and 598 (554 apart) +pid 42528: launch 45 and 599 (554 apart) +pid 35588: launch 212 and 600 (388 apart) +pid 11964: launch 22 and 601 (579 apart) +pid 44500: launch 189 and 602 (413 apart) +pid 32240: launch 125 and 603 (478 apart) +pid 42016: launch 94 and 604 (510 apart) +pid 24584: launch 486 and 684 (198 apart) +pid 40324: launch 357 and 685 (328 apart) +pid 26928: launch 395 and 686 (291 apart) +pid 44348: launch 285 and 687 (402 apart) +pid 39708: launch 286 and 688 (402 apart) +pid 12564: launch 256 and 689 (433 apart) +pid 6780: launch 467 and 690 (223 apart) +pid 43172: launch 362 and 691 (329 apart) +pid 14560: launch 475 and 692 (217 apart) +pid 46008: launch 318 and 693 (375 apart) +pid 38312: launch 440 and 694 (254 apart) +pid 36492: launch 531 and 695 (164 apart) +pid 28156: launch 294 and 696 (402 apart) +pid 41732: launch 385 and 697 (312 apart) +pid 7500: launch 367 and 698 (331 apart) +pid 37328: launch 442 and 699 (257 apart) +pid 39980: launch 512 and 700 (188 apart) +pid 35380: launch 462 and 701 (239 apart) +pid 32004: launch 534 and 702 (168 apart) +pid 11616: launch 327 and 703 (376 apart) +pid 14496: launch 273 and 704 (431 apart) +pid 44596: launch 303 and 705 (402 apart) +pid 10644: launch 304 and 706 (402 apart) +pid 43676: launch 305 and 707 (402 apart) +pid 40448: launch 306 and 708 (402 apart) +pid 19172: launch 307 and 709 (402 apart) +pid 36672: launch 491 and 710 (219 apart) +pid 40676: launch 528 and 711 (183 apart) +pid 36624: launch 29 and 777 (748 apart) +pid 44152: launch 96 and 778 (682 apart) +pid 40192: launch 79 and 779 (700 apart) +pid 11804: launch 34 and 780 (746 apart) +pid 9960: launch 210 and 781 (571 apart) +pid 41788: launch 167 and 782 (615 apart) +pid 8016: launch 246 and 783 (537 apart) +pid 45912: launch 13 and 784 (771 apart) +pid 42560: launch 159 and 785 (626 apart) +pid 38660: launch 134 and 787 (653 apart) +pid 10116: launch 195 and 789 (594 apart) +pid 36084: launch 68 and 790 (722 apart) +pid 38044: launch 19 and 791 (772 apart) +pid 36604: launch 172 and 792 (620 apart) +pid 38404: launch 242 and 793 (551 apart) +pid 39644: launch 238 and 794 (556 apart) +pid 21284: launch 25 and 795 (770 apart) +pid 42684: launch 28 and 796 (768 apart) +pid 27444: launch 465 and 869 (404 apart) +pid 7492: launch 310 and 870 (560 apart) +pid 43088: launch 337 and 871 (534 apart) +pid 40204: launch 474 and 872 (398 apart) +pid 35712: launch 438 and 873 (435 apart) +pid 25420: launch 449 and 874 (425 apart) +pid 44704: launch 288 and 875 (587 apart) +pid 45208: launch 289 and 876 (587 apart) +pid 36532: launch 383 and 877 (494 apart) +pid 21872: launch 400 and 878 (478 apart) +pid 15628: launch 263 and 879 (616 apart) +pid 45700: launch 476 and 880 (404 apart) +pid 41424: launch 522 and 881 (359 apart) +pid 44120: launch 483 and 882 (399 apart) +pid 38364: launch 477 and 883 (406 apart) +pid 44476: launch 300 and 884 (584 apart) +pid 35864: launch 499 and 885 (386 apart) +pid 34696: launch 371 and 886 (515 apart) +pid 45448: launch 351 and 887 (536 apart) +pid 35636: launch 433 and 888 (455 apart) +pid 43604: launch 391 and 889 (498 apart) +pid 40236: launch 464 and 890 (426 apart) +pid 38976: launch 479 and 891 (412 apart) +pid 44808: launch 500 and 892 (392 apart) +pid 34936: launch 54 and 952 (898 apart) +pid 21056: launch 218 and 953 (735 apart) +pid 36760: launch 31 and 954 (923 apart) +pid 27776: launch 33 and 955 (922 apart) +pid 42576: launch 199 and 956 (757 apart) +pid 37816: launch 177 and 957 (780 apart) +pid 33644: launch 219 and 958 (739 apart) +pid 12788: launch 37 and 959 (922 apart) +pid 38668: launch 223 and 961 (738 apart) +pid 42840: launch 104 and 962 (858 apart) +pid 40464: launch 220 and 963 (743 apart) +pid 1032: launch 20 and 965 (945 apart) +pid 3252: launch 161 and 966 (805 apart) +pid 29980: launch 162 and 968 (806 apart) +pid 41960: launch 50 and 969 (919 apart) +pid 35784: launch 173 and 970 (797 apart) +pid 9020: launch 756 and 991 (235 apart) +pid 43676: launch 707 and 992 (285 apart) +pid 33164: launch 745 and 993 (248 apart) +pid 44624: launch 817 and 994 (177 apart) +pid 35340: launch 584 and 995 (411 apart) +pid 42152: launch 585 and 996 (411 apart) +pid 41384: launch 557 and 997 (440 apart) +pid 17888: launch 809 and 998 (189 apart) +pid 6780: launch 690 and 999 (309 apart) diff --git a/documentation/S09-OpenStudio-InputReadBack-evidence/revision-4/pid-reuse.ps1 b/documentation/S09-OpenStudio-InputReadBack-evidence/revision-4/pid-reuse.ps1 new file mode 100644 index 0000000..4295602 --- /dev/null +++ b/documentation/S09-OpenStudio-InputReadBack-evidence/revision-4/pid-reuse.ps1 @@ -0,0 +1,34 @@ +# SPDX-License-Identifier: LGPL-3.0-or-later +# Copyright (c) 2020-2026 Michal Dengusiak & Jakub Ziolkowski and contributors + +# Usage: pid-reuse.ps1 -Exe [-Count 200]. Launches the harness (no arguments: usage, exit 64) +# -Count times in sequence, as TestSupport.Cli does (redirected output, wait, dispose), and prints how many process ids +# Windows handed out again and how many launches apart. +param( + [Parameter(Mandatory = $true)][string]$Exe, + [int]$Count = 200 +) + +$ErrorActionPreference = 'Stop' +$ids = New-Object System.Collections.Generic.List[int] +for ($i = 0; $i -lt $Count; $i++) { + $info = New-Object System.Diagnostics.ProcessStartInfo $Exe + $info.UseShellExecute = $false + $info.RedirectStandardOutput = $true + $info.RedirectStandardError = $true + $process = [System.Diagnostics.Process]::Start($info) + $null = $process.StandardOutput.ReadToEnd() + $null = $process.StandardError.ReadToEnd() + $process.WaitForExit() + $ids.Add($process.Id) + $process.Dispose() +} + +$reuses = @() +for ($i = 1; $i -lt $ids.Count; $i++) { + $previous = $ids.LastIndexOf($ids[$i], $i - 1) + if ($previous -ge 0) { $reuses += "pid $($ids[$i]): launch $previous and $i ($($i - $previous) apart)" } +} + +"launches $($ids.Count); distinct ids $(($ids | Select-Object -Unique).Count); reused $($reuses.Count)" +$reuses diff --git a/documentation/S09-OpenStudio-InputReadBack-evidence/revision-4/simulate-pid-reuse.ps1 b/documentation/S09-OpenStudio-InputReadBack-evidence/revision-4/simulate-pid-reuse.ps1 new file mode 100644 index 0000000..e448460 --- /dev/null +++ b/documentation/S09-OpenStudio-InputReadBack-evidence/revision-4/simulate-pid-reuse.ps1 @@ -0,0 +1,51 @@ +# SPDX-License-Identifier: LGPL-3.0-or-later +# Copyright (c) 2020-2026 Michal Dengusiak & Jakub Ziolkowski and contributors + +# Usage: simulate-pid-reuse.ps1 -Exe -Model -Epw -Out +# [-Repeat 3]. With one binary: export the box fixture, then per repeat two neg-people-density copies, each read in a +# fresh process. "control" is compared as made; "reused" first gets the reader's process id written into its export.json, +# the state Windows id reuse produces (the export process exited long before the reader started). Prints one line per +# step: exit code, time, the first output line, and whether compare wrote compare-approved. +param( + [Parameter(Mandatory = $true)][string]$Exe, + [Parameter(Mandatory = $true)][string]$Model, + [Parameter(Mandatory = $true)][string]$Epw, + [Parameter(Mandatory = $true)][string]$Out, + [int]$Repeat = 3 +) + +$ErrorActionPreference = 'Stop' +if (Test-Path $Out) { throw "Out must be new: $Out" } +New-Item -ItemType Directory -Path $Out | Out-Null +$lines = New-Object System.Collections.Generic.List[string] + +function Step([string]$Label, [string[]]$Arguments) { + # The harness reports refusals on stderr; under Windows PowerShell 5.1 that must not stop the script. + $ErrorActionPreference = 'Continue' + $watch = [System.Diagnostics.Stopwatch]::StartNew() + $output = & $Exe @Arguments 2>&1 | Out-String + $code = $LASTEXITCODE + $watch.Stop() + $lines.Add(("{0,-22} exit {1,3} {2,6} ms {3}" -f $Label, $code, $watch.ElapsedMilliseconds, ($output.Trim() -split "`r?`n")[0])) +} + +$source = Join-Path $Out 'source' +Step 'export' @('export', '--model', $Model, '--epw', $Epw, '--out', $source, '--label', 'box') +foreach ($k in 1..$Repeat) { + foreach ($kind in 'control', 'reused') { + $run = Join-Path $Out "$kind$k" + Step "negative $kind$k" @('negative', '--run', $source, '--case', 'neg-people-density', '--out', $run) + Step "read $kind$k" @('read', '--run', $run) + if ($kind -eq 'reused') { + $manifest = Join-Path $run 'export.json' + $readerId = (Get-Content (Join-Path $run 'native.json') -Raw | ConvertFrom-Json).ProcessId + [System.IO.File]::WriteAllText($manifest, [regex]::Replace((Get-Content $manifest -Raw), '"ProcessId":\s*\d+', '"ProcessId": ' + $readerId)) + } + + Step "compare $kind$k" @('compare', '--run', $run, '--fixture-id', 's08-fix-box', '--rule-set', 'approved', '--out', (Join-Path $run 'compare-approved')) + $lines.Add("$kind$k compare-approved written: $(Test-Path (Join-Path $run 'compare-approved'))") + } +} + +$lines | Set-Content -Path (Join-Path $Out 'summary.txt') -Encoding utf8 +$lines diff --git a/documentation/S09-OpenStudio-InputReadBack-evidence/revision-5/README.md b/documentation/S09-OpenStudio-InputReadBack-evidence/revision-5/README.md new file mode 100644 index 0000000..9df1419 --- /dev/null +++ b/documentation/S09-OpenStudio-InputReadBack-evidence/revision-5/README.md @@ -0,0 +1,44 @@ +# S09 revision 5 evidence: the S07 §5.1 lighting split (amendment L1) + +Contract: SAM `documentation/SIMULATION_INPUT_MAPPING_S07.md` §5.1, merged by SAM#217 as `113873a0` (post-merge Test run +39667707673 and Build (Windows) run 39667707679 succeeded on `113873a0`). Revision 5 code: `20f8fb6`. + +**Scope of this evidence.** These are the S09 test project's own fresh-process runs (export in-process, then `read` and +`compare` each in a new process), at `20f8fb6`, Release x64, on this workstation. The acceptance and packing scripts +(`Run-S09-ReadBack.ps1`, `Pack-S09-Evidence.ps1`) were **not** run under this revision's scope. The committed `runs/`, +`negatives/` and `summary-*.json` therefore stay the revision-3 `acc3` pack, which predates amendment L1. + +| File | Content | +|---|---| +| `box-report-approved.txt`, `two-report-approved.txt` | `compare-approved/report.txt` of the two fixture runs of `ReadBackTests` at `20f8fb6` (harness `os-input-readback.dll` `3549e421…`, library `b4e03d5f…`) | +| `idf-diff-acc6.txt` | `diff` of each fixture IDF from the revision-4 acceptance (`C:\TasOut\s09\acc6`, machine-local) against the revision-5 test run, with hashes | +| `test-summaries.txt` | the local test summaries at `20f8fb6`, and the A/B with the previous writer and importer | + +## Results + +- **Fixtures (S08 signed-off bytes, Budapest EPW `472ffb4e…`):** both BLOCKED owner, exit 12, complete coverage. + - `s08-fix-box`: 319/319 (was 316: the lighting rows are now 5 per space, were 2). Match 220, WithinTolerance 25, + AcceptedTransformation 4, NotApplicable 1, MappingDifference 69. + - `s08-fix-two`: 592/592 (was 586). Match 393, WithinTolerance 46, AcceptedTransformation 14 (6 ventilation, 8 + lighting), NotApplicable 1, MappingDifference 138. + - The only non-PASS items are the OS-MAT-SINGLE-SIDED rows (69 / 138). The lighting DOCUMENTED-DEFAULT items are + gone: the view-coefficient comparison is removed, and every lighting row of the authored p passes. +- **IDF bytes:** each fixture IDF differs from acc6 only in the `Lights` Fraction Radiant and Fraction Visible lines + (box 0.37/0.25 → 0.214869791666667/0.155130208333333; two-zone A 0.34/0.25 → 0.197447916666667/0.142552083333333, + B 0.41/0.25 → 0.238098958333333/0.171901041666667). Return Air Fraction stays blank. +- **A/B:** with the previous writer and importer (`6a36afb`) restored over `20f8fb6` and rebuilt, 18 writer tests and 21 + S09 tests fail (the S09 failures include every fixture-verdict test, because the old Fraction Visible 0.25 FAILs the + lighting rows). The working tree was restored and rebuilt before the final runs. + +## Reproduce + +```text +dotnet build SAM_OpenStudio.sln -c Release -p:Platform=x64 +dotnet test benchmark/SAM.Analytical.OpenStudio.InputReadBack.Tests/SAM.Analytical.OpenStudio.InputReadBack.Tests.csproj -c Release -p:Platform=x64 --no-build +dotnet test tests/SAM.Analytical.OpenStudio.Tests/SAM.Analytical.OpenStudio.Tests.csproj -c Release -p:Platform=x64 --no-build --filter 'TestCategory!=Simulation' +dotnet test benchmark/SAM.Analytical.OpenStudio.Benchmark.Tests/SAM.Analytical.OpenStudio.Benchmark.Tests.csproj -c Release -p:Platform=x64 --no-build --filter TestCategory!=Simulation +``` + +The fixture reports are written under the S09 test output directory, `s09-runs/box-/compare-approved/` and +`s09-runs/two-/compare-approved/`. Prerequisites are as in the record (sibling `SAM` built, `SAM_Tas` at +`sow/2026-Q4`, the Budapest EPW from the SAM checkout). diff --git a/documentation/S09-OpenStudio-InputReadBack-evidence/revision-5/box-report-approved.txt b/documentation/S09-OpenStudio-InputReadBack-evidence/revision-5/box-report-approved.txt new file mode 100644 index 0000000..4b4e8ac --- /dev/null +++ b/documentation/S09-OpenStudio-InputReadBack-evidence/revision-5/box-report-approved.txt @@ -0,0 +1,17 @@ +S09 OpenStudio read-back: s08-fix-box -> BlockedOwnerDecision (exit 12); rule set Approved; gate BlockedOwnerDecision; coverage Complete (319 required, 319 results) +outcomes: AcceptedTransformation 4, MappingDifference 69, Match 220, NotApplicable 1, WithinTolerance 25 +D-F2 space:5080c000-0000-0000-0000-00000000c001: V2 +NOT PASS MappingDifference / BlockedOwnerDecision: 69 + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer3.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer3.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer3.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:285a1884-d494-47a6-9541-942946ea00a7@space:5080c000-0000-0000-0000-00000000c001#layer1.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:285a1884-d494-47a6-9541-942946ea00a7@space:5080c000-0000-0000-0000-00000000c001#layer1.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:285a1884-d494-47a6-9541-942946ea00a7@space:5080c000-0000-0000-0000-00000000c001#layer1.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + ... 57 more in report.json diff --git a/documentation/S09-OpenStudio-InputReadBack-evidence/revision-5/idf-diff-acc6.txt b/documentation/S09-OpenStudio-InputReadBack-evidence/revision-5/idf-diff-acc6.txt new file mode 100644 index 0000000..f979b38 --- /dev/null +++ b/documentation/S09-OpenStudio-InputReadBack-evidence/revision-5/idf-diff-acc6.txt @@ -0,0 +1,25 @@ +# IDF diff: acc6 (revision 4, C:\TasOut\s09\acc6) vs the revision-5 S09 test run at 20f8fb6 +## box +249,250c249,250 +< 0.37, !- Fraction Radiant +< 0.25, !- Fraction Visible +--- +> 0.214869791666667, !- Fraction Radiant +> 0.155130208333333, !- Fraction Visible +## two +249,250c249,250 +< 0.34, !- Fraction Radiant +< 0.25, !- Fraction Visible +--- +> 0.197447916666667, !- Fraction Radiant +> 0.142552083333333, !- Fraction Visible +29826,29827c29826,29827 +< 0.41, !- Fraction Radiant +< 0.25, !- Fraction Visible +--- +> 0.238098958333333, !- Fraction Radiant +> 0.171901041666667, !- Fraction Visible +737ea1f44600aff8… */c/TasOut/s09/acc6/box/in.idf +f0b9ca4bfedddf75… */c/TasOut/s09/acc6/two/in.idf +36251efc34d2de92… *benchmark/SAM.Analytical.OpenStudio.InputReadBack.Tests/bin/x64/Release/net8.0/s09-runs/box-a8efe4/in.idf +551b12746bd00301… *benchmark/SAM.Analytical.OpenStudio.InputReadBack.Tests/bin/x64/Release/net8.0/s09-runs/two-b8cf2f/in.idf diff --git a/documentation/S09-OpenStudio-InputReadBack-evidence/revision-5/test-summaries.txt b/documentation/S09-OpenStudio-InputReadBack-evidence/revision-5/test-summaries.txt new file mode 100644 index 0000000..dd1825b --- /dev/null +++ b/documentation/S09-OpenStudio-InputReadBack-evidence/revision-5/test-summaries.txt @@ -0,0 +1,49 @@ +# Local test summaries at 20f8fb6 (Release x64); machine-local runs, not hosted CI +## writer-tests-2 +Passed! - Failed: 0, Passed: 379, Skipped: 2, Total: 381, Duration: 1 m 46 s - SAM.Analytical.OpenStudio.Tests.dll (net8.0) +## s09-tests-3 +Passed! - Failed: 0, Passed: 80, Skipped: 0, Total: 80, Duration: 2 m 16 s - SAM.Analytical.OpenStudio.InputReadBack.Tests.dll (net8.0) +## bench-tests-2 +Passed! - Failed: 0, Passed: 51, Skipped: 0, Total: 51, Duration: 162 ms - SAM.Analytical.OpenStudio.Benchmark.Tests.dll (net8.0) +## A/B: previous writer and importer (6a36afb) restored over 20f8fb6 + Failed RealConverters_ViewCoefficientsAreDetailed_LightingControlIsSummary [132 ms] + Failed RadiantProportions_ComeFromSamParameters [128 ms] + Failed AnAbsentOrNaNP_TakesTheCommonDefault_WithItsCategoryAndOpenDecisionStated(False) [126 ms] + Failed AnAbsentOrNaNP_TakesTheCommonDefault_WithItsCategoryAndOpenDecisionStated(True) [125 ms] + Failed AnAuthoredP_IsSplitByS_WithNoReturnAir(0.37d,0.15513d,0.21487d) [127 ms] + Failed AnAuthoredP_IsSplitByS_WithNoReturnAir(0.34d,0.142552d,0.197448d) [128 ms] + Failed AnAuthoredP_IsSplitByS_WithNoReturnAir(0.41d,0.171901d,0.238099d) [124 ms] + Failed AnAuthoredZero_IsPreserved_AllConvective [126 ms] + Failed Import_ANonzeroReturnAirShare_IsWarnedAndBecomesConvective [3 ms] + Failed Import_AnotherShortWaveShare_IsReported [1 ms] + Failed Import_AZeroSplit_IsAnAuthoredZero [1 ms] + Failed Import_FractionsSummingAboveOne_AreNotImported [1 ms] + Failed Import_RecoversPFromRadiantPlusVisible_AndNeverSetsTheComfortCoefficient [1 ms] + Failed RoundTrip_PreservesTheAuthoredP_WithoutAComfortCoefficient(0.37d) [544 ms] + Failed RoundTrip_PreservesTheAuthoredP_WithoutAComfortCoefficient(0.0d) [479 ms] + Failed TheComfortCoefficient_NeverChangesTheLightsFractions(0.37d) [289 ms] + Failed TheComfortCoefficient_NeverChangesTheLightsFractions(0.0d) [254 ms] + Failed TheComfortCoefficient_NeverChangesTheLightsFractions(null) [250 ms] +Failed! - Failed: 18, Passed: 361, Skipped: 2, Total: 381, Duration: 1 m 43 s - SAM.Analytical.OpenStudio.Tests.dll (net8.0) + Failed AnAuthoredZero_IsPreserved_AndReadsBackAllConvective [4 s] + Failed AnUnstatedP_IsADocumentedDefault_NeverPass("absent") [4 s] + Failed AnUnstatedP_IsADocumentedDefault_NeverPass("nan") [4 s] + Failed ASelectionThatDoesNotResolve_IsAnInvalidInput_NeverInactive("missing") [4 s] + Failed ASelectionThatDoesNotResolve_IsAnInvalidInput_NeverInactive("wrong-type") [4 s] + Failed BothFixtures_HaveCompleteCoverage_AndOnlyTheNamedOwnerDecisionRemains [< 1 ms] + Failed TheAuthoredP_IsWrittenAsTheAcceptedLightingSplit("s08-fix-box","5080c000-0000-0000-0000-00000000c001",0.37d) [307 ms] + Failed TheAuthoredP_IsWrittenAsTheAcceptedLightingSplit("s08-fix-two","5080c000-0000-0000-0000-00000000c0a1",0.34d) [440 ms] + Failed TheAuthoredP_IsWrittenAsTheAcceptedLightingSplit("s08-fix-two","5080c000-0000-0000-0000-00000000c0b1",0.41d) [438 ms] + Failed TheComfortCoefficient_LeavesEveryLightingRowUnchanged(0.49d) [4 s] + Failed TheComfortCoefficient_LeavesEveryLightingRowUnchanged(0.0d) [3 s] + Failed TheSpaceOverride_IsTheRequirement_AndIsDeliveredByTheSelectedProfile [4 s] + Failed UninterpretableMultiplicityOrOrientation_BlocksTechnical("zone-multiplier-1.5") [1 s] + Failed UninterpretableMultiplicityOrOrientation_BlocksTechnical("north-axis-text") [941 ms] + Failed UninterpretableMultiplicityOrOrientation_BlocksTechnical("coordinate-system-unknown") [1 s] + Failed UninterpretableMultiplicityOrOrientation_BlocksTechnical("world-with-north-axis") [1 s] + Failed UninterpretableMultiplicityOrOrientation_BlocksTechnical("osm-thermal-zone-duplicated") [931 ms] + Failed UninterpretableMultiplicityOrOrientation_BlocksTechnical("osm-thermal-zone-name-unlabelled") [880 ms] + Failed UninterpretableMultiplicityOrOrientation_BlocksTechnical("osm-subsurface-multiplier-relabelled") [887 ms] + Failed V1TwoZones_KeepTheirRequirement_AndDeliverNothing_UnderTheVerifiedInactiveTransformation [< 1 ms] + Failed V2ChangedBackToV1_ReadsBackAsNoDelivery [4 s] +Failed! - Failed: 21, Passed: 59, Skipped: 0, Total: 80, Duration: 2 m 3 s - SAM.Analytical.OpenStudio.InputReadBack.Tests.dll (net8.0) diff --git a/documentation/S09-OpenStudio-InputReadBack-evidence/revision-5/two-report-approved.txt b/documentation/S09-OpenStudio-InputReadBack-evidence/revision-5/two-report-approved.txt new file mode 100644 index 0000000..a91a61c --- /dev/null +++ b/documentation/S09-OpenStudio-InputReadBack-evidence/revision-5/two-report-approved.txt @@ -0,0 +1,18 @@ +S09 OpenStudio read-back: s08-fix-two -> BlockedOwnerDecision (exit 12); rule set Approved; gate BlockedOwnerDecision; coverage Complete (592 required, 592 results) +outcomes: AcceptedTransformation 14, MappingDifference 138, Match 393, NotApplicable 1, WithinTolerance 46 +D-F2 space:5080c000-0000-0000-0000-00000000c0a1: V1 +D-F2 space:5080c000-0000-0000-0000-00000000c0b1: V1 +NOT PASS MappingDifference / BlockedOwnerDecision: 138 + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer1.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer1.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer1.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer2.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer2.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer2.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer3.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer3.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer3.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:fe8a6b43-ec73-4201-91e8-0dedf413b25c@space:5080c000-0000-0000-0000-00000000c0a1#layer1.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:fe8a6b43-ec73-4201-91e8-0dedf413b25c@space:5080c000-0000-0000-0000-00000000c0a1#layer1.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:fe8a6b43-ec73-4201-91e8-0dedf413b25c@space:5080c000-0000-0000-0000-00000000c0a1#layer1.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + ... 126 more in report.json diff --git a/documentation/S09-OpenStudio-InputReadBack-evidence/revision-6/README.md b/documentation/S09-OpenStudio-InputReadBack-evidence/revision-6/README.md new file mode 100644 index 0000000..13287eb --- /dev/null +++ b/documentation/S09-OpenStudio-InputReadBack-evidence/revision-6/README.md @@ -0,0 +1,56 @@ +# S09 revision 6 evidence: two fail-closed gaps in the lighting read-back + +The independent review of `31af6022` reproduced two gaps in `OsComparison.LightingSplit`. Revision 6 code: `225881f0`. +The writer and importer split of revision 5 is unchanged. + +1. **Native domain and energy conservation were not checked.** A split shifted by 0.0004 per field is within the 0.001 + tolerance of every row, so the reviewed head accepted p = 1 with Radiant + Visible = 1.0008, and p = 0 with Fraction + Radiant −0.0004 (exit 12). +2. **The plenum-calculated return-air setting was not read.** With `Return Air Fraction Calculated from Plenum + Temperature = Yes`, the reviewed head accepted the static split (exit 12). + +| File | Content | +|---|---| +| `review-artifacts-ab.txt` | the reviewer's five machine-local artifacts (not committed), copied and read and compared fresh with the revision-6 harness, against the reviewer's reviewed-head results | +| `review-*-report.txt` | the revision-6 `report.txt` of each copied artifact | +| `test-summaries.txt` | the local test summaries at `225881f0` and the A/B of the 8 new tests | + +## Results + +| Reviewer artifact | Reviewed head `31af6022` | Revision 6 `225881f0` | +|---|---|---| +| control (p 0.37) | exit 12 | exit 12, identical outcome counts | +| p1-control (authored p = 1) | exit 12 | exit 12, identical outcome counts | +| p1-invalid-sum (sum 1.0008) | exit 12, lighting accepted | **exit 10**, 5 EXPORT-DEFECT: "Return Air + Radiant + Visible = 1.0008 exceeds 1" | +| p0-negative-fraction (Radiant −0.0004) | exit 12, lighting accepted | **exit 10**, 5 EXPORT-DEFECT: "Fraction Radiant -0.0004 is outside [0, 1]" | +| dynamic-plenum (Yes) | exit 12, lighting accepted | **exit 11**, 5 UNVERIFIED (unreadable) and a named `Unsupported` entry | + +- **A/B of the new S09 tests:** with the reviewed `OsComparison.cs` restored over `225881f0`, the 5 regressions fail + (exit 12 where 10 or 11 is required). The 3 valid controls (p = 1, p = 0, explicit No) pass under both. +- **Fixtures:** both `report.txt` files are byte-identical to `revision-5/`, and the IDFs keep their revision-5 hashes. + +## Floating-point boundary + +The domain guard accepts a fraction in [−1e-12, 1 + 1e-12] and a sum of at most 1 + 1e-12 +(`OsQuantities.LightingFractionBoundary`). +- This absorbs only the rounding of the decimal IDF text to double, which is under 1e-15 for three values in [0, 1]. + The writer's p = 1 split (0.580729166666667 + 0.419270833333333) passes. +- It is not an S07 tolerance. It is applied before, never instead of, the S07 comparison, and no S07 tolerance changed. +- A violation is decided without a numeric comparison: the rows carry no comparison, and the reason names the + violation. + +## Reproduce + +```text +dotnet build SAM_OpenStudio.sln -c Release -p:Platform=x64 +dotnet test benchmark/SAM.Analytical.OpenStudio.InputReadBack.Tests/SAM.Analytical.OpenStudio.InputReadBack.Tests.csproj -c Release -p:Platform=x64 --no-build +os-input-readback negative --run --case neg-lighting-sum-above-one --out +os-input-readback read --run +os-input-readback compare --run --fixture-id s08-fix-box --rule-set approved --out /compare-approved +``` + +The other CLI cases are `neg-lighting-radiant-to-visible` (on a p = 0 export), `neg-lighting-plenum-yes`, +`neg-lighting-plenum-unknown`, `neg-lighting-plenum-relabelled` and the control `ctl-lighting-plenum-no` (on any export). +They are not in `Run-S09-ReadBack.ps1 -Phase acceptance-negative`, which requires exit 10 on the unchanged fixture +runs: the plenum cases exit 11, and the two partition shifts are invalid only on p = 1 or p = 0 exports. That script was +not run. diff --git a/documentation/S09-OpenStudio-InputReadBack-evidence/revision-6/review-artifacts-ab.txt b/documentation/S09-OpenStudio-InputReadBack-evidence/revision-6/review-artifacts-ab.txt new file mode 100644 index 0000000..a4e5c37 --- /dev/null +++ b/documentation/S09-OpenStudio-InputReadBack-evidence/revision-6/review-artifacts-ab.txt @@ -0,0 +1,17 @@ +# The independent reviewer's machine-local artifacts (folder `s09-lighting-review`, not committed): reviewed head 31af6022 vs revision 6 225881f0 +# Each artifact copied (export.json, frozen-model.json, in.idf, model.osm, weather.epw) and read + compared fresh with the revision-6 harness; the originals are untouched. +## control +reviewed head: exit 12 outcomes: AcceptedTransformation 4, MappingDifference 69, Match 220, NotApplicable 1, WithinTolerance 25 +revision 6: exit 12 outcomes: AcceptedTransformation 4, MappingDifference 69, Match 220, NotApplicable 1, WithinTolerance 25 +## p1-control +reviewed head: exit 12 outcomes: AcceptedTransformation 3, MappingDifference 69, Match 221, NotApplicable 1, WithinTolerance 25 +revision 6: exit 12 outcomes: AcceptedTransformation 3, MappingDifference 69, Match 221, NotApplicable 1, WithinTolerance 25 +## p1-invalid-sum +reviewed head: exit 12 outcomes: AcceptedTransformation 3, MappingDifference 69, Match 220, NotApplicable 1, WithinTolerance 26 +revision 6: exit 10 outcomes: ExportDefect 5, MappingDifference 69, Match 219, NotApplicable 1, WithinTolerance 25 +## p0-negative-fraction +reviewed head: exit 12 outcomes: AcceptedTransformation 1, MappingDifference 69, Match 221, NotApplicable 1, WithinTolerance 27 +revision 6: exit 10 outcomes: ExportDefect 5, MappingDifference 69, Match 219, NotApplicable 1, WithinTolerance 25 +## dynamic-plenum +reviewed head: exit 12 outcomes: AcceptedTransformation 4, MappingDifference 69, Match 220, NotApplicable 1, WithinTolerance 25 +revision 6: exit 11 outcomes: MappingDifference 69, Match 219, NotApplicable 1, UnverifiedUnreadable 5, WithinTolerance 25 diff --git a/documentation/S09-OpenStudio-InputReadBack-evidence/revision-6/review-control-report.txt b/documentation/S09-OpenStudio-InputReadBack-evidence/revision-6/review-control-report.txt new file mode 100644 index 0000000..4b4e8ac --- /dev/null +++ b/documentation/S09-OpenStudio-InputReadBack-evidence/revision-6/review-control-report.txt @@ -0,0 +1,17 @@ +S09 OpenStudio read-back: s08-fix-box -> BlockedOwnerDecision (exit 12); rule set Approved; gate BlockedOwnerDecision; coverage Complete (319 required, 319 results) +outcomes: AcceptedTransformation 4, MappingDifference 69, Match 220, NotApplicable 1, WithinTolerance 25 +D-F2 space:5080c000-0000-0000-0000-00000000c001: V2 +NOT PASS MappingDifference / BlockedOwnerDecision: 69 + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer3.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer3.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer3.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:285a1884-d494-47a6-9541-942946ea00a7@space:5080c000-0000-0000-0000-00000000c001#layer1.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:285a1884-d494-47a6-9541-942946ea00a7@space:5080c000-0000-0000-0000-00000000c001#layer1.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:285a1884-d494-47a6-9541-942946ea00a7@space:5080c000-0000-0000-0000-00000000c001#layer1.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + ... 57 more in report.json diff --git a/documentation/S09-OpenStudio-InputReadBack-evidence/revision-6/review-dynamic-plenum-report.txt b/documentation/S09-OpenStudio-InputReadBack-evidence/revision-6/review-dynamic-plenum-report.txt new file mode 100644 index 0000000..941f687 --- /dev/null +++ b/documentation/S09-OpenStudio-InputReadBack-evidence/revision-6/review-dynamic-plenum-report.txt @@ -0,0 +1,24 @@ +S09 OpenStudio read-back: s08-fix-box -> BlockedTechnical (exit 11); rule set Approved; gate BlockedTechnical; coverage Complete (319 required, 319 results) +outcomes: MappingDifference 69, Match 219, NotApplicable 1, UnverifiedUnreadable 5, WithinTolerance 25 +D-F2 space:5080c000-0000-0000-0000-00000000c001: V2 +UNSUPPORTED (blocked technical): lighting: space:5080c000-0000-0000-0000-00000000c001: Lights 'SAM_InternalCondition_FIX_IC_BOX_af50b3dc_Lights' Return Air Fraction Calculated from Plenum Temperature = Yes: the return-air share follows the plenum temperature at run time, so a static T-LIGHT-SPLIT cannot be verified (unsupported by S09) +NOT PASS MappingDifference / BlockedOwnerDecision: 69 + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer3.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer3.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer3.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:285a1884-d494-47a6-9541-942946ea00a7@space:5080c000-0000-0000-0000-00000000c001#layer1.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:285a1884-d494-47a6-9541-942946ea00a7@space:5080c000-0000-0000-0000-00000000c001#layer1.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:285a1884-d494-47a6-9541-942946ea00a7@space:5080c000-0000-0000-0000-00000000c001#layer1.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + ... 57 more in report.json +NOT PASS UnverifiedUnreadable / BlockedTechnical: 5 + 4c.os.returnAir space:5080c000-0000-0000-0000-00000000c001.ic.lighting.returnAir: The native field could not be read: Lights 'SAM_InternalCondition_FIX_IC_BOX_af50b3dc_Lights' Return Air Fraction Calculated from Plenum Temperature = Yes: the return-air share follows the plenum temperature at run time, so a static T-LIGHT-SPLIT cannot be verified (unsupported by S09). + 4c space:5080c000-0000-0000-0000-00000000c001.ic.lighting.radiantTotal: The native field could not be read: Lights 'SAM_InternalCondition_FIX_IC_BOX_af50b3dc_Lights' Return Air Fraction Calculated from Plenum Temperature = Yes: the return-air share follows the plenum temperature at run time, so a static T-LIGHT-SPLIT cannot be verified (unsupported by S09). + 4c space:5080c000-0000-0000-0000-00000000c001.ic.lighting.visible: The native field could not be read: Lights 'SAM_InternalCondition_FIX_IC_BOX_af50b3dc_Lights' Return Air Fraction Calculated from Plenum Temperature = Yes: the return-air share follows the plenum temperature at run time, so a static T-LIGHT-SPLIT cannot be verified (unsupported by S09). + 4c space:5080c000-0000-0000-0000-00000000c001.ic.lighting.radiant: The native field could not be read: Lights 'SAM_InternalCondition_FIX_IC_BOX_af50b3dc_Lights' Return Air Fraction Calculated from Plenum Temperature = Yes: the return-air share follows the plenum temperature at run time, so a static T-LIGHT-SPLIT cannot be verified (unsupported by S09). + 4c space:5080c000-0000-0000-0000-00000000c001.ic.lighting.convective: The native field could not be read: Lights 'SAM_InternalCondition_FIX_IC_BOX_af50b3dc_Lights' Return Air Fraction Calculated from Plenum Temperature = Yes: the return-air share follows the plenum temperature at run time, so a static T-LIGHT-SPLIT cannot be verified (unsupported by S09). diff --git a/documentation/S09-OpenStudio-InputReadBack-evidence/revision-6/review-p0-negative-fraction-report.txt b/documentation/S09-OpenStudio-InputReadBack-evidence/revision-6/review-p0-negative-fraction-report.txt new file mode 100644 index 0000000..4fa5c9b --- /dev/null +++ b/documentation/S09-OpenStudio-InputReadBack-evidence/revision-6/review-p0-negative-fraction-report.txt @@ -0,0 +1,23 @@ +S09 OpenStudio read-back: s08-fix-box -> Fail (exit 10); rule set Approved; gate Fail; coverage Complete (319 required, 319 results) +outcomes: ExportDefect 5, MappingDifference 69, Match 219, NotApplicable 1, WithinTolerance 25 +D-F2 space:5080c000-0000-0000-0000-00000000c001: V2 +NOT PASS ExportDefect / Fail: 5 + 4c.os.returnAir space:5080c000-0000-0000-0000-00000000c001.ic.lighting.returnAir: The native Lights split is invalid (Lights 'SAM_InternalCondition_FIX_IC_BOX_af50b3dc_Lights' Fraction Radiant -0.0004 is outside [0, 1]); it is not compared, and no tolerance applies. + 4c space:5080c000-0000-0000-0000-00000000c001.ic.lighting.radiantTotal: The native Lights split is invalid (Lights 'SAM_InternalCondition_FIX_IC_BOX_af50b3dc_Lights' Fraction Radiant -0.0004 is outside [0, 1]); it is not compared, and no tolerance applies. + 4c space:5080c000-0000-0000-0000-00000000c001.ic.lighting.visible: The native Lights split is invalid (Lights 'SAM_InternalCondition_FIX_IC_BOX_af50b3dc_Lights' Fraction Radiant -0.0004 is outside [0, 1]); it is not compared, and no tolerance applies. + 4c space:5080c000-0000-0000-0000-00000000c001.ic.lighting.radiant: The native Lights split is invalid (Lights 'SAM_InternalCondition_FIX_IC_BOX_af50b3dc_Lights' Fraction Radiant -0.0004 is outside [0, 1]); it is not compared, and no tolerance applies. + 4c space:5080c000-0000-0000-0000-00000000c001.ic.lighting.convective: The native Lights split is invalid (Lights 'SAM_InternalCondition_FIX_IC_BOX_af50b3dc_Lights' Fraction Radiant -0.0004 is outside [0, 1]); it is not compared, and no tolerance applies. +NOT PASS MappingDifference / BlockedOwnerDecision: 69 + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer3.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer3.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer3.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:285a1884-d494-47a6-9541-942946ea00a7@space:5080c000-0000-0000-0000-00000000c001#layer1.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:285a1884-d494-47a6-9541-942946ea00a7@space:5080c000-0000-0000-0000-00000000c001#layer1.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:285a1884-d494-47a6-9541-942946ea00a7@space:5080c000-0000-0000-0000-00000000c001#layer1.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + ... 57 more in report.json diff --git a/documentation/S09-OpenStudio-InputReadBack-evidence/revision-6/review-p1-control-report.txt b/documentation/S09-OpenStudio-InputReadBack-evidence/revision-6/review-p1-control-report.txt new file mode 100644 index 0000000..cbf14ba --- /dev/null +++ b/documentation/S09-OpenStudio-InputReadBack-evidence/revision-6/review-p1-control-report.txt @@ -0,0 +1,17 @@ +S09 OpenStudio read-back: s08-fix-box -> BlockedOwnerDecision (exit 12); rule set Approved; gate BlockedOwnerDecision; coverage Complete (319 required, 319 results) +outcomes: AcceptedTransformation 3, MappingDifference 69, Match 221, NotApplicable 1, WithinTolerance 25 +D-F2 space:5080c000-0000-0000-0000-00000000c001: V2 +NOT PASS MappingDifference / BlockedOwnerDecision: 69 + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer3.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer3.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer3.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:285a1884-d494-47a6-9541-942946ea00a7@space:5080c000-0000-0000-0000-00000000c001#layer1.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:285a1884-d494-47a6-9541-942946ea00a7@space:5080c000-0000-0000-0000-00000000c001#layer1.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:285a1884-d494-47a6-9541-942946ea00a7@space:5080c000-0000-0000-0000-00000000c001#layer1.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + ... 57 more in report.json diff --git a/documentation/S09-OpenStudio-InputReadBack-evidence/revision-6/review-p1-invalid-sum-report.txt b/documentation/S09-OpenStudio-InputReadBack-evidence/revision-6/review-p1-invalid-sum-report.txt new file mode 100644 index 0000000..f2c48b2 --- /dev/null +++ b/documentation/S09-OpenStudio-InputReadBack-evidence/revision-6/review-p1-invalid-sum-report.txt @@ -0,0 +1,23 @@ +S09 OpenStudio read-back: s08-fix-box -> Fail (exit 10); rule set Approved; gate Fail; coverage Complete (319 required, 319 results) +outcomes: ExportDefect 5, MappingDifference 69, Match 219, NotApplicable 1, WithinTolerance 25 +D-F2 space:5080c000-0000-0000-0000-00000000c001: V2 +NOT PASS ExportDefect / Fail: 5 + 4c.os.returnAir space:5080c000-0000-0000-0000-00000000c001.ic.lighting.returnAir: The native Lights split is invalid (Lights 'SAM_InternalCondition_FIX_IC_BOX_af50b3dc_Lights' Return Air + Radiant + Visible = 1.0008 exceeds 1, a negative convective share (S07 §5.1: a sum above 1 is an input error)); it is not compared, and no tolerance applies. + 4c space:5080c000-0000-0000-0000-00000000c001.ic.lighting.radiantTotal: The native Lights split is invalid (Lights 'SAM_InternalCondition_FIX_IC_BOX_af50b3dc_Lights' Return Air + Radiant + Visible = 1.0008 exceeds 1, a negative convective share (S07 §5.1: a sum above 1 is an input error)); it is not compared, and no tolerance applies. + 4c space:5080c000-0000-0000-0000-00000000c001.ic.lighting.visible: The native Lights split is invalid (Lights 'SAM_InternalCondition_FIX_IC_BOX_af50b3dc_Lights' Return Air + Radiant + Visible = 1.0008 exceeds 1, a negative convective share (S07 §5.1: a sum above 1 is an input error)); it is not compared, and no tolerance applies. + 4c space:5080c000-0000-0000-0000-00000000c001.ic.lighting.radiant: The native Lights split is invalid (Lights 'SAM_InternalCondition_FIX_IC_BOX_af50b3dc_Lights' Return Air + Radiant + Visible = 1.0008 exceeds 1, a negative convective share (S07 §5.1: a sum above 1 is an input error)); it is not compared, and no tolerance applies. + 4c space:5080c000-0000-0000-0000-00000000c001.ic.lighting.convective: The native Lights split is invalid (Lights 'SAM_InternalCondition_FIX_IC_BOX_af50b3dc_Lights' Return Air + Radiant + Visible = 1.0008 exceeds 1, a negative convective share (S07 §5.1: a sum above 1 is an input error)); it is not compared, and no tolerance applies. +NOT PASS MappingDifference / BlockedOwnerDecision: 69 + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer3.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer3.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer3.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:285a1884-d494-47a6-9541-942946ea00a7@space:5080c000-0000-0000-0000-00000000c001#layer1.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:285a1884-d494-47a6-9541-942946ea00a7@space:5080c000-0000-0000-0000-00000000c001#layer1.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:285a1884-d494-47a6-9541-942946ea00a7@space:5080c000-0000-0000-0000-00000000c001#layer1.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + ... 57 more in report.json diff --git a/documentation/S09-OpenStudio-InputReadBack-evidence/revision-6/test-summaries.txt b/documentation/S09-OpenStudio-InputReadBack-evidence/revision-6/test-summaries.txt new file mode 100644 index 0000000..ba0180a --- /dev/null +++ b/documentation/S09-OpenStudio-InputReadBack-evidence/revision-6/test-summaries.txt @@ -0,0 +1,25 @@ +# Local test summaries at 225881f0 (Release x64); machine-local, not hosted CI +## r6-s09 +Passed! - Failed: 0, Passed: 88, Skipped: 0, Total: 88, Duration: 2 m 59 s - SAM.Analytical.OpenStudio.InputReadBack.Tests.dll (net8.0) +## r6-writer +Passed! - Failed: 0, Passed: 379, Skipped: 2, Total: 381, Duration: 2 m 26 s - SAM.Analytical.OpenStudio.Tests.dll (net8.0) +## r6-bench +Passed! - Failed: 0, Passed: 51, Skipped: 0, Total: 51, Duration: 301 ms - SAM.Analytical.OpenStudio.Benchmark.Tests.dll (net8.0) +## A/B: the reviewed OsComparison.cs (31af6022) restored over 225881f0, the 8 new S09 tests + Failed AnInvalidNativeSplit_FailsBeforeAnyTolerance(1.0d,"neg-lighting-sum-above-one","exceeds 1") [5 s] + Failed AnInvalidNativeSplit_FailsBeforeAnyTolerance(0.0d,"neg-lighting-radiant-to-visible","Fraction Radiant -0.0004 is outside [0, 1]") [5 s] + Failed APlenumCalculatedOrUninterpretableReturnAir_BlocksTechnically("neg-lighting-plenum-yes","= Yes: the return-air share follows the plenum temperature at run time") [1 s] + Failed APlenumCalculatedOrUninterpretableReturnAir_BlocksTechnically("neg-lighting-plenum-unknown","= 'Maybe' is neither Yes nor No (uninterpretable)") [1 s] + Failed APlenumCalculatedOrUninterpretableReturnAir_BlocksTechnically("neg-lighting-plenum-relabelled","is unreadable") [1 s] +Failed! - Failed: 5, Passed: 3, Skipped: 0, Total: 8, Duration: 25 s - SAM.Analytical.OpenStudio.InputReadBack.Tests.dll (net8.0) + Expected: 10 + But was: 12 + Expected: 10 + But was: 12 + Expected: 11 + But was: 12 + Expected: 11 + But was: 12 + Expected: 11 + But was: 12 +## fixture runs: report.txt byte-identical to revision-5/; in.idf sha256 36251efc… (box), 551b1274… (two), as revision 5 diff --git a/documentation/S09-OpenStudio-InputReadBack-evidence/revision-7/README.md b/documentation/S09-OpenStudio-InputReadBack-evidence/revision-7/README.md new file mode 100644 index 0000000..3f70cbd --- /dev/null +++ b/documentation/S09-OpenStudio-InputReadBack-evidence/revision-7/README.md @@ -0,0 +1,34 @@ +# S09 revision 7 evidence: the owner decisions and acceptance reporting + +Revision 6 (`8fd0ffc2`) passed independent technical review. On 2026-10-22 the owner took three decisions: optics +option 1 (OS-MAT-SINGLE-SIDED accepted for the two reviewed fixtures only, effect on results unmeasured), ventilation A +(T-VENT-INACTIVE confirmed) and lighting B1 (the Decision 5 reading confirmed; OD-L1 stays open). Revision 7 code: +`614a7a8d70b6a70c5628a0ef3b57eaec0c5ec794`. It reports the optics acceptance; ventilation A and lighting B1 confirm existing behaviour. + +| File | Content | +|---|---| +| `box-report-approved.txt`, `two-report-approved.txt` | the `report.txt` of each fixture from the revision-7 S09 test run | +| `test-summaries.txt` | the local S09 test summary at `614a7a8` and the A/B of the new and changed tests | + +## Results + +| Fixture | Revision 5/6 | Revision 7 | +|---|---|---| +| `s08-fix-box` | BLOCKED owner, exit 12, 319/319 | **NOT PASS, accepted limitation, exit 14**, 319/319, identical outcome counts | +| `s08-fix-two` | BLOCKED owner, exit 12, 592/592 | **NOT PASS, accepted limitation, exit 14**, 592/592, identical outcome counts | + +- Against `revision-5/`, each report differs only in its status line and in the listed rows' reasons ("Accepted by the + owner (reference); this is not a pass."). +- The acceptance (`Compare/OwnerDecisions.cs`) applies only under the approved rules, to a fixture id and frozen-model + SHA-256 that are both a reviewed fixture's, and only to 3a MAPPING-DIFFERENCE rows. Anything else stays exit 12. +- A wrong opaque optical value still FAILs (exit 10) under the acceptance, on its external-face rows. + +## Reproduce + +```text +dotnet build benchmark/SAM.Analytical.OpenStudio.InputReadBack.Tests/SAM.Analytical.OpenStudio.InputReadBack.Tests.csproj -c Release -p:Platform=x64 +dotnet test benchmark/SAM.Analytical.OpenStudio.InputReadBack.Tests/SAM.Analytical.OpenStudio.InputReadBack.Tests.csproj -c Release -p:Platform=x64 --no-build +``` + +The acceptance and packing scripts were not run; the committed pack stays acc3. No engine was run (the tests export +and translate with the OpenStudio SDK only). diff --git a/documentation/S09-OpenStudio-InputReadBack-evidence/revision-7/box-report-approved.txt b/documentation/S09-OpenStudio-InputReadBack-evidence/revision-7/box-report-approved.txt new file mode 100644 index 0000000..ab8e23f --- /dev/null +++ b/documentation/S09-OpenStudio-InputReadBack-evidence/revision-7/box-report-approved.txt @@ -0,0 +1,17 @@ +S09 OpenStudio read-back: s08-fix-box -> NotPassAcceptedLimitation (exit 14); rule set Approved; gate NotPassAcceptedLimitation; coverage Complete (319 required, 319 results) +outcomes: AcceptedTransformation 4, MappingDifference 69, Match 220, NotApplicable 1, WithinTolerance 25 +D-F2 space:5080c000-0000-0000-0000-00000000c001: V2 +NOT PASS MappingDifference / NotPassAcceptedLimitation: 69 + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Accepted by the owner (SAM_OpenStudio#33 owner decision 2026-10-22, OS-MAT-SINGLE-SIDED option 1: accepted for the reviewed fixture bytes only; effect on results unmeasured); this is not a pass. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Accepted by the owner (SAM_OpenStudio#33 owner decision 2026-10-22, OS-MAT-SINGLE-SIDED option 1: accepted for the reviewed fixture bytes only; effect on results unmeasured); this is not a pass. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Accepted by the owner (SAM_OpenStudio#33 owner decision 2026-10-22, OS-MAT-SINGLE-SIDED option 1: accepted for the reviewed fixture bytes only; effect on results unmeasured); this is not a pass. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Accepted by the owner (SAM_OpenStudio#33 owner decision 2026-10-22, OS-MAT-SINGLE-SIDED option 1: accepted for the reviewed fixture bytes only; effect on results unmeasured); this is not a pass. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Accepted by the owner (SAM_OpenStudio#33 owner decision 2026-10-22, OS-MAT-SINGLE-SIDED option 1: accepted for the reviewed fixture bytes only; effect on results unmeasured); this is not a pass. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Accepted by the owner (SAM_OpenStudio#33 owner decision 2026-10-22, OS-MAT-SINGLE-SIDED option 1: accepted for the reviewed fixture bytes only; effect on results unmeasured); this is not a pass. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer3.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Accepted by the owner (SAM_OpenStudio#33 owner decision 2026-10-22, OS-MAT-SINGLE-SIDED option 1: accepted for the reviewed fixture bytes only; effect on results unmeasured); this is not a pass. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer3.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Accepted by the owner (SAM_OpenStudio#33 owner decision 2026-10-22, OS-MAT-SINGLE-SIDED option 1: accepted for the reviewed fixture bytes only; effect on results unmeasured); this is not a pass. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer3.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Accepted by the owner (SAM_OpenStudio#33 owner decision 2026-10-22, OS-MAT-SINGLE-SIDED option 1: accepted for the reviewed fixture bytes only; effect on results unmeasured); this is not a pass. + 3a panel:285a1884-d494-47a6-9541-942946ea00a7@space:5080c000-0000-0000-0000-00000000c001#layer1.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Accepted by the owner (SAM_OpenStudio#33 owner decision 2026-10-22, OS-MAT-SINGLE-SIDED option 1: accepted for the reviewed fixture bytes only; effect on results unmeasured); this is not a pass. + 3a panel:285a1884-d494-47a6-9541-942946ea00a7@space:5080c000-0000-0000-0000-00000000c001#layer1.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Accepted by the owner (SAM_OpenStudio#33 owner decision 2026-10-22, OS-MAT-SINGLE-SIDED option 1: accepted for the reviewed fixture bytes only; effect on results unmeasured); this is not a pass. + 3a panel:285a1884-d494-47a6-9541-942946ea00a7@space:5080c000-0000-0000-0000-00000000c001#layer1.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Accepted by the owner (SAM_OpenStudio#33 owner decision 2026-10-22, OS-MAT-SINGLE-SIDED option 1: accepted for the reviewed fixture bytes only; effect on results unmeasured); this is not a pass. + ... 57 more in report.json diff --git a/documentation/S09-OpenStudio-InputReadBack-evidence/revision-7/test-summaries.txt b/documentation/S09-OpenStudio-InputReadBack-evidence/revision-7/test-summaries.txt new file mode 100644 index 0000000..703d769 --- /dev/null +++ b/documentation/S09-OpenStudio-InputReadBack-evidence/revision-7/test-summaries.txt @@ -0,0 +1,28 @@ +S09 revision 7 local test summaries (Release x64, SDK 10.0.401, SAM_Tas sow/2026-Q4 c50e9169) + +== S09 tests at 614a7a8 (working tree = the revision-7 code commit) +harness os-input-readback.dll e41b13eebb26176e093434bbb0e4f29087ea86dd288269c7cc0f31d2c95881ca +library SAM.Analytical.OpenStudio.InputReadBack.dll afc9920cee26a59acd4224dc3fee5c4ed4cc3780688dd93b0d1c366843237352 +Passed! - Failed: 0, Passed: 93, Skipped: 0, Total: 93 - SAM.Analytical.OpenStudio.InputReadBack.Tests.dll (net8.0) +(also 93/93 on the first run of the same source. One intermediate run gave 91/93: after the A/B, the restored +Cli/ReadBackRead.cs kept the A/B copy's older timestamp, so the incremental build kept the A/B binary and the same two +tests failed as in the A/B. The file was touched, rebuilt and re-run: 93/93, with byte-identical fixture reports.) + +Fixture reports (box-report-approved.txt, two-report-approved.txt): +s08-fix-box -> NotPassAcceptedLimitation (exit 14); coverage Complete (319 required, 319 results) +s08-fix-two -> NotPassAcceptedLimitation (exit 14); coverage Complete (592 required, 592 results) +Outcome counts identical to revision-5/; each report.txt differs only in its status line and the listed rows' reasons. + +== A/B: Cli/ReadBackRead.cs of 8fd0ffc2 restored (no model hash passed to OsComparison.Run, so no acceptance) +filter: TheOpticsAcceptance | AWrongOpaqueOpticalValue | BothFixtures_HaveCompleteCoverage | AnExplicitNoPlenumSetting + Passed AnExplicitNoPlenumSetting_IsTheUnchangedControl + Failed AWrongOpaqueOpticalValue_StillFails_UnderTheAcceptance (at "the internal-face rows keep their accepted limitation"; its exit-10 FAIL assertions passed) + Failed BothFixtures_HaveCompleteCoverage_AndOnlyTheNamedOwnerDecisionRemains (s08-fix-box: BlockedOwnerDecision, not NotPassAcceptedLimitation) + Passed TheOpticsAcceptance_DoesNotApplyToAChangedModel + Passed TheOpticsAcceptance_NeedsTheReviewedFixtureIdAndApprovedRules("other-fixture-id","s08-fix-two","approved") + Passed TheOpticsAcceptance_NeedsTheReviewedFixtureIdAndApprovedRules("unknown-fixture-id","s08-fix-box-copy","approved") + Passed TheOpticsAcceptance_NeedsTheReviewedFixtureIdAndApprovedRules("provisional-rules","s08-fix-box","provisional") +Total 7: Passed 5, Failed 2 + +Not run: Run-S09-ReadBack.ps1, Pack-S09-Evidence.ps1, the writer suite and the benchmark tests (no writer, importer or +benchmark file changed). No EnergyPlus or Tas execution. diff --git a/documentation/S09-OpenStudio-InputReadBack-evidence/revision-7/two-report-approved.txt b/documentation/S09-OpenStudio-InputReadBack-evidence/revision-7/two-report-approved.txt new file mode 100644 index 0000000..4f83c92 --- /dev/null +++ b/documentation/S09-OpenStudio-InputReadBack-evidence/revision-7/two-report-approved.txt @@ -0,0 +1,18 @@ +S09 OpenStudio read-back: s08-fix-two -> NotPassAcceptedLimitation (exit 14); rule set Approved; gate NotPassAcceptedLimitation; coverage Complete (592 required, 592 results) +outcomes: AcceptedTransformation 14, MappingDifference 138, Match 393, NotApplicable 1, WithinTolerance 46 +D-F2 space:5080c000-0000-0000-0000-00000000c0a1: V1 +D-F2 space:5080c000-0000-0000-0000-00000000c0b1: V1 +NOT PASS MappingDifference / NotPassAcceptedLimitation: 138 + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer1.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Accepted by the owner (SAM_OpenStudio#33 owner decision 2026-10-22, OS-MAT-SINGLE-SIDED option 1: accepted for the reviewed fixture bytes only; effect on results unmeasured); this is not a pass. + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer1.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Accepted by the owner (SAM_OpenStudio#33 owner decision 2026-10-22, OS-MAT-SINGLE-SIDED option 1: accepted for the reviewed fixture bytes only; effect on results unmeasured); this is not a pass. + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer1.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Accepted by the owner (SAM_OpenStudio#33 owner decision 2026-10-22, OS-MAT-SINGLE-SIDED option 1: accepted for the reviewed fixture bytes only; effect on results unmeasured); this is not a pass. + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer2.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Accepted by the owner (SAM_OpenStudio#33 owner decision 2026-10-22, OS-MAT-SINGLE-SIDED option 1: accepted for the reviewed fixture bytes only; effect on results unmeasured); this is not a pass. + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer2.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Accepted by the owner (SAM_OpenStudio#33 owner decision 2026-10-22, OS-MAT-SINGLE-SIDED option 1: accepted for the reviewed fixture bytes only; effect on results unmeasured); this is not a pass. + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer2.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Accepted by the owner (SAM_OpenStudio#33 owner decision 2026-10-22, OS-MAT-SINGLE-SIDED option 1: accepted for the reviewed fixture bytes only; effect on results unmeasured); this is not a pass. + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer3.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Accepted by the owner (SAM_OpenStudio#33 owner decision 2026-10-22, OS-MAT-SINGLE-SIDED option 1: accepted for the reviewed fixture bytes only; effect on results unmeasured); this is not a pass. + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer3.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Accepted by the owner (SAM_OpenStudio#33 owner decision 2026-10-22, OS-MAT-SINGLE-SIDED option 1: accepted for the reviewed fixture bytes only; effect on results unmeasured); this is not a pass. + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer3.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Accepted by the owner (SAM_OpenStudio#33 owner decision 2026-10-22, OS-MAT-SINGLE-SIDED option 1: accepted for the reviewed fixture bytes only; effect on results unmeasured); this is not a pass. + 3a panel:fe8a6b43-ec73-4201-91e8-0dedf413b25c@space:5080c000-0000-0000-0000-00000000c0a1#layer1.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Accepted by the owner (SAM_OpenStudio#33 owner decision 2026-10-22, OS-MAT-SINGLE-SIDED option 1: accepted for the reviewed fixture bytes only; effect on results unmeasured); this is not a pass. + 3a panel:fe8a6b43-ec73-4201-91e8-0dedf413b25c@space:5080c000-0000-0000-0000-00000000c0a1#layer1.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Accepted by the owner (SAM_OpenStudio#33 owner decision 2026-10-22, OS-MAT-SINGLE-SIDED option 1: accepted for the reviewed fixture bytes only; effect on results unmeasured); this is not a pass. + 3a panel:fe8a6b43-ec73-4201-91e8-0dedf413b25c@space:5080c000-0000-0000-0000-00000000c0a1#layer1.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Accepted by the owner (SAM_OpenStudio#33 owner decision 2026-10-22, OS-MAT-SINGLE-SIDED option 1: accepted for the reviewed fixture bytes only; effect on results unmeasured); this is not a pass. + ... 126 more in report.json diff --git a/documentation/S09-OpenStudio-InputReadBack-evidence/revision-8/README.md b/documentation/S09-OpenStudio-InputReadBack-evidence/revision-8/README.md new file mode 100644 index 0000000..01db128 --- /dev/null +++ b/documentation/S09-OpenStudio-InputReadBack-evidence/revision-8/README.md @@ -0,0 +1,34 @@ +# S09 revision 8 evidence: opaque face-optics correction + +The owner asked for the opaque-material mismatch to be investigated and corrected before any acceptance (2026-10-22). +Revision 8 code: `fc83a6df1f843f82a043353616a2b4e42a94e6d6`. Revision 7's optics acceptance is removed; its commits +and `revision-7/` evidence stay as history. + +| File | Content | +|---|---| +| `box-report-approved.txt`, `two-report-approved.txt` | each fixture's `report.txt` from the revision-8 S09 test run | +| `idf-diff-rev7.txt` | the fixture IDFs of the revision-7 test runs against revision 8 (zero-context diff) | +| `test-summaries.txt` | S09, writer/importer and benchmark summaries at `fc83a6d`, and the two A/Bs | + +## Results + +| Fixture | Revision 7 | Revision 8 | +|---|---|---| +| `s08-fix-box` | NOT PASS, accepted limitation, exit 14 | **BLOCKED owner, exit 12**, 319/319; 69 MAPPING-DIFFERENCE rows, all on faces EnergyPlus does not use | +| `s08-fix-two` | NOT PASS, accepted limitation, exit 14 | **BLOCKED owner, exit 12**, 592/592; 138 MAPPING-DIFFERENCE rows, all on unused faces | + +- Every used zone face holds the authored value: box 18 rows, two-zone 36 rows pass and are never listed. +- The IDFs change only in the `_Internal` materials (internal-face absorptances, e.g. Plasterboard 0.91 / 0.32 / 0.30 + instead of 0.90 / 0.38 / 0.36) and the construction layers that name them. +- Swapped-face regression: the external values written on each zone-face variant FAIL exactly 18 / 33 zone-face rows. + +## Reproduce + +```text +dotnet test benchmark/SAM.Analytical.OpenStudio.InputReadBack.Tests/SAM.Analytical.OpenStudio.InputReadBack.Tests.csproj -c Release -p:Platform=x64 +dotnet test tests/SAM.Analytical.OpenStudio.Tests/SAM.Analytical.OpenStudio.Tests.csproj -c Release -p:Platform=x64 --filter 'TestCategory!=Simulation' +dotnet test benchmark/SAM.Analytical.OpenStudio.Benchmark.Tests/SAM.Analytical.OpenStudio.Benchmark.Tests.csproj -c Release -p:Platform=x64 --filter TestCategory!=Simulation +``` + +Machine-local: the test runs under `bin/x64/Release/net8.0/s09-runs` (not committed). No engine was run; the tests +export and translate with the OpenStudio SDK only. diff --git a/documentation/S09-OpenStudio-InputReadBack-evidence/revision-8/box-report-approved.txt b/documentation/S09-OpenStudio-InputReadBack-evidence/revision-8/box-report-approved.txt new file mode 100644 index 0000000..79a0047 --- /dev/null +++ b/documentation/S09-OpenStudio-InputReadBack-evidence/revision-8/box-report-approved.txt @@ -0,0 +1,17 @@ +S09 OpenStudio read-back: s08-fix-box -> BlockedOwnerDecision (exit 12); rule set Approved; gate BlockedOwnerDecision; coverage Complete (319 required, 319 results) +outcomes: AcceptedTransformation 4, MappingDifference 69, Match 213, NotApplicable 1, WithinTolerance 32 +D-F2 space:5080c000-0000-0000-0000-00000000c001: V2 +NOT PASS MappingDifference / BlockedOwnerDecision: 69 + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer3.externalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer3.externalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer3.externalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:285a1884-d494-47a6-9541-942946ea00a7@space:5080c000-0000-0000-0000-00000000c001#layer1.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:285a1884-d494-47a6-9541-942946ea00a7@space:5080c000-0000-0000-0000-00000000c001#layer1.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:285a1884-d494-47a6-9541-942946ea00a7@space:5080c000-0000-0000-0000-00000000c001#layer1.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + ... 57 more in report.json diff --git a/documentation/S09-OpenStudio-InputReadBack-evidence/revision-8/idf-diff-rev7.txt b/documentation/S09-OpenStudio-InputReadBack-evidence/revision-8/idf-diff-rev7.txt new file mode 100644 index 0000000..7043938 --- /dev/null +++ b/documentation/S09-OpenStudio-InputReadBack-evidence/revision-8/idf-diff-rev7.txt @@ -0,0 +1,86 @@ +== box : revision 7 run box-3b6b3b vs revision 8 run box-024131 +@@ -29309 +29309 @@ Material, +- SAM_OpaqueMaterial_FIX_Plasterboard_12.5mm_5abe47a0, !- Name ++ SAM_OpaqueMaterial_FIX_Plasterboard_12.5mm_Internal_5abe47a0, !- Name +@@ -29315,3 +29315,3 @@ Material, +- 0.9, !- Thermal Absorptance +- 0.38, !- Solar Absorptance +- 0.36; !- Visible Absorptance ++ 0.91, !- Thermal Absorptance ++ 0.32, !- Solar Absorptance ++ 0.3; !- Visible Absorptance +@@ -29320 +29320 @@ Material, +- SAM_OpaqueMaterial_FIX_Plasterboard_15mm_5abe47a0, !- Name ++ SAM_OpaqueMaterial_FIX_Plasterboard_15mm_Internal_5abe47a0, !- Name +@@ -29326,3 +29326,3 @@ Material, +- 0.9, !- Thermal Absorptance +- 0.38, !- Solar Absorptance +- 0.36; !- Visible Absorptance ++ 0.91, !- Thermal Absorptance ++ 0.32, !- Solar Absorptance ++ 0.3; !- Visible Absorptance +@@ -29342 +29342 @@ Material, +- SAM_OpaqueMaterial_FIX_Screed_65mm_47d4de1a, !- Name ++ SAM_OpaqueMaterial_FIX_Screed_65mm_Internal_47d4de1a, !- Name +@@ -29348,3 +29348,3 @@ Material, +- 0.94, !- Thermal Absorptance +- 0.73, !- Solar Absorptance +- 0.72; !- Visible Absorptance ++ 0.9, !- Thermal Absorptance ++ 0.67, !- Solar Absorptance ++ 0.66; !- Visible Absorptance +@@ -29403 +29403 @@ Construction, +- SAM_OpaqueMaterial_FIX_Plasterboard_12.5mm_5abe47a0; !- Layer 4 ++ SAM_OpaqueMaterial_FIX_Plasterboard_12.5mm_Internal_5abe47a0; !- Layer 4 +@@ -29409 +29409 @@ Construction, +- SAM_OpaqueMaterial_FIX_Screed_65mm_47d4de1a; !- Layer 3 ++ SAM_OpaqueMaterial_FIX_Screed_65mm_Internal_47d4de1a; !- Layer 3 +@@ -29416 +29416 @@ Construction, +- SAM_OpaqueMaterial_FIX_Plasterboard_15mm_5abe47a0; !- Layer 4 ++ SAM_OpaqueMaterial_FIX_Plasterboard_15mm_Internal_5abe47a0; !- Layer 4 +== two : revision 7 run two-845d96 vs revision 8 run two-99d596 +@@ -59463 +59463 @@ Material, +- SAM_OpaqueMaterial_FIX_Plasterboard_12.5mm_37d096dc, !- Name ++ SAM_OpaqueMaterial_FIX_Plasterboard_12.5mm_Internal_37d096dc, !- Name +@@ -59469,3 +59469,3 @@ Material, +- 0.9, !- Thermal Absorptance +- 0.38, !- Solar Absorptance +- 0.36; !- Visible Absorptance ++ 0.91, !- Thermal Absorptance ++ 0.32, !- Solar Absorptance ++ 0.3; !- Visible Absorptance +@@ -59474 +59474 @@ Material, +- SAM_OpaqueMaterial_FIX_Plasterboard_15mm_37d096dc, !- Name ++ SAM_OpaqueMaterial_FIX_Plasterboard_15mm_Internal_37d096dc, !- Name +@@ -59480,3 +59480,3 @@ Material, +- 0.9, !- Thermal Absorptance +- 0.38, !- Solar Absorptance +- 0.36; !- Visible Absorptance ++ 0.91, !- Thermal Absorptance ++ 0.32, !- Solar Absorptance ++ 0.3; !- Visible Absorptance +@@ -59496 +59496 @@ Material, +- SAM_OpaqueMaterial_FIX_Screed_65mm_ba808960, !- Name ++ SAM_OpaqueMaterial_FIX_Screed_65mm_Internal_ba808960, !- Name +@@ -59502,3 +59502,3 @@ Material, +- 0.94, !- Thermal Absorptance +- 0.73, !- Solar Absorptance +- 0.72; !- Visible Absorptance ++ 0.9, !- Thermal Absorptance ++ 0.67, !- Solar Absorptance ++ 0.66; !- Visible Absorptance +@@ -59579 +59579 @@ Construction, +- SAM_OpaqueMaterial_FIX_Plasterboard_12.5mm_37d096dc; !- Layer 4 ++ SAM_OpaqueMaterial_FIX_Plasterboard_12.5mm_Internal_37d096dc; !- Layer 4 +@@ -59585 +59585 @@ Construction, +- SAM_OpaqueMaterial_FIX_Screed_65mm_ba808960; !- Layer 3 ++ SAM_OpaqueMaterial_FIX_Screed_65mm_Internal_ba808960; !- Layer 3 +@@ -59592 +59592 @@ Construction, +- SAM_OpaqueMaterial_FIX_Plasterboard_12.5mm_37d096dc; !- Layer 4 ++ SAM_OpaqueMaterial_FIX_Plasterboard_12.5mm_Internal_37d096dc; !- Layer 4 +@@ -59596 +59596 @@ Construction, +- SAM_OpaqueMaterial_FIX_Plasterboard_12.5mm_37d096dc, !- Layer 1 ++ SAM_OpaqueMaterial_FIX_Plasterboard_12.5mm_Internal_37d096dc, !- Layer 1 +@@ -59606 +59606 @@ Construction, +- SAM_OpaqueMaterial_FIX_Plasterboard_15mm_37d096dc; !- Layer 4 ++ SAM_OpaqueMaterial_FIX_Plasterboard_15mm_Internal_37d096dc; !- Layer 4 diff --git a/documentation/S09-OpenStudio-InputReadBack-evidence/revision-8/test-summaries.txt b/documentation/S09-OpenStudio-InputReadBack-evidence/revision-8/test-summaries.txt new file mode 100644 index 0000000..c0c443f --- /dev/null +++ b/documentation/S09-OpenStudio-InputReadBack-evidence/revision-8/test-summaries.txt @@ -0,0 +1,36 @@ +S09 revision 8 local test summaries (Release x64, SDK 10.0.401, SAM_Tas sow/2026-Q4 c50e9169) +Tested content fc83a6df1f843f82a043353616a2b4e42a94e6d6. No engine, acceptance or packing script was run. + +== S09 tests at fc83a6d (committed content, rebuilt after the A/B) +harness os-input-readback.dll 44cb71779b916c2020008534219a4ae6eb152c390598d27742f1e9e323bab40b +library SAM.Analytical.OpenStudio.InputReadBack.dll 1a4a03dfb9d8108b200407d9773d456ec209356db018323ba8126694610b2d9f +writer SAM.Analytical.OpenStudio.dll bc29f2332fb62c77f6ce6305d60b59d155e74dbc392887c0669d0ca7ef8ff92a +Passed! - Failed: 0, Passed: 95, Skipped: 0, Total: 95 - SAM.Analytical.OpenStudio.InputReadBack.Tests.dll (net8.0) +(Also 95/95 before the A/B on the same source; box-report-approved.txt and two-report-approved.txt are byte-identical +between the two runs. An earlier working-tree run gave 94/95: the single-layer test helper changed a copy of the +adjacency cluster, so its model kept the fixture roof; fixed before the commit.) + +== Writer/importer tests/SAM.Analytical.OpenStudio.Tests --filter 'TestCategory!=Simulation' at fc83a6d +Passed! - Failed: 0, Passed: 400, Skipped: 2, Total: 402 - SAM.Analytical.OpenStudio.Tests.dll (net8.0) + +== Benchmark benchmark/SAM.Analytical.OpenStudio.Benchmark.Tests --filter TestCategory!=Simulation at fc83a6d +Passed! - Failed: 0, Passed: 51, Skipped: 0, Total: 51 - SAM.Analytical.OpenStudio.Benchmark.Tests.dll (net8.0) + +== A/B 1: writer files of 7fccdcc (Material.cs, Construction.cs, AnalyticalModel.cs) restored over fc83a6d +filter: EveryUsedZoneFace | BothFixtures_HaveCompleteCoverage | ASwappedZoneFace | ASingleLayer | AWrongOpaque (8 tests) + Failed ASingleLayerGroundFloor_UsesItsZoneFace exit 10, expected 12 (the zone face is external) + Failed ASingleLayerOutdoorRoof_IsRefused_AndNamedUnsupported no SAM-OS-MAT-003 raised + Failed ASwappedZoneFace_Fails_OnExactlyTheZoneFaceRows(box, two) no _Internal material to swap + Failed AWrongOpaqueOpticalValue_Fails zone-face rows fail as well (out of tolerance) + Failed BothFixtures_HaveCompleteCoverage_... layer3.internalSolarReflectance OutOfTolerance + Failed EveryUsedZoneFace_HoldsTheAuthoredFace(box, two) layer3.internalSolarReflectance OutOfTolerance +Total 8: Failed 8. The revision-8 comparator FAILs the old writer's fixtures (exit 10) on the zone faces. + +== A/B 2: Compare/OsComparison.cs of 8fd0ffc (revision 6) restored over fc83a6d (revision-8 writer) + Failed ASingleLayerGroundFloor_UsesItsZoneFace exit 10, expected 12 (variant's buried rows unlisted) + Failed ASingleLayerOutdoorRoof_IsRefused_AndNamedUnsupported no named single-layer Unsupported entry + Failed ASwappedZoneFace_Fails_OnExactlyTheZoneFaceRows(box, two) exit 12, expected 10: the swapped zone face was hidden + Failed AWrongOpaqueOpticalValue_Fails external rows fail as well + Failed BothFixtures_HaveCompleteCoverage_... layer3.externalSolarReflectance OutOfTolerance + Failed EveryUsedZoneFace_HoldsTheAuthoredFace(box, two) used zone face listed MappingDifference +Total 8: Failed 8. Both files were restored with git, touched and rebuilt before the final run above. diff --git a/documentation/S09-OpenStudio-InputReadBack-evidence/revision-8/two-report-approved.txt b/documentation/S09-OpenStudio-InputReadBack-evidence/revision-8/two-report-approved.txt new file mode 100644 index 0000000..c823fac --- /dev/null +++ b/documentation/S09-OpenStudio-InputReadBack-evidence/revision-8/two-report-approved.txt @@ -0,0 +1,18 @@ +S09 OpenStudio read-back: s08-fix-two -> BlockedOwnerDecision (exit 12); rule set Approved; gate BlockedOwnerDecision; coverage Complete (592 required, 592 results) +outcomes: AcceptedTransformation 14, MappingDifference 138, Match 379, NotApplicable 1, WithinTolerance 60 +D-F2 space:5080c000-0000-0000-0000-00000000c0a1: V1 +D-F2 space:5080c000-0000-0000-0000-00000000c0b1: V1 +NOT PASS MappingDifference / BlockedOwnerDecision: 138 + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer1.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer1.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer1.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer2.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer2.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer2.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer3.externalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer3.externalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer3.externalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:fe8a6b43-ec73-4201-91e8-0dedf413b25c@space:5080c000-0000-0000-0000-00000000c0a1#layer1.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:fe8a6b43-ec73-4201-91e8-0dedf413b25c@space:5080c000-0000-0000-0000-00000000c0a1#layer1.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:fe8a6b43-ec73-4201-91e8-0dedf413b25c@space:5080c000-0000-0000-0000-00000000c0a1#layer1.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + ... 126 more in report.json diff --git a/documentation/S09-OpenStudio-InputReadBack-evidence/revision-9/README.md b/documentation/S09-OpenStudio-InputReadBack-evidence/revision-9/README.md new file mode 100644 index 0000000..0736a93 --- /dev/null +++ b/documentation/S09-OpenStudio-InputReadBack-evidence/revision-9/README.md @@ -0,0 +1,33 @@ +# S09 revision 9 evidence: review of revision 8 (native edits, merging, inherited faces) + +Revision 9 code: `354e5322fa3a4c31a984de911c48534e768c40e4`. It addresses the three findings of the independent review of +`901e592a`. The corrected exposed faces, the single-layer refusal, lighting and zero-delivery ventilation are unchanged. + +| File | Content | +|---|---| +| `box-report-approved.txt`, `two-report-approved.txt` | the fixture reports of the revision-9 S09 run: byte-identical to `revision-8/` (BLOCKED owner, exit 12) | +| `box-unstated-light-absent-report.txt` | the box with Plasterboard's internal light reflectance removed: S-UNSPEC EXPORT-DEFECT on exactly the 5 Plasterboard zone-face light rows | +| `test-summaries.txt` | S09, writer/importer and benchmark summaries at `354e532`, and the A/B against `901e592` | + +## Findings and results + +1. **Native edits.** Each opaque object records what was written (`SAM.Written.*`). An absorptance that differs on import + is an edit, kept on the face the object carries and reported (SAM-OSI-MAT-001). The review's reproduction (light + reflectance unstated, visible absorptance 0.7 → 0.42) now imports internal light reflectance 0.58 and re-exports + 0.42; revision 8 lost it. An unchanged default stays unstated (control). +2. **Merging.** Face and thickness objects of one explicit source Guid become one SAM material, its Guid restored and + each layer's thickness kept. Thermal, authored-optic or per-face conflicts are reported (SAM-OSI-ID-001) and not + merged; objects without source identity are never merged by name. +3. **Inherited faces.** An unstated internal value (absent or NaN) on a zone face that takes the external value raises + SAM-OS-MAT-004 at Summary; import keeps it unstated, and S09 keeps S-UNSPEC (EXPORT-DEFECT under S07). + +Found, not fixed: the importer keeps OpenStudio's outside-first layer order, so multi-layer constructions come back +reversed on round trip (pre-existing; see the PR record). + +## Reproduce + +```text +dotnet test benchmark/SAM.Analytical.OpenStudio.InputReadBack.Tests/SAM.Analytical.OpenStudio.InputReadBack.Tests.csproj -c Release -p:Platform=x64 +dotnet test tests/SAM.Analytical.OpenStudio.Tests/SAM.Analytical.OpenStudio.Tests.csproj -c Release -p:Platform=x64 --filter 'TestCategory!=Simulation' +dotnet test benchmark/SAM.Analytical.OpenStudio.Benchmark.Tests/SAM.Analytical.OpenStudio.Benchmark.Tests.csproj -c Release -p:Platform=x64 --filter TestCategory!=Simulation +``` diff --git a/documentation/S09-OpenStudio-InputReadBack-evidence/revision-9/box-report-approved.txt b/documentation/S09-OpenStudio-InputReadBack-evidence/revision-9/box-report-approved.txt new file mode 100644 index 0000000..79a0047 --- /dev/null +++ b/documentation/S09-OpenStudio-InputReadBack-evidence/revision-9/box-report-approved.txt @@ -0,0 +1,17 @@ +S09 OpenStudio read-back: s08-fix-box -> BlockedOwnerDecision (exit 12); rule set Approved; gate BlockedOwnerDecision; coverage Complete (319 required, 319 results) +outcomes: AcceptedTransformation 4, MappingDifference 69, Match 213, NotApplicable 1, WithinTolerance 32 +D-F2 space:5080c000-0000-0000-0000-00000000c001: V2 +NOT PASS MappingDifference / BlockedOwnerDecision: 69 + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer3.externalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer3.externalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer3.externalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:285a1884-d494-47a6-9541-942946ea00a7@space:5080c000-0000-0000-0000-00000000c001#layer1.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:285a1884-d494-47a6-9541-942946ea00a7@space:5080c000-0000-0000-0000-00000000c001#layer1.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:285a1884-d494-47a6-9541-942946ea00a7@space:5080c000-0000-0000-0000-00000000c001#layer1.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + ... 57 more in report.json diff --git a/documentation/S09-OpenStudio-InputReadBack-evidence/revision-9/box-unstated-light-absent-report.txt b/documentation/S09-OpenStudio-InputReadBack-evidence/revision-9/box-unstated-light-absent-report.txt new file mode 100644 index 0000000..6783112 --- /dev/null +++ b/documentation/S09-OpenStudio-InputReadBack-evidence/revision-9/box-unstated-light-absent-report.txt @@ -0,0 +1,23 @@ +S09 OpenStudio read-back: s08-fix-box -> Fail (exit 10); rule set Approved; gate Fail; coverage Complete (319 required, 319 results) +outcomes: AcceptedTransformation 4, ExportDefect 5, MappingDifference 64, Match 213, NotApplicable 1, WithinTolerance 32 +D-F2 space:5080c000-0000-0000-0000-00000000c001: V2 +NOT PASS ExportDefect / Fail: 5 + 3a panel:285a1884-d494-47a6-9541-942946ea00a7@space:5080c000-0000-0000-0000-00000000c001#layer4.internalLightReflectance: SAM states no value (S-UNSPEC) and the native holds a non-zero value that is not the contract-listed default. + 3a panel:5e4a7125-c77a-4911-9084-7cbfa9b0786c@space:5080c000-0000-0000-0000-00000000c001#layer4.internalLightReflectance: SAM states no value (S-UNSPEC) and the native holds a non-zero value that is not the contract-listed default. + 3a panel:78af8769-1ba0-43bc-844e-f1ca72fa447e@space:5080c000-0000-0000-0000-00000000c001#layer4.internalLightReflectance: SAM states no value (S-UNSPEC) and the native holds a non-zero value that is not the contract-listed default. + 3a panel:0a4398eb-cdab-43d8-bcba-736116a2a029@space:5080c000-0000-0000-0000-00000000c001#layer4.internalLightReflectance: SAM states no value (S-UNSPEC) and the native holds a non-zero value that is not the contract-listed default. + 3a panel:18cb687b-53ce-4282-be8e-6ba267a6ae2b@space:5080c000-0000-0000-0000-00000000c001#layer4.internalLightReflectance: SAM states no value (S-UNSPEC) and the native holds a non-zero value that is not the contract-listed default. +NOT PASS MappingDifference / BlockedOwnerDecision: 64 + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer3.externalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer3.externalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer3.externalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:285a1884-d494-47a6-9541-942946ea00a7@space:5080c000-0000-0000-0000-00000000c001#layer1.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:285a1884-d494-47a6-9541-942946ea00a7@space:5080c000-0000-0000-0000-00000000c001#layer1.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:285a1884-d494-47a6-9541-942946ea00a7@space:5080c000-0000-0000-0000-00000000c001#layer1.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + ... 52 more in report.json diff --git a/documentation/S09-OpenStudio-InputReadBack-evidence/revision-9/test-summaries.txt b/documentation/S09-OpenStudio-InputReadBack-evidence/revision-9/test-summaries.txt new file mode 100644 index 0000000..fe9c08f --- /dev/null +++ b/documentation/S09-OpenStudio-InputReadBack-evidence/revision-9/test-summaries.txt @@ -0,0 +1,32 @@ +S09 revision 9 local test summaries (Release x64, SDK 10.0.401, SAM_Tas sow/2026-Q4 c50e9169) +Tested content 354e5322fa3a4c31a984de911c48534e768c40e4. No engine, acceptance or packing script was run. + +== S09 tests at 354e532 (committed content, rebuilt after the A/B) +harness os-input-readback.dll 4edf422bdd9a5d789a7ac74851e78cf32eab265041e42de369fef992d047fdcc +library SAM.Analytical.OpenStudio.InputReadBack.dll 1c4408f720a57c5e8dec25a3b852a97240ea25de9cdb6ba6578c21f60d733354 +writer SAM.Analytical.OpenStudio.dll e9b8c24568ebdc45c0bcf38e66093143f54254b77160c975ef29c53117a43fe9 +Passed! - Failed: 0, Passed: 97, Skipped: 0, Total: 97 - SAM.Analytical.OpenStudio.InputReadBack.Tests.dll (net8.0) +(also 97/97 before the A/B.) box- and two-report-approved.txt are byte-identical to revision-8/. + +== Writer/importer tests/SAM.Analytical.OpenStudio.Tests --filter 'TestCategory!=Simulation' at 354e532 +Passed! - Failed: 0, Passed: 409, Skipped: 2, Total: 411 - SAM.Analytical.OpenStudio.Tests.dll (net8.0) +After the coverage-manifest edits: CompletenessTests + ReverseCoverageTests 28/28. After the A/B: OpaqueFaceOpticsTests 30/30. + +== Benchmark --filter TestCategory!=Simulation at 354e532 +Passed! - Failed: 0, Passed: 51, Skipped: 0, Total: 51 - SAM.Analytical.OpenStudio.Benchmark.Tests.dll (net8.0) + +== A/B: Material.cs, ToSAM/MaterialLibrary.cs, OpenStudioImportContext.cs, Compare/OsComparison.cs of 901e592 restored +OpaqueFaceOpticsTests: 30 total, 21 passed, 9 failed: + ANativeEditOfAnUnstatedValue_IsKeptAndReported_ThroughImportAndReexport InternalLightReflectance absent after import (the reviewed defect) + AnEditOfAStatedValue_IsKeptOnItsFace_AndReported single native value on both faces + AnUnstatedInternalValue_..._UnspecifiedProvenance(absent, nan) no SAM-OS-MAT-004 + EveryOpaqueObject_RecordsWhatWasWritten no SAM.Written.* stamps + FaceAndThicknessObjectsOfOneSource_MergeIntoOneSamMaterial_... 2 materials, expected 1 + FaceObjectsWithConflictingEditsOnOneFace_AreNotMerged_AndDiagnosed no merge conflict reported + FaceObjectsWithDifferentAuthoredOptics_AreNotMerged_AndDiagnosed revision-8 wording, no merge conflict + FaceObjectsWithDifferentThermalProperties_AreNotMerged_AndDiagnosed no merge conflict reported + Controls passing under both: AnUnchangedDefault_StaysUnstated_..., AnObjectWithoutSourceIdentity_IsNeverMergedByName, + StatedInternalValues_RaiseNoInheritanceNote and the 18 revision-8 tests. +S09: AnUnstatedZoneFaceValue_KeepsItsUnspecifiedProvenance(absent, nan) 2 failed (no SAM-OS-MAT-004); + BothFixtures_HaveCompleteCoverage_... passed. +The files were restored with git, touched and rebuilt before the final runs above. diff --git a/documentation/S09-OpenStudio-InputReadBack-evidence/revision-9/two-report-approved.txt b/documentation/S09-OpenStudio-InputReadBack-evidence/revision-9/two-report-approved.txt new file mode 100644 index 0000000..c823fac --- /dev/null +++ b/documentation/S09-OpenStudio-InputReadBack-evidence/revision-9/two-report-approved.txt @@ -0,0 +1,18 @@ +S09 OpenStudio read-back: s08-fix-two -> BlockedOwnerDecision (exit 12); rule set Approved; gate BlockedOwnerDecision; coverage Complete (592 required, 592 results) +outcomes: AcceptedTransformation 14, MappingDifference 138, Match 379, NotApplicable 1, WithinTolerance 60 +D-F2 space:5080c000-0000-0000-0000-00000000c0a1: V1 +D-F2 space:5080c000-0000-0000-0000-00000000c0b1: V1 +NOT PASS MappingDifference / BlockedOwnerDecision: 138 + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer1.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer1.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer1.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer2.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer2.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer2.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer3.externalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer3.externalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer3.externalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:fe8a6b43-ec73-4201-91e8-0dedf413b25c@space:5080c000-0000-0000-0000-00000000c0a1#layer1.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:fe8a6b43-ec73-4201-91e8-0dedf413b25c@space:5080c000-0000-0000-0000-00000000c0a1#layer1.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:fe8a6b43-ec73-4201-91e8-0dedf413b25c@space:5080c000-0000-0000-0000-00000000c0a1#layer1.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + ... 126 more in report.json diff --git a/documentation/S09-OpenStudio-InputReadBack-evidence/runs/box-repeat/export.json b/documentation/S09-OpenStudio-InputReadBack-evidence/runs/box-repeat/export.json new file mode 100644 index 0000000..4f8c445 --- /dev/null +++ b/documentation/S09-OpenStudio-InputReadBack-evidence/runs/box-repeat/export.json @@ -0,0 +1,45 @@ +{ + "Schema": "s09-export/1", + "Label": "box-repeat", + "Mutation": null, + "SourceModelPath": "/s08-fix-box.json", + "SourceEpwPath": "/budapest.epw", + "ModelSha256": "45524172b32f85df89511dd344141023de999faa9552a199e6b49062612acd08", + "EpwSha256": "472ffb4e2f10867600949a392ce46891fc1bd05f2fc8d8917a99bca7d26209c3", + "OsmSha256": "81df1925f8926476e101908b68eba4eaa63bb04a584c70f47d05561e8de36853", + "IdfSha256": "737ea1f44600aff8726d3d46203bb32e026c0ae6518107aafe92e219aaa1b6a6", + "OpenStudioSdkVersion": "3.10.0\u002B86d7e215a1", + "WriterAssembly": "/SAM.Analytical.OpenStudio.dll", + "WriterAssemblySha256": "8070337f992b57ff4585612cf7b1852053094cc3a0e54aa3567e9c34d9847414", + "ProcessId": 23712, + "StartedUtc": "2026-10-21T12:43:49.6924581Z", + "FinishedUtc": "2026-10-21T12:43:53.2787502Z", + "ConversionValid": true, + "Diagnostics": [ + "Information SAM-OS-MAT-002 Vapour diffusion factor (110) is not converted \u2014 EnergyPlus moisture modelling (HAMT/EMPD) needs data SAM does not carry", + "Information SAM-OS-MAT-002 Internal-side optical properties (InternalEmissivity, InternalSolarReflectance, InternalLightReflectance) differ from the external-side values \u2014 EnergyPlus opaque materials are single-sided; the external values govern both sides", + "Information SAM-OS-MAT-002 Vapour diffusion factor (40) is not converted \u2014 EnergyPlus moisture modelling (HAMT/EMPD) needs data SAM does not carry", + "Information SAM-OS-MAT-002 Internal-side optical properties (InternalEmissivity, InternalSolarReflectance, InternalLightReflectance) differ from the external-side values \u2014 EnergyPlus opaque materials are single-sided; the external values govern both sides", + "Information SAM-OS-MAT-002 Vapour diffusion factor (15) is not converted \u2014 EnergyPlus moisture modelling (HAMT/EMPD) needs data SAM does not carry", + "Information SAM-OS-MAT-002 Internal-side optical properties (InternalEmissivity, InternalSolarReflectance, InternalLightReflectance) differ from the external-side values \u2014 EnergyPlus opaque materials are single-sided; the external values govern both sides", + "Information SAM-OS-MAT-002 Vapour diffusion factor (5E\u002B04) is not converted \u2014 EnergyPlus moisture modelling (HAMT/EMPD) needs data SAM does not carry", + "Information SAM-OS-MAT-002 Internal-side optical properties (InternalEmissivity, InternalSolarReflectance, InternalLightReflectance) differ from the external-side values \u2014 EnergyPlus opaque materials are single-sided; the external values govern both sides", + "Information SAM-OS-MAT-002 Vapour diffusion factor (165) is not converted \u2014 EnergyPlus moisture modelling (HAMT/EMPD) needs data SAM does not carry", + "Information SAM-OS-MAT-002 Internal-side optical properties (InternalEmissivity, InternalSolarReflectance, InternalLightReflectance) differ from the external-side values \u2014 EnergyPlus opaque materials are single-sided; the external values govern both sides", + "Information SAM-OS-MAT-002 Vapour diffusion factor (60) is not converted \u2014 EnergyPlus moisture modelling (HAMT/EMPD) needs data SAM does not carry", + "Information SAM-OS-MAT-002 Internal-side optical properties (InternalEmissivity, InternalSolarReflectance, InternalLightReflectance) differ from the external-side values \u2014 EnergyPlus opaque materials are single-sided; the external values govern both sides", + "Information SAM-OS-MAT-002 Vapour diffusion factor (8) is not converted \u2014 EnergyPlus moisture modelling (HAMT/EMPD) needs data SAM does not carry", + "Information SAM-OS-MAT-002 Internal-side optical properties (InternalEmissivity, InternalSolarReflectance, InternalLightReflectance) differ from the external-side values \u2014 EnergyPlus opaque materials are single-sided; the external values govern both sides", + "Information SAM-OS-MAT-002 Vapour diffusion factor (25) is not converted \u2014 EnergyPlus moisture modelling (HAMT/EMPD) needs data SAM does not carry", + "Information SAM-OS-MAT-002 Internal-side optical properties (InternalEmissivity, InternalSolarReflectance, InternalLightReflectance) differ from the external-side values \u2014 EnergyPlus opaque materials are single-sided; the external values govern both sides", + "Information SAM-OS-MAT-002 Vapour diffusion factor (10) is not converted \u2014 EnergyPlus moisture modelling (HAMT/EMPD) needs data SAM does not carry", + "Information SAM-OS-MAT-002 Internal-side optical properties (InternalEmissivity, InternalSolarReflectance, InternalLightReflectance) differ from the external-side values \u2014 EnergyPlus opaque materials are single-sided; the external values govern both sides", + "Information SAM-OS-MAT-002 Vapour diffusion factor (1.2) is not converted \u2014 EnergyPlus moisture modelling (HAMT/EMPD) needs data SAM does not carry", + "Information SAM-OS-MAT-002 Internal-side optical properties (InternalEmissivity, InternalSolarReflectance, InternalLightReflectance) differ from the external-side values \u2014 EnergyPlus opaque materials are single-sided; the external values govern both sides", + "Information SAM-OS-MAT-002 Vapour diffusion factor (1E\u002B05) is not converted \u2014 EnergyPlus moisture modelling (HAMT/EMPD) needs data SAM does not carry", + "Information SAM-OS-RUN-002 Annual weather source: explicit EPW (weather.epw)", + "Information SAM-OS-RUN-002 Ground temperatures taken from the EPW GROUND TEMPERATURES header (depth 0.5 m set, 12 monthly values)", + "Information SAM-OS-RUN-002 No design-day source supplied; sizing-period runs stay disabled unless OpenStudioConversionOptions.RunSizingPeriods overrides" + ], + "TranslatorMessages": [] +} \ No newline at end of file diff --git a/documentation/S09-OpenStudio-InputReadBack-evidence/runs/box-repeat/report-approved.json b/documentation/S09-OpenStudio-InputReadBack-evidence/runs/box-repeat/report-approved.json new file mode 100644 index 0000000..e85eccd --- /dev/null +++ b/documentation/S09-OpenStudio-InputReadBack-evidence/runs/box-repeat/report-approved.json @@ -0,0 +1,657 @@ +{ + "Schema": "s09-readback-report/2", + "FixtureId": "s08-fix-box", + "RuleSet": "Approved", + "Status": "BlockedOwnerDecision", + "ExitCode": 12, + "GateStatus": "BlockedOwnerDecision", + "Coverage": "Complete", + "Required": 316, + "Results": 316, + "MissingComparisons": [], + "CountByOutcome": { + "DocumentedDefault": 1, + "MappingDifference": 69, + "Match": 220, + "NotApplicable": 1, + "WithinTolerance": 25 + }, + "NonPass": [ + { + "Quantity": "3a", + "Key": "panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.internalSolarReflectance", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.internalLightReflectance", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.internalEmissivity", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.internalSolarReflectance", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.internalLightReflectance", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.internalEmissivity", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer3.internalSolarReflectance", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer3.internalLightReflectance", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer3.internalEmissivity", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:285a1884-d494-47a6-9541-942946ea00a7@space:5080c000-0000-0000-0000-00000000c001#layer1.internalSolarReflectance", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:285a1884-d494-47a6-9541-942946ea00a7@space:5080c000-0000-0000-0000-00000000c001#layer1.internalLightReflectance", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:285a1884-d494-47a6-9541-942946ea00a7@space:5080c000-0000-0000-0000-00000000c001#layer1.internalEmissivity", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:285a1884-d494-47a6-9541-942946ea00a7@space:5080c000-0000-0000-0000-00000000c001#layer2.internalSolarReflectance", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:285a1884-d494-47a6-9541-942946ea00a7@space:5080c000-0000-0000-0000-00000000c001#layer2.internalLightReflectance", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:285a1884-d494-47a6-9541-942946ea00a7@space:5080c000-0000-0000-0000-00000000c001#layer2.internalEmissivity", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:285a1884-d494-47a6-9541-942946ea00a7@space:5080c000-0000-0000-0000-00000000c001#layer3.internalSolarReflectance", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:285a1884-d494-47a6-9541-942946ea00a7@space:5080c000-0000-0000-0000-00000000c001#layer3.internalLightReflectance", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:285a1884-d494-47a6-9541-942946ea00a7@space:5080c000-0000-0000-0000-00000000c001#layer3.internalEmissivity", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:285a1884-d494-47a6-9541-942946ea00a7@space:5080c000-0000-0000-0000-00000000c001#layer4.internalSolarReflectance", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:285a1884-d494-47a6-9541-942946ea00a7@space:5080c000-0000-0000-0000-00000000c001#layer4.internalLightReflectance", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:285a1884-d494-47a6-9541-942946ea00a7@space:5080c000-0000-0000-0000-00000000c001#layer4.internalEmissivity", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:5e4a7125-c77a-4911-9084-7cbfa9b0786c@space:5080c000-0000-0000-0000-00000000c001#layer1.internalSolarReflectance", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:5e4a7125-c77a-4911-9084-7cbfa9b0786c@space:5080c000-0000-0000-0000-00000000c001#layer1.internalLightReflectance", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:5e4a7125-c77a-4911-9084-7cbfa9b0786c@space:5080c000-0000-0000-0000-00000000c001#layer1.internalEmissivity", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:5e4a7125-c77a-4911-9084-7cbfa9b0786c@space:5080c000-0000-0000-0000-00000000c001#layer2.internalSolarReflectance", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:5e4a7125-c77a-4911-9084-7cbfa9b0786c@space:5080c000-0000-0000-0000-00000000c001#layer2.internalLightReflectance", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:5e4a7125-c77a-4911-9084-7cbfa9b0786c@space:5080c000-0000-0000-0000-00000000c001#layer2.internalEmissivity", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:5e4a7125-c77a-4911-9084-7cbfa9b0786c@space:5080c000-0000-0000-0000-00000000c001#layer3.internalSolarReflectance", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:5e4a7125-c77a-4911-9084-7cbfa9b0786c@space:5080c000-0000-0000-0000-00000000c001#layer3.internalLightReflectance", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:5e4a7125-c77a-4911-9084-7cbfa9b0786c@space:5080c000-0000-0000-0000-00000000c001#layer3.internalEmissivity", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:5e4a7125-c77a-4911-9084-7cbfa9b0786c@space:5080c000-0000-0000-0000-00000000c001#layer4.internalSolarReflectance", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:5e4a7125-c77a-4911-9084-7cbfa9b0786c@space:5080c000-0000-0000-0000-00000000c001#layer4.internalLightReflectance", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:5e4a7125-c77a-4911-9084-7cbfa9b0786c@space:5080c000-0000-0000-0000-00000000c001#layer4.internalEmissivity", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:78af8769-1ba0-43bc-844e-f1ca72fa447e@space:5080c000-0000-0000-0000-00000000c001#layer1.internalSolarReflectance", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:78af8769-1ba0-43bc-844e-f1ca72fa447e@space:5080c000-0000-0000-0000-00000000c001#layer1.internalLightReflectance", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:78af8769-1ba0-43bc-844e-f1ca72fa447e@space:5080c000-0000-0000-0000-00000000c001#layer1.internalEmissivity", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:78af8769-1ba0-43bc-844e-f1ca72fa447e@space:5080c000-0000-0000-0000-00000000c001#layer2.internalSolarReflectance", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:78af8769-1ba0-43bc-844e-f1ca72fa447e@space:5080c000-0000-0000-0000-00000000c001#layer2.internalLightReflectance", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:78af8769-1ba0-43bc-844e-f1ca72fa447e@space:5080c000-0000-0000-0000-00000000c001#layer2.internalEmissivity", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:78af8769-1ba0-43bc-844e-f1ca72fa447e@space:5080c000-0000-0000-0000-00000000c001#layer3.internalSolarReflectance", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:78af8769-1ba0-43bc-844e-f1ca72fa447e@space:5080c000-0000-0000-0000-00000000c001#layer3.internalLightReflectance", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:78af8769-1ba0-43bc-844e-f1ca72fa447e@space:5080c000-0000-0000-0000-00000000c001#layer3.internalEmissivity", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:78af8769-1ba0-43bc-844e-f1ca72fa447e@space:5080c000-0000-0000-0000-00000000c001#layer4.internalSolarReflectance", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:78af8769-1ba0-43bc-844e-f1ca72fa447e@space:5080c000-0000-0000-0000-00000000c001#layer4.internalLightReflectance", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:78af8769-1ba0-43bc-844e-f1ca72fa447e@space:5080c000-0000-0000-0000-00000000c001#layer4.internalEmissivity", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:0a4398eb-cdab-43d8-bcba-736116a2a029@space:5080c000-0000-0000-0000-00000000c001#layer1.internalSolarReflectance", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:0a4398eb-cdab-43d8-bcba-736116a2a029@space:5080c000-0000-0000-0000-00000000c001#layer1.internalLightReflectance", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:0a4398eb-cdab-43d8-bcba-736116a2a029@space:5080c000-0000-0000-0000-00000000c001#layer1.internalEmissivity", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:0a4398eb-cdab-43d8-bcba-736116a2a029@space:5080c000-0000-0000-0000-00000000c001#layer2.internalSolarReflectance", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:0a4398eb-cdab-43d8-bcba-736116a2a029@space:5080c000-0000-0000-0000-00000000c001#layer2.internalLightReflectance", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:0a4398eb-cdab-43d8-bcba-736116a2a029@space:5080c000-0000-0000-0000-00000000c001#layer2.internalEmissivity", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:0a4398eb-cdab-43d8-bcba-736116a2a029@space:5080c000-0000-0000-0000-00000000c001#layer3.internalSolarReflectance", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:0a4398eb-cdab-43d8-bcba-736116a2a029@space:5080c000-0000-0000-0000-00000000c001#layer3.internalLightReflectance", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:0a4398eb-cdab-43d8-bcba-736116a2a029@space:5080c000-0000-0000-0000-00000000c001#layer3.internalEmissivity", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:0a4398eb-cdab-43d8-bcba-736116a2a029@space:5080c000-0000-0000-0000-00000000c001#layer4.internalSolarReflectance", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:0a4398eb-cdab-43d8-bcba-736116a2a029@space:5080c000-0000-0000-0000-00000000c001#layer4.internalLightReflectance", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:0a4398eb-cdab-43d8-bcba-736116a2a029@space:5080c000-0000-0000-0000-00000000c001#layer4.internalEmissivity", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:18cb687b-53ce-4282-be8e-6ba267a6ae2b@space:5080c000-0000-0000-0000-00000000c001#layer1.internalSolarReflectance", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:18cb687b-53ce-4282-be8e-6ba267a6ae2b@space:5080c000-0000-0000-0000-00000000c001#layer1.internalLightReflectance", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:18cb687b-53ce-4282-be8e-6ba267a6ae2b@space:5080c000-0000-0000-0000-00000000c001#layer1.internalEmissivity", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:18cb687b-53ce-4282-be8e-6ba267a6ae2b@space:5080c000-0000-0000-0000-00000000c001#layer2.internalSolarReflectance", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:18cb687b-53ce-4282-be8e-6ba267a6ae2b@space:5080c000-0000-0000-0000-00000000c001#layer2.internalLightReflectance", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:18cb687b-53ce-4282-be8e-6ba267a6ae2b@space:5080c000-0000-0000-0000-00000000c001#layer2.internalEmissivity", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:18cb687b-53ce-4282-be8e-6ba267a6ae2b@space:5080c000-0000-0000-0000-00000000c001#layer3.internalSolarReflectance", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:18cb687b-53ce-4282-be8e-6ba267a6ae2b@space:5080c000-0000-0000-0000-00000000c001#layer3.internalLightReflectance", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:18cb687b-53ce-4282-be8e-6ba267a6ae2b@space:5080c000-0000-0000-0000-00000000c001#layer3.internalEmissivity", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:18cb687b-53ce-4282-be8e-6ba267a6ae2b@space:5080c000-0000-0000-0000-00000000c001#layer4.internalSolarReflectance", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:18cb687b-53ce-4282-be8e-6ba267a6ae2b@space:5080c000-0000-0000-0000-00000000c001#layer4.internalLightReflectance", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:18cb687b-53ce-4282-be8e-6ba267a6ae2b@space:5080c000-0000-0000-0000-00000000c001#layer4.internalEmissivity", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "4c", + "Key": "space:5080c000-0000-0000-0000-00000000c001.ic.lighting.visible", + "Outcome": "DocumentedDefault", + "Status": "BlockedOwnerDecision", + "Reason": "SAM states no value and the native holds the contract-listed default. Not accepted by the owner." + } + ], + "OwnerDecisionsNamed": [ + "owner acceptance of MappingDifference for 3a on fixture s08-fix-box", + "owner acceptance of DocumentedDefault for 4c on fixture s08-fix-box" + ], + "TechnicalBlockersNamed": [], + "Consistency": [], + "Unsupported": [], + "FixtureCriteria": [], + "VentilationStates": { + "space:5080c000-0000-0000-0000-00000000c001": "V2" + }, + "Series": [ + { + "Key": "space:5080c000-0000-0000-0000-00000000c001.ic.schedule.occupancy", + "QuantityId": "6.hourly", + "Count": 8760, + "NotPass": 0, + "Status": "Pass", + "Outcome": "Match", + "FirstNotPass": null + }, + { + "Key": "space:5080c000-0000-0000-0000-00000000c001.ic.schedule.lighting", + "QuantityId": "6.hourly", + "Count": 8760, + "NotPass": 0, + "Status": "Pass", + "Outcome": "Match", + "FirstNotPass": null + }, + { + "Key": "space:5080c000-0000-0000-0000-00000000c001.ic.schedule.equipmentSensible", + "QuantityId": "6.hourly", + "Count": 8760, + "NotPass": 0, + "Status": "Pass", + "Outcome": "Match", + "FirstNotPass": null + }, + { + "Key": "space:5080c000-0000-0000-0000-00000000c001.ic.schedule.equipmentLatent", + "QuantityId": "6.hourly", + "Count": 8760, + "NotPass": 0, + "Status": "Pass", + "Outcome": "Match", + "FirstNotPass": null + }, + { + "Key": "space:5080c000-0000-0000-0000-00000000c001.ic.schedule.infiltration", + "QuantityId": "6.hourly", + "Count": 8760, + "NotPass": 0, + "Status": "Pass", + "Outcome": "Match", + "FirstNotPass": null + }, + { + "Key": "space:5080c000-0000-0000-0000-00000000c001.ic.heating", + "QuantityId": "5.temperature", + "Count": 8760, + "NotPass": 0, + "Status": "Pass", + "Outcome": "Match", + "FirstNotPass": null + }, + { + "Key": "space:5080c000-0000-0000-0000-00000000c001.ic.cooling", + "QuantityId": "5.temperature", + "Count": 8760, + "NotPass": 0, + "Status": "Pass", + "Outcome": "Match", + "FirstNotPass": null + }, + { + "Key": "space:5080c000-0000-0000-0000-00000000c001.ic.humidification", + "QuantityId": "5.humidity", + "Count": 8760, + "NotPass": 0, + "Status": "Pass", + "Outcome": "Match", + "FirstNotPass": null + }, + { + "Key": "space:5080c000-0000-0000-0000-00000000c001.ic.dehumidification", + "QuantityId": "5.humidity", + "Count": 8760, + "NotPass": 0, + "Status": "Pass", + "Outcome": "Match", + "FirstNotPass": null + }, + { + "Key": "space:5080c000-0000-0000-0000-00000000c001.ic.ventilation.delivered", + "QuantityId": "8b", + "Count": 8760, + "NotPass": 0, + "Status": "Pass", + "Outcome": "WithinTolerance", + "FirstNotPass": null + }, + { + "Key": "space:5080c000-0000-0000-0000-00000000c001.ic.schedule.ventilation", + "QuantityId": "6.hourly", + "Count": 8760, + "NotPass": 0, + "Status": "Pass", + "Outcome": "Match", + "FirstNotPass": null + } + ], + "Supporting": [ + "calendar: one non-leap run year 1/1-12/31 (IDF RunPeriod begin year 2006), EPW 8760 rows; hour index 0 = 1 January 00:00-01:00. Each schedule\u0027s own hour labels are checked separately.", + "orientation: SAM North Angle unstated (writer default 0); Coordinate System Relative; IDF Building North Axis blank (EnergyPlus default 0): the native building is unrotated, as SAM states", + "multiplicity: 1 IDF zone(s) (1 with their OS:ThermalZone), 0 ZoneGroup(s), 2 IDF subsurface(s) (2 with their OS:SubSurface) read; blank multipliers are the EnergyPlus default 1; every effective multiplier is 1, as SAM states", + "space:5080c000-0000-0000-0000-00000000c001 \u0027FixBox\u0027 = native space \u0027SAM_Space_FixBox_5080c000\u0027 by geometry (6 surfaces one to one); name carrier agrees", + "space:5080c000-0000-0000-0000-00000000c001: native signed shell volume 76.608 m3 (positive = outward-facing surfaces)", + "space:5080c000-0000-0000-0000-00000000c001: D-F9 stored volume 76.608 m3 vs geometric 76.608 m3: Identical", + "aperture:95717805-e6c7-4051-9c99-937da3d94f15@space:5080c000-0000-0000-0000-00000000c001: native subsurface \u0027SAM_SubSurface_FIX_WIN_FRAMED_0_95717805\u0027 with frame \u0027SAM_SubSurface_FIX_WIN_FRAMED_0_95717805_FrameAndDivider\u0027, identity Verified", + "aperture:95717805-e6c7-4051-9c99-937da3d94f15@space:5080c000-0000-0000-0000-00000000c001: native frame width 0.065 m; SAM T-FRAME OpenStudio rule: DefaultFrameWidth, else the frame layer thickness (pane = face offset inwards by 0.065 m)", + "aperture:6adea09c-1557-4dfd-bfab-75f66600343f@space:5080c000-0000-0000-0000-00000000c001: native subsurface \u0027SAM_SubSurface_FIX_WIN_UNFRAMED_0_6adea09c\u0027 (no frame), identity Verified", + "space:5080c000-0000-0000-0000-00000000c001: D-F2 V2; selection FIX_IC_BOX_VNT; requirement Value(0.03)", + "Ideal Loads \u0027SAM_IdealLoads_FixBox_5080c000\u0027: DCV \u0027None\u0027, economizer \u0027NoEconomizer\u0027, heat recovery \u0027None\u0027, availability \u0027\u0027", + "space:5080c000-0000-0000-0000-00000000c001: OSM DSOA \u0027SAM_InternalCondition_FIX_IC_BOX_af50b3dc_DesignSpecificationOutdoorAir\u0027 inherited from SpaceType \u0027SAM_InternalCondition_FIX_IC_BOX_af50b3dc\u0027; IDF Ideal Loads names \u0027SAM_InternalCondition_FIX_IC_BOX_af50b3dc_DesignSpecificationOutdoorAir\u0027", + "weather: run EPW sha256 472ffb4e2f10867600949a392ce46891fc1bd05f2fc8d8917a99bca7d26209c3; the OSM references a file with sha256 472ffb4e2f10867600949a392ce46891fc1bd05f2fc8d8917a99bca7d26209c3", + "weather: Site:GroundTemperature:BuildingSurface 4.58, 1.15, 0.22, 1.03, 5.66, 10.85, 15.73, 19.27, 20.3, 18.64, 14.64, 9.6 (9.ground, not gated)", + "design days: SAM states 0 (none); the IDF has 0 sizing period(s)", + "OS-MAT-SINGLE-SIDED: 69 internal-side opaque optical row(s) differ from SAM because EnergyPlus opaque materials are single-sided and the writer writes the external value (SAM-OS-MAT-002). Listed as MAPPING-DIFFERENCE by S09 from the writer\u0027s documented behaviour, not by S07: an owner decision (accept, or require a writer change)." + ], + "Inputs": { + "label": "box-repeat", + "modelSha256": "45524172b32f85df89511dd344141023de999faa9552a199e6b49062612acd08", + "epwSha256": "472ffb4e2f10867600949a392ce46891fc1bd05f2fc8d8917a99bca7d26209c3", + "osmSha256": "81df1925f8926476e101908b68eba4eaa63bb04a584c70f47d05561e8de36853", + "idfSha256": "737ea1f44600aff8726d3d46203bb32e026c0ae6518107aafe92e219aaa1b6a6", + "openStudioSdk": "3.10.0\u002B86d7e215a1", + "writerSha256": "8070337f992b57ff4585612cf7b1852053094cc3a0e54aa3567e9c34d9847414", + "readerSha256": "ce8270dd002e63cb4be574de24c6f5fce090ba3ca0207e3d73c7db2ba358ca70", + "exportPid": "23712", + "readerPid": "12704", + "comparePid": "8800", + "mutation": null, + "writerDiagnostics": "Information SAM-OS-MAT-002 Internal-side optical properties (InternalEmissivity, InternalSolarReflectance, InternalLightReflectance) differ from the external-side values \u2014 EnergyPlus opaque materials are single-sided; the external values govern both sides | Information SAM-OS-MAT-002 Internal-side optical properties (InternalEmissivity, InternalSolarReflectance, InternalLightReflectance) differ from the external-side values \u2014 EnergyPlus opaque materials are single-sided; the external values govern both sides | Information SAM-OS-MAT-002 Internal-side optical properties (InternalEmissivity, InternalSolarReflectance, InternalLightReflectance) differ from the external-side values \u2014 EnergyPlus opaque materials are single-sided; the external values govern both sides | Information SAM-OS-MAT-002 Internal-side optical properties (InternalEmissivity, InternalSolarReflectance, InternalLightReflectance) differ from the external-side values \u2014 EnergyPlus opaque materials are single-sided; the external values govern both sides | Information SAM-OS-MAT-002 Internal-side optical properties (InternalEmissivity, InternalSolarReflectance, InternalLightReflectance) differ from the external-side values \u2014 EnergyPlus opaque materials are single-sided; the external values govern both sides | Information SAM-OS-MAT-002 Internal-side optical properties (InternalEmissivity, InternalSolarReflectance, InternalLightReflectance) differ from the external-side values \u2014 EnergyPlus opaque materials are single-sided; the external values govern both sides | Information SAM-OS-MAT-002 Internal-side optical properties (InternalEmissivity, InternalSolarReflectance, InternalLightReflectance) differ from the external-side values \u2014 EnergyPlus opaque materials are single-sided; the external values govern both sides | Information SAM-OS-MAT-002 Internal-side optical properties (InternalEmissivity, InternalSolarReflectance, InternalLightReflectance) differ from the external-side values \u2014 EnergyPlus opaque materials are single-sided; the external values govern both sides | Information SAM-OS-MAT-002 Internal-side optical properties (InternalEmissivity, InternalSolarReflectance, InternalLightReflectance) differ from the external-side values \u2014 EnergyPlus opaque materials are single-sided; the external values govern both sides | Information SAM-OS-MAT-002 Internal-side optical properties (InternalEmissivity, InternalSolarReflectance, InternalLightReflectance) differ from the external-side values \u2014 EnergyPlus opaque materials are single-sided; the external values govern both sides | Information SAM-OS-RUN-002 Annual weather source: explicit EPW (weather.epw) | Information SAM-OS-RUN-002 Ground temperatures taken from the EPW GROUND TEMPERATURES header (depth 0.5 m set, 12 monthly values) | Information SAM-OS-RUN-002 No design-day source supplied; sizing-period runs stay disabled unless OpenStudioConversionOptions.RunSizingPeriods overrides", + "translatorMessages": "0" + } +} \ No newline at end of file diff --git a/documentation/S09-OpenStudio-InputReadBack-evidence/runs/box-repeat/report-approved.txt b/documentation/S09-OpenStudio-InputReadBack-evidence/runs/box-repeat/report-approved.txt new file mode 100644 index 0000000..4106fdc --- /dev/null +++ b/documentation/S09-OpenStudio-InputReadBack-evidence/runs/box-repeat/report-approved.txt @@ -0,0 +1,19 @@ +S09 OpenStudio read-back: s08-fix-box -> BlockedOwnerDecision (exit 12); rule set Approved; gate BlockedOwnerDecision; coverage Complete (316 required, 316 results) +outcomes: DocumentedDefault 1, MappingDifference 69, Match 220, NotApplicable 1, WithinTolerance 25 +D-F2 space:5080c000-0000-0000-0000-00000000c001: V2 +NOT PASS DocumentedDefault / BlockedOwnerDecision: 1 + 4c space:5080c000-0000-0000-0000-00000000c001.ic.lighting.visible: SAM states no value and the native holds the contract-listed default. Not accepted by the owner. +NOT PASS MappingDifference / BlockedOwnerDecision: 69 + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer3.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer3.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer3.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:285a1884-d494-47a6-9541-942946ea00a7@space:5080c000-0000-0000-0000-00000000c001#layer1.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:285a1884-d494-47a6-9541-942946ea00a7@space:5080c000-0000-0000-0000-00000000c001#layer1.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:285a1884-d494-47a6-9541-942946ea00a7@space:5080c000-0000-0000-0000-00000000c001#layer1.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + ... 57 more in report.json diff --git a/documentation/S09-OpenStudio-InputReadBack-evidence/runs/box-repeat/report-provisional.txt b/documentation/S09-OpenStudio-InputReadBack-evidence/runs/box-repeat/report-provisional.txt new file mode 100644 index 0000000..aec8dab --- /dev/null +++ b/documentation/S09-OpenStudio-InputReadBack-evidence/runs/box-repeat/report-provisional.txt @@ -0,0 +1,19 @@ +S09 OpenStudio read-back: s08-fix-box -> BlockedOwnerDecision (exit 12); rule set ProvisionalProposed; gate BlockedOwnerDecision; coverage Complete (316 required, 316 results) +outcomes: DocumentedDefault 1, MappingDifference 69, Match 220, NotApplicable 1, WithinTolerance 25 +D-F2 space:5080c000-0000-0000-0000-00000000c001: V2 +NOT PASS DocumentedDefault / BlockedOwnerDecision: 1 + 4c space:5080c000-0000-0000-0000-00000000c001.ic.lighting.visible: SAM states no value and the native holds the contract-listed default. Not accepted by the owner. +NOT PASS MappingDifference / BlockedOwnerDecision: 69 + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer3.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer3.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer3.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:285a1884-d494-47a6-9541-942946ea00a7@space:5080c000-0000-0000-0000-00000000c001#layer1.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:285a1884-d494-47a6-9541-942946ea00a7@space:5080c000-0000-0000-0000-00000000c001#layer1.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:285a1884-d494-47a6-9541-942946ea00a7@space:5080c000-0000-0000-0000-00000000c001#layer1.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + ... 57 more in report.json diff --git a/documentation/S09-OpenStudio-InputReadBack-evidence/runs/box/export.json b/documentation/S09-OpenStudio-InputReadBack-evidence/runs/box/export.json new file mode 100644 index 0000000..577458e --- /dev/null +++ b/documentation/S09-OpenStudio-InputReadBack-evidence/runs/box/export.json @@ -0,0 +1,45 @@ +{ + "Schema": "s09-export/1", + "Label": "box", + "Mutation": null, + "SourceModelPath": "/s08-fix-box.json", + "SourceEpwPath": "/budapest.epw", + "ModelSha256": "45524172b32f85df89511dd344141023de999faa9552a199e6b49062612acd08", + "EpwSha256": "472ffb4e2f10867600949a392ce46891fc1bd05f2fc8d8917a99bca7d26209c3", + "OsmSha256": "d5270415b4ae98f6ba894b6bdaf903b1dac29de5e6d8be63ca378c2416e567b7", + "IdfSha256": "737ea1f44600aff8726d3d46203bb32e026c0ae6518107aafe92e219aaa1b6a6", + "OpenStudioSdkVersion": "3.10.0\u002B86d7e215a1", + "WriterAssembly": "/SAM.Analytical.OpenStudio.dll", + "WriterAssemblySha256": "8070337f992b57ff4585612cf7b1852053094cc3a0e54aa3567e9c34d9847414", + "ProcessId": 38860, + "StartedUtc": "2026-10-21T12:43:36.3874156Z", + "FinishedUtc": "2026-10-21T12:43:39.930816Z", + "ConversionValid": true, + "Diagnostics": [ + "Information SAM-OS-MAT-002 Vapour diffusion factor (110) is not converted \u2014 EnergyPlus moisture modelling (HAMT/EMPD) needs data SAM does not carry", + "Information SAM-OS-MAT-002 Internal-side optical properties (InternalEmissivity, InternalSolarReflectance, InternalLightReflectance) differ from the external-side values \u2014 EnergyPlus opaque materials are single-sided; the external values govern both sides", + "Information SAM-OS-MAT-002 Vapour diffusion factor (40) is not converted \u2014 EnergyPlus moisture modelling (HAMT/EMPD) needs data SAM does not carry", + "Information SAM-OS-MAT-002 Internal-side optical properties (InternalEmissivity, InternalSolarReflectance, InternalLightReflectance) differ from the external-side values \u2014 EnergyPlus opaque materials are single-sided; the external values govern both sides", + "Information SAM-OS-MAT-002 Vapour diffusion factor (15) is not converted \u2014 EnergyPlus moisture modelling (HAMT/EMPD) needs data SAM does not carry", + "Information SAM-OS-MAT-002 Internal-side optical properties (InternalEmissivity, InternalSolarReflectance, InternalLightReflectance) differ from the external-side values \u2014 EnergyPlus opaque materials are single-sided; the external values govern both sides", + "Information SAM-OS-MAT-002 Vapour diffusion factor (5E\u002B04) is not converted \u2014 EnergyPlus moisture modelling (HAMT/EMPD) needs data SAM does not carry", + "Information SAM-OS-MAT-002 Internal-side optical properties (InternalEmissivity, InternalSolarReflectance, InternalLightReflectance) differ from the external-side values \u2014 EnergyPlus opaque materials are single-sided; the external values govern both sides", + "Information SAM-OS-MAT-002 Vapour diffusion factor (165) is not converted \u2014 EnergyPlus moisture modelling (HAMT/EMPD) needs data SAM does not carry", + "Information SAM-OS-MAT-002 Internal-side optical properties (InternalEmissivity, InternalSolarReflectance, InternalLightReflectance) differ from the external-side values \u2014 EnergyPlus opaque materials are single-sided; the external values govern both sides", + "Information SAM-OS-MAT-002 Vapour diffusion factor (60) is not converted \u2014 EnergyPlus moisture modelling (HAMT/EMPD) needs data SAM does not carry", + "Information SAM-OS-MAT-002 Internal-side optical properties (InternalEmissivity, InternalSolarReflectance, InternalLightReflectance) differ from the external-side values \u2014 EnergyPlus opaque materials are single-sided; the external values govern both sides", + "Information SAM-OS-MAT-002 Vapour diffusion factor (8) is not converted \u2014 EnergyPlus moisture modelling (HAMT/EMPD) needs data SAM does not carry", + "Information SAM-OS-MAT-002 Internal-side optical properties (InternalEmissivity, InternalSolarReflectance, InternalLightReflectance) differ from the external-side values \u2014 EnergyPlus opaque materials are single-sided; the external values govern both sides", + "Information SAM-OS-MAT-002 Vapour diffusion factor (25) is not converted \u2014 EnergyPlus moisture modelling (HAMT/EMPD) needs data SAM does not carry", + "Information SAM-OS-MAT-002 Internal-side optical properties (InternalEmissivity, InternalSolarReflectance, InternalLightReflectance) differ from the external-side values \u2014 EnergyPlus opaque materials are single-sided; the external values govern both sides", + "Information SAM-OS-MAT-002 Vapour diffusion factor (10) is not converted \u2014 EnergyPlus moisture modelling (HAMT/EMPD) needs data SAM does not carry", + "Information SAM-OS-MAT-002 Internal-side optical properties (InternalEmissivity, InternalSolarReflectance, InternalLightReflectance) differ from the external-side values \u2014 EnergyPlus opaque materials are single-sided; the external values govern both sides", + "Information SAM-OS-MAT-002 Vapour diffusion factor (1.2) is not converted \u2014 EnergyPlus moisture modelling (HAMT/EMPD) needs data SAM does not carry", + "Information SAM-OS-MAT-002 Internal-side optical properties (InternalEmissivity, InternalSolarReflectance, InternalLightReflectance) differ from the external-side values \u2014 EnergyPlus opaque materials are single-sided; the external values govern both sides", + "Information SAM-OS-MAT-002 Vapour diffusion factor (1E\u002B05) is not converted \u2014 EnergyPlus moisture modelling (HAMT/EMPD) needs data SAM does not carry", + "Information SAM-OS-RUN-002 Annual weather source: explicit EPW (weather.epw)", + "Information SAM-OS-RUN-002 Ground temperatures taken from the EPW GROUND TEMPERATURES header (depth 0.5 m set, 12 monthly values)", + "Information SAM-OS-RUN-002 No design-day source supplied; sizing-period runs stay disabled unless OpenStudioConversionOptions.RunSizingPeriods overrides" + ], + "TranslatorMessages": [] +} \ No newline at end of file diff --git a/documentation/S09-OpenStudio-InputReadBack-evidence/runs/box/report-approved.json b/documentation/S09-OpenStudio-InputReadBack-evidence/runs/box/report-approved.json new file mode 100644 index 0000000..e69663b --- /dev/null +++ b/documentation/S09-OpenStudio-InputReadBack-evidence/runs/box/report-approved.json @@ -0,0 +1,657 @@ +{ + "Schema": "s09-readback-report/2", + "FixtureId": "s08-fix-box", + "RuleSet": "Approved", + "Status": "BlockedOwnerDecision", + "ExitCode": 12, + "GateStatus": "BlockedOwnerDecision", + "Coverage": "Complete", + "Required": 316, + "Results": 316, + "MissingComparisons": [], + "CountByOutcome": { + "DocumentedDefault": 1, + "MappingDifference": 69, + "Match": 220, + "NotApplicable": 1, + "WithinTolerance": 25 + }, + "NonPass": [ + { + "Quantity": "3a", + "Key": "panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.internalSolarReflectance", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.internalLightReflectance", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.internalEmissivity", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.internalSolarReflectance", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.internalLightReflectance", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.internalEmissivity", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer3.internalSolarReflectance", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer3.internalLightReflectance", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer3.internalEmissivity", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:285a1884-d494-47a6-9541-942946ea00a7@space:5080c000-0000-0000-0000-00000000c001#layer1.internalSolarReflectance", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:285a1884-d494-47a6-9541-942946ea00a7@space:5080c000-0000-0000-0000-00000000c001#layer1.internalLightReflectance", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:285a1884-d494-47a6-9541-942946ea00a7@space:5080c000-0000-0000-0000-00000000c001#layer1.internalEmissivity", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:285a1884-d494-47a6-9541-942946ea00a7@space:5080c000-0000-0000-0000-00000000c001#layer2.internalSolarReflectance", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:285a1884-d494-47a6-9541-942946ea00a7@space:5080c000-0000-0000-0000-00000000c001#layer2.internalLightReflectance", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:285a1884-d494-47a6-9541-942946ea00a7@space:5080c000-0000-0000-0000-00000000c001#layer2.internalEmissivity", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:285a1884-d494-47a6-9541-942946ea00a7@space:5080c000-0000-0000-0000-00000000c001#layer3.internalSolarReflectance", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:285a1884-d494-47a6-9541-942946ea00a7@space:5080c000-0000-0000-0000-00000000c001#layer3.internalLightReflectance", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:285a1884-d494-47a6-9541-942946ea00a7@space:5080c000-0000-0000-0000-00000000c001#layer3.internalEmissivity", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:285a1884-d494-47a6-9541-942946ea00a7@space:5080c000-0000-0000-0000-00000000c001#layer4.internalSolarReflectance", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:285a1884-d494-47a6-9541-942946ea00a7@space:5080c000-0000-0000-0000-00000000c001#layer4.internalLightReflectance", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:285a1884-d494-47a6-9541-942946ea00a7@space:5080c000-0000-0000-0000-00000000c001#layer4.internalEmissivity", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:5e4a7125-c77a-4911-9084-7cbfa9b0786c@space:5080c000-0000-0000-0000-00000000c001#layer1.internalSolarReflectance", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:5e4a7125-c77a-4911-9084-7cbfa9b0786c@space:5080c000-0000-0000-0000-00000000c001#layer1.internalLightReflectance", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:5e4a7125-c77a-4911-9084-7cbfa9b0786c@space:5080c000-0000-0000-0000-00000000c001#layer1.internalEmissivity", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:5e4a7125-c77a-4911-9084-7cbfa9b0786c@space:5080c000-0000-0000-0000-00000000c001#layer2.internalSolarReflectance", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:5e4a7125-c77a-4911-9084-7cbfa9b0786c@space:5080c000-0000-0000-0000-00000000c001#layer2.internalLightReflectance", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:5e4a7125-c77a-4911-9084-7cbfa9b0786c@space:5080c000-0000-0000-0000-00000000c001#layer2.internalEmissivity", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:5e4a7125-c77a-4911-9084-7cbfa9b0786c@space:5080c000-0000-0000-0000-00000000c001#layer3.internalSolarReflectance", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:5e4a7125-c77a-4911-9084-7cbfa9b0786c@space:5080c000-0000-0000-0000-00000000c001#layer3.internalLightReflectance", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:5e4a7125-c77a-4911-9084-7cbfa9b0786c@space:5080c000-0000-0000-0000-00000000c001#layer3.internalEmissivity", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:5e4a7125-c77a-4911-9084-7cbfa9b0786c@space:5080c000-0000-0000-0000-00000000c001#layer4.internalSolarReflectance", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:5e4a7125-c77a-4911-9084-7cbfa9b0786c@space:5080c000-0000-0000-0000-00000000c001#layer4.internalLightReflectance", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:5e4a7125-c77a-4911-9084-7cbfa9b0786c@space:5080c000-0000-0000-0000-00000000c001#layer4.internalEmissivity", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:78af8769-1ba0-43bc-844e-f1ca72fa447e@space:5080c000-0000-0000-0000-00000000c001#layer1.internalSolarReflectance", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:78af8769-1ba0-43bc-844e-f1ca72fa447e@space:5080c000-0000-0000-0000-00000000c001#layer1.internalLightReflectance", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:78af8769-1ba0-43bc-844e-f1ca72fa447e@space:5080c000-0000-0000-0000-00000000c001#layer1.internalEmissivity", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:78af8769-1ba0-43bc-844e-f1ca72fa447e@space:5080c000-0000-0000-0000-00000000c001#layer2.internalSolarReflectance", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:78af8769-1ba0-43bc-844e-f1ca72fa447e@space:5080c000-0000-0000-0000-00000000c001#layer2.internalLightReflectance", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:78af8769-1ba0-43bc-844e-f1ca72fa447e@space:5080c000-0000-0000-0000-00000000c001#layer2.internalEmissivity", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:78af8769-1ba0-43bc-844e-f1ca72fa447e@space:5080c000-0000-0000-0000-00000000c001#layer3.internalSolarReflectance", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:78af8769-1ba0-43bc-844e-f1ca72fa447e@space:5080c000-0000-0000-0000-00000000c001#layer3.internalLightReflectance", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:78af8769-1ba0-43bc-844e-f1ca72fa447e@space:5080c000-0000-0000-0000-00000000c001#layer3.internalEmissivity", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:78af8769-1ba0-43bc-844e-f1ca72fa447e@space:5080c000-0000-0000-0000-00000000c001#layer4.internalSolarReflectance", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:78af8769-1ba0-43bc-844e-f1ca72fa447e@space:5080c000-0000-0000-0000-00000000c001#layer4.internalLightReflectance", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:78af8769-1ba0-43bc-844e-f1ca72fa447e@space:5080c000-0000-0000-0000-00000000c001#layer4.internalEmissivity", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:0a4398eb-cdab-43d8-bcba-736116a2a029@space:5080c000-0000-0000-0000-00000000c001#layer1.internalSolarReflectance", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:0a4398eb-cdab-43d8-bcba-736116a2a029@space:5080c000-0000-0000-0000-00000000c001#layer1.internalLightReflectance", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:0a4398eb-cdab-43d8-bcba-736116a2a029@space:5080c000-0000-0000-0000-00000000c001#layer1.internalEmissivity", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:0a4398eb-cdab-43d8-bcba-736116a2a029@space:5080c000-0000-0000-0000-00000000c001#layer2.internalSolarReflectance", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:0a4398eb-cdab-43d8-bcba-736116a2a029@space:5080c000-0000-0000-0000-00000000c001#layer2.internalLightReflectance", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:0a4398eb-cdab-43d8-bcba-736116a2a029@space:5080c000-0000-0000-0000-00000000c001#layer2.internalEmissivity", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:0a4398eb-cdab-43d8-bcba-736116a2a029@space:5080c000-0000-0000-0000-00000000c001#layer3.internalSolarReflectance", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:0a4398eb-cdab-43d8-bcba-736116a2a029@space:5080c000-0000-0000-0000-00000000c001#layer3.internalLightReflectance", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:0a4398eb-cdab-43d8-bcba-736116a2a029@space:5080c000-0000-0000-0000-00000000c001#layer3.internalEmissivity", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:0a4398eb-cdab-43d8-bcba-736116a2a029@space:5080c000-0000-0000-0000-00000000c001#layer4.internalSolarReflectance", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:0a4398eb-cdab-43d8-bcba-736116a2a029@space:5080c000-0000-0000-0000-00000000c001#layer4.internalLightReflectance", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:0a4398eb-cdab-43d8-bcba-736116a2a029@space:5080c000-0000-0000-0000-00000000c001#layer4.internalEmissivity", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:18cb687b-53ce-4282-be8e-6ba267a6ae2b@space:5080c000-0000-0000-0000-00000000c001#layer1.internalSolarReflectance", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:18cb687b-53ce-4282-be8e-6ba267a6ae2b@space:5080c000-0000-0000-0000-00000000c001#layer1.internalLightReflectance", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:18cb687b-53ce-4282-be8e-6ba267a6ae2b@space:5080c000-0000-0000-0000-00000000c001#layer1.internalEmissivity", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:18cb687b-53ce-4282-be8e-6ba267a6ae2b@space:5080c000-0000-0000-0000-00000000c001#layer2.internalSolarReflectance", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:18cb687b-53ce-4282-be8e-6ba267a6ae2b@space:5080c000-0000-0000-0000-00000000c001#layer2.internalLightReflectance", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:18cb687b-53ce-4282-be8e-6ba267a6ae2b@space:5080c000-0000-0000-0000-00000000c001#layer2.internalEmissivity", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:18cb687b-53ce-4282-be8e-6ba267a6ae2b@space:5080c000-0000-0000-0000-00000000c001#layer3.internalSolarReflectance", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:18cb687b-53ce-4282-be8e-6ba267a6ae2b@space:5080c000-0000-0000-0000-00000000c001#layer3.internalLightReflectance", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:18cb687b-53ce-4282-be8e-6ba267a6ae2b@space:5080c000-0000-0000-0000-00000000c001#layer3.internalEmissivity", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:18cb687b-53ce-4282-be8e-6ba267a6ae2b@space:5080c000-0000-0000-0000-00000000c001#layer4.internalSolarReflectance", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:18cb687b-53ce-4282-be8e-6ba267a6ae2b@space:5080c000-0000-0000-0000-00000000c001#layer4.internalLightReflectance", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:18cb687b-53ce-4282-be8e-6ba267a6ae2b@space:5080c000-0000-0000-0000-00000000c001#layer4.internalEmissivity", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "4c", + "Key": "space:5080c000-0000-0000-0000-00000000c001.ic.lighting.visible", + "Outcome": "DocumentedDefault", + "Status": "BlockedOwnerDecision", + "Reason": "SAM states no value and the native holds the contract-listed default. Not accepted by the owner." + } + ], + "OwnerDecisionsNamed": [ + "owner acceptance of MappingDifference for 3a on fixture s08-fix-box", + "owner acceptance of DocumentedDefault for 4c on fixture s08-fix-box" + ], + "TechnicalBlockersNamed": [], + "Consistency": [], + "Unsupported": [], + "FixtureCriteria": [], + "VentilationStates": { + "space:5080c000-0000-0000-0000-00000000c001": "V2" + }, + "Series": [ + { + "Key": "space:5080c000-0000-0000-0000-00000000c001.ic.schedule.occupancy", + "QuantityId": "6.hourly", + "Count": 8760, + "NotPass": 0, + "Status": "Pass", + "Outcome": "Match", + "FirstNotPass": null + }, + { + "Key": "space:5080c000-0000-0000-0000-00000000c001.ic.schedule.lighting", + "QuantityId": "6.hourly", + "Count": 8760, + "NotPass": 0, + "Status": "Pass", + "Outcome": "Match", + "FirstNotPass": null + }, + { + "Key": "space:5080c000-0000-0000-0000-00000000c001.ic.schedule.equipmentSensible", + "QuantityId": "6.hourly", + "Count": 8760, + "NotPass": 0, + "Status": "Pass", + "Outcome": "Match", + "FirstNotPass": null + }, + { + "Key": "space:5080c000-0000-0000-0000-00000000c001.ic.schedule.equipmentLatent", + "QuantityId": "6.hourly", + "Count": 8760, + "NotPass": 0, + "Status": "Pass", + "Outcome": "Match", + "FirstNotPass": null + }, + { + "Key": "space:5080c000-0000-0000-0000-00000000c001.ic.schedule.infiltration", + "QuantityId": "6.hourly", + "Count": 8760, + "NotPass": 0, + "Status": "Pass", + "Outcome": "Match", + "FirstNotPass": null + }, + { + "Key": "space:5080c000-0000-0000-0000-00000000c001.ic.heating", + "QuantityId": "5.temperature", + "Count": 8760, + "NotPass": 0, + "Status": "Pass", + "Outcome": "Match", + "FirstNotPass": null + }, + { + "Key": "space:5080c000-0000-0000-0000-00000000c001.ic.cooling", + "QuantityId": "5.temperature", + "Count": 8760, + "NotPass": 0, + "Status": "Pass", + "Outcome": "Match", + "FirstNotPass": null + }, + { + "Key": "space:5080c000-0000-0000-0000-00000000c001.ic.humidification", + "QuantityId": "5.humidity", + "Count": 8760, + "NotPass": 0, + "Status": "Pass", + "Outcome": "Match", + "FirstNotPass": null + }, + { + "Key": "space:5080c000-0000-0000-0000-00000000c001.ic.dehumidification", + "QuantityId": "5.humidity", + "Count": 8760, + "NotPass": 0, + "Status": "Pass", + "Outcome": "Match", + "FirstNotPass": null + }, + { + "Key": "space:5080c000-0000-0000-0000-00000000c001.ic.ventilation.delivered", + "QuantityId": "8b", + "Count": 8760, + "NotPass": 0, + "Status": "Pass", + "Outcome": "WithinTolerance", + "FirstNotPass": null + }, + { + "Key": "space:5080c000-0000-0000-0000-00000000c001.ic.schedule.ventilation", + "QuantityId": "6.hourly", + "Count": 8760, + "NotPass": 0, + "Status": "Pass", + "Outcome": "Match", + "FirstNotPass": null + } + ], + "Supporting": [ + "calendar: one non-leap run year 1/1-12/31 (IDF RunPeriod begin year 2006), EPW 8760 rows; hour index 0 = 1 January 00:00-01:00. Each schedule\u0027s own hour labels are checked separately.", + "orientation: SAM North Angle unstated (writer default 0); Coordinate System Relative; IDF Building North Axis blank (EnergyPlus default 0): the native building is unrotated, as SAM states", + "multiplicity: 1 IDF zone(s) (1 with their OS:ThermalZone), 0 ZoneGroup(s), 2 IDF subsurface(s) (2 with their OS:SubSurface) read; blank multipliers are the EnergyPlus default 1; every effective multiplier is 1, as SAM states", + "space:5080c000-0000-0000-0000-00000000c001 \u0027FixBox\u0027 = native space \u0027SAM_Space_FixBox_5080c000\u0027 by geometry (6 surfaces one to one); name carrier agrees", + "space:5080c000-0000-0000-0000-00000000c001: native signed shell volume 76.608 m3 (positive = outward-facing surfaces)", + "space:5080c000-0000-0000-0000-00000000c001: D-F9 stored volume 76.608 m3 vs geometric 76.608 m3: Identical", + "aperture:95717805-e6c7-4051-9c99-937da3d94f15@space:5080c000-0000-0000-0000-00000000c001: native subsurface \u0027SAM_SubSurface_FIX_WIN_FRAMED_0_95717805\u0027 with frame \u0027SAM_SubSurface_FIX_WIN_FRAMED_0_95717805_FrameAndDivider\u0027, identity Verified", + "aperture:95717805-e6c7-4051-9c99-937da3d94f15@space:5080c000-0000-0000-0000-00000000c001: native frame width 0.065 m; SAM T-FRAME OpenStudio rule: DefaultFrameWidth, else the frame layer thickness (pane = face offset inwards by 0.065 m)", + "aperture:6adea09c-1557-4dfd-bfab-75f66600343f@space:5080c000-0000-0000-0000-00000000c001: native subsurface \u0027SAM_SubSurface_FIX_WIN_UNFRAMED_0_6adea09c\u0027 (no frame), identity Verified", + "space:5080c000-0000-0000-0000-00000000c001: D-F2 V2; selection FIX_IC_BOX_VNT; requirement Value(0.03)", + "Ideal Loads \u0027SAM_IdealLoads_FixBox_5080c000\u0027: DCV \u0027None\u0027, economizer \u0027NoEconomizer\u0027, heat recovery \u0027None\u0027, availability \u0027\u0027", + "space:5080c000-0000-0000-0000-00000000c001: OSM DSOA \u0027SAM_InternalCondition_FIX_IC_BOX_af50b3dc_DesignSpecificationOutdoorAir\u0027 inherited from SpaceType \u0027SAM_InternalCondition_FIX_IC_BOX_af50b3dc\u0027; IDF Ideal Loads names \u0027SAM_InternalCondition_FIX_IC_BOX_af50b3dc_DesignSpecificationOutdoorAir\u0027", + "weather: run EPW sha256 472ffb4e2f10867600949a392ce46891fc1bd05f2fc8d8917a99bca7d26209c3; the OSM references a file with sha256 472ffb4e2f10867600949a392ce46891fc1bd05f2fc8d8917a99bca7d26209c3", + "weather: Site:GroundTemperature:BuildingSurface 4.58, 1.15, 0.22, 1.03, 5.66, 10.85, 15.73, 19.27, 20.3, 18.64, 14.64, 9.6 (9.ground, not gated)", + "design days: SAM states 0 (none); the IDF has 0 sizing period(s)", + "OS-MAT-SINGLE-SIDED: 69 internal-side opaque optical row(s) differ from SAM because EnergyPlus opaque materials are single-sided and the writer writes the external value (SAM-OS-MAT-002). Listed as MAPPING-DIFFERENCE by S09 from the writer\u0027s documented behaviour, not by S07: an owner decision (accept, or require a writer change)." + ], + "Inputs": { + "label": "box", + "modelSha256": "45524172b32f85df89511dd344141023de999faa9552a199e6b49062612acd08", + "epwSha256": "472ffb4e2f10867600949a392ce46891fc1bd05f2fc8d8917a99bca7d26209c3", + "osmSha256": "d5270415b4ae98f6ba894b6bdaf903b1dac29de5e6d8be63ca378c2416e567b7", + "idfSha256": "737ea1f44600aff8726d3d46203bb32e026c0ae6518107aafe92e219aaa1b6a6", + "openStudioSdk": "3.10.0\u002B86d7e215a1", + "writerSha256": "8070337f992b57ff4585612cf7b1852053094cc3a0e54aa3567e9c34d9847414", + "readerSha256": "ce8270dd002e63cb4be574de24c6f5fce090ba3ca0207e3d73c7db2ba358ca70", + "exportPid": "38860", + "readerPid": "8420", + "comparePid": "38984", + "mutation": null, + "writerDiagnostics": "Information SAM-OS-MAT-002 Internal-side optical properties (InternalEmissivity, InternalSolarReflectance, InternalLightReflectance) differ from the external-side values \u2014 EnergyPlus opaque materials are single-sided; the external values govern both sides | Information SAM-OS-MAT-002 Internal-side optical properties (InternalEmissivity, InternalSolarReflectance, InternalLightReflectance) differ from the external-side values \u2014 EnergyPlus opaque materials are single-sided; the external values govern both sides | Information SAM-OS-MAT-002 Internal-side optical properties (InternalEmissivity, InternalSolarReflectance, InternalLightReflectance) differ from the external-side values \u2014 EnergyPlus opaque materials are single-sided; the external values govern both sides | Information SAM-OS-MAT-002 Internal-side optical properties (InternalEmissivity, InternalSolarReflectance, InternalLightReflectance) differ from the external-side values \u2014 EnergyPlus opaque materials are single-sided; the external values govern both sides | Information SAM-OS-MAT-002 Internal-side optical properties (InternalEmissivity, InternalSolarReflectance, InternalLightReflectance) differ from the external-side values \u2014 EnergyPlus opaque materials are single-sided; the external values govern both sides | Information SAM-OS-MAT-002 Internal-side optical properties (InternalEmissivity, InternalSolarReflectance, InternalLightReflectance) differ from the external-side values \u2014 EnergyPlus opaque materials are single-sided; the external values govern both sides | Information SAM-OS-MAT-002 Internal-side optical properties (InternalEmissivity, InternalSolarReflectance, InternalLightReflectance) differ from the external-side values \u2014 EnergyPlus opaque materials are single-sided; the external values govern both sides | Information SAM-OS-MAT-002 Internal-side optical properties (InternalEmissivity, InternalSolarReflectance, InternalLightReflectance) differ from the external-side values \u2014 EnergyPlus opaque materials are single-sided; the external values govern both sides | Information SAM-OS-MAT-002 Internal-side optical properties (InternalEmissivity, InternalSolarReflectance, InternalLightReflectance) differ from the external-side values \u2014 EnergyPlus opaque materials are single-sided; the external values govern both sides | Information SAM-OS-MAT-002 Internal-side optical properties (InternalEmissivity, InternalSolarReflectance, InternalLightReflectance) differ from the external-side values \u2014 EnergyPlus opaque materials are single-sided; the external values govern both sides | Information SAM-OS-RUN-002 Annual weather source: explicit EPW (weather.epw) | Information SAM-OS-RUN-002 Ground temperatures taken from the EPW GROUND TEMPERATURES header (depth 0.5 m set, 12 monthly values) | Information SAM-OS-RUN-002 No design-day source supplied; sizing-period runs stay disabled unless OpenStudioConversionOptions.RunSizingPeriods overrides", + "translatorMessages": "0" + } +} \ No newline at end of file diff --git a/documentation/S09-OpenStudio-InputReadBack-evidence/runs/box/report-approved.txt b/documentation/S09-OpenStudio-InputReadBack-evidence/runs/box/report-approved.txt new file mode 100644 index 0000000..4106fdc --- /dev/null +++ b/documentation/S09-OpenStudio-InputReadBack-evidence/runs/box/report-approved.txt @@ -0,0 +1,19 @@ +S09 OpenStudio read-back: s08-fix-box -> BlockedOwnerDecision (exit 12); rule set Approved; gate BlockedOwnerDecision; coverage Complete (316 required, 316 results) +outcomes: DocumentedDefault 1, MappingDifference 69, Match 220, NotApplicable 1, WithinTolerance 25 +D-F2 space:5080c000-0000-0000-0000-00000000c001: V2 +NOT PASS DocumentedDefault / BlockedOwnerDecision: 1 + 4c space:5080c000-0000-0000-0000-00000000c001.ic.lighting.visible: SAM states no value and the native holds the contract-listed default. Not accepted by the owner. +NOT PASS MappingDifference / BlockedOwnerDecision: 69 + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer3.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer3.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer3.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:285a1884-d494-47a6-9541-942946ea00a7@space:5080c000-0000-0000-0000-00000000c001#layer1.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:285a1884-d494-47a6-9541-942946ea00a7@space:5080c000-0000-0000-0000-00000000c001#layer1.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:285a1884-d494-47a6-9541-942946ea00a7@space:5080c000-0000-0000-0000-00000000c001#layer1.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + ... 57 more in report.json diff --git a/documentation/S09-OpenStudio-InputReadBack-evidence/runs/box/report-provisional.txt b/documentation/S09-OpenStudio-InputReadBack-evidence/runs/box/report-provisional.txt new file mode 100644 index 0000000..aec8dab --- /dev/null +++ b/documentation/S09-OpenStudio-InputReadBack-evidence/runs/box/report-provisional.txt @@ -0,0 +1,19 @@ +S09 OpenStudio read-back: s08-fix-box -> BlockedOwnerDecision (exit 12); rule set ProvisionalProposed; gate BlockedOwnerDecision; coverage Complete (316 required, 316 results) +outcomes: DocumentedDefault 1, MappingDifference 69, Match 220, NotApplicable 1, WithinTolerance 25 +D-F2 space:5080c000-0000-0000-0000-00000000c001: V2 +NOT PASS DocumentedDefault / BlockedOwnerDecision: 1 + 4c space:5080c000-0000-0000-0000-00000000c001.ic.lighting.visible: SAM states no value and the native holds the contract-listed default. Not accepted by the owner. +NOT PASS MappingDifference / BlockedOwnerDecision: 69 + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer1.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer2.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer3.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer3.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:b07106b3-da42-40de-a8de-b1284bc3d785@space:5080c000-0000-0000-0000-00000000c001#layer3.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:285a1884-d494-47a6-9541-942946ea00a7@space:5080c000-0000-0000-0000-00000000c001#layer1.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:285a1884-d494-47a6-9541-942946ea00a7@space:5080c000-0000-0000-0000-00000000c001#layer1.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:285a1884-d494-47a6-9541-942946ea00a7@space:5080c000-0000-0000-0000-00000000c001#layer1.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + ... 57 more in report.json diff --git a/documentation/S09-OpenStudio-InputReadBack-evidence/runs/two/export.json b/documentation/S09-OpenStudio-InputReadBack-evidence/runs/two/export.json new file mode 100644 index 0000000..0a0fcbd --- /dev/null +++ b/documentation/S09-OpenStudio-InputReadBack-evidence/runs/two/export.json @@ -0,0 +1,51 @@ +{ + "Schema": "s09-export/1", + "Label": "two", + "Mutation": null, + "SourceModelPath": "/s08-fix-two.json", + "SourceEpwPath": "/budapest.epw", + "ModelSha256": "20da9b586345e9fc67dc6308e6da1578b9bc41b3c694dbdab37e9c677959baa0", + "EpwSha256": "472ffb4e2f10867600949a392ce46891fc1bd05f2fc8d8917a99bca7d26209c3", + "OsmSha256": "60ab9f06beeb00f5866f793ad100b6cb2dfbdb75fbf52ac31793fdc7b52f14e1", + "IdfSha256": "f0b9ca4bfedddf75e00a948890f667560e66acf8d742fc911bab130bd53fde72", + "OpenStudioSdkVersion": "3.10.0\u002B86d7e215a1", + "WriterAssembly": "/SAM.Analytical.OpenStudio.dll", + "WriterAssemblySha256": "8070337f992b57ff4585612cf7b1852053094cc3a0e54aa3567e9c34d9847414", + "ProcessId": 8472, + "StartedUtc": "2026-10-21T12:43:41.8604611Z", + "FinishedUtc": "2026-10-21T12:43:47.3438773Z", + "ConversionValid": true, + "Diagnostics": [ + "Information SAM-OS-HVAC-001 No Ventilation profile is selected: the outdoor-air requirement is kept and no outdoor air is delivered (S07 D-F2 V1)", + "Information SAM-OS-HVAC-001 No Ventilation profile is selected: the outdoor-air requirement is kept and no outdoor air is delivered (S07 D-F2 V1)", + "Information SAM-OS-MAT-002 Vapour diffusion factor (110) is not converted \u2014 EnergyPlus moisture modelling (HAMT/EMPD) needs data SAM does not carry", + "Information SAM-OS-MAT-002 Internal-side optical properties (InternalEmissivity, InternalSolarReflectance, InternalLightReflectance) differ from the external-side values \u2014 EnergyPlus opaque materials are single-sided; the external values govern both sides", + "Information SAM-OS-MAT-002 Vapour diffusion factor (40) is not converted \u2014 EnergyPlus moisture modelling (HAMT/EMPD) needs data SAM does not carry", + "Information SAM-OS-MAT-002 Internal-side optical properties (InternalEmissivity, InternalSolarReflectance, InternalLightReflectance) differ from the external-side values \u2014 EnergyPlus opaque materials are single-sided; the external values govern both sides", + "Information SAM-OS-MAT-002 Vapour diffusion factor (15) is not converted \u2014 EnergyPlus moisture modelling (HAMT/EMPD) needs data SAM does not carry", + "Information SAM-OS-MAT-002 Internal-side optical properties (InternalEmissivity, InternalSolarReflectance, InternalLightReflectance) differ from the external-side values \u2014 EnergyPlus opaque materials are single-sided; the external values govern both sides", + "Information SAM-OS-MAT-002 Vapour diffusion factor (5E\u002B04) is not converted \u2014 EnergyPlus moisture modelling (HAMT/EMPD) needs data SAM does not carry", + "Information SAM-OS-MAT-002 Internal-side optical properties (InternalEmissivity, InternalSolarReflectance, InternalLightReflectance) differ from the external-side values \u2014 EnergyPlus opaque materials are single-sided; the external values govern both sides", + "Information SAM-OS-MAT-002 Vapour diffusion factor (165) is not converted \u2014 EnergyPlus moisture modelling (HAMT/EMPD) needs data SAM does not carry", + "Information SAM-OS-MAT-002 Internal-side optical properties (InternalEmissivity, InternalSolarReflectance, InternalLightReflectance) differ from the external-side values \u2014 EnergyPlus opaque materials are single-sided; the external values govern both sides", + "Information SAM-OS-MAT-002 Vapour diffusion factor (60) is not converted \u2014 EnergyPlus moisture modelling (HAMT/EMPD) needs data SAM does not carry", + "Information SAM-OS-MAT-002 Internal-side optical properties (InternalEmissivity, InternalSolarReflectance, InternalLightReflectance) differ from the external-side values \u2014 EnergyPlus opaque materials are single-sided; the external values govern both sides", + "Information SAM-OS-MAT-002 Vapour diffusion factor (8) is not converted \u2014 EnergyPlus moisture modelling (HAMT/EMPD) needs data SAM does not carry", + "Information SAM-OS-MAT-002 Internal-side optical properties (InternalEmissivity, InternalSolarReflectance, InternalLightReflectance) differ from the external-side values \u2014 EnergyPlus opaque materials are single-sided; the external values govern both sides", + "Information SAM-OS-MAT-002 Vapour diffusion factor (25) is not converted \u2014 EnergyPlus moisture modelling (HAMT/EMPD) needs data SAM does not carry", + "Information SAM-OS-MAT-002 Internal-side optical properties (InternalEmissivity, InternalSolarReflectance, InternalLightReflectance) differ from the external-side values \u2014 EnergyPlus opaque materials are single-sided; the external values govern both sides", + "Information SAM-OS-MAT-002 Vapour diffusion factor (10) is not converted \u2014 EnergyPlus moisture modelling (HAMT/EMPD) needs data SAM does not carry", + "Information SAM-OS-MAT-002 Internal-side optical properties (InternalEmissivity, InternalSolarReflectance, InternalLightReflectance) differ from the external-side values \u2014 EnergyPlus opaque materials are single-sided; the external values govern both sides", + "Information SAM-OS-MAT-002 Vapour diffusion factor (1.2) is not converted \u2014 EnergyPlus moisture modelling (HAMT/EMPD) needs data SAM does not carry", + "Information SAM-OS-MAT-002 Internal-side optical properties (InternalEmissivity, InternalSolarReflectance, InternalLightReflectance) differ from the external-side values \u2014 EnergyPlus opaque materials are single-sided; the external values govern both sides", + "Information SAM-OS-MAT-002 Vapour diffusion factor (50) is not converted \u2014 EnergyPlus moisture modelling (HAMT/EMPD) needs data SAM does not carry", + "Information SAM-OS-MAT-002 Internal-side optical properties (InternalEmissivity, InternalSolarReflectance, InternalLightReflectance) differ from the external-side values \u2014 EnergyPlus opaque materials are single-sided; the external values govern both sides", + "Information SAM-OS-MAT-002 Vapour diffusion factor (45) is not converted \u2014 EnergyPlus moisture modelling (HAMT/EMPD) needs data SAM does not carry", + "Information SAM-OS-MAT-002 Internal-side optical properties (InternalEmissivity, InternalSolarReflectance, InternalLightReflectance) differ from the external-side values \u2014 EnergyPlus opaque materials are single-sided; the external values govern both sides", + "Information SAM-OS-MAT-002 Vapour diffusion factor (1E\u002B05) is not converted \u2014 EnergyPlus moisture modelling (HAMT/EMPD) needs data SAM does not carry", + "Information SAM-OS-RUN-002 Annual weather source: explicit EPW (weather.epw)", + "Information SAM-OS-RUN-002 Ground temperatures taken from the EPW GROUND TEMPERATURES header (depth 0.5 m set, 12 monthly values)", + "Information SAM-OS-RUN-002 No design-day source supplied; sizing-period runs stay disabled unless OpenStudioConversionOptions.RunSizingPeriods overrides" + ], + "TranslatorMessages": [] +} \ No newline at end of file diff --git a/documentation/S09-OpenStudio-InputReadBack-evidence/runs/two/report-approved.json b/documentation/S09-OpenStudio-InputReadBack-evidence/runs/two/report-approved.json new file mode 100644 index 0000000..a51aa2e --- /dev/null +++ b/documentation/S09-OpenStudio-InputReadBack-evidence/runs/two/report-approved.json @@ -0,0 +1,1255 @@ +{ + "Schema": "s09-readback-report/2", + "FixtureId": "s08-fix-two", + "RuleSet": "Approved", + "Status": "BlockedOwnerDecision", + "ExitCode": 12, + "GateStatus": "BlockedOwnerDecision", + "Coverage": "Complete", + "Required": 586, + "Results": 586, + "MissingComparisons": [], + "CountByOutcome": { + "AcceptedTransformation": 6, + "DocumentedDefault": 2, + "MappingDifference": 138, + "Match": 393, + "NotApplicable": 1, + "WithinTolerance": 46 + }, + "NonPass": [ + { + "Quantity": "3a", + "Key": "panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer1.internalSolarReflectance", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer1.internalLightReflectance", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer1.internalEmissivity", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer2.internalSolarReflectance", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer2.internalLightReflectance", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer2.internalEmissivity", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer3.internalSolarReflectance", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer3.internalLightReflectance", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer3.internalEmissivity", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:fe8a6b43-ec73-4201-91e8-0dedf413b25c@space:5080c000-0000-0000-0000-00000000c0a1#layer1.internalSolarReflectance", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:fe8a6b43-ec73-4201-91e8-0dedf413b25c@space:5080c000-0000-0000-0000-00000000c0a1#layer1.internalLightReflectance", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:fe8a6b43-ec73-4201-91e8-0dedf413b25c@space:5080c000-0000-0000-0000-00000000c0a1#layer1.internalEmissivity", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:fe8a6b43-ec73-4201-91e8-0dedf413b25c@space:5080c000-0000-0000-0000-00000000c0a1#layer2.internalSolarReflectance", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:fe8a6b43-ec73-4201-91e8-0dedf413b25c@space:5080c000-0000-0000-0000-00000000c0a1#layer2.internalLightReflectance", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:fe8a6b43-ec73-4201-91e8-0dedf413b25c@space:5080c000-0000-0000-0000-00000000c0a1#layer2.internalEmissivity", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:fe8a6b43-ec73-4201-91e8-0dedf413b25c@space:5080c000-0000-0000-0000-00000000c0a1#layer3.internalSolarReflectance", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:fe8a6b43-ec73-4201-91e8-0dedf413b25c@space:5080c000-0000-0000-0000-00000000c0a1#layer3.internalLightReflectance", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:fe8a6b43-ec73-4201-91e8-0dedf413b25c@space:5080c000-0000-0000-0000-00000000c0a1#layer3.internalEmissivity", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:fe8a6b43-ec73-4201-91e8-0dedf413b25c@space:5080c000-0000-0000-0000-00000000c0a1#layer4.internalSolarReflectance", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:fe8a6b43-ec73-4201-91e8-0dedf413b25c@space:5080c000-0000-0000-0000-00000000c0a1#layer4.internalLightReflectance", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:fe8a6b43-ec73-4201-91e8-0dedf413b25c@space:5080c000-0000-0000-0000-00000000c0a1#layer4.internalEmissivity", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:1c080d98-e160-4254-8bac-f3902936a621@space:5080c000-0000-0000-0000-00000000c0a1#layer1.internalSolarReflectance", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:1c080d98-e160-4254-8bac-f3902936a621@space:5080c000-0000-0000-0000-00000000c0a1#layer1.internalLightReflectance", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:1c080d98-e160-4254-8bac-f3902936a621@space:5080c000-0000-0000-0000-00000000c0a1#layer1.internalEmissivity", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:1c080d98-e160-4254-8bac-f3902936a621@space:5080c000-0000-0000-0000-00000000c0a1#layer2.internalSolarReflectance", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:1c080d98-e160-4254-8bac-f3902936a621@space:5080c000-0000-0000-0000-00000000c0a1#layer2.internalLightReflectance", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:1c080d98-e160-4254-8bac-f3902936a621@space:5080c000-0000-0000-0000-00000000c0a1#layer2.internalEmissivity", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:1c080d98-e160-4254-8bac-f3902936a621@space:5080c000-0000-0000-0000-00000000c0a1#layer3.internalSolarReflectance", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:1c080d98-e160-4254-8bac-f3902936a621@space:5080c000-0000-0000-0000-00000000c0a1#layer3.internalLightReflectance", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:1c080d98-e160-4254-8bac-f3902936a621@space:5080c000-0000-0000-0000-00000000c0a1#layer3.internalEmissivity", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:1c080d98-e160-4254-8bac-f3902936a621@space:5080c000-0000-0000-0000-00000000c0a1#layer4.internalSolarReflectance", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:1c080d98-e160-4254-8bac-f3902936a621@space:5080c000-0000-0000-0000-00000000c0a1#layer4.internalLightReflectance", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:1c080d98-e160-4254-8bac-f3902936a621@space:5080c000-0000-0000-0000-00000000c0a1#layer4.internalEmissivity", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:4224250c-fb3c-4d91-a9bd-7b0de82b0ab7@space:5080c000-0000-0000-0000-00000000c0a1#layer1.internalSolarReflectance", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:4224250c-fb3c-4d91-a9bd-7b0de82b0ab7@space:5080c000-0000-0000-0000-00000000c0a1#layer1.internalLightReflectance", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:4224250c-fb3c-4d91-a9bd-7b0de82b0ab7@space:5080c000-0000-0000-0000-00000000c0a1#layer1.internalEmissivity", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:4224250c-fb3c-4d91-a9bd-7b0de82b0ab7@space:5080c000-0000-0000-0000-00000000c0a1#layer2.internalSolarReflectance", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:4224250c-fb3c-4d91-a9bd-7b0de82b0ab7@space:5080c000-0000-0000-0000-00000000c0a1#layer2.internalLightReflectance", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:4224250c-fb3c-4d91-a9bd-7b0de82b0ab7@space:5080c000-0000-0000-0000-00000000c0a1#layer2.internalEmissivity", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:4224250c-fb3c-4d91-a9bd-7b0de82b0ab7@space:5080c000-0000-0000-0000-00000000c0a1#layer3.internalSolarReflectance", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:4224250c-fb3c-4d91-a9bd-7b0de82b0ab7@space:5080c000-0000-0000-0000-00000000c0a1#layer3.internalLightReflectance", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:4224250c-fb3c-4d91-a9bd-7b0de82b0ab7@space:5080c000-0000-0000-0000-00000000c0a1#layer3.internalEmissivity", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:4224250c-fb3c-4d91-a9bd-7b0de82b0ab7@space:5080c000-0000-0000-0000-00000000c0a1#layer4.internalSolarReflectance", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:4224250c-fb3c-4d91-a9bd-7b0de82b0ab7@space:5080c000-0000-0000-0000-00000000c0a1#layer4.internalLightReflectance", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:4224250c-fb3c-4d91-a9bd-7b0de82b0ab7@space:5080c000-0000-0000-0000-00000000c0a1#layer4.internalEmissivity", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:2b2d8a7f-fbc6-4663-9608-3f054b4a10d8@space:5080c000-0000-0000-0000-00000000c0a1#layer1.internalSolarReflectance", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:2b2d8a7f-fbc6-4663-9608-3f054b4a10d8@space:5080c000-0000-0000-0000-00000000c0a1#layer1.internalLightReflectance", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:2b2d8a7f-fbc6-4663-9608-3f054b4a10d8@space:5080c000-0000-0000-0000-00000000c0a1#layer1.internalEmissivity", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:2b2d8a7f-fbc6-4663-9608-3f054b4a10d8@space:5080c000-0000-0000-0000-00000000c0a1#layer2.internalSolarReflectance", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:2b2d8a7f-fbc6-4663-9608-3f054b4a10d8@space:5080c000-0000-0000-0000-00000000c0a1#layer2.internalLightReflectance", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:2b2d8a7f-fbc6-4663-9608-3f054b4a10d8@space:5080c000-0000-0000-0000-00000000c0a1#layer2.internalEmissivity", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:2b2d8a7f-fbc6-4663-9608-3f054b4a10d8@space:5080c000-0000-0000-0000-00000000c0a1#layer3.internalSolarReflectance", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:2b2d8a7f-fbc6-4663-9608-3f054b4a10d8@space:5080c000-0000-0000-0000-00000000c0a1#layer3.internalLightReflectance", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:2b2d8a7f-fbc6-4663-9608-3f054b4a10d8@space:5080c000-0000-0000-0000-00000000c0a1#layer3.internalEmissivity", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:2b2d8a7f-fbc6-4663-9608-3f054b4a10d8@space:5080c000-0000-0000-0000-00000000c0a1#layer4.internalSolarReflectance", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:2b2d8a7f-fbc6-4663-9608-3f054b4a10d8@space:5080c000-0000-0000-0000-00000000c0a1#layer4.internalLightReflectance", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:2b2d8a7f-fbc6-4663-9608-3f054b4a10d8@space:5080c000-0000-0000-0000-00000000c0a1#layer4.internalEmissivity", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:3134390a-195b-4e61-86bd-6abf63ce6459@space:5080c000-0000-0000-0000-00000000c0a1#layer1.internalSolarReflectance", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:3134390a-195b-4e61-86bd-6abf63ce6459@space:5080c000-0000-0000-0000-00000000c0a1#layer1.internalLightReflectance", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:3134390a-195b-4e61-86bd-6abf63ce6459@space:5080c000-0000-0000-0000-00000000c0a1#layer1.internalEmissivity", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:3134390a-195b-4e61-86bd-6abf63ce6459@space:5080c000-0000-0000-0000-00000000c0a1#layer2.internalSolarReflectance", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:3134390a-195b-4e61-86bd-6abf63ce6459@space:5080c000-0000-0000-0000-00000000c0a1#layer2.internalLightReflectance", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:3134390a-195b-4e61-86bd-6abf63ce6459@space:5080c000-0000-0000-0000-00000000c0a1#layer2.internalEmissivity", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:3134390a-195b-4e61-86bd-6abf63ce6459@space:5080c000-0000-0000-0000-00000000c0a1#layer3.internalSolarReflectance", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:3134390a-195b-4e61-86bd-6abf63ce6459@space:5080c000-0000-0000-0000-00000000c0a1#layer3.internalLightReflectance", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:3134390a-195b-4e61-86bd-6abf63ce6459@space:5080c000-0000-0000-0000-00000000c0a1#layer3.internalEmissivity", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:3134390a-195b-4e61-86bd-6abf63ce6459@space:5080c000-0000-0000-0000-00000000c0a1#layer4.internalSolarReflectance", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:3134390a-195b-4e61-86bd-6abf63ce6459@space:5080c000-0000-0000-0000-00000000c0a1#layer4.internalLightReflectance", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:3134390a-195b-4e61-86bd-6abf63ce6459@space:5080c000-0000-0000-0000-00000000c0a1#layer4.internalEmissivity", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "4c", + "Key": "space:5080c000-0000-0000-0000-00000000c0a1.ic.lighting.visible", + "Outcome": "DocumentedDefault", + "Status": "BlockedOwnerDecision", + "Reason": "SAM states no value and the native holds the contract-listed default. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:f5273d30-2ac9-43bc-b916-1759aea67323@space:5080c000-0000-0000-0000-00000000c0b1#layer1.internalSolarReflectance", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:f5273d30-2ac9-43bc-b916-1759aea67323@space:5080c000-0000-0000-0000-00000000c0b1#layer1.internalLightReflectance", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:f5273d30-2ac9-43bc-b916-1759aea67323@space:5080c000-0000-0000-0000-00000000c0b1#layer1.internalEmissivity", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:f5273d30-2ac9-43bc-b916-1759aea67323@space:5080c000-0000-0000-0000-00000000c0b1#layer2.internalSolarReflectance", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:f5273d30-2ac9-43bc-b916-1759aea67323@space:5080c000-0000-0000-0000-00000000c0b1#layer2.internalLightReflectance", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:f5273d30-2ac9-43bc-b916-1759aea67323@space:5080c000-0000-0000-0000-00000000c0b1#layer2.internalEmissivity", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:f5273d30-2ac9-43bc-b916-1759aea67323@space:5080c000-0000-0000-0000-00000000c0b1#layer3.internalSolarReflectance", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:f5273d30-2ac9-43bc-b916-1759aea67323@space:5080c000-0000-0000-0000-00000000c0b1#layer3.internalLightReflectance", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:f5273d30-2ac9-43bc-b916-1759aea67323@space:5080c000-0000-0000-0000-00000000c0b1#layer3.internalEmissivity", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:9c39d26c-3a91-43fc-adac-414e0794be54@space:5080c000-0000-0000-0000-00000000c0b1#layer1.internalSolarReflectance", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:9c39d26c-3a91-43fc-adac-414e0794be54@space:5080c000-0000-0000-0000-00000000c0b1#layer1.internalLightReflectance", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:9c39d26c-3a91-43fc-adac-414e0794be54@space:5080c000-0000-0000-0000-00000000c0b1#layer1.internalEmissivity", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:9c39d26c-3a91-43fc-adac-414e0794be54@space:5080c000-0000-0000-0000-00000000c0b1#layer2.internalSolarReflectance", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:9c39d26c-3a91-43fc-adac-414e0794be54@space:5080c000-0000-0000-0000-00000000c0b1#layer2.internalLightReflectance", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:9c39d26c-3a91-43fc-adac-414e0794be54@space:5080c000-0000-0000-0000-00000000c0b1#layer2.internalEmissivity", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:9c39d26c-3a91-43fc-adac-414e0794be54@space:5080c000-0000-0000-0000-00000000c0b1#layer3.internalSolarReflectance", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:9c39d26c-3a91-43fc-adac-414e0794be54@space:5080c000-0000-0000-0000-00000000c0b1#layer3.internalLightReflectance", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:9c39d26c-3a91-43fc-adac-414e0794be54@space:5080c000-0000-0000-0000-00000000c0b1#layer3.internalEmissivity", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:9c39d26c-3a91-43fc-adac-414e0794be54@space:5080c000-0000-0000-0000-00000000c0b1#layer4.internalSolarReflectance", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:9c39d26c-3a91-43fc-adac-414e0794be54@space:5080c000-0000-0000-0000-00000000c0b1#layer4.internalLightReflectance", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:9c39d26c-3a91-43fc-adac-414e0794be54@space:5080c000-0000-0000-0000-00000000c0b1#layer4.internalEmissivity", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:d1aaf21e-5613-42e2-ba3c-a6632d2237fd@space:5080c000-0000-0000-0000-00000000c0b1#layer1.internalSolarReflectance", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:d1aaf21e-5613-42e2-ba3c-a6632d2237fd@space:5080c000-0000-0000-0000-00000000c0b1#layer1.internalLightReflectance", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:d1aaf21e-5613-42e2-ba3c-a6632d2237fd@space:5080c000-0000-0000-0000-00000000c0b1#layer1.internalEmissivity", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:d1aaf21e-5613-42e2-ba3c-a6632d2237fd@space:5080c000-0000-0000-0000-00000000c0b1#layer2.internalSolarReflectance", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:d1aaf21e-5613-42e2-ba3c-a6632d2237fd@space:5080c000-0000-0000-0000-00000000c0b1#layer2.internalLightReflectance", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:d1aaf21e-5613-42e2-ba3c-a6632d2237fd@space:5080c000-0000-0000-0000-00000000c0b1#layer2.internalEmissivity", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:d1aaf21e-5613-42e2-ba3c-a6632d2237fd@space:5080c000-0000-0000-0000-00000000c0b1#layer3.internalSolarReflectance", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:d1aaf21e-5613-42e2-ba3c-a6632d2237fd@space:5080c000-0000-0000-0000-00000000c0b1#layer3.internalLightReflectance", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:d1aaf21e-5613-42e2-ba3c-a6632d2237fd@space:5080c000-0000-0000-0000-00000000c0b1#layer3.internalEmissivity", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:d1aaf21e-5613-42e2-ba3c-a6632d2237fd@space:5080c000-0000-0000-0000-00000000c0b1#layer4.internalSolarReflectance", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:d1aaf21e-5613-42e2-ba3c-a6632d2237fd@space:5080c000-0000-0000-0000-00000000c0b1#layer4.internalLightReflectance", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:d1aaf21e-5613-42e2-ba3c-a6632d2237fd@space:5080c000-0000-0000-0000-00000000c0b1#layer4.internalEmissivity", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:965af5b3-f250-4492-9467-f988d7831eae@space:5080c000-0000-0000-0000-00000000c0b1#layer1.internalSolarReflectance", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:965af5b3-f250-4492-9467-f988d7831eae@space:5080c000-0000-0000-0000-00000000c0b1#layer1.internalLightReflectance", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:965af5b3-f250-4492-9467-f988d7831eae@space:5080c000-0000-0000-0000-00000000c0b1#layer1.internalEmissivity", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:965af5b3-f250-4492-9467-f988d7831eae@space:5080c000-0000-0000-0000-00000000c0b1#layer2.internalSolarReflectance", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:965af5b3-f250-4492-9467-f988d7831eae@space:5080c000-0000-0000-0000-00000000c0b1#layer2.internalLightReflectance", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:965af5b3-f250-4492-9467-f988d7831eae@space:5080c000-0000-0000-0000-00000000c0b1#layer2.internalEmissivity", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:965af5b3-f250-4492-9467-f988d7831eae@space:5080c000-0000-0000-0000-00000000c0b1#layer3.internalSolarReflectance", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:965af5b3-f250-4492-9467-f988d7831eae@space:5080c000-0000-0000-0000-00000000c0b1#layer3.internalLightReflectance", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:965af5b3-f250-4492-9467-f988d7831eae@space:5080c000-0000-0000-0000-00000000c0b1#layer3.internalEmissivity", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:965af5b3-f250-4492-9467-f988d7831eae@space:5080c000-0000-0000-0000-00000000c0b1#layer4.internalSolarReflectance", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:965af5b3-f250-4492-9467-f988d7831eae@space:5080c000-0000-0000-0000-00000000c0b1#layer4.internalLightReflectance", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:965af5b3-f250-4492-9467-f988d7831eae@space:5080c000-0000-0000-0000-00000000c0b1#layer4.internalEmissivity", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:d3ef56c6-b1bb-4509-9d4c-ce6aa738f318@space:5080c000-0000-0000-0000-00000000c0b1#layer1.internalSolarReflectance", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:d3ef56c6-b1bb-4509-9d4c-ce6aa738f318@space:5080c000-0000-0000-0000-00000000c0b1#layer1.internalLightReflectance", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:d3ef56c6-b1bb-4509-9d4c-ce6aa738f318@space:5080c000-0000-0000-0000-00000000c0b1#layer1.internalEmissivity", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:d3ef56c6-b1bb-4509-9d4c-ce6aa738f318@space:5080c000-0000-0000-0000-00000000c0b1#layer2.internalSolarReflectance", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:d3ef56c6-b1bb-4509-9d4c-ce6aa738f318@space:5080c000-0000-0000-0000-00000000c0b1#layer2.internalLightReflectance", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:d3ef56c6-b1bb-4509-9d4c-ce6aa738f318@space:5080c000-0000-0000-0000-00000000c0b1#layer2.internalEmissivity", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:d3ef56c6-b1bb-4509-9d4c-ce6aa738f318@space:5080c000-0000-0000-0000-00000000c0b1#layer3.internalSolarReflectance", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:d3ef56c6-b1bb-4509-9d4c-ce6aa738f318@space:5080c000-0000-0000-0000-00000000c0b1#layer3.internalLightReflectance", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:d3ef56c6-b1bb-4509-9d4c-ce6aa738f318@space:5080c000-0000-0000-0000-00000000c0b1#layer3.internalEmissivity", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:d3ef56c6-b1bb-4509-9d4c-ce6aa738f318@space:5080c000-0000-0000-0000-00000000c0b1#layer4.internalSolarReflectance", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:d3ef56c6-b1bb-4509-9d4c-ce6aa738f318@space:5080c000-0000-0000-0000-00000000c0b1#layer4.internalLightReflectance", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:d3ef56c6-b1bb-4509-9d4c-ce6aa738f318@space:5080c000-0000-0000-0000-00000000c0b1#layer4.internalEmissivity", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:3134390a-195b-4e61-86bd-6abf63ce6459@space:5080c000-0000-0000-0000-00000000c0b1#layer1.internalSolarReflectance", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:3134390a-195b-4e61-86bd-6abf63ce6459@space:5080c000-0000-0000-0000-00000000c0b1#layer1.internalLightReflectance", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:3134390a-195b-4e61-86bd-6abf63ce6459@space:5080c000-0000-0000-0000-00000000c0b1#layer1.internalEmissivity", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:3134390a-195b-4e61-86bd-6abf63ce6459@space:5080c000-0000-0000-0000-00000000c0b1#layer2.internalSolarReflectance", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:3134390a-195b-4e61-86bd-6abf63ce6459@space:5080c000-0000-0000-0000-00000000c0b1#layer2.internalLightReflectance", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:3134390a-195b-4e61-86bd-6abf63ce6459@space:5080c000-0000-0000-0000-00000000c0b1#layer2.internalEmissivity", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:3134390a-195b-4e61-86bd-6abf63ce6459@space:5080c000-0000-0000-0000-00000000c0b1#layer3.internalSolarReflectance", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:3134390a-195b-4e61-86bd-6abf63ce6459@space:5080c000-0000-0000-0000-00000000c0b1#layer3.internalLightReflectance", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:3134390a-195b-4e61-86bd-6abf63ce6459@space:5080c000-0000-0000-0000-00000000c0b1#layer3.internalEmissivity", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:3134390a-195b-4e61-86bd-6abf63ce6459@space:5080c000-0000-0000-0000-00000000c0b1#layer4.internalSolarReflectance", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:3134390a-195b-4e61-86bd-6abf63ce6459@space:5080c000-0000-0000-0000-00000000c0b1#layer4.internalLightReflectance", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "3a", + "Key": "panel:3134390a-195b-4e61-86bd-6abf63ce6459@space:5080c000-0000-0000-0000-00000000c0b1#layer4.internalEmissivity", + "Outcome": "MappingDifference", + "Status": "BlockedOwnerDecision", + "Reason": "The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner." + }, + { + "Quantity": "4c", + "Key": "space:5080c000-0000-0000-0000-00000000c0b1.ic.lighting.visible", + "Outcome": "DocumentedDefault", + "Status": "BlockedOwnerDecision", + "Reason": "SAM states no value and the native holds the contract-listed default. Not accepted by the owner." + } + ], + "OwnerDecisionsNamed": [ + "owner acceptance of MappingDifference for 3a on fixture s08-fix-two", + "owner acceptance of DocumentedDefault for 4c on fixture s08-fix-two" + ], + "TechnicalBlockersNamed": [], + "Consistency": [], + "Unsupported": [], + "FixtureCriteria": [], + "VentilationStates": { + "space:5080c000-0000-0000-0000-00000000c0a1": "V1", + "space:5080c000-0000-0000-0000-00000000c0b1": "V1" + }, + "Series": [ + { + "Key": "space:5080c000-0000-0000-0000-00000000c0a1.ic.schedule.occupancy", + "QuantityId": "6.hourly", + "Count": 8760, + "NotPass": 0, + "Status": "Pass", + "Outcome": "Match", + "FirstNotPass": null + }, + { + "Key": "space:5080c000-0000-0000-0000-00000000c0a1.ic.schedule.lighting", + "QuantityId": "6.hourly", + "Count": 8760, + "NotPass": 0, + "Status": "Pass", + "Outcome": "Match", + "FirstNotPass": null + }, + { + "Key": "space:5080c000-0000-0000-0000-00000000c0a1.ic.schedule.equipmentSensible", + "QuantityId": "6.hourly", + "Count": 8760, + "NotPass": 0, + "Status": "Pass", + "Outcome": "Match", + "FirstNotPass": null + }, + { + "Key": "space:5080c000-0000-0000-0000-00000000c0a1.ic.schedule.equipmentLatent", + "QuantityId": "6.hourly", + "Count": 8760, + "NotPass": 0, + "Status": "Pass", + "Outcome": "Match", + "FirstNotPass": null + }, + { + "Key": "space:5080c000-0000-0000-0000-00000000c0a1.ic.schedule.infiltration", + "QuantityId": "6.hourly", + "Count": 8760, + "NotPass": 0, + "Status": "Pass", + "Outcome": "Match", + "FirstNotPass": null + }, + { + "Key": "space:5080c000-0000-0000-0000-00000000c0a1.ic.heating", + "QuantityId": "5.temperature", + "Count": 8760, + "NotPass": 0, + "Status": "Pass", + "Outcome": "Match", + "FirstNotPass": null + }, + { + "Key": "space:5080c000-0000-0000-0000-00000000c0a1.ic.cooling", + "QuantityId": "5.temperature", + "Count": 8760, + "NotPass": 0, + "Status": "Pass", + "Outcome": "Match", + "FirstNotPass": null + }, + { + "Key": "space:5080c000-0000-0000-0000-00000000c0a1.ic.humidification", + "QuantityId": "5.humidity", + "Count": 8760, + "NotPass": 0, + "Status": "Pass", + "Outcome": "Match", + "FirstNotPass": null + }, + { + "Key": "space:5080c000-0000-0000-0000-00000000c0a1.ic.dehumidification", + "QuantityId": "5.humidity", + "Count": 8760, + "NotPass": 0, + "Status": "Pass", + "Outcome": "Match", + "FirstNotPass": null + }, + { + "Key": "space:5080c000-0000-0000-0000-00000000c0a1.ic.ventilation.delivered", + "QuantityId": "8b", + "Count": 8760, + "NotPass": 0, + "Status": "Pass", + "Outcome": "AcceptedTransformation", + "FirstNotPass": null + }, + { + "Key": "space:5080c000-0000-0000-0000-00000000c0a1.ic.schedule.ventilation", + "QuantityId": "6.hourly", + "Count": 8760, + "NotPass": 0, + "Status": "Pass", + "Outcome": "AcceptedTransformation", + "FirstNotPass": null + }, + { + "Key": "space:5080c000-0000-0000-0000-00000000c0b1.ic.schedule.occupancy", + "QuantityId": "6.hourly", + "Count": 8760, + "NotPass": 0, + "Status": "Pass", + "Outcome": "Match", + "FirstNotPass": null + }, + { + "Key": "space:5080c000-0000-0000-0000-00000000c0b1.ic.schedule.lighting", + "QuantityId": "6.hourly", + "Count": 8760, + "NotPass": 0, + "Status": "Pass", + "Outcome": "Match", + "FirstNotPass": null + }, + { + "Key": "space:5080c000-0000-0000-0000-00000000c0b1.ic.schedule.equipmentSensible", + "QuantityId": "6.hourly", + "Count": 8760, + "NotPass": 0, + "Status": "Pass", + "Outcome": "Match", + "FirstNotPass": null + }, + { + "Key": "space:5080c000-0000-0000-0000-00000000c0b1.ic.schedule.equipmentLatent", + "QuantityId": "6.hourly", + "Count": 8760, + "NotPass": 0, + "Status": "Pass", + "Outcome": "Match", + "FirstNotPass": null + }, + { + "Key": "space:5080c000-0000-0000-0000-00000000c0b1.ic.schedule.infiltration", + "QuantityId": "6.hourly", + "Count": 8760, + "NotPass": 0, + "Status": "Pass", + "Outcome": "Match", + "FirstNotPass": null + }, + { + "Key": "space:5080c000-0000-0000-0000-00000000c0b1.ic.heating", + "QuantityId": "5.temperature", + "Count": 8760, + "NotPass": 0, + "Status": "Pass", + "Outcome": "Match", + "FirstNotPass": null + }, + { + "Key": "space:5080c000-0000-0000-0000-00000000c0b1.ic.cooling", + "QuantityId": "5.temperature", + "Count": 8760, + "NotPass": 0, + "Status": "Pass", + "Outcome": "Match", + "FirstNotPass": null + }, + { + "Key": "space:5080c000-0000-0000-0000-00000000c0b1.ic.humidification", + "QuantityId": "5.humidity", + "Count": 8760, + "NotPass": 0, + "Status": "Pass", + "Outcome": "Match", + "FirstNotPass": null + }, + { + "Key": "space:5080c000-0000-0000-0000-00000000c0b1.ic.dehumidification", + "QuantityId": "5.humidity", + "Count": 8760, + "NotPass": 0, + "Status": "Pass", + "Outcome": "Match", + "FirstNotPass": null + }, + { + "Key": "space:5080c000-0000-0000-0000-00000000c0b1.ic.ventilation.delivered", + "QuantityId": "8b", + "Count": 8760, + "NotPass": 0, + "Status": "Pass", + "Outcome": "AcceptedTransformation", + "FirstNotPass": null + }, + { + "Key": "space:5080c000-0000-0000-0000-00000000c0b1.ic.schedule.ventilation", + "QuantityId": "6.hourly", + "Count": 8760, + "NotPass": 0, + "Status": "Pass", + "Outcome": "AcceptedTransformation", + "FirstNotPass": null + } + ], + "Supporting": [ + "calendar: one non-leap run year 1/1-12/31 (IDF RunPeriod begin year 2006), EPW 8760 rows; hour index 0 = 1 January 00:00-01:00. Each schedule\u0027s own hour labels are checked separately.", + "orientation: SAM North Angle unstated (writer default 0); Coordinate System Relative; IDF Building North Axis blank (EnergyPlus default 0): the native building is unrotated, as SAM states", + "multiplicity: 2 IDF zone(s) (2 with their OS:ThermalZone), 0 ZoneGroup(s), 1 IDF subsurface(s) (1 with their OS:SubSurface) read; blank multipliers are the EnergyPlus default 1; every effective multiplier is 1, as SAM states", + "space:5080c000-0000-0000-0000-00000000c0a1 \u0027FixA\u0027 = native space \u0027SAM_Space_FixA_5080c000\u0027 by geometry (6 surfaces one to one); name carrier agrees", + "space:5080c000-0000-0000-0000-00000000c0a1: native signed shell volume 74.115 m3 (positive = outward-facing surfaces)", + "space:5080c000-0000-0000-0000-00000000c0a1: D-F9 stored volume 74.115 m3 vs geometric 74.115 m3: Identical", + "aperture:d4b4d4bb-4372-4191-abc6-ecf6a78db87b@space:5080c000-0000-0000-0000-00000000c0a1: native subsurface \u0027SAM_SubSurface_FIX_WIN_FRAMED_0_d4b4d4bb\u0027 with frame \u0027SAM_SubSurface_FIX_WIN_FRAMED_0_d4b4d4bb_FrameAndDivider\u0027, identity Verified", + "aperture:d4b4d4bb-4372-4191-abc6-ecf6a78db87b@space:5080c000-0000-0000-0000-00000000c0a1: native frame width 0.065 m; SAM T-FRAME OpenStudio rule: DefaultFrameWidth, else the frame layer thickness (pane = face offset inwards by 0.065 m)", + "space:5080c000-0000-0000-0000-00000000c0a1: D-F2 V1; selection none; requirement Value(0.03058)", + "Ideal Loads \u0027SAM_IdealLoads_FixA_5080c000\u0027: DCV \u0027None\u0027, economizer \u0027NoEconomizer\u0027, heat recovery \u0027None\u0027, availability \u0027\u0027", + "space:5080c000-0000-0000-0000-00000000c0a1: OSM DSOA \u0027SAM_InternalCondition_FIX_IC_A_6c498580_DesignSpecificationOutdoorAir\u0027 inherited from SpaceType \u0027SAM_InternalCondition_FIX_IC_A_6c498580\u0027; IDF Ideal Loads names \u0027SAM_InternalCondition_FIX_IC_A_6c498580_DesignSpecificationOutdoorAir\u0027", + "space:5080c000-0000-0000-0000-00000000c0a1: T-VENT-INACTIVE applied (requirement kept, all 8760 schedule values and delivered flows exactly 0 in both views)", + "space:5080c000-0000-0000-0000-00000000c0b1 \u0027FixB\u0027 = native space \u0027SAM_Space_FixB_5080c000\u0027 by geometry (6 surfaces one to one); name carrier agrees", + "space:5080c000-0000-0000-0000-00000000c0b1: native signed shell volume 59.29199999999999 m3 (positive = outward-facing surfaces)", + "space:5080c000-0000-0000-0000-00000000c0b1: D-F9 stored volume 59.29199999999999 m3 vs geometric 59.29200000000002 m3: WithinTolerance", + "space:5080c000-0000-0000-0000-00000000c0b1: D-F2 V1; selection none; requirement Value(0.012352500000000004)", + "Ideal Loads \u0027SAM_IdealLoads_FixB_5080c000\u0027: DCV \u0027None\u0027, economizer \u0027NoEconomizer\u0027, heat recovery \u0027None\u0027, availability \u0027\u0027", + "space:5080c000-0000-0000-0000-00000000c0b1: OSM DSOA \u0027SAM_InternalCondition_FIX_IC_B_e9a6ea38_DesignSpecificationOutdoorAir\u0027 inherited from SpaceType \u0027SAM_InternalCondition_FIX_IC_B_e9a6ea38\u0027; IDF Ideal Loads names \u0027SAM_InternalCondition_FIX_IC_B_e9a6ea38_DesignSpecificationOutdoorAir\u0027", + "space:5080c000-0000-0000-0000-00000000c0b1: T-VENT-INACTIVE applied (requirement kept, all 8760 schedule values and delivered flows exactly 0 in both views)", + "weather: run EPW sha256 472ffb4e2f10867600949a392ce46891fc1bd05f2fc8d8917a99bca7d26209c3; the OSM references a file with sha256 472ffb4e2f10867600949a392ce46891fc1bd05f2fc8d8917a99bca7d26209c3", + "weather: Site:GroundTemperature:BuildingSurface 4.58, 1.15, 0.22, 1.03, 5.66, 10.85, 15.73, 19.27, 20.3, 18.64, 14.64, 9.6 (9.ground, not gated)", + "design days: SAM states 0 (none); the IDF has 0 sizing period(s)", + "OS-MAT-SINGLE-SIDED: 138 internal-side opaque optical row(s) differ from SAM because EnergyPlus opaque materials are single-sided and the writer writes the external value (SAM-OS-MAT-002). Listed as MAPPING-DIFFERENCE by S09 from the writer\u0027s documented behaviour, not by S07: an owner decision (accept, or require a writer change)." + ], + "Inputs": { + "label": "two", + "modelSha256": "20da9b586345e9fc67dc6308e6da1578b9bc41b3c694dbdab37e9c677959baa0", + "epwSha256": "472ffb4e2f10867600949a392ce46891fc1bd05f2fc8d8917a99bca7d26209c3", + "osmSha256": "60ab9f06beeb00f5866f793ad100b6cb2dfbdb75fbf52ac31793fdc7b52f14e1", + "idfSha256": "f0b9ca4bfedddf75e00a948890f667560e66acf8d742fc911bab130bd53fde72", + "openStudioSdk": "3.10.0\u002B86d7e215a1", + "writerSha256": "8070337f992b57ff4585612cf7b1852053094cc3a0e54aa3567e9c34d9847414", + "readerSha256": "ce8270dd002e63cb4be574de24c6f5fce090ba3ca0207e3d73c7db2ba358ca70", + "exportPid": "8472", + "readerPid": "35408", + "comparePid": "38364", + "mutation": null, + "writerDiagnostics": "Information SAM-OS-HVAC-001 No Ventilation profile is selected: the outdoor-air requirement is kept and no outdoor air is delivered (S07 D-F2 V1) | Information SAM-OS-HVAC-001 No Ventilation profile is selected: the outdoor-air requirement is kept and no outdoor air is delivered (S07 D-F2 V1) | Information SAM-OS-MAT-002 Internal-side optical properties (InternalEmissivity, InternalSolarReflectance, InternalLightReflectance) differ from the external-side values \u2014 EnergyPlus opaque materials are single-sided; the external values govern both sides | Information SAM-OS-MAT-002 Internal-side optical properties (InternalEmissivity, InternalSolarReflectance, InternalLightReflectance) differ from the external-side values \u2014 EnergyPlus opaque materials are single-sided; the external values govern both sides | Information SAM-OS-MAT-002 Internal-side optical properties (InternalEmissivity, InternalSolarReflectance, InternalLightReflectance) differ from the external-side values \u2014 EnergyPlus opaque materials are single-sided; the external values govern both sides | Information SAM-OS-MAT-002 Internal-side optical properties (InternalEmissivity, InternalSolarReflectance, InternalLightReflectance) differ from the external-side values \u2014 EnergyPlus opaque materials are single-sided; the external values govern both sides | Information SAM-OS-MAT-002 Internal-side optical properties (InternalEmissivity, InternalSolarReflectance, InternalLightReflectance) differ from the external-side values \u2014 EnergyPlus opaque materials are single-sided; the external values govern both sides | Information SAM-OS-MAT-002 Internal-side optical properties (InternalEmissivity, InternalSolarReflectance, InternalLightReflectance) differ from the external-side values \u2014 EnergyPlus opaque materials are single-sided; the external values govern both sides | Information SAM-OS-MAT-002 Internal-side optical properties (InternalEmissivity, InternalSolarReflectance, InternalLightReflectance) differ from the external-side values \u2014 EnergyPlus opaque materials are single-sided; the external values govern both sides | Information SAM-OS-MAT-002 Internal-side optical properties (InternalEmissivity, InternalSolarReflectance, InternalLightReflectance) differ from the external-side values \u2014 EnergyPlus opaque materials are single-sided; the external values govern both sides | Information SAM-OS-MAT-002 Internal-side optical properties (InternalEmissivity, InternalSolarReflectance, InternalLightReflectance) differ from the external-side values \u2014 EnergyPlus opaque materials are single-sided; the external values govern both sides | Information SAM-OS-MAT-002 Internal-side optical properties (InternalEmissivity, InternalSolarReflectance, InternalLightReflectance) differ from the external-side values \u2014 EnergyPlus opaque materials are single-sided; the external values govern both sides | Information SAM-OS-MAT-002 Internal-side optical properties (InternalEmissivity, InternalSolarReflectance, InternalLightReflectance) differ from the external-side values \u2014 EnergyPlus opaque materials are single-sided; the external values govern both sides | Information SAM-OS-MAT-002 Internal-side optical properties (InternalEmissivity, InternalSolarReflectance, InternalLightReflectance) differ from the external-side values \u2014 EnergyPlus opaque materials are single-sided; the external values govern both sides | Information SAM-OS-RUN-002 Annual weather source: explicit EPW (weather.epw) | Information SAM-OS-RUN-002 Ground temperatures taken from the EPW GROUND TEMPERATURES header (depth 0.5 m set, 12 monthly values) | Information SAM-OS-RUN-002 No design-day source supplied; sizing-period runs stay disabled unless OpenStudioConversionOptions.RunSizingPeriods overrides", + "translatorMessages": "0" + } +} \ No newline at end of file diff --git a/documentation/S09-OpenStudio-InputReadBack-evidence/runs/two/report-approved.txt b/documentation/S09-OpenStudio-InputReadBack-evidence/runs/two/report-approved.txt new file mode 100644 index 0000000..f2e4848 --- /dev/null +++ b/documentation/S09-OpenStudio-InputReadBack-evidence/runs/two/report-approved.txt @@ -0,0 +1,21 @@ +S09 OpenStudio read-back: s08-fix-two -> BlockedOwnerDecision (exit 12); rule set Approved; gate BlockedOwnerDecision; coverage Complete (586 required, 586 results) +outcomes: AcceptedTransformation 6, DocumentedDefault 2, MappingDifference 138, Match 393, NotApplicable 1, WithinTolerance 46 +D-F2 space:5080c000-0000-0000-0000-00000000c0a1: V1 +D-F2 space:5080c000-0000-0000-0000-00000000c0b1: V1 +NOT PASS DocumentedDefault / BlockedOwnerDecision: 2 + 4c space:5080c000-0000-0000-0000-00000000c0a1.ic.lighting.visible: SAM states no value and the native holds the contract-listed default. Not accepted by the owner. + 4c space:5080c000-0000-0000-0000-00000000c0b1.ic.lighting.visible: SAM states no value and the native holds the contract-listed default. Not accepted by the owner. +NOT PASS MappingDifference / BlockedOwnerDecision: 138 + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer1.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer1.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer1.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer2.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer2.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer2.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer3.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer3.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer3.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:fe8a6b43-ec73-4201-91e8-0dedf413b25c@space:5080c000-0000-0000-0000-00000000c0a1#layer1.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:fe8a6b43-ec73-4201-91e8-0dedf413b25c@space:5080c000-0000-0000-0000-00000000c0a1#layer1.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:fe8a6b43-ec73-4201-91e8-0dedf413b25c@space:5080c000-0000-0000-0000-00000000c0a1#layer1.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + ... 126 more in report.json diff --git a/documentation/S09-OpenStudio-InputReadBack-evidence/runs/two/report-provisional.txt b/documentation/S09-OpenStudio-InputReadBack-evidence/runs/two/report-provisional.txt new file mode 100644 index 0000000..317f672 --- /dev/null +++ b/documentation/S09-OpenStudio-InputReadBack-evidence/runs/two/report-provisional.txt @@ -0,0 +1,28 @@ +S09 OpenStudio read-back: s08-fix-two -> BlockedOwnerDecision (exit 12); rule set ProvisionalProposed; gate BlockedOwnerDecision; coverage Complete (586 required, 586 results) +outcomes: DocumentedDefault 2, MappingDifference 138, Match 393, NotApplicable 1, UnlistedDefault 6, WithinTolerance 46 +D-F2 space:5080c000-0000-0000-0000-00000000c0a1: V1 +D-F2 space:5080c000-0000-0000-0000-00000000c0b1: V1 +NOT PASS DocumentedDefault / BlockedOwnerDecision: 2 + 4c space:5080c000-0000-0000-0000-00000000c0a1.ic.lighting.visible: SAM states no value and the native holds the contract-listed default. Not accepted by the owner. + 4c space:5080c000-0000-0000-0000-00000000c0b1.ic.lighting.visible: SAM states no value and the native holds the contract-listed default. Not accepted by the owner. +NOT PASS MappingDifference / BlockedOwnerDecision: 138 + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer1.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer1.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer1.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer2.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer2.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer2.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer3.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer3.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:26780260-a110-447e-b7ec-9e52919fb23d@space:5080c000-0000-0000-0000-00000000c0a1#layer3.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:fe8a6b43-ec73-4201-91e8-0dedf413b25c@space:5080c000-0000-0000-0000-00000000c0a1#layer1.internalSolarReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:fe8a6b43-ec73-4201-91e8-0dedf413b25c@space:5080c000-0000-0000-0000-00000000c0a1#layer1.internalLightReflectance: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + 3a panel:fe8a6b43-ec73-4201-91e8-0dedf413b25c@space:5080c000-0000-0000-0000-00000000c0a1#layer1.internalEmissivity: The native value differs from SAM by a contract-listed MappingDifference. Not accepted by the owner. + ... 126 more in report.json +NOT PASS UnlistedDefault / BlockedOwnerDecision: 6 + 8b space:5080c000-0000-0000-0000-00000000c0a1.ic.ventilation.delivered: SAM states no value and the native object is present with the value 0; zero does not mean absence, and it is not the contract-listed default. Proposed rule G1 (S-UNSPEC, native zero, UNLISTED-DEFAULT); OD-G1 is not approved, so the result is at best BLOCKED. [decisive element space:5080c000-0000-0000-0000-00000000c0a1.ic.ventilation.delivered[0] of 8760] + 6.hourly space:5080c000-0000-0000-0000-00000000c0a1.ic.schedule.ventilation: SAM states no value and the native object is present with the value 0; zero does not mean absence, and it is not the contract-listed default. Proposed rule G1 (S-UNSPEC, native zero, UNLISTED-DEFAULT); OD-G1 is not approved, so the result is at best BLOCKED. [decisive element space:5080c000-0000-0000-0000-00000000c0a1.ic.schedule.ventilation[0] of 8760] + 6.eflh space:5080c000-0000-0000-0000-00000000c0a1.ic.schedule.ventilation: SAM states no value and the native object is present with the value 0; zero does not mean absence, and it is not the contract-listed default. Proposed rule G1 (S-UNSPEC, native zero, UNLISTED-DEFAULT); OD-G1 is not approved, so the result is at best BLOCKED. + 8b space:5080c000-0000-0000-0000-00000000c0b1.ic.ventilation.delivered: SAM states no value and the native object is present with the value 0; zero does not mean absence, and it is not the contract-listed default. Proposed rule G1 (S-UNSPEC, native zero, UNLISTED-DEFAULT); OD-G1 is not approved, so the result is at best BLOCKED. [decisive element space:5080c000-0000-0000-0000-00000000c0b1.ic.ventilation.delivered[0] of 8760] + 6.hourly space:5080c000-0000-0000-0000-00000000c0b1.ic.schedule.ventilation: SAM states no value and the native object is present with the value 0; zero does not mean absence, and it is not the contract-listed default. Proposed rule G1 (S-UNSPEC, native zero, UNLISTED-DEFAULT); OD-G1 is not approved, so the result is at best BLOCKED. [decisive element space:5080c000-0000-0000-0000-00000000c0b1.ic.schedule.ventilation[0] of 8760] + 6.eflh space:5080c000-0000-0000-0000-00000000c0b1.ic.schedule.ventilation: SAM states no value and the native object is present with the value 0; zero does not mean absence, and it is not the contract-listed default. Proposed rule G1 (S-UNSPEC, native zero, UNLISTED-DEFAULT); OD-G1 is not approved, so the result is at best BLOCKED. diff --git a/documentation/S09-OpenStudio-InputReadBack-evidence/summary-acceptance-negative.json b/documentation/S09-OpenStudio-InputReadBack-evidence/summary-acceptance-negative.json new file mode 100644 index 0000000..e316bd9 --- /dev/null +++ b/documentation/S09-OpenStudio-InputReadBack-evidence/summary-acceptance-negative.json @@ -0,0 +1,138 @@ +{ + "phase": "acceptance-negative", + "started": "2026-10-21T12:43:55.9563804Z", + "harnessDll": "b7cf9f2684f09ade91d2fdbbae3de1a9b069dde35359893d0b42f1295f3aa11d", + "runs": [ + { + "label": "neg-identity-swap-names", + "fixture": "s08-fix-two", + "approvedExit": 10, + "status": "Fail", + "mutation": "neg-identity-swap-names: IDF surfaces \u0027SAM_Surface_FIX_EXT_WALL_0_2b2d8a7f\u0027 and \u0027SAM_Surface_FIX_EXT_WALL_0_4224250c\u0027 trade names", + "required": 10 + }, + { + "label": "neg-schedule-swap", + "fixture": "s08-fix-box", + "approvedExit": 10, + "status": "Fail", + "mutation": "neg-schedule-swap: IDF DSOA \u0027SAM_InternalCondition_FIX_IC_BOX_af50b3dc_DesignSpecificationOutdoorAir\u0027 schedule -\u003e the occupancy schedule \u0027SAM_Schedule_FIX_IC_BOX_OCC_Occupancy_98cc45ae\u0027", + "required": 10 + }, + { + "label": "neg-v1-unscheduled", + "fixture": "s08-fix-two", + "approvedExit": 10, + "status": "Fail", + "mutation": "neg-v1-unscheduled: every DSOA fraction schedule removed in the IDF and the OSM (unscheduled delivery)", + "required": 10 + }, + { + "label": "neg-missing-dsoa-link", + "fixture": "s08-fix-box", + "approvedExit": 10, + "status": "Fail", + "mutation": "neg-missing-dsoa-link: IDF Ideal Loads \u0027SAM_IdealLoads_FixBox_5080c000\u0027 names no DSOA", + "required": 10 + }, + { + "label": "neg-missing-schedule-object", + "fixture": "s08-fix-box", + "approvedExit": 10, + "status": "Fail", + "mutation": "neg-missing-schedule-object: IDF schedule \u0027SAM_Schedule_FIX_IC_BOX_VNT_Ventilation_970842a3\u0027 renamed: the DSOA names an undefined schedule", + "required": 10 + }, + { + "label": "neg-people-density", + "fixture": "s08-fix-box", + "approvedExit": 10, + "status": "Fail", + "mutation": "neg-people-density: IDF People \u0027SAM_InternalCondition_FIX_IC_BOX_af50b3dc_People\u0027 density x 1.01", + "required": 10 + }, + { + "label": "neg-layer-conductivity", + "fixture": "s08-fix-two", + "approvedExit": 10, + "status": "Fail", + "mutation": "neg-layer-conductivity: IDF Material \u0027SAM_OpaqueMaterial_FIX_Blockwork_100mm_422b4f0d\u0027 conductivity x 1.001", + "required": 10 + }, + { + "label": "neg-osm-dsoa-schedule", + "fixture": "s08-fix-box", + "approvedExit": 10, + "status": "Fail", + "mutation": "neg-osm-dsoa-schedule: OSM DSOA \u0027SAM_InternalCondition_FIX_IC_BOX_af50b3dc_DesignSpecificationOutdoorAir\u0027 fraction schedule removed (IDF unchanged)", + "required": 10 + }, + { + "label": "neg-zone-multiplier", + "fixture": "s08-fix-box", + "approvedExit": 10, + "status": "Fail", + "mutation": "neg-zone-multiplier: IDF Zone \u0027SAM_ThermalZone_FixBox_5080c000\u0027 Multiplier 1 -\u003e 2 (OSM unchanged)", + "required": 10 + }, + { + "label": "neg-window-multiplier", + "fixture": "s08-fix-box", + "approvedExit": 10, + "status": "Fail", + "mutation": "neg-window-multiplier: IDF FenestrationSurface:Detailed Multiplier blank -\u003e 2 on 2 subsurface(s) (OSM unchanged)", + "required": 10 + }, + { + "label": "neg-north-axis", + "fixture": "s08-fix-box", + "approvedExit": 10, + "status": "Fail", + "mutation": "neg-north-axis: IDF Building \u0027Building 1\u0027 North Axis blank -\u003e 90 (OSM unchanged)", + "required": 10 + }, + { + "label": "neg-zone-multiplier-both", + "fixture": "s08-fix-box", + "approvedExit": 10, + "status": "Fail", + "mutation": "neg-zone-multiplier-both: IDF Zone \u0027SAM_ThermalZone_FixBox_5080c000\u0027 Multiplier 1 -\u003e 2 and OSM OS:ThermalZone Multiplier blank -\u003e 2", + "required": 10 + }, + { + "label": "neg-window-multiplier-both", + "fixture": "s08-fix-box", + "approvedExit": 10, + "status": "Fail", + "mutation": "neg-window-multiplier-both: IDF FenestrationSurface:Detailed Multiplier blank -\u003e 2 on 2 subsurface(s) and OSM OS:SubSurface Multiplier blank -\u003e 2", + "required": 10 + }, + { + "label": "neg-north-axis-both", + "fixture": "s08-fix-box", + "approvedExit": 10, + "status": "Fail", + "mutation": "neg-north-axis-both: IDF Building \u0027Building 1\u0027 North Axis blank -\u003e 90 and OSM OS:Building North Axis blank -\u003e 90", + "required": 10 + }, + { + "label": "neg-osm-missing-thermal-zone", + "fixture": "s08-fix-two", + "approvedExit": 10, + "status": "Fail", + "mutation": "neg-osm-missing-thermal-zone: OSM OS:ThermalZone \u0027SAM_ThermalZone_FixA_5080c000\u0027 removed (IDF unchanged)", + "required": 10 + }, + { + "label": "neg-osm-missing-subsurfaces", + "fixture": "s08-fix-box", + "approvedExit": 10, + "status": "Fail", + "mutation": "neg-osm-missing-subsurfaces: OSM OS:SubSurface removed for 2 subsurface(s) (IDF unchanged)", + "required": 10 + } + ], + "original-unchanged:box": true, + "original-unchanged:two": true, + "finished": "2026-10-21T12:44:18.4668749Z" +} diff --git a/documentation/S09-OpenStudio-InputReadBack-evidence/summary-acceptance.json b/documentation/S09-OpenStudio-InputReadBack-evidence/summary-acceptance.json new file mode 100644 index 0000000..24ebed1 --- /dev/null +++ b/documentation/S09-OpenStudio-InputReadBack-evidence/summary-acceptance.json @@ -0,0 +1,43 @@ +{ + "phase": "acceptance", + "started": "2026-10-21T12:43:36.2111835Z", + "harnessDll": "b7cf9f2684f09ade91d2fdbbae3de1a9b069dde35359893d0b42f1295f3aa11d", + "runs": [ + { + "label": "box", + "fixture": "s08-fix-box", + "approvedExit": 12, + "provisionalExit": 12, + "status": "BlockedOwnerDecision", + "coverage": "Complete", + "required": 316, + "results": 316 + }, + { + "label": "two", + "fixture": "s08-fix-two", + "approvedExit": 12, + "provisionalExit": 12, + "status": "BlockedOwnerDecision", + "coverage": "Complete", + "required": 586, + "results": 586 + }, + { + "label": "box-repeat", + "fixture": "s08-fix-box", + "approvedExit": 12, + "provisionalExit": 12, + "status": "BlockedOwnerDecision", + "coverage": "Complete", + "required": 316, + "results": 316 + } + ], + "fixture:s08-fix-box.json": "45524172b32f85df89511dd344141023de999faa9552a199e6b49062612acd08", + "fixture:s08-fix-two.json": "20da9b586345e9fc67dc6308e6da1578b9bc41b3c694dbdab37e9c677959baa0", + "epw": "472ffb4e2f10867600949a392ce46891fc1bd05f2fc8d8917a99bca7d26209c3", + "repeat:model.osm": "DIFFERENT d5270415b4ae98f6ba894b6bdaf903b1dac29de5e6d8be63ca378c2416e567b7 81df1925f8926476e101908b68eba4eaa63bb04a584c70f47d05561e8de36853", + "repeat:in.idf": "identical", + "finished": "2026-10-21T12:43:55.3843860Z" +} diff --git a/tests/SAM.Analytical.OpenStudio.Tests/C2/InternalConditionCompletenessTests.cs b/tests/SAM.Analytical.OpenStudio.Tests/C2/InternalConditionCompletenessTests.cs index 6b3daa3..2ff9081 100644 --- a/tests/SAM.Analytical.OpenStudio.Tests/C2/InternalConditionCompletenessTests.cs +++ b/tests/SAM.Analytical.OpenStudio.Tests/C2/InternalConditionCompletenessTests.cs @@ -218,7 +218,9 @@ public void RadiantProportions_ComeFromSamParameters() OpenStudioConversionResult result = AnalyticalModelFixtures.SingleBox(internalConditionOverride: internalCondition).ToOpenStudio(); Assert.That(result.Model.getPeopleDefinitions()[0].fractionRadiant(), Is.EqualTo(0.5).Within(1e-9)); - Assert.That(result.Model.getLightsDefinitions()[0].fractionRadiant(), Is.EqualTo(0.2).Within(1e-9)); + // S07 §5.1: the lighting proportion is the total radiant share, split by s = 0.2415 / 0.576 (LightingSplitTests). + Assert.That(result.Model.getLightsDefinitions()[0].fractionRadiant() + result.Model.getLightsDefinitions()[0].fractionVisible(), Is.EqualTo(0.2).Within(1e-9)); + Assert.That(result.Model.getLightsDefinitions()[0].fractionRadiant(), Is.EqualTo(0.2 * (1 - 0.2415 / 0.576)).Within(1e-9)); Assert.That(result.Model.getElectricEquipmentDefinitions()[0].fractionRadiant(), Is.EqualTo(0.1).Within(1e-9)); } diff --git a/tests/SAM.Analytical.OpenStudio.Tests/C2/LightingSplitTests.cs b/tests/SAM.Analytical.OpenStudio.Tests/C2/LightingSplitTests.cs new file mode 100644 index 0000000..804de17 --- /dev/null +++ b/tests/SAM.Analytical.OpenStudio.Tests/C2/LightingSplitTests.cs @@ -0,0 +1,237 @@ +// SPDX-License-Identifier: LGPL-3.0-or-later +// Copyright (c) 2020–2026 Michal Dengusiak & Jakub Ziolkowski and contributors + +using NUnit.Framework; +using SAM.Core.OpenStudio; +using System.Collections.Generic; +using System.Linq; + +namespace SAM.Analytical.OpenStudio.Tests +{ + /// + /// SAM S07 §5.1 (amendment L1, T-LIGHT-SPLIT). SAM LightingRadiantProportion p is the total radiant share; the + /// writer splits it by s = 0.2415 / 0.576 (Fraction Visible p·s, Fraction Radiant p·(1 − s), Return Air 0) and never + /// reads the view coefficient, which is a comfort coefficient. The importer recovers p = Fraction Radiant + Fraction + /// Visible and does not set the view coefficient. The expected values are the contract's vectors, not the writer's + /// constants. + /// + [TestFixture] + public class LightingSplitTests + { + private const string ASSUMPTION = "SAM-OS-IC-002"; + private const string IC_PARAM = "SAM-OS-IC-001"; + + private static global::OpenStudio.LightsDefinition Lights(OpenStudioConversionResult result) + { + Assert.That(result.Model.getLightsDefinitions().Count, Is.EqualTo(1)); + return result.Model.getLightsDefinitions()[0]; + } + + private static OpenStudioConversionResult Convert(double? radiantProportion, double? viewCoefficient = null) + { + InternalCondition internalCondition = AnalyticalModelFixtures.CreateOfficeInternalCondition(); + if (radiantProportion.HasValue) + { + internalCondition.SetValue(InternalConditionParameter.LightingRadiantProportion, radiantProportion.Value); + } + + if (viewCoefficient.HasValue) + { + internalCondition.SetValue(InternalConditionParameter.LightingViewCoefficient, viewCoefficient.Value); + } + + return AnalyticalModelFixtures.SingleBox(internalConditionOverride: internalCondition).ToOpenStudio(); + } + + // S07 §5.1, "Expected vectors" (tolerance 0.001; the vectors are printed to 6 decimals). + [TestCase(0.37, 0.155130, 0.214870)] + [TestCase(0.34, 0.142552, 0.197448)] + [TestCase(0.41, 0.171901, 0.238099)] + public void AnAuthoredP_IsSplitByS_WithNoReturnAir(double p, double visible, double radiant) + { + using (OpenStudioConversionResult result = Convert(p)) + { + global::OpenStudio.LightsDefinition lights = Lights(result); + Assert.That(lights.fractionVisible(), Is.EqualTo(visible).Within(1e-6)); + Assert.That(lights.fractionRadiant(), Is.EqualTo(radiant).Within(1e-6)); + Assert.That(lights.returnAirFraction(), Is.EqualTo(0.0)); + Assert.That(lights.fractionRadiant() + lights.fractionVisible(), Is.EqualTo(p).Within(1e-12), "the total radiant share is preserved"); + Assert.That(1 - lights.returnAirFraction() - lights.fractionRadiant() - lights.fractionVisible(), Is.EqualTo(1 - p).Within(1e-12), "convective 1 − p, as Tas"); + + Core.OpenStudio.OpenStudioDiagnostic note = result.Diagnostics.Single(x => x.Code == ASSUMPTION); + Assert.That(note.Severity, Is.EqualTo(Core.OpenStudio.OpenStudioDiagnosticSeverity.Information)); + Assert.That(note.GetDiagnosticDetail(), Is.EqualTo(Core.DiagnosticDetail.Summary), "s is an assumption that changes results"); + Assert.That(note.Message, Does.StartWith("Lighting radiant proportion p = " + p.ToString("R", System.Globalization.CultureInfo.InvariantCulture) + " (authored)")); + Assert.That(note.Message, Does.Contain("s = 0.2415 / 0.576").And.Contain("suspended (pendant) LED office lighting").And.Contain("Not applicable to recessed")); + Assert.That(note.Message, Does.Not.Contain("p₀"), "an authored p is not the default"); + } + } + + [Test] + public void AnAuthoredZero_IsPreserved_AllConvective() + { + using (OpenStudioConversionResult result = Convert(0.0)) + { + global::OpenStudio.LightsDefinition lights = Lights(result); + Assert.That(lights.fractionRadiant(), Is.EqualTo(0.0)); + Assert.That(lights.fractionVisible(), Is.EqualTo(0.0)); + Assert.That(lights.returnAirFraction(), Is.EqualTo(0.0)); + Assert.That(result.Diagnostics.Single(x => x.Code == ASSUMPTION).Message, Does.StartWith("Lighting radiant proportion p = 0 (authored)")); + } + } + + [TestCase(false)] + [TestCase(true)] + public void AnAbsentOrNaNP_TakesTheCommonDefault_WithItsCategoryAndOpenDecisionStated(bool nan) + { + using (OpenStudioConversionResult result = Convert(nan ? double.NaN : (double?)null)) + { + global::OpenStudio.LightsDefinition lights = Lights(result); + Assert.That(lights.fractionRadiant(), Is.EqualTo(0.3345).Within(1e-12)); + Assert.That(lights.fractionVisible(), Is.EqualTo(0.2415).Within(1e-12)); + Assert.That(lights.returnAirFraction(), Is.EqualTo(0.0)); + + Core.OpenStudio.OpenStudioDiagnostic note = result.Diagnostics.Single(x => x.Code == ASSUMPTION); + Assert.That(note.Severity, Is.EqualTo(Core.OpenStudio.OpenStudioDiagnosticSeverity.Information)); + Assert.That(note.GetDiagnosticDetail(), Is.EqualTo(Core.DiagnosticDetail.Summary), "a fallback that can change results is never hidden"); + Assert.That(note.Message, Does.StartWith("Lighting radiant proportion is not stated; the S07 §5.1 common default p₀ = 0.576 was applied")); + Assert.That(note.Message, Does.Contain("OD-L1").And.Contain("not a regulatory, NCM, TM59 or dwelling value").And.Contain("suspended (pendant) LED office lighting")); + } + } + + [TestCase(0.37)] + [TestCase(0.0)] + [TestCase(null)] + public void TheComfortCoefficient_NeverChangesTheLightsFractions(double? p) + { + double radiant, visible, returnAir; + using (OpenStudioConversionResult without = Convert(p)) + { + radiant = Lights(without).fractionRadiant(); + visible = Lights(without).fractionVisible(); + returnAir = Lights(without).returnAirFraction(); + Assert.That(without.Diagnostics.Any(x => x.Message != null && x.Message.StartsWith("Lighting view coefficient")), Is.False); + } + + foreach (double coefficient in new[] { 0.49, 0.25, 0.0, 1.0 }) + { + using (OpenStudioConversionResult with = Convert(p, coefficient)) + { + Assert.That(Lights(with).fractionRadiant(), Is.EqualTo(radiant), "C = " + coefficient); + Assert.That(Lights(with).fractionVisible(), Is.EqualTo(visible), "C = " + coefficient); + Assert.That(Lights(with).returnAirFraction(), Is.EqualTo(returnAir), "C = " + coefficient); + + Core.OpenStudio.OpenStudioDiagnostic note = with.Diagnostics.Single(x => x.Code == IC_PARAM && x.Message.StartsWith("Lighting view coefficient")); + Assert.That(note.Severity, Is.EqualTo(Core.OpenStudio.OpenStudioDiagnosticSeverity.Information)); + Assert.That(note.Message, Does.Contain("not an energy fraction")); + } + } + } + + // --- import ------------------------------------------------------------------------------------------------------- + + private static InternalCondition Import(double returnAir, double radiant, double visible, out List diagnostics) + { + using (global::OpenStudio.Model model = new global::OpenStudio.Model()) + { + global::OpenStudio.Space space = new global::OpenStudio.Space(model); + space.setName("Room"); + global::OpenStudio.ThermalZone thermalZone = new global::OpenStudio.ThermalZone(model); + space.setThermalZone(thermalZone); + global::OpenStudio.Point3dVector vertices = new global::OpenStudio.Point3dVector(); + foreach (double[] vertex in new[] { new[] { 0.0, 0.0, 0.0 }, new[] { 4.0, 0.0, 0.0 }, new[] { 4.0, 0.0, 2.7 }, new[] { 0.0, 0.0, 2.7 } }) + { + vertices.Add(new global::OpenStudio.Point3d(vertex[0], vertex[1], vertex[2])); + } + + global::OpenStudio.Surface wall = new global::OpenStudio.Surface(vertices, model); + wall.setSpace(space); + + global::OpenStudio.SpaceType spaceType = new global::OpenStudio.SpaceType(model); + spaceType.setName("Office"); + space.setSpaceType(spaceType); + + global::OpenStudio.LightsDefinition lightsDefinition = new global::OpenStudio.LightsDefinition(model); + lightsDefinition.setWattsperSpaceFloorArea(8); + Assert.That(lightsDefinition.setReturnAirFraction(returnAir), Is.True); + Assert.That(lightsDefinition.setFractionRadiant(radiant), Is.True); + Assert.That(lightsDefinition.setFractionVisible(visible), Is.True); + global::OpenStudio.Lights lights = new global::OpenStudio.Lights(lightsDefinition); + lights.setSpaceType(spaceType); + + OpenStudioImportResult result = model.ToSAM(); + diagnostics = result.Diagnostics.ToList(); + return result.AnalyticalModel.AdjacencyCluster.GetSpaces()[0].InternalCondition; + } + } + + private static IEnumerable LightingNotes(IEnumerable diagnostics) + { + return diagnostics.Where(x => x.Code == Core.OpenStudio.OpenStudioImportDiagnosticCodes.ApproximationApplied && x.Message.StartsWith("The Lights")); + } + + [Test] + public void Import_RecoversPFromRadiantPlusVisible_AndNeverSetsTheComfortCoefficient() + { + InternalCondition internalCondition = Import(0, 0.3345, 0.2415, out List diagnostics); + Assert.That(internalCondition.TryGetValue(InternalConditionParameter.LightingRadiantProportion, out double p), Is.True); + Assert.That(p, Is.EqualTo(0.576).Within(1e-12)); + Assert.That(internalCondition.TryGetValue(InternalConditionParameter.LightingViewCoefficient, out double _), Is.False, "the view coefficient is not an energy fraction"); + Assert.That(LightingNotes(diagnostics), Is.Empty, "the split is s and there is no return air"); + } + + [Test] + public void Import_AZeroSplit_IsAnAuthoredZero() + { + InternalCondition internalCondition = Import(0, 0, 0, out List diagnostics); + Assert.That(internalCondition.TryGetValue(InternalConditionParameter.LightingRadiantProportion, out double p), Is.True); + Assert.That(p, Is.EqualTo(0.0)); + Assert.That(internalCondition.TryGetValue(InternalConditionParameter.LightingViewCoefficient, out double _), Is.False); + Assert.That(LightingNotes(diagnostics), Is.Empty); + } + + [Test] + public void Import_AnotherShortWaveShare_IsReported() + { + InternalCondition internalCondition = Import(0, 0.3, 0.2, out List diagnostics); + Assert.That(internalCondition.GetValue(InternalConditionParameter.LightingRadiantProportion), Is.EqualTo(0.5).Within(1e-12)); + Core.OpenStudio.OpenStudioDiagnostic note = LightingNotes(diagnostics).Single(); + Assert.That(note.Severity, Is.EqualTo(Core.OpenStudio.OpenStudioDiagnosticSeverity.Information)); + Assert.That(note.GetDiagnosticDetail(), Is.EqualTo(Core.DiagnosticDetail.Summary)); + Assert.That(note.Message, Does.StartWith("The Lights short-wave share of the radiant output")); + } + + [Test] + public void Import_ANonzeroReturnAirShare_IsWarnedAndBecomesConvective() + { + InternalCondition internalCondition = Import(0.1, 0.3345, 0.2415, out List diagnostics); + Assert.That(internalCondition.GetValue(InternalConditionParameter.LightingRadiantProportion), Is.EqualTo(0.576).Within(1e-12), "p is the radiant share only"); + Core.OpenStudio.OpenStudioDiagnostic warning = LightingNotes(diagnostics).Single(); + Assert.That(warning.Severity, Is.EqualTo(Core.OpenStudio.OpenStudioDiagnosticSeverity.Warning)); + Assert.That(warning.Message, Does.StartWith("The Lights Return Air Fraction 0.1 has no SAM allocation")); + Assert.That(internalCondition.TryGetValue(InternalConditionParameter.LightingViewCoefficient, out double _), Is.False); + } + + [Test] + public void Import_FractionsSummingAboveOne_AreNotImported() + { + InternalCondition internalCondition = Import(0.3, 0.5, 0.4, out List diagnostics); + Assert.That(internalCondition.TryGetValue(InternalConditionParameter.LightingRadiantProportion, out double _), Is.False); + Assert.That(LightingNotes(diagnostics).Single().Severity, Is.EqualTo(Core.OpenStudio.OpenStudioDiagnosticSeverity.Warning)); + } + + [TestCase(0.37)] + [TestCase(0.0)] + public void RoundTrip_PreservesTheAuthoredP_WithoutAComfortCoefficient(double p) + { + using (OpenStudioConversionResult conversion = Convert(p, 0.49)) + { + OpenStudioImportResult result = conversion.Model.ToSAM(); + InternalCondition internalCondition = result.AnalyticalModel.AdjacencyCluster.GetSpaces()[0].InternalCondition; + Assert.That(internalCondition.GetValue(InternalConditionParameter.LightingRadiantProportion), Is.EqualTo(p).Within(1e-12)); + Assert.That(internalCondition.TryGetValue(InternalConditionParameter.LightingViewCoefficient, out double _), Is.False); + Assert.That(LightingNotes(result.Diagnostics), Is.Empty); + } + } + } +} diff --git a/tests/SAM.Analytical.OpenStudio.Tests/C7/DeclaredDiagnosticsTests.cs b/tests/SAM.Analytical.OpenStudio.Tests/C7/DeclaredDiagnosticsTests.cs index c6ff878..a35a176 100644 --- a/tests/SAM.Analytical.OpenStudio.Tests/C7/DeclaredDiagnosticsTests.cs +++ b/tests/SAM.Analytical.OpenStudio.Tests/C7/DeclaredDiagnosticsTests.cs @@ -193,24 +193,24 @@ public void Material_VapourDiffusionFactor_RaisesDeclaredDiagnosticOncePerMateri } [Test] - public void OpaqueMaterial_DivergentInternalOptics_RaisesDeclaredDiagnostic() + public void OpaqueMaterial_DivergentInternalOptics_OnTheZoneFace_IsAVariantNotAnApproximation() { - // Manifest: OpaqueMaterialParameter.InternalEmissivity (and the Internal - // reflectances) — Approximated, "SAM-OS-MAT-002 info when Internal differs from - // External; EnergyPlus opaque materials are single-sided". + // Manifest: OpaqueMaterialParameter.InternalEmissivity (and the Internal reflectances) + // — Derived: SAM's first layer carries an internal-face variant (revision 8), so the + // single-sided approximation diagnostic is no longer raised for opaque constructions. Core.MaterialLibrary materialLibrary = AnalyticalModelFixtures.CreateMaterialLibrary(); - OpaqueMaterial brick = materialLibrary.GetMaterial("Brick") as OpaqueMaterial; - brick.SetValue(OpaqueMaterialParameter.InternalEmissivity, 0.4); // external 0.9 → divergent - brick.SetValue(OpaqueMaterialParameter.InternalSolarReflectance, 0.3); // external 0.3 → identical - materialLibrary.Add(brick); + OpaqueMaterial plasterboard = materialLibrary.GetMaterial("Plasterboard") as OpaqueMaterial; + plasterboard.SetValue(OpaqueMaterialParameter.InternalEmissivity, 0.4); // external 0.9 → divergent + plasterboard.SetValue(OpaqueMaterialParameter.InternalSolarReflectance, 0.5); // external 0.5 → identical + materialLibrary.Add(plasterboard); OpenStudioConversionResult result = SingleBoxModel(materialLibrary).ToOpenStudio(); Assert.That(result.IsValid, Is.True); - List diagnostics = result.Diagnostics.Where(d => d.Code == "SAM-OS-MAT-002" && d.Severity == Core.OpenStudio.OpenStudioDiagnosticSeverity.Information && d.Message.Contains("Internal-side")).ToList(); - Assert.That(diagnostics.Count, Is.EqualTo(1), "Declared single-sided approximation diagnostic, once per material"); - Assert.That(diagnostics[0].Message, Does.Contain("InternalEmissivity"), "The divergent parameter is named"); - Assert.That(diagnostics[0].Message, Does.Not.Contain("InternalSolarReflectance"), "A matching internal value is not a divergence"); + Assert.That(result.Diagnostics.Any(d => d.Code == "SAM-OS-MAT-002" && d.Message.Contains("Internal-side")), Is.False, "Represented on the zone face, not approximated"); + global::OpenStudio.StandardOpaqueMaterial variant = result.Model.getStandardOpaqueMaterials().Single(x => x.nameString().Contains("Plasterboard_12.5mm_Internal")); + Assert.That(variant.thermalAbsorptance(), Is.EqualTo(0.4).Within(1e-12), "The internal emissivity is written on the zone face"); + Assert.That(variant.solarAbsorptance(), Is.EqualTo(0.5).Within(1e-12)); } [Test] diff --git a/tests/SAM.Analytical.OpenStudio.Tests/D1/DiagnosticDetailTableTests.cs b/tests/SAM.Analytical.OpenStudio.Tests/D1/DiagnosticDetailTableTests.cs index a033cf9..b5cecb9 100644 --- a/tests/SAM.Analytical.OpenStudio.Tests/D1/DiagnosticDetailTableTests.cs +++ b/tests/SAM.Analytical.OpenStudio.Tests/D1/DiagnosticDetailTableTests.cs @@ -29,6 +29,7 @@ public class DiagnosticDetailTableTests private const string CON_PARAM = Core.OpenStudio.OpenStudioDiagnosticCodes.ConstructionUnsupportedParameter; private const string MAT_PARAM = Core.OpenStudio.OpenStudioDiagnosticCodes.MaterialUnsupportedParameter; private const string IC_PARAM = Core.OpenStudio.OpenStudioDiagnosticCodes.InternalConditionUnsupportedParameter; + private const string IC_ASSUME = Core.OpenStudio.OpenStudioDiagnosticCodes.InternalConditionAssumption; private const string HVAC = Core.OpenStudio.OpenStudioDiagnosticCodes.HvacMissingSetpoints; private const string SCHEDULE = Core.OpenStudio.OpenStudioDiagnosticCodes.ScheduleMissingProfile; private const string NON_CONVEX = Core.OpenStudio.OpenStudioDiagnosticCodes.GeometryNonConvexCasting; @@ -61,6 +62,7 @@ private static readonly (string Code, string Message, Core.DiagnosticDetail Expe (IC_PARAM, "Air panel converted with Air Exchange Method 'SimpleMixing' at 2 ACH (caller-supplied assumption", S, "inter-zone air exchange assumption"), (MAT_PARAM, "Internal-side optical properties (InternalEmissivity) differ from the external-side values", S, "single-sided optics approximation"), (MAT_PARAM, "Material is flagged as a blind but SAM carries no slat geometry", S, "solar control is not modelled"), + (Core.OpenStudio.OpenStudioDiagnosticCodes.MaterialFaceAssumption, "Zone face: InternalLightReflectance not stated (absent or NaN); the external-side value is written on the zone face", S, "an inherited zone-face optic changes the heat balance"), // Dropped inputs that can change loads. (CON_PARAM, "Opening properties (openable fraction, discharge coefficient) are not converted", S, "natural ventilation is not modelled"), @@ -72,12 +74,15 @@ private static readonly (string Code, string Message, Core.DiagnosticDetail Expe (CON_PARAM, "Internal-shadow flag (TAS) on the construction is not converted", S, "not shown to be inert"), (IC_PARAM, "Ventilation function (TAS expression/factor/setback) is not converted", S, "ventilation"), (IC_PARAM, "Lighting control function (TAS control expression) is not converted", S, "lighting gains"), + (IC_PARAM, "Lighting view coefficient is not converted", S, "until S07 §5.1 it reached EnergyPlus as Fraction Visible; kept visible rather than lowered as inert"), + (IC_ASSUME, "Lighting radiant proportion p = 0.37 (authored) is split under S07 §5.1 T-LIGHT-SPLIT", S, "the declared short-wave share s sets the radiant split"), + (IC_ASSUME, "Lighting radiant proportion is not stated; the S07 §5.1 common default p₀ = 0.576 was applied", S, "a contract default that can change results"), (HVAC, "Emitter characteristics (HeatingEmitterCoefficient) are not converted", S, "emitters are deferred"), (HVAC, "Exhaust air flows (ExhaustAirFlow) are not converted", S, "exhaust ventilation is deferred"), // Known-inert lines: lowered. - (IC_PARAM, "Occupancy view coefficient is not converted", D, "OS:People has no visible-fraction field; daylighting only"), - (IC_PARAM, "Equipment view coefficient is not converted", D, "OS:ElectricEquipment has no visible-fraction field; daylighting only"), + (IC_PARAM, "Occupancy view coefficient is not converted", D, "a TAS comfort coefficient; OS:People has no input for it"), + (IC_PARAM, "Equipment view coefficient is not converted", D, "a TAS comfort coefficient; OS:ElectricEquipment has no input for it"), (MAT_PARAM, "Vapour diffusion factor (10) is not converted", D, "only matters for HAMT / EMPD, which is not used"), (CON_PARAM, "Frame data on an opaque door is not converted (frames apply to glazed subsurfaces); frameless conversion", T, "frames do not apply to opaque doors"), @@ -96,6 +101,7 @@ private static readonly (string Code, string Message, Core.DiagnosticDetail Expe (Core.OpenStudio.OpenStudioImportDiagnosticCodes.ApproximationApplied, "Subsurface type 'TubularDaylightDome' was imported as a SAM aperture", S, "approximation"), (Core.OpenStudio.OpenStudioImportDiagnosticCodes.ApproximationApplied, "Construction 'X' has opaque (non-glazing) layers but is used by a subsurface", S, "approximation"), (Core.OpenStudio.OpenStudioImportDiagnosticCodes.ApproximationApplied, "Electric equipment 'E' is 20% latent; the gain was split", S, "approximation"), + (Core.OpenStudio.OpenStudioImportDiagnosticCodes.ApproximationApplied, "The Lights short-wave share of the radiant output, Fraction Visible / (Fraction Radiant + Fraction Visible) = 0.4, differs", S, "S07 §5.1 import"), (Core.OpenStudio.OpenStudioImportDiagnosticCodes.ApproximationApplied, "Massless material (R = 0.1 m²K/W) imported as a SAM material", S, "approximation"), (Core.OpenStudio.OpenStudioImportDiagnosticCodes.ApproximationApplied, "Shading group 'G' declares a shaded surface", S, "approximation"), (Core.OpenStudio.OpenStudioImportDiagnosticCodes.WeatherLimitation, "The model's Site still carries the default (0, 0, 0) coordinates", S, "no Location"), @@ -181,6 +187,7 @@ public void RealConverters_ViewCoefficientsAreDetailed_LightingControlIsSummary( internalCondition.SetValue(InternalConditionParameter.OccupancyViewCoefficient, 0.227); internalCondition.SetValue(InternalConditionParameter.EquipmentViewCoefficient, 0.372); internalCondition.SetValue(InternalConditionParameter.LightingControlFunction, "PHOTOCELL 300"); + internalCondition.SetValue(InternalConditionParameter.LightingViewCoefficient, 0.49); using (OpenStudioConversionResult result = AnalyticalModelFixtures.SingleBox(internalConditionOverride: internalCondition).ToOpenStudio()) { @@ -189,6 +196,8 @@ public void RealConverters_ViewCoefficientsAreDetailed_LightingControlIsSummary( Assert.That(information.Single(x => x.Message.Contains("Occupancy view coefficient")).GetDiagnosticDetail(), Is.EqualTo(D)); Assert.That(information.Single(x => x.Message.Contains("Equipment view coefficient")).GetDiagnosticDetail(), Is.EqualTo(D)); Assert.That(information.Single(x => x.Message.Contains("Lighting control function")).GetDiagnosticDetail(), Is.EqualTo(S)); + Assert.That(information.Single(x => x.Message.StartsWith("Lighting view coefficient")).GetDiagnosticDetail(), Is.EqualTo(S)); + Assert.That(Information(result).Single(x => x.Code == IC_ASSUME).GetDiagnosticDetail(), Is.EqualTo(S), "the S07 §5.1 lighting note"); } } @@ -201,9 +210,12 @@ public void RealConverters_EmitterAndExhaustDeferralsAreSummary() using (OpenStudioConversionResult result = AnalyticalModelFixtures.SingleBox(internalConditionOverride: internalCondition).ToOpenStudio()) { - List information = Information(result).Where(x => x.Code == HVAC).ToList(); + // S09: the fixture's condition selects no Ventilation profile, so the same code also reports that its + // outdoor-air requirement is kept but not delivered; only the two deferrals are counted here. + List information = Information(result).Where(x => x.Code == HVAC && x.Message.Contains("deferred")).ToList(); Assert.That(information.Count, Is.EqualTo(2)); Assert.That(information.All(x => x.GetDiagnosticDetail() == S), Is.True); + Assert.That(Information(result).Where(x => x.Code == HVAC).All(x => x.GetDiagnosticDetail() == S), Is.True); } } @@ -216,7 +228,13 @@ public void RealConverters_VapourDiffusionIsDetailed_DivergentOpticsIsSummary() brick.SetValue(OpaqueMaterialParameter.InternalEmissivity, 0.4); materialLibrary.Add(brick); - using (OpenStudioConversionResult result = DeclaredDiagnosticsTests.SingleBoxModel(materialLibrary).ToOpenStudio()) + // Since revision 8 an opaque construction places an internal-face variant on the zone face, so the + // single-sided approximation line is raised only by an opaque pane of a fenestration construction + // (a solid door), whose external values still govern both faces. + ApertureConstruction door = new ApertureConstruction(new Guid("22222222-4444-4444-4444-444444444444"), "Fixture Solid Door", ApertureType.Door, new List { new ConstructionLayer("Brick", 0.05) }); + Action addDoor = panel => panel.AddAperture(SAM.Analytical.Create.Aperture(door, new Geometry.Spatial.Face3D(new Geometry.Spatial.Polygon3D(new[] { new Geometry.Spatial.Point3D(1, 0, 0.2), new Geometry.Spatial.Point3D(2, 0, 0.2), new Geometry.Spatial.Point3D(2, 0, 2.2), new Geometry.Spatial.Point3D(1, 0, 2.2) })))); + + using (OpenStudioConversionResult result = DeclaredDiagnosticsTests.SingleBoxModel(materialLibrary, null, addDoor).ToOpenStudio()) { List information = Information(result).Where(x => x.Code == MAT_PARAM).ToList(); diff --git a/tests/SAM.Analytical.OpenStudio.Tests/D1/DiagnosticsAdapterTests.cs b/tests/SAM.Analytical.OpenStudio.Tests/D1/DiagnosticsAdapterTests.cs index 007fd80..a6414be 100644 --- a/tests/SAM.Analytical.OpenStudio.Tests/D1/DiagnosticsAdapterTests.cs +++ b/tests/SAM.Analytical.OpenStudio.Tests/D1/DiagnosticsAdapterTests.cs @@ -357,7 +357,8 @@ public void PublicApi_ExistingMembersAreUnchanged() ["ConstructionMissingLayer"] = "SAM-OS-CON-001", ["ConstructionUnsupportedParameter"] = "SAM-OS-CON-002", ["ScheduleMissingProfile"] = "SAM-OS-SCH-001", ["InternalConditionUnsupportedParameter"] = "SAM-OS-IC-001", ["HvacMissingSetpoints"] = "SAM-OS-HVAC-001", ["RunCliFailed"] = "SAM-OS-RUN-001", ["WeatherDataIssue"] = "SAM-OS-RUN-002", ["ResultExtractionLimitation"] = "SAM-OS-RUN-003", ["SimulationSettingsUnsupported"] = "SAM-OS-SET-001", - ["ComplianceInputUnsupported"] = "SAM-OS-SET-002", ["EnergyPlusSevereError"] = "SAM-OS-EPLUS-001", + ["ComplianceInputUnsupported"] = "SAM-OS-SET-002", ["EnergyPlusSevereError"] = "SAM-OS-EPLUS-001", ["InternalConditionAssumption"] = "SAM-OS-IC-002", + ["MaterialFaceOpticsUnrepresentable"] = "SAM-OS-MAT-003", ["MaterialFaceAssumption"] = "SAM-OS-MAT-004", }; private static readonly Dictionary releasedImportCodes = new Dictionary @@ -368,7 +369,7 @@ public void PublicApi_ExistingMembersAreUnchanged() ["OswFinalOsmNotFound"] = "SAM-OSI-OSW-006", ["OswEnergyPlusMeasureNotRepresentable"] = "SAM-OSI-OSW-007", ["OswWorkflowExecuted"] = "SAM-OSI-OSW-008", ["OswNoSimulationResults"] = "SAM-OSI-OSW-009", ["GeometryInvalid"] = "SAM-OSI-GEO-001", ["GeometryVerticesCleaned"] = "SAM-OSI-GEO-002", ["AdjacencyGeometricFallback"] = "SAM-OSI-ADJ-001", ["AdjacencyPairingFailed"] = "SAM-OSI-ADJ-002", ["BoundaryConditionUnsupported"] = "SAM-OSI-BC-001", - ["SubSurfaceUnsupported"] = "SAM-OSI-SUB-001", ["MaterialUnsupported"] = "SAM-OSI-MAT-001", ["ConstructionUnsupported"] = "SAM-OSI-CON-001", + ["SubSurfaceUnsupported"] = "SAM-OSI-SUB-001", ["MaterialUnsupported"] = "SAM-OSI-MAT-001", ["ConstructionUnsupported"] = "SAM-OSI-CON-001", ["ConstructionFacesUnresolved"] = "SAM-OSI-CON-002", ["ScheduleUnsupported"] = "SAM-OSI-SCH-001", ["LoadUnsupported"] = "SAM-OSI-LOAD-001", ["LoadAssignmentConflict"] = "SAM-OSI-LOAD-002", ["HvacUnsupported"] = "SAM-OSI-HVAC-001", ["ZoneMultiSpace"] = "SAM-OSI-ZONE-001", ["ZoneIncomplete"] = "SAM-OSI-ZONE-002", ["IdentityCollision"] = "SAM-OSI-ID-001", ["WeatherLimitation"] = "SAM-OSI-WEA-001", ["SimulationSettingUnsupported"] = "SAM-OSI-SET-001", diff --git a/tests/SAM.Analytical.OpenStudio.Tests/M4/OpaqueFaceOpticsTests.cs b/tests/SAM.Analytical.OpenStudio.Tests/M4/OpaqueFaceOpticsTests.cs new file mode 100644 index 0000000..6fb51a5 --- /dev/null +++ b/tests/SAM.Analytical.OpenStudio.Tests/M4/OpaqueFaceOpticsTests.cs @@ -0,0 +1,1030 @@ +// SPDX-License-Identifier: LGPL-3.0-or-later +// Copyright (c) 2020–2026 Michal Dengusiak & Jakub Ziolkowski and contributors + +using NUnit.Framework; +using SAM.Core; +using System; +using System.Collections.Generic; +using System.Linq; +using AnalyticalCreate = SAM.Analytical.Create; + +namespace SAM.Analytical.OpenStudio.Tests +{ + /// + /// Opaque face optics (SAM_OpenStudio#33 revision 8). EnergyPlus opaque materials are single-sided and use only + /// the outermost layer's outside face and the innermost layer's zone face. SAM stores layers inside → outside from + /// the panel's first space, so SAM's first layer carries the internal-face optics (an _Internal variant + /// when its faces differ) in both directions, every other layer the external ones. A single-layer construction + /// whose faces differ is supported on the ground or an adiabatic boundary (zone face only) and is a named error + /// (SAM-OS-MAT-003, unsuccessful conversion) on an outdoor or interzone surface. Every opaque object carries its + /// source material Guid, face and authored face optics, so an import recovers both faces. + /// + [TestFixture] + public class OpaqueFaceOpticsTests + { + private const string MAT_FACE = "SAM-OS-MAT-003"; + + // Plasterboard: external 0.9 / 0.5 / 0.5 (ε, ρs, ρv; fixture), internal 0.8 / 0.7 / 0.75. + // Brick: external 0.9 / 0.3 / 0.3 (fixture), internal 0.5 / 0.6 / 0.6. + private static readonly Construction single = new Construction(new Guid("55555555-0000-0000-0000-000000000001"), "Single Plasterboard", new List { new ConstructionLayer("Plasterboard", 0.0125) }); + private static readonly Construction singleAgreeing = new Construction(new Guid("55555555-0000-0000-0000-000000000002"), "Single Insulation", new List { new ConstructionLayer("Insulation", 0.1) }); + private static readonly Construction sandwich = new Construction(new Guid("55555555-0000-0000-0000-000000000003"), "Sandwich", new List + { + new ConstructionLayer("Insulation", 0.1), + new ConstructionLayer("Plasterboard", 0.0125), + new ConstructionLayer("Brick", 0.1), + }); + + private static Geometry.Spatial.Face3D F(params double[] c) + { + List point3Ds = new List(); + for (int i = 0; i < c.Length; i += 3) + { + point3Ds.Add(new Geometry.Spatial.Point3D(c[i], c[i + 1], c[i + 2])); + } + + return new Geometry.Spatial.Face3D(new Geometry.Spatial.Polygon3D(point3Ds)); + } + + internal static MaterialLibrary Library(bool divergent = true) + { + MaterialLibrary result = AnalyticalModelFixtures.CreateMaterialLibrary(); + if (!divergent) + { + return result; + } + + OpaqueMaterial plasterboard = result.GetMaterial("Plasterboard") as OpaqueMaterial; + plasterboard.SetValue(OpaqueMaterialParameter.InternalEmissivity, 0.8); + plasterboard.SetValue(OpaqueMaterialParameter.InternalSolarReflectance, 0.7); + plasterboard.SetValue(OpaqueMaterialParameter.InternalLightReflectance, 0.75); + result.Add(plasterboard); + + OpaqueMaterial brick = result.GetMaterial("Brick") as OpaqueMaterial; + brick.SetValue(OpaqueMaterialParameter.InternalEmissivity, 0.5); + brick.SetValue(OpaqueMaterialParameter.InternalSolarReflectance, 0.6); + brick.SetValue(OpaqueMaterialParameter.InternalLightReflectance, 0.6); + result.Add(brick); + return result; + } + + /// One box (x 0–5, y 0–4, z 0–3): walls, floor (ground unless adiabatic) and roof constructions given separately. + internal static AnalyticalModel Box(MaterialLibrary materialLibrary, Construction walls, Construction floor = null, Construction roof = null, bool adiabaticRoof = false, bool roofFirst = false) + { + AdjacencyCluster adjacencyCluster = new AdjacencyCluster(); + Space space = new Space(new Guid("cccccccc-0000-0000-0000-0000000000ee"), "Space Optics", new Geometry.Spatial.Point3D(2.5, 2, 1.5)); + space.SetValue(SpaceParameter.Area, 20.0); + space.SetValue(SpaceParameter.Volume, 60.0); + space.InternalCondition = AnalyticalModelFixtures.CreateOfficeInternalCondition(); + adjacencyCluster.AddObject(space); + + Panel floorPanel = AnalyticalCreate.Panel(floor ?? walls, PanelType.SlabOnGrade, F(0, 0, 0, 5, 0, 0, 5, 4, 0, 0, 4, 0)); + Panel roofPanel = AnalyticalCreate.Panel(roof ?? walls, PanelType.Roof, F(0, 0, 3, 5, 0, 3, 5, 4, 3, 0, 4, 3)); + if (adiabaticRoof) + { + roofPanel.SetValue(PanelParameter.Adiabatic, true); + } + + List panels = roofFirst ? new List { roofPanel, floorPanel } : new List { floorPanel, roofPanel }; + panels.Add(AnalyticalCreate.Panel(walls, PanelType.WallExternal, F(0, 0, 0, 5, 0, 0, 5, 0, 3, 0, 0, 3))); + panels.Add(AnalyticalCreate.Panel(walls, PanelType.WallExternal, F(0, 0, 0, 0, 4, 0, 0, 4, 3, 0, 0, 3))); + panels.Add(AnalyticalCreate.Panel(walls, PanelType.WallExternal, F(0, 4, 0, 5, 4, 0, 5, 4, 3, 0, 4, 3))); + panels.Add(AnalyticalCreate.Panel(walls, PanelType.WallExternal, F(5, 0, 0, 5, 4, 0, 5, 4, 3, 5, 0, 3))); + foreach (Panel panel in panels) + { + adjacencyCluster.AddObject(panel); + adjacencyCluster.AddRelation(space, panel); + } + + return new AnalyticalModel("Optics Box", "revision 8 fixture", null, null, adjacencyCluster, materialLibrary, AnalyticalModelFixtures.CreateProfileLibrary()); + } + + /// + /// Two boxes sharing the wall at x = 5 (construction ); adds space B + /// to the cluster first. + /// + internal static AnalyticalModel TwoBoxes(MaterialLibrary materialLibrary, Construction shared, bool bFirst = false) + { + Construction wall = AnalyticalModelFixtures.WallConstruction; + AdjacencyCluster adjacencyCluster = new AdjacencyCluster(); + Space spaceA = new Space(new Guid("aaaaaaaa-0000-0000-0000-0000000000ee"), "Space A", new Geometry.Spatial.Point3D(2.25, 2, 1.5)); + Space spaceB = new Space(new Guid("bbbbbbbb-0000-0000-0000-0000000000ee"), "Space B", new Geometry.Spatial.Point3D(7.5, 2, 1.5)); + foreach (Space space in new[] { spaceA, spaceB }) + { + space.SetValue(SpaceParameter.Area, 20.0); + space.SetValue(SpaceParameter.Volume, 60.0); + space.InternalCondition = AnalyticalModelFixtures.CreateOfficeInternalCondition(); + } + + adjacencyCluster.AddObject(bFirst ? spaceB : spaceA); + adjacencyCluster.AddObject(bFirst ? spaceA : spaceB); + + Panel sharedWall = AnalyticalCreate.Panel(shared, PanelType.WallInternal, F(5, 0, 0, 5, 4, 0, 5, 4, 3, 5, 0, 3)); + List panelsA = new List + { + AnalyticalCreate.Panel(wall, PanelType.SlabOnGrade, F(0, 0, 0, 5, 0, 0, 5, 4, 0, 0, 4, 0)), + AnalyticalCreate.Panel(wall, PanelType.Roof, F(0, 0, 3, 5, 0, 3, 5, 4, 3, 0, 4, 3)), + AnalyticalCreate.Panel(wall, PanelType.WallExternal, F(0, 0, 0, 5, 0, 0, 5, 0, 3, 0, 0, 3)), + AnalyticalCreate.Panel(wall, PanelType.WallExternal, F(0, 0, 0, 0, 4, 0, 0, 4, 3, 0, 0, 3)), + AnalyticalCreate.Panel(wall, PanelType.WallExternal, F(0, 4, 0, 5, 4, 0, 5, 4, 3, 0, 4, 3)), + }; + + List panelsB = new List + { + AnalyticalCreate.Panel(wall, PanelType.SlabOnGrade, F(5, 0, 0, 10, 0, 0, 10, 4, 0, 5, 4, 0)), + AnalyticalCreate.Panel(wall, PanelType.Roof, F(5, 0, 3, 10, 0, 3, 10, 4, 3, 5, 4, 3)), + AnalyticalCreate.Panel(wall, PanelType.WallExternal, F(5, 0, 0, 10, 0, 0, 10, 0, 3, 5, 0, 3)), + AnalyticalCreate.Panel(wall, PanelType.WallExternal, F(10, 0, 0, 10, 4, 0, 10, 4, 3, 10, 0, 3)), + AnalyticalCreate.Panel(wall, PanelType.WallExternal, F(5, 4, 0, 10, 4, 0, 10, 4, 3, 5, 4, 3)), + }; + + adjacencyCluster.AddObject(sharedWall); + adjacencyCluster.AddRelation(spaceA, sharedWall); + adjacencyCluster.AddRelation(spaceB, sharedWall); + foreach (Panel panel in panelsA) + { + adjacencyCluster.AddObject(panel); + adjacencyCluster.AddRelation(spaceA, panel); + } + + foreach (Panel panel in panelsB) + { + adjacencyCluster.AddObject(panel); + adjacencyCluster.AddRelation(spaceB, panel); + } + + return new AnalyticalModel("Optics Two Boxes", "revision 8 fixture", null, null, adjacencyCluster, materialLibrary, AnalyticalModelFixtures.CreateProfileLibrary()); + } + + private static List Layers(global::OpenStudio.Surface surface) + { + global::OpenStudio.OptionalConstructionBase optionalConstructionBase = surface.construction(); + Assert.That(optionalConstructionBase != null && !optionalConstructionBase.isNull(), surface.nameString() + " has no construction"); + global::OpenStudio.OptionalConstruction optionalConstruction = optionalConstructionBase.get().to_Construction(); + return optionalConstruction.get().layers().Select(x => x.to_StandardOpaqueMaterial().get()).ToList(); + } + + private static bool HasConstruction(global::OpenStudio.Surface surface) + { + global::OpenStudio.OptionalConstructionBase optionalConstructionBase = surface.construction(); + return optionalConstructionBase != null && !optionalConstructionBase.isNull(); + } + + /// ε, ρs, ρv of a written opaque material. + private static double[] Optics(global::OpenStudio.StandardOpaqueMaterial material) + { + return new[] { material.thermalAbsorptance(), 1 - material.solarAbsorptance(), 1 - material.visibleAbsorptance() }; + } + + private static readonly double[] plasterboardExternal = { 0.9, 0.5, 0.5 }; + private static readonly double[] plasterboardInternal = { 0.8, 0.7, 0.75 }; + private static readonly double[] brickExternal = { 0.9, 0.3, 0.3 }; + + private static string Feature(global::OpenStudio.ModelObject modelObject, string key) + { + return Core.OpenStudio.Query.TryGetSAMFeature(modelObject, key, out string value) ? value : null; + } + + private static global::OpenStudio.Surface Single(global::OpenStudio.Model model, Func predicate) + { + return model.getSurfaces().Single(predicate); + } + + private static bool OfSpace(global::OpenStudio.Surface surface, string spaceName) + { + return surface.space().get().nameString().Contains(spaceName.Replace(" ", "_")) || surface.space().get().nameString().Contains(spaceName); + } + + // ---- writer ---------------------------------------------------------------------------------------------- + + [Test] + public void TheZoneFace_CarriesTheInternalVariant_AndTheOutdoorFaceTheExternalValues() + { + using (OpenStudioConversionResult result = Box(Library(), AnalyticalModelFixtures.WallConstruction).ToOpenStudio()) + { + Assert.That(result.IsValid, Is.True, string.Join(" | ", result.Diagnostics)); + foreach (global::OpenStudio.Surface surface in result.Model.getSurfaces()) + { + List layers = Layers(surface); + Assert.That(layers.Last().nameString(), Does.Contain("Plasterboard_12.5mm_Internal"), surface.nameString() + ": SAM's first layer is the zone face"); + Assert.That(Optics(layers.Last()), Is.EqualTo(plasterboardInternal).Within(1e-12), surface.nameString()); + Assert.That(layers.First().nameString(), Does.Not.Contain("_Internal")); + Assert.That(Optics(layers.First()), Is.EqualTo(brickExternal).Within(1e-12), surface.nameString() + ": the outdoor face keeps the external values"); + } + + Assert.That(result.Diagnostics.Any(d => d.Code == "SAM-OS-MAT-002" && d.Message.Contains("Internal-side")), Is.False, "the zone face is represented, not approximated"); + } + } + + [Test] + public void InterzoneConstructions_AreExactMirrors_AndEachZoneFaceIsCorrect() + { + using (OpenStudioConversionResult result = TwoBoxes(Library(), AnalyticalModelFixtures.WallConstruction).ToOpenStudio()) + { + Assert.That(result.IsValid, Is.True, string.Join(" | ", result.Diagnostics)); + global::OpenStudio.Surface sideA = Single(result.Model, x => x.outsideBoundaryCondition() == "Surface" && OfSpace(x, "Space A")); + global::OpenStudio.Surface sideB = Single(result.Model, x => x.outsideBoundaryCondition() == "Surface" && OfSpace(x, "Space B")); + List namesA = Layers(sideA).Select(x => x.nameString()).ToList(); + List namesB = Layers(sideB).Select(x => x.nameString()).ToList(); + Assert.That(namesB, Is.EqualTo(Enumerable.Reverse(namesA).ToList()), "the reverse construction lists the same objects in mirror order"); + Assert.That(Optics(Layers(sideA).Last()), Is.EqualTo(plasterboardInternal).Within(1e-12), "space A (first) sees SAM's first layer's internal face"); + Assert.That(Optics(Layers(sideB).Last()), Is.EqualTo(brickExternal).Within(1e-12), "space B sees SAM's last layer's external face"); + } + } + + [Test] + public void TheForwardSide_FollowsTheFirstSpaceInGetSpacesOrder() + { + using (OpenStudioConversionResult result = TwoBoxes(Library(), AnalyticalModelFixtures.WallConstruction, bFirst: true).ToOpenStudio()) + { + Assert.That(result.IsValid, Is.True, string.Join(" | ", result.Diagnostics)); + global::OpenStudio.Surface sideA = Single(result.Model, x => x.outsideBoundaryCondition() == "Surface" && OfSpace(x, "Space A")); + global::OpenStudio.Surface sideB = Single(result.Model, x => x.outsideBoundaryCondition() == "Surface" && OfSpace(x, "Space B")); + Assert.That(sideB.construction().get().nameString(), Does.Contain("_Forward"), "space B is first in the cluster"); + Assert.That(sideA.construction().get().nameString(), Does.Contain("_Reverse")); + Assert.That(Optics(Layers(sideB).Last()), Is.EqualTo(plasterboardInternal).Within(1e-12)); + Assert.That(Optics(Layers(sideA).Last()), Is.EqualTo(brickExternal).Within(1e-12)); + } + } + + /// + /// The forward construction goes to the first space's side only. When that side produced no surface the + /// remaining side is refused, never given the forward construction (unit level: no realistic SAM model was + /// found that drops only the first space's side of a related panel; see the record). + /// + [Test] + public void AMissingFirstSpaceSide_IsANamedError_NeverASwappedSide() + { + Space spaceA = new Space(new Guid("aaaaaaaa-0000-0000-0000-0000000000ef"), "Space A", null); + Guid spaceB = new Guid("bbbbbbbb-0000-0000-0000-0000000000ef"); + Assert.That(Convert.ForwardSideProblem(spaceA, new[] { spaceA.Guid, spaceB }), Is.Null, "both sides present"); + Assert.That(Convert.ForwardSideProblem(spaceA, new[] { spaceA.Guid }), Is.Null, "the first side alone keeps its orientation"); + Assert.That(Convert.ForwardSideProblem(null, new[] { spaceB }), Is.Null, "no ordered space"); + Assert.That(Convert.ForwardSideProblem(spaceA, new[] { spaceB }), Does.Contain("first space ('Space A')").And.Contain("never swapped")); + } + + [Test] + public void AMaterialOnTheZoneFaceAndInsideAnotherConstruction_HasTwoThermallyIdenticalObjects() + { + using (OpenStudioConversionResult result = Box(Library(), AnalyticalModelFixtures.WallConstruction, roof: sandwich).ToOpenStudio()) + { + Assert.That(result.IsValid, Is.True, string.Join(" | ", result.Diagnostics)); + List plasterboards = result.Model.getStandardOpaqueMaterials().Where(x => x.nameString().Contains("Plasterboard")).OrderBy(x => x.nameString()).ToList(); + Assert.That(plasterboards.Select(x => x.nameString()), Has.Exactly(1).Contains("_Internal")); + Assert.That(plasterboards.Count, Is.EqualTo(2)); + Assert.That(plasterboards[0].thermalConductivity(), Is.EqualTo(plasterboards[1].thermalConductivity())); + Assert.That(plasterboards[0].density(), Is.EqualTo(plasterboards[1].density())); + Assert.That(plasterboards[0].specificHeat(), Is.EqualTo(plasterboards[1].specificHeat())); + Assert.That(plasterboards[0].thickness(), Is.EqualTo(plasterboards[1].thickness())); + Assert.That(Optics(plasterboards.Single(x => !x.nameString().Contains("_Internal"))), Is.EqualTo(plasterboardExternal).Within(1e-12)); + } + } + + [Test] + public void AgreeingFaces_CreateNoVariant() + { + using (OpenStudioConversionResult result = TwoBoxes(Library(false), AnalyticalModelFixtures.WallConstruction).ToOpenStudio()) + { + Assert.That(result.IsValid, Is.True); + Assert.That(result.Model.getStandardOpaqueMaterials().Select(x => x.nameString()), Has.None.Contains("_Internal")); + Assert.That(result.Model.getStandardOpaqueMaterials().Count, Is.EqualTo(3)); + } + } + + [Test] + public void EveryOpaqueObject_CarriesItsSourceFaceAndTheAuthoredFaceOptics() + { + Guid plasterboard = Library().GetMaterial("Plasterboard").Guid; + using (OpenStudioConversionResult result = Box(Library(), AnalyticalModelFixtures.WallConstruction, roof: sandwich).ToOpenStudio()) + { + foreach (global::OpenStudio.StandardOpaqueMaterial material in result.Model.getStandardOpaqueMaterials().Where(x => x.nameString().Contains("Plasterboard"))) + { + Assert.That(Feature(material, Core.OpenStudio.OpenStudioIdentityKeys.MaterialGuid), Is.EqualTo(plasterboard.ToString("D"))); + Assert.That(Feature(material, Core.OpenStudio.OpenStudioIdentityKeys.MaterialFace), Is.EqualTo(material.nameString().Contains("_Internal") ? "Internal" : "External")); + Assert.That(Feature(material, Core.OpenStudio.OpenStudioIdentityKeys.OpticPrefix + "InternalLightReflectance"), Is.EqualTo("0.75")); + Assert.That(Feature(material, Core.OpenStudio.OpenStudioIdentityKeys.OpticPrefix + "ExternalLightReflectance"), Is.EqualTo("0.5")); + } + } + } + + [TestCase(false)] + [TestCase(true)] + public void ASingleLayerGroundOrAdiabaticConstruction_UsesTheZoneFace(bool adiabatic) + { + AnalyticalModel model = adiabatic + ? Box(Library(), AnalyticalModelFixtures.WallConstruction, roof: single, adiabaticRoof: true) + : Box(Library(), AnalyticalModelFixtures.WallConstruction, floor: single); + using (OpenStudioConversionResult result = model.ToOpenStudio()) + { + Assert.That(result.IsValid, Is.True, string.Join(" | ", result.Diagnostics)); + global::OpenStudio.Surface surface = Single(result.Model, x => x.outsideBoundaryCondition() == (adiabatic ? "Adiabatic" : "Ground")); + List layers = Layers(surface); + Assert.That(layers.Count, Is.EqualTo(1)); + Assert.That(Optics(layers[0]), Is.EqualTo(plasterboardInternal).Within(1e-12)); + } + } + + [Test] + public void ASingleLayerOutdoorConstructionWithDifferentFaces_IsANamedErrorAndAnUnsuccessfulConversion() + { + using (OpenStudioConversionResult result = Box(Library(), single, floor: AnalyticalModelFixtures.WallConstruction, roof: AnalyticalModelFixtures.WallConstruction).ToOpenStudio()) + { + List errors = result.Diagnostics.Where(d => d.Code == MAT_FACE).ToList(); + Assert.That(errors.Count, Is.EqualTo(4), "one per outdoor wall"); + Assert.That(errors.All(d => d.Severity == Core.OpenStudio.OpenStudioDiagnosticSeverity.Error && d.Message.Contains("'Single Plasterboard'") && d.Message.Contains("Outdoors") && d.Message.Contains("Emissivity")), Is.True, string.Join(" | ", errors)); + Assert.That(result.IsValid, Is.False); + Assert.That(result.Model.getSurfaces().Where(x => x.outsideBoundaryCondition() == "Outdoors" && x.surfaceType() == "Wall").All(x => !HasConstruction(x)), Is.True, "no external-valued substitute is written"); + } + } + + [Test] + public void ASingleLayerInterzoneConstructionWithDifferentFaces_IsANamedError() + { + using (OpenStudioConversionResult result = TwoBoxes(Library(), single).ToOpenStudio()) + { + Assert.That(result.Diagnostics.Count(d => d.Code == MAT_FACE && d.Severity == Core.OpenStudio.OpenStudioDiagnosticSeverity.Error && d.Message.Contains("Surface")), Is.EqualTo(1), string.Join(" | ", result.Diagnostics)); + Assert.That(result.IsValid, Is.False); + Assert.That(result.Model.getSurfaces().Where(x => x.outsideBoundaryCondition() == "Surface").All(x => !HasConstruction(x)), Is.True); + } + } + + /// The same single-layer construction on the ground (supported) and on an outdoor roof (refused): each use is judged on its own, whichever is converted first. + [TestCase(false)] + [TestCase(true)] + public void TheSingleLayerRule_IsCheckedPerUse_BeforeTheCachedConstructionIsReused(bool roofFirst) + { + using (OpenStudioConversionResult result = Box(Library(), AnalyticalModelFixtures.WallConstruction, floor: single, roof: single, roofFirst: roofFirst).ToOpenStudio()) + { + Assert.That(result.Diagnostics.Count(d => d.Code == MAT_FACE), Is.EqualTo(1), string.Join(" | ", result.Diagnostics)); + Assert.That(HasConstruction(Single(result.Model, x => x.outsideBoundaryCondition() == "Ground")), Is.True, "the ground use is supported"); + Assert.That(HasConstruction(Single(result.Model, x => x.surfaceType() == "RoofCeiling")), Is.False, "the outdoor use is refused"); + Assert.That(result.IsValid, Is.False); + } + } + + [Test] + public void ASingleLayerConstructionWithAgreeingFaces_IsWrittenNormally() + { + using (OpenStudioConversionResult result = Box(Library(), singleAgreeing).ToOpenStudio()) + { + Assert.That(result.IsValid, Is.True, string.Join(" | ", result.Diagnostics)); + Assert.That(result.Diagnostics.Any(d => d.Code == MAT_FACE), Is.False); + Assert.That(result.Model.getSurfaces().All(HasConstruction), Is.True); + } + } + + // ---- importer -------------------------------------------------------------------------------------------- + + private static OpaqueMaterial Imported(OpenStudioImportResult result, string fragment) + { + return result.AnalyticalModel.MaterialLibrary.GetMaterials().OfType().Single(x => x.Name.Contains(fragment)); + } + + private static double Value(OpaqueMaterial material, OpaqueMaterialParameter parameter) + { + Assert.That(material.TryGetValue(parameter, out double value), Is.True, material.Name + " " + parameter); + return value; + } + + private static void AssertPlasterboardFaces(OpaqueMaterial material) + { + Assert.That(Value(material, OpaqueMaterialParameter.ExternalEmissivity), Is.EqualTo(0.9).Within(1e-12)); + Assert.That(Value(material, OpaqueMaterialParameter.ExternalSolarReflectance), Is.EqualTo(0.5).Within(1e-12)); + Assert.That(Value(material, OpaqueMaterialParameter.ExternalLightReflectance), Is.EqualTo(0.5).Within(1e-12)); + Assert.That(Value(material, OpaqueMaterialParameter.InternalEmissivity), Is.EqualTo(0.8).Within(1e-12)); + Assert.That(Value(material, OpaqueMaterialParameter.InternalSolarReflectance), Is.EqualTo(0.7).Within(1e-12)); + Assert.That(Value(material, OpaqueMaterialParameter.InternalLightReflectance), Is.EqualTo(0.75).Within(1e-12)); + } + + private static readonly Construction sandwich15 = new Construction(new Guid("55555555-0000-0000-0000-000000000004"), "Sandwich 15", new List + { + new ConstructionLayer("Insulation", 0.1), + new ConstructionLayer("Plasterboard", 0.015), + new ConstructionLayer("Brick", 0.1), + }); + + /// Import warnings about face metadata, edits and merges (SAM-OSI-ID-001 / SAM-OSI-MAT-001). + private static List FaceWarnings(OpenStudioImportResult result) + { + return result.Diagnostics.Where(d => (d.Code == "SAM-OSI-ID-001" || d.Code == "SAM-OSI-MAT-001") && d.Severity == Core.OpenStudio.OpenStudioDiagnosticSeverity.Warning).ToList(); + } + + private static List ImportedAll(OpenStudioImportResult result, string fragment) + { + return result.AnalyticalModel.MaterialLibrary.GetMaterials().OfType().Where(x => x.Name.Contains(fragment)).ToList(); + } + + /// The written opaque objects of source material on face . + private static List FaceObjects(global::OpenStudio.Model model, Guid source, string face) + { + return model.getStandardOpaqueMaterials().Where(x => Feature(x, Core.OpenStudio.OpenStudioIdentityKeys.MaterialGuid) == source.ToString("D") && Feature(x, Core.OpenStudio.OpenStudioIdentityKeys.MaterialFace) == face).ToList(); + } + + private static MaterialLibrary LibraryWithoutPlasterboardLight() + { + MaterialLibrary materialLibrary = Library(); + OpaqueMaterial plasterboard = materialLibrary.GetMaterial("Plasterboard") as OpaqueMaterial; + plasterboard.RemoveValue(OpaqueMaterialParameter.ExternalLightReflectance); + plasterboard.RemoveValue(OpaqueMaterialParameter.InternalLightReflectance); + materialLibrary.Add(plasterboard); + return materialLibrary; + } + + [Test] + public void TheImport_RecoversBothFaces_FromTheInternalVariantAlone() + { + Guid plasterboard = Library().GetMaterial("Plasterboard").Guid; + using (OpenStudioConversionResult conversion = Box(Library(), AnalyticalModelFixtures.WallConstruction).ToOpenStudio()) + { + Assert.That(conversion.Model.getStandardOpaqueMaterials().Where(x => x.nameString().Contains("Plasterboard")).Select(x => x.nameString()), Has.All.Contains("_Internal"), "only the internal variant is referenced"); + OpenStudioImportResult result = conversion.Model.ToSAM(); + OpaqueMaterial material = Imported(result, "Plasterboard"); + AssertPlasterboardFaces(material); + Assert.That(material.Guid, Is.EqualTo(plasterboard), "the source Guid is restored from the explicit identity"); + Assert.That(FaceWarnings(result), Is.Empty); + } + } + + /// + /// Review of 901e592a: face and thickness objects of one SAM material are merged by their explicit source Guid into + /// one SAM material with both faces, the source Guid, and each construction layer's own thickness. + /// + [Test] + public void FaceAndThicknessObjectsOfOneSource_MergeIntoOneSamMaterial_KeepingLayerThicknesses() + { + Guid plasterboard = Library().GetMaterial("Plasterboard").Guid; + using (OpenStudioConversionResult conversion = Box(Library(), AnalyticalModelFixtures.WallConstruction, roof: sandwich15).ToOpenStudio()) + { + Assert.That(conversion.Model.getStandardOpaqueMaterials().Count(x => x.nameString().Contains("Plasterboard")), Is.EqualTo(2), "an internal 12.5 mm object and an external 15 mm object"); + OpenStudioImportResult result = conversion.Model.ToSAM(); + List plasterboards = ImportedAll(result, "Plasterboard"); + Assert.That(plasterboards.Count, Is.EqualTo(1)); + AssertPlasterboardFaces(plasterboards[0]); + Assert.That(plasterboards[0].Guid, Is.EqualTo(plasterboard)); + Assert.That(FaceWarnings(result), Is.Empty, string.Join(" | ", result.Diagnostics)); + + List layers = result.AnalyticalModel.AdjacencyCluster.GetConstructions().SelectMany(x => x.ConstructionLayers).Where(x => x.Name == plasterboards[0].Name).ToList(); + Assert.That(layers.Select(x => Math.Round(x.Thickness, 6)).Distinct().OrderBy(x => x), Is.EqualTo(new[] { 0.0125, 0.015 }), "every construction references the merged material at its own thickness"); + } + } + + [Test] + public void FaceObjectsWithDifferentThermalProperties_AreNotMerged_AndDiagnosed() + { + using (OpenStudioConversionResult conversion = Box(Library(), AnalyticalModelFixtures.WallConstruction, roof: sandwich15).ToOpenStudio()) + { + conversion.Model.getStandardOpaqueMaterials().Single(x => x.nameString().Contains("Plasterboard_15mm")).setDensity(950); + OpenStudioImportResult result = conversion.Model.ToSAM(); + Assert.That(FaceWarnings(result).Count(d => d.Code == "SAM-OSI-ID-001" && d.Message.Contains("are not merged: their thermal properties differ")), Is.EqualTo(1), string.Join(" | ", result.Diagnostics)); + List plasterboards = ImportedAll(result, "Plasterboard"); + Assert.That(plasterboards.Count, Is.EqualTo(2)); + plasterboards.ForEach(AssertPlasterboardFaces); + } + } + + [Test] + public void FaceObjectsWithDifferentAuthoredOptics_AreNotMerged_AndDiagnosed() + { + using (OpenStudioConversionResult conversion = Box(Library(), AnalyticalModelFixtures.WallConstruction, roof: sandwich).ToOpenStudio()) + { + conversion.Model.getStandardOpaqueMaterials().Single(x => x.nameString().Contains("Plasterboard") && !x.nameString().Contains("_Internal")) + .additionalProperties().setFeature(Core.OpenStudio.OpenStudioIdentityKeys.OpticPrefix + "InternalEmissivity", "0.6"); + OpenStudioImportResult result = conversion.Model.ToSAM(); + Assert.That(FaceWarnings(result).Count(d => d.Code == "SAM-OSI-ID-001" && d.Message.Contains("their authored face optics differ")), Is.EqualTo(1), string.Join(" | ", result.Diagnostics)); + Assert.That(ImportedAll(result, "Plasterboard").Count, Is.EqualTo(2)); + } + } + + /// Two external-face objects (12.5 and 15 mm) where only one was edited: one SAM material cannot hold both, so they are not merged. + [Test] + public void FaceObjectsWithConflictingEditsOnOneFace_AreNotMerged_AndDiagnosed() + { + using (OpenStudioConversionResult conversion = Box(Library(), AnalyticalModelFixtures.WallConstruction, roof: sandwich, floor: sandwich15).ToOpenStudio()) + { + Assert.That(conversion.Model.getStandardOpaqueMaterials().Count(x => x.nameString().Contains("Plasterboard")), Is.EqualTo(3)); + conversion.Model.getStandardOpaqueMaterials().Single(x => x.nameString().Contains("Plasterboard_15mm")).setSolarAbsorptance(0.4); + OpenStudioImportResult result = conversion.Model.ToSAM(); + Assert.That(FaceWarnings(result).Count(d => d.Code == "SAM-OSI-ID-001" && d.Message.Contains("ExternalSolarReflectance differs between the external-face objects")), Is.EqualTo(1), string.Join(" | ", result.Diagnostics)); + Assert.That(ImportedAll(result, "Plasterboard").Count, Is.EqualTo(3)); + Assert.That(Value(ImportedAll(result, "Plasterboard_15mm").Single(), OpaqueMaterialParameter.ExternalSolarReflectance), Is.EqualTo(0.6).Within(1e-12), "the edit is kept on its own material"); + } + } + + [Test] + public void AnObjectWithoutSourceIdentity_IsNeverMergedByName() + { + using (OpenStudioConversionResult conversion = Box(Library(), AnalyticalModelFixtures.WallConstruction, roof: sandwich15).ToOpenStudio()) + { + global::OpenStudio.AdditionalProperties additionalProperties = conversion.Model.getStandardOpaqueMaterials().Single(x => x.nameString().Contains("Plasterboard_15mm")).additionalProperties(); + additionalProperties.resetFeature(Core.OpenStudio.OpenStudioIdentityKeys.MaterialFace); + additionalProperties.resetFeature(Core.OpenStudio.OpenStudioIdentityKeys.MaterialGuid); + OpenStudioImportResult result = conversion.Model.ToSAM(); + Assert.That(ImportedAll(result, "Plasterboard").Count, Is.EqualTo(2), "the same name stem is not an identity"); + Assert.That(Value(ImportedAll(result, "Plasterboard_15mm").Single(), OpaqueMaterialParameter.InternalEmissivity), Is.EqualTo(0.9).Within(1e-12), "a third-party object keeps its single value on both faces"); + } + } + + [Test] + public void TheImport_DoesNotInventAFaceValueSamDidNotState() + { + using (OpenStudioConversionResult conversion = Box(LibraryWithoutPlasterboardLight(), AnalyticalModelFixtures.WallConstruction).ToOpenStudio()) + { + OpenStudioImportResult result = conversion.Model.ToSAM(); + OpaqueMaterial material = Imported(result, "Plasterboard"); + Assert.That(material.TryGetValue(OpaqueMaterialParameter.ExternalLightReflectance, out double _), Is.False, "the OpenStudio default is not imported as SAM data"); + Assert.That(material.TryGetValue(OpaqueMaterialParameter.InternalLightReflectance, out double _), Is.False); + Assert.That(Value(material, OpaqueMaterialParameter.InternalEmissivity), Is.EqualTo(0.8).Within(1e-12)); + Assert.That(FaceWarnings(result), Is.Empty); + } + } + + /// + /// Review of 901e592a (reproduction): Plasterboard light reflectance unstated on both faces, exported (OpenStudio + /// default visible absorptance 0.7), then edited natively to 0.42. The reviewed head re-exported 0.7. The edit is + /// now kept on the face the object carries, reported, and survives a re-export. + /// The re-export is read on the single-layer ground floor, whose one layer is the zone face in either layer order + /// (written before revision 11 corrected the multi-layer import order; the multi-layer round trip is covered by + /// ). + /// + [Test] + public void ANativeEditOfAnUnstatedValue_IsKeptAndReported_ThroughImportAndReexport() + { + Guid plasterboard = Library().GetMaterial("Plasterboard").Guid; + using (OpenStudioConversionResult conversion = Box(LibraryWithoutPlasterboardLight(), AnalyticalModelFixtures.WallConstruction, floor: single).ToOpenStudio()) + { + global::OpenStudio.StandardOpaqueMaterial variant = FaceObjects(conversion.Model, plasterboard, "Internal").Single(); + Assert.That(variant.visibleAbsorptance(), Is.EqualTo(0.7).Within(1e-12), "the OpenStudio default was written"); + variant.setVisibleAbsorptance(0.42); + + OpenStudioImportResult result = conversion.Model.ToSAM(); + OpaqueMaterial material = Imported(result, "Plasterboard"); + Assert.That(Value(material, OpaqueMaterialParameter.InternalLightReflectance), Is.EqualTo(0.58).Within(1e-12), "the edit is kept on the zone (internal) face"); + Assert.That(material.TryGetValue(OpaqueMaterialParameter.ExternalLightReflectance, out double _), Is.False, "the other face stays unstated"); + Assert.That(FaceWarnings(result).Count(d => d.Code == "SAM-OSI-MAT-001" && d.Message.Contains("changed after it was written (VisibleAbsorptance written 0.7, now 0.42)") && d.Message.Contains("InternalLightReflectance")), Is.EqualTo(1), string.Join(" | ", result.Diagnostics)); + + using (OpenStudioConversionResult reexport = result.AnalyticalModel.ToOpenStudio()) + { + Assert.That(FaceObjects(reexport.Model, plasterboard, "Internal").Single().visibleAbsorptance(), Is.EqualTo(0.42).Within(1e-12), "the edited value is written again, not the default"); + } + } + } + + /// The unchanged control: an unedited default stays unstated and re-exports as the same default, with no edit reported. + [Test] + public void AnUnchangedDefault_StaysUnstated_ThroughImportAndReexport() + { + Guid plasterboard = Library().GetMaterial("Plasterboard").Guid; + using (OpenStudioConversionResult conversion = Box(LibraryWithoutPlasterboardLight(), AnalyticalModelFixtures.WallConstruction, floor: single).ToOpenStudio()) + { + OpenStudioImportResult result = conversion.Model.ToSAM(); + Assert.That(FaceWarnings(result), Is.Empty); + Assert.That(Imported(result, "Plasterboard").TryGetValue(OpaqueMaterialParameter.InternalLightReflectance, out double _), Is.False); + using (OpenStudioConversionResult reexport = result.AnalyticalModel.ToOpenStudio()) + { + Assert.That(FaceObjects(reexport.Model, plasterboard, "Internal").Single().visibleAbsorptance(), Is.EqualTo(0.7).Within(1e-12)); + } + } + } + + /// An edit of a stated value is kept on the face the object carries; the other face keeps its authored value. + [Test] + public void AnEditOfAStatedValue_IsKeptOnItsFace_AndReported() + { + using (OpenStudioConversionResult conversion = Box(Library(), AnalyticalModelFixtures.WallConstruction).ToOpenStudio()) + { + conversion.Model.getStandardOpaqueMaterials().Single(x => x.nameString().Contains("_Internal")).setSolarAbsorptance(0.45); + OpenStudioImportResult result = conversion.Model.ToSAM(); + Assert.That(FaceWarnings(result).Count(d => d.Code == "SAM-OSI-MAT-001" && d.Message.Contains("changed after it was written (SolarAbsorptance written 0.3") && d.Message.Contains(", now 0.45)")), Is.EqualTo(1), string.Join(" | ", result.Diagnostics)); + OpaqueMaterial material = Imported(result, "Plasterboard"); + Assert.That(Value(material, OpaqueMaterialParameter.InternalSolarReflectance), Is.EqualTo(0.55).Within(1e-12)); + Assert.That(Value(material, OpaqueMaterialParameter.ExternalSolarReflectance), Is.EqualTo(0.5).Within(1e-12), "the external face keeps its authored value"); + } + } + + [Test] + public void AFaceObjectWhoseIdentityDisagrees_IsDiagnosed() + { + using (OpenStudioConversionResult conversion = Box(Library(), AnalyticalModelFixtures.WallConstruction).ToOpenStudio()) + { + global::OpenStudio.StandardOpaqueMaterial variant = conversion.Model.getStandardOpaqueMaterials().Single(x => x.nameString().Contains("_Internal")); + Assert.That(Core.OpenStudio.Query.TryGetSAMGuid(variant, out Guid _), Is.True, "the variant is the material's registered object here"); + variant.additionalProperties().setFeature(Core.OpenStudio.OpenStudioIdentityKeys.MaterialGuid, Guid.NewGuid().ToString("D")); + OpenStudioImportResult result = conversion.Model.ToSAM(); + Assert.That(FaceWarnings(result).Any(d => d.Code == "SAM-OSI-ID-001" && d.Message.Contains("disagree")), Is.True, string.Join(" | ", result.Diagnostics)); + } + } + + [Test] + public void AnObjectWithoutFaceMetadata_KeepsItsSingleValueOnBothFaces() + { + using (OpenStudioConversionResult conversion = Box(Library(), AnalyticalModelFixtures.WallConstruction).ToOpenStudio()) + { + conversion.Model.getStandardOpaqueMaterials().Single(x => x.nameString().Contains("_Internal")).additionalProperties().resetFeature(Core.OpenStudio.OpenStudioIdentityKeys.MaterialFace); + OpenStudioImportResult result = conversion.Model.ToSAM(); + OpaqueMaterial material = Imported(result, "Plasterboard"); + Assert.That(Value(material, OpaqueMaterialParameter.ExternalEmissivity), Is.EqualTo(0.8).Within(1e-12)); + Assert.That(Value(material, OpaqueMaterialParameter.InternalEmissivity), Is.EqualTo(0.8).Within(1e-12)); + Assert.That(FaceWarnings(result), Is.Empty, "absent metadata (a third-party object) is not a diagnostic"); + } + } + + // ---- inherited zone-face values (review of 901e592a) -------------------------------------------------------- + + /// + /// An Internal* value SAM does not state, absent or NaN, on a zone face takes the external value: reported once at + /// Summary (SAM-OS-MAT-004), never stamped as authored, and imported back as unstated. + /// + [TestCase("absent")] + [TestCase("nan")] + public void AnUnstatedInternalValue_IsReportedAtSummary_AndKeepsItsUnspecifiedProvenance(string what) + { + MaterialLibrary materialLibrary = Library(); + OpaqueMaterial plasterboard = materialLibrary.GetMaterial("Plasterboard") as OpaqueMaterial; + if (what == "nan") + { + plasterboard.SetValue(OpaqueMaterialParameter.InternalLightReflectance, double.NaN); + } + else + { + plasterboard.RemoveValue(OpaqueMaterialParameter.InternalLightReflectance); + } + + materialLibrary.Add(plasterboard); + using (OpenStudioConversionResult conversion = Box(materialLibrary, AnalyticalModelFixtures.WallConstruction).ToOpenStudio()) + { + List notes = conversion.Diagnostics.Where(d => d.Code == "SAM-OS-MAT-004").ToList(); + Assert.That(notes.Count, Is.EqualTo(1), string.Join(" | ", conversion.Diagnostics)); + Assert.That(notes[0].Severity, Is.EqualTo(Core.OpenStudio.OpenStudioDiagnosticSeverity.Information)); + Assert.That(Core.OpenStudio.Query.GetDiagnosticDetail(notes[0]), Is.EqualTo(DiagnosticDetail.Summary)); + Assert.That(notes[0].Message, Does.StartWith("Zone face: InternalLightReflectance not stated")); + Assert.That(notes[0].SamGuid, Is.EqualTo(plasterboard.Guid)); + + global::OpenStudio.StandardOpaqueMaterial variant = FaceObjects(conversion.Model, plasterboard.Guid, "Internal").Single(); + Assert.That(variant.visibleAbsorptance(), Is.EqualTo(0.5).Within(1e-12), "the external light reflectance 0.5 is written on the zone face"); + Assert.That(Feature(variant, Core.OpenStudio.OpenStudioIdentityKeys.OpticPrefix + "InternalLightReflectance"), Is.Null, "an inherited value is not stamped as authored"); + + OpenStudioImportResult result = conversion.Model.ToSAM(); + OpaqueMaterial material = Imported(result, "Plasterboard"); + Assert.That(material.TryGetValue(OpaqueMaterialParameter.InternalLightReflectance, out double imported) && !double.IsNaN(imported), Is.False, "the internal value comes back unstated"); + Assert.That(Value(material, OpaqueMaterialParameter.ExternalLightReflectance), Is.EqualTo(0.5).Within(1e-12)); + Assert.That(FaceWarnings(result), Is.Empty); + } + } + + /// The unchanged control: every zone-face internal value stated, so nothing is inherited or reported. + [Test] + public void StatedInternalValues_RaiseNoInheritanceNote() + { + using (OpenStudioConversionResult conversion = Box(Library(), AnalyticalModelFixtures.WallConstruction).ToOpenStudio()) + { + Assert.That(conversion.Diagnostics.Any(d => d.Code == "SAM-OS-MAT-004"), Is.False, string.Join(" | ", conversion.Diagnostics.Where(d => d.Code == "SAM-OS-MAT-004"))); + } + } + + [Test] + public void EveryOpaqueObject_RecordsWhatWasWritten() + { + using (OpenStudioConversionResult conversion = Box(LibraryWithoutPlasterboardLight(), AnalyticalModelFixtures.WallConstruction, roof: sandwich15).ToOpenStudio()) + { + foreach (global::OpenStudio.StandardOpaqueMaterial material in conversion.Model.getStandardOpaqueMaterials()) + { + Assert.That(double.Parse(Feature(material, Core.OpenStudio.OpenStudioIdentityKeys.WrittenPrefix + "ThermalAbsorptance"), System.Globalization.CultureInfo.InvariantCulture), Is.EqualTo(material.thermalAbsorptance()), material.nameString()); + Assert.That(double.Parse(Feature(material, Core.OpenStudio.OpenStudioIdentityKeys.WrittenPrefix + "SolarAbsorptance"), System.Globalization.CultureInfo.InvariantCulture), Is.EqualTo(material.solarAbsorptance()), material.nameString()); + Assert.That(double.Parse(Feature(material, Core.OpenStudio.OpenStudioIdentityKeys.WrittenPrefix + "VisibleAbsorptance"), System.Globalization.CultureInfo.InvariantCulture), Is.EqualTo(material.visibleAbsorptance()), material.nameString()); + } + } + } + + // ---- group membership (review of 354e5322, finding 1) ------------------------------------------------------- + + private const string thirdName = "ReviewerMalformedThirdFace"; + + /// + /// Adds a third StandardOpaqueMaterial carrying the source Guid of and a copy of its face + /// metadata and absorptances, but its own thermal properties (9 W/mK, 1000 kg/m³, 1200 J/kgK, 20 mm), then applies + /// : "face" (malformed face), "identity" (SAM.Guid names another material), "optic" (a + /// stamped optic is not a fraction), "written" (a written record disagrees with the authored face) or "thermal" + /// (well-formed metadata, only the thermal properties differ). + /// + private static global::OpenStudio.StandardOpaqueMaterial AddThird(global::OpenStudio.Model model, global::OpenStudio.StandardOpaqueMaterial template, string defect) + { + global::OpenStudio.StandardOpaqueMaterial result = new global::OpenStudio.StandardOpaqueMaterial(model); + result.setName(thirdName); + result.setThermalConductivity(9.0); + result.setDensity(1000); + result.setSpecificHeat(1200); + result.setThickness(0.02); + result.setThermalAbsorptance(template.thermalAbsorptance()); + result.setSolarAbsorptance(template.solarAbsorptance()); + result.setVisibleAbsorptance(template.visibleAbsorptance()); + + List keys = new List { Core.OpenStudio.OpenStudioIdentityKeys.MaterialGuid, Core.OpenStudio.OpenStudioIdentityKeys.MaterialFace }; + keys.AddRange(new[] { "ExternalEmissivity", "InternalEmissivity", "ExternalSolarReflectance", "InternalSolarReflectance", "ExternalLightReflectance", "InternalLightReflectance" }.Select(x => Core.OpenStudio.OpenStudioIdentityKeys.OpticPrefix + x)); + keys.AddRange(new[] { "ThermalAbsorptance", "SolarAbsorptance", "VisibleAbsorptance" }.Select(x => Core.OpenStudio.OpenStudioIdentityKeys.WrittenPrefix + x)); + foreach (string key in keys) + { + string value = Feature(template, key); + if (value != null) + { + result.additionalProperties().setFeature(key, value); + } + } + + switch (defect) + { + case "face": + result.additionalProperties().setFeature(Core.OpenStudio.OpenStudioIdentityKeys.MaterialFace, "BROKEN"); + break; + case "identity": + result.additionalProperties().setFeature(Core.OpenStudio.OpenStudioIdentityKeys.Guid, Guid.NewGuid().ToString("D")); + break; + case "optic": + result.additionalProperties().setFeature(Core.OpenStudio.OpenStudioIdentityKeys.OpticPrefix + "ExternalEmissivity", "1.7"); + break; + case "written": + result.additionalProperties().setFeature(Core.OpenStudio.OpenStudioIdentityKeys.WrittenPrefix + "ThermalAbsorptance", "0.123"); + break; + } + + return result; + } + + private static void AssertOwnThermalProperties(OpaqueMaterial material) + { + Assert.That(material.Name, Is.EqualTo(thirdName)); + Assert.That(material.ThermalConductivity, Is.EqualTo(9.0).Within(1e-12), "the object's own conductivity, not the group's 0.25"); + Assert.That(material.Density, Is.EqualTo(1000).Within(1e-9)); + Assert.That(material.SpecificHeatCapacity, Is.EqualTo(1200).Within(1e-9)); + } + + /// + /// Review of 354e5322 (reproduction): a third object carrying the source Guid of a valid two-object Plasterboard group + /// but untrustworthy face metadata was aliased to the group (conductivity 0.25 instead of 9, no diagnostic). Each + /// object is now validated before any group result is returned: the malformed one is imported as its own material, + /// keeping its own physical properties, and named in a diagnostic; the valid pair still merges. Both import orders. + /// + [TestCase("face", false)] + [TestCase("face", true)] + [TestCase("identity", false)] + [TestCase("identity", true)] + [TestCase("optic", false)] + [TestCase("optic", true)] + [TestCase("written", false)] + [TestCase("written", true)] + public void AMalformedObjectOfAMergedSource_IsImportedOnItsOwn_NeverAliasedToTheGroup(string defect, bool malformedFirst) + { + using (OpenStudioConversionResult conversion = Box(Library(), AnalyticalModelFixtures.WallConstruction, roof: sandwich15).ToOpenStudio()) + { + List valid = conversion.Model.getStandardOpaqueMaterials().Where(x => x.nameString().Contains("Plasterboard")).ToList(); + Assert.That(valid.Count, Is.EqualTo(2)); + global::OpenStudio.StandardOpaqueMaterial third = AddThird(conversion.Model, valid.Single(x => !x.nameString().Contains("_Internal")), defect); + + OpenStudioImportContext context = new OpenStudioImportContext(conversion.Model); + List order = malformedFirst ? new[] { third }.Concat(valid).ToList() : valid.Concat(new[] { third }).ToList(); + Dictionary imported = order.ToDictionary(x => x.nameString(), x => ((global::OpenStudio.Material)x).ToSAM(context)); + + AssertOwnThermalProperties((OpaqueMaterial)imported[thirdName]); + Assert.That(context.Diagnostics.Count(d => d.Code == "SAM-OSI-ID-001" || d.Code == "SAM-OSI-MAT-001"), Is.EqualTo(1), string.Join(" | ", context.Diagnostics)); + Core.OpenStudio.OpenStudioDiagnostic diagnostic = context.Diagnostics.Single(d => d.Code == "SAM-OSI-ID-001" || d.Code == "SAM-OSI-MAT-001"); + Assert.That(diagnostic.OpenStudioObjectName, Does.StartWith(thirdName + " ["), "the diagnostic names the malformed object"); + Assert.That(diagnostic.Message, Does.Contain("imported as its own material, never merged")); + + IMaterial merged = imported[valid[0].nameString()]; + Assert.That(imported[valid[1].nameString()], Is.SameAs(merged), "the valid pair still merges"); + Assert.That(merged, Is.Not.SameAs(imported[thirdName])); + Assert.That(((OpaqueMaterial)merged).ThermalConductivity, Is.EqualTo(0.25).Within(1e-12)); + AssertPlasterboardFaces((OpaqueMaterial)merged); + } + } + + /// + /// The whole-model import of the same reproduction, with the malformed object used as the floor's single layer: the + /// library holds the merged Plasterboard and the malformed object as its own material. + /// + [TestCase("face")] + [TestCase("identity")] + public void AMalformedObjectOfAMergedSource_KeepsItsOwnProperties_InAWholeModelImport(string defect) + { + using (OpenStudioConversionResult conversion = Box(Library(), AnalyticalModelFixtures.WallConstruction, roof: sandwich15).ToOpenStudio()) + { + global::OpenStudio.StandardOpaqueMaterial third = AddThird(conversion.Model, conversion.Model.getStandardOpaqueMaterials().Single(x => x.nameString().Contains("Plasterboard_15mm")), defect); + global::OpenStudio.Construction construction = new global::OpenStudio.Construction(conversion.Model); + construction.setName("Reviewer Third Floor"); + global::OpenStudio.MaterialVector materialVector = new global::OpenStudio.MaterialVector(); + materialVector.Add(third); + Assert.That(construction.setLayers(materialVector), Is.True); + Assert.That(conversion.Model.getSurfaces().Single(x => x.surfaceType() == "Floor").setConstruction(construction), Is.True); + + OpenStudioImportResult result = conversion.Model.ToSAM(); + AssertOwnThermalProperties(ImportedAll(result, thirdName).Single()); + Assert.That(ImportedAll(result, "Plasterboard").Count, Is.EqualTo(1), "the valid pair still merges"); + AssertPlasterboardFaces(ImportedAll(result, "Plasterboard").Single()); + Assert.That(FaceWarnings(result).Count(d => d.OpenStudioObjectName != null && d.OpenStudioObjectName.StartsWith(thirdName + " [", StringComparison.Ordinal)), Is.EqualTo(1), string.Join(" | ", result.Diagnostics)); + } + } + + /// + /// The inconsistent-member control: a third object with well-formed metadata whose thermal properties differ is a + /// conflict of the whole group, so no object is merged, each keeps its own properties, and the conflict is reported once. + /// + [TestCase(false)] + [TestCase(true)] + public void AConsistentlyStampedObjectWithOtherThermalProperties_StopsTheMerge(bool thirdFirst) + { + using (OpenStudioConversionResult conversion = Box(Library(), AnalyticalModelFixtures.WallConstruction, roof: sandwich15).ToOpenStudio()) + { + List valid = conversion.Model.getStandardOpaqueMaterials().Where(x => x.nameString().Contains("Plasterboard")).ToList(); + global::OpenStudio.StandardOpaqueMaterial third = AddThird(conversion.Model, valid.Single(x => !x.nameString().Contains("_Internal")), "thermal"); + + OpenStudioImportContext context = new OpenStudioImportContext(conversion.Model); + List order = thirdFirst ? new[] { third }.Concat(valid).ToList() : valid.Concat(new[] { third }).ToList(); + List imported = order.Select(x => ((global::OpenStudio.Material)x).ToSAM(context)).ToList(); + + Assert.That(imported.Distinct().Count(), Is.EqualTo(3), "nothing is merged"); + AssertOwnThermalProperties((OpaqueMaterial)imported[order.IndexOf(third)]); + Assert.That(context.Diagnostics.Count(d => d.Code == "SAM-OSI-ID-001" && d.Message.Contains("their thermal properties differ") && d.Message.Contains(thirdName)), Is.EqualTo(1), string.Join(" | ", context.Diagnostics)); + } + } + + /// The unchanged control: the valid two-object group, imported object by object in either order, merges with no diagnostic. + [TestCase(false)] + [TestCase(true)] + public void TheValidPair_MergesInEitherImportOrder(bool reversed) + { + using (OpenStudioConversionResult conversion = Box(Library(), AnalyticalModelFixtures.WallConstruction, roof: sandwich15).ToOpenStudio()) + { + List valid = conversion.Model.getStandardOpaqueMaterials().Where(x => x.nameString().Contains("Plasterboard")).ToList(); + if (reversed) + { + valid.Reverse(); + } + + OpenStudioImportContext context = new OpenStudioImportContext(conversion.Model); + List imported = valid.Select(x => ((global::OpenStudio.Material)x).ToSAM(context)).ToList(); + Assert.That(imported[1], Is.SameAs(imported[0])); + AssertPlasterboardFaces((OpaqueMaterial)imported[0]); + Assert.That(context.Diagnostics.Where(d => d.Severity == Core.OpenStudio.OpenStudioDiagnosticSeverity.Warning), Is.Empty, string.Join(" | ", context.Diagnostics)); + } + } + + // ---- shared equal-face objects (review of 354e5322, finding 2) ---------------------------------------------- + + /// A library whose states equal internal and external optics: ε 0.8, ρs 0.4, ρv 0.4 (absorptances 0.8 / 0.6 / 0.6). + private static MaterialLibrary LibraryWithEqualFaces(string name) + { + MaterialLibrary materialLibrary = Library(); + OpaqueMaterial material = materialLibrary.GetMaterial(name) as OpaqueMaterial; + foreach (OpaqueMaterialParameter opaqueMaterialParameter in new[] { OpaqueMaterialParameter.InternalEmissivity, OpaqueMaterialParameter.ExternalEmissivity }) + { + material.SetValue(opaqueMaterialParameter, 0.8); + } + + foreach (OpaqueMaterialParameter opaqueMaterialParameter in new[] { OpaqueMaterialParameter.InternalSolarReflectance, OpaqueMaterialParameter.ExternalSolarReflectance, OpaqueMaterialParameter.InternalLightReflectance, OpaqueMaterialParameter.ExternalLightReflectance }) + { + material.SetValue(opaqueMaterialParameter, 0.4); + } + + materialLibrary.Add(material); + return materialLibrary; + } + + /// + /// Review of 354e5322 (reproduction): a single-layer construction of an equal-face material shares one external-face + /// object for both faces. Its native edit (visible absorptance 0.6 → 0.42) was kept on the external face only, which + /// invented differing faces and made the re-export a SAM-OS-MAT-003 error on five outdoor surfaces. The edit is now + /// kept on both faces the object supplies, so the faces still agree and the re-export is valid with the edited value. + /// + [Test] + public void AnEditOfASharedEqualFaceSingleLayerObject_IsKeptOnBothFaces_AndReexportsValid() + { + using (OpenStudioConversionResult conversion = Box(LibraryWithEqualFaces("Insulation"), singleAgreeing).ToOpenStudio()) + { + Assert.That(conversion.IsValid, Is.True, string.Join(" | ", conversion.Diagnostics)); + global::OpenStudio.StandardOpaqueMaterial native = conversion.Model.getStandardOpaqueMaterials().Single(); + Assert.That(native.visibleAbsorptance(), Is.EqualTo(0.6).Within(1e-12)); + native.setVisibleAbsorptance(0.42); + + OpenStudioImportResult result = conversion.Model.ToSAM(); + OpaqueMaterial material = Imported(result, "Insulation"); + Assert.That(Value(material, OpaqueMaterialParameter.InternalLightReflectance), Is.EqualTo(0.58).Within(1e-12)); + Assert.That(Value(material, OpaqueMaterialParameter.ExternalLightReflectance), Is.EqualTo(0.58).Within(1e-12)); + Assert.That(Value(material, OpaqueMaterialParameter.InternalSolarReflectance), Is.EqualTo(0.4).Within(1e-12), "unedited values stay authored"); + Assert.That(Value(material, OpaqueMaterialParameter.ExternalSolarReflectance), Is.EqualTo(0.4).Within(1e-12)); + List notes = FaceWarnings(result).Where(d => d.Message.Contains("changed after it was written (VisibleAbsorptance written 0.6, now 0.42; its material's faces agree and this shared object supplies the zone face and the outer face)")).ToList(); + Assert.That(notes.Select(d => d.Message.Contains("InternalLightReflectance") ? "Internal" : "External").OrderBy(x => x), Is.EqualTo(new[] { "External", "Internal" }), string.Join(" | ", result.Diagnostics)); + + using (OpenStudioConversionResult reexport = result.AnalyticalModel.ToOpenStudio()) + { + Assert.That(reexport.IsValid, Is.True, string.Join(" | ", reexport.Diagnostics.Where(d => d.Code == MAT_FACE))); + Assert.That(reexport.Diagnostics.Any(d => d.Code == MAT_FACE), Is.False); + Assert.That(reexport.Model.getStandardOpaqueMaterials().Single().visibleAbsorptance(), Is.EqualTo(0.42).Within(1e-12), "the edited value is written again on the one shared object"); + } + } + } + + /// The unchanged control of the single-layer reproduction: no edit, no warning, equal faces and a valid re-export with the authored value. + [Test] + public void AnUnchangedSharedEqualFaceSingleLayerObject_KeepsItsAuthoredFaces_AndReexportsValid() + { + using (OpenStudioConversionResult conversion = Box(LibraryWithEqualFaces("Insulation"), singleAgreeing).ToOpenStudio()) + { + OpenStudioImportResult result = conversion.Model.ToSAM(); + OpaqueMaterial material = Imported(result, "Insulation"); + Assert.That(FaceWarnings(result), Is.Empty, string.Join(" | ", result.Diagnostics)); + Assert.That(Value(material, OpaqueMaterialParameter.InternalLightReflectance), Is.EqualTo(0.4).Within(1e-12)); + Assert.That(Value(material, OpaqueMaterialParameter.ExternalLightReflectance), Is.EqualTo(0.4).Within(1e-12)); + using (OpenStudioConversionResult reexport = result.AnalyticalModel.ToOpenStudio()) + { + Assert.That(reexport.IsValid, Is.True, string.Join(" | ", reexport.Diagnostics)); + Assert.That(reexport.Model.getStandardOpaqueMaterials().Single().visibleAbsorptance(), Is.EqualTo(0.6).Within(1e-12)); + } + } + } + + /// + /// An interzone single-layer construction of an equal-face material: the forward and reverse constructions share the + /// one object, which supplies both zone faces; the edit is kept on both SAM faces and the re-export stays valid. + /// + [TestCase(false)] + [TestCase(true)] + public void AnEditOfASharedEqualFaceInterzoneSingleLayerObject_IsKeptOnBothFaces(bool bFirst) + { + using (OpenStudioConversionResult conversion = TwoBoxes(LibraryWithEqualFaces("Insulation"), singleAgreeing, bFirst).ToOpenStudio()) + { + Assert.That(conversion.IsValid, Is.True, string.Join(" | ", conversion.Diagnostics)); + global::OpenStudio.StandardOpaqueMaterial native = conversion.Model.getStandardOpaqueMaterials().Single(x => x.nameString().Contains("Insulation")); + native.setSolarAbsorptance(0.45); + + OpenStudioImportResult result = conversion.Model.ToSAM(); + OpaqueMaterial material = Imported(result, "Insulation"); + Assert.That(Value(material, OpaqueMaterialParameter.InternalSolarReflectance), Is.EqualTo(0.55).Within(1e-12)); + Assert.That(Value(material, OpaqueMaterialParameter.ExternalSolarReflectance), Is.EqualTo(0.55).Within(1e-12)); + using (OpenStudioConversionResult reexport = result.AnalyticalModel.ToOpenStudio()) + { + Assert.That(reexport.Diagnostics.Any(d => d.Code == MAT_FACE), Is.False, string.Join(" | ", reexport.Diagnostics.Where(d => d.Code == MAT_FACE))); + } + } + } + + /// + /// Multi-layer controls (import only; the multi-layer re-export is covered by + /// since revision 11). An equal-face object supplies only the faces its layer position exposes: the + /// zone-face layer's edit is kept on its internal face, the outer layer's on its external face, and the other face + /// keeps its authored value. A middle layer supplies no exposed face, so its edit is kept on both faces. + /// + [TestCase("Plasterboard", true, false)] + [TestCase("Brick", false, true)] + [TestCase("Insulation", true, true)] + public void AnEditOfASharedEqualFaceMultiLayerObject_IsKeptOnTheFacesItsPositionExposes(string name, bool internalEdited, bool externalEdited) + { + MaterialLibrary materialLibrary = LibraryWithEqualFaces(name); + Guid source = materialLibrary.GetMaterial(name).Guid; + using (OpenStudioConversionResult conversion = Box(materialLibrary, AnalyticalModelFixtures.WallConstruction).ToOpenStudio()) + { + FaceObjects(conversion.Model, source, "External").Single().setVisibleAbsorptance(0.42); + OpenStudioImportResult result = conversion.Model.ToSAM(); + OpaqueMaterial material = Imported(result, name); + Assert.That(Value(material, OpaqueMaterialParameter.InternalLightReflectance), Is.EqualTo(internalEdited ? 0.58 : 0.4).Within(1e-12), "internal face"); + Assert.That(Value(material, OpaqueMaterialParameter.ExternalLightReflectance), Is.EqualTo(externalEdited ? 0.58 : 0.4).Within(1e-12), "external face"); + Assert.That(FaceWarnings(result).Count(d => d.Message.Contains("VisibleAbsorptance written 0.6, now 0.42")), Is.EqualTo((internalEdited ? 1 : 0) + (externalEdited ? 1 : 0)), string.Join(" | ", result.Diagnostics)); + } + } + + /// An interzone multi-layer construction: the reverse construction mirrors the forward one, so the zone-face layer of the first space still supplies only its internal face. + [Test] + public void AnEditOfASharedEqualFaceInterzoneMultiLayerObject_IsKeptOnItsFirstSpaceFace() + { + MaterialLibrary materialLibrary = LibraryWithEqualFaces("Insulation"); + Guid source = materialLibrary.GetMaterial("Insulation").Guid; + using (OpenStudioConversionResult conversion = TwoBoxes(materialLibrary, sandwich).ToOpenStudio()) + { + List objects = FaceObjects(conversion.Model, source, "External").Where(x => x.nameString().Contains("100mm")).ToList(); + Assert.That(objects.Count, Is.EqualTo(1), "one shared object for both directions and the fixture walls"); + objects[0].setVisibleAbsorptance(0.42); + OpenStudioImportResult result = conversion.Model.ToSAM(); + OpaqueMaterial material = Imported(result, "Insulation"); + Assert.That(Value(material, OpaqueMaterialParameter.InternalLightReflectance), Is.EqualTo(0.58).Within(1e-12)); + Assert.That(Value(material, OpaqueMaterialParameter.ExternalLightReflectance), Is.EqualTo(0.4).Within(1e-12), "Insulation's other face is inside the fixture walls and the sandwich"); + } + } + + /// + /// The asymmetry control: a material whose authored faces differ keeps distinct variants, and an edit of its + /// external-face object stays on the external face only (the internal variant supplies the zone face). + /// + [Test] + public void AnEditOfADivergentMaterialsExternalObject_StaysOnTheExternalFace() + { + Guid brick = Library().GetMaterial("Brick").Guid; + using (OpenStudioConversionResult conversion = Box(Library(), AnalyticalModelFixtures.WallConstruction).ToOpenStudio()) + { + FaceObjects(conversion.Model, brick, "External").Single().setVisibleAbsorptance(0.42); + OpenStudioImportResult result = conversion.Model.ToSAM(); + OpaqueMaterial material = Imported(result, "Brick"); + Assert.That(Value(material, OpaqueMaterialParameter.ExternalLightReflectance), Is.EqualTo(0.58).Within(1e-12)); + Assert.That(Value(material, OpaqueMaterialParameter.InternalLightReflectance), Is.EqualTo(0.6).Within(1e-12), "the authored internal face is kept"); + Assert.That(FaceWarnings(result).Count(d => d.Message.Contains("VisibleAbsorptance written 0.7, now 0.42)")), Is.EqualTo(1), string.Join(" | ", result.Diagnostics)); + } + } + } +} diff --git a/tests/SAM.Analytical.OpenStudio.Tests/M4/OpaqueLayerOrderImportTests.cs b/tests/SAM.Analytical.OpenStudio.Tests/M4/OpaqueLayerOrderImportTests.cs new file mode 100644 index 0000000..4dbc80b --- /dev/null +++ b/tests/SAM.Analytical.OpenStudio.Tests/M4/OpaqueLayerOrderImportTests.cs @@ -0,0 +1,973 @@ +// SPDX-License-Identifier: LGPL-3.0-or-later +// Copyright (c) 2020–2026 Michal Dengusiak & Jakub Ziolkowski and contributors + +using NUnit.Framework; +using SAM.Core; +using System; +using System.Collections.Generic; +using System.Globalization; +using System.Linq; + +namespace SAM.Analytical.OpenStudio.Tests +{ + /// + /// Opaque multi-layer layer order on import (SAM_OpenStudio#33 revision 11). OpenStudio stores layers outside first and + /// SAM inside → outside from the panel's first space, so an opaque layered construction used by a planar surface is + /// read innermost layer first, and an interzone panel is built from (and first related to) the side carrying the + /// SAM-written forward construction. Export → import → export must keep every surface's layers, thicknesses, thermal + /// properties and the absorptances of the two faces EnergyPlus uses. Fenestration, opaque door panes, shading, air + /// boundaries and non-layered constructions keep OpenStudio's order. + /// + [TestFixture] + public class OpaqueLayerOrderImportTests + { + private static readonly CultureInfo ci = CultureInfo.InvariantCulture; + + // SAM inside → outside: Insulation faces the first space, Brick the second (or outdoors). + private static readonly Construction sandwich = new Construction(new Guid("66666666-0000-0000-0000-000000000003"), "Order Sandwich", new List + { + new ConstructionLayer("Insulation", 0.1), + new ConstructionLayer("Plasterboard", 0.0125), + new ConstructionLayer("Brick", 0.1), + }); + + // ---- physical signature ------------------------------------------------------------------------------------ + + private static string N(double value, int digits) + { + return (Math.Round(value, digits) + 0.0).ToString("R", ci); + } + + private static string Layer(global::OpenStudio.Material material) + { + global::OpenStudio.OptionalStandardOpaqueMaterial optional = material.to_StandardOpaqueMaterial(); + if (optional.isNull()) + { + return material.iddObjectType().valueName() + ":" + N(material.thickness(), 9); + } + + global::OpenStudio.StandardOpaqueMaterial standard = optional.get(); + return string.Join(":", N(standard.thickness(), 9), N(standard.thermalConductivity(), 9), N(standard.density(), 6), N(standard.specificHeat(), 6)); + } + + private static string Face(global::OpenStudio.Material material) + { + global::OpenStudio.OptionalStandardOpaqueMaterial optional = material.to_StandardOpaqueMaterial(); + if (optional.isNull()) + { + return "-"; + } + + global::OpenStudio.StandardOpaqueMaterial standard = optional.get(); + return string.Join("/", N(standard.thermalAbsorptance(), 9), N(standard.solarAbsorptance(), 9), N(standard.visibleAbsorptance(), 9)); + } + + /// + /// Per surface (keyed by its absolute centroid, outward normal, type, boundary and area, so the two sides of a + /// shared wall are told apart by their normals): its layers' thickness and thermal properties outside first, and + /// the absorptances of its outside face (first layer) and zone face (last layer). Names are deliberately not + /// compared: an unstamped import renames spaces and materials. + /// + internal static List Signatures(global::OpenStudio.Model model) + { + List result = new List(); + foreach (global::OpenStudio.Surface surface in model.getSurfaces()) + { + global::OpenStudio.Vector3d normal = surface.outwardNormal(); + global::OpenStudio.Space space = surface.space().get(); + List vertices = surface.vertices().ToList(); + string centroid = string.Join(",", N(space.xOrigin() + vertices.Average(x => x.x()), 4), N(space.yOrigin() + vertices.Average(x => x.y()), 4), N(space.zOrigin() + vertices.Average(x => x.z()), 4)); + string key = string.Join("|", centroid, N(normal.x(), 6), N(normal.y(), 6), N(normal.z(), 6), surface.surfaceType(), surface.outsideBoundaryCondition(), N(surface.grossArea(), 6)); + global::OpenStudio.OptionalConstructionBase optionalConstructionBase = surface.construction(); + if (optionalConstructionBase.isNull()) + { + result.Add(key + " none"); + continue; + } + + global::OpenStudio.OptionalConstruction optionalConstruction = optionalConstructionBase.get().to_Construction(); + if (optionalConstruction.isNull()) + { + result.Add(key + " " + optionalConstructionBase.get().iddObjectType().valueName()); + continue; + } + + List layers = optionalConstruction.get().layers().ToList(); + result.Add(key + " layers=" + string.Join(";", layers.Select(Layer)) + " outside=" + Face(layers.First()) + " zone=" + Face(layers.Last())); + } + + result.Sort(StringComparer.Ordinal); + return result; + } + + private static void AssertSameSignatures(List before, List after) + { + Assert.That(after.Count, Is.EqualTo(before.Count), "surface count"); + List differences = before.Zip(after, (b, a) => b == a ? null : "before: " + b + "\n after: " + a).Where(x => x != null).ToList(); + Assert.That(differences, Is.Empty, string.Join("\n", differences)); + } + + private static List LayerNames(Construction construction) + { + return construction.ConstructionLayers.Select(x => x.Name).ToList(); + } + + private static void AssertLayers(Construction construction, params (string Fragment, double Thickness)[] expected) + { + List layers = construction.ConstructionLayers; + Assert.That(layers.Count, Is.EqualTo(expected.Length), string.Join(", ", LayerNames(construction))); + for (int i = 0; i < expected.Length; i++) + { + Assert.That(layers[i].Name, Does.Contain(expected[i].Fragment), "layer " + i + ": " + string.Join(", ", LayerNames(construction))); + Assert.That(layers[i].Thickness, Is.EqualTo(expected[i].Thickness).Within(1e-9), "layer " + i + " thickness"); + } + } + + private static MaterialLibrary LibraryWithoutPlasterboardLight() + { + MaterialLibrary materialLibrary = OpaqueFaceOpticsTests.Library(); + OpaqueMaterial plasterboard = materialLibrary.GetMaterial("Plasterboard") as OpaqueMaterial; + plasterboard.RemoveValue(OpaqueMaterialParameter.ExternalLightReflectance); + plasterboard.RemoveValue(OpaqueMaterialParameter.InternalLightReflectance); + materialLibrary.Add(plasterboard); + return materialLibrary; + } + + private static global::OpenStudio.Surface OutdoorWall(global::OpenStudio.Model model) + { + return model.getSurfaces().Where(x => x.surfaceType() == "Wall" && x.outsideBoundaryCondition() == "Outdoors").OrderBy(x => x.nameString(), StringComparer.Ordinal).First(); + } + + private static List Layers(global::OpenStudio.Surface surface) + { + return surface.construction().get().to_Construction().get().layers().Select(x => x.to_StandardOpaqueMaterial().get()).ToList(); + } + + private static Panel SharedPanel(AnalyticalModel analyticalModel) + { + AdjacencyCluster adjacencyCluster = analyticalModel.AdjacencyCluster; + return adjacencyCluster.GetPanels().Single(x => adjacencyCluster.GetSpaces(x)?.Count == 2); + } + + private static void StripSamMetadata(global::OpenStudio.Model model) + { + foreach (global::OpenStudio.ModelObject modelObject in model.modelObjects().ToList()) + { + if (modelObject.iddObjectType().valueName() != "OS_AdditionalProperties" && modelObject.hasAdditionalProperties()) + { + modelObject.additionalProperties().remove(); + } + } + + Assert.That(model.modelObjects().Count(x => x.iddObjectType().valueName() == "OS_AdditionalProperties"), Is.EqualTo(0)); + } + + // ---- round trips --------------------------------------------------------------------------------------------- + + /// + /// Review of 806d5449 (reproduction): Plasterboard light reflectance unstated, its zone-face variant edited to visible + /// absorptance 0.42. Revision 10 re-exported Plasterboard → Insulation → Brick_Internal with Plasterboard at 0.7. The + /// import now reads the wall innermost first (Plasterboard, Insulation, Brick at their thicknesses), and the re-export + /// reproduces every surface's layers and both used faces, including the edited 0.42 zone face. + /// + [TestCase(true)] + [TestCase(false)] + public void AMultiLayerRoundTrip_KeepsLayersThicknessesAndBothUsedFaces(bool edited) + { + using (OpenStudioConversionResult conversion = OpaqueFaceOpticsTests.Box(LibraryWithoutPlasterboardLight(), AnalyticalModelFixtures.WallConstruction).ToOpenStudio()) + { + if (edited) + { + conversion.Model.getStandardOpaqueMaterials().Single(x => x.nameString().Contains("Plasterboard") && x.nameString().Contains("_Internal")).setVisibleAbsorptance(0.42); + } + + List before = Signatures(conversion.Model); + OpenStudioImportResult result = conversion.Model.ToSAM(); + Panel wall = result.AnalyticalModel.AdjacencyCluster.GetPanels().First(x => x.PanelType == PanelType.WallExternal); + AssertLayers(wall.Construction, ("Plasterboard", 0.0125), ("Insulation", 0.1), ("Brick", 0.1)); + Assert.That(wall.Construction.Guid, Is.EqualTo(AnalyticalModelFixtures.WallConstruction.Guid), "the forward construction's SAM Guid is restored"); + + using (OpenStudioConversionResult reexport = result.AnalyticalModel.ToOpenStudio()) + { + Assert.That(reexport.IsValid, Is.True, string.Join(" | ", reexport.Diagnostics.Where(d => d.Severity == Core.OpenStudio.OpenStudioDiagnosticSeverity.Error))); + List layers = Layers(OutdoorWall(reexport.Model)); + Assert.That(layers.Count, Is.EqualTo(3)); + Assert.That(layers[0].nameString(), Does.Contain("Brick"), "outside first: Brick, Insulation, Plasterboard"); + Assert.That(layers[1].nameString(), Does.Contain("Insulation")); + Assert.That(layers.Last().nameString(), Does.Contain("Plasterboard").And.Contain("_Internal")); + Assert.That(layers.Last().visibleAbsorptance(), Is.EqualTo(edited ? 0.42 : 0.7).Within(1e-9), "the zone face"); + AssertSameSignatures(before, Signatures(reexport.Model)); + } + } + } + + /// + /// Two boxes sharing a multi-layer wall, in both SAM space orders: the imported shared panel keeps SAM's first space, + /// reads its layers from that side, and the re-export reproduces both sides' layers and used faces. An edit of the + /// first space's zone-face layer (a shared equal-face object, revision 10) survives on that face only. + /// + [TestCase(false, false)] + [TestCase(true, false)] + [TestCase(false, true)] + [TestCase(true, true)] + public void AnInterzoneMultiLayerRoundTrip_KeepsTheFirstSpaceAndBothSides(bool bFirst, bool edited) + { + using (OpenStudioConversionResult conversion = OpaqueFaceOpticsTests.TwoBoxes(OpaqueFaceOpticsTests.Library(), sandwich, bFirst).ToOpenStudio()) + { + Assert.That(conversion.IsValid, Is.True); + if (edited) + { + conversion.Model.getStandardOpaqueMaterials().Single(x => x.nameString().Contains("Insulation")).setVisibleAbsorptance(0.42); + } + + List before = Signatures(conversion.Model); + OpenStudioImportResult result = conversion.Model.ToSAM(); + Panel shared = SharedPanel(result.AnalyticalModel); + Assert.That(result.AnalyticalModel.AdjacencyCluster.GetSpaces(shared)[0].Name, Is.EqualTo(bFirst ? "Space B" : "Space A"), "SAM's first space of the shared panel"); + Assert.That(result.AnalyticalModel.AdjacencyCluster.GetSpaces()[0].Name, Is.EqualTo(bFirst ? "Space B" : "Space A"), "first in the cluster's space order, which the writer reads"); + AssertLayers(shared.Construction, ("Insulation", 0.1), ("Plasterboard", 0.0125), ("Brick", 0.1)); + Assert.That(shared.Construction.Guid, Is.EqualTo(sandwich.Guid), "built from the forward side"); + + using (OpenStudioConversionResult reexport = result.AnalyticalModel.ToOpenStudio()) + { + Assert.That(reexport.IsValid, Is.True, string.Join(" | ", reexport.Diagnostics.Where(d => d.Severity == Core.OpenStudio.OpenStudioDiagnosticSeverity.Error))); + AssertSameSignatures(before, Signatures(reexport.Model)); + } + } + } + + /// + /// Geometric-fallback pairing: the interzone adjacency handles are blanked in the saved OSM, so the two shared-wall + /// surfaces are paired by geometry. The panel built from the forward side is kept, in both space orders, and the + /// re-export reproduces the original surfaces. + /// + [TestCase(false)] + [TestCase(true)] + public void AGeometricFallbackPair_KeepsTheForwardSide(bool bFirst) + { + string directory = System.IO.Path.Combine(System.IO.Path.GetTempPath(), "SAM_OpenStudio_Order_" + Guid.NewGuid().ToString("N").Substring(0, 8)); + System.IO.Directory.CreateDirectory(directory); + try + { + string path = System.IO.Path.Combine(directory, "dangling.osm"); + List before; + using (OpenStudioConversionResult conversion = OpaqueFaceOpticsTests.TwoBoxes(OpaqueFaceOpticsTests.Library(), sandwich, bFirst).ToOpenStudio()) + { + before = Signatures(conversion.Model); + Assert.That(conversion.Model.save(global::OpenStudio.OpenStudioUtilitiesCore.toPath(path), true), Is.True); + } + + string[] lines = System.IO.File.ReadAllLines(path); + int edited = 0; + for (int i = 1; i < lines.Length; i++) + { + if (lines[i].Contains("!- Outside Boundary Condition Object") && lines[i - 1].Trim().StartsWith("Surface,", StringComparison.Ordinal) && lines[i - 1].Contains("!- Outside Boundary Condition")) + { + lines[i] = " , !- Outside Boundary Condition Object"; + edited++; + } + } + + Assert.That(edited, Is.EqualTo(2), "both sides of the shared wall"); + System.IO.File.WriteAllLines(path, lines); + + OpenStudioImportResult result = Convert.ToSAM(path); + Assert.That(result.Diagnostics.Count(x => x.Code == Core.OpenStudio.OpenStudioImportDiagnosticCodes.AdjacencyGeometricFallback), Is.EqualTo(1), string.Join(" | ", result.Diagnostics)); + Panel shared = SharedPanel(result.AnalyticalModel); + Assert.That(result.AnalyticalModel.AdjacencyCluster.GetSpaces(shared)[0].Name, Is.EqualTo(bFirst ? "Space B" : "Space A")); + Assert.That(result.AnalyticalModel.AdjacencyCluster.GetSpaces()[0].Name, Is.EqualTo(bFirst ? "Space B" : "Space A"), "first in the cluster's space order, which the writer reads"); + AssertLayers(shared.Construction, ("Insulation", 0.1), ("Plasterboard", 0.0125), ("Brick", 0.1)); + + using (OpenStudioConversionResult reexport = result.AnalyticalModel.ToOpenStudio()) + { + Assert.That(reexport.IsValid, Is.True, string.Join(" | ", reexport.Diagnostics.Where(d => d.Severity == Core.OpenStudio.OpenStudioDiagnosticSeverity.Error))); + AssertSameSignatures(before, Signatures(reexport.Model)); + } + } + finally + { + try + { + System.IO.Directory.Delete(directory, true); + } + catch (Exception) + { + // a locked temp directory must not fail an otherwise passing test + } + } + } + + /// + /// Unstamped native opaque models (every SAM AdditionalProperties removed): no SAM metadata at all, so layers are + /// still read innermost first from the surface's zone, the interzone panel is built from the first surface visited, + /// and the re-export reproduces every surface's layers and used faces, in both space orders. + /// + [TestCase("box", false)] + [TestCase("two", false)] + [TestCase("two", true)] + public void AnUnstampedNativeModel_RoundTripsItsLayersAndUsedFaces(string model, bool bFirst) + { + AnalyticalModel analyticalModel = model == "box" + ? OpaqueFaceOpticsTests.Box(OpaqueFaceOpticsTests.Library(), AnalyticalModelFixtures.WallConstruction) + : OpaqueFaceOpticsTests.TwoBoxes(OpaqueFaceOpticsTests.Library(), sandwich, bFirst); + using (OpenStudioConversionResult conversion = analyticalModel.ToOpenStudio()) + { + StripSamMetadata(conversion.Model); + List before = Signatures(conversion.Model); + OpenStudioImportResult result = conversion.Model.ToSAM(); + Panel wall = result.AnalyticalModel.AdjacencyCluster.GetPanels().First(x => x.PanelType == PanelType.WallExternal); + AssertLayers(wall.Construction, ("Plasterboard", 0.0125), ("Insulation", 0.1), ("Brick", 0.1)); + if (model == "two") + { + Panel shared = SharedPanel(result.AnalyticalModel); + // No stamp: the panel is built from the first surface visited, and its layers face that space first. + // SAM-authored, Insulation faces the authored first space (B when bFirst), Brick the other. + string first = result.AnalyticalModel.AdjacencyCluster.GetSpaces(shared)[0].Name; + bool firstIsA = first.Contains("Space_A") || first.Contains("Space A"); + Assert.That(firstIsA || first.Contains("Space_B") || first.Contains("Space B"), Is.True, first); + AssertLayers(shared.Construction, firstIsA != bFirst + ? new[] { ("Insulation", 0.1), ("Plasterboard", 0.0125), ("Brick", 0.1) } + : new[] { ("Brick", 0.1), ("Plasterboard", 0.0125), ("Insulation", 0.1) }); + Assert.That(result.AnalyticalModel.AdjacencyCluster.GetSpaces()[0].Name, Is.EqualTo(first), "the panel's first space is also first in the cluster's space order"); + } + + using (OpenStudioConversionResult reexport = result.AnalyticalModel.ToOpenStudio()) + { + Assert.That(reexport.IsValid, Is.True, string.Join(" | ", reexport.Diagnostics.Where(d => d.Severity == Core.OpenStudio.OpenStudioDiagnosticSeverity.Error))); + AssertSameSignatures(before, Signatures(reexport.Model)); + } + } + } + + private static Geometry.Spatial.Face3D Face(params double[] c) + { + List point3Ds = new List(); + for (int i = 0; i < c.Length; i += 3) + { + point3Ds.Add(new Geometry.Spatial.Point3D(c[i], c[i + 1], c[i + 2])); + } + + return new Geometry.Spatial.Face3D(new Geometry.Spatial.Polygon3D(point3Ds)); + } + + /// + /// Two boxes whose shared wall is two halves: the south half of , the north half of + /// (the same layers, its own Guid). : the optics library, whose + /// Plasterboard and Brick faces differ; otherwise the fixture library, whose faces agree. + /// + private static AnalyticalModel TwoBoxesWithTwoSharedHalves(bool bFirst, bool divergent) + { + AnalyticalModel analyticalModel = OpaqueFaceOpticsTests.TwoBoxes(OpaqueFaceOpticsTests.Library(divergent), sandwich, bFirst); + AdjacencyCluster adjacencyCluster = analyticalModel.AdjacencyCluster; + Panel shared = SharedPanel(analyticalModel); + List spaces = adjacencyCluster.GetSpaces(shared); + adjacencyCluster.RemoveObject(shared.Guid); + foreach ((Construction construction, Geometry.Spatial.Face3D face3D) in new[] + { + (sandwich, Face(5, 0, 0, 5, 2, 0, 5, 2, 3, 5, 0, 3)), + (northHalf, Face(5, 2, 0, 5, 4, 0, 5, 4, 3, 5, 2, 3)), + }) + { + Panel half = Analytical.Create.Panel(construction, PanelType.WallInternal, face3D); + adjacencyCluster.AddObject(half); + foreach (Space space in spaces) + { + adjacencyCluster.AddRelation(space, half); + } + } + + return new AnalyticalModel(analyticalModel, adjacencyCluster); + } + + private static readonly Construction northHalf = new Construction(new Guid("66666666-0000-0000-0000-000000000004"), "Order Sandwich North", sandwich.ConstructionLayers); + + /// + /// Places one shared half's two native constructions: its SAM-written forward construction on the surface in the space + /// OpenStudio visits second when , else first, and the unstamped reverse on the other + /// side; then removes the forward construction's SAM stamp when . Every placement is a mirror + /// pair, as the writer makes them. + /// + private static void Place(global::OpenStudio.Model model, Guid half, bool forwardOnSecond, bool unstamp) + { + string second = model.getSpaces().ToList()[1].nameString(); + bool south = half == sandwich.Guid; + List surfaces = model.getSurfaces().Where(x => x.outsideBoundaryCondition() == "Surface" && (x.vertices().Average(y => y.y()) < 2) == south).ToList(); + Assert.That(surfaces.Count, Is.EqualTo(2)); + global::OpenStudio.ConstructionBase forward = surfaces.Select(x => x.construction().get()).Single(x => Core.OpenStudio.Query.TryGetSAMGuid(x, out Guid guid) && guid == half); + global::OpenStudio.ConstructionBase reverse = surfaces.Select(x => x.construction().get()).Single(x => !Core.OpenStudio.Query.TryGetSAMGuid(x, out Guid _)); + foreach (global::OpenStudio.Surface surface in surfaces) + { + bool inSecond = surface.space().get().nameString() == second; + Assert.That(surface.setConstruction(inSecond == forwardOnSecond ? forward : reverse), Is.True); + } + + if (unstamp) + { + forward.additionalProperties().remove(); + } + } + + private static string SecondVisited(global::OpenStudio.Model model) + { + return model.getSpaces().ToList()[1].nameString().Contains("Space_B") ? "Space B" : "Space A"; + } + + private static int Count(OpenStudioImportResult result, string code, string fragment) + { + return result.Diagnostics.Count(d => d.Code == code && d.Message.Contains(fragment)); + } + + /// + /// A mixed model, deterministic whatever order OpenStudio visits the spaces in: the stamped south half's forward + /// construction is on the space visited second, so that space comes first in the imported order; the north half has no + /// stamp and is built from the space visited first, so it is re-read from its partner (SAM-OSI-APX-001). + /// + /// North reverse construction on the new first space, materials with differing faces: the re-read + /// would put Brick's internal face where the native model has Brick's external-face object (0.9 / 0.7 / 0.7 written as + /// 0.5 / 0.4 / 0.4), so the import fails with SAM-OSI-CON-002 naming the north half and returns no model. + /// North forward construction on the new first space with differing faces, or equal faces: the + /// re-read keeps every layer and used face, the import succeeds and the re-export reproduces every surface. + /// + /// + [TestCase(false, true, false, false)] + [TestCase(true, true, false, false)] + [TestCase(false, true, true, true)] + [TestCase(true, true, true, true)] + [TestCase(false, false, false, true)] + [TestCase(true, false, false, true)] + public void AMixedModelWhoseUnstampedHalfIsReRead_KeepsItsUsedFaces_OrFailsNamed(bool bFirst, bool divergent, bool northForwardOnSecond, bool succeeds) + { + using (OpenStudioConversionResult conversion = TwoBoxesWithTwoSharedHalves(bFirst, divergent).ToOpenStudio()) + { + Assert.That(conversion.IsValid, Is.True, string.Join(" | ", conversion.Diagnostics.Where(d => d.Severity == Core.OpenStudio.OpenStudioDiagnosticSeverity.Error))); + Place(conversion.Model, sandwich.Guid, true, false); + Place(conversion.Model, northHalf.Guid, northForwardOnSecond, true); + string expectedFirst = SecondVisited(conversion.Model); + List before = Signatures(conversion.Model); + + OpenStudioImportResult result = conversion.Model.ToSAM(); + Assert.That(Count(result, "SAM-OSI-APX-001", "is read from that space's surface instead"), Is.EqualTo(1), string.Join(" | ", result.Diagnostics)); + List errors = result.Diagnostics.Where(d => d.Code == "SAM-OSI-CON-002").ToList(); + if (!succeeds) + { + Assert.That(result.Successful, Is.False, "fail closed: no model when a used face cannot be kept"); + Assert.That(result.AnalyticalModel, Is.Null); + Assert.That(errors.Count, Is.EqualTo(1), string.Join(" | ", result.Diagnostics)); + Assert.That(errors[0].Severity, Is.EqualTo(Core.OpenStudio.OpenStudioDiagnosticSeverity.Error)); + Assert.That(errors[0].Message, Does.Contain("Order_Sandwich_North").And.Contain("zone face"), errors[0].Message); + return; + } + + Assert.That(result.Successful, Is.True, string.Join(" | ", result.Diagnostics)); + Assert.That(errors, Is.Empty, string.Join(" | ", errors)); + AdjacencyCluster adjacencyCluster = result.AnalyticalModel.AdjacencyCluster; + Assert.That(adjacencyCluster.GetSpaces()[0].Name, Is.EqualTo(expectedFirst), "the stamped half's forward side decides the space order"); + List halves = adjacencyCluster.GetPanels().Where(x => adjacencyCluster.GetSpaces(x)?.Count == 2).ToList(); + Assert.That(halves.Count, Is.EqualTo(2)); + Assert.That(halves.Select(x => adjacencyCluster.GetSpaces(x)[0].Name), Has.All.EqualTo(expectedFirst)); + + using (OpenStudioConversionResult reexport = result.AnalyticalModel.ToOpenStudio()) + { + Assert.That(reexport.IsValid, Is.True, string.Join(" | ", reexport.Diagnostics.Where(d => d.Severity == Core.OpenStudio.OpenStudioDiagnosticSeverity.Error))); + AssertSameSignatures(before, Signatures(reexport.Model)); + } + } + } + + /// + /// Contradictory forward sides: both halves SAM-written, the south forward on the space visited second and the north + /// forward on the space visited first, so no space order puts both first (a warning). The visit order is kept and the + /// south half is read from its other side: with differing faces that would move Brick's internal face onto a zone face, + /// so the import fails with SAM-OSI-CON-002; with equal faces it keeps every used face and succeeds. + /// + [TestCase(false, true, false)] + [TestCase(true, true, false)] + [TestCase(false, false, true)] + [TestCase(true, false, true)] + public void ContradictoryForwardSides_KeepTheUsedFaces_OrFailNamed(bool bFirst, bool divergent, bool succeeds) + { + using (OpenStudioConversionResult conversion = TwoBoxesWithTwoSharedHalves(bFirst, divergent).ToOpenStudio()) + { + Place(conversion.Model, sandwich.Guid, true, false); + Place(conversion.Model, northHalf.Guid, false, false); + List before = Signatures(conversion.Model); + + OpenStudioImportResult result = conversion.Model.ToSAM(); + Assert.That(Count(result, "SAM-OSI-APX-001", "cannot all come first in one space order"), Is.EqualTo(1), string.Join(" | ", result.Diagnostics)); + Assert.That(Count(result, "SAM-OSI-APX-001", "is read from that space's surface instead"), Is.EqualTo(1), string.Join(" | ", result.Diagnostics)); + List errors = result.Diagnostics.Where(d => d.Code == "SAM-OSI-CON-002").ToList(); + if (!succeeds) + { + Assert.That(result.Successful, Is.False, "fail closed"); + Assert.That(errors.Count, Is.EqualTo(1), string.Join(" | ", result.Diagnostics)); + Assert.That(errors[0].Message, Does.Contain("Order_Sandwich_Reverse").And.Contain("zone face"), errors[0].Message); + return; + } + + Assert.That(result.Successful, Is.True, string.Join(" | ", result.Diagnostics)); + Assert.That(errors, Is.Empty); + using (OpenStudioConversionResult reexport = result.AnalyticalModel.ToOpenStudio()) + { + Assert.That(reexport.IsValid, Is.True, string.Join(" | ", reexport.Diagnostics.Where(d => d.Severity == Core.OpenStudio.OpenStudioDiagnosticSeverity.Error))); + AssertSameSignatures(before, Signatures(reexport.Model)); + } + } + } + + /// + /// An edited single-sided wall: an unstamped construction puts Brick's external-face object on the zone face, a role + /// the writer would fill with Brick's internal face (0.5 / 0.4 / 0.4 instead of 0.9 / 0.7 / 0.7), so the import + /// fails with SAM-OSI-CON-002 rather than change that zone face. + /// + [Test] + public void AnUnstampedConstructionWithAFaceObjectInTheOtherRole_FailsNamed() + { + using (OpenStudioConversionResult conversion = OpaqueFaceOpticsTests.Box(OpaqueFaceOpticsTests.Library(), AnalyticalModelFixtures.WallConstruction).ToOpenStudio()) + { + global::OpenStudio.Surface wall = OutdoorWall(conversion.Model); + List layers = Layers(wall); + global::OpenStudio.Construction edited = new global::OpenStudio.Construction(conversion.Model); + edited.setName("Order Edited Wall"); + global::OpenStudio.MaterialVector materialVector = new global::OpenStudio.MaterialVector(); + materialVector.Add(layers[1]); + materialVector.Add(layers[0]); + Assert.That(edited.setLayers(materialVector), Is.True, "Insulation outside, Brick's external-face object on the zone face"); + Assert.That(wall.setConstruction(edited), Is.True); + + OpenStudioImportResult result = conversion.Model.ToSAM(); + Assert.That(result.Successful, Is.False); + List errors = result.Diagnostics.Where(d => d.Code == "SAM-OSI-CON-002").ToList(); + Assert.That(errors.Count, Is.EqualTo(1), string.Join(" | ", result.Diagnostics)); + Assert.That(errors[0].Message, Does.Contain("Order Edited Wall").And.Contain("zone face"), errors[0].Message); + } + } + + /// The same edit with the fixture library, whose faces agree: every role writes the same value, so the import succeeds and round-trips. + [Test] + public void AnUnstampedConstructionWithEqualFaceObjects_Succeeds() + { + using (OpenStudioConversionResult conversion = OpaqueFaceOpticsTests.Box(OpaqueFaceOpticsTests.Library(false), AnalyticalModelFixtures.WallConstruction).ToOpenStudio()) + { + global::OpenStudio.Surface wall = OutdoorWall(conversion.Model); + List layers = Layers(wall); + global::OpenStudio.Construction edited = new global::OpenStudio.Construction(conversion.Model); + edited.setName("Order Edited Wall"); + global::OpenStudio.MaterialVector materialVector = new global::OpenStudio.MaterialVector(); + materialVector.Add(layers[1]); + materialVector.Add(layers[0]); + Assert.That(edited.setLayers(materialVector), Is.True); + Assert.That(wall.setConstruction(edited), Is.True); + List before = Signatures(conversion.Model); + + OpenStudioImportResult result = conversion.Model.ToSAM(); + Assert.That(result.Successful, Is.True, string.Join(" | ", result.Diagnostics.Where(d => d.Severity == Core.OpenStudio.OpenStudioDiagnosticSeverity.Error))); + Assert.That(result.Diagnostics.Any(d => d.Code == "SAM-OSI-CON-002"), Is.False); + using (OpenStudioConversionResult reexport = result.AnalyticalModel.ToOpenStudio()) + { + AssertSameSignatures(before, Signatures(reexport.Model)); + } + } + } + + /// The single-layer control: one layer reads the same in either order, and its round trip is unchanged. + [Test] + public void ASingleLayerRoundTrip_IsUnchanged() + { + Construction single = new Construction(new Guid("66666666-0000-0000-0000-000000000001"), "Order Single", new List { new ConstructionLayer("Insulation", 0.1) }); + using (OpenStudioConversionResult conversion = OpaqueFaceOpticsTests.Box(OpaqueFaceOpticsTests.Library(), AnalyticalModelFixtures.WallConstruction, floor: single).ToOpenStudio()) + { + List before = Signatures(conversion.Model); + OpenStudioImportResult result = conversion.Model.ToSAM(); + AssertLayers(result.AnalyticalModel.AdjacencyCluster.GetPanels().Single(x => x.PanelType == PanelType.SlabOnGrade).Construction, ("Insulation", 0.1)); + using (OpenStudioConversionResult reexport = result.AnalyticalModel.ToOpenStudio()) + { + AssertSameSignatures(before, Signatures(reexport.Model)); + } + } + } + + // ---- per-layer consistency of both sides (review of 89a2216) --------------------------------------------------- + + /// + /// A copy of a SAM-written opaque object at another thickness: same thermal properties and absorptances, and the same + /// source-material and face metadata (so it merges with the original), but no SAM identity of its own. + /// + private static global::OpenStudio.StandardOpaqueMaterial CopyAt(global::OpenStudio.Model model, global::OpenStudio.StandardOpaqueMaterial original, double thickness, string name) + { + global::OpenStudio.StandardOpaqueMaterial copy = new global::OpenStudio.StandardOpaqueMaterial(model); + copy.setName(name); + copy.setThickness(thickness); + copy.setThermalConductivity(original.thermalConductivity()); + copy.setDensity(original.density()); + copy.setSpecificHeat(original.specificHeat()); + copy.setThermalAbsorptance(original.thermalAbsorptance()); + copy.setSolarAbsorptance(original.solarAbsorptance()); + copy.setVisibleAbsorptance(original.visibleAbsorptance()); + List keys = new List { Core.OpenStudio.OpenStudioIdentityKeys.MaterialGuid, Core.OpenStudio.OpenStudioIdentityKeys.MaterialFace }; + keys.AddRange(new[] { "InternalEmissivity", "ExternalEmissivity", "InternalSolarReflectance", "ExternalSolarReflectance", "InternalLightReflectance", "ExternalLightReflectance" }.Select(x => Core.OpenStudio.OpenStudioIdentityKeys.OpticPrefix + x)); + keys.AddRange(new[] { "ThermalAbsorptance", "SolarAbsorptance", "VisibleAbsorptance" }.Select(x => Core.OpenStudio.OpenStudioIdentityKeys.WrittenPrefix + x)); + foreach (string key in keys) + { + if (Core.OpenStudio.Query.TryGetSAMFeature(original, key, out string value)) + { + copy.additionalProperties().setFeature(key, value); + } + } + + return copy; + } + + private static global::OpenStudio.Construction InterzoneConstruction(global::OpenStudio.Model model, bool forward) + { + return model.getSurfaces().Where(x => x.outsideBoundaryCondition() == "Surface").Select(x => x.construction().get().to_Construction().get()).First(x => x.nameString().Contains(forward ? "_Forward" : "_Reverse")); + } + + private static void ReplaceLayer(global::OpenStudio.Construction construction, int index, global::OpenStudio.Material material) + { + List layers = construction.layers().ToList(); + global::OpenStudio.MaterialVector materialVector = new global::OpenStudio.MaterialVector(); + for (int i = 0; i < layers.Count; i++) + { + materialVector.Add(i == index ? material : layers[i]); + } + + Assert.That(construction.setLayers(materialVector), Is.True); + } + + private static void AssertFailsNamed(OpenStudioImportResult result, string fragment) + { + Assert.That(result.Successful, Is.False, "fail closed: no model"); + List errors = result.Diagnostics.Where(d => d.Code == "SAM-OSI-CON-002").ToList(); + Assert.That(errors.Count, Is.EqualTo(1), string.Join(" | ", result.Diagnostics)); + Assert.That(errors[0].Severity, Is.EqualTo(Core.OpenStudio.OpenStudioDiagnosticSeverity.Error)); + Assert.That(errors[0].Message, Does.Contain(fragment), errors[0].Message); + } + + private static void AssertRoundTrips(OpenStudioConversionResult conversion, List before) + { + OpenStudioImportResult result = conversion.Model.ToSAM(); + Assert.That(result.Successful, Is.True, string.Join(" | ", result.Diagnostics.Where(d => d.Severity == Core.OpenStudio.OpenStudioDiagnosticSeverity.Error))); + Assert.That(result.Diagnostics.Any(d => d.Code == "SAM-OSI-CON-002"), Is.False); + using (OpenStudioConversionResult reexport = result.AnalyticalModel.ToOpenStudio()) + { + Assert.That(reexport.IsValid, Is.True, string.Join(" | ", reexport.Diagnostics.Where(d => d.Severity == Core.OpenStudio.OpenStudioDiagnosticSeverity.Error))); + AssertSameSignatures(before, Signatures(reexport.Model)); + } + } + + /// + /// Review of 89a2216 (reproduction): the interzone sandwich's 12.5 mm Plasterboard replaced on one side only by a 20 mm + /// copy with the same source metadata. The two objects merge into one SAM material, so names alone matched and the + /// import succeeded, re-exporting 12.5 mm on both sides. Each side's per-layer thickness is now compared with the + /// panel's SAM layers: error SAM-OSI-CON-002 naming the 20 mm layer, and no model. Either side. + /// + [TestCase(false)] + [TestCase(true)] + public void AnInterzoneSideWithAnotherLayerThickness_FailsNamed(bool onForwardSide) + { + using (OpenStudioConversionResult conversion = OpaqueFaceOpticsTests.TwoBoxes(OpaqueFaceOpticsTests.Library(), sandwich).ToOpenStudio()) + { + global::OpenStudio.Construction construction = InterzoneConstruction(conversion.Model, onForwardSide); + List layers = construction.layers().ToList(); + Assert.That(layers[1].nameString(), Does.Contain("Plasterboard_12.5mm")); + ReplaceLayer(construction, 1, CopyAt(conversion.Model, layers[1].to_StandardOpaqueMaterial().get(), 0.02, "Reviewer_Plasterboard_20mm")); + + // The panel is built from the forward side, so the error names the other side's layer: the 20 mm copy when it + // is on the reverse side, the original 12.5 mm object when the copy replaced the forward side's layer. + OpenStudioImportResult result = conversion.Model.ToSAM(); + AssertFailsNamed(result, onForwardSide ? "is 0.0125 m thick but the SAM layer is 0.02 m" : "('Reviewer_Plasterboard_20mm') of the surface in space"); + if (!onForwardSide) + { + Assert.That(result.Diagnostics.Single(d => d.Code == "SAM-OSI-CON-002").Message, Does.Contain("is 0.02 m thick but the SAM layer is 0.0125 m")); + } + } + } + + // SAM inside → outside: one source material twice, at two thicknesses. + private static readonly Construction repeated = new Construction(new Guid("66666666-0000-0000-0000-000000000005"), "Order Repeated", new List + { + new ConstructionLayer("Plasterboard", 0.0125), + new ConstructionLayer("Insulation", 0.1), + new ConstructionLayer("Plasterboard", 0.02), + }); + + /// + /// One source material twice at different thicknesses in a mirrored interzone construction: valid, so the import keeps + /// both thicknesses in place and round-trips, in both space orders (the equivalent-mirror control). + /// + [TestCase(false)] + [TestCase(true)] + public void ARepeatedMaterialAtTwoThicknesses_RoundTrips(bool bFirst) + { + using (OpenStudioConversionResult conversion = OpaqueFaceOpticsTests.TwoBoxes(OpaqueFaceOpticsTests.Library(), repeated, bFirst).ToOpenStudio()) + { + Assert.That(conversion.IsValid, Is.True, string.Join(" | ", conversion.Diagnostics.Where(d => d.Severity == Core.OpenStudio.OpenStudioDiagnosticSeverity.Error))); + List before = Signatures(conversion.Model); + OpenStudioImportResult result = conversion.Model.ToSAM(); + Assert.That(result.Successful, Is.True, string.Join(" | ", result.Diagnostics.Where(d => d.Severity == Core.OpenStudio.OpenStudioDiagnosticSeverity.Error))); + AssertLayers(SharedPanel(result.AnalyticalModel).Construction, ("Plasterboard", 0.0125), ("Insulation", 0.1), ("Plasterboard", 0.02)); + AssertRoundTrips(conversion, before); + } + } + + /// + /// The same repeated-material construction with the two Plasterboard objects swapped on one side only: the names (one + /// merged SAM material) still match in order, but the thicknesses run the wrong way, so SAM-OSI-CON-002 and no model. + /// + [Test] + public void ARepeatedMaterialWithSwappedThicknessesOnOneSide_FailsNamed() + { + using (OpenStudioConversionResult conversion = OpaqueFaceOpticsTests.TwoBoxes(OpaqueFaceOpticsTests.Library(), repeated).ToOpenStudio()) + { + global::OpenStudio.Construction construction = InterzoneConstruction(conversion.Model, false); + List layers = construction.layers().ToList(); + Assert.That(layers[0].nameString(), Does.Contain("Plasterboard")); + Assert.That(layers[2].nameString(), Does.Contain("Plasterboard")); + global::OpenStudio.MaterialVector materialVector = new global::OpenStudio.MaterialVector(); + materialVector.Add(layers[2]); + materialVector.Add(layers[1]); + materialVector.Add(layers[0]); + Assert.That(construction.setLayers(materialVector), Is.True, "the reverse side now runs 20 mm, Insulation, 12.5 mm"); + + AssertFailsNamed(conversion.Model.ToSAM(), "m thick but the SAM layer is"); + } + } + + /// + /// Legitimate reuse of one source material at different thicknesses in unrelated constructions: Plasterboard 12.5 mm in + /// the walls and 15 mm in the interzone construction (and the roof of a box) merge into one SAM material, each layer + /// keeps its own thickness, and the import round-trips. + /// + [TestCase("box")] + [TestCase("two")] + public void OneMaterialAtDifferentThicknessesInUnrelatedConstructions_RoundTrips(string model) + { + Construction sandwich15 = new Construction(new Guid("66666666-0000-0000-0000-000000000006"), "Order Sandwich 15", new List + { + new ConstructionLayer("Insulation", 0.1), + new ConstructionLayer("Plasterboard", 0.015), + new ConstructionLayer("Brick", 0.1), + }); + + AnalyticalModel analyticalModel = model == "box" + ? OpaqueFaceOpticsTests.Box(OpaqueFaceOpticsTests.Library(), AnalyticalModelFixtures.WallConstruction, roof: sandwich15) + : OpaqueFaceOpticsTests.TwoBoxes(OpaqueFaceOpticsTests.Library(), sandwich15); + using (OpenStudioConversionResult conversion = analyticalModel.ToOpenStudio()) + { + Assert.That(conversion.Model.getStandardOpaqueMaterials().Count(x => x.nameString().Contains("Plasterboard")), Is.GreaterThanOrEqualTo(2), "a 12.5 mm and a 15 mm object"); + List before = Signatures(conversion.Model); + OpenStudioImportResult result = conversion.Model.ToSAM(); + Assert.That(result.AnalyticalModel.MaterialLibrary.GetMaterials().OfType().Count(x => x.Name.Contains("Plasterboard")), Is.EqualTo(1), "one merged SAM material"); + AssertRoundTrips(conversion, before); + } + } + + /// + /// The air-gap handling is unchanged: an interzone cavity wall (AirGap layer) imports with no consistency error, its + /// cavity layer between the same layers, at the thickness the importer has always given a resistance-only layer with no + /// recorded nominal thickness (0, `LayerThickness`). Its re-export is not asserted: that pre-existing 0 thickness is + /// refused by the writer (recorded in the PR record, not changed here). + /// + [Test] + public void AnInterzoneCavityWall_KeepsItsAirGapImport() + { + MaterialLibrary materialLibrary = OpaqueFaceOpticsTests.Library(); + materialLibrary.Add(AnalyticalModelFixtures.CreateCavityGasMaterial()); + using (OpenStudioConversionResult conversion = OpaqueFaceOpticsTests.TwoBoxes(materialLibrary, AnalyticalModelFixtures.CavityWallConstruction).ToOpenStudio()) + { + Assert.That(conversion.IsValid, Is.True, string.Join(" | ", conversion.Diagnostics.Where(d => d.Severity == Core.OpenStudio.OpenStudioDiagnosticSeverity.Error))); + Assert.That(conversion.Model.getAirGaps().Count, Is.GreaterThan(0)); + OpenStudioImportResult result = conversion.Model.ToSAM(); + Assert.That(result.Successful, Is.True, string.Join(" | ", result.Diagnostics.Where(d => d.Severity == Core.OpenStudio.OpenStudioDiagnosticSeverity.Error))); + Assert.That(result.Diagnostics.Any(d => d.Code == "SAM-OSI-CON-002"), Is.False); + AssertLayers(SharedPanel(result.AnalyticalModel).Construction, ("Plasterboard", 0.0125), ("Air_Cavity", 0), ("Brick", 0.1)); + } + } + + /// + /// The documented massless handling is unchanged: one massless object on both sides of the interzone wall imports at + /// its nominal thickness, reported (SAM-OSI-APX-001), with no consistency error. + /// + [Test] + public void AMasslessInterzoneLayer_KeepsItsDocumentedImport() + { + using (OpenStudioConversionResult conversion = OpaqueFaceOpticsTests.TwoBoxes(OpaqueFaceOpticsTests.Library(), sandwich).ToOpenStudio()) + { + global::OpenStudio.MasslessOpaqueMaterial massless = new global::OpenStudio.MasslessOpaqueMaterial(conversion.Model); + massless.setName("Order Massless"); + Assert.That(massless.setThermalResistance(2.5), Is.True); + foreach (bool forward in new[] { true, false }) + { + global::OpenStudio.Construction construction = InterzoneConstruction(conversion.Model, forward); + int index = construction.layers().ToList().FindIndex(x => x.nameString().Contains("Plasterboard")); + ReplaceLayer(construction, index, massless); + } + + OpenStudioImportResult result = conversion.Model.ToSAM(); + Assert.That(result.Successful, Is.True, string.Join(" | ", result.Diagnostics.Where(d => d.Severity == Core.OpenStudio.OpenStudioDiagnosticSeverity.Error))); + Assert.That(result.Diagnostics.Any(d => d.Code == "SAM-OSI-CON-002"), Is.False); + Assert.That(result.Diagnostics.Any(d => d.Code == "SAM-OSI-APX-001" && d.Message.Contains("Massless material")), Is.True); + AssertLayers(SharedPanel(result.AnalyticalModel).Construction, ("Insulation", 0.1), ("Order Massless", 0.025), ("Brick", 0.1)); + } + } + + // ---- unchanged paths ----------------------------------------------------------------------------------------- + + /// Glazing keeps OpenStudio's pane order: an asymmetric window (6 mm, cavity, 4 mm panes) imports exactly as stored. + [Test] + public void AGlazingConstruction_KeepsOpenStudiosPaneOrder() + { + ApertureConstruction window = new ApertureConstruction(new Guid("66666666-0000-0000-0000-000000000010"), "Order Window", ApertureType.Window, new List + { + new ConstructionLayer("Glass", 0.006), + new ConstructionLayer("Air", 0.012), + new ConstructionLayer("Glass", 0.004), + }); + + using (OpenStudioConversionResult conversion = AnalyticalModelFixtures.SingleBox(apertureConstructionOverride: window).ToOpenStudio()) + { + global::OpenStudio.SubSurface subSurface = conversion.Model.getSubSurfaces().Single(); + List native = subSurface.construction().get().to_Construction().get().layers().Select(x => Math.Round(x.thickness(), 6)).ToList(); + Assert.That(native, Is.Not.EqualTo(Enumerable.Reverse(native).ToList()), "the panes are asymmetric"); + + OpenStudioImportResult result = conversion.Model.ToSAM(); + Aperture aperture = result.AnalyticalModel.AdjacencyCluster.GetPanels().SelectMany(x => x.Apertures ?? new List()).Single(); + Assert.That(aperture.ApertureConstruction.PaneConstructionLayers.Select(x => Math.Round(x.Thickness, 6)), Is.EqualTo(native), "OpenStudio's order, as before revision 11"); + Panel wall = result.AnalyticalModel.AdjacencyCluster.GetPanels().First(x => x.PanelType == PanelType.WallExternal); + Assert.That(LayerNames(wall.Construction).First(), Does.Contain("Plasterboard"), "the opaque wall in the same model is read innermost first"); + } + } + + /// + /// An unstamped opaque construction used only by a subsurface (an opaque door pane) keeps OpenStudio's order, as + /// before; the same model's walls are read innermost first. + /// + [Test] + public void AnOpaqueDoorPane_KeepsOpenStudiosOrder() + { + using (OpenStudioConversionResult conversion = AnalyticalModelFixtures.SingleBox().ToOpenStudio()) + { + List wallLayers = Layers(OutdoorWall(conversion.Model)); + global::OpenStudio.Construction door = new global::OpenStudio.Construction(conversion.Model); + door.setName("Order Door"); + global::OpenStudio.MaterialVector materialVector = new global::OpenStudio.MaterialVector(); + materialVector.Add(wallLayers[0]); + materialVector.Add(wallLayers[1]); + Assert.That(door.setLayers(materialVector), Is.True); + Assert.That(conversion.Model.getSubSurfaces().Single().setConstruction(door), Is.True); + + OpenStudioImportResult result = conversion.Model.ToSAM(); + Aperture aperture = result.AnalyticalModel.AdjacencyCluster.GetPanels().SelectMany(x => x.Apertures ?? new List()).Single(); + List panes = aperture.ApertureConstruction.PaneConstructionLayers; + Assert.That(panes.Count, Is.EqualTo(2)); + Assert.That(panes[0].Name, Does.Contain("Brick"), "OpenStudio's order: " + string.Join(", ", panes.Select(x => x.Name))); + Assert.That(panes[1].Name, Does.Contain("Insulation")); + Panel wall = result.AnalyticalModel.AdjacencyCluster.GetPanels().First(x => x.PanelType == PanelType.WallExternal); + Assert.That(LayerNames(wall.Construction).First(), Does.Contain("Plasterboard")); + } + } + + private static global::OpenStudio.ShadingSurface AddShade(global::OpenStudio.Model model, global::OpenStudio.ConstructionBase construction) + { + global::OpenStudio.ShadingSurfaceGroup group = new global::OpenStudio.ShadingSurfaceGroup(model); + global::OpenStudio.Point3dVector points = new global::OpenStudio.Point3dVector(); + points.Add(new global::OpenStudio.Point3d(0, -1, 3)); + points.Add(new global::OpenStudio.Point3d(0, -2, 3)); + points.Add(new global::OpenStudio.Point3d(5, -2, 3)); + points.Add(new global::OpenStudio.Point3d(5, -1, 3)); + global::OpenStudio.ShadingSurface shade = new global::OpenStudio.ShadingSurface(points, model); + Assert.That(shade.setShadingSurfaceGroup(group), Is.True); + Assert.That(shade.setConstruction(construction), Is.True); + return shade; + } + + private static Panel Shade(OpenStudioImportResult result) + { + return result.AnalyticalModel.AdjacencyCluster.GetPanels().Single(x => x.PanelType == PanelType.Shade); + } + + /// A construction used only by a shading surface keeps OpenStudio's order. + [Test] + public void AShadingOnlyConstruction_KeepsOpenStudiosOrder() + { + using (OpenStudioConversionResult conversion = OpaqueFaceOpticsTests.Box(OpaqueFaceOpticsTests.Library(), AnalyticalModelFixtures.WallConstruction).ToOpenStudio()) + { + List wallLayers = Layers(OutdoorWall(conversion.Model)); + global::OpenStudio.Construction shadeConstruction = new global::OpenStudio.Construction(conversion.Model); + shadeConstruction.setName("Order Shade"); + global::OpenStudio.MaterialVector materialVector = new global::OpenStudio.MaterialVector(); + materialVector.Add(wallLayers[0]); + materialVector.Add(wallLayers[1]); + Assert.That(shadeConstruction.setLayers(materialVector), Is.True); + AddShade(conversion.Model, shadeConstruction); + + OpenStudioImportResult result = conversion.Model.ToSAM(); + List layers = LayerNames(Shade(result).Construction); + Assert.That(layers.Count, Is.EqualTo(2)); + Assert.That(layers[0], Does.Contain("Brick"), "OpenStudio's order: " + string.Join(", ", layers)); + Assert.That(layers[1], Does.Contain("Insulation")); + Assert.That(result.Diagnostics.Any(d => d.Code == "SAM-OSI-APX-001" && d.Message.Contains("planar surfaces and by a subsurface or shading surface")), Is.False); + } + } + + /// + /// A construction shared by walls and a shading surface is split: the walls get the innermost-first SAM construction + /// with the restored Guid, the shade a separate one in OpenStudio's order with its own Guid; reported once. + /// + [Test] + public void AConstructionSharedByWallsAndAShade_IsSplit_AndReported() + { + using (OpenStudioConversionResult conversion = OpaqueFaceOpticsTests.Box(OpaqueFaceOpticsTests.Library(), AnalyticalModelFixtures.WallConstruction).ToOpenStudio()) + { + AddShade(conversion.Model, OutdoorWall(conversion.Model).construction().get()); + List before = Signatures(conversion.Model); + + OpenStudioImportResult result = conversion.Model.ToSAM(); + Panel wall = result.AnalyticalModel.AdjacencyCluster.GetPanels().First(x => x.PanelType == PanelType.WallExternal); + AssertLayers(wall.Construction, ("Plasterboard", 0.0125), ("Insulation", 0.1), ("Brick", 0.1)); + Assert.That(wall.Construction.Guid, Is.EqualTo(AnalyticalModelFixtures.WallConstruction.Guid)); + Construction shade = Shade(result).Construction; + Assert.That(LayerNames(shade).First(), Does.Contain("Brick"), "OpenStudio's order: " + string.Join(", ", LayerNames(shade))); + Assert.That(shade.Guid, Is.Not.EqualTo(wall.Construction.Guid)); + Assert.That(result.Diagnostics.Count(d => d.Code == "SAM-OSI-APX-001" && d.Message.Contains("planar surfaces and by a subsurface or shading surface")), Is.EqualTo(1), string.Join(" | ", result.Diagnostics)); + + using (OpenStudioConversionResult reexport = result.AnalyticalModel.ToOpenStudio()) + { + AssertSameSignatures(before, Signatures(reexport.Model)); + } + } + } + + /// An air boundary keeps its layer-free SAM construction; the model's opaque walls are read innermost first. + [Test] + public void AnAirBoundary_IsUnchanged() + { + using (OpenStudioConversionResult conversion = AnalyticalModelFixtures.TwoAdjacentBoxes(sharedWallIsAir: true).ToOpenStudio()) + { + OpenStudioImportResult result = conversion.Model.ToSAM(); + Panel air = result.AnalyticalModel.AdjacencyCluster.GetPanels().Single(x => x.PanelType == PanelType.Air); + Assert.That(air.Construction?.ConstructionLayers ?? new List(), Is.Empty); + Panel wall = result.AnalyticalModel.AdjacencyCluster.GetPanels().First(x => x.PanelType == PanelType.WallExternal); + Assert.That(LayerNames(wall.Construction).First(), Does.Contain("Plasterboard")); + } + } + + /// A non-layered construction (F-factor ground floor) keeps its name-only placeholder, with no invented layers. + [Test] + public void ANonLayeredConstruction_IsUnchanged() + { + using (OpenStudioConversionResult conversion = OpaqueFaceOpticsTests.Box(OpaqueFaceOpticsTests.Library(), AnalyticalModelFixtures.WallConstruction).ToOpenStudio()) + { + global::OpenStudio.FFactorGroundFloorConstruction fFactor = new global::OpenStudio.FFactorGroundFloorConstruction(conversion.Model); + fFactor.setName("Order F-Factor"); + Assert.That(conversion.Model.getSurfaces().Single(x => x.surfaceType() == "Floor").setConstruction(fFactor), Is.True); + + OpenStudioImportResult result = conversion.Model.ToSAM(); + Panel floor = result.AnalyticalModel.AdjacencyCluster.GetPanels().Single(x => x.PanelType == PanelType.SlabOnGrade); + Assert.That(floor.Construction.Name, Is.EqualTo("Order F-Factor")); + Assert.That(floor.Construction.ConstructionLayers ?? new List(), Is.Empty); + Assert.That(result.Diagnostics.Any(d => d.Code == "SAM-OSI-CON-001" && d.Message.Contains("not a layered construction")), Is.True); + } + } + } +} diff --git a/tests/resources/openstudio-analytical-coverage.json b/tests/resources/openstudio-analytical-coverage.json index 8431854..7aa1ca2 100644 --- a/tests/resources/openstudio-analytical-coverage.json +++ b/tests/resources/openstudio-analytical-coverage.json @@ -92,12 +92,12 @@ { "id": "InternalConditionParameter.SupplyAirFlow", "unit": "m3/s", "os": "OS:DesignSpecification:OutdoorAir Outdoor Air Flow Rate (method Sum)", "status": "Native", "milestone": "C2", "notes": "SpaceParameter.OutsideSupplyAirFlow takes precedence when present (space override)." }, { "id": "InternalConditionParameter.ExhaustAirFlow", "unit": "m3/s", "os": null, "status": "Deferred", "milestone": "C2", "diagnostic": "SAM-OS-HVAC-001 info" }, { "id": "InternalConditionParameter.VentilationProfileName", "unit": null, "os": "OS:DesignSpecification:OutdoorAir Outdoor Air Schedule", "status": "Native", "milestone": "C2", "diagnostic": "SAM-OS-SCH-001 error when named but unresolved" }, - { "id": "InternalConditionParameter.LightingRadiantProportion", "unit": "0-1", "os": "OS:Lights:Definition Fraction Radiant", "status": "Native", "milestone": "MVP", "notes": "Documented default 0.32 when absent." }, + { "id": "InternalConditionParameter.LightingRadiantProportion", "unit": "0-1", "os": "OS:Lights:Definition Fraction Radiant + Fraction Visible (Return Air Fraction 0)", "status": "Derived", "milestone": "MVP", "formula": "SAM S07 section 5.1 T-LIGHT-SPLIT: p = total radiant share; Fraction Visible = p*s, Fraction Radiant = p*(1 - s), convective 1 - p, s = 0.2415 / 0.576", "diagnostic": "SAM-OS-IC-002 info", "notes": "Authored p, including 0, is preserved. Absent or NaN p takes the S07 section 5.1 common default p0 = 0.576 (suspended LED office reference category; suitability outside it is owner decision OD-L1)." }, { "id": "InternalConditionParameter.OccupancyRadiantProportion", "unit": "0-1", "os": "OS:People:Definition Fraction Radiant", "status": "Native", "milestone": "MVP", "notes": "Documented default 0.3 when absent." }, { "id": "InternalConditionParameter.EquipmentRadiantProportion", "unit": "0-1", "os": "OS:ElectricEquipment:Definition Fraction Radiant", "status": "Native", "milestone": "MVP", "notes": "Documented default 0 when absent." }, - { "id": "InternalConditionParameter.LightingViewCoefficient", "unit": "0-1", "os": "OS:Lights:Definition Fraction Visible", "status": "Approximated", "milestone": "MVP", "notes": "TAS view coefficient mapped to EnergyPlus visible fraction; documented default 0.25 when absent." }, - { "id": "InternalConditionParameter.OccupancyViewCoefficient", "unit": "0-1", "os": null, "status": "Unsupported", "milestone": "C2", "diagnostic": "SAM-OS-IC-001 info; OS:People has no visible-fraction field" }, - { "id": "InternalConditionParameter.EquipmentViewCoefficient", "unit": "0-1", "os": null, "status": "Unsupported", "milestone": "C2", "diagnostic": "SAM-OS-IC-001 info; OS:ElectricEquipment has no visible-fraction field" }, + { "id": "InternalConditionParameter.LightingViewCoefficient", "unit": "0-1", "os": null, "status": "Unsupported", "milestone": "C2", "diagnostic": "SAM-OS-IC-001 info; a TAS comfort (mean radiant and resultant temperature) coefficient, not an energy fraction; OS:Lights has no input for it (SAM S07 section 5.1)" }, + { "id": "InternalConditionParameter.OccupancyViewCoefficient", "unit": "0-1", "os": null, "status": "Unsupported", "milestone": "C2", "diagnostic": "SAM-OS-IC-001 info; a TAS comfort coefficient, not an energy fraction; OS:People has no input for it" }, + { "id": "InternalConditionParameter.EquipmentViewCoefficient", "unit": "0-1", "os": null, "status": "Unsupported", "milestone": "C2", "diagnostic": "SAM-OS-IC-001 info; a TAS comfort coefficient, not an energy fraction; OS:ElectricEquipment has no input for it" }, { "id": "InternalConditionParameter.LightingControlFunction", "unit": null, "os": null, "status": "Unsupported", "milestone": "C2", "diagnostic": "SAM-OS-IC-001 info; TAS control function string has no deterministic daylighting-control mapping" }, { "id": "InternalConditionParameter.VentilationFunction", "unit": null, "os": null, "status": "Unsupported", "milestone": "C2", "diagnostic": "SAM-OS-IC-001 info; TAS function expression" }, { "id": "InternalConditionParameter.VentilationFunctionFactor", "unit": null, "os": null, "status": "Unsupported", "milestone": "C2", "diagnostic": "SAM-OS-IC-001 info" }, @@ -245,9 +245,9 @@ { "id": "OpaqueMaterialParameter.ExternalLightReflectance", "unit": "0-1", "os": "OS:Material Visible Absorptance = 1 - reflectance", "status": "Native", "milestone": "MVP" }, { "id": "OpaqueMaterialParameter.ExternalSolarReflectance", "unit": "0-1", "os": "OS:Material Solar Absorptance = 1 - reflectance", "status": "Native", "milestone": "MVP" }, { "id": "OpaqueMaterialParameter.IgnoreThermalTransmittanceCalculations", "unit": null, "os": null, "status": "NA", "milestone": "C0", "notes": "TAS calculation flag." }, - { "id": "OpaqueMaterialParameter.InternalEmissivity", "unit": "0-1", "os": "same single-sided OS:Material fields as External*", "status": "Approximated", "milestone": "C3", "diagnostic": "SAM-OS-MAT-002 info when Internal differs from External; EnergyPlus opaque materials are single-sided" }, - { "id": "OpaqueMaterialParameter.InternalLightReflectance", "unit": "0-1", "os": "single-sided OS:Material", "status": "Approximated", "milestone": "C3", "notes": "OpenStudio opaque materials are single-sided; the external-side value governs both sides (documented approximation)." }, - { "id": "OpaqueMaterialParameter.InternalSolarReflectance", "unit": "0-1", "os": "single-sided OS:Material", "status": "Approximated", "milestone": "C3", "notes": "OpenStudio opaque materials are single-sided; the external-side value governs both sides (documented approximation)." }, + { "id": "OpaqueMaterialParameter.InternalEmissivity", "unit": "0-1", "os": "OS:Material Thermal Absorptance of the zone-face (_Internal) variant of SAM's first layer", "status": "Derived", "milestone": "C3", "formula": "SAM's first (innermost) opaque layer is the zone face of the first space and of every single-sided surface; when its Internal* optics differ from External*, an internal-face variant carries them in both construction directions", "diagnostic": "SAM-OS-MAT-003 error for a single-layer outdoor or interzone construction whose faces differ; SAM-OS-MAT-004 info (Summary) when an unstated Internal* takes the External* value on a zone face; SAM-OS-MAT-002 info for an opaque door pane (external values govern both faces)" }, + { "id": "OpaqueMaterialParameter.InternalLightReflectance", "unit": "0-1", "os": "OS:Material Visible Absorptance = 1 - reflectance of the zone-face (_Internal) variant", "status": "Derived", "milestone": "C3", "formula": "as InternalEmissivity", "notes": "Unstated (absent or NaN) Internal* takes the External* value on a zone face: SAM-OS-MAT-004 info at Summary." }, + { "id": "OpaqueMaterialParameter.InternalSolarReflectance", "unit": "0-1", "os": "OS:Material Solar Absorptance = 1 - reflectance of the zone-face (_Internal) variant", "status": "Derived", "milestone": "C3", "formula": "as InternalEmissivity", "notes": "Unstated (absent or NaN) Internal* takes the External* value on a zone face: SAM-OS-MAT-004 info at Summary." }, { "id": "TransparentMaterialParameter.ExternalEmissivity", "unit": "0-1", "os": "StandardGlazing Front Side IR Hemispherical Emissivity", "status": "Native", "milestone": "MVP" }, { "id": "TransparentMaterialParameter.ExternalLightReflectance", "unit": "0-1", "os": "StandardGlazing Front Side Visible Reflectance", "status": "Native", "milestone": "MVP" }, diff --git a/tests/resources/openstudio-to-sam-coverage.json b/tests/resources/openstudio-to-sam-coverage.json index 2d0b6e0..634ed13 100644 --- a/tests/resources/openstudio-to-sam-coverage.json +++ b/tests/resources/openstudio-to-sam-coverage.json @@ -79,7 +79,7 @@ { "id": "OS:ShadingSurfaceGroup.Identity", "status": "Native", "target": "OpenStudioSourceParameter.ShadingGroupType/Name" }, { "id": "OS:ShadingSurfaceGroup.ShadedSurface", "status": "Approximated", "diagnostic": "SAM-OSI-APX-001", "notes": "SAM shade panels are free-standing; the association is metadata only." }, - { "id": "OS:Material.StandardOpaqueMaterial", "status": "Native", "target": "Core.OpaqueMaterial" }, + { "id": "OS:Material.StandardOpaqueMaterial", "status": "Native", "target": "Core.OpaqueMaterial", "notes": "SAM-written face and thickness objects of one source Guid merge into one SAM material with both authored faces; an edit made after export is kept on its face (SAM-OSI-MAT-001); conflicts are not merged (SAM-OSI-ID-001); never matched by name." }, { "id": "OS:Material.MasslessOpaqueMaterial", "status": "Approximated", "target": "Core.OpaqueMaterial", "diagnostic": "SAM-OSI-APX-001", "formula": "conductivity = 0.025 m / R; resistance preserved exactly, near-zero thermal mass assigned" }, { "id": "OS:Material.AirGap", "status": "Derived", "target": "Core.GasMaterial", "formula": "HeatTransferCoefficient = 1 / thermalResistance (exact inverse of the forward R = 1/h)" }, { "id": "OS:WindowMaterial.Glazing", "status": "Native", "target": "Core.TransparentMaterial", "notes": "EnergyPlus Front/Back map to SAM External/Internal, matching the forward direction." }, @@ -92,7 +92,7 @@ { "id": "OS:WindowMaterial.GlazingRefractionExtinctionMethod", "status": "Unsupported", "diagnostic": "SAM-OSI-MAT-001" }, { "id": "OS:MaterialProperty.PhaseChange", "status": "Unsupported", "diagnostic": "SAM-OSI-MAT-001", "notes": "SAM materials have no phase-change model." }, - { "id": "OS:Construction.Opaque", "status": "Native", "target": "Construction", "notes": "Layer order preserved outside-first." }, + { "id": "OS:Construction.Opaque", "status": "Native", "target": "Construction", "notes": "Opaque constructions used by planar surfaces are read innermost layer first (SAM inside to outside from the side the panel is built from, the SAM-written forward side when stamped); fenestration, door-pane, shading-only and unused constructions keep the outside-first order; a construction shared with a subsurface or shading surface is split (SAM-OSI-APX-001)." }, { "id": "OS:Construction.Fenestration", "status": "Native", "target": "ApertureConstruction", "notes": "Pane layers only; frame layers are never fabricated." }, { "id": "OS:Construction.AirBoundary", "status": "Native", "target": "PanelType.Air", "notes": "A layer-free SAM construction; the air behaviour is carried by the panel type." }, { "id": "OS:Construction.InternalSource", "status": "Unsupported", "diagnostic": "SAM-OSI-CON-001" }, @@ -100,13 +100,14 @@ { "id": "OS:Construction.FfactorGroundFloor", "status": "Unsupported", "diagnostic": "SAM-OSI-CON-001" }, { "id": "OS:Construction.WindowDataFile", "status": "Unsupported", "diagnostic": "SAM-OSI-CON-001" }, { "id": "OS:Construction.Missing", "status": "Unsupported", "diagnostic": "SAM-OSI-CON-001", "notes": "A surface with no construction gets a named, layer-free placeholder - never a default build-up." }, + { "id": "OS:Construction.FacesUnresolved", "status": "Unsupported", "diagnostic": "SAM-OSI-CON-002", "notes": "An opaque surface construction that cannot reproduce its native layer order or the absorptances of a face EnergyPlus uses (an edited or mixed model whose orientation or face roles cannot be established) is an error, and the import is unsuccessful." }, { "id": "OS:Construction.UnreferencedPruning", "status": "Native", "notes": "Materials and profiles the imported topology does not reference are removed." }, { "id": "OS:People", "status": "Derived", "target": "InternalConditionParameter.AreaPerPerson + Occupancy*GainPerPerson", "formula": "areaPerPerson = 1 / peopleperSpaceFloorArea; sensible = activityLevel * sensibleHeatFraction; latent = activityLevel * (1 - sensibleHeatFraction)", "diagnostic": "SAM-OSI-LOAD-001" }, { "id": "OS:People.AutocalculatedSensibleFraction", "status": "Approximated", "diagnostic": "SAM-OSI-APX-001", "notes": "No fixed split exists; the whole metabolic rate is imported as sensible." }, { "id": "OS:People.NumberOfPeopleMethod", "status": "Unsupported", "diagnostic": "SAM-OSI-LOAD-001", "notes": "An absolute count cannot become a density on a shared space type without inventing an area." }, { "id": "OS:Lights", "status": "Native", "target": "InternalConditionParameter.LightingGainPerArea + LightingProfileName" }, - { "id": "OS:Lights.RadiantVisibleFractions", "status": "Native", "target": "InternalConditionParameter.LightingRadiantProportion / LightingViewCoefficient" }, + { "id": "OS:Lights.RadiantVisibleFractions", "status": "Derived", "target": "InternalConditionParameter.LightingRadiantProportion", "formula": "p = Fraction Radiant + Fraction Visible (SAM S07 section 5.1); LightingViewCoefficient (a comfort coefficient) is not set", "diagnostic": "SAM-OSI-APX-001", "notes": "Warning when Return Air Fraction > 0 (that share becomes convective room gain) or the fractions sum above 1 (not imported); information when Fraction Visible / (Fraction Radiant + Fraction Visible) differs from s = 0.2415 / 0.576." }, { "id": "OS:ElectricEquipment", "status": "Native", "target": "InternalConditionParameter.EquipmentSensibleGainPerArea / EquipmentLatentGainPerArea" }, { "id": "OS:ElectricEquipment.PartLatent", "status": "Approximated", "diagnostic": "SAM-OSI-APX-001", "notes": "A single part-latent instance is apportioned; the two halves then share one schedule." }, { "id": "OS:GasEquipment", "status": "Unsupported", "diagnostic": "SAM-OSI-LOAD-001" },