Source code for dpest.utils.nphistp
[docs]
def nphistp(pst_path, new_value):
"""
Updates the NPHISTP parameter in a PEST control (.pst) file.
NPHISTP specifies the number of successive iterations over which the PHIREDSTP
criterion must be met for optimization termination. This function allows you
to set NPHISTP to any integer value greater than zero.
**Required Arguments:**
=======
* **pst_path** (*str*):
Path to the .pst file to modify
* **new_value** (*int*):
New value for NPHISTP (must be an integer > 0)
**Returns:**
=======
* ``None``
**Example:**
=======
**Set NPHISTP to 3:**
.. code-block:: python
from dpest.utils import nphistp
nphistp("PEST_CONTROL.pst", 3)
"""
try:
# Validate input
if not isinstance(new_value, int):
raise ValueError("NPHISTP must be an integer")
if new_value <= 0:
raise ValueError("NPHISTP must be greater than zero")
with open(pst_path, 'r') as f:
lines = f.readlines()
# NPHISTP is the 3rd value on line 9 (index 8)
target_line_idx = 8
if target_line_idx >= len(lines):
raise IndexError(f"File has only {len(lines)} lines. Expected control data at line {target_line_idx + 1}.")
current_line = lines[target_line_idx]
values = current_line.split()
if len(values) < 3:
raise ValueError("NPHISTP position not found in control data line")
# Replace third value (NPHISTP)
values[2] = f"{new_value}"
# Rebuild line with original formatting
current_padding = len(current_line) - len(current_line.lstrip())
new_line = " " * current_padding + " ".join(values) + "\n"
lines[target_line_idx] = new_line
with open(pst_path, 'w') as f:
f.writelines(lines)
except FileNotFoundError:
print(f"Error: File '{pst_path}' not found.")
except ValueError as ve:
print(f"ValueError: {str(ve)}")
except IndexError as ie:
print(f"IndexError: {str(ie)}")
except Exception as e:
print(f"Unexpected error: {str(e)}")