@open3cl/engine
Version:
Open Source 3CL-DPE engine
293 lines (255 loc) • 8.89 kB
JavaScript
import { DeperditionService } from '../deperdition.service.js';
import { inject } from 'dioma';
import { BaieVitreeTvStore } from '../../../../dpe/infrastructure/enveloppe/baieVitreeTv.store.js';
/**
* Calcul des déperditions des baies vitrées
* Chapitre 3.3 Calcul des parois vitrées
*
* Méthode de calcul 3CL-DPE 2021
* Octobre 2021
* @see consolide_anne…arrete_du_31_03_2021_relatif_aux_methodes_et_procedures_applicables.pdf
*/
export class DeperditionBaieVitreeService extends DeperditionService {
/**
* @param tvStore {BaieVitreeTvStore}
*/
constructor(tvStore = inject(BaieVitreeTvStore)) {
super(tvStore);
}
/**
* @param ctx {Contexte}
* @param bv {BaieVitree}
* @return {BaieVitreeDI}
*/
execute(ctx, bv) {
const bvDE = bv.donnee_entree;
const b = this.b({
enumTypeAdjacenceId: bvDE.enum_type_adjacence_id,
surfaceAiu: bvDE.surface_aiu,
surfaceAue: bvDE.surface_aue,
enumCfgIsolationLncId: bvDE.enum_cfg_isolation_lnc_id,
zoneClimatique: ctx.zoneClimatique?.value
});
let sw = this.sw(bv);
const ug = this.ug(bvDE);
let uw = this.uw(bv, ug);
/**
* Si le type de fermeture n'est pas '1: abscence de fermeture pour la baie vitrée',
* c'est qu'il y a présence d'une fermeture devant la fenêtre. Il faut prendre en compte la résistance de cette fermeture
*/
let u_menuiserie = uw;
let ujn;
if (parseInt(bvDE.enum_type_fermeture_id) !== 1) {
ujn = this.ujn(bvDE, uw);
u_menuiserie = ujn;
}
const [fe1, fe2] = this.fe(bvDE);
/** @type {BaieVitreeDI} */
return {
b,
ug,
uw,
ujn,
u_menuiserie,
sw,
fe1,
fe2
};
}
/**
* Coefficient de transmission thermique du vitrage (W/(m².K))
*
* @param bvDE {BaieVitreeDE|BaieVitreeDoubleFenetreDE}
* @return {number|undefined}
*/
ug(bvDE) {
if (bvDE.ug_saisi) {
return bvDE.ug_saisi;
}
// Pas de valeur ug pour les parois en brique de verre ou polycarbonate
if (parseInt(bvDE.enum_type_baie_id) < 4) {
return;
}
const enumTypeVitrageId = bvDE.enum_type_vitrage_id;
let e, enumTypeGazLameId, enumInclinaisonVitrageId, enumVitrageVir;
// Pas de type_gaz_lame, inclinaison_vitrage ou vitrage_vir pour un simple vitrage
if (enumTypeVitrageId !== '1') {
e = Math.min(bvDE.epaisseur_lame, 20);
const availableEpaisseurs = this.tvStore.getEpaisseurAvailableForUg();
if (e && !availableEpaisseurs.includes(e)) {
// 3.3.1 Détermination de la performance du vitrage Ug
// Attention : si la valeur de l’épaisseur de la lame d’air n’est pas dans le tableau présenté, prendre la valeur directement
// inférieure qui s’y trouve.
e = availableEpaisseurs.reduce(
(closest, num) => (num < e && num > closest ? num : closest),
-Infinity
);
}
enumTypeGazLameId = bvDE.enum_type_gaz_lame_id;
enumInclinaisonVitrageId = bvDE.enum_inclinaison_vitrage_id;
enumVitrageVir = bvDE.vitrage_vir;
}
/**
* Le Ug d’un survitrage est déterminé en apportant une majoration de 0,1 W/(m².K) au Ug du double vitrage rempli à
* l’air sec ayant la même épaisseur de lame d’air. Les épaisseurs des lames d’air pour le survitrage sont plafonnées à
* 20mm. C'est-à-dire que toute lame d’air d’un survitrage d’épaisseur supérieure à 20mm sera traitée dans les calculs
* comme une lame d’air de 20mm d’épaisseur.
*/
if (enumTypeVitrageId === '4') {
const ug = this.tvStore.getUg('2', '1', enumInclinaisonVitrageId, enumVitrageVir, e);
return ug + 0.1;
} else {
return this.tvStore.getUg(
enumTypeVitrageId,
enumTypeGazLameId,
enumInclinaisonVitrageId,
enumVitrageVir,
e
);
}
}
/**
* Proportion d’énergie solaire incidente qui pénètre dans le logement par la paroi vitrée en prenant en compte
* les doubles-fenêtres si existantes
*
* @param bv {BaieVitree}
* @return {number|undefined}
*/
sw(bv) {
const bvDE = bv.donnee_entree;
let sw = this.#sw(bvDE);
/**
* S'il existe une double-fenêtre, calcul des facteurs sw et uw équivalents
* 6.2.1 Détermination du facteur solaire
*/
if (bvDE.double_fenetre === 1 && bv.baie_vitree_double_fenetre) {
sw *= this.#sw(bv.baie_vitree_double_fenetre.donnee_entree) || 1;
}
return sw;
}
/**
* Proportion d’énergie solaire incidente qui pénètre dans le logement par la paroi vitrée
*
* @param bvDE {BaieVitreeDE|BaieVitreeDoubleFenetreDE}
* @return {number|undefined}
*/
#sw(bvDE) {
if (bvDE.sw_saisi) {
return bvDE.sw_saisi;
}
/**
* 6.2.1 Détermination du facteur solaire
* Les champs vitrage_vir et enum_type_pose_id ne sont pas présentes pour les matériaux 'brique de verre' et 'polycarbonate'
*
* enum_type_materiaux_menuiserie_id
* 1 - brique de verre
* 2 - polycarbonate
*/
let vitrageVir, typePose;
const typeMateriaux = bvDE.enum_type_materiaux_menuiserie_id;
if (![1, 2].includes(parseInt(typeMateriaux))) {
vitrageVir = bvDE.vitrage_vir;
typePose = bvDE.enum_type_pose_id;
}
return this.tvStore.getSw(
bvDE.enum_type_vitrage_id,
bvDE.enum_type_baie_id,
typeMateriaux,
vitrageVir,
typePose
);
}
/**
* Coefficient de transmission thermique de la fenêtre ou de la porte-fenêtre (vitrage + menuiserie) (W/(m².K)) en prenant en compte
* les doubles-fenêtres si existantes
*
* @param bv {BaieVitree}
* @param ug {number|undefined}
* @return {number|undefined}
*/
uw(bv, ug) {
const bvDE = bv.donnee_entree;
let uw = this.#uw(bvDE, ug);
/**
* S'il existe une double-fenêtre, calcul des facteurs sw et uw équivalents
* 3.3.2 Coefficients Uw des fenêtres / portes-fenêtres - Traitement des doubles fenêtre
*/
if (bvDE.double_fenetre === 1 && bv.baie_vitree_double_fenetre) {
const bvDoubleFenetreDE = bv.baie_vitree_double_fenetre.donnee_entree;
uw = 1 / (1 / uw + 1 / (this.#uw(bvDoubleFenetreDE, this.ug(bvDoubleFenetreDE)) || 1) + 0.07);
}
return uw;
}
/**
* Coefficient de transmission thermique de la fenêtre ou de la porte-fenêtre (vitrage + menuiserie) (W/(m².K))
*
* @param bvDE {BaieVitreeDE|BaieVitreeDoubleFenetreDE}
* @param ug {number|undefined}
* @return {number|undefined}
*/
#uw(bvDE, ug) {
if (bvDE.uw_saisi) {
return bvDE.uw_saisi;
}
return this.tvStore.getUw(bvDE.enum_type_baie_id, bvDE.enum_type_materiaux_menuiserie_id, ug);
}
/**
* 3.3.3 Coefficients Ujn des fenêtres/portes-fenêtres
* La présence de volets aux fenêtres et portes-fenêtres leur apporte un supplément d’isolation avec une résistance
* additionnelle ΔR
*
* @param bvDE {BaieVitreeDE}
* @param uw {number}
* @return {number|undefined}
*/
ujn(bvDE, uw) {
if (bvDE.ujn_saisi) {
return bvDE.ujn_saisi;
}
return this.tvStore.getUjn(bvDE.enum_type_fermeture_id, uw);
}
/**
* 6.2.2 Détermination du facteur d’ensoleillement
* Prise en comptes des masques qui peuvent faire de l'ombre sur les baies vitrées et influencé le facteur d'ensoleillement
*
* @param bvDE {BaieVitreeDE}
*
* @return {number[]}
*/
fe(bvDE) {
let fe1 = 1,
fe2 = 1;
// Calcul des incidences des masques non homogènes
if (bvDE.masque_lointain_non_homogene_collection) {
let masquesLointainNonHomogene =
bvDE.masque_lointain_non_homogene_collection.masque_lointain_non_homogene || [];
if (!Array.isArray(masquesLointainNonHomogene)) {
masquesLointainNonHomogene = [masquesLointainNonHomogene];
}
fe2 = Math.max(
0,
masquesLointainNonHomogene.reduce(
(acc, masqueLointainNonHomogene) => acc - this.calcOmbre(masqueLointainNonHomogene) / 100,
1
)
);
}
// Calcul des incidences des masques proches
if (bvDE.tv_coef_masque_proche_id) {
fe1 = this.tvStore.getMasqueProche(bvDE.tv_coef_masque_proche_id);
}
// Calcul des incidences des masques proches
if (bvDE.tv_coef_masque_lointain_homogene_id) {
fe2 = this.tvStore.getMasqueLointainHomogene(bvDE.tv_coef_masque_lointain_homogene_id);
}
return [fe1, fe2];
}
/**
* Calcul de l'ombre apportée par un masque lointain non homogène
* @param masqueLointainNonHomogene {MasqueLointainNonHomogene}
* @returns {number}
*/
calcOmbre(masqueLointainNonHomogene) {
return this.tvStore.getOmbre(masqueLointainNonHomogene.tv_coef_masque_lointain_non_homogene_id);
}
}