@open3cl/engine 1.10.1 → 1.11.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/9_chauffage.js CHANGED
@@ -41,6 +41,20 @@ export function isEmetteurAppointIndividuel(instChDe, idx) {
41
41
  );
42
42
  }
43
43
 
44
+ /**
45
+ * Longueur par défaut du réseau de l'installation de chauffage (m), même formule que la
46
+ * longueur de bouclage de l'installation ECS :
47
+ * Lb = 4 × (Sh / Niv)^0,5 + 6 × (Niv − 0,5)
48
+ * @see Methode_de_calcul_3CL_DPE_2021-338.pdf - §15.2.3
49
+ * @param {number} surfaceInstallation surface chauffée par l'installation (m²)
50
+ * @param {number} nombreNiveau nombre de niveaux desservis par l'installation
51
+ * @returns {number}
52
+ */
53
+ export function calc_lb_installation_ch(surfaceInstallation, nombreNiveau) {
54
+ const niv = Number(nombreNiveau) || 1;
55
+ return 4 * Math.pow(surfaceInstallation / niv, 0.5) + 6 * (niv - 0.5);
56
+ }
57
+
44
58
  export default function calc_chauffage(
45
59
  dpe,
46
60
  ch,
@@ -67,6 +81,7 @@ export default function calc_chauffage(
67
81
 
68
82
  di.besoin_ch = bch;
69
83
  di.besoin_ch_depensier = bch_dep;
84
+ di.lb = calc_lb_installation_ch(de.surface_chauffee || Sh, de.nombre_niveau_installation_ch);
70
85
 
71
86
  const em_ch = ch.emetteur_chauffage_collection.emetteur_chauffage;
72
87
  em_ch.forEach((em_ch, idx) => {
@@ -62,7 +62,8 @@ const {
62
62
  generateursPrincipauxCascade,
63
63
  ratioDimensionnement,
64
64
  reseauCirculateurUnique,
65
- isEmetteurAppointIndividuel
65
+ isEmetteurAppointIndividuel,
66
+ calc_lb_installation_ch
66
67
  } = await import('./9_chauffage.js');
67
68
  const { requestInput, tv, tvColumnIDs } = await import('./utils.js');
68
69
  const { calc_emetteur_ch } = await import('./9_emetteur_ch.js');
@@ -185,6 +186,8 @@ describe('calc_chauffage - cas nominal (1 générateur, 1 émetteur)', () => {
185
186
  expect(ch.donnee_intermediaire).toStrictEqual({
186
187
  besoin_ch: 1000,
187
188
  besoin_ch_depensier: 1200,
189
+ // 4 × (100 / 1)^0,5 + 6 × (1 − 0,5) = 43
190
+ lb: 43,
188
191
  conso_ch: 100,
189
192
  conso_ch_depensier: 120
190
193
  });
@@ -237,6 +240,53 @@ describe('calc_chauffage - cas nominal (1 générateur, 1 émetteur)', () => {
237
240
  });
238
241
  });
239
242
 
243
+ /**
244
+ * Longueur du réseau de l'installation de chauffage, même formule que la longueur de
245
+ * bouclage ECS : Lb = 4 × (Sh / Niv)^0,5 + 6 × (Niv − 0,5)
246
+ * @see : Methode_de_calcul_3CL_DPE_2021-338.pdf - §15.2.3
247
+ */
248
+ describe('calc_lb_installation_ch - longueur du réseau de chauffage', () => {
249
+ test.each([
250
+ ['1 niveau, 100 m²', 100, 1, 43],
251
+ ['1 niveau, 50 m²', 50, 1, 31.284271247461902],
252
+ ['3 niveaux, 100 m²', 100, 3, 38.09401076758503]
253
+ ])('%s', (_libelle, surface, niveaux, attendu) => {
254
+ // valeurs de référence de régression
255
+ expect(calc_lb_installation_ch(surface, niveaux)).toBeCloseTo(attendu, 9);
256
+ });
257
+
258
+ test.each([undefined, 0, null])('nombre de niveaux %s : repli sur 1 niveau', (niveaux) => {
259
+ expect(calc_lb_installation_ch(100, niveaux)).toBe(43);
260
+ });
261
+
262
+ test('nombre de niveaux saisi en chaîne', () => {
263
+ expect(calc_lb_installation_ch(100, '3')).toBeCloseTo(38.09401076758503, 9);
264
+ });
265
+ });
266
+
267
+ describe('calc_chauffage - longueur lb dans la donnée intermédiaire de l’installation', () => {
268
+ test('surface chauffée et nombre de niveaux de l’installation utilisés', () => {
269
+ const ch = installation([generateur()], [emetteur('1')], {
270
+ surface_chauffee: 100,
271
+ nombre_niveau_installation_ch: 3
272
+ });
273
+ appel(ch, { Sh: 500 });
274
+ expect(ch.donnee_intermediaire.lb).toBeCloseTo(38.09401076758503, 9);
275
+ });
276
+
277
+ test('surface chauffée absente : repli sur la surface habitable Sh', () => {
278
+ const ch = installation([generateur()], [emetteur('1')], { surface_chauffee: 0 });
279
+ appel(ch, { Sh: 50 });
280
+ expect(ch.donnee_intermediaire.lb).toBeCloseTo(31.284271247461902, 9);
281
+ });
282
+
283
+ test('aucun impact sur le besoin transmis au générateur', () => {
284
+ const ch = installation([generateur()], [emetteur('1')], { nombre_niveau_installation_ch: 3 });
285
+ appel(ch);
286
+ expect(vi.mocked(calc_generateur_ch).mock.calls[0][5]).toBe(1000);
287
+ });
288
+ });
289
+
240
290
  describe('calc_chauffage - mise à l’échelle du besoin selon la surface', () => {
241
291
  test('besoin ajusté au prorata surface_chauffee / Sh quand elles diffèrent', () => {
242
292
  const ch = installation([generateur()], [emetteur('1')]);
package/engine.js CHANGED
@@ -36,7 +36,7 @@ import DpeSanitizerService from './dpe-sanitizer.service.js';
36
36
  import { reconstituerRdimDpeGenereImmeuble } from './17.2_rdim_dpe_genere_immeuble.js';
37
37
  import { reconstituerRdimEcsIndividuelleUnique } from './11_rdim_ecs_individuelle_unique.js';
38
38
 
39
- const LIB_VERSION = '1.10.1';
39
+ const LIB_VERSION = '1.11.0';
40
40
 
41
41
  const dpeSanitizerService = new DpeSanitizerService();
42
42
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@open3cl/engine",
3
- "version": "1.10.1",
3
+ "version": "1.11.0",
4
4
  "description": "Open Source 3CL-DPE engine",
5
5
  "main": "index.js",
6
6
  "directories": {