Astropy
zLanqing/codex-claude-academic-skills
Comprehensive Python library for astronomy and astrophysics.
Create a new model wrapper for the PhysicsNeMo CFD benchmarking workflow.
$ npx skills add NVIDIA/physicsnemo-cfd --skill physicsnemo-cfd-create-model-wrapper -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install NVIDIA/physicsnemo-cfd physicsnemo-cfd-create-model-wrapper --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/NVIDIA/physicsnemo-cfd.git skills-src && mkdir -p .claude/skills && cp -r skills-src/skills/physicsnemo-cfd-create-model-wrapper .claude/skills/physicsnemo-cfd-create-model-wrapper && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "physicsnemo-cfd-create-model-wrapper" agent skill from https://github.com/NVIDIA/physicsnemo-cfd/tree/main/skills/physicsnemo-cfd-create-model-wrapper into .claude/skills/physicsnemo-cfd-create-model-wrapper/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "physicsnemo-cfd-create-model-wrapper", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/NVIDIA/physicsnemo-cfd/tree/main/skills/physicsnemo-cfd-create-model-wrapperType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add NVIDIA/physicsnemo-cfd --skill physicsnemo-cfd-create-model-wrapper -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install NVIDIA/physicsnemo-cfd physicsnemo-cfd-create-model-wrapper --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/NVIDIA/physicsnemo-cfd.git skills-src && mkdir -p .agents/skills && cp -r skills-src/skills/physicsnemo-cfd-create-model-wrapper .agents/skills/physicsnemo-cfd-create-model-wrapper && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "physicsnemo-cfd-create-model-wrapper" agent skill from https://github.com/NVIDIA/physicsnemo-cfd/tree/main/skills/physicsnemo-cfd-create-model-wrapper into .agents/skills/physicsnemo-cfd-create-model-wrapper/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "physicsnemo-cfd-create-model-wrapper", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add NVIDIA/physicsnemo-cfd --skill physicsnemo-cfd-create-model-wrapper -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install NVIDIA/physicsnemo-cfd physicsnemo-cfd-create-model-wrapper --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/NVIDIA/physicsnemo-cfd.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/skills/physicsnemo-cfd-create-model-wrapper .cursor/skills/physicsnemo-cfd-create-model-wrapper && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "physicsnemo-cfd-create-model-wrapper" agent skill from https://github.com/NVIDIA/physicsnemo-cfd/tree/main/skills/physicsnemo-cfd-create-model-wrapper into .cursor/skills/physicsnemo-cfd-create-model-wrapper/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "physicsnemo-cfd-create-model-wrapper", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/NVIDIA/physicsnemo-cfd.git --path skills/physicsnemo-cfd-create-model-wrapper--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add NVIDIA/physicsnemo-cfd --skill physicsnemo-cfd-create-model-wrapper -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install NVIDIA/physicsnemo-cfd physicsnemo-cfd-create-model-wrapper --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/NVIDIA/physicsnemo-cfd.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/skills/physicsnemo-cfd-create-model-wrapper .gemini/skills/physicsnemo-cfd-create-model-wrapper && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "physicsnemo-cfd-create-model-wrapper" agent skill from https://github.com/NVIDIA/physicsnemo-cfd/tree/main/skills/physicsnemo-cfd-create-model-wrapper into .gemini/skills/physicsnemo-cfd-create-model-wrapper/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "physicsnemo-cfd-create-model-wrapper", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install NVIDIA/physicsnemo-cfd physicsnemo-cfd-create-model-wrapperInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add NVIDIA/physicsnemo-cfd --skill physicsnemo-cfd-create-model-wrapper -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/NVIDIA/physicsnemo-cfd.git skills-src && mkdir -p .github/skills && cp -r skills-src/skills/physicsnemo-cfd-create-model-wrapper .github/skills/physicsnemo-cfd-create-model-wrapper && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "physicsnemo-cfd-create-model-wrapper" agent skill from https://github.com/NVIDIA/physicsnemo-cfd/tree/main/skills/physicsnemo-cfd-create-model-wrapper into .github/skills/physicsnemo-cfd-create-model-wrapper/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "physicsnemo-cfd-create-model-wrapper", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add NVIDIA/physicsnemo-cfd --skill physicsnemo-cfd-create-model-wrapper -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install NVIDIA/physicsnemo-cfd physicsnemo-cfd-create-model-wrapper --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/NVIDIA/physicsnemo-cfd.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/skills/physicsnemo-cfd-create-model-wrapper .opencode/skills/physicsnemo-cfd-create-model-wrapper && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "physicsnemo-cfd-create-model-wrapper" agent skill from https://github.com/NVIDIA/physicsnemo-cfd/tree/main/skills/physicsnemo-cfd-create-model-wrapper into .opencode/skills/physicsnemo-cfd-create-model-wrapper/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "physicsnemo-cfd-create-model-wrapper", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
physicsnemo-cfd-create-model-wrapperCreate a new model wrapper for the PhysicsNeMo CFD benchmarking workflow.
Physicsnemo Cfd Create Model Wrapper is an agent skill from NVIDIA/physicsnemo-cfd, published by the product's own GitHub organization. Create a new model wrapper for the PhysicsNeMo CFD benchmarking workflow. Use when the user wants to add a new CFD model, write a CFDModel wrapper, integrate a new neural network architecture, or run a custom model through the benchmarking pipeline.
Its SKILL.md is about 5.1k tokens, which your agent loads only when the skill is triggered. The skill folder holds 9 other files, including reference files and assets (for example `BENCHMARK.md`, `assets/global_stats.example.json` and `evals/evals.json`).
It sits in Research & Science, covering Physical and earth sciences. It works with NVIDIA AI Platform. The repository describes itself as: Library for using the models trained in PhysicsNeMo in Engineering and CFD workflows. The licence is Apache-2.0.
6 steps, taken from the step headings in SKILL.md.
Read from SKILL.md and the folder at commit 0612ec4. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
Ships script files (Python), which the agent can run.
Shell commands in SKILL.md call:
gitFrom the folder's file list and the shell code blocks in SKILL.md.
No URLs in SKILL.md. Its commands use git, which can reach the network depending on how they are called.
From URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Physicsnemo Cfd Create Model Wrapper loads about 5.1k tokens when it runs, and up to ~11k if it reads all its reference files. Until then it costs about 72 tokens; SKILL.md has 1,840 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check found no risky patterns in SKILL.md.
Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.
The full file from NVIDIA/physicsnemo-cfd at commit 0612ec4, republished under its Apache-2.0 licence (© NVIDIA). 1,840 words, ~5,063 tokens.
.claude/skills/physicsnemo-cfd-create-model-wrapper/SKILL.md (or your agent's skills folder). This skill also uses 6 other files; get the full folder from GitHub.Guide the user through adding a new CFD model to the benchmarking workflow
by writing a CFDModel subclass.
Spend a little effort up front collecting any existing artifacts that reveal how the model actually behaves — but do not block on them. Look (without stopping to ask the user) for:
Use these to pin down four things the wrapper must mirror exactly:
prepare_inputs/decode_outputs match
the trained graph.If some or all of these aren't available, that's fine — proceed anyway: reconstruct from the checkpoint and stats file, pick the most likely option, and build the wrapper now. Do not stop and wait for answers before writing code. Just avoid silently guessing: a wrong normalization scheme or channel order produces plausible-looking but wrong predictions. So state each such assumption inline, and after delivering the wrapper, raise the still-uncertain choices as explicit open items for the user to confirm — e.g. normalization scheme, input tier, and output fields/channel order. This keeps you unblocked while making the risky decisions visible.
Start with the complete, ready-to-adapt templates bundled with this skill — they are always available even when the PhysicsNeMo-CFD source tree is not on disk:
references/example_wrapper.py — full surface and volume
CFDModel reference implementations (load, prepare_inputs, predict,
decode_outputs, registration). Copy and adapt one of these.assets/global_stats.example.json — sample mean/std stats for both
surface and volume.When the PhysicsNeMo-CFD repo is present, also read these for the live interface (verify paths against the actual tree):
physicsnemo/cfd/evaluation/models/model_registry.py — base class and
registryphysicsnemo/cfd/evaluation/datasets/schema.py — CanonicalCase,
build_predictions_dictphysicsnemo/cfd/evaluation/models/wrappers/surface_baseline.py —
simplest concrete surface wrapperphysicsnemo/cfd/evaluation/models/wrappers/volume_baseline.py —
simplest concrete volume wrapperphysicsnemo/cfd/evaluation/models/wrappers/__init__.py — how wrappers
are registeredphysicsnemo/cfd/evaluation/common/io.py — mesh loading and
normalization stats helpersworkflows/benchmarking/notebooks/adding_a_new_model.ipynb —
end-to-end tutorialCFDModel interfaceEvery wrapper must set two class variables and implement four methods:
| Member | Purpose |
|---|---|
INFERENCE_DOMAIN | "surface" or "volume" — which mesh manifold |
OUTPUT_LOCATION | "point" or "cell" — where predictions live on the mesh |
output_location (property) | Instance-level access to OUTPUT_LOCATION |
load(checkpoint_path, stats_path, device, **kwargs) | Load weights and stats; return self |
prepare_inputs(case: CanonicalCase) | Convert canonical case into model-specific tensors/graphs |
predict(model_input) | Run forward pass; return raw output |
decode_outputs(raw_output, case, model_input=None) | Denormalize and map to canonical predictions dict |
The engine calls load once, then prepare_inputs → predict → decode_outputs(raw, case, model_input) per case (model_input is the
dict from prepare_inputs; use when decode must mirror inference
geometry).
Uncertainty-quantification (UQ) models set two more class variables
(SUPPORTS_UQ, UQ_METHOD) and implement extra hooks — decode_distribution
(closed-form), or for sampling a stochastic predict plus
predict_deterministic (and optionally predict_ensemble). This is fully
additive: deterministic wrappers leave the defaults (SUPPORTS_UQ=False) and
are unaffected. See the "Uncertainty quantification" section below.
Always generate a new, complete wrapper class for the requested
model. Existing wrappers (e.g. surface_baseline.py) are references
to read, not substitutes — when the user asks to write or create a
wrapper, produce a full new class file even if similar ones already
exist. Do not stop at "a wrapper already exists" or offer to reuse one
in place of writing the requested one. Always tell the user how to
register it: register_model(...) at import for a quick test, and an
entry in wrappers/__init__.py to make it permanent (Step 6).
git status shows a similar file, write the new class.pressure + shear_stress — pass only the fields the
model predicts; add custom ones via **extra.__init__.py — registering only inline and never
mentioning permanent registration.Copy references/example_wrapper.py and adapt it — it has full
surface and volume implementations. Don't hand-write from scratch or
paste the whole template back to the user. The class skeleton is just:
class MyModelWrapper(CFDModel):
INFERENCE_DOMAIN: ClassVar[InferenceDomain] = "surface" # or "volume"
OUTPUT_LOCATION: ClassVar[OutputLocation] = "cell" # or "point"
@property
def output_location(self): return self.OUTPUT_LOCATION
def load(self, checkpoint_path, stats_path, device, **kwargs): ... # weights + stats; return self
def prepare_inputs(self, case): ... # CanonicalCase -> model input
def predict(self, model_input): ... # forward pass -> raw output
def decode_outputs(self, raw_output, case, model_input=None): ... # denormalize -> build_predictions_dict(...)Keep responses terse: state the few model-specific decisions (normalization scheme, input tier, output fields) and the file you wrote — don't echo the interface table or the full reference file back.
Normalization (match the training script exactly): Most trained
models normalize inputs/outputs, and decode_outputs must apply the
inverse of whatever the model was trained with. First identify the
scheme:
x_norm = (x - mean) / std → inverse
x = x_norm * std + mean. This is the repo's built-in format. Use
load_global_stats(stats_path) from
physicsnemo/cfd/evaluation/common/io.py; it reads mean/std_dev
JSON and returns mean/std tensors.x_norm = (x - min) / (max - min) → inverse
x = x_norm * (max - min) + min. There is no built-in helper for
this — store min/max (e.g. in your stats JSON) and apply the
inverse yourself in decode_outputs. Do not feed a min-max file to
load_global_stats; the keys won't match.Confirm the scheme from the training/inference script or the stats file rather than assuming mean-std. Applying the wrong inverse yields wrong-but-plausible fields that still pass shape checks.
Inputs (handle the model's actual input tier): prepare_inputs
receives a CanonicalCase. Pull what the model needs:
case.mesh_path (vtp/vtu) via
pv.read, as in the example — sufficient for many geometry-only
models.case.metadata (or case.ground_truth for field
arrays). Broadcast/concatenate them onto the per-point features as the
training script did.case.metadata; load it in prepare_inputs and build
the geometric encoding the model expects.Inspect case.metadata and case.ground_truth keys for a real case
early — the dataset adapter decides what is available.
Outputs (predict only what the model produces, plus extras):
build_predictions_dict takes pressure, shear_stress, velocity,
turbulent_viscosity (all optional) and arbitrary **extra
fields. So:
stagnation_pressure, temperature,
mach) are passed as keyword args: build_predictions_dict(pressure=p, mach=m, temperature=t). Each becomes a prediction variable.output.mesh_field_names in the config (Step 4) and
a corresponding metric if you want it scored.Output shape: pressure must be (N,) float32. shear_stress must
be (N, 3) float32 for surface. Volume fields: velocity is (N, 3),
turbulent_viscosity is (N,). Custom scalar fields are (N,), vector
fields (N, k).
Output location: If OUTPUT_LOCATION = "cell", return N =
mesh.n_cells values. If "point", return N = mesh.n_points values.
Batching: For large meshes, prepare_inputs may need to subsample
or batch. Use kwargs passed through load() (e.g.,
batch_resolution, geometry_sampling) to control this.
Your model needs a checkpoint file and optionally a global_stats.json:
# Checkpoint: save your model's state dict
torch.save(model.state_dict(), "checkpoint.pt")
# Stats: JSON with mean/std_dev for denormalization
# Surface format:
{
"mean": {"pressure": [0.0], "shear_stress": [0.0, 0.0, 0.0]},
"std_dev": {"pressure": [1.0], "shear_stress": [1.0, 1.0, 1.0]}
}
# Volume format:
{
"mean": {"pressure": [0.0], "velocity": [0.0, 0.0, 0.0], "turbulent_viscosity": [0.0]},
"std_dev": {"pressure": [1.0], "velocity": [1.0, 1.0, 1.0], "turbulent_viscosity": [1.0]}
}This mean/std_dev layout is what load_global_stats() expects
(mean-std models). If your model was trained with min-max
normalization, this helper does not apply — persist min/max per
field in your own JSON and apply the inverse manually in
decode_outputs (see Normalization above).
register_model("my_model", MyModelWrapper)
# Load a case from any registered dataset adapter
from physicsnemo.cfd.evaluation.datasets.adapters.drivaerml import DrivAerMLAdapter
adapter = DrivAerMLAdapter(root="/path/to/data", inference_domain="surface")
case = adapter.load_case(adapter.list_cases()[0])
# Run the full inference pipeline
wrapper = MyModelWrapper()
wrapper.load(checkpoint_path="checkpoint.pt", stats_path="global_stats.json", device="cuda:0")
model_input = wrapper.prepare_inputs(case)
raw_output = wrapper.predict(model_input)
predictions = wrapper.decode_outputs(raw_output, case, model_input)
assert "pressure" in predictions
assert predictions["pressure"].shape[0] > 0from physicsnemo.cfd.evaluation.config import Config
from physicsnemo.cfd.evaluation.benchmarks.engine import run_benchmark
config = Config.from_dict({
"run": {"device": "cuda:0", "output_dir": "results", "metrics_cache": {"enabled": False}},
"benchmark": {
"mode": "matrix",
"models": [{
"name": "my_model",
"inference_domain": "surface",
"checkpoint": "/path/to/checkpoint.pt",
"stats_path": "/path/to/global_stats.json",
"kwargs": {},
}],
"datasets": [{
"name": "drivaerml",
"root": "/path/to/drivaerml/data",
"case_ids": ["run_1", "run_11"],
"kwargs": {"align_ground_truth_to_model": True, "inference_domain": "surface"},
}],
"reproducibility": {"log_env": False, "save_artifacts": True},
},
"output": {"mesh_field_names": {"pressure": "pMeanTrimPred", "shear_stress": "wallShearStressMeanTrimPred"}},
"metrics": ["l2_pressure", "l2_shear_stress", "l2_pressure_area_weighted", "drag", "lift"],
"reports": {"enabled": False},
})
results = run_benchmark(config)Results are written to benchmark_results.json (a JSON list of dicts,
one per model×dataset combo).
from physicsnemo.cfd.postprocessing_tools.visualization.utils import plot_fields, plot_field_comparisons
# Just the predicted fields (no GT comparison):
plotter = plot_fields(mesh, fields=["pMeanTrimPred"], view="xy", dtype="cell", window_size=[1800, 600])
plotter.screenshot("predicted_pressure.png")
plotter.close()
# Side-by-side with GT (GT | Pred | Error):
plotter = plot_field_comparisons(mesh, true_fields=["pMeanTrim"], pred_fields=["pMeanTrimPred"],
view="xy", dtype="cell", window_size=[1800, 600])
plotter.screenshot("comparison.png")
plotter.close()Save the wrapper to
physicsnemo/cfd/evaluation/models/wrappers/my_model.py and register in
wrappers/__init__.py:
from physicsnemo.cfd.evaluation.models.wrappers.my_model import MyModelWrapper
register_model("my_model", MyModelWrapper)Then use model.name: my_model in any YAML config.
If the model produces uncertainty, not just a point estimate, it
opts into the UQ path additively. Copy ExampleClosedFormUQWrapper or
ExampleSamplingUQWrapper from references/example_wrapper.py, and see
the shipped workflows/benchmarking/conf/config_uq_surface.yaml for a
complete four-row example config.
CFDModel)SUPPORTS_UQ: ClassVar[bool] = True
UQ_METHOD: ClassVar[str] = "closed_form" # or "sampling"; default "none"There are exactly two archetypes, split by how the predictive distribution is produced:
UQ_METHOD="closed_form" — the model emits the distribution (or its
parameters) in one forward pass: GP head, mean–variance /
heteroscedastic net, evidential, SNGP/DUQ, quantile regression.
Implement decode_distribution(raw, case, model_input=None) -> dict[str, FieldDistribution]. The engine calls predict once, then
decode_distribution.UQ_METHOD="sampling" — UQ comes from multiple evaluations:
N stochastic passes of one model (MC-Dropout, weight samples) or one
pass each of K models (deep/snapshot ensemble). The engine drives
the passes and aggregates them (streaming Welford) — you do not
build the distribution. Just make predict produce a different draw
each call (keep dropout stochastic at inference; don't freeze the RNG —
the engine re-seeds per pass for reproducibility). Because predict is
stochastic here, also override predict_deterministic(model_input)
so run.uq.enabled=false gives a true point prediction (disable dropout
for one pass, or return a single member). Optionally implement
predict_ensemble(model_input, n) -> Iterable[RawOutput] | None to
yield the passes/members (prefer a lazy generator so only one output is
device-resident at a time). Honor n: yield n passes for a per-model
sampler, or min(n, member_count) members for a fixed-size ensemble
(it cannot fabricate more distinct members than it holds); return None
to fall back to N× predict.Deterministic wrappers keep SUPPORTS_UQ=False; UQ metrics simply report
NaN for them (a useful det-vs-UQ contrast in the same report).
FieldDistribution payloaddecode_distribution (closed-form) and the engine's aggregator (sampling)
both yield a FieldDistribution per field. Build it with
build_predictive_distribution(...) (the UQ analogue of
build_predictions_dict):
FieldDistribution(
mean, # (N,) or (N, C)
std=..., # total predictive std (epistemic + aleatoric)
epistemic_std=..., # model/knowledge uncertainty (optional)
aleatoric_std=..., # data/noise uncertainty (optional)
# samples / quantiles / quantile_levels -> non-Gaussian escape hatches (CRPS, intervals)
)mean and the std
channels before returning — metrics never touch normalization stats.
Means invert with x*std + mean; std/variance channels scale by std
only (the additive offset drops out).(mean_i, aleatoric_var_i) per pass and the engine combines them by
the law of total variance total = mean_i(σ_i²) + var_i(μ_i).decode_outputs is still requiredKeep returning the point estimate (the distribution mean) from
decode_outputs. The deterministic metrics (L2 / drag / lift) read it,
non-UQ runs use it, and — for sampling wrappers — the engine calls it
once per pass to get each pass's fields before aggregating.
Turn UQ on in the run config and add the pooled metrics you want:
run:
uq:
enabled: true
num_samples: 32 # passes for UQ_METHOD="sampling" (ignored by closed-form/ensemble)
metrics:
- nlpd
- calibration_zrms
- coverage_95
- sharpness_std
- uncertainty_error_spearman # + _epistemic variants
- sparsification_ause # + _epistemic
- { name: drag_uq, drag_direction: [1, 0, 0] }Export std companions to inspected .vtps via
output.std_mesh_field_names / epistemic_std_mesh_field_names (auto
-derived as *Std / *EpistemicStd if omitted). See
workflows/benchmarking/conf/config_uq_surface.yaml for a complete
four-row example (deterministic + closed-form GP + MC-Dropout + ensemble).
DistributedManager.initialize(). In notebooks without torchrun,
set env vars first: WORLD_SIZE=1, RANK=0, LOCAL_RANK=0,
MASTER_ADDR=localhost, MASTER_PORT=12355.weights_only=True: Use this flag with torch.load() for safe
deserialization (PyTorch 2.6+ default).model.INFERENCE_DOMAIN
matches the dataset adapter's inference_domain_from_kwargs().
Mismatches are skipped in matrix mode or raise in single mode.align_ground_truth_to_model: true in dataset
kwargs, the engine converts GT data to match OUTPUT_LOCATION (point
↔ cell). This is automatic — the wrapper just needs correct class
vars.benchmark_results.json is a plain
list[dict], not {"results": [...]}. Iterate directly:
for combo in report:.references/example_wrapper.py — complete CFDModel templates to copy
and adapt (bundled; available without the repo on disk): deterministic
surface + volume, plus ExampleClosedFormUQWrapper and
ExampleSamplingUQWrapper for the two UQ archetypes.assets/global_stats.example.json — sample mean/std stats layout for
surface and volume.© NVIDIA, Apache-2.0. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
SKILL.md and 6 other files (references, assets) in skills/physicsnemo-cfd-create-model-wrapper of NVIDIA/physicsnemo-cfd.
Open the folder on GitHubat commit 0612ec4
Physicsnemo Cfd Create Model Wrapper next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Physicsnemo Cfd Create Model Wrapper this skillNVIDIA/physicsnemo-cfd | 153 | — | ~5.1k | Automated safety check: Pass | Apache-2.0 | |
| AstropyzLanqing/codex-claude-academic-skills | 4.6k | 14 repos | ~2.9k | Automated safety check: Pass | BSD-3-Clause | |
| PymatgenzLanqing/codex-claude-academic-skills | 4.6k | 12 repos | ~5k | Automated safety check: Pass | MIT | |
| Cantera Ignition DelayK-Dense-AI/scientific-agent-skills | 48k | 1 repos | ~2.2k | Automated safety check: Pass | MIT | |
| Weathertrpc-group/trpc-agent-go | 1.8k | 8 repos | ~591 | Automated safety check: Pass | Apache-2.0 | |
| Pymol VisualizationChatMol/ChatMol | 372 | — | ~1.2k | Automated safety check: Pass | MIT |
zLanqing/codex-claude-academic-skills
Comprehensive Python library for astronomy and astrophysics.
zLanqing/codex-claude-academic-skills
Materials science toolkit. An agent skill from zLanqing/codex-claude-academic-skills.
K-Dense-AI/scientific-agent-skills
Runs Cantera constant-volume or constant-pressure ignition simulations and reports temperature-based ignition delay with mechanism provenance and checks.
trpc-group/trpc-agent-go
Get current weather and forecasts via wttr.in or Open-Meteo.
ChatMol/ChatMol
Generate publication-quality molecular visualization images using PyMOL.
NVIDIA-BioNeMo/bionemo-agent-toolkit
Run a complete protein binder design campaign with NVIDIA Proteina-Complexa: resolve a target structure and hotspots from a name/sequence/PDB, co-design binder sequence+structure with reward-guided…
NVIDIA/physicsnemo-cfd
Create a custom metric for the PhysicsNeMo CFD benchmarking workflow.
NVIDIA/physicsnemo-cfd
Create a new dataset adapter for the PhysicsNeMo CFD benchmarking workflow.
Works with
Categories
Create a new model wrapper for the PhysicsNeMo CFD benchmarking workflow. Physicsnemo Cfd Create Model Wrapper is an agent skill from NVIDIA/physicsnemo-cfd, published by the product's own GitHub organization. Create a new model wrapper for the PhysicsNeMo CFD benchmarking workflow.
Physicsnemo Cfd Create Model Wrapper fits situations like: the user wants to add a new CFD model; write a CFDModel wrapper; integrate a new neural network architecture; run a custom model through the benchmarking pipeline.
Run `npx skills add NVIDIA/physicsnemo-cfd --skill physicsnemo-cfd-create-model-wrapper -a claude-code`. Or copy the skill folder (skills/physicsnemo-cfd-create-model-wrapper in NVIDIA/physicsnemo-cfd) into .claude/skills/physicsnemo-cfd-create-model-wrapper in your project. Claude Code loads it when a task matches its description.
Run `npx skills add NVIDIA/physicsnemo-cfd --skill physicsnemo-cfd-create-model-wrapper -a codex`. Or copy the skill folder (skills/physicsnemo-cfd-create-model-wrapper in NVIDIA/physicsnemo-cfd) into .agents/skills/physicsnemo-cfd-create-model-wrapper in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add NVIDIA/physicsnemo-cfd --skill physicsnemo-cfd-create-model-wrapper -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/physicsnemo-cfd-create-model-wrapper, .gemini/skills/physicsnemo-cfd-create-model-wrapper, .github/skills/physicsnemo-cfd-create-model-wrapper and .opencode/skills/physicsnemo-cfd-create-model-wrapper in your project.
Going by SKILL.md and its folder, Physicsnemo Cfd Create Model Wrapper needs Python for the scripts in its folder and the command-line tools its instructions call (git). Our summary lists: Python 3.
SKILL.md contains no URLs. Its commands use git, which can reach the network depending on how they are called. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.
Physicsnemo Cfd Create Model Wrapper is published under the Apache-2.0 licence (declared in SKILL.md). It allows redistribution, so the full SKILL.md is shown on this page.
About 5.1k tokens (SKILL.md is roughly 20k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full. Its references folder adds about 5.9k tokens, read only when the agent opens those files.
Skills that share tags, products or a category with Physicsnemo Cfd Create Model Wrapper: Astropy (zLanqing/codex-claude-academic-skills, 4.6k stars), Pymatgen (zLanqing/codex-claude-academic-skills, 4.6k stars), Cantera Ignition Delay (K-Dense-AI/scientific-agent-skills, 48k stars) and Weather (trpc-group/trpc-agent-go, 1.8k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
NVIDIA (a GitHub organization, an official publisher) maintains it in NVIDIA/physicsnemo-cfd, which has 153 GitHub stars. The repository holds 3 skills in this directory. The repository was last updated on August 18, 2026.
Source: NVIDIA/physicsnemo-cfd on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.