Legg til barnehage, kontor-, skole-, idretts- og kulturbygg
Driftstidene har nå dager per uke og uker per år, og lastene gjelder bare på driftsdager. Normerte verdier for de nye kategoriene er hentet fra publiserte Simien-utskrifter og DiBK-utredninger og kontrollert mot energibudsjettene i de samme kildene. Boligblokk har fått egne verdier i stedet for en kopi av småhus. Balanserte anlegg kan ha kjølebatteri, og varmegjenvinneren reguleres ned når den ellers ville varmet tilluften over settpunktet. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_015GeH3y8fwTaTudaD88P57o
This commit is contained in:
@@ -0,0 +1,64 @@
|
|||||||
|
# Normerte inndata for barnehage.
|
||||||
|
#
|
||||||
|
# NS 3031 Tillegg A er ikke fritt tilgjengelig. Verdiene er hentet fra offentlige
|
||||||
|
# energiberegninger som oppgir tabellverdiene for kategorien, og er kontrollert mot
|
||||||
|
# energibudsjettene i de samme rapportene:
|
||||||
|
# - Rambøll, «Kolstad barnehage – energikonsept» (Mercell, 2019): driftstid 10/5/52,
|
||||||
|
# utstyr 2 W/m², varmtvann 1,6 W/m², personer 6 W/m², «iht. NS 3031 tillegg A,
|
||||||
|
# tab. A.1–A.3, for bygningskategori barnehage». Budsjettet (utstyr 5,2 og varmtvann
|
||||||
|
# 10,0 kWh/m²) stemmer med 261 driftsdager.
|
||||||
|
# - Multiconsult for DiBK, «Grunnlag og forutsetninger for beregnede energirammer»
|
||||||
|
# (13.11.2015): personbelastning 6,0 W/m² i NS 3031.
|
||||||
|
# Belysning: rapporten over brukte passivhusverdien 5 W/m². NS 3031-verdien er ikke
|
||||||
|
# funnet i en offentlig kilde; 8 W/m² er antatt, som for kontor-, kultur- og idrettsbygg.
|
||||||
|
#
|
||||||
|
# Alle effekter i W per m² oppvarmet BRA. Varmtvann er effekt over hele døgnet på
|
||||||
|
# driftsdager, slik Simien oppgir den («effektbehov varmtvann på driftsdager»).
|
||||||
|
|
||||||
|
kategori = "barnehage"
|
||||||
|
kilde = "NS 3031:2014 Tillegg A slik gjengitt i offentlige energiberegninger (Rambøll 2019, Multiconsult/DiBK 2015); belysning antatt"
|
||||||
|
|
||||||
|
[settpunkt]
|
||||||
|
oppvarming = 21.0
|
||||||
|
oppvarming_natt = 19.0 # Rambøll oppgir årsmiddel 19,8 °C, som svarer til nattsenking
|
||||||
|
kjoling = 22.0
|
||||||
|
ventilasjon_tilluft = 19.0
|
||||||
|
|
||||||
|
[driftstid]
|
||||||
|
oppvarming = { start = 7, slutt = 17 } # 10 h
|
||||||
|
belysning = { start = 7, slutt = 17 }
|
||||||
|
utstyr = { start = 7, slutt = 17 }
|
||||||
|
varmtvann = { start = 0, slutt = 24 }
|
||||||
|
personer = { start = 7, slutt = 17 }
|
||||||
|
ventilasjon = { start = 7, slutt = 17 }
|
||||||
|
dager_per_uke = 5
|
||||||
|
uker_per_aar = 52 # 261 driftsdager
|
||||||
|
|
||||||
|
[belysning]
|
||||||
|
effekt = 8.0 # antatt → 20,9 kWh/(m²·år)
|
||||||
|
varmetilskudd = 8.0
|
||||||
|
|
||||||
|
[utstyr]
|
||||||
|
effekt = 2.0 # → 5,2 kWh/(m²·år)
|
||||||
|
varmetilskudd = 2.0
|
||||||
|
|
||||||
|
[varmtvann]
|
||||||
|
effekt = 1.6 # → 10,0 kWh/(m²·år)
|
||||||
|
varmetilskudd = 0.0
|
||||||
|
|
||||||
|
[personer]
|
||||||
|
varmetilskudd = 6.0
|
||||||
|
|
||||||
|
[ventilasjon]
|
||||||
|
luftmengde_driftstid = 10.0 # m³/(h·m²), prosjektverdi i Rambøll-rapporten
|
||||||
|
luftmengde_utenfor_driftstid = 2.0
|
||||||
|
sfp = 1.5
|
||||||
|
temperaturvirkningsgrad = 0.80
|
||||||
|
frostsikring_virkningsgrad = 0.80
|
||||||
|
|
||||||
|
[termisk]
|
||||||
|
varmekapasitet_normalisert = 72.6
|
||||||
|
kuldebroer_normalisert = 0.07
|
||||||
|
|
||||||
|
[pumper]
|
||||||
|
effekt_vannbaaren = 0.5
|
||||||
@@ -1,11 +1,13 @@
|
|||||||
# Normerte inndata for boligblokk.
|
# Normerte inndata for boligblokk.
|
||||||
# Standardverdier fra NS 3031:2014 Tillegg A (Tabell A.3/A.5) slik de også fremgår av Enovas
|
# NS 3031:2014 Tillegg A gir de samme verdiene for boligblokk som for småhus. Det bekreftes
|
||||||
# XML-eksempel for energimerkesystemet. NS 3031:2025 Tillegg A gir timesprofiler over døgnet;
|
# av Simien-utskriften for en boligblokk (Multiconsult 2013, «NS3031, tabell A.1–A.3»):
|
||||||
# eieren av standarden kan legge inn 24-verdiers profiler i feltene `profil_*` nedenfor, som da
|
# belysning 1,95 W/m², utstyr 3,00 W/m² med varmetilskudd 1,80, varmtvann 3,40 W/m² over
|
||||||
# overstyrer driftstidene. Alle effekter i W per m² oppvarmet BRA.
|
# døgnet (29,8 kWh/m²), personer 1,5 W/m², driftstid 16 h og personer/ventilasjon 24 h.
|
||||||
|
# Varmtvann følger småhusverdien fra NS 3031:2025 (25,1 kWh/m²); verdien for boligblokk i
|
||||||
|
# 2025-utgaven er ikke funnet i en offentlig kilde. Alle effekter i W per m² oppvarmet BRA.
|
||||||
|
|
||||||
kategori = "boligblokk"
|
kategori = "boligblokk"
|
||||||
kilde = "NS 3031:2014 Tillegg A (standardverdier); NS 3031:2025-profiler kan legges inn"
|
kilde = "NS 3031:2014 Tillegg A slik gjengitt i Simien-utskrift (Multiconsult 2013); luftmengde fra Multiconsult/DiBK 2014"
|
||||||
|
|
||||||
[settpunkt]
|
[settpunkt]
|
||||||
oppvarming = 21.0 # °C i driftstiden
|
oppvarming = 21.0 # °C i driftstiden
|
||||||
@@ -42,8 +44,8 @@ varmetilskudd = 0.0
|
|||||||
varmetilskudd = 1.5 # W/m² (sensibel varme) i driftstiden
|
varmetilskudd = 1.5 # W/m² (sensibel varme) i driftstiden
|
||||||
|
|
||||||
[ventilasjon]
|
[ventilasjon]
|
||||||
luftmengde_driftstid = 1.2 # m³/(h·m²)
|
luftmengde_driftstid = 1.5 # m³/(h·m²); modellbygget for boligblokk (Multiconsult/DiBK 2014,
|
||||||
luftmengde_utenfor_driftstid = 1.2 # m³/(h·m²)
|
luftmengde_utenfor_driftstid = 1.5 # avsnitt 8.2), svarer til leiligheter på om lag 65 m²
|
||||||
sfp = 1.5 # kW/(m³/s), gjelder mekanisk ventilasjon
|
sfp = 1.5 # kW/(m³/s), gjelder mekanisk ventilasjon
|
||||||
temperaturvirkningsgrad = 0.80 # varmegjenvinner, gjelder balansert ventilasjon
|
temperaturvirkningsgrad = 0.80 # varmegjenvinner, gjelder balansert ventilasjon
|
||||||
frostsikring_virkningsgrad = 0.80
|
frostsikring_virkningsgrad = 0.80
|
||||||
|
|||||||
@@ -0,0 +1,61 @@
|
|||||||
|
# Normerte inndata for idrettsbygg.
|
||||||
|
#
|
||||||
|
# NS 3031 Tillegg A er ikke fritt tilgjengelig. Verdiene er hentet fra to uavhengige,
|
||||||
|
# offentlige Simien-utskrifter for idrettshaller:
|
||||||
|
# - «Energiberegning og evaluering mot energikrav» (Mercell, 31.10.2018), sone
|
||||||
|
# Idrettshall: driftstid 12 h, belysning 8 W/m², utstyr 1 W/m², varmtvann 9,5 W/m²
|
||||||
|
# på driftsdager, personer 10 W/m², luftmengde 8 og 2 m³/(h·m²).
|
||||||
|
# - «Evaluering Energiregler 2016», Gimlehallen (BLOM Arkitekter, 2024): de samme
|
||||||
|
# verdiene for utstyr, varmtvann, personer og luftmengder (belysningen er prosjektverdi).
|
||||||
|
# Begge budsjettene (varmtvann 50,2 og utstyr 2,6 kWh/m²) svarer til 220 driftsdager,
|
||||||
|
# altså 5 dager i 44 uker. Begge utskriftene oppgir settpunkt 18,0 °C.
|
||||||
|
#
|
||||||
|
# Alle effekter i W per m² oppvarmet BRA. Varmtvann er effekt over hele døgnet på driftsdager.
|
||||||
|
|
||||||
|
kategori = "idrettsbygg"
|
||||||
|
kilde = "NS 3031:2014 Tillegg A slik gjengitt i to offentlige Simien-utskrifter (2018, 2024)"
|
||||||
|
|
||||||
|
[settpunkt]
|
||||||
|
oppvarming = 18.0
|
||||||
|
oppvarming_natt = 18.0 # utskriftene oppgir 18,0 °C som årsmiddel
|
||||||
|
kjoling = 22.0
|
||||||
|
ventilasjon_tilluft = 18.0
|
||||||
|
|
||||||
|
[driftstid]
|
||||||
|
oppvarming = { start = 8, slutt = 20 } # 12 h
|
||||||
|
belysning = { start = 8, slutt = 20 }
|
||||||
|
utstyr = { start = 8, slutt = 20 }
|
||||||
|
varmtvann = { start = 0, slutt = 24 }
|
||||||
|
personer = { start = 8, slutt = 20 }
|
||||||
|
ventilasjon = { start = 8, slutt = 20 }
|
||||||
|
dager_per_uke = 5
|
||||||
|
uker_per_aar = 44 # 220 driftsdager
|
||||||
|
|
||||||
|
[belysning]
|
||||||
|
effekt = 8.0 # → 21,1 kWh/(m²·år)
|
||||||
|
varmetilskudd = 8.0
|
||||||
|
|
||||||
|
[utstyr]
|
||||||
|
effekt = 1.0 # → 2,6 kWh/(m²·år)
|
||||||
|
varmetilskudd = 1.0
|
||||||
|
|
||||||
|
[varmtvann]
|
||||||
|
effekt = 9.5 # → 50,2 kWh/(m²·år)
|
||||||
|
varmetilskudd = 0.0
|
||||||
|
|
||||||
|
[personer]
|
||||||
|
varmetilskudd = 10.0
|
||||||
|
|
||||||
|
[ventilasjon]
|
||||||
|
luftmengde_driftstid = 8.0 # m³/(h·m²)
|
||||||
|
luftmengde_utenfor_driftstid = 2.0
|
||||||
|
sfp = 1.5
|
||||||
|
temperaturvirkningsgrad = 0.80
|
||||||
|
frostsikring_virkningsgrad = 0.80
|
||||||
|
|
||||||
|
[termisk]
|
||||||
|
varmekapasitet_normalisert = 72.6
|
||||||
|
kuldebroer_normalisert = 0.07
|
||||||
|
|
||||||
|
[pumper]
|
||||||
|
effekt_vannbaaren = 0.5
|
||||||
@@ -0,0 +1,63 @@
|
|||||||
|
# Normerte inndata for kontorbygg.
|
||||||
|
#
|
||||||
|
# NS 3031 Tillegg A er ikke fritt tilgjengelig. Verdiene er hentet fra offentlige kilder:
|
||||||
|
# - Multiconsult for DiBK, «Konsekvensvurdering av Energiregler 2015» (11.12.2014),
|
||||||
|
# avsnitt 7.1 og 8.2: belysning 8 W/m² og veiledende luftmengde 10 m³/(h·m²) etter
|
||||||
|
# NS 3031 tabell A1 og B1.
|
||||||
|
# - Simien-utskrift «Passivhusevaluering», kontorbygg (Mercell): driftstid 12 h,
|
||||||
|
# varmtvann 0,80 W/m² på driftsdager, personer 4 W/m². Personbelastningen og
|
||||||
|
# driftstiden er de samme som i NS 3031; belysning og utstyr er passivhusverdier.
|
||||||
|
# - Utstyr 11 W/m²: Simien-evaluering for et kontorbygg (Asplan Viak 2019, FutureBuilt).
|
||||||
|
# Bare søkeutdraget er lest; fulltekstdokumentet var ikke tilgjengelig.
|
||||||
|
# - NVE, «Praktisk veileder for energimerking» (2013): kontorbygg har driftstid 5 dager
|
||||||
|
# i 52 uker.
|
||||||
|
#
|
||||||
|
# Alle effekter i W per m² oppvarmet BRA. Varmtvann er effekt over hele døgnet på driftsdager.
|
||||||
|
|
||||||
|
kategori = "kontorbygg"
|
||||||
|
kilde = "NS 3031:2014 Tillegg A slik gjengitt i offentlige kilder (Multiconsult/DiBK 2014, Simien-utskrifter); utstyr ikke verifisert i fulltekst"
|
||||||
|
|
||||||
|
[settpunkt]
|
||||||
|
oppvarming = 21.0
|
||||||
|
oppvarming_natt = 19.0
|
||||||
|
kjoling = 22.0
|
||||||
|
ventilasjon_tilluft = 19.0
|
||||||
|
|
||||||
|
[driftstid]
|
||||||
|
oppvarming = { start = 7, slutt = 19 } # 12 h
|
||||||
|
belysning = { start = 7, slutt = 19 }
|
||||||
|
utstyr = { start = 7, slutt = 19 }
|
||||||
|
varmtvann = { start = 0, slutt = 24 }
|
||||||
|
personer = { start = 7, slutt = 19 }
|
||||||
|
ventilasjon = { start = 7, slutt = 19 }
|
||||||
|
dager_per_uke = 5
|
||||||
|
uker_per_aar = 52 # 261 driftsdager
|
||||||
|
|
||||||
|
[belysning]
|
||||||
|
effekt = 8.0 # → 25,1 kWh/(m²·år)
|
||||||
|
varmetilskudd = 8.0
|
||||||
|
|
||||||
|
[utstyr]
|
||||||
|
effekt = 11.0 # → 34,5 kWh/(m²·år)
|
||||||
|
varmetilskudd = 11.0
|
||||||
|
|
||||||
|
[varmtvann]
|
||||||
|
effekt = 0.8 # → 5,0 kWh/(m²·år)
|
||||||
|
varmetilskudd = 0.0
|
||||||
|
|
||||||
|
[personer]
|
||||||
|
varmetilskudd = 4.0
|
||||||
|
|
||||||
|
[ventilasjon]
|
||||||
|
luftmengde_driftstid = 10.0 # m³/(h·m²), NS 3031 tabell B1 (veiledende)
|
||||||
|
luftmengde_utenfor_driftstid = 2.0 # som i Simien-utskriftene for yrkesbygg
|
||||||
|
sfp = 1.5
|
||||||
|
temperaturvirkningsgrad = 0.80
|
||||||
|
frostsikring_virkningsgrad = 0.80
|
||||||
|
|
||||||
|
[termisk]
|
||||||
|
varmekapasitet_normalisert = 72.6
|
||||||
|
kuldebroer_normalisert = 0.07
|
||||||
|
|
||||||
|
[pumper]
|
||||||
|
effekt_vannbaaren = 0.5
|
||||||
@@ -0,0 +1,59 @@
|
|||||||
|
# Normerte inndata for kulturbygg.
|
||||||
|
#
|
||||||
|
# NS 3031 Tillegg A er ikke fritt tilgjengelig. Verdiene er hentet fra COWI,
|
||||||
|
# «Energikonsept Kystens Arv» (Mercell), tabell 7 «Standardverdier for internlaster etter
|
||||||
|
# NS 3031» og Simien-utskriften i samme rapport: belysning 8 W/m², utstyr 1 W/m²,
|
||||||
|
# varmtvann 1,6 W/m² på driftsdager og personer 3,2 W/m², luftmengde 10 og 2 m³/(h·m²).
|
||||||
|
# Rapporten skriver driftstid 12/5/52, men Simien-utskriften har 11 h, og energibehovene
|
||||||
|
# i tabell 7 (belysning 23, utstyr 2,9 og varmtvann 10 kWh/m²) stemmer med 11 h i
|
||||||
|
# 261 driftsdager.
|
||||||
|
#
|
||||||
|
# Alle effekter i W per m² oppvarmet BRA. Varmtvann er effekt over hele døgnet på driftsdager.
|
||||||
|
|
||||||
|
kategori = "kulturbygg"
|
||||||
|
kilde = "NS 3031:2014 Tillegg A slik gjengitt i COWI, Energikonsept Kystens Arv"
|
||||||
|
|
||||||
|
[settpunkt]
|
||||||
|
oppvarming = 21.0
|
||||||
|
oppvarming_natt = 19.0 # utskriften oppgir årsmiddel 19,9 °C
|
||||||
|
kjoling = 22.0
|
||||||
|
ventilasjon_tilluft = 19.0
|
||||||
|
|
||||||
|
[driftstid]
|
||||||
|
oppvarming = { start = 10, slutt = 21 } # 11 h
|
||||||
|
belysning = { start = 10, slutt = 21 }
|
||||||
|
utstyr = { start = 10, slutt = 21 }
|
||||||
|
varmtvann = { start = 0, slutt = 24 }
|
||||||
|
personer = { start = 10, slutt = 21 }
|
||||||
|
ventilasjon = { start = 10, slutt = 21 }
|
||||||
|
dager_per_uke = 5
|
||||||
|
uker_per_aar = 52 # 261 driftsdager
|
||||||
|
|
||||||
|
[belysning]
|
||||||
|
effekt = 8.0 # → 23,0 kWh/(m²·år)
|
||||||
|
varmetilskudd = 8.0
|
||||||
|
|
||||||
|
[utstyr]
|
||||||
|
effekt = 1.0 # → 2,9 kWh/(m²·år)
|
||||||
|
varmetilskudd = 1.0
|
||||||
|
|
||||||
|
[varmtvann]
|
||||||
|
effekt = 1.6 # → 10,0 kWh/(m²·år)
|
||||||
|
varmetilskudd = 0.0
|
||||||
|
|
||||||
|
[personer]
|
||||||
|
varmetilskudd = 3.2
|
||||||
|
|
||||||
|
[ventilasjon]
|
||||||
|
luftmengde_driftstid = 10.0 # m³/(h·m²)
|
||||||
|
luftmengde_utenfor_driftstid = 2.0
|
||||||
|
sfp = 1.5
|
||||||
|
temperaturvirkningsgrad = 0.80
|
||||||
|
frostsikring_virkningsgrad = 0.80
|
||||||
|
|
||||||
|
[termisk]
|
||||||
|
varmekapasitet_normalisert = 72.6
|
||||||
|
kuldebroer_normalisert = 0.07
|
||||||
|
|
||||||
|
[pumper]
|
||||||
|
effekt_vannbaaren = 0.5
|
||||||
@@ -0,0 +1,58 @@
|
|||||||
|
# Normerte inndata for skolebygg.
|
||||||
|
#
|
||||||
|
# NS 3031 Tillegg A er ikke fritt tilgjengelig. Verdiene er hentet fra en offentlig
|
||||||
|
# Simien-utskrift, «Energiberegning og evaluering mot energikrav» for en skole
|
||||||
|
# (Mercell, 31.10.2018), sonene for arbeidsrom og klasserom: driftstid 10 h, belysning
|
||||||
|
# 10 W/m², utstyr 6 W/m², varmtvann 1,9 W/m² på driftsdager og personer 12 W/m².
|
||||||
|
# Budsjettet i rapporten (varmtvann 10,0 kWh/m²) svarer til 220 driftsdager, altså
|
||||||
|
# 5 dager i 44 uker.
|
||||||
|
#
|
||||||
|
# Alle effekter i W per m² oppvarmet BRA. Varmtvann er effekt over hele døgnet på driftsdager.
|
||||||
|
|
||||||
|
kategori = "skolebygg"
|
||||||
|
kilde = "NS 3031:2014 Tillegg A slik gjengitt i en offentlig Simien-utskrift (2018)"
|
||||||
|
|
||||||
|
[settpunkt]
|
||||||
|
oppvarming = 21.0
|
||||||
|
oppvarming_natt = 19.0 # utskriften oppgir årsmiddel 19,8 °C
|
||||||
|
kjoling = 22.0
|
||||||
|
ventilasjon_tilluft = 19.0
|
||||||
|
|
||||||
|
[driftstid]
|
||||||
|
oppvarming = { start = 8, slutt = 18 } # 10 h
|
||||||
|
belysning = { start = 8, slutt = 18 }
|
||||||
|
utstyr = { start = 8, slutt = 18 }
|
||||||
|
varmtvann = { start = 0, slutt = 24 }
|
||||||
|
personer = { start = 8, slutt = 18 }
|
||||||
|
ventilasjon = { start = 8, slutt = 18 }
|
||||||
|
dager_per_uke = 5
|
||||||
|
uker_per_aar = 44 # 220 driftsdager
|
||||||
|
|
||||||
|
[belysning]
|
||||||
|
effekt = 10.0 # → 22,0 kWh/(m²·år)
|
||||||
|
varmetilskudd = 10.0
|
||||||
|
|
||||||
|
[utstyr]
|
||||||
|
effekt = 6.0 # → 13,2 kWh/(m²·år)
|
||||||
|
varmetilskudd = 6.0
|
||||||
|
|
||||||
|
[varmtvann]
|
||||||
|
effekt = 1.9 # → 10,0 kWh/(m²·år)
|
||||||
|
varmetilskudd = 0.0
|
||||||
|
|
||||||
|
[personer]
|
||||||
|
varmetilskudd = 12.0
|
||||||
|
|
||||||
|
[ventilasjon]
|
||||||
|
luftmengde_driftstid = 10.0 # m³/(h·m²)
|
||||||
|
luftmengde_utenfor_driftstid = 2.0
|
||||||
|
sfp = 1.5
|
||||||
|
temperaturvirkningsgrad = 0.80
|
||||||
|
frostsikring_virkningsgrad = 0.80
|
||||||
|
|
||||||
|
[termisk]
|
||||||
|
varmekapasitet_normalisert = 72.6
|
||||||
|
kuldebroer_normalisert = 0.07
|
||||||
|
|
||||||
|
[pumper]
|
||||||
|
effekt_vannbaaren = 0.5
|
||||||
+45
-2
@@ -14,6 +14,11 @@ const MATERIALER: &str = include_str!("../data/materialer.toml");
|
|||||||
const KLIMAKORREKSJON: &str = include_str!("../data/klimakorreksjon.csv");
|
const KLIMAKORREKSJON: &str = include_str!("../data/klimakorreksjon.csv");
|
||||||
const NORMERTE_SMAAHUS: &str = include_str!("../data/normerte/smaahus.toml");
|
const NORMERTE_SMAAHUS: &str = include_str!("../data/normerte/smaahus.toml");
|
||||||
const NORMERTE_BOLIGBLOKK: &str = include_str!("../data/normerte/boligblokk.toml");
|
const NORMERTE_BOLIGBLOKK: &str = include_str!("../data/normerte/boligblokk.toml");
|
||||||
|
const NORMERTE_BARNEHAGE: &str = include_str!("../data/normerte/barnehage.toml");
|
||||||
|
const NORMERTE_KONTORBYGG: &str = include_str!("../data/normerte/kontorbygg.toml");
|
||||||
|
const NORMERTE_SKOLEBYGG: &str = include_str!("../data/normerte/skolebygg.toml");
|
||||||
|
const NORMERTE_IDRETTSBYGG: &str = include_str!("../data/normerte/idrettsbygg.toml");
|
||||||
|
const NORMERTE_KULTURBYGG: &str = include_str!("../data/normerte/kulturbygg.toml");
|
||||||
|
|
||||||
/// Katalog som kan overstyre de innebygde datafilene.
|
/// Katalog som kan overstyre de innebygde datafilene.
|
||||||
#[derive(Clone, Debug, Default)]
|
#[derive(Clone, Debug, Default)]
|
||||||
@@ -63,8 +68,13 @@ impl Datakilde {
|
|||||||
let (fil, innebygd) = match kategori {
|
let (fil, innebygd) = match kategori {
|
||||||
Kategori::Smaahus => ("normerte/smaahus.toml", NORMERTE_SMAAHUS),
|
Kategori::Smaahus => ("normerte/smaahus.toml", NORMERTE_SMAAHUS),
|
||||||
Kategori::Boligblokk => ("normerte/boligblokk.toml", NORMERTE_BOLIGBLOKK),
|
Kategori::Boligblokk => ("normerte/boligblokk.toml", NORMERTE_BOLIGBLOKK),
|
||||||
|
Kategori::Barnehage => ("normerte/barnehage.toml", NORMERTE_BARNEHAGE),
|
||||||
|
Kategori::Kontorbygg => ("normerte/kontorbygg.toml", NORMERTE_KONTORBYGG),
|
||||||
|
Kategori::Skolebygg => ("normerte/skolebygg.toml", NORMERTE_SKOLEBYGG),
|
||||||
|
Kategori::Idrettsbygg => ("normerte/idrettsbygg.toml", NORMERTE_IDRETTSBYGG),
|
||||||
|
Kategori::Kulturbygg => ("normerte/kulturbygg.toml", NORMERTE_KULTURBYGG),
|
||||||
annen => {
|
annen => {
|
||||||
// Andre kategorier krever egen datafil i data-katalogen.
|
// Kategorier uten offentlig tilgjengelige normerte verdier krever egen datafil.
|
||||||
let fil = format!("normerte/{}.toml", annen.nokkel());
|
let fil = format!("normerte/{}.toml", annen.nokkel());
|
||||||
let p = self
|
let p = self
|
||||||
.katalog
|
.katalog
|
||||||
@@ -257,9 +267,12 @@ pub struct Settpunkt {
|
|||||||
pub oppvarming_natt: f64,
|
pub oppvarming_natt: f64,
|
||||||
pub kjoling: f64,
|
pub kjoling: f64,
|
||||||
pub ventilasjon_tilluft: f64,
|
pub ventilasjon_tilluft: f64,
|
||||||
|
/// Tilluftstemperatur når anlegget har kjølebatteri. Utelatt: lik `ventilasjon_tilluft`.
|
||||||
|
#[serde(default)]
|
||||||
|
pub ventilasjon_tilluft_kjoling: Option<f64>,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Deserialize, Clone, Debug)]
|
#[derive(Deserialize, serde::Serialize, Clone, Debug)]
|
||||||
pub struct Driftstider {
|
pub struct Driftstider {
|
||||||
pub oppvarming: Tidsrom,
|
pub oppvarming: Tidsrom,
|
||||||
pub belysning: Tidsrom,
|
pub belysning: Tidsrom,
|
||||||
@@ -267,13 +280,43 @@ pub struct Driftstider {
|
|||||||
pub varmtvann: Tidsrom,
|
pub varmtvann: Tidsrom,
|
||||||
pub personer: Tidsrom,
|
pub personer: Tidsrom,
|
||||||
pub ventilasjon: Tidsrom,
|
pub ventilasjon: Tidsrom,
|
||||||
|
/// Driftsdager per uke, regnet fra mandag (NS 3031 Tabell A.3).
|
||||||
#[serde(default = "sju")]
|
#[serde(default = "sju")]
|
||||||
pub dager_per_uke: u8,
|
pub dager_per_uke: u8,
|
||||||
|
/// Driftsuker per år (NS 3031 Tabell A.3). Ukene uten drift legges i ferier, se [`FERIEUKER`].
|
||||||
|
#[serde(default = "femtito")]
|
||||||
|
pub uker_per_aar: u8,
|
||||||
}
|
}
|
||||||
|
|
||||||
fn sju() -> u8 {
|
fn sju() -> u8 {
|
||||||
7
|
7
|
||||||
}
|
}
|
||||||
|
fn femtito() -> u8 {
|
||||||
|
52
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Uker uten drift, i den rekkefølgen de tas ut når en kategori har færre enn 52 driftsuker:
|
||||||
|
/// fellesferien først, deretter jul, vinterferie, påske og høstferie, og så uke for uke
|
||||||
|
/// utover sommeren og nyttår.
|
||||||
|
pub const FERIEUKER: [u8; 16] = [28, 29, 30, 31, 27, 32, 52, 8, 14, 40, 26, 33, 1, 25, 34, 9];
|
||||||
|
|
||||||
|
impl Driftstider {
|
||||||
|
/// Om døgn nummer `dag` (0 = 1. januar) er en driftsdag.
|
||||||
|
///
|
||||||
|
/// Året regnes å begynne på en mandag. Døgn 364 hører til uke 52.
|
||||||
|
pub fn driftsdag(&self, dag: usize) -> bool {
|
||||||
|
if dag % 7 >= self.dager_per_uke.min(7) as usize {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
let uke = (dag / 7 + 1).min(52) as u8;
|
||||||
|
let fri = (52u8.saturating_sub(self.uker_per_aar) as usize).min(FERIEUKER.len());
|
||||||
|
!FERIEUKER[..fri].contains(&uke)
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn driftsdager_per_aar(&self) -> usize {
|
||||||
|
(0..365).filter(|&d| self.driftsdag(d)).count()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#[derive(Deserialize, serde::Serialize, Clone, Copy, Debug)]
|
#[derive(Deserialize, serde::Serialize, Clone, Copy, Debug)]
|
||||||
pub struct Tidsrom {
|
pub struct Tidsrom {
|
||||||
|
|||||||
@@ -84,6 +84,8 @@ pub fn fra_tekst(tekst: &str, standardnavn: &str) -> Result<Importrapport> {
|
|||||||
"kontorbygg" | "kontor" => Kategori::Kontorbygg,
|
"kontorbygg" | "kontor" => Kategori::Kontorbygg,
|
||||||
"skolebygg" | "skole" => Kategori::Skolebygg,
|
"skolebygg" | "skole" => Kategori::Skolebygg,
|
||||||
"barnehage" => Kategori::Barnehage,
|
"barnehage" => Kategori::Barnehage,
|
||||||
|
"idrettsbygg" | "idrett" => Kategori::Idrettsbygg,
|
||||||
|
"kulturbygg" | "kultur" => Kategori::Kulturbygg,
|
||||||
annen => {
|
annen => {
|
||||||
merknader
|
merknader
|
||||||
.push(format!("Ukjent bygningskategori «{annen}»; bruker småhus."));
|
.push(format!("Ukjent bygningskategori «{annen}»; bruker småhus."));
|
||||||
|
|||||||
+41
-8
@@ -130,6 +130,8 @@ pub struct LostVentilasjon {
|
|||||||
pub sfp: f64,
|
pub sfp: f64,
|
||||||
pub varmebatteri: bool,
|
pub varmebatteri: bool,
|
||||||
pub tilluft_settpunkt: f64,
|
pub tilluft_settpunkt: f64,
|
||||||
|
/// Kjølebatteri: tilluften holdes på denne temperaturen i driftstiden.
|
||||||
|
pub tilluft_kjoling: Option<f64>,
|
||||||
pub driftstid: crate::data::Tidsrom,
|
pub driftstid: crate::data::Tidsrom,
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -142,7 +144,15 @@ pub struct LostLaster {
|
|||||||
pub personer: [f64; 24],
|
pub personer: [f64; 24],
|
||||||
pub varmtvann: [f64; 24],
|
pub varmtvann: [f64; 24],
|
||||||
pub pumper: [f64; 24],
|
pub pumper: [f64; 24],
|
||||||
pub oppvarming_driftstid: crate::data::Tidsrom,
|
/// Driftstider med driftsdager og driftsuker. Profilene over gjelder bare på driftsdager.
|
||||||
|
pub driftstider: crate::data::Driftstider,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl LostLaster {
|
||||||
|
/// Om time `t` i året faller på en driftsdag.
|
||||||
|
pub fn driftsdag(&self, t: usize) -> bool {
|
||||||
|
self.driftstider.driftsdag(t / 24)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const R_SI: f64 = 0.13;
|
const R_SI: f64 = 0.13;
|
||||||
@@ -326,7 +336,10 @@ impl Lost {
|
|||||||
let innvendig_varmekapasitet = b.drift.innvendig_varmekapasitet.unwrap_or(10_000.0);
|
let innvendig_varmekapasitet = b.drift.innvendig_varmekapasitet.unwrap_or(10_000.0);
|
||||||
|
|
||||||
// Vinduslufting brukes når bygningen ikke har kjøleanlegg.
|
// Vinduslufting brukes når bygningen ikke har kjøleanlegg.
|
||||||
let lufting = if b.lufting.ingen || settpunkt_kjoling.is_some() {
|
let lufting = if b.lufting.ingen
|
||||||
|
|| settpunkt_kjoling.is_some()
|
||||||
|
|| ventilasjon.tilluft_kjoling.is_some()
|
||||||
|
{
|
||||||
None
|
None
|
||||||
} else {
|
} else {
|
||||||
// Uten oppgitt grense brukes den normerte settpunkttemperaturen for kjøling.
|
// Uten oppgitt grense brukes den normerte settpunkttemperaturen for kjøling.
|
||||||
@@ -724,6 +737,22 @@ fn los_ventilasjon(v: &Ventilasjon, n: &Normerte, logg: &mut Vec<Forutsetning>)
|
|||||||
let varmebatteri = v
|
let varmebatteri = v
|
||||||
.varmebatteri
|
.varmebatteri
|
||||||
.unwrap_or(matches!(v.typ, VentilasjonType::Balansert));
|
.unwrap_or(matches!(v.typ, VentilasjonType::Balansert));
|
||||||
|
// Kjølebatteriet holder konstant tilluftstemperatur i driftstiden, slik DiBKs modellbygg
|
||||||
|
// for energirammene er regnet (Multiconsult 2014, avsnitt 7.3).
|
||||||
|
let tilluft_kjoling = (v.kjolebatteri == Some(true)).then(|| {
|
||||||
|
v.tilluft_kjoling.unwrap_or_else(|| {
|
||||||
|
let t = n
|
||||||
|
.settpunkt
|
||||||
|
.ventilasjon_tilluft_kjoling
|
||||||
|
.unwrap_or(n.settpunkt.ventilasjon_tilluft);
|
||||||
|
logg.push(Forutsetning {
|
||||||
|
felt: "ventilasjon.tilluft_kjoling".into(),
|
||||||
|
verdi: format!("{t:.0} °C"),
|
||||||
|
kilde: format!("normert tilluftstemperatur, {}", n.kilde),
|
||||||
|
});
|
||||||
|
t
|
||||||
|
})
|
||||||
|
});
|
||||||
LostVentilasjon {
|
LostVentilasjon {
|
||||||
typ: v.typ,
|
typ: v.typ,
|
||||||
luftmengde,
|
luftmengde,
|
||||||
@@ -732,6 +761,7 @@ fn los_ventilasjon(v: &Ventilasjon, n: &Normerte, logg: &mut Vec<Forutsetning>)
|
|||||||
sfp,
|
sfp,
|
||||||
varmebatteri,
|
varmebatteri,
|
||||||
tilluft_settpunkt: n.settpunkt.ventilasjon_tilluft,
|
tilluft_settpunkt: n.settpunkt.ventilasjon_tilluft,
|
||||||
|
tilluft_kjoling,
|
||||||
driftstid: n.driftstid.ventilasjon,
|
driftstid: n.driftstid.ventilasjon,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -754,9 +784,11 @@ fn los_laster(b: &Bygning, n: &Normerte, logg: &mut Vec<Forutsetning>) -> LostLa
|
|||||||
logg.push(Forutsetning {
|
logg.push(Forutsetning {
|
||||||
felt: "belysning".into(),
|
felt: "belysning".into(),
|
||||||
verdi: format!(
|
verdi: format!(
|
||||||
"{:.2} W/m² i {:.0} h/døgn",
|
"{:.2} W/m² i {:.0} h/døgn, {} dager/uke, {} uker/år",
|
||||||
n.belysning.effekt,
|
n.belysning.effekt,
|
||||||
n.driftstid.belysning.timer()
|
n.driftstid.belysning.timer(),
|
||||||
|
n.driftstid.dager_per_uke,
|
||||||
|
n.driftstid.uker_per_aar
|
||||||
),
|
),
|
||||||
kilde: format!("normert, {}", n.kilde),
|
kilde: format!("normert, {}", n.kilde),
|
||||||
});
|
});
|
||||||
@@ -772,16 +804,17 @@ fn los_laster(b: &Bygning, n: &Normerte, logg: &mut Vec<Forutsetning>) -> LostLa
|
|||||||
.drift
|
.drift
|
||||||
.personer_varmetilskudd
|
.personer_varmetilskudd
|
||||||
.unwrap_or(n.personer.varmetilskudd);
|
.unwrap_or(n.personer.varmetilskudd);
|
||||||
|
let driftsdager = n.driftstid.driftsdager_per_aar() as f64;
|
||||||
let tappevann = b.tappevann.energibehov.map(|kwh| {
|
let tappevann = b.tappevann.energibehov.map(|kwh| {
|
||||||
// kWh/(m²·år) → W/m² i driftstiden.
|
// kWh/(m²·år) → W/m² i driftstiden på driftsdager.
|
||||||
kwh * 1000.0 / (365.0 * n.driftstid.varmtvann.timer())
|
kwh * 1000.0 / (driftsdager * n.driftstid.varmtvann.timer())
|
||||||
});
|
});
|
||||||
let vv = tappevann.unwrap_or_else(|| {
|
let vv = tappevann.unwrap_or_else(|| {
|
||||||
logg.push(Forutsetning {
|
logg.push(Forutsetning {
|
||||||
felt: "tappevann.energibehov".into(),
|
felt: "tappevann.energibehov".into(),
|
||||||
verdi: format!(
|
verdi: format!(
|
||||||
"{:.1} kWh/(m²·år)",
|
"{:.1} kWh/(m²·år)",
|
||||||
n.varmtvann.effekt * n.driftstid.varmtvann.timer() * 365.0 / 1000.0
|
n.varmtvann.effekt * n.driftstid.varmtvann.timer() * driftsdager / 1000.0
|
||||||
),
|
),
|
||||||
kilde: format!("normert, {}", n.kilde),
|
kilde: format!("normert, {}", n.kilde),
|
||||||
});
|
});
|
||||||
@@ -801,6 +834,6 @@ fn los_laster(b: &Bygning, n: &Normerte, logg: &mut Vec<Forutsetning>) -> LostLa
|
|||||||
personer: profil(personer, n.driftstid.personer, n.profil_personer),
|
personer: profil(personer, n.driftstid.personer, n.profil_personer),
|
||||||
varmtvann: profil(vv, n.driftstid.varmtvann, n.profil_varmtvann),
|
varmtvann: profil(vv, n.driftstid.varmtvann, n.profil_varmtvann),
|
||||||
pumper: profil(pumpeeffekt, n.driftstid.oppvarming, None),
|
pumper: profil(pumpeeffekt, n.driftstid.oppvarming, None),
|
||||||
oppvarming_driftstid: n.driftstid.oppvarming,
|
driftstider: n.driftstid.clone(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -397,6 +397,12 @@ pub struct Ventilasjon {
|
|||||||
/// Har anlegget varmebatteri som ettervarmer tilluften?
|
/// Har anlegget varmebatteri som ettervarmer tilluften?
|
||||||
#[serde(default, skip_serializing_if = "Option::is_none")]
|
#[serde(default, skip_serializing_if = "Option::is_none")]
|
||||||
pub varmebatteri: Option<bool>,
|
pub varmebatteri: Option<bool>,
|
||||||
|
/// Har anlegget kjølebatteri? Tilluften holdes da på `tilluft_kjoling` i driftstiden.
|
||||||
|
#[serde(default, skip_serializing_if = "Option::is_none")]
|
||||||
|
pub kjolebatteri: Option<bool>,
|
||||||
|
/// Tilluftstemperatur med kjølebatteri, °C. Utelatt: normert.
|
||||||
|
#[serde(default, skip_serializing_if = "Option::is_none")]
|
||||||
|
pub tilluft_kjoling: Option<f64>,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Deserialize, Serialize, Clone, Copy, Debug, PartialEq, Eq, Default)]
|
#[derive(Deserialize, Serialize, Clone, Copy, Debug, PartialEq, Eq, Default)]
|
||||||
|
|||||||
+22
-11
@@ -188,17 +188,20 @@ pub fn simuler(l: &Lost, v: &Vaerdata, tilskudd: Systemtilskudd) -> Result<Times
|
|||||||
}
|
}
|
||||||
for t in timer {
|
for t in timer {
|
||||||
let klokke = t % 24;
|
let klokke = t % 24;
|
||||||
|
let driftsdag = l.laster.driftsdag(t);
|
||||||
let t_ute = v.t_ute[t];
|
let t_ute = v.t_ute[t];
|
||||||
let t_himmel = sol::himmeltemperatur(v, t);
|
let t_himmel = sol::himmeltemperatur(v, t);
|
||||||
|
|
||||||
// ── laster ──────────────────────────────────────────────
|
// ── laster ──────────────────────────────────────────────
|
||||||
let bel = l.laster.belysning[klokke] * l.bra;
|
// Lastprofilene gjelder driftsdager; på andre dager er bygningen ute av bruk.
|
||||||
let utstyr_el = l.laster.utstyr_effekt[klokke] * l.bra;
|
let skala = if driftsdag { l.bra } else { 0.0 };
|
||||||
let utstyr_varme = l.laster.utstyr_varme[klokke] * l.bra;
|
let bel = l.laster.belysning[klokke] * skala;
|
||||||
let personer = l.laster.personer[klokke] * l.bra;
|
let utstyr_el = l.laster.utstyr_effekt[klokke] * skala;
|
||||||
let vv = l.laster.varmtvann[klokke] * l.bra;
|
let utstyr_varme = l.laster.utstyr_varme[klokke] * skala;
|
||||||
let pumper = l.laster.pumper[klokke] * l.bra;
|
let personer = l.laster.personer[klokke] * skala;
|
||||||
let vifter = ventilasjon::vifteeffekt(l, klokke);
|
let vv = l.laster.varmtvann[klokke] * skala;
|
||||||
|
let pumper = l.laster.pumper[klokke] * skala;
|
||||||
|
let vifter = ventilasjon::vifteeffekt(l, t);
|
||||||
// Vifteeffekten ender som varme i lufta (ISO 52016-1: hele SFP-effekten).
|
// Vifteeffekten ender som varme i lufta (ISO 52016-1: hele SFP-effekten).
|
||||||
let internlast = bel + utstyr_varme + personer + tilskudd.tappevann + vifter;
|
let internlast = bel + utstyr_varme + personer + tilskudd.tappevann + vifter;
|
||||||
|
|
||||||
@@ -211,21 +214,28 @@ pub fn simuler(l: &Lost, v: &Vaerdata, tilskudd: Systemtilskudd) -> Result<Times
|
|||||||
}
|
}
|
||||||
|
|
||||||
// ── ventilasjon ─────────────────────────────────────────
|
// ── ventilasjon ─────────────────────────────────────────
|
||||||
let q_vent = ventilasjon::luftmengde(l, klokke);
|
let q_vent = ventilasjon::luftmengde(l, t);
|
||||||
let h_ve = q_vent * RHO_C_LUFT;
|
let h_ve = q_vent * RHO_C_LUFT;
|
||||||
let t_sup_hx = ventilasjon::tilluftstemperatur(l, t_ute, t_a_forrige);
|
let t_sup_hx = ventilasjon::tilluftstemperatur(l, t_ute, t_a_forrige);
|
||||||
let (t_sup, vent_varme) =
|
let kjol_tilluft = l
|
||||||
|
.ventilasjon
|
||||||
|
.tilluft_kjoling
|
||||||
|
.filter(|&k| ventilasjon::i_drift(l, t) && t_sup_hx > k);
|
||||||
|
let (t_sup, vent_varme, vent_kjol) =
|
||||||
if l.ventilasjon.varmebatteri && t_sup_hx < l.ventilasjon.tilluft_settpunkt {
|
if l.ventilasjon.varmebatteri && t_sup_hx < l.ventilasjon.tilluft_settpunkt {
|
||||||
(
|
(
|
||||||
l.ventilasjon.tilluft_settpunkt,
|
l.ventilasjon.tilluft_settpunkt,
|
||||||
h_ve * (l.ventilasjon.tilluft_settpunkt - t_sup_hx),
|
h_ve * (l.ventilasjon.tilluft_settpunkt - t_sup_hx),
|
||||||
|
0.0,
|
||||||
)
|
)
|
||||||
|
} else if let Some(k) = kjol_tilluft {
|
||||||
|
(k, 0.0, h_ve * (t_sup_hx - k))
|
||||||
} else {
|
} else {
|
||||||
(t_sup_hx, 0.0)
|
(t_sup_hx, 0.0, 0.0)
|
||||||
};
|
};
|
||||||
|
|
||||||
// ── settpunkt ───────────────────────────────────────────
|
// ── settpunkt ───────────────────────────────────────────
|
||||||
let sett_varme = if l.laster.oppvarming_driftstid.aktiv(klokke) {
|
let sett_varme = if driftsdag && l.laster.driftstider.oppvarming.aktiv(klokke) {
|
||||||
l.settpunkt_oppvarming
|
l.settpunkt_oppvarming
|
||||||
} else {
|
} else {
|
||||||
l.settpunkt_natt
|
l.settpunkt_natt
|
||||||
@@ -339,6 +349,7 @@ pub fn simuler(l: &Lost, v: &Vaerdata, tilskudd: Systemtilskudd) -> Result<Times
|
|||||||
ts.romoppvarming[t] = fi.max(0.0);
|
ts.romoppvarming[t] = fi.max(0.0);
|
||||||
ts.romkjoling[t] = (-fi).max(0.0);
|
ts.romkjoling[t] = (-fi).max(0.0);
|
||||||
ts.ventilasjonsvarme[t] = vent_varme;
|
ts.ventilasjonsvarme[t] = vent_varme;
|
||||||
|
ts.ventilasjonskjoling[t] = vent_kjol;
|
||||||
ts.varmtvann[t] = vv;
|
ts.varmtvann[t] = vv;
|
||||||
ts.vifter[t] = vifter;
|
ts.vifter[t] = vifter;
|
||||||
ts.pumper[t] = pumper;
|
ts.pumper[t] = pumper;
|
||||||
|
|||||||
@@ -33,9 +33,14 @@ pub fn infiltrasjonsluftmengde(l: &Lost) -> f64 {
|
|||||||
n_inf * v
|
n_inf * v
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Ventilasjonsluftmengde for en klokketime, m³/h.
|
/// Om ventilasjonen går med driftsluftmengde i time `t` av året.
|
||||||
pub fn luftmengde(l: &Lost, klokketime: usize) -> f64 {
|
pub fn i_drift(l: &Lost, t: usize) -> bool {
|
||||||
let spesifikk = if l.ventilasjon.driftstid.aktiv(klokketime) {
|
l.laster.driftsdag(t) && l.ventilasjon.driftstid.aktiv(t % 24)
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Ventilasjonsluftmengde i time `t` av året, m³/h.
|
||||||
|
pub fn luftmengde(l: &Lost, t: usize) -> f64 {
|
||||||
|
let spesifikk = if i_drift(l, t) {
|
||||||
l.ventilasjon.luftmengde
|
l.ventilasjon.luftmengde
|
||||||
} else {
|
} else {
|
||||||
l.ventilasjon.luftmengde_natt
|
l.ventilasjon.luftmengde_natt
|
||||||
@@ -44,18 +49,29 @@ pub fn luftmengde(l: &Lost, klokketime: usize) -> f64 {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Tilluftstemperatur etter varmegjenvinner (uten ettervarming), °C.
|
/// Tilluftstemperatur etter varmegjenvinner (uten ettervarming), °C.
|
||||||
|
///
|
||||||
|
/// Gjenvinneren reguleres ned når den ellers ville varmet tilluften over settpunktet, slik
|
||||||
|
/// en roterende gjenvinner med turtallsregulering eller et omløpsspjeld gjør. Når det er
|
||||||
|
/// varmere ute enn inne, kjøler gjenvinneren tilluften og går for fullt.
|
||||||
pub fn tilluftstemperatur(l: &Lost, t_ute: f64, t_avtrekk: f64) -> f64 {
|
pub fn tilluftstemperatur(l: &Lost, t_ute: f64, t_avtrekk: f64) -> f64 {
|
||||||
match l.ventilasjon.typ {
|
match l.ventilasjon.typ {
|
||||||
VentilasjonType::Balansert => t_ute + l.ventilasjon.gjenvinning * (t_avtrekk - t_ute),
|
VentilasjonType::Balansert => {
|
||||||
|
let gjenvunnet = t_ute + l.ventilasjon.gjenvinning * (t_avtrekk - t_ute);
|
||||||
|
if gjenvunnet > t_ute {
|
||||||
|
gjenvunnet.min(l.ventilasjon.tilluft_settpunkt.max(t_ute))
|
||||||
|
} else {
|
||||||
|
gjenvunnet
|
||||||
|
}
|
||||||
|
}
|
||||||
_ => t_ute,
|
_ => t_ute,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Vifteeffekt for en klokketime, W.
|
/// Vifteeffekt i time `t` av året, W.
|
||||||
pub fn vifteeffekt(l: &Lost, klokketime: usize) -> f64 {
|
pub fn vifteeffekt(l: &Lost, t: usize) -> f64 {
|
||||||
if matches!(l.ventilasjon.typ, VentilasjonType::Naturlig) {
|
if matches!(l.ventilasjon.typ, VentilasjonType::Naturlig) {
|
||||||
return 0.0;
|
return 0.0;
|
||||||
}
|
}
|
||||||
let q = luftmengde(l, klokketime) / 3600.0; // m³/s
|
let q = luftmengde(l, t) / 3600.0; // m³/s
|
||||||
l.ventilasjon.sfp * 1000.0 * q
|
l.ventilasjon.sfp * 1000.0 * q
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -149,7 +149,7 @@ pub fn kilde(r: &Resultat) -> String {
|
|||||||
l.settpunkt_kjoling.unwrap_or(0.0)
|
l.settpunkt_kjoling.unwrap_or(0.0)
|
||||||
);
|
);
|
||||||
let _ = writeln!(s, " <Driftstider>");
|
let _ = writeln!(s, " <Driftstider>");
|
||||||
let d = &l.laster.oppvarming_driftstid;
|
let d = &l.laster.driftstider.oppvarming;
|
||||||
let _ = writeln!(
|
let _ = writeln!(
|
||||||
s,
|
s,
|
||||||
" <Ventilasjon>{:.0}</Ventilasjon>",
|
" <Ventilasjon>{:.0}</Ventilasjon>",
|
||||||
|
|||||||
+2
-1
@@ -310,7 +310,8 @@ fn baerer_for(t: VarmekildeType, lukket: bool) -> Energibaerer {
|
|||||||
|
|
||||||
/// Samlet tap fra tappevannsanlegget, W. Tapet varmer opp der anlegget står.
|
/// Samlet tap fra tappevannsanlegget, W. Tapet varmer opp der anlegget står.
|
||||||
pub fn tappevannstilskudd_totalt(l: &Lost, s: &Systemoppsett) -> f64 {
|
pub fn tappevannstilskudd_totalt(l: &Lost, s: &Systemoppsett) -> f64 {
|
||||||
let netto_w: f64 = l.laster.varmtvann.iter().sum::<f64>() / 24.0 * l.bra;
|
let driftsandel = l.laster.driftstider.driftsdager_per_aar() as f64 / 365.0;
|
||||||
|
let netto_w: f64 = l.laster.varmtvann.iter().sum::<f64>() / 24.0 * l.bra * driftsandel;
|
||||||
netto_w * s.tappevann_tap_andel
|
netto_w * s.tappevann_tap_andel
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,143 @@
|
|||||||
|
//! Kontroll av de normerte inndataene for yrkesbyggkategoriene: driftsdager, faste energiposter
|
||||||
|
//! og kjølebatteri.
|
||||||
|
|
||||||
|
use enok::data::Datakilde;
|
||||||
|
use enok::kjor;
|
||||||
|
use enok::modell::{Bygning, Kategori};
|
||||||
|
|
||||||
|
fn prøvebygg(kategori: &str, kjolebatteri: bool) -> Bygning {
|
||||||
|
let s = format!(
|
||||||
|
r#"
|
||||||
|
[bygning]
|
||||||
|
navn = "Prøvebygg"
|
||||||
|
kategori = "{kategori}"
|
||||||
|
byggeaar = 2020
|
||||||
|
oppvarmet_bra = 1200.0
|
||||||
|
oppvarmet_volum = 3840.0
|
||||||
|
|
||||||
|
[klima]
|
||||||
|
kommune = "Oslo"
|
||||||
|
|
||||||
|
[[flate]]
|
||||||
|
navn = "Vegger"
|
||||||
|
type = "vegg"
|
||||||
|
areal = 560.0
|
||||||
|
u_verdi = 0.18
|
||||||
|
|
||||||
|
[[flate]]
|
||||||
|
navn = "Tak"
|
||||||
|
type = "tak"
|
||||||
|
areal = 600.0
|
||||||
|
u_verdi = 0.13
|
||||||
|
|
||||||
|
[[flate]]
|
||||||
|
navn = "Gulv"
|
||||||
|
type = "gulv"
|
||||||
|
areal = 600.0
|
||||||
|
u_verdi = 0.10
|
||||||
|
|
||||||
|
[[vindu]]
|
||||||
|
navn = "Sør"
|
||||||
|
areal = 150.0
|
||||||
|
orientering = 180
|
||||||
|
u_verdi = 0.8
|
||||||
|
g_verdi = 0.5
|
||||||
|
|
||||||
|
[infiltrasjon]
|
||||||
|
n50 = 0.6
|
||||||
|
|
||||||
|
[ventilasjon]
|
||||||
|
type = "balansert"
|
||||||
|
gjenvinning = 0.85
|
||||||
|
kjolebatteri = {kjolebatteri}
|
||||||
|
|
||||||
|
[[oppvarming.kilde]]
|
||||||
|
type = "direkte_el"
|
||||||
|
andel_rom = 1.0
|
||||||
|
andel_tappevann = 1.0
|
||||||
|
"#
|
||||||
|
);
|
||||||
|
toml::from_str(&s).unwrap()
|
||||||
|
}
|
||||||
|
|
||||||
|
fn post(r: &kjor::Resultat, nr: &str) -> f64 {
|
||||||
|
let p = r.budsjett.poster.iter().find(|p| p.nr == nr).unwrap();
|
||||||
|
p.netto / r.lost.bra
|
||||||
|
}
|
||||||
|
|
||||||
|
fn naer(faktisk: f64, forventet: f64, hva: &str) {
|
||||||
|
assert!(
|
||||||
|
(faktisk - forventet).abs() <= 0.1,
|
||||||
|
"{hva}: beregnet {faktisk:.2}, forventet {forventet:.2}"
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn driftsdager_per_aar() {
|
||||||
|
let kilde = Datakilde::default();
|
||||||
|
for (kategori, dager) in [
|
||||||
|
(Kategori::Smaahus, 365),
|
||||||
|
(Kategori::Boligblokk, 365),
|
||||||
|
(Kategori::Barnehage, 261),
|
||||||
|
(Kategori::Kontorbygg, 261),
|
||||||
|
(Kategori::Kulturbygg, 261),
|
||||||
|
(Kategori::Skolebygg, 220),
|
||||||
|
(Kategori::Idrettsbygg, 220),
|
||||||
|
] {
|
||||||
|
let n = kilde.normerte(kategori).unwrap();
|
||||||
|
assert_eq!(
|
||||||
|
n.driftstid.driftsdager_per_aar(),
|
||||||
|
dager,
|
||||||
|
"{}",
|
||||||
|
kategori.nokkel()
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Fellesferien og helgene er uten drift i skolebygg.
|
||||||
|
#[test]
|
||||||
|
fn skolebygg_stengt_i_helg_og_ferie() {
|
||||||
|
let n = Datakilde::default().normerte(Kategori::Skolebygg).unwrap();
|
||||||
|
let d = &n.driftstid;
|
||||||
|
assert!(d.driftsdag(0), "1. januar er mandag i uke 1");
|
||||||
|
assert!(!d.driftsdag(5), "lørdag");
|
||||||
|
assert!(!d.driftsdag(6), "søndag");
|
||||||
|
assert!(!d.driftsdag(7 * 28), "mandag i uke 29");
|
||||||
|
assert!(d.driftsdag(7 * 34), "mandag i uke 35");
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Belysning, utstyr og varmtvann skal gi energibehovene som følger av tabellverdiene.
|
||||||
|
#[test]
|
||||||
|
fn faste_poster_som_tabellverdiene() {
|
||||||
|
let kilde = Datakilde::default();
|
||||||
|
for (kategori, belysning, utstyr, varmtvann) in [
|
||||||
|
("barnehage", 20.9, 5.2, 10.0),
|
||||||
|
("kontorbygg", 25.1, 34.5, 5.0),
|
||||||
|
("skolebygg", 22.0, 13.2, 10.0),
|
||||||
|
("idrettsbygg", 21.1, 2.6, 50.2),
|
||||||
|
("kulturbygg", 23.0, 2.9, 10.0),
|
||||||
|
] {
|
||||||
|
let r = kjor::kjor(&prøvebygg(kategori, false), &kilde).unwrap();
|
||||||
|
naer(post(&r, "5"), belysning, &format!("{kategori} belysning"));
|
||||||
|
naer(post(&r, "6"), utstyr, &format!("{kategori} utstyr"));
|
||||||
|
naer(post(&r, "2"), varmtvann, &format!("{kategori} varmtvann"));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Kjølebatteriet gir ventilasjonskjøling; uten det er posten null.
|
||||||
|
#[test]
|
||||||
|
fn kjolebatteri_gir_ventilasjonskjoling() {
|
||||||
|
let kilde = Datakilde::default();
|
||||||
|
let uten = kjor::kjor(&prøvebygg("kontorbygg", false), &kilde).unwrap();
|
||||||
|
let med = kjor::kjor(&prøvebygg("kontorbygg", true), &kilde).unwrap();
|
||||||
|
assert_eq!(post(&uten, "3b"), 0.0);
|
||||||
|
assert!(
|
||||||
|
post(&med, "3b") > 0.5,
|
||||||
|
"ventilasjonskjøling {:.2}",
|
||||||
|
post(&med, "3b")
|
||||||
|
);
|
||||||
|
// Kjøling skjer bare i driftstiden på driftsdager.
|
||||||
|
let ts = &med.timeserie;
|
||||||
|
let lørdag_middag = 5 * 24 + 12 + 24 * 7 * 26;
|
||||||
|
assert_eq!(ts.ventilasjonskjoling[lørdag_middag], 0.0);
|
||||||
|
}
|
||||||
@@ -86,13 +86,13 @@ fn regresjonsvakt_for_romoppvarming() {
|
|||||||
let r = kjor_referansebygg();
|
let r = kjor_referansebygg();
|
||||||
naer(
|
naer(
|
||||||
post(&r, "1a"),
|
post(&r, "1a"),
|
||||||
27.2,
|
27.1,
|
||||||
1.5,
|
1.5,
|
||||||
"romoppvarming (regresjon, publisert verdi 46,2)",
|
"romoppvarming (regresjon, publisert verdi 46,2)",
|
||||||
);
|
);
|
||||||
naer(
|
naer(
|
||||||
r.budsjett.netto_spesifikk(r.lost.bra),
|
r.budsjett.netto_spesifikk(r.lost.bra),
|
||||||
86.7,
|
86.6,
|
||||||
2.0,
|
2.0,
|
||||||
"netto energibehov (regresjon, publisert verdi 106,4)",
|
"netto energibehov (regresjon, publisert verdi 106,4)",
|
||||||
);
|
);
|
||||||
|
|||||||
Reference in New Issue
Block a user