Skip to content
Back to skills

Elmer Ice

ASecurity

**Package**: hydrocraft-elmerice-cryosphere **Version**: 1.0.0 **Target Model**: Elmer/Ice (Elmer FEM 26.1) **Domain**: Cryosphere — ice sheet and glacier dynamics **Tools**: 5 validated Python scripts **Diagnostics**: 18 triplets covering unit, mesh, solver, and physics traps **Validation**: ISMIP-HOM Experiment A benchmark ---

  • 200 stars
  • 0 votes
  • 0 copies
  • 2 views
  • Added September 11, 2026
testingpythongobashnodeawsdebugginggitapiperformancedocumentation

Works with

  • cli
  • api

Security analysis

A100/100

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 Elmer_Ice --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Elmer Ice?

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

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

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/` (5 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` (7 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` (25 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.py` | `KISSPATH_PYTHON_ENV/bin/python {KI}/tools/convert_forcing.py --help` |
| `tools/convert_geometry.py` | `KISSPATH_PYTHON_ENV/bin/python {KI}/tools/convert_geometry.py --help` |
| `tools/generate_sif.py` | `KISSPATH_PYTHON_ENV/bin/python {KI}/tools/generate_sif.py --help` |
| `tools/parse_vtu_output.py` | `KISSPATH_PYTHON_ENV/bin/python {KI}/tools/parse_vtu_output.py --help` |
| `tools/run_elmerice.py` | `KISSPATH_PYTHON_ENV/bin/python {KI}/tools/run_elmerice.py --help` |

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

# Elmer/Ice Knowledge Infrastructure

**Package**: hydrocraft-elmerice-cryosphere
**Version**: 1.0.0
**Target Model**: Elmer/Ice (Elmer FEM 26.1)
**Domain**: Cryosphere — ice sheet and glacier dynamics
**Tools**: 5 validated Python scripts
**Diagnostics**: 18 triplets covering unit, mesh, solver, and physics traps
**Validation**: ISMIP-HOM Experiment A 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 atmospheric forcing documentation.
See `data_ki/SNOTEL/SKILL.md` for snow observations.
See `data_ki/BedMachine/SKILL.md` for ice topography.
See `data_ki/MEaSUREs/SKILL.md` for ice velocity.


## 1. Overview

Elmer/Ice is a glaciological extension of the Elmer FEM (Finite Element Method) open-source
multiphysics suite developed by CSC – IT Center for Science (Finland). It solves ice sheet
and glacier dynamics equations on unstructured finite-element meshes, supporting:

- **Full-Stokes** ice flow (nonlinear viscous fluid with Glen's flow law)
- **Shallow Shelf Approximation (SSA)** for fast-flowing ice streams
- **Shallow Ice Approximation (SIA)** for interior ice sheets
- **Anisotropic ice flow (AIFlow/GOLF)** with fabric tensor evolution
- **Enthalpy/temperature** solvers for polythermal ice thermodynamics
- **GlaDS subglacial hydrology** (coupled sheet-channel drainage)
- **Calving** (2D/3D crevasse-depth and level-set methods)
- **Adjoint-based inverse methods** for parameter estimation (friction, viscosity)
- **Ice thickness evolution** with surface/basal mass balance forcing

Key differences from simpler ice models (PISM, Yelmo, SICOPOLIS):
- Unstructured FEM meshes allow variable resolution and complex geometries
- Full-Stokes capability (no approximation in stress balance)
- Modular solver architecture — any solver can be replaced or extended
- Adjoint methods for rigorous data assimilation
- Requires more setup (SIF files, mesh generation) than structured-grid models

---

## 2. Installation

### 2.1 Build from Source (Linux/Ubuntu)

```bash
# Install dependencies
sudo apt install git cmake build-essential gfortran libopenmpi-dev \
  libblas-dev liblapack-dev libmumps-dev libparmetis-dev \
  libnetcdf-dev libnetcdff-dev

# Clone and build
git clone https://github.com/ElmerCSC/elmerfem.git
cd elmerfem && mkdir build && cd build

cmake -DWITH_MPI:BOOL=TRUE \
      -DWITH_OpenMP:BOOL=TRUE \
      -DWITH_ElmerIce:BOOL=TRUE \
      -DWITH_Mumps:BOOL=TRUE \
      -DWITH_UMFPACK:BOOL=TRUE \
      -DCMAKE_INSTALL_PREFIX=/opt/elmer \
      ..

make -j$(nproc)
sudo make install
export PATH=/opt/elmer/bin:$PATH
```

### 2.2 Key Binaries

| Binary | Purpose |
|--------|---------|
| `ElmerSolver` | Main FEM solver — reads SIF, runs simulation |
| `ElmerGrid` | Mesh generation and format conversion |
| `ElmerGUI` | Graphical interface (optional) |

### 2.3 Quick Test

```bash
cd elmerice/examples/Test_SSA
ElmerGrid 1 2 rectangle
ElmerSolver ismip_SSA_1D.sif
# Output: test_SSA_1D.vtu (open in ParaView)
```

---

## 3. Simulation Pipeline

```
s0_config ──> s1_geometry ──> s2_mesh ──> s3_forcing ──> s4_sif ──> s5_execute
                                 │                          │
                                 └──> s6_partition ─────────┘
                                        (parallel only)

s5_execute ──> s7_postprocess ──> s8_validation
```

| Stage | Name | Tools | Description |
|-------|------|-------|-------------|
| s0 | Configuration | — | Define domain, time period, physics modules |
| s1 | Geometry | `convert_geometry.py` | Prepare bedrock/surface DEMs, ice thickness |
| s2 | Mesh Generation | ElmerGrid / Gmsh | Create FEM mesh from geometry |
| s3 | Forcing | `convert_forcing.py` | Prepare SMB, temperature, sliding boundary data |
| s4 | SIF Generation | `generate_sif.py` | Build Simulation Input File with all parameters |
| s5 | Execution | `run_elmerice.py` | Run ElmerSolver (serial or MPI parallel) |
| s6 | Partitioning | ElmerGrid | Partition mesh for parallel runs |
| s7 | Post-processing | `parse_vtu_output.py` | Extract variables from VTU to CSV |
| s8 | Validation | — | Compare to observations or benchmarks |

---

## 4. Tools Reference

| Tool | Lines | Stage | Purpose |
|------|-------|-------|---------|
| `convert_geometry.py` | ~250 | s1 | Convert DEMs/ice thickness to Elmer mesh node data |
| `convert_forcing.py` | ~280 | s3 | Convert climate forcing to Elmer boundary conditions |
| `generate_sif.py` | ~350 | s4 | Generate SIF file from parameters + morphometry |
| `run_elmerice.py` | ~200 | s5 | Execute ElmerSolver with preflight checks |
| `parse_vtu_output.py` | ~220 | s7 | Parse VTU XML output to CSV time series |

---

## 5. Input Formats

### 5.1 Simulation Input File (SIF)

The SIF is a plain-text configuration file with hierarchical blocks:

```
Header
  Mesh DB "." "mesh_directory"
End

Simulation
  Coordinate System = Cartesian 2D | Cartesian 3D
  Simulation Type = Steady State | Transient
  Timestepping Method = "bdf"
  BDF Order = 1
  Timestep Intervals = 100
  Timestep Sizes = 1.0          ! years (for glaciology)
  Post File = "results.vtu"
  Output Intervals = 10
End

Constants
  Gas Constant = Real 8.314      ! J/(mol K)
  Sea Level = Real 0.0           ! m
  Water Density = Real 1025.0    ! kg/m3 (ocean)
End

Body 1
  Equation = 1
  Material = 1
  Body Force = 1
  Initial Condition = 1
End

Material 1
  Viscosity Exponent = Real $(1.0/3.0)    ! Glen's n=3
  Critical Shear Rate = Real 1.0e-10       ! s^-1
  Density = Real 910.0                      ! kg/m3
  ! SSA friction
  SSA Friction Law = String "weertman"
  SSA Friction Parameter = Real 1.0e-3
  SSA Friction Exponent = Real $(1.0/3.0)
End

Solver 1
  Equation = "SSA"
  Procedure = "ElmerIceSolvers" "SSABasalSolver"
  Variable = -dofs 1 "SSAVelocity"
  Linear System Solver = Direct
  Linear System Direct Method = umfpack
End
```

### 5.2 Mesh Files

ElmerGrid native format (directory with 4 files):
- `mesh.header` — element types and counts
- `mesh.nodes` — node coordinates (ID x y z)
- `mesh.elements` — element connectivity
- `mesh.boundary` — boundary element definitions

### 5.3 Grid Definition File (.grd)

Structured grid specification for ElmerGrid:
```
#####  rectangle  #####
Coordinate System = Cartesian 2D
Subcell Divisions in 2D = 1 1
Subcell Sizes 1 = 1.0
Subcell Sizes 2 = 1.0
Element Divisions 1 = 100
Element Divisions 2 = 1
Boundary Conditions
  Target Boundaries(4) = 1 2 3 4
End
```

---

## 6. Output Description and Formats

**Source**: `dag.yaml`. The dag is the model's output identity; if this
section and `dag.yaml` disagree, `dag.yaml` wins.

### 6.1 Dag output description

**Headline output** (`validation_rank: 1` in `dag.yaml`):

> `SSAVelocity` — Depth-averaged horizontal ice velocity (raw VTU stores m/s) (`m/a`)

Other dag outputs are `H`, `DHDT`, `Zs`, `GroundedMask`, `Temperature`, and
`Effective Pressure`.

| Output variable (dag `var`) | Rank | Unit | Output description |
|-----------------------------|------|------|--------------------|
| `SSAVelocity` | 1 | `m/a` | Depth-averaged horizontal ice velocity (raw VTU stores m/s) |
| `H` | — | — | Listed in `dag.yaml` as an output |
| `DHDT` | — | — | Listed in `dag.yaml` as an output |
| `Zs` | — | — | Listed in `dag.yaml` as an output |
| `GroundedMask` | — | — | Listed in `dag.yaml` as an output |
| `Temperature` | — | — | Listed in `dag.yaml` as an output |
| `Effective Pressure` | — | — | Listed in `dag.yaml` as an output |

### 6.2 VTU (VTK Unstructured Grid)

Primary output format — XML-based, readable by ParaView and VTK tools.

Key output variables and their units:

| Variable | DOFs | Unit | Description |
|----------|------|------|-------------|
| SSAVelocity | 1-2 | m/a | Depth-averaged horizontal ice velocity (raw VTU stores m/s) |
| Velocity | 3-4 | m/a | 3D velocity field (u,v,w) |
| Pressure | 1 | Pa | Ice pressure |
| Temperature | 1 | deg C | Ice temperature (relative to PMP) |
| H | 1 | m | Ice thickness |
| Zs | 1 | m | Surface elevation |
| Zb | 1 | m | Bed elevation |
| Depth | 1 | m | Depth below surface |
| GroundedMask | 1 | — | -1=floating, 0=GL, 1=grounded |
| Stress | 6 | MPa | Deviatoric stress tensor components |
| StrainRate | 6 | a^-1 | Strain rate tensor components |
| Enthalpy_h | 1 | J/kg | Ice enthalpy |
| Water Content | 1 | % | Temperate ice water fraction |
| Hydraulic Potential | 1 | m | Subglacial water potential (GlaDS) |
| Effective Pressure | 1 | Pa | Ice overburden minus water pressure |

### 6.3 Result Files

Native Elmer format for restart and advanced analysis.

### 6.4 NetCDF

Optional (requires `-DWITH_NETCDF=TRUE`), used for large-scale ice sheet runs.

---

## 7. Critical Domain Knowledge — Unit Traps

These are non-obvious issues that cause **silent failures** (the model runs but gives
wrong results). Each is cross-referenced to a diagnostic triplet.

| ID | Trap | Effect | Remedy |
|----|------|--------|--------|
| dt_001 | Velocity units: Elmer uses m/s internally but glaciology papers report m/a | Velocity 3.17e7x too large if m/a used as m/s | Always convert: 1 m/a = 3.1688e-8 m/s |
| dt_002 | Glen's flow law exponent: SIF needs `Viscosity Exponent = 1/n` not `n` | Viscosity 27x wrong if n=3 entered directly | Use `Real $(1.0/3.0)` for n=3 |
| dt_003 | Density units: must be kg/m3 (910 for ice, 1025 for seawater) | Flotation criterion fails if g/cm3 used | Never use g/cm3 — always kg/m3 |
| dt_004 | Temperature: Elmer uses Kelvin internally for Arrhenius, but SIF accepts Celsius with offset | Activation energy computation wrong | Use `Reference Temperature` consistently |
| dt_005 | Pressure Melting Point: Clausius-Clapeyron slope is 9.8e-8 K/Pa (NOT 7.42e-8) | Wrong temperate ice extent | Use `beta_clapeyron = 9.8e-8` |
| dt_006 | Friction parameter beta: dimensions depend on friction law choice | Orders of magnitude error in basal drag | Match beta units to friction law exponent |
| dt_007 | Coordinate system: 2D means x-z vertical plane, 3D means x-y-z | Solver crashes or wrong physics | Use `Cartesian 2D` for flowline, `3D` for plan-view+depth |
| dt_008 | Mesh node coordinates must be in meters, not km | Gravity term 1000x wrong | Convert all DEM data to meters |
| dt_009 | Time step units in SIF are seconds unless explicitly set | Transient simulation 3.17e7x too slow if years assumed | Set `Timestep Sizes = 31556926.0` for 1 year in seconds |

---

## 8. Unit Table / Unit Conversion Table

This table documents the unit conversions explicitly stated by this KI. Verify
source data attributes before adding any dataset-specific conversion rows.

| Variable | Source unit (verified) | Model/KI unit | Factor | Type | Source |
|----------|------------------------|---------------|--------|------|--------|
| `SSAVelocity` input or observation velocity | `m/a` | `m/s` internal Elmer velocity | `x3.1688e-8` | multiplicative | `dt_001` |
| `SSAVelocity` raw VTU output | `m/s` | `m/a` dag output | `x31556926.0` | multiplicative | `dag.yaml`, `dt_009` |
| Mesh node coordinates | `km` if supplied by source | `m` | `x1000` | multiplicative | `dt_008` |
| Time step size | years if supplied by workflow intent | seconds in SIF unless explicitly set | `x31556926.0` | multiplicative | `dt_009` |

Output unit verification checklist:
- Read raw VTU arrays before metric calculation; `SSAVelocity` is reported by
  the dag as `m/a`, while raw VTU storage is `m/s`.
- Confirm mesh coordinates are meters before running `ElmerSolver`.
- Confirm transient SIF timesteps are seconds unless the SIF explicitly encodes
  another time convention.

---

## 8a. Solver Configuration Reference

### 8.1 SSA Solver (Shallow Shelf Approximation)

**Procedure**: `"ElmerIceSolvers" "SSABasalSolver"` (2D reduced model)
**Variables**: `SSAVelocity` (DOFs=1 for flowline, DOFs=2 for plan-view)

**Friction Laws**:
| Law | Parameters | Formula |
|-----|-----------|---------|
| linear | beta | tau_b = beta * u |
| weertman | beta, m | tau_b = beta * |u|^(m-1) * u |
| coulomb | C, As, q | tau_b per Gagliardini 2007 |
| regularised coulomb | C, lambda | smooth Coulomb variant |
| budd | beta, m, q | tau_b = beta * z_b^q * |u|^(m-1) * u |

### 8.2 Thickness Solver

**Procedure**: `"ElmerIceSolvers" "ThicknessSolver"`
**Equation**: dH/dt + div(uH) = M_s + M_b
**Body Force keywords**:
- `Top Surface Accumulation` — SMB at surface (m/a ice equivalent)
- `Bottom Surface Accumulation` — basal melt (m/a, positive = freeze-on)

### 8.3 Enthalpy Solver

**Procedure**: `"ElmerIceSolvers" "EnthalpySolver"`
**Material keywords**:
- `Enthalpy Density` = 910.0 (kg/m3)
- `Enthalpy Heat Diffusivity` = k/(rho*Cp) (m2/s)
- `Enthalpy Water Diffusivity` (m2/s)

**Constants**:
- `T_ref_enthalpy` = 200.0 (K, reference temperature)
- `L_heat` = 334000.0 (J/kg, latent heat of fusion)
- `P_triple` = 611.73 (Pa, triple point pressure)
- `P_surf` = 101325.0 (Pa, surface pressure)

### 8.4 GlaDS Hydrology

**Procedure**: `"ElmerIceSolvers" "GlaDSCoupledSolver"`
**Variables**: `Hydraulic Potential`, `Sheet Thickness`, `Channel Area`

**Material keywords**:
- `Sheet Conductivity` (m^(7/4) kg^(-1/2))
- `Sheet flow exponent alpha` (typically 5/4)
- `Sheet flow exponent beta` (typically 3/2)
- `Bedrock Bump Length` (m, ~2.0)
- `Bedrock Bump Height` (m, ~0.1)
- `Englacial Void Ratio` (typically 1.0e-4)

### 8.5 Linear System Settings

```
Linear System Solver = Iterative | Direct
Linear System Iterative Method = BiCGStab | GMRES | CG
Linear System Direct Method = umfpack | mumps
Linear System Max Iterations = 1500
Linear System Convergence Tolerance = 1.0e-12
Linear System Preconditioning = ILU0 | ILU1 | ILUT
```

### 8.6 Nonlinear System Settings

```
Nonlinear System Max Iterations = 50
Nonlinear System Convergence Tolerance = 1.0e-6
Nonlinear System Newton After Iterations = 5
Nonlinear System Newton After Tolerance = 1.0e-5
Nonlinear System Relaxation Factor = 1.0
```

---

## 9. Calibration Parameters

| Parameter | Typical Range | Sensitivity | Affects |
|-----------|--------------|-------------|---------|
| SSA Friction Parameter (beta) | 1e-5 to 1e-1 | Very High | Ice velocity |
| Glen's n (Viscosity Exponent) | 1/3 (n=3) | High | Flow rate |
| Rate Factor A | 1e-25 to 1e-16 Pa^-3 s^-1 | High | Viscosity |
| Surface Mass Balance | Site-specific | Very High | Ice thickness |
| Basal Melt Rate | 0 to 50 m/a | High | Grounding line |
| Geothermal Heat Flux | 40-120 mW/m2 | Medium | Temperature field |
| Bedrock Bump Height | 0.01-1.0 m | Medium | GlaDS drainage |
| Sheet Conductivity | 0.001-0.05 | High | Subglacial water |

---

## 10. Data Requirements

| Data | Source | Format | Key Variables |
|------|--------|--------|---------------|
| Bed topography | BedMachine v5 | NetCDF | bed elevation (m) |
| Ice thickness | BedMachine v5 | NetCDF | thickness (m) |
| Surface elevation | ArcticDEM / REMA | GeoTIFF | elevation (m) |
| Surface velocity | MEaSUREs / ITS_LIVE | NetCDF | vx, vy (m/a) |
| Surface mass balance | RACMO / MAR | NetCDF | SMB (kg/m2/a) |
| Geothermal heat flux | Shapiro & Ritzwoller | NetCDF | GHF (mW/m2) |
| Ocean thermal forcing | ISMIP6 | NetCDF | TF (deg C) |

---

## 11. Validated Results

**Source**: `docs/validation_convention.yaml`. The convention file is the
field bar for this KI; if this section and the convention disagree, the
convention wins.

### 11.1 Validation benchmark

| Property | Value |
|----------|-------|
| Benchmark | ISMIP-HOM Experiment A |
| Headline dag output | `SSAVelocity` |
| Headline output unit | `m/a` |
| Headline output description | Depth-averaged horizontal ice velocity (raw VTU stores m/s) |

### 11.2 Performance bars from the convention

For minimize metrics, lower values are better. For maximize metrics, higher
values are better. Null convention bands are written as `no cited threshold`.

| Output variable | Metric | Direction | Satisfactory band | Good band | Very good band |
|-----------------|--------|-----------|-------------------|-----------|----------------|
| `SSAVelocity` | `rmse` | minimize | `94.5` (`seroussi2019`, `mcarthur2023`) | `47.5` (`seroussi2019`, `mcarthur2023`) | `7.31` (`seroussi2019`, `mcarthur2023`) |
| `SSAVelocity` | `nse` | maximize | no cited threshold | no cited threshold | no cited threshold |
| `H` | `rmse` | minimize | `320.8` (`seroussi2019`) | `160.0` (`seroussi2019`) | `91.2` (`seroussi2019`) |

### 11.3 Results interpretation

Grade `SSAVelocity` first because it is the rank-1 dag output. An achieved
`SSAVelocity` RMSE must be compared against the cited `seroussi2019` and
`mcarthur2023` bands above; an achieved `SSAVelocity` NSE has no cited
threshold in the convention. An achieved `H` RMSE must be compared against the
cited `seroussi2019` bands above.

---

## 12. Quick Start — ISMIP-HOM Benchmark A

```bash
# Step 1: Navigate to example directory
cd elmerice/examples/Test_SSA

# Step 2: Generate the mesh
ElmerGrid 1 2 rectangle

# Step 3: Run SSA 1D benchmark
ElmerSolver ismip_SSA_1D.sif

# Step 4: View results
paraview test_SSA_1D.vtu

# Step 5: Run 3D case (if 3D mesh is built)
ElmerSolver ismip_SSA_3D.sif

# Step 6: Run parallel (4 cores)
ElmerGrid 1 2 rectangle -partdual -metis 4
mpirun -np 4 ElmerSolver ismip_SSA_1D.sif
```

---

## 13. Diagnostic Triplets Summary

| ID | Stage | Symptom | Root Cause |
|----|-------|---------|------------|
| dt_001 | s3_forcing | Velocity 10^7x too large | m/a vs m/s confusion |
| dt_002 | s4_sif | Viscosity 27x wrong | n vs 1/n exponent |
| dt_003 | s4_sif | Flotation wrong | g/cm3 vs kg/m3 density |
| dt_004 | s4_sif | Wrong temperature field | K vs C confusion |
| dt_005 | s4_sif | Wrong PMP extent | beta_clapeyron value |
| dt_006 | s4_sif | Basal drag orders wrong | beta units mismatch |
| dt_007 | s2_mesh | Solver crash | 2D vs 3D confusion |
| dt_008 | s1_geometry | Gravity term wrong | km vs m coordinates |
| dt_009 | s4_sif | Simulation 10^7x slow | time step year vs s |
| dt_010 | s2_mesh | Convergence failure | Mesh too coarse at GL |
| dt_011 | s5_execute | MPI crash | Mesh not partitioned |
| dt_012 | s4_sif | Zero velocity | Missing body force |
| dt_013 | s4_sif | NaN in solution | Critical shear rate=0 |
| dt_014 | s3_forcing | Wrong SMB sign | Ablation sign convention |
| dt_015 | s7_postprocess | Empty VTU | Output Intervals too large |
| dt_016 | s4_sif | Wrong ice extent | Missing thickness limiter |
| dt_017 | s5_execute | MUMPS out of memory | Direct solver on fine mesh |
| dt_018 | s4_sif | Wrong fabric evolution | Fabric DOFs ≠ 5 |

---

## 14. File Structure

```
ki/
├── SKILL.md                              # This file — master reference
├── tools/
│   ├── convert_geometry.py               # s1: DEM/thickness → node data
│   ├── convert_forcing.py                # s3: Climate data → BC format
│   ├── generate_sif.py                   # s4: Parameter dict → SIF file
│   ├── run_elmerice.py                   # s5: Execute ElmerSolver
│   └── parse_vtu_output.py              # s7: VTU XML → CSV
├── docs/
│   ├── s1_geometry_preparation.md        # Geometry & DEM processing
│   ├── s2_mesh_generation.md             # Mesh creation with ElmerGrid/Gmsh
│   ├── s3_forcing_preparation.md         # Climate/SMB boundary conditions
│   ├── s4_sif_configuration.md           # SIF file assembly
│   ├── s5_execution.md                   # Running ElmerSolver
│   ├── s7_postprocessing.md              # Output extraction
│   └── s8_validation.md                  # Benchmark comparison
└── diagnostics/
    └── triplets.yaml                     # 18 symptom→diagnosis→remedy entries
```

Files in this skill

  • SKILL.md24.1 KB
  • dag.yaml32.9 KB
  • diagnostics/triplets.yaml19.1 KB
  • docs/REFERENCES.md2.2 KB
  • docs/format_spec.yaml23.4 KB
  • docs/papers.json7.3 KB
  • docs/s1_geometry_preparation.md3 KB
  • docs/s2_mesh_generation.md3.8 KB
  • docs/s3_forcing_preparation.md3.8 KB
  • docs/s4_sif_configuration.md4.3 KB
  • docs/s5_execution.md3.4 KB
  • docs/s7_postprocessing.md3.1 KB
  • docs/s8_validation.md3.9 KB
  • docs/validation_convention.yaml14.5 KB
  • knowledge_infrastructure.yaml3.5 KB
  • preflight_check.py8 KB
  • tools/convert_forcing.py14.2 KB
  • tools/convert_geometry.py11.7 KB
  • tools/generate_sif.py15.4 KB
  • tools/parse_vtu_output.py11.5 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…