Skip to content
Back to skills

OpenGeoSys

ASecurity

**Package**: `hydrocraft-ogs-subsurface` v1.0.0 **Model**: OpenGeoSys 6.5.7 — Thermo-Hydro-Mechanical-Chemical simulator **Domain**: Groundwater / subsurface THMC processes in porous and fractured media **Created by**: Auto-dissection pipeline **Last updated**: 2026-03-25 **Stats**: 4 tools | 7 skill documents | 18 diagnostic triplets | ~1,200 lines of validated Python **Validation status**: `test_validated` (LiquidFlow gravity-driven benchmark) ---

  • 200 stars
  • 0 votes
  • 0 copies
  • 1 view
  • Added September 11, 2026
testingpythongoc++bashreactnodetestingdebuggingapidatabase

Works with

  • cli
  • api

Security analysis

A96/100
  • mediumInstalls packages at runtime which could introduce malicious dependencies

Pro scans all 20 files and shows the line behind each finding

Scanned September 11, 2026

npx -y skills add lzwei196/KISS---Knowledge-Infrastructure-for-Scientific-Simulation --skill OpenGeoSys --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of OpenGeoSys?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for OpenGeoSys
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/lzwei196-opengeosys/badge)](https://www.skillsdirectory.com/skills/lzwei196-opengeosys)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
> **MANDATORY EXECUTION POLICY** — READ BEFORE PROCEEDING
>
> You MUST run the **actual model binary or package** described in this document.
> If the model fails to import, compile, or execute, you MUST:
> 1. Check `diagnostics/triplets.yaml` for a matching error pattern
> 2. Try the fix suggested in the triplet's `remedy` section
> 3. If still failing, report the error to the user with full details
>
> You MUST NOT substitute a simplified Python formula, regression equation,
> or hand-coded approximation in place of the real model.
>
>
> Before starting, run: `python preflight_check.py` (in this KI directory)
> to verify that the model binary/package and required data are available.
>
> **DEBUGGING PROTOCOL** — When something goes wrong, follow this order:
> 1. **Check triplets** — `diagnostics/triplets.yaml` may already cover this error
> 2. **Read official docs** — The model's own documentation for expected formats/units
> 3. **Find working examples** — Check `outputs/` or the model's shipped test data
> 4. **Fix the tool** — With knowledge of what "correct" looks like
>
> Do NOT write custom debug scripts. The answers are in the docs and examples.

<!-- KI-MAP:BEGIN (projected by generate_skill_map.py — edit the KI, not this table) -->
## KI map — what to read, and when

| when you need | read | why |
|---|---|---|
| FIRST, always | `preflight_check.py` | run it (`python preflight_check.py`): proves env/binary/data are usable and emits a machine-readable `PREFLIGHT_REPORT=` line. Do not debug a run that never had a healthy environment. |
| to run the pipeline stages | `tools/` (4 tools) | the executable pipeline. Read each tool's argparse (`--help`) before composing a command; SKILL.md's stage table says which tool serves which stage. |
| before running a stage | `docs/s*_*.md` (8 stage docs) | per-stage procedure, verification and traps — the how-to that SKILL.md's overview compresses. |
| on ANY error, before debugging | `diagnostics/triplets.yaml` (18 entries) | symptom → diagnosis → remedy for this model's known failure modes. Check here FIRST; the answer usually exists. Never renumber or rewrite entries. |
| to know what an output IS | `dag.yaml` | the model's identity: every output's medium, units, `validation_rank` (1 = the headline variable) and observability. Scoring and obs-binding read THIS — when asked 'what does this model predict', the dag is the answer, not a guess. |
| when building inputs / parsing outputs | `docs/format_spec.yaml` | exact I/O shapes + `known_issues`, projected from dag + triplets. Regenerate with `ki_tools_common/generate_format_spec.py` after changing either — never hand-edit. |
| to judge a run's skill | `docs/validation_convention.yaml` | how this model's field judges it validated: per-`dag_variable` metrics, directions and CITED pass-bands. A run is graded against these, not against intuition. |
| for claims and thresholds | `docs/gathered_papers.json` (22 papers) + `docs/papers_index.md` | the literature this KI is judged by; each entry's `text_path` is fetched full text in the central paper cache. `role: benchmark` marks the model's own skill paper. |
| for a machine-readable summary | `knowledge_infrastructure.yaml` | the manifest (package, pipeline, validation tier, counts) — projected by `ki_tools_common/generate_ki_manifest.py`; regenerate after structural changes, never hand-edit. |

*Projected 2026-08-17 from the KI's actual contents — 9 components present. Refresh: `python3 ki_tools_common/generate_skill_map.py --ki_dir <this KI>`.*
<!-- KI-MAP:END -->

<!-- KI-TOOL-INDEX:BEGIN (projected by generate_skill_map.py — the discoverability contract: every public tool, exact path; PURPOSE stays human-authored elsewhere) -->
### Executable tool index (projected — complete by construction)

Every public tool in this KI, by exact path. What each is FOR lives in the
human-written Tool Inventory above; `--help` on any of these prints its arguments.

| tool (exact path) | invocation |
|---|---|
| `tools/convert_forcing_to_ogs.py` | `KISSPATH_PYTHON_ENV/bin/python {KI}/tools/convert_forcing_to_ogs.py --help` |
| `tools/convert_soil_to_ogs.py` | `KISSPATH_PYTHON_ENV/bin/python {KI}/tools/convert_soil_to_ogs.py --help` |
| `tools/parse_ogs_output.py` | `KISSPATH_PYTHON_ENV/bin/python {KI}/tools/parse_ogs_output.py --help` |
| `tools/run_ogs.py` | `KISSPATH_PYTHON_ENV/bin/python {KI}/tools/run_ogs.py --help` |

*4 public tools; `_`-prefixed helpers and packaging files excluded.*
<!-- KI-TOOL-INDEX:END -->

# OpenGeoSys 6 (OGS-6) — Knowledge Infrastructure

**Package**: `hydrocraft-ogs-subsurface` v1.0.0
**Model**: OpenGeoSys 6.5.7 — Thermo-Hydro-Mechanical-Chemical simulator
**Domain**: Groundwater / subsurface THMC processes in porous and fractured media
**Created by**: Auto-dissection pipeline
**Last updated**: 2026-03-25
**Stats**: 4 tools | 7 skill documents | 18 diagnostic triplets | ~1,200 lines of validated Python
**Validation status**: `test_validated` (LiquidFlow gravity-driven benchmark)

---

## Data Preparation

### Forcing data

**Data Sources**: Use `from ki_tools_common.load_forcing import load_daily_forcing` for CMFD/MSWX/NASA POWER.

**Data Validation Reference**: See `data_ki/CMFD/SKILL.md` for recharge forcing documentation.
See `data_ki/GLHYMPS/SKILL.md` for hydrogeology data.
See `data_ki/FanWTD/SKILL.md` for water table depth.
See `data_ki/GRACE/SKILL.md` for GRACE TWS validation data.


## Overview

This knowledge infrastructure enables simulation of subsurface processes using OpenGeoSys 6 (OGS-6), a C++ finite-element simulator for coupled thermo-hydro-mechanical-chemical (THMC) problems in porous and fractured media. The tools replace manual XML editing and VTK post-processing with a Python pipeline that automates project file generation, execution, and output extraction.

**What OGS does**: Multiphysics FEM simulator for subsurface engineering. Simulates:
- Groundwater flow (saturated: LiquidFlow, unsaturated: RichardsFlow)
- Heat transport (HeatConduction, HT advection-diffusion coupling)
- Geomechanics (SmallDeformation, LargeDeformation, HydroMechanics)
- Coupled THMC (ThermoRichardsFlow, ThermoRichardsMechanics, TH2M)
- Reactive transport (ComponentTransport, RichardsComponentTransport)
- Fracture mechanics (PhaseField, LIE lower-dimensional elements)
- Borehole heat exchangers (HeatTransportBHE)
- Wellbore simulation

**Key difference from other HydroCraft models**: OGS solves PDEs on unstructured FEM meshes (VTU format) rather than structured grids. Input is XML-based project files (`.prj`), not namelists or CSV. All units are strict SI (Pa, K, m, s, kg). No unit tolerance — wrong units produce silent garbage.

---

## Installation

### Building from source

```bash
cd KISSPATH_INTERNAL_NOT_SHIPPED/auto_dissect/_work/OpenGeoSys/source/repo
mkdir -p build && cd build
cmake .. -DOGS_BUILD_CLI=ON -DOGS_BUILD_TESTING=OFF -DOGS_BUILD_UTILS=OFF
make -j$(nproc)
# Binary: build/bin/ogs
```

### Dependencies

```
CMake >= 3.22, C++23 compiler (GCC >= 13, Clang >= 16)
Eigen3, VTK, Boost (header-only), tclap, spdlog, fmt
Optional: PETSc (parallel), MPI, pybind11 (Python bindings)
```

### Python bindings (alternative)

```bash
pip install ogs
# Usage: from ogs import OGSSimulator
```

### Python tool dependencies

```
numpy, pandas, lxml, meshio, matplotlib, pyvista (optional)
```

### Test example

```
Tests/Data/Parabolic/LiquidFlow/GravityDriven/
  gravity_driven.prj          # Project file (XML)
  mesh2D.vtu                  # VTK unstructured mesh
  gravity_driven.gml          # Geometry (boundary definitions)
```

---

## Pipeline (7 stages)

| # | Stage | Tool(s) | Description |
|---|-------|---------|-------------|
| 0 | Configuration | (manual) | Select process type, domain geometry, simulation period |
| 1 | Domain setup | (mesh tools) | Create/import VTU mesh, define geometry boundaries |
| 2 | Data preparation | `convert_forcing_to_ogs.py` | Convert external data to OGS boundary condition format |
| 3 | Forcing/input | `convert_forcing_to_ogs.py` | Time-dependent BCs: recharge, head, flux (unit conversions) |
| 4 | Parameters | `convert_soil_to_ogs.py` | Material properties: permeability, porosity, density, thermal |
| 5 | Execution | `run_ogs.py` | Generate .prj, run OGS binary, check convergence |
| 6 | Output parsing | `parse_ogs_output.py` | Extract VTU results to CSV time series |

### Parallelism

Stages 1, 2, 3, 4 can run in parallel after stage 0.
Stage 5 depends on 1-4.
Stage 6 depends on 5.

---

## Tools Reference

| Tool | Stage | Script Path | Lines | Purpose |
|------|-------|-------------|------:|---------|
| `convert_forcing_to_ogs` | s2/s3 | `tools/convert_forcing_to_ogs.py` | 280 | External forcing data → OGS boundary condition CSV/VTU |
| `convert_soil_to_ogs` | s4 | `tools/convert_soil_to_ogs.py` | 250 | HWSD/soil database → OGS material properties XML |
| `run_ogs` | s5 | `tools/run_ogs.py` | 320 | Generate .prj, execute OGS, validate output |
| `parse_ogs_output` | s6 | `tools/parse_ogs_output.py` | 290 | Parse VTU output → CSV time series + summary JSON |

**Total**: 4 tools, ~1,140 lines of validated Python code.

---

## 6. Output Description

**Source of truth**: `dag.yaml`. The dag defines the model's observable outputs; if this section and `dag.yaml` disagree, `dag.yaml` wins.

**Headline output** (dag `validation_rank: 1`):

> `temperature` — Subsurface (rock/soil porous-medium) temperature field at FEM nodes; primary variable of thermal/heat-transport processes. (K)

| Output variable (dag `var`) | Rank | Unit | Description |
|-----------------------------|------|------|-------------|
| `temperature` | 1 | K | Subsurface (rock/soil porous-medium) temperature field at FEM nodes; primary variable of thermal/heat-transport processes. |
| `pressure` | see `dag.yaml` | see `dag.yaml` | see `dag.yaml` |
| `displacement` | see `dag.yaml` | see `dag.yaml` | see `dag.yaml` |
| `darcy_velocity` | see `dag.yaml` | see `dag.yaml` | see `dag.yaml` |
| `stress` | see `dag.yaml` | see `dag.yaml` | see `dag.yaml` |
| `saturation` | see `dag.yaml` | see `dag.yaml` | see `dag.yaml` |
| `concentration` | see `dag.yaml` | see `dag.yaml` | see `dag.yaml` |

The dag's other listed outputs are: `pressure`, `displacement`, `darcy_velocity`, `stress`, `saturation`, and `concentration`.

---

## Skill Knowledge

| Stage | Topic | Skill Document |
|-------|-------|----------------|
| s0 | Process selection, mesh requirements | `docs/s0_configuration.md` |
| s1 | Mesh formats, VTU structure, boundary submeshes | `docs/s1_domain_setup.md` |
| s2/s3 | Unit conversions (mm→m, °C→K, day→s) | `docs/s2_forcing_input.md` |
| s4 | Permeability, van Genuchten, porosity | `docs/s3_parameters.md` |
| s5 | Project file XML structure, solver config | `docs/s4_execution.md` |
| s6 | VTU parsing, PVD time series, XDMF | `docs/s5_output_parsing.md` |
| all | Coupled processes, staggered vs monolithic | `docs/s6_coupled_processes.md` |

---

## Critical Domain Knowledge

These non-obvious facts cause **silent failures** if violated. Each has a corresponding diagnostic triplet.

### 1. All units are strict SI — no exceptions (dt_001)

OGS uses **SI base units everywhere**: pressure in Pa (not kPa or bar), temperature in Kelvin (not Celsius), length in meters, time in seconds, permeability in m² (not Darcy). There is no unit conversion inside OGS. If you supply permeability in Darcy (1 D = 9.869e-13 m²) without converting, the flow will be wrong by orders of magnitude with no warning.

### 2. Temperature must be in Kelvin (dt_002)

OGS expects temperature in Kelvin. Supplying 20 (meaning 20°C) instead of 293.15 K causes density/viscosity calculations to produce nonsensical results. The Celsius-zero constant is 273.15 K (`PhysicalConstant::CelsiusZeroInKelvin`).

### 3. Permeability is intrinsic (m²), NOT hydraulic conductivity (m/s) (dt_003)

OGS uses intrinsic permeability κ [m²], not hydraulic conductivity K [m/s]. Conversion: `κ = K * μ / (ρ * g)`. For water at 20°C: `κ ≈ K * 1.02e-7`. Supplying K=1e-5 m/s as κ=1e-5 m² makes the medium 10 million times too permeable.

### 4. Time is in seconds in project files (dt_004)

All time values in `.prj` files are in seconds: `t_initial`, `t_end`, `delta_t`. One day = 86400 s, one year ≈ 3.1536e7 s. Setting `t_end=365` (meaning 365 days) actually runs for 365 seconds (6 minutes).

### 5. Mesh boundary conditions require submeshes (dt_005)

OGS-6 applies boundary conditions on **submeshes** (separate `.vtu` files for boundary faces), not on geometry-based selections like OGS-5. Each BC needs a matching submesh file that extracts boundary faces from the bulk mesh. Missing submeshes → crash.

### 6. Body force vector must match mesh dimension (dt_006)

`<specific_body_force>` must have exactly as many components as the mesh dimension. 2D mesh: `"0 -9.81"`, 3D mesh: `"0 0 -9.81"`. Wrong dimension count crashes the parser silently or misaligns gravity direction.

### 7. van Genuchten parameters are model-specific (dt_007)

OGS uses the van Genuchten-Mualem model with parameters: `p_b` (entry pressure, Pa), `S_L_res` (residual saturation), `S_L_max` (max saturation), `m` or `n` where `m = 1 - 1/n`. Literature often reports α [1/cm] which needs conversion: `p_b = ρ*g/α` (with α in 1/m). Off by 100x if α is not converted from 1/cm to 1/m.

### 8. Convergence criterion type matters (dt_008)

`DeltaX` checks solution increment norm, `Residual` checks residual norm. Using wrong type with wrong tolerance causes either non-convergence (too tight) or unconverged garbage (too loose). For pressure problems: `DeltaX` with `abstol=1e-6` is typical. For displacement: `abstol=1e-10` (meters).

### 9. Storage coefficient must be non-zero for transient flow (dt_009)

For transient LiquidFlow, the `storage` property (specific storage, 1/Pa) must be > 0. If set to 0 (steady-state assumption), the mass matrix M=0 and the transient solver degenerates, producing constant pressure at all timesteps.

---

## Input File Format (.prj)

OGS uses XML project files with this top-level structure:

```xml
<OpenGeoSysProject>
  <meshes>                    <!-- VTU mesh files -->
    <mesh>domain.vtu</mesh>
    <mesh>boundary_left.vtu</mesh>
  </meshes>
  <processes>                 <!-- Physics: LIQUID_FLOW, RICHARDS_FLOW, etc. -->
    <process>
      <type>LIQUID_FLOW</type>
      <process_variables><process_variable>pressure</process_variable></process_variables>
      <specific_body_force>0 -9.81</specific_body_force>
    </process>
  </processes>
  <media>                     <!-- Material properties (SI units) -->
    <medium id="0">
      <phases><phase><type>AqueousLiquid</type>...</phase></phases>
      <properties>
        <property><name>permeability</name><value>1e-12</value></property>
        <property><name>porosity</name><value>0.3</value></property>
        <property><name>storage</name><value>1e-9</value></property>
      </properties>
    </medium>
  </media>
  <time_loop>                 <!-- Timestepping and output -->
    <processes><process ref="...">
      <time_stepping><type>FixedTimeStepping</type>
        <t_initial>0</t_initial><t_end>86400</t_end>
      </time_stepping>
    </process></processes>
    <output><type>VTK</type><prefix>result</prefix></output>
  </time_loop>
  <parameters>                <!-- Named constants/functions -->
  <process_variables>         <!-- ICs, BCs, source terms -->
  <nonlinear_solvers>         <!-- Picard or Newton -->
  <linear_solvers>            <!-- Eigen/PETSc solver config -->
</OpenGeoSysProject>
```

---

## Key Variables and Units (ALL SI)

| Variable | Symbol | Unit | Typical Range |
|----------|--------|------|---------------|
| Pressure (hydraulic head) | p | Pa | 0 – 1e7 |
| Temperature | T | K | 273 – 373 |
| Displacement | u | m | 0 – 0.1 |
| Permeability (intrinsic) | κ | m² | 1e-18 – 1e-8 |
| Porosity | φ | – | 0.01 – 0.6 |
| Density (liquid) | ρ_L | kg/m³ | 998 – 1050 |
| Viscosity (dynamic) | μ | Pa·s | 1e-4 – 1e-2 |
| Storage coefficient | S_s | 1/Pa | 1e-12 – 1e-6 |
| Thermal conductivity | λ | W/(m·K) | 0.1 – 5.0 |
| Specific heat capacity | c_p | J/(kg·K) | 800 – 4200 |
| Darcy velocity | v | m/s | 1e-12 – 1e-3 |
| Stress | σ | Pa | 0 – 1e8 |
| Strain | ε | – | 0 – 0.01 |
| Liquid saturation | S_L | – | 0 – 1 |
| Capillary pressure | p_c | Pa | 0 – 1e6 |
| Concentration | c | mol/m³ | 0 – 1e3 |

---

## 8. Unit Conversion Table

Exact I/O shapes live in `docs/format_spec.yaml`. This table collects the unit conversions already used by this KI's tools and warnings; OGS itself expects strict SI units and does not apply forgiving unit normalization.

| Variable | Source unit | OGS unit | Conversion | Trap severity |
|----------|-------------|----------|------------|---------------|
| Temperature | °C | K | T + 273.15 | silent |
| Pressure from hydraulic head | m | Pa | h × ρ × g | silent |
| Recharge / precipitation flux | mm/day | m/s | P / (1000 × 86400) | silent |
| Permeability from hydraulic conductivity | m/s | m² | κ = K × μ / (ρ × g) | silent |
| Permeability from Darcy | Darcy | m² | κ × 9.869e-13 | silent |
| Time duration | days | s | × 86400 | silent |
| Time duration | years | s | × 3.1536e7 | silent |
| van Genuchten alpha | 1/cm | 1/Pa entry-pressure form | p_b = ρ·g/(α×100) | silent |
| Transmissivity | m²/s | m² | T / aquifer_thickness × μ/(ρg) | silent |

---

## Unit Trap Table

| External Source | Variable | Source Unit | OGS Unit | Conversion | Trap Severity |
|----------------|----------|------------|----------|------------|---------------|
| HWSD soil data | Permeability | cm/hr (Ksat) | m² | K_sat[m/s] × 1.02e-7 | **silent** |
| Weather station | Temperature | °C | K | T + 273.15 | **silent** |
| Weather station | Precipitation | mm/day | m/s | P / (1000 × 86400) | **silent** |
| MODFLOW | Hydraulic head | m (head) | Pa | h × ρ × g | **silent** |
| Literature | Permeability | Darcy | m² | κ × 9.869e-13 | **silent** |
| Literature | vG alpha | 1/cm | 1/Pa | p_b = ρ·g/(α×100) | **silent** |
| Well test | Transmissivity | m²/s | m² | T / aquifer_thickness × μ/(ρg) | **silent** |
| Time specs | Duration | days/years | seconds | × 86400 or × 3.1536e7 | **silent** |

---

## Supported Process Types

| Process Type Enum | Description | Primary Variables |
|-------------------|-------------|-------------------|
| `LIQUID_FLOW` | Saturated groundwater flow | pressure |
| `RICHARDS_FLOW` | Unsaturated flow | pressure |
| `STEADY_STATE_DIFFUSION` | Steady diffusion (Laplace) | pressure/concentration |
| `HEAT_CONDUCTION` | Pure heat conduction | temperature |
| `HT` | Heat transport (advection-diffusion) | temperature, pressure |
| `HYDRO_MECHANICS` | Coupled flow + deformation | pressure, displacement |
| `THERMO_MECHANICS` | Coupled heat + deformation | temperature, displacement |
| `SMALL_DEFORMATION` | Linear elasticity | displacement |
| `LARGE_DEFORMATION` | Nonlinear elasticity | displacement |
| `RICHARDS_MECHANICS` | Unsaturated flow + deformation | pressure, displacement |
| `THERMO_RICHARDS_FLOW` | Heat + unsaturated flow | temperature, pressure |
| `THERMO_RICHARDS_MECHANICS` | Heat + unsaturated + deformation | T, p, u |
| `TH2M` | Full two-phase THM | gas_p, cap_p, T, u |
| `COMPONENT_TRANSPORT` | Reactive transport | concentration(s), pressure |
| `HEAT_TRANSPORT_BHE` | Borehole heat exchangers | temperature |

---

## Output Format

OGS writes results as VTK Unstructured Grid files:

```
result_ts_0_t_0.000000.vtu          # Initial condition
result_ts_1_t_86400.000000.vtu      # After 1 day (86400 s)
result_ts_2_t_172800.000000.vtu     # After 2 days
result.pvd                          # PVD collection file (time series index)
```

**VTU files contain**: node-based fields (pressure, displacement, temperature) and cell-based fields (velocity, stress, strain). Parse with `meshio`, `pyvista`, or `vtk` Python libraries.

**PVD file**: XML index linking timesteps to VTU files. Use to reconstruct time series.

**Alternative**: XDMF/HDF5 format for large parallel runs (`<type>XDMF_HDF5</type>`).

---

## 11. Validated Results

**Source of truth**: `docs/validation_convention.yaml`. Convention bands below restate the KI's extracted convention facts. Null convention bands are written as `no cited threshold`; no replacement threshold is inferred.

### Headline validation variable

The headline validation variable is `temperature`, matching the dag's rank-1 output:

> `temperature` — Subsurface (rock/soil porous-medium) temperature field at FEM nodes; primary variable of thermal/heat-transport processes. (K)

### Performance metrics and convention bars

| Dag variable | Metric | Direction | Satisfactory band | Convention cites |
|--------------|--------|-----------|-------------------|------------------|
| `pressure` | nse | maximize | no cited threshold | [] |
| `pressure` | pbias | zero_centered | no cited threshold | [] |
| `temperature` | nse | maximize | no cited threshold | [] |
| `temperature` | nmae | minimize | 15 | heldt2023 |

This SKILL body does not add achieved calibration or validation values beyond the KI's extracted convention facts. A run should be judged by the metric directions and cited bands in `docs/validation_convention.yaml`, with `dag.yaml` defining which output is the headline variable.

### Validation status

| Item | Value |
|------|-------|
| Validation status | `test_validated` |
| Current validated benchmark named in this SKILL | LiquidFlow gravity-driven benchmark |
| Headline output | `temperature` |
| Headline output unit | K |

---

## CLI Usage

```bash
ogs project.prj [options]

Options:
  -o, --output-directory DIR    Output directory for results
  -m, --mesh-input-directory DIR   Directory containing mesh files
  -p, --xml-patch FILE          Apply XML patch to project file (repeatable)
  --write-prj                   Write processed project file to output
  --enable-fpe                  Enable floating-point exceptions
  --unbuffered-std-out          Unbuffered stdout for real-time logging
```

---

## Quick Start

```bash
# 1. Convert soil parameters to OGS format
python tools/convert_soil_to_ogs.py \
  --sand 60 --clay 15 --silt 25 --organic 2.0 --bulk_density 1500 \
  --output soil_params.json

# 2. Convert forcing data (recharge) to OGS format
python tools/convert_forcing_to_ogs.py \
  --source recharge_mm_day.csv --source_format csv \
  --variable recharge --source_unit mm/day --target_unit m/s \
  --start_date 2000-01-01 --end_date 2010-12-31 \
  --output recharge_ogs.csv

# 3. Run OGS simulation
python tools/run_ogs.py \
  --prj_template project_template.prj \
  --mesh domain.vtu --output_dir results/ \
  --ogs_binary /path/to/ogs

# 4. Parse output to CSV
python tools/parse_ogs_output.py \
  --pvd_file results/result.pvd \
  --variables pressure,v \
  --point "50.0,0.0" \
  --output results/timeseries.csv
```

---

## Diagnostic Triplets

18 triplets covering 5 failure domains. See `diagnostics/triplets.yaml` for full details.

| ID | Severity | Domain | Summary |
|----|----------|--------|---------|
| dt_001 | **silent** | unit_conversion | Pressure in kPa instead of Pa |
| dt_002 | **silent** | unit_conversion | Temperature in °C instead of K |
| dt_003 | **silent** | unit_conversion | Permeability in Darcy instead of m² |
| dt_004 | **silent** | unit_conversion | Time in days instead of seconds |
| dt_005 | fatal | mesh_format | Missing boundary submesh for BCs |
| dt_006 | fatal | parameter_format | Body force dimension mismatch |
| dt_007 | **silent** | unit_conversion | van Genuchten α in 1/cm not converted |
| dt_008 | degraded | solver_config | Wrong convergence criterion type/tolerance |
| dt_009 | **silent** | parameter_format | Storage=0 in transient simulation |
| dt_010 | fatal | path_resolution | Mesh file not found (relative path) |
| dt_011 | **silent** | silent_error | Hydraulic conductivity used as permeability |
| dt_012 | degraded | solver_config | Newton diverges — need Picard first |
| dt_013 | **silent** | silent_error | Recharge in mm/day not converted to m/s |
| dt_014 | fatal | parameter_format | XML tag misspelling (case-sensitive) |
| dt_015 | **silent** | unit_conversion | Precipitation mm/day → m/s missing /86400 |
| dt_016 | degraded | mesh_format | Mesh element order mismatch with FE order |
| dt_017 | **silent** | silent_error | Porosity=0 kills transient storage |
| dt_018 | fatal | runtime | NaN from zero viscosity or density |

**Silent error count**: 10/18 (56%) — dominated by unit conversion traps due to strict SI requirement.

---

## File Structure

```
ki/
  SKILL.md                          # This file (agent entry point)
  knowledge_infrastructure.yaml     # Auto-generated schema
  tools/
    convert_forcing_to_ogs.py       # External data → OGS boundary conditions
    convert_soil_to_ogs.py          # HWSD/soil → OGS material properties
    run_ogs.py                      # OGS execution wrapper
    parse_ogs_output.py             # VTU/PVD → CSV time series
  docs/
    s0_configuration.md             # Process selection, mesh requirements
    s1_domain_setup.md              # Mesh formats, boundary submeshes
    s2_forcing_input.md             # Unit conversions, BC types
    s3_parameters.md                # Material properties, constitutive models
    s4_execution.md                 # Project file structure, solver config
    s5_output_parsing.md            # VTU format, time series extraction
    s6_coupled_processes.md         # Multi-physics coupling strategies
  diagnostics/
    triplets.yaml                   # 18 diagnostic triplets
```

Files in this skill

  • SKILL.md25.3 KB
  • dag.yaml32.1 KB
  • diagnostics/triplets.yaml21.6 KB
  • docs/REFERENCES.md2.2 KB
  • docs/format_spec.yaml25.4 KB
  • docs/papers.json7 KB
  • docs/s0_configuration.md3.7 KB
  • docs/s1_domain_setup.md3.5 KB
  • docs/s2_forcing_input.md4.5 KB
  • docs/s3_parameters.md6.1 KB
  • docs/s4_execution.md5.2 KB
  • docs/s5_output_parsing.md4.5 KB
  • docs/s6_coupled_processes.md5.4 KB
  • docs/s7_diagnostics_guide.md4.6 KB
  • docs/validation_convention.yaml15.4 KB
  • knowledge_infrastructure.yaml2.9 KB
  • preflight_check.py7.5 KB
  • tools/convert_forcing_to_ogs.py10.6 KB
  • tools/convert_soil_to_ogs.py14.2 KB
  • tools/parse_ogs_output.py13.2 KB

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…