Source code for util

import os
import re

[docs]def correct_exponent(filename, folder='.', verbose='med'): """Correct triple digit exponents within a file. CrunchFlow has trouble outputting triple-digit exponents and omits the 'E'. For example, '2.5582E-180' prints as '2.5582-180'. Parameters ---------- filename : str name of the file to be processed folder : str folder containing the file, either relative or absolute path verbose : {'med', 'high', 'low'} Print each correction as it's performed ('high'), print total number of corrections ('med'), or print nothing ('low'). The default is 'med' Returns ------- None. Modifies the file in place. """ crunch_file = os.path.join(folder, filename) n_repl = 0 # Count number of replacements # Pre-compile regex to save time neg_search = re.compile('([0-9][0-9])\-([0-9][0-9][0-9])') pos_search = re.compile('([0-9][0-9])\+([0-9][0-9][0-9])') # Read in crunch input file with open(crunch_file, 'r') as fin: cf = fin.readlines() with open(crunch_file, 'w') as fout: for line in cf: # before any changes, store line for printing tmp = line if re.search(neg_search, line): line = re.sub(neg_search, r'\1E-\2', line) n_repl += 1 if re.search(pos_search, line): line = re.sub(pos_search, r'\1E+\2', line) n_repl += 1 if verbose == 'high': print("Original: \n\t " + tmp) print("New: \n\t " + line) fout.write(line) if verbose=='med': print("Made {} replacements in {}".format(n_repl, crunch_file))
[docs]def crunch_input_block(line, block): """While reading a CrunchFlow input file, return the input block to which the current line belongs. Parameters ---------- line : str current line in the input file block : str block to which the previous line belongs. Initialize as empty str Returns ------- block : str one of the default CrunchFlow blocks (e.g., "RUNTIME") or an empty string if between blocks. If within a geochemical condition block, returns the name of the geochemical condition. Examples -------- >>> block = "" >>> with open(input_file, "r") as f: >>> for line in f: >>> block = crunch_input_block(line, block) >>> >>> if block == "BOUNDARY_CONDITIONS": >>> print(line) """ # Strip whitespace line = line.strip() # List of valid CrunchFlow input blocks cr_fields = ['TITLE', 'MINERALS', 'AQUEOUS_KINETICS', 'RUNTIME', 'PEST', 'PRIMARY_SPECIES', 'SECONDARY_SPECIES', 'SURFACE_COMPLEXATION', 'GASES', 'TRANSPORT', 'BOUNDARY_CONDITIONS', 'TEMPERATURE', 'ISOTOPES', 'ION_EXCHANGE', 'POROSITY', 'DISCRETIZATION', 'INITIAL_CONDITIONS', 'FLOW', 'OUTPUT', 'EROSION'] # If it's all uppercase, we are at the beginning or end of a block if line.isupper(): if line in cr_fields: block = line elif line == 'END': block = '' # Geochemical conditions block elif 'Condition' in line: if line.split()[0] == 'Condition': block = line.split()[1] return block