Calculettes pour l'hydraulique
hyd_inc/courbe_remous.php
Aller à la documentation de ce fichier.
1 <?php
2 /*
3  * This program is free software; you can redistribute it and/or modify
4  * it under the terms of the GNU General Public License as published by
5  * the Free Software Foundation; either version 2 of the License, or
6  * (at your option) any later version.
7  *
8  * This program is distributed in the hope that it will be useful,
9  * but WITHOUT ANY WARRANTY; without even the implied warranty of
10  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11  * GNU General Public License for more details.
12  *
13  * You should have received a copy of the GNU General Public License
14  * along with this program; if not, write to the Free Software
15  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
16  * MA 02110-1301, USA.
17  *
18  */
19 
20 
21 /**
22  * Calcul d'une courbe de remous
23  */
25 
26  const DBG = false; /// Pour loguer les messages de debug de cette classe
27 
28  public $oP; /// Paramètres de la section
29  public $oSect; /// Section du bief
30  private $oLog; /// Journal de calcul
31 
32  private $rDx; /// Pas d'espace (positif en partant de l'aval, négatif en partant de l'amont)
33 
34  public $VarCal; /// Variable calculée Y pour la dichotomie (intégration trapèze)
35 
36 
37  /**
38  * Construction de la classe.
39  * @param $oLog Journal de calcul
40  * @param $objet Objet contenant la méthode de calcul du débit et la
41  * propriété VarCal pointeur vers la variable à calculer
42  * @param $sFnCalculQ Nom de la méthode de calcul du débit
43  */
44  public function __construct(&$oLog, &$oParam, &$oSect, $rDx) {
45  $this->oLog = &$oLog;
46  $this->oP = &$oParam;
47  $this->oSect = &$oSect;
48  $this->rDx = (real) $rDx;
49  }
50 
51 
52  /**
53  * Calcul de dy/dx
54  */
55  private function Calc_dYdX($Y) {
56  // L'appel à Calc('J') avec Y en paramètre réinitialise toutes les données dépendantes de la ligne d'eau
57  return - ($this->oP->rIf - $this->oSect->Calc('J',$Y)) / (1 - pow($this->oSect->Calc('Fr',$Y),2));
58  }
59 
60 
61  /**
62  * Calcul du point suivant de la courbe de remous par la méthode Euler explicite.
63  * @param $rY Tirant d'eau initial
64  * @return Tirant d'eau
65  */
66  private function Calc_Y_Euler($Y) {
67  // L'appel à Calc('J') avec Y en paramètre réinitialise toutes les données dépendantes de la ligne d'eau
68  $Y2 = $Y+ $this->rDx * $this->Calc_dYdX($Y);
69  if($this->rDx > 0 xor !($Y2 < $this->oSect->rHautCritique)) {
70  return false;
71  } else {
72  return $Y2;
73  }
74  }
75 
76 
77  /**
78  * Calcul du point suivant de la courbe de remous par la méthode RK4.
79  * @param $rY Tirant d'eau initial
80  * @return Tirant d'eau
81  */
82  private function Calc_Y_RK4($Y) {
83  // L'appel à Calc('J') avec Y en paramètre réinitialise toutes les données dépendantes de la ligne d'eau
84  $rDx = $this->rDx;
85  $rk1 = $this->Calc_dYdX($Y);
86  if($this->rDx > 0 xor !($Y + $rDx / 2 * $rk1 < $this->oSect->rHautCritique)) {return false;}
87  $rk2 = $this->Calc_dYdX($Y + $rDx / 2 * $rk1);
88  if($this->rDx > 0 xor !($Y + $rDx / 2 * $rk2 < $this->oSect->rHautCritique)) {return false;}
89  $rk3 = $this->Calc_dYdX($Y + $rDx / 2 * $rk2);
90  if($this->rDx > 0 xor !($Y + $rDx / 2 * $rk3 < $this->oSect->rHautCritique)) {return false;}
91  $rk4 = $this->Calc_dYdX($Y + $rDx * $rk3);
92  $Yout = $Y + $rDx / 6 * ($rk1 + 2 * ($rk2 + $rk3) + $rk4);
93  if($this->rDx > 0 xor !($Yout < $this->oSect->rHautCritique)) {return false;}
94  return $Yout;
95  }
96 
97 
98  /**
99  * Equation de l'intégration par la méthode des trapèzes
100  */
101  public function Calc_Y_Trapez_Fn() {
102  return $this->oSect->Calc('Hs',$this->VarCal) - $this->oSect->Calc('J',$this->VarCal) / 2 * $this->rDx;
103  }
104 
105 
106  /**
107  * Calcul du point suivant de la courbe de remous par la méthode de l'intégration par trapèze
108  * @param $rY Tirant d'eau initial
109  * @return Tirant d'eau
110  */
111  private function Calc_Y_Trapez($Y) {
112  include_spip('hyd_inc/dichotomie.class');
113  $this->VarCal = &$Y;
114  $oDicho = new cDichotomie($this->oLog, $this, 'Calc_Y_Trapez_Fn', false);
115  // Calcul de H + J * \Delta x / 2
116  $Trapez_Fn = $this->oSect->Calc('Hs',$this->VarCal) + $this->oSect->Calc('J',$this->VarCal) / 2 * $this->rDx;
117  // H est la charge totale. On se place dans le référentiel ou Zf de la section à calculer = 0
118  $Trapez_Fn = $Trapez_Fn - $this->rDx * $this->oP->rIf;
119  list($Y2, $flag) = $oDicho->calculer($Trapez_Fn, $this->oP->rPrec, $this->oSect->rHautCritique);
120  if($flag < 0) {
121  return false;
122  } elseif($this->rDx > 0 xor !($Y2 < $this->oSect->rHautCritique)) {
123  return false;
124  }
125  return $Y2;
126  }
127 
128 
129  /**
130  * Calcul du point suivant d'une courbe de remous
131  * @param $rY Tirant d'eau initial
132  * @return Tirant d'eau
133  */
134  public function Calc_Y($rY, $sResolution) {
135  $funcCalcY = 'Calc_Y_'.$sResolution;
136  if(method_exists($this,$funcCalcY)) {
137  return $this->$funcCalcY($rY);
138  } else {
139  return false;
140  }
141  }
142 
143  /**
144  * Calcul d'une courbe de remous en fluvia ou torrentiel
145  * @param $rYCL Condition limite amont (torrentiel) ou aval (fluvial)
146  * @param $rLong Longueur du bief à calculer
147  * @param $sResolution Méthode numérique Euler, RK4 ou Trapez
148  */
149  function calcul($rYCL, $rLong, $sResolution) {
150  $trY = array();
151 
152  if($this->rDx > 0) {
153  // Calcul depuis l'aval
154  $xDeb = $rLong;
155  $xFin = 0;
156  }
157  else {
158  // Calcul depuis l'amont
159  $xDeb = 0;
160  $xFin = $rLong;
161  }
162  $dx = - $this->rDx;
163  spip_log($this,'hydraulic',_LOG_DEBUG);
164 
165  $trY[sprintf('%1.'.round($this->oP->iPrec).'f',$xDeb)] = (real)$rYCL;
166 
167  // Boucle de calcul de la courbe de remous
168  for($x = $xDeb + $dx; ($dx > 0 && $x <= $xFin) || ($dx < 0 && $x >= $xFin); $x += $dx) {
169  $rY = (real)$this->Calc_Y(end($trY), $sResolution);
170  if($rY) {
171  if(end($trY) > $this->oSect->rHautNormale xor $rY > $this->oSect->rHautNormale) {
172  $this->oLog->Add(_T('hydraulic:pente_forte').' '.$x. ' m ('._T('hydraulic:reduire_pas').')',true);
173  }
174  $trY[sprintf('%1.'.round($this->oP->iPrec).'f',$x)] = $rY;
175  } else {
176  $this->oLog->Add(_T('hydraulic:arret_calcul').' '.$x. ' m');
177  break;
178  }
179  }
180  return $trY;
181  }
182 }
183 ?>
$VarCal
Pas d&#39;espace (positif en partant de l&#39;aval, négatif en partant de l&#39;amont)
Calc_Y_Trapez($Y)
Calcul du point suivant de la courbe de remous par la méthode de l&#39;intégration par trapèze...
Calcul d&#39;une courbe de remous.
$oP
Pour loguer les messages de debug de cette classe.
Calc_Y($rY, $sResolution)
Calcul du point suivant d&#39;une courbe de remous.
Dichotomie.
$rDx
Journal de calcul.
Calc_Y_Trapez_Fn()
Equation de l&#39;intégration par la méthode des trapèzes.
Calc_Y_Euler($Y)
Calcul du point suivant de la courbe de remous par la méthode Euler explicite.
calcul($rYCL, $rLong, $sResolution)
Calcul d&#39;une courbe de remous en fluvia ou torrentiel.
$oSect
Paramètres de la section.
Calc_dYdX($Y)
Calcul de dy/dx.
__construct(&$oLog, &$oParam, &$oSect, $rDx)
Variable calculée Y pour la dichotomie (intégration trapèze)
$oLog
Section du bief.
Calc_Y_RK4($Y)
Calcul du point suivant de la courbe de remous par la méthode RK4.