Skip to content

Atlas 14 Spatial Variance Analysis

This notebook demonstrates how to analyze spatial variability of NOAA Atlas 14 precipitation frequency estimates within a HEC-RAS model domain. This helps determine whether uniform rainfall assumptions are appropriate for rain-on-grid modeling.

Key Features: - Remote access to NOAA Atlas 14 CONUS data via HTTP range requests (99.9% data reduction) - Integration with HEC-RAS 2D flow area extents - Variance statistics (min, max, mean, range) for precipitation frequency - Decision support for uniform vs. spatially distributed rainfall

When to use this analysis: - Before rain-on-grid modeling to assess uniformity assumptions - For large model domains (>100 sq mi) where spatial variance may be significant - When comparing multiple design storm events

Python
# =============================================================================
# DEVELOPMENT MODE TOGGLE
# =============================================================================
USE_LOCAL_SOURCE = False  # <-- TOGGLE THIS

if USE_LOCAL_SOURCE:
    import sys
    from pathlib import Path
    local_path = str(Path.cwd().parent)
    if local_path not in sys.path:
        sys.path.insert(0, local_path)
    print(f"📁 LOCAL SOURCE MODE: Loading from {local_path}/ras_commander")
else:
    print("📦 PIP PACKAGE MODE: Loading installed ras-commander")

import ras_commander
print(f"✓ Loaded: {ras_commander.__file__}")
Text Only
📦 PIP PACKAGE MODE: Loading installed ras-commander
✓ Loaded: C:\Users\bill\AppData\Roaming\Python\Python313\site-packages\ras_commander\__init__.py

1. Direct Bounds Query

First, let's demonstrate querying Atlas 14 data for a specific geographic area without a HEC-RAS project. This is useful for exploring data availability and understanding precipitation patterns.

Python
from ras_commander.precip import Atlas14Grid

# Query Atlas 14 data for Houston, TX area
# This uses HTTP range requests to download only the needed data
pfe = Atlas14Grid.get_pfe_for_bounds(
    bounds=(-95.5, 29.5, -95.0, 30.0),  # (west, south, east, north)
    durations=[6, 12, 24],
    return_periods=[10, 50, 100],
    buffer_percent=0
)

print(f"Bounds: {pfe['bounds']}")
print(f"Grid dimensions: {pfe['lat'].shape[0]} x {pfe['lon'].shape[0]}")
print(f"Durations: {pfe['durations']} hours")
print(f"Return periods: {pfe['return_periods']} years")
Text Only
2026-01-25 17:10:46 - ras_commander.precip.Atlas14Grid - INFO - Loading Atlas 14 coordinate arrays from remote file...
2026-01-25 17:10:46 - ras_commander.precip.Atlas14Grid - INFO - Loading Atlas 14 coordinate arrays from remote file...
2026-01-25 17:10:59 - ras_commander.precip.Atlas14Grid - INFO - Loaded coordinates: lat=3121, lon=7081, ari=9
2026-01-25 17:10:59 - ras_commander.precip.Atlas14Grid - INFO - Loaded coordinates: lat=3121, lon=7081, ari=9
2026-01-25 17:10:59 - ras_commander.precip.Atlas14Grid - INFO - Extracting Atlas 14 data for bounds (-95.5000, 29.5000, -95.0000, 30.0000): lat[661:721], lon[3541:3601]
2026-01-25 17:10:59 - ras_commander.precip.Atlas14Grid - INFO - Extracting Atlas 14 data for bounds (-95.5000, 29.5000, -95.0000, 30.0000): lat[661:721], lon[3541:3601]
2026-01-25 17:11:04 - ras_commander.precip.Atlas14Grid - INFO - Data transfer: 189.8 KB (vs 1138.1 MB full grid, 100.0% reduction)
2026-01-25 17:11:04 - ras_commander.precip.Atlas14Grid - INFO - Data transfer: 189.8 KB (vs 1138.1 MB full grid, 100.0% reduction)


Bounds: (-95.5, 29.5, -95.0, 30.0)
Grid dimensions: 60 x 60
Durations: [6, 12, 24] hours
Return periods: [10, 50, 100] years
Python
import numpy as np

# Examine the 100-year, 24-hour precipitation
data_24hr = pfe['pfe_24hr']
ari = pfe['ari']

# Find index for 100-year (ARI dimension is last)
ari_100_idx = np.argmin(np.abs(ari - 100))

data_100yr_24hr = data_24hr[:, :, ari_100_idx]

print(f"100-year, 24-hour precipitation:")
print(f"  Min: {np.nanmin(data_100yr_24hr):.2f} inches")
print(f"  Max: {np.nanmax(data_100yr_24hr):.2f} inches")
print(f"  Mean: {np.nanmean(data_100yr_24hr):.2f} inches")
print(f"  Range: {np.nanmax(data_100yr_24hr) - np.nanmin(data_100yr_24hr):.2f} inches")
print(f"  Range %: {(np.nanmax(data_100yr_24hr) - np.nanmin(data_100yr_24hr)) / np.nanmin(data_100yr_24hr) * 100:.1f}%")
Text Only
100-year, 24-hour precipitation:
  Min: 16.49 inches
  Max: 18.20 inches
  Mean: 17.46 inches
  Range: 1.71 inches
  Range %: 10.4%

2. Visualize Spatial Variability

Python
import matplotlib.pyplot as plt

# Create a simple visualization of spatial variability
fig, axes = plt.subplots(1, 3, figsize=(15, 4))

for idx, duration in enumerate([6, 12, 24]):
    data = pfe[f'pfe_{duration}hr'][:, :, ari_100_idx]

    ax = axes[idx]
    im = ax.imshow(data, origin='lower', 
                   extent=[pfe['lon'].min(), pfe['lon'].max(),
                          pfe['lat'].min(), pfe['lat'].max()],
                   cmap='Blues')
    plt.colorbar(im, ax=ax, label='Depth (inches)')
    ax.set_title(f'100-yr, {duration}-hr')
    ax.set_xlabel('Longitude')
    ax.set_ylabel('Latitude')

plt.suptitle('Atlas 14 Precipitation Frequency - Houston Area', fontsize=12)
plt.tight_layout()
plt.show()

png

3. Point Query for Single Location

For quick lookups at a specific location:

Python
# Get PFE for a single point (downtown Houston)
point_df = Atlas14Grid.get_point_pfe(
    lat=29.76,
    lon=-95.37,
    durations=[6, 12, 24],
    return_periods=[10, 25, 50, 100, 500]
)

print("Point Precipitation Frequency Estimates (Houston, TX):")
point_df_pivot = point_df.pivot(
    index='duration_hr',
    columns='return_period_yr',
    values='depth_inches'
)
print(point_df_pivot.round(2))
Text Only
2026-01-25 17:11:04 - ras_commander.precip.Atlas14Grid - INFO - Point (29.7600, -95.3700) -> nearest grid (29.7583, -95.3667)
2026-01-25 17:11:04 - ras_commander.precip.Atlas14Grid - INFO - Point (29.7600, -95.3700) -> nearest grid (29.7583, -95.3667)


Point Precipitation Frequency Estimates (Houston, TX):
return_period_yr   10     25     50     100    500
duration_hr                                       
6                 6.15   7.97   9.56  11.41  16.95
12                7.39   9.69  11.72  14.11  21.22
24                8.75  11.56  14.07  17.00  25.46

4. Integration with HEC-RAS Project

The most powerful feature is automatic integration with HEC-RAS projects. The get_pfe_from_project() method extracts the extent from your geometry HDF file and downloads only the needed data.

Note: This example uses a sample project. Replace with your actual project path.

Python
from ras_commander import RasExamples, init_ras_project

# Extract an example project with 2D flow areas
project_path = RasExamples.extract_project("BaldEagleCrkMulti2D", suffix="atlas14_variance")
print(f"Project extracted to: {project_path}")

# Initialize project
ras = init_ras_project(project_path, ras_version="6.6")
print(f"\nProject: {ras.project_name}")
print(f"Geometry files: {len(ras.geom_df)}")
Text Only
2026-01-25 17:11:09 - ras_commander.RasExamples - INFO - Found zip file: C:\Users\bill\AppData\Local\ras-commander\examples\Example_Projects_6_6.zip
2026-01-25 17:11:09 - ras_commander.RasExamples - INFO - Found zip file: C:\Users\bill\AppData\Local\ras-commander\examples\Example_Projects_6_6.zip
2026-01-25 17:11:09 - ras_commander.RasExamples - INFO - Loading project data from CSV...
2026-01-25 17:11:09 - ras_commander.RasExamples - INFO - Loading project data from CSV...
2026-01-25 17:11:09 - ras_commander.RasExamples - INFO - Loaded 68 projects from CSV.
2026-01-25 17:11:09 - ras_commander.RasExamples - INFO - Loaded 68 projects from CSV.
2026-01-25 17:11:09 - ras_commander.RasExamples - INFO - ----- RasExamples Extracting Project -----
2026-01-25 17:11:09 - ras_commander.RasExamples - INFO - ----- RasExamples Extracting Project -----
2026-01-25 17:11:09 - ras_commander.RasExamples - INFO - Extracting project 'BaldEagleCrkMulti2D' as 'BaldEagleCrkMulti2D_atlas14_variance'
2026-01-25 17:11:09 - ras_commander.RasExamples - INFO - Extracting project 'BaldEagleCrkMulti2D' as 'BaldEagleCrkMulti2D_atlas14_variance'
2026-01-25 17:11:11 - ras_commander.RasExamples - INFO - Successfully extracted project 'BaldEagleCrkMulti2D' to c:\GH\ras-commander\examples\example_projects\BaldEagleCrkMulti2D_atlas14_variance
2026-01-25 17:11:11 - ras_commander.RasExamples - INFO - Successfully extracted project 'BaldEagleCrkMulti2D' to c:\GH\ras-commander\examples\example_projects\BaldEagleCrkMulti2D_atlas14_variance
2026-01-25 17:11:11 - ras_commander.geom.GeomLateral - INFO - Found 0 lateral structures in BaldEagleDamBrk.g06
2026-01-25 17:11:11 - ras_commander.geom.GeomLateral - INFO - Found 0 lateral structures in BaldEagleDamBrk.g06
2026-01-25 17:11:11 - ras_commander.geom.GeomLateral - INFO - Found 0 SA/2D connections in BaldEagleDamBrk.g06
2026-01-25 17:11:11 - ras_commander.geom.GeomLateral - INFO - Found 0 SA/2D connections in BaldEagleDamBrk.g06
2026-01-25 17:11:11 - ras_commander.geom.GeomLateral - INFO - Found 0 lateral structures in BaldEagleDamBrk.g08
2026-01-25 17:11:11 - ras_commander.geom.GeomLateral - INFO - Found 0 lateral structures in BaldEagleDamBrk.g08
2026-01-25 17:11:11 - ras_commander.geom.GeomLateral - INFO - Found 0 SA/2D connections in BaldEagleDamBrk.g08
2026-01-25 17:11:11 - ras_commander.geom.GeomLateral - INFO - Found 0 SA/2D connections in BaldEagleDamBrk.g08
2026-01-25 17:11:11 - ras_commander.geom.GeomLateral - INFO - Found 0 lateral structures in BaldEagleDamBrk.g10
2026-01-25 17:11:11 - ras_commander.geom.GeomLateral - INFO - Found 0 lateral structures in BaldEagleDamBrk.g10
2026-01-25 17:11:11 - ras_commander.geom.GeomLateral - INFO - Found 0 SA/2D connections in BaldEagleDamBrk.g10
2026-01-25 17:11:11 - ras_commander.geom.GeomLateral - INFO - Found 0 SA/2D connections in BaldEagleDamBrk.g10
2026-01-25 17:11:11 - ras_commander.geom.GeomLateral - INFO - Found 0 lateral structures in BaldEagleDamBrk.g11
2026-01-25 17:11:11 - ras_commander.geom.GeomLateral - INFO - Found 0 lateral structures in BaldEagleDamBrk.g11
2026-01-25 17:11:11 - ras_commander.geom.GeomLateral - INFO - Found 0 SA/2D connections in BaldEagleDamBrk.g11
2026-01-25 17:11:11 - ras_commander.geom.GeomLateral - INFO - Found 0 SA/2D connections in BaldEagleDamBrk.g11
2026-01-25 17:11:11 - ras_commander.geom.GeomLateral - INFO - Found 0 lateral structures in BaldEagleDamBrk.g12
2026-01-25 17:11:11 - ras_commander.geom.GeomLateral - INFO - Found 0 lateral structures in BaldEagleDamBrk.g12
2026-01-25 17:11:11 - ras_commander.geom.GeomLateral - INFO - Found 0 SA/2D connections in BaldEagleDamBrk.g12
2026-01-25 17:11:11 - ras_commander.geom.GeomLateral - INFO - Found 0 SA/2D connections in BaldEagleDamBrk.g12
2026-01-25 17:11:11 - ras_commander.geom.GeomLateral - INFO - Found 0 lateral structures in BaldEagleDamBrk.g09
2026-01-25 17:11:11 - ras_commander.geom.GeomLateral - INFO - Found 0 lateral structures in BaldEagleDamBrk.g09
2026-01-25 17:11:11 - ras_commander.geom.GeomLateral - INFO - Found 0 SA/2D connections in BaldEagleDamBrk.g09
2026-01-25 17:11:11 - ras_commander.geom.GeomLateral - INFO - Found 0 SA/2D connections in BaldEagleDamBrk.g09
2026-01-25 17:11:11 - ras_commander.geom.GeomLateral - INFO - Found 0 lateral structures in BaldEagleDamBrk.g13
2026-01-25 17:11:11 - ras_commander.geom.GeomLateral - INFO - Found 0 lateral structures in BaldEagleDamBrk.g13
2026-01-25 17:11:11 - ras_commander.geom.GeomLateral - INFO - Found 0 SA/2D connections in BaldEagleDamBrk.g13
2026-01-25 17:11:11 - ras_commander.geom.GeomLateral - INFO - Found 0 SA/2D connections in BaldEagleDamBrk.g13
2026-01-25 17:11:11 - ras_commander.geom.GeomLateral - INFO - Found 0 lateral structures in BaldEagleDamBrk.g01
2026-01-25 17:11:11 - ras_commander.geom.GeomLateral - INFO - Found 0 lateral structures in BaldEagleDamBrk.g01
2026-01-25 17:11:11 - ras_commander.geom.GeomLateral - INFO - Found 0 SA/2D connections in BaldEagleDamBrk.g01
2026-01-25 17:11:11 - ras_commander.geom.GeomLateral - INFO - Found 0 SA/2D connections in BaldEagleDamBrk.g01
2026-01-25 17:11:11 - ras_commander.geom.GeomLateral - INFO - Found 0 lateral structures in BaldEagleDamBrk.g03


Project extracted to: c:\GH\ras-commander\examples\example_projects\BaldEagleCrkMulti2D_atlas14_variance


2026-01-25 17:11:11 - ras_commander.geom.GeomLateral - INFO - Found 0 lateral structures in BaldEagleDamBrk.g03
2026-01-25 17:11:11 - ras_commander.geom.GeomLateral - INFO - Found 0 SA/2D connections in BaldEagleDamBrk.g03
2026-01-25 17:11:11 - ras_commander.geom.GeomLateral - INFO - Found 0 SA/2D connections in BaldEagleDamBrk.g03
2026-01-25 17:11:11 - ras_commander.geom.GeomLateral - INFO - Found 0 lateral structures in BaldEagleDamBrk.g02
2026-01-25 17:11:11 - ras_commander.geom.GeomLateral - INFO - Found 0 lateral structures in BaldEagleDamBrk.g02
2026-01-25 17:11:11 - ras_commander.geom.GeomLateral - INFO - Found 0 SA/2D connections in BaldEagleDamBrk.g02
2026-01-25 17:11:11 - ras_commander.geom.GeomLateral - INFO - Found 0 SA/2D connections in BaldEagleDamBrk.g02
2026-01-25 17:11:11 - ras_commander.RasMap - INFO - Successfully parsed RASMapper file: C:\GH\ras-commander\examples\example_projects\BaldEagleCrkMulti2D_atlas14_variance\BaldEagleDamBrk.rasmap
2026-01-25 17:11:11 - ras_commander.RasMap - INFO - Successfully parsed RASMapper file: C:\GH\ras-commander\examples\example_projects\BaldEagleCrkMulti2D_atlas14_variance\BaldEagleDamBrk.rasmap
2026-01-25 17:11:11 - ras_commander.RasPrj - INFO - Updated results_df with 11 plan(s)
2026-01-25 17:11:11 - ras_commander.RasPrj - INFO - Updated results_df with 11 plan(s)



Project: BaldEagleDamBrk
Geometry files: 10
Python
from pathlib import Path

# Find the geometry HDF file
geom_hdfs = list(project_path.glob("*.g*.hdf"))
if geom_hdfs:
    geom_hdf = geom_hdfs[0]
    print(f"Geometry HDF: {geom_hdf.name}")
else:
    print("No geometry HDF found")
    geom_hdf = None
Text Only
Geometry HDF: BaldEagleDamBrk.g01.hdf
Python
if geom_hdf:
    # Get Atlas 14 data using 2D flow area extent
    pfe_project = Atlas14Grid.get_pfe_from_project(
        geom_hdf=geom_hdf,
        extent_source="2d_flow_area",  # Use 2D flow areas
        durations=[6, 12, 24],
        return_periods=[10, 25, 50, 100],
        buffer_percent=10.0,
        ras_object=ras
    )

    print(f"Extent source: {pfe_project['extent_source']}")
    print(f"Bounds: {pfe_project['bounds']}")
    print(f"Grid dimensions: {pfe_project['lat'].shape[0]} x {pfe_project['lon'].shape[0]}")
    if 'mesh_area_names' in pfe_project:
        print(f"2D Areas: {pfe_project['mesh_area_names']}")
Text Only
2026-01-25 17:11:11 - ras_commander.precip.Atlas14Grid - INFO - Extracting extent from c:\GH\ras-commander\examples\example_projects\BaldEagleCrkMulti2D_atlas14_variance\BaldEagleDamBrk.g01.hdf using 2d_flow_area
2026-01-25 17:11:11 - ras_commander.precip.Atlas14Grid - INFO - Extracting extent from c:\GH\ras-commander\examples\example_projects\BaldEagleCrkMulti2D_atlas14_variance\BaldEagleDamBrk.g01.hdf using 2d_flow_area
2026-01-25 17:11:11 - ras_commander.hdf.HdfMesh - INFO - Using existing Path object HDF file: c:\GH\ras-commander\examples\example_projects\BaldEagleCrkMulti2D_atlas14_variance\BaldEagleDamBrk.g01.hdf
2026-01-25 17:11:11 - ras_commander.hdf.HdfMesh - INFO - Using existing Path object HDF file: c:\GH\ras-commander\examples\example_projects\BaldEagleCrkMulti2D_atlas14_variance\BaldEagleDamBrk.g01.hdf
2026-01-25 17:11:11 - ras_commander.hdf.HdfMesh - INFO - Final validated file path: c:\GH\ras-commander\examples\example_projects\BaldEagleCrkMulti2D_atlas14_variance\BaldEagleDamBrk.g01.hdf
2026-01-25 17:11:11 - ras_commander.hdf.HdfMesh - INFO - Final validated file path: c:\GH\ras-commander\examples\example_projects\BaldEagleCrkMulti2D_atlas14_variance\BaldEagleDamBrk.g01.hdf
2026-01-25 17:11:11 - ras_commander.hdf.HdfMesh - INFO - Using existing Path object HDF file: c:\GH\ras-commander\examples\example_projects\BaldEagleCrkMulti2D_atlas14_variance\BaldEagleDamBrk.g01.hdf
2026-01-25 17:11:11 - ras_commander.hdf.HdfMesh - INFO - Using existing Path object HDF file: c:\GH\ras-commander\examples\example_projects\BaldEagleCrkMulti2D_atlas14_variance\BaldEagleDamBrk.g01.hdf
2026-01-25 17:11:11 - ras_commander.hdf.HdfMesh - INFO - Final validated file path: c:\GH\ras-commander\examples\example_projects\BaldEagleCrkMulti2D_atlas14_variance\BaldEagleDamBrk.g01.hdf
2026-01-25 17:11:11 - ras_commander.hdf.HdfMesh - INFO - Final validated file path: c:\GH\ras-commander\examples\example_projects\BaldEagleCrkMulti2D_atlas14_variance\BaldEagleDamBrk.g01.hdf
2026-01-25 17:11:11 - ras_commander.hdf.HdfBase - INFO - Using HDF file from h5py.File object: c:\GH\ras-commander\examples\example_projects\BaldEagleCrkMulti2D_atlas14_variance\BaldEagleDamBrk.g01.hdf
2026-01-25 17:11:11 - ras_commander.hdf.HdfBase - INFO - Using HDF file from h5py.File object: c:\GH\ras-commander\examples\example_projects\BaldEagleCrkMulti2D_atlas14_variance\BaldEagleDamBrk.g01.hdf
2026-01-25 17:11:11 - ras_commander.hdf.HdfBase - INFO - Final validated file path: c:\GH\ras-commander\examples\example_projects\BaldEagleCrkMulti2D_atlas14_variance\BaldEagleDamBrk.g01.hdf
2026-01-25 17:11:11 - ras_commander.hdf.HdfBase - INFO - Final validated file path: c:\GH\ras-commander\examples\example_projects\BaldEagleCrkMulti2D_atlas14_variance\BaldEagleDamBrk.g01.hdf
2026-01-25 17:11:11 - ras_commander.hdf.HdfBase - INFO - Found projection in RASMapper file: c:\GH\ras-commander\examples\example_projects\BaldEagleCrkMulti2D_atlas14_variance\Terrain\Projection.prj
2026-01-25 17:11:11 - ras_commander.hdf.HdfBase - INFO - Found projection in RASMapper file: c:\GH\ras-commander\examples\example_projects\BaldEagleCrkMulti2D_atlas14_variance\Terrain\Projection.prj
2026-01-25 17:11:11 - ras_commander.hdf.HdfBase - INFO - Converted WKT to EPSG:2271 from RASMapper file Projection.prj
2026-01-25 17:11:11 - ras_commander.hdf.HdfBase - INFO - Converted WKT to EPSG:2271 from RASMapper file Projection.prj
2026-01-25 17:11:11 - ras_commander.precip.Atlas14Grid - INFO - 2D flow area bounds: W=-77.6324, S=41.0459, E=-77.3275, N=41.1842
2026-01-25 17:11:11 - ras_commander.precip.Atlas14Grid - INFO - 2D flow area bounds: W=-77.6324, S=41.0459, E=-77.3275, N=41.1842
2026-01-25 17:11:11 - ras_commander.precip.Atlas14Grid - INFO - Extracting Atlas 14 data for bounds (-77.6629, 41.0321, -77.2970, 41.1980): lat[2044:2064], lon[5681:5725]
2026-01-25 17:11:11 - ras_commander.precip.Atlas14Grid - INFO - Extracting Atlas 14 data for bounds (-77.6629, 41.0321, -77.2970, 41.1980): lat[2044:2064], lon[5681:5725]
2026-01-25 17:11:20 - ras_commander.precip.Atlas14Grid - INFO - Data transfer: 46.4 KB (vs 1138.1 MB full grid, 100.0% reduction)
2026-01-25 17:11:20 - ras_commander.precip.Atlas14Grid - INFO - Data transfer: 46.4 KB (vs 1138.1 MB full grid, 100.0% reduction)


Extent source: 2d_flow_area
Bounds: (np.float64(-77.6628709426164), np.float64(41.03210835058915), np.float64(-77.2970389985552), np.float64(41.197997263936664))
Grid dimensions: 20 x 44
2D Areas: ['BaldEagleCr']

5. Full Variance Analysis

The Atlas14Variance class provides comprehensive variance analysis:

Python
from ras_commander.precip import Atlas14Variance

if geom_hdf:
    # Run full variance analysis
    results = Atlas14Variance.analyze(
        geom_hdf=geom_hdf,
        durations=[6, 12, 24],
        return_periods=[10, 25, 50, 100],
        extent_source="2d_flow_area",
        variance_denominator='min',  # range_pct = (max-min)/min * 100
        ras_object=ras
    )

    print("\nVariance Analysis Results:")
    print(results.to_string(index=False))
Text Only
2026-01-25 17:11:20 - ras_commander.precip.Atlas14Variance - INFO - Starting Atlas 14 variance analysis for BaldEagleDamBrk.g01.hdf
2026-01-25 17:11:20 - ras_commander.precip.Atlas14Variance - INFO - Starting Atlas 14 variance analysis for BaldEagleDamBrk.g01.hdf
2026-01-25 17:11:20 - ras_commander.precip.Atlas14Variance - INFO - Durations: [6, 12, 24] hours, Return periods: [10, 25, 50, 100] years
2026-01-25 17:11:20 - ras_commander.precip.Atlas14Variance - INFO - Durations: [6, 12, 24] hours, Return periods: [10, 25, 50, 100] years
2026-01-25 17:11:20 - ras_commander.precip.Atlas14Grid - INFO - Extracting extent from c:\GH\ras-commander\examples\example_projects\BaldEagleCrkMulti2D_atlas14_variance\BaldEagleDamBrk.g01.hdf using 2d_flow_area
2026-01-25 17:11:20 - ras_commander.precip.Atlas14Grid - INFO - Extracting extent from c:\GH\ras-commander\examples\example_projects\BaldEagleCrkMulti2D_atlas14_variance\BaldEagleDamBrk.g01.hdf using 2d_flow_area
2026-01-25 17:11:20 - ras_commander.hdf.HdfMesh - INFO - Using existing Path object HDF file: c:\GH\ras-commander\examples\example_projects\BaldEagleCrkMulti2D_atlas14_variance\BaldEagleDamBrk.g01.hdf
2026-01-25 17:11:20 - ras_commander.hdf.HdfMesh - INFO - Using existing Path object HDF file: c:\GH\ras-commander\examples\example_projects\BaldEagleCrkMulti2D_atlas14_variance\BaldEagleDamBrk.g01.hdf
2026-01-25 17:11:20 - ras_commander.hdf.HdfMesh - INFO - Final validated file path: c:\GH\ras-commander\examples\example_projects\BaldEagleCrkMulti2D_atlas14_variance\BaldEagleDamBrk.g01.hdf
2026-01-25 17:11:20 - ras_commander.hdf.HdfMesh - INFO - Final validated file path: c:\GH\ras-commander\examples\example_projects\BaldEagleCrkMulti2D_atlas14_variance\BaldEagleDamBrk.g01.hdf
2026-01-25 17:11:20 - ras_commander.hdf.HdfMesh - INFO - Using existing Path object HDF file: c:\GH\ras-commander\examples\example_projects\BaldEagleCrkMulti2D_atlas14_variance\BaldEagleDamBrk.g01.hdf
2026-01-25 17:11:20 - ras_commander.hdf.HdfMesh - INFO - Using existing Path object HDF file: c:\GH\ras-commander\examples\example_projects\BaldEagleCrkMulti2D_atlas14_variance\BaldEagleDamBrk.g01.hdf
2026-01-25 17:11:20 - ras_commander.hdf.HdfMesh - INFO - Final validated file path: c:\GH\ras-commander\examples\example_projects\BaldEagleCrkMulti2D_atlas14_variance\BaldEagleDamBrk.g01.hdf
2026-01-25 17:11:20 - ras_commander.hdf.HdfMesh - INFO - Final validated file path: c:\GH\ras-commander\examples\example_projects\BaldEagleCrkMulti2D_atlas14_variance\BaldEagleDamBrk.g01.hdf
2026-01-25 17:11:20 - ras_commander.hdf.HdfBase - INFO - Using HDF file from h5py.File object: c:\GH\ras-commander\examples\example_projects\BaldEagleCrkMulti2D_atlas14_variance\BaldEagleDamBrk.g01.hdf
2026-01-25 17:11:20 - ras_commander.hdf.HdfBase - INFO - Using HDF file from h5py.File object: c:\GH\ras-commander\examples\example_projects\BaldEagleCrkMulti2D_atlas14_variance\BaldEagleDamBrk.g01.hdf
2026-01-25 17:11:20 - ras_commander.hdf.HdfBase - INFO - Final validated file path: c:\GH\ras-commander\examples\example_projects\BaldEagleCrkMulti2D_atlas14_variance\BaldEagleDamBrk.g01.hdf
2026-01-25 17:11:20 - ras_commander.hdf.HdfBase - INFO - Final validated file path: c:\GH\ras-commander\examples\example_projects\BaldEagleCrkMulti2D_atlas14_variance\BaldEagleDamBrk.g01.hdf
2026-01-25 17:11:20 - ras_commander.hdf.HdfBase - INFO - Found projection in RASMapper file: c:\GH\ras-commander\examples\example_projects\BaldEagleCrkMulti2D_atlas14_variance\Terrain\Projection.prj
2026-01-25 17:11:20 - ras_commander.hdf.HdfBase - INFO - Found projection in RASMapper file: c:\GH\ras-commander\examples\example_projects\BaldEagleCrkMulti2D_atlas14_variance\Terrain\Projection.prj
2026-01-25 17:11:20 - ras_commander.hdf.HdfBase - INFO - Converted WKT to EPSG:2271 from RASMapper file Projection.prj
2026-01-25 17:11:20 - ras_commander.hdf.HdfBase - INFO - Converted WKT to EPSG:2271 from RASMapper file Projection.prj
2026-01-25 17:11:20 - ras_commander.precip.Atlas14Grid - INFO - 2D flow area bounds: W=-77.6324, S=41.0459, E=-77.3275, N=41.1842
2026-01-25 17:11:20 - ras_commander.precip.Atlas14Grid - INFO - 2D flow area bounds: W=-77.6324, S=41.0459, E=-77.3275, N=41.1842
2026-01-25 17:11:20 - ras_commander.precip.Atlas14Grid - INFO - Extracting Atlas 14 data for bounds (-77.6629, 41.0321, -77.2970, 41.1980): lat[2044:2064], lon[5681:5725]
2026-01-25 17:11:20 - ras_commander.precip.Atlas14Grid - INFO - Extracting Atlas 14 data for bounds (-77.6629, 41.0321, -77.2970, 41.1980): lat[2044:2064], lon[5681:5725]
2026-01-25 17:11:27 - ras_commander.precip.Atlas14Grid - INFO - Data transfer: 46.4 KB (vs 1138.1 MB full grid, 100.0% reduction)
2026-01-25 17:11:27 - ras_commander.precip.Atlas14Grid - INFO - Data transfer: 46.4 KB (vs 1138.1 MB full grid, 100.0% reduction)
2026-01-25 17:11:27 - ras_commander.hdf.HdfMesh - INFO - Using existing Path object HDF file: c:\GH\ras-commander\examples\example_projects\BaldEagleCrkMulti2D_atlas14_variance\BaldEagleDamBrk.g01.hdf
2026-01-25 17:11:27 - ras_commander.hdf.HdfMesh - INFO - Using existing Path object HDF file: c:\GH\ras-commander\examples\example_projects\BaldEagleCrkMulti2D_atlas14_variance\BaldEagleDamBrk.g01.hdf
2026-01-25 17:11:27 - ras_commander.hdf.HdfMesh - INFO - Final validated file path: c:\GH\ras-commander\examples\example_projects\BaldEagleCrkMulti2D_atlas14_variance\BaldEagleDamBrk.g01.hdf
2026-01-25 17:11:27 - ras_commander.hdf.HdfMesh - INFO - Final validated file path: c:\GH\ras-commander\examples\example_projects\BaldEagleCrkMulti2D_atlas14_variance\BaldEagleDamBrk.g01.hdf
2026-01-25 17:11:27 - ras_commander.hdf.HdfMesh - INFO - Using existing Path object HDF file: c:\GH\ras-commander\examples\example_projects\BaldEagleCrkMulti2D_atlas14_variance\BaldEagleDamBrk.g01.hdf
2026-01-25 17:11:27 - ras_commander.hdf.HdfMesh - INFO - Using existing Path object HDF file: c:\GH\ras-commander\examples\example_projects\BaldEagleCrkMulti2D_atlas14_variance\BaldEagleDamBrk.g01.hdf
2026-01-25 17:11:27 - ras_commander.hdf.HdfMesh - INFO - Final validated file path: c:\GH\ras-commander\examples\example_projects\BaldEagleCrkMulti2D_atlas14_variance\BaldEagleDamBrk.g01.hdf
2026-01-25 17:11:27 - ras_commander.hdf.HdfMesh - INFO - Final validated file path: c:\GH\ras-commander\examples\example_projects\BaldEagleCrkMulti2D_atlas14_variance\BaldEagleDamBrk.g01.hdf
2026-01-25 17:11:27 - ras_commander.hdf.HdfBase - INFO - Using HDF file from h5py.File object: c:\GH\ras-commander\examples\example_projects\BaldEagleCrkMulti2D_atlas14_variance\BaldEagleDamBrk.g01.hdf
2026-01-25 17:11:27 - ras_commander.hdf.HdfBase - INFO - Using HDF file from h5py.File object: c:\GH\ras-commander\examples\example_projects\BaldEagleCrkMulti2D_atlas14_variance\BaldEagleDamBrk.g01.hdf
2026-01-25 17:11:27 - ras_commander.hdf.HdfBase - INFO - Final validated file path: c:\GH\ras-commander\examples\example_projects\BaldEagleCrkMulti2D_atlas14_variance\BaldEagleDamBrk.g01.hdf
2026-01-25 17:11:27 - ras_commander.hdf.HdfBase - INFO - Final validated file path: c:\GH\ras-commander\examples\example_projects\BaldEagleCrkMulti2D_atlas14_variance\BaldEagleDamBrk.g01.hdf
2026-01-25 17:11:27 - ras_commander.hdf.HdfBase - INFO - Found projection in RASMapper file: c:\GH\ras-commander\examples\example_projects\BaldEagleCrkMulti2D_atlas14_variance\Terrain\Projection.prj
2026-01-25 17:11:27 - ras_commander.hdf.HdfBase - INFO - Found projection in RASMapper file: c:\GH\ras-commander\examples\example_projects\BaldEagleCrkMulti2D_atlas14_variance\Terrain\Projection.prj
2026-01-25 17:11:27 - ras_commander.hdf.HdfBase - INFO - Converted WKT to EPSG:2271 from RASMapper file Projection.prj
2026-01-25 17:11:27 - ras_commander.hdf.HdfBase - INFO - Converted WKT to EPSG:2271 from RASMapper file Projection.prj
2026-01-25 17:11:27 - ras_commander.precip.Atlas14Variance - INFO - Analyzing mesh area: BaldEagleCr
2026-01-25 17:11:27 - ras_commander.precip.Atlas14Variance - INFO - Analyzing mesh area: BaldEagleCr
2026-01-25 17:11:27 - ras_commander.precip.Atlas14Variance - INFO - Variance analysis complete: max range = 7.1%, mean range = 4.9%
2026-01-25 17:11:27 - ras_commander.precip.Atlas14Variance - INFO - Variance analysis complete: max range = 7.1%, mean range = 4.9%



Variance Analysis Results:
  mesh_area  duration_hr  return_period_yr  min_inches  max_inches  mean_inches  range_inches  range_pct  cell_count
BaldEagleCr            6                10        2.49        2.59     2.534113          0.10   4.016060         124
BaldEagleCr            6                25        2.95        3.08     3.003226          0.13   4.406775         124
BaldEagleCr            6                50        3.31        3.49     3.388387          0.18   5.438069         124
BaldEagleCr            6               100        3.68        3.94     3.794839          0.26   7.065217         124
BaldEagleCr           12                10        3.11        3.22     3.161451          0.11   3.536982         124
BaldEagleCr           12                25        3.69        3.85     3.762258          0.16   4.336046         124
BaldEagleCr           12                50        4.17        4.38     4.263307          0.21   5.035972         124
BaldEagleCr           12               100        4.67        4.97     4.800322          0.30   6.423977         124
BaldEagleCr           24                10        3.75        3.87     3.797580          0.12   3.199997         124
BaldEagleCr           24                25        4.44        4.62     4.515000          0.18   4.054050         124
BaldEagleCr           24                50        5.00        5.25     5.113468          0.25   5.000000         124
BaldEagleCr           24               100        5.61        5.94     5.753951          0.33   5.882360         124
Python
if geom_hdf and not results.empty:
    # Check if uniform rainfall is appropriate
    ok, message = Atlas14Variance.is_uniform_rainfall_appropriate(results, threshold_pct=10.0)

    print(f"\n{'✓' if ok else '⚠️'} {message}")

    # Show highest variance events
    if not ok:
        print("\nHighest variance events:")
        high_var = results.nlargest(3, 'range_pct')[['duration_hr', 'return_period_yr', 'min_inches', 'max_inches', 'range_pct']]
        print(high_var.to_string(index=False))
Text Only
✓ Uniform rainfall appropriate. Maximum variance is 7.1% (threshold: 10.0%)

6. Visualize Variance by Duration and AEP

Let's create a detailed visualization showing how variance changes across different storm durations and Annual Exceedance Probability (AEP) intervals.

Python
if geom_hdf and not results.empty:
    import matplotlib.pyplot as plt
    import numpy as np

    # Create figure with two subplots
    fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(15, 5))

    # Calculate AEP from return period (AEP = 1/return_period * 100 for percentage)
    results_plot = results.copy()
    results_plot['aep_pct'] = (1 / results_plot['return_period_yr'] * 100).round(2)

    # Plot 1: Range % by Duration (grouped by return period)
    durations = sorted(results_plot['duration_hr'].unique())
    return_periods = sorted(results_plot['return_period_yr'].unique())

    x = np.arange(len(durations))
    width = 0.2

    for i, rp in enumerate(return_periods):
        data = results_plot[results_plot['return_period_yr'] == rp]
        data_sorted = data.sort_values('duration_hr')
        aep = (1/rp * 100)
        offset = (i - len(return_periods)/2 + 0.5) * width
        ax1.bar(x + offset, data_sorted['range_pct'], width, 
                label=f'{rp}-yr ({aep:.1f}% AEP)')

    ax1.set_xlabel('Duration (hours)', fontsize=11)
    ax1.set_ylabel('Spatial Variance (%)', fontsize=11)
    ax1.set_title('Precipitation Variance by Duration and Return Period', fontsize=12, fontweight='bold')
    ax1.set_xticks(x)
    ax1.set_xticklabels([f'{int(d)}-hr' for d in durations])
    ax1.legend(title='Return Period', fontsize=9)
    ax1.grid(True, alpha=0.3, axis='y')
    ax1.axhline(y=10, color='red', linestyle='--', alpha=0.5, linewidth=1, label='10% threshold')

    # Plot 2: Range % vs AEP (lines for each duration)
    for duration in durations:
        data = results_plot[results_plot['duration_hr'] == duration]
        data_sorted = data.sort_values('aep_pct', ascending=False)  # Sort by AEP descending
        ax2.plot(data_sorted['aep_pct'], data_sorted['range_pct'], 
                marker='o', linewidth=2, markersize=8, label=f'{int(duration)}-hr')

    ax2.set_xlabel('Annual Exceedance Probability (%)', fontsize=11)
    ax2.set_ylabel('Spatial Variance (%)', fontsize=11)
    ax2.set_title('Precipitation Variance vs AEP', fontsize=12, fontweight='bold')
    ax2.legend(title='Duration', fontsize=9)
    ax2.grid(True, alpha=0.3)
    ax2.axhline(y=10, color='red', linestyle='--', alpha=0.5, linewidth=1)
    ax2.set_xscale('log')  # Log scale for AEP (common, moderate, rare events)

    # Format x-axis for common AEP values
    ax2.set_xticks([1, 2, 4, 10])
    ax2.set_xticklabels(['1%', '2%', '4%', '10%'])

    plt.suptitle(f'Atlas 14 Spatial Variance Analysis - {ras.project_name}', 
                 fontsize=13, fontweight='bold', y=1.02)
    plt.tight_layout()
    plt.show()

    # Print summary statistics
    print("\nVariance Summary by Duration:")
    print("=" * 70)
    summary = results_plot.groupby('duration_hr').agg({
        'range_pct': ['min', 'max', 'mean'],
        'range_inches': ['min', 'max', 'mean']
    }).round(2)
    print(summary)

    print("\n\nVariance Summary by Return Period (AEP):")
    print("=" * 70)
    summary2 = results_plot.groupby(['return_period_yr', 'aep_pct']).agg({
        'range_pct': ['min', 'max', 'mean'],
        'range_inches': ['min', 'max', 'mean']
    }).round(2)
    print(summary2)

png

Text Only
Variance Summary by Duration:
======================================================================
            range_pct             range_inches            
                  min   max  mean          min   max  mean
duration_hr                                               
6                4.02  7.07  5.23         0.10  0.26  0.17
12               3.54  6.42  4.83         0.11  0.30  0.19
24               3.20  5.88  4.53         0.12  0.33  0.22


Variance Summary by Return Period (AEP):
======================================================================
                         range_pct             range_inches            
                               min   max  mean          min   max  mean
return_period_yr aep_pct                                               
10               10.0         3.20  4.02  3.58         0.10  0.12  0.11
25               4.0          4.05  4.41  4.27         0.13  0.18  0.16
50               2.0          5.00  5.44  5.16         0.18  0.25  0.21
100              1.0          5.88  7.07  6.46         0.26  0.33  0.30

7. Quick Variance Check

For a rapid assessment using a single representative event (default: 100-year, 24-hour):

Python
if geom_hdf:
    # Quick check for 100-year, 24-hour
    quick_stats = Atlas14Variance.analyze_quick(
        geom_hdf=geom_hdf,
        duration=24,
        return_period=100
    )

    print("Quick Variance Check (100-yr, 24-hr):")
    print(f"  Min: {quick_stats['min']:.2f} inches")
    print(f"  Max: {quick_stats['max']:.2f} inches")
    print(f"  Mean: {quick_stats['mean']:.2f} inches")
    print(f"  Range: {quick_stats['range']:.2f} inches")
    print(f"  Range %: {quick_stats['range_pct']:.1f}%")

    if quick_stats['range_pct'] > 10:
        print("\n⚠️ Consider using spatially variable rainfall")
    else:
        print("\n✓ Uniform rainfall is likely appropriate")
Text Only
2026-01-25 17:11:27 - ras_commander.precip.Atlas14Variance - INFO - Starting Atlas 14 variance analysis for BaldEagleDamBrk.g01.hdf
2026-01-25 17:11:27 - ras_commander.precip.Atlas14Variance - INFO - Starting Atlas 14 variance analysis for BaldEagleDamBrk.g01.hdf
2026-01-25 17:11:27 - ras_commander.precip.Atlas14Variance - INFO - Durations: [24] hours, Return periods: [100] years
2026-01-25 17:11:27 - ras_commander.precip.Atlas14Variance - INFO - Durations: [24] hours, Return periods: [100] years
2026-01-25 17:11:27 - ras_commander.precip.Atlas14Grid - INFO - Extracting extent from c:\GH\ras-commander\examples\example_projects\BaldEagleCrkMulti2D_atlas14_variance\BaldEagleDamBrk.g01.hdf using 2d_flow_area
2026-01-25 17:11:27 - ras_commander.precip.Atlas14Grid - INFO - Extracting extent from c:\GH\ras-commander\examples\example_projects\BaldEagleCrkMulti2D_atlas14_variance\BaldEagleDamBrk.g01.hdf using 2d_flow_area
2026-01-25 17:11:27 - ras_commander.hdf.HdfMesh - INFO - Using existing Path object HDF file: c:\GH\ras-commander\examples\example_projects\BaldEagleCrkMulti2D_atlas14_variance\BaldEagleDamBrk.g01.hdf
2026-01-25 17:11:27 - ras_commander.hdf.HdfMesh - INFO - Using existing Path object HDF file: c:\GH\ras-commander\examples\example_projects\BaldEagleCrkMulti2D_atlas14_variance\BaldEagleDamBrk.g01.hdf
2026-01-25 17:11:27 - ras_commander.hdf.HdfMesh - INFO - Final validated file path: c:\GH\ras-commander\examples\example_projects\BaldEagleCrkMulti2D_atlas14_variance\BaldEagleDamBrk.g01.hdf
2026-01-25 17:11:27 - ras_commander.hdf.HdfMesh - INFO - Final validated file path: c:\GH\ras-commander\examples\example_projects\BaldEagleCrkMulti2D_atlas14_variance\BaldEagleDamBrk.g01.hdf
2026-01-25 17:11:27 - ras_commander.hdf.HdfMesh - INFO - Using existing Path object HDF file: c:\GH\ras-commander\examples\example_projects\BaldEagleCrkMulti2D_atlas14_variance\BaldEagleDamBrk.g01.hdf
2026-01-25 17:11:27 - ras_commander.hdf.HdfMesh - INFO - Using existing Path object HDF file: c:\GH\ras-commander\examples\example_projects\BaldEagleCrkMulti2D_atlas14_variance\BaldEagleDamBrk.g01.hdf
2026-01-25 17:11:27 - ras_commander.hdf.HdfMesh - INFO - Final validated file path: c:\GH\ras-commander\examples\example_projects\BaldEagleCrkMulti2D_atlas14_variance\BaldEagleDamBrk.g01.hdf
2026-01-25 17:11:27 - ras_commander.hdf.HdfMesh - INFO - Final validated file path: c:\GH\ras-commander\examples\example_projects\BaldEagleCrkMulti2D_atlas14_variance\BaldEagleDamBrk.g01.hdf
2026-01-25 17:11:27 - ras_commander.hdf.HdfBase - INFO - Using HDF file from h5py.File object: c:\GH\ras-commander\examples\example_projects\BaldEagleCrkMulti2D_atlas14_variance\BaldEagleDamBrk.g01.hdf
2026-01-25 17:11:27 - ras_commander.hdf.HdfBase - INFO - Using HDF file from h5py.File object: c:\GH\ras-commander\examples\example_projects\BaldEagleCrkMulti2D_atlas14_variance\BaldEagleDamBrk.g01.hdf
2026-01-25 17:11:27 - ras_commander.hdf.HdfBase - INFO - Final validated file path: c:\GH\ras-commander\examples\example_projects\BaldEagleCrkMulti2D_atlas14_variance\BaldEagleDamBrk.g01.hdf
2026-01-25 17:11:27 - ras_commander.hdf.HdfBase - INFO - Final validated file path: c:\GH\ras-commander\examples\example_projects\BaldEagleCrkMulti2D_atlas14_variance\BaldEagleDamBrk.g01.hdf
2026-01-25 17:11:27 - ras_commander.hdf.HdfBase - INFO - Found projection in RASMapper file: c:\GH\ras-commander\examples\example_projects\BaldEagleCrkMulti2D_atlas14_variance\Terrain\Projection.prj
2026-01-25 17:11:27 - ras_commander.hdf.HdfBase - INFO - Found projection in RASMapper file: c:\GH\ras-commander\examples\example_projects\BaldEagleCrkMulti2D_atlas14_variance\Terrain\Projection.prj
2026-01-25 17:11:27 - ras_commander.hdf.HdfBase - INFO - Converted WKT to EPSG:2271 from RASMapper file Projection.prj
2026-01-25 17:11:27 - ras_commander.hdf.HdfBase - INFO - Converted WKT to EPSG:2271 from RASMapper file Projection.prj
2026-01-25 17:11:27 - ras_commander.precip.Atlas14Grid - INFO - 2D flow area bounds: W=-77.6324, S=41.0459, E=-77.3275, N=41.1842
2026-01-25 17:11:27 - ras_commander.precip.Atlas14Grid - INFO - 2D flow area bounds: W=-77.6324, S=41.0459, E=-77.3275, N=41.1842
2026-01-25 17:11:27 - ras_commander.precip.Atlas14Grid - INFO - Extracting Atlas 14 data for bounds (-77.6629, 41.0321, -77.2970, 41.1980): lat[2044:2064], lon[5681:5725]
2026-01-25 17:11:27 - ras_commander.precip.Atlas14Grid - INFO - Extracting Atlas 14 data for bounds (-77.6629, 41.0321, -77.2970, 41.1980): lat[2044:2064], lon[5681:5725]
2026-01-25 17:11:31 - ras_commander.precip.Atlas14Grid - INFO - Data transfer: 15.5 KB (vs 379.4 MB full grid, 100.0% reduction)
2026-01-25 17:11:31 - ras_commander.precip.Atlas14Grid - INFO - Data transfer: 15.5 KB (vs 379.4 MB full grid, 100.0% reduction)
2026-01-25 17:11:31 - ras_commander.hdf.HdfMesh - INFO - Using existing Path object HDF file: c:\GH\ras-commander\examples\example_projects\BaldEagleCrkMulti2D_atlas14_variance\BaldEagleDamBrk.g01.hdf
2026-01-25 17:11:31 - ras_commander.hdf.HdfMesh - INFO - Using existing Path object HDF file: c:\GH\ras-commander\examples\example_projects\BaldEagleCrkMulti2D_atlas14_variance\BaldEagleDamBrk.g01.hdf
2026-01-25 17:11:31 - ras_commander.hdf.HdfMesh - INFO - Final validated file path: c:\GH\ras-commander\examples\example_projects\BaldEagleCrkMulti2D_atlas14_variance\BaldEagleDamBrk.g01.hdf
2026-01-25 17:11:31 - ras_commander.hdf.HdfMesh - INFO - Final validated file path: c:\GH\ras-commander\examples\example_projects\BaldEagleCrkMulti2D_atlas14_variance\BaldEagleDamBrk.g01.hdf
2026-01-25 17:11:31 - ras_commander.hdf.HdfMesh - INFO - Using existing Path object HDF file: c:\GH\ras-commander\examples\example_projects\BaldEagleCrkMulti2D_atlas14_variance\BaldEagleDamBrk.g01.hdf
2026-01-25 17:11:31 - ras_commander.hdf.HdfMesh - INFO - Using existing Path object HDF file: c:\GH\ras-commander\examples\example_projects\BaldEagleCrkMulti2D_atlas14_variance\BaldEagleDamBrk.g01.hdf
2026-01-25 17:11:31 - ras_commander.hdf.HdfMesh - INFO - Final validated file path: c:\GH\ras-commander\examples\example_projects\BaldEagleCrkMulti2D_atlas14_variance\BaldEagleDamBrk.g01.hdf
2026-01-25 17:11:31 - ras_commander.hdf.HdfMesh - INFO - Final validated file path: c:\GH\ras-commander\examples\example_projects\BaldEagleCrkMulti2D_atlas14_variance\BaldEagleDamBrk.g01.hdf
2026-01-25 17:11:31 - ras_commander.hdf.HdfBase - INFO - Using HDF file from h5py.File object: c:\GH\ras-commander\examples\example_projects\BaldEagleCrkMulti2D_atlas14_variance\BaldEagleDamBrk.g01.hdf
2026-01-25 17:11:31 - ras_commander.hdf.HdfBase - INFO - Using HDF file from h5py.File object: c:\GH\ras-commander\examples\example_projects\BaldEagleCrkMulti2D_atlas14_variance\BaldEagleDamBrk.g01.hdf
2026-01-25 17:11:31 - ras_commander.hdf.HdfBase - INFO - Final validated file path: c:\GH\ras-commander\examples\example_projects\BaldEagleCrkMulti2D_atlas14_variance\BaldEagleDamBrk.g01.hdf
2026-01-25 17:11:31 - ras_commander.hdf.HdfBase - INFO - Final validated file path: c:\GH\ras-commander\examples\example_projects\BaldEagleCrkMulti2D_atlas14_variance\BaldEagleDamBrk.g01.hdf
2026-01-25 17:11:31 - ras_commander.hdf.HdfBase - INFO - Found projection in RASMapper file: c:\GH\ras-commander\examples\example_projects\BaldEagleCrkMulti2D_atlas14_variance\Terrain\Projection.prj
2026-01-25 17:11:31 - ras_commander.hdf.HdfBase - INFO - Found projection in RASMapper file: c:\GH\ras-commander\examples\example_projects\BaldEagleCrkMulti2D_atlas14_variance\Terrain\Projection.prj
2026-01-25 17:11:31 - ras_commander.hdf.HdfBase - INFO - Converted WKT to EPSG:2271 from RASMapper file Projection.prj
2026-01-25 17:11:31 - ras_commander.hdf.HdfBase - INFO - Converted WKT to EPSG:2271 from RASMapper file Projection.prj
2026-01-25 17:11:31 - ras_commander.precip.Atlas14Variance - INFO - Analyzing mesh area: BaldEagleCr
2026-01-25 17:11:31 - ras_commander.precip.Atlas14Variance - INFO - Analyzing mesh area: BaldEagleCr
2026-01-25 17:11:31 - ras_commander.precip.Atlas14Variance - INFO - Variance analysis complete: max range = 5.9%, mean range = 5.9%
2026-01-25 17:11:31 - ras_commander.precip.Atlas14Variance - INFO - Variance analysis complete: max range = 5.9%, mean range = 5.9%


Quick Variance Check (100-yr, 24-hr):
  Min: 5.61 inches
  Max: 5.94 inches
  Mean: 5.75 inches
  Range: 0.33 inches
  Range %: 5.9%

✓ Uniform rainfall is likely appropriate

8. Generate Report

Export results with plots for engineering review:

Python
if geom_hdf and not results.empty:
    output_dir = project_path / "Atlas14_Variance_Report"

    report_dir = Atlas14Variance.generate_report(
        results_df=results,
        output_dir=output_dir,
        project_name="Bald Eagle Creek",
        include_plots=True
    )

    print(f"\nReport generated at: {report_dir}")
    print("\nFiles created:")
    for f in report_dir.glob("*"):
        print(f"  - {f.name}")

    # Display plots inline
    from IPython.display import Image, display
    import matplotlib.pyplot as plt

    print("\n" + "="*80)
    print("Variance Plots")
    print("="*80)

    # Show variance by duration plot
    var_duration_plot = report_dir / "variance_by_duration.png"
    if var_duration_plot.exists():
        print("\nVariance by Duration:")
        display(Image(filename=str(var_duration_plot)))

    # Show heatmap
    heatmap_plot = report_dir / "variance_heatmap.png"
    if heatmap_plot.exists():
        print("\nVariance Heatmap:")
        display(Image(filename=str(heatmap_plot)))
Text Only
2026-01-25 17:11:31 - ras_commander.precip.Atlas14Variance - INFO - Saved statistics to: c:\GH\ras-commander\examples\example_projects\BaldEagleCrkMulti2D_atlas14_variance\Atlas14_Variance_Report\variance_statistics.csv
2026-01-25 17:11:31 - ras_commander.precip.Atlas14Variance - INFO - Saved statistics to: c:\GH\ras-commander\examples\example_projects\BaldEagleCrkMulti2D_atlas14_variance\Atlas14_Variance_Report\variance_statistics.csv
2026-01-25 17:11:31 - ras_commander.precip.Atlas14Variance - INFO - Saved summary to: c:\GH\ras-commander\examples\example_projects\BaldEagleCrkMulti2D_atlas14_variance\Atlas14_Variance_Report\variance_summary.csv
2026-01-25 17:11:31 - ras_commander.precip.Atlas14Variance - INFO - Saved summary to: c:\GH\ras-commander\examples\example_projects\BaldEagleCrkMulti2D_atlas14_variance\Atlas14_Variance_Report\variance_summary.csv
2026-01-25 17:11:31 - ras_commander.precip.Atlas14Variance - INFO - Saved plot: c:\GH\ras-commander\examples\example_projects\BaldEagleCrkMulti2D_atlas14_variance\Atlas14_Variance_Report\variance_by_duration.png
2026-01-25 17:11:31 - ras_commander.precip.Atlas14Variance - INFO - Saved plot: c:\GH\ras-commander\examples\example_projects\BaldEagleCrkMulti2D_atlas14_variance\Atlas14_Variance_Report\variance_by_duration.png
2026-01-25 17:11:31 - ras_commander.precip.Atlas14Variance - INFO - Saved plot: c:\GH\ras-commander\examples\example_projects\BaldEagleCrkMulti2D_atlas14_variance\Atlas14_Variance_Report\variance_heatmap.png
2026-01-25 17:11:31 - ras_commander.precip.Atlas14Variance - INFO - Saved plot: c:\GH\ras-commander\examples\example_projects\BaldEagleCrkMulti2D_atlas14_variance\Atlas14_Variance_Report\variance_heatmap.png
2026-01-25 17:11:31 - ras_commander.precip.Atlas14Variance - INFO - Report generated in: c:\GH\ras-commander\examples\example_projects\BaldEagleCrkMulti2D_atlas14_variance\Atlas14_Variance_Report
2026-01-25 17:11:31 - ras_commander.precip.Atlas14Variance - INFO - Report generated in: c:\GH\ras-commander\examples\example_projects\BaldEagleCrkMulti2D_atlas14_variance\Atlas14_Variance_Report



Report generated at: c:\GH\ras-commander\examples\example_projects\BaldEagleCrkMulti2D_atlas14_variance\Atlas14_Variance_Report

Files created:
  - variance_by_duration.png
  - variance_heatmap.png
  - variance_statistics.csv
  - variance_summary.csv

================================================================================
Variance Plots
================================================================================

Variance by Duration:

png

Text Only
Variance Heatmap:

png

9. Cleanup

Python
# Clear the coordinate cache to free memory
Atlas14Grid.clear_cache()
print("Cache cleared")

# Optionally clean up extracted project
# import shutil
# shutil.rmtree(project_path.parent, ignore_errors=True)
Text Only
Cache cleared

Summary

This notebook demonstrated:

  1. Direct Bounds Query - Get Atlas 14 data for any geographic area
  2. Point Query - Quick lookup for a single location
  3. HEC-RAS Integration - Automatic extent extraction from 2D flow areas
  4. Variance Analysis - Calculate min/max/mean/range statistics
  5. Decision Support - Determine if uniform rainfall is appropriate
  6. Report Generation - Export results for engineering review

Key Takeaways: - Range percentage > 10% suggests spatially variable rainfall should be considered - The analysis uses HTTP range requests to minimize data transfer (~99.9% reduction) - All CONUS locations are supported (24°N-50°N, -125°W to -66°W)

References: - NOAA Atlas 14 - Precipitation Frequency Data Server

CLB Engineering Corporation  ·  LLM Forward Engineering
RAS Commander is a free and open-source project maintained by CLB Engineering Corporation. For agencies and firms seeking to modernize H&H workflows with LLM Forward approaches, contact CLB to partner with the engineers who wrote the automation.