Source code for dpest.utils.phiredswh
[docs]
def phiredswh(pst_path, new_value):
"""
Updates the PHIREDSWH parameter in a PEST control (.pst) file.
PHIREDSWH sets the objective function change threshold for switching to central derivatives.
This function allows you to set PHIREDSWH to any float value between 0.0 and 1.0.
**Required Arguments:**
=======
* **pst_path** (*str*):
Path to the .pst file to modify
* **new_value** (*float*):
New value for PHIREDSWH (must be between 0.0 and 1.0)
**Returns:**
=======
* ``None``
**Example:**
=======
**Set PHIREDSWH to 0.1:**
.. code-block:: python
from dpest.utils import phiredswh
phiredswh("PEST_CONTROL.pst", 0.1)
"""
try:
# Validate input
phiredswh = float(new_value)
if not (0.0 <= phiredswh <= 1.0):
raise ValueError("PHIREDSWH must be between 0.0 and 1.0 (inclusive)")
with open(pst_path, 'r') as f:
lines = f.readlines()
# PHIREDSWH is the 1st value on line 8 (index 7)
target_line_idx = 7
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 not values:
raise ValueError("PHIREDSWH line is empty in the control file.")
# Replace first value (PHIREDSWH)
values[0] = f"{phiredswh:.6E}" # Scientific notation
# 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)}")