1Overview β Why Density Flow Matters
Most groundwater models assume water has constant density β one kg/mΒ³ worth of freshwater anywhere. But in coastal aquifers, brine pockets, or around dense contaminant plumes, density differences drive flow on their own. Freshwater floats on saltwater. Dense plumes sink. Pumping near a coast can pull a saltwater wedge inland.
What this tutorial covers
You'll learn how to:
- Enable Density Flow in IGW-NET via the Solver Options dialog
- Choose between SEAWAT V4 (older USGS, 2012) and MODFLOW-6 density solvers
- Run the classic Henry Problem benchmark for saltwater intrusion
- Work with a real-world case (Salinas Valley, California) showing pumping-induced intrusion
- Use the Realtime Multi-Species Transport interface (coupled with transient flow) β contrasted with the post-analysis alternative in Tutorial 30
- Assign species properties per zone via ZoneAttr
How this fits with other tutorials
This tutorial sits at the top of the transport stack. If you're new to contaminant transport in IGW-NET, walk this path in order:
- Tutorial 1 β Steady 2D Flow for basic model setup
- Tutorial 5 β Contaminant Transport for single-species transport
- Tutorial 29 β MT3D Advection Solvers for engine choice
- Tutorial 30 β MT3DMS Multi-Species (Post-Analysis) for steady-flow reactive chains
- This tutorial β for transient-flow, density-coupled, realtime reactive transport
You'll also want Tutorial 17 β Monte Carlo Transport if uncertainty quantification matters for your problem.
2Concept β Coupled Flow and Transport
Before touching the interface, understand what the solver actually does.
Variable-density flow is a two-way coupling
At every time step, the simulator alternates between solving flow and solving transport:
- Solve flow for a given density field β produces heads and velocities
- Solve transport using those velocities β produces updated concentrations
- Update density from the new concentration field (typically via a linear densityβconcentration law, e.g., +0.000714 kg/mΒ³ per ppm TDS)
- Go to step 1 with the new density field
Two coupling strategies
- Explicit coupling (one-step lag) β flow and transport are solved once per time step with the density field from the previous step. Fast but can drift if density gradients are strong.
- Iterative coupling (Picard) β the flow-transport cycle is repeated within each time step until density stops changing. Slower but stable for strong gradients.
Two implementations in IGW-NET
| Engine | Origin | Strengths | Weaknesses |
|---|---|---|---|
| SEAWAT V4 | USGS, 2012 (older but widely validated) | Multiple coupling modes; proven on literature benchmarks; BCF/LPF package support; many flow solver choices (PCG, DE4, GMG, SIP, SOR) | Legacy codebase; known instability on some configurations; less active maintenance |
| MODFLOW-6 | USGS, 2017+ (modern replacement) | Cleaner architecture; XT3D dispersion; IMS6 solver; actively maintained; better convergence behavior | Fewer legacy options; some specific features differ from classic SEAWAT |
3Enable Density Flow in Solver Options
Variable-density flow is not a default. You must explicitly turn it on, and you must make sure the flow and transport engines are compatible.
Step 1 β Open the Solver Options dialog
- Expand and click
- Switch to the Simulation Settings tab
- Click
Step 2 β Select the compatible engines
In the Solver Options dialog, check the following:
- Flow solver: select ModFlow (not the internal Magnet Flow solver β variable-density coupling requires MODFLOW).
- Transport solver: select MT3D. For background on why and when to switch from Magnet Transport to MT3D, see Tutorial 29 β MT3D Advection Solvers.
- Density Flow: check the box. Then click to configure parameters.
4SEAWAT Solver Parameters
Click in Solver Options to open the density-flow parameter dialog. At the top, select Mode: SEAWAT (the other option is MODFLOW-6, covered in the next section).
Key parameters explained
- Flow and transport coupling β "explicit (one-substep lag)" is the default and fastest. Switch to iterative if you see instability or strong density gradients.
- Initial transport substep (days) β first substep MT3D tries. Leave at 0.01 unless you have stability problems.
- Conductance scheme for density calcs β upstream (default) vs. central-in-space. Upstream is more stable; central-in-space is slightly more accurate for slow flows.
- Apply variable-density water table corrections β enable this if your model has a free water table where density varies across the interface. Corrects for the hydrostatic pressure effect.
- Density-concentration relationship β linear, defined by slope. 0.000714 kg/mΒ³ per ppm is the standard value for NaCl solutions.
- Reference density / concentration β the baseline from which density is computed. Keep at 1000 kg/mΒ³ / 0 ppm for freshwater-at-0 as the zero point.
5MODFLOW-6 Solver Parameters
MODFLOW-6 is the modern USGS replacement for SEAWAT. The interface offers cleaner density coupling and better numerical methods for dispersion.
What differs from SEAWAT
- Advective transport solver β MF6 ships with FDM (standard finite-difference) by default. The MOC/MMOC/HMOC/ULTIMATE schemes available in classic MT3D are not in MF6's transport model.
- Dispersion options β "Complete XT3D formulation" gives you proper anisotropic dispersion on unstructured grids. If you're doing 2D structured-grid work, this is overkill but harmless.
- Number of substeps β controls how many flow-transport iterations happen per outer step. 10 is a reasonable default.
- Off-diagonal terms to right-hand side β a numerical trick for reducing matrix asymmetry. Don't enable unless you have a specific convergence problem it solves.
- IMS6 solver β MODFLOW-6's native iterative solver. Configure via button if defaults don't converge.
6Benchmark β The Henry Problem
The Henry Problem (Henry, 1964) is the standard validation case for saltwater intrusion simulators. Every variable-density code ever written has been run against it. It's the "Hello World" of coupled flowβtransport.
Setup
- A vertical slice of aquifer (2D cross-section)
- Isotropic, homogeneous, confined
- Constant freshwater flux on the inland (left) boundary
- Seaward (right) boundary exposed to saltwater (35,000 ppm, density 1025 kg/mΒ³)
- Top and bottom are no-flow
The expected result: a classical saltwater wedge intrudes from the seaward boundary, with its toe position determined by the freshwater flux rate. Higher flux β wedge pushed back out to sea. Lower flux or pumping β wedge migrates inland.
7Real-World Case Study β Salinas Valley
Henry's toy problem is nice, but the point is modeling real aquifers. Salinas Valley, California is a classic saltwater intrusion site: a coastal agricultural valley where decades of pumping have drawn seawater inland from Monterey Bay.
What the model shows
The Salinas Valley model is built the same way as any IGW-NET model β import a DEM, build a conceptual model, define zones, wells, and river boundaries. The difference is that it's run with Density Flow enabled so the saltwater wedge migrates realistically with pumping scenarios.
Scenarios to explore:
- Baseline β current pumping; watch where the wedge equilibrates over decades
- Reduced pumping β cut extraction by X%; see how fast the wedge retreats
- Managed aquifer recharge β add injection wells inland of the coast; see the hydraulic barrier effect
8Realtime Multi-Species Transport
Now the other major feature of this tutorial: Realtime Multi-Species Transport β reactive transport with multiple species, fully coupled with transient flow, inside the main simulation loop.
Realtime vs. Post-Analysis β which to use?
IGW-NET offers two ways to run multi-species reactive transport. Same chemistry options, same species definitions, but different execution contexts:
| Realtime (this tutorial) | Post-Analysis (Tutorial 30) | |
|---|---|---|
| Flow | Transient, coupled in each timestep | Steady-state or snapshot from last flow step |
| When used | Transient flow driving reactive transport (pumping schedules, seasonal recharge, density coupling) | Quick iteration on chemistry for a fixed flow field |
| Where configured | Solver Options (main simulation) | Analysis Tools β Post Analysis β Multiple Species Transport |
| Cost per run | Higher (re-solves flow every step) | Lower (flow is reused) |
| Density coupling | Yes β can combine with SEAWAT/MF6 | No β uses pre-computed flow field |
What the two share
Both realtime and post-analysis use the same chemistry infrastructure:
- Same processes: linear sorption, first-order sorption, dual-domain mass transfer
- Same chemical reactions: first-order rate, zero-order, Monod kinetic, first-order chain
- Same reaction model templates: BTEX Instant Aerobic, BTEX Kinetic with Multiple EAs, PCE Sequential Decay, PCE/TCE aerobic/anaerobic, Single-pair Instant EA/ED
9Configure Realtime Multi-Species
The interface is structurally the same as Tutorial 30's post-analysis dialog, but you access it from Solver Options, not from the Analysis menu.
Step 3 β Enable MT3D in Solver Options
You've already done this if you followed Section 3 above. If not: β Simulation Settings β β enable MT3D. Then click and configure the multi-species options within.
Step 4 β Choose Process / Reaction / Template
Exactly as in Tutorial 30, three dropdowns govern the chemistry:
Step 5 β Build/Edit defaults
Click to define each species' default properties (initial concentration, retardation, decay rate). These defaults apply wherever you haven't explicitly overridden them per-zone.
10Assign Species Properties to Zones
Here's a feature unique to realtime multi-species: per-zone species overrides. You can specify different initial concentrations, reaction rates, or retardation factors in different parts of the model β all within the main simulation loop.
Step 6 β Open ZoneAttr
Click a zone on the map (or right-click and choose ), then switch to the Biochemical tab in the Zone Properties dialog.
Step 7 β Check "multiple Species" and edit per-species
At the bottom of the Biochemical tab, check multiple Species and click to open the per-species editor for this zone.
Typical per-zone workflows
- Source zone β set initial PCE concentration to 100 ppm, leave TCE/DCE/VC at 0 (they'll appear only as daughter products of the decay chain).
- Treatment zone β specify an accelerated decay rate to represent soil amendments or in-situ chemical oxidation.
- Tight clay lens β specify high retardation factor to represent matrix diffusion that the overall dual-domain model doesn't capture.
- Seaward coast (in combination with density flow) β set constant saltwater concentration as a boundary condition.
11Run the Simulation and View Results
Step 8 β Simulate
Click . With density flow + multi-species + transient flow all active, this is the heaviest IGW-NET simulation you can run. Expect it to be slower than a standalone transport run β SEAWAT is solving flow, MT3D is solving transport, and the coupling runs multiple times per step. For a modest 2D model, expect a few minutes; for large 3D models with chain reactions, expect tens of minutes.
Step 9 β Visualize results
While the simulation runs and after it completes, use any of these tools to visualize:
- Map view β default; shows head contours + concentration colormap. Select species and time via top-bar dropdowns.
- Cross-section β click β , draw a line on the map. Essential for seeing the saltwater wedge in vertical section.
- Display Charts β breakthrough curves at monitoring wells, plotted as time series for each species.
- 3D visualization β see Tutorial 25 β 3D Flow Visualization to render the plume in 3D with head contours.
Uncertainty quantification
If your rate coefficients, boundary concentrations, or recharge rates are uncertain, wrap the whole workflow in Monte Carlo simulation β see Tutorial 17 β Monte Carlo Transport. The realtime multi-species setup works inside the MC loop just like any other simulation.
12Challenges and Best Practices
Density-flow + reactive-transport is the most numerically demanding workflow in IGW-NET. Here's what can go wrong and how to handle it.
SEAWAT instability
The USGS SEAWAT V4 executable has known stability issues on certain configurations β convergence stalls, NaN propagation, or runaway iterations. Symptoms include:
- Simulation hangs on one timestep with high iteration count
- Concentrations explode to unphysical values (10βΉ ppm or similar)
- Heads go NaN and the whole solve fails
Workarounds:
- Switch to MODFLOW-6 in the SWT Solver dialog. Its density coupling is better-behaved and it's the path USGS is actively maintaining.
- Switch flow-transport coupling from explicit to iterative (Picard) in the SWT dialog.
- Lower the initial transport substep (try 0.001 instead of 0.01).
- Increase Max Iteration in the MT3D solver settings.
Timestep sensitivity
Variable-density flow requires timesteps that are just right:
- Too long β density changes too much between flow updates; the one-step lag becomes inaccurate; solver may diverge
- Too short β each step shows no meaningful density-driven flow change; simulation is wastefully slow
Start with a timestep around Ξt β (cell size) / (10 Γ flow velocity). If it converges cleanly, try larger steps. If it's unstable, halve the timestep and try again.
Initial conditions matter
Because density coupling is sensitive, a bad initial condition can make the first few timesteps unstable. For saltwater intrusion problems:
- Start with a known-steady-state density distribution (run a long initialization run with density coupling enabled, save, reload)
- Or start with uniformly fresh water and let the saltwater boundary propagate the wedge naturally β this is slower but more stable
- Does the flow alone converge? Disable Density Flow and MT3D; run flow only.
- Does transport alone converge? Disable Density Flow; run MT3D + flow without coupling.
- Does density alone converge with a single species? Re-enable Density Flow but set to a single conservative tracer.
- Add chain reactions last.
13Where to Go Next
You've now covered the full transport stack in IGW-NET. A few cross-reference directions depending on what you want to build:
Other IGW-NET Quick Tutorials
- Tutorial 5 β Contaminant Transport β single-species starting point
- Tutorial 17 β Monte Carlo Transport β uncertainty quantification on top of any transport run
- Tutorial 27 β DataNET Groundwater Model β data preprocessing for real-world sites
- Tutorial 29 β MT3D Advection Solvers β choosing MMOC/FDM/MOC/HMOC/ULTIMATE
- Tutorial 30 β Multi-Species (Post-Analysis) β steady-flow alternative to this tutorial
Reference material
- IGW-NET Users' Reference Manual β detailed conceptual chapters
- Pinder Beginner's Manual β gentler mathematical background on transport and density flow
- IGW-NET Realtime Help β in-context help for every UI dialog
- β short procedures for common tasks
Other platforms
- DataNET β geospatial data preparation (DEMs, boreholes, interpolation)
- SwaNET β watershed-scale surface-water modeling (SWAT-based)
- StormNET β stormwater modeling (SWMM-based)
- ConduitNET β water distribution network modeling (EPANET-based)
External documentation
- USGS SEAWAT β the original solver reference
- USGS MODFLOW-6 β current USGS model with Groundwater Transport (GWT)
- USGS MT3D-USGS β full parameter reference