{
    "_doc": "CelerisLab LBM configuration — single source of truth. See configs/CONFIG.md for full documentation.",

    "grid": {
        "lattice_model": "D2Q9",
        "_lattice_model": "D2Q9 | D3Q19",
        "nx": 512,
        "ny": 256,
        "nz": 1
    },
    "physics": {
        "data_type": "FP32",
        "_data_type": "FP32 only for now (FP64 rejected at validate — kernels/host float32)",
        "viscosity": 0.0035,
        "velocity": 0.03,
        "rho": 1.0
    },
    "method": {
        "collision": "SRT",
        "_collision": "SRT | TRT | MRT",
        "streaming": "double_buffer",
        "_streaming": "double_buffer | esopull",
        "store_precision": "FP32",
        "_store_precision": "FP32 | FP16S | FP16C — GPU DDF storage",
        "ddf_shifting": false,
        "les": {
            "enabled": false,
            "cs": 0.16,
            "closed_form": true
        },
        "trt": {
            "magic_param": 0.1875
        },
        "inlet": {
            "profile": "parabolic",
            "_profile": "uniform | parabolic",
            "trt_neq_damp": 0.5,
            "_trt_neq_damp": "TRT inlet NEQ donor damping [0,1]. Lower = smoother inlet, less accurate."
        },
        "outlet": {
            "mode": "neq_extrap",
            "_mode": "neq_extrap | zero_gradient | blended",
            "backflow_clamp": true,
            "blend_alpha": 0.7,
            "srt_neq_damp": 0.5,
            "_srt_neq_damp": "SRT outlet NEQ donor damping [0,1]. Lower = less checkerboard noise."
        },
        "y_wall_bc": "bounce_back",
        "_y_wall_bc": "bounce_back | free_slip",
        "omega_guard": {
            "min": 0.01,
            "max": 1.96,
            "_doc": "High-Re: keep max in 1.90-1.96"
        }
    },
    "cuda": {
        "threads_per_block": 256,
        "compute_capability": "auto",
        "_compute_capability": "auto | e.g. 7.0"
    }
}
