UNPKG

@open3cl/engine

Version:

Open Source 3CL-DPE engine

132 lines (115 loc) 3.97 kB
import { mois_liste } from '../../../../../utils.js'; import { inject } from 'dioma'; import { FrTvStore } from '../../../../dpe/infrastructure/froid/frTv.store.js'; import { ApportGratuitService } from '../apport_gratuit/apport-gratuit.service.js'; /** * Calcul du besoin en froid * Chapitre 10.2 Calcul du besoin mensuel de froid * * Methode_de_calcul_3CL_DPE_2021 - Page 68 * Octobre 2021 * @see consolide_anne…arrete_du_31_03_2021_relatif_aux_methodes_et_procedures_applicables.pdf */ export class BesoinFroidService { /** * @type {ApportGratuitService} */ #apportGratuitService; /** * @type {FrTvStore} */ #tvStore; /** * @param tvStore {FrTvStore} * @param apportGratuitService {ApportGratuitService} */ constructor(tvStore = inject(FrTvStore), apportGratuitService = inject(ApportGratuitService)) { this.#tvStore = tvStore; this.#apportGratuitService = apportGratuitService; } /** * @param ctx {Contexte} * @param logement {Logement} * @return {{besoin_fr: number, besoin_fr_depensier: number}} */ execute(ctx, logement) { const clim = logement.climatisation_collection?.climatisation || []; if (clim.length === 0) { return { besoin_fr: 0, besoin_fr_depensier: 0 }; } return mois_liste.reduce( (acc, mois) => { acc.besoin_fr += this.besoinFrMois(ctx, logement, mois, false); acc.besoin_fr_depensier += this.besoinFrMois(ctx, logement, mois, true); return acc; }, { besoin_fr: 0, besoin_fr_depensier: 0 } ); } /** * Calcul du besoin en froid pour un mois donné * * @param ctx {Contexte} * @param logement {Logement} * @param mois {string} * @param depensier {boolean} * @returns {number} */ besoinFrMois(ctx, logement, mois, depensier) { const nref = this.#tvStore.getData( depensier ? 'nref26' : 'nref28', ctx.altitude.value, ctx.zoneClimatique.value, mois ); if (nref === 0) return 0; const eFr = this.#tvStore.getData( depensier ? 'e_fr_26' : 'e_fr_28', ctx.altitude.value, ctx.zoneClimatique.value, mois ); // Température extérieure moyenne sur le mois j pendant les périodes de climatisation (°C) const tempExtMoyClim = this.#tvStore.getData( depensier ? 'textmoy_clim_26' : 'textmoy_clim_28', ctx.altitude.value, ctx.zoneClimatique.value, mois ); // Température de consigne en froid (°C) const temperatureInterieure = depensier ? 26 : 28; const aijFr = this.#apportGratuitService.apportInterneMois(ctx, nref); const asjFr = this.#apportGratuitService.apportSolaireMois(ctx, logement.enveloppe, mois, eFr); // Transfert thermique à travers l’enveloppe et le renouvellement d’air (W/K). Le GV prend en compte les // échanges de chaleur par le renouvellement d‘air. Ces échanges sont calculés sur la période de refroidissement // de la même façon que pour la période de chauffage const GV = logement.sortie?.deperdition?.deperdition_enveloppe; // Ratio de bilan thermique const Rbth = (aijFr + asjFr) / (GV * (tempExtMoyClim - temperatureInterieure) * nref); if (Rbth < 1 / 2) return 0; // Constante de temps de la zone pour le refroidissement const t = (this.#cin(ctx.inertie.id) * ctx.surfaceHabitable) / (3600 * GV); const a = 1 + t / 15; // Facteur d'utilisation des apports sur le mois let fut = Rbth === 1 ? a / (a + 1) : (1 - Rbth ** -a) / (1 - Rbth ** (-a - 1)); return ( (aijFr + asjFr) / 1000 - ((fut * GV) / 1000) * (temperatureInterieure - tempExtMoyClim) * nref ); } /** * Capacité thermique intérieure efficace de la zone (J/K) * @param inertie * @returns {number} */ #cin(inertie) { switch (inertie) { case 1: case 2: return 260000; case 3: return 165000; case 4: return 110000; } } }