Source code for Poisson.helpers.runner
"""Run Poisson solver via mpiexec subprocess."""
import json
import subprocess
import tempfile
from pathlib import Path
[docs]
def run_solver(N: int, n_ranks: int = 1, output: str = None, **kwargs) -> dict:
"""Run solver with N grid points on n_ranks MPI processes.
Parameters
----------
N : int
Grid size
n_ranks : int
Number of MPI ranks
output : str, optional
Path to save HDF5 results (uses temp file if not provided)
**kwargs
Extra options: strategy, communicator, max_iter, tol, validate
Returns
-------
dict
Results with config and metrics (or 'error' key on failure)
"""
import pandas as pd
# Use temp file if no output path specified
use_temp = output is None
if use_temp:
tmp = tempfile.NamedTemporaryFile(suffix=".h5", delete=False)
output = tmp.name
tmp.close()
config = {"N": N, "output": output, **kwargs}
cmd = [
"mpiexec",
"-n",
str(n_ranks),
"uv",
"run",
"python",
"-m",
"Poisson.helpers.runner_helper",
json.dumps(config),
]
proc = subprocess.run(cmd, capture_output=True, text=True)
if proc.returncode != 0:
return {"error": proc.stderr}
# Load results from HDF5
if not Path(output).exists():
return {"error": "No output file created", "stderr": proc.stderr}
result = pd.read_hdf(output, key="results").iloc[0].to_dict()
# Clean up temp file if we created one
if use_temp:
Path(output).unlink(missing_ok=True)
return result