/*-----------------------------------------------------* *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; }