Skip to main content
US Army Corps of EngineersInstitute for Water Resources, Risk Management Center

PFM-01: Overtopping Erosion

PFM-01 models overtopping erosion of embankment dams. Each PFM-01 location represents one embankment section being evaluated (e.g., "Main Embankment", "Left Abutment"). The module uses the three-table SRP pattern: a DST-calculated SRP, a user-defined SRP, and an active SRP that is synced from one of the two sources based on the user's selected mode.

Table Relationships


Pfm01

35 colsImplemented
PFM-01 location entity. Each row represents one embankment section being evaluated.
Column
Type
Constraints
Identity5
SRP Mode1
Geometry3
Materials3
Erodibility Coefficient (kd)6
Critical Shear Stress (τc)6
Manning's Roughness (n)6
Analysis2
UI State1
Timestamps2
Notes
  1. Distribution parameters (Kd, TauC, ManningsN) follow a pattern: DistributionType selects the distribution family, then the relevant parameters (Min/Mode/Max or Mean/Std) are populated.
  2. Indexes: PK on Id, Index on ScreeningId, Index on Index column.

Pfm01_DstSrp

6 colsImplemented
Stores System-Response calculation results and nodal probability adjustments.
Column
Type
Constraints
Id
UUID
PK= gen_random_uuid()
Pfm01Id
UUID
CurvesJson
JSONB
?JSONB
NodalJson
JSONB
?JSONB
LastCalculatedAt
TIMESTAMP
?
LastNodalEditAt
TIMESTAMP
?
CurvesJson Structure System-Response calculation output curves
{
"systemResponseCurve": [
  { "headwater": 0.0, "probability": 0.0 },
  ...  // 50 points: overtopping depth (ft) vs probability of failure
],
"grassRemovalCurve": [...],       // Node 2 — grass cover removal
"conditionalBreachCurve": [...],  // Node 5 — conditional breach
"durationCurve": [
  { "depth": 0.5, "duration": 12.0 }, ...
]
}

Point types:
CurvePointDto:    { headwater: double, probability: double }
DurationPointDto: { depth: double, duration: double }
NodalJson Structure 5-node event tree nodal probability tables
{
"originalHeadwaters": [0.1, 0.5, 1.0, 1.5, 2.0, 3.0, 4.0, 5.0],
"nodes": {
  "node1": {
    "name": "Overtopping Initiates",
    "headwaters": [...],
    "dstEstimate": [...],       // read-only (from System-Response)
    "revisedEstimate": [...],   // user overrides; null = use DST
    "justification": null
  },
  "node2": { ... }, "node3": { ... }, "node4": { ... }, "node5": { ... }
},
"totalSrp": {
  "headwaters": [...],
  "dstEstimate": [...],         // product of all nodes
  "revisedEstimate": [...]
}
}

Pfm01_UserSrp

5 colsImplemented
Stores manually-entered SRP curves computed outside DST by the user.
Column
Type
Constraints
Id
UUID
PK= gen_random_uuid()
Pfm01Id
UUID
CurveJson
JSONB
?JSONB
Notes
VARCHAR(4000)
?
LastModifiedAt
TIMESTAMP
?
CurveJson Structure User-defined SRP curve (headwater vs probability)
[
{ "headwater": 0.0, "probability": 0.0 },
{ "headwater": 0.5, "probability": 0.01 },
{ "headwater": 1.0, "probability": 0.05 },
...  // Variable number of points (user-defined)
]

Point type: { headwater: double, probability: double }

Pfm01_ActiveSrp

5 colsImplemented
Active SRP curve used in risk calculations. Synced from DstSrp or UserSrp based on SrpMode.
Column
Type
Constraints
Id
UUID
PK= gen_random_uuid()
Pfm01Id
UUID
CurveJson
JSONB
?JSONB
SourceMode
VARCHAR(20)
?
LastSyncedAt
TIMESTAMP
?
Notes
  1. When SrpMode = 'dst': Syncs totalSrp.revisedEstimate from Pfm01_DstSrp.NodalJson.
  2. When SrpMode = 'user': Copies CurveJson from Pfm01_UserSrp.
  3. Sync triggers: mode switch, DST calculation complete, user-defined curve save.

Three-Table SRP Pattern

The SRP (System Response Probability) pattern is central to PFM-01 and will be replicated across all future PFM modules:

  1. DstSrp — Curves and nodal tables computed by the DST System-Response library. Read-only from the user's perspective (though users can revise individual nodal estimates).
  2. UserSrp — A manually-entered SRP curve computed outside DST. Fully user-defined.
  3. ActiveSrp — Denormalized cache of whichever SRP is currently "active" based on the parent entity's SrpMode. When 'dst', synced from DstSrp's total SRP. When 'user', synced from UserSrp.

Data is never deleted when switching modes — switching from DST to User mode does not erase DST calculations, and switching back does not erase user-entered curves.

Enum Values

SrpMode

ValueDatabase StringDescription
Dst"dst"DST-based SRP: System-Response library calculates probabilities
User"user"User-defined SRP: User manually defines the complete SRP curve

EmbankmentErodibility

ValueDatabase StringDescription
VeryErodible"veryErodible"Very erodible material
Erodible"erodible"Erodible material
ModeratelyResistant"moderatelyResistant"Moderately resistant material
Resistant"resistant"Resistant material
VeryResistant"veryResistant"Very resistant material

GrassCoverQuality

ValueDatabase StringDescription
None"noGrassCover"No grass cover
Poor"poorCover"Poor grass cover
Average"averageCover"Average grass cover
Good"goodCover"Good grass cover