# cym9196/yangtze-local-morphodynamics architecture

> Architecture diagram of the GitHub repository cym9196/yangtze-local-morphodynamics, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-09-29). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/cym9196/yangtze-local-morphodynamics
- Repository: https://github.com/cym9196/yangtze-local-morphodynamics

## Overview

This repository is a reproducible OpenFOAM research case for coupled flow, sediment-bed evolution, and a mobile immersed iron block. The principal workflow is to prepare the variable mesh and case inputs, run the custom solver through hydrodynamic spin-up and coupled evolution, then inspect or render the saved bed and body motion. The solver is the runtime orchestrator; its included stages cover flow, sediment transport, bed change, and body coupling. README documents further outputs and capabilities not fully shown in the sampled source, so only documented wiring is represented.

Main entry points: [`solver/immersedSedExnerFoam/sedExnerFoam.C`](https://github.com/cym9196/yangtze-local-morphodynamics/blob/main/solver/immersedSedExnerFoam/sedExnerFoam.C) (Coupled solver), [`solver/immersedSedExnerFoam/createImmersedBody.H`](https://github.com/cym9196/yangtze-local-morphodynamics/blob/main/solver/immersedSedExnerFoam/createImmersedBody.H) (Body setup), [`solver/immersedSedExnerFoam/createFields.H`](https://github.com/cym9196/yangtze-local-morphodynamics/blob/main/solver/immersedSedExnerFoam/createFields.H) (Flow fields), [`constant`](https://github.com/cym9196/yangtze-local-morphodynamics/tree/main/constant) (Case properties)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_case["Case setup"]
  node_meshgen["Variable mesh"]
  node_meshdict["Mesh definition"]
  node_initial["Initial fields"]
  node_caseprops["Case properties"]
end

subgraph group_flow["Flow solver"]
  node_solver["Coupled solver<br/>[sedExnerFoam.C]"]
  node_flowfields["Flow fields<br/>[createFields.H]"]
  node_momentum["Momentum solve<br/>[UEqn.H]"]
end

subgraph group_sediment["Sediment morphodynamics"]
  node_sedfields["Bed fields<br/>[createFaFields.H]"]
  node_bedload["Bedload transport<br/>[bedload.H]"]
  node_suspension["Suspended transport<br/>[CsEqn.H]"]
  node_bedchange["Exner bed change<br/>[exnerEqn.H]"]
end

subgraph group_body["Immersed body"]
  node_bodyinit["Body setup"]
  node_contact["Bed contact"]
  node_bodyforces["Body forces"]
  node_bodyfields["Body mask update"]
end

subgraph group_results["Results"]
  node_saved["Simulation outputs<br/>[sedExnerFoam.C]"]
  node_renderer["Solid-bed renderer"]
  node_metrics["Postprocessed metrics"]
end

node_researcher(("Researcher"))
node_paraview(("ParaView user"))

node_researcher -->|"generates mesh"| node_meshgen
node_meshgen -->|"writes mesh"| node_meshdict
node_researcher -->|"runs case"| node_solver
node_meshdict -->|"provides mesh"| node_solver
node_initial -->|"initializes fields"| node_flowfields
node_caseprops -->|"configures fields"| node_flowfields
node_caseprops -->|"configures bed"| node_sedfields
node_caseprops -->|"configures body"| node_bodyinit
node_solver -->|"creates fields"| node_flowfields
node_solver -->|"initializes body"| node_bodyinit
node_solver -->|"solves momentum"| node_momentum
node_flowfields -->|"supplies fields"| node_momentum
node_solver -->|"advances bedload"| node_bedload
node_solver -->|"advances suspension"| node_suspension
node_solver -->|"updates bed"| node_bedchange
node_sedfields -->|"supplies bed fields"| node_bedload
node_sedfields -->|"supplies transport fields"| node_suspension
node_bedload -->|"supplies transport"| node_bedchange
node_solver -->|"computes forces"| node_bodyforces
node_solver -->|"computes contact"| node_contact
node_bodyinit -->|"provides body state"| node_bodyforces
node_bodyinit -->|"provides contact data"| node_contact
node_bedchange -->|"provides bed geometry"| node_contact
node_solver -->|"updates mask"| node_bodyfields
node_bodyforces -->|"updates body state"| node_bodyfields
node_solver -->|"writes fields"| node_saved
node_saved -->|"reads bed and motion"| node_renderer
node_saved -->|"postprocesses results"| node_metrics
node_saved -->|"opens case"| node_paraview

click node_meshgen "https://github.com/cym9196/yangtze-local-morphodynamics/blob/main/make_variable_mesh.py"
click node_meshdict "https://github.com/cym9196/yangtze-local-morphodynamics/blob/main/system/blockMeshDict"
click node_initial "https://github.com/cym9196/yangtze-local-morphodynamics/tree/main/0_org"
click node_caseprops "https://github.com/cym9196/yangtze-local-morphodynamics/tree/main/constant"
click node_solver "https://github.com/cym9196/yangtze-local-morphodynamics/blob/main/solver/immersedSedExnerFoam/sedExnerFoam.C"
click node_flowfields "https://github.com/cym9196/yangtze-local-morphodynamics/blob/main/solver/immersedSedExnerFoam/createFields.H"
click node_momentum "https://github.com/cym9196/yangtze-local-morphodynamics/blob/main/solver/immersedSedExnerFoam/UEqn.H"
click node_sedfields "https://github.com/cym9196/yangtze-local-morphodynamics/blob/main/solver/immersedSedExnerFoam/createFaFields.H"
click node_bedload "https://github.com/cym9196/yangtze-local-morphodynamics/blob/main/solver/immersedSedExnerFoam/bedload.H"
click node_suspension "https://github.com/cym9196/yangtze-local-morphodynamics/blob/main/solver/immersedSedExnerFoam/CsEqn.H"
click node_bedchange "https://github.com/cym9196/yangtze-local-morphodynamics/blob/main/solver/immersedSedExnerFoam/exnerEqn.H"
click node_bodyinit "https://github.com/cym9196/yangtze-local-morphodynamics/blob/main/solver/immersedSedExnerFoam/createImmersedBody.H"
click node_contact "https://github.com/cym9196/yangtze-local-morphodynamics/blob/main/solver/immersedSedExnerFoam/immersedBodyContact.H"
click node_bodyforces "https://github.com/cym9196/yangtze-local-morphodynamics/blob/main/solver/immersedSedExnerFoam/immersedBodyForces.H"
click node_bodyfields "https://github.com/cym9196/yangtze-local-morphodynamics/blob/main/solver/immersedSedExnerFoam/updateImmersedBodyFields.H"
click node_saved "https://github.com/cym9196/yangtze-local-morphodynamics/blob/main/solver/immersedSedExnerFoam/sedExnerFoam.C"
click node_renderer "https://github.com/cym9196/yangtze-local-morphodynamics/blob/main/render_solid_sand.py"
click node_metrics "https://github.com/cym9196/yangtze-local-morphodynamics/blob/main/postprocess_solid.sh"

classDef toneNeutral fill:#f8fafc,stroke:#334155,stroke-width:1.5px,color:#0f172a
classDef toneBlue fill:#dbeafe,stroke:#2563eb,stroke-width:1.5px,color:#172554
classDef toneAmber fill:#fef3c7,stroke:#d97706,stroke-width:1.5px,color:#78350f
classDef toneMint fill:#dcfce7,stroke:#16a34a,stroke-width:1.5px,color:#14532d
classDef toneRose fill:#ffe4e6,stroke:#e11d48,stroke-width:1.5px,color:#881337
classDef toneIndigo fill:#e0e7ff,stroke:#4f46e5,stroke-width:1.5px,color:#312e81
classDef toneTeal fill:#ccfbf1,stroke:#0f766e,stroke-width:1.5px,color:#134e4a
class node_meshgen,node_meshdict,node_initial,node_caseprops,node_paraview toneBlue
class node_solver,node_flowfields,node_momentum toneAmber
class node_sedfields,node_bedload,node_suspension,node_bedchange toneMint
class node_bodyinit,node_contact,node_bodyforces,node_bodyfields toneRose
class node_saved,node_renderer,node_metrics,node_researcher toneIndigo
```

## Components

### Case setup

- [Variable mesh](https://github.com/cym9196/yangtze-local-morphodynamics/blob/main/make_variable_mesh.py): `make_variable_mesh.py`
- [Mesh definition](https://github.com/cym9196/yangtze-local-morphodynamics/blob/main/system/blockMeshDict): `system/blockMeshDict`
- [Initial fields](https://github.com/cym9196/yangtze-local-morphodynamics/tree/main/0_org): `0_org`
- [Case properties](https://github.com/cym9196/yangtze-local-morphodynamics/tree/main/constant): `constant`

### Flow solver

- [Coupled solver](https://github.com/cym9196/yangtze-local-morphodynamics/blob/main/solver/immersedSedExnerFoam/sedExnerFoam.C): `solver/immersedSedExnerFoam/sedExnerFoam.C`
- [Flow fields](https://github.com/cym9196/yangtze-local-morphodynamics/blob/main/solver/immersedSedExnerFoam/createFields.H): `solver/immersedSedExnerFoam/createFields.H`
- [Momentum solve](https://github.com/cym9196/yangtze-local-morphodynamics/blob/main/solver/immersedSedExnerFoam/UEqn.H): `solver/immersedSedExnerFoam/UEqn.H`

### Sediment morphodynamics

- [Bed fields](https://github.com/cym9196/yangtze-local-morphodynamics/blob/main/solver/immersedSedExnerFoam/createFaFields.H): `solver/immersedSedExnerFoam/createFaFields.H`
- [Bedload transport](https://github.com/cym9196/yangtze-local-morphodynamics/blob/main/solver/immersedSedExnerFoam/bedload.H): `solver/immersedSedExnerFoam/bedload.H`
- [Suspended transport](https://github.com/cym9196/yangtze-local-morphodynamics/blob/main/solver/immersedSedExnerFoam/CsEqn.H): `solver/immersedSedExnerFoam/CsEqn.H`
- [Exner bed change](https://github.com/cym9196/yangtze-local-morphodynamics/blob/main/solver/immersedSedExnerFoam/exnerEqn.H): `solver/immersedSedExnerFoam/exnerEqn.H`

### Immersed body

- [Body setup](https://github.com/cym9196/yangtze-local-morphodynamics/blob/main/solver/immersedSedExnerFoam/createImmersedBody.H): `solver/immersedSedExnerFoam/createImmersedBody.H`
- [Bed contact](https://github.com/cym9196/yangtze-local-morphodynamics/blob/main/solver/immersedSedExnerFoam/immersedBodyContact.H): `solver/immersedSedExnerFoam/immersedBodyContact.H`
- [Body forces](https://github.com/cym9196/yangtze-local-morphodynamics/blob/main/solver/immersedSedExnerFoam/immersedBodyForces.H): `solver/immersedSedExnerFoam/immersedBodyForces.H`
- [Body mask update](https://github.com/cym9196/yangtze-local-morphodynamics/blob/main/solver/immersedSedExnerFoam/updateImmersedBodyFields.H): `solver/immersedSedExnerFoam/updateImmersedBodyFields.H`

### Results

- [Simulation outputs](https://github.com/cym9196/yangtze-local-morphodynamics/blob/main/solver/immersedSedExnerFoam/sedExnerFoam.C): `solver/immersedSedExnerFoam/sedExnerFoam.C`
- [Solid-bed renderer](https://github.com/cym9196/yangtze-local-morphodynamics/blob/main/render_solid_sand.py): `render_solid_sand.py`
- [Postprocessed metrics](https://github.com/cym9196/yangtze-local-morphodynamics/blob/main/postprocess_solid.sh): `postprocess_solid.sh`

### Other components

- **Researcher**
- **ParaView user**

## Connections

- Researcher → Variable mesh: generates mesh
- Variable mesh → Mesh definition: writes mesh
- Researcher → Coupled solver: runs case
- Mesh definition → Coupled solver: provides mesh
- Initial fields → Flow fields: initializes fields
- Case properties → Flow fields: configures fields
- Case properties → Bed fields: configures bed
- Case properties → Body setup: configures body
- Coupled solver → Flow fields: creates fields
- Coupled solver → Body setup: initializes body
- Coupled solver → Momentum solve: solves momentum
- Flow fields → Momentum solve: supplies fields
- Coupled solver → Bedload transport: advances bedload
- Coupled solver → Suspended transport: advances suspension
- Coupled solver → Exner bed change: updates bed
- Bed fields → Bedload transport: supplies bed fields
- Bed fields → Suspended transport: supplies transport fields
- Bedload transport → Exner bed change: supplies transport
- Coupled solver → Body forces: computes forces
- Coupled solver → Bed contact: computes contact
- Body setup → Body forces: provides body state
- Body setup → Bed contact: provides contact data
- Exner bed change → Bed contact: provides bed geometry
- Coupled solver → Body mask update: updates mask
- Body forces → Body mask update: updates body state
- Coupled solver → Simulation outputs: writes fields
- Simulation outputs → Solid-bed renderer: reads bed and motion
- Simulation outputs → Postprocessed metrics: postprocesses results
- Simulation outputs → ParaView user: opens case
