Calculettes pour l'hydraulique
section.class.php
Aller à la documentation de ce fichier.
1 <?php
2 /**
3  * @file section.class.php
4  * Gestion des calculs au niveau des Sections
5  */
6 
7 /* Copyright 2009-2012 Dorch <dorch@dorch.fr>
8  *
9  * This program is free software; you can redistribute it and/or modify
10  * it under the terms of the GNU General Public License as published by
11  * the Free Software Foundation; either version 2 of the License, or
12  * (at your option) any later version.
13  *
14  * This program is distributed in the hope that it will be useful,
15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17  * GNU General Public License for more details.
18  *
19  * You should have received a copy of the GNU General Public License
20  * along with this program; if not, write to the Free Software
21  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
22  * MA 02110-1301, USA.
23  */
24 
25 // Chargement de la classe pour la méthode de Newton
26 include_spip('hyd_inc/newton.class');
27 
28 /**
29  * Gestion des Paramètres du canal (hors section)
30  */
31 class cParam {
32  public $rKs; /// Strickler
33  public $rQ; /// Débit
34  public $rIf; /// Pente du fond
35  public $rPrec; /// Précision de calcul et d'affichage
36  public $rG=9.81;/// Constante de gravité
37  public $iPrec; /// Précision en nombre de décimales
38  public $rYB; /// Hauteur de berge
39 
40  function __construct($rKs, $rQ, $rIf, $rPrec, $rYB) {
41  $this->rKs=(real) $rKs;
42  $this->rQ=(real) $rQ;
43  $this->rIf=(real) $rIf;
44  $this->rPrec=(real) $rPrec;
45  $this->rYB=(real) $rYB;
46  $this->iPrec=(int)-log10($rPrec);
47  }
48 }
49 
50 /**
51  * Gestion commune pour les différents types de section.
52  * Comprend les formules pour la section rectangulaire pour gérer les débordements
53  */
54 abstract class acSection {
55  const DBG = false; /// Pour loguer les messages de debug de cette classe et ses filles
56 
57  public $rY=0; /// Tirant d'eau
58  public $rHautCritique; /// Tirant d'eau critique
59  public $rHautNormale; /// Tirant d'eau normal
60  public $oP; /// Paramètres du système canal (classe oParam)
61  protected $oLog; /// Pour l'affichage du journal de calcul
62  public $rLargeurBerge; /// largeur au débordement
63  protected $bSnFermee = false; /// true si la section est fermée (fente de Preissmann)
64  /**
65  * Tableau contenant les données dépendantes du tirant d'eau $this->rY.
66  *
67  * Les clés du tableau peuvent être :
68  * - S : la surface hydraulique
69  * - P : le périmètre hydraulique
70  * - R : le rayon hydraulique
71  * - B : la largeur au miroir
72  * - J : la perte de charge
73  * - Fr : le nombre de Froude
74  * - dP : la dérivée de P par rapport Y
75  * - dR : la dérivée de R par rapport Y
76  * - dB : la dérivée de B par rapport Y
77  */
78  private $arCalc = array();
79  protected $arCalcGeo = array(); /// Données ne dépendant pas de la cote de l'eau
80 
81  private $rY_old ; /// Mémorisation du tirant d'eau pour calcul intermédiaire
82  private $arCalc_old = array(); /// Mémorisation des données hydrauliques pour calcul intermédiaire
83  /**
84  * Nombre de points nécessaires pour le dessin de la section (hors point de berge)
85  * Valeur de 1 par défaut pour les sections rectangulaires et trapézoïdales
86  */
87  protected $nbDessinPoints=1;
88 
89  /**
90  * Construction de la classe.
91  * Calcul des hauteurs normale et critique
92  */
93  public function __construct(&$oLog,&$oP) {
94  $this->oP = &$oP;
95  $this->oLog = &$oLog;
96  $this->CalcGeo('B');
97  //~ if(self::DBG) spip_log($this,'hydraulic.'._LOG_DEBUG);
98  }
99 
100 
101  /**
102  * Efface toutes les données calculées pour forcer le recalcul
103  * @param $bGeo Réinitialise les données de géométrie aussi
104  */
105  public function Reset($bGeo=true) {
106  $this->arCalc = array();
107  if($bGeo) {
108  $this->arCalcGeo = array();
109  }
110  }
111 
112 
113  /**
114  * Mémorise les données hydraulique en cours ou les restitue
115  * @param bMem true pour mémorisation, false pour restitution
116  */
117  public function Swap($bMem) {
118  if($bMem) {
119  $this->rY_old = $this->rY;
120  $this->arCalc_old = $this->arCalc;
121  }
122  else {
123  $this->rY = $this->rY_old;
124  $this->arCalc = $this->arCalc_old;
125  $this->arCalc_old = array();
126  }
127  }
128 
129 
130  /**
131  * Calcul des données à la section
132  * @param $sDonnee Clé de la donnée à calculer (voir $this->$arCalc)
133  * @param $bRecalc Pour forcer le recalcul de la donnée
134  * @return la donnée calculée
135  */
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);
139  $this->rY = $rY;
140  // On efface toutes les données dépendantes de Y pour forcer le calcul
141  $this->Reset(false);
142  }
143  if(!isset($this->arCalc[$sDonnee]) | (isset($this->arCalc[$sDonnee]) && !$this->arCalc[$sDonnee])) {
144  // La donnée a besoin d'être calculée
145  switch($sDonnee) {
146  case 'I-J' : // Variation linéaire de l'énergie spécifique (I-J) en m/m
147  $this->arCalc[$sDonnee] = $this->oP->rIf-$this->Calc('J');
148  break;
149  default :
150  $Methode = 'Calc_'.$sDonnee;
151  $this->arCalc[$sDonnee] = $this->$Methode();
152  }
153  //if(self::DBG) spip_log($this->arCalc,'hydraulic.'._LOG_DEBUG);
154  }
155  if(self::DBG) spip_log('Calc('.$sDonnee.')='.$this->arCalc[$sDonnee],'hydraulic.'._LOG_DEBUG);
156  return $this->arCalc[$sDonnee];
157  }
158 
159 
160  /**
161  * Calcul des données uniquement dépendantes de la géométrie de la section
162  * @param $sDonnee Clé de la donnée à calculer (voir $this->$arCalcGeo)
163  * @param $rY Hauteur d'eau
164  * @return la donnée calculée
165  */
166  public function CalcGeo($sDonnee) {
167  if($sDonnee != 'B' && !isset($this->arCalcGeo['B'])) {
168  // Si la largeur aux berges n'a pas encore été calculée, on commence par ça
169  $this->CalcGeo('B');
170  }
171  if(!isset($this->arCalcGeo[$sDonnee])) {
172  // La donnée a besoin d'être calculée
173  //if(self::DBG) spip_log('CalcGeo('.$sDonnee.') rY='.$this->oP->rYB,'hydraulic.'._LOG_DEBUG);
174  $this->Swap(true); // On mémorise les données hydrauliques en cours
175  $this->Reset(false);
176  $this->rY = $this->oP->rYB;
177  switch($sDonnee) {
178  case 'B' : // Largeur aux berges
179 
180  $this->arCalcGeo[$sDonnee] = $this->Calc_B();
181  if($this->arCalcGeo[$sDonnee] < $this->oP->rYB / 100) {
182  // Section fermée
183  $this->bSnFermee = true;
184  // On propose une fente de Preissmann égale à 1/100 de la hauteur des berges
185  $this->arCalcGeo[$sDonnee] = $this->oP->rYB / 100;
186  }
187  $this->rLargeurBerge = $this->arCalcGeo[$sDonnee];
188  break;
189  default :
190  $Methode = 'Calc_'.$sDonnee;
191  $this->arCalcGeo[$sDonnee] = $this->$Methode();
192  }
193  //~ if(self::DBG) spip_log('CalcGeo('.$sDonnee.',rY='.$this->oP->rYB.')='.$this->arCalcGeo[$sDonnee],'hydraulic.'._LOG_DEBUG);
194  $this->Swap(false); // On restitue les données hydrauliques en cours
195  }
196  return $this->arCalcGeo[$sDonnee];
197  }
198 
199 
200  /**
201  * Calcul de la surface hydraulique.
202  * @return La surface hydraulique
203  */
204  protected function Calc_S($rY) {
205  //~ if(self::DBG) spip_log('section->CalcS(rY='.$rY.')='.($rY*$this->rLargeurBerge),'hydraulic.'._LOG_DEBUG);
206  return $rY*$this->rLargeurBerge;
207  }
208 
209 
210  /**
211  * Calcul de la dérivée surface hydraulique.
212  * @return La surface hydraulique
213  */
214  protected function Calc_dS() {
215  return $this->rLargeurBerge;
216  }
217 
218 
219  /**
220  * Calcul du périmètre hydraulique.
221  * @return Le périmètre hydraulique
222  */
223  protected function Calc_P($rY=0) {
224  //~ if(self::DBG) spip_log('section->CalcP(rY='.$rY.')='.(2*$rY),'hydraulic.'._LOG_DEBUG);
225  return 2*$rY;
226  }
227 
228 
229  /**
230  * Calcul de dérivée du périmètre hydraulique par rapport au tirant d'eau.
231  * @return dP
232  */
233  protected function Calc_dP() {
234  return 2;
235  }
236 
237 
238  /**
239  * Calcul du rayon hydraulique.
240  * @return Le rayon hydraulique
241  */
242  protected function Calc_R() {
243  if($this->Calc('P')!=0) {
244  return $this->Calc('S')/$this->Calc('P');
245  }
246  else {
247  return INF;
248  }
249  }
250 
251 
252  /**
253  * Calcul de dérivée du rayon hydraulique par rapport au tirant d'eau.
254  * @return dR
255  */
256  protected function Calc_dR() {
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);
259  }
260  else {
261  return 0;
262  }
263  }
264 
265 
266  /**
267  * Calcul de la largeur au miroir.
268  * @return La largeur au miroir
269  */
270  protected function Calc_B() {
271  return $this->rLargeurBerge;
272  }
273 
274 
275  /**
276  * Calcul de dérivée de la largeur au miroir par rapport au tirant d'eau.
277  * @return dB
278  */
279  protected function Calc_dB() {
280  return 0;
281  }
282 
283 
284  /**
285  * Calcul de la perte de charge par la formule de Manning-Strickler.
286  * @return La perte de charge
287  */
288  private function Calc_J() {
289  if($this->Calc('R')!=0) {
290  return pow($this->Calc('V')/$this->oP->rKs,2)/pow($this->Calc('R'),4/3);
291  }
292  else {
293  return INF;
294  }
295  }
296 
297 
298  /**
299  * Calcul du nombre de Froude.
300  * @return Le nombre de Froude
301  */
302  private function Calc_Fr() {
303  if($this->Calc('S')!=0) {
304  return $this->oP->rQ/$this->Calc('S')*sqrt($this->Calc('B')/$this->Calc('S')/$this->oP->rG);
305  }
306  else {
307  return INF;
308  }
309  }
310  /**
311  * Calcul de la vitesse moyenne.
312  * @return Vitesse moyenne
313  */
314  private function Calc_V() {
315  if($this->Calc('S')!=0) {
316  return $this->oP->rQ/$this->Calc('S');
317  }
318  else {
319  return INF;
320  }
321  }
322 
323 
324  /**
325  * Calcul de la charge spécifique.
326  * @return Charge spécifique
327  */
328  private function Calc_Hs() {
329  return $this->rY+pow($this->Calc('V'),2)/(2*$this->oP->rG);
330  }
331 
332 
333  /**
334  * Calcul de la charge spécifique critique.
335  * @return Charge spécifique critique
336  */
337  private function Calc_Hsc() {
338  $this->Swap(true); // On mémorise les données hydrauliques en cours
339  // On calcule la charge avec la hauteur critique
340  $rHsc = $this->Calc('Hs',$this->CalcGeo('Yc'));
341  // On restitue les données initiales
342  $this->Swap(false);
343  return $rHsc;
344  }
345 
346 
347  /**
348  * Calcul du tirant d'eau critique.
349  * @return tirant d'eau critique
350  */
351  private function Calc_Yc() {
352  $oHautCritique = new cHautCritique($this, $this->oP);
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);
355  }
356  return $this->rHautCritique;
357  }
358 
359  /**
360  * Calcul du tirant d'eau normal.
361  * @return tirant d'eau normal
362  */
363  private function Calc_Yn() {
364  if($this->oP->rIf <= 0) {
365  $this->rHautNormale = false;
366  $this->oLog->Add(_T('hydraulic:h_normale_pente_neg_nul'),true);
367  } else {
368  $oHautNormale= new cHautNormale($this, $this->oP);
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);
371  }
372  }
373  return $this->rHautNormale;
374  }
375 
376 
377  /**
378  * Calcul du tirant d'eau fluvial.
379  * @return tirant d'eau fluvial
380  */
381  private function Calc_Yf() {
382  if($this->rY > $this->CalcGeo('Yc')) {
383  return $this->rY;
384  }
385  else {
386  $oHautCorrespondante= new cHautCorrespondante($this, $this->oP);
387  return $oHautCorrespondante->Newton($this->Calc('Yc')*2);
388  }
389  }
390 
391 
392  /**
393  * Calcul du tirant d'eau torrentiel.
394  * @return tirant d'eau torrentiel
395  */
396  private function Calc_Yt() {
397  if($this->rY < $this->CalcGeo('Yc')) {
398  return $this->rY;
399  }
400  else {
401  $oHautCorrespondante= new cHautCorrespondante($this, $this->oP);
402  return $oHautCorrespondante->Newton($this->CalcGeo('Yc')/2);
403  }
404  }
405 
406 
407  /**
408  * Calcul du tirant d'eau conjugué.
409  * @return tirant d'eau conjugué
410  */
411  protected function Calc_Yco() {
412  // Mémorisation de Y avant l'appel au Newton
413  $this->Swap(true);
414  // Intanciation du Newton
415  $oHautConj= new cHautConjuguee($this, $this->oP);
416  // Choisir une valeur initiale du bon côté de la courbe
417  if($this->Calc('Fr') < 1) {
418  // Ecoulement fluvial, on cherche la conjuguée à partir du tirant d'eau torrentiel
419  $rY0 = $this->Calc('Yt');
420  }
421  else {
422  // Ecoulement torrentiel, on cherche la conjuguée à partir du tirant d'eau fluvial
423  $rY0 = $this->Calc('Yf');
424  }
425  if(!$Yco = $oHautConj->Newton($rY0) or !$oHautConj->HasConverged()) {
426  $this->oLog->Add(_T('hydraulic:h_conjuguee').' : '._T('hydraulic:newton_non_convergence'),true);
427  }
428  $this->Swap(false);
429  return $Yco;
430  }
431 
432 
433  /**
434  * Calcul de la contrainte de cisaillement.
435  * @return contrainte de cisaillement
436  */
437  private function Calc_Tau0() {
438  return 1000 * $this->oP->rG * $this->Calc('R') * $this->Calc('J');
439  }
440 
441  /**
442  * Calcul de la distance du centre de gravité de la section à la surface libre
443  * multiplié par la surface hydraulique
444  * @return S x Yg
445  */
446  protected function Calc_SYg($rY) {
447  return pow($rY,2) * $this->rLargeurBerge / 2;
448  }
449 
450 
451  /**
452  * Calcul de la dérivée distance du centre de gravité de la section à la surface libre
453  * multiplié par la surface hydraulique
454  * @return S x Yg
455  */
456  protected function Calc_dSYg($rY) {
457  return $rY * $this->rLargeurBerge;
458  }
459 
460 
461  /**
462  * Calcul de l'impulsion hydraulique.
463  * @return Impulsion hydraulique
464  */
465  protected function Calc_Imp() {
466  return 1000 * ($this->oP->rQ * $this->Calc('V') + $this->oP->rG * $this->Calc('SYg'));
467  }
468 
469 
470  /**
471  * Calcul de l'angle Alpha entre la surface libre et le fond pour les sections circulaires.
472  * @return Angle Alpha pour une section circulaire, 0 sinon.
473  */
474  protected function Calc_Alpha(){
475  return 0;
476  }
477 
478 
479  /**
480  * Calcul de la dérivée de l'angle Alpha entre la surface libre et le fond pour les sections circulaires.
481  * @return Dérivée de l'angle Alpha pour une section circulaire, 0 sinon.
482  */
483  protected function Calc_dAlpha(){
484  return 0;
485  }
486 
487 
488  /**
489  * Fournit les coordonnées des points d'une demi section pour le dessin
490  * @return tableau de couples de coordonnées (x,y)
491  */
492  public function DessinCoordonnees() {
493  $rPas = $this->oP->rYB / $this->nbDessinPoints;
494  $tPoints = array();
495  $this->Swap(true); // On mémorise les données hydrauliques en cours
496  for($rY=0;$rY<$this->oP->rYB+$rPas/2;$rY+=$rPas) {
497  //~ if(self::DBG) spip_log('DessinCoordonnees rY='.$rY,'hydraulic.'._LOG_DEBUG);
498  $tPoints['x'][] = $this->Calc('B',$rY)/2;
499  $tPoints['y'][] = $rY;
500  }
501  // On restitue les données initiales
502  $this->Swap(false);
503  return $tPoints;
504  }
505 }
506 
507 
508 /**
509  * Calcul de la hauteur critique
510  */
511 class cHautCritique extends acNewton {
512  private $oSn;
513  private $oP;
514 
515  /**
516  * Constructeur de la classe
517  * @param $oSn Section sur laquelle on fait le calcul
518  * @param $oP Paramètres supplémentaires (Débit, précision...)
519  */
520  function __construct($oSn,cParam $oP) {
521  $this->oSn = clone $oSn;
522  $this->oP = $oP;
523  parent::__construct($oP);
524  }
525 
526  /**
527  * Calcul de la fonction dont on cherche le zéro
528  * @param $rX Variable dont dépend la fonction
529  */
530  protected function CalcFn($rX) {
531  // Calcul de la fonction
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);
534  }
535  else {
536  $rFn = INF;
537  }
538  //~ if(self::DBG) spip_log('cHautCritique:CalcFn('.$rX.')='.$rFn,'hydraulic.'._LOG_DEBUG);
539  return $rFn;
540  }
541 
542  /**
543  * Calcul analytique de la dérivée de la fonction dont on cherche le zéro
544  * @param $rX Variable dont dépend la fonction
545  */
546  protected function CalcDer($rX) {
547  if($this->oSn->Calc('S')!=0) {
548  // L'initialisation à partir de $rX a été faite lors de l'appel à CalcFn
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);
551  }
552  else {
553  $rDer = INF;
554  }
555 
556  //if(self::DBG) spip_log('cHautCritique:CalcDer('.$rX.')='.$rDer,'hydraulic.'._LOG_DEBUG);
557  return $rDer;
558  }
559 }
560 
561 
562 
563 /**
564  * Calcul de la hauteur normale
565  */
566 class cHautNormale extends acNewton {
567  private $oSn;
568  private $rQ;
569  private $rKs;
570  private $rIf;
571 
572  /**
573  * Constructeur de la classe
574  * @param $oSn Section sur laquelle on fait le calcul
575  * @param $oP Paramètres supplémentaires (Débit, précision...)
576  */
577  function __construct($oSn, cParam $oP) {
578  $this->oSn= clone $oSn;
579  $this->rQ=$oP->rQ;
580  $this->rKs=$oP->rKs;
581  $this->rIf=$oP->rIf;
582  $this->rG=$oP->rG;
583  parent::__construct($oP);
584  }
585 
586  /**
587  * Calcul de la fonction dont on cherche le zéro
588  * @param $rX Variable dont dépend la fonction
589  */
590  protected function CalcFn($rX) {
591  // Calcul de la fonction
592  $rFn = ($this->rQ-$this->rKs*pow($this->oSn->Calc('R',$rX),2/3)*$this->oSn->Calc('S',$rX)*sqrt($this->rIf));
593  //if(self::DBG) spip_log('cHautNormale:CalcFn('.$rX.')='.$rFn,'hydraulic.'._LOG_DEBUG);
594  return $rFn;
595  }
596 
597  /**
598  * Calcul analytique de la dérivée de la fonction dont on cherche le zéro
599  * @param $rX Variable dont dépend la fonction
600  */
601  protected function CalcDer($rX) {
602  // L'initialisation a été faite lors de l'appel à CalcFn
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);
606  //if(self::DBG) spip_log('cHautNormale:CalcDer('.$rX.')='.$rDer,'hydraulic.'._LOG_DEBUG);
607  return $rDer;
608  }
609 }
610 
611 
612 /**
613  * Calcul de la hauteur correspondante (charge égale)
614  */
616  private $rY; // Tirant d'eau connu
617  private $rS2; // 1/S^2 associé au tirant d'eau connu
618  private $oSn; // Section contenant les données de la section avec la hauteur à calculer
619  private $rQ2G; // Constante de gravité
620 
621  /**
622  * Constructeur de la classe
623  * @param $oSn Section sur laquelle on fait le calcul
624  * @param $oP Paramètres supplémentaires (Débit, précision...)
625  */
626  function __construct(acSection $oSn, cParam $oP) {
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);
632  }
633 
634  /**
635  * Calcul de la fonction dont on cherche le zéro
636  * @param $rX Variable dont dépend la fonction
637  */
638  protected function CalcFn($rX) {
639 
640  // Calcul de la fonction
641  $rFn = $this->rY - $rX + ($this->rS2-pow($this->oSn->Calc('S',$rX),-2))*$this->rQ2G;
642  //~ if(self::DBG) spip_log('cHautCorrespondante:CalcFn('.$rX.')='.$rFn,'hydraulic.'._LOG_DEBUG);
643  return $rFn;
644  }
645 
646  /**
647  * Calcul analytique de la dérivée de la fonction dont on cherche le zéro
648  * @param $rX Variable dont dépend la fonction
649  */
650  protected function CalcDer($rX) {
651  // L'initialisation a été faite lors de l'appel à CalcFn
652  if($this->oSn->Calc('S')!=0) {
653  $rDer = -1 + 2 * $this->rQ2G * $this->oSn->Calc('B') / pow($this->oSn->Calc('S'),3);
654  }
655  else {
656  $rDer = INF;
657  }
658  //~ if(self::DBG) spip_log('cHautCorrespondante:CalcDer('.$rX.')='.$rDer,'hydraulic.'._LOG_DEBUG);
659  return $rDer;
660  }
661 
662 }
663 
664 
665 /**
666  * Calcul de la hauteur conjuguée (Impulsion égale)
667  */
668 class cHautConjuguee extends acNewton {
669  /** Tirant d'eau connu */
670  private $rY;
671  /** 1/S^2 associé au tirant d'eau connu */
672  private $rS2;
673  /** Section contenant les données de la section avec la hauteur à calculer */
674  private $oSn;
675  /** Constante de gravité */
676  private $rG;
677  /** Carré du débit */
678  private $rQ2;
679  /** Surface hydraulique associée au tirant d'eau connu */
680  private $rS;
681  /** SYg associée au tirant d'eau connu */
682  private $rSYg;
683 
684  /**
685  * Constructeur de la classe
686  * @param $oSn Section sur laquelle on fait le calcul
687  * @param $oP Paramètres supplémentaires (Débit, précision...)
688  */
689  function __construct(acSection $oSn, cParam $oP) {
690  parent::__construct($oP);
691  $this->rY = $oSn->rY;
692  $this->rQ2 = pow($oP->rQ,2);
693  $this->oSn = clone $oSn;
694  $this->rG = $oP->rG;
695  $this->rS = $oSn->Calc('S');
696  $this->rSYg = $oSn->Calc('SYg');
697  }
698 
699  /**
700  * Calcul de la fonction dont on cherche le zéro
701  * @param $rX Variable dont dépend la fonction
702  */
703  protected function CalcFn($rX) {
704  // Réinitialisation des paramètres hydrauliques de oSn avec l'appel $this->oSn->Calc('S',$rX)
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'));
708  }
709  else {
710  $rFn = -INF;
711  }
712  if(self::DBG) spip_log('cHautConjuguee:CalcFn('.$rX.')='.$rFn,'hydraulic.'._LOG_DEBUG);
713  return $rFn;
714  }
715 
716  /**
717  * Calcul analytique de la dérivée de la fonction dont on cherche le zéro
718  * @param $rX Variable dont dépend la fonction
719  */
720  protected function CalcDer($rX) {
721  // L'initialisation a été faite lors de l'appel à CalcFn
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);
725  }
726  else {
727  $rDer = -INF;
728  }
729  if(self::DBG) spip_log('cHautConjuguee:CalcDer('.$rX.')='.$rDer,'hydraulic.'._LOG_DEBUG);
730  return $rDer;
731  }
732 
733 }
734 
735 ?>
$rG
Précision de calcul et d&#39;affichage.
$rYB
Précision en nombre de décimales.
$iPrec
Constante de gravité
Calc_Fr()
Calcul du nombre de Froude.
$rQ2
Carré du débit.
Calcul de la hauteur critique.
$rS2
1/S^2 associé au tirant d&#39;eau connu
$rIf
Débit.
Calc_Yt()
Calcul du tirant d&#39;eau torrentiel.
$rHautCritique
Tirant d&#39;eau.
Calc_P($rY=0)
Calcul du périmètre hydraulique.
Calc_Alpha()
Calcul de l&#39;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&#39;eau critique.
$rLargeurBerge
Pour l&#39;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&#39;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&#39;eau fluvial.
Calc_Tau0()
Calcul de la contrainte de cisaillement.
$rG
Constante de gravité
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&#39;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&#39;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&#39;eau.
$rQ
Strickler.
CalcDer($rX)
Calcul analytique de la dérivée de la fonction dont on cherche le zéro.
Calc_Imp()
Calcul de l&#39;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&#39;eau connu.
Calc_dAlpha()
Calcul de la dérivée de l&#39;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&#39;eau normal.
Calc_V()
Calcul de la vitesse moyenne.
Calc_Yc()
Calcul du tirant d&#39;eau critique.
$rPrec
Pente du fond.
__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&#39;eau connu.
Calc_dB()
Calcul de dérivée de la largeur au miroir par rapport au tirant d&#39;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&#39;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&#39;eau.
Calc_dS()
Calcul de la dérivée surface hydraulique.
$oP
Tirant d&#39;eau normal.
__construct(&$oLog, &$oP)
Construction de la classe.