Viscous face geometry contracts

Shares inverse-distance face weights with Green-Gauss (UGradPolicy). Viscous reconstruction (VisGradGeom) no longer re-implements the weight formula; it calls the same pure function.

Pipeline (geometry side)

cell/face centers
     |
     +--> InverseDistanceFaceWeights -> fw1, fw2  (blend cell grads)
     +--> FaceSkewAngleDegrees       -> angle1/2 (skew validity gates)
     +--> UnitizeDisplacement        -> unit L->R and 1/|LR|

Skew angle

\[\theta^{\circ} = \frac{180}{\pi} \arcsin\Big(\mathrm{clamp}\big(\tfrac{p}{|\mathbf{d}|}, -1, 1\big)\Big)\]

where \(p\) is the signed projection length used by the legacy vis path (d1/d2 along the face normal).

Unit cell-to-cell direction

\[\mathbf{u}_{LR} = \frac{\mathbf{x}_{cR}-\mathbf{x}_{cL}}{|\mathbf{x}_{cR}-\mathbf{x}_{cL}|}, \quad o_{ds} = \frac{1}{|\mathbf{x}_{cR}-\mathbf{x}_{cL}|}\]

Pure APIs live in UGradPolicy.h (@doc-algorithm vis-face-geometry and green-gauss-gradient). Tests: grad_policy_test.