parallel_structure.ts 7.09 KB
Newer Older
Mathias Chouet's avatar
Mathias Chouet committed
1
import { CalculatorType } from "../compute-node";
2
import { Session } from "../index";
3
import { Nub } from "../nub";
4
import { ParamCalculability } from "../param/param-definition";
Mathias Chouet's avatar
Mathias Chouet committed
5
import { ParamsEquation } from "../param/params-equation";
6
7
import { Result } from "../util/result";
import { ParallelStructureParams } from "./parallel_structure_params";
8
import { Structure } from "./structure";
9
10
import { loiAdmissiblesOuvrages, LoiDebit } from "./structure_props";

11
12
13
14
15
16
17
/**
 * 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 {

Mathias Chouet's avatar
Mathias Chouet committed
18
19
20
    constructor(prms: ParamsEquation, dbg: boolean = false) {
        super(prms, dbg);
        this._calcType = CalculatorType.ParallelStructure;
Mathias Chouet's avatar
Mathias Chouet committed
21
        this._childrenType = "Structure";
Mathias Chouet's avatar
Mathias Chouet committed
22
    }
23

Mathias Chouet's avatar
Mathias Chouet committed
24
    /** children casting */
25
    public get structures() {
Mathias Chouet's avatar
Mathias Chouet committed
26
        return this._children as Structure[];
27
    }
28

29
30
    public set structures(structures: Structure[]) {
        this._children = structures;
Mathias Chouet's avatar
Mathias Chouet committed
31
32
33
        this._children.forEach((s) => {
            s.parent = this;
        });
34
35
    }

36
37
38
39
40
41
42
    /**
     * paramètres castés au bon type
     */
    get prms(): ParallelStructureParams {
        return this._prms as ParallelStructureParams;
    }

43
    /** Returns admissible LoiDebit grouped by StructureType */
44
45
46
47
    public getLoisAdmissibles(): { [key: string]: LoiDebit[]; } {
        return loiAdmissiblesOuvrages;
    }

48
49
50
51
52
53
54
55
56
57
58
    /** Returns a flat array of all admissible LoiDebit */
    public getLoisAdmissiblesArray(): LoiDebit[] {
        let loisAdm: LoiDebit[] = [];
        const lois = this.getLoisAdmissibles();
        // tslint:disable-next-line:forin
        for (const k in lois) {
            loisAdm = loisAdm.concat(lois[k]);
        }
        return loisAdm;
    }

59
60
61
62
63
64
    /** Returns the 1st deep item from LoisAdmissibles */
    public getDefaultLoiDebit(): LoiDebit {
        const lois = this.getLoisAdmissibles();
        return lois[Object.keys(lois)[0]][0];
    }

65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
    /**
     * 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) {
Mathias Chouet's avatar
Mathias Chouet committed
80
            if (iExcept < 0 || iExcept >= this._children.length) {
81
                throw new Error(
Mathias Chouet's avatar
Mathias Chouet committed
82
                    "ParallelStructure.CalcQ iExcept not in [0;" + (this._children.length - 1) + "]",
83
84
85
                );
            }
        }
Dorchies David's avatar
Dorchies David committed
86
        this.updateStructuresH1H2();
87
        const calcRes: Result = new Result(0, this);
88
        let qTot: number = 0;
Mathias Chouet's avatar
Mathias Chouet committed
89
        for (let i = 0; i < this._children.length; i++) {
90
            if (i !== iExcept) {
Mathias Chouet's avatar
Mathias Chouet committed
91
                const res: Result = this._children[i].Calc("Q");
92
                qTot += res.vCalc;
93
94
                // merge logs
                calcRes.resultElement.log.addLog(res.log);
95
96
            }
        }
Dorchies David's avatar
Dorchies David committed
97
        // Assigne le débit total dans le résultat
98
        calcRes.resultElement.vCalc = qTot;
99
100
101
102
103
104
        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 :
105
106
     *                 "Q", "Z1", "Z2"
     *                 ou { uid: "abcdef", symbol: "X" } avec "abcdef" l'index de l'ouvrage et "X" son paramètre
107
108
     * @param rInit Valeur initiale
     */
109
    public Calc(sVarCalc: string | any, rInit?: number): Result {
110
        // if Calc() is called outside of CalcSerie(), _result might not be initialized
111
        if (! this.result) {
112
113
            this.initNewResultElement();
        }
114
        switch (sVarCalc) {
115
116
117
            case "Z1":
            case "Z2":
            case "Q":
118
                this.currentResult = super.Calc(sVarCalc, rInit);
119
120
                if (this.result.ok) {
                    this.getParameter(sVarCalc).v = this.result.resultElement.vCalc;
Dorchies David's avatar
Dorchies David committed
121
122
                }
                break;
123
            default:
Mathias Chouet's avatar
Mathias Chouet committed
124
125
126
                if (typeof sVarCalc === "string") {
                    throw new Error("ParallelStructures.Calc() : unknow parameter to calculate " + sVarCalc);
                }
127
                // Pour les caractéristiques des ouvrages
Mathias Chouet's avatar
Mathias Chouet committed
128
                const structureIndex = this.getIndexForChild(sVarCalc.uid);
129
                const r = this.CalcStructPrm(structureIndex, sVarCalc.symbol, rInit);
130
131
132
133
134
135
136
                // whether r is .ok() or not, just copy vCalc and logs to avoid
                // this._result being polluted by structure.flagsNull
                this.result.symbol = r.symbol;
                this.result.vCalc = r.vCalc;
                // merge logs
                this.result.log.addLog(r.log);
                this.result.globalLog.addLog(r.globalLog);
Dorchies David's avatar
Dorchies David committed
137
        }
138

139
        return this.result;
140
141
    }

142
143
144
145
    /**
     * Once session is loaded, run a second pass on all linked parameters to
     * reset their target if needed
     */
146
147
148
149
150
    public fixLinks(obj: any): { hasErrors: boolean } {
        // return value
        const ret = {
            hasErrors: false
        };
151
152
153
        // iterate over parameters
        super.fixLinks(obj);

154
155
156
        // iterate over children if any
        if (obj.children && Array.isArray(obj.children)) {
            for (const s of obj.children) {
157
158
                // get the Nub
                const subNub = Session.getInstance().findNubByUid(s.uid);
159
160
161
162
163
                const res = subNub.fixLinks(s);
                // forward errors
                if (res.hasErrors) {
                    ret.hasErrors = true;
                }
164
165
            }
        }
166
        return ret;
167
168
    }

169
170
171
172
173
174
175
176
177
    /**
     * 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;
    }

178
179
180
    /**
     * Mise à jour de Z1, Z2, h1 et h2 pour tous les ouvrages
     */
Dorchies David's avatar
Dorchies David committed
181
    protected updateStructuresH1H2() {
Mathias Chouet's avatar
Mathias Chouet committed
182
        for (const structure of this.structures) {
183
184
185
186
187
188
            structure.prms.Z1.v = this.prms.Z1.v;
            structure.prms.Z2.v = this.prms.Z2.v;
            structure.prms.update_h1h2();
        }
    }

Mathias Chouet's avatar
Fix #73    
Mathias Chouet committed
189
190
191
192
193
    /**
     * 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
     */
194
    protected CalcStructPrm(index: number, symbol: string, rInit?: number): Result {
Mathias Chouet's avatar
Fix #73    
Mathias Chouet committed
195
        // Le débit restant sur la structure en calcul est :
196
        this.structures[index].prms.Q.v = this.prms.Q.v - this.CalcQ(index).vCalc;
Mathias Chouet's avatar
Fix #73    
Mathias Chouet committed
197
198

        // Calcul du paramètre de la structure en calcul
199
200
201
        const r: Result = this.structures[index].Calc(symbol, rInit);
        this.structures[index].result.values.Q = this.structures[index].prms.Q.v;
        return r;
202
203
    }

204
}