A compact groundwater-modeling portfolio project focused on practical MODFLOW 6 model building with FloPy. CPT data are used to support a simplified hydrostratigraphic interpretation, define model layers, and assign transparent scenario-based hydraulic conductivity values for a three-layer dewatering model.
This is a conceptual portfolio model, not a calibrated site model.
The pumping-only drawdown was calculated by comparing two separate MODFLOW simulations:
drawdown = head_without_pumping - head_with_pumping
This removes the effect of the regional hydraulic gradient and isolates the drawdown caused by the pumping wells.
Base-case result:
Maximum pumping-only drawdown ≈ 0.87 m
A sensitivity test was performed by changing the hydraulic conductivity of Layer 3. The result shows that the simulated drawdown is strongly controlled by the K value assigned to the deeper sandy layer.
| Layer 3 K (m/day) | Maximum pumping-only drawdown (m) |
|---|---|
| 5 | 1.60 |
| 10 | 0.87 |
| 20 | 0.46 |
Lower hydraulic conductivity leads to higher drawdown, while higher hydraulic conductivity leads to lower drawdown.
The CPT profiles were used to define a simplified three-layer hydrostratigraphic concept:
| Layer | Depth interval | Conceptual interpretation |
|---|---|---|
| 1 | 0–4 m | Shallow mixed / loose material |
| 2 | 4–10 m | Intermediate sandy-silty material |
| 3 | 10–19 m | Deeper, denser sandy layer |
The interpretation is simplified and intended for conceptual groundwater model building.
The simulated head field shows a regional gradient from the left constant-head boundary to the right constant-head boundary, with local drawdown around the pumping wells.
This project was designed to demonstrate practical groundwater model-building skills:
- processing CPT data in Python
- calculating CPT indicators such as cone resistance
qc, sleeve frictionfs, and friction ratioRf - interpreting simplified hydrostratigraphic layers
- building a three-layer MODFLOW 6 groundwater-flow model with FloPy
- assigning transparent CPT-index-based scenario K values
- simulating dewatering wells
- checking the water budget
- calculating pumping-only drawdown
- testing sensitivity to hydraulic conductivity
The CPT data used in this project are based on publicly available USGS cone penetration test data from the Pajaro site.
The raw CPT files were processed in Python to extract and clean the main CPT parameters used in this conceptual workflow:
depth
cone resistance qc
sleeve friction fs
friction ratio Rf
The data are used only as supporting information for simplified hydrostratigraphic interpretation and conceptual MODFLOW model building. No proprietary or confidential project data are used.
The hydraulic conductivity values are not calibrated field K values and are not directly derived from a formal CPT-to-K correlation.
Instead, the model uses a transparent CPT-index-based ranking approach. For each interpreted layer, the median cone resistance qc and median friction ratio Rf are calculated. Then a relative CPT permeability indicator is computed:
K_index = median(qc / (Rf + 0.5))
The logic is:
higher qc + lower Rf → more sandy / more permeable behavior
lower qc or higher Rf → finer / less permeable behavior
The three layers are ranked by K_index, and scenario K values are assigned as low, medium, and high permeability classes.
Base-case CPT-index results:
| Layer | qc median (MPa) | Rf median (%) | K_index | Assigned K (m/day) |
|---|---|---|---|---|
| 1 | 2.11 | 1.06 | 1.52 | 1 |
| 2 | 5.50 | 0.60 | 5.36 | 3 |
| 3 | 7.32 | 0.65 | 7.23 | 10 |
This makes the workflow CPT-informed, while keeping the hydraulic conductivity values transparent, scenario-based, and suitable for conceptual MODFLOW model building.
| Item | Value |
|---|---|
| Model code | MODFLOW 6 |
| Python interface | FloPy |
| Domain size | 300 m × 300 m |
| Grid | 60 rows × 60 columns |
| Layers | 3 |
| Top elevation | 0 m |
| Bottom elevations | -4 m, -10 m, -19 m |
| Simulation time | 365 days |
| Recharge | 0.0003 m/day |
| Left boundary head | -1 m |
| Right boundary head | -3 m |
| Total pumping rate | 180 m³/day |
Three pumping wells are placed in Layer 3:
| Well | Pumping rate (m³/day) |
|---|---|
| 1 | -80 |
| 2 | -60 |
| 3 | -40 |
The water budget confirms that the pumping demand is mainly supplied by recharge and constant-head boundary inflow.
Example base-case budget:
| Budget term | Flow (m³/day) |
|---|---|
| Constant head | +151.2 |
| Recharge | +26.1 |
| Wells | -180.0 |
This confirms that the model response is numerically consistent for the conceptual dewatering scenario.
Install the required Python packages:
pip install -r requirements.txtRun the main model script:
python 01_cpt_informed_modflow_model.pyThe script tries to find the MODFLOW 6 executable in this order:
1. MF6_EXE environment variable
2. mf6 available in system PATH
3. local Windows fallback path
If MODFLOW 6 is not found, install MODFLOW 6 and either add it to PATH or set the MF6_EXE environment variable.
data/
figures/
notebooks/
01_cpt_informed_modflow_model.py
02_pumping_drawdown_comparison.py
03_sensitivity_k_layer3.py
04_sensitivity_summary_plot.py
README.md
requirements.txt
Main output figures:
figures/pumping_only_drawdown_layer3.png
figures/sensitivity_k_layer3_drawdown.png
figures/cpt_profiles_with_layers.png
figures/head_with_recharge_and_wells_layer3.png
This is a conceptual portfolio model, not a calibrated site model.
Main limitations:
- CPT interpretation is simplified.
- Hydraulic conductivity values are approximate scenario parameters.
- K values are assigned from a relative CPT-index ranking, not from calibrated field permeability tests.
- Boundary conditions are simplified.
- No groundwater-level calibration is included.
- No pumping-test or slug-test calibration is included.
The purpose of this project is to demonstrate a practical workflow for connecting CPT-supported hydrostratigraphic interpretation with MODFLOW 6 groundwater-flow and dewatering modeling using Python and FloPy.
The emphasis is on practical model building, transparent assumptions, water-budget checking, pumping-only drawdown analysis, and sensitivity testing.



