@jzck/open3cl
Version:
Open Source 3CL-DPE engine
199 lines (168 loc) • 6.63 kB
JavaScript
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 sumNref19 = 0;
let sumNref21 = 0;
let sumDh19 = 0;
let sumDh21 = 0;
let QrecDistr = 0;
let QrecDistrDepensier = 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_stockage_ecs_recup_depensier = 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;
const Qgw_total = instal_ecs.reduce((acc, instal_ecs) => {
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) {
return acc;
}
return (
acc +
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)
);
}, 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;
/**
* 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)
)
);
for (const mois of mois_liste) {
const nref19 = Nref19[ca][mois][zc];
const nref21 = Nref21[ca][mois][zc];
const Qrec_stock_19 = (0.48 * nref19 * Qgw_total) / (24 * 365);
const Qrec_stock_21 = (0.48 * nref21 * Qgw_total) / (24 * 365);
pertes_stockage_ecs_recup += Qrec_stock_19 / 1000;
pertes_stockage_ecs_recup_depensier += Qrec_stock_21 / 1000;
// pertes distribution
const becs_j = calc_besoin_ecs_j(ca, mois, zc, nadeq, false) * prorataEcs;
const becs_j_dep = calc_besoin_ecs_j(ca, mois, zc, nadeq, true) * prorataEcs;
sumNref19 += nref19;
sumNref21 += nref21;
QrecDistr += instal_ecs.reduce((acc, ecs) => acc + calc_Qdw_j(ecs, becs_j), 0);
QrecDistrDepensier += instal_ecs.reduce((acc, ecs) => acc + calc_Qdw_j(ecs, becs_j_dep), 0);
// bvj
const dh19j = dh19[ca][mois][zc];
sumDh19 += dh19j;
const dh21j = dh21[ca][mois][zc];
sumDh21 += dh21j;
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 * dh19j;
fraction_apport_gratuit_depensier_ch += Fj_dep * dh21j;
const bvj = dh19j === 0 ? 0 : calc_bvj(GV, Fj);
const bvj_dep = dh21j === 0 ? 0 : calc_bvj(GV, Fj_dep);
// pertes generation
const Bch_hp_j = bvj * dh19j;
const Bch_hp_j_dep = bvj_dep * dh21j;
gen_ch_recup.forEach((gen_ch) => {
pertes_generateur_ch_recup += calc_Qrec_gen_j(gen_ch, nref19, Bch_hp_j) / (1000 * 1000);
pertes_generateur_ch_recup_depensier +=
calc_Qrec_gen_j(gen_ch, nref21, Bch_hp_j_dep) / (1000 * 1000);
});
besoin_ch += Bch_hp_j / 1000;
besoin_ch_depensier += Bch_hp_j_dep / 1000;
}
pertes_distribution_ecs_recup = (0.48 * sumNref19 * QrecDistr) / 8760;
pertes_distribution_ecs_recup_depensier = (0.48 * sumNref21 * QrecDistrDepensier) / 8760;
const recup =
pertes_distribution_ecs_recup + pertes_stockage_ecs_recup + pertes_generateur_ch_recup;
const recup_depensier =
pertes_distribution_ecs_recup_depensier +
pertes_stockage_ecs_recup_depensier +
pertes_generateur_ch_recup_depensier;
besoin_ch -= recup;
besoin_ch_depensier -= recup_depensier;
fraction_apport_gratuit_ch /= sumDh19;
fraction_apport_gratuit_depensier_ch /= sumDh21;
return {
besoin_ch,
besoin_ch_depensier,
pertes_distribution_ecs_recup,
pertes_distribution_ecs_recup_depensier,
pertes_stockage_ecs_recup,
/* pertes_stockage_ecs_recup_depensier: pertes_stockage_ecs_recup_depensier, */
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 pow;
if (inertie === 'très lourde' || inertie === 'lourde') pow = 3.6;
else if (inertie === 'moyenne') pow = 2.9;
else if (inertie === 'légère') pow = 2.5;
const Xj = (asj + aij) / (GV * dhj);
const Fj = (Xj - Xj ** pow) / (1 - Xj ** pow);
/* console.warn(Fj) */
return Fj;
}
function calc_bvj(GV, Fj) {
const bvj = GV * (1 - Fj);
return bvj;
}