PICurv solves flow on structured curvilinear grids using the curvilinear formulation of CURVIB. It has no immersed-boundary capability.
The code evolves contravariant flux-like velocity components (Ucont) and derives Cartesian velocity (Ucat) as needed. Curvilinear metrics map physical derivatives to computational coordinates:
\[ \nabla \phi = \phi_{\xi}\,\mathbf{\xi} + \phi_{\eta}\,\mathbf{\eta} + \phi_{\zeta}\,\mathbf{\zeta}, \qquad J^{-1} = \frac{\partial(\xi,\eta,\zeta)}{\partial(x,y,z)}. \]
Face and cell metric tensors are precomputed and reused by RHS, Poisson, and projection stages.
Main setup touchpoints:
Useful geometric helper for BC and flux logic:
Per-cell geometry for the subgrid models, computed from a cell's face-area vectors and inverse volume alone, so that it is the same for an identical cell wherever and however it sits in space:
geometric_mean, max_edge and scotti filter widths are built;ComputeCellCharacteristicLengthScale returns the Cartesian components of the cell diagonal instead. Those change when the same cell is rotated, which is why no subgrid path uses it; it has no production caller.
Relevant CURVIB references for this code path:
10.1016/j.jcp.2008.04.024.10.1007/s10439-013-0758-9.PICurv implementation notes:
You mainly control CurvIB behavior through:
Even when users never interact with metric tensors directly, they govern stability, pressure correction quality, and particle coupling accuracy.