Source code for grid_translate_model

#!/usr/bin/env python
# *-* coding: utf-8 *-*
"""Transfer complex resistivity models between two FE grids.
"""
import os
# import shapely
from optparse import OptionParser
from shapely.geometry import Polygon
import crtomo.grid as CRGrid
import numpy as np


[docs] def handle_cmd_options(): parser = OptionParser() parser.add_option("--old", dest="old_dir", type="string", help="directory containing the old grid (elem.dat and " + "elec.dat files), (default: old/)", default="old") parser.add_option("--new", dest="new_dir", type="string", help="directory containing the new grid (elem.dat and " + "elec.dat AND rho.dat files), (default: new/)", default="new") parser.add_option("-o", "--output", dest="output", help="Output rho file (default: rho_new.dat)", metavar="FILE", default="rho_new.dat") (options, args) = parser.parse_args() return options
[docs] def _load_grid(directory): if not os.path.isdir(directory): raise IOError('directory not found: {0}'.format(directory)) for filename in (directory + os.sep + 'elem.dat', directory + os.sep + 'elec.dat',): if not os.path.isfile(filename): raise IOError('filename not found: {0}'.format(filename)) cells = [] grid = CRGrid.crt_grid() grid.load_elem_file(directory + os.sep + 'elem.dat') grid.load_elec_file(directory + os.sep + 'elec.dat') gx = grid.grid['x'] gz = grid.grid['z'] for x, z in zip(gx, gz): # find all cell that touch this cell coords = [(xi, zi) for xi, zi in zip(x, z)] p2 = Polygon(coords) cells.append(p2) rhofile = directory + os.sep + 'rho.dat' if os.path.isfile(rhofile): rho = np.loadtxt(rhofile, skiprows=1) else: rho = None return gx, gz, cells, rho
[docs] def _almost_equal(a, b): """Check if the two numbers are almost equal """ # arbitrary small number!!! threshold = 1e-9 diff = np.abs(a - b) return (diff < threshold)
[docs] def main(): options = handle_cmd_options() gx_old, gz_old, cells_old, rho_old = _load_grid(options.old_dir) gx_new, gz_new, cells_new, _ = _load_grid(options.new_dir) print('finished preparing grids') rho_new_raw = [] for new_cell_id, cell_new in enumerate(cells_new): print('working on cell {0} from {1}'.format( new_cell_id, len(cells_new))) # find all cells in the old grid that touch the new one # check using the area area = cell_new.area touching_cells = {} for index, cell_old in enumerate(cells_old): diff = cell_new.intersection(cell_old) if diff.area > 0: # store area fraction touching_cells[index] = diff.area / area area_found = np.sum([x for x in touching_cells.items()]) if _almost_equal(area_found, 1.0): # we found all cells toching the new cell break # set the new rho values for this cell # strategy 1: largest wins if touching_cells: largest_id = max(touching_cells, key=touching_cells.get) rho_new_raw.append(rho_old[largest_id, :]) else: rho_new_raw.append([np.nan, np.nan]) rho_new = np.array(rho_new_raw) with open(options.output, 'wb') as fid: fid.write( bytes( '{0}\n'.format(rho_new.shape[0]), 'utf-8', ) ) np.savetxt(fid, rho_new)
if __name__ == '__main__': main()