Commit 063e33ca authored by Qusai Al Shidi's avatar Qusai Al Shidi 💬
Browse files

Fixed paramin replace and changed name added paramin.read_command()

parent 569080e4
...@@ -5,55 +5,142 @@ PARAM.in Tools ...@@ -5,55 +5,142 @@ PARAM.in Tools
These tools are to help script the editing of PARAM.in files. These tools are to help script the editing of PARAM.in files.
""" """
__all__ = ['read_command', 'replace_command']
__author__ = 'Qusai Al Shidi'
__email__ = 'qusai@umich.edu'
import logging import logging
def replace(input_file, parameters, output_file="PARAM.in"): def replace_command(parameters, input_file, output_file='PARAM.in'):
"""Replace values for the parameters in a PARAM.in file. """Replace values for the parameters in a PARAM.in file.
Note, if you have repeat commands this will replace all the repeats. Note, if you have repeat commands this will replace all the repeats.
Args: Args:
input_file (str): String of PARAM.in file name.
parameters (dict): Dictionary of strs with format parameters (dict): Dictionary of strs with format
replace = {"#COMMAND": ["value", "comments", ...]} replace = {'#COMMAND': ['value', 'comments', ...]}
This is case sensitive. This is case sensitive.
output_file (str): (default "PARAM.in") The output file to write to. input_file (str): String of PARAM.in file name.
output_file (str): (default 'PARAM.in') The output file to write to.
A value of None will not output a file. A value of None will not output a file.
Returns: Returns:
A list of lines of the PARAM.in file that would be outputted. A list of lines of the PARAM.in file that would be outputted.
Examples: Examples:
``` ```
change["#SOLARWINDFILE"] = [["T", "UseSolarWindFile"], change['#SOLARWINDFILE'] = [['T', 'UseSolarWindFile'],
["new_imf.dat", "NameSolarWindFile"]] ['new_imf.dat', 'NameSolarWindFile']]
# This will overwrite PARAM.in # This will overwrite PARAM.in
swmfpy.paramin.replace("PARAM.in.template", change) swmfpy.paramin.replace('PARAM.in.template', change)
``` ```
""" """
# Author: Qusai Al Shidi
# Email: qusai@umich.edu
# TODO This will replace all for repeat commands. # TODO This will replace all for repeat commands.
logger = logging.getLogger() # For debugging logger = logging.getLogger() # For debugging
# Read and replace paramin file by making a temp list # Read and replace paramin file by making a temp list
with open(input_file, 'rt') as paramin: with open(input_file, 'rt') as paramin:
command = None # Top level #COMMAND command = None # Current command
# Compile lines in a list before editing/writing it # Compile lines in a list before editing/writing it
lines = list(paramin) lines = list(paramin)
for line_num, line in enumerate(lines): for line_num, line in enumerate(lines):
words = line.split() words = line.split()
# If the current command is what we want
if words and words[0] in parameters.keys(): if words and words[0] in parameters.keys():
command = words[0] # Current command command = words[0]
# Replace code
for param, value in enumerate(parameters[command]): for param, value in enumerate(parameters[command]):
newline = "" newline = ''
for text in value: # Allow additions of comments if list(str)
newline += text + "\t\t\t" if isinstance(value, list):
logger.info("Replacing:\n" + line for text in value:
+ "with:\n" + newline) newline += text + '\t\t\t'
# Lines will be replaced in order logger.info('Replacing: %s\n with: %s\n',
lines[line_num+param+1] = newline + '\n' line, newline)
# Lines will be replaced in order
lines[line_num+param+1] = newline + '\n'
# Else just make a line
elif isinstance(value, str):
logger.info('Replacing: %s\n with: %s\n', line, value)
# Lines will be replaced in order
lines[line_num+param+1] = value + '\n'
# Write the PARAM.in file # Write the PARAM.in file
if output_file is None: if output_file is None:
return lines # Break if None output_file (not default behaviour) return lines # Break if None output_file (not default behaviour)
with open(output_file, 'w') as outfile: with open(output_file, 'w') as outfile:
for line in lines: for line in lines:
outfile.write(line) outfile.write(line)
return lines return lines
def read_command(command, paramin_file='PARAM.in', **kwargs):
"""Get parameters of a certain command in PARAM.in file.
This will find the #COMMAND and return a list of values for the parameters.
Args:
command (str): This is the #COMMAND you're looking for.
paramin_file (str): (default: 'PARAM.in') The file in which you're
looking for the command values.
**kwargs:
num_of_values (int): (default: None) Number of values to take from
command.
Returns:
list: Values found for the #COMMAND in file. Index 0 is #COMMAND and
the values follow (1 for first argument...)
Raises:
ValueError: When the #COMMAND is not found.
Examples:
start_time = swmfpy.paramin.read_command('#STARTTIME')
end_time = swmfpy.paramin.read_command('#ENDTIME')
print('Starting month is ', start_time[1])
print('Ending month is ', end_time[1])
This will treat all following lines as values for the command. To suppress
this, try using the `num_of_values` keyword. This is helpful if your
PARAM.in is comment heavy.
"""
# Author: Qusai Al Shidi
# Email: qusai@umich.edu
logger = logging.getLogger() # For debugging
with open(paramin_file) as paramin:
return_values = []
found_command = False # to know if worked
at_command = False # when after command needed
for line in paramin:
words = line.split()
if words and words[0] == command:
logger.info('Found command: %s', command)
found_command = True
at_command = True
return_values.append(command)
elif words and words[0][0] == '#':
at_command = False
elif words and at_command:
value = words[0]
logger.info('Value added: %s', value)
return_values.append(value)
# Error handling
# Unable to find #COMMAND
if not found_command:
raise ValueError(command + ' not found.')
# To ignore additional lines
value_limit = kwargs.get('num_of_values', None)
if value_limit:
return_values = return_values[:value_limit+1]
return return_values # empty list might mean command not found
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment