@open3cl/engine
Version:
Open Source 3CL-DPE engine
324 lines (293 loc) • 8.38 kB
JavaScript
import { mois_liste, requestInputID } from './utils.js';
import { rendement_emission } from './9_emetteur_ch.js';
import { calc_intermittence } from './8_intermittence.js';
import tvs from './tv.js';
import enums from './enums.js';
import { isNil } from 'lodash-es';
function coef_ch(Fch) {
return {
'installation de chauffage simple': {
0: 1,
1: 1
},
'installation de chauffage avec chauffage solaire': {
0: 1 - Fch
},
'installation de chauffage avec insert ou poêle bois en appoint': {
0: 0.75,
1: 0.25
},
// todo: 2 sdb
'installation de chauffage par insert, poêle bois (ou biomasse) avec un chauffage électrique dans la salle de bain':
{
0: 0.9,
1: 0.1
},
'installation de chauffage avec en appoint un insert ou poêle bois et un chauffage électrique dans la salle de bain (différent du chauffage principal)':
{
0: 0.75 * 0.9,
1: 0.25 * 0.9,
2: 0.1
},
'installation de chauffage avec une chaudière ou une pac en relève d’une chaudière bois': {
0: 0.75,
1: 0.25
},
'installation de chauffage avec chauffage solaire et insert ou poêle bois en appoint': {
0: 0.75 * (1 - Fch),
1: 0.25 * (1 - Fch)
},
'installation de chauffage avec chaudière en relève de pac': {
0: 0.8,
1: 0.2
},
'installation de chauffage avec chaudière en relève de pac avec insert ou poêle bois en appoint':
{
0: 0.8 * 0.75,
1: 0.2 * 0.75,
2: 0.25
},
'installation de chauffage collectif avec base + appoint': {
0: 0.75 * (1 - Fch),
1: 0.25 * (1 - Fch)
},
'convecteurs bi-jonction': {
0: 0.6,
1: 0.4
}
};
}
export function conso_ch(
di,
de,
du,
_pos,
cfg_ch,
em_list,
GV,
Sh,
hsp,
bch,
bch_dep,
tbase,
ilpa,
ca_id,
zc_id,
besoin_ch_mois,
s_chauffee_inst,
gen_ch_list
) {
const gen_lge_id = requestInputID(de, du, 'lien_generateur_emetteur');
const coef = coef_ch(de.fch || 0.5)[cfg_ch][_pos] || 1;
let em_filt;
if (em_list.length === 1) {
em_filt = em_list;
} else {
em_filt = em_list.filter(
(em) => em.donnee_entree.enum_lien_generateur_emetteur_id === gen_lge_id
);
}
switch (cfg_ch) {
case 'installation de chauffage collectif avec base + appoint': {
calc_ch_base_appoint(
di,
de,
bch,
besoin_ch_mois,
zc_id,
ca_id,
em_list,
gen_ch_list,
_pos,
GV,
Sh,
hsp,
s_chauffee_inst,
ilpa,
tbase
);
break;
}
case 'convecteurs bi-jonction': {
// Installation individuelle
const coeffInd = coef_ch(de.fch)[cfg_ch][1];
const consoInd = calc_conso_ch_default(di, de, bch, bch_dep, coeffInd, em_filt, GV, Sh, hsp);
// Installation collective
const coeffColl = coef_ch(de.fch)[cfg_ch][0];
const consoColl = calc_conso_ch_default(
di,
de,
bch,
bch_dep,
coeffColl,
em_filt,
GV,
Sh,
hsp,
1.03
);
di.conso_ch = consoInd.conso_ch + consoColl.conso_ch;
di.conso_ch_depensier = consoInd.conso_ch_dep + consoColl.conso_ch_dep;
break;
}
default: {
const { conso_ch, conso_ch_dep } = calc_conso_ch_default(
di,
de,
bch,
bch_dep,
coef,
em_filt,
GV,
Sh,
hsp,
undefined,
_pos,
cfg_ch
);
di.conso_ch = conso_ch;
di.conso_ch_depensier = conso_ch_dep;
break;
}
}
}
function calc_conso_ch_default(
di,
de,
bch,
bch_dep,
coeff,
em_filt,
GV,
Sh,
hsp,
i0,
_pos,
cfg_ch
) {
const hasMultipleEmetteur = em_filt.length > 1;
// On recherche les emetteurs en fonction de la configuration de l'installation et du type de chauffage
const emetteurs = getEmetteursFromGenerateur(de, em_filt, _pos, cfg_ch);
const emetteur_eq = emetteurs.reduce((acc, em) => {
const int = calc_intermittence(GV, Sh, hsp, i0 ? i0 : em.donnee_intermediaire.i0);
const r_em = rendement_emission(em);
/**
* 9.1.3 Installation avec plusieurs émissions pour un même générateur
* La part de la consommation traitée par chaque émetteur est proratisé par le ratio des surfaces habitables.
* @type {number|number}
*/
const ratio_s = hasMultipleEmetteur
? em.donnee_entree.surface_chauffee / de.surface_chauffee
: 1;
const Ich = 1 / r_em;
return acc + ratio_s * int * Ich;
}, 0);
const Ich = emetteur_eq / di.rg;
const Ich_dep = emetteur_eq / di.rg_dep;
const conso_ch = coeff * Ich * bch;
const conso_ch_dep = coeff * Ich_dep * bch_dep;
return { conso_ch, conso_ch_dep };
}
/**
* 9.8 Installation de chauffage collectif avec base + appoint
*/
function calc_ch_base_appoint(
di,
de,
bch,
besoin_ch_mois,
zc_id,
ca_id,
em_list,
gen_ch_list,
_pos,
GV,
Sh,
hsp,
s_chauffee_inst,
ilpa,
tbase
) {
if (bch > 0) {
let bch_base = 0;
const zc = enums.zone_climatique[zc_id];
const ca = enums.classe_altitude[ca_id];
const emBase = em_list[0];
const genBase = gen_ch_list[0];
const emAppoint = em_list[1];
const genAppoint = gen_ch_list[1];
const em = _pos === 0 ? emBase : emAppoint;
const gen = _pos === 0 ? genBase : genAppoint;
const isAppoint = _pos !== 0;
const Int = calc_intermittence(GV, Sh, hsp, em.donnee_intermediaire.i0);
const Rend = rendement_emission(em);
const Ich = 1 / (gen.donnee_intermediaire.rendement_generation || 1);
const rd = emBase.donnee_intermediaire.rendement_distribution;
const rr = emBase.donnee_intermediaire.rendement_regulation;
const re = emBase.donnee_intermediaire.rendement_emission;
const pn = genBase.donnee_intermediaire.pn;
const pe = pn > 0 ? (pn / 1000) * rd * rr * re : 0;
const dh14 = tvs.dh14;
const text = tvs.text;
const nrefs = tvs.nref19;
const idx_ilpa = ilpa ? 1 : 0;
const dh14Saison = mois_liste.reduce((acc, mois) => acc + dh14[idx_ilpa][ca][mois][zc], 0);
const rdim = de.rdim || 1;
const ratio_s = (s_chauffee_inst * rdim) / Sh;
const bch1 = (bch * ratio_s) / rdim;
const t = 14 - (pe * dh14Saison) / bch1;
di.conso_ch = 0;
for (const mois of mois_liste) {
let bch_base_j = 0;
if (pe > 0) {
// Nombre d’heures de chauffage sur le mois j
const nrefj = nrefs[idx_ilpa][ca][mois][zc];
// Température extérieure moyenne dans la zone climatique sur le mois j (°C)
const textj = text[idx_ilpa][ca][mois][zc];
// Degrés heures de base 14 pour le mois j (°Ch)
const dh14j = dh14[idx_ilpa][ca][mois][zc];
const xj = 0.5 * ((t - tbase) / (textj - tbase));
// Degré heure base T sur le mois j
let dhtj =
nrefj *
(textj - tbase) *
Math.pow(xj, 5) *
(14 - 28 * xj + 20 * Math.pow(xj, 2) - 5 * Math.pow(xj, 3));
if (dhtj < 0) {
dhtj = 0;
}
let ratioDh = dh14j > 0 ? 1 - dhtj / dh14j : 0;
if (ratioDh <= 0) {
bch_base_j = 0;
} else {
bch_base_j = besoin_ch_mois[mois] * ratioDh;
}
} else {
bch_base_j = besoin_ch_mois[mois] * 0.5;
}
bch_base += bch_base_j;
}
if (!isAppoint) {
const ratio_s_em = em.donnee_entree.surface_chauffee / de.surface_chauffee;
di.conso_ch = (ratio_s_em * (bch_base / 1000) * Ich * Int) / Rend;
} else {
const ratio_s_em =
em.donnee_entree.surface_chauffee / emAppoint.donnee_entree.surface_chauffee;
di.conso_ch = (ratio_s_em * (bch - bch_base / 1000) * Int * Ich) / Rend;
}
di.conso_ch = Math.max(di.conso_ch, 0);
}
}
function getEmetteursFromGenerateur(de, em_filt, pos, cfg_ch) {
// Cas installation simple + generateurs electriques
if (
isChauffageElectrique(de.enum_type_generateur_ch_id) &&
cfg_ch === 'installation de chauffage simple'
) {
return !isNil(pos) ? [em_filt[pos]] : em_filt;
}
return em_filt;
}
function isChauffageElectrique(id) {
return ['98', '99', '100', '101', '102', '103', '104'].includes(id);
}