PFC Sand Small-Strain Fabric Skill
Parent Skill Relationship
This specialist child implements pfc-workflow phases P1-P7 for sand G0:
- P1: define shape, void ratio, fabric, pressure, angle and seeds.
- P2: build clump templates and controlled orientation fabric.
- P3: install/calibrate Hertz-Mindlin contacts and consolidate.
- P4: run one declared constant-volume small-strain loop per case.
- P5: calculate G0, damping, fabric, coordination and fitted laws.
- P6/P7: verify amplitude/rate/seed/resolution independence and deliver a manifest.
When To Use
Use for G0/Gmax, small-strain sand stiffness, ellipsoidal grains, fabric
anisotropy, directional modulus, cyclic-triaxial DEM, fabric tensors,
mechanical coordination or G0-void-ratio relationships.
This is not a complete liquefaction model: constant volume is only a mechanical
undrained analogue; explicit pore-pressure generation needs additional coupling.
Architecture Contract
All PFC code follows five layers:
| Layer |
Entry |
Owns |
Must not do |
| Build |
build/build_fabric_specimen.p3dat |
templates, orientation, packing, compaction |
cyclic test or final G0 |
| Material |
material/install_hertz.p3dat |
Hertz install, friction, equilibrium, consolidation |
direction cases/history |
| Test |
test/run_small_strain_cyclic.p3dat |
one declared angle/amplitude test |
rebuild or change shape |
| Observe |
lib/ssf_*.fis |
metrics, control, histories, stop rules |
restore/save/long solve |
| Runner |
run/run_fabric_suite.p3dat |
dependency checks, case routing, log/save/manifest |
duplicate equations |
Each direction case starts from the same material-ready save. Shared libraries
must be idempotent: setup/reset removes prior callbacks and clears state.
Naming Contract
Namespace: ssf (sand small-strain fabric).
- FISH functions:
ssf_verb_noun, e.g. ssf_compute_fabric.
- Configuration globals:
ssf_cfg_*.
- Runtime state:
ssf_state_*.
- Derived outputs:
ssf_out_*.
- Walls:
ssf_wall_xmin/xmax/ymin/ymax/zmin/zmax; never depend on wall IDs.
- Groups:
ssf:grain, ssf:boundary, slot ssf_role.
- Histories:
ssf/cyclic/axial_strain, ssf/cyclic/deviator_stress, etc.
- Executable command files:
.p3dat; 3D FISH libraries: .p3fis;
truly dimension-independent libraries only: .fis.
Case ID:
rm20_ani2_a045_e065_p100_s10001
It encodes aspect ratio, Ani level, angle, void ratio, pressure (kPa) and seed.
Save name:
ssf_{dim}_{material}_{stage}_{case_id}
Canonical stages:
ssf_3d_prep_compacted_{case_id}
ssf_3d_hertz_material_ready_{case_id}
ssf_3d_hertz_rotated_{case_id}
ssf_3d_hertz_cyclic_done_{case_id}
Physical Mapping
| Physical item |
PFC representation |
Control/output |
| Grain shape |
sphere or 5/7/9-pebble ellipsoidal clump |
rm=1.0/1.5/2.0/2.5 |
| Depositional fabric |
major-axis orientation distribution |
Ani I/II/III |
| Fabric intensity |
contact-normal fabric tensor |
Rij, aij, ad |
| Load-bearing skeleton |
mechanical coordination |
Zm |
| Quartz contact |
Hertz-Mindlin |
Gp, nu, friction |
| Undrained analogue |
axial strain + zero-volume lateral control |
volume residual |
| Direction effect |
rotate material/loading coordinates |
0/45/90 degrees |
| Small-strain stiffness |
one-loop stress/strain amplitude |
G0 |
Core Equations
rm = la/lb
Rij = mean(n_i*n_j)
aij = (15/2)*(Rij-deltaij/3)
ad = sqrt((3/2)*sum(aij*aij))
Zm = (2*Nc-N1)/(Np-N1-N0)
G0 = DeltaSigma/gamma
G0 = A*exp(-a*e)*(p0/pa)^n
Use the same amplitude convention for stress and strain.
Operating Rules
- Separate shape, density, fabric, pressure and direction in the case matrix.
- Keep Build, Material, Test, Observe and Runner responsibilities independent.
- Use the
ssf_ namespace and named walls/groups/histories everywhere.
- Compare G0 only at matched void ratio, pressure and approximately matched Zm.
- Demonstrate a low-strain plateau and quasi-static energy response.
- In constant-volume mode, use lateral DOFs only for volume control; report
mean-pressure drift instead of applying a competing pressure servo.
- Export target and achieved orientations, not only a rendered plot.
- Write every case to
output/manifest.csv with version, seed and code hash.
- Verify target-version syntax through
pfc-mcp before running.
Pipeline
Runner defines case_id
-> Build creates templates/fabric and compacted save
-> Material installs Hertz and creates material-ready save
-> Observe validates ad and Zm
-> Test restores material-ready, rotates and runs one loop
-> Observe calculates G0/damping/energy/fabric change
-> Runner writes cyclic-done save, log and manifest
-> post-processing fits G0-e-p and creates orientation plots
Standard Operating Procedure
- Read
config/cases.yaml; generate one unique case ID.
- Build sphere and 5/7/9-pebble templates for rm=1.5/2.0/2.5.
- Check volume, centroid, inertia axes and equivalent-diameter consistency.
- Sample Ani I/II/III orientations and compact to target void ratio.
- Install Hertz-Mindlin and consolidate to the declared initial pressure.
- Calculate ad and Zm; stop the case if initial-state tolerances fail.
- Restore material-ready independently for every 0/45/90-degree case.
- Run one complete 5 Hz loop at axial strain half-amplitude 3.0e-6.
- Calculate G0, damping, pressure drift, volume residual and energy ratio.
- Repeat amplitude/frequency/damping/resolution/seed checks and write manifest.
Reference Starting Values
| Parameter |
Value |
| Grain shear modulus |
18 GPa |
| Grain Poisson ratio |
0.15 |
| Density |
2650 kg/m3 |
| Grain friction |
0.5 |
| Wall friction |
0.0 |
| Preparation local damping |
0.7 |
| Cyclic axial-strain half-amplitude |
3.0e-6 |
| Frequency |
5 Hz |
These are reproduction starting points, not universal Toyoura-sand calibration.
Observe Interface
ssf_reset_case_state()
ssf_assert_dependencies()
ssf_sample_major_axis(ani_level)
ssf_compute_fabric() -> ssf_out_rij/aij/ad
ssf_compute_coordination() -> ssf_out_zm
ssf_setup_measurement()
ssf_apply_cyclic_control()
ssf_should_halt()
ssf_finalize_case()
Runner Manifest
Each row records:
case_id,dim,material,shape,ani,void_ratio,pressure,angle,seed,
input_save,output_save,G0,damping,ad_before,ad_after,Zm,
volume_residual,pressure_drift,energy_ratio,status,elapsed,code_hash
Expected Trends
- G0 decreases with void ratio; the source combined fit is about R2=0.94.
- Ellipsoidal specimens are generally stiffer than spherical ones.
- For one shape/state, stronger fabric anisotropy lowers G0.
- The fabric effect increases at larger void ratio.
- At matched fabric, G0 generally increases from 0 to 45 to 90 degrees.
- Strong-fabric 90-degree cases may not obey one global exponential G0-e law.
V&V Gate
Verify clump geometry, achieved orientation, ad/Zm, particle resolution,
timestep, frequency, damping, random seeds, kinetic/strain-energy ratio,
volume residual and fabric change over the loop. Validate against bender-element,
resonant-column or small-strain cyclic-triaxial measurements where available.
Output Contract
Deliver:
config/cases.yaml plus config/ssf_defaults.fis;
- canonical compacted/material-ready/rotated/cyclic-done saves;
- named
ssf/cyclic/* and ssf/state/* histories;
- loop data, G0, damping, void ratio, pressure drift, ad, Zm and plots;
output/manifest.csv, logs, code hash, V&V evidence and exceptions.
Local Contents
config/: defaults and case matrix.
build/: template/fabric specimen creation.
material/: Hertz-Mindlin installation/consolidation.
test/: one declared small-strain cyclic test.
lib/: contracts, fabric, servo and measurement interfaces.
run/: reproducible suite runner.
post/: G0/fabric fitting and orientation plotting.
references/: equations, calibration cautions and expected trends.
examples/: run order and checks.
output/: logs, saves, histories, figures and manifest schema.
1---2name: pfc-sand-small-strain-fabric3description: Child skill of pfc-workflow for PFC3D studies of sand small-strain shear modulus (G0/Gmax). Build spherical and ellipsoidal clumps, prescribe major-axis fabric, install Hertz-Mindlin contacts, run constant-volume small-amplitude cyclic tests, and calculate G0, fabric tensors and mechanical coordination. Uses a Build-Material-Test-Observe-Runner architecture and the ssf_ naming namespace.4---56# PFC Sand Small-Strain Fabric Skill78## Parent Skill Relationship910This specialist child implements `pfc-workflow` phases P1-P7 for sand G0:1112- P1: define shape, void ratio, fabric, pressure, angle and seeds.13- P2: build clump templates and controlled orientation fabric.14- P3: install/calibrate Hertz-Mindlin contacts and consolidate.15- P4: run one declared constant-volume small-strain loop per case.16- P5: calculate G0, damping, fabric, coordination and fitted laws.17- P6/P7: verify amplitude/rate/seed/resolution independence and deliver a manifest.1819## When To Use2021Use for G0/Gmax, small-strain sand stiffness, ellipsoidal grains, fabric22anisotropy, directional modulus, cyclic-triaxial DEM, fabric tensors,23mechanical coordination or G0-void-ratio relationships.2425This is not a complete liquefaction model: constant volume is only a mechanical26undrained analogue; explicit pore-pressure generation needs additional coupling.2728## Architecture Contract2930All PFC code follows five layers:3132| Layer | Entry | Owns | Must not do |33|---|---|---|---|34| Build | `build/build_fabric_specimen.p3dat` | templates, orientation, packing, compaction | cyclic test or final G0 |35| Material | `material/install_hertz.p3dat` | Hertz install, friction, equilibrium, consolidation | direction cases/history |36| Test | `test/run_small_strain_cyclic.p3dat` | one declared angle/amplitude test | rebuild or change shape |37| Observe | `lib/ssf_*.fis` | metrics, control, histories, stop rules | restore/save/long solve |38| Runner | `run/run_fabric_suite.p3dat` | dependency checks, case routing, log/save/manifest | duplicate equations |3940Each direction case starts from the same material-ready save. Shared libraries41must be idempotent: setup/reset removes prior callbacks and clears state.4243## Naming Contract4445Namespace: `ssf` (sand small-strain fabric).4647- FISH functions: `ssf_verb_noun`, e.g. `ssf_compute_fabric`.48- Configuration globals: `ssf_cfg_*`.49- Runtime state: `ssf_state_*`.50- Derived outputs: `ssf_out_*`.51- Walls: `ssf_wall_xmin/xmax/ymin/ymax/zmin/zmax`; never depend on wall IDs.52- Groups: `ssf:grain`, `ssf:boundary`, slot `ssf_role`.53- Histories: `ssf/cyclic/axial_strain`, `ssf/cyclic/deviator_stress`, etc.54- Executable command files: `.p3dat`; 3D FISH libraries: `.p3fis`;55 truly dimension-independent libraries only: `.fis`.5657Case ID:5859```text60rm20_ani2_a045_e065_p100_s1000161```6263It encodes aspect ratio, Ani level, angle, void ratio, pressure (kPa) and seed.6465Save name:6667```text68ssf_{dim}_{material}_{stage}_{case_id}69```7071Canonical stages:7273```text74ssf_3d_prep_compacted_{case_id}75ssf_3d_hertz_material_ready_{case_id}76ssf_3d_hertz_rotated_{case_id}77ssf_3d_hertz_cyclic_done_{case_id}78```7980## Physical Mapping8182| Physical item | PFC representation | Control/output |83|---|---|---|84| Grain shape | sphere or 5/7/9-pebble ellipsoidal clump | rm=1.0/1.5/2.0/2.5 |85| Depositional fabric | major-axis orientation distribution | Ani I/II/III |86| Fabric intensity | contact-normal fabric tensor | Rij, aij, ad |87| Load-bearing skeleton | mechanical coordination | Zm |88| Quartz contact | Hertz-Mindlin | Gp, nu, friction |89| Undrained analogue | axial strain + zero-volume lateral control | volume residual |90| Direction effect | rotate material/loading coordinates | 0/45/90 degrees |91| Small-strain stiffness | one-loop stress/strain amplitude | G0 |9293## Core Equations9495```text96rm = la/lb97Rij = mean(n_i*n_j)98aij = (15/2)*(Rij-deltaij/3)99ad = sqrt((3/2)*sum(aij*aij))100Zm = (2*Nc-N1)/(Np-N1-N0)101G0 = DeltaSigma/gamma102G0 = A*exp(-a*e)*(p0/pa)^n103```104105Use the same amplitude convention for stress and strain.106107## Operating Rules1081091. Separate shape, density, fabric, pressure and direction in the case matrix.1102. Keep Build, Material, Test, Observe and Runner responsibilities independent.1113. Use the `ssf_` namespace and named walls/groups/histories everywhere.1124. Compare G0 only at matched void ratio, pressure and approximately matched Zm.1135. Demonstrate a low-strain plateau and quasi-static energy response.1146. In constant-volume mode, use lateral DOFs only for volume control; report115 mean-pressure drift instead of applying a competing pressure servo.1167. Export target and achieved orientations, not only a rendered plot.1178. Write every case to `output/manifest.csv` with version, seed and code hash.1189. Verify target-version syntax through `pfc-mcp` before running.119120## Pipeline121122```text123Runner defines case_id124 -> Build creates templates/fabric and compacted save125 -> Material installs Hertz and creates material-ready save126 -> Observe validates ad and Zm127 -> Test restores material-ready, rotates and runs one loop128 -> Observe calculates G0/damping/energy/fabric change129 -> Runner writes cyclic-done save, log and manifest130 -> post-processing fits G0-e-p and creates orientation plots131```132133## Standard Operating Procedure1341351. Read `config/cases.yaml`; generate one unique case ID.1362. Build sphere and 5/7/9-pebble templates for rm=1.5/2.0/2.5.1373. Check volume, centroid, inertia axes and equivalent-diameter consistency.1384. Sample Ani I/II/III orientations and compact to target void ratio.1395. Install Hertz-Mindlin and consolidate to the declared initial pressure.1406. Calculate ad and Zm; stop the case if initial-state tolerances fail.1417. Restore material-ready independently for every 0/45/90-degree case.1428. Run one complete 5 Hz loop at axial strain half-amplitude 3.0e-6.1439. Calculate G0, damping, pressure drift, volume residual and energy ratio.14410. Repeat amplitude/frequency/damping/resolution/seed checks and write manifest.145146## Reference Starting Values147148| Parameter | Value |149|---|---:|150| Grain shear modulus | 18 GPa |151| Grain Poisson ratio | 0.15 |152| Density | 2650 kg/m3 |153| Grain friction | 0.5 |154| Wall friction | 0.0 |155| Preparation local damping | 0.7 |156| Cyclic axial-strain half-amplitude | 3.0e-6 |157| Frequency | 5 Hz |158159These are reproduction starting points, not universal Toyoura-sand calibration.160161## Observe Interface162163```text164ssf_reset_case_state()165ssf_assert_dependencies()166ssf_sample_major_axis(ani_level)167ssf_compute_fabric() -> ssf_out_rij/aij/ad168ssf_compute_coordination() -> ssf_out_zm169ssf_setup_measurement()170ssf_apply_cyclic_control()171ssf_should_halt()172ssf_finalize_case()173```174175## Runner Manifest176177Each row records:178179```text180case_id,dim,material,shape,ani,void_ratio,pressure,angle,seed,181input_save,output_save,G0,damping,ad_before,ad_after,Zm,182volume_residual,pressure_drift,energy_ratio,status,elapsed,code_hash183```184185## Expected Trends186187- G0 decreases with void ratio; the source combined fit is about R2=0.94.188- Ellipsoidal specimens are generally stiffer than spherical ones.189- For one shape/state, stronger fabric anisotropy lowers G0.190- The fabric effect increases at larger void ratio.191- At matched fabric, G0 generally increases from 0 to 45 to 90 degrees.192- Strong-fabric 90-degree cases may not obey one global exponential G0-e law.193194## V&V Gate195196Verify clump geometry, achieved orientation, ad/Zm, particle resolution,197timestep, frequency, damping, random seeds, kinetic/strain-energy ratio,198volume residual and fabric change over the loop. Validate against bender-element,199resonant-column or small-strain cyclic-triaxial measurements where available.200201## Output Contract202203Deliver:204205- `config/cases.yaml` plus `config/ssf_defaults.fis`;206- canonical compacted/material-ready/rotated/cyclic-done saves;207- named `ssf/cyclic/*` and `ssf/state/*` histories;208- loop data, G0, damping, void ratio, pressure drift, ad, Zm and plots;209- `output/manifest.csv`, logs, code hash, V&V evidence and exceptions.210211## Local Contents212213- `config/`: defaults and case matrix.214- `build/`: template/fabric specimen creation.215- `material/`: Hertz-Mindlin installation/consolidation.216- `test/`: one declared small-strain cyclic test.217- `lib/`: contracts, fabric, servo and measurement interfaces.218- `run/`: reproducible suite runner.219- `post/`: G0/fabric fitting and orientation plotting.220- `references/`: equations, calibration cautions and expected trends.221- `examples/`: run order and checks.222- `output/`: logs, saves, histories, figures and manifest schema.