|
PICurv 0.1.0
A Parallel Particle-In-Cell Solver for Curvilinear LES
|
For the full commented template, see:
# ==============================================================================
# PICurv Master Solver Configuration Template
# ==============================================================================
#
# PURPOSE:
# This file defines the NUMERICAL STRATEGY for the simulation. It is divided
# into user-friendly structured sections for common settings, and a flexible
# 'petsc_passthrough_options' section for advanced users to inject any valid
# PETSc command-line flag.
#
# ==============================================================================
# ==============================================================================
# 1. SOLVER OPERATION MODE
# ==============================================================================
operation_mode:
# 'solve': (Default) Compute the fluid dynamics equations.
# 'load': Load pre-computed field data from disk.
eulerian_field_source: "solve" # -> -euler_field_source
# Optional analytical solution selector used when eulerian_field_source = "analytical".
# Supported values today: "TGV3D", "ZERO_FLOW", "UNIFORM_FLOW".
# TGV3D currently requires case.yml to use grid.mode: programmatic_c.
# ZERO_FLOW and UNIFORM_FLOW also support file-based grid ingestion.
analytical_type: "TGV3D" # -> -analytical_type
# Parameters for analytical_type: "UNIFORM_FLOW".
# Uncomment this block only when analytical_type = "UNIFORM_FLOW".
# uniform_flow:
# u: 0.0 # -> -analytical_uniform_u
# v: 0.0 # -> -analytical_uniform_v
# w: 0.0 # -> -analytical_uniform_w
# Verification-only source overrides.
# Use these only when ordinary end-to-end setup cannot expose the behavior you need to test.
# New verification-pathway source injections must be implemented in
# include/verification_sources.h and src/verification_sources.c.
# verification:
# sources:
# diffusivity:
# mode: "analytical" # Verification-only selector; currently fixed to analytical
# profile: "LINEAR_X" # Supported today: LINEAR_X
# gamma0: 1.0e-3 # -> -verification_diffusivity_gamma0
# slope_x: 2.0e-4 # -> -verification_diffusivity_slope_x
#
# scalar:
# mode: "analytical" # Verification-only selector; currently fixed to analytical
# profile: "CONSTANT" # Supported: CONSTANT, LINEAR_X, SIN_PRODUCT
# value: 1.0 # CONSTANT -> -verification_scalar_value
# # phi0: 0.0 # LINEAR_X -> -verification_scalar_phi0
# # slope_x: 1.0 # LINEAR_X -> -verification_scalar_slope_x
# # amplitude: 1.0 # SIN_PRODUCT -> -verification_scalar_amplitude
# # kx: 3.141592653589793 # SIN_PRODUCT -> -verification_scalar_kx
# # ky: 3.141592653589793 # SIN_PRODUCT -> -verification_scalar_ky
# # kz: 3.141592653589793 # SIN_PRODUCT -> -verification_scalar_kz
#
# Scalar verification is intended for runtime diagnostics such as
# logs/scatter_metrics.csv. It bypasses only the particle Psi evolution path and
# reuses the production scatter operator.
# --- Scalar Transport Properties ---
# These affect Eulerian diffusivity and particle scalar/Brownian models.
scalar_transport:
schmidt_number: 1.0 # -> -schmidt_number
turbulent_schmidt_number: 0.7 # -> -turb_schmidt_number
# ==============================================================================
# 2. PRIMARY SOLVER STRATEGY & TOLERANCES
# ==============================================================================
# --- Main Time-Stepping Scheme ---
strategy:
# Accepted values:
# "Dual Time Picard Jameson RK" -> implicit dual-time pseudo-stepping (recommended)
# "Explicit RK4" -> explicit fourth-order Runge-Kutta
# "Newton Krylov" -> matrix-free PETSc SNES/KSP solve
momentum_solver: "Dual Time Picard Jameson RK" # -> -mom_solver_type
central_diff: false # [true/false] -> -central
# --- Convergence Criteria for the Momentum Solver ---
tolerances:
max_iterations: 50 # [Integer] -> -mom_max_pseudo_steps
# absolute_tol: 1.0e-8 # DEPRECATED -> -mom_atol. Takes no part while a
# # residual tolerance is active (the default).
relative_tol: 1.0e-5 # [Float] -> -mom_rtol
residual_absolute_tol: 1.0e-8 # [Float] -> -mom_resid_atol. DIMENSIONLESS:
# converges when |R| <= this * a0*|Ucont|_inf/dt. Sufficient alone.
residual_relative_tol: 1.0e-3 # Use 1.0e-2 for looser exploratory LES
# Step-change tolerance: stop inner loop when ||u_n+1 - u_n|| < step_tol.
# Non-positive or omitted = disabled.
# step_tol: 0.0 # [Float] -> -imp_stol
# --- Advanced Momentum Solver Controls (optional) ---
# This section exposes newer dual-time controls directly (no passthrough needed).
momentum_solver:
# Solver-specific controls for Dual Time Picard Jameson RK.
# Note: 'dual_time_picard_rk4' is an accepted deprecated alias for this block.
dual_time_picard_jameson_rk:
max_pseudo_steps: 50 # -> -mom_max_pseudo_steps
# absolute_tol: 1.0e-8 # DEPRECATED -> -mom_atol. Takes no part while a
# # residual tolerance is active (the default).
relative_tol: 1.0e-5 # -> -mom_rtol
# Step-change tolerance (optional, mirrors tolerances.step_tol):
# step_tol: 0.0 # -> -imp_stol
pseudo_cfl:
# Phase 3+: pseudo_cfl.* values are dimensionless Courant numbers, NOT fractions of dt.
# The solver computes dtau = pseudo_cfl / lambda_max, where lambda_max is the global
# maximum spectral radius of the convective operator (sum of |face fluxes| / cell volume,
# global MPI max). This makes pseudo_cfl flow- and grid-independent.
# Stability limit for 4-stage Jameson RK: ~2.83 (imaginary-axis CFL). Use 0.5-2.0 in practice.
initial: 0.5 # -> -pseudo_cfl (default: 0.5; ~half the stability limit)
minimum: 0.001 # -> -min_pseudo_cfl (default: 0.001)
maximum: 2.0 # -> -max_pseudo_cfl (default: 2.0; stability limit ~2.83)
growth_factor: 1.1 # -> -pseudo_cfl_growth_factor (default: 1.1; must be >= 1)
reduction_factor: 0.75 # -> -pseudo_cfl_reduction_factor (default: 0.75; must be in (0,1))
jameson_residual_noise_allowance_factor: 1.1 # -> -mom_dt_jameson_residual_norm_noise_allowance_factor
# Rejection threshold: a pseudo-time trial is rolled back if the EMA-smoothed step-to-step
# residual ratio exceeds this value. 1.1 allows 10% residual growth before reducing CFL.
# Raise toward 1.2-1.5 for flows with non-monotonic residual histories; lower toward 1.05
# for strict monotonic convergence. Must be >= 1.
# rk4_residual_noise_allowance_factor is a deprecated alias for the above; use only one.
ratio_ema_alpha: 0.3 # -> -mom_ratio_ema_alpha (default: 0.3; range [0, 1])
# Exponential moving average coefficient for the step-to-step residual ratio used in the
# trial-rejection decision. The smoothed ratio is:
# smoothed = alpha * raw_ratio + (1 - alpha) * smoothed_prev
# alpha = 1.0 : raw ratio (original behavior, most aggressive rejection)
# alpha = 0.3 : moderate smoothing; ~3-4 consecutive bad trials needed to trigger rejection
# alpha = 0.0 : ratio never updates (disables ratio-based rejection entirely)
# Increase alpha if the solver rejects too conservatively on noisy residual histories.
# Solver-specific controls for Newton Krylov. Uncomment only when
# strategy.momentum_solver is "Newton Krylov". Omitted fields retain the
# defaults established by src/momentum_newton_krylov.c and PETSc.
# newton_krylov:
# jacobian:
# type: "finite_difference"
# finite_difference:
# mode: "matrix_free"
# preconditioner:
# model: "none"
# # To enable the provisional point-block approximation, use:
# # model: "frozen_momentum_jacobian"
# # structure:
# # type: "point_block"
# nonlinear_solver:
# method: "newtonls" # -> -mom_nk_snes_type
# absolute_tolerance: 1.0e-10 # -> -mom_nk_snes_atol
# relative_tolerance: 1.0e-8 # -> -mom_nk_snes_rtol
# step_tolerance: 1.0e-12 # -> -mom_nk_snes_stol
# max_iterations: 12 # -> -mom_nk_snes_max_it
# line_search:
# type: "bt" # -> -mom_nk_snes_linesearch_type
# linear_solver:
# method: "gmres" # -> -mom_nk_ksp_type
# absolute_tolerance: 1.0e-10 # -> -mom_nk_ksp_atol
# relative_tolerance: 1.0e-6 # -> -mom_nk_ksp_rtol
# max_iterations: 400 # -> -mom_nk_ksp_max_it
# gmres:
# restart: 80 # -> -mom_nk_ksp_gmres_restart
# ==============================================================================
# 3. POISSON SOLVER CONFIGURATION
# ==============================================================================
poisson_solver:
# Solves for pressure correction Phi, then the runtime updates pressure P.
# The outer linear solver uses PETSc KSP under the hood, but this block uses
# PICurv-facing names for the common controls.
# Note: 'pressure_solver' is an accepted deprecated alias for this block name.
method: "fgmres" # -> -ps_ksp_type
absolute_tolerance: 1.0e-5 # -> -ps_ksp_atol and legacy -poisson_tol
relative_tolerance: 1.0e-11 # -> -ps_ksp_rtol
max_iterations: 50 # -> -ps_ksp_max_it
# tolerance: 1.0e-5 # Legacy alias for absolute_tolerance -> -poisson_tol
gmres:
# Only valid for GMRES-family methods: gmres, fgmres, lgmres.
restart: 20 # -> -ps_ksp_gmres_restart
preconditioner:
# Only multigrid is supported for the outer Poisson preconditioner today.
# Other values are rejected until the C runtime grows a non-PCMG path.
type: "multigrid" # -> -ps_pc_type mg
# --- Geometric Multigrid (PCMG) Settings ---
multigrid:
levels: 3 # [Integer] -> -mg_level
# Choose levels so the COARSEST grid lands at roughly 1e3-1e4 unknowns.
# The coarse solver below replicates an LU factor on every rank, so a
# coarse grid that is too large costs memory and time on all ranks; a
# coarse grid that is too small wastes a level. As a rule of thumb a 5M
# cell grid wants 5 levels, not 4.
# Coarsenability: each level halves a direction as IM -> (IM+1)/2, so IM
# must stay odd at every level for the coarsening to be exact. An even IM
# logs "can't be consistently coarsened further" and keeps going on a
# slightly misaligned coarse grid.
# NOTE: levels is bounded by the MPI rank layout, not chosen freely. Every
# level must leave each rank at least stencil_width nodes per axis, and the
# stencil width is 3 whenever ANY axis is periodic (2 otherwise). Exceeding
# it aborts during DM creation with:
# Local x-width of domain x 2 is smaller than stencil width s 3
# Constraint: floor((cells_per_axis / 2^(levels-1) + 1) / ranks_per_axis) >= stencil_width
# picurv validate cannot catch this; it does not see the rank layout.
# Worked maxima: docs/pages/25_Pressure_Poisson_GMRES_Multigrid.md
pre_sweeps: 2 # [Integer] -> -mg_pre_it
post_sweeps: 2 # [Integer] -> -mg_post_it
# Current PETSc binding applies one smoother count; if these differ,
# PICurv uses the larger value and logs a warning.
semi_coarsening:
i: false # [true/false] -> -mg_i_semi
j: false # [true/false] -> -mg_j_semi
k: true # [true/false] -> -mg_k_semi
cycle: "v" # Currently supported: "v"
mode: "multiplicative" # Currently supported: "multiplicative"
# --- Smoother / Coarse Solver Configuration Per MG Level ---
# PETSc/PICurv level numbering uses level_0 as the coarsest grid; larger
# level numbers are progressively finer.
# Friendly aliases: `method` -> ksp_type, `preconditioner` -> pc_type.
# Other keys are forwarded verbatim under PETSc's level prefix: level_0
# uses -ps_mg_coarse_<key>; positive levels use -ps_mg_levels_N_<key>.
# Supported direct keys include ksp_type, pc_type, ksp_max_it, ksp_rtol, ksp_atol.
level_solvers:
level_0:
# level_0 is the COARSE SOLVE at the base of the V-cycle, not a
# smoother. The smoothers on level_1..N kill high-frequency error;
# this solve kills the low-frequency error they are blind to.
#
# Because it sits inside a preconditioner, it must be a FIXED LINEAR
# operator: the same input vector must always produce the same output.
# Krylov methods (gmres, fgmres, cg, bcgs) are not - their subspace
# adapts to the input, which makes the whole MG preconditioner
# nonlinear. The outer FGMRES then tolerates it for constructing the
# solution, but its Arnoldi recurrence decouples from the true
# residual and the convergence test starts passing on a number that no
# longer describes b-Ax. Pinning ksp_max_it does NOT fix this.
# PICurv logs a warning at startup if you configure one here.
#
# Recommended by coarse-grid size:
# <= ~1e4 unknowns : preonly + redundant (replicated direct LU)
# larger : preonly + telescope (LU on a rank subset)
# last resort : a Krylov method with tolerances set against the
# TRUE residual, not the tracked one
method: "preonly" # -> -ps_mg_coarse_ksp_type
preconditioner: "redundant" # -> -ps_mg_coarse_pc_type
# ksp_max_it: 30 # -> -ps_mg_coarse_ksp_max_it
# ksp_rtol: 1.0e-3 # -> -ps_mg_coarse_ksp_rtol
# ksp_atol: 1.0e-8 # -> -ps_mg_coarse_ksp_atol
# level_1..N are SMOOTHERS. Richardson, Jacobi, Chebyshev and SOR are all
# fixed linear operators, which is exactly why they belong here.
level_1:
method: "richardson"
preconditioner: "bjacobi"
level_2:
method: "richardson"
preconditioner: "bjacobi"
# ==============================================================================
# 4. INTERPOLATION
# Controls grid-to-particle interpolation numerics.
# ==============================================================================
interpolation:
# Method for interpolating Eulerian fields to particle positions.
# Options:
# - "Trilinear" (default) Direct trilinear from 8 nearest cell centers.
# Second-order on both uniform and curvilinear grids.
# - "CornerAveraged" Legacy two-stage: center->corner average, then trilinear
# from corners. Second-order only on uniform Cartesian grids.
method: "Trilinear" # -> -interpolation_method
# ==============================================================================
# 5. PETSC PASSTHROUGH OPTIONS (FOR ADVANCED USERS)
# ==============================================================================
petsc_passthrough_options:
# Use this only for advanced PETSc controls that do not have structured YAML
# above. Structured values and passthrough flags target the same PETSc options;
# passthrough wins when the same flag is listed in both places.
# --- MG level preconditioner tuning examples ---
# jacobi / sor: simple smoother PCs; no extra nested setup is normally needed.
# -ps_mg_levels_2_pc_type: "sor"
# -ps_mg_levels_2_pc_sor_omega: 1.0 # PETSc SOR relaxation; positive real
# ilu / lu: factor PCs; use PETSc factor controls when pivots are fragile.
# -ps_mg_coarse_pc_type: "ilu"
# -ps_mg_coarse_pc_factor_levels: 1 # nonnegative integer
# -ps_mg_coarse_pc_factor_shift_amount: 1.0e-10 # nonnegative real
# bjacobi: nested block solves. Inspect exact nested prefixes with -ps_ksp_view
# when tuning sub-KSP/sub-PC options for your PETSc version.
# --- Additional Momentum Controls (if you prefer passthrough style) ---
# Prefer the structured momentum solver blocks above.
# These passthrough flags override the structured block if both are present.
# -pseudo_cfl: 0.5 # dimensionless CFL = dtau * lambda_max (spectral-radius-based)
# -max_pseudo_cfl: 2.0
# -min_pseudo_cfl: 0.001
# -pseudo_cfl_growth_factor: 1.1
# -pseudo_cfl_reduction_factor: 0.75
# -mom_dt_jameson_residual_norm_noise_allowance_factor: 1.1
# -mom_ratio_ema_alpha: 0.3
solver.yml controls numerical strategy and solver internals.
Mappings:
eulerian_field_source -> -euler_field_source (solve, load, analytical)analytical_type -> -analytical_typeuniform_flow.u/v/w -> -analytical_uniform_u/-analytical_uniform_v/-analytical_uniform_w when analytical_type: "UNIFORM_FLOW"uniform_flow is only valid when analytical_type: "UNIFORM_FLOW".
Mappings:
momentum_solver -> -mom_solver_type (picurv accepts Explicit RK4, Dual Time Picard Jameson RK, or Newton Krylov)central_diff -> -centralOlder boolean toggles are not supported; use strategy.momentum_solver. Only implemented momentum solver values are accepted by picurv and the C runtime. The deprecated Dual Time Picard RK4 display name, dual_time_picard_rk4 solver block, and rk4_residual_noise_allowance_factor key remain readable compatibility aliases; generated controls always use the canonical Jameson names.
Mappings:
max_iterations -> -mom_max_pseudo_stepsrelative_tol -> -mom_rtolresidual_absolute_tol -> -mom_resid_atolresidual_relative_tol -> -mom_resid_rtolabsolute_tol -> -mom_atol is deprecated and no longer appears in the shipped configs. It is still accepted, but the CLI warns that it takes no part in convergence while a residual tolerance is active; it survives only for the legacy update-only branch.
Both residual tolerances now default to enabled (-mom_resid_atol 1e-8, -mom_resid_rtol 1e-3). Setting both non-positive is an explicit opt-out that selects the legacy update-only branch, which can converge falsely when dtau collapses; prefer not to.
When either residual tolerance is positive it decides convergence: the absolute test is sufficient on its own, and the relative test is paired with relative_tol as a guard. absolute_tol then takes no part, because |dU| <= absolute_tol is the disguised, step-size-dependent residual bound |R| <= absolute_tol/dtau. When both residual tolerances are non-positive, the solver preserves its existing update-only convergence criterion (absolute_tol and relative_tol). See 3. Convergence and Adaptive Rollback.
residual_absolute_tol is dimensionless. The residual carries units of volumetric flux per time, so a raw bound on |R| would need retuning for every grid, velocity scale and timestep; across the shipped cases |R| at step 1 spans 1.2e-2 (plane channels) to 2.0 (driven duct). The test applied is
|R| <= residual_absolute_tol * resid_ref, resid_ref = a0 * |Ucont|_inf / dt
where resid_ref is the magnitude of the residual's own BDF term, recomputed each physical step. Normalising by it removes the dt and velocity-scale factors that dominate that spread, so one value is portable. resid_ref is reported on the per-step Dual-time solver: log line. step_tol/-imp_stol remains accepted as a deprecated compatibility option but is unused by active momentum solvers.
Mappings include:
-pseudo_cfl, -min_pseudo_cfl, -max_pseudo_cfl-pseudo_cfl_growth_factor, -pseudo_cfl_reduction_factor-mom_dt_jameson_residual_norm_noise_allowance_factorRule: solver-specific blocks must match selected momentum solver type. Do not set canonical Jameson keys and their deprecated RK4 aliases together. Pseudo-CFL is exclusively a Dual Time Picard–Jameson RK control: it is neither accepted from the structured Newton–Krylov block nor shown in a Newton–Krylov startup banner.
For strategy.momentum_solver: "Newton Krylov", the structured PETSc controls are:
Mappings are nonlinear_solver.method/absolute_tolerance/relative_tolerance/step_tolerance/max_iterations to -mom_nk_snes_type/-mom_nk_snes_atol/-mom_nk_snes_rtol/-mom_nk_snes_stol/-mom_nk_snes_max_it, line_search.type to -mom_nk_snes_linesearch_type, and the corresponding linear_solver fields to -mom_nk_ksp_type/-mom_nk_ksp_atol/-mom_nk_ksp_rtol/-mom_nk_ksp_max_it. gmres.restart maps to -mom_nk_ksp_gmres_restart. The Jacobian fields map to -mom_nk_jacobian_type/-mom_nk_jacobian_fd_mode; the preconditioner fields map to -mom_nk_preconditioner_model/-mom_nk_preconditioner_structure.
Newton tolerances are nonnegative, iteration/restart counts are positive integers, and GMRES restart is valid only for gmres, fgmres, or lgmres. Supported combinations are finite difference/matrix free with either no preconditioner or frozen momentum Jacobian/point block. The released linear_solver.preconditioner.type: none remains a deprecated alias for the no-preconditioner model. Raw petsc_passthrough_options are applied last, but an incompatible raw -mom_nk_pc_type override is rejected by the runtime. The Jacobian block is a strict discriminated configuration: an explicit type: finite_difference requires finite_difference.mode: matrix_free. colored_sparse, frozen_momentum_approximation, and irrelevant sibling configuration are rejected because their implementations are not present.
Mappings:
method -> -ps_ksp_typeabsolute_tolerance -> -ps_ksp_atol and legacy -poisson_tolrelative_tolerance -> -ps_ksp_rtolmax_iterations -> -ps_ksp_max_itgmres.restart -> -ps_ksp_gmres_restart; valid only for gmres, fgmres, or lgmrespreconditioner.type -> -ps_pc_type; currently only multigrid is supportedmultigrid.levels -> -mg_levelmultigrid.pre_sweeps -> -mg_pre_itmultigrid.post_sweeps -> -mg_post_itmultigrid.semi_coarsening.i/j/k -> -mg_i_semi/-mg_j_semi/-mg_k_semimultigrid.level_solvers.level_N.method -> -ps_mg_levels_N_ksp_type for N > 0multigrid.level_solvers.level_N.preconditioner -> -ps_mg_levels_N_pc_type for N > 0multigrid.level_solvers.level_0.* -> -ps_mg_coarse_*; PETSc names the coarsest solver separately from the positive levelsmultigrid.cycle and multigrid.mode are validated structured keys; current supported values are v and multiplicative.Rules:
pressure_solver is accepted as a legacy alias, but poisson_solver is preferred because the linear solve computes pressure correction Phi.level_0 is the coarsest level and larger numbers are finer.level_0 is the multigrid coarse solve, not a smoother, and the naming hides that. level_1..N are smoothers; level_0 sits at the base of the V-cycle and removes the smooth error the smoothers cannot see. Because multigrid is used here as a preconditioner, level_0 must be a fixed linear operator. A Krylov method there (gmres, fgmres, cg, bcgs, ...) makes the whole preconditioner nonlinear, which decouples the outer FGMRES tracked residual from the true residual b - Ax: the solver then reports convergence on a number that no longer describes the constraint. Pinning ksp_max_it does not fix it. PICurv logs a startup warning if you configure one. Use {method: preonly, preconditioner: redundant} for coarse grids up to roughly 1e4 unknowns, telescope above that. Full discussion, the worked tracked-vs-true residual table, and the level-count sizing rule: Pressure-Poisson, GMRES, and Multigrid.multigrid.levels is bounded by the MPI decomposition, not chosen freely: every level must leave each rank at least stencil_width nodes per axis (3 when any axis is periodic, 2 otherwise). Exceeding it aborts during DM creation with Local x-width of domain ... is smaller than stencil width, and picurv validate cannot catch it because it does not see the rank layout. Formula and worked maxima: Pressure-Poisson, GMRES, and Multigrid.pre_sweeps and post_sweeps differ, PICurv uses the larger value and logs a warning.petsc_passthrough_options; common examples include -ps_mg_levels_N_pc_sor_omega for SOR and -ps_mg_levels_N_pc_factor_shift_amount / -ps_mg_levels_N_pc_factor_levels for factor PCs.Convergence monitoring is observation policy rather than a numerical solver selection, so it is configured in monitor.yml -> solution_monitoring.convergence rather than here. See Configuration Reference: Monitor YAML for modes, mappings, and defaults. The monitor records every completed timestep; cadence is not a user setting.
solver.yml accepts no solution_convergence key. A file carrying one is rejected by validation with the location to move it to.
Scientific field statistics are likewise a monitor concern, configured at monitor.yml -> field_statistics; see Field Statistics.
Mappings:
method -> -interpolation_method (Trilinear = 0, CornerAveraged = 1)The Trilinear method (default) performs direct trilinear interpolation from the 8 nearest cell centers, providing second-order accuracy on both uniform and curvilinear grids. The CornerAveraged method is the legacy two-stage path (center-to-corner average, then trilinear from corners), which is second-order only on uniform Cartesian grids.
See Trilinear Interpolation and Particle-Grid Projection for algorithmic details.
Mappings:
schmidt_number -> -schmidt_numberturbulent_schmidt_number -> -turb_schmidt_numberRules:
schmidt_number = 1.0 and turbulent_schmidt_number = 0.7petsc_passthrough_options for flags without a YAML schemaMappings:
verification.sources.diffusivity.mode -> -verification_diffusivity_modeverification.sources.diffusivity.profile -> -verification_diffusivity_profileverification.sources.diffusivity.gamma0 -> -verification_diffusivity_gamma0verification.sources.diffusivity.slope_x -> -verification_diffusivity_slope_xverification.sources.scalar.mode -> -verification_scalar_modeverification.sources.scalar.profile -> -verification_scalar_profileverification.sources.scalar.value -> -verification_scalar_valueverification.sources.scalar.phi0 -> -verification_scalar_phi0verification.sources.scalar.slope_x -> -verification_scalar_slope_xverification.sources.scalar.amplitude -> -verification_scalar_amplitudeverification.sources.scalar.kx/ky/kz -> -verification_scalar_kx/-verification_scalar_ky/-verification_scalar_kzRules:
operation_mode.eulerian_field_source: "analytical"verification.sources.scalar prescribes particle Psi from analytical truth and enables the runtime diagnostic logs/scatter_metrics.csvCONSTANT, LINEAR_X, and SIN_PRODUCTinclude/verification_sources.h and src/verification_sources.cAdvanced escape hatch for raw PETSc flags:
These are passed into PETSc options DB and consumed by runtime calls like KSPSetFromOptions.
Proceed to Configuration Reference: Monitor YAML.
For mapping and extension workflows:
This page describes Configuration Reference: Solver YAML within the PICurv workflow. For CFD users, the most reliable reading strategy is to map the page content to a concrete run decision: what is configured, what runtime stage it influences, and which diagnostics should confirm expected behavior.
Treat this page as both a conceptual reference and a runbook. If you are debugging, pair the method/procedure described here with monitor output, generated runtime artifacts under runs/<run_id>/config, and the associated solver/post logs so numerical intent and implementation behavior stay aligned.