Commit 7a097ec3 authored by Mathias Chouet's avatar Mathias Chouet 🍝
Browse files

Fix #214 - RegimeUniforme: error when circ. section is under load

parent fc49b67e
......@@ -4,6 +4,7 @@ import { ParamsSectionCirc } from "../../../src/open-channel/section/section_cir
import { SessionSettings } from "../../../src/session_settings";
import { precDist } from "../../test_config";
import { checkResult } from "../../test_func";
import { MessageCode } from "../../../src/util/message";
describe("Class RegimeUniforme / section circulaire :", () => {
describe("pas de débordement : ", () => {
......@@ -159,4 +160,24 @@ describe("Class RegimeUniforme / section circulaire :", () => {
checkResult(ru.Calc("Y", 0), 2);
});
});
describe("en charge −", () => {
it("an error should be thrown if Y > D", () => { // @TODO or >= ?
const paramSection = new ParamsSectionCirc(
2, // diamètre
2.1, // tirant d'eau
13.551, // Ks=Strickler
1.2, // Q=Débit
0.001, // If=pente du fond
2.5, // YB= hauteur de berge
);
SessionSettings.precision = precDist;
const ru = new RegimeUniforme(new cSnCirc(paramSection));
ru.calculatedParam = paramSection.Q;
const res = ru.CalcSerie();
expect(res.ok).toBe(false);
expect(res.log.messages.length).toBe(1);
expect(res.log.messages[0].code).toBe(MessageCode.ERROR_RU_CIRC_LEVEL_TOO_HIGH);
});
});
});
......@@ -91,6 +91,16 @@ export function isEqual(a: number, b: number, e: number = 1E-7): boolean {
return (Math.abs((a / b) - 1) < e);
}
/** Retourne true si a < b à e près */
export function isLowerThan(a: number, b: number, e: number = 1E-7): boolean {
return (b - a) > e; // enfin (a + e) < b quoi
}
/** Retourne true si a > b à e près */
export function isGreaterThan(a: number, b: number, e: number = 1E-7): boolean {
return (a - b) > e;
}
/**
* Division entière de a par b, plus modulo, avec une tolérance e
* pour gérer le cas des nombres réels
......
......@@ -5,6 +5,8 @@ import { Result } from "../util/result";
import { SectionNub } from "./section/section_nub";
import { SectionParams } from "./section/section_parametree_params";
import { acSection } from "./section/section_type";
import { cSnCirc } from "./section/section_circulaire";
import { isGreaterThan } from "../base";
export class RegimeUniforme extends SectionNub {
......@@ -63,6 +65,13 @@ export class RegimeUniforme extends SectionNub {
if (this.section.prms.Y.v > this.section.prms.YB.v) {
r.resultElement.log.add(new Message(MessageCode.WARNING_SECTION_OVERFLOW));
}
// Est-ce qu'on est en charge sur une section circulaire ? @see #214
if (this.section instanceof cSnCirc && isGreaterThan(this.section.prms.Y.v, this.section.prms.D.v, 1e-3)) {
this.currentResult = new Result(new Message(MessageCode.ERROR_RU_CIRC_LEVEL_TOO_HIGH));
return this.result;
}
return r;
}
......
......@@ -240,6 +240,9 @@ export enum MessageCode {
*/
ERROR_REMOUS_PAS_CALCUL,
/** RegimeUniforme : en charge (le tirant d'eau dépasse le diamètre de la section circulaire) */
ERROR_RU_CIRC_LEVEL_TOO_HIGH,
/**
* section : Non convergence du calcul de la hauteur critique (Méthode de Newton)
*/
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment