Limited face reconstruction

After cell limiters are known, left/right face states are built by a limited linear reconstruction. This sits on the residual path between gradient / limiter evaluation and the numerical flux.

Pipeline

qf = cell value (GetQlQr)
     |
     +--> phi = BlendFaceLimiter(phi_cell, phi_neighbor, both-sides?)
     +--> qf  = ApplyLimitedFaceReconstruction(qf, phi, g, x_f - x_c)
     |
     +-- if positivity check fails (weighted path):
           qf <- WeightedFaceAverage with InverseDistanceFaceWeights

Formula

\[q_f = q_c + \phi\,\nabla q_c\cdot(\mathbf{x}_f - \mathbf{x}_c)\]

phi is either the owner-cell limiter or \(\min(\phi_L,\phi_R)\) when face-two-sided blending is enabled (ireconface != 0).

Viscous gradient correction (shared policy)

\[\nabla q \leftarrow \nabla q + \Big(\frac{q_R-q_L}{|LR|} - \nabla q\cdot\mathbf{u}\Big)\mathbf{u}\]

Pure APIs: ApplyLimitedFaceReconstruction, BlendFaceLimiter (ULimiterPolicy.h); CorrectFaceGradient (UGradPolicy.h). Tests: limiter_policy_test, grad_policy_test.