Ohmic conduction flux of charged species

    This function computes the fluxes due to ohmic conduction appearing in the Nernst–Planck equation. The species charge concentrations are then updated using the explicit scheme \displaystyle c^{n+1}_i = c^n_i +\Delta t \, \nabla \cdot( K_i c^n_i \nabla \phi^n) where c_i is the volume density of the i-specie, K_i its volume electric conductivity and \phi the electric potential.

    extern scalar phi;
    struct Species {
      scalar * c; // A list of the species concentration and their corresponding
      int * z;    // valences
      double dt;
      // optional
      vector * K; // electric mobility (default the valence)
    void ohmic_flux (struct Species sp)

    If the volume conductivity is not provided it is set to the value of the valence.

      if (!sp.K) { // fixme: this does not work yet
        int i = 0;
        for (scalar s in sp.c) {
          const face vector kc[] = {sp.z[i], sp.z[i]}; i++;
          sp.K = vectors_append (sp.K, kc);
      scalar c;
      (const) face vector K;
      for (c, K in sp.c, sp.K) {

    The fluxes of each specie through each face due to ohmic transport are

        face vector f[];
          f.x[] = K.x[]*(c[] + c[-1,0])*(phi[] - phi[-1,0])/(2.*Delta);
        boundary_flux ({f});

    The specie concentration is updated using the net amount of that specie leaving/entering each cell through the face in the interval dt

            c[] += sp.dt*(f.x[1,0] - f.x[])/Delta;
        boundary ({c});