src/myc2d.h

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    
    #define NOT_ZERO 1e-30
    
    /*-----------------------------------------------------*
     *MYC - Mixed Youngs and Central Scheme (2D)           *
     *-----------------------------------------------------*/
    coord mycs (Point point, scalar c)
    {
      int ix;
      double c_t,c_b,c_r,c_l;
      double mx0,my0,mx1,my1,mm1,mm2;
    
      /* top, bottom, right and left sums of c values */
      c_t = c[-1,1] + c[0,1] + c[1,1];
      c_b = c[-1,-1] + c[0,-1] + c[1,-1];
      c_r = c[1,-1] + c[1,0] + c[1,1];
      c_l = c[-1,-1] + c[-1,0] + c[-1,1];
    
      /* consider two lines: sgn(my) Y =  mx0 X + alpha,
         and: sgn(mx) X =  my0 Y + alpha */ 
      mx0 = 0.5*(c_l - c_r);
      my0 = 0.5*(c_b - c_t);
    
      /* minimum coefficient between mx0 and my0 wins */
      if (fabs(mx0) <= fabs(my0)) {
        my0 = my0 > 0. ? 1. : -1.;
        ix = 1;
      }
      else {
        mx0 = mx0 > 0. ? 1. : -1.;
        ix = 0;
      }
    
      /* Youngs' normal to the interface */
      mm1 = c[-1,-1] + 2.0*c[-1,0] + c[-1,1];
      mm2 = c[1,-1] + 2.0*c[1,0] + c[1,1];
      mx1 = mm1 - mm2 + NOT_ZERO;
      mm1 = c[-1,-1] + 2.0*c[0,-1] + c[1,-1];
      mm2 = c[-1,1] + 2.0*c[0,1] + c[1,1];
      my1 = mm1 - mm2 + NOT_ZERO;
    
      /* choose between the best central and Youngs' scheme */ 
      if (ix) {
        mm1 = fabs(my1);
        mm1 = fabs(mx1)/mm1;
        if (mm1 > fabs(mx0)) {
          mx0 = mx1;
          my0 = my1;
        }
      }
      else {
        mm1 = fabs(mx1);
        mm1 = fabs(my1)/mm1;
        if (mm1 > fabs(my0)) {
          mx0 = mx1;
          my0 = my1;
        }
      }
    	
      /* normalize the set (mx0,my0): |mx0|+|my0|=1 and
         write the two components of the normal vector  */
      mm1 = fabs(mx0) + fabs(my0);
      coord n = {mx0/mm1, my0/mm1};
    
      return n;
    }