Calculettes pour l'hydraulique
ouvrage.class.php
Aller à la documentation de ce fichier.
1 <?php
2 /**
3  * @file ouvrage.class.php
4  * Gestion des calculs au niveau des Ouvrages en travers
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 /*
27 include_spip('hyd_inc/newton.class');
28 */
29 
30 
31 /**
32  * Calculs sur un ouvrage
33  */
34 class cOuvrage {
35  private $oLog; /// Journal des calculs
36  /**
37  * Loi de débit pour l'ouvrage. Valeurs possibles :
38  * - 1 - Déversoir/Orifice Cemagref 88 : Type 1,2,3 + Surverse
39  * - 2 - Vanne de fond/Seuil Cemagref 88 : Type 1,2,3 + Surverse
40  * - 3 - Seuil dénoyé : Type 3 + Surverse
41  * - 4 - Seuil noyé : Type 3 + Surverse
42  * - 5 - Vanne dénoyé : Type 1,2
43  * - 6 - Vanne noyé : Type 1,2
44  * - 7 - Cunge 1980 : Type 1,2,3 + Surverse
45  * - 8 - Déversoir/Orifice Cemagref 02 : Type 4,5
46  * - 9 - Vanne de fond/Seuil Cemagref 02 : Type 4,5
47  */
48  private $nL;
49  /**
50  * Loi de débit pour la surverse. Valeurs possibles :
51  * - 1 - Déversoir/Orifice Cemagref 88
52  * - 2 - Vanne de fond/Seuil Cemagref 88
53  * - 3 - Seuil dénoyé
54  * - 4 - Seuil noyé
55  * - 7 - Cunge 1980
56  */
57  private $nLS;
58  /**
59  * Tableau contenant les paramètres de l'ouvrage.
60  *
61  * Liste des clés possibles du tableau :
62  * - Q : le débit de l'ouvrage
63  * - ZM : la cote de l'eau à l'amont par rapport au radier
64  * - ZV : la cote de l'eau à l'aval par rapport au radier
65  * - L : largeur
66  * - Z : cote de radier
67  * - W : ouverture de vanne
68  * - A : Angle des ouvrages triangulaires
69  * - H : Hauteur de la vanne pour la surverse
70  * - C : Coefficient de débit pour tous types sauf trapézoïdal
71  * - CR : Coefficient de débit partie rectangulaire pour les trapézoïdales
72  * - CT : Coefficient de débit partie triangulaire pour les trapézoïdales
73  * - CS : Coefficient de débit de la surverse
74  * - rPrec : Précision du calcul
75  */
76  private $tP = array();
77 
78  public $VarCal; ///< Pointeur vers l'élément du tableau tP qui sera calculé
79 
80  const G = 9.81; /// Constante de gravité terrestre
81  const R2G = 4.42944; /// sqrt(2*self::gP);
82  const R32 = 2.59807; /// 3*sqrt(3)/2;
83 
84  /**
85  * Construction de la classe.
86  * Calcul des ouvrages
87  * @param $oLog Objet gérant le journal de calcul
88  * @param $nLoi Loi de débit à l'ouvrage
89  * @param $tP Tableaux des caractéristiques à l'ouvrage (largeur...)
90  * @param $nLoiSurverse Loi de débit de la surverse
91  */
92  public function __construct(&$oLog, $tP) {
93  $this->oLog = &$oLog;
94  if(isset($tP['OuvrageLoi'])) {
95  $this->nL = $tP['OuvrageLoi'];
96  }
97  if(isset($tP['SurverseLoi'])) {
98  $this->nLS = $tP['SurverseLoi'];
99  }
100  else {
101  $this->nLS = 0;
102  }
103  $this->tP = $tP;
104  if(!isset($this->tP['C'])) {$this->tP['C']=0;} // Pour les lois trapézoïdales CEM02
105  spip_log($this,'hydraulic.'._LOG_DEBUG);
106  }
107 
108 
109  /**
110  * Mise à jour d'un paramètre de l'ouvrage
111  * @param $sMaj Variable à modifier (indice du tableau tP)
112  * @param $rmaj Valeur de la variable à mettre à jour
113  */
114  public function Set($sMaj,$rMaj) {
115  $this->tP[$sMaj] = $rMaj;
116  spip_log("cOuvrage->Set($sMaj,$rMaj)",'hydraulic.'._LOG_DEBUG);
117  }
118 
119 
120  /**
121  * Calcul à l'ouvrage
122  * @param $sCalc Variable à calculer (indice du tableau tP)
123  * @param $rInit Valeur initiale pour le calcul
124  * @return array(0=> donnée calculée, 1=> Flag d'écoulement)
125  * Signification du Flag d'écoulement :
126  * - -1 : erreur de calcul
127  * - 0 : débit nul
128  * - 1 : surface libre dénoyé
129  * - 2 : surface libre noyé
130  * - 3 : charge denoyé
131  * - 4 : charge noyé partiel
132  * - 5 : charge noyé total
133  * - 11 : surverse dénoyé
134  * - 12 : surverse noyé
135  */
136  public function Calc($sCalc,$rInit=0.) {
137  include_spip('hyd_inc/dichotomie.class');
138  if($sCalc=='Q') {
139  // Calcul du débit par la loi d'ouvrage
140  return $this->OuvrageQ();
141  } else {
142  // Calcul indirect par dichotomie
143  $this->VarCal = &$this->tP[$sCalc];
144  $oDicho = new cDichotomie($this->oLog,$this,'OuvrageQ');
145  return $oDicho->calculer($this->tP['Q'],$this->tP['rPrec'],$rInit);
146  }
147  }
148 
149 
150  /**
151  * Calcul du débit à l'ouvrage
152  * @return array(0=> débit, 1=> Flag d'écoulement) (Voir Calc)
153  */
154  public function OuvrageQ() {
155  $nFlag=-1; // Initialisé à -1 pour détecter les modifications
156  $bSensAmAv = true; // Par défaut on considère le sens d'écoulement amont -> aval
157  if(!in_array($this->nL,array(3,5))) {
158  // Pour les lois autres que seuil et vanne dénoyé,
159  // On gère le sens de l'écoulement
160  if($this->tP['ZM'] == $this->tP['ZV']){
161  // Ecoulement nul
162  return array(0,0);
163  }
164  elseif($this->tP['ZM']<$this->tP['ZV']){
165  // Ecoulement Aval -> amont
166  $bSensAmAv = false;
167  $ZV = $this->tP['ZV'];
168  $this->tP['ZV'] = $this->tP['ZM'];
169  $this->tP['ZM'] = $ZV;
170  }
171  }
172 
173  // Gestion des écoulements nuls
174  if((isset($this->tP['W']) and $this->tP['W'] == 0) // Vanne fermée
175  and (!isset($this->tP['H']) // Pas de surverse
176  or (isset($this->tP['H']) and ($this->tP['H']==0 // Pas de surverse
177  or $this->tP['H']>$this->tP['ZM'])))){ // Cote amont inférieure à la surverse
178  // Vanne fermée et pas de surverse
179  $rQ = 0;
180  $nFlag = 0;
181  }
182 
183  if($nFlag < 0) {
184  // On doit pouvoir calculer un débit sur l'ouvrage
185  list($rQ,$nFlag)=$this->CalculQ($this->nL,$this->tP['C']);
186  if($this->nLS and isset($this->tP['H']) and $this->tP['W']+$this->tP['H'] < $this->tP['ZM']) {
187  // Vanne avec surverse autorisée et la cote amont est supérieure à la cote de surverse
188  $W = $this->tP['W'];
189  $this->tP['W'] = 99999;
190  list($rQS,$nFlagS)=$this->CalculQ($this->nLS,$this->tP['CS'],$W+$this->tP['H']);
191  $this->tP['W'] = $W;
192  $rQ += $rQS;
193  $nFlag = $nFlagS+10;
194  }
195  }
196 
197  if(!$bSensAmAv) {
198  // Inversion de débit -> on remet tout à l'endroit
199  $rQ = -$rQ;
200  $ZM = $this->tP['ZV'];
201  $this->tP['ZV'] = $this->tP['ZM'];
202  $this->tP['ZM'] = $ZM;
203  }
204  //echo "\n".'OuvrageQ='.$rQ.' / '.$nFlag;
205  return array($rQ,$nFlag);
206  }
207 
208 
209  /**
210  * Loi de vanne de fond dénoyée classique
211  * @param $rC Coefficient de débit
212  * @return array(0=> débit, 1=> Flag d'écoulement) (Voir Calc)
213  */
214  private function VanneDen($rC) {
215  if($this->tP['ZM']>$this->tP['W']) {
216  $rQ=$rC*$this->tP['W']*$this->tP['L']*self::R2G*sqrt($this->tP['ZM']-$this->tP['W']);
217  $nFlag=3;
218  }
219  else {
220  $this->oLog->Add(_T('hydraulic:debit_non_calcule').' : '
221  ._T('hydraulic:surface_libre').' '._T('hydraulic:avec').' '
222  ._T('hydraulic:loi_en_charge'));
223  $rQ=0;
224  $nFlag=-1;
225  }
226  return array($rQ,$nFlag);
227  }
228 
229 
230  /**
231  * Loi de vanne de fond totalement noyée classique
232  * @param $rC Coefficient de débit
233  * @return array(0=> débit, 1=> Flag d'écoulement) (Voir Calc)
234  */
235  private function VanneNoy($rC) {
236  if($this->tP['ZM']>$this->tP['W']) {
237  $rQ=$rC*$this->tP['W']*$this->tP['L']*self::R2G*sqrt($this->tP['ZM']-$this->tP['ZV']);
238  $nFlag=5;
239  }
240  else {
241  $this->oLog->Add(_T('hydraulic:debit_non_calcule').' : '
242  ._T('hydraulic:surface_libre').' '._T('hydraulic:avec').' '
243  ._T('hydraulic:loi_en_charge'));
244  $rQ=0;
245  $nFlag=-1;
246  }
247  return array($rQ,$nFlag);
248  }
249 
250 
251  /**
252  * Loi seuil dénoyé classique
253  * @param $rC Coefficient de débit
254  * @param $rZ Cote de radier à retrancher pour la surverse
255  * @return array(0=> débit, 1=> Flag d'écoulement) (Voir Calc)
256  */
257  private function SeuilDen($rC,$rZ=0) {
258  $rQ=$rC*$this->tP['L']*self::R2G*pow($this->tP['ZM']-$rZ,1.5);
259  spip_log($rQ,'hydraulic.'._LOG_DEBUG);
260  return array($rQ,1);
261  }
262 
263  /**
264  * Loi seuil noyé classique
265  * @param $rC Coefficient de débit
266  * @param $rZ Cote de radier à retrancher pour la surverse
267  * @return array(0=> débit, 1=> Flag d'écoulement) (Voir Calc)
268  */
269  private function SeuilNoy($rC,$rZ=0) {
270  $rQ=$rC*self::R32*$this->tP['L']*self::R2G*sqrt($this->tP['ZM']-$rZ-$this->tP['ZV'])*$this->tP['ZV'];
271  return array($rQ,2);
272  }
273 
274  /**
275  * Calcul du débit à partir d'une loi
276  * @param $nLoi Loi de débit
277  * @param $rC Coefficient de débit
278  * @param $rZ Cote de radier à retrancher pour la surverse
279  * @return array(0=> débit, 1=> Flag d'écoulement) (Voir Calc)
280  */
281  private function CalculQ($nLoi,$rC,$rZ=0) {
282  $rQ=0; // Débit par défaut
283  $nFlag=0; // Flag par défaut
284  if(!isset($this->tP['W'])) {
285  // Seuil <=> Ouverture de vanne infinie
286  $this->tP['W'] = INF;
287  }
288  $tP = &$this->tP;
289  switch($nLoi) {
290  case 1 : // Equation seuil-orifice Cemagref
291  $bDenoye=($tP['ZV']<=2/3*$tP['ZM']);
292  if($tP['ZM']<=$tP['W']) {
293  // Surface libre
294  if($bDenoye) { // Seuil dénoyé
295  return $this->SeuilDen($rC);
296  }
297  else { // Seuil noyé
298  return $this->SeuilNoy($rC);
299  }
300  }
301  else {
302  // Ecoulements en charge
303  if($bDenoye) { // Orifice dénoyé
304  $Q1 = $this->SeuilDen($rC);
305  $Q2 = $this->SeuilDen($rC,$tP['W']);
306  return array($Q1[0]-$Q2[0],3);
307  }
308  else { // Orifice noyé
309  if($tP['ZV']<=2/3*$tP['ZM']+$tP['W']/3) {
310  // Ennoyement partiel
311  $Q1 = $this->SeuilNoy($rC);
312  $Q2 = $this->SeuilDen($rC,$tP['W']);
313  return array($Q1[0]-$Q2[0],4);
314  }
315  else { // Ennoyement total
316  return $this->VanneNoy($rC*self::R32);
317  }
318  }
319  }
320  case 2 : // Loi de seuil et vanne Cemagref
321  $mu0 = 2 / 3 * $tP['C'];
322  if($tP['ZM']<=$tP['W']) {
323  // Surface libre
324  $bSurfLibre = true;
325  $alpha = 0.75;
326  }
327  else {
328  // Ecoulements en charge
329  $bSurfLibre = false;
330  $alpha = 1 - 0.14 * $tP['ZV'] / $tP['W'];
331  if($alpha < 0.4) {$alpha = 0.4;}
332  if($alpha > 0.75) {$alpha = 0.75;}
333  }
334  if($tP['ZV'] <= $alpha * $tP['ZM']) {
335  // Ecoulement dénoyé
336  $bDenoye = true;
337  }
338  else { // Ecoulement noyé
339  $bdenoye = false;
340  $x = sqrt(1 - $tP['ZV'] / $tP['ZM']);
341  $beta = -2 * $alpha + 2.6;
342  if ($x > 0.2) {
343  $KF = 1 - pow(1 - $x / sqrt(1 - $alfa), $beta);
344  }
345  else {
346  $KF= 5 * $x * (1 - pow(1 - 0.2 / sqrt(1 - $alfa), $beta));
347  }
348  }
349  if($bSurfLibre) { // Seuil
350  $muf=$mu0-0.08;
351  $Q = $muf * $tP['L'] * self::R2G * pow($tP['ZM'],1.5);
352  if($bDenoye) { // Seuil dénoyé
353  return array($Q,1);
354  }
355  else { // Seuil noyé
356  $Q = $KF * $Q;
357  return array($Q,2);
358  }
359  }
360  else { // Vanne
361  $mu = $mu0 - 0.08 / ($tP['ZM'] / $tP['W']);
362  $mu1 = $mu0 - 0.08 / ($tP['ZM'] / $tP['W'] - 1);
363  if($bdenoye) { // Vanne dénoyée
364  $Q = $tP['L'] * self::R2G * ($mu * pow($tP['ZM'],1.5) - $mu1 * pow($tP['ZM'] - $tP['W'],1.5));
365  return array($Q,3);
366  }
367  else {
368  $alfa1 = 1 - 0.14 * ($tP['ZV'] - $tP['W']) / $tP['W'];
369  if ($alfa1<0.4) {$alfa1 = 0.4;}
370  if ($alfa1>0.75) {$alfa1 = 0.75;}
371  if($tP['ZV'] <= $alfa1 * $tP['ZM'] + (1 - $alfa1) * $tP['W']) {
372  // Vanne partiellement noyée
373  $Q = $tP['L'] * self::R2G * ($KF * $mu * pow($tP['ZM'],1.5) - $mu1 * pow($tP['ZM'] - $tP['W'],1.5));
374  return array($Q,4);
375  }
376  else { // Vanne totalement noyée
377  $x1 = sqrt(1 - ($tP['ZV'] - $tP['W']) / ($tP['ZM'] - $tP['W']));
378  $beta1 = -2 * $alfa1 + 2.6;
379  if ($x1 > 0.2) {
380  $KF1 = 1 - pow(1 - $x1 / sqrt(1 - $alfa1), $beta1);
381  }
382  else {
383  $KF1 = 5* $x1 * (1 - pow(1 - 0.2 / sqrt(1 - $alfa1), $beta1));
384  }
385  $Q = $tP['L'] * self::R2G * ($KF * $mu * pow($tP['ZM'],1.5) - $KF1 * $mu1 * pow($tP['ZM'] - $tP['W'],1.5));
386  return array($Q,5);
387  }
388  }
389  }
390  case 3 : // Equation classique du seuil dénoyé
391  return $this->SeuilDen($rC,$rZ);
392  case 4 : // Equation du seuil noyé
393  return $this->SeuilNoy($rC,$rZ);
394  case 5 : // Equation classique de la vanne en charge dénoyée
395  return $this->VanneDen($rC);
396  case 6 : // Equation classique de la vanne en charge totalement noyée
397  return $this->VanneNoy($rC);
398  }
399  }
400 }
401 
402 ?>
OuvrageQ()
Calcul du débit à l&#39;ouvrage.
Calc($sCalc, $rInit=0.)
Calcul à l&#39;ouvrage.
VanneDen($rC)
Loi de vanne de fond dénoyée classique.
VanneNoy($rC)
Loi de vanne de fond totalement noyée classique.
__construct(&$oLog, $tP)
3*sqrt(3)/2;
const R2G
Constante de gravité terrestre.
Dichotomie.
SeuilDen($rC, $rZ=0)
Loi seuil dénoyé classique.
$nL
Journal des calculs.
Set($sMaj, $rMaj)
Mise à jour d&#39;un paramètre de l&#39;ouvrage.
SeuilNoy($rC, $rZ=0)
Loi seuil noyé classique.
$tP
Tableau contenant les paramètres de l&#39;ouvrage.
CalculQ($nLoi, $rC, $rZ=0)
Calcul du débit à partir d&#39;une loi.
$VarCal
Pointeur vers l&#39;élément du tableau tP qui sera calculé
$nLS
Loi de débit pour la surverse.
const R32
sqrt(2*self::gP);
Calculs sur un ouvrage.