sandbox/geoffroy/sourceterm/poiseuille.h

    Friction term : Poiseuille in saint venant

    Poiseuille flow

    For a low Reynolds number, the stream is laminar. In this case, we can compute an exact theoretical friction term in the momentum equation of saint-venant, supposing a Poiseuille stream. We call this term the “Poiseuille friction term”. It can be written as :

    \displaystyle Cf = 3 \nu \frac{q}{h^2}

    where \nu is the dynamic viscosity of the fluid.

    // Dynamic viscosity of the water
    double nu = 1e-6;

    We define the function which will replace the update function in the predictor-corrector

    void updatepoiseuille(scalar * evolving, scalar * sources, double dtmax, int numbersource ){
    
      // We first recover the evolving fields
      scalar h = evolving[0];
      vector u = { evolving[1], evolving[2] };
      
      // Updates for evolving quantities
      vector dshu = { sources[1], sources[2] };

    Implicit treatment with explicit scheme

    We chose to compute all our source term with an explicit term for conveniance. If \Psi (U) is the function used to solved the x differential term and S_i(U) the i^{th} source term in the right-hand side. Then, our scheme can be written as :

    \displaystyle \begin{array}{c} U^* =U^n+ \frac{\Delta t}{\Delta x} \Psi (U^n)\\ U^{n+1}= U^* +\Delta t\Sigma_{i=1}^N S_i(U^*) \end{array}

    But, even with an explicit scheme, we can compute the friction term in an implicit way. To do this, we first compute implicitly an intermediary field . We then compute the S_i explicit term using the intermediary field as follows :

      foreach(){
        if(h[] > dry){
          // Compute the new field u with an implicit scheme
          double s = dtmax*3.*nu/(h[]*h[]);
          foreach_dimension()
    	// Translate it in an explicit form
    	dshu.x[] -= h[]*u.x[]*s/(s+1)/dtmax;
        }
      }
      // We finish by calling the next source term
      numbersource++;
      updatesource[numbersource](evolving,sources,dtmax,numbersource);
    }

    Overloading

    In an initial event, we simply overload the i^{th} updatesource[] fonction with the function defined before. We also overload the i+1^{th} function with the fnull function.

    event initpoiseuille (i = 0){
      updatesource[numbersource] = updatepoiseuille;
      numbersource++;
      updatesource[numbersource] = fnull;
    }