Install
$ agentstack add skill-steadfastasart-geoscience-skills-loopstructural ✓ scanned · ✓ verified — works with Claude Code, Cursor, and more.
Security review
✓ PassedNo issues found. Passed automated security review. · v0.1.0 How review works →
- ✓ Prompt-injection patterns
- ✓ Secret / credential exfiltration
- ✓ Dangerous shell & filesystem operations
- ✓ Untrusted network calls
- ✓ Known-malicious package signatures
What it can access
- ✓ Network access No
- ✓ Filesystem access No
- ✓ Shell / process execution No
- ✓ Environment & secrets No
- ✓ Dynamic code execution No
From automated source analysis of v0.1.0. “Used” means the capability is present in the source — more access means more to trust, not that it’s unsafe.
About
LoopStructural - 3D Geological Modelling
Quick Reference
from LoopStructural import GeologicalModel
from LoopStructural.visualisation import LavaVuModelViewer
import pandas as pd
import numpy as np
# Create model
model = GeologicalModel(origin=[0, 0, -1000], maximum=[10000, 10000, 0])
# Add data
model.data = pd.DataFrame({
'X': [5000], 'Y': [5000], 'Z': [-500],
'feature_name': ['strat'], 'val': [0]
})
# Build and visualize
model.create_and_add_foliation('strat', interpolatortype='PLI')
model.update()
viewer = LavaVuModelViewer(model)
viewer.add_isosurface(model['strat'], isovalue=0)
viewer.interactive()
Key Classes
| Class | Purpose | |-------|---------| | GeologicalModel | Main model container - holds features and data | | ProcessInputData | Data preparation and validation | | StructuralFrame | Coordinate system for fold modelling | | FaultSegment | Individual fault surface with displacement |
Essential Operations
Build Stratigraphic Model
model = GeologicalModel([0, 0, -1000], [10000, 10000, 0])
model.data = pd.DataFrame({
'X': [5000, 5000, 5000],
'Y': [5000, 5000, 5000],
'Z': [-200, -500, -800],
'feature_name': ['strat', 'strat', 'strat'],
'val': [0, 1, 2] # Different unit values
})
model.create_and_add_foliation('strat', interpolatortype='PLI', nelements=1000)
model.update()
Add Orientation Data
# Structural measurements (strike/dip)
orientations = pd.DataFrame({
'X': [2000, 5000, 8000],
'Y': [5000, 5000, 5000],
'Z': [-100, -100, -100],
'feature_name': ['strat', 'strat', 'strat'],
'strike': [90, 90, 90],
'dip': [30, 30, 30],
'val': [np.nan, np.nan, np.nan]
})
model.data = pd.concat([interfaces, orientations])
Model with Fault
# Define fault data
fault_data = pd.DataFrame({
'X': [5000, 5000], 'Y': [2000, 8000], 'Z': [-500, -500],
'feature_name': ['fault1', 'fault1'],
'val': [0, 0], 'coord': [0, 0]
})
fault_orient = pd.DataFrame({
'X': [5000], 'Y': [5000], 'Z': [-500],
'feature_name': ['fault1'],
'gx': [1], 'gy': [0], 'gz': [0] # Fault normal
})
model.data = pd.concat([fault_data, fault_orient, strat_data])
model.create_and_add_fault('fault1', displacement=200) # Add fault first
model.create_and_add_foliation('strat') # Stratigraphy affected by fault
model.update()
Folded Geology
# Generate fold interface data
x = np.linspace(0, 10000, 20)
z = -500 + 200 * np.sin(2 * np.pi * x / 5000)
fold_data = pd.DataFrame({
'X': x, 'Y': np.ones(20) * 5000, 'Z': z,
'feature_name': 'strat', 'val': 0
})
model.data = fold_data
model.create_and_add_fold_frame('fold_frame')
model.create_and_add_folded_foliation('strat', fold_frame='fold_frame')
model.update()
Evaluate on Grid
# Create evaluation grid
x = np.linspace(0, 10000, 100)
y = np.linspace(0, 10000, 100)
z = np.linspace(-1000, 0, 50)
xx, yy, zz = np.meshgrid(x, y, z)
points = np.column_stack([xx.ravel(), yy.ravel(), zz.ravel()])
# Evaluate stratigraphy
values = model['strat'].evaluate_value(points)
values_3d = values.reshape(xx.shape)
Export to VTK
import pyvista as pv
# Export isosurface
isosurface = model['strat'].isosurface(isovalue=0)
isosurface.save('horizon.vtk')
# Export regular grid
surfaces = model.regular_grid(nsteps=[50, 50, 50])
grid = pv.StructuredGrid(*surfaces)
grid.save('geological_model.vtk')
Data Requirements
| Data Type | Required Columns | Description | |-----------|-----------------|-------------| | Interface | X, Y, Z, featurename, val | Points on geological surfaces | | Orientation | X, Y, Z, featurename, strike, dip | Structural measurements | | Gradient | X, Y, Z, featurename, gx, gy, gz | Normal vectors to surfaces | | Fault | X, Y, Z, featurename, val, coord | Fault surface points |
When to Use vs Alternatives
| Scenario | Recommendation | |----------|---------------| | Complex fold modelling with structural frames | LoopStructural - best-in-class fold support | | Simple layered geology with faults | GemPy - simpler API, faster setup | | Fault network with displacement fields | LoopStructural - explicit displacement control | | Commercial subsurface modelling | SKUA-GOCAD - industry standard, proprietary | | Uncertainty analysis on geological models | LoopStructural - built-in support |
Choose LoopStructural when: Your geology involves folds, complex fault networks with known displacements, or you need structural frame-based modelling. It excels at reproducing realistic fold geometries using fold constraints.
Avoid LoopStructural when: You have simple layered geology (GemPy is easier), or you need a GUI-driven workflow (use commercial tools).
Common Workflows
Build faulted geological model from structural data
- [ ] Prepare data as DataFrame with columns: X, Y, Z, feature_name, val (and strike/dip or gx/gy/gz)
- [ ] Create
GeologicalModelwith origin and maximum bounds - [ ] Assign data to
model.data - [ ] Add faults first with
model.create_and_add_fault()and set displacement - [ ] Add stratigraphy with
model.create_and_add_foliation() - [ ] Call
model.update()to build the model - [ ] Evaluate on grid with
model['feature'].evaluate_value(points) - [ ] Visualize with
LavaVuModelVieweror export isosurfaces to VTK - [ ] Validate cross-sections against known geology
Modelling Tips
- Add faults before stratigraphy - Order matters for geological relationships
- Use orientation data - Significantly improves model quality
- Check data consistency - Conflicting data causes interpolation issues
- Start simple - Add complexity incrementally
- Validate with sections - Compare cross-sections to known geology
References
- [Geological Features](references/geological_features.md) - Feature types and when to use them
- [Interpolators](references/interpolators.md) - Interpolation methods and parameters
Scripts
- [scripts/buildmodel.py](scripts/buildmodel.py) - Build a basic geological model from CSV data
Source & license
This open-source skill is cataloged on AgentStack and links to its original source — we do not rehost the code.
- Author: SteadfastAsArt
- Source: SteadfastAsArt/geoscience-skills
- License: MIT
Install and usage instructions live in the source repository linked above.
Reviews
No reviews yet — be the first.
Write a review
Versions
- v0.1.0 Imported from the upstream source.