src/myc.h

    /*-----------------------------------------------------* 
     *MYC - Mixed Youngs and Central Scheme                *
     *-----------------------------------------------------*/
    /* 
    
    Known problems: the index [0,0,0], i.e. the central cell
    in the block, never occurs: neither in the central scheme
    nor in Youngs' method. Therefore an isolated droplet will have
    a normal with all components to zero. I took care of the
    division-by-zero issue, but not of this one.
    
    Ruben
    
    */
    
    coord mycs (Point point, scalar c)
    { 
      double m1,m2,m[4][3],t0,t1,t2;
      int cn;
    
      /* write the plane as: sgn(mx) X =  my Y +  mz Z + alpha 
                                 m00 X = m01 Y + m02 Z + alpha */
      m1 = c[-1,0,-1] + c[-1,0,1] + c[-1,-1,0] + c[-1,1,0] + 
           c[-1,0,0];
      m2 = c[1,0,-1] + c[1,0,1] + c[1,-1,0] + c[1,1,0] + 
           c[1,0,0];
      m[0][0] = m1 > m2 ? 1. : -1.;
    
      m1 = c[-1,-1,0]+ c[1,-1,0]+ c[0,-1,0];
      m2 = c[-1,1,0]+ c[1,1,0]+ c[0,1,0];
      m[0][1] = 0.5*(m1-m2);
    
      m1 = c[-1,0,-1]+ c[1,0,-1]+ c[0,0,-1];
      m2 = c[-1,0,1]+ c[1,0,1]+ c[0,0,1];
      m[0][2] = 0.5*(m1-m2);
    
      /* write the plane as: sgn(my) Y =  mx X +  mz Z + alpha 
                                 m11 Y = m10 X + m12 Z + alpha */
      m1 = c[-1,-1,0] + c[-1,1,0] + c[-1,0,0];
      m2 = c[1,-1,0] + c[1,1,0] + c[1,0,0];
      m[1][0] = 0.5*(m1-m2);
    
      m1 = c[0,-1,-1] + c[0,-1,1] + c[1,-1,0] + c[-1,-1,0] +
           c[0,-1,0];
      m2 = c[0,1,-1] + c[0,1,1] + c[1,1,0] + c[-1,1,0] +
           c[0,1,0];
      m[1][1] = m1 > m2 ? 1. : -1.;
    
      m1 = c[0,-1,-1]+ c[0,0,-1]+ c[0,1,-1];
      m2 = c[0,-1,1]+ c[0,0,1]+ c[0,1,1];
      m[1][2] = 0.5*(m1-m2);
    
      /* write the plane as: sgn(mz) Z =  mx X +  my Y + alpha 
                                 m22 Z = m20 X + m21 Y + alpha */
    
      m1 = c[-1,0,-1]+ c[-1,0,1]+ c[-1,0,0];
      m2 = c[1,0,-1]+ c[1,0,1]+ c[1,0,0];
      m[2][0] = 0.5*(m1-m2);
    
      m1 = c[0,-1,-1]+ c[0,-1,1]+ c[0,-1,0];
      m2 = c[0,1,-1]+ c[0,1,1]+ c[0,1,0];
      m[2][1] = 0.5*(m1-m2);
    
      m1 = c[-1,0,-1] + c[1,0,-1] + c[0,-1,-1] + c[0,1,-1] +
           c[0,0,-1];
      m2 = c[-1,0,1] + c[1,0,1] + c[0,-1,1] + c[0,1,1] +
           c[0,0,1];
      m[2][2] = m1 > m2 ? 1. : -1.;
    
      /* normalize each set (mx,my,mz): |mx|+|my|+|mz| = 1 */
      t0 = fabs(m[0][0]) + fabs(m[0][1]) + fabs(m[0][2]);
      m[0][0] /= t0;
      m[0][1] /= t0;
      m[0][2] /= t0;
    
      t0 = fabs(m[1][0]) + fabs(m[1][1]) + fabs(m[1][2]);
      m[1][0] /= t0;
      m[1][1] /= t0;
      m[1][2] /= t0;
    
      t0 = fabs(m[2][0]) + fabs(m[2][1]) + fabs(m[2][2]);
      m[2][0] /= t0;
      m[2][1] /= t0;
      m[2][2] /= t0;
    
      /* choose among the three central scheme */ 
      t0 = fabs(m[0][0]);
      t1 = fabs(m[1][1]);
      t2 = fabs(m[2][2]);
    
      cn = 0;
      if (t1 > t0) {
        t0 = t1;
        cn = 1;
      }
      if (t2 > t0)
        cn = 2;
    
      /* Youngs-CIAM scheme */  
      m1 = c[-1,-1,-1] + c[-1,1,-1] + c[-1,-1,1] + c[-1,1,1] +
           2.*(c[-1,-1,0] + c[-1,1,0] + c[-1,0,-1] + c[-1,0,1]) +
           4.*c[-1,0,0];
      m2 = c[1,-1,-1] + c[1,1,-1] + c[1,-1,1] + c[1,1,1] +
           2.*(c[1,-1,0] + c[1,1,0] + c[1,0,-1] + c[1,0,1]) +
           4.*c[1,0,0];
      m[3][0] = m1 - m2;
    
      m1 = c[-1,-1,-1] + c[-1,-1,1] + c[1,-1,-1] + c[1,-1,1] +
           2.*( c[-1,-1,0] + c[1,-1,0] + c[0,-1,-1] + c[0,-1,1]) +
           4.*c[0,-1,0];
      m2 = c[-1,1,-1] + c[-1,1,1] + c[1,1,-1] + c[1,1,1] +
           2.*(c[-1,1,0] + c[1,1,0] + c[0,1,-1] + c[0,1,1]) +
           4.*c[0,1,0];
      m[3][1] = m1 - m2;
    
      m1 = c[-1,-1,-1] + c[-1,1,-1] + c[1,-1,-1] + c[1,1,-1] +
           2.*(c[-1,0,-1] + c[1,0,-1] + c[0,-1,-1] + c[0,1,-1]) +
           4.*c[0,0,-1];
      m2 = c[-1,-1,1] + c[-1,1,1] + c[1,-1,1] + c[1,1,1] +
           2.*(c[-1,0,1] + c[1,0,1] + c[0,-1,1] + c[0,1,1]) +
           4.*c[0,0,1];
      m[3][2] = m1 - m2;
    
      /* normalize the set (mx,my,mz): |mx|+|my|+|mz| = 1 */
      t0 = fabs(m[3][0]) + fabs(m[3][1]) + fabs(m[3][2]);  
      if (t0 < 1e-30) {
        coord mxyz = {1., 0., 0.};
        return mxyz;
      }
        
      m[3][0] /= t0;
      m[3][1] /= t0;
      m[3][2] /= t0;
    
      /* choose between the previous choice and Youngs-CIAM */
      t0 = fabs (m[3][0]);
      t1 = fabs (m[3][1]);
      t2 = fabs (m[3][2]);
      if (t1 > t0)
        t0 = t1;
      if (t2 > t0)
        t0 = t2;
    
      if (fabs(m[cn][cn]) > t0)
        cn = 3;
    
      /* components of the normal vector */
      coord mxyz = {m[cn][0], m[cn][1], m[cn][2]};
      return mxyz; 
    }