UNPKG

@open3cl/engine

Version:

Open Source 3CL-DPE engine

200 lines (168 loc) 6.8 kB
import enums from './enums.js'; import tvs from './tv.js'; import { calc_Qdw_j } from './14_generateur_ecs.js'; import { calc_besoin_ecs_j } from './11_besoin_ecs.js'; import { calc_Qrec_gen_j } from './9_generateur_ch.js'; import { calc_ai_j, calc_as_j } from './6.1_apport_gratuit.js'; import { calc_sse_j } from './6.2_surface_sud_equivalente.js'; import { mois_liste } from './utils.js'; export default function calc_besoin_ch( ilpa, ca_id, zc_id, inertie_id, Sh, GV, nadeq, instal_ecs, instal_ch, bv, ets ) { const ca = enums.classe_altitude[ca_id]; const zc = enums.zone_climatique[zc_id]; const inertie = enums.classe_inertie[inertie_id]; let besoin_ch = 0; let besoin_ch_depensier = 0; const dh21 = tvs.dh21[ilpa]; const dh19 = tvs.dh19[ilpa]; const Nref21 = tvs.nref21[ilpa]; const Nref19 = tvs.nref19[ilpa]; let sumDh19 = 0; let sumDh21 = 0; const e = tvs.e[ilpa]; let pertes_distribution_ecs_recup = 0; let pertes_distribution_ecs_recup_depensier = 0; let pertes_stockage_ecs_recup = 0; let pertes_generateur_ch_recup = 0; let pertes_generateur_ch_recup_depensier = 0; let fraction_apport_gratuit_ch = 0; let fraction_apport_gratuit_depensier_ch = 0; /** * 11.4 Plusieurs systèmes d’ECS (limité à 2 systèmes différents par logement) * Les besoins en ECS pour chaque générateur sont / 2 */ const prorataEcs = instal_ecs.length > 1 ? 0.5 : 1; let Qdw_total_ecs = 0; let Qdw_total_ecs_dep = 0; let Qgw_total_ecs = 0; instal_ecs.forEach((instal_ecs) => { let Qgw; const gen_ecs = instal_ecs.generateur_ecs_collection.generateur_ecs; // 17.2.1.1 Calcul des consommations de chauffage, de refroidissement, d’ECS et d’auxiliaires // Pour les installations ECS collectives, pas de récupération de stockage d'ECS if (Number.parseInt(instal_ecs.donnee_entree.enum_type_installation_id) !== 1) { Qgw = 0; } else { Qgw = gen_ecs.reduce((acc, gen_ecs) => { // Pas de récupération de stockage si le ballon est hors volume chauffé if ( gen_ecs.donnee_entree.position_volume_chauffe_stockage === 0 || gen_ecs.donnee_entree.position_volume_chauffe === 0 ) { return acc; } return acc + (gen_ecs.donnee_intermediaire.Qgw || 0); }, 0); } Qgw_total_ecs += (0.48 * Qgw * (instal_ecs.donnee_entree.rdim || 1)) / 8760; }); for (const mois of mois_liste) { // en kw/h const becsj = calc_besoin_ecs_j(ca, mois, zc, nadeq, false) * prorataEcs; // en kw/h const becs_j_dep = calc_besoin_ecs_j(ca, mois, zc, nadeq, true) * prorataEcs; Qdw_total_ecs += instal_ecs.reduce((acc, ecs) => acc + calc_Qdw_j(ecs, becsj), 0); Qdw_total_ecs_dep += instal_ecs.reduce((acc, ecs) => acc + calc_Qdw_j(ecs, becs_j_dep), 0); } /** * Création de la liste des générateurs de chauffage pour lesquels il y a une récupération d'énergie * * 9.1.1 - Pertes récupérées de génération pour le chauffage sur le mois j (Wh) * Ce calcul ne s’applique qu’au générateur pour lesquels des pertes à l’arrêt Qp0 sont prises en compte. * Seules les pertes des générateurs et des ballons de stockage en volume chauffé sont récupérables. Les pertes * récupérées des générateurs d’air chaud sont nulles. * * @type {GenerateurChauffageItem[]} */ const gen_ch_recup = instal_ch.flatMap((inst_ch) => inst_ch.generateur_chauffage_collection.generateur_chauffage.filter( (gen_ch) => gen_ch.donnee_intermediaire.qp0 && (gen_ch.donnee_entree.position_volume_chauffe ?? 0) ) ); const besoin_ch_mois = {}; const besoin_ch_mois_dep = {}; for (const mois of mois_liste) { const nref19 = Nref19[ca][mois][zc]; const nref21 = Nref21[ca][mois][zc]; // bvj const dh19j = dh19[ca][mois][zc]; sumDh19 += dh19j * GV; const dh21j = dh21[ca][mois][zc]; sumDh21 += dh21j * GV; const aij = calc_ai_j(Sh, nadeq, nref19); const aij_dep = calc_ai_j(Sh, nadeq, nref21); const ssej = calc_sse_j(bv, ets, ca, zc, mois); const ej = e[ca][mois][zc]; const asj = calc_as_j(ssej, ej); const Fj = calc_Fj(GV, asj, aij, dh19j, inertie); const Fj_dep = calc_Fj(GV, asj, aij_dep, dh21j, inertie); fraction_apport_gratuit_ch += Fj * GV * dh19j; fraction_apport_gratuit_depensier_ch += Fj_dep * GV * dh21j; const bvj = dh19j === 0 ? 0 : calc_bvj(GV, Fj); const bvj_dep = dh21j === 0 ? 0 : calc_bvj(GV, Fj_dep); const Bch_hp_j = bvj * dh19j; const Bch_hp_j_dep = bvj_dep * dh21j; let gen_recup = 0; let gen_recup_dep = 0; gen_ch_recup.forEach((gen_ch) => { gen_recup += calc_Qrec_gen_j(gen_ch, nref19, Bch_hp_j); gen_recup_dep += calc_Qrec_gen_j(gen_ch, nref21, Bch_hp_j_dep); }); pertes_generateur_ch_recup += gen_recup; pertes_generateur_ch_recup_depensier += gen_recup_dep; const pertes_distribution_ecs_recup_j = nref19 * Qdw_total_ecs * 1000; const pertes_distribution_ecs_recup_j_dep = nref21 * Qdw_total_ecs_dep * 1000; pertes_distribution_ecs_recup += pertes_distribution_ecs_recup_j; pertes_distribution_ecs_recup_depensier += pertes_distribution_ecs_recup_j_dep; const pertes_stockage_ecs_recup_j = nref19 * Qgw_total_ecs; pertes_stockage_ecs_recup += pertes_stockage_ecs_recup_j; const pertes_stockage_ecs_recup_j_dep = nref21 * Qgw_total_ecs; besoin_ch_mois[mois] = bvj * dh19j; besoin_ch_mois_dep[mois] = bvj_dep * dh21j; besoin_ch_mois[mois] -= pertes_distribution_ecs_recup_j + pertes_stockage_ecs_recup_j + gen_recup; besoin_ch_mois_dep[mois] -= pertes_distribution_ecs_recup_j_dep + pertes_stockage_ecs_recup_j_dep + gen_recup_dep; besoin_ch_mois[mois] = Math.max(besoin_ch_mois[mois], 0); besoin_ch += besoin_ch_mois[mois] / 1000; besoin_ch_depensier += besoin_ch_mois_dep[mois] / 1000; } fraction_apport_gratuit_ch /= sumDh19; fraction_apport_gratuit_depensier_ch /= sumDh21; return { besoin_ch, besoin_ch_depensier, besoin_ch_mois, pertes_distribution_ecs_recup, pertes_distribution_ecs_recup_depensier, pertes_stockage_ecs_recup, pertes_generateur_ch_recup, pertes_generateur_ch_recup_depensier, fraction_apport_gratuit_ch, fraction_apport_gratuit_depensier_ch }; } function calc_Fj(GV, asj, aij, dhj, inertie) { if (dhj === 0) return 0; let alpha; if (inertie === 'très lourde' || inertie === 'lourde') alpha = 3.6; else if (inertie === 'moyenne') alpha = 2.9; else if (inertie === 'légère') alpha = 2.5; const Xj = (asj + aij) / (GV * dhj); return (Xj - Xj ** alpha) / (1 - Xj ** alpha); } function calc_bvj(GV, Fj) { return GV * (1 - Fj); }