Geometri fra IFC, grunnmodell etter ISO 13370 og uoppvarmede soner
test / test (push) Failing after 3s

Importen er prøvd mot en virkelig IFC-fil fra Vectorworks Architect 2026 og
avdekket tre feil og ett hull.

IFC-import
- Lengdeenheten hentes nå gjennom prosjektets enhetsoppsett. Filen inneholder to
  lengdeenheter, og oppslaget traff tilfeldig den ene.
- Arealer regnes av geometrien, siden modellen ikke har mengder for vegger og dekker.
  Trekantene grupperes etter retning, og den største gruppen er delens hovedflate.
  Metoden gir riktig areal også når vinduer er skåret ut av veggen.
- Materialsjikt eksporteres som hver sin geometridel. Deler som ligger i samme plan
  og overlapper hverandre telles én gang, ellers ble en vegg talt sju ganger.
- Himmelretningen følger flatenormalen i stedet for et anslag ut fra tyngdepunktet.
- Flater med samme konstruksjon og himmelretning slås sammen, og rommene listes
  med areal, siden IFC ikke sier hvilke som er oppvarmet.

Grunnen og kjelleren
- Flater mot grunnen regnes etter NS-EN ISO 13370. En kjellervegg deles i en del over
  terreng og en nedgravd del, etter høydene `over_terreng` og `dybde`.
- Uoppvarmede soner får egen temperatur time for time etter NS-EN ISO 13789, med
  varmetilskudd fra distribusjonstap og beredere som står der. Uisolerte varmerør i
  en kjeller teller dermed både som tap og som varme som holder etasjeskilleren varm.
- Varmetapsbudsjettet oppgir konstruksjonens egen U-verdi, slik NS 3031 Tabell 3 og
  energikravene i TEK er formulert, mens timesberegningen bruker grunnens demping.

Nordhusstykket 5 er modellert av IFC-geometrien med kjelleren som egen sone.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015GeH3y8fwTaTudaD88P57o
This commit is contained in:
bl
2026-09-14 19:16:18 +02:00
co-authored by Claude Opus 5
parent a5185ccc5b
commit b6babde13a
19 changed files with 2205 additions and 303 deletions
+24 -1
View File
@@ -139,8 +139,31 @@ pub fn kjor_med_klima(
let systemer_oppsett = systemer::sett_opp_systemer(b, &lost, kilde)?;
let mut merknader = systemer_oppsett.merknader.clone();
// Tap fra varmerør og bereder som står i en uoppvarmet sone varmer den sonen, og
// reduserer dermed varmetapet gjennom etasjeskilleren. Andelen som avgis i den
// oppvarmede delen teller som uregulerbart varmetilskudd der.
let tappevannstap = systemer::tappevannstilskudd_totalt(&lost, &systemer_oppsett);
let sone_tappevann: f64 = lost
.soner
.iter()
.map(|s| s.andel_tappevannstap)
.sum::<f64>()
.min(1.0);
let tilskudd = Systemtilskudd {
tappevann: systemer::tappevannstilskudd(&lost, &systemer_oppsett),
tappevann: tappevannstap * systemer_oppsett.tappevann_tap_i_sone * (1.0 - sone_tappevann),
sone_fast: lost
.soner
.iter()
.map(|s| s.fast_effekt + tappevannstap * s.andel_tappevannstap)
.collect(),
sone_andel_romvarme: lost
.soner
.iter()
.map(|s| {
s.andel_distribusjonstap * systemer_oppsett.distribusjon_tap_ut
/ (1.0 - systemer_oppsett.distribusjon_tap_ut).max(1e-6)
})
.collect(),
};
let timeserie = simuler(&lost, &vaerdata, tilskudd)?;
let budsjett = systemer::energibudsjett(&timeserie, &systemer_oppsett);