Changeset 59239 in spip-zone


Ignore:
Timestamp:
Mar 12, 2012, 4:21:23 PM (8 years ago)
Author:
dorch@…
Message:

Cf. http://sic.g-eau.net/mantis/view.php?id=582#c693

File:
1 edited

Legend:

Unmodified
Added
Removed
  • _plugins_/hydraulic/branches/v0.3/hyd_inc/section.class.php

    r59103 r59239  
    108108     */
    109109    public function Calc($sDonnee, $rY = false) {
    110         if($rY!==false) {
     110        if($rY!==false && $rY!=$this->rY) {
    111111            //~ spip_log('Calc('.$sDonnee.') rY='.$rY,'hydraulic');
    112112            $this->rY = $rY;
    113             if(isset($this->arCalc[$sDonnee])) {
    114                 // On efface toutes les données calculées pour forcer le calcul
    115                 $this->Reset();
    116             }
     113            // On efface toutes les données calculées pour forcer le calcul
     114            $this->Reset();
    117115        }
    118116
     
    120118            // La donnée a besoin d'être calculée
    121119            switch($sDonnee) {
    122                 case 'S' :
     120                case 'S' : // Surface mouillée
    123121                    $this->arCalc[$sDonnee] = $this->CalcS();
    124122                    break;
    125                 case 'P' :
     123                case 'P' : // Périmètre mouillé
    126124                    $this->arCalc[$sDonnee] = $this->CalcP();
    127125                    break;
    128                 case 'R' :
     126                case 'R' : // Rayon hydraulique
    129127                    $this->arCalc[$sDonnee] = $this->CalcR();
    130128                    break;
    131                 case 'B' :
     129                case 'B' : // Largeur au miroir
    132130                    $this->arCalc[$sDonnee] = $this->CalcB();
    133131                    break;
    134                 case 'J' :
     132                case 'J' : // Perte de charge linéaire
    135133                    $this->arCalc[$sDonnee] = $this->CalcJ();
    136134                    break;
    137                 case 'Fr' :
     135                case 'Fr' : // Froude
    138136                    $this->arCalc[$sDonnee] = $this->CalcFr();
    139137                    break;
    140                 case 'dS' :
     138                case 'dS' : // dS/dY
    141139                    $this->arCalc[$sDonnee] = $this->CalcSder();
    142140                    break;
    143                 case 'dP' :
     141                case 'dP' : // dP/dY
    144142                    $this->arCalc[$sDonnee] = $this->CalcPder();
    145143                    break;
    146                 case 'dR' :
     144                case 'dR' : // dR/dY
    147145                    $this->arCalc[$sDonnee] = $this->CalcRder();
    148146                    break;
    149                 case 'dB' :
     147                case 'dB' : // dB/dY
    150148                    $this->arCalc[$sDonnee] = $this->CalcBder();
     149                    break;
     150                case 'V' : // Vitesse moyenne
     151                    $this->arCalc[$sDonnee] = $this->CalcV();
     152                    break;
     153                case 'Hs' : // Charge spécifique
     154                    $this->arCalc[$sDonnee] = $this->CalcHs();
     155                    break;
     156                case 'Yc' : // Tirant d'eau critique
     157                    $this->arCalc[$sDonnee] = $this->CalcYc();
     158                    break;
     159                case 'Yn' : // Tirant d'eau normal
     160                    $this->arCalc[$sDonnee] = $this->CalcYn();
     161                    break;
     162                case 'Yf' : // Tirant d'eau fluvial
     163                    $this->arCalc[$sDonnee] = $this->CalcYf();
     164                    break;
     165                case 'Yt' : // Tirant d'eau torrentiel
     166                    $this->arCalc[$sDonnee] = $this->CalcYt();
     167                    break;
     168                case 'Yco' : // Tirant d'eau conjugué
     169                    $this->arCalc[$sDonnee] = $this->CalcYco();
     170                    break;
     171                case 'Tau0' : // Force tractrice ou contrainte de cisaillement
     172                    $this->arCalc[$sDonnee] = $this->CalcTau0();
     173                    break;
    151174            }
    152175        }
     
    222245    private function CalcFr() {
    223246        return $this->oP->rQ/$this->Calc('S')*sqrt($this->Calc('B')/$this->Calc('S')/$this->oP->rG);
    224    }
     247    }
    225248
    226249   /**
     
    232255        $this->rY = $Y; // Tirant d'eau initial pour le calcul du point suivant
    233256        return $Y-($this->oP->rDx*($this->oP->rIf-$this->Calc('J'))/(1-pow($this->Calc('Fr'),2)));
    234    }
     257    }
     258
     259   /**
     260    * Calcul de la vitesse moyenne.
     261    * @return Vitesse moyenne
     262    */
     263    private function CalcV() {
     264        return $this->oP->rQ/$this->Calc('S');
     265    }
     266
     267   /**
     268    * Calcul de la charge spécifique.
     269    * @return Charge spécifique
     270    */
     271    private function CalcHs() {
     272        return $this->rY+pow($this->Calc('V'),2)/(2*$this->oP->rG);
     273    }
     274
     275   /**
     276    * Calcul du tirant d'eau critique.
     277    * @return tirant d'eau critique
     278    */
     279    private function CalcYc() {
     280        $oHautCritique = new cHautCritique($this, $oP);
     281        return $oHautCritique->Newton($oP->rPrec);
     282    }
     283
     284   /**
     285    * Calcul du tirant d'eau normal.
     286    * @return tirant d'eau normal
     287    */
     288    private function CalcYn() {
     289        $oHautNormale= new cHautNormale($this, $oP);
     290        return $oHautNormale->Newton($this->Calc('Yc'));
     291    }
     292
     293   /**
     294    * Calcul du tirant d'eau fluvial.
     295    * @return tirant d'eau fluvial
     296    */
     297    private function CalcYf() {
     298        if($this->rY > $this->Calc('Yc')) {
     299            return $this->rY;
     300        }
     301        else {
     302            $oHautCorrespondante= new cHautCorrespondante($this, $oP);
     303            return $oHautCorrespondante->Newton($this->Calc('Yc'));
     304        }
     305    }
     306
     307   /**
     308    * Calcul du tirant d'eau torrentiel.
     309    * @return tirant d'eau torrentiel
     310    */
     311    private function CalcYt() {
     312        if($this->rY < $this->Calc('Yc')) {
     313            return $this->rY;
     314        }
     315        else {
     316            $oHautCorrespondante= new cHautCorrespondante($this, $oP);
     317            return $oHautCorrespondante->Newton($this->Calc('Yc'));
     318        }
     319    }
     320
     321   /**
     322    * Calcul du tirant d'eau conjugué.
     323    * @return tirant d'eau conjugué
     324    */
     325    private function CalcYco() {
     326        return (sqrt(1 + 8 * pow($this->Calc('Fr'),2)) - 1) / 2;
     327    }
     328
     329   /**
     330    * Calcul de la contrainte de cisaillement.
     331    * @return contrainte de cisaillement
     332    */
     333    private function CalcTau0() {
     334        return 1000 * $oP->rG * $this->Calc('R') * $oP->rIf;
     335    }
    235336}
    236337
     
    433534}
    434535
     536
     537/**
     538 * Calcul de la hauteur correspondante (charge égale)
     539 */
     540class cHautCorrespondante extends acNewton {
     541    private $rY; // Tirant d'eau connu
     542    private $rV2; // Vitesse moyenne au carré associée au tirant d'eau connu
     543    private $oSnCal; // Section contenant les données de la section avec la hauteur à calculer
     544    private $rG; // Constante de gravité
     545
     546    /**
     547     * Constructeur de la classe
     548     * @param $oSn Section sur laquelle on fait le calcul
     549     * @param $oP Paramètres supplémentaires (Débit, précision...)
     550     */
     551    function __construct(acSection $oSn, cParam $oP) {
     552        $this->rY = $oSn->rY;
     553        $this->rV2 = pow($oSn->Calc('V'),2);
     554        $this->oSnCal = clone $oSn;
     555        $this->rQ = $oP->rQ;
     556        $this->rG = $oP->rG;
     557    }
     558
     559    /**
     560     * Calcul de la fonction dont on cherche le zéro
     561     * @param $rX Variable dont dépend la fonction
     562     */
     563    protected function CalcFn($rX) {
     564        // Initialisation des données de la section
     565        $this->oSnCal->Reset();
     566        $this->oSnCal->rY = $rX;
     567        // Calcul de la fonction
     568        $rFn = $this->rY - $rX + ($this->rV2+pow($this->oSnCal->Calc('V'),2))/(2*$this->rG);
     569        spip_log('cHautCorrespondante:CalcFn('.$rX.')='.$rFn,'hydraulic');
     570        return $rFn;
     571    }
     572
     573    /**
     574     * Calcul analytique de la dérivée de la fonction dont on cherche le zéro
     575     * @param $rX Variable dont dépend la fonction
     576     */
     577    protected function CalcDer($rX) {
     578        // L'initialisation a été faite lors de l'appel à CalcFn
     579        $rDer = - $this->rQ/ $this->rG * $this->oSnCal->Calc('dS') / pow($this->oSnCal->Calc('S'),3);
     580        spip_log('cHautCorrespondante:CalcDer('.$rX.')='.$rDer,'hydraulic');
     581        return $rDer;
     582    }
     583}
     584
    435585?>
Note: See TracChangeset for help on using the changeset viewer.