26 include_spip(
'hyd_inc/newton.class');
41 $this->rKs=(real)
$rKs;
43 $this->rIf=(real)
$rIf;
44 $this->rPrec=(real)
$rPrec;
45 $this->rYB=(real)
$rYB;
46 $this->iPrec=(int)-log10(
$rPrec);
63 protected $bSnFermee =
false;
78 private $arCalc = array();
79 protected $arCalcGeo = array();
82 private $arCalc_old = array();
87 protected $nbDessinPoints=1;
106 $this->arCalc = array();
108 $this->arCalcGeo = array();
119 $this->rY_old = $this->rY;
120 $this->arCalc_old = $this->arCalc;
123 $this->rY = $this->rY_old;
124 $this->arCalc = $this->arCalc_old;
125 $this->arCalc_old = array();
136 public function Calc($sDonnee, $rY =
false) {
137 if($rY!==
false && $rY!=$this->rY) {
138 if(self::DBG) spip_log(
'Calc('.$sDonnee.
') rY='.$rY.
' => $this->rY',
'hydraulic.'._LOG_DEBUG);
143 if(!isset($this->arCalc[$sDonnee]) | (isset($this->arCalc[$sDonnee]) && !$this->arCalc[$sDonnee])) {
147 $this->arCalc[$sDonnee] = $this->oP->rIf-$this->Calc(
'J');
150 $Methode =
'Calc_'.$sDonnee;
151 $this->arCalc[$sDonnee] = $this->$Methode();
155 if(self::DBG) spip_log(
'Calc('.$sDonnee.
')='.$this->arCalc[$sDonnee],
'hydraulic.'._LOG_DEBUG);
156 return $this->arCalc[$sDonnee];
167 if($sDonnee !=
'B' && !isset($this->arCalcGeo[
'B'])) {
171 if(!isset($this->arCalcGeo[$sDonnee])) {
176 $this->rY = $this->oP->rYB;
180 $this->arCalcGeo[$sDonnee] = $this->Calc_B();
181 if($this->arCalcGeo[$sDonnee] < $this->oP->rYB / 100) {
183 $this->bSnFermee =
true;
185 $this->arCalcGeo[$sDonnee] = $this->oP->rYB / 100;
187 $this->rLargeurBerge = $this->arCalcGeo[$sDonnee];
190 $Methode =
'Calc_'.$sDonnee;
191 $this->arCalcGeo[$sDonnee] = $this->$Methode();
196 return $this->arCalcGeo[$sDonnee];
206 return $rY*$this->rLargeurBerge;
215 return $this->rLargeurBerge;
243 if($this->Calc(
'P')!=0) {
244 return $this->Calc(
'S')/$this->Calc(
'P');
257 if($this->Calc(
'P')!=0) {
258 return ($this->Calc(
'B')*$this->Calc(
'P')-$this->Calc(
'S')*$this->Calc(
'dP'))/pow($this->Calc(
'P'),2);
271 return $this->rLargeurBerge;
289 if($this->Calc(
'R')!=0) {
290 return pow($this->Calc(
'V')/$this->oP->rKs,2)/pow($this->Calc(
'R'),4/3);
303 if($this->Calc(
'S')!=0) {
304 return $this->oP->rQ/$this->Calc(
'S')*sqrt($this->Calc(
'B')/$this->Calc(
'S')/$this->oP->rG);
315 if($this->Calc(
'S')!=0) {
316 return $this->oP->rQ/$this->Calc(
'S');
329 return $this->rY+pow($this->Calc(
'V'),2)/(2*$this->oP->rG);
340 $rHsc = $this->Calc(
'Hs',$this->CalcGeo(
'Yc'));
353 if(!$this->rHautCritique = $oHautCritique->Newton($this->oP->rYB) or !$oHautCritique->HasConverged()) {
354 $this->oLog->Add(_T(
'hydraulic:h_critique').
' : '._T(
'hydraulic:newton_non_convergence'),
true);
356 return $this->rHautCritique;
364 if($this->oP->rIf <= 0) {
365 $this->rHautNormale =
false;
366 $this->oLog->Add(_T(
'hydraulic:h_normale_pente_neg_nul'),
true);
369 if(!$this->rHautNormale = $oHautNormale->Newton($this->CalcGeo(
'Yc')) or !$oHautNormale->HasConverged()) {
370 $this->oLog->Add(_T(
'hydraulic:h_normale').
' : '._T(
'hydraulic:newton_non_convergence'),
true);
373 return $this->rHautNormale;
382 if($this->rY > $this->CalcGeo(
'Yc')) {
387 return $oHautCorrespondante->Newton($this->Calc(
'Yc')*2);
397 if($this->rY < $this->CalcGeo(
'Yc')) {
402 return $oHautCorrespondante->Newton($this->CalcGeo(
'Yc')/2);
417 if($this->Calc(
'Fr') < 1) {
419 $rY0 = $this->Calc(
'Yt');
423 $rY0 = $this->Calc(
'Yf');
425 if(!$Yco = $oHautConj->Newton($rY0) or !$oHautConj->HasConverged()) {
426 $this->oLog->Add(_T(
'hydraulic:h_conjuguee').
' : '._T(
'hydraulic:newton_non_convergence'),
true);
438 return 1000 * $this->oP->rG * $this->Calc(
'R') * $this->Calc(
'J');
447 return pow($rY,2) * $this->rLargeurBerge / 2;
457 return $rY * $this->rLargeurBerge;
466 return 1000 * ($this->oP->rQ * $this->Calc(
'V') + $this->oP->rG * $this->Calc(
'SYg'));
493 $rPas = $this->oP->rYB / $this->nbDessinPoints;
496 for($rY=0;$rY<$this->oP->rYB+$rPas/2;$rY+=$rPas) {
498 $tPoints[
'x'][] = $this->Calc(
'B',$rY)/2;
499 $tPoints[
'y'][] = $rY;
521 $this->oSn = clone $oSn;
523 parent::__construct($oP);
532 if($this->oSn->Calc(
'S',$rX)!=0) {
533 $rFn = (pow($this->oP->rQ,2)*$this->oSn->Calc(
'B',$rX)/pow($this->oSn->Calc(
'S',$rX),3)/$this->oP->rG-1);
547 if($this->oSn->Calc(
'S')!=0) {
549 $rDer = ($this->oSn->Calc(
'dB')*$this->oSn->Calc(
'S')-3*$this->oSn->Calc(
'B')*$this->oSn->Calc(
'B'));
550 $rDer = pow($this->oP->rQ,2)/$this->oP->rG * $rDer / pow($this->oSn->Calc(
'S'),4);
578 $this->oSn= clone $oSn;
583 parent::__construct($oP);
592 $rFn = ($this->rQ-$this->rKs*pow($this->oSn->Calc(
'R',$rX),2/3)*$this->oSn->Calc(
'S',$rX)*sqrt($this->rIf));
603 $rDer = 2/3*$this->oSn->Calc(
'dR')*pow($this->oSn->Calc(
'R'),-1/3)*$this->oSn->Calc(
'S');
604 $rDer += pow($this->oSn->Calc(
'R'),2/3)*$this->oSn->Calc(
'B');
605 $rDer *= -$this->rKs * sqrt($this->rIf);
627 parent::__construct($oP);
628 $this->rY = $oSn->rY;
629 $this->rS2 = pow($oSn->
Calc(
'S'),-2);
630 $this->oSn = clone $oSn;
631 $this->rQ2G = pow($oP->rQ,2)/(2*$oP->rG);
641 $rFn = $this->rY - $rX + ($this->rS2-pow($this->oSn->Calc(
'S',$rX),-2))*$this->rQ2G;
652 if($this->oSn->Calc(
'S')!=0) {
653 $rDer = -1 + 2 * $this->rQ2G * $this->oSn->Calc(
'B') / pow($this->oSn->Calc(
'S'),3);
690 parent::__construct($oP);
691 $this->rY = $oSn->rY;
692 $this->rQ2 = pow($oP->rQ,2);
693 $this->oSn = clone $oSn;
695 $this->rS = $oSn->Calc(
'S');
696 $this->rSYg = $oSn->Calc(
'SYg');
705 if($this->rS > 0 && $this->oSn->Calc(
'S',$rX) > 0) {
706 $rFn = $this->rQ2 * (1 / $this->rS - 1 / $this->oSn->Calc(
'S'));
707 $rFn += $this->rG * ($this->rSYg - $this->oSn->Calc(
'SYg'));
712 if(self::DBG) spip_log(
'cHautConjuguee:CalcFn('.$rX.
')='.$rFn,
'hydraulic.'._LOG_DEBUG);
722 if($this->rS > 0 && $this->oSn->Calc(
'S') > 0) {
723 $rDer = $this->rQ2 * $this->oSn->Calc(
'dS') * pow($this->oSn->Calc(
'S'),-2);
724 $rDer += - $this->rG * $this->oSn->Calc(
'dSYg',$rX);
729 if(self::DBG) spip_log(
'cHautConjuguee:CalcDer('.$rX.
')='.$rDer,
'hydraulic.'._LOG_DEBUG);
$rG
Précision de calcul et d'affichage.
$rYB
Précision en nombre de décimales.
$iPrec
Constante de gravité
Calc_Fr()
Calcul du nombre de Froude.
Calcul de la hauteur critique.
$rS2
1/S^2 associé au tirant d'eau connu
Calc_Yt()
Calcul du tirant d'eau torrentiel.
$rHautCritique
Tirant d'eau.
Calc_P($rY=0)
Calcul du périmètre hydraulique.
Calc_Alpha()
Calcul de l'angle Alpha entre la surface libre et le fond pour les sections circulaires.
Calc_Hsc()
Calcul de la charge spécifique critique.
__construct($rKs, $rQ, $rIf, $rPrec, $rYB)
Hauteur de berge.
__construct($oSn, cParam $oP)
Constructeur de la classe.
CalcGeo($sDonnee)
Calcul des données uniquement dépendantes de la géométrie de la section.
$rHautNormale
Tirant d'eau critique.
$rLargeurBerge
Pour l'affichage du journal de calcul.
Calc_J()
Calcul de la perte de charge par la formule de Manning-Strickler.
Calc_Yco()
Calcul du tirant d'eau conjugué.
CalcFn($rX)
Calcul de la fonction dont on cherche le zéro.
Swap($bMem)
Mémorise les données hydraulique en cours ou les restitue.
CalcDer($rX)
Calcul analytique de la dérivée de la fonction dont on cherche le zéro.
CalcDer($rX)
Calcul analytique de la dérivée de la fonction dont on cherche le zéro.
Calc_Yf()
Calcul du tirant d'eau fluvial.
Calc_Tau0()
Calcul de la contrainte de cisaillement.
Reset($bGeo=true)
Efface toutes les données calculées pour forcer le recalcul.
CalcFn($rX)
Calcul de la fonction dont on cherche le zéro.
Calc_SYg($rY)
Calcul de la distance du centre de gravité de la section à la surface libre multiplié par la surface ...
$rS
Surface hydraulique associée au tirant d'eau connu.
Calc_R()
Calcul du rayon hydraulique.
Calc_S($rY)
Calcul de la surface hydraulique.
CalcDer($rX)
Calcul analytique de la dérivée de la fonction dont on cherche le zéro.
DessinCoordonnees()
Fournit les coordonnées des points d'une demi section pour le dessin.
Calcul de la hauteur correspondante (charge égale)
Calcul de la hauteur normale.
Calc_dR()
Calcul de dérivée du rayon hydraulique par rapport au tirant d'eau.
CalcDer($rX)
Calcul analytique de la dérivée de la fonction dont on cherche le zéro.
Calc_Imp()
Calcul de l'impulsion hydraulique.
CalcFn($rX)
Calcul de la fonction dont on cherche le zéro.
Calc_Hs()
Calcul de la charge spécifique.
Calc_dSYg($rY)
Calcul de la dérivée distance du centre de gravité de la section à la surface libre multiplié par la ...
__construct($oSn, cParam $oP)
Constructeur de la classe.
Gestion commune pour les différents types de section.
Calcul de la hauteur conjuguée (Impulsion égale)
CalcFn($rX)
Calcul de la fonction dont on cherche le zéro.
$rSYg
SYg associée au tirant d'eau connu.
Calc_dAlpha()
Calcul de la dérivée de l'angle Alpha entre la surface libre et le fond pour les sections circulaires...
$oLog
Paramètres du système canal (classe oParam)
Calc_Yn()
Calcul du tirant d'eau normal.
Calc_V()
Calcul de la vitesse moyenne.
Calc_Yc()
Calcul du tirant d'eau critique.
__construct(acSection $oSn, cParam $oP)
Constructeur de la classe.
$oSn
Section contenant les données de la section avec la hauteur à calculer.
__construct(acSection $oSn, cParam $oP)
Constructeur de la classe.
$rY
Tirant d'eau connu.
Calc_dB()
Calcul de dérivée de la largeur au miroir par rapport au tirant d'eau.
Calc_B()
Calcul de la largeur au miroir.
Calc_dP()
Calcul de dérivée du périmètre hydraulique par rapport au tirant d'eau.
Gestion des Paramètres du canal (hors section)
Calc($sDonnee, $rY=false)
Calcul des données à la section.
$rY_old
Données ne dépendant pas de la cote de l'eau.
Calc_dS()
Calcul de la dérivée surface hydraulique.
$oP
Tirant d'eau normal.
__construct(&$oLog, &$oP)
Construction de la classe.