mf6adj demonstration using the structured Freyberg model

In this notebook, we walk through a standard mf6adj workflow to calculate sensitivities for several different performance measures using the Freyberg model.

Import Packages

[1]:
import os
import pathlib as pl
import platform
import shutil
import sys
from datetime import datetime

import flopy
import h5py
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
import pyemu
[2]:
try:
    import mf6adj
except ImportError:
    sys.path.insert(0, str(pl.Path("../").resolve()))
    import mf6adj
[3]:
mf6_bin, lib_name = mf6adj.get_conda_mf6_paths()
print(f"Using MF6 binary: {mf6_bin}")
print(f"Using MF6 library: {lib_name}")
Using MF6 binary: /home/runner/work/mf6adj/mf6adj/.pixi/envs/default/bin/mf6
Using MF6 library: /home/runner/work/mf6adj/mf6adj/.pixi/envs/default/bin/libmf6.so

Copy the MODFLOW Model

[4]:
org_ws = pl.Path("..") / "autotest" / "freyberg_structured"
assert pl.Path(org_ws).exists()

Set up a local copy of the model files.

[5]:
ws = pl.Path("freyberg")
if pl.Path(ws).exists():
    shutil.rmtree(ws)
[6]:
shutil.copytree(org_ws, ws)
[6]:
PosixPath('freyberg')

Copy the required local Python packages into the working directory.

[7]:
sim = flopy.mf6.MFSimulation.load(sim_ws=ws)
m = sim.get_model()
loading simulation...
  loading simulation name file...
  loading tdis package...
  loading model gwf6...
    loading package dis...
    loading package ic...
    loading package npf...
    loading package sto...
    loading package oc...
    loading package wel...
    loading package rch...
    loading package ghb...
    loading package sfr...
    loading package obs...
  loading solution package freyberg6...
[8]:
ib = m.dis.idomain.array[0, :, :].astype(float)
ib[ib > 0] = np.nan
ib_cmap = plt.get_cmap("Greys_r")
ib_cmap.set_bad(alpha=0.0)


def plot_model(arr, units=None):
    arr[~np.isnan(ib)] = np.nan
    fig, ax = plt.subplots(1, 1, figsize=(6, 6))
    cb = ax.imshow(arr, cmap="plasma")
    plt.colorbar(cb, ax=ax, label=units)
    plt.imshow(ib, cmap=ib_cmap)
    return fig, ax
[9]:
fig, ax = plot_model(m.dis.top.array[:, :])
_ = ax.set_title("top")
../_images/examples_structured_freyberg_demo_13_0.png

Run the existing model in our local workspace.

[10]:
pyemu.os_utils.run(mf6_bin.name, cwd=ws)
mf6
                                   MODFLOW 6
                U.S. GEOLOGICAL SURVEY MODULAR HYDROLOGIC MODEL
                        VERSION 6.8.0.dev0+a6a4984.dirty
                               ***DEVELOP MODE***

   MODFLOW 6 compiled Jun 01 2026 18:46:14 with Intel(R) Fortran Intel(R) 64
   Compiler Classic for applications running on Intel(R) 64, Version 2021.6.0
                             Build 20220226_000000

This software is preliminary or provisional and is subject to
revision. It is being provided to meet the need for timely best
science. The software has not received final approval by the U.S.
Geological Survey (USGS). No warranty, expressed or implied, is made
by the USGS or the U.S. Government as to the functionality of the
software and related material nor shall the fact of release
constitute any such warranty. The software is provided on the
condition that neither the USGS nor the U.S. Government shall be held
liable for any damages resulting from the authorized or unauthorized
use of the software.


 MODFLOW runs in SEQUENTIAL mode

 Run start date and time (yyyy/mm/dd hh:mm:ss): 2026/06/02 18:36:13

 Writing simulation list file: mfsim.lst
 Using Simulation name file: mfsim.nam

    Solving:  Stress period:     1    Time step:     1
    Solving:  Stress period:     2    Time step:     1
    Solving:  Stress period:     3    Time step:     1
    Solving:  Stress period:     4    Time step:     1
    Solving:  Stress period:     5    Time step:     1
    Solving:  Stress period:     6    Time step:     1
    Solving:  Stress period:     7    Time step:     1
    Solving:  Stress period:     8    Time step:     1
    Solving:  Stress period:     9    Time step:     1
    Solving:  Stress period:    10    Time step:     1
    Solving:  Stress period:    11    Time step:     1
    Solving:  Stress period:    12    Time step:     1
    Solving:  Stress period:    13    Time step:     1
    Solving:  Stress period:    14    Time step:     1
    Solving:  Stress period:    15    Time step:     1
    Solving:  Stress period:    16    Time step:     1
    Solving:  Stress period:    17    Time step:     1
    Solving:  Stress period:    18    Time step:     1
    Solving:  Stress period:    19    Time step:     1
    Solving:  Stress period:    20    Time step:     1
    Solving:  Stress period:    21    Time step:     1
    Solving:  Stress period:    22    Time step:     1
    Solving:  Stress period:    23    Time step:     1
    Solving:  Stress period:    24    Time step:     1
    Solving:  Stress period:    25    Time step:     1

 Run end date and time (yyyy/mm/dd hh:mm:ss): 2026/06/02 18:36:14
 Elapsed run time:  0.511 Seconds

 Normal termination of simulation.

Now plot some heads.

[11]:
hds = flopy.utils.HeadFile(pl.Path(ws) / "freyberg6_freyberg.hds")
final_arr = hds.get_data()
fig, ax = plot_model(final_arr[0, :, :], units="meters")
ax.set_title("layer 1 final heads")
[11]:
Text(0.5, 1.0, 'layer 1 final heads')
../_images/examples_structured_freyberg_demo_17_1.png

Nice. You can see the SFR network running north-south in the 15th column.

The main requirement for using mf6adj is an input file that describes the performance measures. Fortunately, this file follows a modern format similar to other MF6 input files. Here we will create one programmatically while also describing the performance-measure formats that are supported.

[12]:
pm_fname = "freyberg_perfmeas.dat"
fpm = open(pl.Path(ws) / pm_fname, "w")

The simplest type of performance measure is a single simulated head at one location and one simulation time. Let’s make one of those.

[13]:
layer, row, col = 1, 5, 5  # the layer row and column
sp, ts = 24, 1  # stress period and time step
pm_name = "pm_single"
fpm.write(f"begin performance_measure {pm_name}\n")
fpm.write(f"{sp} {ts} {layer} {row} {col} head direct 1.0 -1e30\n")
fpm.write("end performance_measure\n\n")
[13]:
25

That is all it takes. The line in the performance-measure record tells mf6adj the spatial and temporal information it needs, the type of performance measure (head), and the form of the measure (direct or residual). The final two entries are the weight and the observed value. The observed value is not used for direct performance measures, but it still must be supplied as a valid floating-point value.

Now let’s make a more complex direct performance measure using the same layer-row-column location across all simulation times.

[14]:
layer, row, col = 1, 5, 5  # the layer row and column
pm_name = "pm_single_alltimes"
fpm.write(f"begin performance_measure {pm_name}\n")
for kper in range(sim.tdis.nper.data):
    fpm.write(f"{kper + 1} {ts} {layer} {row} {col} head direct 1.0 -1e30\n")
fpm.write("end performance_measure\n\n")
[14]:
25

Now let’s step it up and make a residual performance measure, which is a sum-of-squared weighted residual measure. To use this form, we need observed values, so we will create some noisy values from the simulated results. We’ll use all layer-row-column locations in the MF6 head-observation package.

[15]:
lrcs = []
k_dict = {}
with open(pl.Path(ws) / "head.obs", "r") as f:
    f.readline()
    for line in f:
        if line.strip().lower().startswith("end"):
            break
        raw = line.strip().split()
        lrcs.append(" ".join(raw[2:]))
        k = int(raw[2]) - 1
        i = int(raw[3]) - 1
        j = int(raw[4]) - 1
        if k not in k_dict:
            k_dict[k] = []
        k_dict[k].append([i, j])

Make some synthetic observations by adding noise to the simulated values. In practice, we would only have measured heads from the past, so let’s create observations for just the first 11 stress periods.

[16]:
np.random.seed(11111)
hist_nper = 11
obs_vals = {}
for lrc in lrcs:
    kij = [int(i) - 1 for i in lrc.split()]
    vals = final_arr[kij[0], kij[1], kij[2]] + np.random.normal(0, 1, hist_nper)
    obs_vals[lrc] = vals
[17]:
pm_name = "pm_ssr"
fpm.write(f"begin performance_measure {pm_name}\n")
for kper in range(hist_nper):
    for lrc in lrcs:
        fpm.write(f"{kper + 1} {ts} {lrc} head residual 1.0 {obs_vals[lrc][kper]}\n")
fpm.write("end performance_measure\n\n")
[17]:
25

Now for something more interesting: mf6adj also supports flux-based performance measures, which yield the sensitivity of a simulated flux to the model inputs. These can be described just as granularly as head-based performance measures. Here we will look at the sensitivity of simulated surface-water/groundwater flux between the groundwater system and SFR during the 23rd stress period, which is a dry period. This is effectively a prediction-focused performance measure, and we will use the two boundname groupings in the SFR input.

[18]:
sfr_data = pd.DataFrame.from_records(m.sfr.packagedata.array)
bnames = sfr_data.boundname.unique()
bnames.sort()
sp = 23
for bname in bnames:
    bdf = sfr_data.loc[sfr_data.boundname == bname, :].copy()
    fpm.write(f"begin performance_measure {bname}\n")
    for kij in bdf.cellid.values:
        fpm.write(
            f"{23} 1 {kij[0] + 1} {kij[1] + 1} {kij[2] + 1} sfr_1 direct 1.0 -1.0e+30\n"
        )
    fpm.write("end performance_measure\n\n")

There is something new in that record line: sfr_1 is the name of the boundary package in the MF6 GWF name file. mf6adj also supports WEL, GHB, RIV, and CHD packages for flux-based performance measures.

Now let’s define a performance measure that combines the historical groundwater-level measures and the predictive sw-gw exchange flux.

[19]:
pm_name = "pm_combo"
fpm.write(f"begin performance_measure {pm_name}\n")
for kper in range(hist_nper):
    for lrc in lrcs:
        fpm.write(f"{kper + 1} {ts} {lrc} head direct 1.0 -1.0e30\n")
for bname in bnames:
    bdf = sfr_data.loc[sfr_data.boundname == bname, :].copy()
    for kij in bdf.cellid.values:
        fpm.write(
            f"{23} 1 {kij[0] + 1} {kij[1] + 1} {kij[2] + 1} sfr_1 direct 1 -1.0e+30\n"
        )
fpm.write("end performance_measure\n\n")
[19]:
25
[20]:
fpm.close()

Run mf6adj

Now we should be ready to go. The adjoint solution process requires one forward model run and then a solve for the adjoint state, which uses the forward solution components (for example, the conductance matrix, RHS, heads, and saturation). The adjoint solve has two important characteristics: it is linear, regardless of the forward model’s linearity, and it proceeds backward in time, starting with the last stress period.

[21]:
forward_hdf5_name = "forward.hdf5"
start = datetime.now()

adj = mf6adj.Mf6Adj(
    pm_fname,
    str(lib_name),
    logging_level="INFO",
    working_directory=ws,
)
adj.solve_forward_model(
    hdf5_name=forward_hdf5_name
)  # solve the standard forward solution
dfsum = adj.solve_adjoint()  # solve the adjoint state for each performance measure
adj.finalize()  # release components
duration = (datetime.now() - start).total_seconds()
print("took:", duration)
2026-06-02 18:36:14,321 - Logger instance 'Mf6Adj-freyberg_perfmeas-08ca42f5' created.
2026-06-02 18:36:14,322 - Running from /home/runner/work/mf6adj/mf6adj/examples/freyberg
2026-06-02 18:36:14,323 - Structured grid found
2026-06-02 18:36:14,348 - MODFLOW 6 version: 6.8.0.dev0
2026-06-02 18:36:14,349 - Processing adjoint file: freyberg_perfmeas.dat
2026-06-02 18:36:14,359 - Starting flow solution
2026-06-02 18:36:14,415 - Flow (stress period,time step) (1,1) converged in 10 iters, took 0.00084803 mins
2026-06-02 18:36:14,442 - Flow (stress period,time step) (2,1) converged in 4 iters, took 0.00026512 mins
2026-06-02 18:36:14,465 - Flow (stress period,time step) (3,1) converged in 3 iters, took 0.00021972 mins
2026-06-02 18:36:14,489 - Flow (stress period,time step) (4,1) converged in 3 iters, took 0.00022705 mins
2026-06-02 18:36:14,512 - Flow (stress period,time step) (5,1) converged in 3 iters, took 0.00022375 mins
2026-06-02 18:36:14,536 - Flow (stress period,time step) (6,1) converged in 4 iters, took  0.0002488 mins
2026-06-02 18:36:14,561 - Flow (stress period,time step) (7,1) converged in 4 iters, took  0.0002602 mins
2026-06-02 18:36:14,588 - Flow (stress period,time step) (8,1) converged in 5 iters, took 0.00028695 mins
2026-06-02 18:36:14,615 - Flow (stress period,time step) (9,1) converged in 5 iters, took 0.00029795 mins
2026-06-02 18:36:14,639 - Flow (stress period,time step) (10,1) converged in 4 iters, took 0.00024162 mins
2026-06-02 18:36:14,663 - Flow (stress period,time step) (11,1) converged in 4 iters, took 0.00024598 mins
2026-06-02 18:36:14,686 - Flow (stress period,time step) (12,1) converged in 3 iters, took 0.00022342 mins
2026-06-02 18:36:14,711 - Flow (stress period,time step) (13,1) converged in 4 iters, took 0.00026265 mins
2026-06-02 18:36:14,735 - Flow (stress period,time step) (14,1) converged in 4 iters, took 0.00024968 mins
2026-06-02 18:36:14,758 - Flow (stress period,time step) (15,1) converged in 3 iters, took 0.00021967 mins
2026-06-02 18:36:14,780 - Flow (stress period,time step) (16,1) converged in 3 iters, took 0.00021427 mins
2026-06-02 18:36:14,802 - Flow (stress period,time step) (17,1) converged in 3 iters, took 0.00021592 mins
2026-06-02 18:36:14,827 - Flow (stress period,time step) (18,1) converged in 4 iters, took 0.00025717 mins
2026-06-02 18:36:14,856 - Flow (stress period,time step) (19,1) converged in 6 iters, took 0.00032835 mins
2026-06-02 18:36:14,884 - Flow (stress period,time step) (20,1) converged in 5 iters, took 0.00030185 mins
2026-06-02 18:36:14,911 - Flow (stress period,time step) (21,1) converged in 5 iters, took 0.00029067 mins
2026-06-02 18:36:14,934 - Flow (stress period,time step) (22,1) converged in 4 iters, took 0.00023722 mins
2026-06-02 18:36:14,957 - Flow (stress period,time step) (23,1) converged in 3 iters, took 0.00021878 mins
2026-06-02 18:36:14,981 - Flow (stress period,time step) (24,1) converged in 4 iters, took 0.00025078 mins
2026-06-02 18:36:15,005 - Flow (stress period,time step) (25,1) converged in 3 iters, took  0.0002404 mins
2026-06-02 18:36:15,014 - Flow solution finished and took   0.010918 minutes
2026-06-02 18:36:15,025 - Starting solve_adjoint at 2026-06-02 18:36:15.025741
2026-06-02 18:36:15,053 - Structured grid found, shape: (3, 40, 20)
2026-06-02 18:36:15,055 - Starting adjoint solve for PerfMeas: pm_single (kper, kstp) (25, 1)
2026-06-02 18:36:15,057 - Solving for lambda
2026-06-02 18:36:15,057 - Solving with direct with solver options: {'use_umfpack': True}
2026-06-02 18:36:15,067 - Solving for lambda took: 0.00995 seconds
2026-06-02 18:36:15,104 - Adjoint solve took: 0.048574 seconds to solve adjoint solution for PerfMeas: pm_single (kper, kstp) (25, 1)
2026-06-02 18:36:15,104 - Write group to hdf file
2026-06-02 18:36:15,113 - Starting adjoint solve for PerfMeas: pm_single (kper, kstp) (24, 1)
2026-06-02 18:36:15,115 - Solving for lambda
2026-06-02 18:36:15,116 - Solving with direct with solver options: {'use_umfpack': True}
2026-06-02 18:36:15,124 - Solving for lambda took: 0.009159 seconds
2026-06-02 18:36:15,160 - Adjoint solve took: 0.046637 seconds to solve adjoint solution for PerfMeas: pm_single (kper, kstp) (24, 1)
2026-06-02 18:36:15,160 - Write group to hdf file
2026-06-02 18:36:15,169 - Starting adjoint solve for PerfMeas: pm_single (kper, kstp) (23, 1)
2026-06-02 18:36:15,171 - Solving for lambda
2026-06-02 18:36:15,171 - Solving with direct with solver options: {'use_umfpack': True}
2026-06-02 18:36:15,180 - Solving for lambda took: 0.009454 seconds
2026-06-02 18:36:15,216 - Adjoint solve took: 0.046893 seconds to solve adjoint solution for PerfMeas: pm_single (kper, kstp) (23, 1)
2026-06-02 18:36:15,216 - Write group to hdf file
2026-06-02 18:36:15,225 - Starting adjoint solve for PerfMeas: pm_single (kper, kstp) (22, 1)
2026-06-02 18:36:15,227 - Solving for lambda
2026-06-02 18:36:15,227 - Solving with direct with solver options: {'use_umfpack': True}
2026-06-02 18:36:15,236 - Solving for lambda took: 0.009396 seconds
2026-06-02 18:36:15,272 - Adjoint solve took: 0.046718 seconds to solve adjoint solution for PerfMeas: pm_single (kper, kstp) (22, 1)
2026-06-02 18:36:15,272 - Write group to hdf file
2026-06-02 18:36:15,281 - Starting adjoint solve for PerfMeas: pm_single (kper, kstp) (21, 1)
2026-06-02 18:36:15,283 - Solving for lambda
2026-06-02 18:36:15,283 - Solving with direct with solver options: {'use_umfpack': True}
2026-06-02 18:36:15,292 - Solving for lambda took: 0.00936 seconds
2026-06-02 18:36:15,328 - Adjoint solve took: 0.047717 seconds to solve adjoint solution for PerfMeas: pm_single (kper, kstp) (21, 1)
2026-06-02 18:36:15,329 - Write group to hdf file
2026-06-02 18:36:15,338 - Starting adjoint solve for PerfMeas: pm_single (kper, kstp) (20, 1)
2026-06-02 18:36:15,339 - Solving for lambda
2026-06-02 18:36:15,340 - Solving with direct with solver options: {'use_umfpack': True}
2026-06-02 18:36:15,349 - Solving for lambda took: 0.009649 seconds
2026-06-02 18:36:15,385 - Adjoint solve took: 0.047762 seconds to solve adjoint solution for PerfMeas: pm_single (kper, kstp) (20, 1)
2026-06-02 18:36:15,386 - Write group to hdf file
2026-06-02 18:36:15,394 - Starting adjoint solve for PerfMeas: pm_single (kper, kstp) (19, 1)
2026-06-02 18:36:15,396 - Solving for lambda
2026-06-02 18:36:15,397 - Solving with direct with solver options: {'use_umfpack': True}
2026-06-02 18:36:15,406 - Solving for lambda took: 0.009409 seconds
2026-06-02 18:36:15,442 - Adjoint solve took: 0.047455 seconds to solve adjoint solution for PerfMeas: pm_single (kper, kstp) (19, 1)
2026-06-02 18:36:15,442 - Write group to hdf file
2026-06-02 18:36:15,451 - Starting adjoint solve for PerfMeas: pm_single (kper, kstp) (18, 1)
2026-06-02 18:36:15,453 - Solving for lambda
2026-06-02 18:36:15,454 - Solving with direct with solver options: {'use_umfpack': True}
2026-06-02 18:36:15,463 - Solving for lambda took: 0.00962 seconds
2026-06-02 18:36:15,499 - Adjoint solve took: 0.048068 seconds to solve adjoint solution for PerfMeas: pm_single (kper, kstp) (18, 1)
2026-06-02 18:36:15,500 - Write group to hdf file
2026-06-02 18:36:15,508 - Starting adjoint solve for PerfMeas: pm_single (kper, kstp) (17, 1)
2026-06-02 18:36:15,510 - Solving for lambda
2026-06-02 18:36:15,510 - Solving with direct with solver options: {'use_umfpack': True}
2026-06-02 18:36:15,519 - Solving for lambda took: 0.009384 seconds
2026-06-02 18:36:15,555 - Adjoint solve took: 0.047378 seconds to solve adjoint solution for PerfMeas: pm_single (kper, kstp) (17, 1)
2026-06-02 18:36:15,556 - Write group to hdf file
2026-06-02 18:36:15,565 - Starting adjoint solve for PerfMeas: pm_single (kper, kstp) (16, 1)
2026-06-02 18:36:15,566 - Solving for lambda
2026-06-02 18:36:15,567 - Solving with direct with solver options: {'use_umfpack': True}
2026-06-02 18:36:15,576 - Solving for lambda took: 0.009355 seconds
2026-06-02 18:36:15,612 - Adjoint solve took: 0.047635 seconds to solve adjoint solution for PerfMeas: pm_single (kper, kstp) (16, 1)
2026-06-02 18:36:15,613 - Write group to hdf file
2026-06-02 18:36:15,621 - Starting adjoint solve for PerfMeas: pm_single (kper, kstp) (15, 1)
2026-06-02 18:36:15,623 - Solving for lambda
2026-06-02 18:36:15,624 - Solving with direct with solver options: {'use_umfpack': True}
2026-06-02 18:36:15,632 - Solving for lambda took: 0.009355 seconds
2026-06-02 18:36:15,668 - Adjoint solve took: 0.046176 seconds to solve adjoint solution for PerfMeas: pm_single (kper, kstp) (15, 1)
2026-06-02 18:36:15,668 - Write group to hdf file
2026-06-02 18:36:15,677 - Starting adjoint solve for PerfMeas: pm_single (kper, kstp) (14, 1)
2026-06-02 18:36:15,679 - Solving for lambda
2026-06-02 18:36:15,679 - Solving with direct with solver options: {'use_umfpack': True}
2026-06-02 18:36:15,688 - Solving for lambda took: 0.009232 seconds
2026-06-02 18:36:15,723 - Adjoint solve took: 0.046597 seconds to solve adjoint solution for PerfMeas: pm_single (kper, kstp) (14, 1)
2026-06-02 18:36:15,724 - Write group to hdf file
2026-06-02 18:36:15,732 - Starting adjoint solve for PerfMeas: pm_single (kper, kstp) (13, 1)
2026-06-02 18:36:15,734 - Solving for lambda
2026-06-02 18:36:15,735 - Solving with direct with solver options: {'use_umfpack': True}
2026-06-02 18:36:15,743 - Solving for lambda took: 0.00921 seconds
2026-06-02 18:36:15,779 - Adjoint solve took: 0.046423 seconds to solve adjoint solution for PerfMeas: pm_single (kper, kstp) (13, 1)
2026-06-02 18:36:15,779 - Write group to hdf file
2026-06-02 18:36:15,788 - Starting adjoint solve for PerfMeas: pm_single (kper, kstp) (12, 1)
2026-06-02 18:36:15,789 - Solving for lambda
2026-06-02 18:36:15,790 - Solving with direct with solver options: {'use_umfpack': True}
2026-06-02 18:36:15,799 - Solving for lambda took: 0.009325 seconds
2026-06-02 18:36:15,834 - Adjoint solve took: 0.046932 seconds to solve adjoint solution for PerfMeas: pm_single (kper, kstp) (12, 1)
2026-06-02 18:36:15,835 - Write group to hdf file
2026-06-02 18:36:15,844 - Starting adjoint solve for PerfMeas: pm_single (kper, kstp) (11, 1)
2026-06-02 18:36:15,845 - Solving for lambda
2026-06-02 18:36:15,846 - Solving with direct with solver options: {'use_umfpack': True}
2026-06-02 18:36:15,854 - Solving for lambda took: 0.009358 seconds
2026-06-02 18:36:15,890 - Adjoint solve took: 0.04675 seconds to solve adjoint solution for PerfMeas: pm_single (kper, kstp) (11, 1)
2026-06-02 18:36:15,891 - Write group to hdf file
2026-06-02 18:36:15,899 - Starting adjoint solve for PerfMeas: pm_single (kper, kstp) (10, 1)
2026-06-02 18:36:15,901 - Solving for lambda
2026-06-02 18:36:15,902 - Solving with direct with solver options: {'use_umfpack': True}
2026-06-02 18:36:15,911 - Solving for lambda took: 0.009364 seconds
2026-06-02 18:36:15,946 - Adjoint solve took: 0.046525 seconds to solve adjoint solution for PerfMeas: pm_single (kper, kstp) (10, 1)
2026-06-02 18:36:15,946 - Write group to hdf file
2026-06-02 18:36:15,955 - Starting adjoint solve for PerfMeas: pm_single (kper, kstp) (9, 1)
2026-06-02 18:36:15,957 - Solving for lambda
2026-06-02 18:36:15,957 - Solving with direct with solver options: {'use_umfpack': True}
2026-06-02 18:36:15,966 - Solving for lambda took: 0.009271 seconds
2026-06-02 18:36:16,002 - Adjoint solve took: 0.046978 seconds to solve adjoint solution for PerfMeas: pm_single (kper, kstp) (9, 1)
2026-06-02 18:36:16,002 - Write group to hdf file
2026-06-02 18:36:16,011 - Starting adjoint solve for PerfMeas: pm_single (kper, kstp) (8, 1)
2026-06-02 18:36:16,013 - Solving for lambda
2026-06-02 18:36:16,013 - Solving with direct with solver options: {'use_umfpack': True}
2026-06-02 18:36:16,022 - Solving for lambda took: 0.009284 seconds
2026-06-02 18:36:16,058 - Adjoint solve took: 0.047141 seconds to solve adjoint solution for PerfMeas: pm_single (kper, kstp) (8, 1)
2026-06-02 18:36:16,059 - Write group to hdf file
2026-06-02 18:36:16,067 - Starting adjoint solve for PerfMeas: pm_single (kper, kstp) (7, 1)
2026-06-02 18:36:16,069 - Solving for lambda
2026-06-02 18:36:16,069 - Solving with direct with solver options: {'use_umfpack': True}
2026-06-02 18:36:16,078 - Solving for lambda took: 0.009289 seconds
2026-06-02 18:36:16,114 - Adjoint solve took: 0.047001 seconds to solve adjoint solution for PerfMeas: pm_single (kper, kstp) (7, 1)
2026-06-02 18:36:16,115 - Write group to hdf file
2026-06-02 18:36:16,123 - Starting adjoint solve for PerfMeas: pm_single (kper, kstp) (6, 1)
2026-06-02 18:36:16,125 - Solving for lambda
2026-06-02 18:36:16,125 - Solving with direct with solver options: {'use_umfpack': True}
2026-06-02 18:36:16,134 - Solving for lambda took: 0.009352 seconds
2026-06-02 18:36:16,170 - Adjoint solve took: 0.047193 seconds to solve adjoint solution for PerfMeas: pm_single (kper, kstp) (6, 1)
2026-06-02 18:36:16,171 - Write group to hdf file
2026-06-02 18:36:16,179 - Starting adjoint solve for PerfMeas: pm_single (kper, kstp) (5, 1)
2026-06-02 18:36:16,181 - Solving for lambda
2026-06-02 18:36:16,182 - Solving with direct with solver options: {'use_umfpack': True}
2026-06-02 18:36:16,191 - Solving for lambda took: 0.00943 seconds
2026-06-02 18:36:16,227 - Adjoint solve took: 0.047681 seconds to solve adjoint solution for PerfMeas: pm_single (kper, kstp) (5, 1)
2026-06-02 18:36:16,227 - Write group to hdf file
2026-06-02 18:36:16,236 - Starting adjoint solve for PerfMeas: pm_single (kper, kstp) (4, 1)
2026-06-02 18:36:16,238 - Solving for lambda
2026-06-02 18:36:16,238 - Solving with direct with solver options: {'use_umfpack': True}
2026-06-02 18:36:16,247 - Solving for lambda took: 0.009263 seconds
2026-06-02 18:36:16,284 - Adjoint solve took: 0.047717 seconds to solve adjoint solution for PerfMeas: pm_single (kper, kstp) (4, 1)
2026-06-02 18:36:16,284 - Write group to hdf file
2026-06-02 18:36:16,293 - Starting adjoint solve for PerfMeas: pm_single (kper, kstp) (3, 1)
2026-06-02 18:36:16,295 - Solving for lambda
2026-06-02 18:36:16,295 - Solving with direct with solver options: {'use_umfpack': True}
2026-06-02 18:36:16,304 - Solving for lambda took: 0.009313 seconds
2026-06-02 18:36:16,340 - Adjoint solve took: 0.047407 seconds to solve adjoint solution for PerfMeas: pm_single (kper, kstp) (3, 1)
2026-06-02 18:36:16,341 - Write group to hdf file
2026-06-02 18:36:16,349 - Starting adjoint solve for PerfMeas: pm_single (kper, kstp) (2, 1)
2026-06-02 18:36:16,351 - Solving for lambda
2026-06-02 18:36:16,352 - Solving with direct with solver options: {'use_umfpack': True}
2026-06-02 18:36:16,361 - Solving for lambda took: 0.009463 seconds
2026-06-02 18:36:16,397 - Adjoint solve took: 0.048088 seconds to solve adjoint solution for PerfMeas: pm_single (kper, kstp) (2, 1)
2026-06-02 18:36:16,398 - Write group to hdf file
2026-06-02 18:36:16,406 - Starting adjoint solve for PerfMeas: pm_single (kper, kstp) (1, 1)
2026-06-02 18:36:16,408 - Solving for lambda
2026-06-02 18:36:16,409 - Solving with direct with solver options: {'use_umfpack': True}
2026-06-02 18:36:16,417 - Solving for lambda took: 0.009362 seconds
2026-06-02 18:36:16,454 - Adjoint solve took: 0.047233 seconds to solve adjoint solution for PerfMeas: pm_single (kper, kstp) (1, 1)
2026-06-02 18:36:16,454 - Write group to hdf file
2026-06-02 18:36:16,462 - Formulate composite sensitivities
2026-06-02 18:36:16,463 - Writing composite sensitivities
2026-06-02 18:36:16,473 - Adjoint solve took:      1.448 seconds for pm 'pm_single' at (kper,kstp) (1, 1)
2026-06-02 18:36:16,474 - Starting solve_adjoint at 2026-06-02 18:36:16.474314
2026-06-02 18:36:16,502 - Structured grid found, shape: (3, 40, 20)
2026-06-02 18:36:16,504 - Starting adjoint solve for PerfMeas: pm_single_alltimes (kper, kstp) (25, 1)
2026-06-02 18:36:16,506 - Solving for lambda
2026-06-02 18:36:16,507 - Solving with direct with solver options: {'use_umfpack': True}
2026-06-02 18:36:16,516 - Solving for lambda took: 0.009567 seconds
2026-06-02 18:36:16,551 - Adjoint solve took: 0.046807 seconds to solve adjoint solution for PerfMeas: pm_single_alltimes (kper, kstp) (25, 1)
2026-06-02 18:36:16,552 - Write group to hdf file
2026-06-02 18:36:16,560 - Starting adjoint solve for PerfMeas: pm_single_alltimes (kper, kstp) (24, 1)
2026-06-02 18:36:16,562 - Solving for lambda
2026-06-02 18:36:16,563 - Solving with direct with solver options: {'use_umfpack': True}
2026-06-02 18:36:16,572 - Solving for lambda took: 0.009502 seconds
2026-06-02 18:36:16,608 - Adjoint solve took: 0.047282 seconds to solve adjoint solution for PerfMeas: pm_single_alltimes (kper, kstp) (24, 1)
2026-06-02 18:36:16,608 - Write group to hdf file
2026-06-02 18:36:16,617 - Starting adjoint solve for PerfMeas: pm_single_alltimes (kper, kstp) (23, 1)
2026-06-02 18:36:16,619 - Solving for lambda
2026-06-02 18:36:16,619 - Solving with direct with solver options: {'use_umfpack': True}
2026-06-02 18:36:16,628 - Solving for lambda took: 0.009323 seconds
2026-06-02 18:36:16,664 - Adjoint solve took: 0.04772 seconds to solve adjoint solution for PerfMeas: pm_single_alltimes (kper, kstp) (23, 1)
2026-06-02 18:36:16,665 - Write group to hdf file
2026-06-02 18:36:16,674 - Starting adjoint solve for PerfMeas: pm_single_alltimes (kper, kstp) (22, 1)
2026-06-02 18:36:16,676 - Solving for lambda
2026-06-02 18:36:16,676 - Solving with direct with solver options: {'use_umfpack': True}
2026-06-02 18:36:16,685 - Solving for lambda took: 0.009345 seconds
2026-06-02 18:36:16,721 - Adjoint solve took: 0.046937 seconds to solve adjoint solution for PerfMeas: pm_single_alltimes (kper, kstp) (22, 1)
2026-06-02 18:36:16,721 - Write group to hdf file
2026-06-02 18:36:16,729 - Starting adjoint solve for PerfMeas: pm_single_alltimes (kper, kstp) (21, 1)
2026-06-02 18:36:16,731 - Solving for lambda
2026-06-02 18:36:16,732 - Solving with direct with solver options: {'use_umfpack': True}
2026-06-02 18:36:16,741 - Solving for lambda took: 0.009371 seconds
2026-06-02 18:36:16,777 - Adjoint solve took: 0.047621 seconds to solve adjoint solution for PerfMeas: pm_single_alltimes (kper, kstp) (21, 1)
2026-06-02 18:36:16,778 - Write group to hdf file
2026-06-02 18:36:16,786 - Starting adjoint solve for PerfMeas: pm_single_alltimes (kper, kstp) (20, 1)
2026-06-02 18:36:16,788 - Solving for lambda
2026-06-02 18:36:16,789 - Solving with direct with solver options: {'use_umfpack': True}
2026-06-02 18:36:16,798 - Solving for lambda took: 0.009635 seconds
2026-06-02 18:36:16,835 - Adjoint solve took: 0.048263 seconds to solve adjoint solution for PerfMeas: pm_single_alltimes (kper, kstp) (20, 1)
2026-06-02 18:36:16,835 - Write group to hdf file
2026-06-02 18:36:16,844 - Starting adjoint solve for PerfMeas: pm_single_alltimes (kper, kstp) (19, 1)
2026-06-02 18:36:16,846 - Solving for lambda
2026-06-02 18:36:16,846 - Solving with direct with solver options: {'use_umfpack': True}
2026-06-02 18:36:16,856 - Solving for lambda took: 0.009903 seconds
2026-06-02 18:36:16,893 - Adjoint solve took: 0.049066 seconds to solve adjoint solution for PerfMeas: pm_single_alltimes (kper, kstp) (19, 1)
2026-06-02 18:36:16,894 - Write group to hdf file
2026-06-02 18:36:16,902 - Starting adjoint solve for PerfMeas: pm_single_alltimes (kper, kstp) (18, 1)
2026-06-02 18:36:16,904 - Solving for lambda
2026-06-02 18:36:16,905 - Solving with direct with solver options: {'use_umfpack': True}
2026-06-02 18:36:16,914 - Solving for lambda took: 0.00972 seconds
2026-06-02 18:36:16,949 - Adjoint solve took: 0.047081 seconds to solve adjoint solution for PerfMeas: pm_single_alltimes (kper, kstp) (18, 1)
2026-06-02 18:36:16,950 - Write group to hdf file
2026-06-02 18:36:16,959 - Starting adjoint solve for PerfMeas: pm_single_alltimes (kper, kstp) (17, 1)
2026-06-02 18:36:16,961 - Solving for lambda
2026-06-02 18:36:16,961 - Solving with direct with solver options: {'use_umfpack': True}
2026-06-02 18:36:16,970 - Solving for lambda took: 0.009534 seconds
2026-06-02 18:36:17,006 - Adjoint solve took: 0.047398 seconds to solve adjoint solution for PerfMeas: pm_single_alltimes (kper, kstp) (17, 1)
2026-06-02 18:36:17,007 - Write group to hdf file
2026-06-02 18:36:17,015 - Starting adjoint solve for PerfMeas: pm_single_alltimes (kper, kstp) (16, 1)
2026-06-02 18:36:17,017 - Solving for lambda
2026-06-02 18:36:17,018 - Solving with direct with solver options: {'use_umfpack': True}
2026-06-02 18:36:17,027 - Solving for lambda took: 0.009762 seconds
2026-06-02 18:36:17,062 - Adjoint solve took: 0.047324 seconds to solve adjoint solution for PerfMeas: pm_single_alltimes (kper, kstp) (16, 1)
2026-06-02 18:36:17,063 - Write group to hdf file
2026-06-02 18:36:17,072 - Starting adjoint solve for PerfMeas: pm_single_alltimes (kper, kstp) (15, 1)
2026-06-02 18:36:17,074 - Solving for lambda
2026-06-02 18:36:17,074 - Solving with direct with solver options: {'use_umfpack': True}
2026-06-02 18:36:17,083 - Solving for lambda took: 0.009436 seconds
2026-06-02 18:36:17,119 - Adjoint solve took: 0.047167 seconds to solve adjoint solution for PerfMeas: pm_single_alltimes (kper, kstp) (15, 1)
2026-06-02 18:36:17,119 - Write group to hdf file
2026-06-02 18:36:17,128 - Starting adjoint solve for PerfMeas: pm_single_alltimes (kper, kstp) (14, 1)
2026-06-02 18:36:17,130 - Solving for lambda
2026-06-02 18:36:17,130 - Solving with direct with solver options: {'use_umfpack': True}
2026-06-02 18:36:17,139 - Solving for lambda took: 0.009339 seconds
2026-06-02 18:36:17,175 - Adjoint solve took: 0.046722 seconds to solve adjoint solution for PerfMeas: pm_single_alltimes (kper, kstp) (14, 1)
2026-06-02 18:36:17,175 - Write group to hdf file
2026-06-02 18:36:17,184 - Starting adjoint solve for PerfMeas: pm_single_alltimes (kper, kstp) (13, 1)
2026-06-02 18:36:17,186 - Solving for lambda
2026-06-02 18:36:17,186 - Solving with direct with solver options: {'use_umfpack': True}
2026-06-02 18:36:17,195 - Solving for lambda took: 0.00924 seconds
2026-06-02 18:36:17,231 - Adjoint solve took: 0.047234 seconds to solve adjoint solution for PerfMeas: pm_single_alltimes (kper, kstp) (13, 1)
2026-06-02 18:36:17,232 - Write group to hdf file
2026-06-02 18:36:17,240 - Starting adjoint solve for PerfMeas: pm_single_alltimes (kper, kstp) (12, 1)
2026-06-02 18:36:17,242 - Solving for lambda
2026-06-02 18:36:17,243 - Solving with direct with solver options: {'use_umfpack': True}
2026-06-02 18:36:17,252 - Solving for lambda took: 0.009545 seconds
2026-06-02 18:36:17,288 - Adjoint solve took: 0.047414 seconds to solve adjoint solution for PerfMeas: pm_single_alltimes (kper, kstp) (12, 1)
2026-06-02 18:36:17,288 - Write group to hdf file
2026-06-02 18:36:17,297 - Starting adjoint solve for PerfMeas: pm_single_alltimes (kper, kstp) (11, 1)
2026-06-02 18:36:17,298 - Solving for lambda
2026-06-02 18:36:17,299 - Solving with direct with solver options: {'use_umfpack': True}
2026-06-02 18:36:17,308 - Solving for lambda took: 0.00947 seconds
2026-06-02 18:36:17,344 - Adjoint solve took: 0.047905 seconds to solve adjoint solution for PerfMeas: pm_single_alltimes (kper, kstp) (11, 1)
2026-06-02 18:36:17,345 - Write group to hdf file
2026-06-02 18:36:17,354 - Starting adjoint solve for PerfMeas: pm_single_alltimes (kper, kstp) (10, 1)
2026-06-02 18:36:17,356 - Solving for lambda
2026-06-02 18:36:17,357 - Solving with direct with solver options: {'use_umfpack': True}
2026-06-02 18:36:17,366 - Solving for lambda took: 0.009671 seconds
2026-06-02 18:36:17,402 - Adjoint solve took: 0.048564 seconds to solve adjoint solution for PerfMeas: pm_single_alltimes (kper, kstp) (10, 1)
2026-06-02 18:36:17,403 - Write group to hdf file
2026-06-02 18:36:17,412 - Starting adjoint solve for PerfMeas: pm_single_alltimes (kper, kstp) (9, 1)
2026-06-02 18:36:17,414 - Solving for lambda
2026-06-02 18:36:17,415 - Solving with direct with solver options: {'use_umfpack': True}
2026-06-02 18:36:17,426 - Solving for lambda took: 0.012129 seconds
2026-06-02 18:36:17,466 - Adjoint solve took: 0.053802 seconds to solve adjoint solution for PerfMeas: pm_single_alltimes (kper, kstp) (9, 1)
2026-06-02 18:36:17,466 - Write group to hdf file
2026-06-02 18:36:17,475 - Starting adjoint solve for PerfMeas: pm_single_alltimes (kper, kstp) (8, 1)
2026-06-02 18:36:17,477 - Solving for lambda
2026-06-02 18:36:17,478 - Solving with direct with solver options: {'use_umfpack': True}
2026-06-02 18:36:17,487 - Solving for lambda took: 0.009548 seconds
2026-06-02 18:36:17,523 - Adjoint solve took: 0.048075 seconds to solve adjoint solution for PerfMeas: pm_single_alltimes (kper, kstp) (8, 1)
2026-06-02 18:36:17,524 - Write group to hdf file
2026-06-02 18:36:17,533 - Starting adjoint solve for PerfMeas: pm_single_alltimes (kper, kstp) (7, 1)
2026-06-02 18:36:17,534 - Solving for lambda
2026-06-02 18:36:17,535 - Solving with direct with solver options: {'use_umfpack': True}
2026-06-02 18:36:17,544 - Solving for lambda took: 0.009532 seconds
2026-06-02 18:36:17,580 - Adjoint solve took: 0.047576 seconds to solve adjoint solution for PerfMeas: pm_single_alltimes (kper, kstp) (7, 1)
2026-06-02 18:36:17,581 - Write group to hdf file
2026-06-02 18:36:17,589 - Starting adjoint solve for PerfMeas: pm_single_alltimes (kper, kstp) (6, 1)
2026-06-02 18:36:17,591 - Solving for lambda
2026-06-02 18:36:17,592 - Solving with direct with solver options: {'use_umfpack': True}
2026-06-02 18:36:17,601 - Solving for lambda took: 0.009478 seconds
2026-06-02 18:36:17,638 - Adjoint solve took: 0.048255 seconds to solve adjoint solution for PerfMeas: pm_single_alltimes (kper, kstp) (6, 1)
2026-06-02 18:36:17,638 - Write group to hdf file
2026-06-02 18:36:17,647 - Starting adjoint solve for PerfMeas: pm_single_alltimes (kper, kstp) (5, 1)
2026-06-02 18:36:17,648 - Solving for lambda
2026-06-02 18:36:17,649 - Solving with direct with solver options: {'use_umfpack': True}
2026-06-02 18:36:17,658 - Solving for lambda took: 0.009422 seconds
2026-06-02 18:36:17,697 - Adjoint solve took: 0.050108 seconds to solve adjoint solution for PerfMeas: pm_single_alltimes (kper, kstp) (5, 1)
2026-06-02 18:36:17,698 - Write group to hdf file
2026-06-02 18:36:17,707 - Starting adjoint solve for PerfMeas: pm_single_alltimes (kper, kstp) (4, 1)
2026-06-02 18:36:17,709 - Solving for lambda
2026-06-02 18:36:17,709 - Solving with direct with solver options: {'use_umfpack': True}
2026-06-02 18:36:17,718 - Solving for lambda took: 0.009581 seconds
2026-06-02 18:36:17,755 - Adjoint solve took: 0.047757 seconds to solve adjoint solution for PerfMeas: pm_single_alltimes (kper, kstp) (4, 1)
2026-06-02 18:36:17,755 - Write group to hdf file
2026-06-02 18:36:17,764 - Starting adjoint solve for PerfMeas: pm_single_alltimes (kper, kstp) (3, 1)
2026-06-02 18:36:17,766 - Solving for lambda
2026-06-02 18:36:17,766 - Solving with direct with solver options: {'use_umfpack': True}
2026-06-02 18:36:17,775 - Solving for lambda took: 0.009493 seconds
2026-06-02 18:36:17,812 - Adjoint solve took: 0.047825 seconds to solve adjoint solution for PerfMeas: pm_single_alltimes (kper, kstp) (3, 1)
2026-06-02 18:36:17,812 - Write group to hdf file
2026-06-02 18:36:17,821 - Starting adjoint solve for PerfMeas: pm_single_alltimes (kper, kstp) (2, 1)
2026-06-02 18:36:17,823 - Solving for lambda
2026-06-02 18:36:17,823 - Solving with direct with solver options: {'use_umfpack': True}
2026-06-02 18:36:17,832 - Solving for lambda took: 0.00938 seconds
2026-06-02 18:36:17,868 - Adjoint solve took: 0.047433 seconds to solve adjoint solution for PerfMeas: pm_single_alltimes (kper, kstp) (2, 1)
2026-06-02 18:36:17,869 - Write group to hdf file
2026-06-02 18:36:17,878 - Starting adjoint solve for PerfMeas: pm_single_alltimes (kper, kstp) (1, 1)
2026-06-02 18:36:17,879 - Solving for lambda
2026-06-02 18:36:17,880 - Solving with direct with solver options: {'use_umfpack': True}
2026-06-02 18:36:17,889 - Solving for lambda took: 0.00972 seconds
2026-06-02 18:36:17,925 - Adjoint solve took: 0.04721 seconds to solve adjoint solution for PerfMeas: pm_single_alltimes (kper, kstp) (1, 1)
2026-06-02 18:36:17,925 - Write group to hdf file
2026-06-02 18:36:17,934 - Formulate composite sensitivities
2026-06-02 18:36:17,934 - Writing composite sensitivities
2026-06-02 18:36:17,944 - Adjoint solve took:     1.4706 seconds for pm 'pm_single_alltimes' at (kper,kstp) (1, 1)
2026-06-02 18:36:17,945 - Starting solve_adjoint at 2026-06-02 18:36:17.945554
2026-06-02 18:36:17,973 - Structured grid found, shape: (3, 40, 20)
2026-06-02 18:36:17,976 - Starting adjoint solve for PerfMeas: pm_ssr (kper, kstp) (25, 1)
2026-06-02 18:36:17,978 - Solving for lambda
2026-06-02 18:36:17,978 - Solving with direct with solver options: {'use_umfpack': True}
2026-06-02 18:36:17,988 - Solving for lambda took: 0.009481 seconds
2026-06-02 18:36:18,023 - Adjoint solve took: 0.047245 seconds to solve adjoint solution for PerfMeas: pm_ssr (kper, kstp) (25, 1)
2026-06-02 18:36:18,024 - Write group to hdf file
2026-06-02 18:36:18,032 - Starting adjoint solve for PerfMeas: pm_ssr (kper, kstp) (24, 1)
2026-06-02 18:36:18,034 - Solving for lambda
2026-06-02 18:36:18,035 - Solving with direct with solver options: {'use_umfpack': True}
2026-06-02 18:36:18,044 - Solving for lambda took: 0.009354 seconds
2026-06-02 18:36:18,079 - Adjoint solve took: 0.047022 seconds to solve adjoint solution for PerfMeas: pm_ssr (kper, kstp) (24, 1)
2026-06-02 18:36:18,080 - Write group to hdf file
2026-06-02 18:36:18,089 - Starting adjoint solve for PerfMeas: pm_ssr (kper, kstp) (23, 1)
2026-06-02 18:36:18,091 - Solving for lambda
2026-06-02 18:36:18,092 - Solving with direct with solver options: {'use_umfpack': True}
2026-06-02 18:36:18,100 - Solving for lambda took: 0.009308 seconds
2026-06-02 18:36:18,136 - Adjoint solve took: 0.046738 seconds to solve adjoint solution for PerfMeas: pm_ssr (kper, kstp) (23, 1)
2026-06-02 18:36:18,136 - Write group to hdf file
2026-06-02 18:36:18,145 - Starting adjoint solve for PerfMeas: pm_ssr (kper, kstp) (22, 1)
2026-06-02 18:36:18,147 - Solving for lambda
2026-06-02 18:36:18,147 - Solving with direct with solver options: {'use_umfpack': True}
2026-06-02 18:36:18,156 - Solving for lambda took: 0.009289 seconds
2026-06-02 18:36:18,192 - Adjoint solve took: 0.047472 seconds to solve adjoint solution for PerfMeas: pm_ssr (kper, kstp) (22, 1)
2026-06-02 18:36:18,193 - Write group to hdf file
2026-06-02 18:36:18,202 - Starting adjoint solve for PerfMeas: pm_ssr (kper, kstp) (21, 1)
2026-06-02 18:36:18,203 - Solving for lambda
2026-06-02 18:36:18,204 - Solving with direct with solver options: {'use_umfpack': True}
2026-06-02 18:36:18,213 - Solving for lambda took: 0.009231 seconds
2026-06-02 18:36:18,248 - Adjoint solve took: 0.046197 seconds to solve adjoint solution for PerfMeas: pm_ssr (kper, kstp) (21, 1)
2026-06-02 18:36:18,248 - Write group to hdf file
2026-06-02 18:36:18,257 - Starting adjoint solve for PerfMeas: pm_ssr (kper, kstp) (20, 1)
2026-06-02 18:36:18,258 - Solving for lambda
2026-06-02 18:36:18,259 - Solving with direct with solver options: {'use_umfpack': True}
2026-06-02 18:36:18,268 - Solving for lambda took: 0.009407 seconds
2026-06-02 18:36:18,304 - Adjoint solve took: 0.047086 seconds to solve adjoint solution for PerfMeas: pm_ssr (kper, kstp) (20, 1)
2026-06-02 18:36:18,304 - Write group to hdf file
2026-06-02 18:36:18,313 - Starting adjoint solve for PerfMeas: pm_ssr (kper, kstp) (19, 1)
2026-06-02 18:36:18,315 - Solving for lambda
2026-06-02 18:36:18,316 - Solving with direct with solver options: {'use_umfpack': True}
2026-06-02 18:36:18,324 - Solving for lambda took: 0.009299 seconds
2026-06-02 18:36:18,360 - Adjoint solve took: 0.047429 seconds to solve adjoint solution for PerfMeas: pm_ssr (kper, kstp) (19, 1)
2026-06-02 18:36:18,361 - Write group to hdf file
2026-06-02 18:36:18,369 - Starting adjoint solve for PerfMeas: pm_ssr (kper, kstp) (18, 1)
2026-06-02 18:36:18,371 - Solving for lambda
2026-06-02 18:36:18,372 - Solving with direct with solver options: {'use_umfpack': True}
2026-06-02 18:36:18,381 - Solving for lambda took: 0.00946 seconds
2026-06-02 18:36:18,416 - Adjoint solve took: 0.046652 seconds to solve adjoint solution for PerfMeas: pm_ssr (kper, kstp) (18, 1)
2026-06-02 18:36:18,416 - Write group to hdf file
2026-06-02 18:36:18,425 - Starting adjoint solve for PerfMeas: pm_ssr (kper, kstp) (17, 1)
2026-06-02 18:36:18,427 - Solving for lambda
2026-06-02 18:36:18,427 - Solving with direct with solver options: {'use_umfpack': True}
2026-06-02 18:36:18,436 - Solving for lambda took: 0.00923 seconds
2026-06-02 18:36:18,472 - Adjoint solve took: 0.047306 seconds to solve adjoint solution for PerfMeas: pm_ssr (kper, kstp) (17, 1)
2026-06-02 18:36:18,473 - Write group to hdf file
2026-06-02 18:36:18,481 - Starting adjoint solve for PerfMeas: pm_ssr (kper, kstp) (16, 1)
2026-06-02 18:36:18,483 - Solving for lambda
2026-06-02 18:36:18,484 - Solving with direct with solver options: {'use_umfpack': True}
2026-06-02 18:36:18,493 - Solving for lambda took: 0.009468 seconds
2026-06-02 18:36:18,529 - Adjoint solve took: 0.048008 seconds to solve adjoint solution for PerfMeas: pm_ssr (kper, kstp) (16, 1)
2026-06-02 18:36:18,530 - Write group to hdf file
2026-06-02 18:36:18,539 - Starting adjoint solve for PerfMeas: pm_ssr (kper, kstp) (15, 1)
2026-06-02 18:36:18,541 - Solving for lambda
2026-06-02 18:36:18,541 - Solving with direct with solver options: {'use_umfpack': True}
2026-06-02 18:36:18,550 - Solving for lambda took: 0.009483 seconds
2026-06-02 18:36:18,587 - Adjoint solve took: 0.048025 seconds to solve adjoint solution for PerfMeas: pm_ssr (kper, kstp) (15, 1)
2026-06-02 18:36:18,588 - Write group to hdf file
2026-06-02 18:36:18,596 - Starting adjoint solve for PerfMeas: pm_ssr (kper, kstp) (14, 1)
2026-06-02 18:36:18,598 - Solving for lambda
2026-06-02 18:36:18,599 - Solving with direct with solver options: {'use_umfpack': True}
2026-06-02 18:36:18,608 - Solving for lambda took: 0.009562 seconds
2026-06-02 18:36:18,644 - Adjoint solve took: 0.048169 seconds to solve adjoint solution for PerfMeas: pm_ssr (kper, kstp) (14, 1)
2026-06-02 18:36:18,645 - Write group to hdf file
2026-06-02 18:36:18,654 - Starting adjoint solve for PerfMeas: pm_ssr (kper, kstp) (13, 1)
2026-06-02 18:36:18,656 - Solving for lambda
2026-06-02 18:36:18,656 - Solving with direct with solver options: {'use_umfpack': True}
2026-06-02 18:36:18,665 - Solving for lambda took: 0.009497 seconds
2026-06-02 18:36:18,701 - Adjoint solve took: 0.047383 seconds to solve adjoint solution for PerfMeas: pm_ssr (kper, kstp) (13, 1)
2026-06-02 18:36:18,702 - Write group to hdf file
2026-06-02 18:36:18,711 - Starting adjoint solve for PerfMeas: pm_ssr (kper, kstp) (12, 1)
2026-06-02 18:36:18,712 - Solving for lambda
2026-06-02 18:36:18,713 - Solving with direct with solver options: {'use_umfpack': True}
2026-06-02 18:36:18,722 - Solving for lambda took: 0.009531 seconds
2026-06-02 18:36:18,759 - Adjoint solve took: 0.048023 seconds to solve adjoint solution for PerfMeas: pm_ssr (kper, kstp) (12, 1)
2026-06-02 18:36:18,759 - Write group to hdf file
2026-06-02 18:36:18,768 - Starting adjoint solve for PerfMeas: pm_ssr (kper, kstp) (11, 1)
2026-06-02 18:36:18,770 - Solving for lambda
2026-06-02 18:36:18,771 - Solving with direct with solver options: {'use_umfpack': True}
2026-06-02 18:36:18,780 - Solving for lambda took: 0.009457 seconds
2026-06-02 18:36:18,816 - Adjoint solve took: 0.047679 seconds to solve adjoint solution for PerfMeas: pm_ssr (kper, kstp) (11, 1)
2026-06-02 18:36:18,816 - Write group to hdf file
2026-06-02 18:36:18,825 - Starting adjoint solve for PerfMeas: pm_ssr (kper, kstp) (10, 1)
2026-06-02 18:36:18,827 - Solving for lambda
2026-06-02 18:36:18,828 - Solving with direct with solver options: {'use_umfpack': True}
2026-06-02 18:36:18,836 - Solving for lambda took: 0.009374 seconds
2026-06-02 18:36:18,873 - Adjoint solve took: 0.048199 seconds to solve adjoint solution for PerfMeas: pm_ssr (kper, kstp) (10, 1)
2026-06-02 18:36:18,874 - Write group to hdf file
2026-06-02 18:36:18,882 - Starting adjoint solve for PerfMeas: pm_ssr (kper, kstp) (9, 1)
2026-06-02 18:36:18,885 - Solving for lambda
2026-06-02 18:36:18,885 - Solving with direct with solver options: {'use_umfpack': True}
2026-06-02 18:36:18,894 - Solving for lambda took: 0.009457 seconds
2026-06-02 18:36:18,930 - Adjoint solve took: 0.047214 seconds to solve adjoint solution for PerfMeas: pm_ssr (kper, kstp) (9, 1)
2026-06-02 18:36:18,930 - Write group to hdf file
2026-06-02 18:36:18,939 - Starting adjoint solve for PerfMeas: pm_ssr (kper, kstp) (8, 1)
2026-06-02 18:36:18,941 - Solving for lambda
2026-06-02 18:36:18,942 - Solving with direct with solver options: {'use_umfpack': True}
2026-06-02 18:36:18,951 - Solving for lambda took: 0.009641 seconds
2026-06-02 18:36:18,987 - Adjoint solve took: 0.048339 seconds to solve adjoint solution for PerfMeas: pm_ssr (kper, kstp) (8, 1)
2026-06-02 18:36:18,988 - Write group to hdf file
2026-06-02 18:36:18,996 - Starting adjoint solve for PerfMeas: pm_ssr (kper, kstp) (7, 1)
2026-06-02 18:36:18,998 - Solving for lambda
2026-06-02 18:36:18,999 - Solving with direct with solver options: {'use_umfpack': True}
2026-06-02 18:36:19,008 - Solving for lambda took: 0.009555 seconds
2026-06-02 18:36:19,044 - Adjoint solve took: 0.047985 seconds to solve adjoint solution for PerfMeas: pm_ssr (kper, kstp) (7, 1)
2026-06-02 18:36:19,045 - Write group to hdf file
2026-06-02 18:36:19,053 - Starting adjoint solve for PerfMeas: pm_ssr (kper, kstp) (6, 1)
2026-06-02 18:36:19,055 - Solving for lambda
2026-06-02 18:36:19,056 - Solving with direct with solver options: {'use_umfpack': True}
2026-06-02 18:36:19,065 - Solving for lambda took: 0.009504 seconds
2026-06-02 18:36:19,101 - Adjoint solve took: 0.047437 seconds to solve adjoint solution for PerfMeas: pm_ssr (kper, kstp) (6, 1)
2026-06-02 18:36:19,101 - Write group to hdf file
2026-06-02 18:36:19,110 - Starting adjoint solve for PerfMeas: pm_ssr (kper, kstp) (5, 1)
2026-06-02 18:36:19,112 - Solving for lambda
2026-06-02 18:36:19,113 - Solving with direct with solver options: {'use_umfpack': True}
2026-06-02 18:36:19,122 - Solving for lambda took: 0.009473 seconds
2026-06-02 18:36:19,158 - Adjoint solve took: 0.047655 seconds to solve adjoint solution for PerfMeas: pm_ssr (kper, kstp) (5, 1)
2026-06-02 18:36:19,159 - Write group to hdf file
2026-06-02 18:36:19,167 - Starting adjoint solve for PerfMeas: pm_ssr (kper, kstp) (4, 1)
2026-06-02 18:36:19,169 - Solving for lambda
2026-06-02 18:36:19,170 - Solving with direct with solver options: {'use_umfpack': True}
2026-06-02 18:36:19,179 - Solving for lambda took: 0.009582 seconds
2026-06-02 18:36:19,214 - Adjoint solve took: 0.047198 seconds to solve adjoint solution for PerfMeas: pm_ssr (kper, kstp) (4, 1)
2026-06-02 18:36:19,215 - Write group to hdf file
2026-06-02 18:36:19,223 - Starting adjoint solve for PerfMeas: pm_ssr (kper, kstp) (3, 1)
2026-06-02 18:36:19,225 - Solving for lambda
2026-06-02 18:36:19,226 - Solving with direct with solver options: {'use_umfpack': True}
2026-06-02 18:36:19,235 - Solving for lambda took: 0.009355 seconds
2026-06-02 18:36:19,271 - Adjoint solve took: 0.047769 seconds to solve adjoint solution for PerfMeas: pm_ssr (kper, kstp) (3, 1)
2026-06-02 18:36:19,272 - Write group to hdf file
2026-06-02 18:36:19,280 - Starting adjoint solve for PerfMeas: pm_ssr (kper, kstp) (2, 1)
2026-06-02 18:36:19,282 - Solving for lambda
2026-06-02 18:36:19,283 - Solving with direct with solver options: {'use_umfpack': True}
2026-06-02 18:36:19,292 - Solving for lambda took: 0.00935 seconds
2026-06-02 18:36:19,328 - Adjoint solve took: 0.047502 seconds to solve adjoint solution for PerfMeas: pm_ssr (kper, kstp) (2, 1)
2026-06-02 18:36:19,328 - Write group to hdf file
2026-06-02 18:36:19,337 - Starting adjoint solve for PerfMeas: pm_ssr (kper, kstp) (1, 1)
2026-06-02 18:36:19,339 - Solving for lambda
2026-06-02 18:36:19,340 - Solving with direct with solver options: {'use_umfpack': True}
2026-06-02 18:36:19,348 - Solving for lambda took: 0.009316 seconds
2026-06-02 18:36:19,385 - Adjoint solve took: 0.047413 seconds to solve adjoint solution for PerfMeas: pm_ssr (kper, kstp) (1, 1)
2026-06-02 18:36:19,385 - Write group to hdf file
2026-06-02 18:36:19,393 - Formulate composite sensitivities
2026-06-02 18:36:19,394 - Writing composite sensitivities
2026-06-02 18:36:19,404 - Adjoint solve took:     1.4585 seconds for pm 'pm_ssr' at (kper,kstp) (1, 1)
2026-06-02 18:36:19,404 - Starting solve_adjoint at 2026-06-02 18:36:19.404754
2026-06-02 18:36:19,432 - Structured grid found, shape: (3, 40, 20)
2026-06-02 18:36:19,434 - Starting adjoint solve for PerfMeas: headwater (kper, kstp) (25, 1)
2026-06-02 18:36:19,436 - Solving for lambda
2026-06-02 18:36:19,437 - Solving with direct with solver options: {'use_umfpack': True}
2026-06-02 18:36:19,446 - Solving for lambda took: 0.00936 seconds
2026-06-02 18:36:19,482 - Adjoint solve took: 0.048023 seconds to solve adjoint solution for PerfMeas: headwater (kper, kstp) (25, 1)
2026-06-02 18:36:19,483 - Write group to hdf file
2026-06-02 18:36:19,492 - Starting adjoint solve for PerfMeas: headwater (kper, kstp) (24, 1)
2026-06-02 18:36:19,494 - Solving for lambda
2026-06-02 18:36:19,495 - Solving with direct with solver options: {'use_umfpack': True}
2026-06-02 18:36:19,504 - Solving for lambda took: 0.009495 seconds
2026-06-02 18:36:19,540 - Adjoint solve took: 0.048428 seconds to solve adjoint solution for PerfMeas: headwater (kper, kstp) (24, 1)
2026-06-02 18:36:19,541 - Write group to hdf file
2026-06-02 18:36:19,550 - Starting adjoint solve for PerfMeas: headwater (kper, kstp) (23, 1)
2026-06-02 18:36:19,552 - Solving for lambda
2026-06-02 18:36:19,553 - Solving with direct with solver options: {'use_umfpack': True}
2026-06-02 18:36:19,562 - Solving for lambda took: 0.009525 seconds
2026-06-02 18:36:19,599 - Adjoint solve took: 0.049043 seconds to solve adjoint solution for PerfMeas: headwater (kper, kstp) (23, 1)
2026-06-02 18:36:19,600 - Write group to hdf file
2026-06-02 18:36:19,609 - Starting adjoint solve for PerfMeas: headwater (kper, kstp) (22, 1)
2026-06-02 18:36:19,610 - Solving for lambda
2026-06-02 18:36:19,611 - Solving with direct with solver options: {'use_umfpack': True}
2026-06-02 18:36:19,620 - Solving for lambda took: 0.00942 seconds
2026-06-02 18:36:19,656 - Adjoint solve took: 0.047377 seconds to solve adjoint solution for PerfMeas: headwater (kper, kstp) (22, 1)
2026-06-02 18:36:19,656 - Write group to hdf file
2026-06-02 18:36:19,665 - Starting adjoint solve for PerfMeas: headwater (kper, kstp) (21, 1)
2026-06-02 18:36:19,667 - Solving for lambda
2026-06-02 18:36:19,667 - Solving with direct with solver options: {'use_umfpack': True}
2026-06-02 18:36:19,676 - Solving for lambda took: 0.009534 seconds
2026-06-02 18:36:19,713 - Adjoint solve took: 0.048009 seconds to solve adjoint solution for PerfMeas: headwater (kper, kstp) (21, 1)
2026-06-02 18:36:19,714 - Write group to hdf file
2026-06-02 18:36:19,722 - Starting adjoint solve for PerfMeas: headwater (kper, kstp) (20, 1)
2026-06-02 18:36:19,725 - Solving for lambda
2026-06-02 18:36:19,725 - Solving with direct with solver options: {'use_umfpack': True}
2026-06-02 18:36:19,734 - Solving for lambda took: 0.009463 seconds
2026-06-02 18:36:19,771 - Adjoint solve took: 0.048226 seconds to solve adjoint solution for PerfMeas: headwater (kper, kstp) (20, 1)
2026-06-02 18:36:19,771 - Write group to hdf file
2026-06-02 18:36:19,780 - Starting adjoint solve for PerfMeas: headwater (kper, kstp) (19, 1)
2026-06-02 18:36:19,782 - Solving for lambda
2026-06-02 18:36:19,782 - Solving with direct with solver options: {'use_umfpack': True}
2026-06-02 18:36:19,791 - Solving for lambda took: 0.009376 seconds
2026-06-02 18:36:19,828 - Adjoint solve took: 0.047831 seconds to solve adjoint solution for PerfMeas: headwater (kper, kstp) (19, 1)
2026-06-02 18:36:19,829 - Write group to hdf file
2026-06-02 18:36:19,837 - Starting adjoint solve for PerfMeas: headwater (kper, kstp) (18, 1)
2026-06-02 18:36:19,840 - Solving for lambda
2026-06-02 18:36:19,840 - Solving with direct with solver options: {'use_umfpack': True}
2026-06-02 18:36:19,849 - Solving for lambda took: 0.009499 seconds
2026-06-02 18:36:19,885 - Adjoint solve took: 0.047678 seconds to solve adjoint solution for PerfMeas: headwater (kper, kstp) (18, 1)
2026-06-02 18:36:19,885 - Write group to hdf file
2026-06-02 18:36:19,894 - Starting adjoint solve for PerfMeas: headwater (kper, kstp) (17, 1)
2026-06-02 18:36:19,896 - Solving for lambda
2026-06-02 18:36:19,897 - Solving with direct with solver options: {'use_umfpack': True}
2026-06-02 18:36:19,906 - Solving for lambda took: 0.009643 seconds
2026-06-02 18:36:19,942 - Adjoint solve took: 0.047876 seconds to solve adjoint solution for PerfMeas: headwater (kper, kstp) (17, 1)
2026-06-02 18:36:19,942 - Write group to hdf file
2026-06-02 18:36:19,951 - Starting adjoint solve for PerfMeas: headwater (kper, kstp) (16, 1)
2026-06-02 18:36:19,953 - Solving for lambda
2026-06-02 18:36:19,954 - Solving with direct with solver options: {'use_umfpack': True}
2026-06-02 18:36:19,963 - Solving for lambda took: 0.009497 seconds
2026-06-02 18:36:19,999 - Adjoint solve took: 0.047543 seconds to solve adjoint solution for PerfMeas: headwater (kper, kstp) (16, 1)
2026-06-02 18:36:19,999 - Write group to hdf file
2026-06-02 18:36:20,008 - Starting adjoint solve for PerfMeas: headwater (kper, kstp) (15, 1)
2026-06-02 18:36:20,010 - Solving for lambda
2026-06-02 18:36:20,011 - Solving with direct with solver options: {'use_umfpack': True}
2026-06-02 18:36:20,019 - Solving for lambda took: 0.00956 seconds
2026-06-02 18:36:20,056 - Adjoint solve took: 0.047852 seconds to solve adjoint solution for PerfMeas: headwater (kper, kstp) (15, 1)
2026-06-02 18:36:20,056 - Write group to hdf file
2026-06-02 18:36:20,065 - Starting adjoint solve for PerfMeas: headwater (kper, kstp) (14, 1)
2026-06-02 18:36:20,067 - Solving for lambda
2026-06-02 18:36:20,068 - Solving with direct with solver options: {'use_umfpack': True}
2026-06-02 18:36:20,077 - Solving for lambda took: 0.009444 seconds
2026-06-02 18:36:20,113 - Adjoint solve took: 0.047574 seconds to solve adjoint solution for PerfMeas: headwater (kper, kstp) (14, 1)
2026-06-02 18:36:20,113 - Write group to hdf file
2026-06-02 18:36:20,122 - Starting adjoint solve for PerfMeas: headwater (kper, kstp) (13, 1)
2026-06-02 18:36:20,124 - Solving for lambda
2026-06-02 18:36:20,124 - Solving with direct with solver options: {'use_umfpack': True}
2026-06-02 18:36:20,133 - Solving for lambda took: 0.009281 seconds
2026-06-02 18:36:20,168 - Adjoint solve took: 0.046732 seconds to solve adjoint solution for PerfMeas: headwater (kper, kstp) (13, 1)
2026-06-02 18:36:20,169 - Write group to hdf file
2026-06-02 18:36:20,178 - Starting adjoint solve for PerfMeas: headwater (kper, kstp) (12, 1)
2026-06-02 18:36:20,180 - Solving for lambda
2026-06-02 18:36:20,180 - Solving with direct with solver options: {'use_umfpack': True}
2026-06-02 18:36:20,189 - Solving for lambda took: 0.009379 seconds
2026-06-02 18:36:20,226 - Adjoint solve took: 0.047947 seconds to solve adjoint solution for PerfMeas: headwater (kper, kstp) (12, 1)
2026-06-02 18:36:20,226 - Write group to hdf file
2026-06-02 18:36:20,235 - Starting adjoint solve for PerfMeas: headwater (kper, kstp) (11, 1)
2026-06-02 18:36:20,237 - Solving for lambda
2026-06-02 18:36:20,237 - Solving with direct with solver options: {'use_umfpack': True}
2026-06-02 18:36:20,246 - Solving for lambda took: 0.009519 seconds
2026-06-02 18:36:20,283 - Adjoint solve took: 0.048154 seconds to solve adjoint solution for PerfMeas: headwater (kper, kstp) (11, 1)
2026-06-02 18:36:20,283 - Write group to hdf file
2026-06-02 18:36:20,292 - Starting adjoint solve for PerfMeas: headwater (kper, kstp) (10, 1)
2026-06-02 18:36:20,294 - Solving for lambda
2026-06-02 18:36:20,295 - Solving with direct with solver options: {'use_umfpack': True}
2026-06-02 18:36:20,304 - Solving for lambda took: 0.009382 seconds
2026-06-02 18:36:20,340 - Adjoint solve took: 0.048067 seconds to solve adjoint solution for PerfMeas: headwater (kper, kstp) (10, 1)
2026-06-02 18:36:20,341 - Write group to hdf file
2026-06-02 18:36:20,350 - Starting adjoint solve for PerfMeas: headwater (kper, kstp) (9, 1)
2026-06-02 18:36:20,351 - Solving for lambda
2026-06-02 18:36:20,352 - Solving with direct with solver options: {'use_umfpack': True}
2026-06-02 18:36:20,361 - Solving for lambda took: 0.009394 seconds
2026-06-02 18:36:20,397 - Adjoint solve took: 0.047063 seconds to solve adjoint solution for PerfMeas: headwater (kper, kstp) (9, 1)
2026-06-02 18:36:20,397 - Write group to hdf file
2026-06-02 18:36:20,406 - Starting adjoint solve for PerfMeas: headwater (kper, kstp) (8, 1)
2026-06-02 18:36:20,407 - Solving for lambda
2026-06-02 18:36:20,408 - Solving with direct with solver options: {'use_umfpack': True}
2026-06-02 18:36:20,417 - Solving for lambda took: 0.009362 seconds
2026-06-02 18:36:20,453 - Adjoint solve took: 0.047722 seconds to solve adjoint solution for PerfMeas: headwater (kper, kstp) (8, 1)
2026-06-02 18:36:20,454 - Write group to hdf file
2026-06-02 18:36:20,463 - Starting adjoint solve for PerfMeas: headwater (kper, kstp) (7, 1)
2026-06-02 18:36:20,465 - Solving for lambda
2026-06-02 18:36:20,465 - Solving with direct with solver options: {'use_umfpack': True}
2026-06-02 18:36:20,474 - Solving for lambda took: 0.009513 seconds
2026-06-02 18:36:20,510 - Adjoint solve took: 0.047255 seconds to solve adjoint solution for PerfMeas: headwater (kper, kstp) (7, 1)
2026-06-02 18:36:20,511 - Write group to hdf file
2026-06-02 18:36:20,519 - Starting adjoint solve for PerfMeas: headwater (kper, kstp) (6, 1)
2026-06-02 18:36:20,521 - Solving for lambda
2026-06-02 18:36:20,522 - Solving with direct with solver options: {'use_umfpack': True}
2026-06-02 18:36:20,530 - Solving for lambda took: 0.009369 seconds
2026-06-02 18:36:20,566 - Adjoint solve took: 0.047177 seconds to solve adjoint solution for PerfMeas: headwater (kper, kstp) (6, 1)
2026-06-02 18:36:20,567 - Write group to hdf file
2026-06-02 18:36:20,576 - Starting adjoint solve for PerfMeas: headwater (kper, kstp) (5, 1)
2026-06-02 18:36:20,577 - Solving for lambda
2026-06-02 18:36:20,578 - Solving with direct with solver options: {'use_umfpack': True}
2026-06-02 18:36:20,587 - Solving for lambda took: 0.009518 seconds
2026-06-02 18:36:20,623 - Adjoint solve took: 0.047124 seconds to solve adjoint solution for PerfMeas: headwater (kper, kstp) (5, 1)
2026-06-02 18:36:20,623 - Write group to hdf file
2026-06-02 18:36:20,632 - Starting adjoint solve for PerfMeas: headwater (kper, kstp) (4, 1)
2026-06-02 18:36:20,634 - Solving for lambda
2026-06-02 18:36:20,635 - Solving with direct with solver options: {'use_umfpack': True}
2026-06-02 18:36:20,643 - Solving for lambda took: 0.009315 seconds
2026-06-02 18:36:20,680 - Adjoint solve took: 0.047923 seconds to solve adjoint solution for PerfMeas: headwater (kper, kstp) (4, 1)
2026-06-02 18:36:20,680 - Write group to hdf file
2026-06-02 18:36:20,689 - Starting adjoint solve for PerfMeas: headwater (kper, kstp) (3, 1)
2026-06-02 18:36:20,691 - Solving for lambda
2026-06-02 18:36:20,692 - Solving with direct with solver options: {'use_umfpack': True}
2026-06-02 18:36:20,700 - Solving for lambda took: 0.009368 seconds
2026-06-02 18:36:20,737 - Adjoint solve took: 0.047568 seconds to solve adjoint solution for PerfMeas: headwater (kper, kstp) (3, 1)
2026-06-02 18:36:20,737 - Write group to hdf file
2026-06-02 18:36:20,746 - Starting adjoint solve for PerfMeas: headwater (kper, kstp) (2, 1)
2026-06-02 18:36:20,748 - Solving for lambda
2026-06-02 18:36:20,748 - Solving with direct with solver options: {'use_umfpack': True}
2026-06-02 18:36:20,757 - Solving for lambda took: 0.009419 seconds
2026-06-02 18:36:20,793 - Adjoint solve took: 0.046885 seconds to solve adjoint solution for PerfMeas: headwater (kper, kstp) (2, 1)
2026-06-02 18:36:20,793 - Write group to hdf file
2026-06-02 18:36:20,802 - Starting adjoint solve for PerfMeas: headwater (kper, kstp) (1, 1)
2026-06-02 18:36:20,804 - Solving for lambda
2026-06-02 18:36:20,804 - Solving with direct with solver options: {'use_umfpack': True}
2026-06-02 18:36:20,813 - Solving for lambda took: 0.009455 seconds
2026-06-02 18:36:20,849 - Adjoint solve took: 0.04686 seconds to solve adjoint solution for PerfMeas: headwater (kper, kstp) (1, 1)
2026-06-02 18:36:20,849 - Write group to hdf file
2026-06-02 18:36:20,858 - Formulate composite sensitivities
2026-06-02 18:36:20,858 - Writing composite sensitivities
2026-06-02 18:36:20,868 - Adjoint solve took:      1.464 seconds for pm 'headwater' at (kper,kstp) (1, 1)
2026-06-02 18:36:20,869 - Starting solve_adjoint at 2026-06-02 18:36:20.869283
2026-06-02 18:36:20,898 - Structured grid found, shape: (3, 40, 20)
2026-06-02 18:36:20,900 - Starting adjoint solve for PerfMeas: tailwater (kper, kstp) (25, 1)
2026-06-02 18:36:20,902 - Solving for lambda
2026-06-02 18:36:20,903 - Solving with direct with solver options: {'use_umfpack': True}
2026-06-02 18:36:20,912 - Solving for lambda took: 0.009638 seconds
2026-06-02 18:36:20,948 - Adjoint solve took: 0.048088 seconds to solve adjoint solution for PerfMeas: tailwater (kper, kstp) (25, 1)
2026-06-02 18:36:20,949 - Write group to hdf file
2026-06-02 18:36:20,957 - Starting adjoint solve for PerfMeas: tailwater (kper, kstp) (24, 1)
2026-06-02 18:36:20,959 - Solving for lambda
2026-06-02 18:36:20,960 - Solving with direct with solver options: {'use_umfpack': True}
2026-06-02 18:36:20,969 - Solving for lambda took: 0.009715 seconds
2026-06-02 18:36:21,006 - Adjoint solve took: 0.048197 seconds to solve adjoint solution for PerfMeas: tailwater (kper, kstp) (24, 1)
2026-06-02 18:36:21,006 - Write group to hdf file
2026-06-02 18:36:21,015 - Starting adjoint solve for PerfMeas: tailwater (kper, kstp) (23, 1)
2026-06-02 18:36:21,017 - Solving for lambda
2026-06-02 18:36:21,018 - Solving with direct with solver options: {'use_umfpack': True}
2026-06-02 18:36:21,027 - Solving for lambda took: 0.009641 seconds
2026-06-02 18:36:21,063 - Adjoint solve took: 0.048109 seconds to solve adjoint solution for PerfMeas: tailwater (kper, kstp) (23, 1)
2026-06-02 18:36:21,064 - Write group to hdf file
2026-06-02 18:36:21,073 - Starting adjoint solve for PerfMeas: tailwater (kper, kstp) (22, 1)
2026-06-02 18:36:21,075 - Solving for lambda
2026-06-02 18:36:21,075 - Solving with direct with solver options: {'use_umfpack': True}
2026-06-02 18:36:21,084 - Solving for lambda took: 0.009557 seconds
2026-06-02 18:36:21,120 - Adjoint solve took: 0.047767 seconds to solve adjoint solution for PerfMeas: tailwater (kper, kstp) (22, 1)
2026-06-02 18:36:21,121 - Write group to hdf file
2026-06-02 18:36:21,130 - Starting adjoint solve for PerfMeas: tailwater (kper, kstp) (21, 1)
2026-06-02 18:36:21,132 - Solving for lambda
2026-06-02 18:36:21,132 - Solving with direct with solver options: {'use_umfpack': True}
2026-06-02 18:36:21,141 - Solving for lambda took: 0.009782 seconds
2026-06-02 18:36:21,178 - Adjoint solve took: 0.048364 seconds to solve adjoint solution for PerfMeas: tailwater (kper, kstp) (21, 1)
2026-06-02 18:36:21,179 - Write group to hdf file
2026-06-02 18:36:21,187 - Starting adjoint solve for PerfMeas: tailwater (kper, kstp) (20, 1)
2026-06-02 18:36:21,189 - Solving for lambda
2026-06-02 18:36:21,190 - Solving with direct with solver options: {'use_umfpack': True}
2026-06-02 18:36:21,199 - Solving for lambda took: 0.009803 seconds
2026-06-02 18:36:21,235 - Adjoint solve took: 0.047582 seconds to solve adjoint solution for PerfMeas: tailwater (kper, kstp) (20, 1)
2026-06-02 18:36:21,235 - Write group to hdf file
2026-06-02 18:36:21,244 - Starting adjoint solve for PerfMeas: tailwater (kper, kstp) (19, 1)
2026-06-02 18:36:21,246 - Solving for lambda
2026-06-02 18:36:21,246 - Solving with direct with solver options: {'use_umfpack': True}
2026-06-02 18:36:21,255 - Solving for lambda took: 0.009539 seconds
2026-06-02 18:36:21,291 - Adjoint solve took: 0.04729 seconds to solve adjoint solution for PerfMeas: tailwater (kper, kstp) (19, 1)
2026-06-02 18:36:21,292 - Write group to hdf file
2026-06-02 18:36:21,300 - Starting adjoint solve for PerfMeas: tailwater (kper, kstp) (18, 1)
2026-06-02 18:36:21,302 - Solving for lambda
2026-06-02 18:36:21,303 - Solving with direct with solver options: {'use_umfpack': True}
2026-06-02 18:36:21,312 - Solving for lambda took: 0.009728 seconds
2026-06-02 18:36:21,349 - Adjoint solve took: 0.048207 seconds to solve adjoint solution for PerfMeas: tailwater (kper, kstp) (18, 1)
2026-06-02 18:36:21,349 - Write group to hdf file
2026-06-02 18:36:21,358 - Starting adjoint solve for PerfMeas: tailwater (kper, kstp) (17, 1)
2026-06-02 18:36:21,360 - Solving for lambda
2026-06-02 18:36:21,360 - Solving with direct with solver options: {'use_umfpack': True}
2026-06-02 18:36:21,369 - Solving for lambda took: 0.009602 seconds
2026-06-02 18:36:21,406 - Adjoint solve took: 0.048061 seconds to solve adjoint solution for PerfMeas: tailwater (kper, kstp) (17, 1)
2026-06-02 18:36:21,407 - Write group to hdf file
2026-06-02 18:36:21,415 - Starting adjoint solve for PerfMeas: tailwater (kper, kstp) (16, 1)
2026-06-02 18:36:21,417 - Solving for lambda
2026-06-02 18:36:21,418 - Solving with direct with solver options: {'use_umfpack': True}
2026-06-02 18:36:21,426 - Solving for lambda took: 0.009587 seconds
2026-06-02 18:36:21,463 - Adjoint solve took: 0.047829 seconds to solve adjoint solution for PerfMeas: tailwater (kper, kstp) (16, 1)
2026-06-02 18:36:21,463 - Write group to hdf file
2026-06-02 18:36:21,472 - Starting adjoint solve for PerfMeas: tailwater (kper, kstp) (15, 1)
2026-06-02 18:36:21,474 - Solving for lambda
2026-06-02 18:36:21,475 - Solving with direct with solver options: {'use_umfpack': True}
2026-06-02 18:36:21,484 - Solving for lambda took: 0.00954 seconds
2026-06-02 18:36:21,520 - Adjoint solve took: 0.047632 seconds to solve adjoint solution for PerfMeas: tailwater (kper, kstp) (15, 1)
2026-06-02 18:36:21,521 - Write group to hdf file
2026-06-02 18:36:21,529 - Starting adjoint solve for PerfMeas: tailwater (kper, kstp) (14, 1)
2026-06-02 18:36:21,531 - Solving for lambda
2026-06-02 18:36:21,532 - Solving with direct with solver options: {'use_umfpack': True}
2026-06-02 18:36:21,541 - Solving for lambda took: 0.009521 seconds
2026-06-02 18:36:21,577 - Adjoint solve took: 0.047851 seconds to solve adjoint solution for PerfMeas: tailwater (kper, kstp) (14, 1)
2026-06-02 18:36:21,578 - Write group to hdf file
2026-06-02 18:36:21,586 - Starting adjoint solve for PerfMeas: tailwater (kper, kstp) (13, 1)
2026-06-02 18:36:21,588 - Solving for lambda
2026-06-02 18:36:21,589 - Solving with direct with solver options: {'use_umfpack': True}
2026-06-02 18:36:21,598 - Solving for lambda took: 0.009558 seconds
2026-06-02 18:36:21,634 - Adjoint solve took: 0.048001 seconds to solve adjoint solution for PerfMeas: tailwater (kper, kstp) (13, 1)
2026-06-02 18:36:21,635 - Write group to hdf file
2026-06-02 18:36:21,644 - Starting adjoint solve for PerfMeas: tailwater (kper, kstp) (12, 1)
2026-06-02 18:36:21,645 - Solving for lambda
2026-06-02 18:36:21,646 - Solving with direct with solver options: {'use_umfpack': True}
2026-06-02 18:36:21,655 - Solving for lambda took: 0.009466 seconds
2026-06-02 18:36:21,691 - Adjoint solve took: 0.047577 seconds to solve adjoint solution for PerfMeas: tailwater (kper, kstp) (12, 1)
2026-06-02 18:36:21,692 - Write group to hdf file
2026-06-02 18:36:21,700 - Starting adjoint solve for PerfMeas: tailwater (kper, kstp) (11, 1)
2026-06-02 18:36:21,702 - Solving for lambda
2026-06-02 18:36:21,703 - Solving with direct with solver options: {'use_umfpack': True}
2026-06-02 18:36:21,712 - Solving for lambda took: 0.009698 seconds
2026-06-02 18:36:21,748 - Adjoint solve took: 0.048124 seconds to solve adjoint solution for PerfMeas: tailwater (kper, kstp) (11, 1)
2026-06-02 18:36:21,749 - Write group to hdf file
2026-06-02 18:36:21,758 - Starting adjoint solve for PerfMeas: tailwater (kper, kstp) (10, 1)
2026-06-02 18:36:21,760 - Solving for lambda
2026-06-02 18:36:21,761 - Solving with direct with solver options: {'use_umfpack': True}
2026-06-02 18:36:21,770 - Solving for lambda took: 0.009702 seconds
2026-06-02 18:36:21,807 - Adjoint solve took: 0.048751 seconds to solve adjoint solution for PerfMeas: tailwater (kper, kstp) (10, 1)
2026-06-02 18:36:21,807 - Write group to hdf file
2026-06-02 18:36:21,816 - Starting adjoint solve for PerfMeas: tailwater (kper, kstp) (9, 1)
2026-06-02 18:36:21,818 - Solving for lambda
2026-06-02 18:36:21,819 - Solving with direct with solver options: {'use_umfpack': True}
2026-06-02 18:36:21,828 - Solving for lambda took: 0.00968 seconds
2026-06-02 18:36:21,865 - Adjoint solve took: 0.048394 seconds to solve adjoint solution for PerfMeas: tailwater (kper, kstp) (9, 1)
2026-06-02 18:36:21,865 - Write group to hdf file
2026-06-02 18:36:21,874 - Starting adjoint solve for PerfMeas: tailwater (kper, kstp) (8, 1)
2026-06-02 18:36:21,876 - Solving for lambda
2026-06-02 18:36:21,876 - Solving with direct with solver options: {'use_umfpack': True}
2026-06-02 18:36:21,885 - Solving for lambda took: 0.009569 seconds
2026-06-02 18:36:21,922 - Adjoint solve took: 0.047813 seconds to solve adjoint solution for PerfMeas: tailwater (kper, kstp) (8, 1)
2026-06-02 18:36:21,922 - Write group to hdf file
2026-06-02 18:36:21,931 - Starting adjoint solve for PerfMeas: tailwater (kper, kstp) (7, 1)
2026-06-02 18:36:21,933 - Solving for lambda
2026-06-02 18:36:21,934 - Solving with direct with solver options: {'use_umfpack': True}
2026-06-02 18:36:21,942 - Solving for lambda took: 0.009545 seconds
2026-06-02 18:36:21,979 - Adjoint solve took: 0.048253 seconds to solve adjoint solution for PerfMeas: tailwater (kper, kstp) (7, 1)
2026-06-02 18:36:21,980 - Write group to hdf file
2026-06-02 18:36:21,989 - Starting adjoint solve for PerfMeas: tailwater (kper, kstp) (6, 1)
2026-06-02 18:36:21,990 - Solving for lambda
2026-06-02 18:36:21,991 - Solving with direct with solver options: {'use_umfpack': True}
2026-06-02 18:36:22,000 - Solving for lambda took: 0.009592 seconds
2026-06-02 18:36:22,036 - Adjoint solve took: 0.047727 seconds to solve adjoint solution for PerfMeas: tailwater (kper, kstp) (6, 1)
2026-06-02 18:36:22,037 - Write group to hdf file
2026-06-02 18:36:22,046 - Starting adjoint solve for PerfMeas: tailwater (kper, kstp) (5, 1)
2026-06-02 18:36:22,048 - Solving for lambda
2026-06-02 18:36:22,048 - Solving with direct with solver options: {'use_umfpack': True}
2026-06-02 18:36:22,057 - Solving for lambda took: 0.009661 seconds
2026-06-02 18:36:22,094 - Adjoint solve took: 0.048214 seconds to solve adjoint solution for PerfMeas: tailwater (kper, kstp) (5, 1)
2026-06-02 18:36:22,095 - Write group to hdf file
2026-06-02 18:36:22,103 - Starting adjoint solve for PerfMeas: tailwater (kper, kstp) (4, 1)
2026-06-02 18:36:22,105 - Solving for lambda
2026-06-02 18:36:22,106 - Solving with direct with solver options: {'use_umfpack': True}
2026-06-02 18:36:22,115 - Solving for lambda took: 0.009716 seconds
2026-06-02 18:36:22,151 - Adjoint solve took: 0.047837 seconds to solve adjoint solution for PerfMeas: tailwater (kper, kstp) (4, 1)
2026-06-02 18:36:22,152 - Write group to hdf file
2026-06-02 18:36:22,160 - Starting adjoint solve for PerfMeas: tailwater (kper, kstp) (3, 1)
2026-06-02 18:36:22,162 - Solving for lambda
2026-06-02 18:36:22,163 - Solving with direct with solver options: {'use_umfpack': True}
2026-06-02 18:36:22,172 - Solving for lambda took: 0.009653 seconds
2026-06-02 18:36:22,208 - Adjoint solve took: 0.047362 seconds to solve adjoint solution for PerfMeas: tailwater (kper, kstp) (3, 1)
2026-06-02 18:36:22,208 - Write group to hdf file
2026-06-02 18:36:22,217 - Starting adjoint solve for PerfMeas: tailwater (kper, kstp) (2, 1)
2026-06-02 18:36:22,219 - Solving for lambda
2026-06-02 18:36:22,220 - Solving with direct with solver options: {'use_umfpack': True}
2026-06-02 18:36:22,229 - Solving for lambda took: 0.009713 seconds
2026-06-02 18:36:22,265 - Adjoint solve took: 0.047859 seconds to solve adjoint solution for PerfMeas: tailwater (kper, kstp) (2, 1)
2026-06-02 18:36:22,265 - Write group to hdf file
2026-06-02 18:36:22,274 - Starting adjoint solve for PerfMeas: tailwater (kper, kstp) (1, 1)
2026-06-02 18:36:22,276 - Solving for lambda
2026-06-02 18:36:22,276 - Solving with direct with solver options: {'use_umfpack': True}
2026-06-02 18:36:22,285 - Solving for lambda took: 0.009593 seconds
2026-06-02 18:36:22,322 - Adjoint solve took: 0.048074 seconds to solve adjoint solution for PerfMeas: tailwater (kper, kstp) (1, 1)
2026-06-02 18:36:22,323 - Write group to hdf file
2026-06-02 18:36:22,331 - Formulate composite sensitivities
2026-06-02 18:36:22,331 - Writing composite sensitivities
2026-06-02 18:36:22,342 - Adjoint solve took:     1.4729 seconds for pm 'tailwater' at (kper,kstp) (1, 1)
2026-06-02 18:36:22,342 - Starting solve_adjoint at 2026-06-02 18:36:22.342733
2026-06-02 18:36:22,373 - Structured grid found, shape: (3, 40, 20)
2026-06-02 18:36:22,375 - Starting adjoint solve for PerfMeas: pm_combo (kper, kstp) (25, 1)
2026-06-02 18:36:22,377 - Solving for lambda
2026-06-02 18:36:22,377 - Solving with direct with solver options: {'use_umfpack': True}
2026-06-02 18:36:22,386 - Solving for lambda took: 0.009328 seconds
2026-06-02 18:36:22,422 - Adjoint solve took: 0.046825 seconds to solve adjoint solution for PerfMeas: pm_combo (kper, kstp) (25, 1)
2026-06-02 18:36:22,422 - Write group to hdf file
2026-06-02 18:36:22,431 - Starting adjoint solve for PerfMeas: pm_combo (kper, kstp) (24, 1)
2026-06-02 18:36:22,433 - Solving for lambda
2026-06-02 18:36:22,434 - Solving with direct with solver options: {'use_umfpack': True}
2026-06-02 18:36:22,442 - Solving for lambda took: 0.009303 seconds
2026-06-02 18:36:22,478 - Adjoint solve took: 0.046965 seconds to solve adjoint solution for PerfMeas: pm_combo (kper, kstp) (24, 1)
2026-06-02 18:36:22,479 - Write group to hdf file
2026-06-02 18:36:22,488 - Starting adjoint solve for PerfMeas: pm_combo (kper, kstp) (23, 1)
2026-06-02 18:36:22,490 - Solving for lambda
2026-06-02 18:36:22,490 - Solving with direct with solver options: {'use_umfpack': True}
2026-06-02 18:36:22,499 - Solving for lambda took: 0.009347 seconds
2026-06-02 18:36:22,535 - Adjoint solve took: 0.046887 seconds to solve adjoint solution for PerfMeas: pm_combo (kper, kstp) (23, 1)
2026-06-02 18:36:22,535 - Write group to hdf file
2026-06-02 18:36:22,544 - Starting adjoint solve for PerfMeas: pm_combo (kper, kstp) (22, 1)
2026-06-02 18:36:22,546 - Solving for lambda
2026-06-02 18:36:22,546 - Solving with direct with solver options: {'use_umfpack': True}
2026-06-02 18:36:22,555 - Solving for lambda took: 0.0093 seconds
2026-06-02 18:36:22,591 - Adjoint solve took: 0.047529 seconds to solve adjoint solution for PerfMeas: pm_combo (kper, kstp) (22, 1)
2026-06-02 18:36:22,592 - Write group to hdf file
2026-06-02 18:36:22,601 - Starting adjoint solve for PerfMeas: pm_combo (kper, kstp) (21, 1)
2026-06-02 18:36:22,603 - Solving for lambda
2026-06-02 18:36:22,603 - Solving with direct with solver options: {'use_umfpack': True}
2026-06-02 18:36:22,612 - Solving for lambda took: 0.009331 seconds
2026-06-02 18:36:22,648 - Adjoint solve took: 0.047601 seconds to solve adjoint solution for PerfMeas: pm_combo (kper, kstp) (21, 1)
2026-06-02 18:36:22,649 - Write group to hdf file
2026-06-02 18:36:22,657 - Starting adjoint solve for PerfMeas: pm_combo (kper, kstp) (20, 1)
2026-06-02 18:36:22,659 - Solving for lambda
2026-06-02 18:36:22,660 - Solving with direct with solver options: {'use_umfpack': True}
2026-06-02 18:36:22,669 - Solving for lambda took: 0.009397 seconds
2026-06-02 18:36:22,704 - Adjoint solve took: 0.046783 seconds to solve adjoint solution for PerfMeas: pm_combo (kper, kstp) (20, 1)
2026-06-02 18:36:22,704 - Write group to hdf file
2026-06-02 18:36:22,713 - Starting adjoint solve for PerfMeas: pm_combo (kper, kstp) (19, 1)
2026-06-02 18:36:22,715 - Solving for lambda
2026-06-02 18:36:22,715 - Solving with direct with solver options: {'use_umfpack': True}
2026-06-02 18:36:22,724 - Solving for lambda took: 0.009397 seconds
2026-06-02 18:36:22,761 - Adjoint solve took: 0.048201 seconds to solve adjoint solution for PerfMeas: pm_combo (kper, kstp) (19, 1)
2026-06-02 18:36:22,762 - Write group to hdf file
2026-06-02 18:36:22,770 - Starting adjoint solve for PerfMeas: pm_combo (kper, kstp) (18, 1)
2026-06-02 18:36:22,772 - Solving for lambda
2026-06-02 18:36:22,773 - Solving with direct with solver options: {'use_umfpack': True}
2026-06-02 18:36:22,782 - Solving for lambda took: 0.009227 seconds
2026-06-02 18:36:22,818 - Adjoint solve took: 0.047846 seconds to solve adjoint solution for PerfMeas: pm_combo (kper, kstp) (18, 1)
2026-06-02 18:36:22,819 - Write group to hdf file
2026-06-02 18:36:22,828 - Starting adjoint solve for PerfMeas: pm_combo (kper, kstp) (17, 1)
2026-06-02 18:36:22,830 - Solving for lambda
2026-06-02 18:36:22,830 - Solving with direct with solver options: {'use_umfpack': True}
2026-06-02 18:36:22,839 - Solving for lambda took: 0.009339 seconds
2026-06-02 18:36:22,875 - Adjoint solve took: 0.047694 seconds to solve adjoint solution for PerfMeas: pm_combo (kper, kstp) (17, 1)
2026-06-02 18:36:22,876 - Write group to hdf file
2026-06-02 18:36:22,885 - Starting adjoint solve for PerfMeas: pm_combo (kper, kstp) (16, 1)
2026-06-02 18:36:22,886 - Solving for lambda
2026-06-02 18:36:22,887 - Solving with direct with solver options: {'use_umfpack': True}
2026-06-02 18:36:22,896 - Solving for lambda took: 0.0093 seconds
2026-06-02 18:36:22,932 - Adjoint solve took: 0.047401 seconds to solve adjoint solution for PerfMeas: pm_combo (kper, kstp) (16, 1)
2026-06-02 18:36:22,933 - Write group to hdf file
2026-06-02 18:36:22,941 - Starting adjoint solve for PerfMeas: pm_combo (kper, kstp) (15, 1)
2026-06-02 18:36:22,943 - Solving for lambda
2026-06-02 18:36:22,944 - Solving with direct with solver options: {'use_umfpack': True}
2026-06-02 18:36:22,952 - Solving for lambda took: 0.009278 seconds
2026-06-02 18:36:22,989 - Adjoint solve took: 0.047661 seconds to solve adjoint solution for PerfMeas: pm_combo (kper, kstp) (15, 1)
2026-06-02 18:36:22,990 - Write group to hdf file
2026-06-02 18:36:22,998 - Starting adjoint solve for PerfMeas: pm_combo (kper, kstp) (14, 1)
2026-06-02 18:36:23,000 - Solving for lambda
2026-06-02 18:36:23,001 - Solving with direct with solver options: {'use_umfpack': True}
2026-06-02 18:36:23,009 - Solving for lambda took: 0.009356 seconds
2026-06-02 18:36:23,046 - Adjoint solve took: 0.047998 seconds to solve adjoint solution for PerfMeas: pm_combo (kper, kstp) (14, 1)
2026-06-02 18:36:23,047 - Write group to hdf file
2026-06-02 18:36:23,055 - Starting adjoint solve for PerfMeas: pm_combo (kper, kstp) (13, 1)
2026-06-02 18:36:23,057 - Solving for lambda
2026-06-02 18:36:23,058 - Solving with direct with solver options: {'use_umfpack': True}
2026-06-02 18:36:23,067 - Solving for lambda took: 0.009291 seconds
2026-06-02 18:36:23,103 - Adjoint solve took: 0.047669 seconds to solve adjoint solution for PerfMeas: pm_combo (kper, kstp) (13, 1)
2026-06-02 18:36:23,104 - Write group to hdf file
2026-06-02 18:36:23,112 - Starting adjoint solve for PerfMeas: pm_combo (kper, kstp) (12, 1)
2026-06-02 18:36:23,114 - Solving for lambda
2026-06-02 18:36:23,115 - Solving with direct with solver options: {'use_umfpack': True}
2026-06-02 18:36:23,123 - Solving for lambda took: 0.009219 seconds
2026-06-02 18:36:23,160 - Adjoint solve took: 0.04751 seconds to solve adjoint solution for PerfMeas: pm_combo (kper, kstp) (12, 1)
2026-06-02 18:36:23,160 - Write group to hdf file
2026-06-02 18:36:23,169 - Starting adjoint solve for PerfMeas: pm_combo (kper, kstp) (11, 1)
2026-06-02 18:36:23,171 - Solving for lambda
2026-06-02 18:36:23,172 - Solving with direct with solver options: {'use_umfpack': True}
2026-06-02 18:36:23,180 - Solving for lambda took: 0.009258 seconds
2026-06-02 18:36:23,215 - Adjoint solve took: 0.046258 seconds to solve adjoint solution for PerfMeas: pm_combo (kper, kstp) (11, 1)
2026-06-02 18:36:23,216 - Write group to hdf file
2026-06-02 18:36:23,225 - Starting adjoint solve for PerfMeas: pm_combo (kper, kstp) (10, 1)
2026-06-02 18:36:23,226 - Solving for lambda
2026-06-02 18:36:23,227 - Solving with direct with solver options: {'use_umfpack': True}
2026-06-02 18:36:23,236 - Solving for lambda took: 0.009257 seconds
2026-06-02 18:36:23,271 - Adjoint solve took: 0.046628 seconds to solve adjoint solution for PerfMeas: pm_combo (kper, kstp) (10, 1)
2026-06-02 18:36:23,272 - Write group to hdf file
2026-06-02 18:36:23,280 - Starting adjoint solve for PerfMeas: pm_combo (kper, kstp) (9, 1)
2026-06-02 18:36:23,282 - Solving for lambda
2026-06-02 18:36:23,283 - Solving with direct with solver options: {'use_umfpack': True}
2026-06-02 18:36:23,292 - Solving for lambda took: 0.009292 seconds
2026-06-02 18:36:23,327 - Adjoint solve took: 0.046871 seconds to solve adjoint solution for PerfMeas: pm_combo (kper, kstp) (9, 1)
2026-06-02 18:36:23,328 - Write group to hdf file
2026-06-02 18:36:23,336 - Starting adjoint solve for PerfMeas: pm_combo (kper, kstp) (8, 1)
2026-06-02 18:36:23,338 - Solving for lambda
2026-06-02 18:36:23,339 - Solving with direct with solver options: {'use_umfpack': True}
2026-06-02 18:36:23,348 - Solving for lambda took: 0.009397 seconds
2026-06-02 18:36:23,384 - Adjoint solve took: 0.0474 seconds to solve adjoint solution for PerfMeas: pm_combo (kper, kstp) (8, 1)
2026-06-02 18:36:23,384 - Write group to hdf file
2026-06-02 18:36:23,393 - Starting adjoint solve for PerfMeas: pm_combo (kper, kstp) (7, 1)
2026-06-02 18:36:23,395 - Solving for lambda
2026-06-02 18:36:23,396 - Solving with direct with solver options: {'use_umfpack': True}
2026-06-02 18:36:23,404 - Solving for lambda took: 0.009274 seconds
2026-06-02 18:36:23,440 - Adjoint solve took: 0.047283 seconds to solve adjoint solution for PerfMeas: pm_combo (kper, kstp) (7, 1)
2026-06-02 18:36:23,441 - Write group to hdf file
2026-06-02 18:36:23,450 - Starting adjoint solve for PerfMeas: pm_combo (kper, kstp) (6, 1)
2026-06-02 18:36:23,452 - Solving for lambda
2026-06-02 18:36:23,452 - Solving with direct with solver options: {'use_umfpack': True}
2026-06-02 18:36:23,461 - Solving for lambda took: 0.009428 seconds
2026-06-02 18:36:23,497 - Adjoint solve took: 0.047511 seconds to solve adjoint solution for PerfMeas: pm_combo (kper, kstp) (6, 1)
2026-06-02 18:36:23,498 - Write group to hdf file
2026-06-02 18:36:23,506 - Starting adjoint solve for PerfMeas: pm_combo (kper, kstp) (5, 1)
2026-06-02 18:36:23,508 - Solving for lambda
2026-06-02 18:36:23,509 - Solving with direct with solver options: {'use_umfpack': True}
2026-06-02 18:36:23,518 - Solving for lambda took: 0.009372 seconds
2026-06-02 18:36:23,553 - Adjoint solve took: 0.04679 seconds to solve adjoint solution for PerfMeas: pm_combo (kper, kstp) (5, 1)
2026-06-02 18:36:23,554 - Write group to hdf file
2026-06-02 18:36:23,562 - Starting adjoint solve for PerfMeas: pm_combo (kper, kstp) (4, 1)
2026-06-02 18:36:23,564 - Solving for lambda
2026-06-02 18:36:23,565 - Solving with direct with solver options: {'use_umfpack': True}
2026-06-02 18:36:23,574 - Solving for lambda took: 0.009247 seconds
2026-06-02 18:36:23,609 - Adjoint solve took: 0.046798 seconds to solve adjoint solution for PerfMeas: pm_combo (kper, kstp) (4, 1)
2026-06-02 18:36:23,610 - Write group to hdf file
2026-06-02 18:36:23,618 - Starting adjoint solve for PerfMeas: pm_combo (kper, kstp) (3, 1)
2026-06-02 18:36:23,620 - Solving for lambda
2026-06-02 18:36:23,621 - Solving with direct with solver options: {'use_umfpack': True}
2026-06-02 18:36:23,630 - Solving for lambda took: 0.009256 seconds
2026-06-02 18:36:23,665 - Adjoint solve took: 0.04685 seconds to solve adjoint solution for PerfMeas: pm_combo (kper, kstp) (3, 1)
2026-06-02 18:36:23,666 - Write group to hdf file
2026-06-02 18:36:23,674 - Starting adjoint solve for PerfMeas: pm_combo (kper, kstp) (2, 1)
2026-06-02 18:36:23,676 - Solving for lambda
2026-06-02 18:36:23,677 - Solving with direct with solver options: {'use_umfpack': True}
2026-06-02 18:36:23,686 - Solving for lambda took: 0.009284 seconds
2026-06-02 18:36:23,721 - Adjoint solve took: 0.04684 seconds to solve adjoint solution for PerfMeas: pm_combo (kper, kstp) (2, 1)
2026-06-02 18:36:23,722 - Write group to hdf file
2026-06-02 18:36:23,730 - Starting adjoint solve for PerfMeas: pm_combo (kper, kstp) (1, 1)
2026-06-02 18:36:23,732 - Solving for lambda
2026-06-02 18:36:23,732 - Solving with direct with solver options: {'use_umfpack': True}
2026-06-02 18:36:23,741 - Solving for lambda took: 0.009237 seconds
2026-06-02 18:36:23,777 - Adjoint solve took: 0.046777 seconds to solve adjoint solution for PerfMeas: pm_combo (kper, kstp) (1, 1)
2026-06-02 18:36:23,777 - Write group to hdf file
2026-06-02 18:36:23,786 - Formulate composite sensitivities
2026-06-02 18:36:23,786 - Writing composite sensitivities
2026-06-02 18:36:23,796 - Adjoint solve took:     1.4542 seconds for pm 'pm_combo' at (kper,kstp) (1, 1)
2026-06-02 18:36:23,797 - Finalizing Mf6Adj
took: 9.51447

Done. Let’s see what happened.

Plot the Results

[22]:
[f for f in os.listdir(ws) if f.endswith("hdf5")]
[22]:
['adjoint_solution_headwater.hdf5',
 'forward.hdf5',
 'adjoint_solution_pm_single.hdf5',
 'adjoint_solution_pm_single_alltimes.hdf5',
 'adjoint_solution_tailwater.hdf5',
 'adjoint_solution_pm_ssr.hdf5',
 'adjoint_solution_pm_combo.hdf5']

mf6adj uses the widely available HDF5 format to store information. These files hold low-level details about the adjoint solution. However, mf6adj.solve_adjoint() also returns a higher-level summary of the results. Let’s look at that first.

[23]:
type(dfsum)
[23]:
dict
[24]:
list(dfsum.keys())
[24]:
['pm_single',
 'pm_single_alltimes',
 'pm_ssr',
 'headwater',
 'tailwater',
 'pm_combo']
[25]:
dfhw = dfsum["tailwater"]
dfhw
[25]:
k11 k33 wel6_q rch6_recharge ghb-1_bhead ghb-1_cond sfr_1_stage sfr_1_cond ss
node
1 -1.491964e-07 -0.000161 -0.003008 -0.003008 0.0 0.000000 0.0 0.0 0.149167
2 -8.505500e-07 -0.000161 -0.003040 -0.003040 0.0 0.000000 0.0 0.0 0.171382
3 -2.176114e-06 -0.000161 -0.003104 -0.003104 0.0 0.000000 0.0 0.0 0.215097
4 -3.974831e-06 -0.000161 -0.003197 -0.003197 0.0 0.000000 0.0 0.0 0.278914
5 -5.970046e-06 -0.000162 -0.003317 -0.003317 0.0 0.000000 0.0 0.0 0.362320
... ... ... ... ... ... ... ... ... ...
2392 -1.845747e-02 0.000205 -0.189114 -0.189114 0.0 -847.629897 0.0 0.0 356.835428
2393 -2.384884e-02 0.000206 -0.222096 -0.222096 0.0 -845.719024 0.0 0.0 421.364308
2394 -3.141873e-02 0.000199 -0.263049 -0.263049 0.0 -843.484499 0.0 0.0 491.444008
2395 -4.392429e-02 0.000208 -0.314419 -0.314419 0.0 -840.826823 0.0 0.0 566.068014
2396 -2.692002e-02 -0.040386 -0.380211 -0.380211 0.0 0.000000 0.0 0.0 645.496409

2118 rows × 9 columns

Those are the node-scale sensitivities for the SFR flux-based performance measure. Plotting them is easiest using the HDF5 file itself.

[26]:
result_hdf = "adjoint_solution_headwater.hdf5"
hdf = h5py.File(pl.Path(ws) / result_hdf, "r")
keys = list(hdf.keys())
keys.sort()
print(keys)
['composite', 'solution_kper:00000_kstp:00000', 'solution_kper:00001_kstp:00000', 'solution_kper:00002_kstp:00000', 'solution_kper:00003_kstp:00000', 'solution_kper:00004_kstp:00000', 'solution_kper:00005_kstp:00000', 'solution_kper:00006_kstp:00000', 'solution_kper:00007_kstp:00000', 'solution_kper:00008_kstp:00000', 'solution_kper:00009_kstp:00000', 'solution_kper:00010_kstp:00000', 'solution_kper:00011_kstp:00000', 'solution_kper:00012_kstp:00000', 'solution_kper:00013_kstp:00000', 'solution_kper:00014_kstp:00000', 'solution_kper:00015_kstp:00000', 'solution_kper:00016_kstp:00000', 'solution_kper:00017_kstp:00000', 'solution_kper:00018_kstp:00000', 'solution_kper:00019_kstp:00000', 'solution_kper:00020_kstp:00000', 'solution_kper:00021_kstp:00000', 'solution_kper:00022_kstp:00000', 'solution_kper:00023_kstp:00000', 'solution_kper:00024_kstp:00000']

The composite group contains sensitivities of the performance measure to the model inputs, summed across all adjoint solutions.

[27]:
grp = hdf["composite"]
plot_keys = [i for i in grp.keys() if len(grp[i].shape) == 3]
plot_keys
[27]:
['ghb-1_bhead',
 'ghb-1_cond',
 'k11',
 'k33',
 'rch6_recharge',
 'sfr_1_cond',
 'sfr_1_stage',
 'ss',
 'wel6_q']

Here is a simple routine to plot these sensitivities.

[28]:
for pkey in plot_keys:
    arr = grp[pkey][:]
    for k, karr in enumerate(arr):
        karr[karr == 0.0] = np.nan
        fig, ax = plot_model(karr)
        ax.set_title(pkey + f", layer:{k + 1}", loc="left")
../_images/examples_structured_freyberg_demo_52_0.png
../_images/examples_structured_freyberg_demo_52_1.png
../_images/examples_structured_freyberg_demo_52_2.png
../_images/examples_structured_freyberg_demo_52_3.png
../_images/examples_structured_freyberg_demo_52_4.png
../_images/examples_structured_freyberg_demo_52_5.png
../_images/examples_structured_freyberg_demo_52_6.png
../_images/examples_structured_freyberg_demo_52_7.png
../_images/examples_structured_freyberg_demo_52_8.png
../_images/examples_structured_freyberg_demo_52_9.png
../_images/examples_structured_freyberg_demo_52_10.png
../_images/examples_structured_freyberg_demo_52_11.png
../_images/examples_structured_freyberg_demo_52_12.png
../_images/examples_structured_freyberg_demo_52_13.png
../_images/examples_structured_freyberg_demo_52_14.png
../_images/examples_structured_freyberg_demo_52_15.png
../_images/examples_structured_freyberg_demo_52_16.png
../_images/examples_structured_freyberg_demo_52_17.png
../_images/examples_structured_freyberg_demo_52_18.png
../_images/examples_structured_freyberg_demo_52_19.png
../_images/examples_structured_freyberg_demo_52_20.png
../_images/examples_structured_freyberg_demo_52_21.png
../_images/examples_structured_freyberg_demo_52_22.png
../_images/examples_structured_freyberg_demo_52_23.png
../_images/examples_structured_freyberg_demo_52_24.png
../_images/examples_structured_freyberg_demo_52_25.png
../_images/examples_structured_freyberg_demo_52_26.png

At first glance, this looks surprising: how can we have sensitivity to WEL-type boundaries in every model cell when there are only a few WEL boundaries in the model? And why do we also see recharge in layers 2 and 3? The answer is that the adjoint state is the sensitivity of the performance measure to a unit injection of water in every active model cell, which is equivalent to a WEL-type boundary sensitivity. Recharge is the same quantity scaled by cell area. In effect, those wel6_q plots are capture-fraction maps for the headwater SFR reaches, and they only take a few seconds to calculate.

We can make similar plots for the other performance measures. Here are the sensitivities for the single-head performance measure.

[29]:
result_hdf = "adjoint_solution_pm_single.hdf5"
hdf = h5py.File(pl.Path(ws) / result_hdf, "r")
keys = list(hdf.keys())
grp = hdf["composite"]
plot_keys = [i for i in grp.keys() if len(grp[i].shape) == 3]
for pkey in plot_keys:
    arr = grp[pkey][:]
    for k, karr in enumerate(arr):
        karr[karr == 0.0] = np.nan
        fig, ax = plot_model(karr)
        ax.set_title(pkey + f", layer:{k + 1}", loc="left")
../_images/examples_structured_freyberg_demo_55_0.png
../_images/examples_structured_freyberg_demo_55_1.png
../_images/examples_structured_freyberg_demo_55_2.png
../_images/examples_structured_freyberg_demo_55_3.png
../_images/examples_structured_freyberg_demo_55_4.png
../_images/examples_structured_freyberg_demo_55_5.png
../_images/examples_structured_freyberg_demo_55_6.png
../_images/examples_structured_freyberg_demo_55_7.png
../_images/examples_structured_freyberg_demo_55_8.png
../_images/examples_structured_freyberg_demo_55_9.png
../_images/examples_structured_freyberg_demo_55_10.png
../_images/examples_structured_freyberg_demo_55_11.png
../_images/examples_structured_freyberg_demo_55_12.png
../_images/examples_structured_freyberg_demo_55_13.png
../_images/examples_structured_freyberg_demo_55_14.png
../_images/examples_structured_freyberg_demo_55_15.png
../_images/examples_structured_freyberg_demo_55_16.png
../_images/examples_structured_freyberg_demo_55_17.png
../_images/examples_structured_freyberg_demo_55_18.png
../_images/examples_structured_freyberg_demo_55_19.png
../_images/examples_structured_freyberg_demo_55_20.png
../_images/examples_structured_freyberg_demo_55_21.png
../_images/examples_structured_freyberg_demo_55_22.png
../_images/examples_structured_freyberg_demo_55_23.png
../_images/examples_structured_freyberg_demo_55_24.png
../_images/examples_structured_freyberg_demo_55_25.png
../_images/examples_structured_freyberg_demo_55_26.png

And here are the sensitivities for the sum-of-squared-weighted residuals.

[30]:
result_hdf = "adjoint_solution_pm_ssr.hdf5"
hdf = h5py.File(pl.Path(ws) / result_hdf, "r")
keys = list(hdf.keys())
grp = hdf["composite"]
plot_keys = [i for i in grp.keys() if len(grp[i].shape) == 3]
for pkey in plot_keys:
    arr = grp[pkey][:]
    for k, karr in enumerate(arr):
        karr[karr == 0.0] = np.nan
        fig, ax = plot_model(karr)
        ax.set_title(pkey + f", layer:{k + 1}", loc="left")
../_images/examples_structured_freyberg_demo_57_0.png
../_images/examples_structured_freyberg_demo_57_1.png
../_images/examples_structured_freyberg_demo_57_2.png
../_images/examples_structured_freyberg_demo_57_3.png
../_images/examples_structured_freyberg_demo_57_4.png
../_images/examples_structured_freyberg_demo_57_5.png
../_images/examples_structured_freyberg_demo_57_6.png
../_images/examples_structured_freyberg_demo_57_7.png
../_images/examples_structured_freyberg_demo_57_8.png
../_images/examples_structured_freyberg_demo_57_9.png
../_images/examples_structured_freyberg_demo_57_10.png
../_images/examples_structured_freyberg_demo_57_11.png
../_images/examples_structured_freyberg_demo_57_12.png
../_images/examples_structured_freyberg_demo_57_13.png
../_images/examples_structured_freyberg_demo_57_14.png
../_images/examples_structured_freyberg_demo_57_15.png
../_images/examples_structured_freyberg_demo_57_16.png
../_images/examples_structured_freyberg_demo_57_17.png
../_images/examples_structured_freyberg_demo_57_18.png
../_images/examples_structured_freyberg_demo_57_19.png
../_images/examples_structured_freyberg_demo_57_20.png
../_images/examples_structured_freyberg_demo_57_21.png
../_images/examples_structured_freyberg_demo_57_22.png
../_images/examples_structured_freyberg_demo_57_23.png
../_images/examples_structured_freyberg_demo_57_24.png
../_images/examples_structured_freyberg_demo_57_25.png
../_images/examples_structured_freyberg_demo_57_26.png
[31]:
result_hdf = "adjoint_solution_pm_combo.hdf5"
hdf = h5py.File(pl.Path(ws) / result_hdf, "r")
keys = list(hdf.keys())
grp = hdf["composite"]
plot_keys = [i for i in grp.keys() if len(grp[i].shape) == 3]
for pkey in plot_keys:
    arr = grp[pkey][:]
    for k, karr in enumerate(arr):
        karr[karr == 0.0] = np.nan
        fig, ax = plot_model(karr)
        ax.set_title(pkey + f", layer:{k + 1}", loc="left")
../_images/examples_structured_freyberg_demo_58_0.png
../_images/examples_structured_freyberg_demo_58_1.png
../_images/examples_structured_freyberg_demo_58_2.png
../_images/examples_structured_freyberg_demo_58_3.png
../_images/examples_structured_freyberg_demo_58_4.png
../_images/examples_structured_freyberg_demo_58_5.png
../_images/examples_structured_freyberg_demo_58_6.png
../_images/examples_structured_freyberg_demo_58_7.png
../_images/examples_structured_freyberg_demo_58_8.png
../_images/examples_structured_freyberg_demo_58_9.png
../_images/examples_structured_freyberg_demo_58_10.png
../_images/examples_structured_freyberg_demo_58_11.png
../_images/examples_structured_freyberg_demo_58_12.png
../_images/examples_structured_freyberg_demo_58_13.png
../_images/examples_structured_freyberg_demo_58_14.png
../_images/examples_structured_freyberg_demo_58_15.png
../_images/examples_structured_freyberg_demo_58_16.png
../_images/examples_structured_freyberg_demo_58_17.png
../_images/examples_structured_freyberg_demo_58_18.png
../_images/examples_structured_freyberg_demo_58_19.png
../_images/examples_structured_freyberg_demo_58_20.png
../_images/examples_structured_freyberg_demo_58_21.png
../_images/examples_structured_freyberg_demo_58_22.png
../_images/examples_structured_freyberg_demo_58_23.png
../_images/examples_structured_freyberg_demo_58_24.png
../_images/examples_structured_freyberg_demo_58_25.png
../_images/examples_structured_freyberg_demo_58_26.png