Commit 94d7ca87 authored by Grand Francois's avatar Grand Francois
Browse files

#44 implémentation Nub.CalcSerie()

Showing with 140 additions and 31 deletions
+140 -31
/**
* Série de valeurs à calculer définie par le nom de la variable à sérier et le vecteur de valeur
*/
export class Serie {
public name: string;
public values: number[];
constructor(name: string, values: number[]) {
this.name = name;
this.values = values;
}
}
/** /**
* Gestion des messages de debogage dans la console * Gestion des messages de debogage dans la console
* @note Etendre cette classe pour toutes les classes à debugguer * @note Etendre cette classe pour toutes les classes à debugguer
......
import { Debug } from "./base"; import { Debug } from "./base";
import { ParamsEquation } from "./param/params-equation"; import { ParamsEquation } from "./param/params-equation";
import { ParamDefinition } from "./param/param-definition"; import { ParamDefinition } from "./param/param-definition";
import { ParamValueMode } from "./param/param-values";
/** /**
* type de calculette * type de calculette
...@@ -51,5 +52,16 @@ export abstract class ComputeNode extends Debug { ...@@ -51,5 +52,16 @@ export abstract class ComputeNode extends Debug {
return this._prms.getFirstAnalyticalParameter(); return this._prms.getFirstAnalyticalParameter();
} }
public initParametersValueMode(computedParam: ParamDefinition, variatedParam?: ParamDefinition, variatedMode?: ParamValueMode) {
for (const k in this._prms.map) {
if (k == computedParam.symbol)
this._prms.map[k].paramValues.valueMode = ParamValueMode.CALCUL;
else if (variatedParam && k == variatedParam.symbol)
this._prms.map[k].paramValues.valueMode = variatedMode;
else
this._prms.map[k].paramValues.valueMode = ParamValueMode.SINGLE;
}
}
protected abstract setParametersCalculability(): void; protected abstract setParametersCalculability(): void;
} }
import { Debug, Serie } from "./base"; import { Debug } from "./base";
import { Dichotomie } from "./dichotomie"; import { Dichotomie } from "./dichotomie";
import { ComputeNode } from "./compute-node"; import { ComputeNode } from "./compute-node";
import { Result } from "./util/result"; import { Result } from "./util/result";
import { ParamValues, ParamValueMode } from "./param/param-values";
import { ParamDefinition } from ".";
/** /**
* Classe abstraite de Noeud de calcul : classe de base pour tous les calculs * Classe abstraite de Noeud de calcul : classe de base pour tous les calculs
...@@ -58,13 +60,56 @@ export abstract class Nub extends ComputeNode { ...@@ -58,13 +60,56 @@ export abstract class Nub extends ComputeNode {
return res; return res;
} }
public CalcSerie(svarCalc: string, serie: Serie): Result[] { public CalcSerie(rPrec: number = 0.001, rInit?: number): Result {
/** @todo faire une boucle pour appeler this.Calc avec chaque valeur de serie.values const res = new Result();
* this._result = res;
*/
// let results = [new (Result)]; let variatedParam: ParamDefinition;
const results = [new Result(0)]; let computedParam: ParamDefinition;
return results; for (const k in this._prms.map) {
const p: ParamDefinition = this._prms.map[k];
switch (p.valueMode) {
case ParamValueMode.LISTE:
case ParamValueMode.MINMAX:
if (variatedParam == undefined)
variatedParam = p;
else
throw new Error(`CalcSerie() : il y plusieurs paramètres à varier (au moins ${variatedParam.symbol} et ${p.symbol})`);
break;
case ParamValueMode.CALCUL:
if (computedParam == undefined)
computedParam = p;
else
throw new Error(`CalcSerie() : il y plusieurs paramètres à calculer (au moins ${computedParam.symbol} et ${p.symbol})`);
break;
}
}
if (computedParam == undefined)
throw new Error(`CalcSerie() : aucun paramètre à calculer`);
if (rInit === undefined)
rInit = this._prms.map[computedParam.symbol].v;
if (variatedParam == undefined)
this.Calc(computedParam.symbol, rInit, rPrec); // résultat dans this._result
else {
const res = new Result();
variatedParam.paramValues.initIterator();
while (variatedParam.paramValues.hasNext) {
variatedParam.paramValues.next;
this.Calc(computedParam.symbol, rInit, rPrec); // résultat dans this._result
res.addResultElement(this._result.resultElement);
res.addLog(this._result.log);
if (this._result.ok)
rInit = this._result.resultElement.vCalc;
}
this._result = res;
}
return this._result;
} }
/** /**
......
...@@ -82,11 +82,32 @@ export class ParamValueIterator implements IterableIterator<number> { ...@@ -82,11 +82,32 @@ export class ParamValueIterator implements IterableIterator<number> {
} }
} }
public get hasNext(): boolean {
switch (this._config) {
// valeur fixée
case 0:
return this._index == 0;
// min/max
case 1:
const end = this._reverse ? this._index < this._param.min : this._index > this._param.max;
return !end;
// liste
case 2:
const i = this._index;
return this._index >= this._param.valueList.length;
default:
throw new Error(`ParamValueIterator.hasNext() : erreur interne`);
}
}
public next(): IteratorResult<number> { public next(): IteratorResult<number> {
switch (this._config) { switch (this._config) {
// valeur fixée // valeur fixée
case 0: case 0:
if (this._index == 0) if (this.hasNext)
return { return {
done: false, done: false,
value: this._param.singleValue value: this._param.singleValue
...@@ -100,8 +121,7 @@ export class ParamValueIterator implements IterableIterator<number> { ...@@ -100,8 +121,7 @@ export class ParamValueIterator implements IterableIterator<number> {
// min/max // min/max
case 1: case 1:
const res = this._index; const res = this._index;
const end = this._reverse ? this._index < this._param.min : this._index > this._param.max; if (this.hasNext) {
if (!end) {
if (this._reverse) if (this._reverse)
this._index -= this._param.step; this._index -= this._param.step;
else else
...@@ -120,7 +140,7 @@ export class ParamValueIterator implements IterableIterator<number> { ...@@ -120,7 +140,7 @@ export class ParamValueIterator implements IterableIterator<number> {
// liste // liste
case 2: case 2:
const i = this._index; const i = this._index;
if (this._index < this._param.valueList.length) { if (this.hasNext) {
const res = this._param.valueList[this._index++]; const res = this._param.valueList[this._index++];
return { return {
done: false, done: false,
...@@ -182,6 +202,11 @@ export class ParamValues { ...@@ -182,6 +202,11 @@ export class ParamValues {
*/ */
private _valueList: number[]; private _valueList: number[];
/**
* itérateur courant
*/
private _iterator: ParamValueIterator;
constructor() { constructor() {
this._singleValue = new DefinedNumber(); this._singleValue = new DefinedNumber();
this.valueMode = ParamValueMode.CALCUL; this.valueMode = ParamValueMode.CALCUL;
...@@ -280,10 +305,47 @@ export class ParamValues { ...@@ -280,10 +305,47 @@ export class ParamValues {
this.valueMode = ParamValueMode.LISTE; this.valueMode = ParamValueMode.LISTE;
} }
/**
* crée un iterateur
* @param reverse true si on veut itérer max->min ou depuis la fin de la liste
*/
public getValuesIterator(reverse: boolean = false): ParamValueIterator { public getValuesIterator(reverse: boolean = false): ParamValueIterator {
return new ParamValueIterator(this, reverse); return new ParamValueIterator(this, reverse);
} }
/**
*
* @param reverse prépare un itérateur pour parcourir les valeurs
*/
public initIterator(reverse: boolean = false) {
switch (this._valueMode) {
case ParamValueMode.LISTE:
case ParamValueMode.MINMAX:
break;
default:
throw new Error(`ParamValues : mode de valeurs ${ParamValueMode[this._valueMode]} incorrect`);
}
this._iterator = this.getValuesIterator(reverse);
}
/**
* @return true si il reste des valeurs à parcourir par l'itérateur courant
*/
public get hasNext(): boolean {
return this._iterator.hasNext;
}
/**
* fixe la valeur courante à la prochaine valeur à parcourir par l'itérateur courant
* @return prochaine valeur à parcourir par l'itérateur courant
*/
public get next(): number {
this._singleValue.value = this._iterator.next().value;
return this._singleValue.value;
}
/** /**
* copie des membres * copie des membres
*/ */
......
...@@ -9,7 +9,7 @@ import { cLog } from "./util/log"; ...@@ -9,7 +9,7 @@ import { cLog } from "./util/log";
import { Message, MessageCode } from "./util/message"; import { Message, MessageCode } from "./util/message";
import { Result } from "./util/result"; import { Result } from "./util/result";
import { ResultElement } from "./util/resultelement"; import { ResultElement } from "./util/resultelement";
import { ParamValueIterator, ParamValues } from "."; import { ParamValueIterator, ParamValues, BaseParam } from ".";
export enum MethodeResolution { export enum MethodeResolution {
Trapezes, EulerExplicite, RungeKutta4 Trapezes, EulerExplicite, RungeKutta4
...@@ -563,7 +563,8 @@ export class CourbeRemous extends Nub { ...@@ -563,7 +563,8 @@ export class CourbeRemous extends Nub {
`Condition limite aval (${this.prms.Yaval.v}) >= ` + `Condition limite aval (${this.prms.Yaval.v}) >= ` +
`Hauteur critique (${this.Sn.HautCritique}) : calcul de la partie fluviale à partir de l'aval`); `Hauteur critique (${this.Sn.HautCritique}) : calcul de la partie fluviale à partir de l'aval`);
this.Dx = this.prms.Dx.v; this.Dx = this.prms.Dx.v;
res = this.calcul(this.prms.Yaval.v, xValues.getValuesIterator(true)); xValues.initIterator(true);
res = this.calcul(this.prms.Yaval.v, xValues);
res.insertMessage(new Message(MessageCode.INFO_REMOUS_CALCUL_FLUVIAL)); res.insertMessage(new Message(MessageCode.INFO_REMOUS_CALCUL_FLUVIAL));
} else { } else {
this.debug( this.debug(
...@@ -597,7 +598,8 @@ export class CourbeRemous extends Nub { ...@@ -597,7 +598,8 @@ export class CourbeRemous extends Nub {
") <= Hauteur critique (" + this.Sn.HautCritique + ") <= Hauteur critique (" + this.Sn.HautCritique +
") : calcul de la partie torrentielle à partir de l'amont"); ") : calcul de la partie torrentielle à partir de l'amont");
this.Dx = -this.prms.Dx.v; this.Dx = -this.prms.Dx.v;
res = this.calcul(this.prms.Yamont.v, xValues.getValuesIterator(false)); xValues.initIterator(false);
res = this.calcul(this.prms.Yamont.v, xValues);
res.insertMessage(new Message(MessageCode.INFO_REMOUS_CALCUL_TORRENTIEL)); res.insertMessage(new Message(MessageCode.INFO_REMOUS_CALCUL_TORRENTIEL));
} else { } else {
// this._log.add(new Message(MessageCode.ERROR_REMOUS_PAS_CALCUL_DEPUIS_AMONT)); // this._log.add(new Message(MessageCode.ERROR_REMOUS_PAS_CALCUL_DEPUIS_AMONT));
...@@ -815,15 +817,16 @@ export class CourbeRemous extends Nub { ...@@ -815,15 +817,16 @@ export class CourbeRemous extends Nub {
* Calcul d'une courbe de remous en fluvial ou torrentiel * Calcul d'une courbe de remous en fluvial ou torrentiel
* @param YCL Condition limite amont (torrentiel) ou aval (fluvial) * @param YCL Condition limite amont (torrentiel) ou aval (fluvial)
*/ */
private calcul(YCL: number, valueIterator: ParamValueIterator): ResultElement { private calcul(YCL: number, varParam: ParamValues): ResultElement {
const trY: { [key: number]: number; } = {}; const trY: { [key: number]: number; } = {};
const res = new ResultElement(); const res = new ResultElement();
let lastY = YCL; let lastY = YCL;
trY[round(valueIterator.next().value, this.prmSect.iPrec.v)] = lastY; trY[round(varParam.next, this.prmSect.iPrec.v)] = lastY;
// Boucle de calcul de la courbe de remous // Boucle de calcul de la courbe de remous
for (const x of valueIterator) { while (varParam.hasNext) {
const x = varParam.next;
// this.debug("lastY " + lastY); // this.debug("lastY " + lastY);
const rY: Result = this.Calc_Y(lastY); const rY: Result = this.Calc_Y(lastY);
// this.debug("calcul : x " + x + " y " + rY.vCalc); // this.debug("calcul : x " + x + " y " + rY.vCalc);
......
Supports Markdown
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