Changeset 68467 in spip-zone


Ignore:
Timestamp:
Dec 18, 2012, 11:12:39 PM (8 years ago)
Author:
dorch@…
Message:

Correction du calcul d Tau0 et du calcul de la hauteur conjuguee (tjs en debug)

Location:
_plugins_/hydraulic/branches/v0.3
Files:
7 edited

Legend:

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

    r64068 r68467  
    407407                }
    408408            }
     409        case 2 : // Loi de seuil et vanne Cemagref
     410            $mu0 = 2 / 3 * $tP['C'];
     411            if($tP['ZM']<=$tP['W']) {
     412                // Surface libre
     413                $bSurfLibre = true;
     414                $alpha = 0.75;
     415            }
     416            else {
     417                // Ecoulements en charge
     418                $bSurfLibre = false;
     419                $alpha = 1 - 0.14 * $tP['ZV'] / $tP['W'];
     420                if($alpha < 0.4) {$alpha = 0.4;}
     421                if($alpha > 0.75) {$alpha = 0.75;}
     422            }
     423            if($tP['ZV'] <= $alpha * $tP['ZM']) {
     424                // Ecoulement dénoyé
     425                $bDenoye = true;
     426            }
     427            else { // Ecoulement noyé
     428                $bdenoye = false;
     429                $x = sqrt(1 - $tP['ZV'] / $tP['ZM']);
     430                $beta = -2 * $alpha + 2.6;
     431                if ($x > 0.2) {
     432                    $KF = 1 - pow(1 - $x / sqrt(1 - $alfa), $beta);
     433                }
     434                else {
     435                    $KF= 5 * $x * (1 - pow(1 - 0.2 / sqrt(1 - $alfa), $beta));
     436                }
     437            }
     438            if($bSurfLibre) { // Seuil
     439                $muf=$mu0-0.08;
     440                $Q = $muf * $tP['L'] * self::R2G * pow($tP['ZM'],1.5);
     441                if($bDenoye) { // Seuil dénoyé
     442                    return array($Q,1);
     443                }
     444                else { // Seuil noyé
     445                    $Q = $KF * $Q;
     446                    return array($Q,2);
     447                }
     448            }
     449            else { // Vanne
     450                $mu = $mu0 - 0.08 / ($tP['ZM'] / $tP['W']);
     451                $mu1 = $mu0 - 0.08 / ($tP['ZM'] / $tP['W'] - 1);
     452                if($bdenoye) { // Vanne dénoyée
     453                    $Q = $tP['L'] * self::R2G * ($mu * pow($tP['ZM'],1.5) - $mu1 * pow($tP['ZM'] - $tP['W'],1.5));
     454                    return array($Q,3);
     455                }
     456                else {
     457                    $alfa1 = 1 - 0.14 * ($tP['ZV'] - $tP['W']) / $tP['W'];
     458                    if ($alfa1<0.4) {$alfa1 = 0.4;}
     459                    if ($alfa1>0.75) {$alfa1 = 0.75;}
     460                    if($tP['ZV'] <= $alfa1 * $tP['ZM'] + (1 - $alfa1) * $tP['W']) {
     461                        // Vanne partiellement noyée
     462                        $Q = $tP['L'] * self::R2G * ($KF * $mu * pow($tP['ZM'],1.5) - $mu1 * pow($tP['ZM'] - $tP['W'],1.5));
     463                        return array($Q,4);
     464                    }
     465                    else { // Vanne totalement noyée
     466                        $x1 = sqrt(1 - ($tP['ZV'] - $tP['W']) / ($tP['ZM'] - $tP['W']));
     467                        $beta1 = -2 * $alfa1 + 2.6;
     468                        if ($x1 > 0.2) {
     469                            $KF1 = 1 - pow(1 - $x1 / sqrt(1 - $alfa1), $beta1);
     470                        }
     471                        else {
     472                            $KF1 = 5*  $x1 * (1 - pow(1 - 0.2 / sqrt(1 - $alfa1), $beta1));
     473                        }
     474                        $Q = $tP['L'] * self::R2G * ($KF * $mu * pow($tP['ZM'],1.5) - $KF1 * $mu1 * pow($tP['ZM'] - $tP['W'],1.5));
     475                        return array($Q,5);
     476                    }
     477                }
     478            }
    409479        case 3 : // Equation classique du seuil dénoyé
    410480            return $this->SeuilDen($rC,$rZ);
  • _plugins_/hydraulic/branches/v0.3/hyd_inc/section.class.php

    r60951 r68467  
    199199                case 'SYg' : // Distance du centre de gravité de la section à la surface libre
    200200                    $this->arCalc[$sDonnee] = $this->CalcSYg();
     201                case 'dSYg' : // Dérivée Distance du centre de gravité de la section à la surface libre
     202                    $this->arCalc[$sDonnee] = $this->CalcSYgder();
    201203                    break;
    202204                case 'Imp' : // Impulsion hydraulique
     
    237239            switch($sDonnee) {
    238240                case 'B' : // Largeur aux berges
    239                
     241
    240242                    $this->arCalcGeo[$sDonnee] = $this->CalcB();
    241243                    if($this->arCalcGeo[$sDonnee] < $this->oP->rYB / 100) {
     
    264266        }
    265267        $this->Swap(false); // On restitue les données hydrauliques en cours
    266         spip_log('CalcGeo('.$sDonnee.')='.$this->arCalcGeo[$sDonnee],'hydraulic');
     268        //spip_log('CalcGeo('.$sDonnee.')='.$this->arCalcGeo[$sDonnee],'hydraulic');
    267269        return $this->arCalcGeo[$sDonnee];
    268270    }
     
    461463    */
    462464    private function CalcYco() {
    463         return $this->rY*(sqrt(1 + 8 * pow($this->Calc('Fr'),2)) - 1) / 2;
     465        $oHautConj= new cHautConjuguee($this, $this->oP);
     466        if(!$Yco = $oHautConj->Newton($this->CalcGeo('Yc')) or !$oHautConj->HasConverged()) {
     467            $this->oLog->Add(_T('hydraulic:h_conjuguee').' : '._T('hydraulic:newton_non_convergence'));
     468        }
     469        return $Yco;
    464470    }
    465471
     
    469475    */
    470476    private function CalcTau0() {
    471         return 1000 * $this->oP->rG * $this->Calc('R') * $this->oP->rIf;
    472     }
    473 
    474     /**
    475      * Calcul de la distance du centre de gravité de la section à la surface libre.
    476      * @return Distance du centre de gravité de la section à la surface libre
     477        return 1000 * $this->oP->rG * $this->Calc('R') * $this->Calc('J');
     478    }
     479
     480    /**
     481     * Calcul de la distance du centre de gravité de la section à la surface libre
     482     * multiplié par la surface hydraulique
     483     * @return S x Yg
    477484     */
    478485    protected function CalcSYg($rY) {
    479         return $rY / 2;
    480     }
     486        return pow($rY,2) * $this->rLargeurBerge / 2;
     487    }
     488
     489    /**
     490     * Calcul de la dérivée distance du centre de gravité de la section à la surface libre
     491     * multiplié par la surface hydraulique
     492     * @return S x Yg
     493     */
     494    protected function CalcSYgder($rY) {
     495        return $rY * $this->rLargeurBerge;
     496    }
     497
     498
    481499    /**
    482500     * Calcul de l'impulsion hydraulique.
     
    631649class cHautCorrespondante extends acNewton {
    632650    private $rY; // Tirant d'eau connu
    633     private $rV2; // Vitesse moyenne au carré associée au tirant d'eau connu
    634     private $oSnCal; // Section contenant les données de la section avec la hauteur à calculer
    635     private $rG; // Constante de gravité
     651    private $rS2; // 1/S^2 associé au tirant d'eau connu
     652    private $oSn; // Section contenant les données de la section avec la hauteur à calculer
     653    private $rQ2G; // Constante de gravité
    636654
    637655    /**
     
    678696}
    679697
     698
     699/**
     700 * Calcul de la hauteur conjuguée (Impulsion égale)
     701 */
     702class cHautConjuguee extends acNewton {
     703    private $rY; // Tirant d'eau connu
     704    private $rS2; // 1/S^2 associé au tirant d'eau connu
     705    private $oSn; // Section contenant les données de la section avec la hauteur à calculer
     706    private $rG; // Constante de gravité
     707    private $rQ; // débit
     708
     709    /**
     710     * Constructeur de la classe
     711     * @param $oSn Section sur laquelle on fait le calcul
     712     * @param $oP Paramètres supplémentaires (Débit, précision...)
     713     */
     714    function __construct(acSection $oSn, cParam $oP) {
     715        parent::__construct($oP);
     716        $this->rY = $oSn->rY;
     717        $this->rQ = $oP->rQ;
     718        if($oSn->Calc('S')>0) {
     719            $this->rdV = - $this->rQ * $oSn->Calc('dS') * pow($oSn->Calc('S'),-2);
     720        }
     721        else {
     722            $this->rdV = INF;
     723        }
     724        $this->oSn = clone $oSn;
     725        $this->rG = $oP->rG;
     726        $this->rV = $oSn->Calc('V');
     727        $this->rSYg = $oSn->Calc('SYg');
     728        $this->rdSYg = $oSn->Calc('dSYg');
     729    }
     730
     731    /**
     732     * Calcul de la fonction dont on cherche le zéro
     733     * @param $rX Variable dont dépend la fonction
     734     */
     735    protected function CalcFn($rX) {
     736
     737        // Calcul de la fonction
     738        $rFn = $this->rQ * ($this->rV - $this->oSn->Calc('V',$rX));
     739        $rFn += $this->rG * ($this->rSYg - $this->oSn->Calc('SYg',$rX));
     740        spip_log('cHautConjuguee:CalcFn('.$rX.')='.$rFn,'hydraulic');
     741        return $rFn;
     742    }
     743
     744    /**
     745     * Calcul analytique de la dérivée de la fonction dont on cherche le zéro
     746     * @param $rX Variable dont dépend la fonction
     747     */
     748    protected function CalcDer($rX) {
     749        // L'initialisation a été faite lors de l'appel à CalcFn
     750        if($this->oSn->Calc('S')!=0) {
     751            $rDer = $this->rQ * ($this->rdV + $this->rQ * $this->oSn->Calc('dS') * pow($this->oSn->Calc('S'),-2));
     752            $rDer += $this->rG * ($this->rdSYg - $this->oSn->Calc('dSYg',$rX));
     753        }
     754        else {
     755            $rDer = -INF;
     756        }
     757        spip_log('cHautConjuguee:CalcDer('.$rX.')='.$rDer,'hydraulic');
     758        return $rDer;
     759    }
     760
     761}
     762
    680763?>
  • _plugins_/hydraulic/branches/v0.3/hyd_inc/sectionCirc.class.php

    r60927 r68467  
    161161
    162162    /**
    163      * Calcul de la distance du centre de gravité de la section à la surface libre.
    164      * @return Distance du centre de gravité de la section à la surface libre
     163     * Calcul de la distance du centre de gravité de la section à la surface libre
     164     * multiplié par la surface hydraulique
     165     * @return S x Yg
    165166     */
    166167    protected function CalcSYg() {
     
    170171    }
    171172
     173    /**
     174     * Calcul de la dérivée de la distance du centre de gravité de la section à la surface libre
     175     * multiplié par la surface hydraulique
     176     * @return S x Yg
     177     */
     178    protected function CalcSYgder() {
     179        $cos = cos($this->Calc('Alpha'));
     180        $sin = sin($this->Calc('Alpha'));
     181        $SYg = $this->Calc('dAlpha') * $cos;
     182        $SYg += - $this->Calc('dAlpha') * $cos * pow($sin,2)
     183        $SYg += - $this->Calc('dAlpha') * $cos + $this->Calc('Alpha') * $this->Calc('dAlpha') * $sin;
     184        $SYg = 3 *pow($this->rD,3) / 8 * $SYg;
     185        return $SYg;
     186    }
     187
    172188}
    173189?>
  • _plugins_/hydraulic/branches/v0.3/hyd_inc/sectionPuiss.class.php

    r60951 r68467  
    105105
    106106    /**
    107      * Calcul de la distance du centre de gravité de la section à la surface libre.
    108      * @return Distance du centre de gravité de la section à la surface libre
     107     * Calcul de la distance du centre de gravité de la section à la surface libre
     108     * multiplié par la surface hydraulique
     109     * @return S x Yg
    109110     */
    110111    protected function CalcSYg() {
    111112        return $this->Calc('Alpha')*pow($this->rY, $this->rk+2)/(($this->rk+1)*($this->rk+2));
    112113    }
     114    /**
     115     * Calcul de la dérivée distance du centre de gravité de la section à la surface libre
     116     * multiplié par la surface hydraulique
     117     * @return S x Yg
     118     */
     119    protected function CalcSYgder() {
     120        $SYg = $this->Calc('dAlpha')*pow($this->rY, $this->rk+2) + $this->Calc('Alpha')*pow($this->rY, $this->rk+1)*($this->rk+2);
     121        return $SYg/(($this->rk+1)*($this->rk+2));
     122    }
    113123
    114124}
  • _plugins_/hydraulic/branches/v0.3/hyd_inc/sectionTrapez.class.php

    r60416 r68467  
    107107
    108108    /**
    109      * Calcul de la distance du centre de gravité de la section à la surface libre.
    110      * @return Distance du centre de gravité de la section à la surface libre
     109     * Calcul de la distance du centre de gravité de la section à la surface libre
     110     * multiplié par la surface hydraulique
     111     * @return S x Yg
    111112     */
    112113    protected function CalcSYg() {
    113         if($this->Calc('S') != 0){
    114             return ($this->rLargeurFond / 2 + $this->rFruit * $this->rY / 3) * pow($this->rY,2) / $this->Calc('S');
    115         }
    116         else{
    117             return INF;
    118         }
     114        return ($this->rLargeurFond / 2 + $this->rFruit * $this->rY / 3) * pow($this->rY,2);
     115    }
     116
     117    /**
     118     * Calcul de la dérivée de la distance du centre de gravité de la section à la surface libre
     119     * multiplié par la surface hydraulique
     120     * @return S x Yg
     121     */
     122    protected function CalcSYgder() {
     123        $SYg = $this->rFruit / 3 * pow($this->rY,2);
     124        $SYg += ($this->rLargeurFond / 2 + $this->rFruit * $this->rY / 3) * 2 * $this->rY;
     125        return $SYg;
    119126    }
    120127
  • _plugins_/hydraulic/branches/v0.3/lang/hydraulic_fr.php

    r64068 r68467  
    6363    'h_aval_imposee'  => "Hauteur d'eau aval imposée (m)",
    6464    'h_berge'         => "Hauteur de berge (m)",
     65    'h_conjuguee'      => "Hauteur conjuguée",
    6566    'h_critique'      => "Hauteur critique",
    6667    'h_normale'       => "Hauteur normale",
    6768    'h_pelle'         => "Hauteur de pelle (m)",
    6869    //I
    69     'impulsion'       => "Impulsion",
     70    'impulsion'       => "Impulsion (N)",
    7071    // L
    7172    'largeur_fond'    => "Largeur au fond (m)",
  • _plugins_/hydraulic/branches/v0.3/plugin.xml

    r64068 r68467  
    55    <auteur>David Dorchies, Médéric Dulondel</auteur>
    66    <licence>GNU/GLP</licence>
    7     <version>0.6.1</version>
     7    <version>0.6.2</version>
    88    <necessite id="lib:dist" src="https://bitbucket.org/cleonello/jqplot/downloads/jquery.jqplot.1.0.0b2_r1012.zip" />
    99    <slogan>
Note: See TracChangeset for help on using the changeset viewer.