Files
enok/src/klima/korreksjon.rs
T
blandClaude Opus 5 0964cacba3 Energiberegning etter NS 3031:2025 med timesmetode og energirapport
enok leser en bygningsbeskrivelse i TOML, henter typisk klimaår for kommunen,
simulerer 8760 timer etter NS-EN ISO 52016-1 og skriver energirapport, CSV og JSON.

Motor
- Femnodemodell for opake bygningsdeler, tonodemodell for vinduer, luftnode og
  strålingsnode per sone, implisitt løsning per time med egen tett LU-løser.
- Varme- og kjølebehov ved eksakt interpolasjon mellom to løsninger, siden systemet
  er lineært. Vinduslufting for bygninger uten kjøleanlegg.
- Solberegning etter ISO 52010-1, kontrollert mot pvlib med avvik under 1 prosent.

Beregningsgang
- Beregningspunktene A til E: netto, brutto, tilført, levert per energibærer og
  vektet levert energi, med solceller, klimakorrigering og effektbehov.
- Energikarakter etter Enovas skala fra 1.1.2026, med arealkorreksjon.

Inndata
- TOML med scenarier for tiltak, og import fra IFC, gbXML og regneark.
- Normerte verdier, karakterskala, vektingsfaktorer og klimadata i data/,
  som kan overstyres med --data.

Kontroll
- Stasjonært varmetap mot U·A·ΔT innenfor 2 prosent, energibalansen innenfor
  2 prosent, varmetapsbudsjettet for TEK17-referansebygget identisk med publisert
  tabell. Kjent avvik i romoppvarming mot Simien 8 er dokumentert i README.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015GeH3y8fwTaTudaD88P57o
2026-09-14 18:03:00 +02:00

44 lines
1.4 KiB
Rust

//! Klimakorrigering av beregnet energiytelse til referanseklima (Oslo).
//!
//! NS 3031:2025 fjernet normert Oslo-klima fra selve beregningen og innførte i stedet
//! klimakorrigeringsfaktorer: `EP_NORM = EP_LOK / KF`, der korrigeringen gjelder de
//! klimaavhengige energipostene (romoppvarming, ventilasjonsvarme, romkjøling,
//! ventilasjonskjøling). Øvrige poster er uendret.
use crate::data::Klimakorreksjon;
use crate::modell::Kategori;
/// Resultat av klimakorrigering for én bygning.
#[derive(serde::Serialize, Clone, Debug)]
pub struct Korrigering {
pub sted: String,
pub faktor: f64,
/// Klimaavhengige poster før korrigering, kWh/m².
pub klimaavhengig_lokalt: f64,
/// Klimaavhengige poster etter korrigering, kWh/m².
pub klimaavhengig_normert: f64,
}
impl Korrigering {
/// Korrigerer en total energiytelse: trekker ut de klimaavhengige postene, deler på KF,
/// og legger dem tilbake.
pub fn korriger_total(&self, total_lokalt: f64) -> f64 {
total_lokalt - self.klimaavhengig_lokalt + self.klimaavhengig_normert
}
}
pub fn korriger(
tabell: &Klimakorreksjon,
sted: &str,
kategori: Kategori,
klimaavhengig_lokalt: f64,
) -> Option<Korrigering> {
let faktor = tabell.faktor(sted, kategori)?;
Some(Korrigering {
sted: sted.to_string(),
faktor,
klimaavhengig_lokalt,
klimaavhengig_normert: klimaavhengig_lokalt / faktor,
})
}