Source code for upxo.pxtal.gridops

import numpy as np
import shapely
[docs] def make_grid_pxtal(distribution_type, **kwargs): """Build a grid-based polycrystal seed layout for the given distribution type.""" if distribution_type == 'rectgrid': method_bounds = kwargs['method_bounds'] usefactor = kwargs['usefactor'] xlimits = kwargs['xlimits'] ylimits = kwargs['ylimits'] if method_bounds == 'frombounds': xmin, xmax = xlimits ymin, ymax = ylimits if usefactor == True: grid_mul_factor = kwargs['grid_mul_factor'] x = np.linspace(xmin, xmax, int((xmax - xmin)*grid_mul_factor)) y = np.linspace(ymin, ymax, int((ymax - ymin)*grid_mul_factor)) else: x = np.linspace(xmin, xmax, int(xmax - xmin)) y = np.linspace(ymin, ymax, int(ymax - ymin)) grid_spacing_x = min([x[1] - x[0], y[1] - y[0]]) grid_spacing_y = grid_spacing_x x, y = np.meshgrid(x, y) return x, y, grid_spacing_x elif distribution_type == 'random': # arguments::: method_bounds: 'bounded_by_pxtal', 'user_data' if method_bounds == 'bounded_by_shmulpol': # arguments::: shapely object of type "MultiPolygon", like pxtal # arg method_bounds MUST be followed by keyword args mulpol having the # shapely multi-polygon object import shapely xmin, xmax = min(mulpol.envelope.boundary.xy[0]), max(mulpol.envelope.boundary.xy[0]) ymin, ymax = min(mulpol.envelope.boundary.xy[1]), max(mulpol.envelope.boundary.xy[1]) elif method_bounds == 'user_data': # arguments: xlimits = [xmin, xmax], ylimits = [ymin, ymax] # arg method_bounds MUST be followed by keyword args xlimits and ylimits xmin, xmax = xlimits ylim, ymax = ylimits # - - - - - - - - - - - - - - - if usefactor == True: pass elif usefactor == False: if distribution_subtype == 'uniform': # Access: make_grid_pxtal('random', **kwargs) # RANDOM RANDOM x = np.random.random((domain_size_count, domain_size_count)) y = np.random.random((domain_size_count, domain_size_count)) elif distribution_subtype == 'power': # RANDOM POWER exponent = 3 x = np.reshape(np.random.power(exponent, size = domain_size_count**2), (domain_size_count, domain_size_count)) y = np.reshape(np.random.power(exponent, size = domain_size_count**2), (domain_size_count, domain_size_count)) elif distribution_subtype == 'exponential': # RANDOM EXPONENTIAL exponent = 1 x = np.reshape(np.random.exponential(exponent, size = domain_size_count**2), (domain_size_count, domain_size_count)) y = np.reshape(np.random.exponential(exponent, size = domain_size_count**2), (domain_size_count, domain_size_count)) x = x/x.max() y = y/y.max() x = x*(xmax-xmin) + xmin y = y*(ymax-ymin) + ymin