Skip to content

Commit b7a555e

Browse files
committed
add flux_utils.py, TUNABLE_PARAMS; migrate all imports to new locations
1 parent d77bc84 commit b7a555e

2 files changed

Lines changed: 63 additions & 36 deletions

File tree

examples/2_Fort_Peck/custom_forward_run.py

Lines changed: 31 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,44 @@
1+
"""Placeholder forward run script for PEST++ workers.
2+
3+
PestBuilder auto-generates the actual custom_forward_run.py in the pest/
4+
directory during calibration. This file exists only as a fallback template.
5+
"""
6+
17
import os
28
import warnings
39

410
warnings.filterwarnings("ignore", category=FutureWarning)
511

612

713
def run():
8-
"""Custom forward runner for PEST++ workers."""
9-
from swimrs.calibrate.run_mp import optimize_fields
10-
from swimrs.swim.config import ProjectConfig
14+
"""Forward runner for PEST++ workers using the process package."""
15+
from swimrs.process.input import SwimInput
16+
from swimrs.process.loop_fast import run_daily_loop_fast
17+
from swimrs.process.state import CalibrationParameters, load_pest_mult_properties
1118

12-
here = os.path.dirname(os.path.abspath(__file__))
13-
conf_file = os.path.join(here, "2_Fort_Peck.toml")
14-
if not os.path.exists(conf_file):
15-
raise FileNotFoundError(f"Expected config at {conf_file}")
19+
cwd = os.getcwd()
20+
h5_path = os.path.join(cwd, "swim_input.h5")
21+
mult_dir = os.path.join(cwd, "mult")
22+
pred_dir = os.path.join(cwd, "pred")
23+
os.makedirs(pred_dir, exist_ok=True)
1624

17-
cfg = ProjectConfig()
18-
cfg.read_config(conf_file)
25+
swim_input = SwimInput(h5_path=h5_path)
1926

20-
cwd = os.getcwd()
21-
calibration_dir = os.path.join(cwd, "mult")
22-
optimize_fields(conf_file, cfg.input_data, cwd, calibration_dir)
27+
params = CalibrationParameters.from_pest_mult(
28+
mult_dir=mult_dir, fids=swim_input.fids, base=swim_input.parameters
29+
)
30+
props = load_pest_mult_properties(
31+
mult_dir=mult_dir, fids=swim_input.fids, base_props=swim_input.properties
32+
)
33+
34+
output, _ = run_daily_loop_fast(swim_input=swim_input, parameters=params, properties=props)
35+
36+
# Write prediction files for PEST++
37+
import numpy as np
38+
39+
for i, fid in enumerate(swim_input.fids):
40+
pred_file = os.path.join(pred_dir, f"{fid}.csv")
41+
np.savetxt(pred_file, output.etf[:, i], fmt="%.6f")
2342

2443

2544
if __name__ == "__main__":

examples/3_Crane/custom_forward_run.py

Lines changed: 32 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,36 +1,44 @@
1+
"""Placeholder forward run script for PEST++ workers.
2+
3+
PestBuilder auto-generates the actual custom_forward_run.py in the pest/
4+
directory during calibration. This file exists only as a fallback template.
5+
"""
6+
17
import os
28
import warnings
39

410
warnings.filterwarnings("ignore", category=FutureWarning)
511

612

713
def run():
8-
"""Custom forward runner for PEST++ workers.
9-
10-
This imports the packaged optimize_fields function and executes it with the
11-
configuration from the 3_Crane project. It expects to be run in the worker
12-
directory; PEST++ will create a 'mult' subfolder containing parameter files.
13-
"""
14-
from swimrs.calibrate.run_mp import optimize_fields
15-
from swimrs.swim.config import ProjectConfig
16-
17-
here = os.path.dirname(os.path.abspath(__file__))
18-
conf_file = os.path.join(here, "3_Crane.toml")
19-
if not os.path.exists(conf_file):
20-
conf_file = os.path.join(here, "config.toml")
21-
if not os.path.exists(conf_file):
22-
raise FileNotFoundError(f"Expected config at {conf_file}")
23-
24-
# Resolve input_data path from config
25-
cfg = ProjectConfig()
26-
cfg.read_config(conf_file)
27-
input_data_path = cfg.input_data
28-
29-
# PEST++ worker CWD
14+
"""Forward runner for PEST++ workers using the process package."""
15+
from swimrs.process.input import SwimInput
16+
from swimrs.process.loop_fast import run_daily_loop_fast
17+
from swimrs.process.state import CalibrationParameters, load_pest_mult_properties
18+
3019
cwd = os.getcwd()
31-
calibration_dir = os.path.join(cwd, "mult")
20+
h5_path = os.path.join(cwd, "swim_input.h5")
21+
mult_dir = os.path.join(cwd, "mult")
22+
pred_dir = os.path.join(cwd, "pred")
23+
os.makedirs(pred_dir, exist_ok=True)
24+
25+
swim_input = SwimInput(h5_path=h5_path)
26+
27+
params = CalibrationParameters.from_pest_mult(
28+
mult_dir=mult_dir, fids=swim_input.fids, base=swim_input.parameters
29+
)
30+
props = load_pest_mult_properties(
31+
mult_dir=mult_dir, fids=swim_input.fids, base_props=swim_input.properties
32+
)
33+
34+
output, _ = run_daily_loop_fast(swim_input=swim_input, parameters=params, properties=props)
35+
36+
# Write prediction files for PEST++
37+
import numpy as np
3238

33-
optimize_fields(conf_file, input_data_path, cwd, calibration_dir)
39+
for i, fid in enumerate(swim_input.fids):
40+
pred_file = os.path.join(pred_dir, f"{fid}.csv")
41+
np.savetxt(pred_file, output.etf[:, i], fmt="%.6f")
3442

3543

3644
if __name__ == "__main__":

0 commit comments

Comments
 (0)