parallel_structure.ts 7.82 KiB
import { CalculatorType } from "../compute-node";
import { Nub } from "../nub";
import { Pab } from "../pab/pab";
import { ParamCalculability } from "../param/param-definition";
import { ParamsEquation } from "../param/params-equation";
import { Session } from "../session";
import { Result } from "../util/result";
import { ParallelStructureParams } from "./parallel_structure_params";
import { Structure, StructureParams } from "./structure";
import { loiAdmissiblesOuvrages, LoiDebit } from "./structure_props";
export { ParallelStructureParams };
/**
 * Calcul de une ou plusieurs structures hydrauliques en parallèles
 * reliées par les cotes amont et aval et dont le débit est égal à la
 * somme des débits de chaque structure.
export class ParallelStructure extends Nub {
    constructor(prms: ParamsEquation, dbg: boolean = false) {
        super(prms, dbg);
        this._calcType = CalculatorType.ParallelStructure;
    /** children casting */
    public get structures() {
        return this._children as Structure[];
    public set structures(structures: Structure[]) {
        this._children = structures;
        this._children.forEach((s) => {
            s.parent = this;
        });
    /**
     * paramètres castés au bon type
    get prms(): ParallelStructureParams {
        return this._prms as ParallelStructureParams;
    /**
     * Is the Nub used in a PAB?
    get isInPAB(): boolean {
        return (this.parent !== undefined && this.parent instanceof Pab);
    public adjustChildParameters(child: Nub) {
        const prms = child.prms as StructureParams;
        if (!this.isInPAB && prms.ZDV.visible) {
            // Dans le contexte hors PAB
            // Pour les seuils (i.e. Structures avec cote de radier de seuil)
            // on remplace ZDV par h1 la charge sur le seuil
            prms.h1.visible = true;
            prms.ZDV.visible = false;
    /** Returns admissible LoiDebit grouped by StructureType */
    public getLoisAdmissibles(): { [key: string]: LoiDebit[]; } {
        return loiAdmissiblesOuvrages;
    /** Returns a flat array of all admissible LoiDebit */
    public getLoisAdmissiblesArray(): LoiDebit[] {
        let loisAdm: LoiDebit[] = [];
7172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
const lois = this.getLoisAdmissibles(); // tslint:disable-next-line:forin for (const k in lois) { loisAdm = loisAdm.concat(lois[k]); } return loisAdm; } /** Returns the 1st deep item from LoisAdmissibles */ public getDefaultLoiDebit(): LoiDebit { const lois = this.getLoisAdmissibles(); return lois[Object.keys(lois)[0]][0]; } /** * Calcul du débit des structures en parallèle (sans détail pour chaque structure) * @param sVarCalc Variable à calculer (Q uniquement) */ public Equation(sVarCalc: string): Result { Structure.CheckEquation(sVarCalc); return this.CalcQ(); } /** * Calcul de la somme des débits de chaque structure * @param iExcept Index de la structure à ne pas additionner (optionel) */ public CalcQ(iExcept?: number): Result { if (iExcept !== undefined) { if (iExcept < 0 || iExcept >= this._children.length) { throw new Error( "ParallelStructure.CalcQ iExcept not in [0;" + (this._children.length - 1) + "]", ); } } this.updateStructuresH1H2(); const calcRes: Result = new Result(0, this); let qTot: number = 0; for (let i = 0; i < this._children.length; i++) { if (i !== iExcept) { const res: Result = this._children[i].Calc("Q"); calcRes.resultElement.AddResultElementToExtra(res.resultElement, `ouvrage[${i}].Q`); qTot += res.vCalc; } } // Assigne le débit total dans le résultat calcRes.resultElement.vCalc = qTot; return calcRes; } /** * Calcul du débit total, de la cote amont ou aval ou d'un paramètre d'une structure * @param sVarCalc Nom du paramètre à calculer : * "Q", "Z1", "Z2" * ou { uid: "abcdef", symbol: "X" } avec "abcdef" l'index de l'ouvrage et "X" son paramètre * @param rInit Valeur initiale */ public Calc(sVarCalc: string | any, rInit?: number): Result { let res: Result; switch (sVarCalc) { case "Z1": case "Z2": case "Q": res = super.Calc(sVarCalc, rInit); if (res.ok) { this.getParameter(sVarCalc).v = res.vCalc; } break; default: if (typeof sVarCalc === "string") {
141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210
throw new Error("ParallelStructures.Calc() : unknow parameter to calculate " + sVarCalc); } // Pour les caractéristiques des ouvrages const structureIndex = this.getIndexForChild(sVarCalc.uid); res = this.CalcStructPrm(structureIndex, sVarCalc.symbol); if (res.ok) { // Suppression des extraResults : ils sont complétés plus bas pour chaque ouvrage res.resultElement.extraResults = {}; this._children[structureIndex].getParameter(sVarCalc.symbol).v = res.vCalc; } } if (res.ok) { // Recalcul du débit total pour récupérer les résultats des ouvrages dans les résultats complémentaires const resQtot: Result = this.CalcQ(); for (const extraResKey in resQtot.extraResults) { if (resQtot.extraResults.hasOwnProperty(extraResKey)) { res.resultElement.addExtraResult(extraResKey, resQtot.extraResults[extraResKey]); } } } this._result = res; return res; } /** * Once session is loaded, run a second pass on all linked parameters to * reset their target if needed */ public fixLinks(obj: any): { hasErrors: boolean } { // return value const ret = { hasErrors: false }; // iterate over parameters super.fixLinks(obj); // iterate over children if any if (obj.children && Array.isArray(obj.children)) { for (const s of obj.children) { // get the Nub const subNub = Session.getInstance().findNubByUid(s.uid); const res = subNub.fixLinks(s); // forward errors if (res.hasErrors) { ret.hasErrors = true; } } } return ret; } /** * paramétrage de la calculabilité des paramètres */ protected setParametersCalculability() { this.prms.Q.calculability = ParamCalculability.EQUATION; this.prms.Z1.calculability = ParamCalculability.DICHO; this.prms.Z2.calculability = ParamCalculability.DICHO; } /** * Mise à jour de Z1, Z2, h1 et h2 pour tous les ouvrages */ protected updateStructuresH1H2() { for (const structure of this.structures) { structure.prms.Z1.v = this.prms.Z1.v; structure.prms.Z2.v = this.prms.Z2.v; structure.prms.update_h1h2(); } }
211212213214215216217218219220221222223224225226
/** * Calcul du paramètre d'un des ouvrages en parallèle * @param sVC Index de l'ouvrage et paramètre à calculer * @param rInit Valeur initiale */ protected CalcStructPrm(index: number, symbol: string, rInit?: number): Result { // Le débit restant sur la structure en calcul est : this.structures[index].prms.Q.v = this.prms.Q.v - this.CalcQ(index).vCalc; // Calcul du paramètre de la structure en calcul return this.structures[index].Calc(symbol, rInit); } }